diff --git a/.gitignore b/.gitignore
index aa3f65077..ee2d1e325 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,6 +14,8 @@ tags
# Project-specific ignores
*.z64
+*.n64
+*.v64
*.sra
*.bin
*.elf
diff --git a/Dockerfile b/Dockerfile
index 94b8cdfa2..ac824113f 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -15,8 +15,8 @@ RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone &
unzip \
vbindiff \
vim \
- clang-tidy-11 \
- clang-format-11 \
+ clang-tidy-14 \
+ clang-format-14 \
libpng-dev && \
apt clean && \
rm -rf /var/lib/apt/lists/*
diff --git a/Jenkinsfile b/Jenkinsfile
index a627ead7c..15a40c7eb 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -84,7 +84,7 @@ pipeline {
}
stage('Report Progress') {
when {
- branch 'master'
+ branch 'main'
}
steps {
sh 'mkdir reports'
@@ -96,7 +96,7 @@ pipeline {
}
stage('Update Progress') {
when {
- branch 'master'
+ branch 'main'
}
agent{
label 'zeldaret_website'
diff --git a/Makefile b/Makefile
index 75ad3a54c..e08d983c8 100644
--- a/Makefile
+++ b/Makefile
@@ -23,6 +23,8 @@ FULL_DISASM ?= 0
RUN_CC_CHECK ?= 1
# Dump build object files
OBJDUMP_BUILD ?= 0
+# Force asm processor to run on every file
+ASM_PROC_FORCE ?= 0
# Number of threads to disassmble, extract, and compress with
N_THREADS ?= $(shell nproc)
@@ -90,7 +92,11 @@ 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
+
+ifneq ($(ASM_PROC_FORCE), 0)
+ ASM_PROC_FLAGS += --force
+endif
IINC := -Iinclude -Isrc -Iassets -Ibuild -I.
@@ -102,7 +108,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
@@ -117,13 +123,14 @@ MKLDSCRIPT := tools/buildtools/mkldscript
YAZ0 := tools/buildtools/yaz0
ZAPD := tools/ZAPD/ZAPD.out
FADO := tools/fado/fado.elf
+MAKEYAR := tools/buildtools/makeyar
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
@@ -184,9 +191,11 @@ C_FILES := $(foreach dir,$(SRC_DIRS) $(ASSET_BIN_DIRS_C_FILES),$(wildcard
S_FILES := $(shell grep -F "build/asm" spec | sed 's/.*build\/// ; s/\.o\".*/.s/') \
$(shell grep -F "build/data" spec | sed 's/.*build\/// ; s/\.o\".*/.s/')
BASEROM_FILES := $(shell grep -F "build/baserom" spec | sed 's/.*build\/// ; s/\.o\".*//')
+ARCHIVES_O := $(shell grep -F ".yar.o" spec | sed 's/.*include "// ; s/\.o\".*/.o/')
O_FILES := $(foreach f,$(S_FILES:.s=.o),build/$f) \
$(foreach f,$(C_FILES:.c=.o),build/$f) \
- $(foreach f,$(BASEROM_FILES),build/$f.o)
+ $(foreach f,$(BASEROM_FILES),build/$f.o) \
+ $(ARCHIVES_O)
OVL_RELOC_FILES := $(shell $(CPP) $(CPPFLAGS) $(SPEC) | grep -o '[^"]*_reloc.o' )
@@ -198,8 +207,7 @@ DEP_FILES := $(O_FILES:.o=.asmproc.d) $(OVL_RELOC_FILES:.o=.d)
$(shell mkdir -p build/baserom $(foreach dir,$(SRC_DIRS) $(ASM_DIRS) $(ASSET_BIN_DIRS),build/$(dir)))
# directory flags
-build/src/boot_O2/%.o: OPTFLAGS := -O2
-build/src/boot_O2_g3/%.o: OPTFLAGS := -O2 -g3
+build/src/boot/O2/%.o: OPTFLAGS := -O2
build/src/libultra/os/%.o: OPTFLAGS := -O1
build/src/libultra/voice/%.o: OPTFLAGS := -O2
@@ -210,14 +218,14 @@ build/src/libultra/rmon/%.o: OPTFLAGS := -O2
build/src/libultra/flash/%.o: OPTFLAGS := -g
build/src/libultra/flash/%.o: MIPS_VERSION := -mips1
-build/src/code/audio/%.o: OPTFLAGS := -O2
+build/src/audio/%.o: OPTFLAGS := -O2
build/assets/%.o: OPTFLAGS := -O1
build/assets/%.o: ASM_PROC_FLAGS :=
# file flags
-build/src/boot_O2_g3/fault.o: CFLAGS += -trapuv
-build/src/boot_O2_g3/fault_drawer.o: CFLAGS += -trapuv
+build/src/boot/fault.o: CFLAGS += -trapuv
+build/src/boot/fault_drawer.o: CFLAGS += -trapuv
build/src/code/jpegutils.o: OPTFLAGS := -O2
build/src/code/jpegdecoder.o: OPTFLAGS := -O2
@@ -230,15 +238,15 @@ build/src/libultra/libc/llcvt.o: OPTFLAGS := -O1
build/src/libultra/libc/llcvt.o: MIPS_VERSION := -mips3 -32
# cc & asm-processor
-build/src/boot_O2/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC) -- $(AS) $(ASFLAGS) --
-build/src/boot_O2_g3/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC) -- $(AS) $(ASFLAGS) --
+build/src/boot/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC) -- $(AS) $(ASFLAGS) --
+build/src/boot/O2/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC) -- $(AS) $(ASFLAGS) --
build/src/libultra/%.o: CC := $(CC_OLD)
# Needed at least until voice is decompiled
build/src/libultra/voice/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC_OLD) -- $(AS) $(ASFLAGS) --
build/src/code/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC) -- $(AS) $(ASFLAGS) --
-build/src/code/audio/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC) -- $(AS) $(ASFLAGS) --
+build/src/audio/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC) -- $(AS) $(ASFLAGS) --
build/src/overlays/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC) -- $(AS) $(ASFLAGS) --
@@ -303,9 +311,10 @@ setup:
$(MAKE) -C tools
python3 tools/fixbaserom.py
python3 tools/extract_baserom.py
+ python3 tools/decompress_yars.py
assets:
- python3 extract_assets.py -j $(N_THREADS)
+ python3 extract_assets.py -j $(N_THREADS) -Z Wno-hardcoded-pointer
## Assembly generation
disasm:
@@ -344,6 +353,10 @@ build/assets/%.o: assets/%.c
$(OBJCOPY_BIN)
$(RM_MDEBUG)
+build/assets/archives/%.yar.o: build/assets/archives/%.o
+ $(MAKEYAR) $< $(@:.yar.o=.yar.bin) $(@:.yar.o=.symbols.o)
+ $(OBJCOPY) -I binary -O elf32-big $(@:.yar.o=.yar.bin) $@
+
build/baserom/%.o: baserom/%
$(OBJCOPY) -I binary -O elf32-big $< $@
@@ -392,3 +405,6 @@ build/assets/%.jpg.inc.c: assets/%.jpg
$(ZAPD) bren -eh -i $< -o $@
-include $(DEP_FILES)
+
+# Print target for debugging
+print-% : ; $(info $* is a $(flavor $*) variable set to [$($*)]) @true
diff --git a/README.md b/README.md
index d94b47950..89d651dbd 100644
--- a/README.md
+++ b/README.md
@@ -2,8 +2,8 @@
[![Build Status][jenkins-badge]][jenkins] [![Decompilation Progress][progress-badge]][progress] [![Contributors][contributors-badge]][contributors] [![Discord Channel][discord-badge]][discord]
-[jenkins]: https://jenkins.deco.mp/job/MM/job/master
-[jenkins-badge]: https://img.shields.io/jenkins/build?jobUrl=https%3A%2F%2Fjenkins.deco.mp%2Fjob%2FMM%2Fjob%2Fmaster
+[jenkins]: https://jenkins.deco.mp/job/MM/job/main
+[jenkins-badge]: https://img.shields.io/jenkins/build?jobUrl=https%3A%2F%2Fjenkins.deco.mp%2Fjob%2FMM%2Fjob%2Fmain
[progress]: https://zelda64.dev/games/mm
[progress-badge]: https://img.shields.io/endpoint?url=https://zelda64.dev/assets/csv/progress-mm-shield.json
diff --git a/assets/xml/archives/icon_item_24_static.xml b/assets/xml/archives/icon_item_24_static.xml
new file mode 100644
index 000000000..2997b546b
--- /dev/null
+++ b/assets/xml/archives/icon_item_24_static.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/archives/icon_item_static.xml b/assets/xml/archives/icon_item_static.xml
new file mode 100644
index 000000000..3480d704a
--- /dev/null
+++ b/assets/xml/archives/icon_item_static.xml
@@ -0,0 +1,223 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/archives/item_name_static.xml b/assets/xml/archives/item_name_static.xml
new file mode 100644
index 000000000..da0b903a0
--- /dev/null
+++ b/assets/xml/archives/item_name_static.xml
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/archives/map_grand_static.xml b/assets/xml/archives/map_grand_static.xml
new file mode 100644
index 000000000..d5d80bdd6
--- /dev/null
+++ b/assets/xml/archives/map_grand_static.xml
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/archives/map_i_static.xml b/assets/xml/archives/map_i_static.xml
new file mode 100644
index 000000000..dbb64185d
--- /dev/null
+++ b/assets/xml/archives/map_i_static.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/archives/map_name_static.xml b/assets/xml/archives/map_name_static.xml
new file mode 100644
index 000000000..fe392eb03
--- /dev/null
+++ b/assets/xml/archives/map_name_static.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/archives/schedule_dma_static.xml b/assets/xml/archives/schedule_dma_static.xml
new file mode 100644
index 000000000..c71bdb413
--- /dev/null
+++ b/assets/xml/archives/schedule_dma_static.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/code/debug_display.xml b/assets/xml/code/debug_display.xml
index c8ac659bc..7a25bbd0c 100644
--- a/assets/xml/code/debug_display.xml
+++ b/assets/xml/code/debug_display.xml
@@ -4,7 +4,7 @@
-
+
diff --git a/assets/xml/code/eff_footmark.xml b/assets/xml/code/eff_footmark.xml
new file mode 100644
index 000000000..2fae1fe16
--- /dev/null
+++ b/assets/xml/code/eff_footmark.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
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..cf87038ce
--- /dev/null
+++ b/assets/xml/interface/schedule_static.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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..5dababaab 100644
--- a/assets/xml/objects/gameplay_keep.xml
+++ b/assets/xml/objects/gameplay_keep.xml
@@ -1,77 +1,90 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -787,7 +800,7 @@
-
+
@@ -1145,8 +1158,8 @@
-
-
+
+
@@ -1223,7 +1236,9 @@
+
+
@@ -1286,8 +1301,8 @@
-
-
+
+
@@ -1477,7 +1492,7 @@
-
+
@@ -1487,7 +1502,7 @@
-
+
diff --git a/assets/xml/objects/object_ahg.xml b/assets/xml/objects/object_ahg.xml
index 7eb4c7126..8233a5b27 100644
--- a/assets/xml/objects/object_ahg.xml
+++ b/assets/xml/objects/object_ahg.xml
@@ -1,53 +1,62 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_am.xml b/assets/xml/objects/object_am.xml
index 259700dc8..bec26eb3a 100644
--- a/assets/xml/objects/object_am.xml
+++ b/assets/xml/objects/object_am.xml
@@ -1,6 +1,6 @@
-
+
@@ -36,6 +36,6 @@
-
+
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_ani.xml b/assets/xml/objects/object_ani.xml
index fb17e4e75..8bc8aa5e3 100644
--- a/assets/xml/objects/object_ani.xml
+++ b/assets/xml/objects/object_ani.xml
@@ -8,32 +8,32 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/assets/xml/objects/object_astr_obj.xml b/assets/xml/objects/object_astr_obj.xml
index 75a8e7ca2..233de785b 100644
--- a/assets/xml/objects/object_astr_obj.xml
+++ b/assets/xml/objects/object_astr_obj.xml
@@ -8,6 +8,6 @@
-
+
diff --git a/assets/xml/objects/object_az.xml b/assets/xml/objects/object_az.xml
index ea6fd5e7d..e4e56aa88 100644
--- a/assets/xml/objects/object_az.xml
+++ b/assets/xml/objects/object_az.xml
@@ -65,7 +65,7 @@
-
+
diff --git a/assets/xml/objects/object_bal.xml b/assets/xml/objects/object_bal.xml
index a31c0e29f..c98ffb43d 100644
--- a/assets/xml/objects/object_bal.xml
+++ b/assets/xml/objects/object_bal.xml
@@ -1,81 +1,94 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_bba.xml b/assets/xml/objects/object_bba.xml
index c3a5d0424..54706c2e3 100644
--- a/assets/xml/objects/object_bba.xml
+++ b/assets/xml/objects/object_bba.xml
@@ -52,18 +52,18 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_bigpo.xml b/assets/xml/objects/object_bigpo.xml
index e10052e3c..46c79310e 100644
--- a/assets/xml/objects/object_bigpo.xml
+++ b/assets/xml/objects/object_bigpo.xml
@@ -1,47 +1,63 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_bombf.xml b/assets/xml/objects/object_bombf.xml
index f27d67bc1..ca635875b 100644
--- a/assets/xml/objects/object_bombf.xml
+++ b/assets/xml/objects/object_bombf.xml
@@ -1,11 +1,14 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_boss02.xml b/assets/xml/objects/object_boss02.xml
index 8a80a57f2..0f2fdd052 100644
--- a/assets/xml/objects/object_boss02.xml
+++ b/assets/xml/objects/object_boss02.xml
@@ -36,13 +36,13 @@
-
-
-
+
+
+
-
-
-
+
+
+
diff --git a/assets/xml/objects/object_boss03.xml b/assets/xml/objects/object_boss03.xml
index da17bf406..0b4ab9aa2 100644
--- a/assets/xml/objects/object_boss03.xml
+++ b/assets/xml/objects/object_boss03.xml
@@ -5,7 +5,7 @@
whip assets, along with an unused duplicate of the small fishes.
-->
-
+
@@ -46,7 +46,7 @@
-
+
@@ -69,12 +69,12 @@
-
+
-
-
+
+
diff --git a/assets/xml/objects/object_boss07.xml b/assets/xml/objects/object_boss07.xml
index b1f6cb417..f1be3cf31 100644
--- a/assets/xml/objects/object_boss07.xml
+++ b/assets/xml/objects/object_boss07.xml
@@ -10,7 +10,7 @@
-
+
@@ -68,7 +68,7 @@
-
+
@@ -150,13 +150,13 @@
-
-
-
-
+
+
+
+
-
+
@@ -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_botihasira.xml b/assets/xml/objects/object_botihasira.xml
index f949abcc7..0a2212760 100644
--- a/assets/xml/objects/object_botihasira.xml
+++ b/assets/xml/objects/object_botihasira.xml
@@ -6,6 +6,6 @@
-
+
diff --git a/assets/xml/objects/object_box.xml b/assets/xml/objects/object_box.xml
index be4f34b87..c0603a6cf 100644
--- a/assets/xml/objects/object_box.xml
+++ b/assets/xml/objects/object_box.xml
@@ -48,6 +48,6 @@
-
+
diff --git a/assets/xml/objects/object_crace_object.xml b/assets/xml/objects/object_crace_object.xml
index af0cb89e0..63dd9913d 100644
--- a/assets/xml/objects/object_crace_object.xml
+++ b/assets/xml/objects/object_crace_object.xml
@@ -4,6 +4,6 @@
-
+
diff --git a/assets/xml/objects/object_ctower_rot.xml b/assets/xml/objects/object_ctower_rot.xml
index ad2336257..044443c98 100644
--- a/assets/xml/objects/object_ctower_rot.xml
+++ b/assets/xml/objects/object_ctower_rot.xml
@@ -73,12 +73,12 @@
-
+
-
+
@@ -86,15 +86,15 @@
-
+
-
+
-
+
diff --git a/assets/xml/objects/object_d_hsblock.xml b/assets/xml/objects/object_d_hsblock.xml
index b43647dc3..ee61d0a54 100644
--- a/assets/xml/objects/object_d_hsblock.xml
+++ b/assets/xml/objects/object_d_hsblock.xml
@@ -1,10 +1,10 @@
-
-
-
-
+
+
+
+
diff --git a/assets/xml/objects/object_d_lift.xml b/assets/xml/objects/object_d_lift.xml
index 475f7fd3e..868eccd85 100644
--- a/assets/xml/objects/object_d_lift.xml
+++ b/assets/xml/objects/object_d_lift.xml
@@ -3,8 +3,8 @@
-
-
+
+
diff --git a/assets/xml/objects/object_dai.xml b/assets/xml/objects/object_dai.xml
index b547897f8..927e3f1e1 100644
--- a/assets/xml/objects/object_dai.xml
+++ b/assets/xml/objects/object_dai.xml
@@ -2,21 +2,21 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_daiku.xml b/assets/xml/objects/object_daiku.xml
index 17d8ddbf0..0152a6e7d 100644
--- a/assets/xml/objects/object_daiku.xml
+++ b/assets/xml/objects/object_daiku.xml
@@ -1,11 +1,11 @@
-
-
-
-
-
-
+
+
+
+
+
+
@@ -39,10 +39,10 @@
-
+
-
+
@@ -66,11 +66,11 @@
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_danpei_object.xml b/assets/xml/objects/object_danpei_object.xml
index 3f373a8ce..8e86f2f79 100644
--- a/assets/xml/objects/object_danpei_object.xml
+++ b/assets/xml/objects/object_danpei_object.xml
@@ -3,9 +3,9 @@
-
-
-
+
+
+
diff --git a/assets/xml/objects/object_dblue_object.xml b/assets/xml/objects/object_dblue_object.xml
index 8611c539b..63d28bd33 100644
--- a/assets/xml/objects/object_dblue_object.xml
+++ b/assets/xml/objects/object_dblue_object.xml
@@ -4,17 +4,17 @@
-
+
-
+
-
+
@@ -25,22 +25,22 @@
-
+
-
-
+
+
-
+
@@ -50,17 +50,17 @@
-
+
-
+
-
+
diff --git a/assets/xml/objects/object_death.xml b/assets/xml/objects/object_death.xml
index 77d4ccd4a..7588c484a 100644
--- a/assets/xml/objects/object_death.xml
+++ b/assets/xml/objects/object_death.xml
@@ -1,17 +1,17 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
+
+
@@ -41,7 +41,7 @@
-
+
@@ -76,9 +76,9 @@
-
-
-
+
+
+
diff --git a/assets/xml/objects/object_dekubaba.xml b/assets/xml/objects/object_dekubaba.xml
index eb80e770b..053b82f61 100644
--- a/assets/xml/objects/object_dekubaba.xml
+++ b/assets/xml/objects/object_dekubaba.xml
@@ -1,27 +1,40 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_dekucity_obj.xml b/assets/xml/objects/object_dekucity_obj.xml
index 1d680965e..2d1da14a0 100644
--- a/assets/xml/objects/object_dekucity_obj.xml
+++ b/assets/xml/objects/object_dekucity_obj.xml
@@ -1,22 +1,22 @@
-
-
+
+
-
+
-
+
-
+
diff --git a/assets/xml/objects/object_delf.xml b/assets/xml/objects/object_delf.xml
index 39996c0f0..85f3138e1 100644
--- a/assets/xml/objects/object_delf.xml
+++ b/assets/xml/objects/object_delf.xml
@@ -1,82 +1,82 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_dhouse.xml b/assets/xml/objects/object_dhouse.xml
index dd95b8b98..a5894a4df 100644
--- a/assets/xml/objects/object_dhouse.xml
+++ b/assets/xml/objects/object_dhouse.xml
@@ -9,25 +9,25 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
diff --git a/assets/xml/objects/object_dinofos.xml b/assets/xml/objects/object_dinofos.xml
index 8db9c7c4a..7ed5f81f5 100644
--- a/assets/xml/objects/object_dinofos.xml
+++ b/assets/xml/objects/object_dinofos.xml
@@ -1,71 +1,76 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_dkjail_obj.xml b/assets/xml/objects/object_dkjail_obj.xml
index ada181475..0827c3814 100644
--- a/assets/xml/objects/object_dkjail_obj.xml
+++ b/assets/xml/objects/object_dkjail_obj.xml
@@ -1,9 +1,10 @@
+
-
-
-
-
-
+
+
+
+
+
diff --git a/assets/xml/objects/object_dmask.xml b/assets/xml/objects/object_dmask.xml
index a7b3874ec..29f245b1b 100644
--- a/assets/xml/objects/object_dmask.xml
+++ b/assets/xml/objects/object_dmask.xml
@@ -1,17 +1,17 @@
-
-
+
+
-
+
-
-
+
+
@@ -21,7 +21,7 @@
-
+
diff --git a/assets/xml/objects/object_dnk.xml b/assets/xml/objects/object_dnk.xml
index bec6ce45d..b085eed28 100644
--- a/assets/xml/objects/object_dnk.xml
+++ b/assets/xml/objects/object_dnk.xml
@@ -1,11 +1,11 @@
-
-
-
-
-
+
+
+
+
+
@@ -45,7 +45,7 @@
-
-
+
+
diff --git a/assets/xml/objects/object_dnt.xml b/assets/xml/objects/object_dnt.xml
index 96b793849..658720258 100644
--- a/assets/xml/objects/object_dnt.xml
+++ b/assets/xml/objects/object_dnt.xml
@@ -1,91 +1,106 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_dodongo.xml b/assets/xml/objects/object_dodongo.xml
index 8de3f4653..cc9b41e25 100644
--- a/assets/xml/objects/object_dodongo.xml
+++ b/assets/xml/objects/object_dodongo.xml
@@ -1,15 +1,15 @@
-
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
@@ -59,9 +59,9 @@
-
-
-
+
+
+
diff --git a/assets/xml/objects/object_dog.xml b/assets/xml/objects/object_dog.xml
index 0e3d318b4..d0f306b24 100644
--- a/assets/xml/objects/object_dog.xml
+++ b/assets/xml/objects/object_dog.xml
@@ -3,13 +3,13 @@
-
+
-
+
diff --git a/assets/xml/objects/object_dor01.xml b/assets/xml/objects/object_dor01.xml
index 39c950680..727949d60 100644
--- a/assets/xml/objects/object_dor01.xml
+++ b/assets/xml/objects/object_dor01.xml
@@ -1,7 +1,8 @@
+
-
-
-
+
+
+
diff --git a/assets/xml/objects/object_dor02.xml b/assets/xml/objects/object_dor02.xml
index c60fa9ba9..402fdd499 100644
--- a/assets/xml/objects/object_dor02.xml
+++ b/assets/xml/objects/object_dor02.xml
@@ -1,7 +1,8 @@
+
-
-
+
+
diff --git a/assets/xml/objects/object_dor03.xml b/assets/xml/objects/object_dor03.xml
index 941fa6fcc..c7971db0c 100644
--- a/assets/xml/objects/object_dor03.xml
+++ b/assets/xml/objects/object_dor03.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/assets/xml/objects/object_dor04.xml b/assets/xml/objects/object_dor04.xml
index 394f5a6fe..afb348c7d 100644
--- a/assets/xml/objects/object_dor04.xml
+++ b/assets/xml/objects/object_dor04.xml
@@ -1,7 +1,8 @@
+
-
-
+
+
diff --git a/assets/xml/objects/object_dora.xml b/assets/xml/objects/object_dora.xml
index ab4b09cf7..09732ba0a 100644
--- a/assets/xml/objects/object_dora.xml
+++ b/assets/xml/objects/object_dora.xml
@@ -1,17 +1,17 @@
-
+
-
-
-
-
+
+
+
+
-
-
+
+
diff --git a/assets/xml/objects/object_driftice.xml b/assets/xml/objects/object_driftice.xml
index 0ddb6e204..c380c09c1 100644
--- a/assets/xml/objects/object_driftice.xml
+++ b/assets/xml/objects/object_driftice.xml
@@ -5,7 +5,7 @@
-
-
+
+
diff --git a/assets/xml/objects/object_drs.xml b/assets/xml/objects/object_drs.xml
index 1b6c29597..ef9788fd5 100644
--- a/assets/xml/objects/object_drs.xml
+++ b/assets/xml/objects/object_drs.xml
@@ -1,7 +1,7 @@
-
+
diff --git a/assets/xml/objects/object_ds2.xml b/assets/xml/objects/object_ds2.xml
index 1794c4bf8..0eb35db79 100644
--- a/assets/xml/objects/object_ds2.xml
+++ b/assets/xml/objects/object_ds2.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/assets/xml/objects/object_ds2n.xml b/assets/xml/objects/object_ds2n.xml
index 7e7d45f0c..7c04da8bf 100644
--- a/assets/xml/objects/object_ds2n.xml
+++ b/assets/xml/objects/object_ds2n.xml
@@ -7,17 +7,17 @@
-
+
-
+
-
+
-
+
@@ -65,28 +65,28 @@
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/assets/xml/objects/object_dt.xml b/assets/xml/objects/object_dt.xml
index 8b2a90217..3acf0c442 100644
--- a/assets/xml/objects/object_dt.xml
+++ b/assets/xml/objects/object_dt.xml
@@ -1,10 +1,10 @@
-
-
-
-
-
+
+
+
+
+
@@ -28,8 +28,8 @@
-
-
+
+
@@ -37,15 +37,15 @@
-
+
-
-
-
+
+
+
-
-
+
+
@@ -62,6 +62,6 @@
-
+
diff --git a/assets/xml/objects/object_dy_obj.xml b/assets/xml/objects/object_dy_obj.xml
index a64bc975b..37fef4ab1 100644
--- a/assets/xml/objects/object_dy_obj.xml
+++ b/assets/xml/objects/object_dy_obj.xml
@@ -1,51 +1,62 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -55,42 +66,46 @@
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_efc_star_field.xml b/assets/xml/objects/object_efc_star_field.xml
index 72b7ef636..90ea17929 100644
--- a/assets/xml/objects/object_efc_star_field.xml
+++ b/assets/xml/objects/object_efc_star_field.xml
@@ -1,8 +1,8 @@
-
+
-
+
diff --git a/assets/xml/objects/object_efc_tw.xml b/assets/xml/objects/object_efc_tw.xml
index 709224f9d..c28ae3c81 100644
--- a/assets/xml/objects/object_efc_tw.xml
+++ b/assets/xml/objects/object_efc_tw.xml
@@ -1,13 +1,16 @@
-
-
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_eg.xml b/assets/xml/objects/object_eg.xml
index 6aba85e62..28686f3ae 100644
--- a/assets/xml/objects/object_eg.xml
+++ b/assets/xml/objects/object_eg.xml
@@ -2,20 +2,20 @@
-
+
-
+
-
+
-
+
-
+
@@ -24,7 +24,7 @@
-
+
@@ -32,22 +32,22 @@
-
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
+
+
@@ -105,32 +105,32 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
+
+
+
+
+
-
+
diff --git a/assets/xml/objects/object_ending_obj.xml b/assets/xml/objects/object_ending_obj.xml
index ad13ce7b8..f8902e353 100644
--- a/assets/xml/objects/object_ending_obj.xml
+++ b/assets/xml/objects/object_ending_obj.xml
@@ -1,13 +1,13 @@
-
+
-
-
+
+
diff --git a/assets/xml/objects/object_f40_obj.xml b/assets/xml/objects/object_f40_obj.xml
index 59bff9d05..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_f40_switch.xml b/assets/xml/objects/object_f40_switch.xml
index a5c823baa..7e7fb5b1c 100644
--- a/assets/xml/objects/object_f40_switch.xml
+++ b/assets/xml/objects/object_f40_switch.xml
@@ -1,8 +1,8 @@
-
-
-
+
+
+
diff --git a/assets/xml/objects/object_f52_obj.xml b/assets/xml/objects/object_f52_obj.xml
index f80b67696..0da643be0 100644
--- a/assets/xml/objects/object_f52_obj.xml
+++ b/assets/xml/objects/object_f52_obj.xml
@@ -1,16 +1,16 @@
-
-
+
+
-
-
+
+
-
+
diff --git a/assets/xml/objects/object_f53_obj.xml b/assets/xml/objects/object_f53_obj.xml
index 424d7c003..d93048a9d 100644
--- a/assets/xml/objects/object_f53_obj.xml
+++ b/assets/xml/objects/object_f53_obj.xml
@@ -1,13 +1,13 @@
-
+
-
+
diff --git a/assets/xml/objects/object_fall.xml b/assets/xml/objects/object_fall.xml
index 47fa1da70..04c1ff058 100644
--- a/assets/xml/objects/object_fall.xml
+++ b/assets/xml/objects/object_fall.xml
@@ -7,14 +7,14 @@
-->
-
+
-
+
-
-
-
- \
+
+
+
+
@@ -22,7 +22,7 @@
-
+
@@ -30,7 +30,7 @@
-
+
@@ -43,7 +43,7 @@
-
+
diff --git a/assets/xml/objects/object_fall2.xml b/assets/xml/objects/object_fall2.xml
index 25439a50a..12299ab74 100644
--- a/assets/xml/objects/object_fall2.xml
+++ b/assets/xml/objects/object_fall2.xml
@@ -4,7 +4,7 @@
moon's mouth, both used in the cutscene before warping to the moon.
-->
-
+
@@ -12,7 +12,7 @@
-
+
@@ -29,6 +29,6 @@
-
+
diff --git a/assets/xml/objects/object_famos.xml b/assets/xml/objects/object_famos.xml
index d12a94d66..f62604424 100644
--- a/assets/xml/objects/object_famos.xml
+++ b/assets/xml/objects/object_famos.xml
@@ -1,7 +1,7 @@
-
+
@@ -22,9 +22,9 @@
-
+
-
+
diff --git a/assets/xml/objects/object_fb.xml b/assets/xml/objects/object_fb.xml
index bb630781c..59ecaf9e5 100644
--- a/assets/xml/objects/object_fb.xml
+++ b/assets/xml/objects/object_fb.xml
@@ -1,10 +1,10 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/assets/xml/objects/object_firefly.xml b/assets/xml/objects/object_firefly.xml
index 4c6aacd16..93e5640b6 100644
--- a/assets/xml/objects/object_firefly.xml
+++ b/assets/xml/objects/object_firefly.xml
@@ -1,54 +1,83 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_fish.xml b/assets/xml/objects/object_fish.xml
index 4d9a86e51..b4de27c4e 100644
--- a/assets/xml/objects/object_fish.xml
+++ b/assets/xml/objects/object_fish.xml
@@ -1,162 +1,315 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
+
+
diff --git a/assets/xml/objects/object_flowerpot.xml b/assets/xml/objects/object_flowerpot.xml
index b6adc70d4..01d16b663 100644
--- a/assets/xml/objects/object_flowerpot.xml
+++ b/assets/xml/objects/object_flowerpot.xml
@@ -3,9 +3,9 @@
-
-
-
-
+
+
+
+
diff --git a/assets/xml/objects/object_fr.xml b/assets/xml/objects/object_fr.xml
index 0cd28760e..3262c6782 100644
--- a/assets/xml/objects/object_fr.xml
+++ b/assets/xml/objects/object_fr.xml
@@ -1,67 +1,68 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_fsn.xml b/assets/xml/objects/object_fsn.xml
index dd67874f0..5ca67c207 100644
--- a/assets/xml/objects/object_fsn.xml
+++ b/assets/xml/objects/object_fsn.xml
@@ -6,10 +6,10 @@
-
+
-
+
@@ -57,15 +57,14 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -78,8 +77,8 @@
-
-
+
+
@@ -106,7 +105,7 @@
-
-
+
+
diff --git a/assets/xml/objects/object_fu.xml b/assets/xml/objects/object_fu.xml
index 19404f90e..c70db90e8 100644
--- a/assets/xml/objects/object_fu.xml
+++ b/assets/xml/objects/object_fu.xml
@@ -1,52 +1,61 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_fu_kaiten.xml b/assets/xml/objects/object_fu_kaiten.xml
index 37a7ec4bc..ad277bb26 100644
--- a/assets/xml/objects/object_fu_kaiten.xml
+++ b/assets/xml/objects/object_fu_kaiten.xml
@@ -1,18 +1,18 @@
-
+
-
-
+
+
-
+
diff --git a/assets/xml/objects/object_fu_mato.xml b/assets/xml/objects/object_fu_mato.xml
index b28899f3c..bedf6906f 100644
--- a/assets/xml/objects/object_fu_mato.xml
+++ b/assets/xml/objects/object_fu_mato.xml
@@ -1,21 +1,21 @@
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_funen.xml b/assets/xml/objects/object_funen.xml
index 5f8c18c3d..0f9d0a484 100644
--- a/assets/xml/objects/object_funen.xml
+++ b/assets/xml/objects/object_funen.xml
@@ -1,6 +1,7 @@
+
-
-
+
+
diff --git a/assets/xml/objects/object_fusen.xml b/assets/xml/objects/object_fusen.xml
index 2e115b2b7..2ee47097a 100644
--- a/assets/xml/objects/object_fusen.xml
+++ b/assets/xml/objects/object_fusen.xml
@@ -1,8 +1,8 @@
-
-
+
+
-
+
diff --git a/assets/xml/objects/object_fwall.xml b/assets/xml/objects/object_fwall.xml
index 1bbb5d572..a4311c173 100644
--- a/assets/xml/objects/object_fwall.xml
+++ b/assets/xml/objects/object_fwall.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/assets/xml/objects/object_ge1.xml b/assets/xml/objects/object_ge1.xml
index a9c930215..db123e78c 100644
--- a/assets/xml/objects/object_ge1.xml
+++ b/assets/xml/objects/object_ge1.xml
@@ -3,16 +3,16 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
diff --git a/assets/xml/objects/object_geldb.xml b/assets/xml/objects/object_geldb.xml
index 5590677ea..3b5dfa4ea 100644
--- a/assets/xml/objects/object_geldb.xml
+++ b/assets/xml/objects/object_geldb.xml
@@ -1,78 +1,84 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gg.xml b/assets/xml/objects/object_gg.xml
index f7483e338..45fe1b172 100644
--- a/assets/xml/objects/object_gg.xml
+++ b/assets/xml/objects/object_gg.xml
@@ -39,19 +39,19 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -72,6 +72,6 @@
-
+
diff --git a/assets/xml/objects/object_ghaka.xml b/assets/xml/objects/object_ghaka.xml
index 6ca9a32b0..91ae8fa4f 100644
--- a/assets/xml/objects/object_ghaka.xml
+++ b/assets/xml/objects/object_ghaka.xml
@@ -1,12 +1,12 @@
-
+
-
+
-
+
diff --git a/assets/xml/objects/object_gi_sword_4.xml b/assets/xml/objects/object_gi_sword_4.xml
index 7732259c6..082c27e2a 100644
--- a/assets/xml/objects/object_gi_sword_4.xml
+++ b/assets/xml/objects/object_gi_sword_4.xml
@@ -1,14 +1,14 @@
-
+
-
-
-
+
+
+
-
-
-
-
+
+
+
+
diff --git a/assets/xml/objects/object_gk.xml b/assets/xml/objects/object_gk.xml
index b36aef153..40abd45a2 100644
--- a/assets/xml/objects/object_gk.xml
+++ b/assets/xml/objects/object_gk.xml
@@ -19,10 +19,10 @@
-
+
-
-
+
+
@@ -43,17 +43,17 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gla.xml b/assets/xml/objects/object_gla.xml
index 7463cd2e0..60880a7a7 100644
--- a/assets/xml/objects/object_gla.xml
+++ b/assets/xml/objects/object_gla.xml
@@ -1,73 +1,78 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gm.xml b/assets/xml/objects/object_gm.xml
index 50c852ade..80edb8aeb 100644
--- a/assets/xml/objects/object_gm.xml
+++ b/assets/xml/objects/object_gm.xml
@@ -1,6 +1,6 @@
+
-
-
+
diff --git a/assets/xml/objects/object_goroiwa.xml b/assets/xml/objects/object_goroiwa.xml
index e6ddfe7c1..df6aa04bb 100644
--- a/assets/xml/objects/object_goroiwa.xml
+++ b/assets/xml/objects/object_goroiwa.xml
@@ -1,26 +1,26 @@
-
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
diff --git a/assets/xml/objects/object_goronswitch.xml b/assets/xml/objects/object_goronswitch.xml
index a6a0f996f..2f7592664 100644
--- a/assets/xml/objects/object_goronswitch.xml
+++ b/assets/xml/objects/object_goronswitch.xml
@@ -1,10 +1,10 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/assets/xml/objects/object_ha.xml b/assets/xml/objects/object_ha.xml
index 94973c809..860b592df 100644
--- a/assets/xml/objects/object_ha.xml
+++ b/assets/xml/objects/object_ha.xml
@@ -1,135 +1,162 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_haka_obj.xml b/assets/xml/objects/object_haka_obj.xml
index 57f34f0d1..2746eb690 100644
--- a/assets/xml/objects/object_haka_obj.xml
+++ b/assets/xml/objects/object_haka_obj.xml
@@ -1,14 +1,14 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_hakaisi.xml b/assets/xml/objects/object_hakaisi.xml
index 227fc4cf8..c0e200ea7 100644
--- a/assets/xml/objects/object_hakaisi.xml
+++ b/assets/xml/objects/object_hakaisi.xml
@@ -5,11 +5,11 @@
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_hakugin_demo.xml b/assets/xml/objects/object_hakugin_demo.xml
index 24c7a2ba2..1de3cd695 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_hakugin_obj.xml b/assets/xml/objects/object_hakugin_obj.xml
index b4badbd1d..883a954a6 100644
--- a/assets/xml/objects/object_hakugin_obj.xml
+++ b/assets/xml/objects/object_hakugin_obj.xml
@@ -1,7 +1,7 @@
-
+
@@ -10,27 +10,27 @@
-
+
-
+
-
+
-
+
-
+
@@ -40,7 +40,7 @@
-
+
@@ -50,11 +50,11 @@
-
+
-
-
-
+
+
+
@@ -63,22 +63,22 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/assets/xml/objects/object_hana.xml b/assets/xml/objects/object_hana.xml
index 3812a4ff5..872bdc806 100644
--- a/assets/xml/objects/object_hana.xml
+++ b/assets/xml/objects/object_hana.xml
@@ -1,13 +1,19 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_harfgibud.xml b/assets/xml/objects/object_harfgibud.xml
index 99578e996..437e3b70d 100644
--- a/assets/xml/objects/object_harfgibud.xml
+++ b/assets/xml/objects/object_harfgibud.xml
@@ -3,11 +3,11 @@
-
-
-
-
-
+
+
+
+
+
@@ -61,11 +61,11 @@
-
-
-
+
+
+
-
+
@@ -121,11 +121,11 @@
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_hariko.xml b/assets/xml/objects/object_hariko.xml
index 5cb2d8328..9af628304 100644
--- a/assets/xml/objects/object_hariko.xml
+++ b/assets/xml/objects/object_hariko.xml
@@ -1,8 +1,8 @@
-
-
+
+
diff --git a/assets/xml/objects/object_hata.xml b/assets/xml/objects/object_hata.xml
index 9271520b7..cbee285e3 100644
--- a/assets/xml/objects/object_hata.xml
+++ b/assets/xml/objects/object_hata.xml
@@ -1,39 +1,50 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_hgdoor.xml b/assets/xml/objects/object_hgdoor.xml
index e897103bf..8a0bb4c70 100644
--- a/assets/xml/objects/object_hgdoor.xml
+++ b/assets/xml/objects/object_hgdoor.xml
@@ -3,11 +3,11 @@
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_hintnuts.xml b/assets/xml/objects/object_hintnuts.xml
index 483623988..99ea55d87 100644
--- a/assets/xml/objects/object_hintnuts.xml
+++ b/assets/xml/objects/object_hintnuts.xml
@@ -1,6 +1,6 @@
-
+
@@ -10,7 +10,7 @@
-
+
@@ -28,13 +28,13 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_horse_game_check.xml b/assets/xml/objects/object_horse_game_check.xml
index 1ea72ac57..fd5e2f398 100644
--- a/assets/xml/objects/object_horse_game_check.xml
+++ b/assets/xml/objects/object_horse_game_check.xml
@@ -8,9 +8,9 @@
-
+
-
+
diff --git a/assets/xml/objects/object_horse_link_child.xml b/assets/xml/objects/object_horse_link_child.xml
index 60178badb..535ea1d86 100644
--- a/assets/xml/objects/object_horse_link_child.xml
+++ b/assets/xml/objects/object_horse_link_child.xml
@@ -1,4 +1,5 @@
+
@@ -9,10 +10,13 @@
-
-
-
-
+
+
+
+
+
+
+
@@ -20,16 +24,20 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -76,14 +84,17 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_hs.xml b/assets/xml/objects/object_hs.xml
index 19ea49b6b..c5ac723f8 100644
--- a/assets/xml/objects/object_hs.xml
+++ b/assets/xml/objects/object_hs.xml
@@ -1,9 +1,9 @@
-
-
-
+
+
+
@@ -30,12 +30,12 @@
-
+
-
+
-
+
@@ -46,6 +46,6 @@
-
+
diff --git a/assets/xml/objects/object_hsstump.xml b/assets/xml/objects/object_hsstump.xml
index f94f0ed4e..f8e466603 100644
--- a/assets/xml/objects/object_hsstump.xml
+++ b/assets/xml/objects/object_hsstump.xml
@@ -1,10 +1,10 @@
-
+
-
+
diff --git a/assets/xml/objects/object_hunsui.xml b/assets/xml/objects/object_hunsui.xml
index 878bf704d..a97f8f094 100644
--- a/assets/xml/objects/object_hunsui.xml
+++ b/assets/xml/objects/object_hunsui.xml
@@ -1,12 +1,12 @@
-
+
-
-
+
+
-
+
diff --git a/assets/xml/objects/object_ice_block.xml b/assets/xml/objects/object_ice_block.xml
index dd25c06d5..4b5cd47d4 100644
--- a/assets/xml/objects/object_ice_block.xml
+++ b/assets/xml/objects/object_ice_block.xml
@@ -1,23 +1,23 @@
-
-
+
+
-
+
-
-
+
+
-
-
+
+
diff --git a/assets/xml/objects/object_icefloe.xml b/assets/xml/objects/object_icefloe.xml
index 2427052af..0440fa4bb 100644
--- a/assets/xml/objects/object_icefloe.xml
+++ b/assets/xml/objects/object_icefloe.xml
@@ -1,7 +1,7 @@
-
+
-
+
diff --git a/assets/xml/objects/object_icicle.xml b/assets/xml/objects/object_icicle.xml
index 4f7bab8a2..ac0000471 100644
--- a/assets/xml/objects/object_icicle.xml
+++ b/assets/xml/objects/object_icicle.xml
@@ -1,7 +1,7 @@
-
-
+
+
diff --git a/assets/xml/objects/object_ik.xml b/assets/xml/objects/object_ik.xml
index 352b82487..fcbb90620 100644
--- a/assets/xml/objects/object_ik.xml
+++ b/assets/xml/objects/object_ik.xml
@@ -1,34 +1,34 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
+
-
-
-
+
+
+
-
+
diff --git a/assets/xml/objects/object_ikana_obj.xml b/assets/xml/objects/object_ikana_obj.xml
index e0490a349..0b67e7757 100644
--- a/assets/xml/objects/object_ikana_obj.xml
+++ b/assets/xml/objects/object_ikana_obj.xml
@@ -1,38 +1,38 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
@@ -58,10 +58,10 @@
-
-
-
-
+
+
+
+
diff --git a/assets/xml/objects/object_ikn_demo.xml b/assets/xml/objects/object_ikn_demo.xml
index 53d5c65a1..bbb803499 100644
--- a/assets/xml/objects/object_ikn_demo.xml
+++ b/assets/xml/objects/object_ikn_demo.xml
@@ -1,7 +1,7 @@
-
+
@@ -44,13 +44,13 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -64,19 +64,19 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -90,18 +90,18 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_ikninside_obj.xml b/assets/xml/objects/object_ikninside_obj.xml
index 98ae6d34f..26d1e1206 100644
--- a/assets/xml/objects/object_ikninside_obj.xml
+++ b/assets/xml/objects/object_ikninside_obj.xml
@@ -1,15 +1,15 @@
-
-
+
+
-
+
-
+
@@ -22,27 +22,27 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
+
diff --git a/assets/xml/objects/object_iknv_obj.xml b/assets/xml/objects/object_iknv_obj.xml
index 58926c0e3..5c54c71da 100644
--- a/assets/xml/objects/object_iknv_obj.xml
+++ b/assets/xml/objects/object_iknv_obj.xml
@@ -24,19 +24,19 @@
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
+
+
+
+
@@ -57,14 +57,14 @@
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_in.xml b/assets/xml/objects/object_in.xml
index 15b2382aa..ee7ceb3a0 100644
--- a/assets/xml/objects/object_in.xml
+++ b/assets/xml/objects/object_in.xml
@@ -1,10 +1,10 @@
-
-
-
+
+
+
-
+
@@ -113,21 +113,21 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_in2.xml b/assets/xml/objects/object_in2.xml
index bcd04091b..e903185b4 100644
--- a/assets/xml/objects/object_in2.xml
+++ b/assets/xml/objects/object_in2.xml
@@ -1,6 +1,6 @@
-
+
@@ -67,16 +67,16 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_ishi.xml b/assets/xml/objects/object_ishi.xml
index 6e48cf5f4..5f53b90ac 100644
--- a/assets/xml/objects/object_ishi.xml
+++ b/assets/xml/objects/object_ishi.xml
@@ -1,6 +1,7 @@
+
-
-
+
+
diff --git a/assets/xml/objects/object_js.xml b/assets/xml/objects/object_js.xml
index 1335b8287..6d93f7ac2 100644
--- a/assets/xml/objects/object_js.xml
+++ b/assets/xml/objects/object_js.xml
@@ -1,10 +1,10 @@
-
-
-
-
-
+
+
+
+
+
@@ -40,6 +40,6 @@
-
+
diff --git a/assets/xml/objects/object_jso.xml b/assets/xml/objects/object_jso.xml
index a397311c4..bfe271d69 100644
--- a/assets/xml/objects/object_jso.xml
+++ b/assets/xml/objects/object_jso.xml
@@ -50,26 +50,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -115,8 +115,8 @@
-
-
-
+
+
+
diff --git a/assets/xml/objects/object_ka.xml b/assets/xml/objects/object_ka.xml
index 69ea2d929..914617b41 100644
--- a/assets/xml/objects/object_ka.xml
+++ b/assets/xml/objects/object_ka.xml
@@ -1,6 +1,7 @@
+
-
+
@@ -59,11 +60,11 @@
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_kaizoku_obj.xml b/assets/xml/objects/object_kaizoku_obj.xml
index 9ae61accf..a8e773034 100644
--- a/assets/xml/objects/object_kaizoku_obj.xml
+++ b/assets/xml/objects/object_kaizoku_obj.xml
@@ -1,22 +1,22 @@
-
+
-
-
+
+
-
-
+
+
-
+
@@ -27,15 +27,15 @@
-
-
+
+
-
+
-
+
diff --git a/assets/xml/objects/object_kamejima.xml b/assets/xml/objects/object_kamejima.xml
index cce285475..272a541be 100644
--- a/assets/xml/objects/object_kamejima.xml
+++ b/assets/xml/objects/object_kamejima.xml
@@ -5,29 +5,29 @@
-
+
-
+
-
-
+
+
-
-
-
+
+
+
-
+
-
+
@@ -88,12 +88,12 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_kanban.xml b/assets/xml/objects/object_kanban.xml
index b821aa288..e5baa90ee 100644
--- a/assets/xml/objects/object_kanban.xml
+++ b/assets/xml/objects/object_kanban.xml
@@ -1,18 +1,19 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_kbt.xml b/assets/xml/objects/object_kbt.xml
index 102aed91d..bf6078da8 100644
--- a/assets/xml/objects/object_kbt.xml
+++ b/assets/xml/objects/object_kbt.xml
@@ -1,16 +1,16 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -69,7 +69,7 @@
-
-
+
+
diff --git a/assets/xml/objects/object_keikoku_demo.xml b/assets/xml/objects/object_keikoku_demo.xml
index 3a0a20b65..b9433a48f 100644
--- a/assets/xml/objects/object_keikoku_demo.xml
+++ b/assets/xml/objects/object_keikoku_demo.xml
@@ -7,21 +7,21 @@
-
+
-
+
-
+
-
+
-
+
diff --git a/assets/xml/objects/object_keikoku_obj.xml b/assets/xml/objects/object_keikoku_obj.xml
index ff5a6899c..b6d61e91f 100644
--- a/assets/xml/objects/object_keikoku_obj.xml
+++ b/assets/xml/objects/object_keikoku_obj.xml
@@ -8,19 +8,19 @@
-
+
-
+
-
+
-
+
diff --git a/assets/xml/objects/object_kepn_koya.xml b/assets/xml/objects/object_kepn_koya.xml
index 893892d25..cc14f0556 100644
--- a/assets/xml/objects/object_kepn_koya.xml
+++ b/assets/xml/objects/object_kepn_koya.xml
@@ -1,7 +1,7 @@
-
-
+
+
@@ -13,6 +13,6 @@
-
+
diff --git a/assets/xml/objects/object_kgy.xml b/assets/xml/objects/object_kgy.xml
index 5bbf17793..b83234b8c 100644
--- a/assets/xml/objects/object_kgy.xml
+++ b/assets/xml/objects/object_kgy.xml
@@ -1,13 +1,13 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -39,10 +39,10 @@
-
+
-
+
@@ -68,7 +68,7 @@
-
-
+
+
diff --git a/assets/xml/objects/object_kibako.xml b/assets/xml/objects/object_kibako.xml
index 43276080a..2cdd6ce36 100644
--- a/assets/xml/objects/object_kibako.xml
+++ b/assets/xml/objects/object_kibako.xml
@@ -2,8 +2,8 @@
-
+
-
+
diff --git a/assets/xml/objects/object_kibako2.xml b/assets/xml/objects/object_kibako2.xml
index 4b6ce5ac7..180038e82 100644
--- a/assets/xml/objects/object_kibako2.xml
+++ b/assets/xml/objects/object_kibako2.xml
@@ -4,11 +4,11 @@
-
-
+
+
-
-
+
+
diff --git a/assets/xml/objects/object_kin2_obj.xml b/assets/xml/objects/object_kin2_obj.xml
index d36766ee4..6e63f19cd 100644
--- a/assets/xml/objects/object_kin2_obj.xml
+++ b/assets/xml/objects/object_kin2_obj.xml
@@ -4,32 +4,28 @@
Piece, bookshelves and chests of drawers.
-->
-
+
+
-
-
-
-
+
+
+
-
+
+
+
-
-
-
-
+
+
+
-
-
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
diff --git a/assets/xml/objects/object_kinsta1_obj.xml b/assets/xml/objects/object_kinsta1_obj.xml
index 48d40c527..be178d1e8 100644
--- a/assets/xml/objects/object_kinsta1_obj.xml
+++ b/assets/xml/objects/object_kinsta1_obj.xml
@@ -1,7 +1,7 @@
-
-
+
+
diff --git a/assets/xml/objects/object_kinsta2_obj.xml b/assets/xml/objects/object_kinsta2_obj.xml
index f27778b1a..66bec962d 100644
--- a/assets/xml/objects/object_kinsta2_obj.xml
+++ b/assets/xml/objects/object_kinsta2_obj.xml
@@ -1,6 +1,7 @@
+
-
-
+
+
diff --git a/assets/xml/objects/object_kitan.xml b/assets/xml/objects/object_kitan.xml
index edc2e5cc6..cd7db0005 100644
--- a/assets/xml/objects/object_kitan.xml
+++ b/assets/xml/objects/object_kitan.xml
@@ -1,8 +1,8 @@
-
-
-
+
+
+
diff --git a/assets/xml/objects/object_knight.xml b/assets/xml/objects/object_knight.xml
index fa0e900e4..2a8595627 100644
--- a/assets/xml/objects/object_knight.xml
+++ b/assets/xml/objects/object_knight.xml
@@ -1,49 +1,57 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -101,14 +109,14 @@
-
-
+
+
-
+
@@ -201,11 +209,11 @@
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_kumo30.xml b/assets/xml/objects/object_kumo30.xml
index 24e8d3974..3a74c0988 100644
--- a/assets/xml/objects/object_kumo30.xml
+++ b/assets/xml/objects/object_kumo30.xml
@@ -1,12 +1,12 @@
-
-
+
+
-
+
diff --git a/assets/xml/objects/object_kusa.xml b/assets/xml/objects/object_kusa.xml
index 36c61f364..9ed22b39f 100644
--- a/assets/xml/objects/object_kusa.xml
+++ b/assets/xml/objects/object_kusa.xml
@@ -1,6 +1,6 @@
-
-
+
+
diff --git a/assets/xml/objects/object_kz.xml b/assets/xml/objects/object_kz.xml
index f500ba141..6295d7b1d 100644
--- a/assets/xml/objects/object_kz.xml
+++ b/assets/xml/objects/object_kz.xml
@@ -1,17 +1,17 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
@@ -82,12 +82,12 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_kzsaku.xml b/assets/xml/objects/object_kzsaku.xml
index 4cfce2de2..af957d700 100644
--- a/assets/xml/objects/object_kzsaku.xml
+++ b/assets/xml/objects/object_kzsaku.xml
@@ -1,7 +1,7 @@
-
+
-
+
diff --git a/assets/xml/objects/object_ladder.xml b/assets/xml/objects/object_ladder.xml
index 6e42412ec..29ee69b9b 100644
--- a/assets/xml/objects/object_ladder.xml
+++ b/assets/xml/objects/object_ladder.xml
@@ -1,13 +1,13 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_last_obj.xml b/assets/xml/objects/object_last_obj.xml
index 03dbddcf2..bd452a408 100644
--- a/assets/xml/objects/object_last_obj.xml
+++ b/assets/xml/objects/object_last_obj.xml
@@ -1,21 +1,21 @@
-
+
-
-
+
+
-
-
+
+
-
+
diff --git a/assets/xml/objects/object_lastday.xml b/assets/xml/objects/object_lastday.xml
index e447edfbf..4c6b5fdb4 100644
--- a/assets/xml/objects/object_lastday.xml
+++ b/assets/xml/objects/object_lastday.xml
@@ -3,13 +3,13 @@
-
+
-
+
-
+
-
+
diff --git a/assets/xml/objects/object_lbfshot.xml b/assets/xml/objects/object_lbfshot.xml
index 325ddf49e..881f877b6 100644
--- a/assets/xml/objects/object_lbfshot.xml
+++ b/assets/xml/objects/object_lbfshot.xml
@@ -1,9 +1,9 @@
-
-
+
+
-
+
diff --git a/assets/xml/objects/object_lightblock.xml b/assets/xml/objects/object_lightblock.xml
index 207b03020..d58ec0004 100644
--- a/assets/xml/objects/object_lightblock.xml
+++ b/assets/xml/objects/object_lightblock.xml
@@ -1,9 +1,9 @@
-
-
+
+
-
+
diff --git a/assets/xml/objects/object_lightswitch.xml b/assets/xml/objects/object_lightswitch.xml
index 0a374033b..a8b26bc51 100644
--- a/assets/xml/objects/object_lightswitch.xml
+++ b/assets/xml/objects/object_lightswitch.xml
@@ -1,11 +1,12 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
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..b6dd7fe6f 100644
--- a/assets/xml/objects/object_link_goron.xml
+++ b/assets/xml/objects/object_link_goron.xml
@@ -42,7 +42,7 @@
-
+
@@ -72,10 +72,10 @@
-
+
-
+
@@ -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_link_zora.xml b/assets/xml/objects/object_link_zora.xml
index 5833293b8..be4c54274 100644
--- a/assets/xml/objects/object_link_zora.xml
+++ b/assets/xml/objects/object_link_zora.xml
@@ -80,7 +80,7 @@
-
+
diff --git a/assets/xml/objects/object_lotus.xml b/assets/xml/objects/object_lotus.xml
index b9f40033c..923218811 100644
--- a/assets/xml/objects/object_lotus.xml
+++ b/assets/xml/objects/object_lotus.xml
@@ -4,6 +4,6 @@
-
+
diff --git a/assets/xml/objects/object_mamenoki.xml b/assets/xml/objects/object_mamenoki.xml
index 9ce4644c3..9fa5b6832 100644
--- a/assets/xml/objects/object_mamenoki.xml
+++ b/assets/xml/objects/object_mamenoki.xml
@@ -1,9 +1,9 @@
-
-
-
-
+
+
+
+
diff --git a/assets/xml/objects/object_maruta.xml b/assets/xml/objects/object_maruta.xml
index e61e1162b..c44907b1d 100644
--- a/assets/xml/objects/object_maruta.xml
+++ b/assets/xml/objects/object_maruta.xml
@@ -3,14 +3,14 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_mastergolon.xml b/assets/xml/objects/object_mastergolon.xml
index 35eb9d285..481fb7cde 100644
--- a/assets/xml/objects/object_mastergolon.xml
+++ b/assets/xml/objects/object_mastergolon.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/assets/xml/objects/object_masterzoora.xml b/assets/xml/objects/object_masterzoora.xml
index f21b99b50..5a72744da 100644
--- a/assets/xml/objects/object_masterzoora.xml
+++ b/assets/xml/objects/object_masterzoora.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/assets/xml/objects/object_milkbar.xml b/assets/xml/objects/object_milkbar.xml
index 38bec140b..f3e732514 100644
--- a/assets/xml/objects/object_milkbar.xml
+++ b/assets/xml/objects/object_milkbar.xml
@@ -1,27 +1,27 @@
-
+
-
+
-
+
-
+
-
+
-
-
+
+
@@ -33,12 +33,12 @@
-
+
-
-
+
+
diff --git a/assets/xml/objects/object_mir_ray.xml b/assets/xml/objects/object_mir_ray.xml
index 962982322..c0b1cf6f2 100644
--- a/assets/xml/objects/object_mir_ray.xml
+++ b/assets/xml/objects/object_mir_ray.xml
@@ -1,7 +1,7 @@
-
+
diff --git a/assets/xml/objects/object_mk.xml b/assets/xml/objects/object_mk.xml
index 087fcc9e0..0db6c703d 100644
--- a/assets/xml/objects/object_mk.xml
+++ b/assets/xml/objects/object_mk.xml
@@ -1,45 +1,46 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_mkk.xml b/assets/xml/objects/object_mkk.xml
index 17f36f323..445d26f0d 100644
--- a/assets/xml/objects/object_mkk.xml
+++ b/assets/xml/objects/object_mkk.xml
@@ -1,15 +1,16 @@
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_mm.xml b/assets/xml/objects/object_mm.xml
index 43e8e930b..b7b727d4e 100644
--- a/assets/xml/objects/object_mm.xml
+++ b/assets/xml/objects/object_mm.xml
@@ -1,10 +1,10 @@
-
-
-
-
-
+
+
+
+
+
@@ -32,9 +32,9 @@
-
-
-
+
+
+
@@ -55,14 +55,14 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_mnk.xml b/assets/xml/objects/object_mnk.xml
index d585972c0..794069ee7 100644
--- a/assets/xml/objects/object_mnk.xml
+++ b/assets/xml/objects/object_mnk.xml
@@ -1,7 +1,7 @@
-
+
@@ -9,11 +9,11 @@
-
-
-
-
-
+
+
+
+
+
@@ -23,32 +23,32 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -73,7 +73,12 @@
-
+
+
+
+
+
+
@@ -104,14 +109,14 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -121,6 +126,6 @@
-
+
diff --git a/assets/xml/objects/object_moonend.xml b/assets/xml/objects/object_moonend.xml
index e677f9c3f..4e4b5a6f2 100644
--- a/assets/xml/objects/object_moonend.xml
+++ b/assets/xml/objects/object_moonend.xml
@@ -1,6 +1,7 @@
-
+
+
@@ -19,7 +20,8 @@
-
+
+
@@ -32,7 +34,7 @@
-
+
diff --git a/assets/xml/objects/object_moonston.xml b/assets/xml/objects/object_moonston.xml
index 58a920522..2945469f2 100644
--- a/assets/xml/objects/object_moonston.xml
+++ b/assets/xml/objects/object_moonston.xml
@@ -4,8 +4,8 @@
along with its associated fire trail.
-->
-
-
+
+
diff --git a/assets/xml/objects/object_ms.xml b/assets/xml/objects/object_ms.xml
index 93828c76f..1b3f86145 100644
--- a/assets/xml/objects/object_ms.xml
+++ b/assets/xml/objects/object_ms.xml
@@ -1,32 +1,43 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_mu.xml b/assets/xml/objects/object_mu.xml
index 37886e8f5..a72b184c1 100644
--- a/assets/xml/objects/object_mu.xml
+++ b/assets/xml/objects/object_mu.xml
@@ -1,11 +1,11 @@
-
-
-
-
-
+
+
+
+
+
@@ -58,6 +58,6 @@
-
+
diff --git a/assets/xml/objects/object_niw.xml b/assets/xml/objects/object_niw.xml
index 157d2b302..db47a439f 100644
--- a/assets/xml/objects/object_niw.xml
+++ b/assets/xml/objects/object_niw.xml
@@ -35,6 +35,6 @@
-
+
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_ob.xml b/assets/xml/objects/object_ob.xml
index aa95db9bc..d23ab6790 100644
--- a/assets/xml/objects/object_ob.xml
+++ b/assets/xml/objects/object_ob.xml
@@ -55,10 +55,10 @@
-
+
-
+
diff --git a/assets/xml/objects/object_obj_chan.xml b/assets/xml/objects/object_obj_chan.xml
index 8469110e4..0b378e8c1 100644
--- a/assets/xml/objects/object_obj_chan.xml
+++ b/assets/xml/objects/object_obj_chan.xml
@@ -1,13 +1,14 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_po_fusen.xml b/assets/xml/objects/object_po_fusen.xml
index a25c9d960..23bfbe075 100644
--- a/assets/xml/objects/object_po_fusen.xml
+++ b/assets/xml/objects/object_po_fusen.xml
@@ -1,32 +1,39 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_po_sisters.xml b/assets/xml/objects/object_po_sisters.xml
index e2e57a31a..6b0755905 100644
--- a/assets/xml/objects/object_po_sisters.xml
+++ b/assets/xml/objects/object_po_sisters.xml
@@ -3,68 +3,63 @@
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
+
diff --git a/assets/xml/objects/object_racetsubo.xml b/assets/xml/objects/object_racetsubo.xml
index 6558fcbe5..08a17d00a 100644
--- a/assets/xml/objects/object_racetsubo.xml
+++ b/assets/xml/objects/object_racetsubo.xml
@@ -1,11 +1,12 @@
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_rr.xml b/assets/xml/objects/object_rr.xml
index dbdba55c5..df974bb35 100644
--- a/assets/xml/objects/object_rr.xml
+++ b/assets/xml/objects/object_rr.xml
@@ -1,8 +1,8 @@
-
-
-
-
+
+
+
+
diff --git a/assets/xml/objects/object_ru2.xml b/assets/xml/objects/object_ru2.xml
index 72510149c..89d00e9d7 100644
--- a/assets/xml/objects/object_ru2.xml
+++ b/assets/xml/objects/object_ru2.xml
@@ -74,12 +74,12 @@
-
+
-
+
diff --git a/assets/xml/objects/object_sekihig.xml b/assets/xml/objects/object_sekihig.xml
index bb995bed4..de104df55 100644
--- a/assets/xml/objects/object_sekihig.xml
+++ b/assets/xml/objects/object_sekihig.xml
@@ -1,16 +1,19 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_sekihil.xml b/assets/xml/objects/object_sekihil.xml
index fb9903875..3dbb57774 100644
--- a/assets/xml/objects/object_sekihil.xml
+++ b/assets/xml/objects/object_sekihil.xml
@@ -1,16 +1,19 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_sekihin.xml b/assets/xml/objects/object_sekihin.xml
index 104f5f133..300a9ad58 100644
--- a/assets/xml/objects/object_sekihin.xml
+++ b/assets/xml/objects/object_sekihin.xml
@@ -1,17 +1,19 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_sekihiz.xml b/assets/xml/objects/object_sekihiz.xml
index 9563d8b42..806279c98 100644
--- a/assets/xml/objects/object_sekihiz.xml
+++ b/assets/xml/objects/object_sekihiz.xml
@@ -1,9 +1,10 @@
+
-
-
-
-
-
+
+
+
+
+
diff --git a/assets/xml/objects/object_shn.xml b/assets/xml/objects/object_shn.xml
index c4b256f68..3e39b2eff 100644
--- a/assets/xml/objects/object_shn.xml
+++ b/assets/xml/objects/object_shn.xml
@@ -79,11 +79,11 @@
-
-
+
+
-
-
+
+
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_snowwd.xml b/assets/xml/objects/object_snowwd.xml
index c61d07beb..9bb2209d9 100644
--- a/assets/xml/objects/object_snowwd.xml
+++ b/assets/xml/objects/object_snowwd.xml
@@ -1,9 +1,9 @@
-
-
-
-
-
+
+
+
+
+
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_sth.xml b/assets/xml/objects/object_sth.xml
index b176cd8cc..53040ae05 100644
--- a/assets/xml/objects/object_sth.xml
+++ b/assets/xml/objects/object_sth.xml
@@ -1,42 +1,53 @@
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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/objects/object_tanron1.xml b/assets/xml/objects/object_tanron1.xml
index 99a39e534..d5ec3be03 100644
--- a/assets/xml/objects/object_tanron1.xml
+++ b/assets/xml/objects/object_tanron1.xml
@@ -1,6 +1,6 @@
+
-
-
+
diff --git a/assets/xml/objects/object_tanron4.xml b/assets/xml/objects/object_tanron4.xml
index 491e9a587..ea342d448 100644
--- a/assets/xml/objects/object_tanron4.xml
+++ b/assets/xml/objects/object_tanron4.xml
@@ -1,30 +1,30 @@
-
+
-
-
-
-
-
+
+
+
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
+
diff --git a/assets/xml/objects/object_thiefbird.xml b/assets/xml/objects/object_thiefbird.xml
index 5a4cec335..52165cb89 100644
--- a/assets/xml/objects/object_thiefbird.xml
+++ b/assets/xml/objects/object_thiefbird.xml
@@ -40,13 +40,13 @@
-
+
-
+
@@ -55,7 +55,7 @@
-
+
diff --git a/assets/xml/objects/object_tl.xml b/assets/xml/objects/object_tl.xml
index 7f0cfd756..3230f87f2 100644
--- a/assets/xml/objects/object_tl.xml
+++ b/assets/xml/objects/object_tl.xml
@@ -1,61 +1,87 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_tree.xml b/assets/xml/objects/object_tree.xml
index 9d5fb66dd..89e3984c5 100644
--- a/assets/xml/objects/object_tree.xml
+++ b/assets/xml/objects/object_tree.xml
@@ -1,9 +1,9 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/assets/xml/objects/object_tro.xml b/assets/xml/objects/object_tro.xml
index 773182c58..eb1ba9984 100644
--- a/assets/xml/objects/object_tro.xml
+++ b/assets/xml/objects/object_tro.xml
@@ -1,14 +1,18 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_tsubo.xml b/assets/xml/objects/object_tsubo.xml
index 46aacd873..8bbebfc85 100644
--- a/assets/xml/objects/object_tsubo.xml
+++ b/assets/xml/objects/object_tsubo.xml
@@ -1,9 +1,10 @@
+
-
-
-
-
-
+
+
+
+
+
diff --git a/assets/xml/objects/object_vm.xml b/assets/xml/objects/object_vm.xml
index bf13f3b40..8fb9fde20 100644
--- a/assets/xml/objects/object_vm.xml
+++ b/assets/xml/objects/object_vm.xml
@@ -1,30 +1,41 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_wdor01.xml b/assets/xml/objects/object_wdor01.xml
index ffc3327bb..b18158a14 100644
--- a/assets/xml/objects/object_wdor01.xml
+++ b/assets/xml/objects/object_wdor01.xml
@@ -1,7 +1,8 @@
+
-
-
-
+
+
+
diff --git a/assets/xml/objects/object_wdor02.xml b/assets/xml/objects/object_wdor02.xml
index 9cb35ddb8..f192bf8f5 100644
--- a/assets/xml/objects/object_wdor02.xml
+++ b/assets/xml/objects/object_wdor02.xml
@@ -1,7 +1,8 @@
+
-
-
-
+
+
+
diff --git a/assets/xml/objects/object_wdor03.xml b/assets/xml/objects/object_wdor03.xml
index c23f87037..545a68242 100644
--- a/assets/xml/objects/object_wdor03.xml
+++ b/assets/xml/objects/object_wdor03.xml
@@ -1,7 +1,8 @@
+
-
-
-
+
+
+
diff --git a/assets/xml/objects/object_wf.xml b/assets/xml/objects/object_wf.xml
index b6c5b640d..0d8fdb68c 100644
--- a/assets/xml/objects/object_wf.xml
+++ b/assets/xml/objects/object_wf.xml
@@ -65,11 +65,11 @@
-
-
-
-
-
+
+
+
+
+
@@ -135,8 +135,8 @@
-
+
-
+
diff --git a/assets/xml/objects/object_yb.xml b/assets/xml/objects/object_yb.xml
index 3bbfc7cce..6c0ae86df 100644
--- a/assets/xml/objects/object_yb.xml
+++ b/assets/xml/objects/object_yb.xml
@@ -8,10 +8,10 @@
-
+
-
+
@@ -19,10 +19,10 @@
-
+
-
+
@@ -39,23 +39,24 @@
-
+
-
+
+
-
+
-
+
-
+
diff --git a/assets/xml/objects/object_zg.xml b/assets/xml/objects/object_zg.xml
index e5cb1dd5d..6ff35fe48 100644
--- a/assets/xml/objects/object_zg.xml
+++ b/assets/xml/objects/object_zg.xml
@@ -1,8 +1,8 @@
-
-
-
-
+
+
+
+
diff --git a/assets/xml/objects/object_zl4.xml b/assets/xml/objects/object_zl4.xml
index 73ebb8606..667ca5f21 100644
--- a/assets/xml/objects/object_zl4.xml
+++ b/assets/xml/objects/object_zl4.xml
@@ -93,7 +93,7 @@
-
+
diff --git a/assets/xml/objects/object_zog.xml b/assets/xml/objects/object_zog.xml
index 8d9e6ebdb..b6d9d26ed 100644
--- a/assets/xml/objects/object_zog.xml
+++ b/assets/xml/objects/object_zog.xml
@@ -19,7 +19,7 @@
-
+
diff --git a/assets/xml/objects/object_zos.xml b/assets/xml/objects/object_zos.xml
index a1364a842..5b3b12345 100644
--- a/assets/xml/objects/object_zos.xml
+++ b/assets/xml/objects/object_zos.xml
@@ -6,7 +6,7 @@
-
+
diff --git a/assets/xml/objects/object_zov.xml b/assets/xml/objects/object_zov.xml
index 440782f10..31b9bcd7b 100644
--- a/assets/xml/objects/object_zov.xml
+++ b/assets/xml/objects/object_zov.xml
@@ -1,81 +1,90 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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/overlays/ovl_En_Mm2.xml b/assets/xml/overlays/ovl_En_Mm2.xml
index 5d0be627f..81457d849 100644
--- a/assets/xml/overlays/ovl_En_Mm2.xml
+++ b/assets/xml/overlays/ovl_En_Mm2.xml
@@ -8,7 +8,7 @@
-
+
diff --git a/assets/xml/overlays/ovl_En_Sth.xml b/assets/xml/overlays/ovl_En_Sth.xml
index 51b29870d..a0d90d9e8 100644
--- a/assets/xml/overlays/ovl_En_Sth.xml
+++ b/assets/xml/overlays/ovl_En_Sth.xml
@@ -1,14 +1,15 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/overlays/ovl_En_Syateki_Okuta.xml b/assets/xml/overlays/ovl_En_Syateki_Okuta.xml
index 0e5054c19..aa38c8533 100644
--- a/assets/xml/overlays/ovl_En_Syateki_Okuta.xml
+++ b/assets/xml/overlays/ovl_En_Syateki_Okuta.xml
@@ -7,7 +7,7 @@
-
-
+
+
diff --git a/assets/xml/objects/object_fbdemo_triforce.xml b/assets/xml/overlays/ovl_fbdemo_triforce.xml
similarity index 56%
rename from assets/xml/objects/object_fbdemo_triforce.xml
rename to assets/xml/overlays/ovl_fbdemo_triforce.xml
index a00c9bf13..ed23e36c3 100644
--- a/assets/xml/objects/object_fbdemo_triforce.xml
+++ b/assets/xml/overlays/ovl_fbdemo_triforce.xml
@@ -1,7 +1,7 @@
-
-
+
+
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/assets/xml/scenes/Z2_00KEIKOKU/Z2_00KEIKOKU.xml b/assets/xml/scenes/Z2_00KEIKOKU/Z2_00KEIKOKU.xml
index 3cf73a255..9c1a84c8c 100644
--- a/assets/xml/scenes/Z2_00KEIKOKU/Z2_00KEIKOKU.xml
+++ b/assets/xml/scenes/Z2_00KEIKOKU/Z2_00KEIKOKU.xml
@@ -2,6 +2,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/diff_settings.py b/diff_settings.py
old mode 100755
new mode 100644
diff --git a/docs/BUILDING_MACOS.md b/docs/BUILDING_MACOS.md
index 8a5aa20a3..cf93acbf2 100644
--- a/docs/BUILDING_MACOS.md
+++ b/docs/BUILDING_MACOS.md
@@ -11,17 +11,20 @@ For macOS, use Homebrew to install the following dependencies:
* python3
* libpng
* bash
-* clang-format 11
You can install them with the following commands:
```bash
brew update
-brew install coreutils make python3 libpng bash clang-format@11
+brew install coreutils make python3 libpng bash
```
(The repository expects Homebrew-installed programs to be either linked correctly in `$PATH` etc. or in their default locations.)
+Homebrew does not have clang-format-14 but MacPorts does
+
+(Have been unable to confirm actual commands with somone that has a Mac)
+
## Building mips-linux-binutils
The following instructions are written for MacOS users but should apply to any Unix-like system, with maybe some modifications at the end regarding the bash_profile.
diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md
index 493486e79..f5a042846 100644
--- a/docs/CONTRIBUTING.md
+++ b/docs/CONTRIBUTING.md
@@ -4,19 +4,19 @@ Thanks for helping us reverse engineer *The Legend of Zelda: Majora's Mask* for
All contributions are welcome. This is a group effort, and even small contributions can make a difference. Some tasks also don't require much knowledge to get started.
This document is meant to be a set of tips and guidelines for contributing to the project.
-For general information about the project, see [our readme](https://github.com/zeldaret/mm/blob/master/README.md).
+For general information about the project, see [our readme](https://github.com/zeldaret/mm/blob/main/README.md).
Most discussions happen on our [Discord Server](https://discord.zelda64.dev) where you are welcome to ask if you need help getting started, or if you have any questions regarding this project and other decompilation projects.
## Useful Links
-- [Installation guide](https://github.com/zeldaret/mm/blob/master/README.md#installation) - Instructions for getting this repository set up and built on your machine.
+- [Installation guide](https://github.com/zeldaret/mm/blob/main/README.md#installation) - Instructions for getting this repository set up and built on your machine.
- [Style Guide](STYLE.md) - Description of the project style that we ask contributors to adhere to.
- [Code Review Guidelines](REVIEWING.md) - These are the guidelines that reviewers will be using when reviewing your code. Good to be familiar with these before submitting your code.
-- [Zelda 64 Reverse Engineering Website](https://zelda64.dev/mm) - Our homepage, with FAQ and progress graph :chart_with_upwards_trend:.
+- [Zelda 64 Reverse Engineering Website](https://zelda64.dev/games/mm) - Our homepage, with FAQ and progress graph :chart_with_upwards_trend:.
- [MM decomp tutorial](tutorial/contents.md) Detailed tutorial for learning in general how decomp works and how to decompile a small, simple file.
-- [Introduction to OOT decomp](https://github.com/zeldaret/oot/blob/master/docs/tutorial/contents.md) - The tutorial the MM one was based on. For OOT, but largely applicable to MM as well. Covers slightly different topics, including how to get your data OK with `vbindiff`.
+- [Introduction to OOT decomp](https://github.com/zeldaret/oot/blob/main/docs/tutorial/contents.md) - The tutorial the MM one was based on. For OOT, but largely applicable to MM as well. Covers slightly different topics, including how to get your data OK with `vbindiff`.
- The `#resources` channel on the Discord contains many more links on specific details of decompiling IDO MIPS code.
## Getting Started
@@ -37,7 +37,7 @@ This project only uses *publicly available code*.
### Environment Setup
-Get started by following the [installation guide in the readme](https://github.com/zeldaret/mm/blob/master/README.md#installation).
+Get started by following the [installation guide in the readme](https://github.com/zeldaret/mm/blob/main/README.md#installation).
You should be able to build a matching ROM before you start making any changes.
### First Contribution
@@ -110,7 +110,7 @@ See the [Style Guide](STYLE.md) for more details on documentation style.
Before opening a PR, walk through the following steps to ensure that your code conforms to the style guide and conventions.
- `make` successfully builds a matching ROM.
-- `./format.sh` was run to apply standard formatting.
+- `./format.py` was run to apply standard formatting.
- No new compiler warnings were introduced during the build process.
- Can be verified locally by running `tools/warnings_count/check_new_warnings.sh`
- New variables & functions should follow standard naming conventions.
@@ -142,8 +142,8 @@ Project leads are responsible for ensuring that these conventions are followed.
### Some git notes
-- You should work on a branch on your fork separate from your copy of master: it is always useful to have a clean master branch around if you need to fix something.
-- When a PR is merged into master, it may conflict with your work. While your branch is private (in particular, not used for a PR), you can rebase, but when your branch is public/used for a PR always merge master instead of rebasing: it makes it much easier for people to understand what you changed since the last review.
+- You should work on a branch on your fork separate from your copy of main: it is always useful to have a clean main branch around if you need to fix something.
+- When a PR is merged into main, it may conflict with your work. While your branch is private (in particular, not used for a PR), you can rebase, but when your branch is public/used for a PR always merge main instead of rebasing: it makes it much easier for people to understand what you changed since the last review.
- We squash commits when merging, so your commit history does not have to be completely spotless.
Throughout the PR process, you (the author) should update the rows on the appropriate Google Sheets with the appropriate information as the decompilation process progresses.
diff --git a/docs/REVIEWING.md b/docs/REVIEWING.md
index 8b70f2711..3fc160729 100644
--- a/docs/REVIEWING.md
+++ b/docs/REVIEWING.md
@@ -5,7 +5,7 @@ We encourage all contributors to participate in code review: this is your codeba
Every review submitted helps us keep code quality high and code merged in more quickly.
This document is meant to be a set of tips and guidelines for reviewers of pull requests to the project.
-For general information about the project, see [our readme](https://github.com/zeldaret/mm/blob/master/README.md).
+For general information about the project, see [our readme](https://github.com/zeldaret/mm/blob/main/README.md).
Most discussions happen on our [Discord Server](https://discord.zelda64.dev) where you are welcome to ask if you need help getting started, or if you have any questions regarding this project and other decompilation projects.
@@ -30,7 +30,7 @@ You should first famiiarise yourself with our [Contributing guide](CONTRIBUTING.
- [ ] Jenkins build is successful.
- [ ] `make` builds a matching ROM.
- - [ ] `format.sh` was run.
+ - [ ] `format.py` was run.
- [ ] `spec` contains correct relocation files.
- [ ] Any new compiler warnings that were added are required for matching. Ensure there is good reason if the warnings files have changed.
- [ ] Files with `NON_MATCHING` functions have equivalent behaviour.
diff --git a/docs/STYLE.md b/docs/STYLE.md
index 0cf1d051b..616c4a8cc 100644
--- a/docs/STYLE.md
+++ b/docs/STYLE.md
@@ -140,7 +140,7 @@ Damage flag enums are not being used at present: we want to wait until we have a
Pre-C99, commas at the end of the last item in an enum will cause a compiler warning, so leave them off.
-All compound flag lists (e.g. `ACTOR_FLAG_4 | ACTOR_FLAG_8`) should be listed in *ascending* order
+All compound flag lists (e.g. `ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_FRIENDLY`) should be listed in *ascending* order
## Arrays
diff --git a/docs/tools.md b/docs/tools.md
index 0aba4fa47..c307382f9 100644
--- a/docs/tools.md
+++ b/docs/tools.md
@@ -127,7 +127,7 @@ Gives the progress output that the website uses. Run for that warm glow.
### `tools/regconvert.py`
-Convert `mips2c`'s `gGameInfo->data[n]` output (or a raw offset) into the appropriate variable in the REG pages. Can also be run on a file to mass-convert them: run with `-h` for details.
+Convert `mips2c`'s `gRegEditor->data[n]` output (or a raw offset) into the appropriate variable in the REG pages. Can also be run on a file to mass-convert them: run with `-h` for details.
### `tools/rename_global_asm.py`
@@ -198,29 +198,27 @@ Fixes line endings in the repo to Linux style (LF), which is required for the bu
### `format.py`
-Formats all C files in the repo using `clang-format-11`, `clang-tidy`, and `clang-apply-replacements` (when multiprocessing). This will touch all files in the repo, so the next `make` will take longer.
+Formats all C files in the repo using `clang-format-14`, `clang-tidy`, and `clang-apply-replacements` (when multiprocessing). This will touch all files in the repo, so the next `make` will take longer.
You can specify how many threads you would like this to run with by adding the `-jN` flag. Where N is the number of threads. By default this will run using 1 thread (i.e. `-j1`).
-`clang-11` is available in many native package managers, but if not try:
+`clang-14` is available in many native package managers, but if not try:
Linux:
Download llvm's setup script, run it, than install normally
```bash
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
-sudo ./llvm.sh 11
+sudo ./llvm.sh 14
rm llvm.sh
-sudo apt install clang-format-11 clang-tidy-11 clang-apply-replacements-11
+sudo apt install clang-format-14 clang-tidy-14 clang-apply-replacements-14
```
Mac:
-Install with brew, than create symlinks for `clang-tidy` and `clang-apply-replacements` to use properly
-```bash
-brew install llvm clang-format-11
-ln -s "$(brew --prefix llvm)/bin/clang-tidy" "/usr/local/bin/clang-tidy"
-ln -s "$(brew --prefix llvm)/bin/clang-apply-replacements" "/usr/local/bin/clang-apply-replacements"
-```
+Brew does not have clang-format-14, but MacPorts does.
+
+(Have been unable to confirm actual commands with somone that has a Mac)
+
## External tools
@@ -273,7 +271,7 @@ Probably the best of the Nintendo 64 texture viewing programs. It is quite simpl
### Z64Utils
-Basically essential for convenient analysis of object files. Can analyse and display DisplayLists, some textures, skeletons, animations, and a few other resources. Download from .
+Basically essential for convenient analysis of object files. Can analyse and display DisplayLists, some textures, skeletons, animations, and a few other resources. Download from .
## Retired tools
diff --git a/docs/tutorial/advanced_control_flow.md b/docs/tutorial/advanced_control_flow.md
index 96ba7a43d..83d55f7ad 100644
--- a/docs/tutorial/advanced_control_flow.md
+++ b/docs/tutorial/advanced_control_flow.md
@@ -67,7 +67,7 @@ void EnMs_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 0.015f);
this->actor.colChkInfo.mass = 0xFF;
this->actionFunc = func_80952734;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.velocity.y = 0.0f;
this->actor.gravity = -1.0f;
}
@@ -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;
@@ -94,7 +94,7 @@ void func_80952734(EnMs* this, PlayState* play) {
if (this->actor.xzDistToPlayer < 90.0f) {
if (ABS_ALT(temp_v1) < 0x2000) {
- func_800B8614(&this->actor, play, 90.0f);
+ Actor_OfferTalk(&this->actor, play, 90.0f);
}
}
}
@@ -104,19 +104,19 @@ void func_80952734(EnMs* this, PlayState* play) {
void func_809529AC(EnMs* this, PlayState* play) {
if (Actor_HasParent(&this->actor, play)) {
this->actor.textId = 0;
- func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel, 0);
+ Actor_OfferTalkExchange(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel, 0);
this->actionFunc = func_80952A1C;
} else {
- Actor_PickUp(&this->actor, play, 0x35, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
+ Actor_OfferGetItem(&this->actor, play, 0x35, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
}
}
void func_80952A1C(EnMs* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- func_80151938(play, 0x936U);
+ Message_ContinueTextbox(play, 0x936U);
this->actionFunc = func_809527F8;
} else {
- func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel, -1);
+ Actor_OfferTalkExchange(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel, -1);
}
}
@@ -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);
}
@@ -167,8 +167,8 @@ void func_809527F8(EnMs* this, PlayState* play) {
return;
}
if (Message_ShouldAdvance(play) != 0) {
- func_801477B4(play);
- Actor_PickUp((Actor *) this, play, 0x35, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
+ Message_CloseTextbox(play);
+ Actor_OfferGetItem((Actor *) this, play, 0x35, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
this->actionFunc = func_809529AC;
return;
}
@@ -181,24 +181,24 @@ void func_809527F8(EnMs* this, PlayState* play) {
if (temp_v0_2 != 1) {
}
- func_8019F230();
- func_80151938(play, 0x934U);
+ Audio_PlaySfx_MessageCancel();
+ Message_ContinueTextbox(play, 0x934U);
// Duplicate return node #17. Try simplifying control flow for better match
return;
}
- func_801477B4(play);
- if ((s32) gSaveContext.save.playerData.rupees < 0xA) {
- play_sound(0x4806U);
- func_80151938(play, 0x935U);
+ Message_CloseTextbox(play);
+ if ((s32) gSaveContext.save.saveInfo.playerData.rupees < 0xA) {
+ Audio_PlaySfx(0x4806U);
+ Message_ContinueTextbox(play, 0x935U);
return;
}
- if ((s32) gSaveContext.save.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
- play_sound(0x4806U);
- func_80151938(play, 0x937U);
+ if ((s32) gSaveContext.save.saveInfo.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
+ Audio_PlaySfx(0x4806U);
+ Message_ContinueTextbox(play, 0x937U);
return;
}
- func_8019F208();
- Actor_PickUp((Actor *) this, play, 0x35, 90.0f, 10.0f);
+ Audio_PlaySfx_MessageDecide();
+ Actor_OfferGetItem((Actor *) this, play, 0x35, 90.0f, 10.0f);
Rupees_ChangeBy(-0xA);
this->actionFunc = func_809529AC;
}
@@ -256,8 +256,8 @@ block_5:
if (Message_ShouldAdvance(play) == 0) {
goto block_17;
}
- func_801477B4(play);
- Actor_PickUp((Actor *) this, play, 0x35, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
+ Message_CloseTextbox(play);
+ Actor_OfferGetItem((Actor *) this, play, 0x35, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
this->actionFunc = func_809529AC;
return;
block_7:
@@ -273,29 +273,29 @@ block_7:
}
goto block_16;
block_11:
- func_801477B4(play);
- if ((s32) gSaveContext.save.playerData.rupees >= 0xA) {
+ Message_CloseTextbox(play);
+ if ((s32) gSaveContext.save.saveInfo.playerData.rupees >= 0xA) {
goto block_13;
}
- play_sound(0x4806U);
- func_80151938(play, 0x935U);
+ Audio_PlaySfx(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);
- func_80151938(play, 0x937U);
+ Audio_PlaySfx(0x4806U);
+ Message_ContinueTextbox(play, 0x937U);
return;
block_15:
- func_8019F208();
- Actor_PickUp((Actor *) this, play, 0x35, 90.0f, 10.0f);
+ Audio_PlaySfx_MessageDecide();
+ Actor_OfferGetItem((Actor *) this, play, 0x35, 90.0f, 10.0f);
Rupees_ChangeBy(-0xA);
this->actionFunc = func_809529AC;
return;
block_16:
- func_8019F230();
- func_80151938(play, 0x934U);
+ Audio_PlaySfx_MessageCancel();
+ Message_ContinueTextbox(play, 0x934U);
block_17:
return;
}
@@ -312,21 +312,21 @@ 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);
- func_80151938(play, 0x935U);
+ Audio_PlaySfx(0x4806U);
+ Message_ContinueTextbox(play, 0x935U);
return;
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:
+Currently, this says to jump over the code block `Audio_PlaySfx...` 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) {
- play_sound(0x4806U);
- func_80151938(play, 0x935U);
+ if (gSaveContext.save.saveInfo.playerData.rupees < 0xA) {
+ Audio_PlaySfx(0x4806U);
+ Message_ContinueTextbox(play, 0x935U);
return;
}
```
@@ -359,8 +359,8 @@ block_5:
if (Message_ShouldAdvance(play) == 0) {
goto block_17;
}
- func_801477B4(play);
- Actor_PickUp((Actor *) this, play, 0x35, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
+ Message_CloseTextbox(play);
+ Actor_OfferGetItem((Actor *) this, play, 0x35, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
this->actionFunc = func_809529AC;
return;
block_7:
@@ -376,27 +376,27 @@ block_7:
}
goto block_16;
block_11:
- func_801477B4(play);
+ Message_CloseTextbox(play);
- if (gSaveContext.save.playerData.rupees < 0xA) {
- play_sound(0x4806U);
- func_80151938(play, 0x935U);
+ if (gSaveContext.save.saveInfo.playerData.rupees < 0xA) {
+ Audio_PlaySfx(0x4806U);
+ Message_ContinueTextbox(play, 0x935U);
return;
}
- if (gSaveContext.save.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
- play_sound(0x4806U);
- func_80151938(play, 0x937U);
+ if (gSaveContext.save.saveInfo.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
+ Audio_PlaySfx(0x4806U);
+ Message_ContinueTextbox(play, 0x937U);
return;
}
- func_8019F208();
- Actor_PickUp((Actor *) this, play, 0x35, 90.0f, 10.0f);
+ Audio_PlaySfx_MessageDecide();
+ Actor_OfferGetItem((Actor *) this, play, 0x35, 90.0f, 10.0f);
Rupees_ChangeBy(-0xA);
this->actionFunc = func_809529AC;
return;
block_16:
- func_8019F230();
- func_80151938(play, 0x934U);
+ Audio_PlaySfx_MessageCancel();
+ Message_ContinueTextbox(play, 0x934U);
block_17:
return;
}
@@ -428,8 +428,8 @@ block_5:
if (Message_ShouldAdvance(play) == 0) {
return;
}
- func_801477B4(play);
- Actor_PickUp((Actor *) this, play, 0x35, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
+ Message_CloseTextbox(play);
+ Actor_OfferGetItem((Actor *) this, play, 0x35, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
this->actionFunc = func_809529AC;
return;
block_7:
@@ -445,27 +445,27 @@ block_7:
}
goto block_16;
block_11:
- func_801477B4(play);
+ Message_CloseTextbox(play);
- if (gSaveContext.save.playerData.rupees < 0xA) {
- play_sound(0x4806U);
- func_80151938(play, 0x935U);
+ if (gSaveContext.save.saveInfo.playerData.rupees < 0xA) {
+ Audio_PlaySfx(0x4806U);
+ Message_ContinueTextbox(play, 0x935U);
return;
}
- if (gSaveContext.save.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
- play_sound(0x4806U);
- func_80151938(play, 0x937U);
+ if (gSaveContext.save.saveInfo.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
+ Audio_PlaySfx(0x4806U);
+ Message_ContinueTextbox(play, 0x937U);
return;
}
- func_8019F208();
- Actor_PickUp((Actor *) this, play, 0x35, 90.0f, 10.0f);
+ Audio_PlaySfx_MessageDecide();
+ Actor_OfferGetItem((Actor *) this, play, 0x35, 90.0f, 10.0f);
Rupees_ChangeBy(-0xA);
this->actionFunc = func_809529AC;
return;
block_16:
- func_8019F230();
- func_80151938(play, 0x934U);
+ Audio_PlaySfx_MessageCancel();
+ Message_ContinueTextbox(play, 0x934U);
}
```
@@ -495,21 +495,21 @@ So let us rewrite the entire second half as a switch:
```C
switch (play->msgCtx.choiceIndex) {
case 0:
- func_801477B4(play);
+ Message_CloseTextbox(play);
- if (gSaveContext.save.playerData.rupees < 0xA) {
- play_sound(0x4806U);
- func_80151938(play, 0x935U);
+ if (gSaveContext.save.saveInfo.playerData.rupees < 0xA) {
+ Audio_PlaySfx(0x4806U);
+ Message_ContinueTextbox(play, 0x935U);
return;
}
- if (gSaveContext.save.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
- play_sound(0x4806U);
- func_80151938(play, 0x937U);
+ if (gSaveContext.save.saveInfo.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
+ Audio_PlaySfx(0x4806U);
+ Message_ContinueTextbox(play, 0x937U);
return;
}
- func_8019F208();
- Actor_PickUp((Actor *) this, play, 0x35, 90.0f, 10.0f);
+ Audio_PlaySfx_MessageDecide();
+ Actor_OfferGetItem((Actor *) this, play, 0x35, 90.0f, 10.0f);
Rupees_ChangeBy(-0xA);
this->actionFunc = func_809529AC;
return;
@@ -517,8 +517,8 @@ So let us rewrite the entire second half as a switch:
case 1:
default:
- func_8019F230();
- func_80151938(play, 0x934U);
+ Audio_PlaySfx_MessageCancel();
+ Message_ContinueTextbox(play, 0x934U);
break;
}
```
@@ -531,17 +531,17 @@ There's a couple of other obvious things here:
```C
switch (play->msgCtx.choiceIndex) {
case 0:
- func_801477B4(play);
+ Message_CloseTextbox(play);
- if (gSaveContext.save.playerData.rupees < 0xA) {
- play_sound(0x4806U);
- func_80151938(play, 0x935U);
- } else if (gSaveContext.save.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
- play_sound(0x4806U);
- func_80151938(play, 0x937U);
+ if (gSaveContext.save.saveInfo.playerData.rupees < 0xA) {
+ Audio_PlaySfx(0x4806U);
+ Message_ContinueTextbox(play, 0x935U);
+ } else if (gSaveContext.save.saveInfo.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
+ Audio_PlaySfx(0x4806U);
+ Message_ContinueTextbox(play, 0x937U);
} else {
- func_8019F208();
- Actor_PickUp((Actor *) this, play, 0x35, 90.0f, 10.0f);
+ Audio_PlaySfx_MessageDecide();
+ Actor_OfferGetItem((Actor *) this, play, 0x35, 90.0f, 10.0f);
Rupees_ChangeBy(-0xA);
this->actionFunc = func_809529AC;
}
@@ -549,8 +549,8 @@ There's a couple of other obvious things here:
case 1:
default:
- func_8019F230();
- func_80151938(play, 0x934U);
+ Audio_PlaySfx_MessageCancel();
+ Message_ContinueTextbox(play, 0x934U);
break;
}
```
@@ -588,25 +588,25 @@ block_5:
if (Message_ShouldAdvance(play) == 0) {
return;
}
- func_801477B4(play);
- Actor_PickUp((Actor *) this, play, 0x35, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
+ Message_CloseTextbox(play);
+ Actor_OfferGetItem((Actor *) this, play, 0x35, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
this->actionFunc = func_809529AC;
return;
block_7:
if (Message_ShouldAdvance(play) != 0) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_801477B4(play);
+ Message_CloseTextbox(play);
- if (gSaveContext.save.playerData.rupees < 0xA) {
- play_sound(0x4806U);
- func_80151938(play, 0x935U);
- } else if (gSaveContext.save.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
- play_sound(0x4806U);
- func_80151938(play, 0x937U);
+ if (gSaveContext.save.saveInfo.playerData.rupees < 0xA) {
+ Audio_PlaySfx(0x4806U);
+ Message_ContinueTextbox(play, 0x935U);
+ } else if (gSaveContext.save.saveInfo.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
+ Audio_PlaySfx(0x4806U);
+ Message_ContinueTextbox(play, 0x937U);
} else {
- func_8019F208();
- Actor_PickUp((Actor *) this, play, 0x35, 90.0f, 10.0f);
+ Audio_PlaySfx_MessageDecide();
+ Actor_OfferGetItem((Actor *) this, play, 0x35, 90.0f, 10.0f);
Rupees_ChangeBy(-0xA);
this->actionFunc = func_809529AC;
}
@@ -614,8 +614,8 @@ block_7:
case 1:
default:
- func_8019F230();
- func_80151938(play, 0x934U);
+ Audio_PlaySfx_MessageCancel();
+ Message_ContinueTextbox(play, 0x934U);
break;
}
}
@@ -652,8 +652,8 @@ void func_809527F8(EnMs* this, PlayState* play) {
if (Message_ShouldAdvance(play) == 0) {
return;
}
- func_801477B4(play);
- Actor_PickUp((Actor *) this, play, 0x35, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
+ Message_CloseTextbox(play);
+ Actor_OfferGetItem((Actor *) this, play, 0x35, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
this->actionFunc = func_809529AC;
break;
@@ -661,17 +661,17 @@ void func_809527F8(EnMs* this, PlayState* play) {
if (Message_ShouldAdvance(play) != 0) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_801477B4(play);
+ Message_CloseTextbox(play);
- if (gSaveContext.save.playerData.rupees < 0xA) {
- play_sound(0x4806U);
- func_80151938(play, 0x935U);
- } else if (gSaveContext.save.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
- play_sound(0x4806U);
- func_80151938(play, 0x937U);
+ if (gSaveContext.save.saveInfo.playerData.rupees < 0xA) {
+ Audio_PlaySfx(0x4806U);
+ Message_ContinueTextbox(play, 0x935U);
+ } else if (gSaveContext.save.saveInfo.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
+ Audio_PlaySfx(0x4806U);
+ Message_ContinueTextbox(play, 0x937U);
} else {
- func_8019F208();
- Actor_PickUp((Actor *) this, play, 0x35, 90.0f, 10.0f);
+ Audio_PlaySfx_MessageDecide();
+ Actor_OfferGetItem((Actor *) this, play, 0x35, 90.0f, 10.0f);
Rupees_ChangeBy(-0xA);
this->actionFunc = func_809529AC;
}
@@ -679,8 +679,8 @@ void func_809527F8(EnMs* this, PlayState* play) {
case 1:
default:
- func_8019F230();
- func_80151938(play, 0x934U);
+ Audio_PlaySfx_MessageCancel();
+ Message_ContinueTextbox(play, 0x934U);
break;
}
}
@@ -703,8 +703,8 @@ void func_809527F8(EnMs* this, PlayState* play) {
case 5:
if (Message_ShouldAdvance(play) != 0) {
- func_801477B4(play);
- Actor_PickUp((Actor *) this, play, 0x35, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
+ Message_CloseTextbox(play);
+ Actor_OfferGetItem((Actor *) this, play, 0x35, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
this->actionFunc = func_809529AC;
}
break;
@@ -713,17 +713,17 @@ void func_809527F8(EnMs* this, PlayState* play) {
if (Message_ShouldAdvance(play) != 0) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_801477B4(play);
+ Message_CloseTextbox(play);
- if (gSaveContext.save.playerData.rupees < 0xA) {
- play_sound(0x4806U);
- func_80151938(play, 0x935U);
- } else if (gSaveContext.save.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
- play_sound(0x4806U);
- func_80151938(play, 0x937U);
+ if (gSaveContext.save.saveInfo.playerData.rupees < 0xA) {
+ Audio_PlaySfx(0x4806U);
+ Message_ContinueTextbox(play, 0x935U);
+ } else if (gSaveContext.save.saveInfo.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
+ Audio_PlaySfx(0x4806U);
+ Message_ContinueTextbox(play, 0x937U);
} else {
- func_8019F208();
- Actor_PickUp((Actor *) this, play, 0x35, 90.0f, 10.0f);
+ Audio_PlaySfx_MessageDecide();
+ Actor_OfferGetItem((Actor *) this, play, 0x35, 90.0f, 10.0f);
Rupees_ChangeBy(-0xA);
this->actionFunc = func_809529AC;
}
@@ -731,8 +731,8 @@ void func_809527F8(EnMs* this, PlayState* play) {
case 1:
default:
- func_8019F230();
- func_80151938(play, 0x934U);
+ Audio_PlaySfx_MessageCancel();
+ Message_ContinueTextbox(play, 0x934U);
break;
}
}
diff --git a/docs/tutorial/beginning_decomp.md b/docs/tutorial/beginning_decomp.md
index 591f12a2b..2685f9276 100644
--- a/docs/tutorial/beginning_decomp.md
+++ b/docs/tutorial/beginning_decomp.md
@@ -175,7 +175,7 @@ The Init function sets up the various components of the actor when it is first l
The first stage of decompilation is done by a program called mips_to_c, often referred to as mips2c, which constructs a C interpretation of the assembly code based on reading it very literally. This means that considerable cleanup will be required to turn it into something that firstly compiles at all, and secondly looks like a human wrote it, let alone a Zelda developer from the late '90s.
-The web version of mips2c can be found [here](https://simonsoftware.se/other/mips_to_c.py). This was [covered in the OoT tutorial](https://github.com/zeldaret/oot/blob/master/docs/tutorial/beginning_decomp.md). We shall instead use the repository. Clone [the mips_to_c repository](https://github.com/matt-kempster/mips_to_c) into a separate directory (we will assume on the same level as the `mm/` directory). Since it's Python, we don't have to do any compilation or anything in the mips_to_c directory.
+The web version of mips2c can be found [here](https://simonsoftware.se/other/mips_to_c.py). This was [covered in the OoT tutorial](https://github.com/zeldaret/oot/blob/main/docs/tutorial/beginning_decomp.md). We shall instead use the repository. Clone [the mips_to_c repository](https://github.com/matt-kempster/mips_to_c) into a separate directory (we will assume on the same level as the `mm/` directory). Since it's Python, we don't have to do any compilation or anything in the mips_to_c directory.
Since the actor depends on the rest of the codebase, we can't expect to get much intelligible out of mips2c without giving it some context. We make this using a Python script in the `tools` directory called `m2ctx.py`, so run
@@ -686,7 +686,7 @@ as our first guess. This doesn't look unreasonable... the question is, does it m
Once preliminary cleanup and struct filling is done, most time spent matching functions is done by comparing the original code with the code you have compiled. This is aided by a program called `diff.py`.
-In order to use `diff.py` with the symbol names, we need a copy of the code to compare against. In MM this is done as part of `make init`, and you can regenerate the `expected` directory (which is simply a known-good copy of `build` directory) by running `make diff-init`, which will check for an OK ROM and copy the build directory over. (Of course you need an OK ROM to do this; worst-case, you can checkout master and do a complete rebuild to get it). (You need to remake `expected` if you want to diff a function you have renamed: `diff.py` looks in the mapfiles for the function name, which won't work if the name has changed!)
+In order to use `diff.py` with the symbol names, we need a copy of the code to compare against. In MM this is done as part of `make init`, and you can regenerate the `expected` directory (which is simply a known-good copy of `build` directory) by running `make diff-init`, which will check for an OK ROM and copy the build directory over. (Of course you need an OK ROM to do this; worst-case, you can checkout main and do a complete rebuild to get it). (You need to remake `expected` if you want to diff a function you have renamed: `diff.py` looks in the mapfiles for the function name, which won't work if the name has changed!)
Now, we run diff on the function name: in the main directory,
diff --git a/docs/tutorial/data.md b/docs/tutorial/data.md
index 6884ebb12..07ea8cfac 100644
--- a/docs/tutorial/data.md
+++ b/docs/tutorial/data.md
@@ -27,7 +27,7 @@ Both approaches have their advantages and disadvantages.
## Data first
-This way is good for smaller actors with little data. The OoT tutorial [covers this in plenty of detail](https://github.com/zeldaret/oot/blob/master/docs/tutorial/data.md), and the process in MM is essentially identical, so we won't go over it here.
+This way is good for smaller actors with little data. The OoT tutorial [covers this in plenty of detail](https://github.com/zeldaret/oot/blob/main/docs/tutorial/data.md), and the process in MM is essentially identical, so we won't go over it here.
## Extern and data last
diff --git a/docs/tutorial/diff_and_permuter.md b/docs/tutorial/diff_and_permuter.md
index 2b5d41e30..e8d0f59f7 100644
--- a/docs/tutorial/diff_and_permuter.md
+++ b/docs/tutorial/diff_and_permuter.md
@@ -2,7 +2,7 @@
This document is intended as a step-by-step demonstration of matching a reasonably complex function using the diff script `diff.py` and the decomp permuter, both included in the repo. For general information on both see [the tools documentation](../tools.md).
-Until such time as someone finds a suitable function, you can look at the OoT tutorial: [here for diff.py](https://github.com/zeldaret/oot/blob/master/docs/tutorial/beginning_decomp.md#diff) and [here for the permuter](https://github.com/zeldaret/oot/blob/master/docs/tutorial/other_functions.md#the-permuter).
+Until such time as someone finds a suitable function, you can look at the OoT tutorial: [here for diff.py](https://github.com/zeldaret/oot/blob/main/docs/tutorial/beginning_decomp.md#diff) and [here for the permuter](https://github.com/zeldaret/oot/blob/main/docs/tutorial/other_functions.md#the-permuter).
-Z -X <------O------> +X -X <------O------> +X
+ * | ^ | ^ | |
+ * | \ | / | / +roll
+ * | -yaw --|-- +yaw |<-
+ * v v v
+ * -Y +Z -Y
+ *
+ */
+
+#include "prevent_bss_reordering.h"
#include "global.h"
+#include "libc/string.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 +158,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 +242,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 +266,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 +313,7 @@ s32 func_800CB7CC(Camera* camera) {
return 0;
}
}
+
s32 Camera_IsMountedOnHorse(Camera* camera) {
Actor* focalActor = camera->focalActor;
@@ -310,7 +401,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 +468,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;
}
}
@@ -392,7 +483,7 @@ s32 Camera_GetFocalActorPos(Vec3f* dst, Camera* camera) {
Actor* focalActor = camera->focalActor;
if (camera->focalActor == &GET_PLAYER(camera->play)->actor) {
- *dst = ((Player*)focalActor)->bodyPartsPos[0];
+ *dst = ((Player*)focalActor)->bodyPartsPos[PLAYER_BODYPART_WAIST];
return dst;
} else {
Actor_GetWorldPosShapeRot(&focalPosRot, camera->focalActor);
@@ -418,13 +509,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 +535,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 +543,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 +869,5084 @@ 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))) {
+ 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,2313 @@ 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) {
+ default:
+ break;
+
+ 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--;
+ Audio_PlaySfx_2(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:
+ Audio_PlaySfx(0);
+ break;
+
+ case CAM_CHANGE_MODE_1:
+ if (camera->play->roomCtx.curRoom.behaviorType1 == ROOM_BEHAVIOR_TYPE1_1) {
+ Audio_PlaySfx(NA_SE_SY_ATTENTION_URGENCY);
+ } else {
+
+ Audio_PlaySfx(NA_SE_SY_ATTENTION_ON);
+ }
+ break;
+
+ case CAM_CHANGE_MODE_BATTLE:
+ Audio_PlaySfx(NA_SE_SY_ATTENTION_URGENCY);
+ break;
+
+ case CAM_CHANGE_MODE_FOLLOW_TARGET:
+ Audio_PlaySfx(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 0e36f1c54..39b57cbd0 100644
--- a/src/code/z_collision_check.c
+++ b/src/code/z_collision_check.c
@@ -1,5 +1,11 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
+#include "z64collision_check.h"
+
+typedef s32 (*ColChkResetFunc)(struct PlayState*, Collider*);
+typedef void (*ColChkBloodFunc)(struct PlayState*, Collider*, Vec3f*);
+typedef void (*ColChkApplyFunc)(struct PlayState*, CollisionCheckContext*, Collider*);
+typedef void (*ColChkVsFunc)(struct PlayState*, CollisionCheckContext*, Collider*, Collider*);
+typedef s32 (*ColChkLineFunc)(struct PlayState*, CollisionCheckContext*, Collider*, Vec3f*, Vec3f*);
Vec3f D_801EDE00;
Vec3f D_801EDE10;
@@ -24,16 +30,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 +99,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 +1161,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 +1187,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 +1221,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 +1247,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 +1281,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 +1307,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,12 +1531,12 @@ 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);
+ Audio_PlaySfx(NA_SE_IT_SHIELD_BOUND);
} else {
- Audio_PlaySfxAtPos(&collider->actor->projectedPos, NA_SE_IT_SHIELD_BOUND);
+ Audio_PlaySfx_AtPos(&collider->actor->projectedPos, NA_SE_IT_SHIELD_BOUND);
}
} else if (flags == TOUCH_SFX_NORMAL) {
EffectSsHitmark_SpawnFixedScale(play, 3, hitPos);
@@ -1533,16 +1548,16 @@ void CollisionCheck_HitSolid(PlayState* play, ColliderInfo* info, Collider* coll
} else if (flags == TOUCH_SFX_HARD) {
EffectSsHitmark_SpawnFixedScale(play, 0, hitPos);
if (collider->actor == NULL) {
- play_sound(NA_SE_IT_SHIELD_BOUND);
+ Audio_PlaySfx(NA_SE_IT_SHIELD_BOUND);
} else {
- Audio_PlaySfxAtPos(&collider->actor->projectedPos, NA_SE_IT_SHIELD_BOUND);
+ Audio_PlaySfx_AtPos(&collider->actor->projectedPos, NA_SE_IT_SHIELD_BOUND);
}
} else if (flags == TOUCH_SFX_WOOD) {
EffectSsHitmark_SpawnFixedScale(play, 1, hitPos);
if (collider->actor == NULL) {
- play_sound(NA_SE_IT_REFLECTION_WOOD);
+ Audio_PlaySfx(NA_SE_IT_REFLECTION_WOOD);
} else {
- Audio_PlaySfxAtPos(&collider->actor->projectedPos, NA_SE_IT_REFLECTION_WOOD);
+ Audio_PlaySfx_AtPos(&collider->actor->projectedPos, NA_SE_IT_REFLECTION_WOOD);
}
}
}
@@ -1551,15 +1566,15 @@ 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);
+ Audio_PlaySfx_AtPos(&at->actor->projectedPos, NA_SE_IT_SWORD_STRIKE);
} else if (acInfo->elemType == ELEMTYPE_UNK1) {
- Audio_PlaySfxAtPos(&at->actor->projectedPos, NA_SE_IT_SWORD_STRIKE_HARD);
+ Audio_PlaySfx_AtPos(&at->actor->projectedPos, NA_SE_IT_SWORD_STRIKE_HARD);
} else if (acInfo->elemType == ELEMTYPE_UNK2) {
- Audio_PlaySfxAtPos(&at->actor->projectedPos, 0);
+ Audio_PlaySfx_AtPos(&at->actor->projectedPos, 0);
} else if (acInfo->elemType == ELEMTYPE_UNK3) {
- Audio_PlaySfxAtPos(&at->actor->projectedPos, 0);
+ Audio_PlaySfx_AtPos(&at->actor->projectedPos, 0);
}
}
return 1;
@@ -1599,7 +1614,7 @@ void CollisionCheck_HitEffects(PlayState* play, Collider* at, ColliderInfo* atIn
} else if (sHitInfo[ac->colType].effect == HIT_WOOD) {
if (at->actor == NULL) {
CollisionCheck_SpawnShieldParticles(play, hitPos);
- play_sound(NA_SE_IT_REFLECTION_WOOD);
+ Audio_PlaySfx(NA_SE_IT_REFLECTION_WOOD);
} else {
CollisionCheck_SpawnShieldParticlesWood(play, hitPos, &at->actor->projectedPos);
}
@@ -1612,9 +1627,9 @@ void CollisionCheck_HitEffects(PlayState* play, Collider* at, ColliderInfo* atIn
} else {
EffectSsHitmark_SpawnFixedScale(play, 0, hitPos);
if (ac->actor == NULL) {
- play_sound(NA_SE_IT_SHIELD_BOUND);
+ Audio_PlaySfx(NA_SE_IT_SHIELD_BOUND);
} else {
- Audio_PlaySfxAtPos(&ac->actor->projectedPos, NA_SE_IT_SHIELD_BOUND);
+ Audio_PlaySfx_AtPos(&ac->actor->projectedPos, NA_SE_IT_SHIELD_BOUND);
}
}
}
@@ -1645,7 +1660,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 +1691,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 +1727,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 +1781,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 +1830,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 +1866,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 +1906,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 +1951,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 +2002,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 +2054,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 +2087,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 +2127,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 +2174,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 +2212,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 +2246,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 +2281,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 +2320,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 +2352,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 +2393,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 +2439,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 +2554,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 +2747,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 +2766,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 +2785,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 +2804,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 +2820,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 +2845,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 +2876,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 +2899,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 +2966,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 +3041,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 +3076,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 +3105,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 +3261,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 +3362,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 +3382,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 +3397,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);
}
@@ -3837,7 +3853,7 @@ void CollisionCheck_SpawnShieldParticles(PlayState* play, Vec3f* v) {
35.0f,
30.0f,
8,
- { 0, 0, 0, 0, 128, 255, 0, 300 },
+ { 0, 0, 0, { 0, 128, 255 }, 0, 300 },
1,
};
s32 effectIndex;
@@ -3857,7 +3873,7 @@ void CollisionCheck_SpawnShieldParticles(PlayState* play, Vec3f* v) {
*/
void CollisionCheck_SpawnShieldParticlesMetal(PlayState* play, Vec3f* v) {
CollisionCheck_SpawnShieldParticles(play, v);
- play_sound(NA_SE_IT_SHIELD_REFLECT_SW);
+ Audio_PlaySfx(NA_SE_IT_SHIELD_REFLECT_SW);
}
/**
@@ -3865,7 +3881,7 @@ void CollisionCheck_SpawnShieldParticlesMetal(PlayState* play, Vec3f* v) {
*/
void CollisionCheck_SpawnShieldParticlesMetalSound(PlayState* play, Vec3f* v, Vec3f* pos) {
CollisionCheck_SpawnShieldParticles(play, v);
- Audio_PlaySfxAtPos(pos, NA_SE_IT_SHIELD_REFLECT_SW);
+ Audio_PlaySfx_AtPos(pos, NA_SE_IT_SHIELD_REFLECT_SW);
}
/**
@@ -3892,7 +3908,7 @@ void CollisionCheck_SpawnShieldParticlesWood(PlayState* play, Vec3f* v, Vec3f* p
35.0f,
30.0f,
8,
- { 0, 0, 0, 0, 128, 255, 0, 300 },
+ { 0, 0, 0, { 0, 128, 255 }, 0, 300 },
0,
};
s32 effectIndex;
@@ -3905,7 +3921,7 @@ void CollisionCheck_SpawnShieldParticlesWood(PlayState* play, Vec3f* v, Vec3f* p
shieldParticleInitWood.lightPoint.z = shieldParticleInitWood.position.z;
Effect_Add(play, &effectIndex, EFFECT_SHIELD_PARTICLE, 0, 1, &shieldParticleInitWood);
- Audio_PlaySfxAtPos(pos, NA_SE_IT_REFLECTION_WOOD);
+ Audio_PlaySfx_AtPos(pos, NA_SE_IT_REFLECTION_WOOD);
}
/**
@@ -3958,7 +3974,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 +4014,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 +4033,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..f0805c46b 100644
--- a/src/code/z_common_data.c
+++ b/src/code/z_common_data.c
@@ -8,17 +8,17 @@ 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.nextDayTime = 0xFFFF;
+ gSaveContext.chamberCutsceneNum = 0;
+ gSaveContext.nextDayTime = NEXT_TIME_NONE;
gSaveContext.skyboxTime = 0;
gSaveContext.dogIsLost = true;
gSaveContext.nextTransitionType = TRANS_NEXT_TYPE_DEFAULT;
gSaveContext.prevHudVisibility = HUD_VISIBILITY_ALL;
- gSaveContext.options.language = 1;
- gSaveContext.options.audioSetting = 0;
+ gSaveContext.options.language = LANGUAGE_ENG;
+ gSaveContext.options.audioSetting = SAVE_AUDIO_STEREO;
gSaveContext.options.zTargetSetting = 0;
}
diff --git a/src/code/z_debug.c b/src/code/z_debug.c
index 46649a4ce..058d896a4 100644
--- a/src/code/z_debug.c
+++ b/src/code/z_debug.c
@@ -1,20 +1,21 @@
-#include "global.h"
+#include "regs.h"
#include "system_malloc.h"
+#include "macros.h"
-GameInfo* gGameInfo;
+RegEditor* gRegEditor;
-void GameInfo_Init(void) {
+void Regs_Init(void) {
s32 i;
- gGameInfo = SystemArena_Malloc(sizeof(GameInfo));
+ gRegEditor = SystemArena_Malloc(sizeof(RegEditor));
if (1) {}
- gGameInfo->unk_00 = 0;
- gGameInfo->unk_01 = 0;
- gGameInfo->unk_02 = 0;
- gGameInfo->unk_04 = 0;
- gGameInfo->unk_03 = 0;
+ gRegEditor->regPage = 0;
+ gRegEditor->regGroup = 0;
+ gRegEditor->regCur = 0;
+ gRegEditor->inputRepeatTimer = 0;
+ gRegEditor->dPadInputPrev = 0;
- for (i = 0; i < ARRAY_COUNT(gGameInfo->data); i++) {
- gGameInfo->data[i] = 0;
+ for (i = 0; i < ARRAY_COUNT(gRegEditor->data); i++) {
+ gRegEditor->data[i] = 0;
}
}
diff --git a/src/code/z_debug_display.c b/src/code/z_debug_display.c
index f98b8636e..9dd4d86b2 100644
--- a/src/code/z_debug_display.c
+++ b/src/code/z_debug_display.c
@@ -1,13 +1,14 @@
+#include "z64debug_display.h"
#include "global.h"
DebugDispObject* sDebugObjectListHead;
typedef struct {
- /* 0x00 */ s16 drawType; // indicates which draw function to use when displaying the object
- /* 0x04 */ void* drawArg; // segment address (display list or texture) passed to the draw funciton when called
-} DebugDispObjectInfo; // size = 0x8
+ /* 0x0 */ s16 drawType; // indicates which draw function to use when displaying the object
+ /* 0x4 */ void* drawArg; // segment address (display list or texture) passed to the draw funciton when called
+} DebugDispObjectInfo; // size = 0x8
-typedef void (*DebugDispObject_DrawFunc)(DebugDispObject*, void*, PlayState*);
+typedef void (*DebugDispObjectDrawFunc)(DebugDispObject*, void*, PlayState*);
void DebugDisplay_DrawSpriteI8(DebugDispObject*, void*, PlayState*);
void DebugDisplay_DrawPolygon(DebugDispObject*, void*, PlayState*);
@@ -44,12 +45,12 @@ DebugDispObject* DebugDisplay_AddObject(f32 posX, f32 posY, f32 posZ, s16 rotX,
#include "code/debug_display/debug_display.c"
-DebugDispObject_DrawFunc sDebugObjectDrawFuncTable[] = { DebugDisplay_DrawSpriteI8, DebugDisplay_DrawPolygon };
+DebugDispObjectDrawFunc sDebugObjectDrawFuncTable[] = { DebugDisplay_DrawSpriteI8, DebugDisplay_DrawPolygon };
DebugDispObjectInfo sDebugObjectInfoTable[] = {
{ 0, sDebugDisplayCircleTex }, { 0, sDebugDisplayCrossTex }, { 0, sDebugDisplayBallTex },
- { 0, sDebugDisplayCursorTex }, { 1, &sDebugDisplay1DL }, { 1, &sDebugDisplay3DL },
- { 1, &sDebugDisplay2DL },
+ { 0, sDebugDisplayCursorTex }, { 1, sDebugDisplay1DL }, { 1, sDebugDisplay3DL },
+ { 1, sDebugDisplay2DL },
};
void DebugDisplay_DrawObjects(PlayState* play) {
@@ -66,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);
@@ -86,10 +87,10 @@ void DebugDisplay_DrawSpriteI8(DebugDispObject* dispObj, void* texture, PlayStat
Lights1 sDebugDisplayLight1 = gdSPDefLights1(128, 128, 128, 255, 255, 255, 73, 73, 73);
-void DebugDisplay_DrawPolygon(DebugDispObject* dispObj, void* arg1, PlayState* play) {
+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);
@@ -99,7 +100,7 @@ void DebugDisplay_DrawPolygon(DebugDispObject* dispObj, void* arg1, PlayState* p
Matrix_Scale(dispObj->scale.x, dispObj->scale.y, dispObj->scale.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++, arg1);
+ gSPDisplayList(POLY_XLU_DISP++, dList);
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -112,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_debug_mode.c b/src/code/z_debug_mode.c
index 0682b3693..a40bd29bd 100644
--- a/src/code/z_debug_mode.c
+++ b/src/code/z_debug_mode.c
@@ -1,13 +1,160 @@
+#include "z64debug_text.h"
#include "global.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_debug_mode/func_800E9C90.s")
+typedef struct {
+ /* 0x0 */ u8 colorIndex;
+ /* 0x1 */ char text[11];
+} DebugTextBufferEntry; // size = 0xC
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_debug_mode/func_800E9CA0.s")
+typedef struct {
+ /* 0x0 */ u8 x;
+ /* 0x1 */ u8 y;
+ /* 0x2 */ u8 colorIndex;
+ /* 0x3 */ char text[41];
+} DebugCamTextBufferEntry; // size = 0x2C
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_debug_mode/func_800E9CFC.s")
+#define DEBUG_TEXT_DRAW_TEXT (1 << 0)
+#define DEBUG_TEXT_DRAW_CAM_TEXT (1 << 1)
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_debug_mode/func_800E9DBC.s")
+s32 sDebugTextDrawFlags = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_debug_mode/func_800E9E94.s")
+DebugTextBufferEntry sDebugTextBuffer[] = {
+ { DEBUG_TEXT_BLACK, " " }, { DEBUG_TEXT_BLACK, " " }, { DEBUG_TEXT_BLACK, " " },
+ { DEBUG_TEXT_BLACK, " " }, { DEBUG_TEXT_BLACK, " " }, { DEBUG_TEXT_BLACK, " " },
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_debug_mode/func_800E9F78.s")
+Color_RGBA8 sDebugTextColors[] = {
+ { 0, 0, 0, 64 }, // DEBUG_TEXT_BLACK
+ { 0, 0, 255, 64 }, // DEBUG_TEXT_BLUE
+ { 255, 0, 0, 64 }, // DEBUG_TEXT_RED
+ { 255, 0, 255, 64 }, // DEBUG_TEXT_PURPLE
+ { 0, 255, 0, 64 }, // DEBUG_TEXT_GREEN
+ { 0, 255, 255, 64 }, // DEBUG_TEXT_CYAN
+ { 255, 255, 0, 64 }, // DEBUG_TEXT_YELLOW
+ { 255, 255, 255, 64 }, // DEBUG_TEXT_WHITE
+};
+
+DebugCamTextBufferEntry sDebugCamTextBuffer[80];
+
+s16 sDebugCamTextEntryCount = 0;
+
+Color_RGBA8 sDebugCamTextColors[] = {
+ { 255, 255, 32, 192 }, // DEBUG_CAM_TEXT_YELLOW
+ { 255, 150, 128, 192 }, // DEBUG_CAM_TEXT_PEACH
+ { 128, 96, 0, 64 }, // DEBUG_CAM_TEXT_BROWN
+ { 192, 128, 16, 128 }, // DEBUG_CAM_TEXT_ORANGE
+ { 255, 192, 32, 128 }, // DEBUG_CAM_TEXT_GOLD
+ { 230, 230, 220, 64 }, // DEBUG_CAM_TEXT_WHITE
+ { 128, 150, 255, 128 }, // DEBUG_CAM_TEXT_BLUE
+ { 128, 255, 32, 128 }, // DEBUG_CAM_TEXT_GREEN
+};
+
+void Debug_ClearTextDrawFlags(void) {
+ sDebugTextDrawFlags = 0;
+}
+
+void Debug_ScreenText(s32 index, s32 colorIndex, const char* text) {
+ DebugTextBufferEntry* entry = &sDebugTextBuffer[index];
+ char* textDest = entry->text;
+
+ sDebugTextDrawFlags |= DEBUG_TEXT_DRAW_TEXT;
+ entry->colorIndex = colorIndex;
+
+ do {
+ *textDest++ = *text;
+ } while (*text++ != '\0');
+}
+
+void Debug_DrawScreenText(GfxPrint* printer) {
+ DebugTextBufferEntry* entry;
+ Color_RGBA8* color;
+ s32 y;
+
+ entry = sDebugTextBuffer;
+ for (y = 20; y < 20 + ARRAY_COUNT(sDebugTextBuffer); y++) {
+ GfxPrint_SetPos(printer, 26, y);
+ color = &sDebugTextColors[entry->colorIndex];
+ GfxPrint_SetColor(printer, color->r, color->g, color->b, color->a);
+ GfxPrint_Printf(printer, "%s", entry->text);
+ *entry->text = '\0';
+ entry++;
+ }
+}
+
+void DebugCamera_ScreenText(u8 x, u8 y, u8 colorIndex, const char* text) {
+ DebugCamTextBufferEntry* entry = &sDebugCamTextBuffer[sDebugCamTextEntryCount];
+ char* textDest;
+ s16 charCount;
+
+ sDebugTextDrawFlags |= DEBUG_TEXT_DRAW_CAM_TEXT;
+ if (sDebugCamTextEntryCount < ARRAY_COUNT(sDebugCamTextBuffer)) {
+ entry->x = x;
+ entry->y = y;
+ entry->colorIndex = colorIndex;
+
+ // Copy text into the entry, truncating if needed
+ charCount = 0;
+ textDest = entry->text;
+
+ while ((*textDest++ = *text++) != '\0') {
+ if (charCount++ >= ARRAY_COUNT(entry->text)) {
+ break;
+ }
+ }
+
+ *textDest = '\0';
+
+ sDebugCamTextEntryCount++;
+ }
+}
+
+void DebugCamera_DrawScreenText(GfxPrint* printer) {
+ DebugCamTextBufferEntry* entry;
+ Color_RGBA8* color;
+ s32 i;
+
+ for (i = 0; i < sDebugCamTextEntryCount; i++) {
+ entry = &sDebugCamTextBuffer[i];
+ color = &sDebugCamTextColors[entry->colorIndex];
+
+ GfxPrint_SetColor(printer, color->r, color->g, color->b, color->a);
+ GfxPrint_SetPos(printer, entry->x, entry->y);
+ GfxPrint_Printf(printer, "%s", entry->text);
+ }
+}
+
+void Debug_DrawText(GraphicsContext* gfxCtx) {
+ Gfx* gfx;
+ Gfx* gfxHead;
+ GfxPrint printer;
+
+ if (THGA_GetRemaining(&gfxCtx->polyOpa) >= 0x2800) {
+ GfxPrint_Init(&printer);
+
+ OPEN_DISPS(gfxCtx);
+
+ gfxHead = POLY_OPA_DISP;
+ gfx = Graph_GfxPlusOne(gfxHead);
+ gSPDisplayList(DEBUG_DISP++, gfx);
+
+ GfxPrint_Open(&printer, gfx);
+
+ if (sDebugTextDrawFlags & DEBUG_TEXT_DRAW_CAM_TEXT) {
+ DebugCamera_DrawScreenText(&printer);
+ }
+ sDebugCamTextEntryCount = 0;
+
+ if (sDebugTextDrawFlags & DEBUG_TEXT_DRAW_TEXT) {
+ Debug_DrawScreenText(&printer);
+ }
+
+ gfx = GfxPrint_Close(&printer);
+ gSPEndDisplayList(gfx++);
+ Graph_BranchDlist(gfxHead, gfx);
+ POLY_OPA_DISP = gfx;
+
+ CLOSE_DISPS(gfxCtx);
+
+ GfxPrint_Destroy(&printer);
+ }
+}
diff --git a/src/code/z_demo.c b/src/code/z_demo.c
index 7d0c1ade3..300a3c20f 100644
--- a/src/code/z_demo.c
+++ b/src/code/z_demo.c
@@ -1,330 +1,374 @@
+#include "PR/ultratypes.h"
+
+// Variables are put before most headers as a hacky way to bypass bss reordering
+struct CutsceneCamera;
+
+s16 sCutsceneQuakeIndex;
+struct CutsceneCamera sCutsceneCameraInfo;
+u16 sCueTypeList[10];
+u8 D_801F4DDC;
+static s16 sBssPad;
+u8 gDisablePlayerCsModeStartPos;
+s16 gDungeonBossWarpSceneId;
+
#include "prevent_bss_reordering.h"
+#include "prevent_bss_reordering2.h"
+// clang-format off
+// Partial structs taken from "prevent_bss_reordering.h"
+struct Dummy200 { int x; };
+struct Dummy201 { int x; };
+struct Dummy202 { int x; };
+// clang-format on
+
#include "global.h"
#include "z64quake.h"
#include "z64rumble.h"
#include "z64shrink_window.h"
#include "overlays/gamestates/ovl_daytelop/z_daytelop.h"
+#include "overlays/actors/ovl_En_Elf/z_en_elf.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;
+static s32 sPad = 0;
+u16 sCurTextId = 0;
+u16 sCurOcarinaAction = 0;
+u8 gOpeningEntranceIndex = 0;
u8 sCutsceneStoredPlayerForm = 0;
-// bss
-#ifndef NON_MATCHING
-static u16 seqId;
-#endif
-s16 sCutsceneQuakeIndex;
-DbCameraUnkStruct sCutsceneCameraInfo;
-u16 D_801F4DC8[10];
-UNK_TYPE D_801F4DDC;
-u8 D_801F4DE0;
-s16 D_801F4DE2;
-
-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 = false;
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) {
- func_800FD78C(play);
- play->envCtx.unk_F2[0] = 0x3C;
+ switch (cmd->type) {
+ case CS_MISC_RAIN:
+ if (isFirstFrame) {
+ Environment_PlayStormNatureAmbience(play);
+ play->envCtx.precipitation[PRECIP_RAIN_MAX] = 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;
+ gLightningStrike.state = LIGHTNING_STRIKE_START;
}
break;
- case 0x3:
- if (play->envCtx.lightSettings.zFar < 12800) {
- play->envCtx.lightSettings.zFar += 35;
+
+ case CS_MISC_LIFT_FOG:
+ if (play->envCtx.adjLightSettings.zFar < 12800) {
+ play->envCtx.adjLightSettings.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 = CHANGE_SKYBOX_REQUESTED;
+ 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);
+ Message_DisplaySceneTitleCard(play, loadedScene->titleTextId);
}
}
break;
- case 0x8:
- func_8019F128(NA_SE_EV_EARTHQUAKE_LAST - SFX_FLAG);
- if (isStartFrame) {
- sCutsceneQuakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_6);
+
+ case CS_MISC_EARTHQUAKE_MEDIUM:
+ Audio_PlaySfx_2(NA_SE_EV_EARTHQUAKE_LAST - SFX_FLAG);
+ 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;
- play->envCtx.lightSettings.diffuseColor1[1] -= 3;
- play->envCtx.lightSettings.diffuseColor1[2] -= 3;
+ if (play->envCtx.adjLightSettings.ambientColor[0] < 40) {
+ play->envCtx.adjLightSettings.ambientColor[0] += 2;
+ play->envCtx.adjLightSettings.light1Color[1] -= 3;
+ play->envCtx.adjLightSettings.light1Color[2] -= 3;
}
} else {
- if (play->envCtx.lightSettings.ambientColor[0] > 2) {
- play->envCtx.lightSettings.ambientColor[0] -= 2;
- play->envCtx.lightSettings.diffuseColor1[1] += 3;
- play->envCtx.lightSettings.diffuseColor1[2] += 3;
+ if (play->envCtx.adjLightSettings.ambientColor[0] > 2) {
+ play->envCtx.adjLightSettings.ambientColor[0] -= 2;
+ play->envCtx.adjLightSettings.light1Color[1] += 3;
+ play->envCtx.adjLightSettings.light1Color[2] += 3;
}
}
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) {
- play->envCtx.sandstormState = 1;
+
+ case CS_MISC_SANDSTORM_FILL:
+ if (isFirstFrame) {
+ play->envCtx.sandstormState = SANDSTORM_FILL;
}
- func_8019F128(NA_SE_EV_SAND_STORM - SFX_FLAG);
+ Audio_PlaySfx_2(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:
- sCutsceneStoredPlayerForm = gSaveContext.save.playerForm;
+
+ case CS_MISC_PLAYER_FORM_HUMAN:
+ sCutsceneStoredPlayerForm = GET_PLAYER_FORM;
gSaveContext.save.playerForm = PLAYER_FORM_HUMAN;
gSaveContext.save.equippedMask = PLAYER_MASK_NONE;
break;
- case 0x1A:
- func_8019F128(NA_SE_EV_EARTHQUAKE_LAST2 - SFX_FLAG);
- if (isStartFrame) {
- sCutsceneQuakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_6);
+
+ case CS_MISC_EARTHQUAKE_STRONG:
+ Audio_PlaySfx_2(NA_SE_EV_EARTHQUAKE_LAST2 - SFX_FLAG);
+ 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;
@@ -333,20 +377,19 @@ void Cutscene_Command_Misc(PlayState* play, CutsceneContext* csCtx, CsCmdBase* c
}
}
break;
- case 0x24:
- func_8019F128(NA_SE_EV_EARTHQUAKE_LAST - SFX_FLAG);
- if (isStartFrame) {
- sCutsceneQuakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_6);
+
+ case CS_MISC_EARTHQUAKE_WEAK:
+ Audio_PlaySfx_2(NA_SE_EV_EARTHQUAKE_LAST - SFX_FLAG);
+ 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));
@@ -354,181 +397,165 @@ 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;
+ play->envCtx.lightSettingOverride = LIGHT_SETTING_OVERRIDE_NONE;
}
}
}
-// 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) {
- Audio_QueueSeqCmd((fadeTimer << 0x10) | 0x110000FF);
- } else {
- Audio_QueueSeqCmd((fadeTimer << 0x10) | NA_BGM_STOP);
+ 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) {
- // Audio_SetSfxReverbIndexExceptOcarinaBank
- func_801A4428(2);
+void Cutscene_SetSfxReverbIndexTo2(PlayState* play, CutsceneContext* csCtx, CsCmdSfxReverbIndexTo2* cmd) {
+ if (csCtx->curFrame == cmd->startFrame) {
+ Audio_SetSfxReverbIndexExceptOcarinaBank(2);
}
}
-// Command 0x131:
-void func_800EAD7C(PlayState* play, CutsceneContext* csCtx, CsCmdBase* cmd) {
- if (csCtx->frames == cmd->startFrame) {
- // Audio_SetSfxReverbIndexExceptOcarinaBank
- func_801A4428(1);
+void Cutscene_SetSfxReverbIndexTo1(PlayState* play, CutsceneContext* csCtx, CsCmdSfxReverbIndexTo1* cmd) {
+ if (csCtx->curFrame == cmd->startFrame) {
+ Audio_SetSfxReverbIndexExceptOcarinaBank(1);
}
}
-#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 = Audio_GetActiveSequence(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")
-#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;
- Audio_QueueSeqCmd((fadeTimer << 0x10) | 0x140000FF);
+ 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;
@@ -537,43 +564,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 != 0) && (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 != 1) {
+
+ 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;
}
@@ -586,19 +615,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;
@@ -610,8 +638,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;
@@ -623,36 +651,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;
@@ -663,7 +693,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;
@@ -674,7 +704,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;
@@ -685,7 +715,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;
@@ -696,7 +726,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;
@@ -707,7 +737,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;
@@ -718,13 +748,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;
@@ -735,7 +765,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;
@@ -746,7 +776,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;
@@ -756,148 +786,153 @@ 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;
}
- player->tatlActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELF, player->actor.world.pos.x,
- player->actor.world.pos.y, player->actor.world.pos.z, 0, 0, 0, 0);
+ player->tatlActor =
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELF, player->actor.world.pos.x, player->actor.world.pos.y,
+ player->actor.world.pos.z, 0, 0, 0, FAIRY_PARAMS(FAIRY_TYPE_0, false, 0));
}
}
}
-// 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) {
- func_8019F128(NA_SE_EV_S_STONE_FLASH);
+
+ if (cmd->type == CS_TRANS_GRAY_FILL_IN) {
+ play->envCtx.screenFillColor[3] = 255.0f * lerp;
+ if (lerp == 0.0f) {
+ Audio_PlaySfx_2(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);
}
/**
@@ -971,144 +1006,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) {
- func_80151938(play, cmd->textId1);
- if (cmd->type == CS_TEXTBOX_TYPE_3) {
- D_801BB160 = CS_TEXTBOX_TYPE_3;
- if (cmd->textId2 != 0xFFFF) {
- csCtx->frames++;
- }
- }
- } else {
- func_801477B4(play);
- csCtx->frames++;
- }
- } else {
- if (cmd->base == 0x33BD) {
- func_8019F208();
- }
-
- if (cmd->textId2 != 0xFFFF) {
- func_80151938(play, cmd->textId2);
- if (cmd->type == CS_TEXTBOX_TYPE_3) {
- D_801BB160 = CS_TEXTBOX_TYPE_3;
- if (cmd->textId1 != 0xFFFF) {
- csCtx->frames++;
- }
- }
- } else {
- func_801477B4(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;
+ Message_DisplayOcarinaStaff(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?
+ Audio_PlaySfx_MessageCancel();
+ }
- 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?
+ Audio_PlaySfx_MessageDecide();
+ }
- 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)) {
+ Message_DisplayOcarinaStaff(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
@@ -1125,15 +1162,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;
@@ -1141,44 +1178,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;
}
}
@@ -1186,203 +1225,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;
}
@@ -1391,118 +1454,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.gameMode = 0;
- ActorCutscene_Stop(0x7F);
+ gSaveContext.save.cutsceneIndex = 0;
+ gSaveContext.gameMode = GAMEMODE_NORMAL;
+
+ 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 == 0) || (gSaveContext.gameMode == 1)) && (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);
+ if (((gSaveContext.gameMode == GAMEMODE_NORMAL) || (gSaveContext.gameMode == GAMEMODE_TITLE_SCREEN)) &&
+ (gSaveContext.respawnFlag <= 0)) {
+ // 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);
+ Message_DisplaySceneTitleCard(play, scene->titleTextId);
}
}
@@ -1516,10 +1586,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 +1601,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 +1634,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 +1660,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 +1690,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 +1726,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..3f1d1dc47 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
@@ -154,7 +154,7 @@ static DrawItemTableEntry sDrawItemTable[] = {
{ GetItem_DrawOpa01, { gGiBremenMaskDL, gGiBremenMaskEmptyDL } },
// GID_MASK_ALL_NIGHT, OBJECT_GI_MASK06
{ GetItem_DrawOpa0Xlu1, { gGiAllNightMaskEyesDL, gGiAllNightMaskFaceDL } },
- // GID_NUTS, OBJECT_GI_NUTS
+ // GID_DEKU_NUTS, OBJECT_GI_NUTS
{ GetItem_DrawDekuNuts, { gGiNutDL } },
// GID_HEART_CONTAINER, OBJECT_GI_HEARTS
{ GetItem_DrawXlu01, { gGiHeartBorderDL, gGiHeartContainerDL } },
@@ -172,13 +172,13 @@ static DrawItemTableEntry sDrawItemTable[] = {
{ GetItem_DrawUpgrades, { gGiBombBagDL, gGiBombBag30BagColorDL, gGiBombBag30RingColorDL, gGiBombBagRingDL } },
// GID_BOMB_BAG_40, OBJECT_GI_BOMBPOUCH
{ GetItem_DrawUpgrades, { gGiBombBagDL, gGiBombBag40BagColorDL, gGiBombBag40RingColorDL, gGiBombBagRingDL } },
- // GID_STICK, OBJECT_GI_STICK
+ // GID_DEKU_STICK, OBJECT_GI_STICK
{ GetItem_DrawOpa0, { gGiStickDL } },
// GID_DUNGEON_MAP, OBJECT_GI_MAP
{ GetItem_DrawOpa0, { gGiDungeonMapDL } },
- // GID_MAGIC_SMALL, OBJECT_GI_MAGICPOT
+ // GID_MAGIC_JAR_SMALL, OBJECT_GI_MAGICPOT
{ GetItem_DrawOpa0, { gGiMagicJarSmallDL } },
- // GID_MAGIC_LARGE, OBJECT_GI_MAGICPOT
+ // GID_MAGIC_JAR_BIG, OBJECT_GI_MAGICPOT
{ GetItem_DrawOpa0, { gGiMagicJarLargeDL } },
// GID_BOMB, OBJECT_GI_BOMB_1
{ GetItem_DrawOpa0, { gGiBombDL } },
@@ -313,7 +313,7 @@ static DrawItemTableEntry sDrawItemTable[] = {
{ GetItem_DrawOpa0Xlu1, { gGiRedPotionBottleEmptyDL, gGiRedPotionBottleDL } },
// GID_ZORA_EGG, OBJECT_GI_BOTTLE_15
{ GetItem_DrawOpa0Xlu1, { gGiZoraEggBottleContentsDL, gGiZoraEggBottleGlassAndCorkDL } },
- // GID_MOON_TEAR, OBJECT_GI_RESERVE00
+ // GID_MOONS_TEAR, OBJECT_GI_RESERVE00
{ GetItem_DrawMoonsTear, { gGiMoonsTearItemDL, gGiMoonsTearGlowDL } },
// GID_DEED_LAND, OBJECT_GI_RESERVE01
{ GetItem_DrawOpa01, { gGiTitleDeedEmptyDL, gGiTitleDeedLandColorDL } },
@@ -344,7 +344,7 @@ static DrawItemTableEntry sDrawItemTable[] = {
// GID_SWORD_GILDED, OBJECT_GI_SWORD_3
{ GetItem_DrawOpa01, { gGiGildedSwordDL, gGiGildedSwordEmptyDL } },
// GID_SWORD_GREAT_FAIRY, OBJECT_GI_SWORD_4
- { GetItem_DrawOpa0Xlu1, { gGiGreatFairySwordBladeDL, gGiGreatFairySwordHiltEmblemDL } },
+ { GetItem_DrawOpa0Xlu1, { gGiGreatFairysSwordBladeDL, gGiGreatFairysSwordHiltEmblemDL } },
// GID_MASK_GARO, OBJECT_GI_MASK09
{ GetItem_DrawOpa0Xlu1, { gGiGarosMaskCloakDL, gGiGarosMaskFaceDL } },
// GID_MASK_GREAT_FAIRY, OBJECT_GI_MASK14
@@ -367,7 +367,7 @@ static DrawItemTableEntry sDrawItemTable[] = {
{ GetItem_DrawOpa01, { gGiGiantMaskEmptyDL, gGiGiantMaskDL } },
// GID_CHATEAU, OBJECT_GI_BOTTLE_21
{ GetItem_DrawOpa0Xlu1, { gGiChateauRomaniBottleEmptyDL, gGiChateauRomaniBottleDL } },
- // GID_PICTO_BOX, OBJECT_GI_CAMERA
+ // GID_PICTOGRAPH_BOX, OBJECT_GI_CAMERA
{ GetItem_DrawOpa0Xlu1, { gGiPictoBoxFrameDL, gGiPictoBoxBodyAndLensDL } },
// GID_MASK_FIERCE_DEITY, OBJECT_GI_MASK03
{ GetItem_DrawOpa01, { gGiFierceDeityMaskFaceDL, gGiFierceDeityMaskHairAndHatDL } },
@@ -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]);
@@ -827,11 +827,11 @@ void GetItem_DrawRemains(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- objectIndex = Object_GetIndex(&play->objectCtx, OBJECT_BSMASK);
+ objectIndex = Object_GetSlot(&play->objectCtx, OBJECT_BSMASK);
- gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[objectIndex].segment);
+ gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[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 1dc3d7237..806cc45e0 100644
--- a/src/code/z_eff_footmark.c
+++ b/src/code/z_eff_footmark.c
@@ -1,14 +1,19 @@
-#include "global.h"
+#include "z64eff_footmark.h"
+#include "z64.h"
+#include "macros.h"
+#include "functions.h"
+
+#include "assets/code/eff_footmark/eff_footmark.c"
void EffFootmark_Init(PlayState* play) {
EffFootmark* footmark;
s32 i;
- for (footmark = play->footprintInfo, i = 0; i < 100; i++, footmark++) {
+ for (footmark = play->footprintInfo, i = 0; i < ARRAY_COUNT(play->footprintInfo); i++, footmark++) {
footmark->actor = NULL;
- footmark->location.x = 0;
- footmark->location.y = 0;
- footmark->location.z = 0;
+ footmark->pos.x = 0;
+ footmark->pos.y = 0;
+ footmark->pos.z = 0;
footmark->flags = 0;
footmark->id = 0;
footmark->alpha = 0;
@@ -16,47 +21,45 @@ void EffFootmark_Init(PlayState* play) {
}
}
-void EffFootmark_Add(PlayState* play, MtxF* displayMatrix, Actor* actor, u8 id, Vec3f* location, u16 size, u8 red,
- u8 green, u8 blue, u16 alpha, u16 alphaChange, u16 fadeoutDelay) {
+void EffFootmark_Add(PlayState* play, MtxF* mf, Actor* actor, u8 id, Vec3f* pos, u16 size, u8 red, u8 green, u8 blue,
+ u16 alpha, u16 alphaChange, u16 fadeOutDelay) {
s32 i;
EffFootmark* footmark;
EffFootmark* destination = NULL;
EffFootmark* oldest = NULL;
- s32 isNew = 1;
+ s32 isNew = true;
- for (footmark = play->footprintInfo, i = 0; i < 100; i++, footmark++) {
- if (((actor == footmark->actor) && (footmark->id == id)) && ((footmark->flags & 1) == 0)) {
- if (fabsf((footmark->location).x - location->x) <= 1) {
- if (fabsf((footmark->location).z - location->z) <= 1) {
- isNew = 0;
+ for (footmark = play->footprintInfo, i = 0; i < ARRAY_COUNT(play->footprintInfo); i++, footmark++) {
+ if (((actor == footmark->actor) && (footmark->id == id)) && !(footmark->flags & FOOTMARK_FLAG_1)) {
+ if (fabsf(footmark->pos.x - pos->x) <= 1) {
+ if (fabsf(footmark->pos.z - pos->z) <= 1) {
+ isNew = false;
break;
}
}
- // This footmark is being re-added at a new location. Let's mark this one to start fading out.
- footmark->flags = 1;
+ // This footmark is being re-added at a new pos. Let's mark this one to start fading out.
+ footmark->flags = FOOTMARK_FLAG_1;
}
if (footmark->actor == NULL) {
destination = footmark;
- } else {
- if (destination == NULL) {
- if ((oldest != NULL && footmark->age > oldest->age) || (oldest == NULL)) {
- oldest = footmark;
- }
+ } else if (destination == NULL) {
+ if (((oldest != NULL) && (footmark->age > oldest->age)) || (oldest == NULL)) {
+ oldest = footmark;
}
}
}
- if ((isNew) && ((destination != NULL || (oldest != NULL)))) {
+ if (isNew && ((destination != NULL) || (oldest != NULL))) {
if (destination == NULL) {
destination = oldest;
}
- Matrix_MtxFCopy(&destination->displayMatrix, displayMatrix);
+ Matrix_MtxFCopy(&destination->mf, mf);
destination->actor = actor;
- destination->location.x = location->x;
- destination->location.y = location->y;
- destination->location.z = location->z;
+ destination->pos.x = pos->x;
+ destination->pos.y = pos->y;
+ destination->pos.z = pos->z;
destination->flags = 0;
destination->id = id;
destination->red = red;
@@ -65,7 +68,7 @@ void EffFootmark_Add(PlayState* play, MtxF* displayMatrix, Actor* actor, u8 id,
destination->alpha = alpha;
destination->alphaChange = alphaChange;
destination->size = size;
- destination->fadeoutDelay = fadeoutDelay;
+ destination->fadeOutDelay = fadeOutDelay;
destination->age = 0;
}
}
@@ -74,22 +77,24 @@ void EffFootmark_Update(PlayState* play) {
EffFootmark* footmark;
s32 i;
- for (footmark = play->footprintInfo, i = 0; i < 100; i++, footmark++) {
- if (footmark->actor != NULL) {
- if ((footmark->flags & 1) == 1) {
- if ((u32)footmark->age < UINT16_MAX) {
- footmark->age++;
- }
+ for (footmark = play->footprintInfo, i = 0; i < ARRAY_COUNT(play->footprintInfo); i++, footmark++) {
+ if (footmark->actor == NULL) {
+ continue;
+ }
- if (footmark->fadeoutDelay == 0) {
- if (footmark->alpha >= footmark->alphaChange + 0x1000) {
- footmark->alpha -= footmark->alphaChange;
- } else {
- footmark->actor = NULL;
- }
- } else if (footmark->fadeoutDelay > 0) {
- footmark->fadeoutDelay--;
+ if (CHECK_FLAG_ALL(footmark->flags, FOOTMARK_FLAG_1)) {
+ if ((u32)footmark->age < UINT16_MAX) {
+ footmark->age++;
+ }
+
+ if (footmark->fadeOutDelay == 0) {
+ if (footmark->alpha >= footmark->alphaChange + 0x1000) {
+ footmark->alpha -= footmark->alphaChange;
+ } else {
+ footmark->actor = NULL;
}
+ } else if (footmark->fadeOutDelay > 0) {
+ footmark->fadeOutDelay--;
}
}
}
@@ -100,13 +105,13 @@ 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++, D_801BC240);
+ gSPDisplayList(gfxCtx->polyXlu.p++, gEffFootprintMaterialDL);
- for (footmark = play->footprintInfo, i = 0; i < 100; i++, footmark++) {
+ for (footmark = play->footprintInfo, i = 0; i < ARRAY_COUNT(play->footprintInfo); i++, footmark++) {
if (footmark->actor != NULL) {
- Matrix_Put(&footmark->displayMatrix);
+ Matrix_Put(&footmark->mf);
Matrix_Scale(footmark->size * (1.0f / 0x100) * 0.7f, 1, footmark->size * (1.0f / 0x100), MTXMODE_APPLY);
gSPMatrix(gfxCtx->polyXlu.p++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD);
@@ -114,7 +119,7 @@ void EffFootmark_Draw(PlayState* play) {
gDPSetPrimColor(gfxCtx->polyXlu.p++, 0, 0, footmark->red, footmark->green, footmark->blue,
footmark->alpha >> 8);
- gSPDisplayList(gfxCtx->polyXlu.p++, D_801BC288);
+ gSPDisplayList(gfxCtx->polyXlu.p++, gEffFootprintModelDL);
}
}
}
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..55c15714e 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;
}
@@ -80,7 +80,8 @@ void func_800AE930(CollisionContext* colCtx, EffectTireMark* this, Vec3f* pos, f
spAC->flags |= 1;
}
- if (spA8) {} // Necessary to match
+ //! FAKE:
+ if (spA8) {}
spA8 = &this->elements[this->numElements];
spA8->flags = 0;
@@ -231,7 +232,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 ea8a546d6..08aa845ab 100644
--- a/src/code/z_effect_soft_sprite.c
+++ b/src/code/z_effect_soft_sprite.c
@@ -1,5 +1,5 @@
#include "global.h"
-#include "z64load.h"
+#include "loadfragment.h"
EffectSsInfo sEffectSsInfo = { NULL, 0, 0 };
@@ -8,7 +8,7 @@ void EffectSS_Init(PlayState* play, s32 numEntries) {
EffectSs* effectsSs;
EffectSsOverlay* overlay;
- sEffectSsInfo.data_table = (EffectSs*)THA_AllocEndAlign16(&play->state.heap, numEntries * sizeof(EffectSs));
+ sEffectSsInfo.data_table = (EffectSs*)THA_AllocTailAlign16(&play->state.tha, numEntries * sizeof(EffectSs));
sEffectSsInfo.searchIndex = 0;
sEffectSsInfo.size = numEntries;
@@ -164,7 +164,7 @@ void EffectSS_Copy(PlayState* play, EffectSs* effectsSs) {
void EffectSs_Spawn(PlayState* play, s32 type, s32 priority, void* initData) {
s32 index;
u32 overlaySize;
- EffectSsOverlay* entry = &gParticleOverlayTable[type];
+ EffectSsOverlay* overlayEntry = &gParticleOverlayTable[type];
EffectSsInit* initInfo;
if (EffectSS_FindFreeSpace(priority, &index) != 0) {
@@ -173,24 +173,27 @@ void EffectSs_Spawn(PlayState* play, s32 type, s32 priority, void* initData) {
}
sEffectSsInfo.searchIndex = index + 1;
- overlaySize = VRAM_PTR_SIZE(entry);
+ overlaySize = (uintptr_t)overlayEntry->vramEnd - (uintptr_t)overlayEntry->vramStart;
- if (entry->vramStart == NULL) {
- initInfo = entry->initInfo;
+ if (overlayEntry->vramStart == NULL) {
+ initInfo = overlayEntry->initInfo;
} else {
- if (entry->loadedRamAddr == NULL) {
- entry->loadedRamAddr = ZeldaArena_MallocR(overlaySize);
+ if (overlayEntry->loadedRamAddr == NULL) {
+ overlayEntry->loadedRamAddr = ZeldaArena_MallocR(overlaySize);
- if (entry->loadedRamAddr == NULL) {
+ if (overlayEntry->loadedRamAddr == NULL) {
return;
}
- Load2_LoadOverlay(entry->vromStart, entry->vromEnd, entry->vramStart, entry->vramEnd, entry->loadedRamAddr);
+ Overlay_Load(overlayEntry->vromStart, overlayEntry->vromEnd, overlayEntry->vramStart, overlayEntry->vramEnd,
+ overlayEntry->loadedRamAddr);
}
- initInfo = (uintptr_t)((entry->initInfo != NULL)
- ? (void*)((uintptr_t)entry->initInfo - (intptr_t)OVERLAY_RELOCATION_OFFSET(entry))
- : NULL);
+ initInfo = (void*)(uintptr_t)((overlayEntry->initInfo != NULL)
+ ? (void*)((uintptr_t)overlayEntry->initInfo -
+ (intptr_t)((uintptr_t)overlayEntry->vramStart -
+ (uintptr_t)overlayEntry->loadedRamAddr))
+ : NULL);
}
if (initInfo->init != NULL) {
@@ -273,6 +276,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_dlftbls.c b/src/code/z_effect_soft_sprite_dlftbls.c
index e215cdee9..fff77feff 100644
--- a/src/code/z_effect_soft_sprite_dlftbls.c
+++ b/src/code/z_effect_soft_sprite_dlftbls.c
@@ -1,56 +1,34 @@
-#include "global.h"
-#include "initvars.h"
+#include "z64effect.h"
+#include "segment_symbols.h"
-#define EFFECT_SS_OVERLAY(name) \
- { \
- SEGMENT_ROM_START(ovl_##name), SEGMENT_ROM_END(ovl_##name), SEGMENT_START(ovl_##name), \
- SEGMENT_END(ovl_##name), NULL, &name##_InitVars, 1, \
- }
+// Init Vars and linker symbol declarations (used in the table below)
+#define DEFINE_EFFECT_SS(name, _enumValue) \
+ extern EffectSsInit name##_InitVars; \
+ DECLARE_OVERLAY_SEGMENT(name)
-#define EFFECT_SS_OVERLAY_INTERNAL(name) \
- { 0, 0, NULL, NULL, NULL, &name##_InitVars, 1 }
+#define DEFINE_EFFECT_SS_UNSET(_enumValue)
-#define EFFECT_SS_OVERLAY_UNSET \
- { 0 }
+#include "tables/effect_ss_table.h"
+
+#undef DEFINE_EFFECT_SS
+#undef DEFINE_EFFECT_SS_UNSET
+
+#define DEFINE_EFFECT_SS(name, _enumValue) \
+ { \
+ SEGMENT_ROM_START(ovl_##name), \
+ SEGMENT_ROM_END(ovl_##name), \
+ SEGMENT_START(ovl_##name), \
+ SEGMENT_END(ovl_##name), \
+ NULL, \
+ &name##_InitVars, \
+ 1, \
+ },
+
+#define DEFINE_EFFECT_SS_UNSET(_enumValue) { 0 },
EffectSsOverlay gParticleOverlayTable[] = {
- EFFECT_SS_OVERLAY(Effect_Ss_Dust),
- EFFECT_SS_OVERLAY(Effect_Ss_Kirakira),
- EFFECT_SS_OVERLAY_UNSET,
- EFFECT_SS_OVERLAY(Effect_Ss_Bomb2),
- EFFECT_SS_OVERLAY(Effect_Ss_Blast),
- EFFECT_SS_OVERLAY(Effect_Ss_G_Spk),
- EFFECT_SS_OVERLAY(Effect_Ss_D_Fire),
- EFFECT_SS_OVERLAY(Effect_Ss_Bubble),
- EFFECT_SS_OVERLAY_UNSET,
- EFFECT_SS_OVERLAY(Effect_Ss_G_Ripple),
- EFFECT_SS_OVERLAY(Effect_Ss_G_Splash),
- EFFECT_SS_OVERLAY_UNSET,
- EFFECT_SS_OVERLAY(Effect_Ss_G_Fire),
- EFFECT_SS_OVERLAY(Effect_Ss_Lightning),
- EFFECT_SS_OVERLAY(Effect_Ss_Dt_Bubble),
- EFFECT_SS_OVERLAY(Effect_Ss_Hahen),
- EFFECT_SS_OVERLAY(Effect_Ss_Stick),
- EFFECT_SS_OVERLAY(Effect_Ss_Sibuki),
- EFFECT_SS_OVERLAY_UNSET,
- EFFECT_SS_OVERLAY_UNSET,
- EFFECT_SS_OVERLAY(Effect_Ss_Stone1),
- EFFECT_SS_OVERLAY(Effect_Ss_Hitmark),
- EFFECT_SS_OVERLAY(Effect_Ss_Fhg_Flash),
- EFFECT_SS_OVERLAY(Effect_Ss_K_Fire),
- EFFECT_SS_OVERLAY(Effect_Ss_Solder_Srch_Ball),
- EFFECT_SS_OVERLAY(Effect_Ss_Kakera),
- EFFECT_SS_OVERLAY(Effect_Ss_Ice_Piece),
- EFFECT_SS_OVERLAY(Effect_Ss_En_Ice),
- EFFECT_SS_OVERLAY(Effect_Ss_Fire_Tail),
- EFFECT_SS_OVERLAY(Effect_Ss_En_Fire),
- EFFECT_SS_OVERLAY(Effect_Ss_Extra),
- EFFECT_SS_OVERLAY_UNSET,
- EFFECT_SS_OVERLAY(Effect_Ss_Dead_Db),
- EFFECT_SS_OVERLAY(Effect_Ss_Dead_Dd),
- EFFECT_SS_OVERLAY(Effect_Ss_Dead_Ds),
- EFFECT_SS_OVERLAY_UNSET,
- EFFECT_SS_OVERLAY(Effect_Ss_Ice_Smoke),
- EFFECT_SS_OVERLAY(Effect_En_Ice_Block),
- EFFECT_SS_OVERLAY(Effect_Ss_Sbn),
+#include "tables/effect_ss_table.h"
};
+
+#undef DEFINE_EFFECT_SS
+#undef DEFINE_EFFECT_SS_UNSET
diff --git a/src/code/z_effect_soft_sprite_old_init.c b/src/code/z_effect_soft_sprite_old_init.c
index 4f24651d1..d71a18674 100644
--- a/src/code/z_effect_soft_sprite_old_init.c
+++ b/src/code/z_effect_soft_sprite_old_init.c
@@ -41,7 +41,7 @@ void EffectSs_DrawGEffect(PlayState* play, EffectSs* this, TexturePtr texture) {
MtxF mfTrans11DA0;
s32 pad1;
Mtx* mtx;
- void* object = play->objectCtx.status[this->rgObjBankIndex].segment;
+ void* object = play->objectCtx.slots[this->rgObjBankIndex].segment;
OPEN_DISPS(gfxCtx);
@@ -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);
@@ -805,7 +805,7 @@ void EffectSsEnIce_SpawnFlying(PlayState* play, Actor* actor, Vec3f* pos, Color_
initParams.scale = scale;
if (actor != NULL) {
- Actor_PlaySfxAtPos(actor, NA_SE_PL_FREEZE_S);
+ Actor_PlaySfx(actor, NA_SE_PL_FREEZE_S);
}
EffectSs_Spawn(play, EFFECT_SS_EN_ICE, 80, &initParams);
@@ -897,7 +897,7 @@ void EffectSsEnFire_SpawnVec3f(PlayState* play, Actor* actor, Vec3f* pos, s16 sc
initParams.bodyPart = bodyPart;
if (actor != NULL) {
- Actor_PlaySfxAtPos(actor, NA_SE_EV_FLAME_IGNITION);
+ Actor_PlaySfx(actor, NA_SE_EV_FLAME_IGNITION);
}
EffectSs_Spawn(play, EFFECT_SS_EN_FIRE, 128, &initParams);
@@ -917,7 +917,7 @@ void EffectSsEnFire_SpawnVec3s(PlayState* play, Actor* actor, Vec3s* pos, s16 sc
initParams.bodyPart = bodyPart;
if (actor != NULL) {
- Actor_PlaySfxAtPos(actor, NA_SE_EV_FLAME_IGNITION);
+ Actor_PlaySfx(actor, NA_SE_EV_FLAME_IGNITION);
}
EffectSs_Spawn(play, EFFECT_SS_EN_FIRE, 128, &initParams);
@@ -925,14 +925,14 @@ void EffectSsEnFire_SpawnVec3s(PlayState* play, Actor* actor, Vec3s* pos, s16 sc
// EffectSsExtra Spawn Functions
-void EffectSsExtra_Spawn(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* accel, s16 scale, s16 scoreIdx) {
+void EffectSsExtra_Spawn(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* accel, s16 scale, s16 scoreIndex) {
EffectSsExtraInitParams initParams;
Math_Vec3f_Copy(&initParams.pos, pos);
Math_Vec3f_Copy(&initParams.velocity, velocity);
Math_Vec3f_Copy(&initParams.accel, accel);
initParams.scale = scale;
- initParams.scoreIdx = scoreIdx;
+ initParams.scoreIndex = scoreIndex;
EffectSs_Spawn(play, EFFECT_SS_EXTRA, 100, &initParams);
}
diff --git a/src/code/z_elf_message.c b/src/code/z_elf_message.c
index 830824024..a7e97c3bd 100644
--- a/src/code/z_elf_message.c
+++ b/src/code/z_elf_message.c
@@ -13,7 +13,7 @@
* Gets the relevant text ID for Tatl hints in first cycle.
*/
u16 QuestHint_GetTatlTextId(PlayState* play) {
- if (INV_CONTENT(ITEM_OCARINA) == ITEM_OCARINA) {
+ if (INV_CONTENT(ITEM_OCARINA_OF_TIME) == ITEM_OCARINA_OF_TIME) {
return 0;
}
@@ -26,7 +26,7 @@ u16 QuestHint_GetTatlTextId(PlayState* play) {
}
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_79_10)) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_08_40)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLOCK_TOWER_OPENED)) {
return 0;
}
@@ -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;
}
@@ -57,7 +57,7 @@ u16 QuestHint_GetTatlTextId(PlayState* play) {
return 0;
}
- if (INV_CONTENT(ITEM_MOON_TEAR) == ITEM_MOON_TEAR) {
+ if (INV_CONTENT(ITEM_MOONS_TEAR) == ITEM_MOONS_TEAR) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_86_04)) {
return 0x242;
}
diff --git a/src/code/z_en_a_keep.c b/src/code/z_en_a_keep.c
index a9bd49f6f..1fa4d4cf2 100644
--- a/src/code/z_en_a_keep.c
+++ b/src/code/z_en_a_keep.c
@@ -1,7 +1,7 @@
#include "global.h"
#include "assets/objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnAObj*)thisx)
@@ -46,7 +46,7 @@ static ColliderCylinderInit sCylinderInit = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_U8(targetMode, 0, ICHAIN_STOP),
+ ICHAIN_U8(targetMode, TARGET_MODE_0, ICHAIN_STOP),
};
void EnAObj_Init(Actor* thisx, PlayState* play) {
@@ -77,7 +77,7 @@ void EnAObj_Idle(EnAObj* this, PlayState* play) {
yawDiff = ABS_ALT((s16)(this->actor.yawTowardsPlayer - this->actor.shape.rot.y));
if ((yawDiff < 0x2800) || ((this->actor.params == AOBJ_SIGNPOST_ARROW) && (yawDiff > 0x5800))) {
- func_800B863C(&this->actor, play);
+ Actor_OfferTalkNearColChkInfoCylinder(&this->actor, play);
}
}
}
diff --git a/src/code/z_en_hy_code.c b/src/code/z_en_hy_code.c
index 01ec9eca3..d64308bff 100644
--- a/src/code/z_en_hy_code.c
+++ b/src/code/z_en_hy_code.c
@@ -11,51 +11,100 @@
#include "objects/object_boj/object_boj.h"
#include "objects/object_os_anime/object_os_anime.h"
-static AnimationInfoS sAnimationInfo[] = {
- { &gMamamuYanUnusedIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_boj_Anim_001494, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_boj_Anim_001494, 1.0f, 0, -1, ANIMMODE_LOOP, -8 },
- { &object_boj_Anim_001908, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_boj_Anim_001908, 1.0f, 0, -1, ANIMMODE_LOOP, -8 },
- { &object_boj_Anim_0008C0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &gBbaIdleHoldingBagAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_bji_Anim_000FDC, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_bji_Anim_000AB0, 1.0f, 0, -1, ANIMMODE_LOOP, -8 },
- { &object_bji_Anim_00066C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_boj_Anim_00071C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_os_anime_Anim_001EE0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_boj_Anim_00DED8, 1.5f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_boj_Anim_00F920, 1.5f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_boj_Anim_00FC1C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_boj_Anim_00FEE4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_boj_Anim_010330, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_boj_Anim_00FC1C, 1.0f, 0, -1, ANIMMODE_LOOP, -8 },
- { &object_boj_Anim_00FEE4, 1.0f, 0, -1, ANIMMODE_LOOP, -8 },
- { &object_boj_Anim_010330, 1.0f, 0, -1, ANIMMODE_LOOP, -8 },
- { &object_boj_Anim_005D9C, 1.0f, 0, -1, ANIMMODE_LOOP, -8 },
+static AnimationInfoS sAnimationInfo[ENHY_ANIM_MAX] = {
+ { &gMamamuYanUnusedIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENHY_ANIM_AOB_0
+ { &object_boj_Anim_001494, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENHY_ANIM_BOJ_1
+ { &object_boj_Anim_001494, 1.0f, 0, -1, ANIMMODE_LOOP, -8 }, // ENHY_ANIM_BOJ_2
+ { &object_boj_Anim_001908, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENHY_ANIM_BOJ_3
+ { &object_boj_Anim_001908, 1.0f, 0, -1, ANIMMODE_LOOP, -8 }, // ENHY_ANIM_BOJ_4
+ { &object_boj_Anim_0008C0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENHY_ANIM_BOJ_5
+ { &gBbaIdleHoldingBagAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENHY_ANIM_BBA_6
+ { &object_bji_Anim_000FDC, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENHY_ANIM_BJI_7
+ { &object_bji_Anim_000AB0, 1.0f, 0, -1, ANIMMODE_LOOP, -8 }, // ENHY_ANIM_BJI_8
+ { &object_bji_Anim_00066C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENHY_ANIM_BJI_9
+ { &object_boj_Anim_00071C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENHY_ANIM_BOJ_10
+ { &object_os_anime_Anim_001EE0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENHY_ANIM_OS_ANIME_11
+ { &object_boj_Anim_00DED8, 1.5f, 0, -1, ANIMMODE_ONCE, 0 }, // ENHY_ANIM_BOJ_12
+ { &object_boj_Anim_00F920, 1.5f, 0, -1, ANIMMODE_ONCE, 0 }, // ENHY_ANIM_BOJ_13
+ { &object_boj_Anim_00FC1C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENHY_ANIM_BOJ_14
+ { &object_boj_Anim_00FEE4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENHY_ANIM_BOJ_15
+ { &object_boj_Anim_010330, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENHY_ANIM_BOJ_16
+ { &object_boj_Anim_00FC1C, 1.0f, 0, -1, ANIMMODE_LOOP, -8 }, // ENHY_ANIM_BOJ_17
+ { &object_boj_Anim_00FEE4, 1.0f, 0, -1, ANIMMODE_LOOP, -8 }, // ENHY_ANIM_BOJ_18
+ { &object_boj_Anim_010330, 1.0f, 0, -1, ANIMMODE_LOOP, -8 }, // ENHY_ANIM_BOJ_19
+ { &object_boj_Anim_005D9C, 1.0f, 0, -1, ANIMMODE_LOOP, -8 }, // ENHY_ANIM_BOJ_20
};
-s8 gEnHyBodyParts[] = { -1, 1, 12, 13, 14, 9, 10, 11, 0, 6, 7, 8, 3, 4, 5, 2 };
+s8 gEnHyLimbToBodyParts[ENHY_LIMB_MAX] = {
+ BODYPART_NONE, // ENHY_LIMB_NONE
+ ENHY_BODYPART_1, // ENHY_LIMB_PELVIS
+ ENHY_BODYPART_12, // ENHY_LIMB_LEFT_THIGH
+ ENHY_BODYPART_13, // ENHY_LIMB_LEFT_SHIN
+ ENHY_BODYPART_14, // ENHY_LIMB_LEFT_FOOT
+ ENHY_BODYPART_9, // ENHY_LIMB_RIGHT_THIGH
+ ENHY_BODYPART_10, // ENHY_LIMB_RIGHT_SHIN
+ ENHY_BODYPART_11, // ENHY_LIMB_RIGHT_FOOT
+ ENHY_BODYPART_0, // ENHY_LIMB_TORSO
+ ENHY_BODYPART_6, // ENHY_LIMB_LEFT_UPPER_ARM
+ ENHY_BODYPART_7, // ENHY_LIMB_LEFT_FOREARM
+ ENHY_BODYPART_8, // ENHY_LIMB_LEFT_HAND
+ ENHY_BODYPART_3, // ENHY_LIMB_RIGHT_UPPER_ARM
+ ENHY_BODYPART_4, // ENHY_LIMB_RIGHT_FOREARM
+ ENHY_BODYPART_5, // ENHY_LIMB_RIGHT_HAND
+ ENHY_BODYPART_2, // ENHY_LIMB_HEAD
+};
-s8 gEnHyParentBodyParts[] = { 0, 0, 0, 0, 3, 4, 0, 6, 7, 0, 9, 10, 0, 12, 13 };
+s8 gEnHyParentShadowBodyParts[ENHY_BODYPART_MAX] = {
+ ENHY_BODYPART_0, // ENHY_BODYPART_0
+ ENHY_BODYPART_0, // ENHY_BODYPART_1
+ ENHY_BODYPART_0, // ENHY_BODYPART_2
+ ENHY_BODYPART_0, // ENHY_BODYPART_3
+ ENHY_BODYPART_3, // ENHY_BODYPART_4
+ ENHY_BODYPART_4, // ENHY_BODYPART_5
+ ENHY_BODYPART_0, // ENHY_BODYPART_6
+ ENHY_BODYPART_6, // ENHY_BODYPART_7
+ ENHY_BODYPART_7, // ENHY_BODYPART_8
+ ENHY_BODYPART_0, // ENHY_BODYPART_9
+ ENHY_BODYPART_9, // ENHY_BODYPART_10
+ ENHY_BODYPART_10, // ENHY_BODYPART_11
+ ENHY_BODYPART_0, // ENHY_BODYPART_12
+ ENHY_BODYPART_12, // ENHY_BODYPART_13
+ ENHY_BODYPART_13, // ENHY_BODYPART_14
+};
-u8 gEnHyShadowSizes[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+u8 gEnHyShadowSizes[ENHY_BODYPART_MAX] = {
+ 0, // ENHY_BODYPART_0
+ 0, // ENHY_BODYPART_1
+ 0, // ENHY_BODYPART_2
+ 0, // ENHY_BODYPART_3
+ 0, // ENHY_BODYPART_4
+ 0, // ENHY_BODYPART_5
+ 0, // ENHY_BODYPART_6
+ 0, // ENHY_BODYPART_7
+ 0, // ENHY_BODYPART_8
+ 0, // ENHY_BODYPART_9
+ 0, // ENHY_BODYPART_10
+ 0, // ENHY_BODYPART_11
+ 0, // ENHY_BODYPART_12
+ 0, // ENHY_BODYPART_13
+ 0, // ENHY_BODYPART_14
+};
s32 EnHy_ChangeAnim(SkelAnime* skelAnime, s16 animIndex) {
- s16 frameCount;
- s32 isChanged = false;
+ s16 endFrame;
+ s32 didAnimChange = false;
- if (animIndex >= ENHY_ANIM_AOB_0 && animIndex < ENHY_ANIM_MAX) {
- isChanged = true;
- frameCount = sAnimationInfo[animIndex].frameCount;
- if (frameCount < 0) {
- frameCount = Animation_GetLastFrame(&sAnimationInfo[animIndex].animation->common);
+ if ((animIndex > ENHY_ANIM_NONE) && (animIndex < ENHY_ANIM_MAX)) {
+ didAnimChange = true;
+ endFrame = sAnimationInfo[animIndex].frameCount;
+ if (endFrame < 0) {
+ endFrame = Animation_GetLastFrame(&sAnimationInfo[animIndex].animation->common);
}
Animation_Change(skelAnime, sAnimationInfo[animIndex].animation, sAnimationInfo[animIndex].playSpeed,
- sAnimationInfo[animIndex].startFrame, frameCount, sAnimationInfo[animIndex].mode,
+ sAnimationInfo[animIndex].startFrame, endFrame, sAnimationInfo[animIndex].mode,
sAnimationInfo[animIndex].morphFrames);
}
- return isChanged;
+ return didAnimChange;
}
EnDoor* EnHy_FindNearestDoor(Actor* actor, PlayState* play) {
@@ -69,13 +118,13 @@ EnDoor* EnHy_FindNearestDoor(Actor* actor, PlayState* play) {
do {
doorIter = SubS_FindActor(play, doorIter, ACTORCAT_DOOR, ACTOR_EN_DOOR);
door = (EnDoor*)doorIter;
- dist = Actor_DistanceBetweenActors(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) {}
@@ -84,7 +133,7 @@ EnDoor* EnHy_FindNearestDoor(Actor* actor, PlayState* play) {
}
void EnHy_ChangeObjectAndAnim(EnHy* enHy, PlayState* play, s16 animIndex) {
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[enHy->animObjIndex].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[enHy->animObjIndex].segment);
EnHy_ChangeAnim(&enHy->skelAnime, animIndex);
}
@@ -92,7 +141,7 @@ s32 EnHy_UpdateSkelAnime(EnHy* enHy, PlayState* play) {
s32 isUpdated = false;
if (enHy->actor.draw != NULL) {
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[enHy->animObjIndex].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[enHy->animObjIndex].segment);
SkelAnime_Update(&enHy->skelAnime);
isUpdated = true;
}
@@ -119,7 +168,7 @@ s32 EnHy_Init(EnHy* enHy, PlayState* play, FlexSkeletonHeader* skeletonHeaderSeg
enHy->actor.objBankIndex = enHy->skelLowerObjIndex;
isInitialized = true;
ActorShape_Init(&enHy->actor.shape, 0.0f, NULL, 0.0f);
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[enHy->actor.objBankIndex].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[enHy->actor.objBankIndex].segment);
SkelAnime_InitFlex(play, &enHy->skelAnime, skeletonHeaderSeg, NULL, enHy->jointTable, enHy->morphTable,
ENHY_LIMB_MAX);
EnHy_ChangeObjectAndAnim(enHy, play, animIndex);
@@ -134,16 +183,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 +206,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,10 +228,10 @@ 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;
+ enHy->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
}
return ret;
@@ -190,7 +239,7 @@ s32 func_800F0DD4(EnHy* enHy, PlayState* play, s16 arg2, s16 arg3) {
s32 EnHy_SetPointFowards(EnHy* enHy, PlayState* play, f32 gravity, s16 animIndex) {
enHy->actor.gravity = gravity;
- enHy->actor.flags |= ACTOR_FLAG_1;
+ enHy->actor.flags |= ACTOR_FLAG_TARGETABLE;
EnHy_ChangeObjectAndAnim(enHy, play, animIndex);
enHy->curPoint++;
return false;
@@ -207,8 +256,8 @@ s32 EnHy_MoveForwards(EnHy* enHy, f32 speedTarget) {
s32 reachedEnd = false;
Vec3f curPointPos;
- Math_SmoothStepToF(&enHy->actor.speedXZ, speedTarget, 0.4f, 1000.0f, 0.0f);
- rotStep = enHy->actor.speedXZ * 400.0f;
+ Math_SmoothStepToF(&enHy->actor.speed, speedTarget, 0.4f, 1000.0f, 0.0f);
+ rotStep = enHy->actor.speed * 400.0f;
if (SubS_CopyPointFromPath(enHy->path, enHy->curPoint, &curPointPos) &&
SubS_MoveActorToPoint(&enHy->actor, &curPointPos, rotStep)) {
enHy->curPoint++;
@@ -225,8 +274,8 @@ s32 EnHy_MoveBackwards(EnHy* enHy, f32 speedTarget) {
s32 reachedEnd = false;
Vec3f curPointPos;
- Math_SmoothStepToF(&enHy->actor.speedXZ, speedTarget, 0.4f, 1000.0f, 0.0f);
- rotStep = enHy->actor.speedXZ * 400.0f;
+ Math_SmoothStepToF(&enHy->actor.speed, speedTarget, 0.4f, 1000.0f, 0.0f);
+ rotStep = enHy->actor.speed * 400.0f;
if (SubS_CopyPointFromPath(enHy->path, enHy->curPoint, &curPointPos) &&
SubS_MoveActorToPoint(&enHy->actor, &curPointPos, rotStep)) {
enHy->curPoint--;
@@ -250,29 +299,30 @@ 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 & 0x20) {
+ 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);
if (enHy->isLeftFootOnGround && !wasLeftFootOnGround && isFootOnGround) {
- Actor_PlaySfxAtPos(&enHy->actor, sfxId);
+ Actor_PlaySfx(&enHy->actor, sfxId);
}
enHy->isRightFootOnGround = isFootOnGround = SubS_IsFloorAbove(play, &enHy->rightFootPos, distAboveThreshold);
if (enHy->isRightFootOnGround && !wasRightFootOnGround && isFootOnGround) {
- Actor_PlaySfxAtPos(&enHy->actor, sfxId);
+ Actor_PlaySfx(&enHy->actor, sfxId);
}
return false;
diff --git a/src/code/z_en_item00.c b/src/code/z_en_item00.c
index f450db014..c6b52e476 100644
--- a/src/code/z_en_item00.c
+++ b/src/code/z_en_item00.c
@@ -1,6 +1,8 @@
#include "global.h"
+#include "overlays/actors/ovl_En_Elforg/z_en_elforg.h"
#include "objects/gameplay_keep/gameplay_keep.h"
#include "objects/object_gi_hearts/object_gi_hearts.h"
+#include "overlays/actors/ovl_En_Elf/z_en_elf.h"
#include "overlays/actors/ovl_En_Elforg/z_en_elforg.h"
#define FLAGS 0x00000000
@@ -59,6 +61,8 @@ static InitChainEntry sInitChain[] = {
ICHAIN_F32(targetArrowOffset, 2000, ICHAIN_STOP),
};
+static s32 sBssPad;
+
void EnItem00_SetObject(EnItem00* this, PlayState* play, f32* shadowOffset, f32* shadowScale) {
Actor_SetObjectDependency(play, &this->actor);
Actor_SetScale(&this->actor, 0.5f);
@@ -74,43 +78,43 @@ void EnItem00_Init(Actor* thisx, PlayState* play) {
f32 shadowOffset = 980.0f;
f32 shadowScale = 6.0f;
s32 getItemId = GI_NONE;
- s32 sp30 = ENITEM00_GET_8000(&this->actor) ? 1 : 0;
+ s32 sp30 = ENITEM00_GET_8000(thisx) ? 1 : 0;
- this->collectibleFlag = ENITEM00_GET_7F00(&this->actor);
+ this->collectibleFlag = ENITEM00_GET_7F00(thisx);
- thisx->params &= 0xFF; // Has to be thisx to match
+ thisx->params &= 0xFF;
if (Flags_GetCollectible(play, this->collectibleFlag)) {
- if (this->actor.params == ITEM00_HEART_PIECE) {
+ if (thisx->params == ITEM00_HEART_PIECE) {
sp30 = 0;
this->collectibleFlag = 0;
- this->actor.params = ITEM00_RECOVERY_HEART;
+ thisx->params = ITEM00_RECOVERY_HEART;
} else {
- Actor_Kill(&this->actor);
+ Actor_Kill(thisx);
return;
}
}
- if (this->actor.params == ITEM00_3_HEARTS) {
- this->actor.params = ITEM00_RECOVERY_HEART;
+ if (thisx->params == ITEM00_3_HEARTS) {
+ thisx->params = ITEM00_RECOVERY_HEART;
}
- Actor_ProcessInitChain(&this->actor, sInitChain);
- Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
+ Actor_ProcessInitChain(thisx, sInitChain);
+ Collider_InitAndSetCylinder(play, &this->collider, thisx, &sCylinderInit);
this->unk150 = 1;
- switch (this->actor.params) {
+ switch (thisx->params) {
case ITEM00_RUPEE_GREEN:
case ITEM00_RUPEE_BLUE:
case ITEM00_RUPEE_RED:
- Actor_SetScale(&this->actor, 0.015f);
+ Actor_SetScale(thisx, 0.015f);
this->unk154 = 0.015f;
shadowOffset = 750.0f;
break;
case ITEM00_SMALL_KEY:
this->unk150 = 0;
- Actor_SetScale(&this->actor, 0.03f);
+ Actor_SetScale(thisx, 0.03f);
this->unk154 = 0.03f;
shadowOffset = 350.0f;
break;
@@ -118,18 +122,18 @@ void EnItem00_Init(Actor* thisx, PlayState* play) {
case ITEM00_HEART_PIECE:
case ITEM00_HEART_CONTAINER:
this->unk150 = 0;
- Actor_SetScale(&this->actor, 0.02f);
+ Actor_SetScale(thisx, 0.02f);
this->unk154 = 0.02f;
shadowOffset = 650.0f;
- if (this->actor.params == ITEM00_HEART_CONTAINER) {
+ if (thisx->params == ITEM00_HEART_CONTAINER) {
sp30 = -1;
}
break;
case ITEM00_RECOVERY_HEART:
- this->actor.home.rot.z = randPlusMinusPoint5Scaled(0xFFFF);
+ thisx->home.rot.z = Rand_CenteredFloat(0xFFFF);
shadowOffset = 430.0f;
- Actor_SetScale(&this->actor, 0.02f);
+ Actor_SetScale(thisx, 0.02f);
this->unk154 = 0.02f;
break;
@@ -137,37 +141,37 @@ void EnItem00_Init(Actor* thisx, PlayState* play) {
case ITEM00_ARROWS_30:
case ITEM00_ARROWS_40:
case ITEM00_ARROWS_50:
- Actor_SetScale(&this->actor, 0.035f);
+ Actor_SetScale(thisx, 0.035f);
this->unk154 = 0.035f;
shadowOffset = 250.0f;
break;
case ITEM00_BOMBS_A:
case ITEM00_BOMBS_B:
- case ITEM00_NUTS_1:
- case ITEM00_STICK:
- case ITEM00_MAGIC_SMALL:
- case ITEM00_NUTS_10:
+ case ITEM00_DEKU_NUTS_1:
+ case ITEM00_DEKU_STICK:
+ case ITEM00_MAGIC_JAR_SMALL:
+ case ITEM00_DEKU_NUTS_10:
case ITEM00_BOMBS_0:
- Actor_SetScale(&this->actor, 0.03f);
+ Actor_SetScale(thisx, 0.03f);
this->unk154 = 0.03f;
shadowOffset = 320.0f;
break;
- case ITEM00_MAGIC_LARGE:
- Actor_SetScale(&this->actor, 4.5f * 0.01f);
+ case ITEM00_MAGIC_JAR_BIG:
+ Actor_SetScale(thisx, 4.5f * 0.01f);
this->unk154 = 4.5f * 0.01f;
shadowOffset = 320.0f;
break;
case ITEM00_RUPEE_HUGE:
- Actor_SetScale(&this->actor, 4.5f * 0.01f);
+ Actor_SetScale(thisx, 4.5f * 0.01f);
this->unk154 = 4.5f * 0.01f;
shadowOffset = 750.0f;
break;
case ITEM00_RUPEE_PURPLE:
- Actor_SetScale(&this->actor, 0.03f);
+ Actor_SetScale(thisx, 0.03f);
this->unk154 = 0.03f;
shadowOffset = 750.0f;
break;
@@ -175,22 +179,22 @@ void EnItem00_Init(Actor* thisx, PlayState* play) {
case ITEM00_FLEXIBLE:
case ITEM00_BIG_FAIRY:
shadowOffset = 500.0f;
- Actor_SetScale(&this->actor, 0.01f);
+ Actor_SetScale(thisx, 0.01f);
this->unk154 = 0.01f;
break;
case ITEM00_SHIELD_HERO:
- this->actor.objBankIndex = Object_GetIndex(&play->objectCtx, OBJECT_GI_SHIELD_2);
+ thisx->objBankIndex = Object_GetSlot(&play->objectCtx, OBJECT_GI_SHIELD_2);
EnItem00_SetObject(this, play, &shadowOffset, &shadowScale);
break;
case ITEM00_MAP:
- this->actor.objBankIndex = Object_GetIndex(&play->objectCtx, OBJECT_GI_MAP);
+ thisx->objBankIndex = Object_GetSlot(&play->objectCtx, OBJECT_GI_MAP);
EnItem00_SetObject(this, play, &shadowOffset, &shadowScale);
break;
case ITEM00_COMPASS:
- this->actor.objBankIndex = Object_GetIndex(&play->objectCtx, OBJECT_GI_COMPASS);
+ thisx->objBankIndex = Object_GetSlot(&play->objectCtx, OBJECT_GI_COMPASS);
EnItem00_SetObject(this, play, &shadowOffset, &shadowScale);
break;
@@ -199,9 +203,9 @@ void EnItem00_Init(Actor* thisx, PlayState* play) {
}
this->unk14E = 0;
- ActorShape_Init(&this->actor.shape, shadowOffset, ActorShadow_DrawCircle, shadowScale);
- this->actor.shape.shadowAlpha = 180;
- this->actor.focus.pos = this->actor.world.pos;
+ ActorShape_Init(&thisx->shape, shadowOffset, ActorShadow_DrawCircle, shadowScale);
+ thisx->shape.shadowAlpha = 180;
+ thisx->focus.pos = thisx->world.pos;
this->getItemId = GI_NONE;
if (sp30 < 0) {
@@ -219,11 +223,11 @@ void EnItem00_Init(Actor* thisx, PlayState* play) {
this->unk152 = 15;
this->unk14C = 35;
- this->actor.speedXZ = 0.0f;
- this->actor.velocity.y = 0.0f;
- this->actor.gravity = 0.0f;
+ thisx->speed = 0.0f;
+ thisx->velocity.y = 0.0f;
+ thisx->gravity = 0.0f;
- switch (this->actor.params) {
+ switch (thisx->params) {
case ITEM00_RUPEE_GREEN:
Item_Give(play, ITEM_RUPEE_GREEN);
break;
@@ -274,32 +278,32 @@ void EnItem00_Init(Actor* thisx, PlayState* play) {
Item_Give(play, ITEM_ARROWS_50);
break;
- case ITEM00_MAGIC_LARGE:
- Item_Give(play, ITEM_MAGIC_LARGE);
+ case ITEM00_MAGIC_JAR_BIG:
+ Item_Give(play, ITEM_MAGIC_JAR_BIG);
break;
- case ITEM00_MAGIC_SMALL:
- Item_Give(play, ITEM_MAGIC_SMALL);
+ case ITEM00_MAGIC_JAR_SMALL:
+ Item_Give(play, ITEM_MAGIC_JAR_SMALL);
break;
case ITEM00_SMALL_KEY:
Item_Give(play, ITEM_KEY_SMALL);
break;
- case ITEM00_NUTS_1:
- getItemId = GI_NUTS_1;
+ case ITEM00_DEKU_NUTS_1:
+ getItemId = GI_DEKU_NUTS_1;
break;
- case ITEM00_NUTS_10:
- getItemId = GI_NUTS_10;
+ case ITEM00_DEKU_NUTS_10:
+ getItemId = GI_DEKU_NUTS_10;
break;
default:
break;
}
- if ((getItemId != GI_NONE) && !Actor_HasParent(&this->actor, play)) {
- Actor_PickUp(&this->actor, play, getItemId, 50.0f, 20.0f);
+ if ((getItemId != GI_NONE) && !Actor_HasParent(thisx, play)) {
+ Actor_OfferGetItem(thisx, play, getItemId, 50.0f, 20.0f);
}
this->actionFunc = func_800A6A40;
@@ -313,7 +317,7 @@ void EnItem00_Destroy(Actor* thisx, PlayState* play) {
}
void EnItem00_WaitForHeartObject(EnItem00* this, PlayState* play) {
- s32 objBankIndex = Object_GetIndex(&play->objectCtx, OBJECT_GI_HEARTS);
+ s32 objBankIndex = Object_GetSlot(&play->objectCtx, OBJECT_GI_HEARTS);
if (Object_IsLoaded(&play->objectCtx, objBankIndex)) {
this->actor.objBankIndex = objBankIndex;
@@ -326,7 +330,7 @@ void func_800A640C(EnItem00* this, PlayState* play) {
((this->actor.params == ITEM00_RECOVERY_HEART) && (this->unk152 < 0)) ||
(this->actor.params == ITEM00_HEART_PIECE) || (this->actor.params == ITEM00_HEART_CONTAINER)) {
this->actor.shape.rot.y = this->actor.shape.rot.y + 960;
- } else if ((this->actor.params >= ITEM00_SHIELD_HERO) && (this->actor.params != ITEM00_NUTS_10) &&
+ } else if ((this->actor.params >= ITEM00_SHIELD_HERO) && (this->actor.params != ITEM00_DEKU_NUTS_10) &&
(this->actor.params < ITEM00_BOMBS_0)) {
if (this->unk152 == -1) {
if (!Math_SmoothStepToS(&this->actor.shape.rot.x, this->actor.world.rot.x - 0x4000, 2, 3000, 1500)) {
@@ -346,7 +350,7 @@ void func_800A640C(EnItem00* this, PlayState* play) {
this->actor.shape.yOffset = (Math_SinS(this->actor.shape.rot.y) * 150.0f) + 850.0f;
}
- Math_SmoothStepToF(&this->actor.speedXZ, 0.0f, 1.0f, 0.5f, 0.0f);
+ Math_SmoothStepToF(&this->actor.speed, 0.0f, 1.0f, 0.5f, 0.0f);
if (this->unk14C == 0) {
if ((this->actor.params != ITEM00_SMALL_KEY) && (this->actor.params != ITEM00_HEART_PIECE) &&
@@ -362,7 +366,7 @@ void func_800A640C(EnItem00* this, PlayState* play) {
}
}
- if ((this->actor.gravity != 0.0f) && !(this->actor.bgCheckFlags & 1)) {
+ if ((this->actor.gravity != 0.0f) && !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
this->actionFunc = func_800A6650;
}
}
@@ -373,7 +377,7 @@ static Vec3f sEffectVelocity = { 0.0f, 0.1f, 0.0f };
static Vec3f sEffectAccel = { 0.0f, 0.01f, 0.0f };
void func_800A6650(EnItem00* this, PlayState* play) {
- u32 pad;
+ s32 pad;
Vec3f pos;
if (this->actor.params <= ITEM00_RUPEE_RED) {
@@ -381,18 +385,18 @@ 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);
}
- if (this->actor.bgCheckFlags & 3) {
+ if (this->actor.bgCheckFlags & (BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH)) {
if (this->actor.velocity.y > -2.0f) {
this->actionFunc = func_800A640C;
} else {
this->actor.velocity.y = this->actor.velocity.y * -0.8f;
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
}
}
}
@@ -406,7 +410,7 @@ void func_800A6780(EnItem00* this, PlayState* play) {
if (this->actor.params == ITEM00_RECOVERY_HEART) {
if (this->actor.velocity.y < 0.0f) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.gravity = -0.4f;
if (this->actor.velocity.y < -1.5f) {
this->actor.velocity.y = -1.5f;
@@ -421,7 +425,7 @@ void func_800A6780(EnItem00* this, PlayState* play) {
if (this->actor.params <= ITEM00_RUPEE_RED) {
this->actor.shape.rot.y += 0x3C0;
- } else if ((this->actor.params >= ITEM00_SHIELD_HERO) && (this->actor.params != ITEM00_NUTS_10) &&
+ } else if ((this->actor.params >= ITEM00_SHIELD_HERO) && (this->actor.params != ITEM00_DEKU_NUTS_10) &&
(this->actor.params != ITEM00_BOMBS_0)) {
this->actor.world.rot.x -= 0x2BC;
this->actor.shape.rot.y += 0x190;
@@ -444,10 +448,10 @@ void func_800A6780(EnItem00* this, PlayState* play) {
EffectSsKirakira_SpawnSmall(play, &pos, &sEffectVelocity, &sEffectAccel, &sEffectPrimColor, &sEffectEnvColor);
}
- if (this->actor.bgCheckFlags & 3) {
+ if (this->actor.bgCheckFlags & (BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH)) {
this->actionFunc = func_800A640C;
this->actor.shape.rot.z = 0;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
}
@@ -456,7 +460,7 @@ void func_800A6A40(EnItem00* this, PlayState* play) {
if (this->getItemId != GI_NONE) {
if (!Actor_HasParent(&this->actor, play)) {
- Actor_PickUp(&this->actor, play, this->getItemId, 50.0f, 80.0f);
+ Actor_OfferGetItem(&this->actor, play, this->getItemId, 50.0f, 80.0f);
this->unk152++;
} else {
this->getItemId = GI_NONE;
@@ -507,7 +511,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);
@@ -566,16 +572,16 @@ void EnItem00_Update(Actor* thisx, PlayState* play) {
Item_Give(play, ITEM_RUPEE_HUGE);
break;
- case ITEM00_STICK:
- getItemId = GI_STICKS_1;
+ case ITEM00_DEKU_STICK:
+ getItemId = GI_DEKU_STICKS_1;
break;
- case ITEM00_NUTS_1:
- getItemId = GI_NUTS_1;
+ case ITEM00_DEKU_NUTS_1:
+ getItemId = GI_DEKU_NUTS_1;
break;
- case ITEM00_NUTS_10:
- getItemId = GI_NUTS_10;
+ case ITEM00_DEKU_NUTS_10:
+ getItemId = GI_DEKU_NUTS_10;
break;
case ITEM00_RECOVERY_HEART:
@@ -620,12 +626,12 @@ void EnItem00_Update(Actor* thisx, PlayState* play) {
getItemId = GI_HEART_CONTAINER;
break;
- case ITEM00_MAGIC_LARGE:
- Item_Give(play, ITEM_MAGIC_LARGE);
+ case ITEM00_MAGIC_JAR_BIG:
+ Item_Give(play, ITEM_MAGIC_JAR_BIG);
break;
- case ITEM00_MAGIC_SMALL:
- Item_Give(play, ITEM_MAGIC_SMALL);
+ case ITEM00_MAGIC_JAR_SMALL:
+ Item_Give(play, ITEM_MAGIC_JAR_SMALL);
break;
case ITEM00_SHIELD_HERO:
@@ -646,7 +652,7 @@ void EnItem00_Update(Actor* thisx, PlayState* play) {
if (getItemId != GI_NONE) {
if (!Actor_HasParent(&this->actor, play)) {
- Actor_PickUp(&this->actor, play, getItemId, 50.0f, 20.0f);
+ Actor_OfferGetItem(&this->actor, play, getItemId, 50.0f, 20.0f);
}
}
@@ -668,7 +674,7 @@ void EnItem00_Update(Actor* thisx, PlayState* play) {
}
if ((this->actor.params <= ITEM00_RUPEE_RED) || (this->actor.params == ITEM00_RUPEE_HUGE)) {
- play_sound(NA_SE_SY_GET_RUPY);
+ Audio_PlaySfx(NA_SE_SY_GET_RUPY);
} else if (getItemId != GI_NONE) {
if (Actor_HasParent(&this->actor, play)) {
Flags_SetCollectible(play, this->collectibleFlag);
@@ -676,7 +682,7 @@ void EnItem00_Update(Actor* thisx, PlayState* play) {
}
return;
} else {
- play_sound(NA_SE_SY_GET_ITEM);
+ Audio_PlaySfx(NA_SE_SY_GET_ITEM);
}
Flags_SetCollectible(play, this->collectibleFlag);
@@ -684,7 +690,7 @@ void EnItem00_Update(Actor* thisx, PlayState* play) {
this->unk152 = 15;
this->unk14C = 35;
this->actor.shape.rot.z = 0;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.velocity.y = 0.0f;
this->actor.gravity = 0.0f;
@@ -719,7 +725,7 @@ void EnItem00_Draw(Actor* thisx, PlayState* play) {
case ITEM00_RECOVERY_HEART:
if (this->unk152 < 0) {
if (this->unk152 == -1) {
- s8 bankIndex = Object_GetIndex(&play->objectCtx, OBJECT_GI_HEART);
+ s8 bankIndex = Object_GetSlot(&play->objectCtx, OBJECT_GI_HEART);
if (Object_IsLoaded(&play->objectCtx, bankIndex)) {
this->actor.objBankIndex = bankIndex;
@@ -739,12 +745,12 @@ void EnItem00_Draw(Actor* thisx, PlayState* play) {
case ITEM00_ARROWS_40:
case ITEM00_ARROWS_50:
case ITEM00_BOMBS_B:
- case ITEM00_NUTS_1:
- case ITEM00_STICK:
- case ITEM00_MAGIC_LARGE:
- case ITEM00_MAGIC_SMALL:
+ case ITEM00_DEKU_NUTS_1:
+ case ITEM00_DEKU_STICK:
+ case ITEM00_MAGIC_JAR_BIG:
+ case ITEM00_MAGIC_JAR_SMALL:
case ITEM00_SMALL_KEY:
- case ITEM00_NUTS_10:
+ case ITEM00_DEKU_NUTS_10:
case ITEM00_BOMBS_0:
EnItem00_DrawSprite(this, play);
break;
@@ -781,7 +787,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) {
@@ -821,7 +827,7 @@ void EnItem00_DrawSprite(EnItem00* this, PlayState* play) {
POLY_OPA_DISP = Play_SetFog(play, POLY_OPA_DISP);
- if (this->actor.params == ITEM00_NUTS_10) {
+ if (this->actor.params == ITEM00_DEKU_NUTS_10) {
texIndex = 6;
} else if (this->actor.params == ITEM00_BOMBS_0) {
texIndex = 1;
@@ -832,7 +838,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]));
@@ -846,10 +852,10 @@ void EnItem00_DrawSprite(EnItem00* this, PlayState* play) {
void EnItem00_DrawHeartContainer(EnItem00* this, PlayState* play) {
s32 pad[2];
- if (Object_GetIndex(&play->objectCtx, OBJECT_GI_HEARTS) == this->actor.objBankIndex) {
+ if (Object_GetSlot(&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 +872,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);
@@ -882,13 +888,14 @@ s16 func_800A7650(s16 dropId) {
(((dropId == ITEM00_ARROWS_10) || (dropId == ITEM00_ARROWS_30) || (dropId == ITEM00_ARROWS_40) ||
(dropId == ITEM00_ARROWS_50)) &&
(INV_CONTENT(ITEM_BOW) == ITEM_NONE)) ||
- (((dropId == ITEM00_MAGIC_LARGE) || (dropId == ITEM00_MAGIC_SMALL)) &&
- (gSaveContext.save.playerData.magicLevel == 0))) {
+ (((dropId == ITEM00_MAGIC_JAR_BIG) || (dropId == ITEM00_MAGIC_JAR_SMALL)) &&
+ (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;
}
}
@@ -924,14 +931,14 @@ Actor* Item_DropCollectible(PlayState* play, Vec3f* spawnPos, u32 params) {
newParamFF = params & 0xFF;
if (newParamFF == ITEM00_FLEXIBLE) {
spawnedActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELF, spawnPos->x, spawnPos->y + 40.0f,
- spawnPos->z, 0, 0, 0, ((((param7F00 >> 8) & 0x7F) << 9) & 0xFE00) | 0x102);
+ spawnPos->z, 0, 0, 0, FAIRY_PARAMS(FAIRY_TYPE_2, true, param7F00 >> 8));
if (!Flags_GetCollectible(play, (param7F00 >> 8) & 0x7F)) {
SoundSource_PlaySfxAtFixedWorldPos(play, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
}
} else {
- spawnedActor =
- Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELFORG, spawnPos->x, spawnPos->y + 40.0f, spawnPos->z, 0, 0,
- 0, STRAY_FAIRY_PARAMS(((param7F00 >> 8) & 0x7F), 0, STRAY_FAIRY_TYPE_COLLECTIBLE));
+ spawnedActor = Actor_Spawn(
+ &play->actorCtx, play, ACTOR_EN_ELFORG, spawnPos->x, spawnPos->y + 40.0f, spawnPos->z, 0, 0, 0,
+ STRAY_FAIRY_PARAMS((param7F00 >> 8) & 0x7F, STRAY_FAIRY_AREA_CLOCK_TOWN, STRAY_FAIRY_TYPE_COLLECTIBLE));
if (param20000 == 0) {
if (!Flags_GetCollectible(play, (param7F00 >> 8) & 0x7F)) {
SoundSource_PlaySfxAtFixedWorldPos(play, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
@@ -951,9 +958,9 @@ Actor* Item_DropCollectible(PlayState* play, Vec3f* spawnPos, u32 params) {
} else {
spawnedActor->velocity.y = -2.0f;
}
- spawnedActor->speedXZ = 2.0f;
+ 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;
@@ -985,11 +992,11 @@ Actor* Item_DropCollectible2(PlayState* play, Vec3f* spawnPos, s32 params) {
if ((((params & 0xFF) == ITEM00_FLEXIBLE) || ((params & 0xFF) == ITEM00_BIG_FAIRY)) && (param10000 == 0)) {
if ((params & 0xFF) == ITEM00_FLEXIBLE) {
spawnedActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELF, spawnPos->x, spawnPos->y + 40.0f,
- spawnPos->z, 0, 0, 0, ((((param7F00 >> 8) & 0x7F) << 9) & 0xFE00) | 0x102);
+ spawnPos->z, 0, 0, 0, FAIRY_PARAMS(FAIRY_TYPE_2, true, param7F00 >> 8));
} else {
- spawnedActor =
- Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELFORG, spawnPos->x, spawnPos->y + 40.0f, spawnPos->z, 0, 0,
- 0, STRAY_FAIRY_PARAMS(((param7F00 >> 8) & 0x7F), 0, STRAY_FAIRY_TYPE_COLLECTIBLE));
+ spawnedActor = Actor_Spawn(
+ &play->actorCtx, play, ACTOR_EN_ELFORG, spawnPos->x, spawnPos->y + 40.0f, spawnPos->z, 0, 0, 0,
+ STRAY_FAIRY_PARAMS((param7F00 >> 8) & 0x7F, STRAY_FAIRY_AREA_CLOCK_TOWN, STRAY_FAIRY_TYPE_COLLECTIBLE));
}
if (Flags_GetCollectible(play, (param7F00 >> 8) & 0x7F) == 0) {
SoundSource_PlaySfxAtFixedWorldPos(play, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
@@ -1002,13 +1009,13 @@ Actor* Item_DropCollectible2(PlayState* play, Vec3f* spawnPos, s32 params) {
if (spawnedActor != NULL) {
if (param8000 == 0) {
spawnedActor->velocity.y = 0.0f;
- spawnedActor->speedXZ = 0.0f;
+ spawnedActor->speed = 0.0f;
if (param10000 != 0) {
spawnedActor->gravity = 0.0f;
} else {
spawnedActor->gravity = -0.9f;
}
- spawnedActor->world.rot.y = randPlusMinusPoint5Scaled(0x10000);
+ spawnedActor->world.rot.y = Rand_CenteredFloat(0x10000);
spawnedActor->flags |= 0x10;
}
}
@@ -1019,61 +1026,278 @@ Actor* Item_DropCollectible2(PlayState* play, Vec3f* spawnPos, s32 params) {
}
u8 sDropTable[DROP_TABLE_SIZE * DROP_TABLE_NUMBER] = {
- ITEM00_RUPEE_GREEN, ITEM00_RUPEE_GREEN, ITEM00_RUPEE_BLUE, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_MASK, ITEM00_MASK, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_BOMBS_A,
- ITEM00_MAGIC_SMALL, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_RECOVERY_HEART,
- ITEM00_FLEXIBLE, ITEM00_RUPEE_GREEN, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_MASK, ITEM00_MASK, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_MAGIC_SMALL, ITEM00_NO_DROP, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART,
- ITEM00_RECOVERY_HEART, ITEM00_FLEXIBLE, ITEM00_RUPEE_GREEN, ITEM00_RUPEE_GREEN, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_MASK, ITEM00_MASK, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_BOMBS_A, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE,
- ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_FLEXIBLE, ITEM00_RUPEE_GREEN, ITEM00_NO_DROP,
- ITEM00_RUPEE_BLUE, ITEM00_RUPEE_RED, ITEM00_NO_DROP, ITEM00_MASK, ITEM00_MASK,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_BOMBS_A, ITEM00_MAGIC_SMALL, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_FLEXIBLE, ITEM00_MASK,
- ITEM00_MASK, ITEM00_MASK, ITEM00_MASK, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART,
- ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART,
- ITEM00_RECOVERY_HEART, ITEM00_FLEXIBLE, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART,
- ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART,
- ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART,
- ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RUPEE_GREEN, ITEM00_RUPEE_GREEN,
- ITEM00_RUPEE_GREEN, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_RUPEE_BLUE,
- ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE,
- ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_RED, ITEM00_RUPEE_RED,
- ITEM00_RUPEE_RED, ITEM00_RUPEE_RED, ITEM00_RUPEE_RED, ITEM00_RUPEE_RED, ITEM00_RUPEE_RED,
- ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10,
- ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10,
- ITEM00_ARROWS_30, ITEM00_ARROWS_30, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_LARGE,
- ITEM00_MAGIC_LARGE, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_BOMBS_A, ITEM00_BOMBS_A,
- ITEM00_BOMBS_A, ITEM00_BOMBS_A, ITEM00_BOMBS_A, ITEM00_BOMBS_A, ITEM00_BOMBS_A,
- ITEM00_BOMBS_A, ITEM00_BOMBS_A, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL,
- ITEM00_MAGIC_SMALL, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL,
- ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL,
- ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE,
- ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NUTS_1, ITEM00_NUTS_1,
- ITEM00_NO_DROP, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_STICK,
- ITEM00_STICK, ITEM00_NO_DROP, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_FLEXIBLE,
- ITEM00_RUPEE_GREEN, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_RED, ITEM00_NO_DROP,
- ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_30, ITEM00_BOMBS_A, ITEM00_NO_DROP,
- ITEM00_STICK, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_LARGE, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART,
- ITEM00_FLEXIBLE, ITEM00_RUPEE_GREEN, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_MAGIC_SMALL,
- ITEM00_MASK, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP,
+ ITEM00_RUPEE_GREEN,
+ ITEM00_RUPEE_GREEN,
+ ITEM00_RUPEE_BLUE,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_MASK,
+ ITEM00_MASK,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_BOMBS_A,
+ ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_FLEXIBLE,
+ ITEM00_RUPEE_GREEN,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_MASK,
+ ITEM00_MASK,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_NO_DROP,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_FLEXIBLE,
+ ITEM00_RUPEE_GREEN,
+ ITEM00_RUPEE_GREEN,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_MASK,
+ ITEM00_MASK,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_BOMBS_A,
+ ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_MAGIC_JAR_BIG,
+ ITEM00_MAGIC_JAR_BIG,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_FLEXIBLE,
+ ITEM00_RUPEE_GREEN,
+ ITEM00_NO_DROP,
+ ITEM00_RUPEE_BLUE,
+ ITEM00_RUPEE_RED,
+ ITEM00_NO_DROP,
+ ITEM00_MASK,
+ ITEM00_MASK,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_BOMBS_A,
+ ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_FLEXIBLE,
+ ITEM00_MASK,
+ ITEM00_MASK,
+ ITEM00_MASK,
+ ITEM00_MASK,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_FLEXIBLE,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RUPEE_GREEN,
+ ITEM00_RUPEE_GREEN,
+ ITEM00_RUPEE_GREEN,
+ ITEM00_RUPEE_BLUE,
+ ITEM00_RUPEE_BLUE,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_RUPEE_BLUE,
+ ITEM00_RUPEE_BLUE,
+ ITEM00_RUPEE_BLUE,
+ ITEM00_RUPEE_BLUE,
+ ITEM00_RUPEE_BLUE,
+ ITEM00_RUPEE_BLUE,
+ ITEM00_RUPEE_BLUE,
+ ITEM00_RUPEE_BLUE,
+ ITEM00_RUPEE_BLUE,
+ ITEM00_RUPEE_RED,
+ ITEM00_RUPEE_RED,
+ ITEM00_RUPEE_RED,
+ ITEM00_RUPEE_RED,
+ ITEM00_RUPEE_RED,
+ ITEM00_RUPEE_RED,
+ ITEM00_RUPEE_RED,
+ ITEM00_ARROWS_10,
+ ITEM00_ARROWS_10,
+ ITEM00_ARROWS_10,
+ ITEM00_ARROWS_10,
+ ITEM00_ARROWS_10,
+ ITEM00_ARROWS_10,
+ ITEM00_ARROWS_10,
+ ITEM00_ARROWS_10,
+ ITEM00_ARROWS_10,
+ ITEM00_ARROWS_10,
+ ITEM00_ARROWS_30,
+ ITEM00_ARROWS_30,
+ ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_MAGIC_JAR_BIG,
+ ITEM00_MAGIC_JAR_BIG,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_BOMBS_A,
+ ITEM00_BOMBS_A,
+ ITEM00_BOMBS_A,
+ ITEM00_BOMBS_A,
+ ITEM00_BOMBS_A,
+ ITEM00_BOMBS_A,
+ ITEM00_BOMBS_A,
+ ITEM00_BOMBS_A,
+ ITEM00_BOMBS_A,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_MAGIC_JAR_BIG,
+ ITEM00_MAGIC_JAR_BIG,
+ ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_MAGIC_JAR_BIG,
+ ITEM00_MAGIC_JAR_BIG,
+ ITEM00_MAGIC_JAR_BIG,
+ ITEM00_MAGIC_JAR_BIG,
+ ITEM00_MAGIC_JAR_BIG,
+ ITEM00_MAGIC_JAR_BIG,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_DEKU_NUTS_1,
+ ITEM00_DEKU_NUTS_1,
+ ITEM00_NO_DROP,
+ ITEM00_ARROWS_10,
+ ITEM00_ARROWS_10,
+ ITEM00_ARROWS_10,
+ ITEM00_DEKU_STICK,
+ ITEM00_DEKU_STICK,
+ ITEM00_NO_DROP,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_FLEXIBLE,
+ ITEM00_RUPEE_GREEN,
+ ITEM00_RUPEE_BLUE,
+ ITEM00_RUPEE_BLUE,
+ ITEM00_RUPEE_RED,
+ ITEM00_NO_DROP,
+ ITEM00_ARROWS_10,
+ ITEM00_ARROWS_10,
+ ITEM00_ARROWS_30,
+ ITEM00_BOMBS_A,
+ ITEM00_NO_DROP,
+ ITEM00_DEKU_STICK,
+ ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_MAGIC_JAR_BIG,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_FLEXIBLE,
+ ITEM00_RUPEE_GREEN,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART,
+ ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_MASK,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
+ ITEM00_NO_DROP,
};
u8 sDropTableAmounts[DROP_TABLE_SIZE * DROP_TABLE_NUMBER] = {
@@ -1109,16 +1333,19 @@ void Item_DropCollectibleRandom(PlayState* play, Actor* fromActor, Vec3f* spawnP
dropQuantity = sDropTableAmounts[params + dropTableIndex];
if (dropId == ITEM00_MASK) {
- switch (gSaveContext.save.playerForm) {
+ switch (GET_PLAYER_FORM) {
case PLAYER_FORM_HUMAN:
dropId = ITEM00_ARROWS_10;
break;
+
case PLAYER_FORM_ZORA:
dropId = ITEM00_RECOVERY_HEART;
break;
+
case PLAYER_FORM_GORON:
- dropId = ITEM00_MAGIC_SMALL;
+ dropId = ITEM00_MAGIC_JAR_SMALL;
break;
+
default:
dropId = ITEM00_RUPEE_GREEN;
break;
@@ -1128,16 +1355,17 @@ void Item_DropCollectibleRandom(PlayState* play, Actor* fromActor, Vec3f* spawnP
if (fromActor != NULL) {
dropFlag = fromActor->dropFlag;
- if (dropFlag != 0) {
- if (fromActor->dropFlag & 1) {
+
+ if (dropFlag != DROPFLAG_NONE) {
+ if (fromActor->dropFlag & DROPFLAG_1) {
params = 0x10;
dropId = ITEM00_ARROWS_30;
dropQuantity = 1;
- } else if (fromActor->dropFlag & 2) {
+ } else if (fromActor->dropFlag & DROPFLAG_2) {
params = 0x10;
dropId = ITEM00_RECOVERY_HEART;
dropQuantity = 1;
- } else if (fromActor->dropFlag & 0x20) {
+ } else if (fromActor->dropFlag & DROPFLAG_20) {
dropId = ITEM00_RUPEE_PURPLE;
dropQuantity = 1;
}
@@ -1145,29 +1373,31 @@ 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);
+ FAIRY_PARAMS(FAIRY_TYPE_2, false, 0));
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;
+ dropId = ITEM00_MAGIC_JAR_BIG;
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;
+ dropId = ITEM00_MAGIC_JAR_BIG;
dropQuantity = 1;
} else if (AMMO(ITEM_BOW) < 6) {
params = 0xA0;
@@ -1177,7 +1407,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;
@@ -1195,7 +1425,7 @@ void Item_DropCollectibleRandom(PlayState* play, Actor* fromActor, Vec3f* spawnP
spawnPos->y, spawnPos->z, 0, 0, 0, dropId);
if ((spawnedActor != 0) && (dropId != (u8)ITEM00_NO_DROP)) {
spawnedActor->actor.velocity.y = 8.0f;
- spawnedActor->actor.speedXZ = 2.0f;
+ spawnedActor->actor.speed = 2.0f;
spawnedActor->actor.gravity = -0.9f;
spawnedActor->actor.world.rot.y = Rand_ZeroOne() * 40000.0f;
Actor_SetScale(&spawnedActor->actor, 0.0f);
@@ -1222,10 +1452,10 @@ void Item_DropCollectibleRandom(PlayState* play, Actor* fromActor, Vec3f* spawnP
s32 D_801AE194[32] = {
ITEM00_NO_DROP, ITEM00_RUPEE_GREEN, ITEM00_RUPEE_BLUE, ITEM00_NO_DROP, ITEM00_RUPEE_RED,
ITEM00_RUPEE_PURPLE, ITEM00_NO_DROP, ITEM00_RUPEE_HUGE, ITEM00_COMPASS, ITEM00_MUSHROOM_CLOUD,
- ITEM00_RECOVERY_HEART, ITEM00_3_HEARTS, ITEM00_HEART_PIECE, ITEM00_HEART_CONTAINER, ITEM00_MAGIC_SMALL,
- ITEM00_MAGIC_LARGE, ITEM00_FLEXIBLE, ITEM00_BIG_FAIRY, ITEM00_NO_DROP, ITEM00_NUTS_10,
+ ITEM00_RECOVERY_HEART, ITEM00_3_HEARTS, ITEM00_HEART_PIECE, ITEM00_HEART_CONTAINER, ITEM00_MAGIC_JAR_SMALL,
+ ITEM00_MAGIC_JAR_BIG, ITEM00_FLEXIBLE, ITEM00_BIG_FAIRY, ITEM00_NO_DROP, ITEM00_DEKU_NUTS_10,
ITEM00_NO_DROP, ITEM00_BOMBS_A, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_STICK, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
+ ITEM00_DEKU_STICK, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
ITEM00_ARROWS_10, ITEM00_ARROWS_30,
};
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..fed5ec48c 100644
--- a/src/code/z_eventmgr.c
+++ b/src/code/z_eventmgr.c
@@ -1,52 +1,563 @@
+/**
+ * @file z_eventmgr.c
+ *
+ * Manages all cutscenes except for manual
+ */
+
#include "global.h"
#include "z64shrink_window.h"
+#include "libc/string.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")
+ActorCutscene* sSceneCutsceneList;
+s16 sSceneCutsceneCount;
+u8 sWaitingCutsceneList[16];
+static s32 sBssPad;
+u8 sNextCutsceneList[16];
+static s32 sBssPad2;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_ClearNextCutscenes.s")
+s16 CutsceneManager_SetHudVisibility(s16 csHudVisibility) {
+ u16 hudVisibility;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_MarkNextCutscenes.s")
+ switch (csHudVisibility) {
+ case CS_HUD_VISIBILITY_NONE:
+ hudVisibility = HUD_VISIBILITY_NONE_ALT;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_End.s")
+ case CS_HUD_VISIBILITY_ALL:
+ hudVisibility = HUD_VISIBILITY_ALL;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_Update.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_SetIntentToPlay.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_GetCanPlayNext.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_StartAndSetUnkLinkFields.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_StartAndSetFlag.s")
+ case CS_HUD_VISIBILITY_B_MINIMAP:
+ hudVisibility = HUD_VISIBILITY_B_MINIMAP;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_Start.s")
+ case CS_HUD_VISIBILITY_A:
+ hudVisibility = HUD_VISIBILITY_A;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_Stop.s")
+ default:
+ hudVisibility = HUD_VISIBILITY_ALL;
+ break;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_GetCurrentIndex.s")
+ Interface_SetHudVisibility(hudVisibility);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_GetCutscene.s")
+ return hudVisibility;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_GetAdditionalCutscene.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_GetLength.s")
+void CutsceneManager_Init(PlayState* play, ActorCutscene* cutsceneList, s16 numEntries) {
+ s32 i;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/func_800F2138.s")
+ sSceneCutsceneList = cutsceneList;
+ sSceneCutsceneCount = numEntries;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/func_800F2178.s")
+ for (i = 0; i < ARRAY_COUNT(sWaitingCutsceneList); i++) {
+ sWaitingCutsceneList[i] = 0;
+ sNextCutsceneList[i] = 0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_GetCurrentSubCamId.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/func_800F21CC.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_800F22C4.s")
+void CutsceneManager_ClearWaiting(void) {
+ s32 i;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_SetReturnCamera.s")
+ for (i = 0; i < ARRAY_COUNT(sWaitingCutsceneList); i++) {
+ sWaitingCutsceneList[i] = 0;
+ }
+}
+
+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, NULL, 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:
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
+ break;
+
+ case CS_END_SFX_CORRECT_CHIME:
+ Audio_PlaySfx(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, NULL, 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, NULL, 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_face_reaction.c b/src/code/z_face_reaction.c
index e6d985d65..0d2d632ab 100644
--- a/src/code/z_face_reaction.c
+++ b/src/code/z_face_reaction.c
@@ -43,15 +43,15 @@ static u16 sReactionTextIds[][PLAYER_MASK_GIANT - 1] = {
/* 0x10 */ { 0 },
/* 0x11 */ { 0x0000, 0x236B, 0x0000, 0x0000, 0x236C, 0x0000,
0x0000, 0x236D, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x236E, 0x0000, 0x0000, 0x0000 },
+ 0x0000, 0x0000, 0x0000, 0x236E, 0x0000, 0x0000, 0x0000 }, // FACE_REACTION_SET_JIM
/* 0x12 */ { 0x2348, 0x2349, 0x234A, 0x0000, 0x234B, 0x2348,
0x234C, 0x2348, 0x234D, 0x234E, 0x2348, 0x2348,
- 0x2348, 0x2348, 0x2348, 0x234F, 0x2348, 0x2348, 0x2350 },
+ 0x2348, 0x2348, 0x2348, 0x234F, 0x2348, 0x2348, 0x2350 }, // FACE_REACTION_SET_BOMBERS
/* 0x13 */ { 0 },
/* 0x14 */ { 0 },
/* 0x15 */ { 0x2351, 0x2352, 0x2353, 0x2354, 0x2355, 0x2356,
0x2357, 0x2356, 0x2358, 0x2359, 0x2356, 0x235A,
- 0x2353, 0x235A, 0x235A, 0x235B, 0x2354, 0x2351, 0x235C },
+ 0x2353, 0x235A, 0x235A, 0x235B, 0x2354, 0x2351, 0x235C }, // FACE_REACTION_SET_BOMBERS_HIDEOUT_GUARD
/* 0x16 */ { 0 },
/* 0x17 */ { 0 },
/* 0x18 */ { 0 },
@@ -77,24 +77,24 @@ static u16 sReactionTextIds[][PLAYER_MASK_GIANT - 1] = {
/* 0x2C */ { 0 },
/* 0x2D */ { 0x233B, 0x233C, 0x233D, 0x233E, 0x233F, 0x233B,
0x2340, 0x2341, 0x2342, 0x2343, 0x2344, 0x2345,
- 0x2346, 0x233B, 0x2345, 0x2347, 0x233D, 0x233B, 0x233D },
+ 0x2346, 0x233B, 0x2345, 0x2347, 0x233D, 0x233B, 0x233D }, // FACE_REACTION_SET_TREASURE_CHEST_SHOP_GAL
/* 0x2E */ { 0 },
/* 0x2F */ { 0x2328, 0x2329, 0x232A, 0x232B, 0x2328, 0x2328,
0x232C, 0x2328, 0x232D, 0x232E, 0x2328, 0x2328,
- 0x2328, 0x232F, 0x2330, 0x2331, 0x2332, 0x2333, 0x2328 },
+ 0x2328, 0x232F, 0x2330, 0x2331, 0x2332, 0x2333, 0x2328 }, // FACE_REACTION_SET_CURIOSITY_SHOP_MAN
/* 0x30 */ { 0x236F, 0x2370, 0x236F, 0x0000, 0x236F, 0x236F,
0x236F, 0x236F, 0x0000, 0x236F, 0x236F, 0x236F,
- 0x236F, 0x236F, 0x2371, 0x2372, 0x236F, 0x236F, 0x236F },
+ 0x236F, 0x236F, 0x2371, 0x2372, 0x236F, 0x236F, 0x236F }, // FACE_REACTION_SET_TOWN_SHOOTING_GALLERY_MAN
/* 0x31 */ { 0x2373, 0x2374, 0x2373, 0x0000, 0x2373, 0x2373,
0x2373, 0x2373, 0x0000, 0x2375, 0x2376, 0x2373,
- 0x2373, 0x2373, 0x2377, 0x2378, 0x2373, 0x2373, 0x2373 },
+ 0x2373, 0x2373, 0x2377, 0x2378, 0x2373, 0x2373, 0x2373 }, // FACE_REACTION_SET_SWAMP_SHOOTING_GALLERY_MAN
/* 0x32 */ { 0 },
/* 0x33 */ { 0 },
/* 0x34 */ { 0 },
/* 0x35 */ { 0 },
/* 0x36 */ { 0x0000, 0x2334, 0x0000, 0x0000, 0x0000, 0x0000,
0x2335, 0x0000, 0x2336, 0x2337, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x2338, 0x2339, 0x0000, 0x233A, 0x0000 },
+ 0x0000, 0x0000, 0x2338, 0x2339, 0x0000, 0x233A, 0x0000 }, // FACE_REACTION_SET_PART_TIMER
/* 0x37 */ { 0 },
/* 0x38 */ { 0 },
/* 0x39 */ { 0 },
@@ -178,7 +178,7 @@ static u16 sReactionTextIds[][PLAYER_MASK_GIANT - 1] = {
};
// clang-format on
-u16 Text_GetFaceReaction(PlayState* play, u32 reactionSet) {
+u16 Text_GetFaceReaction(PlayState* play, FaceReactionSet reactionSet) {
if ((Player_GetMask(play) > PLAYER_MASK_NONE) && (Player_GetMask(play) < PLAYER_MASK_GIANT)) {
return sReactionTextIds[reactionSet][Player_GetMask(play) - 1];
}
diff --git a/src/code/z_fbdemo.c b/src/code/z_fbdemo.c
index c145087a2..441af901e 100644
--- a/src/code/z_fbdemo.c
+++ b/src/code/z_fbdemo.c
@@ -1,20 +1,223 @@
+/**
+ * @file z_fbdemo.c
+ *
+ * This file implements an unused transition system that takes the current screen, partitions it into large tiles, and
+ * can apply an effect to them.
+ *
+ * The screen is divided into 7 rows and 10 columns of tiles. (`gScreenWidth`/ 10 = `gScreenHeight` / 7 = 0x20)
+ *
+ * @note The only coded effect has a visual effect to blend the tiles to a single point, which looks like the screen
+ * gets sucked into.
+ */
#include "global.h"
#include "system_malloc.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo/func_80163DC0.s")
+Gfx sTransTileSetupDL[] = {
+ gsDPPipeSync(),
+ gsSPTexture(0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON),
+ gsSPLoadGeometryMode(G_TEXTURE_ENABLE),
+ 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_PERSP | G_CYC_1CYCLE | G_PM_1PRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_OPA_SURF | G_RM_AA_OPA_SURF2),
+ gsSPEndDisplayList(),
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo/func_8016418C.s")
+void TransitionTile_InitGraphics(TransitionTile* this) {
+ s32 frame;
+ s32 col;
+ s32 col2;
+ s32 colTex;
+ Vtx* vtx;
+ s32 row;
+ s32 rowTex;
+ Gfx* gfx;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo/TransitionUnk_Destroy.s")
+ guMtxIdent(&this->modelView);
+ guMtxIdent(&this->unk_98);
+ guOrtho(&this->projection, 0.0f, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0f, -1000.0f, 1000.0f, 1.0f);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo/TransitionUnk_Init.s")
+ for (frame = 0; frame < 2; frame++) {
+ this->frame = frame;
+ vtx = (this->frame == 0) ? this->vtxFrame1 : this->vtxFrame2;
+ for (rowTex = 0, row = 0; row < (this->rows + 1); row++, rowTex += 0x20) {
+ for (colTex = 0, col = 0; col < (this->cols + 1); col++, colTex += 0x20) {
+ Vtx_tn* vtxn = &vtx->n;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo/func_80164438.s")
+ // clang-format off
+ vtx++; \
+ vtxn->tc[0] = colTex << 6; \
+ vtxn->ob[0] = col * 0x20; \
+ vtxn->ob[1] = row * 0x20; \
+ vtxn->ob[2] = -5; \
+ vtxn->flag = 0; \
+ vtxn->tc[1] = rowTex << 6; \
+ vtxn->n[0] = 0; \
+ vtxn->n[1] = 0; \
+ vtxn->n[2] = 120; \
+ vtxn->a = 255;
+ // clang-format on
+ }
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo/TransitionUnk_Draw.s")
+ gfx = this->gfx;
+ for (rowTex = 0, row = 0; row < this->rows; row++, rowTex += 0x20) {
+ gSPVertex(gfx++, SEGMENT_ADDR(0xA, (u32)row * (this->cols + 1) * sizeof(Vtx)), 2 * (this->cols + 1), 0);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo/func_80164678.s")
+ colTex = 0;
+ col2 = 0;
+ col = 0;
+ while (col < this->cols) {
+ gDPPipeSync(gfx++);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo/func_801647AC.s")
+ gDPLoadTextureTile(gfx++, SEGMENT_ADDR(0xB, 0), G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WIDTH, SCREEN_HEIGHT,
+ colTex, rowTex, colTex + 0x20, rowTex + 0x20, 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/code/z_fbdemo/func_801647B8.s")
+ gSP1Quadrangle(gfx++, col, col + 1, col2 + this->cols + 2, this->cols + col2 + 1, 0);
+
+ colTex += 0x20;
+ col2++;
+ col++;
+ }
+ }
+
+ gDPPipeSync(gfx++);
+ gSPEndDisplayList(gfx++);
+}
+
+void TransitionTile_InitVtxData(TransitionTile* this) {
+ s32 row;
+ s32 col;
+
+ for (row = 0; row < this->rows + 1; row++) {
+ for (col = 0; col < this->cols + 1; col++) {
+ (this->vtxData + col + row * (this->cols + 1))->x = col * 0x20;
+ (this->vtxData + col + row * (this->cols + 1))->y = row * 0x20;
+ }
+ }
+}
+
+void TransitionTile_Destroy(TransitionTile* this) {
+ Sleep_Msec(100);
+
+ if (this->vtxData != NULL) {
+ SystemArena_Free(this->vtxData);
+ this->vtxData = NULL;
+ }
+ if (this->vtxFrame1 != NULL) {
+ SystemArena_Free(this->vtxFrame1);
+ this->vtxFrame1 = NULL;
+ }
+ if (this->vtxFrame2 != NULL) {
+ SystemArena_Free(this->vtxFrame2);
+ this->vtxFrame2 = NULL;
+ }
+ if (this->gfx != NULL) {
+ SystemArena_Free(this->gfx);
+ this->gfx = NULL;
+ }
+}
+
+TransitionTile* TransitionTile_Init(TransitionTile* this, s32 cols, s32 rows) {
+ s32 gridSize;
+
+ bzero(this, sizeof(TransitionTile));
+ this->frame = 0;
+ this->cols = cols;
+ this->rows = rows;
+ gridSize = (cols + 1) * (rows + 1);
+ this->vtxData = SystemArena_Malloc(gridSize * sizeof(TransitionTileVtxData));
+ this->vtxFrame1 = SystemArena_Malloc(gridSize * sizeof(Vtx));
+ this->vtxFrame2 = SystemArena_Malloc(gridSize * sizeof(Vtx));
+ this->gfx = SystemArena_Malloc(((cols * 9 + 1) * rows + 2) * sizeof(Gfx));
+
+ if ((this->vtxData == NULL) || (this->vtxFrame1 == NULL) || (this->vtxFrame2 == NULL) || (this->gfx == NULL)) {
+ if (this->vtxData != NULL) {
+ SystemArena_Free(this->vtxData);
+ this->vtxData = NULL;
+ }
+ if (this->vtxFrame1 != NULL) {
+ SystemArena_Free(this->vtxFrame1);
+ this->vtxFrame1 = NULL;
+ }
+ if (this->vtxFrame2 != NULL) {
+ SystemArena_Free(this->vtxFrame2);
+ this->vtxFrame2 = NULL;
+ }
+ if (this->gfx != NULL) {
+ SystemArena_Free(this->gfx);
+ this->gfx = NULL;
+ }
+ return NULL;
+ }
+
+ TransitionTile_InitGraphics(this);
+ TransitionTile_InitVtxData(this);
+ this->frame = 0;
+
+ return this;
+}
+
+void TransitionTile_SetVtx(TransitionTile* this) {
+ s32 row;
+ s32 col;
+ Vtx* vtx;
+
+ for (row = 0; row < this->rows + 1; row++) {
+ for (col = 0; col < this->cols + 1; col++) {
+ vtx = (this->frame == 0) ? this->vtxFrame1 : this->vtxFrame2;
+ (vtx + col + row * (this->cols + 1))->n.ob[0] = (this->vtxData + col + row * (this->cols + 1))->x;
+
+ vtx = (this->frame == 0) ? this->vtxFrame1 : this->vtxFrame2;
+ (vtx + col + row * (this->cols + 1))->n.ob[1] = (this->vtxData + col + row * (this->cols + 1))->y;
+ }
+ }
+}
+
+void TransitionTile_Draw(TransitionTile* this, Gfx** gfxP) {
+ Gfx* gfx = *gfxP;
+
+ gSPDisplayList(gfx++, sTransTileSetupDL);
+ TransitionTile_SetVtx(this);
+ gSPMatrix(gfx++, &this->projection, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
+ gSPMatrix(gfx++, &this->modelView, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPSegment(gfx++, 0xA, this->frame == 0 ? this->vtxFrame1 : this->vtxFrame2);
+ gSPSegment(gfx++, 0xB, this->zBuffer);
+ gSPDisplayList(gfx++, sTransTileSetupDL);
+ gSPDisplayList(gfx++, this->gfx);
+ gDPPipeSync(gfx++);
+ this->frame ^= 1;
+ *gfxP = gfx;
+}
+
+void TransitionTile_Suck(TransitionTile* this) {
+ s32 row;
+ s32 col;
+ f32 diffX;
+ f32 diffY;
+ f32 scale;
+
+ for (row = 0; row < this->rows + 1; row++) {
+ for (col = 0; col < this->cols + 1; col++) {
+ diffX = (this->vtxData + col + row * (this->cols + 1))->x - (this->vtxData + 5 + 4 * (this->cols + 1))->x;
+ diffY = (this->vtxData + col + row * (this->cols + 1))->y - (this->vtxData + 5 + 4 * (this->cols + 1))->y;
+ scale = (SQ(diffX) + SQ(diffY)) / SQ(10.0f);
+ if (scale != 0.0f) {
+ if (scale < 1.0f) {
+ scale = 1.0f;
+ }
+ (this->vtxData + col + row * (this->cols + 1))->x -= diffX / scale;
+ (this->vtxData + col + row * (this->cols + 1))->y -= diffY / scale;
+ }
+ }
+ }
+}
+
+void TransitionTile_Update(TransitionTile* this) {
+}
+
+s32 func_801647B8(TransitionTile* this) {
+ return 0;
+}
diff --git a/src/code/z_fbdemo_circle.c b/src/code/z_fbdemo_circle.c
index 2a8144ea4..efd492d5c 100644
--- a/src/code/z_fbdemo_circle.c
+++ b/src/code/z_fbdemo_circle.c
@@ -1,6 +1,12 @@
#include "global.h"
+#include "sys_cfb.h"
-Gfx D_801D0D00[] = {
+typedef enum {
+ /* 0 */ TRANS_CIRCLE_DIR_IN,
+ /* 1 */ TRANS_CIRCLE_DIR_OUT
+} TransitionCircleDirection;
+
+Gfx sTransCircleSetupDL[] = {
gsDPPipeSync(),
gsDPSetOtherMode(G_AD_DISABLE | G_CD_DISABLE | 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,
@@ -23,7 +29,7 @@ void TransitionCircle_Start(void* thisx) {
TransitionCircle* this = (TransitionCircle*)thisx;
this->stepValue = 0.1f;
- if (this->direction == TRANSITION_CIRCLE_IN) {
+ if (this->direction == TRANS_CIRCLE_DIR_IN) {
this->targetRadius = 0.0f;
this->startingRadius = 1.0f;
} else {
@@ -67,18 +73,18 @@ void TransitionCircle_SetType(void* thisx, s32 type) {
if (type & TC_SET_PARAMS) {
this->maskType = FBDEMO_CIRCLE_GET_MASK_TYPE(type);
- } else if (type == 1) {
- this->direction = TRANSITION_CIRCLE_OUT;
+ } else if (type == TRANS_INSTANCE_TYPE_FILL_OUT) {
+ this->direction = TRANS_CIRCLE_DIR_OUT;
} else {
- this->direction = TRANSITION_CIRCLE_IN;
+ this->direction = TRANS_CIRCLE_DIR_IN;
}
}
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;
@@ -121,7 +127,7 @@ void TransitionCircle_Draw(void* thisx, Gfx** gfxp) {
TransitionCircle* this = (TransitionCircle*)thisx;
gDPPipeSync(gfx++);
- gSPDisplayList(gfx++, &D_801D0D00);
+ gSPDisplayList(gfx++, sTransCircleSetupDL);
gDPSetPrimColor(gfx++, 0, this->color.a, this->color.r, this->color.g, this->color.b, 1);
if (this->maskType == 0) {
gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIM_LOD_FRAC, PRIMITIVE, 0, 0, 0, PRIMITIVE, TEXEL0, 0,
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_fbdemo_fade.c b/src/code/z_fbdemo_fade.c
index a0d9f1eae..a9ab37d48 100644
--- a/src/code/z_fbdemo_fade.c
+++ b/src/code/z_fbdemo_fade.c
@@ -1,17 +1,150 @@
#include "global.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo_fade/TransitionFade_Start.s")
+#define THIS ((TransitionFade*)thisx)
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo_fade/TransitionFade_Init.s")
+typedef enum {
+ /* 0 */ TRANS_FADE_DIR_IN,
+ /* 1 */ TRANS_FADE_DIR_OUT
+} TransitionFadeDirection;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo_fade/TransitionFade_Destroy.s")
+typedef enum {
+ /* 0 */ TRANS_FADE_TYPE_NONE,
+ /* 1 */ TRANS_FADE_TYPE_ONE_WAY,
+ /* 2 */ TRANS_FADE_TYPE_FLASH
+} TransitionFadeType;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo_fade/TransitionFade_Update.s")
+static Gfx sTransFadeSetupDL[] = {
+ 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_NOTPATTERN | G_CD_BAYER | 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),
+ gsDPSetCombineLERP(0, 0, 0, PRIMITIVE, 0, 0, 0, PRIMITIVE, 0, 0, 0, PRIMITIVE, 0, 0, 0, PRIMITIVE),
+ gsSPEndDisplayList(),
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo_fade/TransitionFade_Draw.s")
+TransitionInit TransitionFade_InitVars = {
+ TransitionFade_Init, TransitionFade_Destroy, TransitionFade_Update, TransitionFade_Draw,
+ TransitionFade_Start, TransitionFade_SetType, TransitionFade_SetColor, NULL,
+ TransitionFade_IsDone,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo_fade/TransitionFade_IsDone.s")
+void TransitionFade_Start(void* thisx) {
+ TransitionFade* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo_fade/TransitionFade_SetColor.s")
+ switch (this->type) {
+ case TRANS_FADE_TYPE_NONE:
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo_fade/TransitionFade_SetType.s")
+ case TRANS_FADE_TYPE_ONE_WAY:
+ this->timer = 0;
+ this->color.a = (this->direction != TRANS_FADE_DIR_IN) ? 255 : 0;
+ break;
+
+ case TRANS_FADE_TYPE_FLASH:
+ this->color.a = 0;
+ break;
+
+ default:
+ break;
+ }
+ this->isDone = false;
+}
+
+void* TransitionFade_Init(void* thisx) {
+ TransitionFade* this = THIS;
+
+ bzero(this, sizeof(TransitionFade));
+ return this;
+}
+
+void TransitionFade_Destroy(void* thisx) {
+}
+
+void TransitionFade_Update(void* thisx, s32 updateRate) {
+ s32 alpha;
+ s16 newAlpha;
+ TransitionFade* this = THIS;
+
+ switch (this->type) {
+ case TRANS_FADE_TYPE_NONE:
+ break;
+
+ case TRANS_FADE_TYPE_ONE_WAY:
+ //! FAKE:
+ THIS->timer += updateRate;
+
+ if (this->timer >= ((void)0, gSaveContext.transFadeDuration)) {
+ this->timer = ((void)0, gSaveContext.transFadeDuration);
+ this->isDone = true;
+ }
+
+ alpha = (255.0f * this->timer) / ((void)0, gSaveContext.transFadeDuration);
+ this->color.a = (this->direction != TRANS_FADE_DIR_IN) ? 255 - alpha : alpha;
+ break;
+
+ case TRANS_FADE_TYPE_FLASH:
+ newAlpha = this->color.a;
+ if (R_TRANS_FADE_FLASH_ALPHA_STEP != 0) {
+ if (R_TRANS_FADE_FLASH_ALPHA_STEP < 0) {
+ if (Math_StepToS(&newAlpha, 255, 255)) {
+ R_TRANS_FADE_FLASH_ALPHA_STEP = 150;
+ }
+ } else {
+ Math_StepToS(&R_TRANS_FADE_FLASH_ALPHA_STEP, 20, 60);
+ if (Math_StepToS(&newAlpha, 0, R_TRANS_FADE_FLASH_ALPHA_STEP)) {
+ R_TRANS_FADE_FLASH_ALPHA_STEP = 0;
+ this->isDone = true;
+ }
+ }
+ }
+ this->color.a = newAlpha;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void TransitionFade_Draw(void* thisx, Gfx** gfxP) {
+ TransitionFade* this = THIS;
+ Gfx* gfx;
+ Color_RGBA8_u32* color = &this->color;
+
+ if (color->a != 0) {
+ gfx = *gfxP;
+ gSPDisplayList(gfx++, sTransFadeSetupDL);
+ gDPSetPrimColor(gfx++, 0, 0, color->r, color->g, color->b, color->a);
+ gSPDisplayList(gfx++, D_0E000000.fillRect);
+ *gfxP = gfx;
+ }
+}
+
+s32 TransitionFade_IsDone(void* thisx) {
+ TransitionFade* this = THIS;
+
+ return this->isDone;
+}
+
+void TransitionFade_SetColor(void* thisx, u32 color) {
+ TransitionFade* this = THIS;
+
+ this->color.rgba = color;
+}
+
+void TransitionFade_SetType(void* thisx, s32 type) {
+ TransitionFade* this = THIS;
+
+ if (type == TRANS_INSTANCE_TYPE_FILL_OUT) {
+ this->type = TRANS_FADE_TYPE_ONE_WAY;
+ this->direction = TRANS_FADE_DIR_OUT;
+ } else if (type == TRANS_INSTANCE_TYPE_FILL_IN) {
+ this->type = TRANS_FADE_TYPE_ONE_WAY;
+ this->direction = TRANS_FADE_DIR_IN;
+ } else if (type == TRANS_INSTANCE_TYPE_FADE_FLASH) {
+ this->type = TRANS_FADE_TYPE_FLASH;
+ } else {
+ this->type = TRANS_FADE_TYPE_NONE;
+ }
+}
diff --git a/src/code/z_fireobj.c b/src/code/z_fireobj.c
index e4f014ffa..9c69fb6a0 100644
--- a/src/code/z_fireobj.c
+++ b/src/code/z_fireobj.c
@@ -1,14 +1,7 @@
-#include "global.h"
+#include "z_fireobj.h"
#include "overlays/actors/ovl_En_Arrow/z_en_arrow.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-typedef enum {
- FIRE_STATE_0,
- FIRE_STATE_1,
- FIRE_STATE_2,
- FIRE_STATE_3,
-} FireState;
-
ColliderCylinderInit sFireObjCollisionInit = {
{
COLTYPE_NONE,
@@ -48,17 +41,17 @@ void FireObj_InitWithParams(PlayState* play, FireObj* fire, FireObjInitParams* i
fire->xScale = 0.0f;
fire->yScale = 0.0f;
fire->dynamicSize = 0.0f;
- fire->unk26 = Rand_ZeroOne() * 20.0f;
+ fire->timer = Rand_ZeroOne() * 20.0f;
fire->ignitionDelay = -1;
}
void FireObj_SetState(FireObj* fire, f32 dynamicSizeStep, u8 newState) {
fire->state = newState;
- if (fire->state == FIRE_STATE_3) {
+ if (fire->state == FIRE_STATE_NOT_LIT) {
fire->yScale = 0.0f;
fire->xScale = 0.0f;
fire->dynamicSize = 0.0f;
- } else if (fire->state == FIRE_STATE_2) {
+ } else if (fire->state == FIRE_STATE_FULLY_LIT) {
fire->xScale = fire->yScale = fire->size;
fire->dynamicSize = 1.0f;
}
@@ -70,15 +63,15 @@ void FireObj_SetPosition(FireObj* fire, Vec3f* pos) {
}
void FireObj_StepSize(FireObj* fire) {
- if (fire->state == FIRE_STATE_0) {
- if (Math_StepToF(&fire->dynamicSize, 1.0f, fire->dynamicSizeStep) != 0) {
- FireObj_SetState(fire, fire->dynamicSizeStep, FIRE_STATE_2);
+ if (fire->state == FIRE_STATE_GROWING) {
+ if (Math_StepToF(&fire->dynamicSize, 1.0f, fire->dynamicSizeStep)) {
+ FireObj_SetState(fire, fire->dynamicSizeStep, FIRE_STATE_FULLY_LIT);
}
- } else if ((fire->state == FIRE_STATE_1) && (Math_StepToF(&fire->dynamicSize, 0.0f, fire->dynamicSizeStep) != 0)) {
- FireObj_SetState(fire, fire->dynamicSizeStep, FIRE_STATE_3);
+ } else if ((fire->state == FIRE_STATE_SHRINKING) && Math_StepToF(&fire->dynamicSize, 0.0f, fire->dynamicSizeStep)) {
+ FireObj_SetState(fire, fire->dynamicSizeStep, FIRE_STATE_NOT_LIT);
}
if (fire->sizeGrowsCos2 == 1) {
- if ((fire->state == FIRE_STATE_0) || (fire->state == FIRE_STATE_1)) {
+ if ((fire->state == FIRE_STATE_GROWING) || (fire->state == FIRE_STATE_SHRINKING)) {
fire->xScale = (1.0f - Math_CosS(SQ(fire->dynamicSize) * 0x4000)) * fire->size;
fire->yScale = fire->dynamicSize * fire->size;
} else {
@@ -101,39 +94,41 @@ void FireObj_UpdateStateTransitions(PlayState* play, FireObj* fire) {
Vec3f dist;
FireObj_StepSize(fire);
- fire->unk26++;
+ fire->timer++;
if (fire->ignitionDelay > 0) {
fire->ignitionDelay--;
} else if (fire->ignitionDelay == 0) {
fire->ignitionDelay = -1;
- if ((fire->state == FIRE_STATE_3) || (fire->state == FIRE_STATE_1)) {
- nextState = FIRE_STATE_0;
+ if ((fire->state == FIRE_STATE_NOT_LIT) || (fire->state == FIRE_STATE_SHRINKING)) {
+ nextState = FIRE_STATE_GROWING;
} else {
- nextState = FIRE_STATE_1;
+ nextState = FIRE_STATE_SHRINKING;
}
FireObj_SetState(fire, fire->dynamicSizeStep, nextState);
}
- if ((fire->flags & 1) && (fire->state != FIRE_STATE_3) &&
+
+ if ((fire->flags & FIRE_FLAG_WATER_EXTINGUISHABLE) && (fire->state != FIRE_STATE_NOT_LIT) &&
WaterBox_GetSurface1_2(play, &play->colCtx, fire->position.x, fire->position.z, &waterY, &waterBox) &&
(waterY - fire->position.y > 6500.0f * fire->yScale)) {
- FireObj_SetState(fire, fire->dynamicSizeStep, FIRE_STATE_3);
+ FireObj_SetState(fire, fire->dynamicSizeStep, FIRE_STATE_NOT_LIT);
}
- if ((fire->flags & 2) && (player->heldItemAction == PLAYER_IA_STICK)) {
+ if ((fire->flags & FIRE_FLAG_INTERACT_STICK) && (player->heldItemAction == PLAYER_IA_DEKU_STICK)) {
Math_Vec3f_Diff(&player->meleeWeaponInfo[0].tip, &fire->position, &dist);
- if (Math3D_LengthSquared(&dist) < 400.0f) {
+ if (Math3D_LengthSquared(&dist) < SQ(20.0f)) {
sp40 = true;
}
}
+
if (sp40) {
- if (fire->state == FIRE_STATE_3) {
+ if (fire->state == FIRE_STATE_NOT_LIT) {
if (player->unk_B28 > 0) {
- FireObj_SetState(fire, fire->dynamicSizeStep, FIRE_STATE_0);
+ FireObj_SetState(fire, fire->dynamicSizeStep, FIRE_STATE_GROWING);
}
} else if (player->unk_B28 == 0) {
- player->unk_B28 = 0xD2;
+ player->unk_B28 = 210;
SoundSource_PlaySfxAtFixedWorldPos(play, &fire->position, 20, NA_SE_EV_FLAME_IGNITION);
- } else if (player->unk_B28 < 0xC8) {
- player->unk_B28 = 0xC8;
+ } else if (player->unk_B28 < 200) {
+ player->unk_B28 = 200;
}
}
}
@@ -142,13 +137,14 @@ void FireObj_Draw(PlayState* play, FireObj* fire) {
s32 pad;
FireObjColors* fireColors = &sFireObjColors[fire->colorsIndex];
- if (fire->state != FIRE_STATE_3) {
+ if (fire->state != FIRE_STATE_NOT_LIT) {
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->unk26 * -20) & 511, 32, 128));
+ Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, 0, 32, 64, 1, 0, (fire->timer * -20) % 512U, 32, 128));
gDPSetPrimColor(POLY_XLU_DISP++, 0, fireColors->lod, fireColors->primColor.r, fireColors->primColor.g,
fireColors->primColor.b, fireColors->primColor.a);
@@ -185,7 +181,7 @@ void FireObj_UpdateLight(PlayState* play, FireObjLight* light, FireObj* fire) {
FireObjLightParams* lightParams = &sFireObjLightParams[light->lightParamsIndex];
s16 radius;
- if (fire->state == FIRE_STATE_3) {
+ if (fire->state == FIRE_STATE_NOT_LIT) {
Lights_PointSetColorAndRadius(&light->lightInfo, 0, 0, 0, -1);
} else {
radius = (fire->yScale * 140.0f * fire->sizeInv) + 60.0f;
@@ -225,14 +221,15 @@ void FireObj_Update(PlayState* play, FireObj* fire, Actor* actor) {
EnArrow* arrow = (EnArrow*)fire->collision.base.ac;
FireObj_UpdateStateTransitions(play, fire);
- if (fire->state == FIRE_STATE_3) {
- if ((fire->collision.base.acFlags & AC_HIT) && (fire->collision.info.acHitInfo->toucher.dmgFlags & 0x800)) {
- FireObj_SetState(fire, fire->dynamicSizeStep, FIRE_STATE_0);
+ if (fire->state == FIRE_STATE_NOT_LIT) {
+ if ((fire->collision.base.acFlags & AC_HIT) &&
+ (fire->collision.info.acHitInfo->toucher.dmgFlags & DMG_FIRE_ARROW)) {
+ FireObj_SetState(fire, fire->dynamicSizeStep, FIRE_STATE_GROWING);
}
} else if ((fire->collision.base.acFlags & AC_HIT) && (arrow->actor.update != NULL) &&
(arrow->actor.id == ACTOR_EN_ARROW)) {
arrow->actor.params = 0;
- arrow->collider.info.toucher.dmgFlags = 0x800;
+ arrow->collider.info.toucher.dmgFlags = DMG_FIRE_ARROW;
}
fire->collision.dim.pos.x = fire->position.x;
fire->collision.dim.pos.y = fire->position.y;
diff --git a/src/code/z_game_dlftbls.c b/src/code/z_game_dlftbls.c
index 11d390a28..cb3aee317 100644
--- a/src/code/z_game_dlftbls.c
+++ b/src/code/z_game_dlftbls.c
@@ -1,27 +1,43 @@
#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"
#include "z_title_setup.h"
-#define GAMESTATE_OVERLAY(name, init, destroy, size) \
- { \
- NULL, SEGMENT_ROM_START(ovl_##name), SEGMENT_ROM_END(ovl_##name), SEGMENT_START(ovl_##name), \
- SEGMENT_END(ovl_##name), 0, init, destroy, 0, 0, 0, size \
- }
-#define GAMESTATE_OVERLAY_INTERNAL(init, destroy, size) \
- { NULL, 0, 0, NULL, NULL, 0, init, destroy, 0, 0, 0, size }
+// Linker symbol declarations (used in the table below)
+#define DEFINE_GAMESTATE(_typeName, _enumName, segmentName) DECLARE_OVERLAY_SEGMENT(segmentName)
+#define DEFINE_GAMESTATE_INTERNAL(_typeName, _enumName)
-GameStateOverlay gGameStateOverlayTable[] = {
- GAMESTATE_OVERLAY_INTERNAL(Setup_Init, Setup_Destroy, sizeof(SetupState)),
- GAMESTATE_OVERLAY(select, MapSelect_Init, MapSelect_Destroy, sizeof(MapSelectState)),
- GAMESTATE_OVERLAY(title, ConsoleLogo_Init, ConsoleLogo_Destroy, sizeof(ConsoleLogoState)),
- GAMESTATE_OVERLAY_INTERNAL(Play_Init, Play_Destroy, sizeof(PlayState)),
- GAMESTATE_OVERLAY(opening, TitleSetup_Init, TitleSetup_Destroy, sizeof(TitleSetupState)),
- GAMESTATE_OVERLAY(file_choose, FileSelect_Init, FileSelect_Destroy, sizeof(FileSelectState)),
- GAMESTATE_OVERLAY(daytelop, DayTelop_Init, DayTelop_Destroy, sizeof(DayTelopState)),
+#include "tables/gamestate_table.h"
+
+#undef DEFINE_GAMESTATE
+#undef DEFINE_GAMESTATE_INTERNAL
+
+// Gamestate Overlay Table definition
+#define DEFINE_GAMESTATE_INTERNAL(typeName, _enumName) \
+ { NULL, 0, 0, NULL, NULL, NULL, typeName##_Init, typeName##_Destroy, NULL, NULL, 0, sizeof(typeName##State) },
+
+#define DEFINE_GAMESTATE(typeName, _enumName, segmentName) \
+ { NULL, \
+ (uintptr_t)SEGMENT_ROM_START(ovl_##segmentName), \
+ (uintptr_t)SEGMENT_ROM_END(ovl_##segmentName), \
+ SEGMENT_START(ovl_##segmentName), \
+ SEGMENT_END(ovl_##segmentName), \
+ NULL, \
+ typeName##_Init, \
+ typeName##_Destroy, \
+ NULL, \
+ NULL, \
+ 0, \
+ sizeof(typeName##State) },
+
+GameStateOverlay gGameStateOverlayTable[GAMESTATE_ID_MAX] = {
+#include "tables/gamestate_table.h"
};
-s32 graphNumGameStates = ARRAY_COUNT(gGameStateOverlayTable);
+#undef DEFINE_GAMESTATE
+#undef DEFINE_GAMESTATE_INTERNAL
+
+GameStateId gGraphNumGameStates = GAMESTATE_ID_MAX;
diff --git a/src/code/z_game_over.c b/src/code/z_game_over.c
index 1e87a6a17..003f5dd7b 100644
--- a/src/code/z_game_over.c
+++ b/src/code/z_game_over.c
@@ -1,6 +1,10 @@
-#include "global.h"
+#include "z64game_over.h"
#include "z64rumble.h"
#include "z64shrink_window.h"
+#include "z64.h"
+#include "functions.h"
+#include "variables.h"
+#include "macros.h"
void GameOver_Init(PlayState* play) {
play->gameOverCtx.state = GAMEOVER_INACTIVE;
@@ -11,7 +15,7 @@ void GameOver_FadeLights(PlayState* play) {
if ((gameOverCtx->state >= GAMEOVER_DEATH_WAIT_GROUND && gameOverCtx->state < GAMEOVER_REVIVE_START) ||
(gameOverCtx->state >= GAMEOVER_REVIVE_RUMBLE && gameOverCtx->state < GAMEOVER_REVIVE_FADE_OUT)) {
- Kankyo_FadeInGameOverLights(play);
+ Environment_FadeInGameOverLights(play);
}
}
@@ -23,7 +27,7 @@ void GameOver_Update(PlayState* play) {
switch (gameOverCtx->state) {
case GAMEOVER_DEATH_START:
- func_801477B4(play);
+ Message_CloseTextbox(play);
for (timerId = 0; timerId < TIMER_ID_MAX; timerId++) {
gSaveContext.timerStates[timerId] = TIMER_STATE_OFF;
@@ -45,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;
@@ -62,19 +66,20 @@ void GameOver_Update(PlayState* play) {
gSaveContext.nextHudVisibility = HUD_VISIBILITY_IDLE;
gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
gSaveContext.hudVisibilityTimer = 0;
- Kankyo_InitGameOverLights(play);
+ Environment_InitGameOverLights(play);
sGameOverTimer = 20;
Rumble_Request(0.0f, 126, 124, 63);
gameOverCtx->state = GAMEOVER_DEATH_WAIT_GROUND;
break;
+
case GAMEOVER_DEATH_FADE_OUT:
- if (Audio_GetActiveSequence(SEQ_PLAYER_FANFARE) != NA_BGM_GAME_OVER) {
+ if (AudioSeq_GetActiveSeqId(SEQ_PLAYER_FANFARE) != NA_BGM_GAME_OVER) {
func_80169F78(&play->state);
if (gSaveContext.respawnFlag != -7) {
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;
@@ -83,33 +88,38 @@ void GameOver_Update(PlayState* play) {
Rumble_StateReset();
}
break;
+
case GAMEOVER_REVIVE_START:
- gameOverCtx->state++;
+ gameOverCtx->state++; // GAMEOVER_REVIVE_RUMBLE
sGameOverTimer = 0;
- Kankyo_InitGameOverLights(play);
+ Environment_InitGameOverLights(play);
ShrinkWindow_Letterbox_SetSizeTarget(32);
break;
+
case GAMEOVER_REVIVE_RUMBLE:
sGameOverTimer = 50;
- gameOverCtx->state++;
+ gameOverCtx->state++; // GAMEOVER_REVIVE_WAIT_GROUND
Rumble_Request(0.0f, 126, 124, 63);
break;
+
case GAMEOVER_REVIVE_WAIT_GROUND:
sGameOverTimer--;
if (sGameOverTimer == 0) {
sGameOverTimer = 64;
- gameOverCtx->state++;
+ gameOverCtx->state++; // GAMEOVER_REVIVE_WAIT_FAIRY
}
break;
+
case GAMEOVER_REVIVE_WAIT_FAIRY:
sGameOverTimer--;
if (sGameOverTimer == 0) {
sGameOverTimer = 50;
- gameOverCtx->state++;
+ gameOverCtx->state++; // GAMEOVER_REVIVE_FADE_OUT
}
break;
+
case GAMEOVER_REVIVE_FADE_OUT:
- Kankyo_FadeOutGameOverLights(play);
+ Environment_FadeOutGameOverLights(play);
sGameOverTimer--;
if (sGameOverTimer == 0) {
gameOverCtx->state = GAMEOVER_INACTIVE;
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_jpeg.c b/src/code/z_jpeg.c
index ad592a40e..5ccc5987d 100644
--- a/src/code/z_jpeg.c
+++ b/src/code/z_jpeg.c
@@ -65,7 +65,7 @@ void Jpeg_ScheduleDecoderTask(JpegContext* jpegCtx) {
jpegCtx->scTask.framebuffer = NULL;
jpegCtx->scTask.list.t = sJpegTask;
- osSendMesg(&gSchedContext.cmdQ, (OSMesg)&jpegCtx->scTask, OS_MESG_BLOCK);
+ osSendMesg(&gSchedContext.cmdQ, (OSMesg*)&jpegCtx->scTask, OS_MESG_BLOCK);
Sched_SendEntryMsg(&gSchedContext); // osScKickEntryMsg
osRecvMesg(&jpegCtx->mq, NULL, OS_MESG_BLOCK);
}
diff --git a/src/code/z_kaleido_manager.c b/src/code/z_kaleido_manager.c
index 48e8e2ad6..d0bacdd22 100644
--- a/src/code/z_kaleido_manager.c
+++ b/src/code/z_kaleido_manager.c
@@ -1,5 +1,6 @@
#include "global.h"
-#include "z64load.h"
+#include "fault.h"
+#include "loadfragment.h"
#define KALEIDO_OVERLAY(name) \
{ \
@@ -14,33 +15,32 @@ KaleidoMgrOverlay gKaleidoMgrOverlayTable[] = {
void* sKaleidoAreaPtr = NULL;
KaleidoMgrOverlay* gKaleidoMgrCurOvl = NULL;
-FaultAddrConvClient sKaleidoAreaFaultClient;
+FaultAddrConvClient sKaleidoMgrFaultAddrConvClient;
-void* KaleidoManager_FaultAddrConvFunc(void* address, void* param) {
- u8* ptr = address;
- KaleidoMgrOverlay* ovl = &gKaleidoMgrCurOvl[0];
- u8* ramStart;
- u8* ramEnd;
- size_t size;
- uintptr_t offset;
+uintptr_t KaleidoManager_FaultAddrConv(uintptr_t address, void* param) {
+ uintptr_t addr = address;
+ KaleidoMgrOverlay* kaleidoMgrOvl = gKaleidoMgrCurOvl;
+ size_t ramConv;
+ void* ramStart;
+ size_t diff;
+
+ if (kaleidoMgrOvl != NULL) {
+ diff = (uintptr_t)kaleidoMgrOvl->vramEnd - (uintptr_t)kaleidoMgrOvl->vramStart;
+ ramStart = kaleidoMgrOvl->loadedRamAddr;
+ ramConv = (uintptr_t)kaleidoMgrOvl->vramStart - (uintptr_t)ramStart;
- if (ovl != NULL) {
- size = VRAM_PTR_SIZE(ovl);
- ramStart = ovl->loadedRamAddr;
- ramEnd = ramStart + size;
- offset = (u8*)ovl->vramStart - ramStart;
if (ramStart != NULL) {
- if (ptr >= ramStart && ptr < ramEnd) {
- return ptr + offset;
+ if ((addr >= (uintptr_t)ramStart) && (addr < (uintptr_t)ramStart + diff)) {
+ return addr + ramConv;
}
}
}
- return NULL;
+ return 0;
}
void KaleidoManager_LoadOvl(KaleidoMgrOverlay* ovl) {
ovl->loadedRamAddr = sKaleidoAreaPtr;
- Load2_LoadOverlay(ovl->vromStart, ovl->vromEnd, ovl->vramStart, ovl->vramEnd, ovl->loadedRamAddr);
+ Overlay_Load(ovl->vromStart, ovl->vromEnd, ovl->vramStart, ovl->vramEnd, ovl->loadedRamAddr);
ovl->offset = (uintptr_t)ovl->loadedRamAddr - (uintptr_t)ovl->vramStart;
gKaleidoMgrCurOvl = ovl;
}
@@ -48,7 +48,7 @@ void KaleidoManager_LoadOvl(KaleidoMgrOverlay* ovl) {
void KaleidoManager_ClearOvl(KaleidoMgrOverlay* ovl) {
if (ovl->loadedRamAddr != NULL) {
ovl->offset = 0;
- bzero(ovl->loadedRamAddr, VRAM_PTR_SIZE(ovl));
+ bzero(ovl->loadedRamAddr, (uintptr_t)ovl->vramEnd - (uintptr_t)ovl->vramStart);
ovl->loadedRamAddr = NULL;
gKaleidoMgrCurOvl = NULL;
}
@@ -60,19 +60,19 @@ void KaleidoManager_Init(PlayState* play) {
u32 i;
for (i = 0; i < ARRAY_COUNT(gKaleidoMgrOverlayTable); i++) {
- size = VRAM_PTR_SIZE(&gKaleidoMgrOverlayTable[i]);
+ size = (uintptr_t)gKaleidoMgrOverlayTable[i].vramEnd - (uintptr_t)gKaleidoMgrOverlayTable[i].vramStart;
if (size > largestSize) {
largestSize = size;
}
}
- sKaleidoAreaPtr = THA_AllocEndAlign16(&play->state.heap, largestSize);
+ sKaleidoAreaPtr = THA_AllocTailAlign16(&play->state.tha, largestSize);
gKaleidoMgrCurOvl = NULL;
- Fault_AddAddrConvClient(&sKaleidoAreaFaultClient, KaleidoManager_FaultAddrConvFunc, NULL);
+ Fault_AddAddrConvClient(&sKaleidoMgrFaultAddrConvClient, KaleidoManager_FaultAddrConv, NULL);
}
void KaleidoManager_Destroy() {
- Fault_RemoveAddrConvClient(&sKaleidoAreaFaultClient);
+ Fault_RemoveAddrConvClient(&sKaleidoMgrFaultAddrConvClient);
if (gKaleidoMgrCurOvl != NULL) {
KaleidoManager_ClearOvl(gKaleidoMgrCurOvl);
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..1b3aa49d7 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,8 +92,8 @@ 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 (!Play_InCsMode(play) || ((msgCtx->msgMode != 0) && (msgCtx->currentTextId == 0xFF))) {
+ if ((gSaveContext.save.cutsceneIndex < 0xFFF0) && (gSaveContext.nextCutsceneIndex < 0xFFF0)) {
+ if (!Play_InCsMode(play) || ((msgCtx->msgMode != MSGMODE_NONE) && (msgCtx->currentTextId == 0xFF))) {
if ((play->unk_1887C < 2) && (gSaveContext.magicState != MAGIC_STATE_STEP_CAPACITY) &&
(gSaveContext.magicState != MAGIC_STATE_FILL)) {
if (!CHECK_EVENTINF(EVENTINF_17) && !(player->stateFlags1 & PLAYER_STATE1_20)) {
@@ -110,11 +110,11 @@ void KaleidoSetup_Update(PlayState* play) {
}
if (pauseCtx->state == PAUSE_STATE_OPENING_0) {
- Game_SetFramerateDivisor(&play->state, 2);
+ GameState_SetFramerateDivisor(&play->state, 2);
if (ShrinkWindow_Letterbox_GetSizeTarget() != 0) {
ShrinkWindow_Letterbox_SetSizeTarget(0);
}
- func_801A3AEC(1);
+ Audio_PlaySfx_PauseMenuOpenOrClose(SFX_PAUSE_MENU_OPEN);
}
}
}
@@ -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..30ea04e16 100644
--- a/src/code/z_kankyo.c
+++ b/src/code/z_kankyo.c
@@ -1,156 +1,980 @@
+#include "ultra64.h"
+#include "z64light.h"
+#include "z64math.h"
+
+typedef struct {
+ /* 0x00 */ u8 state;
+ /* 0x04 */ Vec3f offset;
+ /* 0x10 */ Vec3f pos;
+ /* 0x1C */ s8 pitch;
+ /* 0x1D */ s8 roll;
+ /* 0x1E */ u8 textureIndex;
+ /* 0x1F */ u8 delayTimer;
+} LightningBolt; // size = 0x20
+
+// Variables are put before most headers as a hacky way to bypass bss reordering
+struct LightningStrike;
+
+u8 D_801F4E30;
+u8 D_801F4E31;
+u8 gCustomLensFlare1On;
+Vec3f gCustomLensFlare1Pos;
+f32 D_801F4E44;
+f32 D_801F4E48;
+s16 D_801F4E4C;
+u8 gCustomLensFlare2On;
+Vec3f gCustomLensFlare2Pos;
+f32 D_801F4E5C;
+f32 D_801F4E60;
+s16 D_801F4E64;
+struct LightningStrike gLightningStrike;
+f32 D_801F4E74;
+u16 D_801F4E78;
+u16 gSkyboxNumStars;
+LightningBolt sLightningBolts[3];
+LightNode* sNGameOverLightNode;
+LightInfo sNGameOverLightInfo;
+LightNode* sSGameOverLightNode;
+LightInfo sSGameOverLightInfo;
+f32 sSunEnvAlpha;
+f32 sSunColor;
+f32 sSunScale;
+f32 sSunPrimAlpha;
+s32 sSunDepthTestX;
+s32 sSunDepthTestY;
+f32 D_801F4F28;
+s16 sLightningFlashAlpha;
+u16 sSandstormScroll;
+u8 D_801F4F30;
+u8 D_801F4F31;
+u8 sEnvIsTimeStopped;
+u8 D_801F4F33;
+u8 sGameOverLightsIntensity;
+Gfx* sSkyboxStarsDList;
+
+#include "z64environment.h"
#include "global.h"
+#include "sys_cfb.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F5090.s")
+// Data
+f32 sSandstormLerpScale = 0.0f;
+s32 sSunScreenDepth = GPACK_ZDZ(G_MAXFBZ, 0);
+s32 sEnvSkyboxNumStars = 0;
+u16 sTimeJump = 0;
+u8 sSandstormColorIndex = 0;
+u8 sNextSandstormColorIndex = 0;
+u8 D_801BDBA8 = 0;
+u8 D_801BDBAC = 0;
+u8 gWeatherMode = WEATHER_MODE_CLEAR;
+u8 gLightConfigAfterUnderwater = 0;
+u8 gInterruptSongOfStorms = false;
+u8 sSkyboxIsChanging = false;
+u8 D_801BDBC0 = 0;
+u8 D_801BDBC4 = 0;
+u8 gSceneSeqState = SCENESEQ_DEFAULT;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F50D4.s")
+typedef struct {
+ /* 0x0 */ u16 startTime;
+ /* 0x2 */ u16 endTime;
+ /* 0x4 */ u8 lightSetting;
+ /* 0x5 */ u8 nextLightSetting;
+} TimeBasedLightEntry; // size = 0x6
+
+TimeBasedLightEntry sTimeBasedLightConfigs[][7] = {
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 3, 3 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(6, 0), 3, 12 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 0, 1 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 1, 1 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 1, 2 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(19, 0), 2, 3 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 3, 3 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 7, 7 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(6, 0), 7, 8 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 4, 5 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 5, 5 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 5, 6 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(19, 0), 6, 7 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 7, 7 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 11, 11 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(6, 0), 11, 8 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 8, 9 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 9, 9 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 9, 10 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(19, 0), 10, 11 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 11, 11 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 15, 15 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(6, 0), 15, 16 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 12, 13 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 13, 13 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 13, 14 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(19, 0), 14, 15 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 15, 15 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 19, 19 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(6, 0), 19, 16 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 16, 17 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 17, 17 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 17, 18 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(19, 0), 18, 19 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 19, 19 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 23, 23 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(6, 0), 23, 20 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 20, 21 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 21, 21 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 21, 22 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(19, 0), 22, 23 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 23, 23 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 27, 27 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(6, 0), 27, 24 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 24, 25 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 25, 25 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 25, 26 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(19, 0), 26, 27 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 27, 27 },
+ },
+};
+
+TimeBasedSkyboxEntry sTimeBasedSkyboxConfigs[][9] = {
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 0, 0, 3, 3 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 0, 1, 3, 4 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 4, 4 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 0, 0, 0, 1 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 0, 0, 1, 1 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 0, 0, 1, 2 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 0, 0, 2, 2 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 0, 0, 2, 3 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 0, 0, 3, 3 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 1, 1, 7, 7 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 1, 1, 7, 8 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 8, 8 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 1, 0, 4, 5 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 0, 0, 5, 5 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 0, 1, 5, 6 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 1, 1, 6, 6 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 1, 1, 6, 7 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 1, 1, 7, 7 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 0, 0, 11, 11 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 0, 1, 11, 52 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 52, 52 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 1, 1, 8, 9 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 1, 1, 9, 9 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 1, 0, 9, 10 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 0, 0, 10, 10 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 0, 0, 10, 11 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 0, 0, 11, 11 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 0, 0, 15, 15 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 0, 1, 15, 16 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 16, 16 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 0, 0, 12, 13 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 0, 0, 13, 13 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 0, 0, 13, 14 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 0, 0, 14, 14 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 0, 0, 14, 15 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 0, 0, 15, 15 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 0, 0, 19, 19 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 0, 1, 19, 20 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 20, 20 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 1, 0, 16, 17 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 0, 0, 17, 17 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 0, 1, 17, 18 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 1, 1, 18, 18 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 1, 0, 18, 19 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 0, 0, 19, 19 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 0, 0, 23, 23 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 0, 1, 23, 52 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 52, 52 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 1, 1, 20, 21 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 1, 1, 21, 21 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 1, 0, 21, 22 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 0, 0, 22, 22 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 0, 0, 22, 23 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 0, 0, 23, 23 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 0, 0, 27, 27 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 0, 1, 27, 28 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 28, 28 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 0, 0, 24, 25 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 0, 0, 25, 25 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 0, 0, 25, 26 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 0, 0, 26, 26 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 0, 0, 26, 27 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 0, 0, 27, 27 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 0, 0, 31, 31 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 0, 1, 31, 32 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 32, 32 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 1, 0, 28, 29 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 0, 0, 29, 29 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 0, 1, 29, 30 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 1, 1, 30, 30 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 1, 0, 30, 31 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 0, 0, 31, 31 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 0, 0, 35, 35 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 0, 1, 35, 52 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 52, 52 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 1, 1, 32, 33 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 1, 1, 33, 33 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 1, 0, 33, 34 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 0, 0, 34, 34 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 0, 0, 34, 35 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 0, 0, 35, 35 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 0, 0, 39, 39 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 0, 1, 39, 40 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 40, 40 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 0, 0, 36, 37 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 0, 0, 37, 37 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 0, 0, 37, 38 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 0, 0, 38, 38 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 0, 0, 38, 39 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 0, 0, 39, 39 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 0, 0, 43, 43 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 0, 1, 43, 44 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 44, 44 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 1, 0, 40, 41 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 0, 0, 41, 41 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 0, 1, 41, 42 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 1, 1, 42, 42 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 1, 0, 42, 43 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 0, 0, 43, 43 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 0, 0, 47, 47 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 0, 1, 47, 52 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 52, 52 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 1, 1, 44, 45 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 1, 1, 45, 45 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 1, 0, 45, 46 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 0, 0, 46, 46 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 0, 0, 46, 47 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 0, 0, 47, 47 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 1, 1, 51, 51 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 1, 1, 51, 48 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 48, 49 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 1, 1, 49, 49 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 1, 1, 49, 49 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 1, 1, 49, 50 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 1, 1, 50, 50 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 1, 1, 50, 51 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 1, 1, 51, 51 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 1, 1, 55, 55 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 1, 1, 55, 52 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 52, 52 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 1, 1, 52, 53 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 1, 1, 53, 53 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 1, 1, 53, 54 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 1, 1, 54, 54 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 1, 1, 54, 54 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 1, 1, 55, 55 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 1, 1, 59, 59 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 1, 1, 59, 56 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 56, 56 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 1, 1, 56, 57 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 1, 1, 57, 57 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 1, 1, 57, 58 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 1, 1, 58, 58 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 1, 1, 58, 58 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 1, 1, 59, 59 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 1, 1, 63, 63 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 1, 1, 63, 60 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 60, 60 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 1, 1, 60, 61 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 1, 1, 61, 61 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 1, 1, 61, 62 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 1, 1, 62, 62 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 1, 1, 62, 62 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 1, 1, 63, 63 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 1, 1, 67, 67 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 1, 1, 67, 64 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 64, 64 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 1, 1, 64, 65 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 1, 1, 65, 65 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 1, 1, 65, 66 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 1, 1, 66, 66 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 1, 1, 66, 66 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 1, 1, 67, 67 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 0, 0, 1, 1 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 0, 0, 1, 1 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 0, 0, 1, 1 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 0, 0, 1, 1 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 0, 0, 1, 1 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 0, 0, 1, 1 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 0, 0, 1, 1 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 0, 0, 1, 1 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 0, 0, 1, 1 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 0, 0, 71, 71 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 0, 1, 71, 72 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 72, 72 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 1, 1, 68, 69 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 1, 1, 69, 69 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 1, 0, 69, 70 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 0, 0, 70, 70 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 0, 0, 70, 71 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 0, 0, 71, 71 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 1, 1, 75, 75 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 1, 1, 75, 76 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 76, 76 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 1, 1, 72, 73 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 1, 1, 73, 73 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 1, 1, 73, 74 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 1, 1, 74, 74 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 1, 1, 74, 75 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 1, 1, 75, 75 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 0, 0, 79, 79 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 0, 1, 79, 52 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 52, 52 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 1, 1, 76, 77 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 1, 1, 77, 77 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 1, 0, 77, 78 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 0, 0, 78, 78 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 0, 0, 78, 79 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 0, 0, 79, 79 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 0, 0, 83, 83 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 0, 1, 83, 84 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 84, 84 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 1, 1, 80, 81 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 1, 1, 81, 81 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 1, 0, 81, 82 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 0, 0, 82, 82 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 0, 0, 82, 83 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 0, 0, 83, 83 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 1, 1, 87, 87 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 1, 1, 87, 88 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 88, 88 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 1, 1, 84, 85 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 1, 1, 85, 85 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 1, 1, 85, 86 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 1, 1, 86, 86 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 1, 1, 86, 87 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 1, 1, 87, 87 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 0, 0, 91, 91 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 0, 1, 91, 52 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 52, 52 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 1, 1, 88, 89 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 1, 1, 89, 89 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 1, 0, 89, 90 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 0, 0, 90, 90 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 0, 0, 90, 91 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 0, 0, 91, 91 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 0, 0, 11, 11 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 0, 0, 11, 11 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 0, 0, 11, 11 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 0, 0, 11, 11 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 0, 0, 11, 11 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 0, 0, 11, 11 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 0, 0, 11, 11 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 0, 0, 11, 11 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 0, 0, 11, 11 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 0, 0, 95, 95 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 0, 1, 95, 96 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 96, 96 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 1, 1, 92, 93 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 1, 1, 93, 93 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 1, 0, 93, 94 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 0, 0, 94, 94 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 0, 0, 94, 95 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 0, 0, 95, 95 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 1, 1, 99, 99 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 1, 1, 99, 100 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 100, 100 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 1, 1, 96, 97 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 1, 1, 97, 97 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 1, 1, 97, 98 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 1, 1, 98, 98 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 1, 1, 98, 99 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 1, 1, 99, 99 },
+ },
+ {
+ { CLOCK_TIME(0, 0), CLOCK_TIME(4, 0), 0, 0, 103, 103 },
+ { CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), 0, 1, 103, 52 },
+ { CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), 1, 1, 52, 52 },
+ { CLOCK_TIME(6, 0), CLOCK_TIME(8, 0), 1, 1, 100, 101 },
+ { CLOCK_TIME(8, 0), CLOCK_TIME(16, 0), 1, 1, 101, 101 },
+ { CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), 1, 0, 101, 102 },
+ { CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), 0, 0, 102, 102 },
+ { CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), 0, 0, 102, 103 },
+ { CLOCK_TIME(19, 0), CLOCK_TIME(24, 0) - 1, 0, 0, 103, 103 },
+ },
+};
+
+typedef struct {
+ /* 0x0 */ RomFile file;
+ /* 0x8 */ RomFile palette;
+} SkyboxFile; // size = 0x10
+
+SkyboxFile sNormalSkyFiles[] = {
+ {
+ ROM_FILE(d2_fine_static),
+ ROM_FILE_UNSET,
+ },
+ {
+ ROM_FILE(d2_cloud_static),
+ ROM_FILE_UNSET,
+ },
+};
+
+void Environment_GraphCallback(GraphicsContext* gfxCtx, void* arg) {
+ PlayState* play = (PlayState*)arg;
+
+ sSunScreenDepth = SysCfb_GetZBufferPixel(sSunDepthTestX, sSunDepthTestY);
+ Lights_GlowCheck(play);
+}
+
+typedef struct {
+ /* 0x0 */ s32 mantissaShift; // shift applied to the mantissa of the z buffer value
+ /* 0x4 */ s32 base; // 15.3 fixed-point base value for the exponent
+} ZBufValConversionEntry; // size = 0x8
+
+ZBufValConversionEntry sZBufValConversionTable[1 << 3] = {
+ { 6, 0x00000 }, { 5, 0x20000 }, { 4, 0x30000 }, { 3, 0x38000 },
+ { 2, 0x3C000 }, { 1, 0x3E000 }, { 0, 0x3F000 }, { 0, 0x3F800 },
+};
+
+#define ZBUFVAL_EXPONENT(v) (((v) >> 15) & 7)
+#define ZBUFVAL_MANTISSA(v) (((v) >> 4) & 0x7FF)
+
+/**
+ * Convert an 18-bits Z buffer value to a fixed point 15.3 value
+ *
+ * zBufferVal is 18 bits:
+ * 3: Exponent of z value
+ * 11: Mantissa of z value
+ * 4: dz value (unused)
+ */
+s32 Environment_ZBufValToFixedPoint(s32 zBufferVal) {
+ // base[exp] + mantissa << shift[exp]
+ s32 ret = (ZBUFVAL_MANTISSA(zBufferVal) << sZBufValConversionTable[ZBUFVAL_EXPONENT(zBufferVal)].mantissaShift) +
+ sZBufValConversionTable[ZBUFVAL_EXPONENT(zBufferVal)].base;
+
+ return ret;
+}
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_Init.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F5954.s")
+u8 Environment_SmoothStepToU8(u8* pvalue, u8 target, u8 scale, u8 step, u8 minStep) {
+ s16 stepSize = 0;
+ s16 diff = target - *pvalue;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_LerpWeight.s")
+ if (target != *pvalue) {
+ stepSize = diff / scale;
+ if ((stepSize >= (s16)minStep) || ((s16)-minStep >= stepSize)) {
+ if ((s16)step < stepSize) {
+ stepSize = step;
+ }
+ if ((s16)-step > stepSize) {
+ stepSize = -step;
+ }
+ *pvalue += (u8)stepSize;
+ } else {
+ if (stepSize < (s16)minStep) {
+ stepSize = minStep;
+ *pvalue += (u8)stepSize;
+ if (target < *pvalue) {
+ *pvalue = target;
+ }
+ }
+ if ((s16)-minStep < stepSize) {
+ stepSize = -minStep;
+ *pvalue += (u8)stepSize;
+ if (*pvalue < target) {
+ *pvalue = target;
+ }
+ }
+ }
+ }
+ return diff;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F5B10.s")
+f32 Environment_LerpWeight(u16 max, u16 min, u16 val) {
+ f32 diff = max - min;
+
+ if (diff != 0.0f) {
+ f32 ret = 1.0f - (max - val) / diff;
+
+ if (!(ret >= 1.0f)) {
+ return ret;
+ }
+ }
+
+ return 1.0f;
+}
+
+f32 Environment_LerpWeightAccelDecel(u16 endFrame, u16 startFrame, u16 curFrame, u16 accelDuration, u16 decelDuration) {
+ f32 endFrameF;
+ f32 startFrameF;
+ f32 curFrameF;
+ f32 accelDurationF;
+ f32 decelDurationF;
+ f32 totalFrames;
+ f32 temp;
+ f32 framesElapsed;
+ f32 ret;
+
+ if (curFrame <= startFrame) {
+ return 0.0f;
+ }
+
+ if (curFrame >= endFrame) {
+ return 1.0f;
+ }
+
+ endFrameF = (s32)endFrame;
+ startFrameF = (s32)startFrame;
+ curFrameF = (s32)curFrame;
+ totalFrames = endFrameF - startFrameF;
+ framesElapsed = curFrameF - startFrameF;
+ accelDurationF = (s32)accelDuration;
+ decelDurationF = (s32)decelDuration;
+
+ if ((startFrameF >= endFrameF) || (accelDurationF + decelDurationF > totalFrames)) {
+ return 0.0f;
+ }
+
+ temp = 1.0f / ((totalFrames * 2.0f) - accelDurationF - decelDurationF);
+
+ if (accelDurationF != 0.0f) {
+ if (framesElapsed <= accelDurationF) {
+ return temp * framesElapsed * framesElapsed / accelDurationF;
+ }
+ ret = temp * accelDurationF;
+ } else {
+ ret = 0.0f;
+ }
+
+ if (framesElapsed <= totalFrames - decelDurationF) {
+ ret += 2.0f * temp * (framesElapsed - accelDurationF);
+ return ret;
+ }
+
+ ret += 2.0f * temp * (totalFrames - accelDurationF - decelDurationF);
+
+ if (decelDurationF != 0.0f) {
+ ret += temp * decelDurationF;
+ if (framesElapsed < totalFrames) {
+ ret -= temp * (totalFrames - framesElapsed) * (totalFrames - framesElapsed) / decelDurationF;
+ }
+ }
+
+ return ret;
+}
+
+Color_RGBA8 sSkyboxPrimColors[] = {
+ { 181, 100, 72, 0 }, { 255, 255, 255, 0 }, { 255, 164, 63, 0 }, { 70, 90, 100, 0 }, { 180, 110, 70, 0 },
+ { 140, 120, 90, 0 }, { 186, 107, 70, 0 }, { 50, 90, 120, 0 }, { 160, 104, 125, 0 }, { 225, 234, 150, 0 },
+ { 243, 84, 33, 0 }, { 112, 37, 55, 0 }, { 181, 100, 27, 0 }, { 255, 255, 255, 0 }, { 186, 107, 69, 0 },
+ { 10, 40, 90, 0 }, { 180, 120, 100, 0 }, { 140, 120, 110, 0 }, { 186, 107, 70, 0 }, { 0, 50, 60, 0 },
+ { 160, 104, 215, 0 }, { 225, 234, 150, 0 }, { 243, 84, 33, 0 }, { 100, 25, 45, 0 }, { 181, 100, 27, 0 },
+ { 255, 255, 255, 0 }, { 186, 107, 69, 0 }, { 10, 10, 50, 0 }, { 165, 110, 63, 0 }, { 150, 120, 90, 0 },
+ { 166, 112, 65, 0 }, { 10, 40, 60, 0 }, { 160, 104, 215, 0 }, { 225, 234, 150, 0 }, { 243, 84, 33, 0 },
+ { 100, 20, 40, 0 }, { 181, 100, 27, 0 }, { 255, 255, 255, 0 }, { 186, 107, 69, 0 }, { 0, 50, 70, 0 },
+ { 180, 126, 70, 0 }, { 150, 140, 120, 0 }, { 225, 164, 63, 0 }, { 0, 70, 80, 0 }, { 160, 104, 215, 0 },
+ { 225, 234, 150, 0 }, { 243, 84, 33, 0 }, { 100, 40, 65, 0 }, { 105, 72, 57, 0 }, { 150, 120, 90, 0 },
+ { 80, 56, 21, 0 }, { 60, 46, 40, 0 }, { 210, 120, 180, 0 }, { 210, 120, 180, 0 }, { 210, 120, 180, 0 },
+ { 210, 120, 180, 0 }, { 100, 90, 110, 0 }, { 100, 90, 110, 0 }, { 100, 90, 110, 0 }, { 100, 90, 110, 0 },
+ { 255, 255, 255, 0 }, { 255, 255, 255, 0 }, { 255, 255, 255, 0 }, { 255, 255, 255, 0 }, { 25, 53, 235, 0 },
+ { 25, 53, 235, 0 }, { 25, 53, 235, 0 }, { 25, 53, 235, 0 }, { 198, 121, 88, 0 }, { 255, 255, 255, 0 },
+ { 255, 164, 70, 0 }, { 55, 53, 91, 0 }, { 199, 126, 78, 0 }, { 159, 125, 103, 0 }, { 186, 107, 59, 0 },
+ { 50, 90, 120, 0 }, { 171, 113, 131, 0 }, { 225, 234, 180, 0 }, { 237, 84, 37, 0 }, { 133, 48, 75, 0 },
+ { 198, 121, 88, 0 }, { 255, 255, 255, 0 }, { 255, 164, 70, 0 }, { 55, 53, 91, 0 }, { 209, 135, 100, 0 },
+ { 180, 177, 158, 0 }, { 196, 127, 79, 0 }, { 50, 90, 120, 0 }, { 171, 113, 131, 0 }, { 225, 234, 180, 0 },
+ { 237, 84, 37, 0 }, { 133, 48, 75, 0 }, { 198, 121, 88, 0 }, { 235, 250, 235, 0 }, { 255, 164, 70, 0 },
+ { 55, 53, 91, 0 }, { 205, 140, 110, 0 }, { 159, 125, 103, 0 }, { 186, 107, 59, 0 }, { 50, 90, 120, 0 },
+ { 171, 113, 131, 0 }, { 225, 234, 180, 0 }, { 237, 84, 37, 0 }, { 133, 48, 75, 0 },
+};
+
+Color_RGBA8 sSkyboxEnvColors[] = {
+ { 102, 135, 99, 0 }, { 0, 15, 69, 0 }, { 110, 55, 110, 0 }, { 0, 0, 100, 0 }, { 70, 10, 10, 0 },
+ { 40, 0, 10, 0 }, { 40, 40, 40, 0 }, { 20, 20, 30, 0 }, { 60, 0, 10, 0 }, { 65, 45, 0, 0 },
+ { 20, 25, 90, 0 }, { 0, 5, 25, 0 }, { 102, 135, 99, 0 }, { 0, 4, 199, 0 }, { 60, 65, 89, 0 },
+ { 0, 0, 0, 0 }, { 70, 10, 10, 0 }, { 20, 0, 30, 0 }, { 40, 40, 40, 0 }, { 0, 0, 20, 0 },
+ { 60, 0, 10, 0 }, { 65, 45, 0, 0 }, { 20, 25, 90, 0 }, { 0, 0, 30, 0 }, { 102, 135, 99, 0 },
+ { 0, 4, 199, 0 }, { 60, 65, 89, 0 }, { 0, 0, 20, 0 }, { 66, 10, 10, 0 }, { 46, 5, 2, 0 },
+ { 66, 10, 10, 0 }, { 0, 20, 50, 0 }, { 60, 0, 10, 0 }, { 65, 45, 0, 0 }, { 20, 25, 90, 0 },
+ { 0, 0, 20, 0 }, { 102, 135, 99, 0 }, { 0, 4, 199, 0 }, { 60, 65, 89, 0 }, { 0, 0, 40, 0 },
+ { 90, 90, 100, 0 }, { 60, 20, 30, 0 }, { 110, 55, 110, 0 }, { 0, 0, 50, 0 }, { 60, 0, 10, 0 },
+ { 65, 45, 0, 0 }, { 20, 25, 90, 0 }, { 0, 0, 25, 0 }, { 10, 0, 0, 0 }, { 46, 5, 2, 0 },
+ { 34, 14, 10, 0 }, { 21, 5, 13, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 },
+ { 0, 0, 0, 0 }, { 50, 20, 10, 0 }, { 50, 20, 10, 0 }, { 50, 20, 10, 0 }, { 50, 20, 10, 0 },
+ { 30, 15, 250, 0 }, { 30, 15, 250, 0 }, { 30, 15, 250, 0 }, { 30, 15, 250, 0 }, { 177, 82, 93, 0 },
+ { 177, 82, 93, 0 }, { 177, 82, 93, 0 }, { 177, 82, 93, 0 }, { 90, 82, 102, 0 }, { 0, 4, 199, 0 },
+ { 101, 24, 131, 0 }, { 26, 7, 0, 0 }, { 70, 9, 6, 0 }, { 49, 6, 1, 0 }, { 40, 15, 59, 0 },
+ { 0, 2, 28, 0 }, { 60, 0, 10, 0 }, { 75, 45, 0, 0 }, { 20, 20, 89, 0 }, { 0, 7, 17, 0 },
+ { 90, 82, 102, 0 }, { 0, 4, 199, 0 }, { 101, 24, 131, 0 }, { 26, 7, 0, 0 }, { 70, 12, 16, 0 },
+ { 51, 10, 15, 0 }, { 50, 15, 58, 0 }, { 0, 2, 28, 0 }, { 60, 0, 10, 0 }, { 75, 45, 0, 0 },
+ { 20, 20, 89, 0 }, { 0, 7, 17, 0 }, { 90, 82, 102, 0 }, { 0, 4, 199, 0 }, { 101, 24, 131, 0 },
+ { 26, 7, 0, 0 }, { 70, 20, 45, 0 }, { 49, 6, 1, 0 }, { 40, 15, 59, 0 }, { 0, 2, 28, 0 },
+ { 60, 0, 10, 0 }, { 75, 45, 0, 0 }, { 20, 20, 89, 0 }, { 0, 7, 17, 0 },
+};
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_UpdateSkybox.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F6834.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_EnableUnderwaterLights.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F694C.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_DisableUnderwaterLights.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F6A04.s")
+void Environment_WipeRumbleRequests(void) {
+ if ((gSaveContext.gameMode != GAMEMODE_NORMAL) && (gSaveContext.gameMode != GAMEMODE_END_CREDITS)) {
+ Rumble_StateWipeRequests();
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F6A40.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_UpdateSkyboxRotY.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F6AB8.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_UpdateNextDayTime.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F6B44.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_UpdateTime.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F6CEC.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F6EA4.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Kankyo_IsSceneUpsideDown.s")
+s32 Environment_IsSceneUpsideDown(PlayState* play) {
+ s32 ret = false;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F6FF8.s")
+ if ((play->sceneId == SCENE_F41) || (play->sceneId == SCENE_INISIE_R)) {
+ ret = true;
+ }
+ return ret;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F8554.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_UpdateLights.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_UpdateSun.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F88C4.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F8970.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F8A9C.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_UpdatePostmanEvents.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_Update.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F8D84.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_DrawSun.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_DrawSunLensFlare.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F9824.s")
+typedef enum {
+ /* 0 */ LENS_FLARE_CIRCLE0,
+ /* 1 */ LENS_FLARE_CIRCLE1,
+ /* 2 */ LENS_FLARE_RING
+} LensFlareType;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FA39C.s")
+static Color_RGB8 sLensFlareColors[] = {
+ { 155, 205, 255 }, // blue
+ { 255, 255, 205 }, // yellow
+ { 255, 255, 205 }, // yellow
+ { 255, 255, 205 }, // yellow
+ { 155, 255, 205 }, // green
+ { 205, 255, 255 }, // light blue
+ { 155, 155, 255 }, // dark blue
+ { 205, 175, 255 }, // purple
+ { 175, 255, 205 }, // light green
+ { 255, 155, 235 }, // pink
+};
+static f32 sLensFlareScales[] = {
+ 23.0f, 12.0f, 7.0f, 5.0f, 3.0f, 10.0f, 6.0f, 2.0f, 3.0f, 1.0f,
+};
+static u32 sLensFlareAlphas[] = {
+ 50, 10, 25, 40, 70, 30, 50, 70, 50, 40,
+};
+static u32 sLensFlareTypes[] = {
+ LENS_FLARE_RING, LENS_FLARE_CIRCLE1, LENS_FLARE_CIRCLE1, LENS_FLARE_CIRCLE1, LENS_FLARE_CIRCLE1,
+ LENS_FLARE_CIRCLE1, LENS_FLARE_CIRCLE1, LENS_FLARE_CIRCLE1, LENS_FLARE_CIRCLE1, LENS_FLARE_CIRCLE1,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FA3C4.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_DrawLensFlare.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_RandCentered.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_DrawRainImpl.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_DrawRain.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FAAB4.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_ChangeLightSetting.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FAC20.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_DrawSkyboxFilters.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FAF74.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_DrawLightningFlash.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FB010.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_UpdateLightningStrike.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_AddLightningBolts.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FB388.s")
+static TexturePtr sLightningTextures[] = {
+ gEffLightning1Tex, gEffLightning2Tex, gEffLightning3Tex, gEffLightning4Tex,
+ gEffLightning5Tex, gEffLightning6Tex, gEffLightning7Tex, gEffLightning8Tex,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FB758.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_DrawLightning.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FB9B4.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_PlaySceneSequence.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_UpdateTimeBasedSequence.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_DrawCustomLensFlare.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Kankyo_InitGameOverLights.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_InitGameOverLights.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Kankyo_FadeInGameOverLights.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_FadeInGameOverLights.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Kankyo_FadeOutGameOverLights.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_FadeOutGameOverLights.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FC3DC.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_UpdateRain.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_FillScreen.s")
+u8 sSandstormPrimColors[] = {
+ 255, 255, 255, //
+ 255, 255, 255, //
+ 255, 255, 255, //
+ 255, 255, 255, //
+ 210, 156, 85, //
+ 255, 200, 100, //
+ 225, 160, 50, //
+ 105, 90, 40, //
+};
+
+u8 sSandstormEnvColors[] = {
+ 100, 100, 100, //
+ 100, 100, 100, //
+ 100, 100, 100, //
+ 100, 100, 100, //
+ 155, 106, 35, //
+ 200, 150, 50, //
+ 170, 110, 0, //
+ 50, 40, 0, //
+};
+
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_DrawSandstorm.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FD2B4.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_AdjustLights.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FD538.s")
+void Environment_LerpRGB8(u8* from, Color_RGB8* to, f32 lerp, s16* dst) {
+ Color_RGB8 result;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FD59C.s")
+ Color_RGB8_Lerp((Color_RGB8*)from, to, lerp, &result);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FD5E0.s")
+ dst[0] = result.r - from[0];
+ dst[1] = result.g - from[1];
+ dst[2] = result.b - from[2];
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FD654.s")
+void Environment_LerpAmbientColor(PlayState* play, Color_RGB8* to, f32 lerp) {
+ Environment_LerpRGB8(play->envCtx.lightSettings.ambientColor, to, lerp, play->envCtx.adjLightSettings.ambientColor);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FD698.s")
+void Environment_LerpDiffuseColor(PlayState* play, Color_RGB8* to, f32 lerp) {
+ Environment_LerpRGB8(play->envCtx.lightSettings.light1Color, to, lerp, play->envCtx.adjLightSettings.light1Color);
+ Environment_LerpRGB8(play->envCtx.lightSettings.light2Color, to, lerp, play->envCtx.adjLightSettings.light2Color);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/get_days_elapsed.s")
+void Environment_LerpFogColor(PlayState* play, Color_RGB8* to, f32 lerp) {
+ Environment_LerpRGB8(play->envCtx.lightSettings.fogColor, to, lerp, play->envCtx.adjLightSettings.fogColor);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/reset_days_elapsed.s")
+void Environment_LerpFog(PlayState* play, s16 fogNearTarget, s16 fogFarTarget, f32 lerp) {
+ play->envCtx.adjLightSettings.fogNear = (fogNearTarget - play->envCtx.lightSettings.fogNear) * lerp;
+ play->envCtx.adjLightSettings.zFar = (fogFarTarget - play->envCtx.lightSettings.zFar) * lerp;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/get_current_day.s")
+// Repurposed from OoT to be more general
+u32 Environment_GetEventDayCount(void) {
+ return gSaveContext.save.eventDayCount;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FD750.s")
+// Repurposed from OoT to be more general
+void Environment_ClearEventDayCount(void) {
+ gSaveContext.save.eventDayCount = 0;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FD768.s")
+// Repurposed from OoT to be more general
+u32 Environment_GetTotalDays(void) {
+ return gSaveContext.save.day;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FD78C.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_ForcePlaySequence.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FD858.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_IsForcedSequenceDisabled.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FD928.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_PlayStormNatureAmbience.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FD980.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_StopStormNatureAmbience.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FDAF8.s")
+void Environment_WarpSongLeave(PlayState* play) {
+ gWeatherMode = WEATHER_MODE_CLEAR;
+ gSaveContext.save.cutsceneIndex = 0;
+ gSaveContext.respawnFlag = -3;
+ play->nextEntrance = gSaveContext.respawn[RESPAWN_MODE_RETURN].entrance;
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ play->transitionType = TRANS_TYPE_FADE_WHITE;
+ gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FDC94.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_SetupSkyboxStars.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FE390.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_DrawSkyboxStar.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FE3E0.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_DrawSkyboxStarsImpl.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_StopTime.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_Draw.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_StartTime.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_DrawSkyboxStars.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_IsTimeStopped.s")
+void Environment_StopTime(void) {
+ sEnvIsTimeStopped = true;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FE4B8.s")
+void Environment_StartTime(void) {
+ sEnvIsTimeStopped = false;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FE590.s")
+u8 Environment_IsTimeStopped(void) {
+ return sEnvIsTimeStopped;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FE5D0.s")
+u32 Environment_GetStormState(PlayState* play) {
+ u32 stormState = play->envCtx.stormState;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FE610.s")
+ if ((play->sceneId == SCENE_OMOYA) && (play->roomCtx.curRoom.num == 0)) {
+ stormState = ((gSaveContext.save.day >= 2) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM))
+ ? STORM_STATE_ON
+ : STORM_STATE_OFF;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FE620.s")
+ switch (play->sceneId) {
+ case SCENE_13HUBUKINOMITI:
+ case SCENE_11GORONNOSATO:
+ case SCENE_10YUKIYAMANOMURA:
+ case SCENE_14YUKIDAMANOMITI:
+ case SCENE_12HAKUGINMAE:
+ case SCENE_17SETUGEN:
+ case SCENE_GORONRACE:
+ if (gSaveContext.sceneLayer == 0) {
+ stormState = STORM_STATE_OFF;
+ }
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FE658.s")
+ case SCENE_10YUKIYAMANOMURA2:
+ if (gSaveContext.sceneLayer == 1) {
+ stormState = STORM_STATE_OFF;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return stormState;
+}
+
+u8 Environment_IsFinalHours(PlayState* play) {
+ u8 ret = false;
+
+ if ((gSaveContext.save.day == 3) && (gSaveContext.save.time < CLOCK_TIME(6, 0))) {
+ ret = true;
+ }
+
+ return ret;
+}
+
+u8 func_800FE5D0(PlayState* play) {
+ u8 ret = false;
+
+ if (Entrance_GetSceneId(((void)0, gSaveContext.save.entrance)) < 0) {
+ ret = true;
+ }
+
+ return ret;
+}
+
+u32 func_800FE610(PlayState* play) {
+ return 0;
+}
+
+u16 Environment_GetTimeSpeed(PlayState* play) {
+ u16 timeSpeed = 0;
+
+ if (R_TIME_SPEED != 0) {
+ timeSpeed = R_TIME_SPEED + (u16)((void)0, gSaveContext.save.timeSpeedOffset);
+ }
+
+ return timeSpeed;
+}
+
+void Environment_SetTimeJump(f32 minutes) {
+ sTimeJump = CLOCK_TIME_F(0, minutes);
+}
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FE6F8.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FE778.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_GetSandstormColorIndex.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FE788.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_GetNextSandstormColorIndex.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FE798.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_GetSandstormLerpScale.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FE7A8.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_LerpSandstormColors.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FE9B4.s")
@@ -158,6 +982,11 @@
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FEAB0.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FEAC0.s")
+void Environment_JumpForwardInTime(void) {
+ if (sTimeJump != 0) {
+ gSaveContext.save.time = ((void)0, gSaveContext.save.time) + sTimeJump;
+ sTimeJump = 0;
+ }
+}
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FEAF4.s")
diff --git a/src/code/z_lib.c b/src/code/z_lib.c
index 136918765..a68d7c882 100644
--- a/src/code/z_lib.c
+++ b/src/code/z_lib.c
@@ -240,20 +240,20 @@ s32 Math_AsymStepToF(f32* pValue, f32 target, f32 incrStep, f32 decrStep) {
return false;
}
-void func_800FF3A0(f32* distOut, s16* angleOut, Input* input) {
+void Lib_GetControlStickData(f32* outMagnitude, s16* outAngle, Input* input) {
f32 x = input->rel.stick_x;
f32 y = input->rel.stick_y;
- f32 dist;
+ f32 magnitude;
- dist = sqrtf(SQ(x) + SQ(y));
- *distOut = (60.0f < dist) ? 60.0f : dist;
+ magnitude = sqrtf(SQ(x) + SQ(y));
+ *outMagnitude = (60.0f < magnitude) ? 60.0f : magnitude;
- if (dist > 0.0f) {
+ if (magnitude > 0.0f) {
x = input->cur.stick_x;
y = input->cur.stick_y;
- *angleOut = Math_Atan2S_XY(y, -x);
+ *outAngle = Math_Atan2S_XY(y, -x);
} else {
- *angleOut = 0;
+ *outAngle = 0;
}
}
@@ -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) {
@@ -639,16 +639,17 @@ void Color_RGBA8_Copy(Color_RGBA8* dst, Color_RGBA8* src) {
dst->a = src->a;
}
-void func_801000A4(u16 sfxId) {
- play_sound(sfxId);
+void Lib_PlaySfx(u16 sfxId) {
+ Audio_PlaySfx(sfxId);
}
-void func_801000CC(u16 sfxId) {
- func_8019F128(sfxId);
+void Lib_PlaySfx_2(u16 sfxId) {
+ Audio_PlaySfx_2(sfxId);
}
-void Lib_PlaySfxAtPos(Vec3f* pos, u16 sfxId) {
- Audio_PlaySfxAtPos(pos, sfxId);
+// Unused
+void Lib_PlaySfx_AtPos(Vec3f* pos, u16 sfxId) {
+ Audio_PlaySfx_AtPos(pos, sfxId);
}
void Lib_Vec3f_TranslateAndRotateY(Vec3f* translation, s16 rotAngle, Vec3f* src, Vec3f* dst) {
@@ -662,7 +663,7 @@ void Lib_Vec3f_TranslateAndRotateY(Vec3f* translation, s16 rotAngle, Vec3f* src,
dst->z = translation->z + (src->z * cos - src->x * sin);
}
-void Lib_LerpRGB(Color_RGB8* a, Color_RGB8* b, f32 t, Color_RGB8* dst) {
+void Color_RGB8_Lerp(Color_RGB8* a, Color_RGB8* b, f32 t, Color_RGB8* dst) {
f32 aF;
aF = a->r;
diff --git a/src/code/z_lifemeter.c b/src/code/z_lifemeter.c
index b123baab6..5d1299bbf 100644
--- a/src/code/z_lifemeter.c
+++ b/src/code/z_lifemeter.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
#include "interface/parameter_static/parameter_static.h"
@@ -17,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,
@@ -38,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;
@@ -171,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;
}
@@ -182,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;
@@ -200,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;
}
}
@@ -221,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--;
}
@@ -284,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;
}
@@ -324,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;
}
@@ -341,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);
}
@@ -367,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);
@@ -375,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);
@@ -408,7 +407,7 @@ void LifeMeter_UpdateSizeAndBeep(PlayState* play) {
interfaceCtx->lifeSizeChangeDirection = 0;
if (!Player_InCsMode(play) && (play->pauseCtx.state == PAUSE_STATE_OFF) &&
(play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE) && LifeMeter_IsCritical() && !Play_InCsMode(play)) {
- play_sound(NA_SE_SY_HITPOINT_ALARM);
+ Audio_PlaySfx(NA_SE_SY_HITPOINT_ALARM);
}
}
} else {
@@ -423,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..e5b34f387 100644
--- a/src/code/z_lights.c
+++ b/src/code/z_lights.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "sys_cfb.h"
#include "objects/gameplay_keep/gameplay_keep.h"
LightsBuffer sLightsBuffer;
@@ -190,12 +191,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 +205,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);
}
@@ -256,15 +257,15 @@ void LightContext_Init(PlayState* play, LightContext* lightCtx) {
}
void LightContext_SetAmbientColor(LightContext* lightCtx, u8 r, u8 g, u8 b) {
- lightCtx->ambient.r = r;
- lightCtx->ambient.g = g;
- lightCtx->ambient.b = b;
+ lightCtx->ambientColor[0] = r;
+ lightCtx->ambientColor[1] = g;
+ lightCtx->ambientColor[2] = b;
}
void LightContext_SetFog(LightContext* lightCtx, u8 r, u8 g, u8 b, s16 near, s16 far) {
- lightCtx->fogColor.r = r;
- lightCtx->fogColor.g = g;
- lightCtx->fogColor.b = b;
+ lightCtx->fogColor[0] = r;
+ lightCtx->fogColor[1] = g;
+ lightCtx->fogColor[2] = b;
lightCtx->fogNear = near;
lightCtx->zFar = far;
}
@@ -273,7 +274,7 @@ void LightContext_SetFog(LightContext* lightCtx, u8 r, u8 g, u8 b, s16 near, s16
* Allocate a new Lights group and initilize the ambient color with that provided by LightContext
*/
Lights* LightContext_NewLights(LightContext* lightCtx, GraphicsContext* gfxCtx) {
- return Lights_New(gfxCtx, lightCtx->ambient.r, lightCtx->ambient.g, lightCtx->ambient.b);
+ return Lights_New(gfxCtx, lightCtx->ambientColor[0], lightCtx->ambientColor[1], lightCtx->ambientColor[2]);
}
void LightContext_InitList(PlayState* play, LightContext* lightCtx) {
@@ -338,7 +339,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 +361,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 +392,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 +412,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_malloc.c b/src/code/z_malloc.c
index 781f4310e..ac56231cf 100644
--- a/src/code/z_malloc.c
+++ b/src/code/z_malloc.c
@@ -40,7 +40,7 @@ void ZeldaArena_GetSizes(size_t* outMaxFree, size_t* outFree, size_t* outAlloc)
__osGetSizes(&sZeldaArena, outMaxFree, outFree, outAlloc);
}
-s32 ZeldaArena_Check() {
+s32 ZeldaArena_Check(void) {
return __osCheckArena(&sZeldaArena);
}
@@ -48,10 +48,10 @@ void ZeldaArena_Init(void* start, size_t size) {
__osMallocInit(&sZeldaArena, start, size);
}
-void ZeldaArena_Cleanup() {
+void ZeldaArena_Cleanup(void) {
__osMallocCleanup(&sZeldaArena);
}
-u8 ZeldaArena_IsInitialized() {
+u8 ZeldaArena_IsInitialized(void) {
return __osMallocIsInitalized(&sZeldaArena);
}
diff --git a/src/code/z_map_exp.c b/src/code/z_map_exp.c
index ac78d1229..f04562e03 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;
}
@@ -180,7 +181,7 @@ void Map_Init(PlayState* play) {
func_80105C40(play->roomCtx.curRoom.num);
interfaceCtx->unk_278 = -1;
interfaceCtx->dungeonOrBossAreaMapIndex = -1;
- interfaceCtx->mapSegment = THA_AllocEndAlign16(&play->state.heap, 0x1000);
+ interfaceCtx->mapSegment = THA_AllocTailAlign16(&play->state.tha, 0x1000);
if (func_8010A2AC(play)) {
gSaveContext.mapIndex = func_8010A238(play);
return;
@@ -229,9 +230,9 @@ void Map_Update(PlayState* play) {
if ((play->pauseCtx.state <= PAUSE_STATE_OPENING_2) && (CHECK_BTN_ALL(controller->press.button, BTN_L)) &&
!Play_InCsMode(play) && !func_80106530(play)) {
if (!R_MINIMAP_DISABLED) {
- play_sound(NA_SE_SY_CAMERA_ZOOM_UP);
+ Audio_PlaySfx(NA_SE_SY_CAMERA_ZOOM_UP);
} else {
- play_sound(NA_SE_SY_CAMERA_ZOOM_DOWN);
+ Audio_PlaySfx(NA_SE_SY_CAMERA_ZOOM_DOWN);
}
R_MINIMAP_DISABLED ^= 1;
@@ -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 97db5e72d..3fb8f5bac 100644
--- a/src/code/z_message.c
+++ b/src/code/z_message.c
@@ -1,86 +1,149 @@
#include "global.h"
+#include "z64horse.h"
#include "z64shrink_window.h"
#include "z64view.h"
#include "message_data_static.h"
+#include "interface/parameter_static/parameter_static.h"
#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
-#if 0
+u8 D_801C6A70 = 0;
+s16 sOcarinaButtonIndexBufPos = 0;
+s16 sOcarinaButtonIndexBufLen = 0;
+s16 sLastPlayedSong = 0xFF;
+s16 sOcarinaButtonStepR = 0;
+s16 sOcarinaButtonStepG = 0;
+s16 sOcarinaButtonStepB = 0;
+s16 sOcarinaButtonFlashTimer = 12;
+s16 sOcarinaButtonFlashColorIndex = 1;
+s16 D_801C6A94 = 0;
-s16 D_801D02D8[15] = {
- ACTOR_OCEFF_WIPE5, ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect, Sonata of Awakening Effect
- ACTOR_OCEFF_WIPE5, ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect, Sonata of Awakening Effect
- ACTOR_OCEFF_WIPE5, ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect, Sonata of Awakening Effect
- ACTOR_OCEFF_WIPE, ACTOR_OCEFF_WIPE7, // Song of Time Effect, Song of Healing Effect
- ACTOR_OCEFF_WIPE2, ACTOR_OCEFF_WIPE6, // Epona's Song Effect, Song of Soaring Effect
- ACTOR_OCEFF_STORM, ACTOR_OCEFF_SPOT, // Song of Storms Effect II [?], Sun's Song Effect
- ACTOR_OCEFF_WIPE, ACTOR_OCEFF_WIPE, // Song of Time Effect, Song of Time Effect
- ACTOR_OCEFF_WIPE4 // Scarecrow's Song Effect
+u8 gPageSwitchNextButtonStatus[][5] = {
+ { BTN_ENABLED, BTN_ENABLED, BTN_DISABLED, BTN_ENABLED, BTN_ENABLED },
+ { BTN_ENABLED, BTN_ENABLED, BTN_DISABLED, BTN_ENABLED, BTN_ENABLED },
+ { BTN_ENABLED, BTN_DISABLED, BTN_DISABLED, BTN_ENABLED, BTN_ENABLED },
+ { BTN_ENABLED, BTN_DISABLED, BTN_DISABLED, BTN_ENABLED, BTN_ENABLED },
+ { BTN_ENABLED, BTN_ENABLED, BTN_DISABLED, BTN_ENABLED, BTN_ENABLED },
+ { BTN_ENABLED, BTN_ENABLED, BTN_DISABLED, BTN_ENABLED, BTN_ENABLED },
};
-s32 D_801D02F8[15] = { 0,1,2,3,4,0,1,0,0,0,0,0,1,1,0 };
-#endif
+#define DEFINE_PERSON(_enum, _photo, _description, _metEnum, metMessage, _metFlag) metMessage,
+#define DEFINE_EVENT(_enum, _icon, _colorFlag, _description, completedMessage, _completedFlag) completedMessage,
-extern u16 D_801C6AB8[];
-extern u16 D_801C6B28[];
-extern s16 D_801D02D8[];
-extern s32 D_801D02F8[];
-extern s16 D_801F6B0C;
-extern s16 D_801F6B0E;
-extern s16 D_801F6B10;
-extern s16 D_801F6B12;
-extern s16 D_801F6B14;
-extern s16 D_801F6B16;
-extern s16 D_801F6B18;
-extern s16 D_801F6B1A;
-extern s16 D_801F6B1C;
-extern s16 D_801F6B1E;
-extern s16 D_801F6B20;
-extern s16 D_801F6B22;
-extern MessageTableEntry D_801C6B98[];
-extern MessageTableEntry D_801CFB08[];
+u16 sBombersNotebookEventMessages[BOMBERS_NOTEBOOK_EVENT_MAX] = {
+#include "tables/bombers_notebook/person_table.h"
+#include "tables/bombers_notebook/event_table.h"
+};
-void func_80147520(void) {
- D_801CFC98 = 0xFF;
- D_801CFCA4[0] = D_801CFCA4[1] = D_801CFCA4[2] = D_801CFCA4[3] = D_801CFCA4[4] = D_801CFCA4[5] = D_801CFCA4[6] =
- D_801CFCA4[7] = D_801CFCA4[8] = 0;
+#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
+
+// TODO: Scripts
+// Include message tables D_801C6B98 and D_801CFB08
+#include "src/code/z_message_tables.inc.c"
+
+s16 D_801CFC78[TEXTBOX_TYPE_MAX] = {
+ 0, // TEXTBOX_TYPE_0
+ 1, // TEXTBOX_TYPE_1
+ 3, // TEXTBOX_TYPE_2
+ 2, // TEXTBOX_TYPE_3
+ 14, // TEXTBOX_TYPE_4
+ 14, // TEXTBOX_TYPE_5
+ 0, // TEXTBOX_TYPE_6
+ 14, // TEXTBOX_TYPE_7
+ 0, // TEXTBOX_TYPE_8
+ 0, // TEXTBOX_TYPE_9
+ 0, // TEXTBOX_TYPE_A
+ 14, // TEXTBOX_TYPE_B
+ 14, // TEXTBOX_TYPE_C
+ 4, // TEXTBOX_TYPE_D
+ 14, // TEXTBOX_TYPE_E
+ 0, // TEXTBOX_TYPE_F
+};
+u8 sOcarinaButtonIndexBuf[12] = { 0 };
+s16 sOcarinaButtonAlphaValues[9] = { 0 };
+s16 gOcarinaSongItemMap[] = {
+ OCARINA_SONG_SONATA, OCARINA_SONG_GORON_LULLABY, OCARINA_SONG_NEW_WAVE,
+ OCARINA_SONG_ELEGY, OCARINA_SONG_OATH, OCARINA_SONG_SARIAS,
+ OCARINA_SONG_TIME, OCARINA_SONG_HEALING, OCARINA_SONG_EPONAS,
+ OCARINA_SONG_SOARING, OCARINA_SONG_STORMS, OCARINA_SONG_SUNS,
+ OCARINA_SONG_INVERTED_TIME, OCARINA_SONG_DOUBLE_TIME, OCARINA_SONG_GORON_LULLABY_INTRO,
+};
+
+// bss
+
+s32 sCharTexSize;
+s32 sCharTexScale;
+s32 D_801F6B08;
+
+s16 sOcarinaButtonAPrimR;
+s16 sOcarinaButtonAPrimB;
+s16 sOcarinaButtonAPrimG;
+s16 sOcarinaButtonAEnvR;
+s16 sOcarinaButtonAEnvB;
+s16 sOcarinaButtonAEnvG;
+s16 sOcarinaButtonCPrimR;
+s16 sOcarinaButtonCPrimB;
+s16 sOcarinaButtonCPrimG;
+s16 sOcarinaButtonCEnvR;
+s16 sOcarinaButtonCEnvB;
+s16 sOcarinaButtonCEnvG;
+
+void Message_ResetOcarinaButtonAlphas(void) {
+ sOcarinaButtonIndexBuf[0] = OCARINA_BTN_INVALID;
+ sOcarinaButtonAlphaValues[0] = sOcarinaButtonAlphaValues[1] = sOcarinaButtonAlphaValues[2] =
+ sOcarinaButtonAlphaValues[3] = sOcarinaButtonAlphaValues[4] = sOcarinaButtonAlphaValues[5] =
+ sOcarinaButtonAlphaValues[6] = sOcarinaButtonAlphaValues[7] = sOcarinaButtonAlphaValues[8] = 0;
}
-void func_80147564(PlayState* play) {
+void Message_ResetOcarinaButtonState(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
- msgCtx->unk1204A[0] = 0xBD;
- msgCtx->unk1204A[1] = 0xB8;
- msgCtx->unk1204A[2] = 0xB3;
- msgCtx->unk1204A[3] = 0xAE;
- msgCtx->unk1204A[4] = 0xA9;
- func_80147520();
- D_801F6B0C = 0x50;
- D_801F6B10 = 0x96;
- D_801F6B0E = 0xFF;
- D_801F6B12 = 0xA;
- D_801F6B16 = 0xA;
- D_801F6B14 = 0xA;
- D_801F6B18 = 0xFF;
- D_801F6B1C = 0xFF;
- D_801F6B1A = 0x32;
- D_801F6B1E = 0xA;
- D_801F6B22 = 0xA;
- D_801F6B20 = 0xA;
+ msgCtx->ocarinaButtonsPosY[OCARINA_BTN_A] = 189;
+ msgCtx->ocarinaButtonsPosY[OCARINA_BTN_C_DOWN] = 184;
+ msgCtx->ocarinaButtonsPosY[OCARINA_BTN_C_RIGHT] = 179;
+ msgCtx->ocarinaButtonsPosY[OCARINA_BTN_C_LEFT] = 174;
+ msgCtx->ocarinaButtonsPosY[OCARINA_BTN_C_UP] = 169;
+
+ Message_ResetOcarinaButtonAlphas();
+
+ sOcarinaButtonAPrimR = 80;
+ sOcarinaButtonAPrimG = 150;
+ sOcarinaButtonAPrimB = 255;
+ sOcarinaButtonAEnvR = 10;
+ sOcarinaButtonAEnvG = 10;
+ sOcarinaButtonAEnvB = 10;
+ sOcarinaButtonCPrimR = 255;
+ sOcarinaButtonCPrimG = 255;
+ sOcarinaButtonCPrimB = 50;
+ sOcarinaButtonCEnvR = 10;
+ sOcarinaButtonCEnvG = 10;
+ sOcarinaButtonCEnvB = 10;
}
s32 Message_ShouldAdvance(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
Input* controller = CONTROLLER1(&play->state);
- if ((msgCtx->unk12020 == 0x10) || (msgCtx->unk12020 == 0x11)) {
+ if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_10) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_11)) {
if (CHECK_BTN_ALL(controller->press.button, BTN_A)) {
- play_sound(NA_SE_SY_MESSAGE_PASS);
+ Audio_PlaySfx(NA_SE_SY_MESSAGE_PASS);
}
return CHECK_BTN_ALL(controller->press.button, BTN_A);
} else {
if (CHECK_BTN_ALL(controller->press.button, BTN_A) || CHECK_BTN_ALL(controller->press.button, BTN_B) ||
CHECK_BTN_ALL(controller->press.button, BTN_CUP)) {
- play_sound(NA_SE_SY_MESSAGE_PASS);
+ Audio_PlaySfx(NA_SE_SY_MESSAGE_PASS);
}
return CHECK_BTN_ALL(controller->press.button, BTN_A) || CHECK_BTN_ALL(controller->press.button, BTN_B) ||
CHECK_BTN_ALL(controller->press.button, BTN_CUP);
@@ -91,7 +154,7 @@ s32 Message_ShouldAdvanceSilent(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
Input* controller = CONTROLLER1(&play->state);
- if (msgCtx->unk12020 == 0x10 || msgCtx->unk12020 == 0x11) {
+ if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_10) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_11)) {
return CHECK_BTN_ALL(controller->press.button, BTN_A);
} else {
return CHECK_BTN_ALL(controller->press.button, BTN_A) || CHECK_BTN_ALL(controller->press.button, BTN_B) ||
@@ -99,82 +162,622 @@ s32 Message_ShouldAdvanceSilent(PlayState* play) {
}
}
-void func_801477B4(PlayState* play) {
+void Message_CloseTextbox(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
if (play->msgCtx.msgLength != 0) {
msgCtx->stateTimer = 2;
- msgCtx->msgMode = 0x43;
- msgCtx->unk12020 = 0;
- play_sound(NA_SE_PL_WALK_GROUND - SFX_FLAG);
+ msgCtx->msgMode = MSGMODE_TEXT_CLOSING;
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_00;
+ Audio_PlaySfx(NA_SE_NONE);
}
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80147818.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80147F18.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80148558.s")
-
-#ifdef NON_MATCHING
-void func_80148B98(PlayState* play, u8 arg1) {
- static s16 held = 0;
+void Message_DrawTextboxIcon(PlayState* play, Gfx** gfxP, s16 x, s16 y) {
+ static Color_RGB16 sIconPrimColors[] = {
+ { 0, 80, 200 },
+ { 50, 130, 255 },
+ };
+ static Color_RGB16 sIconEnvColors[] = {
+ { 0, 0, 0 },
+ { 0, 130, 255 },
+ };
+ static s16 sIconPrimR = 0;
+ static s16 sIconPrimG = 80;
+ static s16 sIconPrimB = 200;
+ static s16 sIconFlashTimer = 12;
+ static s16 sIconFlashColorIndex = 0;
+ static s16 sIconEnvR = 0;
+ static s16 sIconEnvG = 0;
+ static s16 sIconEnvB = 0;
+ Gfx* gfx;
MessageContext* msgCtx = &play->msgCtx;
- Input* curInput = CONTROLLER1(&play->state);
+ Font* font = &msgCtx->font;
+ s16 primR;
+ s16 primG;
+ s16 primB;
+ s16 envR;
+ s16 envG;
+ s16 envB;
+ u8* iconTexture = msgCtx->font.iconBuf;
- if ((curInput->rel.stick_y > 29) && held == 0) {
- held = 1;
+ gfx = *gfxP;
+
+ if (!msgCtx->textIsCredits) {
+ primR = ABS_ALT(sIconPrimR - sIconPrimColors[sIconFlashColorIndex].r) / sIconFlashTimer;
+ primG = ABS_ALT(sIconPrimG - sIconPrimColors[sIconFlashColorIndex].g) / sIconFlashTimer;
+ primB = ABS_ALT(sIconPrimB - sIconPrimColors[sIconFlashColorIndex].b) / sIconFlashTimer;
+
+ if (sIconPrimR >= sIconPrimColors[sIconFlashColorIndex].r) {
+ sIconPrimR -= primR;
+ } else {
+ sIconPrimR += primR;
+ }
+
+ if (sIconPrimG >= sIconPrimColors[sIconFlashColorIndex].g) {
+ sIconPrimG -= primG;
+ } else {
+ sIconPrimG += primG;
+ }
+
+ if (sIconPrimB >= sIconPrimColors[sIconFlashColorIndex].b) {
+ sIconPrimB -= primB;
+ } else {
+ sIconPrimB += primB;
+ }
+
+ envR = ABS_ALT(sIconEnvR - sIconEnvColors[sIconFlashColorIndex].r) / sIconFlashTimer;
+ envG = ABS_ALT(sIconEnvG - sIconEnvColors[sIconFlashColorIndex].g) / sIconFlashTimer;
+ envB = ABS_ALT(sIconEnvB - sIconEnvColors[sIconFlashColorIndex].b) / sIconFlashTimer;
+
+ if (sIconEnvR >= sIconEnvColors[sIconFlashColorIndex].r) {
+ sIconEnvR -= envR;
+ } else {
+ sIconEnvR += envR;
+ }
+
+ if (sIconEnvG >= sIconEnvColors[sIconFlashColorIndex].g) {
+ sIconEnvG -= envG;
+ } else {
+ sIconEnvG += envG;
+ }
+
+ if (sIconEnvB >= sIconEnvColors[sIconFlashColorIndex].b) {
+ sIconEnvB -= envB;
+ } else {
+ sIconEnvB += envB;
+ }
+
+ sIconFlashTimer--;
+ if (sIconFlashTimer == 0) {
+ sIconPrimR = sIconPrimColors[sIconFlashColorIndex].r;
+ sIconPrimG = sIconPrimColors[sIconFlashColorIndex].g;
+ sIconPrimB = sIconPrimColors[sIconFlashColorIndex].b;
+ sIconEnvR = sIconEnvColors[sIconFlashColorIndex].r;
+ sIconEnvG = sIconEnvColors[sIconFlashColorIndex].g;
+ sIconEnvB = sIconEnvColors[sIconFlashColorIndex].b;
+ sIconFlashTimer = 12;
+ sIconFlashColorIndex ^= 1;
+ }
+
+ gDPPipeSync(gfx++);
+ gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(gfx++, 0, 0, sIconPrimR, sIconPrimG, sIconPrimB, 255);
+ gDPSetEnvColor(gfx++, sIconEnvR, sIconEnvG, sIconEnvB, 255);
+
+ if (!play->pauseCtx.bombersNotebookOpen) {
+ gDPLoadTextureBlock_4b(gfx++, iconTexture, 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);
+ gSPTextureRectangle(gfx++, x << 2, y << 2, (x + sCharTexSize) << 2, (y + sCharTexSize) << 2,
+ G_TX_RENDERTILE, 0, 0, sCharTexScale, sCharTexScale);
+ }
+
+ msgCtx->stateTimer++;
+ *gfxP = gfx;
+ }
+}
+
+void func_80147F18(PlayState* play, Gfx** gfxP, s16 arg2, s16 arg3) {
+ static Color_RGB16 D_801CFD10[] = {
+ { 0, 80, 200 },
+ { 50, 130, 255 },
+ };
+ static Color_RGB16 D_801CFD1C[] = {
+ { 0, 0, 0 },
+ { 0, 130, 255 },
+ };
+ static s16 D_801CFD28 = 0;
+ static s16 D_801CFD2C = 80;
+ static s16 D_801CFD30 = 200;
+ static s16 D_801CFD34 = 12;
+ static s16 D_801CFD38 = 0;
+ static s16 D_801CFD3C = 0;
+ static s16 D_801CFD40 = 0;
+ static s16 D_801CFD44 = 0;
+ Gfx* gfx;
+ MessageContext* msgCtx = &play->msgCtx;
+ s16 primR;
+ s16 primG;
+ s16 primB;
+ s16 envR;
+ s16 envG;
+ s16 envB;
+
+ gfx = *gfxP;
+
+ if (!msgCtx->textIsCredits) {
+ primR = ABS_ALT(D_801CFD28 - D_801CFD10[D_801CFD38].r) / D_801CFD34;
+ primG = ABS_ALT(D_801CFD2C - D_801CFD10[D_801CFD38].g) / D_801CFD34;
+ primB = ABS_ALT(D_801CFD30 - D_801CFD10[D_801CFD38].b) / D_801CFD34;
+
+ if (D_801CFD28 >= D_801CFD10[D_801CFD38].r) {
+ D_801CFD28 -= primR;
+ } else {
+ D_801CFD28 += primR;
+ }
+
+ if (D_801CFD2C >= D_801CFD10[D_801CFD38].g) {
+ D_801CFD2C -= primG;
+ } else {
+ D_801CFD2C += primG;
+ }
+
+ if (D_801CFD30 >= D_801CFD10[D_801CFD38].b) {
+ D_801CFD30 -= primB;
+ } else {
+ D_801CFD30 += primB;
+ }
+
+ envR = ABS_ALT(D_801CFD3C - D_801CFD1C[D_801CFD38].r) / D_801CFD34;
+ envG = ABS_ALT(D_801CFD40 - D_801CFD1C[D_801CFD38].g) / D_801CFD34;
+ envB = ABS_ALT(D_801CFD44 - D_801CFD1C[D_801CFD38].b) / D_801CFD34;
+
+ if (D_801CFD3C >= D_801CFD1C[D_801CFD38].r) {
+ D_801CFD3C -= envR;
+ } else {
+ D_801CFD3C += envR;
+ }
+
+ if (D_801CFD40 >= D_801CFD1C[D_801CFD38].g) {
+ D_801CFD40 -= envG;
+ } else {
+ D_801CFD40 += envG;
+ }
+
+ if (D_801CFD44 >= D_801CFD1C[D_801CFD38].b) {
+ D_801CFD44 -= envB;
+ } else {
+ D_801CFD44 += envB;
+ }
+
+ D_801CFD34--;
+ if (D_801CFD34 == 0) {
+ D_801CFD28 = D_801CFD10[D_801CFD38].r;
+ D_801CFD2C = D_801CFD10[D_801CFD38].g;
+ D_801CFD30 = D_801CFD10[D_801CFD38].b;
+ D_801CFD3C = D_801CFD1C[D_801CFD38].r;
+ D_801CFD40 = D_801CFD1C[D_801CFD38].g;
+ D_801CFD44 = D_801CFD1C[D_801CFD38].b;
+ D_801CFD34 = 12;
+ D_801CFD38 ^= 1;
+ }
+
+ gDPPipeSync(gfx++);
+ gDPSetRenderMode(gfx++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
+ gDPSetCombineMode(gfx++, G_CC_PRIMITIVE, G_CC_PRIMITIVE);
+ gDPSetPrimColor(gfx++, 0, 0, D_801CFD28, D_801CFD2C, D_801CFD30, 120);
+ gDPFillRectangle(gfx++, arg2 + 3, arg3, arg2 + 17, arg3 + 11);
+ gDPFillRectangle(gfx++, arg2 + 6, arg3 - 2, arg2 + 14, arg3 + 13);
+ gDPPipeSync(gfx++);
+
+ msgCtx->stateTimer++;
+ *gfxP = gfx++;
+ }
+}
+
+void func_80148558(PlayState* play, Gfx** gfxP, s16 arg2, s16 arg3) {
+ static Color_RGB16 D_801CFD48[] = {
+ { 0, 80, 200 },
+ { 50, 130, 255 },
+ };
+ static Color_RGB16 D_801CFD54[] = {
+ { 0, 0, 0 },
+ { 0, 130, 255 },
+ };
+ static s16 D_801CFD60 = 0;
+ static s16 D_801CFD64 = 80;
+ static s16 D_801CFD68 = 200;
+ static s16 D_801CFD6C = 12;
+ static s16 D_801CFD70 = 0;
+ static s16 D_801CFD74 = 0;
+ static s16 D_801CFD78 = 0;
+ static s16 D_801CFD7C = 0;
+ Gfx* gfx;
+ MessageContext* msgCtx = &play->msgCtx;
+ s16 primR;
+ s16 primG;
+ s16 primB;
+ s16 envR;
+ s16 envG;
+ s16 envB;
+
+ gfx = *gfxP;
+
+ if (!msgCtx->textIsCredits) {
+ primR = ABS_ALT(D_801CFD60 - D_801CFD48[D_801CFD70].r) / D_801CFD6C;
+ primG = ABS_ALT(D_801CFD64 - D_801CFD48[D_801CFD70].g) / D_801CFD6C;
+ primB = ABS_ALT(D_801CFD68 - D_801CFD48[D_801CFD70].b) / D_801CFD6C;
+
+ if (D_801CFD60 >= D_801CFD48[D_801CFD70].r) {
+ D_801CFD60 -= primR;
+ } else {
+ D_801CFD60 += primR;
+ }
+
+ if (D_801CFD64 >= D_801CFD48[D_801CFD70].g) {
+ D_801CFD64 -= primG;
+ } else {
+ D_801CFD64 += primG;
+ }
+
+ if (D_801CFD68 >= D_801CFD48[D_801CFD70].b) {
+ D_801CFD68 -= primB;
+ } else {
+ D_801CFD68 += primB;
+ }
+
+ envR = ABS_ALT(D_801CFD74 - D_801CFD54[D_801CFD70].r) / D_801CFD6C;
+ envG = ABS_ALT(D_801CFD78 - D_801CFD54[D_801CFD70].g) / D_801CFD6C;
+ envB = ABS_ALT(D_801CFD7C - D_801CFD54[D_801CFD70].b) / D_801CFD6C;
+
+ if (D_801CFD74 >= D_801CFD54[D_801CFD70].r) {
+ D_801CFD74 -= envR;
+ } else {
+ D_801CFD74 += envR;
+ }
+
+ if (D_801CFD78 >= D_801CFD54[D_801CFD70].g) {
+ D_801CFD78 -= envG;
+ } else {
+ D_801CFD78 += envG;
+ }
+
+ if (D_801CFD7C >= D_801CFD54[D_801CFD70].b) {
+ D_801CFD7C -= envB;
+ } else {
+ D_801CFD7C += envB;
+ }
+
+ D_801CFD6C--;
+ if (D_801CFD6C == 0) {
+ D_801CFD60 = D_801CFD48[D_801CFD70].r;
+ D_801CFD64 = D_801CFD48[D_801CFD70].g;
+ D_801CFD68 = D_801CFD48[D_801CFD70].b;
+ D_801CFD74 = D_801CFD54[D_801CFD70].r;
+ D_801CFD78 = D_801CFD54[D_801CFD70].g;
+ D_801CFD7C = D_801CFD54[D_801CFD70].b;
+ D_801CFD6C = 12;
+ D_801CFD70 ^= 1;
+ }
+
+ gDPPipeSync(gfx++);
+ gDPSetRenderMode(gfx++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
+ gDPSetCombineMode(gfx++, G_CC_PRIMITIVE, G_CC_PRIMITIVE);
+ gDPSetPrimColor(gfx++, 0, 0, D_801CFD60, D_801CFD64, D_801CFD68, 120);
+ gDPFillRectangle(gfx++, arg2 + 3, arg3, arg2 + 29, arg3 + 11);
+ gDPFillRectangle(gfx++, arg2 + 6, arg3 - 2, arg2 + 26, arg3 + 13);
+ gDPPipeSync(gfx++);
+
+ msgCtx->stateTimer++;
+ *gfxP = gfx++;
+ }
+}
+
+void Message_HandleChoiceSelection(PlayState* play, u8 numChoices) {
+ static s16 sAnalogStickHeld = false;
+ MessageContext* msgCtx = &play->msgCtx;
+ Input* input = CONTROLLER1(&play->state);
+
+ if ((input->rel.stick_y >= 30) && !sAnalogStickHeld) {
+ sAnalogStickHeld = true;
msgCtx->choiceIndex--;
if (msgCtx->choiceIndex > 128) {
msgCtx->choiceIndex = 0;
} else {
- play_sound(NA_SE_SY_CURSOR);
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
}
- return;
- } else if ((curInput->rel.stick_y < -29) && held == 0) {
- held = 1;
+ } else if ((input->rel.stick_y <= -30) && !sAnalogStickHeld) {
+ sAnalogStickHeld = true;
msgCtx->choiceIndex++;
- if (msgCtx->choiceIndex > arg1) {
- msgCtx->choiceIndex = arg1;
+ if (msgCtx->choiceIndex > numChoices) {
+ msgCtx->choiceIndex = numChoices;
} else {
- play_sound(NA_SE_SY_CURSOR);
- }
- return;
- } else {
- if (ABS_ALT(curInput->rel.stick_y) < 30) {
- held = 0;
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
}
+ } else if (ABS_ALT(input->rel.stick_y) < 30) {
+ sAnalogStickHeld = false;
}
}
-#else
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80148B98.s")
-#endif
-void func_80148CBC(PlayState* play, UNK_PTR puParm2, u8 arg2) {
+void func_80148CBC(PlayState* play, Gfx** gfxP, u8 arg2) {
MessageContext* msgCtx = &play->msgCtx;
- msgCtx->unk11FF4 = 0x30;
+ msgCtx->textPosX = 48;
if (arg2 == 1) {
- msgCtx->unk11FF6 = msgCtx->unk11FFE[1 + msgCtx->choiceIndex];
+ msgCtx->textPosY = msgCtx->unk11FFE[1 + msgCtx->choiceIndex];
} else {
- msgCtx->unk11FF6 = msgCtx->unk11FFE[msgCtx->choiceIndex];
+ msgCtx->textPosY = msgCtx->unk11FFE[msgCtx->choiceIndex];
}
- func_80147818(play, puParm2, msgCtx->unk11FF4, msgCtx->unk11FF6);
+ Message_DrawTextboxIcon(play, gfxP, msgCtx->textPosX, msgCtx->textPosY);
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80148D64.s")
+void func_80148D64(PlayState* play) {
+ static s16 sAnalogStickHeld = false;
+ MessageContext* msgCtx = &play->msgCtx;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80149048.s")
+ if (play->msgCtx.stickAdjY <= -30) {
+ msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2]--;
+ if (msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] < '0') {
+ msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] = '9';
+ }
+ Font_LoadCharNES(play, msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2],
+ msgCtx->unk120C4 + (msgCtx->unk120C2 << 7));
+ Audio_PlaySfx(NA_SE_SY_RUPY_COUNT);
+ } else if (msgCtx->stickAdjY >= 30) {
+ msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2]++;
+ if (msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] > '9') {
+ msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] = '0';
+ }
+ Font_LoadCharNES(play, msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2],
+ msgCtx->unk120C4 + (msgCtx->unk120C2 << 7));
+ Audio_PlaySfx(NA_SE_SY_RUPY_COUNT);
+ } else if ((msgCtx->stickAdjX >= 30) && !sAnalogStickHeld) {
+ sAnalogStickHeld = true;
+ msgCtx->unk120C2++;
+ if (msgCtx->unk120C2 > 2) {
+ msgCtx->unk120C2 = 2;
+ } else {
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
+ }
+ } else if ((msgCtx->stickAdjX <= -30) && !sAnalogStickHeld) {
+ sAnalogStickHeld = true;
+ msgCtx->unk120C2--;
+ if (msgCtx->unk120C2 < 0) {
+ msgCtx->unk120C2 = 0;
+ } else {
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
+ }
+ } else {
+ sAnalogStickHeld = false;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_801491DC.s")
+ msgCtx->bankRupeesSelected = (msgCtx->decodedBuffer.schar[msgCtx->unk120C0] - '0') * 100;
+ msgCtx->bankRupeesSelected += (msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + 1] - '0') * 10;
+ msgCtx->bankRupeesSelected += msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + 2] - '0';
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80149454.s")
+void func_80149048(PlayState* play) {
+ MessageContext* msgCtx = &play->msgCtx;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_801496C8.s")
+ if (msgCtx->stickAdjY <= -30) {
+ msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2]--;
+ if (msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] < '0') {
+ msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] = '9';
+ }
+ Font_LoadCharNES(play, msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2],
+ msgCtx->unk120C4 + (msgCtx->unk120C2 << 7));
+ Audio_PlaySfx(NA_SE_SY_RUPY_COUNT);
+ } else if (msgCtx->stickAdjY >= 30) {
+ msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2]++;
+ if (msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] > '9') {
+ msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] = '0';
+ }
+ Font_LoadCharNES(play, msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2],
+ msgCtx->unk120C4 + (msgCtx->unk120C2 << 7));
+ Audio_PlaySfx(NA_SE_SY_RUPY_COUNT);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8014995C.s")
+ msgCtx->bankRupeesSelected = (msgCtx->decodedBuffer.schar[msgCtx->unk120C0] - '0') * 10;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80149C18.s")
+void func_801491DC(PlayState* play) {
+ static s16 sAnalogStickHeld = false;
+ MessageContext* msgCtx = &play->msgCtx;
+
+ if (msgCtx->stickAdjY <= -30) {
+ msgCtx->unk12054[msgCtx->unk120C2]--;
+ if (msgCtx->unk12054[msgCtx->unk120C2] <= 0) {
+ msgCtx->unk12054[msgCtx->unk120C2] = 5;
+ }
+ msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] = msgCtx->unk12054[msgCtx->unk120C2] + '0';
+ Font_LoadCharNES(play, msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2],
+ msgCtx->unk120C4 + (msgCtx->unk120C2 << 7));
+ Audio_PlaySfx(NA_SE_SY_RUPY_COUNT);
+ } else if (msgCtx->stickAdjY >= 30) {
+ msgCtx->unk12054[msgCtx->unk120C2]++;
+ if (msgCtx->unk12054[msgCtx->unk120C2] > 5) {
+ msgCtx->unk12054[msgCtx->unk120C2] = 1;
+ }
+ msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] = msgCtx->unk12054[msgCtx->unk120C2] + '0';
+ Font_LoadCharNES(play, msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2],
+ msgCtx->unk120C4 + (msgCtx->unk120C2 << 7));
+ Audio_PlaySfx(NA_SE_SY_RUPY_COUNT);
+ } else if ((msgCtx->stickAdjX >= 30) && !sAnalogStickHeld) {
+ sAnalogStickHeld = true;
+ msgCtx->unk120C2++;
+ if (msgCtx->unk120C2 > 4) {
+ msgCtx->unk120C2 = 4;
+ } else {
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
+ }
+ } else if ((msgCtx->stickAdjX <= -30) && !sAnalogStickHeld) {
+ sAnalogStickHeld = true;
+ msgCtx->unk120C2--;
+ if (msgCtx->unk120C2 < 0) {
+ msgCtx->unk120C2 = 0;
+ } else {
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
+ }
+ } else {
+ sAnalogStickHeld = false;
+ }
+}
+
+void func_80149454(PlayState* play) {
+ static s16 sAnalogStickHeld = false;
+ MessageContext* msgCtx = &play->msgCtx;
+
+ if (msgCtx->stickAdjY <= -30) {
+ msgCtx->unk12054[msgCtx->unk120C2]--;
+ if (msgCtx->unk12054[msgCtx->unk120C2] < 0) {
+ msgCtx->unk12054[msgCtx->unk120C2] = 9;
+ }
+ msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] = msgCtx->unk12054[msgCtx->unk120C2] + '0';
+ Font_LoadCharNES(play, msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2],
+ msgCtx->unk120C4 + (msgCtx->unk120C2 << 7));
+ Audio_PlaySfx(NA_SE_SY_RUPY_COUNT);
+ } else if (msgCtx->stickAdjY >= 30) {
+ msgCtx->unk12054[msgCtx->unk120C2]++;
+ if (msgCtx->unk12054[msgCtx->unk120C2] > 9) {
+ msgCtx->unk12054[msgCtx->unk120C2] = 0;
+ }
+ msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] = msgCtx->unk12054[msgCtx->unk120C2] + '0';
+ Font_LoadCharNES(play, msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2],
+ msgCtx->unk120C4 + (msgCtx->unk120C2 << 7));
+ Audio_PlaySfx(NA_SE_SY_RUPY_COUNT);
+ } else if ((msgCtx->stickAdjX >= 30) && !sAnalogStickHeld) {
+ sAnalogStickHeld = true;
+ msgCtx->unk120C2++;
+ if (msgCtx->unk120C2 > 2) {
+ msgCtx->unk120C2 = 2;
+ } else {
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
+ }
+ } else if ((msgCtx->stickAdjX <= -30) && !sAnalogStickHeld) {
+ sAnalogStickHeld = true;
+ msgCtx->unk120C2--;
+ if (msgCtx->unk120C2 < 0) {
+ msgCtx->unk120C2 = 0;
+ } else {
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
+ }
+ } else {
+ sAnalogStickHeld = false;
+ }
+}
+
+void func_801496C8(PlayState* play) {
+ static s16 sAnalogStickHeld = false;
+ MessageContext* msgCtx = &play->msgCtx;
+
+ if (play->msgCtx.stickAdjY <= -30) {
+ msgCtx->unk12054[msgCtx->unk120C2]--;
+ if (msgCtx->unk12054[msgCtx->unk120C2] < 0) {
+ msgCtx->unk12054[msgCtx->unk120C2] = 3;
+ }
+ msgCtx->decodedBuffer.wchar[msgCtx->unk120C0 + msgCtx->unk120C2] = msgCtx->unk12054[msgCtx->unk120C2] + 0x824F;
+ Font_LoadChar(play, msgCtx->decodedBuffer.wchar[msgCtx->unk120C0 + msgCtx->unk120C2],
+ msgCtx->unk120C4 + (msgCtx->unk120C2 << 7));
+ Audio_PlaySfx(NA_SE_SY_RUPY_COUNT);
+ } else if (msgCtx->stickAdjY >= 30) {
+ msgCtx->unk12054[msgCtx->unk120C2]++;
+ if (msgCtx->unk12054[msgCtx->unk120C2] >= 4) {
+ msgCtx->unk12054[msgCtx->unk120C2] = 0;
+ }
+ msgCtx->decodedBuffer.wchar[msgCtx->unk120C0 + msgCtx->unk120C2] = msgCtx->unk12054[msgCtx->unk120C2] + 0x824F;
+ Font_LoadChar(play, msgCtx->decodedBuffer.wchar[msgCtx->unk120C0 + msgCtx->unk120C2],
+ msgCtx->unk120C4 + (msgCtx->unk120C2 << 7));
+ Audio_PlaySfx(NA_SE_SY_RUPY_COUNT);
+ } else if ((msgCtx->stickAdjX >= 30) && !sAnalogStickHeld) {
+ sAnalogStickHeld = true;
+ msgCtx->unk120C2++;
+ if (msgCtx->unk120C2 > 5) {
+ msgCtx->unk120C2 = 5;
+ } else {
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
+ }
+ } else if ((msgCtx->stickAdjX <= -30) && !sAnalogStickHeld) {
+ sAnalogStickHeld = true;
+ msgCtx->unk120C2--;
+ if (msgCtx->unk120C2 < 0) {
+ msgCtx->unk120C2 = 0;
+ } else {
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
+ }
+ } else {
+ sAnalogStickHeld = false;
+ }
+}
+
+void Message_DrawTextChar(PlayState* play, TexturePtr texture, Gfx** gfxP) {
+ MessageContext* msgCtx = &play->msgCtx;
+ Gfx* gfx = *gfxP;
+ s16 x = msgCtx->textPosX;
+ s16 y = msgCtx->textPosY;
+
+ gDPPipeSync(gfx++);
+
+ gDPLoadTextureBlock_4b(gfx++, 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);
+
+ if ((msgCtx->textBoxType != TEXTBOX_TYPE_5) && (msgCtx->textBoxType != TEXTBOX_TYPE_D) &&
+ !play->pauseCtx.bombersNotebookOpen) {
+ gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, msgCtx->textColorAlpha);
+ gSPTextureRectangle(gfx++, (x + 1) << 2, (y + 1) << 2, (x + sCharTexSize + 1) << 2, (y + sCharTexSize + 1) << 2,
+ G_TX_RENDERTILE, 0, 0, sCharTexScale, sCharTexScale);
+ gDPPipeSync(gfx++);
+ }
+
+ gDPSetPrimColor(gfx++, 0, 0, msgCtx->textColorR, msgCtx->textColorG, msgCtx->textColorB, msgCtx->textColorAlpha);
+ gSPTextureRectangle(gfx++, x << 2, y << 2, (x + sCharTexSize) << 2, (y + sCharTexSize) << 2, G_TX_RENDERTILE, 0, 0,
+ sCharTexScale, sCharTexScale);
+ *gfxP = gfx++;
+}
+
+s16 sTextboxWidth = 256;
+s16 sTextboxHeight = 64;
+s16 sTextboxTexWidth = 1024;
+s16 sTextboxTexHeight = 1024;
+
+f32 D_801CFDA4[] = { 0.6f, 0.75f, 0.9f, 1.0f, 1.05f, 1.1f, 1.05f, 1.0f, 1.0f };
+f32 D_801CFDC8[] = { 0.6f, 0.75f, 0.9f, 1.0f, 1.05f, 1.1f, 1.05f, 1.0f, 1.0f };
+
+// resizes textboxes when opening them
+void Message_GrowTextbox(PlayState* play) {
+ MessageContext* msgCtx = &play->msgCtx;
+
+ if (!play->pauseCtx.bombersNotebookOpen) {
+ sTextboxWidth = D_801CFDA4[msgCtx->stateTimer] * 256.0f;
+ sTextboxTexWidth = 1024.0f / D_801CFDA4[msgCtx->stateTimer];
+ sTextboxHeight = D_801CFDC8[msgCtx->stateTimer] * 64.0f;
+ sTextboxTexHeight = 1024.0f / D_801CFDC8[msgCtx->stateTimer];
+ msgCtx->textboxY = msgCtx->textboxYTarget + ((64 - sTextboxHeight) / 2);
+ msgCtx->textboxColorAlphaCurrent += msgCtx->textboxColorAlphaTarget / 8;
+ msgCtx->stateTimer++;
+ } else {
+ msgCtx->stateTimer = 8;
+ sTextboxWidth = 512;
+ sTextboxTexWidth = 512;
+ sTextboxHeight = 89;
+ sTextboxTexHeight = 731;
+ msgCtx->textboxY = msgCtx->textboxYTarget + ((90 - sTextboxHeight) / 2);
+ }
+
+ if (msgCtx->stateTimer == 8) {
+ // Reached the end
+ msgCtx->textboxX = msgCtx->textboxXTarget;
+ msgCtx->textboxY = msgCtx->textboxYTarget;
+ msgCtx->msgMode = MSGMODE_TEXT_STARTING;
+ msgCtx->textboxColorAlphaCurrent = msgCtx->textboxColorAlphaTarget;
+ }
+
+ if (!play->pauseCtx.bombersNotebookOpen) {
+ msgCtx->textboxX = msgCtx->textboxXTarget + ((256 - sTextboxWidth) / 2);
+ } else {
+ msgCtx->textboxX = msgCtx->textboxXTarget + ((512 - sTextboxWidth) / 2);
+ }
+}
void Message_FindMessage(PlayState* play, u16 textId) {
MessageContext* msgCtx = &play->msgCtx;
@@ -204,13 +807,1075 @@ void Message_FindMessage(PlayState* play, u16 textId) {
font->messageEnd = nextSegment - foundSegment;
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80149F74.s")
+Color_RGB8 D_801CFDEC[] = {
+ { 0, 255, 0 }, { 0, 0, 255 }, { 255, 255, 255 }, { 255, 0, 0 },
+ { 255, 0, 255 }, { 255, 255, 255 }, { 255, 100, 0 }, { 0, 0, 0 },
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8014AAD0.s")
+s16 D_801CFE04[] = {
+ 150, // ITEM_SONG_SONATA
+ 255, // ITEM_SONG_LULLABY
+ 100, // ITEM_SONG_NOVA
+ 255, // ITEM_SONG_ELEGY
+ 255, // ITEM_SONG_OATH
+ 255, // ITEM_SONG_SARIA
+ 255, // ITEM_SONG_TIME
+ 255, // ITEM_SONG_HEALING
+ 255, // ITEM_SONG_EPONA
+ 255, // ITEM_SONG_SOARING
+ 255, // ITEM_SONG_STORMS
+ 255 // ITEM_SONG_SUN
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8014ADBC.s")
+};
+s16 D_801CFE1C[] = {
+ 255, // ITEM_SONG_SONATA
+ 80, // ITEM_SONG_LULLABY
+ 150, // ITEM_SONG_NOVA
+ 160, // ITEM_SONG_ELEGY
+ 100, // ITEM_SONG_OATH
+ 240, // ITEM_SONG_SARIA
+ 255, // ITEM_SONG_TIME
+ 255, // ITEM_SONG_HEALING
+ 255, // ITEM_SONG_EPONA
+ 255, // ITEM_SONG_SOARING
+ 255, // ITEM_SONG_STORMS
+ 255 // ITEM_SONG_SUN
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8014C70C.s")
+};
+s16 D_801CFE34[] = {
+ 100, // ITEM_SONG_SONATA
+ 40, // ITEM_SONG_LULLABY
+ 255, // ITEM_SONG_NOVA
+ 0, // ITEM_SONG_ELEGY
+ 255, // ITEM_SONG_OATH
+ 100, // ITEM_SONG_SARIA
+ 255, // ITEM_SONG_TIME
+ 255, // ITEM_SONG_HEALING
+ 255, // ITEM_SONG_EPONA
+ 255, // ITEM_SONG_SOARING
+ 255, // ITEM_SONG_STORMS
+ 255 // ITEM_SONG_SUN
+};
+
+static TexturePtr sStrayFairyIconTextures[] = {
+ gStrayFairyWoodfallIconTex,
+ gStrayFairySnowheadIconTex,
+ gStrayFairyGreatBayIconTex,
+ gStrayFairyStoneTowerIconTex,
+};
+
+static Color_RGB8 sStrayFairyIconPrimColors[] = {
+ { 255, 110, 160 },
+ { 90, 255, 100 },
+ { 120, 255, 255 },
+ { 245, 245, 90 },
+};
+
+static Color_RGB8 sStrayFairyIconEnvColors[] = {
+ { 255, 255, 255 },
+ { 255, 255, 255 },
+ { 255, 255, 255 },
+ { 225, 170, 0 },
+};
+
+void Message_DrawItemIcon(PlayState* play, Gfx** gfxP) {
+ MessageContext* msgCtx = &play->msgCtx;
+ Gfx* gfx = *gfxP;
+ s32 index;
+
+ msgCtx->unk12016 = msgCtx->unk12014;
+
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Audio_PlaySfx(NA_SE_NONE);
+ }
+
+ gDPPipeSync(gfx++);
+ gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, msgCtx->textColorAlpha);
+
+ if (msgCtx->itemId == ITEM_RECOVERY_HEART) {
+ gDPPipeSync(gfx++);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 0, 0, msgCtx->textColorAlpha);
+ gDPSetEnvColor(gfx++, 0, 80, 0, 255);
+ gDPLoadTextureBlock(gfx++, gHeartFullTex, 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);
+ } else if ((msgCtx->itemId >= ITEM_RUPEE_GREEN) && (msgCtx->itemId <= ITEM_RUPEE_HUGE)) {
+ index = msgCtx->itemId - ITEM_RUPEE_GREEN;
+ gDPPipeSync(gfx++);
+ gDPSetPrimColor(gfx++, 0, 0, D_801CFDEC[index].r, D_801CFDEC[index].g, D_801CFDEC[index].b,
+ msgCtx->textColorAlpha);
+ gDPSetEnvColor(gfx++, 0, 80, 0, 255);
+ gDPLoadTextureBlock(gfx++, gRupeeCounterIconTex, 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);
+ } else if (msgCtx->itemId == ITEM_STRAY_FAIRIES) {
+ msgCtx->unk12016 = 0x18;
+ gDPPipeSync(gfx++);
+ gDPSetPrimColor(gfx++, 0, 0, sStrayFairyIconPrimColors[((void)0, gSaveContext.dungeonIndex)].r,
+ sStrayFairyIconPrimColors[((void)0, gSaveContext.dungeonIndex)].g,
+ sStrayFairyIconPrimColors[((void)0, gSaveContext.dungeonIndex)].b, msgCtx->textColorAlpha);
+ gDPSetEnvColor(gfx++, sStrayFairyIconEnvColors[((void)0, gSaveContext.dungeonIndex)].r,
+ sStrayFairyIconEnvColors[((void)0, gSaveContext.dungeonIndex)].g,
+ sStrayFairyIconEnvColors[((void)0, gSaveContext.dungeonIndex)].b, 0);
+ gDPLoadTextureBlock_4b(gfx++, gStrayFairyGlowingCircleIconTex, G_IM_FMT_I, 32, 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);
+ gSPTextureRectangle(gfx++, msgCtx->unk12010 << 2, msgCtx->unk12012 << 2,
+ (msgCtx->unk12010 + msgCtx->unk12014) << 2, (msgCtx->unk12012 + msgCtx->unk12016) << 2,
+ G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, msgCtx->textColorAlpha);
+ gDPLoadTextureBlock(gfx++, sStrayFairyIconTextures[((void)0, gSaveContext.dungeonIndex)], G_IM_FMT_RGBA,
+ G_IM_SIZ_32b, 32, 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 ((msgCtx->itemId >= ITEM_SONG_SONATA) && (msgCtx->itemId <= ITEM_SONG_SUN)) {
+ index = msgCtx->itemId - ITEM_SONG_SONATA;
+ gDPSetPrimColor(gfx++, 0, 0, D_801CFE04[index], D_801CFE1C[index], D_801CFE34[index], msgCtx->textColorAlpha);
+ gDPLoadTextureBlock(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 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);
+ msgCtx->unk12016 = 0x18;
+ } else if (msgCtx->itemId == ITEM_CC) {
+ gDPPipeSync(gfx++);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 0, msgCtx->textColorAlpha);
+ gDPSetEnvColor(gfx++, 0, 0, 0, 255);
+ gDPLoadTextureBlock(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_IA, G_IM_SIZ_8b, 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);
+ } else if (msgCtx->itemId >= ITEM_B8) {
+ gDPLoadTextureBlock(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 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);
+ } else if (msgCtx->itemId >= ITEM_SKULL_TOKEN) {
+ gDPLoadTextureBlock(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_32b, 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);
+ } else {
+ msgCtx->unk12016 = msgCtx->unk12014;
+ gDPLoadTextureBlock(gfx++, msgCtx->textboxSegment + 0x1000, 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);
+ }
+
+ gSPTextureRectangle(gfx++, msgCtx->unk12010 << 2, msgCtx->unk12012 << 2, (msgCtx->unk12010 + msgCtx->unk12014) << 2,
+ (msgCtx->unk12012 + msgCtx->unk12016) << 2, G_TX_RENDERTILE, 0, 0, D_801F6B08, D_801F6B08);
+ gDPPipeSync(gfx++);
+ gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0);
+
+ if (!play->pauseCtx.bombersNotebookOpen) {
+ msgCtx->textPosX += 16;
+ } else {
+ msgCtx->textPosX += 50;
+ }
+ *gfxP = gfx;
+}
+
+void Message_HandleOcarina(PlayState* play) {
+ MessageContext* msgCtx = &play->msgCtx;
+
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ play->msgCtx.ocarinaMode = OCARINA_MODE_ACTIVE;
+ if (msgCtx->ocarinaAction == OCARINA_ACTION_SCARECROW_LONG_RECORDING) {
+ msgCtx->msgMode = MSGMODE_SCARECROW_LONG_RECORDING_START;
+ } else if (msgCtx->ocarinaAction == OCARINA_ACTION_SCARECROW_LONG_DEMONSTRATION) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
+ msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff();
+ msgCtx->ocarinaStaff->pos = 0;
+ sOcarinaButtonIndexBufPos = sOcarinaButtonIndexBufLen = 0;
+ Message_ResetOcarinaButtonState(play);
+ msgCtx->stateTimer = 3;
+ msgCtx->msgMode = MSGMODE_SCARECROW_LONG_DEMONSTRATION;
+ AudioOcarina_SetPlaybackSong(OCARINA_SONG_SCARECROW_LONG + 1, 1);
+ } else if (msgCtx->ocarinaAction == OCARINA_ACTION_SCARECROW_SPAWN_RECORDING) {
+ msgCtx->msgMode = MSGMODE_SCARECROW_SPAWN_RECORDING_START;
+ } else if (msgCtx->ocarinaAction == OCARINA_ACTION_SCARECROW_SPAWN_DEMONSTRATION) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
+ msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff();
+ msgCtx->ocarinaStaff->pos = 0;
+ sOcarinaButtonIndexBufPos = sOcarinaButtonIndexBufLen = 0;
+ Message_ResetOcarinaButtonState(play);
+ msgCtx->stateTimer = 3;
+ msgCtx->msgMode = MSGMODE_SCARECROW_SPAWN_DEMONSTRATION;
+ AudioOcarina_SetPlaybackSong(OCARINA_SONG_SCARECROW_SPAWN + 1, 1);
+ } else if (msgCtx->ocarinaAction == OCARINA_ACTION_37) {
+ msgCtx->msgMode = MSGMODE_2F;
+ } else if (msgCtx->ocarinaAction == OCARINA_ACTION_3A) {
+ msgCtx->msgMode = MSGMODE_32;
+ } else if ((msgCtx->ocarinaAction >= OCARINA_ACTION_TIMED_PROMPT_SONATA) &&
+ (msgCtx->ocarinaAction <= OCARINA_ACTION_TIMED_PROMPT_STORMS)) {
+ msgCtx->msgMode = MSGMODE_35;
+ } else if (((msgCtx->ocarinaAction >= OCARINA_ACTION_DEMONSTRATE_SONATA) &&
+ (msgCtx->ocarinaAction <= OCARINA_ACTION_DEMONSTRATE_GORON_LULLABY_INTRO)) ||
+ (msgCtx->ocarinaAction == OCARINA_ACTION_3B) || (msgCtx->ocarinaAction == OCARINA_ACTION_3C) ||
+ (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_FIRST_HALF) ||
+ (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_FIRST_HALF) ||
+ (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_SECOND_HALF) ||
+ (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_SECOND_HALF)) {
+ msgCtx->msgMode = MSGMODE_SONG_DEMONSTRATION_STARTING;
+ } else if ((msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) ||
+ (msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF) ||
+ (msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) ||
+ (msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_WIND_FISH_GORON) ||
+ (msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_WIND_FISH_ZORA) ||
+ (msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_WIND_FISH_DEKU)) {
+ msgCtx->msgMode = MSGMODE_SONG_PROMPT_STARTING;
+ } else if ((msgCtx->ocarinaAction == OCARINA_ACTION_0) || (msgCtx->ocarinaAction == OCARINA_ACTION_FREE_PLAY) ||
+ (msgCtx->ocarinaAction >= OCARINA_ACTION_CHECK_TIME)) {
+ msgCtx->msgMode = MSGMODE_OCARINA_STARTING;
+ } else {
+ msgCtx->msgMode = MSGMODE_SONG_PROMPT_STARTING;
+ }
+ }
+}
+
+Color_RGB16 D_801CFE74[] = {
+ { 255, 120, 0 }, { 70, 255, 80 }, { 80, 110, 255 }, { 255, 255, 30 },
+ { 90, 180, 255 }, { 210, 100, 255 }, { 170, 170, 170 }, { 255, 130, 30 },
+};
+Color_RGB16 D_801CFEA4[] = {
+ { 255, 60, 60 }, { 70, 255, 80 }, { 80, 90, 255 }, { 255, 255, 50 },
+ { 80, 150, 255 }, { 255, 150, 180 }, { 170, 170, 170 }, { 255, 130, 30 },
+};
+Color_RGB16 D_801CFED4[] = {
+ { 255, 60, 60 }, { 70, 255, 80 }, { 80, 90, 255 }, { 255, 255, 50 },
+ { 80, 150, 255 }, { 255, 150, 180 }, { 180, 180, 200 }, { 255, 130, 30 },
+};
+Color_RGB16 D_801CFF04[] = {
+ { 195, 0, 0 }, { 70, 255, 80 }, { 80, 90, 255 }, { 255, 255, 50 },
+ { 80, 150, 255 }, { 255, 150, 180 }, { 170, 170, 170 }, { 255, 130, 30 },
+};
+Color_RGB16 D_801CFF34[] = {
+ { 255, 60, 60 }, { 110, 170, 255 }, { 80, 90, 255 }, { 255, 255, 50 },
+ { 80, 150, 255 }, { 255, 150, 180 }, { 170, 170, 170 }, { 255, 130, 30 },
+};
+
+u8 D_801CFF64[] = { 2, 1, 3, 6, 6, 6, 3, 3, 3, 3, 1, 6 };
+
+#define MESSAGE_ITEM_NONE 9999
+
+void Message_DrawTextDefault(PlayState* play, Gfx** gfxP) {
+ MessageContext* msgCtx = &play->msgCtx;
+ u16 j;
+ Font* font = &play->msgCtx.font;
+ u16 i;
+ u16 charTexIndex;
+ Gfx* gfx = *gfxP;
+ u16 character;
+ s16 sp130;
+ s16 sp12E;
+ s16 sp12C;
+ s16 sp12A;
+ u16 lookAheadCharacter;
+
+ play->msgCtx.textPosX = play->msgCtx.unk11F1A[0] + play->msgCtx.unk11FF8;
+ play->msgCtx.textPosY = play->msgCtx.unk11FFA;
+
+ sp130 = 0;
+ if (play->msgCtx.itemId != MESSAGE_ITEM_NONE) {
+ Message_DrawItemIcon(play, &gfx);
+ }
+ msgCtx->textColorR = msgCtx->unk120C8;
+ msgCtx->textColorG = msgCtx->unk120CA;
+ msgCtx->textColorB = msgCtx->unk120CC;
+
+ charTexIndex = 0;
+
+ for (i = 0; i < msgCtx->textDrawPos; i++) {
+ character = msgCtx->decodedBuffer.wchar[i];
+
+ switch (character) {
+ case 0x2000:
+ if (play->pauseCtx.bombersNotebookOpen || (msgCtx->textBoxType == TEXTBOX_TYPE_D)) {
+ msgCtx->textColorR = msgCtx->textColorG = msgCtx->textColorB = 0;
+ } else if (msgCtx->textBoxType == TEXTBOX_TYPE_5) {
+ msgCtx->textColorR = msgCtx->textColorG = msgCtx->textColorB = 0;
+ } else {
+ msgCtx->textColorR = msgCtx->textColorG = msgCtx->textColorB = 255;
+ }
+ if ((i + 1) == msgCtx->textDrawPos) {
+ msgCtx->textDrawPos++;
+ }
+ break;
+
+ case 0x2001:
+ case 0x2002:
+ case 0x2003:
+ case 0x2004:
+ case 0x2005:
+ case 0x2006:
+ case 0x2007:
+ case 0x2008:
+ if ((msgCtx->msgMode >= MSGMODE_NEW_CYCLE_0) && (msgCtx->msgMode <= MSGMODE_NEW_CYCLE_2) &&
+ (character == 0x2002)) {
+ msgCtx->textDrawPos = msgCtx->decodedTextLen;
+ if (msgCtx->unk120D6) {
+ msgCtx->unk120D4 += 25;
+ if (msgCtx->unk120D4 >= 100) {
+ msgCtx->unk120D6 = false;
+ }
+ } else {
+ msgCtx->unk120D4 -= 25;
+ if (msgCtx->unk120D4 <= -100) {
+ msgCtx->unk120D6 = true;
+ }
+ }
+
+ if (D_801CFE74[(s16)(character - 0x2001)].r + msgCtx->unk120D4 < 0) {
+ msgCtx->textColorR = 0;
+ } else {
+ msgCtx->textColorR = D_801CFE74[(s16)(character - 0x2001)].r + msgCtx->unk120D4;
+ }
+ if (D_801CFE74[(s16)(character - 0x2001)].g + msgCtx->unk120D4 >= 255) {
+ msgCtx->textColorG = D_801CFE74[(s16)(character - 0x2001)].g;
+ } else {
+ msgCtx->textColorG = D_801CFE74[(s16)(character - 0x2001)].g + msgCtx->unk120D4;
+ }
+ if (D_801CFE74[(s16)(character - 0x2001)].b + msgCtx->unk120D4 < 0) {
+ msgCtx->textColorB = 0;
+ } else {
+ msgCtx->textColorB = D_801CFE74[(s16)(character - 0x2001)].b + msgCtx->unk120D4;
+ }
+ } else if (play->pauseCtx.bombersNotebookOpen) {
+ msgCtx->textColorR = D_801CFF34[(s16)(character - 0x2001)].r;
+ msgCtx->textColorG = D_801CFF34[(s16)(character - 0x2001)].g;
+ msgCtx->textColorB = D_801CFF34[(s16)(character - 0x2001)].b;
+ } else if (msgCtx->textBoxType == TEXTBOX_TYPE_1) {
+ msgCtx->textColorR = D_801CFE74[(s16)(character - 0x2001)].r;
+ msgCtx->textColorG = D_801CFE74[(s16)(character - 0x2001)].g;
+ msgCtx->textColorB = D_801CFE74[(s16)(character - 0x2001)].b;
+ } else if (msgCtx->textBoxType == TEXTBOX_TYPE_D) {
+ msgCtx->textColorR = D_801CFF04[(s16)(character - 0x2001)].r;
+ msgCtx->textColorG = D_801CFF04[(s16)(character - 0x2001)].g;
+ msgCtx->textColorB = D_801CFF04[(s16)(character - 0x2001)].b;
+ } else {
+ msgCtx->textColorR = D_801CFEA4[(s16)(character - 0x2001)].r;
+ msgCtx->textColorG = D_801CFEA4[(s16)(character - 0x2001)].g;
+ msgCtx->textColorB = D_801CFEA4[(s16)(character - 0x2001)].b;
+ }
+
+ if ((i + 1) == msgCtx->textDrawPos) {
+ msgCtx->textDrawPos++;
+ }
+ break;
+
+ case 0x20: // ` `
+ msgCtx->textPosX += 6;
+ break;
+
+ case 0xA:
+ msgCtx->textPosY += msgCtx->unk11FFC;
+ // fallthrough
+ case 0xC:
+ sp130++;
+ msgCtx->textPosX = msgCtx->unk11F1A[sp130] + msgCtx->unk11FF8;
+ if (msgCtx->choiceNum == 1) {
+ if (!play->pauseCtx.bombersNotebookOpen) {
+ msgCtx->textPosX += 32;
+ } else {
+ msgCtx->textPosX += 57;
+ }
+ } else if (msgCtx->choiceNum == 2) {
+ if (!play->pauseCtx.bombersNotebookOpen) {
+ msgCtx->textPosX += 22;
+ } else {
+ msgCtx->textPosX += 57;
+ }
+ }
+ continue;
+
+ case 0x9:
+ case 0xB:
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ if (!msgCtx->textboxSkipped) {
+ Audio_PlaySfx(NA_SE_NONE);
+ msgCtx->msgMode = MSGMODE_TEXT_AWAIT_NEXT;
+ Font_LoadMessageBoxEndIcon(font, 0);
+ } else {
+ msgCtx->msgMode = MSGMODE_TEXT_NEXT_MSG;
+ msgCtx->textUnskippable = false;
+ msgCtx->msgBufPos++;
+ }
+ msgCtx->unk120CE = msgCtx->textColorR;
+ msgCtx->unk120D0 = msgCtx->textColorG;
+ msgCtx->unk120D2 = msgCtx->textColorB;
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x101: // MESSAGE_QUICKTEXT_ENABLE
+ if (((i + 1) == msgCtx->textDrawPos) &&
+ ((msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) ||
+ ((msgCtx->msgMode >= MSGMODE_OCARINA_STARTING) && (msgCtx->msgMode <= MSGMODE_26)))) {
+
+ j = i;
+ while (true) {
+ if ((msgCtx->decodedBuffer.wchar[j] != 0x102) && (msgCtx->decodedBuffer.wchar[j] != 0x104) &&
+ (msgCtx->decodedBuffer.wchar[j] != 0x103) && (msgCtx->decodedBuffer.wchar[j] != 0x230) &&
+ (msgCtx->decodedBuffer.wchar[j] != 9) && (msgCtx->decodedBuffer.wchar[j] != 0xB)) {
+ j++;
+ continue;
+ }
+ break;
+ }
+
+ i = j - 1;
+ msgCtx->textDrawPos = i + 1;
+ }
+ break;
+
+ case 0x102: // MESSAGE_QUICKTEXT_DISABLE
+ break;
+
+ case 0x110: // MESSAGE_BOX_BREAK_DELAYED
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->stateTimer = msgCtx->decodedBuffer.wchar[++i];
+ msgCtx->msgMode = MSGMODE_TEXT_DELAYED_BREAK;
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x111:
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ if (msgCtx->unk11F0C == 3) {
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_55;
+ } else {
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_50;
+ }
+ msgCtx->stateTimer = msgCtx->decodedBuffer.wchar[++i];
+ Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 1);
+ if (play->csCtx.state == CS_STATE_IDLE) {
+ func_8011552C(play, DO_ACTION_RETURN);
+ }
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x112:
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_52;
+ msgCtx->stateTimer = msgCtx->decodedBuffer.wchar[++i];
+ Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 1);
+ if (play->csCtx.state == CS_STATE_IDLE) {
+ func_8011552C(play, DO_ACTION_RETURN);
+ }
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x120: // MESSAGE_SFX
+ if (((i + 1) == msgCtx->textDrawPos) && (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING)) {
+ Audio_PlaySfx(msgCtx->decodedBuffer.wchar[i + 1]);
+ }
+ if ((i + 1) == msgCtx->textDrawPos) {
+ msgCtx->textDrawPos++;
+ }
+ i++;
+ break;
+
+ case 0x128:
+ if (((i + 1) == msgCtx->textDrawPos) && (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING)) {
+ msgCtx->msgMode = MSGMODE_9;
+ msgCtx->textDelayTimer = msgCtx->decodedBuffer.wchar[i + 1];
+ }
+ i++;
+ break;
+
+ case 0x130:
+ case 0x131:
+ case 0x132:
+ case 0x133:
+ case 0x134:
+ case 0x135:
+ case 0x136:
+ msgCtx->textDelay = character - 0x130;
+ if ((i + 1) == msgCtx->textDrawPos) {
+ msgCtx->textDrawPos++;
+ }
+ break;
+
+ case 0x201: // MESSAGE_BACKGROUND
+ msgCtx->textPosX = 45;
+
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Audio_PlaySfx(NA_SE_NONE);
+ }
+
+ gDPPipeSync(gfx++);
+ gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, msgCtx->textColorAlpha);
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_I, 96, 48, 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(gfx++, msgCtx->textPosX << 2, (msgCtx->unk12012 + 1) << 2,
+ (msgCtx->textPosX + 96) << 2, (msgCtx->unk12012 + 49) << 2, G_TX_RENDERTILE, 0, 0,
+ 1 << 10, 1 << 10);
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1900, G_IM_FMT_I, 96, 48, 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(gfx++, (msgCtx->textPosX + 96) << 2, (msgCtx->unk12012 + 1) << 2,
+ (msgCtx->textPosX + 193) << 2, (msgCtx->unk12012 + 49) << 2, G_TX_RENDERTILE, 0, 0,
+ 1 << 10, 1 << 10);
+
+ gDPPipeSync(gfx++);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 60, 0, msgCtx->textColorAlpha);
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_I, 96, 48, 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(gfx++, msgCtx->textPosX << 2, msgCtx->unk12012 << 2, (msgCtx->textPosX + 96) << 2,
+ (msgCtx->unk12012 + 48) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1900, G_IM_FMT_I, 96, 48, 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(gfx++, (msgCtx->textPosX + 96) << 2, msgCtx->unk12012 << 2,
+ (msgCtx->textPosX + 192) << 2, (msgCtx->unk12012 + 48) << 2, G_TX_RENDERTILE, 0, 0,
+ 1 << 10, 1 << 10);
+ gDPPipeSync(gfx++);
+ gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0,
+ PRIMITIVE, 0);
+
+ msgCtx->textPosX += 32;
+ break;
+
+ case 0x202:
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_10;
+
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->choiceTextId = msgCtx->currentTextId;
+ msgCtx->stateTimer = 4;
+ Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 2);
+ }
+ break;
+
+ case 0x203:
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_11;
+
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->choiceTextId = msgCtx->currentTextId;
+ msgCtx->stateTimer = 4;
+ Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 2);
+ }
+ break;
+
+ case 0x20C:
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_60;
+
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 1);
+ }
+ break;
+
+ case 0x220:
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_61;
+
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 1);
+ }
+ break;
+
+ case 0x221:
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_62;
+
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 1);
+ }
+ break;
+
+ case 0x222:
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_41;
+ Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 0);
+ Audio_PlaySfx(NA_SE_SY_MESSAGE_END);
+ }
+ break;
+
+ case 0x225:
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_63;
+
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 1);
+ }
+ break;
+
+ case 0x240:
+ case 0x500:
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ if (msgCtx->textBoxType == TEXTBOX_TYPE_3) {
+ Message_HandleOcarina(play);
+ *gfxP = gfx;
+ return;
+ }
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_00) {
+ Audio_PlaySfx(NA_SE_SY_MESSAGE_END);
+ if (character == 0x500) {
+ Font_LoadMessageBoxEndIcon(font, 1);
+ } else {
+ Font_LoadMessageBoxEndIcon(font, 0);
+ }
+ if (play->csCtx.state == CS_STATE_IDLE) {
+ func_8011552C(play, DO_ACTION_RETURN);
+ }
+ } else {
+ Audio_PlaySfx(NA_SE_NONE);
+ }
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x104:
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Audio_PlaySfx(NA_SE_NONE);
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_30;
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x103:
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_40;
+ Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 0);
+ Audio_PlaySfx(NA_SE_SY_MESSAGE_END);
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x230:
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_42;
+ Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 1);
+ Audio_PlaySfx(NA_SE_SY_MESSAGE_END);
+ }
+ *gfxP = gfx;
+ return;
+
+ default:
+ switch (character) {
+ case 0x8169:
+ case 0x8175:
+ msgCtx->textPosX -= (s16)(6.0f * msgCtx->textCharScale);
+ break;
+
+ case 0x8145:
+ msgCtx->textPosX -= (s16)(3.0f * msgCtx->textCharScale);
+ break;
+
+ case 0x8148:
+ case 0x8149:
+ msgCtx->textPosX -= (s16)(2.0f * msgCtx->textCharScale);
+ break;
+
+ default:
+ break;
+ }
+
+ if ((msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) && ((i + 1) == msgCtx->textDrawPos)) {
+ Audio_PlaySfx(NA_SE_NONE);
+ }
+
+ if ((character >= 0x839F) && (character < 0x83AB)) {
+ sp12E = msgCtx->textColorR;
+ sp12C = msgCtx->textColorG;
+ sp12A = msgCtx->textColorB;
+ msgCtx->textColorR = D_801CFED4[(s16)D_801CFF64[character - 0x839F]].r;
+ msgCtx->textColorG = D_801CFED4[(s16)D_801CFF64[character - 0x839F]].g;
+ msgCtx->textColorB = D_801CFED4[(s16)D_801CFF64[character - 0x839F]].b;
+ Message_DrawTextChar(play, &font->charBuf[font->unk_11D88][charTexIndex], &gfx);
+ msgCtx->textColorR = sp12E;
+ msgCtx->textColorG = sp12C;
+ msgCtx->textColorB = sp12A;
+ } else {
+ Message_DrawTextChar(play, &font->charBuf[font->unk_11D88][charTexIndex], &gfx);
+ }
+ charTexIndex += FONT_CHAR_TEX_SIZE;
+ switch (character) {
+ case 0x8144:
+ msgCtx->textPosX += (s16)(8.0f * msgCtx->textCharScale);
+ break;
+
+ case 0x816A:
+ case 0x8176:
+ msgCtx->textPosX += (s16)(10.0f * msgCtx->textCharScale);
+ break;
+
+ case 0x8141:
+ case 0x8142:
+ case 0x8168:
+ msgCtx->textPosX += (s16)(12.0f * msgCtx->textCharScale);
+ break;
+
+ case 0x8194:
+ msgCtx->textPosX += (s16)(14.0f * msgCtx->textCharScale);
+ break;
+
+ case 0x8145:
+ msgCtx->textPosX += (s16)(15.0f * msgCtx->textCharScale);
+ break;
+
+ default:
+ if ((msgCtx->msgMode >= MSGMODE_SCENE_TITLE_CARD_FADE_IN_BACKGROUND) &&
+ (msgCtx->msgMode <= MSGMODE_SCENE_TITLE_CARD_FADE_OUT_BACKGROUND)) {
+ msgCtx->textPosX += (s16)((16.0f * msgCtx->textCharScale) - 1.0f);
+ } else {
+ msgCtx->textPosX += (s16)(16.0f * msgCtx->textCharScale);
+ }
+ break;
+ }
+ break;
+ }
+ }
+
+ if (msgCtx->textDelayTimer == 0) {
+ msgCtx->textDrawPos = i + 1;
+ msgCtx->textDelayTimer = 0;
+ if (msgCtx->msgMode == MSGMODE_9) {
+ msgCtx->msgMode = MSGMODE_TEXT_DISPLAYING;
+ }
+ } else {
+ msgCtx->textDelayTimer--;
+ }
+ *gfxP = gfx;
+}
+
+s16 D_801CFF70[LANGUAGE_MAX] = {
+ 4, // LANGUAGE_JPN
+ 0x12, // LANGUAGE_ENG
+ 0x12, // LANGUAGE_GER
+ 0x12, // LANGUAGE_FRE
+ 0x12, // LANGUAGE_SPA
+};
+s16 D_801CFF7C[LANGUAGE_MAX] = {
+ 0, // LANGUAGE_JPN
+ 0xE, // LANGUAGE_ENG
+ 0xE, // LANGUAGE_GER
+ 0xE, // LANGUAGE_FRE
+ 0xE, // LANGUAGE_SPA
+};
+s16 D_801CFF88[LANGUAGE_MAX] = {
+ 0, // LANGUAGE_JPN
+ 0x16, // LANGUAGE_ENG
+ 0x16, // LANGUAGE_GER
+ 0x16, // LANGUAGE_FRE
+ 0x16, // LANGUAGE_SPA
+};
+
+s16 D_801CFF94[] = {
+ /* 0x00 */ MESSAGE_ITEM_NONE,
+ /* 0x01 */ ITEM_RUPEE_GREEN,
+ /* 0x02 */ ITEM_RUPEE_BLUE,
+ /* 0x03 */ ITEM_RUPEE_10,
+ /* 0x04 */ ITEM_RUPEE_RED,
+ /* 0x05 */ ITEM_RUPEE_PURPLE,
+ /* 0x06 */ ITEM_RUPEE_SILVER,
+ /* 0x07 */ ITEM_RUPEE_HUGE,
+ /* 0x08 */ ITEM_WALLET_ADULT,
+ /* 0x09 */ ITEM_WALLET_GIANT,
+ /* 0x0A */ ITEM_RECOVERY_HEART,
+ /* 0x0B */ ITEM_RECOVERY_HEART,
+ /* 0x0C */ ITEM_HEART_PIECE,
+ /* 0x0D */ ITEM_HEART_CONTAINER,
+ /* 0x0E */ ITEM_MAGIC_JAR_SMALL,
+ /* 0x0F */ ITEM_MAGIC_JAR_BIG,
+ /* 0x10 */ ITEM_RECOVERY_HEART,
+ /* 0x11 */ ITEM_STRAY_FAIRIES,
+ /* 0x12 */ ITEM_RECOVERY_HEART,
+ /* 0x13 */ ITEM_RECOVERY_HEART,
+ /* 0x14 */ ITEM_BOMB,
+ /* 0x15 */ ITEM_BOMB,
+ /* 0x16 */ ITEM_BOMB,
+ /* 0x17 */ ITEM_BOMB,
+ /* 0x18 */ ITEM_BOMB,
+ /* 0x19 */ ITEM_DEKU_STICK,
+ /* 0x1A */ ITEM_BOMBCHU,
+ /* 0x1B */ ITEM_BOMB_BAG_20,
+ /* 0x1C */ ITEM_BOMB_BAG_30,
+ /* 0x1D */ ITEM_BOMB_BAG_40,
+ /* 0x1E */ ITEM_BOW,
+ /* 0x1F */ ITEM_BOW,
+ /* 0x20 */ ITEM_BOW,
+ /* 0x21 */ ITEM_BOW,
+ /* 0x22 */ ITEM_QUIVER_30,
+ /* 0x23 */ ITEM_QUIVER_40,
+ /* 0x24 */ ITEM_QUIVER_50,
+ /* 0x25 */ ITEM_ARROW_FIRE,
+ /* 0x26 */ ITEM_ARROW_ICE,
+ /* 0x27 */ ITEM_ARROW_LIGHT,
+ /* 0x28 */ ITEM_DEKU_NUT,
+ /* 0x29 */ ITEM_DEKU_NUT,
+ /* 0x2A */ ITEM_DEKU_NUT,
+ /* 0x2B */ MESSAGE_ITEM_NONE,
+ /* 0x2C */ MESSAGE_ITEM_NONE,
+ /* 0x2D */ MESSAGE_ITEM_NONE,
+ /* 0x2E */ MESSAGE_ITEM_NONE,
+ /* 0x2F */ ITEM_DEKU_STICK_UPGRADE_20,
+ /* 0x30 */ MESSAGE_ITEM_NONE,
+ /* 0x31 */ MESSAGE_ITEM_NONE,
+ /* 0x32 */ ITEM_SHIELD_HERO,
+ /* 0x33 */ ITEM_SHIELD_MIRROR,
+ /* 0x34 */ ITEM_POWDER_KEG,
+ /* 0x35 */ ITEM_MAGIC_BEANS,
+ /* 0x36 */ ITEM_PICTOGRAPH_BOX,
+ /* 0x37 */ ITEM_SWORD_KOKIRI,
+ /* 0x38 */ ITEM_SWORD_RAZOR,
+ /* 0x39 */ ITEM_SWORD_GILDED,
+ /* 0x3A */ ITEM_SWORD_DEITY,
+ /* 0x3B */ ITEM_SWORD_GREAT_FAIRY,
+ /* 0x3C */ ITEM_KEY_SMALL,
+ /* 0x3D */ ITEM_KEY_BOSS,
+ /* 0x3E */ ITEM_DUNGEON_MAP,
+ /* 0x3F */ ITEM_COMPASS,
+ /* 0x40 */ ITEM_POWDER_KEG,
+ /* 0x41 */ ITEM_HOOKSHOT,
+ /* 0x42 */ ITEM_LENS_OF_TRUTH,
+ /* 0x43 */ ITEM_PICTOGRAPH_BOX,
+ /* 0x44 */ ITEM_FISHING_ROD,
+ /* 0x45 */ MESSAGE_ITEM_NONE,
+ /* 0x46 */ MESSAGE_ITEM_NONE,
+ /* 0x47 */ MESSAGE_ITEM_NONE,
+ /* 0x48 */ MESSAGE_ITEM_NONE,
+ /* 0x49 */ MESSAGE_ITEM_NONE,
+ /* 0x4A */ MESSAGE_ITEM_NONE,
+ /* 0x4B */ MESSAGE_ITEM_NONE,
+ /* 0x4C */ ITEM_OCARINA_OF_TIME,
+ /* 0x4D */ MESSAGE_ITEM_NONE,
+ /* 0x4E */ MESSAGE_ITEM_NONE,
+ /* 0x4F */ MESSAGE_ITEM_NONE,
+ /* 0x50 */ ITEM_BOMBERS_NOTEBOOK,
+ /* 0x51 */ MESSAGE_ITEM_NONE,
+ /* 0x52 */ ITEM_SKULL_TOKEN,
+ /* 0x53 */ MESSAGE_ITEM_NONE,
+ /* 0x54 */ MESSAGE_ITEM_NONE,
+ /* 0x55 */ ITEM_REMAINS_ODOLWA,
+ /* 0x56 */ ITEM_REMAINS_GOHT,
+ /* 0x57 */ ITEM_REMAINS_GYORG,
+ /* 0x58 */ ITEM_REMAINS_TWINMOLD,
+ /* 0x59 */ ITEM_POTION_RED,
+ /* 0x5A */ ITEM_BOTTLE,
+ /* 0x5B */ ITEM_POTION_RED,
+ /* 0x5C */ ITEM_POTION_GREEN,
+ /* 0x5D */ ITEM_POTION_BLUE,
+ /* 0x5E */ ITEM_FAIRY,
+ /* 0x5F */ ITEM_DEKU_PRINCESS,
+ /* 0x60 */ ITEM_MILK_BOTTLE,
+ /* 0x61 */ ITEM_MILK_HALF,
+ /* 0x62 */ ITEM_FISH,
+ /* 0x63 */ ITEM_BUG,
+ /* 0x64 */ ITEM_BLUE_FIRE,
+ /* 0x65 */ ITEM_POE,
+ /* 0x66 */ ITEM_BIG_POE,
+ /* 0x67 */ ITEM_SPRING_WATER,
+ /* 0x68 */ ITEM_HOT_SPRING_WATER,
+ /* 0x69 */ ITEM_ZORA_EGG,
+ /* 0x6A */ ITEM_GOLD_DUST,
+ /* 0x6B */ ITEM_MUSHROOM,
+ /* 0x6C */ MESSAGE_ITEM_NONE,
+ /* 0x6D */ MESSAGE_ITEM_NONE,
+ /* 0x6E */ ITEM_SEAHORSE,
+ /* 0x6F */ ITEM_CHATEAU,
+ /* 0x70 */ ITEM_HYLIAN_LOACH,
+ /* 0x71 */ MESSAGE_ITEM_NONE,
+ /* 0x72 */ MESSAGE_ITEM_NONE,
+ /* 0x73 */ MESSAGE_ITEM_NONE,
+ /* 0x74 */ MESSAGE_ITEM_NONE,
+ /* 0x75 */ MESSAGE_ITEM_NONE,
+ /* 0x76 */ MESSAGE_ITEM_NONE,
+ /* 0x77 */ MESSAGE_ITEM_NONE,
+ /* 0x78 */ ITEM_MASK_DEKU,
+ /* 0x79 */ ITEM_MASK_GORON,
+ /* 0x7A */ ITEM_MASK_ZORA,
+ /* 0x7B */ ITEM_MASK_FIERCE_DEITY,
+ /* 0x7C */ ITEM_MASK_TRUTH,
+ /* 0x7D */ ITEM_MASK_KAFEIS_MASK,
+ /* 0x7E */ ITEM_MASK_ALL_NIGHT,
+ /* 0x7F */ ITEM_MASK_BUNNY,
+ /* 0x80 */ ITEM_MASK_KEATON,
+ /* 0x81 */ ITEM_MASK_GARO,
+ /* 0x82 */ ITEM_MASK_ROMANI,
+ /* 0x83 */ ITEM_MASK_CIRCUS_LEADER,
+ /* 0x84 */ ITEM_MASK_POSTMAN,
+ /* 0x85 */ ITEM_MASK_COUPLE,
+ /* 0x86 */ ITEM_MASK_GREAT_FAIRY,
+ /* 0x87 */ ITEM_MASK_GIBDO,
+ /* 0x88 */ ITEM_MASK_DON_GERO,
+ /* 0x89 */ ITEM_MASK_KAMARO,
+ /* 0x8A */ ITEM_MASK_CAPTAIN,
+ /* 0x8B */ ITEM_MASK_STONE,
+ /* 0x8C */ ITEM_MASK_BREMEN,
+ /* 0x8D */ ITEM_MASK_BLAST,
+ /* 0x8E */ ITEM_MASK_SCENTS,
+ /* 0x8F */ ITEM_MASK_GIANT,
+ /* 0x90 */ MESSAGE_ITEM_NONE,
+ /* 0x91 */ ITEM_CHATEAU,
+ /* 0x92 */ ITEM_MILK_BOTTLE,
+ /* 0x93 */ ITEM_GOLD_DUST,
+ /* 0x94 */ ITEM_HYLIAN_LOACH,
+ /* 0x95 */ ITEM_SEAHORSE,
+ /* 0x96 */ ITEM_MOONS_TEAR,
+ /* 0x97 */ ITEM_DEED_LAND,
+ /* 0x98 */ ITEM_DEED_SWAMP,
+ /* 0x99 */ ITEM_DEED_MOUNTAIN,
+ /* 0x9A */ ITEM_DEED_OCEAN,
+ /* 0x9B */ MESSAGE_ITEM_NONE,
+ /* 0x9C */ MESSAGE_ITEM_NONE,
+ /* 0x9D */ MESSAGE_ITEM_NONE,
+ /* 0x9E */ MESSAGE_ITEM_NONE,
+ /* 0x9F */ MESSAGE_ITEM_NONE,
+ /* 0xA0 */ ITEM_ROOM_KEY,
+ /* 0xA1 */ ITEM_LETTER_MAMA,
+ /* 0xA2 */ MESSAGE_ITEM_NONE,
+ /* 0xA3 */ MESSAGE_ITEM_NONE,
+ /* 0xA4 */ MESSAGE_ITEM_NONE,
+ /* 0xA5 */ MESSAGE_ITEM_NONE,
+ /* 0xA6 */ MESSAGE_ITEM_NONE,
+ /* 0xA7 */ MESSAGE_ITEM_NONE,
+ /* 0xA8 */ MESSAGE_ITEM_NONE,
+ /* 0xA9 */ MESSAGE_ITEM_NONE,
+ /* 0xAA */ ITEM_LETTER_TO_KAFEI,
+ /* 0xAB */ ITEM_PENDANT_OF_MEMORIES,
+ /* 0xAC */ MESSAGE_ITEM_NONE,
+ /* 0xAD */ MESSAGE_ITEM_NONE,
+ /* 0xAE */ MESSAGE_ITEM_NONE,
+ /* 0xAF */ MESSAGE_ITEM_NONE,
+ /* 0xB0 */ MESSAGE_ITEM_NONE,
+ /* 0xB1 */ MESSAGE_ITEM_NONE,
+ /* 0xB2 */ MESSAGE_ITEM_NONE,
+ /* 0xB3 */ ITEM_TINGLE_MAP,
+ /* 0xB4 */ ITEM_TINGLE_MAP,
+ /* 0xB5 */ ITEM_TINGLE_MAP,
+ /* 0xB6 */ ITEM_TINGLE_MAP,
+ /* 0xB7 */ ITEM_TINGLE_MAP,
+ /* 0xB8 */ ITEM_TINGLE_MAP,
+ /* 0xB9 */ ITEM_TINGLE_MAP,
+ /* 0xBA */ MESSAGE_ITEM_NONE,
+ /* 0xBB */ MESSAGE_ITEM_NONE,
+ /* 0xBC */ MESSAGE_ITEM_NONE,
+ /* 0xBD */ MESSAGE_ITEM_NONE,
+ /* 0xBE */ MESSAGE_ITEM_NONE,
+ /* 0xBF */ MESSAGE_ITEM_NONE,
+ /* 0xC0 */ MESSAGE_ITEM_NONE,
+ /* 0xC1 */ MESSAGE_ITEM_NONE,
+ /* 0xC2 */ MESSAGE_ITEM_NONE,
+ /* 0xC3 */ MESSAGE_ITEM_NONE,
+ /* 0xC4 */ MESSAGE_ITEM_NONE,
+ /* 0xC5 */ MESSAGE_ITEM_NONE,
+ /* 0xC6 */ MESSAGE_ITEM_NONE,
+ /* 0xC7 */ MESSAGE_ITEM_NONE,
+ /* 0xC8 */ ITEM_SONG_SONATA,
+ /* 0xC9 */ ITEM_SONG_SONATA,
+ /* 0xCA */ ITEM_SONG_SONATA,
+ /* 0xCB */ ITEM_SONG_LULLABY,
+ /* 0xCC */ ITEM_SONG_NOVA,
+ /* 0xCD */ ITEM_SONG_ELEGY,
+ /* 0xCE */ ITEM_SONG_OATH,
+ /* 0xCF */ ITEM_SONG_SARIA,
+ /* 0xD0 */ ITEM_SONG_TIME,
+ /* 0xD1 */ ITEM_SONG_HEALING,
+ /* 0xD2 */ ITEM_SONG_EPONA,
+ /* 0xD3 */ ITEM_SONG_SOARING,
+ /* 0xD4 */ ITEM_SONG_STORMS,
+ /* 0xD5 */ ITEM_SONG_SUN,
+ /* 0xD6 */ ITEM_SONG_LULLABY,
+ /* 0xD7 */ ITEM_SONG_SONATA,
+ /* 0xD8 */ ITEM_SONG_SONATA,
+ /* 0xD9 */ ITEM_SONG_SONATA,
+ /* 0xDA */ ITEM_SONG_LULLABY,
+ /* 0xDB */ ITEM_SONG_NOVA,
+ /* 0xDC */ ITEM_B8,
+ /* 0xDD */ ITEM_B9,
+ /* 0xDE */ ITEM_BA,
+ /* 0xDF */ ITEM_BB,
+ /* 0xE0 */ ITEM_BC,
+ /* 0xE1 */ ITEM_BD,
+ /* 0xE2 */ ITEM_BE,
+ /* 0xE3 */ ITEM_BF,
+ /* 0xE4 */ ITEM_C0,
+ /* 0xE5 */ ITEM_C1,
+ /* 0xE6 */ ITEM_C2,
+ /* 0xE7 */ ITEM_C3,
+ /* 0xE8 */ ITEM_C4,
+ /* 0xE9 */ ITEM_C5,
+ /* 0xEA */ ITEM_C6,
+ /* 0xEB */ ITEM_C7,
+ /* 0xEC */ ITEM_C8,
+ /* 0xED */ ITEM_C9,
+ /* 0xEE */ ITEM_CA,
+ /* 0xEF */ ITEM_CB,
+ /* 0xF0 */ ITEM_CC,
+ /* 0xF1 */ MESSAGE_ITEM_NONE,
+ /* 0xF2 */ MESSAGE_ITEM_NONE,
+ /* 0xF3 */ MESSAGE_ITEM_NONE,
+ /* 0xF4 */ MESSAGE_ITEM_NONE,
+ /* 0xF5 */ MESSAGE_ITEM_NONE,
+ /* 0xF6 */ MESSAGE_ITEM_NONE,
+ /* 0xF7 */ MESSAGE_ITEM_NONE,
+ /* 0xF8 */ MESSAGE_ITEM_NONE,
+ /* 0xF9 */ MESSAGE_ITEM_NONE,
+};
+
+void Message_LoadItemIcon(PlayState* play, u16 itemId, s16 arg2) {
+ MessageContext* msgCtx = &play->msgCtx;
+ u16* new_var2 = &itemId;
+
+ if (itemId == ITEM_RECOVERY_HEART) {
+ msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF88[gSaveContext.options.language]);
+ msgCtx->unk12012 = (arg2 + 0xA);
+ msgCtx->unk12014 = 0x10;
+ } else if ((itemId >= ITEM_RUPEE_GREEN) && (itemId <= ITEM_RUPEE_HUGE)) {
+ msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF88[gSaveContext.options.language]);
+ msgCtx->unk12012 = (arg2 + 0xA);
+ msgCtx->unk12014 = 0x10;
+ } else if (itemId == ITEM_STRAY_FAIRIES) {
+ msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF70[gSaveContext.options.language]);
+ msgCtx->unk12012 = (arg2 + 0xA);
+ msgCtx->unk12014 = 0x20;
+ } else if ((itemId >= ITEM_SONG_SONATA) && (itemId <= ITEM_SONG_SUN)) {
+ msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF88[gSaveContext.options.language]);
+ msgCtx->unk12012 = (arg2 + 0xA);
+ msgCtx->unk12014 = 0x10;
+ CmpDma_LoadFile(SEGMENT_ROM_START(icon_item_static_yar), ITEM_SONG_SONATA, msgCtx->textboxSegment + 0x1000,
+ 0x180);
+ } else if (itemId == ITEM_BOMBERS_NOTEBOOK) {
+ msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF70[gSaveContext.options.language]);
+ msgCtx->unk12012 = (arg2 + 6);
+ msgCtx->unk12014 = 0x20;
+ CmpDma_LoadFile(SEGMENT_ROM_START(icon_item_static_yar), ITEM_SONG_SONATA, msgCtx->textboxSegment + 0x1000,
+ 0x1000);
+ } else if (itemId <= ITEM_REMAINS_TWINMOLD) {
+ msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF70[gSaveContext.options.language]);
+ msgCtx->unk12012 = (arg2 + 6);
+ msgCtx->unk12014 = 0x20;
+ CmpDma_LoadFile(SEGMENT_ROM_START(icon_item_static_yar), itemId, msgCtx->textboxSegment + 0x1000, 0x1000);
+ } else if (itemId == ITEM_CC) {
+ msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF70[gSaveContext.options.language]);
+ msgCtx->unk12012 = (arg2 + 8);
+ msgCtx->unk12014 = 0x20;
+ CmpDma_LoadFile(SEGMENT_ROM_START(schedule_dma_static_yar), ITEM_POTION_BLUE, msgCtx->textboxSegment + 0x1000,
+ 0x400);
+ } else if (itemId >= ITEM_B8) {
+ msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF70[gSaveContext.options.language]);
+ msgCtx->unk12012 = (arg2 + 8);
+ msgCtx->unk12014 = 0x20;
+ CmpDma_LoadFile(SEGMENT_ROM_START(schedule_dma_static_yar), (itemId - ITEM_B8), msgCtx->textboxSegment + 0x1000,
+ 0x800);
+ } else if (itemId >= ITEM_SKULL_TOKEN) {
+ msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF7C[gSaveContext.options.language]);
+ msgCtx->unk12012 = (arg2 + 0xA);
+ msgCtx->unk12014 = 0x18;
+ CmpDma_LoadFile(SEGMENT_ROM_START(icon_item_24_static_yar), (itemId - ITEM_SKULL_TOKEN),
+ msgCtx->textboxSegment + 0x1000, 0x900);
+ }
+
+ if (play->pauseCtx.bombersNotebookOpen) {
+ msgCtx->unk12010 = ((msgCtx->unk12010 * 1.4f) + 2.0f);
+ msgCtx->unk12014 = (msgCtx->unk12014 * 1.4f);
+ }
+
+ msgCtx->choiceNum = 1;
+}
void Message_LoadChar(PlayState* play, u16 codePointIndex, s32* offset, f32* arg3, s16 decodedBufPos) {
MessageContext* msgCtx = &play->msgCtx;
@@ -220,11 +1885,12 @@ void Message_LoadChar(PlayState* play, u16 codePointIndex, s32* offset, f32* arg
Font_LoadChar(play, codePointIndex, temp1);
msgCtx->decodedBuffer.wchar[decodedBufPos] = codePointIndex;
temp1 += FONT_CHAR_TEX_SIZE;
- temp2 += (16.0f * msgCtx->unk12098);
+ temp2 += (16.0f * msgCtx->textCharScale);
*offset = temp1;
*arg3 = temp2;
}
+// TODO: SJIS support
// Message_LoadRupees JPN ?
void func_8014CCB4(PlayState* play, s16* decodedBufPos, s32* offset, f32* arg3) {
MessageContext* msgCtx = &play->msgCtx;
@@ -235,90 +1901,1438 @@ void func_8014CCB4(PlayState* play, s16* decodedBufPos, s32* offset, f32* arg3)
Font_LoadChar(play, 0x838B, k); // 0x838B = ル in JISX0213
k += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[t] = 0x838B;
- t += 1;
+ t++;
Font_LoadChar(play, 0x8373, k); // 0x8373 = ピ in JISX0213
k += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[t] = 0x8373;
- t += 1;
- Font_LoadChar(play, 0x815C, k); // Ox815C = ― in JISX0213
+ t++;
+ Font_LoadChar(play, 0x815C, k); // 0x815C = ― in JISX0213
k += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[t] = 0x815C;
- f += 16.0f * msgCtx->unk12098 * 3.0f;
+ f += 16.0f * msgCtx->textCharScale * 3.0f;
*decodedBufPos = t;
*offset = k;
*arg3 = f;
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8014CDF0.s")
+/*
+ * offsetting to actual codepoints is done outside this function
+ * every digit will be added 0x824F to get an actual S-JIS
+ * printable character.
+ */
+void Message_GetTimerDigits(OSTime time, s16* digits) {
+ OSTime t = time;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8014CFDC.s")
+ // 6 minutes
+ digits[0] = t / SECONDS_TO_TIMER(360);
+ t -= digits[0] * SECONDS_TO_TIMER(360);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8014D304.s")
+ // minutes
+ digits[1] = t / SECONDS_TO_TIMER(60);
+ t -= digits[1] * SECONDS_TO_TIMER(60);
-extern u16 D_801D0188[OWL_WARP_MAX][9];
-extern s16 D_801D0250[OWL_WARP_MAX];
+ digits[2] = 0x135B; // 0x135B + 0x824F = 分 (minutes) in S-JIS
-void func_8014D62C(PlayState* play, s32* arg1, f32* arg2, s16* arg3) {
+ // 10 seconds
+ digits[3] = t / SECONDS_TO_TIMER(10);
+ t -= digits[3] * SECONDS_TO_TIMER(10);
+
+ // seconds
+ digits[4] = t / SECONDS_TO_TIMER(1);
+ t -= digits[4] * SECONDS_TO_TIMER(1);
+
+ digits[5] = 0x1313; // 0x1313 + 0x824F = 秒 (seconds) in S-JIS
+
+ // 100 milliseconds
+ digits[6] = t / SECONDS_TO_TIMER_PRECISE(0, 10);
+ t -= digits[6] * SECONDS_TO_TIMER_PRECISE(0, 10);
+
+ // 10 milliseconds
+ digits[7] = t;
+}
+
+void Message_SetupLoadItemIcon(PlayState* play) {
+ Font* font;
+ MessageContext* msgCtx = &play->msgCtx;
+
+ font = &msgCtx->font;
+ if (msgCtx->msgBufPos == 0) {
+ if (font->msgBuf.schar[msgCtx->msgBufPos + 2] != 0xFE) {
+ msgCtx->unk11F18 = 0;
+ if ((msgCtx->currentTextId == 0x176F) || (msgCtx->currentTextId == 0x1770) ||
+ (msgCtx->currentTextId == 0x1771)) {
+ msgCtx->itemId = ITEM_OCARINA_OF_TIME;
+ msgCtx->msgBufPos += 2;
+ } else {
+ msgCtx->msgBufPos += 2;
+ if ((font->msgBuf.schar[msgCtx->msgBufPos] < 0xC8) || (font->msgBuf.schar[msgCtx->msgBufPos] >= 0xD8)) {
+ msgCtx->itemId = D_801CFF94[(u8)font->msgBuf.schar[msgCtx->msgBufPos]];
+ } else {
+ msgCtx->itemId = 0xFE;
+ }
+ }
+ } else {
+ msgCtx->msgBufPos += 2;
+ msgCtx->itemId = font->msgBuf.schar[msgCtx->msgBufPos];
+ }
+ msgCtx->nextTextId = font->msgBuf.schar[++msgCtx->msgBufPos] << 8;
+ msgCtx->nextTextId |= font->msgBuf.schar[++msgCtx->msgBufPos];
+
+ msgCtx->unk1206C = font->msgBuf.schar[++msgCtx->msgBufPos] << 8;
+ msgCtx->unk1206C |= font->msgBuf.schar[++msgCtx->msgBufPos];
+
+ msgCtx->unk12070 = font->msgBuf.schar[++msgCtx->msgBufPos] << 8;
+ msgCtx->unk12070 |= font->msgBuf.schar[++msgCtx->msgBufPos];
+
+ msgCtx->unk12074 = font->msgBuf.schar[++msgCtx->msgBufPos] << 8;
+ msgCtx->unk12074 |= font->msgBuf.schar[++msgCtx->msgBufPos];
+
+ msgCtx->msgBufPos++;
+ if (msgCtx->itemId != 0xFE) {
+ Message_LoadItemIcon(play, msgCtx->itemId, msgCtx->textboxY + 10);
+ }
+ }
+}
+
+void Message_LoadTime(PlayState* play, u16 curChar, s32* offset, f32* arg3, s16* decodedBufPos) {
+ MessageContext* msgCtx = &play->msgCtx;
+ s16 i;
+ s16 p = *decodedBufPos;
+ s32 o = *offset;
+ f32 f = *arg3;
+ u32 dayTime;
+ s16 digits[4];
+ f32 timeInMinutes;
+
+ if (curChar == 0x20F) {
+ dayTime = TIME_UNTIL_MOON_CRASH;
+ } else {
+ dayTime = TIME_UNTIL_NEW_DAY;
+ }
+ timeInMinutes = TIME_TO_MINUTES_F(dayTime);
+
+ digits[0] = 0;
+ digits[1] = (timeInMinutes / 60.0f);
+ while (digits[1] >= 10) {
+ digits[0]++;
+ digits[1] -= 10;
+ }
+
+ digits[2] = 0;
+ digits[3] = (s32)timeInMinutes % 60;
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ for (i = 0; i < 4; i++) {
+ Font_LoadChar(play, digits[i] + 0x824F, o); // 0x824F = '0' in S-JIS
+ o += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.wchar[p] = digits[i] + 0x824F;
+ p++;
+ if (i == 1) {
+ // Hours (時間)
+ Font_LoadChar(play, 0x8E9E, o);
+ o += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.wchar[p] = 0x8E9E;
+ p++;
+ Font_LoadChar(play, 0x8AD4, o);
+ o += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.wchar[p] = 0x8E9E;
+ p++;
+ } else if (i == 3) {
+ // Minutes (分)
+ Font_LoadChar(play, 0x95AA, o);
+ o += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.wchar[p] = 0x95AA;
+ }
+ }
+
+ f += 7.0f * (16.0f * msgCtx->textCharScale);
+ *decodedBufPos = p;
+ *offset = o;
+ *arg3 = f;
+}
+
+#define GREAT_BAY_COAST_STR \
+ { 0x834F, 0x838C, 0x815B, 0x8367, 0x8378, 0x8343, 0x82CC, 0x8A43, 0x8ADD }
+#define ZORA_CAPE_STR \
+ { 0x835D, 0x815B, 0x8389, 0x82CC, 0x82DD, 0x82B3, 0x82AB }
+#define SNOWHEAD_STR \
+ { 0x8358, 0x836D, 0x815B, 0x8377, 0x8362, 0x8368 }
+#define MOUNTAIN_VILLAGE_STR \
+ { 0x8E52, 0x97A2 }
+#define CLOCK_TOWN_STR \
+ { 0x834E, 0x838D, 0x8362, 0x834E, 0x835E, 0x8345, 0x8393 }
+#define MILK_ROAD_STR \
+ { 0x837E, 0x838B, 0x834E, 0x838D, 0x815B, 0x8368 }
+#define WOODFALL_STR \
+ { 0x8345, 0x8362, 0x8368, 0x8374, 0x8348, 0x815B, 0x838B }
+#define SOUTHERN_SWAMP_STR \
+ { 0x8FC0, 0x926E }
+#define IKANA_CANYON_STR \
+ { 0x8343, 0x834A, 0x815B, 0x8369, 0x8C6B, 0x924A }
+#define STONE_TOWER_STR \
+ { 0x838D, 0x8362, 0x834E, 0x8372, 0x838B }
+#define ENTRANCE_STR \
+ { 0x93FC, 0x82E8, 0x8CFB }
+
+// Shift JIS
+u16 sOwlWarpTextJPN[OWL_WARP_MAX][9] = {
+ GREAT_BAY_COAST_STR, // OWL_WARP_GREAT_BAY_COAST
+ ZORA_CAPE_STR, // OWL_WARP_ZORA_CAPE
+ SNOWHEAD_STR, // OWL_WARP_SNOWHEAD
+ MOUNTAIN_VILLAGE_STR, // OWL_WARP_MOUNTAIN_VILLAGE
+ CLOCK_TOWN_STR, // OWL_WARP_CLOCK_TOWN
+ MILK_ROAD_STR, // OWL_WARP_MILK_ROAD
+ WOODFALL_STR, // OWL_WARP_WOODFALL
+ SOUTHERN_SWAMP_STR, // OWL_WARP_SOUTHERN_SWAMP
+ IKANA_CANYON_STR, // OWL_WARP_IKANA_CANYON
+ STONE_TOWER_STR, // OWL_WARP_STONE_TOWER
+ ENTRANCE_STR, // OWL_WARP_ENTRANCE
+};
+
+//! TODO: use sizeof when we have strings
+s16 sOwlWarpTextLengthJPN[OWL_WARP_MAX] = {
+ 9, // OWL_WARP_GREAT_BAY_COAST
+ 7, // OWL_WARP_ZORA_CAPE
+ 6, // OWL_WARP_SNOWHEAD
+ 2, // OWL_WARP_MOUNTAIN_VILLAGE
+ 7, // OWL_WARP_CLOCK_TOWN
+ 6, // OWL_WARP_MILK_ROAD
+ 7, // OWL_WARP_WOODFALL
+ 2, // OWL_WARP_SOUTHERN_SWAMP
+ 6, // OWL_WARP_IKANA_CANYON
+ 5, // OWL_WARP_STONE_TOWER
+ 3, // OWL_WARP_ENTRANCE
+};
+
+void Message_LoadOwlWarpText(PlayState* play, s32* offset, f32* arg2, s16* decodedBufPos) {
MessageContext* msgCtx = &play->msgCtx;
PauseContext* pauseCtx = &play->pauseCtx;
s16 stringLimit;
- s16 temp_s1 = *arg3;
- s32 temp_s2 = *arg1;
+ s16 curDecodedBufPos = *decodedBufPos;
+ s32 temp_s2 = *offset;
f32 sp3C = *arg2;
s16 owlWarpId;
- s16 phi_s0;
+ s16 i;
if (func_8010A0A4(play) || (play->sceneId == SCENE_SECOM)) {
owlWarpId = OWL_WARP_ENTRANCE;
} else {
owlWarpId = pauseCtx->cursorPoint[PAUSE_WORLD_MAP];
}
- stringLimit = D_801D0250[owlWarpId];
+ stringLimit = sOwlWarpTextLengthJPN[owlWarpId];
- for (phi_s0 = 0; phi_s0 < stringLimit; phi_s0++, temp_s1++, temp_s2 += 0x80) {
- msgCtx->decodedBuffer.wchar[temp_s1] = D_801D0188[owlWarpId][phi_s0];
- Font_LoadChar(play, D_801D0188[owlWarpId][phi_s0], temp_s2);
+ for (i = 0; i < stringLimit; i++, curDecodedBufPos++, temp_s2 += FONT_CHAR_TEX_SIZE) {
+ msgCtx->decodedBuffer.wchar[curDecodedBufPos] = sOwlWarpTextJPN[owlWarpId][i];
+ Font_LoadChar(play, sOwlWarpTextJPN[owlWarpId][i], temp_s2);
}
- temp_s1--;
- sp3C += (stringLimit - 1) * (16.0f * msgCtx->unk12098);
+ curDecodedBufPos--;
+ sp3C += (stringLimit - 1) * (16.0f * msgCtx->textCharScale);
- *arg3 = temp_s1;
- *arg1 = temp_s2;
+ *decodedBufPos = curDecodedBufPos;
+ *offset = temp_s2;
*arg2 = sp3C;
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8014D7B4.s")
+// Counterpart to NES D_801D08D8
+u16 D_801D0268[][3] = {
+ { 0x82CD, 0x82E2, 0x82A2 },
+ { 0x82D3, 0x82C2, 0x82A4 },
+ { 0x82A8, 0x82BB, 0x82A2 },
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80150A84.s")
+// Counterpart to NES D_801D08E4
+u16 D_801D027C[] = { 0x2001, 0x2003, 0x2004, 0x2002 };
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80150D08.s")
+// Counterpart to NES sMaskCodeTextENG
+u16 D_801D0284[] = { 0x90D4, 0x90C2, 0x89A9, 0x97CE };
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_801514B0.s")
+#ifdef NON_MATCHING
+// https://decomp.me/scratch/ZTbP4
+void Message_Decode(PlayState* play) {
+ MessageContext* msgCtx = &play->msgCtx;
+ Font* font = &msgCtx->font; // spF0
+ Player* player; // spEC
+ s16 decodedBufPos; // spEA
+ u32 timeToMoonCrash;
+ s16 temp2;
+ s16 spE0;
+ s32 pad4;
+ s16 digits[4]; // spD4/D6/D8/DA
+ s16 spD2;
+ f32 timeInSeconds;
+ s32 charTexIdx; // spC8
+ s16 var_v0;
+ s16 loadChar;
+ f32 spC0;
+ f32 var_fs0;
+ s16 index;
+ s16 value;
+ s16 playerNameLen;
+ s16 i; // s1
+ s16 spAC[4];
+ u8 var_s3_8;
+ u16 curChar;
+ u32 temp;
+ u8* ptr2;
-void Message_StartTextbox(PlayState* play, u16 textId, Actor* Actor) {
+ player = GET_PLAYER(play);
+ msgCtx->textDelayTimer = 0;
+ msgCtx->textDelay = msgCtx->textDelayTimer;
+ msgCtx->textFade = 0;
+ spC0 = 0.0f;
+ font->unk_11D88 = (font->unk_11D88 ^ 1) & 1;
+
+ if ((gSaveContext.options.language == LANGUAGE_JPN) && !msgCtx->textIsCredits) {
+ spD2 = 0;
+ spE0 = 0;
+ decodedBufPos = 0;
+ charTexIdx = 0;
+ Message_SetupLoadItemIcon(play);
+
+ while (true) {
+ curChar = msgCtx->decodedBuffer.wchar[decodedBufPos] = font->msgBuf.wchar[msgCtx->msgBufPos];
+
+ if ((curChar == 9) || (curChar == 0xB) || (curChar == 0x110) || (curChar == 0x111) || (curChar == 0x112) ||
+ (curChar == 0x103) || (curChar == 0x230) || (curChar == 0x500) || (curChar == 0x240) ||
+ (curChar == 0x104)) {
+
+ msgCtx->msgMode = MSGMODE_TEXT_DISPLAYING;
+ msgCtx->textDrawPos = 1;
+ msgCtx->unk11FFA = msgCtx->textboxY + 6;
+ msgCtx->unk11F1A[spD2] = 0;
+ if (msgCtx->unk11F18 == 0) {
+ msgCtx->unk11F1A[spD2] = (s16)((msgCtx->textCharScale * 16.0f * 16.0f) - spC0) / 2;
+ }
+ spC0 = 0.0f;
+ if (curChar == 0xB) {
+ if ((msgCtx->textBoxType != TEXTBOX_TYPE_3) && (msgCtx->textBoxType != TEXTBOX_TYPE_4)) {
+ if (spE0 < 2) {
+ msgCtx->unk11FFA = msgCtx->textboxY + 0x16;
+ } else if (spE0 == 2) {
+ msgCtx->unk11FFA = msgCtx->textboxY + 0xE;
+ }
+ }
+ } else {
+ if ((msgCtx->textBoxType != TEXTBOX_TYPE_3) && (msgCtx->textBoxType != TEXTBOX_TYPE_4)) {
+ if (spE0 == 0) {
+ msgCtx->unk11FFA = msgCtx->textboxY + 0x16;
+ } else if (spE0 == 1) {
+ msgCtx->unk11FFA = msgCtx->textboxY + 0xE;
+ }
+ }
+ }
+
+ {
+ s32 pad;
+
+ if ((curChar == 0x110) || (curChar == 0x111) || (curChar == 0x112)) {
+ msgCtx->decodedBuffer.wchar[++decodedBufPos] = font->msgBuf.wchar[msgCtx->msgBufPos + 1];
+ msgCtx->msgBufPos += 2;
+ }
+ }
+
+ msgCtx->decodedTextLen = decodedBufPos;
+ if (msgCtx->textboxSkipped || (msgCtx->textBoxType == TEXTBOX_TYPE_1) ||
+ (msgCtx->textBoxType == TEXTBOX_TYPE_3) || (msgCtx->textBoxType == TEXTBOX_TYPE_6) ||
+ (msgCtx->textBoxType == TEXTBOX_TYPE_8) || (msgCtx->textBoxType == TEXTBOX_TYPE_9) ||
+ (msgCtx->textBoxType == TEXTBOX_TYPE_B) || (msgCtx->unk11F0C == 3)) {
+ msgCtx->textDrawPos = msgCtx->decodedTextLen;
+ }
+ msgCtx->unk120C8 = msgCtx->unk120CE;
+ msgCtx->unk120CA = msgCtx->unk120D0;
+ msgCtx->unk120CC = msgCtx->unk120D2;
+ break;
+ }
+
+ if (curChar == 0x100) {
+ for (playerNameLen = ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); playerNameLen > 0;
+ playerNameLen--) {
+ if (gSaveContext.save.saveInfo.playerData.playerName[playerNameLen - 1] != 0x3E) {
+ break;
+ }
+ }
+
+ for (i = 0; i < playerNameLen; i++) {
+ ptr2 = &font->fontBuf[((void)0, gSaveContext.save.saveInfo.playerData.playerName[i]) *
+ FONT_CHAR_TEX_SIZE];
+ msgCtx->decodedBuffer.wchar[decodedBufPos + i] = 0x100;
+
+ for (var_v0 = 0; var_v0 < FONT_CHAR_TEX_SIZE; var_v0 += 4) {
+ font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 0] =
+ ptr2[var_v0 + 0] & 0xFF; //! FAKE: Fixes later regalloc
+ font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 1] = ptr2[var_v0 + 1];
+ font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 2] = ptr2[var_v0 + 2];
+ font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 3] = ptr2[var_v0 + 3];
+ }
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ }
+ decodedBufPos += playerNameLen - 1;
+ spC0 += playerNameLen * (16.0f * msgCtx->textCharScale);
+ } else if (curChar == 0x201) {
+ DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1000, SEGMENT_ROM_START(message_texture_static), 0x900);
+ DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1900,
+ (uintptr_t)SEGMENT_ROM_START(message_texture_static) + 0x900, 0x900);
+ spE0 = 2;
+ spD2 = 2;
+ msgCtx->unk12012 = msgCtx->textboxY + 8;
+ msgCtx->unk11F18 = 1;
+ msgCtx->unk12010 = XREG(47);
+ } else if (curChar == 0x202) {
+ msgCtx->unk11F18 = 1;
+ msgCtx->choiceNum = 2;
+ } else if (curChar == 0x203) {
+ msgCtx->unk11F18 = 1;
+ msgCtx->choiceNum = 3;
+ msgCtx->unk11FF8 = msgCtx->unk11FF8 + 0x16;
+ } else if (curChar == 0x204) {
+ Message_GetTimerDigits(((void)0, gSaveContext.timerCurTimes[curChar - 0x204]), spAC);
+
+ loadChar = false;
+ for (i = 0; i < 5; i++) {
+ if ((i == 1) || (spAC[i + 3] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Message_LoadChar(play, spAC[i + 3] + 0x824F, &charTexIdx, &spC0, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+ decodedBufPos--;
+ } else if ((curChar == 0x205) || (curChar == 0x206) || (curChar == 0x207) || (curChar == 0x208) ||
+ (curChar == 0x209)) {
+ Message_GetTimerDigits(((void)0, gSaveContext.timerCurTimes[curChar - 0x204]), spAC);
+
+ loadChar = false;
+ for (i = 0; i < 8; i++) {
+ if ((i == 4) || ((i != 2) && (i != 5) && (spAC[i] != '\0'))) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Message_LoadChar(play, spAC[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+ decodedBufPos--;
+ } else if (curChar == 0x20A) {
+ digits[0] = 0;
+ timeInSeconds = TIME_TO_MINUTES_F(gSaveContext.save.time);
+ digits[1] = timeInSeconds / 60.0f;
+ while (digits[1] >= 10) {
+ digits[0]++;
+ digits[1] -= 10;
+ }
+
+ digits[2] = 0;
+ digits[3] = (s32)timeInSeconds % 60;
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ for (i = 0; i < 4; i++) {
+ Font_LoadChar(play, digits[i] + 0x824F, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F;
+ decodedBufPos++;
+ if (i == 1) {
+ Font_LoadChar(play, 0x8E9E, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x8E9E;
+ decodedBufPos++;
+ } else if (i == 3) {
+ Font_LoadChar(play, 0x95AA, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x95AA;
+ }
+ }
+ spC0 += 6 * (16.0f * msgCtx->textCharScale);
+ } else if (curChar == 0x20B) {
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = Flags_GetAllTreasure(play);
+
+ while (digits[3] >= 1000) {
+ digits[0]++;
+ digits[3] -= 1000;
+ }
+ while (digits[3] >= 100) {
+ digits[1]++;
+ digits[3] -= 100;
+ }
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 4; i++) {
+ if ((i == 3) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Font_LoadChar(play, digits[i] + 0x824F, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F;
+ decodedBufPos++;
+ spC0 += 16.0f * msgCtx->textCharScale;
+ }
+ }
+ Message_LoadChar(play, 0x9543, &charTexIdx, &spC0, decodedBufPos);
+ } else if (curChar == 0x20C) {
+ decodedBufPos++;
+ msgCtx->unk120BE = spD2;
+ msgCtx->unk120C0 = decodedBufPos;
+ msgCtx->unk120C2 = 2;
+ msgCtx->bankRupeesSelected = 0;
+ msgCtx->unk120C4 = charTexIdx;
+ digits[0] = digits[1] = digits[2] = 0;
+
+ for (i = 0; i < 3; i++) {
+ Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos);
+ decodedBufPos++;
+ }
+ func_8014CCB4(play, &decodedBufPos, &charTexIdx, &spC0);
+ } else if (curChar == 0x20D) {
+ digits[0] = digits[1] = 0;
+ digits[2] = msgCtx->bankRupeesSelected;
+
+ while (digits[2] >= 100) {
+ digits[0]++;
+ digits[2] -= 100;
+ }
+
+ while (digits[2] >= 10) {
+ digits[1]++;
+ digits[2] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 3; i++) {
+ if ((i == 2) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+ func_8014CCB4(play, &decodedBufPos, &charTexIdx, &spC0);
+ } else if (curChar == 0x20E) {
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = msgCtx->bankRupees;
+
+ while (digits[3] >= 1000) {
+ digits[0]++;
+ digits[3] -= 1000;
+ }
+ while (digits[3] >= 100) {
+ digits[1]++;
+ digits[3] -= 100;
+ }
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 4; i++) {
+ if ((i == 3) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+ func_8014CCB4(play, &decodedBufPos, &charTexIdx, &spC0);
+ } else if (curChar == 0x20F) {
+ Message_LoadTime(play, curChar, &charTexIdx, &spC0, &decodedBufPos);
+ } else if (curChar == 0x21C) {
+ digits[0] = digits[1] = 0;
+ digits[2] = gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex];
+
+ while (digits[2] >= 100) {
+ digits[0]++;
+ digits[2] -= 100;
+ }
+ while (digits[2] >= 10) {
+ digits[1]++;
+ digits[2] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 3; i++) {
+ if ((i == 2) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+ Message_LoadChar(play, 0x906C, &charTexIdx, &spC0, decodedBufPos);
+ decodedBufPos++;
+ Message_LoadChar(play, 0x96DA, &charTexIdx, &spC0, decodedBufPos);
+ } else if (curChar == 0x21D) {
+ digits[0] = digits[1] = 0;
+ digits[2] = Inventory_GetSkullTokenCount(play->sceneId);
+
+ while (digits[2] >= 100) {
+ digits[0]++;
+ digits[2] -= 100;
+ }
+ while (digits[2] >= 10) {
+ digits[1]++;
+ digits[2] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 3; i++) {
+ if ((i == 2) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+ Message_LoadChar(play, 0x9543, &charTexIdx, &spC0, decodedBufPos);
+ } else if (curChar == 0x21E) {
+ digits[0] = 0;
+ digits[1] = gSaveContext.minigameScore;
+
+ while (digits[1] >= 10) {
+ digits[0]++;
+ digits[1] -= 10;
+ }
+
+ for (i = 0; i < 2; i++) {
+ if ((i == 1) || (digits[i] != 0)) {
+ Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+ decodedBufPos--;
+ } else if (curChar == 0x21F) {
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = gSaveContext.minigameScore;
+
+ while (digits[3] >= 1000) {
+ digits[0]++;
+ digits[3] -= 1000;
+ }
+ while (digits[3] >= 100) {
+ digits[1]++;
+ digits[3] -= 100;
+ }
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 4; i++) {
+ if ((i == 3) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+ decodedBufPos--;
+ } else if (curChar == 0x220) {
+ decodedBufPos++;
+ msgCtx->unk120BE = spD2;
+ msgCtx->unk120C0 = decodedBufPos;
+ msgCtx->unk120C2 = 0;
+ msgCtx->bankRupeesSelected = 0;
+ msgCtx->unk120C4 = charTexIdx;
+ digits[0] = digits[1] = digits[2] = 0;
+ for (i = 0; i < 2; i++) {
+ Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos);
+ decodedBufPos++;
+ }
+ func_8014CCB4(play, &decodedBufPos, &charTexIdx, &spC0);
+ } else if (curChar == 0x221) {
+ decodedBufPos++;
+ msgCtx->unk120BE = spD2;
+ msgCtx->unk120C0 = decodedBufPos;
+ msgCtx->unk120C2 = 0;
+ msgCtx->bankRupeesSelected = 0;
+ msgCtx->unk120C4 = charTexIdx;
+
+ for (i = 0; i < 5; i++) {
+ msgCtx->unk12054[i] = 1;
+ Message_LoadChar(play, 0x8250, &charTexIdx, &spC0, decodedBufPos);
+ decodedBufPos++;
+ }
+ decodedBufPos--;
+ } else if (curChar == 0x223) {
+ if (gSaveContext.save.timeSpeedOffset == 0x12) {
+ var_s3_8 = 0;
+ } else if (gSaveContext.save.timeSpeedOffset == 0) {
+ var_s3_8 = 1;
+ } else {
+ var_s3_8 = 2;
+ }
+
+ for (i = 0; i < 3; i++) {
+ msgCtx->decodedBuffer.wchar[decodedBufPos] = D_801D0268[var_s3_8][i];
+ Font_LoadChar(play, D_801D0268[var_s3_8][i], charTexIdx);
+ decodedBufPos++;
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ }
+ decodedBufPos--;
+ spC0 += 3.0f * (16.0f * msgCtx->textCharScale);
+ msgCtx->choiceIndex = var_s3_8;
+ } else if (curChar == 0x224) {
+ Message_LoadOwlWarpText(play, &charTexIdx, &spC0, &decodedBufPos);
+ } else if (curChar == 0x225) {
+ decodedBufPos++;
+ msgCtx->unk120BE = spD2;
+ msgCtx->unk120C0 = decodedBufPos;
+ msgCtx->unk120C2 = 0;
+ msgCtx->bankRupeesSelected = 0;
+ msgCtx->unk120C4 = charTexIdx;
+
+ for (i = 0; i < 3; i++) {
+ msgCtx->unk12054[i] = 1;
+ Font_LoadChar(play, 0x8250, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x8250;
+ spC0 += 16.0f * msgCtx->textCharScale;
+ decodedBufPos++;
+ }
+ decodedBufPos--;
+ } else if (curChar == 0x226) {
+ for (i = 0; i < 6; i++) {
+ msgCtx->decodedBuffer.wchar[decodedBufPos] =
+ D_801D027C[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[i])];
+ decodedBufPos++;
+ Message_LoadChar(play, i + 0x8250, &charTexIdx, &spC0, decodedBufPos);
+ decodedBufPos++;
+ }
+ msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x2000;
+ } else if ((curChar >= 0x227) && (curChar < 0x22B)) {
+ digits[0] = digits[1] = 0;
+ digits[2] = 15 - gSaveContext.save.saveInfo.inventory.strayFairies[curChar - 0x227];
+
+ while (digits[2] >= 100) {
+ digits[0]++;
+ digits[2] -= 100;
+ }
+ while (digits[2] >= 10) {
+ digits[1]++;
+ digits[2] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 3; i++) {
+ if ((i == 2) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Font_LoadChar(play, digits[i] + 0x824F, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F;
+ decodedBufPos++;
+ spC0 += 16.0f * msgCtx->textCharScale;
+ }
+ }
+ Message_LoadChar(play, 0x906C, &charTexIdx, &spC0, decodedBufPos);
+ } else if (curChar == 0x22B) {
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = gSaveContext.minigameScore;
+
+ while (digits[3] >= 1000) {
+ digits[0]++;
+ digits[3] -= 1000;
+ }
+ while (digits[3] >= 100) {
+ digits[1]++;
+ digits[3] -= 100;
+ }
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 4; i++) {
+ if ((i == 3) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Font_LoadChar(play, digits[i] + 0x824F, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F;
+ decodedBufPos++;
+ spC0 += 16.0f * msgCtx->textCharScale;
+ }
+ }
+ Message_LoadChar(play, 0x94AD, &charTexIdx, &spC0, decodedBufPos);
+ } else if ((curChar == 0x22C) || (curChar == 0x22D)) {
+ if (curChar == 0x22C) {
+ digits[0] = gSaveContext.save.saveInfo.lotteryCodes[CURRENT_DAY - 1][0];
+ digits[1] = gSaveContext.save.saveInfo.lotteryCodes[CURRENT_DAY - 1][1];
+ digits[2] = gSaveContext.save.saveInfo.lotteryCodes[CURRENT_DAY - 1][2];
+ } else {
+ digits[0] = (HS_GET_LOTTERY_CODE_GUESS() & 0xF00) >> 8;
+ digits[1] = (HS_GET_LOTTERY_CODE_GUESS() & 0xF0) >> 4;
+ digits[2] = HS_GET_LOTTERY_CODE_GUESS() & 0xF;
+ }
+ for (i = 0; i < 3; i++) {
+ Font_LoadChar(play, digits[i] + 0x824F, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F;
+ decodedBufPos++;
+ spC0 += 16.0f * msgCtx->textCharScale;
+ }
+ decodedBufPos--;
+ } else if (curChar == 0x22E) {
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = gItemPrices[GET_CUR_FORM_BTN_ITEM(player->heldItemButton)];
+
+ while (digits[3] >= 1000) {
+ digits[0]++;
+ digits[3] -= 1000;
+ }
+ while (digits[3] >= 100) {
+ digits[1]++;
+ digits[3] -= 100;
+ }
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 4; i++) {
+ if ((i == 3) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Font_LoadChar(play, digits[i] + 0x824F, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F;
+ decodedBufPos++;
+ spC0 += 16.0f * msgCtx->textCharScale;
+ }
+ }
+ func_8014CCB4(play, &decodedBufPos, &charTexIdx, &spC0);
+ } else if (curChar == 0x22F) {
+ for (i = 0; i < 5; i++) {
+ digits[i] = gSaveContext.save.saveInfo.bomberCode[i];
+ Font_LoadChar(play, digits[i] + 0x824F, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F;
+ decodedBufPos++;
+ spC0 += 16.0f * msgCtx->textCharScale;
+ }
+ decodedBufPos--;
+ } else if ((curChar >= 0x231) && (curChar < 0x237)) {
+ // index = curChar - 0x231;
+ msgCtx->decodedBuffer.wchar[decodedBufPos] =
+ D_801D027C[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0x231)])];
+ decodedBufPos++;
+ Message_LoadChar(
+ play,
+ D_801D0284[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0x231)])],
+ &charTexIdx, &spC0, decodedBufPos);
+ decodedBufPos++;
+ msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x2000;
+ } else if (curChar == 0x237) {
+ timeToMoonCrash = TIME_UNTIL_MOON_CRASH;
+ digits[0] = 0;
+ digits[1] = TIME_TO_HOURS_F_ALT(timeToMoonCrash);
+
+ while (digits[1] >= 10) {
+ digits[0]++;
+ digits[1] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 2; i++) {
+ if ((i == 1) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+ Font_LoadChar(play, 0x8E9E, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x8E9E;
+ decodedBufPos++;
+ Font_LoadChar(play, 0x8AD4, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x8E9E;
+ spC0 += 2.0f * (16.0f * msgCtx->textCharScale);
+ } else if (curChar == 0x238) {
+ Message_LoadTime(play, curChar, &charTexIdx, &spC0, &decodedBufPos);
+ } else if ((curChar == 0x300) || (curChar == 0x301) || (curChar == 0x302) || (curChar == 0x308)) {
+ if (curChar == 0x308) {
+ value = (s32)HS_GET_HIGH_SCORE_3_LOWER();
+ } else {
+ value = HIGH_SCORE(curChar - 0x300);
+ }
+ if (curChar == 0x302) {
+ if (LINK_AGE_IN_YEARS == YEARS_CHILD) {
+ value &= 0x7F;
+ } else {
+ value = (s16)((HIGH_SCORE(font->msgBuf.wchar[msgCtx->msgBufPos]) & 0xFF000000) >> 0x18) & 0x7F;
+ }
+ }
+ digits[3] = value;
+ digits[0] = digits[1] = digits[2] = 0;
+
+ while (digits[3] >= 1000) {
+ digits[0]++;
+ digits[3] -= 1000;
+ }
+ while (digits[3] >= 100) {
+ digits[1]++;
+ digits[3] -= 100;
+ }
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 4; i++) {
+ if ((i == 3) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Font_LoadChar(play, digits[i] + 0x824F, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F;
+ decodedBufPos++;
+ spC0 += 16.0f * msgCtx->textCharScale;
+ }
+ }
+ decodedBufPos--;
+ } else if ((curChar == 0x307) || (curChar == 0x309) || (curChar == 0x30A) || (curChar == 0x30B) ||
+ (curChar == 0x30C)) {
+ var_fs0 = 8.0f;
+ if (curChar == 0x307) {
+ Message_GetTimerDigits(GET_HIGH_SCORE(HS_UNK_1), spAC);
+ } else if (curChar == 0x309) {
+ Message_GetTimerDigits(GET_HIGH_SCORE(HS_HORSE_BACK_BALLOON), spAC);
+ } else {
+ Message_GetTimerDigits(
+ ((void)0, gSaveContext.save.saveInfo.dekuPlaygroundHighScores[curChar - 0x30A]), spAC);
+ }
+
+ loadChar = false;
+ for (i = 0; i < 8; i++) {
+ if ((i == 4) || ((i != 2) && (i != 5) && (spAC[i] != '\0'))) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Font_LoadChar(play, spAC[i] + 0x824F, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.wchar[decodedBufPos] = spAC[i] + 0x824F;
+ decodedBufPos++;
+ } else {
+ var_fs0 -= 1.0f;
+ }
+ }
+ spC0 += var_fs0 * (16.0f * msgCtx->textCharScale);
+ decodedBufPos--;
+ } else if ((curChar == 0x303) || (curChar == 0x304) || (curChar == 0x305)) {
+ temp2 = HIGH_SCORE(curChar - 0x303 + HS_BOAT_ARCHERY);
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = temp2;
+
+ while (digits[3] >= 60) {
+ digits[1]++;
+ if (digits[1] >= 10) {
+ digits[0]++;
+ digits[1] -= 10;
+ }
+ digits[3] -= 60;
+ }
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ for (i = 0; i < 4; i++) {
+ Font_LoadChar(play, digits[i] + 0x824F, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F;
+ decodedBufPos++;
+ if (i == 1) {
+ Font_LoadChar(play, 0x95AA, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x95AA;
+ decodedBufPos++;
+ } else if (i == 3) {
+ Font_LoadChar(play, 0x9562, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x9562;
+ }
+ }
+ spC0 += 4.0f * (16.0f * msgCtx->textCharScale);
+ } else if (curChar == 0x306) {
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = HS_GET_TOWN_SHOOTING_GALLERY_HIGH_SCORE();
+
+ while (digits[3] >= 1000) {
+ digits[0]++;
+ digits[3] -= 1000;
+ }
+ while (digits[3] >= 100) {
+ digits[1]++;
+ digits[3] -= 100;
+ }
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 4; i++) {
+ if ((i == 3) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Font_LoadChar(play, digits[i] + 0x824F, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F;
+ decodedBufPos++;
+ spC0 += 16.0f * msgCtx->textCharScale;
+ }
+ }
+ Message_LoadChar(play, 0x9543, &charTexIdx, &spC0, decodedBufPos);
+ } else if ((curChar == 0x30D) || (curChar == 0x30E) || (curChar == 0x30F)) {
+ //! Removing index and casting one version causes gSaveContext to be reloaded
+ // index = curChar - 0x30D;
+
+ for (playerNameLen = 8; playerNameLen > 0; playerNameLen--) {
+ if (gSaveContext.save.saveInfo.inventory
+ .dekuPlaygroundPlayerName[(s16)(curChar - 0x30D)][playerNameLen - 1] != 0x3E) {
+ break;
+ }
+ }
+
+ for (i = 0; i < playerNameLen; i++) {
+ ptr2 = &font->fontBuf[((void)0, gSaveContext.save.saveInfo.inventory
+ .dekuPlaygroundPlayerName[curChar - 0x30D][i]) *
+ FONT_CHAR_TEX_SIZE];
+ msgCtx->decodedBuffer.wchar[decodedBufPos + i] = 0x30D;
+
+ for (var_v0 = 0; var_v0 < FONT_CHAR_TEX_SIZE; var_v0 += 4) {
+ font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 0] = ptr2[var_v0 + 0];
+ font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 1] = ptr2[var_v0 + 1];
+ font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 2] = ptr2[var_v0 + 2];
+ font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 3] = ptr2[var_v0 + 3];
+ }
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ }
+ decodedBufPos += playerNameLen - 1;
+ spC0 += playerNameLen * (16.0f * msgCtx->textCharScale);
+ } else if (curChar == 0x310) {
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = HS_GET_BOAT_ARCHERY_HIGH_SCORE();
+
+ while (digits[3] >= 1000) {
+ digits[0]++;
+ digits[3] -= 1000;
+ }
+ while (digits[3] >= 100) {
+ digits[1]++;
+ digits[3] -= 100;
+ }
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 4; i++) {
+ if ((i == 3) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Font_LoadChar(play, digits[i] + 0x824F, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F;
+ decodedBufPos++;
+ spC0 += 16.0f * msgCtx->textCharScale;
+ }
+ }
+ Message_LoadChar(play, 0x94AD, &charTexIdx, &spC0, decodedBufPos);
+ } else if (curChar == 0x1F) {
+ decodedBufPos--;
+ for (i = 0; i < font->msgBuf.wchar[msgCtx->msgBufPos + 1]; i++) {
+ msgCtx->decodedBuffer.wchar[++decodedBufPos] = ' ';
+ spC0 += 6.0f;
+ }
+ msgCtx->msgBufPos++;
+ } else if ((curChar == 0xC) || (curChar == 0xA)) {
+ msgCtx->unk11F1A[spD2] = 0;
+ if (msgCtx->unk11F18 == 0) {
+ msgCtx->unk11F1A[spD2] = ((msgCtx->textCharScale * 16.0f * 16.0f) - spC0) * 0.5f;
+ }
+ spD2++;
+ spC0 = 0.0f;
+ if (curChar == 0xA) {
+ spE0++;
+ }
+ } else if ((curChar == 0x101) || (curChar == 0x102) || (curChar == 0x104) ||
+ ((curChar >= 0x130) && (curChar < 0x137))) {
+ // pass
+ } else if (curChar == 0x111) {
+ msgCtx->textFade = true;
+ msgCtx->decodedBuffer.wchar[++decodedBufPos] = font->msgBuf.wchar[++msgCtx->msgBufPos] & 0xFF;
+ } else if (curChar == 0x120) {
+ msgCtx->decodedBuffer.wchar[++decodedBufPos] = font->msgBuf.wchar[++msgCtx->msgBufPos];
+ if (msgCtx->textboxSkipped || (msgCtx->textBoxType == TEXTBOX_TYPE_1) ||
+ (msgCtx->textBoxType == TEXTBOX_TYPE_3) || (msgCtx->textBoxType == TEXTBOX_TYPE_6) ||
+ (msgCtx->textBoxType == TEXTBOX_TYPE_8) || (msgCtx->textBoxType == TEXTBOX_TYPE_9) ||
+ (msgCtx->textBoxType == TEXTBOX_TYPE_B) || (msgCtx->unk11F0C == 3)) {
+ Audio_PlaySfx(msgCtx->decodedBuffer.wchar[decodedBufPos]);
+ }
+ } else if (curChar == 0x128) {
+ msgCtx->decodedBuffer.wchar[++decodedBufPos] = font->msgBuf.wchar[++msgCtx->msgBufPos];
+ } else if ((curChar != 0x20) && ((curChar < 0x2000) || (curChar >= 0x2009))) {
+ Font_LoadChar(play, curChar, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ if ((curChar == 0x8169) || (curChar == 0x8175)) {
+ spC0 += 10.0f * msgCtx->textCharScale;
+ } else if (curChar == 0x8145) {
+ spC0 += (12.0f * msgCtx->textCharScale);
+ } else if ((curChar == 0x8148) || (curChar == 0x8149)) {
+ spC0 += 14.0f * msgCtx->textCharScale;
+ } else if (curChar == 0x8144) {
+ spC0 += 8.0f * msgCtx->textCharScale;
+ } else if ((curChar == 0x816A) || (curChar == 0x8176)) {
+ spC0 += 10.0f * msgCtx->textCharScale;
+ } else if ((curChar == 0x8141) || (curChar == 0x8142) || (curChar == 0x8168)) {
+ spC0 += 12.0f * msgCtx->textCharScale;
+ } else if (curChar == 0x8194) {
+ spC0 += 14.0f * msgCtx->textCharScale;
+ } else {
+ spC0 += 16.0f * msgCtx->textCharScale;
+ }
+
+ } else if (curChar == 0x20) {
+ spC0 += 6.0f;
+ }
+
+ decodedBufPos++;
+ msgCtx->msgBufPos++;
+ }
+ } else if (msgCtx->textIsCredits) {
+ Message_DecodeCredits(play);
+ } else {
+ Message_DecodeNES(play);
+ }
+}
+#else
+void Message_Decode(PlayState* play);
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/Message_Decode.s")
+#endif
+
+void func_80150A84(PlayState* play) {
+ MessageContext* msgCtx = &play->msgCtx;
+ s32 textBoxType = msgCtx->textBoxType;
+
+ if (D_801CFC78[textBoxType] != 14) {
+ DmaMgr_SendRequest0(msgCtx->textboxSegment,
+ &SEGMENT_ROM_START(message_static)[D_801CFC78[textBoxType] * 0x1000], 0x1000);
+
+ if (!play->pauseCtx.bombersNotebookOpen) {
+ if ((textBoxType == TEXTBOX_TYPE_0) || (textBoxType == TEXTBOX_TYPE_6) || (textBoxType == TEXTBOX_TYPE_A) ||
+ (textBoxType == TEXTBOX_TYPE_B)) {
+ msgCtx->textboxColorRed = 0;
+ msgCtx->textboxColorGreen = 0;
+ msgCtx->textboxColorBlue = 0;
+ } else if (textBoxType == TEXTBOX_TYPE_1) {
+ msgCtx->textboxColorRed = 70;
+ msgCtx->textboxColorGreen = 50;
+ msgCtx->textboxColorBlue = 30;
+ } else if ((textBoxType == TEXTBOX_TYPE_2) || (textBoxType == TEXTBOX_TYPE_8)) {
+ msgCtx->textboxColorRed = 0;
+ msgCtx->textboxColorGreen = 10;
+ msgCtx->textboxColorBlue = 50;
+ } else if (textBoxType == TEXTBOX_TYPE_D) {
+ msgCtx->textboxColorRed = 255;
+ msgCtx->textboxColorGreen = 255;
+ msgCtx->textboxColorBlue = 195;
+ } else {
+ msgCtx->textboxColorRed = 255;
+ msgCtx->textboxColorGreen = 0;
+ msgCtx->textboxColorBlue = 0;
+ }
+
+ if (textBoxType == TEXTBOX_TYPE_1) {
+ msgCtx->textboxColorAlphaTarget = 230;
+ } else if (textBoxType == TEXTBOX_TYPE_3) {
+ msgCtx->textboxColorAlphaTarget = 180;
+ } else if (textBoxType == TEXTBOX_TYPE_D) {
+ msgCtx->textboxColorAlphaTarget = 220;
+ } else {
+ msgCtx->textboxColorAlphaTarget = 170;
+ }
+ } else {
+ msgCtx->textboxColorRed = 255;
+ msgCtx->textboxColorGreen = 255;
+ msgCtx->textboxColorBlue = 255;
+ msgCtx->textboxColorAlphaTarget = 255;
+ }
+ msgCtx->textboxColorAlphaCurrent = 0;
+ }
+}
+
+void Message_OpenText(PlayState* play, u16 textId) {
+ MessageContext* msgCtx = &play->msgCtx;
+ Font* font = &msgCtx->font;
+ Player* player = GET_PLAYER(play);
+ f32 var_fv0;
+
+ if (play->msgCtx.msgMode == MSGMODE_NONE) {
+ gSaveContext.prevHudVisibility = gSaveContext.hudVisibility;
+ }
+
+ if (textId == 0xFF) {
+ func_80115844(play, DO_ACTION_STOP);
+ play->msgCtx.hudVisibility = gSaveContext.hudVisibility;
+ Interface_SetHudVisibility(HUD_VISIBILITY_A_B_C);
+ gSaveContext.save.unk_06 = 20;
+ } else if ((textId == 0x579) || (textId == 0x8D8)) {
+ Interface_SetHudVisibility(HUD_VISIBILITY_A_HEARTS_MAGIC_WITH_OVERWRITE);
+ } else if (((textId == 0x28) || (textId == 0x29) || (textId == 0x2A)) &&
+ (player->transformation == PLAYER_FORM_DEKU)) {
+ //! FAKE:
+ if (msgCtx) {}
+ textId = 0xC9;
+ } else if (textId == 0x11) {
+ if (gSaveContext.save.saveInfo.inventory.strayFairies[((void)0, gSaveContext.dungeonIndex)] == 0xF) {
+ textId = 0xF3;
+ }
+ } else if ((textId == 0x92) && (play->sceneId == SCENE_KOEPONARACE)) {
+ textId = 0xCD;
+ }
+
+ if ((textId == 0xC) && (GET_QUEST_HEART_PIECE_COUNT != 0)) {
+ textId = GET_QUEST_HEART_PIECE_COUNT;
+ textId += 0xC4;
+ }
+
+ msgCtx->currentTextId = textId;
+
+ if ((msgCtx->currentTextId == 0xC) || (msgCtx->currentTextId == 0xD) || (msgCtx->currentTextId == 0xC5) ||
+ (msgCtx->currentTextId == 0xC6) || (msgCtx->currentTextId == 0xC7)) {
+ Interface_SetHudVisibility(HUD_VISIBILITY_A_HEARTS_MAGIC_WITH_OVERWRITE);
+ }
+
+ msgCtx->messageHasSetSfx = false;
+ D_801C6A70 = 0;
+ msgCtx->textboxSkipped = false;
+ msgCtx->textIsCredits = false;
+ var_fv0 = 1.0f;
+
+ if (play->pauseCtx.bombersNotebookOpen) {
+ if (gSaveContext.options.language == LANGUAGE_JPN) {
+ msgCtx->textCharScale = 1.4f;
+ msgCtx->unk11FFC = 0x1E;
+ msgCtx->unk11FF8 = 0x32;
+ var_fv0 = 1.4;
+ } else {
+ msgCtx->textCharScale = 1.4f;
+ msgCtx->unk11FFC = 0x16;
+ msgCtx->unk11FF8 = 0x32;
+ var_fv0 = 1.4;
+ }
+ } else if (textId >= 0x4E20) {
+ msgCtx->textIsCredits = true;
+ msgCtx->textCharScale = 0.85f;
+ msgCtx->unk11FFC = 6;
+ msgCtx->unk11FF8 = 0x14;
+ } else if (gSaveContext.options.language == LANGUAGE_JPN) {
+ msgCtx->textCharScale = 0.88f;
+ msgCtx->unk11FFC = 0x12;
+ msgCtx->unk11FF8 = 0x32;
+ } else {
+ msgCtx->textCharScale = 0.75f;
+ msgCtx->unk11FFC = 0xC;
+ msgCtx->unk11FF8 = 0x41;
+ }
+
+ sCharTexSize = msgCtx->textCharScale * 16.0f;
+ sCharTexScale = 1024.0f / msgCtx->textCharScale;
+ D_801F6B08 = 1024.0f / var_fv0;
+
+ if (msgCtx->textIsCredits) {
+ Message_FindCreditsMessage(play, textId);
+ msgCtx->msgLength = font->messageEnd;
+ DmaMgr_SendRequest0(&font->msgBuf, &SEGMENT_ROM_START(staff_message_data_static)[font->messageStart],
+ font->messageEnd);
+ } else if (gSaveContext.options.language == LANGUAGE_JPN) {
+ Message_FindMessage(play, textId);
+ msgCtx->msgLength = font->messageEnd;
+ DmaMgr_SendRequest0(&font->msgBuf, &SEGMENT_ROM_START(message_data_static)[font->messageStart],
+ font->messageEnd);
+ } else {
+ Message_FindMessageNES(play, textId);
+ msgCtx->msgLength = font->messageEnd;
+ DmaMgr_SendRequest0(&font->msgBuf, &SEGMENT_ROM_START(message_data_static)[font->messageStart],
+ font->messageEnd);
+ }
+
+ msgCtx->choiceNum = 0;
+ msgCtx->textUnskippable = false;
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_00;
+ msgCtx->textDrawPos = 0;
+ msgCtx->msgBufPos = 0;
+ msgCtx->decodedTextLen = 0;
+
+ msgCtx->unk11F08 = font->msgBuf.schar[msgCtx->msgBufPos] << 8;
+ msgCtx->unk11F08 |= font->msgBuf.schar[msgCtx->msgBufPos + 1];
+
+ msgCtx->unk11F18 = (msgCtx->unk11F08 & 0xF000) >> 0xC;
+ msgCtx->textBoxType = (msgCtx->unk11F08 & 0xF00) >> 8;
+ msgCtx->textBoxPos = (msgCtx->unk11F08 & 0xF0) >> 4;
+ msgCtx->unk11F0C = msgCtx->unk11F08 & 0xF;
+
+ if ((msgCtx->unk11F0C == 1) || (msgCtx->unk11F0C == 3)) {
+ msgCtx->textUnskippable = true;
+ }
+ msgCtx->itemId = 0xFE;
+
+ if ((msgCtx->textBoxType == TEXTBOX_TYPE_5) || (msgCtx->textBoxType == TEXTBOX_TYPE_D) ||
+ (play->pauseCtx.bombersNotebookOpen)) {
+ msgCtx->unk120CE = msgCtx->unk120D0 = msgCtx->unk120D2 = 0;
+ } else {
+ msgCtx->unk120CE = msgCtx->unk120D0 = msgCtx->unk120D2 = 0xFF;
+ }
+
+ msgCtx->choiceIndex = 0;
+
+ if (msgCtx->unk11F0C != 3) {
+ msgCtx->textColorAlpha = 0xFF;
+ } else {
+ msgCtx->textColorAlpha = 0;
+ }
+
+ if (textId == 0x1467) {
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_KAFEI);
+ }
+
+ if (textId == 0x2955) {
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ANJU);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_KAFEI);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_COUPLES_MASK);
+ }
+}
+
+void func_801514B0(PlayState* play, u16 arg1, u8 arg2) {
+ MessageContext* msgCtx = &play->msgCtx;
+ Font* font = &msgCtx->font;
+ Player* player = GET_PLAYER(play);
+ f32 temp = 1024.0f;
+
+ msgCtx->ocarinaAction = 0xFFFF;
+
+ if (msgCtx->msgMode == MSGMODE_NONE) {
+ gSaveContext.prevHudVisibility = gSaveContext.hudVisibility;
+ }
+ msgCtx->messageHasSetSfx = false;
+ D_801C6A70 = 0;
+ msgCtx->textboxSkipped = false;
+ msgCtx->textIsCredits = false;
+
+ if (gSaveContext.options.language == LANGUAGE_JPN) {
+ msgCtx->textCharScale = 0.88f;
+ msgCtx->unk11FFC = 0x12;
+ msgCtx->unk11FF8 = 0x32;
+ } else {
+ msgCtx->textCharScale = 0.75f;
+ msgCtx->unk11FFC = 0xC;
+ msgCtx->unk11FF8 = 0x41;
+ }
+
+ sCharTexSize = msgCtx->textCharScale * 16.0f;
+ sCharTexScale = temp / msgCtx->textCharScale;
+ D_801F6B08 = temp / 1;
+
+ if ((arg1 == 0x1709) && (player->transformation == 3)) {
+ arg1 = 0x1705;
+ }
+
+ msgCtx->currentTextId = arg1;
+
+ if (gSaveContext.options.language == LANGUAGE_JPN) {
+ Message_FindMessage(play, arg1);
+ msgCtx->msgLength = font->messageEnd;
+ DmaMgr_SendRequest0(&font->msgBuf, &SEGMENT_ROM_START(message_data_static)[font->messageStart],
+ font->messageEnd);
+ } else {
+ Message_FindMessageNES(play, arg1);
+ msgCtx->msgLength = font->messageEnd;
+ DmaMgr_SendRequest0(&font->msgBuf, &SEGMENT_ROM_START(message_data_static)[font->messageStart],
+ font->messageEnd);
+ }
+ msgCtx->choiceNum = 0;
+ msgCtx->textUnskippable = false;
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_00;
+ msgCtx->textDrawPos = 0;
+ msgCtx->msgBufPos = 0;
+ msgCtx->decodedTextLen = 0;
+ msgCtx->unk11F08 = font->msgBuf.wchar[msgCtx->msgBufPos];
+ msgCtx->unk11F18 = (msgCtx->unk11F08 & 0xF000) >> 0xC;
+ msgCtx->textBoxType = TEXTBOX_TYPE_9;
+ msgCtx->textBoxPos = arg2;
+ msgCtx->unk11F0C = msgCtx->unk11F08 & 0xF;
+ msgCtx->textUnskippable = true;
+ DmaMgr_SendRequest0(msgCtx->textboxSegment, &SEGMENT_ROM_START(message_static)[D_801CFC78[0] << 12], 0x1000);
+ msgCtx->textboxColorRed = 0;
+ msgCtx->textboxColorGreen = 0;
+ msgCtx->textboxColorBlue = 0;
+ msgCtx->textboxColorAlphaTarget = 0xE6;
+ msgCtx->textboxColorAlphaCurrent = 0;
+ msgCtx->textColorAlpha = 0xFF;
+ msgCtx->talkActor = NULL;
+ msgCtx->msgMode = MSGMODE_TEXT_START;
+ msgCtx->stateTimer = 0;
+ msgCtx->textDelayTimer = 0;
+ play->msgCtx.ocarinaMode = OCARINA_MODE_NONE;
+ msgCtx->unk120D2 = 0xFF;
+ msgCtx->unk120CE = msgCtx->unk120D0 = msgCtx->unk120D2;
+}
+
+void Message_StartTextbox(PlayState* play, u16 textId, Actor* actor) {
MessageContext* msgCtx = &play->msgCtx;
msgCtx->ocarinaAction = 0xFFFF;
- func_80150D08(play, textId);
- msgCtx->unkActor = Actor;
- msgCtx->msgMode = 1;
+ Message_OpenText(play, textId);
+ msgCtx->talkActor = actor;
+ msgCtx->msgMode = MSGMODE_TEXT_START;
msgCtx->stateTimer = 0;
- msgCtx->unk12024 = 0;
- play->msgCtx.ocarinaMode = 0;
+ msgCtx->textDelayTimer = 0;
+ play->msgCtx.ocarinaMode = OCARINA_MODE_NONE;
}
-void func_80151938(PlayState* play, u16 textId) {
+void Message_ContinueTextbox(PlayState* play, u16 textId) {
MessageContext* msgCtx = &play->msgCtx;
InterfaceContext* interfaceCtx = &play->interfaceCtx;
msgCtx->msgLength = 0;
- func_80150D08(play, textId);
+ Message_OpenText(play, textId);
func_80150A84(play);
- msgCtx->msgMode = 5;
+ msgCtx->msgMode = MSGMODE_TEXT_CONTINUING;
msgCtx->stateTimer = 8;
- msgCtx->unk12024 = 0;
+ msgCtx->textDelayTimer = 0;
if (interfaceCtx->unk_222 == 0) {
if (textId != 0x1B93) {
@@ -327,26 +3341,26 @@ void func_80151938(PlayState* play, u16 textId) {
func_8011552C(play, DO_ACTION_DECIDE);
}
}
- msgCtx->unk1203C = msgCtx->unk1203A;
+ msgCtx->textboxColorAlphaCurrent = msgCtx->textboxColorAlphaTarget;
if (play->pauseCtx.bombersNotebookOpen) {
- msgCtx->unk12004 = 0x22;
- msgCtx->unk12006 = 0x15E;
- func_80149C18(play);
+ msgCtx->textboxXTarget = 34;
+ msgCtx->textboxYTarget = 350;
+ Message_GrowTextbox(play);
msgCtx->stateTimer = 1;
}
}
-void func_80151A68(PlayState* play, u16 textId) {
+void Message_DisplaySceneTitleCard(PlayState* play, u16 textId) {
MessageContext* msgCtx = &play->msgCtx;
msgCtx->msgLength = 0;
- func_80150D08(play, textId);
+ Message_OpenText(play, textId);
func_80150A84(play);
- func_8015B198(play);
- msgCtx->msgMode = 0x45;
- msgCtx->unk12024 = 0;
- msgCtx->unk1203C = msgCtx->unk1203A = msgCtx->unk1201E = 0;
+ Message_DecodeNES(play);
+ msgCtx->msgMode = MSGMODE_SCENE_TITLE_CARD_FADE_IN_BACKGROUND;
+ msgCtx->textDelayTimer = 0;
+ msgCtx->textboxColorAlphaCurrent = msgCtx->textboxColorAlphaTarget = msgCtx->textColorAlpha = 0;
msgCtx->stateTimer = 30;
// Day/Dawn/Night.. Messages
@@ -365,54 +3379,235 @@ 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++;
}
}
}
-u32 func_80151C9C(PlayState* play) {
+/**
+ * @return s32 true if an entry to be shown was found and triggered
+ */
+s32 Message_BombersNotebookProcessEventQueue(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)) {
- func_80151938(play, D_801C6AB8[msgCtx->unk120B2[msgCtx->unk120B1]]);
- play_sound(NA_SE_SY_SCHEDULE_WRITE);
+ if ((sBombersNotebookEventMessages
+ [msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount]] != 0) &&
+ CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
+ Message_ContinueTextbox(
+ play, sBombersNotebookEventMessages
+ [msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount]]);
+ Audio_PlaySfx(NA_SE_SY_SCHEDULE_WRITE);
return true;
}
}
}
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80151DA4.s")
+u16 D_801D028C[] = {
+ 0x1B5A, // OCARINA_ACTION_0
+ 0x1B5B, //
+ 0x1B5C, // OCARINA_ACTION_DEMONSTRATE_SONATA
+ 0x1B5D, // OCARINA_ACTION_DEMONSTRATE_GORON_LULLABY
+ 0x1B5E, // OCARINA_ACTION_DEMONSTRATE_NEW_WAVE
+ 0x1B5F, // OCARINA_ACTION_DEMONSTRATE_ELEGY
+ 0x1B60, // OCARINA_ACTION_DEMONSTRATE_OATH
+ 0x1B61, // OCARINA_ACTION_DEMONSTRATE_SARIAS
+ 0x1B62, // OCARINA_ACTION_DEMONSTRATE_TIME
+ 0x1B63, // OCARINA_ACTION_DEMONSTRATE_HEALING
+ 0x1B64, // OCARINA_ACTION_DEMONSTRATE_EPONAS
+ 0x1B65, // OCARINA_ACTION_DEMONSTRATE_SOARING
+ 0x1B66, // OCARINA_ACTION_DEMONSTRATE_STORMS
+ 0x1B67, // OCARINA_ACTION_DEMONSTRATE_SUNS
+ 0x1B68, // OCARINA_ACTION_DEMONSTRATE_INVERTED_TIME
+ 0x1B69, // OCARINA_ACTION_DEMONSTRATE_DOUBLE_TIME
+ 0x1B6A, // OCARINA_ACTION_DEMONSTRATE_GORON_LULLABY_INTRO
+ 0, // OCARINA_ACTION_11
+ 0xDC7, // OCARINA_ACTION_3B
+ 0xDC9, // OCARINA_ACTION_3C
+ 0x120A, // OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_FIRST_HALF
+ 0x120B, // OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_FIRST_HALF
+ 0x122C, // OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_SECOND_HALF
+ 0x122F, // OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_SECOND_HALF
+ 0x120A, // OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF
+ 0x120B, // OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF
+};
-void func_80152434(PlayState* play, u16 arg2) {
- play->msgCtx.unk12046 = 0;
- func_80151DA4(play, arg2);
+u16 sOcarinaSongFlagsMap[] = { 1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, 0x400, 0x800 };
+
+void Message_DisplayOcarinaStaffImpl(PlayState* play, u16 ocarinaAction) {
+ MessageContext* msgCtx = &play->msgCtx;
+ s16 j;
+ s16 noStop;
+ s32 k;
+ u32 i;
+
+ msgCtx->ocarinaAvailableSongs = 0;
+
+ for (i = msgCtx->ocarinaAvailableSongs; i <= (QUEST_SONG_SUN - QUEST_SONG_SONATA); i++) {
+ if (CHECK_QUEST_ITEM(QUEST_SONG_SONATA + i)) {
+ msgCtx->ocarinaAvailableSongs = msgCtx->ocarinaAvailableSongs | sOcarinaSongFlagsMap[i];
+ }
+ }
+
+ if (CHECK_QUEST_ITEM(QUEST_SONG_TIME)) {
+ msgCtx->ocarinaAvailableSongs |= 0x3000;
+ }
+ if (CHECK_QUEST_ITEM(QUEST_SONG_LULLABY_INTRO)) {
+ msgCtx->ocarinaAvailableSongs |= 0x4000;
+ }
+ if (CHECK_QUEST_ITEM(QUEST_SONG_LULLABY)) {
+ msgCtx->ocarinaAvailableSongs &= (u16)~0x4000;
+ }
+ if (gSaveContext.save.saveInfo.scarecrowSpawnSongSet) {
+ msgCtx->ocarinaAvailableSongs |= 0x400000;
+ }
+ if (CHECK_EVENTINF(EVENTINF_31)) {
+ msgCtx->ocarinaAvailableSongs |= 0x800000;
+ }
+
+ msgCtx->ocarinaStaff = AudioOcarina_GetRecordingStaff();
+
+ if ((ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) ||
+ (ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) {
+ sOcarinaButtonAlphaValues[0] = sOcarinaButtonAlphaValues[1] = sOcarinaButtonAlphaValues[2] =
+ sOcarinaButtonAlphaValues[3] = 255;
+ } else {
+ msgCtx->ocarinaStaff->pos = 0;
+ sOcarinaButtonIndexBufPos = 0;
+ sOcarinaButtonIndexBufLen = 0;
+ Message_ResetOcarinaButtonState(play);
+ }
+
+ sLastPlayedSong = 0xFF;
+ msgCtx->lastPlayedSong = 0xFF;
+ msgCtx->ocarinaButtonIndex = OCARINA_BTN_INVALID;
+ noStop = false;
+ msgCtx->ocarinaAction = ocarinaAction;
+
+ if ((ocarinaAction >= OCARINA_ACTION_TIMED_PROMPT_SONATA) &&
+ (ocarinaAction <= OCARINA_ACTION_TIMED_PROMPT_STORMS)) {
+ Message_OpenText(play, 0x1B59);
+ func_80150A84(play);
+ } else if ((ocarinaAction == OCARINA_ACTION_3B) || (ocarinaAction == OCARINA_ACTION_3C)) {
+ noStop = true;
+ Message_OpenText(play, D_801D028C[ocarinaAction - 0x29]);
+ func_80150A84(play);
+ } else if ((ocarinaAction >= OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_FIRST_HALF) &&
+ (ocarinaAction <= OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) {
+ noStop = true;
+ Message_OpenText(play, D_801D028C[ocarinaAction - 0x29]);
+ func_80150A84(play);
+ } else if ((ocarinaAction >= OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) &&
+ (ocarinaAction <= OCARINA_ACTION_PROMPT_WIND_FISH_DEKU)) {
+ noStop = true;
+ Message_OpenText(play, 0x1B59);
+ func_80150A84(play);
+ } else if ((ocarinaAction == OCARINA_ACTION_FREE_PLAY) || (ocarinaAction >= OCARINA_ACTION_CHECK_TIME)) {
+ if ((ocarinaAction >= OCARINA_ACTION_CHECK_TIME) && (ocarinaAction <= OCARINA_ACTION_CHECK_STORMS)) {
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
+ }
+ if (ocarinaAction == OCARINA_ACTION_SCARECROW_SPAWN_DEMONSTRATION) {
+ Message_OpenText(play, 0x1B5B);
+ func_80150A84(play);
+ } else {
+ Message_OpenText(play, 0x1B5A);
+ func_80150A84(play);
+ }
+ } else {
+ noStop = true;
+ if (ocarinaAction >= OCARINA_ACTION_PROMPT_SONATA) {
+ Message_OpenText(play, 0x1B59);
+ func_80150A84(play);
+ } else {
+ Message_OpenText(play, D_801D028C[ocarinaAction]);
+ func_80150A84(play);
+ }
+ }
+
+ msgCtx->talkActor = NULL;
+ msgCtx->textDelayTimer = 0;
+ play->msgCtx.ocarinaMode = OCARINA_MODE_NONE;
+ msgCtx->textboxXTarget = 34;
+ msgCtx->textboxYTarget = 142;
+ msgCtx->stateTimer = 8;
+ Message_GrowTextbox(play);
+ msgCtx->textboxX = 34;
+ msgCtx->textboxY = 142;
+ msgCtx->unk1200C = 0x200;
+ msgCtx->unk1200E = 0x200;
+ msgCtx->unk12008 = 0x100;
+ msgCtx->unk1200A = 0x40;
+ msgCtx->msgMode = MSGMODE_TEXT_CONTINUING;
+ msgCtx->textboxColorAlphaCurrent = msgCtx->textboxColorAlphaTarget;
+ msgCtx->textboxColorAlphaCurrent = msgCtx->textboxColorAlphaTarget;
+
+ if (!noStop) {
+ func_80115844(play, DO_ACTION_STOP);
+ noStop = gSaveContext.hudVisibility;
+ Interface_SetHudVisibility(HUD_VISIBILITY_B_ALT);
+ gSaveContext.hudVisibility = noStop;
+ }
+
+ if ((ocarinaAction == OCARINA_ACTION_FREE_PLAY) || (ocarinaAction == OCARINA_ACTION_CHECK_NOTIME)) {
+ msgCtx->msgMode = MSGMODE_OCARINA_STARTING;
+ msgCtx->textBoxType = TEXTBOX_TYPE_E;
+ } else if (ocarinaAction == OCARINA_ACTION_3A) {
+ msgCtx->msgMode = MSGMODE_32;
+ } else if (ocarinaAction == OCARINA_ACTION_37) {
+ msgCtx->msgMode = MSGMODE_2F;
+ msgCtx->textBoxType = TEXTBOX_TYPE_2;
+ } else if (ocarinaAction == OCARINA_ACTION_SCARECROW_LONG_DEMONSTRATION) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
+ msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff();
+ msgCtx->ocarinaStaff->pos = 0;
+ sOcarinaButtonIndexBufLen = 0;
+ sOcarinaButtonIndexBufPos = sOcarinaButtonIndexBufLen;
+ Message_ResetOcarinaButtonState(play);
+ msgCtx->msgMode = MSGMODE_SCARECROW_LONG_DEMONSTRATION;
+ AudioOcarina_SetPlaybackSong(OCARINA_SONG_SCARECROW_LONG + 1, 1);
+ gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
+ Interface_SetHudVisibility(HUD_VISIBILITY_NONE);
+ }
+
+ for (j = 0, k = 0; j < 48; j++, k += FONT_CHAR_TEX_SIZE) {
+ Font_LoadChar(play, 0x8140, k);
+ };
+
+ msgCtx->stateTimer = 3;
}
-void func_80152464(PlayState* play, u16 arg1) {
- play->msgCtx.unk12046 = 1;
- func_80151DA4(play, arg1);
+void Message_DisplayOcarinaStaff(PlayState* play, u16 ocarinaAction) {
+ play->msgCtx.blockSunsSong = false;
+ Message_DisplayOcarinaStaffImpl(play, ocarinaAction);
+}
+
+void Message_DisplayOcarinaStaffBlockSunsSong(PlayState* play, u16 ocarinaAction) {
+ play->msgCtx.blockSunsSong = true;
+ Message_DisplayOcarinaStaffImpl(play, ocarinaAction);
}
/**
@@ -423,113 +3618,1488 @@ u8 Message_GetState(MessageContext* msgCtx) {
return TEXT_STATE_NONE;
}
- if (msgCtx->msgMode == 0x42) {
- if (msgCtx->unk11F14 != 0xFFFF) {
+ if (msgCtx->msgMode == MSGMODE_TEXT_DONE) {
+ if (msgCtx->nextTextId != 0xFFFF) {
return TEXT_STATE_1;
}
- if ((msgCtx->unk12020 == 0x10) || (msgCtx->unk12020 == 0x11)) {
+ if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_10) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_11)) {
return TEXT_STATE_CHOICE;
}
- if ((msgCtx->unk12020 == 0x40) || (msgCtx->unk12020 == 0x42) || (msgCtx->unk12020 == 0x30)) {
+ if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_40) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_42) ||
+ (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_30)) {
return TEXT_STATE_5;
}
- if (msgCtx->unk12020 == 0x41) {
+ if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_41) {
return TEXT_STATE_16;
}
- if ((msgCtx->unk12020 >= 0x50) && (msgCtx->unk12020 < 0x58)) {
+ if ((msgCtx->textboxEndType >= TEXTBOX_ENDTYPE_50) && (msgCtx->textboxEndType <= TEXTBOX_ENDTYPE_57)) {
return TEXT_STATE_3;
}
- if ((msgCtx->unk12020 == 0x60) || (msgCtx->unk12020 == 0x61)) {
+ if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_60) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_61)) {
return TEXT_STATE_14;
}
- if (msgCtx->unk12020 == 0x62) {
+ if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_62) {
return TEXT_STATE_15;
}
- if (msgCtx->unk12020 == 0x63) {
+ if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_63) {
return TEXT_STATE_17;
}
- if (msgCtx->unk12020 == 0x12) {
+ if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_12) {
return TEXT_STATE_18;
}
return TEXT_STATE_DONE;
}
- if (msgCtx->msgMode == 0x41) {
+ if (msgCtx->msgMode == MSGMODE_TEXT_AWAIT_NEXT) {
return TEXT_STATE_10;
}
- if (msgCtx->msgMode == 0x1B) {
+ if (msgCtx->msgMode == MSGMODE_SONG_DEMONSTRATION_DONE) {
return TEXT_STATE_7;
}
- if ((msgCtx->ocarinaMode == 3) || (msgCtx->msgMode == 0x37)) {
+ if ((msgCtx->ocarinaMode == OCARINA_MODE_EVENT) || (msgCtx->msgMode == MSGMODE_37)) {
return TEXT_STATE_8;
}
- if (msgCtx->msgMode == 0x20) {
+ if (msgCtx->msgMode == MSGMODE_OCARINA_AWAIT_INPUT) {
return TEXT_STATE_9;
}
- if ((msgCtx->msgMode == 0x21) || (msgCtx->msgMode == 0x3A)) {
+ if ((msgCtx->msgMode == MSGMODE_21) || (msgCtx->msgMode == MSGMODE_3A)) {
return TEXT_STATE_11;
}
- if (msgCtx->msgMode == 0x3D) {
+ if (msgCtx->msgMode == MSGMODE_3D) {
return TEXT_STATE_12;
}
- if (msgCtx->msgMode == 0x40) {
+ if (msgCtx->msgMode == MSGMODE_40) {
return TEXT_STATE_13;
}
- if ((msgCtx->msgMode == 0x43) && (msgCtx->stateTimer == 1) && (msgCtx->unk120B1 == 0)) {
+ if ((msgCtx->msgMode == MSGMODE_TEXT_CLOSING) && (msgCtx->stateTimer == 1) &&
+ (msgCtx->bombersNotebookEventQueueCount == 0)) {
return TEXT_STATE_CLOSING;
}
return TEXT_STATE_3;
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8015268C.s")
+void Message_DrawTextBox(PlayState* play, Gfx** gfxP) {
+ MessageContext* msgCtx = &play->msgCtx;
+ Gfx* gfx = *gfxP;
-void func_80152C64(View* view) {
+ gDPPipeSync(gfx++);
+
+ if (((u32)msgCtx->textBoxType == TEXTBOX_TYPE_0) || (msgCtx->textBoxType == TEXTBOX_TYPE_2) ||
+ (msgCtx->textBoxType == TEXTBOX_TYPE_9) || (msgCtx->textBoxType == TEXTBOX_TYPE_A)) {
+ gDPSetRenderMode(gfx++, G_RM_CLD_SURF, G_RM_CLD_SURF2);
+ } else if (msgCtx->textBoxType == TEXTBOX_TYPE_3) {
+ gDPSetAlphaCompare(gfx++, G_AC_THRESHOLD);
+ gDPSetRenderMode(gfx++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
+ }
+
+ gDPSetPrimColor(gfx++, 0, 0, msgCtx->textboxColorRed, msgCtx->textboxColorGreen, msgCtx->textboxColorBlue,
+ msgCtx->textboxColorAlphaCurrent);
+
+ if (((u32)msgCtx->textBoxType == TEXTBOX_TYPE_0) || (msgCtx->textBoxType == TEXTBOX_TYPE_2) ||
+ (msgCtx->textBoxType == TEXTBOX_TYPE_6) || (msgCtx->textBoxType == TEXTBOX_TYPE_8) ||
+ (msgCtx->textBoxType == TEXTBOX_TYPE_9) || (msgCtx->textBoxType == TEXTBOX_TYPE_A)) {
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment, G_IM_FMT_I, 128, 64, 0, G_TX_MIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, 7, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ } else {
+ gDPPipeSync(gfx++);
+
+ if (msgCtx->textBoxType == TEXTBOX_TYPE_3) {
+ gDPSetEnvColor(gfx++, 0, 0, 0, 255);
+ } else if (msgCtx->textBoxType == TEXTBOX_TYPE_D) {
+ gDPSetEnvColor(gfx++, 20, 0, 10, 255);
+ } else {
+ gDPSetEnvColor(gfx++, 50, 20, 0, 255);
+ }
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment, G_IM_FMT_IA, 128, 64, 0, G_TX_MIRROR | G_TX_WRAP,
+ G_TX_MIRROR | G_TX_WRAP, 7, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ }
+
+ if (msgCtx->textBoxType == TEXTBOX_TYPE_A) {
+ gSPTextureRectangle(gfx++, msgCtx->textboxX << 2, (msgCtx->textboxY + 22) << 2,
+ (msgCtx->textboxX + msgCtx->unk12008) << 2, (msgCtx->textboxY + 54) << 2, G_TX_RENDERTILE,
+ 0, 6, msgCtx->unk1200C << 1, 2 << 10);
+ } else {
+ gSPTextureRectangle(gfx++, msgCtx->textboxX << 2, (msgCtx->textboxY) << 2,
+ (msgCtx->textboxX + sTextboxWidth) << 2, (msgCtx->textboxY + sTextboxHeight) << 2,
+ G_TX_RENDERTILE, 0, 0, sTextboxTexWidth, sTextboxTexHeight);
+ }
+
+ // Draw treble clef
+ if (msgCtx->textBoxType == TEXTBOX_TYPE_3) {
+ gDPPipeSync(gfx++);
+ gDPSetCombineLERP(gfx++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE,
+ 0);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 100, 0, 255);
+ gDPLoadTextureBlock_4b(gfx++, gOcarinaTrebleClefTex, G_IM_FMT_I, 16, 32, 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);
+ gSPTextureRectangle(gfx++, 78 << 2, 166 << 2, 94 << 2, 198 << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
+ }
+
+ *gfxP = gfx++;
+}
+
+void Message_SetView(View* view) {
SET_FULLSCREEN_VIEWPORT(view);
View_ApplyOrthoToOverlay(view);
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80152CAC.s")
+void func_80152CAC(PlayState* play) {
+ MessageContext* msgCtx = &play->msgCtx;
-// Spawn song effect?
-void func_80152EC0(PlayState* play) {
+ if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_SONATA) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_MONKEY);
+ } else if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_HEALING) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_PIANO);
+ } else if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_SARIAS) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_TATL);
+ } else if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EPONAS) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_FEMALE_VOICE);
+ } else if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_STORMS) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
+ } else if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_GORON_LULLABY) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_BABY_SINGING);
+ } else if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_GORON_LULLABY_INTRO) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_ELDER_GORON_DRUMS);
+ } else if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_OATH) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_TATL);
+ } else if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_ELEGY) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_IKANA_KING);
+ } else {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
+ }
+
+ if ((msgCtx->ocarinaAction == OCARINA_ACTION_3B) || (msgCtx->ocarinaAction == OCARINA_ACTION_3C)) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_ELDER_GORON_DRUMS);
+ AudioOcarina_SetPlaybackSong(OCARINA_SONG_GORON_LULLABY_INTRO + 1, 0x83);
+ return;
+ }
+ if ((msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_FIRST_HALF) ||
+ (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_FIRST_HALF)) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_BASS_GUITAR);
+ AudioOcarina_SetPlaybackSong(
+ ((msgCtx->ocarinaAction - OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_FIRST_HALF) + OCARINA_SONG_EVAN_PART1 + 1),
+ 0x84);
+ return;
+ }
+ if ((msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_SECOND_HALF) ||
+ (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_SECOND_HALF)) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_ZORA_GUITAR);
+ AudioOcarina_SetPlaybackSong(
+ ((msgCtx->ocarinaAction - OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_SECOND_HALF) + OCARINA_SONG_EVAN_PART1 + 1),
+ 0x44);
+ return;
+ }
+ AudioOcarina_SetPlaybackSong((msgCtx->ocarinaAction - OCARINA_ACTION_FREE_PLAY), 2);
+}
+
+s16 sOcarinaEffectActorIds[] = {
+ ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect
+ ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect
+ ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect
+ ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect
+ ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect
+ ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect
+ ACTOR_OCEFF_WIPE, // Song of Time Effect
+ ACTOR_OCEFF_WIPE7, // Song of Healing Effect
+ ACTOR_OCEFF_WIPE2, // Epona's Song Effect
+ ACTOR_OCEFF_WIPE6, // Song of Soaring Effect
+ ACTOR_OCEFF_STORM, // Song of Storms Effect II [?]
+ ACTOR_OCEFF_SPOT, // Sun's Song Effect
+ ACTOR_OCEFF_WIPE, // Song of Time Effect
+ ACTOR_OCEFF_WIPE, // Song of Time Effect
+ ACTOR_OCEFF_WIPE4 // Scarecrow's Song Effect
+};
+s32 sOcarinaEffectActorParams[] = { 0, 1, 2, 3, 4, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0 };
+
+void Message_SpawnSongEffect(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
Player* player = GET_PLAYER(play);
+ //! FAKE:
if (1) {}
- if ((msgCtx->songPlayed < 0x17) && (msgCtx->songPlayed != 0xE) &&
- ((msgCtx->ocarinaAction < 0x43) || (msgCtx->ocarinaAction >= 0x47))) {
- msgCtx->unk120B0 = 1;
- if (msgCtx->songPlayed != 0x16) {
- Actor_Spawn(&play->actorCtx, play, D_801D02D8[msgCtx->songPlayed], player->actor.world.pos.x,
- player->actor.world.pos.y, player->actor.world.pos.z, 0, 0, 0, D_801D02F8[msgCtx->songPlayed]);
- return;
+ if ((msgCtx->songPlayed <= OCARINA_SONG_SCARECROW_SPAWN) &&
+ (msgCtx->songPlayed != OCARINA_SONG_GORON_LULLABY_INTRO) &&
+ !((msgCtx->ocarinaAction >= OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) &&
+ (msgCtx->ocarinaAction <= OCARINA_ACTION_PROMPT_WIND_FISH_DEKU))) {
+ msgCtx->ocarinaSongEffectActive = true;
+ if (msgCtx->songPlayed != OCARINA_SONG_SCARECROW_SPAWN) {
+ Actor_Spawn(&play->actorCtx, play, sOcarinaEffectActorIds[msgCtx->songPlayed], player->actor.world.pos.x,
+ player->actor.world.pos.y, player->actor.world.pos.z, 0, 0, 0,
+ sOcarinaEffectActorParams[msgCtx->songPlayed]);
+ } else {
+ Actor_Spawn(&play->actorCtx, play, ACTOR_OCEFF_WIPE4, player->actor.world.pos.x, player->actor.world.pos.y,
+ player->actor.world.pos.z, 0, 0, 0, 0);
}
- Actor_Spawn(&play->actorCtx, play, ACTOR_OCEFF_WIPE4, player->actor.world.pos.x, player->actor.world.pos.y,
- player->actor.world.pos.z, 0, 0, 0, 0);
}
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80152FB8.s")
+Color_RGB16 sOcarinaButtonAPrimColors[] = {
+ { 80, 150, 255 },
+ { 100, 200, 255 },
+};
+Color_RGB16 sOcarinaButtonAEnvColors[] = {
+ { 10, 10, 10 },
+ { 50, 50, 255 },
+};
+Color_RGB16 sOcarinaButtonCPrimColors[] = {
+ { 255, 255, 50 },
+ { 255, 255, 180 },
+};
+Color_RGB16 sOcarinaButtonCEnvColors[] = {
+ { 10, 10, 10 },
+ { 110, 110, 50 },
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80153750.s")
+void Message_FlashOcarinaButtons(void) {
+ sOcarinaButtonStepR = ABS_ALT(sOcarinaButtonAPrimR - sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].r) /
+ sOcarinaButtonFlashTimer;
+ sOcarinaButtonStepG = ABS_ALT(sOcarinaButtonAPrimG - sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].g) /
+ sOcarinaButtonFlashTimer;
+ sOcarinaButtonStepB = ABS_ALT(sOcarinaButtonAPrimB - sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].b) /
+ sOcarinaButtonFlashTimer;
-void func_80153E7C(PlayState* play, void* arg1) {
- if ((gSaveContext.options.language == 0) && (play->msgCtx.unk12090 == 0)) {
- func_8014ADBC(play, arg1);
- return;
+ if (sOcarinaButtonAPrimR >= sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].r) {
+ sOcarinaButtonAPrimR -= sOcarinaButtonStepR;
+ } else {
+ sOcarinaButtonAPrimR += sOcarinaButtonStepR;
}
- if (play->msgCtx.unk12090 != 0) {
- func_8015E7EC(play, arg1);
- return;
+ if (sOcarinaButtonAPrimG >= sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].g) {
+ sOcarinaButtonAPrimG -= sOcarinaButtonStepG;
+ } else {
+ sOcarinaButtonAPrimG += sOcarinaButtonStepG;
+ }
+ if (sOcarinaButtonAPrimB >= sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].b) {
+ sOcarinaButtonAPrimB -= sOcarinaButtonStepB;
+ } else {
+ sOcarinaButtonAPrimB += sOcarinaButtonStepB;
+ }
+
+ sOcarinaButtonStepR = ABS_ALT(sOcarinaButtonAEnvR - sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].r) /
+ sOcarinaButtonFlashTimer;
+ sOcarinaButtonStepG = ABS_ALT(sOcarinaButtonAEnvG - sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].g) /
+ sOcarinaButtonFlashTimer;
+ sOcarinaButtonStepB = ABS_ALT(sOcarinaButtonAEnvB - sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].b) /
+ sOcarinaButtonFlashTimer;
+
+ if (sOcarinaButtonCEnvR >= sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].r) {
+ sOcarinaButtonAEnvR -= sOcarinaButtonStepR;
+ } else {
+ sOcarinaButtonAEnvR += sOcarinaButtonStepR;
+ }
+ if (sOcarinaButtonCEnvG >= sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].g) {
+ sOcarinaButtonAEnvG -= sOcarinaButtonStepG;
+ } else {
+ sOcarinaButtonAEnvG += sOcarinaButtonStepG;
+ }
+ if (sOcarinaButtonCEnvB >= sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].b) {
+ sOcarinaButtonAEnvB -= sOcarinaButtonStepB;
+ } else {
+ sOcarinaButtonAEnvB += sOcarinaButtonStepB;
+ }
+
+ sOcarinaButtonStepR = ABS_ALT(sOcarinaButtonCPrimR - sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].r) /
+ sOcarinaButtonFlashTimer;
+ sOcarinaButtonStepG = ABS_ALT(sOcarinaButtonCPrimG - sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].g) /
+ sOcarinaButtonFlashTimer;
+ sOcarinaButtonStepB = ABS_ALT(sOcarinaButtonCPrimB - sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].b) /
+ sOcarinaButtonFlashTimer;
+
+ if (sOcarinaButtonCPrimR >= sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].r) {
+ sOcarinaButtonCPrimR -= sOcarinaButtonStepR;
+ } else {
+ sOcarinaButtonCPrimR += sOcarinaButtonStepR;
+ }
+ if (sOcarinaButtonCPrimG >= sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].g) {
+ sOcarinaButtonCPrimG -= sOcarinaButtonStepG;
+ } else {
+ sOcarinaButtonCPrimG += sOcarinaButtonStepG;
+ }
+ if (sOcarinaButtonCPrimB >= sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].b) {
+ sOcarinaButtonCPrimB -= sOcarinaButtonStepB;
+ } else {
+ sOcarinaButtonCPrimB += sOcarinaButtonStepB;
+ }
+
+ sOcarinaButtonStepR = ABS_ALT(sOcarinaButtonCEnvR - sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].r) /
+ sOcarinaButtonFlashTimer;
+ sOcarinaButtonStepG = ABS_ALT(sOcarinaButtonCEnvG - sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].g) /
+ sOcarinaButtonFlashTimer;
+ sOcarinaButtonStepB = ABS_ALT(sOcarinaButtonCEnvB - sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].b) /
+ sOcarinaButtonFlashTimer;
+
+ if (sOcarinaButtonCEnvR >= sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].r) {
+ sOcarinaButtonCEnvR -= sOcarinaButtonStepR;
+ } else {
+ sOcarinaButtonCEnvR += sOcarinaButtonStepR;
+ }
+ if (sOcarinaButtonCEnvG >= sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].g) {
+ sOcarinaButtonCEnvG -= sOcarinaButtonStepG;
+ } else {
+ sOcarinaButtonCEnvG += sOcarinaButtonStepG;
+ }
+ if (sOcarinaButtonCEnvB >= sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].b) {
+ sOcarinaButtonCEnvB -= sOcarinaButtonStepB;
+ } else {
+ sOcarinaButtonCEnvB += sOcarinaButtonStepB;
+ }
+
+ sOcarinaButtonFlashTimer--;
+ if (sOcarinaButtonFlashTimer == 0) {
+ sOcarinaButtonAPrimR = sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].r;
+ sOcarinaButtonAPrimG = sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].g;
+ sOcarinaButtonAPrimB = sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].b;
+ sOcarinaButtonAEnvR = sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].r;
+ sOcarinaButtonAEnvG = sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].g;
+ sOcarinaButtonAEnvB = sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].b;
+ sOcarinaButtonCPrimR = sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].r;
+ sOcarinaButtonCPrimG = sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].g;
+ sOcarinaButtonCPrimB = sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].b;
+ sOcarinaButtonCEnvR = sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].r;
+ sOcarinaButtonCEnvG = sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].g;
+ sOcarinaButtonCEnvB = sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].b;
+ sOcarinaButtonFlashTimer = 3;
+ sOcarinaButtonFlashColorIndex ^= 1;
}
- func_8015966C(play, arg1, 0);
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80153EF0.s")
+TexturePtr sOcarinaButtonTextures[] = {
+ gOcarinaATex, gOcarinaCDownTex, gOcarinaCRightTex, gOcarinaCLeftTex, gOcarinaCUpTex,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_801541D4.s")
+void Message_DrawOcarinaButtons(PlayState* play, Gfx** gfxP) {
+ MessageContext* msgCtx = &play->msgCtx;
+ Gfx* gfx = *gfxP;
+ u16 i;
+ u16 notePosX;
+
+ if ((play->msgCtx.msgMode >= MSGMODE_OCARINA_PLAYING) && (msgCtx->msgMode <= MSGMODE_40)) {
+ if ((msgCtx->ocarinaAction != OCARINA_ACTION_FREE_PLAY) &&
+ (msgCtx->ocarinaAction != OCARINA_ACTION_CHECK_NOTIME)) {
+ Gfx_SetupDL39_Ptr(&gfx);
+
+ gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+
+ if ((msgCtx->msgMode == MSGMODE_SONG_PROMPT) || (msgCtx->msgMode == MSGMODE_36)) {
+ if ((msgCtx->ocarinaAction != OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) &&
+ (msgCtx->ocarinaAction != OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) {
+ if (msgCtx->ocarinaAction >= OCARINA_ACTION_TIMED_PROMPT_SONATA) {
+ sOcarinaButtonStepG = msgCtx->ocarinaAction - OCARINA_ACTION_TIMED_PROMPT_SONATA;
+ } else if ((msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) ||
+ (msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) {
+ // Can never pass as the conditional is opposite to one scope higher
+ sOcarinaButtonStepG = (msgCtx->ocarinaAction - OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) +
+ OCARINA_SONG_EVAN_PART1;
+ } else if ((msgCtx->ocarinaAction >= OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) &&
+ (msgCtx->ocarinaAction <= OCARINA_ACTION_PROMPT_WIND_FISH_DEKU)) {
+ sOcarinaButtonStepG = msgCtx->ocarinaAction - OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN +
+ OCARINA_SONG_WIND_FISH_HUMAN;
+ } else {
+ sOcarinaButtonStepG = msgCtx->ocarinaAction - OCARINA_ACTION_PROMPT_SONATA;
+ }
+ sOcarinaButtonStepR = gOcarinaSongButtons[sOcarinaButtonStepG].numButtons;
+
+ for (notePosX = 98, i = 0; i < sOcarinaButtonStepR; notePosX += 18, i++) {
+ gDPPipeSync(gfx++);
+ gDPSetPrimColor(gfx++, 0, 0, 150, 150, 150, 150);
+ gDPSetEnvColor(gfx++, 10, 10, 10, 0);
+
+ gDPLoadTextureBlock(
+ gfx++, sOcarinaButtonTextures[gOcarinaSongButtons[sOcarinaButtonStepG].buttonIndex[i]],
+ 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);
+
+ gSPTextureRectangle(
+ gfx++, notePosX << 2,
+ msgCtx->ocarinaButtonsPosY[gOcarinaSongButtons[sOcarinaButtonStepG].buttonIndex[i]] << 2,
+ (notePosX + 16) << 2,
+ (msgCtx->ocarinaButtonsPosY[gOcarinaSongButtons[sOcarinaButtonStepG].buttonIndex[i]] + 16)
+ << 2,
+ G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
+ }
+ }
+ }
+
+ if (msgCtx->msgMode != MSGMODE_SCARECROW_LONG_RECORDING_START) {
+ for (notePosX = 98, i = 0; i < 8; notePosX += 18, i++) {
+ if (sOcarinaButtonIndexBuf[i] == OCARINA_BTN_INVALID) {
+ break;
+ }
+
+ if (sOcarinaButtonAlphaValues[i] != 255) {
+ sOcarinaButtonAlphaValues[i] += 50;
+ if (sOcarinaButtonAlphaValues[i] >= 255) {
+ sOcarinaButtonAlphaValues[i] = 255;
+ }
+ }
+
+ gDPPipeSync(gfx++);
+ if (sOcarinaButtonIndexBuf[i] == OCARINA_BTN_A) {
+ gDPSetPrimColor(gfx++, 0, 0, sOcarinaButtonAPrimR, sOcarinaButtonAPrimG, sOcarinaButtonAPrimB,
+ sOcarinaButtonAlphaValues[i]);
+ gDPSetEnvColor(gfx++, sOcarinaButtonAEnvR, sOcarinaButtonAEnvG, sOcarinaButtonAEnvB, 0);
+ } else {
+ gDPSetPrimColor(gfx++, 0, 0, sOcarinaButtonCPrimR, sOcarinaButtonCPrimG, sOcarinaButtonCPrimB,
+ sOcarinaButtonAlphaValues[i]);
+ gDPSetEnvColor(gfx++, sOcarinaButtonCEnvR, sOcarinaButtonCEnvG, sOcarinaButtonCEnvB, 0);
+ }
+
+ gDPLoadTextureBlock(gfx++, sOcarinaButtonTextures[sOcarinaButtonIndexBuf[i]], 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);
+
+ gSPTextureRectangle(
+ gfx++, notePosX << 2, msgCtx->ocarinaButtonsPosY[sOcarinaButtonIndexBuf[i]] << 2,
+ (notePosX + 16) << 2, (msgCtx->ocarinaButtonsPosY[sOcarinaButtonIndexBuf[i]] + 16) << 2,
+ G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
+ }
+ }
+ }
+ }
+ *gfxP = gfx;
+}
+
+void Message_DrawText(PlayState* play, Gfx** gfxP) {
+ if ((gSaveContext.options.language == LANGUAGE_JPN) && !play->msgCtx.textIsCredits) {
+ Message_DrawTextDefault(play, gfxP);
+ } else if (play->msgCtx.textIsCredits) {
+ Message_DrawTextCredits(play, gfxP);
+ } else {
+ Message_DrawTextNES(play, gfxP, 0);
+ }
+}
+
+void Message_DrawSceneTitleCard(PlayState* play, Gfx** gfxP) {
+ MessageContext* msgCtx = &play->msgCtx;
+ Gfx* gfx;
+
+ gfx = *gfxP;
+ Gfx_SetupDL39_Ptr(&gfx);
+
+ gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetTextureFilter(gfx++, G_TF_BILERP);
+ gDPSetAlphaDither(gfx++, G_AD_NOTPATTERN);
+ gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, msgCtx->textboxColorAlphaCurrent);
+ gDPSetEnvColor(gfx++, 140, 40, 160, 255);
+ gDPLoadTextureBlock(gfx++, gSceneTitleCardGradientTex, G_IM_FMT_I, G_IM_SIZ_8b, 64, 1, 0, G_TX_NOMIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, 6, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ gSPTextureRectangle(gfx++, 0, XREG(77) << 2, 320 << 2, (XREG(77) + XREG(76)) << 2, G_TX_RENDERTILE, 0, 0, 204,
+ 1 << 10);
+ gDPPipeSync(gfx++);
+ gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetEnvColor(gfx++, 0, 0, 0, 255);
+
+ if ((msgCtx->currentTextId < 0x1BB2) || (msgCtx->currentTextId >= 0x1BB7)) {
+ msgCtx->unk11FF8 = XREG(75);
+ }
+ msgCtx->unk11FFA = XREG(74);
+ Message_DrawTextNES(play, &gfx, 0);
+ *gfxP = gfx++;
+}
+
+s16 sOcarinaSongFanfares[] = {
+ NA_BGM_OCARINA_SONATA, // OCARINA_SONG_SONATA
+ NA_BGM_OCARINA_LULLABY, // OCARINA_SONG_GORON_LULLABY
+ NA_BGM_OCARINA_NEW_WAVE, // OCARINA_SONG_NEW_WAVE
+ NA_BGM_OCARINA_ELEGY, // OCARINA_SONG_ELEGY
+ NA_BGM_OCARINA_OATH, // OCARINA_SONG_OATH
+ NA_BGM_MAJORAS_LAIR, // OCARINA_SONG_SARIAS
+ NA_BGM_OCARINA_TIME, // OCARINA_SONG_TIME
+ NA_BGM_OCARINA_HEALING, // OCARINA_SONG_HEALING
+ NA_BGM_OCARINA_EPONA, // OCARINA_SONG_EPONAS
+ NA_BGM_OCARINA_SOARING, // OCARINA_SONG_SOARING
+ NA_BGM_OCARINA_STORM, // OCARINA_SONG_STORMS
+ NA_BGM_OCARINA_SUNS, // OCARINA_SONG_SUNS
+ NA_BGM_INVERTED_SONG_OF_TIME, // OCARINA_SONG_INVERTED_TIME
+ NA_BGM_SONG_OF_DOUBLE_TIME, // OCARINA_SONG_DOUBLE_TIME
+ NA_BGM_OCARINA_LULLABY_INTRO_PTR, // OCARINA_SONG_GORON_LULLABY_INTRO
+ NA_BGM_OCARINA_LULLABY_INTRO_PTR, // OCARINA_SONG_WIND_FISH_HUMAN
+ NA_BGM_OCARINA_LULLABY_INTRO_PTR, // OCARINA_SONG_WIND_FISH_GORON
+};
+
+s8 sOcarinaSongFanfareIoData[PLAYER_FORM_MAX] = {
+ 0x35, // PLAYER_FORM_FIERCE_DEITY
+ 0x5C, // PLAYER_FORM_GORON
+ 0x5D, // PLAYER_FORM_ZORA
+ 0x5E, // PLAYER_FORM_DEKU
+ 0x35, // PLAYER_FORM_HUMAN
+};
+
+u8 sPlayerFormOcarinaInstruments[] = {
+ OCARINA_INSTRUMENT_DEFAULT,
+ OCARINA_INSTRUMENT_GORON_DRUMS,
+ OCARINA_INSTRUMENT_ZORA_GUITAR,
+ OCARINA_INSTRUMENT_DEKU_PIPES,
+};
+
+s16 D_801D03A8[TEXTBOX_TYPE_MAX] = {
+ 0x3B, // TEXTBOX_TYPE_0
+ 0x3B, // TEXTBOX_TYPE_1
+ 0x3B, // TEXTBOX_TYPE_2
+ 0x3B, // TEXTBOX_TYPE_3
+ 0x22, // TEXTBOX_TYPE_4
+ 0x3B, // TEXTBOX_TYPE_5
+ 0x3B, // TEXTBOX_TYPE_6
+ 0x3B, // TEXTBOX_TYPE_7
+ 0x3B, // TEXTBOX_TYPE_8
+ 0x3B, // TEXTBOX_TYPE_9
+ 0x3B, // TEXTBOX_TYPE_A
+ 0x3B, // TEXTBOX_TYPE_B
+ 0x3B, // TEXTBOX_TYPE_C
+ 0x3B, // TEXTBOX_TYPE_D
+ 0x3B, // TEXTBOX_TYPE_E
+ 0x3B, // TEXTBOX_TYPE_F
+};
+
+void Message_DrawMain(PlayState* play, Gfx** gfxP) {
+ s32 pad;
+ MessageContext* msgCtx = &play->msgCtx;
+ Gfx* gfx;
+ u16 i;
+ u16 buttonIndexPos;
+ u8 ocarinaError;
+ s32 j;
+ s16 temp_v0_33;
+ s16 temp;
+
+ gfx = *gfxP;
+
+ gSPSegment(gfx++, 0x02, play->interfaceCtx.parameterSegment);
+ gSPSegment(gfx++, 0x07, msgCtx->textboxSegment);
+
+ if (msgCtx->msgLength != 0) {
+ if (!msgCtx->textIsCredits) {
+ Message_SetView(&msgCtx->view);
+ Gfx_SetupDL39_Ptr(&gfx);
+ if (msgCtx->ocarinaAction != OCARINA_ACTION_37) {
+ if ((msgCtx->msgMode != MSGMODE_18) && (msgCtx->msgMode != MSGMODE_39) &&
+ (msgCtx->msgMode != MSGMODE_3C) && (msgCtx->msgMode != MSGMODE_3F) &&
+ (msgCtx->msgMode != MSGMODE_3A) && (msgCtx->msgMode != MSGMODE_3D) &&
+ (msgCtx->msgMode != MSGMODE_40) &&
+ (((msgCtx->msgMode >= MSGMODE_TEXT_BOX_GROWING) && (msgCtx->msgMode <= MSGMODE_TEXT_DONE)) ||
+ ((msgCtx->msgMode >= MSGMODE_NEW_CYCLE_0) && (msgCtx->msgMode <= MSGMODE_OWL_SAVE_2))) &&
+ (D_801CFC78[msgCtx->textBoxType] != 0xE)) {
+ Message_DrawTextBox(play, &gfx);
+ }
+ }
+ }
+ Gfx_SetupDL39_Ptr(&gfx);
+ gDPSetAlphaCompare(gfx++, G_AC_NONE);
+ gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE,
+ 0);
+
+ if (YREG(0) != msgCtx->msgMode) {
+ YREG(0) = msgCtx->msgMode;
+ YREG(1) = msgCtx->ocarinaAction;
+ }
+
+ switch (msgCtx->msgMode) {
+ case MSGMODE_TEXT_START:
+ case MSGMODE_TEXT_BOX_GROWING:
+ case MSGMODE_TEXT_STARTING:
+ case MSGMODE_TEXT_NEXT_MSG:
+ break;
+
+ case MSGMODE_TEXT_CONTINUING:
+ if (msgCtx->stateTimer == 1) {
+ for (i = 0, j = 0; i < 48; i++, j += FONT_CHAR_TEX_SIZE) {
+ Font_LoadChar(play, 0x8140, j);
+ }
+ Message_DrawText(play, &gfx);
+ } else {
+ gDPPipeSync(gfx++);
+ gDPSetRenderMode(gfx++, G_RM_CLD_SURF, G_RM_CLD_SURF2);
+ gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 0);
+ gDPSetEnvColor(gfx++, 0, 0, 0, 255);
+ }
+ break;
+
+ case MSGMODE_TEXT_DISPLAYING:
+ case MSGMODE_TEXT_DELAYED_BREAK:
+ case MSGMODE_9:
+ if ((gSaveContext.options.language == LANGUAGE_JPN) && !msgCtx->textIsCredits) {
+ if (msgCtx->textDelay != 0) {
+ msgCtx->textDrawPos += msgCtx->textDelay;
+ }
+ Message_DrawTextNES(play, &gfx, 0);
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Message_DrawTextNES(play, &gfx, (s32)msgCtx->textDrawPos);
+ }
+ } else if (msgCtx->textIsCredits) {
+ Message_DrawTextCredits(play, &gfx);
+ } else {
+ if (msgCtx->textDelay != 0) {
+ msgCtx->textDrawPos += msgCtx->textDelay;
+ }
+ Message_DrawTextNES(play, &gfx, 0);
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Message_DrawTextNES(play, &gfx, (s32)msgCtx->textDrawPos);
+ }
+ }
+ break;
+
+ case MSGMODE_NEW_CYCLE_0:
+ case MSGMODE_NEW_CYCLE_1:
+ case MSGMODE_NEW_CYCLE_2:
+ case MSGMODE_OWL_SAVE_0:
+ case MSGMODE_OWL_SAVE_1:
+ case MSGMODE_OWL_SAVE_2:
+ Message_DrawTextNES(play, &gfx, 0);
+ break;
+
+ case MSGMODE_TEXT_AWAIT_INPUT:
+ case MSGMODE_TEXT_AWAIT_NEXT:
+ Message_DrawText(play, &gfx);
+ Message_DrawTextboxIcon(play, &gfx, 158,
+ (s16)(D_801D03A8[msgCtx->textBoxType] + msgCtx->textboxYTarget));
+ break;
+
+ case MSGMODE_OCARINA_STARTING:
+ case MSGMODE_SONG_DEMONSTRATION_STARTING:
+ case MSGMODE_SONG_PROMPT_STARTING:
+ case MSGMODE_32:
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
+ msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff();
+ play->msgCtx.ocarinaMode = OCARINA_MODE_ACTIVE;
+ if ((msgCtx->ocarinaAction != OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) &&
+ (msgCtx->ocarinaAction != OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) {
+ msgCtx->ocarinaStaff->pos = 0;
+ sOcarinaButtonIndexBufPos = 0;
+ Message_ResetOcarinaButtonState(play);
+ }
+ sOcarinaButtonFlashColorIndex = 1;
+ sOcarinaButtonFlashTimer = 3;
+ if (msgCtx->msgMode == MSGMODE_OCARINA_STARTING) {
+ if ((msgCtx->ocarinaAction == OCARINA_ACTION_0) ||
+ (msgCtx->ocarinaAction == OCARINA_ACTION_FREE_PLAY) ||
+ (msgCtx->ocarinaAction == OCARINA_ACTION_SCARECROW_SPAWN_RECORDING) ||
+ (msgCtx->ocarinaAction == OCARINA_ACTION_CHECK_NOTIME) ||
+ (msgCtx->ocarinaAction >= OCARINA_ACTION_CHECK_TIME)) {
+ if ((msgCtx->ocarinaAction == OCARINA_ACTION_FREE_PLAY) ||
+ (msgCtx->ocarinaAction == OCARINA_ACTION_CHECK_NOTIME)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_52_10)) {
+ AudioOcarina_StartDefault(msgCtx->ocarinaAvailableSongs | 0xC0000000);
+ } else if (CHECK_EVENTINF(EVENTINF_31)) {
+ AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]);
+ AudioOcarina_StartDefault(0x80800000);
+ } else {
+ AudioOcarina_StartAtSongStartingPos((msgCtx->ocarinaAvailableSongs + 0x80000) |
+ 0xC0000000);
+ AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]);
+ }
+ } else {
+ AudioOcarina_StartDefault(msgCtx->ocarinaAvailableSongs);
+ }
+ } else {
+ AudioOcarina_StartDefault((1 << msgCtx->ocarinaAction) | 0x80000000);
+ }
+ msgCtx->msgMode = MSGMODE_OCARINA_PLAYING;
+ if (CHECK_EVENTINF(EVENTINF_24)) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEKU_TRUMPET);
+ } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_41_20)) {
+ AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]);
+ //! FAKE:
+ (void)CUR_FORM;
+ if (gSaveContext.save.playerForm == 4) {}
+ } else {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_AMPLIFIED_GUITAR);
+ }
+ } else if (msgCtx->msgMode == MSGMODE_SONG_DEMONSTRATION_STARTING) {
+ msgCtx->stateTimer = 20;
+ msgCtx->msgMode = MSGMODE_19;
+ } else if (msgCtx->msgMode == MSGMODE_32) {
+ AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]);
+ AudioOcarina_StartDefault(0x80800000);
+ msgCtx->msgMode = MSGMODE_33;
+ } else { // MSGMODE_SONG_PROMPT_STARTING
+ if (CHECK_EVENTINF(EVENTINF_24)) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEKU_TRUMPET);
+ } else {
+ AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]);
+ }
+
+ if ((msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) ||
+ (msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) {
+ AudioOcarina_StartForSongCheck(
+ (1 << (OCARINA_ACTION_PROMPT_SONATA + msgCtx->ocarinaAction)) | 0x80000000, 4);
+ msgCtx->msgMode = MSGMODE_SONG_PROMPT;
+ } else {
+ if ((msgCtx->ocarinaAction >= OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) &&
+ (msgCtx->ocarinaAction <= OCARINA_ACTION_PROMPT_WIND_FISH_DEKU)) {
+ AudioOcarina_StartDefault(
+ (1 << ((msgCtx->ocarinaAction - OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) +
+ OCARINA_SONG_WIND_FISH_HUMAN)) |
+ 0x80000000);
+ } else {
+ AudioOcarina_StartDefault(
+ (1 << ((msgCtx->ocarinaAction - OCARINA_ACTION_PROMPT_SONATA) + OCARINA_SONG_SONATA)) |
+ 0x80000000);
+ }
+ msgCtx->msgMode = MSGMODE_SONG_PROMPT;
+ }
+ }
+
+ if ((msgCtx->ocarinaAction != OCARINA_ACTION_FREE_PLAY) &&
+ (msgCtx->ocarinaAction != OCARINA_ACTION_CHECK_NOTIME)) {
+ Message_DrawText(play, &gfx);
+ }
+ break;
+
+ case MSGMODE_OCARINA_PLAYING:
+ msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff();
+
+ if ((u32)msgCtx->ocarinaStaff->pos != 0) {
+ if ((msgCtx->ocarinaStaff->pos == 1) && (sOcarinaButtonIndexBufPos == 8)) {
+ sOcarinaButtonIndexBufPos = 0;
+ }
+
+ if (sOcarinaButtonIndexBufPos == (msgCtx->ocarinaStaff->pos - 1)) {
+ msgCtx->ocarinaButtonIndex = sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos - 1] =
+ msgCtx->ocarinaStaff->buttonIndex;
+ sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos] = OCARINA_BTN_INVALID;
+ sOcarinaButtonIndexBufPos++;
+ }
+ }
+
+ msgCtx->songPlayed = msgCtx->ocarinaStaff->state;
+
+ if (msgCtx->ocarinaStaff->state <= OCARINA_SONG_SCARECROW_SPAWN) {
+ if (msgCtx->ocarinaStaff->state == OCARINA_SONG_EVAN_PART1) {
+ AudioOcarina_ResetAndReadInput();
+ AudioOcarina_StartDefault(0x80100000);
+ } else if (msgCtx->ocarinaStaff->state == OCARINA_SONG_EVAN_PART2) {
+ Audio_PlaySfx(NA_SE_SY_CORRECT_CHIME);
+ AudioOcarina_SetOcarinaDisableTimer(0, 20);
+ Message_CloseTextbox(play);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_PLAYED_FULL_EVAN_SONG;
+ } else if ((msgCtx->ocarinaStaff->state == OCARINA_SONG_SCARECROW_SPAWN) ||
+ (msgCtx->ocarinaStaff->state == OCARINA_SONG_INVERTED_TIME) ||
+ (msgCtx->ocarinaStaff->state == OCARINA_SONG_DOUBLE_TIME) ||
+ (msgCtx->ocarinaStaff->state == OCARINA_SONG_GORON_LULLABY_INTRO) ||
+ CHECK_QUEST_ITEM(QUEST_SONG_SONATA + msgCtx->ocarinaStaff->state)) {
+ sLastPlayedSong = msgCtx->ocarinaStaff->state;
+ msgCtx->lastPlayedSong = msgCtx->ocarinaStaff->state;
+ msgCtx->songPlayed = msgCtx->ocarinaStaff->state;
+ msgCtx->msgMode = MSGMODE_E;
+ msgCtx->stateTimer = 20;
+
+ if (msgCtx->ocarinaAction == OCARINA_ACTION_CHECK_NOTIME) {
+ if ((msgCtx->ocarinaStaff->state <= OCARINA_SONG_SARIAS) ||
+ (msgCtx->ocarinaStaff->state == OCARINA_SONG_SCARECROW_SPAWN)) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
+ Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR);
+ msgCtx->msgMode = MSGMODE_OCARINA_STARTING;
+ } else {
+ Message_ContinueTextbox(play, 0x1B5B);
+ msgCtx->msgMode = MSGMODE_SONG_PLAYED;
+ msgCtx->textBoxType = TEXTBOX_TYPE_3;
+ msgCtx->stateTimer = 10;
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
+ Interface_SetHudVisibility(HUD_VISIBILITY_NONE);
+ }
+ } else if (msgCtx->ocarinaAction == OCARINA_ACTION_CHECK_SCARECROW_SPAWN) {
+ if (msgCtx->ocarinaStaff->state <= OCARINA_SONG_STORMS) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
+ Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR);
+ msgCtx->stateTimer = 10;
+ msgCtx->msgMode = MSGMODE_OCARINA_FAIL;
+ } else {
+ Message_ContinueTextbox(play, 0x1B5B);
+ msgCtx->msgMode = MSGMODE_SONG_PLAYED;
+ msgCtx->textBoxType = TEXTBOX_TYPE_3;
+ msgCtx->stateTimer = 10;
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
+ Interface_SetHudVisibility(HUD_VISIBILITY_NONE);
+ }
+ } else if (msgCtx->ocarinaAction == OCARINA_ACTION_FREE_PLAY) {
+ Message_ContinueTextbox(play, 0x1B5B);
+ msgCtx->msgMode = MSGMODE_SONG_PLAYED;
+ msgCtx->textBoxType = TEXTBOX_TYPE_3;
+ msgCtx->stateTimer = 10;
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
+ } else {
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
+ }
+ Interface_SetHudVisibility(HUD_VISIBILITY_NONE);
+ } else {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
+ Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR);
+ msgCtx->msgMode = MSGMODE_OCARINA_STARTING;
+ }
+ } else if (msgCtx->ocarinaStaff->state == OCARINA_SONG_TERMINA_WALL) {
+ Message_CloseTextbox(play);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
+ SET_EVENTINF(EVENTINF_32);
+ Audio_PlaySfx(NA_SE_SY_CORRECT_CHIME);
+ AudioOcarina_SetOcarinaDisableTimer(0, 20);
+ } else if (msgCtx->ocarinaStaff->state == 0xFF) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_52_10)) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
+ Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR);
+ msgCtx->stateTimer = 10;
+ msgCtx->msgMode = MSGMODE_OCARINA_FAIL;
+ } else {
+ AudioOcarina_SetSongStartingPos();
+ AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]);
+ AudioOcarina_StartAtSongStartingPos((msgCtx->ocarinaAvailableSongs + 0x80000) | 0xC0000000);
+ }
+ }
+ if ((msgCtx->ocarinaAction != OCARINA_ACTION_FREE_PLAY) &&
+ (msgCtx->ocarinaAction != OCARINA_ACTION_CHECK_NOTIME)) {
+ Message_DrawText(play, &gfx);
+ }
+ break;
+
+ case MSGMODE_E:
+ case MSGMODE_SONG_PROMPT_SUCCESS:
+ case MSGMODE_22:
+ case MSGMODE_SCARECROW_SPAWN_RECORDING_DONE:
+ case MSGMODE_34:
+ Message_FlashOcarinaButtons();
+ msgCtx->stateTimer--;
+ if (msgCtx->stateTimer == 0) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
+
+ if (msgCtx->msgMode == MSGMODE_E) {
+ Message_ContinueTextbox(play, 0x1B5B);
+ msgCtx->msgMode = MSGMODE_SONG_PLAYED;
+ msgCtx->textBoxType = TEXTBOX_TYPE_3;
+ msgCtx->stateTimer = 1;
+ } else if (msgCtx->msgMode == MSGMODE_SONG_PROMPT_SUCCESS) {
+ Message_ContinueTextbox(play, 0x1B5B);
+ msgCtx->msgMode = MSGMODE_SONG_PLAYED;
+ msgCtx->textBoxType = TEXTBOX_TYPE_3;
+ msgCtx->stateTimer = 1;
+ } else if (msgCtx->msgMode == MSGMODE_22) {
+ msgCtx->msgMode = MSGMODE_23;
+ play->msgCtx.ocarinaMode = OCARINA_MODE_EVENT;
+ msgCtx->textBoxType = TEXTBOX_TYPE_0;
+ } else if (msgCtx->msgMode == MSGMODE_34) {
+ if (msgCtx->songPlayed == OCARINA_SONG_TERMINA_WALL) {
+ Message_CloseTextbox(play);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_EVENT;
+ Audio_PlaySfx(NA_SE_SY_CORRECT_CHIME);
+ } else {
+ Message_CloseTextbox(play);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
+ }
+ } else {
+ Message_CloseTextbox(play);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_EVENT;
+ }
+ }
+ Message_DrawText(play, &gfx);
+ break;
+
+ case MSGMODE_OCARINA_FAIL:
+ case MSGMODE_SONG_PROMPT_FAIL:
+ Message_DrawText(play, &gfx);
+ // fallthrough
+ case MSGMODE_OCARINA_FAIL_NO_TEXT:
+ msgCtx->stateTimer--;
+ if (msgCtx->stateTimer == 0) {
+ D_801C6A94 = 1;
+ if (msgCtx->msgMode == MSGMODE_SONG_PROMPT_FAIL) {
+ Message_ContinueTextbox(play, 0x1B89);
+ Message_Decode(play);
+ msgCtx->msgMode = MSGMODE_SONG_PROMPT_NOTES_DROP;
+ } else {
+ msgCtx->msgMode = MSGMODE_OCARINA_NOTES_DROP;
+ }
+ }
+ break;
+
+ case MSGMODE_OCARINA_NOTES_DROP:
+ case MSGMODE_SONG_PROMPT_NOTES_DROP:
+ for (i = 0; i < 5; i++) {
+ msgCtx->ocarinaButtonsPosY[i] += D_801C6A94;
+ }
+ D_801C6A94 += D_801C6A94;
+ if (D_801C6A94 >= 0x226) {
+ Message_ResetOcarinaButtonAlphas();
+ if (msgCtx->msgMode == MSGMODE_SONG_PROMPT_NOTES_DROP) {
+ msgCtx->msgMode = MSGMODE_OCARINA_AWAIT_INPUT;
+ msgCtx->stateTimer = 10;
+ } else {
+ msgCtx->msgMode = MSGMODE_OCARINA_STARTING;
+ }
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
+ }
+ break;
+
+ case MSGMODE_SONG_PLAYED:
+ msgCtx->stateTimer--;
+ if (msgCtx->stateTimer == 0) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
+ Message_Decode(play);
+ msgCtx->msgMode = MSGMODE_SETUP_DISPLAY_SONG_PLAYED;
+ msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff();
+ msgCtx->ocarinaStaff->pos = 0;
+ sOcarinaButtonIndexBufPos = 0;
+ Message_ResetOcarinaButtonState(play);
+ Message_SpawnSongEffect(play);
+ }
+ break;
+
+ case MSGMODE_SETUP_DISPLAY_SONG_PLAYED:
+ Message_DrawText(play, &gfx);
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
+
+ if ((msgCtx->ocarinaAction >= OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) &&
+ (msgCtx->ocarinaAction <= OCARINA_ACTION_PROMPT_WIND_FISH_DEKU)) {
+ AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]);
+ AudioOcarina_SetPlaybackSong(msgCtx->ocarinaAction - OCARINA_ACTION_SCARECROW_LONG_RECORDING, 1);
+ } else {
+ AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]);
+ AudioOcarina_SetPlaybackSong((u8)msgCtx->songPlayed + 1, 1);
+ if (msgCtx->songPlayed != OCARINA_SONG_SCARECROW_SPAWN) {
+ func_801A3000((u16)sOcarinaSongFanfares[msgCtx->songPlayed],
+ (u8)sOcarinaSongFanfareIoData[CUR_FORM]);
+ AudioSfx_MuteBanks(0x20);
+ }
+ }
+ play->msgCtx.ocarinaMode = OCARINA_MODE_ACTIVE;
+ if (msgCtx->ocarinaAction == OCARINA_ACTION_FREE_PLAY) {
+ msgCtx->ocarinaAction = OCARINA_ACTION_FREE_PLAY_DONE;
+ }
+ if (msgCtx->ocarinaAction == OCARINA_ACTION_CHECK_NOTIME) {
+ msgCtx->ocarinaAction = OCARINA_ACTION_CHECK_NOTIME_DONE;
+ }
+ sOcarinaButtonIndexBufPos = 0;
+ msgCtx->msgMode = MSGMODE_DISPLAY_SONG_PLAYED;
+ break;
+
+ case MSGMODE_DISPLAY_SONG_PLAYED_TEXT_BEGIN:
+ if (msgCtx->songPlayed == OCARINA_SONG_SCARECROW_SPAWN) {
+ Message_ContinueTextbox(play, 0x1B6B);
+ } else {
+ Message_ContinueTextbox(play, 0x1B72 + msgCtx->songPlayed);
+ }
+ Message_Decode(play);
+ msgCtx->msgMode = MSGMODE_16;
+ msgCtx->stateTimer = 20;
+ Message_DrawText(play, &gfx);
+ break;
+
+ case MSGMODE_16:
+ msgCtx->stateTimer--;
+ if (msgCtx->stateTimer == 0) {
+ msgCtx->msgMode = MSGMODE_17;
+ }
+ Message_DrawText(play, &gfx);
+ break;
+
+ case MSGMODE_17:
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
+ Message_ResetOcarinaButtonState(play);
+ msgCtx->msgMode = MSGMODE_18;
+ msgCtx->stateTimer = 2;
+ Message_DrawText(play, &gfx);
+ break;
+
+ case MSGMODE_18:
+ msgCtx->stateTimer--;
+ if (msgCtx->stateTimer == 0) {
+ Message_CloseTextbox(play);
+ if (msgCtx->songPlayed == OCARINA_SONG_EPONAS) {
+ gHorsePlayedEponasSong = true;
+ }
+
+ if (msgCtx->ocarinaAction == OCARINA_ACTION_FREE_PLAY_DONE) {
+ if (sLastPlayedSong == OCARINA_SONG_ELEGY) {
+ if ((play->sceneId == SCENE_F40) || (play->sceneId == SCENE_F41) ||
+ (play->sceneId == SCENE_IKANAMAE) || (play->sceneId == SCENE_CASTLE) ||
+ (play->sceneId == SCENE_IKNINSIDE) || (play->sceneId == SCENE_IKANA) ||
+ (play->sceneId == SCENE_INISIE_N) || (play->sceneId == SCENE_INISIE_R) ||
+ (play->sceneId == SCENE_INISIE_BS) || (play->sceneId == SCENE_RANDOM) ||
+ (play->sceneId == SCENE_REDEAD) || (play->sceneId == SCENE_TOUGITES)) {
+ play->msgCtx.ocarinaMode = OCARINA_MODE_EVENT;
+ } else {
+ sLastPlayedSong = 0xFF;
+ Message_StartTextbox(play, 0x1B95, NULL);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_RESTRICTED_SONG;
+ }
+ } else {
+ play->msgCtx.ocarinaMode = OCARINA_MODE_EVENT;
+ if (msgCtx->songPlayed == OCARINA_SONG_SCARECROW_SPAWN) {
+ play->msgCtx.ocarinaMode = OCARINA_MODE_PLAYED_SCARECROW_SPAWN;
+ }
+ }
+ } else if (msgCtx->ocarinaAction >= OCARINA_ACTION_CHECK_SONATA) {
+ if ((OCARINA_ACTION_CHECK_SONATA + msgCtx->songPlayed) == msgCtx->ocarinaAction) {
+ play->msgCtx.ocarinaMode = OCARINA_MODE_EVENT;
+ } else {
+ play->msgCtx.ocarinaMode = msgCtx->songPlayed - 1;
+ }
+ } else if ((OCARINA_ACTION_PROMPT_SONATA + msgCtx->songPlayed) == msgCtx->ocarinaAction) {
+ play->msgCtx.ocarinaMode = OCARINA_MODE_EVENT;
+ } else {
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
+ }
+ }
+ break;
+
+ case MSGMODE_19:
+ msgCtx->stateTimer--;
+ if (msgCtx->stateTimer == 0) {
+ func_80152CAC(play);
+ sOcarinaButtonIndexBufPos = 0;
+ msgCtx->msgMode = MSGMODE_SONG_DEMONSTRATION;
+ }
+ Message_DrawText(play, &gfx);
+ break;
+
+ case MSGMODE_DISPLAY_SONG_PLAYED:
+ case MSGMODE_SONG_DEMONSTRATION:
+ msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff();
+ if (msgCtx->ocarinaStaff->state == 0) {
+ if ((msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_SECOND_HALF) ||
+ (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_SECOND_HALF)) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
+ }
+ if ((msgCtx->ocarinaAction >= OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) &&
+ (msgCtx->ocarinaAction <= OCARINA_ACTION_PROMPT_WIND_FISH_DEKU)) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
+ Message_CloseTextbox(play);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
+ } else if (msgCtx->msgMode == MSGMODE_DISPLAY_SONG_PLAYED) {
+ msgCtx->msgMode = MSGMODE_DISPLAY_SONG_PLAYED_TEXT_BEGIN;
+ } else {
+ msgCtx->msgMode = MSGMODE_SONG_DEMONSTRATION_DONE;
+ }
+ } else {
+ if ((sOcarinaButtonIndexBufPos != 0) && (msgCtx->ocarinaStaff->pos == 1)) {
+ sOcarinaButtonIndexBufPos = 0;
+ }
+
+ if (((u32)msgCtx->ocarinaStaff->pos != 0) &&
+ (sOcarinaButtonIndexBufPos == (msgCtx->ocarinaStaff->pos - 1))) {
+ msgCtx->ocarinaButtonIndex = sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos - 1] =
+ msgCtx->ocarinaStaff->buttonIndex;
+ sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos] = OCARINA_BTN_INVALID;
+ sOcarinaButtonIndexBufPos++;
+ }
+ }
+ // fallthrough
+ case MSGMODE_SONG_DEMONSTRATION_DONE:
+ Message_DrawText(play, &gfx);
+ break;
+
+ case MSGMODE_SONG_PROMPT:
+ case MSGMODE_33:
+ msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff();
+
+ if (((u32)msgCtx->ocarinaStaff->pos != 0) &&
+ (sOcarinaButtonIndexBufPos == (msgCtx->ocarinaStaff->pos - 1))) {
+ msgCtx->ocarinaButtonIndex = sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos - 1] =
+ msgCtx->ocarinaStaff->buttonIndex;
+ sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos] = OCARINA_BTN_INVALID;
+ sOcarinaButtonIndexBufPos++;
+ }
+
+ if (msgCtx->ocarinaStaff->state <= OCARINA_SONG_SCARECROW_SPAWN) {
+ if ((msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) ||
+ (msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) {
+ msgCtx->songPlayed = msgCtx->ocarinaStaff->state;
+ msgCtx->msgMode = MSGMODE_22;
+ } else {
+ msgCtx->songPlayed = msgCtx->ocarinaStaff->state;
+ msgCtx->msgMode = MSGMODE_SONG_PROMPT_SUCCESS;
+ if (msgCtx->ocarinaStaff->state == OCARINA_SONG_GORON_LULLABY_INTRO) {
+ Item_Give(play, ITEM_SONG_LULLABY_INTRO);
+ } else if (!((msgCtx->ocarinaAction >= OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) &&
+ (msgCtx->ocarinaAction <= OCARINA_ACTION_PROMPT_WIND_FISH_DEKU)) &&
+ (msgCtx->ocarinaStaff->state != OCARINA_SONG_NEW_WAVE)) {
+ Item_Give(play,
+ (gOcarinaSongItemMap[msgCtx->ocarinaStaff->state] + ITEM_SONG_SONATA) & 0xFF);
+ }
+ }
+ msgCtx->stateTimer = 20;
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
+ } else if (msgCtx->ocarinaStaff->state == OCARINA_SONG_TERMINA_WALL) {
+ msgCtx->songPlayed = msgCtx->ocarinaStaff->state;
+ msgCtx->msgMode = MSGMODE_34;
+ Item_Give(play, (gOcarinaSongItemMap[msgCtx->ocarinaStaff->state] + ITEM_SONG_SONATA) & 0xFF);
+ msgCtx->stateTimer = 20;
+ AudioOcarina_SetOcarinaDisableTimer(0, 20);
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
+ } else if (msgCtx->ocarinaStaff->state == 0xFF) {
+ Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR);
+ msgCtx->stateTimer = 10;
+ if (msgCtx->msgMode == MSGMODE_SONG_PROMPT) {
+ msgCtx->msgMode = MSGMODE_SONG_PROMPT_FAIL;
+ } else {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
+ Message_CloseTextbox(play);
+ }
+ }
+ Message_DrawText(play, &gfx);
+ break;
+
+ case MSGMODE_OCARINA_AWAIT_INPUT:
+ Message_DrawText(play, &gfx);
+ if ((msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) ||
+ (msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) {
+ msgCtx->stateTimer--;
+ if (msgCtx->stateTimer == 0) {
+ msgCtx->msgMode = MSGMODE_21;
+ msgCtx->textBoxType = TEXTBOX_TYPE_0;
+ }
+ }
+ break;
+
+ case MSGMODE_SCARECROW_LONG_RECORDING_START:
+ AudioOcarina_SetRecordingState(OCARINA_RECORD_SCARECROW_LONG);
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
+ msgCtx->ocarinaStaff = AudioOcarina_GetRecordingStaff();
+ msgCtx->ocarinaStaff->pos = 0;
+ sOcarinaButtonIndexBufPos = 0;
+ sOcarinaButtonIndexBufLen = 0;
+ Message_ResetOcarinaButtonState(play);
+ msgCtx->msgMode = MSGMODE_SCARECROW_LONG_RECORDING_ONGOING;
+ Message_DrawText(play, &gfx);
+ break;
+
+ case MSGMODE_SCARECROW_LONG_RECORDING_ONGOING:
+ msgCtx->ocarinaStaff = AudioOcarina_GetRecordingStaff();
+
+ if (((u32)msgCtx->ocarinaStaff->pos != 0) &&
+ (sOcarinaButtonIndexBufPos == (msgCtx->ocarinaStaff->pos - 1))) {
+
+ if (sOcarinaButtonIndexBufLen >= 8) {
+ for (buttonIndexPos = sOcarinaButtonIndexBufLen - 8, i = 0; i < 8; i++, buttonIndexPos++) {
+ sOcarinaButtonIndexBuf[buttonIndexPos] = sOcarinaButtonIndexBuf[buttonIndexPos + 1];
+ }
+ sOcarinaButtonIndexBufLen--;
+ }
+
+ msgCtx->ocarinaButtonIndex = sOcarinaButtonIndexBuf[sOcarinaButtonIndexBufLen] =
+ msgCtx->ocarinaStaff->buttonIndex;
+ sOcarinaButtonIndexBufLen++;
+ sOcarinaButtonIndexBuf[sOcarinaButtonIndexBufLen] = OCARINA_BTN_INVALID;
+ sOcarinaButtonIndexBufPos++;
+ if (msgCtx->ocarinaStaff) {}
+ if (msgCtx->ocarinaStaff->pos == 8) {
+ sOcarinaButtonIndexBufPos = 0;
+ }
+ }
+ Message_DrawText(play, &gfx);
+ break;
+
+ case MSGMODE_SCARECROW_LONG_DEMONSTRATION:
+ case MSGMODE_SCARECROW_SPAWN_DEMONSTRATION:
+ msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff();
+
+ if (((u32)msgCtx->ocarinaStaff->pos != 0) &&
+ (sOcarinaButtonIndexBufPos == (msgCtx->ocarinaStaff->pos - 1))) {
+ if (sOcarinaButtonIndexBufLen >= 8) {
+ for (buttonIndexPos = sOcarinaButtonIndexBufLen - 8, i = 0; i < 8; i++, buttonIndexPos++) {
+ sOcarinaButtonIndexBuf[buttonIndexPos] = sOcarinaButtonIndexBuf[buttonIndexPos + 1];
+ }
+ sOcarinaButtonIndexBufLen--;
+ }
+ sOcarinaButtonIndexBuf[sOcarinaButtonIndexBufLen] = msgCtx->ocarinaStaff->buttonIndex;
+ sOcarinaButtonIndexBufLen++;
+ sOcarinaButtonIndexBuf[sOcarinaButtonIndexBufLen] = OCARINA_BTN_INVALID;
+ sOcarinaButtonIndexBufPos++;
+ if (msgCtx->ocarinaStaff->pos == 8) {
+ sOcarinaButtonIndexBufLen = sOcarinaButtonIndexBufPos = 0;
+ }
+ }
+
+ if (msgCtx->stateTimer == 0) {
+ if (msgCtx->ocarinaStaff->state == 0) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_11;
+ Message_CloseTextbox(play);
+ }
+ } else {
+ msgCtx->stateTimer--;
+ }
+ break;
+
+ case MSGMODE_SCARECROW_SPAWN_RECORDING_START:
+ AudioOcarina_SetRecordingState(OCARINA_RECORD_SCARECROW_SPAWN);
+ AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]);
+ msgCtx->msgMode = MSGMODE_SCARECROW_SPAWN_RECORDING_ONGOING;
+ Message_DrawText(play, &gfx);
+ break;
+
+ case MSGMODE_SCARECROW_SPAWN_RECORDING_ONGOING:
+ msgCtx->ocarinaStaff = AudioOcarina_GetRecordingStaff();
+ if ((u32)msgCtx->ocarinaStaff->pos != 0) {
+ if (sOcarinaButtonIndexBufPos == (msgCtx->ocarinaStaff->pos - 1)) {
+ msgCtx->ocarinaButtonIndex = sOcarinaButtonIndexBuf[sOcarinaButtonIndexBufPos] =
+ msgCtx->ocarinaStaff->buttonIndex;
+ sOcarinaButtonIndexBufPos++;
+ sOcarinaButtonIndexBuf[sOcarinaButtonIndexBufPos] = OCARINA_BTN_INVALID;
+ }
+ }
+
+ if (msgCtx->ocarinaStaff->state == 0) {
+ msgCtx->stateTimer = 20;
+ gSaveContext.save.saveInfo.scarecrowSpawnSongSet = true;
+ msgCtx->msgMode = MSGMODE_SCARECROW_SPAWN_RECORDING_DONE;
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
+ Lib_MemCpy(gSaveContext.save.saveInfo.scarecrowSpawnSong, gScarecrowSpawnSongPtr,
+ sizeof(gSaveContext.save.saveInfo.scarecrowSpawnSong));
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.save.saveInfo.scarecrowSpawnSong); i++) {
+ // osSyncPrintf("%d, ", gSaveContext.scarecrowSpawnSong[i]);
+ }
+ } else if (msgCtx->ocarinaStaff->state == 0xFF) {
+ AudioOcarina_SetRecordingState(OCARINA_RECORD_OFF);
+ Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR);
+ Message_CloseTextbox(play);
+ msgCtx->msgMode = MSGMODE_SCARECROW_SPAWN_RECORDING_FAILED;
+ }
+ Message_DrawText(play, &gfx);
+ break;
+
+ case MSGMODE_SCARECROW_SPAWN_RECORDING_FAILED:
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
+ Message_StartTextbox(play, 0x1647, NULL);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
+ break;
+
+ case MSGMODE_2F:
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
+ msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff();
+ msgCtx->ocarinaStaff->pos = 0;
+ sOcarinaButtonIndexBufPos = 0;
+ play->msgCtx.ocarinaMode = OCARINA_MODE_ACTIVE;
+ Message_ResetOcarinaButtonState(play);
+ AudioOcarina_StartDefault(msgCtx->ocarinaAvailableSongs | 0xC0000000);
+ msgCtx->msgMode = MSGMODE_30;
+ break;
+
+ case MSGMODE_30:
+ msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff();
+ if (((u32)msgCtx->ocarinaStaff->pos != 0) &&
+ (sOcarinaButtonIndexBufPos == (msgCtx->ocarinaStaff->pos - 1))) {
+ msgCtx->ocarinaButtonIndex = msgCtx->ocarinaStaff->buttonIndex;
+ msgCtx->ocarinaStaff->pos = 0;
+ sOcarinaButtonIndexBufPos = 0;
+ Message_ResetOcarinaButtonState(play);
+ msgCtx->msgMode = MSGMODE_31;
+ }
+ break;
+
+ case MSGMODE_35:
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
+ msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff();
+ msgCtx->ocarinaStaff->pos = 0;
+ sOcarinaButtonIndexBufPos = 0;
+ play->msgCtx.ocarinaMode = OCARINA_MODE_ACTIVE;
+ Message_ResetOcarinaButtonState(play);
+ sOcarinaButtonFlashColorIndex = 1;
+ sOcarinaButtonFlashTimer = 3;
+ AudioOcarina_StartWithSongNoteLengths(
+ (1 << ((msgCtx->ocarinaAction - OCARINA_ACTION_TIMED_PROMPT_SONATA) & 0xFFFF)) | 0x80000000);
+ msgCtx->msgMode = MSGMODE_36;
+ Message_DrawText(play, &gfx);
+ break;
+
+ case MSGMODE_36:
+ msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff();
+
+ if ((u32)msgCtx->ocarinaStaff->pos != 0) {
+ if (sOcarinaButtonIndexBufPos == (msgCtx->ocarinaStaff->pos - 1)) {
+ sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos - 1] = msgCtx->ocarinaStaff->buttonIndex;
+ sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos] = OCARINA_BTN_INVALID;
+ sOcarinaButtonIndexBufPos++;
+ }
+ }
+
+ if (msgCtx->ocarinaStaff->state <= OCARINA_SONG_SCARECROW_SPAWN) {
+ msgCtx->songPlayed = msgCtx->ocarinaStaff->state;
+ msgCtx->msgMode = MSGMODE_37;
+ Item_Give(play, (gOcarinaSongItemMap[msgCtx->ocarinaStaff->state] + ITEM_SONG_SONATA) & 0xFF);
+ msgCtx->stateTimer = 20;
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
+ } else if (msgCtx->ocarinaStaff->state == 0xFF) {
+ ocarinaError = func_8019B5AC();
+ if (ocarinaError == OCARINA_ERROR_2) {
+ Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR);
+ D_801C6A94 = 1;
+ msgCtx->msgMode = MSGMODE_3B;
+ } else if (ocarinaError == OCARINA_ERROR_3) {
+ Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR);
+ D_801C6A94 = 1;
+ msgCtx->msgMode = MSGMODE_3E;
+ } else {
+ Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR);
+ D_801C6A94 = 1;
+ msgCtx->msgMode = MSGMODE_38;
+ }
+ }
+ Message_DrawText(play, &gfx);
+ break;
+
+ case MSGMODE_37:
+ Message_FlashOcarinaButtons();
+ Message_DrawText(play, &gfx);
+ break;
+
+ case MSGMODE_38:
+ case MSGMODE_3B:
+ case MSGMODE_3E:
+ // notes drop
+ for (i = 0; i < 5; i++) {
+ msgCtx->ocarinaButtonsPosY[i] += D_801C6A94;
+ }
+
+ D_801C6A94 += D_801C6A94;
+ if (D_801C6A94 >= 0x226) {
+ Message_ResetOcarinaButtonAlphas();
+ msgCtx->textBoxType = TEXTBOX_TYPE_0;
+ msgCtx->textboxColorRed = msgCtx->textboxColorGreen = msgCtx->textboxColorBlue = 0;
+ msgCtx->stateTimer = 3;
+ msgCtx->msgMode++;
+ }
+ break;
+
+ case MSGMODE_39:
+ case MSGMODE_3C:
+ case MSGMODE_3F:
+ msgCtx->stateTimer--;
+ if (msgCtx->stateTimer == 0) {
+ msgCtx->msgMode++;
+ }
+ break;
+
+ case MSGMODE_TEXT_DONE:
+ switch (msgCtx->textboxEndType) {
+ case TEXTBOX_ENDTYPE_60:
+ temp_v0_33 = msgCtx->unk120BE;
+ temp = msgCtx->unk11FFA + (msgCtx->unk11FFC * temp_v0_33);
+ func_80147F18(play, &gfx,
+ msgCtx->unk11F1A[temp_v0_33] +
+ (s32)(16.0f * msgCtx->textCharScale * (msgCtx->unk120C2 + 5)) - 1,
+ temp);
+ func_80148D64(play);
+ break;
+
+ case TEXTBOX_ENDTYPE_61:
+ temp_v0_33 = msgCtx->unk120BE;
+ temp = msgCtx->unk11FFA + (msgCtx->unk11FFC * temp_v0_33);
+ func_80148558(play, &gfx,
+ msgCtx->unk11F1A[temp_v0_33] + (s32)(16.0f * msgCtx->textCharScale * 5.0f) - 1,
+ temp);
+ func_80149048(play);
+ break;
+
+ case TEXTBOX_ENDTYPE_62:
+ temp_v0_33 = msgCtx->unk120BE;
+ temp = msgCtx->unk11FFA + (msgCtx->unk11FFC * temp_v0_33);
+ func_80147F18(play, &gfx,
+ msgCtx->unk11F1A[temp_v0_33] +
+ (s32)(16.0f * msgCtx->textCharScale * (msgCtx->unk120C2 + 5)) - 1,
+ temp);
+ func_801491DC(play);
+ break;
+
+ case TEXTBOX_ENDTYPE_63:
+ temp_v0_33 = msgCtx->unk120BE;
+ temp = msgCtx->unk11FFA + (msgCtx->unk11FFC * temp_v0_33);
+ func_80147F18(play, &gfx,
+ msgCtx->unk11F1A[temp_v0_33] +
+ (s32)(16.0f * msgCtx->textCharScale * (msgCtx->unk120C2 + 5)) - 1,
+ temp);
+ func_80149454(play);
+ break;
+
+ case TEXTBOX_ENDTYPE_64:
+ temp_v0_33 = msgCtx->unk120BE;
+ temp = msgCtx->unk11FFA + (msgCtx->unk11FFC * temp_v0_33);
+ func_80147F18(play, &gfx,
+ msgCtx->unk11F1A[temp_v0_33] +
+ (s32)(16.0f * msgCtx->textCharScale * (msgCtx->unk120C2 + 4)) - 6,
+ temp);
+ func_801496C8(play);
+ break;
+
+ default:
+ break;
+ }
+
+ gDPPipeSync(gfx++);
+ gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0,
+ PRIMITIVE, 0);
+ gDPSetEnvColor(gfx++, 0, 0, 0, 255);
+ Message_DrawText(play, &gfx);
+
+ switch (msgCtx->textboxEndType) {
+ case TEXTBOX_ENDTYPE_10:
+ func_80148CBC(play, &gfx, 1);
+ break;
+
+ case TEXTBOX_ENDTYPE_11:
+ func_80148CBC(play, &gfx, 2);
+ break;
+
+ case TEXTBOX_ENDTYPE_12:
+ func_80148CBC(play, &gfx, 1);
+ break;
+
+ case TEXTBOX_ENDTYPE_30:
+ case TEXTBOX_ENDTYPE_41:
+ case TEXTBOX_ENDTYPE_50:
+ case TEXTBOX_ENDTYPE_52:
+ case TEXTBOX_ENDTYPE_55:
+ case TEXTBOX_ENDTYPE_56:
+ case TEXTBOX_ENDTYPE_57:
+ case TEXTBOX_ENDTYPE_62:
+ break;
+
+ case TEXTBOX_ENDTYPE_40:
+ case TEXTBOX_ENDTYPE_60:
+ case TEXTBOX_ENDTYPE_61:
+ default:
+ Message_DrawTextboxIcon(play, &gfx, 158,
+ (s16)(D_801D03A8[msgCtx->textBoxType] + msgCtx->textboxYTarget));
+ break;
+
+ case TEXTBOX_ENDTYPE_42:
+ Message_DrawTextboxIcon(play, &gfx, 158,
+ (s16)(D_801D03A8[msgCtx->textBoxType] + msgCtx->textboxYTarget));
+ break;
+ }
+ break;
+
+ case MSGMODE_SCENE_TITLE_CARD_FADE_IN_BACKGROUND:
+ case MSGMODE_SCENE_TITLE_CARD_FADE_IN_TEXT:
+ case MSGMODE_SCENE_TITLE_CARD_DISPLAYING:
+ case MSGMODE_SCENE_TITLE_CARD_FADE_OUT_TEXT:
+ case MSGMODE_SCENE_TITLE_CARD_FADE_OUT_BACKGROUND:
+ Message_DrawSceneTitleCard(play, &gfx);
+ break;
+
+ case MSGMODE_21:
+ case MSGMODE_23:
+ case MSGMODE_31:
+ case MSGMODE_3A:
+ case MSGMODE_3D:
+ case MSGMODE_40:
+ case MSGMODE_TEXT_CLOSING:
+ case MSGMODE_PAUSED:
+ break;
+
+ case MSGMODE_24:
+ case MSGMODE_25:
+ case MSGMODE_26:
+ default:
+ msgCtx->msgMode = MSGMODE_TEXT_DISPLAYING;
+ break;
+ }
+ }
+ Message_DrawOcarinaButtons(play, &gfx);
+ *gfxP = gfx;
+}
void Message_Draw(PlayState* play) {
Gfx* nextDisplayList;
@@ -542,7 +5112,7 @@ void Message_Draw(PlayState* play) {
gSPDisplayList(OVERLAY_DISP++, nextDisplayList);
if ((play->msgCtx.currentTextId != 0x5E6) || !Play_InCsMode(play)) {
- func_801541D4(play, &nextDisplayList);
+ Message_DrawMain(play, &nextDisplayList);
}
gSPEndDisplayList(nextDisplayList++);
@@ -551,48 +5121,935 @@ void Message_Draw(PlayState* play) {
CLOSE_DISPS(gfxCtx);
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/Message_Update.s")
+s16 sTextboxXPositions[TEXTBOX_TYPE_MAX] = {
+ 34, // TEXTBOX_TYPE_0
+ 34, // TEXTBOX_TYPE_1
+ 34, // TEXTBOX_TYPE_2
+ 34, // TEXTBOX_TYPE_3
+ 34, // TEXTBOX_TYPE_4
+ 34, // TEXTBOX_TYPE_5
+ 34, // TEXTBOX_TYPE_6
+ 34, // TEXTBOX_TYPE_7
+ 34, // TEXTBOX_TYPE_8
+ 34, // TEXTBOX_TYPE_9
+ 34, // TEXTBOX_TYPE_A
+ 34, // TEXTBOX_TYPE_B
+ 34, // TEXTBOX_TYPE_C
+ 34, // TEXTBOX_TYPE_D
+ 34, // TEXTBOX_TYPE_E
+ 34, // TEXTBOX_TYPE_F
+};
-void func_801586A4(PlayState* play) {
+s16 sTextboxLowerYPositions[] = {
+ 142, // TEXTBOX_TYPE_0
+ 142, // TEXTBOX_TYPE_1
+ 142, // TEXTBOX_TYPE_2
+ 142, // TEXTBOX_TYPE_3
+ 174, // TEXTBOX_TYPE_4
+ 142, // TEXTBOX_TYPE_5
+ 142, // TEXTBOX_TYPE_6
+ 142, // TEXTBOX_TYPE_7
+ 142, // TEXTBOX_TYPE_8
+ 130, // TEXTBOX_TYPE_9
+ 174, // TEXTBOX_TYPE_A
+ 0, // TEXTBOX_TYPE_B
+ 142, // TEXTBOX_TYPE_C
+ 142, // TEXTBOX_TYPE_D
+ 142, // TEXTBOX_TYPE_E
+ 142, // TEXTBOX_TYPE_F
+};
+
+s16 sTextboxUpperYPositions[] = {
+ 38, // TEXTBOX_TYPE_0
+ 38, // TEXTBOX_TYPE_1
+ 38, // TEXTBOX_TYPE_2
+ 38, // TEXTBOX_TYPE_3
+ 174, // TEXTBOX_TYPE_4
+ 38, // TEXTBOX_TYPE_5
+ 38, // TEXTBOX_TYPE_6
+ 38, // TEXTBOX_TYPE_7
+ 38, // TEXTBOX_TYPE_8
+ 60, // TEXTBOX_TYPE_9
+ 174, // TEXTBOX_TYPE_A
+ 0, // TEXTBOX_TYPE_B
+ 38, // TEXTBOX_TYPE_C
+ 38, // TEXTBOX_TYPE_D
+ 38, // TEXTBOX_TYPE_E
+ 38, // TEXTBOX_TYPE_F
+};
+
+s16 sTextboxMidYPositions[] = {
+ 90, // TEXTBOX_TYPE_0
+ 90, // TEXTBOX_TYPE_1
+ 90, // TEXTBOX_TYPE_2
+ 90, // TEXTBOX_TYPE_3
+ 174, // TEXTBOX_TYPE_4
+ 90, // TEXTBOX_TYPE_5
+ 90, // TEXTBOX_TYPE_6
+ 90, // TEXTBOX_TYPE_7
+ 90, // TEXTBOX_TYPE_8
+ 90, // TEXTBOX_TYPE_9
+ 174, // TEXTBOX_TYPE_A
+ 0, // TEXTBOX_TYPE_B
+ 90, // TEXTBOX_TYPE_C
+ 90, // TEXTBOX_TYPE_D
+ 90, // TEXTBOX_TYPE_E
+ 90, // TEXTBOX_TYPE_F
+};
+
+s16 D_801D0448[] = { 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25 };
+
+s16 D_801D045C[] = {
+ 0x1B91,
+ 0x1B90,
+ 0x1B8F,
+};
+s16 D_801D0464[] = {
+ 0x1B92,
+ 0x1B8E,
+};
+
+#ifdef NON_MATCHING
+// Down to a single compiler-managed stack variable
+// Also contains in-function data
+// https://decomp.me/scratch/QcQ0a
+void Message_Update(PlayState* play) {
+ static u8 D_801D0468 = 0;
+ MessageContext* msgCtx = &play->msgCtx;
+ SramContext* sramCtx = &play->sramCtx; // Optional
+ PauseContext* pauseCtx = &play->pauseCtx;
+ InterfaceContext* interfaceCtx = &play->interfaceCtx;
+ Input* input = CONTROLLER1(&play->state);
+ s16 averageY;
+ s16 sp50;
+ u16 temp_v1_2;
+ s16 sp4C;
+ s16 sp4A;
+ s16 sp48;
+ s32 sp44;
+ s32 sp40;
+ u16 sp3E;
+ s16 var_v1;
+ u16 temp;
+
+ msgCtx->stickAdjX = input->rel.stick_x;
+ msgCtx->stickAdjY = input->rel.stick_y;
+
+ averageY = 0;
+
+ // If stickAdj is held, set a delay to allow the cursor to read the next input.
+ // The first delay is given a longer time than all subsequent delays.
+ if (msgCtx->stickAdjX < -30) {
+ if (msgCtx->stickXRepeatState == -1) {
+ msgCtx->stickXRepeatTimer--;
+ if (msgCtx->stickXRepeatTimer < 0) {
+ // Allow the input to register and apply the delay for all subsequent repeated inputs
+ msgCtx->stickXRepeatTimer = 2;
+ } else {
+ // Cancel the current input
+ msgCtx->stickAdjX = 0;
+ }
+ } else {
+ // Allow the input to register and apply the delay for the first repeated input
+ msgCtx->stickXRepeatTimer = 10;
+ msgCtx->stickXRepeatState = -1;
+ }
+ } else if (msgCtx->stickAdjX > 30) {
+ if (msgCtx->stickXRepeatState == 1) {
+ msgCtx->stickXRepeatTimer--;
+ if (msgCtx->stickXRepeatTimer < 0) {
+ // Allow the input to register and apply the delay for all subsequent repeated inputs
+ msgCtx->stickXRepeatTimer = 2;
+ } else {
+ // Cancel the current input
+ msgCtx->stickAdjX = 0;
+ }
+ } else {
+ // Allow the input to register and apply the delay for the first repeated input
+ msgCtx->stickXRepeatTimer = 10;
+ msgCtx->stickXRepeatState = 1;
+ }
+ } else {
+ msgCtx->stickXRepeatState = 0;
+ }
+
+ if (msgCtx->stickAdjY < -30) {
+ if (msgCtx->stickYRepeatState == -1) {
+ msgCtx->stickYRepeatTimer--;
+ if (msgCtx->stickYRepeatTimer < 0) {
+ // Allow the input to register and apply the delay for all subsequent repeated inputs
+ msgCtx->stickYRepeatTimer = 2;
+ } else {
+ // Cancel the current input
+ msgCtx->stickAdjY = 0;
+ }
+ } else {
+ // Allow the input to register and apply the delay for the first repeated input
+ msgCtx->stickYRepeatTimer = 10;
+ msgCtx->stickYRepeatState = -1;
+ }
+ } else if (msgCtx->stickAdjY > 30) {
+ if (msgCtx->stickYRepeatState == 1) {
+ msgCtx->stickYRepeatTimer--;
+ if (msgCtx->stickYRepeatTimer < 0) {
+ // Allow the input to register and apply the delay for all subsequent repeated inputs
+ msgCtx->stickYRepeatTimer = 2;
+ } else {
+ // Cancel the current input
+ msgCtx->stickAdjY = 0;
+ }
+ } else {
+ // Allow the input to register and apply the delay for the first repeated input
+ msgCtx->stickYRepeatTimer = 10;
+ msgCtx->stickYRepeatState = 1;
+ }
+ } else {
+ msgCtx->stickYRepeatState = 0;
+ }
+
+ if (msgCtx->msgLength == 0) {
+ return;
+ }
+
+ switch (msgCtx->msgMode) {
+ case MSGMODE_TEXT_START:
+ D_801C6A70++;
+
+ temp = false;
+ if ((D_801C6A70 >= 4) || ((msgCtx->talkActor == NULL) && (D_801C6A70 >= 2))) {
+ temp = true;
+ }
+ if (temp) {
+ if (msgCtx->talkActor != NULL) {
+ Actor_GetScreenPos(play, &GET_PLAYER(play)->actor, &sp50, &sp4C);
+ Actor_GetScreenPos(play, msgCtx->talkActor, &sp50, &sp4A);
+ if (sp4C >= sp4A) {
+ averageY = ((sp4C - sp4A) / 2) + sp4A;
+ } else {
+ averageY = ((sp4A - sp4C) / 2) + sp4C;
+ }
+ } else {
+ msgCtx->textboxX = msgCtx->textboxXTarget;
+ msgCtx->textboxY = msgCtx->textboxYTarget;
+ }
+
+ var_v1 = msgCtx->textBoxType;
+
+ if ((u32)msgCtx->textBoxPos == 0) {
+ if ((play->sceneId == SCENE_UNSET_04) || (play->sceneId == SCENE_UNSET_05) ||
+ (play->sceneId == SCENE_UNSET_06)) {
+ if (averageY < 0x64) {
+ msgCtx->textboxYTarget = sTextboxLowerYPositions[var_v1];
+ } else {
+ msgCtx->textboxYTarget = sTextboxUpperYPositions[var_v1];
+ }
+ } else {
+ if (averageY < 0xA0) {
+ msgCtx->textboxYTarget = sTextboxLowerYPositions[var_v1];
+ } else {
+ msgCtx->textboxYTarget = sTextboxUpperYPositions[var_v1];
+ }
+ }
+ } else if (msgCtx->textBoxPos == 1) {
+ msgCtx->textboxYTarget = sTextboxUpperYPositions[var_v1];
+ } else if (msgCtx->textBoxPos == 2) {
+ msgCtx->textboxYTarget = sTextboxMidYPositions[var_v1];
+ } else if (msgCtx->textBoxPos == 7) {
+ msgCtx->textboxYTarget = 0x9E;
+ } else {
+ msgCtx->textboxYTarget = sTextboxLowerYPositions[var_v1];
+ }
+
+ msgCtx->textboxXTarget = sTextboxXPositions[var_v1];
+
+ if ((gSaveContext.options.language == LANGUAGE_JPN) && !msgCtx->textIsCredits) {
+ msgCtx->unk11FFE[0] = (s16)(msgCtx->textboxYTarget + 7);
+ msgCtx->unk11FFE[1] = (s16)(msgCtx->textboxYTarget + 0x19);
+ msgCtx->unk11FFE[2] = (s16)(msgCtx->textboxYTarget + 0x2B);
+ } else {
+ msgCtx->unk11FFE[0] = (s16)(msgCtx->textboxYTarget + 0x14);
+ msgCtx->unk11FFE[1] = (s16)(msgCtx->textboxYTarget + 0x20);
+ msgCtx->unk11FFE[2] = (s16)(msgCtx->textboxYTarget + 0x2C);
+ }
+
+ if ((msgCtx->textBoxType == TEXTBOX_TYPE_4) || (msgCtx->textBoxType == TEXTBOX_TYPE_5)) {
+ msgCtx->msgMode = MSGMODE_TEXT_STARTING;
+ msgCtx->textboxX = msgCtx->textboxXTarget;
+ msgCtx->textboxY = msgCtx->textboxYTarget;
+ msgCtx->unk12008 = 0x100;
+ msgCtx->unk1200A = 0x40;
+ msgCtx->unk1200C = 0x200;
+ msgCtx->unk1200E = 0x200;
+ break;
+ }
+
+ Message_GrowTextbox(play);
+ Audio_PlaySfx_IfNotInCutscene(NA_SE_NONE);
+ msgCtx->stateTimer = 0;
+ msgCtx->msgMode = MSGMODE_TEXT_BOX_GROWING;
+
+ if (!pauseCtx->itemDescriptionOn) {
+ func_80150A84(play);
+ }
+ }
+ break;
+
+ case MSGMODE_TEXT_BOX_GROWING:
+ Message_GrowTextbox(play);
+ break;
+
+ case MSGMODE_TEXT_STARTING:
+ msgCtx->msgMode = MSGMODE_TEXT_NEXT_MSG;
+ if (!pauseCtx->itemDescriptionOn) {
+ if (msgCtx->currentTextId == 0xFF) {
+ func_8011552C(play, DO_ACTION_STOP);
+ } else if (msgCtx->currentTextId != 0xF8) {
+ func_8011552C(play, DO_ACTION_NEXT);
+ }
+ }
+ break;
+
+ case MSGMODE_TEXT_NEXT_MSG:
+ Message_Decode(play);
+ if (msgCtx->textFade) {
+ Interface_SetHudVisibility(HUD_VISIBILITY_NONE);
+ }
+ if (D_801D0468 != 0) {
+ msgCtx->textDrawPos = msgCtx->decodedTextLen;
+ D_801D0468 = 0;
+ }
+ break;
+
+ case MSGMODE_TEXT_CONTINUING:
+ msgCtx->stateTimer--;
+ if (msgCtx->stateTimer == 0) {
+ Message_Decode(play);
+ }
+ break;
+
+ case MSGMODE_TEXT_DISPLAYING:
+ if (msgCtx->textBoxType != TEXTBOX_TYPE_4) {
+ if (CHECK_BTN_ALL(input->press.button, BTN_B) && !msgCtx->textUnskippable) {
+ msgCtx->textboxSkipped = true;
+ msgCtx->textDrawPos = msgCtx->decodedTextLen;
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_A) && !msgCtx->textUnskippable) {
+
+ while (true) {
+ temp_v1_2 = msgCtx->decodedBuffer.wchar[msgCtx->textDrawPos];
+ if ((temp_v1_2 == 0x10) || (temp_v1_2 == 0x12) || (temp_v1_2 == 0x1B) || (temp_v1_2 == 0x1C) ||
+ (temp_v1_2 == 0x1D) || (temp_v1_2 == 0x19) || (temp_v1_2 == 0xE0) || (temp_v1_2 == 0xBF) ||
+ (temp_v1_2 == 0x15) || (temp_v1_2 == 0x1A)) {
+ break;
+ }
+ msgCtx->textDrawPos++;
+ }
+ }
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_A) && (msgCtx->textUnskippable == 0)) {
+ while (true) {
+ temp_v1_2 = msgCtx->decodedBuffer.wchar[msgCtx->textDrawPos];
+ if ((temp_v1_2 == 0x10) || (temp_v1_2 == 0x12) || (temp_v1_2 == 0x1B) || (temp_v1_2 == 0x1C) ||
+ (temp_v1_2 == 0x1D) || (temp_v1_2 == 0x19) || (temp_v1_2 == 0xE0) || (temp_v1_2 == 0xBF) ||
+ (temp_v1_2 == 0x15) || (temp_v1_2 == 0x1A)) {
+ break;
+ }
+ msgCtx->textDrawPos++;
+ }
+ }
+ break;
+
+ case MSGMODE_TEXT_AWAIT_INPUT:
+ if (Message_ShouldAdvance(play)) {
+ msgCtx->msgMode = MSGMODE_TEXT_DISPLAYING;
+ msgCtx->textDrawPos++;
+ }
+ break;
+
+ case MSGMODE_TEXT_DELAYED_BREAK:
+ msgCtx->stateTimer--;
+ if (msgCtx->stateTimer == 0) {
+ msgCtx->msgMode = MSGMODE_TEXT_NEXT_MSG;
+ }
+ break;
+
+ case MSGMODE_TEXT_AWAIT_NEXT:
+ if (Message_ShouldAdvance(play)) {
+ msgCtx->msgMode = MSGMODE_TEXT_NEXT_MSG;
+ msgCtx->msgBufPos++;
+ }
+ break;
+
+ case MSGMODE_TEXT_DONE:
+ if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_50) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_52)) {
+ msgCtx->stateTimer--;
+ if ((msgCtx->stateTimer == 0) ||
+ ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_52) && Message_ShouldAdvance(play))) {
+ if (msgCtx->nextTextId != 0xFFFF) {
+ Audio_PlaySfx(NA_SE_SY_MESSAGE_PASS);
+ Message_ContinueTextbox(play, msgCtx->nextTextId);
+ } else if (msgCtx->bombersNotebookEventQueueCount != 0) {
+ if (Message_BombersNotebookProcessEventQueue(play) == 0) {
+ Message_CloseTextbox(play);
+ }
+ } else {
+ Message_CloseTextbox(play);
+ }
+ }
+ } else {
+ if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_30) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_40) ||
+ (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_42) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_41)) {
+ return;
+ }
+
+ switch (msgCtx->textboxEndType) {
+ case TEXTBOX_ENDTYPE_55:
+ msgCtx->textColorAlpha += 20;
+ if (msgCtx->textColorAlpha >= 255) {
+ msgCtx->textColorAlpha = 255;
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_56;
+ }
+ break;
+
+ case TEXTBOX_ENDTYPE_56:
+ msgCtx->stateTimer--;
+ if (msgCtx->stateTimer == 0) {
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_57;
+ }
+ break;
+
+ case TEXTBOX_ENDTYPE_57:
+ msgCtx->textColorAlpha -= 20;
+ if (msgCtx->textColorAlpha <= 0) {
+ msgCtx->textColorAlpha = 0;
+ if (msgCtx->nextTextId != 0xFFFF) {
+ Audio_PlaySfx(NA_SE_SY_MESSAGE_PASS);
+ Message_ContinueTextbox(play, msgCtx->nextTextId);
+ return;
+ }
+ if (msgCtx->bombersNotebookEventQueueCount != 0) {
+ if (Message_BombersNotebookProcessEventQueue(play) == 0) {
+ Message_CloseTextbox(play);
+ return;
+ }
+ } else {
+ Message_CloseTextbox(play);
+ return;
+ }
+ }
+ break;
+
+ case TEXTBOX_ENDTYPE_10:
+ Message_HandleChoiceSelection(play, 1);
+ break;
+
+ case TEXTBOX_ENDTYPE_11:
+ Message_HandleChoiceSelection(play, 2);
+ break;
+
+ case TEXTBOX_ENDTYPE_12:
+ Message_HandleChoiceSelection(play, 1);
+ break;
+
+ default:
+ break;
+ }
+
+ if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_10) &&
+ (play->msgCtx.ocarinaMode == OCARINA_MODE_ACTIVE)) {
+ if (Message_ShouldAdvance(play)) {
+ if (msgCtx->choiceIndex == 0) {
+ play->msgCtx.ocarinaMode = OCARINA_MODE_WARP;
+ } else {
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
+ }
+ Message_CloseTextbox(play);
+ }
+ } else if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_10) &&
+ (play->msgCtx.ocarinaMode == OCARINA_MODE_PROCESS_SOT)) {
+ if (Message_ShouldAdvance(play)) {
+ if (msgCtx->choiceIndex == 0) {
+ Audio_PlaySfx_MessageDecide();
+ msgCtx->msgMode = MSGMODE_NEW_CYCLE_0;
+ msgCtx->decodedTextLen -= 3;
+ msgCtx->unk120D6 = 0;
+ msgCtx->unk120D4 = 0;
+ } else {
+ Audio_PlaySfx_MessageCancel();
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
+ Message_CloseTextbox(play);
+ }
+ }
+ } else if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_10) &&
+ (play->msgCtx.ocarinaMode == OCARINA_MODE_PROCESS_INVERTED_TIME)) {
+ if (Message_ShouldAdvance(play)) {
+ if (msgCtx->choiceIndex == 0) {
+ Audio_PlaySfx_MessageDecide();
+ if (gSaveContext.save.timeSpeedOffset == 0) {
+ play->msgCtx.ocarinaMode = OCARINA_MODE_APPLY_INV_SOT_SLOW;
+ gSaveContext.save.timeSpeedOffset = -2;
+ } else {
+ play->msgCtx.ocarinaMode = OCARINA_MODE_APPLY_INV_SOT_FAST;
+ gSaveContext.save.timeSpeedOffset = 0;
+ }
+ Message_CloseTextbox(play);
+ } else {
+ Audio_PlaySfx_MessageCancel();
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
+ Message_CloseTextbox(play);
+ }
+ }
+ } else if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_10) &&
+ (play->msgCtx.ocarinaMode == OCARINA_MODE_PROCESS_DOUBLE_TIME)) {
+ if (Message_ShouldAdvance(play)) {
+ if (msgCtx->choiceIndex == 0) {
+ Audio_PlaySfx_MessageDecide();
+ if (gSaveContext.save.isNight != 0) {
+ gSaveContext.save.time = CLOCK_TIME(6, 0);
+ } else {
+ gSaveContext.save.time = CLOCK_TIME(18, 0);
+ }
+ play->msgCtx.ocarinaMode = OCARINA_MODE_APPLY_DOUBLE_SOT;
+ gSaveContext.timerStates[TIMER_ID_MOON_CRASH] = TIMER_STATE_OFF;
+ } else {
+ Audio_PlaySfx_MessageCancel();
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
+ }
+ Message_CloseTextbox(play);
+ }
+ } else if ((msgCtx->textboxEndType != TEXTBOX_ENDTYPE_10) ||
+ (pauseCtx->state != PAUSE_STATE_OWLWARP_CONFIRM)) {
+ if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_10) &&
+ (play->msgCtx.ocarinaMode == OCARINA_MODE_1B)) {
+ if (Message_ShouldAdvance(play)) {
+ if (msgCtx->choiceIndex == 0) {
+ Audio_PlaySfx_MessageDecide();
+ play->msgCtx.ocarinaMode = OCARINA_MODE_WARP_TO_ENTRANCE;
+ } else {
+ Audio_PlaySfx_MessageCancel();
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
+ }
+ Message_CloseTextbox(play);
+ }
+ } else if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_60) ||
+ (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_61) ||
+ (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_10) ||
+ (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_11) ||
+ (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_50) ||
+ (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_52) ||
+ (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_55) ||
+ (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_56) ||
+ (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_57) ||
+ (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_62)) {
+ //! FAKE: debug?
+ if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_50) {}
+ } else if (pauseCtx->itemDescriptionOn) {
+ if ((input->rel.stick_x != 0) || (input->rel.stick_y != 0) ||
+ CHECK_BTN_ALL(input->press.button, BTN_A) || CHECK_BTN_ALL(input->press.button, BTN_B) ||
+ CHECK_BTN_ALL(input->press.button, BTN_START)) {
+ Audio_PlaySfx(NA_SE_SY_DECIDE);
+ Message_CloseTextbox(play);
+ }
+ } else if (play->msgCtx.ocarinaMode == OCARINA_MODE_PROCESS_RESTRICTED_SONG) {
+ if (Message_ShouldAdvanceSilent(play)) {
+ Audio_PlaySfx(NA_SE_SY_DECIDE);
+ Message_CloseTextbox(play);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
+ }
+ } else if ((msgCtx->currentTextId != 0x2790) && Message_ShouldAdvanceSilent(play)) {
+ if (msgCtx->nextTextId != 0xFFFF) {
+ Audio_PlaySfx(NA_SE_SY_MESSAGE_PASS);
+ Message_ContinueTextbox(play, msgCtx->nextTextId);
+ } else if ((msgCtx->bombersNotebookEventQueueCount == 0) ||
+ (Message_BombersNotebookProcessEventQueue(play) != 1)) {
+ if (msgCtx->currentTextId == 0x579) {
+ gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
+ }
+ Audio_PlaySfx(NA_SE_SY_DECIDE);
+ Message_CloseTextbox(play);
+ }
+ }
+ }
+ }
+ break;
+
+ case MSGMODE_TEXT_CLOSING:
+ msgCtx->stateTimer--;
+ if (msgCtx->stateTimer != 0) {
+ break;
+ }
+
+ if (sLastPlayedSong == OCARINA_SONG_SOARING) {
+ if (interfaceCtx->restrictions.songOfSoaring == 0) {
+ if (func_8010A0A4(play) || (play->sceneId == SCENE_SECOM)) {
+ Message_StartTextbox(play, 0x1B93, NULL);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_1B;
+ sLastPlayedSong = 0xFF;
+ } else if (!msgCtx->ocarinaSongEffectActive) {
+ if (gSaveContext.save.saveInfo.playerData.owlActivationFlags != 0) {
+ pauseCtx->unk_2C8 = pauseCtx->pageIndex;
+ pauseCtx->unk_2CA = pauseCtx->cursorPoint[4];
+ pauseCtx->pageIndex = PAUSE_ITEM;
+ pauseCtx->state = PAUSE_STATE_OWLWARP_0;
+ func_800F4A10(play);
+ pauseCtx->pageIndex = PAUSE_MAP;
+ sLastPlayedSong = 0xFF;
+ Message_CloseTextbox(play);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
+ gSaveContext.prevHudVisibility = HUD_VISIBILITY_A_B;
+ func_80115844(play, DO_ACTION_STOP);
+ GameState_SetFramerateDivisor(&play->state, 2);
+ if (ShrinkWindow_Letterbox_GetSizeTarget() != 0) {
+ ShrinkWindow_Letterbox_SetSizeTarget(0);
+ }
+ Audio_PlaySfx_PauseMenuOpenOrClose(1);
+ break;
+ }
+ sLastPlayedSong = 0xFF;
+ Message_StartTextbox(play, 0xFB, NULL);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_RESTRICTED_SONG;
+ } else {
+ msgCtx->stateTimer = 1;
+ }
+ } else {
+ sLastPlayedSong = 0xFF;
+ Message_StartTextbox(play, 0x1B95, NULL);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_RESTRICTED_SONG;
+ }
+ break;
+ }
+
+ if ((msgCtx->currentTextId == 0xC) || (msgCtx->currentTextId == 0xD) || (msgCtx->currentTextId == 0xC5) ||
+ (msgCtx->currentTextId == 0xC6) || (msgCtx->currentTextId == 0xC7) ||
+ (msgCtx->currentTextId == 0x2165) || (msgCtx->currentTextId == 0x2166) ||
+ (msgCtx->currentTextId == 0x2167) || (msgCtx->currentTextId == 0x2168)) {
+ gSaveContext.healthAccumulator = 20 * 0x10; // Refill 20 hearts
+ }
+
+ if ((play->csCtx.state == CS_STATE_IDLE) && (gSaveContext.save.cutsceneIndex < 0xFFF0) &&
+ ((play->activeCamId == CAM_ID_MAIN) ||
+ ((play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF))) &&
+ (play->msgCtx.ocarinaMode == OCARINA_MODE_END)) {
+ if ((gSaveContext.prevHudVisibility == HUD_VISIBILITY_IDLE) ||
+ (gSaveContext.prevHudVisibility == HUD_VISIBILITY_NONE) ||
+ (gSaveContext.prevHudVisibility == HUD_VISIBILITY_NONE_ALT)) {
+ gSaveContext.prevHudVisibility = HUD_VISIBILITY_ALL;
+ }
+ gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
+ }
+
+ if ((msgCtx->currentTextId >= 0x1BB2) && (msgCtx->currentTextId <= 0x1BB6) &&
+ (play->actorCtx.flags & ACTORCTX_FLAG_1)) {
+ Message_StartTextbox(play, 0x5E6, NULL);
+ break;
+ }
+
+ if (msgCtx->bombersNotebookEventQueueCount != 0) {
+ if (Message_BombersNotebookProcessEventQueue(play) == 0) {
+ msgCtx->stateTimer = 1;
+ }
+ break;
+ }
+
+ msgCtx->msgLength = 0;
+ msgCtx->msgMode = MSGMODE_NONE;
+ msgCtx->currentTextId = 0;
+ msgCtx->stateTimer = 0;
+ XREG(31) = 0;
+
+ if (pauseCtx->itemDescriptionOn) {
+ func_8011552C(play, DO_ACTION_INFO);
+ pauseCtx->itemDescriptionOn = false;
+ }
+
+ if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_30) {
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_00;
+ play->msgCtx.ocarinaMode = OCARINA_MODE_WARP;
+ } else {
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_00;
+ }
+
+ if (EQ_MAX_QUEST_HEART_PIECE_COUNT) {
+ RESET_HEART_PIECE_COUNT;
+ gSaveContext.save.saveInfo.playerData.healthCapacity += 0x10;
+ gSaveContext.save.saveInfo.playerData.health += 0x10;
+ }
+
+ if (msgCtx->ocarinaAction != OCARINA_ACTION_CHECK_NOTIME_DONE) {
+ s16 pad;
+
+ if (sLastPlayedSong == OCARINA_SONG_TIME) {
+ if (interfaceCtx->restrictions.songOfTime == 0) {
+ Message_StartTextbox(play, 0x1B8A, NULL);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_SOT;
+ } else {
+ sLastPlayedSong = 0xFF;
+ Message_StartTextbox(play, 0x1B95, NULL);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_RESTRICTED_SONG;
+ }
+ } else if (sLastPlayedSong == OCARINA_SONG_INVERTED_TIME) {
+ if (interfaceCtx->restrictions.invSongOfTime == 0) {
+ if (R_TIME_SPEED != 0) {
+ if (gSaveContext.save.timeSpeedOffset == 0) {
+ Message_StartTextbox(play, 0x1B8C, NULL);
+ } else {
+ Message_StartTextbox(play, 0x1B8D, NULL);
+ }
+ play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_INVERTED_TIME;
+ } else {
+ Message_StartTextbox(play, 0x1B8B, NULL);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
+ }
+ } else {
+ sLastPlayedSong = 0xFF;
+ Message_StartTextbox(play, 0x1B95, NULL);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_RESTRICTED_SONG;
+ }
+ } else if (sLastPlayedSong == OCARINA_SONG_DOUBLE_TIME) {
+ if (interfaceCtx->restrictions.songOfDoubleTime == 0) {
+ if ((CURRENT_DAY != 3) || (gSaveContext.save.isNight == 0)) {
+ if (gSaveContext.save.isNight) {
+ Message_StartTextbox(play, D_801D0464[CURRENT_DAY - 1], NULL);
+ } else {
+ Message_StartTextbox(play, D_801D045C[CURRENT_DAY - 1], NULL);
+ }
+ play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_DOUBLE_TIME;
+ } else {
+ Message_StartTextbox(play, 0x1B94, NULL);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
+ }
+ } else {
+ sLastPlayedSong = 0xFF;
+ Message_StartTextbox(play, 0x1B95, NULL);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_RESTRICTED_SONG;
+ }
+ } else if ((msgCtx->ocarinaAction == OCARINA_ACTION_FREE_PLAY_DONE) &&
+ ((play->msgCtx.ocarinaMode == OCARINA_MODE_ACTIVE) ||
+ (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) ||
+ (play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_SCARECROW_SPAWN) ||
+ (play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_FULL_EVAN_SONG))) {
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
+ if (msgCtx->lastPlayedSong == OCARINA_SONG_SOARING) {
+ play->msgCtx.ocarinaMode = OCARINA_MODE_ACTIVE;
+ }
+ }
+ sLastPlayedSong = 0xFF;
+ }
+ break;
+
+ case MSGMODE_OCARINA_PLAYING:
+ if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
+ Message_CloseTextbox(play);
+ } else {
+ msgCtx->ocarinaButtonIndex = OCARINA_BTN_INVALID;
+ }
+ break;
+
+ case MSGMODE_OCARINA_AWAIT_INPUT:
+ if ((msgCtx->ocarinaAction != OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) &&
+ (msgCtx->ocarinaAction != OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) {
+ if (Message_ShouldAdvance(play)) {
+ Message_DisplayOcarinaStaff(play, msgCtx->ocarinaAction);
+ }
+ }
+ break;
+
+ case MSGMODE_SCARECROW_SPAWN_RECORDING_ONGOING:
+ if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
+ AudioOcarina_SetRecordingState(OCARINA_RECORD_OFF);
+ Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR);
+ Message_CloseTextbox(play);
+ msgCtx->msgMode = MSGMODE_SCARECROW_SPAWN_RECORDING_FAILED;
+ } else {
+ msgCtx->ocarinaButtonIndex = OCARINA_BTN_INVALID;
+ }
+ break;
+
+ case MSGMODE_SCENE_TITLE_CARD_FADE_IN_BACKGROUND:
+ msgCtx->textboxColorAlphaCurrent += XREG(73);
+ if (msgCtx->textboxColorAlphaCurrent >= 255) {
+ msgCtx->textboxColorAlphaCurrent = 255;
+ msgCtx->msgMode = MSGMODE_SCENE_TITLE_CARD_FADE_IN_TEXT;
+ }
+ break;
+
+ case MSGMODE_SCENE_TITLE_CARD_FADE_IN_TEXT:
+ msgCtx->textColorAlpha += XREG(73);
+ if (msgCtx->textColorAlpha >= 255) {
+ msgCtx->textColorAlpha = 255;
+ msgCtx->msgMode = MSGMODE_SCENE_TITLE_CARD_DISPLAYING;
+ }
+ break;
+
+ case MSGMODE_SCENE_TITLE_CARD_DISPLAYING:
+ msgCtx->stateTimer--;
+ if (msgCtx->stateTimer == 0) {
+ msgCtx->msgMode = MSGMODE_SCENE_TITLE_CARD_FADE_OUT_TEXT;
+ }
+ break;
+
+ case MSGMODE_SCENE_TITLE_CARD_FADE_OUT_TEXT:
+ msgCtx->textColorAlpha -= XREG(70);
+ if (msgCtx->textColorAlpha <= 0) {
+ msgCtx->textColorAlpha = 0;
+ msgCtx->msgMode = MSGMODE_SCENE_TITLE_CARD_FADE_OUT_BACKGROUND;
+ }
+ break;
+
+ case MSGMODE_SCENE_TITLE_CARD_FADE_OUT_BACKGROUND:
+ msgCtx->textboxColorAlphaCurrent -= XREG(70);
+ if (msgCtx->textboxColorAlphaCurrent <= 0) {
+ if ((msgCtx->currentTextId >= 0x1BB2) && (msgCtx->currentTextId <= 0x1BB6) &&
+ (play->actorCtx.flags & ACTORCTX_FLAG_1)) {
+ Message_StartTextbox(play, 0x5E6, NULL);
+ Interface_SetHudVisibility(HUD_VISIBILITY_NONE_ALT);
+ } else {
+ //! FAKE: debug?
+ if (msgCtx->currentTextId >= 0x100) {
+ if (msgCtx && msgCtx && msgCtx) {}
+ }
+ msgCtx->textboxColorAlphaCurrent = 0;
+ msgCtx->msgLength = 0;
+ msgCtx->msgMode = MSGMODE_NONE;
+ msgCtx->currentTextId = 0;
+ msgCtx->stateTimer = 0;
+ }
+ }
+ break;
+
+ case MSGMODE_NEW_CYCLE_0:
+ play->state.unk_A3 = 1;
+ sp44 = gSaveContext.save.cutsceneIndex;
+ sp3E = gSaveContext.save.time;
+ sp40 = gSaveContext.save.day;
+
+ Sram_SaveEndOfCycle(play);
+ gSaveContext.timerStates[TIMER_ID_MOON_CRASH] = TIMER_STATE_OFF;
+ func_8014546C(&play->sramCtx);
+
+ gSaveContext.save.day = sp40;
+ gSaveContext.save.time = sp3E;
+ gSaveContext.save.cutsceneIndex = sp44;
+
+ if (gSaveContext.fileNum != 0xFF) {
+ Sram_SetFlashPagesDefault(&play->sramCtx, gFlashSaveStartPages[gSaveContext.fileNum * 2],
+ gFlashSpecialSaveNumPages[gSaveContext.fileNum * 2]);
+ Sram_StartWriteToFlashDefault(&play->sramCtx);
+ }
+ msgCtx->msgMode = MSGMODE_NEW_CYCLE_1;
+ break;
+
+ case MSGMODE_NEW_CYCLE_1:
+ if (gSaveContext.fileNum != 0xFF) {
+ play->state.unk_A3 = 1;
+ if (play->sramCtx.status == 0) {
+ play->msgCtx.ocarinaMode = OCARINA_MODE_APPLY_SOT;
+ msgCtx->msgMode = MSGMODE_NEW_CYCLE_2;
+ }
+ } else {
+ play->msgCtx.ocarinaMode = OCARINA_MODE_APPLY_SOT;
+ msgCtx->msgMode = MSGMODE_NEW_CYCLE_2;
+ }
+ break;
+
+ case MSGMODE_OWL_SAVE_0:
+ play->state.unk_A3 = 1;
+ gSaveContext.save.isOwlSave = true;
+ Play_SaveCycleSceneFlags(&play->state);
+ func_8014546C(&play->sramCtx);
+
+ if (gSaveContext.fileNum != 0xFF) {
+ Sram_SetFlashPagesOwlSave(&play->sramCtx, gFlashOwlSaveStartPages[gSaveContext.fileNum * 2],
+ gFlashOwlSaveNumPages[gSaveContext.fileNum * 2]);
+ Sram_StartWriteToFlashOwlSave(&play->sramCtx);
+ }
+ msgCtx->msgMode = MSGMODE_OWL_SAVE_1;
+ break;
+
+ case MSGMODE_OWL_SAVE_1:
+ if (gSaveContext.fileNum != 0xFF) {
+ play->state.unk_A3 = 1;
+ if (play->sramCtx.status == 0) {
+ play->msgCtx.ocarinaMode = OCARINA_MODE_APPLY_SOT;
+ msgCtx->msgMode = MSGMODE_OWL_SAVE_2;
+ }
+ } else {
+ play->msgCtx.ocarinaMode = OCARINA_MODE_APPLY_SOT;
+ msgCtx->msgMode = MSGMODE_OWL_SAVE_2;
+ }
+
+ if (msgCtx->msgMode == MSGMODE_OWL_SAVE_2) {
+ gSaveContext.gameMode = GAMEMODE_OWL_SAVE;
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ play->transitionType = TRANS_TYPE_FADE_BLACK;
+ play->nextEntrance = ENTRANCE(CUTSCENE, 0);
+ gSaveContext.save.cutsceneIndex = 0;
+ gSaveContext.sceneLayer = 0;
+ }
+ break;
+
+ case MSGMODE_9:
+ case MSGMODE_PAUSED:
+ case MSGMODE_NEW_CYCLE_2:
+ case MSGMODE_OWL_SAVE_2:
+ break;
+
+ default:
+ msgCtx->ocarinaButtonIndex = OCARINA_BTN_INVALID;
+ break;
+ }
+}
+#else
+u8 D_801D0468 = 0;
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/Message_Update.s")
+#endif
+
+void Message_SetTables(PlayState* play) {
play->msgCtx.messageEntryTableNes = D_801C6B98;
play->msgCtx.messageTableStaff = D_801CFB08;
}
void Message_Init(PlayState* play) {
Font* font;
- MessageContext* messageCtx = &play->msgCtx;
+ MessageContext* msgCtx = &play->msgCtx;
+
+ Message_SetTables(play);
+
+ play->msgCtx.ocarinaMode = OCARINA_MODE_NONE;
+
+ msgCtx->msgMode = MSGMODE_NONE;
+ msgCtx->msgLength = 0;
+ msgCtx->currentTextId = 0;
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_00;
+ msgCtx->choiceIndex = 0;
+ msgCtx->ocarinaAction = msgCtx->textUnskippable = 0;
+ msgCtx->textColorAlpha = 0xFF;
+
+ View_Init(&msgCtx->view, play->state.gfxCtx);
+
+ msgCtx->textboxSegment = THA_AllocTailAlign16(&play->state.tha, 0x13C00);
- func_801586A4(play);
- play->msgCtx.ocarinaMode = 0;
- messageCtx->msgMode = 0;
- messageCtx->msgLength = 0;
- messageCtx->currentTextId = 0;
- messageCtx->unk12020 = 0;
- messageCtx->choiceIndex = 0;
- messageCtx->ocarinaAction = messageCtx->unk11FF2 = 0;
- messageCtx->unk1201E = 0xFF;
- View_Init(&messageCtx->view, play->state.gfxCtx);
- messageCtx->unk11EF8 = THA_AllocEndAlign16(&play->state.heap, 0x13C00);
font = &play->msgCtx.font;
Font_LoadOrderedFont(&play->msgCtx.font);
font->unk_11D88 = 0;
- messageCtx->unk12090 = messageCtx->unk12092 = 0;
- messageCtx->unk12094 = 0;
- messageCtx->unk1209C = 0;
- messageCtx->unk120A0 = 0;
- messageCtx->unk12068 = 0x34;
- messageCtx->unk1206A = 0x24;
- messageCtx->unk120B0 = 0;
- messageCtx->unk120BE = 0;
- messageCtx->unk120C0 = 0;
- messageCtx->unk120C2 = 0;
- messageCtx->unk120C4 = 0;
- messageCtx->unk120C8 = 0;
- messageCtx->unk120CA = 0;
- messageCtx->unk120CC = 0;
- messageCtx->unk120CE = 0;
- messageCtx->unk120D0 = 0;
- messageCtx->unk120D2 = 0;
- messageCtx->unk120D4 = 0;
- messageCtx->unk120D6 = 0;
+
+ msgCtx->textIsCredits = msgCtx->messageHasSetSfx = false;
+ msgCtx->textboxSkipped = false;
+ msgCtx->textFade = false;
+ msgCtx->ocarinaAvailableSongs = 0;
+ msgCtx->textboxX = 52;
+ msgCtx->textboxY = 36;
+ msgCtx->ocarinaSongEffectActive = false;
+ msgCtx->unk120BE = 0;
+ msgCtx->unk120C0 = 0;
+ msgCtx->unk120C2 = 0;
+ msgCtx->unk120C4 = 0;
+ msgCtx->unk120C8 = 0;
+ msgCtx->unk120CA = 0;
+ msgCtx->unk120CC = 0;
+ msgCtx->unk120CE = 0;
+ msgCtx->unk120D0 = 0;
+ msgCtx->unk120D2 = 0;
+ msgCtx->unk120D4 = 0;
+ msgCtx->unk120D6 = 0;
}
diff --git a/src/code/z_message_nes.c b/src/code/z_message_nes.c
index 759c3d611..3775b5b26 100644
--- a/src/code/z_message_nes.c
+++ b/src/code/z_message_nes.c
@@ -2,59 +2,19 @@
#include "message_data_static.h"
#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
-#if 0
-
-//fontWidth
-extern f32 D_801D0470[159];
-
-//rupeesTextLocalization
-u8 D_801D06F0[4][8] = { { "rupee(s)" }, //EN
- { "rubin(e)" }, //DE
- { "rubis" }, //FR
- { "rupia(s)" } //SPA
- };
-
-// rupeesTextLength
-u8 D_801D0710[4] = {8,8,5,8};
-
-// sOwlWarpText
-char D_801D0714[OWL_WARP_MAX][16] = {
- "Great Bay Coast", // OWL_WARP_GREAT_BAY_COAST
- "Zora Cape", // OWL_WARP_ZORA_CAPE
- "Snowhead", // OWL_WARP_SNOWHEAD
- "Mountain Village", // OWL_WARP_MOUNTAIN_VILLAGE
- "Clock Town", // OWL_WARP_CLOCK_TOWN
- "Milk Road", // OWL_WARP_MILK_ROAD
- "Woodfall", // OWL_WARP_WOODFALL
- "Southern Swamp", // OWL_WARP_SOUTHERN_SWAMP
- "Ikana Canyon", // OWL_WARP_IKANA_CANYON
- "Stone Tower", // OWL_WARP_STONE_TOWER
- "Entrance", // OWL_WARP_ENTRANCE
+f32 sNESFontWidths[160] = {
+ 8.0f, 8.0f, 6.0f, 9.0f, 9.0f, 14.0f, 12.0f, 3.0f, 7.0f, 7.0f, 7.0f, 9.0f, 4.0f, 6.0f, 4.0f, 9.0f,
+ 10.0f, 5.0f, 9.0f, 9.0f, 10.0f, 9.0f, 9.0f, 9.0f, 9.0f, 9.0f, 6.0f, 6.0f, 9.0f, 11.0f, 9.0f, 11.0f,
+ 13.0f, 12.0f, 9.0f, 11.0f, 11.0f, 8.0f, 8.0f, 12.0f, 10.0f, 4.0f, 8.0f, 10.0f, 8.0f, 13.0f, 11.0f, 13.0f,
+ 9.0f, 13.0f, 10.0f, 10.0f, 9.0f, 10.0f, 11.0f, 15.0f, 11.0f, 10.0f, 10.0f, 7.0f, 10.0f, 7.0f, 10.0f, 9.0f,
+ 5.0f, 8.0f, 9.0f, 8.0f, 9.0f, 9.0f, 6.0f, 9.0f, 8.0f, 4.0f, 6.0f, 8.0f, 4.0f, 12.0f, 9.0f, 9.0f,
+ 9.0f, 9.0f, 7.0f, 8.0f, 7.0f, 8.0f, 9.0f, 12.0f, 8.0f, 9.0f, 8.0f, 7.0f, 5.0f, 7.0f, 10.0f, 6.0f,
+ 12.0f, 12.0f, 12.0f, 12.0f, 11.0f, 8.0f, 8.0f, 8.0f, 8.0f, 6.0f, 6.0f, 6.0f, 6.0f, 10.0f, 13.0f, 13.0f,
+ 13.0f, 13.0f, 10.0f, 10.0f, 10.0f, 10.0f, 9.0f, 8.0f, 8.0f, 8.0f, 8.0f, 8.0f, 9.0f, 9.0f, 9.0f, 9.0f,
+ 4.0f, 4.0f, 4.0f, 4.0f, 8.0f, 9.0f, 9.0f, 9.0f, 9.0f, 8.0f, 8.0f, 8.0f, 8.0f, 8.0f, 11.0f, 6.0f,
+ 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f,
};
-// sOwlWarpTextLength
-s16 D_801D07C4[OWL_WARP_MAX] = {
- 15, // OWL_WARP_GREAT_BAY_COAST
- 9, // OWL_WARP_ZORA_CAPE
- 8, // OWL_WARP_SNOWHEAD
- 16, // OWL_WARP_MOUNTAIN_VILLAGE
- 10, // OWL_WARP_CLOCK_TOWN
- 9, // OWL_WARP_MILK_ROAD
- 8, // OWL_WARP_WOODFALL
- 14, // OWL_WARP_SOUTHERN_SWAMP
- 12, // OWL_WARP_IKANA_CANYON
- 11, // OWL_WARP_STONE_TOWER
- 8, // OWL_WARP_ENTRANCE
-};
-
-#endif
-
-extern f32 D_801D0470[159];
-extern u8 D_801D06F0[4][8];
-extern u8 D_801D0710[4];
-extern u8 D_801D0714[OWL_WARP_MAX][16];
-extern s16 D_801D07C4[OWL_WARP_MAX];
-
void Message_FindMessageNES(PlayState* play, u16 textId) {
MessageContext* msgCtx = &play->msgCtx;
Font* font = &msgCtx->font;
@@ -91,7 +51,7 @@ void Message_LoadCharNES(PlayState* play, u8 codePointIndex, s32* offset, f32* a
Font_LoadCharNES(play, codePointIndex, temp1);
msgCtx->decodedBuffer.schar[decodedBufPos] = codePointIndex;
temp1 += FONT_CHAR_TEX_SIZE;
- temp2 += (16.0f * msgCtx->unk12098);
+ temp2 += (16.0f * msgCtx->textCharScale);
*offset = temp1;
*arg3 = temp2;
}
@@ -102,7 +62,7 @@ void Message_LoadPluralRupeesNES(PlayState* play, s16* decodedBufPos, s32* offse
s32 o = *offset;
f32 f = *arg3;
- msgCtx->decodedBuffer.schar[p] = 0x20;
+ msgCtx->decodedBuffer.schar[p] = ' ';
p++;
Font_LoadCharNES(play, 'R', o);
o += FONT_CHAR_TEX_SIZE;
@@ -128,12 +88,31 @@ void Message_LoadPluralRupeesNES(PlayState* play, s16* decodedBufPos, s32* offse
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.schar[p] = 's';
- f += 16.0f * msgCtx->unk12098 * 6.0f;
+ f += 16.0f * msgCtx->textCharScale * 6.0f;
*decodedBufPos = p;
*offset = o;
*arg3 = f;
}
+#define RUPEES_STR_EN "Rupee(s)"
+#define RUPEES_STR_DE "Rubin(e)"
+#define RUPEES_STR_FR "Rubis"
+#define RUPEES_STR_SPA "Rupia(s)"
+
+char sRupeesTextLocalization[LANGUAGE_MAX - 1][8] = {
+ RUPEES_STR_EN, // EN
+ RUPEES_STR_DE, // DE
+ RUPEES_STR_FR, // FR
+ RUPEES_STR_SPA, // SPA
+};
+
+u8 sRupeesTextLength[LANGUAGE_MAX - 1] = {
+ sizeof(RUPEES_STR_EN) - 1,
+ sizeof(RUPEES_STR_DE) - 1,
+ sizeof(RUPEES_STR_FR) - 1,
+ sizeof(RUPEES_STR_SPA) - 1,
+};
+
void Message_LoadLocalizedRupeesNES(PlayState* play, s16* decodedBufPos, s32* offset, f32* arg3) {
MessageContext* msgCtx = &play->msgCtx;
s16 p = *decodedBufPos;
@@ -144,15 +123,15 @@ void Message_LoadLocalizedRupeesNES(PlayState* play, s16* decodedBufPos, s32* of
msgCtx->decodedBuffer.schar[p] = ' ';
p++;
- for (j = 0; j < D_801D0710[gSaveContext.options.language - 1]; j++) {
- Font_LoadCharNES(play, D_801D06F0[gSaveContext.options.language - 1][j], o);
- msgCtx->decodedBuffer.schar[p] = D_801D06F0[gSaveContext.options.language - 1][j];
+ for (j = 0; j < sRupeesTextLength[gSaveContext.options.language - 1]; j++) {
+ Font_LoadCharNES(play, sRupeesTextLocalization[gSaveContext.options.language - 1][j], o);
+ msgCtx->decodedBuffer.schar[p] = sRupeesTextLocalization[gSaveContext.options.language - 1][j];
o += FONT_CHAR_TEX_SIZE;
p++;
}
p--;
- f += 16.0f * msgCtx->unk12098 * (D_801D0710[gSaveContext.options.language - 1] + 1);
+ f += 16.0f * msgCtx->textCharScale * (sRupeesTextLength[gSaveContext.options.language - 1] + 1);
*decodedBufPos = p;
*offset = o;
*arg3 = f;
@@ -191,9 +170,9 @@ void Message_LoadRupeesNES(PlayState* play, s16* decodedBufPos, s32* offset, f32
Font_LoadCharNES(play, 's', o);
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.schar[p] = 's';
- f += 16.0f * msgCtx->unk12098 * 6.0f;
+ f += 16.0f * msgCtx->textCharScale * 6.0f;
} else {
- f += 16.0f * msgCtx->unk12098 * 5.0f;
+ f += 16.0f * msgCtx->textCharScale * 5.0f;
}
*decodedBufPos = p;
@@ -201,7 +180,7 @@ void Message_LoadRupeesNES(PlayState* play, s16* decodedBufPos, s32* offset, f32
*arg3 = f;
}
-void Message_LoadTimeNES(PlayState* play, u8 arg1, s32* offset, f32* arg3, s16* decodedBufPos) {
+void Message_LoadTimeNES(PlayState* play, u8 curChar, s32* offset, f32* arg3, s16* decodedBufPos) {
MessageContext* msgCtx = &play->msgCtx;
s16 p = *decodedBufPos;
s32 o = *offset;
@@ -211,12 +190,11 @@ void Message_LoadTimeNES(PlayState* play, u8 arg1, s32* offset, f32* arg3, s16*
f32 timeLeftInMinutes;
s16 i;
- if (arg1 == 0xCF) {
+ if (curChar == 0xCF) {
timeLeft = TIME_UNTIL_MOON_CRASH;
} else {
timeLeft = TIME_UNTIL_NEW_DAY;
}
-
timeLeftInMinutes = TIME_TO_MINUTES_F(timeLeft);
digits[0] = 0;
@@ -246,12 +224,52 @@ void Message_LoadTimeNES(PlayState* play, u8 arg1, s32* offset, f32* arg3, s16*
}
}
- f += 5.0f * (16.0f * msgCtx->unk12098);
+ f += 5.0f * (16.0f * msgCtx->textCharScale);
*decodedBufPos = p - 1;
*offset = o;
*arg3 = f;
}
+#define GREAT_BAY_COAST_STR "Great Bay Coast"
+#define ZORA_CAPE_STR "Zora Cape"
+#define SNOWHEAD_STR "Snowhead"
+#define MOUNTAIN_VILLAGE_STR "Mountain Village"
+#define CLOCK_TOWN_STR "Clock Town"
+#define MILK_ROAD_STR "Milk Road"
+#define WOODFALL_STR "Woodfall"
+#define SOUTHERN_SWAMP_STR "Southern Swamp"
+#define IKANA_CANYON_STR "Ikana Canyon"
+#define STONE_TOWER_STR "Stone Tower"
+#define ENTRANCE_STR "Entrance"
+
+char sOwlWarpTextENG[OWL_WARP_MAX][16] = {
+ GREAT_BAY_COAST_STR, // OWL_WARP_GREAT_BAY_COAST
+ ZORA_CAPE_STR, // OWL_WARP_ZORA_CAPE
+ SNOWHEAD_STR, // OWL_WARP_SNOWHEAD
+ MOUNTAIN_VILLAGE_STR, // OWL_WARP_MOUNTAIN_VILLAGE
+ CLOCK_TOWN_STR, // OWL_WARP_CLOCK_TOWN
+ MILK_ROAD_STR, // OWL_WARP_MILK_ROAD
+ WOODFALL_STR, // OWL_WARP_WOODFALL
+ SOUTHERN_SWAMP_STR, // OWL_WARP_SOUTHERN_SWAMP
+ IKANA_CANYON_STR, // OWL_WARP_IKANA_CANYON
+ STONE_TOWER_STR, // OWL_WARP_STONE_TOWER
+ ENTRANCE_STR, // OWL_WARP_ENTRANCE
+};
+
+s16 sOwlWarpTextLengthENG[OWL_WARP_MAX] = {
+ sizeof(GREAT_BAY_COAST_STR) - 1, // OWL_WARP_GREAT_BAY_COAST
+ sizeof(ZORA_CAPE_STR) - 1, // OWL_WARP_ZORA_CAPE
+ sizeof(SNOWHEAD_STR) - 1, // OWL_WARP_SNOWHEAD
+ sizeof(MOUNTAIN_VILLAGE_STR) - 1, // OWL_WARP_MOUNTAIN_VILLAGE
+ sizeof(CLOCK_TOWN_STR) - 1, // OWL_WARP_CLOCK_TOWN
+ sizeof(MILK_ROAD_STR) - 1, // OWL_WARP_MILK_ROAD
+ sizeof(WOODFALL_STR) - 1, // OWL_WARP_WOODFALL
+ sizeof(SOUTHERN_SWAMP_STR) - 1, // OWL_WARP_SOUTHERN_SWAMP
+ sizeof(IKANA_CANYON_STR) - 1, // OWL_WARP_IKANA_CANYON
+ sizeof(STONE_TOWER_STR) - 1, // OWL_WARP_STONE_TOWER
+ sizeof(ENTRANCE_STR) - 1, // OWL_WARP_ENTRANCE
+};
+
void Message_LoadOwlWarpTextNES(PlayState* play, s32* offset, f32* arg2, s16* decodedBufPos) {
MessageContext* msgCtx = &play->msgCtx;
s16 p = *decodedBufPos;
@@ -267,29 +285,1606 @@ void Message_LoadOwlWarpTextNES(PlayState* play, s32* offset, f32* arg2, s16* de
} else {
owlWarpId = play->pauseCtx.cursorPoint[PAUSE_WORLD_MAP];
}
- stringLimit = D_801D07C4[owlWarpId];
+ stringLimit = sOwlWarpTextLengthENG[owlWarpId];
for (i = 0; i < stringLimit; i++) {
- msgCtx->decodedBuffer.schar[p] = D_801D0714[owlWarpId][i];
+ msgCtx->decodedBuffer.schar[p] = sOwlWarpTextENG[owlWarpId][i];
currentChar = msgCtx->decodedBuffer.schar[p];
if (currentChar != ' ') {
- Font_LoadCharNES(play, D_801D0714[owlWarpId][i], o);
+ Font_LoadCharNES(play, sOwlWarpTextENG[owlWarpId][i], o);
o += FONT_CHAR_TEX_SIZE;
}
currentChar = msgCtx->decodedBuffer.schar[p];
p++;
- f += (D_801D0470[currentChar - ' '] * msgCtx->unk12098);
+ f += (sNESFontWidths[currentChar - ' '] * msgCtx->textCharScale);
}
p--;
- f += (stringLimit - 1) * (16.0f * msgCtx->unk12098);
+ f += (stringLimit - 1) * (16.0f * msgCtx->textCharScale);
*decodedBufPos = p;
*offset = o;
*arg2 = f;
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message_nes/func_80159438.s")
+void Message_GetTimerDigitsNES(OSTime time, s16* digits) {
+ OSTime t = time;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message_nes/func_8015966C.s")
+ // 6 minutes
+ digits[0] = t / SECONDS_TO_TIMER(360);
+ t -= (digits[0] * SECONDS_TO_TIMER(360));
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message_nes/func_8015B198.s")
+ // minutes
+ digits[1] = t / SECONDS_TO_TIMER(60);
+ t -= (digits[1] * SECONDS_TO_TIMER(60));
+
+ digits[2] = '\'';
+
+ // 10 seconds
+ digits[3] = t / SECONDS_TO_TIMER(10);
+ t -= digits[3] * SECONDS_TO_TIMER(10);
+
+ // seconds
+ digits[4] = t / SECONDS_TO_TIMER(1);
+ t -= digits[4] * SECONDS_TO_TIMER(1);
+
+ digits[5] = '"';
+
+ // 100 milliseconds
+ digits[6] = t / SECONDS_TO_TIMER_PRECISE(0, 10);
+ t -= digits[6] * SECONDS_TO_TIMER_PRECISE(0, 10);
+
+ // 10 milliseconds
+ digits[7] = t;
+
+ digits[0] += '0';
+ digits[1] += '0';
+ digits[3] += '0';
+ digits[4] += '0';
+ digits[6] += '0';
+ digits[7] += '0';
+}
+
+Color_RGB16 D_801D07DC[] = {
+ { 255, 120, 0 }, { 70, 255, 80 }, { 80, 110, 255 }, { 255, 255, 30 },
+ { 90, 180, 255 }, { 210, 100, 255 }, { 170, 170, 170 }, { 255, 130, 30 },
+};
+
+Color_RGB16 D_801D080C[] = {
+ { 255, 60, 60 }, { 70, 255, 80 }, { 80, 90, 255 }, { 255, 255, 50 },
+ { 80, 150, 255 }, { 255, 150, 180 }, { 170, 170, 170 }, { 255, 130, 30 },
+};
+
+Color_RGB16 D_801D083C[] = {
+ { 255, 60, 60 }, { 70, 255, 80 }, { 80, 90, 255 }, { 255, 255, 50 },
+ { 80, 150, 255 }, { 255, 150, 180 }, { 180, 180, 200 }, { 255, 130, 30 },
+};
+
+Color_RGB16 D_801D086C[] = {
+ { 195, 0, 0 }, { 70, 255, 80 }, { 80, 90, 255 }, { 255, 255, 50 },
+ { 80, 150, 255 }, { 255, 150, 180 }, { 170, 170, 170 }, { 255, 130, 30 },
+};
+
+Color_RGB16 D_801D089C[] = {
+ { 255, 60, 60 }, { 110, 170, 255 }, { 80, 90, 255 }, { 255, 255, 50 },
+ { 80, 150, 255 }, { 255, 150, 180 }, { 170, 170, 170 }, { 255, 130, 30 },
+};
+
+u8 D_801D08CC[] = {
+ 0x02, 0x01, 0x03, 0x06, 0x06, 0x06, 0x03, 0x03, 0x03, 0x03, 0x01, 0x06,
+};
+
+void Message_DrawTextNES(PlayState* play, Gfx** gfxP, u16 textDrawPos) {
+ MessageContext* msgCtx = &play->msgCtx;
+ u16 i;
+ u16 j;
+ Font* font = &msgCtx->font;
+ u16 charTexIndex;
+ u16 stateTimerHi;
+ Gfx* gfx = *gfxP;
+ u16 character;
+ s16 sp130;
+ s16 sp12E;
+ s16 sp12C;
+ s16 sp12A;
+
+ msgCtx->textPosX = msgCtx->unk11F1A[0] + msgCtx->unk11FF8;
+ msgCtx->textPosY = msgCtx->unk11FFA;
+
+ sp130 = 0;
+ if (!msgCtx->textIsCredits) {
+ msgCtx->textPosY = msgCtx->unk11FFA;
+ } else {
+ msgCtx->textPosY = 48;
+ }
+
+ if (msgCtx->itemId != 0xFE) {
+ Message_DrawItemIcon(play, &gfx);
+ }
+
+ msgCtx->textColorR = msgCtx->unk120C8;
+ msgCtx->textColorG = msgCtx->unk120CA;
+ msgCtx->textColorB = msgCtx->unk120CC;
+
+ charTexIndex = 0;
+
+ for (i = textDrawPos; i < msgCtx->textDrawPos; i++) {
+ character = msgCtx->decodedBuffer.schar[i];
+
+ switch (character) {
+ case 0x0:
+ if (play->pauseCtx.bombersNotebookOpen || (msgCtx->textBoxType == TEXTBOX_TYPE_D)) {
+ msgCtx->textColorR = msgCtx->textColorG = msgCtx->textColorB = 0;
+ } else if (msgCtx->textBoxType == TEXTBOX_TYPE_5) {
+ msgCtx->textColorR = msgCtx->textColorG = msgCtx->textColorB = 0;
+ } else {
+ msgCtx->textColorR = msgCtx->textColorG = msgCtx->textColorB = 255;
+ }
+
+ if ((i + 1) == msgCtx->textDrawPos) {
+ msgCtx->textDrawPos++;
+ }
+ break;
+
+ case 0x1:
+ case 0x2:
+ case 0x3:
+ case 0x4:
+ case 0x5:
+ case 0x6:
+ case 0x7:
+ case 0x8:
+ if ((msgCtx->msgMode >= MSGMODE_NEW_CYCLE_0) && (msgCtx->msgMode <= MSGMODE_OWL_SAVE_2) &&
+ (character == 0x2)) {
+ msgCtx->textDrawPos = msgCtx->decodedTextLen;
+ if (msgCtx->unk120D6) {
+ msgCtx->unk120D4 += 25;
+ if (msgCtx->unk120D4 >= 100) {
+ msgCtx->unk120D6 = false;
+ }
+ } else {
+ msgCtx->unk120D4 -= 25;
+ if (msgCtx->unk120D4 <= -100) {
+ msgCtx->unk120D6 = true;
+ }
+ }
+
+ if (D_801D07DC[(s16)(character - 1)].r + msgCtx->unk120D4 < 0) {
+ msgCtx->textColorR = 0;
+ } else {
+ msgCtx->textColorR = D_801D07DC[(s16)(character - 1)].r + msgCtx->unk120D4;
+ }
+
+ if (D_801D07DC[(s16)(character - 1)].g + msgCtx->unk120D4 >= 255) {
+ msgCtx->textColorG = D_801D07DC[(s16)(character - 1)].g;
+ } else {
+ msgCtx->textColorG = D_801D07DC[(s16)(character - 1)].g + msgCtx->unk120D4;
+ }
+
+ if (D_801D07DC[(s16)(character - 1)].b + msgCtx->unk120D4 < 0) {
+ msgCtx->textColorB = 0;
+ } else {
+ msgCtx->textColorB = D_801D07DC[(s16)(character - 1)].b + msgCtx->unk120D4;
+ }
+
+ } else if (play->pauseCtx.bombersNotebookOpen) {
+ msgCtx->textColorR = D_801D089C[(s16)(character - 1)].r;
+ msgCtx->textColorG = D_801D089C[(s16)(character - 1)].g;
+ msgCtx->textColorB = D_801D089C[(s16)(character - 1)].b;
+ } else if (msgCtx->textBoxType == TEXTBOX_TYPE_1) {
+ msgCtx->textColorR = D_801D07DC[(s16)(character - 1)].r;
+ msgCtx->textColorG = D_801D07DC[(s16)(character - 1)].g;
+ msgCtx->textColorB = D_801D07DC[(s16)(character - 1)].b;
+ } else if (msgCtx->textBoxType == TEXTBOX_TYPE_D) {
+ msgCtx->textColorR = D_801D086C[(s16)(character - 1)].r;
+ msgCtx->textColorG = D_801D086C[(s16)(character - 1)].g;
+ msgCtx->textColorB = D_801D086C[(s16)(character - 1)].b;
+ } else {
+ msgCtx->textColorR = D_801D080C[(s16)(character - 1)].r;
+ msgCtx->textColorG = D_801D080C[(s16)(character - 1)].g;
+ msgCtx->textColorB = D_801D080C[(s16)(character - 1)].b;
+ }
+
+ if ((i + 1) == msgCtx->textDrawPos) {
+ msgCtx->textDrawPos++;
+ }
+ break;
+
+ case 0x20: // ` `
+ msgCtx->textPosX += 6;
+ break;
+
+ case 0x11:
+ msgCtx->textPosY += msgCtx->unk11FFC;
+ // fallthrough
+ case 0x13:
+ sp130++;
+
+ msgCtx->textPosX = msgCtx->unk11F1A[sp130] + msgCtx->unk11FF8;
+ if (msgCtx->choiceNum == 1) {
+ if (!play->pauseCtx.bombersNotebookOpen) {
+ msgCtx->textPosX += 16;
+ } else {
+ msgCtx->textPosX += 50;
+ }
+ } else if (msgCtx->choiceNum == 2) {
+ if (msgCtx->unk120D8 != 3) {
+ if (!play->pauseCtx.bombersNotebookOpen) {
+ msgCtx->textPosX += 10;
+ } else {
+ msgCtx->textPosX += 57;
+ }
+ } else if (sp130 >= 2) {
+ if (!play->pauseCtx.bombersNotebookOpen) {
+ msgCtx->textPosX += 10;
+ } else {
+ msgCtx->textPosX += 57;
+ }
+ }
+ }
+ continue;
+
+ case 0x10:
+ case 0x12:
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ if (!msgCtx->textboxSkipped) {
+ Audio_PlaySfx(NA_SE_NONE);
+ msgCtx->msgMode = MSGMODE_TEXT_AWAIT_NEXT;
+ Font_LoadMessageBoxEndIcon(font, 0);
+ } else {
+ msgCtx->msgMode = MSGMODE_TEXT_NEXT_MSG;
+ msgCtx->textUnskippable = false;
+ msgCtx->msgBufPos++;
+ }
+ msgCtx->unk120CE = msgCtx->textColorR;
+ msgCtx->unk120D0 = msgCtx->textColorG;
+ msgCtx->unk120D2 = msgCtx->textColorB;
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x17: // MESSAGE_QUICKTEXT_ENABLE
+ if ((i + 1) == msgCtx->textDrawPos) {
+ j = i;
+ if ((msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) ||
+ ((msgCtx->msgMode >= MSGMODE_OCARINA_STARTING) && (msgCtx->msgMode <= MSGMODE_26))) {
+ //! FAKE:
+ dummy:;
+ while (true) {
+ if ((msgCtx->decodedBuffer.schar[j] != 0x18) && (msgCtx->decodedBuffer.schar[j] != 0x1A) &&
+ (msgCtx->decodedBuffer.schar[j] != 0x19) && (msgCtx->decodedBuffer.schar[j] != 0xE0) &&
+ (msgCtx->decodedBuffer.schar[j] != 0x10) && (msgCtx->decodedBuffer.schar[j] != 0x12)) {
+ j++;
+ continue;
+ }
+ break;
+ }
+ i = j - 1;
+ msgCtx->textDrawPos = i + 1;
+ }
+ }
+ break;
+
+ case 0x18: // MESSAGE_QUICKTEXT_DISABLE
+ break;
+
+ case 0x1B: // MESSAGE_BOX_BREAK_DELAYED
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ stateTimerHi = msgCtx->decodedBuffer.schar[++i] << 8;
+ stateTimerHi |= msgCtx->decodedBuffer.schar[++i];
+ msgCtx->stateTimer = stateTimerHi;
+ msgCtx->msgMode = MSGMODE_TEXT_DELAYED_BREAK;
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x1C:
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ if (msgCtx->unk11F0C == 3) {
+ msgCtx->textboxEndType = 0x55;
+ } else {
+ msgCtx->textboxEndType = 0x50;
+ }
+ stateTimerHi = msgCtx->decodedBuffer.schar[++i] << 8;
+ stateTimerHi |= msgCtx->decodedBuffer.schar[++i];
+ msgCtx->stateTimer = stateTimerHi;
+ Font_LoadMessageBoxEndIcon(font, 1);
+ if (play->csCtx.state == CS_STATE_IDLE) {
+ func_8011552C(play, DO_ACTION_RETURN);
+ }
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x1D:
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ msgCtx->textboxEndType = 0x52;
+ stateTimerHi = msgCtx->decodedBuffer.schar[++i] << 8;
+ stateTimerHi |= msgCtx->decodedBuffer.schar[++i];
+ msgCtx->stateTimer = stateTimerHi;
+ Font_LoadMessageBoxEndIcon(font, 1);
+ if (play->csCtx.state == CS_STATE_IDLE) {
+ func_8011552C(play, DO_ACTION_RETURN);
+ }
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x1E: // MESSAGE_SFX
+ if (((i + 1) == msgCtx->textDrawPos) && (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING)) {
+ stateTimerHi = msgCtx->decodedBuffer.schar[i + 1] << 8;
+ stateTimerHi |= msgCtx->decodedBuffer.schar[i + 2];
+ Audio_PlaySfx(stateTimerHi);
+ }
+ if ((i + 1) == msgCtx->textDrawPos) {
+ msgCtx->textDrawPos += 2;
+ }
+ i += 2;
+ break;
+
+ case 0x1F:
+ if (((i + 1) == msgCtx->textDrawPos) && (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING)) {
+ msgCtx->msgMode = MSGMODE_9;
+ stateTimerHi = msgCtx->decodedBuffer.schar[i + 1] << 8;
+ stateTimerHi |= msgCtx->decodedBuffer.schar[i + 2];
+ msgCtx->textDelayTimer = stateTimerHi;
+ }
+ i += 2;
+ break;
+
+ case 0xA:
+ i++;
+ character = msgCtx->decodedBuffer.schar[i];
+ switch (character) {
+ case 0x0:
+ case 0x1:
+ case 0x2:
+ case 0x3:
+ case 0x4:
+ case 0x5:
+ case 0x6:
+ msgCtx->textDelay = character - 0x0;
+ if ((i + 1) == msgCtx->textDrawPos) {
+ msgCtx->textDrawPos++;
+ }
+ break;
+ }
+ break;
+
+ case 0xC1: // MESSAGE_BACKGROUND
+ msgCtx->textPosX = 0x2D;
+
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Audio_PlaySfx(NA_SE_NONE);
+ }
+
+ gDPPipeSync(gfx++);
+ gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, msgCtx->textColorAlpha);
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_I, 96, 48, 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(gfx++, msgCtx->textPosX << 2, (msgCtx->unk12012 + 1) << 2,
+ (msgCtx->textPosX + 0x60) << 2, (msgCtx->unk12012 + 0x31) << 2, G_TX_RENDERTILE, 0,
+ 0, 1 << 10, 1 << 10);
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1900, G_IM_FMT_I, 96, 48, 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(gfx++, (msgCtx->textPosX + 0x60) << 2, (msgCtx->unk12012 + 1) << 2,
+ (msgCtx->textPosX + 0xC1) << 2, (msgCtx->unk12012 + 0x31) << 2, G_TX_RENDERTILE, 0,
+ 0, 1 << 10, 1 << 10);
+
+ gDPPipeSync(gfx++);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 60, 0, msgCtx->textColorAlpha);
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_I, 96, 48, 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(gfx++, msgCtx->textPosX << 2, msgCtx->unk12012 << 2, (msgCtx->textPosX + 0x60) << 2,
+ (msgCtx->unk12012 + 0x30) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1900, G_IM_FMT_I, 96, 48, 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(gfx++, (msgCtx->textPosX + 0x60) << 2, msgCtx->unk12012 << 2,
+ (msgCtx->textPosX + 0xC0) << 2, (msgCtx->unk12012 + 0x30) << 2, G_TX_RENDERTILE, 0,
+ 0, 1 << 10, 1 << 10);
+
+ gDPPipeSync(gfx++);
+ gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0,
+ PRIMITIVE, 0);
+
+ msgCtx->textPosX += 32;
+ break;
+
+ case 0xC2:
+ msgCtx->textboxEndType = 0x10;
+
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->choiceTextId = msgCtx->currentTextId;
+ msgCtx->stateTimer = 4;
+ Font_LoadMessageBoxEndIcon(font, 2);
+ if (msgCtx->unk120D8 != 3) {
+ msgCtx->unk11FFE[0] = (s16)(msgCtx->textboxYTarget + 0xE);
+ msgCtx->unk11FFE[1] = (s16)(msgCtx->textboxYTarget + 0x1A);
+ msgCtx->unk11FFE[2] = (s16)(msgCtx->textboxYTarget + 0x26);
+ }
+ }
+ break;
+
+ case 0xC3:
+ msgCtx->textboxEndType = 0x11;
+
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->choiceTextId = msgCtx->currentTextId;
+ msgCtx->stateTimer = 4;
+ Font_LoadMessageBoxEndIcon(font, 2);
+ if (msgCtx->unk120D8 != 3) {
+ msgCtx->unk11FFE[0] = (s16)(msgCtx->textboxYTarget + 0xE);
+ msgCtx->unk11FFE[1] = (s16)(msgCtx->textboxYTarget + 0x1A);
+ msgCtx->unk11FFE[2] = (s16)(msgCtx->textboxYTarget + 0x26);
+ }
+ }
+ break;
+
+ case 0xCC:
+ msgCtx->textboxEndType = 0x60;
+
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Font_LoadMessageBoxEndIcon(font, 1);
+ }
+ break;
+
+ case 0xD0:
+ msgCtx->textboxEndType = 0x61;
+
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Font_LoadMessageBoxEndIcon(font, 1);
+ }
+ break;
+
+ case 0xD1:
+ msgCtx->textboxEndType = 0x62;
+
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Font_LoadMessageBoxEndIcon(font, 1);
+ }
+ break;
+
+ case 0xD2:
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ msgCtx->textboxEndType = 0x41;
+ Font_LoadMessageBoxEndIcon(font, 0);
+ Audio_PlaySfx(NA_SE_SY_MESSAGE_END);
+ }
+ break;
+
+ case 0xD5:
+ msgCtx->textboxEndType = 0x63;
+
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Font_LoadMessageBoxEndIcon(font, 1);
+ }
+ break;
+
+ case 0x15:
+ case 0xBF:
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ if (msgCtx->textBoxType == TEXTBOX_TYPE_3) {
+ Message_HandleOcarina(play);
+ *gfxP = gfx;
+ return;
+ }
+
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ if (msgCtx->textboxEndType == 0) {
+ Audio_PlaySfx(NA_SE_SY_MESSAGE_END);
+ if (character == 0xBF) {
+ Font_LoadMessageBoxEndIcon(font, 1);
+ } else {
+ Font_LoadMessageBoxEndIcon(font, 0);
+ }
+ if (play->csCtx.state == CS_STATE_IDLE) {
+ func_8011552C(play, DO_ACTION_RETURN);
+ }
+ } else {
+ Audio_PlaySfx(NA_SE_NONE);
+ }
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x1A:
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Audio_PlaySfx(NA_SE_NONE);
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ msgCtx->textboxEndType = 0x30;
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x19:
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ msgCtx->textboxEndType = 0x40;
+ Font_LoadMessageBoxEndIcon(font, 0);
+ Audio_PlaySfx(NA_SE_SY_MESSAGE_END);
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0xE0:
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ msgCtx->textboxEndType = 0x42;
+ Font_LoadMessageBoxEndIcon(font, 1);
+ Audio_PlaySfx(NA_SE_SY_MESSAGE_END);
+ }
+ *gfxP = gfx;
+ return;
+
+ default:
+ switch (character) {
+ case 0x8169:
+ case 0x8175:
+ msgCtx->textPosX -= (s16)(6.0f * msgCtx->textCharScale);
+ break;
+
+ case 0x8145:
+ msgCtx->textPosX -= (s16)(3.0f * msgCtx->textCharScale);
+ break;
+
+ case 0x8148:
+ case 0x8149:
+ msgCtx->textPosX -= (s16)(2.0f * msgCtx->textCharScale);
+ break;
+
+ default:
+ break;
+ }
+ if ((msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) && ((i + 1) == msgCtx->textDrawPos)) {
+ Audio_PlaySfx(NA_SE_NONE);
+ }
+ if ((character >= 0xB0) && (character <= 0xBB)) {
+ sp12E = msgCtx->textColorR;
+ sp12C = msgCtx->textColorG;
+ sp12A = msgCtx->textColorB;
+ msgCtx->textColorR = D_801D083C[(s16)D_801D08CC[character - 0xB0]].r;
+ msgCtx->textColorG = D_801D083C[(s16)D_801D08CC[character - 0xB0]].g;
+ msgCtx->textColorB = D_801D083C[(s16)D_801D08CC[character - 0xB0]].b;
+ Message_DrawTextChar(play, &font->charBuf[font->unk_11D88][charTexIndex], &gfx);
+ msgCtx->textColorR = sp12E;
+ msgCtx->textColorG = sp12C;
+ msgCtx->textColorB = sp12A;
+ } else if (msgCtx->msgMode >= MSGMODE_OWL_SAVE_0) {
+ if ((i < (msgCtx->decodedTextLen - 6)) || (i >= (msgCtx->decodedTextLen - 4))) {
+ Message_DrawTextChar(play, &font->charBuf[font->unk_11D88][charTexIndex], &gfx);
+ }
+ } else {
+ Message_DrawTextChar(play, &font->charBuf[font->unk_11D88][charTexIndex], &gfx);
+ }
+ charTexIndex += FONT_CHAR_TEX_SIZE;
+
+ //! @TODO: u8 character but > 0x255 cases
+ switch (character) {
+ case 0x8144:
+ msgCtx->textPosX += (s16)(8.0f * msgCtx->textCharScale);
+ break;
+
+ case 0x816A:
+ case 0x8176:
+ msgCtx->textPosX += (s16)(10.0f * msgCtx->textCharScale);
+ break;
+
+ case 0x8141:
+ case 0x8142:
+ case 0x8168:
+ msgCtx->textPosX += (s16)(12.0f * msgCtx->textCharScale);
+ break;
+
+ case 0x8194:
+ msgCtx->textPosX += (s16)(14.0f * msgCtx->textCharScale);
+ break;
+
+ case 0x8145:
+ msgCtx->textPosX += (s16)(15.0f * msgCtx->textCharScale);
+ break;
+
+ default:
+ if (((msgCtx->textboxEndType == 0x62) && (i >= msgCtx->unk120C0) &&
+ ((msgCtx->unk120C0 + 4) >= i)) ||
+ ((msgCtx->textboxEndType == 0x63) && (i >= msgCtx->unk120C0) &&
+ ((msgCtx->unk120C0 + 2) >= i)) ||
+ ((msgCtx->textboxEndType == 0x60) && (i >= msgCtx->unk120C0) &&
+ ((msgCtx->unk120C0 + 2) >= i)) ||
+ ((msgCtx->textboxEndType == 0x61) && (i >= msgCtx->unk120C0) &&
+ ((msgCtx->unk120C0 + 1) >= i))) {
+ msgCtx->textPosX += (s32)(16.0f * msgCtx->textCharScale);
+ } else {
+ msgCtx->textPosX += (s32)(sNESFontWidths[character - ' '] * msgCtx->textCharScale);
+ }
+ break;
+ }
+ break;
+ }
+ }
+
+ if (msgCtx->textDelayTimer == 0) {
+ msgCtx->textDrawPos = i + 1;
+ msgCtx->textDelayTimer = 0;
+ if (msgCtx->msgMode == MSGMODE_9) {
+ msgCtx->msgMode = MSGMODE_TEXT_DISPLAYING;
+ }
+ } else {
+ msgCtx->textDelayTimer--;
+ }
+
+ *gfxP = gfx;
+}
+
+char D_801D08D8[][4] = {
+ "Fast",
+ "----",
+ "Slow",
+};
+
+u8 D_801D08E4[] = {
+ 0x01,
+ 0x03,
+ 0x04,
+ 0x02,
+};
+
+#define RED_STR "RED"
+#define BLUE_STR "BLUE"
+#define YELLOW_STR "YELLOW"
+#define GREEN_STR "GREEN"
+
+char sMaskCodeTextENG[][6] = {
+ RED_STR,
+ BLUE_STR,
+ YELLOW_STR,
+ GREEN_STR,
+};
+
+u8 sMaskCodeTextLengthENG[] = {
+ sizeof(RED_STR) - 1,
+ sizeof(BLUE_STR) - 1,
+ sizeof(YELLOW_STR) - 1,
+ sizeof(GREEN_STR) - 1,
+};
+
+#ifdef NON_MATCHING
+// https://decomp.me/scratch/w2ckG
+void Message_DecodeNES(PlayState* play) {
+ f32 var_fs0;
+ MessageContext* msgCtx = &play->msgCtx;
+ u8* ptr;
+ Font* font = &msgCtx->font; // spE0
+ Player* player; // spDC
+ s16 decodedBufPos; // spDA
+ s16 value;
+ u32 timeToMoonCrash;
+ s16 i; // s1
+ s16 spD0; // numLines
+ s16 digits[4]; // spC8/CA/CC/CE
+ s16 spC6;
+ f32 timeInSeconds;
+ s32 charTexIdx; // spBC
+ s16 loadChar;
+ s16 spA8[8];
+ f32 spA4;
+ s16 playerNameLen; // s0
+ s16 var_v1_3;
+ u8 curChar; // sp78
+ s8 charOffset;
+ s16 temp_s2_2;
+ s16 var_s2_9;
+
+ player = GET_PLAYER(play);
+ decodedBufPos = 0;
+ spC6 = 0;
+ charTexIdx = 0;
+ spD0 = 0;
+ msgCtx->textDelayTimer = 0;
+ msgCtx->textDelay = msgCtx->textDelayTimer;
+ msgCtx->textFade = 0;
+ spA4 = 0.0f;
+ font->unk_11D88 = (font->unk_11D88 ^ 1) & 1;
+ Message_SetupLoadItemIcon(play);
+
+ while (true) {
+ curChar = font->msgBuf.schar[msgCtx->msgBufPos];
+ msgCtx->decodedBuffer.schar[decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos];
+
+ if ((curChar == 0x10) || (curChar == 0x12) || (curChar == 0x1B) || (curChar == 0x1C) || (curChar == 0x1D) ||
+ (curChar == 0x19) || (curChar == 0xE0) || (curChar == 0xBF) || (curChar == 0x15) || (curChar == 0x1A)) {
+ msgCtx->msgMode = MSGMODE_TEXT_DISPLAYING;
+ msgCtx->textDrawPos = 1;
+ if (msgCtx->textBoxType == TEXTBOX_TYPE_3) {
+ msgCtx->unk11FFA = msgCtx->textboxY + 2;
+ } else {
+ msgCtx->unk11FFA = msgCtx->textboxY + 8;
+ }
+ msgCtx->unk11F1A[spC6] = 0;
+ if (msgCtx->unk11F18 != 0) {
+ msgCtx->unk11F1A[spC6] = (s16)((msgCtx->textCharScale * 16.0f * 16.0f) - spA4) / 2;
+ }
+ spA4 = 0.0f;
+ if (curChar == 0x12) {
+ if ((msgCtx->textBoxType != TEXTBOX_TYPE_3) && (msgCtx->textBoxType != TEXTBOX_TYPE_4)) {
+ if (spD0 < 2) {
+ msgCtx->unk11FFA = msgCtx->textboxY + XREG(10);
+ } else if (spD0 == 2) {
+ msgCtx->unk11FFA = msgCtx->textboxY + XREG(11);
+ } else if (spD0 == 3) {
+ msgCtx->unk11FFA = msgCtx->textboxY + XREG(12);
+ }
+ }
+ } else {
+ if ((msgCtx->textBoxType != TEXTBOX_TYPE_3) && (msgCtx->textBoxType != TEXTBOX_TYPE_4)) {
+ if (spD0 == 0) {
+ msgCtx->unk11FFA = msgCtx->textboxY + XREG(13) + XREG(10);
+ } else if (spD0 == 1) {
+ msgCtx->unk11FFA = msgCtx->textboxY + XREG(13) + XREG(11);
+ } else if (spD0 == 2) {
+ msgCtx->unk11FFA = msgCtx->textboxY + XREG(13) + XREG(12);
+ }
+ }
+ }
+
+ //! FAKE: Perhaps a locally required temp for scoping
+ dummy:;
+ if ((curChar == 0x1B) || (curChar == 0x1C) || (curChar == 0x1D)) {
+ //! FAKE: & 0xFFFF to fix regalloc
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 1] & 0xFFFF;
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 2];
+ msgCtx->msgBufPos += 3;
+ }
+ msgCtx->decodedTextLen = decodedBufPos;
+ msgCtx->unk120D8 = spD0;
+ if (msgCtx->textboxSkipped || (msgCtx->textBoxType == TEXTBOX_TYPE_1) ||
+ (msgCtx->textBoxType == TEXTBOX_TYPE_3) || (msgCtx->textBoxType == TEXTBOX_TYPE_6) ||
+ (msgCtx->textBoxType == TEXTBOX_TYPE_8) || (msgCtx->textBoxType == TEXTBOX_TYPE_9) ||
+ (msgCtx->textBoxType == TEXTBOX_TYPE_B) || (msgCtx->unk11F0C == 3)) {
+ msgCtx->textDrawPos = msgCtx->decodedTextLen;
+ }
+ msgCtx->unk120C8 = msgCtx->unk120CE;
+ msgCtx->unk120CA = msgCtx->unk120D0;
+ msgCtx->unk120CC = msgCtx->unk120D2;
+ break;
+ } else if (curChar == 0x16) {
+ // Substitute the player name control character for the file's player name.
+ for (playerNameLen = ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); playerNameLen > 0;
+ playerNameLen--) {
+ if (gSaveContext.save.saveInfo.playerData.playerName[playerNameLen - 1] != 0x3E) {
+ break;
+ }
+ }
+
+ for (i = 0; i < playerNameLen; i++) {
+ curChar = gSaveContext.save.saveInfo.playerData.playerName[i];
+ if (curChar == 0x3E) {
+ curChar = ' ';
+ } else if (curChar == 0x40) {
+ curChar = '.';
+ } else if (curChar == 0x3F) {
+ curChar = '-';
+ } else if (curChar < 0xA) {
+ charOffset = curChar;
+ curChar = '0' + charOffset;
+ } else if (curChar < 0x24) {
+ charOffset = curChar;
+ curChar = 'A' - 10 + charOffset;
+ } else if (curChar < 0x3E) {
+ charOffset = curChar;
+ curChar = 'a' - 36 + charOffset;
+ }
+ if (curChar != ' ') {
+ Font_LoadCharNES(play, curChar, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ }
+ msgCtx->decodedBuffer.schar[decodedBufPos] = curChar;
+ decodedBufPos++;
+ }
+ decodedBufPos--;
+ } else if (curChar == 0xC1) {
+ //! TODO: + 0x900 on the first one?
+ DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1000, SEGMENT_ROM_START(message_texture_static), 0x900);
+ DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1900,
+ (uintptr_t)SEGMENT_ROM_START(message_texture_static) + 0x900, 0x900);
+ spD0 = 2;
+ spC6 = 2;
+ msgCtx->unk12012 = msgCtx->textboxY + 8;
+ msgCtx->unk11F18 = 1;
+ msgCtx->unk12010 = XREG(47);
+ } else if (curChar == 0xC2) {
+ msgCtx->unk11F18 = 0;
+ msgCtx->choiceNum = 2;
+ } else if (curChar == 0xC3) {
+ msgCtx->unk11F18 = 0;
+ msgCtx->choiceNum = 3;
+ msgCtx->unk11FF8 = msgCtx->unk11FF8 + 0x16;
+ } else if (curChar == 0xC4) {
+ Message_GetTimerDigitsNES(((void)0, gSaveContext.timerCurTimes[curChar - 0xC4]), spA8);
+
+ loadChar = false;
+ for (i = 0; i < 5; i++) {
+ if ((i == 1) || (spA8[i + 3] != '0')) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Message_LoadCharNES(play, spA8[i + 3], &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+ decodedBufPos--;
+ } else if ((curChar == 0xC5) || (curChar == 0xC6) || (curChar == 0xC7) || (curChar == 0xC8) ||
+ (curChar == 0xC9)) {
+ Message_GetTimerDigitsNES(((void)0, gSaveContext.timerCurTimes[curChar - 0xC4]), spA8);
+
+ loadChar = false;
+ for (i = 0; i < 8; i++) {
+ if ((i == 4) || ((i != 2) && (i != 5) && (spA8[i] != '0'))) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Message_LoadCharNES(play, spA8[i], &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+ decodedBufPos--;
+ } else if (curChar == 0xCA) {
+ digits[0] = 0;
+ timeInSeconds = TIME_TO_MINUTES_F(gSaveContext.save.time);
+
+ digits[1] = timeInSeconds / 60.0f;
+ while (digits[1] >= 10) {
+ digits[0]++;
+ digits[1] -= 10;
+ }
+
+ digits[2] = 0;
+ digits[3] = (s32)timeInSeconds % 60;
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ for (i = 0; i < 4; i++) {
+ Font_LoadCharNES(play, digits[i] + '0', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ if (i == 1) {
+ Font_LoadCharNES(play, '"', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = 0x22;
+ decodedBufPos++;
+ } else if (i == 3) {
+ Font_LoadCharNES(play, 0x27, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = 0x27;
+ }
+ }
+ spA4 += 6 * (16.0f * msgCtx->textCharScale);
+ } else if (curChar == 0xCB) {
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = Flags_GetAllTreasure(play);
+
+ while (digits[3] >= 1000) {
+ digits[0]++;
+ digits[3] -= 1000;
+ }
+ while (digits[3] >= 100) {
+ digits[1]++;
+ digits[3] -= 100;
+ }
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 4; i++) {
+ if ((i == 3) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Font_LoadCharNES(play, digits[i] + '0', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ spA4 += 16.0f * msgCtx->textCharScale;
+ }
+ }
+ decodedBufPos--;
+ } else if (curChar == 0xCC) {
+ decodedBufPos++;
+ msgCtx->unk120BE = spC6;
+ msgCtx->unk120C0 = decodedBufPos;
+ msgCtx->unk120C2 = 2;
+ msgCtx->bankRupeesSelected = 0;
+ msgCtx->unk120C4 = charTexIdx;
+ digits[0] = digits[1] = digits[2] = 0;
+
+ for (i = 0; i < 3; i++) {
+ Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ Message_LoadLocalizedRupeesNES(play, &decodedBufPos, &charTexIdx, &spA4);
+ } else if (curChar == 0xCD) {
+ digits[0] = digits[1] = 0;
+ digits[2] = msgCtx->bankRupeesSelected;
+
+ while (digits[2] >= 100) {
+ digits[0]++;
+ digits[2] -= 100;
+ }
+
+ while (digits[2] >= 10) {
+ digits[1]++;
+ digits[2] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 3; i++) {
+ if ((i == 2) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+ Message_LoadRupeesNES(play, &decodedBufPos, &charTexIdx, &spA4, msgCtx->bankRupeesSelected);
+ } else if (curChar == 0xCE) {
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = msgCtx->bankRupees;
+
+ while (digits[3] >= 1000) {
+ digits[0]++;
+ digits[3] -= 1000;
+ }
+ while (digits[3] >= 100) {
+ digits[1]++;
+ digits[3] -= 100;
+ }
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 4; i++) {
+ if ((i == 3) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+ Message_LoadRupeesNES(play, &decodedBufPos, &charTexIdx, &spA4, msgCtx->bankRupees);
+ } else if (curChar == 0xCF) {
+ Message_LoadTimeNES(play, curChar, &charTexIdx, &spA4, &decodedBufPos);
+ } else if (curChar == 0xC) {
+ digits[0] = digits[1] = 0;
+ digits[2] = gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex];
+
+ while (digits[2] >= 100) {
+ digits[0]++;
+ digits[2] -= 100;
+ }
+ while (digits[2] >= 10) {
+ digits[1]++;
+ digits[2] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 3; i++) {
+ if ((i == 2) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+
+ if ((gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] == 1) ||
+ (gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] == 21)) {
+ Message_LoadCharNES(play, 's', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ Message_LoadCharNES(play, 't', &charTexIdx, &spA4, decodedBufPos);
+ } else if ((gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] == 2) ||
+ (gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] == 22)) {
+ Message_LoadCharNES(play, 'n', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ Message_LoadCharNES(play, 'd', &charTexIdx, &spA4, decodedBufPos);
+ } else if ((gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] == 3) ||
+ (gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] == 23)) {
+ Message_LoadCharNES(play, 'r', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ Message_LoadCharNES(play, 'd', &charTexIdx, &spA4, decodedBufPos);
+ } else {
+ Message_LoadCharNES(play, 't', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ Message_LoadCharNES(play, 'h', &charTexIdx, &spA4, decodedBufPos);
+ }
+ } else if (curChar == 0xD) {
+ digits[0] = digits[1] = 0;
+ digits[2] = Inventory_GetSkullTokenCount(play->sceneId);
+
+ while (digits[2] >= 100) {
+ digits[0]++;
+ digits[2] -= 100;
+ }
+ while (digits[2] >= 10) {
+ digits[1]++;
+ digits[2] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 3; i++) {
+ if ((i == 2) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+
+ if ((Inventory_GetSkullTokenCount(play->sceneId) == 1) ||
+ (Inventory_GetSkullTokenCount(play->sceneId) == 21)) {
+ Message_LoadCharNES(play, 's', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ Message_LoadCharNES(play, 't', &charTexIdx, &spA4, decodedBufPos);
+ } else if ((Inventory_GetSkullTokenCount(play->sceneId) == 2) ||
+ (Inventory_GetSkullTokenCount(play->sceneId) == 22)) {
+ Message_LoadCharNES(play, 'n', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ Message_LoadCharNES(play, 'd', &charTexIdx, &spA4, decodedBufPos);
+ } else if ((Inventory_GetSkullTokenCount(play->sceneId) == 3) ||
+ (Inventory_GetSkullTokenCount(play->sceneId) == 23)) {
+ Message_LoadCharNES(play, 'r', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ Message_LoadCharNES(play, 'd', &charTexIdx, &spA4, decodedBufPos);
+ } else {
+ Message_LoadCharNES(play, 't', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ Message_LoadCharNES(play, 'h', &charTexIdx, &spA4, decodedBufPos);
+ }
+ } else if (curChar == 0xE) {
+ digits[0] = 0;
+ digits[1] = gSaveContext.minigameScore;
+
+ while (digits[1] >= 10) {
+ digits[0]++;
+ digits[1] -= 10;
+ }
+
+ for (i = 0; i < 2; i++) {
+ if ((i == 1) || (digits[i] != 0)) {
+ Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+
+ decodedBufPos--;
+ } else if (curChar == 0xF) {
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = gSaveContext.minigameScore;
+
+ while (digits[3] >= 1000) {
+ digits[0]++;
+ digits[3] -= 1000;
+ }
+ while (digits[3] >= 100) {
+ digits[1]++;
+ digits[3] -= 100;
+ }
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 4; i++) {
+ if ((i == 3) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+ decodedBufPos--;
+ } else if (curChar == 0xD0) {
+ decodedBufPos++;
+ msgCtx->unk120BE = spC6;
+ msgCtx->unk120C0 = decodedBufPos;
+ msgCtx->unk120C2 = 0;
+ msgCtx->bankRupeesSelected = 0;
+ msgCtx->unk120C4 = charTexIdx;
+ digits[0] = digits[1] = digits[2] = 0;
+ for (i = 0; i < 2; i++) {
+ Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ Message_LoadPluralRupeesNES(play, &decodedBufPos, &charTexIdx, &spA4);
+ } else if (curChar == 0xD1) {
+ decodedBufPos++;
+ msgCtx->unk120BE = spC6;
+ msgCtx->unk120C0 = decodedBufPos;
+ msgCtx->unk120C2 = 0;
+ msgCtx->bankRupeesSelected = 0;
+ msgCtx->unk120C4 = charTexIdx;
+
+ for (i = 0; i < 5; i++) {
+ msgCtx->unk12054[i] = 1;
+ Message_LoadCharNES(play, '1', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ decodedBufPos--;
+ } else if (curChar == 0xD3) {
+ if (gSaveContext.save.timeSpeedOffset == 18) {
+ var_s2_9 = 0;
+ } else if (gSaveContext.save.timeSpeedOffset == 0) {
+ var_s2_9 = 1;
+ } else {
+ var_s2_9 = 2;
+ }
+
+ for (i = 0; i < 4; i++) {
+ msgCtx->decodedBuffer.schar[decodedBufPos] = D_801D08D8[var_s2_9][i];
+ Font_LoadCharNES(play, D_801D08D8[var_s2_9][i], charTexIdx);
+ decodedBufPos++;
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ }
+ decodedBufPos--;
+ spA4 += 3.0f * (16.0f * msgCtx->textCharScale);
+ msgCtx->choiceIndex = var_s2_9;
+ } else if (curChar == 0xD4) {
+ Message_LoadOwlWarpTextNES(play, &charTexIdx, &spA4, &decodedBufPos);
+ } else if (curChar == 0xD5) {
+ decodedBufPos++;
+ msgCtx->unk120BE = spC6;
+ msgCtx->unk120C0 = decodedBufPos;
+ msgCtx->unk120C2 = 0;
+ msgCtx->bankRupeesSelected = 0;
+ msgCtx->unk120C4 = charTexIdx;
+
+ for (i = 0; i < 3; i++) {
+ msgCtx->unk12054[i] = 1;
+ Font_LoadCharNES(play, '1', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = '1';
+ spA4 += 16.0f * msgCtx->textCharScale;
+ decodedBufPos++;
+ }
+ decodedBufPos--;
+ } else if (curChar == 0xD6) {
+ for (i = 0; i < 6; i++) {
+ msgCtx->decodedBuffer.schar[decodedBufPos] =
+ (s8)D_801D08E4[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[i])];
+ decodedBufPos++;
+ Message_LoadCharNES(play, i + '1', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ msgCtx->decodedBuffer.schar[decodedBufPos] = 0;
+ } else if ((curChar >= 0xD7) && (curChar < 0xDB)) {
+ digits[0] = digits[1] = 0;
+ digits[2] = 15 - gSaveContext.save.saveInfo.inventory.strayFairies[curChar - 0xD7];
+
+ while (digits[2] >= 100) {
+ digits[0]++;
+ digits[2] -= 100;
+ }
+ while (digits[2] >= 10) {
+ digits[1]++;
+ digits[2] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 3; i++) {
+ if ((i == 2) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Font_LoadCharNES(play, digits[i] + '0', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ spA4 += 16.0f * msgCtx->textCharScale;
+ }
+ }
+ } else if (curChar == 0xDB) {
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = gSaveContext.minigameScore;
+
+ while (digits[3] >= 1000) {
+ digits[0]++;
+ digits[3] -= 1000;
+ }
+ while (digits[3] >= 100) {
+ digits[1]++;
+ digits[3] -= 100;
+ }
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 4; i++) {
+ if ((i == 3) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Font_LoadCharNES(play, digits[i] + '0', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ spA4 += 16.0f * msgCtx->textCharScale;
+ }
+ }
+ decodedBufPos--;
+ } else if ((curChar == 0xDC) || (curChar == 0xDD)) {
+ if (curChar == 0xDC) {
+ digits[0] = gSaveContext.save.saveInfo.lotteryCodes[CURRENT_DAY - 1][0];
+ digits[1] = gSaveContext.save.saveInfo.lotteryCodes[CURRENT_DAY - 1][1];
+ digits[2] = gSaveContext.save.saveInfo.lotteryCodes[CURRENT_DAY - 1][2];
+ } else {
+ digits[0] = (HS_GET_LOTTERY_CODE_GUESS() & 0xF00) >> 8;
+ digits[1] = (HS_GET_LOTTERY_CODE_GUESS() & 0xF0) >> 4;
+ digits[2] = HS_GET_LOTTERY_CODE_GUESS() & 0xF;
+ }
+
+ for (i = 0; i < 3; i++) {
+ Font_LoadCharNES(play, digits[i] + '0', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ spA4 += 16.0f * msgCtx->textCharScale;
+ }
+ decodedBufPos--;
+ } else if (curChar == 0xDE) {
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = gItemPrices[GET_CUR_FORM_BTN_ITEM(player->heldItemButton)];
+
+ while (digits[3] >= 1000) {
+ digits[0]++;
+ digits[3] -= 1000;
+ }
+ while (digits[3] >= 100) {
+ digits[1]++;
+ digits[3] -= 100;
+ }
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 4; i++) {
+ if ((i == 3) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Font_LoadCharNES(play, digits[i] + '0', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ spA4 += 16.0f * msgCtx->textCharScale;
+ }
+ }
+ Message_LoadPluralRupeesNES(play, &decodedBufPos, &charTexIdx, &spA4);
+ } else if (curChar == 0xDF) {
+ for (i = 0; i < 5; i++) {
+ digits[i] = gSaveContext.save.saveInfo.bomberCode[i];
+ Font_LoadCharNES(play, digits[i] + '0', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ spA4 += 16.0f * msgCtx->textCharScale;
+ }
+ decodedBufPos--;
+ } else if ((curChar >= 0xE1) && (curChar < 0xE7)) {
+ msgCtx->decodedBuffer.schar[decodedBufPos] =
+ D_801D08E4[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0xE1)])];
+ temp_s2_2 = sMaskCodeTextLengthENG[(
+ (void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0xE1)])];
+ decodedBufPos++;
+
+ for (i = 0; i < temp_s2_2; i++) {
+ Message_LoadCharNES(
+ play,
+ sMaskCodeTextENG[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0xE1)])]
+ [i],
+ &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+
+ msgCtx->decodedBuffer.schar[decodedBufPos] = 0;
+ } else if (curChar == 0xE7) {
+ timeToMoonCrash = TIME_UNTIL_MOON_CRASH;
+ digits[0] = 0;
+ digits[1] = TIME_TO_HOURS_F_ALT(timeToMoonCrash);
+
+ while (digits[1] >= 10) {
+ digits[0]++;
+ digits[1] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 2; i++) {
+ if ((i == 1) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+ msgCtx->decodedBuffer.schar[decodedBufPos] = ' ';
+ decodedBufPos++;
+ Message_LoadCharNES(play, 'h', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ Message_LoadCharNES(play, 'o', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ Message_LoadCharNES(play, 'u', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ Message_LoadCharNES(play, 'r', &charTexIdx, &spA4, decodedBufPos);
+ if ((digits[0] != 0) || (digits[1] != 1)) {
+ decodedBufPos++;
+ Message_LoadCharNES(play, 's', &charTexIdx, &spA4, decodedBufPos);
+ }
+ } else if (curChar == 0xE8) {
+ Message_LoadTimeNES(play, curChar, &charTexIdx, &spA4, &decodedBufPos);
+
+ } else if ((curChar == 0xF0) || (curChar == 0xF1) || (curChar == 0xF2) || (curChar == 0xF8)) {
+ if (curChar == 0xF8) {
+ value = (s32)HS_GET_HIGH_SCORE_3_LOWER();
+ } else {
+ value = HIGH_SCORE(curChar - 0xF0);
+ }
+ if (curChar == 0xF2) {
+ if (LINK_AGE_IN_YEARS == YEARS_CHILD) {
+ value &= 0x7F;
+ } else {
+ value = (s16)((HIGH_SCORE((u8)font->msgBuf.schar[msgCtx->msgBufPos]) & 0xFF000000) >> 0x18) & 0x7F;
+ }
+ }
+ digits[3] = value;
+ digits[0] = digits[1] = digits[2] = 0;
+
+ while (digits[3] >= 1000) {
+ digits[0]++;
+ digits[3] -= 1000;
+ }
+ while (digits[3] >= 100) {
+ digits[1]++;
+ digits[3] -= 100;
+ }
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 4; i++) {
+ if ((i == 3) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Font_LoadCharNES(play, digits[i] + '0', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ spA4 += 16.0f * msgCtx->textCharScale;
+ }
+ }
+ decodedBufPos--;
+ } else if ((curChar == 0xF7) || (curChar == 0xF9) || (curChar == 0xFA) || (curChar == 0xFB) ||
+ (curChar == 0xFC)) {
+ var_fs0 = 8.0f;
+ if (curChar == 0xF7) {
+ Message_GetTimerDigitsNES(GET_HIGH_SCORE(HS_UNK_1), spA8);
+ } else if (curChar == 0xF9) {
+ Message_GetTimerDigitsNES(GET_HIGH_SCORE(HS_HORSE_BACK_BALLOON), spA8);
+ } else {
+ Message_GetTimerDigitsNES(
+ ((void)0, gSaveContext.save.saveInfo.dekuPlaygroundHighScores[curChar - 0xFA]), spA8);
+ }
+
+ loadChar = false;
+ for (i = 0; i < 8; i++) {
+ if ((i == 4) || ((i != 2) && (i != 5) && (spA8[i] != '\0'))) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Font_LoadCharNES(play, spA8[i], charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = spA8[i];
+ decodedBufPos++;
+ } else {
+ var_fs0 -= 1.0f;
+ }
+ }
+ spA4 += var_fs0 * (16.0f * msgCtx->textCharScale);
+ decodedBufPos--;
+ } else if ((curChar == 0xF3) || (curChar == 0xF4) || (curChar == 0xF5)) {
+ value = HIGH_SCORE(curChar - 0xF3 + HS_BOAT_ARCHERY);
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = value;
+
+ while (digits[3] >= 60) {
+ digits[1]++;
+ if (digits[1] >= 10) {
+ digits[0]++;
+ digits[1] -= 10;
+ }
+ digits[3] -= 60;
+ }
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ for (i = 0; i < 4; i++) {
+ Font_LoadCharNES(play, digits[i] + '0', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ if (i == 1) {
+ Font_LoadCharNES(play, '"', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = '"';
+ decodedBufPos++;
+ } else if (i == 3) {
+ Font_LoadCharNES(play, 0x27, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = 0x27;
+ }
+ }
+ spA4 += 4.0f * (16.0f * msgCtx->textCharScale);
+ } else if (curChar == 0xF6) {
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = HS_GET_TOWN_SHOOTING_GALLERY_HIGH_SCORE();
+
+ while (digits[3] >= 1000) {
+ digits[0]++;
+ digits[3] -= 1000;
+ }
+ while (digits[3] >= 100) {
+ digits[1]++;
+ digits[3] -= 100;
+ }
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 4; i++) {
+ if ((i == 3) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Font_LoadCharNES(play, digits[i] + '0', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ spA4 += 16.0f * msgCtx->textCharScale;
+ }
+ }
+ decodedBufPos--;
+ } else if ((curChar == 0xFD) || (curChar == 0xFE) || (curChar == 0xFF)) {
+ for (playerNameLen = 8; playerNameLen > 0; playerNameLen--) {
+ if (gSaveContext.save.saveInfo.inventory
+ .dekuPlaygroundPlayerName[(s16)(curChar - 0xFD)][playerNameLen - 1] != 0x3E) {
+ break;
+ }
+ }
+
+ for (i = 0; i < playerNameLen; i++) {
+ ptr = &font->fontBuf[((void)0, gSaveContext.save.saveInfo.inventory
+ .dekuPlaygroundPlayerName[(s16)(curChar - 0xFD)][i]) *
+ FONT_CHAR_TEX_SIZE];
+ msgCtx->decodedBuffer.schar[decodedBufPos + i] = 0xFD;
+
+ for (var_v1_3 = 0; var_v1_3 < FONT_CHAR_TEX_SIZE; var_v1_3 += 4) {
+ font->charBuf[font->unk_11D88][charTexIdx + var_v1_3 + 0] = ptr[var_v1_3 + 0];
+ font->charBuf[font->unk_11D88][charTexIdx + var_v1_3 + 1] = ptr[var_v1_3 + 1];
+ font->charBuf[font->unk_11D88][charTexIdx + var_v1_3 + 2] = ptr[var_v1_3 + 2];
+ font->charBuf[font->unk_11D88][charTexIdx + var_v1_3 + 3] = ptr[var_v1_3 + 3];
+ }
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ }
+ decodedBufPos += playerNameLen - 1;
+ spA4 += playerNameLen * (16.0f * msgCtx->textCharScale);
+ } else if (curChar == 0xB) {
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = HS_GET_BOAT_ARCHERY_HIGH_SCORE();
+
+ while (digits[3] >= 1000) {
+ digits[0]++;
+ digits[3] -= 1000;
+ }
+ while (digits[3] >= 100) {
+ digits[1]++;
+ digits[3] -= 100;
+ }
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 4; i++) {
+ if ((i == 3) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Font_LoadCharNES(play, digits[i] + '0', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ spA4 += 16.0f * msgCtx->textCharScale;
+ }
+ }
+ decodedBufPos--;
+ } else if (curChar == 0x14) {
+ decodedBufPos--;
+ for (i = 0; i < font->msgBuf.schar[msgCtx->msgBufPos + 1]; i++) {
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = ' ';
+ spA4 += 6.0f;
+ }
+ msgCtx->msgBufPos++;
+ } else if ((curChar == 0x13) || (curChar == 0x11)) {
+ msgCtx->unk11F1A[spC6] = 0;
+ if (msgCtx->unk11F18 != 0) {
+ msgCtx->unk11F1A[spC6] = ((msgCtx->textCharScale * 16.0f * 16.0f) - spA4) * 0.5f;
+ }
+ spC6++;
+ spA4 = 0.0f;
+ if (curChar == 0x11) {
+ spD0++;
+ }
+ } else if ((curChar == 0x17) || (curChar == 0x18) || (curChar == 0x1A)) {
+ // pass
+ } else if (curChar == 0xA) {
+ decodedBufPos++;
+ } else if (curChar == 0x1C) {
+ msgCtx->textFade = true;
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ } else if (curChar == 0x1E) {
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ if (msgCtx->textboxSkipped || (msgCtx->textBoxType == TEXTBOX_TYPE_1) ||
+ (msgCtx->textBoxType == TEXTBOX_TYPE_3) || (msgCtx->textBoxType == TEXTBOX_TYPE_6) ||
+ (msgCtx->textBoxType == TEXTBOX_TYPE_8) || (msgCtx->textBoxType == TEXTBOX_TYPE_9) ||
+ (msgCtx->textBoxType == TEXTBOX_TYPE_B) || (msgCtx->unk11F0C == 3)) {
+ Audio_PlaySfx((msgCtx->decodedBuffer.schar[decodedBufPos - 1] << 8) |
+ msgCtx->decodedBuffer.schar[decodedBufPos]);
+ }
+ } else if (curChar == 0x1F) {
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ } else if ((curChar != 0x20) && (curChar >= 9)) {
+ Font_LoadCharNES(play, curChar, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ spA4 += sNESFontWidths[curChar - ' '] * msgCtx->textCharScale;
+ } else if (curChar == 0x20) {
+ spA4 += 6.0f;
+ }
+ decodedBufPos++;
+ msgCtx->msgBufPos++;
+ }
+}
+#else
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_message_nes/Message_DecodeNES.s")
+#endif
diff --git a/src/code/z_message_staff.c b/src/code/z_message_staff.c
index ab30a3d9c..a093ef5c1 100644
--- a/src/code/z_message_staff.c
+++ b/src/code/z_message_staff.c
@@ -17,12 +17,660 @@ void Message_FindCreditsMessage(PlayState* play, u16 textId) {
nextSegment = msgEntry->segment;
font->messageStart = foundSegment - segment;
font->messageEnd = nextSegment - foundSegment;
- return;
+ break;
}
msgEntry++;
}
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message_staff/func_8015E7EC.s")
+f32 sCreditsFontWidths[144] = {
+ 8.0f, 8.0f, 6.0f, 9.0f, 9.0f, 14.0f, 12.0f, 3.0f, 7.0f, 7.0f, 7.0f, 9.0f, 4.0f, 6.0f, 4.0f, 9.0f,
+ 10.0f, 5.0f, 9.0f, 9.0f, 10.0f, 9.0f, 9.0f, 9.0f, 9.0f, 9.0f, 6.0f, 6.0f, 9.0f, 11.0f, 9.0f, 11.0f,
+ 13.0f, 12.0f, 9.0f, 11.0f, 11.0f, 8.0f, 8.0f, 12.0f, 10.0f, 4.0f, 8.0f, 10.0f, 8.0f, 13.0f, 11.0f, 13.0f,
+ 9.0f, 13.0f, 10.0f, 10.0f, 9.0f, 10.0f, 11.0f, 15.0f, 11.0f, 10.0f, 10.0f, 7.0f, 10.0f, 7.0f, 10.0f, 9.0f,
+ 5.0f, 8.0f, 9.0f, 8.0f, 9.0f, 9.0f, 6.0f, 9.0f, 8.0f, 4.0f, 6.0f, 8.0f, 4.0f, 12.0f, 9.0f, 9.0f,
+ 9.0f, 9.0f, 7.0f, 8.0f, 7.0f, 8.0f, 9.0f, 12.0f, 8.0f, 9.0f, 8.0f, 7.0f, 5.0f, 7.0f, 10.0f, 10.0f,
+ 12.0f, 12.0f, 12.0f, 12.0f, 11.0f, 8.0f, 8.0f, 8.0f, 6.0f, 6.0f, 13.0f, 13.0f, 10.0f, 10.0f, 10.0f, 9.0f,
+ 8.0f, 8.0f, 8.0f, 8.0f, 8.0f, 9.0f, 9.0f, 9.0f, 9.0f, 6.0f, 9.0f, 9.0f, 9.0f, 9.0f, 9.0f, 14.0f,
+ 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message_staff/func_8015F8A8.s")
+#ifdef NON_MATCHING
+// https://decomp.me/scratch/yc8Or
+// v0/v1 swap between `character` and `i`
+void Message_DrawTextCredits(PlayState* play, Gfx** gfxP) {
+ MessageContext* msgCtx = &play->msgCtx;
+ u16 lookAheadCharacter;
+ u16 j;
+ u16 i;
+ u16 sfxHi;
+ char character;
+ u16 charTexIndex;
+ Font* font = &msgCtx->font;
+ Gfx* gfx = *gfxP;
+
+ msgCtx->textPosX = msgCtx->unk11FF8;
+
+ if (!msgCtx->textIsCredits) {
+ msgCtx->textPosY = msgCtx->unk11FFA;
+ } else {
+ msgCtx->textPosY = 48;
+ }
+
+ if (msgCtx->textBoxType == TEXTBOX_TYPE_5) {
+ msgCtx->textColorR = msgCtx->textColorG = msgCtx->textColorB = 0;
+ } else {
+ msgCtx->textColorR = msgCtx->textColorG = msgCtx->textColorB = 255;
+ }
+
+ charTexIndex = 0;
+
+ for (i = 0; i < msgCtx->textDrawPos; i++) {
+ character = msgCtx->decodedBuffer.schar[i];
+
+ switch (character) {
+ case 0x1: // MESSAGE_NEWLINE
+ msgCtx->textPosX = msgCtx->unk11FF8;
+ if ((msgCtx->choiceNum == 1) || (msgCtx->choiceNum == 3)) {
+ msgCtx->textPosX += 32;
+ }
+ if ((msgCtx->choiceNum == 2) && (msgCtx->textPosY != msgCtx->unk11FFA)) {
+ msgCtx->textPosX += 32;
+ }
+ msgCtx->textPosY += msgCtx->unk11FFC;
+ break;
+
+ case 0x5: // Remnant of MESSAGE_COLOR
+ break;
+
+ case ' ':
+ msgCtx->textPosX += 6;
+ break;
+
+ case 0x4: // MESSAGE_BOX_BREAK
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ if (!msgCtx->textboxSkipped) {
+ Audio_PlaySfx(NA_SE_NONE);
+ msgCtx->msgMode = MSGMODE_TEXT_AWAIT_NEXT;
+ Font_LoadMessageBoxEndIcon(font, 0);
+ } else {
+ msgCtx->msgMode = MSGMODE_TEXT_NEXT_MSG;
+ msgCtx->textUnskippable = false;
+ msgCtx->msgBufPos++;
+ }
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x6: // MESSAGE_SHIFT
+ msgCtx->textPosX += msgCtx->decodedBuffer.schar[++i];
+ break;
+
+ case 0x7: // MESSAGE_TEXTID
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_20;
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Audio_PlaySfx(NA_SE_NONE);
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ Font_LoadMessageBoxEndIcon(font, 0);
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x8: // MESSAGE_QUICKTEXT_ENABLE
+ if (((i + 1) == msgCtx->textDrawPos) &&
+ ((msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) ||
+ ((msgCtx->msgMode >= MSGMODE_OCARINA_STARTING) && (msgCtx->msgMode <= MSGMODE_26)))) {
+ j = i;
+ while (true) {
+ lookAheadCharacter = msgCtx->decodedBuffer.schar[j];
+ if (lookAheadCharacter == 6) {
+ j += 2;
+ continue;
+ }
+ if ((lookAheadCharacter != 9) && (lookAheadCharacter != 0xA) && (lookAheadCharacter != 0xB) &&
+ (lookAheadCharacter != 0xC) && (lookAheadCharacter != 0xD) && (lookAheadCharacter != 4) &&
+ (lookAheadCharacter != 2)) {
+ j++;
+ continue;
+ }
+ break;
+ }
+ i = j - 1;
+ msgCtx->textDrawPos = i + 1;
+ }
+ // fallthrough
+ case 0x9: // MESSAGE_QUICKTEXT_DISABLE
+ break;
+
+ case 0xD: // MESSAGE_AWAIT_BUTTON_PRESS
+ if ((i + 1) == msgCtx->textDrawPos) {
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_AWAIT_INPUT;
+ Font_LoadMessageBoxEndIcon(font, 0);
+ }
+ *gfxP = gfx;
+ return;
+ }
+ break;
+
+ case 0xC: // MESSAGE_BOX_BREAK_DELAYED
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->stateTimer = msgCtx->decodedBuffer.schar[++i];
+ msgCtx->msgMode = MSGMODE_TEXT_DELAYED_BREAK;
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x11: // MESSAGE_FADE2
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_50;
+ msgCtx->stateTimer = msgCtx->decodedBuffer.schar[++i] << 8;
+ msgCtx->stateTimer |= msgCtx->decodedBuffer.schar[++i];
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x12: // MESSAGE_SFX
+ if ((msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) && !msgCtx->messageHasSetSfx) {
+ msgCtx->messageHasSetSfx = true;
+ sfxHi = msgCtx->decodedBuffer.schar[i + 1];
+ sfxHi = sfxHi << 8;
+ Audio_PlaySfx(sfxHi | msgCtx->decodedBuffer.schar[i + 2]);
+ }
+ i += 2;
+ break;
+
+ case 0x13: // remnant of MESSAGE_ITEM_ICON
+ break;
+
+ case 0x15: // MESSAGE_BACKGROUND
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Audio_PlaySfx(NA_SE_NONE);
+ }
+ gDPPipeSync(gfx++);
+ gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, msgCtx->textColorAlpha);
+
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_I, 96, 48, 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(gfx++, (msgCtx->textPosX + 1) << 2, (msgCtx->unk12012 + 1) << 2,
+ (msgCtx->textPosX + 0x61) << 2, (msgCtx->unk12012 + 0x31) << 2, G_TX_RENDERTILE, 0,
+ 0, 1 << 10, 1 << 10);
+
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1900, G_IM_FMT_I, 96, 48, 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(gfx++, (msgCtx->textPosX + 0x61) << 2, (msgCtx->unk12012 + 1) << 2,
+ (msgCtx->textPosX + 0xC2) << 2, (msgCtx->unk12012 + 0x31) << 2, 0, 0, 0, 1 << 10,
+ 1 << 10);
+
+ gDPPipeSync(gfx++);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 60, 0, msgCtx->textColorAlpha);
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_I, 96, 48, 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(gfx++, msgCtx->textPosX << 2, msgCtx->unk12012 << 2, (msgCtx->textPosX + 0x60) << 2,
+ (msgCtx->unk12012 + 0x30) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1900, G_IM_FMT_I, 96, 48, 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(gfx++, (msgCtx->textPosX + 0x60) << 2, msgCtx->unk12012 << 2,
+ (msgCtx->textPosX + 0xC0) << 2, (msgCtx->unk12012 + 0x30) << 2, G_TX_RENDERTILE, 0,
+ 0, 1 << 10, 1 << 10);
+ gDPPipeSync(gfx++);
+ gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0,
+ PRIMITIVE, 0);
+ msgCtx->textPosX += 0x20;
+ break;
+
+ case 0x14: // MESSAGE_TEXT_SPEED
+ msgCtx->textDelay = msgCtx->decodedBuffer.schar[++i];
+ break;
+
+ case 0x1A: // MESSAGE_UNSKIPPABLE
+ msgCtx->textUnskippable = true;
+ break;
+
+ case 0x1B: // MESSAGE_TWO_CHOICE
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_10;
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->choiceTextId = msgCtx->currentTextId;
+ msgCtx->stateTimer = 4;
+ msgCtx->choiceIndex = 0;
+ Font_LoadMessageBoxEndIcon(font, 2);
+ }
+ break;
+
+ case 0x1C: // MESSAGE_THREE_CHOICE
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_11;
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->choiceTextId = msgCtx->currentTextId;
+ msgCtx->stateTimer = 4;
+ msgCtx->choiceIndex = 0;
+ Font_LoadMessageBoxEndIcon(font, 2);
+ }
+ break;
+
+ case 0x2: // MESSAGE_END
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_00) {
+ Audio_PlaySfx(NA_SE_SY_MESSAGE_END);
+ Font_LoadMessageBoxEndIcon(font, 1);
+ if (play->csCtx.state == CS_STATE_IDLE) {
+ func_8011552C(play, DO_ACTION_RETURN);
+ }
+ }
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x10: // MESSAGE_OCARINA
+ if ((i + 1) == msgCtx->textDrawPos) {
+ Message_HandleOcarina(play);
+ *gfxP = gfx;
+ return;
+ }
+ break;
+
+ case 0xE: // MESSAGE_FADE
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_50;
+ msgCtx->stateTimer = msgCtx->decodedBuffer.schar[++i];
+ Font_LoadMessageBoxEndIcon(font, 1);
+ if (play->csCtx.state == CS_STATE_IDLE) {
+ func_8011552C(play, DO_ACTION_RETURN);
+ }
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0xA: // MESSAGE_PERSISTENT
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Audio_PlaySfx(NA_SE_NONE);
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_30;
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0xB: // MESSAGE_EVENT
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_40;
+ Font_LoadMessageBoxEndIcon(font, 0);
+ Audio_PlaySfx(NA_SE_SY_MESSAGE_END);
+ }
+ *gfxP = gfx;
+ return;
+
+ default:
+ if ((msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) && ((i + 1) == msgCtx->textDrawPos) &&
+ (msgCtx->textDelayTimer == msgCtx->textDelay)) {
+ Audio_PlaySfx(NA_SE_NONE);
+ }
+ Message_DrawTextChar(play, &font->charBuf[font->unk_11D88][charTexIndex], &gfx);
+ charTexIndex += FONT_CHAR_TEX_SIZE;
+
+ msgCtx->textPosX += (s32)(sCreditsFontWidths[character - ' '] * msgCtx->textCharScale);
+ break;
+ }
+ }
+
+ if (msgCtx->textDelayTimer == 0) {
+ msgCtx->textDrawPos = i + 1;
+ msgCtx->textDelayTimer = msgCtx->textDelay;
+ } else {
+ msgCtx->textDelayTimer--;
+ }
+
+ *gfxP = gfx;
+}
+#else
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_message_staff/Message_DrawTextCredits.s")
+#endif
+
+void Message_DecodeCredits(PlayState* play) {
+ u16 curChar;
+ s16 loadChar;
+ s16 i;
+ s16 playerNameLen;
+ s16 decodedBufPos = 0;
+ s16 charOffset;
+ f32 timeInSeconds;
+ s16 numLines = 0;
+ s16 value;
+ s16 digits[4];
+ s32 charTexIdx = 0;
+ MessageContext* msgCtx = &play->msgCtx;
+ Font* font = &play->msgCtx.font;
+
+ msgCtx->nextTextId = 0xFFFF;
+
+ while (true) {
+ curChar = font->msgBuf.schar[msgCtx->msgBufPos];
+ msgCtx->decodedBuffer.schar[decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos];
+
+ if ((curChar == 4) || (curChar == 7) || (curChar == 0xC) || (curChar == 0xB) || (curChar == 2)) {
+ // Textbox decoding ends with any of the above text control characters
+ msgCtx->msgMode = MSGMODE_TEXT_DISPLAYING;
+ msgCtx->textDrawPos = 1;
+ msgCtx->unk11FFA = msgCtx->textboxY + 8;
+
+ if (msgCtx->textBoxType != TEXTBOX_TYPE_4) {
+ if (numLines == 0) {
+ msgCtx->unk11FFA = msgCtx->textboxY + 26;
+ } else if (numLines == 1) {
+ msgCtx->unk11FFA = msgCtx->textboxY + 20;
+ } else if (numLines == 2) {
+ msgCtx->unk11FFA = msgCtx->textboxY + 16;
+ }
+ }
+
+ if (curChar == 7) {
+ value = font->msgBuf.schar[msgCtx->msgBufPos + 1];
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 1];
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 2];
+ value <<= 8;
+ msgCtx->nextTextId = msgCtx->decodedBuffer.schar[decodedBufPos] | value;
+ }
+
+ if (curChar == 0xC) {
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 1];
+ msgCtx->msgBufPos += 2;
+ }
+
+ msgCtx->decodedTextLen = decodedBufPos;
+
+ if (msgCtx->textboxSkipped) {
+ msgCtx->textDrawPos = msgCtx->decodedTextLen;
+ }
+ break;
+ } else if (curChar == 0xF) {
+ // Substitute the player name control character for the file's player name.
+ for (playerNameLen = ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); playerNameLen > 0;
+ playerNameLen--) {
+ if (gSaveContext.save.saveInfo.playerData.playerName[playerNameLen - 1] != 0x3E) {
+ break;
+ }
+ }
+
+ for (i = 0; i < playerNameLen; i++) {
+ curChar = gSaveContext.save.saveInfo.playerData.playerName[i];
+ if (curChar == 62) {
+ curChar = ' ';
+ } else if (curChar == 64) {
+ curChar = '.';
+ } else if (curChar == 63) {
+ curChar = '-';
+ } else if (curChar < 10) {
+ charOffset = curChar;
+ curChar = '0' + charOffset;
+ } else if (curChar < 36) {
+ charOffset = curChar;
+ curChar = 'A' - 10 + charOffset;
+ } else if (curChar < 62) {
+ charOffset = curChar;
+ curChar = 'a' - 36 + charOffset;
+ }
+
+ if (curChar != ' ') {
+ Font_LoadCharNES(play, curChar - ' ', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ }
+ msgCtx->decodedBuffer.schar[decodedBufPos] = curChar;
+ decodedBufPos++;
+ }
+ decodedBufPos--;
+ } else if ((curChar == 0x16) || (curChar == 0x17)) {
+ digits[0] = digits[1] = digits[2] = 0;
+ if (curChar == 0x17) {
+ digits[3] = gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2];
+ } else {
+ digits[3] = gSaveContext.timerCurTimes[TIMER_ID_GORON_RACE_UNUSED];
+ }
+
+ while (digits[3] >= 60) {
+ digits[1]++;
+ if (digits[1] >= 10) {
+ digits[0]++;
+ digits[1] -= 10;
+ }
+ digits[3] -= 60;
+ }
+
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ for (i = 0; i < 4; i++) {
+ Font_LoadCharNES(play, digits[i] + '0' - ' ', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ if (i == 1) {
+ Font_LoadCharNES(play, '"' - ' ', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = '"';
+ decodedBufPos++;
+ } else if (i == 3) {
+ Font_LoadCharNES(play, '"' - ' ', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = '"';
+ }
+ }
+
+ } else if (curChar == 0x18) {
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = gSaveContext.minigameScore;
+
+ while (digits[3] >= 1000) {
+ digits[0]++;
+ digits[3] -= 1000;
+ }
+ while (digits[3] >= 100) {
+ digits[1]++;
+ digits[3] -= 100;
+ }
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 4; i++) {
+ if ((i == 3) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Font_LoadCharNES(play, digits[i] + '0' - ' ', charTexIdx);
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ decodedBufPos++;
+ }
+ }
+ decodedBufPos--;
+ } else if (curChar != 0x19) {
+ if (curChar == 0x1D) {
+ digits[0] = 0;
+ digits[1] = gSaveContext.minigameScore;
+
+ while (digits[1] >= 10) {
+ digits[0]++;
+ digits[1] -= 10;
+ }
+
+ for (i = 0; i < 2; i++) {
+ if ((i == 1) || (digits[i] != 0)) {
+ Font_LoadCharNES(play, digits[i] + '0' - ' ', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ }
+ }
+ decodedBufPos--;
+ } else if (curChar == 0x1E) {
+ value = HIGH_SCORE((u8)font->msgBuf.schar[++msgCtx->msgBufPos]);
+ if ((font->msgBuf.schar[msgCtx->msgBufPos] & 0xFF) == HS_FISHING) {
+ if (LINK_AGE_IN_YEARS == YEARS_CHILD) {
+ value &= 0x7F;
+ } else {
+ value =
+ (s16)((HIGH_SCORE((u8)font->msgBuf.schar[msgCtx->msgBufPos]) & 0xFF000000) >> 0x18) & 0x7F;
+ }
+ value = SQ((f32)value) * 0.0036f + 0.5f;
+ }
+ switch (font->msgBuf.schar[msgCtx->msgBufPos] & 0xFF) {
+ case 0:
+ case 1:
+ case 2:
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = value;
+
+ while (digits[3] >= 1000) {
+ digits[0]++;
+ digits[3] -= 1000;
+ }
+ while (digits[3] >= 100) {
+ digits[1]++;
+ digits[3] -= 100;
+ }
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 4; i++) {
+ if ((i == 3) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Font_LoadCharNES(play, digits[i] + '0' - ' ', charTexIdx);
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ decodedBufPos++;
+ }
+ }
+ decodedBufPos--;
+ break;
+
+ case 3:
+ case 4:
+ case 6:
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = value;
+
+ while (digits[3] >= 60) {
+ digits[1]++;
+ if (digits[1] >= 10) {
+ digits[0]++;
+ digits[1] -= 10;
+ }
+ digits[3] -= 60;
+ }
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ for (i = 0; i < 4; i++) {
+ Font_LoadCharNES(play, digits[i] + '0' - ' ', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ if (i == 1) {
+ Font_LoadCharNES(play, '"' - ' ', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = '"';
+ decodedBufPos++;
+ } else if (i == 3) {
+ Font_LoadCharNES(play, '"' - ' ', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = '"';
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+ } else if (curChar == 0x1F) {
+ digits[0] = 0;
+ timeInSeconds = TIME_TO_MINUTES_F(gSaveContext.save.time);
+
+ digits[1] = timeInSeconds / 60.0f;
+ while (digits[1] >= 10) {
+ digits[0]++;
+ digits[1] -= 10;
+ }
+
+ digits[2] = 0;
+ digits[3] = (s32)timeInSeconds % 60;
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ for (i = 0; i < 4; i++) {
+ Font_LoadCharNES(play, digits[i] + '0' - ' ', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ if (i == 1) {
+ Font_LoadCharNES(play, ':' - ' ', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = ':';
+ decodedBufPos++;
+ }
+ }
+
+ decodedBufPos--;
+ } else if (curChar == 0x13) {
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 1];
+ Message_LoadItemIcon(play, font->msgBuf.schar[msgCtx->msgBufPos + 1], msgCtx->textboxY + 10);
+ } else if (curChar == 0x15) {
+ DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1000,
+ (uintptr_t)SEGMENT_ROM_START(message_texture_static) + 0x900, 0x900);
+ DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1900,
+ (uintptr_t)SEGMENT_ROM_START(message_texture_static) + 0x900, 0x900);
+ msgCtx->msgBufPos += 3;
+ msgCtx->unk12012 = msgCtx->textboxY + 8;
+ numLines = 2;
+ } else if (curChar == 5) {
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ } else if (curChar == 1) {
+ numLines++;
+ } else if ((curChar != 8) && (curChar != 9) && (curChar != 0xD) && (curChar != 0x10) && (curChar != 0xA) &&
+ (curChar != 0x1A)) {
+ if (curChar == 0xE) {
+ msgCtx->textFade = true;
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ } else if (curChar == 0x11) {
+ msgCtx->textFade = true;
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ } else if ((curChar == 6) || (curChar == 0x14)) {
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos] & 0xFF;
+ } else if (curChar == 0x12) {
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ } else if (curChar == 0x1B) {
+ msgCtx->choiceNum = 2;
+ } else if (curChar == 0x1C) {
+ msgCtx->choiceNum = 3;
+ } else if (curChar != ' ') {
+ Font_LoadCharNES(play, curChar, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ }
+ }
+ }
+
+ decodedBufPos++;
+ msgCtx->msgBufPos++;
+ }
+}
diff --git a/src/code/z_message_tables.inc.c b/src/code/z_message_tables.inc.c
new file mode 100644
index 000000000..fb60e7a14
--- /dev/null
+++ b/src/code/z_message_tables.inc.c
@@ -0,0 +1,1172 @@
+#include "include/message_data_static.h"
+#include "PR/mbi.h"
+
+MessageTableEntry D_801C6B98[4590] = {
+ { 0, 0, 0x08000000 }, { 2, 0, 0x0800000C }, { 4, 0, 0x08000064 }, { 5, 0, 0x080000B8 },
+ { 6, 0, 0x08000110 }, { 7, 0, 0x08000168 }, { 8, 0, 0x080001C4 }, { 9, 0, 0x08000248 },
+ { 0xA, 0, 0x080002A8 }, { 0xB, 0, 0x08000310 }, { 0xC, 0, 0x0800031C }, { 0xD, 0, 0x080003E8 },
+ { 0xE, 0, 0x08000474 }, { 0xF, 0, 0x080004BC }, { 0x10, 0, 0x08000504 }, { 0x11, 0, 0x08000510 },
+ { 0x12, 0, 0x08000554 }, { 0x13, 0, 0x08000560 }, { 0x14, 0, 0x0800056C }, { 0x15, 0, 0x08000604 },
+ { 0x16, 0, 0x080006A0 }, { 0x17, 0, 0x0800073C }, { 0x18, 0, 0x080007D8 }, { 0x19, 0, 0x08000874 },
+ { 0x1A, 0, 0x08000940 }, { 0x1B, 0, 0x080009E8 }, { 0x1C, 0, 0x08000A84 }, { 0x1D, 0, 0x08000AD4 },
+ { 0x1E, 0, 0x08000B28 }, { 0x1F, 0, 0x08000B58 }, { 0x20, 0, 0x08000B88 }, { 0x21, 0, 0x08000BB8 },
+ { 0x22, 0, 0x08000BE8 }, { 0x23, 0, 0x08000C78 }, { 0x24, 0, 0x08000CD0 }, { 0x25, 0, 0x08000D30 },
+ { 0x26, 0, 0x08000DA4 }, { 0x27, 0, 0x08000E38 }, { 0x28, 0, 0x08000EB4 }, { 0x29, 0, 0x08000F88 },
+ { 0x2A, 0, 0x08001060 }, { 0x2B, 0, 0x0800113C }, { 0x2C, 0, 0x08001148 }, { 0x2D, 0, 0x08001154 },
+ { 0x2E, 0, 0x08001160 }, { 0x2F, 0, 0x08001210 }, { 0x30, 0, 0x0800121C }, { 0x31, 0, 0x08001228 },
+ { 0x32, 0, 0x08001234 }, { 0x33, 0, 0x080012D4 }, { 0x34, 0, 0x0800139C }, { 0x35, 0, 0x08001428 },
+ { 0x36, 0, 0x080014B0 }, { 0x37, 0, 0x08001554 }, { 0x38, 0, 0x08001560 }, { 0x39, 0, 0x08001624 },
+ { 0x3A, 0, 0x080016B8 }, { 0x3B, 0, 0x08001768 }, { 0x3C, 0, 0x08001814 }, { 0x3D, 0, 0x08001884 },
+ { 0x3E, 0, 0x080018E0 }, { 0x3F, 0, 0x080019DC }, { 0x40, 0, 0x08001A48 }, { 0x41, 0, 0x08001A54 },
+ { 0x42, 0, 0x08001B0C }, { 0x43, 0, 0x08001BF4 }, { 0x4C, 0, 0x08001CBC }, { 0x4D, 0, 0x08001DBC },
+ { 0x4E, 0, 0x08001DC8 }, { 0x50, 0, 0x08001DD4 }, { 0x51, 0, 0x08001EA4 }, { 0x52, 0, 0x08001EB0 },
+ { 0x53, 0, 0x08001EFC }, { 0x54, 0, 0x08001F08 }, { 0x55, 0, 0x08001F14 }, { 0x56, 0, 0x08001FB8 },
+ { 0x57, 0, 0x08002058 }, { 0x58, 0, 0x080020F8 }, { 0x59, 0, 0x080021A0 }, { 0x5A, 0, 0x08002290 },
+ { 0x5B, 0, 0x080022E4 }, { 0x5C, 0, 0x08002388 }, { 0x5D, 0, 0x08002434 }, { 0x5E, 0, 0x080024E8 },
+ { 0x5F, 0, 0x08002590 }, { 0x60, 0, 0x0800261C }, { 0x61, 0, 0x080026F0 }, { 0x62, 0, 0x080026FC },
+ { 0x63, 0, 0x08002760 }, { 0x64, 0, 0x080027CC }, { 0x65, 0, 0x080027D8 }, { 0x66, 0, 0x0800282C },
+ { 0x67, 0, 0x08002884 }, { 0x68, 0, 0x080028EC }, { 0x69, 0, 0x08002950 }, { 0x6A, 0, 0x080029CC },
+ { 0x6B, 0, 0x08002A24 }, { 0x6E, 0, 0x08002A7C }, { 0x6F, 0, 0x08002A88 }, { 0x70, 0, 0x08002B54 },
+ { 0x71, 0, 0x08002B60 }, { 0x72, 0, 0x08002B6C }, { 0x73, 0, 0x08002B78 }, { 0x74, 0, 0x08002B84 },
+ { 0x75, 0, 0x08002B90 }, { 0x76, 0, 0x08002B9C }, { 0x77, 0, 0x08002BA8 }, { 0x78, 0, 0x08002BB4 },
+ { 0x79, 0, 0x08002C98 }, { 0x7A, 0, 0x08002D54 }, { 0x7B, 0, 0x08002E14 }, { 0x7C, 0, 0x08002E90 },
+ { 0x7D, 0, 0x08002F20 }, { 0x7E, 0, 0x08002F9C }, { 0x7F, 0, 0x0800302C }, { 0x80, 0, 0x0800309C },
+ { 0x81, 0, 0x08003144 }, { 0x82, 0, 0x080031B0 }, { 0x83, 0, 0x08003224 }, { 0x84, 0, 0x08003298 },
+ { 0x85, 0, 0x08003324 }, { 0x86, 0, 0x08003370 }, { 0x87, 0, 0x08003444 }, { 0x88, 0, 0x080034F8 },
+ { 0x89, 0, 0x08003560 }, { 0x8A, 0, 0x080035F4 }, { 0x8B, 0, 0x080036B8 }, { 0x8C, 0, 0x08003710 },
+ { 0x8D, 0, 0x080037A0 }, { 0x8E, 0, 0x08003828 }, { 0x8F, 0, 0x080038E0 }, { 0x91, 0, 0x0800396C },
+ { 0x92, 0, 0x08003A44 }, { 0x93, 0, 0x08003B08 }, { 0x94, 0, 0x08003B60 }, { 0x95, 0, 0x08003B6C },
+ { 0x96, 0, 0x08003BC0 }, { 0x97, 0, 0x08003C1C }, { 0x98, 0, 0x08003C60 }, { 0x99, 0, 0x08003CA8 },
+ { 0x9A, 0, 0x08003CF4 }, { 0x9B, 0, 0x08003D40 }, { 0x9C, 0, 0x08003DE0 }, { 0x9D, 0, 0x08003E78 },
+ { 0x9E, 0, 0x08003F10 }, { 0x9F, 0, 0x08003FA8 }, { 0xA0, 0, 0x08003FB4 }, { 0xA1, 0, 0x0800401C },
+ { 0xA2, 0, 0x08004088 }, { 0xA3, 0, 0x08004094 }, { 0xA4, 0, 0x080040A0 }, { 0xA9, 0, 0x080040AC },
+ { 0xAA, 0, 0x08004130 }, { 0xAB, 0, 0x08004198 }, { 0xAC, 0, 0x08004240 }, { 0xAD, 0, 0x0800424C },
+ { 0xAE, 0, 0x08004258 }, { 0xAF, 0, 0x08004264 }, { 0xB0, 0, 0x08004270 }, { 0xB1, 0, 0x0800427C },
+ { 0xB2, 0, 0x08004288 }, { 0xB4, 0, 0x08004294 }, { 0xB5, 0, 0x08004354 }, { 0xB6, 0, 0x08004418 },
+ { 0xB7, 0, 0x080044E0 }, { 0xB8, 0, 0x080045A8 }, { 0xB9, 0, 0x08004670 }, { 0xBA, 0, 0x08004738 },
+ { 0xBB, 0, 0x08004744 }, { 0xBC, 0, 0x08004750 }, { 0xBD, 0, 0x0800475C }, { 0xBE, 0, 0x08004768 },
+ { 0xBF, 0, 0x08004774 }, { 0xC0, 0, 0x08004780 }, { 0xC4, 0, 0x0800478C }, { 0xC5, 0, 0x080047D0 },
+ { 0xC6, 0, 0x08004850 }, { 0xC7, 0, 0x080048D0 }, { 0xC8, 0, 0x08004954 }, { 0xC9, 0, 0x08004A5C },
+ { 0xCA, 0, 0x08004AFC }, { 0xCB, 0, 0x08004C14 }, { 0xCC, 0, 0x08004C78 }, { 0xCD, 0, 0x08004CDC },
+ { 0xF2, 0, 0x08004D8C }, { 0xF3, 0, 0x08004DC8 }, { 0xF4, 0, 0x08004E3C }, { 0xF5, 0, 0x08004E8C },
+ { 0xF6, 0, 0x08004EDC }, { 0xF7, 0, 0x08004F30 }, { 0xF8, 0, 0x08004F70 }, { 0xF9, 0, 0x08004F9C },
+ { 0xFA, 0, 0x08005034 }, { 0xFB, 0, 0x08005088 }, { 0xFC, 0, 0x080050FC }, { 0xFD, 0, 0x0800515C },
+ { 0xFE, 0, 0x08005184 }, { 0xFF, 0, 0x080051B8 }, { 0x100, 0, 0x08005214 }, { 0x101, 0, 0x08005230 },
+ { 0x102, 0, 0x0800524C }, { 0x103, 0, 0x08005268 }, { 0x104, 0, 0x08005284 }, { 0x105, 0, 0x080052A0 },
+ { 0x106, 0, 0x080052B8 }, { 0x107, 0, 0x080052D4 }, { 0x108, 0, 0x080052F8 }, { 0x109, 0, 0x0800531C },
+ { 0x10A, 0, 0x0800533C }, { 0x10B, 0, 0x08005358 }, { 0x10C, 0, 0x0800537C }, { 0x10D, 0, 0x08005390 },
+ { 0x10E, 0, 0x080053A8 }, { 0x10F, 0, 0x080053C4 }, { 0x110, 0, 0x080053DC }, { 0x111, 0, 0x080053FC },
+ { 0x112, 0, 0x08005414 }, { 0x113, 0, 0x0800542C }, { 0x114, 0, 0x08005450 }, { 0x115, 0, 0x08005470 },
+ { 0x116, 0, 0x0800548C }, { 0x117, 0, 0x080054A8 }, { 0x118, 0, 0x080054BC }, { 0x119, 0, 0x080054D4 },
+ { 0x11A, 0, 0x080054F4 }, { 0x11B, 0, 0x08005518 }, { 0x11C, 0, 0x0800553C }, { 0x11D, 0, 0x0800555C },
+ { 0x11E, 0, 0x08005578 }, { 0x11F, 0, 0x08005598 }, { 0x120, 0, 0x080055B4 }, { 0x121, 0, 0x080055CC },
+ { 0x122, 0, 0x080055E8 }, { 0x123, 0, 0x08005604 }, { 0x124, 0, 0x08005620 }, { 0x125, 0, 0x08005638 },
+ { 0x126, 0, 0x0800564C }, { 0x127, 0, 0x08005668 }, { 0x129, 0, 0x08005684 }, { 0x12A, 0, 0x0800569C },
+ { 0x12B, 0, 0x080056B8 }, { 0x12C, 0, 0x080056D4 }, { 0x12D, 0, 0x080056F0 }, { 0x12E, 0, 0x0800570C },
+ { 0x12F, 0, 0x08005724 }, { 0x130, 0, 0x0800573C }, { 0x131, 0, 0x08005758 }, { 0x132, 0, 0x08005770 },
+ { 0x134, 0, 0x08005788 }, { 0x135, 0, 0x080057A4 }, { 0x136, 0, 0x080057C0 }, { 0x137, 0, 0x080057D8 },
+ { 0x138, 0, 0x080057F4 }, { 0x139, 0, 0x08005814 }, { 0x13A, 0, 0x0800582C }, { 0x13B, 0, 0x0800584C },
+ { 0x13D, 0, 0x08005868 }, { 0x13E, 0, 0x08005884 }, { 0x13F, 0, 0x080058A0 }, { 0x140, 0, 0x080058C4 },
+ { 0x141, 0, 0x080058DC }, { 0x142, 0, 0x080058F4 }, { 0x143, 0, 0x08005918 }, { 0x144, 0, 0x08005934 },
+ { 0x145, 0, 0x08005954 }, { 0x146, 0, 0x08005970 }, { 0x147, 0, 0x08005988 }, { 0x148, 0, 0x080059A4 },
+ { 0x149, 0, 0x080059C0 }, { 0x200, 0, 0x080059D8 }, { 0x201, 0, 0x08005A54 }, { 0x202, 0, 0x08005B48 },
+ { 0x203, 0, 0x08005B74 }, { 0x204, 0, 0x08005BE4 }, { 0x205, 0, 0x08005C38 }, { 0x206, 0, 0x08005C94 },
+ { 0x207, 0, 0x08005D04 }, { 0x208, 0, 0x08005D2C }, { 0x209, 0, 0x08005D64 }, { 0x20A, 0, 0x08005DB4 },
+ { 0x20B, 0, 0x08005E08 }, { 0x20C, 0, 0x08005E14 }, { 0x20D, 0, 0x08005E60 }, { 0x20E, 0, 0x08005ECC },
+ { 0x20F, 0, 0x08005ED8 }, { 0x210, 0, 0x08005F74 }, { 0x211, 0, 0x08005FAC }, { 0x212, 0, 0x08005FD4 },
+ { 0x213, 0, 0x0800602C }, { 0x214, 0, 0x08006050 }, { 0x215, 0, 0x08006124 }, { 0x216, 0, 0x08006358 },
+ { 0x217, 0, 0x080065B8 }, { 0x218, 0, 0x08006620 }, { 0x219, 0, 0x0800668C }, { 0x21A, 0, 0x08006720 },
+ { 0x21B, 0, 0x0800674C }, { 0x21D, 0, 0x08006774 }, { 0x21E, 0, 0x080067CC }, { 0x21F, 0, 0x08006874 },
+ { 0x220, 0, 0x080068E0 }, { 0x221, 0, 0x08006978 }, { 0x222, 0, 0x08006A04 }, { 0x223, 0, 0x08006A48 },
+ { 0x224, 0, 0x08006AE8 }, { 0x225, 0, 0x08006B54 }, { 0x226, 0, 0x08006BB0 }, { 0x227, 0, 0x08006BE8 },
+ { 0x228, 0, 0x08006D58 }, { 0x229, 0, 0x08006E18 }, { 0x22A, 0, 0x08006EA0 }, { 0x22B, 0, 0x08006F00 },
+ { 0x22C, 0, 0x08006F44 }, { 0x22D, 0, 0x08006F60 }, { 0x22E, 0, 0x08006FB0 }, { 0x22F, 0, 0x08006FC8 },
+ { 0x230, 0, 0x08007010 }, { 0x231, 0, 0x080070C0 }, { 0x232, 0, 0x08007110 }, { 0x233, 0, 0x08007158 },
+ { 0x234, 0, 0x080071A4 }, { 0x235, 0, 0x08007208 }, { 0x236, 0, 0x0800725C }, { 0x237, 0, 0x080072AC },
+ { 0x238, 0, 0x0800730C }, { 0x239, 0, 0x0800734C }, { 0x23A, 0, 0x08007400 }, { 0x23B, 0, 0x08007468 },
+ { 0x23C, 0, 0x08007500 }, { 0x23D, 0, 0x08007538 }, { 0x23E, 0, 0x080075E4 }, { 0x23F, 0, 0x080075F0 },
+ { 0x240, 0, 0x0800765C }, { 0x241, 0, 0x080076D0 }, { 0x242, 0, 0x08007744 }, { 0x243, 0, 0x080077B0 },
+ { 0x244, 0, 0x08007830 }, { 0x245, 0, 0x08007888 }, { 0x246, 0, 0x080078B4 }, { 0x247, 0, 0x08007904 },
+ { 0x248, 0, 0x08007950 }, { 0x249, 0, 0x080079A0 }, { 0x24A, 0, 0x080079F0 }, { 0x24B, 0, 0x08007A30 },
+ { 0x24C, 0, 0x08007A78 }, { 0x24D, 0, 0x08007AD8 }, { 0x24E, 0, 0x08007B54 }, { 0x24F, 0, 0x08007BE8 },
+ { 0x250, 0, 0x08007C88 }, { 0x251, 0, 0x08007CEC }, { 0x252, 0, 0x08007D18 }, { 0x253, 0, 0x08007D68 },
+ { 0x254, 0, 0x08007DAC }, { 0x255, 0, 0x08007E04 }, { 0x256, 0, 0x08007E4C }, { 0x257, 0, 0x08007EA4 },
+ { 0x258, 0, 0x08007F00 }, { 0x25A, 0, 0x08007F58 }, { 0x25B, 0, 0x08007FA0 }, { 0x25C, 0, 0x08007FDC },
+ { 0x25D, 0, 0x08007FF8 }, { 0x25E, 0, 0x08008024 }, { 0x25F, 0, 0x080080E4 }, { 0x260, 0, 0x0800818C },
+ { 0x261, 0, 0x080081F8 }, { 0x262, 0, 0x08008288 }, { 0x263, 0, 0x08008304 }, { 0x264, 0, 0x08008344 },
+ { 0x265, 0, 0x08008420 }, { 0x302, 0, 0x08008498 }, { 0x303, 0, 0x080085DC }, { 0x304, 0, 0x08008660 },
+ { 0x305, 0, 0x080086B4 }, { 0x306, 0, 0x08008720 }, { 0x307, 0, 0x0800872C }, { 0x308, 0, 0x0800875C },
+ { 0x309, 0, 0x08008788 }, { 0x30A, 0, 0x080087BC }, { 0x30B, 0, 0x080087E8 }, { 0x30C, 0, 0x08008824 },
+ { 0x30D, 0, 0x08008894 }, { 0x30E, 0, 0x080088E4 }, { 0x30F, 0, 0x08008914 }, { 0x310, 0, 0x08008970 },
+ { 0x311, 0, 0x080089BC }, { 0x312, 0, 0x080089F0 }, { 0x313, 0, 0x08008A64 }, { 0x314, 0, 0x08008AA4 },
+ { 0x315, 0, 0x08008B0C }, { 0x316, 0, 0x08008B64 }, { 0x317, 0, 0x08008BA4 }, { 0x318, 0, 0x08008BF0 },
+ { 0x319, 0, 0x08008C48 }, { 0x31A, 0, 0x08008C84 }, { 0x31B, 0, 0x08008CD0 }, { 0x31C, 0, 0x08008D10 },
+ { 0x31D, 0, 0x08008D5C }, { 0x31E, 0, 0x08008DCC }, { 0x31F, 0, 0x08008E2C }, { 0x320, 0, 0x08008EBC },
+ { 0x321, 0, 0x08008F30 }, { 0x322, 0, 0x08008F60 }, { 0x323, 0, 0x08008F9C }, { 0x324, 0, 0x08008FFC },
+ { 0x325, 0, 0x08009044 }, { 0x326, 0, 0x080090A8 }, { 0x327, 0, 0x080090F8 }, { 0x328, 0, 0x08009140 },
+ { 0x329, 0, 0x08009188 }, { 0x32A, 0, 0x080091F0 }, { 0x32B, 0, 0x08009240 }, { 0x32C, 0, 0x0800928C },
+ { 0x32D, 0, 0x080092F0 }, { 0x32E, 0, 0x08009318 }, { 0x32F, 0, 0x08009358 }, { 0x330, 0, 0x0800939C },
+ { 0x331, 0, 0x080093E4 }, { 0x332, 0, 0x08009440 }, { 0x333, 0, 0x0800949C }, { 0x334, 0, 0x08009518 },
+ { 0x335, 0, 0x0800955C }, { 0x336, 0, 0x08009598 }, { 0x337, 0, 0x08009658 }, { 0x338, 0, 0x08009680 },
+ { 0x339, 0, 0x080096A8 }, { 0x33A, 0, 0x080096C8 }, { 0x33B, 0, 0x080096EC }, { 0x33C, 0, 0x0800973C },
+ { 0x33D, 0, 0x08009778 }, { 0x33E, 0, 0x080097BC }, { 0x33F, 0, 0x08009930 }, { 0x340, 0, 0x08009C50 },
+ { 0x341, 0, 0x08009CC4 }, { 0x342, 0, 0x08009D30 }, { 0x343, 0, 0x08009D58 }, { 0x3E8, 0, 0x08009D7C },
+ { 0x3E9, 0, 0x08009DCC }, { 0x3EA, 0, 0x08009DE8 }, { 0x3EB, 0, 0x08009E2C }, { 0x3EC, 0, 0x08009E54 },
+ { 0x3ED, 0, 0x08009EB8 }, { 0x3EE, 0, 0x08009EFC }, { 0x3EF, 0, 0x08009F6C }, { 0x3F0, 0, 0x08009FA0 },
+ { 0x3F1, 0, 0x08009FF0 }, { 0x3F2, 0, 0x0800A030 }, { 0x3F3, 0, 0x0800A090 }, { 0x3F4, 0, 0x0800A0D0 },
+ { 0x3F5, 0, 0x0800A0F8 }, { 0x3F6, 0, 0x0800A158 }, { 0x3F7, 0, 0x0800A190 }, { 0x3F8, 0, 0x0800A1BC },
+ { 0x3F9, 0, 0x0800A214 }, { 0x3FA, 0, 0x0800A25C }, { 0x3FB, 0, 0x0800A29C }, { 0x3FC, 0, 0x0800A2D8 },
+ { 0x3FD, 0, 0x0800A31C }, { 0x3FE, 0, 0x0800A40C }, { 0x3FF, 0, 0x0800A478 }, { 0x400, 0, 0x0800A4EC },
+ { 0x401, 0, 0x0800A528 }, { 0x402, 0, 0x0800A560 }, { 0x403, 0, 0x0800A5D4 }, { 0x404, 0, 0x0800A608 },
+ { 0x405, 0, 0x0800A63C }, { 0x406, 0, 0x0800A680 }, { 0x407, 0, 0x0800A6B8 }, { 0x408, 0, 0x0800A70C },
+ { 0x44C, 0, 0x0800A75C }, { 0x44D, 0, 0x0800A850 }, { 0x44E, 0, 0x0800A8B8 }, { 0x44F, 0, 0x0800A904 },
+ { 0x450, 0, 0x0800A924 }, { 0x451, 0, 0x0800A974 }, { 0x452, 0, 0x0800A9E8 }, { 0x453, 0, 0x0800AA24 },
+ { 0x454, 0, 0x0800AA7C }, { 0x455, 0, 0x0800AAB4 }, { 0x456, 0, 0x0800AB10 }, { 0x457, 0, 0x0800AB44 },
+ { 0x458, 0, 0x0800AB78 }, { 0x459, 0, 0x0800AC0C }, { 0x45A, 0, 0x0800AC84 }, { 0x45B, 0, 0x0800ACD0 },
+ { 0x45C, 0, 0x0800AD4C }, { 0x45D, 0, 0x0800ADC8 }, { 0x45E, 0, 0x0800AE68 }, { 0x45F, 0, 0x0800AEBC },
+ { 0x460, 0, 0x0800AF54 }, { 0x461, 0, 0x0800AF98 }, { 0x462, 0, 0x0800AFC8 }, { 0x463, 0, 0x0800AFE8 },
+ { 0x464, 0, 0x0800B044 }, { 0x465, 0, 0x0800B094 }, { 0x466, 0, 0x0800B0CC }, { 0x467, 0, 0x0800B0FC },
+ { 0x468, 0, 0x0800B178 }, { 0x469, 0, 0x0800B1B8 }, { 0x46A, 0, 0x0800B1F0 }, { 0x46B, 0, 0x0800B244 },
+ { 0x46C, 0, 0x0800B258 }, { 0x46D, 0, 0x0800B2B4 }, { 0x46E, 0, 0x0800B324 }, { 0x46F, 0, 0x0800B374 },
+ { 0x470, 0, 0x0800B3A8 }, { 0x471, 0, 0x0800B3F4 }, { 0x472, 0, 0x0800B428 }, { 0x473, 0, 0x0800B484 },
+ { 0x474, 0, 0x0800B4A4 }, { 0x475, 0, 0x0800B514 }, { 0x476, 0, 0x0800B570 }, { 0x477, 0, 0x0800B5FC },
+ { 0x478, 0, 0x0800B65C }, { 0x479, 0, 0x0800B6CC }, { 0x47A, 0, 0x0800B6FC }, { 0x47B, 0, 0x0800B760 },
+ { 0x47C, 0, 0x0800B78C }, { 0x47D, 0, 0x0800B7DC }, { 0x47E, 0, 0x0800B82C }, { 0x4B0, 0, 0x0800B854 },
+ { 0x4B1, 0, 0x0800B8B0 }, { 0x4B2, 0, 0x0800B8F8 }, { 0x4B3, 0, 0x0800B93C }, { 0x4B4, 0, 0x0800B994 },
+ { 0x4B5, 0, 0x0800B9D0 }, { 0x4B6, 0, 0x0800BA04 }, { 0x4B7, 0, 0x0800BA94 }, { 0x4B8, 0, 0x0800BAC4 },
+ { 0x4B9, 0, 0x0800BB4C }, { 0x4BA, 0, 0x0800BB7C }, { 0x4BB, 0, 0x0800BBFC }, { 0x4BC, 0, 0x0800BC28 },
+ { 0x4BD, 0, 0x0800BCA4 }, { 0x4BE, 0, 0x0800BCD0 }, { 0x4BF, 0, 0x0800BD58 }, { 0x4C0, 0, 0x0800BD84 },
+ { 0x4C1, 0, 0x0800BE18 }, { 0x4C2, 0, 0x0800BE54 }, { 0x4C3, 0, 0x0800BED0 }, { 0x4C4, 0, 0x0800BEEC },
+ { 0x4C5, 0, 0x0800BF5C }, { 0x4C6, 0, 0x0800BF78 }, { 0x4C7, 0, 0x0800BFF4 }, { 0x4C8, 0, 0x0800C018 },
+ { 0x4C9, 0, 0x0800C0A4 }, { 0x4CA, 0, 0x0800C0D8 }, { 0x4CB, 0, 0x0800C140 }, { 0x4CC, 0, 0x0800C158 },
+ { 0x4CD, 0, 0x0800C1E0 }, { 0x4CE, 0, 0x0800C220 }, { 0x4CF, 0, 0x0800C29C }, { 0x4D0, 0, 0x0800C2D0 },
+ { 0x4D1, 0, 0x0800C34C }, { 0x4D2, 0, 0x0800C378 }, { 0x4D3, 0, 0x0800C400 }, { 0x4D4, 0, 0x0800C448 },
+ { 0x4D5, 0, 0x0800C4BC }, { 0x4D6, 0, 0x0800C4E0 }, { 0x4D7, 0, 0x0800C560 }, { 0x4D8, 0, 0x0800C598 },
+ { 0x4D9, 0, 0x0800C604 }, { 0x4DA, 0, 0x0800C63C }, { 0x4DB, 0, 0x0800C6B4 }, { 0x4DC, 0, 0x0800C714 },
+ { 0x4DD, 0, 0x0800C784 }, { 0x4DE, 0, 0x0800C7B4 }, { 0x4DF, 0, 0x0800C81C }, { 0x4E0, 0, 0x0800C840 },
+ { 0x4E1, 0, 0x0800C8AC }, { 0x4E2, 0, 0x0800C8CC }, { 0x4E3, 0, 0x0800C95C }, { 0x4E4, 0, 0x0800C990 },
+ { 0x4E5, 0, 0x0800CA04 }, { 0x4E6, 0, 0x0800CA20 }, { 0x4E7, 0, 0x0800CA9C }, { 0x4E8, 0, 0x0800CAC0 },
+ { 0x4E9, 0, 0x0800CB48 }, { 0x4EA, 0, 0x0800CB64 }, { 0x4EB, 0, 0x0800CBE8 }, { 0x4EC, 0, 0x0800CC04 },
+ { 0x4ED, 0, 0x0800CC64 }, { 0x4EE, 0, 0x0800CC88 }, { 0x4EF, 0, 0x0800CCE8 }, { 0x4F0, 0, 0x0800CD0C },
+ { 0x4F1, 0, 0x0800CD7C }, { 0x514, 0, 0x0800CDA4 }, { 0x515, 0, 0x0800CED0 }, { 0x516, 0, 0x0800CFE8 },
+ { 0x517, 0, 0x0800D094 }, { 0x518, 0, 0x0800D128 }, { 0x519, 0, 0x0800D1C8 }, { 0x51A, 0, 0x0800D254 },
+ { 0x51B, 0, 0x0800D2A8 }, { 0x51C, 0, 0x0800D318 }, { 0x51D, 0, 0x0800D360 }, { 0x51E, 0, 0x0800D3D0 },
+ { 0x51F, 0, 0x0800D418 }, { 0x520, 0, 0x0800D488 }, { 0x521, 0, 0x0800D534 }, { 0x522, 0, 0x0800D5BC },
+ { 0x523, 0, 0x0800D65C }, { 0x524, 0, 0x0800D6E4 }, { 0x525, 0, 0x0800D728 }, { 0x526, 0, 0x0800D794 },
+ { 0x527, 0, 0x0800D7D0 }, { 0x528, 0, 0x0800D834 }, { 0x529, 0, 0x0800D878 }, { 0x52A, 0, 0x0800D8E4 },
+ { 0x52B, 0, 0x0800D98C }, { 0x52C, 0, 0x0800DA2C }, { 0x52D, 0, 0x0800DAC8 }, { 0x52E, 0, 0x0800DB6C },
+ { 0x52F, 0, 0x0800DBD4 }, { 0x530, 0, 0x0800DC5C }, { 0x531, 0, 0x0800DCC4 }, { 0x532, 0, 0x0800DD54 },
+ { 0x533, 0, 0x0800DDA4 }, { 0x534, 0, 0x0800DE1C }, { 0x535, 0, 0x0800DEC8 }, { 0x536, 0, 0x0800DF50 },
+ { 0x537, 0, 0x0800DFF0 }, { 0x538, 0, 0x0800E078 }, { 0x539, 0, 0x0800E0BC }, { 0x53A, 0, 0x0800E128 },
+ { 0x53B, 0, 0x0800E16C }, { 0x53C, 0, 0x0800E1D8 }, { 0x53D, 0, 0x0800E21C }, { 0x53E, 0, 0x0800E288 },
+ { 0x53F, 0, 0x0800E334 }, { 0x540, 0, 0x0800E414 }, { 0x541, 0, 0x0800E474 }, { 0x542, 0, 0x0800E50C },
+ { 0x543, 0, 0x0800E57C }, { 0x544, 0, 0x0800E614 }, { 0x545, 0, 0x0800E678 }, { 0x546, 0, 0x0800E728 },
+ { 0x547, 0, 0x0800E794 }, { 0x548, 0, 0x0800E7F4 }, { 0x549, 0, 0x0800E86C }, { 0x54A, 0, 0x0800E8D8 },
+ { 0x54B, 0, 0x0800E934 }, { 0x54C, 0, 0x0800E9B4 }, { 0x54D, 0, 0x0800EA28 }, { 0x54E, 0, 0x0800EB08 },
+ { 0x54F, 0, 0x0800EB60 }, { 0x550, 0, 0x0800EBC8 }, { 0x551, 0, 0x0800EC2C }, { 0x552, 0, 0x0800ECAC },
+ { 0x553, 0, 0x0800ED1C }, { 0x554, 0, 0x0800ED9C }, { 0x555, 0, 0x0800EE00 }, { 0x556, 0, 0x0800EEEC },
+ { 0x557, 0, 0x0800EF4C }, { 0x558, 0, 0x0800EFBC }, { 0x559, 0, 0x0800F03C }, { 0x55A, 0, 0x0800F0B4 },
+ { 0x55B, 0, 0x0800F110 }, { 0x55C, 0, 0x0800F188 }, { 0x55D, 0, 0x0800F258 }, { 0x55E, 0, 0x0800F300 },
+ { 0x55F, 0, 0x0800F398 }, { 0x560, 0, 0x0800F44C }, { 0x561, 0, 0x0800F570 }, { 0x562, 0, 0x0800F688 },
+ { 0x563, 0, 0x0800F7A8 }, { 0x564, 0, 0x0800F8B8 }, { 0x565, 0, 0x0800F9D8 }, { 0x566, 0, 0x0800FAEC },
+ { 0x567, 0, 0x0800FB84 }, { 0x568, 0, 0x0800FC34 }, { 0x569, 0, 0x0800FCC8 }, { 0x56A, 0, 0x0800FD78 },
+ { 0x56B, 0, 0x0800FE0C }, { 0x56C, 0, 0x0800FEBC }, { 0x56D, 0, 0x08010008 }, { 0x56E, 0, 0x08010168 },
+ { 0x56F, 0, 0x080102C4 }, { 0x570, 0, 0x0801042C }, { 0x571, 0, 0x08010584 }, { 0x572, 0, 0x080106EC },
+ { 0x573, 0, 0x08010844 }, { 0x578, 0, 0x080109A4 }, { 0x579, 0, 0x08010A70 }, { 0x57A, 0, 0x08010B28 },
+ { 0x57B, 0, 0x08010C7C }, { 0x57C, 0, 0x08010D98 }, { 0x57D, 0, 0x08010EC4 }, { 0x57E, 0, 0x08010FF4 },
+ { 0x57F, 0, 0x080110E4 }, { 0x580, 0, 0x080111D0 }, { 0x582, 0, 0x08011260 }, { 0x583, 0, 0x08011304 },
+ { 0x584, 0, 0x08011374 }, { 0x585, 0, 0x08011408 }, { 0x586, 0, 0x080114BC }, { 0x587, 0, 0x08011528 },
+ { 0x588, 0, 0x080115C0 }, { 0x589, 0, 0x08011674 }, { 0x58A, 0, 0x080116E4 }, { 0x58B, 0, 0x08011760 },
+ { 0x58C, 0, 0x08011820 }, { 0x58D, 0, 0x08011884 }, { 0x58E, 0, 0x0801192C }, { 0x58F, 0, 0x08011A20 },
+ { 0x590, 0, 0x08011B08 }, { 0x591, 0, 0x08011B68 }, { 0x592, 0, 0x08011BA4 }, { 0x593, 0, 0x08011BE4 },
+ { 0x594, 0, 0x08011C20 }, { 0x595, 0, 0x08011D00 }, { 0x59C, 0, 0x08011DC8 }, { 0x59D, 0, 0x08011E78 },
+ { 0x59E, 0, 0x08011EB4 }, { 0x59F, 0, 0x08011EFC }, { 0x5A0, 0, 0x08011FB4 }, { 0x5A1, 0, 0x08012068 },
+ { 0x5A2, 0, 0x080120A4 }, { 0x5A3, 0, 0x080120E4 }, { 0x5A4, 0, 0x08012198 }, { 0x5A5, 0, 0x08012248 },
+ { 0x5A6, 0, 0x08012284 }, { 0x5A7, 0, 0x080122C4 }, { 0x5A8, 0, 0x08012380 }, { 0x5A9, 0, 0x0801243C },
+ { 0x5AA, 0, 0x08012478 }, { 0x5DC, 0, 0x080124B8 }, { 0x5DD, 0, 0x08012548 }, { 0x5DE, 0, 0x080125BC },
+ { 0x5DF, 0, 0x08012678 }, { 0x5E0, 0, 0x08012730 }, { 0x5E1, 0, 0x0801276C }, { 0x5E2, 0, 0x08012784 },
+ { 0x5E3, 0, 0x080127C4 }, { 0x5E4, 0, 0x080128A8 }, { 0x5E5, 0, 0x080128E0 }, { 0x5E6, 0, 0x0801294C },
+ { 0x5E7, 0, 0x08012970 }, { 0x5E8, 0, 0x080129A4 }, { 0x5E9, 0, 0x08012A5C }, { 0x5EA, 0, 0x08012ACC },
+ { 0x5EB, 0, 0x08012B4C }, { 0x5EC, 0, 0x08012BF0 }, { 0x5ED, 0, 0x08012CE0 }, { 0x5EE, 0, 0x08012D84 },
+ { 0x5EF, 0, 0x08012DE4 }, { 0x5F0, 0, 0x08012E1C }, { 0x5F1, 0, 0x08012E7C }, { 0x5F2, 0, 0x08012EF0 },
+ { 0x5F3, 0, 0x08012FAC }, { 0x5F4, 0, 0x08013060 }, { 0x5F5, 0, 0x080130F4 }, { 0x5F6, 0, 0x0801315C },
+ { 0x5F7, 0, 0x08013210 }, { 0x5F8, 0, 0x08013258 }, { 0x60E, 0, 0x080132B0 }, { 0x60F, 0, 0x08013368 },
+ { 0x610, 0, 0x08013470 }, { 0x611, 0, 0x08013530 }, { 0x612, 0, 0x080135F8 }, { 0x613, 0, 0x08013680 },
+ { 0x614, 0, 0x080137D0 }, { 0x615, 0, 0x0801386C }, { 0x616, 0, 0x08013944 }, { 0x617, 0, 0x080139B8 },
+ { 0x618, 0, 0x08013A44 }, { 0x619, 0, 0x08013AA8 }, { 0x61A, 0, 0x08013BFC }, { 0x61B, 0, 0x08013C5C },
+ { 0x61C, 0, 0x08013CB0 }, { 0x61D, 0, 0x08013D00 }, { 0x61E, 0, 0x08013D60 }, { 0x61F, 0, 0x08013DAC },
+ { 0x620, 0, 0x08013DEC }, { 0x621, 0, 0x08013E4C }, { 0x622, 0, 0x08013E80 }, { 0x623, 0, 0x08013ED8 },
+ { 0x624, 0, 0x08013F24 }, { 0x625, 0, 0x08013FEC }, { 0x626, 0, 0x08014010 }, { 0x627, 0, 0x08014064 },
+ { 0x628, 0, 0x080140C4 }, { 0x629, 0, 0x08014170 }, { 0x62A, 0, 0x08014208 }, { 0x62B, 0, 0x080142D0 },
+ { 0x62C, 0, 0x08014398 }, { 0x640, 0, 0x0801454C }, { 0x641, 0, 0x0801458C }, { 0x642, 0, 0x080145B4 },
+ { 0x644, 0, 0x080145F0 }, { 0x645, 0, 0x08014608 }, { 0x646, 0, 0x08014648 }, { 0x647, 0, 0x080146B0 },
+ { 0x648, 0, 0x080146D4 }, { 0x649, 0, 0x08014760 }, { 0x64A, 0, 0x08014798 }, { 0x64B, 0, 0x08014850 },
+ { 0x64C, 0, 0x08014898 }, { 0x64D, 0, 0x080148B4 }, { 0x64E, 0, 0x08014924 }, { 0x64F, 0, 0x08014988 },
+ { 0x650, 0, 0x080149F0 }, { 0x651, 0, 0x08014A50 }, { 0x652, 0, 0x08014A8C }, { 0x653, 0, 0x08014AF4 },
+ { 0x654, 0, 0x08014B34 }, { 0x655, 0, 0x08014B9C }, { 0x656, 0, 0x08014BD8 }, { 0x657, 0, 0x08014C38 },
+ { 0x658, 0, 0x08014C78 }, { 0x659, 0, 0x08014CBC }, { 0x65A, 0, 0x08014D10 }, { 0x65B, 0, 0x08014D94 },
+ { 0x65C, 0, 0x08014E68 }, { 0x65D, 0, 0x08014F18 }, { 0x65E, 0, 0x08014F5C }, { 0x65F, 0, 0x08014F88 },
+ { 0x660, 0, 0x08014FD0 }, { 0x661, 0, 0x08015024 }, { 0x662, 0, 0x080150F0 }, { 0x663, 0, 0x08015188 },
+ { 0x664, 0, 0x080151AC }, { 0x665, 0, 0x080151E4 }, { 0x666, 0, 0x08015248 }, { 0x667, 0, 0x0801529C },
+ { 0x668, 0, 0x080152CC }, { 0x669, 0, 0x0801532C }, { 0x66A, 0, 0x08015390 }, { 0x66B, 0, 0x080153E4 },
+ { 0x66C, 0, 0x08015450 }, { 0x66D, 0, 0x080154BC }, { 0x66E, 0, 0x08015550 }, { 0x66F, 0, 0x080155C0 },
+ { 0x670, 0, 0x08015600 }, { 0x671, 0, 0x08015634 }, { 0x672, 0, 0x0801568C }, { 0x673, 0, 0x080156C8 },
+ { 0x674, 0, 0x0801574C }, { 0x675, 0, 0x08015784 }, { 0x676, 0, 0x080157F8 }, { 0x677, 0, 0x0801588C },
+ { 0x678, 0, 0x080158E4 }, { 0x679, 0, 0x08015940 }, { 0x67A, 0, 0x08015994 }, { 0x67B, 0, 0x080159E8 },
+ { 0x67C, 0, 0x08015A48 }, { 0x67D, 0, 0x08015B58 }, { 0x67E, 0, 0x08015C04 }, { 0x67F, 0, 0x08015C50 },
+ { 0x680, 0, 0x08015D64 }, { 0x681, 0, 0x08015E40 }, { 0x682, 0, 0x08015ED0 }, { 0x683, 0, 0x08015F00 },
+ { 0x684, 0, 0x08015F90 }, { 0x685, 0, 0x08015FCC }, { 0x686, 0, 0x08016020 }, { 0x687, 0, 0x08016078 },
+ { 0x688, 0, 0x080160AC }, { 0x689, 0, 0x08016104 }, { 0x68A, 0, 0x08016130 }, { 0x6A4, 0, 0x08016184 },
+ { 0x6A5, 0, 0x080161B8 }, { 0x6A6, 0, 0x0801620C }, { 0x6A7, 0, 0x08016248 }, { 0x6A8, 0, 0x080162A0 },
+ { 0x6A9, 0, 0x080162C8 }, { 0x6AA, 0, 0x0801634C }, { 0x6AB, 0, 0x08016398 }, { 0x6AC, 0, 0x080163FC },
+ { 0x6AD, 0, 0x08016478 }, { 0x6AE, 0, 0x080164B4 }, { 0x6AF, 0, 0x08016508 }, { 0x6B0, 0, 0x08016548 },
+ { 0x6B1, 0, 0x080165C0 }, { 0x6B2, 0, 0x08016600 }, { 0x6B3, 0, 0x08016674 }, { 0x6B4, 0, 0x080166B4 },
+ { 0x6B5, 0, 0x0801671C }, { 0x6B6, 0, 0x08016758 }, { 0x6B7, 0, 0x080167C0 }, { 0x6B8, 0, 0x080167F8 },
+ { 0x6B9, 0, 0x08016858 }, { 0x6BA, 0, 0x08016894 }, { 0x6BB, 0, 0x08016900 }, { 0x6BC, 0, 0x0801693C },
+ { 0x6BD, 0, 0x0801698C }, { 0x6BE, 0, 0x080169CC }, { 0x6BF, 0, 0x08016A04 }, { 0x6C0, 0, 0x08016A28 },
+ { 0x6C1, 0, 0x08016A7C }, { 0x6C2, 0, 0x08016A98 }, { 0x6C3, 0, 0x08016AC8 }, { 0x6C4, 0, 0x08016AE4 },
+ { 0x6C5, 0, 0x08016B2C }, { 0x6C6, 0, 0x08016B84 }, { 0x6C7, 0, 0x08016BC8 }, { 0x6C8, 0, 0x08016BE0 },
+ { 0x6C9, 0, 0x08016C34 }, { 0x6CA, 0, 0x08016C94 }, { 0x6CB, 0, 0x08016CD0 }, { 0x6CC, 0, 0x08016D24 },
+ { 0x6CD, 0, 0x08016D64 }, { 0x6CE, 0, 0x08016DC8 }, { 0x6CF, 0, 0x08016E08 }, { 0x6D0, 0, 0x08016E6C },
+ { 0x6D1, 0, 0x08016EAC }, { 0x6D2, 0, 0x08016F14 }, { 0x6D3, 0, 0x08016F50 }, { 0x6D4, 0, 0x08016FD0 },
+ { 0x6D5, 0, 0x08017008 }, { 0x6D6, 0, 0x08017084 }, { 0x6D7, 0, 0x080170C0 }, { 0x6D8, 0, 0x08017110 },
+ { 0x6D9, 0, 0x0801714C }, { 0x6DA, 0, 0x080171A4 }, { 0x6DB, 0, 0x080171E0 }, { 0x6DC, 0, 0x08017218 },
+ { 0x6DD, 0, 0x08017264 }, { 0x6DE, 0, 0x080172E0 }, { 0x708, 0, 0x08017330 }, { 0x709, 0, 0x080173C4 },
+ { 0x70A, 0, 0x0801741C }, { 0x70B, 0, 0x080174B4 }, { 0x70C, 0, 0x0801753C }, { 0x70D, 0, 0x08017564 },
+ { 0x70E, 0, 0x0801758C }, { 0x70F, 0, 0x080175FC }, { 0x710, 0, 0x08017650 }, { 0x711, 0, 0x08017748 },
+ { 0x712, 0, 0x0801775C }, { 0x713, 0, 0x080177B0 }, { 0x714, 0, 0x080177D8 }, { 0x715, 0, 0x0801781C },
+ { 0x716, 0, 0x0801787C }, { 0x717, 0, 0x08017A6C }, { 0x718, 0, 0x08017AB8 }, { 0x719, 0, 0x08017AE8 },
+ { 0x71A, 0, 0x08017B48 }, { 0x71B, 0, 0x08017BA0 }, { 0x721, 0, 0x08017C00 }, { 0x722, 0, 0x08017C44 },
+ { 0x723, 0, 0x08017C84 }, { 0x724, 0, 0x08017CC4 }, { 0x725, 0, 0x08017D04 }, { 0x726, 0, 0x08017D90 },
+ { 0x727, 0, 0x08017DE4 }, { 0x728, 0, 0x08017DF0 }, { 0x729, 0, 0x08017E50 }, { 0x72A, 0, 0x08017E9C },
+ { 0x72B, 0, 0x08017F08 }, { 0x72C, 0, 0x08017F5C }, { 0x72D, 0, 0x08017F8C }, { 0x72E, 0, 0x08017FC8 },
+ { 0x72F, 0, 0x0801800C }, { 0x730, 0, 0x08018064 }, { 0x731, 0, 0x080180A0 }, { 0x732, 0, 0x080180E8 },
+ { 0x733, 0, 0x08018104 }, { 0x734, 0, 0x08018188 }, { 0x735, 0, 0x08018240 }, { 0x736, 0, 0x080182A8 },
+ { 0x737, 0, 0x080182E4 }, { 0x738, 0, 0x080184D0 }, { 0x73A, 0, 0x08018510 }, { 0x73B, 0, 0x08018594 },
+ { 0x73C, 0, 0x08018618 }, { 0x73D, 0, 0x080186B0 }, { 0x73E, 0, 0x0801876C }, { 0x73F, 0, 0x08018818 },
+ { 0x740, 0, 0x080188CC }, { 0x741, 0, 0x08018908 }, { 0x742, 0, 0x08018938 }, { 0x743, 0, 0x080189A0 },
+ { 0x744, 0, 0x08018A00 }, { 0x745, 0, 0x08018A90 }, { 0x746, 0, 0x08018B4C }, { 0x747, 0, 0x08018C18 },
+ { 0x748, 0, 0x08018C8C }, { 0x749, 0, 0x08018CE0 }, { 0x74A, 0, 0x08018D78 }, { 0x74B, 0, 0x08018DD0 },
+ { 0x74C, 0, 0x08018E38 }, { 0x74D, 0, 0x08018E78 }, { 0x74E, 0, 0x08018EC0 }, { 0x74F, 0, 0x08018F38 },
+ { 0x750, 0, 0x08018FF4 }, { 0x751, 0, 0x08019014 }, { 0x752, 0, 0x0801910C }, { 0x753, 0, 0x08019160 },
+ { 0x754, 0, 0x080191A4 }, { 0x755, 0, 0x080191FC }, { 0x756, 0, 0x08019254 }, { 0x757, 0, 0x0801927C },
+ { 0x758, 0, 0x080192E8 }, { 0x759, 0, 0x08019354 }, { 0x75A, 0, 0x0801939C }, { 0x76C, 0, 0x0801941C },
+ { 0x76D, 0, 0x08019468 }, { 0x76E, 0, 0x080194BC }, { 0x76F, 0, 0x080194F8 }, { 0x770, 0, 0x08019530 },
+ { 0x771, 0, 0x0801956C }, { 0x772, 0, 0x080195A4 }, { 0x773, 0, 0x080195DC }, { 0x774, 0, 0x08019620 },
+ { 0x775, 0, 0x08019654 }, { 0x776, 0, 0x08019688 }, { 0x777, 0, 0x080196A4 }, { 0x778, 0, 0x080196F0 },
+ { 0x779, 0, 0x080197A4 }, { 0x77A, 0, 0x080197C0 }, { 0x77B, 0, 0x080197E4 }, { 0x77C, 0, 0x0801982C },
+ { 0x77D, 0, 0x08019854 }, { 0x7D0, 0, 0x08019878 }, { 0x7D1, 0, 0x080198BC }, { 0x7D2, 0, 0x080199A8 },
+ { 0x7D3, 0, 0x080199BC }, { 0x7D4, 0, 0x080199E4 }, { 0x7D5, 0, 0x08019AD8 }, { 0x7D6, 0, 0x08019B10 },
+ { 0x7D7, 0, 0x08019B28 }, { 0x7D8, 0, 0x08019BA4 }, { 0x7D9, 0, 0x08019BC8 }, { 0x7DC, 0, 0x08019C20 },
+ { 0x7DD, 0, 0x08019C40 }, { 0x7DE, 0, 0x08019C60 }, { 0x800, 0, 0x08019C80 }, { 0x801, 0, 0x08019D44 },
+ { 0x802, 0, 0x08019DD0 }, { 0x803, 0, 0x08019E24 }, { 0x804, 0, 0x08019E44 }, { 0x806, 0, 0x08019F84 },
+ { 0x807, 0, 0x0801A0F0 }, { 0x80B, 0, 0x0801A0FC }, { 0x80C, 0, 0x0801A144 }, { 0x80D, 0, 0x0801A1AC },
+ { 0x80E, 0, 0x0801A218 }, { 0x80F, 0, 0x0801A288 }, { 0x810, 0, 0x0801A320 }, { 0x811, 0, 0x0801A348 },
+ { 0x820, 0, 0x0801A378 }, { 0x821, 0, 0x0801A3B4 }, { 0x822, 0, 0x0801A408 }, { 0x823, 0, 0x0801A484 },
+ { 0x824, 0, 0x0801A4D4 }, { 0x825, 0, 0x0801A538 }, { 0x826, 0, 0x0801A5A8 }, { 0x827, 0, 0x0801A614 },
+ { 0x828, 0, 0x0801A654 }, { 0x829, 0, 0x0801A680 }, { 0x82A, 0, 0x0801A6EC }, { 0x82B, 0, 0x0801A740 },
+ { 0x82C, 0, 0x0801A79C }, { 0x82D, 0, 0x0801A808 }, { 0x82E, 0, 0x0801A868 }, { 0x82F, 0, 0x0801A894 },
+ { 0x830, 0, 0x0801A918 }, { 0x831, 0, 0x0801A968 }, { 0x832, 0, 0x0801A9DC }, { 0x833, 0, 0x0801AA5C },
+ { 0x834, 0, 0x0801AA80 }, { 0x835, 0, 0x0801AAD0 }, { 0x836, 0, 0x0801AB60 }, { 0x838, 0, 0x0801AC28 },
+ { 0x839, 0, 0x0801AC7C }, { 0x83A, 0, 0x0801AD18 }, { 0x83B, 0, 0x0801AD48 }, { 0x83C, 0, 0x0801ADC4 },
+ { 0x83D, 0, 0x0801AE2C }, { 0x83E, 0, 0x0801AE84 }, { 0x83F, 0, 0x0801AEC4 }, { 0x840, 0, 0x0801AF0C },
+ { 0x841, 0, 0x0801AF48 }, { 0x842, 0, 0x0801AFA4 }, { 0x843, 0, 0x0801AFE4 }, { 0x844, 0, 0x0801B054 },
+ { 0x845, 0, 0x0801B090 }, { 0x846, 0, 0x0801B0CC }, { 0x847, 0, 0x0801B114 }, { 0x848, 0, 0x0801B168 },
+ { 0x849, 0, 0x0801B190 }, { 0x84A, 0, 0x0801B210 }, { 0x84B, 0, 0x0801B278 }, { 0x84C, 0, 0x0801B2BC },
+ { 0x84D, 0, 0x0801B310 }, { 0x84E, 0, 0x0801B380 }, { 0x84F, 0, 0x0801B3A4 }, { 0x850, 0, 0x0801B3CC },
+ { 0x851, 0, 0x0801B47C }, { 0x852, 0, 0x0801B488 }, { 0x853, 0, 0x0801B4B4 }, { 0x854, 0, 0x0801B5C4 },
+ { 0x855, 0, 0x0801B608 }, { 0x856, 0, 0x0801B678 }, { 0x857, 0, 0x0801B6D8 }, { 0x858, 0, 0x0801B718 },
+ { 0x859, 0, 0x0801B78C }, { 0x85A, 0, 0x0801B810 }, { 0x85B, 0, 0x0801B85C }, { 0x85C, 0, 0x0801B8C4 },
+ { 0x85D, 0, 0x0801B8F4 }, { 0x85E, 0, 0x0801B900 }, { 0x85F, 0, 0x0801B92C }, { 0x860, 0, 0x0801B968 },
+ { 0x861, 0, 0x0801B994 }, { 0x862, 0, 0x0801B9E0 }, { 0x863, 0, 0x0801BA6C }, { 0x864, 0, 0x0801BACC },
+ { 0x865, 0, 0x0801BB18 }, { 0x866, 0, 0x0801BB8C }, { 0x867, 0, 0x0801BBA4 }, { 0x868, 0, 0x0801BC0C },
+ { 0x869, 0, 0x0801BC88 }, { 0x86A, 0, 0x0801BCC0 }, { 0x86B, 0, 0x0801BD30 }, { 0x86C, 0, 0x0801BD90 },
+ { 0x86D, 0, 0x0801BDD4 }, { 0x86E, 0, 0x0801BE60 }, { 0x86F, 0, 0x0801BF1C }, { 0x870, 0, 0x0801BF40 },
+ { 0x871, 0, 0x0801BF90 }, { 0x872, 0, 0x0801BFB0 }, { 0x873, 0, 0x0801C004 }, { 0x874, 0, 0x0801C038 },
+ { 0x875, 0, 0x0801C0A0 }, { 0x876, 0, 0x0801C0F8 }, { 0x877, 0, 0x0801C170 }, { 0x878, 0, 0x0801C1E0 },
+ { 0x879, 0, 0x0801C23C }, { 0x87A, 0, 0x0801C2A0 }, { 0x87B, 0, 0x0801C2D4 }, { 0x87C, 0, 0x0801C314 },
+ { 0x87D, 0, 0x0801C384 }, { 0x87E, 0, 0x0801C3DC }, { 0x87F, 0, 0x0801C43C }, { 0x880, 0, 0x0801C494 },
+ { 0x881, 0, 0x0801C504 }, { 0x882, 0, 0x0801C580 }, { 0x883, 0, 0x0801C5E8 }, { 0x884, 0, 0x0801C694 },
+ { 0x885, 0, 0x0801C6DC }, { 0x886, 0, 0x0801C73C }, { 0x887, 0, 0x0801C798 }, { 0x888, 0, 0x0801C7EC },
+ { 0x889, 0, 0x0801C824 }, { 0x88A, 0, 0x0801C86C }, { 0x88B, 0, 0x0801C890 }, { 0x88C, 0, 0x0801C8C4 },
+ { 0x88D, 0, 0x0801C914 }, { 0x88E, 0, 0x0801C98C }, { 0x88F, 0, 0x0801CA00 }, { 0x890, 0, 0x0801CA40 },
+ { 0x898, 0, 0x0801CADC }, { 0x899, 0, 0x0801CB1C }, { 0x89A, 0, 0x0801CB60 }, { 0x89B, 0, 0x0801CC18 },
+ { 0x89C, 0, 0x0801CC74 }, { 0x89D, 0, 0x0801CCCC }, { 0x89E, 0, 0x0801CD40 }, { 0x89F, 0, 0x0801CDA0 },
+ { 0x8A0, 0, 0x0801CDE8 }, { 0x8A1, 0, 0x0801CE44 }, { 0x8A2, 0, 0x0801CEB0 }, { 0x8A3, 0, 0x0801CF0C },
+ { 0x8A4, 0, 0x0801CF38 }, { 0x8A5, 0, 0x0801CFD0 }, { 0x8CA, 0, 0x0801D010 }, { 0x8CB, 0, 0x0801D0E0 },
+ { 0x8CC, 0, 0x0801D108 }, { 0x8CD, 0, 0x0801D138 }, { 0x8CE, 0, 0x0801D170 }, { 0x8CF, 0, 0x0801D1C0 },
+ { 0x8D0, 0, 0x0801D200 }, { 0x8D1, 0, 0x0801D238 }, { 0x8D2, 0, 0x0801D268 }, { 0x8D3, 0, 0x0801D340 },
+ { 0x8D4, 0, 0x0801D3D4 }, { 0x8D5, 0, 0x0801D444 }, { 0x8D6, 0, 0x0801D488 }, { 0x8D7, 0, 0x0801D4D8 },
+ { 0x8D8, 0, 0x0801D508 }, { 0x8D9, 0, 0x0801D574 }, { 0x8DA, 0, 0x0801D5A0 }, { 0x8DB, 0, 0x0801D5D0 },
+ { 0x8DC, 0, 0x0801D600 }, { 0x8DD, 0, 0x0801D644 }, { 0x8DE, 0, 0x0801D7C8 }, { 0x8DF, 0, 0x0801D7FC },
+ { 0x8E0, 0, 0x0801D844 }, { 0x8E1, 0, 0x0801D898 }, { 0x8E2, 0, 0x0801D938 }, { 0x8E3, 0, 0x0801D9E0 },
+ { 0x8E4, 0, 0x0801DA40 }, { 0x8E5, 0, 0x0801DA9C }, { 0x8E6, 0, 0x0801DB20 }, { 0x8E7, 0, 0x0801DB88 },
+ { 0x8E8, 0, 0x0801DBB0 }, { 0x8E9, 0, 0x0801DBE4 }, { 0x8EA, 0, 0x0801DC6C }, { 0x8EB, 0, 0x0801DC84 },
+ { 0x8EC, 0, 0x0801DD18 }, { 0x910, 0, 0x0801DD64 }, { 0x911, 0, 0x0801DDC0 }, { 0x912, 0, 0x0801DE3C },
+ { 0x913, 0, 0x0801DEAC }, { 0x914, 0, 0x0801DF18 }, { 0x915, 0, 0x0801DF88 }, { 0x916, 0, 0x0801DFF0 },
+ { 0x917, 0, 0x0801E038 }, { 0x918, 0, 0x0801E164 }, { 0x919, 0, 0x0801E1BC }, { 0x91A, 0, 0x0801E204 },
+ { 0x91B, 0, 0x0801E330 }, { 0x91C, 0, 0x0801E370 }, { 0x91E, 0, 0x0801E3CC }, { 0x92E, 0, 0x0801E464 },
+ { 0x92F, 0, 0x0801E4C0 }, { 0x930, 0, 0x0801E534 }, { 0x931, 0, 0x0801E5AC }, { 0x932, 0, 0x0801E5B8 },
+ { 0x933, 0, 0x0801E608 }, { 0x934, 0, 0x0801E650 }, { 0x935, 0, 0x0801E698 }, { 0x936, 0, 0x0801E6D0 },
+ { 0x937, 0, 0x0801E738 }, { 0x938, 0, 0x0801E768 }, { 0x960, 0, 0x0801E774 }, { 0x961, 0, 0x0801E798 },
+ { 0x962, 0, 0x0801E810 }, { 0x963, 0, 0x0801E8AC }, { 0x964, 0, 0x0801E97C }, { 0x965, 0, 0x0801E9C8 },
+ { 0x966, 0, 0x0801EA1C }, { 0x967, 0, 0x0801EABC }, { 0x968, 0, 0x0801EB08 }, { 0x969, 0, 0x0801EBC8 },
+ { 0x96A, 0, 0x0801EC58 }, { 0x96B, 0, 0x0801EC8C }, { 0x96C, 0, 0x0801ECD4 }, { 0x96D, 0, 0x0801ED40 },
+ { 0x96E, 0, 0x0801ED88 }, { 0x96F, 0, 0x0801EE4C }, { 0x970, 0, 0x0801EF08 }, { 0x971, 0, 0x0801EF98 },
+ { 0x972, 0, 0x0801EFF4 }, { 0x9C4, 0, 0x0801F000 }, { 0x9C5, 0, 0x0801F08C }, { 0x9C6, 0, 0x0801F0B0 },
+ { 0x9C7, 0, 0x0801F104 }, { 0x9C8, 0, 0x0801F110 }, { 0x9C9, 0, 0x0801F160 }, { 0x9CA, 0, 0x0801F1D4 },
+ { 0x9CB, 0, 0x0801F25C }, { 0x9CC, 0, 0x0801F2A0 }, { 0x9CD, 0, 0x0801F2E8 }, { 0x9CE, 0, 0x0801F338 },
+ { 0x9CF, 0, 0x0801F37C }, { 0x9D0, 0, 0x0801F3CC }, { 0x9D1, 0, 0x0801F424 }, { 0x9D2, 0, 0x0801F450 },
+ { 0x9D3, 0, 0x0801F510 }, { 0x9D4, 0, 0x0801F558 }, { 0x9D5, 0, 0x0801F580 }, { 0x9D6, 0, 0x0801F5D0 },
+ { 0x9D7, 0, 0x0801F61C }, { 0x9D8, 0, 0x0801F65C }, { 0x9D9, 0, 0x0801F69C }, { 0x9DA, 0, 0x0801F6EC },
+ { 0x9DB, 0, 0x0801F764 }, { 0x9DC, 0, 0x0801F7B0 }, { 0x9DD, 0, 0x0801F808 }, { 0x9DE, 0, 0x0801F8AC },
+ { 0x9DF, 0, 0x0801F91C }, { 0x9E0, 0, 0x0801F990 }, { 0x9E1, 0, 0x0801F9CC }, { 0x9E2, 0, 0x0801FA2C },
+ { 0x9E3, 0, 0x0801FA74 }, { 0x9E4, 0, 0x0801FB24 }, { 0x9E5, 0, 0x0801FB90 }, { 0x9E6, 0, 0x0801FBBC },
+ { 0x9E7, 0, 0x0801FBE4 }, { 0x9E8, 0, 0x0801FC4C }, { 0x9E9, 0, 0x0801FCA0 }, { 0x9EA, 0, 0x0801FD80 },
+ { 0x9EB, 0, 0x0801FDE8 }, { 0x9EC, 0, 0x0801FE70 }, { 0x9ED, 0, 0x0801FEAC }, { 0x9EE, 0, 0x0801FF40 },
+ { 0x9EF, 0, 0x0801FF8C }, { 0xA28, 0, 0x0801FFC4 }, { 0xA29, 0, 0x0801FFF4 }, { 0xA2A, 0, 0x08020014 },
+ { 0xA2B, 0, 0x08020048 }, { 0xA2C, 0, 0x0802012C }, { 0xA2D, 0, 0x08020190 }, { 0xA2E, 0, 0x080201EC },
+ { 0xA2F, 0, 0x08020278 }, { 0xA30, 0, 0x080202E4 }, { 0xA31, 0, 0x0802031C }, { 0xA32, 0, 0x08020360 },
+ { 0xA33, 0, 0x080203A4 }, { 0xA34, 0, 0x080203C8 }, { 0xA35, 0, 0x08020424 }, { 0xA36, 0, 0x0802047C },
+ { 0xA37, 0, 0x080204F0 }, { 0xA38, 0, 0x08020534 }, { 0xA39, 0, 0x08020570 }, { 0xA3A, 0, 0x080205E4 },
+ { 0xBB8, 0, 0x08020668 }, { 0xBB9, 0, 0x080206A4 }, { 0xBBA, 0, 0x080206EC }, { 0xBBB, 0, 0x08020710 },
+ { 0xBBC, 0, 0x08020764 }, { 0xBBD, 0, 0x080207A4 }, { 0xBBE, 0, 0x080207E8 }, { 0xBBF, 0, 0x08020814 },
+ { 0xBC0, 0, 0x08020858 }, { 0xBC1, 0, 0x080208B0 }, { 0xBC2, 0, 0x08020910 }, { 0xBC3, 0, 0x08020960 },
+ { 0xBC4, 0, 0x080209C4 }, { 0xBC5, 0, 0x080209F0 }, { 0xBC6, 0, 0x08020A50 }, { 0xBC7, 0, 0x08020A8C },
+ { 0xBC8, 0, 0x08020B00 }, { 0xBC9, 0, 0x08020B3C }, { 0xBCA, 0, 0x08020BB8 }, { 0xBCB, 0, 0x08020BF4 },
+ { 0xBCC, 0, 0x08020C4C }, { 0xBCD, 0, 0x08020C88 }, { 0xBCE, 0, 0x08020CF0 }, { 0xBCF, 0, 0x08020D2C },
+ { 0xBD0, 0, 0x08020D80 }, { 0xBD1, 0, 0x08020DC0 }, { 0xBD2, 0, 0x08020DFC }, { 0xBD3, 0, 0x08020E58 },
+ { 0xBD4, 0, 0x08020E88 }, { 0xBD5, 0, 0x08020EE0 }, { 0xBD6, 0, 0x08020F18 }, { 0xBD7, 0, 0x08020F44 },
+ { 0xBEA, 0, 0x08020F60 }, { 0xBEB, 0, 0x08021158 }, { 0xBEC, 0, 0x080211C0 }, { 0xBED, 0, 0x080211EC },
+ { 0xBEE, 0, 0x08021350 }, { 0xBEF, 0, 0x08021380 }, { 0xBF0, 0, 0x080213F8 }, { 0xBF1, 0, 0x08021480 },
+ { 0xBF2, 0, 0x08021558 }, { 0xBF3, 0, 0x08021588 }, { 0xBF4, 0, 0x080215E0 }, { 0xBF5, 0, 0x080216A0 },
+ { 0xBF6, 0, 0x080217CC }, { 0xBF7, 0, 0x08021858 }, { 0xBF8, 0, 0x080218CC }, { 0xBF9, 0, 0x08021974 },
+ { 0xBFA, 0, 0x080219F8 }, { 0xBFB, 0, 0x08021A68 }, { 0xBFC, 0, 0x08021AF8 }, { 0xBFD, 0, 0x08021B9C },
+ { 0xBFE, 0, 0x08021BE0 }, { 0xBFF, 0, 0x08021C54 }, { 0xC00, 0, 0x08021C80 }, { 0xC01, 0, 0x08021CC8 },
+ { 0xC02, 0, 0x08021F20 }, { 0xC03, 0, 0x08021F50 }, { 0xC04, 0, 0x08022024 }, { 0xC1D, 0, 0x08022090 },
+ { 0xC1E, 0, 0x080220B8 }, { 0xC1F, 0, 0x080220D0 }, { 0xC20, 0, 0x08022104 }, { 0xC21, 0, 0x08022198 },
+ { 0xC22, 0, 0x080221B8 }, { 0xC23, 0, 0x080221DC }, { 0xC24, 0, 0x08022248 }, { 0xC25, 0, 0x08022288 },
+ { 0xC26, 0, 0x08022308 }, { 0xC27, 0, 0x0802233C }, { 0xC28, 0, 0x0802239C }, { 0xC29, 0, 0x080223E4 },
+ { 0xC2A, 0, 0x08022408 }, { 0xC2B, 0, 0x08022470 }, { 0xC2C, 0, 0x080224C4 }, { 0xC2D, 0, 0x0802255C },
+ { 0xC2E, 0, 0x08022584 }, { 0xC2F, 0, 0x080225AC }, { 0xC30, 0, 0x08022640 }, { 0xC31, 0, 0x08022670 },
+ { 0xC32, 0, 0x0802268C }, { 0xC33, 0, 0x080226A0 }, { 0xC34, 0, 0x080226E0 }, { 0xC35, 0, 0x08022738 },
+ { 0xC36, 0, 0x08022760 }, { 0xC37, 0, 0x08022780 }, { 0xC38, 0, 0x080227B8 }, { 0xC39, 0, 0x080227F0 },
+ { 0xC3A, 0, 0x080228DC }, { 0xC3B, 0, 0x08022954 }, { 0xC3C, 0, 0x08022AD4 }, { 0xC3D, 0, 0x08022B48 },
+ { 0xC3E, 0, 0x08022C14 }, { 0xC3F, 0, 0x08022C48 }, { 0xC40, 0, 0x08022C78 }, { 0xC41, 0, 0x08022CB0 },
+ { 0xC42, 0, 0x08022CFC }, { 0xC43, 0, 0x08022D64 }, { 0xC44, 0, 0x08022D84 }, { 0xC45, 0, 0x08022DEC },
+ { 0xC46, 0, 0x08022EBC }, { 0xC47, 0, 0x08022F9C }, { 0xC48, 0, 0x08023004 }, { 0xC49, 0, 0x08023024 },
+ { 0xC4A, 0, 0x080230B0 }, { 0xC4B, 0, 0x080230E0 }, { 0xC4C, 0, 0x080231E4 }, { 0xC4D, 0, 0x0802329C },
+ { 0xC4E, 0, 0x080232FC }, { 0xC4F, 0, 0x08023360 }, { 0xC50, 0, 0x080233BC }, { 0xC51, 0, 0x080233F4 },
+ { 0xC52, 0, 0x0802352C }, { 0xC53, 0, 0x08023550 }, { 0xC54, 0, 0x08023640 }, { 0xC55, 0, 0x08023668 },
+ { 0xC56, 0, 0x080236A4 }, { 0xC57, 0, 0x080236F4 }, { 0xC58, 0, 0x08023788 }, { 0xC80, 0, 0x080237C4 },
+ { 0xC81, 0, 0x08023824 }, { 0xC82, 0, 0x080238F0 }, { 0xC83, 0, 0x08023920 }, { 0xC84, 0, 0x080239E4 },
+ { 0xC85, 0, 0x08023B24 }, { 0xC86, 0, 0x08023B58 }, { 0xC87, 0, 0x08023C3C }, { 0xC88, 0, 0x08023CF0 },
+ { 0xC89, 0, 0x08023D44 }, { 0xC8A, 0, 0x08023D80 }, { 0xC8B, 0, 0x08023DB0 }, { 0xC8C, 0, 0x08023E0C },
+ { 0xC8D, 0, 0x08023E60 }, { 0xC8E, 0, 0x08023E90 }, { 0xC8F, 0, 0x08023F40 }, { 0xC90, 0, 0x08023FA0 },
+ { 0xC91, 0, 0x0802400C }, { 0xC92, 0, 0x08024058 }, { 0xC93, 0, 0x080240D0 }, { 0xC94, 0, 0x0802410C },
+ { 0xCE4, 0, 0x08024164 }, { 0xCE5, 0, 0x080241D4 }, { 0xCE6, 0, 0x08024254 }, { 0xCE7, 0, 0x08024304 },
+ { 0xCE8, 0, 0x08024330 }, { 0xCE9, 0, 0x08024360 }, { 0xCEA, 0, 0x0802444C }, { 0xCEB, 0, 0x08024470 },
+ { 0xCEC, 0, 0x080244E8 }, { 0xCED, 0, 0x08024548 }, { 0xCEE, 0, 0x08024634 }, { 0xCEF, 0, 0x08024718 },
+ { 0xCF0, 0, 0x0802476C }, { 0xCF1, 0, 0x080247F8 }, { 0xCF2, 0, 0x0802483C }, { 0xCF3, 0, 0x08024880 },
+ { 0xCF4, 0, 0x08024918 }, { 0xCF5, 0, 0x08024994 }, { 0xCF6, 0, 0x08024B58 }, { 0xCF7, 0, 0x08024BD8 },
+ { 0xCF8, 0, 0x08024C84 }, { 0xCF9, 0, 0x08024D10 }, { 0xCFA, 0, 0x08024D44 }, { 0xCFB, 0, 0x08024D8C },
+ { 0xCFC, 0, 0x08024DB8 }, { 0xCFD, 0, 0x08024DFC }, { 0xCFE, 0, 0x08024E6C }, { 0xCFF, 0, 0x08024EA4 },
+ { 0xD00, 0, 0x08024ED4 }, { 0xD01, 0, 0x08024F4C }, { 0xD02, 0, 0x08024F8C }, { 0xD03, 0, 0x08024FDC },
+ { 0xD04, 0, 0x08025040 }, { 0xD05, 0, 0x080250D8 }, { 0xD06, 0, 0x08025100 }, { 0xD07, 0, 0x08025134 },
+ { 0xD08, 0, 0x0802516C }, { 0xD09, 0, 0x080251B4 }, { 0xD0A, 0, 0x080251E0 }, { 0xD0B, 0, 0x08025260 },
+ { 0xD0C, 0, 0x080252AC }, { 0xD0D, 0, 0x080252E4 }, { 0xD0E, 0, 0x08025330 }, { 0xD0F, 0, 0x08025358 },
+ { 0xD10, 0, 0x08025394 }, { 0xD11, 0, 0x080253C8 }, { 0xD12, 0, 0x08025434 }, { 0xD13, 0, 0x0802547C },
+ { 0xD14, 0, 0x080254C0 }, { 0xD15, 0, 0x0802550C }, { 0xD16, 0, 0x08025550 }, { 0xD17, 0, 0x080255A4 },
+ { 0xD18, 0, 0x080255DC }, { 0xD19, 0, 0x080255FC }, { 0xD1A, 0, 0x0802563C }, { 0xD1B, 0, 0x080256C8 },
+ { 0xD1C, 0, 0x08025708 }, { 0xD1D, 0, 0x0802575C }, { 0xD1E, 0, 0x080257B8 }, { 0xD1F, 0, 0x08025814 },
+ { 0xD20, 0, 0x08025874 }, { 0xD21, 0, 0x080258EC }, { 0xD48, 0, 0x08025960 }, { 0xD49, 0, 0x0802597C },
+ { 0xD4A, 0, 0x080259B8 }, { 0xD4B, 0, 0x080259F8 }, { 0xD4C, 0, 0x08025A9C }, { 0xD4D, 0, 0x08025AF4 },
+ { 0xD4E, 0, 0x08025B4C }, { 0xD4F, 0, 0x08025B80 }, { 0xD5E, 0, 0x08025BBC }, { 0xD5F, 0, 0x08025BD8 },
+ { 0xD60, 0, 0x08025BFC }, { 0xD61, 0, 0x08025C3C }, { 0xD62, 0, 0x08025C7C }, { 0xD63, 0, 0x08025CE0 },
+ { 0xD64, 0, 0x08025D64 }, { 0xD65, 0, 0x08025D90 }, { 0xD66, 0, 0x08025DC0 }, { 0xD67, 0, 0x08025E34 },
+ { 0xD68, 0, 0x08025E74 }, { 0xD69, 0, 0x08025EB0 }, { 0xD6A, 0, 0x08025EE4 }, { 0xD6B, 0, 0x08025F14 },
+ { 0xD6C, 0, 0x08025F4C }, { 0xD6D, 0, 0x08025F9C }, { 0xD6E, 0, 0x08025FEC }, { 0xD6F, 0, 0x08026024 },
+ { 0xD70, 0, 0x08026064 }, { 0xD71, 0, 0x080260D4 }, { 0xD72, 0, 0x0802613C }, { 0xD73, 0, 0x08026190 },
+ { 0xD74, 0, 0x080261E4 }, { 0xD75, 0, 0x0802621C }, { 0xD76, 0, 0x0802626C }, { 0xD77, 0, 0x08026354 },
+ { 0xD78, 0, 0x0802637C }, { 0xD79, 0, 0x080263C8 }, { 0xD7A, 0, 0x08026444 }, { 0xD7B, 0, 0x08026490 },
+ { 0xD7C, 0, 0x080264EC }, { 0xD7D, 0, 0x08026548 }, { 0xD7E, 0, 0x08026598 }, { 0xD7F, 0, 0x080265C4 },
+ { 0xD80, 0, 0x080265F8 }, { 0xD81, 0, 0x08026628 }, { 0xD82, 0, 0x08026658 }, { 0xD83, 0, 0x08026688 },
+ { 0xD84, 0, 0x080266D0 }, { 0xD85, 0, 0x08026728 }, { 0xD86, 0, 0x08026770 }, { 0xD87, 0, 0x080267B4 },
+ { 0xD88, 0, 0x08026850 }, { 0xD89, 0, 0x080268B0 }, { 0xD8A, 0, 0x08026998 }, { 0xD8B, 0, 0x08026A5C },
+ { 0xDAC, 0, 0x08026AA0 }, { 0xDAD, 0, 0x08026AC8 }, { 0xDAE, 0, 0x08026B04 }, { 0xDAF, 0, 0x08026B9C },
+ { 0xDB0, 0, 0x08026BDC }, { 0xDB1, 0, 0x08026C6C }, { 0xDB2, 0, 0x08026CD8 }, { 0xDB3, 0, 0x08026D4C },
+ { 0xDB4, 0, 0x08026DB4 }, { 0xDB5, 0, 0x08026E34 }, { 0xDB6, 0, 0x08026EA4 }, { 0xDB7, 0, 0x08026EBC },
+ { 0xDB8, 0, 0x08026EE8 }, { 0xDB9, 0, 0x08026F28 }, { 0xDBA, 0, 0x08026F70 }, { 0xDBB, 0, 0x08026FA0 },
+ { 0xDBC, 0, 0x0802701C }, { 0xDBD, 0, 0x08027070 }, { 0xDBE, 0, 0x08027088 }, { 0xDBF, 0, 0x080270BC },
+ { 0xDC0, 0, 0x080270E0 }, { 0xDC1, 0, 0x0802713C }, { 0xDC2, 0, 0x08027194 }, { 0xDC3, 0, 0x08027220 },
+ { 0xDC4, 0, 0x0802727C }, { 0xDC5, 0, 0x08027300 }, { 0xDC6, 0, 0x08027334 }, { 0xDC7, 0, 0x08027370 },
+ { 0xDC8, 0, 0x08027394 }, { 0xDC9, 0, 0x080273A8 }, { 0xDCA, 0, 0x080273D0 }, { 0xDCB, 0, 0x08027414 },
+ { 0xDCC, 0, 0x0802744C }, { 0xDCD, 0, 0x080274BC }, { 0xDCE, 0, 0x08027500 }, { 0xDCF, 0, 0x080275D4 },
+ { 0xDD0, 0, 0x0802762C }, { 0xDD1, 0, 0x08027668 }, { 0xDD2, 0, 0x08027684 }, { 0xDD3, 0, 0x080276D8 },
+ { 0xDD4, 0, 0x08027710 }, { 0xDD5, 0, 0x0802773C }, { 0xDD6, 0, 0x08027760 }, { 0xDD7, 0, 0x08027798 },
+ { 0xDD8, 0, 0x080277C0 }, { 0xDD9, 0, 0x08027824 }, { 0xDDA, 0, 0x080278AC }, { 0xDDB, 0, 0x08027934 },
+ { 0xDDC, 0, 0x08027984 }, { 0xDDD, 0, 0x080279E8 }, { 0xDDE, 0, 0x08027A70 }, { 0xDDF, 0, 0x08027AE8 },
+ { 0xDE0, 0, 0x08027B28 }, { 0xDE1, 0, 0x08027B84 }, { 0xDE2, 0, 0x08027BF4 }, { 0xDE3, 0, 0x08027C40 },
+ { 0xDE4, 0, 0x08027C84 }, { 0xDE5, 0, 0x08027CC8 }, { 0xDE6, 0, 0x08027D3C }, { 0xDE7, 0, 0x08027D8C },
+ { 0xDE8, 0, 0x08027DBC }, { 0xDE9, 0, 0x08027DEC }, { 0xDEA, 0, 0x08027E78 }, { 0xDEB, 0, 0x08027EBC },
+ { 0xDEC, 0, 0x08027EE4 }, { 0xDED, 0, 0x08027F4C }, { 0xDEE, 0, 0x08027F9C }, { 0xDEF, 0, 0x0802800C },
+ { 0xDF0, 0, 0x08028058 }, { 0xDF1, 0, 0x080280A4 }, { 0xDF2, 0, 0x080280DC }, { 0xDF3, 0, 0x08028134 },
+ { 0xDF4, 0, 0x080281B0 }, { 0xDF5, 0, 0x080281E8 }, { 0xDF6, 0, 0x08028234 }, { 0xDF7, 0, 0x08028264 },
+ { 0xDF8, 0, 0x080282C0 }, { 0xDF9, 0, 0x080282F8 }, { 0xDFA, 0, 0x08028378 }, { 0xDFB, 0, 0x080283C4 },
+ { 0xDFC, 0, 0x080283FC }, { 0xDFD, 0, 0x08028444 }, { 0xDFE, 0, 0x08028478 }, { 0xDFF, 0, 0x080284BC },
+ { 0xE02, 0, 0x080284F4 }, { 0xE03, 0, 0x08028540 }, { 0xE04, 0, 0x08028588 }, { 0xE05, 0, 0x080285C8 },
+ { 0xE06, 0, 0x08028604 }, { 0xE07, 0, 0x08028620 }, { 0xE10, 0, 0x08028670 }, { 0xE11, 0, 0x080286AC },
+ { 0xE12, 0, 0x08028744 }, { 0xE13, 0, 0x080287C4 }, { 0xE14, 0, 0x0802885C }, { 0xE15, 0, 0x08028940 },
+ { 0xE16, 0, 0x080289D4 }, { 0xE17, 0, 0x08028A20 }, { 0xE18, 0, 0x08028A58 }, { 0xE19, 0, 0x08028AA8 },
+ { 0xE1A, 0, 0x08028B5C }, { 0xE1B, 0, 0x08028B8C }, { 0xE1C, 0, 0x08028BF0 }, { 0xE1D, 0, 0x08028C38 },
+ { 0xE1E, 0, 0x08028C98 }, { 0xE1F, 0, 0x08028CBC }, { 0xE20, 0, 0x08028D10 }, { 0xE21, 0, 0x08028D28 },
+ { 0xE22, 0, 0x08028D68 }, { 0xE23, 0, 0x08028DC8 }, { 0xE24, 0, 0x08028E24 }, { 0xE25, 0, 0x08028E44 },
+ { 0xE26, 0, 0x08028E88 }, { 0xE27, 0, 0x08028ED0 }, { 0xE28, 0, 0x08028EEC }, { 0xE29, 0, 0x08028F40 },
+ { 0xE2A, 0, 0x08028F9C }, { 0xE2B, 0, 0x08029010 }, { 0xE2C, 0, 0x08029078 }, { 0xE2D, 0, 0x08029104 },
+ { 0xE2E, 0, 0x08029174 }, { 0xE2F, 0, 0x080291D4 }, { 0xE30, 0, 0x08029238 }, { 0xE31, 0, 0x080292B8 },
+ { 0xE32, 0, 0x0802933C }, { 0xE42, 0, 0x0802939C }, { 0xE43, 0, 0x080293FC }, { 0xE44, 0, 0x08029428 },
+ { 0xE45, 0, 0x080294A8 }, { 0xE46, 0, 0x08029500 }, { 0xE47, 0, 0x080295A0 }, { 0xE48, 0, 0x080295C4 },
+ { 0xE49, 0, 0x08029634 }, { 0xE4A, 0, 0x0802969C }, { 0xE4B, 0, 0x08029704 }, { 0xE4C, 0, 0x08029774 },
+ { 0xE4D, 0, 0x080297D4 }, { 0xE4E, 0, 0x08029860 }, { 0xE4F, 0, 0x080298C8 }, { 0xE50, 0, 0x08029948 },
+ { 0xE51, 0, 0x080299D0 }, { 0xE52, 0, 0x08029A30 }, { 0xE74, 0, 0x08029AC0 }, { 0xE75, 0, 0x08029B20 },
+ { 0xE76, 0, 0x08029B74 }, { 0xE77, 0, 0x08029BD4 }, { 0xE78, 0, 0x08029C48 }, { 0xE79, 0, 0x08029C9C },
+ { 0xE7A, 0, 0x08029CB0 }, { 0xE7B, 0, 0x08029CCC }, { 0xE7C, 0, 0x08029D58 }, { 0xE7D, 0, 0x08029DAC },
+ { 0xE7E, 0, 0x08029DC0 }, { 0xE7F, 0, 0x08029E10 }, { 0xE80, 0, 0x08029E74 }, { 0xE81, 0, 0x08029ED4 },
+ { 0xE82, 0, 0x08029F2C }, { 0xE83, 0, 0x08029F54 }, { 0xE84, 0, 0x08029FCC }, { 0xE85, 0, 0x0802A03C },
+ { 0xE86, 0, 0x0802A090 }, { 0xE87, 0, 0x0802A0D8 }, { 0xE88, 0, 0x0802A128 }, { 0xE89, 0, 0x0802A1BC },
+ { 0xE8A, 0, 0x0802A1F4 }, { 0xE8B, 0, 0x0802A260 }, { 0xE8C, 0, 0x0802A2A4 }, { 0xE8D, 0, 0x0802A2F4 },
+ { 0xE8E, 0, 0x0802A334 }, { 0xE8F, 0, 0x0802A37C }, { 0xE90, 0, 0x0802A3DC }, { 0xE91, 0, 0x0802A448 },
+ { 0xE92, 0, 0x0802A47C }, { 0xE93, 0, 0x0802A4A8 }, { 0xE94, 0, 0x0802A550 }, { 0xE95, 0, 0x0802A5B0 },
+ { 0xE97, 0, 0x0802A608 }, { 0xE98, 0, 0x0802A69C }, { 0xE99, 0, 0x0802A6F0 }, { 0xFA0, 0, 0x0802A760 },
+ { 0xFA1, 0, 0x0802A79C }, { 0xFA2, 0, 0x0802A7F4 }, { 0xFA3, 0, 0x0802A84C }, { 0xFA4, 0, 0x0802A8F4 },
+ { 0xFA5, 0, 0x0802AA24 }, { 0xFA6, 0, 0x0802AAA0 }, { 0xFA7, 0, 0x0802AB04 }, { 0xFA8, 0, 0x0802ABA0 },
+ { 0xFA9, 0, 0x0802AC08 }, { 0xFAA, 0, 0x0802ACA4 }, { 0xFAB, 0, 0x0802AD1C }, { 0xFAC, 0, 0x0802AD8C },
+ { 0xFAD, 0, 0x0802ADF4 }, { 0xFAE, 0, 0x0802AE90 }, { 0xFAF, 0, 0x0802AF00 }, { 0xFB0, 0, 0x0802AF70 },
+ { 0xFB1, 0, 0x0802B018 }, { 0xFB2, 0, 0x0802B0B8 }, { 0xFB3, 0, 0x0802B110 }, { 0xFB4, 0, 0x0802B190 },
+ { 0xFB5, 0, 0x0802B24C }, { 0xFB6, 0, 0x0802B288 }, { 0xFB7, 0, 0x0802B2E4 }, { 0xFB8, 0, 0x0802B314 },
+ { 0xFB9, 0, 0x0802B39C }, { 0xFBA, 0, 0x0802B40C }, { 0xFBB, 0, 0x0802B488 }, { 0xFBC, 0, 0x0802B4EC },
+ { 0xFBD, 0, 0x0802B598 }, { 0xFBE, 0, 0x0802B650 }, { 0xFBF, 0, 0x0802B6F8 }, { 0x1004, 0, 0x0802B750 },
+ { 0x1005, 0, 0x0802B778 }, { 0x1006, 0, 0x0802B7A0 }, { 0x1007, 0, 0x0802B7C8 }, { 0x1008, 0, 0x0802B7EC },
+ { 0x1009, 0, 0x0802B84C }, { 0x100A, 0, 0x0802B890 }, { 0x100B, 0, 0x0802B8D8 }, { 0x100C, 0, 0x0802B908 },
+ { 0x100D, 0, 0x0802B97C }, { 0x100E, 0, 0x0802BA00 }, { 0x100F, 0, 0x0802BA54 }, { 0x1010, 0, 0x0802BAC0 },
+ { 0x1011, 0, 0x0802BB28 }, { 0x1012, 0, 0x0802BB94 }, { 0x1013, 0, 0x0802BC18 }, { 0x1014, 0, 0x0802BC44 },
+ { 0x1015, 0, 0x0802BC88 }, { 0x1016, 0, 0x0802BCE0 }, { 0x1017, 0, 0x0802BD24 }, { 0x1018, 0, 0x0802BD8C },
+ { 0x1019, 0, 0x0802BE18 }, { 0x101A, 0, 0x0802BE80 }, { 0x101B, 0, 0x0802BF84 }, { 0x101C, 0, 0x0802C048 },
+ { 0x101D, 0, 0x0802C064 }, { 0x101E, 0, 0x0802C15C }, { 0x101F, 0, 0x0802C284 }, { 0x1020, 0, 0x0802C3BC },
+ { 0x1021, 0, 0x0802C3D4 }, { 0x1022, 0, 0x0802C438 }, { 0x1023, 0, 0x0802C470 }, { 0x1024, 0, 0x0802C494 },
+ { 0x1025, 0, 0x0802C4C4 }, { 0x1026, 0, 0x0802C4F8 }, { 0x1027, 0, 0x0802C564 }, { 0x1028, 0, 0x0802C5F8 },
+ { 0x1029, 0, 0x0802C67C }, { 0x102A, 0, 0x0802C6DC }, { 0x102B, 0, 0x0802C73C }, { 0x102C, 0, 0x0802C798 },
+ { 0x102D, 0, 0x0802C824 }, { 0x102E, 0, 0x0802C87C }, { 0x102F, 0, 0x0802C8B8 }, { 0x1030, 0, 0x0802C928 },
+ { 0x1031, 0, 0x0802CA60 }, { 0x1032, 0, 0x0802CAB4 }, { 0x1033, 0, 0x0802CB00 }, { 0x1034, 0, 0x0802CB3C },
+ { 0x1035, 0, 0x0802CB94 }, { 0x1036, 0, 0x0802CBF0 }, { 0x1037, 0, 0x0802CC28 }, { 0x1038, 0, 0x0802CC80 },
+ { 0x1039, 0, 0x0802CCE0 }, { 0x103A, 0, 0x0802CD30 }, { 0x103B, 0, 0x0802CD64 }, { 0x103C, 0, 0x0802CDDC },
+ { 0x1068, 0, 0x0802CE10 }, { 0x1069, 0, 0x0802CE64 }, { 0x106A, 0, 0x0802CF30 }, { 0x106B, 0, 0x0802CF90 },
+ { 0x106C, 0, 0x0802CFD4 }, { 0x106D, 0, 0x0802D07C }, { 0x106E, 0, 0x0802D0C0 }, { 0x106F, 0, 0x0802D110 },
+ { 0x1070, 0, 0x0802D178 }, { 0x1071, 0, 0x0802D1C4 }, { 0x1072, 0, 0x0802D234 }, { 0x1073, 0, 0x0802D27C },
+ { 0x1074, 0, 0x0802D2BC }, { 0x1075, 0, 0x0802D314 }, { 0x1076, 0, 0x0802D354 }, { 0x1077, 0, 0x0802D3AC },
+ { 0x1078, 0, 0x0802D3F0 }, { 0x1079, 0, 0x0802D434 }, { 0x107A, 0, 0x0802D4AC }, { 0x107B, 0, 0x0802D4EC },
+ { 0x107C, 0, 0x0802D554 }, { 0x107D, 0, 0x0802D5A8 }, { 0x107E, 0, 0x0802D5FC }, { 0x107F, 0, 0x0802D69C },
+ { 0x1080, 0, 0x0802D6E8 }, { 0x1081, 0, 0x0802D744 }, { 0x1082, 0, 0x0802D7A4 }, { 0x1083, 0, 0x0802D7EC },
+ { 0x1084, 0, 0x0802D82C }, { 0x1085, 0, 0x0802D8B0 }, { 0x1086, 0, 0x0802D8F0 }, { 0x1087, 0, 0x0802D954 },
+ { 0x1088, 0, 0x0802D9DC }, { 0x1089, 0, 0x0802DA24 }, { 0x108A, 0, 0x0802DA8C }, { 0x108B, 0, 0x0802DACC },
+ { 0x108C, 0, 0x0802DB30 }, { 0x108D, 0, 0x0802DBA0 }, { 0x108E, 0, 0x0802DBF4 }, { 0x108F, 0, 0x0802DC28 },
+ { 0x1090, 0, 0x0802DC94 }, { 0x1091, 0, 0x0802DCFC }, { 0x1092, 0, 0x0802DDC0 }, { 0x1093, 0, 0x0802DE18 },
+ { 0x1094, 0, 0x0802DEA0 }, { 0x1095, 0, 0x0802DF10 }, { 0x1096, 0, 0x0802DF78 }, { 0x1097, 0, 0x0802DFE0 },
+ { 0x1098, 0, 0x0802E024 }, { 0x1099, 0, 0x0802E088 }, { 0x109A, 0, 0x0802E170 }, { 0x109B, 0, 0x0802E1F8 },
+ { 0x109C, 0, 0x0802E240 }, { 0x109D, 0, 0x0802E290 }, { 0x109E, 0, 0x0802E2D8 }, { 0x109F, 0, 0x0802E308 },
+ { 0x10A0, 0, 0x0802E364 }, { 0x10A1, 0, 0x0802E3B8 }, { 0x10A2, 0, 0x0802E3DC }, { 0x10A3, 0, 0x0802E480 },
+ { 0x10A4, 0, 0x0802E4D4 }, { 0x10A5, 0, 0x0802E53C }, { 0x10A6, 0, 0x0802E624 }, { 0x10A7, 0, 0x0802E68C },
+ { 0x10A8, 0, 0x0802E738 }, { 0x10A9, 0, 0x0802E78C }, { 0x10CE, 0, 0x0802E830 }, { 0x10CF, 0, 0x0802E878 },
+ { 0x10D0, 0, 0x0802E8CC }, { 0x10D1, 0, 0x0802E90C }, { 0x10D2, 0, 0x0802E970 }, { 0x10D3, 0, 0x0802E9A4 },
+ { 0x10D4, 0, 0x0802E9D0 }, { 0x10D6, 0, 0x0802EA7C }, { 0x10D7, 0, 0x0802EB50 }, { 0x10D8, 0, 0x0802EB6C },
+ { 0x10D9, 0, 0x0802EBA0 }, { 0x10DA, 0, 0x0802EBC8 }, { 0x10DB, 0, 0x0802EC10 }, { 0x10DC, 0, 0x0802EC40 },
+ { 0x10DD, 0, 0x0802EC6C }, { 0x10DE, 0, 0x0802ECA8 }, { 0x10DF, 0, 0x0802ECD8 }, { 0x10E0, 0, 0x0802ED14 },
+ { 0x10E1, 0, 0x0802ED40 }, { 0x10E2, 0, 0x0802ED68 }, { 0x10E3, 0, 0x0802EDA0 }, { 0x10E4, 0, 0x0802EE18 },
+ { 0x10E5, 0, 0x0802EE44 }, { 0x10E6, 0, 0x0802EEB0 }, { 0x10E7, 0, 0x0802EEE8 }, { 0x10E8, 0, 0x0802EF24 },
+ { 0x10E9, 0, 0x0802EF84 }, { 0x10EA, 0, 0x0802EFCC }, { 0x10EB, 0, 0x0802EFF8 }, { 0x10EC, 0, 0x0802F030 },
+ { 0x10ED, 0, 0x0802F078 }, { 0x10EE, 0, 0x0802F0B4 }, { 0x10EF, 0, 0x0802F0E0 }, { 0x10F0, 0, 0x0802F110 },
+ { 0x10F1, 0, 0x0802F14C }, { 0x10F2, 0, 0x0802F184 }, { 0x10F3, 0, 0x0802F1A8 }, { 0x10F4, 0, 0x0802F1D4 },
+ { 0x10F5, 0, 0x0802F204 }, { 0x10F6, 0, 0x0802F258 }, { 0x10F7, 0, 0x0802F28C }, { 0x10F8, 0, 0x0802F2D4 },
+ { 0x10F9, 0, 0x0802F30C }, { 0x10FA, 0, 0x0802F334 }, { 0x10FB, 0, 0x0802F3A8 }, { 0x10FC, 0, 0x0802F3D8 },
+ { 0x10FD, 0, 0x0802F408 }, { 0x10FE, 0, 0x0802F44C }, { 0x10FF, 0, 0x0802F484 }, { 0x1100, 0, 0x0802F4CC },
+ { 0x1101, 0, 0x0802F500 }, { 0x1102, 0, 0x0802F590 }, { 0x1103, 0, 0x0802F5CC }, { 0x1104, 0, 0x0802F604 },
+ { 0x1105, 0, 0x0802F660 }, { 0x1106, 0, 0x0802F694 }, { 0x1107, 0, 0x0802F6B8 }, { 0x1108, 0, 0x0802F730 },
+ { 0x1109, 0, 0x0802F7B4 }, { 0x1130, 0, 0x0802F7D8 }, { 0x1131, 0, 0x0802F7F4 }, { 0x1132, 0, 0x0802F82C },
+ { 0x1133, 0, 0x0802F8C0 }, { 0x1134, 0, 0x0802F8E8 }, { 0x1135, 0, 0x0802F8F4 }, { 0x1136, 0, 0x0802F900 },
+ { 0x1137, 0, 0x0802F960 }, { 0x1138, 0, 0x0802F9D0 }, { 0x1139, 0, 0x0802FA70 }, { 0x113A, 0, 0x0802FB2C },
+ { 0x113B, 0, 0x0802FB64 }, { 0x113C, 0, 0x0802FBF4 }, { 0x113D, 0, 0x0802FC4C }, { 0x113E, 0, 0x0802FCA0 },
+ { 0x113F, 0, 0x0802FD10 }, { 0x1140, 0, 0x0802FDA8 }, { 0x1141, 0, 0x0802FE38 }, { 0x1142, 0, 0x0802FE7C },
+ { 0x1143, 0, 0x0802FEBC }, { 0x1144, 0, 0x0802FEF8 }, { 0x1145, 0, 0x0802FF58 }, { 0x1146, 0, 0x0802FFB4 },
+ { 0x1147, 0, 0x08030004 }, { 0x1148, 0, 0x08030018 }, { 0x1149, 0, 0x080300B8 }, { 0x114A, 0, 0x08030114 },
+ { 0x114B, 0, 0x08030170 }, { 0x114C, 0, 0x080301CC }, { 0x114D, 0, 0x08030228 }, { 0x114E, 0, 0x08030284 },
+ { 0x114F, 0, 0x080302E0 }, { 0x1150, 0, 0x08030318 }, { 0x1151, 0, 0x080303C8 }, { 0x1152, 0, 0x080303DC },
+ { 0x1194, 0, 0x08030438 }, { 0x1195, 0, 0x08030458 }, { 0x1196, 0, 0x080304AC }, { 0x1197, 0, 0x080304E0 },
+ { 0x1198, 0, 0x08030578 }, { 0x1199, 0, 0x080305E4 }, { 0x119A, 0, 0x080305FC }, { 0x119B, 0, 0x08030638 },
+ { 0x119C, 0, 0x080306D0 }, { 0x119D, 0, 0x08030748 }, { 0x119E, 0, 0x08030770 }, { 0x119F, 0, 0x08030784 },
+ { 0x11A0, 0, 0x080307EC }, { 0x11A1, 0, 0x08030828 }, { 0x11A2, 0, 0x080308E0 }, { 0x11A3, 0, 0x08030918 },
+ { 0x11A4, 0, 0x08030934 }, { 0x11A5, 0, 0x08030948 }, { 0x11A6, 0, 0x080309BC }, { 0x11A7, 0, 0x080309E8 },
+ { 0x11A8, 0, 0x08030A38 }, { 0x11A9, 0, 0x08030A60 }, { 0x11AA, 0, 0x08030AA0 }, { 0x11AB, 0, 0x08030ADC },
+ { 0x11AC, 0, 0x08030B10 }, { 0x11AD, 0, 0x08030B40 }, { 0x11AE, 0, 0x08030B80 }, { 0x11AF, 0, 0x08030BB4 },
+ { 0x11F8, 0, 0x08030BFC }, { 0x11F9, 0, 0x08030C64 }, { 0x11FA, 0, 0x08030CA0 }, { 0x11FB, 0, 0x08030D28 },
+ { 0x11FC, 0, 0x08030D58 }, { 0x11FD, 0, 0x08030E14 }, { 0x11FE, 0, 0x08030E94 }, { 0x11FF, 0, 0x08030F2C },
+ { 0x1200, 0, 0x08030F6C }, { 0x1201, 0, 0x08031004 }, { 0x1202, 0, 0x08031038 }, { 0x1203, 0, 0x080310A4 },
+ { 0x1204, 0, 0x08031110 }, { 0x1205, 0, 0x08031154 }, { 0x1206, 0, 0x080311EC }, { 0x1207, 0, 0x08031230 },
+ { 0x1208, 0, 0x08031290 }, { 0x1209, 0, 0x080312C4 }, { 0x120A, 0, 0x08031304 }, { 0x120B, 0, 0x08031320 },
+ { 0x120C, 0, 0x08031348 }, { 0x120D, 0, 0x08031390 }, { 0x120E, 0, 0x080313DC }, { 0x120F, 0, 0x08031470 },
+ { 0x1210, 0, 0x08031498 }, { 0x1211, 0, 0x08031520 }, { 0x1212, 0, 0x08031580 }, { 0x1213, 0, 0x080315A8 },
+ { 0x1214, 0, 0x08031644 }, { 0x1215, 0, 0x080316AC }, { 0x1216, 0, 0x08031708 }, { 0x1217, 0, 0x0803176C },
+ { 0x1218, 0, 0x080317BC }, { 0x1219, 0, 0x080317E8 }, { 0x121A, 0, 0x08031834 }, { 0x121B, 0, 0x080318B8 },
+ { 0x121C, 0, 0x08031900 }, { 0x121D, 0, 0x08031930 }, { 0x121E, 0, 0x08031984 }, { 0x121F, 0, 0x080319C8 },
+ { 0x1220, 0, 0x08031A08 }, { 0x1221, 0, 0x08031A7C }, { 0x1222, 0, 0x08031AFC }, { 0x1223, 0, 0x08031B68 },
+ { 0x1224, 0, 0x08031BC0 }, { 0x1225, 0, 0x08031C10 }, { 0x1226, 0, 0x08031CD4 }, { 0x1227, 0, 0x08031D38 },
+ { 0x1228, 0, 0x08031DC0 }, { 0x1229, 0, 0x08031E00 }, { 0x122A, 0, 0x08031E54 }, { 0x122B, 0, 0x08031E80 },
+ { 0x122C, 0, 0x08031EF8 }, { 0x122D, 0, 0x08031F1C }, { 0x122E, 0, 0x08031FA4 }, { 0x122F, 0, 0x0803202C },
+ { 0x1230, 0, 0x08032050 }, { 0x1231, 0, 0x0803210C }, { 0x1232, 0, 0x08032148 }, { 0x1233, 0, 0x080321B4 },
+ { 0x1234, 0, 0x08032200 }, { 0x1235, 0, 0x08032250 }, { 0x1236, 0, 0x080322C4 }, { 0x1237, 0, 0x08032330 },
+ { 0x1238, 0, 0x08032364 }, { 0x1239, 0, 0x08032414 }, { 0x123A, 0, 0x08032464 }, { 0x123B, 0, 0x08032504 },
+ { 0x123C, 0, 0x08032550 }, { 0x123D, 0, 0x080325A4 }, { 0x123E, 0, 0x08032638 }, { 0x123F, 0, 0x08032698 },
+ { 0x1240, 0, 0x080326FC }, { 0x1241, 0, 0x080327D4 }, { 0x1242, 0, 0x0803284C }, { 0x1243, 0, 0x08032904 },
+ { 0x1244, 0, 0x08032964 }, { 0x1245, 0, 0x080329B8 }, { 0x1246, 0, 0x080329E4 }, { 0x1247, 0, 0x08032A54 },
+ { 0x1248, 0, 0x08032AC0 }, { 0x1249, 0, 0x08032B08 }, { 0x124A, 0, 0x08032B68 }, { 0x124B, 0, 0x08032BC4 },
+ { 0x124C, 0, 0x08032BE0 }, { 0x124D, 0, 0x08032C24 }, { 0x124E, 0, 0x08032C68 }, { 0x124F, 0, 0x08032CD8 },
+ { 0x1250, 0, 0x08032D1C }, { 0x1251, 0, 0x08032D6C }, { 0x1252, 0, 0x08032DE4 }, { 0x1253, 0, 0x08032E0C },
+ { 0x1254, 0, 0x08032E60 }, { 0x1255, 0, 0x08032EC4 }, { 0x1256, 0, 0x08032F38 }, { 0x1257, 0, 0x08032F7C },
+ { 0x1258, 0, 0x08032FF4 }, { 0x1259, 0, 0x08033030 }, { 0x125A, 0, 0x080330BC }, { 0x125B, 0, 0x080330F8 },
+ { 0x125C, 0, 0x0803319C }, { 0x125D, 0, 0x08033224 }, { 0x125E, 0, 0x080332D0 }, { 0x125F, 0, 0x08033358 },
+ { 0x1260, 0, 0x080333CC }, { 0x1261, 0, 0x08033410 }, { 0x1262, 0, 0x08033450 }, { 0x1263, 0, 0x080334BC },
+ { 0x1264, 0, 0x080334F4 }, { 0x1265, 0, 0x0803353C }, { 0x1266, 0, 0x08033588 }, { 0x1267, 0, 0x080335F4 },
+ { 0x1268, 0, 0x08033678 }, { 0x1269, 0, 0x0803370C }, { 0x126A, 0, 0x08033778 }, { 0x126B, 0, 0x080337CC },
+ { 0x126C, 0, 0x08033830 }, { 0x126D, 0, 0x080338B0 }, { 0x126E, 0, 0x08033934 }, { 0x126F, 0, 0x0803397C },
+ { 0x1270, 0, 0x080339F0 }, { 0x1271, 0, 0x08033A14 }, { 0x1272, 0, 0x08033A44 }, { 0x1273, 0, 0x08033A88 },
+ { 0x1274, 0, 0x08033AE0 }, { 0x1275, 0, 0x08033B74 }, { 0x1276, 0, 0x08033BC0 }, { 0x1277, 0, 0x08033C24 },
+ { 0x1278, 0, 0x08033CA0 }, { 0x1279, 0, 0x08033D10 }, { 0x127A, 0, 0x08033D80 }, { 0x127B, 0, 0x08033DB4 },
+ { 0x127C, 0, 0x08033E18 }, { 0x127D, 0, 0x08033E68 }, { 0x127E, 0, 0x08033EB4 }, { 0x127F, 0, 0x08033F04 },
+ { 0x1280, 0, 0x08033F58 }, { 0x1281, 0, 0x08033FB8 }, { 0x1282, 0, 0x08034014 }, { 0x1283, 0, 0x08034044 },
+ { 0x1284, 0, 0x0803409C }, { 0x1285, 0, 0x080340EC }, { 0x1286, 0, 0x08034140 }, { 0x1287, 0, 0x080341A0 },
+ { 0x1288, 0, 0x08034204 }, { 0x1289, 0, 0x08034248 }, { 0x128A, 0, 0x080342A8 }, { 0x128B, 0, 0x080342E0 },
+ { 0x128C, 0, 0x08034314 }, { 0x128D, 0, 0x08034340 }, { 0x128E, 0, 0x08034368 }, { 0x128F, 0, 0x080343C8 },
+ { 0x1290, 0, 0x0803445C }, { 0x1291, 0, 0x080344E8 }, { 0x1292, 0, 0x08034528 }, { 0x1293, 0, 0x08034538 },
+ { 0x1294, 0, 0x08034578 }, { 0x1295, 0, 0x080345C4 }, { 0x1296, 0, 0x08034618 }, { 0x1297, 0, 0x08034680 },
+ { 0x1298, 0, 0x080346AC }, { 0x1299, 0, 0x08034728 }, { 0x129A, 0, 0x0803479C }, { 0x129B, 0, 0x08034808 },
+ { 0x129C, 0, 0x08034854 }, { 0x129D, 0, 0x08034888 }, { 0x129E, 0, 0x080348B4 }, { 0x129F, 0, 0x080348FC },
+ { 0x12A0, 0, 0x08034938 }, { 0x12A1, 0, 0x08034984 }, { 0x12A2, 0, 0x080349C4 }, { 0x12A3, 0, 0x08034A24 },
+ { 0x12A4, 0, 0x08034A80 }, { 0x12A5, 0, 0x08034AF0 }, { 0x12A6, 0, 0x08034B40 }, { 0x12A7, 0, 0x08034B74 },
+ { 0x12A8, 0, 0x08034BCC }, { 0x12A9, 0, 0x08034C2C }, { 0x12AA, 0, 0x08034CA0 }, { 0x12AB, 0, 0x08034CDC },
+ { 0x12AC, 0, 0x08034D50 }, { 0x12AD, 0, 0x08034D9C }, { 0x12AE, 0, 0x08034E10 }, { 0x12AF, 0, 0x08034E40 },
+ { 0x12B0, 0, 0x08034E70 }, { 0x12B1, 0, 0x08034EDC }, { 0x12B2, 0, 0x08034F28 }, { 0x12B3, 0, 0x08034F74 },
+ { 0x12B4, 0, 0x08034FA0 }, { 0x12B5, 0, 0x08034FF4 }, { 0x12B6, 0, 0x08035018 }, { 0x12B7, 0, 0x0803504C },
+ { 0x12B8, 0, 0x08035078 }, { 0x12B9, 0, 0x080350C0 }, { 0x12BA, 0, 0x080350F0 }, { 0x12BB, 0, 0x08035134 },
+ { 0x12BC, 0, 0x0803516C }, { 0x12BD, 0, 0x080351D0 }, { 0x12BE, 0, 0x0803521C }, { 0x12BF, 0, 0x08035288 },
+ { 0x12C0, 0, 0x08035308 }, { 0x12C1, 0, 0x0803534C }, { 0x12C2, 0, 0x0803539C }, { 0x12C3, 0, 0x080353CC },
+ { 0x12C4, 0, 0x08035410 }, { 0x12C5, 0, 0x08035470 }, { 0x12C6, 0, 0x080354B8 }, { 0x12C7, 0, 0x08035520 },
+ { 0x12C8, 0, 0x08035560 }, { 0x12C9, 0, 0x08035604 }, { 0x12CA, 0, 0x0803566C }, { 0x12CB, 0, 0x080356A4 },
+ { 0x12CC, 0, 0x080356E4 }, { 0x12CD, 0, 0x0803577C }, { 0x12CE, 0, 0x080357EC }, { 0x12CF, 0, 0x0803581C },
+ { 0x12D0, 0, 0x08035848 }, { 0x12D1, 0, 0x08035888 }, { 0x12D2, 0, 0x080358D0 }, { 0x12D3, 0, 0x080358E8 },
+ { 0x12D4, 0, 0x0803590C }, { 0x12D5, 0, 0x0803592C }, { 0x12D6, 0, 0x0803596C }, { 0x12D7, 0, 0x080359C4 },
+ { 0x12D8, 0, 0x08035A10 }, { 0x12D9, 0, 0x08035A80 }, { 0x12DA, 0, 0x08035ADC }, { 0x12DB, 0, 0x08035B48 },
+ { 0x12DC, 0, 0x08035BB8 }, { 0x12DD, 0, 0x08035BF8 }, { 0x12DE, 0, 0x08035C74 }, { 0x12DF, 0, 0x08035CB0 },
+ { 0x12E0, 0, 0x08035D10 }, { 0x12E3, 0, 0x08035D4C }, { 0x12E4, 0, 0x08035D70 }, { 0x12E5, 0, 0x08035DAC },
+ { 0x12E6, 0, 0x08035DD8 }, { 0x12E7, 0, 0x08035DF4 }, { 0x12E8, 0, 0x08035E0C }, { 0x12E9, 0, 0x08035E58 },
+ { 0x12EA, 0, 0x08035ED4 }, { 0x12EB, 0, 0x08035F44 }, { 0x12EC, 0, 0x08036074 }, { 0x12ED, 0, 0x080360BC },
+ { 0x12EE, 0, 0x08036104 }, { 0x12EF, 0, 0x0803613C }, { 0x12F0, 0, 0x080361A0 }, { 0x12F1, 0, 0x080361F0 },
+ { 0x12F2, 0, 0x08036248 }, { 0x12F3, 0, 0x08036260 }, { 0x12F4, 0, 0x080362A0 }, { 0x12F5, 0, 0x08036300 },
+ { 0x12F6, 0, 0x08036324 }, { 0x12F7, 0, 0x080363A0 }, { 0x12F8, 0, 0x0803640C }, { 0x12F9, 0, 0x08036474 },
+ { 0x12FA, 0, 0x080364CC }, { 0x12FB, 0, 0x08036508 }, { 0x12FC, 0, 0x0803655C }, { 0x12FD, 0, 0x08036578 },
+ { 0x12FE, 0, 0x080365D4 }, { 0x12FF, 0, 0x080365F8 }, { 0x1300, 0, 0x08036654 }, { 0x1301, 0, 0x080366A4 },
+ { 0x1302, 0, 0x080366F0 }, { 0x1303, 0, 0x08036738 }, { 0x1304, 0, 0x08036770 }, { 0x1305, 0, 0x080367AC },
+ { 0x1306, 0, 0x080367F0 }, { 0x1307, 0, 0x08036830 }, { 0x1308, 0, 0x08036850 }, { 0x1309, 0, 0x0803688C },
+ { 0x130A, 0, 0x080368F0 }, { 0x130B, 0, 0x08036924 }, { 0x130C, 0, 0x0803695C }, { 0x130D, 0, 0x080369A8 },
+ { 0x130E, 0, 0x080369FC }, { 0x130F, 0, 0x08036A40 }, { 0x1310, 0, 0x08036A74 }, { 0x1311, 0, 0x08036AB8 },
+ { 0x1312, 0, 0x08036B14 }, { 0x1313, 0, 0x08036B4C }, { 0x1314, 0, 0x08036BAC }, { 0x1315, 0, 0x08036C0C },
+ { 0x1316, 0, 0x08036C64 }, { 0x1317, 0, 0x08036CBC }, { 0x1318, 0, 0x08036D1C }, { 0x1319, 0, 0x08036D80 },
+ { 0x131A, 0, 0x08036DC4 }, { 0x131B, 0, 0x08036E0C }, { 0x131C, 0, 0x08036E8C }, { 0x131D, 0, 0x08036F14 },
+ { 0x1388, 0, 0x08036F8C }, { 0x1389, 0, 0x08036FB4 }, { 0x138A, 0, 0x08036FF8 }, { 0x138B, 0, 0x08037034 },
+ { 0x138C, 0, 0x08037060 }, { 0x138D, 0, 0x0803709C }, { 0x138E, 0, 0x0803711C }, { 0x138F, 0, 0x08037140 },
+ { 0x1390, 0, 0x08037178 }, { 0x1391, 0, 0x080371AC }, { 0x1392, 0, 0x08037204 }, { 0x1393, 0, 0x08037234 },
+ { 0x1394, 0, 0x08037288 }, { 0x1395, 0, 0x080372BC }, { 0x1396, 0, 0x080372F0 }, { 0x1397, 0, 0x08037310 },
+ { 0x1398, 0, 0x08037338 }, { 0x1399, 0, 0x080373C4 }, { 0x139A, 0, 0x08037438 }, { 0x139B, 0, 0x080374A0 },
+ { 0x139C, 0, 0x0803751C }, { 0x139D, 0, 0x0803758C }, { 0x139E, 0, 0x08037620 }, { 0x139F, 0, 0x08037704 },
+ { 0x13A0, 0, 0x08037764 }, { 0x13A1, 0, 0x080377F4 }, { 0x13A2, 0, 0x08037838 }, { 0x13A3, 0, 0x08037894 },
+ { 0x13A4, 0, 0x08037918 }, { 0x13A5, 0, 0x08037974 }, { 0x13A6, 0, 0x080379CC }, { 0x13A7, 0, 0x08037A68 },
+ { 0x13A8, 0, 0x08037ACC }, { 0x13AE, 0, 0x08037B5C }, { 0x13AF, 0, 0x08037BF8 }, { 0x13B0, 0, 0x08037CE0 },
+ { 0x13B1, 0, 0x08037D2C }, { 0x13B2, 0, 0x08037D54 }, { 0x13B3, 0, 0x08037D74 }, { 0x13EC, 0, 0x08037DB8 },
+ { 0x13ED, 0, 0x08037DCC }, { 0x13EE, 0, 0x08037E30 }, { 0x13EF, 0, 0x08037EB4 }, { 0x13F0, 0, 0x08037EF4 },
+ { 0x13F1, 0, 0x08037F34 }, { 0x13F2, 0, 0x08037F74 }, { 0x13F3, 0, 0x08037F8C }, { 0x13F4, 0, 0x08037FA4 },
+ { 0x13F5, 0, 0x08037FC8 }, { 0x13F6, 0, 0x08037FF8 }, { 0x13F7, 0, 0x0803800C }, { 0x13F8, 0, 0x0803803C },
+ { 0x13F9, 0, 0x08038084 }, { 0x13FA, 0, 0x080380C8 }, { 0x13FB, 0, 0x08038108 }, { 0x13FC, 0, 0x080381A4 },
+ { 0x13FD, 0, 0x080381FC }, { 0x13FE, 0, 0x08038254 }, { 0x13FF, 0, 0x080382D8 }, { 0x1400, 0, 0x080383A8 },
+ { 0x1401, 0, 0x08038504 }, { 0x1402, 0, 0x080385A8 }, { 0x1403, 0, 0x08038630 }, { 0x1404, 0, 0x0803868C },
+ { 0x1405, 0, 0x080386C4 }, { 0x1406, 0, 0x08038728 }, { 0x1407, 0, 0x08038824 }, { 0x1408, 0, 0x08038844 },
+ { 0x1409, 0, 0x080388F4 }, { 0x140A, 0, 0x08038984 }, { 0x140B, 0, 0x080389D0 }, { 0x140C, 0, 0x08038A3C },
+ { 0x140D, 0, 0x08038A88 }, { 0x140E, 0, 0x08038AE8 }, { 0x140F, 0, 0x08038B20 }, { 0x1410, 0, 0x08038B60 },
+ { 0x1411, 0, 0x08038BBC }, { 0x1412, 0, 0x08038BF4 }, { 0x1413, 0, 0x08038C34 }, { 0x1414, 0, 0x08038CC0 },
+ { 0x1450, 0, 0x08038D04 }, { 0x1451, 0, 0x08038EC4 }, { 0x1452, 0, 0x08038EF8 }, { 0x1453, 0, 0x08038F10 },
+ { 0x1454, 0, 0x08038F50 }, { 0x1455, 0, 0x08038F9C }, { 0x1456, 0, 0x08038FE4 }, { 0x1457, 0, 0x08039064 },
+ { 0x1458, 0, 0x080390A8 }, { 0x1459, 0, 0x080390D4 }, { 0x145A, 0, 0x08039128 }, { 0x145B, 0, 0x08039198 },
+ { 0x145C, 0, 0x080391C4 }, { 0x145D, 0, 0x080391D8 }, { 0x145E, 0, 0x08039204 }, { 0x145F, 0, 0x080392B0 },
+ { 0x1460, 0, 0x08039360 }, { 0x1461, 0, 0x080393A8 }, { 0x1462, 0, 0x080393BC }, { 0x1463, 0, 0x080393EC },
+ { 0x1464, 0, 0x0803940C }, { 0x1465, 0, 0x0803942C }, { 0x1466, 0, 0x08039454 }, { 0x1467, 0, 0x0803948C },
+ { 0x1468, 0, 0x080394E8 }, { 0x1469, 0, 0x08039548 }, { 0x146A, 0, 0x080395A8 }, { 0x146B, 0, 0x08039638 },
+ { 0x146C, 0, 0x08039700 }, { 0x146D, 0, 0x08039738 }, { 0x146E, 0, 0x08039758 }, { 0x146F, 0, 0x080397D8 },
+ { 0x1470, 0, 0x08039858 }, { 0x1471, 0, 0x08039880 }, { 0x1472, 0, 0x080398B8 }, { 0x1473, 0, 0x08039924 },
+ { 0x1474, 0, 0x08039950 }, { 0x1475, 0, 0x08039A64 }, { 0x1476, 0, 0x08039AE8 }, { 0x1477, 0, 0x08039B4C },
+ { 0x1478, 0, 0x08039B70 }, { 0x1479, 0, 0x08039B98 }, { 0x147A, 0, 0x08039BCC }, { 0x147B, 0, 0x08039C00 },
+ { 0x147C, 0, 0x08039D6C }, { 0x147D, 0, 0x08039E18 }, { 0x14B4, 0, 0x08039E78 }, { 0x14B5, 0, 0x08039EA8 },
+ { 0x14B6, 0, 0x08039EF8 }, { 0x14B7, 0, 0x08039F64 }, { 0x14B8, 0, 0x08039F90 }, { 0x14B9, 0, 0x08039FE4 },
+ { 0x14BA, 0, 0x0803A044 }, { 0x14BB, 0, 0x0803A090 }, { 0x14BC, 0, 0x0803A110 }, { 0x14BD, 0, 0x0803A138 },
+ { 0x14BE, 0, 0x0803A1B8 }, { 0x14BF, 0, 0x0803A208 }, { 0x14C0, 0, 0x0803A25C }, { 0x14C1, 0, 0x0803A29C },
+ { 0x14C2, 0, 0x0803A2E8 }, { 0x14C3, 0, 0x0803A384 }, { 0x14C4, 0, 0x0803A3FC }, { 0x14C5, 0, 0x0803A458 },
+ { 0x14C6, 0, 0x0803A514 }, { 0x14C7, 0, 0x0803A540 }, { 0x14C8, 0, 0x0803A570 }, { 0x14C9, 0, 0x0803A5E4 },
+ { 0x14CA, 0, 0x0803A614 }, { 0x14CB, 0, 0x0803A684 }, { 0x14CC, 0, 0x0803A700 }, { 0x14CD, 0, 0x0803A79C },
+ { 0x14CE, 0, 0x0803A7B8 }, { 0x14CF, 0, 0x0803A880 }, { 0x14D0, 0, 0x0803A8AC }, { 0x14D1, 0, 0x0803A96C },
+ { 0x14D2, 0, 0x0803AA08 }, { 0x14D3, 0, 0x0803AA80 }, { 0x14D4, 0, 0x0803AB40 }, { 0x14D5, 0, 0x0803AB80 },
+ { 0x14D6, 0, 0x0803ABC0 }, { 0x14D7, 0, 0x0803AC30 }, { 0x14D8, 0, 0x0803AC78 }, { 0x14D9, 0, 0x0803ACEC },
+ { 0x14DA, 0, 0x0803AD64 }, { 0x14DB, 0, 0x0803AD8C }, { 0x14DC, 0, 0x0803ADB8 }, { 0x14DD, 0, 0x0803ADEC },
+ { 0x14DE, 0, 0x0803AE40 }, { 0x14DF, 0, 0x0803AEAC }, { 0x14E0, 0, 0x0803AEFC }, { 0x14E1, 0, 0x0803AF58 },
+ { 0x14E2, 0, 0x0803AFDC }, { 0x14E3, 0, 0x0803B018 }, { 0x14E4, 0, 0x0803B044 }, { 0x14E5, 0, 0x0803B07C },
+ { 0x14E6, 0, 0x0803B100 }, { 0x14E7, 0, 0x0803B13C }, { 0x14E8, 0, 0x0803B19C }, { 0x14E9, 0, 0x0803B220 },
+ { 0x14EA, 0, 0x0803B2A0 }, { 0x14EB, 0, 0x0803B358 }, { 0x14EC, 0, 0x0803B398 }, { 0x14ED, 0, 0x0803B40C },
+ { 0x14EE, 0, 0x0803B518 }, { 0x14EF, 0, 0x0803B5F8 }, { 0x14F0, 0, 0x0803B63C }, { 0x14F1, 0, 0x0803B6A8 },
+ { 0x14F2, 0, 0x0803B734 }, { 0x14F3, 0, 0x0803B7B8 }, { 0x14F4, 0, 0x0803B834 }, { 0x14F5, 0, 0x0803B910 },
+ { 0x14F6, 0, 0x0803B984 }, { 0x14F7, 0, 0x0803B9F0 }, { 0x14F8, 0, 0x0803BA80 }, { 0x14F9, 0, 0x0803BAB8 },
+ { 0x14FA, 0, 0x0803BAF8 }, { 0x14FB, 0, 0x0803BB60 }, { 0x14FC, 0, 0x0803BB8C }, { 0x1518, 0, 0x0803BBFC },
+ { 0x1519, 0, 0x0803BC5C }, { 0x151A, 0, 0x0803BCB0 }, { 0x151B, 0, 0x0803BCC8 }, { 0x151C, 0, 0x0803BCF8 },
+ { 0x151D, 0, 0x0803BD44 }, { 0x151E, 0, 0x0803BDB8 }, { 0x151F, 0, 0x0803BDFC }, { 0x1520, 0, 0x0803BE9C },
+ { 0x1521, 0, 0x0803BF18 }, { 0x1522, 0, 0x0803BF64 }, { 0x1523, 0, 0x0803BF8C }, { 0x1524, 0, 0x0803BFA4 },
+ { 0x1525, 0, 0x0803BFD8 }, { 0x1526, 0, 0x0803BFF8 }, { 0x1527, 0, 0x0803C014 }, { 0x1528, 0, 0x0803C068 },
+ { 0x1529, 0, 0x0803C0EC }, { 0x152A, 0, 0x0803C174 }, { 0x152B, 0, 0x0803C1CC }, { 0x152C, 0, 0x0803C22C },
+ { 0x152D, 0, 0x0803C290 }, { 0x152E, 0, 0x0803C314 }, { 0x152F, 0, 0x0803C398 }, { 0x1530, 0, 0x0803C3F0 },
+ { 0x1531, 0, 0x0803C454 }, { 0x1532, 0, 0x0803C4DC }, { 0x1533, 0, 0x0803C518 }, { 0x1534, 0, 0x0803C564 },
+ { 0x1535, 0, 0x0803C5A4 }, { 0x1536, 0, 0x0803C5E4 }, { 0x1537, 0, 0x0803C644 }, { 0x1538, 0, 0x0803C6C8 },
+ { 0x1539, 0, 0x0803C744 }, { 0x153A, 0, 0x0803C7E0 }, { 0x153B, 0, 0x0803C80C }, { 0x153C, 0, 0x0803C84C },
+ { 0x153D, 0, 0x0803C884 }, { 0x153E, 0, 0x0803C89C }, { 0x153F, 0, 0x0803C8DC }, { 0x1540, 0, 0x0803C908 },
+ { 0x1541, 0, 0x0803C944 }, { 0x1542, 0, 0x0803C9A0 }, { 0x157C, 0, 0x0803C9BC }, { 0x157D, 0, 0x0803C9D4 },
+ { 0x157E, 0, 0x0803CA30 }, { 0x157F, 0, 0x0803CA70 }, { 0x1580, 0, 0x0803CAA0 }, { 0x1581, 0, 0x0803CAEC },
+ { 0x1582, 0, 0x0803CB04 }, { 0x1583, 0, 0x0803CB18 }, { 0x1584, 0, 0x0803CB30 }, { 0x1585, 0, 0x0803CB64 },
+ { 0x1586, 0, 0x0803CBD8 }, { 0x1587, 0, 0x0803CBF4 }, { 0x1588, 0, 0x0803CC34 }, { 0x1589, 0, 0x0803CC78 },
+ { 0x158A, 0, 0x0803CD14 }, { 0x158B, 0, 0x0803CDA0 }, { 0x158C, 0, 0x0803CDE0 }, { 0x158D, 0, 0x0803CE3C },
+ { 0x158E, 0, 0x0803CEA8 }, { 0x158F, 0, 0x0803CEE8 }, { 0x1590, 0, 0x0803CF30 }, { 0x1591, 0, 0x0803CFA4 },
+ { 0x1592, 0, 0x0803D050 }, { 0x1593, 0, 0x0803D0C8 }, { 0x1594, 0, 0x0803D118 }, { 0x1595, 0, 0x0803D168 },
+ { 0x1596, 0, 0x0803D1A8 }, { 0x1597, 0, 0x0803D1F0 }, { 0x1598, 0, 0x0803D228 }, { 0x1599, 0, 0x0803D290 },
+ { 0x159A, 0, 0x0803D2FC }, { 0x159B, 0, 0x0803D368 }, { 0x159C, 0, 0x0803D448 }, { 0x159D, 0, 0x0803D4C0 },
+ { 0x159E, 0, 0x0803D500 }, { 0x159F, 0, 0x0803D558 }, { 0x15A0, 0, 0x0803D5B4 }, { 0x15A1, 0, 0x0803D628 },
+ { 0x15A2, 0, 0x0803D730 }, { 0x15A3, 0, 0x0803D798 }, { 0x15A4, 0, 0x0803D818 }, { 0x15A5, 0, 0x0803D868 },
+ { 0x15A6, 0, 0x0803D8C4 }, { 0x15A7, 0, 0x0803D9AC }, { 0x15A8, 0, 0x0803D9FC }, { 0x15E0, 0, 0x0803DA3C },
+ { 0x15E1, 0, 0x0803DA80 }, { 0x15E2, 0, 0x0803DB14 }, { 0x15E3, 0, 0x0803DB9C }, { 0x15E4, 0, 0x0803DC1C },
+ { 0x15E5, 0, 0x0803DC70 }, { 0x15E6, 0, 0x0803DCA8 }, { 0x15E7, 0, 0x0803DCF8 }, { 0x15E8, 0, 0x0803DD5C },
+ { 0x15E9, 0, 0x0803DE00 }, { 0x15EA, 0, 0x0803DE5C }, { 0x15EB, 0, 0x0803DE84 }, { 0x15EC, 0, 0x0803DED0 },
+ { 0x15ED, 0, 0x0803DF34 }, { 0x15EE, 0, 0x0803DF64 }, { 0x15EF, 0, 0x0803DF9C }, { 0x15F0, 0, 0x0803DFBC },
+ { 0x15F1, 0, 0x0803E018 }, { 0x15F2, 0, 0x0803E0B8 }, { 0x15F3, 0, 0x0803E124 }, { 0x15F4, 0, 0x0803E178 },
+ { 0x15F5, 0, 0x0803E1E0 }, { 0x15F6, 0, 0x0803E298 }, { 0x15F7, 0, 0x0803E310 }, { 0x15F8, 0, 0x0803E36C },
+ { 0x15F9, 0, 0x0803E3D0 }, { 0x15FA, 0, 0x0803E420 }, { 0x15FB, 0, 0x0803E454 }, { 0x15FC, 0, 0x0803E488 },
+ { 0x15FD, 0, 0x0803E4E8 }, { 0x15FE, 0, 0x0803E59C }, { 0x15FF, 0, 0x0803E620 }, { 0x1600, 0, 0x0803E66C },
+ { 0x1601, 0, 0x0803E70C }, { 0x1602, 0, 0x0803E74C }, { 0x1603, 0, 0x0803E7A4 }, { 0x1604, 0, 0x0803E7DC },
+ { 0x1605, 0, 0x0803E804 }, { 0x1606, 0, 0x0803E864 }, { 0x1607, 0, 0x0803E8E8 }, { 0x1608, 0, 0x0803E930 },
+ { 0x1609, 0, 0x0803E9E4 }, { 0x160A, 0, 0x0803EA4C }, { 0x160B, 0, 0x0803EAB0 }, { 0x160C, 0, 0x0803EB18 },
+ { 0x160D, 0, 0x0803EB58 }, { 0x160E, 0, 0x0803EBA8 }, { 0x160F, 0, 0x0803EBFC }, { 0x1610, 0, 0x0803EC9C },
+ { 0x1611, 0, 0x0803ED14 }, { 0x1612, 0, 0x0803EE08 }, { 0x1613, 0, 0x0803EE48 }, { 0x1614, 0, 0x0803EEB0 },
+ { 0x1615, 0, 0x0803EEF0 }, { 0x1616, 0, 0x0803EFAC }, { 0x1617, 0, 0x0803F004 }, { 0x1618, 0, 0x0803F04C },
+ { 0x1619, 0, 0x0803F078 }, { 0x161A, 0, 0x0803F0E0 }, { 0x161B, 0, 0x0803F110 }, { 0x161C, 0, 0x0803F15C },
+ { 0x161D, 0, 0x0803F1EC }, { 0x161E, 0, 0x0803F264 }, { 0x161F, 0, 0x0803F2CC }, { 0x1620, 0, 0x0803F344 },
+ { 0x1621, 0, 0x0803F3A8 }, { 0x1622, 0, 0x0803F3F4 }, { 0x1623, 0, 0x0803F46C }, { 0x1624, 0, 0x0803F4AC },
+ { 0x1625, 0, 0x0803F500 }, { 0x1626, 0, 0x0803F608 }, { 0x1627, 0, 0x0803F66C }, { 0x1628, 0, 0x0803F6E8 },
+ { 0x1629, 0, 0x0803F718 }, { 0x162A, 0, 0x0803F760 }, { 0x162B, 0, 0x0803F7C0 }, { 0x162C, 0, 0x0803F87C },
+ { 0x162D, 0, 0x0803F8A8 }, { 0x162E, 0, 0x0803F8EC }, { 0x162F, 0, 0x0803F94C }, { 0x1630, 0, 0x0803F978 },
+ { 0x1631, 0, 0x0803F9DC }, { 0x1632, 0, 0x0803FA3C }, { 0x1633, 0, 0x0803FA78 }, { 0x1634, 0, 0x0803FAC4 },
+ { 0x1635, 0, 0x0803FB0C }, { 0x1636, 0, 0x0803FB5C }, { 0x1637, 0, 0x0803FBCC }, { 0x1638, 0, 0x0803FC50 },
+ { 0x1644, 0, 0x0803FC6C }, { 0x1645, 0, 0x0803FD0C }, { 0x1646, 0, 0x0803FD5C }, { 0x1647, 0, 0x0803FDC0 },
+ { 0x1648, 0, 0x0803FE08 }, { 0x1649, 0, 0x0803FE54 }, { 0x164A, 0, 0x0803FEB4 }, { 0x164B, 0, 0x0803FF88 },
+ { 0x164C, 0, 0x0803FFF4 }, { 0x164D, 0, 0x08040064 }, { 0x164E, 0, 0x080400BC }, { 0x164F, 0, 0x0804010C },
+ { 0x1650, 0, 0x08040174 }, { 0x1651, 0, 0x0804019C }, { 0x1652, 0, 0x08040208 }, { 0x1653, 0, 0x08040250 },
+ { 0x1654, 0, 0x080402B0 }, { 0x1655, 0, 0x080402CC }, { 0x1656, 0, 0x0804032C }, { 0x1657, 0, 0x0804035C },
+ { 0x1658, 0, 0x080403C0 }, { 0x1659, 0, 0x08040494 }, { 0x165A, 0, 0x08040530 }, { 0x165B, 0, 0x0804054C },
+ { 0x165C, 0, 0x080405AC }, { 0x165D, 0, 0x080405E0 }, { 0x165E, 0, 0x08040624 }, { 0x165F, 0, 0x0804070C },
+ { 0x1660, 0, 0x08040798 }, { 0x1661, 0, 0x080407C0 }, { 0x1700, 0, 0x08040848 }, { 0x1701, 0, 0x080408E4 },
+ { 0x1702, 0, 0x0804092C }, { 0x1703, 0, 0x08040988 }, { 0x1704, 0, 0x080409D4 }, { 0x1705, 0, 0x08040A28 },
+ { 0x1706, 0, 0x08040ABC }, { 0x1707, 0, 0x08040B0C }, { 0x1708, 0, 0x08040B50 }, { 0x1709, 0, 0x08040BA4 },
+ { 0x170A, 0, 0x08040C18 }, { 0x170B, 0, 0x08040C60 }, { 0x170C, 0, 0x08040C6C }, { 0x170D, 0, 0x08040CC8 },
+ { 0x170E, 0, 0x08040D38 }, { 0x170F, 0, 0x08040DBC }, { 0x1710, 0, 0x08040E0C }, { 0x1711, 0, 0x08040E84 },
+ { 0x1712, 0, 0x08040E90 }, { 0x1713, 0, 0x08040EE8 }, { 0x1714, 0, 0x08040F30 }, { 0x1715, 0, 0x08040F78 },
+ { 0x1716, 0, 0x08040FD0 }, { 0x1717, 0, 0x08041050 }, { 0x1718, 0, 0x08041084 }, { 0x1719, 0, 0x080410E8 },
+ { 0x171A, 0, 0x08041128 }, { 0x171B, 0, 0x08041170 }, { 0x171C, 0, 0x080411BC }, { 0x171D, 0, 0x080411C8 },
+ { 0x171E, 0, 0x0804122C }, { 0x171F, 0, 0x0804125C }, { 0x1720, 0, 0x080412A8 }, { 0x1721, 0, 0x080412E8 },
+ { 0x1722, 0, 0x0804132C }, { 0x1723, 0, 0x08041378 }, { 0x1724, 0, 0x080413C0 }, { 0x1725, 0, 0x08041414 },
+ { 0x1726, 0, 0x08041470 }, { 0x1727, 0, 0x0804147C }, { 0x1728, 0, 0x08041488 }, { 0x1729, 0, 0x080414D0 },
+ { 0x172A, 0, 0x08041530 }, { 0x172B, 0, 0x08041588 }, { 0x172C, 0, 0x080415E4 }, { 0x172D, 0, 0x08041640 },
+ { 0x172E, 0, 0x08041698 }, { 0x172F, 0, 0x080416FC }, { 0x1730, 0, 0x08041740 }, { 0x1731, 0, 0x08041794 },
+ { 0x1732, 0, 0x080417A0 }, { 0x1733, 0, 0x080417F4 }, { 0x1734, 0, 0x08041848 }, { 0x1735, 0, 0x0804189C },
+ { 0x1736, 0, 0x08041900 }, { 0x1737, 0, 0x08041958 }, { 0x1738, 0, 0x080419A8 }, { 0x1739, 0, 0x080419F4 },
+ { 0x173A, 0, 0x08041A54 }, { 0x173B, 0, 0x08041AA0 }, { 0x173C, 0, 0x08041AF8 }, { 0x173D, 0, 0x08041B54 },
+ { 0x173E, 0, 0x08041BA4 }, { 0x173F, 0, 0x08041BF4 }, { 0x1740, 0, 0x08041C48 }, { 0x1741, 0, 0x08041CAC },
+ { 0x1742, 0, 0x08041D08 }, { 0x1743, 0, 0x08041D68 }, { 0x1744, 0, 0x08041DB4 }, { 0x1745, 0, 0x08041DF8 },
+ { 0x1746, 0, 0x08041E54 }, { 0x1747, 0, 0x08041EB0 }, { 0x1748, 0, 0x08041F2C }, { 0x1749, 0, 0x08041F78 },
+ { 0x1784, 0, 0x08041FD0 }, { 0x1785, 0, 0x0804202C }, { 0x1786, 0, 0x08042088 }, { 0x1787, 0, 0x080420E4 },
+ { 0x1788, 0, 0x080420F0 }, { 0x1789, 0, 0x0804214C }, { 0x178A, 0, 0x080421B0 }, { 0x178B, 0, 0x080421F4 },
+ { 0x178C, 0, 0x0804223C }, { 0x178D, 0, 0x08042288 }, { 0x178E, 0, 0x080422CC }, { 0x178F, 0, 0x08042314 },
+ { 0x1798, 0, 0x08042360 }, { 0x1799, 0, 0x080423AC }, { 0x179A, 0, 0x080423F4 }, { 0x179B, 0, 0x08042440 },
+ { 0x17AA, 0, 0x08042490 }, { 0x17AC, 0, 0x08042514 }, { 0x17AD, 0, 0x08042568 }, { 0x17AE, 0, 0x080425C0 },
+ { 0x17AF, 0, 0x0804262C }, { 0x1800, 0, 0x080426AC }, { 0x1801, 0, 0x080426CC }, { 0x1802, 0, 0x0804272C },
+ { 0x1803, 0, 0x08042754 }, { 0x1804, 0, 0x08042784 }, { 0x1805, 0, 0x080427E0 }, { 0x1806, 0, 0x08042834 },
+ { 0x1807, 0, 0x08042870 }, { 0x1808, 0, 0x080428D0 }, { 0x1809, 0, 0x08042910 }, { 0x180A, 0, 0x0804293C },
+ { 0x180B, 0, 0x08042968 }, { 0x180C, 0, 0x08042990 }, { 0x180D, 0, 0x080429AC }, { 0x180E, 0, 0x08042A04 },
+ { 0x180F, 0, 0x08042A50 }, { 0x1810, 0, 0x08042A80 }, { 0x1811, 0, 0x08042AB4 }, { 0x1812, 0, 0x08042AF8 },
+ { 0x1813, 0, 0x08042B38 }, { 0x1814, 0, 0x08042B6C }, { 0x1815, 0, 0x08042BAC }, { 0x1816, 0, 0x08042C04 },
+ { 0x1817, 0, 0x08042C4C }, { 0x1818, 0, 0x08042C8C }, { 0x1819, 0, 0x08042CB8 }, { 0x181A, 0, 0x08042CEC },
+ { 0x181B, 0, 0x08042D28 }, { 0x181C, 0, 0x08042D34 }, { 0x181D, 0, 0x08042D94 }, { 0x181E, 0, 0x08042DD8 },
+ { 0x181F, 0, 0x08042DF0 }, { 0x1820, 0, 0x08042E40 }, { 0x1821, 0, 0x08042E7C }, { 0x1822, 0, 0x08042EB0 },
+ { 0x1823, 0, 0x08042EE8 }, { 0x1824, 0, 0x08042F20 }, { 0x1883, 0, 0x08042F2C }, { 0x1884, 0, 0x08042F60 },
+ { 0x1885, 0, 0x08042F9C }, { 0x1886, 0, 0x08043008 }, { 0x1887, 0, 0x08043054 }, { 0x1888, 0, 0x08043094 },
+ { 0x1889, 0, 0x080430E4 }, { 0x188A, 0, 0x08043134 }, { 0x188B, 0, 0x08043150 }, { 0x188C, 0, 0x0804318C },
+ { 0x188D, 0, 0x080431E8 }, { 0x188E, 0, 0x08043224 }, { 0x188F, 0, 0x0804326C }, { 0x1890, 0, 0x08043298 },
+ { 0x1891, 0, 0x080432D8 }, { 0x1892, 0, 0x0804332C }, { 0x1893, 0, 0x08043378 }, { 0x1901, 0, 0x080433B4 },
+ { 0x1902, 0, 0x0804341C }, { 0x1903, 0, 0x08043484 }, { 0x1904, 0, 0x08043508 }, { 0x1905, 0, 0x08043580 },
+ { 0x1906, 0, 0x08043610 }, { 0x1907, 0, 0x0804367C }, { 0x1908, 0, 0x08043710 }, { 0x1909, 0, 0x08043784 },
+ { 0x190A, 0, 0x0804380C }, { 0x190B, 0, 0x08043880 }, { 0x190C, 0, 0x080438E8 }, { 0x190D, 0, 0x08043948 },
+ { 0x190E, 0, 0x080439C4 }, { 0x190F, 0, 0x08043A20 }, { 0x1910, 0, 0x08043AA0 }, { 0x1911, 0, 0x08043B24 },
+ { 0x1912, 0, 0x08043BA8 }, { 0x1913, 0, 0x08043C30 }, { 0x1914, 0, 0x08043C9C }, { 0x1915, 0, 0x08043CEC },
+ { 0x1916, 0, 0x08043D50 }, { 0x1917, 0, 0x08043DD8 }, { 0x1918, 0, 0x08043E40 }, { 0x1919, 0, 0x08043EB0 },
+ { 0x191A, 0, 0x08043F24 }, { 0x191B, 0, 0x08043FB0 }, { 0x191C, 0, 0x0804401C }, { 0x191D, 0, 0x08044098 },
+ { 0x191E, 0, 0x0804411C }, { 0x191F, 0, 0x08044184 }, { 0x1921, 0, 0x080441E8 }, { 0x1922, 0, 0x08044258 },
+ { 0x1923, 0, 0x080442D4 }, { 0x1924, 0, 0x08044348 }, { 0x1925, 0, 0x080443D0 }, { 0x1926, 0, 0x08044458 },
+ { 0x1927, 0, 0x080444DC }, { 0x1928, 0, 0x08044574 }, { 0x1929, 0, 0x080445CC }, { 0x192A, 0, 0x08044630 },
+ { 0x192C, 0, 0x080446AC }, { 0x192D, 0, 0x0804471C }, { 0x192E, 0, 0x08044780 }, { 0x1930, 0, 0x08044808 },
+ { 0x1931, 0, 0x08044898 }, { 0x1932, 0, 0x08044910 }, { 0x1933, 0, 0x0804498C }, { 0x1934, 0, 0x08044A04 },
+ { 0x1935, 0, 0x08044A94 }, { 0x1937, 0, 0x08044B10 }, { 0x1939, 0, 0x08044B9C }, { 0x193A, 0, 0x08044C0C },
+ { 0x193B, 0, 0x08044C18 }, { 0x193C, 0, 0x08044C8C }, { 0x1942, 0, 0x08044D04 }, { 0x1944, 0, 0x08044D6C },
+ { 0x1945, 0, 0x08044DCC }, { 0x1946, 0, 0x08044E48 }, { 0x1947, 0, 0x08044EAC }, { 0x1948, 0, 0x08044F20 },
+ { 0x1949, 0, 0x08044F88 }, { 0x194A, 0, 0x08045004 }, { 0x194B, 0, 0x08045084 }, { 0x194C, 0, 0x080450F4 },
+ { 0x194D, 0, 0x08045174 }, { 0x1950, 0, 0x080451C8 }, { 0x1951, 0, 0x08045238 }, { 0x1952, 0, 0x080452A0 },
+ { 0x1953, 0, 0x08045310 }, { 0x1954, 0, 0x08045378 }, { 0x1955, 0, 0x080453E8 }, { 0x1956, 0, 0x08045458 },
+ { 0x1957, 0, 0x080454CC }, { 0x1958, 0, 0x08045540 }, { 0x1959, 0, 0x080455C4 }, { 0x195A, 0, 0x0804564C },
+ { 0x195B, 0, 0x080456AC }, { 0x195C, 0, 0x08045704 }, { 0x195D, 0, 0x0804576C }, { 0x195E, 0, 0x080457E8 },
+ { 0x195F, 0, 0x08045838 }, { 0x1960, 0, 0x0804589C }, { 0x1961, 0, 0x08045918 }, { 0x1962, 0, 0x08045988 },
+ { 0x1963, 0, 0x080459E4 }, { 0x1964, 0, 0x08045A24 }, { 0x1B58, 0, 0x08045ACC }, { 0x1B59, 0, 0x08045ADC },
+ { 0x1B5A, 0, 0x08045B00 }, { 0x1B5B, 0, 0x08045B20 }, { 0x1B5C, 0, 0x08045B2C }, { 0x1B5D, 0, 0x08045B58 },
+ { 0x1B5E, 0, 0x08045B7C }, { 0x1B5F, 0, 0x08045BAC }, { 0x1B60, 0, 0x08045BD8 }, { 0x1B61, 0, 0x08045BFC },
+ { 0x1B62, 0, 0x08045C18 }, { 0x1B63, 0, 0x08045C3C }, { 0x1B64, 0, 0x08045C60 }, { 0x1B65, 0, 0x08045C90 },
+ { 0x1B66, 0, 0x08045CC0 }, { 0x1B67, 0, 0x08045CEC }, { 0x1B6A, 0, 0x08045CF8 }, { 0x1B6B, 0, 0x08045D28 },
+ { 0x1B72, 0, 0x08045D58 }, { 0x1B73, 0, 0x08045D8C }, { 0x1B74, 0, 0x08045DB8 }, { 0x1B75, 0, 0x08045DEC },
+ { 0x1B76, 0, 0x08045E1C }, { 0x1B77, 0, 0x08045E48 }, { 0x1B78, 0, 0x08045E54 }, { 0x1B79, 0, 0x08045E80 },
+ { 0x1B7A, 0, 0x08045EB0 }, { 0x1B7B, 0, 0x08045ED8 }, { 0x1B7C, 0, 0x08045F08 }, { 0x1B7D, 0, 0x08045F34 },
+ { 0x1B7E, 0, 0x08045F40 }, { 0x1B7F, 0, 0x08045F74 }, { 0x1B80, 0, 0x08045FA8 }, { 0x1B81, 0, 0x08045FD4 },
+ { 0x1B89, 0, 0x08045FE0 }, { 0x1B8A, 0, 0x08045FF0 }, { 0x1B8B, 0, 0x08046038 }, { 0x1B8C, 0, 0x08046060 },
+ { 0x1B8D, 0, 0x08046098 }, { 0x1B8E, 0, 0x080460D4 }, { 0x1B8F, 0, 0x08046110 }, { 0x1B90, 0, 0x08046150 },
+ { 0x1B91, 0, 0x0804618C }, { 0x1B92, 0, 0x080461CC }, { 0x1B93, 0, 0x08046208 }, { 0x1B94, 0, 0x0804622C },
+ { 0x1B95, 0, 0x0804626C }, { 0x1B96, 0, 0x080462A8 }, { 0x1B98, 0, 0x080462B4 }, { 0x1B9E, 0, 0x08046300 },
+ { 0x1B9F, 0, 0x08046374 }, { 0x1BA0, 0, 0x080463FC }, { 0x1BA1, 0, 0x08046480 }, { 0x1BA2, 0, 0x08046594 },
+ { 0x1BA4, 0, 0x080465C4 }, { 0x1BA5, 0, 0x08046654 }, { 0x1BA6, 0, 0x08046684 }, { 0x1BA7, 0, 0x080466D4 },
+ { 0x1BA8, 0, 0x08046760 }, { 0x1BAC, 0, 0x080467E8 }, { 0x1BB2, 0, 0x08046848 }, { 0x1BB3, 0, 0x08046888 },
+ { 0x1BB4, 0, 0x080468C4 }, { 0x1BB5, 0, 0x08046904 }, { 0x1BB6, 0, 0x08046944 }, { 0x1C00, 0, 0x08046984 },
+ { 0x1C01, 0, 0x08046A4C }, { 0x1C02, 0, 0x08046AB8 }, { 0x1C03, 0, 0x08046BA8 }, { 0x1C04, 0, 0x08046C10 },
+ { 0x1C05, 0, 0x08046D68 }, { 0x1C06, 0, 0x08046E44 }, { 0x1C07, 0, 0x08046EAC }, { 0x1C08, 0, 0x08046F0C },
+ { 0x1C09, 0, 0x08046F5C }, { 0x1C0A, 0, 0x08046F94 }, { 0x1C0B, 0, 0x08047014 }, { 0x1C0C, 0, 0x080470D4 },
+ { 0x1C0D, 0, 0x08047118 }, { 0x1C0E, 0, 0x08047130 }, { 0x1C0F, 0, 0x08047148 }, { 0x1C10, 0, 0x08047164 },
+ { 0x1C11, 0, 0x0804717C }, { 0x1C12, 0, 0x0804719C }, { 0x1C13, 0, 0x080471BC }, { 0x1C14, 0, 0x080471D4 },
+ { 0x1C15, 0, 0x080471F0 }, { 0x1C16, 0, 0x08047214 }, { 0x1C17, 0, 0x0804730C }, { 0x1C18, 0, 0x0804734C },
+ { 0x1D00, 0, 0x080473A4 }, { 0x1D01, 0, 0x08047414 }, { 0x1D02, 0, 0x08047524 }, { 0x1D03, 0, 0x0804758C },
+ { 0x1D04, 0, 0x08047644 }, { 0x1D05, 0, 0x08047678 }, { 0x1D06, 0, 0x080476D0 }, { 0x1D07, 0, 0x080476F8 },
+ { 0x1D08, 0, 0x08047728 }, { 0x1D09, 0, 0x08047788 }, { 0x1D0A, 0, 0x080477C0 }, { 0x1D0B, 0, 0x080477F4 },
+ { 0x1D0C, 0, 0x08047808 }, { 0x1D0D, 0, 0x08047820 }, { 0x1D11, 0, 0x08047844 }, { 0x1D12, 0, 0x08047890 },
+ { 0x1D13, 0, 0x080478D8 }, { 0x1D14, 0, 0x08047920 }, { 0x1D15, 0, 0x0804796C }, { 0x1D16, 0, 0x080479B4 },
+ { 0x1D17, 0, 0x080479FC }, { 0x1F40, 0, 0x08047A20 }, { 0x1F41, 0, 0x08047ABC }, { 0x1F42, 0, 0x08047B20 },
+ { 0x1F43, 0, 0x08047B94 }, { 0x1F44, 0, 0x08047BD8 }, { 0x1F45, 0, 0x08047C40 }, { 0x1F46, 0, 0x08047CB4 },
+ { 0x1F47, 0, 0x08047D1C }, { 0x1F48, 0, 0x08047D88 }, { 0x1F49, 0, 0x08047DA8 }, { 0x1F4A, 0, 0x08047E48 },
+ { 0x1F4B, 0, 0x08047F30 }, { 0x1F4C, 0, 0x08047F88 }, { 0x1F4D, 0, 0x08048014 }, { 0x1F4E, 0, 0x080480E0 },
+ { 0x1F4F, 0, 0x0804819C }, { 0x1F50, 0, 0x08048280 }, { 0x1F51, 0, 0x080482E4 }, { 0x1F52, 0, 0x0804833C },
+ { 0x1F53, 0, 0x080483B8 }, { 0x1F54, 0, 0x08048430 }, { 0x1F55, 0, 0x080484AC }, { 0x1F56, 0, 0x080484F8 },
+ { 0x1F5F, 0, 0x0804857C }, { 0x1F60, 0, 0x0804859C }, { 0x1F61, 0, 0x080485D4 }, { 0x1F62, 0, 0x08048604 },
+ { 0x1F63, 0, 0x0804862C }, { 0x1F64, 0, 0x0804866C }, { 0x1F65, 0, 0x080486A4 }, { 0x1F66, 0, 0x080486E0 },
+ { 0x1F67, 0, 0x08048708 }, { 0x1F68, 0, 0x08048774 }, { 0x1F69, 0, 0x080487A4 }, { 0x1F6A, 0, 0x080487E0 },
+ { 0x1F6B, 0, 0x08048810 }, { 0x1F6C, 0, 0x08048864 }, { 0x1F6D, 0, 0x08048898 }, { 0x1F6E, 0, 0x08048960 },
+ { 0x1F6F, 0, 0x08048990 }, { 0x1F70, 0, 0x080489E8 }, { 0x1F71, 0, 0x08048A44 }, { 0x1F72, 0, 0x08048AB8 },
+ { 0x1F73, 0, 0x08048AE8 }, { 0x1F74, 0, 0x08048B94 }, { 0x1F75, 0, 0x08048BB0 }, { 0x1FA4, 0, 0x08048BD8 },
+ { 0x1FA5, 0, 0x08048C14 }, { 0x1FA6, 0, 0x08048CF8 }, { 0x1FA7, 0, 0x08048D40 }, { 0x1FA8, 0, 0x08048D88 },
+ { 0x1FA9, 0, 0x08048DF4 }, { 0x1FAA, 0, 0x08048E68 }, { 0x1FAB, 0, 0x08048EE0 }, { 0x1FAC, 0, 0x08048FB4 },
+ { 0x1FAD, 0, 0x08049034 }, { 0x1FAE, 0, 0x08049068 }, { 0x1FAF, 0, 0x080491B0 }, { 0x1FB0, 0, 0x0804927C },
+ { 0x1FB1, 0, 0x080492C8 }, { 0x1FB2, 0, 0x08049318 }, { 0x1FB3, 0, 0x08049384 }, { 0x1FB4, 0, 0x08049424 },
+ { 0x1FB5, 0, 0x0804951C }, { 0x1FB6, 0, 0x08049558 }, { 0x1FB7, 0, 0x08049598 }, { 0x1FB8, 0, 0x080495B8 },
+ { 0x1FB9, 0, 0x080495D0 }, { 0x1FBA, 0, 0x080495E8 }, { 0x1FBB, 0, 0x08049614 }, { 0x1FBC, 0, 0x0804963C },
+ { 0x1FBD, 0, 0x08049688 }, { 0x1FBE, 0, 0x080496DC }, { 0x1FBF, 0, 0x08049758 }, { 0x1FC0, 0, 0x080497BC },
+ { 0x1FC1, 0, 0x080497E4 }, { 0x1FC2, 0, 0x0804982C }, { 0x1FC3, 0, 0x080498A0 }, { 0x1FC4, 0, 0x08049920 },
+ { 0x1FC5, 0, 0x08049940 }, { 0x1FC6, 0, 0x08049A0C }, { 0x1FC7, 0, 0x08049A38 }, { 0x1FC8, 0, 0x08049AA0 },
+ { 0x1FC9, 0, 0x08049AB8 }, { 0x1FCA, 0, 0x08049AF0 }, { 0x1FCB, 0, 0x08049B74 }, { 0x1FCC, 0, 0x08049BD0 },
+ { 0x1FCD, 0, 0x08049C34 }, { 0x1FCE, 0, 0x08049D14 }, { 0x1FCF, 0, 0x08049D70 }, { 0x1FD0, 0, 0x08049DAC },
+ { 0x1FD1, 0, 0x08049E08 }, { 0x1FD2, 0, 0x08049E24 }, { 0x1FD3, 0, 0x08049E44 }, { 0x1FD4, 0, 0x08049E88 },
+ { 0x1FD5, 0, 0x08049EB8 }, { 0x1FD6, 0, 0x08049F00 }, { 0x1FD7, 0, 0x08049F3C }, { 0x1FD8, 0, 0x08049F90 },
+ { 0x1FD9, 0, 0x08049FC4 }, { 0x1FDA, 0, 0x0804A018 }, { 0x1FDB, 0, 0x0804A050 }, { 0x1FDC, 0, 0x0804A0BC },
+ { 0x1FDD, 0, 0x0804A0F0 }, { 0x1FDE, 0, 0x0804A11C }, { 0x1FDF, 0, 0x0804A14C }, { 0x1FE0, 0, 0x0804A1A0 },
+ { 0x1FE1, 0, 0x0804A1D4 }, { 0x1FE2, 0, 0x0804A210 }, { 0x1FE3, 0, 0x0804A244 }, { 0x1FE4, 0, 0x0804A290 },
+ { 0x1FE5, 0, 0x0804A2C8 }, { 0x1FE6, 0, 0x0804A334 }, { 0x1FE7, 0, 0x0804A36C }, { 0x1FE8, 0, 0x0804A3EC },
+ { 0x1FE9, 0, 0x0804A420 }, { 0x1FEA, 0, 0x0804A484 }, { 0x1FEB, 0, 0x0804A4B8 }, { 0x1FEC, 0, 0x0804A51C },
+ { 0x1FED, 0, 0x0804A554 }, { 0x1FEE, 0, 0x0804A59C }, { 0x1FEF, 0, 0x0804A5D0 }, { 0x1FF0, 0, 0x0804A620 },
+ { 0x1FF1, 0, 0x0804A658 }, { 0x1FF2, 0, 0x0804A6C0 }, { 0x1FF3, 0, 0x0804A6F4 }, { 0x1FF4, 0, 0x0804A74C },
+ { 0x1FF5, 0, 0x0804A788 }, { 0x1FF6, 0, 0x0804A800 }, { 0x1FF7, 0, 0x0804A834 }, { 0x1FF8, 0, 0x0804A888 },
+ { 0x1FF9, 0, 0x0804A8B8 }, { 0x1FFA, 0, 0x0804A908 }, { 0x1FFB, 0, 0x0804A940 }, { 0x1FFC, 0, 0x0804A970 },
+ { 0x1FFD, 0, 0x0804A9A4 }, { 0x1FFE, 0, 0x0804AA00 }, { 0x1FFF, 0, 0x0804AA60 }, { 0x2000, 0, 0x0804AAA0 },
+ { 0x2001, 0, 0x0804AACC }, { 0x2002, 0, 0x0804AB00 }, { 0x2003, 0, 0x0804AB60 }, { 0x2004, 0, 0x0804ABA0 },
+ { 0x2005, 0, 0x0804ACE0 }, { 0x2006, 0, 0x0804ADB4 }, { 0x2007, 0, 0x0804AE8C }, { 0x2008, 0, 0x0804AEE0 },
+ { 0x2009, 0, 0x0804AEF8 }, { 0x200A, 0, 0x0804AF10 }, { 0x200B, 0, 0x0804AFAC }, { 0x200C, 0, 0x0804B024 },
+ { 0x200D, 0, 0x0804B058 }, { 0x200E, 0, 0x0804B0D0 }, { 0x200F, 0, 0x0804B144 }, { 0x2010, 0, 0x0804B168 },
+ { 0x2011, 0, 0x0804B1B4 }, { 0x2012, 0, 0x0804B1F8 }, { 0x2013, 0, 0x0804B260 }, { 0x2014, 0, 0x0804B298 },
+ { 0x2015, 0, 0x0804B300 }, { 0x2016, 0, 0x0804B338 }, { 0x2017, 0, 0x0804B350 }, { 0x201D, 0, 0x0804B3B0 },
+ { 0x201E, 0, 0x0804B3F8 }, { 0x201F, 0, 0x0804B508 }, { 0x2020, 0, 0x0804B58C }, { 0x2021, 0, 0x0804B5F8 },
+ { 0x2022, 0, 0x0804B68C }, { 0x2023, 0, 0x0804B6E4 }, { 0x2024, 0, 0x0804B6F0 }, { 0x2026, 0, 0x0804B6FC },
+ { 0x2027, 0, 0x0804B71C }, { 0x2028, 0, 0x0804B744 }, { 0x2029, 0, 0x0804B758 }, { 0x202A, 0, 0x0804B770 },
+ { 0x202B, 0, 0x0804B7C4 }, { 0x202C, 0, 0x0804B81C }, { 0x202D, 0, 0x0804B860 }, { 0x202E, 0, 0x0804B8A8 },
+ { 0x202F, 0, 0x0804B908 }, { 0x2030, 0, 0x0804B93C }, { 0x2031, 0, 0x0804B9B8 }, { 0x2032, 0, 0x0804BA20 },
+ { 0x2033, 0, 0x0804BA9C }, { 0x2034, 0, 0x0804BAEC }, { 0x2035, 0, 0x0804BB34 }, { 0x2036, 0, 0x0804BB7C },
+ { 0x2037, 0, 0x0804BBAC }, { 0x2038, 0, 0x0804BBDC }, { 0x2039, 0, 0x0804BC20 }, { 0x203A, 0, 0x0804BC98 },
+ { 0x203B, 0, 0x0804BCF0 }, { 0x203C, 0, 0x0804BD40 }, { 0x203D, 0, 0x0804BD5C }, { 0x203E, 0, 0x0804BDAC },
+ { 0x203F, 0, 0x0804BE24 }, { 0x2040, 0, 0x0804BE4C }, { 0x2041, 0, 0x0804BEB8 }, { 0x2042, 0, 0x0804BEEC },
+ { 0x2043, 0, 0x0804BF08 }, { 0x2044, 0, 0x0804BF38 }, { 0x2045, 0, 0x0804BF74 }, { 0x2046, 0, 0x0804BFB4 },
+ { 0x2047, 0, 0x0804C028 }, { 0x2048, 0, 0x0804C08C }, { 0x2049, 0, 0x0804C0BC }, { 0x204A, 0, 0x0804C0D8 },
+ { 0x204B, 0, 0x0804C114 }, { 0x204C, 0, 0x0804C144 }, { 0x204D, 0, 0x0804C180 }, { 0x204E, 0, 0x0804C204 },
+ { 0x206C, 0, 0x0804C264 }, { 0x206D, 0, 0x0804C2A8 }, { 0x206E, 0, 0x0804C2F8 }, { 0x206F, 0, 0x0804C338 },
+ { 0x2070, 0, 0x0804C384 }, { 0x2076, 0, 0x0804C390 }, { 0x2077, 0, 0x0804C3C0 }, { 0x2078, 0, 0x0804C404 },
+ { 0x2079, 0, 0x0804C480 }, { 0x2080, 0, 0x0804C4C4 }, { 0x2081, 0, 0x0804C5B4 }, { 0x2082, 0, 0x0804C5FC },
+ { 0x2083, 0, 0x0804C630 }, { 0x208A, 0, 0x0804C674 }, { 0x208B, 0, 0x0804C6BC }, { 0x208C, 0, 0x0804C708 },
+ { 0x208D, 0, 0x0804C7B4 }, { 0x208E, 0, 0x0804C7FC }, { 0x2093, 0, 0x0804C8A4 }, { 0x2094, 0, 0x0804C8C0 },
+ { 0x2095, 0, 0x0804C8E8 }, { 0x20B0, 0, 0x0804C920 }, { 0x20B1, 0, 0x0804C984 }, { 0x20B2, 0, 0x0804CA38 },
+ { 0x20B3, 0, 0x0804CB34 }, { 0x20B4, 0, 0x0804CC18 }, { 0x20B5, 0, 0x0804CD10 }, { 0x20B6, 0, 0x0804CDD4 },
+ { 0x20B7, 0, 0x0804CE8C }, { 0x20B8, 0, 0x0804CF48 }, { 0x20B9, 0, 0x0804CFA4 }, { 0x20BA, 0, 0x0804D018 },
+ { 0x20BB, 0, 0x0804D084 }, { 0x20BC, 0, 0x0804D0EC }, { 0x20BD, 0, 0x0804D158 }, { 0x20BE, 0, 0x0804D1C0 },
+ { 0x20BF, 0, 0x0804D230 }, { 0x20C0, 0, 0x0804D294 }, { 0x20C1, 0, 0x0804D300 }, { 0x20C2, 0, 0x0804D380 },
+ { 0x20C3, 0, 0x0804D3F8 }, { 0x20C4, 0, 0x0804D460 }, { 0x20C5, 0, 0x0804D4AC }, { 0x20C6, 0, 0x0804D52C },
+ { 0x20C7, 0, 0x0804D590 }, { 0x20D0, 0, 0x0804D5FC }, { 0x20D1, 0, 0x0804D654 }, { 0x20D2, 0, 0x0804D6C8 },
+ { 0x20D4, 0, 0x0804D6EC }, { 0x20D5, 0, 0x0804D75C }, { 0x20D6, 0, 0x0804D7B4 }, { 0x20D7, 0, 0x0804D834 },
+ { 0x20D8, 0, 0x0804D8B0 }, { 0x20D9, 0, 0x0804D93C }, { 0x20DA, 0, 0x0804D99C }, { 0x20DB, 0, 0x0804D9FC },
+ { 0x20DC, 0, 0x0804DA74 }, { 0x20DD, 0, 0x0804DB20 }, { 0x20DE, 0, 0x0804DBB0 }, { 0x20DF, 0, 0x0804DC18 },
+ { 0x20E0, 0, 0x0804DC90 }, { 0x20E1, 0, 0x0804DCFC }, { 0x20E2, 0, 0x0804DD84 }, { 0x20E3, 0, 0x0804DE0C },
+ { 0x20E4, 0, 0x0804DEA0 }, { 0x20E5, 0, 0x0804DF10 }, { 0x20E6, 0, 0x0804DF78 }, { 0x20E7, 0, 0x0804DFEC },
+ { 0x20F3, 0, 0x0804E05C }, { 0x20F7, 0, 0x0804E0C0 }, { 0x20F8, 0, 0x0804E134 }, { 0x20F9, 0, 0x0804E1AC },
+ { 0x2103, 0, 0x0804E220 }, { 0x2104, 0, 0x0804E288 }, { 0x2105, 0, 0x0804E2CC }, { 0x2106, 0, 0x0804E320 },
+ { 0x2107, 0, 0x0804E364 }, { 0x2108, 0, 0x0804E3BC }, { 0x2109, 0, 0x0804E408 }, { 0x210A, 0, 0x0804E458 },
+ { 0x210B, 0, 0x0804E4B0 }, { 0x210C, 0, 0x0804E4EC }, { 0x210D, 0, 0x0804E52C }, { 0x210E, 0, 0x0804E578 },
+ { 0x210F, 0, 0x0804E5D0 }, { 0x2110, 0, 0x0804E618 }, { 0x2111, 0, 0x0804E660 }, { 0x2112, 0, 0x0804E6BC },
+ { 0x2113, 0, 0x0804E70C }, { 0x2114, 0, 0x0804E75C }, { 0x2115, 0, 0x0804E7A8 }, { 0x2116, 0, 0x0804E7F0 },
+ { 0x2134, 0, 0x0804E83C }, { 0x2135, 0, 0x0804E880 }, { 0x2136, 0, 0x0804E8CC }, { 0x2137, 0, 0x0804E91C },
+ { 0x2138, 0, 0x0804E96C }, { 0x2139, 0, 0x0804E9B4 }, { 0x213A, 0, 0x0804E9FC }, { 0x213B, 0, 0x0804EA38 },
+ { 0x213C, 0, 0x0804EA88 }, { 0x213D, 0, 0x0804EAD0 }, { 0x213E, 0, 0x0804EB28 }, { 0x213F, 0, 0x0804EB80 },
+ { 0x2140, 0, 0x0804EBD0 }, { 0x2141, 0, 0x0804EC1C }, { 0x2142, 0, 0x0804EC60 }, { 0x2143, 0, 0x0804ECAC },
+ { 0x2144, 0, 0x0804ECF0 }, { 0x2145, 0, 0x0804ED40 }, { 0x2146, 0, 0x0804ED88 }, { 0x2147, 0, 0x0804EDDC },
+ { 0x2152, 0, 0x0804EE34 }, { 0x2153, 0, 0x0804EE78 }, { 0x2154, 0, 0x0804EECC }, { 0x2156, 0, 0x0804EF1C },
+ { 0x2157, 0, 0x0804EF64 }, { 0x2158, 0, 0x0804EFC4 }, { 0x2159, 0, 0x0804F014 }, { 0x215A, 0, 0x0804F05C },
+ { 0x215B, 0, 0x0804F0C0 }, { 0x215D, 0, 0x0804F124 }, { 0x215E, 0, 0x0804F178 }, { 0x215F, 0, 0x0804F184 },
+ { 0x2160, 0, 0x0804F1D8 }, { 0x2161, 0, 0x0804F234 }, { 0x2162, 0, 0x0804F298 }, { 0x2163, 0, 0x0804F2A4 },
+ { 0x2164, 0, 0x0804F2F8 }, { 0x2165, 0, 0x0804F358 }, { 0x2166, 0, 0x0804F3B0 }, { 0x2167, 0, 0x0804F400 },
+ { 0x2168, 0, 0x0804F458 }, { 0x2169, 0, 0x0804F4B0 }, { 0x216A, 0, 0x0804F504 }, { 0x216B, 0, 0x0804F554 },
+ { 0x216C, 0, 0x0804F5A0 }, { 0x216D, 0, 0x0804F5F8 }, { 0x216E, 0, 0x0804F658 }, { 0x216F, 0, 0x0804F6B8 },
+ { 0x2170, 0, 0x0804F710 }, { 0x2171, 0, 0x0804F764 }, { 0x2172, 0, 0x0804F7BC }, { 0x2173, 0, 0x0804F814 },
+ { 0x2174, 0, 0x0804F870 }, { 0x2198, 0, 0x0804F8CC }, { 0x2199, 0, 0x0804F920 }, { 0x219A, 0, 0x0804F978 },
+ { 0x219B, 0, 0x0804F9D0 }, { 0x219C, 0, 0x0804FA2C }, { 0x219D, 0, 0x0804FA80 }, { 0x219E, 0, 0x0804FAD0 },
+ { 0x219F, 0, 0x0804FB28 }, { 0x21A0, 0, 0x0804FB80 }, { 0x21A1, 0, 0x0804FBD8 }, { 0x21A2, 0, 0x0804FC30 },
+ { 0x21A3, 0, 0x0804FC88 }, { 0x21A4, 0, 0x0804FCD8 }, { 0x21A5, 0, 0x0804FD30 }, { 0x21A6, 0, 0x0804FD84 },
+ { 0x21A7, 0, 0x0804FDDC }, { 0x21A8, 0, 0x0804FE34 }, { 0x21A9, 0, 0x0804FE88 }, { 0x21AA, 0, 0x0804FED8 },
+ { 0x21AB, 0, 0x0804FF30 }, { 0x21AC, 0, 0x0804FF84 }, { 0x21AD, 0, 0x0804FFDC }, { 0x21AE, 0, 0x08050038 },
+ { 0x21AF, 0, 0x08050094 }, { 0x21B0, 0, 0x080500EC }, { 0x21B1, 0, 0x08050140 }, { 0x21B2, 0, 0x08050198 },
+ { 0x21B3, 0, 0x080501F4 }, { 0x21B4, 0, 0x0805024C }, { 0x21B5, 0, 0x080502A4 }, { 0x21B6, 0, 0x080502F8 },
+ { 0x21B7, 0, 0x08050350 }, { 0x21B8, 0, 0x080503A8 }, { 0x21B9, 0, 0x08050400 }, { 0x21BA, 0, 0x0805045C },
+ { 0x21CA, 0, 0x080504AC }, { 0x21CB, 0, 0x080504EC }, { 0x21CC, 0, 0x08050528 }, { 0x21CD, 0, 0x08050580 },
+ { 0x21CE, 0, 0x080505C8 }, { 0x21CF, 0, 0x08050604 }, { 0x21D0, 0, 0x08050648 }, { 0x21D1, 0, 0x08050680 },
+ { 0x21D2, 0, 0x080506CC }, { 0x21D3, 0, 0x08050700 }, { 0x21D4, 0, 0x0805075C }, { 0x21D5, 0, 0x080507A8 },
+ { 0x21D6, 0, 0x080507F0 }, { 0x21D7, 0, 0x08050840 }, { 0x21D8, 0, 0x08050884 }, { 0x21D9, 0, 0x080508CC },
+ { 0x21DA, 0, 0x08050910 }, { 0x21DB, 0, 0x0805094C }, { 0x21DC, 0, 0x08050998 }, { 0x21DD, 0, 0x080509D0 },
+ { 0x21FC, 0, 0x08050A20 }, { 0x21FD, 0, 0x08050A50 }, { 0x21FE, 0, 0x08050A74 }, { 0x21FF, 0, 0x08050ABC },
+ { 0x2200, 0, 0x08050ADC }, { 0x2201, 0, 0x08050AF0 }, { 0x2202, 0, 0x08050B0C }, { 0x2203, 0, 0x08050B44 },
+ { 0x2204, 0, 0x08050B74 }, { 0x2205, 0, 0x08050B98 }, { 0x2206, 0, 0x08050BCC }, { 0x2207, 0, 0x08050BF8 },
+ { 0x2208, 0, 0x08050C48 }, { 0x2209, 0, 0x08050CB0 }, { 0x220A, 0, 0x08050CC4 }, { 0x220B, 0, 0x08050CE0 },
+ { 0x220C, 0, 0x08050D10 }, { 0x220D, 0, 0x08050D44 }, { 0x220E, 0, 0x08050D98 }, { 0x220F, 0, 0x08050DE0 },
+ { 0x2210, 0, 0x08050E24 }, { 0x2211, 0, 0x08050E44 }, { 0x2212, 0, 0x08050E78 }, { 0x2213, 0, 0x08050E8C },
+ { 0x2214, 0, 0x08050ECC }, { 0x2215, 0, 0x08050F14 }, { 0x2216, 0, 0x08050F44 }, { 0x2217, 0, 0x08050F6C },
+ { 0x2218, 0, 0x08050FB4 }, { 0x2219, 0, 0x08050FDC }, { 0x221A, 0, 0x0805100C }, { 0x221B, 0, 0x08051034 },
+ { 0x221C, 0, 0x08051054 }, { 0x221D, 0, 0x08051080 }, { 0x221E, 0, 0x080510A0 }, { 0x221F, 0, 0x080510DC },
+ { 0x2220, 0, 0x08051104 }, { 0x2221, 0, 0x08051138 }, { 0x2222, 0, 0x0805114C }, { 0x2223, 0, 0x0805117C },
+ { 0x2224, 0, 0x080511A8 }, { 0x2225, 0, 0x080511E4 }, { 0x2226, 0, 0x0805122C }, { 0x2227, 0, 0x08051258 },
+ { 0x2228, 0, 0x080512AC }, { 0x2229, 0, 0x080512D8 }, { 0x222A, 0, 0x08051338 }, { 0x222B, 0, 0x08051374 },
+ { 0x2328, 0, 0x080513C4 }, { 0x2329, 0, 0x08051410 }, { 0x232A, 0, 0x08051454 }, { 0x232B, 0, 0x080514B4 },
+ { 0x232C, 0, 0x08051514 }, { 0x232D, 0, 0x08051564 }, { 0x232E, 0, 0x080515A8 }, { 0x232F, 0, 0x080515E4 },
+ { 0x2330, 0, 0x08051630 }, { 0x2331, 0, 0x08051680 }, { 0x2332, 0, 0x08051700 }, { 0x2333, 0, 0x08051750 },
+ { 0x2334, 0, 0x080517AC }, { 0x2335, 0, 0x08051814 }, { 0x2336, 0, 0x08051868 }, { 0x2337, 0, 0x080518C8 },
+ { 0x2338, 0, 0x08051914 }, { 0x2339, 0, 0x08051948 }, { 0x233A, 0, 0x080519A4 }, { 0x233B, 0, 0x080519D8 },
+ { 0x233C, 0, 0x08051A10 }, { 0x233D, 0, 0x08051A70 }, { 0x233E, 0, 0x08051AA4 }, { 0x233F, 0, 0x08051ADC },
+ { 0x2340, 0, 0x08051B10 }, { 0x2341, 0, 0x08051B54 }, { 0x2342, 0, 0x08051BC8 }, { 0x2343, 0, 0x08051C38 },
+ { 0x2344, 0, 0x08051C70 }, { 0x2345, 0, 0x08051CC0 }, { 0x2346, 0, 0x08051CFC }, { 0x2347, 0, 0x08051D24 },
+ { 0x2348, 0, 0x08051DA4 }, { 0x2349, 0, 0x08051DE4 }, { 0x234A, 0, 0x08051E44 }, { 0x234B, 0, 0x08051E84 },
+ { 0x234C, 0, 0x08051EA4 }, { 0x234D, 0, 0x08051EC4 }, { 0x234E, 0, 0x08051F04 }, { 0x234F, 0, 0x08051F30 },
+ { 0x2350, 0, 0x08051F48 }, { 0x2351, 0, 0x08051F7C }, { 0x2352, 0, 0x08051FA8 }, { 0x2353, 0, 0x08051FC0 },
+ { 0x2354, 0, 0x08051FE4 }, { 0x2355, 0, 0x08052004 }, { 0x2356, 0, 0x08052020 }, { 0x2357, 0, 0x08052048 },
+ { 0x2358, 0, 0x080520AC }, { 0x2359, 0, 0x080520DC }, { 0x235A, 0, 0x08052104 }, { 0x235B, 0, 0x08052138 },
+ { 0x235C, 0, 0x0805215C }, { 0x235D, 0, 0x08052188 }, { 0x235E, 0, 0x080522B4 }, { 0x235F, 0, 0x080522DC },
+ { 0x2360, 0, 0x08052334 }, { 0x2361, 0, 0x080523A8 }, { 0x2362, 0, 0x08052400 }, { 0x2363, 0, 0x08052450 },
+ { 0x2364, 0, 0x0805250C }, { 0x2365, 0, 0x08052644 }, { 0x2366, 0, 0x080526C0 }, { 0x2367, 0, 0x08052718 },
+ { 0x2368, 0, 0x080527E4 }, { 0x2369, 0, 0x080528E0 }, { 0x236A, 0, 0x08052930 }, { 0x236B, 0, 0x08052A04 },
+ { 0x236C, 0, 0x08052A40 }, { 0x236D, 0, 0x08052A8C }, { 0x236E, 0, 0x08052ABC }, { 0x236F, 0, 0x08052AD8 },
+ { 0x2370, 0, 0x08052B34 }, { 0x2371, 0, 0x08052B64 }, { 0x2372, 0, 0x08052BE0 }, { 0x2373, 0, 0x08052BF8 },
+ { 0x2374, 0, 0x08052C3C }, { 0x2375, 0, 0x08052C80 }, { 0x2376, 0, 0x08052CE4 }, { 0x2377, 0, 0x08052D08 },
+ { 0x2378, 0, 0x08052D54 }, { 0x2710, 0, 0x08052D8C }, { 0x2711, 0, 0x08052E54 }, { 0x2712, 0, 0x08052EA4 },
+ { 0x2713, 0, 0x08053008 }, { 0x2714, 0, 0x0805305C }, { 0x2715, 0, 0x080531A0 }, { 0x2716, 0, 0x08053220 },
+ { 0x2717, 0, 0x08053284 }, { 0x2718, 0, 0x080532BC }, { 0x2719, 0, 0x08053300 }, { 0x271A, 0, 0x0805332C },
+ { 0x271B, 0, 0x08053424 }, { 0x271C, 0, 0x080534AC }, { 0x271D, 0, 0x08053524 }, { 0x271E, 0, 0x0805358C },
+ { 0x271F, 0, 0x08053608 }, { 0x2720, 0, 0x0805367C }, { 0x2721, 0, 0x08053718 }, { 0x2722, 0, 0x0805374C },
+ { 0x2723, 0, 0x080537A8 }, { 0x2724, 0, 0x080537F4 }, { 0x2725, 0, 0x08053850 }, { 0x2726, 0, 0x080538A8 },
+ { 0x2727, 0, 0x08053914 }, { 0x2728, 0, 0x08053974 }, { 0x2729, 0, 0x08053A34 }, { 0x272A, 0, 0x08053A4C },
+ { 0x272B, 0, 0x08053A90 }, { 0x272C, 0, 0x08053AB0 }, { 0x272D, 0, 0x08053AF4 }, { 0x272E, 0, 0x08053B3C },
+ { 0x272F, 0, 0x08053B9C }, { 0x2730, 0, 0x08053BCC }, { 0x2731, 0, 0x08053C04 }, { 0x2732, 0, 0x08053C70 },
+ { 0x2733, 0, 0x08053CD8 }, { 0x2734, 0, 0x08053D4C }, { 0x2735, 0, 0x08053DD4 }, { 0x2736, 0, 0x08053E48 },
+ { 0x2737, 0, 0x08053EA8 }, { 0x2738, 0, 0x08053F9C }, { 0x2739, 0, 0x08054038 }, { 0x273A, 0, 0x080540A0 },
+ { 0x273B, 0, 0x0805411C }, { 0x273C, 0, 0x08054188 }, { 0x273D, 0, 0x080541D0 }, { 0x273E, 0, 0x08054278 },
+ { 0x273F, 0, 0x080542A0 }, { 0x2740, 0, 0x0805432C }, { 0x2741, 0, 0x080543CC }, { 0x2742, 0, 0x08054478 },
+ { 0x2743, 0, 0x080544F8 }, { 0x2744, 0, 0x08054580 }, { 0x2745, 0, 0x08054630 }, { 0x2746, 0, 0x08054674 },
+ { 0x2747, 0, 0x080546C4 }, { 0x2748, 0, 0x08054784 }, { 0x2749, 0, 0x080547EC }, { 0x274A, 0, 0x0805483C },
+ { 0x274B, 0, 0x0805489C }, { 0x274C, 0, 0x08054924 }, { 0x274D, 0, 0x0805494C }, { 0x274E, 0, 0x080549E0 },
+ { 0x274F, 0, 0x08054A90 }, { 0x2774, 0, 0x08054B24 }, { 0x2775, 0, 0x08054B7C }, { 0x2776, 0, 0x08054C30 },
+ { 0x2777, 0, 0x08054C3C }, { 0x2778, 0, 0x08054CD0 }, { 0x2779, 0, 0x08054CDC }, { 0x277A, 0, 0x08054D00 },
+ { 0x277B, 0, 0x08054DA4 }, { 0x277C, 0, 0x08054EC8 }, { 0x277D, 0, 0x08054F54 }, { 0x277E, 0, 0x08054FA0 },
+ { 0x277F, 0, 0x08055004 }, { 0x2780, 0, 0x0805503C }, { 0x2781, 0, 0x080550B0 }, { 0x2782, 0, 0x08055110 },
+ { 0x2783, 0, 0x08055138 }, { 0x2784, 0, 0x08055160 }, { 0x2785, 0, 0x08055194 }, { 0x2786, 0, 0x080551E0 },
+ { 0x2787, 0, 0x08055224 }, { 0x2788, 0, 0x08055264 }, { 0x2789, 0, 0x080552A8 }, { 0x278A, 0, 0x080552E8 },
+ { 0x278B, 0, 0x08055310 }, { 0x278C, 0, 0x0805535C }, { 0x278D, 0, 0x080553E0 }, { 0x278E, 0, 0x08055424 },
+ { 0x278F, 0, 0x08055448 }, { 0x2790, 0, 0x08055470 }, { 0x2791, 0, 0x080554F0 }, { 0x2792, 0, 0x08055510 },
+ { 0x2793, 0, 0x08055534 }, { 0x2794, 0, 0x080555BC }, { 0x2795, 0, 0x080555FC }, { 0x2796, 0, 0x0805565C },
+ { 0x2797, 0, 0x08055688 }, { 0x2798, 0, 0x080556CC }, { 0x2799, 0, 0x08055700 }, { 0x279A, 0, 0x0805573C },
+ { 0x279B, 0, 0x0805576C }, { 0x279C, 0, 0x080557B0 }, { 0x279D, 0, 0x08055804 }, { 0x279E, 0, 0x08055858 },
+ { 0x279F, 0, 0x080558DC }, { 0x27A0, 0, 0x0805591C }, { 0x27A1, 0, 0x08055984 }, { 0x27A2, 0, 0x080559C0 },
+ { 0x27A3, 0, 0x08055A10 }, { 0x27A4, 0, 0x08055A38 }, { 0x27A5, 0, 0x08055AB0 }, { 0x27A6, 0, 0x08055AE8 },
+ { 0x27A7, 0, 0x08055B1C }, { 0x27A8, 0, 0x08055B60 }, { 0x27A9, 0, 0x08055BA8 }, { 0x27AA, 0, 0x08055BC0 },
+ { 0x27AB, 0, 0x08055C10 }, { 0x27AC, 0, 0x08055C34 }, { 0x27AD, 0, 0x08055CAC }, { 0x27AE, 0, 0x08055CC4 },
+ { 0x27D8, 0, 0x08055D0C }, { 0x27D9, 0, 0x08055D50 }, { 0x27DA, 0, 0x08055D94 }, { 0x27DB, 0, 0x08055DCC },
+ { 0x27DC, 0, 0x08055E10 }, { 0x27DD, 0, 0x08055E50 }, { 0x27DE, 0, 0x08055ED0 }, { 0x27DF, 0, 0x08055F14 },
+ { 0x27E0, 0, 0x08055F70 }, { 0x27E1, 0, 0x08056000 }, { 0x27E2, 0, 0x0805609C }, { 0x27E3, 0, 0x080560DC },
+ { 0x27E4, 0, 0x080560F8 }, { 0x27E5, 0, 0x08056128 }, { 0x27E6, 0, 0x08056170 }, { 0x27E7, 0, 0x08056220 },
+ { 0x27E8, 0, 0x0805627C }, { 0x27E9, 0, 0x080562D8 }, { 0x27EA, 0, 0x08056334 }, { 0x27EB, 0, 0x0805635C },
+ { 0x27EC, 0, 0x080563B0 }, { 0x27ED, 0, 0x080563D8 }, { 0x27EE, 0, 0x0805643C }, { 0x27EF, 0, 0x08056468 },
+ { 0x27F0, 0, 0x08056488 }, { 0x27F1, 0, 0x080564AC }, { 0x27F2, 0, 0x080564F4 }, { 0x27F3, 0, 0x0805653C },
+ { 0x27F4, 0, 0x08056570 }, { 0x27F5, 0, 0x0805662C }, { 0x27F6, 0, 0x0805668C }, { 0x27F7, 0, 0x080566B0 },
+ { 0x27F8, 0, 0x080566E4 }, { 0x27F9, 0, 0x08056708 }, { 0x27FA, 0, 0x08056734 }, { 0x283C, 0, 0x0805678C },
+ { 0x283D, 0, 0x080567C4 }, { 0x2841, 0, 0x080567FC }, { 0x2842, 0, 0x08056840 }, { 0x2843, 0, 0x08056878 },
+ { 0x2844, 0, 0x080568E0 }, { 0x2845, 0, 0x0805696C }, { 0x2846, 0, 0x080569BC }, { 0x2847, 0, 0x08056A18 },
+ { 0x2848, 0, 0x08056A54 }, { 0x2849, 0, 0x08056AB0 }, { 0x284A, 0, 0x08056AF4 }, { 0x284B, 0, 0x08056B38 },
+ { 0x284C, 0, 0x08056B88 }, { 0x284D, 0, 0x08056BCC }, { 0x284E, 0, 0x08056C2C }, { 0x284F, 0, 0x08056C7C },
+ { 0x2850, 0, 0x08056CA8 }, { 0x2851, 0, 0x08056CF8 }, { 0x2852, 0, 0x08056D24 }, { 0x2853, 0, 0x08056D68 },
+ { 0x2854, 0, 0x08056DC0 }, { 0x2855, 0, 0x08056E04 }, { 0x2856, 0, 0x08056E50 }, { 0x2857, 0, 0x08056E98 },
+ { 0x2858, 0, 0x08056EFC }, { 0x2859, 0, 0x08056F44 }, { 0x285A, 0, 0x08056FA8 }, { 0x285B, 0, 0x08056FE8 },
+ { 0x285C, 0, 0x08057014 }, { 0x285D, 0, 0x0805705C }, { 0x285E, 0, 0x08057088 }, { 0x285F, 0, 0x080570C8 },
+ { 0x2860, 0, 0x080570FC }, { 0x2861, 0, 0x08057114 }, { 0x2862, 0, 0x08057174 }, { 0x2863, 0, 0x080571C0 },
+ { 0x2864, 0, 0x0805722C }, { 0x2865, 0, 0x08057278 }, { 0x2866, 0, 0x080572E4 }, { 0x2867, 0, 0x08057328 },
+ { 0x2868, 0, 0x08057358 }, { 0x2869, 0, 0x080573A4 }, { 0x286A, 0, 0x08057410 }, { 0x286B, 0, 0x08057454 },
+ { 0x286C, 0, 0x08057484 }, { 0x286D, 0, 0x080574D0 }, { 0x286E, 0, 0x080574F8 }, { 0x286F, 0, 0x0805753C },
+ { 0x2870, 0, 0x080575A8 }, { 0x2871, 0, 0x080575E4 }, { 0x2872, 0, 0x08057628 }, { 0x2873, 0, 0x0805765C },
+ { 0x2874, 0, 0x080576B4 }, { 0x2875, 0, 0x080576D0 }, { 0x2876, 0, 0x08057728 }, { 0x2877, 0, 0x0805777C },
+ { 0x2878, 0, 0x080577D4 }, { 0x2879, 0, 0x08057828 }, { 0x287A, 0, 0x08057890 }, { 0x287B, 0, 0x08057900 },
+ { 0x287C, 0, 0x08057968 }, { 0x287D, 0, 0x080579B8 }, { 0x287E, 0, 0x080579E8 }, { 0x287F, 0, 0x08057A5C },
+ { 0x2880, 0, 0x08057AA8 }, { 0x2881, 0, 0x08057B24 }, { 0x2882, 0, 0x08057B5C }, { 0x2883, 0, 0x08057B94 },
+ { 0x2884, 0, 0x08057BC8 }, { 0x2885, 0, 0x08057BE0 }, { 0x2886, 0, 0x08057BF8 }, { 0x2887, 0, 0x08057C24 },
+ { 0x2888, 0, 0x08057C5C }, { 0x2889, 0, 0x08057C88 }, { 0x288A, 0, 0x08057CB4 }, { 0x288B, 0, 0x08057CD4 },
+ { 0x28A0, 0, 0x08057CF0 }, { 0x28A1, 0, 0x08057D20 }, { 0x28A2, 0, 0x08057D5C }, { 0x28A3, 0, 0x08057D94 },
+ { 0x28A4, 0, 0x08057E80 }, { 0x28A5, 0, 0x08057F64 }, { 0x28A6, 0, 0x08057FA8 }, { 0x28A7, 0, 0x08058080 },
+ { 0x28A8, 0, 0x080580B4 }, { 0x28A9, 0, 0x080580F4 }, { 0x28AA, 0, 0x08058130 }, { 0x28AB, 0, 0x08058160 },
+ { 0x28AC, 0, 0x080581EC }, { 0x28AD, 0, 0x080582C0 }, { 0x28AF, 0, 0x080582DC }, { 0x28B0, 0, 0x080582F8 },
+ { 0x28B1, 0, 0x08058340 }, { 0x28B2, 0, 0x080583A8 }, { 0x28B3, 0, 0x08058400 }, { 0x28B4, 0, 0x08058488 },
+ { 0x28B5, 0, 0x080584E8 }, { 0x28B6, 0, 0x08058524 }, { 0x28B7, 0, 0x08058594 }, { 0x28B8, 0, 0x080585F4 },
+ { 0x28B9, 0, 0x08058618 }, { 0x28BA, 0, 0x0805864C }, { 0x28BB, 0, 0x08058688 }, { 0x28BC, 0, 0x080586B8 },
+ { 0x28BD, 0, 0x080586F8 }, { 0x28BE, 0, 0x0805871C }, { 0x28BF, 0, 0x08058760 }, { 0x28C0, 0, 0x0805878C },
+ { 0x28C1, 0, 0x080587B4 }, { 0x28C2, 0, 0x0805881C }, { 0x28C3, 0, 0x08058880 }, { 0x28C4, 0, 0x080589EC },
+ { 0x28C5, 0, 0x08058A60 }, { 0x28C6, 0, 0x08058A78 }, { 0x28C7, 0, 0x08058AC0 }, { 0x28C8, 0, 0x08058AF4 },
+ { 0x28C9, 0, 0x08058B54 }, { 0x28CA, 0, 0x08058B9C }, { 0x28CB, 0, 0x08058BD4 }, { 0x28CC, 0, 0x08058C24 },
+ { 0x28CD, 0, 0x08058C58 }, { 0x28CE, 0, 0x08058C6C }, { 0x28CF, 0, 0x08058C88 }, { 0x28D0, 0, 0x08058CCC },
+ { 0x28D1, 0, 0x08058D1C }, { 0x28D2, 0, 0x08058D4C }, { 0x28D3, 0, 0x08058DA0 }, { 0x28D4, 0, 0x08058DF0 },
+ { 0x28D5, 0, 0x08058E4C }, { 0x28D6, 0, 0x08058EE8 }, { 0x28D7, 0, 0x08058F10 }, { 0x28D8, 0, 0x08058F60 },
+ { 0x28D9, 0, 0x0805901C }, { 0x28DA, 0, 0x08059030 }, { 0x28DB, 0, 0x08059154 }, { 0x28DC, 0, 0x08059184 },
+ { 0x28DE, 0, 0x080591A8 }, { 0x28DF, 0, 0x080591E4 }, { 0x28E0, 0, 0x08059220 }, { 0x28E1, 0, 0x08059260 },
+ { 0x28E2, 0, 0x080592C8 }, { 0x28E3, 0, 0x0805931C }, { 0x28E4, 0, 0x08059378 }, { 0x28E5, 0, 0x080593A4 },
+ { 0x28E6, 0, 0x080593B8 }, { 0x28E7, 0, 0x080593FC }, { 0x28E8, 0, 0x08059420 }, { 0x28E9, 0, 0x0805945C },
+ { 0x28EA, 0, 0x08059480 }, { 0x28EB, 0, 0x080594D4 }, { 0x28EC, 0, 0x08059564 }, { 0x28ED, 0, 0x080595B8 },
+ { 0x28EE, 0, 0x080595F8 }, { 0x28EF, 0, 0x08059640 }, { 0x28F0, 0, 0x080596F8 }, { 0x28F1, 0, 0x08059754 },
+ { 0x28F2, 0, 0x080597D4 }, { 0x28F3, 0, 0x08059814 }, { 0x28F4, 0, 0x080599B0 }, { 0x28F5, 0, 0x080599F8 },
+ { 0x28F6, 0, 0x08059AC0 }, { 0x28F7, 0, 0x08059AEC }, { 0x28F8, 0, 0x08059B70 }, { 0x28F9, 0, 0x08059BDC },
+ { 0x28FA, 0, 0x08059C00 }, { 0x28FB, 0, 0x08059C60 }, { 0x28FC, 0, 0x08059CBC }, { 0x28FD, 0, 0x08059DA0 },
+ { 0x28FE, 0, 0x08059DB0 }, { 0x28FF, 0, 0x08059E2C }, { 0x2900, 0, 0x08059EC8 }, { 0x2901, 0, 0x08059EF4 },
+ { 0x2902, 0, 0x08059F70 }, { 0x2903, 0, 0x08059FD0 }, { 0x2904, 0, 0x0805A04C }, { 0x2905, 0, 0x0805A24C },
+ { 0x2906, 0, 0x0805A4F8 }, { 0x2907, 0, 0x0805A584 }, { 0x2908, 0, 0x0805A5C0 }, { 0x2909, 0, 0x0805A60C },
+ { 0x290A, 0, 0x0805A640 }, { 0x290B, 0, 0x0805A6C8 }, { 0x290C, 0, 0x0805A9C0 }, { 0x290D, 0, 0x0805AD84 },
+ { 0x290E, 0, 0x0805ADF8 }, { 0x290F, 0, 0x0805AE40 }, { 0x2910, 0, 0x0805AE74 }, { 0x2911, 0, 0x0805AF50 },
+ { 0x2912, 0, 0x0805AFCC }, { 0x2913, 0, 0x0805B044 }, { 0x2914, 0, 0x0805B104 }, { 0x2915, 0, 0x0805B1F8 },
+ { 0x2916, 0, 0x0805B224 }, { 0x2917, 0, 0x0805B244 }, { 0x2918, 0, 0x0805B2A0 }, { 0x2919, 0, 0x0805B2D0 },
+ { 0x291A, 0, 0x0805B314 }, { 0x291B, 0, 0x0805B354 }, { 0x291C, 0, 0x0805B3B0 }, { 0x291D, 0, 0x0805B400 },
+ { 0x291E, 0, 0x0805B454 }, { 0x291F, 0, 0x0805B494 }, { 0x2920, 0, 0x0805B4EC }, { 0x2921, 0, 0x0805B538 },
+ { 0x2922, 0, 0x0805B58C }, { 0x2923, 0, 0x0805B600 }, { 0x2924, 0, 0x0805B65C }, { 0x2925, 0, 0x0805B738 },
+ { 0x2926, 0, 0x0805B770 }, { 0x2927, 0, 0x0805B794 }, { 0x2928, 0, 0x0805B7C8 }, { 0x2929, 0, 0x0805B7EC },
+ { 0x292A, 0, 0x0805B814 }, { 0x292B, 0, 0x0805B8C0 }, { 0x292C, 0, 0x0805B994 }, { 0x292D, 0, 0x0805BA44 },
+ { 0x292E, 0, 0x0805BB14 }, { 0x292F, 0, 0x0805BB74 }, { 0x2930, 0, 0x0805BBEC }, { 0x2931, 0, 0x0805BC40 },
+ { 0x2932, 0, 0x0805BCBC }, { 0x2933, 0, 0x0805BD3C }, { 0x2934, 0, 0x0805BDA4 }, { 0x2935, 0, 0x0805BDE0 },
+ { 0x2936, 0, 0x0805BE20 }, { 0x2937, 0, 0x0805BE90 }, { 0x2938, 0, 0x0805BEE8 }, { 0x2939, 0, 0x0805BF5C },
+ { 0x293A, 0, 0x0805BF80 }, { 0x293B, 0, 0x0805BFE4 }, { 0x293C, 0, 0x0805C00C }, { 0x293D, 0, 0x0805C094 },
+ { 0x293E, 0, 0x0805C0EC }, { 0x293F, 0, 0x0805C168 }, { 0x2940, 0, 0x0805C1EC }, { 0x2941, 0, 0x0805C258 },
+ { 0x2942, 0, 0x0805C2DC }, { 0x2943, 0, 0x0805C350 }, { 0x2944, 0, 0x0805C3B8 }, { 0x2945, 0, 0x0805C3F8 },
+ { 0x2946, 0, 0x0805C44C }, { 0x2947, 0, 0x0805C470 }, { 0x2948, 0, 0x0805C4F0 }, { 0x2949, 0, 0x0805C518 },
+ { 0x294A, 0, 0x0805C534 }, { 0x294B, 0, 0x0805C54C }, { 0x294C, 0, 0x0805C570 }, { 0x294D, 0, 0x0805C5A8 },
+ { 0x294E, 0, 0x0805C680 }, { 0x294F, 0, 0x0805C740 }, { 0x2950, 0, 0x0805C794 }, { 0x2951, 0, 0x0805C7F4 },
+ { 0x2952, 0, 0x0805C854 }, { 0x2953, 0, 0x0805C914 }, { 0x2954, 0, 0x0805C940 }, { 0x2955, 0, 0x0805C980 },
+ { 0x2956, 0, 0x0805C9DC }, { 0x2957, 0, 0x0805CA08 }, { 0x2958, 0, 0x0805CA2C }, { 0x2959, 0, 0x0805CA48 },
+ { 0x295A, 0, 0x0805CA6C }, { 0x295B, 0, 0x0805CAB4 }, { 0x295C, 0, 0x0805CB08 }, { 0x295D, 0, 0x0805CB24 },
+ { 0x295E, 0, 0x0805CB44 }, { 0x295F, 0, 0x0805CB60 }, { 0x2960, 0, 0x0805CC3C }, { 0x2961, 0, 0x0805CD14 },
+ { 0x2962, 0, 0x0805CD3C }, { 0x2968, 0, 0x0805CE60 }, { 0x2969, 0, 0x0805CE78 }, { 0x296A, 0, 0x0805CEF4 },
+ { 0x296B, 0, 0x0805CF24 }, { 0x296C, 0, 0x0805CF64 }, { 0x296D, 0, 0x0805CF9C }, { 0x296E, 0, 0x0805CFB4 },
+ { 0x296F, 0, 0x0805D018 }, { 0x2970, 0, 0x0805D08C }, { 0x2971, 0, 0x0805D17C }, { 0x2972, 0, 0x0805D1C4 },
+ { 0x2973, 0, 0x0805D234 }, { 0x2974, 0, 0x0805D258 }, { 0x2975, 0, 0x0805D2E4 }, { 0x2976, 0, 0x0805D314 },
+ { 0x2977, 0, 0x0805D358 }, { 0x2978, 0, 0x0805D3DC }, { 0x2979, 0, 0x0805D414 }, { 0x297A, 0, 0x0805D458 },
+ { 0x29CC, 0, 0x0805D4A8 }, { 0x29CD, 0, 0x0805D4C0 }, { 0x29CE, 0, 0x0805D514 }, { 0x29CF, 0, 0x0805D550 },
+ { 0x29D0, 0, 0x0805D580 }, { 0x29D1, 0, 0x0805D5AC }, { 0x29D2, 0, 0x0805D5D4 }, { 0x29D3, 0, 0x0805D620 },
+ { 0x29D4, 0, 0x0805D724 }, { 0x29D5, 0, 0x0805D824 }, { 0x29D6, 0, 0x0805D864 }, { 0x29D7, 0, 0x0805D8A8 },
+ { 0x29D8, 0, 0x0805D9A8 }, { 0x29D9, 0, 0x0805DAA4 }, { 0x29DA, 0, 0x0805DAFC }, { 0x29DB, 0, 0x0805DB3C },
+ { 0x29DC, 0, 0x0805DBA0 }, { 0x29DD, 0, 0x0805DBDC }, { 0x29DE, 0, 0x0805DC00 }, { 0x29DF, 0, 0x0805DC68 },
+ { 0x29E0, 0, 0x0805DC94 }, { 0x29E1, 0, 0x0805DCC0 }, { 0x29E2, 0, 0x0805DCE8 }, { 0x29E3, 0, 0x0805DE80 },
+ { 0x29E4, 0, 0x0805DEC0 }, { 0x29E5, 0, 0x0805DFAC }, { 0x29E6, 0, 0x0805DFC8 }, { 0x29E7, 0, 0x0805E00C },
+ { 0x29E8, 0, 0x0805E098 }, { 0x29E9, 0, 0x0805E0DC }, { 0x29EA, 0, 0x0805E1D0 }, { 0x29EB, 0, 0x0805E204 },
+ { 0x29EC, 0, 0x0805E234 }, { 0x29ED, 0, 0x0805E258 }, { 0x29EE, 0, 0x0805E2A4 }, { 0x29EF, 0, 0x0805E2D4 },
+ { 0x29F0, 0, 0x0805E314 }, { 0x29F1, 0, 0x0805E344 }, { 0x29F2, 0, 0x0805E390 }, { 0x29F3, 0, 0x0805E3EC },
+ { 0x29F4, 0, 0x0805E428 }, { 0x29F5, 0, 0x0805E49C }, { 0x29F8, 0, 0x0805E4D8 }, { 0x29F9, 0, 0x0805E530 },
+ { 0x29FA, 0, 0x0805E56C }, { 0x29FB, 0, 0x0805E5B8 }, { 0x29FC, 0, 0x0805E608 }, { 0x29FD, 0, 0x0805E654 },
+ { 0x29FE, 0, 0x0805E6C8 }, { 0x29FF, 0, 0x0805E700 }, { 0x2A00, 0, 0x0805E7B4 }, { 0x2A01, 0, 0x0805E7D0 },
+ { 0x2A02, 0, 0x0805E81C }, { 0x2A30, 0, 0x0805E878 }, { 0x2A31, 0, 0x0805E898 }, { 0x2A32, 0, 0x0805E8DC },
+ { 0x2A33, 0, 0x0805E94C }, { 0x2A34, 0, 0x0805EA04 }, { 0x2A35, 0, 0x0805EA90 }, { 0x2A36, 0, 0x0805EB14 },
+ { 0x2A37, 0, 0x0805EB4C }, { 0x2A38, 0, 0x0805EBD0 }, { 0x2A39, 0, 0x0805EC28 }, { 0x2A3A, 0, 0x0805EC40 },
+ { 0x2A94, 0, 0x0805EC78 }, { 0x2A95, 0, 0x0805ECA4 }, { 0x2A96, 0, 0x0805ECD0 }, { 0x2A97, 0, 0x0805EDEC },
+ { 0x2A98, 0, 0x0805EF18 }, { 0x2A99, 0, 0x0805EF50 }, { 0x2A9A, 0, 0x0805EFE0 }, { 0x2A9B, 0, 0x0805F120 },
+ { 0x2A9C, 0, 0x0805F254 }, { 0x2A9D, 0, 0x0805F30C }, { 0x2A9E, 0, 0x0805F3CC }, { 0x2A9F, 0, 0x0805F4B4 },
+ { 0x2AA0, 0, 0x0805F5D0 }, { 0x2AA1, 0, 0x0805F604 }, { 0x2AA2, 0, 0x0805F63C }, { 0x2AA3, 0, 0x0805F68C },
+ { 0x2AA4, 0, 0x0805F6BC }, { 0x2AA5, 0, 0x0805F71C }, { 0x2AA6, 0, 0x0805F760 }, { 0x2AA7, 0, 0x0805F7E4 },
+ { 0x2AA8, 0, 0x0805F81C }, { 0x2AA9, 0, 0x0805F834 }, { 0x2AAA, 0, 0x0805F870 }, { 0x2AAB, 0, 0x0805F888 },
+ { 0x2AAC, 0, 0x0805F8B0 }, { 0x2AAD, 0, 0x0805F8D4 }, { 0x2AAE, 0, 0x0805F944 }, { 0x2AAF, 0, 0x0805F988 },
+ { 0x2AB0, 0, 0x0805F9B0 }, { 0x2AB1, 0, 0x0805FA58 }, { 0x2AB2, 0, 0x0805FA6C }, { 0x2AB3, 0, 0x0805FA80 },
+ { 0x2AB4, 0, 0x0805FB0C }, { 0x2AB5, 0, 0x0805FB20 }, { 0x2AB6, 0, 0x0805FB64 }, { 0x2AB7, 0, 0x0805FB80 },
+ { 0x2AB8, 0, 0x0805FB9C }, { 0x2AB9, 0, 0x0805FBF4 }, { 0x2ABA, 0, 0x0805FC24 }, { 0x2ABB, 0, 0x0805FC88 },
+ { 0x2ABC, 0, 0x0805FCB0 }, { 0x2ABD, 0, 0x0805FCD8 }, { 0x2ABE, 0, 0x0805FDD8 }, { 0x2ABF, 0, 0x0805FDFC },
+ { 0x2AC0, 0, 0x0805FF50 }, { 0x2AC1, 0, 0x0805FF7C }, { 0x2AC2, 0, 0x080600D0 }, { 0x2AC3, 0, 0x080600EC },
+ { 0x2AC4, 0, 0x080601F8 }, { 0x2AC5, 0, 0x0806022C }, { 0x2AC6, 0, 0x08060250 }, { 0x2AC7, 0, 0x08060260 },
+ { 0x2AC8, 0, 0x08060270 }, { 0x2AC9, 0, 0x08060280 }, { 0x2ACA, 0, 0x080602E0 }, { 0x2ACB, 0, 0x0806030C },
+ { 0x2ACC, 0, 0x08060340 }, { 0x2ACD, 0, 0x080603A4 }, { 0x2ACE, 0, 0x080603C0 }, { 0x2ACF, 0, 0x0806047C },
+ { 0x2AD0, 0, 0x08060494 }, { 0x2AD1, 0, 0x0806053C }, { 0x2AD2, 0, 0x080605B0 }, { 0x2AD3, 0, 0x080605FC },
+ { 0x2AD4, 0, 0x0806067C }, { 0x2AD5, 0, 0x080606A0 }, { 0x2AD6, 0, 0x080606BC }, { 0x2AD7, 0, 0x080606EC },
+ { 0x2AD8, 0, 0x08060724 }, { 0x2AD9, 0, 0x08060748 }, { 0x2ADA, 0, 0x08060794 }, { 0x2ADB, 0, 0x08060814 },
+ { 0x2ADC, 0, 0x08060874 }, { 0x2ADD, 0, 0x080608B4 }, { 0x2ADE, 0, 0x080608D0 }, { 0x2ADF, 0, 0x08060960 },
+ { 0x2AE0, 0, 0x08060A00 }, { 0x2AE1, 0, 0x08060AA8 }, { 0x2AE2, 0, 0x08060AD4 }, { 0x2AE3, 0, 0x08060B10 },
+ { 0x2AE4, 0, 0x08060B74 }, { 0x2AE5, 0, 0x08060BD0 }, { 0x2AE6, 0, 0x08060C6C }, { 0x2AEA, 0, 0x08060CDC },
+ { 0x2AEB, 0, 0x08060D1C }, { 0x2AEC, 0, 0x08060D70 }, { 0x2AED, 0, 0x08060D98 }, { 0x2AEE, 0, 0x08060DB8 },
+ { 0x2AF8, 0, 0x08060DC8 }, { 0x2AF9, 0, 0x08060DE4 }, { 0x2AFA, 0, 0x08060EC8 }, { 0x2AFB, 0, 0x08060FC0 },
+ { 0x2AFC, 0, 0x080610CC }, { 0x2AFD, 0, 0x080611BC }, { 0x2AFE, 0, 0x080611F4 }, { 0x2AFF, 0, 0x080612EC },
+ { 0x2B00, 0, 0x080613FC }, { 0x2B01, 0, 0x08061448 }, { 0x2B02, 0, 0x08061470 }, { 0x2B03, 0, 0x080614D0 },
+ { 0x2B04, 0, 0x08061504 }, { 0x2B05, 0, 0x08061578 }, { 0x2B06, 0, 0x080615DC }, { 0x2B07, 0, 0x08061658 },
+ { 0x2B08, 0, 0x0806167C }, { 0x2B09, 0, 0x080616C0 }, { 0x2B0A, 0, 0x08061714 }, { 0x2B0B, 0, 0x08061750 },
+ { 0x2B0C, 0, 0x080617A8 }, { 0x2B0D, 0, 0x080617D8 }, { 0x2B0E, 0, 0x08061810 }, { 0x2B0F, 0, 0x08061890 },
+ { 0x2B10, 0, 0x080619A0 }, { 0x2B11, 0, 0x08061AD8 }, { 0x2B12, 0, 0x08061B44 }, { 0x2B13, 0, 0x08061BA0 },
+ { 0x2B14, 0, 0x08061C0C }, { 0x2B15, 0, 0x08061C44 }, { 0x2B16, 0, 0x08061CE0 }, { 0x2B17, 0, 0x08061D4C },
+ { 0x2B18, 0, 0x08061D70 }, { 0x2B19, 0, 0x08061DD4 }, { 0x2B1A, 0, 0x08061EB4 }, { 0x2B1B, 0, 0x08061F10 },
+ { 0x2B1C, 0, 0x08061F88 }, { 0x2B1D, 0, 0x08061FC4 }, { 0x2B1E, 0, 0x08061FEC }, { 0x2B1F, 0, 0x08062024 },
+ { 0x2B20, 0, 0x0806209C }, { 0x2B21, 0, 0x0806212C }, { 0x2B22, 0, 0x08062164 }, { 0x2B23, 0, 0x080621A8 },
+ { 0x2B24, 0, 0x0806229C }, { 0x2B25, 0, 0x080622D8 }, { 0x2B26, 0, 0x080622F8 }, { 0x2B27, 0, 0x08062350 },
+ { 0x2B28, 0, 0x080623A0 }, { 0x2B29, 0, 0x080623D0 }, { 0x2B2A, 0, 0x08062428 }, { 0x2B2B, 0, 0x08062478 },
+ { 0x2B2C, 0, 0x080624AC }, { 0x2B2D, 0, 0x08062500 }, { 0x2B2E, 0, 0x08062550 }, { 0x2B2F, 0, 0x08062580 },
+ { 0x2B30, 0, 0x080625D4 }, { 0x2B31, 0, 0x08062624 }, { 0x2B32, 0, 0x08062650 }, { 0x2B33, 0, 0x08062670 },
+ { 0x2B34, 0, 0x080626B0 }, { 0x2B35, 0, 0x080626DC }, { 0x2B36, 0, 0x080626FC }, { 0x2B37, 0, 0x0806273C },
+ { 0x2B38, 0, 0x080627D8 }, { 0x2B39, 0, 0x08062890 }, { 0x2B3A, 0, 0x08062910 }, { 0x2B3B, 0, 0x08062968 },
+ { 0x2B3C, 0, 0x080629A4 }, { 0x2B3D, 0, 0x080629E0 }, { 0x2B3E, 0, 0x08062A90 }, { 0x2B3F, 0, 0x08062AD8 },
+ { 0x2B40, 0, 0x08062B34 }, { 0x2B5C, 0, 0x08062B84 }, { 0x2B5D, 0, 0x08062C3C }, { 0x2B5E, 0, 0x08062C68 },
+ { 0x2B5F, 0, 0x08062C94 }, { 0x2B60, 0, 0x08062CE8 }, { 0x2B61, 0, 0x08062D8C }, { 0x2B62, 0, 0x08062E34 },
+ { 0x2B63, 0, 0x08062E84 }, { 0x2B64, 0, 0x08062F18 }, { 0x2B65, 0, 0x08062F50 }, { 0x2B66, 0, 0x08062F98 },
+ { 0x2B67, 0, 0x08062FE0 }, { 0x32C8, 0, 0x08063054 }, { 0x32C9, 0, 0x080630D8 }, { 0x32CA, 0, 0x08063120 },
+ { 0x32CB, 0, 0x08063184 }, { 0x32CC, 0, 0x080631E0 }, { 0x32CD, 0, 0x08063210 }, { 0x32CE, 0, 0x0806326C },
+ { 0x32CF, 0, 0x08063294 }, { 0x32D0, 0, 0x080632B4 }, { 0x32D1, 0, 0x08063300 }, { 0x32D2, 0, 0x08063338 },
+ { 0x32D3, 0, 0x08063384 }, { 0x32D4, 0, 0x080633B4 }, { 0x332C, 0, 0x080633E8 }, { 0x332D, 0, 0x08063408 },
+ { 0x332E, 0, 0x080634FC }, { 0x332F, 0, 0x0806356C }, { 0x3330, 0, 0x08063594 }, { 0x3331, 0, 0x080635AC },
+ { 0x3332, 0, 0x080635D0 }, { 0x3333, 0, 0x08063618 }, { 0x3334, 0, 0x0806369C }, { 0x3335, 0, 0x08063714 },
+ { 0x3336, 0, 0x08063734 }, { 0x3337, 0, 0x08063788 }, { 0x3338, 0, 0x080637AC }, { 0x3339, 0, 0x080637CC },
+ { 0x333A, 0, 0x08063838 }, { 0x333B, 0, 0x08063868 }, { 0x333C, 0, 0x08063898 }, { 0x333D, 0, 0x08063948 },
+ { 0x333E, 0, 0x08063988 }, { 0x333F, 0, 0x080639AC }, { 0x3340, 0, 0x08063A58 }, { 0x3341, 0, 0x08063AB0 },
+ { 0x3342, 0, 0x08063B24 }, { 0x3343, 0, 0x08063BBC }, { 0x3344, 0, 0x08063C28 }, { 0x3345, 0, 0x08063CF0 },
+ { 0x3346, 0, 0x08063D24 }, { 0x3347, 0, 0x08063D5C }, { 0x3348, 0, 0x08063D8C }, { 0x3349, 0, 0x08063DEC },
+ { 0x334A, 0, 0x08063E70 }, { 0x334B, 0, 0x08063EA8 }, { 0x334C, 0, 0x08063EC4 }, { 0x334D, 0, 0x08063FB4 },
+ { 0x334E, 0, 0x08063FDC }, { 0x334F, 0, 0x08064038 }, { 0x3350, 0, 0x08064058 }, { 0x3351, 0, 0x0806408C },
+ { 0x3352, 0, 0x080640B0 }, { 0x3353, 0, 0x080640E0 }, { 0x3354, 0, 0x08064168 }, { 0x3355, 0, 0x080641B4 },
+ { 0x3356, 0, 0x080641EC }, { 0x3357, 0, 0x08064218 }, { 0x3358, 0, 0x08064230 }, { 0x3359, 0, 0x08064264 },
+ { 0x335A, 0, 0x08064298 }, { 0x335B, 0, 0x080642F0 }, { 0x335C, 0, 0x08064354 }, { 0x335D, 0, 0x0806437C },
+ { 0x335E, 0, 0x080643B4 }, { 0x335F, 0, 0x080643E4 }, { 0x3360, 0, 0x0806444C }, { 0x3361, 0, 0x08064498 },
+ { 0x3362, 0, 0x080644EC }, { 0x3363, 0, 0x0806453C }, { 0x3364, 0, 0x08064564 }, { 0x3365, 0, 0x08064654 },
+ { 0x3366, 0, 0x08064718 }, { 0x3367, 0, 0x080647E4 }, { 0x3368, 0, 0x08064860 }, { 0x3369, 0, 0x080648B8 },
+ { 0x336A, 0, 0x08064988 }, { 0x336B, 0, 0x080649F4 }, { 0x336C, 0, 0x08064A44 }, { 0x336D, 0, 0x08064AA0 },
+ { 0x336E, 0, 0x08064AE8 }, { 0x336F, 0, 0x08064B10 }, { 0x3370, 0, 0x08064B64 }, { 0x3371, 0, 0x08064BBC },
+ { 0x3390, 0, 0x08064BEC }, { 0x3391, 0, 0x08064C24 }, { 0x3392, 0, 0x08064CE0 }, { 0x3393, 0, 0x08064D4C },
+ { 0x3394, 0, 0x08064DA0 }, { 0x3395, 0, 0x08064E04 }, { 0x3396, 0, 0x08064F10 }, { 0x3397, 0, 0x08064F84 },
+ { 0x3398, 0, 0x08064FBC }, { 0x3399, 0, 0x08065070 }, { 0x339A, 0, 0x080650DC }, { 0x339B, 0, 0x08065144 },
+ { 0x339C, 0, 0x0806516C }, { 0x339D, 0, 0x0806519C }, { 0x339E, 0, 0x080651D4 }, { 0x339F, 0, 0x080651F0 },
+ { 0x33A0, 0, 0x0806524C }, { 0x33A1, 0, 0x08065358 }, { 0x33A2, 0, 0x080653CC }, { 0x33A3, 0, 0x08065408 },
+ { 0x33A4, 0, 0x08065438 }, { 0x33A5, 0, 0x08065470 }, { 0x33A6, 0, 0x080654CC }, { 0x33A7, 0, 0x08065510 },
+ { 0x33A8, 0, 0x0806555C }, { 0x33A9, 0, 0x080655A0 }, { 0x33AA, 0, 0x080655C0 }, { 0x33AB, 0, 0x08065600 },
+ { 0x33AC, 0, 0x08065658 }, { 0x33AD, 0, 0x08065678 }, { 0x33AE, 0, 0x08065710 }, { 0x33AF, 0, 0x080657A8 },
+ { 0x33B0, 0, 0x080657D0 }, { 0x33B1, 0, 0x080657E8 }, { 0x33B2, 0, 0x08065860 }, { 0x33B3, 0, 0x080658E4 },
+ { 0x33B4, 0, 0x08065930 }, { 0x33B5, 0, 0x0806597C }, { 0x33B6, 0, 0x080659DC }, { 0x33B7, 0, 0x08065A28 },
+ { 0x33B8, 0, 0x08065ABC }, { 0x33B9, 0, 0x08065AE0 }, { 0x33BA, 0, 0x08065B08 }, { 0x33BB, 0, 0x08065B7C },
+ { 0x33BC, 0, 0x08065BD8 }, { 0x33BD, 0, 0x08065C5C }, { 0x33BE, 0, 0x08065C88 }, { 0x33BF, 0, 0x08065CCC },
+ { 0x33C0, 0, 0x08065D30 }, { 0x33C1, 0, 0x08065DD4 }, { 0x33C2, 0, 0x08065E24 }, { 0x33C3, 0, 0x08065E84 },
+ { 0x33C4, 0, 0x08065F4C }, { 0x33C5, 0, 0x08066024 }, { 0x33C6, 0, 0x08066120 }, { 0x33C7, 0, 0x08066144 },
+ { 0x33C8, 0, 0x08066200 }, { 0x33C9, 0, 0x08066268 }, { 0x33CA, 0, 0x0806629C }, { 0x33CB, 0, 0x080662D0 },
+ { 0x33CC, 0, 0x0806630C }, { 0x33CD, 0, 0x08066324 }, { 0x33CE, 0, 0x0806635C }, { 0x33CF, 0, 0x0806637C },
+ { 0x33D0, 0, 0x080663AC }, { 0x33D1, 0, 0x08066464 }, { 0x33D2, 0, 0x08066578 }, { 0x33D3, 0, 0x080665F4 },
+ { 0x33D4, 0, 0x0806665C }, { 0x33D5, 0, 0x080666D0 }, { 0x33D6, 0, 0x08066708 }, { 0x33D7, 0, 0x08066788 },
+ { 0x33D8, 0, 0x080667D4 }, { 0x33D9, 0, 0x08066834 }, { 0x33F4, 0, 0x080668FC }, { 0x33F5, 0, 0x08066934 },
+ { 0x33F6, 0, 0x080669DC }, { 0x33F7, 0, 0x08066A3C }, { 0x33F9, 0, 0x08066B00 }, { 0x3458, 0, 0x08066B40 },
+ { 0x3459, 0, 0x08066B60 }, { 0x345A, 0, 0x08066BC0 }, { 0x345B, 0, 0x08066C10 }, { 0x345C, 0, 0x08066C7C },
+ { 0x345D, 0, 0x08066CB8 }, { 0x345E, 0, 0x08066D20 }, { 0x345F, 0, 0x08066D90 }, { 0x3460, 0, 0x08066E58 },
+ { 0x3461, 0, 0x08066E9C }, { 0x3462, 0, 0x08066EE8 }, { 0x3463, 0, 0x08066F38 }, { 0x3464, 0, 0x08066F64 },
+ { 0x3465, 0, 0x08066FF8 }, { 0x3466, 0, 0x080670A4 }, { 0x3467, 0, 0x080670F0 }, { 0x3468, 0, 0x08067144 },
+ { 0x3469, 0, 0x08067174 }, { 0x346A, 0, 0x080671E8 }, { 0x346B, 0, 0x08067208 }, { 0x346C, 0, 0x08067224 },
+ { 0x346D, 0, 0x0806728C }, { 0x346E, 0, 0x0806731C }, { 0x346F, 0, 0x0806739C }, { 0x3470, 0, 0x08067400 },
+ { 0x3471, 0, 0x0806743C }, { 0x3472, 0, 0x0806746C }, { 0x3473, 0, 0x080674B0 }, { 0x3474, 0, 0x08067520 },
+ { 0x3475, 0, 0x08067594 }, { 0x3476, 0, 0x080675B8 }, { 0x3477, 0, 0x080675E0 }, { 0x3478, 0, 0x08067618 },
+ { 0x3479, 0, 0x08067648 }, { 0x347A, 0, 0x08067688 }, { 0x347B, 0, 0x080676B0 }, { 0x347C, 0, 0x080676F0 },
+ { 0x347D, 0, 0x08067760 }, { 0x347E, 0, 0x080677A4 }, { 0x347F, 0, 0x080677F4 }, { 0x3480, 0, 0x0806782C },
+ { 0x3481, 0, 0x080678A0 }, { 0x3482, 0, 0x080678C8 }, { 0x3483, 0, 0x080678F8 }, { 0x3484, 0, 0x08067934 },
+ { 0x3485, 0, 0x08067990 }, { 0x3486, 0, 0x080679E0 }, { 0x3487, 0, 0x08067A18 }, { 0x3488, 0, 0x08067A68 },
+ { 0x3489, 0, 0x08067AE8 }, { 0x348A, 0, 0x08067B54 }, { 0x348B, 0, 0x08067BBC }, { 0x348C, 0, 0x08067C0C },
+ { 0x348D, 0, 0x08067C5C }, { 0x348E, 0, 0x08067CB8 }, { 0x348F, 0, 0x08067D6C }, { 0x3490, 0, 0x08067DE0 },
+ { 0x3491, 0, 0x08067E2C }, { 0x3492, 0, 0x08067E80 }, { 0x3493, 0, 0x08067EDC }, { 0x3494, 0, 0x08067F20 },
+ { 0x3495, 0, 0x08067F44 }, { 0x3496, 0, 0x08067F64 }, { 0x3497, 0, 0x08067FEC }, { 0x3498, 0, 0x0806803C },
+ { 0x3499, 0, 0x08068094 }, { 0x349A, 0, 0x080680C8 }, { 0x349B, 0, 0x080680FC }, { 0x349C, 0, 0x0806812C },
+ { 0x349D, 0, 0x08068158 }, { 0x349E, 0, 0x08068180 }, { 0x349F, 0, 0x080681C0 }, { 0x34A0, 0, 0x08068224 },
+ { 0x34A1, 0, 0x08068278 }, { 0x34A2, 0, 0x080682C0 }, { 0x34A3, 0, 0x0806830C }, { 0x34A4, 0, 0x08068394 },
+ { 0x34A5, 0, 0x080683F4 }, { 0x34A6, 0, 0x08068430 }, { 0x34A7, 0, 0x08068498 }, { 0x34A8, 0, 0x080684FC },
+ { 0x34A9, 0, 0x08068544 }, { 0x34AA, 0, 0x08068564 }, { 0x34AB, 0, 0x08068598 }, { 0x34AC, 0, 0x0806860C },
+ { 0x34AD, 0, 0x08068640 }, { 0x34AE, 0, 0x080686F4 }, { 0x34AF, 0, 0x08068768 }, { 0x34B0, 0, 0x08068780 },
+ { 0x34B1, 0, 0x080687E0 }, { 0x34B2, 0, 0x080687F8 }, { 0x34B3, 0, 0x08068860 }, { 0x3520, 0, 0x080688F4 },
+ { 0x3521, 0, 0x08068958 }, { 0x3522, 0, 0x080689C8 }, { 0x3523, 0, 0x08068A38 }, { 0x3524, 0, 0x08068A88 },
+ { 0x3525, 0, 0x08068B04 }, { 0x3526, 0, 0x08068B30 }, { 0x3527, 0, 0x08068B7C }, { 0x3528, 0, 0x08068CA0 },
+ { 0x3529, 0, 0x08068CF4 }, { 0x352A, 0, 0x08068D1C }, { 0x352B, 0, 0x08068DB0 }, { 0x352C, 0, 0x08068E28 },
+ { 0x352D, 0, 0x08068E78 }, { 0x352E, 0, 0x08068F14 }, { 0x352F, 0, 0x08068F78 }, { 0x3530, 0, 0x08068FA0 },
+ { 0x3531, 0, 0x08069020 }, { 0x3532, 0, 0x080690CC }, { 0x3533, 0, 0x0806913C }, { 0x3534, 0, 0x080691B0 },
+ { 0x3535, 0, 0x08069224 }, { 0x3536, 0, 0x0806923C }, { 0x3537, 0, 0x08069284 }, { 0x3538, 0, 0x080692D8 },
+ { 0x3539, 0, 0x08069314 }, { 0x353A, 0, 0x08069358 }, { 0x353B, 0, 0x08069390 }, { 0x353C, 0, 0x080693E4 },
+ { 0x353D, 0, 0x08069434 }, { 0x353E, 0, 0x08069490 }, { 0x353F, 0, 0x080694C4 }, { 0x3540, 0, 0x08069524 },
+ { 0x3541, 0, 0x0806957C }, { 0x3542, 0, 0x080695C0 }, { 0x3543, 0, 0x08069608 }, { 0x3544, 0, 0x08069668 },
+ { 0x3545, 0, 0x080696DC }, { 0x3546, 0, 0x08069734 }, { 0x3548, 0, 0x08069774 }, { 0x3549, 0, 0x08069814 },
+ { 0x354A, 0, 0x080698A0 }, { 0x354B, 0, 0x08069930 }, { 0x354C, 0, 0x08069998 }, { 0xFFFC, 0, 0x080699C8 },
+ { 0xFFFD, 0, 0x080699D4 }, { 0xFFFF, 0, NULL },
+};
+
+MessageTableEntry D_801CFB08[46] = {
+ { 0x4E20, 0xB0, 0x07000000 }, { 0x4E21, 0xB0, 0x0700003C }, { 0x4E22, 0xB0, 0x07000094 },
+ { 0x4E23, 0xB0, 0x070000F0 }, { 0x4E24, 0xB0, 0x07000140 }, { 0x4E25, 0xB0, 0x0700019C },
+ { 0x4E26, 0xB0, 0x070001D8 }, { 0x4E27, 0xB0, 0x07000248 }, { 0x4E28, 0xB0, 0x0700027C },
+ { 0x4E29, 0xB0, 0x070002E0 }, { 0x4E2A, 0xB0, 0x0700033C }, { 0x4E2B, 0xB0, 0x07000384 },
+ { 0x4E2C, 0xB0, 0x070003C8 }, { 0x4E2D, 0xB0, 0x0700040C }, { 0x4E2E, 0xB0, 0x07000450 },
+ { 0x4E2F, 0xB0, 0x070004A8 }, { 0x4E30, 0xB0, 0x07000504 }, { 0x4E31, 0xB0, 0x07000564 },
+ { 0x4E32, 0xB0, 0x070005CC }, { 0x4E33, 0xB0, 0x07000610 }, { 0x4E34, 0xB0, 0x07000654 },
+ { 0x4E35, 0xB0, 0x07000698 }, { 0x4E36, 0xB0, 0x070006F8 }, { 0x4E37, 0xB0, 0x07000750 },
+ { 0x4E38, 0xB0, 0x07000798 }, { 0x4E39, 0xB0, 0x0700081C }, { 0x4E3A, 0xB0, 0x07000888 },
+ { 0x4E3B, 0xB0, 0x07000924 }, { 0x4E3C, 0xB0, 0x070009B4 }, { 0x4E3D, 0xB0, 0x070009E8 },
+ { 0x4E3E, 0xB0, 0x07000A78 }, { 0x4E3F, 0xB0, 0x07000AB0 }, { 0x4E40, 0xB0, 0x07000B2C },
+ { 0x4E41, 0xB0, 0x07000B54 }, { 0x4E42, 0xB0, 0x07000B7C }, { 0x4E43, 0xB0, 0x07000BA4 },
+ { 0x4E44, 0xB0, 0x07000BCC }, { 0x4E45, 0xB0, 0x07000BF4 }, { 0x4E46, 0xB0, 0x07000C1C },
+ { 0x4E47, 0xB0, 0x07000C44 }, { 0x4E48, 0xB0, 0x07000C6C }, { 0x4E49, 0xB0, 0x07000CEC },
+ { 0x4E4A, 0xB0, 0x07000D5C }, { 0x4E4B, 0xB0, 0x07000DC8 }, { 0x4E4C, 0xB0, 0x07000E54 },
+ { 0xFFFF, 0, NULL },
+};
diff --git a/src/code/z_nmi_buff.c b/src/code/z_nmi_buff.c
index 205bd8d0f..840345932 100644
--- a/src/code/z_nmi_buff.c
+++ b/src/code/z_nmi_buff.c
@@ -3,10 +3,17 @@
#define COLD_RESET 0
#define NMI 1
+typedef struct {
+ /* 0x00 */ u32 resetting;
+ /* 0x04 */ u32 resetCount;
+ /* 0x08 */ OSTime duration;
+ /* 0x10 */ OSTime resetTime;
+} NmiBuff; // size >= 0x18
+
NmiBuff* gNMIBuffer;
void Nmi_Init(void) {
- gNMIBuffer = (NmiBuff*)osAppNmiBuffer;
+ gNMIBuffer = (NmiBuff*)osAppNMIBuffer;
gNMIBuffer->resetting = false;
if (osResetType == COLD_RESET) {
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_overlay.c b/src/code/z_overlay.c
index 2c8c8d6d7..2e348c336 100644
--- a/src/code/z_overlay.c
+++ b/src/code/z_overlay.c
@@ -13,7 +13,7 @@
*/
#include "global.h"
-#include "z64load.h"
+#include "loadfragment.h"
void* TransitionOverlay_VramToRam(TransitionOverlay* overlayEntry, void* vramAddr) {
void* loadedRamAddr = Lib_PhysicalToVirtual(overlayEntry->loadInfo.addr);
@@ -40,13 +40,13 @@ s32 TransitionOverlay_Load(TransitionOverlay* overlayEntry) {
return 3;
}
if (Lib_PhysicalToVirtual(overlayEntry->loadInfo.addr) == NULL) {
- loadedRamAddr = ZeldaArena_Malloc(VRAM_PTR_SIZE(overlayEntry));
+ loadedRamAddr = ZeldaArena_Malloc((uintptr_t)overlayEntry->vramEnd - (uintptr_t)overlayEntry->vramStart);
if (loadedRamAddr == NULL) {
return -1;
}
- Load2_LoadOverlay(overlayEntry->vromStart, overlayEntry->vromEnd, overlayEntry->vramStart,
- overlayEntry->vramEnd, loadedRamAddr);
+ Overlay_Load(overlayEntry->vromStart, overlayEntry->vromEnd, overlayEntry->vramStart, overlayEntry->vramEnd,
+ loadedRamAddr);
overlayEntry->loadInfo.addr = Lib_VirtualToPhysical(loadedRamAddr);
overlayEntry->loadInfo.count = 1;
return 0;
diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c
index f3bfb530f..cbfcd0481 100644
--- a/src/code/z_parameter.c
+++ b/src/code/z_parameter.c
@@ -1,5 +1,9 @@
#include "global.h"
+#include "PR/gs2dex.h"
+#include "sys_cfb.h"
+#include "z64snap.h"
#include "z64view.h"
+#include "archives/icon_item_static/icon_item_static_yar.h"
#include "interface/parameter_static/parameter_static.h"
#include "interface/do_action_static/do_action_static.h"
#include "misc/story_static/story_static.h"
@@ -14,14 +18,19 @@ typedef enum {
/* 3 */ PICTO_BOX_STATE_PHOTO
} PictoBoxState;
-typedef struct {
- /* 0x00 */ u8 scene;
- /* 0x01 */ u8 flags1;
- /* 0x02 */ u8 flags2;
- /* 0x03 */ u8 flags3;
-} RestrictionFlags;
+// TODO extract this information from the texture definitions themselves
+#define DO_ACTION_TEX_WIDTH 48
+#define DO_ACTION_TEX_HEIGHT 16
+#define DO_ACTION_TEX_SIZE ((DO_ACTION_TEX_WIDTH * DO_ACTION_TEX_HEIGHT) / 2) // (sizeof(gCheckDoActionENGTex))
-Input sPostmanTimerInput[4];
+typedef struct {
+ /* 0x0 */ u8 scene;
+ /* 0x1 */ u8 flags1;
+ /* 0x2 */ u8 flags2;
+ /* 0x3 */ u8 flags3;
+} RestrictionFlags; // size = 0x4
+
+Input sPostmanTimerInput[MAXCONTROLLERS];
#define RESTRICTIONS_TABLE_END 0xFF
@@ -65,125 +74,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;
@@ -201,25 +106,25 @@ s16 sMagicBorderRatio = 2;
s16 sMagicBorderStep = 1;
s16 sExtraItemBases[] = {
- ITEM_STICK, // ITEM_STICKS_5
- ITEM_STICK, // ITEM_STICKS_10
- ITEM_NUT, // ITEM_NUTS_5
- ITEM_NUT, // ITEM_NUTS_10
- ITEM_BOMB, // ITEM_BOMBS_5
- ITEM_BOMB, // ITEM_BOMBS_10
- ITEM_BOMB, // ITEM_BOMBS_20
- ITEM_BOMB, // ITEM_BOMBS_30
- ITEM_BOW, // ITEM_ARROWS_10
- ITEM_BOW, // ITEM_ARROWS_30
- ITEM_BOW, // ITEM_ARROWS_40
- ITEM_BOMBCHU, // ITEM_ARROWS_50 !@bug this data is missing an ITEM_BOW, offsetting the rest by 1
- ITEM_BOMBCHU, // ITEM_BOMBCHUS_20
- ITEM_BOMBCHU, // ITEM_BOMBCHUS_10
- ITEM_BOMBCHU, // ITEM_BOMBCHUS_1
- ITEM_STICK, // ITEM_BOMBCHUS_5
- ITEM_STICK, // ITEM_STICK_UPGRADE_20
- ITEM_NUT, // ITEM_STICK_UPGRADE_30
- ITEM_NUT, // ITEM_NUT_UPGRADE_30
+ ITEM_DEKU_STICK, // ITEM_DEKU_STICKS_5
+ ITEM_DEKU_STICK, // ITEM_DEKU_STICKS_10
+ ITEM_DEKU_NUT, // ITEM_DEKU_NUTS_5
+ ITEM_DEKU_NUT, // ITEM_DEKU_NUTS_10
+ ITEM_BOMB, // ITEM_BOMBS_5
+ ITEM_BOMB, // ITEM_BOMBS_10
+ ITEM_BOMB, // ITEM_BOMBS_20
+ ITEM_BOMB, // ITEM_BOMBS_30
+ ITEM_BOW, // ITEM_ARROWS_10
+ ITEM_BOW, // ITEM_ARROWS_30
+ ITEM_BOW, // ITEM_ARROWS_40
+ ITEM_BOMBCHU, // ITEM_ARROWS_50 !@bug this data is missing an ITEM_BOW, offsetting the rest by 1
+ ITEM_BOMBCHU, // ITEM_BOMBCHUS_20
+ ITEM_BOMBCHU, // ITEM_BOMBCHUS_10
+ ITEM_BOMBCHU, // ITEM_BOMBCHUS_1
+ ITEM_DEKU_STICK, // ITEM_BOMBCHUS_5
+ ITEM_DEKU_STICK, // ITEM_DEKU_STICK_UPGRADE_20
+ ITEM_DEKU_NUT, // ITEM_DEKU_STICK_UPGRADE_30
+ ITEM_DEKU_NUT, // ITEM_DEKU_NUT_UPGRADE_30
};
s16 sEnvHazard = PLAYER_ENV_HAZARD_NONE;
@@ -243,7 +148,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),
@@ -256,16 +161,33 @@ Gfx sScreenFillSetupDL[] = {
s16 D_801BF9B0 = 0;
f32 D_801BF9B4[] = { 100.0f, 109.0f };
-s16 D_801BF9BC[] = { 0x226, 0x2A8, 0x2A8, 0x2A8 };
+s16 D_801BF9BC[] = {
+ 0x226, // EQUIP_SLOT_B
+ 0x2A8, // EQUIP_SLOT_C_LEFT
+ 0x2A8, // EQUIP_SLOT_C_DOWN
+ 0x2A8, // EQUIP_SLOT_C_RIGHT
+};
s16 D_801BF9C4[] = { 0x9E, 0x9B };
s16 D_801BF9C8[] = { 0x17, 0x16 };
f32 D_801BF9CC[] = { -380.0f, -350.0f };
-s16 D_801BF9D4[] = { 0xA7, 0xE3 };
-s16 D_801BF9D8[] = { 0xF9, 0x10F };
-s16 D_801BF9DC[] = { 0x11, 0x12 };
-s16 D_801BF9E0[] = { 0x22, 0x12 };
-s16 D_801BF9E4[] = { 0x23F, 0x26C };
-s16 D_801BF9E8[] = { 0x26C, 0x26C };
+s16 D_801BF9D4[] = {
+ 0xA7, // EQUIP_SLOT_B
+ 0xE3, // EQUIP_SLOT_C_LEFT
+ 0xF9, // EQUIP_SLOT_C_DOWN
+ 0x10F, // EQUIP_SLOT_C_RIGHT
+};
+s16 D_801BF9DC[] = {
+ 0x11, // EQUIP_SLOT_B
+ 0x12, // EQUIP_SLOT_C_LEFT
+ 0x22, // EQUIP_SLOT_C_DOWN
+ 0x12, // EQUIP_SLOT_C_RIGHT
+};
+s16 D_801BF9E4[] = {
+ 0x23F, // EQUIP_SLOT_B
+ 0x26C, // EQUIP_SLOT_C_LEFT
+ 0x26C, // EQUIP_SLOT_C_DOWN
+ 0x26C, // EQUIP_SLOT_C_RIGHT
+};
s16 sFinalHoursClockDigitsRed = 0;
s16 sFinalHoursClockFrameEnvRed = 0;
@@ -879,10 +801,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();
@@ -998,12 +920,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;
}
}
@@ -1021,7 +943,7 @@ void Interface_SetHudVisibility(u16 hudVisibility) {
void Interface_UpdateButtonAlphasByStatus(PlayState* play, s16 risingAlpha) {
InterfaceContext* interfaceCtx = &play->interfaceCtx;
- if ((gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_DISABLED) || (gSaveContext.unk_1015 == ITEM_NONE)) {
+ if ((gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_DISABLED) || (gSaveContext.bButtonStatus == BTN_DISABLED)) {
if (interfaceCtx->bAlpha != 70) {
interfaceCtx->bAlpha = 70;
}
@@ -1393,7 +1315,8 @@ void Interface_UpdateHudAlphas(PlayState* play, s16 dimmingAlpha) {
interfaceCtx->aAlpha = risingAlpha;
}
- if ((gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_DISABLED) || (gSaveContext.unk_1015 == ITEM_NONE)) {
+ if ((gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_DISABLED) ||
+ (gSaveContext.bButtonStatus == ITEM_NONE)) {
if (interfaceCtx->bAlpha != 70) {
interfaceCtx->bAlpha = 70;
}
@@ -1767,15 +1690,740 @@ void Interface_UpdateHudAlphas(PlayState* play, s16 dimmingAlpha) {
break;
}
- if ((play->roomCtx.curRoom.unk3 == 1) && (interfaceCtx->minimapAlpha >= 255)) {
+ if ((play->roomCtx.curRoom.behaviorType1 == ROOM_BEHAVIOR_TYPE1_1) && (interfaceCtx->minimapAlpha >= 255)) {
interfaceCtx->minimapAlpha = 255;
}
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80110038.s")
+/**
+ * A continuation of the if-else chain from Interface_UpdateButtonsPart1
+ * Also used directly when opening the pause menu i.e. skips part 1
+ */
+void Interface_UpdateButtonsPart2(PlayState* play) {
+ MessageContext* msgCtx = &play->msgCtx;
+ InterfaceContext* interfaceCtx = &play->interfaceCtx;
+ Player* player = GET_PLAYER(play);
+ s16 i;
+ s16 restoreHudVisibility = false;
-void func_80111CB4(PlayState* play);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80111CB4.s")
+ if (CHECK_EVENTINF(EVENTINF_41)) {
+ // Related to swamp boat (non-minigame)?
+ for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) {
+ if ((GET_CUR_FORM_BTN_ITEM(i) != ITEM_PICTOGRAPH_BOX) || (msgCtx->msgMode != MSGMODE_NONE)) {
+ if (gSaveContext.buttonStatus[i] == BTN_ENABLED) {
+ restoreHudVisibility = true;
+ }
+ gSaveContext.buttonStatus[i] = BTN_DISABLED;
+ } else {
+ if (gSaveContext.buttonStatus[i] == BTN_DISABLED) {
+ restoreHudVisibility = true;
+ }
+ gSaveContext.buttonStatus[i] = BTN_ENABLED;
+ }
+ }
+
+ if (sPictoState == PICTO_BOX_STATE_OFF) {
+ if (gSaveContext.buttonStatus[EQUIP_SLOT_B] != BTN_DISABLED) {
+ restoreHudVisibility = true;
+ }
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
+ } else {
+ if (gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_DISABLED) {
+ restoreHudVisibility = true;
+ }
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
+ }
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_90_20)) {
+ // Fishermans's jumping minigame
+ for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) {
+ if (gSaveContext.buttonStatus[i] == BTN_ENABLED) {
+ gSaveContext.buttonStatus[i] = BTN_DISABLED;
+ }
+ }
+
+ Interface_SetHudVisibility(HUD_VISIBILITY_B);
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_82_08)) {
+ // Swordsman's log minigame
+ for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) {
+ if (gSaveContext.buttonStatus[i] == BTN_ENABLED) {
+ gSaveContext.buttonStatus[i] = BTN_DISABLED;
+ }
+ }
+
+ Interface_SetHudVisibility(HUD_VISIBILITY_A_B_HEARTS_MAGIC_MINIMAP);
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_84_20)) {
+ // Related to moon child
+ if (player->currentMask == PLAYER_MASK_FIERCE_DEITY) {
+ for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) {
+ if ((GET_CUR_FORM_BTN_ITEM(i) == ITEM_MASK_FIERCE_DEITY) ||
+ ((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_BOTTLE) && (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_OBABA_DRINK))) {
+ if (gSaveContext.buttonStatus[i] == BTN_DISABLED) {
+ restoreHudVisibility = true;
+ gSaveContext.buttonStatus[i] = BTN_ENABLED;
+ }
+ } else {
+ if (gSaveContext.buttonStatus[i] != BTN_DISABLED) {
+ gSaveContext.buttonStatus[i] = BTN_DISABLED;
+ restoreHudVisibility = true;
+ }
+ }
+ }
+ } else {
+ for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) {
+ if ((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_MASK_DEKU) && (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_MASK_ZORA)) {
+ if (gSaveContext.buttonStatus[i] != BTN_DISABLED) {
+ restoreHudVisibility = true;
+ }
+ gSaveContext.buttonStatus[i] = BTN_DISABLED;
+ } else {
+ if (gSaveContext.buttonStatus[i] == BTN_DISABLED) {
+ restoreHudVisibility = true;
+ }
+ gSaveContext.buttonStatus[i] = BTN_ENABLED;
+ }
+ }
+ }
+ } else if ((play->sceneId == SCENE_SPOT00) && (gSaveContext.sceneLayer == 6)) {
+ // Unknown cutscene
+ for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) {
+ if (gSaveContext.buttonStatus[i] == BTN_ENABLED) {
+ restoreHudVisibility = true;
+ }
+ gSaveContext.buttonStatus[i] = BTN_DISABLED;
+ }
+ } else if (CHECK_EVENTINF(EVENTINF_34)) {
+ // Deku playground minigame
+ if (player->stateFlags3 & PLAYER_STATE3_1000000) {
+ if (gSaveContext.save.saveInfo.inventory.items[SLOT_DEKU_NUT] == ITEM_DEKU_NUT) {
+ BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_DEKU_NUT;
+ Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
+ } else {
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
+ restoreHudVisibility = true;
+ }
+ } else {
+ if (gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_DISABLED) {
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
+ restoreHudVisibility = true;
+ }
+
+ for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) {
+ if (gSaveContext.buttonStatus[i] == BTN_ENABLED) {
+ restoreHudVisibility = true;
+ }
+ gSaveContext.buttonStatus[i] = BTN_DISABLED;
+ }
+ }
+
+ if (restoreHudVisibility || (gSaveContext.hudVisibility != HUD_VISIBILITY_A_B_MINIMAP)) {
+ gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
+ Interface_SetHudVisibility(HUD_VISIBILITY_A_B_MINIMAP);
+ restoreHudVisibility = false;
+ }
+ } else if (player->stateFlags3 & PLAYER_STATE3_1000000) {
+ // Nuts on B (from flying as Deku Link)
+ if (gSaveContext.save.saveInfo.inventory.items[SLOT_DEKU_NUT] == ITEM_DEKU_NUT) {
+ if (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) != ITEM_DEKU_NUT) {
+ BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_DEKU_NUT;
+ Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
+ restoreHudVisibility = true;
+ }
+ } else if (gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_ENABLED) {
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
+ restoreHudVisibility = true;
+ }
+
+ if (restoreHudVisibility) {
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
+ }
+ } else if (!gSaveContext.save.saveInfo.playerData.isMagicAcquired && (CUR_FORM == PLAYER_FORM_DEKU) &&
+ (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_DEKU_NUT)) {
+ // Nuts on B (as Deku Link)
+ BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_FD;
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
+ } else if ((Player_GetEnvironmentalHazard(play) >= PLAYER_ENV_HAZARD_UNDERWATER_FLOOR) &&
+ (Player_GetEnvironmentalHazard(play) <= PLAYER_ENV_HAZARD_UNDERWATER_FREE)) {
+ // Swimming underwater
+ if (CUR_FORM != PLAYER_FORM_ZORA) {
+ if ((player->currentMask == PLAYER_MASK_BLAST) && (player->blastMaskTimer == 0)) {
+ if (gSaveContext.bButtonStatus == BTN_DISABLED) {
+ restoreHudVisibility = true;
+ }
+ gSaveContext.bButtonStatus = BTN_ENABLED;
+ } else if ((interfaceCtx->bButtonDoAction == DO_ACTION_EXPLODE) &&
+ (player->currentMask == PLAYER_MASK_BLAST)) {
+ if (gSaveContext.bButtonStatus != BTN_DISABLED) {
+ gSaveContext.bButtonStatus = BTN_DISABLED;
+ restoreHudVisibility = true;
+ }
+ } else {
+ if (gSaveContext.buttonStatus[EQUIP_SLOT_B] != BTN_DISABLED) {
+ restoreHudVisibility = true;
+ }
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
+ }
+ } else {
+ if (gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_DISABLED) {
+ restoreHudVisibility = true;
+ }
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
+ }
+
+ for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) {
+ if (GET_CUR_FORM_BTN_ITEM(i) != ITEM_MASK_ZORA) {
+ if (Player_GetEnvironmentalHazard(play) == PLAYER_ENV_HAZARD_UNDERWATER_FLOOR) {
+ if (!((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_BOTTLE) &&
+ (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_OBABA_DRINK))) {
+ if (gSaveContext.buttonStatus[i] == BTN_ENABLED) {
+ restoreHudVisibility = true;
+ }
+ gSaveContext.buttonStatus[i] = BTN_DISABLED;
+ } else {
+ if (gSaveContext.buttonStatus[i] == BTN_DISABLED) {
+ restoreHudVisibility = true;
+ }
+ gSaveContext.buttonStatus[i] = BTN_ENABLED;
+ }
+ } else {
+ if (gSaveContext.buttonStatus[i] == BTN_ENABLED) {
+ restoreHudVisibility = true;
+ }
+ gSaveContext.buttonStatus[i] = BTN_DISABLED;
+ }
+ } else if (gSaveContext.buttonStatus[i] == BTN_DISABLED) {
+ gSaveContext.buttonStatus[i] = BTN_ENABLED;
+ restoreHudVisibility = true;
+ }
+ }
+
+ if (restoreHudVisibility) {
+ gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
+ }
+
+ if ((play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF)) {
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_NONE) {
+ Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
+ }
+ }
+ } else if (player->stateFlags1 & PLAYER_STATE1_200000) {
+ // First person view
+ for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) {
+ if (GET_CUR_FORM_BTN_ITEM(i) != ITEM_LENS_OF_TRUTH) {
+ if (gSaveContext.buttonStatus[i] == BTN_ENABLED) {
+ restoreHudVisibility = true;
+ }
+ gSaveContext.buttonStatus[i] = BTN_DISABLED;
+ } else {
+ if (gSaveContext.buttonStatus[i] == BTN_DISABLED) {
+ restoreHudVisibility = true;
+ }
+ gSaveContext.buttonStatus[i] = BTN_ENABLED;
+ }
+ }
+
+ if (gSaveContext.buttonStatus[EQUIP_SLOT_B] != BTN_DISABLED) {
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
+ restoreHudVisibility = true;
+ }
+ } else if (player->stateFlags1 & PLAYER_STATE1_2000) {
+ // Hanging from a ledge
+ if (gSaveContext.buttonStatus[EQUIP_SLOT_B] != BTN_DISABLED) {
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
+ restoreHudVisibility = true;
+ Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
+ }
+ } else {
+ // End of special event cases
+
+ // B button
+ if ((interfaceCtx->bButtonDoAction == DO_ACTION_EXPLODE) && (player->currentMask == PLAYER_MASK_BLAST) &&
+ (player->blastMaskTimer != 0)) {
+ // Cooldown period for blast mask
+ if (gSaveContext.bButtonStatus != BTN_DISABLED) {
+ gSaveContext.bButtonStatus = BTN_DISABLED;
+ restoreHudVisibility = true;
+ }
+ } else {
+ // default to enabled
+ if (gSaveContext.bButtonStatus == BTN_DISABLED) {
+ gSaveContext.bButtonStatus = BTN_ENABLED;
+ restoreHudVisibility = true;
+ }
+
+ // Apply B button restriction
+ if (interfaceCtx->restrictions.bButton == 0) {
+ if ((BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOW) ||
+ (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOMB) ||
+ (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOMBCHU)) {
+ if (GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == EQUIP_VALUE_SWORD_NONE) {
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
+ }
+
+ if (gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_ENABLED) {
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] =
+ ITEM_SWORD_KOKIRI + GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) - EQUIP_VALUE_SWORD_KOKIRI;
+ }
+
+ BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = gSaveContext.buttonStatus[EQUIP_SLOT_B];
+
+ if (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) != ITEM_NONE) {
+ Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
+ }
+ restoreHudVisibility = true;
+ } else if (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_NONE) {
+ if (interfaceCtx->bButtonDoAction != 0) {
+ if (gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_DISABLED) {
+ restoreHudVisibility = true;
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
+ }
+ } else {
+ if (gSaveContext.buttonStatus[EQUIP_SLOT_B] != BTN_DISABLED) {
+ restoreHudVisibility = true;
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
+ }
+ }
+ } else if (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_NONE) {
+ if (gSaveContext.buttonStatus[EQUIP_SLOT_B] != BTN_DISABLED) {
+ restoreHudVisibility = true;
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
+ }
+ } else {
+ if (gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_DISABLED) {
+ restoreHudVisibility = true;
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
+ }
+ }
+ } else if (interfaceCtx->restrictions.bButton != 0) {
+ if ((BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOW) ||
+ (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOMB) ||
+ (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOMBCHU)) {
+ if (GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == EQUIP_VALUE_SWORD_NONE) {
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
+ }
+
+ BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = gSaveContext.buttonStatus[EQUIP_SLOT_B];
+
+ if (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) != ITEM_NONE) {
+ Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
+ }
+ restoreHudVisibility = true;
+ }
+ if (gSaveContext.buttonStatus[EQUIP_SLOT_B] != BTN_DISABLED) {
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
+ restoreHudVisibility = true;
+ }
+ }
+ }
+
+ // C buttons
+ if (GET_PLAYER_FORM == player->transformation) {
+ for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) {
+ // Individual C button
+ if (!gPlayerFormItemRestrictions[GET_PLAYER_FORM][GET_CUR_FORM_BTN_ITEM(i)]) {
+ // Item not usable in current playerForm
+ if (gSaveContext.buttonStatus[i] != BTN_DISABLED) {
+ gSaveContext.buttonStatus[i] = BTN_DISABLED;
+ restoreHudVisibility = true;
+ }
+ } else if (player->actor.id != ACTOR_PLAYER) {
+ // Currently not playing as the main player
+ if (gSaveContext.buttonStatus[i] != BTN_DISABLED) {
+ gSaveContext.buttonStatus[i] = BTN_DISABLED;
+ restoreHudVisibility = true;
+ }
+ } else if (player->currentMask == PLAYER_MASK_GIANT) {
+ // Currently wearing Giant's Mask
+ if (GET_CUR_FORM_BTN_ITEM(i) != ITEM_MASK_GIANT) {
+ if (gSaveContext.buttonStatus[i] != BTN_DISABLED) {
+ gSaveContext.buttonStatus[i] = BTN_DISABLED;
+ restoreHudVisibility = true;
+ }
+ } else if (gSaveContext.buttonStatus[i] == BTN_DISABLED) {
+ restoreHudVisibility = true;
+ gSaveContext.buttonStatus[i] = BTN_ENABLED;
+ }
+ } else if (GET_CUR_FORM_BTN_ITEM(i) == ITEM_MASK_GIANT) {
+ // Giant's Mask is equipped
+ if (play->sceneId != SCENE_INISIE_BS) {
+ if (gSaveContext.buttonStatus[i] != BTN_DISABLED) {
+ gSaveContext.buttonStatus[i] = BTN_DISABLED;
+ restoreHudVisibility = true;
+ }
+ } else if (gSaveContext.buttonStatus[i] == BTN_DISABLED) {
+ restoreHudVisibility = true;
+ gSaveContext.buttonStatus[i] = BTN_ENABLED;
+ }
+ } else if (GET_CUR_FORM_BTN_ITEM(i) == ITEM_MASK_FIERCE_DEITY) {
+ // Fierce Deity's Mask is equipped
+ if ((play->sceneId != SCENE_MITURIN_BS) && (play->sceneId != SCENE_HAKUGIN_BS) &&
+ (play->sceneId != SCENE_SEA_BS) && (play->sceneId != SCENE_INISIE_BS) &&
+ (play->sceneId != SCENE_LAST_BS)) {
+ if (gSaveContext.buttonStatus[i] != BTN_DISABLED) {
+ gSaveContext.buttonStatus[i] = BTN_DISABLED;
+ restoreHudVisibility = true;
+ }
+ } else if (gSaveContext.buttonStatus[i] == BTN_DISABLED) {
+ restoreHudVisibility = true;
+ gSaveContext.buttonStatus[i] = BTN_ENABLED;
+ }
+ } else {
+ // End of special item cases. Apply restrictions to buttons
+ if (interfaceCtx->restrictions.tradeItems != 0) {
+ if (((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_MOONS_TEAR) &&
+ (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_PENDANT_OF_MEMORIES)) ||
+ ((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_BOTTLE) &&
+ (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_OBABA_DRINK)) ||
+ (GET_CUR_FORM_BTN_ITEM(i) == ITEM_OCARINA_OF_TIME)) {
+ if (gSaveContext.buttonStatus[i] == BTN_ENABLED) {
+ restoreHudVisibility = true;
+ }
+ gSaveContext.buttonStatus[i] = BTN_DISABLED;
+ }
+ } else if (interfaceCtx->restrictions.tradeItems == 0) {
+ if (((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_MOONS_TEAR) &&
+ (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_PENDANT_OF_MEMORIES)) ||
+ ((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_BOTTLE) &&
+ (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_OBABA_DRINK)) ||
+ (GET_CUR_FORM_BTN_ITEM(i) == ITEM_OCARINA_OF_TIME)) {
+ if (gSaveContext.buttonStatus[i] == BTN_DISABLED) {
+ restoreHudVisibility = true;
+ }
+ gSaveContext.buttonStatus[i] = BTN_ENABLED;
+ }
+ }
+
+ if (interfaceCtx->restrictions.masks != 0) {
+ if ((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_MASK_DEKU) &&
+ (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_MASK_GIANT)) {
+ if (!gSaveContext.buttonStatus[i]) { // == BTN_ENABLED
+ restoreHudVisibility = true;
+ }
+ gSaveContext.buttonStatus[i] = BTN_DISABLED;
+ }
+ } else if (interfaceCtx->restrictions.masks == 0) {
+ if ((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_MASK_DEKU) &&
+ (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_MASK_GIANT)) {
+ if (gSaveContext.buttonStatus[i] == BTN_DISABLED) {
+ restoreHudVisibility = true;
+ }
+ gSaveContext.buttonStatus[i] = BTN_ENABLED;
+ }
+ }
+
+ if (interfaceCtx->restrictions.pictoBox != 0) {
+ if (GET_CUR_FORM_BTN_ITEM(i) == ITEM_PICTOGRAPH_BOX) {
+ if (!gSaveContext.buttonStatus[i]) { // == BTN_ENABLED
+ restoreHudVisibility = true;
+ }
+ gSaveContext.buttonStatus[i] = BTN_DISABLED;
+ }
+ } else if (interfaceCtx->restrictions.pictoBox == 0) {
+ if (GET_CUR_FORM_BTN_ITEM(i) == ITEM_PICTOGRAPH_BOX) {
+ if (gSaveContext.buttonStatus[i] == BTN_DISABLED) {
+ restoreHudVisibility = true;
+ }
+ gSaveContext.buttonStatus[i] = BTN_ENABLED;
+ }
+ }
+
+ if (interfaceCtx->restrictions.all != 0) {
+ if (!((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_MOONS_TEAR) &&
+ (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_PENDANT_OF_MEMORIES)) &&
+ !((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_BOTTLE) &&
+ (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_OBABA_DRINK)) &&
+ (GET_CUR_FORM_BTN_ITEM(i) != ITEM_OCARINA_OF_TIME) &&
+ !((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_MASK_DEKU) &&
+ (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_MASK_GIANT)) &&
+ (GET_CUR_FORM_BTN_ITEM(i) != ITEM_PICTOGRAPH_BOX)) {
+
+ if ((gSaveContext.buttonStatus[i] == BTN_ENABLED)) {
+ restoreHudVisibility = true;
+ gSaveContext.buttonStatus[i] = BTN_DISABLED;
+ }
+ }
+ } else if (interfaceCtx->restrictions.all == 0) {
+ if (!((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_MOONS_TEAR) &&
+ (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_PENDANT_OF_MEMORIES)) &&
+ !((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_BOTTLE) &&
+ (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_OBABA_DRINK)) &&
+ (GET_CUR_FORM_BTN_ITEM(i) != ITEM_OCARINA_OF_TIME) &&
+ !((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_MASK_DEKU) &&
+ (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_MASK_GIANT)) &&
+ (GET_CUR_FORM_BTN_ITEM(i) != ITEM_PICTOGRAPH_BOX)) {
+
+ if ((gSaveContext.buttonStatus[i] == BTN_DISABLED)) {
+ restoreHudVisibility = true;
+ gSaveContext.buttonStatus[i] = BTN_ENABLED;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (restoreHudVisibility && (play->activeCamId == CAM_ID_MAIN) && (play->transitionTrigger == TRANS_TRIGGER_OFF) &&
+ (play->transitionMode == TRANS_MODE_OFF)) {
+ gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
+ Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
+ }
+}
+
+void Interface_UpdateButtonsPart1(PlayState* play) {
+ InterfaceContext* interfaceCtx = &play->interfaceCtx;
+ Player* player = GET_PLAYER(play);
+ s32 pad;
+ s32 restoreHudVisibility = false;
+
+ 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))) {
+ // Riding Epona OR Honey & Darling minigame OR Horseback balloon minigame OR related to swamp boat
+ // (non-minigame?)
+ if ((player->stateFlags1 & PLAYER_STATE1_800000) && (player->currentMask == PLAYER_MASK_BLAST) &&
+ (gSaveContext.bButtonStatus == BTN_DISABLED)) {
+ // Riding Epona with blast mask?
+ restoreHudVisibility = true;
+ gSaveContext.bButtonStatus = BTN_ENABLED;
+ }
+
+ if (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) != ITEM_NONE) {
+ if ((player->transformation == PLAYER_FORM_DEKU) && CHECK_WEEKEVENTREG(WEEKEVENTREG_08_01)) {
+ gSaveContext.hudVisibilityForceButtonAlphasByStatus = true;
+ if (play->sceneId == SCENE_BOWLING) {
+ if (gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_DISABLED) {
+ 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;
+ }
+ } else if (gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_DISABLED) {
+ 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;
+ }
+
+ Interface_SetHudVisibility(HUD_VISIBILITY_B_MAGIC);
+ } else {
+ if ((BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) != ITEM_BOW) &&
+ (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) != ITEM_BOMB) &&
+ (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) != ITEM_BOMBCHU)) {
+ gSaveContext.hudVisibilityForceButtonAlphasByStatus = true;
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B);
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_ENABLED;
+ if (play->sceneId == SCENE_BOWLING) {
+ if (CURRENT_DAY == 1) {
+ BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOMBCHU;
+ } else if (CURRENT_DAY == 2) {
+ BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOMB;
+ } else {
+ BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOW;
+ }
+ Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
+ } else {
+ BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOW;
+
+ if (play->unk_1887C >= 2) {
+ Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
+ } 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);
+ }
+
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
+ Interface_SetHudVisibility(HUD_VISIBILITY_A_HEARTS_MAGIC_MINIMAP_WITH_OVERWRITE);
+ }
+ }
+
+ if (play->transitionMode != TRANS_MODE_OFF) {
+ Interface_SetHudVisibility(HUD_VISIBILITY_NONE);
+ } else if ((gSaveContext.minigameStatus == MINIGAME_STATUS_ACTIVE) &&
+ (gSaveContext.save.entrance == ENTRANCE(ROMANI_RANCH, 0)) &&
+ (Cutscene_GetSceneLayer(play) != 0) && (play->transitionTrigger == TRANS_TRIGGER_OFF)) {
+ Interface_SetHudVisibility(HUD_VISIBILITY_A_B_MINIMAP);
+ } else if ((gSaveContext.minigameStatus == MINIGAME_STATUS_ACTIVE) && CHECK_EVENTINF(EVENTINF_35)) {
+ Interface_SetHudVisibility(HUD_VISIBILITY_B_MINIMAP);
+ } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_82_08) &&
+ (gSaveContext.minigameStatus == MINIGAME_STATUS_ACTIVE)) {
+ Interface_SetHudVisibility(HUD_VISIBILITY_B);
+ } else if (play->unk_1887C >= 2) {
+ Interface_SetHudVisibility(HUD_VISIBILITY_B);
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_08_01)) {
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
+ Interface_SetHudVisibility(HUD_VISIBILITY_A_B_MINIMAP);
+ } else if (player->stateFlags1 & PLAYER_STATE1_800000) {
+ Interface_SetHudVisibility(HUD_VISIBILITY_A_B_MINIMAP);
+ }
+ }
+ } else {
+ if (player->stateFlags1 & PLAYER_STATE1_800000) {
+ Interface_SetHudVisibility(HUD_VISIBILITY_A_B_MINIMAP);
+ }
+
+ if (play->sceneId == SCENE_BOWLING) {
+ if (CURRENT_DAY == 1) {
+ BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOMBCHU;
+ } else if (CURRENT_DAY == 2) {
+ BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOMB;
+ } else {
+ BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOW;
+ }
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
+ } else {
+ BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOW;
+ }
+
+ if (play->unk_1887C >= 2) {
+ Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
+ } 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);
+ }
+
+ if (gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_DISABLED) {
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
+ restoreHudVisibility = true;
+ }
+
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
+ Interface_SetHudVisibility(HUD_VISIBILITY_A_HEARTS_MAGIC_MINIMAP_WITH_OVERWRITE);
+
+ if (play->transitionMode != TRANS_MODE_OFF) {
+ Interface_SetHudVisibility(HUD_VISIBILITY_NONE);
+ } else if ((gSaveContext.minigameStatus == MINIGAME_STATUS_ACTIVE) &&
+ (gSaveContext.save.entrance == ENTRANCE(ROMANI_RANCH, 0)) &&
+ (Cutscene_GetSceneLayer(play) != 0) && (play->transitionTrigger == TRANS_TRIGGER_OFF)) {
+ Interface_SetHudVisibility(HUD_VISIBILITY_A_B_MINIMAP);
+ } else if (gSaveContext.minigameStatus == MINIGAME_STATUS_ACTIVE) {
+ Interface_SetHudVisibility(HUD_VISIBILITY_B);
+ } else if (play->unk_1887C >= 2) {
+ Interface_SetHudVisibility(HUD_VISIBILITY_B);
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_08_01)) {
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
+ Interface_SetHudVisibility(HUD_VISIBILITY_A_B_MINIMAP);
+ } else if (player->stateFlags1 & PLAYER_STATE1_800000) {
+ Interface_SetHudVisibility(HUD_VISIBILITY_A_B_MINIMAP);
+ }
+ }
+ } else if (sPictoState != PICTO_BOX_STATE_OFF) {
+ // 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 : gWorkBuffer,
+ (u8*)((void)0, gSaveContext.pictoPhotoI5),
+ PICTO_PHOTO_WIDTH * PICTO_PHOTO_HEIGHT);
+ interfaceCtx->unk_222 = interfaceCtx->unk_224 = 0;
+ restoreHudVisibility = true;
+ sPictoState = PICTO_BOX_STATE_OFF;
+ } else if (CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_B)) {
+ play->actorCtx.flags &= ~ACTORCTX_FLAG_PICTO_BOX_ON;
+ interfaceCtx->unk_222 = interfaceCtx->unk_224 = 0;
+ restoreHudVisibility = true;
+ 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) && (CutsceneManager_GetCurrentCsId() == CS_ID_NONE))) {
+ Audio_PlaySfx(NA_SE_SY_CAMERA_SHUTTER);
+ SREG(89) = 1;
+ play->haltAllActors = true;
+ sPictoState = PICTO_BOX_STATE_SETUP_PHOTO;
+ sPictoPhotoBeingTaken = true;
+ }
+ }
+ } else if ((sPictoState >= PICTO_BOX_STATE_SETUP_PHOTO) && (Message_GetState(&play->msgCtx) == 4) &&
+ Message_ShouldAdvance(play)) {
+ play->haltAllActors = false;
+ player->stateFlags1 &= ~PLAYER_STATE1_200;
+ Message_CloseTextbox(play);
+ if (play->msgCtx.choiceIndex != 0) {
+ Audio_PlaySfx_MessageCancel();
+ func_80115844(play, DO_ACTION_STOP);
+ Interface_SetHudVisibility(HUD_VISIBILITY_A_B);
+ sPictoState = PICTO_BOX_STATE_LENS;
+ REMOVE_QUEST_ITEM(QUEST_PICTOGRAPH);
+ } else {
+ Audio_PlaySfx_MessageDecide();
+ interfaceCtx->unk_222 = interfaceCtx->unk_224 = 0;
+ restoreHudVisibility = true;
+ Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
+ sPictoState = PICTO_BOX_STATE_OFF;
+ if (sPictoPhotoBeingTaken) {
+ Play_CompressI8ToI5((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : gWorkBuffer,
+ (u8*)((void)0, gSaveContext.pictoPhotoI5),
+ PICTO_PHOTO_WIDTH * PICTO_PHOTO_HEIGHT);
+ Snap_RecordPictographedActors(play);
+ }
+ play->actorCtx.flags &= ~ACTORCTX_FLAG_PICTO_BOX_ON;
+ SET_QUEST_ITEM(QUEST_PICTOGRAPH);
+ sPictoPhotoBeingTaken = false;
+ }
+ }
+ } else if ((gSaveContext.minigameStatus == MINIGAME_STATUS_ACTIVE) &&
+ (gSaveContext.save.entrance == ENTRANCE(WATERFALL_RAPIDS, 1)) &&
+ (play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF)) {
+ // Beaver race minigame
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
+ Interface_SetHudVisibility(HUD_VISIBILITY_A_B_MINIMAP);
+ } else if ((gSaveContext.save.entrance == ENTRANCE(GORON_RACETRACK, 1)) &&
+ (play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF)) {
+ // Goron race minigame
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
+ Interface_SetHudVisibility(HUD_VISIBILITY_A_B_HEARTS_MAGIC_MINIMAP);
+ } else if (play->actorCtx.flags & ACTORCTX_FLAG_PICTO_BOX_ON) {
+ // Related to pictograph
+ if (!CHECK_QUEST_ITEM(QUEST_PICTOGRAPH)) {
+ func_80115844(play, DO_ACTION_STOP);
+ Interface_SetHudVisibility(HUD_VISIBILITY_A_B);
+ sPictoState = PICTO_BOX_STATE_LENS;
+ } else {
+ Play_DecompressI5ToI8((u8*)((void)0, gSaveContext.pictoPhotoI5),
+ (play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : gWorkBuffer,
+ PICTO_PHOTO_WIDTH * PICTO_PHOTO_HEIGHT);
+ play->haltAllActors = true;
+ sPictoState = PICTO_BOX_STATE_SETUP_PHOTO;
+ }
+ } else {
+ // Continue processing the remaining cases
+ Interface_UpdateButtonsPart2(play);
+ }
+ }
+
+ if (restoreHudVisibility) {
+ gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
+ if ((play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF)) {
+ Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
+ }
+ }
+}
void Interface_SetSceneRestrictions(PlayState* play) {
InterfaceContext* interfaceCtx = &play->interfaceCtx;
@@ -1823,7 +2471,40 @@ void Interface_InitMinigame(PlayState* play) {
#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/Interface_LoadItemIcon.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80112C0C.s")
+/**
+ * @param play PlayState
+ * @param flag 0 for default update, 1 for simplified update
+ */
+void Interface_UpdateButtonsAlt(PlayState* play, u16 flag) {
+ if (flag) {
+ if ((BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOW) ||
+ (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOMB) ||
+ (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOMBCHU) ||
+ (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_FISHING_ROD) ||
+ (gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_DISABLED)) {
+ if ((BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOW) ||
+ (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOMB) ||
+ (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOMBCHU) ||
+ (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_FISHING_ROD)) {
+ BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = gSaveContext.buttonStatus[EQUIP_SLOT_B];
+ Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
+ }
+ } else if (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_NONE) {
+ if (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) != ITEM_NONE) {
+ BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = gSaveContext.buttonStatus[EQUIP_SLOT_B];
+ Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
+ }
+ }
+
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] =
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
+ Interface_SetHudVisibility(HUD_VISIBILITY_ALL_NO_MINIMAP_W_DISABLED);
+ } else {
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] =
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
+ Interface_UpdateButtonsPart1(play);
+ }
+}
s16 sAmmoRefillCounts[] = { 5, 10, 20, 30 }; // Sticks, nuts, bombs
s16 sArrowRefillCounts[] = { 10, 30, 40, 50 };
@@ -1837,8 +2518,8 @@ u8 Item_Give(PlayState* play, u8 item) {
u8 slot;
slot = SLOT(item);
- if (item >= ITEM_STICKS_5) {
- slot = SLOT(sExtraItemBases[item - ITEM_STICKS_5]);
+ if (item >= ITEM_DEKU_STICKS_5) {
+ slot = SLOT(sExtraItemBases[item - ITEM_DEKU_STICKS_5]);
}
if (item == ITEM_SKULL_TOKEN) {
@@ -1859,14 +2540,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)) {
@@ -1878,7 +2559,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;
@@ -1962,84 +2643,84 @@ u8 Item_Give(PlayState* play, u8 item) {
Inventory_ChangeUpgrade(UPG_WALLET, 2);
return ITEM_NONE;
- } else if (item == ITEM_STICK_UPGRADE_20) {
- if (INV_CONTENT(ITEM_STICK) != ITEM_STICK) {
- INV_CONTENT(ITEM_STICK) = ITEM_STICK;
+ } else if (item == ITEM_DEKU_STICK_UPGRADE_20) {
+ if (INV_CONTENT(ITEM_DEKU_STICK) != ITEM_DEKU_STICK) {
+ INV_CONTENT(ITEM_DEKU_STICK) = ITEM_DEKU_STICK;
}
- Inventory_ChangeUpgrade(UPG_STICKS, 2);
- AMMO(ITEM_STICK) = CAPACITY(UPG_STICKS, 2);
+ Inventory_ChangeUpgrade(UPG_DEKU_STICKS, 2);
+ AMMO(ITEM_DEKU_STICK) = CAPACITY(UPG_DEKU_STICKS, 2);
return ITEM_NONE;
- } else if (item == ITEM_STICK_UPGRADE_30) {
- if (INV_CONTENT(ITEM_STICK) != ITEM_STICK) {
- INV_CONTENT(ITEM_STICK) = ITEM_STICK;
+ } else if (item == ITEM_DEKU_STICK_UPGRADE_30) {
+ if (INV_CONTENT(ITEM_DEKU_STICK) != ITEM_DEKU_STICK) {
+ INV_CONTENT(ITEM_DEKU_STICK) = ITEM_DEKU_STICK;
}
- Inventory_ChangeUpgrade(UPG_STICKS, 3);
- AMMO(ITEM_STICK) = CAPACITY(UPG_STICKS, 3);
+ Inventory_ChangeUpgrade(UPG_DEKU_STICKS, 3);
+ AMMO(ITEM_DEKU_STICK) = CAPACITY(UPG_DEKU_STICKS, 3);
return ITEM_NONE;
- } else if (item == ITEM_NUT_UPGRADE_30) {
- if (INV_CONTENT(ITEM_NUT) != ITEM_NUT) {
- INV_CONTENT(ITEM_NUT) = ITEM_NUT;
+ } else if (item == ITEM_DEKU_NUT_UPGRADE_30) {
+ if (INV_CONTENT(ITEM_DEKU_NUT) != ITEM_DEKU_NUT) {
+ INV_CONTENT(ITEM_DEKU_NUT) = ITEM_DEKU_NUT;
}
- Inventory_ChangeUpgrade(UPG_NUTS, 2);
- AMMO(ITEM_NUT) = CAPACITY(UPG_NUTS, 2);
+ Inventory_ChangeUpgrade(UPG_DEKU_NUTS, 2);
+ AMMO(ITEM_DEKU_NUT) = CAPACITY(UPG_DEKU_NUTS, 2);
return ITEM_NONE;
- } else if (item == ITEM_NUT_UPGRADE_40) {
- if (INV_CONTENT(ITEM_NUT) != ITEM_NUT) {
- INV_CONTENT(ITEM_NUT) = ITEM_NUT;
+ } else if (item == ITEM_DEKU_NUT_UPGRADE_40) {
+ if (INV_CONTENT(ITEM_DEKU_NUT) != ITEM_DEKU_NUT) {
+ INV_CONTENT(ITEM_DEKU_NUT) = ITEM_DEKU_NUT;
}
- Inventory_ChangeUpgrade(UPG_NUTS, 3);
- AMMO(ITEM_NUT) = CAPACITY(UPG_NUTS, 3);
+ Inventory_ChangeUpgrade(UPG_DEKU_NUTS, 3);
+ AMMO(ITEM_DEKU_NUT) = CAPACITY(UPG_DEKU_NUTS, 3);
return ITEM_NONE;
- } else if (item == ITEM_STICK) {
- if (INV_CONTENT(ITEM_STICK) != ITEM_STICK) {
- Inventory_ChangeUpgrade(UPG_STICKS, 1);
- AMMO(ITEM_STICK) = 1;
+ } else if (item == ITEM_DEKU_STICK) {
+ if (INV_CONTENT(ITEM_DEKU_STICK) != ITEM_DEKU_STICK) {
+ Inventory_ChangeUpgrade(UPG_DEKU_STICKS, 1);
+ AMMO(ITEM_DEKU_STICK) = 1;
} else {
- AMMO(ITEM_STICK)++;
- if (AMMO(ITEM_STICK) > CUR_CAPACITY(UPG_STICKS)) {
- AMMO(ITEM_STICK) = CUR_CAPACITY(UPG_STICKS);
+ AMMO(ITEM_DEKU_STICK)++;
+ if (AMMO(ITEM_DEKU_STICK) > CUR_CAPACITY(UPG_DEKU_STICKS)) {
+ AMMO(ITEM_DEKU_STICK) = CUR_CAPACITY(UPG_DEKU_STICKS);
}
}
- } else if ((item == ITEM_STICKS_5) || (item == ITEM_STICKS_10)) {
- if (INV_CONTENT(ITEM_STICK) != ITEM_STICK) {
- Inventory_ChangeUpgrade(UPG_STICKS, 1);
- AMMO(ITEM_STICK) = sAmmoRefillCounts[item - ITEM_STICKS_5];
+ } else if ((item == ITEM_DEKU_STICKS_5) || (item == ITEM_DEKU_STICKS_10)) {
+ if (INV_CONTENT(ITEM_DEKU_STICK) != ITEM_DEKU_STICK) {
+ Inventory_ChangeUpgrade(UPG_DEKU_STICKS, 1);
+ AMMO(ITEM_DEKU_STICK) = sAmmoRefillCounts[item - ITEM_DEKU_STICKS_5];
} else {
- AMMO(ITEM_STICK) += sAmmoRefillCounts[item - ITEM_STICKS_5];
- if (AMMO(ITEM_STICK) > CUR_CAPACITY(UPG_STICKS)) {
- AMMO(ITEM_STICK) = CUR_CAPACITY(UPG_STICKS);
+ AMMO(ITEM_DEKU_STICK) += sAmmoRefillCounts[item - ITEM_DEKU_STICKS_5];
+ if (AMMO(ITEM_DEKU_STICK) > CUR_CAPACITY(UPG_DEKU_STICKS)) {
+ AMMO(ITEM_DEKU_STICK) = CUR_CAPACITY(UPG_DEKU_STICKS);
}
}
- item = ITEM_STICK;
+ item = ITEM_DEKU_STICK;
- } else if (item == ITEM_NUT) {
- if (INV_CONTENT(ITEM_NUT) != ITEM_NUT) {
- Inventory_ChangeUpgrade(UPG_NUTS, 1);
- AMMO(ITEM_NUT) = 1;
+ } else if (item == ITEM_DEKU_NUT) {
+ if (INV_CONTENT(ITEM_DEKU_NUT) != ITEM_DEKU_NUT) {
+ Inventory_ChangeUpgrade(UPG_DEKU_NUTS, 1);
+ AMMO(ITEM_DEKU_NUT) = 1;
} else {
- AMMO(ITEM_NUT)++;
- if (AMMO(ITEM_NUT) > CUR_CAPACITY(UPG_NUTS)) {
- AMMO(ITEM_NUT) = CUR_CAPACITY(UPG_NUTS);
+ AMMO(ITEM_DEKU_NUT)++;
+ if (AMMO(ITEM_DEKU_NUT) > CUR_CAPACITY(UPG_DEKU_NUTS)) {
+ AMMO(ITEM_DEKU_NUT) = CUR_CAPACITY(UPG_DEKU_NUTS);
}
}
- } else if ((item == ITEM_NUTS_5) || (item == ITEM_NUTS_10)) {
- if (INV_CONTENT(ITEM_NUT) != ITEM_NUT) {
- Inventory_ChangeUpgrade(UPG_NUTS, 1);
- AMMO(ITEM_NUT) += sAmmoRefillCounts[item - ITEM_NUTS_5];
+ } else if ((item == ITEM_DEKU_NUTS_5) || (item == ITEM_DEKU_NUTS_10)) {
+ if (INV_CONTENT(ITEM_DEKU_NUT) != ITEM_DEKU_NUT) {
+ Inventory_ChangeUpgrade(UPG_DEKU_NUTS, 1);
+ AMMO(ITEM_DEKU_NUT) += sAmmoRefillCounts[item - ITEM_DEKU_NUTS_5];
} else {
- AMMO(ITEM_NUT) += sAmmoRefillCounts[item - ITEM_NUTS_5];
- if (AMMO(ITEM_NUT) > CUR_CAPACITY(UPG_NUTS)) {
- AMMO(ITEM_NUT) = CUR_CAPACITY(UPG_NUTS);
+ AMMO(ITEM_DEKU_NUT) += sAmmoRefillCounts[item - ITEM_DEKU_NUTS_5];
+ if (AMMO(ITEM_DEKU_NUT) > CUR_CAPACITY(UPG_DEKU_NUTS)) {
+ AMMO(ITEM_DEKU_NUT) = CUR_CAPACITY(UPG_DEKU_NUTS);
}
}
- item = ITEM_NUT;
+ item = ITEM_DEKU_NUT;
} else if (item == ITEM_POWDER_KEG) {
if (INV_CONTENT(ITEM_POWDER_KEG) != ITEM_POWDER_KEG) {
@@ -2056,7 +2737,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;
@@ -2079,7 +2760,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];
@@ -2102,8 +2783,8 @@ u8 Item_Give(PlayState* play, u8 item) {
}
return ITEM_BOW;
- } else if (item == ITEM_OCARINA) {
- INV_CONTENT(ITEM_OCARINA) = ITEM_OCARINA;
+ } else if (item == ITEM_OCARINA_OF_TIME) {
+ INV_CONTENT(ITEM_OCARINA_OF_TIME) = ITEM_OCARINA_OF_TIME;
return ITEM_NONE;
} else if (item == ITEM_MAGIC_BEANS) {
@@ -2125,7 +2806,7 @@ u8 Item_Give(PlayState* play, u8 item) {
Health_ChangeBy(play, 0x10);
return item;
- } else if (item == ITEM_MAGIC_SMALL) {
+ } else if (item == ITEM_MAGIC_JAR_SMALL) {
Magic_Add(play, MAGIC_NORMAL_METER / 2);
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_12_80)) {
SET_WEEKEVENTREG(WEEKEVENTREG_12_80);
@@ -2133,7 +2814,7 @@ u8 Item_Give(PlayState* play, u8 item) {
}
return item;
- } else if (item == ITEM_MAGIC_LARGE) {
+ } else if (item == ITEM_MAGIC_JAR_BIG) {
Magic_Add(play, MAGIC_NORMAL_METER);
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_12_80)) {
SET_WEEKEVENTREG(WEEKEVENTREG_12_80);
@@ -2149,8 +2830,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;
}
}
@@ -2161,8 +2842,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;
}
}
@@ -2172,8 +2853,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;
}
}
@@ -2203,7 +2884,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);
}
@@ -2222,23 +2903,23 @@ 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;
}
}
}
- } else if ((item >= ITEM_MOON_TEAR) && (item <= ITEM_MASK_GIANT)) {
+ } else if ((item >= ITEM_MOONS_TEAR) && (item <= ITEM_MASK_GIANT)) {
temp = INV_CONTENT(item);
INV_CONTENT(item) = item;
- if ((item >= ITEM_MOON_TEAR) && (item <= ITEM_PENDANT_OF_MEMORIES) && (temp != ITEM_NONE)) {
+ if ((item >= ITEM_MOONS_TEAR) && (item <= ITEM_PENDANT_OF_MEMORIES) && (temp != ITEM_NONE)) {
for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) {
if (temp == GET_CUR_FORM_BTN_ITEM(i)) {
SET_CUR_FORM_BTN_ITEM(i, item);
@@ -2250,7 +2931,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;
}
@@ -2261,8 +2942,8 @@ u8 Item_CheckObtainabilityImpl(u8 item) {
u8 bottleSlot;
slot = SLOT(item);
- if (item >= ITEM_STICKS_5) {
- slot = SLOT(sExtraItemBases[item - ITEM_STICKS_5]);
+ if (item >= ITEM_DEKU_STICKS_5) {
+ slot = SLOT(sExtraItemBases[item - ITEM_DEKU_STICKS_5]);
}
if (item == ITEM_SKULL_TOKEN) {
@@ -2289,8 +2970,8 @@ u8 Item_CheckObtainabilityImpl(u8 item) {
} else if (item == ITEM_KEY_SMALL) {
return ITEM_NONE;
- } else if ((item == ITEM_OCARINA) || (item == ITEM_BOMBCHU) || (item == ITEM_HOOKSHOT) || (item == ITEM_LENS) ||
- (item == ITEM_SWORD_GREAT_FAIRY) || (item == ITEM_PICTO_BOX)) {
+ } else if ((item == ITEM_OCARINA_OF_TIME) || (item == ITEM_BOMBCHU) || (item == ITEM_HOOKSHOT) ||
+ (item == ITEM_LENS_OF_TRUTH) || (item == ITEM_SWORD_GREAT_FAIRY) || (item == ITEM_PICTOGRAPH_BOX)) {
if (INV_CONTENT(item) == ITEM_NONE) {
return ITEM_NONE;
}
@@ -2324,7 +3005,7 @@ u8 Item_CheckObtainabilityImpl(u8 item) {
}
return 0;
- } else if ((item >= ITEM_STICK_UPGRADE_20) && (item <= ITEM_NUT_UPGRADE_40)) {
+ } else if ((item >= ITEM_DEKU_STICK_UPGRADE_20) && (item <= ITEM_DEKU_NUT_UPGRADE_40)) {
return ITEM_NONE;
} else if ((item >= ITEM_BOMB_BAG_30) && (item <= ITEM_WALLET_GIANT)) {
@@ -2345,7 +3026,7 @@ u8 Item_CheckObtainabilityImpl(u8 item) {
} else if (item == ITEM_RECOVERY_HEART) {
return ITEM_RECOVERY_HEART;
- } else if ((item == ITEM_MAGIC_SMALL) || (item == ITEM_MAGIC_LARGE)) {
+ } else if ((item == ITEM_MAGIC_JAR_SMALL) || (item == ITEM_MAGIC_JAR_BIG)) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_12_80)) {
return ITEM_NONE;
}
@@ -2391,22 +3072,22 @@ 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;
}
}
}
- } else if ((item >= ITEM_MOON_TEAR) && (item <= ITEM_MASK_GIANT)) {
+ } else if ((item >= ITEM_MOONS_TEAR) && (item <= ITEM_MASK_GIANT)) {
return ITEM_NONE;
}
- return gSaveContext.save.inventory.items[slot];
+ return gSaveContext.save.saveInfo.inventory.items[slot];
}
u8 Item_CheckObtainability(u8 item) {
@@ -2416,7 +3097,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) {
@@ -2441,8 +3122,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) {
@@ -2465,10 +3146,8 @@ void Inventory_UpdateDeitySwordEquip(PlayState* play) {
interfaceCtx->unk_21C = 0;
interfaceCtx->bButtonDoAction = 0;
- // Is simply checking if (gSaveContext.save.playerForm == PLAYER_FORM_FIERCE_DEITY)
- if ((((gSaveContext.save.playerForm > 0) && (gSaveContext.save.playerForm < 4))
- ? 1
- : gSaveContext.save.playerForm >> 1) == 0) {
+ // Is simply checking if (GET_PLAYER_FORM == PLAYER_FORM_FIERCE_DEITY)
+ if ((((GET_PLAYER_FORM > 0) && (GET_PLAYER_FORM < 4)) ? 1 : GET_PLAYER_FORM >> 1) == 0) {
CUR_FORM_EQUIP(EQUIP_SLOT_B) = ITEM_SWORD_DEITY;
} else if (CUR_FORM_EQUIP(EQUIP_SLOT_B) == ITEM_SWORD_DEITY) {
if (GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == EQUIP_VALUE_SWORD_NONE) {
@@ -2491,7 +3170,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;
}
}
@@ -2502,7 +3181,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;
}
}
@@ -2510,7 +3189,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);
@@ -2529,7 +3208,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);
@@ -2539,7 +3218,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;
}
}
@@ -2553,7 +3232,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) {
@@ -2586,19 +3265,20 @@ 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)) {
+ Audio_PlaySfx(NA_SE_SY_HP_RECOVER);
+ } 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;
@@ -2606,7 +3286,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) {
@@ -2614,22 +3294,22 @@ void Rupees_ChangeBy(s16 rupeeChange) {
}
void Inventory_ChangeAmmo(s16 item, s16 ammoChange) {
- if (item == ITEM_STICK) {
- AMMO(ITEM_STICK) += ammoChange;
+ if (item == ITEM_DEKU_STICK) {
+ AMMO(ITEM_DEKU_STICK) += ammoChange;
- if (AMMO(ITEM_STICK) >= CUR_CAPACITY(UPG_STICKS)) {
- AMMO(ITEM_STICK) = CUR_CAPACITY(UPG_STICKS);
- } else if (AMMO(ITEM_STICK) < 0) {
- AMMO(ITEM_STICK) = 0;
+ if (AMMO(ITEM_DEKU_STICK) >= CUR_CAPACITY(UPG_DEKU_STICKS)) {
+ AMMO(ITEM_DEKU_STICK) = CUR_CAPACITY(UPG_DEKU_STICKS);
+ } else if (AMMO(ITEM_DEKU_STICK) < 0) {
+ AMMO(ITEM_DEKU_STICK) = 0;
}
- } else if (item == ITEM_NUT) {
- AMMO(ITEM_NUT) += ammoChange;
+ } else if (item == ITEM_DEKU_NUT) {
+ AMMO(ITEM_DEKU_NUT) += ammoChange;
- if (AMMO(ITEM_NUT) >= CUR_CAPACITY(UPG_NUTS)) {
- AMMO(ITEM_NUT) = CUR_CAPACITY(UPG_NUTS);
- } else if (AMMO(ITEM_NUT) < 0) {
- AMMO(ITEM_NUT) = 0;
+ if (AMMO(ITEM_DEKU_NUT) >= CUR_CAPACITY(UPG_DEKU_NUTS)) {
+ AMMO(ITEM_DEKU_NUT) = CUR_CAPACITY(UPG_DEKU_NUTS);
+ } else if (AMMO(ITEM_DEKU_NUT) < 0) {
+ AMMO(ITEM_DEKU_NUT) = 0;
}
} else if (item == ITEM_BOMBCHU) {
@@ -2673,7 +3353,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;
}
@@ -2697,14 +3377,14 @@ 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);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
}
return false;
}
@@ -2725,7 +3405,7 @@ s32 Magic_Consume(PlayState* play, s16 magicToConsume, s16 type) {
gSaveContext.magicState = MAGIC_STATE_CONSUME_SETUP;
return true;
} else {
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
return false;
}
@@ -2744,13 +3424,13 @@ s32 Magic_Consume(PlayState* play, s16 magicToConsume, s16 type) {
gSaveContext.magicState = MAGIC_STATE_METER_FLASH_3;
return true;
} else {
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
return false;
}
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;
@@ -2775,13 +3455,13 @@ s32 Magic_Consume(PlayState* play, s16 magicToConsume, s16 type) {
gSaveContext.magicState = MAGIC_STATE_METER_FLASH_2;
return true;
} else {
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
return false;
}
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;
@@ -2792,7 +3472,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;
@@ -2816,10 +3496,10 @@ 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);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
return false;
}
}
@@ -2829,11 +3509,11 @@ s32 Magic_Consume(PlayState* play, s16 magicToConsume, s16 type) {
void Magic_UpdateAddRequest(void) {
if (gSaveContext.isMagicRequested) {
- gSaveContext.save.playerData.magic += 4;
- play_sound(NA_SE_SY_GAUGE_UP - SFX_FLAG);
+ gSaveContext.save.saveInfo.playerData.magic += 4;
+ Audio_PlaySfx(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 {
@@ -2909,7 +3589,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;
@@ -2931,14 +3611,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 == 0) && (gSaveContext.sceneLayer < 4)) {
- play_sound(NA_SE_SY_GAUGE_UP - SFX_FLAG);
+ if ((gSaveContext.gameMode == GAMEMODE_NORMAL) && (gSaveContext.sceneLayer < 4)) {
+ Audio_PlaySfx(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;
@@ -2952,10 +3632,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;
@@ -2977,20 +3657,20 @@ void Magic_Update(PlayState* play) {
case MAGIC_STATE_CONSUME_LENS:
// Slowly consume magic while Lens of Truth is active
if ((play->pauseCtx.state == PAUSE_STATE_OFF) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE) &&
- (msgCtx->msgMode == 0) && (play->gameOverCtx.state == GAMEOVER_INACTIVE) &&
+ (msgCtx->msgMode == MSGMODE_NONE) && (play->gameOverCtx.state == GAMEOVER_INACTIVE) &&
(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) &&
- (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) != ITEM_LENS) &&
- (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) != ITEM_LENS)) ||
+ ((BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) != ITEM_LENS_OF_TRUTH) &&
+ (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) != ITEM_LENS_OF_TRUTH) &&
+ (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) != ITEM_LENS_OF_TRUTH)) ||
!play->actorCtx.lensActive) {
// Deactivate Lens of Truth and set magic state to idle
play->actorCtx.lensActive = false;
- play_sound(NA_SE_SY_GLASSMODE_OFF);
+ Audio_PlaySfx(NA_SE_SY_GLASSMODE_OFF);
gSaveContext.magicState = MAGIC_STATE_IDLE;
sMagicMeterOutlinePrimRed = sMagicMeterOutlinePrimGreen = sMagicMeterOutlinePrimBlue = 255;
break;
@@ -2999,7 +3679,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;
}
@@ -3011,25 +3691,25 @@ 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
case MAGIC_STATE_CONSUME_GORON_ZORA:
if ((play->pauseCtx.state == PAUSE_STATE_OFF) && (play->pauseCtx.debugEditor == 0) &&
- (msgCtx->msgMode == 0) && (play->gameOverCtx.state == GAMEOVER_INACTIVE) &&
+ (msgCtx->msgMode == MSGMODE_NONE) && (play->gameOverCtx.state == GAMEOVER_INACTIVE) &&
(play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF)) {
if (!Play_InCsMode(play)) {
interfaceCtx->magicConsumptionTimer--;
if (interfaceCtx->magicConsumptionTimer == 0) {
if (!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;
}
@@ -3042,16 +3722,16 @@ void Magic_Update(PlayState* play) {
case MAGIC_STATE_CONSUME_GIANTS_MASK:
if ((play->pauseCtx.state == PAUSE_STATE_OFF) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE) &&
- (msgCtx->msgMode == 0) && (play->gameOverCtx.state == GAMEOVER_INACTIVE) &&
+ (msgCtx->msgMode == MSGMODE_NONE) && (play->gameOverCtx.state == GAMEOVER_INACTIVE) &&
(play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF)) {
if (!Play_InCsMode(play)) {
interfaceCtx->magicConsumptionTimer--;
if (interfaceCtx->magicConsumptionTimer == 0) {
if (!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;
}
@@ -3074,14 +3754,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);
@@ -3108,8 +3788,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++);
@@ -3123,7 +3803,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
@@ -3138,66 +3819,525 @@ 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);
}
}
CLOSE_DISPS(play->state.gfxCtx);
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80116FD8.s")
+void Interface_SetPerspectiveView(PlayState* play, s32 topY, s32 bottomY, s32 leftX, s32 rightX) {
+ InterfaceContext* interfaceCtx = &play->interfaceCtx;
+ Vec3f eye;
+ Vec3f at;
+ Vec3f up;
-void func_801170B8(InterfaceContext* interfaceCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_801170B8.s")
+ eye.x = eye.y = eye.z = 0.0f;
+ at.x = at.y = 0.0f;
+ at.z = -1.0f;
+ up.x = up.z = 0.0f;
+ up.y = 1.0f;
-TexturePtr cUpLabelTextures[] = {
- gTatlCUpENGTex, gTatlCUpENGTex, gTatlCUpGERTex, gTatlCUpFRATex, gTatlCUpESPTex,
-};
-s16 startButtonLeftPos[] = {
- // Remnant of OoT
- 130, 136, 136, 136, 136,
-};
-s16 D_801BFAF4[] = { 0x1D, 0x1B };
-s16 D_801BFAF8[] = { 0x1B, 0x1B };
+ View_LookAt(&interfaceCtx->view, &eye, &at, &up);
-void func_80117100(PlayState* play);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80117100.s")
+ interfaceCtx->viewport.topY = topY;
+ interfaceCtx->viewport.bottomY = bottomY;
+ interfaceCtx->viewport.leftX = leftX;
+ interfaceCtx->viewport.rightX = rightX;
+ View_SetViewport(&interfaceCtx->view, &interfaceCtx->viewport);
-s16 D_801BFAFC[] = { 30, 24, 24, 24 };
+ View_SetPerspective(&interfaceCtx->view, 60.0f, 10.0f, 60.0f);
+ View_ApplyPerspectiveToOverlay(&interfaceCtx->view);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80117A20.s")
+void Interface_SetOrthoView(InterfaceContext* interfaceCtx) {
+ SET_FULLSCREEN_VIEWPORT(&interfaceCtx->view);
+ View_ApplyOrthoToOverlay(&interfaceCtx->view);
+}
+
+void Interface_DrawItemButtons(PlayState* play) {
+ static TexturePtr cUpLabelTextures[] = {
+ gTatlCUpENGTex, gTatlCUpENGTex, gTatlCUpGERTex, gTatlCUpFRATex, gTatlCUpESPTex,
+ };
+ static s16 startButtonLeftPos[] = {
+ // Remnant of OoT
+ 130, 136, 136, 136, 136,
+ };
+ static s16 D_801BFAF4[] = {
+ 0x1D, // EQUIP_SLOT_B
+ 0x1B, // EQUIP_SLOT_C_LEFT
+ 0x1B, // EQUIP_SLOT_C_DOWN
+ 0x1B, // EQUIP_SLOT_C_RIGHT
+ };
+ InterfaceContext* interfaceCtx = &play->interfaceCtx;
+ Player* player = GET_PLAYER(play);
+ PauseContext* pauseCtx = &play->pauseCtx;
+ MessageContext* msgCtx = &play->msgCtx;
+ s16 temp; // Used as both an alpha value and a button index
+ s32 pad;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+
+ // B Button Color & Texture
+ OVERLAY_DISP = Gfx_DrawTexRectIA8_DropShadow(
+ OVERLAY_DISP, gButtonBackgroundTex, 0x20, 0x20, D_801BF9D4[EQUIP_SLOT_B], D_801BF9DC[EQUIP_SLOT_B],
+ D_801BFAF4[EQUIP_SLOT_B], D_801BFAF4[EQUIP_SLOT_B], D_801BF9E4[EQUIP_SLOT_B] * 2, D_801BF9E4[EQUIP_SLOT_B] * 2,
+ 100, 255, 120, interfaceCtx->bAlpha);
+ gDPPipeSync(OVERLAY_DISP++);
+
+ // C-Left Button Color & Texture
+ OVERLAY_DISP = Gfx_DrawRect_DropShadow(OVERLAY_DISP, D_801BF9D4[EQUIP_SLOT_C_LEFT], D_801BF9DC[EQUIP_SLOT_C_LEFT],
+ D_801BFAF4[EQUIP_SLOT_C_LEFT], D_801BFAF4[EQUIP_SLOT_C_LEFT],
+ D_801BF9E4[EQUIP_SLOT_C_LEFT] * 2, D_801BF9E4[EQUIP_SLOT_C_LEFT] * 2, 255,
+ 240, 0, interfaceCtx->cLeftAlpha);
+ // C-Down Button Color & Texture
+ OVERLAY_DISP = Gfx_DrawRect_DropShadow(OVERLAY_DISP, D_801BF9D4[EQUIP_SLOT_C_DOWN], D_801BF9DC[EQUIP_SLOT_C_DOWN],
+ D_801BFAF4[EQUIP_SLOT_C_DOWN], D_801BFAF4[EQUIP_SLOT_C_DOWN],
+ D_801BF9E4[EQUIP_SLOT_C_DOWN] * 2, D_801BF9E4[EQUIP_SLOT_C_DOWN] * 2, 255,
+ 240, 0, interfaceCtx->cDownAlpha);
+ // C-Right Button Color & Texture
+ OVERLAY_DISP = Gfx_DrawRect_DropShadow(OVERLAY_DISP, D_801BF9D4[EQUIP_SLOT_C_RIGHT], D_801BF9DC[EQUIP_SLOT_C_RIGHT],
+ D_801BFAF4[EQUIP_SLOT_C_RIGHT], D_801BFAF4[EQUIP_SLOT_C_RIGHT],
+ D_801BF9E4[EQUIP_SLOT_C_RIGHT] * 2, D_801BF9E4[EQUIP_SLOT_C_RIGHT] * 2, 255,
+ 240, 0, interfaceCtx->cRightAlpha);
+
+ if (!IS_PAUSE_STATE_GAMEOVER) {
+ if ((play->pauseCtx.state != PAUSE_STATE_OFF) || (play->pauseCtx.debugEditor != DEBUG_EDITOR_NONE)) {
+ OVERLAY_DISP = Gfx_DrawRect_DropShadow(OVERLAY_DISP, 0x88, 0x11, 0x16, 0x16, 0x5B6, 0x5B6, 0xFF, 0x82, 0x3C,
+ interfaceCtx->startAlpha);
+ // Start Button Texture, Color & Label
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->startAlpha);
+ gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 0);
+ gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
+ PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE * 2, G_IM_FMT_IA,
+ DO_ACTION_TEX_WIDTH, DO_ACTION_TEX_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++, 0x01F8, 0x0054, 0x02D4, 0x009C, G_TX_RENDERTILE, 0, 0, 0x04A6, 0x04A6);
+ }
+ }
+
+ if (interfaceCtx->tatlCalling && (play->pauseCtx.state == PAUSE_STATE_OFF) &&
+ (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)
+ gDPPipeSync(OVERLAY_DISP++);
+
+ if ((gSaveContext.hudVisibility == HUD_VISIBILITY_NONE) ||
+ (gSaveContext.hudVisibility == HUD_VISIBILITY_NONE_ALT) ||
+ (gSaveContext.hudVisibility == HUD_VISIBILITY_A_HEARTS_MAGIC_WITH_OVERWRITE) ||
+ (msgCtx->msgMode != MSGMODE_NONE)) {
+ temp = 0;
+ } else if (player->stateFlags1 & PLAYER_STATE1_200000) {
+ temp = 70;
+ } else {
+ temp = interfaceCtx->aAlpha;
+ }
+
+ OVERLAY_DISP =
+ Gfx_DrawRect_DropShadow(OVERLAY_DISP, 0xFE, 0x10, 0x10, 0x10, 0x800, 0x800, 0xFF, 0xF0, 0, temp);
+
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, temp);
+ gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 0);
+ gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
+ PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPLoadTextureBlock_4b(OVERLAY_DISP++, cUpLabelTextures[gSaveContext.options.language], G_IM_FMT_IA, 32, 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);
+ gSPTextureRectangle(OVERLAY_DISP++, 0x03DC, 0x0048, 0x045C, 0x0078, G_TX_RENDERTILE, 0, 0, 1 << 10,
+ 1 << 10);
+ }
+
+ sCUpTimer--;
+ if (sCUpTimer == 0) {
+ sCUpInvisible ^= 1;
+ sCUpTimer = 10;
+ }
+ }
+
+ gDPPipeSync(OVERLAY_DISP++);
+
+ // Empty C Button Arrows
+ for (temp = EQUIP_SLOT_C_LEFT; temp <= EQUIP_SLOT_C_RIGHT; temp++) {
+ if (GET_CUR_FORM_BTN_ITEM(temp) > 0xF0) {
+ if (temp == EQUIP_SLOT_C_LEFT) {
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 240, 0, interfaceCtx->cLeftAlpha);
+ } else if (temp == EQUIP_SLOT_C_DOWN) {
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 240, 0, interfaceCtx->cDownAlpha);
+ } else { // EQUIP_SLOT_C_RIGHT
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 240, 0, interfaceCtx->cRightAlpha);
+ }
+ OVERLAY_DISP = Gfx_DrawTexRectIA8(OVERLAY_DISP, ((u8*)gButtonBackgroundTex + ((32 * 32) * (temp + 1))),
+ 0x20, 0x20, D_801BF9D4[temp], D_801BF9DC[temp], D_801BFAF4[temp],
+ D_801BFAF4[temp], D_801BF9E4[temp] * 2, D_801BF9E4[temp] * 2);
+ }
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void Interface_DrawItemIconTexture(PlayState* play, TexturePtr texture, s16 button) {
+ static s16 D_801BFAFC[] = { 30, 24, 24, 24 };
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ gDPLoadTextureBlock(OVERLAY_DISP++, texture, 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);
+
+ gSPTextureRectangle(OVERLAY_DISP++, D_801BF9D4[button] << 2, D_801BF9DC[button] << 2,
+ (D_801BF9D4[button] + D_801BFAFC[button]) << 2, (D_801BF9DC[button] + D_801BFAFC[button]) << 2,
+ G_TX_RENDERTILE, 0, 0, D_801BF9BC[button] << 1, D_801BF9BC[button] << 1);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
s16 D_801BFB04[] = { 0xA2, 0xE4, 0xFA, 0x110 };
s16 D_801BFB0C[] = { 0x23, 0x23, 0x33, 0x23 };
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80117BD0.s")
+void Interface_DrawAmmoCount(PlayState* play, s16 button, s16 alpha) {
+ u8 i;
+ u16 ammo;
-void func_80118084(PlayState* play);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80118084.s")
+ OPEN_DISPS(play->state.gfxCtx);
-void func_80118890(PlayState* play);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80118890.s")
+ i = ((void)0, GET_CUR_FORM_BTN_ITEM(button));
-void func_80118BA4(PlayState* play);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80118BA4.s")
+ if ((i == ITEM_DEKU_STICK) || (i == ITEM_DEKU_NUT) || (i == ITEM_BOMB) || (i == ITEM_BOW) ||
+ ((i >= ITEM_BOW_FIRE) && (i <= ITEM_BOW_LIGHT)) || (i == ITEM_BOMBCHU) || (i == ITEM_POWDER_KEG) ||
+ (i == ITEM_MAGIC_BEANS) || (i == ITEM_PICTOGRAPH_BOX)) {
-extern TexturePtr D_08095AC0; // gMagicArrowEquipEffectTex
-s16 D_801BFB14[] = { 255, 100, 255, 0 }; // magicArrowEffectsR
-s16 D_801BFB1C[] = { 0, 100, 255, 0 }; // magicArrowEffectsG
-s16 D_801BFB24[] = { 0, 255, 100, 0 }; // magicArrowEffectsB
+ if ((i >= ITEM_BOW_FIRE) && (i <= ITEM_BOW_LIGHT)) {
+ i = ITEM_BOW;
+ }
-void func_80119030(PlayState* play);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80119030.s")
+ ammo = AMMO(i);
+
+ if (i == ITEM_PICTOGRAPH_BOX) {
+ if (!CHECK_QUEST_ITEM(QUEST_PICTOGRAPH)) {
+ ammo = 0;
+ } else {
+ ammo = 1;
+ }
+ }
+
+ gDPPipeSync(OVERLAY_DISP++);
+
+ if ((button == EQUIP_SLOT_B) && (gSaveContext.minigameStatus == MINIGAME_STATUS_ACTIVE)) {
+ ammo = play->interfaceCtx.minigameAmmo;
+ } else if ((button == EQUIP_SLOT_B) && (play->unk_1887C > 1)) {
+ ammo = play->unk_1887C - 1;
+ } else if (((i == ITEM_BOW) && (AMMO(i) == CUR_CAPACITY(UPG_QUIVER))) ||
+ ((i == ITEM_BOMB) && (AMMO(i) == CUR_CAPACITY(UPG_BOMB_BAG))) ||
+ ((i == ITEM_DEKU_STICK) && (AMMO(i) == CUR_CAPACITY(UPG_DEKU_STICKS))) ||
+ ((i == ITEM_DEKU_NUT) && (AMMO(i) == CUR_CAPACITY(UPG_DEKU_NUTS))) ||
+ ((i == ITEM_BOMBCHU) && (AMMO(i) == CUR_CAPACITY(UPG_BOMB_BAG))) ||
+ ((i == ITEM_POWDER_KEG) && (ammo == 1)) || ((i == ITEM_PICTOGRAPH_BOX) && (ammo == 1)) ||
+ ((i == ITEM_MAGIC_BEANS) && (ammo == 20))) {
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 120, 255, 0, alpha);
+ }
+
+ if ((u32)ammo == 0) {
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 100, 100, 100, alpha);
+ }
+
+ for (i = 0; ammo >= 10; i++) {
+ ammo -= 10;
+ }
+
+ // Draw upper digit (tens)
+ if ((u32)i != 0) {
+ OVERLAY_DISP = Gfx_DrawTexRectIA8(OVERLAY_DISP, ((u8*)gAmmoDigit0Tex + ((8 * 8) * i)), 8, 8,
+ D_801BFB04[button], D_801BFB0C[button], 8, 8, 1 << 10, 1 << 10);
+ }
+
+ // Draw lower digit (ones)
+ OVERLAY_DISP = Gfx_DrawTexRectIA8(OVERLAY_DISP, ((u8*)gAmmoDigit0Tex + ((8 * 8) * ammo)), 8, 8,
+ D_801BFB04[button] + 6, D_801BFB0C[button], 8, 8, 1 << 10, 1 << 10);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void Interface_DrawBButtonIcons(PlayState* play) {
+ InterfaceContext* interfaceCtx = &play->interfaceCtx;
+ Player* player = GET_PLAYER(play);
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->bAlpha);
+ gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+
+ if ((interfaceCtx->unk_222 == 0) && (player->stateFlags3 & PLAYER_STATE3_1000000)) {
+ if (gSaveContext.buttonStatus[EQUIP_SLOT_B] != BTN_DISABLED) {
+ Interface_DrawItemIconTexture(play, interfaceCtx->iconItemSegment, EQUIP_SLOT_B);
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
+ PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+
+ Interface_DrawAmmoCount(play, EQUIP_SLOT_B, interfaceCtx->bAlpha);
+ }
+ } else if ((!interfaceCtx->unk_21C && (interfaceCtx->unk_222 == 0)) ||
+ ((interfaceCtx->unk_21C &&
+ ((BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) < ITEM_SWORD_KOKIRI) ||
+ (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) > ITEM_SWORD_GILDED)) &&
+ BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) != ITEM_NONE) &&
+ (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) != ITEM_DEKU_NUT))) {
+ if ((player->transformation == PLAYER_FORM_FIERCE_DEITY) || (player->transformation == PLAYER_FORM_HUMAN)) {
+ if (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) != ITEM_NONE) {
+ Interface_DrawItemIconTexture(play, interfaceCtx->iconItemSegment, EQUIP_SLOT_B);
+ if ((player->stateFlags1 & PLAYER_STATE1_800000) || CHECK_WEEKEVENTREG(WEEKEVENTREG_08_01) ||
+ (play->unk_1887C >= 2)) {
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE,
+ 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+
+ if ((play->sceneId != SCENE_SYATEKI_MIZU) && (play->sceneId != SCENE_SYATEKI_MORI) &&
+ (play->sceneId != SCENE_BOWLING) &&
+ ((gSaveContext.minigameStatus != MINIGAME_STATUS_ACTIVE) ||
+ (gSaveContext.save.entrance != ENTRANCE(ROMANI_RANCH, 0))) &&
+ ((gSaveContext.minigameStatus != MINIGAME_STATUS_ACTIVE) || !CHECK_EVENTINF(EVENTINF_35)) &&
+ (!CHECK_WEEKEVENTREG(WEEKEVENTREG_31_80) || (play->unk_1887C != 100))) {
+ Interface_DrawAmmoCount(play, EQUIP_SLOT_B, interfaceCtx->bAlpha);
+ }
+ }
+ }
+ }
+ } else if (interfaceCtx->unk_222 != 0) {
+ gDPPipeSync(OVERLAY_DISP++);
+ 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, 255, interfaceCtx->bAlpha);
+ gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->doActionSegment + 0x480, G_IM_FMT_IA, 48, 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);
+
+ D_801BF9B0 = 1024.0f / (D_801BF9B4[gSaveContext.options.language] / 100.0f);
+
+ gSPTextureRectangle(
+ OVERLAY_DISP++, (D_801BF9C4[gSaveContext.options.language] * 4),
+ (D_801BF9C8[gSaveContext.options.language] * 4), ((D_801BF9C4[gSaveContext.options.language] + 0x30) << 2),
+ ((D_801BF9C8[gSaveContext.options.language] + 0x10) << 2), G_TX_RENDERTILE, 0, 0, D_801BF9B0, D_801BF9B0);
+ } else if (interfaceCtx->bButtonDoAction != DO_ACTION_NONE) {
+ gDPPipeSync(OVERLAY_DISP++);
+ 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, 255, interfaceCtx->bAlpha);
+ gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->doActionSegment + 0x600, G_IM_FMT_IA, 48, 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);
+
+ D_801BF9B0 = 1024.0f / (D_801BF9B4[gSaveContext.options.language] / 100.0f);
+
+ gSPTextureRectangle(
+ OVERLAY_DISP++, (D_801BF9C4[gSaveContext.options.language] * 4),
+ (D_801BF9C8[gSaveContext.options.language] * 4), ((D_801BF9C4[gSaveContext.options.language] + 0x30) << 2),
+ ((D_801BF9C8[gSaveContext.options.language] + 0x10) << 2), G_TX_RENDERTILE, 0, 0, D_801BF9B0, D_801BF9B0);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+/**
+ * Draws the icons and ammo for each of the C buttons
+ */
+void Interface_DrawCButtonIcons(PlayState* play) {
+ InterfaceContext* interfaceCtx = &play->interfaceCtx;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ gDPPipeSync(OVERLAY_DISP++);
+
+ // C-Left Button Icon & Ammo Count
+ if (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) < ITEM_F0) {
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->cLeftAlpha);
+ gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ Interface_DrawItemIconTexture(play, interfaceCtx->iconItemSegment + 0x1000, EQUIP_SLOT_C_LEFT);
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
+ PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ Interface_DrawAmmoCount(play, EQUIP_SLOT_C_LEFT, interfaceCtx->cLeftAlpha);
+ }
+
+ gDPPipeSync(OVERLAY_DISP++);
+
+ // C-Down Button Icon & Ammo Count
+ if (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) < ITEM_F0) {
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->cDownAlpha);
+ gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ Interface_DrawItemIconTexture(play, interfaceCtx->iconItemSegment + 0x2000, EQUIP_SLOT_C_DOWN);
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
+ PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ Interface_DrawAmmoCount(play, EQUIP_SLOT_C_DOWN, interfaceCtx->cDownAlpha);
+ }
+
+ gDPPipeSync(OVERLAY_DISP++);
+
+ // C-Right Button Icon & Ammo Count
+ if (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) < ITEM_F0) {
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->cRightAlpha);
+ gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ Interface_DrawItemIconTexture(play, interfaceCtx->iconItemSegment + 0x3000, EQUIP_SLOT_C_RIGHT);
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
+ PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ Interface_DrawAmmoCount(play, EQUIP_SLOT_C_RIGHT, interfaceCtx->cRightAlpha);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void Interface_DrawAButton(PlayState* play) {
+ InterfaceContext* interfaceCtx = &play->interfaceCtx;
+ s16 aAlpha;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ aAlpha = interfaceCtx->aAlpha;
+
+ if (aAlpha > 100) {
+ aAlpha = 100;
+ }
+
+ Gfx_SetupDL42_Overlay(play->state.gfxCtx);
+
+ Interface_SetPerspectiveView(play, 25 + R_A_BTN_Y_OFFSET, 70 + R_A_BTN_Y_OFFSET, 192, 237);
+
+ gSPClearGeometryMode(OVERLAY_DISP++, G_CULL_BOTH);
+ gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
+
+ Matrix_Translate(0.0f, 0.0f, -38.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(interfaceCtx->aButtonRoll / 10000.0f);
+
+ // Draw A button Shadow
+ gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gDPPipeSync(OVERLAY_DISP++);
+ gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[4], 4, 0);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, aAlpha);
+
+ OVERLAY_DISP = Gfx_DrawTexQuadIA8(OVERLAY_DISP, gButtonBackgroundTex, 32, 32, 0);
+
+ // Draw A Button Colored
+ gDPPipeSync(OVERLAY_DISP++);
+ Interface_SetPerspectiveView(play, 23 + R_A_BTN_Y_OFFSET, 68 + R_A_BTN_Y_OFFSET, 190, 235);
+ gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[0], 4, 0);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 100, 200, 255, interfaceCtx->aAlpha);
+ gSP1Quadrangle(OVERLAY_DISP++, 0, 2, 3, 1, 0);
+
+ // Draw A Button Do-Action
+ gDPPipeSync(OVERLAY_DISP++);
+ Interface_SetPerspectiveView(play, 23 + R_A_BTN_Y_OFFSET, 68 + R_A_BTN_Y_OFFSET, 190, 235);
+ gSPSetGeometryMode(OVERLAY_DISP++, G_CULL_BACK);
+ 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, 255, interfaceCtx->aAlpha);
+ gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 0);
+
+ Matrix_Translate(0.0f, 0.0f, D_801BF9CC[gSaveContext.options.language] / 10.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(interfaceCtx->aButtonRoll / 10000.0f);
+ gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[8], 4, 0);
+
+ // Draw Action Label
+ if (((interfaceCtx->aButtonState <= A_BTN_STATE_1) || (interfaceCtx->aButtonState == A_BTN_STATE_3))) {
+ OVERLAY_DISP = Gfx_DrawTexQuad4b(OVERLAY_DISP, interfaceCtx->doActionSegment, 3, DO_ACTION_TEX_WIDTH,
+ DO_ACTION_TEX_HEIGHT, 0);
+ } else {
+ OVERLAY_DISP = Gfx_DrawTexQuad4b(OVERLAY_DISP, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE, 3,
+ DO_ACTION_TEX_WIDTH, DO_ACTION_TEX_HEIGHT, 0);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+static s16 sMagicArrowEffectsR[] = { 255, 100, 255 };
+static s16 sMagicArrowEffectsG[] = { 0, 100, 255 };
+static s16 sMagicArrowEffectsB[] = { 0, 255, 100 };
+
+void Interface_DrawPauseMenuEquippingIcons(PlayState* play) {
+ InterfaceContext* interfaceCtx = &play->interfaceCtx;
+ PauseContext* pauseCtx = &play->pauseCtx;
+ s16 temp;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ gDPPipeSync(OVERLAY_DISP++);
+
+ // This is needed as `Interface_DrawPauseMenuEquippingIcons` is call immediately
+ // after `Interface_DrawAButton`, which sets the view to perspective mode
+ Interface_SetOrthoView(interfaceCtx);
+
+ if ((pauseCtx->state == PAUSE_STATE_MAIN) && ((pauseCtx->mainState == PAUSE_MAIN_STATE_EQUIP_ITEM) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_EQUIP_MASK))) {
+ // Inventory Equip Effects
+ gSPSegment(OVERLAY_DISP++, 0x08, pauseCtx->iconItemSegment);
+ 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);
+
+ pauseCtx->cursorVtx[16].v.ob[0] = pauseCtx->cursorVtx[18].v.ob[0] = pauseCtx->equipAnimX / 10;
+ pauseCtx->cursorVtx[17].v.ob[0] = pauseCtx->cursorVtx[19].v.ob[0] =
+ pauseCtx->cursorVtx[16].v.ob[0] + (pauseCtx->equipAnimScale / 10);
+ pauseCtx->cursorVtx[16].v.ob[1] = pauseCtx->cursorVtx[17].v.ob[1] = pauseCtx->equipAnimY / 10;
+ pauseCtx->cursorVtx[18].v.ob[1] = pauseCtx->cursorVtx[19].v.ob[1] =
+ pauseCtx->cursorVtx[16].v.ob[1] - (pauseCtx->equipAnimScale / 10);
+
+ if (pauseCtx->equipTargetItem < 0xB5) {
+ // Normal Equip (icon goes from the inventory slot to the C button when equipping it)
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, pauseCtx->equipAnimAlpha);
+ gSPVertex(OVERLAY_DISP++, &pauseCtx->cursorVtx[16], 4, 0);
+ gDPLoadTextureBlock(OVERLAY_DISP++, gItemIcons[pauseCtx->equipTargetItem], 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);
+ } else {
+ // Magic Arrow Equip Effect
+ temp = pauseCtx->equipTargetItem - 0xB5;
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, sMagicArrowEffectsR[temp], sMagicArrowEffectsG[temp],
+ sMagicArrowEffectsB[temp], pauseCtx->equipAnimAlpha);
+
+ if ((pauseCtx->equipAnimAlpha > 0) && (pauseCtx->equipAnimAlpha < 255)) {
+ temp = (pauseCtx->equipAnimAlpha / 8) / 2;
+ pauseCtx->cursorVtx[16].v.ob[0] = pauseCtx->cursorVtx[18].v.ob[0] =
+ pauseCtx->cursorVtx[16].v.ob[0] - temp;
+ pauseCtx->cursorVtx[17].v.ob[0] = pauseCtx->cursorVtx[19].v.ob[0] =
+ pauseCtx->cursorVtx[16].v.ob[0] + temp * 2 + 32;
+ pauseCtx->cursorVtx[16].v.ob[1] = pauseCtx->cursorVtx[17].v.ob[1] =
+ pauseCtx->cursorVtx[16].v.ob[1] + temp;
+ pauseCtx->cursorVtx[18].v.ob[1] = pauseCtx->cursorVtx[19].v.ob[1] =
+ pauseCtx->cursorVtx[16].v.ob[1] - temp * 2 - 32;
+ }
+
+ gSPVertex(OVERLAY_DISP++, &pauseCtx->cursorVtx[16], 4, 0);
+ gDPLoadTextureBlock(OVERLAY_DISP++, gMagicArrowEquipEffectTex, G_IM_FMT_IA, G_IM_SIZ_8b, 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(OVERLAY_DISP++, 0, 2, 3, 1, 0);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
/**
* 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),
@@ -3213,31 +4353,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;
@@ -3249,527 +4388,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 == 3)) {
- 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 == MSGMODE_NONE) || ((play->actorCtx.flags & ACTORCTX_FLAG_1) && !Play_InCsMode(play)) ||
+ (msgCtx->msgMode == MSGMODE_NONE) || ((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;
@@ -4278,7 +5382,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,
@@ -4324,11 +5428,11 @@ void Interface_DrawPerfectLetters(PlayState* play) {
void Interface_StartMoonCrash(PlayState* play) {
if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
- Audio_QueueSeqCmd(0xE0000100);
+ SEQCMD_DISABLE_PLAY_SEQUENCES(false);
}
gSaveContext.save.day = 4;
- gSaveContext.save.daysElapsed = 4;
+ gSaveContext.save.eventDayCount = 4;
gSaveContext.save.time = CLOCK_TIME(6, 0) + 10;
play->nextEntrance = ENTRANCE(TERMINA_FIELD, 12);
gSaveContext.nextCutsceneIndex = 0;
@@ -4336,31 +5440,31 @@ void Interface_StartMoonCrash(PlayState* play) {
play->transitionType = TRANS_TYPE_FADE_WHITE;
}
-void Interface_GetTimerDigits(u64 timer, s16* timerArr) {
- u64 time = timer;
+void Interface_GetTimerDigits(OSTime time, s16* timerArr) {
+ OSTime t = time;
// 6 minutes
- timerArr[0] = time / SECONDS_TO_TIMER(360);
- time -= timerArr[0] * SECONDS_TO_TIMER(360);
+ timerArr[0] = t / SECONDS_TO_TIMER(360);
+ t -= timerArr[0] * SECONDS_TO_TIMER(360);
// minutes
- timerArr[1] = time / SECONDS_TO_TIMER(60);
- time -= timerArr[1] * SECONDS_TO_TIMER(60);
+ timerArr[1] = t / SECONDS_TO_TIMER(60);
+ t -= timerArr[1] * SECONDS_TO_TIMER(60);
// 10 seconds
- timerArr[3] = time / SECONDS_TO_TIMER(10);
- time -= timerArr[3] * SECONDS_TO_TIMER(10);
+ timerArr[3] = t / SECONDS_TO_TIMER(10);
+ t -= timerArr[3] * SECONDS_TO_TIMER(10);
// seconds
- timerArr[4] = time / SECONDS_TO_TIMER(1);
- time -= timerArr[4] * SECONDS_TO_TIMER(1);
+ timerArr[4] = t / SECONDS_TO_TIMER(1);
+ t -= timerArr[4] * SECONDS_TO_TIMER(1);
// 100 milliseconds
- timerArr[6] = time / SECONDS_TO_TIMER_PRECISE(0, 10);
- time -= timerArr[6] * SECONDS_TO_TIMER_PRECISE(0, 10);
+ timerArr[6] = t / SECONDS_TO_TIMER_PRECISE(0, 10);
+ t -= timerArr[6] * SECONDS_TO_TIMER_PRECISE(0, 10);
// 10 milliseconds
- timerArr[7] = time;
+ timerArr[7] = t;
}
#define IS_POSTMAN_TIMER_DRAWN \
@@ -4396,8 +5500,8 @@ void Interface_DrawTimers(PlayState* play) {
// Not satisfying any of these conditions will pause the timer
if ((play->pauseCtx.state == PAUSE_STATE_OFF) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE) &&
(play->gameOverCtx.state == GAMEOVER_INACTIVE) &&
- ((msgCtx->msgMode == 0) ||
- ((msgCtx->msgMode != 0) && (msgCtx->currentTextId >= 0x1BB2) && (msgCtx->currentTextId <= 0x1BB6))) &&
+ ((msgCtx->msgMode == MSGMODE_NONE) || ((msgCtx->msgMode != MSGMODE_NONE) && (msgCtx->currentTextId >= 0x1BB2) &&
+ (msgCtx->currentTextId <= 0x1BB6))) &&
!(player->stateFlags1 & PLAYER_STATE1_200) && (play->transitionTrigger == TRANS_TRIGGER_OFF) &&
(play->transitionMode == TRANS_MODE_OFF) && !Play_InCsMode(play)) {
@@ -4433,7 +5537,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:
@@ -4442,7 +5546,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:
@@ -4464,7 +5568,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;
@@ -4508,7 +5612,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;
@@ -4522,7 +5626,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;
@@ -4562,7 +5666,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;
@@ -4670,8 +5775,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;
}
@@ -4681,16 +5786,16 @@ void Interface_DrawTimers(PlayState* play) {
// Use seconds to determine when to beep
if (gSaveContext.timerCurTimes[sTimerId] > SECONDS_TO_TIMER(60)) {
if ((sTimerBeepSfxSeconds != sTimerDigits[4]) && (sTimerDigits[4] == 1)) {
- play_sound(NA_SE_SY_MESSAGE_WOMAN);
+ Audio_PlaySfx(NA_SE_SY_MESSAGE_WOMAN);
sTimerBeepSfxSeconds = sTimerDigits[4];
}
} else if (gSaveContext.timerCurTimes[sTimerId] > SECONDS_TO_TIMER(10)) {
if ((sTimerBeepSfxSeconds != sTimerDigits[4]) && ((sTimerDigits[4] % 2) != 0)) {
- play_sound(NA_SE_SY_WARNING_COUNT_N);
+ Audio_PlaySfx(NA_SE_SY_WARNING_COUNT_N);
sTimerBeepSfxSeconds = sTimerDigits[4];
}
} else if (sTimerBeepSfxSeconds != sTimerDigits[4]) {
- play_sound(NA_SE_SY_WARNING_COUNT_E);
+ Audio_PlaySfx(NA_SE_SY_WARNING_COUNT_E);
sTimerBeepSfxSeconds = sTimerDigits[4];
}
} else { // TIMER_COUNT_UP
@@ -4734,14 +5839,15 @@ void Interface_DrawTimers(PlayState* play) {
(gSaveContext.save.entrance == ENTRANCE(ROMANI_RANCH, 0))) {
if ((gSaveContext.timerCurTimes[sTimerId] > SECONDS_TO_TIMER(110)) &&
(sTimerBeepSfxSeconds != sTimerDigits[4])) {
- play_sound(NA_SE_SY_WARNING_COUNT_E);
+ Audio_PlaySfx(NA_SE_SY_WARNING_COUNT_E);
sTimerBeepSfxSeconds = sTimerDigits[4];
}
} 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);
+ Audio_PlaySfx(NA_SE_SY_WARNING_COUNT_E);
sTimerBeepSfxSeconds = sTimerDigits[4];
}
}
@@ -4777,10 +5883,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 {
@@ -4844,7 +5950,7 @@ void Interface_UpdateBottleTimers(PlayState* play) {
// Not satisfying any of these conditions will pause the bottle timer
if ((play->pauseCtx.state == PAUSE_STATE_OFF) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE) &&
(play->gameOverCtx.state == GAMEOVER_INACTIVE) &&
- ((msgCtx->msgMode == 0) || ((msgCtx->currentTextId >= 0x100) && (msgCtx->currentTextId <= 0x200)) ||
+ ((msgCtx->msgMode == MSGMODE_NONE) || ((msgCtx->currentTextId >= 0x100) && (msgCtx->currentTextId <= 0x200)) ||
((msgCtx->currentTextId >= 0x1BB2) && (msgCtx->currentTextId <= 0x1BB6))) &&
(play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF) &&
!Play_InCsMode(play)) {
@@ -4888,7 +5994,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);
}
@@ -4913,7 +6019,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
@@ -4947,7 +6053,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
@@ -4991,7 +6097,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
@@ -5083,12 +6189,12 @@ void Interface_Draw(PlayState* play) {
if (pauseCtx->debugEditor == DEBUG_EDITOR_NONE) {
Interface_SetVertices(play);
- func_801170B8(interfaceCtx);
+ Interface_SetOrthoView(interfaceCtx);
// 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);
@@ -5096,8 +6202,9 @@ void Interface_Draw(PlayState* play) {
// Load in Grandma's Story
gSPLoadUcodeL(OVERLAY_DISP++, gspS2DEX2_fifo);
gfx = OVERLAY_DISP;
- func_80172758(&gfx, sStoryTextures[interfaceCtx->storyType], sStoryTLUTs[interfaceCtx->storyType],
- SCREEN_WIDTH, SCREEN_HEIGHT, 2, 1, 0x8000, 0x100, 0.0f, 0.0f, 1.0f, 1.0f, 0);
+ Prerender_DrawBackground2D(&gfx, sStoryTextures[interfaceCtx->storyType],
+ sStoryTLUTs[interfaceCtx->storyType], SCREEN_WIDTH, SCREEN_HEIGHT, 2, 1, 0x8000,
+ 0x100, 0.0f, 0.0f, 1.0f, 1.0f, 0);
OVERLAY_DISP = gfx;
gSPLoadUcode(OVERLAY_DISP++, SysUcode_GetUCode(), SysUcode_GetUCodeData());
@@ -5112,7 +6219,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,
@@ -5245,7 +6352,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;
@@ -5278,9 +6385,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);
@@ -5294,21 +6401,21 @@ void Interface_Draw(PlayState* play) {
Minimap_Draw(play);
if ((R_PAUSE_BG_PRERENDER_STATE != 2) && (R_PAUSE_BG_PRERENDER_STATE != 3)) {
- Actor_DrawZTarget(&play->actorCtx.targetContext, play);
+ Target_Draw(&play->actorCtx.targetCtx, play);
}
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
- func_80117100(play);
+ Interface_DrawItemButtons(play);
- if (player->transformation == ((void)0, gSaveContext.save.playerForm)) {
- func_80118084(play);
+ if (player->transformation == GET_PLAYER_FORM) {
+ Interface_DrawBButtonIcons(play);
}
- func_80118890(play);
+ Interface_DrawCButtonIcons(play);
- func_80118BA4(play);
+ Interface_DrawAButton(play);
- func_80119030(play);
+ Interface_DrawPauseMenuEquippingIcons(play);
// Draw either the minigame countdown or the three-day clock
if ((play->pauseCtx.state == PAUSE_STATE_OFF) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE)) {
@@ -5329,7 +6436,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);
@@ -5364,7 +6471,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);
@@ -5407,7 +6514,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;
@@ -5432,7 +6539,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);
@@ -5443,7 +6550,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);
@@ -5515,7 +6622,7 @@ void Interface_Update(PlayState* play) {
// Update buttons
if ((play->pauseCtx.state == PAUSE_STATE_OFF) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE)) {
if (play->gameOverCtx.state == GAMEOVER_INACTIVE) {
- func_80111CB4(play);
+ Interface_UpdateButtonsPart1(play);
}
}
@@ -5524,7 +6631,7 @@ void Interface_Update(PlayState* play) {
case HUD_VISIBILITY_NONE:
case HUD_VISIBILITY_NONE_ALT:
case HUD_VISIBILITY_B:
- dimmingAlpha = 255 - (gSaveContext.hudVisibilityTimer << 5);
+ dimmingAlpha = 255 - (gSaveContext.hudVisibilityTimer * 32);
if (dimmingAlpha < 0) {
dimmingAlpha = 0;
}
@@ -5555,7 +6662,7 @@ void Interface_Update(PlayState* play) {
case HUD_VISIBILITY_B_MAGIC:
case HUD_VISIBILITY_A_B:
case HUD_VISIBILITY_A_B_HEARTS_MAGIC_MINIMAP:
- dimmingAlpha = 255 - (gSaveContext.hudVisibilityTimer << 5);
+ dimmingAlpha = 255 - (gSaveContext.hudVisibilityTimer * 32);
if (dimmingAlpha < 0) {
dimmingAlpha = 0;
}
@@ -5568,7 +6675,7 @@ void Interface_Update(PlayState* play) {
break;
case HUD_VISIBILITY_ALL:
- dimmingAlpha = 255 - (gSaveContext.hudVisibilityTimer << 5);
+ dimmingAlpha = 255 - (gSaveContext.hudVisibilityTimer * 32);
if (dimmingAlpha < 0) {
dimmingAlpha = 0;
}
@@ -5631,14 +6738,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) {
- play_sound(NA_SE_SY_HP_RECOVER);
+ if ((gSaveContext.save.saveInfo.playerData.health & 0xF) < 4) {
+ Audio_PlaySfx(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;
}
}
@@ -5663,27 +6771,27 @@ 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++;
- play_sound(NA_SE_SY_RUPY_COUNT);
+ gSaveContext.save.saveInfo.playerData.rupees++;
+ Audio_PlaySfx(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);
+ Audio_PlaySfx(NA_SE_SY_RUPY_COUNT);
} else {
gSaveContext.rupeeAccumulator++;
- gSaveContext.save.playerData.rupees--;
- play_sound(NA_SE_SY_RUPY_COUNT);
+ gSaveContext.save.saveInfo.playerData.rupees--;
+ Audio_PlaySfx(NA_SE_SY_RUPY_COUNT);
}
} else {
gSaveContext.rupeeAccumulator = 0;
@@ -5716,9 +6824,9 @@ void Interface_Update(PlayState* play) {
interfaceCtx->minigameState++;
if (interfaceCtx->minigameState == MINIGAME_STATE_COUNTDOWN_GO) {
interfaceCtx->minigameCountdownScale = 160;
- play_sound(NA_SE_SY_START_SHOT);
+ Audio_PlaySfx(NA_SE_SY_START_SHOT);
} else {
- play_sound(NA_SE_SY_WARNING_COUNT_E);
+ Audio_PlaySfx(NA_SE_SY_WARNING_COUNT_E);
}
break;
@@ -5762,7 +6870,7 @@ void Interface_Update(PlayState* play) {
interfaceCtx->aButtonRoll = -15700.0f;
interfaceCtx->aButtonState = A_BTN_STATE_2;
- if ((msgCtx->msgMode != 0) && (msgCtx->unk12006 == 0x26)) {
+ if ((msgCtx->msgMode != MSGMODE_NONE) && (msgCtx->textboxYTarget == 38)) {
R_A_BTN_Y_OFFSET = -14;
} else {
R_A_BTN_Y_OFFSET = 0;
@@ -5815,31 +6923,33 @@ 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;
+ BUTTON_ITEM_EQUIP(PLAYER_FORM_DEKU, EQUIP_SLOT_B) = ITEM_DEKU_NUT;
}
Magic_Update(play);
@@ -5851,7 +6961,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;
@@ -5908,8 +7018,9 @@ void Interface_Update(PlayState* play) {
// Update Sun Song
if (gSaveContext.sunsSongState != SUNSSONG_INACTIVE) {
// exit out of ocarina mode after suns song finishes playing
- if ((msgCtx->ocarinaAction != 0x39) && (gSaveContext.sunsSongState == SUNSSONG_START)) {
- play->msgCtx.ocarinaMode = 4;
+ if ((msgCtx->ocarinaAction != OCARINA_ACTION_CHECK_NOTIME_DONE) &&
+ (gSaveContext.sunsSongState == SUNSSONG_START)) {
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
}
// handle suns song in areas where time moves
@@ -5929,7 +7040,7 @@ void Interface_Update(PlayState* play) {
// Daytime has been reached. End suns song effect
gSaveContext.sunsSongState = SUNSSONG_INACTIVE;
R_TIME_SPEED = sPrevTimeSpeed;
- play->msgCtx.ocarinaMode = 4;
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
}
} else {
// Daytime
@@ -5937,7 +7048,7 @@ void Interface_Update(PlayState* play) {
// Nighttime has been reached. End suns song effect
gSaveContext.sunsSongState = SUNSSONG_INACTIVE;
R_TIME_SPEED = sPrevTimeSpeed;
- play->msgCtx.ocarinaMode = 4;
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
}
}
} else {
@@ -5984,7 +7095,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) {
@@ -6005,16 +7116,16 @@ void Interface_Init(PlayState* play) {
interfaceCtx->healthTimer = 200;
parameterStaticSize = SEGMENT_ROM_SIZE(parameter_static);
- interfaceCtx->parameterSegment = THA_AllocEndAlign16(&play->state.heap, parameterStaticSize);
+ interfaceCtx->parameterSegment = THA_AllocTailAlign16(&play->state.tha, parameterStaticSize);
DmaMgr_SendRequest0(interfaceCtx->parameterSegment, SEGMENT_ROM_START(parameter_static), parameterStaticSize);
- interfaceCtx->doActionSegment = THA_AllocEndAlign16(&play->state.heap, 0xC90);
+ interfaceCtx->doActionSegment = THA_AllocTailAlign16(&play->state.tha, 0xC90);
DmaMgr_SendRequest0(interfaceCtx->doActionSegment, SEGMENT_ROM_START(do_action_static), 0x300);
DmaMgr_SendRequest0(interfaceCtx->doActionSegment + 0x300, SEGMENT_ROM_START(do_action_static) + 0x480, 0x180);
Interface_NewDay(play, CURRENT_DAY);
- interfaceCtx->iconItemSegment = THA_AllocEndAlign16(&play->state.heap, 0x4000);
+ interfaceCtx->iconItemSegment = THA_AllocTailAlign16(&play->state.tha, 0x4000);
if (CUR_FORM_EQUIP(EQUIP_SLOT_B) < ITEM_F0) {
Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
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_pause.c b/src/code/z_pause.c
index bb5b33cf2..b16cc62c1 100644
--- a/src/code/z_pause.c
+++ b/src/code/z_pause.c
@@ -18,7 +18,11 @@
*
* Note2: Controllers 2-4's inputs are normally zeroed out, so this would also need to be fixed to use frame advance
*/
-#include "global.h"
+
+#include "z64frameadvance.h"
+#include "libc/stdbool.h"
+#include "padutils.h"
+#include "macros.h"
void FrameAdvance_Init(FrameAdvanceContext* frameAdvCtx) {
frameAdvCtx->timer = 0;
diff --git a/src/code/z_play.c b/src/code/z_play.c
index b33b449d2..5d9b2c048 100644
--- a/src/code/z_play.c
+++ b/src/code/z_play.c
@@ -1,22 +1,15 @@
-#include "global.h"
-#include "z64quake.h"
-#include "z64rumble.h"
-#include "z64shrink_window.h"
-#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/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
-
-s32 gDbgCamEnabled = false;
-u8 D_801D0D54 = false;
+#include "prevent_bss_reordering.h"
+#include "z64.h"
+#include "regs.h"
+#include "functions.h"
+#include "z64vismono.h"
+// Variables are put before most headers as a hacky way to bypass bss reordering
s16 sTransitionFillTimer;
Input D_801F6C18;
-FbDemoStruct sTrnsnUnk;
-u16* D_801F6D0C;
-s32 gTrnsnUnkState;
-VisMono sVisMono;
+TransitionTile sTransitionTile;
+s32 gTransitionTileState;
+VisMono sPlayVisMono;
Color_RGBA8_u32 gVisMonoColor;
Struct_80140E80 D_801F6D38;
Struct_80140E80* D_801F6D4C;
@@ -24,6 +17,27 @@ BombersNotebook sBombersNotebook;
u8 sBombersNotebookOpen;
u8 sMotionBlurStatus;
+#include "variables.h"
+#include "macros.h"
+#include "buffers.h"
+#include "idle.h"
+#include "sys_cfb.h"
+#include "z64bombers_notebook.h"
+#include "z64debug_display.h"
+#include "z64quake.h"
+#include "z64rumble.h"
+#include "z64shrink_window.h"
+#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_select.h"
+#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
+#include "debug.h"
+
+s32 gDbgCamEnabled = false;
+u8 D_801D0D54 = false;
+
typedef enum {
/* 0 */ MOTION_BLUR_OFF,
/* 1 */ MOTION_BLUR_SETUP,
@@ -70,7 +84,7 @@ void Play_DrawMotionBlur(PlayState* this) {
sMotionBlurStatus = MOTION_BLUR_PROCESS;
}
- func_801705B4(&this->pauseBgPreRender, &gfx);
+ PreRender_SaveFramebuffer(&this->pauseBgPreRender, &gfx);
gSPEndDisplayList(gfx++);
@@ -323,11 +337,11 @@ void Play_SetupTransition(PlayState* this, s32 transitionType) {
default:
fbdemoType = -1;
- __assert("../z_play.c", 1420);
+ _dbg_hungup("../z_play.c", 1420);
}
} else {
fbdemoType = -1;
- __assert("../z_play.c", 1423);
+ _dbg_hungup("../z_play.c", 1423);
}
transitionCtx->transitionType = transitionType;
@@ -347,8 +361,8 @@ void Play_ClearTransition(PlayState* this) {
Gfx* Play_SetFog(PlayState* this, Gfx* gfx) {
s32 fogFar = this->lightCtx.zFar * (5.0f / 64.0f);
- return Gfx_SetFogWithSync(gfx, this->lightCtx.fogColor.r, this->lightCtx.fogColor.g, this->lightCtx.fogColor.b, 0,
- this->lightCtx.fogNear, ((fogFar <= 1000) ? 1000 : fogFar));
+ return Gfx_SetFogWithSync(gfx, this->lightCtx.fogColor[0], this->lightCtx.fogColor[1], this->lightCtx.fogColor[2],
+ 0, this->lightCtx.fogNear, ((fogFar <= 1000) ? 1000 : fogFar));
}
void Play_Destroy(GameState* thisx) {
@@ -357,10 +371,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;
@@ -389,9 +403,9 @@ void Play_Destroy(GameState* thisx) {
EffectSS_Clear(this);
CollisionCheck_DestroyContext(this, &this->colChkCtx);
- if (gTrnsnUnkState == 3) {
- TransitionUnk_Destroy(&sTrnsnUnk);
- gTrnsnUnkState = 0;
+ if (gTransitionTileState == TRANS_TILE_READY) {
+ TransitionTile_Destroy(&sTransitionTile);
+ gTransitionTileState = TRANS_TILE_OFF;
}
if ((this->transitionMode == TRANS_MODE_INSTANCE_RUNNING) || D_801D0D54) {
@@ -402,7 +416,7 @@ void Play_Destroy(GameState* thisx) {
ShrinkWindow_Destroy();
TransitionFade_Destroy(&this->unk_18E48);
- VisMono_Destroy(&sVisMono);
+ VisMono_Destroy(&sPlayVisMono);
func_80140EA0(D_801F6D4C);
D_801F6D4C = NULL;
@@ -504,43 +518,43 @@ 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);
+ Environment_EnableUnderwaterLights(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);
+ Environment_DisableUnderwaterLights(this);
func_801A3EC0(0);
}
}
@@ -565,26 +579,28 @@ 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))) &&
- (!func_800FE590(this) || (Entrance_GetSceneId(this->nextEntrance + sceneLayer) < 0) ||
- (Audio_GetActiveSequence(SEQ_PLAYER_BGM_MAIN) != NA_BGM_FINAL_HOURS))) {
+ !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))) &&
+ (!Environment_IsFinalHours(this) || (Entrance_GetSceneId(this->nextEntrance + sceneLayer) < 0) ||
+ (AudioSeq_GetActiveSeqId(SEQ_PLAYER_BGM_MAIN) != NA_BGM_FINAL_HOURS))) {
func_801A4058(20);
gSaveContext.seqId = (u8)NA_BGM_DISABLED;
gSaveContext.ambienceId = AMBIENCE_ID_DISABLED;
}
- if (func_800FD768()) {
+ if (Environment_IsForcedSequenceDisabled()) {
func_801A4058(20);
gSaveContext.seqId = (u8)NA_BGM_DISABLED;
gSaveContext.ambienceId = AMBIENCE_ID_DISABLED;
}
- if (func_800FE590(this) && (Entrance_GetSceneId(this->nextEntrance + sceneLayer) >= 0) &&
- (Audio_GetActiveSequence(SEQ_PLAYER_BGM_MAIN) == NA_BGM_FINAL_HOURS)) {
+ if (Environment_IsFinalHours(this) && (Entrance_GetSceneId(this->nextEntrance + sceneLayer) >= 0) &&
+ (AudioSeq_GetActiveSeqId(SEQ_PLAYER_BGM_MAIN) == NA_BGM_FINAL_HOURS)) {
func_801A41C8(20);
}
}
@@ -669,7 +685,8 @@ void Play_UpdateTransition(PlayState* this) {
}
this->transitionCtx.setType(&this->transitionCtx.instanceData,
- (this->transitionTrigger == TRANS_TRIGGER_END) ? 1 : 2);
+ (this->transitionTrigger == TRANS_TRIGGER_END) ? TRANS_INSTANCE_TYPE_FILL_OUT
+ : TRANS_INSTANCE_TYPE_FILL_IN);
this->transitionCtx.start(&this->transitionCtx.instanceData);
if (this->transitionCtx.transitionType == TRANS_TYPE_FADE_WHITE_CS_DELAYED) {
@@ -687,10 +704,10 @@ void Play_UpdateTransition(PlayState* this) {
D_801D0D54 = false;
}
- if (gSaveContext.gameMode == 4) {
+ if (gSaveContext.gameMode == GAMEMODE_OWL_SAVE) {
STOP_GAMESTATE(&this->state);
SET_NEXT_GAMESTATE(&this->state, TitleSetup_Init, sizeof(TitleSetupState));
- } else if (gSaveContext.gameMode != 2) {
+ } else if (gSaveContext.gameMode != GAMEMODE_FILE_SELECT) {
STOP_GAMESTATE(&this->state);
SET_NEXT_GAMESTATE(&this->state, Play_Init, sizeof(PlayState));
gSaveContext.save.entrance = this->nextEntrance;
@@ -698,7 +715,7 @@ void Play_UpdateTransition(PlayState* this) {
if (gSaveContext.minigameStatus == MINIGAME_STATUS_ACTIVE) {
gSaveContext.minigameStatus = MINIGAME_STATUS_END;
}
- } else { // 2
+ } else { // GAMEMODE_FILE_SELECT
STOP_GAMESTATE(&this->state);
SET_NEXT_GAMESTATE(&this->state, FileSelect_Init, sizeof(FileSelectState));
}
@@ -710,10 +727,10 @@ void Play_UpdateTransition(PlayState* this) {
Play_ClearTransition(this);
}
this->transitionMode = TRANS_MODE_OFF;
- if (gTrnsnUnkState == 3) {
- TransitionUnk_Destroy(&sTrnsnUnk);
- gTrnsnUnkState = 0;
- Game_SetFramerateDivisor(&this->state, 3);
+ if (gTransitionTileState == TRANS_TILE_READY) {
+ TransitionTile_Destroy(&sTransitionTile);
+ gTransitionTileState = TRANS_TILE_OFF;
+ GameState_SetFramerateDivisor(&this->state, 3);
}
}
this->transitionTrigger = TRANS_TRIGGER_OFF;
@@ -759,8 +776,8 @@ void Play_UpdateTransition(PlayState* this) {
this->envCtx.screenFillColor[3] = (1.0f - (sTransitionFillTimer / 20.0f)) * 255.0f;
if (sTransitionFillTimer >= 20) {
- gTrnsnUnkState = 0;
- Game_SetFramerateDivisor(&this->state, 3);
+ gTransitionTileState = TRANS_TILE_OFF;
+ GameState_SetFramerateDivisor(&this->state, 3);
this->transitionTrigger = TRANS_TRIGGER_OFF;
this->transitionMode = TRANS_MODE_OFF;
this->envCtx.fillScreen = false;
@@ -793,8 +810,8 @@ void Play_UpdateTransition(PlayState* this) {
this->transitionTrigger = TRANS_TRIGGER_OFF;
this->transitionMode = TRANS_MODE_OFF;
} else {
- gTrnsnUnkState = 0;
- Game_SetFramerateDivisor(&this->state, 3);
+ gTransitionTileState = TRANS_TILE_OFF;
+ GameState_SetFramerateDivisor(&this->state, 3);
this->transitionTrigger = TRANS_TRIGGER_OFF;
this->transitionMode = TRANS_MODE_OFF;
}
@@ -808,10 +825,10 @@ void Play_UpdateTransition(PlayState* this) {
case TRANS_MODE_SANDSTORM_INIT:
if (this->transitionTrigger != TRANS_TRIGGER_END) {
- this->envCtx.sandstormState = 1;
+ this->envCtx.sandstormState = SANDSTORM_FILL;
this->transitionMode = TRANS_MODE_SANDSTORM;
} else {
- this->envCtx.sandstormState = 2;
+ this->envCtx.sandstormState = SANDSTORM_UNFILL;
this->envCtx.sandstormPrimA = 255;
this->envCtx.sandstormEnvA = 255;
this->transitionMode = TRANS_MODE_SANDSTORM;
@@ -819,11 +836,11 @@ void Play_UpdateTransition(PlayState* this) {
break;
case TRANS_MODE_SANDSTORM:
- func_8019F128(NA_SE_EV_SAND_STORM - SFX_FLAG);
+ Audio_PlaySfx_2(NA_SE_EV_SAND_STORM - SFX_FLAG);
if (this->transitionTrigger == TRANS_TRIGGER_END) {
if (this->envCtx.sandstormPrimA < 110) {
- gTrnsnUnkState = 0;
- Game_SetFramerateDivisor(&this->state, 3);
+ gTransitionTileState = TRANS_TILE_OFF;
+ GameState_SetFramerateDivisor(&this->state, 3);
this->transitionTrigger = TRANS_TRIGGER_OFF;
this->transitionMode = TRANS_MODE_OFF;
}
@@ -840,7 +857,7 @@ void Play_UpdateTransition(PlayState* this) {
case TRANS_MODE_SANDSTORM_END_INIT:
if (this->transitionTrigger == TRANS_TRIGGER_END) {
- this->envCtx.sandstormState = 4;
+ this->envCtx.sandstormState = SANDSTORM_DISSIPATE;
this->envCtx.sandstormPrimA = 255;
this->envCtx.sandstormEnvA = 255;
@@ -854,12 +871,12 @@ void Play_UpdateTransition(PlayState* this) {
break;
case TRANS_MODE_SANDSTORM_END:
- func_8019F128(NA_SE_EV_SAND_STORM - SFX_FLAG);
+ Audio_PlaySfx_2(NA_SE_EV_SAND_STORM - SFX_FLAG);
if (this->transitionTrigger == TRANS_TRIGGER_END) {
if (this->envCtx.sandstormPrimA <= 0) {
- gTrnsnUnkState = 0;
- Game_SetFramerateDivisor(&this->state, 3);
+ gTransitionTileState = TRANS_TILE_OFF;
+ GameState_SetFramerateDivisor(&this->state, 3);
this->transitionTrigger = TRANS_TRIGGER_OFF;
this->transitionMode = TRANS_MODE_OFF;
}
@@ -881,8 +898,8 @@ void Play_UpdateTransition(PlayState* this) {
this->envCtx.screenFillColor[3] = gSaveContext.cutsceneTransitionControl;
if (gSaveContext.cutsceneTransitionControl <= 100) {
- gTrnsnUnkState = 0;
- Game_SetFramerateDivisor(&this->state, 3);
+ gTransitionTileState = TRANS_TILE_OFF;
+ GameState_SetFramerateDivisor(&this->state, 3);
this->transitionTrigger = TRANS_TRIGGER_OFF;
this->transitionMode = TRANS_MODE_OFF;
}
@@ -905,8 +922,8 @@ void Play_UpdateMain(PlayState* this) {
u8 freezeFlashTimer;
s32 sp5C = false;
- gSegments[4] = VIRTUAL_TO_PHYSICAL(this->objectCtx.status[this->objectCtx.mainKeepIndex].segment);
- gSegments[5] = VIRTUAL_TO_PHYSICAL(this->objectCtx.status[this->objectCtx.subKeepIndex].segment);
+ gSegments[4] = VIRTUAL_TO_PHYSICAL(this->objectCtx.slots[this->objectCtx.mainKeepSlot].segment);
+ gSegments[5] = VIRTUAL_TO_PHYSICAL(this->objectCtx.slots[this->objectCtx.subKeepSlot].segment);
gSegments[2] = VIRTUAL_TO_PHYSICAL(this->sceneSegment);
if (R_PICTO_PHOTO_STATE == PICTO_PHOTO_STATE_PROCESS) {
@@ -922,29 +939,32 @@ void Play_UpdateMain(PlayState* this) {
this->transitionMode = TRANS_MODE_SETUP;
}
- if (gTrnsnUnkState != 0) {
- switch (gTrnsnUnkState) {
- case 2:
- if (TransitionUnk_Init(&sTrnsnUnk, 10, 7) == NULL) {
- gTrnsnUnkState = 0;
+ if (gTransitionTileState != TRANS_TILE_OFF) {
+ switch (gTransitionTileState) {
+ case TRANS_TILE_PROCESS:
+ if (TransitionTile_Init(&sTransitionTile, 10, 7) == NULL) {
+ gTransitionTileState = TRANS_TILE_OFF;
} else {
- D_801F6D0C = gZBufferPtr;
- gTrnsnUnkState = 3;
- Game_SetFramerateDivisor(&this->state, 1);
+ sTransitionTile.zBuffer = gZBufferPtr;
+ gTransitionTileState = TRANS_TILE_READY;
+ GameState_SetFramerateDivisor(&this->state, 1);
}
break;
- case 3:
- func_801647AC(&sTrnsnUnk);
+ case TRANS_TILE_READY:
+ TransitionTile_Update(&sTransitionTile);
+ break;
+
+ default:
break;
}
}
Play_UpdateTransition(this);
- if (gTrnsnUnkState != 3) {
- if ((gSaveContext.gameMode == 0) &&
- (((this->msgCtx.msgMode == 0)) ||
- ((this->msgCtx.currentTextId == 0xFF) && (this->msgCtx.msgMode == 0x42) &&
- (this->msgCtx.unk12020 == 0x41)) ||
+ if (gTransitionTileState != TRANS_TILE_READY) {
+ if ((gSaveContext.gameMode == GAMEMODE_NORMAL) &&
+ (((this->msgCtx.msgMode == MSGMODE_NONE)) ||
+ ((this->msgCtx.currentTextId == 0xFF) && (this->msgCtx.msgMode == MSGMODE_TEXT_DONE) &&
+ (this->msgCtx.textboxEndType == TEXTBOX_ENDTYPE_41)) ||
((this->msgCtx.currentTextId >= 0x100) && (this->msgCtx.currentTextId <= 0x200))) &&
(this->gameOverCtx.state == GAMEOVER_INACTIVE)) {
KaleidoSetup_Update(this);
@@ -953,7 +973,7 @@ void Play_UpdateMain(PlayState* this) {
sp5C = (this->pauseCtx.state != 0) || (this->pauseCtx.debugEditor != DEBUG_EDITOR_NONE);
AnimationContext_Reset(&this->animationCtx);
- Object_UpdateBank(&this->objectCtx);
+ Object_UpdateEntries(&this->objectCtx);
if (!sp5C && (IREG(72) == 0)) {
this->gameplayFrames++;
@@ -977,8 +997,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);
@@ -987,9 +1007,9 @@ void Play_UpdateMain(PlayState* this) {
Rumble_SetUpdateEnabled(false);
}
- Room_nop8012D510(this, &this->roomCtx.curRoom, &input[1], 0);
- Room_nop8012D510(this, &this->roomCtx.prevRoom, &input[1], 1);
- SkyboxDraw_Update(&this->skyboxCtx);
+ Room_Noop(this, &this->roomCtx.curRoom, &input[1], 0);
+ Room_Noop(this, &this->roomCtx.prevRoom, &input[1], 1);
+ Skybox_Update(&this->skyboxCtx);
if ((this->pauseCtx.state != 0) || (this->pauseCtx.debugEditor != DEBUG_EDITOR_NONE)) {
KaleidoScopeCall_Update(this);
@@ -1029,9 +1049,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);
}
}
}
@@ -1044,19 +1064,19 @@ 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.msgMode = MSGMODE_NONE;
this->msgCtx.currentTextId = 0;
this->msgCtx.stateTimer = 0;
- play_sound(NA_SE_SY_CANCEL);
+ Audio_PlaySfx(NA_SE_SY_CANCEL);
}
if (sBombersNotebookOpen) {
BombersNotebook_Update(this, &sBombersNotebook, this->state.input);
@@ -1071,7 +1091,7 @@ void Play_PostWorldDraw(PlayState* this) {
KaleidoScopeCall_Draw(this);
}
- if (gSaveContext.gameMode == 0) {
+ if (gSaveContext.gameMode == GAMEMODE_NORMAL) {
Interface_Draw(this);
}
@@ -1109,7 +1129,7 @@ void Play_PostWorldDraw(PlayState* this) {
}
#ifdef NON_MATCHING
-// Stack issues and 1 small issue around Play_PostWorldDraw
+// Something weird going on with the stack of the unused arg0 of `Camera_Update`
void Play_DrawMain(PlayState* this) {
GraphicsContext* gfxCtx = this->state.gfxCtx;
Lights* sp268;
@@ -1121,12 +1141,12 @@ void Play_DrawMain(PlayState* this) {
R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_OFF;
}
- if ((R_PAUSE_BG_PRERENDER_STATE <= PAUSE_BG_PRERENDER_SETUP) && (gTrnsnUnkState < 2)) {
- if (this->skyboxCtx.skyboxShouldDraw || (this->roomCtx.curRoom.mesh->type0.type == 1)) {
+ if ((R_PAUSE_BG_PRERENDER_STATE <= PAUSE_BG_PRERENDER_SETUP) && (gTransitionTileState <= TRANS_TILE_SETUP)) {
+ if (this->skyboxCtx.skyboxShouldDraw || (this->roomCtx.curRoom.roomShape->base.type == ROOM_SHAPE_TYPE_IMAGE)) {
func_8012CF0C(gfxCtx, false, true, 0, 0, 0);
} else {
- func_8012CF0C(gfxCtx, true, true, this->lightCtx.fogColor.r, this->lightCtx.fogColor.g,
- this->lightCtx.fogColor.b);
+ func_8012CF0C(gfxCtx, true, true, this->lightCtx.fogColor[0], this->lightCtx.fogColor[1],
+ this->lightCtx.fogColor[2]);
}
} else {
func_8012CF0C(gfxCtx, false, false, 0, 0, 0);
@@ -1134,17 +1154,17 @@ void Play_DrawMain(PlayState* this) {
OPEN_DISPS(gfxCtx);
- gSegments[4] = VIRTUAL_TO_PHYSICAL(this->objectCtx.status[this->objectCtx.mainKeepIndex].segment);
- gSegments[5] = VIRTUAL_TO_PHYSICAL(this->objectCtx.status[this->objectCtx.subKeepIndex].segment);
+ gSegments[4] = VIRTUAL_TO_PHYSICAL(this->objectCtx.slots[this->objectCtx.mainKeepSlot].segment);
+ gSegments[5] = VIRTUAL_TO_PHYSICAL(this->objectCtx.slots[this->objectCtx.subKeepSlot].segment);
gSegments[2] = VIRTUAL_TO_PHYSICAL(this->sceneSegment);
- gSPSegment(POLY_OPA_DISP++, 0x04, this->objectCtx.status[this->objectCtx.mainKeepIndex].segment);
- gSPSegment(POLY_XLU_DISP++, 0x04, this->objectCtx.status[this->objectCtx.mainKeepIndex].segment);
- gSPSegment(OVERLAY_DISP++, 0x04, this->objectCtx.status[this->objectCtx.mainKeepIndex].segment);
+ gSPSegment(POLY_OPA_DISP++, 0x04, this->objectCtx.slots[this->objectCtx.mainKeepSlot].segment);
+ gSPSegment(POLY_XLU_DISP++, 0x04, this->objectCtx.slots[this->objectCtx.mainKeepSlot].segment);
+ gSPSegment(OVERLAY_DISP++, 0x04, this->objectCtx.slots[this->objectCtx.mainKeepSlot].segment);
- gSPSegment(POLY_OPA_DISP++, 0x05, this->objectCtx.status[this->objectCtx.subKeepIndex].segment);
- gSPSegment(POLY_XLU_DISP++, 0x05, this->objectCtx.status[this->objectCtx.subKeepIndex].segment);
- gSPSegment(OVERLAY_DISP++, 0x05, this->objectCtx.status[this->objectCtx.subKeepIndex].segment);
+ gSPSegment(POLY_OPA_DISP++, 0x05, this->objectCtx.slots[this->objectCtx.subKeepSlot].segment);
+ gSPSegment(POLY_XLU_DISP++, 0x05, this->objectCtx.slots[this->objectCtx.subKeepSlot].segment);
+ gSPSegment(OVERLAY_DISP++, 0x05, this->objectCtx.slots[this->objectCtx.subKeepSlot].segment);
gSPSegment(POLY_OPA_DISP++, 0x02, this->sceneSegment);
gSPSegment(POLY_XLU_DISP++, 0x02, this->sceneSegment);
@@ -1217,8 +1237,8 @@ void Play_DrawMain(PlayState* this) {
TransitionFade_Draw(&this->unk_18E48, &sp218);
if (gVisMonoColor.a != 0) {
- sVisMono.primColor.rgba = gVisMonoColor.rgba;
- VisMono_Draw(&sVisMono, &sp218);
+ sPlayVisMono.primColor.rgba = gVisMonoColor.rgba;
+ VisMono_Draw(&sPlayVisMono, &sp218);
}
gSPEndDisplayList(sp218++);
@@ -1226,16 +1246,16 @@ void Play_DrawMain(PlayState* this) {
POLY_OPA_DISP = sp218;
}
- if (gTrnsnUnkState == 3) {
+ if (gTransitionTileState == TRANS_TILE_READY) {
Gfx* sp90 = POLY_OPA_DISP;
- TransitionUnk_Draw(&sTrnsnUnk, &sp90);
+ TransitionTile_Draw(&sTransitionTile, &sp90);
POLY_OPA_DISP = sp90;
sp25B = true;
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();
@@ -1248,8 +1268,8 @@ void Play_DrawMain(PlayState* this) {
if (R_PAUSE_BG_PRERENDER_STATE == PAUSE_BG_PRERENDER_READY) {
Gfx* sp8C = POLY_OPA_DISP;
- if (this->pauseBgPreRender.unk_4D == 2) {
- func_80170B28(&this->pauseBgPreRender, &sp8C);
+ if (this->pauseBgPreRender.filterState == PRERENDER_FILTER_STATE_DONE) {
+ PreRender_RestoreFramebuffer(&this->pauseBgPreRender, &sp8C);
} else {
func_80170798(&this->pauseBgPreRender, &sp8C);
}
@@ -1260,20 +1280,20 @@ void Play_DrawMain(PlayState* this) {
goto PostWorldDraw;
}
- if (this->unk_18844 == 0) {
+ if (!this->unk_18844) {
if (1) {
- if (this->skyboxId && !this->envCtx.skyboxDisabled) {
- if ((this->skyboxId == 1) || (this->skyboxId == 3)) {
+ if (((u32)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);
- SkyboxDraw_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) {
- SkyboxDraw_Draw(&this->skyboxCtx, gfxCtx, this->skyboxId, 0, this->view.eye.x,
- this->view.eye.y, this->view.eye.z);
+ Skybox_Draw(&this->skyboxCtx, gfxCtx, this->skyboxId, 0, this->view.eye.x, this->view.eye.y,
+ this->view.eye.z);
}
}
- func_800FE390(this);
+ Environment_Draw(this);
}
sp268 = LightContext_NewLights(&this->lightCtx, gfxCtx);
@@ -1298,14 +1318,14 @@ void Play_DrawMain(PlayState* this) {
if (this->skyboxCtx.skyboxShouldDraw) {
Vec3f sp78;
- if (1) {}
- Camera_GetQuakeOffset(&sp78, GET_ACTIVE_CAM(this));
- SkyboxDraw_Draw(&this->skyboxCtx, gfxCtx, this->skyboxId, 0, this->view.eye.x + sp78.x,
+ if (1) {
+ Camera_GetQuakeOffset(&sp78, GET_ACTIVE_CAM(this));
+ Skybox_Draw(&this->skyboxCtx, gfxCtx, this->skyboxId, 0, this->view.eye.x + sp78.x,
this->view.eye.y + sp78.y, this->view.eye.z + sp78.z);
+ }
}
- // envCtx.precipitation[PRECIP_RAIN_CUR]
- if (this->envCtx.unk_F2[1] != 0) {
+ if (this->envCtx.precipitation[PRECIP_RAIN_CUR] != 0) {
Environment_DrawRain(this, &this->view, gfxCtx);
}
}
@@ -1319,7 +1339,7 @@ void Play_DrawMain(PlayState* this) {
}
if (1) {
- if (!this->envCtx.sunMoonDisabled) {
+ if (!this->envCtx.sunDisabled) {
sp25C.x = this->view.eye.x + this->envCtx.sunPos.x;
sp25C.y = this->view.eye.y + this->envCtx.sunPos.y;
sp25C.z = this->view.eye.z + this->envCtx.sunPos.z;
@@ -1347,7 +1367,7 @@ void Play_DrawMain(PlayState* this) {
}
if (1) {
- if (this->envCtx.sandstormState != 0) {
+ if (this->envCtx.sandstormState != SANDSTORM_OFF) {
Environment_DrawSandstorm(this, this->envCtx.sandstormState);
}
}
@@ -1362,8 +1382,8 @@ void Play_DrawMain(PlayState* this) {
Play_DrawMotionBlur(this);
- if (((R_PAUSE_BG_PRERENDER_STATE == PAUSE_BG_PRERENDER_SETUP) || (gTrnsnUnkState == 1)) ||
- (R_PICTO_PHOTO_STATE == PICTO_PHOTO_STATE_SETUP)) {
+ if ((R_PAUSE_BG_PRERENDER_STATE == PAUSE_BG_PRERENDER_SETUP) ||
+ (gTransitionTileState == TRANS_TILE_SETUP) || (R_PICTO_PHOTO_STATE == PICTO_PHOTO_STATE_SETUP)) {
Gfx* sp74;
Gfx* sp70 = POLY_OPA_DISP;
@@ -1380,15 +1400,15 @@ void Play_DrawMain(PlayState* this) {
this->pauseBgPreRender.fbufSave = gfxCtx->zbuffer;
this->pauseBgPreRender.cvgSave = this->unk_18E58;
} else {
- gTrnsnUnkState = 2;
+ gTransitionTileState = TRANS_TILE_PROCESS;
this->pauseBgPreRender.fbufSave = gfxCtx->zbuffer;
this->pauseBgPreRender.cvgSave = NULL;
}
- func_801705B4(&this->pauseBgPreRender, &sp74);
+ PreRender_SaveFramebuffer(&this->pauseBgPreRender, &sp74);
if (this->pauseBgPreRender.cvgSave != NULL) {
- func_80170730(&this->pauseBgPreRender, &sp74);
+ PreRender_DrawCoverage(&this->pauseBgPreRender, &sp74);
}
gSPEndDisplayList(sp74++);
@@ -1396,31 +1416,34 @@ void Play_DrawMain(PlayState* this) {
POLY_OPA_DISP = sp74;
this->unk_18B49 = 2;
SREG(33) |= 1;
- } else {
- PostWorldDraw:
- if (1) {
- Play_PostWorldDraw(this);
- }
+ goto SkipPostWorldDraw;
+ }
+
+ PostWorldDraw:
+ if (1) {
+ Play_PostWorldDraw(this);
}
}
}
+SkipPostWorldDraw:
+
if ((this->view.unk164 != 0) && !gDbgCamEnabled) {
Vec3s sp4C;
Camera_Update(&sp4C, GET_ACTIVE_CAM(this));
View_UpdateViewingMatrix(&this->view);
this->view.unk164 = 0;
- if ((this->skyboxId != 0) && !this->envCtx.skyboxDisabled) {
- SkyboxDraw_UpdateMatrix(&this->skyboxCtx, this->view.eye.x, this->view.eye.y, this->view.eye.z);
+ if ((this->skyboxId != SKYBOX_NONE) && !this->envCtx.skyboxDisabled) {
+ Skybox_UpdateMatrix(&this->skyboxCtx, this->view.eye.x, this->view.eye.y, this->view.eye.z);
}
}
if (!sp25B) {
- func_800FE3E0(this);
+ Environment_DrawSkyboxStars(this);
}
- CLOSE_DISPS(this->state.gfxCtx);
+ CLOSE_DISPS(gfxCtx);
}
#else
void Play_DrawMain(PlayState* this);
@@ -1434,24 +1457,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;
@@ -1495,12 +1518,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) {
@@ -1539,7 +1562,7 @@ void Play_GetFloorSurface(PlayState* this, MtxF* mtx, Vec3f* pos) {
void* Play_LoadFile(PlayState* this, RomFile* entry) {
size_t size = entry->vromEnd - entry->vromStart;
- void* allocp = THA_AllocEndAlign16(&this->state.heap, size);
+ void* allocp = THA_AllocTailAlign16(&this->state.tha, size);
DmaMgr_SendRequest0(allocp, entry->vromStart, size);
@@ -1562,12 +1585,12 @@ void Play_InitScene(PlayState* this, s32 spawn) {
this->sceneMaterialAnims = NULL;
this->roomCtx.unk74 = NULL;
this->numSetupActors = 0;
- Object_InitBank(&this->state, &this->objectCtx);
+ Object_InitContext(&this->state, &this->objectCtx);
LightContext_Init(this, &this->lightCtx);
Door_InitContext(&this->state, &this->doorCtx);
Room_Init(this, &this->roomCtx);
gSaveContext.worldMapArea = 0;
- Scene_ProcessHeader(this, this->sceneSegment);
+ Scene_ExecuteCommands(this, this->sceneSegment);
Play_InitEnvironment(this, this->skyboxId);
}
@@ -1673,11 +1696,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;
@@ -1702,11 +1725,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;
@@ -1740,13 +1763,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);
}
@@ -1934,11 +1957,10 @@ void func_80169FDC(GameState* thisx) {
func_80169F78(thisx);
}
-// Used by Kankyo to determine how to change the lighting, e.g. for game over.
-s32 func_80169FFC(GameState* thisx) {
+s32 Play_CamIsNotFixed(GameState* thisx) {
PlayState* this = (PlayState*)thisx;
- return this->roomCtx.curRoom.mesh->type0.type != 1;
+ return this->roomCtx.curRoom.roomShape->base.type != ROOM_SHAPE_TYPE_IMAGE;
}
s32 FrameAdvance_IsEnabled(GameState* thisx) {
@@ -2010,37 +2032,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;
}
}
@@ -2069,8 +2101,8 @@ void Play_Init(GameState* thisx) {
s32 scene;
if ((gSaveContext.respawnFlag == -4) || (gSaveContext.respawnFlag == -0x63)) {
- if (CHECK_EVENTINF(EVENTINF_27)) {
- CLEAR_EVENTINF(EVENTINF_27);
+ if (CHECK_EVENTINF(EVENTINF_TRIGGER_DAYTELOP)) {
+ CLEAR_EVENTINF(EVENTINF_TRIGGER_DAYTELOP);
STOP_GAMESTATE(&this->state);
SET_NEXT_GAMESTATE(&this->state, DayTelop_Init, sizeof(DayTelopState));
return;
@@ -2095,7 +2127,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) {
@@ -2109,7 +2141,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) {
@@ -2117,17 +2149,17 @@ 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;
}
// "First cycle" Termina Field
- if (INV_CONTENT(ITEM_OCARINA) != ITEM_OCARINA) {
+ if (INV_CONTENT(ITEM_OCARINA_OF_TIME) != ITEM_OCARINA_OF_TIME) {
if ((scene == ENTR_SCENE_TERMINA_FIELD) &&
(((void)0, gSaveContext.save.entrance) != ENTRANCE(TERMINA_FIELD, 10))) {
gSaveContext.nextCutsceneIndex = 0xFFF4;
@@ -2162,7 +2194,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);
@@ -2173,18 +2206,18 @@ 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) {
+ if (gSaveContext.nextDayTime != NEXT_TIME_NONE) {
gSaveContext.save.time = gSaveContext.nextDayTime;
gSaveContext.skyboxTime = gSaveContext.nextDayTime;
}
@@ -2197,13 +2230,14 @@ void Play_Init(GameState* thisx) {
func_800EDDB0(this);
- if (((gSaveContext.gameMode != 0) && (gSaveContext.gameMode != 1)) || (gSaveContext.save.cutscene >= 0xFFF0)) {
- gSaveContext.unk_3DC0 = 0;
+ if (((gSaveContext.gameMode != GAMEMODE_NORMAL) && (gSaveContext.gameMode != GAMEMODE_TITLE_SCREEN)) ||
+ (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;
}
@@ -2216,14 +2250,14 @@ void Play_Init(GameState* thisx) {
KaleidoScopeCall_Init(this);
Interface_Init(this);
- if (gSaveContext.nextDayTime != 0xFFFF) {
- if (gSaveContext.nextDayTime == 0x8000) {
+ if (gSaveContext.nextDayTime != NEXT_TIME_NONE) {
+ if (gSaveContext.nextDayTime == NEXT_TIME_DAY) {
gSaveContext.save.day++;
- gSaveContext.save.daysElapsed++;
+ gSaveContext.save.eventDayCount++;
gSaveContext.dogIsLost = true;
- gSaveContext.nextDayTime = -2;
+ gSaveContext.nextDayTime = NEXT_TIME_DAY_SET;
} else {
- gSaveContext.nextDayTime = -3;
+ gSaveContext.nextDayTime = NEXT_TIME_NIGHT_SET;
}
}
@@ -2233,15 +2267,15 @@ 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;
this->unk_18E60 = D_80784600;
- gTrnsnUnkState = 0;
+ gTransitionTileState = TRANS_TILE_OFF;
this->transitionMode = TRANS_MODE_OFF;
D_801D0D54 = false;
@@ -2258,7 +2292,7 @@ void Play_Init(GameState* thisx) {
this->haltAllActors = false;
this->unk_18844 = false;
- if (gSaveContext.gameMode != 1) {
+ if (gSaveContext.gameMode != GAMEMODE_TITLE_SCREEN) {
if (gSaveContext.nextTransitionType == TRANS_NEXT_TYPE_DEFAULT) {
this->transitionType =
(Entrance_GetTransitionFlags(((void)0, gSaveContext.save.entrance) + sceneLayer) >> 7) & 0x7F;
@@ -2274,7 +2308,7 @@ void Play_Init(GameState* thisx) {
TransitionFade_SetType(&this->unk_18E48, 3);
TransitionFade_SetColor(&this->unk_18E48, RGBA8(160, 160, 160, 255));
TransitionFade_Start(&this->unk_18E48);
- VisMono_Init(&sVisMono);
+ VisMono_Init(&sPlayVisMono);
gVisMonoColor.a = 0;
D_801F6D4C = &D_801F6D38;
@@ -2289,39 +2323,37 @@ void Play_Init(GameState* thisx) {
D_801F6D4C->envColor.g = 0;
D_801F6D4C->envColor.b = 0;
D_801F6D4C->envColor.a = 0;
- EnvFlags_UnsetAll(this);
- THA_GetSize(&this->state.heap);
- zAllocSize = THA_GetSize(&this->state.heap);
- zAlloc = (uintptr_t)THA_AllocEndAlign16(&this->state.heap, zAllocSize);
+ CutsceneFlags_UnsetAll(this);
+ THA_GetRemaining(&this->state.tha);
+ zAllocSize = THA_GetRemaining(&this->state.tha);
+ zAlloc = (uintptr_t)THA_AllocTailAlign16(&this->state.tha, zAllocSize);
ZeldaArena_Init(((zAlloc + 8) & ~0xF), (zAllocSize - ((zAlloc + 8) & ~0xF)) + zAlloc); //! @bug: Incorrect ALIGN16s
Actor_InitContext(this, &this->actorCtx, this->linkActorEntry);
while (!Room_HandleLoadCallbacks(this, &this->roomCtx)) {}
- if ((CURRENT_DAY != 0) && ((this->roomCtx.curRoom.unk3 == 1) || (this->roomCtx.curRoom.unk3 == 5))) {
+ if ((CURRENT_DAY != 0) && ((this->roomCtx.curRoom.behaviorType1 == ROOM_BEHAVIOR_TYPE1_1) ||
+ (this->roomCtx.curRoom.behaviorType1 == ROOM_BEHAVIOR_TYPE1_5))) {
Actor_Spawn(&this->actorCtx, this, ACTOR_EN_TEST4, 0.0f, 0.0f, 0.0f, 0, 0, 0, 0);
}
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);
+ Environment_PlaySceneSequence(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..1b2572ea8 100644
--- a/src/code/z_play_hireso.c
+++ b/src/code/z_play_hireso.c
@@ -1,27 +1,1340 @@
#include "global.h"
+#include "sys_cfb.h"
+#include "z64bombers_notebook.h"
+#include "interface/schedule_static/schedule_static.h"
+#include "archives/schedule_dma_static/schedule_dma_static_yar.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016AC10.s")
+#define BOMBERS_NOTEBOOK_ENTRY_SIZE 3
+#define BOMBERS_NOTEBOOK_ENTRY_MAX 10
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016AE1C.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_8016B278.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_8016B4B0.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_8016C344.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_8016CD4C.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_8016E40C.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/func_8016EA90.s")
+s16 sBombersNotebookDayRectRectLeft[] = { 120, 120, 270, 420 };
+TexturePtr sBombersNotebookDayTextures[] = {
+ gBombersNotebookDay1stENGTex,
+ gBombersNotebookDay2ndENGTex,
+ gBombersNotebookDayFinalENGTex,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/BombersNotebook_Draw.s")
+#define DEFINE_EVENT(_enum, icon, _colorFlag, _description, _completedMessage, _completedFlag) icon,
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016F4EC.s")
+s32 sBombersNotebookEventIcons[] = {
+#include "tables/bombers_notebook/event_table.h"
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/BombersNotebook_Update.s")
+#undef DEFINE_EVENT
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/BombersNotebook_Init.s")
+s32 sBombersNotebookEventIconWidths[] = { 16, 24, 32 };
+s32 sBombersNotebookEventIconHeights[] = { 16, 28, 28 };
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/BombersNotebook_Destroy.s")
+#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,
+ gBombersNotebookEntryIconMaskTex,
+ gBombersNotebookEntryIconRibbonTex,
+};
+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++, gBombersNotebookTimeOfDayENGTex, 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_yar);
+ this->scheduleDmaSegmentSize = SEGMENT_ROM_SIZE(schedule_dma_static_syms);
+ 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) {
+ Audio_PlaySfx(NA_SE_SY_ERROR);
+ break;
+ }
+ if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(
+ this->cursorPageRow + this->cursorPage,
+ cursorEntryScan - BOMBERS_NOTEBOOK_ENTRY_SIZE)])) {
+ Audio_PlaySfx(NA_SE_SY_ERROR);
+ break;
+ }
+ }
+ break;
+ }
+ if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(
+ this->cursorPageRow + this->cursorPage,
+ cursorEntryScan - BOMBERS_NOTEBOOK_ENTRY_SIZE)])) {
+ Audio_PlaySfx(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)])) {
+ Audio_PlaySfx(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) {
+ Audio_PlaySfx(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) {
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
+ this->cursorEntry = 0;
+ this->cursorPageRow--;
+ } else if (this->cursorPage != 0) {
+ Audio_PlaySfx(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) {
+ Audio_PlaySfx(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 a4ceeba95..44427d54c 100644
--- a/src/code/z_player_call.c
+++ b/src/code/z_player_call.c
@@ -1,8 +1,9 @@
+#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)
+#define FLAGS \
+ (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_200000 | \
+ ACTOR_FLAG_2000000 | 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 51b25268b..f288b31de 100644
--- a/src/code/z_player_lib.c
+++ b/src/code/z_player_lib.c
@@ -1,13 +1,21 @@
+/**
+ * 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"
@@ -33,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);
@@ -47,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);
@@ -147,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?
@@ -195,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);
}
}
@@ -227,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 {
@@ -240,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 },
@@ -329,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);
}
}
}
@@ -339,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->actionVar1 == 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->actionVar1 == 1) || (player->actionVar1 == 3));
}
void func_8012300C(PlayState* play, s32 arg1) {
@@ -354,20 +384,21 @@ 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;
- this->unk_AE7++;
+ this->actionVar1++;
- if (this->unk_AE7 == 2) {
+ if (this->actionVar1 == 2) {
s16 objectId = gPlayerFormObjectIndices[GET_PLAYER_FORM];
gActorOverlayTable[ACTOR_PLAYER].initInfo->objectId = objectId;
func_8012F73C(&play->objectCtx, this->actor.objBankIndex, objectId);
- this->actor.objBankIndex = Object_GetIndex(&play->objectCtx, GAMEPLAY_KEEP);
- } else if (this->unk_AE7 >= 3) {
- s32 objBankIndex = Object_GetIndex(&play->objectCtx, gActorOverlayTable[ACTOR_PLAYER].initInfo->objectId);
+ this->actor.objBankIndex = Object_GetSlot(&play->objectCtx, GAMEPLAY_KEEP);
+ } else if (this->actionVar1 >= 3) {
+ s32 objBankIndex = Object_GetSlot(&play->objectCtx, gActorOverlayTable[ACTOR_PLAYER].initInfo->objectId);
if (Object_IsLoaded(&play->objectCtx, objBankIndex)) {
this->actor.objBankIndex = objBankIndex;
@@ -384,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)) {
@@ -433,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];
@@ -441,7 +480,7 @@ void func_80123140(PlayState* play, Player* player) {
IREG(69) = bootRegs[16];
MREG(95) = bootRegs[17];
- if (play->roomCtx.curRoom.unk3 == 2) {
+ if (play->roomCtx.curRoom.behaviorType1 == ROOM_BEHAVIOR_TYPE1_2) {
R_RUN_SPEED_LIMIT = 500;
}
@@ -456,7 +495,7 @@ void func_80123140(PlayState* play, Player* player) {
s32 Player_InBlockingCsMode(PlayState* play, Player* player) {
return (player->stateFlags1 & (PLAYER_STATE1_80 | PLAYER_STATE1_200 | PLAYER_STATE1_20000000)) ||
- (player->csMode != PLAYER_CSMODE_0) || (play->transitionTrigger == TRANS_TRIGGER_START) ||
+ (player->csMode != PLAYER_CSMODE_NONE) || (play->transitionTrigger == TRANS_TRIGGER_START) ||
(play->transitionMode != TRANS_MODE_OFF) || (player->stateFlags1 & PLAYER_STATE1_1) ||
(player->stateFlags3 & PLAYER_STATE3_80) || (play->actorCtx.unk268 != 0);
}
@@ -464,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) {
@@ -480,7 +519,7 @@ s32 func_80123448(PlayState* play) {
Player* player = GET_PLAYER(play);
return (player->stateFlags1 & PLAYER_STATE1_400000) &&
- (player->transformation != PLAYER_FORM_HUMAN || (!func_80123434(player) && player->targetedActor == NULL));
+ (player->transformation != PLAYER_FORM_HUMAN || (!func_80123434(player) && player->lockOnActor == NULL));
}
// TODO: Player_IsGoronOrDeku is a temporary name until we have more info on this function.
@@ -492,10 +531,11 @@ s32 Player_IsGoronOrDeku(Player* player) {
s32 func_801234D4(PlayState* play) {
Player* player = GET_PLAYER(play);
- return (player->stateFlags2 & PLAYER_STATE2_8) || player->actor.speedXZ != 0.0f ||
+ return (player->stateFlags2 & PLAYER_STATE2_8) || (player->actor.speed != 0.0f) ||
((player->transformation != PLAYER_FORM_ZORA) && (player->stateFlags1 & PLAYER_STATE1_8000000)) ||
((player->transformation == PLAYER_FORM_ZORA) && (player->stateFlags1 & PLAYER_STATE1_8000000) &&
- (!(player->actor.bgCheckFlags & 1) || (player->currentBoots < PLAYER_BOOTS_ZORA_UNDERWATER)));
+ (!(player->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
+ (player->currentBoots < PLAYER_BOOTS_ZORA_UNDERWATER)));
}
s32 func_80123590(PlayState* play, Actor* actor) {
@@ -516,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;
@@ -530,12 +570,12 @@ s32 func_801235DC(PlayState* play, f32 arg1, s16 arg2) {
return false;
}
-ItemId func_8012364C(PlayState* play, Player* player, s32 arg2) {
- if (arg2 >= 4) {
+ItemId Player_GetItemOnButton(PlayState* play, Player* player, EquipSlot slot) {
+ if (slot >= EQUIP_SLOT_A) {
return ITEM_NONE;
}
- if (arg2 == 0) {
+ if (slot == EQUIP_SLOT_B) {
ItemId item = Inventory_GetBtnBItem(play);
if (item >= ITEM_FD) {
@@ -557,18 +597,24 @@ ItemId func_8012364C(PlayState* play, Player* player, s32 arg2) {
return item;
}
- if (arg2 == 1) {
+ if (slot == EQUIP_SLOT_C_LEFT) {
return C_BTN_ITEM(EQUIP_SLOT_C_LEFT);
}
- if (arg2 == 2) {
+ if (slot == EQUIP_SLOT_C_DOWN) {
return C_BTN_ITEM(EQUIP_SLOT_C_DOWN);
}
+ // EQUIP_SLOT_C_RIGHT
+
return C_BTN_ITEM(EQUIP_SLOT_C_RIGHT);
}
-u16 sCItemButtons[] = { BTN_CLEFT, BTN_CDOWN, BTN_CRIGHT };
+u16 sCItemButtons[] = {
+ BTN_CLEFT,
+ BTN_CDOWN,
+ BTN_CRIGHT,
+};
PlayerItemAction func_80123810(PlayState* play) {
Player* player = GET_PLAYER(play);
@@ -580,7 +626,7 @@ PlayerItemAction func_80123810(PlayState* play) {
if (CHECK_BTN_ANY(CONTROLLER1(&play->state)->press.button, BTN_A | BTN_B)) {
play->interfaceCtx.unk_222 = 0;
play->interfaceCtx.unk_224 = 0;
- Interface_SetHudVisibility(play->msgCtx.unk_120BC);
+ Interface_SetHudVisibility(play->msgCtx.hudVisibility);
return PLAYER_IA_MINUS1;
}
} else {
@@ -590,14 +636,14 @@ PlayerItemAction func_80123810(PlayState* play) {
for (i = 0; i < ARRAY_COUNT(sCItemButtons); i++) {
if (CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, sCItemButtons[i])) {
i++;
- itemId = func_8012364C(play, player, i);
+ itemId = Player_GetItemOnButton(play, player, i);
play->interfaceCtx.unk_222 = 0;
play->interfaceCtx.unk_224 = 0;
- Interface_SetHudVisibility(play->msgCtx.unk_120BC);
+ Interface_SetHudVisibility(play->msgCtx.hudVisibility);
if ((itemId >= ITEM_FD) || ((itemAction = play->unk_18794(play, player, itemId)) <= PLAYER_IA_MINUS1)) {
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
return PLAYER_IA_MINUS1;
} else {
s32 pad;
@@ -615,12 +661,12 @@ PlayerItemAction func_80123810(PlayState* play) {
u8 sActionModelGroups[PLAYER_IA_MAX] = {
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_NONE
PLAYER_MODELGROUP_13, // PLAYER_IA_LAST_USED
- PLAYER_MODELGROUP_STICK, // PLAYER_IA_FISHING_ROD
+ PLAYER_MODELGROUP_DEKU_STICK, // PLAYER_IA_FISHING_ROD
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_STICK, // PLAYER_IA_STICK
+ PLAYER_MODELGROUP_TWO_HAND_SWORD, // PLAYER_IA_SWORD_TWO_HANDED
+ PLAYER_MODELGROUP_DEKU_STICK, // PLAYER_IA_DEKU_STICK
PLAYER_MODELGROUP_ZORA_FINS, // PLAYER_IA_ZORA_FINS
PLAYER_MODELGROUP_BOW, // PLAYER_IA_BOW
PLAYER_MODELGROUP_BOW, // PLAYER_IA_BOW_FIRE
@@ -631,10 +677,10 @@ u8 sActionModelGroups[PLAYER_IA_MAX] = {
PLAYER_MODELGROUP_EXPLOSIVES, // PLAYER_IA_POWDER_KEG
PLAYER_MODELGROUP_EXPLOSIVES, // PLAYER_IA_BOMBCHU
PLAYER_MODELGROUP_8, // PLAYER_IA_11
- PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_NUT
- PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_PICTO_BOX
+ PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_DEKU_NUT
+ PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_PICTOGRAPH_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
@@ -655,7 +701,7 @@ u8 sActionModelGroups[PLAYER_IA_MAX] = {
PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_MILK_HALF
PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_CHATEAU
PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_FAIRY
- PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MOON_TEAR
+ PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MOONS_TEAR
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_DEED_LAND
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_ROOM_KEY
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_LETTER_TO_KAFEI
@@ -695,7 +741,7 @@ u8 sActionModelGroups[PLAYER_IA_MAX] = {
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_GORON
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_ZORA
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_DEKU
- PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_LENS
+ PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_LENS_OF_TRUTH
};
PlayerModelGroup Player_ActionToModelGroup(Player* player, PlayerItemAction itemAction) {
@@ -748,10 +794,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,
@@ -763,25 +809,25 @@ 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,
PLAYER_MODELTYPE_WAIST },
- /* PLAYER_MODELGROUP_STICK */
+ /* PLAYER_MODELGROUP_DEKU_STICK */
{ 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 },
};
@@ -793,9 +839,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] = {
@@ -837,21 +885,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] = {
@@ -892,10 +940,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] = {
@@ -964,22 +1018,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,
@@ -988,7 +1042,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,
@@ -1221,7 +1275,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;
}
@@ -1229,7 +1283,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;
}
}
@@ -1239,7 +1293,7 @@ void Player_SetModelGroup(Player* player, PlayerModelGroup modelGroup) {
void func_80123C58(Player* player) {
player->itemAction = player->heldItemAction;
Player_SetModelGroup(player, Player_ActionToModelGroup(player, player->heldItemAction));
- player->unk_AA5 = 0;
+ player->unk_AA5 = PLAYER_UNKAA5_0;
}
void Player_SetEquipmentData(PlayState* play, Player* player) {
@@ -1268,13 +1322,13 @@ void Player_UpdateBottleHeld(PlayState* play, Player* player, ItemId itemId, Pla
player->itemAction = itemAction;
}
-void func_80123DA4(Player* player) {
- player->targetedActor = NULL;
+void Player_Untarget(Player* player) {
+ player->lockOnActor = NULL;
player->stateFlags2 &= ~PLAYER_STATE2_2000;
}
void func_80123DC0(Player* player) {
- if ((player->actor.bgCheckFlags & 1) ||
+ if ((player->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
(player->stateFlags1 & (PLAYER_STATE1_200000 | PLAYER_STATE1_800000 | PLAYER_STATE1_8000000)) ||
(!(player->stateFlags1 & (PLAYER_STATE1_40000 | PLAYER_STATE1_80000)) &&
((player->actor.world.pos.y - player->actor.floorHeight) < 100.0f))) {
@@ -1287,14 +1341,14 @@ void func_80123DC0(Player* player) {
~(PLAYER_STATE1_8000 | PLAYER_STATE1_10000 | PLAYER_STATE1_20000 | PLAYER_STATE1_40000000);
}
- func_80123DA4(player);
+ Player_Untarget(player);
}
void func_80123E90(PlayState* play, Actor* actor) {
Player* player = GET_PLAYER(play);
func_80123DC0(player);
- player->targetedActor = actor;
+ player->lockOnActor = actor;
player->unk_A78 = actor;
player->stateFlags1 |= PLAYER_STATE1_10000;
Camera_SetViewParam(Play_GetCamera(play, CAM_ID_MAIN), CAM_VIEW_TARGET, actor);
@@ -1314,12 +1368,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_DEKU_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);
}
@@ -1364,86 +1418,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_DEKU_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) {
@@ -1455,13 +1508,13 @@ s32 Player_GetEnvironmentalHazard(PlayState* play) {
EnvHazardTextTriggerEntry* triggerEntry;
s32 envHazard;
- if (play->roomCtx.curRoom.unk2 == 3) { // Room is hot
+ if (play->roomCtx.curRoom.behaviorType2 == ROOM_BEHAVIOR_TYPE2_HOT) {
envHazard = PLAYER_ENV_HAZARD_HOTROOM - 1;
} else if ((player->transformation != PLAYER_FORM_ZORA) && (player->underwaterTimer > 80)) {
envHazard = PLAYER_ENV_HAZARD_UNDERWATER_FREE - 1;
} else if (player->stateFlags1 & PLAYER_STATE1_8000000) {
if ((player->transformation == PLAYER_FORM_ZORA) && (player->currentBoots >= PLAYER_BOOTS_ZORA_UNDERWATER) &&
- (player->actor.bgCheckFlags & 1)) {
+ (player->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
envHazard = PLAYER_ENV_HAZARD_UNDERWATER_FLOOR - 1;
} else {
envHazard = PLAYER_ENV_HAZARD_SWIMMING - 1;
@@ -1482,8 +1535,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;
@@ -1539,22 +1627,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
@@ -1580,8 +1674,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);
@@ -1611,68 +1705,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);
+ gSPSegment(OVERLAY_DISP++, 0x06, play->objectCtx.slots[player->actor.objBankIndex].segment);
+ gSPDisplayList(OVERLAY_DISP++, gHookshotReticleDL);
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -1691,8 +1889,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 {
@@ -1739,7 +1935,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;
@@ -1766,11 +1981,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));
@@ -1798,49 +2011,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->skelAnimeUpper.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->skelAnimeUpper.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 != PLAYER_UNKAA5_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);
}
@@ -1946,47 +2509,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
+ gFierceDeityMaskDL, // PLAYER_MASK_FIERCE_DEITY
+ gGoronMaskDL, // PLAYER_MASK_GORON
+ gZoraMaskDL, // 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;
@@ -2035,21 +2626,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) {
@@ -2083,7 +2856,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;
@@ -2093,7 +2866,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]);
@@ -2103,7 +2876,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();
@@ -2121,12 +2894,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) {
@@ -2134,17 +2906,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;
}
}
@@ -2168,15 +2937,15 @@ void Player_DrawBlastMask(PlayState* play, Player* player) {
OPEN_DISPS(play->state.gfxCtx);
- if (player->unk_B60 != 0) {
+ if (player->blastMaskTimer != 0) {
s32 alpha;
gSegments[0xA] = VIRTUAL_TO_PHYSICAL(player->maskObjectSegment);
AnimatedMat_DrawOpa(play, Lib_SegmentedToVirtual(&object_mask_bakuretu_Matanimheader_0011F8));
- if (player->unk_B60 < 11) {
- alpha = (player->unk_B60 / 10.0f) * 255;
+ if (player->blastMaskTimer <= 10) {
+ alpha = (player->blastMaskTimer / 10.0f) * 255;
} else {
alpha = 255;
}
@@ -2211,7 +2980,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;
@@ -2227,91 +2996,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;
@@ -2328,7 +3243,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);
@@ -2348,8 +3264,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_DEKU_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++, gBottleContentsDL);
+ }
+
+ gSPDisplayList(POLY_XLU_DISP++, gBottleGlassDL);
+
+ 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_DEKU_STICK
+ 2500.0f, // PLAYER_MELEEWEAPON_ZORA_FINS
+ };
+
+ if ((player->transformation == PLAYER_FORM_FIERCE_DEITY) ||
+ ((player->transformation != PLAYER_FORM_ZORA) &&
+ ((player->itemAction == PLAYER_IA_DEKU_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_DEKU_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->exchangeItemAction != 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->actionVar2 != 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->actionVar2);
+ 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->skelAnimeUpper.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..e1282db6b 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) {
@@ -7,12 +8,11 @@ void PreNMI_Stop(PreNMIState* this) {
void PreNMI_Update(PreNMIState* this) {
if (this->timer == 0) {
- ViConfig_UpdateVi(1);
+ ViConfig_UpdateVi(true);
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);
+ GameState_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 7e15a9bde..0830fa572 100644
--- a/src/code/z_rcp.c
+++ b/src/code/z_rcp.c
@@ -1,758 +1,835 @@
#include "global.h"
+#include "sys_cfb.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 +891,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 +1460,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 +1472,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 +1482,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 +1496,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 +1506,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 +1514,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]);
@@ -1289,17 +1539,17 @@ void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g
gSPDisplayList(DEBUG_DISP++, gGfxMasterDL->setupBuffers);
if (clearZb) {
- gSPDisplayList(gfxCtx->polyOpa.p++, D_0E000000.clearZBuffer);
+ gSPDisplayList(POLY_OPA_DISP++, D_0E000000.clearZBuffer);
}
if (clearFb) {
- gSPDisplayList(gfxCtx->polyOpa.p++, D_0E000000.clearFrameBuffer);
+ gSPDisplayList(POLY_OPA_DISP++, D_0E000000.clearFrameBuffer);
}
CLOSE_DISPS(gfxCtx);
}
void func_8012D374(GraphicsContext* gfxCtx, u8 r, u8 g, u8 b) {
- if ((R_PAUSE_BG_PRERENDER_STATE <= PAUSE_BG_PRERENDER_SETUP) && (gTrnsnUnkState < 2)) {
+ if ((R_PAUSE_BG_PRERENDER_STATE <= PAUSE_BG_PRERENDER_SETUP) && (gTransitionTileState <= TRANS_TILE_SETUP)) {
func_8012CF0C(gfxCtx, true, true, r, g, b);
} else {
func_8012CF0C(gfxCtx, false, false, r, g, b);
diff --git a/src/code/z_room.c b/src/code/z_room.c
index eb615c409..428dd5c13 100644
--- a/src/code/z_room.c
+++ b/src/code/z_room.c
@@ -1,94 +1,564 @@
#include "global.h"
+#include "PR/gs2dex.h"
+#include "debug.h"
-void Room_nop8012D510(PlayState* play, Room* room, UNK_PTR param_3, UNK_TYPE1 param_4) {
+void Room_Noop(PlayState* play, Room* room, Input* input, s32 arg3) {
}
-void Room_DrawType3Mesh(PlayState* play, Room* room, u32 flags) {
+void Room_DrawNone(PlayState* play, Room* room, u32 flags) {
}
-void Room_DrawType0Mesh(PlayState* play, Room* room, u32 flags) {
- RoomMeshType0* mesh;
+static Vec3f sZeroVec = { 0.0f, 0.0f, 0.0f };
+
+void Room_DrawNormal(PlayState* play, Room* room, u32 flags) {
+ RoomShapeNormal* roomShape;
+ RoomShapeDListsEntry* entry;
s32 i;
- RoomMeshType0Params* meshParams;
- GraphicsContext* gfxCtx;
- UNK_TYPE4 pad;
- gfxCtx = play->state.gfxCtx;
- if (flags & 1) {
- func_800BCBF4(&D_801C1D10, play);
- gSPSegment(gfxCtx->polyOpa.p++, 0x03, room->segment);
- func_8012C268(play);
- gSPMatrix(gfxCtx->polyOpa.p++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
+ OPEN_DISPS(play->state.gfxCtx);
+
+ if (flags & ROOM_DRAW_OPA) {
+ func_800BCBF4(&sZeroVec, play);
+ gSPSegment(POLY_OPA_DISP++, 0x03, room->segment);
+ func_8012C268(&play->state);
+ gSPMatrix(POLY_OPA_DISP++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
}
- if (flags & 2) {
- func_800BCC68(&D_801C1D10, play);
- gSPSegment(gfxCtx->polyXlu.p++, 0x03, room->segment);
- func_8012C2DC(play->state.gfxCtx);
- gSPMatrix(gfxCtx->polyXlu.p++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
+ if (flags & ROOM_DRAW_XLU) {
+ func_800BCC68(&sZeroVec, play);
+ gSPSegment(POLY_XLU_DISP++, 0x03, room->segment);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
}
- mesh = &room->mesh->type0;
- meshParams = Lib_SegmentedToVirtual(mesh->paramsStart);
- for (i = 0; i < mesh->count; i++) {
- if ((flags & 1) && (meshParams->opaqueDl != NULL)) {
- gSPDisplayList(gfxCtx->polyOpa.p++, meshParams->opaqueDl);
+ roomShape = &room->roomShape->normal;
+ entry = Lib_SegmentedToVirtual(roomShape->entries);
+ for (i = 0; i < roomShape->numEntries; i++) {
+ if ((flags & ROOM_DRAW_OPA) && (entry->opa != NULL)) {
+ gSPDisplayList(POLY_OPA_DISP++, entry->opa);
}
- if ((flags & 2) && (meshParams->translucentDl != NULL)) {
- gSPDisplayList(gfxCtx->polyXlu.p++, meshParams->translucentDl);
+ if ((flags & ROOM_DRAW_XLU) && (entry->xlu != NULL)) {
+ gSPDisplayList(POLY_XLU_DISP++, entry->xlu);
}
- meshParams++;
+ entry++;
}
+
+ CLOSE_DISPS(play->state.gfxCtx);
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_room/Room_DrawType2Mesh.s")
+typedef enum {
+ /* 0 */ ROOM_CULL_DEBUG_MODE_OFF,
+ /* 1 */ ROOM_CULL_DEBUG_MODE_UP_TO_TARGET,
+ /* 2 */ ROOM_CULL_DEBUG_MODE_ONLY_TARGET
+} RoomCullableDebugMode;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_room/func_8012DEE8.s")
+typedef struct RoomShapeCullableEntryLinked {
+ /* 0x0 */ RoomShapeCullableEntry* entry;
+ /* 0x4 */ f32 boundsNearZ;
+ /* 0x8 */ struct RoomShapeCullableEntryLinked* prev;
+ /* 0xC */ struct RoomShapeCullableEntryLinked* next;
+} RoomShapeCullableEntryLinked; // size = 0x10
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_room/func_8012E254.s")
+#define ROOM_SHAPE_CULLABLE_MAX_ENTRIES 128
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_room/func_8012E32C.s")
+void Room_DrawCullable(PlayState* play, Room* room, u32 flags) {
+ RoomShapeCullable* roomShape;
+ RoomShapeCullableEntry* roomShapeCullableEntry;
+ RoomShapeCullableEntryLinked linkedEntriesBuffer[ROOM_SHAPE_CULLABLE_MAX_ENTRIES];
+ RoomShapeCullableEntryLinked* head = NULL;
+ RoomShapeCullableEntryLinked* tail = NULL;
+ RoomShapeCullableEntryLinked* iter;
+ Gfx* displayList;
+ RoomShapeCullableEntryLinked* insert;
+ f32 entryBoundsNearZ;
+ s32 i;
+ Vec3f pos;
+ Vec3f projectedPos;
+ RoomShapeCullableEntry* roomShapeCullableEntries;
-void Room_DrawType1Mesh(PlayState* play, Room* room, u32 flags) {
- RoomMeshType1* mesh = &room->mesh->type1;
- if (mesh->format == 1) {
- func_8012DEE8(play, room, flags);
- } else if (mesh->format == 2) {
- func_8012E32C(play, room, flags);
+ OPEN_DISPS(play->state.gfxCtx);
+
+ if (flags & ROOM_DRAW_OPA) {
+ func_800BCBF4(&sZeroVec, play);
+
+ gSPSegment(POLY_OPA_DISP++, 0x03, room->segment);
+ if (play->roomCtx.unk74 != NULL) {
+ gSPSegment(POLY_OPA_DISP++, 0x06, play->roomCtx.unk74);
+ }
+ 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);
+ if (play->roomCtx.unk74 != NULL) {
+ gSPSegment(POLY_XLU_DISP++, 0x06, play->roomCtx.unk74);
+ }
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
+ }
+
+ if (room->enablePosLights || (MREG(93) != 0)) {
+ gSPSetGeometryMode(POLY_OPA_DISP++, G_LIGHTING_POSITIONAL);
+ gSPSetGeometryMode(POLY_XLU_DISP++, G_LIGHTING_POSITIONAL);
+ }
+
+ roomShape = &room->roomShape->cullable;
+ roomShapeCullableEntry = Lib_SegmentedToVirtual(roomShape->entries);
+ insert = linkedEntriesBuffer;
+
+ roomShapeCullableEntries = roomShapeCullableEntry;
+
+ if (play->roomCtx.unk78 < 0) {
+ for (i = 0; i < roomShape->numEntries; i++, roomShapeCullableEntry++) {
+ if (R_ROOM_CULL_DEBUG_MODE != 0) {
+ if (((R_ROOM_CULL_DEBUG_MODE == ROOM_CULL_DEBUG_MODE_UP_TO_TARGET) &&
+ (i <= R_ROOM_CULL_DEBUG_TARGET)) ||
+ ((R_ROOM_CULL_DEBUG_MODE == ROOM_CULL_DEBUG_MODE_ONLY_TARGET) && (i == R_ROOM_CULL_DEBUG_TARGET))) {
+ if (flags & ROOM_DRAW_OPA) {
+ displayList = roomShapeCullableEntry->opa;
+ if (displayList != NULL) {
+ gSPDisplayList(POLY_OPA_DISP++, displayList);
+ }
+ }
+
+ if (flags & ROOM_DRAW_XLU) {
+ displayList = roomShapeCullableEntry->xlu;
+ if (displayList != NULL) {
+ gSPDisplayList(POLY_XLU_DISP++, displayList);
+ }
+ }
+ }
+ } else {
+ if (flags & ROOM_DRAW_OPA) {
+ displayList = roomShapeCullableEntry->opa;
+ if (displayList != NULL) {
+ gSPDisplayList(POLY_OPA_DISP++, displayList);
+ }
+ }
+
+ if (flags & ROOM_DRAW_XLU) {
+ displayList = roomShapeCullableEntry->xlu;
+ if (displayList != NULL) {
+ gSPDisplayList(POLY_XLU_DISP++, displayList);
+ }
+ }
+ }
+ }
} else {
- __assert("../z_room.c", 965);
+ 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++) {
+
+ // Project the entry position, to get the depth it is at.
+ pos.x = roomShapeCullableEntry->boundsSphereCenter.x;
+ pos.y = roomShapeCullableEntry->boundsSphereCenter.y;
+ pos.z = roomShapeCullableEntry->boundsSphereCenter.z;
+ SkinMatrix_Vec3fMtxFMultXYZ(&play->viewProjectionMtxF, &pos, &projectedPos);
+
+ projectedPos.z *= var_fa1;
+
+ var_fv1 = ABS_ALT(roomShapeCullableEntry->boundsSphereRadius);
+
+ // If the entry bounding sphere isn't fully before the rendered depth range
+ if (-var_fv1 < projectedPos.z) {
+
+ // Compute the depth of the nearest point in the entry's bounding sphere
+ entryBoundsNearZ = projectedPos.z - var_fv1;
+
+ // If the entry bounding sphere isn't fully beyond the rendered depth range
+ if (entryBoundsNearZ < play->lightCtx.zFar) {
+
+ // This entry will be rendered
+ insert->entry = roomShapeCullableEntry;
+
+ if (roomShapeCullableEntry->boundsSphereRadius < 0) {
+ insert->boundsNearZ = FLT_MAX;
+ } else {
+ insert->boundsNearZ = entryBoundsNearZ;
+ }
+
+ // Insert into the linked list, ordered by ascending depth of the nearest point in the bounding
+ // sphere
+ iter = head;
+ if (iter == NULL) {
+ head = tail = insert;
+ insert->prev = insert->next = NULL;
+ } else {
+ do {
+ if (insert->boundsNearZ < iter->boundsNearZ) {
+ break;
+ }
+ iter = iter->next;
+ } while (iter != NULL);
+
+ if (iter == NULL) {
+ insert->prev = tail;
+ insert->next = NULL;
+ tail->next = insert;
+ tail = insert;
+ } else {
+ insert->prev = iter->prev;
+ if (insert->prev == NULL) {
+ head = insert;
+ } else {
+ insert->prev->next = insert;
+ }
+ iter->prev = insert;
+ insert->next = iter;
+ }
+ }
+
+ insert++;
+ }
+ }
+ }
+
+ //! FAKE: Similar trick used in OoT
+ R_ROOM_CULL_NUM_ENTRIES = roomShape->numEntries & 0xFFFF & 0xFFFF & 0xFFFF;
+
+ // Draw entries, from nearest to furthest
+ i = 1;
+
+ if (flags & ROOM_DRAW_OPA) {
+ for (; head != NULL; head = head->next, i++) {
+ s32 pad;
+
+ roomShapeCullableEntry = head->entry;
+
+ if (R_ROOM_CULL_DEBUG_MODE != ROOM_CULL_DEBUG_MODE_OFF) {
+ // Debug mode drawing
+
+ if (((R_ROOM_CULL_DEBUG_MODE == ROOM_CULL_DEBUG_MODE_UP_TO_TARGET) &&
+ (i <= R_ROOM_CULL_DEBUG_TARGET)) ||
+ ((R_ROOM_CULL_DEBUG_MODE == ROOM_CULL_DEBUG_MODE_ONLY_TARGET) &&
+ (i == R_ROOM_CULL_DEBUG_TARGET))) {
+
+ displayList = roomShapeCullableEntry->opa;
+ if (displayList != NULL) {
+ gSPDisplayList(POLY_OPA_DISP++, displayList);
+ }
+ }
+ } else {
+ displayList = roomShapeCullableEntry->opa;
+ if (displayList != NULL) {
+ gSPDisplayList(POLY_OPA_DISP++, displayList);
+ }
+ }
+ }
+ }
+
+ if (flags & ROOM_DRAW_XLU) {
+ for (; tail != NULL; tail = tail->prev) {
+ f32 temp_fv0;
+ f32 temp_fv1;
+
+ roomShapeCullableEntry = tail->entry;
+ displayList = roomShapeCullableEntry->xlu;
+
+ if (displayList != NULL) {
+ if (roomShapeCullableEntry->boundsSphereRadius & 1) {
+
+ temp_fv0 = tail->boundsNearZ - (f32)(iREG(93) + 0xBB8);
+ temp_fv1 = iREG(94) + 0x7D0;
+
+ if (temp_fv0 < temp_fv1) {
+ if (temp_fv0 < 0.0f) {
+ var_a1 = 255;
+ } else {
+ var_a1 = 255 - (s32)((temp_fv0 / temp_fv1) * 255.0f);
+ }
+ gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, var_a1);
+ gSPDisplayList(POLY_XLU_DISP++, displayList);
+ }
+ } else {
+ gSPDisplayList(POLY_XLU_DISP++, displayList);
+ }
+ }
+ }
+ }
+
+ R_ROOM_CULL_USED_ENTRIES = i - 1;
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+#define ROOM_IMAGE_NODRAW_BACKGROUND (1 << 0)
+#define ROOM_IMAGE_NODRAW_OPA (1 << 1)
+#define ROOM_IMAGE_NODRAW_XLU (1 << 2)
+
+void Room_DrawImageSingle(PlayState* play, Room* room, u32 flags) {
+ Camera* activeCam;
+ Gfx* gfx;
+ RoomShapeImageSingle* roomShape;
+ RoomShapeDListsEntry* entry;
+ u32 isFixedCamera;
+ u32 drawBackground;
+ u32 drawOpa;
+ u32 drawXlu;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ activeCam = GET_ACTIVE_CAM(play);
+ isFixedCamera = false; // Condition is inferred from OoT
+ roomShape = &room->roomShape->image.single;
+ entry = Lib_SegmentedToVirtual(roomShape->base.entry);
+ drawBackground = (flags & ROOM_DRAW_OPA) && isFixedCamera && (roomShape->source != NULL) &&
+ !(R_ROOM_IMAGE_NODRAW_FLAGS & ROOM_IMAGE_NODRAW_BACKGROUND);
+ drawOpa = (flags & ROOM_DRAW_OPA) && (entry->opa != NULL) && !(R_ROOM_IMAGE_NODRAW_FLAGS & ROOM_IMAGE_NODRAW_OPA);
+ drawXlu = (flags & ROOM_DRAW_XLU) && (entry->xlu != NULL) && !(R_ROOM_IMAGE_NODRAW_FLAGS & ROOM_IMAGE_NODRAW_XLU);
+
+ if (drawOpa || drawBackground) {
+ gSPSegment(POLY_OPA_DISP++, 0x03, room->segment);
+
+ if (drawOpa) {
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ gSPMatrix(POLY_OPA_DISP++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
+ gSPDisplayList(POLY_OPA_DISP++, entry->opa);
+ }
+
+ if (drawBackground) {
+ gSPLoadUcodeL(POLY_OPA_DISP++, gspS2DEX2_fifo);
+
+ gfx = POLY_OPA_DISP;
+
+ {
+ Vec3f quakeOffset;
+
+ Camera_GetQuakeOffset(&quakeOffset, activeCam);
+
+ Prerender_DrawBackground2D(
+ &gfx, roomShape->source, roomShape->tlut, roomShape->width, roomShape->height, roomShape->fmt,
+ roomShape->siz, roomShape->tlutMode, roomShape->tlutCount,
+ (quakeOffset.x + quakeOffset.z) * 1.2f + quakeOffset.y * 0.6f,
+ quakeOffset.y * 2.4f + (quakeOffset.x + quakeOffset.z) * 0.3f, 1.0f, 1.0f, 0);
+ }
+
+ POLY_OPA_DISP = gfx;
+
+ gSPLoadUcode(POLY_OPA_DISP++, SysUcode_GetUCode(), SysUcode_GetUCodeData());
+ }
+ }
+
+ if (drawXlu) {
+ gSPSegment(POLY_XLU_DISP++, 0x03, room->segment);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
+ gSPDisplayList(POLY_XLU_DISP++, entry->xlu);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+RoomShapeImageMultiBgEntry* Room_GetImageMultiBgEntry(RoomShapeImageMulti* roomShapeImageMulti, PlayState* play) {
+ Camera* activeCam = GET_ACTIVE_CAM(play);
+ s32 bgCamIndex = activeCam->bgCamIndex;
+ s16 overrideBgCamIndex;
+ Player* player;
+ RoomShapeImageMultiBgEntry* bgEntry;
+ s32 i;
+
+ overrideBgCamIndex = ((BgCamFuncData*)BgCheck_GetBgCamFuncDataImpl(&play->colCtx, bgCamIndex, BGCHECK_SCENE))
+ ->roomImageOverrideBgCamIndex;
+ if (overrideBgCamIndex >= 0) {
+ bgCamIndex = overrideBgCamIndex;
+ }
+
+ player = GET_PLAYER(play);
+ player->actor.params = (player->actor.params & 0xFF00) | bgCamIndex;
+
+ bgEntry = Lib_SegmentedToVirtual(roomShapeImageMulti->backgrounds);
+ for (i = 0; i < roomShapeImageMulti->numBackgrounds; i++) {
+ if (bgEntry->bgCamIndex == bgCamIndex) {
+ return bgEntry;
+ }
+ bgEntry++;
+ }
+
+ _dbg_hungup("../z_room.c", 849);
+
+ return NULL;
+}
+
+void Room_DrawImageMulti(PlayState* play, Room* room, u32 flags) {
+ Camera* activeCam;
+ Gfx* gfx;
+ RoomShapeImageMulti* roomShape;
+ RoomShapeImageMultiBgEntry* bgEntry;
+ RoomShapeDListsEntry* dListsEntry;
+ u32 isFixedCamera;
+ u32 drawBackground;
+ u32 drawOpa;
+ u32 drawXlu;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ activeCam = GET_ACTIVE_CAM(play);
+ isFixedCamera = false; // Condition is inferred from OoT
+ roomShape = &room->roomShape->image.multi;
+ dListsEntry = Lib_SegmentedToVirtual(roomShape->base.entry);
+
+ bgEntry = Room_GetImageMultiBgEntry(roomShape, play);
+
+ drawBackground = (flags & ROOM_DRAW_OPA) && isFixedCamera && (bgEntry->source != NULL) &&
+ !(R_ROOM_IMAGE_NODRAW_FLAGS & ROOM_IMAGE_NODRAW_BACKGROUND);
+ drawOpa =
+ (flags & ROOM_DRAW_OPA) && (dListsEntry->opa != NULL) && !(R_ROOM_IMAGE_NODRAW_FLAGS & ROOM_IMAGE_NODRAW_OPA);
+ drawXlu =
+ (flags & ROOM_DRAW_XLU) && (dListsEntry->xlu != NULL) && !(R_ROOM_IMAGE_NODRAW_FLAGS & ROOM_IMAGE_NODRAW_XLU);
+
+ if (drawOpa || drawBackground) {
+ gSPSegment(POLY_OPA_DISP++, 0x03, room->segment);
+
+ if (drawOpa) {
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ gSPMatrix(POLY_OPA_DISP++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
+ gSPDisplayList(POLY_OPA_DISP++, dListsEntry->opa);
+ }
+
+ if (drawBackground) {
+ gSPLoadUcodeL(POLY_OPA_DISP++, gspS2DEX2_fifo);
+
+ gfx = POLY_OPA_DISP;
+
+ {
+ Vec3f quakeOffset;
+
+ Camera_GetQuakeOffset(&quakeOffset, activeCam);
+ Prerender_DrawBackground2D(&gfx, bgEntry->source, bgEntry->tlut, bgEntry->width, bgEntry->height,
+ bgEntry->fmt, bgEntry->siz, bgEntry->tlutMode, bgEntry->tlutCount,
+ (quakeOffset.x + quakeOffset.z) * 1.2f + quakeOffset.y * 0.6f,
+ quakeOffset.y * 2.4f + (quakeOffset.x + quakeOffset.z) * 0.3f, 1.0f, 1.0f,
+ 0);
+ }
+
+ POLY_OPA_DISP = gfx;
+
+ gSPLoadUcode(POLY_OPA_DISP++, SysUcode_GetUCode(), SysUcode_GetUCodeData());
+ }
+ }
+
+ if (drawXlu) {
+ gSPSegment(POLY_XLU_DISP++, 0x03, room->segment);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
+ gSPDisplayList(POLY_XLU_DISP++, dListsEntry->xlu);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void Room_DrawImage(PlayState* play, Room* room, u32 flags) {
+ RoomShapeImageBase* roomShape = &room->roomShape->image.base;
+
+ if (roomShape->amountType == ROOM_SHAPE_IMAGE_AMOUNT_SINGLE) {
+ Room_DrawImageSingle(play, room, flags);
+ } else if (roomShape->amountType == ROOM_SHAPE_IMAGE_AMOUNT_MULTI) {
+ Room_DrawImageMulti(play, room, flags);
+ } else {
+ _dbg_hungup("../z_room.c", 965);
}
}
void Room_Init(PlayState* play, RoomContext* roomCtx) {
s32 i;
+
roomCtx->curRoom.num = -1;
roomCtx->curRoom.segment = NULL;
roomCtx->unk78 = 1;
roomCtx->unk79 = 0;
- for (i = 0; i < 3; i++) {
+ for (i = 0; i < ARRAY_COUNT(roomCtx->unk7A); i++) {
roomCtx->unk7A[i] = 0;
}
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_room/Room_AllocateAndLoad.s")
+size_t Room_AllocateAndLoad(PlayState* play, RoomContext* roomCtx) {
+ size_t maxRoomSize = 0;
+ size_t roomSize;
+ s32 i;
+ s32 j;
+ s32 frontRoom;
+ s32 backRoom;
+ size_t frontRoomSize;
+ size_t backRoomSize;
+ size_t cumulRoomSize;
+ s32 pad[2];
+
+ {
+ RomFile* roomList = play->roomList;
+
+ for (i = 0; i < play->numRooms; i++) {
+ roomSize = roomList[i].vromEnd - roomList[i].vromStart;
+ maxRoomSize = MAX(roomSize, maxRoomSize);
+ }
+ }
+
+ if ((u32)play->doorCtx.numTransitionActors != 0) {
+ RomFile* roomList = play->roomList;
+ TransitionActorEntry* transitionActor = &play->doorCtx.transitionActorList[0];
+
+ for (j = 0; j < play->doorCtx.numTransitionActors; j++) {
+ frontRoom = transitionActor->sides[0].room;
+ backRoom = transitionActor->sides[1].room;
+ frontRoomSize = (frontRoom < 0) ? 0 : roomList[frontRoom].vromEnd - roomList[frontRoom].vromStart;
+ backRoomSize = (backRoom < 0) ? 0 : roomList[backRoom].vromEnd - roomList[backRoom].vromStart;
+ cumulRoomSize = (frontRoom != backRoom) ? frontRoomSize + backRoomSize : frontRoomSize;
+
+ maxRoomSize = MAX(cumulRoomSize, maxRoomSize);
+ transitionActor++;
+ }
+ }
+
+ roomCtx->roomMemPages[0] = THA_AllocTailAlign16(&play->state.tha, maxRoomSize);
+ if (roomCtx->roomMemPages[0] == NULL) {
+ _dbg_hungup("../z_room.c", 1078);
+ }
+ roomCtx->roomMemPages[1] = (void*)((uintptr_t)roomCtx->roomMemPages[0] + maxRoomSize);
+ roomCtx->activeMemPage = 0;
+ roomCtx->status = 0;
+
+ if ((gSaveContext.respawnFlag != 0) && (gSaveContext.respawnFlag != -2) && (gSaveContext.respawnFlag != -7)) {
+ s32 respawnMode;
+
+ if ((gSaveContext.respawnFlag == -8) || (gSaveContext.respawnFlag == -5) || (gSaveContext.respawnFlag == -4) ||
+ ((gSaveContext.respawnFlag < 0) && (gSaveContext.respawnFlag != -1) && (gSaveContext.respawnFlag != -6))) {
+ respawnMode = RESPAWN_MODE_DOWN;
+ } else if (gSaveContext.respawnFlag < 0) {
+ respawnMode = RESPAWN_MODE_TOP;
+ } else {
+ respawnMode = gSaveContext.respawnFlag - 1;
+ }
+ frontRoom = gSaveContext.respawn[respawnMode].roomIndex;
+ } else {
+ frontRoom = play->setupEntranceList[play->curSpawn].room;
+ }
+
+ Room_StartRoomTransition(play, roomCtx, frontRoom);
+
+ return maxRoomSize;
+}
s32 Room_StartRoomTransition(PlayState* play, RoomContext* roomCtx, s32 index) {
- if (roomCtx->unk31 == 0) {
- s32 size;
+ if (roomCtx->status == 0) {
+ size_t size;
roomCtx->prevRoom = roomCtx->curRoom;
roomCtx->curRoom.num = index;
roomCtx->curRoom.segment = NULL;
- roomCtx->unk31 = 1;
+ roomCtx->status = 1;
size = play->roomList[index].vromEnd - play->roomList[index].vromStart;
- roomCtx->activeRoomVram = (void*)(ALIGN16((u32)roomCtx->roomMemPages[roomCtx->activeMemPage] -
+ roomCtx->activeRoomVram = (void*)(ALIGN16((uintptr_t)roomCtx->roomMemPages[roomCtx->activeMemPage] -
(size + 8) * roomCtx->activeMemPage - 7));
- osCreateMesgQueue(&roomCtx->loadQueue, roomCtx->loadMsg, 1);
+ osCreateMesgQueue(&roomCtx->loadQueue, roomCtx->loadMsg, ARRAY_COUNT(roomCtx->loadMsg));
DmaMgr_SendRequestImpl(&roomCtx->dmaRequest, roomCtx->activeRoomVram, play->roomList[index].vromStart, size, 0,
&roomCtx->loadQueue, NULL);
roomCtx->activeMemPage ^= 1;
@@ -100,24 +570,23 @@ s32 Room_StartRoomTransition(PlayState* play, RoomContext* roomCtx, s32 index) {
}
s32 Room_HandleLoadCallbacks(PlayState* play, RoomContext* roomCtx) {
- if (roomCtx->unk31 == 1) {
- if (!osRecvMesg(&roomCtx->loadQueue, NULL, OS_MESG_NOBLOCK)) {
- roomCtx->unk31 = 0;
+ if (roomCtx->status == 1) {
+ if (osRecvMesg(&roomCtx->loadQueue, NULL, OS_MESG_NOBLOCK) == 0) {
+ roomCtx->status = 0;
roomCtx->curRoom.segment = roomCtx->activeRoomVram;
- // TODO: Segment number enum
- gSegments[0x03] = VIRTUAL_TO_PHYSICAL(roomCtx->activeRoomVram);
+ gSegments[3] = VIRTUAL_TO_PHYSICAL(roomCtx->activeRoomVram);
- Scene_ProcessHeader(play, (SceneCmd*)roomCtx->curRoom.segment);
+ Scene_ExecuteCommands(play, roomCtx->curRoom.segment);
func_80123140(play, GET_PLAYER(play));
Actor_SpawnTransitionActors(play, &play->actorCtx);
if (((play->sceneId != SCENE_IKANA) || (roomCtx->curRoom.num != 1)) && (play->sceneId != SCENE_IKNINSIDE)) {
- play->envCtx.lightSettingOverride = 0xFF;
- play->envCtx.unk_E0 = 0;
+ play->envCtx.lightSettingOverride = LIGHT_SETTING_OVERRIDE_NONE;
+ play->envCtx.lightBlendOverride = LIGHT_BLEND_OVERRIDE_NONE;
}
func_800FEAB0();
- if (!func_800FE4B8(play)) {
- func_800FD858(play);
+ if (Environment_GetStormState(play) == STORM_STATE_OFF) {
+ Environment_StopStormNatureAmbience(play);
}
} else {
return 0;
@@ -127,11 +596,17 @@ s32 Room_HandleLoadCallbacks(PlayState* play, RoomContext* roomCtx) {
return 1;
}
+RoomDrawHandler sRoomDrawHandlers[] = {
+ Room_DrawNormal, // ROOM_SHAPE_TYPE_NORMAL
+ Room_DrawImage, // ROOM_SHAPE_TYPE_IMAGE
+ Room_DrawCullable, // ROOM_SHAPE_TYPE_CULLABLE
+ Room_DrawNone, // ROOM_SHAPE_TYPE_NONE
+};
+
void Room_Draw(PlayState* play, Room* room, u32 flags) {
if (room->segment != NULL) {
- // TODO: Segment number enum
- gSegments[0x03] = VIRTUAL_TO_PHYSICAL(room->segment);
- roomDrawFuncs[room->mesh->type0.type](play, room, flags);
+ gSegments[3] = VIRTUAL_TO_PHYSICAL(room->segment);
+ sRoomDrawHandlers[room->roomShape->base.type](play, room, flags);
}
return;
}
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 48c360107..483db001e 100644
--- a/src/code/z_scene.c
+++ b/src/code/z_scene.c
@@ -1,28 +1,41 @@
#include "global.h"
-s32 Object_Spawn(ObjectContext* objectCtx, s16 id) {
+/**
+ * Spawn an object file of a specified ID that will persist through room changes.
+ *
+ * This waits for the file to be fully loaded, the data is available when the function returns.
+ *
+ * @return The new object slot corresponding to the requested object ID.
+ *
+ * @note This function is not meant to be called externally to spawn object files on the fly.
+ * When an object is spawned with this function, all objects that come before it in the entry list will be treated as
+ * persistent, which will likely cause either the amount of free slots or object space memory to run out.
+ * This function is only meant to be called internally on scene load, before the object list from any room is processed.
+ */
+s32 Object_SpawnPersistent(ObjectContext* objectCtx, s16 id) {
size_t size;
- objectCtx->status[objectCtx->num].id = id;
+ objectCtx->slots[objectCtx->numEntries].id = id;
size = gObjectTable[id].vromEnd - gObjectTable[id].vromStart;
if (1) {}
if (size != 0) {
- DmaMgr_SendRequest0(objectCtx->status[objectCtx->num].segment, gObjectTable[id].vromStart, size);
+ DmaMgr_SendRequest0(objectCtx->slots[objectCtx->numEntries].segment, gObjectTable[id].vromStart, size);
}
- if (objectCtx->num < OBJECT_EXCHANGE_BANK_MAX - 1) {
- objectCtx->status[objectCtx->num + 1].segment = ALIGN16((u32)objectCtx->status[objectCtx->num].segment + size);
+ if (objectCtx->numEntries < ARRAY_COUNT(objectCtx->slots) - 1) {
+ objectCtx->slots[objectCtx->numEntries + 1].segment =
+ ALIGN16((u32)objectCtx->slots[objectCtx->numEntries].segment + size);
}
- objectCtx->num++;
- objectCtx->spawnedObjectCount = objectCtx->num;
+ objectCtx->numEntries++;
+ objectCtx->numPersistentEntries = objectCtx->numEntries;
- return objectCtx->num - 1;
+ return objectCtx->numEntries - 1;
}
-void Object_InitBank(GameState* gameState, ObjectContext* objectCtx) {
+void Object_InitContext(GameState* gameState, ObjectContext* objectCtx) {
PlayState* play = (PlayState*)gameState;
s32 pad;
u32 spaceSize;
@@ -30,66 +43,66 @@ void Object_InitBank(GameState* gameState, ObjectContext* objectCtx) {
if (play->sceneId == SCENE_CLOCKTOWER || play->sceneId == SCENE_TOWN || play->sceneId == SCENE_BACKTOWN ||
play->sceneId == SCENE_ICHIBA) {
- spaceSize = OBJECT_SPACE_SIZE_CLOCK_TOWN;
+ spaceSize = 1530 * 1024;
} else if (play->sceneId == SCENE_MILK_BAR) {
- spaceSize = OBJECT_SPACE_SIZE_MILK_BAR;
+ spaceSize = 1580 * 1024;
} else if (play->sceneId == SCENE_00KEIKOKU) {
- spaceSize = OBJECT_SPACE_SIZE_TERMINA_FIELD;
+ spaceSize = 1470 * 1024;
} else {
- spaceSize = OBJECT_SPACE_SIZE_DEFAULT;
+ spaceSize = 1380 * 1024;
}
- objectCtx->num = 0;
- objectCtx->spawnedObjectCount = 0;
- objectCtx->mainKeepIndex = 0;
- objectCtx->subKeepIndex = 0;
+ objectCtx->numEntries = 0;
+ objectCtx->numPersistentEntries = 0;
+ objectCtx->mainKeepSlot = 0;
+ objectCtx->subKeepSlot = 0;
// clang-format off
- for (i = 0; i < OBJECT_EXCHANGE_BANK_MAX; i++) { objectCtx->status[i].id = 0; }
+ for (i = 0; i < ARRAY_COUNT(objectCtx->slots); i++) { objectCtx->slots[i].id = 0; }
// clang-format on
- objectCtx->spaceStart = objectCtx->status[0].segment = THA_AllocEndAlign16(&gameState->heap, spaceSize);
+ objectCtx->spaceStart = objectCtx->slots[0].segment = THA_AllocTailAlign16(&gameState->tha, spaceSize);
objectCtx->spaceEnd = (void*)((u32)objectCtx->spaceStart + spaceSize);
- objectCtx->mainKeepIndex = Object_Spawn(objectCtx, GAMEPLAY_KEEP);
+ objectCtx->mainKeepSlot = Object_SpawnPersistent(objectCtx, GAMEPLAY_KEEP);
- gSegments[0x04] = VIRTUAL_TO_PHYSICAL(objectCtx->status[objectCtx->mainKeepIndex].segment);
+ gSegments[4] = VIRTUAL_TO_PHYSICAL(objectCtx->slots[objectCtx->mainKeepSlot].segment);
}
-void Object_UpdateBank(ObjectContext* objectCtx) {
+void Object_UpdateEntries(ObjectContext* objectCtx) {
s32 i;
- ObjectStatus* status = &objectCtx->status[0];
+ ObjectEntry* entry = &objectCtx->slots[0];
RomFile* objectFile;
size_t size;
- for (i = 0; i < objectCtx->num; i++) {
- if (status->id < 0) {
- s32 id = -status->id;
+ for (i = 0; i < objectCtx->numEntries; i++) {
+ if (entry->id < 0) {
+ s32 id = -entry->id;
- if (status->dmaReq.vromAddr == 0) {
+ if (entry->dmaReq.vromAddr == 0) {
objectFile = &gObjectTable[id];
size = objectFile->vromEnd - objectFile->vromStart;
if (size == 0) {
- status->id = 0;
+ entry->id = 0;
} else {
- osCreateMesgQueue(&status->loadQueue, &status->loadMsg, 1);
- DmaMgr_SendRequestImpl(&status->dmaReq, status->segment, objectFile->vromStart, size, 0,
- &status->loadQueue, NULL);
+ osCreateMesgQueue(&entry->loadQueue, &entry->loadMsg, 1);
+ DmaMgr_SendRequestImpl(&entry->dmaReq, entry->segment, objectFile->vromStart, size, 0,
+ &entry->loadQueue, NULL);
}
- } else if (!osRecvMesg(&status->loadQueue, NULL, OS_MESG_NOBLOCK)) {
- status->id = id;
+ } else if (!osRecvMesg(&entry->loadQueue, NULL, OS_MESG_NOBLOCK)) {
+ entry->id = id;
}
}
- status++;
+ entry++;
}
}
-s32 Object_GetIndex(ObjectContext* objectCtx, s16 objectId) {
+s32 Object_GetSlot(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) {
+ for (i = 0; i < objectCtx->numEntries; i++) {
+ if (ABS_ALT(objectCtx->slots[i].id) == objectId) {
return i;
}
}
@@ -97,8 +110,8 @@ s32 Object_GetIndex(ObjectContext* objectCtx, s16 objectId) {
return -1;
}
-s32 Object_IsLoaded(ObjectContext* objectCtx, s32 index) {
- if (objectCtx->status[index].id > 0) {
+s32 Object_IsLoaded(ObjectContext* objectCtx, s32 slot) {
+ if (objectCtx->slots[slot].id > 0) {
return true;
} else {
return false;
@@ -110,38 +123,38 @@ void Object_LoadAll(ObjectContext* objectCtx) {
s32 id;
uintptr_t vromSize;
- for (i = 0; i < objectCtx->num; i++) {
- id = objectCtx->status[i].id;
+ for (i = 0; i < objectCtx->numEntries; i++) {
+ id = objectCtx->slots[i].id;
vromSize = gObjectTable[id].vromEnd - gObjectTable[id].vromStart;
if (vromSize == 0) {
continue;
}
- DmaMgr_SendRequest0(objectCtx->status[i].segment, gObjectTable[id].vromStart, vromSize);
+ DmaMgr_SendRequest0(objectCtx->slots[i].segment, gObjectTable[id].vromStart, vromSize);
}
}
-void* func_8012F73C(ObjectContext* objectCtx, s32 iParm2, s16 id) {
+void* func_8012F73C(ObjectContext* objectCtx, s32 slot, s16 id) {
u32 addr;
uintptr_t vromSize;
RomFile* fileTableEntry;
- objectCtx->status[iParm2].id = -id;
- objectCtx->status[iParm2].dmaReq.vromAddr = 0;
+ objectCtx->slots[slot].id = -id;
+ objectCtx->slots[slot].dmaReq.vromAddr = 0;
fileTableEntry = &gObjectTable[id];
vromSize = fileTableEntry->vromEnd - fileTableEntry->vromStart;
// TODO: UB to cast void to u32
- addr = ((u32)objectCtx->status[iParm2].segment) + vromSize;
+ addr = ((u32)objectCtx->slots[slot].segment) + vromSize;
addr = ALIGN16(addr);
return (void*)addr;
}
// SceneTableEntry Header Command 0x00: Spawn List
-void Scene_HeaderCmdSpawnList(PlayState* play, SceneCmd* cmd) {
+void Scene_CommandSpawnList(PlayState* play, SceneCmd* cmd) {
s32 loadedCount;
s16 playerObjectId;
void* nextObject;
@@ -152,35 +165,35 @@ void Scene_HeaderCmdSpawnList(PlayState* play, SceneCmd* cmd) {
((gSaveContext.respawnFlag == 2) &&
(gSaveContext.respawn[RESPAWN_MODE_RETURN].playerParams == PLAYER_PARAMS(0xFF, PLAYER_INITMODE_TELESCOPE)))) {
// Skull Kid Object
- Object_Spawn(&play->objectCtx, OBJECT_STK);
+ Object_SpawnPersistent(&play->objectCtx, OBJECT_STK);
return;
}
- loadedCount = Object_Spawn(&play->objectCtx, OBJECT_LINK_CHILD);
- nextObject = play->objectCtx.status[play->objectCtx.num].segment;
- play->objectCtx.num = loadedCount;
- play->objectCtx.spawnedObjectCount = loadedCount;
+ loadedCount = Object_SpawnPersistent(&play->objectCtx, OBJECT_LINK_CHILD);
+ nextObject = play->objectCtx.slots[play->objectCtx.numEntries].segment;
+ play->objectCtx.numEntries = loadedCount;
+ play->objectCtx.numPersistentEntries = loadedCount;
playerObjectId = gPlayerFormObjectIndices[GET_PLAYER_FORM];
gActorOverlayTable[0].initInfo->objectId = playerObjectId;
- Object_Spawn(&play->objectCtx, playerObjectId);
+ Object_SpawnPersistent(&play->objectCtx, playerObjectId);
- play->objectCtx.status[play->objectCtx.num].segment = nextObject;
+ play->objectCtx.slots[play->objectCtx.numEntries].segment = nextObject;
}
// SceneTableEntry Header Command 0x01: Actor List
-void Scene_HeaderCmdActorList(PlayState* play, SceneCmd* cmd) {
+void Scene_CommandActorList(PlayState* play, SceneCmd* cmd) {
play->numSetupActors = cmd->actorList.num;
play->setupActorList = Lib_SegmentedToVirtual(cmd->actorList.segment);
- play->actorCtx.unkC = 0;
+ play->actorCtx.halfDaysBit = 0;
}
// SceneTableEntry Header Command 0x02: List of camera data for actor cutscenes
-void Scene_HeaderCmdActorCutsceneCamList(PlayState* play, SceneCmd* cmd) {
+void Scene_CommandActorCutsceneCamList(PlayState* play, SceneCmd* cmd) {
play->actorCsCamList = Lib_SegmentedToVirtual(cmd->actorCsCamList.segment);
}
// SceneTableEntry Header Command 0x03: Collision Header
-void Scene_HeaderCmdColHeader(PlayState* play, SceneCmd* cmd) {
+void Scene_CommandCollisionHeader(PlayState* play, SceneCmd* cmd) {
CollisionHeader* colHeaderTemp;
CollisionHeader* colHeader;
@@ -205,18 +218,18 @@ void Scene_HeaderCmdColHeader(PlayState* play, SceneCmd* cmd) {
}
// SceneTableEntry Header Command 0x04: Room List
-void Scene_HeaderCmdRoomList(PlayState* play, SceneCmd* cmd) {
+void Scene_CommandRoomList(PlayState* play, SceneCmd* cmd) {
play->numRooms = cmd->roomList.num;
play->roomList = Lib_SegmentedToVirtual(cmd->roomList.segment);
}
// SceneTableEntry Header Command 0x06: Entrance List
-void Scene_HeaderCmdEntranceList(PlayState* play, SceneCmd* cmd) {
+void Scene_CommandEntranceList(PlayState* play, SceneCmd* cmd) {
play->setupEntranceList = Lib_SegmentedToVirtual(cmd->entranceList.segment);
}
// SceneTableEntry Header Command 0x07: Special Files
-void Scene_HeaderCmdSpecialFiles(PlayState* play, SceneCmd* cmd) {
+void Scene_CommandSpecialFiles(PlayState* play, SceneCmd* cmd) {
// @note These quest hint files are identical to OoT's.
// They are not relevant in this game and the system to process these scripts has been removed.
static RomFile naviQuestHintFiles[2] = {
@@ -224,10 +237,10 @@ void Scene_HeaderCmdSpecialFiles(PlayState* play, SceneCmd* cmd) {
{ SEGMENT_ROM_START(elf_message_ydan), SEGMENT_ROM_END(elf_message_ydan) },
};
- if (cmd->specialFiles.subKeepIndex != 0) {
- play->objectCtx.subKeepIndex = Object_Spawn(&play->objectCtx, cmd->specialFiles.subKeepIndex);
+ if (cmd->specialFiles.subKeepId != 0) {
+ play->objectCtx.subKeepSlot = Object_SpawnPersistent(&play->objectCtx, cmd->specialFiles.subKeepId);
// TODO: Segment number enum?
- gSegments[0x05] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[play->objectCtx.subKeepIndex].segment);
+ gSegments[0x05] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[play->objectCtx.subKeepSlot].segment);
}
if (cmd->specialFiles.naviQuestHintFileId != NAVI_QUEST_HINTS_NONE) {
@@ -236,48 +249,48 @@ void Scene_HeaderCmdSpecialFiles(PlayState* play, SceneCmd* cmd) {
}
// SceneTableEntry Header Command 0x08: Room Behavior
-void Scene_HeaderCmdRoomBehavior(PlayState* play, SceneCmd* cmd) {
- play->roomCtx.curRoom.unk3 = cmd->roomBehavior.gpFlag1;
- play->roomCtx.curRoom.unk2 = cmd->roomBehavior.gpFlag2 & 0xFF;
- play->roomCtx.curRoom.unk5 = (cmd->roomBehavior.gpFlag2 >> 8) & 1;
+void Scene_CommandRoomBehavior(PlayState* play, SceneCmd* cmd) {
+ play->roomCtx.curRoom.behaviorType1 = cmd->roomBehavior.gpFlag1;
+ play->roomCtx.curRoom.behaviorType2 = cmd->roomBehavior.gpFlag2 & 0xFF;
+ play->roomCtx.curRoom.lensMode = (cmd->roomBehavior.gpFlag2 >> 8) & 1;
play->msgCtx.unk12044 = (cmd->roomBehavior.gpFlag2 >> 0xA) & 1;
play->roomCtx.curRoom.enablePosLights = (cmd->roomBehavior.gpFlag2 >> 0xB) & 1;
- play->envCtx.unk_E2 = (cmd->roomBehavior.gpFlag2 >> 0xC) & 1;
+ play->envCtx.stormState = (cmd->roomBehavior.gpFlag2 >> 0xC) & 1;
}
// SceneTableEntry Header Command 0x0A: Mesh Header
-void Scene_HeaderCmdMesh(PlayState* play, SceneCmd* cmd) {
- play->roomCtx.curRoom.mesh = Lib_SegmentedToVirtual(cmd->mesh.segment);
+void Scene_CommandMesh(PlayState* play, SceneCmd* cmd) {
+ play->roomCtx.curRoom.roomShape = Lib_SegmentedToVirtual(cmd->mesh.segment);
}
// SceneTableEntry Header Command 0x0B: Object List
-void Scene_HeaderCmdObjectList(PlayState* play, SceneCmd* cmd) {
+void Scene_CommandObjectList(PlayState* play, SceneCmd* cmd) {
s32 i;
s32 j;
s32 k;
- ObjectStatus* firstObject;
- ObjectStatus* status;
- ObjectStatus* status2;
+ ObjectEntry* firstObject;
+ ObjectEntry* entry;
+ ObjectEntry* invalidatedEntry;
s16* objectEntry;
void* nextPtr;
objectEntry = Lib_SegmentedToVirtual(cmd->objectList.segment);
k = 0;
- i = play->objectCtx.spawnedObjectCount;
- status = &play->objectCtx.status[i];
- firstObject = play->objectCtx.status;
+ i = play->objectCtx.numPersistentEntries;
+ entry = &play->objectCtx.slots[i];
+ firstObject = &play->objectCtx.slots[0];
- while (i < play->objectCtx.num) {
- if (status->id != *objectEntry) {
- status2 = &play->objectCtx.status[i];
+ while (i < play->objectCtx.numEntries) {
+ if (entry->id != *objectEntry) {
+ invalidatedEntry = &play->objectCtx.slots[i];
- for (j = i; j < play->objectCtx.num; j++) {
- status2->id = 0;
- status2++;
+ for (j = i; j < play->objectCtx.numEntries; j++) {
+ invalidatedEntry->id = 0;
+ invalidatedEntry++;
}
- play->objectCtx.num = i;
- func_800BA6FC(play, &play->actorCtx);
+ play->objectCtx.numEntries = i;
+ Actor_KillAllWithMissingObject(play, &play->actorCtx);
continue;
}
@@ -285,13 +298,13 @@ void Scene_HeaderCmdObjectList(PlayState* play, SceneCmd* cmd) {
i++;
k++;
objectEntry++;
- status++;
+ entry++;
}
while (k < cmd->objectList.num) {
nextPtr = func_8012F73C(&play->objectCtx, i, *objectEntry);
- if (i < OBJECT_EXCHANGE_BANK_MAX - 1) {
+ if (i < ARRAY_COUNT(play->objectCtx.slots) - 1) {
firstObject[i + 1].segment = nextPtr;
}
@@ -300,11 +313,11 @@ void Scene_HeaderCmdObjectList(PlayState* play, SceneCmd* cmd) {
objectEntry++;
}
- play->objectCtx.num = i;
+ play->objectCtx.numEntries = i;
}
// SceneTableEntry Header Command 0x0C: Light List
-void Scene_HeaderCmdLightList(PlayState* play, SceneCmd* cmd) {
+void Scene_CommandLightList(PlayState* play, SceneCmd* cmd) {
s32 i;
LightInfo* lightInfo = Lib_SegmentedToVirtual(cmd->lightList.segment);
@@ -315,12 +328,12 @@ void Scene_HeaderCmdLightList(PlayState* play, SceneCmd* cmd) {
}
// SceneTableEntry Header Command 0x0D: Path List
-void Scene_HeaderCmdPathList(PlayState* play, SceneCmd* cmd) {
+void Scene_CommandPathList(PlayState* play, SceneCmd* cmd) {
play->setupPathList = Lib_SegmentedToVirtual(cmd->pathList.segment);
}
// SceneTableEntry Header Command 0x0E: Transition Actor List
-void Scene_HeaderCmdTransiActorList(PlayState* play, SceneCmd* cmd) {
+void Scene_CommandTransiActorList(PlayState* play, SceneCmd* cmd) {
play->doorCtx.numTransitionActors = cmd->transiActorList.num;
play->doorCtx.transitionActorList = Lib_SegmentedToVirtual(cmd->transiActorList.segment);
func_80105818(play, play->doorCtx.numTransitionActors, play->doorCtx.transitionActorList);
@@ -332,7 +345,7 @@ void Door_InitContext(GameState* state, DoorContext* doorCtx) {
}
// SceneTableEntry Header Command 0x0F: Environment Light Settings List
-void Scene_HeaderCmdEnvLightSettings(PlayState* play, SceneCmd* cmd) {
+void Scene_CommandEnvLightSettings(PlayState* play, SceneCmd* cmd) {
play->envCtx.numLightSettings = cmd->lightSettingList.num;
play->envCtx.lightSettingsList = Lib_SegmentedToVirtual(cmd->lightSettingList.segment);
}
@@ -357,27 +370,27 @@ void Scene_LoadAreaTextures(PlayState* play, s32 fileIndex) {
size_t size = sceneTextureFiles[fileIndex].vromEnd - vromStart;
if (size != 0) {
- play->roomCtx.unk74 = THA_AllocEndAlign16(&play->state.heap, size);
+ play->roomCtx.unk74 = THA_AllocTailAlign16(&play->state.tha, size);
DmaMgr_SendRequest0(play->roomCtx.unk74, vromStart, size);
}
}
// SceneTableEntry Header Command 0x11: Skybox Settings
-void Scene_HeaderCmdSkyboxSettings(PlayState* play, SceneCmd* cmd) {
+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);
}
// SceneTableEntry Header Command 0x12: Skybox Disables
-void Scene_HeaderCmdSkyboxDisables(PlayState* play, SceneCmd* cmd) {
+void Scene_CommandSkyboxDisables(PlayState* play, SceneCmd* cmd) {
play->envCtx.skyboxDisabled = cmd->skyboxDisables.unk4;
- play->envCtx.sunMoonDisabled = cmd->skyboxDisables.unk5;
+ play->envCtx.sunDisabled = cmd->skyboxDisables.unk5;
}
// SceneTableEntry Header Command 0x10: Time Settings
-void Scene_HeaderCmdTimeSettings(PlayState* play, SceneCmd* cmd) {
+void Scene_CommandTimeSettings(PlayState* play, SceneCmd* cmd) {
if ((cmd->timeSettings.hour != 0xFF) && (cmd->timeSettings.min != 0xFF)) {
gSaveContext.skyboxTime = gSaveContext.save.time =
CLOCK_TIME_ALT2_F(cmd->timeSettings.hour, cmd->timeSettings.min);
@@ -390,7 +403,7 @@ void Scene_HeaderCmdTimeSettings(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 +415,7 @@ void Scene_HeaderCmdTimeSettings(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))) {
@@ -418,44 +431,44 @@ void Scene_HeaderCmdTimeSettings(PlayState* play, SceneCmd* cmd) {
}
// SceneTableEntry Header Command 0x05: Wind Settings
-void Scene_HeaderCmdWindSettings(PlayState* play, SceneCmd* cmd) {
+void Scene_CommandWindSettings(PlayState* play, SceneCmd* cmd) {
s8 temp1 = cmd->windSettings.west;
s8 temp2 = cmd->windSettings.vertical;
s8 temp3 = cmd->windSettings.south;
- play->envCtx.windDir.x = temp1;
- play->envCtx.windDir.y = temp2;
- play->envCtx.windDir.z = temp3;
+ play->envCtx.windDirection.x = temp1;
+ play->envCtx.windDirection.y = temp2;
+ play->envCtx.windDirection.z = temp3;
play->envCtx.windSpeed = cmd->windSettings.clothIntensity;
}
// SceneTableEntry Header Command 0x13: Exit List
-void Scene_HeaderCmdExitList(PlayState* play, SceneCmd* cmd) {
+void Scene_CommandExitList(PlayState* play, SceneCmd* cmd) {
play->setupExitList = Lib_SegmentedToVirtual(cmd->exitList.segment);
}
// SceneTableEntry Header Command 0x09: Undefined
-void Scene_HeaderCmd09(PlayState* play, SceneCmd* cmd) {
+void Scene_Command09(PlayState* play, SceneCmd* cmd) {
}
// SceneTableEntry Header Command 0x15: Sound Settings=
-void Scene_HeaderCmdSoundSettings(PlayState* play, SceneCmd* cmd) {
+void Scene_CommandSoundSettings(PlayState* play, SceneCmd* cmd) {
play->sequenceCtx.seqId = cmd->soundSettings.seqId;
play->sequenceCtx.ambienceId = cmd->soundSettings.ambienceId;
if (gSaveContext.seqId == (u8)NA_BGM_DISABLED ||
- Audio_GetActiveSequence(SEQ_PLAYER_BGM_MAIN) == NA_BGM_FINAL_HOURS) {
+ AudioSeq_GetActiveSeqId(SEQ_PLAYER_BGM_MAIN) == NA_BGM_FINAL_HOURS) {
Audio_SetSpec(cmd->soundSettings.specId);
}
}
// SceneTableEntry Header Command 0x16: Echo Setting
-void Scene_HeaderCmdEchoSetting(PlayState* play, SceneCmd* cmd) {
+void Scene_CommandEchoSetting(PlayState* play, SceneCmd* cmd) {
play->roomCtx.curRoom.echo = cmd->echoSettings.echo;
}
// SceneTableEntry Header Command 0x18: Alternate Header List=
-void Scene_HeaderCmdAltHeaderList(PlayState* play, SceneCmd* cmd) {
+void Scene_CommandAltHeaderList(PlayState* play, SceneCmd* cmd) {
SceneCmd** altHeaderList;
SceneCmd* altHeader;
@@ -464,40 +477,40 @@ void Scene_HeaderCmdAltHeaderList(PlayState* play, SceneCmd* cmd) {
altHeader = altHeaderList[gSaveContext.sceneLayer - 1];
if (altHeader != NULL) {
- Scene_ProcessHeader(play, Lib_SegmentedToVirtual(altHeader));
+ Scene_ExecuteCommands(play, Lib_SegmentedToVirtual(altHeader));
(cmd + 1)->base.code = 0x14;
}
}
}
-// SceneTableEntry Header Command 0x17: Cutscene List
-void Scene_HeaderCmdCutsceneList(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_HeaderCmdActorCutsceneList(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
-void Scene_HeaderCmdMiniMap(PlayState* play, SceneCmd* cmd) {
+void Scene_CommandMiniMap(PlayState* play, SceneCmd* cmd) {
func_80104CF4(play);
func_8010549C(play, cmd->minimapSettings.segment);
}
// SceneTableEntry Header Command 0x1D: Undefined
-void Scene_HeaderCmd1D(PlayState* play, SceneCmd* cmd) {
+void Scene_Command1D(PlayState* play, SceneCmd* cmd) {
}
// SceneTableEntry Header Command 0x1E: Minimap Compass Icon Info
-void Scene_HeaderCmdMiniMapCompassInfo(PlayState* play, SceneCmd* cmd) {
+void Scene_CommandMiniMapCompassInfo(PlayState* play, SceneCmd* cmd) {
func_8010565C(play, cmd->minimapChests.num, cmd->minimapChests.segment);
}
// SceneTableEntry Header Command 0x19: Sets Region Visited Flag
-void Scene_HeaderCmdSetRegionVisitedFlag(PlayState* play, SceneCmd* cmd) {
+void Scene_CommandSetRegionVisitedFlag(PlayState* play, SceneCmd* cmd) {
s16 j = 0;
s16 i = 0;
@@ -519,14 +532,14 @@ void Scene_HeaderCmdSetRegionVisitedFlag(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;
}
}
// SceneTableEntry Header Command 0x1A: Material Animations
-void Scene_HeaderCmdAnimatedMaterials(PlayState* play, SceneCmd* cmd) {
- play->sceneMaterialAnims = (AnimatedMaterial*)Lib_SegmentedToVirtual(cmd->textureAnimations.segment);
+void Scene_CommandAnimatedMaterials(PlayState* play, SceneCmd* cmd) {
+ play->sceneMaterialAnims = Lib_SegmentedToVirtual(cmd->textureAnimations.segment);
}
/**
@@ -536,57 +549,58 @@ void Scene_SetExitFade(PlayState* play) {
play->transitionType = Entrance_GetTransitionFlags(play->nextEntrance) & 0x7F;
}
+void (*sSceneCmdHandlers[SCENE_CMD_MAX])(PlayState*, SceneCmd*) = {
+ Scene_CommandSpawnList, // SCENE_CMD_ID_SPAWN_LIST
+ Scene_CommandActorList, // SCENE_CMD_ID_ACTOR_LIST
+ Scene_CommandActorCutsceneCamList, // SCENE_CMD_ID_ACTOR_CUTSCENE_CAM_LIST
+ Scene_CommandCollisionHeader, // SCENE_CMD_ID_COL_HEADER
+ Scene_CommandRoomList, // SCENE_CMD_ID_ROOM_LIST
+ Scene_CommandWindSettings, // SCENE_CMD_ID_WIND_SETTINGS
+ Scene_CommandEntranceList, // SCENE_CMD_ID_ENTRANCE_LIST
+ Scene_CommandSpecialFiles, // SCENE_CMD_ID_SPECIAL_FILES
+ Scene_CommandRoomBehavior, // SCENE_CMD_ID_ROOM_BEHAVIOR
+ Scene_Command09, // SCENE_CMD_ID_UNK_09
+ Scene_CommandMesh, // SCENE_CMD_ID_ROOM_SHAPE
+ Scene_CommandObjectList, // SCENE_CMD_ID_OBJECT_LIST
+ Scene_CommandLightList, // SCENE_CMD_ID_LIGHT_LIST
+ Scene_CommandPathList, // SCENE_CMD_ID_PATH_LIST
+ Scene_CommandTransiActorList, // SCENE_CMD_ID_TRANSI_ACTOR_LIST
+ Scene_CommandEnvLightSettings, // SCENE_CMD_ID_ENV_LIGHT_SETTINGS
+ Scene_CommandTimeSettings, // SCENE_CMD_ID_TIME_SETTINGS
+ Scene_CommandSkyboxSettings, // SCENE_CMD_ID_SKYBOX_SETTINGS
+ Scene_CommandSkyboxDisables, // SCENE_CMD_ID_SKYBOX_DISABLES
+ Scene_CommandExitList, // SCENE_CMD_ID_EXIT_LIST
+ NULL, // SCENE_CMD_ID_END
+ Scene_CommandSoundSettings, // SCENE_CMD_ID_SOUND_SETTINGS
+ Scene_CommandEchoSetting, // SCENE_CMD_ID_ECHO_SETTINGS
+ Scene_CommandCutsceneScriptList, // SCENE_CMD_ID_CUTSCENE_SCRIPT_LIST
+ Scene_CommandAltHeaderList, // SCENE_CMD_ID_ALTERNATE_HEADER_LIST
+ Scene_CommandSetRegionVisitedFlag, // SCENE_CMD_ID_SET_REGION_VISITED
+ Scene_CommandAnimatedMaterials, // SCENE_CMD_ID_ANIMATED_MATERIAL_LIST
+ Scene_CommandCutsceneList, // SCENE_CMD_ID_ACTOR_CUTSCENE_LIST
+ Scene_CommandMiniMap, // SCENE_CMD_ID_MINIMAP_INFO
+ Scene_Command1D, // SCENE_CMD_ID_UNUSED_1D
+ Scene_CommandMiniMapCompassInfo, // SCENE_CMD_ID_MINIMAP_COMPASS_ICON_INFO
+};
+
/**
* Executes all of the commands in a scene or room header.
*/
-s32 Scene_ProcessHeader(PlayState* play, SceneCmd* header) {
- static void (*sceneCmdHandlers[])(PlayState*, SceneCmd*) = {
- Scene_HeaderCmdSpawnList,
- Scene_HeaderCmdActorList,
- Scene_HeaderCmdActorCutsceneCamList,
- Scene_HeaderCmdColHeader,
- Scene_HeaderCmdRoomList,
- Scene_HeaderCmdWindSettings,
- Scene_HeaderCmdEntranceList,
- Scene_HeaderCmdSpecialFiles,
- Scene_HeaderCmdRoomBehavior,
- Scene_HeaderCmd09,
- Scene_HeaderCmdMesh,
- Scene_HeaderCmdObjectList,
- Scene_HeaderCmdLightList,
- Scene_HeaderCmdPathList,
- Scene_HeaderCmdTransiActorList,
- Scene_HeaderCmdEnvLightSettings,
- Scene_HeaderCmdTimeSettings,
- Scene_HeaderCmdSkyboxSettings,
- Scene_HeaderCmdSkyboxDisables,
- Scene_HeaderCmdExitList,
- NULL,
- Scene_HeaderCmdSoundSettings,
- Scene_HeaderCmdEchoSetting,
- Scene_HeaderCmdCutsceneList,
- Scene_HeaderCmdAltHeaderList,
- Scene_HeaderCmdSetRegionVisitedFlag,
- Scene_HeaderCmdAnimatedMaterials,
- Scene_HeaderCmdActorCutsceneList,
- Scene_HeaderCmdMiniMap,
- Scene_HeaderCmd1D,
- Scene_HeaderCmdMiniMapCompassInfo,
- };
+s32 Scene_ExecuteCommands(PlayState* play, SceneCmd* sceneCmd) {
u32 cmdId;
while (true) {
- cmdId = header->base.code;
+ cmdId = sceneCmd->base.code;
if (cmdId == SCENE_CMD_ID_END) {
break;
}
if (cmdId < SCENE_CMD_MAX) {
- sceneCmdHandlers[cmdId](play, header);
+ sSceneCmdHandlers[cmdId](play, sceneCmd);
}
- header++;
+ sceneCmd++;
}
return 0;
@@ -600,7 +614,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 c899b4d83..2daa0ee78 100644
--- a/src/code/z_scene_proc.c
+++ b/src/code/z_scene_proc.c
@@ -1,3 +1,4 @@
+#include "prevent_bss_reordering.h"
#include "global.h"
s32 sMatAnimStep;
@@ -400,7 +401,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 318f49809..675487072 100644
--- a/src/code/z_skelanime.c
+++ b/src/code/z_skelanime.c
@@ -2,17 +2,24 @@
#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,
@@ -43,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;
@@ -629,7 +636,8 @@ void SkelAnime_GetFrameData(AnimationHeader* animation, s32 frame, s32 limbCount
frameTable->x = jointIndices->x >= staticIndexMax ? dynamicData[jointIndices->x] : frameData[jointIndices->x];
frameTable->y = jointIndices->y >= staticIndexMax ? dynamicData[jointIndices->y] : frameData[jointIndices->y];
frameTable->z = jointIndices->z >= staticIndexMax ? dynamicData[jointIndices->z] : frameData[jointIndices->z];
- jointIndices++, frameTable++;
+ jointIndices++;
+ frameTable++;
}
}
@@ -874,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];
@@ -899,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;
@@ -908,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;
@@ -917,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;
@@ -977,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;
}
@@ -987,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);
}
}
@@ -1078,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;
@@ -1183,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;
@@ -1213,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) {
@@ -1224,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) {
@@ -1285,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;
@@ -1296,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;
@@ -1322,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;
}
/**
@@ -1335,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;
}
@@ -1371,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);
@@ -1455,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);
@@ -1472,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);
}
/**
@@ -1505,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);
@@ -1576,7 +1590,7 @@ void SkelAnime_InitSkin(GameState* gameState, SkelAnime* skelAnime, SkeletonHead
skelAnime->morphTable = ZeldaArena_Malloc(sizeof(*skelAnime->morphTable) * skelAnime->limbCount);
// Debug prints here, required to match.
- if (1) {};
+ if (1) {}
if (animation != NULL) {
Animation_PlayLoop(skelAnime, animation);
@@ -1618,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;
}
/**
@@ -1652,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;
}
/**
@@ -1666,7 +1680,8 @@ void SkelAnime_AnimateFrame(SkelAnime* skelAnime) {
s32 frame = skelAnime->curFrame;
f32 partialFrame = skelAnime->curFrame - frame;
- if (++frame >= (s32)skelAnime->animLength) {
+ frame++;
+ if (frame >= (s32)skelAnime->animLength) {
frame = 0;
}
SkelAnime_GetFrameData(skelAnime->animation, frame, skelAnime->limbCount, nextjointTable);
@@ -1699,7 +1714,7 @@ s32 SkelAnime_LoopFull(SkelAnime* skelAnime) {
}
SkelAnime_AnimateFrame(skelAnime);
- return 0;
+ return false;
}
/**
@@ -1716,7 +1731,7 @@ s32 SkelAnime_LoopPartial(SkelAnime* skelAnime) {
}
SkelAnime_AnimateFrame(skelAnime);
- return 0;
+ return false;
}
/**
@@ -1728,7 +1743,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;
@@ -1744,7 +1759,7 @@ s32 SkelAnime_Once(SkelAnime* skelAnime) {
}
}
SkelAnime_AnimateFrame(skelAnime);
- return 0;
+ return false;
}
/**
@@ -1929,7 +1944,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 0d3e0bf85..5569c886b 100644
--- a/src/code/z_skin.c
+++ b/src/code/z_skin.c
@@ -1,10 +1,11 @@
+#include "prevent_bss_reordering.h"
#include "global.h"
#include "z64skin.h"
// 60 is an arbitrary number which specifies the max amount of limbs per skeleton this system supports
MtxF gSkinLimbMatrices[60];
-static s32 sUnused;
+static s32 sBssPad;
void Skin_UpdateVertices(MtxF* mtx, SkinVertex* skinVertices, SkinLimbModif* modifEntry, Vtx* vtxBuf, Vec3f* pos) {
SkinVertex* vertexEntry;
diff --git a/src/code/z_snap.c b/src/code/z_snap.c
index d64cfbe6e..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,10 +42,6 @@ s32 Snap_RecordPictographedActors(PlayState* play) {
break;
}
- if (actor->id) {
- ; // Needed to match
- }
-
// Actors which may be pictographed anywhere
switch (actor->id) {
case ACTOR_EN_KAKASI:
@@ -72,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++;
}
}
}
@@ -92,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);
}
}
@@ -113,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_sound_source.c b/src/code/z_sound_source.c
index 15ebd018a..3a5a31c59 100644
--- a/src/code/z_sound_source.c
+++ b/src/code/z_sound_source.c
@@ -1,11 +1,12 @@
#include "global.h"
+#include "z64sound_source.h"
void SoundSource_InitAll(PlayState* play) {
SoundSource* sources = &play->soundSources[0];
s32 i;
// clang-format off
- for (i = 0; i < ARRAY_COUNT(play->soundSources); i++) { sources[i].countdown = 0; }
+ for (i = 0; i < SOUND_SOURCE_COUNT; i++) { sources[i].countdown = 0; }
// clang-format on
}
@@ -13,14 +14,14 @@ void SoundSource_UpdateAll(PlayState* play) {
SoundSource* source = &play->soundSources[0];
s32 i;
- for (i = 0; i < ARRAY_COUNT(play->soundSources); i++) {
+ for (i = 0; i < SOUND_SOURCE_COUNT; i++) {
if (source->countdown != 0) {
if (DECR(source->countdown) == 0) {
AudioSfx_StopByPos(&source->projectedPos);
} else {
SkinMatrix_Vec3fMtxFMultXYZ(&play->viewProjectionMtxF, &source->worldPos, &source->projectedPos);
if (source->playSfxEachFrame) {
- Audio_PlaySfxAtPos(&source->projectedPos, source->sfxId);
+ Audio_PlaySfx_AtPos(&source->projectedPos, source->sfxId);
}
}
}
@@ -37,7 +38,7 @@ void SoundSource_Add(PlayState* play, Vec3f* worldPos, u32 duration, u16 sfxId,
s32 i;
source = &play->soundSources[0];
- for (i = 0; i < ARRAY_COUNT(play->soundSources); i++) {
+ for (i = 0; i < SOUND_SOURCE_COUNT; i++) {
if (source->countdown == 0) {
break;
}
@@ -52,7 +53,7 @@ void SoundSource_Add(PlayState* play, Vec3f* worldPos, u32 duration, u16 sfxId,
}
// If no sound source is available, replace the sound source with the smallest remaining countdown
- if (i >= ARRAY_COUNT(play->soundSources)) {
+ if (i >= SOUND_SOURCE_COUNT) {
source = backupSource;
AudioSfx_StopByPos(&source->projectedPos);
}
@@ -63,7 +64,7 @@ void SoundSource_Add(PlayState* play, Vec3f* worldPos, u32 duration, u16 sfxId,
source->sfxId = sfxId;
SkinMatrix_Vec3fMtxFMultXYZ(&play->viewProjectionMtxF, &source->worldPos, &source->projectedPos);
- Audio_PlaySfxAtPos(&source->projectedPos, sfxId);
+ Audio_PlaySfx_AtPos(&source->projectedPos, sfxId);
}
void SoundSource_PlaySfxAtFixedWorldPos(PlayState* play, Vec3f* worldPos, u32 duration, u16 sfxId) {
diff --git a/src/code/z_sram_NES.c b/src/code/z_sram_NES.c
index 94d0e69c3..01a493cc0 100644
--- a/src/code/z_sram_NES.c
+++ b/src/code/z_sram_NES.c
@@ -1,7 +1,8 @@
#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);
@@ -9,173 +10,127 @@ 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 PersistentCycleSceneFlags {
+ /* 0x0 */ u32 switch0;
+ /* 0x4 */ u32 switch1;
+ /* 0x8 */ u32 chest;
+ /* 0xC */ u32 collectible;
+} PersistentCycleSceneFlags; // 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)
+ */
+PersistentCycleSceneFlags sPersistentCycleSceneFlags[SCENE_MAX] = {
+#include "tables/scene_table.h"
};
-// TODO: figure out a way to use the WEEKEVENTREG defines here
+#undef DEFINE_SCENE
+#undef DEFINE_SCENE_UNSET
+
+// Each flag has 2 bits to store persistence over the three-day reset cycle
+// Only 1 of these bits need to be set to persist (Values 1, 2, 3).
+// Therefore, the final game does not distinguish between these two macros in use
+#define PERSISTENT_WEEKEVENTREG(flag) (3 << (2 * BIT_FLAG_TO_SHIFT(flag)))
+#define PERSISTENT_WEEKEVENTREG_ALT(flag) (2 << (2 * BIT_FLAG_TO_SHIFT(flag)))
+
// weekEventReg flags which will be not be cleared on a cycle reset
-u16 D_801C66D0[ARRAY_COUNT(gSaveContext.save.weekEventReg)] = {
- /* 0 */ 0xFFFC,
- /* 1 */ 0xFFFF,
- /* 2 */ 0xFFFF,
- /* 3 */ 0xFFFF,
+//! @note The index of the flag in this array must be the same to its index in the WeekeventReg array
+//! Only the mask is read from the `PERSISTENT_` macros.
+u16 sPersistentCycleWeekEventRegs[ARRAY_COUNT(gSaveContext.save.saveInfo.weekEventReg)] = {
+ /* 0 */
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_TERMINA_FIELD) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_IKANA_GRAVEYARD) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_ROMANI_RANCH) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_GORMAN_TRACK) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_MOUNTAIN_VILLAGE_WINTER) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_GORON_SHRINE) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_SNOWHEAD),
+ /* 1 */
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_SOUTHERN_SWAMP_POISONED) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_WOODFALL) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_DEKU_PALACE) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_GREAT_BAY_COAST) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_PIRATES_FORTRESS) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_ZORA_HALL) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_WATERFALL_RAPIDS) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_IKANA_CANYON),
+ /* 2 */
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_IKANA_CASTLE) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_STONE_TOWER) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_STONE_TOWER_INVERTED) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_EAST_CLOCK_TOWN) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_WEST_CLOCK_TOWN) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_NORTH_CLOCK_TOWN) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_WOODFALL_TEMPLE) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_SNOWHEAD_TEMPLE),
+ /* 3 */
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_PIRATES_FORTRESS_EXTERIOR) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_STONE_TOWER_TEMPLE) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_STONE_TOWER_TEMPLE_INVERTED) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_THE_MOON) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_MOON_DEKU_TRIAL) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_MOON_GORON_TRIAL) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_MOON_ZORA_TRIAL) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_03_80),
/* 4 */ 0,
/* 5 */ 0,
/* 6 */ 0,
- /* 7 */ 0xC000,
- /* 8 */ 0xC00,
+ /* 7 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_WOODFALL_TEMPLE_PRISON),
+ /* 8 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_DOGGY_RACETRACK_HEART_PIECE),
/* 9 */ 0,
- /* 10 */ 0xC0,
+ /* 10 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_10_08),
/* 11 */ 0,
- /* 12 */ 0x300,
- /* 13 */ 0x3000,
- /* 14 */ 0xC000,
- /* 15 */ 0xC00,
+ /* 12 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_KOTAKE_BOTTLE),
+ /* 13 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_OCEANSIDE_WALLET_UPGRADE),
+ /* 14 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_DEKU_PLAYGROUND_HEART_PIECE),
+ /* 15 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_15_20),
/* 16 */ 0,
/* 17 */ 0,
/* 18 */ 0,
/* 19 */ 0,
/* 20 */ 0,
/* 21 */ 0,
- /* 22 */ 0xC00C,
- /* 23 */ 0xC00C,
- /* 24 */ 0xC008,
- /* 25 */ 3,
- /* 26 */ 0x3000,
+ /* 22 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_22_02) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_22_80),
+ /* 23 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_OBTAINED_GREAT_SPIN_ATTACK) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_23_80),
+ /* 24 */ PERSISTENT_WEEKEVENTREG_ALT(WEEKEVENTREG_24_02) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_24_80),
+ /* 25 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_25_01),
+ /* 26 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_26_40),
/* 27 */ 0,
/* 28 */ 0,
/* 29 */ 0,
- /* 30 */ 0xFF00,
- /* 31 */ 0xC3F,
- /* 32 */ 0x3F,
+ /* 30 */
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_30_10) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_30_20) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_30_40) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_30_80),
+ /* 31 */
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_31_01) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_31_02) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_31_04) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_31_20),
+ /* 32 */
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_32_01) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_SWAMP_SHOOTING_GALLERY_HEART_PIECE) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_TOWN_SHOOTING_GALLERY_HEART_PIECE),
/* 33 */ 0,
/* 34 */ 0,
- /* 35 */ 0xCFFF,
+ /* 35 */
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_TINGLE_MAP_BOUGHT_CLOCK_TOWN) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_TINGLE_MAP_BOUGHT_WOODFALL) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_TINGLE_MAP_BOUGHT_SNOWHEAD) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_TINGLE_MAP_BOUGHT_ROMANI_RANCH) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_TINGLE_MAP_BOUGHT_GREAT_BAY) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_TINGLE_MAP_BOUGHT_STONE_TOWER) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_35_80),
/* 36 */ 0,
/* 37 */ 0,
- /* 38 */ 0xC00,
- /* 39 */ 0xC00,
+ /* 38 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_38_20),
+ /* 39 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_39_20),
/* 40 */ 0,
- /* 41 */ 0xC0,
+ /* 41 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_41_08),
/* 42 */ 0,
/* 43 */ 0,
/* 44 */ 0,
@@ -184,50 +139,112 @@ u16 D_801C66D0[ARRAY_COUNT(gSaveContext.save.weekEventReg)] = {
/* 47 */ 0,
/* 48 */ 0,
/* 49 */ 0,
- /* 50 */ 0x3C,
- /* 51 */ 0x20,
+ /* 50 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_50_02) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_50_04),
+ /* 51 */ PERSISTENT_WEEKEVENTREG_ALT(WEEKEVENTREG_51_04),
/* 52 */ 0,
- /* 53 */ 0x300C,
- /* 54 */ 0x3000,
+ /* 53 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_53_02) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_53_40),
+ /* 54 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_54_40),
/* 55 */ 0,
- /* 56 */ 0xC,
- /* 57 */ 0xC0,
+ /* 56 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_56_02),
+ /* 57 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_57_08),
/* 58 */ 0,
- /* 59 */ 0xFF0,
- /* 60 */ 0x300,
+ /* 59 */
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_59_04) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_59_08) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_SWAMP_SHOOTING_GALLERY_QUIVER_UPGRADE) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_TOWN_SHOOTING_GALLERY_QUIVER_UPGRADE),
+ /* 60 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_60_10),
/* 61 */ 0,
/* 62 */ 0,
- /* 63 */ 0xC00,
+ /* 63 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_63_20),
/* 64 */ 0,
/* 65 */ 0,
- /* 66 */ 0xFFFF,
- /* 67 */ 0xFFFF,
- /* 68 */ 0xFFFF,
- /* 69 */ 0xFFFF,
- /* 70 */ 0xFFFF,
- /* 71 */ 0xFFFF,
- /* 72 */ 0xFFFF,
- /* 73 */ 0xC0,
+ /* 66 */
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ANJU) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_KAFEI) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_BOMB_SHOP_LADY) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ROMANI) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_CREMIA) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_MAYOR_DOTOUR) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_MADAME_AROMA),
+ /* 67 */
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_TOTO) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GORMAN) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_POSTMAN) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ROSA_SISTERS) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_TOILET_HAND) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ANJUS_GRANDMOTHER) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_KAMARO) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GROG),
+ /* 68 */
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_SHIRO) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GURU_GURU) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_BOMBERS) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROOM_KEY) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_MIDNIGHT_MEETING) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_MEET_KAFEI) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_LETTER_TO_KAFEI),
+ /* 69 */
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DEPOSITED_LETTER_TO_KAFEI) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_PENDANT_OF_MEMORIES) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DELIVERED_PENDANT_OF_MEMORIES) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_ESCAPED_SAKONS_HIDEOUT) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_HELP_WITH_THEM) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DEFENDED_AGAINST_THEM) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_MILK_BOTTLE) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_ESCORTED_CREMIA),
+ /* 70 */
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROMANIS_MASK) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KEATON_MASK) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_PRIORITY_MAIL) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DELIVERED_PRIORITY_MAIL) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_MAYOR_HP) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROSA_SISTERS_HP),
+ /* 71 */
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_TOILET_HAND_HP) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_SHORT_STORY_HP) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_LONG_STORY_HP) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMAN_HP) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAFEIS_MASK) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ALL_NIGHT_MASK) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK),
+ /* 72 */
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMANS_HAT) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_COUPLES_MASK) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BLAST_MASK) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BREMEN_MASK) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_72_80),
+ /* 73 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_73_08),
/* 74 */ 0,
- /* 75 */ 0xC000,
+ /* 75 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_75_80),
/* 76 */ 0,
- /* 77 */ 3,
+ /* 77 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_77_01),
/* 78 */ 0,
- /* 79 */ 0xC000,
+ /* 79 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_79_80),
/* 80 */ 0,
- /* 81 */ 0xC0,
- /* 82 */ 0x300,
+ /* 81 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_81_08),
+ /* 82 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_82_10),
/* 83 */ 0,
/* 84 */ 0,
/* 85 */ 0,
- /* 86 */ 0xC000,
- /* 87 */ 0xFFF0,
+ /* 86 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_86_80),
+ /* 87 */
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_87_04) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_87_08) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_87_10) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_87_20) |
+ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_87_40) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_87_80),
/* 88 */ 0,
/* 89 */ 0,
- /* 90 */ 0x300,
+ /* 90 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_90_10),
/* 91 */ 0,
- /* 92 */ 0xC000,
- /* 93 */ 0xF0,
+ /* 92 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_92_80),
+ /* 93 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_93_04) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_93_08),
/* 94 */ 0,
/* 95 */ 0,
/* 96 */ 0,
@@ -236,83 +253,159 @@ 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[] = {
- ITEM_NONE, // SLOT_OCARINA
- ITEM_BOW, // SLOT_BOW
- ITEM_NONE, // SLOT_ARROW_FIRE
- ITEM_NONE, // SLOT_ARROW_ICE
- ITEM_NONE, // SLOT_ARROW_LIGHT
- ITEM_NONE, // SLOT_TRADE_DEED
- ITEM_BOMB, // SLOT_BOMB
- ITEM_BOMBCHU, // SLOT_BOMBCHU
- ITEM_STICK, // SLOT_STICK
- ITEM_NUT, // SLOT_NUT
- ITEM_MAGIC_BEANS, // SLOT_MAGIC_BEANS
- ITEM_NONE, // SLOT_TRADE_KEY_MAMA
- ITEM_POWDER_KEG, // SLOT_POWDER_KEG
- ITEM_PICTO_BOX, // SLOT_PICTO_BOX
- ITEM_NONE, // SLOT_LENS
- ITEM_NONE, // SLOT_HOOKSHOT
- ITEM_NONE, // SLOT_SWORD_GREAT_FAIRY
- ITEM_NONE, // SLOT_TRADE_COUPLE
- ITEM_NONE, // SLOT_BOTTLE_1
- ITEM_NONE, // SLOT_BOTTLE_2
- ITEM_NONE, // SLOT_BOTTLE_3
- ITEM_NONE, // SLOT_BOTTLE_4
- ITEM_NONE, // SLOT_BOTTLE_5
- ITEM_NONE, // SLOT_BOTTLE_6
+ ITEM_NONE, // SLOT_OCARINA
+ ITEM_BOW, // SLOT_BOW
+ ITEM_NONE, // SLOT_ARROW_FIRE
+ ITEM_NONE, // SLOT_ARROW_ICE
+ ITEM_NONE, // SLOT_ARROW_LIGHT
+ ITEM_NONE, // SLOT_TRADE_DEED
+ ITEM_BOMB, // SLOT_BOMB
+ ITEM_BOMBCHU, // SLOT_BOMBCHU
+ ITEM_DEKU_STICK, // SLOT_DEKU_STICK
+ ITEM_DEKU_NUT, // SLOT_DEKU_NUT
+ ITEM_MAGIC_BEANS, // SLOT_MAGIC_BEANS
+ ITEM_NONE, // SLOT_TRADE_KEY_MAMA
+ ITEM_POWDER_KEG, // SLOT_POWDER_KEG
+ ITEM_PICTOGRAPH_BOX, // SLOT_PICTOGRAPH_BOX
+ ITEM_NONE, // SLOT_LENS_OF_TRUTH
+ ITEM_NONE, // SLOT_HOOKSHOT
+ ITEM_NONE, // SLOT_SWORD_GREAT_FAIRY
+ ITEM_NONE, // SLOT_TRADE_COUPLE
+ ITEM_NONE, // SLOT_BOTTLE_1
+ ITEM_NONE, // SLOT_BOTTLE_2
+ ITEM_NONE, // SLOT_BOTTLE_3
+ ITEM_NONE, // SLOT_BOTTLE_4
+ ITEM_NONE, // SLOT_BOTTLE_5
+ 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
+};
+
+// Bit Flag array in which sBitFlags8[n] is (1 << n)
+u8 sBitFlags8[] = {
+ (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);
- SET_TOWN_SHOOTING_GALLERY_HIGH_SCORE(39);
- SET_SWAMP_SHOOTING_GALLERY_HIGH_SCORE(10);
+ HS_SET_BOAT_ARCHERY_HIGH_SCORE(19);
+ HS_SET_HIGH_SCORE_3_LOWER(10);
+ HS_SET_HORSE_BACK_BALLOON_TIME(SECONDS_TO_TIMER(60));
+ HS_SET_TOWN_SHOOTING_GALLERY_HIGH_SCORE(39);
+ HS_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);
}
/**
@@ -337,33 +430,36 @@ void Sram_SaveEndOfCycle(PlayState* play) {
u8 item;
gSaveContext.save.timeSpeedOffset = 0;
- gSaveContext.save.daysElapsed = 0;
+ gSaveContext.save.eventDayCount = 0;
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 &= sPersistentCycleSceneFlags[sceneId].chest;
+ play->actorCtx.sceneFlags.switches[0] &= sPersistentCycleSceneFlags[sceneId].switch0;
+ play->actorCtx.sceneFlags.switches[1] &= sPersistentCycleSceneFlags[sceneId].switch1;
+ play->actorCtx.sceneFlags.collectible[0] &= sPersistentCycleSceneFlags[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) & sPersistentCycleSceneFlags[i].switch0;
+ gSaveContext.cycleSceneFlags[i].switch1 =
+ ((void)0, gSaveContext.cycleSceneFlags[i].switch1) & sPersistentCycleSceneFlags[i].switch1;
+ gSaveContext.cycleSceneFlags[i].chest =
+ ((void)0, gSaveContext.cycleSceneFlags[i].chest) & sPersistentCycleSceneFlags[i].chest;
gSaveContext.cycleSceneFlags[i].collectible =
- ((void)0, gSaveContext.cycleSceneFlags[i].collectible) & D_801C5FC0[i][3];
+ ((void)0, gSaveContext.cycleSceneFlags[i].collectible) & sPersistentCycleSceneFlags[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++) {
@@ -382,15 +478,15 @@ void Sram_SaveEndOfCycle(PlayState* play) {
Inventory_DeleteItem(ITEM_MASK_FIERCE_DEITY, SLOT(ITEM_MASK_FIERCE_DEITY));
}
- for (i = 0; i < ARRAY_COUNT(D_801C66D0); i++) {
- u16 phi_v1_3 = D_801C66D0[i];
+ for (i = 0; i < ARRAY_COUNT(sPersistentCycleWeekEventRegs); i++) {
+ u16 isPersistentBits = sPersistentCycleWeekEventRegs[i];
- 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]);
+ for (j = 0; j < ARRAY_COUNT(sBitFlags8); j++) {
+ if (!(isPersistentBits & 3)) {
+ gSaveContext.save.saveInfo.weekEventReg[i] =
+ ((void)0, gSaveContext.save.saveInfo.weekEventReg[i]) & (0xFF ^ sBitFlags8[j]);
}
- phi_v1_3 >>= 2;
+ isPersistentBits >>= 2;
}
}
@@ -398,45 +494,45 @@ void Sram_SaveEndOfCycle(PlayState* play) {
gSaveContext.eventInf[i] = 0;
}
- CLEAR_EVENTINF(EVENTINF_70);
- CLEAR_EVENTINF(EVENTINF_71);
- CLEAR_EVENTINF(EVENTINF_72);
- CLEAR_EVENTINF(EVENTINF_73);
- CLEAR_EVENTINF(EVENTINF_74);
+ CLEAR_EVENTINF(EVENTINF_THREEDAYRESET_LOST_RUPEES);
+ CLEAR_EVENTINF(EVENTINF_THREEDAYRESET_LOST_BOMB_AMMO);
+ CLEAR_EVENTINF(EVENTINF_THREEDAYRESET_LOST_NUT_AMMO);
+ CLEAR_EVENTINF(EVENTINF_THREEDAYRESET_LOST_STICK_AMMO);
+ CLEAR_EVENTINF(EVENTINF_THREEDAYRESET_LOST_ARROW_AMMO);
- if (gSaveContext.save.playerData.rupees != 0) {
- SET_EVENTINF(EVENTINF_70);
+ if (gSaveContext.save.saveInfo.playerData.rupees != 0) {
+ SET_EVENTINF(EVENTINF_THREEDAYRESET_LOST_RUPEES);
}
if (INV_CONTENT(ITEM_BOMB) == ITEM_BOMB) {
item = INV_CONTENT(ITEM_BOMB);
if (AMMO(item) != 0) {
- SET_EVENTINF(EVENTINF_71);
+ SET_EVENTINF(EVENTINF_THREEDAYRESET_LOST_BOMB_AMMO);
}
}
- if (INV_CONTENT(ITEM_NUT) == ITEM_NUT) {
- item = INV_CONTENT(ITEM_NUT);
+ if (INV_CONTENT(ITEM_DEKU_NUT) == ITEM_DEKU_NUT) {
+ item = INV_CONTENT(ITEM_DEKU_NUT);
if (AMMO(item) != 0) {
- SET_EVENTINF(EVENTINF_72);
+ SET_EVENTINF(EVENTINF_THREEDAYRESET_LOST_NUT_AMMO);
}
}
- if (INV_CONTENT(ITEM_STICK) == ITEM_STICK) {
- item = INV_CONTENT(ITEM_STICK);
+ if (INV_CONTENT(ITEM_DEKU_STICK) == ITEM_DEKU_STICK) {
+ item = INV_CONTENT(ITEM_DEKU_STICK);
if (AMMO(item) != 0) {
- SET_EVENTINF(EVENTINF_73);
+ SET_EVENTINF(EVENTINF_THREEDAYRESET_LOST_STICK_AMMO);
}
}
if (INV_CONTENT(ITEM_BOW) == ITEM_BOW) {
item = INV_CONTENT(ITEM_BOW);
if (AMMO(item) != 0) {
- SET_EVENTINF(EVENTINF_74);
+ SET_EVENTINF(EVENTINF_THREEDAYRESET_LOST_ARROW_AMMO);
}
}
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_PICTOGRAPH_BOX)) {
+ item = gSaveContext.save.saveInfo.inventory.items[i];
AMMO(item) = 0;
}
}
@@ -444,23 +540,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) {
@@ -490,8 +586,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;
}
}
@@ -500,8 +596,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;
}
}
@@ -515,54 +611,54 @@ void Sram_SaveEndOfCycle(PlayState* play) {
Inventory_DeleteItem(ITEM_LONGSHOT, SLOT_TRADE_COUPLE);
for (j = EQUIP_SLOT_C_LEFT; j <= EQUIP_SLOT_C_RIGHT; j++) {
- if (GET_CUR_FORM_BTN_ITEM(j) >= ITEM_MOON_TEAR && GET_CUR_FORM_BTN_ITEM(j) <= ITEM_PENDANT_OF_MEMORIES) {
+ if ((GET_CUR_FORM_BTN_ITEM(j) >= ITEM_MOONS_TEAR) && (GET_CUR_FORM_BTN_ITEM(j) <= ITEM_PENDANT_OF_MEMORIES)) {
SET_CUR_FORM_BTN_ITEM(j, ITEM_NONE);
Interface_LoadItemIconImpl(play, j);
}
}
- 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.scarecrowSpawnSongSet = false;
gSaveContext.powderKegTimer = 0;
gSaveContext.unk_1014 = 0;
gSaveContext.jinxTimer = 0;
gSaveContext.rupeeAccumulator = 0;
- func_800F3B2C(play);
+ Horse_ResetHorseData(play);
}
void Sram_IncrementDay(void) {
if (CURRENT_DAY <= 3) {
gSaveContext.save.day++;
- gSaveContext.save.daysElapsed++;
+ gSaveContext.save.eventDayCount++;
}
- 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);
@@ -592,9 +688,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));
}
/**
@@ -614,15 +708,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++) {
@@ -635,7 +729,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;
}
@@ -643,9 +737,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) {
@@ -653,18 +747,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++;
}
}
@@ -672,7 +766,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
@@ -710,16 +804,91 @@ ItemEquips sSaveDefaultItemEquips = {
Inventory sSaveDefaultInventory = {
// items
{
- ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE,
- ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE,
- ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE,
- ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE,
- ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE,
+ ITEM_NONE, // SLOT_OCARINA
+ ITEM_NONE, // SLOT_BOW
+ ITEM_NONE, // SLOT_ARROW_FIRE
+ ITEM_NONE, // SLOT_ARROW_ICE
+ ITEM_NONE, // SLOT_ARROW_LIGHT
+ ITEM_NONE, // SLOT_TRADE_DEED
+ ITEM_NONE, // SLOT_BOMB
+ ITEM_NONE, // SLOT_BOMBCHU
+ ITEM_NONE, // SLOT_DEKU_STICK
+ ITEM_NONE, // SLOT_DEKU_NUT
+ ITEM_NONE, // SLOT_MAGIC_BEANS
+ ITEM_NONE, // SLOT_TRADE_KEY_MAMA
+ ITEM_NONE, // SLOT_POWDER_KEG
+ ITEM_NONE, // SLOT_PICTOGRAPH_BOX
+ ITEM_NONE, // SLOT_LENS_OF_TRUTH
+ ITEM_NONE, // SLOT_HOOKSHOT
+ ITEM_NONE, // SLOT_SWORD_GREAT_FAIRY
+ ITEM_NONE, // SLOT_TRADE_COUPLE
+ ITEM_NONE, // SLOT_BOTTLE_1
+ ITEM_NONE, // SLOT_BOTTLE_2
+ ITEM_NONE, // SLOT_BOTTLE_3
+ ITEM_NONE, // SLOT_BOTTLE_4
+ ITEM_NONE, // SLOT_BOTTLE_5
+ ITEM_NONE, // SLOT_BOTTLE_6
+ ITEM_NONE, // SLOT_MASK_POSTMAN
+ ITEM_NONE, // SLOT_MASK_ALL_NIGHT
+ ITEM_NONE, // SLOT_MASK_BLAST
+ ITEM_NONE, // SLOT_MASK_STONE
+ ITEM_NONE, // SLOT_MASK_GREAT_FAIRY
+ ITEM_NONE, // SLOT_MASK_DEKU
+ ITEM_NONE, // SLOT_MASK_KEATON
+ ITEM_NONE, // SLOT_MASK_BREMEN
+ ITEM_NONE, // SLOT_MASK_BUNNY
+ ITEM_NONE, // SLOT_MASK_DON_GERO
+ ITEM_NONE, // SLOT_MASK_SCENTS
+ ITEM_NONE, // SLOT_MASK_GORON
+ ITEM_NONE, // SLOT_MASK_ROMANI
+ ITEM_NONE, // SLOT_MASK_CIRCUS_LEADER
+ ITEM_NONE, // SLOT_MASK_KAFEIS_MASK
+ ITEM_NONE, // SLOT_MASK_COUPLE
+ ITEM_NONE, // SLOT_MASK_TRUTH
+ ITEM_NONE, // SLOT_MASK_ZORA
+ ITEM_NONE, // SLOT_MASK_KAMARO
+ ITEM_NONE, // SLOT_MASK_GIBDO
+ ITEM_NONE, // SLOT_MASK_GARO
+ ITEM_NONE, // SLOT_MASK_CAPTAIN
+ ITEM_NONE, // SLOT_MASK_GIANT
+ ITEM_NONE, // SLOT_MASK_FIERCE_DEITY
},
// ammo
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ {
+ 0, // SLOT_OCARINA
+ 0, // SLOT_BOW
+ 0, // SLOT_ARROW_FIRE
+ 0, // SLOT_ARROW_ICE
+ 0, // SLOT_ARROW_LIGHT
+ 0, // SLOT_TRADE_DEED
+ 0, // SLOT_BOMB
+ 0, // SLOT_BOMBCHU
+ 0, // SLOT_DEKU_STICK
+ 0, // SLOT_DEKU_NUT
+ 0, // SLOT_MAGIC_BEANS
+ 0, // SLOT_TRADE_KEY_MAMA
+ 0, // SLOT_POWDER_KEG
+ 0, // SLOT_PICTOGRAPH_BOX
+ 0, // SLOT_LENS_OF_TRUTH
+ 0, // SLOT_HOOKSHOT
+ 0, // SLOT_SWORD_GREAT_FAIRY
+ 0, // SLOT_TRADE_COUPLE
+ 0, // SLOT_BOTTLE_1
+ 0, // SLOT_BOTTLE_2
+ 0, // SLOT_BOTTLE_3
+ 0, // SLOT_BOTTLE_4
+ 0, // SLOT_BOTTLE_5
+ 0, // SLOT_BOTTLE_6
+ },
// upgrades
- 0x120000,
+ (0 << 0) | // UPG_QUIVER
+ (0 << 3) | // UPG_BOMB_BAG
+ (0 << 6) | // UPG_STRENGTH
+ (0 << 9) | // UPG_SCALE
+ (0 << 12) | // UPG_WALLET
+ (0 << 14) | // UPG_BULLET_BAG
+ (1 << 17) | // UPG_DEKU_STICKS
+ (1 << 20), // UPG_DEKU_NUTS
// questItems
0,
// dungeonItems
@@ -749,30 +918,31 @@ u16 sSaveDefaultChecksum = 0;
*/
void Sram_InitNewSave(void) {
gSaveContext.save.playerForm = PLAYER_FORM_HUMAN;
- gSaveContext.save.daysElapsed = 0;
+ gSaveContext.save.eventDayCount = 0;
gSaveContext.save.day = 0;
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
@@ -793,10 +963,10 @@ SavePlayerData sSaveDebugPlayerData = {
ItemEquips sSaveDebugItemEquips = {
{
- { ITEM_SWORD_KOKIRI, ITEM_BOW, ITEM_POTION_RED, ITEM_OCARINA },
- { ITEM_SWORD_KOKIRI, ITEM_BOW, ITEM_MASK_GORON, ITEM_OCARINA },
- { ITEM_SWORD_KOKIRI, ITEM_BOW, ITEM_MASK_ZORA, ITEM_OCARINA },
- { ITEM_NUT, ITEM_NUT, ITEM_MASK_DEKU, ITEM_OCARINA },
+ { ITEM_SWORD_KOKIRI, ITEM_BOW, ITEM_POTION_RED, ITEM_OCARINA_OF_TIME },
+ { ITEM_SWORD_KOKIRI, ITEM_BOW, ITEM_MASK_GORON, ITEM_OCARINA_OF_TIME },
+ { ITEM_SWORD_KOKIRI, ITEM_BOW, ITEM_MASK_ZORA, ITEM_OCARINA_OF_TIME },
+ { ITEM_DEKU_NUT, ITEM_DEKU_NUT, ITEM_MASK_DEKU, ITEM_OCARINA_OF_TIME },
},
{
{ SLOT_OCARINA, SLOT_BOW, SLOT_BOTTLE_2, SLOT_OCARINA },
@@ -810,66 +980,109 @@ ItemEquips sSaveDebugItemEquips = {
Inventory sSaveDebugInventory = {
// items
{
- ITEM_OCARINA,
- ITEM_BOW,
- ITEM_ARROW_FIRE,
- ITEM_ARROW_ICE,
- ITEM_ARROW_LIGHT,
- ITEM_MOON_TEAR,
- ITEM_BOMB,
- ITEM_BOMBCHU,
- ITEM_STICK,
- ITEM_NUT,
- ITEM_MAGIC_BEANS,
- ITEM_ROOM_KEY,
- ITEM_POWDER_KEG,
- ITEM_PICTO_BOX,
- ITEM_LENS,
- ITEM_HOOKSHOT,
- ITEM_SWORD_GREAT_FAIRY,
- ITEM_LETTER_TO_KAFEI,
- ITEM_BOTTLE,
- ITEM_POTION_RED,
- ITEM_POTION_GREEN,
- ITEM_POTION_BLUE,
- ITEM_NONE,
- ITEM_NONE,
- ITEM_MASK_POSTMAN,
- ITEM_MASK_ALL_NIGHT,
- ITEM_MASK_BLAST,
- ITEM_MASK_STONE,
- ITEM_MASK_GREAT_FAIRY,
- ITEM_MASK_DEKU,
- ITEM_MASK_KEATON,
- ITEM_MASK_BREMEN,
- ITEM_MASK_BUNNY,
- ITEM_MASK_DON_GERO,
- ITEM_MASK_SCENTS,
- ITEM_MASK_GORON,
- ITEM_MASK_ROMANI,
- ITEM_MASK_CIRCUS_LEADER,
- ITEM_MASK_KAFEIS_MASK,
- ITEM_MASK_COUPLE,
- ITEM_MASK_TRUTH,
- ITEM_MASK_ZORA,
- ITEM_MASK_KAMARO,
- ITEM_MASK_GIBDO,
- ITEM_MASK_GARO,
- ITEM_MASK_CAPTAIN,
- ITEM_MASK_GIANT,
- ITEM_MASK_FIERCE_DEITY,
+ ITEM_OCARINA_OF_TIME, // SLOT_OCARINA
+ ITEM_BOW, // SLOT_BOW
+ ITEM_ARROW_FIRE, // SLOT_ARROW_FIRE
+ ITEM_ARROW_ICE, // SLOT_ARROW_ICE
+ ITEM_ARROW_LIGHT, // SLOT_ARROW_LIGHT
+ ITEM_MOONS_TEAR, // SLOT_TRADE_DEED
+ ITEM_BOMB, // SLOT_BOMB
+ ITEM_BOMBCHU, // SLOT_BOMBCHU
+ ITEM_DEKU_STICK, // SLOT_DEKU_STICK
+ ITEM_DEKU_NUT, // SLOT_DEKU_NUT
+ ITEM_MAGIC_BEANS, // SLOT_MAGIC_BEANS
+ ITEM_ROOM_KEY, // SLOT_TRADE_KEY_MAMA
+ ITEM_POWDER_KEG, // SLOT_POWDER_KEG
+ ITEM_PICTOGRAPH_BOX, // SLOT_PICTOGRAPH_BOX
+ ITEM_LENS_OF_TRUTH, // SLOT_LENS_OF_TRUTH
+ ITEM_HOOKSHOT, // SLOT_HOOKSHOT
+ ITEM_SWORD_GREAT_FAIRY, // SLOT_SWORD_GREAT_FAIRY
+ ITEM_LETTER_TO_KAFEI, // SLOT_TRADE_COUPLE
+ ITEM_BOTTLE, // SLOT_BOTTLE_1
+ ITEM_POTION_RED, // SLOT_BOTTLE_2
+ ITEM_POTION_GREEN, // SLOT_BOTTLE_3
+ ITEM_POTION_BLUE, // SLOT_BOTTLE_4
+ ITEM_NONE, // SLOT_BOTTLE_5
+ ITEM_NONE, // SLOT_BOTTLE_6
+ ITEM_MASK_POSTMAN, // SLOT_MASK_POSTMAN
+ ITEM_MASK_ALL_NIGHT, // SLOT_MASK_ALL_NIGHT
+ ITEM_MASK_BLAST, // SLOT_MASK_BLAST
+ ITEM_MASK_STONE, // SLOT_MASK_STONE
+ ITEM_MASK_GREAT_FAIRY, // SLOT_MASK_GREAT_FAIRY
+ ITEM_MASK_DEKU, // SLOT_MASK_DEKU
+ ITEM_MASK_KEATON, // SLOT_MASK_KEATON
+ ITEM_MASK_BREMEN, // SLOT_MASK_BREMEN
+ ITEM_MASK_BUNNY, // SLOT_MASK_BUNNY
+ ITEM_MASK_DON_GERO, // SLOT_MASK_DON_GERO
+ ITEM_MASK_SCENTS, // SLOT_MASK_SCENTS
+ ITEM_MASK_GORON, // SLOT_MASK_GORON
+ ITEM_MASK_ROMANI, // SLOT_MASK_ROMANI
+ ITEM_MASK_CIRCUS_LEADER, // SLOT_MASK_CIRCUS_LEADER
+ ITEM_MASK_KAFEIS_MASK, // SLOT_MASK_KAFEIS_MASK
+ ITEM_MASK_COUPLE, // SLOT_MASK_COUPLE
+ ITEM_MASK_TRUTH, // SLOT_MASK_TRUTH
+ ITEM_MASK_ZORA, // SLOT_MASK_ZORA
+ ITEM_MASK_KAMARO, // SLOT_MASK_KAMARO
+ ITEM_MASK_GIBDO, // SLOT_MASK_GIBDO
+ ITEM_MASK_GARO, // SLOT_MASK_GARO
+ ITEM_MASK_CAPTAIN, // SLOT_MASK_CAPTAIN
+ ITEM_MASK_GIANT, // SLOT_MASK_GIANT
+ ITEM_MASK_FIERCE_DEITY, // SLOT_MASK_FIERCE_DEITY
},
// ammo
- { 1, 30, 1, 1, 1, 1, 30, 30, 30, 30, 1, 1, 1, 1, 30, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
+ {
+ 1, // SLOT_OCARINA
+ 30, // SLOT_BOW
+ 1, // SLOT_ARROW_FIRE
+ 1, // SLOT_ARROW_ICE
+ 1, // SLOT_ARROW_LIGHT
+ 1, // SLOT_TRADE_DEED
+ 30, // SLOT_BOMB
+ 30, // SLOT_BOMBCHU
+ 30, // SLOT_DEKU_STICK
+ 30, // SLOT_DEKU_NUT
+ 1, // SLOT_MAGIC_BEANS
+ 1, // SLOT_TRADE_KEY_MAMA
+ 1, // SLOT_POWDER_KEG
+ 1, // SLOT_PICTOGRAPH_BOX
+ 30, // SLOT_LENS_OF_TRUTH
+ 1, // SLOT_HOOKSHOT
+ 1, // SLOT_SWORD_GREAT_FAIRY
+ 1, // SLOT_TRADE_COUPLE
+ 1, // SLOT_BOTTLE_1
+ 1, // SLOT_BOTTLE_2
+ 1, // SLOT_BOTTLE_3
+ 1, // SLOT_BOTTLE_4
+ 0, // SLOT_BOTTLE_5
+ 0, // SLOT_BOTTLE_6
+ },
// upgrades
- 0x120009,
+ (1 << 0) | // UPG_QUIVER
+ (1 << 3) | // UPG_BOMB_BAG
+ (0 << 6) | // UPG_STRENGTH
+ (0 << 9) | // UPG_SCALE
+ (0 << 12) | // UPG_WALLET
+ (0 << 14) | // UPG_BULLET_BAG
+ (1 << 17) | // UPG_DEKU_STICKS
+ (1 << 20), // UPG_DEKU_NUTS
// questItems
(1 << QUEST_SONG_SONATA) | (1 << QUEST_SONG_LULLABY) | (1 << QUEST_SONG_BOSSA_NOVA) | (1 << QUEST_SONG_ELEGY) |
(1 << QUEST_SONG_OATH) | (1 << QUEST_SONG_TIME) | (1 << QUEST_SONG_HEALING) | (1 << QUEST_SONG_EPONA) |
(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
@@ -889,12 +1102,20 @@ Inventory sSaveDebugInventory = {
u16 sSaveDebugChecksum = 0;
-u8 D_801C6A48[] = {
- ITEM_MASK_FIERCE_DEITY, ITEM_MASK_GORON, ITEM_MASK_ZORA, ITEM_MASK_DEKU, ITEM_MASK_FIERCE_DEITY,
+u8 D_801C6A48[PLAYER_FORM_MAX] = {
+ ITEM_MASK_FIERCE_DEITY, // PLAYER_FORM_FIERCE_DEITY
+ ITEM_MASK_GORON, // PLAYER_FORM_GORON
+ ITEM_MASK_ZORA, // PLAYER_FORM_ZORA
+ ITEM_MASK_DEKU, // PLAYER_FORM_DEKU
+ ITEM_MASK_FIERCE_DEITY, // PLAYER_FORM_HUMAN
};
-u8 D_801C6A50[] = {
- SLOT_MASK_FIERCE_DEITY, SLOT_MASK_GORON, SLOT_MASK_ZORA, SLOT_MASK_DEKU, SLOT_MASK_FIERCE_DEITY,
+u8 D_801C6A50[PLAYER_FORM_MAX] = {
+ SLOT_MASK_FIERCE_DEITY, // PLAYER_FORM_FIERCE_DEITY
+ SLOT_MASK_GORON, // PLAYER_FORM_GORON
+ SLOT_MASK_ZORA, // PLAYER_FORM_ZORA
+ SLOT_MASK_DEKU, // PLAYER_FORM_DEKU
+ SLOT_MASK_FIERCE_DEITY, // PLAYER_FORM_HUMAN
};
/**
@@ -907,10 +1128,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];
@@ -919,11 +1140,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;
@@ -933,42 +1154,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++) {
@@ -980,8 +1200,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;
@@ -1002,36 +1222,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++) {
@@ -1039,11 +1261,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++) {
@@ -1058,7 +1280,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;
@@ -1067,26 +1289,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.scarecrowSpawnSongSet) {
+ 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;
@@ -1100,30 +1322,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));
}
@@ -1137,16 +1359,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));
}
@@ -1154,31 +1376,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) {
@@ -1186,40 +1398,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;
@@ -1227,177 +1464,201 @@ 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.language = LANGUAGE_ENG;
+ gSaveContext.options.audioSetting = SAVE_AUDIO_STEREO;
gSaveContext.options.languageSetting = 0;
gSaveContext.options.zTargetSetting = 0;
} else {
Lib_MemCpy(&gSaveContext.options, sramCtx->saveBuf, sizeof(SaveOptions));
if (gSaveContext.options.optionId != 0xA51D) {
gSaveContext.options.optionId = 0xA51D;
- gSaveContext.options.language = 1;
- gSaveContext.options.audioSetting = 0;
+ gSaveContext.options.language = LANGUAGE_ENG;
+ gSaveContext.options.audioSetting = SAVE_AUDIO_STEREO;
gSaveContext.options.languageSetting = 0;
gSaveContext.options.zTargetSetting = 0;
}
@@ -1407,117 +1668,120 @@ 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;
+ gSaveContext.options.language = LANGUAGE_ENG;
}
#else
#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) {
@@ -1526,67 +1790,70 @@ 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) {
- // TODO: macros for languages
- gSaveContext.options.language = 1;
+/**
+ * Write the SaveOptions of SaveContext to the save buffer
+ */
+void Sram_WriteSaveOptionsToBuffer(SramContext* sramCtx) {
+ if (gSaveContext.flashSaveAvailable) {
+ gSaveContext.options.language = LANGUAGE_ENG;
Lib_MemCpy(sramCtx->saveBuf, &gSaveContext.options, sizeof(SaveOptions));
}
}
@@ -1598,8 +1865,8 @@ void Sram_InitSram(GameState* gameState, SramContext* sramCtx) {
}
void Sram_Alloc(GameState* gameState, SramContext* sramCtx) {
- if (gSaveContext.unk_3F3F) {
- sramCtx->saveBuf = THA_AllocEndAlign16(&gameState->heap, SAVE_BUFFER_SIZE);
+ if (gSaveContext.flashSaveAvailable) {
+ sramCtx->saveBuf = THA_AllocTailAlign16(&gameState->tha, SAVE_BUFFER_SIZE);
sramCtx->status = 0;
}
}
@@ -1607,10 +1874,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);
}
/**
@@ -1623,14 +1890,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;
@@ -1643,28 +1911,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 {
@@ -1672,50 +1941,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));
}
}
@@ -1725,30 +1996,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;
@@ -1756,16 +2029,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 8f412364d..3dc02ba7d 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();
@@ -188,7 +188,7 @@ s32 SubS_UpdateLimb(s16 newRotZ, s16 newRotY, Vec3f* pos, Vec3s* rot, s32 stepRo
Matrix_MultVec3f(&zeroVec, &newPos);
Matrix_Get(&curState);
- Matrix_MtxFToYXZRot(&curState, &newRot, MTXMODE_NEW);
+ Matrix_MtxFToYXZRot(&curState, &newRot, false);
*pos = newPos;
if (!stepRot && !overrideRot) {
@@ -209,8 +209,8 @@ s32 SubS_UpdateLimb(s16 newRotZ, s16 newRotY, Vec3f* pos, Vec3s* rot, s32 stepRo
return true;
}
-void SubS_UpdateFlags(u16* flags, u16 setBits, u16 unsetBits) {
- *flags = (*flags & ~unsetBits) | setBits;
+void SubS_SetOfferMode(u16* flags, u16 offerMode, u16 mask) {
+ *flags = (*flags & ~mask) | offerMode;
}
/**
@@ -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;
}
@@ -517,7 +517,7 @@ Actor* SubS_FindNearestActor(Actor* actor, PlayState* play, u8 actorCategory, s1
actorIter = actorTmp;
if (actorIter != actor) {
- dist = Actor_DistanceBetweenActors(actor, actorIter);
+ dist = Actor_WorldDistXYZToActor(actor, actorIter);
if (!isSetup || dist < minDist) {
closestActor = actorIter;
minDist = dist;
@@ -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) {
@@ -762,7 +762,7 @@ s32 SubS_WeightPathing_Move(Actor* actor, Path* path, s32* waypoint, f32* progre
}
while (true) {
if (!SubS_WeightPathing_ComputePoint(path, *waypoint, &point, *progress, direction) ||
- ((s32)(actor->speedXZ * 10000.0f) == 0)) {
+ ((s32)(actor->speed * 10000.0f) == 0)) {
return false;
}
dist = Math_Vec3f_DistXZ(&actor->world.pos, &point);
@@ -815,60 +815,68 @@ s32 SubS_CopyPointFromPathCheckBounds(Path* path, s32 pointIndex, Vec3f* dst) {
return true;
}
-//! TODO: Needs docs with func_800B8500
-s32 func_8013C964(Actor* actor, PlayState* play, f32 xzRange, f32 yRange, s32 itemId, s32 type) {
- s32 ret = false;
+/**
+ * Attempt to extend different offers to the player based on different checks
+ * and on the provided mode (see SubSOfferMode).
+ *
+ * The offer types are either GetItem (see Actor_OfferGetItem) or TalkExchange (see Actor_OfferTalkExchange),
+ * with more check variants provided for TalkExchange offers.
+ *
+ * @return `true` if offer was extended and the player can accept it
+ */
+s32 SubS_Offer(Actor* actor, PlayState* play, f32 xzRange, f32 yRange, s32 itemId, SubSOfferMode mode) {
+ s32 canAccept = false;
s16 x;
s16 y;
f32 xzDistToPlayerTemp;
Actor_GetScreenPos(play, actor, &x, &y);
- switch (type) {
- case 1:
+ switch (mode) {
+ case SUBS_OFFER_MODE_GET_ITEM:
yRange = fabsf(actor->playerHeightRel) + 1.0f;
xzRange = actor->xzDistToPlayer + 1.0f;
- ret = Actor_PickUp(actor, play, itemId, xzRange, yRange);
+ canAccept = Actor_OfferGetItem(actor, play, itemId, xzRange, yRange);
break;
- case 2:
+ case SUBS_OFFER_MODE_NEARBY:
if ((fabsf(actor->playerHeightRel) <= yRange) && (actor->xzDistToPlayer <= xzRange)) {
- ret = func_800B8500(actor, play, xzRange, yRange, itemId);
+ canAccept = Actor_OfferTalkExchange(actor, play, xzRange, yRange, itemId);
}
break;
- case 3:
+ case SUBS_OFFER_MODE_ONSCREEN:
//! @bug: Both x and y conditionals are always true, || should be an &&
if (((x >= 0) || (x < SCREEN_WIDTH)) && ((y >= 0) || (y < SCREEN_HEIGHT))) {
- ret = func_800B8500(actor, play, xzRange, yRange, itemId);
+ canAccept = Actor_OfferTalkExchange(actor, play, xzRange, yRange, itemId);
}
break;
- case 4:
+ case SUBS_OFFER_MODE_AUTO:
yRange = fabsf(actor->playerHeightRel) + 1.0f;
xzRange = actor->xzDistToPlayer + 1.0f;
xzDistToPlayerTemp = actor->xzDistToPlayer;
actor->xzDistToPlayer = 0.0f;
actor->flags |= ACTOR_FLAG_10000;
- ret = func_800B8500(actor, play, xzRange, yRange, itemId);
+ canAccept = Actor_OfferTalkExchange(actor, play, xzRange, yRange, itemId);
actor->xzDistToPlayer = xzDistToPlayerTemp;
break;
- case 5:
+ case SUBS_OFFER_MODE_AUTO_TARGETED:
//! @bug: Both x and y conditionals are always true, || should be an &&
if (((x >= 0) || (x < SCREEN_WIDTH)) && ((y >= 0) || (y < SCREEN_HEIGHT)) &&
- (fabsf(actor->playerHeightRel) <= yRange) && (actor->xzDistToPlayer <= xzRange) && actor->isTargeted) {
+ (fabsf(actor->playerHeightRel) <= yRange) && (actor->xzDistToPlayer <= xzRange) && actor->isLockedOn) {
actor->flags |= ACTOR_FLAG_10000;
- ret = func_800B8500(actor, play, xzRange, yRange, itemId);
+ canAccept = Actor_OfferTalkExchange(actor, play, xzRange, yRange, itemId);
}
break;
- case 6:
+ case SUBS_OFFER_MODE_AUTO_NEARBY_ONSCREEN:
//! @bug: Both x and y conditionals are always true, || should be an &&
if (((x >= 0) || (x < SCREEN_WIDTH)) && ((y >= 0) || (y < SCREEN_HEIGHT)) &&
(fabsf(actor->playerHeightRel) <= yRange) && (actor->xzDistToPlayer <= xzRange)) {
actor->flags |= ACTOR_FLAG_10000;
- ret = func_800B8500(actor, play, xzRange, yRange, itemId);
+ canAccept = Actor_OfferTalkExchange(actor, play, xzRange, yRange, itemId);
}
break;
@@ -876,7 +884,7 @@ s32 func_8013C964(Actor* actor, PlayState* play, f32 xzRange, f32 yRange, s32 it
break;
}
- return ret;
+ return canAccept;
}
const u8 sShadowMaps[4][12][12] = {
@@ -966,7 +974,7 @@ void SubS_GenShadowTex(Vec3f bodyPartsPos[], Vec3f* worldPos, u8* tex, f32 tween
s32 startRow;
for (i = 0; i < bodyPartsNum; i++) {
- if (parentBodyParts[i] >= 0) {
+ if (parentBodyParts[i] > BODYPART_NONE) {
parentBodyPart = parentBodyParts[i];
bodyPartPos = &bodyPartsPos[i];
@@ -994,7 +1002,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 +1031,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 +1047,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 +1106,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) {
@@ -1166,7 +1174,7 @@ s8 SubS_IsObjectLoaded(s8 index, PlayState* play) {
}
s8 SubS_GetObjectIndex(s16 id, PlayState* play) {
- return Object_GetIndex(&play->objectCtx, id);
+ return Object_GetSlot(&play->objectCtx, id);
}
/**
@@ -1179,20 +1187,31 @@ 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;
}
return actor;
}
-s32 SubS_FillLimbRotTables(PlayState* play, s16* limbRotTableY, s16* limbRotTableZ, s32 numLimbs) {
- s32 i;
+/**
+ * Fills two tables with rotation angles that can be used to simulate idle animations.
+ *
+ * The rotation angles are dependent on the current frame, so should be updated regularly, generally every frame.
+ *
+ * This is done for the desired limb by taking either the `sin` of the yTable value or the `cos` of the zTable value,
+ * multiplying by some scale factor (generally 200), and adding that to the already existing rotation.
+ *
+ * Note: With the common scale factor of 200, this effect is practically unnoticeable if the current animation already
+ * has motion involved.
+ */
+s32 SubS_UpdateFidgetTables(PlayState* play, s16* fidgetTableY, s16* fidgetTableZ, s32 tableLen) {
u32 frames = play->gameplayFrames;
+ s32 i;
- for (i = 0; i < numLimbs; i++) {
- limbRotTableY[i] = (i * 50 + 0x814) * frames;
- limbRotTableZ[i] = (i * 50 + 0x940) * frames;
+ for (i = 0; i < tableLen; i++) {
+ fidgetTableY[i] = (i * 50 + 0x814) * frames;
+ fidgetTableZ[i] = (i * 50 + 0x940) * frames;
}
return true;
@@ -1386,48 +1405,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++;
}
}
@@ -1488,49 +1512,53 @@ s32 SubS_LineSegVsPlane(Vec3f* point, Vec3s* rot, Vec3f* unitVec, Vec3f* linePoi
/**
* Finds the first actor instance of a specified Id and category verified with a custom callback.
- * The callback should return `true` when the actor is succesfully verified.
+ * The callback should return `true` when the actor is successfully verified.
*/
Actor* SubS_FindActorCustom(PlayState* play, Actor* actor, Actor* actorListStart, u8 actorCategory, s16 actorId,
- void* verifyData, VerifyActor verifyActor) {
+ void* verifyData, VerifyFindActorFunc verifyActorFunc) {
Actor* actorIter = actorListStart;
if (actorListStart == NULL) {
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) &&
+ ((verifyActorFunc == NULL) ||
+ ((verifyActorFunc != NULL) && !verifyActorFunc(play, actor, actorIter, verifyData)))))) {
actorIter = actorIter->next;
}
return actorIter;
}
-//! TODO: Needs docs with func_800B8500
-s32 func_8013E748(Actor* actor, PlayState* play, f32 xzRange, f32 yRange, s32 exchangeItemId, void* data,
- func_8013E748_VerifyFunc verifyFunc) {
- s32 ret = false;
+/**
+ * Will extend a TalkExchange offer to the player if the actor is verified with a custom callback.
+ * The callback should return `true` when the actor is successfully verified.
+ */
+s32 SubS_OfferTalkExchangeCustom(Actor* actor, PlayState* play, f32 xzRange, f32 yRange, s32 exchangeItemAction,
+ void* data, VerifyTalkExchangeActorFunc verifyActorFunc) {
+ s32 canAccept = false;
- if ((verifyFunc == NULL) || ((verifyFunc != NULL) && verifyFunc(play, actor, data))) {
- ret = func_800B8500(actor, play, xzRange, yRange, exchangeItemId);
+ if ((verifyActorFunc == NULL) || ((verifyActorFunc != NULL) && verifyActorFunc(play, actor, data))) {
+ canAccept = Actor_OfferTalkExchange(actor, play, xzRange, yRange, exchangeItemAction);
}
- return ret;
+ return canAccept;
}
s32 SubS_ActorAndPlayerFaceEachOther(PlayState* play, Actor* actor, void* data) {
Player* player = GET_PLAYER(play);
- Vec3s* yawTols = (Vec3s*)data;
- s16 playerYaw = ABS(BINANG_SUB(Actor_YawBetweenActors(&player->actor, actor), player->actor.shape.rot.y));
+ Vec3s* yawRanges = (Vec3s*)data;
+ s16 playerYaw = ABS(BINANG_SUB(Actor_WorldYawTowardActor(&player->actor, actor), player->actor.shape.rot.y));
s16 actorYaw = ABS(BINANG_SUB(actor->yawTowardsPlayer, actor->shape.rot.y));
s32 areFacing = false;
- s32 actorYawTol = ABS(yawTols->y);
- s32 playerYawTol;
+ s32 actorYawRange = ABS(yawRanges->y);
+ s32 playerYawRange;
- if (actorYaw < (s16)actorYawTol) {
- playerYawTol = ABS(yawTols->x);
- if (playerYaw < (s16)playerYawTol) {
+ if (actorYaw < (s16)actorYawRange) {
+ playerYawRange = ABS(yawRanges->x);
+ if (playerYaw < (s16)playerYawRange) {
areFacing = true;
}
}
@@ -1538,14 +1566,14 @@ s32 SubS_ActorAndPlayerFaceEachOther(PlayState* play, Actor* actor, void* data)
return areFacing;
}
-//! TODO: Needs docs with func_800B8500
-s32 func_8013E8F8(Actor* actor, PlayState* play, f32 xzRange, f32 yRange, s32 exhangeItemId, s16 playerYawTol,
- s16 actorYawTol) {
- Vec3s yawTols;
+s32 SubS_OfferTalkExchangeFacing(Actor* actor, PlayState* play, f32 xzRange, f32 yRange, s32 exchangeItemAction,
+ s16 playerYawRange, s16 actorYawRange) {
+ Vec3s yawRanges;
- yawTols.x = playerYawTol;
- yawTols.y = actorYawTol;
- return func_8013E748(actor, play, xzRange, yRange, exhangeItemId, &yawTols, SubS_ActorAndPlayerFaceEachOther);
+ yawRanges.x = playerYawRange;
+ yawRanges.y = actorYawRange;
+ return SubS_OfferTalkExchangeCustom(actor, play, xzRange, yRange, exchangeItemAction, &yawRanges,
+ SubS_ActorAndPlayerFaceEachOther);
}
/**
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..8e3d1c59f 100644
--- a/src/code/z_vimode.c
+++ b/src/code/z_vimode.c
@@ -1,17 +1,379 @@
#include "global.h"
+#include "debug.h"
+#include "z64vimode.h"
+#include "PR/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 {
+ _dbg_hungup("../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(-4, -2);
+ }
+ } else {
+ viMode->fldRegs[0].vStart += START(-3, -2);
+ if (tvType == OS_TV_MPAL) {
+ viMode->fldRegs[0].vBurst += BURST(-2, -1, 12, -1);
+ } else if (tvType == OS_TV_PAL) {
+ viMode->fldRegs[1].vBurst += BURST(-2, -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..1821805ee
--- /dev/null
+++ b/src/code/z_viscvg.c
@@ -0,0 +1,91 @@
+#include "global.h"
+#include "z64viscvg.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(VisCvg* 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(VisCvg* this) {
+}
+
+void VisCvg_Draw(VisCvg* 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_vismono.c b/src/code/z_vismono.c
index b28ed2aa6..86937c315 100644
--- a/src/code/z_vismono.c
+++ b/src/code/z_vismono.c
@@ -4,6 +4,7 @@
*/
#include "global.h"
+#include "z64vismono.h"
#include "system_malloc.h"
// Height of the fragments the color frame buffer (CFB) is split into.
diff --git a/src/code/z_viszbuf.c b/src/code/z_viszbuf.c
new file mode 100644
index 000000000..17c734cb0
--- /dev/null
+++ b/src/code/z_viszbuf.c
@@ -0,0 +1,59 @@
+#include "global.h"
+#include "z64viszbuf.h"
+#include "sys_cfb.h"
+#include "libc/stdbool.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 f42e66a25..605dff84c 100644
--- a/src/code/z_vr_box.c
+++ b/src/code/z_vr_box.c
@@ -188,10 +188,10 @@ void Skybox_Setup(GameState* gameState, SkyboxContext* skyboxCtx, s16 skyboxId)
size_t size;
void* segment;
- skyboxCtx->rotZ = 0.0f;
+ skyboxCtx->rot.z = 0.0f;
switch (skyboxId) {
- case 1:
+ case SKYBOX_NORMAL_SKY:
// Send a DMA request for the cloudy sky texture
skyboxCtx->staticSegments[0] = &D_80025D00;
size = SEGMENT_ROM_SIZE(d2_cloud_static);
@@ -210,21 +210,21 @@ void Skybox_Setup(GameState* gameState, SkyboxContext* skyboxCtx, s16 skyboxId)
segment = (void*)ALIGN8((uintptr_t)segment + size);
DmaMgr_SendRequest0(skyboxCtx->paletteStaticSegment, SEGMENT_ROM_START(d2_fine_pal_static), size);
- skyboxCtx->primR = 145;
- skyboxCtx->primG = 120;
- skyboxCtx->primB = 155;
+ skyboxCtx->prim.r = 145;
+ skyboxCtx->prim.g = 120;
+ skyboxCtx->prim.b = 155;
- skyboxCtx->envR = 40;
- skyboxCtx->envG = 0;
- skyboxCtx->envB = 40;
+ skyboxCtx->env.r = 40;
+ skyboxCtx->env.g = 0;
+ skyboxCtx->env.b = 40;
// Inverted Stone Tower Temple and Inverted Stone Tower
if ((play->sceneId == SCENE_F41) || (play->sceneId == SCENE_INISIE_R)) {
- skyboxCtx->rotZ = 3.15f;
+ skyboxCtx->rot.z = 3.15f;
}
break;
- case 2:
+ case SKYBOX_2:
break;
default:
@@ -236,10 +236,10 @@ void func_80143324(PlayState* play, SkyboxContext* skyboxCtx, s16 skyboxId) {
size_t size;
switch (skyboxId) {
- case 1:
+ 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);
@@ -289,20 +289,20 @@ void func_80143324(PlayState* play, SkyboxContext* skyboxCtx, s16 skyboxId) {
void Skybox_Init(GameState* gameState, SkyboxContext* skyboxCtx, s16 skyboxId) {
skyboxCtx->skyboxShouldDraw = false;
- skyboxCtx->rotX = skyboxCtx->rotY = skyboxCtx->rotZ = 0.0f;
+ skyboxCtx->rot.x = skyboxCtx->rot.y = skyboxCtx->rot.z = 0.0f;
Skybox_Setup(gameState, skyboxCtx, skyboxId);
- if (skyboxId != 0) {
- skyboxCtx->dListBuf = THA_AllocEndAlign16(&gameState->heap, 0x3840);
+ if (skyboxId != SKYBOX_NONE) {
+ skyboxCtx->dListBuf = THA_AllocTailAlign16(&gameState->tha, 0x3840);
- if (skyboxId == 5) {
+ if (skyboxId == SKYBOX_CUTSCENE_MAP) {
// Allocate enough space for the vertices for a 6 sided skybox (cube)
- skyboxCtx->roomVtx = THA_AllocEndAlign16(&gameState->heap, sizeof(Vtx) * 32 * 6);
+ skyboxCtx->roomVtx = THA_AllocTailAlign16(&gameState->tha, sizeof(Vtx) * 32 * 6);
func_80143148(skyboxCtx, 6);
} else {
// Allocate enough space for the vertices for a 5 sided skybox (bottom is missing)
- skyboxCtx->roomVtx = THA_AllocEndAlign16(&gameState->heap, sizeof(Vtx) * 32 * 5);
+ skyboxCtx->roomVtx = THA_AllocTailAlign16(&gameState->tha, sizeof(Vtx) * 32 * 5);
func_80143148(skyboxCtx, 5);
}
}
diff --git a/src/code/z_vr_box_draw.c b/src/code/z_vr_box_draw.c
index e0884e270..656f6cad3 100644
--- a/src/code/z_vr_box_draw.c
+++ b/src/code/z_vr_box_draw.c
@@ -2,28 +2,28 @@
Mtx* sSkyboxDrawMatrix;
-Mtx* SkyboxDraw_UpdateMatrix(SkyboxContext* skyboxCtx, f32 x, f32 y, f32 z) {
+Mtx* Skybox_UpdateMatrix(SkyboxContext* skyboxCtx, f32 x, f32 y, f32 z) {
Matrix_Translate(x, y, z, MTXMODE_NEW);
Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
- Matrix_RotateXFApply(skyboxCtx->rotX);
- Matrix_RotateYF(skyboxCtx->rotY, MTXMODE_APPLY);
- Matrix_RotateZF(skyboxCtx->rotZ, MTXMODE_APPLY);
+ Matrix_RotateXFApply(skyboxCtx->rot.x);
+ Matrix_RotateYF(skyboxCtx->rot.y, MTXMODE_APPLY);
+ Matrix_RotateZF(skyboxCtx->rot.z, MTXMODE_APPLY);
return Matrix_ToMtx(sSkyboxDrawMatrix);
}
-void SkyboxDraw_SetColors(SkyboxContext* skyboxCtx, u8 primR, u8 primG, u8 primB, u8 envR, u8 envG, u8 envB) {
- skyboxCtx->primR = primR;
- skyboxCtx->primG = primG;
- skyboxCtx->primB = primB;
- skyboxCtx->envR = envR;
- skyboxCtx->envG = envG;
- skyboxCtx->envB = envB;
+void Skybox_SetColors(SkyboxContext* skyboxCtx, u8 primR, u8 primG, u8 primB, u8 envR, u8 envG, u8 envB) {
+ skyboxCtx->prim.r = primR;
+ skyboxCtx->prim.g = primG;
+ skyboxCtx->prim.b = primB;
+ skyboxCtx->env.r = envR;
+ skyboxCtx->env.g = envG;
+ skyboxCtx->env.b = envB;
}
-void SkyboxDraw_Draw(SkyboxContext* skyboxCtx, GraphicsContext* gfxCtx, s16 skyboxId, s16 blend, f32 x, f32 y, f32 z) {
+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);
@@ -32,9 +32,9 @@ void SkyboxDraw_Draw(SkyboxContext* skyboxCtx, GraphicsContext* gfxCtx, s16 skyb
Matrix_Translate(x, y, z, MTXMODE_NEW);
Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
- Matrix_RotateXFApply(skyboxCtx->rotX);
- Matrix_RotateYF(skyboxCtx->rotY, MTXMODE_APPLY);
- Matrix_RotateZF(skyboxCtx->rotZ, MTXMODE_APPLY);
+ Matrix_RotateXFApply(skyboxCtx->rot.x);
+ Matrix_RotateYF(skyboxCtx->rot.y, MTXMODE_APPLY);
+ Matrix_RotateZF(skyboxCtx->rot.z, MTXMODE_APPLY);
Matrix_ToMtx(sSkyboxDrawMatrix);
gSPMatrix(POLY_OPA_DISP++, sSkyboxDrawMatrix, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -45,8 +45,8 @@ void SkyboxDraw_Draw(SkyboxContext* skyboxCtx, GraphicsContext* gfxCtx, s16 skyb
gDPSetTextureConvert(POLY_OPA_DISP++, G_TC_FILT);
gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL1, TEXEL0, PRIMITIVE_ALPHA, TEXEL0, TEXEL1, TEXEL0, PRIMITIVE, TEXEL0,
PRIMITIVE, ENVIRONMENT, COMBINED, ENVIRONMENT, 0, 0, 0, COMBINED);
- gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, skyboxCtx->primR, skyboxCtx->primG, skyboxCtx->primB, blend);
- gDPSetEnvColor(POLY_OPA_DISP++, skyboxCtx->envR, skyboxCtx->envG, skyboxCtx->envB, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, skyboxCtx->prim.r, skyboxCtx->prim.g, skyboxCtx->prim.b, blend);
+ gDPSetEnvColor(POLY_OPA_DISP++, skyboxCtx->env.r, skyboxCtx->env.g, skyboxCtx->env.b, 0);
gSPDisplayList(POLY_OPA_DISP++, &skyboxCtx->dListBuf[0]);
gSPDisplayList(POLY_OPA_DISP++, &skyboxCtx->dListBuf[2]);
@@ -63,5 +63,5 @@ void SkyboxDraw_Draw(SkyboxContext* skyboxCtx, GraphicsContext* gfxCtx, s16 skyb
CLOSE_DISPS(gfxCtx);
}
-void SkyboxDraw_Update(SkyboxContext* skyboxCtx) {
+void Skybox_Update(SkyboxContext* skyboxCtx) {
}
diff --git a/src/libultra/flash/osFlash.c b/src/libultra/flash/osFlash.c
index 3ed33f45d..6a744a95e 100644
--- a/src/libultra/flash/osFlash.c
+++ b/src/libultra/flash/osFlash.c
@@ -1,41 +1,38 @@
#include "prevent_bss_reordering.h"
#include "ultra64.h"
#include "global.h"
+#include "PR/os_internal_flash.h"
-s32 framDeviceInfo[4];
-OSIoMesg framDeviceInfoQuery;
+u32 __osFlashID[4];
+OSIoMesg __osFlashMsg;
OSMesgQueue __osFlashMessageQ;
OSPiHandle __osFlashHandler;
-OSMesg __osFlashMsgBuf;
+OSMesg __osFlashMsgBuf[1];
s32 __osFlashVersion;
-UNK_TYPE1 D_801FD0FC[0x14];
+static s32 sBssPad[5];
-typedef enum {
- FLASH_OLD,
- FLASH_NEW,
-} FlashVersion;
-
-u32 osFlashGetAddr(u32 pageNum) {
- s32 addr = (__osFlashVersion == FLASH_OLD) ? pageNum << 6 : pageNum << 7;
+uintptr_t osFlashGetAddr(u32 pageNum) {
+ // Account for hadware bug in old flash where the address bits are shifted 1-off where they should be
+ uintptr_t addr = (__osFlashVersion == OLD_FLASH) ? pageNum * (FLASH_BLOCK_SIZE >> 1) : pageNum * FLASH_BLOCK_SIZE;
return addr;
}
OSPiHandle* osFlashReInit(u8 latency, u8 pulse, u8 pageSize, u8 relDuration, u32 start) {
- __osFlashHandler.baseAddress = RDRAM_UNCACHED | start;
+ __osFlashHandler.baseAddress = PHYS_TO_K1(start);
__osFlashHandler.type++;
__osFlashHandler.latency = latency;
__osFlashHandler.pulse = pulse;
__osFlashHandler.pageSize = pageSize;
__osFlashHandler.relDuration = relDuration;
- __osFlashHandler.domain = 1;
+ __osFlashHandler.domain = PI_DOMAIN2;
return &__osFlashHandler;
}
void osFlashChange(u32 flashNum) {
- __osFlashHandler.baseAddress = RDRAM_UNCACHED | (FRAM_STATUS_REGISTER + (flashNum << 17));
- __osFlashHandler.type = 8 + flashNum;
+ __osFlashHandler.baseAddress = PHYS_TO_K1(FLASH_START_ADDR + (flashNum * FLASH_SIZE));
+ __osFlashHandler.type = DEVICE_TYPE_FLASH + flashNum;
return;
}
@@ -44,29 +41,31 @@ OSPiHandle* osFlashInit(void) {
u32 flashType;
u32 flashVendor;
- osCreateMesgQueue(&__osFlashMessageQ, &__osFlashMsgBuf, 1);
+ osCreateMesgQueue(&__osFlashMessageQ, __osFlashMsgBuf, ARRAY_COUNT(__osFlashMsgBuf));
- if (__osFlashHandler.baseAddress == (RDRAM_UNCACHED | FRAM_BASE_ADDRESS)) {
+ if (__osFlashHandler.baseAddress == PHYS_TO_K1(FLASH_START_ADDR)) {
return &__osFlashHandler;
}
- __osFlashHandler.type = 8;
- __osFlashHandler.baseAddress = (RDRAM_UNCACHED | FRAM_BASE_ADDRESS);
- __osFlashHandler.latency = 5;
- __osFlashHandler.pulse = 12;
- __osFlashHandler.pageSize = 15;
- __osFlashHandler.relDuration = 2;
- __osFlashHandler.domain = 1;
+ __osFlashHandler.type = DEVICE_TYPE_FLASH;
+ __osFlashHandler.baseAddress = PHYS_TO_K1(FLASH_START_ADDR);
+ __osFlashHandler.latency = FLASH_LATENCY;
+ __osFlashHandler.pulse = FLASH_PULSE;
+ __osFlashHandler.pageSize = FLASH_PAGE_SIZE;
+ __osFlashHandler.relDuration = FLASH_REL_DURATION;
+ __osFlashHandler.domain = PI_DOMAIN2;
__osFlashHandler.speed = 0;
+
bzero(&__osFlashHandler.transferInfo, sizeof(__OSTranxInfo));
osEPiLinkHandle(&__osFlashHandler);
osFlashReadId(&flashType, &flashVendor);
- if (flashVendor == 0x00C2001E || flashVendor == 0x00C20001 || flashVendor == 0x00C20000) {
- __osFlashVersion = FLASH_OLD;
+ if ((flashVendor == FLASH_VERSION_MX_C) || (flashVendor == FLASH_VERSION_MX_A) ||
+ (flashVendor == FLASH_VERSION_MX_PROTO_A)) {
+ __osFlashVersion = OLD_FLASH;
} else {
- __osFlashVersion = FLASH_NEW;
+ __osFlashVersion = NEW_FLASH;
}
return &__osFlashHandler;
@@ -75,12 +74,12 @@ OSPiHandle* osFlashInit(void) {
void osFlashReadStatus(u8* flashStatus) {
u32 outFlashStatus;
- osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FRAM_COMMAND_REGISTER, FRAM_COMMAND_EXECUTE);
+ osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_STATUS);
// read status using IO
osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &outFlashStatus);
// why twice ?
- osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FRAM_COMMAND_REGISTER, FRAM_COMMAND_EXECUTE);
+ osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_STATUS);
osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &outFlashStatus);
*flashStatus = outFlashStatus & 0xFF;
@@ -95,29 +94,28 @@ void osFlashReadId(u32* flashType, u32* flashVendor) {
osFlashReadStatus(&flashStatus);
// select silicon id read mode
- osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FRAM_COMMAND_REGISTER,
- FRAM_COMMAND_SET_MODE_STATUS_AND_STATUS);
+ osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_ID);
// read silicon id using DMA
- framDeviceInfoQuery.hdr.pri = 0;
- framDeviceInfoQuery.hdr.retQueue = &__osFlashMessageQ;
- framDeviceInfoQuery.dramAddr = framDeviceInfo;
- framDeviceInfoQuery.devAddr = 0;
- framDeviceInfoQuery.size = 8;
+ __osFlashMsg.hdr.pri = OS_MESG_PRI_NORMAL;
+ __osFlashMsg.hdr.retQueue = &__osFlashMessageQ;
+ __osFlashMsg.dramAddr = __osFlashID;
+ __osFlashMsg.devAddr = 0;
+ __osFlashMsg.size = 2 * sizeof(u32);
- osInvalDCache(framDeviceInfo, sizeof(framDeviceInfo));
- osEPiStartDma(&__osFlashHandler, &framDeviceInfoQuery, OS_READ);
+ osInvalDCache(__osFlashID, sizeof(__osFlashID));
+ osEPiStartDma(&__osFlashHandler, &__osFlashMsg, OS_READ);
osRecvMesg(&__osFlashMessageQ, NULL, OS_MESG_BLOCK);
- *flashType = framDeviceInfo[0];
- *flashVendor = framDeviceInfo[1];
+ *flashType = __osFlashID[0];
+ *flashVendor = __osFlashID[1];
return;
}
void osFlashClearStatus(void) {
// select status mode
- osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FRAM_COMMAND_REGISTER, FRAM_COMMAND_EXECUTE);
+ osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_STATUS);
// clear status
osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress, 0);
@@ -131,10 +129,8 @@ s32 osFlashAllErase(void) {
OSMesg msg;
// start chip erase operation
- osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FRAM_COMMAND_REGISTER,
- FRAM_COMMAND_UNK_ERASE_OPERATION);
- osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FRAM_COMMAND_REGISTER,
- FRAM_COMMAND_SET_MODE_ERASE_AND_STATUS);
+ osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_CHIP_ERASE);
+ osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_EXECUTE_ERASE);
// wait for completion by polling erase-busy flag
osCreateMesgQueue(&mq, &msg, 1);
@@ -142,25 +138,23 @@ s32 osFlashAllErase(void) {
osSetTimer(&timer, OS_USEC_TO_CYCLES(15000), 0, &mq, &msg);
osRecvMesg(&mq, &msg, OS_MESG_BLOCK);
osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &status);
- } while ((status & 2) == 2);
+ } while ((status & FLASH_STATUS_ERASE_BUSY) == FLASH_STATUS_ERASE_BUSY);
// check erase operation status, clear status
osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &status);
osFlashClearStatus();
if (((status & 0xFF) == 0x08) || ((status & 0xFF) == 0x48) || ((status & 0x08) == 0x08)) {
- return 0;
+ return FLASH_STATUS_ERASE_OK;
} else {
- return -1;
+ return FLASH_STATUS_ERASE_ERROR;
}
}
void osFlashAllEraseThrough(void) {
// start chip erase operation
- osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FRAM_COMMAND_REGISTER,
- FRAM_COMMAND_UNK_ERASE_OPERATION);
- osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FRAM_COMMAND_REGISTER,
- FRAM_COMMAND_SET_MODE_ERASE_AND_STATUS);
+ osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_CHIP_ERASE);
+ osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_EXECUTE_ERASE);
}
s32 osFlashCheckEraseEnd(void) {
@@ -168,8 +162,8 @@ s32 osFlashCheckEraseEnd(void) {
// check if erase operation is completed
osFlashReadStatus(&status);
- if ((status & 0x02) == 0x02) {
- return 2; // busy
+ if ((status & FLASH_STATUS_ERASE_BUSY) == FLASH_STATUS_ERASE_BUSY) {
+ return FLASH_STATUS_ERASE_BUSY;
} else {
// check erase operation status, clear status
osFlashReadStatus(&status);
@@ -177,9 +171,9 @@ s32 osFlashCheckEraseEnd(void) {
osFlashClearStatus();
if (((status & 0xFF) == 0x08) || ((status & 0xFF) == 0x48) || ((status & 0x08) == 0x08)) {
- return 0;
+ return FLASH_STATUS_ERASE_OK;
} else {
- return -1;
+ return FLASH_STATUS_ERASE_ERROR;
}
}
@@ -190,10 +184,8 @@ s32 osFlashSectorErase(u32 pageNum) {
OSMesg msg;
// start sector erase operation
- osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FRAM_COMMAND_REGISTER,
- FRAM_COMMAND_SET_ERASE_SECTOR_OFFSET | pageNum);
- osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FRAM_COMMAND_REGISTER,
- FRAM_COMMAND_SET_MODE_ERASE_AND_STATUS);
+ osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_SECTOR_ERASE | pageNum);
+ osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_EXECUTE_ERASE);
// wait for completion by polling erase-busy flag
osCreateMesgQueue(&mq, &msg, 1);
@@ -201,39 +193,37 @@ s32 osFlashSectorErase(u32 pageNum) {
osSetTimer(&timer, OS_USEC_TO_CYCLES(12500), 0, &mq, &msg);
osRecvMesg(&mq, &msg, OS_MESG_BLOCK);
osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &status);
- } while ((status & 2) == 2);
+ } while ((status & FLASH_STATUS_ERASE_BUSY) == FLASH_STATUS_ERASE_BUSY);
// check erase operation status, clear status
osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &status);
osFlashClearStatus();
if (((status & 0xFF) == 0x08) || ((status & 0xFF) == 0x48) || ((status & 0x08) == 0x08)) {
- return 0;
+ return FLASH_STATUS_ERASE_OK;
} else {
- return -1;
+ return FLASH_STATUS_ERASE_ERROR;
}
}
void osFlashSectorEraseThrough(u32 pageNum) {
// start sector erase operation
- osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FRAM_COMMAND_REGISTER,
- FRAM_COMMAND_SET_ERASE_SECTOR_OFFSET | pageNum);
- osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FRAM_COMMAND_REGISTER,
- FRAM_COMMAND_SET_MODE_ERASE_AND_STATUS);
+ osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_SECTOR_ERASE | pageNum);
+ osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_EXECUTE_ERASE);
}
s32 osFlashWriteBuffer(OSIoMesg* mb, s32 priority, void* dramAddr, OSMesgQueue* mq) {
s32 ret;
// select load page mode
- osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FRAM_COMMAND_REGISTER, FRAM_COMMAND_SET_MODE_WRITE);
+ osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_PAGE_PROGRAM);
// DMA 128-byte page
mb->hdr.pri = priority;
mb->hdr.retQueue = mq;
mb->dramAddr = dramAddr;
mb->devAddr = 0;
- mb->size = 0x80;
+ mb->size = FLASH_BLOCK_SIZE;
ret = osEPiStartDma(&__osFlashHandler, mb, OS_WRITE);
@@ -247,14 +237,12 @@ s32 osFlashWriteArray(u32 pageNum) {
OSMesg msg;
// only needed for new flash ?
- if (__osFlashVersion == FLASH_NEW) {
- osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FRAM_COMMAND_REGISTER,
- FRAM_COMMAND_SET_MODE_WRITE);
+ if (__osFlashVersion == NEW_FLASH) {
+ osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_PAGE_PROGRAM);
}
// start program page operation
- osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FRAM_COMMAND_REGISTER,
- FRAM_COMMAND_SET_ERASE_SECTOR_OFFSET_AND_STATUS | pageNum);
+ osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_PROGRAM_PAGE | pageNum);
// wait for completion by polling write-busy flag
osCreateMesgQueue(&mq, &msg, 1);
@@ -262,16 +250,16 @@ s32 osFlashWriteArray(u32 pageNum) {
osSetTimer(&timer, OS_USEC_TO_CYCLES(200), 0, &mq, &msg);
osRecvMesg(&mq, &msg, OS_MESG_BLOCK);
osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &status);
- } while ((status & 0x01) == 0x01);
+ } while ((status & FLASH_STATUS_WRITE_BUSY) == FLASH_STATUS_WRITE_BUSY);
// check program operation status, clear status
osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &status);
osFlashClearStatus();
if (((status & 0xFF) == 0x04) || ((status & 0xFF) == 0x44) || ((status & 0x04) == 0x04)) {
- return 0;
+ return FLASH_STATUS_WRITE_OK;
} else {
- return -1;
+ return FLASH_STATUS_WRITE_ERROR;
}
}
@@ -282,8 +270,7 @@ s32 osFlashReadArray(OSIoMesg* mb, s32 priority, u32 pageNum, void* dramAddr, u3
u32 pages;
// select read array mode
- osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FRAM_COMMAND_REGISTER,
- FRAM_COMMAND_SET_MODE_READ_AND_STATUS);
+ osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_READ_ARRAY);
// dummy read to initiate "fast-page" reads ?
osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &dummy);
@@ -296,10 +283,9 @@ s32 osFlashReadArray(OSIoMesg* mb, s32 priority, u32 pageNum, void* dramAddr, u3
last_page = pageNum + pageCount - 1;
if ((last_page & 0xF00) != (pageNum & 0xF00)) {
-
pages = 256 - (pageNum & 0xFF);
pageCount -= pages;
- mb->size = pages << 7;
+ mb->size = pages * FLASH_BLOCK_SIZE;
mb->devAddr = osFlashGetAddr(pageNum);
osEPiStartDma(&__osFlashHandler, mb, OS_READ);
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
@@ -310,7 +296,7 @@ s32 osFlashReadArray(OSIoMesg* mb, s32 priority, u32 pageNum, void* dramAddr, u3
while (pageCount > 256) {
pages = 256;
pageCount -= 256;
- mb->size = pages << 7;
+ mb->size = pages * FLASH_BLOCK_SIZE;
mb->devAddr = osFlashGetAddr(pageNum);
osEPiStartDma(&__osFlashHandler, mb, OS_READ);
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
@@ -318,7 +304,7 @@ s32 osFlashReadArray(OSIoMesg* mb, s32 priority, u32 pageNum, void* dramAddr, u3
mb->dramAddr = (void*)((uintptr_t)mb->dramAddr + mb->size);
}
- mb->size = pageCount << 7;
+ mb->size = pageCount * FLASH_BLOCK_SIZE;
mb->devAddr = osFlashGetAddr(pageNum);
ret = osEPiStartDma(&__osFlashHandler, mb, OS_READ);
diff --git a/src/libultra/gu/guS2DInitBg.c b/src/libultra/gu/guS2DInitBg.c
index d2e5a2b04..c87176f49 100644
--- a/src/libultra/gu/guS2DInitBg.c
+++ b/src/libultra/gu/guS2DInitBg.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "PR/gs2dex.h"
void guS2DInitBg(uObjBg* bg) {
u32 size;
diff --git a/src/libultra/gu/lookathil.c b/src/libultra/gu/lookathil.c
index dcb05b3d9..22540337c 100644
--- a/src/libultra/gu/lookathil.c
+++ b/src/libultra/gu/lookathil.c
@@ -1,7 +1,5 @@
#include "global.h"
-#define FTOFRAC8(x) ((s32)MIN(((x) * (128.0f)), 127.0f) & 0xFF)
-
void guLookAtHiliteF(f32 mf[4][4], LookAt* l, Hilite* h, f32 xEye, f32 yEye, f32 zEye, f32 xAt, f32 yAt, f32 zAt,
f32 xUp, f32 yUp, f32 zUp, f32 xl1, f32 yl1, f32 zl1, /* light 1 direction */
f32 xl2, f32 yl2, f32 zl2, /* light 2 direction */
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/cartrominit.c b/src/libultra/io/cartrominit.c
index 0825b472c..39de77260 100644
--- a/src/libultra/io/cartrominit.c
+++ b/src/libultra/io/cartrominit.c
@@ -1,6 +1,6 @@
#include "global.h"
-OSPiHandle CartRomHandle;
+OSPiHandle __CartRomHandle;
OSPiHandle* osCartRomInit(void) {
register u32 initialConfig;
@@ -17,18 +17,18 @@ OSPiHandle* osCartRomInit(void) {
if (!sCartRomNeedsInit) {
__osPiRelAccess();
- return &CartRomHandle;
+ return &__CartRomHandle;
}
sCartRomNeedsInit = false;
- CartRomHandle.type = DEVICE_TYPE_CART;
- CartRomHandle.baseAddress = 0xB0000000;
- CartRomHandle.domain = 0;
- CartRomHandle.speed = 0;
- bzero(&CartRomHandle.transferInfo, sizeof(__OSTranxInfo));
+ __CartRomHandle.type = DEVICE_TYPE_CART;
+ __CartRomHandle.baseAddress = 0xB0000000;
+ __CartRomHandle.domain = 0;
+ __CartRomHandle.speed = 0;
+ bzero(&__CartRomHandle.transferInfo, sizeof(__OSTranxInfo));
/* Uses `status & PI_STATUS_ERROR` in OoT */
- while (status = HW_REG(PI_STATUS_REG, u32), status & (PI_STATUS_BUSY | PI_STATUS_IOBUSY)) {
+ while (status = HW_REG(PI_STATUS_REG, u32), status & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY)) {
;
}
@@ -42,11 +42,11 @@ OSPiHandle* osCartRomInit(void) {
HW_REG(PI_BSD_DOM1_RLS_REG, u32) = 3;
HW_REG(PI_BSD_DOM1_PWD_REG, u32) = 0xFF;
- initialConfig = HW_REG(CartRomHandle.baseAddress, u32);
- CartRomHandle.latency = initialConfig & 0xFF;
- CartRomHandle.pageSize = (initialConfig >> 0x10) & 0xF;
- CartRomHandle.relDuration = (initialConfig >> 0x14) & 0xF;
- CartRomHandle.pulse = (initialConfig >> 8) & 0xFF;
+ initialConfig = HW_REG(__CartRomHandle.baseAddress, u32);
+ __CartRomHandle.latency = initialConfig & 0xFF;
+ __CartRomHandle.pageSize = (initialConfig >> 0x10) & 0xF;
+ __CartRomHandle.relDuration = (initialConfig >> 0x14) & 0xF;
+ __CartRomHandle.pulse = (initialConfig >> 8) & 0xFF;
HW_REG(PI_BSD_DOM1_LAT_REG, u32) = lastLatency;
HW_REG(PI_BSD_DOM1_PGS_REG, u32) = lastPageSize;
@@ -54,10 +54,10 @@ OSPiHandle* osCartRomInit(void) {
HW_REG(PI_BSD_DOM1_PWD_REG, u32) = lastPulse;
prevInt = __osDisableInt();
- CartRomHandle.next = __osPiTable;
- __osPiTable = &CartRomHandle;
+ __CartRomHandle.next = __osPiTable;
+ __osPiTable = &__CartRomHandle;
__osRestoreInt(prevInt);
__osPiRelAccess();
- return &CartRomHandle;
+ return &__CartRomHandle;
}
diff --git a/src/libultra/io/contpfs.c b/src/libultra/io/contpfs.c
index fd4c4e459..e6817c3d0 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;
@@ -265,8 +266,6 @@ s32 __osGetId(OSPfs* pfs) {
bcopy(id, pfs->id, BLOCKSIZE);
- if (0) {}
-
pfs->version = id->version;
pfs->banks = id->banks;
diff --git a/src/libultra/io/contramread.c b/src/libultra/io/contramread.c
index d993b47d7..06def61ba 100644
--- a/src/libultra/io/contramread.c
+++ b/src/libultra/io/contramread.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "PR/voice_internal.h"
#define BLOCKSIZE 32
diff --git a/src/libultra/io/contramwrite.c b/src/libultra/io/contramwrite.c
index b2157a2a5..507fbb1e8 100644
--- a/src/libultra/io/contramwrite.c
+++ b/src/libultra/io/contramwrite.c
@@ -1,4 +1,5 @@
#include "ultra64.h"
+#include "PR/voice_internal.h"
#include "global.h"
s32 __osContRamWrite(OSMesgQueue* mq, s32 channel, u16 address, u8* buffer, s32 force) {
diff --git a/src/libultra/io/contreaddata.c b/src/libultra/io/contreaddata.c
index 163756e07..21a8b90ce 100644
--- a/src/libultra/io/contreaddata.c
+++ b/src/libultra/io/contreaddata.c
@@ -1,5 +1,7 @@
#include "global.h"
+void __osPackReadData(void);
+
s32 osContStartReadData(OSMesgQueue* mq) {
s32 ret;
int i;
@@ -34,20 +36,20 @@ void osContGetReadData(OSContPad* data) {
data->stick_x = readformat.stick_x;
data->stick_y = readformat.stick_y;
}
- };
+ }
}
-void __osPackReadData() {
+void __osPackReadData(void) {
u8* ptr;
__OSContReadFormat readformat;
int i;
ptr = (u8*)__osContPifRam.ramarray;
- for (i = 0; i < 0xF; i++) {
+ for (i = 0; i < ARRAY_COUNT(__osContPifRam.ramarray); i++) {
__osContPifRam.ramarray[i] = 0;
}
- __osContPifRam.status = 1;
+ __osContPifRam.status = CONT_CMD_READ_BUTTON;
readformat.dummy = 255;
readformat.txsize = 1;
readformat.rxsize = 4;
diff --git a/src/libultra/io/controller.c b/src/libultra/io/controller.c
index 245183280..30cb4c1d9 100644
--- a/src/libultra/io/controller.c
+++ b/src/libultra/io/controller.c
@@ -1,14 +1,14 @@
#include "global.h"
-UNK_TYPE4 D_80097E40 = 0;
+s32 __osContinitialized = false;
OSPifRam __osContPifRam;
u8 __osContLastPoll;
u8 __osMaxControllers;
OSTimer __osEepromTimer;
-OSMesgQueue D_8009CF38;
-OSMesg D_8009CF50[1];
+OSMesgQueue __osEepromTimerQ;
+OSMesg __osEepromTimerMsg[1];
s32 osContInit(OSMesgQueue* mq, u8* bitpattern, OSContStatus* data) {
OSMesg dummy;
@@ -17,11 +17,11 @@ s32 osContInit(OSMesgQueue* mq, u8* bitpattern, OSContStatus* data) {
OSTimer mytimer;
OSMesgQueue timerMesgQueue;
- if (D_80097E40 != 0) {
+ if (__osContinitialized) {
return 0;
}
- D_80097E40 = 1;
+ __osContinitialized = true;
t = osGetTime();
if (t < 0x165A0BC) {
@@ -43,7 +43,7 @@ s32 osContInit(OSMesgQueue* mq, u8* bitpattern, OSContStatus* data) {
__osContGetInitData(bitpattern, data);
__osContLastPoll = 0;
__osSiCreateAccessQueue();
- osCreateMesgQueue(&D_8009CF38, D_8009CF50, ARRAY_COUNT(D_8009CF50));
+ osCreateMesgQueue(&__osEepromTimerQ, __osEepromTimerMsg, ARRAY_COUNT(__osEepromTimerMsg));
return ret;
}
@@ -74,11 +74,11 @@ void __osPackRequestData(u8 poll) {
__OSContRequestHeader requestHeader;
s32 i;
- for (i = 0; i < 0xF; i++) {
+ for (i = 0; i < ARRAY_COUNT(__osContPifRam.ramarray); i++) {
__osContPifRam.ramarray[i] = 0;
}
- __osContPifRam.status = 1;
+ __osContPifRam.status = CONT_CMD_READ_BUTTON;
ptr = (u8*)__osContPifRam.ramarray;
requestHeader.align = 255;
requestHeader.txsize = 1;
diff --git a/src/libultra/io/devmgr.c b/src/libultra/io/devmgr.c
index c0f69c456..b27822afa 100644
--- a/src/libultra/io/devmgr.c
+++ b/src/libultra/io/devmgr.c
@@ -13,7 +13,7 @@ void __osDevMgrMain(void* arg) {
ret = 0;
while (true) {
- osRecvMesg(devMgr->cmdQueue, (OSMesg)&ioMesg, OS_MESG_BLOCK);
+ osRecvMesg(devMgr->cmdQueue, (OSMesg*)&ioMesg, OS_MESG_BLOCK);
if ((ioMesg->piHandle != NULL) && (ioMesg->piHandle->type == 2) &&
((ioMesg->piHandle->transferInfo.cmdType == OS_READ) ||
(ioMesg->piHandle->transferInfo.cmdType == OS_WRITE))) {
@@ -51,7 +51,7 @@ void __osDevMgrMain(void* arg) {
__osEPiRawWriteIo(ioMesg->piHandle, 0x05000510, transfer->bmCtlShadow | 0x1000000);
}
block->errStatus = 4;
- HW_REG(PI_STATUS_REG, u32) = PI_STATUS_CLEAR_INTR;
+ HW_REG(PI_STATUS_REG, u32) = PI_CLR_INTR;
__osSetGlobalIntMask(0x00100C01);
}
osSendMesg(ioMesg->hdr.retQueue, (OSMesg)ioMesg, OS_MESG_NOBLOCK);
diff --git a/src/libultra/io/epirawdma.c b/src/libultra/io/epirawdma.c
index aadd8ad5b..d0707dce9 100644
--- a/src/libultra/io/epirawdma.c
+++ b/src/libultra/io/epirawdma.c
@@ -4,7 +4,7 @@ s32 __osEPiRawStartDma(OSPiHandle* handle, s32 direction, uintptr_t cartAddr, vo
s32 status;
OSPiHandle* curHandle;
- while (status = HW_REG(PI_STATUS_REG, u32), status & (PI_STATUS_BUSY | PI_STATUS_IOBUSY)) {
+ while (status = HW_REG(PI_STATUS_REG, u32), status & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY)) {
;
}
diff --git a/src/libultra/io/epirawread.c b/src/libultra/io/epirawread.c
index df0c6b603..1dd2d1381 100644
--- a/src/libultra/io/epirawread.c
+++ b/src/libultra/io/epirawread.c
@@ -4,7 +4,7 @@ s32 __osEPiRawReadIo(OSPiHandle* handle, uintptr_t devAddr, u32* data) {
s32 status;
OSPiHandle* curHandle;
- while (status = HW_REG(PI_STATUS_REG, u32), status & (PI_STATUS_BUSY | PI_STATUS_IOBUSY)) {
+ while (status = HW_REG(PI_STATUS_REG, u32), status & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY)) {
;
}
diff --git a/src/libultra/io/epirawwrite.c b/src/libultra/io/epirawwrite.c
index 1e0e694a7..fe8ce81c5 100644
--- a/src/libultra/io/epirawwrite.c
+++ b/src/libultra/io/epirawwrite.c
@@ -4,7 +4,7 @@ s32 __osEPiRawWriteIo(OSPiHandle* handle, uintptr_t devAddr, u32 data) {
s32 status;
OSPiHandle* curHandle;
- while (status = HW_REG(PI_STATUS_REG, u32), status & (PI_STATUS_BUSY | PI_STATUS_IOBUSY)) {}
+ while (status = HW_REG(PI_STATUS_REG, u32), status & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY)) {}
if (__osCurrentHandle[handle->domain]->type != handle->type) {
curHandle = __osCurrentHandle[handle->domain];
diff --git a/src/libultra/io/motor.c b/src/libultra/io/motor.c
index 649a8b368..ba934d800 100644
--- a/src/libultra/io/motor.c
+++ b/src/libultra/io/motor.c
@@ -1,45 +1,45 @@
-#include "ultra64/motor.h"
+#include "PR/os_motor.h"
-#include "io/controller.h"
+#include "PR/controller.h"
#include "functions.h"
#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..a7f5173a9 100644
--- a/src/libultra/io/osViModeMpalLan1.c
+++ b/src/libultra/io/osViModeMpalLan1.c
@@ -1,34 +1,35 @@
#include "global.h"
+#include "PR/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..672a2a17f 100644
--- a/src/libultra/io/osViModeNtscHpf1.c
+++ b/src/libultra/io/osViModeNtscHpf1.c
@@ -1,34 +1,35 @@
#include "global.h"
+#include "PR/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..afbe46fab 100644
--- a/src/libultra/io/osViModeNtscLan1.c
+++ b/src/libultra/io/osViModeNtscLan1.c
@@ -1,34 +1,35 @@
#include "global.h"
+#include "PR/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..66ae4e6f1 100644
--- a/src/libultra/io/osViModePalLan1.c
+++ b/src/libultra/io/osViModePalLan1.c
@@ -1,34 +1,35 @@
#include "global.h"
+#include "PR/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..79045ce1b 100644
--- a/src/libultra/io/pfschecker.c
+++ b/src/libultra/io/pfschecker.c
@@ -1,4 +1,4 @@
-#include "PR/pfs.h"
+#include "PR/os_pfs.h"
#include "global.h"
#define CHECK_IPAGE(p) \
@@ -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/pfsdeletefile.c b/src/libultra/io/pfsdeletefile.c
index 39e9aa898..3d6558a0d 100644
--- a/src/libultra/io/pfsdeletefile.c
+++ b/src/libultra/io/pfsdeletefile.c
@@ -1,4 +1,4 @@
-#include "PR/pfs.h"
+#include "PR/os_pfs.h"
#include "global.h"
s32 __osPfsReleasePages(OSPfs* pfs, __OSInode* inode, u8 initialPage, u8 bank, __OSInodeUnit* finalPage);
diff --git a/src/libultra/io/pfsfilestate.c b/src/libultra/io/pfsfilestate.c
index a555199fc..887eac1f6 100644
--- a/src/libultra/io/pfsfilestate.c
+++ b/src/libultra/io/pfsfilestate.c
@@ -1,4 +1,4 @@
-#include "PR/pfs.h"
+#include "PR/os_pfs.h"
#include "global.h"
s32 osPfsFileState(OSPfs* pfs, s32 fileNo, OSPfsState* state) {
@@ -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/pfsfreeblocks.c b/src/libultra/io/pfsfreeblocks.c
index b90979c59..2f8c6493f 100644
--- a/src/libultra/io/pfsfreeblocks.c
+++ b/src/libultra/io/pfsfreeblocks.c
@@ -1,5 +1,5 @@
#include "global.h"
-#include "PR/pfs.h"
+#include "PR/os_pfs.h"
s32 osPfsFreeBlocks(OSPfs* pfs, s32* leftoverBytes) {
s32 j;
diff --git a/src/libultra/io/pfsinitpak.c b/src/libultra/io/pfsinitpak.c
index cc226f834..f4d917b62 100644
--- a/src/libultra/io/pfsinitpak.c
+++ b/src/libultra/io/pfsinitpak.c
@@ -1,4 +1,4 @@
-#include "PR/pfs.h"
+#include "PR/os_pfs.h"
#include "global.h"
s32 __osPfsCheckRamArea(OSPfs* pfs);
diff --git a/src/libultra/io/pfsisplug.c b/src/libultra/io/pfsisplug.c
index 474c7f914..99a2cbc42 100644
--- a/src/libultra/io/pfsisplug.c
+++ b/src/libultra/io/pfsisplug.c
@@ -1,5 +1,5 @@
-#include "PR/pfs.h"
-#include "io/controller.h"
+#include "PR/os_pfs.h"
+#include "PR/controller.h"
#include "global.h"
void __osPfsRequestData(u8 poll);
diff --git a/src/libultra/io/pfsselectbank.c b/src/libultra/io/pfsselectbank.c
index 6cc43a470..59a69fccb 100644
--- a/src/libultra/io/pfsselectbank.c
+++ b/src/libultra/io/pfsselectbank.c
@@ -1,4 +1,4 @@
-#include "PR/pfs.h"
+#include "PR/os_pfs.h"
#include "global.h"
s32 __osPfsSelectBank(OSPfs* pfs, u8 bank) {
diff --git a/src/libultra/io/piacs.c b/src/libultra/io/piacs.c
index 532b149e2..f1107b758 100644
--- a/src/libultra/io/piacs.c
+++ b/src/libultra/io/piacs.c
@@ -1,13 +1,13 @@
#include "global.h"
-UNK_TYPE4 __osPiAccessQueueEnabled = 0;
+u32 __osPiAccessQueueEnabled = 0;
-OSMesg D_8009E3F0[1];
+OSMesg piAccessBuf[1];
OSMesgQueue __osPiAccessQueue;
void __osPiCreateAccessQueue(void) {
__osPiAccessQueueEnabled = 1;
- osCreateMesgQueue(&__osPiAccessQueue, D_8009E3F0, ARRAY_COUNT(D_8009E3F0));
+ osCreateMesgQueue(&__osPiAccessQueue, piAccessBuf, ARRAY_COUNT(piAccessBuf));
osSendMesg(&__osPiAccessQueue, NULL, OS_MESG_NOBLOCK);
}
diff --git a/src/libultra/io/pimgr.c b/src/libultra/io/pimgr.c
index 3d618de74..b6e1fea13 100644
--- a/src/libultra/io/pimgr.c
+++ b/src/libultra/io/pimgr.c
@@ -1,11 +1,12 @@
#include "global.h"
+#include "stack.h"
-OSPiHandle D_8009D130;
-OSPiHandle D_8009D1A8;
-OSThread D_8009D220;
-u8 piManagerStack[0x1000];
-OSMesgQueue D_8009E3D0;
-OSMesg D_8009E3E8[1];
+OSPiHandle __Dom1SpeedParam;
+OSPiHandle __Dom2SpeedParam;
+OSThread sPiMgrThread;
+STACK(sPiMgrStack, 0x1000);
+OSMesgQueue piEventQueue;
+OSMesg piEventBuf[1];
void osCreatePiManager(OSPri pri, OSMesgQueue* cmdQ, OSMesg* cmdBuf, s32 cmdMsgCnt) {
u32 savedMask;
@@ -14,11 +15,11 @@ void osCreatePiManager(OSPri pri, OSMesgQueue* cmdQ, OSMesg* cmdBuf, s32 cmdMsgC
if (!__osPiDevMgr.active) {
osCreateMesgQueue(cmdQ, cmdBuf, cmdMsgCnt);
- osCreateMesgQueue(&D_8009E3D0, D_8009E3E8, ARRAY_COUNT(D_8009E3E8));
+ osCreateMesgQueue(&piEventQueue, piEventBuf, ARRAY_COUNT(piEventBuf));
if (!__osPiAccessQueueEnabled) {
__osPiCreateAccessQueue();
}
- osSetEventMesg(8, &D_8009E3D0, (OSMesg)0x22222222);
+ osSetEventMesg(OS_EVENT_PI, &piEventQueue, (OSMesg)0x22222222);
oldPri = -1;
myPri = osGetThreadPri(NULL);
if (myPri < pri) {
@@ -27,14 +28,14 @@ void osCreatePiManager(OSPri pri, OSMesgQueue* cmdQ, OSMesg* cmdBuf, s32 cmdMsgC
}
savedMask = __osDisableInt();
__osPiDevMgr.active = 1;
- __osPiDevMgr.thread = &D_8009D220;
+ __osPiDevMgr.thread = &sPiMgrThread;
__osPiDevMgr.cmdQueue = cmdQ;
- __osPiDevMgr.evtQueue = &D_8009E3D0;
+ __osPiDevMgr.evtQueue = &piEventQueue;
__osPiDevMgr.acsQueue = &__osPiAccessQueue;
__osPiDevMgr.piDmaCallback = __osPiRawStartDma;
__osPiDevMgr.epiDmaCallback = __osEPiRawStartDma;
- osCreateThread(&D_8009D220, 0, __osDevMgrMain, (void*)&__osPiDevMgr, &piManagerStack[4096], pri);
- osStartThread(&D_8009D220);
+ osCreateThread(&sPiMgrThread, 0, __osDevMgrMain, &__osPiDevMgr, STACK_TOP(sPiMgrStack), pri);
+ osStartThread(&sPiMgrThread);
__osRestoreInt(savedMask);
if (oldPri != -1) {
osSetThreadPri(NULL, oldPri);
diff --git a/src/libultra/io/pirawdma.c b/src/libultra/io/pirawdma.c
index 07aa1b822..b33afddfc 100644
--- a/src/libultra/io/pirawdma.c
+++ b/src/libultra/io/pirawdma.c
@@ -3,13 +3,13 @@
s32 __osPiRawStartDma(s32 direction, uintptr_t devAddr, void* dramAddr, size_t size) {
register int status = HW_REG(PI_STATUS_REG, u32);
- while (status & (PI_STATUS_IOBUSY | PI_STATUS_BUSY)) {
+ while (status & (PI_STATUS_IO_BUSY | PI_STATUS_DMA_BUSY)) {
status = HW_REG(PI_STATUS_REG, u32);
}
HW_REG(PI_DRAM_ADDR_REG, u32) = osVirtualToPhysical(dramAddr);
- HW_REG(PI_CART_ADDR_REG, u32) = ((osRomBase | devAddr) & 0x1FFFFFFF);
+ HW_REG(PI_CART_ADDR_REG, u32) = (((uintptr_t)osRomBase | devAddr) & 0x1FFFFFFF);
switch (direction) {
case OS_READ:
diff --git a/src/libultra/io/siint.h b/src/libultra/io/siint.h
deleted file mode 100644
index 5fe725844..000000000
--- a/src/libultra/io/siint.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#ifndef _SIINT_H_
-#define _SIINT_H_
-
-#endif
diff --git a/src/libultra/io/sirawdma.c b/src/libultra/io/sirawdma.c
index eb62fa2a3..08a347cc9 100644
--- a/src/libultra/io/sirawdma.c
+++ b/src/libultra/io/sirawdma.c
@@ -6,7 +6,7 @@ s32 __osSiRawStartDma(s32 direction, void* dramAddr) {
}
if (direction == OS_WRITE) {
- osWritebackDCache(dramAddr, PIF_RAM_SIZE);
+ osWritebackDCache(dramAddr, ALIGN16(PIF_RAM_END - PIF_RAM_START));
}
HW_REG(SI_DRAM_ADDR_REG, u32) = osVirtualToPhysical(dramAddr);
@@ -18,7 +18,7 @@ s32 __osSiRawStartDma(s32 direction, void* dramAddr) {
}
if (direction == OS_READ) {
- osInvalDCache(dramAddr, PIF_RAM_SIZE);
+ osInvalDCache(dramAddr, ALIGN16(PIF_RAM_END - PIF_RAM_START));
}
return 0;
}
diff --git a/src/libultra/io/sptask.c b/src/libultra/io/sptask.c
index aeaaf0f82..8445f53b0 100644
--- a/src/libultra/io/sptask.c
+++ b/src/libultra/io/sptask.c
@@ -3,7 +3,8 @@
#define _osVirtualToPhysical(ptr) \
if (ptr != NULL) { \
ptr = (void*)osVirtualToPhysical(ptr); \
- }
+ } \
+ (void)0
static OSTask sTmpTask;
diff --git a/src/libultra/io/vi.c b/src/libultra/io/vi.c
index ec0b1de70..a1e3e77c4 100644
--- a/src/libultra/io/vi.c
+++ b/src/libultra/io/vi.c
@@ -1,13 +1,13 @@
#include "global.h"
-__OSViContext D_80098060[2] = { 0 };
-__OSViContext* __osViCurr = &D_80098060[0];
-__OSViContext* __osViNext = &D_80098060[1];
+static __OSViContext vi[2] = { 0 };
+__OSViContext* __osViCurr = &vi[0];
+__OSViContext* __osViNext = &vi[1];
void __osViInit(void) {
- bzero(D_80098060, sizeof(D_80098060));
- __osViCurr = &D_80098060[0];
- __osViNext = &D_80098060[1];
+ bzero(vi, sizeof(vi));
+ __osViCurr = &vi[0];
+ __osViNext = &vi[1];
__osViNext->retraceCount = 1;
__osViCurr->retraceCount = 1;
__osViNext->buffer = (void*)0x80000000;
diff --git a/src/libultra/io/vigetcurrframebuf.c b/src/libultra/io/vigetcurrframebuf.c
index bace58ded..8127a3f63 100644
--- a/src/libultra/io/vigetcurrframebuf.c
+++ b/src/libultra/io/vigetcurrframebuf.c
@@ -1,8 +1,8 @@
#include "global.h"
-u32* osViGetCurrentFramebuffer(void) {
+void* osViGetCurrentFramebuffer(void) {
register u32 prevInt = __osDisableInt();
- u32* curBuf = __osViCurr->buffer;
+ void* curBuf = __osViCurr->buffer;
__osRestoreInt(prevInt);
diff --git a/src/libultra/io/vimgr.c b/src/libultra/io/vimgr.c
index 07babf351..7bdb3ac51 100644
--- a/src/libultra/io/vimgr.c
+++ b/src/libultra/io/vimgr.c
@@ -1,13 +1,15 @@
#include "global.h"
-#include "osint.h"
+#include "PR/osint.h"
+#include "stack.h"
+#include "PR/osint.h"
OSThread viThread;
-u8 viThreadStack[0x1000];
+STACK(sViStack, 0x1000);
OSMesgQueue viEventQueue;
OSMesg viEventBuf[6];
OSIoMesg viRetraceMsg;
OSIoMesg viCounterMsg;
-OSMgrArgs __osViDevMgr = { 0 };
+OSDevMgr __osViDevMgr = { 0 };
u32 __additional_scanline = 0;
void viMgrMain(void*);
@@ -17,7 +19,7 @@ void osCreateViManager(OSPri pri) {
OSPri newPri;
OSPri currentPri;
- if (!__osViDevMgr.initialized) {
+ if (!__osViDevMgr.active) {
__osTimerServicesInit();
__additional_scanline = 0;
osCreateMesgQueue(&viEventQueue, viEventBuf, ARRAY_COUNT(viEventBuf) - 1);
@@ -37,15 +39,15 @@ void osCreateViManager(OSPri pri) {
}
prevInt = __osDisableInt();
- __osViDevMgr.initialized = true;
- __osViDevMgr.mgrThread = &viThread;
+ __osViDevMgr.active = true;
+ __osViDevMgr.thread = &viThread;
__osViDevMgr.cmdQueue = &viEventQueue;
- __osViDevMgr.eventQueue = &viEventQueue;
- __osViDevMgr.accessQueue = NULL;
+ __osViDevMgr.evtQueue = &viEventQueue;
+ __osViDevMgr.acsQueue = NULL;
__osViDevMgr.piDmaCallback = NULL;
__osViDevMgr.epiDmaCallback = NULL;
- osCreateThread(&viThread, 0, &viMgrMain, &__osViDevMgr, viThreadStack + sizeof(viThreadStack), pri);
+ osCreateThread(&viThread, 0, &viMgrMain, &__osViDevMgr, STACK_TOP(sViStack), pri);
__osViInit();
osStartThread(&viThread);
__osRestoreInt(prevInt);
@@ -71,7 +73,7 @@ void viMgrMain(void* vargs) {
args = (OSMgrArgs*)vargs;
while (true) {
- osRecvMesg(args->eventQueue, (OSMesg)&mesg, OS_MESG_BLOCK);
+ osRecvMesg(args->eventQueue, (OSMesg*)&mesg, OS_MESG_BLOCK);
switch (mesg->hdr.type) {
case OS_MESG_TYPE_VRETRACE:
__osViSwapContext();
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/createthread.c b/src/libultra/os/createthread.c
index 0e61b0583..e67743eb3 100644
--- a/src/libultra/os/createthread.c
+++ b/src/libultra/os/createthread.c
@@ -1,28 +1,28 @@
#include "global.h"
-void osCreateThread(OSThread* t, OSId id, void* entry, void* arg, void* sp, OSPri p) {
+void osCreateThread(OSThread* thread, OSId id, void* entry, void* arg, void* sp, OSPri p) {
register u32 saveMask;
OSIntMask mask;
- t->id = id;
- t->priority = p;
- t->next = NULL;
- t->queue = NULL;
- t->context.pc = (u32)entry;
- t->context.a0 = arg;
- t->context.sp = (u64)(s32)sp - 16;
- t->context.ra = __osCleanupThread;
+ thread->id = id;
+ thread->priority = p;
+ thread->next = NULL;
+ thread->queue = NULL;
+ thread->context.pc = (u32)entry;
+ thread->context.a0 = arg;
+ thread->context.sp = (u64)(s32)sp - 16;
+ thread->context.ra = __osCleanupThread;
mask = 0x3FFF01;
- t->context.sr = 0xFF03;
- t->context.rcp = (mask & 0x3F0000) >> 16;
- t->context.fpcsr = 0x01000800;
- t->fp = 0;
- t->state = 1;
- t->flags = 0;
+ thread->context.sr = 0xFF03;
+ thread->context.rcp = (mask & 0x3F0000) >> 16;
+ thread->context.fpcsr = 0x01000800;
+ thread->fp = 0;
+ thread->state = 1;
+ thread->flags = 0;
saveMask = __osDisableInt();
- t->tlnext = __osActiveQueue;
- __osActiveQueue = t;
+ thread->tlnext = __osActiveQueue;
+ __osActiveQueue = thread;
__osRestoreInt(saveMask);
}
diff --git a/src/libultra/os/gethwinterrupt.c b/src/libultra/os/gethwinterrupt.c
index dacd43910..711985df7 100644
--- a/src/libultra/os/gethwinterrupt.c
+++ b/src/libultra/os/gethwinterrupt.c
@@ -1,7 +1,8 @@
#include "global.h"
-#include "os_internal.h"
+#include "PR/os_internal.h"
+#include "PR/osint.h"
-void __osGetHWIntrRoutine(s32 idx, OSMesgQueue** outQueue, OSMesg* outMsg) {
+void __osGetHWIntrRoutine(OSHWIntr idx, OSMesgQueue** outQueue, OSMesg* outMsg) {
*outQueue = __osHwIntTable[idx].queue;
*outMsg = __osHwIntTable[idx].msg;
}
diff --git a/src/libultra/os/initialize.c b/src/libultra/os/initialize.c
index 9fbf5ff64..458aa55b9 100644
--- a/src/libultra/os/initialize.c
+++ b/src/libultra/os/initialize.c
@@ -7,49 +7,48 @@ typedef struct {
/* 0x4 */ u32 ins_04; // addiu k0, k0, 0x39E0
/* 0x8 */ u32 ins_08; // jr k0 ; __osException
/* 0xC */ u32 ins_0C; // nop
-} struct_exceptionPreamble;
+} __osExceptionVector; // size = 0x10
+
+extern __osExceptionVector __osExceptionPreamble;
u64 osClockRate = OS_CLOCK_RATE;
s32 osViClock = VI_NTSC_CLOCK;
-UNK_TYPE4 __osShutdown = 0;
-UNK_TYPE4 __OSGlobalIntMask = 0x003FFF01;
+u32 __osShutdown = 0;
+u32 __OSGlobalIntMask = 0x003FFF01;
-UNK_TYPE4 D_8009CF70;
+u32 __osFinalrom;
void __createSpeedParam(void) {
- D_8009D130.type = DEVICE_TYPE_INIT;
- D_8009D130.latency = HW_REG(PI_BSD_DOM1_LAT_REG, u32);
- D_8009D130.pulse = HW_REG(PI_BSD_DOM1_PWD_REG, u32);
- D_8009D130.pageSize = HW_REG(PI_BSD_DOM1_PGS_REG, u32);
- D_8009D130.relDuration = HW_REG(PI_BSD_DOM1_RLS_REG, u32);
+ __Dom1SpeedParam.type = DEVICE_TYPE_INIT;
+ __Dom1SpeedParam.latency = HW_REG(PI_BSD_DOM1_LAT_REG, u32);
+ __Dom1SpeedParam.pulse = HW_REG(PI_BSD_DOM1_PWD_REG, u32);
+ __Dom1SpeedParam.pageSize = HW_REG(PI_BSD_DOM1_PGS_REG, u32);
+ __Dom1SpeedParam.relDuration = HW_REG(PI_BSD_DOM1_RLS_REG, u32);
- D_8009D1A8.type = DEVICE_TYPE_INIT;
- D_8009D1A8.latency = HW_REG(PI_BSD_DOM2_LAT_REG, u32);
- D_8009D1A8.pulse = HW_REG(PI_BSD_DOM2_PWD_REG, u32);
- D_8009D1A8.pageSize = HW_REG(PI_BSD_DOM2_PGS_REG, u32);
- D_8009D1A8.relDuration = HW_REG(PI_BSD_DOM2_RLS_REG, u32);
+ __Dom2SpeedParam.type = DEVICE_TYPE_INIT;
+ __Dom2SpeedParam.latency = HW_REG(PI_BSD_DOM2_LAT_REG, u32);
+ __Dom2SpeedParam.pulse = HW_REG(PI_BSD_DOM2_PWD_REG, u32);
+ __Dom2SpeedParam.pageSize = HW_REG(PI_BSD_DOM2_PGS_REG, u32);
+ __Dom2SpeedParam.relDuration = HW_REG(PI_BSD_DOM2_RLS_REG, u32);
}
-void osInitialize(void) {
+void __osInitialize_common(void) {
u32 pifdata;
- D_8009CF70 = 1;
+ __osFinalrom = 1;
__osSetSR(__osGetSR() | 0x20000000);
__osSetFpcCsr(0x01000800);
__osSetWatchLo(0x04900000);
- while (__osSiRawReadIo(0x1FC007FC, &pifdata)) {
- ;
- }
- while (__osSiRawWriteIo(0x1FC007FC, pifdata | 8)) {
- ;
- }
+ while (__osSiRawReadIo(0x1FC007FC, &pifdata)) {}
- *(struct_exceptionPreamble*)0x80000000 = *((struct_exceptionPreamble*)__osExceptionPreamble);
- *(struct_exceptionPreamble*)0x80000080 = *((struct_exceptionPreamble*)__osExceptionPreamble);
- *(struct_exceptionPreamble*)0x80000100 = *((struct_exceptionPreamble*)__osExceptionPreamble);
- *(struct_exceptionPreamble*)0x80000180 = *((struct_exceptionPreamble*)__osExceptionPreamble);
+ while (__osSiRawWriteIo(0x1FC007FC, pifdata | 8)) {}
+
+ *(__osExceptionVector*)0x80000000 = __osExceptionPreamble;
+ *(__osExceptionVector*)0x80000080 = __osExceptionPreamble;
+ *(__osExceptionVector*)0x80000100 = __osExceptionPreamble;
+ *(__osExceptionVector*)0x80000180 = __osExceptionPreamble;
osWritebackDCache(0x80000000, 400);
osInvalICache(0x80000000, 400);
@@ -60,7 +59,7 @@ void osInitialize(void) {
osClockRate = (u64)((osClockRate * 3LL) / 4ULL);
if (osResetType == COLD_RESET) {
- bzero(osAppNmiBuffer, 64);
+ bzero(osAppNMIBuffer, 64);
}
if (osTvType == OS_TV_PAL) {
@@ -72,9 +71,7 @@ void osInitialize(void) {
}
if (__osGetCause() & 0x1000) {
- while (1) {
- ;
- }
+ while (true) {}
}
HW_REG(AI_CONTROL_REG, u32) = 1;
diff --git a/src/libultra/os/resetglobalintmask.c b/src/libultra/os/resetglobalintmask.c
index c2561d712..6289a1d4c 100644
--- a/src/libultra/os/resetglobalintmask.c
+++ b/src/libultra/os/resetglobalintmask.c
@@ -1,6 +1,6 @@
#include "global.h"
-void __osResetGlobalIntMask(u32 mask) {
+void __osResetGlobalIntMask(OSHWIntr mask) {
register s32 prevInt = __osDisableInt();
__OSGlobalIntMask &= ~(mask & ~0x401);
diff --git a/src/libultra/os/seteventmesg.c b/src/libultra/os/seteventmesg.c
index 8be2ff9e2..74258517f 100644
--- a/src/libultra/os/seteventmesg.c
+++ b/src/libultra/os/seteventmesg.c
@@ -1,8 +1,10 @@
#include "global.h"
+#include "PR/osint.h"
+#include "libc/stdbool.h"
-UNK_TYPE4 D_80097F10 = 0;
+u32 __osPreNMI = false;
-__OSEventState __osEventStateTab[16];
+__OSEventState __osEventStateTab[OS_NUM_EVENTS];
void osSetEventMesg(OSEvent e, OSMesgQueue* mq, OSMesg m) {
register u32 saveMask;
@@ -16,10 +18,10 @@ void osSetEventMesg(OSEvent e, OSMesgQueue* mq, OSMesg m) {
es->message = m;
if (e == 14) {
- if (__osShutdown != 0 && D_80097F10 == 0) {
+ if (__osShutdown && !__osPreNMI) {
osSendMesg(mq, m, OS_MESG_NOBLOCK);
}
- D_80097F10 = 1;
+ __osPreNMI = true;
}
__osRestoreInt(saveMask);
diff --git a/src/libultra/os/setglobalintmask.c b/src/libultra/os/setglobalintmask.c
index 6b7895d6d..067343f6e 100644
--- a/src/libultra/os/setglobalintmask.c
+++ b/src/libultra/os/setglobalintmask.c
@@ -1,6 +1,6 @@
#include "global.h"
-void __osSetGlobalIntMask(u32 mask) {
+void __osSetGlobalIntMask(OSHWIntr mask) {
register s32 prevInt = __osDisableInt();
__OSGlobalIntMask |= mask;
diff --git a/src/libultra/os/sethwinterrupt.c b/src/libultra/os/sethwinterrupt.c
index 6ba72be7a..4f536cade 100644
--- a/src/libultra/os/sethwinterrupt.c
+++ b/src/libultra/os/sethwinterrupt.c
@@ -1,6 +1,7 @@
#include "global.h"
+#include "PR/osint.h"
-void __osSetHWIntrRoutine(s32 idx, OSMesgQueue* queue, OSMesg msg) {
+void __osSetHWIntrRoutine(OSHWIntr idx, OSMesgQueue* queue, OSMesg msg) {
register s32 prevInt = __osDisableInt();
__osHwIntTable[idx].queue = queue;
diff --git a/src/libultra/os/setthreadpri.c b/src/libultra/os/setthreadpri.c
index fde6e78dd..2da5bf266 100644
--- a/src/libultra/os/setthreadpri.c
+++ b/src/libultra/os/setthreadpri.c
@@ -1,20 +1,20 @@
#include "global.h"
-void osSetThreadPri(OSThread* t, OSPri p) {
+void osSetThreadPri(OSThread* thread, OSPri p) {
register u32 saveMask;
saveMask = __osDisableInt();
- if (t == NULL) {
- t = __osRunningThread;
+ if (thread == NULL) {
+ thread = __osRunningThread;
}
- if (t->priority != p) {
- t->priority = p;
+ if (thread->priority != p) {
+ thread->priority = p;
- if (t != __osRunningThread && t->state != 1) {
- __osDequeueThread(t->queue, t);
- __osEnqueueThread(t->queue, t);
+ if (thread != __osRunningThread && thread->state != 1) {
+ __osDequeueThread(thread->queue, thread);
+ __osEnqueueThread(thread->queue, thread);
}
if (__osRunningThread->priority < __osRunQueue->priority) {
diff --git a/src/libultra/os/settimer.c b/src/libultra/os/settimer.c
index c6de3c3e4..77f568a02 100644
--- a/src/libultra/os/settimer.c
+++ b/src/libultra/os/settimer.c
@@ -21,9 +21,9 @@ int osSetTimer(OSTimer* t, OSTime value, OSTime interval, OSMesgQueue* mq, OSMes
saveMask = __osDisableInt();
if (__osTimerList->next != __osTimerList) {
- if (0) {
- ;
- }
+ //! FAKE:
+ if (1) {}
+
spC = __osTimerList->next;
sp14 = osGetCount();
sp10 = sp14 - __osTimerCounter;
diff --git a/src/libultra/os/thread.c b/src/libultra/os/thread.c
index ec655d64a..98d04ab54 100644
--- a/src/libultra/os/thread.c
+++ b/src/libultra/os/thread.c
@@ -1,7 +1,6 @@
#include "global.h"
-OSThread* __osThreadTail = NULL;
-UNK_TYPE D_80097E14 = -1;
+__OSThreadTail __osThreadTail = { NULL, OS_PRIORITY_THREADTAIL };
OSThread* __osRunQueue = (OSThread*)&__osThreadTail;
OSThread* __osActiveQueue = (OSThread*)&__osThreadTail;
OSThread* __osRunningThread = NULL;
@@ -11,7 +10,7 @@ void __osDequeueThread(OSThread** queue, OSThread* t) {
register OSThread* pred;
register OSThread* succ;
- pred = (OSThread*)queue; //! This seems questionable, but the function matches...
+ pred = (OSThread*)queue;
succ = pred->next;
while (succ != NULL) {
if (succ == t) {
diff --git a/src/libultra/os/timerintr.c b/src/libultra/os/timerintr.c
index 87f7129df..69ac931e1 100644
--- a/src/libultra/os/timerintr.c
+++ b/src/libultra/os/timerintr.c
@@ -1,6 +1,6 @@
#include "global.h"
-OSTimer D_8009E590;
+OSTimer __osBaseTimer;
OSTime __osCurrentTime;
u32 __osBaseCounter;
u32 __osViIntrCount;
@@ -8,7 +8,7 @@ u32 __osTimerCounter;
s32 D_8009E5C8[2]; // dummy bss padding required
OSPifRam __osPfsPifRam;
-OSTimer* __osTimerList = &D_8009E590;
+OSTimer* __osTimerList = &__osBaseTimer;
void __osTimerServicesInit(void) {
__osCurrentTime = 0;
@@ -29,7 +29,7 @@ void __osTimerInterrupt(void) {
if (__osTimerList->next == __osTimerList) {
return;
}
- while (1) {
+ while (true) {
t = __osTimerList->next;
if (t == __osTimerList) {
__osSetCompare(0);
@@ -84,9 +84,8 @@ OSTime __osInsertTimer(OSTimer* t) {
savedMask = __osDisableInt();
for (timep = __osTimerList->next, tim = t->value; timep != __osTimerList && tim > timep->value;
- tim -= timep->value, timep = timep->next) {
- ;
- }
+ tim -= timep->value, timep = timep->next) {}
+
t->value = tim;
if (timep != __osTimerList) {
timep->value -= tim;
diff --git a/src/libultra/os/virtualtophysical.c b/src/libultra/os/virtualtophysical.c
index 6bdb2ccb3..403ab5f4f 100644
--- a/src/libultra/os/virtualtophysical.c
+++ b/src/libultra/os/virtualtophysical.c
@@ -1,5 +1,5 @@
#include "PR/ultratypes.h"
-#include "osint.h"
+#include "PR/osint.h"
#include "libc/stdint.h"
#include "global.h"
diff --git a/src/libultra/rmon/sprintf.c b/src/libultra/rmon/sprintf.c
index 446a74702..9f3610fe0 100644
--- a/src/libultra/rmon/sprintf.c
+++ b/src/libultra/rmon/sprintf.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "libc/string.h"
void* proutSprintf(void* dst, const char* fmt, size_t size) {
return (void*)((uintptr_t)memcpy(dst, fmt, size) + size);
@@ -12,7 +13,7 @@ int vsprintf(char* dst, char* fmt, va_list args) {
return ans;
}
-int sprintf(char* dst, char* fmt, ...) {
+int sprintf(char* dst, const char* fmt, ...) {
int ans;
va_list args;
va_start(args, fmt);
diff --git a/src/libultra/rmon/xldtob.c b/src/libultra/rmon/xldtob.c
index 460d0951c..e30bf4b81 100644
--- a/src/libultra/rmon/xldtob.c
+++ b/src/libultra/rmon/xldtob.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "libc/string.h"
#define BUFF_LEN 0x20
@@ -61,7 +62,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 +102,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 +125,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 +179,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 +226,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..70b9c32a4 100644
--- a/src/libultra/rmon/xlitob.c
+++ b/src/libultra/rmon/xlitob.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "libc/string.h"
#define BUFF_LEN 0x18
@@ -27,13 +28,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 +48,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..3fc6b5e2a 100644
--- a/src/libultra/rmon/xprintf.c
+++ b/src/libultra/rmon/xprintf.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "libc/string.h"
#define ATOI(i, a) \
for (i = 0; *a >= '0' && *a <= '9'; a++) \
@@ -28,6 +29,8 @@
char spaces[] = " ";
char zeroes[] = "00000000000000000000000000000000";
+void _Putfld(_Pft* px, va_list* pap, unsigned char code, unsigned char* ac);
+
int _Printf(PrintCallback pfn, void* arg, const char* fmt, va_list ap) {
_Pft x;
x.nchar = 0;
@@ -42,7 +45,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 +209,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/voicecheckresult.c b/src/libultra/voice/voicecheckresult.c
index 44fb69be5..252472192 100644
--- a/src/libultra/voice/voicecheckresult.c
+++ b/src/libultra/voice/voicecheckresult.c
@@ -1,3 +1,30 @@
-#include "global.h"
+/**
+ * File: voicecheckresult.c
+ */
-#pragma GLOBAL_ASM("asm/non_matchings/boot/voicecheckresult/__osVoiceCheckResult.s")
+#include "PR/controller_voice.h"
+#include "PR/controller.h"
+#include "PR/os_voice.h"
+
+s32 __osVoiceCheckResult(OSVoiceHandle* hd, u8* status) {
+ s32 errorCode = __osVoiceGetStatus(hd->mq, hd->channel, status);
+ u8 data[2];
+
+ if (errorCode == 0) {
+ if (*status & 1) {
+ errorCode = CONT_ERR_VOICE_NO_RESPONSE;
+ } else {
+ errorCode = __osVoiceContRead2(hd->mq, hd->channel, 0, data);
+ if (errorCode == 0) {
+ hd->status = data[0] & 7;
+
+ if (data[0] & 0x40) {
+ errorCode = CONT_ERR_VOICE_NO_RESPONSE;
+ } else {
+ errorCode = data[1] << 8;
+ }
+ }
+ }
+ }
+ return errorCode;
+}
diff --git a/src/libultra/voice/voicecheckword.c b/src/libultra/voice/voicecheckword.c
index 8b5ac0dfb..b4c05d90c 100644
--- a/src/libultra/voice/voicecheckword.c
+++ b/src/libultra/voice/voicecheckword.c
@@ -1,3 +1,107 @@
-#include "global.h"
+/**
+ * File: voicecheckwork.c
+ *
+ * Checks whether or not a word can be registered in the dictionary
+ */
+#include "PR/controller.h"
-#pragma GLOBAL_ASM("asm/non_matchings/boot/voicecheckword/osVoiceCheckWord.s")
+// TODO: SJIS support
+s32 osVoiceCheckWord(u8* word) {
+ s32 i;
+ s32 errorCode = 0;
+ u16 curSyllable;
+ u16 prevSyllable = 0;
+
+ for (i = 0; word[i] != 0; i += 2) {
+ curSyllable = (word[i] << 8) + word[i + 1];
+ if (((curSyllable != 0x815B) && (curSyllable < 0x829F)) ||
+ ((curSyllable >= 0x82F2) && (curSyllable < 0x8340)) || (curSyllable == 0x837F) || (curSyllable >= 0x8397)) {
+ errorCode = CONT_ERR_VOICE_WORD;
+ } else if ((i == 0) && ((curSyllable == 0x815B) || (curSyllable == 0x82F1) || (curSyllable == 0x82C1) ||
+ (curSyllable == 0x82EC) || (curSyllable == 0x8393) || (curSyllable == 0x8362) ||
+ (curSyllable == 0x838E) || (curSyllable == 0x8395) || (curSyllable == 0x8396))) {
+ errorCode = CONT_ERR_VOICE_WORD;
+ } else if (((curSyllable == 0x829F) || (curSyllable == 0x8340)) && (prevSyllable != 0x82D3) &&
+ (prevSyllable != 0x8374) && (prevSyllable != 0x8394)) {
+ errorCode = CONT_ERR_VOICE_WORD;
+ } else if (((curSyllable == 0x82A1) || (curSyllable == 0x8342)) && (prevSyllable != 0x82A4) &&
+ (prevSyllable != 0x82C4) && (prevSyllable != 0x82C5) && (prevSyllable != 0x82D3) &&
+ (prevSyllable != 0x8345) && (prevSyllable != 0x8365) && (prevSyllable != 0x8366) &&
+ (prevSyllable != 0x8374) && (prevSyllable != 0x8394)) {
+ errorCode = CONT_ERR_VOICE_WORD;
+ } else if (((curSyllable == 0x82A3) || (curSyllable == 0x8344)) && (prevSyllable != 0x82C6) &&
+ (prevSyllable != 0x82C7) && (prevSyllable != 0x82D3) && (prevSyllable != 0x8367) &&
+ (prevSyllable != 0x8368) && (prevSyllable != 0x8374) && (prevSyllable != 0x8394)) {
+ errorCode = CONT_ERR_VOICE_WORD;
+ } else if (((curSyllable == 0x82A5) || (curSyllable == 0x8346)) && (prevSyllable != 0x82A4) &&
+ (prevSyllable != 0x82B5) && (prevSyllable != 0x82B6) && (prevSyllable != 0x82BF) &&
+ (prevSyllable != 0x82C0) && (prevSyllable != 0x82C2) && (prevSyllable != 0x82D3) &&
+ (prevSyllable != 0x8345) && (prevSyllable != 0x8356) && (prevSyllable != 0x8357) &&
+ (prevSyllable != 0x8360) && (prevSyllable != 0x8361) && (prevSyllable != 0x8363) &&
+ (prevSyllable != 0x8374) && (prevSyllable != 0x8394)) {
+ errorCode = CONT_ERR_VOICE_WORD;
+ } else if (((curSyllable == 0x82A7) || (curSyllable == 0x8348)) && (prevSyllable != 0x82A4) &&
+ (prevSyllable != 0x82D3) && (prevSyllable != 0x8345) && (prevSyllable != 0x8374) &&
+ (prevSyllable != 0x8394)) {
+ errorCode = CONT_ERR_VOICE_WORD;
+ } else if (((curSyllable == 0x82E1) || (curSyllable == 0x82E3) || (curSyllable == 0x82E5) ||
+ (curSyllable == 0x8383) || (curSyllable == 0x8385) || (curSyllable == 0x8387)) &&
+ (prevSyllable != 0x82AB) && (prevSyllable != 0x82B5) && (prevSyllable != 0x82BF) &&
+ (prevSyllable != 0x82C9) && (prevSyllable != 0x82D0) && (prevSyllable != 0x82DD) &&
+ (prevSyllable != 0x82E8) && (prevSyllable != 0x82AC) && (prevSyllable != 0x82B6) &&
+ (prevSyllable != 0x82C0) && (prevSyllable != 0x82D1) && (prevSyllable != 0x82D2) &&
+ (prevSyllable != 0x834C) && (prevSyllable != 0x8356) && (prevSyllable != 0x8360) &&
+ (prevSyllable != 0x836A) && (prevSyllable != 0x8371) && (prevSyllable != 0x837E) &&
+ (prevSyllable != 0x838A) && (prevSyllable != 0x834D) && (prevSyllable != 0x8357) &&
+ (prevSyllable != 0x8361) && (prevSyllable != 0x8372) && (prevSyllable != 0x8373) &&
+ (prevSyllable != 0x8394)) {
+ errorCode = CONT_ERR_VOICE_WORD;
+ } else if ((curSyllable == 0x815B) && ((prevSyllable == 0x82F1) || (prevSyllable == 0x82C1) ||
+ (prevSyllable == 0x8393) || (prevSyllable == 0x8362))) {
+ errorCode = CONT_ERR_VOICE_WORD;
+ } else if (((curSyllable == 0x82F1) || (curSyllable == 0x8393)) &&
+ ((prevSyllable == 0x82F1) || (prevSyllable == 0x8393))) {
+ errorCode = CONT_ERR_VOICE_WORD;
+ } else if (((prevSyllable == 0x82C1) || (prevSyllable == 0x8362)) &&
+ ((curSyllable == 0x815B) || (curSyllable == 0x82A0) || (curSyllable == 0x82A2) ||
+ (curSyllable == 0x82A4) || (curSyllable == 0x82A6) || (curSyllable == 0x82A8) ||
+ (curSyllable == 0x82C8) || (curSyllable == 0x82C9) || (curSyllable == 0x82CA) ||
+ (curSyllable == 0x82CB) || (curSyllable == 0x82CC) || (curSyllable == 0x82DC) ||
+ (curSyllable == 0x82DD) || (curSyllable == 0x82DE) || (curSyllable == 0x82DF) ||
+ (curSyllable == 0x82E0) || (curSyllable == 0x82E2) || (curSyllable == 0x82E4) ||
+ (curSyllable == 0x82E6) || (curSyllable == 0x82E7) || (curSyllable == 0x82E8) ||
+ (curSyllable == 0x82E9) || (curSyllable == 0x82EA) || (curSyllable == 0x82EB) ||
+ (curSyllable == 0x82ED) || (curSyllable == 0x82EE) || (curSyllable == 0x82EF) ||
+ (curSyllable == 0x82F0) || (curSyllable == 0x82F1) || (curSyllable == 0x829F) ||
+ (curSyllable == 0x82A1) || (curSyllable == 0x82A3) || (curSyllable == 0x82A5) ||
+ (curSyllable == 0x82A7) || (curSyllable == 0x82E1) || (curSyllable == 0x82E3) ||
+ (curSyllable == 0x82E5) || (curSyllable == 0x82C1) || (curSyllable == 0x82EC) ||
+ (curSyllable == 0x8341) || (curSyllable == 0x8343) || (curSyllable == 0x8345) ||
+ (curSyllable == 0x8347) || (curSyllable == 0x8349) || (curSyllable == 0x8369) ||
+ (curSyllable == 0x836A) || (curSyllable == 0x836B) || (curSyllable == 0x836C) ||
+ (curSyllable == 0x836D) || (curSyllable == 0x837D) || (curSyllable == 0x837E) ||
+ (curSyllable == 0x8380) || (curSyllable == 0x8381) || (curSyllable == 0x8382) ||
+ (curSyllable == 0x8384) || (curSyllable == 0x8386) || (curSyllable == 0x8388) ||
+ (curSyllable == 0x8389) || (curSyllable == 0x838A) || (curSyllable == 0x838B) ||
+ (curSyllable == 0x838C) || (curSyllable == 0x838D) || (curSyllable == 0x838F) ||
+ (curSyllable == 0x8390) || (curSyllable == 0x8391) || (curSyllable == 0x8392) ||
+ (curSyllable == 0x8393) || (curSyllable == 0x8340) || (curSyllable == 0x8342) ||
+ (curSyllable == 0x8344) || (curSyllable == 0x8346) || (curSyllable == 0x8348) ||
+ (curSyllable == 0x8383) || (curSyllable == 0x8385) || (curSyllable == 0x8387) ||
+ (curSyllable == 0x8362) || (curSyllable == 0x838E))) {
+ errorCode = CONT_ERR_VOICE_WORD;
+ }
+
+ if (errorCode != 0) {
+ return errorCode;
+ }
+
+ prevSyllable = curSyllable;
+ }
+
+ if ((curSyllable == 0x82C1) || (curSyllable == 0x8362)) {
+ errorCode = CONT_ERR_VOICE_WORD;
+ }
+
+ return errorCode;
+}
diff --git a/src/libultra/voice/voicecleardictionary.c b/src/libultra/voice/voicecleardictionary.c
index 29766bb2a..eceb9bb71 100644
--- a/src/libultra/voice/voicecleardictionary.c
+++ b/src/libultra/voice/voicecleardictionary.c
@@ -1,3 +1,51 @@
-#include "global.h"
+/**
+ * File: voicecleardictionary.c
+ *
+ * Initializes Voice Recognition System word registration dictionary.
+ *
+ * The dictionary is initialized so that the specified "numWords" can be
+ * registered in the dictionary. 1-255 words can be registered in the dictionary.
+ *
+ * Words cannot be registered with the osVoiceSetWord before the dictionary
+ * is initialized with the osVoiceClearDictionary function
+ */
-#pragma GLOBAL_ASM("asm/non_matchings/boot/voicecleardictionary/osVoiceClearDictionary.s")
+#include "PR/controller_voice.h"
+#include "PR/controller.h"
+#include "PR/os_voice.h"
+
+s32 osVoiceClearDictionary(OSVoiceHandle* hd, u8 numWords) {
+ s32 errorCode;
+ u8 status;
+ u8 data[4];
+
+ errorCode = __osVoiceGetStatus(hd->mq, hd->channel, &status);
+ if (errorCode != 0) {
+ return errorCode;
+ }
+
+ if (status & 2) {
+ return CONT_ERR_VOICE_NO_RESPONSE;
+ }
+
+ /**
+ * data[0] = 2
+ * data[1] = 0
+ * data[2] = numWords
+ * data[3] = 0
+ */
+ *(u32*)data = 0x2000000;
+ data[2] = numWords;
+
+ errorCode = __osVoiceContWrite4(hd->mq, hd->channel, 0, data);
+ if (errorCode != 0) {
+ return errorCode;
+ }
+
+ errorCode = __osVoiceCheckResult(hd, &status);
+ if (errorCode & 0xFF00) {
+ errorCode = CONT_ERR_INVALID;
+ }
+
+ return errorCode;
+}
diff --git a/src/libultra/voice/voicecontread2.c b/src/libultra/voice/voicecontread2.c
index 38350ee5f..ba60a64c3 100644
--- a/src/libultra/voice/voicecontread2.c
+++ b/src/libultra/voice/voicecontread2.c
@@ -1,3 +1,75 @@
-#include "global.h"
+/**
+ * File: voicecontread2.c
+ */
-#pragma GLOBAL_ASM("asm/non_matchings/boot/voicecontread2/__osVoiceContRead2.s")
+#include "PR/controller_voice.h"
+#include "PR/voice_internal.h"
+#include "PR/controller.h"
+#include "functions.h"
+#include "variables.h"
+
+#define READ2FORMAT(ptr) ((__OSVoiceRead2Format*)(ptr))
+
+s32 __osVoiceContRead2(OSMesgQueue* mq, s32 channel, u16 address, u8 dst[2]) {
+ s32 errorCode;
+ u8 status;
+ u8* ptr;
+ s32 retryCount = 2;
+ s32 i;
+
+ __osSiGetAccess();
+
+ do {
+ ptr = (u8*)&__osPfsPifRam.ramarray;
+
+ if ((__osContLastPoll != CONT_CMD_READ2_VOICE) || (channel != __osPfsLastChannel)) {
+ __osContLastPoll = CONT_CMD_READ2_VOICE;
+ __osPfsLastChannel = channel;
+
+ for (i = 0; i < channel; i++, *ptr++ = 0) {}
+
+ __osPfsPifRam.status = CONT_CMD_EXE;
+
+ READ2FORMAT(ptr)->dummy = CONT_CMD_NOP;
+ READ2FORMAT(ptr)->txsize = CONT_CMD_READ2_VOICE_TX;
+ READ2FORMAT(ptr)->rxsize = CONT_CMD_READ2_VOICE_RX;
+ READ2FORMAT(ptr)->cmd = CONT_CMD_READ2_VOICE;
+ READ2FORMAT(ptr)->datacrc = 0xFF;
+
+ ptr[sizeof(__OSVoiceRead2Format)] = CONT_CMD_END;
+ } else {
+ ptr += channel;
+ }
+
+ READ2FORMAT(ptr)->addrh = address >> 3;
+ READ2FORMAT(ptr)->addrl = (address << 5) | __osContAddressCrc(address);
+
+ __osSiRawStartDma(OS_WRITE, &__osPfsPifRam);
+ osRecvMesg(mq, NULL, OS_MESG_BLOCK);
+ __osSiRawStartDma(OS_READ, &__osPfsPifRam);
+ osRecvMesg(mq, NULL, OS_MESG_BLOCK);
+
+ errorCode = CHNL_ERR(*READ2FORMAT(ptr));
+
+ if (errorCode == 0) {
+ if (__osVoiceContDataCrc(READ2FORMAT(ptr)->data, ARRAY_COUNT(READ2FORMAT(ptr)->data)) !=
+ READ2FORMAT(ptr)->datacrc) {
+ errorCode = __osVoiceGetStatus(mq, channel, &status);
+ if (errorCode != 0) {
+ break;
+ }
+
+ errorCode = CONT_ERR_CONTRFAIL;
+ } else {
+ bcopy(READ2FORMAT(ptr)->data, dst, ARRAY_COUNT(READ2FORMAT(ptr)->data));
+ }
+ } else {
+ errorCode = CONT_ERR_NO_CONTROLLER;
+ }
+
+ } while ((errorCode == CONT_ERR_CONTRFAIL) && (retryCount-- >= 0));
+
+ __osSiRelAccess();
+
+ return errorCode;
+}
diff --git a/src/libultra/voice/voicecontread36.c b/src/libultra/voice/voicecontread36.c
index 38f3fe2f0..248360b00 100644
--- a/src/libultra/voice/voicecontread36.c
+++ b/src/libultra/voice/voicecontread36.c
@@ -1,3 +1,75 @@
-#include "global.h"
+/**
+ * File: voicecontread36.c
+ */
-#pragma GLOBAL_ASM("asm/non_matchings/boot/voicecontread36/__osVoiceContRead36.s")
+#include "PR/controller_voice.h"
+#include "PR/voice_internal.h"
+#include "PR/controller.h"
+#include "functions.h"
+#include "variables.h"
+
+#define READ36FORMAT(ptr) ((__OSVoiceRead36Format*)(ptr))
+
+s32 __osVoiceContRead36(OSMesgQueue* mq, s32 channel, u16 address, u8 dst[36]) {
+ s32 errorCode;
+ u8 status;
+ u8* ptr;
+ s32 retryCount = 2;
+ s32 i;
+
+ __osSiGetAccess();
+
+ do {
+ ptr = (u8*)&__osPfsPifRam.ramarray;
+
+ if ((__osContLastPoll != CONT_CMD_READ36_VOICE) || (channel != __osPfsLastChannel)) {
+ __osContLastPoll = CONT_CMD_READ36_VOICE;
+ __osPfsLastChannel = channel;
+
+ for (i = 0; i < channel; i++, *ptr++ = 0) {}
+
+ __osPfsPifRam.status = CONT_CMD_EXE;
+
+ READ36FORMAT(ptr)->dummy = CONT_CMD_NOP;
+ READ36FORMAT(ptr)->txsize = CONT_CMD_READ36_VOICE_TX;
+ READ36FORMAT(ptr)->rxsize = CONT_CMD_READ36_VOICE_RX;
+ READ36FORMAT(ptr)->cmd = CONT_CMD_READ36_VOICE;
+ READ36FORMAT(ptr)->datacrc = 0xFF;
+
+ ptr[sizeof(__OSVoiceRead36Format)] = CONT_CMD_END;
+ } else {
+ ptr += channel;
+ }
+
+ READ36FORMAT(ptr)->addrh = address >> 3;
+ READ36FORMAT(ptr)->addrl = (address << 5) | __osContAddressCrc(address);
+
+ __osSiRawStartDma(OS_WRITE, &__osPfsPifRam);
+ osRecvMesg(mq, NULL, OS_MESG_BLOCK);
+ __osSiRawStartDma(OS_READ, &__osPfsPifRam);
+ osRecvMesg(mq, NULL, OS_MESG_BLOCK);
+
+ errorCode = CHNL_ERR(*READ36FORMAT(ptr));
+
+ if (errorCode == 0) {
+ if (__osVoiceContDataCrc(READ36FORMAT(ptr)->data, ARRAY_COUNT(READ36FORMAT(ptr)->data)) !=
+ READ36FORMAT(ptr)->datacrc) {
+ errorCode = __osVoiceGetStatus(mq, channel, &status);
+ if (errorCode != 0) {
+ break;
+ }
+
+ errorCode = CONT_ERR_CONTRFAIL;
+ } else {
+ bcopy(READ36FORMAT(ptr)->data, dst, ARRAY_COUNT(READ36FORMAT(ptr)->data));
+ }
+ } else {
+ errorCode = CONT_ERR_NO_CONTROLLER;
+ }
+
+ } while ((errorCode == CONT_ERR_CONTRFAIL) && (retryCount-- >= 0));
+
+ __osSiRelAccess();
+
+ return errorCode;
+}
diff --git a/src/libultra/voice/voicecontrolgain.c b/src/libultra/voice/voicecontrolgain.c
index d7ec8ef69..bac3871d7 100644
--- a/src/libultra/voice/voicecontrolgain.c
+++ b/src/libultra/voice/voicecontrolgain.c
@@ -1,5 +1,41 @@
-#include "global.h"
+/**
+ * File: voicecontrolgain.c
+ *
+ * Adjusts the input gain of the Voice Recognition System
+ */
-u8 D_80098180[] = { 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0 };
+#include "PR/controller_voice.h"
+#include "PR/os_voice.h"
+#include "PR/controller.h"
+#include "macros.h"
-#pragma GLOBAL_ASM("asm/non_matchings/boot/voicecontrolgain/osVoiceControlGain.s")
+u8 sDigitalTable[] = { 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0 };
+
+s32 osVoiceControlGain(OSVoiceHandle* hd, s32 analog, s32 digital) {
+ s32 errorCode;
+ u8 cmd;
+
+ if (analog == 0) {
+ cmd = 0x18;
+ } else {
+ cmd = 0x98;
+ }
+
+ errorCode = __osVoiceSetADConverter(hd->mq, hd->channel, cmd);
+ if (errorCode != 0) {
+ return errorCode;
+ }
+
+ if ((digital < ARRAY_COUNT(sDigitalTable)) && (digital >= 0)) {
+ cmd = sDigitalTable[digital] + 2;
+ } else {
+ return CONT_ERR_INVALID;
+ }
+
+ errorCode = __osVoiceSetADConverter(hd->mq, hd->channel, cmd);
+ if (errorCode != 0) {
+ return errorCode;
+ }
+
+ return errorCode;
+}
diff --git a/src/libultra/voice/voicecontwrite20.c b/src/libultra/voice/voicecontwrite20.c
index 5ca3560ed..a346294bd 100644
--- a/src/libultra/voice/voicecontwrite20.c
+++ b/src/libultra/voice/voicecontwrite20.c
@@ -1,3 +1,76 @@
-#include "global.h"
+/**
+ * File: voicecontwrite20.c
+ */
-#pragma GLOBAL_ASM("asm/non_matchings/boot/voicecontwrite20/__osVoiceContWrite20.s")
+#include "PR/controller_voice.h"
+#include "PR/voice_internal.h"
+#include "PR/controller.h"
+#include "functions.h"
+#include "variables.h"
+
+#define WRITE20FORMAT(ptr) ((__OSVoiceWrite20Format*)(ptr))
+
+s32 __osVoiceContWrite20(OSMesgQueue* mq, s32 channel, u16 address, u8 dst[20]) {
+ s32 errorCode;
+ u8 status;
+ u8* ptr;
+ s32 retryCount = 2;
+ s32 i;
+ u8 crc;
+
+ __osSiGetAccess();
+
+ do {
+ ptr = (u8*)&__osPfsPifRam.ramarray;
+
+ if ((__osContLastPoll != CONT_CMD_WRITE20_VOICE) || (channel != __osPfsLastChannel)) {
+ __osContLastPoll = CONT_CMD_WRITE20_VOICE;
+ __osPfsLastChannel = channel;
+
+ for (i = 0; i < channel; i++, *ptr++ = 0) {}
+
+ __osPfsPifRam.status = CONT_CMD_EXE;
+
+ WRITE20FORMAT(ptr)->dummy = CONT_CMD_NOP;
+ WRITE20FORMAT(ptr)->txsize = CONT_CMD_WRITE20_VOICE_TX;
+ WRITE20FORMAT(ptr)->rxsize = CONT_CMD_WRITE20_VOICE_RX;
+ WRITE20FORMAT(ptr)->cmd = CONT_CMD_WRITE20_VOICE;
+ WRITE20FORMAT(ptr)->datacrc = 0xFF;
+
+ ptr[sizeof(__OSVoiceWrite20Format)] = CONT_CMD_END;
+ } else {
+ ptr += channel;
+ }
+
+ WRITE20FORMAT(ptr)->addrh = address >> 3;
+ WRITE20FORMAT(ptr)->addrl = (address << 5) | __osContAddressCrc(address);
+
+ bcopy(dst, WRITE20FORMAT(ptr)->data, ARRAY_COUNT(WRITE20FORMAT(ptr)->data));
+
+ __osSiRawStartDma(OS_WRITE, &__osPfsPifRam);
+ crc = __osVoiceContDataCrc(dst, ARRAY_COUNT(WRITE20FORMAT(ptr)->data));
+ osRecvMesg(mq, NULL, OS_MESG_BLOCK);
+ __osSiRawStartDma(OS_READ, &__osPfsPifRam);
+ osRecvMesg(mq, NULL, OS_MESG_BLOCK);
+
+ errorCode = CHNL_ERR(*WRITE20FORMAT(ptr));
+
+ if (errorCode == 0) {
+ if (crc != WRITE20FORMAT(ptr)->datacrc) {
+ errorCode = __osVoiceGetStatus(mq, channel, &status);
+ if (errorCode != 0) {
+ break;
+ }
+
+ errorCode = CONT_ERR_CONTRFAIL;
+ }
+ } else {
+ errorCode = CONT_ERR_NO_CONTROLLER;
+ }
+
+ } while ((errorCode == CONT_ERR_CONTRFAIL) && (retryCount-- >= 0));
+
+ __osSiRelAccess();
+
+ return errorCode;
+}
diff --git a/src/libultra/voice/voicecontwrite4.c b/src/libultra/voice/voicecontwrite4.c
index c28e2d762..e828fc4c6 100644
--- a/src/libultra/voice/voicecontwrite4.c
+++ b/src/libultra/voice/voicecontwrite4.c
@@ -1,3 +1,76 @@
-#include "global.h"
+/**
+ * File: voicecontwrite4.c
+ */
-#pragma GLOBAL_ASM("asm/non_matchings/boot/voicecontwrite4/__osVoiceContWrite4.s")
+#include "PR/controller_voice.h"
+#include "PR/voice_internal.h"
+#include "PR/controller.h"
+#include "functions.h"
+#include "variables.h"
+
+#define WRITE4FORMAT(ptr) ((__OSVoiceWrite4Format*)(ptr))
+
+s32 __osVoiceContWrite4(OSMesgQueue* mq, s32 channel, u16 address, u8 dst[4]) {
+ s32 errorCode;
+ u8 status;
+ u8* ptr;
+ s32 retryCount = 2;
+ s32 i;
+ u8 crc;
+
+ __osSiGetAccess();
+
+ do {
+ ptr = (u8*)&__osPfsPifRam.ramarray;
+
+ if ((__osContLastPoll != CONT_CMD_WRITE4_VOICE) || (channel != __osPfsLastChannel)) {
+ __osContLastPoll = CONT_CMD_WRITE4_VOICE;
+ __osPfsLastChannel = channel;
+
+ for (i = 0; i < channel; i++, *ptr++ = 0) {}
+
+ __osPfsPifRam.status = CONT_CMD_EXE;
+
+ WRITE4FORMAT(ptr)->dummy = CONT_CMD_NOP;
+ WRITE4FORMAT(ptr)->txsize = CONT_CMD_WRITE4_VOICE_TX;
+ WRITE4FORMAT(ptr)->rxsize = CONT_CMD_WRITE4_VOICE_RX;
+ WRITE4FORMAT(ptr)->cmd = CONT_CMD_WRITE4_VOICE;
+ WRITE4FORMAT(ptr)->datacrc = 0xFF;
+
+ ptr[sizeof(__OSVoiceWrite4Format)] = CONT_CMD_END;
+ } else {
+ ptr += channel;
+ }
+
+ WRITE4FORMAT(ptr)->addrh = address >> 3;
+ WRITE4FORMAT(ptr)->addrl = (address << 5) | __osContAddressCrc(address);
+
+ bcopy(dst, WRITE4FORMAT(ptr)->data, ARRAY_COUNT(WRITE4FORMAT(ptr)->data));
+
+ __osSiRawStartDma(OS_WRITE, &__osPfsPifRam);
+ crc = __osVoiceContDataCrc(dst, ARRAY_COUNT(WRITE4FORMAT(ptr)->data));
+ osRecvMesg(mq, NULL, OS_MESG_BLOCK);
+ __osSiRawStartDma(OS_READ, &__osPfsPifRam);
+ osRecvMesg(mq, NULL, OS_MESG_BLOCK);
+
+ errorCode = CHNL_ERR(*WRITE4FORMAT(ptr));
+
+ if (errorCode == 0) {
+ if (crc != WRITE4FORMAT(ptr)->datacrc) {
+ errorCode = __osVoiceGetStatus(mq, channel, &status);
+ if (errorCode != 0) {
+ break;
+ }
+
+ errorCode = CONT_ERR_CONTRFAIL;
+ }
+ } else {
+ errorCode = CONT_ERR_NO_CONTROLLER;
+ }
+
+ } while ((errorCode == CONT_ERR_CONTRFAIL) && (retryCount-- >= 0));
+
+ __osSiRelAccess();
+
+ return errorCode;
+}
diff --git a/src/libultra/voice/voicecrc.c b/src/libultra/voice/voicecrc.c
index 35b7b8656..36ffc4373 100644
--- a/src/libultra/voice/voicecrc.c
+++ b/src/libultra/voice/voicecrc.c
@@ -4,7 +4,7 @@
*
* For general information about CRC, see the crc.c file (that's a lot of c's!).
*/
-#include "global.h"
+#include "libc/stddef.h"
#define VOICE_CRC_LENGTH 8
#define VOICE_CRC_GENERATOR 0x85
diff --git a/src/libultra/voice/voicegetreaddata.c b/src/libultra/voice/voicegetreaddata.c
index 5940a1f8b..5e5a2b62b 100644
--- a/src/libultra/voice/voicegetreaddata.c
+++ b/src/libultra/voice/voicegetreaddata.c
@@ -1,3 +1,125 @@
-#include "global.h"
+/**
+ * File: voicegetreaddata.c
+ *
+ * Gets voice recognition result from the Voice Recognition System
+ */
-#pragma GLOBAL_ASM("asm/non_matchings/boot/voicegetreaddata/osVoiceGetReadData.s")
+#include "PR/controller_voice.h"
+#include "PR/os_voice.h"
+#include "PR/controller.h"
+
+s32 osVoiceGetReadData(OSVoiceHandle* hd, OSVoiceData* result) {
+ static u8 sHandleStatus;
+ s32 errorCode;
+ s32 i;
+ u8 status;
+ u8 data[36];
+
+ switch (hd->mode) {
+ case VOICE_HANDLE_MODE_1:
+ errorCode = __osVoiceGetStatus(hd->mq, hd->channel, &status);
+ if (errorCode != 0) {
+ return errorCode;
+ }
+
+ if (status & 1) {
+ return CONT_ERR_NOT_READY;
+ }
+
+ errorCode = __osVoiceContRead2(hd->mq, hd->channel, 0, data);
+ if (errorCode != 0) {
+ return errorCode;
+ }
+
+ sHandleStatus = data[0] & 7;
+ hd->status = sHandleStatus;
+ if ((sHandleStatus != 0) && (sHandleStatus != 7)) {
+ return CONT_ERR_NOT_READY;
+ }
+ // fallthrough
+ case VOICE_HANDLE_MODE_2:
+ hd->mode = VOICE_HANDLE_MODE_2;
+
+ errorCode = __osVoiceGetStatus(hd->mq, hd->channel, &status);
+ if (errorCode != 0) {
+ return errorCode;
+ }
+
+ if (status & 2) {
+ return CONT_ERR_VOICE_NO_RESPONSE;
+ }
+
+ *(u32*)data = 0x600;
+ errorCode = __osVoiceContWrite4(hd->mq, hd->channel, 0, data);
+ if (errorCode != 0) {
+ return errorCode;
+ }
+ // fallthrough
+ case VOICE_HANDLE_MODE_3:
+ hd->mode = VOICE_HANDLE_MODE_3;
+
+ errorCode = __osVoiceGetStatus(hd->mq, hd->channel, &status);
+ if (errorCode != 0) {
+ return errorCode;
+ }
+
+ if (status & 1) {
+ return CONT_ERR_VOICE_NO_RESPONSE;
+ }
+
+ errorCode = __osVoiceContRead36(hd->mq, hd->channel, 0, data);
+ if (errorCode != 0) {
+ return errorCode;
+ }
+
+ result->warning = data[4] + (data[5] << 8);
+ result->answerNum = data[6];
+ result->voiceLevel = data[8] + (data[9] << 8);
+ result->voiceRelLevel = data[10] + (data[11] << 8);
+ result->voiceTime = data[12] + (data[13] << 8);
+
+ for (i = 0; i < 5; i++) {
+ result->answer[i] = data[14 + (i << 2)] + (data[15 + (i << 2)] << 8);
+ result->distance[i] = data[16 + (i << 2)] + (data[17 + (i << 2)] << 8);
+ }
+
+ if (result->answer[0] == 0x7FFF) {
+ result->answerNum = 0;
+ }
+
+ hd->status = data[34] & 7;
+ if ((sHandleStatus == 0) || (hd->status == 0)) {
+ break;
+ }
+ // fallthrough
+ case VOICE_HANDLE_MODE_4:
+ hd->mode = VOICE_HANDLE_MODE_4;
+
+ errorCode = __osVoiceGetStatus(hd->mq, hd->channel, &status);
+ if (errorCode != 0) {
+ return errorCode;
+ }
+
+ if (status & 1) {
+ return CONT_ERR_VOICE_NO_RESPONSE;
+ }
+
+ errorCode = __osVoiceContRead2(hd->mq, hd->channel, 0, data);
+ if (errorCode != 0) {
+ return errorCode;
+ }
+
+ hd->status = data[0] & 7;
+ if (data[0] & 7) {
+ return CONT_ERR_VOICE_NO_RESPONSE;
+ }
+
+ break;
+
+ default:
+ return CONT_ERR_INVALID;
+ }
+
+ hd->mode = VOICE_HANDLE_MODE_0;
+ return errorCode;
+}
diff --git a/src/libultra/voice/voicegetstatus.c b/src/libultra/voice/voicegetstatus.c
index d8e7edb67..b19348908 100644
--- a/src/libultra/voice/voicegetstatus.c
+++ b/src/libultra/voice/voicegetstatus.c
@@ -1,58 +1,62 @@
-#include "global.h"
-#include "io/controller.h"
+/**
+ * File: voicegetstatus.c
+ */
-s32 __osVoiceGetStatus(OSMesgQueue* mq, s32 port, u8* status) {
+#include "PR/controller_voice.h"
+#include "PR/controller.h"
+#include "functions.h"
+
+s32 __osVoiceGetStatus(OSMesgQueue* mq, s32 channel, u8* status) {
__OSContRequestHeaderAligned header;
- s32 ret = 0;
+ s32 errorCode = 0;
s32 i;
- u8* ptr = (u8*)&__osContPifRam;
- s32 var = 2;
+ u8* ptr = (u8*)&__osContPifRam.ramarray;
+ s32 retryCount = 2;
__osSiGetAccess();
do {
- if (ret != CONT_ERR_CONTRFAIL) {
+ if (errorCode != CONT_ERR_CONTRFAIL) {
__osContPifRam.status = CONT_CMD_READ_BUTTON;
- for (i = 0; i < port; i++, *ptr++ = 0) {
- ;
- }
+ for (i = 0; i < channel; i++, *ptr++ = 0) {}
- *ptr++ = 1;
- *ptr++ = 3;
+ *ptr++ = CONT_CMD_REQUEST_STATUS_TX;
+ *ptr++ = CONT_CMD_REQUEST_STATUS_RX;
*ptr = CONT_CMD_REQUEST_STATUS;
ptr += 4;
*ptr = CONT_CMD_END;
__osContLastPoll = CONT_CMD_END;
- ret = __osSiRawStartDma(OS_WRITE, &__osContPifRam);
+ errorCode = __osSiRawStartDma(OS_WRITE, &__osContPifRam);
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
}
- ret = __osSiRawStartDma(OS_READ, &__osContPifRam);
+ errorCode = __osSiRawStartDma(OS_READ, &__osContPifRam);
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
- ptr = (u8*)&__osContPifRam + port;
+ ptr = (u8*)&__osContPifRam.ramarray + channel;
header = *((__OSContRequestHeaderAligned*)ptr);
- ret = (u8)((header.rxsize & 0xC0) >> 4);
+ errorCode = (u8)CHNL_ERR(header);
*status = header.status;
- if (ret == 0) {
- if (header.typeh == 0 && header.typel == 1) {
+ if (errorCode == 0) {
+ if ((header.typeh == 0) && (header.typel == 1)) {
if (header.status & 4) {
- ret = CONT_ERR_CONTRFAIL;
+ errorCode = CONT_ERR_CONTRFAIL;
}
} else {
- ret = CONT_ERR_DEVICE;
+ errorCode = CONT_ERR_DEVICE;
}
- } else if (ret & CONT_NO_RESPONSE_ERROR) {
- ret = CONT_ERR_NO_CONTROLLER;
+ } else if (errorCode & CONT_NO_RESPONSE_ERROR) {
+ errorCode = CONT_ERR_NO_CONTROLLER;
} else {
- ret = CONT_ERR_CONTRFAIL;
+ errorCode = CONT_ERR_CONTRFAIL;
}
- } while ((ret == CONT_ERR_CONTRFAIL) && (var-- >= 0));
+ } while ((errorCode == CONT_ERR_CONTRFAIL) && (retryCount-- >= 0));
__osSiRelAccess();
- return (ret);
+
+ return errorCode;
}
diff --git a/src/libultra/voice/voiceinit.c b/src/libultra/voice/voiceinit.c
index 920bc4818..f8c965f70 100644
--- a/src/libultra/voice/voiceinit.c
+++ b/src/libultra/voice/voiceinit.c
@@ -1,3 +1,69 @@
-#include "global.h"
+/**
+ * File: voiceinit.c
+ *
+ * Initializes Voice Recognition System control structure and hardware
+ */
-#pragma GLOBAL_ASM("asm/non_matchings/boot/voiceinit/osVoiceInit.s")
+#include "PR/controller_voice.h"
+#include "PR/os_voice.h"
+#include "PR/controller.h"
+#include "functions.h"
+#include "macros.h"
+
+static u8 sCmds[] = {
+ 0x1E, 0x6E, 0x08, 0x56, 0x03,
+};
+
+s32 osVoiceInit(OSMesgQueue* mq, OSVoiceHandle* hd, int channel) {
+ s32 errorCode;
+ s32 i;
+ u8 status = 0;
+ u8 data[4];
+
+ hd->channel = channel;
+ hd->mq = mq;
+ hd->mode = VOICE_HANDLE_MODE_0;
+
+ errorCode = __osVoiceGetStatus(mq, channel, &status);
+ if (errorCode != 0) {
+ return errorCode;
+ }
+
+ if (__osContChannelReset(mq, channel) != 0) {
+ return CONT_ERR_CONTRFAIL;
+ }
+
+ for (i = 0; i < ARRAY_COUNT(sCmds); i++) {
+ errorCode = __osVoiceSetADConverter(mq, channel, sCmds[i]);
+ if (errorCode != 0) {
+ return errorCode;
+ }
+ }
+
+ errorCode = __osVoiceGetStatus(mq, channel, &status);
+ if (errorCode != 0) {
+ return errorCode;
+ }
+ if (status & 2) {
+ return CONT_ERR_VOICE_NO_RESPONSE;
+ }
+
+ /**
+ * data[0] = 0
+ * data[1] = 0
+ * data[2] = 1
+ * data[3] = 0
+ */
+ *(u32*)data = 0x100;
+ errorCode = __osVoiceContWrite4(mq, channel, 0, data);
+ if (errorCode != 0) {
+ return errorCode;
+ }
+
+ errorCode = __osVoiceCheckResult(hd, &status);
+ if (errorCode & 0xFF00) {
+ errorCode = CONT_ERR_INVALID;
+ }
+
+ return errorCode;
+}
diff --git a/src/libultra/voice/voicemaskdictionary.c b/src/libultra/voice/voicemaskdictionary.c
index 3de841de3..225c45dee 100644
--- a/src/libultra/voice/voicemaskdictionary.c
+++ b/src/libultra/voice/voicemaskdictionary.c
@@ -1,3 +1,57 @@
-#include "global.h"
+/**
+ * File: voicemaskdictionary.c
+ *
+ * Mask words registered in the voice recognition system
+ */
-#pragma GLOBAL_ASM("asm/non_matchings/boot/voicemaskdictionary/osVoiceMaskDictionary.s")
+#include "PR/controller_voice.h"
+#include "PR/os_voice.h"
+#include "PR/controller.h"
+#include "functions.h"
+#include "macros.h"
+
+s32 osVoiceMaskDictionary(OSVoiceHandle* hd, u8* maskPattern, int size) {
+ s32 errorCode;
+ s32 i;
+ s32 j;
+ u8 status;
+ u8 data[20];
+
+ errorCode = __osVoiceGetStatus(hd->mq, hd->channel, &status);
+ if (errorCode != 0) {
+ return errorCode;
+ }
+
+ if (status & 2) {
+ return CONT_ERR_VOICE_NO_RESPONSE;
+ }
+
+ if (size & 1) {
+ j = size + 1;
+ } else {
+ j = size;
+ }
+
+ bzero(&data, ARRAY_COUNT(data));
+
+ data[ARRAY_COUNT(data) - 2 - j] = 4;
+
+ for (i = 0; i < j; i += 2) {
+ data[i + ARRAY_COUNT(data) - j] = maskPattern[i];
+ data[i + ARRAY_COUNT(data) - j + 1] = maskPattern[i + 1];
+ }
+
+ if (size & 1) {
+ data[ARRAY_COUNT(data) - 1] = 0;
+ }
+
+ errorCode = __osVoiceContWrite20(hd->mq, hd->channel, 0, data);
+ if (errorCode == 0) {
+ errorCode = __osVoiceCheckResult(hd, &status);
+ if (errorCode & 0xFF00) {
+ errorCode = CONT_ERR_INVALID;
+ }
+ }
+
+ return errorCode;
+}
diff --git a/src/libultra/voice/voicesetadconverter.c b/src/libultra/voice/voicesetadconverter.c
index c1b8fa002..1b3d87cd5 100644
--- a/src/libultra/voice/voicesetadconverter.c
+++ b/src/libultra/voice/voicesetadconverter.c
@@ -1,3 +1,71 @@
-#include "global.h"
+/**
+ * File: voicesetadconverter.c
+ */
-#pragma GLOBAL_ASM("asm/non_matchings/boot/voicesetadconverter/__osVoiceSetADConverter.s")
+#include "PR/controller_voice.h"
+#include "PR/voice_internal.h"
+#include "PR/controller.h"
+#include "functions.h"
+#include "variables.h"
+
+#define SWRITEFORMAT(ptr) ((__OSVoiceSWriteFormat*)(ptr))
+
+s32 __osVoiceSetADConverter(OSMesgQueue* mq, s32 channel, u8 data) {
+ s32 errorCode;
+ s32 i;
+ u8* ptr;
+ u8 status;
+ s32 retryCount = 2;
+
+ __osSiGetAccess();
+
+ do {
+ ptr = (u8*)&__osPfsPifRam.ramarray;
+
+ if ((__osContLastPoll != CONT_CMD_SWRITE_VOICE) || (channel != __osPfsLastChannel)) {
+ __osContLastPoll = CONT_CMD_SWRITE_VOICE;
+ __osPfsLastChannel = channel;
+
+ for (i = 0; i < channel; i++, *ptr++ = 0) {}
+
+ __osPfsPifRam.status = CONT_CMD_EXE;
+
+ SWRITEFORMAT(ptr)->txsize = CONT_CMD_SWRITE_VOICE_TX;
+ SWRITEFORMAT(ptr)->rxsize = CONT_CMD_SWRITE_VOICE_RX;
+ SWRITEFORMAT(ptr)->cmd = CONT_CMD_SWRITE_VOICE;
+ SWRITEFORMAT(ptr)->datacrc = 0;
+
+ ptr[sizeof(__OSVoiceSWriteFormat)] = CONT_CMD_END;
+ } else {
+ ptr += channel;
+ }
+
+ SWRITEFORMAT(ptr)->data = data;
+ SWRITEFORMAT(ptr)->scrc = __osContAddressCrc(data << 3);
+
+ __osSiRawStartDma(OS_WRITE, &__osPfsPifRam);
+ osRecvMesg(mq, NULL, OS_MESG_BLOCK);
+ __osSiRawStartDma(OS_READ, &__osPfsPifRam);
+ osRecvMesg(mq, NULL, OS_MESG_BLOCK);
+
+ errorCode = CHNL_ERR(*SWRITEFORMAT(ptr));
+
+ if (errorCode == 0) {
+ if (SWRITEFORMAT(ptr)->datacrc & 1) {
+ errorCode = __osVoiceGetStatus(mq, channel, &status);
+ if (errorCode != 0) {
+ break;
+ }
+
+ errorCode = CONT_ERR_CONTRFAIL;
+ }
+ } else {
+ errorCode = CONT_ERR_NO_CONTROLLER;
+ }
+
+ } while ((errorCode == CONT_ERR_CONTRFAIL) && (retryCount-- >= 0));
+
+ __osSiRelAccess();
+
+ return errorCode;
+}
diff --git a/src/libultra/voice/voicesetword.c b/src/libultra/voice/voicesetword.c
index e50f26874..82b0f88aa 100644
--- a/src/libultra/voice/voicesetword.c
+++ b/src/libultra/voice/voicesetword.c
@@ -1,3 +1,69 @@
-#include "global.h"
+/**
+ * File: voicesetword.c
+ *
+ * Registers words to the Voice Recognition System dictionary
+ */
-#pragma GLOBAL_ASM("asm/non_matchings/boot/voicesetword/osVoiceSetWord.s")
+#include "PR/controller_voice.h"
+#include "PR/os_voice.h"
+#include "PR/controller.h"
+#include "functions.h"
+#include "macros.h"
+
+s32 osVoiceSetWord(OSVoiceHandle* hd, u8* word) {
+ s32 i;
+ s32 k;
+ s32 errorCode;
+ u8 status;
+ u8 data[40];
+
+ errorCode = __osVoiceGetStatus(hd->mq, hd->channel, &status);
+ if (errorCode != 0) {
+ return errorCode;
+ }
+
+ if (status & 2) {
+ return CONT_ERR_VOICE_NO_RESPONSE;
+ }
+
+ k = 0;
+
+ while (word[k] != 0) {
+ k += 2;
+ }
+
+ bzero(data, ARRAY_COUNT(data));
+
+ for (i = 0; i < k; i += 2) {
+ data[ARRAY_COUNT(data) - 1 - k + i] = word[i];
+ data[ARRAY_COUNT(data) - 1 - k + i - 1] = word[i + 1];
+ }
+
+ data[ARRAY_COUNT(data) - 1 - i - 5] = 3;
+
+ if (k >= 15) {
+ errorCode = __osVoiceContWrite20(hd->mq, hd->channel, 0, &data[0]);
+ if (errorCode != 0) {
+ return errorCode;
+ }
+ }
+
+ errorCode = __osVoiceContWrite20(hd->mq, hd->channel, 0, &data[20]);
+ if (errorCode != 0) {
+ return errorCode;
+ }
+
+ errorCode = __osVoiceCheckResult(hd, &status);
+
+ if (errorCode != 0) {
+ if (errorCode & 0x100) {
+ errorCode = CONT_ERR_VOICE_MEMORY;
+ } else if (errorCode & 0x200) {
+ errorCode = CONT_ERR_VOICE_WORD;
+ } else if (errorCode & 0xFF00) {
+ errorCode = CONT_ERR_INVALID;
+ }
+ }
+
+ return errorCode;
+}
diff --git a/src/libultra/voice/voicestartreaddata.c b/src/libultra/voice/voicestartreaddata.c
index e7105a7d4..0ff35fd2b 100644
--- a/src/libultra/voice/voicestartreaddata.c
+++ b/src/libultra/voice/voicestartreaddata.c
@@ -1,3 +1,49 @@
-#include "global.h"
+/**
+ * File: voicestartreaddata.c
+ *
+ * Start voice recognition by the Voice Recognition System
+ */
-#pragma GLOBAL_ASM("asm/non_matchings/boot/voicestartreaddata/osVoiceStartReadData.s")
+#include "PR/controller_voice.h"
+#include "PR/os_voice.h"
+#include "PR/controller.h"
+
+s32 osVoiceStartReadData(OSVoiceHandle* hd) {
+ s32 errorCode;
+ u8 status;
+ u8 data[4];
+
+ errorCode = __osVoiceGetStatus(hd->mq, hd->channel, &status);
+ if (errorCode != 0) {
+ return errorCode;
+ }
+
+ if (status & 2) {
+ return CONT_ERR_VOICE_NO_RESPONSE;
+ }
+
+ if (hd->mode != VOICE_HANDLE_MODE_0) {
+ return CONT_ERR_INVALID;
+ }
+
+ /**
+ * data[0] = 5
+ * data[1] = 0
+ * data[2] = 0
+ * data[3] = 0
+ */
+ *(u32*)data = 0x5000000;
+ errorCode = __osVoiceContWrite4(hd->mq, hd->channel, 0, data);
+
+ if (errorCode == 0) {
+ errorCode = __osVoiceCheckResult(hd, &status);
+
+ if (errorCode & 0xFF00) {
+ errorCode = CONT_ERR_INVALID;
+ } else {
+ hd->mode = VOICE_HANDLE_MODE_1;
+ }
+ }
+
+ return errorCode;
+}
diff --git a/src/libultra/voice/voicestopread.c b/src/libultra/voice/voicestopread.c
index f032fc40e..905efb19f 100644
--- a/src/libultra/voice/voicestopread.c
+++ b/src/libultra/voice/voicestopread.c
@@ -1,3 +1,60 @@
-#include "global.h"
+/**
+ * File: voicestopread.c
+ *
+ * Forcibly stops voice recognition processing by the Voice Recognition System
+ */
-#pragma GLOBAL_ASM("asm/non_matchings/boot/voicestopread/osVoiceStopReadData.s")
+#include "PR/controller_voice.h"
+#include "PR/os_voice.h"
+#include "PR/controller.h"
+
+s32 osVoiceStopReadData(OSVoiceHandle* hd) {
+ s32 errorCode;
+ s32 i;
+ u8 status;
+ u8 data[4];
+
+ errorCode = __osVoiceGetStatus(hd->mq, hd->channel, &status);
+ if (errorCode != 0) {
+ return errorCode;
+ }
+
+ if (status & 2) {
+ return CONT_ERR_VOICE_NO_RESPONSE;
+ }
+
+ if (hd->mode == VOICE_HANDLE_MODE_0) {
+ return CONT_ERR_INVALID;
+ }
+
+ /**
+ * data[0] = 0
+ * data[1] = 0
+ * data[2] = 7
+ * data[3] = 0
+ */
+ *(u32*)data = 0x700;
+ errorCode = __osVoiceContWrite4(hd->mq, hd->channel, 0, data);
+
+ if (errorCode == 0) {
+ i = 0;
+ do {
+ errorCode = __osVoiceCheckResult(hd, &status);
+ if (errorCode & 0xFF00) {
+ if (((errorCode & 7) == 0) || ((errorCode & 7) == 7)) {
+ errorCode = 0;
+ hd->mode = VOICE_HANDLE_MODE_0;
+ } else {
+ errorCode = CONT_ERR_INVALID;
+ }
+ } else {
+ hd->mode = VOICE_HANDLE_MODE_0;
+ }
+ i++;
+ } while ((errorCode == CONT_ERR_VOICE_NO_RESPONSE) && (i < 20));
+ }
+
+ if (i >= 20) {}
+
+ return errorCode;
+}
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 e3ac3e753..ba30287f5 100644
--- a/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c
+++ b/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c
@@ -109,7 +109,7 @@ s32 ArmsHook_CheckForCancel(ArmsHook* this) {
Player* player = (Player*)this->actor.parent;
if (Player_IsHoldingHookshot(player)) {
- if ((player->itemAction != player->heldItemAction) || (player->actor.flags & ACTOR_FLAG_100) ||
+ if ((player->itemAction != player->heldItemAction) || (player->actor.flags & ACTOR_FLAG_TALK_REQUESTED) ||
(player->stateFlags1 & (PLAYER_STATE1_80 | PLAYER_STATE1_4000000))) {
this->timer = 0;
ArmsHook_DetachHookFromActor(this);
@@ -129,18 +129,19 @@ 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;
}
- func_800B8F98(&player->actor, NA_SE_IT_HOOKSHOT_CHAIN - SFX_FLAG);
+ Actor_PlaySfx_FlaggedCentered1(&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);
@@ -150,7 +151,7 @@ void ArmsHook_Shoot(ArmsHook* this, PlayState* play) {
}
}
this->timer = 0;
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_IT_HOOKSHOT_STICK_CRE);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_IT_HOOKSHOT_STICK_CRE);
return;
}
@@ -168,7 +169,7 @@ void ArmsHook_Shoot(ArmsHook* this, PlayState* play) {
grabbed = NULL;
this->grabbed = NULL;
} else if (this->actor.child != NULL) {
- f32 sp94 = Actor_DistanceBetweenActors(&this->actor, grabbed);
+ f32 sp94 = Actor_WorldDistXYZToActor(&this->actor, grabbed);
f32 sp90 = sqrtf(SQXYZ(this->unk1FC));
Math_Vec3f_Diff(&grabbed->world.pos, &this->unk1FC, &this->actor.world.pos);
@@ -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) {
@@ -238,13 +237,13 @@ void ArmsHook_Shoot(ArmsHook* this, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
Math_Vec3f_Diff(&this->actor.world.pos, &this->actor.prevPos, &prevFrameDiff);
Math_Vec3f_Sum(&this->unk1E0, &prevFrameDiff, &this->unk1E0);
- this->actor.shape.rot.x = Math_Atan2S_XY(this->actor.speedXZ, -this->actor.velocity.y);
+ this->actor.shape.rot.x = Math_Atan2S_XY(this->actor.speed, -this->actor.velocity.y);
sp60.x = this->unk1EC.x - (this->unk1E0.x - this->unk1EC.x);
sp60.y = this->unk1EC.y - (this->unk1E0.y - this->unk1EC.y);
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);
@@ -261,10 +260,10 @@ void ArmsHook_Shoot(ArmsHook* this, PlayState* play) {
ArmsHook_AttachHookToActor(this, &dynaPolyActor->actor);
}
func_808C1154(this);
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_IT_HOOKSHOT_STICK_OBJ);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_IT_HOOKSHOT_STICK_OBJ);
} else {
CollisionCheck_SpawnShieldParticlesMetal(play, &this->actor.world.pos);
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_IT_HOOKSHOT_REFLECT);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_IT_HOOKSHOT_REFLECT);
}
} else if (CHECK_BTN_ANY(CONTROLLER1(&play->state)->press.button,
BTN_A | BTN_B | BTN_R | BTN_CUP | BTN_CLEFT | BTN_CRIGHT | BTN_CDOWN)) {
@@ -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);
@@ -328,7 +327,7 @@ void ArmsHook_Draw(Actor* thisx, PlayState* play) {
f0 = sqrtf(SQ(sp68.y) + sp48);
Matrix_Scale(0.015f, 0.015f, f0 * 0.01f, 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_0008D0);
+ gSPDisplayList(POLY_OPA_DISP++, gHookshotChainDL);
func_801229A0(play, player);
CLOSE_DISPS(play->state.gfxCtx);
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 41a3f25ec..83edc9548 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,
@@ -57,7 +57,7 @@ static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneForward, 2000, ICHAIN_STOP),
};
-s32 sUnused;
+static s32 sBssPad;
void ArrowFire_SetupAction(ArrowFire* this, ArrowFireActionFunc actionFunc) {
this->actionFunc = actionFunc;
@@ -100,7 +100,7 @@ void FireArrow_ChargeAndWait(ArrowFire* this, PlayState* play) {
this->actor.world.pos = arrow->actor.world.pos;
this->actor.shape.rot = arrow->actor.shape.rot;
- func_800B9010(&this->actor, NA_SE_PL_ARROW_CHARGE_FIRE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_PL_ARROW_CHARGE_FIRE - SFX_FLAG);
// if arrow has no parent, player has fired the arrow
if (arrow->actor.parent == NULL) {
@@ -186,7 +186,7 @@ void FireArrow_Fly(ArrowFire* this, PlayState* play) {
FireArrow_Lerp(&this->firedPos, &this->actor.world.pos, 0.05f);
if (arrow->unk_261 & 1) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_EXPLOSION_FRAME);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_EXPLOSION_FRAME);
ArrowFire_SetupAction(this, FireArrow_Hit);
this->timer = 32;
this->alpha = 255;
@@ -204,7 +204,7 @@ void FireArrow_Fly(ArrowFire* this, PlayState* play) {
void ArrowFire_Update(Actor* thisx, PlayState* play) {
ArrowFire* this = (ArrowFire*)thisx;
- if ((play->msgCtx.msgMode == 0xE) || (play->msgCtx.msgMode == 0x12)) {
+ if ((play->msgCtx.msgMode == MSGMODE_E) || (play->msgCtx.msgMode == MSGMODE_SONG_PLAYED)) {
Actor_Kill(&this->actor);
return;
}
@@ -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 5c5cd0c87..8a908a0e3 100644
--- a/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c
+++ b/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c
@@ -21,7 +21,7 @@ void ArrowIce_Fly(ArrowIce* this, PlayState* play);
#include "overlays/ovl_Arrow_Ice/ovl_Arrow_Ice.c"
-s32 unused; // Needed for bss
+static s32 sBssPad;
ActorInit Arrow_Ice_InitVars = {
ACTOR_ARROW_ICE,
@@ -76,7 +76,7 @@ void ArrowIce_Charge(ArrowIce* this, PlayState* play) {
this->actor.world.pos = arrow->actor.world.pos;
this->actor.shape.rot = arrow->actor.shape.rot;
- func_800B9010(&this->actor, NA_SE_PL_ARROW_CHARGE_ICE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_PL_ARROW_CHARGE_ICE - SFX_FLAG);
// if arrow has no parent, player has fired the arrow
if (arrow->actor.parent == NULL) {
@@ -160,7 +160,7 @@ void ArrowIce_Fly(ArrowIce* this, PlayState* play) {
ArrowIce_LerpFiredPosition(&this->firedPos, &this->actor.world.pos, 0.05f);
if (arrow->unk_261 & 1) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_EXPLOSION_ICE);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_EXPLOSION_ICE);
ArrowIce_SetupAction(this, ArrowIce_Hit);
this->timer = 32;
this->alpha = 255;
@@ -176,7 +176,7 @@ void ArrowIce_Fly(ArrowIce* this, PlayState* play) {
void ArrowIce_Update(Actor* thisx, PlayState* play) {
ArrowIce* this = THIS;
- if ((play->msgCtx.msgMode == 0xE) || (play->msgCtx.msgMode == 0x12)) {
+ if ((play->msgCtx.msgMode == MSGMODE_E) || (play->msgCtx.msgMode == MSGMODE_SONG_PLAYED)) {
Actor_Kill(&this->actor);
return;
} else {
@@ -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 b7918b5b4..902443a95 100644
--- a/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c
+++ b/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c
@@ -37,7 +37,7 @@ static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneForward, 2000, ICHAIN_STOP),
};
-static s32 sUnused;
+static s32 sBssPad;
void ArrowLight_SetupAction(ArrowLight* this, ArrowLightActionFunc actionFunc) {
this->actionFunc = actionFunc;
@@ -75,7 +75,7 @@ void ArrowLight_Charge(ArrowLight* this, PlayState* play) {
this->actor.world.pos = arrow->actor.world.pos;
this->actor.shape.rot = arrow->actor.shape.rot;
- func_800B9010(&this->actor, NA_SE_PL_ARROW_CHARGE_LIGHT - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_PL_ARROW_CHARGE_LIGHT - SFX_FLAG);
if (arrow->actor.parent == NULL) {
this->firedPos = this->actor.world.pos;
this->radius = 10;
@@ -154,7 +154,7 @@ void ArrowLight_Fly(ArrowLight* this, PlayState* play) {
ArrowLight_Lerp(&this->firedPos, &this->actor.world.pos, 0.05f);
if (arrow->unk_261 & 1) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_EXPLOSION_LIGHT);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_EXPLOSION_LIGHT);
ArrowLight_SetupAction(this, ArrowLight_Hit);
this->timer = 32;
this->alpha = 255;
@@ -172,7 +172,7 @@ void ArrowLight_Fly(ArrowLight* this, PlayState* play) {
void ArrowLight_Update(Actor* thisx, PlayState* play) {
ArrowLight* this = THIS;
- if ((play->msgCtx.msgMode == 0xE) || (play->msgCtx.msgMode == 0x12)) {
+ if ((play->msgCtx.msgMode == MSGMODE_E) || (play->msgCtx.msgMode == MSGMODE_SONG_PLAYED)) {
Actor_Kill(&this->actor);
return;
}
@@ -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 dcf37d848..da688a81b 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,10 +100,10 @@ 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))) {
+ if (Flags_GetSwitch(play, BGASTRBOMBWALL_GET_SWITCH_FLAG(thisx))) {
Actor_Kill(&this->dyna.actor);
return;
}
@@ -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);
}
@@ -163,7 +163,7 @@ void func_80C0A378(BgAstrBombwall* this) {
void func_80C0A38C(BgAstrBombwall* this, PlayState* play) {
if (this->collider.base.acFlags & AC_HIT) {
this->collider.base.acFlags &= ~AC_HIT;
- Flags_SetSwitch(play, BGASTRBOMBWALL_GET_SWITCHFLAG(&this->dyna.actor));
+ Flags_SetSwitch(play, BGASTRBOMBWALL_GET_SWITCH_FLAG(&this->dyna.actor));
func_80C0A400(this, play);
} else {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
@@ -175,16 +175,16 @@ 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_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_WALL_BROKEN);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_WALL_BROKEN);
this->actionFunc = func_80C0A4BC;
}
@@ -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..698ccfda1 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
@@ -5,7 +5,7 @@
struct BgAstrBombwall;
-#define BGASTRBOMBWALL_GET_SWITCHFLAG(thisx) ((thisx)->params & 0x7F)
+#define BGASTRBOMBWALL_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
typedef void (*BgAstrBombwallActionFunc)(struct BgAstrBombwall*, PlayState*);
typedef struct BgAstrBombwall {
@@ -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..01a74402c 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;
@@ -192,8 +191,8 @@ s32 func_808B74D8(BgBreakwall* this, PlayState* play) {
s32 func_808B751C(BgBreakwall* this, PlayState* play) {
Actor_SetScale(&this->dyna.actor, 0.1f);
- if ((BGBREAKWALL_SWITCHFLAG(&this->dyna.actor) != 0x7F) &&
- !Flags_GetSwitch(play, BGBREAKWALL_SWITCHFLAG(&this->dyna.actor))) {
+ if ((BGBREAKWALL_SWITCH_FLAG(&this->dyna.actor) != 0x7F) &&
+ !Flags_GetSwitch(play, BGBREAKWALL_SWITCH_FLAG(&this->dyna.actor))) {
return false;
}
@@ -213,7 +212,7 @@ void BgBreakwall_Init(Actor* thisx, PlayState* play) {
BgBreakwallStruct* sp24 = &D_808B8140[BGBREAKWALL_GET_F(&this->dyna.actor)];
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
- this->unk_15C = Object_GetIndex(&play->objectCtx, sp24->unk_00);
+ this->unk_15C = Object_GetSlot(&play->objectCtx, sp24->unk_00);
if ((this->unk_15C < 0) || !sp24->unk_14(this, play)) {
Actor_Kill(&this->dyna.actor);
@@ -221,7 +220,7 @@ void BgBreakwall_Init(Actor* thisx, PlayState* play) {
}
BgBreakwall_SetupAction(this, func_808B76CC);
- this->switchFlag = BGBREAKWALL_SWITCHFLAG(&this->dyna.actor);
+ this->switchFlag = BGBREAKWALL_SWITCH_FLAG(&this->dyna.actor);
}
void BgBreakwall_Destroy(Actor* thisx, PlayState* play) {
@@ -285,14 +284,14 @@ 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);
}
}
void func_808B78DC(BgBreakwall* this, PlayState* play) {
Actor_SetScale(&this->dyna.actor, 3.5f);
- func_800B9010(&this->dyna.actor, NA_SE_EV_TORNADE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_TORNADE - SFX_FLAG);
}
void func_808B7914(BgBreakwall* this, PlayState* play) {
@@ -339,8 +338,8 @@ void func_808B7A90(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_800FE7A8(D_808B82F0, &sp2C);
- func_800FE7A8(D_808B8300, &sp28);
+ Environment_LerpSandstormColors(D_808B82F0, &sp2C);
+ Environment_LerpSandstormColors(D_808B8300, &sp28);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, sp2C.r, sp2C.g, sp2C.b, 255);
gDPSetEnvColor(POLY_XLU_DISP++, sp28.r, sp28.g, sp28.b, 255);
@@ -355,19 +354,19 @@ 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);
- func_800FE7A8(D_808B8310, &sp50);
- func_800FE7A8(D_808B8330, &sp4C);
+ Environment_LerpSandstormColors(D_808B8310, &sp50);
+ Environment_LerpSandstormColors(D_808B8330, &sp4C);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, sp50.r, sp50.g, sp50.b, 255);
gDPSetEnvColor(POLY_XLU_DISP++, sp4C.r, sp4C.g, sp4C.b, 255);
gSPDisplayList(POLY_XLU_DISP++, object_posthouse_obj_DL_000A50);
- func_800FE7A8(D_808B8320, &sp50);
- func_800FE7A8(D_808B8340, &sp4C);
+ Environment_LerpSandstormColors(D_808B8320, &sp50);
+ Environment_LerpSandstormColors(D_808B8340, &sp4C);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, sp50.r, sp50.g, sp50.b, 255);
gDPSetEnvColor(POLY_XLU_DISP++, sp4C.r, sp4C.g, sp4C.b, 255);
@@ -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..5baa97232 100644
--- a/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.h
+++ b/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.h
@@ -10,13 +10,13 @@ typedef s32 (*BgBreakwallUnkFunc)(struct BgBreakwall*, PlayState*);
typedef void (*BgBreakwallUnkFunc2)(struct BgBreakwall*, PlayState*);
#define BGBREAKWALL_GET_F(thisx) ((thisx)-> params & 0xF)
-#define BGBREAKWALL_SWITCHFLAG(thisx) (((thisx)-> params & 0xFE00) >> 9)
+#define BGBREAKWALL_SWITCH_FLAG(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 032091293..b7540aa3f 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);
@@ -171,7 +171,7 @@ void BgCraceMovebg_OpeningDoor_SetupOpen(BgCraceMovebg* this, PlayState* play) {
* Silde open, then do nothing.
*/
void BgCraceMovebg_OpeningDoor_Open(BgCraceMovebg* this, PlayState* play) {
- func_800B9010(&this->dyna.actor, NA_SE_EV_STONEDOOR_OPEN_S - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_STONEDOOR_OPEN_S - SFX_FLAG);
Math_SmoothStepToF(&this->doorHeight, this->targetDoorHeight, 2.0f, this->openSpeed, 0.01f);
this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y + this->doorHeight;
if (this->doorHeight == this->targetDoorHeight) {
@@ -227,7 +227,7 @@ void BgCraceMovebg_Update(Actor* thisx, PlayState* play) {
}
this->actionFunc(this, play);
- Math_Vec3f_Copy(&this->prevPlayerPos, &player->bodyPartsPos[0]);
+ Math_Vec3f_Copy(&this->prevPlayerPos, &player->bodyPartsPos[PLAYER_BODYPART_WAIST]);
}
/**
@@ -330,12 +330,12 @@ void BgCraceMovebg_ClosingDoor_Close(BgCraceMovebg* this, PlayState* play) {
!Flags_GetSwitch(play, BG_CRACE_MOVEBG_GET_SWITCH_FLAG(&this->dyna.actor) + 1)) {
play->haltAllActors = true;
func_80169FDC(&play->state);
- play_sound(NA_SE_OC_ABYSS);
+ Audio_PlaySfx(NA_SE_OC_ABYSS);
}
BgCraceMovebg_ClosingDoor_SetupDoNothing(this, play);
} else {
- func_800B9010(&this->dyna.actor, NA_SE_EV_STONEDOOR_CLOSE_S - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_STONEDOOR_CLOSE_S - SFX_FLAG);
}
}
@@ -343,7 +343,7 @@ void BgCraceMovebg_ClosingDoor_SetupDoNothing(BgCraceMovebg* this, PlayState* pl
this->targetDoorHeight = 0.0f;
this->doorHeight = 0.0f;
this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y;
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_STONEDOOR_STOP);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_STONEDOOR_STOP);
this->actionFunc = BgCraceMovebg_ClosingDoor_DoNothing;
}
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 68b2d77d2..688349742 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
@@ -108,7 +108,7 @@ void BgCtowerGear_Splash(BgCtowerGear* this, PlayState* play) {
}
}
}
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_WATERWHEEL_LEVEL);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_WATERWHEEL_LEVEL);
}
}
@@ -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);
}
}
@@ -153,7 +153,7 @@ void BgCtowerGear_Update(Actor* thisx, PlayState* play) {
this->dyna.actor.shape.rot.x -= 0x1F4;
} else if (type == BGCTOWERGEAR_CENTER_COG) {
this->dyna.actor.shape.rot.y += 0x1F4;
- func_800B9010(&this->dyna.actor, NA_SE_EV_WINDMILL_LEVEL - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_WINDMILL_LEVEL - SFX_FLAG);
} else if (type == BGCTOWERGEAR_WATER_WHEEL) {
this->dyna.actor.shape.rot.z -= 0x1F4;
BgCtowerGear_Splash(this, play);
@@ -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 85dcb0aca..d30f15308 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,8 +88,8 @@ 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) {
- play_sound(NA_SE_SY_SPIRAL_DASH);
+ if (play->csCtx.curFrame == 132) {
+ Audio_PlaySfx(NA_SE_SY_SPIRAL_DASH);
}
}
@@ -99,12 +99,12 @@ void BgCtowerRot_DoorDoNothing(BgCtowerRot* this, PlayState* play) {
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_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_STONEDOOR_STOP);
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_STONEDOOR_STOP);
+ CutsceneManager_Stop(this->dyna.actor.csId);
}
this->actionFunc = BgCtowerRot_DoorDoNothing;
} else if (this->dyna.actor.params == BGCTOWERROT_STONE_DOOR_MAIN) {
- func_800B9010(&this->dyna.actor, NA_SE_EV_STONE_STATUE_OPEN - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_STONE_STATUE_OPEN - SFX_FLAG);
}
this->dyna.actor.world.pos.x =
this->dyna.actor.home.pos.x + (Math_SinS(this->dyna.actor.world.rot.y) * this->timer);
@@ -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 c962cf8ef..52c0f046f 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
@@ -4,7 +4,6 @@
* Description: Great Bay Temple - Seesaw and Waterwheel w/ Platforms
*/
-#include "prevent_bss_reordering.h"
#include "z_bg_dblue_balance.h"
#include "objects/object_dblue_object/object_dblue_object.h"
@@ -199,7 +198,7 @@ void func_80B8264C(BgDblueBalance* this) {
f32 temp_f0;
s16 phi_s2;
- if (this->unk_170 != 0) {
+ if (this->isSwitchFlagSet) {
if (this->unk_183 < 8) {
this->unk_183 = 0;
} else {
@@ -248,7 +247,7 @@ void func_80B8264C(BgDblueBalance* this) {
}
void func_80B828E4(BgDblueBalance* this, PlayState* play) {
- if (Flags_GetSwitch(play, BGDBLUEBALANCE_GET_7F(&this->dyna.actor)) && (this->unk_17D <= 0)) {
+ if (Flags_GetSwitch(play, BGDBLUEBALANCE_GET_SWITCH_FLAG(&this->dyna.actor)) && (this->unk_17D <= 0)) {
if (this->unk_183 >= 252) {
this->unk_183 = 255;
} else {
@@ -307,7 +306,7 @@ void BgDblueBalance_Init(Actor* thisx, PlayState* play) {
BgDblueBalance* this = THIS;
s32 sp2C = BGDBLUEBALANCE_GET_300(&this->dyna.actor);
s32 pad2;
- s32 sp24 = Flags_GetSwitch(play, BGDBLUEBALANCE_GET_7F(&this->dyna.actor));
+ s32 isSwitchFlagSet = Flags_GetSwitch(play, BGDBLUEBALANCE_GET_SWITCH_FLAG(&this->dyna.actor));
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
@@ -317,7 +316,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) {
@@ -327,7 +326,7 @@ void BgDblueBalance_Init(Actor* thisx, PlayState* play) {
}
if (sp2C == 0) {
- if (sp24 != 0) {
+ if (isSwitchFlagSet) {
this->dyna.actor.shape.rot.z = -0x1C72;
this->unk_174 = -0x1C72;
} else {
@@ -338,9 +337,9 @@ void BgDblueBalance_Init(Actor* thisx, PlayState* play) {
func_80B8259C(this, play);
func_80B82DC4(this);
} else if (sp2C == 3) {
- this->unk_16C = sp24;
- this->unk_170 = sp24;
- if (sp24 != 0) {
+ this->isSwitchFlagSet2 = isSwitchFlagSet;
+ this->isSwitchFlagSet = isSwitchFlagSet;
+ if (isSwitchFlagSet) {
func_80B83344(this);
} else {
this->unk_178 = 0x1F4;
@@ -397,7 +396,7 @@ void func_80B82DE0(BgDblueBalance* this, PlayState* play) {
BgDblueBalance* sp3C;
Vec3f sp30;
- if (Flags_GetSwitch(play, BGDBLUEBALANCE_GET_7F(&this->dyna.actor))) {
+ if (Flags_GetSwitch(play, BGDBLUEBALANCE_GET_SWITCH_FLAG(&this->dyna.actor))) {
if (this->unk_17D > 0) {
this->unk_17D--;
} else {
@@ -412,17 +411,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;
}
}
@@ -476,7 +475,7 @@ void func_80B82DE0(BgDblueBalance* this, PlayState* play) {
phi_f2 = 1.0f;
}
- func_8019FAD8(&this->dyna.actor.projectedPos, NA_SE_EV_SEESAW_INCLINE - SFX_FLAG, phi_f2 + 1.0f);
+ Audio_PlaySfx_AtPosWithFreq(&this->dyna.actor.projectedPos, NA_SE_EV_SEESAW_INCLINE - SFX_FLAG, phi_f2 + 1.0f);
actor->shape.rot.z += this->unk_178;
if (this->dyna.actor.shape.rot.z > 0x1C71) {
@@ -485,7 +484,7 @@ void func_80B82DE0(BgDblueBalance* this, PlayState* play) {
this->unk_178 *= -0.6f;
this->unk_17C++;
if (this->unk_182) {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_SEESAW_WATER_BOUND);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_SEESAW_WATER_BOUND);
sp5C = this->unk_15C;
Matrix_Push();
Matrix_RotateYS(BINANG_SUB(this->dyna.actor.shape.rot.y, 0x4000), MTXMODE_NEW);
@@ -498,7 +497,7 @@ void func_80B82DE0(BgDblueBalance* this, PlayState* play) {
func_80B8296C(play, &sp50, 70.0f);
} else {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_SEESAW_BOUND);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_SEESAW_BOUND);
}
} else {
this->dyna.actor.shape.rot.z = 0x1C72;
@@ -510,7 +509,7 @@ void func_80B82DE0(BgDblueBalance* this, PlayState* play) {
this->unk_178 *= -0.6f;
this->unk_17C++;
if (this->unk_182) {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_SEESAW_WATER_BOUND);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_SEESAW_WATER_BOUND);
sp3C = this->unk_160;
Matrix_Push();
Matrix_RotateYS(BINANG_ADD(this->dyna.actor.shape.rot.y, 0x4000), MTXMODE_NEW);
@@ -523,7 +522,7 @@ void func_80B82DE0(BgDblueBalance* this, PlayState* play) {
func_80B8296C(play, &sp30, 47.0f);
} else {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_SEESAW_BOUND);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_SEESAW_BOUND);
}
} else {
this->dyna.actor.shape.rot.z = -0x1C72;
@@ -546,8 +545,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) {
@@ -556,7 +555,7 @@ void func_80B83344(BgDblueBalance* this) {
}
void func_80B8335C(BgDblueBalance* this, PlayState* play) {
- if (!Flags_GetSwitch(play, BGDBLUEBALANCE_GET_7F(&this->dyna.actor))) {
+ if (!Flags_GetSwitch(play, BGDBLUEBALANCE_GET_SWITCH_FLAG(&this->dyna.actor))) {
this->unk_178 = -0x14;
func_80B833A8(this);
}
@@ -574,8 +573,8 @@ void func_80B833C4(BgDblueBalance* this, PlayState* play) {
s16 sp26;
s16 sp24;
- if (this->unk_170 != 0) {
- if ((this->unk_16C == 0) && (this->unk_17F == 0)) {
+ if (this->isSwitchFlagSet) {
+ if (!this->isSwitchFlagSet2 && (this->unk_17F == 0)) {
this->unk_17F = 1;
}
@@ -591,9 +590,11 @@ void func_80B833C4(BgDblueBalance* this, PlayState* play) {
sp26 = this->dyna.actor.shape.rot.x;
this->dyna.actor.shape.rot.x += this->unk_178;
sp24 = this->dyna.actor.shape.rot.x;
+
+ //! FAKE:
if (sp24) {}
- if (this->unk_170 != 0) {
+ if (this->isSwitchFlagSet) {
if (this->unk_186 != 0) {
if (func_80B82B00(sp26, sp24, this->unk_184)) {
sp28 = true;
@@ -620,26 +621,26 @@ void func_80B833C4(BgDblueBalance* this, PlayState* play) {
void func_80B83518(Actor* thisx, PlayState* play) {
BgDblueBalance* this = THIS;
- this->unk_170 = Flags_GetSwitch(play, BGDBLUEBALANCE_GET_7F(&this->dyna.actor));
+ this->isSwitchFlagSet = Flags_GetSwitch(play, BGDBLUEBALANCE_GET_SWITCH_FLAG(&this->dyna.actor));
this->actionFunc(this, 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;
+ this->isSwitchFlagSet2 = this->isSwitchFlagSet;
}
void BgDblueBalance_Draw(Actor* thisx, PlayState* play) {
@@ -663,7 +664,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);
@@ -691,7 +692,8 @@ void func_80B83758(Actor* thisx, PlayState* play) {
temp_f0 = this->unk_178 * 0.002f;
temp_f0 = CLAMP(temp_f0, 0.0f, 1.0f);
}
- func_8019FB0C(&this->dyna.actor.projectedPos, NA_SE_EV_SMALL_WATER_WHEEL - SFX_FLAG, temp_f0, 0x20);
+ Audio_PlaySfx_AtPosWithFreqAndChannelIO(&this->dyna.actor.projectedPos, NA_SE_EV_SMALL_WATER_WHEEL - SFX_FLAG,
+ temp_f0, 0x20);
}
if (this->dyna.actor.flags & ACTOR_FLAG_40) {
@@ -705,7 +707,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..4c16a1cb8 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
@@ -7,7 +7,7 @@ struct BgDblueBalance;
typedef void (*BgDblueBalanceActionFunc)(struct BgDblueBalance*, PlayState*);
-#define BGDBLUEBALANCE_GET_7F(thisx) ((thisx)->params & 0x7F)
+#define BGDBLUEBALANCE_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
#define BGDBLUEBALANCE_GET_300(thisx) (((thisx)->params >> 8) & 3)
typedef struct {
@@ -23,8 +23,8 @@ typedef struct BgDblueBalance {
/* 0x160 */ struct BgDblueBalance* unk_160;
/* 0x164 */ struct BgDblueBalance* unk_164;
/* 0x168 */ BgDblueBalanceActionFunc actionFunc;
- /* 0x16C */ s32 unk_16C;
- /* 0x170 */ s32 unk_170;
+ /* 0x16C */ s32 isSwitchFlagSet2;
+ /* 0x170 */ s32 isSwitchFlagSet;
/* 0x174 */ s16 unk_174;
/* 0x176 */ s16 unk_176;
/* 0x178 */ s16 unk_178;
@@ -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 45b42942b..be3623f2d 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
@@ -4,6 +4,7 @@
* Description: Great Bay Temple - Waterwheels, push switches, gear shafts, and whirlpools
*/
+#include "prevent_bss_reordering.h"
#include "z_bg_dblue_movebg.h"
#include "objects/object_dblue_object/object_dblue_object.h"
#include "overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.h"
@@ -33,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;
@@ -96,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),
@@ -107,22 +108,22 @@ static InitChainEntry sInitChain[] = {
Vec3f D_80A2B988 = { 1785.0f, 0.0f, 220.0f };
-s32 func_80A29A80(PlayState* play, s32 arg1, s32 arg2) {
+s32 func_80A29A80(PlayState* play, s32 switchFlagBase, s32 arg2) {
s32 sp2C = 1;
- s32 val;
+ s32 switchFlagOffset;
s32 val2;
if (arg2 < 14) {
- val = D_80A2B870[arg2][0];
+ switchFlagOffset = D_80A2B870[arg2][0];
val2 = D_80A2B870[arg2][1];
- while (val--) {
- if ((1 << val) & val2) {
- if (!Flags_GetSwitch(play, arg1 + val)) {
+ while (switchFlagOffset--) {
+ if ((1 << switchFlagOffset) & val2) {
+ if (!Flags_GetSwitch(play, switchFlagBase + switchFlagOffset)) {
sp2C = 0;
break;
}
- } else if (Flags_GetSwitch(play, arg1 + val)) {
+ } else if (Flags_GetSwitch(play, switchFlagBase + switchFlagOffset)) {
sp2C = 0;
break;
}
@@ -131,20 +132,20 @@ s32 func_80A29A80(PlayState* play, s32 arg1, s32 arg2) {
sp2C = 0;
switch (arg2) {
case 14:
- if (!Flags_GetSwitch(play, arg1)) {
+ if (!Flags_GetSwitch(play, switchFlagBase)) {
sp2C = 1;
}
- if (Flags_GetSwitch(play, arg1 + 1) && Flags_GetSwitch(play, arg1 + 2) &&
- Flags_GetSwitch(play, arg1 + 3)) {
+ if (Flags_GetSwitch(play, switchFlagBase + 1) && Flags_GetSwitch(play, switchFlagBase + 2) &&
+ Flags_GetSwitch(play, switchFlagBase + 3)) {
sp2C += 2;
}
break;
case 15:
- if (!Flags_GetSwitch(play, arg1) ||
- (Flags_GetSwitch(play, arg1 + 1) && Flags_GetSwitch(play, arg1 + 2) &&
- Flags_GetSwitch(play, arg1 + 3))) {
+ if (!Flags_GetSwitch(play, switchFlagBase) ||
+ (Flags_GetSwitch(play, switchFlagBase + 1) && Flags_GetSwitch(play, switchFlagBase + 2) &&
+ Flags_GetSwitch(play, switchFlagBase + 3))) {
sp2C = 1;
}
break;
@@ -161,8 +162,8 @@ void BgDblueMovebg_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
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);
+ this->switchFlag = BGDBLUEMOVEBG_GET_SWITCH_FLAG(thisx);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
if ((this->unk_160 == 9) || (this->unk_160 == 8)) {
if (D_80A2BBF4.unk_00 != 0) {
@@ -196,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:
@@ -213,17 +214,17 @@ void BgDblueMovebg_Init(Actor* thisx, PlayState* play) {
}
this->unk_17E = 0;
this->unk_184 = 0.0f;
- if (Flags_GetSwitch(play, this->unk_1C0)) {
+ if (Flags_GetSwitch(play, this->switchFlag)) {
this->unk_18C = 0x384;
} else {
this->unk_18C = 0;
}
- this->dyna.actor.shape.rot.y += (s16)((this->unk_18C / 10.0f) * (0x10000 / 360.0f));
+ this->dyna.actor.shape.rot.y += DEG_TO_BINANG(this->unk_18C / 10.0f);
this->actionFunc = func_80A2A714;
break;
case 6:
- this->unk_178 = func_80A29A80(play, this->unk_1C0, this->unk_1BC);
+ this->unk_178 = func_80A29A80(play, this->switchFlag, this->unk_1BC);
this->unk_1CC = D_80A2B96C[this->unk_178];
this->unk_1CE = this->unk_1CC;
this->actionFunc = func_80A2A1E0;
@@ -236,7 +237,7 @@ void BgDblueMovebg_Init(Actor* thisx, PlayState* play) {
this->dyna.actor.shape.rot.x = 0;
this->dyna.actor.world.rot.z = 0;
this->dyna.actor.shape.rot.z = 0;
- if (Flags_GetSwitch(play, this->unk_1C0)) {
+ if (Flags_GetSwitch(play, this->switchFlag)) {
Actor_Kill(&this->dyna.actor);
break;
}
@@ -244,7 +245,7 @@ void BgDblueMovebg_Init(Actor* thisx, PlayState* play) {
this->dyna.actor.draw = func_80A2B308;
this->unk_17E = 0;
this->unk_184 = 0.0f;
- this->dyna.actor.shape.rot.y += (s16)((this->unk_18C / 10.0f) * (0x10000 / 360.0f));
+ this->dyna.actor.shape.rot.y += DEG_TO_BINANG(this->unk_18C / 10.0f);
this->actionFunc = func_80A2A32C;
break;
@@ -253,10 +254,10 @@ 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_178 = func_80A29A80(play, this->switchFlag, this->unk_1BC);
this->unk_1CC = D_80A2B96C[this->unk_178];
this->unk_1CE = this->unk_1CC;
Matrix_RotateYS(this->dyna.actor.shape.rot.y, MTXMODE_NEW);
@@ -274,7 +275,7 @@ void BgDblueMovebg_Init(Actor* thisx, PlayState* play) {
break;
case 11:
- this->unk_1CC = D_80A2B96C[func_80A29A80(play, this->unk_1C0, this->unk_1BC)];
+ this->unk_1CC = D_80A2B96C[func_80A29A80(play, this->switchFlag, this->unk_1BC)];
D_80A2BBF0 = this;
this->dyna.actor.flags |= ACTOR_FLAG_20;
this->dyna.actor.update = Actor_Noop;
@@ -313,7 +314,7 @@ void func_80A2A128(BgDblueMovebg* this, PlayState* play) {
}
void func_80A2A1E0(BgDblueMovebg* this, PlayState* play) {
- s32 temp_v0 = func_80A29A80(play, this->unk_1C0, this->unk_1BC);
+ s32 temp_v0 = func_80A29A80(play, this->switchFlag, this->unk_1BC);
if (temp_v0 != this->unk_178) {
switch (temp_v0) {
@@ -384,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 {
@@ -407,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 =
@@ -421,8 +422,8 @@ void func_80A2A444(BgDblueMovebg* this, PlayState* play) {
if (sp20) {
player->stateFlags2 &= ~PLAYER_STATE2_10;
this->dyna.pushForce = 0.0f;
- Flags_SetSwitch(play, this->unk_1C0);
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_STONEDOOR_STOP);
+ Flags_SetSwitch(play, this->switchFlag);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_STONEDOOR_STOP);
if (func_80A29A80(play, this->unk_1C8, this->unk_1C4)) {
this->unk_172 |= 1;
@@ -431,11 +432,11 @@ void func_80A2A444(BgDblueMovebg* this, PlayState* play) {
}
if (!(this->unk_174 & 1) && (this->unk_172 & 1)) {
- func_801000CC(NA_SE_EV_PIPE_STREAM_START);
+ Lib_PlaySfx_2(NA_SE_EV_PIPE_STREAM_START);
}
func_80A2A670(this, play);
} else {
- func_800B9010(&this->dyna.actor, NA_SE_EV_COCK_SWITCH_ROLL - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_COCK_SWITCH_ROLL - SFX_FLAG);
}
}
@@ -446,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) &&
@@ -476,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;
}
@@ -494,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 =
@@ -510,9 +510,9 @@ void func_80A2A7F8(BgDblueMovebg* this, PlayState* play) {
temp = (this->unk_18C + sp26 + 3600) % 3600;
if ((temp == 900) || (temp == 2700)) {
- Flags_SetSwitch(play, this->unk_1C0);
+ Flags_SetSwitch(play, this->switchFlag);
} else {
- Flags_UnsetSwitch(play, this->unk_1C0);
+ Flags_UnsetSwitch(play, this->switchFlag);
}
player->stateFlags1 |= PLAYER_STATE1_20;
@@ -524,7 +524,7 @@ void func_80A2A7F8(BgDblueMovebg* this, PlayState* play) {
this->unk_18A = 0;
this->unk_17E = 0;
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_STONEDOOR_STOP);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_STONEDOOR_STOP);
if (func_80A29A80(play, this->unk_1C8, this->unk_1C4)) {
this->unk_172 |= 1;
@@ -533,14 +533,14 @@ void func_80A2A7F8(BgDblueMovebg* this, PlayState* play) {
}
if (!(this->unk_174 & 1) && (this->unk_172 & 1)) {
- func_801000CC(NA_SE_EV_PIPE_STREAM_START);
+ Lib_PlaySfx_2(NA_SE_EV_PIPE_STREAM_START);
}
this->unk_174 = this->unk_172;
this->unk_1D0 = 17;
this->actionFunc = func_80A2AAB8;
} else {
- func_800B9010(&this->dyna.actor, NA_SE_EV_COCK_SWITCH_ROLL - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_COCK_SWITCH_ROLL - SFX_FLAG);
}
}
@@ -549,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;
}
}
@@ -637,18 +637,18 @@ void func_80A2AED0(BgDblueMovebg* this, PlayState* play) {
}
}
- temp_v0_3 = func_80A29A80(play, this->unk_1C0, this->unk_1BC);
+ temp_v0_3 = func_80A29A80(play, this->switchFlag, this->unk_1BC);
if (temp_v0_3 != this->unk_178) {
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;
}
@@ -704,7 +704,7 @@ void func_80A2AED0(BgDblueMovebg* this, PlayState* play) {
}
void func_80A2B1A0(BgDblueMovebg* this, PlayState* play) {
- switch (func_80A29A80(play, this->unk_1C0, this->unk_1BC)) {
+ switch (func_80A29A80(play, this->switchFlag, this->unk_1BC)) {
case 1:
this->dyna.actor.shape.rot.z = this->dyna.actor.home.rot.z;
break;
@@ -721,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;
}
}
@@ -736,12 +736,12 @@ void func_80A2B274(Actor* thisx, PlayState* play) {
return;
}
- temp_v1 = D_80A2B96C[func_80A29A80(play, this->unk_1C0, this->unk_1BC)];
+ temp_v1 = D_80A2B96C[func_80A29A80(play, this->switchFlag, this->unk_1BC)];
if (temp_v1 != 0) {
if (temp_v1 > 0) {
- func_8019FC20(&this->dyna.actor.projectedPos, NA_SE_EV_DUMMY_WATER_WHEEL_RR - SFX_FLAG);
+ Audio_PlaySfx_WaterWheel(&this->dyna.actor.projectedPos, NA_SE_EV_DUMMY_WATER_WHEEL_RR - SFX_FLAG);
} else {
- func_8019FC20(&this->dyna.actor.projectedPos, NA_SE_EV_DUMMY_WATER_WHEEL_LR - SFX_FLAG);
+ Audio_PlaySfx_WaterWheel(&this->dyna.actor.projectedPos, NA_SE_EV_DUMMY_WATER_WHEEL_LR - SFX_FLAG);
}
}
}
@@ -752,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);
@@ -778,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);
@@ -797,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);
@@ -820,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++) {
@@ -856,9 +856,11 @@ void BgDblueMovebg_Draw(Actor* thisx, PlayState* play2) {
if ((this->unk_160 == 9) || (this->unk_160 == 8)) {
if (this->unk_1CC >= 0) {
- func_8019FB0C(&this->unk_1A8, NA_SE_EV_BIG_WATER_WHEEL_RR - SFX_FLAG, this->unk_1D4, 32);
+ Audio_PlaySfx_AtPosWithFreqAndChannelIO(&this->unk_1A8, NA_SE_EV_BIG_WATER_WHEEL_RR - SFX_FLAG,
+ this->unk_1D4, 32);
} else {
- func_8019FB0C(&this->unk_1A8, NA_SE_EV_BIG_WATER_WHEEL_LR - SFX_FLAG, this->unk_1D4, 32);
+ Audio_PlaySfx_AtPosWithFreqAndChannelIO(&this->unk_1A8, NA_SE_EV_BIG_WATER_WHEEL_LR - SFX_FLAG,
+ this->unk_1D4, 32);
}
}
}
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..c9a4e2f7e 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
@@ -8,7 +8,7 @@ struct BgDblueMovebg;
typedef void (*BgDblueMovebgActionFunc)(struct BgDblueMovebg*, PlayState*);
#define BGDBLUEMOVEBG_GET_F(thisx) ((thisx)->params & 0xF)
-#define BGDBLUEMOVEBG_GET_FF0(thisx) (((thisx)->params >> 4) & 0xFF)
+#define BGDBLUEMOVEBG_GET_SWITCH_FLAG(thisx) (((thisx)->params >> 4) & 0xFF)
#define BGDBLUEMOVEBG_GET_F000(thisx) (((thisx)->params >> 0xC) & 0xF)
#define BGDBLUEMOVEBG_F_8 8
@@ -37,15 +37,15 @@ 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;
+ /* 0x1C0 */ s32 switchFlag;
/* 0x1C4 */ s32 unk_1C4;
/* 0x1C8 */ s32 unk_1C8;
/* 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 b4c97fdde..211aac6fd 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
@@ -80,7 +80,7 @@ s32 func_80B83D04(BgDblueWaterfall* this, PlayState* play) {
s32 phi_v1;
s32 sp18 = BGDBLUEWATERFALL_GET_100(&this->actor);
- if (Flags_GetSwitch(play, BGDBLUEWATERFALL_GET_7F(&this->actor))) {
+ if (Flags_GetSwitch(play, BGDBLUEWATERFALL_GET_SWITCH_FLAG(&this->actor))) {
phi_v1 = true;
} else {
phi_v1 = false;
@@ -91,7 +91,7 @@ s32 func_80B83D04(BgDblueWaterfall* this, PlayState* play) {
s32 func_80B83D58(Actor* thisx, PlayState* play) {
BgDblueWaterfall* this = THIS;
- if (Flags_GetSwitch(play, BGDBLUEWATERFALL_GET_7F(&this->actor))) {
+ if (Flags_GetSwitch(play, BGDBLUEWATERFALL_GET_SWITCH_FLAG(&this->actor))) {
return false;
}
return true;
@@ -99,11 +99,11 @@ s32 func_80B83D58(Actor* thisx, PlayState* play) {
void func_80B83D94(BgDblueWaterfall* this, PlayState* play) {
s32 pad;
- s32 sp20 = BGDBLUEWATERFALL_GET_7F(&this->actor);
+ s32 switchFlag = BGDBLUEWATERFALL_GET_SWITCH_FLAG(&this->actor);
s32 sp1C = BGDBLUEWATERFALL_GET_100(&this->actor);
s32 phi_v0;
- if (Flags_GetSwitch(play, sp20)) {
+ if (Flags_GetSwitch(play, switchFlag)) {
phi_v0 = true;
} else {
phi_v0 = false;
@@ -111,20 +111,20 @@ void func_80B83D94(BgDblueWaterfall* this, PlayState* play) {
if (phi_v0 != sp1C) {
if (phi_v0) {
- Flags_UnsetSwitch(play, sp20);
+ Flags_UnsetSwitch(play, switchFlag);
} else {
- Flags_SetSwitch(play, sp20);
+ Flags_SetSwitch(play, switchFlag);
}
}
}
void func_80B83E1C(BgDblueWaterfall* this, PlayState* play) {
s32 pad;
- s32 sp20 = BGDBLUEWATERFALL_GET_7F(&this->actor);
+ s32 switchFlag = BGDBLUEWATERFALL_GET_SWITCH_FLAG(&this->actor);
s32 sp1C = BGDBLUEWATERFALL_GET_100(&this->actor);
s32 phi_v0;
- if (Flags_GetSwitch(play, sp20)) {
+ if (Flags_GetSwitch(play, switchFlag)) {
phi_v0 = true;
} else {
phi_v0 = false;
@@ -132,9 +132,9 @@ void func_80B83E1C(BgDblueWaterfall* this, PlayState* play) {
if (phi_v0 == sp1C) {
if (phi_v0) {
- Flags_UnsetSwitch(play, sp20);
+ Flags_UnsetSwitch(play, switchFlag);
} else {
- Flags_SetSwitch(play, sp20);
+ Flags_SetSwitch(play, switchFlag);
}
}
}
@@ -223,7 +223,7 @@ void func_80B841A0(BgDblueWaterfall* this, PlayState* play) {
EffectSsGSplash_Spawn(play, &sp94, NULL, NULL, 0, 250);
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_REFLECTION_WATER);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_REFLECTION_WATER);
}
}
@@ -320,9 +320,10 @@ void func_80B84610(BgDblueWaterfall* this, PlayState* play) {
player->actor.world.pos.x += sp34.x;
player->actor.world.pos.z += sp34.z;
+ //! FAKE:
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 +424,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 +449,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 +461,7 @@ void func_80B84AEC(BgDblueWaterfall* this, PlayState* play) {
func_80B84B9C(this, play);
}
} else {
- ActorCutscene_SetIntentToPlay(this->unk_1A4);
+ CutsceneManager_Queue(this->csId);
}
}
@@ -530,10 +531,10 @@ void func_80B84BCC(BgDblueWaterfall* this, PlayState* play) {
}
}
- func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&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);
}
@@ -569,10 +570,10 @@ void func_80B84F20(BgDblueWaterfall* this, PlayState* play) {
this->unk_19F = 0;
}
- func_800B9010(&this->actor, NA_SE_EV_ICE_MELT_LEVEL - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&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 +591,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 +610,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..6e373084e 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
@@ -7,7 +7,7 @@ struct BgDblueWaterfall;
typedef void (*BgDblueWaterfallActionFunc)(struct BgDblueWaterfall*, PlayState*);
-#define BGDBLUEWATERFALL_GET_7F(thisx) ((thisx)->params & 0x7F)
+#define BGDBLUEWATERFALL_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
#define BGDBLUEWATERFALL_GET_100(thisx) (((thisx)->params >> 8) & 1)
typedef struct BgDblueWaterfall {
@@ -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 6ec845e2c..7f0312f0c 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
@@ -120,15 +120,16 @@ void BgDkjailIvy_Init(Actor* thisx, PlayState* play) {
DynaPolyActor_Init(&this->dyna, 0);
Collider_InitCylinder(play, &this->collider);
- if (Flags_GetSwitch(play, BG_DKJAIL_GET_SWITCH(thisx))) {
+ if (Flags_GetSwitch(play, BG_DKJAIL_GET_SWITCH_FLAG(thisx))) {
Actor_Kill(&this->dyna.actor);
- } else {
- DynaPolyActor_LoadMesh(play, &this->dyna, &object_dkjail_obj_Colheader_0011A8);
- Collider_SetCylinder(play, &this->collider, &this->dyna.actor, &sCylinderInit);
- Collider_UpdateCylinder(&this->dyna.actor, &this->collider);
- this->alpha = 255;
- BgDkjailIvy_SetupWaitForCut(this);
+ return;
}
+
+ DynaPolyActor_LoadMesh(play, &this->dyna, &gDkjailCol);
+ Collider_SetCylinder(play, &this->collider, &this->dyna.actor, &sCylinderInit);
+ Collider_UpdateCylinder(&this->dyna.actor, &this->collider);
+ this->alpha = 255;
+ BgDkjailIvy_SetupWaitForCut(this);
}
void BgDkjailIvy_Destroy(Actor* thisx, PlayState* play) {
@@ -146,7 +147,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 +159,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);
- Flags_SetSwitch(play, BG_DKJAIL_GET_SWITCH(&this->dyna.actor));
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
+ Flags_SetSwitch(play, BG_DKJAIL_GET_SWITCH_FLAG(&this->dyna.actor));
BgDkjailIvy_IvyCutEffects(this, play);
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_GRASS_WALL_BROKEN);
+ 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 +201,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_Dkjail_Ivy/z_bg_dkjail_ivy.h b/src/overlays/actors/ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.h
index 4835b7a0b..e7ce39a64 100644
--- a/src/overlays/actors/ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.h
+++ b/src/overlays/actors/ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.h
@@ -3,7 +3,7 @@
#include "global.h"
-#define BG_DKJAIL_GET_SWITCH(thisx) ((thisx)->params & 0x7F)
+#define BG_DKJAIL_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
struct BgDkjailIvy;
diff --git a/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c b/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c
index 332e4e543..404530342 100644
--- a/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c
+++ b/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c
@@ -5,6 +5,7 @@
*/
#include "z_bg_dy_yoseizo.h"
+#include "overlays/actors/ovl_Demo_Effect/z_demo_effect.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_2000000)
@@ -13,19 +14,17 @@
void BgDyYoseizo_Init(Actor* thisx, PlayState* play);
void BgDyYoseizo_Destroy(Actor* thisx, PlayState* play);
void BgDyYoseizo_Update(Actor* thisx, PlayState* play);
+void BgDyYoseizo_Draw(Actor* thisx, PlayState* play);
-void func_80A0AE1C(BgDyYoseizo* this, PlayState* play);
-void func_80A0B078(BgDyYoseizo* this, PlayState* play);
void func_80A0B184(BgDyYoseizo* this, PlayState* play);
-void func_80A0B290(BgDyYoseizo* this, PlayState* play);
-void func_80A0B35C(BgDyYoseizo* this, PlayState* play);
-void func_80A0B500(BgDyYoseizo* this, PlayState* play);
-void func_80A0B5F0(BgDyYoseizo* this, PlayState* play);
-void func_80A0B75C(BgDyYoseizo* this, PlayState* play);
-void func_80A0B8CC(BgDyYoseizo* this, PlayState* play);
void func_80A0BB08(BgDyYoseizo* this, PlayState* play);
-#if 0
+/* Effects functions */
+void BgDyYoseizo_SpawnEffect(BgDyYoseizo* this, Vec3f* initPos, Vec3f* initVelocity, Vec3f* accel,
+ Color_RGB8* primColor, Color_RGB8* envColor, f32 scale, s16 life, s16 type);
+void BgDyYoseizo_UpdateEffects(BgDyYoseizo* this, PlayState* play);
+void BgDyYoseizo_DrawEffects(BgDyYoseizo* this, PlayState* play);
+
ActorInit Bg_Dy_Yoseizo_InitVars = {
ACTOR_BG_DY_YOSEIZO,
ACTORCAT_PROP,
@@ -38,56 +37,730 @@ ActorInit Bg_Dy_Yoseizo_InitVars = {
(ActorFunc)NULL,
};
-#endif
+typedef enum GreatFairyAnimation {
+ /* 0 */ GREATFAIRY_ANIM_START_GIVING_UPGRADE,
+ /* 1 */ GREATFAIRY_ANIM_GIVING_UPGRADE,
+ /* 2 */ GREATFAIRY_ANIM_SPIN_LAY_DOWN,
+ /* 3 */ GREATFAIRY_ANIM_LAY_DOWN_TRANSITION,
+ /* 4 */ GREATFAIRY_ANIM_LAYING_DOWN,
+ /* 5 */ GREATFAIRY_ANIM_SHOWING_ITEM,
+ /* 6 */ GREATFAIRY_ANIM_ARMS_FOLDED,
+ /* 7 */ GREATFAIRY_ANIM_CLAPPING,
+ /* 8 */ GREATFAIRY_ANIM_TEACH_SPIN_ATTACK,
+ /* 9 */ GREATFAIRY_ANIM_MAX
+} GreatFairyAnimation;
-extern UNK_TYPE D_06008090;
-extern UNK_TYPE D_0600D228;
-extern UNK_TYPE D_0601C6F4;
+static AnimationHeader* sAnimations[GREATFAIRY_ANIM_MAX] = {
+ &gGreatFairyStartGivingUpgradeAnim, // GREATFAIRY_ANIM_START_GIVING_UPGRADE
+ &gGreatFairyGivingUpgradeAnim, // GREATFAIRY_ANIM_GIVING_UPGRADE
+ &gGreatFairySpinLayDownAnim, // GREATFAIRY_ANIM_SPIN_LAY_DOWN
+ &gGreatFairyLayDownTransitionAnim, // GREATFAIRY_ANIM_LAY_DOWN_TRANSITION
+ &gGreatFairyLayingDownAnim, // GREATFAIRY_ANIM_LAYING_DOWN
+ &gGreatFairyShowingItemAnim, // GREATFAIRY_ANIM_SHOWING_ITEM
+ &gGreatFairyArmsFoldedAnim, // GREATFAIRY_ANIM_ARMS_FOLDED
+ &gGreatFairyClappingAnim, // GREATFAIRY_ANIM_CLAPPING
+ &gGreatFairyTeachSpinAttackAnim, // GREATFAIRY_ANIM_TEACH_SPIN_ATTACK
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/BgDyYoseizo_Init.s")
+void BgDyYoseizo_Init(Actor* thisx, PlayState* play) {
+ BgDyYoseizo* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/BgDyYoseizo_Destroy.s")
+ this->unk2EC = this->actor.world.pos.y + 40.0f;
+ this->actor.focus.pos = this->actor.world.pos;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0A96C.s")
+ SkelAnime_InitFlex(play, &this->skelAnime, &gGreatFairySkel, &gGreatFairyShowingItemAnim, this->jointTable,
+ this->morphTable, GREAT_FAIRY_LIMB_MAX);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0A9E4.s")
+ this->actionFunc = func_80A0BB08;
+ Actor_SetScale(&this->actor, 0.0f);
+ this->eyeIndex = 0;
+ this->mouthIndex = 0;
+ this->blinkTimer = 0;
+ this->unk2F8 = 0;
+ GREAT_FAIRY_ROTZ(&this->actor) = 1;
+ this->unk302 = 0;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0AA40.s")
+void BgDyYoseizo_Destroy(Actor* thisx, PlayState* play) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0AD50.s")
+// Has no visible effect since no segment is set for manually-controllable eye textures
+void BgDyYoseizo_UpdateEyes(BgDyYoseizo* this) {
+ if (this->blinkTimer != 0) {
+ this->blinkTimer--;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0AE1C.s")
+ if (this->blinkTimer == 0) {
+ this->eyeIndex++;
+ if (this->eyeIndex >= 3) {
+ this->eyeIndex = 0;
+ this->blinkTimer = (s32)Rand_ZeroFloat(60.0f) + 20;
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0AFDC.s")
+void BgDyYoseizo_Bob(BgDyYoseizo* this, PlayState* play) {
+ this->actor.shape.yOffset = Math_SinS(play->gameplayFrames * 1000) * 15.0f;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0B078.s")
+typedef enum GreatFairyEffectTrajectory {
+ /* 0 */ GREAT_FAIRY_EFFECT_TRAJECTORY_RADIANT, // Dispersing particles, in the Great Fairy's signature colour.
+ /* 2 */ GREAT_FAIRY_EFFECT_TRAJECTORY_FAST_RADIANT = 2, // As above, but initially move 10 times faster.
+ /* 5 */ GREAT_FAIRY_EFFECT_TRAJECTORY_CONVERGE_ON_PLAYER = 5 // Similar to OoT's healing effect, fixed colour.
+} GreatFairyEffectTrajectory;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0B184.s")
+/**
+ * Spawn particle effects; see `GreatFairyEffectTrajectory` enum for details
+ *
+ * @param trajectoryType use the `GreatFairyEffectTrajectory` enum.
+ * @param count number to spawn.
+ */
+void BgDyYoseizo_SpawnEffects(BgDyYoseizo* this, s16 trajectoryType, s32 count) {
+ static Color_RGB8 sEffectPrimColors[] = {
+ { 255, 235, 220 }, // Magic
+ { 255, 220, 220 }, // Power
+ { 220, 255, 220 }, // Wisdom
+ { 220, 220, 255 }, // Courage
+ { 255, 255, 200 }, // Kindness
+ { 255, 255, 170 }, // GREAT_FAIRY_EFFECT_TRAJECTORY_CONVERGE_ON_PLAYER
+ };
+ static Color_RGB8 sEffectEnvColors[] = {
+ { 255, 150, 0 }, // Magic
+ { 255, 0, 0 }, // Power
+ { 0, 255, 0 }, // Wisdom
+ { 0, 0, 255 }, // Courage
+ { 255, 255, 0 }, // Kindness
+ { 255, 100, 255 }, // GREAT_FAIRY_EFFECT_TRAJECTORY_CONVERGE_ON_PLAYER
+ };
+ Vec3f velocity;
+ Vec3f accel;
+ Vec3f pos;
+ Color_RGB8 primColor;
+ Color_RGB8 envColor;
+ f32 spawnHeightVariation;
+ f32 scale;
+ s32 effectType;
+ s32 life;
+ s32 i;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0B290.s")
+ if (this->actor.scale.y < 0.01f) {
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0B35C.s")
+ spawnHeightVariation = this->actor.scale.y * 3500.0f;
+ accel.x = Rand_ZeroOne() - 0.5f;
+ accel.y = Rand_ZeroOne() - 0.5f;
+ accel.z = Rand_ZeroOne() - 0.5f;
+ velocity.x = accel.x * 10.0f;
+ velocity.y = accel.y * 10.0f;
+ velocity.z = accel.z * 10.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0B500.s")
+ for (i = 0; i < count; i++) {
+ switch (trajectoryType) {
+ case GREAT_FAIRY_EFFECT_TRAJECTORY_FAST_RADIANT:
+ scale = 1.0f;
+ life = 90;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0B5F0.s")
+ velocity.x = accel.x * 100.0f;
+ velocity.y = accel.y * 100.0f;
+ velocity.z = accel.z * 100.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0B75C.s")
+ effectType = GREAT_FAIRY_GET_TYPE(&this->actor);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0B834.s")
+ pos.x = this->actor.world.pos.x;
+ pos.y = this->actor.world.pos.y + spawnHeightVariation +
+ (Rand_ZeroOne() - 0.5f) * (spawnHeightVariation * 0.5f);
+ pos.z = this->actor.world.pos.z + 30.0f;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0B8CC.s")
+ case GREAT_FAIRY_EFFECT_TRAJECTORY_RADIANT:
+ scale = 1.0f;
+ life = 90;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0BB08.s")
+ effectType = GREAT_FAIRY_GET_TYPE(&this->actor);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/BgDyYoseizo_Update.s")
+ pos.x = this->actor.world.pos.x;
+ pos.y = this->actor.world.pos.y + spawnHeightVariation +
+ (Rand_ZeroOne() - 0.5f) * (spawnHeightVariation * 0.5f);
+ pos.z = this->actor.world.pos.z + 30.0f;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0BCD8.s")
+ default: // all become convergent type
+ scale = 0.2f;
+ life = 50;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0BD40.s")
+ effectType = GREAT_FAIRY_EFFECT_TRAJECTORY_CONVERGE_ON_PLAYER;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0BE60.s")
+ pos.x = Rand_CenteredFloat(10.0f) + this->actor.world.pos.x;
+ pos.y = this->actor.world.pos.y + spawnHeightVariation + 50.0f +
+ (Rand_ZeroOne() - 0.5f) * (spawnHeightVariation * 0.1f);
+ pos.z = this->actor.world.pos.z + 30.0f;
+ break;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0BF70.s")
+ primColor.r = sEffectPrimColors[effectType].r;
+ primColor.g = sEffectPrimColors[effectType].g;
+ primColor.b = sEffectPrimColors[effectType].b;
+ envColor.r = sEffectEnvColors[effectType].r;
+ envColor.g = sEffectEnvColors[effectType].g;
+ envColor.b = sEffectEnvColors[effectType].b;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dy_Yoseizo/func_80A0C270.s")
+ BgDyYoseizo_SpawnEffect(this, &pos, &velocity, &accel, &primColor, &envColor, scale, life, effectType);
+ }
+}
+
+void func_80A0AD50(BgDyYoseizo* this) {
+ f32 scale = this->actor.scale.x;
+ f32 heightTarget = this->actor.home.pos.y + 40.0f;
+
+ Math_ApproachF(&this->actor.world.pos.y, heightTarget, this->unk2F0, 100.0f);
+ Math_ApproachF(&scale, 0.035f, this->unk2F4, 0.005f);
+ Math_ApproachF(&this->unk2F0, 0.8f, 0.1f, 0.02f);
+ Math_ApproachF(&this->unk2F4, 0.2f, 0.03f, 0.05f);
+ BgDyYoseizo_SpawnEffects(this, GREAT_FAIRY_EFFECT_TRAJECTORY_RADIANT, 2);
+ Actor_SetScale(&this->actor, scale);
+}
+
+void func_80A0AE1C(BgDyYoseizo* this, PlayState* play) {
+ f32 scale = this->actor.scale.x;
+ f32 heightTarget = this->actor.home.pos.y;
+
+ if (scale < 0.003f) {
+ this->actionFunc = func_80A0BB08;
+ Actor_SetScale(&this->actor, 0.0f);
+ this->unk2F0 = 0.0f;
+ this->unk2F4 = 0.0f;
+ this->unk2F8 = 0;
+
+ if (GREAT_FAIRY_GET_TYPE(&this->actor) <= GREAT_FAIRY_TYPE_COURAGE) {
+ Actor_Spawn(&play->actorCtx, play, ACTOR_DEMO_EFFECT, this->actor.world.pos.x,
+ this->actor.world.pos.y + 20.0f, this->actor.world.pos.z, 0, 0, 0,
+ GREAT_FAIRY_GET_TYPE(&this->actor) + DEMO_EFFECT_TYPE_LIGHT_BASE);
+ } else {
+ Actor_Spawn(&play->actorCtx, play, ACTOR_DEMO_EFFECT, this->actor.world.pos.x,
+ this->actor.world.pos.y + 20.0f, this->actor.world.pos.z, 0, 0, 0,
+ DEMO_EFFECT_TYPE_LIGHT_DARK_YELLOW);
+ }
+ Audio_PlaySfx(NA_SE_SY_WHITE_OUT_T);
+ } else {
+ Math_ApproachF(&this->actor.world.pos.y, heightTarget, this->unk2F0, 100.0f);
+ Math_ApproachZeroF(&scale, this->unk2F4, 0.005f);
+ Math_ApproachF(&this->unk2F0, 0.8f, 0.1f, 0.02f);
+ Math_ApproachF(&this->unk2F4, 0.2f, 0.03f, 0.05f);
+
+ this->actor.shape.rot.y += this->unk2F8;
+ if (this->unk2F8 < 0x1770) {
+ this->unk2F8 += 0x12C;
+ }
+
+ BgDyYoseizo_SpawnEffects(this, GREAT_FAIRY_EFFECT_TRAJECTORY_RADIANT, 2);
+ Actor_SetScale(&this->actor, scale);
+ }
+}
+
+void func_80A0AFDC(BgDyYoseizo* this) {
+ Animation_Change(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_SPIN_LAY_DOWN], 0.0f, 46.0f,
+ Animation_GetLastFrame(sAnimations[GREATFAIRY_ANIM_SPIN_LAY_DOWN]), ANIMMODE_ONCE, 0.0f);
+ this->actionFunc = func_80A0AE1C;
+ Actor_PlaySfx(&this->actor, NA_SE_VO_FR_LAUGH_0);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_GREAT_FAIRY_VANISH);
+ this->unk2F8 = 0;
+ this->actor.velocity.y = 0.0f;
+ this->unk2F0 = 0.0f;
+ this->unk2F4 = 0.0f;
+ this->actor.shape.yOffset = 0.0f;
+}
+
+void func_80A0B078(BgDyYoseizo* this, PlayState* play) {
+ BgDyYoseizo_Bob(this, play);
+ SkelAnime_Update(&this->skelAnime);
+
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)]->id == 7)) {
+ Animation_Change(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_LAYING_DOWN], 1.0f, 0.0f,
+ Animation_GetLastFrame(sAnimations[GREATFAIRY_ANIM_LAYING_DOWN]), ANIMMODE_LOOP, 0.0f);
+ this->actionFunc = func_80A0B184;
+ } else if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)]->id == 6)) {
+ func_80A0AFDC(this);
+ }
+}
+
+void func_80A0B184(BgDyYoseizo* this, PlayState* play) {
+ BgDyYoseizo_Bob(this, play);
+ SkelAnime_Update(&this->skelAnime);
+
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)]->id == 8)) {
+ Animation_Change(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_SHOWING_ITEM], 1.0f, 0.0f,
+ Animation_GetLastFrame(sAnimations[GREATFAIRY_ANIM_SHOWING_ITEM]), ANIMMODE_LOOP, 0.0f);
+ this->actionFunc = func_80A0B078;
+ } else if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)]->id == 6)) {
+ func_80A0AFDC(this);
+ }
+}
+
+void func_80A0B290(BgDyYoseizo* this, PlayState* play) {
+ BgDyYoseizo_Bob(this, play);
+ SkelAnime_Update(&this->skelAnime);
+
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)]->id == 7)) {
+ Animation_Change(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_LAYING_DOWN], 1.0f, 0.0f,
+ Animation_GetLastFrame(sAnimations[GREATFAIRY_ANIM_LAYING_DOWN]), ANIMMODE_LOOP, -10.0f);
+ this->actionFunc = func_80A0B184;
+ this->mouthIndex = 0;
+ }
+}
+
+void func_80A0B35C(BgDyYoseizo* this, PlayState* play) {
+ BgDyYoseizo_Bob(this, play);
+ SkelAnime_Update(&this->skelAnime);
+
+ if (this->timer == 60) {
+ if (!Flags_GetSwitch(play, GREAT_FAIRY_GET_SWITCHFLAG(&this->actor))) {
+ switch (GREAT_FAIRY_GET_TYPE(&this->actor)) {
+ case GREAT_FAIRY_TYPE_MAGIC:
+ if (gSaveContext.save.saveInfo.playerData.isMagicAcquired != true) {
+ gSaveContext.save.saveInfo.playerData.isMagicAcquired = true;
+ gSaveContext.magicFillTarget = MAGIC_NORMAL_METER;
+ }
+ break;
+
+ case GREAT_FAIRY_TYPE_WISDOM:
+ if (gSaveContext.save.saveInfo.playerData.isDoubleMagicAcquired != true) {
+ gSaveContext.save.saveInfo.playerData.isDoubleMagicAcquired = true;
+ gSaveContext.magicFillTarget = MAGIC_DOUBLE_METER;
+ gSaveContext.save.saveInfo.playerData.magicLevel = 0;
+ }
+ break;
+
+ case GREAT_FAIRY_TYPE_COURAGE:
+ if (gSaveContext.save.saveInfo.playerData.doubleDefense != true) {
+ gSaveContext.save.saveInfo.playerData.doubleDefense = true;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ Interface_SetHudVisibility(9);
+ }
+
+ if ((this->timer < 50) && (GREAT_FAIRY_GET_TYPE(&this->actor) == GREAT_FAIRY_TYPE_COURAGE)) {
+ if (gSaveContext.save.saveInfo.inventory.defenseHearts < 20) {
+ gSaveContext.save.saveInfo.inventory.defenseHearts++;
+ }
+ }
+
+ if (this->timer == 50) {
+ gSaveContext.healthAccumulator = 0x140;
+ Magic_Add(play, MAGIC_FILL_TO_CAPACITY);
+ }
+
+ if (this->timer == 0) {
+ this->beam->trigger = true;
+ this->actionFunc = func_80A0B290;
+ }
+}
+
+void func_80A0B500(BgDyYoseizo* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+
+ BgDyYoseizo_Bob(this, play);
+
+ if (SkelAnime_Update(&this->skelAnime)) {
+ Vec3f pos;
+
+ Animation_Change(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_GIVING_UPGRADE], 1.0f, 0.0f,
+ Animation_GetLastFrame(sAnimations[GREATFAIRY_ANIM_GIVING_UPGRADE]), ANIMMODE_LOOP, 0.0f);
+ this->actionFunc = func_80A0B35C;
+ pos.x = player->actor.world.pos.x;
+ pos.y = player->actor.world.pos.y + 200.0f;
+ pos.z = player->actor.world.pos.z;
+ this->beam = (EnDyExtra*)Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_DY_EXTRA, pos.x,
+ pos.y, pos.z, 0, 0, 0, GREAT_FAIRY_GET_TYPE(&this->actor));
+ this->timer = 120;
+ }
+}
+
+void func_80A0B5F0(BgDyYoseizo* this, PlayState* play) {
+ BgDyYoseizo_Bob(this, play);
+
+ if (SkelAnime_Update(&this->skelAnime)) {
+ Animation_Change(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_LAYING_DOWN], 1.0f, 0.0f,
+ Animation_GetLastFrame(sAnimations[GREATFAIRY_ANIM_LAYING_DOWN]), ANIMMODE_LOOP, 0.0f);
+ }
+
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)]->id == 5)) {
+ Animation_Change(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_START_GIVING_UPGRADE], 1.0f, 0.0f,
+ Animation_GetLastFrame(sAnimations[GREATFAIRY_ANIM_START_GIVING_UPGRADE]), ANIMMODE_ONCE,
+ -5.0f);
+ Actor_PlaySfx(&this->actor, NA_SE_VO_FR_SMILE_0);
+ this->mouthIndex = 1;
+ this->eyeIndex = 0;
+ this->actionFunc = func_80A0B500;
+ }
+
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)]->id == 6)) {
+ func_80A0AFDC(this);
+ }
+
+ BgDyYoseizo_UpdateEyes(this);
+}
+
+void func_80A0B75C(BgDyYoseizo* this, PlayState* play) {
+ func_80A0AD50(this);
+ SkelAnime_Update(&this->skelAnime);
+
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)]->id == 4)) {
+ this->actor.shape.rot.y = 0;
+ this->actionFunc = func_80A0B5F0;
+ Animation_Change(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_LAY_DOWN_TRANSITION], 1.0f, 2.0f,
+ Animation_GetLastFrame(sAnimations[GREATFAIRY_ANIM_LAY_DOWN_TRANSITION]), ANIMMODE_ONCE, 0.0f);
+ Actor_PlaySfx(&this->actor, NA_SE_VO_FR_SMILE_0);
+ this->unk2F8 = 0;
+ }
+}
+
+void func_80A0B834(BgDyYoseizo* this) {
+ this->actor.draw = BgDyYoseizo_Draw;
+ Animation_Change(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_SPIN_LAY_DOWN], 1.0f, 0.0f,
+ Animation_GetLastFrame(sAnimations[GREATFAIRY_ANIM_SPIN_LAY_DOWN]), ANIMMODE_ONCE, 0.0f);
+ Actor_PlaySfx(&this->actor, NA_SE_VO_FR_LAUGH_0);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_GREAT_FAIRY_APPEAR);
+ BgDyYoseizo_SpawnEffects(this, GREAT_FAIRY_EFFECT_TRAJECTORY_FAST_RADIANT, 30);
+}
+
+void BgDyYoseizo_TrainPlayer(BgDyYoseizo* this, PlayState* play) {
+ s16 csId;
+ s32 pad;
+ Player* player = GET_PLAYER(play);
+
+ SkelAnime_Update(&this->skelAnime);
+
+ csId = 0;
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103)) {
+ csId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)]->id;
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103));
+ } else {
+ if (GREAT_FAIRY_ROTZ(&this->actor) != 0) {
+ this->actor.home.pos.x = player->actor.world.pos.x;
+ this->actor.home.pos.z = player->actor.world.pos.z;
+ GREAT_FAIRY_ROTZ(&this->actor) = 0;
+ } else {
+ player->actor.world.pos.x = this->actor.home.pos.x;
+ player->actor.world.pos.z = this->actor.home.pos.z;
+ }
+
+ if (this->unk302 & 1) {
+ if (this->timer == 0) {
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
+ this->unk302 &= ~1;
+ } else {
+ CutsceneManager_Queue(this->actor.csId);
+ }
+ }
+ } else if (!(this->unk302 & 2) && (player->meleeWeaponState != 0)) {
+ if (player->meleeWeaponAnimation >= PLAYER_MWA_SPIN_ATTACK_1H) {
+ if (player->unk_B08 >= 0.85f) {
+ this->unk302 |= 1;
+ this->unk302 |= 2;
+ if (play->msgCtx.currentTextId == 0x59A) {
+ Message_CloseTextbox(play);
+ }
+ this->timer = 20;
+ return;
+ }
+ }
+
+ if (play->msgCtx.currentTextId != 0x59A) {
+ // "Hold B and then release"
+ Message_StartTextbox(play, 0x59A, &this->actor);
+ }
+ }
+ }
+
+ if (csId != this->csId) {
+ switch (csId) {
+ case 9:
+ Animation_PlayLoop(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_ARMS_FOLDED]);
+ break;
+
+ case 10:
+ Animation_PlayLoop(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_CLAPPING]);
+ break;
+
+ case 11:
+ Animation_PlayOnce(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_TEACH_SPIN_ATTACK]);
+ break;
+
+ default:
+ break;
+ }
+
+ this->csId = csId;
+ }
+}
+
+// Choose behaviour?
+void func_80A0BB08(BgDyYoseizo* this, PlayState* play) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)]->id == 2)) {
+ func_80A0B834(this);
+ this->actionFunc = func_80A0B75C;
+ }
+
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)]->id == 7)) {
+ this->actor.draw = BgDyYoseizo_Draw;
+ Animation_PlayLoop(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_LAYING_DOWN]);
+ this->actionFunc = func_80A0B184;
+ this->mouthIndex = 0;
+ this->actor.world.pos.y = this->actor.home.pos.y + 40.0f;
+ Actor_SetScale(&this->actor, 0.035f);
+ this->unk2F8 = 0;
+ }
+
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_103)]->id == 9)) {
+ Actor_SetScale(&this->actor, 0.01f);
+ Animation_PlayLoop(&this->skelAnime, sAnimations[GREATFAIRY_ANIM_ARMS_FOLDED]);
+ this->csId = 9;
+ this->actionFunc = BgDyYoseizo_TrainPlayer;
+ this->actor.draw = BgDyYoseizo_Draw;
+ }
+}
+
+void BgDyYoseizo_Update(Actor* thisx, PlayState* play) {
+ BgDyYoseizo* this = THIS;
+
+ this->actionFunc(this, play);
+ Actor_MoveWithGravity(&this->actor);
+
+ DECR(this->timer);
+
+ BgDyYoseizo_UpdateEffects(this, play);
+}
+
+s32 BgDyYoseizo_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
+ BgDyYoseizo* this = THIS;
+
+ if (limbIndex == GREAT_FAIRY_LIMB_TORSO) {
+ rot->x += this->torsoRot.y;
+ }
+
+ if (limbIndex == GREAT_FAIRY_LIMB_HEAD) {
+ rot->x += this->headRot.y;
+ rot->z += this->headRot.z;
+ }
+
+ return false;
+}
+
+/* Colour and shape of eyebrows, hair colour. */
+typedef enum GreatFairyAppearance {
+ /* 0 */ GREAT_FAIRY_APPEARANCE_MAGIC, // Orange
+ /* 1 */ GREAT_FAIRY_APPEARANCE_WISDOM, // Green
+ /* 2 */ GREAT_FAIRY_APPEARANCE_POWER, // Pink
+ /* 3 */ GREAT_FAIRY_APPEARANCE_COURAGE, // Purple
+ /* 4 */ GREAT_FAIRY_APPEARANCE_KINDNESS // Yellow
+} GreatFairyAppearance;
+
+void BgDyYoseizo_Draw(Actor* thisx, PlayState* play) {
+ static TexturePtr sMouthTextures[] = {
+ gGreatFairyMouthClosedTex,
+ gGreatFairyMouthOpenTex,
+ };
+ BgDyYoseizo* this = THIS;
+ GreatFairyAppearance appearance = GREAT_FAIRY_APPEARANCE_MAGIC;
+
+ // The differing eyes and hair colours
+ switch (GREAT_FAIRY_GET_TYPE(&this->actor)) {
+ case GREAT_FAIRY_TYPE_POWER:
+ appearance = GREAT_FAIRY_APPEARANCE_POWER;
+ break;
+
+ case GREAT_FAIRY_TYPE_WISDOM:
+ appearance = GREAT_FAIRY_APPEARANCE_WISDOM;
+ break;
+
+ case GREAT_FAIRY_TYPE_COURAGE:
+ case GREAT_FAIRY_TYPE_KINDNESS:
+ appearance = GREAT_FAIRY_GET_TYPE(&this->actor);
+ break;
+
+ default: // GREAT_FAIRY_APPEARANCE_MAGIC
+ break;
+ }
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+
+ // Set eyes and hair colour, not actually animated.
+ AnimatedMat_DrawStepOpa(play, Lib_SegmentedToVirtual(gGreatFairyAppearenceTexAnim), appearance);
+
+ // Draw mouth
+ {
+ Gfx* gfx = POLY_OPA_DISP;
+ s16 index = this->mouthIndex;
+ TexturePtr mouthTex = Lib_SegmentedToVirtual(sMouthTextures[index]);
+
+ gSPSegment(&gfx[0], 0x09, mouthTex);
+ POLY_OPA_DISP = &gfx[1];
+ }
+
+ SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
+ BgDyYoseizo_OverrideLimbDraw, NULL, &this->actor);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+
+ BgDyYoseizo_DrawEffects(this, play);
+}
+
+/* Effects functions */
+
+void BgDyYoseizo_SpawnEffect(BgDyYoseizo* this, Vec3f* initPos, Vec3f* initVelocity, Vec3f* accel,
+ Color_RGB8* primColor, Color_RGB8* envColor, f32 scale, s16 life, s16 type) {
+ BgDyYoseizoEffect* effect = this->effects;
+ s16 i;
+
+ for (i = 0; i < BG_DY_YOSEIZO_EFFECT_COUNT; i++, effect++) {
+ if (!effect->alive) {
+ effect->alive = true;
+ effect->pos = *initPos;
+ effect->velocity = *initVelocity;
+ effect->accel = *accel;
+ effect->primColor = *primColor;
+ effect->alpha = 0;
+ effect->envColor = *envColor;
+ effect->scale = scale;
+ effect->timer = life;
+ effect->type = type;
+ effect->pitch = 0;
+ effect->yaw = TRUNCF_BINANG(Rand_CenteredFloat(30000.0f));
+ effect->roll = 0;
+ return;
+ }
+ }
+}
+
+void BgDyYoseizo_UpdateEffects(BgDyYoseizo* this, PlayState* play) {
+ BgDyYoseizoEffect* effect = this->effects;
+ Player* player = GET_PLAYER(play);
+ Vec3f sp94;
+ Vec3f sp88;
+ s32 pad[2];
+ f32 targetPitch;
+ f32 targetYaw;
+ f32 floatAngle;
+ s16 i = 0;
+
+ for (i = 0; i < BG_DY_YOSEIZO_EFFECT_COUNT; i++, effect++) {
+ if (effect->alive) {
+ effect->roll += 3000;
+
+ if (effect->type < GREAT_FAIRY_EFFECT_TRAJECTORY_CONVERGE_ON_PLAYER) {
+ effect->pos.x += effect->velocity.x;
+ effect->pos.y += effect->velocity.y;
+ effect->pos.z += effect->velocity.z;
+ effect->velocity.x += effect->accel.x;
+ effect->velocity.y += effect->accel.y;
+ effect->velocity.z += effect->accel.z;
+ } else {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_HEALING - SFX_FLAG);
+
+ sp94 = player->actor.world.pos;
+ sp94.y = player->actor.world.pos.y - 150.0f;
+ sp94.z = player->actor.world.pos.z - 50.0f;
+
+ targetPitch = Math_Vec3f_Pitch(&effect->pos, &sp94);
+ targetYaw = Math_Vec3f_Yaw(&effect->pos, &sp94);
+
+ floatAngle = effect->pitch;
+ Math_ApproachF(&floatAngle, targetPitch, 0.9f, 5000.0f);
+ effect->pitch = floatAngle;
+
+ floatAngle = effect->yaw;
+ Math_ApproachF(&floatAngle, targetYaw, 0.9f, 5000.0f);
+ effect->yaw = floatAngle;
+
+ Matrix_Push();
+ Matrix_RotateYS(effect->yaw, MTXMODE_NEW);
+ Matrix_RotateXS(effect->pitch, MTXMODE_APPLY);
+
+ sp94.x = sp94.y = sp94.z = 3.0f;
+
+ Matrix_MultVec3f(&sp94, &sp88);
+ Matrix_Pop();
+ effect->pos.x += sp88.x;
+ effect->pos.y += sp88.y;
+ effect->pos.z += sp88.z;
+ }
+ }
+
+ // fade up, fade down, vanish and reset
+ if (effect->timer != 0) {
+ effect->timer--;
+ effect->alpha += 30;
+
+ if (effect->alpha > 255) {
+ effect->alpha = 255;
+ }
+ } else {
+ effect->alpha -= 30;
+
+ if (effect->alpha <= 0) {
+ effect->alpha = 0;
+ effect->alive = false;
+ }
+ }
+ }
+}
+
+void BgDyYoseizo_DrawEffects(BgDyYoseizo* this, PlayState* play) {
+ static f32 sStretchFactors[] = {
+ 1.0f, 1.1f, 1.15f, 1.1f, 1.0f, 0.9f, 0.85f, 0.9f,
+ };
+ GraphicsContext* gfxCtx = play->state.gfxCtx;
+ u8 setup = 0;
+ BgDyYoseizoEffect* effect = this->effects;
+ f32 stretchFactor = sStretchFactors[play->gameplayFrames % ARRAY_COUNT(sStretchFactors)];
+ s16 i;
+
+ OPEN_DISPS(gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+
+ for (i = 0; i < BG_DY_YOSEIZO_EFFECT_COUNT; i++, effect++) {
+ if (effect->alive == true) {
+ if (setup == 0) {
+ gSPDisplayList(POLY_XLU_DISP++, gGreatFairyParticleSetupDL);
+ gDPPipeSync(POLY_XLU_DISP++);
+ setup++;
+ }
+
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, effect->primColor.r, effect->primColor.g, effect->primColor.b,
+ effect->alpha);
+ gDPSetEnvColor(POLY_XLU_DISP++, effect->envColor.r, effect->envColor.g, effect->envColor.b, 0);
+
+ Matrix_Translate(effect->pos.x, effect->pos.y, effect->pos.z, MTXMODE_NEW);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+
+ Matrix_Scale(effect->scale, effect->scale * stretchFactor, 1.0f, MTXMODE_APPLY);
+ Matrix_RotateZS(effect->roll, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gGreatFairyParticleDL);
+ }
+ }
+
+ CLOSE_DISPS(gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.h b/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.h
index bd06cdb38..4aaf67e77 100644
--- a/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.h
+++ b/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.h
@@ -2,15 +2,65 @@
#define Z_BG_DY_YOSEIZO_H
#include "global.h"
+#include "overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.h"
+#include "objects/object_dy_obj/object_dy_obj.h"
struct BgDyYoseizo;
typedef void (*BgDyYoseizoActionFunc)(struct BgDyYoseizo*, PlayState*);
+#define GREAT_FAIRY_GET_SWITCHFLAG(thisx) (((thisx)->params & 0xFE00) >> 9)
+#define GREAT_FAIRY_GET_TYPE(thisx) ((thisx)->params & 0xF)
+#define GREAT_FAIRY_ROTZ(thisx) ((thisx)->home.rot.z)
+
+typedef enum GreatFairyType {
+ /* 0 */ GREAT_FAIRY_TYPE_MAGIC,
+ /* 1 */ GREAT_FAIRY_TYPE_POWER,
+ /* 2 */ GREAT_FAIRY_TYPE_WISDOM,
+ /* 3 */ GREAT_FAIRY_TYPE_COURAGE,
+ /* 4 */ GREAT_FAIRY_TYPE_KINDNESS
+} GreatFairyType;
+
+#define BG_DY_YOSEIZO_EFFECT_COUNT 200
+
+typedef struct BgDyYoseizoEffect {
+ /* 0x00 */ u8 alive; // drawn if 1, respawn if 0
+ /* 0x04 */ Vec3f pos;
+ /* 0x10 */ Vec3f velocity;
+ /* 0x1C */ Vec3f accel;
+ /* 0x28 */ Color_RGB8 primColor;
+ /* 0x2B */ Color_RGB8 envColor;
+ /* 0x2E */ s16 alpha;
+ /* 0x30 */ f32 scale;
+ /* 0x34 */ s16 timer; // lifetime
+ /* 0x36 */ s16 type; // 0 is general radiance, else is directed towards Player
+ /* 0x38 */ s16 pitch;
+ /* 0x3A */ s16 yaw;
+ /* 0x3C */ s16 roll; // all three are f32 in OoT
+} BgDyYoseizoEffect; // size = 0x40
+
typedef struct BgDyYoseizo {
/* 0x0000 */ Actor actor;
/* 0x0144 */ BgDyYoseizoActionFunc actionFunc;
- /* 0x0148 */ char unk_148[0x33BC];
+ /* 0x0148 */ SkelAnime skelAnime;
+ /* 0x018C */ Vec3s jointTable[GREAT_FAIRY_LIMB_MAX];
+ /* 0x0234 */ Vec3s morphTable[GREAT_FAIRY_LIMB_MAX];
+ /* 0x02DC */ Vec3s headRot;
+ /* 0x02DC */ Vec3s torsoRot;
+ /* 0x02E8 */ EnDyExtra* beam;
+ /* 0x02EC */ f32 unk2EC; // unused
+ /* 0x02F0 */ f32 unk2F0;
+ /* 0x02F4 */ f32 unk2F4;
+ /* 0x02F8 */ union {
+ s16 unk2F8;
+ s16 csId; // used on BgDyYoseizo_TrainPlayer
+ };
+ /* 0x02FA */ s16 eyeIndex;
+ /* 0x02FC */ s16 mouthIndex;
+ /* 0x02FE */ s16 blinkTimer;
+ /* 0x0300 */ s16 timer;
+ /* 0x0302 */ u16 unk302;
+ /* 0x0304 */ BgDyYoseizoEffect effects[BG_DY_YOSEIZO_EFFECT_COUNT];
} BgDyYoseizo; // size = 0x3504
#endif // Z_BG_DY_YOSEIZO_H
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 71aa958dc..db4a1105a 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;
@@ -148,7 +148,7 @@ s32 func_80BC3B00(BgF40Block* this) {
}
}
- if (Math_Vec3f_StepTo(&this->dyna.actor.world.pos, &sp28, this->dyna.actor.speedXZ) <= 0.0f) {
+ if (Math_Vec3f_StepTo(&this->dyna.actor.world.pos, &sp28, this->dyna.actor.speed) <= 0.0f) {
this->unk_168 = 6;
this->unk_160 = this->unk_164;
return true;
@@ -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;
}
@@ -182,26 +182,26 @@ s32 func_80BC3D08(BgF40Block* this, PlayState* play, s32 arg2) {
if (arg2 != 0) {
sp48.x =
- (D_80BC4620[this->unk_168].x * ((800.0f * this->dyna.actor.scale.x) - (this->dyna.actor.speedXZ * 0.5f))) +
+ (D_80BC4620[this->unk_168].x * ((800.0f * this->dyna.actor.scale.x) - (this->dyna.actor.speed * 0.5f))) +
this->dyna.actor.world.pos.x;
sp48.y =
- (D_80BC4620[this->unk_168].y * ((800.0f * this->dyna.actor.scale.y) - (this->dyna.actor.speedXZ * 0.5f))) +
+ (D_80BC4620[this->unk_168].y * ((800.0f * this->dyna.actor.scale.y) - (this->dyna.actor.speed * 0.5f))) +
this->dyna.actor.world.pos.y;
sp48.z =
- (D_80BC4620[this->unk_168].z * ((800.0f * this->dyna.actor.scale.z) - (this->dyna.actor.speedXZ * 0.5f))) +
+ (D_80BC4620[this->unk_168].z * ((800.0f * this->dyna.actor.scale.z) - (this->dyna.actor.speed * 0.5f))) +
this->dyna.actor.world.pos.z;
- sp3C.x = (D_80BC4620[this->unk_168].x * this->dyna.actor.speedXZ) + sp48.x;
- sp3C.y = (D_80BC4620[this->unk_168].y * this->dyna.actor.speedXZ) + sp48.y;
- sp3C.z = (D_80BC4620[this->unk_168].z * this->dyna.actor.speedXZ) + sp48.z;
+ sp3C.x = (D_80BC4620[this->unk_168].x * this->dyna.actor.speed) + sp48.x;
+ sp3C.y = (D_80BC4620[this->unk_168].y * this->dyna.actor.speed) + sp48.y;
+ sp3C.z = (D_80BC4620[this->unk_168].z * this->dyna.actor.speed) + sp48.z;
} else {
sp3C.x = (D_80BC4620[this->unk_168].x * 800.0f * this->dyna.actor.scale.x) + this->dyna.actor.world.pos.x;
sp3C.y = (D_80BC4620[this->unk_168].y * 800.0f * this->dyna.actor.scale.y) + this->dyna.actor.world.pos.y;
sp3C.z = (D_80BC4620[this->unk_168].z * 800.0f * this->dyna.actor.scale.z) + this->dyna.actor.world.pos.z;
- sp48.x = sp3C.x - (D_80BC4620[this->unk_168].x * this->dyna.actor.speedXZ * 1.5f);
- sp48.y = sp3C.y - (D_80BC4620[this->unk_168].y * this->dyna.actor.speedXZ * 1.5f);
- sp48.z = sp3C.z - (D_80BC4620[this->unk_168].z * this->dyna.actor.speedXZ * 1.5f);
+ sp48.x = sp3C.x - (D_80BC4620[this->unk_168].x * this->dyna.actor.speed * 1.5f);
+ sp48.y = sp3C.y - (D_80BC4620[this->unk_168].y * this->dyna.actor.speed * 1.5f);
+ sp48.z = sp3C.z - (D_80BC4620[this->unk_168].z * this->dyna.actor.speed * 1.5f);
}
if (BgCheck_AnyLineTest1(&play->colCtx, &sp48, &sp3C, &sp30, &sp54, true)) {
@@ -228,23 +228,23 @@ 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;
}
if (this->path != NULL) {
- if (Flags_GetSwitch(play, BGF40BLOCK_GET_SWITCHFLAG(&this->dyna.actor))) {
+ if (Flags_GetSwitch(play, BGF40BLOCK_GET_SWITCH_FLAG(&this->dyna.actor))) {
this->actionFunc = func_80BC4530;
- this->dyna.actor.speedXZ = 40.0f;
+ this->dyna.actor.speed = 40.0f;
func_80BC3A2C(this, play);
} else {
this->actionFunc = func_80BC4380;
- this->dyna.actor.speedXZ = 20.0f;
+ this->dyna.actor.speed = 20.0f;
func_80BC3980(this, play);
}
} else {
@@ -261,7 +261,7 @@ void BgF40Block_Destroy(Actor* thisx, PlayState* play) {
void func_80BC41AC(BgF40Block* this, PlayState* play) {
if (func_80BC3D08(this, play, 1)) {
- if (!Flags_GetSwitch(play, BGF40BLOCK_GET_SWITCHFLAG(&this->dyna.actor))) {
+ if (!Flags_GetSwitch(play, BGF40BLOCK_GET_SWITCH_FLAG(&this->dyna.actor))) {
func_80BC4038(this);
this->actionFunc = func_80BC44F4;
}
@@ -272,37 +272,37 @@ void func_80BC41AC(BgF40Block* this, PlayState* play) {
void func_80BC4228(BgF40Block* this, PlayState* play) {
if (func_80BC3B00(this)) {
- this->dyna.actor.speedXZ = 20.0f;
+ this->dyna.actor.speed = 20.0f;
if (this->unk_160 < (this->path->count - 1)) {
this->unk_164 = this->unk_160 + 1;
} else {
this->actionFunc = func_80BC4530;
- ActorCutscene_Stop(this->dyna.actor.cutscene);
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_IKANA_BLOCK_STOP_C);
+ 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_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_IKANA_BLOCK_STOP_F);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_IKANA_BLOCK_STOP_F);
return;
}
switch (this->unk_168) {
case 0:
case 3:
- func_800B9010(&this->dyna.actor, NA_SE_EV_IKANA_BLOCK_MOVE_X - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_IKANA_BLOCK_MOVE_X - SFX_FLAG);
break;
case 1:
case 4:
- func_800B9010(&this->dyna.actor, NA_SE_EV_IKANA_BLOCK_MOVE_Y - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_IKANA_BLOCK_MOVE_Y - SFX_FLAG);
break;
case 2:
case 5:
- func_800B9010(&this->dyna.actor, NA_SE_EV_IKANA_BLOCK_MOVE_Z - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_IKANA_BLOCK_MOVE_Z - SFX_FLAG);
break;
}
}
@@ -314,14 +314,14 @@ void func_80BC4344(BgF40Block* this, PlayState* play) {
}
void func_80BC4380(BgF40Block* this, PlayState* play) {
- if (Flags_GetSwitch(play, BGF40BLOCK_GET_SWITCHFLAG(&this->dyna.actor))) {
+ if (Flags_GetSwitch(play, BGF40BLOCK_GET_SWITCH_FLAG(&this->dyna.actor))) {
this->actionFunc = func_80BC4344;
}
}
void func_80BC43CC(BgF40Block* this, PlayState* play) {
if (func_80BC3D08(this, play, 1)) {
- if (Flags_GetSwitch(play, BGF40BLOCK_GET_SWITCHFLAG(&this->dyna.actor))) {
+ if (Flags_GetSwitch(play, BGF40BLOCK_GET_SWITCH_FLAG(&this->dyna.actor))) {
func_80BC4038(this);
this->actionFunc = func_80BC4344;
}
@@ -332,20 +332,20 @@ void func_80BC43CC(BgF40Block* this, PlayState* play) {
void func_80BC4448(BgF40Block* this, PlayState* play) {
if (func_80BC3B00(this)) {
- this->dyna.actor.speedXZ = 40.0f;
+ this->dyna.actor.speed = 40.0f;
if (this->unk_160 > 0) {
this->unk_164 = this->unk_160 - 1;
} else {
this->actionFunc = func_80BC4380;
- ActorCutscene_Stop(this->dyna.actor.cutscene);
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_IKANA_BLOCK_STOP_C);
+ 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_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_IKANA_BLOCK_STOP_F);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_IKANA_BLOCK_STOP_F);
}
}
@@ -356,7 +356,7 @@ void func_80BC44F4(BgF40Block* this, PlayState* play) {
}
void func_80BC4530(BgF40Block* this, PlayState* play) {
- if (!Flags_GetSwitch(play, BGF40BLOCK_GET_SWITCHFLAG(&this->dyna.actor))) {
+ if (!Flags_GetSwitch(play, BGF40BLOCK_GET_SWITCH_FLAG(&this->dyna.actor))) {
this->actionFunc = func_80BC44F4;
}
}
@@ -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..f74dc754a 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,8 +7,10 @@ struct BgF40Block;
typedef void (*BgF40BlockActionFunc)(struct BgF40Block*, PlayState*);
-#define BGF40BLOCK_GET_PATH(thisx) (((thisx)->params & 0x1FC) >> 2)
-#define BGF40BLOCK_GET_SWITCHFLAG(thisx) (((thisx)->params & 0xFE00) >> 9)
+#define BGF40BLOCK_GET_PATH_INDEX(thisx) (((thisx)->params & 0x1FC) >> 2)
+#define BGF40BLOCK_GET_SWITCH_FLAG(thisx) (((thisx)->params & 0xFE00) >> 9)
+
+#define BGF40BLOCK_PATH_INDEX_NONE 0x3F
typedef struct BgF40Block {
/* 0x000 */ DynaPolyActor dyna;
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 3a7916e7d..9e4f9a590 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,31 +53,30 @@ 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.
actorAsSwitch->isPressed = isPressed;
}
if (actorAsSwitch->isPressed) {
- switchFlag = BGF40SWITCH_GET_SWITCHFLAG(&actorAsSwitch->dyna.actor);
- if (switchFlag >= 0 && switchFlag < 0x80) {
+ switchFlag = BGF40SWITCH_GET_SWITCH_FLAG(&actorAsSwitch->dyna.actor);
+ 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) {
- switchFlag = BGF40SWITCH_GET_SWITCHFLAG(actor);
- if (switchFlag >= 0 && switchFlag < 0x80 && Flags_GetSwitch(play, switchFlag) &&
+ if ((actor->id == ACTOR_BG_F40_SWITCH) && (actor->room == this->dyna.actor.room) &&
+ (actor->update != NULL)) {
+ switchFlag = BGF40SWITCH_GET_SWITCH_FLAG(actor);
+ 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;
@@ -129,7 +129,7 @@ void BgF40Switch_Destroy(Actor* thisx, PlayState* play) {
void BgF40Switch_Unpress(BgF40Switch* this, PlayState* play) {
this->dyna.actor.scale.y += 0.0495f;
if (this->dyna.actor.scale.y >= 0.165f) {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_IKANA_BLOCK_SWITCH);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_IKANA_BLOCK_SWITCH);
this->actionFunc = BgF40Switch_IdleUnpressed;
this->dyna.actor.scale.y = 0.165f;
}
@@ -144,10 +144,10 @@ void BgF40Switch_IdlePressed(BgF40Switch* this, PlayState* play) {
void BgF40Switch_Press(BgF40Switch* this, PlayState* play) {
this->dyna.actor.scale.y -= 0.0495f;
if (this->dyna.actor.scale.y <= 0.0165f) {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_IKANA_BLOCK_SWITCH);
+ 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));
+ Flags_SetSwitch(play, BGF40SWITCH_GET_SWITCH_FLAG(&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));
+ Flags_SetSwitch(play, BGF40SWITCH_GET_SWITCH_FLAG(&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_Switch/z_bg_f40_switch.h b/src/overlays/actors/ovl_Bg_F40_Switch/z_bg_f40_switch.h
index cfa8c5462..2d9fc589b 100644
--- a/src/overlays/actors/ovl_Bg_F40_Switch/z_bg_f40_switch.h
+++ b/src/overlays/actors/ovl_Bg_F40_Switch/z_bg_f40_switch.h
@@ -5,7 +5,7 @@
struct BgF40Switch;
-#define BGF40SWITCH_GET_SWITCHFLAG(thisx) (((thisx)->params & 0xFE00) >> 9)
+#define BGF40SWITCH_GET_SWITCH_FLAG(thisx) (((thisx)->params & 0xFE00) >> 9)
typedef void (*BgF40SwitchActionFunc)(struct BgF40Switch*, PlayState*);
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..9b210c1b8 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_SWITCH_FLAG(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..e2931698e 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_SWITCH_FLAG(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..86edcbee6 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
@@ -182,7 +182,7 @@ void BgFireWall_Update(Actor* thisx, PlayState* play2) {
}
}
if (this->actionFunc == func_809AC6C0) {
- func_800B9010(&this->actor, NA_SE_EV_FIRE_PLATE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_FIRE_PLATE - SFX_FLAG);
if ((this->unk_14C == 0) || ((this->unk_14C != 0) && (this->actor.xzDistToPlayer < 240.0f))) {
func_809AC7F8(this, play);
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
@@ -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..ecfe2c910 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);
@@ -56,7 +56,7 @@ void BgFuKaiten_UpdateRotation(BgFuKaiten* this) {
this->dyna.actor.shape.rot.y += this->rotationSpeed;
if (this->rotationSpeed > 0) {
f0 = this->rotationSpeed * 0.002f;
- func_8019FAD8(&this->dyna.actor.projectedPos, NA_SE_EV_WOOD_GEAR - SFX_FLAG, f0);
+ Audio_PlaySfx_AtPosWithFreq(&this->dyna.actor.projectedPos, NA_SE_EV_WOOD_GEAR - SFX_FLAG, f0);
}
}
@@ -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..3da89164d 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;
@@ -75,9 +75,9 @@ void BgFuMizu_Update(Actor* thisx, PlayState* play) {
}
if (Math_SmoothStepToF(&this->dyna.actor.world.pos.y, heightTarget, 0.05f, 1.0f, 0.5f) > 1.0f) {
if (this->unk_160 == 1) {
- func_800B9010(&this->dyna.actor, NA_SE_EV_WATER_LEVEL_DOWN_FIX - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_WATER_LEVEL_DOWN_FIX - SFX_FLAG);
} else {
- func_800B9010(&this->dyna.actor, NA_SE_EV_WATER_LEVEL_DOWN_FIX - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_WATER_LEVEL_DOWN_FIX - SFX_FLAG);
}
}
}
@@ -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 cfd9003ec..27023756b 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,12 +69,12 @@ 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);
}
- Audio_PlaySfxAtPos(&D_80B40780, NA_SE_EV_WATER_LEVEL_DOWN - SFX_FLAG);
+ Audio_PlaySfx_AtPos(&D_80B40780, NA_SE_EV_WATER_LEVEL_DOWN - SFX_FLAG);
}
void func_80B401F8(BgGoronOyu* this, PlayState* play) {
@@ -91,8 +91,8 @@ void func_80B401F8(BgGoronOyu* this, PlayState* play) {
if (dist.x >= 0.0f && dist.x <= this->waterBoxXLength && dist.z >= 0.0f && dist.z <= this->waterBoxZLength &&
fabsf(dist.y) < 100.0f && player->actor.depthInWater > 12.0f) {
- Actor_PickUp(&this->dyna.actor, play, GI_MAX, this->dyna.actor.xzDistToPlayer,
- fabsf(this->dyna.actor.playerHeightRel));
+ Actor_OfferGetItem(&this->dyna.actor, play, GI_MAX, this->dyna.actor.xzDistToPlayer,
+ fabsf(this->dyna.actor.playerHeightRel));
}
}
@@ -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..a9e70027c 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
@@ -160,14 +160,15 @@ void BgHakaBombwall_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
DynaPolyActor_Init(&this->dyna, 0);
Collider_InitCylinder(play, &this->collider);
- if (Flags_GetSwitch(play, BGHAKABOMBWALL_GET_7F(thisx))) {
+ if (Flags_GetSwitch(play, BGHAKABOMBWALL_GET_SWITCH_FLAG(thisx))) {
Actor_Kill(&this->dyna.actor);
- } else {
- DynaPolyActor_LoadMesh(play, &this->dyna, &object_haka_obj_Colheader_000148);
- Collider_SetCylinder(play, &this->collider, &this->dyna.actor, &sCylinderInit);
- Collider_UpdateCylinder(&this->dyna.actor, &this->collider);
- func_80BD6260(this);
+ return;
}
+
+ DynaPolyActor_LoadMesh(play, &this->dyna, &object_haka_obj_Colheader_000148);
+ Collider_SetCylinder(play, &this->collider, &this->dyna.actor, &sCylinderInit);
+ Collider_UpdateCylinder(&this->dyna.actor, &this->collider);
+ func_80BD6260(this);
}
void BgHakaBombwall_Destroy(Actor* thisx, PlayState* play) {
@@ -191,21 +192,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));
+ Flags_SetSwitch(play, BGHAKABOMBWALL_GET_SWITCH_FLAG(&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 +218,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_Bombwall/z_bg_haka_bombwall.h b/src/overlays/actors/ovl_Bg_Haka_Bombwall/z_bg_haka_bombwall.h
index 9e5bd1c43..cb2ce7d02 100644
--- a/src/overlays/actors/ovl_Bg_Haka_Bombwall/z_bg_haka_bombwall.h
+++ b/src/overlays/actors/ovl_Bg_Haka_Bombwall/z_bg_haka_bombwall.h
@@ -3,7 +3,7 @@
#include "global.h"
-#define BGHAKABOMBWALL_GET_7F(thisx) ((thisx)->params & 0x7F)
+#define BGHAKABOMBWALL_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
struct BgHakaBombwall;
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..f9ed1d0c9 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) {
@@ -110,7 +110,7 @@ void func_80B6DD9C(BgHakaCurtain* this, PlayState* play) {
func_80B6DE80(this);
return;
}
- func_800B9010(&this->dyna.actor, NA_SE_EV_CURTAIN_DOWN - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_CURTAIN_DOWN - SFX_FLAG);
}
void func_80B6DE80(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..706b86b27 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,18 +80,19 @@ 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);
+ this->dyna.actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
}
- if (!func_80BD6638(&temp, this->cutscenes, 1) && (temp < 0) && Flags_GetClear(play, this->dyna.actor.room)) {
- this->dyna.actor.flags |= ACTOR_FLAG_1;
- if (this->dyna.actor.isTargeted) {
+ 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_TARGETABLE;
+ if (this->dyna.actor.isLockedOn) {
func_80BD6754(this);
}
} else {
- this->dyna.actor.flags &= ~ACTOR_FLAG_1;
+ this->dyna.actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
}
@@ -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..3f043bcc2 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
@@ -316,7 +316,7 @@ void BgHakuginBombwall_Init(Actor* thisx, PlayState* play) {
DynaPolyActor_Init(&this->dyna, 0);
Collider_InitCylinder(play, &this->collider);
- if (Flags_GetSwitch(play, BGHAKUGIN_BOMBWALL_SWITCHFLAG(&this->dyna.actor))) {
+ if (Flags_GetSwitch(play, BGHAKUGIN_BOMBWALL_SWITCH_FLAG(&this->dyna.actor))) {
Actor_Kill(&this->dyna.actor);
return;
}
@@ -343,10 +343,10 @@ void BgHakuginBombwall_Destroy(Actor* thisx, PlayState* play) {
}
s32 func_80ABCB5C(BgHakuginBombwall* this, PlayState* play) {
- Actor* thisx = &this->dyna.actor;
-
if (this->collider.base.acFlags & AC_HIT) {
if (this->collider.base.ac != NULL) {
+ Actor* thisx = &this->dyna.actor;
+
if (Math3D_Vec3fDistSq(&thisx->world.pos, &this->collider.base.ac->world.pos) <
D_80ABCFC0[BGHAKUGIN_BOMBWALL_100(thisx)].unk_1C) {
SoundSource_PlaySfxAtFixedWorldPos(play, &thisx->world.pos, 60, NA_SE_EV_WALL_BROKEN);
@@ -361,15 +361,15 @@ s32 func_80ABCC00(BgHakuginBombwall* this, PlayState* play) {
if (this->collider.base.acFlags & AC_HIT) {
if (this->collider.info.acHitInfo->toucher.dmgFlags & 8) {
if (this->collider.base.ac != NULL) {
- s32 requiredScopeTemp;
+ Actor* thisx = &this->dyna.actor;
- if (Math3D_Vec3fDistSq(&this->dyna.actor.world.pos, &this->collider.base.ac->world.pos) <
- D_80ABCFC0[BGHAKUGIN_BOMBWALL_100(&this->dyna.actor)].unk_1C) {
- SoundSource_PlaySfxAtFixedWorldPos(play, &this->dyna.actor.world.pos, 50, NA_SE_EV_WALL_BROKEN);
+ if (Math3D_Vec3fDistSq(&thisx->world.pos, &this->collider.base.ac->world.pos) <
+ D_80ABCFC0[BGHAKUGIN_BOMBWALL_100(thisx)].unk_1C) {
+ SoundSource_PlaySfxAtFixedWorldPos(play, &thisx->world.pos, 50, NA_SE_EV_WALL_BROKEN);
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);
+ Flags_SetSwitch(play, BGHAKUGIN_BOMBWALL_SWITCH_FLAG(&this->dyna.actor));
+ 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_Bombwall/z_bg_hakugin_bombwall.h b/src/overlays/actors/ovl_Bg_Hakugin_Bombwall/z_bg_hakugin_bombwall.h
index 24b04139e..78b7bf9a8 100644
--- a/src/overlays/actors/ovl_Bg_Hakugin_Bombwall/z_bg_hakugin_bombwall.h
+++ b/src/overlays/actors/ovl_Bg_Hakugin_Bombwall/z_bg_hakugin_bombwall.h
@@ -9,7 +9,7 @@ typedef void (*BgHakuginBombwallActionFunc)(struct BgHakuginBombwall*, PlayState
typedef s32 (*BgHakuginBombwallUnkFunc)(struct BgHakuginBombwall*, PlayState*);
typedef void (*BgHakuginBombwallUnkFunc2)(struct BgHakuginBombwall*, PlayState*);
-#define BGHAKUGIN_BOMBWALL_SWITCHFLAG(thisx) ((thisx)->params & 0x7F)
+#define BGHAKUGIN_BOMBWALL_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
#define BGHAKUGIN_BOMBWALL_100(thisx) (((thisx)->params >> 8) & 1)
typedef struct BgHakuginBombwall {
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 0b8d2490b..35e03c438 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
@@ -42,8 +42,8 @@ void BgHakuginElvpole_Init(Actor* thisx, PlayState* play) {
this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &this->dyna.actor, colHeader);
this->unk_15C = 0;
this->unk_160 = false;
- if ((BGHAKUGINELVPOLE_GET_SWITCHFLAG(&this->dyna.actor) != 0x7F) &&
- Flags_GetSwitch(play, BGHAKUGINELVPOLE_GET_SWITCHFLAG(&this->dyna.actor))) {
+ if ((BGHAKUGINELVPOLE_GET_SWITCH_FLAG(&this->dyna.actor) != 0x7F) &&
+ Flags_GetSwitch(play, BGHAKUGINELVPOLE_GET_SWITCH_FLAG(&this->dyna.actor))) {
this->unk_15E = 0x64;
} else {
this->unk_15E = -1;
@@ -68,7 +68,7 @@ void func_80ABD92C(BgHakuginElvpole* this, PlayState* play) {
sp28 = true;
} else if (this->unk_15E > 0) {
if (this->unk_15E == 100) {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_STONEDOOR_STOP);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_STONEDOOR_STOP);
}
this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y - 120.0f;
//! FAKE:
@@ -81,12 +81,12 @@ void func_80ABD92C(BgHakuginElvpole* this, PlayState* play) {
sp28 = true;
} else {
this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y - 320.0f;
- Flags_UnsetSwitch(play, BGHAKUGINELVPOLE_GET_SWITCHFLAG(&this->dyna.actor));
+ Flags_UnsetSwitch(play, BGHAKUGINELVPOLE_GET_SWITCH_FLAG(&this->dyna.actor));
this->unk_15E = -1;
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_STONEDOOR_STOP);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_STONEDOOR_STOP);
}
- } else if ((BGHAKUGINELVPOLE_GET_SWITCHFLAG(&this->dyna.actor) != 0x7F) &&
- Flags_GetSwitch(play, BGHAKUGINELVPOLE_GET_SWITCHFLAG(&this->dyna.actor))) {
+ } else if ((BGHAKUGINELVPOLE_GET_SWITCH_FLAG(&this->dyna.actor) != 0x7F) &&
+ Flags_GetSwitch(play, BGHAKUGINELVPOLE_GET_SWITCH_FLAG(&this->dyna.actor))) {
this->unk_15E = 0x64;
this->unk_160 = true;
}
@@ -99,20 +99,20 @@ void func_80ABD92C(BgHakuginElvpole* this, PlayState* play) {
this->unk_15C++;
this->dyna.actor.world.pos.x = (Math_SinS(this->unk_15C * 0x2000) * var_fv1) + this->dyna.actor.home.pos.x;
this->dyna.actor.world.pos.z = (Math_CosS(this->unk_15C * 0x2000) * var_fv1) + this->dyna.actor.home.pos.z;
- func_800B9010(&this->dyna.actor, NA_SE_EV_PLATE_LIFT_LEVEL - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_PLATE_LIFT_LEVEL - SFX_FLAG);
} else {
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_Elvpole/z_bg_hakugin_elvpole.h b/src/overlays/actors/ovl_Bg_Hakugin_Elvpole/z_bg_hakugin_elvpole.h
index ace71e7b3..575a0d8cb 100644
--- a/src/overlays/actors/ovl_Bg_Hakugin_Elvpole/z_bg_hakugin_elvpole.h
+++ b/src/overlays/actors/ovl_Bg_Hakugin_Elvpole/z_bg_hakugin_elvpole.h
@@ -5,7 +5,7 @@
struct BgHakuginElvpole;
-#define BGHAKUGINELVPOLE_GET_SWITCHFLAG(thisx) ((thisx)->params & 0x7F)
+#define BGHAKUGINELVPOLE_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
typedef void (*BgHakuginElvpoleActionFunc)(struct BgHakuginElvpole*, PlayState*);
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 7f77b6645..dc20a1fd3 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 },
@@ -155,19 +155,19 @@ void func_80A9AFB4(BgHakuginPost* this, PlayState* play, BgHakuginPostUnkStruct*
unkStruct->unk_0000[i].unk_00 = BGHAKUGINPOST_GET_7(&this->dyna.actor);
Math_Vec3f_Copy(&unkStruct->unk_0000[i].unk_08, &this->dyna.actor.world.pos);
Math_Vec3f_Copy(&unkStruct->unk_0000[i].unk_14, &this->dyna.actor.world.pos);
- unkStruct->unk_0000[i].unk_2E = BGHAKUGINPOST_GET_7F00(&this->dyna.actor);
+ unkStruct->unk_0000[i].switchFlag = BGHAKUGINPOST_GET_SWITCH_FLAG(&this->dyna.actor);
if (D_80A9D880[unkStruct->unk_0000[i].unk_00].unk_04) {
- if (Flags_GetSwitch(play, unkStruct->unk_0000[i].unk_2E)) {
+ if (Flags_GetSwitch(play, unkStruct->unk_0000[i].switchFlag)) {
unkStruct->unk_0000[i].unk_34 = 5;
} 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;
@@ -184,7 +184,7 @@ void func_80A9B160(BgHakuginPostUnkStruct* unkStruct, PlayState* play) {
unkStruct->unk_0000[i].unk_24 = 0.0f;
unkStruct->unk_0000[i].unk_34 = 1;
if (D_80A9D880[unkStruct->unk_0000[i].unk_00].unk_04 != 0) {
- Flags_UnsetSwitch(play, unkStruct->unk_0000[i].unk_2E);
+ Flags_UnsetSwitch(play, unkStruct->unk_0000[i].switchFlag);
}
}
}
@@ -240,25 +240,25 @@ void func_80A9B384(Vec3f* arg0) {
void func_80A9B3BC(BgHakuginPost* this, PlayState* play) {
s32 pad;
- s32 sp28 = BGHAKUGINPOST_GET_7F00(&this->dyna.actor);
- s32 sp24 = BGHAKUGINPOST_GET_7F00(&this->dyna.actor) + 1;
+ s32 switchFlag1 = BGHAKUGINPOST_GET_SWITCH_FLAG(&this->dyna.actor);
+ s32 switchFlag2 = BGHAKUGINPOST_GET_SWITCH_FLAG(&this->dyna.actor) + 1;
s32 sp20;
s32 sp1C;
- if (Flags_GetSwitch(play, sp28)) {
+ if (Flags_GetSwitch(play, switchFlag1)) {
sp20 = true;
} else {
sp20 = false;
}
- if (Flags_GetSwitch(play, sp24)) {
+ if (Flags_GetSwitch(play, switchFlag2)) {
sp1C = true;
} else {
sp1C = false;
}
if (!(sp20 | sp1C)) {
- Flags_SetSwitch(play, sp28);
+ Flags_SetSwitch(play, switchFlag1);
this->unk_170 = true;
} else {
this->unk_170 = sp20;
@@ -269,27 +269,27 @@ void func_80A9B3BC(BgHakuginPost* this, PlayState* play) {
void func_80A9B46C(BgHakuginPost* this, PlayState* play) {
s32 pad;
- s32 sp30 = BGHAKUGINPOST_GET_7F00(&this->dyna.actor);
- s32 sp2C = BGHAKUGINPOST_GET_7F00(&this->dyna.actor) + 1;
+ s32 switchFlag1 = BGHAKUGINPOST_GET_SWITCH_FLAG(&this->dyna.actor);
+ s32 switchFlag2 = BGHAKUGINPOST_GET_SWITCH_FLAG(&this->dyna.actor) + 1;
s32 sp28;
s32 sp24;
- if (Flags_GetSwitch(play, sp30)) {
+ if (Flags_GetSwitch(play, switchFlag1)) {
sp28 = true;
} else {
sp28 = false;
}
- if (Flags_GetSwitch(play, sp2C)) {
+ if (Flags_GetSwitch(play, switchFlag2)) {
sp24 = true;
} else {
sp24 = false;
}
if (!this->unk_170 && (sp28 == 1)) {
- Flags_UnsetSwitch(play, sp2C);
+ Flags_UnsetSwitch(play, switchFlag2);
} else if (!this->unk_174 && (sp24 == 1)) {
- Flags_UnsetSwitch(play, sp30);
+ Flags_UnsetSwitch(play, switchFlag1);
}
this->unk_170 = sp28;
@@ -492,7 +492,7 @@ void func_80A9BD24(BgHakuginPost* this, PlayState* play, BgHakuginPostUnkStruct*
} else if (unkStruct->unk_0000[i].unk_34 == 3) {
if (Math3D_XZLengthSquared(unkStruct->unk_0000[i].unk_14.x, unkStruct->unk_0000[i].unk_14.z) > 278784.03f) {
func_80A9B554(this, play, unkStruct, &unkStruct->unk_0000[i]);
- func_8019F128(NA_SE_EV_GLASSBROKEN_IMPACT);
+ Audio_PlaySfx_2(NA_SE_EV_GLASSBROKEN_IMPACT);
unkStruct->unk_0000[i].unk_34 = 4;
unkStruct->unk_0000[i].unk_30 = 30;
}
@@ -522,13 +522,13 @@ 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);
+ Audio_PlaySfx_2(NA_SE_EV_STONEDOOR_STOP);
this->unk_179 = 40;
}
break;
@@ -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) {
@@ -668,7 +668,7 @@ void func_80A9C854(BgHakuginPost* this, PlayState* play) {
for (i = 0; i < D_80A9E028.count; i++) {
ColliderCylinder* collider = D_80A9E028.unk_0000[i].collider;
- if ((collider != NULL) && Flags_GetSwitch(play, D_80A9E028.unk_0000[i].unk_2E)) {
+ if ((collider != NULL) && Flags_GetSwitch(play, D_80A9E028.unk_0000[i].switchFlag)) {
sp28 = false;
break;
}
@@ -681,9 +681,9 @@ void func_80A9C854(BgHakuginPost* this, PlayState* play) {
}
if (sp38) {
- Flags_SetSwitch(play, this->dyna.actor.home.rot.x & 0x7F);
+ Flags_SetSwitch(play, BGHAKUGINPOST_GET_SWITCH_FLAG_2(&this->dyna.actor));
} else {
- Flags_UnsetSwitch(play, this->dyna.actor.home.rot.x & 0x7F);
+ Flags_UnsetSwitch(play, BGHAKUGINPOST_GET_SWITCH_FLAG_2(&this->dyna.actor));
}
}
@@ -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,11 +798,11 @@ 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);
- func_8019F128(NA_SE_EV_STONEDOOR_STOP);
+ BgHakuginPost_RequestQuakeAndRumble(this, play);
+ Audio_PlaySfx_2(NA_SE_EV_STONEDOOR_STOP);
func_80A9CE00(this);
} else {
- func_800B8FE8(&this->dyna.actor, NA_SE_EV_ICE_PILLAR_RISING - SFX_FLAG);
+ Actor_PlaySfx_FlaggedCentered3(&this->dyna.actor, NA_SE_EV_ICE_PILLAR_RISING - SFX_FLAG);
}
}
@@ -823,13 +823,13 @@ 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;
}
for (i = 0; i < D_80A9E028.count; i++) {
collider = D_80A9E028.unk_0000[i].collider;
- if ((collider != NULL) && (collider->base.acFlags & AT_HIT) && (D_80A9E028.unk_0000[i].unk_34 == 1)) {
+ if ((collider != NULL) && (collider->base.acFlags & AC_HIT) && (D_80A9E028.unk_0000[i].unk_34 == 1)) {
temp_f2 = this->unk_16C;
yDiff = ABS_ALT(BINANG_SUB(this->dyna.actor.yawTowardsPlayer, player->actor.shape.rot.y));
temp_f0 = temp_f2 + D_80A9E028.unk_0000[i].unk_14.y;
@@ -839,12 +839,12 @@ void func_80A9CE1C(BgHakuginPost* this, PlayState* play) {
temp = (s16)(this->dyna.actor.yawTowardsPlayer + 0x58F0);
D_80A9E028.unk_0000[i].unk_28 = ((s16)(player->actor.shape.rot.y - temp) / 3) + temp;
D_80A9E028.unk_0000[i].unk_34 = 2;
- func_800B8E58(player, NA_SE_IT_HAMMER_HIT);
- func_8019F128(NA_SE_EV_SLIDE_DOOR_OPEN);
- Flags_SetSwitch(play, D_80A9E028.unk_0000[i].unk_2E);
+ Player_PlaySfx(player, NA_SE_IT_HAMMER_HIT);
+ Audio_PlaySfx_2(NA_SE_EV_SLIDE_DOOR_OPEN);
+ Flags_SetSwitch(play, D_80A9E028.unk_0000[i].switchFlag);
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;
}
}
@@ -853,7 +853,7 @@ void func_80A9CE1C(BgHakuginPost* this, PlayState* play) {
for (i = 0; i < D_80A9E028.count; i++) {
collider = D_80A9E028.unk_0000[i].collider;
if (collider != NULL) {
- collider->base.acFlags &= ~AT_HIT;
+ collider->base.acFlags &= ~AC_HIT;
}
}
@@ -876,20 +876,20 @@ 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);
- func_8019F128(NA_SE_EV_STONEDOOR_STOP);
+ BgHakuginPost_RequestQuakeAndRumble(this, play);
+ Audio_PlaySfx_2(NA_SE_EV_STONEDOOR_STOP);
func_80A9CC84(this);
} else {
- func_800B8FE8(&this->dyna.actor, NA_SE_EV_ICE_PILLAR_FALL - SFX_FLAG);
+ Actor_PlaySfx_FlaggedCentered3(&this->dyna.actor, NA_SE_EV_ICE_PILLAR_FALL - SFX_FLAG);
}
}
-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..897228bb9 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
@@ -9,7 +9,8 @@ typedef void (*BgHakuginPostActionFunc)(struct BgHakuginPost*, PlayState*);
typedef void (*BgHakuginPostFunc)(struct BgHakuginPost*);
#define BGHAKUGINPOST_GET_7(thisx) ((thisx)->params & 7)
-#define BGHAKUGINPOST_GET_7F00(thisx) (((thisx)->params >> 8) & 0x7F)
+#define BGHAKUGINPOST_GET_SWITCH_FLAG(thisx) (((thisx)->params >> 8) & 0x7F)
+#define BGHAKUGINPOST_GET_SWITCH_FLAG_2(thisx) (((thisx)->home.rot.x) & 0x7F)
typedef struct {
/* 0x00 */ s32 unk_00;
@@ -19,9 +20,9 @@ typedef struct {
/* 0x20 */ f32 unk_20;
/* 0x24 */ f32 unk_24;
/* 0x28 */ s16 unk_28;
- /* 0x2A */ s16 unk_2A;
- /* 0x2C */ s16 unk_2C;
- /* 0x2E */ u8 unk_2E;
+ /* 0x2A */ s16 csId;
+ /* 0x2C */ s16 additionalCsId;
+ /* 0x2E */ u8 switchFlag;
/* 0x2F */ u8 unk_2F;
/* 0x30 */ s8 unk_30;
/* 0x34 */ s32 unk_34;
@@ -64,10 +65,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 aa22dd8af..4ecce9c3a 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 },
@@ -102,13 +103,13 @@ static InitChainEntry sInitChain2[] = {
void func_80B15790(BgHakuginSwitch* this, u16 sfxId) {
if (this->unk_1B2 <= 0) {
- Actor_PlaySfxAtPos(&this->dyna.actor, sfxId);
+ Actor_PlaySfx(&this->dyna.actor, sfxId);
}
}
void func_80B157C4(BgHakuginSwitch* this, u16 arg1) {
if (this->unk_1B2 <= 0) {
- func_800B9010(&this->dyna.actor, arg1);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, arg1);
}
}
@@ -120,13 +121,13 @@ void BgHakuginSwitch_Init(Actor* thisx, PlayState* play) {
s32 pad2;
s32 sp28;
- if (Flags_GetSwitch(play, BGHAKUGINSWITCH_GET_SWITCHFLAG(&this->dyna.actor))) {
+ if (Flags_GetSwitch(play, BGHAKUGINSWITCH_GET_SWITCH_FLAG(&this->dyna.actor))) {
sp30 = true;
} else {
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);
}
}
@@ -227,7 +228,7 @@ void func_80B15B74(BgHakuginSwitch* this, PlayState* play) {
s32 sp24;
s32 sp20;
- if (Flags_GetSwitch(play, BGHAKUGINSWITCH_GET_SWITCHFLAG(&this->dyna.actor))) {
+ if (Flags_GetSwitch(play, BGHAKUGINSWITCH_GET_SWITCH_FLAG(&this->dyna.actor))) {
sp2C = 1;
} else {
sp2C = 0;
@@ -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;
}
@@ -253,7 +254,7 @@ void func_80B15B74(BgHakuginSwitch* this, PlayState* play) {
if (this->unk_1B0 > 0) {
this->unk_1B0--;
if (sp38->unk_14 & 8) {
- func_800B9038(&this->dyna.actor, this->unk_1B0);
+ Actor_PlaySfx_FlaggedTimer(&this->dyna.actor, this->unk_1B0);
if (this->unk_1B0 == 0) {
sp24 = true;
sp20 = sp28;
@@ -273,15 +274,15 @@ void func_80B15B74(BgHakuginSwitch* this, PlayState* play) {
if (sp24) {
if (sp20 == 1) {
- Flags_SetSwitch(play, BGHAKUGINSWITCH_GET_SWITCHFLAG(&this->dyna.actor));
+ Flags_SetSwitch(play, BGHAKUGINSWITCH_GET_SWITCH_FLAG(&this->dyna.actor));
} else if (sp20 == 0) {
- Flags_UnsetSwitch(play, BGHAKUGINSWITCH_GET_SWITCHFLAG(&this->dyna.actor));
+ Flags_UnsetSwitch(play, BGHAKUGINSWITCH_GET_SWITCH_FLAG(&this->dyna.actor));
}
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);
@@ -328,7 +329,7 @@ void func_80B15F88(BgHakuginSwitch* this, PlayState* play) {
BgHakuginSwitchStruct* sp18 = &D_80B1688C[BGHAKUGINSWITCH_GET_7(&this->dyna.actor)];
s32 phi_v1;
- if (Flags_GetSwitch(play, BGHAKUGINSWITCH_GET_SWITCHFLAG(&this->dyna.actor))) {
+ if (Flags_GetSwitch(play, BGHAKUGINSWITCH_GET_SWITCH_FLAG(&this->dyna.actor))) {
phi_a0 = true;
} else {
phi_a0 = false;
@@ -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,25 +373,25 @@ 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));
+ Flags_SetSwitch(play, BGHAKUGINSWITCH_GET_SWITCH_FLAG(&this->dyna.actor));
} else {
- Flags_UnsetSwitch(play, BGHAKUGINSWITCH_GET_SWITCHFLAG(&this->dyna.actor));
+ Flags_UnsetSwitch(play, BGHAKUGINSWITCH_GET_SWITCH_FLAG(&this->dyna.actor));
}
this->unk_1BF = 50;
this->unk_1B4(this, play);
} else {
- ActorCutscene_SetIntentToPlay(this->unk_1BC);
+ CutsceneManager_Queue(this->curCsId);
}
}
@@ -413,21 +414,21 @@ 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;
}
}
if (sp30 == 1) {
- if (Flags_GetSwitch(play, BGHAKUGINSWITCH_GET_SWITCHFLAG(&this->dyna.actor))) {
+ if (Flags_GetSwitch(play, BGHAKUGINSWITCH_GET_SWITCH_FLAG(&this->dyna.actor))) {
sp24 = true;
}
}
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);
@@ -464,9 +465,9 @@ 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 (!Flags_GetSwitch(play, BGHAKUGINSWITCH_GET_SWITCH_FLAG(&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..f8a27429d 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
@@ -10,7 +10,7 @@ typedef void (*BgHakuginSwitchUnkFunc)(struct BgHakuginSwitch*, PlayState*);
#define BGHAKUGINSWITCH_GET_7(thisx) ((thisx)->params & 7)
#define BGHAKUGINSWITCH_GET_10(thisx) (((thisx)->params >> 4) & 1)
-#define BGHAKUGINSWITCH_GET_SWITCHFLAG(thisx) (((thisx)->params >> 8) & 0x7F)
+#define BGHAKUGINSWITCH_GET_SWITCH_FLAG(thisx) (((thisx)->params >> 8) & 0x7F)
#define BGHAKUGINSWITCH_GET_7_1 1
@@ -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 265490e52..50e99c1aa 100644
--- a/src/overlays/actors/ovl_Bg_Icefloe/z_bg_icefloe.c
+++ b/src/overlays/actors/ovl_Bg_Icefloe/z_bg_icefloe.c
@@ -86,7 +86,7 @@ void func_80AC4A80(BgIcefloe* this, PlayState* play) {
this->timer = 20;
SkinMatrix_Vec3fMtxFMultXYZW(&play->viewProjectionMtxF, &this->dyna.actor.world.pos, &this->dyna.actor.projectedPos,
&this->dyna.actor.projectedW);
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_ICE_STAND_APPEAR);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_ICE_STAND_APPEAR);
this->actionFunc = BgIcefloe_Grow;
}
@@ -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,19 +121,19 @@ 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);
}
}
void func_80AC4CF0(BgIcefloe* this) {
this->timer = 50;
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_ICE_MELT_LEVEL);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_ICE_MELT_LEVEL);
this->actionFunc = func_80AC4D2C;
}
@@ -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 743213652..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,
@@ -142,7 +142,7 @@ void BgIcicle_Shiver(BgIcicle* this, PlayState* play) {
}
if (!(this->shiverTimer % 4)) {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_ICE_SWING);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_ICE_SWING);
}
if (this->shiverTimer == 0) {
@@ -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();
@@ -163,9 +163,9 @@ void BgIcicle_Shiver(BgIcicle* this, PlayState* play) {
}
void BgIcicle_Fall(BgIcicle* this, PlayState* play) {
- if ((this->collider.base.atFlags & AT_HIT) || (this->dyna.actor.bgCheckFlags & 1)) {
+ if ((this->collider.base.atFlags & AT_HIT) || (this->dyna.actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
this->collider.base.atFlags &= ~AT_HIT;
- this->dyna.actor.bgCheckFlags &= ~1;
+ this->dyna.actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
if (this->dyna.actor.world.pos.y < this->dyna.actor.floorHeight) {
this->dyna.actor.world.pos.y = this->dyna.actor.floorHeight;
@@ -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 9d249314a..27375d4dd 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);
}
@@ -294,7 +294,7 @@ void func_80B7F290(BgIkanaBlock* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (!func_80B7EB94(this, play)) {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_BLOCK_BOUND);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_BLOCK_BOUND);
}
player->stateFlags2 &= ~PLAYER_STATE2_10;
@@ -306,7 +306,7 @@ void func_80B7F290(BgIkanaBlock* this, PlayState* play) {
func_80B7F360(this);
}
} else {
- func_800B9010(&this->dyna.actor, NA_SE_EV_ROCK_SLIDE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_ROCK_SLIDE - SFX_FLAG);
}
}
@@ -334,10 +334,10 @@ void func_80B7F398(BgIkanaBlock* this, PlayState* play) {
this->dyna.actor.world.pos.y += this->dyna.actor.velocity.y;
if (func_80B7EE70(this, play)) {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_BLOCK_BOUND);
- Actor_PlaySfxAtPos(&this->dyna.actor,
- SurfaceType_GetSfx(&play->colCtx, this->dyna.actor.floorPoly, this->dyna.actor.floorBgId) +
- SFX_FLAG);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_BLOCK_BOUND);
+ Actor_PlaySfx(&this->dyna.actor,
+ 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..e06b788c4 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
@@ -242,7 +242,7 @@ void BgIkanaBombwall_Init(Actor* thisx, PlayState* play) {
DynaPolyActor_Init(&this->dyna, 0);
Collider_InitCylinder(play, &this->collider);
- if (Flags_GetSwitch(play, BGIKANABOMBWALL_GET_SWITCHFLAG(&this->dyna.actor))) {
+ if (Flags_GetSwitch(play, BGIKANABOMBWALL_GET_SWITCH_FLAG(&this->dyna.actor))) {
Actor_Kill(&this->dyna.actor);
return;
}
@@ -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 {
@@ -333,13 +333,13 @@ void func_80BD503C(BgIkanaBombwall* this, PlayState* play) {
}
this->dyna.actor.draw = NULL;
SoundSource_PlaySfxAtFixedWorldPos(play, &this->dyna.actor.world.pos, 60, NA_SE_EV_WALL_BROKEN);
- Flags_SetSwitch(play, BGIKANABOMBWALL_GET_SWITCHFLAG(&this->dyna.actor));
+ Flags_SetSwitch(play, BGIKANABOMBWALL_GET_SWITCH_FLAG(&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_Bombwall/z_bg_ikana_bombwall.h b/src/overlays/actors/ovl_Bg_Ikana_Bombwall/z_bg_ikana_bombwall.h
index e9ff850ad..393e1d9e6 100644
--- a/src/overlays/actors/ovl_Bg_Ikana_Bombwall/z_bg_ikana_bombwall.h
+++ b/src/overlays/actors/ovl_Bg_Ikana_Bombwall/z_bg_ikana_bombwall.h
@@ -7,7 +7,7 @@ struct BgIkanaBombwall;
typedef void (*BgIkanaBombwallActionFunc)(struct BgIkanaBombwall*, PlayState*);
-#define BGIKANABOMBWALL_GET_SWITCHFLAG(thisx) ((thisx)->params & 0x7F)
+#define BGIKANABOMBWALL_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
#define BGIKANABOMBWALL_GET_100(thisx) (((thisx)->params >> 8) & 1)
typedef struct BgIkanaBombwall {
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 678080ae1..a0062a62b 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,11 +115,11 @@ 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,
- this->dyna.actor.unk20, NULL);
+ BGIKANADHARMA_PARAMS(0, true, 0), this->dyna.actor.csId,
+ this->dyna.actor.halfDaysBits, NULL);
}
- this->dyna.actor.bgCheckFlags |= 1;
+ this->dyna.actor.bgCheckFlags |= BGCHECKFLAG_GROUND;
}
BgIkanaDharma_SetupWaitForHit(this);
@@ -137,7 +137,7 @@ void BgIkanaDharma_Destroy(Actor* thisx, PlayState* play) {
void BgIkanaDharma_SetupWaitForHit(BgIkanaDharma* this) {
this->actionFunc = BgIkanaDharma_WaitForHit;
- this->dyna.actor.speedXZ = 0.0f;
+ this->dyna.actor.speed = 0.0f;
}
void BgIkanaDharma_WaitForHit(BgIkanaDharma* this, PlayState* play) {
@@ -151,17 +151,17 @@ 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));
+ Flags_SetSwitch(play, BGIKANADHARMA_GET_SWITCH_FLAG(&this->dyna.actor));
tempAngle1 = BINANG_ADD(this->dyna.actor.yawTowardsPlayer, 0x8000);
tempAngle2 = (BINANG_SUB(player->actor.shape.rot.y, tempAngle1) >> 1);
this->dyna.actor.world.rot.y = tempAngle1 + tempAngle2 + 0xF000;
- this->dyna.actor.speedXZ = 20.0f;
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_DARUMA_VANISH);
+ 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,15 +226,15 @@ 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);
- if (this->dyna.actor.bgCheckFlags & 2) {
- s16 quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ 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_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_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_BLOCK_BOUND);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_BLOCK_BOUND);
}
} else {
if (actorBelow->actor.id == ACTOR_BG_IKANA_DHARMA) {
@@ -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_Dharma/z_bg_ikana_dharma.h b/src/overlays/actors/ovl_Bg_Ikana_Dharma/z_bg_ikana_dharma.h
index ac1bcadf0..a8c08e364 100644
--- a/src/overlays/actors/ovl_Bg_Ikana_Dharma/z_bg_ikana_dharma.h
+++ b/src/overlays/actors/ovl_Bg_Ikana_Dharma/z_bg_ikana_dharma.h
@@ -3,7 +3,7 @@
#include "global.h"
-#define BGIKANADHARMA_GET_SWITCHFLAG(thisx) (((thisx)->params >> 8) & 0x7F)
+#define BGIKANADHARMA_GET_SWITCH_FLAG(thisx) (((thisx)->params >> 8) & 0x7F)
#define BGIKANADHARMA_IS_CHILD(thisx) (((thisx)->params >> 5) & 1)
#define BGIKANADHARMA_NUM_SEGMENTS(thisx) ((thisx)->params & 0xF)
#define BGIKANADHARMA_PARAMS(switchFlag, isChild, numSegments) (((switchFlag & 0x7F) << 8) | ((isChild & 1) << 5) | (numSegments & 0xF))
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 4561d4049..8850d8852 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] = {
@@ -169,7 +169,7 @@ void func_80B80440(BgIkanaRotaryroom* this, PlayState* play) {
Matrix_Push();
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);
- if (Flags_GetSwitch(play, BGIKANAROTARYROOM_GET_7F00(&this->dyna.actor))) {
+ if (Flags_GetSwitch(play, BGIKANAROTARYROOM_GET_SWITCH_FLAG_2(&this->dyna.actor))) {
Matrix_Translate(D_80B82178.x, D_80B82178.y, D_80B82178.z, MTXMODE_APPLY);
} else {
Matrix_Translate(D_80B8216C.x, D_80B8216C.y, D_80B8216C.z, MTXMODE_APPLY);
@@ -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.unk20, NULL);
+ CutsceneManager_GetAdditionalCsId(this->dyna.actor.csId), this->dyna.actor.halfDaysBits, NULL);
Matrix_Pop();
}
@@ -195,7 +195,7 @@ void func_80B80550(BgIkanaRotaryroom* this, PlayState* play) {
MtxF sp68;
Vec3s sp60;
- if (Flags_GetSwitch(play, BGIKANAROTARYROOM_GET_FE(&this->dyna.actor))) {
+ if (Flags_GetSwitch(play, BGIKANAROTARYROOM_GET_SWITCH_FLAG_1(&this->dyna.actor))) {
spC4 = 1;
} else {
spC4 = 0;
@@ -494,10 +494,10 @@ s32 func_80B80F08(BgIkanaRotaryroom* this, PlayState* play) {
Matrix_Pop();
if (Math3D_Vec3fDistSq(&sp34, &sp28) < 3.0f) {
- if (!Flags_GetSwitch(play, BGIKANAROTARYROOM_GET_7F00(&this->dyna.actor))) {
+ if (!Flags_GetSwitch(play, BGIKANAROTARYROOM_GET_SWITCH_FLAG_2(&this->dyna.actor))) {
sp24 = true;
}
- Flags_SetSwitch(play, BGIKANAROTARYROOM_GET_7F00(&this->dyna.actor));
+ Flags_SetSwitch(play, BGIKANAROTARYROOM_GET_SWITCH_FLAG_2(&this->dyna.actor));
}
}
return sp24;
@@ -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,13 +646,13 @@ 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 (player->actor.bgCheckFlags & 0x100) {
- func_800B8E58(player, NA_SE_VO_LI_DAMAGE_S + player->ageProperties->voiceSfxIdOffset);
+ 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);
- func_800B8E58(player, NA_SE_VO_LI_TAKEN_AWAY + player->ageProperties->voiceSfxIdOffset);
+ Player_PlaySfx(player, NA_SE_VO_LI_TAKEN_AWAY + player->ageProperties->voiceSfxIdOffset);
play->haltAllActors = true;
- play_sound(NA_SE_OC_ABYSS);
+ Audio_PlaySfx(NA_SE_OC_ABYSS);
this->actionFunc = NULL;
}
} else {
@@ -708,13 +708,13 @@ void BgIkanaRotaryroom_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
- if (Flags_GetSwitch(play, BGIKANAROTARYROOM_GET_FE(&this->dyna.actor))) {
+ if (Flags_GetSwitch(play, BGIKANAROTARYROOM_GET_SWITCH_FLAG_1(&this->dyna.actor))) {
this->dyna.actor.shape.rot.x = -0x8000;
} else {
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);
@@ -753,15 +753,15 @@ void func_80B818B4(BgIkanaRotaryroom* this) {
void func_80B818C8(Actor* thisx, PlayState* play) {
BgIkanaRotaryroom* this = THIS;
- s32 sp20;
+ s32 switchFlag;
if (this->collider.base.acFlags & AC_HIT) {
this->collider.base.acFlags &= ~AC_HIT;
- sp20 = BGIKANAROTARYROOM_GET_FE(&this->dyna.actor);
- if (Flags_GetSwitch(play, sp20)) {
- Flags_UnsetSwitch(play, sp20);
+ switchFlag = BGIKANAROTARYROOM_GET_SWITCH_FLAG_1(&this->dyna.actor);
+ if (Flags_GetSwitch(play, switchFlag)) {
+ Flags_UnsetSwitch(play, switchFlag);
} else {
- Flags_SetSwitch(play, sp20);
+ Flags_SetSwitch(play, switchFlag);
}
func_80B81978(this);
} else {
@@ -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);
}
}
@@ -813,7 +813,7 @@ void func_80B81A80(Actor* thisx, PlayState* play) {
s32 i;
BgIkanaRotaryroomStruct1* ptr;
- func_800B9010(thisx, NA_SE_EV_EARTHQUAKE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(thisx, NA_SE_EV_EARTHQUAKE - SFX_FLAG);
this->unk_584--;
if (this->unk_584 <= 0) {
@@ -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);
}
}
@@ -850,7 +850,7 @@ void func_80B81BA0(Actor* thisx, PlayState* play) {
s32 sp30 = 0;
s32 i;
- func_800B9010(&this->dyna.actor, NA_SE_EV_EARTHQUAKE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_EARTHQUAKE - SFX_FLAG);
if (this->unk_584 > 0) {
this->unk_584--;
@@ -859,14 +859,14 @@ 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))) {
+ if (Flags_GetSwitch(play, BGIKANAROTARYROOM_GET_SWITCH_FLAG_1(&this->dyna.actor))) {
if (this->dyna.actor.shape.rot.x < 0) {
this->dyna.actor.shape.rot.x = -0x8000;
sp30 = 1;
@@ -921,19 +921,19 @@ void func_80B81DC8(Actor* thisx, PlayState* play) {
BgIkanaRotaryroom* this = THIS;
if (this->unk_584 > 10) {
- func_800B9010(&this->dyna.actor, NA_SE_EV_EARTHQUAKE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_EARTHQUAKE - SFX_FLAG);
}
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_Rotaryroom/z_bg_ikana_rotaryroom.h b/src/overlays/actors/ovl_Bg_Ikana_Rotaryroom/z_bg_ikana_rotaryroom.h
index 4184220e0..e2737e0c2 100644
--- a/src/overlays/actors/ovl_Bg_Ikana_Rotaryroom/z_bg_ikana_rotaryroom.h
+++ b/src/overlays/actors/ovl_Bg_Ikana_Rotaryroom/z_bg_ikana_rotaryroom.h
@@ -10,8 +10,8 @@ typedef void (*BgIkanaRotaryroomUnkFunc)(Actor*, PlayState*);
typedef void (*BgIkanaRotaryroomUnkFunc2)(struct BgIkanaRotaryroom*, PlayState*);
#define BGIKANAROTARYROOM_GET_1(thisx) ((thisx)->params & 1)
-#define BGIKANAROTARYROOM_GET_FE(thisx) (((thisx)->params >> 1) & 0x7F)
-#define BGIKANAROTARYROOM_GET_7F00(thisx) (((thisx)->params >> 8) & 0x7F)
+#define BGIKANAROTARYROOM_GET_SWITCH_FLAG_1(thisx) (((thisx)->params >> 1) & 0x7F)
+#define BGIKANAROTARYROOM_GET_SWITCH_FLAG_2(thisx) (((thisx)->params >> 8) & 0x7F)
typedef struct {
/* 0x00 */ Actor* unk_00;
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..6891956db 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
@@ -56,10 +56,10 @@ static InitChainEntry sInitChain[] = {
};
s32 BgIkanaShutter_AllSwitchesPressed(BgIkanaShutter* this, PlayState* play) {
- return Flags_GetSwitch(play, this->dyna.actor.params & 0x7F) &&
- Flags_GetSwitch(play, (this->dyna.actor.params & 0x7F) + 1) &&
- Flags_GetSwitch(play, (this->dyna.actor.params & 0x7F) + 2) &&
- Flags_GetSwitch(play, (this->dyna.actor.params & 0x7F) + 3);
+ return Flags_GetSwitch(play, BGIKANASHUTTER_GET_SWITCH_FLAG(&this->dyna.actor)) &&
+ Flags_GetSwitch(play, BGIKANASHUTTER_GET_SWITCH_FLAG(&this->dyna.actor) + 1) &&
+ Flags_GetSwitch(play, BGIKANASHUTTER_GET_SWITCH_FLAG(&this->dyna.actor) + 2) &&
+ Flags_GetSwitch(play, BGIKANASHUTTER_GET_SWITCH_FLAG(&this->dyna.actor) + 3);
}
void BgIkanaShutter_Init(Actor* thisx, PlayState* play) {
@@ -68,7 +68,7 @@ void BgIkanaShutter_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
DynaPolyActor_Init(&this->dyna, 0);
DynaPolyActor_LoadMesh(play, &this->dyna, &object_ikana_obj_Colheader_000F28);
- if (!((this->dyna.actor.params >> 8) & 1)) {
+ if (!BGIKANASHUTTER_GET_100(&this->dyna.actor)) {
if (BgIkanaShutter_AllSwitchesPressed(this, play)) {
func_80BD599C(this);
return;
@@ -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_Ikana_Shutter/z_bg_ikana_shutter.h b/src/overlays/actors/ovl_Bg_Ikana_Shutter/z_bg_ikana_shutter.h
index 094334600..c1ad76b7d 100644
--- a/src/overlays/actors/ovl_Bg_Ikana_Shutter/z_bg_ikana_shutter.h
+++ b/src/overlays/actors/ovl_Bg_Ikana_Shutter/z_bg_ikana_shutter.h
@@ -7,6 +7,9 @@ struct BgIkanaShutter;
typedef void (*BgIkanaShutterActionFunc)(struct BgIkanaShutter*, PlayState*);
+#define BGIKANASHUTTER_GET_SWITCH_FLAG(thisx) (((thisx)->params) & 0x7F)
+#define BGIKANASHUTTER_GET_100(thisx) (((thisx)->params >> 8) & 1)
+
typedef struct BgIkanaShutter {
/* 0x000 */ DynaPolyActor dyna;
/* 0x15C */ BgIkanaShutterActionFunc actionFunc;
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 f9a9fcc37..f7c0e5710 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
@@ -41,7 +41,7 @@ ActorInit Bg_Iknin_Susceil_InitVars = {
(ActorFunc)BgIkninSusceil_Draw,
};
-static s32 unused = 0;
+static s32 sPad = 0;
static f32 D_80C0B0E4 = 960.0f;
static Vec2f D_80C0B0E8 = { -320.0f, 0.0f };
static s8 D_80C0B0F0[] = { 0x00, 0x00, 0x07, 0x0A, 0x0A, 0x0B, 0x0B, 0x00 };
@@ -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,12 +158,12 @@ 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);
- Flags_UnsetSwitch(play, SUSCEIL_GET_SWITCHFLAG(&this->dyna.actor));
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_BIGWALL_BOUND);
+ BgIkninSusceil_RequestQuakeAndRumble(this, play, 4, 14, 1);
+ Flags_UnsetSwitch(play, SUSCEIL_GET_SWITCH_FLAG(&this->dyna.actor));
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_BIGWALL_BOUND);
func_80C0AC74(this);
} else {
- func_800B9010(&this->dyna.actor, NA_SE_EV_ICE_PILLAR_FALL - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_ICE_PILLAR_FALL - SFX_FLAG);
}
}
@@ -169,7 +173,7 @@ void func_80C0AC74(BgIkninSusceil* this) {
}
void func_80C0AC90(BgIkninSusceil* this, PlayState* play) {
- if (Flags_GetSwitch(play, SUSCEIL_GET_SWITCHFLAG(&this->dyna.actor))) {
+ if (Flags_GetSwitch(play, SUSCEIL_GET_SWITCH_FLAG(&this->dyna.actor))) {
func_80C0ACD4(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,11 +201,11 @@ 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);
+ Actor_PlaySfx_Flagged(&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);
}
}
@@ -230,7 +234,7 @@ void BgIkninSusceil_Update(Actor* thisx, PlayState* play) {
(player->unk_B48 > 1000.0f)) {
this->unk168 = 2;
if ((func_80C0A95C(this, play) != 0) && (this->actionFunc != func_80C0AE5C)) {
- func_800B8E58(player, NA_SE_PL_BODY_HIT);
+ Player_PlaySfx(player, NA_SE_PL_BODY_HIT);
func_80C0AE3C(this);
}
}
diff --git a/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.h b/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.h
index 2fa153ac0..faf29a022 100644
--- a/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.h
+++ b/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.h
@@ -3,7 +3,7 @@
#include "global.h"
-#define SUSCEIL_GET_SWITCHFLAG(thisx) (((thisx)->params) & 0x7F)
+#define SUSCEIL_GET_SWITCH_FLAG(thisx) (((thisx)->params) & 0x7F)
struct BgIkninSusceil;
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..ecf34c2ae 100644
--- a/src/overlays/actors/ovl_Bg_Ikninside/z_bg_ikninside.c
+++ b/src/overlays/actors/ovl_Bg_Ikninside/z_bg_ikninside.c
@@ -64,7 +64,7 @@ void BgIkninside_Init(Actor* thisx, PlayState* play) {
this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &this->dyna.actor, colHeader);
Collider_InitAndSetCylinder(play, &this->collider, &this->dyna.actor, &sCylinderInit);
Collider_UpdateCylinder(&this->dyna.actor, &this->collider);
- if (Flags_GetSwitch(play, DMIKNINSIDE_GET_SWITCH(thisx))) {
+ if (Flags_GetSwitch(play, DMIKNINSIDE_GET_SWITCH_FLAG(thisx))) {
Actor_Kill(&this->dyna.actor);
}
}
@@ -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);
}
}
@@ -118,10 +118,10 @@ void func_80C072D0(BgIkninside* this, PlayState* play) {
EffectSsHahen_Spawn(play, &pos, &velocity, &D_80C076D4, 0, 30, OBJECT_IKNINSIDE_OBJ, 25,
D_80C076A0[i & 1]);
}
- Flags_SetSwitch(play, DMIKNINSIDE_GET_SWITCH(&this->dyna.actor));
+ Flags_SetSwitch(play, DMIKNINSIDE_GET_SWITCH_FLAG(&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_Ikninside/z_bg_ikninside.h b/src/overlays/actors/ovl_Bg_Ikninside/z_bg_ikninside.h
index 84a66a88d..6cddba2f0 100644
--- a/src/overlays/actors/ovl_Bg_Ikninside/z_bg_ikninside.h
+++ b/src/overlays/actors/ovl_Bg_Ikninside/z_bg_ikninside.h
@@ -5,7 +5,7 @@
struct BgIkninside;
-#define DMIKNINSIDE_GET_SWITCH(thisx) (((thisx)->params & 0xFE00) >> 9)
+#define DMIKNINSIDE_GET_SWITCH_FLAG(thisx) (((thisx)->params & 0xFE00) >> 9)
typedef void (*BgIkninsideActionFunc)(struct BgIkninside*, PlayState*);
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..71fbb8d2f 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;
}
@@ -131,12 +131,12 @@ void func_80BD7250(BgIknvDoukutu* this, PlayState* play) {
this->dyna.actor.world.pos.y = temp_fv0;
this->actionFunc = func_80BD73D0;
}
- func_8019F128(NA_SE_EV_WATER_LEVEL_DOWN - SFX_FLAG);
+ Audio_PlaySfx_2(NA_SE_EV_WATER_LEVEL_DOWN - SFX_FLAG);
}
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 ba65baca4..540c393c6 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,33 +107,33 @@ 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;
}
void BgIknvObj_UpdateWaterwheel(BgIknvObj* this, PlayState* play) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_04)) {
this->dyna.actor.shape.rot.z -= 0x64;
- func_800B9098(&this->dyna.actor);
- func_800B9010(&this->dyna.actor, NA_SE_EV_WOOD_WATER_WHEEL - SFX_FLAG);
+ Actor_PlaySeq_FlaggedMusicBoxHouse(&this->dyna.actor);
+ Actor_PlaySfx_Flagged(&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)) {
- func_8019F128(NA_SE_EV_DOOR_UNLOCK);
+ if ((play->csCtx.state != CS_STATE_IDLE) && (gSaveContext.sceneLayer == 1) && (play->csCtx.scriptIndex == 4) &&
+ (play->csCtx.curFrame == 1495)) {
+ Audio_PlaySfx_2(NA_SE_EV_DOOR_UNLOCK);
}
}
@@ -146,10 +146,10 @@ s32 func_80BD7E0C(BgIknvObj* this, s16 targetRotation, PlayState* play) {
if ((play->gameplayFrames % 2) != 0) {
this->dyna.actor.shape.yOffset = 5.0f;
}
- func_800B9010(&this->dyna.actor, NA_SE_EV_STONEDOOR_OPEN_S - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_STONEDOOR_OPEN_S - SFX_FLAG);
return false;
}
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_STONEDOOR_STOP);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_STONEDOOR_STOP);
return true;
}
@@ -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 4bfa17c1c..05d4a27bf 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)) {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_CRUISER - SFX_FLAG);
+ } 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,23 +221,23 @@ 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) {
Player* player = GET_PLAYER(play);
if (this->unk160 & 0x4) {
- if ((player->transformation == PLAYER_FORM_HUMAN) && (player->actor.bgCheckFlags & 1) &&
+ 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();
}
@@ -276,38 +276,38 @@ void func_809543D4(BgIngate* this, PlayState* play) {
switch (this->dyna.actor.textId) {
case 0x9E4:
this->dyna.actor.textId = 0x9E5;
- func_80151938(play, this->dyna.actor.textId);
+ Message_ContinueTextbox(play, this->dyna.actor.textId);
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();
+ Audio_PlaySfx_MessageDecide();
} 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);
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
}
- func_801477B4(play);
+ Message_CloseTextbox(play);
break;
case 0x9E6:
if (play->msgCtx.choiceIndex == 0) {
func_80953EA4(this, play);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_90_40);
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
} 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();
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
}
- func_801477B4(play);
+ Message_CloseTextbox(play);
break;
}
}
@@ -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 12bfc0f3c..6cc7f7684 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
@@ -40,7 +40,7 @@ void BgKeikokuSaku_Init(Actor* thisx, PlayState* play) {
DynaPolyActor_Init(&this->dyna, 0);
CollisionHeader_GetVirtual(&object_keikoku_obj_Colheader_002300, &colHeader);
this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &this->dyna.actor, colHeader);
- this->switchFlag = BGKEIKOKUSAKU_GET_SWITCHFLAG(thisx);
+ this->switchFlag = BGKEIKOKUSAKU_GET_SWITCH_FLAG(thisx);
if (Flags_GetSwitch(play, this->switchFlag)) {
this->dyna.actor.world.pos.z = 2659.0f;
} else {
@@ -61,10 +61,10 @@ void func_80A5389C(BgKeikokuSaku* this, PlayState* play) {
}
void func_80A538E0(BgKeikokuSaku* this, PlayState* play) {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_METALGATE_OPEN - SFX_FLAG);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_METALGATE_OPEN - SFX_FLAG);
this->dyna.actor.world.pos.z -= 2.0f + BREG(8);
if (this->dyna.actor.world.pos.z < (BREG(9) + 2660.0f)) {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_BRIDGE_OPEN_STOP);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_BRIDGE_OPEN_STOP);
this->timer = 30;
this->actionFunc = func_80A53994;
}
@@ -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_Saku/z_bg_keikoku_saku.h b/src/overlays/actors/ovl_Bg_Keikoku_Saku/z_bg_keikoku_saku.h
index 6a3bad9c8..6db094693 100644
--- a/src/overlays/actors/ovl_Bg_Keikoku_Saku/z_bg_keikoku_saku.h
+++ b/src/overlays/actors/ovl_Bg_Keikoku_Saku/z_bg_keikoku_saku.h
@@ -3,7 +3,7 @@
#include "global.h"
-#define BGKEIKOKUSAKU_GET_SWITCHFLAG(thisx) ((thisx)->params & 0x7F)
+#define BGKEIKOKUSAKU_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
struct BgKeikokuSaku;
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 8afd5d730..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
@@ -16,7 +16,7 @@ void BgKeikokuSpr_Destroy(Actor* thisx, PlayState* play);
void BgKeikokuSpr_Update(Actor* thisx, PlayState* play);
void BgKeikokuSpr_Draw(Actor* thisx, PlayState* play);
-ActorInit Bg_Keikoku_Spr_InitVars = {
+const ActorInit Bg_Keikoku_Spr_InitVars = {
ACTOR_BG_KEIKOKU_SPR,
ACTORCAT_PROP,
FLAGS,
@@ -36,7 +36,9 @@ static InitChainEntry sInitChain[] = {
};
void BgKeikokuSpr_Init(Actor* thisx, PlayState* play) {
- Actor_ProcessInitChain(thisx, sInitChain);
+ BgKeikokuSpr* this = THIS;
+
+ Actor_ProcessInitChain(&this->actor, sInitChain);
}
void BgKeikokuSpr_Destroy(Actor* thisx, PlayState* play) {
@@ -53,8 +55,10 @@ void BgKeikokuSpr_Draw(Actor* thisx, PlayState* play) {
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);
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..5a8192bc4 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
@@ -145,7 +145,7 @@ void BgKin2Bombwall_Init(Actor* thisx, PlayState* play) {
DynaPolyActor_Init(&this->dyna, 0);
bombwallCollider = &this->collider;
Collider_InitCylinder(play, bombwallCollider);
- if (Flags_GetSwitch(play, BG_KIN2_BOMBWALL_SWITCH_FLAG(&this->dyna.actor))) {
+ if (Flags_GetSwitch(play, BG_KIN2_BOMBWALL_GET_SWITCH_FLAG(&this->dyna.actor))) {
Actor_Kill(&this->dyna.actor);
return;
}
@@ -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);
- Flags_SetSwitch(play, BG_KIN2_BOMBWALL_SWITCH_FLAG(&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_GET_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_Bombwall/z_bg_kin2_bombwall.h b/src/overlays/actors/ovl_Bg_Kin2_Bombwall/z_bg_kin2_bombwall.h
index 17370427a..553cd05b9 100644
--- a/src/overlays/actors/ovl_Bg_Kin2_Bombwall/z_bg_kin2_bombwall.h
+++ b/src/overlays/actors/ovl_Bg_Kin2_Bombwall/z_bg_kin2_bombwall.h
@@ -1,7 +1,7 @@
#ifndef Z_BG_KIN2_BOMBWALL_H
#define Z_BG_KIN2_BOMBWALL_H
-#define BG_KIN2_BOMBWALL_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
+#define BG_KIN2_BOMBWALL_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
#include "global.h"
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..3f68cad8d 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
@@ -161,7 +161,7 @@ void BgKin2Fence_Init(Actor* thisx, PlayState* play) {
Collider_UpdateSpheres(i, &this->collider);
}
- if (Flags_GetSwitch(play, this->dyna.actor.params & 0x7F)) {
+ if (Flags_GetSwitch(play, BG_KIN2_FENCE_GET_SWITCH_FLAG(&this->dyna.actor))) {
BgKin2Fence_SetupDoNothing(this);
return;
}
@@ -187,13 +187,13 @@ 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);
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
this->masksHit += 1;
BgKin2Fence_SpawnEyeSparkles(this, play, nextMask);
} else {
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->masksHit = 0;
}
}
@@ -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);
- Flags_SetSwitch(play, this->dyna.actor.params & 0x7F);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
+ Flags_SetSwitch(play, BG_KIN2_FENCE_GET_SWITCH_FLAG(&this->dyna.actor));
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_Fence/z_bg_kin2_fence.h b/src/overlays/actors/ovl_Bg_Kin2_Fence/z_bg_kin2_fence.h
index 98bb51243..7c864d3ae 100644
--- a/src/overlays/actors/ovl_Bg_Kin2_Fence/z_bg_kin2_fence.h
+++ b/src/overlays/actors/ovl_Bg_Kin2_Fence/z_bg_kin2_fence.h
@@ -7,6 +7,8 @@ struct BgKin2Fence;
typedef void (*BgKin2FenceActionFunc)(struct BgKin2Fence*, PlayState*);
+#define BG_KIN2_FENCE_GET_SWITCH_FLAG(thisx) (((thisx)->params) & 0x7F)
+
typedef struct BgKin2Fence {
/* 0x000 */ DynaPolyActor dyna;
/* 0x15C */ ColliderJntSph collider;
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 5892376ba..87a946964 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
@@ -105,7 +105,7 @@ void BgKin2Picture_SpawnSkulltula(BgKin2Picture* this, PlayState* play2) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_SW, this->dyna.actor.home.pos.x,
this->dyna.actor.home.pos.y + 23.0f, this->dyna.actor.home.pos.z, 0,
this->dyna.actor.home.rot.y, 0, skulltulaSpawnParams)) {
- play_sound(NA_SE_SY_TRE_BOX_APPEAR);
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
}
}
}
@@ -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,12 +202,12 @@ 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) {
if (this->skulltulaNoiseTimer == 0) {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EN_STALGOLD_ROLL);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EN_STALGOLD_ROLL);
if (Rand_ZeroOne() < 0.1f) {
this->skulltulaNoiseTimer = Rand_S16Offset(40, 80);
@@ -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,9 +281,9 @@ 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 & 1) {
+ if (this->dyna.actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
Math_StepToS(&this->step, 0x7D0, 0x78);
if (this->landTimer < 3) {
@@ -297,7 +297,7 @@ void BgKin2Picture_Fall(BgKin2Picture* this, PlayState* play) {
}
if (this->landTimer < 3) {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_SMALL_WOODPLATE_BOUND_0);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_SMALL_WOODPLATE_BOUND_0);
}
}
}
@@ -314,11 +314,11 @@ 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);
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_WOODPLATE_BROKEN);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_WOODPLATE_BROKEN);
BgKin2Picture_SetupDoNothing(this);
} else {
this->dyna.actor.shape.yOffset = Math_SinS(this->dyna.actor.shape.rot.x) * 40.0f;
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..980b0fa01 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);
}
@@ -307,7 +307,7 @@ void func_80B70230(BgKin2Shelf* this, PlayState* play) {
this->dyna.actor.world.pos.z = ((Math_CosS(sp36) * phi_f20) * D_80B70750[sp40]) + this->dyna.actor.home.pos.z;
if (this->unk_166 != 0) {
- play_sound(NA_SE_SY_TRE_BOX_APPEAR);
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
}
func_80B700A8(this);
} else {
@@ -353,7 +353,7 @@ void func_80B704B4(BgKin2Shelf* this, PlayState* play) {
this->dyna.actor.world.pos.z = ((Math_CosS(sp36) * temp_f20) * D_80B70758[sp40]) + this->dyna.actor.home.pos.z;
if (this->unk_167 != 0) {
- play_sound(NA_SE_SY_TRE_BOX_APPEAR);
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
}
func_80B700A8(this);
} else {
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 f766fef78..12cd5d334 100644
--- a/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.c
+++ b/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.c
@@ -49,7 +49,7 @@ void BgLadder_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
- this->switchFlag = BGLADDER_GET_SWITCHFLAG(thisx);
+ this->switchFlag = BGLADDER_GET_SWITCH_FLAG(thisx);
thisx->params = BGLADDER_GET_SIZE(thisx);
DynaPolyActor_Init(&this->dyna, 0);
size = thisx->params;
@@ -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_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_SECRET_LADDER_APPEAR);
+ 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..4b06a32e8 100644
--- a/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.h
+++ b/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.h
@@ -4,7 +4,7 @@
#include "global.h"
#define BGLADDER_GET_SIZE(thisx) ((thisx)->params & 0xFF)
-#define BGLADDER_GET_SWITCHFLAG(thisx) (((thisx)->params >> 8) & 0xFF)
+#define BGLADDER_GET_SWITCH_FLAG(thisx) (((thisx)->params >> 8) & 0xFF)
struct BgLadder;
@@ -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 d704adf86..b74fdbd6d 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,10 +149,10 @@ 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))) {
+ if (Flags_GetSwitch(play, BGLASTBWALL_GET_SWITCH_FLAG(&this->dyna.actor))) {
Actor_Kill(&this->dyna.actor);
return;
}
@@ -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);
}
@@ -225,9 +225,9 @@ void func_80C187E4(BgLastBwall* this) {
}
void func_80C187F8(BgLastBwall* this, PlayState* play) {
- if (this->colliderTris.base.acFlags & 2) {
- this->colliderTris.base.acFlags &= ~2;
- Flags_SetSwitch(play, BGLASTBWALL_GET_SWITCHFLAGS(&this->dyna.actor));
+ if (this->colliderTris.base.acFlags & AC_HIT) {
+ this->colliderTris.base.acFlags &= ~AC_HIT;
+ Flags_SetSwitch(play, BGLASTBWALL_GET_SWITCH_FLAG(&this->dyna.actor));
func_80C1886C(this, play);
} else {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->colliderTris.base);
@@ -239,16 +239,16 @@ 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_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_WALL_BROKEN);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_WALL_BROKEN);
this->actionFunc = BgLastBwall_DoNothing;
}
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..0e6568611 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
@@ -8,12 +8,12 @@ struct BgLastBwall;
typedef void (*BgLastBwallActionFunc)(struct BgLastBwall*, PlayState*);
-#define BGLASTBWALL_GET_SWITCHFLAGS(thisx) ((thisx)->params & 0x7F)
+#define BGLASTBWALL_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
#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_Lotus/z_bg_lotus.c b/src/overlays/actors/ovl_Bg_Lotus/z_bg_lotus.c
index 20be54a2f..cd125e943 100644
--- a/src/overlays/actors/ovl_Bg_Lotus/z_bg_lotus.c
+++ b/src/overlays/actors/ovl_Bg_Lotus/z_bg_lotus.c
@@ -1,9 +1,3 @@
-/*
- * File: z_bg_lotus.c
- * Overlay: ovl_Bg_Lotus
- * Description: Southern Swamp Lilypads
- */
-
#include "z_bg_lotus.h"
#include "objects/object_lotus/object_lotus.h"
@@ -16,9 +10,9 @@ void BgLotus_Destroy(Actor* thisx, PlayState* play);
void BgLotus_Update(Actor* thisx, PlayState* play);
void BgLotus_Draw(Actor* thisx, PlayState* play);
-void BgLotus_Wait(BgLotus* this, PlayState* play);
-void BgLotus_Sink(BgLotus* this, PlayState* play);
-void BgLotus_WaitToAppear(BgLotus* this, PlayState* play);
+void func_80AD68DC(BgLotus* this, PlayState* play);
+void func_80AD6A88(BgLotus* this, PlayState* play);
+void func_80AD6B68(BgLotus* this, PlayState* play);
ActorInit Bg_Lotus_InitVars = {
ACTOR_BG_LOTUS,
@@ -39,16 +33,16 @@ static InitChainEntry sInitChain[] = {
void BgLotus_Init(Actor* thisx, PlayState* play) {
BgLotus* this = THIS;
s32 pad;
- s32 bgId;
+ s32 sp2C;
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, &gLilyPadCol);
- this->dyna.actor.floorHeight = BgCheck_EntityRaycastFloor5(&play->colCtx, &thisx->floorPoly, &bgId,
+ this->dyna.actor.floorHeight = BgCheck_EntityRaycastFloor5(&play->colCtx, &this->dyna.actor.floorPoly, &sp2C,
&this->dyna.actor, &this->dyna.actor.world.pos);
- this->timer2 = 96;
+ this->unk168 = 0x60;
this->dyna.actor.world.rot.y = (s32)Rand_Next() >> 0x10;
- this->actionFunc = BgLotus_Wait;
+ this->actionFunc = func_80AD68DC;
}
void BgLotus_Destroy(Actor* thisx, PlayState* play) {
@@ -57,104 +51,95 @@ void BgLotus_Destroy(Actor* thisx, PlayState* play) {
DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
}
-void BgLotus_SetScaleXZ(BgLotus* this) {
- f32 scale;
+void func_80AD6830(BgLotus* this) {
+ f32 temp_fv1;
if (this->dyna.actor.params == 0) {
- scale = sin_rad(this->timer * 0.7853982f) * ((0.014f * ((f32)this->timer / 8)) + 0.01f);
- this->dyna.actor.scale.x = (1.0f + scale) * 0.1f;
- this->dyna.actor.scale.z = (1.0f - scale) * 0.1f;
+ temp_fv1 = Math_SinF(this->unk166 * (M_PI / 4)) * ((0.014f * (this->unk166 / (80.0f * 0.1f))) + 0.01f);
+ this->dyna.actor.scale.x = (1.0f + temp_fv1) * 0.1f;
+ this->dyna.actor.scale.z = (1.0f - temp_fv1) * 0.1f;
}
}
-void BgLotus_Wait(BgLotus* this, PlayState* play) {
- f32 moveDist; // distance for the xz position of the lilypad to move
+void func_80AD68DC(BgLotus* this, PlayState* play) {
+ f32 sp34;
- this->timer2--;
-
- moveDist = sin_rad(this->timer2 * 0.06544985f) * 6.0f;
+ this->unk168--;
+ sp34 = Math_SinF(this->unk168 * (M_PI / 48)) * 6.0f;
if (this->dyna.actor.params == 0) {
- this->dyna.actor.world.pos.x =
- (Math_SinS(this->dyna.actor.world.rot.y) * moveDist) + this->dyna.actor.home.pos.x;
- this->dyna.actor.world.pos.z =
- (Math_CosS(this->dyna.actor.world.rot.y) * moveDist) + this->dyna.actor.home.pos.z;
-
- if (this->timer2 == 0) {
- this->timer2 = 96;
+ this->dyna.actor.world.pos.x = (Math_SinS(this->dyna.actor.world.rot.y) * sp34) + this->dyna.actor.home.pos.x;
+ this->dyna.actor.world.pos.z = (Math_CosS(this->dyna.actor.world.rot.y) * sp34) + this->dyna.actor.home.pos.z;
+ if (this->unk168 == 0) {
+ this->unk168 = 0x60;
this->dyna.actor.world.rot.y += (s16)((s32)Rand_Next() >> 0x12);
}
}
-
- if (this->height < this->dyna.actor.floorHeight) {
+ if (this->unk160 < this->dyna.actor.floorHeight) {
this->dyna.actor.world.pos.y = this->dyna.actor.floorHeight;
} else {
- this->dyna.actor.world.pos.y = this->height;
-
- if (DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
- if (this->hasSpawnedRipples == 0) {
- EffectSsGRipple_Spawn(play, &this->dyna.actor.world.pos, 1000, 1400, 0);
- EffectSsGRipple_Spawn(play, &this->dyna.actor.world.pos, 1000, 1400, 8);
- this->timer = 40;
+ this->dyna.actor.world.pos.y = this->unk160;
+ if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
+ if (!this->unk164) {
+ EffectSsGRipple_Spawn(play, &this->dyna.actor.world.pos, 0x3E8, 0x578, 0);
+ EffectSsGRipple_Spawn(play, &this->dyna.actor.world.pos, 0x3E8, 0x578, 8);
+ this->unk166 = 40;
}
if (gSaveContext.save.playerForm != PLAYER_FORM_DEKU) {
- this->timer = 40;
+ this->unk166 = 40;
this->dyna.actor.flags |= ACTOR_FLAG_10;
- this->actionFunc = BgLotus_Sink;
+ this->actionFunc = func_80AD6A88;
return;
}
-
- this->hasSpawnedRipples = 1;
+ this->unk164 = true;
} else {
- this->hasSpawnedRipples = 0;
+ this->unk164 = false;
}
}
-
- if (this->timer > 0) {
- this->timer--;
+ if (this->unk166 > 0) {
+ this->unk166--;
}
-
- BgLotus_SetScaleXZ(this);
+ func_80AD6830(this);
}
-void BgLotus_Sink(BgLotus* this, PlayState* play) {
- if (this->height < this->dyna.actor.world.pos.y) {
- this->dyna.actor.world.pos.y = this->height;
+void func_80AD6A88(BgLotus* this, PlayState* play) {
+ if (this->dyna.actor.world.pos.y > this->unk160) {
+ this->dyna.actor.world.pos.y = this->unk160;
}
-
this->dyna.actor.world.pos.y -= 1.0f;
-
if (this->dyna.actor.world.pos.y <= this->dyna.actor.floorHeight) {
this->dyna.actor.world.pos.y = this->dyna.actor.floorHeight;
- this->timer = 0;
+ this->unk166 = 0;
}
-
- if (this->timer > 0) {
- this->timer--;
- BgLotus_SetScaleXZ(this);
+ if (this->unk166 > 0) {
+ this->unk166--;
+ func_80AD6830(this);
} else {
- if (Math_StepToF(&this->dyna.actor.scale.x, 0, 0.0050000003539f)) {
+ if (Math_StepToF(&this->dyna.actor.scale.x, 0.0f, 5.0f * 0.001f)) {
this->dyna.actor.draw = NULL;
- this->timer = 100;
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
- this->actionFunc = BgLotus_WaitToAppear;
+ this->unk166 = 100;
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
+ this->actionFunc = func_80AD6B68;
}
-
this->dyna.actor.scale.z = this->dyna.actor.scale.x;
}
}
-void BgLotus_WaitToAppear(BgLotus* this, PlayState* play) {
- if (this->timer > 0) {
- this->timer--;
+void func_80AD6B68(BgLotus* this, PlayState* play) {
+ if (this->unk166 > 0) {
+ this->unk166--;
} else if ((this->dyna.actor.xzDistToPlayer > 100.0f) && (this->dyna.actor.projectedPos.z < 0.0f)) {
this->dyna.actor.draw = BgLotus_Draw;
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
Actor_SetScale(&this->dyna.actor, 0.1f);
- this->dyna.actor.world.pos.y = CLAMP_MIN(this->height, this->dyna.actor.floorHeight);
+ if (this->unk160 < this->dyna.actor.floorHeight) {
+ this->dyna.actor.world.pos.y = this->dyna.actor.floorHeight;
+ } else {
+ this->dyna.actor.world.pos.y = this->unk160;
+ }
this->dyna.actor.flags &= ~ACTOR_FLAG_10;
- this->timer2 = 96;
- this->actionFunc = BgLotus_Wait;
+ this->unk168 = 0x60;
+ this->actionFunc = func_80AD68DC;
this->dyna.actor.world.pos.x = this->dyna.actor.home.pos.x;
this->dyna.actor.world.pos.z = this->dyna.actor.home.pos.z;
}
@@ -163,13 +148,15 @@ void BgLotus_WaitToAppear(BgLotus* this, PlayState* play) {
void BgLotus_Update(Actor* thisx, PlayState* play) {
BgLotus* this = THIS;
s32 pad;
- WaterBox* waterBox;
+ WaterBox* sp2C;
WaterBox_GetSurface1_2(play, &play->colCtx, this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.z,
- &this->height, &waterBox);
+ &this->unk160, &sp2C);
this->actionFunc(this, play);
}
void BgLotus_Draw(Actor* thisx, PlayState* play) {
+ BgLotus* this = THIS;
+
Gfx_DrawDListOpa(play, gLilyPadDL);
}
diff --git a/src/overlays/actors/ovl_Bg_Lotus/z_bg_lotus.h b/src/overlays/actors/ovl_Bg_Lotus/z_bg_lotus.h
index 540c21b0e..d2a3d5e7d 100644
--- a/src/overlays/actors/ovl_Bg_Lotus/z_bg_lotus.h
+++ b/src/overlays/actors/ovl_Bg_Lotus/z_bg_lotus.h
@@ -10,10 +10,10 @@ typedef void (*BgLotusActionFunc)(struct BgLotus*, PlayState*);
typedef struct BgLotus {
/* 0x000 */ DynaPolyActor dyna;
/* 0x15C */ BgLotusActionFunc actionFunc;
- /* 0x160 */ f32 height;
- /* 0x164 */ u8 hasSpawnedRipples;
- /* 0x166 */ s16 timer;
- /* 0x168 */ s16 timer2;
+ /* 0x160 */ f32 unk160;
+ /* 0x164 */ u8 unk164;
+ /* 0x166 */ s16 unk166;
+ /* 0x168 */ s16 unk168;
} BgLotus; // size = 0x16C
#endif // Z_BG_LOTUS_H
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 497ed10ab..91ea969e2 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
@@ -63,7 +63,7 @@ static ColliderCylinderInit sCylinderInit = {
};
static FireObjInitParams sFireObjInit = {
- 0.00405000010505f, 0.0500000007451f, 3, 1, 0, 0, 0,
+ 0.00405f, 1.0f / 20.0f, FIRE_STATE_NOT_LIT, 1, 0, 0, 0,
};
static s16 sInitialAnglePerPetal[] = { 0x0000, 0x2AAA, 0x5555, 0x8000, 0xAAAA, 0xD555 };
@@ -77,7 +77,7 @@ static InitChainEntry sInitChain[] = {
/**
* Spawns another wooden flower instance that handles the opened flower's collision.
- * Returns true if this wooden flower instance was succesfully spawned.
+ * Returns true if this wooden flower instance was successfully spawned.
*/
s32 BgNumaHana_SpawnOpenFlowerCollisionChild(BgNumaHana* this, PlayState* play) {
Actor* child;
@@ -100,9 +100,9 @@ void BgNumaHana_UpdatePetalPosRots(BgNumaHana* this) {
s32 i;
innerPetalYPos = this->dyna.actor.world.pos.y + -10.0f;
- angle = this->petalZRotation - 0x2000;
+ angle = this->petalRotZ - 0x2000;
outerPetalPosScale = (Math_CosS(angle) * 77.42784f) + 74.95192f;
- outerPetalYPos = (Math_SinS(this->petalZRotation) * 77.42784f) + this->dyna.actor.world.pos.y + -64.74976f;
+ outerPetalYPos = (Math_SinS(this->petalRotZ) * 77.42784f) + this->dyna.actor.world.pos.y + -64.74976f;
for (i = 0; i < ARRAY_COUNT(this->innerPetalPosRot); i++) {
innerPetalPosRot = &this->innerPetalPosRot[i];
@@ -114,14 +114,14 @@ void BgNumaHana_UpdatePetalPosRots(BgNumaHana* this) {
innerPetalPosRot->pos.z = (Math_CosS(angle) * 74.95192f) + this->dyna.actor.world.pos.z;
innerPetalPosRot->rot.x = this->dyna.actor.shape.rot.x;
innerPetalPosRot->rot.y = angle - 0x4000;
- innerPetalPosRot->rot.z = this->dyna.actor.shape.rot.z + this->petalZRotation;
+ innerPetalPosRot->rot.z = this->dyna.actor.shape.rot.z + this->petalRotZ;
outerPetalPosRot->pos.x = (Math_SinS(angle) * outerPetalPosScale) + this->dyna.actor.world.pos.x;
outerPetalPosRot->pos.y = outerPetalYPos;
outerPetalPosRot->pos.z = (Math_CosS(angle) * outerPetalPosScale) + this->dyna.actor.world.pos.z;
outerPetalPosRot->rot.x = innerPetalPosRot->rot.x;
outerPetalPosRot->rot.y = innerPetalPosRot->rot.y;
- outerPetalPosRot->rot.z = innerPetalPosRot->rot.z + this->outerPetalZRotation;
+ outerPetalPosRot->rot.z = innerPetalPosRot->rot.z + this->outerPetalRotZ;
}
}
@@ -130,10 +130,10 @@ void BgNumaHana_UpdatePetalPosRots(BgNumaHana* this) {
* as if they are "settling" into place. This function is responsible
* for computing the extra rotation for this "settling".
*/
-void BgNumaHana_UpdateSettleRotation(s16* settleZRotation, s16* settleAngle, f32* settleScale, f32 scaleStep) {
+void BgNumaHana_UpdateSettleRotation(s16* settleRotZ, s16* settleAngle, f32* settleScale, f32 scaleStep) {
*settleAngle += 0x32C8;
Math_StepToF(settleScale, 0.0f, scaleStep);
- *settleZRotation += (s16)(Math_SinS(*settleAngle) * *settleScale);
+ *settleRotZ += (s16)(Math_SinS(*settleAngle) * *settleScale);
}
void BgNumaHana_Init(Actor* thisx, PlayState* play) {
@@ -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,25 +162,25 @@ 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;
- this->innerPetalZRotationalVelocity = 0;
- this->settleZRotation = 0;
+ this->petalRotZ = 0x2000;
+ this->innerPetalRotZ = 0x2000;
+ this->innerPetalAngularVelocityZ = 0;
+ this->settleRotZ = 0;
this->settleAngle = 0;
this->settleScale = 0.0f;
- this->outerPetalZRotation = -0x4000;
- this->outerPetalZRotationalVelocity = 0;
- this->flowerRotationalVelocity = 0x147;
+ this->outerPetalRotZ = -0x4000;
+ this->outerPetalAngularVelocityZ = 0;
+ this->flowerAngularVelocity = 0x147;
this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y + 210.0f;
- FireObj_SetState2(&this->fire, 0.05f, 2);
+ FireObj_SetState2(&this->fire, 0.05f, FIRE_STATE_FULLY_LIT);
Flags_SetSwitch(play, BG_NUMA_HANA_SWITCH_FLAG(&this->dyna.actor));
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);
}
@@ -215,15 +215,15 @@ void BgNumaHana_SetupClosedIdle(BgNumaHana* this) {
* the cutscene where the petals unfold.
*/
void BgNumaHana_ClosedIdle(BgNumaHana* this, PlayState* play) {
- if (this->fire.state != 3) {
- Actor_PlaySfxAtPos(&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 (this->fire.state != FIRE_STATE_NOT_LIT) {
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_FLAME_IGNITION);
+ 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);
}
}
}
@@ -238,25 +238,25 @@ void BgNumaHana_SetupUnfoldInnerPetals(BgNumaHana* this) {
* parts of the petals that are closest to the stalk.
*/
void BgNumaHana_UnfoldInnerPetals(BgNumaHana* this, PlayState* play) {
- Math_StepToS(&this->innerPetalZRotationalVelocity, 240, 14);
- if (Math_ScaledStepToS(&this->innerPetalZRotation, 0x2000, this->innerPetalZRotationalVelocity)) {
+ Math_StepToS(&this->innerPetalAngularVelocityZ, 240, 14);
+ if (Math_ScaledStepToS(&this->innerPetalRotZ, 0x2000, this->innerPetalAngularVelocityZ)) {
if (this->transitionTimer >= 11) {
BgNumaHana_SetupUnfoldOuterPetals(this);
} else {
if (this->transitionTimer <= 0) {
- this->settleZRotation = 0;
+ this->settleRotZ = 0;
this->settleAngle = 0;
this->settleScale = 420.0f;
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_FLOWERPETAL_STOP);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_FLOWERPETAL_STOP);
}
this->transitionTimer++;
}
} else {
- func_800B9010(&this->dyna.actor, NA_SE_EV_FLOWERPETAL_MOVE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_FLOWERPETAL_MOVE - SFX_FLAG);
}
- BgNumaHana_UpdateSettleRotation(&this->settleZRotation, &this->settleAngle, &this->settleScale, 20.0f);
- this->petalZRotation = this->innerPetalZRotation + this->settleZRotation;
+ BgNumaHana_UpdateSettleRotation(&this->settleRotZ, &this->settleAngle, &this->settleScale, 20.0f);
+ this->petalRotZ = this->innerPetalRotZ + this->settleRotZ;
BgNumaHana_UpdatePetalPosRots(this);
}
@@ -270,25 +270,25 @@ void BgNumaHana_SetupUnfoldOuterPetals(BgNumaHana* this) {
* parts of the petals that are furthest to the stalk.
*/
void BgNumaHana_UnfoldOuterPetals(BgNumaHana* this, PlayState* play) {
- Math_StepToS(&this->outerPetalZRotationalVelocity, 240, 14);
- if (Math_ScaledStepToS(&this->outerPetalZRotation, -0x4000, this->outerPetalZRotationalVelocity)) {
+ Math_StepToS(&this->outerPetalAngularVelocityZ, 240, 14);
+ if (Math_ScaledStepToS(&this->outerPetalRotZ, -0x4000, this->outerPetalAngularVelocityZ)) {
if (this->transitionTimer >= 11) {
BgNumaHana_SetupRaiseFlower(this);
} else {
if (this->transitionTimer <= 0) {
- this->settleZRotation = 0;
+ this->settleRotZ = 0;
this->settleAngle = 0x5120;
this->settleScale = 130.0f;
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_FLOWERPETAL_STOP);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_FLOWERPETAL_STOP);
}
this->transitionTimer++;
}
} else {
- func_800B9010(&this->dyna.actor, NA_SE_EV_FLOWERPETAL_MOVE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_FLOWERPETAL_MOVE - SFX_FLAG);
}
- BgNumaHana_UpdateSettleRotation(&this->settleZRotation, &this->settleAngle, &this->settleScale, 7.0f);
- this->petalZRotation = this->innerPetalZRotation + this->settleZRotation;
+ BgNumaHana_UpdateSettleRotation(&this->settleRotZ, &this->settleAngle, &this->settleScale, 7.0f);
+ this->petalRotZ = this->innerPetalRotZ + this->settleRotZ;
BgNumaHana_UpdatePetalPosRots(this);
}
@@ -303,10 +303,10 @@ void BgNumaHana_RaiseFlower(BgNumaHana* this, PlayState* play) {
s32 pad;
DynaPolyActor* child;
- BgNumaHana_UpdateSettleRotation(&this->settleZRotation, &this->settleAngle, &this->settleScale, 10.0f);
- this->petalZRotation = this->innerPetalZRotation + this->settleZRotation;
- Math_StepToS(&this->flowerRotationalVelocity, 0x111, 0xA);
- this->dyna.actor.shape.rot.y += this->flowerRotationalVelocity;
+ BgNumaHana_UpdateSettleRotation(&this->settleRotZ, &this->settleAngle, &this->settleScale, 10.0f);
+ this->petalRotZ = this->innerPetalRotZ + this->settleRotZ;
+ Math_StepToS(&this->flowerAngularVelocity, 0x111, 0xA);
+ this->dyna.actor.shape.rot.y += this->flowerAngularVelocity;
Math_StepToF(&this->dyna.actor.velocity.y, 3.0f, 0.3f);
if (Math_StepToF(&this->dyna.actor.world.pos.y, this->dyna.actor.home.pos.y + 210.0f,
@@ -314,25 +314,25 @@ 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;
- this->innerPetalZRotationalVelocity = 0;
- this->settleZRotation = 0;
+ this->petalRotZ = 0x2000;
+ this->innerPetalRotZ = 0x2000;
+ this->innerPetalAngularVelocityZ = 0;
+ this->settleRotZ = 0;
this->settleAngle = 0;
- this->outerPetalZRotation = -0x4000;
- this->outerPetalZRotationalVelocity = 0;
- this->flowerRotationalVelocity = 0x147;
+ this->outerPetalRotZ = -0x4000;
+ this->outerPetalAngularVelocityZ = 0;
+ this->flowerAngularVelocity = 0x147;
this->settleScale = 0.0f;
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
BgNumaHana_SetupOpenedIdle(this);
}
BgNumaHana_UpdatePetalPosRots(this);
- func_800B9010(&this->dyna.actor, NA_SE_EV_FLOWER_ROLLING - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_FLOWER_ROLLING - SFX_FLAG);
}
void BgNumaHana_SetupOpenedIdle(BgNumaHana* this) {
@@ -343,10 +343,10 @@ void BgNumaHana_SetupOpenedIdle(BgNumaHana* this) {
* Spins the "opened" flower around the y-axis.
*/
void BgNumaHana_OpenedIdle(BgNumaHana* this, PlayState* play) {
- this->dyna.actor.shape.rot.y += this->flowerRotationalVelocity;
- this->petalZRotation = this->innerPetalZRotation + this->settleZRotation;
+ this->dyna.actor.shape.rot.y += this->flowerAngularVelocity;
+ this->petalRotZ = this->innerPetalRotZ + this->settleRotZ;
BgNumaHana_UpdatePetalPosRots(this);
- func_800B9010(&this->dyna.actor, NA_SE_EV_FLOWER_ROLLING - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_FLOWER_ROLLING - SFX_FLAG);
}
void BgNumaHana_Update(Actor* thisx, PlayState* play) {
@@ -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);
@@ -404,13 +404,13 @@ void BgNumaHana_Draw(Actor* thisx, PlayState* play2) {
gSPDisplayList(POLY_OPA_DISP++, gWoodenFlowerOuterPetalDL);
}
- objectIndex = Object_GetIndex(&play->objectCtx, OBJECT_SYOKUDAI);
+ objectIndex = Object_GetSlot(&play->objectCtx, OBJECT_SYOKUDAI);
if ((objectIndex >= 0) && (Object_IsLoaded(&play->objectCtx, objectIndex))) {
Matrix_SetTranslateRotateYXZ(this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y - 64.5f,
this->dyna.actor.world.pos.z, &this->dyna.actor.shape.rot);
Matrix_Scale(1.5f, 1.5f, 1.5f, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[objectIndex].segment);
+ gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[objectIndex].segment);
gSPDisplayList(POLY_OPA_DISP++, gObjectSyokudaiTypeNoSwitchDL);
}
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 fd71577cd..25a6283eb 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
@@ -2,13 +2,14 @@
#define Z_BG_NUMA_HANA_H
#include "global.h"
+#include "z_fireobj.h"
#define BG_NUMA_HANA_GET_TYPE(thisx) ((thisx)->params & 1)
#define BG_NUMA_HANA_SWITCH_FLAG(thisx) (((thisx)->params >> 8) & 0x7F)
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;
@@ -28,15 +29,15 @@ typedef struct BgNumaHana {
/* 0x234 */ BgNumaHanaActionFunc actionFunc;
/* 0x238 */ WoodenFlowerPetalPosRot innerPetalPosRot[6];
/* 0x2B0 */ WoodenFlowerPetalPosRot outerPetalPosRot[6];
- /* 0x328 */ s16 petalZRotation;
- /* 0x32A */ s16 innerPetalZRotation;
- /* 0x32C */ s16 innerPetalZRotationalVelocity;
- /* 0x32E */ s16 settleZRotation;
+ /* 0x328 */ s16 petalRotZ;
+ /* 0x32A */ s16 innerPetalRotZ;
+ /* 0x32C */ s16 innerPetalAngularVelocityZ;
+ /* 0x32E */ s16 settleRotZ;
/* 0x330 */ s16 settleAngle;
/* 0x334 */ f32 settleScale;
- /* 0x338 */ s16 outerPetalZRotation;
- /* 0x33A */ s16 outerPetalZRotationalVelocity;
- /* 0x33C */ s16 flowerRotationalVelocity;
+ /* 0x338 */ s16 outerPetalRotZ;
+ /* 0x33A */ s16 outerPetalAngularVelocityZ;
+ /* 0x33C */ s16 flowerAngularVelocity;
/* 0x33E */ s16 transitionTimer;
} BgNumaHana; // size = 0x340
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 c264b9775..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_PlaySfxAtPos(&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_PlaySfxAtPos(&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_PlaySfxAtPos(&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_PlaySfxAtPos(&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_PlaySfxAtPos(&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 2ec37cb7e..f7b428837 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
@@ -12,6 +12,7 @@
*/
#include "z_bg_sinkai_kabe.h"
+#include "overlays/actors/ovl_En_Ot/z_en_ot.h"
#include "objects/object_sinkai_kabe/object_sinkai_kabe.h"
#define FLAGS (ACTOR_FLAG_10)
@@ -45,7 +46,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 +55,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 +75,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,8 +100,8 @@ 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.unk20, NULL);
+ this->dyna.actor.shape.rot.y, 0, SEAHORSE_PARAMS(SEAHORSE_TYPE_1, 0, 0),
+ this->dyna.actor.csId, this->dyna.actor.halfDaysBits, NULL);
}
Actor_Kill(&this->dyna.actor);
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 fb8d464c8..ec3961fd7 100644
--- a/src/overlays/actors/ovl_Bg_Spdweb/z_bg_spdweb.c
+++ b/src/overlays/actors/ovl_Bg_Spdweb/z_bg_spdweb.c
@@ -148,9 +148,9 @@ void BgSpdweb_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
this->unk_161 = 0;
- this->switchFlag = BGSPDWEB_GET_SWITCHFLAG(&this->dyna.actor);
+ this->switchFlag = BGSPDWEB_GET_SWITCH_FLAG(&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;
@@ -314,7 +314,7 @@ void func_809CE4C8(BgSpdweb* this, PlayState* play) {
player->stateFlags1 |= PLAYER_STATE1_20;
this->unk_161 = 1;
}
- } else if (player->actor.speedXZ != 0.0f) {
+ } else if (player->actor.speed != 0.0f) {
this->unk_164 = CLAMP_MIN(this->unk_164, 2.0f);
}
}
@@ -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;
@@ -336,7 +336,7 @@ void func_809CE4C8(BgSpdweb* this, PlayState* play) {
}
} else if (this->unk_162 == 11) {
if (this->unk_164 > 3.0f) {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_WEB_VIBRATION);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_WEB_VIBRATION);
} else {
AudioSfx_StopById(NA_SE_EV_WEB_VIBRATION);
}
@@ -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);
@@ -450,7 +450,7 @@ void func_809CEBC0(BgSpdweb* this, PlayState* play) {
this->dyna.actor.world.pos.z;
}
func_809CEE74(this);
- } else if ((player->heldItemAction == PLAYER_IA_STICK) && (player->unk_B28 != 0)) {
+ } else if ((player->heldItemAction == PLAYER_IA_DEKU_STICK) && (player->unk_B28 != 0)) {
Math_Vec3f_Diff(&player->meleeWeaponInfo[0].tip, &this->dyna.actor.world.pos, &sp3C);
sp38 = Math_SinS(-this->dyna.actor.shape.rot.x);
sp34 = Math_CosS(-this->dyna.actor.shape.rot.x);
@@ -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_Spdweb/z_bg_spdweb.h b/src/overlays/actors/ovl_Bg_Spdweb/z_bg_spdweb.h
index c57353ce0..7737fc684 100644
--- a/src/overlays/actors/ovl_Bg_Spdweb/z_bg_spdweb.h
+++ b/src/overlays/actors/ovl_Bg_Spdweb/z_bg_spdweb.h
@@ -7,7 +7,7 @@ struct BgSpdweb;
typedef void (*BgSpdwebActionFunc)(struct BgSpdweb*, PlayState*);
-#define BGSPDWEB_GET_SWITCHFLAG(thisx) (((thisx)->params >> 8) & 0x7F)
+#define BGSPDWEB_GET_SWITCH_FLAG(thisx) (((thisx)->params >> 8) & 0x7F)
#define BGSPDWEB_FF_0 0
#define BGSPDWEB_FF_1 1
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..796f66d3f 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
@@ -179,7 +179,7 @@ void BgSpoutFire_Update(Actor* thisx, PlayState* play) {
func_80A60E08(this, play);
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- func_800B9010(&this->actor, NA_SE_EV_FIRE_PLATE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_FIRE_PLATE - SFX_FLAG);
}
}
@@ -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 d6617ef1c..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,7 @@ void BgTobira01_Destroy(Actor* thisx, PlayState* play);
void BgTobira01_Update(Actor* thisx, PlayState* play);
void BgTobira01_Draw(Actor* thisx, PlayState* play);
-ActorInit Bg_Tobira01_InitVars = {
+const ActorInit Bg_Tobira01_InitVars = {
ACTOR_BG_TOBIRA01,
ACTORCAT_PROP,
FLAGS,
@@ -28,74 +28,69 @@ ActorInit Bg_Tobira01_InitVars = {
(ActorFunc)BgTobira01_Draw,
};
-void BgTobira01_Open(BgTobira01* this, PlayState* play) {
+void BgTobira01_Action(BgTobira01* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- s16 cutsceneId = this->dyna.actor.cutscene;
- s16 prevTimer;
+ s16 csId = this->dyna.actor.csId;
+ s16 prevPosYTick;
- if (this->playCutscene) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- } else if (ActorCutscene_GetCanPlayNext(cutsceneId)) {
- ActorCutscene_StartAndSetUnkLinkFields(cutsceneId, &this->dyna.actor);
- SET_WEEKEVENTREG(WEEKEVENTREG_88_40);
- this->playCutscene = false;
+ 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 {
- ActorCutscene_SetIntentToPlay(cutsceneId);
+ CutsceneManager_Queue(csId);
}
- } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_88_40) && (this->timer == 0) && (play->actorCtx.unk1F5 != 0) &&
- (play->actorCtx.unk1F4 == 0) &&
+ } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE) && (this->posYTick == 0) &&
+ (play->actorCtx.playerImpact.timer != 0) &&
+ (play->actorCtx.playerImpact.type == PLAYER_IMPACT_GORON_GROUND_POUND) &&
(SurfaceType_GetSceneExitIndex(&play->colCtx, player->actor.floorPoly, player->actor.floorBgId) == 6)) {
- this->playCutscene = true;
- this->unk_16C = 0; // this variable is not used anywhere else
+ this->cutsceneRequested = true;
+ this->unk16C = 0;
}
- prevTimer = this->timer;
-
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_88_40)) {
- this->timer++;
+ prevPosYTick = this->posYTick;
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE)) {
+ this->posYTick++;
} else {
- this->timer--;
- };
-
- this->timer = CLAMP(this->timer, 0, 60);
-
- if (this->timer != prevTimer) {
- if (1) {}
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_STONEDOOR_OPEN_S - SFX_FLAG);
- this->dyna.actor.world.pos.y = (this->yOffset = (this->timer * (5.0f / 3.0f)) + this->dyna.actor.home.pos.y);
- this->timer2 = 180;
+ this->posYTick--;
}
- if (!(player->stateFlags1 & PLAYER_STATE1_40) && CHECK_WEEKEVENTREG(WEEKEVENTREG_88_40) &&
- (DECR(this->timer2) == 0)) {
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_88_40);
+ 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;
+ }
+
+ 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;
- s32 pad;
- DynaPolyActor_Init(&this->dyna, 1);
- DynaPolyActor_LoadMesh(play, &this->dyna, &object_spot11_obj_Colheader_0011C0);
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_88_40);
+ 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->timer2 = gSaveContext.save.isNight;
- this->timer = 0;
- this->actionFunc = BgTobira01_Open;
+ this->timer = gSaveContext.save.isNight;
+ this->posYTick = 0;
+ this->actionFunc = BgTobira01_Action;
}
void BgTobira01_Destroy(Actor* thisx, PlayState* play) {
BgTobira01* this = THIS;
- s32 pad;
DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
}
void BgTobira01_Update(Actor* thisx, PlayState* play) {
BgTobira01* this = THIS;
- s32 pad;
this->actionFunc(this, play);
}
@@ -103,9 +98,9 @@ void BgTobira01_Update(Actor* thisx, PlayState* play) {
void BgTobira01_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_spot11_obj_DL_000088);
+ 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 14a5e1b8e..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,16 +5,16 @@
struct BgTobira01;
-typedef void (*BgTobira01ActionFunc)(struct BgTobira01*, struct PlayState*);
+typedef void (*BgTobira01ActionFunc)(struct BgTobira01*, PlayState*);
typedef struct BgTobira01 {
/* 0x000 */ DynaPolyActor dyna;
/* 0x15C */ BgTobira01ActionFunc actionFunc;
- /* 0x160 */ s16 timer;
- /* 0x162 */ s16 timer2;
- /* 0x164 */ f32 yOffset;
- /* 0x168 */ s32 playCutscene;
- /* 0x16C */ s32 unk_16C; // unused besides being set to 0
+ /* 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..63cedff5a 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);
+ Audio_PlaySfx(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;
@@ -104,7 +103,7 @@ void BgUmajump_Init(Actor* thisx, PlayState* play) {
thisx->update = Actor_Noop;
}
} else {
- this->objectIndex = Object_GetIndex(&play->objectCtx, OBJECT_UMAJUMP);
+ this->objectIndex = Object_GetSlot(&play->objectCtx, OBJECT_UMAJUMP);
if (this->objectIndex < 0) {
Actor_Kill(thisx);
@@ -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_01/z_boss_01.c b/src/overlays/actors/ovl_Boss_01/z_boss_01.c
index 8d13ab6d3..3ca53ff7f 100644
--- a/src/overlays/actors/ovl_Boss_01/z_boss_01.c
+++ b/src/overlays/actors/ovl_Boss_01/z_boss_01.c
@@ -8,7 +8,7 @@
#include "z64rumble.h"
#include "z64shrink_window.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((Boss01*)thisx)
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 e5505e92a..f96c2864f 100644
--- a/src/overlays/actors/ovl_Boss_02/z_boss_02.c
+++ b/src/overlays/actors/ovl_Boss_02/z_boss_02.c
@@ -4,15 +4,15 @@
* Description: Twinmold
*/
-#include "prevent_bss_reordering.h"
#include "z_boss_02.h"
#include "z64rumble.h"
#include "z64shrink_window.h"
#include "overlays/actors/ovl_Door_Warp1/z_door_warp1.h"
+#include "overlays/actors/ovl_En_Tanron5/z_en_tanron5.h"
#include "overlays/actors/ovl_Item_B_Heart/z_item_b_heart.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((Boss02*)thisx)
@@ -30,18 +30,48 @@ void Boss02_Static_Update(Actor* thisx, PlayState* play);
void Boss02_Static_Draw(Actor* thisx, PlayState* play);
void Boss02_UpdateEffects(PlayState* play);
void Boss02_DrawEffects(PlayState* play);
-void func_809DD934(Boss02* this, PlayState* play);
+void Boss02_HandleGiantsMaskCutscene(Boss02* this, PlayState* play);
void func_809DEAC4(Boss02* this, PlayState* play);
-u8 D_809E0420;
-u8 D_809E0421;
+typedef enum {
+ /* 0 */ GIANTS_MASK_CS_STATE_WAITING_FOR_MASK, // Starts the cutscene when the player puts on/takes off the mask.
+ /* 1 */ GIANTS_MASK_CS_STATE_MASK_ON, // Controls the cutscene where the player puts the mask on.
+ /* 2 */ GIANTS_MASK_CS_STATE_MASK_ON_SKIPPED, // Moves to the "done" state when the mask-on cutscene is skipped.
+ /* 10 */ GIANTS_MASK_CS_STATE_MASK_OFF = 10, // Controls the cutscene where the player takes the mask off.
+ /* 11 */ GIANTS_MASK_CS_STATE_MASK_OFF_SKIPPED, // Moves to the "done" state when the mask-off cutscene is skipped.
+ /* 20 */ GIANTS_MASK_CS_STATE_DONE = 20 // Stops the cutscene and resets the player's scale back to normal.
+} GiantsMaskCsState;
+
+typedef enum {
+ /* 0 */ GIANTS_MASK_CS_FLASH_STATE_NOT_STARTED, // Does nothing at all.
+ /* 1 */ GIANTS_MASK_CS_FLASH_STATE_STARTED, // Plays the "mask flash" SFX and initializes a white FillScreen.
+ /* 2 */ GIANTS_MASK_CS_FLASH_STATE_INCREASE_ALPHA, // Increases the alpha for the FillScreen on every frame.
+ /* 3 */ GIANTS_MASK_CS_FLASH_STATE_DECREASE_ALPHA // Decreases the alpha for the FillScreen on every frame.
+} GiantsMaskCsFlashState;
+
+/**
+ * If set to true, the player can skip the cutscene of putting on the Giant's Mask
+ * by pressing A, B, or any C-button. If false, they must watch it in full.
+ */
+u8 sCanSkipMaskOnCs;
+
+/**
+ * If set to true, the player can skip the cutscene of taking off the Giant's Mask
+ * by pressing A, B, or any C-button. If false, they must watch it in full.
+ */
+u8 sCanSkipMaskOffCs;
+
+/**
+ * True when the player is giant-sized (i.e. wearing the Giant's Mask), false when the player is normal-sized.
+ */
u8 sIsInGiantMode;
+
Boss02* sRedTwinmold;
Boss02* sBlueTwinmold;
Boss02* sTwinmoldStatic;
u8 sMusicStartTimer;
DoorWarp1* sBlueWarp;
-TwinmoldEffect sEffects[150];
+TwinmoldEffect sEffects[TWINMOLD_EFFECT_COUNT];
static DamageTable sBlueTwinmoldDamageTable = {
/* Deku Nut */ DMG_ENTRY(0, 0x0),
@@ -125,7 +155,11 @@ ActorInit Boss_02_InitVars = {
(ActorFunc)Boss02_Twinmold_Draw,
};
-f32 D_809DF5B0 = 1.0f;
+/**
+ * Multiplies the scale differently depending on whether the player is wearing the Giant's Mask or not.
+ * When the player is wearing the Giant's Mask, this value is smaller to make the player seem larger.
+ */
+static f32 sGiantModeScaleFactor = 1.0f;
s16 D_809DF5B4[] = {
0, 195, 190, 185, 180, 175, 170, 165, 160, 155, 150, 145, 140, 135, 130, 125, 120, 115, 110, 105, 100, 95, 90, 0,
@@ -463,7 +497,7 @@ Vec3f D_809DFA2C[] = {
{ -800.0f, -1000.0f, 0.0f }, { -800.0f, -1000.0f, 0.0f }, { -800.0f, -1000.0f, 0.0f },
};
-void func_809DA1D0(PlayState* play, u8 red, u8 green, u8 blue, u8 alpha) {
+void Boss02_FillScreen(PlayState* play, u8 red, u8 green, u8 blue, u8 alpha) {
R_PLAY_FILL_SCREEN_ON = true;
R_PLAY_FILL_SCREEN_R = red;
R_PLAY_FILL_SCREEN_G = green;
@@ -471,24 +505,24 @@ void func_809DA1D0(PlayState* play, u8 red, u8 green, u8 blue, u8 alpha) {
R_PLAY_FILL_SCREEN_ALPHA = alpha;
}
-void func_809DA22C(PlayState* play, u8 alpha) {
+void Boss02_SetFillScreenAlpha(PlayState* play, u8 alpha) {
R_PLAY_FILL_SCREEN_ALPHA = alpha;
}
-void func_809DA24C(PlayState* play) {
+void Boss02_StopFillScreen(PlayState* play) {
R_PLAY_FILL_SCREEN_ON = false;
}
void Boss02_SpawnEffectSand(TwinmoldEffect* effects, Vec3f* pos, f32 scale) {
s16 i;
- for (i = 0; i < ARRAY_COUNT(sEffects); i++, effects++) {
+ for (i = 0; i < TWINMOLD_EFFECT_COUNT; i++, effects++) {
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;
@@ -503,14 +537,14 @@ void Boss02_SpawnEffectSand(TwinmoldEffect* effects, Vec3f* pos, f32 scale) {
void Boss02_SpawnEffectFragment(TwinmoldEffect* effects, Vec3f* pos) {
s16 i;
- for (i = 0; i < ARRAY_COUNT(sEffects); i++, effects++) {
+ for (i = 0; i < TWINMOLD_EFFECT_COUNT; i++, effects++) {
if (effects->type == TWINMOLD_EFFECT_NONE) {
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;
@@ -525,7 +559,7 @@ void Boss02_SpawnEffectFragment(TwinmoldEffect* effects, Vec3f* pos) {
void Boss02_SpawnEffectFlash(TwinmoldEffect* effects, Vec3f* pos) {
s16 i;
- for (i = 0; i < ARRAY_COUNT(sEffects); i++, effects++) {
+ for (i = 0; i < TWINMOLD_EFFECT_COUNT; i++, effects++) {
if ((effects->type == TWINMOLD_EFFECT_NONE) || (effects->type == TWINMOLD_EFFECT_FRAGMENT)) {
effects->type = TWINMOLD_EFFECT_FLASH;
effects->pos = *pos;
@@ -543,7 +577,7 @@ void func_809DA50C(s32 arg0, ColliderJntSph* collider, Vec3f* arg2) {
collider->elements[arg0].dim.worldSphere.center.y = arg2->y;
collider->elements[arg0].dim.worldSphere.center.z = arg2->z;
collider->elements[arg0].dim.worldSphere.radius =
- collider->elements[arg0].dim.modelSphere.radius * collider->elements[arg0].dim.scale * D_809DF5B0;
+ collider->elements[arg0].dim.modelSphere.radius * collider->elements[arg0].dim.scale * sGiantModeScaleFactor;
}
void Boss02_Init(Actor* thisx, PlayState* play) {
@@ -551,22 +585,23 @@ 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) &&
+ (TWINMOLD_GET_TYPE(&this->actor) == TWINMOLD_TYPE_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;
+ this->actor.targetMode = TARGET_MODE_10;
this->subCamUp.z = this->subCamUp.x = 0.0f;
this->subCamUp.y = 1.0f;
- if (this->actor.params == TWINMOLD_STATIC) {
+ if (TWINMOLD_GET_TYPE(&this->actor) == TWINMOLD_TYPE_STATIC) {
sTwinmoldStatic = this;
play->specialEffects = (void*)sEffects;
this->actor.update = Boss02_Static_Update;
this->actor.draw = Boss02_Static_Draw;
- this->actor.flags &= ~ACTOR_FLAG_1;
- this->unk_1D70 = 0.00999999977648f;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ this->playerScale = 0.01f;
if ((KREG(64) != 0) || CHECK_EVENTINF(EVENTINF_55) || (sBlueWarp != NULL)) {
this->unk_1D20 = 0;
sMusicStartTimer = KREG(15) + 20;
@@ -574,21 +609,22 @@ void Boss02_Init(Actor* thisx, PlayState* play) {
this->unk_1D20 = 1;
}
R_MAGIC_CONSUME_TIMER_GIANTS_MASK = KREG(14) + 20;
- this->unk_01AC = 1.0f;
- Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_TANRON5, 0.0f, 1000.0f, 0.0f, 0, 0, 0, 0);
- } else if (this->actor.params == TWINMOLD_TAIL) {
+ this->giantModeScaleFactor = 1.0f;
+ Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_TANRON5, 0.0f, 1000.0f, 0.0f, 0, 0, 0,
+ TWINMOLD_PROP_PARAMS(TWINMOLD_PROP_TYPE_STATIC));
+ } else if (TWINMOLD_GET_TYPE(&this->actor) == TWINMOLD_TYPE_TAIL) {
this->actor.update = Boss02_Tail_Update;
this->actor.draw = NULL;
this->actor.hintId = TATL_HINT_ID_TWINMOLD;
} else {
- if (this->actor.params != TWINMOLD_BLUE) {
- this->actor.params = TWINMOLD_RED;
- Actor_Spawn(&play->actorCtx, play, ACTOR_BOSS_02, 0.0f, 0.0f, 0.0f, 0, 0, 0, TWINMOLD_STATIC);
+ if (TWINMOLD_GET_TYPE(&this->actor) != TWINMOLD_TYPE_BLUE) {
+ this->actor.params = TWINMOLD_TYPE_RED;
+ Actor_Spawn(&play->actorCtx, play, ACTOR_BOSS_02, 0.0f, 0.0f, 0.0f, 0, 0, 0, TWINMOLD_TYPE_STATIC);
sRedTwinmold = this;
sBlueTwinmold =
(Boss02*)Actor_Spawn(&play->actorCtx, play, ACTOR_BOSS_02, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, this->actor.world.rot.x,
- this->actor.world.rot.y, this->actor.world.rot.z, TWINMOLD_BLUE);
+ this->actor.world.rot.y, this->actor.world.rot.z, TWINMOLD_TYPE_BLUE);
sRedTwinmold->actor.colChkInfo.damageTable = &sRedTwinmoldDamageTable;
sBlueTwinmold->actor.colChkInfo.damageTable = &sBlueTwinmoldDamageTable;
sRedTwinmold->otherTwinmold = sBlueTwinmold;
@@ -621,7 +657,7 @@ void Boss02_Init(Actor* thisx, PlayState* play) {
this->unk_014C = Rand_ZeroFloat(1000.0f);
this->unk_1678 = 22;
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_BOSS_02, 0.0f, 0.0f, 0.0f, 0, 0, 0,
- TWINMOLD_TAIL);
+ TWINMOLD_TYPE_TAIL);
}
}
@@ -710,10 +746,10 @@ void func_809DAB78(Boss02* this, PlayState* play) {
this->unk_0168 = 2000.0f;
if (this->unk_0195 != 0) {
- this->actor.speedXZ = this->unk_01A8 * D_809DF5B0 * 1.25f;
+ this->actor.speed = this->unk_01A8 * sGiantModeScaleFactor * 1.25f;
this->skelAnime.playSpeed = 2.0f;
} else {
- this->actor.speedXZ = this->unk_01A8 * D_809DF5B0;
+ this->actor.speed = this->unk_01A8 * sGiantModeScaleFactor;
}
Actor_UpdateVelocityWithoutGravity(&this->actor);
@@ -732,10 +768,10 @@ void func_809DAB78(Boss02* this, PlayState* play) {
this->unk_0170 = this->unk_017C;
this->unk_0170.y = temp_f0;
this->unk_016C = 120;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_INBOSS_ROAR_OLD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_INBOSS_ROAR_OLD);
}
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
if (this->unk_0195 != 0) {
this->actor.world.rot.z = Math_SinS(this->unk_014C * 0x1200) * 0xE00;
} else {
@@ -757,7 +793,7 @@ void func_809DAB78(Boss02* this, PlayState* play) {
}
if ((this->unk_0144 < 10) && (otherTwinmold->unk_0144 >= 20)) {
- this->unk_01B0.y = -1000.0f * D_809DF5B0;
+ this->unk_01B0.y = -1000.0f * sGiantModeScaleFactor;
if (sIsInGiantMode) {
this->unk_01B0.y += 3150.0f;
}
@@ -770,28 +806,28 @@ void func_809DAB78(Boss02* this, PlayState* play) {
return;
case 0:
- if ((this->actor.params == 0) && (Rand_ZeroOne() < 0.75f)) {
+ if ((TWINMOLD_GET_TYPE(&this->actor) == TWINMOLD_TYPE_RED) && (Rand_ZeroOne() < 0.75f)) {
this->actor.world.pos.x = player->actor.world.pos.x;
this->actor.world.pos.z = player->actor.world.pos.z;
- this->actor.world.pos.y = player->actor.world.pos.y - (600.0f * D_809DF5B0);
+ this->actor.world.pos.y = player->actor.world.pos.y - (600.0f * sGiantModeScaleFactor);
} 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.y = -500.0f * D_809DF5B0;
+ this->actor.world.pos.x = Rand_CenteredFloat(5000.0f * sGiantModeScaleFactor);
+ this->actor.world.pos.z = Rand_CenteredFloat(5000.0f * sGiantModeScaleFactor);
+ this->actor.world.pos.y = -500.0f * sGiantModeScaleFactor;
if (sIsInGiantMode) {
this->actor.world.pos.y += 3150.0f;
}
}
- if ((fabsf(this->actor.world.pos.x) < (500.0f * D_809DF5B0)) &&
- (fabsf(this->actor.world.pos.z) < (500.0f * D_809DF5B0))) {
+ if ((fabsf(this->actor.world.pos.x) < (500.0f * sGiantModeScaleFactor)) &&
+ (fabsf(this->actor.world.pos.z) < (500.0f * sGiantModeScaleFactor))) {
return;
}
case 100:
this->actor.shape.rot.x = 0x4000;
this->unk_01B0.x = this->actor.world.pos.x;
- this->unk_01B0.y = this->actor.world.pos.y + (1000.0f * D_809DF5B0);
+ this->unk_01B0.y = this->actor.world.pos.y + (1000.0f * sGiantModeScaleFactor);
this->unk_01B0.z = this->actor.world.pos.z;
this->unk_0146[0] = 100;
this->unk_0144 = 1;
@@ -803,14 +839,15 @@ 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);
- if ((fabsf(this->unk_01B0.x) < (500.0f * D_809DF5B0)) &&
- (fabsf(this->unk_01B0.z) < (500.0f * D_809DF5B0))) {
+ this->unk_01B0.x = Rand_CenteredFloat(3000.0f * sGiantModeScaleFactor);
+ this->unk_01B0.z = Rand_CenteredFloat(3000.0f * sGiantModeScaleFactor);
+ if ((fabsf(this->unk_01B0.x) < (500.0f * sGiantModeScaleFactor)) &&
+ (fabsf(this->unk_01B0.z) < (500.0f * sGiantModeScaleFactor))) {
this->unk_01B0.x = 500.0f;
this->unk_01B0.z = 500.0f;
}
- this->unk_01B0.y = Rand_ZeroFloat(800.0f * D_809DF5B0) + (200.0f * D_809DF5B0);
+ this->unk_01B0.y =
+ Rand_ZeroFloat(800.0f * sGiantModeScaleFactor) + (200.0f * sGiantModeScaleFactor);
if (sIsInGiantMode) {
this->unk_01B0.y += 3150.0f;
}
@@ -825,9 +862,9 @@ void func_809DAB78(Boss02* this, PlayState* play) {
} else {
phi_f2 = 500.0f;
}
- if (sqrtf(SQ(spCC) + SQ(spC8) + SQ(spC4)) < (phi_f2 * D_809DF5B0)) {
+ if (sqrtf(SQ(spCC) + SQ(spC8) + SQ(spC4)) < (phi_f2 * sGiantModeScaleFactor)) {
this->unk_0144 = 3;
- this->unk_01B0.y = -3000.0f * D_809DF5B0;
+ this->unk_01B0.y = -3000.0f * sGiantModeScaleFactor;
if (sIsInGiantMode) {
this->unk_01B0.y += 3150.0f;
}
@@ -844,16 +881,16 @@ void func_809DAB78(Boss02* this, PlayState* play) {
case 5:
this->unk_01B0.x = player->actor.world.pos.x;
- this->unk_01B0.y = player->actor.world.pos.y + (100.0f * D_809DF5B0);
+ this->unk_01B0.y = player->actor.world.pos.y + (100.0f * sGiantModeScaleFactor);
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.y = -3000.0f * D_809DF5B0;
+ this->unk_01B0.x = Rand_CenteredFloat(500.0f * sGiantModeScaleFactor) + this->actor.world.pos.x;
+ this->unk_01B0.y = -3000.0f * sGiantModeScaleFactor;
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 * sGiantModeScaleFactor) + this->actor.world.pos.z;
this->unk_0146[0] = 150;
this->unk_0164 = 0.0f;
}
@@ -864,8 +901,8 @@ void func_809DAB78(Boss02* this, PlayState* play) {
this->unk_019A = 0x500;
this->unk_01A0 = 0x1200;
} else {
- this->colliderCylinder.dim.radius = 150.0f * D_809DF5B0;
- this->colliderCylinder.dim.height = 200.0f * D_809DF5B0;
+ this->colliderCylinder.dim.radius = 150.0f * sGiantModeScaleFactor;
+ this->colliderCylinder.dim.height = 200.0f * sGiantModeScaleFactor;
this->colliderCylinder.dim.yShift = 0;
Collider_UpdateCylinder(&this->actor, &this->colliderCylinder);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliderCylinder.base);
@@ -915,10 +952,11 @@ void func_809DAB78(Boss02* this, PlayState* play) {
if ((s16)(BREG(71) + 140) < this->unk_0146[1]) {
if (this->unk_0146[0] == 0) {
Matrix_RotateYS(Math_Atan2S(-player->actor.world.pos.x, -player->actor.world.pos.z), MTXMODE_NEW);
- Matrix_MultVecZ(1500.0f * D_809DF5B0, &spA4);
+ Matrix_MultVecZ(1500.0f * sGiantModeScaleFactor, &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 * sGiantModeScaleFactor) + (600.0f * sGiantModeScaleFactor);
if (sIsInGiantMode) {
this->unk_01B0.y += 3150.0f;
}
@@ -926,7 +964,7 @@ void func_809DAB78(Boss02* this, PlayState* play) {
}
this->unk_0168 = 3000.0f;
} else {
- this->unk_01B0.y += 10.0f * D_809DF5B0;
+ this->unk_01B0.y += 10.0f * sGiantModeScaleFactor;
this->unk_0168 = 5000.0f;
}
this->unk_019A = 0x1000;
@@ -939,15 +977,15 @@ void func_809DAB78(Boss02* this, PlayState* play) {
this->unk_0152 = 0;
sTwinmoldStatic->unk_1D20 = 102;
sTwinmoldStatic->subCamAtVel = 0.0f;
- play_sound(NA_SE_EN_INBOSS_DEAD_PRE2_OLD);
+ Audio_PlaySfx(NA_SE_EN_INBOSS_DEAD_PRE2_OLD);
} else if (!(this->unk_0146[1] & 0xF) && (Rand_ZeroOne() < 0.5f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_INBOSS_DAMAGE_OLD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_INBOSS_DAMAGE_OLD);
}
return;
case 21:
this->unk_01A8 = 0.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->unk_0146[0] == 0) {
this->unk_0146[0] = 3;
@@ -956,33 +994,33 @@ void func_809DAB78(Boss02* this, PlayState* play) {
}
Boss02_SpawnEffectFlash(play->specialEffects, &this->unk_147C[this->unk_1678]);
- play_sound(NA_SE_EV_EXPLOSION);
+ Audio_PlaySfx(NA_SE_EV_EXPLOSION);
this->unk_1678--;
if (this->unk_1678 <= 0) {
this->unk_0144 = 22;
- this->actor.gravity = -1.0f * D_809DF5B0;
+ this->actor.gravity = -1.0f * sGiantModeScaleFactor;
this->actor.velocity.y = 0.0f;
- this->actor.terminalVelocity = -1000.0f * D_809DF5B0;
- this->unk_0164 = randPlusMinusPoint5Scaled(0.05f);
+ this->actor.terminalVelocity = -1000.0f * sGiantModeScaleFactor;
+ 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;
- if (sqrtf(SQ(spCC) + SQ(spC4)) < (400.0f * D_809DF5B0)) {
- this->actor.speedXZ = 15.0f * D_809DF5B0;
+ if (sqrtf(SQ(spCC) + SQ(spC4)) < (400.0f * sGiantModeScaleFactor)) {
+ this->actor.speed = 15.0f * sGiantModeScaleFactor;
}
spCC = this->actor.world.pos.x;
spC4 = this->actor.world.pos.z;
- if (sqrtf(SQ(spCC) + SQ(spC4)) < (400.0f * D_809DF5B0)) {
- this->actor.speedXZ = 15.0f * D_809DF5B0;
+ if (sqrtf(SQ(spCC) + SQ(spC4)) < (400.0f * sGiantModeScaleFactor)) {
+ this->actor.speed = 15.0f * sGiantModeScaleFactor;
}
if (otherTwinmold->unk_0144 >= 10) {
- Audio_QueueSeqCmd(NA_BGM_CLEAR_BOSS | 0x8000);
+ SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_CLEAR_BOSS | SEQ_FLAG_ASYNC);
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_INBOSS_DEAD_OLD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_INBOSS_DEAD_OLD);
}
}
return;
@@ -994,11 +1032,11 @@ 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 & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->unk_0144 = 23;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->unk_0170 = this->unk_017C;
this->unk_016C = 30;
this->unk_0170.y = this->actor.floorHeight;
@@ -1006,7 +1044,7 @@ void func_809DAB78(Boss02* this, PlayState* play) {
sTwinmoldStatic->unk_1D1C = 0;
sTwinmoldStatic->unk_0146[0] = 15;
sTwinmoldStatic->unk_0150 = 0;
- play_sound(NA_SE_EV_LIGHTNING);
+ Audio_PlaySfx(NA_SE_EV_LIGHTNING);
for (i = 0; i < 30; i++) {
Boss02_SpawnEffectFragment(play->specialEffects, &this->unk_0170);
@@ -1026,30 +1064,30 @@ void func_809DAB78(Boss02* this, PlayState* play) {
for (i = 0; i < 15; i++) {
Matrix_RotateYF(((2.0f * (i * M_PI)) / 15.0f) + sp9C, MTXMODE_NEW);
- Matrix_MultVecZ((10 - this->unk_0146[0]) * (D_809DF5B0 * 300.0f) * 0.1f, &sp90);
+ Matrix_MultVecZ((10 - this->unk_0146[0]) * (sGiantModeScaleFactor * 300.0f) * 0.1f, &sp90);
spD0.x = this->unk_0170.x + sp90.x;
- spD0.y = this->unk_0170.y + (1000.0f * D_809DF5B0);
+ spD0.y = this->unk_0170.y + (1000.0f * sGiantModeScaleFactor);
spD0.z = this->unk_0170.z + sp90.z;
if (BgCheck_EntityRaycastFloor3(&play->colCtx, &sp8C, &sp88, &spD0) != BGCHECK_Y_MIN) {
spA0 = BgCheck_EntityRaycastFloor1(&play->colCtx, &sp8C, &spD0);
- Matrix_MultVecZ(5.0f * D_809DF5B0, &sp70);
- sp70.y = 2.0f * D_809DF5B0;
- sp64.y = 0.3f * D_809DF5B0;
+ Matrix_MultVecZ(5.0f * sGiantModeScaleFactor, &sp70);
+ sp70.y = 2.0f * sGiantModeScaleFactor;
+ sp64.y = 0.3f * sGiantModeScaleFactor;
sp64.z = 0.0f;
sp64.x = 0.0f;
sp7C.x = spD0.x;
sp7C.y = spA0;
sp7C.z = spD0.z;
func_800B0F18(play, &sp7C, &sp70, &sp64, &D_809DFA98, &D_809DFA98,
- (Rand_ZeroFloat(500.0f) + 1200.0f) * D_809DF5B0, 20.0f * D_809DF5B0,
- Rand_ZeroFloat(5.0f) + 14.0f);
+ (Rand_ZeroFloat(500.0f) + 1200.0f) * sGiantModeScaleFactor,
+ 20.0f * sGiantModeScaleFactor, Rand_ZeroFloat(5.0f) + 14.0f);
}
}
}
}
- this->colliderCylinder.dim.radius = 150.0f * D_809DF5B0;
- this->colliderCylinder.dim.height = 200.0f * D_809DF5B0;
+ this->colliderCylinder.dim.radius = 150.0f * sGiantModeScaleFactor;
+ this->colliderCylinder.dim.height = 200.0f * sGiantModeScaleFactor;
this->colliderCylinder.dim.yShift = 0;
Collider_UpdateCylinder(&this->actor, &this->colliderCylinder);
CollisionCheck_SetAT(play, &play->colChkCtx, &this->colliderCylinder.base);
@@ -1075,10 +1113,10 @@ void func_809DBFB4(Boss02* this, PlayState* play) {
this->unk_0156 = 15;
if (i == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_INBOSS_DAMAGE_OLD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_INBOSS_DAMAGE_OLD);
this->unk_015C = 1;
} else {
- Audio_PlaySfxAtPos(&this->unk_167C, NA_SE_EN_INBOSS_DAMAGE_OLD);
+ Audio_PlaySfx_AtPos(&this->unk_167C, NA_SE_EN_INBOSS_DAMAGE_OLD);
this->unk_015C = 10;
}
@@ -1105,7 +1143,7 @@ void func_809DBFB4(Boss02* this, PlayState* play) {
this->unk_0144 = 20;
if (otherTwinmold->unk_0144 >= 10) {
- Audio_QueueSeqCmd(0x100100FF);
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 1);
} else {
otherTwinmold->unk_0195 = 1;
}
@@ -1153,9 +1191,9 @@ void Boss02_Tail_Update(Actor* thisx, PlayState* play) {
}
if ((this->actor.focus.pos.y < BgCheck_EntityRaycastFloor1(&play->colCtx, &outPoly, &pos)) || sIsInGiantMode) {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
} else {
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}
}
}
@@ -1172,7 +1210,7 @@ void Boss02_Twinmold_Update(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 0.060000001f);
}
- if (sTwinmoldStatic->unk_1D18 == 0) {
+ if (sTwinmoldStatic->giantsMaskCsState == GIANTS_MASK_CS_STATE_WAITING_FOR_MASK) {
for (i = 0; i < ARRAY_COUNT(this->unk_0146); i++) {
if (this->unk_0146[i] != 0) {
this->unk_0146[i]--;
@@ -1201,21 +1239,21 @@ void Boss02_Twinmold_Update(Actor* thisx, PlayState* play) {
if (this->unk_016C != 0) {
if ((this->unk_016C == 60) && (this->unk_0144 < 20)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_INBOSS_ROAR_OLD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_INBOSS_ROAR_OLD);
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_INBOSS_SAND_OLD - SFX_FLAG);
+ 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 * sGiantModeScaleFactor) + this->unk_0170.x;
+ sp3C.y = Rand_CenteredFloat(50.0f * sGiantModeScaleFactor) + this->unk_0170.y;
+ sp3C.z = Rand_CenteredFloat(100.0f * sGiantModeScaleFactor) + 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 * sGiantModeScaleFactor) + this->unk_0170.x;
+ sp3C.y = Rand_CenteredFloat(50.0f * sGiantModeScaleFactor) + this->unk_0170.y;
+ sp3C.z = Rand_CenteredFloat(100.0f * sGiantModeScaleFactor) + this->unk_0170.z;
Boss02_SpawnEffectSand(play->specialEffects, &sp3C, Rand_ZeroFloat(3.0f) + 6.0f);
}
}
@@ -1281,24 +1319,24 @@ void Boss02_Twinmold_Update(Actor* thisx, PlayState* play) {
void Boss02_Static_Update(Actor* thisx, PlayState* play) {
Boss02* this = THIS;
- this->unk_01AC = D_809DF5B0;
- play->envCtx.sandstormState = 0xD;
+ this->giantModeScaleFactor = sGiantModeScaleFactor;
+ play->envCtx.sandstormState = SANDSTORM_D;
if (sBlueWarp != NULL) {
- this->unk_1D74 = KREG(23) + -15.0f;
+ this->fogNear = KREG(23) + -15.0f;
D_801F4E30 = 0;
play->envCtx.lightSettingOverride = 1;
- play->skyboxId = 1;
+ play->skyboxId = SKYBOX_NORMAL_SKY;
} else if (!sIsInGiantMode) {
- this->unk_1D74 = 0.0f;
+ this->fogNear = 0.0f;
D_801F4E30 = this->unk_1D7C;
play->envCtx.lightSettingOverride = 0;
- play->skyboxId = 2;
+ play->skyboxId = SKYBOX_2;
} else {
- this->unk_1D74 = KREG(23) + -15.0f;
+ this->fogNear = KREG(23) + -15.0f;
D_801F4E30 = ((KREG(24) * 0.1f) + 1.0f) * this->unk_1D7C;
play->envCtx.lightSettingOverride = 1;
- play->skyboxId = 1;
+ play->skyboxId = SKYBOX_NORMAL_SKY;
}
Math_ApproachS(&this->unk_1D7C, this->unk_1D7E, 1, 3);
@@ -1311,14 +1349,14 @@ void Boss02_Static_Update(Actor* thisx, PlayState* play) {
if (sMusicStartTimer != 0) {
sMusicStartTimer--;
if (sMusicStartTimer == 0) {
- Audio_QueueSeqCmd(NA_BGM_BOSS | 0x8000);
+ SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_BOSS | SEQ_FLAG_ASYNC);
}
}
}
Boss02_UpdateEffects(play);
func_809DEAC4(this, play);
- func_809DD934(this, play);
+ Boss02_HandleGiantsMaskCutscene(this, play);
}
Gfx* D_809DFA9C[] = {
@@ -1350,9 +1388,9 @@ 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) {
+ if (TWINMOLD_GET_TYPE(&this->actor) == TWINMOLD_TYPE_RED) {
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gTwinmoldRedSkinTex));
} else {
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gTwinmoldBlueSkinTex));
@@ -1478,12 +1516,12 @@ void Boss02_UpdateEffects(PlayState* play) {
floorY = 3150.0f;
}
- for (i = 0; i < ARRAY_COUNT(sEffects); i++, effect++) {
+ for (i = 0; i < TWINMOLD_EFFECT_COUNT; i++, effect++) {
if (effect->type) {
effect->timer++;
- effect->pos.x += effect->velocity.x * D_809DF5B0;
- effect->pos.y += effect->velocity.y * D_809DF5B0;
- effect->pos.z += effect->velocity.z * D_809DF5B0;
+ effect->pos.x += effect->velocity.x * sGiantModeScaleFactor;
+ effect->pos.y += effect->velocity.y * sGiantModeScaleFactor;
+ effect->pos.z += effect->velocity.z * sGiantModeScaleFactor;
effect->velocity.y += effect->accel.y;
if (effect->type < TWINMOLD_EFFECT_FRAGMENT) {
@@ -1522,10 +1560,10 @@ 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++) {
+ for (i = 0; i < TWINMOLD_EFFECT_COUNT; i++, effect++) {
if (effect->type == TWINMOLD_EFFECT_SAND) {
if (!flag) {
gSPDisplayList(POLY_XLU_DISP++, gTwinmoldDustMaterialDL);
@@ -1545,7 +1583,8 @@ void Boss02_DrawEffects(PlayState* play) {
Matrix_Translate(effect->pos.x, effect->pos.y, effect->pos.z, MTXMODE_NEW);
Matrix_ReplaceRotation(&play->billboardMtxF);
- Matrix_Scale(effect->scale * D_809DF5B0, effect->scale * D_809DF5B0, 1.0f, MTXMODE_APPLY);
+ Matrix_Scale(effect->scale * sGiantModeScaleFactor, effect->scale * sGiantModeScaleFactor, 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++, gTwinmoldDustModelDL);
@@ -1553,7 +1592,7 @@ void Boss02_DrawEffects(PlayState* play) {
}
effect = (TwinmoldEffect*)play->specialEffects;
- for (i = 0, flag = false; i < ARRAY_COUNT(sEffects); i++, effect++) {
+ for (i = 0, flag = false; i < TWINMOLD_EFFECT_COUNT; i++, effect++) {
if (effect->type == TWINMOLD_EFFECT_FRAGMENT) {
if (!flag) {
gDPSetCombineLERP(POLY_OPA_DISP++, SHADE, 0, PRIMITIVE, 0, SHADE, 0, PRIMITIVE, 0, SHADE, 0, PRIMITIVE,
@@ -1565,8 +1604,8 @@ void Boss02_DrawEffects(PlayState* play) {
Matrix_Translate(effect->pos.x, effect->pos.y, effect->pos.z, MTXMODE_NEW);
Matrix_RotateYS(effect->rotY, MTXMODE_APPLY);
Matrix_RotateXS(effect->rotX, MTXMODE_APPLY);
- Matrix_Scale(effect->scale * D_809DF5B0, effect->scale * D_809DF5B0, effect->scale * D_809DF5B0,
- MTXMODE_APPLY);
+ Matrix_Scale(effect->scale * sGiantModeScaleFactor, effect->scale * sGiantModeScaleFactor,
+ effect->scale * sGiantModeScaleFactor, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gEffFragments1DL);
@@ -1574,7 +1613,7 @@ void Boss02_DrawEffects(PlayState* play) {
}
effect = (TwinmoldEffect*)play->specialEffects;
- for (i = 0, flag = false; i < ARRAY_COUNT(sEffects); i++, effect++) {
+ for (i = 0, flag = false; i < TWINMOLD_EFFECT_COUNT; i++, effect++) {
if (effect->type == TWINMOLD_EFFECT_FLASH) {
if (!flag) { //! @bug - dev forgot to set flag to 1, should only apply to first entry?
gSPDisplayList(POLY_XLU_DISP++, gLightOrbMaterial1DL);
@@ -1585,7 +1624,8 @@ void Boss02_DrawEffects(PlayState* play) {
Matrix_Translate(effect->pos.x, effect->pos.y, effect->pos.z, MTXMODE_NEW);
Matrix_ReplaceRotation(&play->billboardMtxF);
- Matrix_Scale(effect->scale * D_809DF5B0, effect->scale * D_809DF5B0, 1.0f, MTXMODE_APPLY);
+ Matrix_Scale(effect->scale * sGiantModeScaleFactor, effect->scale * sGiantModeScaleFactor, 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++, gLightOrbModelDL);
@@ -1593,7 +1633,7 @@ void Boss02_DrawEffects(PlayState* play) {
}
effect = (TwinmoldEffect*)play->specialEffects;
- for (i = 0, flag = false; i < ARRAY_COUNT(sEffects); i++, effect++) {
+ for (i = 0, flag = false; i < TWINMOLD_EFFECT_COUNT; i++, effect++) {
if (effect->type == TWINMOLD_EFFECT_BLACK_DUST) {
if (!flag) {
gSPDisplayList(POLY_XLU_DISP++, gTwinmoldDustMaterialDL);
@@ -1608,7 +1648,8 @@ void Boss02_DrawEffects(PlayState* play) {
Matrix_Translate(effect->pos.x, effect->pos.y, effect->pos.z, MTXMODE_NEW);
Matrix_ReplaceRotation(&play->billboardMtxF);
- Matrix_Scale(effect->scale * D_809DF5B0, effect->scale * D_809DF5B0, 1.0f, MTXMODE_APPLY);
+ Matrix_Scale(effect->scale * sGiantModeScaleFactor, effect->scale * sGiantModeScaleFactor, 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++, gTwinmoldDustModelDL);
@@ -1618,166 +1659,194 @@ void Boss02_DrawEffects(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx);
}
-void func_809DD934(Boss02* this, PlayState* play) {
+/**
+ * This function is primarily responsible for handling the cutscene where the player puts on
+ * or takes off the Giant's Mask. It does some manual camera control, adjusts the player's
+ * scale, switches between the "Normal" and "Giant" variations of the arena, and creates a
+ * "flash" when the cutscene ends by filling the screen with white. In addition, this function
+ * is responsible for updating the EnvironmentContext's fogNear variable, which it does even
+ * when the Giant's Mask cutscene is not playing.
+ */
+void Boss02_HandleGiantsMaskCutscene(Boss02* this, PlayState* play) {
Player* player = GET_PLAYER(play);
s16 i;
- Actor* temp_a0_5;
- Vec3f sp58;
- u8 sp57 = 0;
- f32 phi_f0_2;
+ Actor* actorIter;
+ Vec3f subCamEyeOffset;
+ u8 switchArena = false;
+ f32 scale;
s16 alpha;
- this->unk_1D14++;
+ this->giantsMaskCsTimer++;
- switch (this->unk_1D18) {
- case 0:
+ switch (this->giantsMaskCsState) {
+ case GIANTS_MASK_CS_STATE_WAITING_FOR_MASK:
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);
Play_EnableMotionBlur(150);
- this->unk_1D14 = 0;
+ this->giantsMaskCsTimer = 0;
this->subCamAtVel = 0.0f;
- this->unk_1D58 = 0.0f;
+ this->subCamUpRotZScale = 0.0f;
if (!sIsInGiantMode) {
- this->unk_1D18 = 1;
- this->unk_1D68 = 10.0f;
- this->unk_1D64 = 60.0f;
- this->unk_1D6C = 23.0f;
- this->unk_1D70 = 0.01f;
- this->unk_1D74 = 0.0f;
- goto label1;
+ this->giantsMaskCsState = GIANTS_MASK_CS_STATE_MASK_ON;
+ this->subCamEyeOffsetY = 10.0f;
+ this->subCamDistZFromPlayer = 60.0f;
+ this->subCamAtOffsetY = 23.0f;
+ this->playerScale = 0.01f;
+ this->fogNear = 0.0f;
+ goto maskOn; // Jumps to this label to prevent the player from skipping the cutscene immediately.
} else {
- this->unk_1D18 = 10;
- this->unk_1D68 = 10.0f;
- this->unk_1D64 = 200.0f;
- this->unk_1D6C = 273.0f;
- this->unk_1D70 = 0.1f;
- this->unk_1D74 = -100.0f;
- sp57 = 1;
- goto label2;
+ this->giantsMaskCsState = GIANTS_MASK_CS_STATE_MASK_OFF;
+ this->subCamEyeOffsetY = 10.0f;
+ this->subCamDistZFromPlayer = 200.0f;
+ this->subCamAtOffsetY = 273.0f;
+ this->playerScale = 0.1f;
+ this->fogNear = -100.0f;
+ switchArena = true;
+ goto maskOff; // Jumps to this label to prevent the player from skipping the cutscene immediately.
}
}
break;
- case 1:
- if ((this->unk_1D14 < 80) && (D_809E0420 != 0) &&
+ case GIANTS_MASK_CS_STATE_MASK_ON:
+ if ((this->giantsMaskCsTimer < 80) && sCanSkipMaskOnCs &&
CHECK_BTN_ANY(CONTROLLER1(&play->state)->press.button,
BTN_A | BTN_B | BTN_CUP | BTN_CDOWN | BTN_CLEFT | BTN_CRIGHT)) {
- this->unk_1D18++;
- this->unk_1D78 = 1;
- this->unk_1D14 = 0;
+ this->giantsMaskCsState++;
+ this->giantsMaskCsFlashState = GIANTS_MASK_CS_FLASH_STATE_STARTED;
+ this->giantsMaskCsTimer = 0;
+ break;
+ }
+
+ maskOn:
+ if (this->giantsMaskCsTimer >= 50) {
+ if (this->giantsMaskCsTimer == (u32)(BREG(43) + 60)) {
+ Audio_PlaySfx(NA_SE_PL_TRANSFORM_GIANT);
+ }
+
+ // Makes the camera quickly move away from the player and look upwards as the player
+ // increases in size. Also decreases the fogNear from 0.0f to -100.0f.
+ Math_ApproachF(&this->subCamDistZFromPlayer, 200.0f, 0.1f, this->subCamAtVel * 640.0f);
+ Math_ApproachF(&this->subCamAtOffsetY, 273.0f, 0.1f, this->subCamAtVel * 150.0f);
+ Math_ApproachF(&this->playerScale, 0.1f, 0.2f, this->subCamAtVel * 0.1f);
+ Math_ApproachF(&this->fogNear, -100.0f, 1.0f, this->subCamAtVel * 100.0f);
+ Math_ApproachF(&this->subCamAtVel, 1.0f, 1.0f, 0.001f);
} else {
- label1:
- if (this->unk_1D14 >= 50) {
- if (this->unk_1D14 == (u32)(BREG(43) + 60)) {
- play_sound(NA_SE_PL_TRANSFORM_GIANT);
- }
- Math_ApproachF(&this->unk_1D64, 200.0f, 0.1f, this->subCamAtVel * 640.0f);
- Math_ApproachF(&this->unk_1D6C, 273.0f, 0.1f, this->subCamAtVel * 150.0f);
- Math_ApproachF(&this->unk_1D70, 0.1f, 0.2f, this->subCamAtVel * 0.1f);
- Math_ApproachF(&this->unk_1D74, -100.0f, 1.0f, this->subCamAtVel * 100.0f);
- Math_ApproachF(&this->subCamAtVel, 1.0f, 1.0f, 0.001f);
- } else {
- Math_ApproachF(&this->unk_1D64, 30.0f, 0.1f, 1.0f);
- }
+ // Makes the camera slowly approach the player.
+ Math_ApproachF(&this->subCamDistZFromPlayer, 30.0f, 0.1f, 1.0f);
+ }
- if (this->unk_1D14 > 50) {
- Math_ApproachZeroF(&this->unk_1D58, 1.0f, 0.06f);
- } else {
- Math_ApproachF(&this->unk_1D58, 0.4f, 1.0f, 0.02f);
- }
+ // Makes the camera roll side-to-side at the start of the cutscene, and stops
+ // the camera from rolling after 51 frames have passed.
+ if (this->giantsMaskCsTimer > 50) {
+ Math_ApproachZeroF(&this->subCamUpRotZScale, 1.0f, 0.06f);
+ } else {
+ Math_ApproachF(&this->subCamUpRotZScale, 0.4f, 1.0f, 0.02f);
+ }
- if (this->unk_1D14 == 107) {
- this->unk_1D78 = 1;
- }
+ if (this->giantsMaskCsTimer == 107) {
+ this->giantsMaskCsFlashState = GIANTS_MASK_CS_FLASH_STATE_STARTED;
+ }
- if (this->unk_1D14 < 121) {
- break;
- }
-
- sp57 = 1;
- D_809E0420 = 1;
- goto block_38;
+ if (this->giantsMaskCsTimer > 120) {
+ switchArena = true;
+ sCanSkipMaskOnCs = true;
+ goto done;
}
break;
- case 2:
- if (this->unk_1D14 < 8) {
- break;
+ case GIANTS_MASK_CS_STATE_MASK_ON_SKIPPED:
+ if (this->giantsMaskCsTimer >= 8) {
+ switchArena = true;
+ goto done;
}
- sp57 = 1;
- goto block_38;
+ break;
- case 10:
- if ((this->unk_1D14 < 30) && (D_809E0421 != 0) &&
+ case GIANTS_MASK_CS_STATE_MASK_OFF:
+ if ((this->giantsMaskCsTimer < 30) && sCanSkipMaskOffCs &&
CHECK_BTN_ANY(CONTROLLER1(&play->state)->press.button,
BTN_A | BTN_B | BTN_CUP | BTN_CDOWN | BTN_CLEFT | BTN_CRIGHT)) {
- this->unk_1D18++;
- this->unk_1D78 = 1;
- this->unk_1D14 = 0;
+ this->giantsMaskCsState++;
+ this->giantsMaskCsFlashState = GIANTS_MASK_CS_FLASH_STATE_STARTED;
+ this->giantsMaskCsTimer = 0;
break;
}
- label2:
- if (this->unk_1D14 != 0) {
- if (this->unk_1D14 == (u32)(BREG(44) + 10)) {
- play_sound(NA_SE_PL_TRANSFORM_NORAML);
+ maskOff:
+ if (this->giantsMaskCsTimer != 0) {
+ if (this->giantsMaskCsTimer == (u32)(BREG(44) + 10)) {
+ Audio_PlaySfx(NA_SE_PL_TRANSFORM_NORAML);
}
- Math_ApproachF(&this->unk_1D64, 60.0f, 0.1f, this->subCamAtVel * 640.0f);
- Math_ApproachF(&this->unk_1D6C, 23.0f, 0.1f, this->subCamAtVel * 150.0f);
- Math_ApproachF(&this->unk_1D70, 0.01f, 0.1f, 0.003f);
- Math_ApproachF(&this->unk_1D74, 0.0f, 1.0f, this->subCamAtVel * 100.0f);
+
+ // Makes the camera move slowly towards the player and look downwards as the player
+ // decreases in size. Also increases the fogNear from -100.0f to 0.0f.
+ Math_ApproachF(&this->subCamDistZFromPlayer, 60.0f, 0.1f, this->subCamAtVel * 640.0f);
+ Math_ApproachF(&this->subCamAtOffsetY, 23.0f, 0.1f, this->subCamAtVel * 150.0f);
+ Math_ApproachF(&this->playerScale, 0.01f, 0.1f, 0.003f);
+ Math_ApproachF(&this->fogNear, 0.0f, 1.0f, this->subCamAtVel * 100.0f);
Math_ApproachF(&this->subCamAtVel, 2.0f, 1.0f, 0.01f);
}
- if (this->unk_1D14 == 42) {
- this->unk_1D78 = 1;
+ if (this->giantsMaskCsTimer == 42) {
+ this->giantsMaskCsFlashState = GIANTS_MASK_CS_FLASH_STATE_STARTED;
}
- if (this->unk_1D14 > 50) {
- D_809E0421 = 1;
- goto block_38;
+ if (this->giantsMaskCsTimer > 50) {
+ sCanSkipMaskOffCs = true;
+ goto done;
}
break;
- case 11:
- if (this->unk_1D14 < 8) {
- break;
+ case GIANTS_MASK_CS_STATE_MASK_OFF_SKIPPED:
+ if (this->giantsMaskCsTimer >= 8) {
+ goto done;
}
+ break;
- block_38:
- case 20:
- this->unk_1D18 = 0;
+ done:
+ case GIANTS_MASK_CS_STATE_DONE:
+ // Ends the cutscene and restores the player's scale to its "original" value of 0.1f.
+ // This might seem strange in the case where the player has put on the Giant's Mask,
+ // since they seem so large after the cutscene ends. However, the player is still
+ // their normal size; the arena and everything in it has shrunk instead.
+ this->giantsMaskCsState = GIANTS_MASK_CS_STATE_WAITING_FOR_MASK;
func_80169AFC(play, this->subCamId, 0);
this->subCamId = SUB_CAM_ID_DONE;
- Cutscene_End(play, &play->csCtx);
- this->actor.flags |= ACTOR_FLAG_1;
+ Cutscene_StopManual(play, &play->csCtx);
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
player->stateFlags1 &= ~PLAYER_STATE1_100;
- this->unk_1D70 = 0.01f;
+ this->playerScale = 0.01f;
Play_DisableMotionBlur();
break;
}
if (player->transformation == PLAYER_FORM_FIERCE_DEITY) {
- Actor_SetScale(&player->actor, this->unk_1D70 * 1.5f);
+ Actor_SetScale(&player->actor, this->playerScale * 1.5f);
} else {
- Actor_SetScale(&player->actor, this->unk_1D70);
+ Actor_SetScale(&player->actor, this->playerScale);
}
- play->envCtx.lightSettings.fogNear = this->unk_1D74;
+ play->envCtx.adjLightSettings.fogNear = this->fogNear;
- if (sp57) {
- sIsInGiantMode = 1 - sIsInGiantMode;
+ // Switches from the "normal" variation of the arena to the "giant" variation (or vice versa)
+ // at the appropriate point in the Giant's Mask cutscene.
+ if (switchArena) {
+ sIsInGiantMode = true - sIsInGiantMode;
if (!sIsInGiantMode) {
- D_809DF5B0 = 1.0f;
+ sGiantModeScaleFactor = 1.0f;
} else {
- D_809DF5B0 = 0.1f;
+ sGiantModeScaleFactor = 0.1f;
}
- this->unk_01AC = D_809DF5B0;
+ this->giantModeScaleFactor = sGiantModeScaleFactor;
+
if (!sIsInGiantMode) {
+ // In this case, the player is switching from the "giant" arena to the "normal" arena.
+ // The "giant" arena sits 3150 units above the "normal" arena, so this moves the player,
+ // Twinmold, and the blue warp down and scales their world coordinates upwards to be
+ // appropriate for the larger arena.
if (sBlueWarp != NULL) {
sBlueWarp->unk_203 = 0;
sBlueWarp->unk_204 = 1.0f;
@@ -1790,6 +1859,10 @@ void func_809DD934(Boss02* this, PlayState* play) {
player->fallStartHeight = player->actor.world.pos.y;
player->actor.world.pos.z *= 10.0f;
+ // If the blue warp exists, and if the player is within 60 units of its center after switching
+ // to the "normal" arena, this code will move the player to a fixed point next to the blue warp.
+ // This prevents the player from instantly activating the blue warp after switching arenas, and
+ // it relies on the blue warp's XZ-coordinates being (0, 0) as they are in Twinmold's boss room.
if ((sBlueWarp != NULL) && ((SQ(player->actor.world.pos.z) + SQ(player->actor.world.pos.x)) < SQ(60.0f))) {
player->actor.world.pos.z = 60.0f;
player->actor.world.pos.x = 60.0f;
@@ -1850,7 +1923,11 @@ void func_809DD934(Boss02* this, PlayState* play) {
sBlueTwinmold->unk_0188.y *= 10.0f;
} else {
- if (sBlueWarp != 0) {
+ // In this case, the player is switching from the "normal" arena to the "giant" arena.
+ // The "giant" arena sits 3150 units above the "normal" arena, so this moves the player,
+ // Twinmold, and the blue warp up and scales their world coordinates downwards to be
+ // appropriate for the smaller arena.
+ if (sBlueWarp != NULL) {
sBlueWarp->unk_203 = 1;
sBlueWarp->unk_204 = 0.1f;
sBlueWarp->dyna.actor.world.pos.y = 3155.0f;
@@ -1920,113 +1997,120 @@ void func_809DD934(Boss02* this, PlayState* play) {
player->actor.home.pos = player->actor.world.pos;
player->actor.prevPos = player->actor.world.pos;
- temp_a0_5 = play->actorCtx.actorLists[ACTORCAT_BG].first;
- while (temp_a0_5 != NULL) {
- if (temp_a0_5->id == ACTOR_BG_INIBS_MOVEBG) {
- Actor_Kill(temp_a0_5);
+ // Kills the existing instance of Twinmold's arena and spawns a new instance with the appropriate
+ // scale and at the appropriate height.
+ actorIter = play->actorCtx.actorLists[ACTORCAT_BG].first;
+ while (actorIter != NULL) {
+ if (actorIter->id == ACTOR_BG_INIBS_MOVEBG) {
+ Actor_Kill(actorIter);
break;
}
- temp_a0_5 = temp_a0_5->next;
+
+ actorIter = actorIter->next;
}
{
- f32 tmp = sIsInGiantMode ? 3150.0f : 0.0f;
+ f32 arenaPosY = sIsInGiantMode ? 3150.0f : 0.0f;
- Actor_Spawn(&play->actorCtx, play, ACTOR_BG_INIBS_MOVEBG, 0, tmp, 0, 0, 0, 0, sIsInGiantMode);
+ Actor_Spawn(&play->actorCtx, play, ACTOR_BG_INIBS_MOVEBG, 0, arenaPosY, 0, 0, 0, 0, sIsInGiantMode);
}
- temp_a0_5 = play->actorCtx.actorLists[ACTORCAT_BOSS].first;
- while (temp_a0_5 != NULL) {
- if ((temp_a0_5->id == ACTOR_EN_TANRON5) || (temp_a0_5->id == ACTOR_ITEM_B_HEART)) {
+ // Moves the props in Twinmold's arena and the Heart Container 3150 units up or down
+ // so they're in the appropriate arena and scales them accordingly.
+ actorIter = play->actorCtx.actorLists[ACTORCAT_BOSS].first;
+ while (actorIter != NULL) {
+ if ((actorIter->id == ACTOR_EN_TANRON5) || (actorIter->id == ACTOR_ITEM_B_HEART)) {
if (!sIsInGiantMode) {
- temp_a0_5->world.pos.y -= 3150.0f;
- temp_a0_5->world.pos.y *= 10.0f;
+ actorIter->world.pos.y -= 3150.0f;
+ actorIter->world.pos.y *= 10.0f;
- temp_a0_5->floorHeight -= 3150.0f;
- temp_a0_5->floorHeight *= 10.0f;
+ actorIter->floorHeight -= 3150.0f;
+ actorIter->floorHeight *= 10.0f;
- phi_f0_2 = 10.0f;
+ scale = 10.0f;
} else {
- temp_a0_5->world.pos.y *= 0.1f;
- temp_a0_5->world.pos.y += 3150.0f;
+ actorIter->world.pos.y *= 0.1f;
+ actorIter->world.pos.y += 3150.0f;
- temp_a0_5->floorHeight *= 0.1f;
- temp_a0_5->floorHeight += 3150.0f;
+ actorIter->floorHeight *= 0.1f;
+ actorIter->floorHeight += 3150.0f;
- phi_f0_2 = 0.1f;
+ scale = 0.1f;
}
- temp_a0_5->world.pos.x *= phi_f0_2;
- temp_a0_5->world.pos.z *= phi_f0_2;
+ actorIter->world.pos.x *= scale;
+ actorIter->world.pos.z *= scale;
- temp_a0_5->speedXZ *= phi_f0_2;
+ actorIter->speed *= scale;
- temp_a0_5->velocity.x *= phi_f0_2;
- temp_a0_5->velocity.y *= phi_f0_2;
- temp_a0_5->velocity.z *= phi_f0_2;
+ actorIter->velocity.x *= scale;
+ actorIter->velocity.y *= scale;
+ actorIter->velocity.z *= scale;
- temp_a0_5->gravity *= phi_f0_2;
- temp_a0_5->terminalVelocity *= phi_f0_2;
+ actorIter->gravity *= scale;
+ actorIter->terminalVelocity *= scale;
- temp_a0_5->scale.x *= phi_f0_2;
- temp_a0_5->scale.y *= phi_f0_2;
- temp_a0_5->scale.z *= phi_f0_2;
+ actorIter->scale.x *= scale;
+ actorIter->scale.y *= scale;
+ actorIter->scale.z *= scale;
- if (temp_a0_5->id == ACTOR_ITEM_B_HEART) {
- ((ItemBHeart*)temp_a0_5)->unk_168 *= phi_f0_2;
+ if (actorIter->id == ACTOR_ITEM_B_HEART) {
+ ((ItemBHeart*)actorIter)->baseScale *= scale;
}
}
- temp_a0_5 = temp_a0_5->next;
+
+ actorIter = actorIter->next;
}
}
- switch (this->unk_1D78) {
- case 0:
+ switch (this->giantsMaskCsFlashState) {
+ case GIANTS_MASK_CS_FLASH_STATE_NOT_STARTED:
break;
- case 1:
- this->unk_1D7A = 0;
- func_809DA1D0(play, 255, 255, 255, 0);
- this->unk_1D78 = 2;
- play_sound(NA_SE_SY_TRANSFORM_MASK_FLASH);
-
- case 2:
- this->unk_1D7A += 40;
- if (this->unk_1D7A >= 400) {
- this->unk_1D78 = 3;
+ case GIANTS_MASK_CS_FLASH_STATE_STARTED:
+ this->giantsMaskCsFlashAlpha = 0;
+ Boss02_FillScreen(play, 255, 255, 255, 0);
+ this->giantsMaskCsFlashState = GIANTS_MASK_CS_FLASH_STATE_INCREASE_ALPHA;
+ Audio_PlaySfx(NA_SE_SY_TRANSFORM_MASK_FLASH);
+ // fallthrough
+ case GIANTS_MASK_CS_FLASH_STATE_INCREASE_ALPHA:
+ this->giantsMaskCsFlashAlpha += 40;
+ if (this->giantsMaskCsFlashAlpha >= 400) {
+ this->giantsMaskCsFlashState = GIANTS_MASK_CS_FLASH_STATE_DECREASE_ALPHA;
}
- alpha = this->unk_1D7A;
+
+ alpha = this->giantsMaskCsFlashAlpha;
alpha = CLAMP_MAX(alpha, 255);
- func_809DA22C(play, alpha);
+ Boss02_SetFillScreenAlpha(play, alpha);
break;
- case 3:
- this->unk_1D7A -= 40;
- if (this->unk_1D7A <= 0) {
- this->unk_1D7A = 0;
- this->unk_1D78 = 0;
- func_809DA24C(play);
+ case GIANTS_MASK_CS_FLASH_STATE_DECREASE_ALPHA:
+ this->giantsMaskCsFlashAlpha -= 40;
+ if (this->giantsMaskCsFlashAlpha <= 0) {
+ this->giantsMaskCsFlashAlpha = 0;
+ this->giantsMaskCsFlashState = GIANTS_MASK_CS_FLASH_STATE_NOT_STARTED;
+ Boss02_StopFillScreen(play);
} else {
- alpha = this->unk_1D7A;
+ alpha = this->giantsMaskCsFlashAlpha;
alpha = CLAMP_MAX(alpha, 255);
- func_809DA22C(play, alpha);
+ Boss02_SetFillScreenAlpha(play, alpha);
}
break;
}
- if ((this->unk_1D18 != 0) && (this->subCamId != SUB_CAM_ID_DONE)) {
+ if ((this->giantsMaskCsState != GIANTS_MASK_CS_STATE_WAITING_FOR_MASK) && (this->subCamId != SUB_CAM_ID_DONE)) {
Matrix_RotateYS(player->actor.shape.rot.y, MTXMODE_NEW);
- Matrix_MultVecZ(this->unk_1D64, &sp58);
+ Matrix_MultVecZ(this->subCamDistZFromPlayer, &subCamEyeOffset);
- this->subCamEye.x = player->actor.world.pos.x + sp58.x;
- this->subCamEye.y = player->actor.world.pos.y + sp58.y + this->unk_1D68;
- this->subCamEye.z = player->actor.world.pos.z + sp58.z;
+ this->subCamEye.x = player->actor.world.pos.x + subCamEyeOffset.x;
+ this->subCamEye.y = player->actor.world.pos.y + subCamEyeOffset.y + this->subCamEyeOffsetY;
+ this->subCamEye.z = player->actor.world.pos.z + subCamEyeOffset.z;
this->subCamAt.x = player->actor.world.pos.x;
- this->subCamAt.y = player->actor.world.pos.y + this->unk_1D6C;
+ this->subCamAt.y = player->actor.world.pos.y + this->subCamAtOffsetY;
this->subCamAt.z = player->actor.world.pos.z;
- this->unk_1D54 = Math_SinS(this->unk_1D14 * 1512) * this->unk_1D58;
- Matrix_RotateZF(this->unk_1D54, MTXMODE_APPLY);
+ this->subCamUpRotZ = Math_SinS(this->giantsMaskCsTimer * 1512) * this->subCamUpRotZScale;
+ Matrix_RotateZF(this->subCamUpRotZ, MTXMODE_APPLY);
Matrix_MultVecY(1.0f, &this->subCamUp);
Play_SetCameraAtEyeUp(play, this->subCamId, &this->subCamAt, &this->subCamEye, &this->subCamUp);
ShrinkWindow_Letterbox_SetSizeTarget(27);
@@ -2037,7 +2121,7 @@ void func_809DEAC4(Boss02* this, PlayState* play) {
Player* player = GET_PLAYER(play);
Boss02* sp68;
Vec3f subCamEye;
- f32 sp58 = 0.0f;
+ f32 subCamEyeOffset = 0.0f;
this->unk_1D1C++;
if (this->unk_0194 == 0) {
@@ -2051,10 +2135,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);
@@ -2076,10 +2161,10 @@ void func_809DEAC4(Boss02* this, PlayState* play) {
Rumble_Override(0.0f, 50, 200, 1);
}
this->unk_0150 += 0x4000;
- sp58 = (Math_SinS(this->unk_0150) * (BREG(19) + 5)) * 0.1f;
+ subCamEyeOffset = (Math_SinS(this->unk_0150) * (BREG(19) + 5)) * 0.1f;
Matrix_RotateZF(Math_SinS(this->unk_1D1C * 0x3000) * ((KREG(28) * 0.001f) + 0.017f), MTXMODE_NEW);
Matrix_MultVecY(1.0f, &this->subCamUp);
- func_8019F128(NA_SE_EV_EARTHQUAKE_LAST - SFX_FLAG);
+ Audio_PlaySfx_2(NA_SE_EV_EARTHQUAKE_LAST - SFX_FLAG);
}
if (this->unk_1D1C == 20) {
@@ -2139,9 +2224,9 @@ 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);
- this->actor.flags |= ACTOR_FLAG_1;
+ Cutscene_StopManual(play, &play->csCtx);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_END);
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->unk_1D20 = 0;
sRedTwinmold->unk_0144 = sBlueTwinmold->unk_0144 = 3;
sRedTwinmold->unk_0146[0] = sBlueTwinmold->unk_0146[0] = 60;
@@ -2150,8 +2235,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);
@@ -2182,8 +2267,8 @@ void func_809DEAC4(Boss02* this, PlayState* play) {
this->subCamEye.y = 3160.0f;
}
- if (this->subCamAtNext.y < (100.0f * D_809DF5B0)) {
- this->subCamAtNext.y = (100.0f * D_809DF5B0);
+ if (this->subCamAtNext.y < (100.0f * sGiantModeScaleFactor)) {
+ this->subCamAtNext.y = (100.0f * sGiantModeScaleFactor);
}
this->subCamEye.z = player->actor.world.pos.z;
@@ -2195,25 +2280,27 @@ void func_809DEAC4(Boss02* this, PlayState* play) {
case 103:
this->unk_0150 += 0x4000;
- sp58 = Math_SinS(this->unk_0150);
- sp58 = (sp58 * this->unk_0146[0]) * 1.5f;
+ subCamEyeOffset = Math_SinS(this->unk_0150);
+ subCamEyeOffset = (subCamEyeOffset * this->unk_0146[0]) * 1.5f;
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;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
sp68->unk_0144 = 10;
if ((sRedTwinmold->unk_0144 >= 10) && (sBlueTwinmold->unk_0144 >= 10)) {
f32 phi_f0;
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,
@@ -2233,7 +2320,7 @@ void func_809DEAC4(Boss02* this, PlayState* play) {
if ((this->unk_1D20 != 0) && (this->subCamId != SUB_CAM_ID_DONE)) {
subCamEye = this->subCamEye;
- subCamEye.y += sp58 * D_809DF5B0;
+ subCamEye.y += subCamEyeOffset * sGiantModeScaleFactor;
Play_SetCameraAtEyeUp(play, this->subCamId, &this->subCamAt, &subCamEye, &this->subCamUp);
this->subCamUp.z = this->subCamUp.x = 0.0f;
this->subCamUp.y = 1.0f;
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..41f373b52 100644
--- a/src/overlays/actors/ovl_Boss_02/z_boss_02.h
+++ b/src/overlays/actors/ovl_Boss_02/z_boss_02.h
@@ -6,6 +6,8 @@
struct Boss02;
+#define TWINMOLD_GET_TYPE(thisx) ((thisx)->params)
+
typedef void (*Boss02ActionFunc)(struct Boss02*, PlayState*);
typedef struct {
@@ -25,17 +27,19 @@ typedef struct {
typedef enum {
/* 0 */ TWINMOLD_EFFECT_NONE,
/* 1 */ TWINMOLD_EFFECT_SAND, // The sand kicked up when Twinmold touches the ground
- /* 2 */ TWINMOLD_EFFECT_BLACK_DUST, // Unused
+ /* 2 */ TWINMOLD_EFFECT_BLACK_DUST, // The dust that appears when either Twinmold or the player destroys a ruin
/* 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;
+#define TWINMOLD_EFFECT_COUNT 150
+
typedef enum {
- /* 0 */ TWINMOLD_RED,
- /* 35 */ TWINMOLD_BLUE = 35,
- /* 100 */ TWINMOLD_TAIL = 100,
- /* 200 */ TWINMOLD_STATIC = 200,
-} TwinmoldParams;
+ /* 0 */ TWINMOLD_TYPE_RED,
+ /* 35 */ TWINMOLD_TYPE_BLUE = 35,
+ /* 100 */ TWINMOLD_TYPE_TAIL = 100,
+ /* 200 */ TWINMOLD_TYPE_STATIC = 200
+} TwinmoldType;
typedef struct Boss02 {
/* 0x0000 */ Actor actor;
@@ -66,7 +70,7 @@ typedef struct Boss02 {
/* 0x01A0 */ f32 unk_01A0;
/* 0x01A4 */ s16 unk_01A4;
/* 0x01A8 */ f32 unk_01A8;
- /* 0x01AC */ f32 unk_01AC;
+ /* 0x01AC */ f32 giantModeScaleFactor;
/* 0x01B0 */ Vec3f unk_01B0;
/* 0x01BC */ Vec3f unk_01BC[200];
/* 0x0B1C */ Vec3f unk_0B1C[200];
@@ -83,8 +87,8 @@ typedef struct Boss02 {
/* 0x1C28 */ ColliderJntSph colliderSphere2;
/* 0x1C48 */ ColliderJntSphElement colliderSphere2Elements[2];
/* 0x1CC8 */ ColliderCylinder colliderCylinder;
- /* 0x1D14 */ u32 unk_1D14;
- /* 0x1D18 */ s16 unk_1D18;
+ /* 0x1D14 */ u32 giantsMaskCsTimer;
+ /* 0x1D18 */ s16 giantsMaskCsState;
/* 0x1D1A */ s16 unk_1D1A;
/* 0x1D1C */ u32 unk_1D1C;
/* 0x1D20 */ s16 unk_1D20;
@@ -93,17 +97,17 @@ typedef struct Boss02 {
/* 0x1D30 */ Vec3f subCamAt;
/* 0x1D3C */ Vec3f subCamUp;
/* 0x1D48 */ Vec3f subCamAtNext;
- /* 0x1D54 */ f32 unk_1D54;
- /* 0x1D58 */ f32 unk_1D58;
+ /* 0x1D54 */ f32 subCamUpRotZ;
+ /* 0x1D58 */ f32 subCamUpRotZScale;
/* 0x1D5C */ f32 subCamAtVel;
/* 0x1D60 */ UNK_TYPE1 unk1D60[0x4];
- /* 0x1D64 */ f32 unk_1D64;
- /* 0x1D68 */ f32 unk_1D68;
- /* 0x1D6C */ f32 unk_1D6C;
- /* 0x1D70 */ f32 unk_1D70;
- /* 0x1D74 */ f32 unk_1D74;
- /* 0x1D78 */ u8 unk_1D78;
- /* 0x1D7A */ s16 unk_1D7A;
+ /* 0x1D64 */ f32 subCamDistZFromPlayer;
+ /* 0x1D68 */ f32 subCamEyeOffsetY;
+ /* 0x1D6C */ f32 subCamAtOffsetY;
+ /* 0x1D70 */ f32 playerScale;
+ /* 0x1D74 */ f32 fogNear;
+ /* 0x1D78 */ u8 giantsMaskCsFlashState;
+ /* 0x1D7A */ s16 giantsMaskCsFlashAlpha;
/* 0x1D7C */ s16 unk_1D7C;
/* 0x1D7E */ s16 unk_1D7E;
} Boss02; // size = 0x1D80
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 f51c94458..e9394f783 100644
--- a/src/overlays/actors/ovl_Boss_03/z_boss_03.c
+++ b/src/overlays/actors/ovl_Boss_03/z_boss_03.c
@@ -48,13 +48,15 @@
* - Effect Update/Draw
* - Seaweed
*/
+
#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"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((Boss03*)thisx)
@@ -120,7 +122,7 @@ GyorgEffect sGyorgEffects[GYORG_EFFECT_COUNT];
Boss03* sGyorgBossInstance;
void Boss03_PlayUnderwaterSfx(Vec3f* projectedPos, u16 sfxId) {
- func_8019F420(projectedPos, sfxId);
+ Audio_PlaySfx_Underwater(projectedPos, sfxId);
}
/* Start of SpawnEffect section */
@@ -161,8 +163,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 +426,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 +450,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;
}
@@ -473,7 +476,7 @@ void Boss03_Init(Actor* thisx, PlayState* play2) {
this->jointTable[i].z = Math_SinS(this->unk_240 * 0x10 + i * 19000) * 4000.0f;
}
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
return;
}
@@ -504,7 +507,7 @@ void Boss03_Init(Actor* thisx, PlayState* play2) {
sGyorgEffects[i].type = GYORG_EFFECT_NONE;
}
- this->actor.targetMode = 5;
+ this->actor.targetMode = TARGET_MODE_5;
this->actor.colChkInfo.mass = MASS_HEAVY;
this->actor.colChkInfo.health = 10;
@@ -518,7 +521,7 @@ void Boss03_Init(Actor* thisx, PlayState* play2) {
if ((KREG(64) != 0) || CHECK_EVENTINF(EVENTINF_56)) {
this->actionFunc = func_809E344C;
D_809E9842 = false;
- Audio_QueueSeqCmd(NA_BGM_STOP | 0x10000);
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 1);
} else {
Boss03_SetupIntroCutscene(this, play);
D_809E9842 = true;
@@ -542,7 +545,7 @@ void func_809E344C(Boss03* this, PlayState* play) {
this->actionFunc = func_809E34B8;
Animation_MorphToLoop(&this->skelAnime, &gGyorgFastSwimmingAnim, -15.0f);
this->unk_274 = 0;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}
}
@@ -581,10 +584,10 @@ void func_809E34B8(Boss03* this, PlayState* play) {
Math_ApproachS(&this->bodyYRot, bodyYRotTarget, 5, 0x100);
Math_ApproachS(&this->unk_274, this->unk_276, 1, 0x100);
- Math_ApproachF(&this->actor.speedXZ, this->unk_278, 1.0f, this->unk_27C);
+ Math_ApproachF(&this->actor.speed, this->unk_278, 1.0f, this->unk_27C);
Math_ApproachF(&this->unk_260, sinf(this->skelAnime.curFrame * (M_PI / 5.0f)) * 10.0f * 0.01f, 0.5f, 1.0f);
- if ((this->workTimer[WORK_TIMER_UNK2_A] == 0) && (this->actor.bgCheckFlags & 8)) {
+ if ((this->workTimer[WORK_TIMER_UNK2_A] == 0) && (this->actor.bgCheckFlags & BGCHECKFLAG_WALL)) {
Matrix_MultVecZ(-500.0f, &this->unk_268);
this->unk_268.y = Rand_ZeroFloat(100.0f) + 150.0f;
this->workTimer[WORK_TIMER_UNK2_A] = 60;
@@ -595,9 +598,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;
@@ -618,7 +621,7 @@ void func_809E34B8(Boss03* this, PlayState* play) {
if (this->workTimer[WORK_TIMER_UNK1_A] == 0) {
// Player is above water && Player is standing on ground
- if ((this->waterHeight < player->actor.world.pos.y) && (player->actor.bgCheckFlags & 1)) {
+ if ((this->waterHeight < player->actor.world.pos.y) && (player->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
Boss03_SetupPrepareCharge(this, play);
} else if ((player->transformation != PLAYER_FORM_GORON) && (player->transformation != PLAYER_FORM_DEKU)) {
if (KREG(70) == 0) {
@@ -669,7 +672,7 @@ void Boss03_ChasePlayer(Boss03* this, PlayState* play) {
Math_ApproachS(&this->bodyYRot, bodyYRotTarget, 5, 0x100);
Math_ApproachS(&this->unk_274, this->unk_276, 1, 0x100);
- Math_ApproachF(&this->actor.speedXZ, this->unk_278, 1.0f, this->unk_27C);
+ Math_ApproachF(&this->actor.speed, this->unk_278, 1.0f, this->unk_27C);
Math_ApproachF(&this->unk_260, sinf(this->skelAnime.curFrame * (M_PI / 5.0f)) * 10.0f * 0.01f, 0.5f, 1.0f);
Actor_MoveWithoutGravityReverse(&this->actor);
@@ -678,12 +681,13 @@ void Boss03_ChasePlayer(Boss03* this, PlayState* play) {
// If either (Player is standing on ground && Player is above water) or (WORK_TIMER_CURRENT_ACTION timer runs out),
// then stop chasing
- if (((player->actor.bgCheckFlags & 1) && (player->actor.shape.feetPos[0].y >= WATER_HEIGHT + 8.0f)) ||
+ if (((player->actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
+ (player->actor.shape.feetPos[0].y >= WATER_HEIGHT + 8.0f)) ||
(this->workTimer[WORK_TIMER_CURRENT_ACTION] == 0)) {
if (&this->actor == player->actor.parent) {
- player->unk_AE8 = 101;
+ player->actionVar2 = 101;
player->actor.parent = NULL;
- player->csMode = PLAYER_CSMODE_0;
+ player->csMode = PLAYER_CSMODE_NONE;
}
func_809E344C(this, play);
@@ -751,7 +755,7 @@ void Boss03_CatchPlayer(Boss03* this, PlayState* play) {
this->unk_276 = 0x1000;
this->unk_2BD = true;
this->unk_278 = 15.0f;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
SkelAnime_Update(&this->skelAnime);
@@ -765,7 +769,7 @@ void Boss03_CatchPlayer(Boss03* this, PlayState* play) {
-0.5f,
5, 0x100);
Math_ApproachS(&this->unk_274, this->unk_276, 1, 0x100);
- Math_ApproachF(&this->actor.speedXZ, this->unk_278, 1.0f, this->unk_27C);
+ Math_ApproachF(&this->actor.speed, this->unk_278, 1.0f, this->unk_27C);
Math_ApproachF(&this->unk_260, sinf(this->skelAnime.curFrame * (M_PI / 5.0f)) * 10.0f * 0.01f, 0.5f, 1.0f);
Actor_MoveWithoutGravityReverse(&this->actor);
Math_ApproachS(&this->actor.shape.rot.x, this->actor.world.rot.x, 2, this->unk_274 * 2);
@@ -773,12 +777,13 @@ void Boss03_CatchPlayer(Boss03* this, PlayState* play) {
// If either (Player is standing on ground && Player is above water) or (WORK_TIMER_CURRENT_ACTION timer runs out)
// then stop trying to catch Player
- if (((player->actor.bgCheckFlags & 1) && (player->actor.shape.feetPos[FOOT_LEFT].y >= WATER_HEIGHT + 8.0f)) ||
+ if (((player->actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
+ (player->actor.shape.feetPos[FOOT_LEFT].y >= WATER_HEIGHT + 8.0f)) ||
(this->workTimer[WORK_TIMER_CURRENT_ACTION] == 0)) {
if (&this->actor == player->actor.parent) {
- player->unk_AE8 = 101;
+ player->actionVar2 = 101;
player->actor.parent = NULL;
- player->csMode = PLAYER_CSMODE_0;
+ player->csMode = PLAYER_CSMODE_NONE;
Play_DisableMotionBlur();
}
@@ -873,7 +878,7 @@ void Boss03_ChewPlayer(Boss03* this, PlayState* play) {
switch (this->unk_242) {
case 0:
- Math_ApproachF(&this->actor.speedXZ, 10.0f, 1.0f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 10.0f, 1.0f, 1.0f);
if (sqrtf(SQ(xDiff) + SQ(zDiff)) < 100.0f) {
this->unk_242 = 1;
Animation_MorphToLoop(&this->skelAnime, &gGyorgBackingUpAnim, -15.0f);
@@ -881,7 +886,7 @@ void Boss03_ChewPlayer(Boss03* this, PlayState* play) {
break;
case 1:
- Math_ApproachF(&this->actor.speedXZ, 0.0f, 1.0f, 0.5f);
+ Math_ApproachF(&this->actor.speed, 0.0f, 1.0f, 0.5f);
Math_ApproachF(&this->actor.world.pos.y, 200.0f, 0.05f, 5.0f);
break;
}
@@ -904,9 +909,9 @@ void Boss03_ChewPlayer(Boss03* this, PlayState* play) {
// Stop chewing when the timer runs out
if (this->workTimer[WORK_TIMER_CURRENT_ACTION] == 0) {
if (&this->actor == player->actor.parent) {
- player->unk_AE8 = 101;
+ player->actionVar2 = 101;
player->actor.parent = NULL;
- player->csMode = PLAYER_CSMODE_0;
+ player->csMode = PLAYER_CSMODE_NONE;
Play_DisableMotionBlur();
func_800B8D50(play, NULL, 10.0f, this->actor.shape.rot.y, 0.0f, 0x20);
}
@@ -985,7 +990,7 @@ void Boss03_PrepareCharge(Boss03* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
// Player is above water && Player is standing on ground
- if ((this->waterHeight < player->actor.world.pos.y) && (player->actor.bgCheckFlags & 1)) {
+ if ((this->waterHeight < player->actor.world.pos.y) && (player->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
if (this->workTimer[WORK_TIMER_CURRENT_ACTION] == 0) {
Boss03_SetupCharge(this, play);
}
@@ -995,7 +1000,7 @@ void Boss03_PrepareCharge(Boss03* this, PlayState* play) {
}
// Turns back slowly
- Math_ApproachF(&this->actor.speedXZ, -3.0f, 1.0f, 0.5f);
+ Math_ApproachF(&this->actor.speed, -3.0f, 1.0f, 0.5f);
Actor_MoveWithoutGravityReverse(&this->actor);
}
@@ -1032,11 +1037,11 @@ void Boss03_Charge(Boss03* this, PlayState* play) {
this->actor.shape.rot = this->actor.world.rot;
- Math_ApproachF(&this->actor.speedXZ, 25.0f, 1.0f, 3.0f);
+ Math_ApproachF(&this->actor.speed, 25.0f, 1.0f, 3.0f);
Math_ApproachF(&this->unk_260, sinf(this->skelAnime.curFrame * (M_PI / 5.0f)) * 10.0f * 0.01f, 0.5f, 1.0f);
Actor_MoveWithoutGravityReverse(&this->actor);
- if (this->actor.speedXZ >= 20.0f) {
+ if (this->actor.speed >= 20.0f) {
// Jump over platform
if (this->unk_242 == 1) {
if (sqrtf(SQXZ(this->actor.world.pos)) < 700.0f) {
@@ -1046,14 +1051,14 @@ void Boss03_Charge(Boss03* this, PlayState* play) {
}
// Attack platform
- if (this->actor.bgCheckFlags & 8) {
- play_sound(NA_SE_IT_BIG_BOMB_EXPLOSION);
- func_800BC848(&this->actor, play, 20, 15);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
+ Audio_PlaySfx(NA_SE_IT_BIG_BOMB_EXPLOSION);
+ 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);
// Player is above water && Player is standing on ground
- if ((this->waterHeight < player->actor.world.pos.y) && (player->actor.bgCheckFlags & 1)) {
+ if ((this->waterHeight < player->actor.world.pos.y) && (player->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
func_800B8D50(play, NULL, 7.0f, Math_Atan2S_XY(player->actor.world.pos.z, player->actor.world.pos.x),
7.0f, 0);
}
@@ -1068,7 +1073,7 @@ void Boss03_SetupJumpOverPlatform(Boss03* this, PlayState* play) {
this->actionFunc = Boss03_JumpOverPlatform;
this->actor.gravity = -2.0f;
this->actor.velocity.y = 30.0f;
- this->actor.speedXZ = 25.0f;
+ this->actor.speed = 25.0f;
Boss03_PlayUnderwaterSfx(&this->actor.projectedPos, NA_SE_EN_KONB_JUMP_OLD);
}
@@ -1096,9 +1101,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);
}
}
@@ -1143,8 +1148,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);
@@ -1163,7 +1168,7 @@ void Boss03_IntroCutscene(Boss03* this, PlayState* play) {
this->subCamAt.y = player->actor.world.pos.y + 30.0f;
this->csState = 1;
this->csTimer = 0;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->unk_2D5 = true;
this->subCamFov = KREG(14) + 60.0f;
@@ -1171,7 +1176,7 @@ void Boss03_IntroCutscene(Boss03* this, PlayState* play) {
case 1:
player->actor.world.pos.z = 0.0f;
player->actor.world.pos.x = 0.0f;
- player->actor.speedXZ = 0.0f;
+ player->actor.speed = 0.0f;
this->subCamEye.x = 100.0f;
this->subCamEye.y = 540.0f;
@@ -1190,7 +1195,7 @@ void Boss03_IntroCutscene(Boss03* this, PlayState* play) {
this->subCamFov = 80.0f;
case 2:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KONB_DEMO_MOVE_OLD - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KONB_DEMO_MOVE_OLD - SFX_FLAG);
xDiff = D_809E9104[this->unk_242].x - this->actor.world.pos.x;
yDiff = D_809E9104[this->unk_242].y - this->actor.world.pos.y;
@@ -1206,11 +1211,11 @@ void Boss03_IntroCutscene(Boss03* this, PlayState* play) {
}
if ((this->csTimer == 40) || (this->csTimer == (u32)(KREG(91) + 270))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_WATER_DEEP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_WATER_DEEP);
}
if (this->csTimer > 50) {
- Math_ApproachF(&this->actor.speedXZ, this->unk_278, 1.0f, 0.1f);
+ Math_ApproachF(&this->actor.speed, this->unk_278, 1.0f, 0.1f);
}
if (this->unk_242 < 2) {
@@ -1225,15 +1230,15 @@ void Boss03_IntroCutscene(Boss03* this, PlayState* play) {
} else {
this->unk_278 = 0.0f;
bubblesToSpawnNum = 1;
- if ((this->actor.speedXZ == 0.0f) && (this->csTimer > 230)) {
+ if ((this->actor.speed == 0.0f) && (this->csTimer > 230)) {
this->csState = 3;
this->csTimer = 0;
}
if (this->csTimer == 165) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_WATER_MID);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_WATER_MID);
}
if (this->csTimer == 180) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_WATER_DEEP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_WATER_DEEP);
}
}
}
@@ -1243,7 +1248,7 @@ void Boss03_IntroCutscene(Boss03* this, PlayState* play) {
case 3:
Boss03_PlayUnderwaterSfx(&this->actor.projectedPos, NA_SE_EN_KONB_PREATTACK_OLD - SFX_FLAG);
sp5A = 0x1970;
- Math_ApproachF(&this->actor.speedXZ, 15.0f, 1.0f, 2.0f);
+ Math_ApproachF(&this->actor.speed, 15.0f, 1.0f, 2.0f);
if (this->csTimer > 20) {
this->csState = 4;
this->csTimer = 0;
@@ -1276,14 +1281,14 @@ void Boss03_IntroCutscene(Boss03* this, PlayState* play) {
this->csState = 5;
this->csTimer = 0;
this->unk_2D5 = false;
- this->actor.speedXZ = -200.0f;
+ this->actor.speed = -200.0f;
Actor_MoveWithoutGravityReverse(&this->actor);
this->actor.world.pos.y = this->waterHeight - 150.0f;
Play_DisableMotionBlur();
case 5:
SkelAnime_Update(&this->skelAnime);
- this->actor.speedXZ = 20.0f;
+ this->actor.speed = 20.0f;
Actor_MoveWithoutGravityReverse(&this->actor);
player->actor.shape.rot.y = -0x1470;
player->actor.world.rot.y = player->actor.shape.rot.y;
@@ -1301,17 +1306,17 @@ void Boss03_IntroCutscene(Boss03* this, PlayState* play) {
this->csState = 6;
this->csTimer = 0;
this->actor.gravity = -1.5f;
- this->actor.speedXZ = 20.0f;
+ this->actor.speed = 20.0f;
- Audio_QueueSeqCmd(NA_BGM_BOSS | 0x8000);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KONB_JUMP_OLD);
+ SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_BOSS | SEQ_FLAG_ASYNC);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KONB_JUMP_OLD);
this->skelAnime.playSpeed = 1.0f;
}
}
break;
case 6:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KONB_JUMP_LEV_OLD - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KONB_JUMP_LEV_OLD - SFX_FLAG);
if (this->csTimer == 30) {
TitleCard_InitBossName(&play->state, &play->actorCtx.titleCtxt,
@@ -1326,16 +1331,16 @@ void Boss03_IntroCutscene(Boss03* this, PlayState* play) {
this->bubbleEffectSpawnCount = 2;
this->actor.gravity = 0.0f;
Math_ApproachZeroF(&this->actor.velocity.y, 1.0f, 1.0f);
- Math_ApproachZeroF(&this->actor.speedXZ, 1.0f, 0.5f);
+ Math_ApproachZeroF(&this->actor.speed, 1.0f, 0.5f);
} else {
if (1) {}
if (1) {}
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);
}
@@ -1365,8 +1370,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);
@@ -1382,7 +1387,7 @@ void Boss03_IntroCutscene(Boss03* this, PlayState* play) {
if ((this->csState == 2) || (this->csState == 3)) {
Actor_MoveWithoutGravityReverse(&this->actor);
- phi_f2 = this->actor.speedXZ * 0.02f;
+ phi_f2 = this->actor.speed * 0.02f;
phi_f2 = CLAMP_MAX(phi_f2, 0.12f);
sp5C = Math_SinS(this->unk_240 * sp5A) * phi_f2;
@@ -1395,9 +1400,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);
}
@@ -1413,11 +1418,11 @@ void Boss03_SetupDeathCutscene(Boss03* this, PlayState* play) {
this->actionFunc = Boss03_DeathCutscene;
Animation_MorphToLoop(&this->skelAnime, &gGyorgFloppingAnim, -10.0f);
this->floppingAnimLastFrame = Animation_GetLastFrame(&gGyorgFloppingAnim);
- Audio_QueueSeqCmd(NA_BGM_STOP | 0x10000);
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 1);
this->workTimer[WORK_TIMER_UNK0_C] = 0;
this->unk_242 = 0;
this->csState = 0;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
void Boss03_DeathCutscene(Boss03* this, PlayState* play) {
@@ -1442,8 +1447,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);
@@ -1451,7 +1456,8 @@ void Boss03_DeathCutscene(Boss03* this, PlayState* play) {
this->unk_2BE = Math_Atan2S_XY(this->actor.world.pos.z, this->actor.world.pos.x);
// Player is above water && Player is standing on ground
- if ((this->waterHeight < player->actor.world.pos.y) && (player->actor.bgCheckFlags & 1)) {
+ if ((this->waterHeight < player->actor.world.pos.y) &&
+ (player->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
player->actor.world.pos.x = 0.0f;
player->actor.world.pos.z = -200.0f;
}
@@ -1514,10 +1520,10 @@ void Boss03_DeathCutscene(Boss03* this, PlayState* play) {
Math_ApproachF(&this->actor.world.pos.z, sp84.z, 0.1f, 5.0f);
if (Animation_OnFrame(&this->skelAnime, this->floppingAnimLastFrame)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KONB_DEAD_JUMP2_OLD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KONB_DEAD_JUMP2_OLD);
}
if (Animation_OnFrame(&this->skelAnime, this->floppingAnimLastFrame * 0.5f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KONB_DEAD_JUMP_OLD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KONB_DEAD_JUMP_OLD);
}
if ((this->workTimer[WORK_TIMER_UNK0_C] == 0) && ((this->waterHeight - 100.0f) < this->actor.world.pos.y)) {
@@ -1544,10 +1550,10 @@ void Boss03_DeathCutscene(Boss03* this, PlayState* play) {
this->unk_242 = 1;
this->actor.gravity = -2.0f;
this->actor.velocity.y = 25.0f;
- this->actor.speedXZ = 10.0f;
+ this->actor.speed = 10.0f;
this->actor.world.rot.y = this->unk_2BE + 0x8000;
this->unk_240 = 0;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KONB_DEAD_JUMP2_OLD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KONB_DEAD_JUMP2_OLD);
}
}
Math_ApproachF(&this->unk_56C, 0.01f, 1.0f, 0.0005f);
@@ -1555,7 +1561,7 @@ void Boss03_DeathCutscene(Boss03* this, PlayState* play) {
case 1:
if (this->unk_240 == 0x96) {
- Audio_QueueSeqCmd(NA_BGM_CLEAR_BOSS | 0x8000);
+ SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_CLEAR_BOSS | SEQ_FLAG_ASYNC);
}
Math_ApproachF(&this->unk_56C, 0.01f, 1.0f, 0.0005f);
Math_ApproachF(&this->actor.scale.x, 0.01f, 0.05f, 0.001f);
@@ -1565,20 +1571,18 @@ void Boss03_DeathCutscene(Boss03* this, PlayState* play) {
if (this->actor.world.pos.y < PLATFORM_HEIGHT + (100.0f * sp64)) {
this->actor.world.pos.y = PLATFORM_HEIGHT + (100.0f * sp64);
this->actor.velocity.y = ((Rand_ZeroFloat(10.0f) + 7.5f) * sp64) + 7.5f;
- this->actor.speedXZ = ((Rand_ZeroFloat(5.0f) + 2.5f) * sp64) + 2.5f;
+ 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);
@@ -1595,9 +1599,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);
}
@@ -1607,7 +1611,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);
@@ -1623,8 +1627,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);
@@ -1656,8 +1660,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);
@@ -1704,7 +1708,7 @@ void Boss03_SpawnSmallFishesCutscene(Boss03* this, PlayState* play) {
this->numSpawnedSmallFish++;
}
if ((this->csTimer % 8) == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KONB_MINI_APPEAR);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KONB_MINI_APPEAR);
}
}
}
@@ -1718,8 +1722,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;
@@ -1747,9 +1751,9 @@ void Boss03_SetupStunned(Boss03* this, PlayState* play) {
}
if (&this->actor == player->actor.parent) {
- player->unk_AE8 = 101;
+ player->actionVar2 = 101;
player->actor.parent = NULL;
- player->csMode = PLAYER_CSMODE_0;
+ player->csMode = PLAYER_CSMODE_NONE;
Play_DisableMotionBlur();
}
@@ -1768,9 +1772,9 @@ void Boss03_Stunned(Boss03* this, PlayState* play) {
if ((this->waterHeight + 30.0f) < this->actor.world.pos.y) {
this->actor.gravity = -2.0f;
Actor_MoveWithGravity(&this->actor);
- if (this->actor.bgCheckFlags & 2) {
- play_sound(NA_SE_IT_WALL_HIT_HARD);
- func_800BC848(&this->actor, play, 10, 10);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
+ Audio_PlaySfx(NA_SE_IT_WALL_HIT_HARD);
+ Actor_RequestQuakeAndRumble(&this->actor, play, 10, 10);
}
} else {
Math_ApproachS(&this->actor.shape.rot.z, -0x6000, 0xA, 0x900);
@@ -1778,7 +1782,7 @@ void Boss03_Stunned(Boss03* this, PlayState* play) {
this->actor.shape.rot.x = this->actor.world.rot.x;
Math_ApproachF(&this->actor.world.pos.y, 100.0f, 0.05f, 5.0f);
- Math_ApproachF(&this->actor.speedXZ, 0.0f, 1.0f, 1.5f);
+ Math_ApproachF(&this->actor.speed, 0.0f, 1.0f, 1.5f);
Actor_MoveWithoutGravityReverse(&this->actor);
}
@@ -1839,16 +1843,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;
}
}
}
@@ -1899,9 +1903,9 @@ void Boss03_UpdateCollision(Boss03* this, PlayState* play) {
Boss03_PlayUnderwaterSfx(&this->actor.projectedPos, NA_SE_EN_KONB_DAMAGE_OLD);
if (&this->actor == player->actor.parent) {
- player->unk_AE8 = 101;
+ player->actionVar2 = 101;
player->actor.parent = NULL;
- player->csMode = PLAYER_CSMODE_0;
+ player->csMode = PLAYER_CSMODE_NONE;
Play_DisableMotionBlur();
}
@@ -1990,7 +1994,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;
}
@@ -2003,7 +2008,7 @@ void Boss03_Update(Actor* thisx, PlayState* play2) {
((this->waterHeight - 50.0f < this->actor.world.pos.y) &&
(this->actor.prevPos.y <= this->waterHeight - 50.0f))) {
if ((this->actor.velocity.y < 0.0f) && (this->actionFunc != Boss03_DeathCutscene)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KONB_SINK_OLD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KONB_SINK_OLD);
}
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_WATER_EFFECT, this->actor.world.pos.x, this->waterHeight,
@@ -2067,9 +2072,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);
}
@@ -2081,7 +2086,7 @@ void Boss03_Update(Actor* thisx, PlayState* play2) {
if (D_809E9841 != 0) {
D_809E9841--;
if (D_809E9841 == 0) {
- Audio_QueueSeqCmd(NA_BGM_BOSS | 0x8000);
+ SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_BOSS | SEQ_FLAG_ASYNC);
}
}
@@ -2095,13 +2100,14 @@ void Boss03_Update(Actor* thisx, PlayState* play2) {
}
// Player is standing on ground && Player is above water
- if ((player->actor.bgCheckFlags & 1) && (player->actor.shape.feetPos[FOOT_LEFT].y >= WATER_HEIGHT + 8.0f)) {
+ if ((player->actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
+ (player->actor.shape.feetPos[FOOT_LEFT].y >= WATER_HEIGHT + 8.0f)) {
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);
}
}
@@ -2109,9 +2115,9 @@ void Boss03_Update(Actor* thisx, PlayState* play2) {
this->prevPlayerPos = player->actor.world.pos;
if (this->waterHeight < this->actor.world.pos.y) {
- func_8019F540(0);
+ Audio_SetSfxUnderwaterReverb(false);
} else {
- func_8019F540(1);
+ Audio_SetSfxUnderwaterReverb(true);
}
if (this->unk_280 != 0) {
@@ -2124,9 +2130,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);
@@ -2146,14 +2152,14 @@ void Boss03_Update(Actor* thisx, PlayState* play2) {
/* Start of Gyorg's Draw section */
void Boss03_SetObject(PlayState* play, s16 objectId) {
- s32 objectIndex = Object_GetIndex(&play->objectCtx, objectId);
+ s32 objectIndex = Object_GetSlot(&play->objectCtx, objectId);
OPEN_DISPS(play->state.gfxCtx);
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objectIndex].segment);
- gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[objectIndex].segment);
- gSPSegment(POLY_XLU_DISP++, 0x06, play->objectCtx.status[objectIndex].segment);
+ gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[objectIndex].segment);
+ gSPSegment(POLY_XLU_DISP++, 0x06, play->objectCtx.slots[objectIndex].segment);
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -2189,24 +2195,42 @@ s32 Boss03_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
* Since there are two sets of ColliderJntSph, indices < 2 (ARRAY_COUNT(sHeadJntSphElementsInit)) refers to the first
* collider and indices >= 2 refers to the second one
*/
-s8 sGyorgSphElementIndices[] = {
- -1, // GYORG_LIMB_NONE,
- -1, // GYORG_LIMB_ROOT,
- 0, // GYORG_LIMB_HEAD,
- -1, // GYORG_LIMB_BODY_ROOT,
- 4, // GYORG_LIMB_UPPER_TRUNK,
- 5, // GYORG_LIMB_LOWER_TRUNK,
- 6, // GYORG_LIMB_TAIL,
- -1, // GYORG_LIMB_RIGHT_FIN_ROOT,
- 2, // GYORG_LIMB_UPPER_RIGHT_FIN,
- -1, // GYORG_LIMB_LOWER_RIGHT_FIN,
- -1, // GYORG_LIMB_LEFT_FIN_ROOT,
- 3, // GYORG_LIMB_UPPER_LEFT_FIN,
- -1, // GYORG_LIMB_LOWER_LEFT_FIN,
- -1, // GYORG_LIMB_JAW_ROOT,
- 1, // GYORG_LIMB_JAW,
- -1, // GYORG_LIMB_MAX
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+static s8 sLimbToSphere[2][GYORG_LIMB_MAX] = {
+ {
+ -1, // GYORG_LIMB_NONE
+ -1, // GYORG_LIMB_ROOT
+ 0, // GYORG_LIMB_HEAD
+ -1, // GYORG_LIMB_BODY_ROOT
+ 4, // GYORG_LIMB_UPPER_TRUNK
+ 5, // GYORG_LIMB_LOWER_TRUNK
+ 6, // GYORG_LIMB_TAIL
+ -1, // GYORG_LIMB_RIGHT_FIN_ROOT
+ 2, // GYORG_LIMB_UPPER_RIGHT_FIN
+ -1, // GYORG_LIMB_LOWER_RIGHT_FIN
+ -1, // GYORG_LIMB_LEFT_FIN_ROOT
+ 3, // GYORG_LIMB_UPPER_LEFT_FIN
+ -1, // GYORG_LIMB_LOWER_LEFT_FIN
+ -1, // GYORG_LIMB_JAW_ROOT
+ 1, // GYORG_LIMB_JAW
+ },
+ // unused
+ {
+ -1, // GYORG_LIMB_NONE
+ -1, // GYORG_LIMB_ROOT
+ -1, // GYORG_LIMB_HEAD
+ -1, // GYORG_LIMB_BODY_ROOT
+ -1, // GYORG_LIMB_UPPER_TRUNK
+ -1, // GYORG_LIMB_LOWER_TRUNK
+ -1, // GYORG_LIMB_TAIL
+ -1, // GYORG_LIMB_RIGHT_FIN_ROOT
+ -1, // GYORG_LIMB_UPPER_RIGHT_FIN
+ -1, // GYORG_LIMB_LOWER_RIGHT_FIN
+ -1, // GYORG_LIMB_LEFT_FIN_ROOT
+ -1, // GYORG_LIMB_UPPER_LEFT_FIN
+ -1, // GYORG_LIMB_LOWER_LEFT_FIN
+ -1, // GYORG_LIMB_JAW_ROOT
+ -1, // GYORG_LIMB_JAW
+ },
};
Vec3f D_809E9148 = { 600.0f, -100.0f, 0.0f };
@@ -2228,8 +2252,8 @@ void Boss03_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot
Matrix_MultVec3f(&D_809E9148, &this->actor.focus.pos);
}
- sphereElementIndex = sGyorgSphElementIndices[limbIndex];
- if (sphereElementIndex >= 0) {
+ sphereElementIndex = sLimbToSphere[0][limbIndex];
+ if (sphereElementIndex > -1) {
Matrix_MultVec3f(&D_809E9154[sphereElementIndex], &spherePos);
if (sphereElementIndex < 2) {
@@ -2258,7 +2282,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) {
@@ -2389,8 +2413,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) {
@@ -2421,7 +2445,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);
@@ -2435,7 +2459,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);
}
@@ -2455,7 +2479,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);
@@ -2511,13 +2535,13 @@ void Boss03_SeaweedUpdate(Actor* thisx, PlayState* play) {
yDiff = player->actor.world.pos.y - this->seaweedSegmentPositions[i].y;
zDiff = player->actor.world.pos.z - this->seaweedSegmentPositions[i].z;
distanceBetweenSeaweedAndDisturbance = sqrtf(SQ(xDiff) + SQ(yDiff) + SQ(zDiff));
- disturbanceFactor = player->actor.speedXZ * 3.0f + 70.0f;
+ disturbanceFactor = player->actor.speed * 3.0f + 70.0f;
// Player is standing on ground
- if (player->actor.bgCheckFlags & 1) {
+ if (player->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
maxBendSpeed = 0;
} else {
- maxBendSpeed = player->actor.speedXZ * 16.0f;
+ maxBendSpeed = player->actor.speed * 16.0f;
if (maxBendSpeed > 0x1000) {
maxBendSpeed = 0x1000;
} else if (maxBendSpeed < 0x100) {
@@ -2550,8 +2574,8 @@ void Boss03_SeaweedUpdate(Actor* thisx, PlayState* play) {
break;
}
- maxBendSpeed = sGyorgBossInstance->actor.speedXZ * 16.0f;
- disturbanceFactor = sGyorgBossInstance->actor.speedXZ * 5.0f + 150.0f;
+ maxBendSpeed = sGyorgBossInstance->actor.speed * 16.0f;
+ disturbanceFactor = sGyorgBossInstance->actor.speed * 5.0f + 150.0f;
if (maxBendSpeed > 0x1000) {
maxBendSpeed = 0x1000;
} else if (maxBendSpeed < 0x100) {
@@ -2592,7 +2616,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 00892063c..c35e6e9b1 100644
--- a/src/overlays/actors/ovl_Boss_04/z_boss_04.c
+++ b/src/overlays/actors/ovl_Boss_04/z_boss_04.c
@@ -6,8 +6,9 @@
#include "z_boss_04.h"
#include "z64shrink_window.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((Boss04*)thisx)
@@ -163,7 +164,7 @@ void Boss04_Init(Actor* thisx, PlayState* play2) {
this->actor.params = 0x64;
Actor_SetScale(&this->actor, 0.1f);
- this->actor.targetMode = 5;
+ this->actor.targetMode = TARGET_MODE_5;
this->actor.hintId = TATL_HINT_ID_WART;
this->actor.colChkInfo.health = 20;
this->actor.colChkInfo.damageTable = &sDamageTable;
@@ -172,7 +173,7 @@ void Boss04_Init(Actor* thisx, PlayState* play2) {
this->unk_6F8 = 1.0f;
Collider_InitAndSetJntSph(play, &this->collider1, &this->actor, &sJntSphInit1, this->collider1Elements);
Collider_InitAndSetJntSph(play, &this->collider2, &this->actor, &sJntSphInit2, this->collider2Elements);
- SkelAnime_InitFlex(play, &this->skelAnime, &gWartSkel, &gWartIdleAnim, this->jointTable, this->morphtable,
+ SkelAnime_InitFlex(play, &this->skelAnime, &gWartSkel, &gWartIdleAnim, this->jointTable, this->morphTable,
WART_LIMB_MAX);
spA8.y = this->actor.world.pos.y + 200.0f;
@@ -197,7 +198,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);
@@ -231,7 +232,7 @@ void Boss04_Destroy(Actor* thisx, PlayState* play) {
void func_809EC544(Boss04* this) {
this->actionFunc = func_809EC568;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
void func_809EC568(Boss04* this, PlayState* play) {
@@ -254,16 +255,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;
@@ -289,7 +290,7 @@ void func_809EC568(Boss04* this, PlayState* play) {
case 10:
if (this->unk_704 == 3) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EYEGOLE_DEMO_EYE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_DEMO_EYE);
this->unk_74A = 1;
}
this->unk_2D0 = 10000.0f;
@@ -319,19 +320,19 @@ void func_809EC568(Boss04* this, PlayState* play) {
}
case 12:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_ME_ATTACK - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_ME_ATTACK - SFX_FLAG);
Math_ApproachF(&this->subCamAt.x, this->actor.world.pos.x, 0.5f, 1000.0f);
Math_ApproachF(&this->subCamAt.y, this->actor.world.pos.y, 0.5f, 1000.0f);
Math_ApproachF(&this->subCamAt.z, this->actor.world.pos.z, 0.5f, 1000.0f);
- if (this->actor.bgCheckFlags & 2) {
- play_sound(NA_SE_IT_BIG_BOMB_EXPLOSION);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
+ Audio_PlaySfx(NA_SE_IT_BIG_BOMB_EXPLOSION);
this->unk_6F4 = 15;
this->unk_708 = 13;
this->unk_704 = 0;
this->unk_2DA = 10;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->actor.world.pos.x, this->actor.world.pos.y,
- this->actor.world.pos.z, 0, 0, 0, CLEAR_TAG_SPLASH);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KONB_JUMP_LEV_OLD - SFX_FLAG);
+ this->actor.world.pos.z, 0, 0, 0, CLEAR_TAG_PARAMS(CLEAR_TAG_SPLASH));
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KONB_JUMP_LEV_OLD - SFX_FLAG);
this->subCamAtOscillator = 20;
}
break;
@@ -389,8 +390,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);
}
@@ -431,7 +432,7 @@ void func_809ECD18(Boss04* this, PlayState* play) {
Math_ApproachS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 10, 0x200);
this->actor.world.pos.y = (this->actor.floorHeight + KREG(17) + 160.0f) + (Math_SinS(this->unk_1F4 * 512) * 10.0f);
- Math_ApproachF(&this->actor.speedXZ, this->unk_6D4, 1.0f, 0.5f);
+ Math_ApproachF(&this->actor.speed, this->unk_6D4, 1.0f, 0.5f);
if (this->unk_1F8 == 0) {
this->unk_1F8 = Rand_ZeroFloat(100.0f) + 50.0f;
@@ -439,8 +440,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;
}
}
@@ -460,14 +461,14 @@ void func_809ECEF4(Boss04* this) {
this->unk_1F8 = 0;
this->unk_1F6 = 1;
this->unk_1FA = 60;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.gravity = -3.0f;
}
void func_809ECF58(Boss04* this, PlayState* play) {
Vec3f sp3C;
- if ((this->unk_1FE == 14) || ((this->actor.bgCheckFlags & 8) && (this->unk_1F8 == 0))) {
+ if ((this->unk_1FE == 14) || ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) && (this->unk_1F8 == 0))) {
this->unk_1F8 = 20;
if ((Rand_ZeroOne() < 0.2f) && (this->unk_1FE == 0)) {
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
@@ -477,11 +478,11 @@ void func_809ECF58(Boss04* this, PlayState* play) {
this->actor.world.rot.y = BINANG_ROT180((s16)Rand_ZeroFloat(8000.0f) + this->actor.world.rot.y);
}
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
- if (this->actor.bgCheckFlags & 8) {
- play_sound(NA_SE_IT_BIG_BOMB_EXPLOSION);
- func_800BC848(&this->actor, play, 15, 10);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
+ Audio_PlaySfx(NA_SE_IT_BIG_BOMB_EXPLOSION);
+ 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;
@@ -496,12 +497,12 @@ void func_809ECF58(Boss04* this, PlayState* play) {
if (this->unk_6F4 == 0) {
Math_ApproachS(&this->actor.shape.rot.y, this->actor.world.rot.y, 5, 0x1000);
if (this->unk_1FA == 0) {
- Math_ApproachF(&this->actor.speedXZ, 20.0f, 1.0f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 20.0f, 1.0f, 1.0f);
sp3C.x = this->actor.world.pos.x;
sp3C.y = this->actor.floorHeight + 2.0f;
sp3C.z = this->actor.world.pos.z;
EffectSsGRipple_Spawn(play, &sp3C, 1400, 500, 0);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_ME_ATTACK - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_ME_ATTACK - SFX_FLAG);
}
}
@@ -517,11 +518,11 @@ void func_809ED224(Boss04* this) {
this->actionFunc = func_809ED2A0;
this->unk_1F8 = 60;
this->unk_1FA = 100;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->unk_2D0 = 10000.0f;
this->unk_2C8 = 200;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_ME_DEAD);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_ME_DEAD);
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
Audio_RestorePrevBgm();
this->unk_1F6 = 10;
}
@@ -542,7 +543,7 @@ void func_809ED2A0(Boss04* this, PlayState* play) {
}
if (this->unk_1F8 == 3) {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->unk_700 = 0.0f;
this->unk_6FC = 0.0f;
this->unk_6F8 = 0.0f;
@@ -550,7 +551,7 @@ void func_809ED2A0(Boss04* this, PlayState* play) {
if ((this->unk_1F8 == 2) || (this->unk_1F8 == 5)) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->actor.world.pos.x, this->actor.world.pos.y,
- this->actor.world.pos.z, 0, 0, 0, CLEAR_TAG_LARGE_EXPLOSION);
+ this->actor.world.pos.z, 0, 0, 0, CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_EXPLOSION));
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_IT_BIG_BOMB_EXPLOSION);
}
@@ -569,7 +570,7 @@ void func_809ED45C(Boss04* this, PlayState* play) {
if ((this->unk_1FE == 0) && (this->collider1.elements[0].info.bumperFlags & BUMP_HIT)) {
this->collider1.elements[0].info.bumperFlags &= ~BUMP_HIT;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_ME_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_ME_DAMAGE);
damage = this->actor.colChkInfo.damage;
this->actor.colChkInfo.health = this->actor.colChkInfo.health - damage;
if ((s8)this->actor.colChkInfo.health <= 0) {
@@ -709,7 +710,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;
}
@@ -747,9 +749,9 @@ void Boss04_Update(Actor* thisx, PlayState* play2) {
func_809ED45C(this, play);
if (this->unk_2CC > 3000.0f) {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider1.base);
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
} else {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider2.base);
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider2.base);
@@ -765,7 +767,7 @@ void Boss04_Update(Actor* thisx, PlayState* play2) {
}
if (this->unk_74A != 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_ME_EXIST - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_ME_EXIST - SFX_FLAG);
}
}
@@ -817,7 +819,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 +833,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_04/z_boss_04.h b/src/overlays/actors/ovl_Boss_04/z_boss_04.h
index 6aa153597..97c296b84 100644
--- a/src/overlays/actors/ovl_Boss_04/z_boss_04.h
+++ b/src/overlays/actors/ovl_Boss_04/z_boss_04.h
@@ -12,7 +12,7 @@ typedef struct Boss04 {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ Vec3s jointTable[WART_LIMB_MAX];
- /* 0x1BE */ Vec3s morphtable[WART_LIMB_MAX];
+ /* 0x1BE */ Vec3s morphTable[WART_LIMB_MAX];
/* 0x1F4 */ s16 unk_1F4;
/* 0x1F6 */ u8 unk_1F6;
/* 0x1F7 */ u8 unk_1F7;
diff --git a/src/overlays/actors/ovl_Boss_05/z_boss_05.c b/src/overlays/actors/ovl_Boss_05/z_boss_05.c
index 314370079..535a3a8f5 100644
--- a/src/overlays/actors/ovl_Boss_05/z_boss_05.c
+++ b/src/overlays/actors/ovl_Boss_05/z_boss_05.c
@@ -6,7 +6,7 @@
#include "z_boss_05.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY)
#define THIS ((Boss05*)thisx)
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 83a920b50..6dc94e0e3 100644
--- a/src/overlays/actors/ovl_Boss_06/z_boss_06.c
+++ b/src/overlays/actors/ovl_Boss_06/z_boss_06.c
@@ -4,13 +4,14 @@
* 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"
#include "objects/gameplay_keep/gameplay_keep.h"
#include "objects/object_knight/object_knight.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((Boss06*)thisx)
@@ -151,7 +152,7 @@ void Boss06_Init(Actor* thisx, PlayState* play) {
this->unk_200[i] = temp_v0[i];
}
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
void Boss06_Destroy(Actor* thisx, PlayState* play) {
@@ -163,7 +164,7 @@ void func_809F23CC(Boss06* this) {
if ((this->unk_1C9 == 0) && (D_809F4970->unk_68A == 0)) {
if (this->actor.colChkInfo.damageEffect == 2) {
func_809F24A8(this);
- play_sound(NA_SE_SY_TRE_BOX_APPEAR);
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
this->unk_1B0 = -(this->actor.world.pos.x - this->collider.info.bumper.hitPos.x);
this->unk_1BC = this->unk_1B0 * 0.35f;
@@ -194,12 +195,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);
@@ -229,7 +230,7 @@ void func_809F24C8(Boss06* this, PlayState* play) {
}
if (this->unk_1CA >= 30) {
- play_sound(NA_SE_EV_S_STONE_FLASH);
+ Audio_PlaySfx(NA_SE_EV_S_STONE_FLASH);
}
if (this->unk_1CA >= 60) {
@@ -331,8 +332,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;
@@ -376,7 +377,7 @@ void func_809F2C44(Boss06* this, PlayState* play) {
}
if ((this->unk_1E4 > 0.1f) && ENBOSS06_GET_PARAMS(&this->actor) == 0) {
- play_sound(NA_SE_EV_CURTAIN_DOWN - SFX_FLAG);
+ Audio_PlaySfx(NA_SE_EV_CURTAIN_DOWN - SFX_FLAG);
}
}
@@ -430,30 +431,30 @@ void Boss06_Update(Actor* thisx, PlayState* play) {
if (this->unk_1E4 > 0.0f) {
if (ENBOSS06_GET_PARAMS(&this->actor) == 0) {
- D_801F4E32 = 1;
- D_801F4E38.x = this->actor.world.pos.x + this->unk_1B0;
- D_801F4E38.y = this->actor.world.pos.y + 80.0f + this->unk_1B4 + this->unk_1AC;
- D_801F4E38.z = this->actor.world.pos.z;
+ gCustomLensFlare1On = true;
+ gCustomLensFlare1Pos.x = this->actor.world.pos.x + this->unk_1B0;
+ gCustomLensFlare1Pos.y = this->actor.world.pos.y + 80.0f + this->unk_1B4 + this->unk_1AC;
+ gCustomLensFlare1Pos.z = this->actor.world.pos.z;
D_801F4E44 = this->unk_1E4;
D_801F4E48 = 10.0f;
D_801F4E4C = 0;
} else {
- D_801F4E4E = 1;
- D_801F4E50.x = this->actor.world.pos.x + this->unk_1B0;
- D_801F4E50.y = this->actor.world.pos.y + 80.0f + this->unk_1B4 + this->unk_1AC;
- D_801F4E50.z = this->actor.world.pos.z;
+ gCustomLensFlare2On = true;
+ gCustomLensFlare2Pos.x = this->actor.world.pos.x + this->unk_1B0;
+ gCustomLensFlare2Pos.y = this->actor.world.pos.y + 80.0f + this->unk_1B4 + this->unk_1AC;
+ gCustomLensFlare2Pos.z = this->actor.world.pos.z;
D_801F4E5C = this->unk_1E4;
D_801F4E60 = 10.0f;
D_801F4E64 = 0;
}
} else if (ENBOSS06_GET_PARAMS(&this->actor) == 0) {
- D_801F4E32 = 0;
+ gCustomLensFlare1On = false;
} else {
- D_801F4E4E = 0;
+ gCustomLensFlare2On = false;
}
if ((this->unk_1C8 != 0) && (this->unk_1C8 != 0)) {
- play_sound(NA_SE_EV_FIRE_PLATE - SFX_FLAG);
+ Audio_PlaySfx(NA_SE_EV_FIRE_PLATE - SFX_FLAG);
this->unk_1CC += 0.6f;
this->unk_1D0 += 0.1f;
this->unk_1D4 += 0.0200000014156f;
@@ -515,8 +516,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 824c70fa2..d2bc5d6be 100644
--- a/src/overlays/actors/ovl_Boss_07/z_boss_07.c
+++ b/src/overlays/actors/ovl_Boss_07/z_boss_07.c
@@ -7,7 +7,7 @@
#include "z_boss_07.h"
#include "z64shrink_window.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((Boss07*)thisx)
diff --git a/src/overlays/actors/ovl_Boss_Hakugin/z_boss_hakugin.c b/src/overlays/actors/ovl_Boss_Hakugin/z_boss_hakugin.c
index d9a7cb348..9c759b63c 100644
--- a/src/overlays/actors/ovl_Boss_Hakugin/z_boss_hakugin.c
+++ b/src/overlays/actors/ovl_Boss_Hakugin/z_boss_hakugin.c
@@ -8,7 +8,7 @@
#include "z64quake.h"
#include "z64rumble.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((BossHakugin*)thisx)
@@ -203,7 +203,7 @@ static CollisionCheckInfoInit D_80B0EA80 = { 30, 80, 100, MASS_IMMOVABLE };
static InitChainEntry D_80B0EAD8[] = {
ICHAIN_S8(hintId, 27, ICHAIN_CONTINUE),
ICHAIN_VEC3F_DIV1000(scale, 27, ICHAIN_CONTINUE),
- ICHAIN_U8(targetMode, 5, ICHAIN_CONTINUE),
+ ICHAIN_U8(targetMode, TARGET_MODE_5, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -2000, ICHAIN_STOP),
};
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..2b0669f39 100644
--- a/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c
+++ b/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c
@@ -16,14 +16,13 @@ void DemoEffect_Init(Actor* thisx, PlayState* play);
void DemoEffect_Destroy(Actor* thisx, PlayState* play);
void DemoEffect_Update(Actor* thisx, PlayState* play);
-void func_808CD940(DemoEffect* this, PlayState* play);
-void func_808CD998(DemoEffect* this, PlayState* play);
-void func_808CDBDC(DemoEffect* this, PlayState* play);
-void func_808CDCEC(DemoEffect* this, PlayState* play);
-void func_808CDD70(DemoEffect* this, PlayState* play);
-void func_808CDDE0(DemoEffect* this, PlayState* play);
-void func_808CDFF8(Actor* thisx, PlayState* play);
-void func_808CE078(Actor* thisx, PlayState* play2);
+void DemoEffect_WaitForObject(DemoEffect* this, PlayState* play);
+void DemoEffect_SetupTimewarp(DemoEffect* this, PlayState* play);
+void DemoEffect_StartTimewarp(DemoEffect* this, PlayState* play);
+void DemoEffect_ShrinkLight(DemoEffect* this, PlayState* play);
+void DemoEffect_ExpandLight(DemoEffect* this, PlayState* play);
+void DemoEffect_DrawTimewarp(Actor* thisx, PlayState* play);
+void DemoEffect_DrawLight(Actor* thisx, PlayState* play2);
ActorInit Demo_Effect_InitVars = {
ACTOR_DEMO_EFFECT,
@@ -47,14 +46,18 @@ void DemoEffect_Init(Actor* thisx, PlayState* play) {
s32 type = DEMO_EFFECT_GET_TYPE(&this->actor);
s32 objectIndex;
s32 pad2;
- Color_RGB8 colors[] = {
- { 200, 200, 0 }, { 255, 40, 100 }, { 50, 255, 0 }, { 0, 0, 255 }, { 255, 255, 80 },
+ Color_RGB8 lightColors[] = {
+ { 200, 200, 0 }, // Yellow
+ { 255, 40, 100 }, // Pink
+ { 50, 255, 0 }, // Light green
+ { 0, 0, 255 }, // Blue
+ { 255, 255, 80 }, // Light Yellow
};
if (sEffectTypeObjects[type] == GAMEPLAY_KEEP) {
objectIndex = 0;
} else {
- objectIndex = Object_GetIndex(&play->objectCtx, sEffectTypeObjects[type]);
+ objectIndex = Object_GetSlot(&play->objectCtx, sEffectTypeObjects[type]);
}
if (objectIndex < 0) {
@@ -66,14 +69,14 @@ void DemoEffect_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 0.2f);
switch (type) {
- case DEMO_EFFECT_TYPE_0:
- case DEMO_EFFECT_TYPE_1:
+ case DEMO_EFFECT_TIMEWARP_TIMEBLOCK_LARGE:
+ case DEMO_EFFECT_TIMEWARP_TIMEBLOCK_SMALL:
this->actor.flags |= ACTOR_FLAG_2000000;
-
- case DEMO_EFFECT_TYPE_2:
- case DEMO_EFFECT_TYPE_3:
- this->initDrawFunc = func_808CDFF8;
- this->initActionFunc = func_808CD998;
+ // FALLTHROUGH
+ case DEMO_EFFECT_TIMEWARP_LIGHTBLOCK_LARGE:
+ case DEMO_EFFECT_TIMEWARP_LIGHTBLOCK_VERY_LARGE:
+ this->initDrawFunc = DemoEffect_DrawTimewarp;
+ this->initActionFunc = DemoEffect_SetupTimewarp;
this->envXluColor[0] = 0;
this->envXluColor[1] = 100;
this->envXluColor[2] = 255;
@@ -81,17 +84,17 @@ void DemoEffect_Init(Actor* thisx, PlayState* play) {
this->timer = 0;
break;
- case DEMO_EFFECT_TYPE_4:
- case DEMO_EFFECT_TYPE_5:
- case DEMO_EFFECT_TYPE_6:
- case DEMO_EFFECT_TYPE_7:
- case DEMO_EFFECT_TYPE_8:
- this->envXluColor[0] = colors[type - 4].r;
- this->envXluColor[1] = colors[type - 4].g;
- this->envXluColor[2] = colors[type - 4].b;
+ case DEMO_EFFECT_TYPE_LIGHT_DARK_YELLOW:
+ case DEMO_EFFECT_TYPE_LIGHT_PINK:
+ case DEMO_EFFECT_TYPE_LIGHT_GREEN:
+ case DEMO_EFFECT_TYPE_LIGHT_BLUE:
+ case DEMO_EFFECT_TYPE_LIGHT_YELLOW:
+ this->envXluColor[0] = lightColors[type - DEMO_EFFECT_TYPE_LIGHT_BASE].r;
+ this->envXluColor[1] = lightColors[type - DEMO_EFFECT_TYPE_LIGHT_BASE].g;
+ this->envXluColor[2] = lightColors[type - DEMO_EFFECT_TYPE_LIGHT_BASE].b;
Actor_SetScale(&this->actor, 0.0f);
- this->initDrawFunc = func_808CE078;
- this->initActionFunc = func_808CDDE0;
+ this->initDrawFunc = DemoEffect_DrawLight;
+ this->initActionFunc = DemoEffect_ExpandLight;
this->timer = 0;
break;
@@ -100,17 +103,17 @@ void DemoEffect_Init(Actor* thisx, PlayState* play) {
}
ActorShape_Init(&this->actor.shape, 0.0f, NULL, 0.0f);
- this->actionFunc = func_808CD940;
+ this->actionFunc = DemoEffect_WaitForObject;
}
void DemoEffect_Destroy(Actor* thisx, PlayState* play) {
DemoEffect* this = THIS;
switch (DEMO_EFFECT_GET_TYPE(&this->actor)) {
- case DEMO_EFFECT_TYPE_0:
- case DEMO_EFFECT_TYPE_1:
- case DEMO_EFFECT_TYPE_2:
- case DEMO_EFFECT_TYPE_3:
+ case DEMO_EFFECT_TIMEWARP_TIMEBLOCK_LARGE:
+ case DEMO_EFFECT_TIMEWARP_TIMEBLOCK_SMALL:
+ case DEMO_EFFECT_TIMEWARP_LIGHTBLOCK_LARGE:
+ case DEMO_EFFECT_TIMEWARP_LIGHTBLOCK_VERY_LARGE:
SkelCurve_Destroy(play, &this->skelCurve);
break;
@@ -119,7 +122,7 @@ void DemoEffect_Destroy(Actor* thisx, PlayState* play) {
}
}
-void func_808CD940(DemoEffect* this, PlayState* play) {
+void DemoEffect_WaitForObject(DemoEffect* this, PlayState* play) {
if (Object_IsLoaded(&play->objectCtx, this->initObjectIndex)) {
this->actor.objBankIndex = this->initObjectIndex;
this->actor.draw = this->initDrawFunc;
@@ -127,41 +130,41 @@ void func_808CD940(DemoEffect* this, PlayState* play) {
}
}
-void func_808CD998(DemoEffect* this, PlayState* play) {
+void DemoEffect_SetupTimewarp(DemoEffect* this, PlayState* play) {
s32 type = DEMO_EFFECT_GET_TYPE(&this->actor);
- if (SkelCurve_Init(play, &this->skelCurve, &object_efc_tw_Skel_0012E8, &object_efc_tw_CurveAnim_000050)) {}
+ if (SkelCurve_Init(play, &this->skelCurve, &gTimewarpSkel, &gTimewarpAnim)) {}
- SkelCurve_SetAnim(&this->skelCurve, &object_efc_tw_CurveAnim_000050, 1.0f, 59.0f, 1.0f, 1.7f);
+ SkelCurve_SetAnim(&this->skelCurve, &gTimewarpAnim, 1.0f, 59.0f, 1.0f, 1.7f);
SkelCurve_Update(play, &this->skelCurve);
- this->actionFunc = func_808CDCEC;
+ this->actionFunc = DemoEffect_StartTimewarp;
switch (type) {
- case DEMO_EFFECT_TYPE_0:
- Actor_SetScale(&this->actor, 0.16800001f);
+ case DEMO_EFFECT_TIMEWARP_TIMEBLOCK_LARGE:
+ Actor_SetScale(&this->actor, 168.0f * 0.001f);
break;
- case DEMO_EFFECT_TYPE_1:
- Actor_SetScale(&this->actor, 0.08400001f);
+ case DEMO_EFFECT_TIMEWARP_TIMEBLOCK_SMALL:
+ Actor_SetScale(&this->actor, 84.0f * 0.001f);
break;
- case DEMO_EFFECT_TYPE_2:
- Actor_SetScale(&this->actor, 0.16800001f);
+ case DEMO_EFFECT_TIMEWARP_LIGHTBLOCK_LARGE:
+ Actor_SetScale(&this->actor, 168.0f * 0.001f);
break;
- case DEMO_EFFECT_TYPE_3:
- Actor_SetScale(&this->actor, 0.28f);
+ case DEMO_EFFECT_TIMEWARP_LIGHTBLOCK_VERY_LARGE:
+ Actor_SetScale(&this->actor, 280.0f * 0.001f);
break;
default:
- Actor_SetScale(&this->actor, 0.014f);
+ Actor_SetScale(&this->actor, 14.0f * 0.001f);
break;
}
}
-void func_808CDAD0(f32 alphaScale) {
+void DemoEffect_SetPerVertexAlpha(f32 alphaScale) {
static u8 sAlphaTypes[] = { 1, 1, 2, 0, 1, 1, 2, 0, 1, 2, 0, 2, 1, 0, 1, 0, 2, 0, 2, 2, 0 };
- Vtx* vtx = Lib_SegmentedToVirtual(object_efc_tw_Vtx_000060);
+ Vtx* vtx = Lib_SegmentedToVirtual(gTimewarpVtx);
s32 i;
u8 alphas[3];
@@ -176,7 +179,10 @@ void func_808CDAD0(f32 alphaScale) {
}
}
-void func_808CDBDC(DemoEffect* this, PlayState* play) {
+/**
+ * Shrink and fade linearly for 100 frames then remove.
+ */
+void DemoEffect_FinishTimewarp(DemoEffect* this, PlayState* play) {
s32 type = DEMO_EFFECT_GET_TYPE(&this->actor);
f32 scale;
f32 alphaScale;
@@ -187,19 +193,19 @@ void func_808CDBDC(DemoEffect* this, PlayState* play) {
scale = alphaScale * 0.14f;
switch (type) {
- case DEMO_EFFECT_TYPE_0:
+ case DEMO_EFFECT_TIMEWARP_TIMEBLOCK_LARGE:
scale *= 1.2f;
break;
- case DEMO_EFFECT_TYPE_1:
+ case DEMO_EFFECT_TIMEWARP_TIMEBLOCK_SMALL:
scale *= 0.6f;
break;
- case DEMO_EFFECT_TYPE_2:
+ case DEMO_EFFECT_TIMEWARP_LIGHTBLOCK_LARGE:
scale *= 1.2f;
break;
- case DEMO_EFFECT_TYPE_3:
+ case DEMO_EFFECT_TIMEWARP_LIGHTBLOCK_VERY_LARGE:
scale *= 2.0f;
break;
@@ -209,25 +215,31 @@ void func_808CDBDC(DemoEffect* this, PlayState* play) {
this->actor.scale.x = scale;
this->actor.scale.z = scale;
- func_808CDAD0(alphaScale);
- func_800B8FE8(&this->actor, NA_SE_EV_TIMETRIP_LIGHT - SFX_FLAG);
+ DemoEffect_SetPerVertexAlpha(alphaScale);
+ Actor_PlaySfx_FlaggedCentered3(&this->actor, NA_SE_EV_TIMETRIP_LIGHT - SFX_FLAG);
} else {
- func_808CDAD0(1.0f);
+ DemoEffect_SetPerVertexAlpha(1.0f);
Actor_Kill(&this->actor);
}
}
-void func_808CDCEC(DemoEffect* this, PlayState* play) {
- func_800B8FE8(&this->actor, NA_SE_EV_TIMETRIP_LIGHT - SFX_FLAG);
+/**
+ * Runs until animation plays to frame 59 and pauses it on frame 59.
+ */
+void DemoEffect_StartTimewarp(DemoEffect* this, PlayState* play) {
+ Actor_PlaySfx_FlaggedCentered3(&this->actor, NA_SE_EV_TIMETRIP_LIGHT - SFX_FLAG);
if (SkelCurve_Update(play, &this->skelCurve)) {
- SkelCurve_SetAnim(&this->skelCurve, &object_efc_tw_CurveAnim_000050, 1.0f, 60.0f, 59.0f, 0.0f);
- this->actionFunc = func_808CDBDC;
+ SkelCurve_SetAnim(&this->skelCurve, &gTimewarpAnim, 1.0f, 60.0f, 59.0f, 0.0f);
+ this->actionFunc = DemoEffect_FinishTimewarp;
this->timer = 0;
}
}
-void func_808CDD70(DemoEffect* this, PlayState* play) {
+/**
+ * Take scale to 0 linearly, when scale is small enough, remove.
+ */
+void DemoEffect_ShrinkLight(DemoEffect* this, PlayState* play) {
Actor_SetScale(&this->actor, this->actor.scale.x - 0.02f);
this->timer++;
@@ -236,12 +248,16 @@ void func_808CDD70(DemoEffect* this, PlayState* play) {
}
}
-void func_808CDDE0(DemoEffect* this, PlayState* play) {
+/**
+ * Changes scale for 3 frames, scale is successively 0.0f, 0.2f, 0.3f, 0.35f (would converge to 0.4 exponentially if run
+ * for a long time).
+ */
+void DemoEffect_ExpandLight(DemoEffect* this, PlayState* play) {
Actor_SetScale(&this->actor, (this->actor.scale.x * 0.5f) + 0.2f);
this->timer++;
if (this->timer >= 3) {
- this->actionFunc = func_808CDD70;
+ this->actionFunc = DemoEffect_ShrinkLight;
}
}
@@ -251,14 +267,14 @@ void DemoEffect_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
}
-s32 func_808CDE78(PlayState* play, SkelCurve* skelCurve, s32 limbIndex, Actor* thisx) {
+s32 DemoEffect_OverrideLimbDrawTimewarp(PlayState* play, SkelCurve* skelCurve, s32 limbIndex, Actor* thisx) {
s32 pad;
DemoEffect* this = THIS;
u32 frames = play->gameplayFrames;
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);
@@ -278,28 +294,28 @@ s32 func_808CDE78(PlayState* play, SkelCurve* skelCurve, s32 limbIndex, Actor* t
return true;
}
-void func_808CDFF8(Actor* thisx, PlayState* play) {
+void DemoEffect_DrawTimewarp(Actor* thisx, PlayState* play) {
GraphicsContext* gfxCtx = play->state.gfxCtx;
DemoEffect* this = THIS;
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);
+ SkelCurve_Draw(&this->actor, play, &this->skelCurve, DemoEffect_OverrideLimbDrawTimewarp, NULL, 1, &this->actor);
CLOSE_DISPS(gfxCtx);
}
-void func_808CE078(Actor* thisx, PlayState* play2) {
+void DemoEffect_DrawLight(Actor* thisx, PlayState* play2) {
PlayState* play = play2;
DemoEffect* this = THIS;
s16 zRot = (this->timer * 0x400) & 0xFFFF;
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);
@@ -319,10 +335,10 @@ void func_808CE078(Actor* thisx, PlayState* play2) {
CLOSE_DISPS(play->state.gfxCtx);
- D_801F4E32 = 1;
- D_801F4E38.x = thisx->world.pos.x;
- D_801F4E38.y = thisx->world.pos.y;
- D_801F4E38.z = thisx->world.pos.z;
+ gCustomLensFlare1On = true;
+ gCustomLensFlare1Pos.x = thisx->world.pos.x;
+ gCustomLensFlare1Pos.y = thisx->world.pos.y;
+ gCustomLensFlare1Pos.z = thisx->world.pos.z;
D_801F4E44 = thisx->scale.x * 60.0f;
D_801F4E48 = thisx->scale.x * 50.0f;
diff --git a/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.h b/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.h
index 9901a3189..a69316308 100644
--- a/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.h
+++ b/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.h
@@ -11,15 +11,16 @@ typedef void (*DemoEffectActionFunc)(struct DemoEffect*, PlayState*);
#define DEMO_EFFECT_GET_TYPE(thisx) ((thisx)->params & 0xFF)
typedef enum {
- /* 0 */ DEMO_EFFECT_TYPE_0,
- /* 1 */ DEMO_EFFECT_TYPE_1,
- /* 2 */ DEMO_EFFECT_TYPE_2,
- /* 3 */ DEMO_EFFECT_TYPE_3,
- /* 4 */ DEMO_EFFECT_TYPE_4,
- /* 5 */ DEMO_EFFECT_TYPE_5,
- /* 6 */ DEMO_EFFECT_TYPE_6,
- /* 7 */ DEMO_EFFECT_TYPE_7,
- /* 8 */ DEMO_EFFECT_TYPE_8
+ /* 0 */ DEMO_EFFECT_TIMEWARP_TIMEBLOCK_LARGE,
+ /* 1 */ DEMO_EFFECT_TIMEWARP_TIMEBLOCK_SMALL,
+ /* 2 */ DEMO_EFFECT_TIMEWARP_LIGHTBLOCK_LARGE,
+ /* 3 */ DEMO_EFFECT_TIMEWARP_LIGHTBLOCK_VERY_LARGE,
+ /* 4 */ DEMO_EFFECT_TYPE_LIGHT_BASE,
+ /* 4 */ DEMO_EFFECT_TYPE_LIGHT_DARK_YELLOW = DEMO_EFFECT_TYPE_LIGHT_BASE,
+ /* 5 */ DEMO_EFFECT_TYPE_LIGHT_PINK,
+ /* 6 */ DEMO_EFFECT_TYPE_LIGHT_GREEN,
+ /* 7 */ DEMO_EFFECT_TYPE_LIGHT_BLUE,
+ /* 8 */ DEMO_EFFECT_TYPE_LIGHT_YELLOW // Unused
} DemoEffectType;
typedef struct DemoEffect {
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..b52787f36 100644
--- a/src/overlays/actors/ovl_Demo_Getitem/z_demo_getitem.c
+++ b/src/overlays/actors/ovl_Demo_Getitem/z_demo_getitem.c
@@ -1,7 +1,7 @@
/*
* File: z_demo_getitem.c
* Overlay: ovl_Demo_Getitem
- * Description: Cutscene objectIndex for Great Fairy's Mask and Great Fairy's Sword
+ * Description: Cutscene objects for Great Fairy's Mask and Great Fairy's Sword
*/
#include "z_demo_getitem.h"
@@ -14,8 +14,8 @@ void DemoGetitem_Init(Actor* thisx, PlayState* play);
void DemoGetitem_Destroy(Actor* thisx, PlayState* play);
void DemoGetitem_Update(Actor* thisx, PlayState* play);
-void func_80A4FB10(DemoGetitem* this, PlayState* play);
-void func_80A4FB68(DemoGetitem* this, PlayState* play2);
+void DemoGetitem_Wait(DemoGetitem* this, PlayState* play);
+void DemoGetitem_PerformCutsceneActions(DemoGetitem* this, PlayState* play);
void DemoGetitem_Draw(Actor* thisx, PlayState* play);
ActorInit Demo_Getitem_InitVars = {
@@ -34,7 +34,12 @@ 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 };
+
+typedef enum GreatFairyRewardItem {
+ /* 0 */ DEMOGETITEM_ITEM_MASK_GREAT_FAIRY,
+ /* 1 */ DEMOGETITEM_ITEM_SWORD_GREAT_FAIRY
+} GreatFairyRewardItem;
void DemoGetitem_Init(Actor* thisx, PlayState* play) {
s32 pad;
@@ -42,15 +47,17 @@ void DemoGetitem_Init(Actor* thisx, PlayState* play) {
s32 itemIndex;
DemoGetitem* this = THIS;
- itemIndex = 0;
- if (DEMOGETITEM_GET_F(thisx) == 1) {
- itemIndex = 1;
+ itemIndex = DEMOGETITEM_ITEM_MASK_GREAT_FAIRY;
+ if (DEMOGETITEM_GET_F(&this->actor) == 1) {
+ itemIndex = DEMOGETITEM_ITEM_SWORD_GREAT_FAIRY;
}
+
Actor_SetScale(&this->actor, 0.25f);
- this->actionFunc = func_80A4FB10;
- this->item = sGetItemDraws[itemIndex];
- this->csAction = sCsActionIndices[itemIndex];
- objectIndex = Object_GetIndex(&play->objectCtx, sObjectBankIndices[itemIndex]);
+ this->actionFunc = DemoGetitem_Wait;
+ this->getItemDrawId = sGetItemDraws[itemIndex];
+ this->cueType = sCueTypes[itemIndex];
+
+ objectIndex = Object_GetSlot(&play->objectCtx, sObjectBankIndices[itemIndex]);
if (objectIndex < 0) {
Actor_Kill(&this->actor);
return;
@@ -62,26 +69,27 @@ void DemoGetitem_Init(Actor* thisx, PlayState* play) {
void DemoGetitem_Destroy(Actor* thisx, PlayState* play) {
}
-void func_80A4FB10(DemoGetitem* this, PlayState* play) {
+void DemoGetitem_Wait(DemoGetitem* this, PlayState* play) {
if (Object_IsLoaded(&play->objectCtx, this->objectIndex)) {
this->actor.draw = NULL;
this->actor.objBankIndex = this->objectIndex;
- this->actionFunc = func_80A4FB68;
+ this->actionFunc = DemoGetitem_PerformCutsceneActions;
}
}
-void func_80A4FB68(DemoGetitem* this, PlayState* play2) {
- PlayState* play = play2;
- u16 sp22 = (play->gameplayFrames * 1000) & 0xFFFF;
+void DemoGetitem_PerformCutsceneActions(DemoGetitem* this, PlayState* play) {
+ s32 pad;
+ u16 bobPhase = (play->gameplayFrames * 1000) % 0x10000;
- 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,8 +99,8 @@ void func_80A4FB68(DemoGetitem* this, PlayState* play2) {
case 4:
this->actor.draw = DemoGetitem_Draw;
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, this->csAction));
- this->actor.shape.yOffset = Math_SinS(sp22) * 15.0f;
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType));
+ this->actor.shape.yOffset = Math_SinS(bobPhase) * 15.0f;
break;
default:
@@ -115,5 +123,5 @@ void DemoGetitem_Draw(Actor* thisx, PlayState* play) {
func_800B8050(&this->actor, play, 0);
func_800B8118(&this->actor, play, 0);
- GetItem_Draw(play, this->item);
+ GetItem_Draw(play, this->getItemDrawId);
}
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..130b2cfa6 100644
--- a/src/overlays/actors/ovl_Demo_Getitem/z_demo_getitem.h
+++ b/src/overlays/actors/ovl_Demo_Getitem/z_demo_getitem.h
@@ -11,8 +11,8 @@ typedef void (*DemoGetitemActionFunc)(struct DemoGetitem*, PlayState*);
typedef struct DemoGetitem {
/* 0x000 */ Actor actor;
- /* 0x144 */ s16 item;
- /* 0x146 */ u16 csAction;
+ /* 0x144 */ s16 getItemDrawId;
+ /* 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 c1303efab..945e09fee 100644
--- a/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c
+++ b/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c
@@ -56,21 +56,21 @@ void DemoKakyo_LostWoodsSparkleActionFunc(DemoKankyo* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (play->roomCtx.unk7A[1] != 0) {
- if (play->envCtx.unk_F2[3] != 0) {
- play->envCtx.unk_F2[3]--;
+ if (play->envCtx.precipitation[PRECIP_SNOW_MAX] != 0) {
+ play->envCtx.precipitation[PRECIP_SNOW_MAX]--;
} else {
Actor_Kill(&this->actor);
}
- } else if (play->envCtx.unk_F2[3] < DEMOKANKYO_EFFECT_COUNT) {
- play->envCtx.unk_F2[3] += 16;
+ } else if (play->envCtx.precipitation[PRECIP_SNOW_MAX] < DEMOKANKYO_EFFECT_COUNT) {
+ play->envCtx.precipitation[PRECIP_SNOW_MAX] += 16;
}
// note: DemoKankyo can crash if placed in an area that snows (ObjectKankyo)
- // because they both use unk_F2 as an effect counter,
+ // because they both use PRECIP_SNOW_MAX precipitation as an effect counter,
// causing DemoKankyo to write beyond its efffect array boundry
// this crash can occur if the two actors are in different scenes connected by an exit
// e.g. if you add DemoKankyo to GoronShrine, you will crash entering/leaving through door
- for (i = 0; i < play->envCtx.unk_F2[3]; i++) {
+ for (i = 0; i < play->envCtx.precipitation[PRECIP_SNOW_MAX]; i++) {
repositionLimit = 130.0f;
eyeToAt.x = play->view.at.x - play->view.eye.x;
@@ -304,8 +304,8 @@ void DemoKakyo_MoonSparklesActionFunc(DemoKankyo* this, PlayState* play) {
s32 pad1;
Vec3f worldPos;
- if (play->envCtx.unk_F2[3] < DEMOKANKYO_EFFECT_COUNT) {
- play->envCtx.unk_F2[3] += 16;
+ if (play->envCtx.precipitation[PRECIP_SNOW_MAX] < DEMOKANKYO_EFFECT_COUNT) {
+ play->envCtx.precipitation[PRECIP_SNOW_MAX] += 16;
}
eyeToAt.x = play->view.at.x - play->view.eye.x;
@@ -318,7 +318,7 @@ void DemoKakyo_MoonSparklesActionFunc(DemoKankyo* this, PlayState* play) {
halfScreenHeight = SCREEN_HEIGHT / 2;
- for (i = 0; i < play->envCtx.unk_F2[3]; i++) {
+ for (i = 0; i < play->envCtx.precipitation[PRECIP_SNOW_MAX]; i++) {
switch (this->effects[i].state) {
case DEMO_KANKYO_STATE_INIT:
this->effects[i].posBase.x = play->view.eye.x + (eyeToAtNormX * halfScreenHeight);
@@ -444,7 +444,8 @@ void DemoKankyo_Init(Actor* thisx, PlayState* play) {
for (i = 0; i < ARRAY_COUNT(this->effects); i++) { this->effects[i].state = DEMO_KANKYO_STATE_INIT; }
// clang-format on
- if (1) {};
+ //! FAKE:
+ if (1) {}
switch (this->actor.params) {
case DEMO_KANKYO_TYPE_LOSTWOODS:
@@ -460,7 +461,7 @@ void DemoKankyo_Init(Actor* thisx, PlayState* play) {
case DEMO_KANKYO_TYPE_GIANTS:
this->isSafeToDrawGiants = false;
- objId = Object_GetIndex(&play->objectCtx, sObjectBubbleIndex);
+ objId = Object_GetSlot(&play->objectCtx, sObjectBubbleIndex);
DemoKankyo_SetupAction(this, DemoKakyo_GiantObjectCheck);
break;
@@ -505,12 +506,12 @@ 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);
- for (i = 0; i < play->envCtx.unk_F2[3]; i++) {
+ for (i = 0; i < play->envCtx.precipitation[PRECIP_SNOW_MAX]; i++) {
worldPos.x = this->effects[i].posBase.x + this->effects[i].posOffset.x;
worldPos.y = this->effects[i].posBase.y + this->effects[i].posOffset.y;
worldPos.z = this->effects[i].posBase.z + this->effects[i].posOffset.z;
@@ -571,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);
@@ -597,9 +598,10 @@ void DemoKankyo_DrawMoonAndGiant(Actor* thisx, PlayState* play2) {
GraphicsContext* gfxCtx = play->state.gfxCtx;
OPEN_DISPS(gfxCtx);
- func_8012C2DC(gfxCtx);
- for (i = 0; i < play->envCtx.unk_F2[3]; i++) {
+ Gfx_SetupDL25_Xlu(gfxCtx);
+
+ for (i = 0; i < play->envCtx.precipitation[PRECIP_SNOW_MAX]; i++) {
worldPos.x = this->effects[i].posBase.x + this->effects[i].posOffset.x;
worldPos.y = this->effects[i].posBase.y + this->effects[i].posOffset.y;
worldPos.z = this->effects[i].posBase.z + this->effects[i].posOffset.z;
@@ -643,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..11fafb5f1 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) {
+ Actor_PlaySfx_Flagged(&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) {
+ Actor_PlaySfx_Flagged(&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 60f9e898b..09f4fe1c1 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)) {
- func_800B9010(&this->actor, NA_SE_EV_IKANA_SOUL_LV - SFX_FLAG);
- } else if (play->csCtx.frames == 322) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_IKANA_SOUL_TRANSFORM);
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ if ((play->csCtx.curFrame >= 160) && (play->csCtx.curFrame < 322)) {
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_IKANA_SOUL_LV - SFX_FLAG);
+ } 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;
@@ -313,8 +313,8 @@ void func_80C16BD4(DemoSyoten* this, PlayState* play) {
break;
case 4:
- this->actor.speedXZ =
- play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->unk_3F0)]->urot.z * 0.005493164f;
+ this->actor.speed =
+ 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;
@@ -344,12 +344,12 @@ void func_80C16DD4(DemoSyoten* this, PlayState* play) {
case 2:
this->actor.draw = DemoSyoten_Draw;
this->unk_3E6 = -6;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_DM_FLYING_GOD_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_DM_FLYING_GOD_DASH);
break;
}
}
- 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;
}
@@ -392,7 +392,7 @@ void func_80C16EAC(DemoSyoten* this, PlayState* play) {
if (this->unk_3D8 > 1.0f) {
this->unk_3D8 = 1.0f;
}
- func_800B9010(&this->actor, NA_SE_EV_IKANA_PURIFICATION - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_IKANA_PURIFICATION - SFX_FLAG);
}
} else {
this->actor.draw = NULL;
@@ -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);
}
@@ -499,8 +499,8 @@ void func_80C17468(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_800FE7A8(D_80C17824, &sp2C);
- func_800FE7A8(D_80C17834, &sp28);
+ Environment_LerpSandstormColors(D_80C17824, &sp2C);
+ Environment_LerpSandstormColors(D_80C17834, &sp28);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, sp2C.r, sp2C.g, sp2C.b, 255);
gDPSetEnvColor(POLY_XLU_DISP++, sp28.r, sp28.g, sp28.b, 255);
@@ -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..6ca5da41f 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 },
@@ -47,14 +47,14 @@ ActorInit Demo_Tre_Lgt_InitVars = {
(ActorFunc)DemoTreLgt_Draw,
};
-static TransformUpdateIndex* sBoxLightAnimations[] = {
+static CurveAnimationHeader* sBoxLightAnimations[] = {
&gBoxLightAdultCurveAnim,
&gBoxLightChildCurveAnim,
};
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[] = {
@@ -70,7 +70,7 @@ void DemoTreLgt_Init(Actor* thisx, PlayState* play) {
this->colorAlpha2 = 255;
this->status = 0;
//! @bug Zora Link should also use animationType 0
- if (gSaveContext.save.playerForm == PLAYER_FORM_FIERCE_DEITY) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_FIERCE_DEITY) {
this->animationType = 0;
} else {
this->animationType = 1;
@@ -127,7 +127,7 @@ void DemoTreLgt_Animate(DemoTreLgt* this, PlayState* play) {
if (curFrame > 30.0f) {
if (!(this->status & 1)) {
this->status |= 1;
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_TRE_BOX_FLASH);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_TRE_BOX_FLASH);
}
}
if (SkelCurve_Update(play, &this->skelCurve)) {
@@ -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..79e52d082 100644
--- a/src/overlays/actors/ovl_Dm_Ah/z_dm_ah.c
+++ b/src/overlays/actors/ovl_Dm_Ah/z_dm_ah.c
@@ -6,7 +6,7 @@
#include "z_dm_ah.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((DmAh*)thisx)
@@ -27,19 +27,26 @@ ActorInit Dm_Ah_InitVars = {
(ActorFunc)DmAh_Draw,
};
-static AnimationInfoS sAnimations[] = {
- { &object_ah_Anim_001860, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_ah_Anim_000DDC, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+typedef enum {
+ /* -1 */ DMAH_ANIM_NONE = -1,
+ /* 0 */ DMAH_ANIM_0,
+ /* 1 */ DMAH_ANIM_1,
+ /* 2 */ DMAH_ANIM_MAX
+} DmAhAnimation;
+
+static AnimationInfoS sAnimationInfo[DMAH_ANIM_MAX] = {
+ { &object_ah_Anim_001860, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMAH_ANIM_0
+ { &object_ah_Anim_000DDC, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMAH_ANIM_1
};
-s32 func_80C1D410(DmAh* this, s32 animationIndex) {
- s32 ret = false;
+s32 DmAh_ChangeAnim(DmAh* this, s32 animIndex) {
+ s32 didAnimChange = false;
- if (animationIndex != this->animationIndex) {
- this->animationIndex = animationIndex;
- ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimations, animationIndex);
+ if (this->animIndex != animIndex) {
+ this->animIndex = animIndex;
+ didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
}
- return ret;
+ return didAnimChange;
}
void func_80C1D458(DmAh* this) {
@@ -69,7 +76,7 @@ s32 func_80C1D4D0(DmAh* this, PlayState* play) {
this->unk_290 = CLAMP(this->unk_290, -0x1C70, 0x1C70);
if (this->unk_280->id == ACTOR_PLAYER) {
- sp40.y = ((Player*)this->unk_280)->bodyPartsPos[7].y + 3.0f;
+ sp40.y = ((Player*)this->unk_280)->bodyPartsPos[PLAYER_BODYPART_HEAD].y + 3.0f;
} else {
Math_Vec3f_Copy(&sp40, &this->unk_280->focus.pos);
}
@@ -113,7 +120,7 @@ Actor* func_80C1D78C(PlayState* play) {
}
tempActor = foundActor->next;
- if (tempActor == NULL || false) {
+ if ((tempActor == NULL) || false) {
foundActor = NULL;
break;
}
@@ -122,52 +129,54 @@ Actor* func_80C1D78C(PlayState* play) {
return foundActor;
}
-void func_80C1D7FC(DmAh* this, PlayState* play) {
- s32 D_80C1DE00[] = { 0, 0, 0, 0, 0 };
- u16 csAction;
- s32 actionIndex;
+void DmAh_HandleCutscene(DmAh* this, PlayState* play) {
+ s32 csAnimIndex[] = {
+ DMAH_ANIM_0, DMAH_ANIM_0, DMAH_ANIM_0, DMAH_ANIM_0, DMAH_ANIM_0,
+ };
+ u16 cueId;
+ s32 cueChannel;
- if (play->csCtx.state != 0) {
- if (!this->unk_29C) {
- this->action = 0xFF;
- this->unk_29C = true;
- this->animationIndex2 = this->animationIndex;
+ if (play->csCtx.state != CS_STATE_IDLE) {
+ if (!this->isCutscenePlaying) {
+ this->cueId = 255;
+ this->isCutscenePlaying = true;
+ this->prevAnimIndex = 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;
- 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;
+ DmAh_ChangeAnim(this, csAnimIndex[cueId]);
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
- } else if (this->unk_29C) {
- this->unk_29C = false;
- func_80C1D410(this, this->animationIndex2);
+ } else if (this->isCutscenePlaying) {
+ this->isCutscenePlaying = false;
+ DmAh_ChangeAnim(this, this->prevAnimIndex);
}
}
-void func_80C1D92C(DmAh* this, PlayState* play) {
+void DmAh_DoNothing(DmAh* this, PlayState* play) {
}
void DmAh_Init(Actor* thisx, PlayState* play) {
DmAh* this = THIS;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 20.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_ah_Skel_009E70, NULL, this->morphTable, this->jointTable,
+ SkelAnime_InitFlex(play, &this->skelAnime, &object_ah_Skel_009E70, NULL, this->jointTable, this->morphTable,
OBJECT_AH_LIMB_MAX);
- this->animationIndex = -1;
- func_80C1D410(this, 0);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->animIndex = DMAH_ANIM_NONE;
+ DmAh_ChangeAnim(this, DMAH_ANIM_0);
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
Actor_SetScale(&this->actor, 0.01f);
this->unk_27C |= 1;
if ((play->sceneId == SCENE_YADOYA) && (play->curSpawn == 4)) {
this->unk_280 = func_80C1D78C(play);
- func_80C1D410(this, 1);
- this->actionFunc = func_80C1D92C;
+ DmAh_ChangeAnim(this, DMAH_ANIM_1);
+ this->actionFunc = DmAh_DoNothing;
} else {
- this->actionFunc = func_80C1D7FC;
+ this->actionFunc = DmAh_HandleCutscene;
}
}
@@ -181,7 +190,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 +254,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..733d656ea 100644
--- a/src/overlays/actors/ovl_Dm_Ah/z_dm_ah.h
+++ b/src/overlays/actors/ovl_Dm_Ah/z_dm_ah.h
@@ -16,10 +16,10 @@ typedef struct DmAh {
/* 0x198 */ Vec3f unk_198;
/* 0x1A4 */ Vec3s unk_1A4;
/* 0x1AA */ Vec3s unk_1AA;
- /* 0x1B0 */ Vec3s morphTable[OBJECT_AH_LIMB_MAX];
- /* 0x216 */ Vec3s jointTable[OBJECT_AH_LIMB_MAX];
+ /* 0x1B0 */ Vec3s jointTable[OBJECT_AH_LIMB_MAX];
+ /* 0x216 */ Vec3s morphTable[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;
@@ -28,9 +28,9 @@ typedef struct DmAh {
/* 0x28C */ s16 unk_28C;
/* 0x28E */ s16 unk_28E;
/* 0x290 */ s16 unk_290;
- /* 0x294 */ s32 animationIndex;
- /* 0x298 */ s32 animationIndex2;
- /* 0x29C */ s32 unk_29C;
+ /* 0x294 */ s32 animIndex;
+ /* 0x298 */ s32 prevAnimIndex;
+ /* 0x29C */ s32 isCutscenePlaying;
} DmAh; // size = 0x2A0
#endif // Z_DM_AH_H
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..91fd6ea80 100644
--- a/src/overlays/actors/ovl_Dm_Al/z_dm_al.c
+++ b/src/overlays/actors/ovl_Dm_Al/z_dm_al.c
@@ -6,7 +6,7 @@
#include "z_dm_al.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((DmAl*)thisx)
@@ -28,47 +28,51 @@ ActorInit Dm_Al_InitVars = {
};
typedef enum {
- /* 0 */ MADAME_AROMA_ANIM_0,
- /* 1 */ MADAME_AROMA_ANIM_1
+ /* -1 */ MADAME_AROMA_ANIM_NONE = -1,
+ /* 0 */ MADAME_AROMA_ANIM_0,
+ /* 1 */ MADAME_AROMA_ANIM_MAX
} DmAlAnimation;
-static AnimationInfoS sAnimationInfo[] = {
- { &object_al_Anim_00DBE0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+static AnimationInfoS sAnimationInfo[MADAME_AROMA_ANIM_MAX] = {
+ { &object_al_Anim_00DBE0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // MADAME_AROMA_ANIM_0
};
s32 DmAl_ChangeAnim(DmAl* this, s32 animIndex) {
- s32 didAnimationChange = false;
+ s32 didAnimChange = false;
- if (animIndex != this->animIndex) {
+ if (this->animIndex != animIndex) {
this->animIndex = animIndex;
- didAnimationChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
+ didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
}
- return didAnimationChange;
+
+ return didAnimChange;
}
-void func_80C1BDD8(DmAl* this, PlayState* play) {
- s32 D_80C1C280[] = { 0, 0, 0, 0, 0 };
- u16 csAction;
- s32 actionIndex;
+void DmAl_HandleCutscene(DmAl* this, PlayState* play) {
+ s32 csAnimIndex[] = {
+ MADAME_AROMA_ANIM_0, MADAME_AROMA_ANIM_0, MADAME_AROMA_ANIM_0, MADAME_AROMA_ANIM_0, MADAME_AROMA_ANIM_0,
+ };
+ u16 cueId;
+ s32 cueChannel;
- if (play->csCtx.state != 0) {
- if (!this->unk_45C) {
- this->action = 0xFF;
- this->unk_45C = true;
- this->animIndex2 = this->animIndex;
+ if (play->csCtx.state != CS_STATE_IDLE) {
+ if (!this->isCutscenePlaying) {
+ this->cueId = 255;
+ this->isCutscenePlaying = true;
+ this->prevAnimIndex = 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, csAnimIndex[cueId]);
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
- } else if (this->unk_45C) {
- this->unk_45C = false;
- DmAl_ChangeAnim(this, this->animIndex2);
+ } else if (this->isCutscenePlaying) {
+ this->isCutscenePlaying = false;
+ DmAl_ChangeAnim(this, this->prevAnimIndex);
}
}
@@ -78,11 +82,11 @@ void DmAl_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, NULL, 0.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &gMadameAromaSkel, NULL, this->jointTable, this->morphTable,
MADAME_AROMA_LIMB_MAX);
- this->animIndex = -1;
+ this->animIndex = MADAME_AROMA_ANIM_NONE;
DmAl_ChangeAnim(this, MADAME_AROMA_ANIM_0);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
Actor_SetScale(&this->actor, 0.01f);
- this->actionFunc = func_80C1BDD8;
+ this->actionFunc = DmAl_HandleCutscene;
}
void DmAl_Destroy(Actor* thisx, PlayState* play) {
@@ -93,7 +97,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) {
@@ -106,6 +110,9 @@ s32 DmAl_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* ro
case MADAME_AROMA_LIMB_SHAWL_RIGHT_LOWER:
*dList = NULL;
break;
+
+ default:
+ break;
}
return false;
}
@@ -117,21 +124,27 @@ void DmAl_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
case MADAME_AROMA_LIMB_SHAWL_MIDDLE:
Matrix_Get(&this->shawlMatrices[0]);
break;
+
case MADAME_AROMA_LIMB_SHAWL_UPPER:
Matrix_Get(&this->shawlMatrices[1]);
break;
+
case MADAME_AROMA_LIMB_SHAWL_LEFT_LOWER_MIDDLE:
Matrix_Get(&this->shawlMatrices[2]);
break;
+
case MADAME_AROMA_LIMB_SHAWL_LEFT_LOWER:
Matrix_Get(&this->shawlMatrices[3]);
break;
+
case MADAME_AROMA_LIMB_SHAWL_RIGHT_LOWER_MIDDLE:
Matrix_Get(&this->shawlMatrices[4]);
break;
+
case MADAME_AROMA_LIMB_SHAWL_RIGHT_LOWER:
Matrix_Get(&this->shawlMatrices[5]);
break;
+
default:
break;
}
@@ -152,7 +165,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..084af062b 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,10 @@ 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;
+ /* 0x458 */ s32 prevAnimIndex;
+ /* 0x45C */ s32 isCutscenePlaying;
} DmAl; // size = 0x460
-typedef enum {
- /* 0x0 */ MADAME_AROMA_ANIMATION_0,
- /* 0x1 */ 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..a55f2cc1f 100644
--- a/src/overlays/actors/ovl_Dm_An/z_dm_an.c
+++ b/src/overlays/actors/ovl_Dm_An/z_dm_an.c
@@ -8,7 +8,7 @@
#include "objects/object_an4/object_an4.h"
#include "objects/object_msmo/object_msmo.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((DmAn*)thisx)
@@ -17,8 +17,8 @@ void DmAn_Destroy(Actor* thisx, PlayState* play);
void DmAn_Update(Actor* thisx, PlayState* play);
void func_80C1C958(DmAn* this, PlayState* play);
-void func_80C1CAB0(DmAn* this, PlayState* play);
-void func_80C1CC80(DmAn* this, PlayState* play);
+void DmAn_HandleCutscene(DmAn* this, PlayState* play);
+void DmAn_DoNothing(DmAn* this, PlayState* play);
void func_80C1D0B0(Actor* thisx, PlayState* play);
ActorInit Dm_An_InitVars = {
@@ -33,60 +33,81 @@ ActorInit Dm_An_InitVars = {
(ActorFunc)NULL,
};
-static AnimationInfoS sAnimationInfo[] = {
- { &object_an1_Anim_007E08, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_an1_Anim_0071E8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_an4_Anim_006CC0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_an1_Anim_013E1C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_an4_Anim_007E3C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_an4_Anim_0088C0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_an4_Anim_0013C8, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_an4_Anim_002550, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_an4_Anim_00353C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_an4_Anim_004498, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_an4_Anim_0060B4, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_an4_Anim_00041C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_an4_Anim_004A78, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_an4_Anim_00506C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+typedef enum {
+ /* -1 */ DMAN_ANIM_NONE = -1,
+ /* 0x0 */ DMAN_ANIM_0,
+ /* 0x1 */ DMAN_ANIM_1,
+ /* 0x2 */ DMAN_ANIM_2,
+ /* 0x3 */ DMAN_ANIM_3,
+ /* 0x4 */ DMAN_ANIM_4,
+ /* 0x5 */ DMAN_ANIM_5,
+ /* 0x6 */ DMAN_ANIM_6,
+ /* 0x7 */ DMAN_ANIM_7,
+ /* 0x8 */ DMAN_ANIM_8,
+ /* 0x9 */ DMAN_ANIM_9,
+ /* 0xA */ DMAN_ANIM_10,
+ /* 0xB */ DMAN_ANIM_11,
+ /* 0xC */ DMAN_ANIM_12,
+ /* 0xD */ DMAN_ANIM_13,
+ /* 0xE */ DMAN_ANIM_MAX
+} DmAnAnimation;
+
+static AnimationInfoS sAnimationInfo[DMAN_ANIM_MAX] = {
+ { &object_an1_Anim_007E08, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMAN_ANIM_0
+ { &object_an1_Anim_0071E8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMAN_ANIM_1
+ { &object_an4_Anim_006CC0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMAN_ANIM_2
+ { &object_an1_Anim_013E1C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMAN_ANIM_3
+ { &object_an4_Anim_007E3C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DMAN_ANIM_4
+ { &object_an4_Anim_0088C0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMAN_ANIM_5
+ { &object_an4_Anim_0013C8, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DMAN_ANIM_6
+ { &object_an4_Anim_002550, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMAN_ANIM_7
+ { &object_an4_Anim_00353C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DMAN_ANIM_8
+ { &object_an4_Anim_004498, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMAN_ANIM_9
+ { &object_an4_Anim_0060B4, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DMAN_ANIM_10
+ { &object_an4_Anim_00041C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DMAN_ANIM_11
+ { &object_an4_Anim_004A78, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DMAN_ANIM_12
+ { &object_an4_Anim_00506C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMAN_ANIM_13
};
-s32 func_80C1C410(DmAn* this, PlayState* play) {
+s32 DmAn_UpdateSkelAnime(DmAn* this, PlayState* play) {
s8 objectIndex = this->actor.objBankIndex;
s8 objectIndex2;
- s32 ret = false;
+ s32 isAnimFinished = false;
- if (this->unk_2C8 < 2) {
+ if (this->animIndex <= DMAN_ANIM_1) {
objectIndex2 = this->actor.objBankIndex;
} else {
objectIndex2 = this->unk_2AC;
}
if (objectIndex2 >= 0) {
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex2].segment);
- ret = SkelAnime_Update(&this->skelAnime);
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objectIndex2].segment);
+ isAnimFinished = SkelAnime_Update(&this->skelAnime);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objectIndex].segment);
}
- return ret;
+
+ return isAnimFinished;
}
-s32 func_80C1C4D8(DmAn* this, PlayState* play, s32 arg2) {
+s32 DmAn_ChangeAnim(DmAn* this, PlayState* play, s32 animIndex) {
s8 objectIndex = this->actor.objBankIndex;
s8 objectIndex2;
- s32 ret = false;
+ s32 didAnimChange = false;
- if (arg2 < 2) {
+ if (animIndex <= DMAN_ANIM_1) {
objectIndex2 = this->actor.objBankIndex;
} else {
objectIndex2 = this->unk_2AC;
}
- if ((objectIndex2 >= 0) && (arg2 != this->unk_2C8)) {
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex2].segment);
- this->unk_2C8 = arg2;
- ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, arg2);
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex].segment);
+ if ((objectIndex2 >= 0) && (this->animIndex != animIndex)) {
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objectIndex2].segment);
+ this->animIndex = animIndex;
+ didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objectIndex].segment);
}
- return ret;
+
+ return didAnimChange;
}
void func_80C1C5B4(DmAn* this) {
@@ -116,7 +137,7 @@ s32 func_80C1C62C(DmAn* this, PlayState* play) {
this->unk_2C4 = CLAMP(this->unk_2C4, -0x1C70, 0x1C70);
if (this->unk_2B4->id == ACTOR_PLAYER) {
- sp40.y = ((Player*)this->unk_2B4)->bodyPartsPos[7].y + 3.0f;
+ sp40.y = ((Player*)this->unk_2B4)->bodyPartsPos[PLAYER_BODYPART_HEAD].y + 3.0f;
} else {
Math_Vec3f_Copy(&sp40, &this->unk_2B4->focus.pos);
}
@@ -160,7 +181,7 @@ Actor* func_80C1C8E8(PlayState* play) {
}
tempActor = foundActor->next;
- if (tempActor == NULL || false) {
+ if ((tempActor == NULL) || false) {
foundActor = NULL;
break;
}
@@ -176,70 +197,77 @@ void func_80C1C958(DmAn* this, PlayState* play) {
SkelAnime_InitFlex(play, &this->skelAnime, &object_an1_Skel_012618, NULL, this->jointTable, this->morphTable,
OBJECT_AN1_LIMB_MAX);
- this->unk_2C8 = -1;
- func_80C1C4D8(this, play, 0);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->animIndex = DMAN_ANIM_NONE;
+ DmAn_ChangeAnim(this, play, DMAN_ANIM_0);
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
Actor_SetScale(&this->actor, 0.01f);
this->unk_2AE |= 1;
this->actor.draw = func_80C1D0B0;
if ((play->sceneId == SCENE_YADOYA) && (play->curSpawn == 4)) {
this->unk_2B4 = func_80C1C8E8(play);
- func_80C1C4D8(this, play, 1);
- this->actionFunc = func_80C1CC80;
+ DmAn_ChangeAnim(this, play, DMAN_ANIM_1);
+ this->actionFunc = DmAn_DoNothing;
} else {
- this->actionFunc = func_80C1CAB0;
+ this->actionFunc = DmAn_HandleCutscene;
}
}
}
-void func_80C1CAB0(DmAn* this, PlayState* play) {
- s32 sp28[] = { 0, 0, 12, 2, 4, 6, 8, 10, 11, 3 };
- u16 action;
- s32 sp20;
+void DmAn_HandleCutscene(DmAn* this, PlayState* play) {
+ s32 csAnimIndex[] = {
+ DMAN_ANIM_0, DMAN_ANIM_0, DMAN_ANIM_12, DMAN_ANIM_2, DMAN_ANIM_4,
+ DMAN_ANIM_6, DMAN_ANIM_8, DMAN_ANIM_10, DMAN_ANIM_11, DMAN_ANIM_3,
+ };
+ u16 cueId;
+ s32 cueChannel;
- if (play->csCtx.state != 0) {
- if (this->unk_2D0 == 0) {
- this->unk_2B0 = 255;
- this->unk_2D0 = 1;
- this->unk_2D4 = 0;
- this->unk_2CC = this->unk_2C8;
+ if (play->csCtx.state != CS_STATE_IDLE) {
+ if (!this->isCutscenePlaying) {
+ this->cueId = 255;
+ this->isCutscenePlaying = true;
+ this->didAnimChangeInCs = false;
+ this->prevAnimIndex = this->animIndex;
}
- 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;
- this->unk_2D4 = 1;
- func_80C1C4D8(this, play, sp28[action]);
+ if (this->cueId != (u8)cueId) {
+ this->cueId = cueId;
+ this->didAnimChangeInCs = true;
+ DmAn_ChangeAnim(this, play, csAnimIndex[cueId]);
}
- switch (this->unk_2B0) {
+ switch (this->cueId) {
case 2:
case 4:
case 5:
case 6:
case 7:
case 8:
- if ((this->unk_2C8 == 12) || (this->unk_2C8 == 4) || (this->unk_2C8 == 6) || (this->unk_2C8 == 8)) {
+ if ((this->animIndex == DMAN_ANIM_12) || (this->animIndex == DMAN_ANIM_4) ||
+ (this->animIndex == DMAN_ANIM_6) || (this->animIndex == DMAN_ANIM_8)) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- func_80C1C4D8(this, play, this->unk_2C8 + 1);
+ DmAn_ChangeAnim(this, play, this->animIndex + 1);
}
}
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;
- this->unk_2D4 = 0;
- func_80C1C4D8(this, play, this->unk_2CC);
+ } else if (this->isCutscenePlaying) {
+ this->isCutscenePlaying = false;
+ this->didAnimChangeInCs = false;
+ DmAn_ChangeAnim(this, play, this->prevAnimIndex);
}
}
-void func_80C1CC80(DmAn* this, PlayState* play) {
+void DmAn_DoNothing(DmAn* this, PlayState* play) {
}
void DmAn_Init(Actor* thisx, PlayState* play) {
@@ -261,10 +289,10 @@ void DmAn_Update(Actor* thisx, PlayState* play) {
func_80C1C83C(this, play);
if (this->actor.draw != NULL) {
- func_80C1C410(this, play);
+ DmAn_UpdateSkelAnime(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 };
@@ -277,16 +305,16 @@ void func_80C1CD80(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Acto
s8 sp2B = this->actor.objBankIndex;
s8 sp2A = this->unk_2AD;
- if ((limbIndex == OBJECT_AN1_LIMB_05) && (this->unk_2D4 != 0)) {
+ if ((limbIndex == OBJECT_AN1_LIMB_05) && this->didAnimChangeInCs) {
OPEN_DISPS(play->state.gfxCtx);
Matrix_Push();
Matrix_TranslateRotateZYX(&D_80C1D2C8, &D_80C1D2D4);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[sp2A].segment);
+ gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[sp2A].segment);
gSPDisplayList(POLY_OPA_DISP++, gMoonMaskDL);
- gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[sp2B].segment);
+ gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[sp2B].segment);
Matrix_Pop();
@@ -356,7 +384,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..c1e85d3eb 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;
@@ -30,10 +30,10 @@ typedef struct DmAn {
/* 0x2C0 */ s16 unk_2C0;
/* 0x2C2 */ s16 unk_2C2;
/* 0x2C4 */ s16 unk_2C4;
- /* 0x2C8 */ s32 unk_2C8;
- /* 0x2CC */ s32 unk_2CC;
- /* 0x2D0 */ s32 unk_2D0;
- /* 0x2D4 */ s32 unk_2D4;
+ /* 0x2C8 */ s32 animIndex;
+ /* 0x2CC */ s32 prevAnimIndex;
+ /* 0x2D0 */ s32 isCutscenePlaying;
+ /* 0x2D4 */ s32 didAnimChangeInCs;
} DmAn; // size = 0x2D8
#endif // Z_DM_AN_H
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..a0fa8d6b3 100644
--- a/src/overlays/actors/ovl_Dm_Bal/z_dm_bal.c
+++ b/src/overlays/actors/ovl_Dm_Bal/z_dm_bal.c
@@ -6,7 +6,7 @@
#include "z_dm_bal.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
#define THIS ((DmBal*)thisx)
@@ -30,33 +30,53 @@ ActorInit Dm_Bal_InitVars = {
(ActorFunc)DmBal_Draw,
};
-static AnimationInfo sAnimationInfo[] = {
- { &object_bal_Anim_0005FC, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
- { &object_bal_Anim_000840, 1.5f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
- { &object_bal_Anim_000840, 1.5f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f },
- { &object_bal_Anim_00A7DC, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f },
- { &object_bal_Anim_00B1E8, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
- { &object_bal_Anim_00B604, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
- { &object_bal_Anim_00C498, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f },
- { &object_bal_Anim_00C8D8, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
- { &object_bal_Anim_00C8D8, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f },
- { &object_bal_Anim_00C498, 1.0f, 23.0f, 0.0f, ANIMMODE_ONCE, -8.0f },
- { &object_bal_Anim_00D530, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
- { &object_bal_Anim_000C78, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -2.0f },
- { &object_bal_Anim_00CB78, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -2.0f },
- { &object_bal_Anim_001804, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -2.0f },
+// These animations are the same and in the same order as in the main NPC actor EnBal
+typedef enum {
+ /* -1 */ TINGLE_CS_ANIM_NONE = -1,
+ /* 0x0 */ TINGLE_CS_ANIM_FLOAT_IDLE,
+ /* 0x1 */ TINGLE_CS_ANIM_FALL_LOOP,
+ /* 0x2 */ TINGLE_CS_ANIM_FALL_ONCE,
+ /* 0x3 */ TINGLE_CS_ANIM_LAND,
+ /* 0x4 */ TINGLE_CS_ANIM_TWIST,
+ /* 0x5 */ TINGLE_CS_ANIM_TALK,
+ /* 0x6 */ TINGLE_CS_ANIM_MAGIC,
+ /* 0x7 */ TINGLE_CS_ANIM_HAPPY_DANCE_LOOP,
+ /* 0x8 */ TINGLE_CS_ANIM_HAPPY_DANCE_ONCE,
+ /* 0x9 */ TINGLE_CS_ANIM_MAGIC_REVERSE,
+ /* 0xA */ TINGLE_CS_ANIM_IDLE,
+ /* 0xB */ TINGLE_CS_ANIM_SPIN,
+ /* 0xC */ TINGLE_CS_ANIM_HIDE_FACE,
+ /* 0xD */ TINGLE_CS_ANIM_CONFETTI,
+ /* 0xE */ TINGLE_CS_ANIM_MAX
+} TingleCsAnimation;
+
+static AnimationInfo sAnimationInfo[TINGLE_CS_ANIM_MAX] = {
+ { &gTingleFloatIdleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // TINGLE_CS_ANIM_FLOAT_IDLE
+ { &gTingleFallAnim, 1.5f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // TINGLE_CS_ANIM_FALL_LOOP
+ { &gTingleFallAnim, 1.5f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, // TINGLE_CS_ANIM_FALL_ONCE
+ { &gTingleLandAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, // TINGLE_CS_ANIM_LAND
+ { &gTingleTwistAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // TINGLE_CS_ANIM_TWIST
+ { &gTingleTalkAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // TINGLE_CS_ANIM_TALK
+ { &gTingleThrowConfettiAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f }, // TINGLE_CS_ANIM_MAGIC
+ { &gTingleHappyDanceAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // TINGLE_CS_ANIM_HAPPY_DANCE_LOOP
+ { &gTingleHappyDanceAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f }, // TINGLE_CS_ANIM_HAPPY_DANCE_ONCE
+ { &gTingleThrowConfettiAnim, 1.0f, 23.0f, 0.0f, ANIMMODE_ONCE, -8.0f }, // TINGLE_CS_ANIM_MAGIC_REVERSE
+ { &gTingleIdleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // TINGLE_CS_ANIM_IDLE
+ { &gTingleSpinAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -2.0f }, // TINGLE_CS_ANIM_SPIN
+ { &gTingleFloatHideFaceAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -2.0f }, // TINGLE_CS_ANIM_HIDE_FACE
+ { &gTingleFloatThrowConfettiAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -2.0f }, // TINGLE_CS_ANIM_CONFETTI
};
void DmBal_Init(Actor* thisx, PlayState* play) {
DmBal* this = THIS;
- this->actor.targetMode = 1;
+ this->actor.targetMode = TARGET_MODE_1;
this->actor.uncullZoneForward = 3000.0f;
Actor_SetScale(&this->actor, 0.02f);
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);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gTingleSkel, &gTingleFloatIdleAnim, this->jointTable, this->morphTable,
+ TINGLE_LIMB_MAX);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
this->timer = 60;
this->eyeIndex = 0;
this->keepEyesShut = false;
@@ -73,30 +93,35 @@ void DmBal_SetupDoNothing(DmBal* this) {
void DmBal_DoNothing(DmBal* this, PlayState* play) {
}
-void func_80C1EAE8(DmBal* this, PlayState* play) {
- static u16 D_80C1F2C0 = 0x63;
- s32 actionIndex;
+void DmBal_HandleCutscene(DmBal* this, PlayState* play) {
+ 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;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_CS_ANIM_FLOAT_IDLE);
break;
+
case 2:
this->keepEyesShut = true;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 12);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_CS_ANIM_HIDE_FACE);
break;
+
case 3:
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 13);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_CS_ANIM_CONFETTI);
+ break;
+
+ default:
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 +129,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;
}
}
@@ -152,7 +177,7 @@ void DmBal_Update(Actor* thisx, PlayState* play) {
DmBal* this = THIS;
// Throw confetti
- if (Animation_OnFrame(&this->skelAnime, 29.0f) && (this->skelAnime.animation == &object_bal_Anim_001804)) {
+ if (Animation_OnFrame(&this->skelAnime, 29.0f) && (this->skelAnime.animation == &gTingleFloatThrowConfettiAnim)) {
Vec3f pos = this->actor.world.pos;
Vec3f vel = { 0.0f, 9.0f, 0.0f };
@@ -165,7 +190,7 @@ void DmBal_Update(Actor* thisx, PlayState* play) {
DmBal_SpawnPaper(this, play, &pos, &vel, -0.5f);
}
this->actionFunc(this, play);
- func_80C1EAE8(this, play);
+ DmBal_HandleCutscene(this, play);
func_80C1EC60(this, play);
DmBal_UpdateEyes(this);
SkelAnime_Update(&this->skelAnime);
@@ -175,7 +200,7 @@ s32 DmBal_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
DmBal* this = THIS;
Vec3s rots;
- if (limbIndex == 6) {
+ if (limbIndex == TINGLE_LIMB_BALLOON) {
rots.x = Math_SinS(this->unk_33A) * (0x10000 / 18);
rots.z = Math_CosS(this->unk_33A) * (0x10000 / 18);
Matrix_RotateZYX(rots.x, 0, rots.z, MTXMODE_APPLY);
@@ -189,15 +214,17 @@ s32 DmBal_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
void DmBal_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
}
-static TexturePtr sEyeTextures[] = { object_bal_Tex_006050, object_bal_Tex_0094D0 };
+static TexturePtr sEyeTextures[] = { gTingleEyeOpenTex, gTingleEyeClosedTex };
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_Bal/z_dm_bal.h b/src/overlays/actors/ovl_Dm_Bal/z_dm_bal.h
index 01f10d4c9..fa2e85639 100644
--- a/src/overlays/actors/ovl_Dm_Bal/z_dm_bal.h
+++ b/src/overlays/actors/ovl_Dm_Bal/z_dm_bal.h
@@ -14,8 +14,8 @@ typedef struct DmBal {
/* 0x188 */ DmBalActionFunc actionFunc;
/* 0x18C */ Vec3f scale;
/* 0x198 */ s32 eyeIndex;
- /* 0x262 */ Vec3s jointTable[OBJECT_BAL_LIMB_MAX];
- /* 0x19C */ Vec3s morphTable[OBJECT_BAL_LIMB_MAX];
+ /* 0x262 */ Vec3s jointTable[TINGLE_LIMB_MAX];
+ /* 0x19C */ Vec3s morphTable[TINGLE_LIMB_MAX];
/* 0x328 */ UNK_TYPE1 pad_328[12];
/* 0x334 */ s16 timer;
/* 0x336 */ s16 keepEyesShut;
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 43cc62603..97d892f9e 100644
--- a/src/overlays/actors/ovl_Dm_Char00/z_dm_char00.c
+++ b/src/overlays/actors/ovl_Dm_Char00/z_dm_char00.c
@@ -32,92 +32,182 @@ ActorInit Dm_Char00_InitVars = {
(ActorFunc)DmChar00_Draw,
};
-static AnimationInfo sAnimationInfo[] = {
- { &gameplay_keep_Anim_02B2E8, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &gameplay_keep_Anim_029140, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_004FF4, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_0053A4, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_005B68, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_006328, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_00FB30, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_010590, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_005B68, 1.0f, 37.0f, 56.0f, 4, 0.0f },
- { &object_delf_Anim_006328, 1.0f, 37.0f, 56.0f, 4, 0.0f },
- { &object_delf_Anim_00E024, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_00F0D0, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_011C70, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_011FE0, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_011088, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_0118FC, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_012388, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_012738, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_013BE0, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_013E80, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_007B04, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_0080A4, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_00859C, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_008A44, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_00EB18, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_00EBB0, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_00EE30, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_012BBC, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_012EF8, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_00C248, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_00C588, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_00BDFC, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_00C0BC, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_013040, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_013378, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_0091BC, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_0094B0, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_009C4C, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_009F40, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_009010, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_0097C4, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_00A7B4, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_00C588, 1.0f, 0.0f, -1.0f, 0, -10.0f },
- { &object_delf_Anim_004FF4, 1.0f, 0.0f, -1.0f, 2, -10.0f },
- { &object_delf_Anim_011C70, 1.0f, 0.0f, -1.0f, 0, -10.0f },
- { &object_delf_Anim_006B28, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_014190, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_01447C, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_003FAC, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_004798, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_0042E8, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_004C44, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_01088C, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_01498C, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_014E9C, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_00CEE0, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_00D260, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_00C690, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_00C790, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_00AF78, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_00B2B8, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_00BCD8, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_006D74, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_00706C, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_0072B0, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_007570, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_00A2A4, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_00A4B4, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_006614, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_015114, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_00CCD4, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_00046C, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_00065C, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_00377C, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_003148, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_001410, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_0010F8, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_00199C, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_003BB4, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_001754, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_0008E0, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_000A94, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_001ED4, 1.0f, 0.0f, -1.0f, 0, 0.0f },
- { &object_delf_Anim_001B28, 1.0f, 0.0f, -1.0f, 2, 0.0f },
- { &object_delf_Anim_000E44, 1.0f, 0.0f, -1.0f, 0, 0.0f },
+typedef enum {
+ /* -1 */ DMCHAR00_ANIM_NONE = -1,
+ /* 0x00 */ DMCHAR00_ANIM_0,
+ /* 0x01 */ DMCHAR00_ANIM_1,
+ /* 0x02 */ DMCHAR00_ANIM_2,
+ /* 0x03 */ DMCHAR00_ANIM_3,
+ /* 0x04 */ DMCHAR00_ANIM_4,
+ /* 0x05 */ DMCHAR00_ANIM_5,
+ /* 0x06 */ DMCHAR00_ANIM_6,
+ /* 0x07 */ DMCHAR00_ANIM_7,
+ /* 0x08 */ DMCHAR00_ANIM_8,
+ /* 0x09 */ DMCHAR00_ANIM_9,
+ /* 0x0A */ DMCHAR00_ANIM_10,
+ /* 0x0B */ DMCHAR00_ANIM_11,
+ /* 0x0C */ DMCHAR00_ANIM_12,
+ /* 0x0D */ DMCHAR00_ANIM_13,
+ /* 0x0E */ DMCHAR00_ANIM_14,
+ /* 0x0F */ DMCHAR00_ANIM_15,
+ /* 0x10 */ DMCHAR00_ANIM_16,
+ /* 0x11 */ DMCHAR00_ANIM_17,
+ /* 0x12 */ DMCHAR00_ANIM_18,
+ /* 0x13 */ DMCHAR00_ANIM_19,
+ /* 0x14 */ DMCHAR00_ANIM_20,
+ /* 0x15 */ DMCHAR00_ANIM_21,
+ /* 0x16 */ DMCHAR00_ANIM_22,
+ /* 0x17 */ DMCHAR00_ANIM_23,
+ /* 0x18 */ DMCHAR00_ANIM_24,
+ /* 0x19 */ DMCHAR00_ANIM_25,
+ /* 0x1A */ DMCHAR00_ANIM_26,
+ /* 0x1B */ DMCHAR00_ANIM_27,
+ /* 0x1C */ DMCHAR00_ANIM_28,
+ /* 0x1D */ DMCHAR00_ANIM_29,
+ /* 0x1E */ DMCHAR00_ANIM_30,
+ /* 0x1F */ DMCHAR00_ANIM_31,
+ /* 0x20 */ DMCHAR00_ANIM_32,
+ /* 0x21 */ DMCHAR00_ANIM_33,
+ /* 0x22 */ DMCHAR00_ANIM_34,
+ /* 0x23 */ DMCHAR00_ANIM_35,
+ /* 0x24 */ DMCHAR00_ANIM_36,
+ /* 0x25 */ DMCHAR00_ANIM_37,
+ /* 0x26 */ DMCHAR00_ANIM_38,
+ /* 0x27 */ DMCHAR00_ANIM_39,
+ /* 0x28 */ DMCHAR00_ANIM_40,
+ /* 0x29 */ DMCHAR00_ANIM_41,
+ /* 0x2A */ DMCHAR00_ANIM_42,
+ /* 0x2B */ DMCHAR00_ANIM_43,
+ /* 0x2C */ DMCHAR00_ANIM_44,
+ /* 0x2D */ DMCHAR00_ANIM_45,
+ /* 0x2E */ DMCHAR00_ANIM_46,
+ /* 0x2F */ DMCHAR00_ANIM_47,
+ /* 0x30 */ DMCHAR00_ANIM_48,
+ /* 0x31 */ DMCHAR00_ANIM_49,
+ /* 0x32 */ DMCHAR00_ANIM_50,
+ /* 0x33 */ DMCHAR00_ANIM_51,
+ /* 0x34 */ DMCHAR00_ANIM_52,
+ /* 0x35 */ DMCHAR00_ANIM_53,
+ /* 0x36 */ DMCHAR00_ANIM_54,
+ /* 0x37 */ DMCHAR00_ANIM_55,
+ /* 0x38 */ DMCHAR00_ANIM_56,
+ /* 0x39 */ DMCHAR00_ANIM_57,
+ /* 0x3A */ DMCHAR00_ANIM_58,
+ /* 0x3B */ DMCHAR00_ANIM_59,
+ /* 0x3C */ DMCHAR00_ANIM_60,
+ /* 0x3D */ DMCHAR00_ANIM_61,
+ /* 0x3E */ DMCHAR00_ANIM_62,
+ /* 0x3F */ DMCHAR00_ANIM_63,
+ /* 0x40 */ DMCHAR00_ANIM_64,
+ /* 0x41 */ DMCHAR00_ANIM_65,
+ /* 0x42 */ DMCHAR00_ANIM_66,
+ /* 0x43 */ DMCHAR00_ANIM_67,
+ /* 0x44 */ DMCHAR00_ANIM_68,
+ /* 0x45 */ DMCHAR00_ANIM_69,
+ /* 0x46 */ DMCHAR00_ANIM_70,
+ /* 0x47 */ DMCHAR00_ANIM_71,
+ /* 0x48 */ DMCHAR00_ANIM_72,
+ /* 0x49 */ DMCHAR00_ANIM_73,
+ /* 0x4A */ DMCHAR00_ANIM_74,
+ /* 0x4B */ DMCHAR00_ANIM_75,
+ /* 0x4C */ DMCHAR00_ANIM_76,
+ /* 0x4D */ DMCHAR00_ANIM_77,
+ /* 0x4E */ DMCHAR00_ANIM_78,
+ /* 0x4F */ DMCHAR00_ANIM_79,
+ /* 0x50 */ DMCHAR00_ANIM_80,
+ /* 0x51 */ DMCHAR00_ANIM_81,
+ /* 0x52 */ DMCHAR00_ANIM_82,
+ /* 0x53 */ DMCHAR00_ANIM_83,
+ /* 0x54 */ DMCHAR00_ANIM_84,
+ /* 0x55 */ DMCHAR00_ANIM_MAX
+} DmChar00Animation;
+
+static AnimationInfo sAnimationInfo[DMCHAR00_ANIM_MAX] = {
+ { &gameplay_keep_Anim_02B2E8, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_0
+ { &gameplay_keep_Anim_029140, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_1
+ { &object_delf_Anim_004FF4, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_2
+ { &object_delf_Anim_0053A4, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_3
+ { &object_delf_Anim_005B68, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_4
+ { &object_delf_Anim_006328, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_5
+ { &object_delf_Anim_00FB30, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_6
+ { &object_delf_Anim_010590, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_7
+ { &object_delf_Anim_005B68, 1.0f, 37.0f, 56.0f, ANIMMODE_LOOP_PARTIAL, 0.0f }, // DMCHAR00_ANIM_8
+ { &object_delf_Anim_006328, 1.0f, 37.0f, 56.0f, ANIMMODE_LOOP_PARTIAL, 0.0f }, // DMCHAR00_ANIM_9
+ { &object_delf_Anim_00E024, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_10
+ { &object_delf_Anim_00F0D0, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_11
+ { &object_delf_Anim_011C70, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_12
+ { &object_delf_Anim_011FE0, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_13
+ { &object_delf_Anim_011088, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_14
+ { &object_delf_Anim_0118FC, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_15
+ { &object_delf_Anim_012388, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_16
+ { &object_delf_Anim_012738, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_17
+ { &object_delf_Anim_013BE0, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_18
+ { &object_delf_Anim_013E80, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_19
+ { &object_delf_Anim_007B04, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_20
+ { &object_delf_Anim_0080A4, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_21
+ { &object_delf_Anim_00859C, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_22
+ { &object_delf_Anim_008A44, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_23
+ { &object_delf_Anim_00EB18, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_24
+ { &object_delf_Anim_00EBB0, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_25
+ { &object_delf_Anim_00EE30, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_26
+ { &object_delf_Anim_012BBC, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_27
+ { &object_delf_Anim_012EF8, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_28
+ { &object_delf_Anim_00C248, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_29
+ { &object_delf_Anim_00C588, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_30
+ { &object_delf_Anim_00BDFC, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_31
+ { &object_delf_Anim_00C0BC, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_32
+ { &object_delf_Anim_013040, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_33
+ { &object_delf_Anim_013378, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_34
+ { &object_delf_Anim_0091BC, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_35
+ { &object_delf_Anim_0094B0, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_36
+ { &object_delf_Anim_009C4C, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_37
+ { &object_delf_Anim_009F40, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_38
+ { &object_delf_Anim_009010, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_39
+ { &object_delf_Anim_0097C4, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_40
+ { &object_delf_Anim_00A7B4, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_41
+ { &object_delf_Anim_00C588, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -10.0f }, // DMCHAR00_ANIM_42
+ { &object_delf_Anim_004FF4, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, -10.0f }, // DMCHAR00_ANIM_43
+ { &object_delf_Anim_011C70, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -10.0f }, // DMCHAR00_ANIM_44
+ { &object_delf_Anim_006B28, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_45
+ { &object_delf_Anim_014190, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_46
+ { &object_delf_Anim_01447C, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_47
+ { &object_delf_Anim_003FAC, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_48
+ { &object_delf_Anim_004798, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_49
+ { &object_delf_Anim_0042E8, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_50
+ { &object_delf_Anim_004C44, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_51
+ { &object_delf_Anim_01088C, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_52
+ { &object_delf_Anim_01498C, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_53
+ { &object_delf_Anim_014E9C, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_54
+ { &object_delf_Anim_00CEE0, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_55
+ { &object_delf_Anim_00D260, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_56
+ { &object_delf_Anim_00C690, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_57
+ { &object_delf_Anim_00C790, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_58
+ { &object_delf_Anim_00AF78, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_59
+ { &object_delf_Anim_00B2B8, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_60
+ { &object_delf_Anim_00BCD8, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_61
+ { &object_delf_Anim_006D74, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_62
+ { &object_delf_Anim_00706C, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_63
+ { &object_delf_Anim_0072B0, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_64
+ { &object_delf_Anim_007570, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_65
+ { &object_delf_Anim_00A2A4, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_66
+ { &object_delf_Anim_00A4B4, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_67
+ { &object_delf_Anim_006614, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_68
+ { &object_delf_Anim_015114, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_69
+ { &object_delf_Anim_00CCD4, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_70
+ { &object_delf_Anim_00046C, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_71
+ { &object_delf_Anim_00065C, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_72
+ { &object_delf_Anim_00377C, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_73
+ { &object_delf_Anim_003148, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_74
+ { &object_delf_Anim_001410, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_75
+ { &object_delf_Anim_0010F8, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_76
+ { &object_delf_Anim_00199C, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_77
+ { &object_delf_Anim_003BB4, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_78
+ { &object_delf_Anim_001754, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_79
+ { &object_delf_Anim_0008E0, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_80
+ { &object_delf_Anim_000A94, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_81
+ { &object_delf_Anim_001ED4, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_82
+ { &object_delf_Anim_001B28, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_83
+ { &object_delf_Anim_000E44, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_84
};
Color_RGBAf D_80AA77A8[] = {
@@ -134,42 +224,46 @@ Color_RGBAf D_80AA77D8[] = {
Vec3f D_80AA7808 = { 0.0f, 0.0f, 0.0f };
-void func_80AA5580(SkelAnime* skelAnime, AnimationInfo* animation, u16 idx) {
- f32 phi_f2;
+void DmChar00_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animInfo, u16 animIndex) {
+ f32 endFrame;
- animation += idx;
+ animInfo += animIndex;
- if (animation->frameCount < 0.0f) {
- phi_f2 = Animation_GetLastFrame(animation->animation);
+ if (animInfo->frameCount < 0.0f) {
+ endFrame = Animation_GetLastFrame(animInfo->animation);
} else {
- phi_f2 = animation->frameCount;
+ endFrame = animInfo->frameCount;
}
- Animation_Change(skelAnime, animation->animation, animation->playSpeed, animation->startFrame, phi_f2,
- animation->mode, animation->morphFrames);
+
+ Animation_Change(skelAnime, animInfo->animation, animInfo->playSpeed, animInfo->startFrame, endFrame,
+ animInfo->mode, animInfo->morphFrames);
}
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:
case 1222:
case 1682:
case 2194:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
break;
case 1858:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_FAIRY_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FAIRY_ATTACK);
break;
case 2043:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_FAIRY_SURPRISE);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FAIRY_SURPRISE);
+ break;
+
+ default:
break;
}
} else {
- switch (play->csCtx.frames + 20) {
+ switch (play->csCtx.curFrame + 20) {
case 503:
case 926:
case 979:
@@ -177,25 +271,28 @@ void func_80AA561C(DmChar00* this, PlayState* play) {
case 1687:
case 2194:
case 2210:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
break;
case 2043:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_MONDO_SURPRISE);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_MONDO_SURPRISE);
+ break;
+
+ default:
break;
}
}
}
void func_80AA5720(DmChar00* this, PlayState* play) {
- if ((DMCHAR00_GET(&this->actor) == DMCHAR00_0) && (play->csCtx.frames == 505)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_SPOT_LIGHT_OPEN);
+ 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:
@@ -207,51 +304,57 @@ void func_80AA575C(DmChar00* this, PlayState* play) {
case 877:
case 882:
case 887:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_FAIRY_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FAIRY_ATTACK);
break;
case 520:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BELL_SPIT);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BELL_SPIT);
break;
case 774:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_FAIRY_SURPRISE);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FAIRY_SURPRISE);
break;
case 904:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BELL_SIGH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BELL_SIGH);
break;
case 813:
case 972:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BELL_BRAKE);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BELL_BRAKE);
+ break;
+
+ default:
break;
}
- } else if (play->csCtx.frames == 660) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_MONDO_SURPRISE);
+ } 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)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
+ 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) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_FAIRY_SURPRISE);
+ 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_PlaySfxAtPos(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
break;
case 534:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_FAIRY_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FAIRY_ATTACK);
+ break;
+
+ default:
break;
}
}
@@ -262,18 +365,21 @@ 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) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_FAIRY_SURPRISE);
+ 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_PlaySfxAtPos(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
break;
case 244:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_FAIRY_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FAIRY_ATTACK);
+ break;
+
+ default:
break;
}
}
@@ -281,114 +387,135 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
break;
case 1832:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_WHITE_OUT_INTO_MOON);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_SY_WHITE_OUT_INTO_MOON);
+ break;
+
+ default:
break;
}
- } else if (play->csCtx.frames == 125) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
+ } 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_PlaySfxAtPos(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
break;
case 891:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_WHITE_OUT_INTO_MOON);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_SY_WHITE_OUT_INTO_MOON);
+ break;
+
+ default:
break;
}
- } else if (play->csCtx.frames == 44) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
+ } 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_PlaySfxAtPos(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
break;
case 440:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
break;
case 550:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BELL_BRAKE);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BELL_BRAKE);
+ break;
+
+ default:
break;
}
} else {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 362:
case 401:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
break;
case 454:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
+ break;
+
+ default:
break;
}
- if ((play->csCtx.frames >= 500) && (play->csCtx.frames < 602)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_FAIRY_SHIVER - SFX_FLAG);
+ if ((play->csCtx.curFrame >= 500) && (play->csCtx.curFrame < 602)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FAIRY_SHIVER - SFX_FLAG);
}
}
}
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_PlaySfxAtPos(&this->actor, NA_SE_EV_WHITE_FAIRY_SHOT_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_WHITE_FAIRY_SHOT_DASH);
break;
case 797:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
+ break;
+
+ default:
break;
}
} else {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 762:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BLACK_FAIRY_SHOT_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BLACK_FAIRY_SHOT_DASH);
break;
case 797:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
+ break;
+
+ default:
break;
}
}
- if ((this->unk_261 == 53) && Animation_OnFrame(&this->skelAnime, 16.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
+ if ((this->animIndex == DMCHAR00_ANIM_53) && Animation_OnFrame(&this->skelAnime, 16.0f)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
}
}
void func_80AA5CD4(DmChar00* this, PlayState* play) {
- if ((DMCHAR00_GET(&this->actor) != DMCHAR00_0) && (play->csCtx.frames == 467)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
+ 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_PlaySfxAtPos(&this->actor, NA_SE_EV_FAIRY_SURPRISE);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FAIRY_SURPRISE);
break;
case 130:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_NAVY_VANISH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_NAVY_VANISH);
+ break;
+
+ default:
break;
}
}
@@ -396,14 +523,17 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
break;
case 31:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_FAIRY_SURPRISE);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FAIRY_SURPRISE);
+ break;
+
+ default:
break;
}
}
@@ -411,15 +541,18 @@ 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:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
break;
case 130:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_NAVY_VANISH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_NAVY_VANISH);
+ break;
+
+ default:
break;
}
}
@@ -427,28 +560,31 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
break;
case 42:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
break;
case 192:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BELL_BRAKE);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BELL_BRAKE);
break;
case 215:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_DIVE_INTO_WEED);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_DIVE_INTO_WEED);
+ break;
+
+ default:
break;
}
}
}
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 +594,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 +606,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,37 +624,40 @@ 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;
+
+ default:
+ break;
}
}
}
@@ -535,14 +674,14 @@ 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);
SkelAnime_Init(play, &this->skelAnime, &gameplay_keep_Skel_02AF58.sh, &gameplay_keep_Anim_029140, this->jointTable,
- this->morphTable, 7);
+ this->morphTable, FAIRY_LIMB_MAX);
ActorShape_Init(&thisx->shape, 0.0f, NULL, 15.0f);
- func_80AA5580(&this->skelAnime, sAnimationInfo, 0);
+ DmChar00_ChangeAnim(&this->skelAnime, &sAnimationInfo[DMCHAR00_ANIM_0], 0);
Actor_SetScale(thisx, 0.01f);
this->actionFunc = func_80AA67F8;
}
@@ -550,101 +689,101 @@ void DmChar00_Init(Actor* thisx, PlayState* play) {
void DmChar00_Destroy(Actor* thisx, PlayState* play) {
}
-void func_80AA62FC(DmChar00* this, PlayState* play) {
- u16 sp26 = DMCHAR00_GET(&this->actor) + 113;
- s32 temp_v0;
+void DmChar00_HandleCutscene(DmChar00* this, PlayState* play) {
+ 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;
+ this->animIndex = DMCHAR00_ANIM_0;
break;
case 0x2:
- this->unk_261 = 2;
+ this->animIndex = DMCHAR00_ANIM_2;
break;
case 0x3:
- this->unk_261 = 3;
+ this->animIndex = DMCHAR00_ANIM_3;
break;
case 0x4:
- this->unk_261 = 4;
+ this->animIndex = DMCHAR00_ANIM_4;
break;
case 0x5:
- this->unk_261 = 5;
+ this->animIndex = DMCHAR00_ANIM_5;
break;
case 0x6:
- this->unk_261 = 6;
+ this->animIndex = DMCHAR00_ANIM_6;
break;
case 0x7:
- this->unk_261 = 7;
+ this->animIndex = DMCHAR00_ANIM_7;
break;
case 0x8:
- this->unk_261 = 20;
+ this->animIndex = DMCHAR00_ANIM_20;
break;
case 0x9:
- this->unk_261 = 21;
+ this->animIndex = DMCHAR00_ANIM_21;
break;
case 0xA:
- this->unk_261 = 14;
+ this->animIndex = DMCHAR00_ANIM_14;
break;
case 0xB:
- this->unk_261 = 15;
+ this->animIndex = DMCHAR00_ANIM_15;
break;
case 0xC:
- this->unk_261 = 18;
+ this->animIndex = DMCHAR00_ANIM_18;
break;
case 0xD:
- this->unk_261 = 25;
+ this->animIndex = DMCHAR00_ANIM_25;
break;
case 0xE:
- this->unk_261 = 27;
+ this->animIndex = DMCHAR00_ANIM_27;
break;
case 0xF:
- this->unk_261 = 24;
+ this->animIndex = DMCHAR00_ANIM_24;
break;
case 0x10:
- this->unk_261 = 10;
+ this->animIndex = DMCHAR00_ANIM_10;
break;
case 0x11:
- this->unk_261 = 12;
+ this->animIndex = DMCHAR00_ANIM_12;
break;
case 0x12:
- this->unk_261 = 13;
+ this->animIndex = DMCHAR00_ANIM_13;
break;
case 0x13:
- this->unk_261 = 29;
+ this->animIndex = DMCHAR00_ANIM_29;
break;
case 0x14:
- this->unk_261 = 31;
+ this->animIndex = DMCHAR00_ANIM_31;
break;
case 0x15:
- this->unk_261 = 33;
+ this->animIndex = DMCHAR00_ANIM_33;
break;
case 0x16:
@@ -652,199 +791,202 @@ void func_80AA62FC(DmChar00* this, PlayState* play) {
break;
case 0x17:
- this->unk_261 = 35;
+ this->animIndex = DMCHAR00_ANIM_35;
break;
case 0x18:
- this->unk_261 = 37;
+ this->animIndex = DMCHAR00_ANIM_37;
break;
case 0x19:
- this->unk_261 = 39;
+ this->animIndex = DMCHAR00_ANIM_39;
break;
case 0x1A:
- this->unk_261 = 41;
+ this->animIndex = DMCHAR00_ANIM_41;
break;
case 0x1B:
- this->unk_261 = 45;
+ this->animIndex = DMCHAR00_ANIM_45;
break;
case 0x1C:
- this->unk_261 = 46;
+ this->animIndex = DMCHAR00_ANIM_46;
break;
case 0x1E:
- this->unk_261 = 48;
+ this->animIndex = DMCHAR00_ANIM_48;
break;
case 0x1F:
- this->unk_261 = 50;
+ this->animIndex = DMCHAR00_ANIM_50;
break;
case 0x20:
- this->unk_261 = 52;
+ this->animIndex = DMCHAR00_ANIM_52;
break;
case 0x21:
- this->unk_261 = 53;
+ this->animIndex = DMCHAR00_ANIM_53;
break;
case 0x23:
- this->unk_261 = 55;
+ this->animIndex = DMCHAR00_ANIM_55;
break;
case 0x24:
- this->unk_261 = 57;
+ this->animIndex = DMCHAR00_ANIM_57;
break;
case 0x25:
- this->unk_261 = 58;
+ this->animIndex = DMCHAR00_ANIM_58;
break;
case 0x26:
- this->unk_261 = 59;
+ this->animIndex = DMCHAR00_ANIM_59;
break;
case 0x27:
- this->unk_261 = 61;
+ this->animIndex = DMCHAR00_ANIM_61;
break;
case 0x28:
- this->unk_261 = 62;
+ this->animIndex = DMCHAR00_ANIM_62;
break;
case 0x29:
- this->unk_261 = 64;
+ this->animIndex = DMCHAR00_ANIM_64;
break;
case 0x2A:
- this->unk_261 = 66;
+ this->animIndex = DMCHAR00_ANIM_66;
break;
case 0x2B:
- this->unk_261 = 68;
+ this->animIndex = DMCHAR00_ANIM_68;
break;
case 0x2C:
- this->unk_261 = 69;
+ this->animIndex = DMCHAR00_ANIM_69;
break;
case 0x2D:
- this->unk_261 = 70;
+ this->animIndex = DMCHAR00_ANIM_70;
break;
case 0x2E:
- this->unk_261 = 67;
+ this->animIndex = DMCHAR00_ANIM_67;
break;
case 0x2F:
- this->unk_261 = 71;
+ this->animIndex = DMCHAR00_ANIM_71;
break;
case 0x30:
- this->unk_261 = 73;
+ this->animIndex = DMCHAR00_ANIM_73;
break;
case 0x31:
- this->unk_261 = 74;
+ this->animIndex = DMCHAR00_ANIM_74;
break;
case 0x32:
- this->unk_261 = 75;
+ this->animIndex = DMCHAR00_ANIM_75;
break;
case 0x33:
- this->unk_261 = 77;
+ this->animIndex = DMCHAR00_ANIM_77;
break;
case 0x34:
- this->unk_261 = 78;
+ this->animIndex = DMCHAR00_ANIM_78;
break;
case 0x35:
- this->unk_261 = 79;
+ this->animIndex = DMCHAR00_ANIM_79;
break;
case 0x36:
- this->unk_261 = 80;
+ this->animIndex = DMCHAR00_ANIM_80;
break;
case 0x37:
- this->unk_261 = 82;
+ this->animIndex = DMCHAR00_ANIM_82;
break;
case 0x38:
- this->unk_261 = 83;
+ this->animIndex = DMCHAR00_ANIM_83;
break;
default:
- this->unk_261 = 0;
+ this->animIndex = DMCHAR00_ANIM_0;
break;
}
- func_80AA5580(&this->skelAnime, &sAnimationInfo[this->unk_261], 0);
+ DmChar00_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 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)) {
- switch (this->unk_261) {
- case 0x4:
- case 0x5:
- this->unk_261 += 4;
- func_80AA5580(&this->skelAnime, &sAnimationInfo[this->unk_261], 0);
+ switch (this->animIndex) {
+ case DMCHAR00_ANIM_4:
+ case DMCHAR00_ANIM_5:
+ this->animIndex += 4;
+ DmChar00_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
this->skelAnime.curFrame = 37.0f;
break;
- case 0xE:
- case 0xF:
- case 0x14:
- case 0x15:
- this->unk_261 += 2;
- func_80AA5580(&this->skelAnime, &sAnimationInfo[this->unk_261], 0);
+ case DMCHAR00_ANIM_14:
+ case DMCHAR00_ANIM_15:
+ case DMCHAR00_ANIM_20:
+ case DMCHAR00_ANIM_21:
+ this->animIndex += 2;
+ DmChar00_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
break;
- case 0xA:
- case 0x12:
- case 0x19:
- case 0x1B:
- case 0x1D:
- case 0x1F:
- case 0x21:
- case 0x23:
- case 0x25:
- case 0x27:
- case 0x2B:
- case 0x2E:
- case 0x30:
- case 0x32:
- case 0x35:
- case 0x37:
- case 0x3B:
- case 0x3E:
- case 0x40:
- case 0x42:
- case 0x47:
- case 0x4B:
- case 0x50:
- case 0x53:
- this->unk_261 += 1;
- func_80AA5580(&this->skelAnime, &sAnimationInfo[this->unk_261], 0);
+ case DMCHAR00_ANIM_10:
+ case DMCHAR00_ANIM_18:
+ case DMCHAR00_ANIM_25:
+ case DMCHAR00_ANIM_27:
+ case DMCHAR00_ANIM_29:
+ case DMCHAR00_ANIM_31:
+ case DMCHAR00_ANIM_33:
+ case DMCHAR00_ANIM_35:
+ case DMCHAR00_ANIM_37:
+ case DMCHAR00_ANIM_39:
+ case DMCHAR00_ANIM_43:
+ case DMCHAR00_ANIM_46:
+ case DMCHAR00_ANIM_48:
+ case DMCHAR00_ANIM_50:
+ case DMCHAR00_ANIM_53:
+ case DMCHAR00_ANIM_55:
+ case DMCHAR00_ANIM_59:
+ case DMCHAR00_ANIM_62:
+ case DMCHAR00_ANIM_64:
+ case DMCHAR00_ANIM_66:
+ case DMCHAR00_ANIM_71:
+ case DMCHAR00_ANIM_75:
+ case DMCHAR00_ANIM_80:
+ case DMCHAR00_ANIM_83:
+ this->animIndex += 1;
+ DmChar00_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
break;
- case 0x2D:
- this->unk_261 = 19;
- func_80AA5580(&this->skelAnime, &sAnimationInfo[this->unk_261], 0);
+ case DMCHAR00_ANIM_45:
+ this->animIndex = DMCHAR00_ANIM_19;
+ DmChar00_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
break;
- case 0x46:
- case 0x4D:
- this->unk_261 = 0;
- func_80AA5580(&this->skelAnime, &sAnimationInfo[this->unk_261], 0);
+ case DMCHAR00_ANIM_70:
+ case DMCHAR00_ANIM_77:
+ this->animIndex = DMCHAR00_ANIM_0;
+ DmChar00_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
+ break;
+
+ default:
break;
}
}
@@ -853,10 +995,10 @@ 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 (this->unk_261 != 42) {
- this->unk_261 = 42;
- func_80AA5580(&this->skelAnime, &sAnimationInfo[this->unk_261], 0);
+ if ((play->csCtx.state == CS_STATE_IDLE) && (gSaveContext.sceneLayer == 0) && (play->csCtx.scriptIndex == 1)) {
+ if (this->animIndex != DMCHAR00_ANIM_42) {
+ this->animIndex = DMCHAR00_ANIM_42;
+ DmChar00_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
Math_SmoothStepToF(&this->actor.world.pos.x, 0.0f, 0.5f, 0.5f, 0.001f);
@@ -864,8 +1006,8 @@ void func_80AA67F8(DmChar00* this, PlayState* play) {
Math_SmoothStepToF(&this->actor.world.pos.z, -560.0f, 0.5f, 20.0f, 0.001f);
if (player->actor.world.pos.z < -625.0f) {
- this->unk_261 = 43;
- func_80AA5580(&this->skelAnime, &sAnimationInfo[this->unk_261], 0);
+ this->animIndex = DMCHAR00_ANIM_43;
+ DmChar00_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
this->actionFunc = func_80AA695C;
this->skelAnime.playSpeed = 1.5f;
}
@@ -873,7 +1015,7 @@ void func_80AA67F8(DmChar00* this, PlayState* play) {
}
void func_80AA695C(DmChar00* this, PlayState* play) {
- if (this->unk_261 == 44) {
+ if (this->animIndex == DMCHAR00_ANIM_44) {
Math_SmoothStepToF(&this->actor.world.pos.x, 0.0f, 0.5f, 0.5f, 0.001f);
Math_SmoothStepToF(&this->actor.world.pos.y, 30.0f, 0.5f, 0.5f, 0.001f);
Math_SmoothStepToF(&this->actor.world.pos.z, -680.0f, 0.5f, 10.0f, 0.001f);
@@ -889,7 +1031,7 @@ void DmChar00_Update(Actor* thisx, PlayState* play) {
this->unk_262++;
func_80AA5EBC(this, play);
- func_80AA62FC(this, play);
+ DmChar00_HandleCutscene(this, play);
}
s32 DmChar00_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx,
@@ -898,7 +1040,7 @@ s32 DmChar00_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f
f32 sp28;
Vec3f sp1C;
- if (limbIndex == 6) {
+ if (limbIndex == FAIRY_LIMB_6) {
sp28 = ((Math_SinS(this->unk_262 * 0x1000) * 0.1f) + 1.0f) * 0.012f * (this->actor.scale.x * (1.0f / 0.008f));
Matrix_MultVec3f(&D_80AA7808, &sp1C);
Matrix_Translate(sp1C.x, sp1C.y, sp1C.z, MTXMODE_NEW);
@@ -914,15 +1056,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..05c53dc8f 100644
--- a/src/overlays/actors/ovl_Dm_Char00/z_dm_char00.h
+++ b/src/overlays/actors/ovl_Dm_Char00/z_dm_char00.h
@@ -2,6 +2,7 @@
#define Z_DM_CHAR00_H
#include "global.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
struct DmChar00;
@@ -16,15 +17,15 @@ typedef void (*DmChar00ActionFunc)(struct DmChar00*, PlayState*);
typedef struct DmChar00 {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[7];
+ /* 0x188 */ Vec3s jointTable[FAIRY_LIMB_MAX];
/* 0x1B2 */ UNK_TYPE1 unk_1B2[0x30];
- /* 0x1E2 */ Vec3s morphTable[7];
+ /* 0x1E2 */ Vec3s morphTable[FAIRY_LIMB_MAX];
/* 0x20C */ UNK_TYPE1 unk_20C[0x30];
/* 0x23C */ DmChar00ActionFunc actionFunc;
/* 0x240 */ Color_RGBAf unk_240;
/* 0x250 */ Color_RGBAf unk_250;
- /* 0x260 */ u8 unk_260;
- /* 0x261 */ u8 unk_261;
+ /* 0x260 */ u8 cueId;
+ /* 0x261 */ u8 animIndex;
/* 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 069d829c1..d224694ec 100644
--- a/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.c
+++ b/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.c
@@ -4,6 +4,7 @@
* Description: Woodfall scene objects (temple, water, walls, etc)
*/
+#include "prevent_bss_reordering.h"
#include "z_dm_char01.h"
#include "objects/object_mtoride/object_mtoride.h"
#include "overlays/actors/ovl_Obj_Etcetera/z_obj_etcetera.h"
@@ -67,15 +68,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 +98,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 +135,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 {
@@ -168,14 +169,14 @@ void func_80AA8698(DmChar01* this, PlayState* play) {
(player2->actor.world.pos.x < 40.0f) && (player2->actor.world.pos.z > 1000.0f) &&
(player2->actor.world.pos.z < 1078.0f)) {
if (!D_80AAAAB4) {
- play_sound(NA_SE_SY_TRE_BOX_APPEAR);
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
D_80AAAAB4 = true;
}
} else {
D_80AAAAB4 = false;
}
- if ((player->transformation == PLAYER_FORM_DEKU) && (play->msgCtx.ocarinaMode == 3) &&
+ if ((player->transformation == PLAYER_FORM_DEKU) && (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) &&
(play->msgCtx.lastPlayedSong == OCARINA_SONG_SONATA)) {
if ((player2->actor.world.pos.x > -40.0f) && (player2->actor.world.pos.x < 40.0f) &&
@@ -187,21 +188,22 @@ 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_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_FORT_RISING);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_FORT_RISING);
}
} else {
D_80AAAE24 = 0;
@@ -277,7 +279,7 @@ void func_80AA8C28(DmChar01* this, PlayState* play) {
switch (this->unk_346) {
case 0:
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_WATER_PURIFICATION);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_WATER_PURIFICATION);
D_80AAAE22 = -2200;
D_80AAAE20 = 100;
this->unk_346++;
@@ -344,11 +346,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 +375,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 +424,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 +436,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 +483,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 b618281c2..23a045e0d 100644
--- a/src/overlays/actors/ovl_Dm_Char02/z_dm_char02.c
+++ b/src/overlays/actors/ovl_Dm_Char02/z_dm_char02.c
@@ -16,7 +16,7 @@ void DmChar02_Destroy(Actor* thisx, PlayState* play);
void DmChar02_Update(Actor* thisx, PlayState* play);
void DmChar02_Draw(Actor* thisx, PlayState* play);
-void DmChar02_PerformCutsceneActions(DmChar02* this, PlayState* play);
+void DmChar02_HandleCutscene(DmChar02* this, PlayState* play);
ActorInit Dm_Char02_InitVars = {
ACTOR_DM_CHAR02,
@@ -36,46 +36,47 @@ typedef enum {
/* 1 */ DMCHAR02_ANIM_TURN_AROUND,
/* 2 */ DMCHAR02_ANIM_JUGGLE,
/* 3 */ DMCHAR02_ANIM_FALL,
+ /* 4 */ DMCHAR02_ANIM_MAX
} DmChar02Animation;
-static AnimationInfo sAnimationInfo[] = {
- { &gClockTowerOcarinaOfTimeHitGroundAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gClockTowerOcarinaOfTimeTurnAroundAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gClockTowerOcarinaOfTimeJuggleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gClockTowerOcarinaOfTimeFallAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
+static AnimationInfo sAnimationInfo[DMCHAR02_ANIM_MAX] = {
+ { &gClockTowerOcarinaOfTimeHitGroundAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR02_ANIM_HIT_GROUND
+ { &gClockTowerOcarinaOfTimeTurnAroundAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR02_ANIM_TURN_AROUND
+ { &gClockTowerOcarinaOfTimeJuggleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR02_ANIM_JUGGLE
+ { &gClockTowerOcarinaOfTimeFallAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR02_ANIM_FALL
};
-void DmChar02_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animationInfo, u16 animIndex) {
- f32 frameCount;
+void DmChar02_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animInfo, u16 animIndex) {
+ f32 endFrame;
- animationInfo += animIndex;
+ animInfo += animIndex;
- if (animationInfo->frameCount < 0.0f) {
- frameCount = Animation_GetLastFrame(animationInfo->animation);
+ if (animInfo->frameCount < 0.0f) {
+ endFrame = Animation_GetLastFrame(animInfo->animation);
} else {
- frameCount = animationInfo->frameCount;
+ endFrame = animInfo->frameCount;
}
- Animation_Change(skelAnime, animationInfo->animation, animationInfo->playSpeed, animationInfo->startFrame,
- frameCount, animationInfo->mode, animationInfo->morphFrames);
+ Animation_Change(skelAnime, animInfo->animation, animInfo->playSpeed, animInfo->startFrame, endFrame,
+ animInfo->mode, animInfo->morphFrames);
}
void DmChar02_PlaySfxForDroppingOcarinaCutscene(DmChar02* this, PlayState* play) {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 95:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_OCARINA_BOUND_0);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_OCARINA_BOUND_0);
break;
case 101:
case 105:
case 112:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_OCARINA_BOUND_1);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_OCARINA_BOUND_1);
break;
}
}
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,14 +84,14 @@ 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);
SkelAnime_InitFlex(play, &this->skelAnime, &gClockTowerOcarinaOfTimeSkel, NULL, NULL, NULL, 0);
- DmChar02_ChangeAnim(&this->skelAnime, sAnimationInfo, 0);
+ DmChar02_ChangeAnim(&this->skelAnime, &sAnimationInfo[DMCHAR02_ANIM_HIT_GROUND], 0);
Actor_SetScale(&this->actor, 0.01f);
- this->actionFunc = DmChar02_PerformCutsceneActions;
+ this->actionFunc = DmChar02_HandleCutscene;
} else {
Actor_Kill(&this->actor);
}
@@ -99,14 +100,14 @@ void DmChar02_Init(Actor* thisx, PlayState* play) {
void DmChar02_Destroy(Actor* thisx, PlayState* play) {
}
-void DmChar02_PerformCutsceneActions(DmChar02* this, PlayState* play) {
+void DmChar02_HandleCutscene(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 +131,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)) {
@@ -148,7 +149,7 @@ void DmChar02_Update(Actor* thisx, PlayState* play) {
this->unk_2F0 = this->unk_2F0;
this->actionFunc(this, play);
if (!Actor_HasParent(&this->actor, play)) {
- Actor_PickUp(&this->actor, play, GI_OCARINA, 30.0f, 80.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_OCARINA_OF_TIME, 30.0f, 80.0f);
} else {
gSaveContext.save.playerForm = PLAYER_FORM_HUMAN;
Actor_Kill(&this->actor);
@@ -172,10 +173,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 +186,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 714913231..3c499aa7a 100644
--- a/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.c
+++ b/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.c
@@ -32,33 +32,38 @@ ActorInit Dm_Char03_InitVars = {
(ActorFunc)DmChar03_Draw,
};
-AnimationInfo sAnimationInfo[] = {
- { &gDekuMaskFallOverAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
+typedef enum {
+ /* 0 */ DMCHAR03_ANIM_FALL_OVER,
+ /* 1 */ DMCHAR03_ANIM_MAX
+} DmChar03Animation;
+
+AnimationInfo sAnimationInfo[DMCHAR03_ANIM_MAX] = {
+ { &gDekuMaskFallOverAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR03_ANIM_FALL_OVER
};
-void DmChar03_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animationInfo, u16 animIndex) {
- f32 frame;
+void DmChar03_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animInfo, u16 animIndex) {
+ f32 endFrame;
- animationInfo += animIndex;
+ animInfo += animIndex;
- if (animationInfo->frameCount < 0.0f) {
- frame = Animation_GetLastFrame(animationInfo->animation);
+ if (animInfo->frameCount < 0.0f) {
+ endFrame = Animation_GetLastFrame(animInfo->animation);
} else {
- frame = animationInfo->frameCount;
+ endFrame = animInfo->frameCount;
}
- Animation_Change(skelAnime, animationInfo->animation, animationInfo->playSpeed, animationInfo->startFrame, frame,
- animationInfo->mode, animationInfo->morphFrames);
+ Animation_Change(skelAnime, animInfo->animation, animInfo->playSpeed, animInfo->startFrame, endFrame,
+ animInfo->mode, animInfo->morphFrames);
}
void DmChar03_Init(Actor* thisx, PlayState* play) {
DmChar03* this = THIS;
- this->animIndex = 0;
+ this->animIndex = DMCHAR03_ANIM_FALL_OVER;
this->actor.targetArrowOffset = 3000.0f;
this->unk_18E = false;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &gDekuMaskSkel, NULL, NULL, NULL, 0);
- DmChar03_ChangeAnim(&this->skelAnime, sAnimationInfo, 0);
+ DmChar03_ChangeAnim(&this->skelAnime, &sAnimationInfo[DMCHAR03_ANIM_FALL_OVER], 0);
Actor_SetScale(&this->actor, 0.01f);
this->actionFunc = DmChar03_DoNothing;
}
@@ -67,7 +72,7 @@ void DmChar03_Destroy(Actor* thisx, PlayState* play) {
}
void func_80AAB5F8(DmChar03* this, PlayState* play) {
- s32 index = Object_GetIndex(&play->objectCtx, OBJECT_GI_NUTSMASK);
+ s32 index = Object_GetSlot(&play->objectCtx, OBJECT_GI_NUTSMASK);
if (index >= 0) {
this->objectIndex = index;
@@ -76,14 +81,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;
}
}
}
@@ -92,56 +97,60 @@ void DmChar03_DoNothing(DmChar03* this, PlayState* play) {
}
void func_80AAB710(DmChar03* this, PlayState* play) {
- u8 shouldChangeAnim = true;
+ u8 changeAnim = 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;
+ changeAnim = false;
break;
+
case 2:
- this->animIndex = 0;
+ this->animIndex = DMCHAR03_ANIM_FALL_OVER;
break;
+
case 3:
this->unk_18E = false;
- shouldChangeAnim = false;
+ changeAnim = false;
Actor_Kill(&this->actor);
break;
+
case 4:
Item_Give(play, ITEM_MASK_DEKU);
- shouldChangeAnim = false;
+ changeAnim = false;
this->actionFunc = func_80AAB5F8;
break;
+
default:
- shouldChangeAnim = false;
+ changeAnim = false;
break;
}
- if (shouldChangeAnim) {
+ if (changeAnim) {
DmChar03_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, index);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
}
void func_80AAB838(DmChar03* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, 5.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_MASK_BOUND_0);
- } else if ((Animation_OnFrame(&this->skelAnime, 10.0f)) || (Animation_OnFrame(&this->skelAnime, 18.0f)) ||
- (Animation_OnFrame(&this->skelAnime, 30.0f)) || (Animation_OnFrame(&this->skelAnime, 38.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_MASK_BOUND_1);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_MASK_BOUND_0);
+ } else if (Animation_OnFrame(&this->skelAnime, 10.0f) || Animation_OnFrame(&this->skelAnime, 18.0f) ||
+ Animation_OnFrame(&this->skelAnime, 30.0f) || Animation_OnFrame(&this->skelAnime, 38.0f)) {
+ Actor_PlaySfx(&this->actor, NA_SE_IT_MASK_BOUND_1);
}
}
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 +172,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..22a01491b 100644
--- a/src/overlays/actors/ovl_Dm_Char04/z_dm_char04.c
+++ b/src/overlays/actors/ovl_Dm_Char04/z_dm_char04.c
@@ -16,7 +16,7 @@ void DmChar04_Destroy(Actor* thisx, PlayState* play);
void DmChar04_Update(Actor* thisx, PlayState* play);
void DmChar04_Draw(Actor* thisx, PlayState* play);
-void func_80AABE34(DmChar04* this, PlayState* play);
+void DmChar04_HandleCutscene(DmChar04* this, PlayState* play);
ActorInit Dm_Char04_InitVars = {
ACTOR_DM_CHAR04,
@@ -30,31 +30,38 @@ ActorInit Dm_Char04_InitVars = {
(ActorFunc)DmChar04_Draw,
};
-void DmChar04_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animation, u16 animIndex) {
- f32 endFrame;
+typedef enum {
+ /* 0 */ DMCHAR04_ANIM_0,
+ /* 1 */ DMCHAR04_ANIM_1,
+ /* 2 */ DMCHAR04_ANIM_MAX
+} DmChar04Animation;
- animation += animIndex;
-
- if (animation->frameCount < 0.0f) {
- endFrame = Animation_GetLastFrame(animation->animation);
- } else {
- endFrame = animation->frameCount;
- }
- Animation_Change(skelAnime, animation->animation, animation->playSpeed, animation->startFrame, endFrame,
- animation->mode, animation->morphFrames);
-}
-
-static AnimationInfo sAnimationInfo[] = {
- { &gameplay_keep_Anim_02B2E8, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gameplay_keep_Anim_029140, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
+static AnimationInfo sAnimationInfo[DMCHAR04_ANIM_MAX] = {
+ { &gameplay_keep_Anim_02B2E8, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR04_ANIM_0
+ { &gameplay_keep_Anim_029140, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR04_ANIM_1
};
-Color_RGBAf sPrimColors[] = {
+void DmChar04_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animInfo, u16 animIndex) {
+ f32 endFrame;
+
+ animInfo += animIndex;
+
+ if (animInfo->frameCount < 0.0f) {
+ endFrame = Animation_GetLastFrame(animInfo->animation);
+ } else {
+ endFrame = animInfo->frameCount;
+ }
+
+ Animation_Change(skelAnime, animInfo->animation, animInfo->playSpeed, animInfo->startFrame, endFrame,
+ animInfo->mode, animInfo->morphFrames);
+}
+
+static Color_RGBAf sPrimColors[] = {
{ 250.0f, 255.0f, 230.0f, 255.0f },
{ 10.0f, 10.0f, 40.0f, 255.0f },
{ 255.0f, 235.0f, 220.0f, 255.0f },
};
-Color_RGBAf sEnvColors[] = {
+static Color_RGBAf sEnvColors[] = {
{ 220.0f, 160.0f, 80.0f, 255.0f },
{ 120.0f, 255.0f, 255.0f, 255.0f },
{ 255.0f, 235.0f, 220.0f, 255.0f },
@@ -66,40 +73,40 @@ 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,
- this->morphTable, 7);
+ this->morphTable, FAIRY_LIMB_MAX);
ActorShape_Init(&this->actor.shape, 0.0f, NULL, 15.0f);
- DmChar04_ChangeAnim(&this->skelAnime, sAnimationInfo, 0);
+ DmChar04_ChangeAnim(&this->skelAnime, &sAnimationInfo[DMCHAR04_ANIM_0], 0);
Actor_SetScale(&this->actor, 0.01f);
- this->actionFunc = func_80AABE34;
+ this->actionFunc = DmChar04_HandleCutscene;
}
void DmChar04_Destroy(Actor* thisx, PlayState* play) {
}
-void func_80AABE34(DmChar04* this, PlayState* play) {
- u16 params = this->actor.params + 0x71;
+void DmChar04_HandleCutscene(DmChar04* this, PlayState* play) {
+ 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) {
- this->animIndex = 0;
+ 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 = DMCHAR04_ANIM_0;
} else {
- this->animIndex = 0;
+ this->animIndex = DMCHAR04_ANIM_0;
}
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;
}
}
@@ -119,8 +126,8 @@ s32 DmChar04_OverrideLimbDraw(PlayState* play2, s32 limbIndex, Gfx** dList, Vec3
Vec3f sp1C;
DmChar04* this = THIS;
- if (limbIndex == 6) {
- sp28 = ((Math_SinS(this->timer << 0xC) * 0.1f) + 1.0f) * 0.012f * (this->actor.scale.x * (1.0f / 0.008f));
+ if (limbIndex == FAIRY_LIMB_6) {
+ sp28 = ((Math_SinS(this->timer * 0x1000) * 0.1f) + 1.0f) * 0.012f * (this->actor.scale.x * (1.0f / 0.008f));
Matrix_MultVec3f(&D_80AAC4F0, &sp1C);
Matrix_Translate(sp1C.x, sp1C.y, sp1C.z, MTXMODE_NEW);
Matrix_Scale(sp28, sp28, sp28, MTXMODE_APPLY);
@@ -136,7 +143,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;
@@ -152,5 +159,6 @@ void DmChar04_Draw(Actor* thisx, PlayState* play) {
gDPSetDither(POLY_XLU_DISP++, G_CD_BAYER);
POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
DmChar04_OverrideLimbDraw, NULL, &this->actor, POLY_XLU_DISP);
+
CLOSE_DISPS(play->state.gfxCtx);
}
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..52e196da9 100644
--- a/src/overlays/actors/ovl_Dm_Char04/z_dm_char04.h
+++ b/src/overlays/actors/ovl_Dm_Char04/z_dm_char04.h
@@ -2,6 +2,7 @@
#define Z_DM_CHAR04_H
#include "global.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
struct DmChar04;
@@ -10,12 +11,14 @@ typedef void (*DmChar04ActionFunc)(struct DmChar04*, PlayState*);
typedef struct DmChar04 {
/* 0x0000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[15];
- /* 0x1E2 */ Vec3s morphTable[15];
- /* 0x023C */ DmChar04ActionFunc actionFunc;
+ /* 0x188 */ Vec3s jointTable[FAIRY_LIMB_MAX];
+ /* 0x1B2 */ UNK_TYPE1 unk_1B2[0x30];
+ /* 0x1E2 */ Vec3s morphTable[FAIRY_LIMB_MAX];
+ /* 0x20C */ UNK_TYPE1 unk_20C[0x30];
+ /* 0x23C */ 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 7e368b9e3..f2f8980a0 100644
--- a/src/overlays/actors/ovl_Dm_Char05/z_dm_char05.c
+++ b/src/overlays/actors/ovl_Dm_Char05/z_dm_char05.c
@@ -47,27 +47,37 @@ ActorInit Dm_Char05_InitVars = {
(ActorFunc)DmChar05_Draw,
};
-static AnimationInfo sAnimationInfo[] = {
- { &object_dmask_Anim_001090, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &object_dmask_Anim_004288, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &object_dmask_Anim_0001A8, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &object_dmask_Anim_00017C, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &object_dmask_Anim_0011A0, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &object_dmask_Anim_0013A4, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
+typedef enum {
+ /* 0 */ DMCHAR05_ANIM_0,
+ /* 1 */ DMCHAR05_ANIM_1,
+ /* 2 */ DMCHAR05_ANIM_2,
+ /* 3 */ DMCHAR05_ANIM_3,
+ /* 4 */ DMCHAR05_ANIM_4,
+ /* 5 */ DMCHAR05_ANIM_5,
+ /* 6 */ DMCHAR05_ANIM_MAX
+} DmChar05Animation;
+
+static AnimationInfo sAnimationInfo[DMCHAR05_ANIM_MAX] = {
+ { &object_dmask_Anim_001090, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR05_ANIM_0
+ { &object_dmask_Anim_004288, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR05_ANIM_1
+ { &object_dmask_Anim_0001A8, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR05_ANIM_2
+ { &object_dmask_Anim_00017C, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR05_ANIM_3
+ { &object_dmask_Anim_0011A0, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR05_ANIM_4
+ { &object_dmask_Anim_0013A4, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR05_ANIM_5
};
-void func_80AAC5A0(SkelAnime* skelAnime, AnimationInfo* animation, u16 arg2) {
- f32 phi_f2;
+void DmChar05_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animInfo, u16 animIndex) {
+ f32 endFrame;
- animation += arg2;
+ animInfo += animIndex;
- if (animation->frameCount < 0.0f) {
- phi_f2 = Animation_GetLastFrame(animation->animation);
+ if (animInfo->frameCount < 0.0f) {
+ endFrame = Animation_GetLastFrame(animInfo->animation);
} else {
- phi_f2 = animation->frameCount;
+ endFrame = animInfo->frameCount;
}
- Animation_Change(skelAnime, animation->animation, animation->playSpeed, animation->startFrame, phi_f2,
- animation->mode, animation->morphFrames);
+ Animation_Change(skelAnime, animInfo->animation, animInfo->playSpeed, animInfo->startFrame, endFrame,
+ animInfo->mode, animInfo->morphFrames);
}
void func_80AAC63C(Actor* thisx, PlayState* play) {
@@ -76,9 +86,9 @@ void func_80AAC63C(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
SkelAnime_Init(play, &this->skelAnime, &object_dmask_Skel_010B0, NULL, NULL, NULL, 0);
if (DMCHAR05_GET(&this->actor) == DMCHAR05_0) {
- func_80AAC5A0(&this->skelAnime, &sAnimationInfo[0], 0);
+ DmChar05_ChangeAnim(&this->skelAnime, &sAnimationInfo[DMCHAR05_ANIM_0], 0);
} else {
- func_80AAC5A0(&this->skelAnime, &sAnimationInfo[1], 0);
+ DmChar05_ChangeAnim(&this->skelAnime, &sAnimationInfo[DMCHAR05_ANIM_1], 0);
}
this->actionFunc = func_80AACC48;
}
@@ -88,7 +98,7 @@ void func_80AAC6E4(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
SkelAnime_Init(play, &this->skelAnime, &object_dmask_Skel_042B0, NULL, NULL, NULL, 0);
- func_80AAC5A0(&this->skelAnime, &sAnimationInfo[1], 0);
+ DmChar05_ChangeAnim(&this->skelAnime, &sAnimationInfo[DMCHAR05_ANIM_1], 0);
this->actionFunc = func_80AACC48;
}
@@ -97,7 +107,7 @@ void func_80AAC770(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &object_dmask_Skel_001D0, NULL, NULL, NULL, 0);
- func_80AAC5A0(&this->skelAnime, &sAnimationInfo[3], 0);
+ DmChar05_ChangeAnim(&this->skelAnime, &sAnimationInfo[DMCHAR05_ANIM_3], 0);
this->actionFunc = func_80AACC48;
}
@@ -106,7 +116,7 @@ void func_80AAC7FC(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
SkelAnime_Init(play, &this->skelAnime, &object_dmask_Skel_013D0, NULL, NULL, NULL, 0);
- func_80AAC5A0(&this->skelAnime, &sAnimationInfo[4], 0);
+ DmChar05_ChangeAnim(&this->skelAnime, &sAnimationInfo[DMCHAR05_ANIM_4], 0);
this->actionFunc = func_80AACC48;
}
@@ -119,7 +129,7 @@ void func_80AAC888(Actor* thisx, PlayState* play) {
void DmChar05_Init(Actor* thisx, PlayState* play) {
DmChar05* this = THIS;
- this->unk_18C = 0;
+ this->animIndex = DMCHAR05_ANIM_0;
this->unk_18E = 0;
this->unk_19C = 0;
this->unk_1A0 = 0;
@@ -168,7 +178,7 @@ void DmChar05_Destroy(Actor* thisx, PlayState* play) {
}
void func_80AAC990(DmChar05* this, PlayState* play) {
- s32 objectIdx = Object_GetIndex(&play->objectCtx, OBJECT_GI_GOLONMASK);
+ s32 objectIdx = Object_GetSlot(&play->objectCtx, OBJECT_GI_GOLONMASK);
if (objectIdx >= 0) {
this->unk_18F = objectIdx;
@@ -177,20 +187,20 @@ 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;
}
}
}
void func_80AACA98(DmChar05* this, PlayState* play) {
- s32 objectIdx = Object_GetIndex(&play->objectCtx, OBJECT_GI_MASK13);
+ s32 objectIdx = Object_GetSlot(&play->objectCtx, OBJECT_GI_MASK13);
if (objectIdx >= 0) {
this->unk_18F = objectIdx;
@@ -199,17 +209,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;
}
@@ -222,7 +232,7 @@ void func_80AACBE4(DmChar05* this, PlayState* play) {
OBJECT_GI_MASK11, OBJECT_GI_MASK20, OBJECT_GI_RABIT_MASK, OBJECT_GI_MASK12,
};
s32 params = DMCHAR05_GET(&this->actor) - DMCHAR05_5;
- s32 objectIdx = Object_GetIndex(&play->objectCtx, D_80AAE2F0[params]);
+ s32 objectIdx = Object_GetSlot(&play->objectCtx, D_80AAE2F0[params]);
if (objectIdx >= 0) {
this->unk_18F = objectIdx;
@@ -268,7 +278,7 @@ void func_80AACD0C(DmChar05* this, PlayState* play) {
}
void func_80AACD1C(DmChar05* this, PlayState* play) {
- s32 objectIdx = Object_GetIndex(&play->objectCtx, OBJECT_GI_ZORAMASK);
+ s32 objectIdx = Object_GetSlot(&play->objectCtx, OBJECT_GI_ZORAMASK);
if (objectIdx >= 0) {
this->unk_18F = objectIdx;
@@ -277,18 +287,18 @@ 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;
}
}
void func_80AACE10(DmChar05* this, PlayState* play) {
- s32 objectIdx = Object_GetIndex(&play->objectCtx, OBJECT_GI_MASK15);
+ s32 objectIdx = Object_GetSlot(&play->objectCtx, OBJECT_GI_MASK15);
if (objectIdx >= 0) {
this->unk_18F = objectIdx;
@@ -297,29 +307,29 @@ 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;
+ u8 changeAnim = true;
+ 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;
+ changeAnim = false;
break;
case 2:
@@ -327,164 +337,164 @@ void func_80AACF04(DmChar05* this, PlayState* play) {
break;
case 3:
- this->unk_18C = 0;
+ this->animIndex = DMCHAR05_ANIM_0;
break;
case 4:
Item_Give(play, ITEM_MASK_GORON);
- sp2F = false;
+ changeAnim = false;
this->actionFunc = func_80AAC990;
break;
case 5:
- sp2F = false;
+ changeAnim = false;
Actor_Kill(&this->actor);
break;
default:
- sp2F = false;
+ changeAnim = false;
break;
}
- if (sp2F) {
- func_80AAC5A0(&this->skelAnime, &sAnimationInfo[this->unk_18C], 0);
+ if (changeAnim) {
+ DmChar05_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
}
- 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;
+ changeAnim = false;
break;
case 2:
- this->unk_18C = 1;
+ this->animIndex = DMCHAR05_ANIM_1;
this->unk_1B4 = 1;
break;
case 3:
- this->unk_18C = 1;
+ this->animIndex = DMCHAR05_ANIM_1;
break;
case 4:
Item_Give(play, ITEM_MASK_ZORA);
- sp2F = false;
+ changeAnim = false;
this->actionFunc = func_80AACD1C;
break;
case 5:
- sp2F = false;
+ changeAnim = false;
Actor_Kill(&this->actor);
break;
default:
- sp2F = false;
+ changeAnim = false;
break;
}
- if (sp2F) {
- func_80AAC5A0(&this->skelAnime, &sAnimationInfo[this->unk_18C], 0);
+ if (changeAnim) {
+ DmChar05_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
}
- 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;
+ changeAnim = false;
break;
case 2:
- this->unk_18C = 3;
+ this->animIndex = DMCHAR05_ANIM_3;
break;
case 3:
- this->unk_18C = 2;
+ this->animIndex = DMCHAR05_ANIM_2;
break;
case 4:
Item_Give(play, ITEM_MASK_GIBDO);
- sp2F = false;
+ changeAnim = false;
this->actionFunc = func_80AACE10;
break;
case 5:
- sp2F = false;
+ changeAnim = false;
Actor_Kill(&this->actor);
break;
default:
- sp2F = false;
+ changeAnim = false;
break;
}
- if (sp2F) {
- func_80AAC5A0(&this->skelAnime, &sAnimationInfo[this->unk_18C], 0);
+ if (changeAnim) {
+ DmChar05_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
}
- 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;
+ changeAnim = false;
break;
case 1:
- sp2F = false;
+ changeAnim = false;
break;
case 2:
- this->unk_18C = 4;
+ this->animIndex = DMCHAR05_ANIM_4;
break;
case 3:
- this->unk_18C = 5;
+ this->animIndex = DMCHAR05_ANIM_5;
break;
case 4:
- this->unk_18C = 5;
+ this->animIndex = DMCHAR05_ANIM_5;
break;
}
- if (sp2F) {
- func_80AAC5A0(&this->skelAnime, &sAnimationInfo[this->unk_18C], 0);
+ if (changeAnim) {
+ DmChar05_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
}
- 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);
}
}
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- if (this->unk_18C == 4) {
- this->unk_18C++;
- func_80AAC5A0(&this->skelAnime, &sAnimationInfo[this->unk_18C], 0);
+ if (this->animIndex == DMCHAR05_ANIM_4) {
+ this->animIndex++;
+ DmChar05_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
}
break;
@@ -492,73 +502,73 @@ void func_80AACF04(DmChar05* this, PlayState* play) {
}
void func_80AAD3F8(DmChar05* this, PlayState* play) {
- if (play->csCtx.frames == 490) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EVIL_POWER);
+ if (play->csCtx.curFrame == 490) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EVIL_POWER);
}
- if (play->csCtx.frames > 550) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_MASK_FLOAT - SFX_FLAG);
+ 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) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EVIL_POWER);
+ if (play->csCtx.curFrame == 262) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EVIL_POWER);
}
- if (play->csCtx.frames > 318) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_MASK_FLOAT - SFX_FLAG);
+ 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_PlaySfxAtPos(&this->actor, NA_SE_IT_MASK_BOUND_0);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_MASK_BOUND_0);
} else if (Animation_OnFrame(&this->skelAnime, 19.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_MASK_BOUND_1);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_MASK_BOUND_1);
}
}
} 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_PlaySfxAtPos(&this->actor, NA_SE_IT_MASK_BOUND_SAND);
+ 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_PlaySfxAtPos(&this->actor, NA_SE_IT_MASK_BOUND_0);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_MASK_BOUND_0);
}
if (Animation_OnFrame(&this->skelAnime, 14.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_MASK_BOUND_1);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_MASK_BOUND_1);
}
if (Animation_OnFrame(&this->skelAnime, 18.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_MASK_BOUND_1);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_MASK_BOUND_1);
}
}
} 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)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EVIL_POWER);
+ 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)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EVIL_POWER_PREDEMO);
+ } else if ((gSaveContext.sceneLayer == 0xB) && (play->csCtx.curFrame == 115)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EVIL_POWER_PREDEMO);
}
}
}
@@ -568,25 +578,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 +617,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 +638,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 +653,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 +667,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..62500ec9c 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,14 +22,14 @@ enum {
/* 9 */ DMCHAR05_9,
/* 10 */ DMCHAR05_10,
/* 11 */ DMCHAR05_11,
- /* 12 */ DMCHAR05_12,
-};
+ /* 12 */ DMCHAR05_12
+} DmChar05Param;
typedef struct DmChar05 {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ DmChar05ActionFunc actionFunc;
- /* 0x18C */ s16 unk_18C;
+ /* 0x18C */ s16 animIndex;
/* 0x18E */ u8 unk_18E;
/* 0x18F */ u8 unk_18F;
/* 0x190 */ Vec3f unk_190;
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..52d3c316d 100644
--- a/src/overlays/actors/ovl_Dm_Char06/z_dm_char06.c
+++ b/src/overlays/actors/ovl_Dm_Char06/z_dm_char06.c
@@ -16,7 +16,7 @@ void DmChar06_Update(Actor* thisx, PlayState* play);
void DmChar06_Draw(Actor* thisx, PlayState* play);
void DmChar06_SetupAction(DmChar06* this, DmChar06ActionFunc actionFunc);
-void func_80AAE6F0(DmChar06* this, PlayState* play);
+void DmChar06_HandleCutscene(DmChar06* this, PlayState* play);
ActorInit Dm_Char06_InitVars = {
ACTOR_DM_CHAR06,
@@ -37,27 +37,27 @@ 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);
+ DmChar06_SetupAction(this, DmChar06_HandleCutscene);
}
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);
+void DmChar06_HandleCutscene(DmChar06* this, PlayState* play) {
+ 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..2ad9f0c9b 100644
--- a/src/overlays/actors/ovl_Dm_Char07/z_dm_char07.c
+++ b/src/overlays/actors/ovl_Dm_Char07/z_dm_char07.c
@@ -75,12 +75,13 @@ 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:
gSPDisplayList(POLY_OPA_DISP++, object_milkbar_DL_002CD0);
break;
+
case DMCHAR07_CREDITS_STAGE:
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_milkbar_Matanimheader_0105F8));
gSPDisplayList(POLY_OPA_DISP++, object_milkbar_DL_007918);
@@ -90,6 +91,7 @@ void DmChar07_Draw(Actor* thisx, PlayState* play) {
gSPDisplayList(POLY_OPA_DISP++, object_milkbar_DL_001210);
gSPDisplayList(POLY_OPA_DISP++, object_milkbar_DL_0016B8);
break;
+
case DMCHAR07_SPOTLIGHTS:
if (this->spotlightFlags & DMCHAR07_STAGE_RIGHT_SPOTLIGHT) {
gSPDisplayList(POLY_OPA_DISP++, object_milkbar_DL_000240);
@@ -107,17 +109,23 @@ void DmChar07_Draw(Actor* thisx, PlayState* play) {
gSPDisplayList(POLY_OPA_DISP++, object_milkbar_DL_0016B8);
}
break;
+
case DMCHAR07_DISHES:
gSPDisplayList(POLY_OPA_DISP++, object_milkbar_DL_010D68);
break;
+
+ default:
+ 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:
gSPDisplayList(POLY_XLU_DISP++, object_milkbar_DL_002BA0);
break;
+
case DMCHAR07_CREDITS_STAGE:
gSPDisplayList(POLY_XLU_DISP++, object_milkbar_DL_0076A0);
gSPDisplayList(POLY_XLU_DISP++, object_milkbar_DL_000100);
@@ -126,6 +134,7 @@ void DmChar07_Draw(Actor* thisx, PlayState* play) {
gSPDisplayList(POLY_XLU_DISP++, object_milkbar_DL_0010D0);
gSPDisplayList(POLY_XLU_DISP++, object_milkbar_DL_0015E0);
break;
+
case DMCHAR07_SPOTLIGHTS:
if (this->spotlightFlags & DMCHAR07_STAGE_RIGHT_SPOTLIGHT) {
gSPDisplayList(POLY_OPA_DISP++, object_milkbar_DL_000100);
@@ -143,8 +152,12 @@ void DmChar07_Draw(Actor* thisx, PlayState* play) {
gSPDisplayList(POLY_OPA_DISP++, object_milkbar_DL_0015E0);
}
break;
+
case DMCHAR07_DISHES:
break;
+
+ default:
+ break;
}
CLOSE_DISPS(play->state.gfxCtx);
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 4129adfbe..250abea20 100644
--- a/src/overlays/actors/ovl_Dm_Char08/z_dm_char08.c
+++ b/src/overlays/actors/ovl_Dm_Char08/z_dm_char08.c
@@ -26,11 +26,6 @@ void DmChar08_SetupAppearCs(DmChar08* this, PlayState* play);
void func_80AAF884(DmChar08* this, PlayState* play);
void func_80AAFB04(DmChar08* this, PlayState* play);
void func_80AAFB94(DmChar08* this, PlayState* play);
-void func_80AAFE88(DmChar08* this, PlayState* play);
-void func_80AB023C(DmChar08* this, PlayState* play);
-void func_80AB01E8(DmChar08* this, PlayState* play);
-void DmChar08_SpawnBubbles(DmChar08* this, PlayState* play);
-void func_80AAFCCC(DmChar08* this, PlayState* play);
typedef enum {
/* 0 */ TURTLE_EYEMODE_BLINK_LEFT,
@@ -38,18 +33,8 @@ typedef enum {
/* 2 */ TURTLE_EYEMODE_CLOSED,
/* 3 */ TURTLE_EYEMODE_LOOK_STRAIGHT,
/* 4 */ TURTLE_EYEMODE_UNUSED,
- /* 5 */ TURTLE_EYEMODE_LOOK_RIGHT,
-} EyeMode;
-
-typedef enum {
- /* 0 */ TURTLE_ANIM_IDLE,
- /* 1 */ TURTLE_ANIM_SWIM,
- /* 2 */ TURTLE_ANIM_FLOAT,
- /* 3 */ TURTLE_ANIM_SPEAK1,
- /* 4 */ TURTLE_ANIM_COUGH,
- /* 5 */ TURTLE_ANIM_SPEAK2,
- /* 6 */ TURTLE_ANIM_YAWN,
-} TurtleAnimation;
+ /* 5 */ TURTLE_EYEMODE_LOOK_RIGHT
+} TurtleEyeMode;
ActorInit Dm_Char08_InitVars = {
ACTOR_DM_CHAR08,
@@ -65,14 +50,26 @@ ActorInit Dm_Char08_InitVars = {
#include "overlays/ovl_Dm_Char08/ovl_Dm_Char08.c"
-static AnimationInfo sAnimationInfo[] = {
- { &gTurtleIdleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f },
- { &gTurtleSwimAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f },
- { &gTurtleFloatAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f },
- { &gTurtleSpeak1Anim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f },
- { &gTurtleCoughAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f },
- { &gTurtleSpeak2Anim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f },
- { &gTurtleYawnAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f },
+typedef enum {
+ /* 0 */ TURTLE_ANIM_IDLE,
+ /* 1 */ TURTLE_ANIM_SWIM,
+ /* 2 */ TURTLE_ANIM_FLOAT,
+ /* 3 */ TURTLE_ANIM_SPEAK1,
+ /* 4 */ TURTLE_ANIM_COUGH,
+ /* 5 */ TURTLE_ANIM_SPEAK2,
+ /* 6 */ TURTLE_ANIM_YAWN,
+ /* 7 */ TURTLE_ANIM_MAX,
+ /* 99 */ TURTLE_ANIM_NONE = 99
+} TurtleAnimation;
+
+static AnimationInfo sAnimationInfo[TURTLE_ANIM_MAX] = {
+ { &gTurtleIdleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f }, // TURTLE_ANIM_IDLE
+ { &gTurtleSwimAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f }, // TURTLE_ANIM_SWIM
+ { &gTurtleFloatAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f }, // TURTLE_ANIM_FLOAT
+ { &gTurtleSpeak1Anim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f }, // TURTLE_ANIM_SPEAK1
+ { &gTurtleCoughAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f }, // TURTLE_ANIM_COUGH
+ { &gTurtleSpeak2Anim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f }, // TURTLE_ANIM_SPEAK2
+ { &gTurtleYawnAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f }, // TURTLE_ANIM_YAWN
};
static InitChainEntry sInitChain[] = {
@@ -130,24 +127,26 @@ void DmChar08_UpdateEyes(DmChar08* this) {
}
}
-void DmChar08_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animationInfo, u16 animIndex) {
+void DmChar08_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animInfo, u16 animIndex) {
f32 endFrame;
- animationInfo += animIndex;
- if (animationInfo->frameCount < 0.0f) {
- endFrame = Animation_GetLastFrame(animationInfo->animation);
+ animInfo += animIndex;
+
+ if (animInfo->frameCount < 0.0f) {
+ endFrame = Animation_GetLastFrame(animInfo->animation);
} else {
- endFrame = animationInfo->frameCount;
+ endFrame = animInfo->frameCount;
}
- Animation_Change(skelAnime, animationInfo->animation, animationInfo->playSpeed, animationInfo->startFrame, endFrame,
- animationInfo->mode, animationInfo->morphFrames);
+
+ Animation_Change(skelAnime, animInfo->animation, animInfo->playSpeed, animInfo->startFrame, endFrame,
+ animInfo->mode, animInfo->morphFrames);
}
void DmChar08_Init(Actor* thisx, PlayState* play2) {
PlayState* play = play2;
DmChar08* this = THIS;
- thisx->targetMode = 5;
+ thisx->targetMode = TARGET_MODE_5;
this->eyeMode = TURTLE_EYEMODE_CLOSED;
thisx->targetArrowOffset = 120.0f;
ActorShape_Init(&thisx->shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
@@ -165,15 +164,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;
}
@@ -198,11 +197,11 @@ void DmChar08_Init(Actor* thisx, PlayState* play2) {
this->unk_1F0 = 1.0f;
this->unk_1FF = 2;
this->animIndex = TURTLE_ANIM_FLOAT;
- this->unk_203 = 0x63;
+ this->prevAnimIndex = TURTLE_ANIM_NONE;
this->eyeMode = TURTLE_EYEMODE_BLINK_STRAIGHT;
this->unk_207 = 0;
this->unk_208 = 0;
- thisx->flags |= ACTOR_FLAG_1;
+ thisx->flags |= ACTOR_FLAG_TARGETABLE;
if (gSaveContext.save.entrance == ENTRANCE(ZORA_CAPE, 8)) {
this->eyeMode = TURTLE_EYEMODE_BLINK_LEFT;
this->actionFunc = func_80AAFAC4;
@@ -217,11 +216,11 @@ void DmChar08_Init(Actor* thisx, PlayState* play2) {
case SCENE_SEA:
this->unk_1FF = 2;
this->animIndex = TURTLE_ANIM_FLOAT;
- this->unk_203 = 0x63;
+ this->prevAnimIndex = TURTLE_ANIM_NONE;
this->eyeMode = TURTLE_EYEMODE_BLINK_LEFT;
this->unk_207 = 0;
this->unk_208 = 0;
- thisx->flags |= ACTOR_FLAG_1;
+ thisx->flags |= ACTOR_FLAG_TARGETABLE;
this->actionFunc = func_80AAFAE4;
this->unk_1F0 = 1.0f;
break;
@@ -229,13 +228,16 @@ void DmChar08_Init(Actor* thisx, PlayState* play2) {
case SCENE_KONPEKI_ENT:
this->unk_1FF = 2;
this->animIndex = TURTLE_ANIM_FLOAT;
- this->unk_203 = 0x63;
+ this->prevAnimIndex = TURTLE_ANIM_NONE;
this->eyeMode = TURTLE_EYEMODE_BLINK_LEFT;
this->unk_207 = 0;
this->unk_208 = 0;
this->actionFunc = DmChar08_DoNothing;
this->unk_1F0 = 1.0f;
break;
+
+ default:
+ break;
}
DmChar08_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
@@ -258,13 +260,13 @@ void DmChar08_WaitForSong(DmChar08* this, PlayState* play) {
((player2->actor.world.pos.x > -5780.0f) && (player2->actor.world.pos.x < -5385.0f) &&
(player2->actor.world.pos.z > 1120.0f) && (player2->actor.world.pos.z < 2100.0f))) {
if (!sSuccessSoundAlreadyPlayed) {
- play_sound(NA_SE_SY_TRE_BOX_APPEAR);
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
sSuccessSoundAlreadyPlayed = true;
}
} else {
sSuccessSoundAlreadyPlayed = false;
}
- if ((player->transformation == PLAYER_FORM_ZORA) && (play->msgCtx.ocarinaMode == 3) &&
+ if ((player->transformation == PLAYER_FORM_ZORA) && (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) &&
(play->msgCtx.lastPlayedSong == OCARINA_SONG_NEW_WAVE)) {
if ((player2->actor.world.pos.x > -5780.0f) && (player2->actor.world.pos.x < -5385.0f)) {
if ((player2->actor.world.pos.z > 1120.0f) && (player2->actor.world.pos.z < 2100.0f)) {
@@ -275,30 +277,30 @@ 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->dyna.actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actionFunc = func_80AAF8F4;
}
}
@@ -321,33 +323,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 +392,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;
@@ -408,6 +410,9 @@ void func_80AAFCCC(DmChar08* this, PlayState* play) {
this->unk_206 = 0;
}
break;
+
+ default:
+ break;
}
} else {
switch (this->unk_206) {
@@ -422,10 +427,13 @@ void func_80AAFCCC(DmChar08* this, PlayState* play) {
case 2:
if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->unk_206 = 0;
}
break;
+
+ default:
+ break;
}
}
return;
@@ -446,24 +454,30 @@ void func_80AAFCCC(DmChar08* this, PlayState* play) {
this->unk_206 = 0;
}
break;
+
+ default:
+ break;
}
break;
+
+ default:
+ break;
}
}
void DmChar08_DoNothing(DmChar08* this, PlayState* play) {
}
-void func_80AAFE88(DmChar08* this, PlayState* play) {
- s32 actorActionIndex;
- CsCmdActorAction* csAction;
+void DmChar08_HandleCutscene(DmChar08* this, PlayState* play) {
+ 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;
@@ -509,17 +523,20 @@ void func_80AAFE88(DmChar08* this, PlayState* play) {
break;
case 14:
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_BIG_TORTOISE_ROLL);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_BIG_TORTOISE_ROLL);
this->animIndex = TURTLE_ANIM_FLOAT;
break;
+
+ default:
+ 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,36 +546,36 @@ 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;
}
}
-void func_80AB01E8(DmChar08* this, PlayState* play) {
- if (this->animIndex != this->unk_203) {
- this->unk_203 = this->animIndex;
+void DmChar08_UpdateAnim(DmChar08* this, PlayState* play) {
+ if (this->animIndex != this->prevAnimIndex) {
+ this->prevAnimIndex = this->animIndex;
DmChar08_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
}
@@ -619,6 +636,9 @@ void func_80AB023C(DmChar08* this, PlayState* play) {
case 0x1030: // Return to sleep
this->unk_207 = 4;
break;
+
+ default:
+ break;
}
}
}
@@ -641,6 +661,9 @@ void func_80AB032C(DmChar08* this, PlayState* play) {
this->unk_208 = 0;
}
break;
+
+ default:
+ break;
}
break;
@@ -668,6 +691,9 @@ void func_80AB032C(DmChar08* this, PlayState* play) {
this->unk_208 = 0;
}
break;
+
+ default:
+ break;
}
break;
@@ -723,6 +749,9 @@ void func_80AB032C(DmChar08* this, PlayState* play) {
this->unk_208 = 0;
}
break;
+
+ default:
+ break;
}
break;
@@ -757,6 +786,9 @@ void func_80AB032C(DmChar08* this, PlayState* play) {
this->unk_208 = 0;
}
break;
+
+ default:
+ break;
}
break;
@@ -782,6 +814,9 @@ void func_80AB032C(DmChar08* this, PlayState* play) {
this->unk_208 = 0;
}
break;
+
+ default:
+ break;
}
break;
@@ -809,6 +844,9 @@ void func_80AB032C(DmChar08* this, PlayState* play) {
this->unk_208 = 0;
}
break;
+
+ default:
+ break;
}
break;
@@ -856,8 +894,12 @@ void func_80AB032C(DmChar08* this, PlayState* play) {
this->unk_208 = 0;
}
break;
+
+ default:
+ break;
}
break;
+
case 10:
switch (this->unk_208) {
case 0:
@@ -865,6 +907,7 @@ void func_80AB032C(DmChar08* this, PlayState* play) {
this->eyeMode = TURTLE_EYEMODE_BLINK_LEFT;
this->unk_208++;
break;
+
case 1:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
this->animIndex = TURTLE_ANIM_SPEAK2;
@@ -872,6 +915,7 @@ void func_80AB032C(DmChar08* this, PlayState* play) {
this->unk_208++;
}
break;
+
case 2:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
this->animIndex = TURTLE_ANIM_SPEAK1;
@@ -879,6 +923,7 @@ void func_80AB032C(DmChar08* this, PlayState* play) {
this->unk_208++;
}
break;
+
case 3:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
this->animIndex = TURTLE_ANIM_FLOAT;
@@ -887,20 +932,26 @@ void func_80AB032C(DmChar08* this, PlayState* play) {
this->unk_208 = 0;
}
break;
+
+ default:
+ break;
}
break;
+
+ default:
+ break;
}
}
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)) {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_EARTHQUAKE_LAST2 - SFX_FLAG);
+ 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);
}
}
if ((this->animIndex == TURTLE_ANIM_SWIM) && Animation_OnFrame(&this->skelAnime, 16.0f)) {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_BIG_TORTOISE_SWIM);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_BIG_TORTOISE_SWIM);
}
}
@@ -960,7 +1011,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) {
@@ -979,30 +1030,30 @@ void DmChar08_Update(Actor* thisx, PlayState* play) {
DmChar08_UpdateEyes(this);
this->actionFunc(this, play);
- func_80AAFE88(this, play);
+ DmChar08_HandleCutscene(this, play);
func_80AB023C(this, play);
func_80AB032C(this, play);
- func_80AB01E8(this, play);
+ DmChar08_UpdateAnim(this, play);
SkelAnime_Update(&this->skelAnime);
DmChar08_SpawnBubbles(this, 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) {
func_80AAFCCC(this, play);
- func_800B8614(&this->dyna.actor, play, 400.0f);
+ Actor_OfferTalk(&this->dyna.actor, play, 400.0f);
}
func_80AB096C(this, play);
DmChar08_UpdateCollision(this, 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;
}
@@ -1079,6 +1130,9 @@ void DmChar08_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
Matrix_Scale((this->unk_1F0 * 0.55f) + 0.45f, (this->unk_1F0 * 0.2f) + 0.8f,
(this->unk_1F0 * 0.55f) + 0.45f, MTXMODE_APPLY);
break;
+
+ default:
+ break;
}
}
@@ -1093,11 +1147,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 +1168,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..22d23da90 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;
@@ -31,7 +31,7 @@ typedef struct DmChar08 {
/* 0x200 */ u8 eyeMode;
/* 0x201 */ u8 eyeIndex;
/* 0x202 */ u8 animIndex;
- /* 0x203 */ u8 unk_203;
+ /* 0x203 */ u8 prevAnimIndex;
/* 0x204 */ UNK_TYPE1 unk_204;
/* 0x205 */ u8 alpha;
/* 0x206 */ u8 unk_206;
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 654bc6c07..24362cd99 100644
--- a/src/overlays/actors/ovl_Dm_Char09/z_dm_char09.c
+++ b/src/overlays/actors/ovl_Dm_Char09/z_dm_char09.c
@@ -16,7 +16,7 @@ void DmChar09_Update(Actor* thisx, PlayState* play);
void DmChar09_Draw(Actor* thisx, PlayState* play);
void DmChar09_DoNothing(DmChar09* this, PlayState* play);
-void func_80AB2268(DmChar09* this, PlayState* play);
+void DmChar09_HandleCutscene(DmChar09* this, PlayState* play);
ActorInit Dm_Char09_InitVars = {
ACTOR_DM_CHAR09,
@@ -30,23 +30,28 @@ ActorInit Dm_Char09_InitVars = {
(ActorFunc)DmChar09_Draw,
};
-static AnimationInfo sAnimationInfo[] = {
- { &gBeeFlyingAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
+typedef enum {
+ /* 0 */ DMCHAR09_ANIM_FLYING,
+ /* 1 */ DMCHAR09_ANIM_MAX
+} DmChar09Animation;
+
+static AnimationInfo sAnimationInfo[DMCHAR09_ANIM_MAX] = {
+ { &gBeeFlyingAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR09_ANIM_FLYING
};
-void DmChar09_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animationInfo, u16 animIndex) {
- f32 frameCount;
+void DmChar09_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animInfo, u16 animIndex) {
+ f32 endFrame;
- animationInfo += animIndex;
+ animInfo += animIndex;
- if (animationInfo->frameCount < 0.0f) {
- frameCount = Animation_GetLastFrame(animationInfo->animation);
+ if (animInfo->frameCount < 0.0f) {
+ endFrame = Animation_GetLastFrame(animInfo->animation);
} else {
- frameCount = animationInfo->frameCount;
+ endFrame = animInfo->frameCount;
}
- Animation_Change(skelAnime, animationInfo->animation, animationInfo->playSpeed, animationInfo->startFrame,
- frameCount, animationInfo->mode, animationInfo->morphFrames);
+ Animation_Change(skelAnime, animInfo->animation, animInfo->playSpeed, animInfo->startFrame, endFrame,
+ animInfo->mode, animInfo->morphFrames);
}
void DmChar09_Init(Actor* thisx, PlayState* play) {
@@ -55,7 +60,7 @@ void DmChar09_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 19.0f);
SkelAnime_Init(play, &this->skelAnime, &gBeeSkel, &gBeeFlyingAnim, this->jointTable, this->morphTable,
OBJECT_BEE_LIMB_MAX);
- DmChar09_ChangeAnim(&this->skelAnime, sAnimationInfo, 0);
+ DmChar09_ChangeAnim(&this->skelAnime, &sAnimationInfo[DMCHAR09_ANIM_FLYING], 0);
Actor_SetScale(&this->actor, 0.01f);
this->unk_228 = Rand_ZeroOne() * 65535.0f;
this->unk_22A = Rand_ZeroOne() * 65535.0f;
@@ -90,15 +95,15 @@ void func_80AB1FDC(DmChar09* this, PlayState* play) {
phi_fv0 = this->speed;
phi_fa0 = this->speed * 0.16f;
}
- Math_StepToF(&thisx->speedXZ, phi_fv0, phi_fa0);
- if ((thisx->speedXZ + 0.05f) < sp54) {
- Math_Vec3f_Scale(&thisx->velocity, thisx->speedXZ / sp54);
+ Math_StepToF(&thisx->speed, phi_fv0, phi_fa0);
+ if ((thisx->speed + 0.05f) < sp54) {
+ Math_Vec3f_Scale(&thisx->velocity, thisx->speed / sp54);
thisx->world.pos.x += thisx->velocity.x;
thisx->world.pos.y += thisx->velocity.y;
thisx->world.pos.z += thisx->velocity.z;
} else {
this->unk_21C += this->unk_220;
- thisx->speedXZ *= 0.4f;
+ thisx->speed *= 0.4f;
phi_a1 = true;
if (((this->unk_21C >= this->unk_218) && (this->unk_220 > 0)) ||
((this->unk_21C <= 0) && (this->unk_220 < 0))) {
@@ -109,7 +114,7 @@ void func_80AB1FDC(DmChar09* this, PlayState* play) {
this->unk_220 = 1;
} else {
phi_a1 = false;
- this->actionFunc = func_80AB2268;
+ this->actionFunc = DmChar09_HandleCutscene;
}
}
if (phi_a1) {
@@ -123,49 +128,55 @@ void func_80AB1FDC(DmChar09* this, PlayState* play) {
void DmChar09_DoNothing(DmChar09* this, PlayState* play) {
}
-void func_80AB2268(DmChar09* this, PlayState* play) {
+void DmChar09_HandleCutscene(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;
+
case 3:
max = 1;
break;
+
case 4:
max = 2;
break;
+
case 5:
max = 3;
break;
+
+ default:
+ 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 +186,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 +194,7 @@ void func_80AB2268(DmChar09* this, PlayState* play) {
}
}
} else {
- this->unk_22F = 0x63;
+ this->cueId = 99;
}
}
@@ -200,10 +211,10 @@ void DmChar09_Update(Actor* thisx, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
this->actionFunc(this, play);
- func_80AB2268(this, play);
+ DmChar09_HandleCutscene(this, play);
func_80AB24BC(this, play);
- if ((play->csCtx.state != 0) && this->unk_22E && DMCHAR09_GET_100(thisx)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_POSTMAN_WALK + SFX_FLAG);
+ 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 +228,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..ec5a83095 100644
--- a/src/overlays/actors/ovl_Dm_Gm/z_dm_gm.c
+++ b/src/overlays/actors/ovl_Dm_Gm/z_dm_gm.c
@@ -8,7 +8,7 @@
#include "objects/object_an4/object_an4.h"
#include "objects/object_msmo/object_msmo.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((DmGm*)thisx)
@@ -17,8 +17,8 @@ void DmGm_Destroy(Actor* thisx, PlayState* play);
void DmGm_Update(Actor* thisx, PlayState* play);
void func_80C248A8(DmGm* this, PlayState* play);
-void func_80C24A00(DmGm* this, PlayState* play);
-void func_80C24BD0(DmGm* this, PlayState* play);
+void DmGm_HandleCutscene(DmGm* this, PlayState* play);
+void DmGm_DoNothing(DmGm* this, PlayState* play);
void func_80C25000(Actor* thisx, PlayState* play);
ActorInit Dm_Gm_InitVars = {
@@ -33,60 +33,81 @@ ActorInit Dm_Gm_InitVars = {
(ActorFunc)NULL,
};
-static AnimationInfoS sAnimationInfo[] = {
- { &object_an1_Anim_007E08, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_an1_Anim_0071E8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_an4_Anim_006CC0, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_an1_Anim_013E1C, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_an4_Anim_007E3C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_an4_Anim_0088C0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_an4_Anim_0013C8, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_an4_Anim_002550, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_an4_Anim_00353C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_an4_Anim_004498, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_an4_Anim_0060B4, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_an4_Anim_00041C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_an4_Anim_004A78, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_an4_Anim_00506C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+typedef enum {
+ /* -1 */ DMGM_ANIM_NONE = -1,
+ /* 0x0 */ DMGM_ANIM_0,
+ /* 0x1 */ DMGM_ANIM_1,
+ /* 0x2 */ DMGM_ANIM_2,
+ /* 0x3 */ DMGM_ANIM_3,
+ /* 0x4 */ DMGM_ANIM_4,
+ /* 0x5 */ DMGM_ANIM_5,
+ /* 0x6 */ DMGM_ANIM_6,
+ /* 0x7 */ DMGM_ANIM_7,
+ /* 0x8 */ DMGM_ANIM_8,
+ /* 0x9 */ DMGM_ANIM_9,
+ /* 0xA */ DMGM_ANIM_10,
+ /* 0xB */ DMGM_ANIM_11,
+ /* 0xC */ DMGM_ANIM_12,
+ /* 0xD */ DMGM_ANIM_13,
+ /* 0xE */ DMGM_ANIM_MAX
+} DmGmAnimation;
+
+static AnimationInfoS sAnimationInfo[DMGM_ANIM_MAX] = {
+ { &object_an1_Anim_007E08, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMGM_ANIM_0
+ { &object_an1_Anim_0071E8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMGM_ANIM_1
+ { &object_an4_Anim_006CC0, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // DMGM_ANIM_2
+ { &object_an1_Anim_013E1C, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // DMGM_ANIM_3
+ { &object_an4_Anim_007E3C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DMGM_ANIM_4
+ { &object_an4_Anim_0088C0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMGM_ANIM_5
+ { &object_an4_Anim_0013C8, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DMGM_ANIM_6
+ { &object_an4_Anim_002550, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMGM_ANIM_7
+ { &object_an4_Anim_00353C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DMGM_ANIM_8
+ { &object_an4_Anim_004498, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMGM_ANIM_9
+ { &object_an4_Anim_0060B4, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DMGM_ANIM_10
+ { &object_an4_Anim_00041C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DMGM_ANIM_11
+ { &object_an4_Anim_004A78, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DMGM_ANIM_12
+ { &object_an4_Anim_00506C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMGM_ANIM_13
};
-s32 func_80C24360(DmGm* this, PlayState* play) {
+s32 DmGm_UpdateSkelAnime(DmGm* this, PlayState* play) {
s8 objectIndex = this->actor.objBankIndex;
s8 objectIndex2;
- s32 ret = false;
+ s32 isAnimFinished = false;
- if (this->unk_2C8 < 2) {
+ if (this->animIndex <= DMGM_ANIM_1) {
objectIndex2 = this->actor.objBankIndex;
} else {
objectIndex2 = this->unk_2AC;
}
if (objectIndex2 >= 0) {
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex2].segment);
- ret = SkelAnime_Update(&this->skelAnime);
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objectIndex2].segment);
+ isAnimFinished = SkelAnime_Update(&this->skelAnime);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objectIndex].segment);
}
- return ret;
+
+ return isAnimFinished;
}
-s32 func_80C24428(DmGm* this, PlayState* play, s32 arg2) {
+s32 DmGm_ChangeAnim(DmGm* this, PlayState* play, s32 animIndex) {
s8 objectIndex = this->actor.objBankIndex;
s8 objectIndex2;
- s32 ret = false;
+ s32 didAnimChange = false;
- if (arg2 < 2) {
+ if (animIndex <= DMGM_ANIM_1) {
objectIndex2 = this->actor.objBankIndex;
} else {
objectIndex2 = this->unk_2AC;
}
- if ((objectIndex2 >= 0) && (arg2 != this->unk_2C8)) {
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex2].segment);
- this->unk_2C8 = arg2;
- ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, arg2);
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex].segment);
+ if ((objectIndex2 >= 0) && (this->animIndex != animIndex)) {
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objectIndex2].segment);
+ this->animIndex = animIndex;
+ didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objectIndex].segment);
}
- return ret;
+
+ return didAnimChange;
}
void func_80C24504(DmGm* this) {
@@ -116,7 +137,7 @@ s32 func_80C2457C(DmGm* this, PlayState* play) {
this->unk_2C4 = CLAMP(this->unk_2C4, -0x1C70, 0x1C70);
if (this->unk_2B4->id == ACTOR_PLAYER) {
- sp40.y = ((Player*)this->unk_2B4)->bodyPartsPos[7].y + 3.0f;
+ sp40.y = ((Player*)this->unk_2B4)->bodyPartsPos[PLAYER_BODYPART_HEAD].y + 3.0f;
} else {
Math_Vec3f_Copy(&sp40, &this->unk_2B4->focus.pos);
}
@@ -160,7 +181,7 @@ Actor* func_80C24838(PlayState* play) {
}
tempActor = foundActor->next;
- if (tempActor == NULL || false) {
+ if ((tempActor == NULL) || false) {
foundActor = NULL;
break;
}
@@ -176,70 +197,77 @@ void func_80C248A8(DmGm* this, PlayState* play) {
SkelAnime_InitFlex(play, &this->skelAnime, &object_an1_Skel_012618, NULL, this->jointTable, this->morphTable,
OBJECT_AN1_LIMB_MAX);
- this->unk_2C8 = -1;
- func_80C24428(this, play, 0);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->animIndex = DMGM_ANIM_NONE;
+ DmGm_ChangeAnim(this, play, DMGM_ANIM_0);
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
Actor_SetScale(&this->actor, 0.01f);
this->unk_2AE |= 1;
this->actor.draw = func_80C25000;
if ((play->sceneId == SCENE_YADOYA) && (play->curSpawn == 4)) {
this->unk_2B4 = func_80C24838(play);
- func_80C24428(this, play, 1);
- this->actionFunc = func_80C24BD0;
+ DmGm_ChangeAnim(this, play, DMGM_ANIM_1);
+ this->actionFunc = DmGm_DoNothing;
} else {
- this->actionFunc = func_80C24A00;
+ this->actionFunc = DmGm_HandleCutscene;
}
}
}
-void func_80C24A00(DmGm* this, PlayState* play) {
- s32 sp28[] = { 0, 0, 12, 2, 4, 6, 8, 10, 11, 3 };
- u16 action;
- s32 sp20;
+void DmGm_HandleCutscene(DmGm* this, PlayState* play) {
+ s32 csAnimIndex[] = {
+ DMGM_ANIM_0, DMGM_ANIM_0, DMGM_ANIM_12, DMGM_ANIM_2, DMGM_ANIM_4,
+ DMGM_ANIM_6, DMGM_ANIM_8, DMGM_ANIM_10, DMGM_ANIM_11, DMGM_ANIM_3,
+ };
+ u16 cueId;
+ s32 cueChannel;
- if (play->csCtx.state != 0) {
- if (this->unk_2D0 == 0) {
- this->unk_2B0 = 255;
- this->unk_2D0 = 1;
- this->unk_2D4 = 0;
- this->unk_2CC = this->unk_2C8;
+ if (play->csCtx.state != CS_STATE_IDLE) {
+ if (!this->isCutscenePlaying) {
+ this->cueId = 255;
+ this->isCutscenePlaying = true;
+ this->didAnimChangeInCs = false;
+ this->prevAnimIndex = this->animIndex;
}
- 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;
- this->unk_2D4 = 1;
- func_80C24428(this, play, sp28[action]);
+ if (this->cueId != (u8)cueId) {
+ this->cueId = cueId;
+ this->didAnimChangeInCs = true;
+ DmGm_ChangeAnim(this, play, csAnimIndex[cueId]);
}
- switch (this->unk_2B0) {
+ switch (this->cueId) {
case 2:
case 4:
case 5:
case 6:
case 7:
case 8:
- if ((this->unk_2C8 == 12) || (this->unk_2C8 == 4) || (this->unk_2C8 == 6) || (this->unk_2C8 == 8)) {
+ if ((this->animIndex == DMGM_ANIM_12) || (this->animIndex == DMGM_ANIM_4) ||
+ (this->animIndex == DMGM_ANIM_6) || (this->animIndex == DMGM_ANIM_8)) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- func_80C24428(this, play, this->unk_2C8 + 1);
+ DmGm_ChangeAnim(this, play, this->animIndex + 1);
}
}
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;
- this->unk_2D4 = 0;
- func_80C24428(this, play, this->unk_2CC);
+ } else if (this->isCutscenePlaying) {
+ this->isCutscenePlaying = false;
+ this->didAnimChangeInCs = false;
+ DmGm_ChangeAnim(this, play, this->prevAnimIndex);
}
}
-void func_80C24BD0(DmGm* this, PlayState* play) {
+void DmGm_DoNothing(DmGm* this, PlayState* play) {
}
void DmGm_Init(Actor* thisx, PlayState* play) {
@@ -261,10 +289,10 @@ void DmGm_Update(Actor* thisx, PlayState* play) {
func_80C2478C(this, play);
if (this->actor.draw != NULL) {
- func_80C24360(this, play);
+ DmGm_UpdateSkelAnime(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 };
@@ -277,16 +305,16 @@ void DmGm_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
s8 sp2B = this->actor.objBankIndex;
s8 sp2A = this->unk_2AD;
- if ((limbIndex == OBJECT_AN1_LIMB_05) && (this->unk_2D4 != 0)) {
+ if ((limbIndex == OBJECT_AN1_LIMB_05) && this->didAnimChangeInCs) {
OPEN_DISPS(play->state.gfxCtx);
Matrix_Push();
Matrix_TranslateRotateZYX(&D_80C25218, &D_80C25224);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[sp2A].segment);
+ gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[sp2A].segment);
gSPDisplayList(POLY_OPA_DISP++, gMoonMaskDL);
- gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[sp2B].segment);
+ gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[sp2B].segment);
Matrix_Pop();
@@ -356,7 +384,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..e54ee07ee 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;
@@ -30,10 +30,10 @@ typedef struct DmGm {
/* 0x2C0 */ s16 unk_2C0;
/* 0x2C2 */ s16 unk_2C2;
/* 0x2C4 */ s16 unk_2C4;
- /* 0x2C8 */ s32 unk_2C8;
- /* 0x2CC */ s32 unk_2CC;
- /* 0x2D0 */ s32 unk_2D0;
- /* 0x2D4 */ s32 unk_2D4;
+ /* 0x2C8 */ s32 animIndex;
+ /* 0x2CC */ s32 prevAnimIndex;
+ /* 0x2D0 */ s32 isCutscenePlaying;
+ /* 0x2D4 */ s32 didAnimChangeInCs;
} DmGm; // size = 0x2D8
#endif // Z_DM_GM_H
diff --git a/src/overlays/actors/ovl_Dm_Hina/z_dm_hina.c b/src/overlays/actors/ovl_Dm_Hina/z_dm_hina.c
index a2a2589fb..b28a44d1b 100644
--- a/src/overlays/actors/ovl_Dm_Hina/z_dm_hina.c
+++ b/src/overlays/actors/ovl_Dm_Hina/z_dm_hina.c
@@ -5,6 +5,7 @@
*/
#include "z_dm_hina.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20)
@@ -20,7 +21,6 @@ void func_80A1F56C(DmHina* this, PlayState* play);
void func_80A1F5AC(DmHina* this, PlayState* play);
void func_80A1F63C(DmHina* this, PlayState* play);
-#if 0
ActorInit Dm_Hina_InitVars = {
ACTOR_DM_HINA,
ACTORCAT_ITEMACTION,
@@ -33,24 +33,163 @@ ActorInit Dm_Hina_InitVars = {
(ActorFunc)DmHina_Draw,
};
-#endif
+void DmHina_Init(Actor* thisx, PlayState* play) {
+ DmHina* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Hina/DmHina_Init.s")
+ this->isDrawn = true;
+ this->actionFunc = func_80A1F470;
+ this->unk158 = this->actor.world.pos.y;
+ this->unk148 = 0.0f;
+ this->unk15C = 1.0f;
+ this->actor.focus.pos.x = this->actor.world.pos.x;
+ this->actor.focus.pos.y = this->actor.world.pos.y;
+ this->actor.focus.pos.z = this->actor.world.pos.z;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Hina/DmHina_Destroy.s")
+void DmHina_Destroy(Actor* thisx, PlayState* play) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Hina/func_80A1F470.s")
+void func_80A1F470(DmHina* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Hina/func_80A1F56C.s")
+ Math_SmoothStepToF(&this->unk148, 0.6f, 0.5f, 0.05f, 0.001f);
+ this->unk154 = Math_SinS(play->gameplayFrames * 0x708) * 8.0f;
+ if ((player->stateFlags1 & PLAYER_STATE1_400) && (this->actor.xzDistToPlayer < 80.0f)) {
+ this->isDrawn = false;
+ this->unk154 = 0.0f;
+ this->actor.world.pos.y += 40.0f;
+ this->actionFunc = func_80A1F56C;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Hina/func_80A1F5AC.s")
+void func_80A1F56C(DmHina* this, PlayState* play) {
+ if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) {
+ this->unk17C = 2;
+ this->actionFunc = func_80A1F5AC;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Hina/func_80A1F63C.s")
+void func_80A1F5AC(DmHina* this, PlayState* play) {
+ this->unk17C--;
+ if (this->unk17C == 0) {
+ this->isDrawn = true;
+ 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);
+ this->actionFunc = func_80A1F63C;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Hina/func_80A1F75C.s")
+void func_80A1F63C(DmHina* this, PlayState* play) {
+ this->subCamEye.x = this->actor.world.pos.x + 100.0f;
+ this->subCamEye.y = this->unk158 + 260.0f;
+ this->subCamEye.z = this->actor.world.pos.z + 100.0f;
+ this->subCamAt.x = this->actor.world.pos.x;
+ this->subCamAt.y = this->actor.world.pos.y + this->unk154 * this->unk15C + 40.0f * this->unk15C;
+ this->subCamAt.z = this->actor.world.pos.z;
+ Play_SetCameraAtEye(play, this->subCamId, &this->subCamAt, &this->subCamEye);
+ Math_SmoothStepToF(&this->actor.world.pos.y, this->unk158 + 300.0f, 0.5f, 2.0f, 0.1f);
+ if (((this->unk158 + 240.0f) < this->actor.world.pos.y) && (this->unk17E != 1)) {
+ this->unk17E = 1;
+ Actor_PlaySfx(&this->actor, NA_SE_OC_WHITE_OUT_INTO_KYOJIN);
+ }
+ Actor_PlaySfx(&this->actor, NA_SE_EV_MASK_RISING - SFX_FLAG);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Hina/DmHina_Update.s")
+void func_80A1F75C(DmHina* this, PlayState* play) {
+ s32 i;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Hina/func_80A1F9AC.s")
+ switch (this->unk17E) {
+ case 0:
+ this->unk17F = 0;
+ this->unk14C = 0.0f;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Hina/DmHina_Draw.s")
+ case 1:
+ Math_SmoothStepToF(&this->unk14C, 1.0f, 0.4f, 0.05f, 0.001f);
+ this->unk17F = this->unk14C * 255.0f;
+ this->unk150 = Math_SinS(play->state.frames * 0x1F40);
+ for (i = 0; i < ARRAY_COUNT(play->envCtx.adjLightSettings.light1Color); i++) {
+ play->envCtx.adjLightSettings.ambientColor[i] = play->envCtx.adjLightSettings.fogColor[i] =
+ play->envCtx.adjLightSettings.light1Color[i] = -255.0f * this->unk14C;
+ }
+
+ play->envCtx.adjLightSettings.fogNear = -500.0f * this->unk14C;
+ if (play->envCtx.adjLightSettings.fogNear < -300) {
+ play->roomCtx.curRoom.segment = NULL;
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void DmHina_Update(Actor* thisx, PlayState* play) {
+ DmHina* this = THIS;
+
+ this->actionFunc(this, play);
+ func_80A1F75C(this, play);
+}
+
+void func_80A1F9AC(DmHina* this, PlayState* play) {
+ GraphicsContext* gfxCtx = play->state.gfxCtx;
+
+ if (this->unk17E != 0) {
+ OPEN_DISPS(gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, (u8)(this->unk14C * 100.0f) + 155, this->unk17F);
+ gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, (u8)(this->unk150 * 100.0f) + 50, 0);
+ gSPDisplayList(POLY_XLU_DISP++, gLightOrbMaterial1DL);
+
+ Matrix_Translate(this->actor.world.pos.x,
+ this->actor.world.pos.y + (this->unk154 * this->unk15C) + (40.0f * this->unk15C),
+ this->actor.world.pos.z, MTXMODE_NEW);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_Scale(this->unk14C * 20.0f, this->unk14C * 20.0f, this->unk14C * 20.0f, MTXMODE_APPLY);
+ Matrix_RotateZF(Rand_ZeroFloat(2 * M_PI), MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gLightOrbModelDL);
+
+ CLOSE_DISPS(gfxCtx);
+ }
+}
+
+void DmHina_Draw(Actor* thisx, PlayState* play) {
+ DmHina* this = THIS;
+ f32 scale;
+
+ if (this->isDrawn) {
+ Matrix_Translate(this->actor.world.pos.x,
+ this->actor.world.pos.y + (this->unk154 * this->unk15C) + (40.0f * this->unk15C),
+ this->actor.world.pos.z, MTXMODE_NEW);
+ Matrix_RotateZYX(0, play->gameplayFrames * 0x3E8, 0, MTXMODE_APPLY);
+ scale = this->unk148 * (1.0f - this->unk14C) * this->unk15C;
+ Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
+ switch (this->actor.params) {
+ case 0:
+ GetItem_Draw(play, GID_REMAINS_ODOLWA);
+ break;
+
+ case 1:
+ GetItem_Draw(play, GID_REMAINS_GOHT);
+ break;
+
+ case 2:
+ GetItem_Draw(play, GID_REMAINS_GYORG);
+ break;
+
+ case 3:
+ GetItem_Draw(play, GID_REMAINS_TWINMOLD);
+ break;
+
+ default:
+ break;
+ }
+ func_80A1F9AC(this, play);
+ }
+}
diff --git a/src/overlays/actors/ovl_Dm_Hina/z_dm_hina.h b/src/overlays/actors/ovl_Dm_Hina/z_dm_hina.h
index 21c9e55dc..a3ef636be 100644
--- a/src/overlays/actors/ovl_Dm_Hina/z_dm_hina.h
+++ b/src/overlays/actors/ovl_Dm_Hina/z_dm_hina.h
@@ -10,10 +10,20 @@ typedef void (*DmHinaActionFunc)(struct DmHina*, PlayState*);
typedef struct DmHina {
/* 0x000 */ Actor actor;
/* 0x144 */ DmHinaActionFunc actionFunc;
- /* 0x148 */ char unk_148[0x10];
- /* 0x158 */ f32 unk_158;
- /* 0x15C */ f32 unk_15C;
- /* 0x160 */ char unk_160[0x24];
+ /* 0x148 */ f32 unk148;
+ /* 0x14C */ f32 unk14C;
+ /* 0x150 */ f32 unk150;
+ /* 0x154 */ f32 unk154;
+ /* 0x158 */ f32 unk158;
+ /* 0x15C */ f32 unk15C;
+ /* 0x160 */ Vec3f subCamEye;
+ /* 0x16C */ Vec3f subCamAt;
+ /* 0x178 */ UNK_TYPE1 pad178[2];
+ /* 0x17A */ s16 subCamId;
+ /* 0x17C */ s16 unk17C;
+ /* 0x17E */ u8 unk17E;
+ /* 0x17F */ u8 unk17F;
+ /* 0x180 */ u8 isDrawn;
} DmHina; // size = 0x184
#endif // Z_DM_HINA_H
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..cf62f4557 100644
--- a/src/overlays/actors/ovl_Dm_Nb/z_dm_nb.c
+++ b/src/overlays/actors/ovl_Dm_Nb/z_dm_nb.c
@@ -6,7 +6,7 @@
#include "z_dm_nb.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((DmNb*)thisx)
@@ -27,43 +27,52 @@ ActorInit Dm_Nb_InitVars = {
(ActorFunc)DmNb_Draw,
};
-static AnimationInfoS sAnimationInfo[] = {
- { &gNbIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+typedef enum {
+ /* -1 */ DMNB_ANIM_NONE = -1,
+ /* 0 */ DMNB_ANIM_0,
+ /* 1 */ DMNB_ANIM_MAX
+} DmNbAnimation;
+
+static AnimationInfoS sAnimationInfo[DMNB_ANIM_MAX] = {
+ { &gNbIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMNB_ANIM_0
};
-s32 func_80C1DED0(DmNb* this, s32 arg1) {
- s32 ret = false;
+s32 DmNb_ChangeAnim(DmNb* this, s32 animIndex) {
+ s32 didAnimChange = false;
- if (arg1 != this->unk1F0) {
- this->unk1F0 = arg1;
- ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, arg1);
+ if (this->animIndex != animIndex) {
+ this->animIndex = animIndex;
+ didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
}
- return ret;
+
+ return didAnimChange;
}
-void func_80C1DF18(DmNb* this, PlayState* play) {
- s32 sp2C[] = { 0, 0, 0, 0, 0 };
- u16 csAction;
- s32 csActionIndex;
+void DmNb_HandleCutscene(DmNb* this, PlayState* play) {
+ s32 csAnimIndex[] = {
+ DMNB_ANIM_0, DMNB_ANIM_0, DMNB_ANIM_0, DMNB_ANIM_0, DMNB_ANIM_0,
+ };
+ u16 cueId;
+ s32 cueChannel;
- if (play->csCtx.state != 0) {
- if (this->unk1F8 == 0) {
- this->unk1EC = 0xFF;
- this->unk1F8 = 1;
- this->unk1F4 = this->unk1F0;
+ if (play->csCtx.state != CS_STATE_IDLE) {
+ if (!this->isCutscenePlaying) {
+ this->cueId = 255;
+ this->isCutscenePlaying = true;
+ this->prevAnimIndex = this->animIndex;
}
- 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;
+ DmNb_ChangeAnim(this, csAnimIndex[cueId]);
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, csActionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
- } else if (this->unk1F8 != 0) {
- this->unk1F8 = 0;
- func_80C1DED0(this, this->unk1F4);
+ } else if (this->isCutscenePlaying) {
+ this->isCutscenePlaying = false;
+ DmNb_ChangeAnim(this, this->prevAnimIndex);
}
}
@@ -72,11 +81,11 @@ void DmNb_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, NULL, 0.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &gNbSkel, NULL, this->jointTable, this->morphTable, NB_LIMB_MAX);
- this->unk1F0 = -1;
- func_80C1DED0(this, 0);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->animIndex = DMNB_ANIM_NONE;
+ DmNb_ChangeAnim(this, DMNB_ANIM_0);
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
Actor_SetScale(&this->actor, 0.01f);
- this->actionFunc = func_80C1DF18;
+ this->actionFunc = DmNb_HandleCutscene;
}
void DmNb_Destroy(Actor* thisx, PlayState* play) {
@@ -87,7 +96,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 +105,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..560f1b259 100644
--- a/src/overlays/actors/ovl_Dm_Nb/z_dm_nb.h
+++ b/src/overlays/actors/ovl_Dm_Nb/z_dm_nb.h
@@ -14,10 +14,10 @@ typedef struct DmNb {
/* 0x188 */ DmNbActionFunc actionFunc;
/* 0x18C */ Vec3s jointTable[NB_LIMB_MAX];
/* 0x1BC */ Vec3s morphTable[NB_LIMB_MAX];
- /* 0x1EC */ u8 unk1EC;
- /* 0x1F0 */ s32 unk1F0;
- /* 0x1F4 */ s32 unk1F4;
- /* 0x1F8 */ s32 unk1F8;
+ /* 0x1EC */ u8 cueId;
+ /* 0x1F0 */ s32 animIndex;
+ /* 0x1F4 */ s32 prevAnimIndex;
+ /* 0x1F8 */ s32 isCutscenePlaying;
} DmNb; // size = 0x1FC
#endif // Z_DM_NB_H
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..b26948090 100644
--- a/src/overlays/actors/ovl_Dm_Opstage/z_dm_opstage.c
+++ b/src/overlays/actors/ovl_Dm_Opstage/z_dm_opstage.c
@@ -16,7 +16,7 @@ void DmOpstage_Destroy(Actor* thisx, PlayState* play);
void DmOpstage_Update(Actor* thisx, PlayState* play);
void DmOpstage_Draw(Actor* thisx, PlayState* play);
-void DmOpstage_FollowCutsceneScript(DmOpstage* this, PlayState* play);
+void DmOpstage_HandleCutscene(DmOpstage* this, PlayState* play);
ActorInit Dm_Opstage_InitVars = {
ACTOR_DM_OPSTAGE,
@@ -42,12 +42,12 @@ void DmOpstage_Init(Actor* thisx, PlayState* play) {
DmOpstage* this = THIS;
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
- DmOpstage_SetupAction(this, DmOpstage_FollowCutsceneScript);
+ DmOpstage_SetupAction(this, DmOpstage_HandleCutscene);
Actor_SetScale(&this->dyna.actor, 0.1f);
if (DMOPSTAGE_GET_TYPE(&this->dyna.actor) == DMOPSTAGE_TYPE_GROUND) {
DynaPolyActor_Init(&this->dyna, 0);
- DynaPolyActor_LoadMesh(play, &this->dyna, &gKeikokuDemoFloorColliderHeader);
+ DynaPolyActor_LoadMesh(play, &this->dyna, &gKeikokuDemoFloorCol);
}
if (DMOPSTAGE_GET_TYPE(&this->dyna.actor) > DMOPSTAGE_TYPE_GROUND) {
@@ -69,25 +69,25 @@ void DmOpstage_Destroy(Actor* thisx, PlayState* play) {
}
}
-void DmOpstage_FollowCutsceneScript(DmOpstage* this, PlayState* play) {
- s32 actionIndex;
+void DmOpstage_HandleCutscene(DmOpstage* this, PlayState* play) {
+ 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,10 +95,10 @@ 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);
+ Audio_PlaySfx_2(NA_SE_EV_NAVY_FLY_REBIRTH);
}
}
@@ -134,5 +134,8 @@ void DmOpstage_Draw(Actor* thisx, PlayState* play) {
Gfx_DrawDListOpa(play, gKeikokuDemoTallTreeStraightDL);
Gfx_DrawDListXlu(play, gKeikokuDemoTallTreeStraightEmptyDL);
break;
+
+ default:
+ break;
}
}
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 25fee11db..ca8f40aa5 100644
--- a/src/overlays/actors/ovl_Dm_Ravine/z_dm_ravine.c
+++ b/src/overlays/actors/ovl_Dm_Ravine/z_dm_ravine.c
@@ -32,7 +32,7 @@ void DmRavine_Init(Actor* thisx, PlayState* play) {
s32 pad;
DmRavine* this = THIS;
- if (CHECK_WEEKEVENTREG_ALT(WEEKEVENTREG_00_10) | cREG(0)) {
+ if (CHECK_WEEKEVENTREG_ALT(WEEKEVENTREG_ENTERED_GORMAN_TRACK) | cREG(0)) {
Actor_Kill(&this->actor);
return;
}
@@ -55,24 +55,29 @@ void DmRavine_Update(Actor* thisx, PlayState* play) {
DmRavine* this = THIS;
RoomContext* roomCtx;
- switch ((DmRavineState)this->state) {
+ switch (this->state) {
case DM_RAVINE_STATE_INITIALIZED:
- return;
+ break;
+
case DM_RAVINE_STATE_ACTIVE:
this->isActive = true;
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
}
}
break;
+
case DM_RAVINE_STATE_PENDING_DEATH:
Actor_Kill(&this->actor);
break;
+
+ default:
+ break;
}
}
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..945a47472 100644
--- a/src/overlays/actors/ovl_Dm_Sa/z_dm_sa.c
+++ b/src/overlays/actors/ovl_Dm_Sa/z_dm_sa.c
@@ -30,19 +30,29 @@ ActorInit Dm_Sa_InitVars = {
(ActorFunc)DmSa_Draw,
};
-static AnimationInfo sAnimationInfo[] = { { &gSkullKidTPoseAnim, 1.0f, 0, -1.0f, ANIMMODE_LOOP, 0 } };
+typedef enum {
+ /* -1 */ DMSA_ANIM_NONE = -1,
+ /* 0 */ DMSA_ANIM_T_POSE,
+ /* 1 */ DMSA_ANIM_MAX
+} DmSaAnimation;
-void func_80A2E960(SkelAnime* arg0, AnimationInfo* animations, u16 index) {
- f32 frameCount;
+static AnimationInfo sAnimationInfo[DMSA_ANIM_MAX] = {
+ { &gSkullKidTPoseAnim, 1.0f, 0, -1.0f, ANIMMODE_LOOP, 0 }, // DMSA_ANIM_T_POSE
+};
- animations += index;
- if (animations->frameCount < 0.0f) {
- frameCount = Animation_GetLastFrame(animations->animation);
+void DmSa_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animInfo, u16 animIndex) {
+ f32 endFrame;
+
+ animInfo += animIndex;
+
+ if (animInfo->frameCount < 0.0f) {
+ endFrame = Animation_GetLastFrame(animInfo->animation);
} else {
- frameCount = animations->frameCount;
+ endFrame = animInfo->frameCount;
}
- Animation_Change(arg0, animations->animation, animations->playSpeed, animations->startFrame, frameCount,
- animations->mode, animations->morphFrames);
+
+ Animation_Change(skelAnime, animInfo->animation, animInfo->playSpeed, animInfo->startFrame, endFrame,
+ animInfo->mode, animInfo->morphFrames);
}
void DmSa_Init(Actor* thisx, PlayState* play) {
@@ -53,7 +63,7 @@ void DmSa_Init(Actor* thisx, PlayState* play) {
this->actor.targetArrowOffset = 3000.0f;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &gSkullKidSkel, NULL, NULL, NULL, 0);
- func_80A2E960(&this->skelAnime, sAnimationInfo, 0);
+ DmSa_ChangeAnim(&this->skelAnime, &sAnimationInfo[DMSA_ANIM_T_POSE], 0);
Actor_SetScale(&this->actor, 0.01f);
this->actionFunc = DmSa_DoNothing;
}
@@ -108,7 +118,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 8233bb0cb..c9aaa48cb 100644
--- a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c
+++ b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c
@@ -109,6 +109,7 @@ typedef enum {
/* 69 */ SK_ANIM_LOOK_LEFT_LOOP,
/* 70 */ SK_ANIM_SNIFF,
/* 71 */ SK_ANIM_LAUGH_AFTER_SNIFF,
+ /* 72 */ SK_ANIM_LAUGH_AFTER_MAX
} SkullKidAnimation;
typedef enum {
@@ -116,7 +117,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 +128,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 {
@@ -219,79 +220,87 @@ static DamageTable sDamageTable = {
/* Powder Keg */ DMG_ENTRY(1, 0xF),
};
-static AnimationInfo sAnimationInfo[] = {
- { &gSkullKidShakeHeadAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidWalkAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidLookAroundAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidIdleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidIdleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidBentOverHeadTwitchAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidGlitchyHorseRideStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidRecliningFloatAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidCurseStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidCurseLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidLaughStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidLaughLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidHideOcarinaStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidHideOcarinaLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
+static AnimationInfo sAnimationInfo[SK_ANIM_LAUGH_AFTER_MAX] = {
+ { &gSkullKidShakeHeadAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_SHAKE_HEAD
+ { &gSkullKidWalkAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_WALK
+ { &gSkullKidLookAroundAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_LOOK_AROUND
+ { &gSkullKidIdleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_IDLE
+ { &gSkullKidIdleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_UNUSED_IDLE
+ { &gSkullKidBentOverHeadTwitchAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_BENT_OVER_HEAD_TWITCH
+ { &gSkullKidGlitchyHorseRideStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_GLITCHY_HORSE_RIDE_START
+ { &gSkullKidRecliningFloatAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_RECLINING_FLOAT
+ { &gSkullKidCurseStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_CURSE_START
+ { &gSkullKidCurseLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_CURSE_LOOP
+ { &gSkullKidLaughStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_LAUGH_START
+ { &gSkullKidLaughLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_LAUGH_LOOP
+ { &gSkullKidHideOcarinaStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_HIDE_OCARINA_START
+ { &gSkullKidHideOcarinaLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_HIDE_OCARINA_LOOP
+ // SK_ANIM_PICK_UP_OCARINA_AND_START_PLAYING
{ &gSkullKidPickUpOcarinaAndStartPlayingAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidPlayOcarinaAndLaughAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidPickUpOcarinaAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidLookAtOcarinaAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidKickOverLinkAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidSearchLinkAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidKickOverLinkAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidSearchLinkAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidHorseRideStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidHorseRideLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidRaiseMaskStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidRaiseMaskLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidLowerMaskAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
+ { &gSkullKidPlayOcarinaAndLaughAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_PLAY_OCARINA_AND_LAUGH
+ { &gSkullKidPickUpOcarinaAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_PICK_UP_OCARINA
+ { &gSkullKidLookAtOcarinaAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_LOOK_AT_OCARINA
+ { &gSkullKidKickOverLinkAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_KICK_OVER_LINK
+ { &gSkullKidSearchLinkAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_SEARCH_LINK
+ { &gSkullKidKickOverLinkAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_UNUSED_KICK_OVER_LINK
+ { &gSkullKidSearchLinkAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_UNUSED_SEARCH_LINK
+ { &gSkullKidHorseRideStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_HORSE_RIDE_START
+ { &gSkullKidHorseRideLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_HORSE_RIDE_LOOP
+ { &gSkullKidRaiseMaskStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_RAISE_MASK_START
+ { &gSkullKidRaiseMaskLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_RAISE_MASK_LOOP
+ { &gSkullKidLowerMaskAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_LOWER_MASK
+ // SK_ANIM_JUMP_WHILE_HIDING_OCARINA
{ &gSkullKidJumpWhileHidingOcarinaAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidHorseRideAndRotateAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
+ { &gSkullKidHorseRideAndRotateAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_HORSE_RIDE_AND_ROTATE
+ // SK_ANIM_PLAY_OCARINA_WHILE_FLOATING
{ &gSkullKidPlayOcarinaWhileFloatingAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidFloatingTurnAroundAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidOcarinaJuggleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidCallDownMoonStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidCallDownMoonLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidSmackFairyStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidSmackFairyLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidHitByBubbleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidDropOcarinaAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidFloatingArmsCrossedAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidDeflectAttackAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidTelescopeLookUpStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidTelescopeLookUpLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidSurpriseStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidSurpriseLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gSkullKidFloatingTurnAroundAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_FLOATING_TURN_AROUND
+ { &gSkullKidOcarinaJuggleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_OCARINA_JUGGLE
+ { &gSkullKidCallDownMoonStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_CALL_DOWN_MOON_START
+ { &gSkullKidCallDownMoonLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_CALL_DOWN_MOON_LOOP
+ { &gSkullKidSmackFairyStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_SMACK_FAIRY_START
+ { &gSkullKidSmackFairyLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_SMACK_FAIRY_LOOP
+ { &gSkullKidHitByBubbleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_HIT_BY_BUBBLE
+ { &gSkullKidDropOcarinaAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_DROP_OCARINA
+ { &gSkullKidFloatingArmsCrossedAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_FLOATING_ARMS_CROSSED
+ { &gSkullKidDeflectAttackAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_DEFLECT_ATTACK
+ { &gSkullKidTelescopeLookUpStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_TELESCOPE_LOOK_UP_START
+ { &gSkullKidTelescopeLookUpLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_TELESCOPE_LOOK_UP_LOOP
+ { &gSkullKidSurpriseStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_SURPRISE_START
+ { &gSkullKidSurpriseLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_SURPRISE_LOOP
+ // SK_ANIM_LOOK_AROUND_FOR_GIANTS_START
{ &gSkullKidLookAroundForGiantsStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
+ // SK_ANIM_LOOK_AROUND_FOR_GIANTS_LOOP
{ &gSkullKidLookAroundForGiantsLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidHoldHeadAndShakeStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidHoldHeadAndShakeLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gSkullKidHoldHeadAndShakeStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE,
+ 0.0f }, // SK_ANIM_HOLD_HEAD_AND_SHAKE_START
+ { &gSkullKidHoldHeadAndShakeLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_HOLD_HEAD_AND_SHAKE_LOOP
+ // SK_ANIM_HOLD_HEAD_AND_SCREAM_START
{ &gSkullKidHoldHeadAndScreamStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
+ // SK_ANIM_HOLD_HEAD_AND_SCREAM_LOOP
{ &gSkullKidHoldHeadAndScreamLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidHuddleWithFairiesAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidSearchMaskSalesmanAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidHoldUpMaskStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidHoldUpMaskLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidShiverAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidDrawAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidBentOverLookUpAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidSpankAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidHipShakeAndJumpAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidPlayFluteAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidCartwheelAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidDangleFromMaskStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidDangleFromMaskStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidDangleFromMaskLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidDroppedFromMaskAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidLookUpAtGiantsAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidAshamedStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidAshamedLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidLookLeftStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidLookLeftLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &gSkullKidSniffAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &gSkullKidLaughAfterSniffAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gSkullKidHuddleWithFairiesAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_HUDDLE_WITH_FAIRIES
+ { &gSkullKidSearchMaskSalesmanAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_SEARCH_MASK_SALESMAN
+ { &gSkullKidHoldUpMaskStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_HOLD_UP_MASK_START
+ { &gSkullKidHoldUpMaskLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_HOLD_UP_MASK_LOOP
+ { &gSkullKidShiverAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_SHIVER
+ { &gSkullKidDrawAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_DRAW
+ { &gSkullKidBentOverLookUpAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_BENT_OVER_LOOK_UP
+ { &gSkullKidSpankAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_SPANK
+ { &gSkullKidHipShakeAndJumpAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_HIP_SHAKE_AND_JUMP
+ { &gSkullKidPlayFluteAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_PLAY_FLUTE
+ { &gSkullKidCartwheelAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_CARTWHEEL
+ { &gSkullKidDangleFromMaskStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_LIE_FLAT
+ { &gSkullKidDangleFromMaskStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_DANGLE_FROM_MASK_START
+ { &gSkullKidDangleFromMaskLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_DANGLE_FROM_MASK_LOOP
+ { &gSkullKidDroppedFromMaskAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_DROPPED_FROM_MASK
+ { &gSkullKidLookUpAtGiantsAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_LOOK_UP_AT_GIANTS
+ { &gSkullKidAshamedStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_ASHAMED_START
+ { &gSkullKidAshamedLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_ASHAMED_LOOP
+ { &gSkullKidLookLeftStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_LOOK_LEFT_START
+ { &gSkullKidLookLeftLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_LOOK_LEFT_LOOP
+ { &gSkullKidSniffAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_SNIFF
+ { &gSkullKidLaughAfterSniffAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_LAUGH_AFTER_SNIFF
};
/**
@@ -311,23 +320,25 @@ void DmStk_LoadObjectForAnimation(DmStk* this, PlayState* play) {
}
if (objectIndex >= 0) {
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objectIndex].segment);
}
}
-/**
- * This function is always called with unusedExtraOffset = 0.
- */
-void DmStk_ChangeAnim(DmStk* this, PlayState* play, SkelAnime* skelAnime, AnimationInfo* animationInfo,
- u16 unusedExtraOffset) {
+void DmStk_ChangeAnim(DmStk* this, PlayState* play, SkelAnime* skelAnime, AnimationInfo* animInfo, u16 animIndex) {
+ f32 endFrame;
+
DmStk_LoadObjectForAnimation(this, play);
- animationInfo += unusedExtraOffset;
+ animInfo += animIndex;
- Animation_Change(skelAnime, animationInfo->animation, animationInfo->playSpeed, animationInfo->startFrame,
- (animationInfo->frameCount < 0.0f) ? Animation_GetLastFrame(animationInfo->animation)
- : animationInfo->frameCount,
- animationInfo->mode, animationInfo->morphFrames);
+ if (animInfo->frameCount < 0.0f) {
+ endFrame = Animation_GetLastFrame(animInfo->animation);
+ } else {
+ endFrame = animInfo->frameCount;
+ }
+
+ Animation_Change(skelAnime, animInfo->animation, animInfo->playSpeed, animInfo->startFrame, endFrame,
+ animInfo->mode, animInfo->morphFrames);
}
/**
@@ -336,9 +347,9 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_APPEAR);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_APPEAR);
break;
case 1232:
@@ -346,48 +357,48 @@ void DmStk_PlaySfxForIntroCutsceneFirstPart(DmStk* this, PlayState* play) {
case 1252:
case 1255:
case 1257:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_SHAKEHEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_SHAKEHEAD);
break;
case 1285:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STAL03_LAUGH_BIG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STAL03_LAUGH_BIG);
break;
case 1343:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_MASK_OFF);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_MASK_OFF);
break;
case 1410:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_MASK_ON);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_MASK_ON);
break;
case 1603:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_WALK);
break;
case 1610:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_REVERSE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_REVERSE);
break;
case 2095:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_SURPRISED);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_SURPRISED);
break;
case 2190:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_JUMP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_JUMP);
break;
case 2212:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_ONGND);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_ONGND);
break;
case 2214:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STAL02_LAUGH_SHORT);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STAL02_LAUGH_SHORT);
break;
case 2250:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STAL06_SURPRISED);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_DOWN_K);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STAL06_SURPRISED);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_DOWN_K);
break;
case 2255:
@@ -416,7 +427,10 @@ void DmStk_PlaySfxForIntroCutsceneFirstPart(DmStk* this, PlayState* play) {
case 2508:
case 2519:
case 2530:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_RIDE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_RIDE);
+ break;
+
+ default:
break;
}
}
@@ -427,8 +441,8 @@ 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) {
- func_8019F128(NA_SE_EV_CLOCK_TOWER_BELL);
+ if (play->csCtx.curFrame == 535) {
+ Audio_PlaySfx_2(NA_SE_EV_CLOCK_TOWER_BELL);
}
}
@@ -437,7 +451,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:
@@ -455,11 +469,14 @@ void DmStk_PlaySfxForIntroCutsceneSecondPart(DmStk* this, PlayState* play) {
case 232:
case 243:
case 254:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_RIDE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_RIDE);
break;
case 173:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STAL03_LAUGH_BIG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STAL03_LAUGH_BIG);
+ break;
+
+ default:
break;
}
}
@@ -469,17 +486,20 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_GASAGOSO);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_GASAGOSO);
break;
case 90:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_MASK_ON);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_MASK_ON);
break;
case 142:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EVIL_POWER);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EVIL_POWER);
+ break;
+
+ default:
break;
}
}
@@ -490,22 +510,25 @@ 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);
+ Audio_PlaySfx_AtPosWithVolumeTransition(&this->actor.projectedPos, NA_SE_EN_STALKIDS_FLOAT, 100);
break;
case 785:
- func_8019F128(NA_SE_SY_STALKIDS_PSYCHO);
- func_8019FE74(&gSfxVolume, 0.0f, 150);
+ Audio_PlaySfx_2(NA_SE_SY_STALKIDS_PSYCHO);
+ Audio_SetSfxVolumeTransition(&gSfxVolume, 0.0f, 150);
break;
case 560:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STAL02_LAUGH_SHORT);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STAL02_LAUGH_SHORT);
break;
case 890:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STAL21_PSYCHO_VOICE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STAL21_PSYCHO_VOICE);
+ break;
+
+ default:
break;
}
}
@@ -518,13 +541,13 @@ 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);
+ Audio_PlaySfx_AtPosWithVolumeTransition(&this->actor.projectedPos, NA_SE_EN_STALKIDS_FLOAT, 50);
break;
case 71:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_BODY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_BODY);
break;
case 365:
@@ -532,34 +555,35 @@ void DmStk_PlaySfxForCurseCutsceneSecondPart(DmStk* this, PlayState* play) {
break;
case 650:
- func_8019FE74(&gSfxVolume, 0.0f, 80);
+ Audio_SetSfxVolumeTransition(&gSfxVolume, 0.0f, 80);
break;
case 265:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STAL03_LAUGH_BIG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STAL03_LAUGH_BIG);
break;
case 126:
- Actor_PlaySfxAtPos(&player->actor, NA_SE_VO_DUMMY_150);
+ Actor_PlaySfx(&player->actor, NA_SE_VO_DUMMY_150);
break;
case 197:
- Actor_PlaySfxAtPos(&player->actor, NA_SE_VO_DUMMY_134);
+ Actor_PlaySfx(&player->actor, NA_SE_VO_DUMMY_134);
break;
case 207:
- Actor_PlaySfxAtPos(&player->actor, NA_SE_VO_DUMMY_135);
+ Actor_PlaySfx(&player->actor, NA_SE_VO_DUMMY_135);
break;
case 217:
- Actor_PlaySfxAtPos(&player->actor, NA_SE_VO_DUMMY_136);
+ Actor_PlaySfx(&player->actor, NA_SE_VO_DUMMY_136);
+ break;
+
+ default:
break;
}
- if (player) {}
-
- if ((play->csCtx.frames >= 263) && (play->csCtx.frames < 698)) {
- Actor_PlaySfxAtPos(&player->actor, NA_SE_EN_STALKIDS_BODY_LEV - SFX_FLAG);
+ if ((play->csCtx.curFrame >= 263) && (play->csCtx.curFrame < 698)) {
+ Actor_PlaySfx(&player->actor, NA_SE_EN_STALKIDS_BODY_LEV - SFX_FLAG);
}
}
@@ -571,43 +595,46 @@ 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);
+ Audio_PlaySfx_AtPosWithVolumeTransition(&this->actor.projectedPos, NA_SE_EN_STALKIDS_FLOAT, 80);
break;
case 258:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_TURN);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_TURN);
break;
case 524:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_TURN);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STAL04_ANGER);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_TURN);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STAL04_ANGER);
break;
case 534:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_ROLL);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_ROLL);
break;
case 678:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_STRETCH);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_STRETCH);
+ break;
+
+ default:
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_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_OTEDAMA1);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_OTEDAMA1);
} else if (Animation_OnFrame(&this->skelAnime, 17.0f) || Animation_OnFrame(&this->skelAnime, 40.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_OTEDAMA2);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_OTEDAMA2);
}
}
- if (play->csCtx.frames >= 700) {
+ if (play->csCtx.curFrame >= 700) {
if (sMoonCallTimer < 128) {
if ((sMoonCallTimer & 0x1F) == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STAL20_CALL_MOON);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STAL20_CALL_MOON);
} else if ((sMoonCallTimer & 0x1F) == 16) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STAL20_CALL_MOON2);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STAL20_CALL_MOON2);
}
sMoonCallTimer++;
@@ -621,9 +648,9 @@ 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) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STAL06_SURPRISED);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_DOWN_K);
+ 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,8 +658,8 @@ 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)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_NE_STAL23_COLD - SFX_FLAG);
+ if ((play->csCtx.curFrame >= 642) && (play->csCtx.curFrame < 845)) {
+ Actor_PlaySfx(&this->actor, NA_SE_NE_STAL23_COLD - SFX_FLAG);
}
}
@@ -641,23 +668,26 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_PL_WALK_WATER2);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_PL_WALK_GROUND + SURFACE_SFX_OFFSET_TALL_GRASS);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_WALK);
break;
case 186:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_UP);
break;
case 230:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STAL22_LAUGH_KID_L);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STAL22_LAUGH_KID_L);
+ break;
+
+ default:
break;
}
}
@@ -668,13 +698,16 @@ 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;
case 660:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_SHAKEHEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_SHAKEHEAD);
+ break;
+
+ default:
break;
}
}
@@ -686,69 +719,72 @@ 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;
case 45:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_RIDE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_RIDE);
break;
case 93:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_MASK_OFF);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_MASK_OFF);
break;
case 245:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_RIDE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_RIDE);
break;
case 269:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STAL11_LAUGH_SHY2);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STAL11_LAUGH_SHY2);
break;
case 327:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_SHAKEHEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_SHAKEHEAD);
break;
case 455:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_RIDE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_RIDE);
break;
case 1730:
- Audio_QueueSeqCmd(0x141400FF);
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_AMBIENCE, 20);
break;
case 1395:
- func_800B8E58(player, NA_SE_VO_DUMMY_34);
+ Player_PlaySfx(player, NA_SE_VO_DUMMY_34);
break;
case 1850:
- Audio_QueueSeqCmd(0x42320000);
+ SEQCMD_SET_SEQPLAYER_VOLUME(SEQ_PLAYER_SFX, 50, 0);
break;
case 2000:
AudioSfx_MuteBanks((1 << BANK_PLAYER) | (1 << BANK_ITEM) | (1 << BANK_ENV) | (1 << BANK_ENEMY) |
(1 << BANK_SYSTEM) | (1 << BANK_OCARINA) | (1 << BANK_VOICE));
break;
+
+ default:
+ break;
}
if (this->animIndex == SK_ANIM_SHAKE_HEAD) {
if (Animation_OnFrame(&this->skelAnime, 8.0f) || Animation_OnFrame(&this->skelAnime, 17.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_MASK_OFF);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_MASK_OFF);
}
if (Animation_OnFrame(&this->skelAnime, 28.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_RIDE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_RIDE);
}
} else if (this->animIndex == SK_ANIM_LAUGH_AFTER_SNIFF) {
if (Animation_OnFrame(&this->skelAnime, 2.0f) || Animation_OnFrame(&this->skelAnime, 6.0f) ||
Animation_OnFrame(&this->skelAnime, 12.0f) || Animation_OnFrame(&this->skelAnime, 18.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_MASK_OFF);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_MASK_OFF);
}
} else if ((this->animIndex == SK_ANIM_SNIFF) &&
(Animation_OnFrame(&this->skelAnime, 16.0f) || Animation_OnFrame(&this->skelAnime, 23.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_NOSE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_NOSE);
}
}
@@ -760,31 +796,34 @@ 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);
+ Audio_PlaySfx_AtPosWithVolumeTransition(&this->actor.projectedPos, NA_SE_EN_STALKIDS_FLOAT, 80);
break;
case 234:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_TURN);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STAL04_ANGER);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_TURN);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STAL04_ANGER);
break;
case 244:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_ROLL);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_ROLL);
break;
case 388:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_STRETCH);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_STRETCH);
+ break;
+
+ default:
break;
}
- if (play->csCtx.frames >= 408) {
+ if (play->csCtx.curFrame >= 408) {
if (sMoonCallTimer < 128) {
if ((sMoonCallTimer & 0x1F) == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STAL20_CALL_MOON);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STAL20_CALL_MOON);
} else if ((sMoonCallTimer & 0x1F) == 16) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STAL20_CALL_MOON2);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STAL20_CALL_MOON2);
}
sMoonCallTimer++;
@@ -803,68 +842,69 @@ 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);
+ Audio_PlaySfx_AtPos(&this->oathToOrderCutsceneVoicePos, NA_SE_EN_STAL06_SURPRISED);
break;
case 327:
case 332:
case 335:
case 344:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_MASK_OFF);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_MASK_OFF);
break;
case 367:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_BODY_LEV);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_BODY_LEV);
break;
case 470:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_HEADACHE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_HEADACHE);
break;
case 486:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_MASK_OFF);
- Audio_PlaySfxAtPos(&this->oathToOrderCutsceneVoicePos, NA_SE_EN_STAL08_CRY_BIG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_MASK_OFF);
+ Audio_PlaySfx_AtPos(&this->oathToOrderCutsceneVoicePos, NA_SE_EN_STAL08_CRY_BIG);
break;
case 496:
- Audio_PlaySfxAtPos(&this->oathToOrderCutsceneVoicePos, NA_SE_EN_STAL09_SCREAM);
+ Audio_PlaySfx_AtPos(&this->oathToOrderCutsceneVoicePos, NA_SE_EN_STAL09_SCREAM);
break;
case 590:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_MASK_OFF);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_MASK_OFF);
break;
case 592:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_RIDE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_RIDE);
break;
case 594:
- Audio_PlaySfxAtPos(&this->oathToOrderCutsceneVoicePos, NA_SE_EN_STAL24_SCREAM2);
+ Audio_PlaySfx_AtPos(&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_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_EARTHQUAKE);
+ 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_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_BODY_LEV);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_BODY_LEV);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_MASK_OFF);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_MASK_OFF);
}
}
}
- if (play->csCtx.frames >= 290) {
- func_8019F128(NA_SE_EV_KYOJIN_VOICE_SUCCESS - SFX_FLAG);
+ if (play->csCtx.curFrame >= 290) {
+ Audio_PlaySfx_2(NA_SE_EV_KYOJIN_VOICE_SUCCESS - SFX_FLAG);
}
}
@@ -874,18 +914,21 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_PULLED);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_PULLED);
break;
case 711:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_MASK_OFF);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_MASK_OFF);
break;
case 716:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_MASK_ON);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_ONGND);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_MASK_ON);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_ONGND);
+ break;
+
+ default:
break;
}
}
@@ -896,18 +939,21 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_PULLED);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_PULLED);
break;
case 365:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_MASK_OFF);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_MASK_OFF);
break;
case 372:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_MASK_ON);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_ONGND);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_MASK_ON);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_ONGND);
+ break;
+
+ default:
break;
}
}
@@ -916,14 +962,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 +982,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 +992,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,42 +1012,45 @@ 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);
}
}
break;
+
+ default:
+ break;
}
}
if (this->animIndex == SK_ANIM_WALK) {
if (Animation_OnFrame(&this->skelAnime, 2.0f) || Animation_OnFrame(&this->skelAnime, 6.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_WALK);
}
} else if (this->animIndex == SK_ANIM_SEARCH_LINK) {
if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 13.0f) ||
Animation_OnFrame(&this->skelAnime, 20.0f) || Animation_OnFrame(&this->skelAnime, 27.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_PL_CALM_HIT);
+ Actor_PlaySfx(&this->actor, NA_SE_PL_CALM_HIT);
}
} else if (this->animIndex == SK_ANIM_PICK_UP_OCARINA_AND_START_PLAYING) {
if (Animation_OnFrame(&this->skelAnime, 3.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_PL_PUT_OUT_ITEM);
+ Actor_PlaySfx(&this->actor, NA_SE_PL_PUT_OUT_ITEM);
}
} else if (this->animIndex == SK_ANIM_PLAY_OCARINA_AND_LAUGH) {
if (Animation_OnFrame(&this->skelAnime, 14.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_UNSKILLFUL_OCARINA);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_UNSKILLFUL_OCARINA);
}
if (Animation_OnFrame(&this->skelAnime, 45.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STAL01_LAUGH);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STAL01_LAUGH);
}
}
}
@@ -1013,9 +1062,9 @@ void DmStk_Init(Actor* thisx, PlayState* play) {
this->shouldDraw = true;
if (DM_STK_GET_TYPE(&this->actor) != DM_STK_TYPE_MAJORAS_MASK) {
this->dekuPipesCutsceneState = SK_DEKU_PIPES_CS_STATE_NOT_READY;
- this->objectStkObjectIndex = Object_GetIndex(&play->objectCtx, OBJECT_STK);
- this->objectStk2ObjectIndex = Object_GetIndex(&play->objectCtx, OBJECT_STK2);
- this->objectStk3ObjectIndex = Object_GetIndex(&play->objectCtx, OBJECT_STK3);
+ this->objectStkObjectIndex = Object_GetSlot(&play->objectCtx, OBJECT_STK);
+ this->objectStk2ObjectIndex = Object_GetSlot(&play->objectCtx, OBJECT_STK2);
+ this->objectStk3ObjectIndex = Object_GetSlot(&play->objectCtx, OBJECT_STK3);
if (this->objectStkObjectIndex < 0) {
Actor_Kill(&this->actor);
}
@@ -1024,9 +1073,9 @@ void DmStk_Init(Actor* thisx, PlayState* play) {
this->deflectCount = 0;
this->maskType = SK_MASK_TYPE_NORMAL;
this->animIndex = SK_ANIM_IDLE;
- this->fogR = play->lightCtx.fogColor.r;
- this->fogG = play->lightCtx.fogColor.g;
- this->fogB = play->lightCtx.fogColor.b;
+ this->fogR = play->lightCtx.fogColor[0];
+ this->fogG = play->lightCtx.fogColor[1];
+ this->fogB = play->lightCtx.fogColor[2];
if ((play->sceneId == SCENE_LOST_WOODS) && (gSaveContext.sceneLayer == 1)) {
this->alpha = 0;
@@ -1052,7 +1101,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 +1168,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 +1176,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 +1214,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;
- } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_08_40) ||
+ csId = dayOneAndTwoCsId;
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLOCK_TOWER_OPENED) ||
((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 +1256,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 +1273,21 @@ void DmStk_ClockTower_WaitForIntroCutsceneVersion2ToEnd(DmStk* this, PlayState*
}
void DmStk_ClockTower_StartDropOcarinaCutscene(DmStk* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(10)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_DAMAGE);
- ActorCutscene_Start(10, &this->actor);
+ if (CutsceneManager_IsNext(10)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_DAMAGE);
+ 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;
}
}
@@ -1254,7 +1303,7 @@ void DmStk_ClockTower_AdjustHeightAndRotation(DmStk* this, PlayState* play) {
sin = Math_SinS(this->bobPhase) * 10.0f;
Math_SmoothStepToF(&this->actor.world.pos.y, 160.0f + sin, 0.2f, 1.0f, 0.0001f);
- this->actor.world.rot.y = Actor_YawBetweenActors(&this->actor, &player->actor);
+ this->actor.world.rot.y = Actor_WorldYawTowardActor(&this->actor, &player->actor);
this->actor.shape.rot.y = this->actor.world.rot.y;
this->actor.world.rot.x = 0x1B58;
@@ -1280,7 +1329,7 @@ void DmStk_ClockTower_DeflectHit(DmStk* this, PlayState* play) {
this->animIndex = SK_ANIM_DEFLECT_ATTACK;
DmStk_ChangeAnim(this, play, &this->skelAnime, &sAnimationInfo[this->animIndex], 0);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_DOWN_K);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_DOWN_K);
this->actionFunc = DmStk_ClockTower_WaitForDeflectionToEnd;
}
@@ -1305,23 +1354,23 @@ void DmStk_ClockTower_WaitForDeflectionToEnd(DmStk* this, PlayState* play) {
* Updates a variety of states based on Skull Kid's current cutscene, including his current
* animation, his hand/mask type, his fade in/fade out state, and his current cutscene action.
*/
-void DmStk_UpdateCutscenes(DmStk* this, PlayState* play) {
+void DmStk_HandleCutscene(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 +1451,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 +1463,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 +1474,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 +1630,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) {
@@ -1594,9 +1643,9 @@ void DmStk_UpdateCutscenes(DmStk* this, PlayState* play) {
this->fadeInState++;
}
- this->fogR = play->lightCtx.fogColor.r * this->fogScale;
- this->fogG = play->lightCtx.fogColor.g * this->fogScale;
- this->fogB = play->lightCtx.fogColor.b * this->fogScale;
+ this->fogR = play->lightCtx.fogColor[0] * this->fogScale;
+ this->fogG = play->lightCtx.fogColor[1] * this->fogScale;
+ this->fogB = play->lightCtx.fogColor[2] * this->fogScale;
} else if (this->fadeInState == SK_FADE_IN_STATE_INCREASE_FOG) {
if (this->fogN < 996) {
this->fogN += 10;
@@ -1675,6 +1724,9 @@ void DmStk_UpdateCutscenes(DmStk* this, PlayState* play) {
this->handType = SK_HAND_TYPE_DEFAULT;
DmStk_ChangeAnim(this, play, &this->skelAnime, &sAnimationInfo[this->animIndex], 0);
break;
+
+ default:
+ break;
}
}
@@ -1714,9 +1766,9 @@ 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->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->tatlMessageTimer++;
if (this->tatlMessageTimer > 800) {
this->tatlMessageTimer = 0;
@@ -1739,9 +1791,9 @@ 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;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
if (this->animIndex == SK_ANIM_CALL_DOWN_MOON_LOOP) {
this->actor.targetArrowOffset = 3100.0f;
@@ -1780,7 +1832,7 @@ void DmStk_Update(Actor* thisx, PlayState* play) {
DmStk_UpdateCollision(this, play);
}
- DmStk_UpdateCutscenes(this, play);
+ DmStk_HandleCutscene(this, play);
DmStk_PlaySfxForCutscenes(this, play);
// This handles the cutscene where the player takes out the Deku Pipes for the first time.
@@ -1794,28 +1846,31 @@ 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;
+
+ default:
+ break;
}
// This code is responsible for making in-game time pass while using the telescope in the Astral Observatory.
// 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) &&
+ if ((play->actorCtx.flags & ACTORCTX_FLAG_1) && (play->msgCtx.msgMode != MSGMODE_NONE) &&
(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 +1879,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;
}
}
@@ -1853,6 +1908,9 @@ s32 DmStk_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
*dList = NULL;
}
break;
+
+ default:
+ break;
}
} else if (limbIndex == SKULL_KID_LIMB_HEAD) {
*dList = NULL;
@@ -1888,7 +1946,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,24 +1963,27 @@ 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);
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->objectStk2ObjectIndex].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->objectStk2ObjectIndex].segment);
- gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->objectStk2ObjectIndex].segment);
+ gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[this->objectStk2ObjectIndex].segment);
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gSkullKidMajorasMaskCurseOverlayTexAnim));
Gfx_DrawDListOpa(play, gSkullKidMajorasMaskCurseOverlayDL);
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->objectStkObjectIndex].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->objectStkObjectIndex].segment);
- gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->objectStkObjectIndex].segment);
+ gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[this->objectStkObjectIndex].segment);
Matrix_Pop();
}
break;
+
+ default:
+ break;
}
CLOSE_DISPS(play->state.gfxCtx);
@@ -1963,6 +2024,9 @@ void DmStk_PostLimbDraw2(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gSkullKidMajorasMask1DL);
break;
+
+ default:
+ break;
}
CLOSE_DISPS(play->state.gfxCtx);
@@ -2007,6 +2071,9 @@ void DmStk_PostLimbDraw2(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot
gSPDisplayList(POLY_OPA_DISP++, gSkullKidOpenLeftHand);
}
break;
+
+ default:
+ break;
}
CLOSE_DISPS(play->state.gfxCtx);
@@ -2028,15 +2095,15 @@ void DmStk_Draw(Actor* thisx, PlayState* play) {
return;
}
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->objectStkObjectIndex].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->objectStkObjectIndex].segment);
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..6eb910d2d 100644
--- a/src/overlays/actors/ovl_Dm_Tag/z_dm_tag.c
+++ b/src/overlays/actors/ovl_Dm_Tag/z_dm_tag.c
@@ -15,7 +15,7 @@ void DmTag_Destroy(Actor* thisx, PlayState* play);
void DmTag_Update(Actor* thisx, PlayState* play);
void func_80C229AC(DmTag* this, PlayState* play);
-void func_80C229EC(DmTag* this, PlayState* play);
+void DmTag_DoNothing(DmTag* this, PlayState* play);
void func_80C229FC(DmTag* this, PlayState* play);
ActorInit Dm_Tag_InitVars = {
@@ -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;
@@ -154,7 +154,7 @@ s32 func_80C224D8(DmTag* this, PlayState* play) {
break;
case 6:
- func_800B7298(play, &this->actor, 7);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_WAIT);
play->nextEntrance = ENTRANCE(STOCK_POT_INN, 5);
gSaveContext.nextCutsceneIndex = 0;
play->transitionTrigger = TRANS_TRIGGER_START;
@@ -162,13 +162,16 @@ s32 func_80C224D8(DmTag* this, PlayState* play) {
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK_SLOW;
this->unk_1A4++;
break;
+
+ default:
+ break;
}
return ret;
}
s32 func_80C227E8(DmTag* this, PlayState* play) {
if (this->unk_1A4 == 0) {
- func_800B7298(play, &this->actor, 7);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_WAIT);
play->nextEntrance = ENTRANCE(STOCK_POT_INN, 4);
gSaveContext.nextCutsceneIndex = 0;
play->transitionTrigger = TRANS_TRIGGER_START;
@@ -190,9 +193,13 @@ s32* func_80C22880(DmTag* this, PlayState* play) {
return D_80C22BF0;
}
return D_80C22C30;
+
case 2:
this->msgEventCallback = func_80C224D8;
return D_80C22BFC;
+
+ default:
+ break;
}
return NULL;
}
@@ -200,24 +207,23 @@ s32* func_80C22880(DmTag* this, PlayState* play) {
s32 func_80C2291C(DmTag* this, PlayState* play) {
s32 ret = false;
- if (this->unk_18C & 7) {
- if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- this->unk_18C |= 8;
- SubS_UpdateFlags(&this->unk_18C, 0, 7);
- this->msgEventScript = func_80C22880(this, play);
- this->actionFunc = func_80C229FC;
- ret = true;
- }
+ if (((this->unk_18C & SUBS_OFFER_MODE_MASK) != SUBS_OFFER_MODE_NONE) &&
+ Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ this->unk_18C |= 8;
+ SubS_SetOfferMode(&this->unk_18C, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
+ this->msgEventScript = func_80C22880(this, play);
+ this->actionFunc = func_80C229FC;
+ ret = true;
}
return ret;
}
void func_80C229AC(DmTag* this, PlayState* play) {
- SubS_UpdateFlags(&this->unk_18C, 3, 7);
- this->actor.flags |= ACTOR_FLAG_1;
+ SubS_SetOfferMode(&this->unk_18C, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}
-void func_80C229EC(DmTag* this, PlayState* play) {
+void DmTag_DoNothing(DmTag* this, PlayState* play) {
}
void func_80C229FC(DmTag* this, PlayState* play) {
@@ -239,13 +245,13 @@ void DmTag_Init(Actor* thisx, PlayState* play) {
player->stateFlags1 |= PLAYER_STATE1_20;
this->unk_18E = 2;
this->unk_18C = 0;
- SubS_UpdateFlags(&this->unk_18C, 4, 7);
- this->actor.flags &= ~ACTOR_FLAG_1;
- this->actionFunc = func_80C229EC;
+ SubS_SetOfferMode(&this->unk_18C, SUBS_OFFER_MODE_AUTO, SUBS_OFFER_MODE_MASK);
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ this->actionFunc = DmTag_DoNothing;
} else if (this->actor.room == 2) {
Actor_Kill(&this->actor);
} else {
- this->actor.targetMode = 1;
+ this->actor.targetMode = TARGET_MODE_1;
this->unk_18E = 1;
this->unk_18C = 0;
this->actionFunc = func_80C229AC;
@@ -260,6 +266,7 @@ void DmTag_Update(Actor* thisx, PlayState* play) {
func_80C2291C(this, play);
this->actionFunc(this, play);
- func_8013C964(&this->actor, play, 40.0f, fabsf(this->actor.playerHeightRel) + 1.0f, 0, this->unk_18C & 7);
+ SubS_Offer(&this->actor, play, 40.0f, fabsf(this->actor.playerHeightRel) + 1.0f, PLAYER_IA_NONE,
+ this->unk_18C & SUBS_OFFER_MODE_MASK);
Actor_SetFocus(&this->actor, 0.0f);
}
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..88c0f4280 100644
--- a/src/overlays/actors/ovl_Dm_Zl/z_dm_zl.c
+++ b/src/overlays/actors/ovl_Dm_Zl/z_dm_zl.c
@@ -29,16 +29,6 @@ ActorInit Dm_Zl_InitVars = {
(ActorFunc)DmZl_Draw,
};
-static AnimationInfo sAnimationInfo[] = {
- { &gDmZl4FacingAwayHandsOverEmblemLoop, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -10.0f },
- { &gDmZl4TurningAround2Anim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, -10.0f },
- { &gDmZl4HandsOverEmblemLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -10.0f },
- { &gDmZl4GivingItemStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, -10.0f },
- { &gDmZl4GivingItemLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -10.0f },
- { &gDmZl4RaisingOcarinaToPlayAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, -10.0f },
- { &gDmZl4PlayingOcarinaAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -10.0f },
-};
-
typedef enum {
/* 0 */ ZELDA_ANIM_FACING_AWAY,
/* 1 */ ZELDA_ANIM_TURNING_TOWARD_PLAYER,
@@ -47,9 +37,19 @@ 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 AnimationInfo sAnimationInfo[ZELDA_ANIM_MAX] = {
+ { &gDmZl4FacingAwayHandsOverEmblemLoop, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -10.0f }, // ZELDA_ANIM_FACING_AWAY
+ { &gDmZl4TurningAround2Anim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, -10.0f }, // ZELDA_ANIM_TURNING_TOWARD_PLAYER
+ { &gDmZl4HandsOverEmblemLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -10.0f }, // ZELDA_ANIM_FACING_PLAYER
+ { &gDmZl4GivingItemStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, -10.0f }, // ZELDA_ANIM_GIVING_OCARINA_START
+ { &gDmZl4GivingItemLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -10.0f }, // ZELDA_ANIM_GIVING_OCARINA
+ { &gDmZl4RaisingOcarinaToPlayAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, -10.0f }, // ZELDA_ANIM_PLAYING_OCARINA_START
+ { &gDmZl4PlayingOcarinaAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -10.0f }, // ZELDA_ANIM_PLAYING_OCARINA
+};
+
static TexturePtr sMouthTextures[] = {
gZl4MouthNeutralTex,
gZl4MouthOpenSmilingTex,
@@ -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,21 +92,22 @@ 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;
-/**
- * This function is always called with unusedExtraOffset = 0.
- */
-void DmZl_ChangeAnimation(SkelAnime* skelAnime, AnimationInfo animationInfo[], u16 unusedExtraOffset) {
+void DmZl_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animInfo, u16 animIndex) {
f32 endFrame;
- animationInfo += unusedExtraOffset;
- endFrame = (animationInfo->frameCount < 0.0f) ? Animation_GetLastFrame(animationInfo->animation)
- : animationInfo->frameCount;
+ animInfo += animIndex;
- Animation_Change(skelAnime, animationInfo->animation, animationInfo->playSpeed, animationInfo->startFrame, endFrame,
- animationInfo->mode, animationInfo->morphFrames);
+ if (animInfo->frameCount < 0.0f) {
+ endFrame = Animation_GetLastFrame(animInfo->animation);
+ } else {
+ endFrame = animInfo->frameCount;
+ }
+
+ Animation_Change(skelAnime, animInfo->animation, animInfo->playSpeed, animInfo->startFrame, endFrame,
+ animInfo->mode, animInfo->morphFrames);
}
void DmZl_Init(Actor* thisx, PlayState* play) {
@@ -118,8 +119,8 @@ void DmZl_Init(Actor* thisx, PlayState* play) {
this->actor.targetArrowOffset = 1000.0f;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
// these three set to NULL should mean they are dynamically allocated
- SkelAnime_InitFlex(play, &this->skelAnime, &gZl4Skeleton, NULL, NULL, NULL, 0);
- DmZl_ChangeAnimation(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gZl4Skel, NULL, NULL, NULL, 0);
+ DmZl_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
Actor_SetScale(&this->actor, 0.01f);
this->actionFunc = DmZl_DoNothing;
}
@@ -130,46 +131,50 @@ void DmZl_Destroy(Actor* thisx, PlayState* play) {
void DmZl_DoNothing(DmZl* this, PlayState* play) {
}
-void DmZl_UpdateCutscene(DmZl* this, PlayState* play) {
- s32 actionIndex;
+void DmZl_HandleCutscene(DmZl* this, PlayState* play) {
+ s32 cueChannel;
+ s32 animIndex;
- if (Cutscene_CheckActorAction(play, 0x66)) {
- actionIndex = Cutscene_GetActorActionIndex(play, 0x66);
- if (play->csCtx.frames == play->csCtx.actorActions[actionIndex]->startFrame) {
- s16 nextAnimIndex = ZELDA_ANIM_FACING_AWAY;
+ 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) {
+ animIndex = ZELDA_ANIM_FACING_AWAY;
- switch (play->csCtx.actorActions[actionIndex]->action) {
+ switch (play->csCtx.actorCues[cueChannel]->id) {
default:
case 1:
break;
+
case 2:
- nextAnimIndex = ZELDA_ANIM_TURNING_TOWARD_PLAYER;
+ animIndex = ZELDA_ANIM_TURNING_TOWARD_PLAYER;
break;
+
case 3:
- nextAnimIndex = ZELDA_ANIM_GIVING_OCARINA_START;
+ animIndex = ZELDA_ANIM_GIVING_OCARINA_START;
break;
+
case 4:
- nextAnimIndex = ZELDA_ANIM_PLAYING_OCARINA_START;
+ animIndex = ZELDA_ANIM_PLAYING_OCARINA_START;
break;
}
- if (nextAnimIndex != this->animIndex) {
- this->animIndex = nextAnimIndex;
- DmZl_ChangeAnimation(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
+ if (this->animIndex != animIndex) {
+ this->animIndex = animIndex;
+ DmZl_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- actionIndex = this->animIndex;
+ animIndex = cueChannel = this->animIndex;
- if ((actionIndex == ZELDA_ANIM_TURNING_TOWARD_PLAYER) || (actionIndex == ZELDA_ANIM_GIVING_OCARINA_START) ||
- (actionIndex == ZELDA_ANIM_PLAYING_OCARINA_START)) {
+ if ((animIndex == ZELDA_ANIM_TURNING_TOWARD_PLAYER) || (animIndex == ZELDA_ANIM_GIVING_OCARINA_START) ||
+ (animIndex == 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);
+ DmZl_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
}
}
@@ -256,7 +261,7 @@ void DmZl_Update(Actor* thisx, PlayState* play) {
DmZl_UpdateFace(this);
SkelAnime_Update(&this->skelAnime);
- DmZl_UpdateCutscene(this, play);
+ DmZl_HandleCutscene(this, play);
this->actionFunc(this, play);
}
@@ -289,7 +294,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 9086a052d..f002bc8bd 100644
--- a/src/overlays/actors/ovl_Door_Ana/z_door_ana.c
+++ b/src/overlays/actors/ovl_Door_Ana/z_door_ana.c
@@ -82,7 +82,7 @@ void DoorAna_Init(Actor* thisx, PlayState* play) {
DoorAna_SetupAction(this, DoorAna_WaitOpen);
}
- this->actor.targetMode = 0;
+ this->actor.targetMode = TARGET_MODE_0;
}
void DoorAna_Destroy(Actor* thisx, PlayState* play) {
@@ -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
}
@@ -119,10 +119,10 @@ void DoorAna_WaitClosed(DoorAna* this, PlayState* play) {
if (grottoIsOpen) {
DOORANA_SET_TYPE(&this->actor, DOORANA_TYPE_VISIBLE);
DoorAna_SetupAction(this, DoorAna_WaitOpen);
- play_sound(NA_SE_SY_CORRECT_CHIME);
+ Audio_PlaySfx(NA_SE_SY_CORRECT_CHIME);
}
- func_800B8C50(&this->actor, play);
+ Actor_SetClosestSecretDistance(&this->actor, play);
}
void DoorAna_WaitOpen(DoorAna* this, PlayState* play) {
@@ -130,9 +130,9 @@ void DoorAna_WaitOpen(DoorAna* this, PlayState* play) {
s32 grottoType = DOORANA_GET_TYPE(&this->actor);
if (Math_StepToF(&this->actor.scale.x, 0.01f, 0.001f)) {
- if ((this->actor.targetMode != 0) && (play->transitionTrigger == TRANS_TRIGGER_OFF) &&
+ if ((this->actor.targetMode != TARGET_MODE_0) && (play->transitionTrigger == TRANS_TRIGGER_OFF) &&
(play->transitionMode == TRANS_MODE_OFF) && (player->stateFlags1 & PLAYER_STATE1_80000000) &&
- (player->unk_AE7 == 0)) {
+ (player->actionVar1 == 0)) {
if (grottoType == DOORANA_TYPE_VISIBLE_SCENE_EXIT) {
s32 exitIndex = DOORANA_GET_EXIT_INDEX(&this->actor);
@@ -162,10 +162,10 @@ void DoorAna_WaitOpen(DoorAna* this, PlayState* play) {
(this->actor.xzDistToPlayer <= 20.0f) && (this->actor.playerHeightRel >= -50.0f) &&
(this->actor.playerHeightRel <= 15.0f)) {
player->stateFlags1 |= PLAYER_STATE1_80000000;
- this->actor.targetMode = 1;
+ this->actor.targetMode = TARGET_MODE_1;
} else {
- this->actor.targetMode = 0;
+ this->actor.targetMode = TARGET_MODE_0;
}
}
@@ -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 db564f3f2..5d49a16e7 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_SWITCH_FLAG(&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);
+ if ((this->requiredObjBankIndex = Object_GetSlot(&play->objectCtx, D_808A2180[sp24].objectId)) < 0) {
+ 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_SWITCH_FLAG(&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;
@@ -305,32 +307,33 @@ s32 func_808A0E28(DoorShutter* this, PlayState* play) {
}
}
}
- return false;
+ return 0;
}
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)) {
+ } else if (func_808A0E28(this, play) != 0) {
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_SWITCH_FLAG(&this->slidingDoor.dyna.actor));
if (this->doorType != 5) {
- gSaveContext.save.inventory.dungeonKeys[gSaveContext.mapIndex]--;
- Actor_PlaySfxAtPos(&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_PlaySfxAtPos(&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_PlaySfxAtPos(&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);
+ Actor_PlaySfx_Flagged(&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_PlaySfxAtPos(&this->actor, NA_SE_EV_METALDOOR_CLOSE);
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_METALDOOR_CLOSE);
} else {
- Actor_PlaySfxAtPos(&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,29 @@ 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_SWITCH_FLAG(&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)) {
+ } else if (func_808A0E28(this, play) != 0) {
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_SWITCH_FLAG(&this->slidingDoor.dyna.actor))) {
DoorShutter_SetupAction(this, func_808A1548);
} else {
func_808A1090(this, play);
@@ -498,21 +506,21 @@ void func_808A1618(DoorShutter* this, PlayState* play) {
void func_808A1684(DoorShutter* this, PlayState* play) {
f32 phi_f0;
- if ((DECR(this->unk_166) == 0) && (play->roomCtx.unk31 == 0) && func_808A1340(this, play)) {
+ if ((DECR(this->unk_166) == 0) && (play->roomCtx.status == 0) && func_808A1340(this, play)) {
if (this->doorType == 5) {
phi_f0 = 20.0f;
} else {
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_PlaySfxAtPos(&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 +529,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 +553,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 +574,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 +590,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);
+ Actor_PlaySfx_Flagged(&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 +616,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_PlaySfxAtPos(&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 +637,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 +652,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 +667,9 @@ s32 func_808A1D68(DoorShutter* this, PlayState* play) {
return true;
}
- temp_a0 = BINANG_SUB(Actor_YawToPoint(&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 +690,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..5b42db50a 100644
--- a/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.h
+++ b/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.h
@@ -2,22 +2,19 @@
#define Z_DOOR_SHUTTER_H
#include "global.h"
+#include "z64door.h"
struct DoorShutter;
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_SWITCH_FLAG(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.c b/src/overlays/actors/ovl_Door_Spiral/z_door_spiral.c
index 541e3de23..6c7d32152 100644
--- a/src/overlays/actors/ovl_Door_Spiral/z_door_spiral.c
+++ b/src/overlays/actors/ovl_Door_Spiral/z_door_spiral.c
@@ -16,58 +16,13 @@
#define THIS ((DoorSpiral*)thisx)
-typedef enum {
- /* 0 */ SPIRAL_OVERWORLD, // does not display anything as there is not a DL in GAMEPLAY_KEEP for it
- /* 1 */ SPIRAL_DUNGEON,
- /* 2 */ SPIRAL_WOODFALL_TEMPLE,
- /* 3 */ SPIRAL_WOODFALL_TEMPLE_ALT, // SPIRAL_WOODFALL_TEMPLE but with positional lights enabled?
- /* 4 */ SPIRAL_SNOWHEAD_TEMPLE,
- /* 5 */ SPIRAL_STONE_TOWER,
- /* 6 */ SPIRAL_IKANA_CASTLE,
- /* 7 */ SPIRAL_DAMPES_HOUSE
-} SpiralType;
-
-typedef enum {
- /* 0 */ SPIRAL_OBJECT_OVERWORLD,
- /* 1 */ SPIRAL_OBJECT_DUNGEON,
- /* 2 */ SPIRAL_OBJECT_WOODFALL,
- /* 3 */ SPIRAL_OBJECT_SNOWHEAD,
- /* 4 */ SPIRAL_OBJECT_STONE_TOWER,
- /* 5 */ SPIRAL_OBJECT_DAMPES_HOUSE,
- /* 6 */ SPIRAL_OBJECT_IKANA_CASTLE
-} SpiralObjectType;
-
-typedef struct {
- /* 0x00 */ Gfx* spiralDL[2]; // one displaylist for downward spiral, and one for upward
- /* 0x08 */ s32 unk8; // unused
- /* 0x0C */ u8 unkC; // unused
- /* 0x0D */ u8 unkD; // unused
- /* 0x0E */ u8 spiralWidth;
- /* 0x0F */ u8 spiralHeight;
-} SpiralInfo;
-
-// Maps SpiralObjectType to SpiralType
-typedef struct {
- /* 0x00 */ s16 objectBankId;
- /* 0x02 */ u8 spiralType;
-} SpiralObjectInfo;
-
-// Maps scenes to SpiralObjectType
-typedef struct {
- /* 0x00 */ s16 sceneId;
- /* 0x02 */ u8 objectType;
-} SpiralSceneInfo;
-
void DoorSpiral_Init(Actor* thisx, PlayState* play);
void DoorSpiral_Destroy(Actor* thisx, PlayState* play);
void DoorSpiral_Update(Actor* thisx, PlayState* play);
void DoorSpiral_Draw(Actor* thisx, PlayState* play);
-void DoorSpiral_WaitForObject(DoorSpiral* this, PlayState* play);
-void DoorSpiral_Wait(DoorSpiral* this, PlayState* play);
-void DoorSpiral_PlayerClimb(DoorSpiral* this, PlayState* play);
-
-ActorInit Door_Spiral_InitVars = {
+/*
+const ActorInit Door_Spiral_InitVars = {
ACTOR_DOOR_SPIRAL,
ACTORCAT_DOOR,
FLAGS,
@@ -76,257 +31,30 @@ ActorInit Door_Spiral_InitVars = {
(ActorFunc)DoorSpiral_Init,
(ActorFunc)DoorSpiral_Destroy,
(ActorFunc)DoorSpiral_Update,
- (ActorFunc)DoorSpiral_Draw,
+ (ActorFunc)DoorSpiral_Draw
};
+*/
-// Parameters for each staircase, indexed with SpiralType
-static SpiralInfo sSpiralInfo[] = {
- { { NULL, NULL }, 0, 130, 12, 50, 15 }, // SPIRAL_OVERWORLD
- { { gameplay_dangeon_keep_DL_0219E0, gameplay_dangeon_keep_DL_01D980 }, 0, 130, 12, 50, 15 }, // SPIRAL_DUNGEON
- { { object_numa_obj_DL_004448, object_numa_obj_DL_0007A8 }, 0, 130, 12, 50, 15 }, // SPIRAL_WOODFALL_TEMPLE
- { { object_numa_obj_DL_0051B8, object_numa_obj_DL_0014C8 }, 0, 130, 12, 50, 15 }, // SPIRAL_WOODFALL_TEMPLE_ALT
- { { object_hakugin_obj_DL_009278, object_hakugin_obj_DL_006128 }, 0, 130, 12, 50, 15 }, // SPIRAL_SNOWHEAD_TEMPLE
- { { object_ikana_obj_DL_013EA8, object_ikana_obj_DL_012B70 }, 0, 130, 12, 50, 15 }, // SPIRAL_STONE_TOWER
- { { object_ikninside_obj_DL_000EA0, object_ikninside_obj_DL_000590 }, 0, 130, 12, 50, 15 }, // SPIRAL_IKANA_CASTLE
- { { object_danpei_object_DL_002110, object_danpei_object_DL_0012C0 }, 0, 130, 12, 50, 15 }, // SPIRAL_DAMPES_HOUSE
-};
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Spiral/func_809A2B60.s")
-// Defines which object bank a staircase should use, and its index to `sSpiralInfo`
-static SpiralObjectInfo sSpiralObjectInfo[] = {
- { GAMEPLAY_KEEP, SPIRAL_OVERWORLD }, { GAMEPLAY_DANGEON_KEEP, SPIRAL_DUNGEON },
- { OBJECT_NUMA_OBJ, SPIRAL_WOODFALL_TEMPLE }, { OBJECT_HAKUGIN_OBJ, SPIRAL_SNOWHEAD_TEMPLE },
- { OBJECT_IKANA_OBJ, SPIRAL_STONE_TOWER }, { OBJECT_DANPEI_OBJECT, SPIRAL_DAMPES_HOUSE },
- { OBJECT_IKNINSIDE_OBJ, SPIRAL_IKANA_CASTLE },
-};
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Spiral/func_809A2B70.s")
-/**
- * Sets the actor's action function
- */
-void DoorSpiral_SetupAction(DoorSpiral* this, DoorSpiralActionFunc actionFunc) {
- this->actionFunc = actionFunc;
- this->unk14A = 0; // set but never used
-}
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Spiral/func_809A2BF8.s")
-/**
- * Sets this->spiralType, which is derived from `sSpiralObjectInfo`, and is used as an index to `sSpiralInfo`.
- */
-s32 DoorSpiral_SetSpiralType(DoorSpiral* this, PlayState* play) {
- SpiralObjectInfo* doorObjectInfo = &sSpiralObjectInfo[this->objectType];
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Spiral/DoorSpiral_Init.s")
- this->spiralType = doorObjectInfo->spiralType;
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Spiral/DoorSpiral_Destroy.s")
- if ((this->spiralType == SPIRAL_DAMPES_HOUSE) ||
- ((this->spiralType == SPIRAL_WOODFALL_TEMPLE) && play->roomCtx.curRoom.enablePosLights)) {
- if (this->spiralType == SPIRAL_WOODFALL_TEMPLE) {
- this->spiralType = SPIRAL_WOODFALL_TEMPLE_ALT;
- }
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Spiral/func_809A2DB0.s")
- this->actor.flags |= ACTOR_FLAG_10000000;
- }
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Spiral/func_809A2E08.s")
- DoorSpiral_SetupAction(this, DoorSpiral_Wait);
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Spiral/func_809A2EA0.s")
- return 0;
-}
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Spiral/func_809A2FF8.s")
-/**
- * Gets the object type to be used as an index to `sSpiralObjectInfo`.
- * It first checks `sSpiralSceneInfo`, but if the current scene is not found it will fall back to the default spiral
- * (overworld or dungeon).
- */
-s32 DoorSpiral_GetObjectType(PlayState* play) {
- // Defines which object type should be used for specific scenes
- static SpiralSceneInfo spiralSceneInfo[] = {
- { SCENE_MITURIN, SPIRAL_OBJECT_WOODFALL }, { SCENE_HAKUGIN, SPIRAL_OBJECT_SNOWHEAD },
- { SCENE_INISIE_N, SPIRAL_OBJECT_STONE_TOWER }, { SCENE_INISIE_R, SPIRAL_OBJECT_STONE_TOWER },
- { SCENE_DANPEI2TEST, SPIRAL_OBJECT_DAMPES_HOUSE }, { SCENE_IKNINSIDE, SPIRAL_OBJECT_IKANA_CASTLE },
- { SCENE_CASTLE, SPIRAL_OBJECT_IKANA_CASTLE },
- };
- SpiralSceneInfo* sceneInfo = spiralSceneInfo;
- s32 i;
- s32 type;
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Spiral/func_809A3098.s")
- for (i = 0; i < ARRAY_COUNT(spiralSceneInfo); sceneInfo++, i++) {
- if (play->sceneId == sceneInfo->sceneId) {
- break;
- }
- }
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Spiral/DoorSpiral_Update.s")
- type = i;
-
- if (type < ARRAY_COUNT(spiralSceneInfo)) {
- type = sceneInfo->objectType;
- } else {
- // Set the type based on if link is in a dungeon scene, or the overworld
- type = (Object_GetIndex(&play->objectCtx, GAMEPLAY_DANGEON_KEEP) >= 0) ? SPIRAL_OBJECT_DUNGEON
- : SPIRAL_OBJECT_OVERWORLD;
- }
-
- return type;
-}
-
-static InitChainEntry sInitChain[] = {
- ICHAIN_VEC3F(scale, 1, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneForward, 4000, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneScale, 400, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneDownward, 400, ICHAIN_STOP),
-};
-
-void DoorSpiral_Init(Actor* thisx, PlayState* play) {
- DoorSpiral* this = THIS;
- s32 pad;
- s32 transition = DOORSPIRAL_GET_TRANSITION_ID(thisx);
- s8 objBankId;
-
- if (this->actor.room != play->doorCtx.transitionActorList[transition].sides[0].room) {
- Actor_Kill(&this->actor);
- return;
- }
-
- Actor_ProcessInitChain(&this->actor, sInitChain);
- this->unk145 = DOORSPIRAL_GET_UNK145(thisx); // set but never used
- this->orientation = DOORSPIRAL_GET_ORIENTATION(thisx);
- this->objectType = DoorSpiral_GetObjectType(play);
- objBankId = Object_GetIndex(&play->objectCtx, sSpiralObjectInfo[this->objectType].objectBankId);
- this->bankIndex = objBankId;
-
- if (objBankId < 0) {
- Actor_Kill(&this->actor);
- return;
- }
-
- DoorSpiral_SetupAction(this, DoorSpiral_WaitForObject);
- Actor_SetFocus(&this->actor, 60.0f);
-}
-
-void DoorSpiral_Destroy(Actor* thisx, PlayState* play) {
- s32 transition = DOORSPIRAL_GET_TRANSITION_ID(thisx);
-
- play->doorCtx.transitionActorList[transition].id *= -1;
-}
-
-/**
- * Waits for the required object to be loaded.
- */
-void DoorSpiral_WaitForObject(DoorSpiral* this, PlayState* play) {
- if (Object_IsLoaded(&play->objectCtx, this->bankIndex)) {
- this->actor.objBankIndex = this->bankIndex;
- DoorSpiral_SetSpiralType(this, play);
- }
-}
-
-/**
- * Finds the distance between the stairs and the player.
- */
-f32 DoorSpiral_GetDistFromPlayer(PlayState* play, DoorSpiral* this, f32 yOffset, f32 spiralWidth, f32 spiralHeight) {
- Player* player = GET_PLAYER(play);
- Vec3f target;
- Vec3f offset;
-
- target.x = player->actor.world.pos.x;
- target.y = player->actor.world.pos.y + yOffset;
- target.z = player->actor.world.pos.z;
-
- Actor_OffsetOfPointInActorCoords(&this->actor, &offset, &target);
-
- if ((spiralWidth < fabsf(offset.x)) || (spiralHeight < fabsf(offset.y))) {
- return FLT_MAX;
- }
-
- return offset.z;
-}
-
-/**
- * Checks if the player should climb the stairs.
- */
-s32 DoorSpiral_PlayerShouldClimb(DoorSpiral* this, PlayState* play) {
- Player* player = GET_PLAYER(play);
-
- if (!Player_InCsMode(play)) {
- SpiralInfo* spiralInfo = &sSpiralInfo[this->spiralType];
- f32 dist = DoorSpiral_GetDistFromPlayer(play, this, 0.0f, spiralInfo->spiralWidth, spiralInfo->spiralHeight);
-
- if (fabsf(dist) < 64.0f) {
- s16 angle = player->actor.shape.rot.y - this->actor.shape.rot.y;
-
- if (dist > 0.0f) {
- angle = 0x8000 - angle;
- }
-
- if (ABS_ALT(angle) < 0x3000) {
- return (dist >= 0.0f) ? 1.0f : -1.0f;
- }
- }
- }
-
- return 0;
-}
-
-/**
- * Wait for the player to interact with the stairs.
- */
-void DoorSpiral_Wait(DoorSpiral* this, PlayState* play) {
- Player* player;
- s32 transition;
-
- if (this->shouldClimb) {
- DoorSpiral_SetupAction(this, DoorSpiral_PlayerClimb);
- } else if (DoorSpiral_PlayerShouldClimb(this, play)) {
- player = GET_PLAYER(play);
-
- player->doorType = PLAYER_DOORTYPE_STAIRCASE;
- player->doorDirection = this->orientation;
- player->doorActor = &this->actor;
- transition = DOORSPIRAL_GET_TRANSITION_ID(&this->actor);
- player->doorNext = ((u16)play->doorCtx.transitionActorList[transition].params) >> 10;
-
- func_80122F28(player);
- }
-}
-
-/**
- * Player is climbing the stairs.
- */
-void DoorSpiral_PlayerClimb(DoorSpiral* this, PlayState* play) {
- Player* player = GET_PLAYER(play);
-
- if (!(player->stateFlags1 & PLAYER_STATE1_20000000)) {
- DoorSpiral_SetupAction(this, DoorSpiral_WaitForObject);
- this->shouldClimb = 0;
- }
-}
-
-void DoorSpiral_Update(Actor* thisx, PlayState* play) {
- DoorSpiral* this = THIS;
- s32 pad;
- Player* player = GET_PLAYER(play);
-
- if (!(player->stateFlags1 & (PLAYER_STATE1_40 | PLAYER_STATE1_80 | PLAYER_STATE1_400 | PLAYER_STATE1_10000000)) ||
- (this->actionFunc == DoorSpiral_WaitForObject)) {
- this->actionFunc(this, play);
- }
-}
-
-void DoorSpiral_Draw(Actor* thisx, PlayState* play) {
- s32 pad;
- DoorSpiral* this = THIS;
-
- if (this->actor.objBankIndex == this->bankIndex) {
- SpiralInfo* spiralInfo = &sSpiralInfo[this->spiralType];
- Gfx* dList;
-
- // Set the model to render based on the orientation of the stairs (upward or downward)
- dList = spiralInfo->spiralDL[this->orientation];
-
- if (dList != NULL) {
- OPEN_DISPS(play->state.gfxCtx);
-
- func_8012C28C(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++, spiralInfo->spiralDL[this->orientation]);
-
- CLOSE_DISPS(play->state.gfxCtx);
- }
- }
-}
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Spiral/DoorSpiral_Draw.s")
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 0f3e32a39..af4f27aea 100644
--- a/src/overlays/actors/ovl_Door_Spiral/z_door_spiral.h
+++ b/src/overlays/actors/ovl_Door_Spiral/z_door_spiral.h
@@ -5,22 +5,10 @@
struct DoorSpiral;
-#define DOORSPIRAL_GET_ORIENTATION(thisx) (((thisx)->params >> 7) & 0x1)
-#define DOORSPIRAL_GET_UNK145(thisx) (((thisx)->params >> 8) & 0x3)
-#define DOORSPIRAL_GET_TRANSITION_ID(thisx) ((u16)(thisx)->params >> 10)
-
-typedef void (*DoorSpiralActionFunc)(struct DoorSpiral*, PlayState*);
-
typedef struct DoorSpiral {
/* 0x000 */ Actor actor;
- /* 0x144 */ u8 shouldClimb; // Flag used to determine if the player should climb the stairs
- /* 0x145 */ u8 unk145;
- /* 0x146 */ u8 orientation; // Upward or downward staircase
- /* 0x147 */ u8 objectType; // Index to list of objects
- /* 0x148 */ u8 spiralType; // Type of skin the staircase should use
- /* 0x149 */ s8 bankIndex; // Object bank to use
- /* 0x14A */ s8 unk14A;
- /* 0x14C */ DoorSpiralActionFunc actionFunc;
+ /* 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 7ec2245d7..ec1480a67 100644
--- a/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
+++ b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
@@ -4,6 +4,7 @@
* Description: Blue warp portal and crystal, and the Majora's Mask-shaped boss warp platform
*/
+#include "prevent_bss_reordering.h"
#include "z_door_warp1.h"
#include "objects/object_warp1/object_warp1.h"
@@ -46,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,
@@ -177,10 +178,9 @@ void DoorWarp1_Destroy(Actor* thisx, PlayState* play) {
LightContext_RemoveLight(play, &play->lightCtx, this->unk_1DC);
LightContext_RemoveLight(play, &play->lightCtx, this->unk_1F0);
- for (i = 0; i < ARRAY_COUNT(play->envCtx.lightSettings.diffuseColor1); i++) {
- play->envCtx.lightSettings.diffuseColor1[i] = 0;
- play->envCtx.lightSettings.fogColor[i] = play->envCtx.lightSettings.diffuseColor1[i];
- play->envCtx.lightSettings.ambientColor[i] = play->envCtx.lightSettings.diffuseColor1[i];
+ for (i = 0; i < ARRAY_COUNT(play->envCtx.adjLightSettings.light1Color); i++) {
+ play->envCtx.adjLightSettings.ambientColor[i] = play->envCtx.adjLightSettings.fogColor[i] =
+ play->envCtx.adjLightSettings.light1Color[i] = 0;
}
if (this->unk_1D3 != 0) {
@@ -279,15 +279,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;
}
}
@@ -328,7 +328,7 @@ void func_808B90CC(DoorWarp1* this, PlayState* play) {
DoorWarp1_SetupAction(this, func_808B921C);
}
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_WARP_HOLE_ENERGY - SFX_FLAG);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_WARP_HOLE_ENERGY - SFX_FLAG);
}
void func_808B921C(DoorWarp1* this, PlayState* play) {
@@ -344,12 +344,12 @@ 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);
}
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_BOSS_WARP_HOLE - SFX_FLAG);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_BOSS_WARP_HOLE - SFX_FLAG);
}
void func_808B93A0(DoorWarp1* this, PlayState* play) {
@@ -357,37 +357,37 @@ void func_808B93A0(DoorWarp1* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
if (play->msgCtx.choiceIndex == 0) {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_9);
player->unk_3A0.x = this->dyna.actor.world.pos.x;
player->unk_3A0.z = this->dyna.actor.world.pos.z;
this->unk_1CA = 1;
DoorWarp1_SetupAction(this, func_808B9524);
} else {
- func_8019F230();
- func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_6);
+ Audio_PlaySfx_MessageCancel();
+ func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_END);
DoorWarp1_SetupAction(this, func_808B94A4);
}
}
func_808BB8D4(this, play, 1);
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_BOSS_WARP_HOLE - SFX_FLAG);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_BOSS_WARP_HOLE - SFX_FLAG);
}
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);
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_BOSS_WARP_HOLE - SFX_FLAG);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_BOSS_WARP_HOLE - SFX_FLAG);
}
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);
}
}
@@ -415,14 +415,14 @@ void func_808B958C(DoorWarp1* this, PlayState* play) {
}
Math_SmoothStepToF(&this->unk_1A8, 6.0f, 0.2f, 0.02f, 0.01f);
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_LINK_WARP - SFX_FLAG);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_LINK_WARP - SFX_FLAG);
}
void func_808B96A0(DoorWarp1* this, PlayState* play) {
}
void func_808B96B0(DoorWarp1* this, PlayState* play) {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_WARP_HOLE - SFX_FLAG);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_WARP_HOLE - SFX_FLAG);
Math_SmoothStepToF(&this->unk_1B0, 255.0f, 0.4f, 10.0f, 0.01f);
Math_SmoothStepToF(&this->unk_1B4, 255.0f, 0.4f, 10.0f, 0.01f);
@@ -442,7 +442,7 @@ void func_808B96B0(DoorWarp1* this, PlayState* play) {
}
void func_808B977C(DoorWarp1* this, PlayState* play) {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_WARP_HOLE - SFX_FLAG);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_WARP_HOLE - SFX_FLAG);
if (func_808B866C(this, play) && !Play_InCsMode(play)) {
Player* player = GET_PLAYER(play);
@@ -457,10 +457,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);
}
}
@@ -515,7 +515,7 @@ void func_808B9B30(DoorWarp1* this, PlayState* play) {
}
void func_808B9BE8(DoorWarp1* this, PlayState* play) {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_WARP_HOLE - SFX_FLAG);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_WARP_HOLE - SFX_FLAG);
Math_SmoothStepToF(&this->unk_1B0, 255.0f, 0.2f, 2.0f, 0.1f);
Math_SmoothStepToF(&this->unk_1B4, 255.0f, 0.2f, 2.0f, 0.1f);
if (this->unk_1C4 < 10) {
@@ -547,34 +547,37 @@ void func_808B9CE8(DoorWarp1* this, PlayState* play) {
}
if (!Actor_HasParent(&this->dyna.actor, play)) {
- Actor_PickUp(&this->dyna.actor, play, (GI_REMAINS_ODOLWA - 1) + func_808B849C(this, play), 30.0f, 80.0f);
+ Actor_OfferGetItem(&this->dyna.actor, play, (GI_REMAINS_ODOLWA - 1) + func_808B849C(this, play), 30.0f, 80.0f);
return;
}
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);
}
@@ -594,7 +597,7 @@ void func_808B9ED8(DoorWarp1* this, PlayState* play) {
}
void func_808B9F10(DoorWarp1* this, PlayState* play) {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_WARP_HOLE - SFX_FLAG);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_WARP_HOLE - SFX_FLAG);
if ((this->unk_203 == 0) && func_808B866C(this, play) && !Play_InCsMode(play) && (this->unk_203 == 0)) {
Player* player = GET_PLAYER(play);
@@ -616,10 +619,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),
@@ -637,7 +640,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) {
@@ -652,24 +655,24 @@ void func_808BA10C(DoorWarp1* this, PlayState* play) {
if (this->unk_202 != 0) {
if (phi_v0_2 > 0) {
- SET_WEEKEVENTREG(WEEKEVENTREG_07_80);
+ SET_WEEKEVENTREG(WEEKEVENTREG_ENTERED_WOODFALL_TEMPLE_PRISON);
}
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:
@@ -710,8 +713,9 @@ void func_808BA10C(DoorWarp1* this, PlayState* play) {
} else {
switch (phi_v0_2) {
case 0:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_20_02)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_07_80);
+ 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);
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_WHITE;
@@ -726,7 +730,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;
@@ -734,14 +738,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;
@@ -751,7 +755,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;
@@ -776,7 +780,6 @@ void func_808BA550(DoorWarp1* this, PlayState* play) {
Player* player2 = GET_PLAYER(play);
Player* player = GET_PLAYER(play);
s16 i;
- s32 temp_f16;
f32 temp_f0;
f32 temp_f2;
s32 temp;
@@ -808,6 +811,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;
@@ -861,16 +867,13 @@ void func_808BA550(DoorWarp1* this, PlayState* play) {
if (1) {}
temp_f0 = 1.0f - ((f32)(D_808BC000 - this->unk_1D0) / ((D_808BC000 - tempS) + 100));
if (temp_f0 > 0.0f) {
- temp_f16 = -255.0f * temp_f0;
-
- for (i = 0; i < 3; i++) {
- play->envCtx.lightSettings.diffuseColor1[i] = temp_f16;
- play->envCtx.lightSettings.fogColor[i] = temp_f16;
- play->envCtx.lightSettings.ambientColor[i] = temp_f16;
+ for (i = 0; i < ARRAY_COUNT(play->envCtx.adjLightSettings.light1Color); i++) {
+ play->envCtx.adjLightSettings.ambientColor[i] = play->envCtx.adjLightSettings.fogColor[i] =
+ play->envCtx.adjLightSettings.light1Color[i] = -255.0f * temp_f0;
}
- play->envCtx.lightSettings.fogNear = -500.0f * temp_f0;
- if (play->envCtx.lightSettings.fogNear < -300) {
+ play->envCtx.adjLightSettings.fogNear = -500.0f * temp_f0;
+ if (play->envCtx.adjLightSettings.fogNear < -300) {
play->roomCtx.curRoom.segment = NULL;
}
}
@@ -878,7 +881,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;
@@ -889,14 +892,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);
}
}
}
@@ -911,10 +914,10 @@ void DoorWarp1_Update(Actor* thisx, PlayState* play) {
this->unk_204 = 1.0f;
}
- if ((this->unk_1A0 != NULL) && (this->unk_1A0->unk_15C != this->unk_204)) {
+ if ((this->unk_1A0 != NULL) && (this->unk_1A0->unk15C != this->unk_204)) {
this->unk_1A0->actor.world.pos.y = this->dyna.actor.world.pos.y;
- this->unk_1A0->unk_158 = this->dyna.actor.world.pos.y;
- this->unk_1A0->unk_15C = this->unk_204;
+ this->unk_1A0->unk158 = this->dyna.actor.world.pos.y;
+ this->unk_1A0->unk15C = this->unk_204;
}
this->actionFunc(this, play);
@@ -929,7 +932,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);
@@ -967,7 +970,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);
@@ -1057,7 +1060,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);
@@ -1074,7 +1077,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..470f9b89d 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,8 +80,8 @@ void func_80A4C5CC(EffChange* this, PlayState* play) {
if (func_80183DE0(&this->skeletonInfo)) {
Actor_Kill(&this->actor);
- ActorCutscene_Stop(0x7B);
- func_800FD2B4(play, 0.0f, 850.0f, 0.2f, 0.0f);
+ CutsceneManager_Stop(CS_ID_GLOBAL_ELEGY);
+ Environment_AdjustLights(play, 0.0f, 850.0f, 0.2f, 0.0f);
return;
}
@@ -108,12 +108,12 @@ void func_80A4C5CC(EffChange* this, PlayState* play) {
} else if (phi_fv0 < 0.0f) {
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);
+ Environment_AdjustLights(play, phi_fv0, 850.0f, 0.2f, 0.0f);
+ 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 75ff275a1..ee493fe24 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,15 +81,15 @@ 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;
sVtxAlpha = 255;
this->actor.shape.rot.x = 0;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_TORTOISE_WAKE_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_TORTOISE_WAKE_UP);
}
} else {
this->actor.draw = NULL;
@@ -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;
@@ -154,13 +153,13 @@ void EffKamejimaWave_Draw(Actor* thisx, PlayState* play) {
Color_RGBA8 primColor;
Color_RGBA8 envColor;
- func_800FE7A8(sPrimColors, &primColor);
- func_800FE7A8(sEnvColors, &envColor);
+ Environment_LerpSandstormColors(sPrimColors, &primColor);
+ Environment_LerpSandstormColors(sEnvColors, &envColor);
EffKamejimaWave_SetVtxAlpha(sVtxAlpha);
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 0041f1e99..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;
@@ -195,7 +195,7 @@ void func_80BEBF78(EffLastday* this, PlayState* play) {
case EFFLASTDAY_ACTION_2:
if (!this->actor.home.rot.z) {
this->actor.home.rot.z = true;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_COMING_FIRE);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_COMING_FIRE);
}
this->actor.draw = EffLastday_Draw;
if (this->alpha < 255) {
@@ -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..c8127a98f 100644
--- a/src/overlays/actors/ovl_Eff_Zoraband/z_eff_zoraband.c
+++ b/src/overlays/actors/ovl_Eff_Zoraband/z_eff_zoraband.c
@@ -43,19 +43,19 @@ 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;
}
}
if ((this->actor.home.rot.z != 0) && (this->actor.draw != NULL)) {
- func_800B9010(&this->actor, NA_SE_EV_UFO_LIGHT_BEAM - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_UFO_LIGHT_BEAM - SFX_FLAG);
}
if (this->stateFlags & 2) {
if (this->alpha < 240) {
@@ -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..f2089ca03 100644
--- a/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.c
+++ b/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.c
@@ -43,25 +43,25 @@ s32 func_8092DF9C(ElfMsg* this, PlayState* play) {
if ((this->actor.home.rot.y > 0) && (this->actor.home.rot.y < 0x81) &&
(Flags_GetSwitch(play, this->actor.home.rot.y - 1))) {
(void)"共倒れ"; // "Collapse together"
- if (ELFMSG_GET_SWITCHFLAG(&this->actor) != 0x7F) {
- Flags_SetSwitch(play, ELFMSG_GET_SWITCHFLAG(&this->actor));
+ if (ELFMSG_GET_SWITCH_FLAG(&this->actor) != 0x7F) {
+ Flags_SetSwitch(play, ELFMSG_GET_SWITCH_FLAG(&this->actor));
}
Actor_Kill(&this->actor);
return true;
}
if (this->actor.home.rot.y == 0x81) {
if (Flags_GetClear(play, this->actor.room)) {
- if (ELFMSG_GET_SWITCHFLAG(&this->actor) != 0x7F) {
- Flags_SetSwitch(play, ELFMSG_GET_SWITCHFLAG(&this->actor));
+ if (ELFMSG_GET_SWITCH_FLAG(&this->actor) != 0x7F) {
+ Flags_SetSwitch(play, ELFMSG_GET_SWITCH_FLAG(&this->actor));
}
Actor_Kill(&this->actor);
return true;
}
}
- if (ELFMSG_GET_SWITCHFLAG(&this->actor) == 0x7F) {
+ if (ELFMSG_GET_SWITCH_FLAG(&this->actor) == 0x7F) {
return false;
}
- if (Flags_GetSwitch(play, ELFMSG_GET_SWITCHFLAG(&this->actor))) {
+ if (Flags_GetSwitch(play, ELFMSG_GET_SWITCH_FLAG(&this->actor))) {
(void)"共倒れ"; // "Collapse together"
Actor_Kill(&this->actor);
return true;
@@ -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);
}
}
}
@@ -136,8 +136,8 @@ void ElfMsg_Update(Actor* thisx, PlayState* play) {
if (func_8092DF9C(this, play) == 0) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- if (ELFMSG_GET_SWITCHFLAG(thisx) != 0x7F) {
- Flags_SetSwitch(play, ELFMSG_GET_SWITCHFLAG(thisx));
+ if (ELFMSG_GET_SWITCH_FLAG(thisx) != 0x7F) {
+ Flags_SetSwitch(play, ELFMSG_GET_SWITCH_FLAG(thisx));
}
Actor_Kill(&this->actor);
return;
diff --git a/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.h b/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.h
index 51a3ddda3..b512af2de 100644
--- a/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.h
+++ b/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.h
@@ -4,7 +4,7 @@
#include "global.h"
#define ELFMSG_GET_FF(thisx) ((thisx)->params & 0xFF)
-#define ELFMSG_GET_SWITCHFLAG(thisx) (((thisx)->params & 0x7F00) >> 8)
+#define ELFMSG_GET_SWITCH_FLAG(thisx) (((thisx)->params & 0x7F00) >> 8)
#define ELFMSG_GET_8000(thisx) ((thisx)->params & 0x8000)
struct ElfMsg;
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..552478ace 100644
--- a/src/overlays/actors/ovl_Elf_Msg2/z_elf_msg2.c
+++ b/src/overlays/actors/ovl_Elf_Msg2/z_elf_msg2.c
@@ -43,8 +43,8 @@ s32 func_8096EC4C(ElfMsg2* this, PlayState* play) {
if ((this->actor.home.rot.y > 0) && (this->actor.home.rot.y < 0x81) &&
(Flags_GetSwitch(play, this->actor.home.rot.y - 1))) {
(void)"共倒れ"; // "Collapse together"
- if (ELFMSG2_GET_SWITCHFLAG(&this->actor) != 0x7F) {
- Flags_SetSwitch(play, ELFMSG2_GET_SWITCHFLAG(&this->actor));
+ if (ELFMSG2_GET_SWITCH_FLAG(&this->actor) != 0x7F) {
+ Flags_SetSwitch(play, ELFMSG2_GET_SWITCH_FLAG(&this->actor));
}
Actor_Kill(&this->actor);
return true;
@@ -53,17 +53,17 @@ s32 func_8096EC4C(ElfMsg2* this, PlayState* play) {
if (Flags_GetClear(play, this->actor.room)) {
(void)"共倒れ2"; // "Collapse 2"
- if (ELFMSG2_GET_SWITCHFLAG(&this->actor) != 0x7F) {
- Flags_SetSwitch(play, ELFMSG2_GET_SWITCHFLAG(&this->actor));
+ if (ELFMSG2_GET_SWITCH_FLAG(&this->actor) != 0x7F) {
+ Flags_SetSwitch(play, ELFMSG2_GET_SWITCH_FLAG(&this->actor));
}
Actor_Kill(&this->actor);
return true;
}
}
- if (ELFMSG2_GET_SWITCHFLAG(&this->actor) == 0x7F) {
+ if (ELFMSG2_GET_SWITCH_FLAG(&this->actor) == 0x7F) {
return false;
}
- if (Flags_GetSwitch(play, ELFMSG2_GET_SWITCHFLAG(&this->actor))) {
+ if (Flags_GetSwitch(play, ELFMSG2_GET_SWITCH_FLAG(&this->actor))) {
(void)"共倒れ"; // "Collapse together"
Actor_Kill(&this->actor);
return true;
@@ -83,7 +83,7 @@ void ElfMsg2_Init(Actor* thisx, PlayState* play) {
ElfMsg2_SetupAction(this, func_8096EFD0);
} else {
ElfMsg2_SetupAction(this, func_8096EF98);
- this->actor.flags |= (ACTOR_FLAG_40000 | ACTOR_FLAG_1);
+ this->actor.flags |= (ACTOR_FLAG_40000 | ACTOR_FLAG_TARGETABLE);
this->actor.textId = func_8096EE50(this);
}
this->actor.shape.rot.z = 0;
@@ -100,29 +100,29 @@ 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);
}
}
if (this->actor.home.rot.z != 1) {
Actor_Kill(&this->actor);
- if (ELFMSG2_GET_SWITCHFLAG(&this->actor) != 0x7F) {
- Flags_SetSwitch(play, ELFMSG2_GET_SWITCHFLAG(&this->actor));
+ if (ELFMSG2_GET_SWITCH_FLAG(&this->actor) != 0x7F) {
+ Flags_SetSwitch(play, ELFMSG2_GET_SWITCH_FLAG(&this->actor));
}
return;
}
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);
}
}
}
@@ -137,7 +137,7 @@ void func_8096EFD0(ElfMsg2* this, PlayState* play) {
if ((this->actor.home.rot.y < 0) && (this->actor.home.rot.y >= -0x80) &&
(Flags_GetSwitch(play, -this->actor.home.rot.y - 1))) {
ElfMsg2_SetupAction(this, func_8096EF98);
- this->actor.flags |= (ACTOR_FLAG_40000 | ACTOR_FLAG_1);
+ this->actor.flags |= (ACTOR_FLAG_40000 | ACTOR_FLAG_TARGETABLE);
this->actor.textId = func_8096EE50(this);
}
}
diff --git a/src/overlays/actors/ovl_Elf_Msg2/z_elf_msg2.h b/src/overlays/actors/ovl_Elf_Msg2/z_elf_msg2.h
index 4d9583d20..aa717800b 100644
--- a/src/overlays/actors/ovl_Elf_Msg2/z_elf_msg2.h
+++ b/src/overlays/actors/ovl_Elf_Msg2/z_elf_msg2.h
@@ -3,7 +3,7 @@
#include "global.h"
-#define ELFMSG2_GET_SWITCHFLAG(thisx) (((thisx)->params >> 8) & 0x7F)
+#define ELFMSG2_GET_SWITCH_FLAG(thisx) (((thisx)->params >> 8) & 0x7F)
#define ELFMSG2_GET_FF(thisx) ((thisx)->params & 0xFF)
struct ElfMsg2;
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..b7b349dfe 100644
--- a/src/overlays/actors/ovl_Elf_Msg3/z_elf_msg3.c
+++ b/src/overlays/actors/ovl_Elf_Msg3/z_elf_msg3.c
@@ -42,25 +42,25 @@ s32 func_80A2CD1C(ElfMsg3* this, PlayState* play) {
if ((this->actor.home.rot.y > 0) && (this->actor.home.rot.y < 0x81) &&
(Flags_GetSwitch(play, this->actor.home.rot.y - 1))) {
(void)"共倒れ"; // "Collapse together"
- if (ELFMSG3_GET_SWITCH(&this->actor) != 0x7F) {
- Flags_SetSwitch(play, ELFMSG3_GET_SWITCH(&this->actor));
+ if (ELFMSG3_GET_SWITCH_FLAG(&this->actor) != 0x7F) {
+ Flags_SetSwitch(play, ELFMSG3_GET_SWITCH_FLAG(&this->actor));
}
Actor_Kill(&this->actor);
return true;
}
if (this->actor.home.rot.y == 0x81) {
if (Flags_GetClear(play, this->actor.room)) {
- if (ELFMSG3_GET_SWITCH(&this->actor) != 0x7F) {
- Flags_SetSwitch(play, ELFMSG3_GET_SWITCH(&this->actor));
+ if (ELFMSG3_GET_SWITCH_FLAG(&this->actor) != 0x7F) {
+ Flags_SetSwitch(play, ELFMSG3_GET_SWITCH_FLAG(&this->actor));
}
Actor_Kill(&this->actor);
return true;
}
}
- if (ELFMSG3_GET_SWITCH(&this->actor) == 0x7F) {
+ if (ELFMSG3_GET_SWITCH_FLAG(&this->actor) == 0x7F) {
return false;
}
- if (Flags_GetSwitch(play, ELFMSG3_GET_SWITCH(&this->actor))) {
+ if (Flags_GetSwitch(play, ELFMSG3_GET_SWITCH_FLAG(&this->actor))) {
(void)"共倒れ"; // "Collapse together"
Actor_Kill(&this->actor);
return true;
@@ -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);
}
}
}
@@ -134,8 +134,8 @@ void ElfMsg3_Update(Actor* thisx, PlayState* play) {
if (!func_80A2CD1C(this, play)) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- if (ELFMSG3_GET_SWITCH(thisx) != 0x7F) {
- Flags_SetSwitch(play, ELFMSG3_GET_SWITCH(thisx));
+ if (ELFMSG3_GET_SWITCH_FLAG(thisx) != 0x7F) {
+ Flags_SetSwitch(play, ELFMSG3_GET_SWITCH_FLAG(thisx));
}
Actor_Kill(&this->actor);
return;
diff --git a/src/overlays/actors/ovl_Elf_Msg3/z_elf_msg3.h b/src/overlays/actors/ovl_Elf_Msg3/z_elf_msg3.h
index 615cde1eb..6b1c24671 100644
--- a/src/overlays/actors/ovl_Elf_Msg3/z_elf_msg3.h
+++ b/src/overlays/actors/ovl_Elf_Msg3/z_elf_msg3.h
@@ -3,7 +3,7 @@
#include "global.h"
-#define ELFMSG3_GET_SWITCH(thisx) (((thisx)->params & 0x7F00) >> 8)
+#define ELFMSG3_GET_SWITCH_FLAG(thisx) (((thisx)->params & 0x7F00) >> 8)
#define ELFMSG3_GET_FF(thisx) ((thisx)->params & 0xFF)
#define ELFMSG3_GET_8000(thisx) ((thisx)->params & 0x8000)
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..423f8c351 100644
--- a/src/overlays/actors/ovl_Elf_Msg4/z_elf_msg4.c
+++ b/src/overlays/actors/ovl_Elf_Msg4/z_elf_msg4.c
@@ -43,25 +43,25 @@ s32 func_80AFD380(ElfMsg4* this, PlayState* play) {
if ((this->actor.home.rot.y > 0) && (this->actor.home.rot.y < 0x81) &&
(Flags_GetSwitch(play, this->actor.home.rot.y - 1))) {
(void)"共倒れ"; // "Collapse together"
- if (ELFMSG4_GET_SWITCHFLAG(&this->actor) != 0x7F) {
- Flags_SetSwitch(play, ELFMSG4_GET_SWITCHFLAG(&this->actor));
+ if (ELFMSG4_GET_SWITCH_FLAG(&this->actor) != 0x7F) {
+ Flags_SetSwitch(play, ELFMSG4_GET_SWITCH_FLAG(&this->actor));
}
Actor_Kill(&this->actor);
return true;
}
if (this->actor.home.rot.y == 0x81) {
if (Flags_GetClear(play, this->actor.room)) {
- if (ELFMSG4_GET_SWITCHFLAG(&this->actor) != 0x7F) {
- Flags_SetSwitch(play, ELFMSG4_GET_SWITCHFLAG(&this->actor));
+ if (ELFMSG4_GET_SWITCH_FLAG(&this->actor) != 0x7F) {
+ Flags_SetSwitch(play, ELFMSG4_GET_SWITCH_FLAG(&this->actor));
}
Actor_Kill(&this->actor);
return true;
}
}
- if (ELFMSG4_GET_SWITCHFLAG(&this->actor) == 0x7F) {
+ if (ELFMSG4_GET_SWITCH_FLAG(&this->actor) == 0x7F) {
return false;
}
- if (Flags_GetSwitch(play, ELFMSG4_GET_SWITCHFLAG(&this->actor))) {
+ if (Flags_GetSwitch(play, ELFMSG4_GET_SWITCH_FLAG(&this->actor))) {
(void)"共倒れ"; // "Collapse together"
Actor_Kill(&this->actor);
return true;
@@ -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;
@@ -160,9 +160,9 @@ void ElfMsg4_Update(Actor* thisx, PlayState* play) {
return;
}
- if ((bgActor != NULL) && (Actor_ProcessTalkRequest(bgActor, &play->state))) {
- if (ELFMSG4_GET_SWITCHFLAG(thisx) != 0x7F) {
- Flags_SetSwitch(play, ELFMSG4_GET_SWITCHFLAG(thisx));
+ if ((bgActor != NULL) && Actor_ProcessTalkRequest(bgActor, &play->state)) {
+ if (ELFMSG4_GET_SWITCH_FLAG(thisx) != 0x7F) {
+ Flags_SetSwitch(play, ELFMSG4_GET_SWITCH_FLAG(thisx));
}
Actor_Kill(&this->actor);
return;
diff --git a/src/overlays/actors/ovl_Elf_Msg4/z_elf_msg4.h b/src/overlays/actors/ovl_Elf_Msg4/z_elf_msg4.h
index e9ccbc906..1e4b78f29 100644
--- a/src/overlays/actors/ovl_Elf_Msg4/z_elf_msg4.h
+++ b/src/overlays/actors/ovl_Elf_Msg4/z_elf_msg4.h
@@ -3,7 +3,7 @@
#include "global.h"
-#define ELFMSG4_GET_SWITCHFLAG(thisx) (((thisx)->params & 0x7F00) >> 8)
+#define ELFMSG4_GET_SWITCH_FLAG(thisx) (((thisx)->params & 0x7F00) >> 8)
#define ELFMSG4_GET_8000(thisx) ((thisx)->params & 0x8000)
#define ELFMSG4_GET_TEXT(thisx) ((thisx)->params & 0xFF)
diff --git a/src/overlays/actors/ovl_Elf_Msg5/z_elf_msg5.c b/src/overlays/actors/ovl_Elf_Msg5/z_elf_msg5.c
index db97a0f74..c44ab8e0a 100644
--- a/src/overlays/actors/ovl_Elf_Msg5/z_elf_msg5.c
+++ b/src/overlays/actors/ovl_Elf_Msg5/z_elf_msg5.c
@@ -38,8 +38,8 @@ s32 func_80AFD990(ElfMsg5* this, PlayState* play) {
if ((this->actor.home.rot.y > 0) && (this->actor.home.rot.y < 0x81) &&
(Flags_GetSwitch(play, this->actor.home.rot.y - 1))) {
(void)"共倒れ"; // Collapse together
- if (ELFMSG5_GET_SWITCHFLAG(&this->actor) != 0x7F) {
- Flags_SetSwitch(play, ELFMSG5_GET_SWITCHFLAG(&this->actor));
+ if (ELFMSG5_GET_SWITCH_FLAG(&this->actor) != 0x7F) {
+ Flags_SetSwitch(play, ELFMSG5_GET_SWITCH_FLAG(&this->actor));
}
Actor_Kill(&this->actor);
return true;
@@ -47,17 +47,17 @@ s32 func_80AFD990(ElfMsg5* this, PlayState* play) {
if (this->actor.home.rot.y == 0x81) {
if (Flags_GetClear(play, this->actor.room)) {
(void)"共倒れ2"; // Collapse 2
- if (ELFMSG5_GET_SWITCHFLAG(&this->actor) != 0x7F) {
- Flags_SetSwitch(play, ELFMSG5_GET_SWITCHFLAG(&this->actor));
+ if (ELFMSG5_GET_SWITCH_FLAG(&this->actor) != 0x7F) {
+ Flags_SetSwitch(play, ELFMSG5_GET_SWITCH_FLAG(&this->actor));
}
Actor_Kill(&this->actor);
return true;
}
}
- if (ELFMSG5_GET_SWITCHFLAG(&this->actor) == 0x7F) {
+ if (ELFMSG5_GET_SWITCH_FLAG(&this->actor) == 0x7F) {
return false;
}
- if (Flags_GetSwitch(play, ELFMSG5_GET_SWITCHFLAG(&this->actor))) {
+ if (Flags_GetSwitch(play, ELFMSG5_GET_SWITCH_FLAG(&this->actor))) {
(void)"共倒れ"; // Collapse together
Actor_Kill(&this->actor);
return true;
diff --git a/src/overlays/actors/ovl_Elf_Msg5/z_elf_msg5.h b/src/overlays/actors/ovl_Elf_Msg5/z_elf_msg5.h
index 36daecca1..e1e54ca64 100644
--- a/src/overlays/actors/ovl_Elf_Msg5/z_elf_msg5.h
+++ b/src/overlays/actors/ovl_Elf_Msg5/z_elf_msg5.h
@@ -3,7 +3,7 @@
#include "global.h"
-#define ELFMSG5_GET_SWITCHFLAG(thisx) (((thisx)->params >> 8) & 0x7F)
+#define ELFMSG5_GET_SWITCH_FLAG(thisx) (((thisx)->params >> 8) & 0x7F)
#define ELFMSG5_GET_FF(thisx) ((thisx)->params & 0xFF)
struct ElfMsg5;
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 0ffb5c758..4c565fdf8 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_SWITCH_FLAG(&this->actor) != 0x7F) &&
+ Flags_GetSwitch(play, ELFMSG6_SWITCH_FLAG(&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;
}
@@ -178,12 +178,12 @@ void ElfMsg6_Init(Actor* thisx, PlayState* play) {
break;
case 2:
- if (INV_CONTENT(ITEM_OCARINA) == ITEM_OCARINA) {
+ if (INV_CONTENT(ITEM_OCARINA_OF_TIME) == ITEM_OCARINA_OF_TIME) {
Actor_Kill(&this->actor);
return;
}
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_08_40)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLOCK_TOWER_OPENED)) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_88_20)) {
Actor_Kill(&this->actor);
return;
@@ -200,8 +200,8 @@ void ElfMsg6_Init(Actor* thisx, PlayState* play) {
break;
case 3:
- if (((ELFMSG6_SWITCHFLAG(&this->actor) != 0x7F) &&
- Flags_GetSwitch(play, ELFMSG6_SWITCHFLAG(&this->actor))) ||
+ if (((ELFMSG6_SWITCH_FLAG(&this->actor) != 0x7F) &&
+ Flags_GetSwitch(play, ELFMSG6_SWITCH_FLAG(&this->actor))) ||
CHECK_WEEKEVENTREG(WEEKEVENTREG_88_10) || CHECK_WEEKEVENTREG(WEEKEVENTREG_91_01) ||
(INV_CONTENT(ITEM_MASK_ZORA) == ITEM_MASK_ZORA)) {
Actor_Kill(&this->actor);
@@ -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;
}
}
}
@@ -276,14 +276,14 @@ void func_80BA1CF8(ElfMsg6* this, PlayState* play) {
return;
}
- if ((this->actor.textId == 0x224) && CHECK_WEEKEVENTREG(WEEKEVENTREG_08_40)) {
+ if ((this->actor.textId == 0x224) && CHECK_WEEKEVENTREG(WEEKEVENTREG_CLOCK_TOWER_OPENED)) {
this->actor.textId = 0x25B;
- } else if (func_80BA1C00(this) && (player->actor.speedXZ > 1.0f)) {
+ } 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;
}
}
}
@@ -319,12 +319,12 @@ void func_80BA1E30(ElfMsg6* this, PlayState* play) {
return;
}
- if (func_80BA1C00(this) && (player->actor.speedXZ > 1.0f)) {
+ 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);
- Flags_SetSwitch(play, ELFMSG6_SWITCHFLAG(&this->actor));
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, NULL);
+ Flags_SetSwitch(play, ELFMSG6_SWITCH_FLAG(&this->actor));
Actor_Kill(&this->actor);
return;
}
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -355,14 +355,14 @@ void func_80BA2048(ElfMsg6* this, PlayState* play) {
EnElf* sp20 = (EnElf*)GET_PLAYER(play)->tatlActor;
sp20->unk_264 |= 0x20;
- if (ELFMSG6_SWITCHFLAG(&this->actor) != 0x7F) {
- Flags_SetSwitch(play, ELFMSG6_SWITCHFLAG(&this->actor));
+ if (ELFMSG6_SWITCH_FLAG(&this->actor) != 0x7F) {
+ Flags_SetSwitch(play, ELFMSG6_SWITCH_FLAG(&this->actor));
}
Actor_Kill(&this->actor);
return;
}
- if (((ELFMSG6_SWITCHFLAG(&this->actor) != 0x7F) && Flags_GetSwitch(play, ELFMSG6_SWITCHFLAG(&this->actor))) ||
+ if (((ELFMSG6_SWITCH_FLAG(&this->actor) != 0x7F) && Flags_GetSwitch(play, ELFMSG6_SWITCH_FLAG(&this->actor))) ||
CHECK_WEEKEVENTREG(WEEKEVENTREG_88_10) || CHECK_WEEKEVENTREG(WEEKEVENTREG_91_01) ||
(INV_CONTENT(ITEM_MASK_ZORA) == ITEM_MASK_ZORA)) {
Actor_Kill(&this->actor);
@@ -390,14 +390,14 @@ void func_80BA21C4(ElfMsg6* this, PlayState* play) {
EnElf* sp20 = (EnElf*)GET_PLAYER(play)->tatlActor;
sp20->unk_264 |= 0x20;
- if (ELFMSG6_SWITCHFLAG(&this->actor) != 0x7F) {
- Flags_SetSwitch(play, ELFMSG6_SWITCHFLAG(&this->actor));
+ if (ELFMSG6_SWITCH_FLAG(&this->actor) != 0x7F) {
+ Flags_SetSwitch(play, ELFMSG6_SWITCH_FLAG(&this->actor));
}
Actor_Kill(&this->actor);
return;
}
- if (((ELFMSG6_SWITCHFLAG(&this->actor) != 0x7F) && Flags_GetSwitch(play, ELFMSG6_SWITCHFLAG(&this->actor))) ||
+ if (((ELFMSG6_SWITCH_FLAG(&this->actor) != 0x7F) && Flags_GetSwitch(play, ELFMSG6_SWITCH_FLAG(&this->actor))) ||
CHECK_QUEST_ITEM(QUEST_SONG_EPONA)) {
Actor_Kill(&this->actor);
return;
diff --git a/src/overlays/actors/ovl_Elf_Msg6/z_elf_msg6.h b/src/overlays/actors/ovl_Elf_Msg6/z_elf_msg6.h
index 8e9a5d0ed..640c35987 100644
--- a/src/overlays/actors/ovl_Elf_Msg6/z_elf_msg6.h
+++ b/src/overlays/actors/ovl_Elf_Msg6/z_elf_msg6.h
@@ -9,7 +9,7 @@ typedef void (*ElfMsg6ActionFunc)(struct ElfMsg6*, PlayState*);
#define ELFMSG6_GET_F(thisx) ((thisx)->params & 0xF)
#define ELFMSG6_GET_F0(thisx) (((thisx)->params & 0xF0) >> 4)
-#define ELFMSG6_SWITCHFLAG(thisx) (((thisx)->params & 0xFE00) >> 9)
+#define ELFMSG6_SWITCH_FLAG(thisx) (((thisx)->params & 0xFE00) >> 9)
typedef struct ElfMsg6 {
/* 0x000 */ Actor actor;
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..09928dfe9 100644
--- a/src/overlays/actors/ovl_En_Ah/z_en_ah.c
+++ b/src/overlays/actors/ovl_En_Ah/z_en_ah.c
@@ -7,7 +7,7 @@
#include "z_en_ah.h"
#include "objects/object_ah/object_ah.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((EnAh*)thisx)
@@ -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),
@@ -81,12 +81,22 @@ static ColliderCylinderInit sCylinderInit = {
static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE };
-static AnimationInfoS sAnimationInfo[] = {
- { &object_ah_Anim_001860, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_ah_Anim_001860, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_ah_Anim_002280, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_ah_Anim_000968, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_ah_Anim_000DDC, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+typedef enum {
+ /* -1 */ ENAH_ANIM_NONE = -1,
+ /* 0 */ ENAH_ANIM_0,
+ /* 1 */ ENAH_ANIM_1,
+ /* 2 */ ENAH_ANIM_2,
+ /* 3 */ ENAH_ANIM_3,
+ /* 4 */ ENAH_ANIM_4,
+ /* 5 */ ENAH_ANIM_MAX
+} EnAhAnimation;
+
+static AnimationInfoS sAnimationInfo[ENAH_ANIM_MAX] = {
+ { &object_ah_Anim_001860, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAH_ANIM_0
+ { &object_ah_Anim_001860, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENAH_ANIM_1
+ { &object_ah_Anim_002280, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAH_ANIM_2
+ { &object_ah_Anim_000968, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENAH_ANIM_3
+ { &object_ah_Anim_000DDC, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAH_ANIM_4
};
s16 D_80BD3EBC[] = { 0, 0, 1, 0 };
@@ -127,29 +137,30 @@ Actor* func_80BD2A30(EnAh* this, PlayState* play, u8 actorCat, s16 actorId) {
return foundActor;
}
-void func_80BD2AE0(EnAh* this) {
- this->skelAnime.playSpeed = this->unk_2DC;
+void EnAh_UpdateSkelAnime(EnAh* this) {
+ this->skelAnime.playSpeed = this->animPlaySpeed;
SkelAnime_Update(&this->skelAnime);
}
-s32 func_80BD2B0C(EnAh* this, s32 arg1) {
- s32 phi_v1 = false;
- s32 ret = false;
+s32 EnAh_ChangeAnim(EnAh* this, s32 animIndex) {
+ s32 changeAnim = false;
+ s32 didAnimChange = false;
- if ((arg1 == 0) || (arg1 == 1)) {
- if ((this->unk_300 != 0) && (this->unk_300 != 1)) {
- phi_v1 = true;
+ if ((animIndex == ENAH_ANIM_0) || (animIndex == ENAH_ANIM_1)) {
+ if ((this->animIndex != ENAH_ANIM_0) && (this->animIndex != ENAH_ANIM_1)) {
+ changeAnim = true;
}
- } else if (arg1 != this->unk_300) {
- phi_v1 = true;
+ } else if (this->animIndex != animIndex) {
+ changeAnim = true;
}
- if (phi_v1) {
- this->unk_300 = arg1;
- ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, arg1);
- this->unk_2DC = this->skelAnime.playSpeed;
+ if (changeAnim) {
+ this->animIndex = animIndex;
+ didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
+ this->animPlaySpeed = this->skelAnime.playSpeed;
}
- return ret;
+
+ return didAnimChange;
}
void func_80BD2BA4(EnAh* this, PlayState* play) {
@@ -160,13 +171,12 @@ void func_80BD2BA4(EnAh* this, PlayState* play) {
s32 func_80BD2BE8(EnAh* this, PlayState* play) {
s32 ret = false;
- if (this->unk_2D8 & 7) {
- if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- SubS_UpdateFlags(&this->unk_2D8, 0, 7);
- ret = true;
- this->unk_2D8 |= 8;
- this->actionFunc = func_80BD3768;
- }
+ if (((this->unk_2D8 & SUBS_OFFER_MODE_MASK) != SUBS_OFFER_MODE_NONE) &&
+ Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ SubS_SetOfferMode(&this->unk_2D8, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
+ ret = true;
+ this->unk_2D8 |= 8;
+ this->actionFunc = func_80BD3768;
}
return ret;
@@ -185,6 +195,9 @@ void func_80BD2C6C(EnAh* this) {
this->unk_2FA = 4;
}
break;
+
+ default:
+ break;
}
if (!phi_a3 && (this->unk_2FA == 4)) {
@@ -242,7 +255,7 @@ void func_80BD2DC8(EnAh* this) {
Math_Vec3f_Copy(&sp34, &this->actor.focus.pos);
if (this->unk_1E4->id == ACTOR_PLAYER) {
- sp40.y = ((Player*)this->unk_1E4)->bodyPartsPos[7].y + 3.0f;
+ sp40.y = ((Player*)this->unk_1E4)->bodyPartsPos[PLAYER_BODYPART_HEAD].y + 3.0f;
} else {
Math_Vec3f_Copy(&sp40, &this->unk_1E4->focus.pos);
}
@@ -283,11 +296,14 @@ void func_80BD2FD0(EnAh* this, PlayState* play) {
s32 func_80BD30C0(EnAh* this, PlayState* play) {
switch (this->unk_1DC) {
case 1:
- func_80BD2B0C(this, 0);
+ EnAh_ChangeAnim(this, ENAH_ANIM_0);
break;
case 2:
- func_80BD2B0C(this, 4);
+ EnAh_ChangeAnim(this, ENAH_ANIM_4);
+ break;
+
+ default:
break;
}
return false;
@@ -295,10 +311,10 @@ s32 func_80BD30C0(EnAh* this, PlayState* play) {
void func_80BD3118(EnAh* this, PlayState* play) {
if (this->unk_2FE == 0) {
- func_80BD2B0C(this, 2);
+ EnAh_ChangeAnim(this, ENAH_ANIM_2);
this->unk_2FE++;
} else if ((this->unk_2FE == 1) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- func_80BD2B0C(this, 3);
+ EnAh_ChangeAnim(this, ENAH_ANIM_3);
this->unk_2FE++;
}
}
@@ -324,6 +340,9 @@ s32 func_80BD3198(EnAh* this, PlayState* play) {
this->unk_2F6 = 2;
this->unk_2F8 = 8;
break;
+
+ default:
+ break;
}
}
this->unk_2DA = temp;
@@ -360,6 +379,9 @@ s32* func_80BD3294(EnAh* this, PlayState* play) {
case 2:
return D_80BD3DF8;
+
+ default:
+ break;
}
return NULL;
}
@@ -382,9 +404,10 @@ s32 func_80BD3374(EnAh* this, PlayState* play, ScheduleOutput* scheduleOutput) {
Math_Vec3f_Copy(&this->actor.world.pos, &D_80BD3EC4.pos);
Math_Vec3s_Copy(&this->actor.world.rot, &D_80BD3EC4.rot);
Math_Vec3s_Copy(&this->actor.shape.rot, &this->actor.world.rot);
- func_80BD2B0C(this, 0);
- SubS_UpdateFlags(&this->unk_2D8, 3, 7);
+ EnAh_ChangeAnim(this, ENAH_ANIM_0);
+ SubS_SetOfferMode(&this->unk_2D8, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_2D8 |= 0x40;
+
return true;
}
@@ -394,9 +417,10 @@ s32 func_80BD33FC(EnAh* this, PlayState* play, ScheduleOutput* scheduleOutput) {
Math_Vec3f_Copy(&this->actor.world.pos, &D_80BD3ED8.pos);
Math_Vec3s_Copy(&this->actor.world.rot, &D_80BD3ED8.rot);
Math_Vec3s_Copy(&this->actor.shape.rot, &this->actor.world.rot);
- func_80BD2B0C(this, 4);
- SubS_UpdateFlags(&this->unk_2D8, 3, 7);
+ EnAh_ChangeAnim(this, ENAH_ANIM_4);
+ SubS_SetOfferMode(&this->unk_2D8, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_2D8 |= (0x40 | 0x10);
+
return true;
}
@@ -409,7 +433,7 @@ s32 func_80BD3484(EnAh* this, PlayState* play, ScheduleOutput* scheduleOutput) {
Math_Vec3s_Copy(&this->actor.world.rot, &D_80BD3EEC.rot);
Math_Vec3s_Copy(&this->actor.shape.rot, &this->actor.world.rot);
}
- func_80BD2B0C(this, 4);
+ EnAh_ChangeAnim(this, ENAH_ANIM_4);
this->unk_2D8 |= (0x40 | 0x8);
this->unk_2D8 |= 0x10;
this->unk_2D8 |= 0x80;
@@ -425,10 +449,6 @@ s32 func_80BD3548(EnAh* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->unk_2D8 = 0;
switch (scheduleOutput->result) {
- default:
- ret = false;
- break;
-
case 1:
ret = func_80BD3374(this, play, scheduleOutput);
break;
@@ -440,25 +460,27 @@ s32 func_80BD3548(EnAh* this, PlayState* play, ScheduleOutput* scheduleOutput) {
case 3:
ret = func_80BD3484(this, play, scheduleOutput);
break;
+
+ default:
+ ret = false;
+ break;
}
return ret;
}
s32 func_80BD35BC(EnAh* this, PlayState* play) {
s16 temp;
- s16 temp2;
switch (this->unk_1DC) {
default:
return false;
case 2:
- temp = BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y);
- temp2 = ABS_ALT(temp);
- if (temp2 < 0x3800) {
- SubS_UpdateFlags(&this->unk_2D8, 3, 7);
+ temp = ABS_ALT(BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y));
+ if (temp < 0x3800) {
+ SubS_SetOfferMode(&this->unk_2D8, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
} else {
- SubS_UpdateFlags(&this->unk_2D8, 0, 7);
+ SubS_SetOfferMode(&this->unk_2D8, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
}
return false;
}
@@ -477,11 +499,11 @@ void func_80BD36B8(EnAh* this, PlayState* play) {
if (!Schedule_RunScript(play, D_80BD3DB0, &sp18) ||
((this->unk_1DC != sp18.result) && !func_80BD3548(this, play, &sp18))) {
this->actor.shape.shadowDraw = NULL;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
sp18.result = 0;
} else {
this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}
this->unk_1DC = sp18.result;
func_80BD3658(this, play);
@@ -493,7 +515,7 @@ void func_80BD3768(EnAh* this, PlayState* play) {
Vec3f sp34;
if (func_8010BF58(&this->actor, play, func_80BD3294(this, play), NULL, &this->unk_1E0)) {
- SubS_UpdateFlags(&this->unk_2D8, 3, 7);
+ SubS_SetOfferMode(&this->unk_2D8, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_2D8 &= ~8;
this->unk_2D8 |= 0x80;
this->unk_2F4 = 20;
@@ -517,12 +539,13 @@ void EnAh_Init(Actor* thisx, PlayState* play) {
}
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 20.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_ah_Skel_009E70, NULL, this->jointTable, this->morphTable, 17);
- this->unk_300 = -1;
- func_80BD2B0C(this, 0);
+ SkelAnime_InitFlex(play, &this->skelAnime, &object_ah_Skel_009E70, NULL, this->jointTable, this->morphTable,
+ OBJECT_AH_LIMB_MAX);
+ this->animIndex = ENAH_ANIM_NONE;
+ EnAh_ChangeAnim(this, ENAH_ANIM_0);
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit);
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
Actor_SetScale(&this->actor, 0.01f);
this->unk_1DC = 0;
this->unk_2D8 = 0;
@@ -548,16 +571,16 @@ void EnAh_Update(Actor* thisx, PlayState* play) {
if (this->unk_1DC != 0) {
func_80BD3198(this, play);
- func_80BD2AE0(this);
+ EnAh_UpdateSkelAnime(this);
func_80BD2C6C(this);
func_80BD2FD0(this, play);
radius = this->collider.dim.radius + 60;
height = this->collider.dim.height + 10;
- func_8013C964(&this->actor, play, radius, height, PLAYER_IA_NONE, this->unk_2D8 & 7);
+ SubS_Offer(&this->actor, play, radius, height, PLAYER_IA_NONE, this->unk_2D8 & SUBS_OFFER_MODE_MASK);
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);
}
@@ -566,7 +589,7 @@ void EnAh_Update(Actor* thisx, PlayState* play) {
void EnAh_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnAh* this = THIS;
- if (limbIndex == 7) {
+ if (limbIndex == OBJECT_AH_LIMB_07) {
Matrix_MultVec3f(&D_80BD3F00, &this->actor.focus.pos);
Math_Vec3s_Copy(&this->actor.focus.rot, &this->actor.world.rot);
}
@@ -589,7 +612,7 @@ void EnAh_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
overrideRot = false;
}
- if (limbIndex == 7) {
+ if (limbIndex == OBJECT_AH_LIMB_07) {
SubS_UpdateLimb(BINANG_ADD(this->unk_2EC + this->unk_2F0, 0x4000),
BINANG_ADD(this->unk_2EE + this->unk_2F2 + this->actor.shape.rot.y, 0x4000), this->unk_1E8,
this->unk_200, stepRot, overrideRot);
@@ -600,7 +623,7 @@ void EnAh_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
Matrix_RotateXS(this->unk_200[0].x, MTXMODE_APPLY);
Matrix_RotateZS(this->unk_200[0].z, MTXMODE_APPLY);
Matrix_Push();
- } else if (limbIndex == 2) {
+ } else if (limbIndex == OBJECT_AH_LIMB_02) {
SubS_UpdateLimb(BINANG_ADD(this->unk_2F0, 0x4000), BINANG_ADD(this->unk_2F2 + this->actor.shape.rot.y, 0x4000),
&this->unk_1E8[1], &this->unk_200[1], stepRot, overrideRot);
Matrix_Pop();
@@ -619,7 +642,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_Ah/z_en_ah.h b/src/overlays/actors/ovl_En_Ah/z_en_ah.h
index d361a8358..d03e01199 100644
--- a/src/overlays/actors/ovl_En_Ah/z_en_ah.h
+++ b/src/overlays/actors/ovl_En_Ah/z_en_ah.h
@@ -2,6 +2,7 @@
#define Z_EN_AH_H
#include "global.h"
+#include "objects/object_ah/object_ah.h"
struct EnAh;
@@ -19,11 +20,11 @@ typedef struct EnAh {
/* 0x1E4 */ Actor* unk_1E4;
/* 0x1E8 */ Vec3f unk_1E8[2];
/* 0x200 */ Vec3s unk_200[2];
- /* 0x20C */ Vec3s jointTable[17];
- /* 0x272 */ Vec3s morphTable[17];
+ /* 0x20C */ Vec3s jointTable[OBJECT_AH_LIMB_MAX];
+ /* 0x272 */ Vec3s morphTable[OBJECT_AH_LIMB_MAX];
/* 0x2D8 */ u16 unk_2D8;
/* 0x2DA */ u16 unk_2DA;
- /* 0x2DC */ f32 unk_2DC;
+ /* 0x2DC */ f32 animPlaySpeed;
/* 0x2E0 */ UNK_TYPE1 unk2E0[0xC];
/* 0x2EC */ s16 unk_2EC;
/* 0x2EE */ s16 unk_2EE;
@@ -35,7 +36,7 @@ typedef struct EnAh {
/* 0x2FA */ s16 unk_2FA;
/* 0x2FC */ s16 unk_2FC;
/* 0x2FE */ s16 unk_2FE;
- /* 0x300 */ s32 unk_300;
+ /* 0x300 */ s32 animIndex;
} EnAh; // size = 0x304
#endif // Z_EN_AH_H
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 d2bdf0cee..c7bfb6234 100644
--- a/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.c
+++ b/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.c
@@ -7,7 +7,7 @@
#include "z_en_akindonuts.h"
#include "objects/object_dnt/object_dnt.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((EnAkindonuts*)thisx)
@@ -62,30 +62,58 @@ static ColliderCylinderInitType1 sCylinderInit = {
{ 27, 32, 0, { 0, 0, 0 } },
};
-static AnimationInfoS sAnimationInfo[] = {
- { &object_dnt_Anim_005488, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_00B0B4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_004AA0, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_004E38, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_0029E8, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_005CA8, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_0038CC, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_003CC0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_0012F4, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_004700, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_001BC8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_003438, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_001E2C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_000994, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_002268, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_002F08, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_00577C, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_dnt_Anim_0029E8, 1.0f, 8, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_0029E8, 1.0f, 4, -1, ANIMMODE_ONCE, -4 },
- { &object_dnt_Anim_0029E8, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_001BC8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_0012F4, -1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_002670, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+typedef enum {
+ /* -1 */ ENAKINDONUTS_ANIM_NONE = -1,
+ /* 0x00 */ ENAKINDONUTS_ANIM_0,
+ /* 0x01 */ ENAKINDONUTS_ANIM_1,
+ /* 0x02 */ ENAKINDONUTS_ANIM_2,
+ /* 0x03 */ ENAKINDONUTS_ANIM_3,
+ /* 0x04 */ ENAKINDONUTS_ANIM_4,
+ /* 0x05 */ ENAKINDONUTS_ANIM_5,
+ /* 0x06 */ ENAKINDONUTS_ANIM_6,
+ /* 0x07 */ ENAKINDONUTS_ANIM_7,
+ /* 0x08 */ ENAKINDONUTS_ANIM_8,
+ /* 0x09 */ ENAKINDONUTS_ANIM_9,
+ /* 0x0A */ ENAKINDONUTS_ANIM_10,
+ /* 0x0B */ ENAKINDONUTS_ANIM_11,
+ /* 0x0C */ ENAKINDONUTS_ANIM_12,
+ /* 0x0D */ ENAKINDONUTS_ANIM_13,
+ /* 0x0E */ ENAKINDONUTS_ANIM_14,
+ /* 0x0F */ ENAKINDONUTS_ANIM_15,
+ /* 0x10 */ ENAKINDONUTS_ANIM_16,
+ /* 0x11 */ ENAKINDONUTS_ANIM_17,
+ /* 0x12 */ ENAKINDONUTS_ANIM_18,
+ /* 0x13 */ ENAKINDONUTS_ANIM_19,
+ /* 0x14 */ ENAKINDONUTS_ANIM_20,
+ /* 0x15 */ ENAKINDONUTS_ANIM_21,
+ /* 0x16 */ ENAKINDONUTS_ANIM_22,
+ /* 0x17 */ ENAKINDONUTS_ANIM_MAX
+} EnAkindonutsAnimation;
+
+static AnimationInfoS sAnimationInfo[ENAKINDONUTS_ANIM_MAX] = {
+ { &gBusinessScrubStandingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAKINDONUTS_ANIM_0
+ { &gBusinessScrubWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAKINDONUTS_ANIM_1
+ { &gBusinessScrubRiseUpAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAKINDONUTS_ANIM_2
+ { &gBusinessScrubJumpAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAKINDONUTS_ANIM_3
+ { &gBusinessScrubBurrowAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAKINDONUTS_ANIM_4
+ { &gBusinessScrubExcitedStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAKINDONUTS_ANIM_5
+ { &gBusinessScrubExcitedLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAKINDONUTS_ANIM_6
+ { &gBusinessScrubExcitedEndAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAKINDONUTS_ANIM_7
+ { &gBusinessScrubTakeOffHatAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAKINDONUTS_ANIM_8
+ { &gBusinessScrubFlyStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAKINDONUTS_ANIM_9
+ { &gBusinessScrubFlyLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAKINDONUTS_ANIM_10
+ { &gBusinessScrubShockedStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAKINDONUTS_ANIM_11
+ { &gBusinessScrubShockedShakeHeadAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAKINDONUTS_ANIM_12
+ { &gBusinessScrubShockedPoundAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAKINDONUTS_ANIM_13
+ { &gBusinessScrubShockedEndAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAKINDONUTS_ANIM_14
+ { &gBusinessScrubThinkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAKINDONUTS_ANIM_15
+ { &gBusinessScrubBobAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENAKINDONUTS_ANIM_16
+ { &gBusinessScrubBurrowAnim, 1.0f, 8, -1, ANIMMODE_ONCE, 0 }, // ENAKINDONUTS_ANIM_17
+ { &gBusinessScrubBurrowAnim, 1.0f, 4, -1, ANIMMODE_ONCE, -4 }, // ENAKINDONUTS_ANIM_18
+ { &gBusinessScrubBurrowAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAKINDONUTS_ANIM_19
+ { &gBusinessScrubFlyLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAKINDONUTS_ANIM_20
+ { &gBusinessScrubTakeOffHatAnim, -1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAKINDONUTS_ANIM_21
+ { &gBusinessScrubFlyEndAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAKINDONUTS_ANIM_22
};
static u16 D_80BF048C[] = {
@@ -124,15 +152,15 @@ static u16 D_80BF04AC[] = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_U8(targetMode, 0, ICHAIN_CONTINUE),
+ ICHAIN_U8(targetMode, TARGET_MODE_0, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 30, ICHAIN_STOP),
};
void func_80BECBE0(EnAkindonuts* this, s16 arg1) {
- f32 sp24 = Math_CosS(this->actor.world.rot.x) * this->actor.speedXZ;
+ f32 sp24 = Math_CosS(this->actor.world.rot.x) * this->actor.speed;
this->actor.velocity.x = Math_SinS(this->actor.world.rot.y) * sp24;
- this->actor.velocity.y = Math_SinS(this->actor.world.rot.x) * this->actor.speedXZ;
+ this->actor.velocity.y = Math_SinS(this->actor.world.rot.x) * this->actor.speed;
this->actor.velocity.z = Math_CosS(this->actor.world.rot.y) * sp24;
if (arg1) {
@@ -150,7 +178,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 +207,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 +260,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 +279,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 +332,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 +354,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 +368,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 +382,7 @@ s32 func_80BED35C(EnAkindonuts* this) {
return 2;
}
- if (gSaveContext.save.playerData.rupees < 100) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < 100) {
return 1;
}
@@ -407,29 +439,32 @@ void func_80BED3BC(EnAkindonuts* this, PlayState* play) {
switch (func_80BED208(this)) {
case 0:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_33C = 0x15EC;
break;
case 1:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_33C = 0x15ED;
break;
case 2:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_33C = 0x15EE;
break;
case 3:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
this->unk_32C &= ~0x1;
this->unk_32C |= 0x40;
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->unk_33C = 0x15EF;
this->actionFunc = func_80BEF360;
return;
+
+ default:
+ break;
}
} else if (this->unk_32C & 0x10) {
this->unk_32C &= ~0x10;
@@ -453,6 +488,9 @@ void func_80BED3BC(EnAkindonuts* this, PlayState* play) {
case 0x15EF:
this->unk_32C |= 1;
break;
+
+ default:
+ break;
}
Message_StartTextbox(play, this->unk_33C, &this->actor);
@@ -490,29 +528,32 @@ void func_80BED680(EnAkindonuts* this, PlayState* play) {
switch (func_80BED208(this)) {
case 0:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_33C = 0x15EC;
break;
case 1:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_33C = 0x15ED;
break;
case 2:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_33C = 0x15EE;
break;
case 3:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
this->unk_32C |= 0x40;
this->unk_32C &= ~0x1;
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->unk_33C = 0x15EF;
this->actionFunc = func_80BEF360;
return;
+
+ default:
+ break;
}
} else if (this->unk_32C & 0x10) {
this->unk_32C &= ~0x10;
@@ -524,6 +565,9 @@ void func_80BED680(EnAkindonuts* this, PlayState* play) {
case 0x15EF:
this->unk_32C |= 1;
break;
+
+ default:
+ break;
}
Message_StartTextbox(play, this->unk_33C, &this->actor);
@@ -537,10 +581,13 @@ void func_80BED8A4(EnAkindonuts* this, PlayState* play) {
if (player->transformation == PLAYER_FORM_DEKU) {
this->unk_33C = 0x15F4;
break;
- } else if (player->transformation == PLAYER_FORM_GORON) {
+ }
+
+ if (player->transformation == PLAYER_FORM_GORON) {
this->unk_33C = 0x15FE;
break;
}
+
this->unk_33C = 0x15FC;
break;
@@ -585,29 +632,32 @@ void func_80BED8A4(EnAkindonuts* this, PlayState* play) {
switch (func_80BED27C(this)) {
case 2:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_33C = 0x1601;
break;
case 0:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_33C = 0x1602;
break;
case 1:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_33C = 0x1603;
break;
case 3:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
this->unk_32C |= 0x40;
this->unk_32C &= ~0x1;
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->unk_33C = 0x15EF;
this->actionFunc = func_80BEF360;
return;
+
+ default:
+ break;
}
} else if (this->unk_32C & 0x10) {
this->unk_32C &= ~0x10;
@@ -630,6 +680,9 @@ void func_80BED8A4(EnAkindonuts* this, PlayState* play) {
case 0x15EF:
this->unk_32C |= 1;
break;
+
+ default:
+ break;
}
Message_StartTextbox(play, this->unk_33C, &this->actor);
@@ -668,29 +721,32 @@ void func_80BEDB88(EnAkindonuts* this, PlayState* play) {
switch (func_80BED27C(this)) {
case 2:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_33C = 0x1601;
break;
case 0:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_33C = 0x1602;
break;
case 1:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_33C = 0x1603;
break;
case 3:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
this->unk_32C |= 0x40;
this->unk_32C &= ~0x1;
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->unk_33C = 0x15EF;
this->actionFunc = func_80BEF360;
return;
+
+ default:
+ break;
}
} else if (this->unk_32C & 0x10) {
this->unk_32C &= ~0x10;
@@ -702,6 +758,9 @@ void func_80BEDB88(EnAkindonuts* this, PlayState* play) {
case 0x15EF:
this->unk_32C |= 1;
break;
+
+ default:
+ break;
}
Message_StartTextbox(play, this->unk_33C, &this->actor);
@@ -715,10 +774,13 @@ void func_80BEDDAC(EnAkindonuts* this, PlayState* play) {
if (player->transformation == PLAYER_FORM_GORON) {
this->unk_33C = 0x1607;
break;
- } else if (player->transformation == PLAYER_FORM_ZORA) {
+ }
+
+ if (player->transformation == PLAYER_FORM_ZORA) {
this->unk_33C = 0x1610;
break;
}
+
this->unk_33C = 0x160E;
break;
@@ -763,24 +825,27 @@ void func_80BEDDAC(EnAkindonuts* this, PlayState* play) {
switch (func_80BED2FC(this)) {
case 2:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_33C = 0x1613;
break;
case 1:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_33C = 0x15ED;
break;
case 3:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
this->unk_32C |= 0x40;
this->unk_32C &= ~0x1;
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->unk_33C = 0x15EF;
this->actionFunc = func_80BEF360;
return;
+
+ default:
+ break;
}
} else if (this->unk_32C & 0x10) {
this->unk_32C &= ~0x10;
@@ -803,6 +868,9 @@ void func_80BEDDAC(EnAkindonuts* this, PlayState* play) {
case 0x15EF:
this->unk_32C |= 1;
break;
+
+ default:
+ break;
}
Message_StartTextbox(play, this->unk_33C, &this->actor);
@@ -841,24 +909,27 @@ void func_80BEE070(EnAkindonuts* this, PlayState* play) {
switch (func_80BED2FC(this)) {
case 2:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_33C = 0x1613;
break;
case 1:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_33C = 0x15ED;
break;
case 3:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
this->unk_32C |= 0x40;
this->unk_32C &= ~0x1;
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->unk_33C = 0x161A;
this->actionFunc = func_80BEF360;
return;
+
+ default:
+ break;
}
} else if (this->unk_32C & 0x10) {
this->unk_32C &= ~0x10;
@@ -870,6 +941,9 @@ void func_80BEE070(EnAkindonuts* this, PlayState* play) {
case 0x161A:
this->unk_32C |= 1;
break;
+
+ default:
+ break;
}
Message_StartTextbox(play, this->unk_33C, &this->actor);
@@ -924,24 +998,27 @@ void func_80BEE274(EnAkindonuts* this, PlayState* play) {
switch (func_80BED35C(this)) {
case 2:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_33C = 0x1613;
break;
case 1:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_33C = 0x15ED;
break;
case 3:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
this->unk_32C |= 0x40;
this->unk_32C &= ~0x1;
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->unk_33C = 0x1629;
this->actionFunc = func_80BEF360;
return;
+
+ default:
+ break;
}
} else if (this->unk_32C & 0x10) {
this->unk_32C &= ~0x10;
@@ -964,6 +1041,9 @@ void func_80BEE274(EnAkindonuts* this, PlayState* play) {
case 0x1629:
this->unk_32C |= 1;
break;
+
+ default:
+ break;
}
Message_StartTextbox(play, this->unk_33C, &this->actor);
@@ -1002,24 +1082,27 @@ void func_80BEE530(EnAkindonuts* this, PlayState* play) {
switch (func_80BED35C(this)) {
case 2:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_33C = 0x1613;
break;
case 1:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_33C = 0x15ED;
break;
case 3:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
this->unk_32C |= 0x40;
this->unk_32C &= ~0x1;
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->unk_33C = 0x15EF;
this->actionFunc = func_80BEF360;
return;
+
+ default:
+ break;
}
} else if (this->unk_32C & 0x10) {
this->unk_32C &= ~0x10;
@@ -1031,6 +1114,9 @@ void func_80BEE530(EnAkindonuts* this, PlayState* play) {
case 0x15EF:
this->unk_32C |= 1;
break;
+
+ default:
+ break;
}
Message_StartTextbox(play, this->unk_33C, &this->actor);
@@ -1047,7 +1133,7 @@ void func_80BEE73C(EnAkindonuts* this, PlayState* play) {
player->actor.textId = D_80BF048C[params];
this->unk_33C = player->actor.textId;
if (this->unk_33C == 0x15E4) {
- player->exchangeItemId = itemAction;
+ player->exchangeItemAction = itemAction;
this->actionFunc = func_80BEF20C;
} else {
this->actionFunc = func_80BEF18C;
@@ -1056,7 +1142,7 @@ void func_80BEE73C(EnAkindonuts* this, PlayState* play) {
player->actor.textId = D_80BF0494[params];
this->unk_33C = player->actor.textId;
if (this->unk_33C == 0x15F9) {
- player->exchangeItemId = itemAction;
+ player->exchangeItemAction = itemAction;
this->actionFunc = func_80BEF20C;
} else {
this->actionFunc = func_80BEF18C;
@@ -1065,7 +1151,7 @@ void func_80BEE73C(EnAkindonuts* this, PlayState* play) {
player->actor.textId = D_80BF049C[params];
this->unk_33C = player->actor.textId;
if (this->unk_33C == 0x160C) {
- player->exchangeItemId = itemAction;
+ player->exchangeItemAction = itemAction;
this->actionFunc = func_80BEF20C;
} else {
this->actionFunc = func_80BEF18C;
@@ -1074,7 +1160,7 @@ void func_80BEE73C(EnAkindonuts* this, PlayState* play) {
player->actor.textId = D_80BF04A4[params];
this->unk_33C = player->actor.textId;
if (this->unk_33C == 0x1621) {
- player->exchangeItemId = itemAction;
+ player->exchangeItemAction = itemAction;
this->actionFunc = func_80BEF20C;
} else {
this->actionFunc = func_80BEF18C;
@@ -1084,10 +1170,10 @@ void func_80BEE73C(EnAkindonuts* this, PlayState* play) {
this->unk_33C = player->actor.textId;
this->actionFunc = func_80BEF18C;
}
- func_801477B4(play);
+ Message_CloseTextbox(play);
} else if (itemAction <= PLAYER_IA_MINUS1) {
this->unk_33C = D_80BF04AC[params];
- func_80151938(play, this->unk_33C);
+ Message_ContinueTextbox(play, this->unk_33C);
this->actionFunc = func_80BEF18C;
}
}
@@ -1149,12 +1235,15 @@ void func_80BEE938(EnAkindonuts* this, PlayState* play) {
this->unk_2DC = func_80BEE274;
}
break;
+
+ default:
+ break;
}
}
void func_80BEEB20(EnAkindonuts* this, PlayState* play) {
- s16 sp26 = this->skelAnime.curFrame;
- s16 sp24 = Animation_GetLastFrame(&sAnimationInfo[this->unk_338].animation->common);
+ s16 curFrame = this->skelAnime.curFrame;
+ s16 endFrame = Animation_GetLastFrame(&sAnimationInfo[this->animIndex].animation->common);
s16 phi_v0;
Math_ApproachS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 2, 0xE38);
@@ -1173,41 +1262,41 @@ void func_80BEEB20(EnAkindonuts* this, PlayState* play) {
}
if (phi_v0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
this->actionFunc = func_80BEEDC0;
- this->unk_338 = 3;
+ this->animIndex = ENAKINDONUTS_ANIM_3;
this->collider.dim.height = 64;
- SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 3);
+ SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, ENAKINDONUTS_ANIM_3);
return;
}
}
- if (sp26 == sp24) {
- if ((this->unk_338 == 4) || (this->unk_338 == 18)) {
- this->unk_338 = 17;
+ if (curFrame == endFrame) {
+ if ((this->animIndex == ENAKINDONUTS_ANIM_4) || (this->animIndex == ENAKINDONUTS_ANIM_18)) {
+ this->animIndex = ENAKINDONUTS_ANIM_17;
this->collider.dim.height = 0;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_DOWN);
- SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 17);
- } else if (this->unk_338 == 2) {
- this->unk_338 = 16;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_DOWN);
+ SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, ENAKINDONUTS_ANIM_17);
+ } else if (this->animIndex == ENAKINDONUTS_ANIM_2) {
+ this->animIndex = ENAKINDONUTS_ANIM_16;
this->collider.dim.height = 32;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_UP);
- SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 16);
- } else if (this->unk_338 == 17) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_UP);
+ SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, ENAKINDONUTS_ANIM_16);
+ } else if (this->animIndex == ENAKINDONUTS_ANIM_17) {
phi_v0 = DECR(this->unk_33A);
if (phi_v0 == 0) {
this->unk_33A = Rand_ZeroOne() * 10.0f;
- this->unk_338 = 2;
+ this->animIndex = ENAKINDONUTS_ANIM_2;
this->collider.dim.height = 32;
- SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 2);
+ SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, ENAKINDONUTS_ANIM_2);
}
- } else if (this->unk_338 == 16) {
+ } else if (this->animIndex == ENAKINDONUTS_ANIM_16) {
phi_v0 = DECR(this->unk_33A);
if (phi_v0 == 0) {
this->unk_33A = Rand_S16Offset(40, 40);
- this->unk_338 = 18;
+ this->animIndex = ENAKINDONUTS_ANIM_18;
this->collider.dim.height = 32;
- SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 18);
+ SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, ENAKINDONUTS_ANIM_18);
}
}
}
@@ -1216,7 +1305,7 @@ void func_80BEEB20(EnAkindonuts* this, PlayState* play) {
void func_80BEEDC0(EnAkindonuts* this, PlayState* play) {
if (this->skelAnime.curFrame == this->skelAnime.endFrame) {
this->actionFunc = func_80BEEE10;
- SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 0);
+ SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, ENAKINDONUTS_ANIM_0);
}
}
@@ -1229,12 +1318,12 @@ void func_80BEEE10(EnAkindonuts* this, PlayState* play) {
this->actionFunc = func_80BEEFA8;
} else if (((this->actor.xzDistToPlayer < 100.0f) &&
(((this->actor.playerHeightRel < 50.0f) && (this->actor.playerHeightRel > -50.0f)) ? true : false)) ||
- this->actor.isTargeted) {
- func_800B8614(&this->actor, play, 100.0f);
+ this->actor.isLockedOn) {
+ Actor_OfferTalk(&this->actor, play, 100.0f);
} else if (!(((this->actor.playerHeightRel < 50.0f) && (this->actor.playerHeightRel > -50.0f)) ? true : false) ||
!((this->actor.xzDistToPlayer < 200.0f) ? true : false)) {
- this->unk_338 = 4;
- SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 4);
+ this->animIndex = ENAKINDONUTS_ANIM_4;
+ SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, ENAKINDONUTS_ANIM_4);
this->actionFunc = func_80BEEB20;
}
}
@@ -1246,19 +1335,19 @@ void func_80BEEFA8(EnAkindonuts* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
if (this->unk_32C & 1) {
this->unk_32C &= ~0x1;
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->unk_33C = 0;
this->actionFunc = func_80BEEE10;
} else if (this->unk_32C & 0x20) {
this->unk_32C &= ~0x20;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->unk_32C &= ~0x4;
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
- this->unk_338 = 8;
+ this->animIndex = ENAKINDONUTS_ANIM_8;
this->unk_33C = 0;
- SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->unk_338);
+ SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex);
this->actionFunc = func_80BEF518;
} else {
this->unk_2DC(this, play);
@@ -1273,10 +1362,13 @@ void func_80BEEFA8(EnAkindonuts* this, PlayState* play) {
break;
case 1:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
this->unk_32C |= 0x10;
this->unk_2DC(this, play);
break;
+
+ default:
+ break;
}
}
} else if (talkState == TEXT_STATE_16) {
@@ -1286,7 +1378,7 @@ void func_80BEEFA8(EnAkindonuts* this, PlayState* play) {
void func_80BEF18C(EnAkindonuts* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->unk_33C = 0;
this->actionFunc = func_80BEEE10;
@@ -1295,25 +1387,25 @@ void func_80BEF18C(EnAkindonuts* this, PlayState* play) {
void func_80BEF20C(EnAkindonuts* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
- s16 sp24 = this->skelAnime.curFrame;
- s16 sp22 = Animation_GetLastFrame(&sAnimationInfo[this->unk_338].animation->common);
+ s16 curFrame = this->skelAnime.curFrame;
+ s16 endFrame = Animation_GetLastFrame(&sAnimationInfo[this->animIndex].animation->common);
if (this->unk_356 == 40) {
- this->unk_338 = 5;
- SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 5);
+ this->animIndex = ENAKINDONUTS_ANIM_5;
+ SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, ENAKINDONUTS_ANIM_5);
}
this->unk_356++;
- if ((sp24 == sp22) && (this->unk_338 == 5)) {
- this->unk_338 = 6;
- SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 6);
+ if ((curFrame == endFrame) && (this->animIndex == ENAKINDONUTS_ANIM_5)) {
+ this->animIndex = ENAKINDONUTS_ANIM_6;
+ SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, ENAKINDONUTS_ANIM_6);
}
if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
if (this->unk_32C & 1) {
this->unk_32C &= ~0x1;
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->actionFunc = func_80BEF360;
} else {
@@ -1330,19 +1422,19 @@ void func_80BEF360(EnAkindonuts* this, PlayState* play) {
this->unk_32C &= ~0x40;
this->actionFunc = func_80BEF450;
} else {
- Actor_PickUp(&this->actor, play, func_80BED034(this), 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, func_80BED034(this), 300.0f, 300.0f);
}
} else if (Actor_HasParent(&this->actor, play)) {
this->actor.parent = NULL;
this->actionFunc = func_80BEF450;
} else {
- Actor_PickUp(&this->actor, play, func_80BECFBC(this), 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, func_80BECFBC(this), 300.0f, 300.0f);
}
}
void func_80BEF450(EnAkindonuts* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(play)) {
- func_800B85E0(&this->actor, play, 400.0f, -1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
this->actionFunc = func_80BEF4B8;
}
}
@@ -1352,15 +1444,15 @@ void func_80BEF4B8(EnAkindonuts* this, PlayState* play) {
this->unk_2DC(this, play);
this->actionFunc = func_80BEEFA8;
} else {
- func_800B85E0(&this->actor, play, 400.0f, -1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
}
}
void func_80BEF518(EnAkindonuts* this, PlayState* play) {
- s16 sp26 = this->skelAnime.curFrame;
- s16 sp24 = Animation_GetLastFrame(&sAnimationInfo[this->unk_338].animation->common);
+ s16 curFrame = this->skelAnime.curFrame;
+ s16 endFrame = Animation_GetLastFrame(&sAnimationInfo[this->animIndex].animation->common);
- switch (sp26) {
+ switch (curFrame) {
case 10:
this->unk_33E = 1;
this->unk_340 = 0.1f;
@@ -1414,26 +1506,29 @@ void func_80BEF518(EnAkindonuts* this, PlayState* play) {
case 24:
this->unk_344 = 1.0f;
break;
+
+ default:
+ break;
}
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;
}
}
- if (sp26 == sp24) {
+ if (curFrame == endFrame) {
this->unk_33E = 3;
- this->unk_338 = 19;
- SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->unk_338);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_DOWN);
+ this->animIndex = ENAKINDONUTS_ANIM_19;
+ SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_DOWN);
this->unk_32C &= ~2;
this->unk_32C |= 0x80;
this->unk_358 = this->actor.world.pos.y;
@@ -1464,10 +1559,10 @@ void func_80BEF770(EnAkindonuts* this, PlayState* play) {
void func_80BEF83C(EnAkindonuts* this, PlayState* play) {
Vec3f sp34;
- s16 sp32 = this->skelAnime.curFrame;
- s16 sp30 = Animation_GetLastFrame(&sAnimationInfo[this->unk_338].animation->common);
+ s16 curFrame = this->skelAnime.curFrame;
+ s16 endFrame = Animation_GetLastFrame(&sAnimationInfo[this->animIndex].animation->common);
- if (sp32 == sp30) {
+ if (curFrame == endFrame) {
Math_SmoothStepToS(&this->unk_362, 0x1C71, 3, 0x100, 0);
this->unk_352 += this->unk_362;
this->actor.shape.yOffset = 1500.0f;
@@ -1490,9 +1585,9 @@ void func_80BEF83C(EnAkindonuts* this, PlayState* play) {
}
if ((this->actor.home.pos.y + 22.5f) < this->actor.world.pos.y) {
this->unk_34C = 0.3f;
- this->unk_338 = 9;
- SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->unk_338);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
+ this->animIndex = ENAKINDONUTS_ANIM_9;
+ SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
this->actionFunc = func_80BEF9F0;
}
}
@@ -1509,8 +1604,8 @@ void func_80BEF9F0(EnAkindonuts* this, PlayState* play) {
if ((this->actor.home.pos.y + 200.0f) < this->actor.world.pos.y) {
Math_ApproachF(&this->actor.velocity.y, 0.0f, 0.2f, 1.0f);
- this->unk_338 = 10;
- SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->unk_338);
+ this->animIndex = ENAKINDONUTS_ANIM_10;
+ SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex);
if (ENAKINDONUTS_GET_3(&this->actor) == ENAKINDONUTS_3_2) {
this->unk_32C |= 0x2;
}
@@ -1529,7 +1624,7 @@ void func_80BEFAF0(EnAkindonuts* this, PlayState* play) {
if (this->path != NULL) {
sp34 = func_80BECEAC(this->path, this->unk_334, &this->actor.world.pos, &sp38);
- if (this->actor.bgCheckFlags & 0x8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
sp38.y = this->actor.wallYaw;
}
@@ -1546,14 +1641,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;
}
@@ -1561,25 +1656,25 @@ void func_80BEFAF0(EnAkindonuts* this, PlayState* play) {
if (this->unk_334 >= 3) {
sp32 = true;
}
- Math_ApproachF(&this->actor.speedXZ, 1.5f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 1.5f, 0.2f, 1.0f);
} else {
- Math_ApproachF(&this->actor.speedXZ, 2.0f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 2.0f, 0.2f, 1.0f);
}
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++;
@@ -1594,8 +1689,8 @@ void EnAkindonuts_Init(Actor* thisx, PlayState* play) {
EnAkindonuts* this = THIS;
Actor_ProcessInitChain(&this->actor, sInitChain);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_dnt_Skel_00AC70, &object_dnt_Anim_005488, this->jointTable,
- this->morphTable, 28);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gBusinessScrubSkel, &gBusinessScrubStandingAnim, this->jointTable,
+ this->morphTable, BUSINESS_SCRUB_LIMB_MAX);
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinderType1(play, &this->collider, &this->actor, &sCylinderInit);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 35.0f);
@@ -1606,18 +1701,18 @@ 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;
}
}
- SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 4);
+ SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, ENAKINDONUTS_ANIM_4);
this->unk_32C |= 0x2;
this->unk_32C |= 0x4;
- this->unk_338 = 4;
- this->cutscene = this->actor.cutscene;
+ this->animIndex = ENAKINDONUTS_ANIM_4;
+ this->csId = this->actor.csId;
func_80BEE938(this, play);
this->actionFunc = func_80BEEB20;
}
@@ -1638,7 +1733,7 @@ void EnAkindonuts_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
if (this->unk_32C & 0x80) {
- func_800B9010(&this->actor, NA_SE_EN_AKINDO_FLY - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_AKINDO_FLY - SFX_FLAG);
}
func_80BECC7C(this, play);
}
@@ -1646,38 +1741,51 @@ void EnAkindonuts_Update(Actor* thisx, PlayState* play) {
s32 EnAkindonuts_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnAkindonuts* this = THIS;
- if (((this->unk_338 == 4) && (this->unk_33E == 0)) || ((this->unk_338 == 8) && (this->unk_33E == 0)) ||
- (this->unk_338 == 18) || (this->unk_338 == 2) || (this->unk_338 == 3) || (this->unk_338 == 17) ||
- (this->unk_338 == 5) || (this->unk_338 == 6) || (this->unk_338 == 7) || (this->unk_338 == 16)) {
- if ((limbIndex == 16) || (limbIndex == 21) || (limbIndex == 27) || (limbIndex == 23) || (limbIndex == 24) ||
- (limbIndex == 15)) {
+ if (((this->animIndex == ENAKINDONUTS_ANIM_4) && (this->unk_33E == 0)) ||
+ ((this->animIndex == ENAKINDONUTS_ANIM_8) && (this->unk_33E == 0)) ||
+ (this->animIndex == ENAKINDONUTS_ANIM_18) || (this->animIndex == ENAKINDONUTS_ANIM_2) ||
+ (this->animIndex == ENAKINDONUTS_ANIM_3) || (this->animIndex == ENAKINDONUTS_ANIM_17) ||
+ (this->animIndex == ENAKINDONUTS_ANIM_5) || (this->animIndex == ENAKINDONUTS_ANIM_6) ||
+ (this->animIndex == ENAKINDONUTS_ANIM_7) || (this->animIndex == ENAKINDONUTS_ANIM_16)) {
+ if ((limbIndex == BUSINESS_SCRUB_LIMB_RIGHT_HAND_BAG) || (limbIndex == BUSINESS_SCRUB_LIMB_LEFT_HAND_BAG) ||
+ (limbIndex == BUSINESS_SCRUB_LIMB_LEFT_ARM_BAG) || (limbIndex == BUSINESS_SCRUB_LIMB_SCALP) ||
+ (limbIndex == BUSINESS_SCRUB_LIMB_HAIR) || (limbIndex == BUSINESS_SCRUB_LIMB_RIGHT_HAND_HAT)) {
*dList = NULL;
}
- } else if ((this->unk_338 == 8) || (this->unk_338 == 19)) {
+ } else if ((this->animIndex == ENAKINDONUTS_ANIM_8) || (this->animIndex == ENAKINDONUTS_ANIM_19)) {
switch (this->unk_33E) {
case 1:
- if ((limbIndex == 16) || (limbIndex == 21) || (limbIndex == 27) || (limbIndex == 25)) {
+ if ((limbIndex == BUSINESS_SCRUB_LIMB_RIGHT_HAND_BAG) ||
+ (limbIndex == BUSINESS_SCRUB_LIMB_LEFT_HAND_BAG) ||
+ (limbIndex == BUSINESS_SCRUB_LIMB_LEFT_ARM_BAG) || (limbIndex == BUSINESS_SCRUB_LIMB_HAT)) {
*dList = NULL;
}
break;
case 2:
case 3:
- if ((limbIndex == 16) || (limbIndex == 21) || (limbIndex == 27) || (limbIndex == 15) ||
- (limbIndex == 25)) {
+ if ((limbIndex == BUSINESS_SCRUB_LIMB_RIGHT_HAND_BAG) ||
+ (limbIndex == BUSINESS_SCRUB_LIMB_LEFT_HAND_BAG) ||
+ (limbIndex == BUSINESS_SCRUB_LIMB_LEFT_ARM_BAG) ||
+ (limbIndex == BUSINESS_SCRUB_LIMB_RIGHT_HAND_HAT) || (limbIndex == BUSINESS_SCRUB_LIMB_HAT)) {
*dList = NULL;
}
break;
+
+ default:
+ break;
}
- } else if (((this->unk_338 == 9) || (this->unk_338 == 10)) && ((limbIndex == 15) || (limbIndex == 25))) {
+ } else if (((this->animIndex == ENAKINDONUTS_ANIM_9) || (this->animIndex == ENAKINDONUTS_ANIM_10)) &&
+ ((limbIndex == BUSINESS_SCRUB_LIMB_RIGHT_HAND_HAT) || (limbIndex == BUSINESS_SCRUB_LIMB_HAT))) {
*dList = NULL;
}
- if (limbIndex == 26) {
- if ((this->unk_338 == 6) || (this->unk_338 == 5) || (this->unk_338 == 7)) {
- *dList = object_dnt_DL_001350;
+ if (limbIndex == BUSINESS_SCRUB_LIMB_EYES) {
+ if ((this->animIndex == ENAKINDONUTS_ANIM_6) || (this->animIndex == ENAKINDONUTS_ANIM_5) ||
+ (this->animIndex == ENAKINDONUTS_ANIM_7)) {
+ *dList = gBusinessScrubEyesWideDL;
} else {
- *dList = object_dnt_DL_008290;
+ *dList = gBusinessScrubEyesDL;
}
}
return false;
@@ -1689,15 +1797,18 @@ void EnAkindonuts_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3
void EnAkindonuts_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
EnAkindonuts* this = THIS;
- if (((this->unk_33E == 1) || (this->unk_33E == 2)) && ((limbIndex == 23) || (limbIndex == 24))) {
+ if (((this->unk_33E == 1) || (this->unk_33E == 2)) &&
+ ((limbIndex == BUSINESS_SCRUB_LIMB_SCALP) || (limbIndex == BUSINESS_SCRUB_LIMB_HAIR))) {
Matrix_Scale(this->unk_340, this->unk_344, this->unk_348, MTXMODE_APPLY);
}
- if ((this->unk_338 == 9) && ((limbIndex == 16) || (limbIndex == 21) || (limbIndex == 27))) {
+ if ((this->animIndex == ENAKINDONUTS_ANIM_9) &&
+ ((limbIndex == BUSINESS_SCRUB_LIMB_RIGHT_HAND_BAG) || (limbIndex == BUSINESS_SCRUB_LIMB_LEFT_HAND_BAG) ||
+ (limbIndex == BUSINESS_SCRUB_LIMB_LEFT_ARM_BAG))) {
Matrix_Scale(this->unk_34C, this->unk_34C, this->unk_34C, MTXMODE_APPLY);
}
- if (limbIndex == 24) {
+ if (limbIndex == BUSINESS_SCRUB_LIMB_HAIR) {
Matrix_RotateYS(this->unk_352, MTXMODE_APPLY);
}
}
@@ -1705,7 +1816,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..09df4fca3 100644
--- a/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.h
+++ b/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.h
@@ -2,6 +2,7 @@
#define Z_EN_AKINDONUTS_H
#include "global.h"
+#include "objects/object_dnt/object_dnt.h"
struct EnAkindonuts;
@@ -10,25 +11,27 @@ 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;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[28];
- /* 0x230 */ Vec3s morphTable[28];
+ /* 0x188 */ Vec3s jointTable[BUSINESS_SCRUB_LIMB_MAX];
+ /* 0x230 */ Vec3s morphTable[BUSINESS_SCRUB_LIMB_MAX];
/* 0x2D8 */ EnAkindonutsActionFunc actionFunc;
/* 0x2DC */ EnAkindonutsUnkFunc unk_2DC;
/* 0x2E0 */ ColliderCylinder collider;
/* 0x32C */ u16 unk_32C;
/* 0x330 */ Path* path;
/* 0x334 */ s32 unk_334;
- /* 0x338 */ s16 unk_338;
+ /* 0x338 */ s16 animIndex;
/* 0x33A */ s16 unk_33A;
/* 0x33C */ u16 unk_33C;
/* 0x33E */ s16 unk_33E;
@@ -43,7 +46,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 da1cc7d7e..0f8679b3c 100644
--- a/src/overlays/actors/ovl_En_Al/z_en_al.c
+++ b/src/overlays/actors/ovl_En_Al/z_en_al.c
@@ -5,9 +5,8 @@
*/
#include "z_en_al.h"
-#include "objects/object_al/object_al.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((EnAl*)thisx)
@@ -119,11 +118,28 @@ static ColliderCylinderInit sCylinderInit = {
static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE };
-static AnimationInfoS sAnimationInfo[] = {
- { &object_al_Anim_000C54, 1.0f, 0, -1, 0, -4 }, { &object_al_Anim_00DBE0, 1.0f, 0, -1, 0, 0 },
- { &object_al_Anim_00DBE0, 1.0f, 0, -1, 0, -4 }, { &object_al_Anim_00ACA0, 1.0f, 0, -1, 2, 0 },
- { &object_al_Anim_00ACA0, -1.0f, 0, -1, 2, 0 }, { &object_al_Anim_00CA28, 1.0f, 0, -1, 0, -4 },
- { &object_al_Anim_00BCA4, 1.0f, 0, -1, 2, 0 }, { &object_al_Anim_00A764, 1.0f, 0, -1, 0, -4 },
+typedef enum {
+ /* -1 */ ENAL_ANIM_NONE = -1,
+ /* 0 */ ENAL_ANIM_0,
+ /* 1 */ ENAL_ANIM_1,
+ /* 2 */ ENAL_ANIM_2,
+ /* 3 */ ENAL_ANIM_3,
+ /* 4 */ ENAL_ANIM_4,
+ /* 5 */ ENAL_ANIM_5,
+ /* 6 */ ENAL_ANIM_6,
+ /* 7 */ ENAL_ANIM_7,
+ /* 8 */ ENAL_ANIM_MAX
+} EnAlAnimation;
+
+static AnimationInfoS sAnimationInfo[ENAL_ANIM_MAX] = {
+ { &object_al_Anim_000C54, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENAL_ANIM_0
+ { &object_al_Anim_00DBE0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAL_ANIM_1
+ { &object_al_Anim_00DBE0, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENAL_ANIM_2
+ { &object_al_Anim_00ACA0, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAL_ANIM_3
+ { &object_al_Anim_00ACA0, -1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAL_ANIM_4
+ { &object_al_Anim_00CA28, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENAL_ANIM_5
+ { &object_al_Anim_00BCA4, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAL_ANIM_6
+ { &object_al_Anim_00A764, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENAL_ANIM_7
};
Vec3f D_80BE0070 = { 1000.0f, 0.0f, 0.0f };
@@ -159,30 +175,30 @@ Actor* func_80BDE1A0(EnAl* this, PlayState* play, u8 arg0, s16 arg1) {
return foundActor;
}
-void func_80BDE250(EnAl* this) {
- this->skelAnime.playSpeed = this->unk_4C8;
+void EnAl_UpdateSkelAnime(EnAl* this) {
+ this->skelAnime.playSpeed = this->animPlaySpeed;
SkelAnime_Update(&this->skelAnime);
}
-s32 func_80BDE27C(EnAl* this, s32 arg1) {
- s32 phi_v1 = false;
- s32 ret = false;
+s32 EnAl_ChangeAnim(EnAl* this, s32 animIndex) {
+ s32 changeAnim = false;
+ s32 didAnimChange = false;
- if ((arg1 == 1) || (arg1 == 2)) {
- if ((this->unk_4F8 != 1) && (this->unk_4F8 != 2)) {
- phi_v1 = true;
+ if ((animIndex == ENAL_ANIM_1) || (animIndex == ENAL_ANIM_2)) {
+ if ((this->animIndex != ENAL_ANIM_1) && (this->animIndex != ENAL_ANIM_2)) {
+ changeAnim = true;
}
- } else if (arg1 != this->unk_4F8) {
- phi_v1 = true;
+ } else if (this->animIndex != animIndex) {
+ changeAnim = true;
}
- if (phi_v1) {
- this->unk_4F8 = arg1;
- ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, arg1);
- this->unk_4C8 = this->skelAnime.playSpeed;
+ if (changeAnim) {
+ this->animIndex = animIndex;
+ didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
+ this->animPlaySpeed = this->skelAnime.playSpeed;
}
- return ret;
+ return didAnimChange;
}
void func_80BDE318(EnAl* this, PlayState* play) {
@@ -219,30 +235,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) {
@@ -257,8 +273,8 @@ s32 func_80BDE4E0(EnAl* this, s16* arg1, s16 arg2) {
}
if (arg2 == *arg1) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CHAIR_ROLL);
- func_80BDE27C(this, 3);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_CHAIR_ROLL);
+ EnAl_ChangeAnim(this, ENAL_ANIM_3);
this->unk_4E8 = 0;
(*arg1)++;
}
@@ -272,7 +288,7 @@ s32 func_80BDE4E0(EnAl* this, s16* arg1, s16 arg2) {
if ((temp != (this->actor.world.rot.y / 364)) && (this->unk_4E8 < 20)) {
Math_ApproachS(&this->actor.world.rot.y, sp42, 3, 0x2AA8);
} else {
- func_80BDE27C(this, 5);
+ EnAl_ChangeAnim(this, ENAL_ANIM_5);
this->actor.world.rot.y = sp42;
this->unk_4E8 = 0;
(*arg1)++;
@@ -292,8 +308,8 @@ s32 func_80BDE678(EnAl* this, s16* arg1, s16 arg2) {
}
if (arg2 == *arg1) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CHAIR_ROLL);
- func_80BDE27C(this, 4);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_CHAIR_ROLL);
+ EnAl_ChangeAnim(this, ENAL_ANIM_4);
this->unk_4E8 = 0;
(*arg1)++;
}
@@ -305,7 +321,7 @@ s32 func_80BDE678(EnAl* this, s16* arg1, s16 arg2) {
if ((temp != (this->actor.world.rot.y / 364)) && (this->unk_4E8 < 20)) {
Math_ApproachS(&this->actor.world.rot.y, sp22, 3, 0x2AA8);
} else {
- func_80BDE27C(this, 2);
+ EnAl_ChangeAnim(this, ENAL_ANIM_2);
this->actor.world.rot.y = sp22;
this->unk_4E8 = 0;
(*arg1)++;
@@ -317,13 +333,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 +348,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,16 +359,19 @@ 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;
+
+ default:
+ break;
}
return sp20;
}
@@ -423,6 +443,9 @@ s32 func_80BDEA14(EnAl* this, PlayState* play) {
sp18 = true;
}
break;
+
+ default:
+ break;
}
return sp18;
}
@@ -469,24 +492,27 @@ s32* func_80BDEABC(EnAl* this, PlayState* play) {
return D_80BDFF24;
}
return D_80BDFDF8;
+
+ default:
+ return NULL;
}
- return NULL;
}
s32 func_80BDEC2C(EnAl* this, PlayState* play) {
Player* player = GET_PLAYER(play);
s32 ret = false;
- if ((this->unk_4C2 & 7) && Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ if (((this->unk_4C2 & SUBS_OFFER_MODE_MASK) != SUBS_OFFER_MODE_NONE) &&
+ Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->unk_4C2 &= ~0x1800;
- if (player->exchangeItemId == 0x33) {
+ if (player->exchangeItemAction == PLAYER_IA_LETTER_MAMA) {
this->unk_4C2 |= 0x800;
- this->unk_4F4 = player->exchangeItemId;
- } else if (player->exchangeItemId != 0) {
+ this->unk_4F4 = player->exchangeItemAction;
+ } else if (player->exchangeItemAction != PLAYER_IA_NONE) {
this->unk_4C2 |= 0x1000;
- this->unk_4F4 = player->exchangeItemId;
+ this->unk_4F4 = player->exchangeItemAction;
}
- SubS_UpdateFlags(&this->unk_4C2, 0, 7);
+ SubS_SetOfferMode(&this->unk_4C2, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
this->unk_4E6 = 0;
this->unk_4EC = 0;
this->actor.child = this->unk_368;
@@ -514,7 +540,7 @@ void func_80BDED20(EnAl* this) {
Math_Vec3f_Copy(&sp34, &this->actor.focus.pos);
if (this->unk_368->id == ACTOR_PLAYER) {
- sp40.y = ((Player*)this->unk_368)->bodyPartsPos[7].y + 3.0f;
+ sp40.y = ((Player*)this->unk_368)->bodyPartsPos[PLAYER_BODYPART_HEAD].y + 3.0f;
} else {
Math_Vec3f_Copy(&sp40, &this->unk_368->focus.pos);
}
@@ -547,12 +573,12 @@ void func_80BDEE5C(EnAl* this) {
void func_80BDEF3C(EnAl* this, PlayState* play) {
if (this->unk_4E4 == 0) {
- func_80BDE27C(this, 7);
+ EnAl_ChangeAnim(this, ENAL_ANIM_7);
this->unk_4C2 &= ~0x20;
this->unk_4C2 |= 0x200;
this->unk_4E4++;
} else if ((this->unk_4E4 == 1) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- func_80BDE27C(this, 0);
+ EnAl_ChangeAnim(this, ENAL_ANIM_0);
this->unk_4C2 &= ~0x200;
this->unk_4C2 |= 0x20;
this->unk_4E4++;
@@ -561,10 +587,10 @@ void func_80BDEF3C(EnAl* this, PlayState* play) {
void func_80BDEFE4(EnAl* this, PlayState* play) {
if (this->unk_4E4 == 0) {
- func_80BDE27C(this, 6);
+ EnAl_ChangeAnim(this, ENAL_ANIM_6);
this->unk_4E4 += 1;
} else if ((this->unk_4E4 == 1) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- func_80BDE27C(this, 5);
+ EnAl_ChangeAnim(this, ENAL_ANIM_5);
this->unk_4E4 += 1;
}
}
@@ -618,7 +644,10 @@ s32 func_80BDF064(EnAl* this, PlayState* play) {
case 0x2B19:
case 0x2B20:
case 0x2B3C:
- func_80BDE27C(this, 5);
+ EnAl_ChangeAnim(this, ENAL_ANIM_5);
+ break;
+
+ default:
break;
}
}
@@ -641,8 +670,8 @@ s32 func_80BDF244(EnAl* this, PlayState* play, ScheduleOutput* scheduleOutput) {
Actor* temp_v0 = func_80BDE1A0(this, play, ACTORCAT_NPC, ACTOR_EN_TOTO);
if ((sp20 != NULL) && (sp20->update != NULL) && (temp_v0 != NULL) && (temp_v0->update != NULL)) {
- func_80BDE27C(this, 0);
- SubS_UpdateFlags(&this->unk_4C2, 3, 7);
+ EnAl_ChangeAnim(this, ENAL_ANIM_0);
+ SubS_SetOfferMode(&this->unk_4C2, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_368 = sp20;
this->unk_4C2 |= 0x20;
ret = true;
@@ -651,17 +680,20 @@ s32 func_80BDF244(EnAl* this, PlayState* play, ScheduleOutput* scheduleOutput) {
}
s32 func_80BDF308(EnAl* this, PlayState* play, ScheduleOutput* scheduleOutput) {
- SubS_UpdateFlags(&this->unk_4C2, 3, 7);
+ SubS_SetOfferMode(&this->unk_4C2, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
switch (scheduleOutput->result) {
case 1:
- func_80BDE27C(this, 0);
+ EnAl_ChangeAnim(this, ENAL_ANIM_0);
break;
case 2:
this->unk_4F0 = PLAYER_IA_NONE;
this->unk_4EA = 0;
- func_80BDE27C(this, 2);
+ EnAl_ChangeAnim(this, ENAL_ANIM_2);
+ break;
+
+ default:
break;
}
return true;
@@ -670,8 +702,8 @@ s32 func_80BDF308(EnAl* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 func_80BDF390(EnAl* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret;
- this->actor.flags |= ACTOR_FLAG_1;
- this->actor.targetMode = 0;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
+ this->actor.targetMode = TARGET_MODE_0;
this->unk_4F0 = PLAYER_IA_NONE;
this->unk_4C2 = 0;
this->unk_4D4 = 40.0f;
@@ -721,9 +753,9 @@ void func_80BDF414(EnAl* this, PlayState* play) {
temp_v0 = this->actor.world.rot.y - this->actor.yawTowardsPlayer;
if (((this->unk_4EA == 0) && (ABS_ALT(temp_v0) >= 0x5800)) ||
((this->unk_4EA == 5) && (ABS_ALT(temp_v0) >= 0x5800)) || (this->unk_4EA == 2)) {
- SubS_UpdateFlags(&this->unk_4C2, 3, 7);
+ SubS_SetOfferMode(&this->unk_4C2, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
} else {
- SubS_UpdateFlags(&this->unk_4C2, 0, 7);
+ SubS_SetOfferMode(&this->unk_4C2, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
}
}
@@ -740,6 +772,9 @@ void func_80BDF578(EnAl* this, PlayState* play) {
case 2:
func_80BDF414(this, play);
break;
+
+ default:
+ break;
}
Math_ApproachS(&this->actor.shape.rot.y, this->actor.world.rot.y, 3, 0x2AA8);
@@ -752,11 +787,11 @@ void func_80BDF5E8(EnAl* this, PlayState* play) {
if (!Schedule_RunScript(play, D_80BDFC70, &sp20) ||
((this->unk_35C != sp20.result) && !func_80BDF390(this, play, &sp20))) {
this->actor.shape.shadowDraw = NULL;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
sp20.result = 0;
} else {
this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}
this->unk_35C = sp20.result;
this->unk_368 = func_80BDE384(this, play);
@@ -765,7 +800,7 @@ void func_80BDF5E8(EnAl* this, PlayState* play) {
void func_80BDF6C4(EnAl* this, PlayState* play) {
if (func_8010BF58(&this->actor, play, this->unk_360, this->unk_4EC, &this->unk_364)) {
- SubS_UpdateFlags(&this->unk_4C2, 3, 7);
+ SubS_SetOfferMode(&this->unk_4C2, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_4C2 &= ~0x20;
this->unk_4C2 |= 0x200;
this->actor.child = NULL;
@@ -783,8 +818,8 @@ void EnAl_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, NULL, 0.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &gMadameAromaSkel, NULL, this->jointTable, this->morphTable,
MADAME_AROMA_LIMB_MAX);
- this->unk_4F8 = -1;
- func_80BDE27C(this, 1);
+ this->animIndex = ENAL_ANIM_NONE;
+ EnAl_ChangeAnim(this, ENAL_ANIM_1);
Collider_InitAndSetCylinder(play, &this->unk_310, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit);
Actor_SetScale(&this->actor, 0.01f);
@@ -810,9 +845,9 @@ void EnAl_Update(Actor* thisx, PlayState* play) {
func_80BDF064(this, play);
if (this->unk_35C != 0) {
- func_80BDE250(this);
+ EnAl_UpdateSkelAnime(this);
func_80BDEE5C(this);
- func_8013C964(&this->actor, play, this->unk_4D4, 30.0f, this->unk_4F0, this->unk_4C2 & 7);
+ SubS_Offer(&this->actor, play, this->unk_4D4, 30.0f, this->unk_4F0, this->unk_4C2 & SUBS_OFFER_MODE_MASK);
func_80BDE318(this, play);
}
}
@@ -830,6 +865,9 @@ s32 EnAl_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po
case MADAME_AROMA_LIMB_HEAD:
break;
+
+ default:
+ break;
}
return false;
}
@@ -866,6 +904,9 @@ void EnAl_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
Matrix_MultVec3f(&D_80BE0070, &this->actor.focus.pos);
Math_Vec3s_Copy(&this->actor.focus.rot, &this->actor.world.rot);
break;
+
+ default:
+ break;
}
}
@@ -886,7 +927,7 @@ void EnAl_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
stepRot = false;
}
- if (limbIndex == 16) {
+ if (limbIndex == MADAME_AROMA_LIMB_HEAD) {
SubS_UpdateLimb(this->unk_4DC + 0x4000, this->unk_4DE + this->actor.shape.rot.y + 0x4000, &this->unk_36C,
&this->unk_378, stepRot, overrideRot);
Matrix_Pop();
@@ -906,7 +947,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_Al/z_en_al.h b/src/overlays/actors/ovl_En_Al/z_en_al.h
index 77e1011bf..de6390287 100644
--- a/src/overlays/actors/ovl_En_Al/z_en_al.h
+++ b/src/overlays/actors/ovl_En_Al/z_en_al.h
@@ -2,6 +2,7 @@
#define Z_EN_AL_H
#include "global.h"
+#include "objects/object_al/object_al.h"
struct EnAl;
@@ -22,14 +23,14 @@ typedef struct EnAl {
/* 0x368 */ Actor* unk_368;
/* 0x36C */ Vec3f unk_36C;
/* 0x378 */ Vec3s unk_378;
- /* 0x37E */ Vec3s jointTable[27];
- /* 0x420 */ Vec3s morphTable[27];
+ /* 0x37E */ Vec3s jointTable[MADAME_AROMA_LIMB_MAX];
+ /* 0x420 */ Vec3s morphTable[MADAME_AROMA_LIMB_MAX];
/* 0x4C2 */ u16 unk_4C2;
/* 0x4C4 */ u16 unk_4C4;
- /* 0x4C8 */ f32 unk_4C8;
- /* 0x4CC */ UNK_TYPE1 unk4CC[8];
+ /* 0x4C8 */ f32 animPlaySpeed;
+ /* 0x4CC */ UNK_TYPE1 unk4CC[0x8];
/* 0x4D4 */ f32 unk_4D4;
- /* 0x4D8 */ UNK_TYPE1 unk4D8[4];
+ /* 0x4D8 */ UNK_TYPE1 unk4D8[0x4];
/* 0x4DC */ s16 unk_4DC;
/* 0x4DE */ s16 unk_4DE;
/* 0x4E0 */ s16 unk_4E0;
@@ -41,8 +42,8 @@ typedef struct EnAl {
/* 0x4EC */ EnAlUnkFunc unk_4EC;
/* 0x4F0 */ s32 unk_4F0;
/* 0x4F4 */ s32 unk_4F4;
- /* 0x4F8 */ s32 unk_4F8;
- /* 0x4FC */ UNK_TYPE1 unk4FC[4];
+ /* 0x4F8 */ s32 animIndex;
+ /* 0x4FC */ UNK_TYPE1 unk4FC[0x4];
} EnAl; // size = 0x500
#endif // Z_EN_AL_H
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 f76ebc4f3..916bfca1b 100644
--- a/src/overlays/actors/ovl_En_Am/z_en_am.c
+++ b/src/overlays/actors/ovl_En_Am/z_en_am.c
@@ -7,8 +7,9 @@
#include "z_en_am.h"
#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
#include "overlays/actors/ovl_En_Bombf/z_en_bombf.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
-#define FLAGS (ACTOR_FLAG_400 | ACTOR_FLAG_4 | ACTOR_FLAG_1)
+#define FLAGS (ACTOR_FLAG_400 | ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY)
#define THIS ((EnAm*)thisx)
@@ -145,23 +146,6 @@ static Color_RGBA8 D_808B1120 = { 150, 150, 150, 255 };
static Color_RGBA8 D_808B1124 = { 100, 100, 100, 150 };
-static Vec3f D_808B1128[] = {
- { 4700.0f, -500.0f, 1800.0f }, { 4700.0f, -500.0f, -1800.0f }, { 2000.0f, -1500.0f, 0.0f },
- { 2000.0f, 0.0f, -1500.0f }, { 2000.0f, 0.0f, 1500.0f },
-};
-
-static Vec3f D_808B1164[] = {
- { 0.0f, -3000.0f, 0.0f },
- { 700.0f, -800.0f, 0.0f },
-};
-
-static Vec3f D_808B117C[] = {
- { 800.0f, 1000.0f, -1000.0f },
- { 800.0f, 1000.0f, 1000.0f },
- { 800.0f, -1000.0f, 1000.0f },
- { 800.0f, -1000.0f, -1000.0f },
-};
-
void EnAm_Init(Actor* thisx, PlayState* play) {
EnAm* this = THIS;
@@ -193,19 +177,19 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_EN_AMOS_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_AMOS_WALK);
Actor_SpawnFloorDustRing(play, &this->actor, &this->actor.world.pos, 4.0f, 3, 8.0f, 300, 15, 0);
}
void func_808AFF9C(EnAm* this) {
- f32 lastFrame = Animation_GetLastFrame(&gArmosPushedBackAnim);
+ f32 endFrame = Animation_GetLastFrame(&gArmosPushedBackAnim);
- Animation_Change(&this->skelAnime, &gArmosPushedBackAnim, 0.0f, lastFrame, lastFrame, ANIMMODE_LOOP, 0.0f);
+ Animation_Change(&this->skelAnime, &gArmosPushedBackAnim, 0.0f, endFrame, endFrame, ANIMMODE_LOOP, 0.0f);
this->enemyCollider.info.bumper.dmgFlags = 0x80000088;
this->interactCollider.info.bumper.dmgFlags = 0x77CFFF77;
if (this->actor.colChkInfo.health != 0) {
@@ -225,14 +209,14 @@ void EnAm_RemoveEnemyTexture(EnAm* this, PlayState* play) {
this->textureBlend -= 10;
} else {
this->textureBlend = 0;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->unkFlag = 0;
}
}
void EnAm_WakeUp(EnAm* this) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_AMOS_WAVE);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_AMOS_VOICE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_AMOS_WAVE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_AMOS_VOICE);
this->returnHomeTimer = 300;
this->actionFunc = EnAm_ApplyEnemyTexture;
}
@@ -246,7 +230,7 @@ void EnAm_ApplyEnemyTexture(EnAm* this, PlayState* play) {
if (this->textureBlend + 20 >= 255) {
this->textureBlend = 255;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->enemyCollider.info.bumper.dmgFlags = 0x81C2C788;
this->interactCollider.info.bumper.dmgFlags = 0x760D3877;
this->enemyCollider.base.atFlags |= AT_ON;
@@ -254,7 +238,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;
@@ -265,22 +249,22 @@ void EnAm_ApplyEnemyTexture(EnAm* this, PlayState* play) {
void func_808B0208(EnAm* this, PlayState* play) {
// If the armos is against a wall, rotate and turn away from it
- if ((this->actor.speedXZ > 0.0f) && (this->actor.bgCheckFlags & 8)) {
+ if ((this->actor.speed > 0.0f) && (this->actor.bgCheckFlags & BGCHECKFLAG_WALL)) {
this->actor.world.rot.y = (this->actor.wallYaw * 2) - this->actor.world.rot.y;
- this->actor.world.pos.x += this->actor.speedXZ * Math_SinS(this->actor.world.rot.y);
- this->actor.world.pos.z += this->actor.speedXZ * Math_CosS(this->actor.world.rot.y);
+ this->actor.world.pos.x += this->actor.speed * Math_SinS(this->actor.world.rot.y);
+ this->actor.world.pos.z += this->actor.speed * Math_CosS(this->actor.world.rot.y);
}
SkelAnime_Update(&this->skelAnime);
- if (Animation_OnFrame(&this->skelAnime, 8.0f) != 0) {
- this->actor.speedXZ = this->speed;
+ if (Animation_OnFrame(&this->skelAnime, 8.0f)) {
+ this->actor.speed = this->speed;
this->actor.velocity.y = 12.0f;
} else if (this->skelAnime.curFrame > 11.0f) {
- if (!(this->actor.bgCheckFlags & 1)) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
this->skelAnime.curFrame = 11.0f;
} else {
Math_ScaledStepToS(&this->actor.world.rot.y, this->armosYaw, 0x1F40);
- this->actor.speedXZ = 0.0f;
- if (this->actor.bgCheckFlags & 2) {
+ this->actor.speed = 0.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
EnAm_SpawnEffects(this, play);
}
}
@@ -293,7 +277,7 @@ void func_808B0208(EnAm* this, PlayState* play) {
void func_808B0358(EnAm* this) {
Animation_PlayLoopSetSpeed(&this->skelAnime, &gArmosHopAnim, 4.0f);
this->explodeTimer = 3;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->speed = 6.0f;
this->actionFunc = func_808B03C0;
@@ -302,12 +286,12 @@ void func_808B0358(EnAm* this) {
void func_808B03C0(EnAm* this, PlayState* play) {
this->armosYaw = this->actor.yawTowardsPlayer;
func_808B0208(this, play);
- if (this->actor.bgCheckFlags & 2) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
this->explodeTimer--;
}
if (this->explodeTimer == 0) {
func_808B0640(this);
- } else if ((this->returnHomeTimer == 0) || Actor_XZDistanceToPoint(&this->actor, &this->actor.home.pos) > 240.0f) {
+ } else if ((this->returnHomeTimer == 0) || Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) > 240.0f) {
func_808B0460(this);
}
}
@@ -315,7 +299,7 @@ void func_808B03C0(EnAm* this, PlayState* play) {
void func_808B0460(EnAm* this) {
this->actor.world.rot.y = this->actor.shape.rot.y;
this->speed = 0.0f;
- this->armosYaw = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ this->armosYaw = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
this->actionFunc = func_808B04A8;
}
@@ -334,7 +318,7 @@ void func_808B04E4(EnAm* this) {
void func_808B0508(EnAm* this, PlayState* play) {
func_808B0208(this, play);
- if (!(this->actor.bgCheckFlags & 1)) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
Math_StepToF(&this->actor.world.pos.x, this->actor.home.pos.x, 2.0f);
Math_StepToF(&this->actor.world.pos.z, this->actor.home.pos.z, 2.0f);
}
@@ -345,15 +329,15 @@ void func_808B0508(EnAm* this, PlayState* play) {
void func_808B057C(EnAm* this) {
this->speed = 6.0f;
- this->armosYaw = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ this->armosYaw = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
this->explodeTimer = 1;
this->actionFunc = func_808B05C8;
}
void func_808B05C8(EnAm* this, PlayState* play) {
- this->armosYaw = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ this->armosYaw = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
func_808B0208(this, play);
- if (Actor_XZDistanceToPoint(&this->actor, &this->actor.home.pos) < 8.0f) {
+ if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) < 8.0f) {
func_808B04E4(this);
}
}
@@ -372,26 +356,28 @@ void func_808B066C(EnAm* this, PlayState* play) {
this->armosYaw = this->actor.yawTowardsPlayer;
func_808B0208(this, play);
if (this->armosYaw == this->actor.shape.rot.y) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_AMOS_VOICE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_AMOS_VOICE);
func_808B0358(this);
}
}
}
void EnAm_TakeDamage(EnAm* this, PlayState* play) {
- Animation_Change(&this->skelAnime, &gArmosTakeDamageAnim, 1.0f, 4.0f,
- Animation_GetLastFrame(&gArmosTakeDamageAnim) - 6, ANIMMODE_ONCE, 0.0f);
+ f32 endFrame = Animation_GetLastFrame(&gArmosTakeDamageAnim) - 6;
+
+ Animation_Change(&this->skelAnime, &gArmosTakeDamageAnim, 1.0f, 4.0f, endFrame, ANIMMODE_ONCE, 0.0f);
func_800BE504(&this->actor, &this->enemyCollider);
- this->actor.speedXZ = 6.0f;
- Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, 0, Animation_GetLastFrame(&gArmosTakeDamageAnim) - 10);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EYEGOLE_DAMAGE);
+ this->actor.speed = 6.0f;
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA,
+ Animation_GetLastFrame(&gArmosTakeDamageAnim) - 10);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_DAMAGE);
this->enemyCollider.base.acFlags &= ~AC_ON;
this->textureBlend = 255;
this->actionFunc = func_808B07A8;
}
void func_808B07A8(EnAm* this, PlayState* play) {
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f);
+ Math_StepToF(&this->actor.speed, 0.0f, 0.5f);
if (SkelAnime_Update(&this->skelAnime)) {
if (this->actor.colChkInfo.health == 0) {
func_808B0820(this);
@@ -407,7 +393,7 @@ void func_808B0820(EnAm* this) {
this->explodeTimer = 64;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actor.flags |= ACTOR_FLAG_10;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->speed = 6.0f;
this->actionFunc = func_808B0894;
}
@@ -421,17 +407,18 @@ 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;
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EYEGOLE_DEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_DEAD);
Item_DropCollectibleRandom(play, &this->actor, &this->actor.world.pos, 0xB0);
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);
@@ -440,7 +427,7 @@ void func_808B0894(EnAm* this, PlayState* play) {
Actor_Kill(&this->actor);
return;
} else if (!(this->explodeTimer & 3)) {
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 4);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 4);
}
if (this->actor.world.rot.z < 0x1F40) {
this->actor.world.rot.z += 0x320;
@@ -451,12 +438,12 @@ void func_808B0894(EnAm* this, PlayState* play) {
void func_808B0AD0(EnAm* this, PlayState* play) {
Animation_Change(&this->skelAnime, &gArmosPushedBackAnim, 1.0f, 0.0f, 8.0f, ANIMMODE_ONCE, 0.0f);
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
- this->actor.speedXZ = -6.0f;
+ this->actor.speed = -6.0f;
this->actionFunc = func_808B0B4C;
}
void func_808B0B4C(EnAm* this, PlayState* play) {
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f);
+ Math_StepToF(&this->actor.speed, 0.0f, 0.5f);
if (SkelAnime_Update(&this->skelAnime)) {
func_808B0358(this);
}
@@ -481,7 +468,7 @@ s32 EnAm_UpdateDamage(EnAm* this, PlayState* play) {
this->drawDmgEffAlpha = 4.0f;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->enemyCollider.info.bumper.hitPos.x,
this->enemyCollider.info.bumper.hitPos.y, this->enemyCollider.info.bumper.hitPos.z, 0, 0, 0,
- CLEAR_TAG_LARGE_LIGHT_RAYS);
+ CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
}
EnAm_TakeDamage(this, play);
return true;
@@ -508,7 +495,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);
@@ -517,7 +506,7 @@ void EnAm_Update(Actor* thisx, PlayState* play) {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->enemyCollider.base);
}
CollisionCheck_SetAC(play, &play->colChkCtx, &this->interactCollider.base);
- if (this->enemyCollider.base.atFlags & AC_ON) {
+ if (this->enemyCollider.base.atFlags & AT_ON) {
this->actor.flags |= ACTOR_FLAG_1000000;
CollisionCheck_SetAT(play, &play->colChkCtx, &this->enemyCollider.base);
}
@@ -526,6 +515,26 @@ void EnAm_Update(Actor* thisx, PlayState* play) {
this->drawDmgEffScale = (this->drawDmgEffScale > 0.7f) ? 0.7f : this->drawDmgEffScale;
}
+static Vec3f D_808B1128[] = {
+ { 4700.0f, -500.0f, 1800.0f }, // ENAM_BODYPART_0
+ { 4700.0f, -500.0f, -1800.0f }, // ENAM_BODYPART_1
+ { 2000.0f, -1500.0f, 0.0f }, // ENAM_BODYPART_2
+ { 2000.0f, 0.0f, -1500.0f }, // ENAM_BODYPART_3
+ { 2000.0f, 0.0f, 1500.0f }, // ENAM_BODYPART_4
+};
+
+static Vec3f D_808B1164[] = {
+ { 0.0f, -3000.0f, 0.0f }, // ENAM_BODYPART_5, ENAM_BODYPART_7
+ { 700.0f, -800.0f, 0.0f }, // ENAM_BODYPART_6, ENAM_BODYPART_8
+};
+
+static Vec3f D_808B117C[] = {
+ { 800.0f, 1000.0f, -1000.0f }, // ENAM_BODYPART_9
+ { 800.0f, 1000.0f, 1000.0f }, // ENAM_BODYPART_10
+ { 800.0f, -1000.0f, 1000.0f }, // ENAM_BODYPART_11
+ { 800.0f, -1000.0f, -1000.0f }, // ENAM_BODYPART_12
+};
+
void EnAm_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
s32 i;
s32 phi_s3;
@@ -535,18 +544,19 @@ void EnAm_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
phi_s2 = 0;
phi_s1 = 0;
- if (limbIndex == 4) {
- phi_s2 = &this->limbPos[0];
+ if (limbIndex == OBJECT_AM_LIMB_04) {
+ phi_s2 = &this->bodyPartsPos[ENAM_BODYPART_0];
phi_s1 = D_808B1128;
- phi_s3 = 5;
- } else if (limbIndex == 13) {
- phi_s2 = &this->limbPos[9];
+ phi_s3 = ARRAY_COUNT(D_808B1128);
+ } else if (limbIndex == OBJECT_AM_LIMB_0D) {
+ phi_s2 = &this->bodyPartsPos[ENAM_BODYPART_9];
phi_s1 = D_808B117C;
- phi_s3 = 4;
- } else if ((limbIndex == 7) || (limbIndex == 10)) {
- phi_s2 = (limbIndex == 7) ? &this->limbPos[5] : &this->limbPos[7];
+ phi_s3 = ARRAY_COUNT(D_808B117C);
+ } else if ((limbIndex == OBJECT_AM_LIMB_07) || (limbIndex == OBJECT_AM_LIMB_0A)) {
+ phi_s2 = (limbIndex == OBJECT_AM_LIMB_07) ? &this->bodyPartsPos[ENAM_BODYPART_5]
+ : &this->bodyPartsPos[ENAM_BODYPART_7];
phi_s1 = D_808B1164;
- phi_s3 = 2;
+ phi_s3 = ARRAY_COUNT(D_808B1164);
} else {
phi_s3 = 0;
}
@@ -560,13 +570,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,
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, ENAM_BODYPART_MAX, this->drawDmgEffScale, 0.0f,
this->drawDmgEffAlpha, ACTOR_DRAW_DMGEFF_LIGHT_ORBS);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Am/z_en_am.h b/src/overlays/actors/ovl_En_Am/z_en_am.h
index e482e2cba..4bc52d26a 100644
--- a/src/overlays/actors/ovl_En_Am/z_en_am.h
+++ b/src/overlays/actors/ovl_En_Am/z_en_am.h
@@ -8,6 +8,23 @@ struct EnAm;
typedef void (*EnAmActionFunc)(struct EnAm*, PlayState*);
+typedef enum EnAmBodyPart {
+ /* 0 */ ENAM_BODYPART_0,
+ /* 1 */ ENAM_BODYPART_1,
+ /* 2 */ ENAM_BODYPART_2,
+ /* 3 */ ENAM_BODYPART_3,
+ /* 4 */ ENAM_BODYPART_4,
+ /* 5 */ ENAM_BODYPART_5,
+ /* 6 */ ENAM_BODYPART_6,
+ /* 7 */ ENAM_BODYPART_7,
+ /* 8 */ ENAM_BODYPART_8,
+ /* 9 */ ENAM_BODYPART_9,
+ /* 10 */ ENAM_BODYPART_10,
+ /* 11 */ ENAM_BODYPART_11,
+ /* 12 */ ENAM_BODYPART_12,
+ /* 13 */ ENAM_BODYPART_MAX
+} EnAmBodyPart;
+
typedef struct EnAm {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
@@ -22,7 +39,7 @@ typedef struct EnAm {
/* 0x240 */ f32 speed; // Hopping speed of Armos
/* 0x244 */ f32 drawDmgEffAlpha;
/* 0x248 */ f32 drawDmgEffScale;
- /* 0x24C */ Vec3f limbPos[13];
+ /* 0x24C */ Vec3f bodyPartsPos[ENAM_BODYPART_MAX];
/* 0x2E8 */ ColliderCylinder enemyCollider; // Collider for when Armos is Hostile
/* 0x334 */ ColliderCylinder interactCollider; // Collider for when an interactable Armos is docile
} EnAm; // size = 0x380
diff --git a/src/overlays/actors/ovl_En_An/z_en_an.c b/src/overlays/actors/ovl_En_An/z_en_an.c
index 6b85ffc53..3ab31bfb8 100644
--- a/src/overlays/actors/ovl_En_An/z_en_an.c
+++ b/src/overlays/actors/ovl_En_An/z_en_an.c
@@ -6,7 +6,7 @@
#include "z_en_an.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((EnAn*)thisx)
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..c244a0c5e 100644
--- a/src/overlays/actors/ovl_En_And/z_en_and.c
+++ b/src/overlays/actors/ovl_En_And/z_en_and.c
@@ -6,18 +6,17 @@
#include "z_en_and.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#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,178 @@ ActorInit En_And_InitVars = {
(ActorFunc)EnAnd_Draw,
};
-#endif
+typedef enum {
+ /* -1 */ ENAND_ANIM_NONE = -1,
+ /* 0 */ ENAND_ANIM_0,
+ /* 1 */ ENAND_ANIM_1,
+ /* 2 */ ENAND_ANIM_2,
+ /* 3 */ ENAND_ANIM_3,
+ /* 4 */ ENAND_ANIM_4,
+ /* 5 */ ENAND_ANIM_5,
+ /* 6 */ ENAND_ANIM_6,
+ /* 7 */ ENAND_ANIM_7,
+ /* 8 */ ENAND_ANIM_MAX
+} EnAndAnimation;
-extern UNK_TYPE D_0600B380;
+static AnimationInfoS sAnimationInfo[ENAND_ANIM_MAX] = {
+ { &gAndStaticAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAND_ANIM_0
+ { &gAndIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAND_ANIM_1
+ { &gAndWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAND_ANIM_2
+ { &gAndRaiseHeadAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAND_ANIM_3
+ { &gAndRaisedHeadLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAND_ANIM_4
+ { &gAndRaiseHandAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAND_ANIM_5
+ { &gAndRaisedHandLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAND_ANIM_6
+ { &gAndRaisedHandWalkAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAND_ANIM_7
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_And/func_80C18B90.s")
+s32 EnAnd_ChangeAnim(EnAnd* this, s32 animIndex) {
+ s32 didAnimChange = false;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_And/func_80C18BD8.s")
+ if (this->animIndex != animIndex) {
+ this->animIndex = animIndex;
+ didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
+ }
+ return didAnimChange;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_And/func_80C18C50.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/EnAnd_Init.s")
+void EnAnd_HandleCutscene(EnAnd* this, PlayState* play) {
+ s32 csAnimIndex[] = {
+ ENAND_ANIM_0, ENAND_ANIM_1, ENAND_ANIM_2, ENAND_ANIM_3, ENAND_ANIM_5, ENAND_ANIM_7,
+ };
+ u16 cueId;
+ s32 cueChannel;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_And/EnAnd_Destroy.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);
+ cueId = play->csCtx.actorCues[cueChannel]->id;
+ if (this->cueId != (u8)cueId) {
+ this->cueId = cueId;
+ EnAnd_ChangeAnim(this, csAnimIndex[cueId]);
+ }
+ switch (this->cueId) {
+ case 3:
+ case 4:
+ if ((this->animIndex == ENAND_ANIM_3) || (this->animIndex == ENAND_ANIM_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_Update.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/func_80C18ED0.s")
+void EnAnd_Init(Actor* thisx, PlayState* play) {
+ EnAnd* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_And/EnAnd_Draw.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 = ENAND_ANIM_NONE;
+ EnAnd_ChangeAnim(this, ENAND_ANIM_0);
+ Actor_SetScale(&this->actor, 0.01f);
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ this->flags |= 8;
+ this->actionFunc = EnAnd_HandleCutscene;
+}
+
+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 8e98ae8a3..d27a8a93d 100644
--- a/src/overlays/actors/ovl_En_Ani/z_en_ani.c
+++ b/src/overlays/actors/ovl_En_Ani/z_en_ani.c
@@ -8,7 +8,7 @@
#include "z_en_ani.h"
#include "z64quake.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnAni*)thisx)
@@ -117,8 +117,8 @@ void EnAni_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->actor, sInitChain);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &gAniSkeleton, &gAniStandingNormalAnim, this->jointTable,
- this->morphTable, ANI_LIMB_MAX);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gAniSkel, &gAniStandingNormalAnim, this->jointTable, this->morphTable,
+ ANI_LIMB_MAX);
Animation_PlayOnce(&this->skelAnime, &gAniStandingNormalAnim);
Collider_InitAndSetCylinder(play, &this->collider1, &this->actor, &sCylinderInit);
Collider_InitAndSetCylinder(play, &this->collider2, &this->actor, &sCylinderInit);
@@ -164,7 +164,7 @@ void EnAni_SetText(EnAni* this, PlayState* play, u16 textId) {
this->actor.textId = textId;
if ((this->stateFlags & ANI_STATE_WRITHING) || ABS_ALT(diffAngle) <= 0x4300) {
if (this->actor.xzDistToPlayer < 100.0f) {
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
}
}
}
@@ -211,7 +211,7 @@ void EnAni_FallToGround(EnAni* this, PlayState* play) {
s32 pad;
s16 quakeIndex;
- if (this->actor.bgCheckFlags & 1) { // hit the ground
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->actor.flags &= ~ACTOR_FLAG_10;
this->actionFunc = EnAni_LandOnFoot;
this->actor.velocity.x = 0.0f;
@@ -220,12 +220,12 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_IT_HAMMER_HIT);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_HAMMER_HIT);
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0x2, 0x7D0, 0x100);
@@ -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 84feccbd8..783f157b1 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
@@ -8,31 +8,29 @@
#include "overlays/actors/ovl_En_Racedog/z_en_racedog.h"
#include "overlays/actors/ovl_En_Dg/z_en_dg.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#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,13 +44,30 @@ ActorInit En_Aob_01_InitVars = {
(ActorFunc)EnAob01_Draw,
};
-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 },
- { &gMamamuYanLaughLoopAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f },
- { &gMamamuYanSurpriseStartAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f },
- { &gMamamuYanSurpriseLoopAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f },
- { &gMamamuYanIdleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -6.0f },
+typedef enum {
+ /* 0 */ EN_AOB01_ANIM_IDLE,
+ /* 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_MORPH,
+ /* 6 */ EN_AOB01_ANIM_MAX
+} 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[EN_AOB01_ANIM_MAX] = {
+ { &gMamamuYanIdleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // EN_AOB01_ANIM_IDLE
+ { &gMamamuYanLaughStartAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // EN_AOB01_ANIM_LAUGH_START
+ { &gMamamuYanLaughLoopAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // EN_AOB01_ANIM_LAUGH_LOOP
+ { &gMamamuYanSurpriseStartAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // EN_AOB01_ANIM_SURPRISE_START
+ { &gMamamuYanSurpriseLoopAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // EN_AOB01_ANIM_SURPRISE_LOOP
+ { &gMamamuYanIdleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -6.0f }, // EN_AOB01_ANIM_IDLE_MORPH
};
static ColliderCylinderInit sCylinderInit = {
@@ -76,12 +91,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 +110,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, D_809C384C[i].unk_04 * 182.04445f, 0, enDgParams, 0xFFFF, this->actor.unk20, 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.unk20, 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 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
- if (this->unk_43C == 1) {
- if (curFrame == lastFrame) {
- this->unk_43C = 2;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
+ if (this->animIndex == EN_AOB01_ANIM_LAUGH_START) {
+ if (curFrame == endFrame) {
+ 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 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
- if ((this->unk_43C == 0) || (this->unk_43C == 5)) {
- if (curFrame == lastFrame) {
- this->unk_43C = 3;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
+ if ((this->animIndex == EN_AOB01_ANIM_IDLE) || (this->animIndex == EN_AOB01_ANIM_IDLE_MORPH)) {
+ if (curFrame == endFrame) {
+ 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) {
- if (curFrame == lastFrame) {
- this->unk_43C = 4;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 4);
+ } else if (this->animIndex == EN_AOB01_ANIM_SURPRISE_START) {
+ if (curFrame == endFrame) {
+ 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 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
- if ((this->unk_43C != 0) && (this->unk_43C != 5)) {
- if (curFrame == lastFrame) {
- this->unk_43C = 5;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 5);
+ if ((this->animIndex != EN_AOB01_ANIM_IDLE) && (this->animIndex != EN_AOB01_ANIM_IDLE_MORPH)) {
+ if (curFrame == endFrame) {
+ this->animIndex = EN_AOB01_ANIM_IDLE_MORPH;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_IDLE_MORPH);
return true;
}
} else {
@@ -199,7 +250,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 +258,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);
- play->msgCtx.msgMode = 0x43;
+ 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 = MSGMODE_TEXT_CLOSING;
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_63_01);
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_02);
- this->unk_2D2 |= 0x20;
- func_800FD750(0x40);
+ SET_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED);
+ this->stateFlags |= ENAOB01_FLAG_STARTED_RACE;
+ Environment_ForcePlaySequence(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) {
- play_sound(NA_SE_SY_ERROR);
- this->unk_210 = 0x3524;
- Message_StartTextbox(play, this->unk_210, &this->actor);
+ if (gSaveContext.save.saveInfo.playerData.rupees < 10) {
+ Audio_PlaySfx(NA_SE_SY_ERROR);
+ 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;
+ Audio_PlaySfx_MessageDecide();
+ 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);
+ Audio_PlaySfx_MessageCancel();
+ 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.msgMode = MSGMODE_TEXT_CLOSING;
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 +540,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 +555,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_UpdateFidgetTables(play, this->fidgetTableY, this->fidgetTableZ, MAMAMU_YAN_LIMB_MAX);
+ 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;
+ Actor_OfferTalk(&this->actor, play, 100.0f);
+ 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;
- func_800B8614(&this->actor, play, 100.0f);
+ this->stateFlags |= ENAOB01_FLAG_PLAYER_CAN_TALK;
+ Actor_OfferTalk(&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);
+ Audio_PlaySfx_MessageDecide();
+ this->stateFlags |= ENAOB01_FLAG_PLAYER_CONFIRMED_CHOICE;
+ EnAob01_BeforeRace_HandleConversation(this, play);
break;
case 1:
- func_8019F230();
- func_809C16DC(this, play);
+ Audio_PlaySfx_MessageCancel();
+ 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;
- play->msgCtx.msgMode = 0x43;
+ this->stateFlags &= ~ENAOB01_FLAG_LAUGH;
+ if (this->stateFlags & ENAOB01_FLAG_CONVERSATION_OVER) {
+ this->stateFlags &= ~ENAOB01_FLAG_CONVERSATION_OVER;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
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 +710,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 +729,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)) {
- if (Audio_GetActiveSequence(SEQ_PLAYER_BGM_MAIN) != NA_BGM_HORSE_GOAL) {
+/**
+ * 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,195 +812,233 @@ 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);
+ Actor_OfferTalk(&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;
- play->msgCtx.msgMode = 0x43;
+ this->rupeesBet = 0;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
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)) {
- Actor_PickUp(&this->actor, play, GI_RUPEE_RED, 300.0f, 300.0f);
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_DOGGY_RACETRACK_HEART_PIECE)) {
+ Actor_OfferGetItem(&this->actor, play, GI_RUPEE_RED, 300.0f, 300.0f);
} else {
- Actor_PickUp(&this->actor, play, GI_HEART_PIECE, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_HEART_PIECE, 300.0f, 300.0f);
}
}
}
-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)) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_63_02)) {
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_02);
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED)) {
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED);
}
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_63_01)) {
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_01);
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT)) {
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
}
- this->unk_210 = 0;
- func_800B85E0(&this->actor, play, 400.0f, -1);
- gSaveContext.eventInf[0] &= (u8)~7;
- this->actionFunc = func_809C2C9C;
+ this->textId = 0;
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
+ 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;
- func_80151938(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, -1);
+ Actor_OfferTalkExchangeEquiCylinder(&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_63_02)) {
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_02);
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED)) {
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED);
}
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_63_01)) {
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_01);
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT)) {
+ 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 +1051,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 +1106,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;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_IDLE);
Actor_SetScale(&this->actor, 0.01f);
- switch (gSaveContext.eventInf[0] & 7) {
- case 0:
- func_809C2FA0();
- func_809C11EC(this, play);
- this->actor.flags |= ACTOR_FLAG_1;
- this->actionFunc = func_809C2060;
+ switch (GET_EVENTINF_DOG_RACE_STATE) {
+ case EVENTINF_DOG_RACE_STATE_NOT_STARTED:
+ EnAob01_InitializeDogTextOffsets();
+ EnAob01_SpawnDogs(this, play);
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
+ 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->actor.flags &= ~ACTOR_FLAG_1;
- func_809C2F34(this, play);
- this->actionFunc = func_809C2824;
+ this->csId = this->actor.csId;
+ EnAob01_Race_FollowSelectedDog(this, play);
+ CutsceneManager_Queue(this->csId);
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ EnAob01_Race_HidePlayer(this, play);
+ this->actionFunc = EnAob01_Race_StartCutscene;
break;
- case 3:
- func_809C2FA0();
- func_809C11EC(this, play);
- this->actor.flags |= ACTOR_FLAG_1;
+ case EVENTINF_DOG_RACE_STATE_ENDED:
+ EnAob01_InitializeDogTextOffsets();
+ EnAob01_SpawnDogs(this, play);
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actor.flags |= ACTOR_FLAG_10000;
- this->actionFunc = func_809C28B8;
+ this->actionFunc = EnAob01_AfterRace_GiveRaceResult;
break;
}
}
@@ -968,9 +1143,10 @@ void EnAob01_Init(Actor* thisx, PlayState* play) {
void EnAob01_Destroy(Actor* thisx, PlayState* play) {
EnAob01* this = THIS;
- if (!(this->unk_2D2 & 0x20)) {
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_01);
+ if (!(this->stateFlags & ENAOB01_FLAG_STARTED_RACE)) {
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
}
+
Collider_DestroyCylinder(play, &this->collider);
}
@@ -978,7 +1154,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 +1189,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->fidgetTableY[limbIndex]) * 200;
+ rot->z += (s16)Math_CosS(this->fidgetTableZ[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);
}
}
@@ -1034,12 +1211,12 @@ void EnAob01_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
void EnAob01_Draw(Actor* thisx, PlayState* play) {
s32 pad;
EnAob01* this = THIS;
- Vec3f sp5C;
- Vec3f sp50;
+ Vec3f pos;
+ Vec3f scale;
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,12 +1227,12 @@ void EnAob01_Draw(Actor* thisx, PlayState* play) {
EnAob01_TransformLimbDraw, &this->actor);
if (this->actor.draw != NULL) {
- func_8012C2DC(play->state.gfxCtx);
- sp5C = this->actor.world.pos;
- sp50.x = 0.5f;
- sp50.y = 0.5f;
- sp50.z = 0.5f;
- func_800BC620(&sp5C, &sp50, 0xFF, play);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ pos = this->actor.world.pos;
+ scale.x = 0.5f;
+ scale.y = 0.5f;
+ scale.z = 0.5f;
+ func_800BC620(&pos, &scale, 255, play);
}
CLOSE_DISPS(play->state.gfxCtx);
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..51f4c29b8 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 fidgetTableY[MAMAMU_YAN_LIMB_MAX];
+ /* 0x318 */ s16 fidgetTableZ[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 b07e65de3..304dc3a3e 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_MINUS8) {
+ if (this->actor.params == -ARROW_TYPE_DEKU_NUT) {
this->unk_263 = 1;
- this->actor.params = 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) {
+ this->arrow.jointTable, this->arrow.jointTable, ARROW_LIMB_MAX);
+ 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 = func_800BC188(this->actor.params);
- if (this->actor.params == ENARROW_8) {
+ this->collider.info.toucher.dmgFlags = Actor_GetArrowDmgFlags(this->actor.params);
+ 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,9 +153,9 @@ 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);
+ Actor_PlaySfx_Flagged(&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,36 +175,39 @@ void func_8088A594(EnArrow* this, PlayState* play) {
}
switch (this->actor.params) {
- case ENARROW_6:
- func_800B8E58(player, NA_SE_IT_SLING_SHOT);
+ case ARROW_TYPE_SLINGSHOT:
+ Player_PlaySfx(player, NA_SE_IT_SLING_SHOT);
break;
- case ENARROW_0:
- case ENARROW_1:
- case ENARROW_2:
- func_800B8E58(player, NA_SE_IT_ARROW_SHOT);
+ 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:
- func_800B8E58(player, NA_SE_IT_MAGIC_ARROW_SHOT);
+ case ARROW_TYPE_FIRE:
+ case ARROW_TYPE_ICE:
+ case ARROW_TYPE_LIGHT:
+ Player_PlaySfx(player, NA_SE_IT_MAGIC_ARROW_SHOT);
- case ENARROW_7:
- func_800B8E58(player, NA_SE_PL_DEKUNUTS_FIRE);
+ case ARROW_TYPE_DEKU_BUBBLE:
+ Player_PlaySfx(player, NA_SE_PL_DEKUNUTS_FIRE);
+ break;
+
+ default:
break;
}
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 {
@@ -225,7 +228,7 @@ void func_8088A7D8(PlayState* play, EnArrow* this) {
this->actionFunc = func_8088B6B0;
Animation_PlayOnce(&this->arrow.skelAnime, &gameplay_keep_Anim_012860);
this->actor.world.rot.y += (s32)(0x6000 * (Rand_ZeroOne() - 0.5f)) + 0x8000;
- this->actor.speedXZ *= 0.02f + (0.02f * Rand_ZeroOne());
+ this->actor.speed *= 0.02f + (0.02f * Rand_ZeroOne());
this->actor.gravity = -1.5f;
this->unk_260 = 50;
this->unk_263 = 1;
@@ -273,8 +276,8 @@ void func_8088AA98(EnArrow* this, PlayState* play) {
f32 temp_f0;
if (WaterBox_GetSurface1(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z, &sp50, &sp54) &&
- (this->actor.world.pos.y < sp50) && !(this->actor.bgCheckFlags & 0x20)) {
- this->actor.bgCheckFlags |= 0x20;
+ (this->actor.world.pos.y < sp50) && !(this->actor.bgCheckFlags & BGCHECKFLAG_WATER)) {
+ this->actor.bgCheckFlags |= BGCHECKFLAG_WATER;
Math_Vec3f_Diff(&this->actor.world.pos, &this->actor.home.pos, &sp44);
@@ -289,20 +292,20 @@ void func_8088AA98(EnArrow* this, PlayState* play) {
EffectSsGSplash_Spawn(play, &sp44, NULL, NULL, 0, 300);
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_DIVE_INTO_WATER_L);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_DIVE_INTO_WATER_L);
EffectSsGRipple_Spawn(play, &sp44, 100, 500, 0);
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 +332,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,21 +364,21 @@ 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) {
- iREG(50) = -1;
+ 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.speedXZ == 0.0f);
+ this->actor.world.pos.z, 0, 0, 0, this->actor.speed == 0.0f);
sp82 = NA_SE_IT_DEKU;
} else {
sp82 = NA_SE_IT_SLING_REFLECT;
@@ -396,37 +399,37 @@ void func_8088ACE0(EnArrow* this, PlayState* play) {
Math_Vec3f_Diff(&sp7C->world.pos, &this->actor.world.pos, &this->unk_268);
sp7C->flags |= ACTOR_FLAG_8000;
this->collider.base.atFlags &= ~AT_HIT;
- this->actor.speedXZ *= 0.5f;
+ this->actor.speed *= 0.5f;
this->actor.velocity.y *= 0.5f;
} else {
this->unk_261 |= 1;
this->unk_261 |= 2;
Math_Vec3f_Copy(&this->actor.world.pos, &this->actor.prevPos);
func_8088A7D8(play, this);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_HOOKSHOT_STICK_CRE);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_HOOKSHOT_STICK_CRE);
}
} 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_PlaySfxAtPos(&this->actor, NA_SE_IT_ARROW_STICK_OBJ);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_ARROW_STICK_OBJ);
this->unk_261 |= 1;
}
}
} 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.speedXZ) + SQ(this->actor.velocity.y));
- sp74 = Math_SinS(this->actor.world.rot.y) * this->actor.speedXZ;
- temp_f12_2 = Math_CosS(this->actor.world.rot.y) * this->actor.speedXZ;
+ sp78 = sqrtf(SQ(this->actor.speed) + SQ(this->actor.velocity.y));
+ sp74 = Math_SinS(this->actor.world.rot.y) * this->actor.speed;
+ temp_f12_2 = Math_CosS(this->actor.world.rot.y) * this->actor.speed;
this->actor.prevPos.x = this->actor.world.pos.x - (sp74 * (10.0f / sp78));
this->actor.prevPos.y = this->actor.world.pos.y - (this->actor.velocity.y * (10.0f / sp78));
@@ -449,14 +452,14 @@ void func_8088ACE0(EnArrow* this, PlayState* play) {
func_8088A514(this);
}
- func_800B9010(&this->actor, NA_SE_IT_DEKUNUTS_BUBLE_SHOT_LEVEL - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_IT_DEKUNUTS_BUBLE_SHOT_LEVEL - SFX_FLAG);
} else if (this->unk_260 < 7) {
this->actor.gravity = -0.4f;
}
Math_Vec3f_Copy(&this->unk_228, &this->actor.world.pos);
- if (this->actor.speedXZ == 0.0f) {
+ if (this->actor.speed == 0.0f) {
this->actor.velocity.y -= 1.0f;
if (this->actor.velocity.y < this->actor.terminalVelocity) {
this->actor.velocity.y = this->actor.terminalVelocity;
@@ -468,13 +471,14 @@ 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) {
- this->actor.shape.rot.x = Math_Atan2S_XY(this->actor.speedXZ, -this->actor.velocity.y);
+ if (ARROW_IS_ARROW(this->actor.params)) {
+ this->actor.shape.rot.x = Math_Atan2S_XY(this->actor.speed, -this->actor.velocity.y);
}
}
@@ -512,7 +516,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 +544,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 +589,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,13 +645,13 @@ 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.speedXZ * 0.1f) + 1.0f;
+ f32 spA0 = (this->actor.speed * 0.1f) + 1.0f;
f32 sp9C = (1.0f / spA0);
OPEN_DISPS(play->state.gfxCtx);
@@ -659,8 +669,8 @@ void EnArrow_Draw(Actor* thisx, PlayState* play) {
MTXMODE_APPLY);
Matrix_Translate(0.0f, 0.0f, 460.0f, MTXMODE_APPLY);
- if (this->actor.speedXZ == 0.0f) {
- func_800B8118(&this->actor, play, MTXMODE_NEW);
+ if (this->actor.speed == 0.0f) {
+ func_800B8118(&this->actor, play, 0);
gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_06F380);
gDPSetRenderMode(POLY_XLU_DISP++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_XLU_SURF2);
@@ -674,7 +684,7 @@ void EnArrow_Draw(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, &D_01000000, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_06F9F0);
} else {
- func_800B8050(&this->actor, play, MTXMODE_NEW);
+ func_800B8050(&this->actor, play, 0);
gSPDisplayList(POLY_OPA_DISP++, gameplay_keep_DL_06F380);
gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL1, 0, PRIM_LOD_FRAC, TEXEL0, TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0,
@@ -687,17 +697,17 @@ void EnArrow_Draw(Actor* thisx, PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx);
return;
- } else if (this->actor.speedXZ != 0.0f) {
+ } else if (this->actor.speed != 0.0f) {
u8 sp63 = (Math_CosS(this->unk_260 * 5000) * 127.5f) + 127.5f;
f32 sp5C;
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;
@@ -710,7 +720,7 @@ void EnArrow_Draw(Actor* thisx, PlayState* play) {
Matrix_Push();
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
- if (this->actor.speedXZ == 0.0f) {
+ if (this->actor.speed == 0.0f) {
phi_v0 = 0;
} else {
phi_v0 = (play->gameplayFrames % 256) * 4000;
@@ -729,7 +739,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 +747,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 d16dbd380..3aaf4e4c8 100644
--- a/src/overlays/actors/ovl_En_Arrow/z_en_arrow.h
+++ b/src/overlays/actors/ovl_En_Arrow/z_en_arrow.h
@@ -2,27 +2,40 @@
#define Z_EN_ARROW_H
#include "global.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
struct EnArrow;
typedef void (*EnArrowActionFunc)(struct EnArrow*, PlayState*);
-enum {
- /* -8 */ ENARROW_MINUS8 = -8,
- /* 0 */ ENARROW_0 = 0,
- /* 1 */ ENARROW_1,
- /* 2 */ ENARROW_2,
- /* 3 */ ENARROW_3,
- /* 4 */ ENARROW_4,
- /* 5 */ ENARROW_5,
- /* 6 */ ENARROW_6,
- /* 7 */ ENARROW_7,
- /* 8 */ ENARROW_8,
-};
+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;
- /* 0x188 */ Vec3s jointTable[5];
+ /* 0x188 */ Vec3s jointTable[ARROW_LIMB_MAX];
} EnArrowArrow; // size = 0x1A8
typedef struct {
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 b4501ffa0..e8c4c9fa2 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
@@ -33,7 +33,7 @@ ActorInit En_Attack_Niw_InitVars = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_U8(targetMode, 1, ICHAIN_CONTINUE),
+ ICHAIN_U8(targetMode, TARGET_MODE_1, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -2000, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 0, ICHAIN_STOP),
};
@@ -43,7 +43,7 @@ void EnAttackNiw_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->actor, sInitChain);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 25.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &gNiwSkeleton, &gNiwIdleAnim, this->jointTable, this->morphTable,
+ SkelAnime_InitFlex(play, &this->skelAnime, &gNiwSkel, &gNiwIdleAnim, this->jointTable, this->morphTable,
NIW_LIMB_MAX);
// probably copy pasted from EnNiw, which has this same code, but AttackNiw has no params
@@ -54,12 +54,12 @@ 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
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; // Unnecessary: this actor does not start with this flag
this->actor.shape.rot.y = this->actor.world.rot.y = (Rand_ZeroOne() - 0.5f) * 60000.0f;
this->actionFunc = EnAttackNiw_EnterViewFromOffscreen;
}
@@ -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;
}
}
@@ -213,7 +216,7 @@ void EnAttackNiw_EnterViewFromOffscreen(EnAttackNiw* this, PlayState* play) {
Vec3f flightTarget;
s32 pad;
- this->actor.speedXZ = 10.0f;
+ this->actor.speed = 10.0f;
// randomTargetCenterOffset is set in _Init, only needs to be set once
// but the view is moving, so now we need to re-calculate the spot in space
@@ -236,7 +239,7 @@ void EnAttackNiw_EnterViewFromOffscreen(EnAttackNiw* this, PlayState* play) {
Actor_SetFocus(&this->actor, this->targetHeight);
Actor_GetScreenPos(play, &this->actor, &posX, &posY);
- if (this->actor.bgCheckFlags & 8) { // touching a wall
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->targetRotY = this->actor.yawTowardsPlayer;
this->targetRotX = this->actor.world.rot.x - 3000.0f;
this->hopTimer = 0;
@@ -255,7 +258,7 @@ void EnAttackNiw_EnterViewFromOffscreen(EnAttackNiw* this, PlayState* play) {
} else if (((this->actor.projectedPos.z > 0.0f) && (fabsf(flightTarget.x - this->actor.world.pos.x) < 50.0f) &&
(fabsf(flightTarget.y - this->actor.world.pos.y) < 50.0f) &&
(fabsf(flightTarget.z - this->actor.world.pos.z) < 50.0f)) ||
- (this->actor.bgCheckFlags & 1)) { // touching ground or with close distance of target
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
// reset state
this->hopTimer = 0;
this->unkTimer250 = this->hopTimer;
@@ -286,7 +289,7 @@ void EnAttackNiw_AimAtPlayer(EnAttackNiw* this, PlayState* play) {
return;
}
- if (this->actor.bgCheckFlags & 1) { // touching floor
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
if (this->hopTimer == 0) {
this->hopTimer = 3;
this->actor.velocity.y = 3.5f;
@@ -308,25 +311,24 @@ 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);
Math_SmoothStepToS(&this->actor.world.rot.x, this->targetRotX, 2, this->rotStep, 0);
Math_ApproachF(&this->rotStep, 10000.0f, 1.0f, 1000.0f);
- Math_ApproachF(&this->actor.speedXZ, this->targetXZSpeed, 0.9f, 1.0f);
+ Math_ApproachF(&this->actor.speed, this->targetXZSpeed, 0.9f, 1.0f);
- if (this->actor.gravity == -2.0f && this->unkTimer25A == 0 &&
- (this->actor.bgCheckFlags & 8 || this->randomAngleChangeTimer == 0)) {
+ if ((this->actor.gravity == -2.0f) && (this->unkTimer25A == 0) &&
+ ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) || (this->randomAngleChangeTimer == 0))) {
this->targetXZSpeed = 0.0f;
this->actor.gravity = 0.0f;
this->rotStep = 0.0f;
this->targetRotX = this->actor.world.rot.x - 5000.0f;
this->actionFunc = EnAttackNiw_FlyAway;
- } else if (this->actor.bgCheckFlags & 1) { // touching floor
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
EnAttackNiw_AnimateWingHead(this, play, NIW_ANIM_PECKING_SLOW_FORFLAPPING);
-
} else {
EnAttackNiw_AnimateWingHead(this, play, NIW_ANIM_PECKING_AND_WAVING);
}
@@ -367,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);
@@ -380,8 +384,7 @@ void EnAttackNiw_Update(Actor* thisx, PlayState* play) {
return;
}
- if ((this->actor.bgCheckFlags & 0x20) && // on or below water
- (this->actionFunc != EnAttackNiw_FlyAway)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WATER) && (this->actionFunc != EnAttackNiw_FlyAway)) {
Math_Vec3f_Copy(&splashPos, &this->actor.world.pos);
splashPos.y += this->actor.depthInWater;
EffectSsGSplash_Spawn(play, &splashPos, NULL, NULL, 0, 400);
@@ -408,12 +411,12 @@ void EnAttackNiw_Update(Actor* thisx, PlayState* play) {
if (this->crySfxTimer == 0) {
this->crySfxTimer = 30;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CHICKEN_CRY_A);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_CHICKEN_CRY_A);
}
if (this->flutterSfxTimer == 0) {
this->flutterSfxTimer = 7;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_CHICKEN_FLUTTER);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_CHICKEN_FLUTTER);
}
}
}
@@ -446,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 e87bf9d62..218de2cb5 100644
--- a/src/overlays/actors/ovl_En_Az/z_en_az.c
+++ b/src/overlays/actors/ovl_En_Az/z_en_az.c
@@ -4,8 +4,8 @@
* Description: Beaver Bros
*/
+#include "prevent_bss_reordering.h"
#include "z_en_az.h"
-#include "objects/object_az/object_az.h"
#include "overlays/actors/ovl_En_Twig/z_en_twig.h"
#include "overlays/actors/ovl_En_Fish/z_en_fish.h"
@@ -59,6 +59,7 @@ void func_80A97EAC(EnAz* this, PlayState* play);
void func_80A97F9C(EnAz* this, PlayState* play);
typedef enum {
+ /* -1 */ BEAVER_ANIM_NONE = -1,
/* 0 */ BEAVER_ANIM_IDLE,
/* 1 */ BEAVER_ANIM_WALK,
/* 2 */ BEAVER_ANIM_SWIM_WITH_SPINNING_TAIL,
@@ -73,23 +74,24 @@ typedef enum {
/* 11 */ BEAVER_ANIM_BOW,
/* 12 */ BEAVER_ANIM_IDLE_FACE_LEFT,
/* 13 */ BEAVER_ANIM_IDLE_FACE_RIGHT,
+ /* 14 */ BEAVER_ANIM_IDLE_FACE_MAX
} BeaverAnimation;
-static AnimationSpeedInfo sAnimationInfo[] = {
- { &gBeaverIdleAnim, 1.0f, ANIMMODE_LOOP, -10.0f },
- { &gBeaverWalkAnim, 1.0f, ANIMMODE_LOOP, -5.0f },
- { &gBeaverSwimWithSpinningTail, 1.0f, ANIMMODE_LOOP, -5.0f },
- { &gBeaverSwimWithRaisedTail, 1.0f, ANIMMODE_LOOP, -5.0f },
- { &gBeaverTalkAnim, 1.0f, ANIMMODE_LOOP, -5.0f },
- { &gBeaverTalkWaveArmsAnim, 1.0f, ANIMMODE_LOOP, -5.0f },
- { &gBeaverLaughRightAnim, 1.0f, ANIMMODE_LOOP, -5.0f },
- { &gBeaverLaughLeftAnim, 1.0f, ANIMMODE_LOOP, -5.0f },
- { &gBeaverSwimAnim, 2.0f, ANIMMODE_LOOP, -5.0f },
- { &gBeaverTalkToLeftAnim, 1.0f, ANIMMODE_LOOP, -5.0f },
- { &gBeaverTalkToRightAnim, 1.0f, ANIMMODE_LOOP, -5.0f },
- { &gBeaverBowAnim, 1.0f, ANIMMODE_ONCE, -5.0f },
- { &gBeaverIdleFaceLeftAnim, 1.0f, ANIMMODE_LOOP, -5.0f },
- { &gBeaverIdleFaceRightAnim, 1.0f, ANIMMODE_LOOP, -5.0f },
+static AnimationSpeedInfo sAnimationSpeedInfo[BEAVER_ANIM_IDLE_FACE_MAX] = {
+ { &gBeaverIdleAnim, 1.0f, ANIMMODE_LOOP, -10.0f }, // BEAVER_ANIM_IDLE
+ { &gBeaverWalkAnim, 1.0f, ANIMMODE_LOOP, -5.0f }, // BEAVER_ANIM_WALK
+ { &gBeaverSwimWithSpinningTail, 1.0f, ANIMMODE_LOOP, -5.0f }, // BEAVER_ANIM_SWIM_WITH_SPINNING_TAIL
+ { &gBeaverSwimWithRaisedTail, 1.0f, ANIMMODE_LOOP, -5.0f }, // BEAVER_ANIM_SWIM_WITH_RAISED_TAIL
+ { &gBeaverTalkAnim, 1.0f, ANIMMODE_LOOP, -5.0f }, // BEAVER_ANIM_TALK
+ { &gBeaverTalkWaveArmsAnim, 1.0f, ANIMMODE_LOOP, -5.0f }, // BEAVER_ANIM_TALK_WAVE_ARMS
+ { &gBeaverLaughRightAnim, 1.0f, ANIMMODE_LOOP, -5.0f }, // BEAVER_ANIM_LAUGH_RIGHT
+ { &gBeaverLaughLeftAnim, 1.0f, ANIMMODE_LOOP, -5.0f }, // BEAVER_ANIM_LAUGH_LEFT
+ { &gBeaverSwimAnim, 2.0f, ANIMMODE_LOOP, -5.0f }, // BEAVER_ANIM_SWIM
+ { &gBeaverTalkToLeftAnim, 1.0f, ANIMMODE_LOOP, -5.0f }, // BEAVER_ANIM_TALK_TO_LEFT
+ { &gBeaverTalkToRightAnim, 1.0f, ANIMMODE_LOOP, -5.0f }, // BEAVER_ANIM_TALK_TO_RIGHT
+ { &gBeaverBowAnim, 1.0f, ANIMMODE_ONCE, -5.0f }, // BEAVER_ANIM_BOW
+ { &gBeaverIdleFaceLeftAnim, 1.0f, ANIMMODE_LOOP, -5.0f }, // BEAVER_ANIM_IDLE_FACE_LEFT
+ { &gBeaverIdleFaceRightAnim, 1.0f, ANIMMODE_LOOP, -5.0f }, // BEAVER_ANIM_IDLE_FACE_RIGHT
};
ActorInit En_Az_InitVars = {
@@ -204,37 +206,44 @@ void EnAz_Init(Actor* thisx, PlayState* play2) {
Actor_ProcessInitChain(&this->actor, sInitChain);
this->unk_374 = 0;
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
- this->actor.targetMode = 1;
+ this->actor.targetMode = TARGET_MODE_1;
switch (BEAVER_GET_PARAM_F00(thisx)) {
case 0:
phi_v1 =
(gSaveContext.save.entrance == ENTRANCE(WATERFALL_RAPIDS, 0)) && CHECK_WEEKEVENTREG(WEEKEVENTREG_93_01);
phi_v1 = !phi_v1;
break;
+
case 2:
phi_v1 = (gSaveContext.save.entrance != ENTRANCE(WATERFALL_RAPIDS, 1)) ||
!CHECK_WEEKEVENTREG(WEEKEVENTREG_24_04);
break;
+
case 4:
phi_v1 = gSaveContext.save.entrance != ENTRANCE(WATERFALL_RAPIDS, 2);
break;
+
case 1:
phi_v1 =
(gSaveContext.save.entrance == ENTRANCE(WATERFALL_RAPIDS, 0)) && CHECK_WEEKEVENTREG(WEEKEVENTREG_93_01);
phi_v1 = !phi_v1;
break;
+
case 3:
phi_v1 =
(gSaveContext.save.entrance != ENTRANCE(WATERFALL_RAPIDS, 1)) || CHECK_WEEKEVENTREG(WEEKEVENTREG_24_04);
break;
+
case 5:
phi_v1 = gSaveContext.save.entrance != ENTRANCE(WATERFALL_RAPIDS, 2);
break;
+
case 6:
phi_v1 = (gSaveContext.save.entrance == ENTRANCE(WATERFALL_RAPIDS, 0)) &&
!CHECK_WEEKEVENTREG(WEEKEVENTREG_93_01);
phi_v1 = !phi_v1;
break;
+
default:
phi_v1 = true;
break;
@@ -253,7 +262,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,21 +282,21 @@ 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);
- if ((this->actor.bgCheckFlags & 0x20) && (this->actor.depthInWater > 22.0f)) {
+ 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;
}
- Animation_Change(&this->skelAnime, sAnimationInfo[BEAVER_ANIM_IDLE].animation, 1.0f,
- Animation_GetLastFrame(sAnimationInfo[BEAVER_ANIM_IDLE].animation) * Rand_ZeroOne(),
- Animation_GetLastFrame(sAnimationInfo[BEAVER_ANIM_IDLE].animation),
- sAnimationInfo[BEAVER_ANIM_IDLE].mode, sAnimationInfo[BEAVER_ANIM_IDLE].morphFrames);
+ Animation_Change(&this->skelAnime, sAnimationSpeedInfo[BEAVER_ANIM_IDLE].animation, 1.0f,
+ Animation_GetLastFrame(sAnimationSpeedInfo[BEAVER_ANIM_IDLE].animation) * Rand_ZeroOne(),
+ Animation_GetLastFrame(sAnimationSpeedInfo[BEAVER_ANIM_IDLE].animation),
+ sAnimationSpeedInfo[BEAVER_ANIM_IDLE].mode, sAnimationSpeedInfo[BEAVER_ANIM_IDLE].morphFrames);
this->unk_37E = 0;
this->unk_380 = 0;
this->unk_384 = 0;
this->actor.gravity = -1.0f;
this->unk_376 = this->unk_374;
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE, &this->animIndex);
this->skelAnime.curFrame = Rand_ZeroOne() * this->skelAnime.endFrame;
switch (gSaveContext.save.entrance) {
@@ -295,12 +304,12 @@ void EnAz_Init(Actor* thisx, PlayState* play2) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_93_01)) {
this->unk_2FA = 5;
if (this->unk_374 & 2) {
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
this->unk_374 |= 0x20;
}
} else {
this->unk_2FA = 0;
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
this->unk_374 |= 0x20;
}
func_80A94B20(play);
@@ -310,16 +319,18 @@ void EnAz_Init(Actor* thisx, PlayState* play2) {
func_80A95DA0(this, play);
}
break;
+
case ENTRANCE(WATERFALL_RAPIDS, 3):
this->unk_2FA = 0;
if (!(this->unk_374 & 2)) {
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10000);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10000);
}
if (gSaveContext.save.entrance == ENTRANCE(WATERFALL_RAPIDS, 3)) {
this->unk_2FA = 0xA;
}
func_80A97C0C(this, play);
break;
+
case ENTRANCE(WATERFALL_RAPIDS, 1):
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_93_01)) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_24_04)) {
@@ -350,6 +361,7 @@ void EnAz_Init(Actor* thisx, PlayState* play2) {
func_80A97D5C(this, play);
}
break;
+
case ENTRANCE(WATERFALL_RAPIDS, 2):
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_93_01)) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_24_04)) {
@@ -367,22 +379,25 @@ void EnAz_Init(Actor* thisx, PlayState* play2) {
if (this->unk_2FA == 2) {
if (!(this->unk_374 & 2)) {
this->unk_374 |= 0x20;
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10000);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10000);
this->actionFunc = func_80A97C24;
} else {
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
func_80A95C5C(this, play);
}
} else {
if (this->unk_374 & 2) {
this->unk_374 |= 0x20;
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10000);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10000);
} else {
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
}
this->actionFunc = func_80A97C24;
}
break;
+
+ default:
+ break;
}
if (sp4E >= 0) {
this->brother = NULL;
@@ -437,9 +452,9 @@ s32 func_80A95534(PlayState* play, ActorPathing* actorPathing) {
this->unk_36C = actorPathing->distSqToCurPointXZ;
}
}
- Math_SmoothStepToF(&this->actor.speedXZ, this->unk_36C, 0.8f, 2.0f, 0.0f);
+ Math_SmoothStepToF(&this->actor.speed, this->unk_36C, 0.8f, 2.0f, 0.0f);
actorPathing->moveFunc = SubS_ActorPathing_MoveWithGravity;
- if (actorPathing->distSqToCurPointXZ <= this->actor.speedXZ) {
+ if (actorPathing->distSqToCurPointXZ <= this->actor.speed) {
ret = true;
}
return ret;
@@ -454,11 +469,11 @@ s32 func_80A9565C(PlayState* play, ActorPathing* actorPathing) {
actorPathing->moveFunc = func_80A94A90;
this->unk_374 |= 0x2000;
temp_f0 = func_80A954AC(this);
- if ((actorPathing->distSqToCurPointXZ < SQ(this->actor.speedXZ)) || (temp_f0 <= 0.0f)) {
+ if ((actorPathing->distSqToCurPointXZ < SQ(this->actor.speed)) || (temp_f0 <= 0.0f)) {
ret = true;
} else {
this->unk_39E = this->actor.world.rot.x =
- Math_Atan2S(-this->actor.velocity.y, Math_CosS(-this->actor.world.rot.x) * this->actor.speedXZ);
+ Math_Atan2S(-this->actor.velocity.y, Math_CosS(-this->actor.world.rot.x) * this->actor.speed);
}
return ret;
}
@@ -474,10 +489,10 @@ s32 func_80A95730(PlayState* play, ActorPathing* actorPathing) {
this->actor.gravity = 0.0f;
temp_f0 = func_80A954AC(this);
- if ((actorPathing->distSqToCurPointXZ < SQ(this->actor.speedXZ)) || (temp_f0 <= 0.0f)) {
+ if ((actorPathing->distSqToCurPointXZ < SQ(this->actor.speed)) || (temp_f0 <= 0.0f)) {
ret = true;
} else {
- sp40 = SQ(this->actor.speedXZ) / actorPathing->distSqToCurPoint;
+ sp40 = SQ(this->actor.speed) / actorPathing->distSqToCurPoint;
sp34 = ABS(actorPathing->rotToCurPoint.x - this->actor.world.rot.x);
sp3C = (s32)(sp34 * sp40) + 0xAAA;
@@ -521,12 +536,12 @@ s32 func_80A958B0(PlayState* play, ActorPathing* actorPathing) {
} else {
Math_SmoothStepToF(&this->unk_36C, 26.0f, 0.5f, 1.0f, 0.01f);
}
- Math_SmoothStepToF(&this->actor.speedXZ, this->unk_36C, 0.8f, 2.0f, 0.0f);
+ Math_SmoothStepToF(&this->actor.speed, this->unk_36C, 0.8f, 2.0f, 0.0f);
temp1 = func_80A954AC(this);
- if ((actorPathing->distSqToCurPointXZ < SQ(this->actor.speedXZ)) || (temp1 <= 0.0f)) {
+ if ((actorPathing->distSqToCurPointXZ < SQ(this->actor.speed)) || (temp1 <= 0.0f)) {
ret = true;
} else {
- sp3C = SQ(this->actor.speedXZ) / actorPathing->distSqToCurPoint;
+ sp3C = SQ(this->actor.speed) / actorPathing->distSqToCurPoint;
sp30 = ABS(actorPathing->rotToCurPoint.x - this->actor.world.rot.x);
sp2C = (s32)(sp30 * sp3C) + 0xAAA;
sp30 = ABS(actorPathing->rotToCurPoint.y - this->actor.world.rot.y);
@@ -548,10 +563,11 @@ s32 func_80A95B34(PlayState* play, ActorPathing* actorPathing) {
if (this->unk_374 & 0x100) {
if (!(this->unk_374 & 8)) {
if (this->unk_374 & 2) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_SWIM, &this->animIndex);
- } else {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_SWIM_WITH_SPINNING_TAIL,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_SWIM,
&this->animIndex);
+ } else {
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo,
+ BEAVER_ANIM_SWIM_WITH_SPINNING_TAIL, &this->animIndex);
}
this->unk_374 |= 8;
}
@@ -560,9 +576,9 @@ s32 func_80A95B34(PlayState* play, ActorPathing* actorPathing) {
} else {
ret = func_80A958B0(play, actorPathing);
}
- } else if (this->actor.bgCheckFlags & 1) {
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
if (this->unk_374 & 8) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_WALK, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_WALK, &this->animIndex);
this->unk_374 &= ~8;
}
ret = func_80A95534(play, actorPathing);
@@ -576,26 +592,26 @@ void func_80A95C5C(EnAz* this, PlayState* play) {
this->actor.draw = NULL;
this->actor.world.pos.y = this->actor.home.pos.y + 120.0f;
this->actor.gravity = -1.0f;
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE, &this->animIndex);
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
- this->actor.bgCheckFlags &= ~0x21;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE, &this->animIndex);
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
+ this->actor.bgCheckFlags &= ~(BGCHECKFLAG_GROUND | BGCHECKFLAG_WATER);
this->unk_3C0 = 0;
this->actionFunc = func_80A95CEC;
}
void func_80A95CEC(EnAz* this, PlayState* play) {
if (this->unk_374 & 0x8000) {
- if (!(this->actor.bgCheckFlags & 1)) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
this->actor.shape.rot.y = this->actor.world.rot.y;
this->actor.draw = EnAz_Draw;
Actor_MoveWithGravity(&this->actor);
- func_800B9010(&this->actor, NA_SE_EV_HONEYCOMB_FALL - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_HONEYCOMB_FALL - SFX_FLAG);
} else {
- if (this->actor.bgCheckFlags & 2) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GERUDOFT_DOWN);
+ if (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);
}
}
@@ -608,12 +624,12 @@ void func_80A95DA0(EnAz* this, PlayState* play) {
SubS_ActorPathing_Init(play, &this->actor.world.pos, &this->actor, sp40, play->setupPathList,
BEAVER_GET_PARAM_FF(&this->actor), 0, 0, 1, 1);
this->unk_36C = 4.0f;
- this->actor.speedXZ = 4.0f;
+ this->actor.speed = 4.0f;
this->actor.gravity = 0.0f;
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_SWIM_WITH_SPINNING_TAIL,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_SWIM_WITH_SPINNING_TAIL,
&this->animIndex);
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
- this->actor.bgCheckFlags &= ~0x21;
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
+ this->actor.bgCheckFlags &= ~(BGCHECKFLAG_GROUND | BGCHECKFLAG_WATER);
this->unk_374 |= 0x1000;
Math_Vec3f_Copy(&this->actor.world.pos, &sp40->curPoint);
this->actionFunc = func_80A95E88;
@@ -625,23 +641,23 @@ void func_80A95E88(EnAz* this, PlayState* play) {
if (this->actor.depthInWater > 8.0f) {
if (this->unk_374 & 2) {
if ((this->skelAnime.curFrame < this->skelAnime.playSpeed) && (this->skelAnime.curFrame >= 0.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BEAVER_SWIM_HAND);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BEAVER_SWIM_HAND);
}
} else {
- func_800B9010(&this->actor, NA_SE_EV_BEAVER_SWIM_MOTOR - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_BEAVER_SWIM_MOTOR - SFX_FLAG);
}
}
if (!(this->unk_374 & 0x2000)) {
SkelAnime_Update(&this->skelAnime);
}
this->unk_374 &= ~0x2000;
- if (this->actor.isTargeted) {
+ if (this->actor.isLockedOn) {
func_80A95F94(this, play);
}
}
void func_80A95F94(EnAz* this, PlayState* play) {
- func_800BE33C(&this->actor.world.pos, &this->actor.home.pos, &this->actor.world.rot, 0);
+ func_800BE33C(&this->actor.world.pos, &this->actor.home.pos, &this->actor.world.rot, false);
this->unk_39E = 0;
this->actor.shape.rot.y = this->actor.world.rot.y;
this->actionFunc = func_80A95FE8;
@@ -649,30 +665,30 @@ 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_DistanceToPoint(&this->actor, &this->actor.home.pos) > 20.0f) {
- func_800B9010(&this->actor, NA_SE_EV_BEAVER_SWIM_MOTOR - SFX_FLAG);
- func_800BE33C(&this->actor.world.pos, &this->actor.home.pos, &this->actor.world.rot, 0);
+ if (Actor_WorldDistXYZToPoint(&this->actor, &this->actor.home.pos) > 20.0f) {
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_BEAVER_SWIM_MOTOR - SFX_FLAG);
+ func_800BE33C(&this->actor.world.pos, &this->actor.home.pos, &this->actor.world.rot, false);
Math_SmoothStepToS(&this->actor.shape.rot.x, this->actor.world.rot.x, 3, 0xE38, 0x38E);
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.world.rot.y, 3, 0xE38, 0x38E);
this->actor.shape.rot.z = 0;
Actor_MoveWithoutGravityReverse(&this->actor);
} else {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE, &this->animIndex);
this->unk_374 &= ~0x1000;
this->actor.gravity = -1.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
Math_SmoothStepToS(&this->actor.shape.rot.x, 0, 3, 0x1000, 0x100);
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.world.rot.y, 3, 0x1038, 0x100);
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
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,9 +704,10 @@ 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;
+ play->msgCtx.msgMode = MSGMODE_PAUSED;
ret = 0;
}
} else if (Message_ShouldAdvance(play)) {
@@ -700,86 +717,103 @@ s32 func_80A9617C(EnAz* this, PlayState* play) {
case 0xCD:
CLEAR_WEEKEVENTREG(WEEKEVENTREG_24_01);
this->actor.textId = 0x10F2;
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_BOW,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_BOW,
&this->animIndex);
- SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_BOW,
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_BOW,
&brother->animIndex);
break;
+
case 0x10CE:
this->actor.textId = 0x10CF;
SET_WEEKEVENTREG(WEEKEVENTREG_16_40);
break;
+
case 0x10CF:
this->actor.textId = 0x10D0;
break;
+
case 0x10D0:
this->actor.textId = 0x10D1;
ret = 3;
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK_WAVE_ARMS,
- &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo,
+ BEAVER_ANIM_TALK_WAVE_ARMS, &this->animIndex);
break;
+
case 0x10D1:
this->actor.textId = 0x10D2;
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_TALK,
&this->animIndex);
break;
+
case 0x10D2:
if (play->msgCtx.choiceIndex == 0) {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
this->actor.textId = 0x10D6;
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo,
BEAVER_ANIM_TALK_WAVE_ARMS, &this->animIndex);
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
this->actor.textId = 0x10D3;
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_BOW,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_BOW,
&this->animIndex);
}
break;
+
case 0x10D3:
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE,
&this->animIndex);
this->unk_374 |= 0x20;
ret = 0;
break;
+
case 0x10D4:
this->actor.textId = 0x10D2;
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_TALK,
&this->animIndex);
break;
+
case 0x10D6:
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE,
&this->animIndex);
func_80A979DC(this, play);
this->unk_2FA = 1;
ret = 0;
break;
+
case 0x10D7:
this->actor.textId = 0x10D8;
break;
+
case 0x10D8:
if (play->msgCtx.choiceIndex == 0) {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
switch (this->unk_2FA) {
case 2:
this->unk_2FA = 1;
break;
+
case 4:
this->unk_2FA = 3;
break;
+
case 7:
this->unk_2FA = 6;
break;
+
case 9:
this->unk_2FA = 8;
break;
+
+ default:
+ break;
}
ret = 0;
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
this->actor.textId = 0x10D9;
}
break;
+
case 0x10D9:
if ((this->unk_2FA == 3) || (this->unk_2FA == 8)) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_24_04);
@@ -788,120 +822,140 @@ s32 func_80A9617C(EnAz* this, PlayState* play) {
func_80A979DC(this, play);
ret = 0;
break;
+
case 0x10DA:
this->actor.textId = 0x10DB;
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_TALK,
&this->animIndex);
break;
+
case 0x10DB:
if (play->msgCtx.choiceIndex == 0) {
- func_8019F208();
- play->msgCtx.msgMode = 0x44;
+ Audio_PlaySfx_MessageDecide();
+ play->msgCtx.msgMode = MSGMODE_PAUSED;
this->unk_2FA = 1;
ret = 0;
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
this->actor.textId = 0x10DC;
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_BOW,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_BOW,
&this->animIndex);
}
break;
+
case 0x10DC:
func_80A94AB8(this, play, 0);
func_80A979DC(this, play);
this->unk_374 |= 0x20;
ret = 0;
break;
+
case 0x10DD:
func_80A98EFC(this, play, 0x10DE, BEAVER_ANIM_IDLE_FACE_RIGHT, BEAVER_ANIM_TALK_TO_LEFT);
this->unk_374 |= 0x8000;
ret = 2;
break;
+
case 0x10DE:
func_80A98EFC(this, play, 0x10DF, BEAVER_ANIM_IDLE_FACE_LEFT, BEAVER_ANIM_TALK_TO_RIGHT);
ret = 0;
break;
+
case 0x10DF:
func_80A98EFC(this, play, 0x10E0, BEAVER_ANIM_IDLE_FACE_RIGHT, BEAVER_ANIM_TALK_TO_LEFT);
ret = 0;
break;
+
case 0x10E0:
func_80A98EFC(this, play, 0x10E1, BEAVER_ANIM_IDLE_FACE_LEFT, BEAVER_ANIM_TALK_TO_RIGHT);
ret = 0;
break;
+
case 0x10E1:
func_80A98EFC(this, play, 0x10E2, BEAVER_ANIM_IDLE_FACE_RIGHT, BEAVER_ANIM_TALK_TO_LEFT);
ret = 0;
break;
+
case 0x10E2:
this->actor.textId = 0x10E3;
ret = 3;
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_TALK,
&this->animIndex);
break;
+
case 0x10E3:
func_80A98EFC(this, play, 0x10E4, BEAVER_ANIM_IDLE, BEAVER_ANIM_TALK);
ret = 0;
break;
+
case 0x10E4:
func_80A98EFC(this, play, 0x10E5, BEAVER_ANIM_IDLE, BEAVER_ANIM_TALK);
ret = 0;
break;
+
case 0x10E5:
if (play->msgCtx.choiceIndex == 0) {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
this->actor.textId = 0x10E8;
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
this->actor.textId = 0x10E6;
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK_TO_LEFT,
- &this->animIndex);
- SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo,
+ BEAVER_ANIM_TALK_TO_LEFT, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationSpeedInfo,
BEAVER_ANIM_IDLE_FACE_RIGHT, &brother->animIndex);
}
break;
+
case 0x10E6:
this->actor.textId = 0x10E7;
func_80A98EFC(this, play, 0x10E7, BEAVER_ANIM_IDLE, BEAVER_ANIM_TALK_TO_RIGHT);
ret = 0;
break;
+
case 0x10E7:
CLEAR_WEEKEVENTREG(WEEKEVENTREG_24_04);
func_80A94AB8(this, play, 0);
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE,
&this->animIndex);
- SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE,
&brother->animIndex);
func_80A979DC(this, play);
ret = 0;
break;
+
case 0x10E8:
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE,
&this->animIndex);
- SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE,
&brother->animIndex);
this->unk_2FA = 3;
ret = 0;
break;
+
case 0x10E9:
func_80A98EFC(this, play, 0x10EA, BEAVER_ANIM_IDLE_FACE_LEFT, BEAVER_ANIM_TALK);
ret = 0;
break;
+
case 0x10EA:
func_80A98EFC(this, play, 0x10EB, BEAVER_ANIM_IDLE, BEAVER_ANIM_TALK);
ret = 0;
break;
+
case 0x10EB:
if (play->msgCtx.choiceIndex == 0) {
- play->msgCtx.msgMode = 0x44;
- func_8019F208();
+ play->msgCtx.msgMode = MSGMODE_PAUSED;
+ Audio_PlaySfx_MessageDecide();
switch (this->unk_2FA) {
case 4:
this->unk_2FA = 3;
break;
+
case 7:
this->unk_2FA = 6;
break;
+
case 9:
default:
this->unk_2FA = 8;
@@ -910,18 +964,20 @@ s32 func_80A9617C(EnAz* this, PlayState* play) {
}
ret = 0;
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
this->actor.textId = 0x10EC;
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_LAUGH_LEFT,
- &this->animIndex);
- SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo,
+ BEAVER_ANIM_LAUGH_LEFT, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationSpeedInfo,
BEAVER_ANIM_IDLE_FACE_RIGHT, &brother->animIndex);
}
break;
+
case 0x10EC:
- func_80A98EFC(this, play, 0x10ED, -1, BEAVER_ANIM_LAUGH_RIGHT);
+ func_80A98EFC(this, play, 0x10ED, BEAVER_ANIM_NONE, BEAVER_ANIM_LAUGH_RIGHT);
ret = 0;
break;
+
case 0x10ED:
if ((this->unk_2FA == 4) || (this->unk_2FA == 9)) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_24_04);
@@ -930,18 +986,22 @@ s32 func_80A9617C(EnAz* this, PlayState* play) {
func_80A979DC(this, play);
ret = 0;
break;
+
case 0x10EE:
func_80A98EFC(this, play, 0x10EF, BEAVER_ANIM_IDLE_FACE_LEFT, BEAVER_ANIM_TALK_TO_RIGHT);
ret = 0;
break;
+
case 0x10EF:
func_80A98EFC(this, play, 0x10F0, BEAVER_ANIM_IDLE_FACE_RIGHT, BEAVER_ANIM_TALK_TO_LEFT);
ret = 0;
break;
+
case 0x10F0:
func_80A98EFC(this, play, 0x10F1, BEAVER_ANIM_IDLE_FACE_LEFT, BEAVER_ANIM_TALK_TO_RIGHT);
ret = 0;
break;
+
case 0x10F1:
SET_WEEKEVENTREG(WEEKEVENTREG_93_01);
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_23_80)) {
@@ -950,151 +1010,171 @@ s32 func_80A9617C(EnAz* this, PlayState* play) {
this->getItemId = GI_BOTTLE;
SET_WEEKEVENTREG(WEEKEVENTREG_23_80);
}
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE,
&this->animIndex);
- SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE,
&brother->animIndex);
ret = 7;
break;
+
case 0x10F2:
case 0x1109:
CLEAR_WEEKEVENTREG(WEEKEVENTREG_24_04);
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE,
&this->animIndex);
- SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE,
&brother->animIndex);
func_80A94AB8(this, play, 0);
func_80A979DC(this, play);
ret = 0;
break;
+
case 0x10F3:
func_80A98EFC(this, play, 0x10F4, BEAVER_ANIM_IDLE_FACE_LEFT, BEAVER_ANIM_TALK_TO_RIGHT);
ret = 0;
break;
+
case 0x10F4:
func_80A98EFC(this, play, 0x10F5, BEAVER_ANIM_IDLE_FACE_RIGHT, BEAVER_ANIM_TALK_TO_LEFT);
ret = 0;
break;
+
case 0x10F5:
func_80A98EFC(this, play, 0x10F6, BEAVER_ANIM_IDLE_FACE_LEFT, BEAVER_ANIM_TALK_TO_RIGHT);
ret = 0;
break;
+
case 0x10F6:
func_80A98EFC(this, play, 0x10F7, BEAVER_ANIM_IDLE_FACE_RIGHT, BEAVER_ANIM_TALK_WAVE_ARMS);
ret = 0;
break;
+
case 0x10F7:
this->actor.textId = 0x10F8;
ret = 3;
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_TALK,
&this->animIndex);
break;
+
case 0x10F8:
if (play->msgCtx.choiceIndex == 0) {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_25_01)) {
this->actor.textId = 0x1107;
} else {
this->actor.textId = 0x10FA;
}
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo,
BEAVER_ANIM_TALK_WAVE_ARMS, &this->animIndex);
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
this->actor.textId = 0x10F9;
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_BOW,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_BOW,
&this->animIndex);
- SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_BOW,
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_BOW,
&brother->animIndex);
}
break;
+
case 0x10F9:
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE,
&this->animIndex);
- SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE,
&brother->animIndex);
this->unk_374 |= 0x20;
ret = 0;
break;
+
case 0x10FA:
case 0x1107:
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE,
&this->animIndex);
- SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE,
&brother->animIndex);
this->unk_2FA = 6;
ret = 0;
break;
+
case 0x10FB:
func_80A98EFC(this, play, 0x10FC, BEAVER_ANIM_IDLE_FACE_LEFT, BEAVER_ANIM_TALK_TO_RIGHT);
ret = 0;
break;
+
case 0x10FC:
func_80A98EFC(this, play, 0x10FD, BEAVER_ANIM_IDLE_FACE_RIGHT, BEAVER_ANIM_TALK);
ret = 0;
break;
+
case 0x10FD:
this->actor.textId = 0x10FE;
ret = 3;
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_TALK,
&this->animIndex);
- SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE,
&brother->animIndex);
break;
+
case 0x10FE:
if (play->msgCtx.choiceIndex == 0) {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_25_01)) {
this->actor.textId = 0x1108;
} else {
this->actor.textId = 0x1101;
}
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_TALK,
&this->animIndex);
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
this->actor.textId = 0x10FF;
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK_TO_LEFT,
- &this->animIndex);
- SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo,
+ BEAVER_ANIM_TALK_TO_LEFT, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationSpeedInfo,
BEAVER_ANIM_IDLE_FACE_RIGHT, &brother->animIndex);
}
break;
+
case 0x10FF:
func_80A98EFC(this, play, 0x1100, BEAVER_ANIM_IDLE_FACE_LEFT, BEAVER_ANIM_TALK_TO_RIGHT);
ret = 0;
break;
+
case 0x1100:
CLEAR_WEEKEVENTREG(WEEKEVENTREG_24_04);
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE,
&this->animIndex);
- SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE,
&brother->animIndex);
func_80A94AB8(this, play, 0);
func_80A979DC(this, play);
ret = 0;
break;
+
case 0x1101:
case 0x1108:
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE,
&this->animIndex);
- SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE,
&brother->animIndex);
this->unk_2FA = 8;
ret = 0;
break;
+
case 0x1102:
func_80A98EFC(this, play, 0x1103, BEAVER_ANIM_IDLE_FACE_LEFT, BEAVER_ANIM_TALK_TO_RIGHT);
ret = 0;
break;
+
case 0x1103:
func_80A98EFC(this, play, 0x1104, BEAVER_ANIM_IDLE_FACE_RIGHT, BEAVER_ANIM_TALK_TO_LEFT);
ret = 0;
break;
+
case 0x1104:
func_80A98EFC(this, play, 0x1105, BEAVER_ANIM_IDLE_FACE_LEFT, BEAVER_ANIM_TALK_TO_RIGHT);
ret = 0;
break;
+
case 0x1105:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_25_01)) {
this->getItemId = GI_RUPEE_PURPLE;
@@ -1102,25 +1182,27 @@ s32 func_80A9617C(EnAz* this, PlayState* play) {
this->getItemId = GI_HEART_PIECE;
SET_WEEKEVENTREG(WEEKEVENTREG_25_01);
}
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE,
&this->animIndex);
- SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE,
&brother->animIndex);
ret = 7;
break;
+
case 0x1106:
CLEAR_WEEKEVENTREG(WEEKEVENTREG_24_04);
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE,
&this->animIndex);
- SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE,
&brother->animIndex);
func_80A94AB8(this, play, 0);
func_80A979DC(this, play);
ret = 0;
break;
+
case 0x10D5:
default:
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE,
&this->animIndex);
this->unk_374 |= 0x20;
ret = 0;
@@ -1128,10 +1210,12 @@ s32 func_80A9617C(EnAz* this, PlayState* play) {
}
}
break;
+
case TEXT_STATE_NONE:
case TEXT_STATE_1:
case TEXT_STATE_CLOSING:
case TEXT_STATE_3:
+ default:
break;
}
return ret;
@@ -1146,32 +1230,37 @@ void func_80A97114(EnAz* this, PlayState* play) {
case 0x10DA:
case 0x10DD:
case 0x10E9:
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_TALK, &this->animIndex);
break;
+
case 0x10EE:
case 0x10F3:
case 0x10FB:
case 0x1102:
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK_TO_LEFT,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_TALK_TO_LEFT,
&this->animIndex);
sp20 = true;
break;
+
case 0x10F2:
case 0x1106:
case 0x1109:
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_BOW, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_BOW, &this->animIndex);
if (brother != NULL) {
- SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_BOW,
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_BOW,
&brother->animIndex);
}
break;
+
+ default:
+ break;
}
if ((brother != NULL) && sp20) {
if (this->unk_374 & 2) {
- SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE_FACE_RIGHT,
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE_FACE_RIGHT,
&brother->animIndex);
} else {
- SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE_FACE_LEFT,
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE_FACE_LEFT,
&brother->animIndex);
}
}
@@ -1189,12 +1278,13 @@ s32 func_80A97274(EnAz* this, PlayState* play) {
case 0:
default:
CLEAR_WEEKEVENTREG(WEEKEVENTREG_24_04);
- if (!(CHECK_WEEKEVENTREG(WEEKEVENTREG_16_40))) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_16_40)) {
textId = 0x10CE;
} else {
textId = 0x10D4;
}
break;
+
case 2:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_24_01)) {
SET_WEEKEVENTREG(WEEKEVENTREG_24_04);
@@ -1204,6 +1294,7 @@ s32 func_80A97274(EnAz* this, PlayState* play) {
textId = 0x10DA;
}
break;
+
case 4:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_24_01)) {
textId = 0x10EE;
@@ -1211,10 +1302,12 @@ s32 func_80A97274(EnAz* this, PlayState* play) {
textId = 0x10E9;
}
break;
+
case 5:
CLEAR_WEEKEVENTREG(WEEKEVENTREG_24_04);
textId = 0x10F3;
break;
+
case 7:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_24_01)) {
SET_WEEKEVENTREG(WEEKEVENTREG_24_04);
@@ -1223,6 +1316,7 @@ s32 func_80A97274(EnAz* this, PlayState* play) {
textId = 0x10E9;
}
break;
+
case 9:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_24_01)) {
textId = 0x1102;
@@ -1293,7 +1387,7 @@ void func_80A97410(EnAz* this, PlayState* play) {
}
}
if (this->unk_378 == 3) {
- func_80151938(play, this->actor.textId);
+ Message_ContinueTextbox(play, this->actor.textId);
this->unk_378 = 2;
} else if (this->unk_378 == 5) {
Message_StartTextbox(play, this->actor.textId, &this->actor);
@@ -1309,8 +1403,8 @@ void func_80A97410(EnAz* this, PlayState* play) {
this->unk_378 = 0;
}
} else {
- Actor_PickUp(&this->actor, play, this->getItemId, this->actor.xzDistToPlayer,
- this->actor.playerHeightRel);
+ Actor_OfferGetItem(&this->actor, play, this->getItemId, this->actor.xzDistToPlayer,
+ this->actor.playerHeightRel);
}
}
if (this->unk_378 == 9) {
@@ -1319,12 +1413,16 @@ void func_80A97410(EnAz* this, PlayState* play) {
if (temp_a0 == 0) {
switch (this->unk_3D2) {
case 0x10CE:
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_TALK,
&this->animIndex);
break;
+
case 0x10D4:
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK_WAVE_ARMS,
- &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo,
+ BEAVER_ANIM_TALK_WAVE_ARMS, &this->animIndex);
+ break;
+
+ default:
break;
}
Message_StartTextbox(play, this->unk_3D2, &this->actor);
@@ -1336,8 +1434,8 @@ void func_80A97410(EnAz* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
func_80A97114(this, play);
this->unk_378 = 2;
- } else if (func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel,
- PLAYER_IA_MINUS1)) {
+ } else if (Actor_OfferTalkExchange(&this->actor, play, this->actor.xzDistToPlayer,
+ this->actor.playerHeightRel, PLAYER_IA_MINUS1)) {
this->actor.textId = func_80A973B4(this, play);
}
} else {
@@ -1353,7 +1451,7 @@ void func_80A97410(EnAz* this, PlayState* play) {
Math_SmoothStepToS(&this->unk_3D4, 0, 2, 0x71C, 0);
}
Math_Vec3f_Copy(&sp38, &player->actor.world.pos);
- sp38.y = player->bodyPartsPos[7].y + 3.0f;
+ sp38.y = player->bodyPartsPos[PLAYER_BODYPART_HEAD].y + 3.0f;
temp_v0_7 = Math_Vec3f_Pitch(&this->actor.focus.pos, &sp38);
if (ABS(temp_v0_7) < 0x800) {
Math_SmoothStepToS(&this->unk_3D6, temp_v0_7, 3, 0x71C, 0);
@@ -1370,7 +1468,7 @@ void func_80A97410(EnAz* this, PlayState* play) {
} else {
Actor_GetScreenPos(play, &this->actor, &sp56, &sp54);
if ((sp56 >= 0) && (sp56 <= SCREEN_WIDTH) && (sp54 >= 0) && (sp54 <= SCREEN_HEIGHT) &&
- func_800B8500(&this->actor, play, 120.0f, 120.0f, 0)) {
+ Actor_OfferTalkExchange(&this->actor, play, 120.0f, 120.0f, PLAYER_IA_NONE)) {
this->unk_3D2 = func_80A97274(this, play);
if ((this->unk_3D2 == 0x10CE) || (this->unk_3D2 == 0x10D4)) {
this->actor.textId = 0;
@@ -1398,8 +1496,8 @@ 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)) {
- play->msgCtx.msgMode = 0;
+ if (SubS_StartCutscene(&this->actor, 0, CS_ID_NONE, SUBS_CUTSCENE_WITH_PLAYER)) {
+ play->msgCtx.msgMode = MSGMODE_NONE;
play->msgCtx.msgLength = 0;
func_80A97A9C(this, play);
}
@@ -1414,37 +1512,44 @@ void func_80A97AB4(EnAz* this, PlayState* play) {
case TEXT_STATE_NONE:
Message_StartTextbox(play, 0x10D7, NULL);
break;
+
case TEXT_STATE_CHOICE:
case TEXT_STATE_5:
case TEXT_STATE_DONE:
if (Message_ShouldAdvance(play)) {
switch (play->msgCtx.currentTextId) {
case 0x10D7:
- func_80151938(play, 0x10D8);
+ Message_ContinueTextbox(play, 0x10D8);
break;
+
case 0x10D8:
if (play->msgCtx.choiceIndex == 0) {
- func_8019F208();
- play->msgCtx.msgMode = 0x44;
- func_800FD750(NA_BGM_TIMED_MINI_GAME);
+ Audio_PlaySfx_MessageDecide();
+ play->msgCtx.msgMode = MSGMODE_PAUSED;
+ Environment_ForcePlaySequence(NA_BGM_TIMED_MINI_GAME);
func_80A94AB8(this, play, 1);
func_80A979DC(this, play);
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_24_04)) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_24_04);
}
- func_80151938(play, 0x10D9);
+ Message_ContinueTextbox(play, 0x10D9);
}
break;
+
case 0x10D9:
func_80A94AB8(this, play, 0);
func_80A979DC(this, play);
break;
+
+ default:
+ break;
}
}
case TEXT_STATE_1:
case TEXT_STATE_CLOSING:
+ default:
break;
}
}
@@ -1461,12 +1566,12 @@ void func_80A97C24(EnAz* this, PlayState* play) {
void func_80A97C4C(EnAz* this, PlayState* play) {
if (SkelAnime_Update(&this->skelAnime) && (this->animIndex == BEAVER_ANIM_BOW)) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_IDLE, &this->animIndex);
}
func_80A97410(this, play);
if ((this->unk_2FA == 1) || (this->unk_2FA == 3) || (this->unk_2FA == 6) || (this->unk_2FA == 8)) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_24_01);
- func_800FD750(NA_BGM_TIMED_MINI_GAME);
+ Environment_ForcePlaySequence(NA_BGM_TIMED_MINI_GAME);
play->nextEntrance = Entrance_CreateFromSpawn(1);
gSaveContext.nextCutsceneIndex = 0;
play->transitionTrigger = TRANS_TRIGGER_START;
@@ -1510,14 +1615,14 @@ void func_80A97EAC(EnAz* this, PlayState* play) {
SubS_ActorPathing_Init(play, &this->actor.world.pos, &this->actor, &this->unk_300, play->setupPathList,
BEAVER_GET_PARAM_FF(&this->actor), 0, 0, 1, 0);
this->unk_36C = 8.0f;
- this->actor.speedXZ = 8.0f;
+ this->actor.speed = 8.0f;
this->actor.gravity = 0.0f;
this->actor.velocity.y = 6.0f;
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_SWIM_WITH_SPINNING_TAIL,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, BEAVER_ANIM_SWIM_WITH_SPINNING_TAIL,
&this->animIndex);
- this->actor.flags |= ACTOR_FLAG_8000000;
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
- this->actor.bgCheckFlags &= ~0x21;
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
+ this->actor.bgCheckFlags &= ~(BGCHECKFLAG_GROUND | BGCHECKFLAG_WATER);
this->unk_374 |= 0x1000;
this->unk_3C2 = 0;
this->unk_3C4 = 0;
@@ -1554,7 +1659,7 @@ void func_80A97F9C(EnAz* this, PlayState* play) {
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_WHITE;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
func_80A979DC(this, play);
} else {
if (gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] == SECONDS_TO_TIMER(0)) {
@@ -1574,10 +1679,10 @@ void func_80A97F9C(EnAz* this, PlayState* play) {
if (this->actor.depthInWater > 8.0f) {
if (this->unk_374 & 2) {
if ((this->skelAnime.curFrame < this->skelAnime.playSpeed) && (this->skelAnime.curFrame >= 0.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BEAVER_SWIM_HAND);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BEAVER_SWIM_HAND);
}
} else {
- func_800B9010(&this->actor, NA_SE_EV_BEAVER_SWIM_MOTOR - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_BEAVER_SWIM_MOTOR - SFX_FLAG);
}
}
SkelAnime_Update(&this->skelAnime);
@@ -1589,7 +1694,7 @@ void func_80A982E0(PlayState* play, ActorPathing* actorPathing) {
Vec3f sp28;
actorPathing->curPoint.x = actorPathing->points[actorPathing->curPointIndex].x;
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
actorPathing->curPoint.y = actorPathing->points[actorPathing->curPointIndex].y;
} else {
actorPathing->curPoint.y = actorPathing->points[actorPathing->curPointIndex].y - this->unk_3A4;
@@ -1615,7 +1720,7 @@ void func_80A98414(EnAz* this, PlayState* play) {
if ((fish->actor.params < 0) && (fish->actor.room == this->actor.room) &&
(Math3D_Vec3fDistSq(&this->actor.world.pos, &fish->actor.world.pos) < SQ(200.0f))) {
fish->unk_276 = 0x14;
- fish->unk_274 = Actor_YawBetweenActors(&fish->actor, &this->actor);
+ fish->unk_274 = Actor_WorldYawTowardActor(&fish->actor, &this->actor);
}
}
itemAction = itemAction->next;
@@ -1627,7 +1732,7 @@ void EnAz_Update(Actor* thisx, PlayState* play2) {
EnAz* this = THIS;
this->unk_374 &= ~0x100;
- if ((this->actor.bgCheckFlags & 0x20) && (this->actor.depthInWater > 22.0f)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WATER) && (this->actor.depthInWater > 22.0f)) {
if (!(this->unk_376 & 0x100)) {
this->unk_374 |= 0x200;
}
@@ -1638,10 +1743,10 @@ void EnAz_Update(Actor* thisx, PlayState* play2) {
this->actionFunc(this, play);
Actor_SetFocus(&this->actor, 40.0f);
if (this->unk_374 & 0x200) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_DIVE_INTO_WATER);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_DIVE_INTO_WATER);
}
if (this->unk_374 & 0x400) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_JUMP_OUT_WATER);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_JUMP_OUT_WATER);
}
this->unk_37E++;
if (this->unk_37E >= 4) {
@@ -1660,9 +1765,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 +1888,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,21 +1898,24 @@ 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.speedXZ > 0.5f)) {
+
+ 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);
Matrix_RotateXS(this->actor.shape.rot.x, MTXMODE_APPLY);
Matrix_RotateZS(this->actor.shape.rot.z, MTXMODE_APPLY);
Matrix_RotateXS(this->unk_39E, MTXMODE_APPLY);
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if (this->unk_374 & 2) {
s32 i;
Vec3f sp98;
@@ -1835,7 +1945,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 +1956,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);
}
@@ -1899,14 +2010,15 @@ void func_80A98EFC(EnAz* this, PlayState* play, u16 textId, s32 animIndex, s32 b
EnAz* brother = this->brother;
Actor_ChangeFocus(&this->actor, play, &brother->actor);
- if (animIndex >= 0) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, animIndex, &this->animIndex);
+ if (animIndex > BEAVER_ANIM_NONE) {
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, animIndex, &this->animIndex);
}
this->actor.textId = 0;
brother->actor.textId = textId;
brother->unk_378 = 5;
- if ((brotherAnimIndex >= 0) && (brotherAnimIndex != brother->animIndex)) {
- SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, brotherAnimIndex, &brother->animIndex);
+ if ((brotherAnimIndex > BEAVER_ANIM_NONE) && (brotherAnimIndex != brother->animIndex)) {
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationSpeedInfo, brotherAnimIndex,
+ &brother->animIndex);
}
this->unk_378 = 0;
}
@@ -1920,6 +2032,7 @@ void func_80A98F94(struct_80A98F94* yData, f32 frame, f32* yInterp) {
yData++;
nextFrame = yData[0].unk_0;
} while (nextFrame < frame);
+
prevFrame = yData[-1].unk_0;
weight = LERPWEIGHT(frame, prevFrame, nextFrame);
*yInterp = LERPIMP(yData[-1].unk_4, yData[0].unk_4, weight) * 0.01f;
diff --git a/src/overlays/actors/ovl_En_Az/z_en_az.h b/src/overlays/actors/ovl_En_Az/z_en_az.h
index 2a219eb24..486257286 100644
--- a/src/overlays/actors/ovl_En_Az/z_en_az.h
+++ b/src/overlays/actors/ovl_En_Az/z_en_az.h
@@ -2,6 +2,7 @@
#define Z_EN_AZ_H
#include "global.h"
+#include "objects/object_az/object_az.h"
struct EnAz;
@@ -15,8 +16,8 @@ typedef struct EnAz {
/* 0x144 */ EnAzActionFunc actionFunc;
/* 0x148 */ SkelAnime skelAnime;
/* 0x18C */ ColliderCylinder collider;
- /* 0x1D8 */ Vec3s jointTable[24];
- /* 0x268 */ Vec3s morphTable[24];
+ /* 0x1D8 */ Vec3s jointTable[BEAVER_OLDER_BROTHER_LIMB_MAX]; // Also BEAVER_YOUNGER_BROTHER_LIMB_MAX
+ /* 0x268 */ Vec3s morphTable[BEAVER_OLDER_BROTHER_LIMB_MAX]; // Also BEAVER_YOUNGER_BROTHER_LIMB_MAX
/* 0x2F8 */ s16 unk_2F8;
/* 0x2FA */ s16 unk_2FA; // cutscene state?
/* 0x2FC */ s32 animIndex;
@@ -45,7 +46,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 6040076f4..43cbd2969 100644
--- a/src/overlays/actors/ovl_En_Baba/z_en_baba.c
+++ b/src/overlays/actors/ovl_En_Baba/z_en_baba.c
@@ -6,7 +6,7 @@
#include "z_en_baba.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnBaba*)thisx)
@@ -35,15 +35,6 @@ void EnBaba_DoNothing(EnBaba* this, PlayState* play);
void EnBaba_Walk(EnBaba* this, PlayState* play);
void EnBaba_FaceForward(EnBaba* this, PlayState* play);
-typedef enum {
- /* 0 */ BOMB_SHOP_LADY_ANIM_IDLE_HOLDING_BAG,
- /* 1 */ BOMB_SHOP_LADY_ANIM_IDLE,
- /* 2 */ BOMB_SHOP_LADY_ANIM_WALKING_HOLDING_BAG,
- /* 3 */ BOMB_SHOP_LADY_ANIM_KNOCKED_OVER,
- /* 4 */ BOMB_SHOP_LADY_ANIM_LYING_DOWN,
- /* 5 */ BOMB_SHOP_LADY_ANIM_SWAY
-} BombShopLadyAnimation;
-
typedef enum {
/* 0 */ BOMB_SHOP_LADY_SCH_NONE,
/* 1 */ BOMB_SHOP_LADY_SCH_KNOCKED_OVER,
@@ -62,13 +53,23 @@ ActorInit En_Baba_InitVars = {
(ActorFunc)EnBaba_Draw,
};
-static AnimationInfo sAnimationInfo[] = {
- { &gBbaIdleHoldingBagAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f },
- { &gBbaIdleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f },
- { &gBbaWalkingHoldingBagAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f },
- { &gBbaKnockedOverAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f },
- { &gBbaLyingDownAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f },
- { &gBbaSwayAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f },
+typedef enum {
+ /* 0 */ BOMB_SHOP_LADY_ANIM_IDLE_HOLDING_BAG,
+ /* 1 */ BOMB_SHOP_LADY_ANIM_IDLE,
+ /* 2 */ BOMB_SHOP_LADY_ANIM_WALKING_HOLDING_BAG,
+ /* 3 */ BOMB_SHOP_LADY_ANIM_KNOCKED_OVER,
+ /* 4 */ BOMB_SHOP_LADY_ANIM_LYING_DOWN,
+ /* 5 */ BOMB_SHOP_LADY_ANIM_SWAY,
+ /* 6 */ BOMB_SHOP_LADY_ANIM_MAX
+} BombShopLadyAnimation;
+
+static AnimationInfo sAnimationInfo[BOMB_SHOP_LADY_ANIM_MAX] = {
+ { &gBbaIdleHoldingBagAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // BOMB_SHOP_LADY_ANIM_IDLE_HOLDING_BAG
+ { &gBbaIdleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // BOMB_SHOP_LADY_ANIM_IDLE
+ { &gBbaWalkingHoldingBagAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // BOMB_SHOP_LADY_ANIM_WALKING_HOLDING_BAG
+ { &gBbaKnockedOverAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // BOMB_SHOP_LADY_ANIM_KNOCKED_OVER
+ { &gBbaLyingDownAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // BOMB_SHOP_LADY_ANIM_LYING_DOWN
+ { &gBbaSwayAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // BOMB_SHOP_LADY_ANIM_SWAY
};
static ColliderCylinderInit sCylinderInit = {
@@ -167,13 +168,13 @@ void EnBaba_HandleConversation(EnBaba* this, PlayState* play) {
switch (this->textId) {
case 0:
if (this->stateFlags & BOMB_SHOP_LADY_STATE_AUTOTALK) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_33_08)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_RECOVERED_STOLEN_BOMB_BAG)) {
// Thanks. Can stock Bomb Bags tomorrow
this->textId = 0x2A34;
break;
}
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_79_40)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_SAKON_DEAD)) {
this->stateFlags |= BOMB_SHOP_LADY_STATE_END_CONVERSATION;
// Oh my, learned my lesson. Can't stock Bomb Bags tomorrow
this->textId = 0x2A33;
@@ -184,7 +185,9 @@ void EnBaba_HandleConversation(EnBaba* this, PlayState* play) {
// Can't stock Bomb Bags tomorrow
this->textId = 0x2A32;
break;
- } else if (player->transformation == PLAYER_FORM_DEKU) {
+ }
+
+ if (player->transformation == PLAYER_FORM_DEKU) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_79_20)) {
SET_WEEKEVENTREG(WEEKEVENTREG_79_20);
this->stateFlags |= BOMB_SHOP_LADY_STATE_END_CONVERSATION;
@@ -197,7 +200,9 @@ void EnBaba_HandleConversation(EnBaba* this, PlayState* play) {
this->textId = 0x2A38;
}
break;
- } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_33_08)) {
+ }
+
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_RECOVERED_STOLEN_BOMB_BAG)) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_73_01)) {
// Thought could sell Big Bomb Bags
this->textId = 0x660;
@@ -206,16 +211,16 @@ void EnBaba_HandleConversation(EnBaba* this, PlayState* play) {
// Can't judge people
this->textId = 0x662;
break;
- } else {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_73_02)) {
- // Someone helped me out
- this->textId = 0x65A;
- break;
- }
- // Buy Big Bomb Bag
- this->textId = 0x65E;
+ }
+
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_73_02)) {
+ // Someone helped me out
+ this->textId = 0x65A;
break;
}
+
+ // Buy Big Bomb Bag
+ this->textId = 0x65E;
break;
case 0x660:
@@ -287,15 +292,18 @@ void EnBaba_HandleConversation(EnBaba* this, PlayState* play) {
case 0x2A31:
this->stateFlags |= BOMB_SHOP_LADY_STATE_END_CONVERSATION;
break;
+
+ default:
+ break;
}
Message_StartTextbox(play, this->textId, &this->actor);
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);
}
}
@@ -320,8 +328,8 @@ s32 EnBaba_MoveForward(EnBaba* this, f32 speedTarget) {
s32 reachedEnd = false;
Vec3f point;
- Math_SmoothStepToF(&this->actor.speedXZ, speedTarget, 0.4f, 1000.0f, 0.0f);
- rotStep = this->actor.speedXZ * 400.0f;
+ Math_SmoothStepToF(&this->actor.speed, speedTarget, 0.4f, 1000.0f, 0.0f);
+ rotStep = this->actor.speed * 400.0f;
if (SubS_CopyPointFromPath(this->path, this->waypoint, &point) &&
SubS_MoveActorToPoint(&this->actor, &point, rotStep)) {
this->waypoint++;
@@ -355,7 +363,7 @@ void EnBaba_UpdateModel(EnBaba* this, PlayState* play) {
Math_SmoothStepToS(&this->torsoRot.y, 0, 4, 0x3E8, 1);
}
- SubS_FillLimbRotTables(play, this->limbRotTableY, this->limbRotTableZ, ARRAY_COUNT(this->limbRotTableY));
+ SubS_UpdateFidgetTables(play, this->fidgetTableY, this->fidgetTableZ, BBA_LIMB_MAX);
if (this->stateFlags & BOMB_SHOP_LADY_STATE_VISIBLE) {
EnBaba_UpdateCollider(this, play);
@@ -404,10 +412,6 @@ s32 EnBaba_ProcessScheduleOutput(EnBaba* this, PlayState* play, ScheduleOutput*
s32 success;
switch (scheduleOutput->result) {
- default:
- success = false;
- break;
-
case BOMB_SHOP_LADY_SCH_FOLLOW_TIME_PATH:
success = EnBaba_InitTimePath(this, play, scheduleOutput);
break;
@@ -415,7 +419,12 @@ s32 EnBaba_ProcessScheduleOutput(EnBaba* this, PlayState* play, ScheduleOutput*
case BOMB_SHOP_LADY_SCH_KNOCKED_OVER:
success = true;
break;
+
+ default:
+ success = false;
+ break;
}
+
return success;
}
@@ -485,12 +494,15 @@ void EnBaba_HandleSchedule(EnBaba* this, PlayState* play) {
this->animIndex = BOMB_SHOP_LADY_ANIM_KNOCKED_OVER;
// Ouch
this->textId = 0x2A30;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
Enemy_StartFinishingBlow(play, &this->actor);
this->stateFlags |= BOMB_SHOP_LADY_STATE_KNOCKED_OVER;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
this->actionFunc = EnBaba_KnockedOver;
break;
+
+ default:
+ break;
}
Math_ApproachS(&this->actor.shape.rot.y, this->actor.world.rot.y, 4, 0x1554);
}
@@ -501,7 +513,7 @@ void EnBaba_FinishInit(EnBaba* this, PlayState* play) {
this->actor.draw = EnBaba_Draw;
this->stateFlags |= BOMB_SHOP_LADY_STATE_DRAW_SHADOW;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
if (play->sceneId == SCENE_BOMYA) {
this->stateFlags |= BOMB_SHOP_LADY_STATE_VISIBLE;
@@ -511,7 +523,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);
@@ -530,7 +542,7 @@ void EnBaba_FinishInit(EnBaba* this, PlayState* play) {
}
this->stateFlags |= BOMB_SHOP_LADY_STATE_VISIBLE;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_33_08)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_RECOVERED_STOLEN_BOMB_BAG)) {
this->animIndex = BOMB_SHOP_LADY_ANIM_IDLE_HOLDING_BAG;
} else {
this->animIndex = BOMB_SHOP_LADY_ANIM_IDLE;
@@ -546,11 +558,11 @@ void EnBaba_FinishInit(EnBaba* this, PlayState* play) {
} else {
this->stateFlags |= BOMB_SHOP_LADY_STATE_VISIBLE;
if (BOMB_SHOP_LADY_GET_TYPE(&this->actor) == BOMB_SHOP_LADY_TYPE_SWAY) {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
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;
@@ -575,7 +587,7 @@ void EnBaba_Idle(EnBaba* this, PlayState* play) {
if (this->stateFlags & BOMB_SHOP_LADY_STATE_AUTOTALK) {
this->actor.flags |= ACTOR_FLAG_10000;
}
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
}
}
@@ -584,7 +596,7 @@ void EnBaba_FollowSchedule_Talk(EnBaba* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
if (((talkState == TEXT_STATE_5) || (talkState == TEXT_STATE_DONE)) && Message_ShouldAdvance(play)) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->actionFunc = EnBaba_FollowSchedule;
}
@@ -598,11 +610,11 @@ void EnBaba_Talk(EnBaba* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
if (this->stateFlags & BOMB_SHOP_LADY_STATE_END_CONVERSATION) {
this->stateFlags &= ~BOMB_SHOP_LADY_STATE_END_CONVERSATION;
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
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;
@@ -617,7 +629,7 @@ void EnBaba_Talk(EnBaba* this, PlayState* play) {
}
} else if (this->stateFlags & BOMB_SHOP_LADY_STATE_GIVE_BLAST_MASK) {
this->stateFlags &= ~BOMB_SHOP_LADY_STATE_GIVE_BLAST_MASK;
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->actionFunc = EnBaba_GiveBlastMask;
} else {
@@ -625,7 +637,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));
}
@@ -638,7 +650,7 @@ void EnBaba_GiveBlastMask(EnBaba* this, PlayState* play) {
this->stateFlags |= BOMB_SHOP_LADY_STATE_GAVE_BLAST_MASK;
this->actionFunc = EnBaba_GaveBlastMask;
} else {
- Actor_PickUp(&this->actor, play, GI_MASK_BLAST, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_MASK_BLAST, 300.0f, 300.0f);
}
}
@@ -647,7 +659,7 @@ void EnBaba_GaveBlastMask(EnBaba* this, PlayState* play) {
EnBaba_HandleConversation(this, play);
this->actionFunc = EnBaba_Talk;
} else {
- func_800B85E0(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
}
}
@@ -660,11 +672,11 @@ void EnBaba_FollowSchedule(EnBaba* this, PlayState* play) {
((this->scheduleResult != scheduleOutput.result) &&
!EnBaba_ProcessScheduleOutput(this, play, &scheduleOutput))) {
this->stateFlags &= ~BOMB_SHOP_LADY_STATE_DRAW_SHADOW;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
scheduleOutput.result = BOMB_SHOP_LADY_SCH_NONE;
} else {
this->stateFlags |= BOMB_SHOP_LADY_STATE_DRAW_SHADOW;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}
this->scheduleResult = scheduleOutput.result;
@@ -674,8 +686,8 @@ void EnBaba_FollowSchedule(EnBaba* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
Message_StartTextbox(play, 0x2A39, &this->actor); // "I'm sorry"
this->actionFunc = EnBaba_FollowSchedule_Talk;
- } else if ((this->actor.xzDistToPlayer < 100.0f) || this->actor.isTargeted) {
- func_800B863C(&this->actor, play);
+ } else if ((this->actor.xzDistToPlayer < 100.0f) || this->actor.isLockedOn) {
+ Actor_OfferTalkNearColChkInfoCylinder(&this->actor, play);
}
}
Actor_MoveWithGravity(&this->actor);
@@ -690,7 +702,7 @@ void EnBaba_KnockedOver(EnBaba* this, PlayState* play) {
if (this->animIndex == BOMB_SHOP_LADY_ANIM_KNOCKED_OVER) {
if (Animation_OnFrame(&this->skelAnime, 0.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_VO_BBVO00);
+ Actor_PlaySfx(&this->actor, NA_SE_VO_BBVO00);
}
if (curFrame == endFrame) {
@@ -698,8 +710,8 @@ void EnBaba_KnockedOver(EnBaba* this, PlayState* play) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
}
} else {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_79_40) && (DECR(this->sakonDeadTimer) == 0)) {
- Audio_QueueSeqCmd(0x101400FF);
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_SAKON_DEAD) && (DECR(this->sakonDeadTimer) == 0)) {
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 20);
EnBaba_TriggerTransition(play, ENTRANCE(NORTH_CLOCK_TOWN, 7));
} else {
Actor_MoveWithGravity(&this->actor);
@@ -728,11 +740,11 @@ 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);
- this->actor.targetMode = 0;
+ this->actor.targetMode = TARGET_MODE_0;
this->actor.gravity = -4.0f;
this->actionFunc = EnBaba_FinishInit;
}
@@ -748,7 +760,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);
}
@@ -773,8 +785,8 @@ s32 EnBaba_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
if ((limbIndex == BBA_LIMB_UPPER_ROOT) || (limbIndex == BBA_LIMB_LEFT_UPPER_ARM) ||
(limbIndex == BBA_LIMB_RIGHT_UPPER_ARM)) {
- rot->y += (s16)(Math_SinS(this->limbRotTableY[limbIndex]) * 200.0f);
- rot->z += (s16)(Math_CosS(this->limbRotTableZ[limbIndex]) * 200.0f);
+ rot->y += (s16)(Math_SinS(this->fidgetTableY[limbIndex]) * 200.0f);
+ rot->z += (s16)(Math_CosS(this->fidgetTableZ[limbIndex]) * 200.0f);
}
if (((this->animIndex == BOMB_SHOP_LADY_ANIM_IDLE) || (this->animIndex == BOMB_SHOP_LADY_ANIM_KNOCKED_OVER) ||
@@ -810,7 +822,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 +833,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..7a8b8194f 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 {
@@ -38,8 +40,8 @@ typedef struct EnBaba {
/* 0x2E4 */ Vec3s headRot;
/* 0x2EA */ Vec3s torsoRot;
/* 0x2F0 */ UNK_TYPE1 unk2F0[0x12];
- /* 0x302 */ s16 limbRotTableY[18];
- /* 0x326 */ s16 limbRotTableZ[18];
+ /* 0x302 */ s16 fidgetTableY[BBA_LIMB_MAX];
+ /* 0x326 */ s16 fidgetTableZ[BBA_LIMB_MAX];
/* 0x34A */ UNK_TYPE1 unk34A[0xBA];
/* 0x404 */ s16 sakonDeadTimer;
/* 0x406 */ UNK_TYPE1 unk406[4];
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 9017e0f89..25f867ec1 100644
--- a/src/overlays/actors/ovl_En_Baguo/z_en_baguo.c
+++ b/src/overlays/actors/ovl_En_Baguo/z_en_baguo.c
@@ -5,9 +5,10 @@
*/
#include "z_en_baguo.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY)
#define THIS ((EnBaguo*)thisx)
@@ -27,18 +28,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 = {
@@ -132,7 +133,7 @@ void EnBaguo_Init(Actor* thisx, PlayState* play) {
this->actor.world.rot.z = 0;
Actor_SetScale(&this->actor, 0.01f);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
- this->actor.targetMode = 2;
+ this->actor.targetMode = TARGET_MODE_2;
Collider_InitAndSetJntSph(play, &this->collider, &this->actor, &sJntSphInit, this->colliderElements);
this->collider.elements[0].dim.modelSphere.radius = 30;
@@ -144,8 +145,8 @@ void EnBaguo_Init(Actor* thisx, PlayState* play) {
this->actor.shape.yOffset = -3000.0f;
this->actor.gravity = -3.0f;
this->actor.colChkInfo.damageTable = &sDamageTable;
- this->actor.flags |= ACTOR_FLAG_8000000;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->collider.base.acFlags |= AC_HARD;
this->actionFunc = EnBaguo_UndergroundIdle;
}
@@ -158,13 +159,13 @@ void EnBaguo_Destroy(Actor* thisx, PlayState* play) {
void EnBaguo_UndergroundIdle(EnBaguo* this, PlayState* play) {
this->action = NEJIRON_ACTION_INACTIVE;
- if (this->actor.xzDistToPlayer < 200.0f && Player_GetMask(play) != PLAYER_MASK_STONE) {
+ if ((this->actor.xzDistToPlayer < 200.0f) && (Player_GetMask(play) != PLAYER_MASK_STONE)) {
this->actor.draw = EnBaguo_DrawBody;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BAKUO_APPEAR);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BAKUO_APPEAR);
this->actor.world.rot.z = 0;
this->actor.world.rot.x = this->actor.world.rot.z;
- this->actor.flags &= ~ACTOR_FLAG_8000000;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_CANT_LOCK_ON;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actionFunc = EnBaguo_EmergeFromUnderground;
}
this->actor.shape.rot.y = this->actor.world.rot.y;
@@ -205,7 +206,7 @@ void EnBaguo_Idle(EnBaguo* this, PlayState* play) {
if ((play->gameplayFrames % 8) == 0) {
Actor_SpawnFloorDustRing(play, &this->actor, &this->actor.world.pos,
this->actor.shape.shadowScale - 20.0f, 10, 8.0f, 500, 10, 1);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BAKUO_VOICE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BAKUO_VOICE);
}
}
}
@@ -244,17 +245,17 @@ void EnBaguo_Roll(EnBaguo* this, PlayState* play) {
this->timer = 100;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = EnBaguo_Idle;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
} else {
- if (!this->bouncedFlag && this->collider.base.atFlags & AT_BOUNCED) {
+ if (!this->bouncedFlag && (this->collider.base.atFlags & AT_BOUNCED)) {
this->zRollDirection ^= 1;
this->bouncedFlag = 1;
- this->actor.speedXZ = -7.0f;
+ this->actor.speed = -7.0f;
}
Math_ApproachF(&this->currentRotation.x, this->targetRotation.x, 0.2f, 1000.0f);
Math_ApproachF(&this->currentRotation.z, this->targetRotation.z, 0.2f, 1000.0f);
- Math_ApproachF(&this->actor.speedXZ, 5.0f, 0.3f, 0.5f);
+ Math_ApproachF(&this->actor.speed, 5.0f, 0.3f, 0.5f);
this->actor.world.rot.x += (s16)this->currentRotation.x;
if (this->currentRotation.z != 0.0f) {
@@ -265,14 +266,14 @@ void EnBaguo_Roll(EnBaguo* this, PlayState* play) {
}
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BAKUO_ROLL - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BAKUO_ROLL - SFX_FLAG);
}
}
void EnBaguo_SetupRetreatUnderground(EnBaguo* this) {
this->action = NEJIRON_ACTION_RETREATING;
this->actionFunc = EnBaguo_RetreatUnderground;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
void EnBaguo_RetreatUnderground(EnBaguo* this, PlayState* play) {
@@ -290,9 +291,9 @@ void EnBaguo_RetreatUnderground(EnBaguo* this, PlayState* play) {
this->actor.shape.yOffset = -3000.0f;
this->actor.draw = EnBaguo_DrawBody;
Math_Vec3f_Copy(&this->actor.world.pos, &this->actor.home.pos);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BAKUO_APPEAR);
- this->actor.flags |= ACTOR_FLAG_8000000;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BAKUO_APPEAR);
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actionFunc = EnBaguo_UndergroundIdle;
}
}
@@ -316,21 +317,23 @@ void EnBaguo_CheckForDetonation(EnBaguo* this, PlayState* play) {
// the Nejiron should forcibly explode and as a loop index.
i = false;
if (this->action != NEJIRON_ACTION_EXPLODING && this->action != NEJIRON_ACTION_RETREATING) {
- if (!(this->actor.bgCheckFlags & 1) && this->actor.world.pos.y < (this->actor.home.pos.y - 100.0f)) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
+ (this->actor.world.pos.y < (this->actor.home.pos.y - 100.0f))) {
// Force a detonation if we're off the ground and have fallen
// below our home position (e.g., we rolled off a ledge).
i = true;
}
- if (this->actor.bgCheckFlags & 0x60 && this->actor.depthInWater >= 40.0f) {
+ if ((this->actor.bgCheckFlags & (BGCHECKFLAG_WATER | BGCHECKFLAG_WATER_TOUCH)) &&
+ (this->actor.depthInWater >= 40.0f)) {
// Force a detonation if we're too far below the water's surface.
i = true;
}
- if ((this->collider.base.acFlags & AC_HIT || i)) {
+ if ((this->collider.base.acFlags & AC_HIT) || i) {
this->collider.base.acFlags &= ~AC_HIT;
- if (i || this->actor.colChkInfo.damageEffect == NEJIRON_DMGEFF_KILL) {
- Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, 0, 8);
+ if (i || (this->actor.colChkInfo.damageEffect == NEJIRON_DMGEFF_KILL)) {
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
this->action = NEJIRON_ACTION_EXPLODING;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.shape.shadowScale = 0.0f;
for (i = 0; i < ARRAY_COUNT(this->effects); i++) {
@@ -345,13 +348,13 @@ void EnBaguo_CheckForDetonation(EnBaguo* this, PlayState* play) {
}
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->actor.world.pos.x, this->actor.world.pos.y,
- this->actor.world.pos.z, 0, 0, 0, CLEAR_TAG_POP);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_BOMB_EXPLOSION);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BAKUO_DEAD);
+ this->actor.world.pos.z, 0, 0, 0, CLEAR_TAG_PARAMS(CLEAR_TAG_POP));
+ Actor_PlaySfx(&this->actor, NA_SE_IT_BOMB_EXPLOSION);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BAKUO_DEAD);
this->timer = 30;
- this->actor.flags |= ACTOR_FLAG_8000000;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
Actor_SetScale(&this->actor, 0.0f);
this->collider.elements->dim.scale = 3.0f;
this->collider.elements->info.toucher.damage = 8;
@@ -373,7 +376,7 @@ void EnBaguo_Update(Actor* thisx, PlayState* play) {
DECR(this->blinkTimer);
DECR(this->timer);
- if (this->action != NEJIRON_ACTION_EXPLODING && this->action != NEJIRON_ACTION_INACTIVE) {
+ if ((this->action != NEJIRON_ACTION_EXPLODING) && (this->action != NEJIRON_ACTION_INACTIVE)) {
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
}
@@ -390,7 +393,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);
}
@@ -415,7 +420,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;
@@ -445,9 +450,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->rot.x = (s16)(s32)Rand_CenteredFloat(0x7530);
+ effect->rot.y = (s16)(s32)Rand_CenteredFloat(0x7530);
+ effect->rot.z = (s16)(s32)Rand_CenteredFloat(0x7530);
return;
}
}
@@ -462,9 +467,9 @@ void EnBaguo_UpdateEffects(EnBaguo* this, PlayState* play) {
effect->pos.x += effect->velocity.x;
effect->pos.y += effect->velocity.y;
effect->pos.z += effect->velocity.z;
- effect->rotation.x += 0xBB8;
- effect->rotation.y += 0xBB8;
- effect->rotation.z += 0xBB8;
+ effect->rot.x += 0xBB8;
+ effect->rot.y += 0xBB8;
+ effect->rot.z += 0xBB8;
effect->velocity.x += effect->accel.x;
effect->velocity.y += effect->accel.y;
effect->velocity.z += effect->accel.z;
@@ -492,13 +497,13 @@ 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);
- Matrix_RotateXS(effect->rotation.x, MTXMODE_APPLY);
- Matrix_RotateYS(effect->rotation.y, MTXMODE_APPLY);
- Matrix_RotateZS(effect->rotation.z, MTXMODE_APPLY);
+ Matrix_RotateXS(effect->rot.x, MTXMODE_APPLY);
+ Matrix_RotateYS(effect->rot.y, MTXMODE_APPLY);
+ Matrix_RotateZS(effect->rot.z, MTXMODE_APPLY);
Matrix_Scale(effect->scale, effect->scale, effect->scale, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_En_Baguo/z_en_baguo.h b/src/overlays/actors/ovl_En_Baguo/z_en_baguo.h
index d6eb2173c..132095bd1 100644
--- a/src/overlays/actors/ovl_En_Baguo/z_en_baguo.h
+++ b/src/overlays/actors/ovl_En_Baguo/z_en_baguo.h
@@ -17,7 +17,7 @@ typedef struct NejironEffect {
/* 0x04 */ Vec3f pos;
/* 0x10 */ Vec3f velocity;
/* 0x1C */ Vec3f accel;
- /* 0x28 */ Vec3s rotation;
+ /* 0x28 */ Vec3s rot;
/* 0x30 */ f32 scale;
/* 0x34 */ s16 timer;
} NejironEffect; // size = 0x38
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 8812ae6d3..e6ac52cee 100644
--- a/src/overlays/actors/ovl_En_Baisen/z_en_baisen.c
+++ b/src/overlays/actors/ovl_En_Baisen/z_en_baisen.c
@@ -7,7 +7,7 @@
#include "z_en_baisen.h"
#include "objects/object_bai/object_bai.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnBaisen*)thisx)
@@ -57,16 +57,31 @@ static ColliderCylinderInit sCylinderInit = {
static u16 sTextIds[] = { 0x2ABD, 0x2ABB, 0x2AD5, 0x2AD6, 0x2AD7, 0x2AD8, 0x2AC6 };
-static AnimationHeader* sAnimations[] = { &object_bai_Anim_0011C0, &object_bai_Anim_0008B4, &object_bai_Anim_008198 };
+typedef enum {
+ /* 0 */ ENBAISEN_ANIM_0,
+ /* 1 */ ENBAISEN_ANIM_1,
+ /* 2 */ ENBAISEN_ANIM_2,
+ /* 3 */ ENBAISEN_ANIM_MAX
+} EnBaisenAnimation;
-static u8 sAnimationModes[] = { ANIMMODE_LOOP, ANIMMODE_LOOP };
+static AnimationHeader* sAnimations[ENBAISEN_ANIM_MAX] = {
+ &object_bai_Anim_0011C0, // ENBAISEN_ANIM_0
+ &object_bai_Anim_0008B4, // ENBAISEN_ANIM_1
+ &object_bai_Anim_008198, // ENBAISEN_ANIM_2
+};
+
+static u8 sAnimationModes[ENBAISEN_ANIM_MAX] = {
+ ANIMMODE_LOOP, // ENBAISEN_ANIM_0
+ ANIMMODE_LOOP, // ENBAISEN_ANIM_1
+ ANIMMODE_LOOP, // ENBAISEN_ANIM_2
+};
void EnBaisen_Init(Actor* thisx, PlayState* play) {
EnBaisen* this = THIS;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 25.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &object_bai_Skel_007908, &object_bai_Anim_0011C0, this->jointTable,
- this->morphTable, 20);
+ this->morphTable, OBJECT_BAI_LIMB_MAX);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
this->paramCopy = this->actor.params;
if (this->actor.params == 0) {
@@ -82,7 +97,7 @@ void EnBaisen_Init(Actor* thisx, PlayState* play) {
Actor_Kill(&this->actor);
}
}
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
this->actor.gravity = -3.0f;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
if (this->paramCopy == 0) {
@@ -100,8 +115,8 @@ void EnBaisen_Destroy(Actor* thisx, PlayState* play) {
void EnBaisen_ChangeAnim(EnBaisen* this, s32 animIndex) {
this->animIndex = animIndex;
- this->frameCount = Animation_GetLastFrame(sAnimations[animIndex]);
- Animation_Change(&this->skelAnime, sAnimations[this->animIndex], 1.0f, 0.0f, this->frameCount,
+ this->animEndFrame = Animation_GetLastFrame(sAnimations[animIndex]);
+ Animation_Change(&this->skelAnime, sAnimations[this->animIndex], 1.0f, 0.0f, this->animEndFrame,
sAnimationModes[this->animIndex], -10.0f);
}
@@ -136,10 +151,10 @@ void func_80BE87B0(EnBaisen* this, PlayState* play) {
void func_80BE87FC(EnBaisen* this) {
if (this->paramCopy == 0) {
this->textIdIndex = 2;
- EnBaisen_ChangeAnim(this, 2);
+ EnBaisen_ChangeAnim(this, ENBAISEN_ANIM_2);
this->unk29E = this->actor.world.rot.y;
} else {
- EnBaisen_ChangeAnim(this, 0);
+ EnBaisen_ChangeAnim(this, ENBAISEN_ANIM_0);
}
this->actor.textId = sTextIds[this->textIdIndex];
@@ -165,7 +180,7 @@ void func_80BE887C(EnBaisen* this, PlayState* play) {
}
}
this->actor.textId = sTextIds[this->textIdIndex];
- func_800B8614(&this->actor, play, 70.0f);
+ Actor_OfferTalk(&this->actor, play, 70.0f);
}
}
@@ -187,13 +202,13 @@ void func_80BE895C(EnBaisen* this, PlayState* play) {
void func_80BE89D8(EnBaisen* this, PlayState* play) {
if (&this->actor == this->unk2A4) {
this->unk29E = this->actor.world.rot.y;
- if (this->animIndex == 0) {
- EnBaisen_ChangeAnim(this, 1);
+ if (this->animIndex == ENBAISEN_ANIM_0) {
+ EnBaisen_ChangeAnim(this, ENBAISEN_ANIM_1);
}
} else {
this->unk29E = Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk2A4->world.pos);
- if (this->animIndex != 0) {
- EnBaisen_ChangeAnim(this, 0);
+ if (this->animIndex != ENBAISEN_ANIM_0) {
+ EnBaisen_ChangeAnim(this, ENBAISEN_ANIM_0);
}
}
if ((play->msgCtx.currentTextId == 0x2AC6) || (play->msgCtx.currentTextId == 0x2AC7) ||
@@ -209,22 +224,22 @@ void func_80BE89D8(EnBaisen* this, PlayState* play) {
void func_80BE8AAC(EnBaisen* this, PlayState* play) {
if ((this->textIdIndex % 2) != 0) {
this->unk29E = this->actor.world.rot.y;
- if (this->animIndex == 0) {
- EnBaisen_ChangeAnim(this, 1);
+ if (this->animIndex == ENBAISEN_ANIM_0) {
+ EnBaisen_ChangeAnim(this, ENBAISEN_ANIM_1);
}
} else {
if (this->unk2A4 != NULL) {
this->unk29E = Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk2A4->world.pos);
}
- if (this->animIndex != 0) {
- EnBaisen_ChangeAnim(this, 0);
+ if (this->animIndex != ENBAISEN_ANIM_0) {
+ EnBaisen_ChangeAnim(this, ENBAISEN_ANIM_0);
}
}
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->textIdIndex++;
if (this->textIdIndex < 6) {
- func_80151938(play, sTextIds[this->textIdIndex]);
+ Message_ContinueTextbox(play, sTextIds[this->textIdIndex]);
if ((this->textIdIndex % 2) == 0) {
this->unk2A4 = this->heishiPointer;
} else {
@@ -252,7 +267,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);
@@ -267,7 +284,7 @@ void EnBaisen_Update(Actor* thisx, PlayState* play) {
s32 EnBaisen_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnBaisen* this = THIS;
- if (limbIndex == 9) {
+ if (limbIndex == OBJECT_BAI_LIMB_09) {
rot->x += this->headRotX;
rot->y += this->headRotY;
rot->z += this->headRotZ;
@@ -279,7 +296,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_Baisen/z_en_baisen.h b/src/overlays/actors/ovl_En_Baisen/z_en_baisen.h
index 4c0ced24f..25e747e38 100644
--- a/src/overlays/actors/ovl_En_Baisen/z_en_baisen.h
+++ b/src/overlays/actors/ovl_En_Baisen/z_en_baisen.h
@@ -2,6 +2,7 @@
#define Z_EN_BAISEN_H
#include "global.h"
+#include "objects/object_bai/object_bai.h"
struct EnBaisen;
@@ -10,8 +11,8 @@ typedef void (*EnBaisenActionFunc)(struct EnBaisen*, PlayState*);
typedef struct EnBaisen {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[20];
- /* 0x200 */ Vec3s morphTable[20];
+ /* 0x188 */ Vec3s jointTable[OBJECT_BAI_LIMB_MAX];
+ /* 0x200 */ Vec3s morphTable[OBJECT_BAI_LIMB_MAX];
/* 0x278 */ EnBaisenActionFunc actionFunc;
/* 0x27C */ s16 headRotY;
/* 0x27E */ s16 headRotX;
@@ -22,7 +23,7 @@ typedef struct EnBaisen {
/* 0x28C */ s32 paramCopy;
/* 0x290 */ s32 unk290;
/* 0x294 */ s16 unusedCounter;
- /* 0x298 */ f32 frameCount;
+ /* 0x298 */ f32 animEndFrame;
/* 0x29C */ s16 unk29C;
/* 0x29E */ s16 unk29E;
/* 0x2A0 */ s16 textIdIndex;
diff --git a/src/overlays/actors/ovl_En_Bal/z_en_bal.c b/src/overlays/actors/ovl_En_Bal/z_en_bal.c
index 779373a9d..490517e09 100644
--- a/src/overlays/actors/ovl_En_Bal/z_en_bal.c
+++ b/src/overlays/actors/ovl_En_Bal/z_en_bal.c
@@ -5,8 +5,9 @@
*/
#include "z_en_bal.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnBal*)thisx)
@@ -15,7 +16,80 @@ void EnBal_Destroy(Actor* thisx, PlayState* play);
void EnBal_Update(Actor* thisx, PlayState* play);
void EnBal_Draw(Actor* thisx, PlayState* play);
-#if 0
+typedef enum {
+ /* 0 */ TINGLE_EYETEX_OPEN,
+ /* 1 */ TINGLE_EYETEX_CLOSED
+} TingleEyeTexture;
+
+typedef enum {
+ /* -1 */ TINGLE_ANIM_NONE = -1,
+ /* 0 */ TINGLE_ANIM_FLOAT_IDLE,
+ /* 1 */ TINGLE_ANIM_FALL_LOOP,
+ /* 2 */ TINGLE_ANIM_FALL_ONCE,
+ /* 3 */ TINGLE_ANIM_LAND,
+ /* 4 */ TINGLE_ANIM_TWIST,
+ /* 5 */ TINGLE_ANIM_TALK,
+ /* 6 */ TINGLE_ANIM_MAGIC,
+ /* 7 */ TINGLE_ANIM_HAPPY_DANCE_LOOP,
+ /* 8 */ TINGLE_ANIM_HAPPY_DANCE_ONCE,
+ /* 9 */ TINGLE_ANIM_MAGIC_REVERSE,
+ /* 10 */ TINGLE_ANIM_IDLE,
+ /* 11 */ TINGLE_ANIM_SPIN,
+ /* 12 */ TINGLE_ANIM_HIDE_FACE,
+ /* 13 */ TINGLE_ANIM_CONFETTI,
+ /* 14 */ TINGLE_ANIM_MAX
+} TingleAnimation;
+
+typedef enum {
+ /* 0 */ TINGLE_MAPCHOICE_PROXIMAL,
+ /* 1 */ TINGLE_MAPCHOICE_DISTAL,
+ /* 2 */ TINGLE_MAPCHOICE_CANCEL
+} TingleBuyMapChoice;
+
+typedef enum {
+ /* 0 */ TINGLE_WATCH_TARGET_NONE,
+ /* 1 */ TINGLE_WATCH_TARGET_PLAYER,
+ /* 2 */ TINGLE_WATCH_TARGET_FAIRY
+} TingleWatchTarget;
+
+typedef enum {
+ /* 0 */ TINGLE_BALLOON_ACTION_NONE,
+ /* 1 */ TINGLE_BALLOON_ACTION_POP,
+ /* 2 */ TINGLE_BALLOON_ACTION_FALL,
+ /* 4 */ TINGLE_BALLOON_ACTION_INFLATE = 4,
+ /* 5 */ TINGLE_BALLOON_ACTION_RISE
+} TingleBalloonAction;
+
+typedef enum {
+ /* 0 */ TINGLE_IDLESTAGE_ACTIVITY,
+ /* 2 */ TINGLE_IDLESTAGE_PREP_WAIT = 2,
+ /* 3 */ TINGLE_IDLESTAGE_WAIT
+} TingleIdleAnimStage;
+
+void EnBal_SetMainColliderToHead(EnBal* this);
+s32 EnBal_ValidatePictograph(PlayState* play, Actor* thisx);
+void EnBal_SetupFloatIdle(EnBal* this);
+void EnBal_FloatIdle(EnBal* this, PlayState* play);
+void EnBal_PopBalloon(EnBal* this, PlayState* play);
+void EnBal_SetupFall(EnBal* this);
+void EnBal_Fall(EnBal* this, PlayState* play);
+void EnBal_InflateBalloon(EnBal* this, PlayState* play);
+void EnBal_SetupFloatUp(EnBal* this);
+void EnBal_FloatUp(EnBal* this, PlayState* play);
+void EnBal_SetupGroundIdle(EnBal* this);
+void EnBal_GroundIdle(EnBal* this, PlayState* play);
+void EnBal_SetupTalk(EnBal* this);
+void EnBal_Talk(EnBal* this, PlayState* play);
+PlayerTransformation EnBal_GetRecognizedPlayerForm(void);
+void EnBal_ThrowMagicSparkles(EnBal* this, PlayState* play);
+void EnBal_EmitDustPuff(EnBal* this, PlayState* play);
+void EnBal_TryPurchaseMap(EnBal* this, PlayState* play);
+void EnBal_HandleConversation(EnBal* this, PlayState* play);
+void EnBal_SetupOfferGetItem(EnBal* this);
+void EnBal_OfferGetItem(EnBal* this, PlayState* play);
+void EnBal_SetupThankYou(EnBal* this);
+void EnBal_ThankYou(EnBal* this, PlayState* play);
+
ActorInit En_Bal_InitVars = {
ACTOR_EN_BAL,
ACTORCAT_NPC,
@@ -28,8 +102,7 @@ ActorInit En_Bal_InitVars = {
(ActorFunc)EnBal_Draw,
};
-// static DamageTable sDamageTable = {
-static DamageTable D_80A63CE0 = {
+static DamageTable sDamageTable = {
/* Deku Nut */ DMG_ENTRY(0, 0x0),
/* Deku Stick */ DMG_ENTRY(0, 0x0),
/* Horse trample */ DMG_ENTRY(0, 0x0),
@@ -64,108 +137,1038 @@ static DamageTable D_80A63CE0 = {
/* Powder Keg */ DMG_ENTRY(0, 0x0),
};
-// sColChkInfoInit
-static CollisionCheckInfoInit2 D_80A63D00 = { 1, 0, 0, 0, MASS_IMMOVABLE };
+static CollisionCheckInfoInit2 sColChkInfoInit = { 1, 0, 0, 0, MASS_IMMOVABLE };
-// static ColliderJntSphElementInit sJntSphElementsInit[1] = {
-static ColliderJntSphElementInit D_80A63D0C[1] = {
+static ColliderJntSphElementInit sJntSphElementsInit[1] = {
{
- { ELEMTYPE_UNK0, { 0xF7CFFFFF, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, },
- { 6, { { 2400, 0, 0 }, 50 }, 100 },
+ {
+ ELEMTYPE_UNK0,
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_ON,
+ },
+ { TINGLE_LIMB_BALLOON, { { 2400, 0, 0 }, 50 }, 100 },
},
};
-// static ColliderJntSphInit sJntSphInit = {
-static ColliderJntSphInit D_80A63D30 = {
- { COLTYPE_NONE, AT_ON | AT_TYPE_ENEMY, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_JNTSPH, },
- ARRAY_COUNT(sJntSphElementsInit), D_80A63D0C, // sJntSphElementsInit,
+static ColliderJntSphInit sJntSphInit = {
+ {
+ COLTYPE_NONE,
+ AT_ON | AT_TYPE_ENEMY,
+ AC_ON | AC_TYPE_PLAYER,
+ OC1_ON | OC1_TYPE_ALL,
+ OC2_TYPE_1,
+ COLSHAPE_JNTSPH,
+ },
+ ARRAY_COUNT(sJntSphElementsInit),
+ sJntSphElementsInit,
};
-#endif
+static s16 sBuyMapOptions[TINGLE_MAP_MAX][2] = {
+ { TINGLE_MAP_CLOCK_TOWN, TINGLE_MAP_WOODFALL }, // TINGLE_MAP_CLOCK_TOWN
+ { TINGLE_MAP_WOODFALL, TINGLE_MAP_SNOWHEAD }, // TINGLE_MAP_WOODFALL
+ { TINGLE_MAP_SNOWHEAD, TINGLE_MAP_ROMANI_RANCH }, // TINGLE_MAP_SNOWHEAD
+ { TINGLE_MAP_ROMANI_RANCH, TINGLE_MAP_GREAT_BAY }, // TINGLE_MAP_ROMANI_RANCH
+ { TINGLE_MAP_GREAT_BAY, TINGLE_MAP_STONE_TOWER }, // TINGLE_MAP_GREAT_BAY
+ { TINGLE_MAP_STONE_TOWER, TINGLE_MAP_CLOCK_TOWN }, // TINGLE_MAP_STONE_TOWER
+};
-extern DamageTable D_80A63CE0;
-extern CollisionCheckInfoInit2 D_80A63D00;
-extern ColliderJntSphElementInit D_80A63D0C[1];
-extern ColliderJntSphInit D_80A63D30;
+static AnimationInfo sAnimationInfo[TINGLE_ANIM_MAX] = {
+ { &gTingleFloatIdleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // TINGLE_ANIM_FLOAT_IDLE
+ { &gTingleFallAnim, 1.5f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // TINGLE_ANIM_FALL_LOOP
+ { &gTingleFallAnim, 1.5f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, // TINGLE_ANIM_FALL_ONCE
+ { &gTingleLandAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, // TINGLE_ANIM_LAND
+ { &gTingleTwistAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // TINGLE_ANIM_TWIST
+ { &gTingleTalkAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // TINGLE_ANIM_TALK
+ { &gTingleThrowConfettiAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f }, // TINGLE_ANIM_MAGIC
+ { &gTingleHappyDanceAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // TINGLE_ANIM_HAPPY_DANCE_LOOP
+ { &gTingleHappyDanceAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f }, // TINGLE_ANIM_HAPPY_DANCE_ONCE
+ { &gTingleThrowConfettiAnim, 1.0f, 23.0f, 0.0f, ANIMMODE_ONCE, -8.0f }, // TINGLE_ANIM_MAGIC_REVERSE
+ { &gTingleIdleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // TINGLE_ANIM_IDLE
+ { &gTingleSpinAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -2.0f }, // TINGLE_ANIM_SPIN
+ { &gTingleFloatHideFaceAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -2.0f }, // TINGLE_ANIM_HIDE_FACE
+ { &gTingleFloatThrowConfettiAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -2.0f }, // TINGLE_ANIM_CONFETTI
+};
-extern UNK_TYPE D_060005FC;
-extern UNK_TYPE D_0600CB78;
-extern UNK_TYPE D_0600D530;
+void EnBal_Init(Actor* thisx, PlayState* play) {
+ EnBal* this = THIS;
+ s32 pad;
+ f32 endFrame = Animation_GetLastFrame(&gTingleFloatIdleAnim);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/EnBal_Init.s")
+ this->locationMapId = TINGLE_GET_MAP_ID(&this->picto.actor);
+ this->picto.actor.targetMode = 1;
+ this->picto.actor.uncullZoneForward = 3000.0f;
+ Actor_SetScale(&this->picto.actor, 0.02f);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gTingleSkel, &gTingleFloatIdleAnim, this->jointTable, this->morphTable,
+ TINGLE_LIMB_MAX);
+ if (gSaveContext.save.saveInfo.playerData.isMagicAcquired) {
+ Animation_Change(&this->skelAnime, &gTingleTalkAnim, 1.0f, 0.0f, endFrame, ANIMMODE_LOOP, -10.0f);
+ }
+ ActorShape_Init(&this->picto.actor.shape, 0.0f, ActorShadow_DrawCircle, 0.0f);
+ this->skyFloatPhase = 0;
+ this->textId = 0;
+ this->balloonAction = TINGLE_BALLOON_ACTION_NONE;
+ this->timer = 0;
+ this->watchTarget = TINGLE_WATCH_TARGET_NONE;
+ this->inflateEarly = false;
+ this->isTalking = false;
+ this->eyeTexIndex = TINGLE_EYETEX_OPEN;
+ this->eyeTimer = 60;
+ this->forceEyesShut = false;
+ Collider_InitJntSph(play, &this->collider);
+ Collider_SetJntSph(play, &this->collider, &this->picto.actor, &sJntSphInit, this->colliderElements);
+ CollisionCheck_SetInfo2(&this->picto.actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
+ Actor_UpdateBgCheckInfo(play, &this->picto.actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
+ this->picto.validationFunc = EnBal_ValidatePictograph;
+ if (!gSaveContext.save.saveInfo.playerData.isMagicAcquired) {
+ this->picto.actor.world.pos.y = this->picto.actor.floorHeight;
+ EnBal_SetMainColliderToHead(this);
+ EnBal_SetupGroundIdle(this);
+ } else {
+ EnBal_SetupFloatIdle(this);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/EnBal_Destroy.s")
+void EnBal_Destroy(Actor* thisx, PlayState* play) {
+ EnBal* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A61A18.s")
+ Collider_InitJntSph(play, &this->collider);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A61A44.s")
+void EnBal_SetMainColliderToBalloon(EnBal* this) {
+ this->collider.elements->dim.limb = TINGLE_LIMB_BALLOON;
+ this->collider.elements->dim.modelSphere.radius = 40;
+ this->collider.elements->dim.modelSphere.center.x = 2200;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/EnBal_ValidatePictograph.s")
+void EnBal_SetMainColliderToHead(EnBal* this) {
+ this->collider.elements->dim.limb = TINGLE_LIMB_HEAD;
+ this->collider.elements->dim.modelSphere.radius = 25;
+ this->collider.elements->dim.modelSphere.center.x = 0;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A61ADC.s")
+s32 EnBal_ValidatePictograph(PlayState* play, Actor* thisx) {
+ s32 pictoValid;
+ EnBal* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A61B5C.s")
+ pictoValid = Snap_ValidatePictograph(play, &this->picto.actor, PICTO_VALID_TINGLE, &this->picto.actor.focus.pos,
+ &this->picto.actor.shape.rot, 10.0f, 400.0f, 0x4000);
+ if (!pictoValid) {
+ this->forceEyesShut = true;
+ this->idleAnimStage = TINGLE_IDLESTAGE_WAIT;
+ }
+ return pictoValid;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A61C9C.s")
+void EnBal_SetupFloatIdle(EnBal* this) {
+ this->timer = 0;
+ EnBal_SetMainColliderToBalloon(this);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_FLOAT_IDLE);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A61CE4.s")
+ this->picto.actor.focus.pos = this->picto.actor.world.pos;
+ this->picto.actor.focus.pos.y = this->picto.actor.world.pos.y + 100.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A61DF8.s")
+ this->actionFunc = EnBal_FloatIdle;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A61E5C.s")
+void EnBal_FloatIdle(EnBal* this, PlayState* play) {
+ f32 scaleFactor;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A62128.s")
+ this->skyFloatPhase += 0x320;
+ this->picto.actor.focus.pos.y = this->picto.actor.world.pos.y + 100.0f;
+ this->timer += 1000;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A621C4.s")
+ scaleFactor = (Math_CosS(this->skyFloatPhase) * 0.1f) + 1.0f;
+ this->balloonScale.z = scaleFactor;
+ this->balloonScale.y = scaleFactor;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A62260.s")
+ scaleFactor = (Math_SinS(this->skyFloatPhase) * 0.1f) + 1.0f;
+ this->balloonScale.x = SQ(scaleFactor);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A622A0.s")
+ this->picto.actor.world.pos.y = (Math_SinS(this->skyFloatPhase) * 50.0f) + this->picto.actor.home.pos.y;
+ if (this->forceEyesShut == true) {
+ if (this->skelAnime.animation != &gTingleFloatHideFaceAnim) {
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_HIDE_FACE);
+ } else if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
+ if (this->idleAnimStage != TINGLE_IDLESTAGE_ACTIVITY) {
+ this->idleAnimStage--;
+ } else {
+ this->forceEyesShut = false;
+ this->eyeTexIndex = TINGLE_EYETEX_OPEN;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_FLOAT_IDLE);
+ }
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A623CC.s")
+void EnBal_SetupPopBalloon(EnBal* this) {
+ EnBal_SetMainColliderToHead(this);
+ this->timer = 0;
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EV_MUJURA_BALLOON_BROKEN);
+ this->balloonAction = TINGLE_BALLOON_ACTION_POP;
+ this->actionFunc = EnBal_PopBalloon;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A624DC.s")
+void EnBal_PopBalloon(EnBal* this, PlayState* play) {
+ this->picto.actor.focus.pos.x = this->picto.actor.world.pos.x;
+ this->picto.actor.focus.pos.y = this->picto.actor.world.pos.y + 20.0f;
+ this->picto.actor.focus.pos.z = this->picto.actor.world.pos.z + 30.0f;
+ if (this->picto.actor.csId != CS_ID_NONE) {
+ if (CutsceneManager_IsNext(this->picto.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->picto.actor.csId, &this->picto.actor);
+ Camera_SetFocalActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(this->picto.actor.csId)),
+ &this->picto.actor);
+ } else {
+ CutsceneManager_Queue(this->picto.actor.csId);
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A62818.s")
+ if (this->timer > 30) {
+ this->timer = 0;
+ EnBal_SetupFall(this);
+ } else if (this->timer > 10) {
+ // Freeze animation and induce blink
+ this->skelAnime.playSpeed = 0.0f;
+ if (this->eyeTimer > 6) {
+ this->eyeTimer = 6;
+ }
+ this->timer++;
+ } else {
+ this->timer++;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A62830.s")
+void EnBal_SetupFall(EnBal* this) {
+ Actor_PlaySfx(&this->picto.actor, NA_SE_VO_TIVO00);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_FALL_LOOP);
+ this->forceEyesShut = true;
+ this->balloonAction = TINGLE_BALLOON_ACTION_FALL;
+ this->actionFunc = EnBal_Fall;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A629C4.s")
+void EnBal_Fall(EnBal* this, PlayState* play) {
+ Vec3f worldPos = this->picto.actor.world.pos;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A62AC4.s")
+ this->picto.actor.focus.pos.x = this->picto.actor.world.pos.x;
+ this->picto.actor.focus.pos.y = this->picto.actor.world.pos.y + 20.0f;
+ this->picto.actor.focus.pos.z = this->picto.actor.world.pos.z + 30.0f;
+ if (this->timer == 30) {
+ this->picto.actor.gravity = -1.5f;
+ Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->picto.actor.world.rot.y, 5, 0x3000, 0x100);
+ Math_SmoothStepToS(&this->picto.actor.shape.rot.z, this->picto.actor.world.rot.z, 5, 0x3000, 0x100);
+ } else if (this->timer < 30) {
+ this->timer++;
+ this->picto.actor.shape.rot.y = (s32)(Math_CosS(this->skyFloatPhase) * 2500.0f) + this->picto.actor.world.rot.y;
+ this->picto.actor.shape.rot.z = (s32)(Math_SinS(this->skyFloatPhase) * 2500.0f) + this->picto.actor.world.rot.z;
+ if (this->timer == 25) {
+ this->forceEyesShut = false;
+ this->eyeTexIndex = TINGLE_EYETEX_OPEN;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_FALL_ONCE);
+ } else if (this->timer == 29) {
+ this->picto.actor.velocity.y = -12.0f;
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A62B30.s")
+ if (this->picto.actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
+ Actor_PlaySfx(&this->picto.actor, NA_SE_VO_TIVO01);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_GERUDOFT_DOWN);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A62B78.s")
+ if (this->picto.actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->picto.actor.colChkInfo.health = 0;
+ if (this->timer > 80) {
+ this->picto.actor.shape.yOffset = 0.0f;
+ EnBal_SetupGroundIdle(this);
+ } else if (this->timer == 30) {
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_LAND);
+ this->picto.actor.shape.rot = this->picto.actor.world.rot;
+ Actor_SpawnFloorDustRing(play, &this->picto.actor, &worldPos, 10.0f, 30, 5.0f, 0, 0, 0);
+ this->timer++;
+ } else {
+ if ((play->gameplayFrames % 2) != 0) {
+ this->picto.actor.shape.yOffset = 20.0f;
+ } else {
+ this->picto.actor.shape.yOffset = 0.0f;
+ }
+ this->timer++;
+ }
+ } else if (this->picto.actor.velocity.y < 0.0f) {
+ Actor_PlaySfx_Flagged(&this->picto.actor, NA_SE_EV_HONEYCOMB_FALL - SFX_FLAG);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A62CF0.s")
+ this->skyFloatPhase += 0xBB8;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A62DCC.s")
+void EnBal_SetupInflateBalloon(EnBal* this) {
+ Vec3f scale = { 0.0f, 0.0f, 0.0f };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A62ED0.s")
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_FLOAT_IDLE);
+ this->balloonAction = TINGLE_BALLOON_ACTION_INFLATE;
+ this->watchTarget = TINGLE_WATCH_TARGET_NONE;
+ this->forceEyesShut = false;
+ this->eyeTexIndex = TINGLE_EYETEX_OPEN;
+ this->balloonScale = scale;
+ this->skyFloatPhase = 0;
+ this->timer = 0;
+ this->actionFunc = EnBal_InflateBalloon;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A62FAC.s")
+void EnBal_InflateBalloon(EnBal* this, PlayState* play) {
+ f32 scale;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A63158.s")
+ if (Math_SmoothStepToF(&this->balloonScale.x, 1.0f, 0.05f, 0.03f, 0.01f) == 0.0f) {
+ EnBal_SetupFloatUp(this);
+ }
+ EnBal_EmitDustPuff(this, play);
+ Actor_PlaySfx_Flagged(&this->picto.actor, NA_SE_EV_BALLOON_SWELL - SFX_FLAG);
+ scale = this->balloonScale.x * 1.1f;
+ this->balloonScale.z = scale;
+ this->balloonScale.y = scale;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A634B4.s")
+void EnBal_SetupFloatUp(EnBal* this) {
+ this->balloonAction = TINGLE_BALLOON_ACTION_RISE;
+ EnBal_SetMainColliderToBalloon(this);
+ this->actionFunc = EnBal_FloatUp;
+ this->picto.actor.gravity = 0.0f;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A634C8.s")
+void EnBal_FloatUp(EnBal* this, PlayState* play) {
+ f32 cosFactor;
+ f32 sinFactor;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A635DC.s")
+ if (this->timer < 500) {
+ cosFactor = (Math_CosS(this->skyFloatPhase) * 0.1f) + 1.0f;
+ this->balloonScale.z = cosFactor;
+ this->balloonScale.y = cosFactor;
+ sinFactor = (Math_SinS(this->skyFloatPhase) * 0.1f) + 1.0f;
+ this->balloonScale.x = SQ(sinFactor);
+ this->picto.actor.world.pos.y *= 500 - this->timer;
+ this->picto.actor.world.pos.y +=
+ this->timer * (this->picto.actor.home.pos.y + (50.0f * Math_SinS(this->skyFloatPhase)));
+ this->picto.actor.world.pos.y *= 0.002f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A635F0.s")
+ if (this->timer < 100) {
+ this->timer++;
+ } else {
+ this->timer += 10;
+ }
+ this->skyFloatPhase += 0x320;
+ } else {
+ EnBal_SetupFloatIdle(this);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A636AC.s")
+void EnBal_SetupGroundIdle(EnBal* this) {
+ if (this->actionFunc == EnBal_Fall) {
+ this->forceEyesShut = false;
+ this->eyeTexIndex = TINGLE_EYETEX_OPEN;
+ this->idleAnimStage = TINGLE_IDLESTAGE_WAIT;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_IDLE);
+ } else if (Rand_Next() & 1) {
+ this->idleAnimStage = TINGLE_IDLESTAGE_ACTIVITY;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_TALK);
+ } else {
+ this->idleAnimStage = TINGLE_IDLESTAGE_ACTIVITY;
+ this->forceEyesShut = true;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_SPIN);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A637FC.s")
+ this->watchTarget = TINGLE_WATCH_TARGET_NONE;
+ if (this->locationMapId == TINGLE_MAP_CLOCK_TOWN) {
+ if (!gSaveContext.save.saveInfo.playerData.isMagicAcquired) {
+ // Effectively turn off reinflation timer by setting above 300
+ this->timer = 301;
+ } else if (this->inflateEarly == true) {
+ // If this field is set, reduce time to balloon reinflation.
+ this->inflateEarly = false;
+ this->timer = 290;
+ } else {
+ this->timer = 0;
+ }
+ } else {
+ this->timer = 0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A63884.s")
+ this->actionFunc = EnBal_GroundIdle;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/EnBal_Update.s")
+void EnBal_GroundIdle(EnBal* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A63A10.s")
+ if (this->timer == 300) {
+ if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
+ EnBal_SetupInflateBalloon(this);
+ return;
+ }
+ } else if (this->timer < 300) {
+ this->timer++;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/func_80A63B94.s")
+ if (Actor_ProcessTalkRequest(&this->picto.actor, &play->state)) {
+ this->forceEyesShut = false;
+ this->eyeTexIndex = TINGLE_EYETEX_OPEN;
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_TINGLE)) {
+ if (GET_PLAYER_FORM == EnBal_GetRecognizedPlayerForm()) {
+ this->watchTarget = TINGLE_WATCH_TARGET_PLAYER;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_TALK);
+ Message_StartTextbox(play, 0x1D0C, &this->picto.actor);
+ this->textId = 0x1D0C;
+ } else {
+ this->watchTarget = TINGLE_WATCH_TARGET_PLAYER;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_TALK);
+ Message_StartTextbox(play, 0x1D05, &this->picto.actor);
+ this->textId = 0x1D05;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bal/EnBal_Draw.s")
+ if (!gSaveContext.save.saveInfo.playerData.isMagicAcquired) {
+ // Reinflation should be unreachable while player does not have magic
+ this->inflateEarly = true;
+ }
+ } else {
+ this->watchTarget = TINGLE_WATCH_TARGET_FAIRY;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_LAND);
+ Message_StartTextbox(play, 0x1D00, &this->picto.actor);
+ this->textId = 0x1D00;
+
+ if (this->locationMapId == TINGLE_MAP_CLOCK_TOWN) {
+ this->inflateEarly = true;
+ }
+ }
+ EnBal_SetupTalk(this);
+ } else {
+ if ((this->picto.actor.xzDistToPlayer < 100.0f) && (this->actionFunc != EnBal_InflateBalloon)) {
+ if (this->idleAnimStage != TINGLE_IDLESTAGE_WAIT) {
+ this->watchTarget = TINGLE_WATCH_TARGET_PLAYER;
+ } else {
+ this->watchTarget = TINGLE_WATCH_TARGET_NONE;
+ }
+
+ if (!(player->stateFlags1 & PLAYER_STATE1_800000) && !(player->actor.bgCheckFlags & BGCHECKFLAG_WATER) &&
+ ((this->timer < 300) || (this->timer == 301))) {
+ Actor_OfferTalk(&this->picto.actor, play, 100.0f);
+ }
+ } else {
+ this->watchTarget = TINGLE_WATCH_TARGET_NONE;
+ }
+
+ if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
+ if (this->idleAnimStage == TINGLE_IDLESTAGE_PREP_WAIT) {
+ this->forceEyesShut = false;
+ this->eyeTexIndex = TINGLE_EYETEX_OPEN;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_IDLE);
+ this->idleAnimStage++;
+ } else if (this->idleAnimStage == TINGLE_IDLESTAGE_WAIT) {
+ if (Rand_Next() & 1) {
+ this->forceEyesShut = false;
+ this->eyeTexIndex = TINGLE_EYETEX_OPEN;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_TALK);
+ } else {
+ this->forceEyesShut = true;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_SPIN);
+ }
+ this->idleAnimStage = TINGLE_IDLESTAGE_ACTIVITY;
+ } else {
+ this->idleAnimStage++;
+ }
+ } else if ((this->idleAnimStage == TINGLE_IDLESTAGE_WAIT) && (Animation_OnFrame(&this->skelAnime, 20.0f))) {
+ this->forceEyesShut = true;
+ }
+ }
+}
+
+void EnBal_SetupTalk(EnBal* this) {
+ this->timer = 0;
+ this->actionFunc = EnBal_Talk;
+}
+
+void EnBal_Talk(EnBal* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+
+ player->stateFlags2 |= PLAYER_STATE2_100000;
+ this->isTalking = false;
+
+ switch (Message_GetState(&play->msgCtx)) {
+ case TEXT_STATE_NONE:
+ case TEXT_STATE_1:
+ break;
+
+ case TEXT_STATE_CLOSING:
+ break;
+
+ case TEXT_STATE_3:
+ if (this->textId != 0x1D10) {
+ this->isTalking = true;
+ }
+ break;
+
+ case TEXT_STATE_CHOICE:
+ EnBal_TryPurchaseMap(this, play);
+ break;
+
+ case TEXT_STATE_5:
+ EnBal_HandleConversation(this, play);
+ break;
+
+ case TEXT_STATE_DONE:
+ if (Message_ShouldAdvance(play)) {
+ EnBal_SetupGroundIdle(this);
+ }
+ break;
+
+ case TEXT_STATE_10:
+ if (Message_ShouldAdvance(play) && (this->textId == 0x1D08)) {
+ this->forceEyesShut = false;
+ this->eyeTexIndex = TINGLE_EYETEX_OPEN;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ if (this->textId == 0x1D07) {
+ if ((this->skelAnime.curFrame > 29.0f) && (this->skelAnime.curFrame < 33.0f)) {
+ if (Animation_OnFrame(&this->skelAnime, 30.0f)) {
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EV_CHINCLE_SPELL_EFFECT);
+ }
+ EnBal_ThrowMagicSparkles(this, play);
+ }
+ if (Animation_OnFrame(&this->skelAnime, 35.0f)) {
+ this->forceEyesShut = false;
+ this->eyeTexIndex = TINGLE_EYETEX_OPEN;
+ }
+ }
+}
+
+void EnBal_UpdateShadow(EnBal* this) {
+ f32 homeY;
+ f32 worldY;
+ f32 shadowScale;
+
+ if ((this->actionFunc != EnBal_GroundIdle) && (this->actionFunc != EnBal_FloatIdle)) {
+ homeY = this->picto.actor.home.pos.y - this->picto.actor.floorHeight;
+ worldY = this->picto.actor.world.pos.y - this->picto.actor.floorHeight;
+ shadowScale = (homeY - worldY) / homeY;
+ shadowScale = CLAMP_MIN(shadowScale, 0.0f);
+ this->picto.actor.shape.shadowScale = 12.0f * shadowScale;
+ this->picto.actor.shape.shadowAlpha = 255.0f * shadowScale;
+ }
+}
+
+void EnBal_SetRecognizedPlayerForm(void) {
+ switch (gSaveContext.save.playerForm) {
+ case PLAYER_FORM_HUMAN:
+ SET_WEEKEVENTREG(WEEKEVENTREG_TINGLE_RECOGNIZED_PLAYER_FORM_LOW_BIT);
+ SET_WEEKEVENTREG(WEEKEVENTREG_TINGLE_RECOGNIZED_PLAYER_FORM_HIGH_BIT);
+ break;
+
+ case PLAYER_FORM_DEKU:
+ SET_WEEKEVENTREG(WEEKEVENTREG_TINGLE_RECOGNIZED_PLAYER_FORM_LOW_BIT);
+ break;
+
+ case PLAYER_FORM_GORON:
+ SET_WEEKEVENTREG(WEEKEVENTREG_TINGLE_RECOGNIZED_PLAYER_FORM_HIGH_BIT);
+ break;
+
+ case PLAYER_FORM_ZORA:
+ break;
+
+ default:
+ break;
+ }
+}
+
+PlayerTransformation EnBal_GetRecognizedPlayerForm(void) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TINGLE_RECOGNIZED_PLAYER_FORM_LOW_BIT)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TINGLE_RECOGNIZED_PLAYER_FORM_HIGH_BIT)) {
+ return PLAYER_FORM_HUMAN;
+ }
+
+ return PLAYER_FORM_DEKU;
+ }
+
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TINGLE_RECOGNIZED_PLAYER_FORM_HIGH_BIT)) {
+ return PLAYER_FORM_GORON;
+ }
+
+ return PLAYER_FORM_ZORA;
+}
+
+void EnBal_ThrowMagicSparkles(EnBal* this, PlayState* play) {
+ static Vec3f sSparkleVelocity = { 0.0f, 0.0f, 0.0f };
+ static Vec3f sSparkleAccel = { 0.0f, 0.0f, 0.0f };
+ static Color_RGBA8 sSparklePrimColor = { 255, 255, 255, 255 };
+ static Color_RGBA8 sSparkleEnvColor = { 100, 200, 0, 255 };
+ s32 i;
+ Vec3f pos = this->picto.actor.world.pos;
+
+ pos.y += 30.0f;
+ pos.x += 20.0f * Math_SinS(this->picto.actor.shape.rot.y);
+ pos.z += 20.0f * Math_CosS(this->picto.actor.shape.rot.y);
+
+ sSparkleAccel.y = -0.4f;
+ sSparkleVelocity.y = 5.5f;
+
+ for (i = 0; i < 20; i++) {
+ sSparkleVelocity.x = Rand_Centered() * 3.0f;
+ sSparkleVelocity.z = Rand_Centered() * 3.0f;
+ EffectSsKirakira_SpawnDispersed(play, &pos, &sSparkleVelocity, &sSparkleAccel, &sSparklePrimColor,
+ &sSparkleEnvColor, 2500, 40);
+ }
+}
+
+void EnBal_EmitDustPuff(EnBal* this, PlayState* play) {
+ static Vec3f sDustVelocity = { 0.0f, 0.0f, 0.0f };
+ static Vec3f sDustAccel = { 0.0f, 0.0f, 0.0f };
+ static Color_RGBA8 sDustPrimColor = { 255, 255, 255, 255 };
+ static Color_RGBA8 sDustEnvColor = { 198, 198, 198, 255 };
+ Vec3f pos = this->picto.actor.world.pos;
+
+ pos.y += 40.0f;
+ sDustVelocity.x = Rand_CenteredFloat(10.0f);
+ sDustVelocity.z = Rand_CenteredFloat(10.0f);
+ sDustVelocity.y = Rand_ZeroFloat(5.0f);
+ func_800B0EB0(play, &pos, &sDustVelocity, &sDustAccel, &sDustPrimColor, &sDustEnvColor, 150, 40, 15);
+}
+
+static s32 sGetItemPending = false;
+static Vec3f sFocusPosMultiplier = { 1000.0f, 0.0f, 0.0f };
+static TexturePtr sEyeTextures[] = { gTingleEyeOpenTex, gTingleEyeClosedTex };
+
+s32 EnBal_CheckIfMapUnlocked(EnBal* this, PlayState* play) {
+ this->purchaseMapId = sBuyMapOptions[this->locationMapId][play->msgCtx.choiceIndex];
+ switch (this->purchaseMapId) {
+ case TINGLE_MAP_CLOCK_TOWN:
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TINGLE_MAP_BOUGHT_CLOCK_TOWN)) {
+ return true;
+ }
+ break;
+
+ case TINGLE_MAP_WOODFALL:
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TINGLE_MAP_BOUGHT_WOODFALL)) {
+ return true;
+ }
+ break;
+
+ case TINGLE_MAP_SNOWHEAD:
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TINGLE_MAP_BOUGHT_SNOWHEAD)) {
+ return true;
+ }
+ break;
+
+ case TINGLE_MAP_ROMANI_RANCH:
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TINGLE_MAP_BOUGHT_ROMANI_RANCH)) {
+ return true;
+ }
+ break;
+
+ case TINGLE_MAP_GREAT_BAY:
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TINGLE_MAP_BOUGHT_GREAT_BAY)) {
+ return true;
+ }
+ break;
+
+ case TINGLE_MAP_STONE_TOWER:
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TINGLE_MAP_BOUGHT_STONE_TOWER)) {
+ return true;
+ }
+ break;
+
+ default:
+ break;
+ }
+ return false;
+}
+
+void EnBal_UnlockSelectedAreaMap(EnBal* this) {
+ Inventory_SetWorldMapCloudVisibility(this->purchaseMapId);
+ switch (this->purchaseMapId) {
+ case TINGLE_MAP_CLOCK_TOWN:
+ SET_WEEKEVENTREG(WEEKEVENTREG_TINGLE_MAP_BOUGHT_CLOCK_TOWN);
+ break;
+
+ case TINGLE_MAP_WOODFALL:
+ SET_WEEKEVENTREG(WEEKEVENTREG_TINGLE_MAP_BOUGHT_WOODFALL);
+ break;
+
+ case TINGLE_MAP_SNOWHEAD:
+ SET_WEEKEVENTREG(WEEKEVENTREG_TINGLE_MAP_BOUGHT_SNOWHEAD);
+ break;
+
+ case TINGLE_MAP_ROMANI_RANCH:
+ SET_WEEKEVENTREG(WEEKEVENTREG_TINGLE_MAP_BOUGHT_ROMANI_RANCH);
+ break;
+
+ case TINGLE_MAP_GREAT_BAY:
+ SET_WEEKEVENTREG(WEEKEVENTREG_TINGLE_MAP_BOUGHT_GREAT_BAY);
+ break;
+
+ case TINGLE_MAP_STONE_TOWER:
+ SET_WEEKEVENTREG(WEEKEVENTREG_TINGLE_MAP_BOUGHT_STONE_TOWER);
+ break;
+
+ default:
+ break;
+ }
+}
+
+void EnBal_TryPurchaseMap(EnBal* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+ s32 price;
+
+ if (Message_ShouldAdvance(play)) {
+ if (play->msgCtx.choiceIndex != TINGLE_MAPCHOICE_CANCEL) {
+ // Get price depending on which map player wants to buy
+ if (play->msgCtx.choiceIndex == TINGLE_MAPCHOICE_PROXIMAL) {
+ price = play->msgCtx.unk1206C;
+ } else {
+ price = play->msgCtx.unk12070;
+ }
+
+ if (gSaveContext.save.saveInfo.playerData.rupees < price) {
+ // Can't buy map because player doesn't have the money
+ Audio_PlaySfx(NA_SE_SY_ERROR);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_TALK);
+ Message_StartTextbox(play, 0x1D0A, &this->picto.actor);
+ this->textId = 0x1D0A;
+ } else if (EnBal_CheckIfMapUnlocked(this, play)) {
+ // Can't buy map because player already has it
+ Audio_PlaySfx(NA_SE_SY_ERROR);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_TALK);
+ Message_StartTextbox(play, 0x1D09, &this->picto.actor);
+ this->textId = 0x1D09;
+ } else {
+ // Proceed with map purchase
+ Audio_PlaySfx_MessageDecide();
+ Rupees_ChangeBy(-price);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_MAGIC_REVERSE);
+ this->forceEyesShut = true;
+ Message_StartTextbox(play, 0x1D0B, &this->picto.actor);
+ this->textId = 0x1D0B;
+ EnBal_UnlockSelectedAreaMap(this);
+ player->stateFlags1 |= PLAYER_STATE1_20;
+ EnBal_SetupOfferGetItem(this);
+ }
+ } else {
+ // Cancel
+ Audio_PlaySfx_MessageCancel();
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_TALK);
+ Message_StartTextbox(play, 0x1D06, &this->picto.actor);
+ this->textId = 0x1D06;
+ }
+ }
+}
+
+void EnBal_HandleConversation(EnBal* this, PlayState* play) {
+ if (((this->textId != 0x1D07) || Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) &&
+ (Message_ShouldAdvance(play))) {
+ switch (this->textId) {
+ case 0x1D00:
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_TALK);
+ Message_StartTextbox(play, 0x1D01, &this->picto.actor);
+ this->textId = 0x1D01;
+ break;
+
+ case 0x1D01:
+ this->watchTarget = TINGLE_WATCH_TARGET_PLAYER;
+ Message_StartTextbox(play, 0x1D02, &this->picto.actor);
+ this->textId = 0x1D02;
+ break;
+
+ case 0x1D02:
+ this->forceEyesShut = true;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_HAPPY_DANCE_LOOP);
+ Message_StartTextbox(play, 0x1D03, &this->picto.actor);
+ this->textId = 0x1D03;
+ break;
+
+ case 0x1D03:
+ case 0x1D0D:
+ this->forceEyesShut = false;
+ this->eyeTexIndex = TINGLE_EYETEX_OPEN;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_TALK);
+ Message_StartTextbox(play, 0x1D04, &this->picto.actor);
+ this->textId = 0x1D04;
+ break;
+
+ case 0x1D04:
+ this->watchTarget = TINGLE_WATCH_TARGET_PLAYER;
+ switch (this->locationMapId) {
+ case TINGLE_MAP_CLOCK_TOWN:
+ Message_StartTextbox(play, 0x1D11, &this->picto.actor);
+ this->textId = 0x1D11;
+ break;
+
+ case TINGLE_MAP_WOODFALL:
+ Message_StartTextbox(play, 0x1D12, &this->picto.actor);
+ this->textId = 0x1D12;
+ break;
+
+ case TINGLE_MAP_SNOWHEAD:
+ Message_StartTextbox(play, 0x1D13, &this->picto.actor);
+ this->textId = 0x1D13;
+ break;
+
+ case TINGLE_MAP_ROMANI_RANCH:
+ Message_StartTextbox(play, 0x1D14, &this->picto.actor);
+ this->textId = 0x1D14;
+ break;
+
+ case TINGLE_MAP_GREAT_BAY:
+ Message_StartTextbox(play, 0x1D15, &this->picto.actor);
+ this->textId = 0x1D15;
+ break;
+
+ case TINGLE_MAP_STONE_TOWER:
+ Message_StartTextbox(play, 0x1D16, &this->picto.actor);
+ this->textId = 0x1D16;
+ break;
+
+ default:
+ Message_StartTextbox(play, 0x1D11, &this->picto.actor);
+ this->textId = 0x1D11;
+ break;
+ }
+ break;
+
+ case 0x1D05:
+ case 0x1D0C:
+ this->watchTarget = TINGLE_WATCH_TARGET_FAIRY;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_HAPPY_DANCE_LOOP);
+ Message_StartTextbox(play, 0x1D0D, &this->picto.actor);
+ this->textId = 0x1D0D;
+ break;
+
+ case 0x1D06:
+ case 0x1D17:
+ this->watchTarget = TINGLE_WATCH_TARGET_NONE;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_MAGIC);
+ this->forceEyesShut = true;
+ Message_StartTextbox(play, 0x1D07, &this->picto.actor);
+ this->textId = 0x1D07;
+ break;
+
+ case 0x1D07:
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_TINGLE)) {
+ Message_CloseTextbox(play);
+ EnBal_SetupGroundIdle(this);
+ } else {
+ this->forceEyesShut = true;
+ this->watchTarget = TINGLE_WATCH_TARGET_PLAYER;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_TALK);
+ Message_StartTextbox(play, 0x1D08, &this->picto.actor);
+ this->textId = 0x1D08;
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_TINGLE);
+ EnBal_SetRecognizedPlayerForm();
+ }
+ break;
+
+ case 0x1D08:
+ case 0x1D09:
+ case 0x1D0A:
+ Message_CloseTextbox(play);
+ EnBal_SetupGroundIdle(this);
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+void EnBal_SetupOfferGetItem(EnBal* this) {
+ this->actionFunc = EnBal_OfferGetItem;
+}
+
+void EnBal_OfferGetItem(EnBal* this, PlayState* play) {
+ GetItemId mapGetItemId;
+
+ if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
+ Message_CloseTextbox(play);
+ sGetItemPending = true;
+ }
+
+ if ((sGetItemPending == true) && Actor_HasParent(&this->picto.actor, play)) {
+ this->picto.actor.parent = NULL;
+ EnBal_SetupThankYou(this);
+ sGetItemPending = false;
+ } else {
+ switch (this->purchaseMapId) {
+ case TINGLE_MAP_CLOCK_TOWN:
+ mapGetItemId = GI_TINGLE_MAP_CLOCK_TOWN;
+ break;
+
+ case TINGLE_MAP_WOODFALL:
+ mapGetItemId = GI_TINGLE_MAP_WOODFALL;
+ break;
+
+ case TINGLE_MAP_SNOWHEAD:
+ mapGetItemId = GI_TINGLE_MAP_SNOWHEAD;
+ break;
+
+ case TINGLE_MAP_ROMANI_RANCH:
+ mapGetItemId = GI_TINGLE_MAP_ROMANI_RANCH;
+ break;
+
+ case TINGLE_MAP_GREAT_BAY:
+ mapGetItemId = GI_TINGLE_MAP_GREAT_BAY;
+ break;
+
+ case TINGLE_MAP_STONE_TOWER:
+ mapGetItemId = GI_TINGLE_MAP_STONE_TOWER;
+ break;
+
+ default:
+ mapGetItemId = GI_TINGLE_MAP_CLOCK_TOWN;
+ break;
+ }
+ Actor_OfferGetItem(&this->picto.actor, play, mapGetItemId, 500.0f, 100.0f);
+ }
+}
+
+void EnBal_SetupThankYou(EnBal* this) {
+ this->actionFunc = EnBal_ThankYou;
+}
+
+void EnBal_ThankYou(EnBal* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+
+ if (Actor_ProcessTalkRequest(&this->picto.actor, &play->state)) {
+ player->stateFlags1 &= ~PLAYER_STATE1_20;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, TINGLE_ANIM_TWIST);
+ this->forceEyesShut = false;
+ this->eyeTexIndex = TINGLE_EYETEX_OPEN;
+ Message_StartTextbox(play, 0x1D17, &this->picto.actor);
+ this->textId = 0x1D17;
+ this->picto.actor.flags &= ~ACTOR_FLAG_10000;
+ EnBal_SetupTalk(this);
+ } else {
+ Actor_OfferTalkExchangeEquiCylinder(&this->picto.actor, play, 200.0f, PLAYER_IA_MINUS1);
+ }
+}
+
+void EnBal_UpdateHead(EnBal* this, PlayState* play) {
+ Player* player;
+
+ if (this->watchTarget == TINGLE_WATCH_TARGET_PLAYER) {
+ if ((this->skelAnime.animation != &gTingleIdleAnim) && (this->skelAnime.animation != &gTingleSpinAnim)) {
+ Actor_TrackPlayer(play, &this->picto.actor, &this->headRot, &this->torsoRot, this->picto.actor.focus.pos);
+ } else {
+ Actor_TrackNone(&this->headRot, &this->torsoRot);
+ }
+ } else if (this->watchTarget == TINGLE_WATCH_TARGET_FAIRY) {
+ Vec3f tatlPos;
+
+ player = GET_PLAYER(play);
+ if (player->tatlActor != NULL) {
+ tatlPos = player->tatlActor->world.pos;
+ Actor_TrackPoint(&this->picto.actor, &tatlPos, &this->headRot, &this->torsoRot);
+ }
+ } else {
+ Actor_TrackNone(&this->headRot, &this->torsoRot);
+ }
+
+ if (this->forceEyesShut == true) {
+ this->eyeTexIndex = TINGLE_EYETEX_CLOSED;
+ } else if (this->eyeTimer > 3) {
+ this->eyeTimer--;
+ } else if (this->eyeTimer != 0) {
+ this->eyeTexIndex = TINGLE_EYETEX_CLOSED;
+ this->eyeTimer--;
+ } else {
+ this->eyeTexIndex = TINGLE_EYETEX_OPEN;
+ this->eyeTimer = 60;
+ }
+}
+
+void EnBal_UpdateCollision(EnBal* this, PlayState* play) {
+ if ((this->actionFunc == EnBal_FloatIdle) || ((this->actionFunc == EnBal_FloatUp) && (this->timer > 50))) {
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
+ }
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
+}
+
+void EnBal_TryBalloonPopped(EnBal* this, PlayState* play) {
+ if (this->collider.base.acFlags & AC_HIT) {
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->picto.actor.world.pos.x,
+ this->picto.actor.world.pos.y + 100.0f, this->picto.actor.world.pos.z, 0xFF, 0xFF, 0xC8,
+ CLEAR_TAG_PARAMS(CLEAR_TAG_POP));
+ this->collider.base.acFlags &= ~AC_HIT;
+ EnBal_SetupPopBalloon(this);
+ }
+}
+
+void EnBal_Update(Actor* thisx, PlayState* play) {
+ EnBal* this = THIS;
+
+ this->actionFunc(this, play);
+ EnBal_TryBalloonPopped(this, play);
+ EnBal_UpdateCollision(this, play);
+ SkelAnime_Update(&this->skelAnime);
+ if (this->actionFunc != EnBal_FloatIdle) {
+ Actor_MoveWithGravity(&this->picto.actor);
+ Actor_UpdateBgCheckInfo(play, &this->picto.actor, 32.0f, 30.0f, 60.0f,
+ UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4);
+ }
+ EnBal_UpdateHead(this, play);
+ if ((this->actionFunc == EnBal_Talk) && (this->textId != 0x1D10)) {
+ Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->picto.actor.yawTowardsPlayer, 5, 0x1000, 0x100);
+ this->picto.actor.world.rot.y = this->picto.actor.shape.rot.y;
+ }
+ EnBal_UpdateShadow(this);
+}
+
+s32 EnBal_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
+ EnBal* this = THIS;
+ Vec3s balloonRot;
+
+ if (limbIndex == TINGLE_LIMB_BALLOON) {
+ if ((this->balloonAction == TINGLE_BALLOON_ACTION_NONE) ||
+ (this->balloonAction == TINGLE_BALLOON_ACTION_INFLATE) ||
+ (this->balloonAction == TINGLE_BALLOON_ACTION_RISE)) {
+ balloonRot.x = Math_SinS(this->timer) * 0xE38;
+ balloonRot.z = Math_CosS(this->timer) * 0xE38;
+ Matrix_RotateZYX(balloonRot.x, 0, balloonRot.z, MTXMODE_APPLY);
+ Matrix_Scale(this->balloonScale.x, this->balloonScale.y, this->balloonScale.z, MTXMODE_APPLY);
+ Matrix_RotateZS(-balloonRot.z, MTXMODE_APPLY);
+ Matrix_RotateXS(-balloonRot.x, MTXMODE_APPLY);
+ } else {
+ *dList = NULL;
+ }
+ }
+
+ if (limbIndex == TINGLE_LIMB_HEAD) {
+ rot->x += this->headRot.y;
+ rot->y -= this->headRot.x;
+ if ((this->isTalking == true) && ((play->state.frames & 2) == 0)) {
+ Matrix_Translate(20.0f, 0.0f, 0.0f, MTXMODE_APPLY);
+ }
+ }
+
+ return false;
+}
+
+void EnBal_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
+ EnBal* this = THIS;
+
+ Collider_UpdateSpheres(limbIndex, &this->collider);
+ if (limbIndex == TINGLE_LIMB_HEAD) {
+ Matrix_MultVec3f(&sFocusPosMultiplier, &this->picto.actor.focus.pos);
+ }
+}
+
+void EnBal_Draw(Actor* thisx, PlayState* play) {
+ EnBal* this = THIS;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ gSPSegment(POLY_OPA_DISP++, 8, SEGMENTED_TO_VIRTUAL(sEyeTextures[this->eyeTexIndex]));
+ SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
+ EnBal_OverrideLimbDraw, EnBal_PostLimbDraw, &this->picto.actor);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_En_Bal/z_en_bal.h b/src/overlays/actors/ovl_En_Bal/z_en_bal.h
index a64ef195d..b8c6a9f49 100644
--- a/src/overlays/actors/ovl_En_Bal/z_en_bal.h
+++ b/src/overlays/actors/ovl_En_Bal/z_en_bal.h
@@ -3,6 +3,9 @@
#include "global.h"
#include "z64snap.h"
+#include "objects/object_bal/object_bal.h"
+
+#define TINGLE_GET_MAP_ID(thisx) ((thisx)->params & 0xFF)
struct EnBal;
@@ -10,9 +13,30 @@ typedef void (*EnBalActionFunc)(struct EnBal*, PlayState*);
typedef struct EnBal {
/* 0x000 */ PictoActor picto;
- /* 0x148 */ char unk_148[0x44];
+ /* 0x148 */ SkelAnime skelAnime;
/* 0x18C */ EnBalActionFunc actionFunc;
- /* 0x190 */ char unk_190[0x224];
-} EnBal; // size = 0x3B4
+ /* 0x190 */ ColliderJntSph collider;
+ /* 0x1B0 */ ColliderJntSphElement colliderElements[1];
+ /* 0x1F0 */ Vec3f balloonScale;
+ /* 0x1FC */ s32 eyeTexIndex;
+ /* 0x200 */ Vec3s jointTable[TINGLE_LIMB_MAX];
+ /* 0x2C6 */ Vec3s morphTable[TINGLE_LIMB_MAX];
+ /* 0x38C */ Vec3s headRot;
+ /* 0x392 */ Vec3s torsoRot;
+ /* 0x398 */ s16 eyeTimer;
+ /* 0x39A */ s16 forceEyesShut;
+ /* 0x39C */ s16 watchTarget;
+ /* 0x39E */ s16 skyFloatPhase;
+ /* 0x3A0 */ s16 textId;
+ /* 0x3A2 */ UNK_TYPE1 unk3A2[0x2];
+ /* 0x3A4 */ s16 balloonAction;
+ /* 0x3A6 */ s16 idleAnimStage;
+ /* 0x3A8 */ s16 timer;
+ /* 0x3AA */ UNK_TYPE1 unk3AA[0x2];
+ /* 0x3AC */ s16 purchaseMapId;
+ /* 0x3AE */ s16 locationMapId;
+ /* 0x3B0 */ s16 inflateEarly;
+ /* 0x3B2 */ u8 isTalking;
+} EnBal; /* size = 0x3B4 */
#endif // Z_EN_BAL_H
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 cee109c70..e57ec81cc 100644
--- a/src/overlays/actors/ovl_En_Bat/z_en_bat.c
+++ b/src/overlays/actors/ovl_En_Bat/z_en_bat.c
@@ -5,9 +5,10 @@
*/
#include "z_en_bat.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.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_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_4000)
#define THIS ((EnBat*)thisx)
@@ -135,7 +136,7 @@ void EnBat_Init(Actor* thisx, PlayState* play) {
this->animationFrame = Rand_ZeroOne() * 9.0f;
this->paramFlags = BAD_BAT_GET_PARAMFLAGS(thisx);
- this->switchFlag = BAD_BAT_GET_SWITCHFLAG(thisx);
+ this->switchFlag = BAD_BAT_GET_SWITCH_FLAG(thisx);
thisx->params = BAD_BAT_GET_TYPE(thisx);
thisx->depthInWater = BGCHECK_Y_MIN;
@@ -161,11 +162,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->unk20,
- 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)--;
}
}
@@ -193,7 +193,7 @@ void EnBat_StepAnimation(EnBat* this, s32 frameStep) {
this->animationFrame -= ARRAY_COUNT(sWingsDLs);
}
if ((prevFrame < BAD_BAT_FLAP_FRAME) && (this->animationFrame >= BAD_BAT_FLAP_FRAME)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FFLY_FLY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FFLY_FLY);
}
}
@@ -203,7 +203,7 @@ void EnBat_SetupPerch(EnBat* this) {
this->collider.dim.worldSphere.center.x = this->actor.focus.pos.x;
this->collider.dim.worldSphere.center.y = this->actor.focus.pos.y;
this->collider.dim.worldSphere.center.z = this->actor.focus.pos.z;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = EnBat_Perch;
}
@@ -214,7 +214,7 @@ void EnBat_Perch(EnBat* this, PlayState* play) {
void EnBat_SetupFlyIdle(EnBat* this) {
this->timer = 100;
this->collider.base.acFlags |= AC_ON;
- this->actor.speedXZ = 3.5f;
+ this->actor.speed = 3.5f;
this->actionFunc = EnBat_FlyIdle;
}
@@ -225,12 +225,12 @@ void EnBat_FlyIdle(EnBat* this, PlayState* play) {
finishedRotStep = Math_ScaledStepToS(&this->actor.shape.rot.y, this->yawTarget, 0x300);
- if (this->actor.bgCheckFlags & 8) {
- this->actor.bgCheckFlags &= ~8;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_WALL;
this->yawTarget = this->actor.wallYaw;
} else if (Math3D_XZDistanceSquared(this->actor.world.pos.x, this->actor.world.pos.z, this->actor.home.pos.x,
this->actor.home.pos.z) > SQ(300.0f)) {
- this->yawTarget = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ this->yawTarget = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
} else if (finishedRotStep && (Rand_ZeroOne() < 0.015f)) {
this->yawTarget =
this->actor.shape.rot.y + (((s32)(0x1000 * Rand_ZeroOne()) + 0x1000) * ((Rand_ZeroOne() < 0.5f) ? -1 : 1));
@@ -238,7 +238,7 @@ void EnBat_FlyIdle(EnBat* this, PlayState* play) {
finishedRotStep = Math_ScaledStepToS(&this->actor.shape.rot.x, this->pitchTarget, 0x100);
- if ((this->actor.bgCheckFlags & 1) || (this->actor.depthInWater > -40.0f)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (this->actor.depthInWater > -40.0f)) {
this->pitchTarget = -0x1000;
} else if (this->actor.world.pos.y < (this->actor.home.pos.y - 100.0f)) {
this->pitchTarget = -((s32)(0x800 * Rand_ZeroOne()) + 0x800);
@@ -262,7 +262,7 @@ void EnBat_FlyIdle(EnBat* this, PlayState* play) {
void EnBat_SetupDiveAttack(EnBat* this) {
this->collider.base.atFlags |= AT_ON;
this->timer = 300;
- this->actor.speedXZ = 4.0f;
+ this->actor.speed = 4.0f;
sNumberAttacking++;
this->actionFunc = EnBat_DiveAttack;
}
@@ -282,7 +282,7 @@ void EnBat_DiveAttack(EnBat* this, PlayState* play) {
preyPos.y = player->actor.world.pos.y + 20.0f;
preyPos.z = player->actor.world.pos.z;
- pitchTarget = Actor_PitchToPoint(&this->actor, &preyPos);
+ pitchTarget = Actor_WorldPitchTowardPoint(&this->actor, &preyPos);
pitchTarget = CLAMP(pitchTarget, -0x3000, 0x3000);
Math_SmoothStepToS(&this->actor.shape.rot.x, pitchTarget, 2, 0x400, 0x40);
} else {
@@ -295,32 +295,32 @@ void EnBat_DiveAttack(EnBat* this, PlayState* play) {
this->timer--;
if ((this->timer == 0) || (this->collider.base.atFlags & AT_HIT) || (Player_GetMask(play) == PLAYER_MASK_STONE) ||
- (this->actor.bgCheckFlags & 1) || (player->stateFlags1 & PLAYER_STATE1_800000) ||
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (player->stateFlags1 & PLAYER_STATE1_800000) ||
(this->actor.depthInWater > -40.0f)) {
if (this->collider.base.atFlags & AT_HIT) {
this->collider.base.atFlags &= ~AT_HIT;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FFLY_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FFLY_ATTACK);
}
this->collider.base.atFlags &= ~AT_ON;
sNumberAttacking--;
EnBat_SetupFlyIdle(this);
- } else if ((this->actor.bgCheckFlags & 8) &&
+ } else if ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) &&
(ABS_ALT(BINANG_SUB(this->actor.wallYaw, this->actor.yawTowardsPlayer)) > 0x6800)) {
sNumberAttacking--;
this->collider.base.atFlags &= ~AT_ON;
- this->actor.bgCheckFlags &= ~8;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_WALL;
this->yawTarget = this->actor.wallYaw;
EnBat_SetupFlyIdle(this);
}
}
void EnBat_SetupDie(EnBat* this, PlayState* play) {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
Enemy_StartFinishingBlow(play, &this->actor);
- this->actor.speedXZ *= Math_CosS(this->actor.world.rot.x);
- this->actor.bgCheckFlags &= ~1;
+ this->actor.speed *= Math_CosS(this->actor.world.rot.x);
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
this->actor.velocity.y = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FFLY_DEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FFLY_DEAD);
if (this->actor.colChkInfo.damageEffect == BAD_BAT_DMGEFF_ICE) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX;
@@ -333,17 +333,17 @@ void EnBat_SetupDie(EnBat* this, PlayState* play) {
this->drawDmgEffScale = 0.45f;
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_SMALL_LIGHT_RAYS);
+ CLEAR_TAG_PARAMS(CLEAR_TAG_SMALL_LIGHT_RAYS));
} else if (this->actor.colChkInfo.damageEffect == BAD_BAT_DMGEFF_FIRE) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->drawDmgEffAlpha = 4.0f;
this->drawDmgEffScale = 0.45f;
}
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 40);
if (this->actor.flags & ACTOR_FLAG_8000) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
this->collider.base.acFlags &= ~AC_ON;
@@ -352,7 +352,7 @@ void EnBat_SetupDie(EnBat* this, PlayState* play) {
}
void EnBat_Die(EnBat* this, PlayState* play) {
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f);
+ Math_StepToF(&this->actor.speed, 0.0f, 0.5f);
this->actor.colorFilterTimer = 40;
if (!(this->actor.flags & ACTOR_FLAG_8000)) { // Carried by arrow
@@ -361,10 +361,9 @@ void EnBat_Die(EnBat* this, PlayState* play) {
this->actor.shape.rot.z += 0x1780;
}
- if ((this->actor.bgCheckFlags & 1) || (this->actor.floorHeight == BGCHECK_Y_MIN)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (this->actor.floorHeight == BGCHECK_Y_MIN)) {
if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
- Actor_SpawnIceEffects(play, &this->actor, this->bodyPartPoss, ARRAY_COUNT(this->bodyPartPoss), 2, 0.2f,
- 0.2f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, BAD_BAT_BODYPART_MAX, 2, 0.2f, 0.2f);
}
func_800B3030(play, &this->actor.world.pos, &gZeroVec3f, &gZeroVec3f, 100, 0, 0);
@@ -397,17 +396,18 @@ void EnBat_SetupStunned(EnBat* this) {
if (this->actionFunc != EnBat_Stunned) {
this->actor.shape.yOffset = 700.0f;
this->actor.velocity.y = 0.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.world.pos.y += 13.0f;
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
- Actor_SetColorFilter(&this->actor, 0, 255, 0, this->timer);
+
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, this->timer);
this->actionFunc = EnBat_Stunned;
}
void EnBat_Stunned(EnBat* this, PlayState* play) {
Math_ScaledStepToS(&this->actor.shape.rot.x, 0, 0x100);
- if ((this->actor.bgCheckFlags & 1) || (this->actor.floorHeight == BGCHECK_Y_MIN)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (this->actor.floorHeight == BGCHECK_Y_MIN)) {
if (this->timer != 0) {
this->timer--;
}
@@ -478,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);
@@ -512,7 +514,7 @@ void EnBat_Update(Actor* thisx, PlayState* play) {
this->drawDmgEffScale = (this->drawDmgEffAlpha + 1.0f) * 0.225f;
this->drawDmgEffScale = CLAMP_MAX(this->drawDmgEffScale, 0.45f);
} else if (!Math_StepToF(&this->drawDmgEffFrozenSteamScale, 0.45f, 0.45f / 40.0f)) {
- func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
}
}
@@ -527,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);
@@ -549,13 +551,12 @@ void EnBat_Draw(Actor* thisx, PlayState* play) {
? (this->animationFrame * (15 * (0x10000 / 360))) - (120 * (0x10000 / 360))
: 0;
}
- Matrix_MultZero(&this->bodyPartPoss[0]);
+ Matrix_MultZero(&this->bodyPartsPos[BAD_BAT_BODYPART_0]);
Matrix_RotateZS(rollAngle, MTXMODE_APPLY);
- Matrix_MultVecX(1700.0f, &this->bodyPartPoss[1]);
+ Matrix_MultVecX(1700.0f, &this->bodyPartsPos[BAD_BAT_BODYPART_1]);
Matrix_RotateZS(-2 * rollAngle, MTXMODE_APPLY);
- Matrix_MultVecX(-1700.0f, &this->bodyPartPoss[2]);
- Actor_DrawDamageEffects(play, &this->actor, this->bodyPartPoss, ARRAY_COUNT(this->bodyPartPoss),
- this->drawDmgEffScale, this->drawDmgEffFrozenSteamScale, this->drawDmgEffAlpha,
- this->drawDmgEffType);
+ Matrix_MultVecX(-1700.0f, &this->bodyPartsPos[BAD_BAT_BODYPART_2]);
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, BAD_BAT_BODYPART_MAX, this->drawDmgEffScale,
+ this->drawDmgEffFrozenSteamScale, this->drawDmgEffAlpha, this->drawDmgEffType);
}
}
diff --git a/src/overlays/actors/ovl_En_Bat/z_en_bat.h b/src/overlays/actors/ovl_En_Bat/z_en_bat.h
index 479cfa24d..5b552d2c1 100644
--- a/src/overlays/actors/ovl_En_Bat/z_en_bat.h
+++ b/src/overlays/actors/ovl_En_Bat/z_en_bat.h
@@ -5,7 +5,7 @@
#define BAD_BAT_GET_TYPE(thisx) (((thisx)->params >> 0) & 0x1F)
#define BAD_BAT_GET_PARAMFLAGS(thisx) (((thisx)->params >> 5) & 7)
-#define BAD_BAT_GET_SWITCHFLAG(thisx) (((thisx)->params >> 8) & 0xFF)
+#define BAD_BAT_GET_SWITCH_FLAG(thisx) (((thisx)->params >> 8) & 0xFF)
#define BAD_BAT_PARAMS(switchFlag, paramflags, type) ((type) | ((paramflags) << 5) | ((switchFlag) << 8))
//! PARAMFLAGS
@@ -23,6 +23,13 @@ struct EnBat;
typedef void (*EnBatActionFunc)(struct EnBat*, PlayState*);
+typedef enum BadBatBodyPart {
+ /* 0 */ BAD_BAT_BODYPART_0,
+ /* 1 */ BAD_BAT_BODYPART_1,
+ /* 2 */ BAD_BAT_BODYPART_2,
+ /* 3 */ BAD_BAT_BODYPART_MAX
+} BadBatBodyPart;
+
typedef struct EnBat {
/* 0x000 */ Actor actor;
/* 0x144 */ EnBatActionFunc actionFunc;
@@ -36,7 +43,7 @@ typedef struct EnBat {
/* 0x154 */ f32 drawDmgEffScale;
/* 0x158 */ f32 drawDmgEffFrozenSteamScale;
/* 0x15C */ f32 drawDmgEffAlpha;
- /* 0x160 */ Vec3f bodyPartPoss[3];
+ /* 0x160 */ Vec3f bodyPartsPos[BAD_BAT_BODYPART_MAX];
/* 0x184 */ ColliderSphere collider;
} EnBat; // size = 0x1DC
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 c5657e385..06c70aa24 100644
--- a/src/overlays/actors/ovl_En_Bb/z_en_bb.c
+++ b/src/overlays/actors/ovl_En_Bb/z_en_bb.c
@@ -5,9 +5,10 @@
*/
#include "z_en_bb.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_200)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_200)
#define THIS ((EnBb*)thisx)
@@ -32,7 +33,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 +74,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 = {
@@ -118,22 +119,6 @@ static InitChainEntry sInitChain[] = {
ICHAIN_F32(targetArrowOffset, 10, ICHAIN_STOP),
};
-/**
- * This maps a given limb based on its limbIndex to its appropriate index
- * in the bodyPartsPos/Velocity arrays. An index of -1 indicates that the
- * limb is not part of the bodyParts arrays.
- */
-static s8 sLimbIndexToBodyPartsIndex[] = {
- -1, -1, -1, -1, 0, -1, -1, -1, 1, -1, -1, -1, -1, 2, -1, 3,
-};
-
-/**
- * The last element of the bodyParts arrays is a duplicate of the cranium
- * limb, which is then offset by a certain amount. There is no display list
- * associated with this, so it is only used for effects.
- */
-static Vec3f sDuplicateCraniumBodyPartOffset = { 1000.0f, -700.0f, 0.0f };
-
void EnBb_Init(Actor* thisx, PlayState* play) {
EnBb* this = THIS;
@@ -171,14 +156,14 @@ void EnBb_Destroy(Actor* thisx, PlayState* play) {
void EnBb_CheckForWall(EnBb* this) {
s16 yawDiff;
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
yawDiff = this->actor.shape.rot.y - this->actor.wallYaw;
if (ABS_ALT(yawDiff) > 0x4000) {
this->actor.shape.rot.y = ((this->actor.wallYaw * 2) - this->actor.shape.rot.y) - 0x8000;
}
this->targetYRotation = this->actor.shape.rot.y;
- this->actor.bgCheckFlags &= ~8;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_WALL;
}
}
@@ -189,14 +174,14 @@ void EnBb_Freeze(EnBb* this) {
this->timer = 80;
this->drawDmgEffAlpha = 1.0f;
this->actor.flags &= ~ACTOR_FLAG_200;
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 80);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 80);
}
void EnBb_Thaw(EnBb* this, PlayState* play) {
if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->drawDmgEffAlpha = 0.0f;
- Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, ARRAY_COUNT(this->bodyPartsPos), 2, 0.2f, 0.15f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, BUBBLE_BODYPART_MAX, 2, 0.2f, 0.15f);
this->actor.flags |= ACTOR_FLAG_200;
}
}
@@ -216,7 +201,7 @@ void EnBb_UpdateStateForFlying(EnBb* this) {
Math_StepToF(&this->flameScaleY, 0.8f, 0.1f);
Math_StepToF(&this->flameScaleX, 1.0f, 0.1f);
EnBb_CheckForWall(this);
- Math_StepToF(&this->actor.speedXZ, this->maxSpeed, 0.5f);
+ Math_StepToF(&this->actor.speed, this->maxSpeed, 0.5f);
Math_ApproachS(&this->actor.shape.rot.y, this->targetYRotation, 5, 0x3E8);
this->actor.world.rot.y = this->actor.shape.rot.y;
}
@@ -236,10 +221,10 @@ void EnBb_SetupFlyIdle(EnBb* this) {
this->actor.gravity = 0.0f;
this->actor.velocity.y = 0.0f;
this->flyHeightMod = (Math_CosS(this->bobPhase) * 10.0f) + 30.0f;
- this->targetYRotation = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ this->targetYRotation = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
if ((this->actor.xzDistToPlayer < (this->attackRange + 120.0f)) ||
- (Actor_XZDistanceToPoint(&this->actor, &this->actor.home.pos) < 300.0f)) {
+ (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) < 300.0f)) {
this->targetYRotation += (s16)((s32)Rand_Next() >> 0x11);
}
@@ -255,9 +240,9 @@ void EnBb_FlyIdle(EnBb* this, PlayState* play) {
EnBb_UpdateStateForFlying(this);
if (Animation_OnFrame(&this->skelAnime, 5.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BUBLE_WING);
- } else if ((Animation_OnFrame(&this->skelAnime, 0.0f)) && (Rand_ZeroOne() < 0.1f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BUBLE_LAUGH);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BUBLE_WING);
+ } else if (Animation_OnFrame(&this->skelAnime, 0.0f) && (Rand_ZeroOne() < 0.1f)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BUBLE_LAUGH);
}
DECR(this->attackWaitTimer);
@@ -287,19 +272,19 @@ void EnBb_Attack(EnBb* this, PlayState* play) {
this->targetYRotation = this->actor.yawTowardsPlayer;
EnBb_UpdateStateForFlying(this);
- if ((Animation_OnFrame(&this->skelAnime, 0.0f)) || (Animation_OnFrame(&this->skelAnime, 5.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BUBLE_MOUTH);
- } else if ((Animation_OnFrame(&this->skelAnime, 2.0f)) || (Animation_OnFrame(&this->skelAnime, 7.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BUBLE_WING);
- } else if ((Animation_OnFrame(&this->skelAnime, 0.0f)) && (Rand_ZeroOne() < 0.1f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BUBLE_LAUGH);
+ if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 5.0f)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BUBLE_MOUTH);
+ } else if (Animation_OnFrame(&this->skelAnime, 2.0f) || Animation_OnFrame(&this->skelAnime, 7.0f)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BUBLE_WING);
+ } else if (Animation_OnFrame(&this->skelAnime, 0.0f) && (Rand_ZeroOne() < 0.1f)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BUBLE_LAUGH);
}
this->timer--;
if (((this->attackRange + 120.0f) < this->actor.xzDistToPlayer) || (this->timer == 0) ||
(Player_GetMask(play) == PLAYER_MASK_STONE) ||
- (Actor_XZDistanceToPoint(&this->actor, &this->actor.home.pos) > 400.0f)) {
+ (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) > 400.0f)) {
EnBb_SetupFlyIdle(this);
}
}
@@ -309,11 +294,11 @@ void EnBb_SetupDown(EnBb* this) {
this->collider.base.atFlags |= AT_ON;
this->timer = 140;
this->collider.base.acFlags |= AC_ON;
- this->actor.speedXZ = 2.0f;
+ this->actor.speed = 2.0f;
this->flameScaleY = 0.0f;
this->flameScaleX = 0.0f;
this->actor.gravity = -2.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BUBLE_DOWN);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BUBLE_DOWN);
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = EnBb_Down;
}
@@ -325,10 +310,10 @@ void EnBb_Down(EnBb* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
EnBb_CheckForWall(this);
- if (this->actor.bgCheckFlags & 1) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EYEGOLE_ATTACK);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_ATTACK);
if (this->timer == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BUBLE_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BUBLE_UP);
EnBb_SetupFlyIdle(this);
return;
}
@@ -339,14 +324,14 @@ void EnBb_Down(EnBb* this, PlayState* play) {
this->actor.velocity.y = 10.0f;
}
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
Actor_SpawnFloorDustRing(play, &this->actor, &this->actor.world.pos, 7.0f, 2, 2.0f, 0, 0, 0);
Math_ScaledStepToS(&this->actor.shape.rot.y, BINANG_ADD(this->actor.yawTowardsPlayer, 0x8000), 0xBB8);
}
this->actor.world.rot.y = this->actor.shape.rot.y;
if (Animation_OnFrame(&this->skelAnime, 5.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BUBLE_WING);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BUBLE_WING);
}
if (this->timer > 0) {
@@ -363,16 +348,16 @@ void EnBb_SetupDead(EnBb* this, PlayState* play) {
func_800BE568(&this->actor, &this->collider);
this->timer = 15;
this->actor.shape.rot.x += 0x4E20;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EN_BUBLE_DEAD);
Item_DropCollectibleRandom(play, &this->actor, &this->actor.world.pos, 0x70);
this->actor.velocity.y = 0.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->bodyPartDrawStatus = BB_BODY_PART_DRAW_STATUS_DEAD;
this->actor.gravity = -1.5f;
bodyPartVelocity = &this->bodyPartsVelocity[0];
- for (i = 0; i < ARRAY_COUNT(this->bodyPartsPos); i++, bodyPartVelocity++) {
+ for (i = 0; i < BUBBLE_BODYPART_MAX; i++, bodyPartVelocity++) {
Math_Vec3f_Diff(&this->bodyPartsPos[i], &this->actor.world.pos, &posDiff);
magnitude = Math3D_Vec3fMagnitude(&posDiff);
if (magnitude > 1.0f) {
@@ -385,7 +370,7 @@ void EnBb_SetupDead(EnBb* this, PlayState* play) {
}
this->actor.flags |= ACTOR_FLAG_10;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actionFunc = EnBb_Dead;
}
@@ -396,14 +381,14 @@ void EnBb_Dead(EnBb* this, PlayState* play) {
Math_SmoothStepToS(&this->actor.world.rot.z, 0x4000, 4, 0x1000, 0x400);
if (this->timer == 0) {
- for (i = 0; i < ARRAY_COUNT(this->bodyPartsPos); i++) {
+ for (i = 0; i < BUBBLE_BODYPART_MAX; i++) {
func_800B3030(play, &this->bodyPartsPos[i], &gZeroVec3f, &gZeroVec3f, 40, 7, 2);
SoundSource_PlaySfxAtFixedWorldPos(play, &this->bodyPartsPos[i], 11, NA_SE_EN_EXTINCT);
}
EnBb_SetupWaitForRevive(this);
} else {
- for (i = 0; i < ARRAY_COUNT(this->bodyPartsPos); i++) {
+ for (i = 0; i < BUBBLE_BODYPART_MAX; i++) {
Math_Vec3f_Sum(&this->bodyPartsPos[i], &this->bodyPartsVelocity[i], &this->bodyPartsPos[i]);
this->bodyPartsVelocity[i].y += this->actor.gravity;
}
@@ -412,22 +397,22 @@ void EnBb_Dead(EnBb* this, PlayState* play) {
void EnBb_SetupDamage(EnBb* this) {
this->collider.base.acFlags &= ~AC_ON;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BUBLE_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BUBLE_DAMAGE);
func_800BE568(&this->actor, &this->collider);
if (this->actor.colChkInfo.damageEffect == EN_BB_DMGEFF_ZORA_MAGIC) {
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 40);
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_LARGE;
this->drawDmgEffAlpha = 2.0f;
this->drawDmgEffScale = 0.4f;
} else if (this->actor.colChkInfo.damageEffect == EN_BB_DMGEFF_STUN) {
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 20);
- this->actor.speedXZ = 0.0f;
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 20);
+ this->actor.speed = 0.0f;
} else if (this->actor.colChkInfo.damageEffect == EN_BB_DMGEFF_HOOKSHOT) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
} else {
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 20);
- this->actor.speedXZ = 7.0f;
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 20);
+ this->actor.speed = 7.0f;
}
this->actor.gravity = -1.0f;
@@ -435,14 +420,14 @@ void EnBb_SetupDamage(EnBb* this) {
}
void EnBb_Damage(EnBb* this, PlayState* play) {
- Math_SmoothStepToF(&this->actor.speedXZ, 0.0f, 1.0f, 0.5f, 0.0f);
- if ((this->actor.bgCheckFlags & 1) && (this->actor.speedXZ < 0.1f)) {
+ Math_SmoothStepToF(&this->actor.speed, 0.0f, 1.0f, 0.5f, 0.0f);
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->actor.speed < 0.1f)) {
EnBb_SetupDown(this);
}
}
void EnBb_SetupFrozen(EnBb* this) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->actor.velocity.y > 0.0f) {
this->actor.velocity.y = 0.0f;
}
@@ -472,7 +457,7 @@ void EnBb_SetupWaitForRevive(EnBb* this) {
this->actor.shape.rot.x = 0;
this->actor.world.pos.y += 50.0f;
this->timer = 200;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.velocity.y = 0.0f;
this->actor.gravity = 0.0f;
this->actionFunc = EnBb_WaitForRevive;
@@ -503,7 +488,7 @@ void EnBb_Revive(EnBb* this, PlayState* play) {
if (Math_StepToF(&this->actor.scale.x, 0.01f, 0.0005f)) {
this->actor.flags &= ~ACTOR_FLAG_10;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->collider.base.acFlags |= AC_ON;
this->collider.base.atFlags |= AT_ON;
this->actor.world.rot.y = this->actor.shape.rot.y;
@@ -550,30 +535,28 @@ void EnBb_UpdateDamage(EnBb* this, PlayState* play) {
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_SMALL_LIGHT_RAYS);
+ CLEAR_TAG_PARAMS(CLEAR_TAG_SMALL_LIGHT_RAYS));
}
}
- } else {
- if (this->collider.base.atFlags & AT_BOUNCED) {
- this->collider.base.atFlags &= ~(AT_HIT | AT_BOUNCED);
- if (this->actionFunc != EnBb_Down) {
- this->actor.world.rot.y = this->actor.yawTowardsPlayer + 0x8000;
- this->actor.shape.rot.y = this->actor.world.rot.y;
- EnBb_SetupDown(this);
- }
- } else if (this->collider.base.atFlags & AT_HIT) {
- this->collider.base.atFlags &= ~AT_HIT;
+ } else if (this->collider.base.atFlags & AT_BOUNCED) {
+ this->collider.base.atFlags &= ~(AT_HIT | AT_BOUNCED);
+ if (this->actionFunc != EnBb_Down) {
this->actor.world.rot.y = this->actor.yawTowardsPlayer + 0x8000;
this->actor.shape.rot.y = this->actor.world.rot.y;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BUBLE_BITE);
+ EnBb_SetupDown(this);
+ }
+ } else if (this->collider.base.atFlags & AT_HIT) {
+ this->collider.base.atFlags &= ~AT_HIT;
+ this->actor.world.rot.y = this->actor.yawTowardsPlayer + 0x8000;
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BUBLE_BITE);
- if (this->flameScaleX > 0.0f) {
- gSaveContext.jinxTimer = 1200;
- }
+ if (this->flameScaleX > 0.0f) {
+ gSaveContext.jinxTimer = 1200;
+ }
- if (this->actionFunc == EnBb_Attack) {
- EnBb_SetupFlyIdle(this);
- }
+ if (this->actionFunc == EnBb_Attack) {
+ EnBb_SetupFlyIdle(this);
}
}
}
@@ -585,7 +568,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;
@@ -614,7 +598,7 @@ void EnBb_Update(Actor* thisx, PlayState* play) {
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(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
}
}
@@ -631,38 +615,68 @@ s32 EnBb_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po
return false;
}
+/**
+ * This maps a given limb based on its limbIndex to its appropriate index
+ * in the bodyPartsPos/Velocity arrays.
+ */
+static s8 sLimbToBodyParts[BUBBLE_LIMB_MAX] = {
+ BODYPART_NONE, // BUBBLE_LIMB_NONE
+ BODYPART_NONE, // BUBBLE_LIMB_ROOT
+ BODYPART_NONE, // BUBBLE_LIMB_CRANIUM_ROOT
+ BODYPART_NONE, // BUBBLE_LIMB_JAW_ROOT
+ BUBBLE_BODYPART_0, // BUBBLE_LIMB_JAW
+ BODYPART_NONE, // BUBBLE_LIMB_LEFT_WING_ROOT
+ BODYPART_NONE, // BUBBLE_LIMB_LEFT_WING_WRAPPER
+ BODYPART_NONE, // BUBBLE_LIMB_LEFT_WING_WEBBING_ROOT
+ BUBBLE_BODYPART_1, // BUBBLE_LIMB_LEFT_WING_WEBBING
+ BODYPART_NONE, // BUBBLE_LIMB_LEFT_WING_BONE
+ BODYPART_NONE, // BUBBLE_LIMB_RIGHT_WING_ROOT
+ BODYPART_NONE, // BUBBLE_LIMB_RIGHT_WING_WRAPPER
+ BODYPART_NONE, // BUBBLE_LIMB_RIGHT_WING_WEBBING_ROOT
+ BUBBLE_BODYPART_2, // BUBBLE_LIMB_RIGHT_WING_WEBBING
+ BODYPART_NONE, // BUBBLE_LIMB_RIGHT_WING_BONE
+ BUBBLE_BODYPART_3, // BUBBLE_LIMB_CRANIUM
+};
+
+/**
+ * The last element of the bodyParts arrays is a duplicate of the cranium
+ * limb, which is then offset by a certain amount. There is no display list
+ * associated with this, so it is only used for effects.
+ */
+static Vec3f sEffectsBodyPartOffset = { 1000.0f, -700.0f, 0.0f };
+
void EnBb_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
s32 pad;
EnBb* this = THIS;
MtxF* currentMatrixState;
if (this->bodyPartDrawStatus == BB_BODY_PART_DRAW_STATUS_ALIVE) {
- if (sLimbIndexToBodyPartsIndex[limbIndex] != -1) {
- if (sLimbIndexToBodyPartsIndex[limbIndex] == 0) {
- Matrix_MultVecX(1000.0f, &this->bodyPartsPos[0]);
- } else if (sLimbIndexToBodyPartsIndex[limbIndex] == 3) {
- Matrix_MultVecX(-1000.0f, &this->bodyPartsPos[3]);
- Matrix_MultVec3f(&sDuplicateCraniumBodyPartOffset, &this->bodyPartsPos[4]);
+ if (sLimbToBodyParts[limbIndex] != BODYPART_NONE) {
+ if (sLimbToBodyParts[limbIndex] == BUBBLE_BODYPART_0) {
+ Matrix_MultVecX(1000.0f, &this->bodyPartsPos[BUBBLE_BODYPART_0]);
+ } else if (sLimbToBodyParts[limbIndex] == BUBBLE_BODYPART_3) {
+ Matrix_MultVecX(-1000.0f, &this->bodyPartsPos[BUBBLE_BODYPART_3]);
+ Matrix_MultVec3f(&sEffectsBodyPartOffset, &this->bodyPartsPos[BUBBLE_BODYPART_EFFECTS]);
} else {
- Matrix_MultZero(&this->bodyPartsPos[sLimbIndexToBodyPartsIndex[limbIndex]]);
+ Matrix_MultZero(&this->bodyPartsPos[sLimbToBodyParts[limbIndex]]);
}
}
} else if (this->bodyPartDrawStatus > BB_BODY_PART_DRAW_STATUS_ALIVE) {
- if (sLimbIndexToBodyPartsIndex[limbIndex] != -1) {
- Matrix_MultZero(&this->bodyPartsPos[sLimbIndexToBodyPartsIndex[limbIndex]]);
+ if (sLimbToBodyParts[limbIndex] != BODYPART_NONE) {
+ Matrix_MultZero(&this->bodyPartsPos[sLimbToBodyParts[limbIndex]]);
}
if (limbIndex == BUBBLE_LIMB_CRANIUM) {
this->bodyPartDrawStatus = BB_BODY_PART_DRAW_STATUS_BROKEN;
}
} else {
- if (sLimbIndexToBodyPartsIndex[limbIndex] != -1) {
+ if (sLimbToBodyParts[limbIndex] != BODYPART_NONE) {
OPEN_DISPS(play->state.gfxCtx);
currentMatrixState = Matrix_GetCurrent();
- currentMatrixState->mf[3][0] = this->bodyPartsPos[sLimbIndexToBodyPartsIndex[limbIndex]].x;
- currentMatrixState->mf[3][1] = this->bodyPartsPos[sLimbIndexToBodyPartsIndex[limbIndex]].y;
- currentMatrixState->mf[3][2] = this->bodyPartsPos[sLimbIndexToBodyPartsIndex[limbIndex]].z;
+ currentMatrixState->mf[3][0] = this->bodyPartsPos[sLimbToBodyParts[limbIndex]].x;
+ currentMatrixState->mf[3][1] = this->bodyPartsPos[sLimbToBodyParts[limbIndex]].y;
+ currentMatrixState->mf[3][2] = this->bodyPartsPos[sLimbToBodyParts[limbIndex]].z;
Matrix_RotateZS(thisx->world.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++, this->limbDList);
@@ -681,14 +695,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);
@@ -702,9 +716,8 @@ void EnBb_Draw(Actor* thisx, PlayState* play) {
gSPDisplayList(POLY_XLU_DISP++, gEffFire1DL);
}
- Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, ARRAY_COUNT(this->bodyPartsPos),
- this->drawDmgEffScale, this->drawDmgEffFrozenSteamScale, this->drawDmgEffAlpha,
- this->drawDmgEffType);
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, BUBBLE_BODYPART_MAX, this->drawDmgEffScale,
+ this->drawDmgEffFrozenSteamScale, this->drawDmgEffAlpha, this->drawDmgEffType);
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Bb/z_en_bb.h b/src/overlays/actors/ovl_En_Bb/z_en_bb.h
index c852397d4..7c94d4b37 100644
--- a/src/overlays/actors/ovl_En_Bb/z_en_bb.h
+++ b/src/overlays/actors/ovl_En_Bb/z_en_bb.h
@@ -10,6 +10,15 @@ struct EnBb;
typedef void (*EnBbActionFunc)(struct EnBb*, PlayState*);
+typedef enum BubbleBodyPart {
+ /* 0 */ BUBBLE_BODYPART_0,
+ /* 1 */ BUBBLE_BODYPART_1,
+ /* 2 */ BUBBLE_BODYPART_2,
+ /* 3 */ BUBBLE_BODYPART_3,
+ /* 4 */ BUBBLE_BODYPART_EFFECTS,
+ /* 5 */ BUBBLE_BODYPART_MAX
+} BubbleBodyPart;
+
typedef struct EnBb {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
@@ -31,8 +40,8 @@ typedef struct EnBb {
/* 0x26C */ f32 drawDmgEffAlpha;
/* 0x270 */ f32 drawDmgEffScale;
/* 0x274 */ f32 drawDmgEffFrozenSteamScale;
- /* 0x278 */ Vec3f bodyPartsPos[5];
- /* 0x2B4 */ Vec3f bodyPartsVelocity[5];
+ /* 0x278 */ Vec3f bodyPartsPos[BUBBLE_BODYPART_MAX];
+ /* 0x2B4 */ Vec3f bodyPartsVelocity[BUBBLE_BODYPART_MAX];
/* 0x2F0 */ Gfx* limbDList;
/* 0x2F4 */ ColliderSphere collider;
} EnBb; // size = 0x34C
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..46fd9d5b2 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
@@ -15,7 +15,7 @@
#include "z_en_bba_01.h"
#include "objects/object_bba/object_bba.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnBba01*)thisx)
@@ -123,8 +123,7 @@ void EnBba01_UpdateModel(EnBba01* this, PlayState* play) {
Math_SmoothStepToS(&this->enHy.torsoRot.x, 0, 4, 0x3E8, 1);
Math_SmoothStepToS(&this->enHy.torsoRot.y, 0, 4, 0x3E8, 1);
}
- SubS_FillLimbRotTables(play, this->enHy.limbRotTableY, this->enHy.limbRotTableZ,
- ARRAY_COUNT(this->enHy.limbRotTableY));
+ SubS_UpdateFidgetTables(play, this->enHy.fidgetTableY, this->enHy.fidgetTableZ, ENHY_LIMB_MAX);
EnHy_UpdateCollider(&this->enHy, play);
}
@@ -150,7 +149,7 @@ s32 func_809CC270(EnBba01* this, PlayState* play) {
Actor_GetScreenPos(play, &this->enHy.actor, &x, &y);
//! @bug: Both x and y conditionals are always true, || should be an &&
if (!this->enHy.waitingOnInit && ((x >= 0) || (x < SCREEN_WIDTH)) && ((y >= 0) || (y < SCREEN_HEIGHT))) {
- func_800B85E0(&this->enHy.actor, play, 30.0f, PLAYER_IA_MAGIC_BEANS);
+ Actor_OfferTalkExchangeEquiCylinder(&this->enHy.actor, play, 30.0f, PLAYER_IA_MAGIC_BEANS);
}
return true;
}
@@ -159,10 +158,10 @@ void EnBba01_FinishInit(EnHy* this, PlayState* play) {
//! @bug: gBbaSkel does not match EnHy's skeleton assumptions.
//! Since gBbaSkel has more limbs than expected, joint and morph tables will overflow
if (EnHy_Init(this, play, &gBbaSkel, ENHY_ANIM_BBA_6)) {
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
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;
@@ -206,6 +205,9 @@ void EnBba01_Talk(EnHy* this, PlayState* play) {
this->actionFunc = this->prevActionFunc;
this->prevActionFunc = NULL;
break;
+
+ default:
+ break;
}
}
@@ -226,8 +228,8 @@ void EnBba01_Init(Actor* thisx, PlayState* play) {
Collider_InitCylinder(play, &this->enHy.collider);
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.actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ 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,28 +246,31 @@ 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);
}
s32 EnBba01_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnBba01* this = THIS;
- s8 bodyPart;
+ s8 bodyPartIndex;
Vec3f zeroVec = { 0.0f, 0.0f, 0.0f };
- bodyPart = gEnHyBodyParts[limbIndex];
- if (bodyPart >= 0) {
- Matrix_MultVec3f(&zeroVec, &this->enHy.bodyPartsPos[bodyPart]);
+ bodyPartIndex = gEnHyLimbToBodyParts[limbIndex];
+ if (bodyPartIndex > BODYPART_NONE) {
+ Matrix_MultVec3f(&zeroVec, &this->enHy.bodyPartsPos[bodyPartIndex]);
}
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);
+
+ gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[this->enHy.headObjIndex].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->enHy.headObjIndex].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[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);
@@ -283,8 +288,8 @@ s32 EnBba01_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
}
if ((limbIndex == BBA_LIMB_BAG) || (limbIndex == BBA_LIMB_TORSO) || (limbIndex == BBA_LIMB_LEFT_FOREARM)) {
- rot->y += (s16)(Math_SinS(this->enHy.limbRotTableY[limbIndex]) * 200.0f);
- rot->z += (s16)(Math_CosS(this->enHy.limbRotTableZ[limbIndex]) * 200.0f);
+ rot->y += (s16)(Math_SinS(this->enHy.fidgetTableY[limbIndex]) * 200.0f);
+ rot->z += (s16)(Math_CosS(this->enHy.fidgetTableZ[limbIndex]) * 200.0f);
}
return false;
@@ -297,8 +302,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);
+
+ gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[this->enHy.skelUpperObjIndex].segment);
+ gSegments[0x06] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->enHy.skelUpperObjIndex].segment);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -318,7 +325,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++);
@@ -331,8 +338,8 @@ void EnBba01_Draw(Actor* thisx, PlayState* play) {
*shadowTexIter++ = 0;
}
for (i = 0; i < 5; i++) {
- SubS_GenShadowTex(this->enHy.bodyPartsPos, &this->enHy.actor.world.pos, shadowTex, i / 5.0f,
- ARRAY_COUNT(this->enHy.bodyPartsPos), gEnHyShadowSizes, gEnHyParentBodyParts);
+ SubS_GenShadowTex(this->enHy.bodyPartsPos, &this->enHy.actor.world.pos, shadowTex, i / 5.0f, ENHY_BODYPART_MAX,
+ gEnHyShadowSizes, gEnHyParentShadowBodyParts);
}
SubS_DrawShadowTex(&this->enHy.actor, &play->state, shadowTex);
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 1dfc74a22..0f9d16a47 100644
--- a/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.c
+++ b/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.c
@@ -5,9 +5,10 @@
*/
#include "z_en_bbfall.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_200)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_200)
#define THIS ((EnBbfall*)thisx)
@@ -32,7 +33,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 +103,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 = {
@@ -147,22 +148,6 @@ static InitChainEntry sInitChain[] = {
ICHAIN_F32(targetArrowOffset, 10, ICHAIN_STOP),
};
-/**
- * This maps a given limb based on its limbIndex to its appropriate index
- * in the bodyPartsPos/Velocity arrays. An index of -1 indicates that the
- * limb is not part of the bodyParts arrays.
- */
-static s8 sLimbIndexToBodyPartsIndex[] = {
- -1, -1, -1, -1, 0, -1, -1, -1, 1, -1, -1, -1, -1, 2, -1, 3,
-};
-
-/**
- * The last element of the bodyParts arrays is a duplicate of the cranium
- * limb, which is then offset by a certain amount. There is no display list
- * associated with this, so it is only used for effects.
- */
-static Vec3f sDuplicateCraniumBodyPartOffset = { 1000.0f, -700.0f, 0.0f };
-
void EnBbfall_Init(Actor* thisx, PlayState* play) {
EnBbfall* this = THIS;
s32 i;
@@ -194,14 +179,14 @@ void EnBbfall_Freeze(EnBbfall* this) {
this->timer = 80;
this->drawDmgEffAlpha = 1.0f;
this->actor.flags &= ~ACTOR_FLAG_200;
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 80);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 80);
}
void EnBbfall_Thaw(EnBbfall* this, PlayState* play) {
if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->drawDmgEffAlpha = 0.0f;
- Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, ARRAY_COUNT(this->bodyPartsPos), 2, 0.2f, 0.15f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, BUBBLE_BODYPART_MAX, 2, 0.2f, 0.15f);
this->actor.flags |= ACTOR_FLAG_200;
}
}
@@ -211,9 +196,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;
}
}
@@ -223,10 +208,10 @@ s32 EnBbfall_IsTouchingLava(EnBbfall* this, PlayState* play) {
void EnBbfall_PlaySfx(EnBbfall* this) {
if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 5.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BUBLE_MOUTH);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BUBLE_MOUTH);
}
- func_800B9010(&this->actor, NA_SE_EN_BUBLEFALL_FIRE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_BUBLEFALL_FIRE - SFX_FLAG);
}
/**
@@ -237,14 +222,14 @@ void EnBbfall_PlaySfx(EnBbfall* this) {
void EnBbfall_CheckForWall(EnBbfall* this) {
s16 yawDiff;
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
yawDiff = this->actor.shape.rot.y - this->actor.wallYaw;
if (ABS_ALT(yawDiff) > 0x4000) {
this->actor.shape.rot.y = ((this->actor.wallYaw * 2) - this->actor.shape.rot.y) - 0x8000;
}
- this->actor.bgCheckFlags &= ~8;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_WALL;
}
}
@@ -273,7 +258,7 @@ void EnBbfall_SetupWaitForPlayer(EnBbfall* this) {
this->actor.colChkInfo.health = sColChkInfoInit.health;
this->actor.colorFilterTimer = 0;
this->isBgCheckCollisionEnabled = false;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.gravity = 0.0f;
this->actor.velocity.y = 0.0f;
Math_Vec3f_Copy(&this->actor.world.pos, &this->actor.home.pos);
@@ -283,8 +268,8 @@ void EnBbfall_SetupWaitForPlayer(EnBbfall* this) {
this->flamePos[i].y -= 47.0f;
}
- this->actor.bgCheckFlags &= ~1;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actionFunc = EnBbfall_WaitForPlayer;
}
@@ -305,8 +290,8 @@ void EnBbfall_SetupEmerge(EnBbfall* this) {
this->collider.base.ocFlags1 |= OC1_ON;
this->actor.velocity.y = 17.0f;
EnBbfall_EnableColliders(this);
- this->actor.flags |= ACTOR_FLAG_1;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BUBLEFALL_APPEAR);
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BUBLEFALL_APPEAR);
this->actionFunc = EnBbfall_Emerge;
}
@@ -322,8 +307,8 @@ void EnBbfall_Emerge(EnBbfall* this, PlayState* play) {
void EnBbfall_SetupFly(EnBbfall* this) {
this->flameOpacity = 255;
this->isBgCheckCollisionEnabled = true;
- this->actor.bgCheckFlags &= ~1;
- this->actor.speedXZ = 5.0f;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
+ this->actor.speed = 5.0f;
this->actor.gravity = -1.0f;
this->actionFunc = EnBbfall_Fly;
}
@@ -333,17 +318,17 @@ void EnBbfall_Fly(EnBbfall* this, PlayState* play) {
Math_StepToF(&this->flameScaleY, 0.8f, 0.1f);
Math_StepToF(&this->flameScaleX, 1.0f, 0.1f);
EnBbfall_CheckForWall(this);
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
if (EnBbfall_IsTouchingLava(this, play)) {
EnBbfall_SetupSinkIntoLava(this);
} else {
// 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 &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
}
this->actor.world.rot.y = this->actor.shape.rot.y;
@@ -372,11 +357,11 @@ void EnBbfall_SetupDown(EnBbfall* this) {
this->timer = 200;
this->flameOpacity = 0;
this->collider.base.acFlags |= AC_ON;
- this->actor.speedXZ = 2.0f;
+ this->actor.speed = 2.0f;
this->flameScaleY = 0.0f;
this->flameScaleX = 0.0f;
this->actor.gravity = -2.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BUBLE_DOWN);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BUBLE_DOWN);
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = EnBbfall_Down;
}
@@ -385,15 +370,15 @@ void EnBbfall_Down(EnBbfall* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
EnBbfall_CheckForWall(this);
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
if (EnBbfall_IsTouchingLava(this, play)) {
EnBbfall_SetupSinkIntoLava(this);
return;
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EYEGOLE_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_ATTACK);
if (this->timer == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BUBLE_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BUBLE_UP);
EnBbfall_EnableColliders(this);
this->actor.velocity.y = 8.0f;
EnBbfall_SetupFly(this);
@@ -406,14 +391,14 @@ void EnBbfall_Down(EnBbfall* this, PlayState* play) {
this->actor.velocity.y = 10.0f;
}
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
Actor_SpawnFloorDustRing(play, &this->actor, &this->actor.world.pos, 7.0f, 2, 2.0f, 0, 0, 0);
Math_ScaledStepToS(&this->actor.shape.rot.y, BINANG_ADD(this->actor.yawTowardsPlayer, 0x8000), 0xBB8);
}
this->actor.world.rot.y = this->actor.shape.rot.y;
if (Animation_OnFrame(&this->skelAnime, 5.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BUBLE_WING);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BUBLE_WING);
}
if (this->timer > 0) {
@@ -430,16 +415,16 @@ void EnBbfall_SetupDead(EnBbfall* this, PlayState* play) {
func_800BE5CC(&this->actor, &this->collider, 0);
this->timer = 15;
this->actor.shape.rot.x += 0x4E20;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EN_BUBLE_DEAD);
Item_DropCollectibleRandom(play, &this->actor, &this->actor.world.pos, 0x70);
this->actor.velocity.y = 0.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->bodyPartDrawStatus = BBFALL_BODY_PART_DRAW_STATUS_DEAD;
this->actor.gravity = -1.5f;
bodyPartVelocity = &this->bodyPartsVelocity[0];
- for (i = 0; i < ARRAY_COUNT(this->bodyPartsPos); i++, bodyPartVelocity++) {
+ for (i = 0; i < BUBBLE_BODYPART_MAX; i++, bodyPartVelocity++) {
Math_Vec3f_Diff(&this->bodyPartsPos[i], &this->actor.world.pos, &posDiff);
magnitude = Math3D_Vec3fMagnitude(&posDiff);
if (magnitude > 1.0f) {
@@ -461,7 +446,7 @@ void EnBbfall_Dead(EnBbfall* this, PlayState* play) {
Math_SmoothStepToS(&this->actor.world.rot.z, 0x4000, 4, 0x1000, 0x400);
if (this->timer == 0) {
- for (i = 0; i < ARRAY_COUNT(this->bodyPartsPos); i++) {
+ for (i = 0; i < BUBBLE_BODYPART_MAX; i++) {
func_800B3030(play, &this->bodyPartsPos[i], &gZeroVec3f, &gZeroVec3f, 40, 7, 2);
SoundSource_PlaySfxAtFixedWorldPos(play, &this->bodyPartsPos[i], 11, NA_SE_EN_EXTINCT);
}
@@ -470,7 +455,7 @@ void EnBbfall_Dead(EnBbfall* this, PlayState* play) {
return;
}
- for (i = 0; i < ARRAY_COUNT(this->bodyPartsPos); i++) {
+ for (i = 0; i < BUBBLE_BODYPART_MAX; i++) {
Math_Vec3f_Sum(&this->bodyPartsPos[i], &this->bodyPartsVelocity[i], &this->bodyPartsPos[i]);
this->bodyPartsVelocity[i].y += this->actor.gravity;
}
@@ -478,30 +463,30 @@ void EnBbfall_Dead(EnBbfall* this, PlayState* play) {
void EnBbfall_SetupDamage(EnBbfall* this) {
this->collider.base.acFlags &= ~AC_ON;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BUBLE_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BUBLE_DAMAGE);
func_800BE5CC(&this->actor, &this->collider, 0);
if (this->actor.colChkInfo.damageEffect == EN_BBFALL_DMGEFF_ZORA_MAGIC) {
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 40);
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_LARGE;
this->drawDmgEffAlpha = 2.0f;
this->drawDmgEffScale = 0.4f;
} else if (this->actor.colChkInfo.damageEffect == EN_BBFALL_DMGEFF_STUN) {
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 20);
- this->actor.speedXZ = 0.0f;
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 20);
+ this->actor.speed = 0.0f;
} else if (this->actor.colChkInfo.damageEffect == EN_BBFALL_DMGEFF_HOOKSHOT) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
} else {
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 20);
- this->actor.speedXZ = 7.0f;
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 20);
+ this->actor.speed = 7.0f;
}
this->actionFunc = EnBbfall_Damage;
}
void EnBbfall_Damage(EnBbfall* this, PlayState* play) {
- Math_SmoothStepToF(&this->actor.speedXZ, 0.0f, 1.0f, 0.5f, 0.0f);
- if ((this->actor.bgCheckFlags & 1) && (this->actor.speedXZ < 0.1f)) {
+ Math_SmoothStepToF(&this->actor.speed, 0.0f, 1.0f, 0.5f, 0.0f);
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->actor.speed < 0.1f)) {
if (EnBbfall_IsTouchingLava(this, play)) {
EnBbfall_SetupSinkIntoLava(this);
} else {
@@ -511,7 +496,7 @@ void EnBbfall_Damage(EnBbfall* this, PlayState* play) {
}
void EnBbfall_SetupFrozen(EnBbfall* this) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->actor.velocity.y > 0.0f) {
this->actor.velocity.y = 0.0f;
}
@@ -571,7 +556,8 @@ void EnBbfall_UpdateDamage(EnBbfall* this, PlayState* play) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_LIGHT_ORBS;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->collider.elements[0].info.bumper.hitPos.x,
this->collider.elements[0].info.bumper.hitPos.y,
- this->collider.elements[0].info.bumper.hitPos.z, 0, 0, 0, CLEAR_TAG_SMALL_LIGHT_RAYS);
+ this->collider.elements[0].info.bumper.hitPos.z, 0, 0, 0,
+ CLEAR_TAG_PARAMS(CLEAR_TAG_SMALL_LIGHT_RAYS));
}
}
} else {
@@ -600,7 +586,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--) {
@@ -647,7 +634,7 @@ void EnBbfall_Update(Actor* thisx, PlayState* play) {
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(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
}
}
@@ -664,38 +651,68 @@ s32 EnBbfall_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f
return false;
}
+/**
+ * This maps a given limb based on its limbIndex to its appropriate index
+ * in the bodyPartsPos/Velocity arrays.
+ */
+static s8 sLimbToBodyParts[BUBBLE_LIMB_MAX] = {
+ BODYPART_NONE, // BUBBLE_LIMB_NONE
+ BODYPART_NONE, // BUBBLE_LIMB_ROOT
+ BODYPART_NONE, // BUBBLE_LIMB_CRANIUM_ROOT
+ BODYPART_NONE, // BUBBLE_LIMB_JAW_ROOT
+ BUBBLE_BODYPART_0, // BUBBLE_LIMB_JAW
+ BODYPART_NONE, // BUBBLE_LIMB_LEFT_WING_ROOT
+ BODYPART_NONE, // BUBBLE_LIMB_LEFT_WING_WRAPPER
+ BODYPART_NONE, // BUBBLE_LIMB_LEFT_WING_WEBBING_ROOT
+ BUBBLE_BODYPART_1, // BUBBLE_LIMB_LEFT_WING_WEBBING
+ BODYPART_NONE, // BUBBLE_LIMB_LEFT_WING_BONE
+ BODYPART_NONE, // BUBBLE_LIMB_RIGHT_WING_ROOT
+ BODYPART_NONE, // BUBBLE_LIMB_RIGHT_WING_WRAPPER
+ BODYPART_NONE, // BUBBLE_LIMB_RIGHT_WING_WEBBING_ROOT
+ BUBBLE_BODYPART_2, // BUBBLE_LIMB_RIGHT_WING_WEBBING
+ BODYPART_NONE, // BUBBLE_LIMB_RIGHT_WING_BONE
+ BUBBLE_BODYPART_3, // BUBBLE_LIMB_CRANIUM
+};
+
+/**
+ * The last element of the bodyParts arrays is a duplicate of the cranium
+ * limb, which is then offset by a certain amount. There is no display list
+ * associated with this, so it is only used for effects.
+ */
+static Vec3f sEffectsBodyPartOffset = { 1000.0f, -700.0f, 0.0f };
+
void EnBbfall_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
s32 pad;
EnBbfall* this = THIS;
MtxF* currentMatrixState;
if (this->bodyPartDrawStatus == BBFALL_BODY_PART_DRAW_STATUS_ALIVE) {
- if (sLimbIndexToBodyPartsIndex[limbIndex] != -1) {
- if (sLimbIndexToBodyPartsIndex[limbIndex] == 0) {
- Matrix_MultVecX(1000.0f, &this->bodyPartsPos[0]);
- } else if (sLimbIndexToBodyPartsIndex[limbIndex] == 3) {
- Matrix_MultVecX(-1000.0f, &this->bodyPartsPos[3]);
- Matrix_MultVec3f(&sDuplicateCraniumBodyPartOffset, &this->bodyPartsPos[4]);
+ if (sLimbToBodyParts[limbIndex] != BODYPART_NONE) {
+ if (sLimbToBodyParts[limbIndex] == BUBBLE_BODYPART_0) {
+ Matrix_MultVecX(1000.0f, &this->bodyPartsPos[BUBBLE_BODYPART_0]);
+ } else if (sLimbToBodyParts[limbIndex] == BUBBLE_BODYPART_3) {
+ Matrix_MultVecX(-1000.0f, &this->bodyPartsPos[BUBBLE_BODYPART_3]);
+ Matrix_MultVec3f(&sEffectsBodyPartOffset, &this->bodyPartsPos[BUBBLE_BODYPART_EFFECTS]);
} else {
- Matrix_MultZero(&this->bodyPartsPos[sLimbIndexToBodyPartsIndex[limbIndex]]);
+ Matrix_MultZero(&this->bodyPartsPos[sLimbToBodyParts[limbIndex]]);
}
}
} else if (this->bodyPartDrawStatus > BBFALL_BODY_PART_DRAW_STATUS_ALIVE) {
- if (sLimbIndexToBodyPartsIndex[limbIndex] != -1) {
- Matrix_MultZero(&this->bodyPartsPos[sLimbIndexToBodyPartsIndex[limbIndex]]);
+ if (sLimbToBodyParts[limbIndex] != BODYPART_NONE) {
+ Matrix_MultZero(&this->bodyPartsPos[sLimbToBodyParts[limbIndex]]);
}
if (limbIndex == BUBBLE_LIMB_CRANIUM) {
this->bodyPartDrawStatus = BBFALL_BODY_PART_DRAW_STATUS_BROKEN;
}
} else {
- if (sLimbIndexToBodyPartsIndex[limbIndex] != -1) {
+ if (sLimbToBodyParts[limbIndex] != BODYPART_NONE) {
OPEN_DISPS(play->state.gfxCtx);
currentMatrixState = Matrix_GetCurrent();
- currentMatrixState->mf[3][0] = this->bodyPartsPos[sLimbIndexToBodyPartsIndex[limbIndex]].x;
- currentMatrixState->mf[3][1] = this->bodyPartsPos[sLimbIndexToBodyPartsIndex[limbIndex]].y;
- currentMatrixState->mf[3][2] = this->bodyPartsPos[sLimbIndexToBodyPartsIndex[limbIndex]].z;
+ currentMatrixState->mf[3][0] = this->bodyPartsPos[sLimbToBodyParts[limbIndex]].x;
+ currentMatrixState->mf[3][1] = this->bodyPartsPos[sLimbToBodyParts[limbIndex]].y;
+ currentMatrixState->mf[3][2] = this->bodyPartsPos[sLimbToBodyParts[limbIndex]].z;
Matrix_RotateZS(thisx->world.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++, this->limbDList);
@@ -717,13 +734,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);
@@ -753,9 +770,8 @@ void EnBbfall_Draw(Actor* thisx, PlayState* play2) {
}
}
- Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, ARRAY_COUNT(this->bodyPartsPos),
- this->drawDmgEffScale, this->drawDmgEffFrozenSteamScale, this->drawDmgEffAlpha,
- this->drawDmgEffType);
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, BUBBLE_BODYPART_MAX, this->drawDmgEffScale,
+ this->drawDmgEffFrozenSteamScale, this->drawDmgEffAlpha, this->drawDmgEffType);
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.h b/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.h
index 19c643ea7..e65b1a8d2 100644
--- a/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.h
+++ b/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.h
@@ -3,6 +3,7 @@
#include "global.h"
#include "objects/object_bb/object_bb.h"
+#include "overlays/actors/ovl_En_Bb/z_en_bb.h"
struct EnBbfall;
@@ -25,8 +26,8 @@ typedef struct EnBbfall {
/* 0x260 */ f32 drawDmgEffScale;
/* 0x264 */ f32 drawDmgEffFrozenSteamScale;
/* 0x268 */ Vec3f flamePos[6];
- /* 0x2B0 */ Vec3f bodyPartsPos[5];
- /* 0x2EC */ Vec3f bodyPartsVelocity[5];
+ /* 0x2B0 */ Vec3f bodyPartsPos[BUBBLE_BODYPART_MAX];
+ /* 0x2EC */ Vec3f bodyPartsVelocity[BUBBLE_BODYPART_MAX];
/* 0x328 */ Gfx* limbDList;
/* 0x32C */ UNK_TYPE1 unk_32C[0x58];
/* 0x384 */ ColliderJntSph collider;
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 cf8c5f68a..d3fa6ad4a 100644
--- a/src/overlays/actors/ovl_En_Bee/z_en_bee.c
+++ b/src/overlays/actors/ovl_En_Bee/z_en_bee.c
@@ -6,7 +6,7 @@
#include "z_en_bee.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY)
#define THIS ((EnBee*)thisx)
@@ -94,17 +94,17 @@ void EnBee_Init(Actor* thisx, PlayState* play) {
this->actor.colChkInfo.mass = 10;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 19.0f);
- SkelAnime_Init(play, &this->skelAnime, &gBeeSkel, &gBeeFlyingAnim, this->morphTable, this->jointTable,
+ SkelAnime_Init(play, &this->skelAnime, &gBeeSkel, &gBeeFlyingAnim, this->jointTable, this->morphTable,
OBJECT_BEE_LIMB_MAX);
this->actor.colChkInfo.health = 1;
this->actor.colChkInfo.damageTable = &sDamageTable;
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
this->instanceId = sNumLoadedBees;
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);
}
@@ -123,7 +123,8 @@ void EnBee_SetupFlyIdle(EnBee* this) {
Vec3f tempPos;
s16 yawOffset;
- Animation_Change(&this->skelAnime, &gBeeFlyingAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gBeeFlyingAnim), 0, -10.0f);
+ Animation_Change(&this->skelAnime, &gBeeFlyingAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gBeeFlyingAnim),
+ ANIMMODE_LOOP, -10.0f);
Math_Vec3f_Copy(&tempPos, &this->actor.home.pos);
yawOffset = (this->instanceId * 0x700) + 0x2000;
@@ -149,7 +150,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 +159,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;
@@ -173,7 +174,7 @@ void EnBee_FlyIdle(EnBee* this, PlayState* play) {
}
Math_SmoothStepToS(&this->actor.world.rot.y, Math_Vec3f_Yaw(&this->actor.world.pos, &nextPos), 1, 0x7D0, 0);
- Math_ApproachF(&this->actor.speedXZ, 3.0f, 0.3f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 3.0f, 0.3f, 1.0f);
if ((this->attackDelayTimer == 0) && (this->actor.params != BEE_BEHAVIOR_IDLE)) {
EnBee_SetupAttack(this);
@@ -181,7 +182,8 @@ void EnBee_FlyIdle(EnBee* this, PlayState* play) {
}
void EnBee_SetupAttack(EnBee* this) {
- Animation_Change(&this->skelAnime, &gBeeFlyingAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gBeeFlyingAnim), 0, -10.0f);
+ Animation_Change(&this->skelAnime, &gBeeFlyingAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gBeeFlyingAnim),
+ ANIMMODE_LOOP, -10.0f);
this->isHostile = true;
this->actionFunc = EnBee_Attack;
}
@@ -197,10 +199,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 +212,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;
@@ -227,7 +227,7 @@ void EnBee_Attack(EnBee* this, PlayState* play) {
Math_SmoothStepToS(&this->actor.world.rot.y, Math_Vec3f_Yaw(&this->actor.world.pos, &nextPos), 1, 0x1388, 0);
Math_ApproachF(&this->actor.world.pos.y, nextPos.y, 0.3f, 3.0f);
- Math_ApproachF(&this->actor.speedXZ, 5.0f, 0.3f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 5.0f, 0.3f, 1.0f);
}
void EnBee_UpdateDamage(EnBee* this, PlayState* play) {
@@ -238,7 +238,7 @@ void EnBee_UpdateDamage(EnBee* this, PlayState* play) {
if (this->collider.base.acFlags & AC_HIT) {
Enemy_StartFinishingBlow(play, &this->actor);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 10, NA_SE_EN_CUTBODY);
this->actor.colChkInfo.health = 0;
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 50, NA_SE_EN_EXTINCT);
@@ -262,7 +262,7 @@ void EnBee_Update(Actor* thisx, PlayState* play) {
}
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BEE_FLY - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BEE_FLY - SFX_FLAG);
EnBee_UpdateDamage(this, play);
Math_Vec3s_Copy(&this->actor.shape.rot, &this->actor.world.rot);
Actor_SetFocus(&this->actor, 0.0f);
@@ -271,7 +271,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 +284,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..5266ca444 100644
--- a/src/overlays/actors/ovl_En_Bee/z_en_bee.h
+++ b/src/overlays/actors/ovl_En_Bee/z_en_bee.h
@@ -9,15 +9,15 @@ 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 {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s morphTable[OBJECT_BEE_LIMB_MAX];
- /* 0x1C4 */ Vec3s jointTable[OBJECT_BEE_LIMB_MAX];
+ /* 0x188 */ Vec3s jointTable[OBJECT_BEE_LIMB_MAX];
+ /* 0x1C4 */ Vec3s morphTable[OBJECT_BEE_LIMB_MAX];
/* 0x200 */ EnBeeActionFunc actionFunc;
/* 0x204 */ s16 attackDelayTimer;
/* 0x206 */ s16 sfxHitTimer;
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 2aff9891d..ac19bdb44 100644
--- a/src/overlays/actors/ovl_En_Bh/z_en_bh.c
+++ b/src/overlays/actors/ovl_En_Bh/z_en_bh.c
@@ -32,11 +32,11 @@ ActorInit En_Bh_InitVars = {
void EnBh_Init(Actor* thisx, PlayState* play) {
EnBh* this = THIS;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
Actor_SetScale(&this->actor, 0.01f);
- SkelAnime_InitFlex(play, &this->skelanime, &gBhSkel, &gBhFlyingAnim, this->jointTable, this->morphTable,
+ SkelAnime_InitFlex(play, &this->skelAnime, &gBhSkel, &gBhFlyingAnim, this->jointTable, this->morphTable,
OBJECT_BH_LIMB_MAX);
- Animation_PlayLoop(&this->skelanime, &gBhFlyingAnim);
+ Animation_PlayLoop(&this->skelAnime, &gBhFlyingAnim);
this->actionFunc = func_80C22DEC;
}
@@ -52,16 +52,16 @@ void func_80C22DEC(EnBh* this, PlayState* play) {
s16 yRot;
s16 zRot;
- this->actor.speedXZ = 3.0f;
+ this->actor.speed = 3.0f;
xDiff = this->pos.x - this->actor.world.pos.x;
yDiff = this->pos.y - this->actor.world.pos.y;
zDiff = this->pos.z - this->actor.world.pos.z;
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;
}
@@ -80,17 +80,17 @@ void func_80C22DEC(EnBh* this, PlayState* play) {
Math_ApproachS(&this->actor.world.rot.z, -zRot, 0xA, this->step);
Math_ApproachS(&this->step, 0x200, 1, 0x10);
- if ((s32)this->skelanime.playSpeed == 0) {
+ if ((s32)this->skelAnime.playSpeed == 0) {
if (this->timer == 0) {
- this->skelanime.playSpeed = 1.0f;
+ 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);
- if ((this->timer == 0) && (Animation_OnFrame(&this->skelanime, 6.0f))) {
- this->skelanime.playSpeed = 0.0f;
+ SkelAnime_Update(&this->skelAnime);
+ if ((this->timer == 0) && Animation_OnFrame(&this->skelAnime, 6.0f)) {
+ this->skelAnime.playSpeed = 0.0f;
this->timer = Rand_ZeroFloat(50.0f) + 50.0f;
}
}
@@ -114,8 +114,8 @@ 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,
+ SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Bh/z_en_bh.h b/src/overlays/actors/ovl_En_Bh/z_en_bh.h
index a3c88fb58..9876182f0 100644
--- a/src/overlays/actors/ovl_En_Bh/z_en_bh.h
+++ b/src/overlays/actors/ovl_En_Bh/z_en_bh.h
@@ -10,7 +10,7 @@ typedef void (*EnBhActionFunc)(struct EnBh*, PlayState*);
typedef struct EnBh {
/* 0x000 */ Actor actor;
- /* 0x144 */ SkelAnime skelanime;
+ /* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ Vec3s jointTable[OBJECT_BH_LIMB_MAX];
/* 0x1AC */ Vec3s morphTable[OBJECT_BH_LIMB_MAX];
/* 0x1D0 */ Vec3f pos;
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 1f037a8a8..0f505820d 100644
--- a/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c
+++ b/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c
@@ -5,8 +5,9 @@
*/
#include "z_en_bigokuta.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY)
#define THIS ((EnBigokuta*)thisx)
@@ -85,10 +86,8 @@ static ColliderCylinderInit sBodyCylinderInit = {
static CollisionCheckInfoInit sColChkInfoInit = { 4, 130, 120, MASS_HEAVY };
static InitChainEntry sInitChain[] = {
- ICHAIN_F32(uncullZoneForward, 2500, ICHAIN_CONTINUE),
- ICHAIN_F32(targetArrowOffset, 2000, ICHAIN_CONTINUE),
- ICHAIN_U8(targetMode, 2, ICHAIN_CONTINUE),
- ICHAIN_S8(hintId, TATL_HINT_ID_BIG_OCTO, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneForward, 2500, ICHAIN_CONTINUE), ICHAIN_F32(targetArrowOffset, 2000, ICHAIN_CONTINUE),
+ ICHAIN_U8(targetMode, TARGET_MODE_2, ICHAIN_CONTINUE), ICHAIN_S8(hintId, TATL_HINT_ID_BIG_OCTO, ICHAIN_CONTINUE),
ICHAIN_VEC3F_DIV1000(scale, 33, ICHAIN_STOP),
};
@@ -102,10 +101,11 @@ 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) ||
- ((this->picto.actor.params != 0xFF) && Flags_GetSwitch(play, this->picto.actor.params))) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_WOODFALL_TEMPLE) ||
+ ((EN_BIGOKUTA_GET_SWITCH_FLAG(&this->picto.actor) != 0xFF) &&
+ Flags_GetSwitch(play, EN_BIGOKUTA_GET_SWITCH_FLAG(&this->picto.actor)))) {
Actor_Kill(&this->picto.actor);
} else {
this->picto.actor.world.pos.y -= 99.0f;
@@ -129,11 +129,11 @@ 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_YawToPoint(&this->picto.actor, subCamEye), this->picto.actor.home.rot.y);
+ angle = BINANG_SUB(Actor_WorldYawTowardPoint(&this->picto.actor, subCamEye), this->picto.actor.home.rot.y);
if (angle > 0) {
angle = BINANG_ADD(this->picto.actor.home.rot.y, 0x1800);
} else {
@@ -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);
}
}
@@ -169,7 +169,7 @@ void EnBigokuta_ShootPlayer(EnBigokuta* this, PlayState* play) {
if (&this->picto.actor == player->actor.parent) {
player->actor.parent = NULL;
- player->unk_AE8 = 100;
+ player->actionVar2 = 100;
player->actor.velocity.y = 0.0f;
player->actor.world.pos.x += 20.0f * Math_SinS(this->picto.actor.home.rot.y);
player->actor.world.pos.z += 20.0f * Math_CosS(this->picto.actor.home.rot.y);
@@ -237,7 +237,7 @@ void EnBigokuta_SetupRise(EnBigokuta* this, PlayState* play) {
EffectSsGSplash_Spawn(play, &splashPos, NULL, NULL, 0, Rand_S16Offset(1000, 200));
angle = BINANG_ADD(angle, 0x2000);
}
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_DAIOCTA_LAND);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_DAIOCTA_LAND);
this->actionFunc = EnBigokuta_RiseOutOfWater;
}
@@ -259,7 +259,7 @@ void EnBigokuta_IdleAboveWater(EnBigokuta* this, PlayState* play) {
Math_ApproachS(&this->picto.actor.shape.rot.y, this->picto.actor.yawTowardsPlayer, 5, 0x1000);
if ((this->picto.actor.xzDistToPlayer > 400.0f) || (this->picto.actor.playerHeightRel > 200.0f)) {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_DAIOCTA_SINK);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_DAIOCTA_SINK);
EnBigokuta_SetupIdle(this);
} else if ((this->picto.actor.xzDistToPlayer < 200.0f) && play->grabPlayer(play, GET_PLAYER(play))) {
EnBigokuta_SetupSuckInPlayer(this, play);
@@ -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,13 +289,13 @@ 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;
this->playerHoldPos.z = (Math_CosS(this->picto.actor.shape.rot.y) * 66.0f) + this->picto.actor.world.pos.z;
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_SLIME_DEAD);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_SLIME_DEAD);
this->actionFunc = EnBigokuta_SuckInPlayer;
}
@@ -310,7 +310,7 @@ void EnBigokuta_SuckInPlayer(EnBigokuta* this, PlayState* play) {
this->timer++;
}
- player->unk_AE8 = 0;
+ player->actionVar2 = 0;
Math_Vec3f_Copy(&player->actor.world.pos, &this->playerPos);
if (Math_Vec3f_StepTo(&player->actor.world.pos, &this->playerHoldPos, sqrtf(this->timer) * 5.0f) < 0.1f) {
s16 rotY = this->picto.actor.shape.rot.y;
@@ -347,7 +347,7 @@ void EnBigokuta_HoldPlayer(EnBigokuta* this, PlayState* play) {
if (this->timer == 0) {
EnBigokuta_ShootPlayer(this, play);
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_DAIOCTA_REVERSE);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_DAIOCTA_REVERSE);
}
} else if (this->timer == -24) {
EnBigokuta_SetupIdleAboveWater(this);
@@ -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;
@@ -371,14 +371,14 @@ void EnBigokuta_PlayDeathCutscene(EnBigokuta* this, PlayState* play) {
if (this->timer == 0) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->drawDmgEffAlpha = 0.0f;
- Actor_SpawnIceEffects(play, &this->picto.actor, this->limbPos, ARRAY_COUNT(this->limbPos), 2, 0.5f, 0.35f);
+ Actor_SpawnIceEffects(play, &this->picto.actor, this->bodyPartsPos, BIGOKUTA_BODYPART_MAX, 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,13 +390,13 @@ void EnBigokuta_PlayDeathCutscene(EnBigokuta* this, PlayState* play) {
EnBigokuta_SetupDeathEffects(this);
}
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
void EnBigokuta_SetupDeathEffects(EnBigokuta* this) {
Animation_MorphToPlayOnce(&this->skelAnime, &gBigOctoDeathAnim, -5.0f);
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_DAIOCTA_DEAD2);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_DAIOCTA_DEAD2);
this->picto.actor.flags &= ~1;
this->timer = 10;
this->actionFunc = EnBigokuta_PlayDeathEffects;
@@ -422,7 +422,7 @@ void EnBigokuta_PlayDeathEffects(EnBigokuta* this, PlayState* play) {
dustPos.z = this->picto.actor.world.pos.z;
func_800B0DE0(play, &dustPos, &gZeroVec3f, &gZeroVec3f, &D_80AC45B0, &D_80AC45B4, 1200, 20);
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_OCTAROCK_DEAD2);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_OCTAROCK_DEAD2);
}
} else {
this->picto.actor.world.pos.y -= 0.2f;
@@ -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);
@@ -446,15 +446,15 @@ void EnBigokuta_PlayDeathEffects(EnBigokuta* this, PlayState* play) {
&D_80AC45B8, Rand_S16Offset(150, 50), 25, false);
}
- if (this->picto.actor.params != 0xFF) {
- Flags_SetSwitch(play, this->picto.actor.params);
+ if (EN_BIGOKUTA_GET_SWITCH_FLAG(&this->picto.actor) != 0xFF) {
+ Flags_SetSwitch(play, EN_BIGOKUTA_GET_SWITCH_FLAG(&this->picto.actor));
}
- 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);
@@ -475,7 +475,7 @@ s32 EnBigokuta_IsNearSwampBoat(EnBigokuta* this, PlayState* play) {
this->picto.actor.child = SubS_FindActor(play, NULL, ACTORCAT_BG, ACTOR_BG_INGATE);
if ((this->picto.actor.child != NULL) &&
- (Actor_XZDistanceBetweenActors(&this->picto.actor, this->picto.actor.child) < 250.0f)) {
+ (Actor_WorldDistXZToActor(&this->picto.actor, this->picto.actor.child) < 250.0f)) {
return true;
} else {
return false;
@@ -493,7 +493,7 @@ void EnBigokuta_CheckOneHitKill(EnBigokuta* this, PlayState* play) {
if (this->bodyCollider.info.acHitInfo->toucher.dmgFlags & 0x1000) { // Ice Arrow
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX;
this->drawDmgEffScale = 1.2f;
- this->drawDmgEffFrozenSteamScale = 1.8000001f;
+ this->drawDmgEffFrozenSteamScale = 1800.0f * 0.001f;
this->drawDmgEffAlpha = 1.0f;
} else if (this->bodyCollider.info.acHitInfo->toucher.dmgFlags & 0x2000) { // Light Arrow
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_LIGHT_ORBS;
@@ -501,12 +501,13 @@ void EnBigokuta_CheckOneHitKill(EnBigokuta* this, PlayState* play) {
this->drawDmgEffAlpha = 4.0f;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->bodyCollider.info.bumper.hitPos.x,
this->bodyCollider.info.bumper.hitPos.y, this->bodyCollider.info.bumper.hitPos.z, 0, 0, 0,
- CLEAR_TAG_LARGE_LIGHT_RAYS);
+ CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
}
}
this->bodyCollider.base.acFlags &= ~AC_HIT;
- Actor_SetColorFilter(&this->picto.actor, 0x4000, 255, 0, Animation_GetLastFrame(&gBigOctoDeathAnim));
+ Actor_SetColorFilter(&this->picto.actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA,
+ Animation_GetLastFrame(&gBigOctoDeathAnim));
EnBigokuta_ShootPlayer(this, play);
EnBigokuta_SetupDeathCutscene(this);
}
@@ -551,7 +552,7 @@ void EnBigokuta_Update(Actor* thisx, PlayState* play) {
this->drawDmgEffScale = (this->drawDmgEffAlpha + 1.0f) * 0.6f;
this->drawDmgEffScale = CLAMP_MAX(this->drawDmgEffScale, 1.2f);
} else if (!Math_StepToF(&this->drawDmgEffFrozenSteamScale, 1.2f, 0.030000001f)) {
- func_800B9010(&this->picto.actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->picto.actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
}
}
@@ -562,11 +563,11 @@ s32 EnBigokuta_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
EnBigokuta* this = THIS;
s32 envColor;
s16 rotX;
- f32 lastFrame;
+ f32 endFrame;
if (this->actionFunc == EnBigokuta_PlayDeathEffects) {
- lastFrame = Animation_GetLastFrame(&gBigOctoDeathAnim);
- envColor = ((255.0f / lastFrame) * (lastFrame - this->skelAnime.curFrame));
+ endFrame = Animation_GetLastFrame(&gBigOctoDeathAnim);
+ envColor = ((255.0f / endFrame) * (endFrame - this->skelAnime.curFrame));
} else {
envColor = 255;
}
@@ -603,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),
@@ -612,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 {
@@ -625,26 +626,50 @@ s32 EnBigokuta_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
return false;
}
+static s8 sLimbToBodyParts[BIGOKUTA_LIMB_MAX] = {
+ BODYPART_NONE, // BIGOKUTA_LIMB_NONE
+ BODYPART_NONE, // BIGOKUTA_LIMB_BODY
+ BODYPART_NONE, // BIGOKUTA_LIMB_RIGHT_FRONT_ARM_BASE
+ BIGOKUTA_BODYPART_0, // BIGOKUTA_LIMB_RIGHT_FRONT_ARM_END
+ BODYPART_NONE, // BIGOKUTA_LIMB_LEFT_FRONT_ARM_BASE
+ BIGOKUTA_BODYPART_1, // BIGOKUTA_LIMB_LEFT_FRONT_ARM_END
+ BODYPART_NONE, // BIGOKUTA_LIMB_RIGHT_BACK_ARM_BASE
+ BIGOKUTA_BODYPART_2, // BIGOKUTA_LIMB_RIGHT_BACK_ARM_END
+ BODYPART_NONE, // BIGOKUTA_LIMB_LEFT_BACK_ARM_BASE
+ BIGOKUTA_BODYPART_3, // BIGOKUTA_LIMB_LEFT_BACK_ARM_END
+ BIGOKUTA_BODYPART_8, // BIGOKUTA_LIMB_HEAD
+ BIGOKUTA_BODYPART_4, // BIGOKUTA_LIMB_LEFT_TENTACLE_BASE
+ BODYPART_NONE, // BIGOKUTA_LIMB_LEFT_TENTACLE_TIP
+ BIGOKUTA_BODYPART_5, // BIGOKUTA_LIMB_RIGHT_TENTACLE_BASE
+ BODYPART_NONE, // BIGOKUTA_LIMB_RIGHT_TENTACLE_TIP
+ BODYPART_NONE, // BIGOKUTA_LIMB_LEFT_WEAK_POINT
+ BODYPART_NONE, // BIGOKUTA_LIMB_RIGHT_WEAK_POINT
+ BODYPART_NONE, // BIGOKUTA_LIMB_CENTER_SNOUT
+ BIGOKUTA_BODYPART_6, // BIGOKUTA_LIMB_RIGHT_SNOUT
+ BIGOKUTA_BODYPART_7, // BIGOKUTA_LIMB_LEFT_SNOUT
+};
+
+static Vec3f D_80AC45D0[] = {
+ { 0.0f, 2000.0f, 1000.0f }, // BIGOKUTA_BODYPART_8
+ { 0.0f, 2000.0f, -2000.0f }, // BIGOKUTA_BODYPART_9
+ { 1700.0f, 700.0f, -600.0f }, // BIGOKUTA_BODYPART_10
+ { -1700.0f, 700.0f, -600.0f }, // BIGOKUTA_BODYPART_11
+ { 0.0f, 500.0f, -2500.0f }, // BIGOKUTA_BODYPART_12
+};
+
void EnBigokuta_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx, Gfx** gfx) {
- static s8 D_80AC45BC[] = {
- -1, -1, -1, 0, -1, 1, -1, 2, -1, 3, 8, 4, -1, 5, -1, -1, -1, -1, 6, 7,
- };
- static Vec3f D_80AC45D0[] = {
- { 0.0f, 2000.0f, 1000.0f }, { 0.0f, 2000.0f, -2000.0f }, { 1700.0f, 700.0f, -600.0f },
- { -1700.0f, 700.0f, -600.0f }, { 0.0f, 500.0f, -2500.0f },
- };
EnBigokuta* this = THIS;
s32 i;
- s8 limbPosIndex = D_80AC45BC[limbIndex];
+ s8 bodyPartIndex = sLimbToBodyParts[limbIndex];
- if (limbPosIndex != -1) {
- if (limbPosIndex < 6) {
- Matrix_MultVecX(800.0f, &this->limbPos[limbPosIndex]);
- } else if (limbPosIndex < 8) {
- Matrix_MultZero(&this->limbPos[limbPosIndex]);
+ if (bodyPartIndex != BODYPART_NONE) {
+ if (bodyPartIndex <= BIGOKUTA_BODYPART_5) {
+ Matrix_MultVecX(800.0f, &this->bodyPartsPos[bodyPartIndex]);
+ } else if (bodyPartIndex <= BIGOKUTA_BODYPART_7) {
+ Matrix_MultZero(&this->bodyPartsPos[bodyPartIndex]);
} else {
for (i = 0; i < ARRAY_COUNT(D_80AC45D0); i++) {
- Matrix_MultVec3f(&D_80AC45D0[i], &this->limbPos[limbPosIndex + i]);
+ Matrix_MultVec3f(&D_80AC45D0[i], &this->bodyPartsPos[bodyPartIndex + i]);
}
}
}
@@ -656,10 +681,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,
@@ -667,14 +693,14 @@ 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,
NULL, EnBigokuta_PostLimbDraw, &this->picto.actor, &gfx[2]);
}
- Actor_DrawDamageEffects(play, &this->picto.actor, this->limbPos, ARRAY_COUNT(this->limbPos), this->drawDmgEffScale,
+ Actor_DrawDamageEffects(play, &this->picto.actor, this->bodyPartsPos, BIGOKUTA_BODYPART_MAX, this->drawDmgEffScale,
this->drawDmgEffFrozenSteamScale, this->drawDmgEffAlpha, this->drawDmgEffType);
CLOSE_DISPS(play->state.gfxCtx);
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..5e30eab95 100644
--- a/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.h
+++ b/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.h
@@ -9,6 +9,25 @@ struct EnBigokuta;
typedef void (*EnBigokutaActionFunc)(struct EnBigokuta*, PlayState*);
+#define EN_BIGOKUTA_GET_SWITCH_FLAG(thisx) ((thisx)->params)
+
+typedef enum BigokutaBodyPart {
+ /* 0 */ BIGOKUTA_BODYPART_0,
+ /* 1 */ BIGOKUTA_BODYPART_1,
+ /* 2 */ BIGOKUTA_BODYPART_2,
+ /* 3 */ BIGOKUTA_BODYPART_3,
+ /* 4 */ BIGOKUTA_BODYPART_4,
+ /* 5 */ BIGOKUTA_BODYPART_5,
+ /* 6 */ BIGOKUTA_BODYPART_6,
+ /* 7 */ BIGOKUTA_BODYPART_7,
+ /* 8 */ BIGOKUTA_BODYPART_8,
+ /* 9 */ BIGOKUTA_BODYPART_9,
+ /* 10 */ BIGOKUTA_BODYPART_10,
+ /* 11 */ BIGOKUTA_BODYPART_11,
+ /* 12 */ BIGOKUTA_BODYPART_12,
+ /* 13 */ BIGOKUTA_BODYPART_MAX
+} BigokutaBodyPart;
+
typedef struct EnBigokuta {
/* 0x000 */ PictoActor picto;
/* 0x148 */ SkelAnime skelAnime;
@@ -16,7 +35,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;
@@ -26,7 +45,7 @@ typedef struct EnBigokuta {
/* 0x2A0 */ Vec3f playerHoldPos;
/* 0x2AC */ Vec3f subCamAt;
/* 0x2B8 */ Vec3f subCamEye;
- /* 0x2C4 */ Vec3f limbPos[13];
+ /* 0x2C4 */ Vec3f bodyPartsPos[BIGOKUTA_BODYPART_MAX];
/* 0x360 */ ColliderCylinder shellCollider;
/* 0x3AC */ ColliderCylinder bodyCollider;
} EnBigokuta; // size = 0x3F8
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 2c27a1801..bd17bb873 100644
--- a/src/overlays/actors/ovl_En_Bigpamet/z_en_bigpamet.c
+++ b/src/overlays/actors/ovl_En_Bigpamet/z_en_bigpamet.c
@@ -10,7 +10,7 @@
#include "overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_400)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_400)
#define THIS ((EnBigpamet*)thisx)
@@ -116,16 +116,18 @@ static DamageTable sDamageTable = {
};
TexturePtr D_80A29754[] = {
- object_tl_Tex_0055A0,
- object_tl_Tex_0057A0,
- object_tl_Tex_0059A0,
- object_tl_Tex_0057A0,
+ gSnapperEyeOpenTex,
+ gSnapperEyeHalfTex,
+ gSnapperEyeClosedTex,
+ gSnapperEyeHalfTex,
};
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 1, ICHAIN_CONTINUE), ICHAIN_VEC3F_DIV1000(scale, 15, ICHAIN_CONTINUE),
- ICHAIN_F32(gravity, -2, ICHAIN_CONTINUE), ICHAIN_F32(targetArrowOffset, 4333, ICHAIN_CONTINUE),
- ICHAIN_U8(targetMode, 5, ICHAIN_STOP),
+ ICHAIN_S8(hintId, 1, ICHAIN_CONTINUE),
+ ICHAIN_VEC3F_DIV1000(scale, 15, ICHAIN_CONTINUE),
+ ICHAIN_F32(gravity, -2, ICHAIN_CONTINUE),
+ ICHAIN_F32(targetArrowOffset, 4333, ICHAIN_CONTINUE),
+ ICHAIN_U8(targetMode, TARGET_MODE_5, ICHAIN_STOP),
};
s32 D_80A29778 = 0;
@@ -139,10 +141,10 @@ void EnBigpamet_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->actor, sInitChain);
- SkelAnime_InitFlex(play, &this->skelAnime2, &object_tl_Skel_007C70, &object_tl_Anim_004210, this->jointTable2,
- this->morphTable2, OBJECT_TL_2_LIMB_MAX);
- SkelAnime_InitFlex(play, &this->skelAnime1, &object_tl_Skel_001A50, &object_tl_Anim_000B30, this->jointTable1,
- this->morphTable1, OBJECT_TL_1_LIMB_MAX);
+ SkelAnime_InitFlex(play, &this->snapperSkelAnime, &gSnapperSkel, &gSnapperIdleAnim, this->snapperJointTable,
+ this->snapperMorphTable, SNAPPER_LIMB_MAX);
+ SkelAnime_InitFlex(play, &this->spikedSnapperSkelAnime, &gSpikedSnapperSkel, &gSpikedSnapperIdleAnim,
+ this->spikedSnapperJointTable, this->spikedSnapperMorphTable, SPIKED_SNAPPER_LIMB_MAX);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 55.0f);
@@ -219,7 +221,7 @@ void func_80A2778C(EnBigpamet* this) {
ptr->unk_20 = Rand_ZeroFloat(0.0025000002f) + 0.002f;
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_B_PAMET_BREAK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_B_PAMET_BREAK);
}
void func_80A27970(EnBigpamet* this, PlayState* play2) {
@@ -267,7 +269,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);
@@ -295,7 +297,7 @@ void func_80A27B58(EnBigpamet* this) {
ptr->unk_20 = Rand_ZeroFloat(0.0025000002f) + 0.002f;
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_B_PAMET_BREAK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_B_PAMET_BREAK);
}
void func_80A27DD8(EnBigpamet* this, PlayState* play) {
@@ -342,7 +344,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);
}
@@ -364,7 +366,7 @@ void func_80A2811C(EnBigpamet* this, PlayState* play) {
void func_80A281B4(EnBigpamet* this) {
this->actor.draw = NULL;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actionFunc = func_80A281DC;
}
@@ -386,7 +388,7 @@ void func_80A281DC(EnBigpamet* this, PlayState* play) {
}
void func_80A28274(EnBigpamet* this) {
- Animation_PlayLoop(&this->skelAnime2, &object_tl_Anim_004210);
+ Animation_PlayLoop(&this->snapperSkelAnime, &gSnapperIdleAnim);
this->actor.draw = EnBigpamet_Draw;
this->unk_29E = 20;
this->actionFunc = func_80A282C8;
@@ -408,57 +410,58 @@ void func_80A282C8(EnBigpamet* this, PlayState* play) {
void func_80A28378(EnBigpamet* this) {
this->actor.parent->params = GEKKO_INIT_SNAPPER;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = func_80A283A0;
}
void func_80A283A0(EnBigpamet* this, PlayState* play) {
- SkelAnime_Update(&this->skelAnime2);
+ SkelAnime_Update(&this->snapperSkelAnime);
if (this->actor.parent->params == GEKKO_ON_SNAPPER) {
func_80A28E40(this);
}
}
void func_80A283F0(EnBigpamet* this) {
- Animation_PlayLoop(&this->skelAnime2, &object_tl_Anim_00823C);
- this->actor.speedXZ = 1.0f;
+ Animation_PlayLoop(&this->snapperSkelAnime, &gSnapperWalkAnim);
+ this->actor.speed = 1.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actor.params = ENBIGPAMET_1;
this->actionFunc = func_80A2844C;
}
void func_80A2844C(EnBigpamet* this, PlayState* play) {
- SkelAnime_Update(&this->skelAnime2);
+ SkelAnime_Update(&this->snapperSkelAnime);
if (this->actor.parent->params == GEKKO_RETURN_TO_SNAPPER) {
- Math_ScaledStepToS(&this->actor.shape.rot.y, Actor_YawBetweenActors(&this->actor, this->actor.parent), 0x400);
+ Math_ScaledStepToS(&this->actor.shape.rot.y, Actor_WorldYawTowardActor(&this->actor, this->actor.parent),
+ 0x400);
this->actor.world.rot.y = this->actor.shape.rot.y;
} else if (this->actor.parent->params == GEKKO_JUMP_ON_SNAPPER) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
} else if (this->actor.parent->params == GEKKO_ON_SNAPPER) {
func_80A28E40(this);
}
}
void func_80A284E4(EnBigpamet* this) {
- Animation_MorphToPlayOnce(&this->skelAnime2, &object_tl_Anim_001C68, -3.0f);
+ Animation_MorphToPlayOnce(&this->snapperSkelAnime, &gSnapperRetreatIntoShellAnim, -3.0f);
this->unk_29E = 0;
this->unk_2A8 = 1.0f;
this->unk_2A4 = 1.0f;
- this->actor.speedXZ = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_B_PAMET_VOICE);
- Actor_PlaySfxAtPos(this->actor.parent, NA_SE_EN_FROG_VOICE1);
+ this->actor.speed = 0.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_B_PAMET_VOICE);
+ Actor_PlaySfx(this->actor.parent, NA_SE_EN_FROG_VOICE1);
this->actionFunc = func_80A2855C;
}
void func_80A2855C(EnBigpamet* this, PlayState* play) {
- if (SkelAnime_Update(&this->skelAnime2)) {
+ if (SkelAnime_Update(&this->snapperSkelAnime)) {
func_80A28618(this);
- } else if (this->skelAnime2.curFrame > 2.0f) {
- this->unk_2A8 = 1.5f - ((this->skelAnime2.curFrame - 2.0f) * 0.23333333f);
- this->unk_2A4 = 1.5f - ((this->skelAnime2.curFrame - 2.0f) * 0.083333336f);
+ } else if (this->snapperSkelAnime.curFrame > 2.0f) {
+ this->unk_2A8 = 1.5f - ((this->snapperSkelAnime.curFrame - 2.0f) * 0.23333333f);
+ this->unk_2A4 = 1.5f - ((this->snapperSkelAnime.curFrame - 2.0f) * 0.083333336f);
} else {
- f32 curFrame = this->skelAnime2.curFrame;
+ f32 curFrame = this->snapperSkelAnime.curFrame;
this->unk_2A4 = this->unk_2A8 = (0.25f * curFrame) + 1.0f;
}
@@ -467,8 +470,8 @@ void func_80A2855C(EnBigpamet* this, PlayState* play) {
void func_80A28618(EnBigpamet* this) {
this->actor.draw = func_80A2966C;
this->unk_2A8 = 0.5f;
- this->actor.speedXZ = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PAMET_CUTTER_ON);
+ this->actor.speed = 0.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PAMET_CUTTER_ON);
this->actionFunc = func_80A2866C;
}
@@ -491,18 +494,18 @@ void func_80A286C0(EnBigpamet* this) {
void func_80A28708(EnBigpamet* this, PlayState* play) {
this->unk_29E--;
this->actor.shape.rot.y += 0x3B00;
- func_800B9010(&this->actor, NA_SE_EN_B_PAMET_ROLL - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_B_PAMET_ROLL - SFX_FLAG);
if (this->unk_29E == 0) {
func_80A28760(this);
}
}
void func_80A28760(EnBigpamet* this) {
- this->actor.speedXZ = 15.0f;
- if (this->actor.bgCheckFlags & 8) {
+ this->actor.speed = 15.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
s16 temp_v1 = this->actor.yawTowardsPlayer - this->actor.wallYaw;
- this->actor.bgCheckFlags &= ~8;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_WALL;
if (temp_v1 > 0x3C00) {
this->actor.world.rot.y = this->actor.wallYaw + 0x3C00;
@@ -522,7 +525,7 @@ void func_80A287E8(EnBigpamet* this, PlayState* play) {
s16 quakeIndex;
this->actor.shape.rot.y += 0x3B00;
- func_800B9010(&this->actor, NA_SE_EN_B_PAMET_ROLL - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_B_PAMET_ROLL - SFX_FLAG);
this->unk_29E++;
this->unk_29E = CLAMP_MAX(this->unk_29E, 20);
if (this->collider.base.atFlags & AT_HIT) {
@@ -538,14 +541,14 @@ void func_80A287E8(EnBigpamet* this, PlayState* play) {
func_80A27FE8(this, play);
}
- if (this->actor.bgCheckFlags & 8) {
- quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
+ 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);
@@ -556,11 +559,11 @@ void func_80A287E8(EnBigpamet* this, PlayState* play) {
}
void func_80A28970(EnBigpamet* this) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PAMET_CUTTER_OFF);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PAMET_CUTTER_OFF);
this->actor.shape.rot.z = 0;
this->collider.base.atFlags &= ~AT_ON;
this->collider.info.bumper.dmgFlags = 0xF7CFFFFF;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = func_80A289C8;
}
@@ -574,7 +577,7 @@ void func_80A289C8(EnBigpamet* this, PlayState* play) {
void func_80A28A28(EnBigpamet* this) {
this->actor.draw = EnBigpamet_Draw;
- Animation_MorphToPlayOnce(&this->skelAnime2, &object_tl_Anim_0031DC, -3.0f);
+ Animation_MorphToPlayOnce(&this->snapperSkelAnime, &gSnapperEmergeFromShellAnim, -3.0f);
this->unk_2A8 = 0.1f;
this->unk_2A4 = 1.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
@@ -586,7 +589,7 @@ void func_80A28A98(EnBigpamet* this, PlayState* play) {
Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0x600);
- if (SkelAnime_Update(&this->skelAnime2)) {
+ if (SkelAnime_Update(&this->snapperSkelAnime)) {
if ((this->actor.parent->params == GEKKO_RETURN_TO_SNAPPER) ||
(this->actor.parent->params == GEKKO_JUMP_ON_SNAPPER)) {
func_80A283F0(this);
@@ -594,7 +597,7 @@ void func_80A28A98(EnBigpamet* this, PlayState* play) {
func_80A284E4(this);
}
} else {
- curFrame = this->skelAnime2.curFrame;
+ curFrame = this->snapperSkelAnime.curFrame;
if (curFrame > 7.0f) {
this->unk_2A8 = 1.5f - ((curFrame - 7.0f) * (1.0f / 6.0f));
@@ -609,7 +612,7 @@ void func_80A28A98(EnBigpamet* this, PlayState* play) {
void func_80A28B98(EnBigpamet* this, PlayState* play) {
Actor* collectible;
- Animation_PlayLoop(&this->skelAnime2, &object_tl_Anim_000AF4);
+ Animation_PlayLoop(&this->snapperSkelAnime, &gSnapperDeathAnim);
this->collider.base.atFlags &= ~AT_ON;
this->collider.info.bumper.dmgFlags = 0xF7CFFFFF;
@@ -617,17 +620,17 @@ void func_80A28B98(EnBigpamet* this, PlayState* play) {
this->collider.base.acFlags &= ~AC_ON;
this->actor.velocity.y = 22.0f;
- this->actor.speedXZ = 5.0f;
+ this->actor.speed = 5.0f;
if ((this->actor.draw == func_80A2966C) && (this->actionFunc != func_80A28DC0)) {
this->actor.draw = EnBigpamet_Draw;
} else if (this->collider.base.ac != NULL) {
- this->actor.world.rot.y = BINANG_ROT180(Actor_YawBetweenActors(&this->actor, this->collider.base.ac));
+ this->actor.world.rot.y = BINANG_ROT180(Actor_WorldYawTowardActor(&this->actor, this->collider.base.ac));
}
this->actor.shape.rot.y = this->actor.world.rot.y;
- this->actor.bgCheckFlags &= ~1;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.params = ENBIGPAMET_0;
if ((this->actor.parent->params == GEKKO_ON_SNAPPER) || (this->actor.parent->params == GEKKO_REAR_ON_SNAPPER) ||
@@ -638,17 +641,17 @@ void func_80A28B98(EnBigpamet* this, PlayState* play) {
collectible = Item_DropCollectible(play, &this->actor.world.pos, ITEM00_ARROWS_10);
if (collectible != NULL) {
collectible->velocity.y = 15.0f;
- collectible->world.rot.y = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ collectible->world.rot.y = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_B_PAMET_REVERSE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_B_PAMET_REVERSE);
this->actionFunc = func_80A28D0C;
}
void func_80A28D0C(EnBigpamet* this, PlayState* play) {
- SkelAnime_Update(&this->skelAnime2);
- if (this->actor.bgCheckFlags & 1) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_HIPLOOP_LAND);
+ SkelAnime_Update(&this->snapperSkelAnime);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_HIPLOOP_LAND);
func_80A27FE8(this, play);
func_80A28D80(this);
}
@@ -658,7 +661,7 @@ void func_80A28D0C(EnBigpamet* this, PlayState* play) {
void func_80A28D80(EnBigpamet* this) {
this->actor.draw = func_80A2966C;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.shape.rot.x = 0;
this->actor.shape.rot.z = 0;
this->unk_2A8 = 0.0f;
@@ -678,14 +681,14 @@ void func_80A28DC0(EnBigpamet* this, PlayState* play) {
}
void func_80A28E40(EnBigpamet* this) {
- Animation_MorphToPlayOnce(&this->skelAnime2, &object_tl_Anim_000440, -2.0f);
- this->actor.flags |= ACTOR_FLAG_1;
- this->actor.speedXZ = 0.0f;
+ Animation_MorphToPlayOnce(&this->snapperSkelAnime, &gSnapperRearUpAnim, -2.0f);
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
+ this->actor.speed = 0.0f;
this->actionFunc = func_80A28E98;
}
void func_80A28E98(EnBigpamet* this, PlayState* play) {
- if (SkelAnime_Update(&this->skelAnime2)) {
+ if (SkelAnime_Update(&this->snapperSkelAnime)) {
func_80A284E4(this);
}
}
@@ -758,7 +761,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);
@@ -787,7 +792,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);
@@ -808,10 +813,10 @@ s32 EnBigpamet_OverrideLimbDraw2(PlayState* play, s32 limbIndex, Gfx** dList, Ve
EnBigpamet* this = THIS;
if ((this->actionFunc == func_80A2855C) || (this->actionFunc == func_80A28A98)) {
- if (limbIndex == OBJECT_TL_2_LIMB_02) {
+ if (limbIndex == SNAPPER_LIMB_HEAD) {
Matrix_Scale(this->unk_2A4, this->unk_2A8, this->unk_2A4, MTXMODE_APPLY);
- } else if ((limbIndex == OBJECT_TL_2_LIMB_0B) || (limbIndex == OBJECT_TL_2_LIMB_09) ||
- (limbIndex == OBJECT_TL_2_LIMB_07) || (limbIndex == OBJECT_TL_2_LIMB_05)) {
+ } else if ((limbIndex == SNAPPER_LIMB_BACK_RIGHT_LEG) || (limbIndex == SNAPPER_LIMB_BACK_LEFT_LEG) ||
+ (limbIndex == SNAPPER_LIMB_FRONT_RIGHT_LEG) || (limbIndex == SNAPPER_LIMB_FRONT_LEFT_LEG)) {
Matrix_Scale(this->unk_2A4, this->unk_2A8, this->unk_2A8, MTXMODE_APPLY);
}
}
@@ -821,7 +826,7 @@ s32 EnBigpamet_OverrideLimbDraw2(PlayState* play, s32 limbIndex, Gfx** dList, Ve
void EnBigpamet_PostLimbDraw2(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnBigpamet* this = THIS;
- if (limbIndex == OBJECT_TL_2_LIMB_01) {
+ if (limbIndex == SNAPPER_LIMB_BODY) {
this->unk_2AC = Matrix_GetCurrent()->yw;
}
}
@@ -831,12 +836,13 @@ 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]);
- SkelAnime_DrawFlexOpa(play, this->skelAnime2.skeleton, this->skelAnime2.jointTable, this->skelAnime2.dListCount,
- EnBigpamet_OverrideLimbDraw2, EnBigpamet_PostLimbDraw2, &this->actor);
+ SkelAnime_DrawFlexOpa(play, this->snapperSkelAnime.skeleton, this->snapperSkelAnime.jointTable,
+ this->snapperSkelAnime.dListCount, EnBigpamet_OverrideLimbDraw2, EnBigpamet_PostLimbDraw2,
+ &this->actor);
func_80A292A8(this, play);
CLOSE_DISPS(play->state.gfxCtx);
@@ -845,7 +851,7 @@ void EnBigpamet_Draw(Actor* thisx, PlayState* play) {
s32 EnBigpamet_OverrideLimbDraw1(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnBigpamet* this = THIS;
- if (limbIndex == OBJECT_TL_1_LIMB_01) {
+ if (limbIndex == SPIKED_SNAPPER_LIMB_BODY) {
if (this->actionFunc == func_80A28D0C) {
pos->y -= 2500.0f;
} else {
@@ -853,7 +859,7 @@ s32 EnBigpamet_OverrideLimbDraw1(PlayState* play, s32 limbIndex, Gfx** dList, Ve
}
}
- if ((this->unk_2A8 != 1.0f) && (limbIndex == OBJECT_TL_1_LIMB_03)) {
+ if ((this->unk_2A8 != 1.0f) && (limbIndex == SPIKED_SNAPPER_LIMB_SPIKES)) {
Matrix_Scale(1.0f, this->unk_2A8, this->unk_2A8, MTXMODE_APPLY);
}
@@ -863,7 +869,7 @@ s32 EnBigpamet_OverrideLimbDraw1(PlayState* play, s32 limbIndex, Gfx** dList, Ve
void EnBigpamet_PostLimbDraw1(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnBigpamet* this = THIS;
- if (limbIndex == OBJECT_TL_1_LIMB_01) {
+ if (limbIndex == SPIKED_SNAPPER_LIMB_BODY) {
this->unk_2AC = Matrix_GetCurrent()->yw;
}
}
@@ -871,8 +877,9 @@ 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);
- SkelAnime_DrawFlexOpa(play, this->skelAnime1.skeleton, this->skelAnime1.jointTable, this->skelAnime1.dListCount,
- EnBigpamet_OverrideLimbDraw1, EnBigpamet_PostLimbDraw1, &this->actor);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ SkelAnime_DrawFlexOpa(play, this->spikedSnapperSkelAnime.skeleton, this->spikedSnapperSkelAnime.jointTable,
+ this->spikedSnapperSkelAnime.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..eeb97566e 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;
@@ -22,12 +22,12 @@ typedef struct {
typedef struct EnBigpamet {
/* 0x000 */ Actor actor;
- /* 0x144 */ SkelAnime skelAnime2;
- /* 0x188 */ Vec3s jointTable2[OBJECT_TL_2_LIMB_MAX];
- /* 0x1D6 */ Vec3s morphTable2[OBJECT_TL_2_LIMB_MAX];
- /* 0x224 */ SkelAnime skelAnime1;
- /* 0x268 */ Vec3s jointTable1[OBJECT_TL_1_LIMB_MAX];
- /* 0x280 */ Vec3s morphTable1[OBJECT_TL_1_LIMB_MAX];
+ /* 0x144 */ SkelAnime snapperSkelAnime;
+ /* 0x188 */ Vec3s snapperJointTable[SNAPPER_LIMB_MAX];
+ /* 0x1D6 */ Vec3s snapperMorphTable[SNAPPER_LIMB_MAX];
+ /* 0x224 */ SkelAnime spikedSnapperSkelAnime;
+ /* 0x268 */ Vec3s spikedSnapperJointTable[SPIKED_SNAPPER_LIMB_MAX];
+ /* 0x280 */ Vec3s spikedSnapperMorphTable[SPIKED_SNAPPER_LIMB_MAX];
/* 0x298 */ EnBigpametActionFunc actionFunc;
/* 0x29C */ u8 unk_29C;
/* 0x29E */ s16 unk_29E;
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 5398418f2..e754ff5b8 100644
--- a/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.c
+++ b/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.c
@@ -5,10 +5,11 @@
*/
#include "z_en_bigpo.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#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_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_200 | ACTOR_FLAG_IGNORE_QUAKE)
#define THIS ((EnBigpo*)thisx)
@@ -159,16 +160,24 @@ static InitChainEntry sInitChain[] = {
// used in the burning death actionfunc
static Vec3f D_80B6506C = { 0.0f, 3.0f, 0.0f };
-// bytes per limb, used in draw func? bit over my head
-static u8 D_80B65078[] = {
- -1, 4, -1, 0, -1, 1, -1, 2, 5, 3,
+static s8 sLimbToBodyParts[BIG_POE_LIMB_MAX] = {
+ BODYPART_NONE, // BIG_POE_LIMB_NONE
+ BIG_POE_BODYPART_4, // BIG_POE_LIMB_FACE
+ BODYPART_NONE, // BIG_POE_LIMB_LEFT_UPPER_ARM
+ BIG_POE_BODYPART_0, // BIG_POE_LIMB_LEFT_FOREARM
+ BODYPART_NONE, // BIG_POE_LIMB_RIGHT_UPPER_ARM
+ BIG_POE_BODYPART_1, // BIG_POE_LIMB_RIGHT_FOREARM
+ BODYPART_NONE, // BIG_POE_LIMB_RIGHT_HAND
+ BIG_POE_BODYPART_2, // BIG_POE_LIMB_LANTERN
+ BIG_POE_BODYPART_5, // BIG_POE_LIMB_HAT_AND_CLOAK
+ BIG_POE_BODYPART_3, // BIG_POE_LIMB_LOWER_ROBE
};
// used in limbdraw
static Vec3f D_80B65084[] = {
- { 2000.0f, 4000.0f, 0.0f },
- { -1000.0f, 1500.0f, -2000.0f },
- { -1000.0f, 1500.0f, 2000.0f },
+ { 2000.0f, 4000.0f, 0.0f }, // BIG_POE_BODYPART_6
+ { -1000.0f, 1500.0f, -2000.0f }, // BIG_POE_BODYPART_7
+ { -1000.0f, 1500.0f, 2000.0f }, // BIG_POE_BODYPART_8
};
void EnBigpo_Init(Actor* thisx, PlayState* play2) {
@@ -179,10 +188,10 @@ void EnBigpo_Init(Actor* thisx, PlayState* play2) {
Actor_ProcessInitChain(&this->actor, sInitChain);
- this->switchFlags = BIGPO_GET_SWITCHFLAGS(thisx);
+ this->switchFlag = BIG_POE_GET_SWITCH_FLAG(thisx);
thisx->params &= 0xFF;
- if (thisx->params == ENBIGPO_POSSIBLEFIRE) {
- if (Flags_GetSwitch(play, this->switchFlags)) {
+ if (thisx->params == BIG_POE_TYPE_POSSIBLE_FIRE) {
+ if (Flags_GetSwitch(play, this->switchFlag)) {
Actor_Kill(&this->actor);
return;
}
@@ -192,8 +201,8 @@ void EnBigpo_Init(Actor* thisx, PlayState* play2) {
return;
}
- SkelAnime_Init(play, &this->skelAnime, &gBigpoSkeleton, &gBigpoFloatAnim, this->jointTable, this->morphTable,
- ENBIGPO_LIMBCOUNT);
+ SkelAnime_Init(play, &this->skelAnime, &gBigPoeSkel, &gBigPoeFloatAnim, this->jointTable, this->morphTable,
+ BIG_POE_LIMB_MAX);
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo(&thisx->colChkInfo, &sDamageTable, &sColChkInfoInit);
@@ -206,22 +215,22 @@ void EnBigpo_Init(Actor* thisx, PlayState* play2) {
}
ActorShape_Init(&thisx->shape, 0.0f, ActorShadow_DrawCircle, 45.0f);
- thisx->bgCheckFlags |= 0x400;
+ thisx->bgCheckFlags |= BGCHECKFLAG_PLAYER_400;
this->savedHeight = thisx->home.pos.y + 100.0f;
this->mainColor.r = 255;
this->mainColor.g = 255;
this->mainColor.b = 210;
this->mainColor.a = 0; // fully invisible
- if ((this->switchFlags != 0xFF) && (Flags_GetSwitch(play, this->switchFlags))) {
+ if ((this->switchFlag != 0xFF) && (Flags_GetSwitch(play, this->switchFlag))) {
Actor_Kill(&this->actor);
}
- if (thisx->params == ENBIGPO_REGULAR) { // the well poe, starts immediately
- thisx->flags &= ~ACTOR_FLAG_10; // always update OFF
+ if (thisx->params == BIG_POE_TYPE_REGULAR) { // the well poe, starts immediately
+ thisx->flags &= ~ACTOR_FLAG_10; // always update OFF
this->storePrevBgm = true;
EnBigpo_InitWellBigpo(this);
- } else if (thisx->params == ENBIGPO_SUMMONED) { // dampe type
+ } else if (thisx->params == BIG_POE_TYPE_SUMMONED) { // dampe type
EnBigpo_InitDampeMainPo(this);
}
}
@@ -231,10 +240,9 @@ void EnBigpo_Destroy(Actor* thisx, PlayState* play2) {
EnBigpo* this = THIS;
s32 fireCount;
- if ((this->actor.params != ENBIGPO_POSSIBLEFIRE) && (this->actor.params != ENBIGPO_CHOSENFIRE) &&
- (this->actor.params != ENBIGPO_REVEALEDFIRE) && (this->actor.params != ENBIGPO_UNK5)) {
- // if NOT a fire type, *ENBIGPO_REGULAR and ENBIGPO_SUMMONED (combat types only)
- if (1) {}
+ if ((thisx->params != BIG_POE_TYPE_POSSIBLE_FIRE) && (thisx->params != BIG_POE_TYPE_CHOSEN_FIRE) &&
+ (thisx->params != BIG_POE_TYPE_REVEALED_FIRE) && (thisx->params != BIG_POE_TYPE_UNK5)) {
+ // if NOT a fire type, *BIG_POE_TYPE_REGULAR and BIG_POE_TYPE_SUMMONED (combat types only)
for (fireCount = 0; fireCount < ARRAY_COUNT(this->fires); fireCount++) {
LightContext_RemoveLight(play, &play->lightCtx, this->fires[fireCount].light);
}
@@ -259,7 +267,7 @@ void EnBigpo_UpdateSpin(EnBigpo* this) {
this->actor.shape.rot.y += this->rotVelocity;
if ((oldYaw < 0) && (this->actor.shape.rot.y > 0)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_ROLL); // spinning sfx during spin attack
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_ROLL); // spinning sfx during spin attack
}
}
@@ -281,7 +289,7 @@ void EnBigpo_LowerCutsceneSubCamera(EnBigpo* this, PlayState* play) {
}
void EnBigpo_InitWellBigpo(EnBigpo* this) {
- this->actor.flags &= ~ACTOR_FLAG_1; // targetable OFF
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actionFunc = EnBigpo_WellWaitForProximity;
this->fireRadius = 200.0f;
}
@@ -293,22 +301,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 (this->actor.params == ENBIGPO_REGULAR) { // and SUMMONED, got switched earlier
+ 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 == BIG_POE_TYPE_REGULAR) { // and SUMMONED, got switched earlier
EnBigpo_SpawnCutsceneStage1(this, play);
- } else { // ENBIGPO_REVEALEDFIRE
+ } else { // BIG_POE_TYPE_REVEALED_FIRE
EnBigpo_SetupFlameCirclePositions(this, play);
}
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -375,7 +383,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;
}
@@ -392,10 +399,10 @@ void EnBigpo_SpawnCutsceneStage4(EnBigpo* this, PlayState* play) {
* big poe starts to visibly appear
*/
void EnBigpo_SpawnCutsceneStage5(EnBigpo* this) {
- Animation_PlayLoop(&this->skelAnime, &gBigpoAwakenStretchAnim);
+ Animation_PlayLoop(&this->skelAnime, &gBigPoeAwakenStretchAnim);
this->actor.draw = EnBigpo_DrawMainBigpo;
Actor_SetScale(&this->actor, 0.014f);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_APPEAR);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_APPEAR);
this->actionFunc = EnBigpo_SpawnCutsceneStage6;
}
@@ -460,18 +467,18 @@ void EnBigpo_SpawnCutsceneStage8(EnBigpo* 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;
- if (this->actor.params == ENBIGPO_SUMMONED) {
+ if (this->actor.params == BIG_POE_TYPE_SUMMONED) {
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);
+ } else { // BIG_POE_TYPE_REGULAR
+ 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
}
}
@@ -481,9 +488,9 @@ void EnBigpo_SetupWarpOut(EnBigpo* this) {
this->collider.base.ocFlags1 &= ~OC1_ON;
this->rotVelocity = 0x2000;
this->idleTimer = 32;
- this->actor.flags &= ~ACTOR_FLAG_1; // targetable OFF
- this->actor.speedXZ = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_DISAPPEAR);
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ this->actor.speed = 0.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_DISAPPEAR);
this->actionFunc = EnBigpo_WarpingOut;
}
@@ -505,8 +512,8 @@ void EnBigpo_SetupWarpIn(EnBigpo* this, PlayState* play) {
f32 distance = CLAMP_MIN(this->actor.xzDistToPlayer, 200.0f);
s16 randomYaw = ((s32)Rand_Next() >> 0x14) + this->actor.yawTowardsPlayer;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_APPEAR);
- Animation_PlayLoop(&this->skelAnime, &gBigpoAwakenStretchAnim);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_APPEAR);
+ Animation_PlayLoop(&this->skelAnime, &gBigPoeAwakenStretchAnim);
this->rotVelocity = 0x2000;
this->actor.world.pos.x = (Math_SinS(randomYaw) * distance) + player->actor.world.pos.x;
this->actor.world.pos.z = (Math_CosS(randomYaw) * distance) + player->actor.world.pos.z;
@@ -533,7 +540,7 @@ void EnBigpo_WarpingIn(EnBigpo* this, PlayState* play) {
}
void EnBigpo_SetupIdleFlying(EnBigpo* this) {
- Animation_MorphToLoop(&this->skelAnime, &gBigpoFloatAnim, -5.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gBigPoeFloatAnim, -5.0f);
// if poe missed attack, idle 4 seconds, otherwise its reappearing: attack immediately
this->idleTimer = (this->actionFunc == EnBigpo_SpinningDown) ? 80 : 0;
this->hoverHeightCycleTimer = 40;
@@ -542,7 +549,7 @@ void EnBigpo_SetupIdleFlying(EnBigpo* this) {
this->actor.world.rot.y = this->actor.shape.rot.y;
this->collider.base.acFlags |= AC_ON;
this->collider.base.ocFlags1 |= OC1_ON;
- this->actor.flags |= ACTOR_FLAG_1; // targetable ON
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actionFunc = EnBigpo_IdleFlying;
}
@@ -555,11 +562,11 @@ 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;
- Math_StepToF(&this->actor.speedXZ, 3.0f, 0.2f);
- func_800B9010(&this->actor, NA_SE_EN_PO_FLY - SFX_FLAG);
- if (Actor_XZDistanceToPoint(&this->actor, &this->actor.home.pos) > 300.0f) {
- this->unk208 = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ 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);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_PO_FLY - SFX_FLAG);
+ if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) > 300.0f) {
+ this->unk208 = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
}
if (Math_ScaledStepToS(&this->actor.shape.rot.y, this->unk208, 0x200) && (Rand_ZeroOne() < 0.075f)) {
@@ -580,7 +587,7 @@ void EnBigpo_SetupSpinUp(EnBigpo* this) {
this->collider.base.atFlags |= AT_ON;
this->rotVelocity = 0x800;
this->actionFunc = EnBigpo_SpinningUp;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
void EnBigpo_SpinningUp(EnBigpo* this, PlayState* play) {
@@ -603,7 +610,7 @@ void EnBigpo_SpinAttack(EnBigpo* this, PlayState* play) {
s16 yawDiff;
SkelAnime_Update(&this->skelAnime);
- Math_StepToF(&this->actor.speedXZ, 10.0f, 1.0f);
+ Math_StepToF(&this->actor.speed, 10.0f, 1.0f);
Math_SmoothStepToF(&this->actor.world.pos.y, player->actor.world.pos.y, 0.3f, 7.5f, 1.0f);
EnBigpo_UpdateSpin(this);
yawDiff = this->actor.yawTowardsPlayer - this->actor.world.rot.y;
@@ -628,7 +635,7 @@ void EnBigpo_SpinningDown(EnBigpo* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
Math_SmoothStepToF(&this->actor.world.pos.y, player->actor.world.pos.y + 100.0f, 0.3f, 5.0f, 1.0f);
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.2f);
+ Math_StepToF(&this->actor.speed, 0.0f, 0.2f);
if (Math_ScaledStepToS(&this->rotVelocity, 0, 0x200)) {
// spin down complete, re-allow hittable
this->collider.base.colType = COLTYPE_HIT3;
@@ -644,19 +651,19 @@ void EnBigpo_SpinningDown(EnBigpo* this, PlayState* play) {
* called by EnBigpo_ApplyDamage
*/
void EnBigpo_HitStun(EnBigpo* this) {
- Animation_MorphToPlayOnce(&this->skelAnime, &gBigpoShockAnim, -6.0f);
- Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, 0, 0x10);
+ Animation_MorphToPlayOnce(&this->skelAnime, &gBigPoeShockAnim, -6.0f);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 16);
this->collider.base.acFlags &= ~AC_ON;
func_800BE504(&this->actor, &this->collider);
this->actionFunc = EnBigpo_CheckHealth;
- this->actor.speedXZ = 5.0f;
+ this->actor.speed = 5.0f;
}
/*
* check if just damaged or dead
*/
void EnBigpo_CheckHealth(EnBigpo* this, PlayState* play) {
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f);
+ Math_StepToF(&this->actor.speed, 0.0f, 0.5f);
if (SkelAnime_Update(&this->skelAnime)) {
if (this->actor.colChkInfo.health == 0) {
EnBigpo_SetupDeath(this);
@@ -668,7 +675,7 @@ void EnBigpo_CheckHealth(EnBigpo* this, PlayState* play) {
void EnBigpo_SetupDeath(EnBigpo* this) {
this->idleTimer = 0;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actor.hintId = TATL_HINT_ID_NONE;
this->collider.base.ocFlags1 &= ~OC1_ON;
@@ -689,21 +696,20 @@ void EnBigpo_BurnAwayDeath(EnBigpo* this, PlayState* play) {
if (this->idleTimer < 8) {
camYaw = Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) + 0x4800;
if (this->idleTimer < 5) {
- unkTemp = (this->idleTimer << 0xC) - 0x4000;
- // 1.4.0...1 is NOT 1.4, the rodata demands it
- tempVec.y = (((Math_SinS(unkTemp) * 23.0f) + 40.0f) * 1.4000001f) + this->actor.world.pos.y;
+ unkTemp = (this->idleTimer * 0x1000) - 0x4000;
+ tempVec.y = (((Math_SinS(unkTemp) * 23.0f) + 40.0f) * (1400.0f * 0.001f)) + this->actor.world.pos.y;
unkTemp2 = Math_CosS(unkTemp) * 32.2f;
tempVec.x = (Math_SinS(camYaw) * unkTemp2) + this->actor.world.pos.x;
tempVec.z = (Math_CosS(camYaw) * unkTemp2) + this->actor.world.pos.z;
} else {
- tempVec.y = this->actor.world.pos.y + ((40.0f + (15.0f * (this->idleTimer - 5))) * 1.4000001f);
+ tempVec.y = this->actor.world.pos.y + ((40.0f + (15.0f * (this->idleTimer - 5))) * (1400.0f * 0.001f));
tempVec.x = (Math_SinS(camYaw) * 32.2f) + this->actor.world.pos.x;
tempVec.z = (Math_CosS(camYaw) * 32.2f) + this->actor.world.pos.z;
}
// not sure what we're turning this into, but its based on the timer
- modifiedTimer = ((f32)((this->idleTimer * 10) + 80) * 1.4000001f);
+ modifiedTimer = ((this->idleTimer * 10) + 80) * (1400.0f * 0.001f);
func_800B3030(play, &tempVec, &D_80B6506C, &gZeroVec3f, modifiedTimer, 0, 2);
tempVec.x = (2.0f * this->actor.world.pos.x) - tempVec.x;
tempVec.z = (2.0f * this->actor.world.pos.z) - tempVec.z;
@@ -722,10 +728,10 @@ void EnBigpo_BurnAwayDeath(EnBigpo* this, PlayState* play) {
}
if (this->idleTimer < 18) {
- func_800B9010(&this->actor, NA_SE_EN_COMMON_EXTINCT_LEV - SFX_FLAG); // burning sfx
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_COMMON_EXTINCT_LEV - SFX_FLAG); // burning sfx
}
if (this->idleTimer == 18) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WIZ_DISAPPEAR);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WIZ_DISAPPEAR);
}
}
@@ -743,19 +749,19 @@ void EnBigpo_SetupLanternDrop(EnBigpo* this, PlayState* play) {
this->actor.velocity.y = 0.0f;
this->actor.world.pos.y -= 15.0f;
func_800BC154(play, &play->actorCtx, &this->actor, ACTORCAT_MISC);
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_4); // targetable OFF, enemy music OFF
- this->actor.bgCheckFlags &= ~0x400;
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY); // targetable OFF, enemy music OFF
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_PLAYER_400;
this->actionFunc = EnBigpo_LanternFalling;
}
void EnBigpo_LanternFalling(EnBigpo* this, PlayState* play) {
- if (this->actor.bgCheckFlags & 1 || this->actor.floorHeight == BGCHECK_Y_MIN) {
- if (this->switchFlags != 0xFF) {
- Flags_SetSwitch(play, this->switchFlags);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND || this->actor.floorHeight == BGCHECK_Y_MIN) {
+ if (this->switchFlag != 0xFF) {
+ Flags_SetSwitch(play, this->switchFlag);
}
EffectSsHahen_SpawnBurst(play, &this->actor.world.pos, 6.0f, 0, 1, 1, 15, OBJECT_BIGPO, 10,
- gBigpoDrawLanternFallingDL);
+ gBigPoeLanternFallingDL);
EnBigpo_SpawnScoopSoul(this);
}
}
@@ -795,7 +801,7 @@ void EnBigpo_SpawnScoopSoul(EnBigpo* this) {
this->actor.scale.x = 0.0f;
this->actor.scale.y = 0.0f;
this->savedHeight = this->actor.world.pos.y;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_METAL_BOX_BOUND); // misnamed?
+ Actor_PlaySfx(&this->actor, NA_SE_EV_METAL_BOX_BOUND); // misnamed?
this->actionFunc = EnBigpo_ScoopSoulAppearing;
}
@@ -810,8 +816,8 @@ void EnBigpo_ScoopSoulAppearing(EnBigpo* this, PlayState* play) {
void EnBigpo_SetupScoopSoulIdle(EnBigpo* this) {
this->savedHeight = this->actor.world.pos.y;
Actor_SetFocus(&this->actor, -10.0f);
- this->idleTimer = 400; // 20 seconds
- this->actor.flags |= ACTOR_FLAG_1; // targetable ON
+ this->idleTimer = 400; // 20 seconds
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actionFunc = EnBigpo_ScoopSoulIdle;
}
@@ -824,16 +830,16 @@ void EnBigpo_ScoopSoulIdle(EnBigpo* this, PlayState* play) {
if (this->idleTimer == 0) {
// took too long, soul is leaving
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_LAUGH);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_LAUGH);
EnBigpo_SetupScoopSoulLeaving(this);
} else {
- Actor_PickUp(&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;
+ Actor_OfferGetItem(&this->actor, play, GI_MAX, 35.0f, 60.0f);
+ this->actor.world.pos.y = (Math_SinF(this->idleTimer * (M_PI / 20)) * 5.0f) + this->savedHeight;
}
}
void EnBigpo_SetupScoopSoulLeaving(EnBigpo* this) {
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_10000); // targetable OFF and unknown OFF
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_10000); // unknown OFF
this->actionFunc = EnBigpo_ScoopSoulFadingAway;
}
@@ -845,7 +851,7 @@ void EnBigpo_ScoopSoulFadingAway(EnBigpo* this, PlayState* play) {
}
void EnBigpo_InitDampeMainPo(EnBigpo* this) {
- this->actor.flags &= ~ACTOR_FLAG_1; // targetable OFF
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actionFunc = EnBigpo_SelectRandomFireLocations;
}
@@ -861,7 +867,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 == BIG_POE_TYPE_POSSIBLE_FIRE)) {
fireCount++;
}
}
@@ -882,16 +888,16 @@ 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 == BIG_POE_TYPE_POSSIBLE_FIRE)) {
if (randomIndex == 0) {
randomFirePo = (EnBigpo*)enemyPtr;
- randomFirePo->actor.params = ENBIGPO_CHOSENFIRE;
+ randomFirePo->actor.params = BIG_POE_TYPE_CHOSEN_FIRE;
Math_Vec3f_Copy(&this->fires[fireIndex].pos, &randomFirePo->actor.world.pos);
randomFirePo->actor.parent = (Actor*)this;
randomFirePo->actor.update = EnBigpo_UpdateFire;
func_800BC154(play, &play->actorCtx, &randomFirePo->actor, ACTORCAT_PROP);
randomFirePo->unk20C = fireIndex;
- randomFirePo->actor.flags &= ~ACTOR_FLAG_1; // targetable OFF
+ randomFirePo->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
// make invisible by size: 0
Actor_SetScale(&randomFirePo->actor, 0);
@@ -902,9 +908,9 @@ void EnBigpo_SelectRandomFireLocations(EnBigpo* this, PlayState* play) {
this->actor.child = &randomFirePo->actor;
}
break;
- } else {
- randomIndex--;
}
+
+ randomIndex--;
}
enemyPtr = enemyPtr->next;
}
@@ -912,7 +918,7 @@ void EnBigpo_SelectRandomFireLocations(EnBigpo* this, PlayState* play) {
// remove unused fires
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 == BIG_POE_TYPE_POSSIBLE_FIRE)) {
randomFirePo = (EnBigpo*)enemyPtr;
randomFirePo->actionFunc = EnBigpo_Die;
randomFirePo->actor.update = EnBigpo_UpdateFire;
@@ -935,7 +941,7 @@ void EnBigpo_FireCounting(EnBigpo* this, PlayState* play) {
s32 activatedFireCount = 0;
for (firePo = (EnBigpo*)this->actor.child; firePo; firePo = (EnBigpo*)firePo->actor.child) {
- if (firePo->actor.params == ENBIGPO_REVEALEDFIRE && firePo->actionFunc == EnBigpo_RevealedFireIdle) {
+ if ((firePo->actor.params == BIG_POE_TYPE_REVEALED_FIRE) && (firePo->actionFunc == EnBigpo_RevealedFireIdle)) {
activatedFireCount++;
}
}
@@ -974,10 +980,10 @@ void EnBigpo_InitHiddenFire(EnBigpo* this) {
/*
* idle until dampe finds this file by
- * changing this file params from ENBIGPO_POSSIBLEFIRE into ENBIGPO_REVEALEDFIRE
+ * changing this file params from BIG_POE_TYPE_POSSIBLE_FIRE into BIG_POE_TYPE_REVEALED_FIRE
*/
void EnBigpo_WaitingForDampe(EnBigpo* this, PlayState* play) {
- if (this->actor.params == ENBIGPO_REVEALEDFIRE) {
+ if (this->actor.params == BIG_POE_TYPE_REVEALED_FIRE) {
EnBigpo_SetupFireRevealed(this);
}
}
@@ -1012,11 +1018,11 @@ void EnBigpo_RevealedFireIdle(EnBigpo* this, PlayState* play) {
if (this->idleTimer > 0) {
if (this->idleTimer == 0) {
//! @bug: unreachable code
- this->actor.params = ENBIGPO_UNK5;
+ this->actor.params = BIG_POE_TYPE_UNK5;
}
} else {
if (Math_StepToF(&this->actor.scale.x, 0.0f, 0.001f)) {
- this->actor.params = ENBIGPO_CHOSENFIRE;
+ this->actor.params = BIG_POE_TYPE_CHOSEN_FIRE;
EnBigpo_InitHiddenFire(this);
}
this->actor.scale.z = this->actor.scale.x;
@@ -1045,7 +1051,8 @@ void EnBigpo_FlameCircleCutscene(EnBigpo* this, PlayState* play) {
this->idleTimer--;
if (this->idleTimer == 0) {
EnBigpo* parentPoh = (EnBigpo*)this->actor.parent;
- Flags_SetSwitch(play, this->switchFlags);
+
+ Flags_SetSwitch(play, this->switchFlag);
Math_Vec3f_Copy(&parentPoh->fires[this->unk20C].pos, &this->actor.world.pos);
Actor_Kill(&this->actor);
if (this->unk20C == 0) {
@@ -1122,14 +1129,14 @@ s32 EnBigpo_ApplyDamage(EnBigpo* this, PlayState* play) {
}
if (Actor_ApplyDamage(&this->actor) == 0) {
- this->actor.flags &= ~ACTOR_FLAG_1; // targetable OFF
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_DEAD);
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_DEAD);
Enemy_StartFinishingBlow(play, &this->actor);
- if (this->actor.params == ENBIGPO_SUMMONED) { // dampe type
+ if (this->actor.params == BIG_POE_TYPE_SUMMONED) { // dampe type
Audio_RestorePrevBgm();
}
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_DAMAGE);
}
// light arrows
@@ -1138,7 +1145,7 @@ s32 EnBigpo_ApplyDamage(EnBigpo* this, PlayState* play) {
this->drawDmgEffScale = 1.0f;
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);
+ CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
}
EnBigpo_HitStun(this);
return true;
@@ -1157,14 +1164,14 @@ void EnBigpo_Update(Actor* thisx, PlayState* play) {
}
if (EnBigpo_ApplyDamage(this, play) == 0) {
- if ((this->actor.isTargeted) && (this->actionFunc != EnBigpo_WarpingOut) &&
+ if ((this->actor.isLockedOn) && (this->actionFunc != EnBigpo_WarpingOut) &&
!(this->collider.base.acFlags & AC_HARD) && (this->actor.category == ACTORCAT_ENEMY)) {
this->unk20C++;
} else {
this->unk20C = 0;
}
if (this->unk20C == 40) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_LAUGH);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_LAUGH);
EnBigpo_SetupWarpOut(this);
}
}
@@ -1174,7 +1181,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) {
@@ -1206,7 +1213,7 @@ void EnBigpo_Update(Actor* thisx, PlayState* play) {
this->drawDmgEffAlpha = this->mainColor.a * (1.0f / 255.0f);
}
}
- this->drawDmgEffScale = ((this->drawDmgEffAlpha + 1.0f) * 0.5f);
+ this->drawDmgEffScale = (this->drawDmgEffAlpha + 1.0f) * 0.5f;
this->drawDmgEffScale = CLAMP_MAX(this->drawDmgEffScale, 1.0f);
}
}
@@ -1225,8 +1232,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 == BIG_POE_LIMB_LANTERN) ||
+ ((this->actionFunc == EnBigpo_BurnAwayDeath) && (this->idleTimer >= 2))) {
*dList = NULL;
}
return false;
@@ -1234,7 +1241,7 @@ s32 EnBigpo_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
void EnBigpo_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx, Gfx** gfx) {
EnBigpo* this = THIS;
- s8 limbByte;
+ s8 bodyPartIndex;
Vec3f* v1ptr; // todo: figure out better names
Vec3f* v2ptr;
Vec3f unusedVec;
@@ -1242,12 +1249,13 @@ void EnBigpo_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* ro
OPEN_DISPS(play->state.gfxCtx);
- if ((this->actionFunc == EnBigpo_BurnAwayDeath) && (this->idleTimer >= 2) && (limbIndex == 8)) {
+ if ((this->actionFunc == EnBigpo_BurnAwayDeath) && (this->idleTimer >= 2) &&
+ (limbIndex == BIG_POE_LIMB_HAT_AND_CLOAK)) {
gSPMatrix((*gfx)++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList((*gfx)++, &gBigpoDrawCrispyBodyDL);
+ gSPDisplayList((*gfx)++, &gBigPoeCrispyBodyDL);
}
- if (limbIndex == 7) {
+ if (limbIndex == BIG_POE_LIMB_LANTERN) {
// we scale the vec3f... then do nothing with it?
Matrix_MultVecY(1400.0f, &unusedVec);
if ((this->actionFunc == EnBigpo_BurnAwayDeath) && (this->idleTimer > 18)) {
@@ -1259,20 +1267,21 @@ void EnBigpo_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* ro
Matrix_Get(&this->drawMtxF);
}
- limbByte = D_80B65078[limbIndex];
- if (limbByte != -1) {
- if (limbByte < 3) {
- Matrix_MultZero(&this->limbPos[limbByte]);
- } else if (limbByte == 3) {
- Matrix_MultVecX(3000.0f, &this->limbPos[limbByte]);
- } else if (limbByte == 4) {
- Matrix_MultVecY(-2000.0f, &this->limbPos[limbByte]);
+ bodyPartIndex = sLimbToBodyParts[limbIndex];
+ if (bodyPartIndex != BODYPART_NONE) {
+ if (bodyPartIndex <= BIG_POE_BODYPART_2) {
+ Matrix_MultZero(&this->bodyPartsPos[bodyPartIndex]);
+ } else if (bodyPartIndex == BIG_POE_BODYPART_3) {
+ Matrix_MultVecX(3000.0f, &this->bodyPartsPos[bodyPartIndex]);
+ } else if (bodyPartIndex == BIG_POE_BODYPART_4) {
+ Matrix_MultVecY(-2000.0f, &this->bodyPartsPos[bodyPartIndex]);
} else {
- v2ptr = &this->limbPos[limbByte + 1];
+ v2ptr = &this->bodyPartsPos[bodyPartIndex + 1];
v1ptr = D_80B65084;
- Matrix_MultVecX(-4000.0f, &this->limbPos[limbByte]);
+ // BIG_POE_BODYPART_5
+ Matrix_MultVecX(-4000.0f, &this->bodyPartsPos[bodyPartIndex]);
- for (i = limbByte + 1; i < ARRAY_COUNT(this->limbPos); i++) {
+ for (i = bodyPartIndex + 1; i < BIG_POE_BODYPART_MAX; i++) {
Matrix_MultVec3f(v1ptr, v2ptr);
v2ptr++;
v1ptr++;
@@ -1291,7 +1300,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 +1310,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,
@@ -1311,7 +1320,7 @@ void EnBigpo_DrawMainBigpo(Actor* thisx, PlayState* play) {
}
// 71.428566f might be 500/7 context unknown
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos),
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, BIG_POE_BODYPART_MAX,
this->actor.scale.x * 71.428566f * this->drawDmgEffScale, 0.0f, this->drawDmgEffAlpha,
ACTOR_DRAW_DMGEFF_LIGHT_ORBS);
@@ -1330,7 +1339,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,
@@ -1348,7 +1357,7 @@ void EnBigpo_DrawScoopSoul(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++, &gBigpoDrawSoulDL);
+ gSPDisplayList(POLY_XLU_DISP++, &gBigPoeSoulDL);
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -1382,7 +1391,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));
@@ -1394,9 +1403,9 @@ void EnBigpo_DrawLantern(Actor* thisx, PlayState* play) {
gSPMatrix(&dispHead[3], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(&dispHead[4], &gBigpoDrawLanternMainDL);
+ gSPDisplayList(&dispHead[4], &gBigPoeLanternMainDL);
- gSPDisplayList(&dispHead[5], &gBigpoDrawLanternPurpleTopDL);
+ gSPDisplayList(&dispHead[5], &gBigPoeLanternPurpleTopDL);
// fully transparent OR fully invisible
if ((this->mainColor.a == 255) || (this->mainColor.a == 0)) {
@@ -1416,9 +1425,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 +1468,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..d5bdaf1e8 100644
--- a/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.h
+++ b/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.h
@@ -2,20 +2,31 @@
#define Z_EN_BIGPO_H
#include "global.h"
+#include "objects/object_bigpo/object_bigpo.h"
struct EnBigpo;
typedef void (*EnBigPoActionFunc)(struct EnBigpo*, PlayState*);
+typedef enum BigPoeBodyPart {
+ /* 0 */ BIG_POE_BODYPART_0,
+ /* 1 */ BIG_POE_BODYPART_1,
+ /* 2 */ BIG_POE_BODYPART_2,
+ /* 3 */ BIG_POE_BODYPART_3,
+ /* 4 */ BIG_POE_BODYPART_4,
+ /* 5 */ BIG_POE_BODYPART_5,
+ /* 6 */ BIG_POE_BODYPART_6,
+ /* 7 */ BIG_POE_BODYPART_7,
+ /* 8 */ BIG_POE_BODYPART_8,
+ /* 9 */ BIG_POE_BODYPART_MAX
+} BigPoeBodyPart;
+
typedef struct EnBigpoFireEffect {
/* 0x00 */ Vec3f pos;
/* 0x0C */ LightNode* light;
/* 0x10 */ LightInfo info; // size 0xE
} EnBigpoFireEffect; // size = 0x20
-#define ENBIGPO_LIMBCOUNT 10
-
-
// idleTimer gets reused:
// * after dampe reveals a fire, 8 minutes of frames before it goes away again
// * used by flames and regular bigpo to count frames during the appearance cutscene
@@ -27,8 +38,8 @@ typedef struct EnBigpoFireEffect {
typedef struct EnBigpo {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[ENBIGPO_LIMBCOUNT];
- /* 0x1C4 */ Vec3s morphTable[ENBIGPO_LIMBCOUNT];
+ /* 0x188 */ Vec3s jointTable[BIG_POE_LIMB_MAX];
+ /* 0x1C4 */ Vec3s morphTable[BIG_POE_LIMB_MAX];
/* 0x200 */ EnBigPoActionFunc actionFunc;
/* 0x204 */ u8 storePrevBgm;
/* 0x206 */ s16 idleTimer; // frame counter
@@ -36,13 +47,13 @@ typedef struct EnBigpo {
/* 0x20A */ s16 rotVelocity;
/* 0x20C */ s16 unk20C; // is this counting the number of frames the player is ztargeting them?
/* 0x20E */ s16 subCamId;
- /* 0x210 */ s16 switchFlags;
+ /* 0x210 */ s16 switchFlag;
/* 0x212 */ s16 hoverHeightCycleTimer; // sin wave up and down bobbing
/* 0x214 */ f32 fireRadius; // distance from center during conjunction cutscene
/* 0x218 */ f32 savedHeight; // actual height while flying moves as part of bobbing
/* 0x21C */ f32 drawDmgEffAlpha;
/* 0x220 */ f32 drawDmgEffScale;
- /* 0x224 */ Vec3f limbPos[9];
+ /* 0x224 */ Vec3f bodyPartsPos[BIG_POE_BODYPART_MAX];
/* 0x290 */ Color_RGBA8 mainColor;
/* 0x294 */ Color_RGBA8 lanternColor;
/* 0x298 */ UNK_TYPE1 pad298[0x14];
@@ -53,17 +64,17 @@ 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 {
- /* 0 */ ENBIGPO_REGULAR,
- /* 1 */ ENBIGPO_SUMMONED,
- /* 2 */ ENBIGPO_POSSIBLEFIRE,
- /* 3 */ ENBIGPO_CHOSENFIRE,
- /* 4 */ ENBIGPO_REVEALEDFIRE,
- /* 5 */ ENBIGPO_UNK5,
-};
+// 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 */ BIG_POE_TYPE_REGULAR,
+ /* 1 */ BIG_POE_TYPE_SUMMONED,
+ /* 2 */ BIG_POE_TYPE_POSSIBLE_FIRE,
+ /* 3 */ BIG_POE_TYPE_CHOSEN_FIRE,
+ /* 4 */ BIG_POE_TYPE_REVEALED_FIRE,
+ /* 5 */ BIG_POE_TYPE_UNK5
+} EnBigpoType;
-#define BIGPO_GET_SWITCHFLAGS(thisx) (u8)((thisx)->params >> 0x8)
+#define BIG_POE_GET_SWITCH_FLAG(thisx) (u8)((thisx)->params >> 0x8)
#endif // Z_EN_BIGPO_H
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 9cf4b425b..e8ce29da2 100644
--- a/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c
+++ b/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c
@@ -7,11 +7,12 @@
#include "z_en_bigslime.h"
#include "z64quake.h"
#include "z64rumble.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h"
#include "objects/object_bigslime/object_bigslime.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_200)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_200)
#define THIS ((EnBigslime*)thisx)
@@ -254,7 +255,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 = {
@@ -307,11 +308,11 @@ static InitChainEntry sInitChain[] = {
ICHAIN_S8(hintId, TATL_HINT_ID_GEKKO_GIANT_SLIME, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(targetArrowOffset, -13221, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -2000, ICHAIN_CONTINUE),
- ICHAIN_U8(targetMode, 5, ICHAIN_STOP),
+ ICHAIN_U8(targetMode, TARGET_MODE_5, ICHAIN_STOP),
};
void EnBigslime_Init(Actor* thisx, PlayState* play2) {
- static s32 isFrogReturnedFlags[] = {
+ static s32 sIsFrogReturnedFlags[] = {
WEEKEVENTREG_32_40,
WEEKEVENTREG_32_80,
WEEKEVENTREG_33_01,
@@ -340,14 +341,14 @@ void EnBigslime_Init(Actor* thisx, PlayState* play2) {
if (Flags_GetClear(play, play->roomCtx.curRoom.num)) {
Actor_Kill(&this->actor);
- if (!CHECK_WEEKEVENTREG(isFrogReturnedFlags[this->actor.params - 1])) {
+ if (!CHECK_WEEKEVENTREG(sIsFrogReturnedFlags[this->actor.params - 1])) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_MINIFROG, this->actor.world.pos.x, this->actor.world.pos.y,
this->actor.world.pos.z, 0, this->actor.shape.rot.y, 0, this->actor.params);
}
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;
@@ -371,7 +372,7 @@ void EnBigslime_Init(Actor* thisx, PlayState* play2) {
this->bigslimeFrozenTexAnim = Lib_SegmentedToVirtual(gBigslimeFrozenTexAnim);
this->iceShardTexAnim = Lib_SegmentedToVirtual(gBigslimeIceShardTexAnim);
this->actor.world.pos.y = GBT_ROOM_5_MIN_Y;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.shape.shadowAlpha = 255;
this->gekkoScale = 0.007f;
this->actor.shape.rot.y = 0;
@@ -536,47 +537,47 @@ void EnBigslime_CheckRoomBoundaries(EnBigslime* this, Vec3f* vtxMax, Vec3f* vtxM
f32 vtxMaxZ;
f32 vtxMinZ;
- this->actor.bgCheckFlags &= ~(0x2 | 0x8 | 0x10);
+ this->actor.bgCheckFlags &= ~(BGCHECKFLAG_GROUND_TOUCH | BGCHECKFLAG_WALL | BGCHECKFLAG_CEILING);
if ((this->actor.world.pos.y + vtxMax->y) > GBT_ROOM_5_MAX_Y) {
this->actor.world.pos.y = GBT_ROOM_5_MAX_Y - vtxMax->y;
- this->actor.bgCheckFlags |= 0x10;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_CEILING;
}
if ((this->actor.world.pos.y + vtxMin->y) <= GBT_ROOM_5_MIN_Y) {
this->actor.world.pos.y = GBT_ROOM_5_MIN_Y - vtxMin->y;
- if (!(this->actor.bgCheckFlags & 1)) {
- this->actor.bgCheckFlags |= 2;
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ this->actor.bgCheckFlags |= BGCHECKFLAG_GROUND_TOUCH;
}
- this->actor.bgCheckFlags |= 1;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_GROUND;
} else {
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
}
- if ((this->actionFunc != EnBigslime_Freeze) || !(this->actor.bgCheckFlags & 1)) {
+ if ((this->actionFunc != EnBigslime_Freeze) || !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
worldPosX = this->actor.world.pos.x;
vtxMaxX = vtxMax->x;
if (GBT_ROOM_5_MAX_X < (worldPosX + vtxMaxX)) {
- this->actor.bgCheckFlags |= 8;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_WALL;
this->actor.world.pos.x = GBT_ROOM_5_MAX_X - vtxMaxX;
} else {
vtxMinX = vtxMin->x;
if ((worldPosX + vtxMinX) < GBT_ROOM_5_MIN_X) {
this->actor.world.pos.x = GBT_ROOM_5_MIN_X - vtxMinX;
- this->actor.bgCheckFlags |= 8;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_WALL;
}
}
worldPosZ = this->actor.world.pos.z;
vtxMaxZ = vtxMax->z;
if (GBT_ROOM_5_MAX_Z < (worldPosZ + vtxMaxZ)) {
- this->actor.bgCheckFlags |= 8;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_WALL;
this->actor.world.pos.z = GBT_ROOM_5_MAX_Z - vtxMaxZ;
} else {
vtxMinZ = vtxMin->z;
if ((worldPosZ + vtxMinZ) < GBT_ROOM_5_MIN_Z) {
this->actor.world.pos.z = GBT_ROOM_5_MIN_Z - vtxMinZ;
- this->actor.bgCheckFlags |= 8;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_WALL;
}
}
}
@@ -657,7 +658,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 +674,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 +693,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;
@@ -728,7 +729,7 @@ void EnBigslime_SetPlayerParams(EnBigslime* this, PlayState* play) {
if (player->stateFlags2 & PLAYER_STATE2_80) {
player->actor.parent = NULL;
- player->unk_AE8 = 100;
+ player->actionVar2 = 100;
func_800B8D98(play, &this->actor, 10.0f, this->actor.world.rot.y, 10.0f);
}
}
@@ -742,11 +743,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);
@@ -764,15 +765,15 @@ void EnBigslime_BreakIntoMinislime(EnBigslime* this, PlayState* play) {
EnBigslime_SetPlayerParams(this, play);
EnBigslime_EndCutscene(this, play);
this->actor.colChkInfo.mass = 50;
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_400);
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_400);
this->actor.flags |= ACTOR_FLAG_200;
this->actor.hintId = TATL_HINT_ID_GEKKO_GIANT_SLIME;
this->gekkoRot.x = 0;
this->gekkoRot.y = 0;
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
this->formBigslimeTimer = 2;
EnBigslime_AddIceShardEffect(this, play);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_B_SLIME_BREAK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_B_SLIME_BREAK);
EnBigslime_SetupJumpGekko(this);
}
@@ -847,9 +848,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);
}
}
@@ -895,14 +896,14 @@ void EnBigslime_SetTargetVtxFromPreFrozen(EnBigslime* this) {
* Plays the standard Gekko sound effects without reverb
*/
void EnBigslime_GekkoSfxOutsideBigslime(EnBigslime* this, u16 sfxId) {
- Audio_PlaySfxAtPos(&this->gekkoProjectedPos, sfxId);
+ Audio_PlaySfx_AtPos(&this->gekkoProjectedPos, sfxId);
}
/**
* Adds reverb to Gekko sound effects when enclosed by bigslime
*/
void EnBigslime_GekkoSfxInsideBigslime(EnBigslime* this, u16 sfxId) {
- func_8019F420(&this->gekkoProjectedPos, sfxId);
+ Audio_PlaySfx_Underwater(&this->gekkoProjectedPos, sfxId);
}
void EnBigslime_GekkoFreeze(EnBigslime* this) {
@@ -922,7 +923,7 @@ void EnBigslime_GekkoThaw(EnBigslime* this, PlayState* play) {
this->gekkoCollider.base.colType = COLTYPE_HIT6;
this->gekkoCollider.info.elemType = ELEMTYPE_UNK1;
this->gekkoDrawDmgEffAlpha = 0.0f;
- Actor_SpawnIceEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), 2, 0.3f, 0.2f);
+ Actor_SpawnIceEffects(play, &this->actor, this->gekkoBodyPartsPos, GEKKO_BODYPART_MAX, 2, 0.3f, 0.2f);
this->actor.flags |= ACTOR_FLAG_200;
}
}
@@ -952,7 +953,7 @@ void EnBigslime_SetupCutsceneStartBattle(EnBigslime* this, PlayState* play) {
}
void EnBigslime_CutsceneStartBattle(EnBigslime* this, PlayState* play) {
- if (this->isAnimUpdate) {
+ if (this->isAnimFinished) {
EnBigslime_SetupCutsceneNoticePlayer(this);
} else if (!this->isInitJump && Math_ScaledStepToS(&this->gekkoRot.y, this->actor.yawTowardsPlayer, 0x200)) {
Animation_PlayOnce(&this->skelAnime, &gGekkoSurpriseJumpAnim);
@@ -986,7 +987,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;
}
@@ -1000,15 +1001,15 @@ void EnBigslime_CallMinislime(EnBigslime* this, PlayState* play) {
if (this->callTimer == 0) {
EnBigslime_EndCutscene(this, play);
this->formBigslimeTimer = 2;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
EnBigslime_SetupIdleNoticePlayer(this);
}
- } else if (this->isAnimUpdate) {
+ } else if (this->isAnimFinished) {
Animation_PlayLoop(&this->skelAnime, &gGekkoNervousIdleAnim);
EnBigslime_UpdateCameraIntroCs(this, play, 25);
Audio_PlayBgm_StorePrevBgm(NA_BGM_MINI_BOSS);
EnBigslime_InitFallMinislime(this);
- play->envCtx.lightSettingOverride = 0xFF;
+ play->envCtx.lightSettingOverride = LIGHT_SETTING_OVERRIDE_NONE;
this->callTimer = 35;
func_800B7298(play, &this->actor, PLAYER_CSMODE_4);
}
@@ -1020,11 +1021,11 @@ void EnBigslime_SetupMoveOnCeiling(EnBigslime* this) {
this->actor.velocity.y = 20.0f;
if (this->subCamId != SUB_CAM_ID_DONE) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->ceilingMoveTimer = 20;
} else {
this->ceilingMoveTimer = 320;
- this->actor.speedXZ = 5.0f;
+ this->actor.speed = 5.0f;
}
this->wavySurfaceTimer = 0;
@@ -1051,7 +1052,7 @@ void EnBigslime_MoveOnCeiling(EnBigslime* this, PlayState* play) {
} else if ((this->actor.xzDistToPlayer < 250.0f) || (this->ceilingMoveTimer == 0)) {
EnBigslime_SetupDrop(this);
} else {
- this->actor.speedXZ = (fabsf(Math_SinS(pitch)) * 3.0f) + 5.0f;
+ this->actor.speed = (fabsf(Math_SinS(pitch)) * 3.0f) + 5.0f;
Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 10, 0x800, 0x80);
this->gekkoRot.y = this->actor.world.rot.y;
}
@@ -1060,7 +1061,7 @@ void EnBigslime_MoveOnCeiling(EnBigslime* this, PlayState* play) {
void EnBigslime_SetupDrop(EnBigslime* this) {
this->actor.velocity.y = 0.0f;
this->ceilingDropTimer = 30;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = EnBigslime_Drop;
}
@@ -1083,7 +1084,7 @@ void EnBigslime_Drop(EnBigslime* this, PlayState* play) {
EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EN_FROG_DOWN);
this->rotation = 0;
}
- } else if (this->actor.bgCheckFlags & 1) {
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
EnBigslime_SetupSquishFlat(this);
} else {
Math_StepToF(&this->actor.scale.x, 0.15f, 0.0025f);
@@ -1169,7 +1170,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 +1189,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];
@@ -1213,7 +1214,7 @@ void EnBigslime_SetTargetVtxToWideCone(EnBigslime* this) {
}
void EnBigslime_SetupSquishFlat(EnBigslime* this) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_B_SLIME_JUMP2);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_B_SLIME_JUMP2);
this->squishFlatTimer = 20;
this->actor.scale.x = 0.2f;
this->actor.scale.z = 0.2f;
@@ -1301,7 +1302,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 +1319,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 +1362,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 +1375,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];
@@ -1412,7 +1413,7 @@ void EnBigslime_SetupRise(EnBigslime* this) {
Animation_PlayLoop(&this->skelAnime, &gGekkoSwimForwardAnim);
EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EN_FROG_JUMP_ABOVE);
EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EN_UTSUBO_APPEAR_TRG);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_B_SLIME_JUMP1);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_B_SLIME_JUMP1);
this->riseCounter = 0;
this->bigslimeCollider[0].base.atFlags &= ~AT_ON;
this->actor.gravity = 0.0f;
@@ -1500,7 +1501,7 @@ void EnBigslime_SetupCutsceneGrabPlayer(EnBigslime* this, PlayState* play) {
this->grabPlayerTimer = 15;
this->wavySurfaceTimer = 0;
this->bigslimeCollider[0].base.atFlags &= ~AT_ON;
- this->actor.world.rot.y = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ this->actor.world.rot.y = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
yaw = Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) - this->actor.world.rot.y;
if (yaw > 0x4000) {
@@ -1515,7 +1516,7 @@ void EnBigslime_SetupCutsceneGrabPlayer(EnBigslime* this, PlayState* play) {
this->subCamYawGrabPlayer += this->actor.world.rot.y;
Animation_PlayLoop(&this->skelAnime, &gGekkoBoxingStanceAnim);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_B_SLIME_EAT);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_B_SLIME_EAT);
this->actionFunc = EnBigslime_CutsceneGrabPlayer;
}
@@ -1527,7 +1528,7 @@ void EnBigslime_CutsceneGrabPlayer(EnBigslime* this, PlayState* play) {
s32 i;
s32 j;
- player->unk_AE8 = 0;
+ player->actionVar2 = 0;
Math_ScaledStepToS(&this->gekkoRot.x, 0, 0x400);
EnBigslime_UpdateCameraGrabPlayer(this, play);
if (this->grabPlayerTimer > 0) {
@@ -1576,7 +1577,7 @@ void EnBigslime_AttackPlayerInBigslime(EnBigslime* this, PlayState* play) {
Player* player = GET_PLAYER(play);
s16 pitch = this->scaleFactor * 0x3333; // polar (zenith) angle
- player->unk_AE8 = 0;
+ player->actionVar2 = 0;
Math_ScaledStepToS(&this->gekkoRot.x, 0, 0x400);
EnBigslime_UpdateCameraGrabPlayer(this, play);
EnBigslime_UpdateWavySurface(this);
@@ -1609,12 +1610,12 @@ void EnBigslime_AttackPlayerInBigslime(EnBigslime* this, PlayState* play) {
EnBigslime_Scale(this, pitch, ((this->scaleFactor * 0.08f) + 0.2f) * 0.15f,
((this->scaleFactor * 0.08f) + 0.2f) * 0.05f);
player->actor.world.pos.y = this->actor.world.pos.y + (this->actor.scale.y * -500.0f);
- if (this->isAnimUpdate) {
+ if (this->isAnimFinished) {
this->numGekkoMeleeAttacks--;
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;
@@ -1624,7 +1625,7 @@ void EnBigslime_AttackPlayerInBigslime(EnBigslime* this, PlayState* play) {
}
play->damagePlayer(play, -4);
- func_800B8E58(player, player->ageProperties->voiceSfxIdOffset + NA_SE_VO_LI_DAMAGE_S);
+ Player_PlaySfx(player, player->ageProperties->voiceSfxIdOffset + NA_SE_VO_LI_DAMAGE_S);
this->gekkoRot.y += (s16)(Rand_S16Offset(0x4000, 0x4000) * (Rand_ZeroOne() < 0.5f ? -1 : 1));
this->gekkoPosOffset.x = Math_SinS(this->gekkoRot.y) * -50.0f;
this->gekkoPosOffset.z = Math_CosS(this->gekkoRot.y) * -50.0f;
@@ -1633,7 +1634,7 @@ void EnBigslime_AttackPlayerInBigslime(EnBigslime* this, PlayState* play) {
Animation_PlayOnce(&this->skelAnime, sGekkoAttackAnimations[((s32)Rand_ZeroFloat(3.0f) % 3)]);
}
- func_800B9010(&this->actor, NA_SE_EN_B_SLIME_PUNCH_MOVE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_B_SLIME_PUNCH_MOVE - SFX_FLAG);
}
/**
@@ -1692,7 +1693,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
@@ -1701,15 +1702,15 @@ void EnBigslime_WindupThrowPlayer(EnBigslime* this, PlayState* play) {
this->gekkoPosOffset.z = Math_CosS(this->gekkoRot.y) * -50.0f;
} else {
if (this->windupPunchTimer == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_B_SLIME_REVERSE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_B_SLIME_REVERSE);
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;
- player->unk_AE8 = 100;
+ player->actionVar2 = 100;
}
player->actor.velocity.y = 0.0f;
@@ -1740,10 +1741,10 @@ void EnBigslime_WindupThrowPlayer(EnBigslime* this, PlayState* play) {
// loop over x, y, z
for (j = 0; j < 3; j++) {
// Linearly interpolate dynamicVtx --> staticVtx * (1 - scale * vtxSurfacePerturbation)
- dynamicVtx->n.ob[j] += (s16)(
- ((staticVtx->n.ob[j] - (s32)(scale * staticVtx->n.ob[j] * this->vtxSurfacePerturbation[i])) -
- dynamicVtx->n.ob[j]) *
- invWindupPunchTimer);
+ dynamicVtx->n.ob[j] += (s16)(((staticVtx->n.ob[j] - (s32)(scale * staticVtx->n.ob[j] *
+ this->vtxSurfacePerturbation[i])) -
+ dynamicVtx->n.ob[j]) *
+ invWindupPunchTimer);
}
} else {
// loop over x, y, z
@@ -1818,9 +1819,9 @@ void EnBigslime_SetupFreeze(EnBigslime* this) {
s32 i;
s32 j;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->freezeTimer = 40;
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->actor.velocity.y = 0.0f;
this->actor.gravity = 0.0f;
} else if ((this->actionFunc == EnBigslime_Rise) && (this->riseCounter < 2)) {
@@ -1879,7 +1880,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);
@@ -1897,8 +1898,8 @@ void EnBigslime_Freeze(EnBigslime* this, PlayState* play) {
sBigslimeTargetVtx[vtxIceUpdate - 4].n.a = sBigslimeTargetVtx[vtxIceUpdate].n.a;
}
- func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
- if (this->actor.bgCheckFlags & 2) {
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
if (this->freezeTimer == 0) {
EnBigslime_BreakIntoMinislime(this, play);
} else {
@@ -1907,7 +1908,7 @@ void EnBigslime_Freeze(EnBigslime* this, PlayState* play) {
EnBigslime_SetupSquishFlat(this);
}
} else if (this->freezeTimer == 0) {
- if (!(this->actor.bgCheckFlags & 1)) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
EnBigslime_SetupFrozenFall(this);
} else {
EnBigslime_SetupFrozenGround(this);
@@ -1980,7 +1981,7 @@ void EnBigslime_Melt(EnBigslime* this, PlayState* play) {
EffectSsIceSmoke_Spawn(play, &iceSmokePos, &iceSmokeVelocity, &gZeroVec3f, 600);
}
- func_800B9010(&this->actor, NA_SE_EV_ICE_MELT_LEVEL - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_MELT_LEVEL - SFX_FLAG);
for (i = 159; i >= 0; i--) {
sBigslimeTargetVtx[i + 2].n.a = sBigslimeTargetVtx[i].n.a;
}
@@ -1988,7 +1989,7 @@ void EnBigslime_Melt(EnBigslime* this, PlayState* play) {
if (this->meltCounter == 100) {
EnBigslime_SetTargetVtxFromPreFrozen(this);
} else if (this->meltCounter == 50) {
- play->envCtx.lightSettingOverride = 0xFF;
+ play->envCtx.lightSettingOverride = LIGHT_SETTING_OVERRIDE_NONE;
}
}
@@ -2019,14 +2020,14 @@ void EnBigslime_FrozenFall(EnBigslime* this, PlayState* play) {
func_800B8D50(play, &this->actor, 7.0f, this->actor.yawTowardsPlayer, 5.0f, 0x10);
}
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
EnBigslime_BreakIntoMinislime(this, play);
}
}
void EnBigslime_SetupJumpGekko(EnBigslime* this) {
Animation_PlayLoop(&this->skelAnime, &gGekkoJumpForwardAnim);
- this->actor.speedXZ = 8.0f;
+ this->actor.speed = 8.0f;
this->jumpTimer = 100;
this->actor.world.rot.y = this->gekkoRot.y;
this->gekkoYaw = this->actor.yawTowardsPlayer + 0x8000;
@@ -2037,9 +2038,9 @@ void EnBigslime_JumpGekko(EnBigslime* this, PlayState* play) {
s16 yaw;
s16 yawDiff;
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->gekkoCollider.base.acFlags |= AC_ON;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}
this->jumpTimer--;
@@ -2049,15 +2050,16 @@ void EnBigslime_JumpGekko(EnBigslime* this, PlayState* play) {
EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EV_WALK_WATER);
}
- if (!(this->actor.bgCheckFlags & 1) || ((this->skelAnime.curFrame > 1.0f) && (this->skelAnime.curFrame < 12.0f))) {
- this->actor.speedXZ = 8.0f;
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
+ ((this->skelAnime.curFrame > 1.0f) && (this->skelAnime.curFrame < 12.0f))) {
+ this->actor.speed = 8.0f;
} else {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
if (Math_SmoothStepToS(&this->actor.world.rot.y, this->gekkoYaw, 5, 0x1000, 0x80) == 0) {
- if (Actor_XZDistanceToPoint(&this->actor, &this->actor.home.pos) > 240.0f) {
- yaw = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) > 240.0f) {
+ yaw = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
yawDiff = yaw - (s16)(this->actor.yawTowardsPlayer + 0x8000);
this->gekkoYaw =
ABS_ALT(yawDiff) < 0x3000 ? yaw : (yawDiff / 2) + (s16)(this->actor.yawTowardsPlayer + 0x8000);
@@ -2087,8 +2089,8 @@ void EnBigslime_JumpGekko(EnBigslime* this, PlayState* play) {
void EnBigslime_SetupIdleLookAround(EnBigslime* this) {
Animation_PlayOnce(&this->skelAnime, &gGekkoNervousIdleAnim);
this->idleTimer = 60;
- this->actor.speedXZ = 0.0f;
- if (BINANG_SUB(Actor_YawToPoint(&this->actor, &this->actor.home.pos), this->gekkoRot.y) > 0) {
+ this->actor.speed = 0.0f;
+ if (BINANG_SUB(Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos), this->gekkoRot.y) > 0) {
this->gekkoYaw = this->gekkoRot.y + (Rand_Next() >> 20) + 0x2000;
} else {
this->gekkoYaw = this->gekkoRot.y - (Rand_Next() >> 20) - 0x2000;
@@ -2100,7 +2102,7 @@ void EnBigslime_IdleLookAround(EnBigslime* this, PlayState* play) {
s16 yawDiff;
this->idleTimer--;
- if (this->isAnimUpdate) {
+ if (this->isAnimFinished) {
if (Rand_ZeroOne() < 0.25f) {
Animation_PlayOnce(&this->skelAnime, &gGekkoLookAroundAnim);
} else {
@@ -2110,7 +2112,7 @@ void EnBigslime_IdleLookAround(EnBigslime* this, PlayState* play) {
if ((this->skelAnime.animation == &gGekkoNervousIdleAnim) &&
Math_ScaledStepToS(&this->gekkoRot.y, this->gekkoYaw, 0x400)) {
- if (BINANG_SUB(Actor_YawToPoint(&this->actor, &this->actor.home.pos), this->gekkoRot.y) > 0) {
+ if (BINANG_SUB(Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos), this->gekkoRot.y) > 0) {
this->gekkoYaw = this->gekkoRot.y + (Rand_Next() >> 20) + 0x2000;
} else {
this->gekkoYaw = this->gekkoRot.y - (Rand_Next() >> 20) - 0x2000;
@@ -2136,7 +2138,7 @@ void EnBigslime_IdleNoticePlayer(EnBigslime* this, PlayState* play) {
if (this->skelAnime.curFrame > 10.0f) {
Math_ScaledStepToS(yaw, this->gekkoYaw, 0x800);
}
- if (this->isAnimUpdate) {
+ if (this->isAnimFinished) {
EnBigslime_SetupJumpGekko(this);
}
}
@@ -2144,7 +2146,7 @@ void EnBigslime_IdleNoticePlayer(EnBigslime* this, PlayState* play) {
void EnBigslime_SetupThrowMinislime(EnBigslime* this) {
Animation_PlayOnce(&this->skelAnime, &gGekkoWindupPunchAnim);
EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EN_FROG_HOLD_SLIME);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = EnBigslime_ThrowMinislime;
}
@@ -2157,7 +2159,7 @@ void EnBigslime_ThrowMinislime(EnBigslime* this, PlayState* play) {
EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EN_FROG_THROW_SLIME);
this->minislimeToThrow->actor.params = MINISLIME_GEKKO_THROW;
}
- if (this->isAnimUpdate) {
+ if (this->isAnimFinished) {
jumpTimerStored = this->jumpTimer; // Stores jumpTimer so it doesn't get overwritten back to 100
EnBigslime_SetupJumpGekko(this);
this->jumpTimer = jumpTimerStored;
@@ -2168,7 +2170,7 @@ void EnBigslime_SetupDamageGekko(EnBigslime* this, s32 isNotFrozen) {
Animation_MorphToPlayOnce(&this->skelAnime, &gGekkoDamagedAnim, -3.0f);
this->gekkoCollider.base.acFlags &= ~AC_ON;
this->damageSpinTimer = 20;
- this->actor.speedXZ = 10.0f;
+ this->actor.speed = 10.0f;
this->actor.gravity = -2.0f;
this->actor.velocity.y = 0.0f;
if (isNotFrozen) {
@@ -2192,7 +2194,7 @@ void EnBigslime_DamageGekko(EnBigslime* this, PlayState* play) {
this->damageSpinTimer--;
damageSpinTimer = CLAMP_MAX(this->damageSpinTimer, 10);
this->gekkoRot.y += 0x300 * damageSpinTimer;
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f);
+ Math_StepToF(&this->actor.speed, 0.0f, 0.5f);
if (this->damageSpinTimer == 0) {
EnBigslime_SetupCutscene(this);
}
@@ -2205,7 +2207,7 @@ void EnBigslime_SetupStunGekko(EnBigslime* this) {
}
this->actionFunc = EnBigslime_StunGekko;
this->skelAnime.playSpeed = 0.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
void EnBigslime_StunGekko(EnBigslime* this, PlayState* play) {
@@ -2224,10 +2226,10 @@ void EnBigslime_StunGekko(EnBigslime* this, PlayState* play) {
void EnBigslime_SetupCutsceneFormBigslime(EnBigslime* this) {
Animation_PlayOnce(&this->skelAnime, &gGekkoJumpUpAnim);
this->gekkoCollider.base.acFlags &= ~AC_ON;
- this->actor.world.rot.x = -Actor_PitchToPoint(&this->actor, &this->actor.home.pos);
- this->actor.world.rot.y = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ this->actor.world.rot.x = -Actor_WorldPitchTowardPoint(&this->actor, &this->actor.home.pos);
+ this->actor.world.rot.y = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
this->actionFunc = EnBigslime_CutsceneFormBigslime;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
void EnBigslime_CutsceneFormBigslime(EnBigslime* this, PlayState* play) {
@@ -2245,7 +2247,7 @@ void EnBigslime_SetupFormBigslime(EnBigslime* this) {
this->gekkoRot.x = 0x4000 - this->actor.world.rot.x;
this->formBigslimeTimer = 0;
this->wavySurfaceTimer = 0;
- this->actor.speedXZ = 25.0f;
+ this->actor.speed = 25.0f;
this->gekkoRot.y = this->actor.world.rot.y;
this->formBigslimeCutsceneTimer = 2;
@@ -2281,11 +2283,11 @@ void EnBigslime_FormBigslime(EnBigslime* this, PlayState* play) {
Math_Vec3f_Copy(&this->actor.world.pos, &this->actor.home.pos);
this->actor.gravity = 0.0f;
this->actor.velocity.y = 0.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
Animation_PlayLoop(&this->skelAnime, &gGekkoSwimForwardAnim);
this->formBigslimeCutsceneTimer--;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_B_SLIME_COMBINE);
- } else if (this->isAnimUpdate) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_B_SLIME_COMBINE);
+ } else if (this->isAnimFinished) {
this->formBigslimeCutsceneTimer--;
if (this->formBigslimeCutsceneTimer == 0) {
Animation_PlayLoop(&this->skelAnime, &gGekkoSwimUpAnim);
@@ -2324,7 +2326,7 @@ void EnBigslime_SetupCutsceneDefeat(EnBigslime* this, PlayState* play) {
Animation_GetLastFrame(&gGekkoDamagedAnim.common), ANIMMODE_ONCE_INTERP, 0.0f);
this->gekkoCollider.base.acFlags &= ~AC_ON;
this->defeatTimer = 60;
- this->actor.speedXZ = 10.0f;
+ this->actor.speed = 10.0f;
this->actor.gravity = -2.0f;
this->actor.velocity.y = 0.0f;
EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EN_FROG_DEAD);
@@ -2334,7 +2336,7 @@ void EnBigslime_SetupCutsceneDefeat(EnBigslime* this, PlayState* play) {
subCamAt.y = this->actor.world.pos.y + 40.0f;
subCamAt.z = this->actor.world.pos.z;
- if (BINANG_SUB(Actor_YawToPoint(&this->actor, &this->actor.home.pos), this->actor.world.rot.y) > 0) {
+ if (BINANG_SUB(Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos), this->actor.world.rot.y) > 0) {
yawOffset = this->actor.world.rot.y + 0x4000;
} else {
yawOffset = this->actor.world.rot.y - 0x4000;
@@ -2350,7 +2352,7 @@ void EnBigslime_SetupCutsceneDefeat(EnBigslime* this, PlayState* play) {
this->minislime[i]->actor.params = MINISLIME_DEFEAT_IDLE;
}
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
EnBigslime_GekkoThaw(this, play);
this->actionFunc = EnBigslime_CutsceneDefeat;
}
@@ -2363,7 +2365,7 @@ void EnBigslime_CutsceneDefeat(EnBigslime* this, PlayState* play) {
this->defeatTimer--;
defeatTimer = CLAMP_MAX(this->defeatTimer, 10);
this->gekkoRot.y += 0x300 * defeatTimer;
- if (Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f)) {
+ if (Math_StepToF(&this->actor.speed, 0.0f, 0.5f)) {
EnBigslime_SetupGekkoDespawn(this, play);
} else {
// Continue for the camera to follow Gekko as it spins in defeat
@@ -2443,9 +2445,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);
}
@@ -2463,7 +2465,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);
@@ -2522,31 +2525,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.speedXZ = 0.0f;
+ 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) ||
@@ -2559,7 +2562,7 @@ void EnBigslime_PlayCutscene(EnBigslime* this, PlayState* play) {
EnBigslime_SetupCutsceneStartBattle(this, play);
}
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
@@ -2599,7 +2602,7 @@ void EnBigslime_ApplyDamageEffectBigslime(EnBigslime* this, PlayState* play) {
if (randFloat < 0.15f) {
Item_DropCollectible(play, &this->actor.world.pos, ITEM00_ARROWS_10);
} else if (randFloat < 0.3f) {
- Item_DropCollectible(play, &this->actor.world.pos, ITEM00_MAGIC_SMALL);
+ Item_DropCollectible(play, &this->actor.world.pos, ITEM00_MAGIC_JAR_SMALL);
}
this->itemDropTimer = 40;
}
@@ -2633,10 +2636,10 @@ void EnBigslime_ApplyDamageEffectGekko(EnBigslime* this, PlayState* play) {
this->gekkoDrawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
} else {
this->gekkoDrawDmgEffType = ACTOR_DRAW_DMGEFF_LIGHT_ORBS;
- Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG,
- this->gekkoCollider.info.bumper.hitPos.x,
- this->gekkoCollider.info.bumper.hitPos.y,
- this->gekkoCollider.info.bumper.hitPos.z, 0, 0, 0, CLEAR_TAG_LARGE_LIGHT_RAYS);
+ Actor_Spawn(
+ &play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->gekkoCollider.info.bumper.hitPos.x,
+ this->gekkoCollider.info.bumper.hitPos.y, this->gekkoCollider.info.bumper.hitPos.z, 0,
+ 0, 0, CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
}
} else if (this->actor.colChkInfo.damageEffect == BIGSLIME_DMGEFF_ICE) {
EnBigslime_GekkoFreeze(this);
@@ -2644,7 +2647,7 @@ void EnBigslime_ApplyDamageEffectGekko(EnBigslime* this, PlayState* play) {
EnBigslime_SetupCutscene(this);
} else if (this->actor.colChkInfo.damageEffect == BIGSLIME_DMGEFF_ELECTRIC_STUN) {
this->stunTimer = 40;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
this->gekkoDrawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_SMALL;
this->gekkoDrawDmgEffScale = 0.75f;
this->gekkoDrawDmgEffAlpha = 2.0f;
@@ -2652,7 +2655,7 @@ void EnBigslime_ApplyDamageEffectGekko(EnBigslime* this, PlayState* play) {
} else if (this->actor.colChkInfo.damageEffect == BIGSLIME_DMGEFF_STUN ||
this->actor.colChkInfo.damageEffect == BIGSLIME_DMGEFF_DEKU_STUN) {
this->stunTimer = 40;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
EnBigslime_SetupStunGekko(this);
} else if (this->actor.colChkInfo.damageEffect == BIGSLIME_DMGEFF_ICE) {
EnBigslime_GekkoFreeze(this);
@@ -2668,10 +2671,10 @@ void EnBigslime_ApplyDamageEffectGekko(EnBigslime* this, PlayState* play) {
this->gekkoDrawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
} else {
this->gekkoDrawDmgEffType = ACTOR_DRAW_DMGEFF_LIGHT_ORBS;
- Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG,
- this->gekkoCollider.info.bumper.hitPos.x,
- this->gekkoCollider.info.bumper.hitPos.y,
- this->gekkoCollider.info.bumper.hitPos.z, 0, 0, 0, CLEAR_TAG_LARGE_LIGHT_RAYS);
+ Actor_Spawn(
+ &play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->gekkoCollider.info.bumper.hitPos.x,
+ this->gekkoCollider.info.bumper.hitPos.y, this->gekkoCollider.info.bumper.hitPos.z, 0,
+ 0, 0, CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
}
}
EnBigslime_SetupDamageGekko(this, true);
@@ -2722,7 +2725,7 @@ void EnBigslime_AddIceShardEffect(EnBigslime* this, PlayState* play) {
}
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_ICE_BROKEN);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_ICE_BROKEN);
EnBigslime_InitShockwave(this, play);
}
@@ -2762,7 +2765,7 @@ void EnBigslime_UpdateEffects(EnBigslime* this) {
this->gekkoDrawDmgEffScale = 0.375f * (this->gekkoDrawDmgEffAlpha + 1.0f);
this->gekkoDrawDmgEffScale = CLAMP_MAX(this->gekkoDrawDmgEffScale, 0.75f);
} else if (!Math_StepToF(&this->gekkoDrawDmgEffFrozenSteamScale, 0.75f, 0.01875f)) {
- func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
}
}
@@ -2774,13 +2777,13 @@ void EnBigslime_UpdateBigslime(Actor* thisx, PlayState* play) {
Vec3f vtxMin;
if (play->envCtx.lightSettingOverride == 3) {
- play->envCtx.lightSettingOverride = 0xFF;
+ play->envCtx.lightSettingOverride = LIGHT_SETTING_OVERRIDE_NONE;
}
- func_8019F540(1);
+ Audio_SetSfxUnderwaterReverb(true);
this->dynamicVtxState ^= 1;
EnBigslime_DynamicVtxCopyState(this);
- this->isAnimUpdate = SkelAnime_Update(&this->skelAnime);
+ this->isAnimFinished = SkelAnime_Update(&this->skelAnime);
if (this->actionFunc != EnBigslime_PlayCutscene) {
EnBigslime_ApplyDamageEffectBigslime(this, play);
} else {
@@ -2819,11 +2822,11 @@ void EnBigslime_UpdateGekko(Actor* thisx, PlayState* play) {
s32 pad;
if (play->envCtx.lightSettingOverride == 3) {
- play->envCtx.lightSettingOverride = 0xFF;
+ play->envCtx.lightSettingOverride = LIGHT_SETTING_OVERRIDE_NONE;
}
- func_8019F540(0);
- this->isAnimUpdate = SkelAnime_Update(&this->skelAnime);
+ Audio_SetSfxUnderwaterReverb(false);
+ this->isAnimFinished = SkelAnime_Update(&this->skelAnime);
if (this->actionFunc != EnBigslime_PlayCutscene) {
EnBigslime_ApplyDamageEffectGekko(this, play);
} else {
@@ -2837,7 +2840,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) {
@@ -2881,7 +2886,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;
@@ -2904,6 +2910,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);
}
@@ -2933,12 +2940,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);
@@ -2960,6 +2968,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);
}
@@ -2977,8 +2986,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
@@ -3015,6 +3025,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,
@@ -3022,26 +3033,37 @@ void EnBigslime_DrawBigslime(Actor* thisx, PlayState* play) {
EnBigslime_DrawGekko(&this->actor, play);
}
+static s8 sLimbToBodyParts[GEKKO_LIMB_MAX] = {
+ BODYPART_NONE, // GEKKO_LIMB_NONE
+ BODYPART_NONE, // GEKKO_LIMB_ROOT
+ GEKKO_BODYPART_WAIST, // GEKKO_LIMB_WAIST
+ BODYPART_NONE, // GEKKO_LIMB_LEFT_THIGH
+ GEKKO_BODYPART_LEFT_SHIN, // GEKKO_LIMB_LEFT_SHIN
+ BODYPART_NONE, // GEKKO_LIMB_LEFT_ANKLE
+ GEKKO_BODYPART_LEFT_FOOT, // GEKKO_LIMB_LEFT_FOOT
+ BODYPART_NONE, // GEKKO_LIMB_RIGHT_THIGH
+ GEKKO_BODYPART_RIGHT_SHIN, // GEKKO_LIMB_RIGHT_SHIN
+ BODYPART_NONE, // GEKKO_LIMB_RIGHT_ANKLE
+ GEKKO_BODYPART_RIGHT_FOOT, // GEKKO_LIMB_RIGHT_FOOT
+ BODYPART_NONE, // GEKKO_LIMB_TORSO
+ GEKKO_BODYPART_LEFT_UPPER_ARM, // GEKKO_LIMB_LEFT_UPPER_ARM
+ GEKKO_BODYPART_LEFT_FOREARM, // GEKKO_LIMB_LEFT_FOREARM
+ BODYPART_NONE, // GEKKO_LIMB_LEFT_WRIST
+ GEKKO_BODYPART_LEFT_HAND, // GEKKO_LIMB_LEFT_HAND
+ GEKKO_BODYPART_RIGHT_UPPER_ARM, // GEKKO_LIMB_RIGHT_UPPER_ARM
+ GEKKO_BODYPART_RIGHT_FOREARM, // GEKKO_LIMB_RIGHT_FOREARM
+ BODYPART_NONE, // GEKKO_LIMB_RIGHT_WRIST
+ GEKKO_BODYPART_RIGHT_HAND, // GEKKO_LIMB_RIGHT_HAND
+ BODYPART_NONE, // GEKKO_LIMB_HEAD
+ GEKKO_BODYPART_JAW, // GEKKO_LIMB_JAW
+ BODYPART_NONE, // GEKKO_LIMB_LEFT_EYE
+ BODYPART_NONE, // GEKKO_LIMB_RIGHT_EYE
+};
+
+// Some kind of offset for the position of the Gekkos right foot
+static Vec3f sRightFootOffsetRef = { 1500.0f, 2200.0f, 0.0f };
+
void EnBigslime_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
- /* value -1: Limb Not used
- * value 0: GEKKO_LIMB_WAIST
- * value 1: GEKKO_LIMB_L_SHIN
- * value 2: GEKKO_LIMB_L_FOOT
- * value 3: GEKKO_LIMB_R_SHIN
- * value 4: GEKKO_LIMB_R_FOOT
- * value 5: GEKKO_LIMB_L_UPPER_ARM
- * value 6: GEKKO_LIMB_L_FOREARM
- * value 7: GEKKO_LIMB_L_HAND
- * value 8: GEKKO_LIMB_R_UPPER_ARM
- * value 9: GEKKO_LIMB_R_FOREARM
- * value 10: GEKKO_LIMB_R_HAND
- * value 11: GEKKO_LIMB_JAW
- */
- static s8 limbPosIndex[] = {
- -1, -1, 0, -1, 1, -1, 2, -1, 3, -1, 4, -1, 5, 6, -1, 7, 8, 9, -1, 10, -1, 11, -1, -1,
- };
- // Some kind of offset for the position of the Gekkos right foot
- static Vec3f rightFootOffsetRef = { 1500.0f, 2200.0f, 0.0f };
EnBigslime* this = THIS;
Vec3f rightFootOffset;
@@ -3050,12 +3072,12 @@ void EnBigslime_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
this->actor.focus.rot.y = this->gekkoRot.y;
}
- if (limbPosIndex[limbIndex] != -1) {
- Matrix_MultZero(&this->limbPos[limbPosIndex[limbIndex]]);
+ if (sLimbToBodyParts[limbIndex] != BODYPART_NONE) {
+ Matrix_MultZero(&this->gekkoBodyPartsPos[sLimbToBodyParts[limbIndex]]);
}
if (limbIndex == GEKKO_LIMB_RIGHT_ANKLE) {
- Matrix_MultVec3f(&rightFootOffsetRef, &rightFootOffset);
+ Matrix_MultVec3f(&sRightFootOffsetRef, &rightFootOffset);
this->gekkoCollider.dim.pos.y = rightFootOffset.y;
}
}
@@ -3067,7 +3089,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)) {
@@ -3108,7 +3130,7 @@ void EnBigslime_DrawGekko(Actor* thisx, PlayState* play) {
EnBigslime_DrawShatteringEffects(this, play);
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos),
+ Actor_DrawDamageEffects(play, &this->actor, this->gekkoBodyPartsPos, GEKKO_BODYPART_MAX,
this->gekkoScale * (999.99991f / 7.0f) * this->gekkoDrawDmgEffScale,
this->gekkoDrawDmgEffFrozenSteamScale, this->gekkoDrawDmgEffAlpha,
this->gekkoDrawDmgEffType);
@@ -3120,7 +3142,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..4f09998bc 100644
--- a/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.h
+++ b/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.h
@@ -57,7 +57,7 @@ typedef struct EnBigslime {
/* 0x0220 */ Vec3s morphTable[GEKKO_LIMB_MAX];
/* 0x02B0 */ u8 minislimeState;
/* 0x02B1 */ u8 dynamicVtxState; // Toggles between two states of dynamic Vtx
- /* 0x02B2 */ u8 isAnimUpdate;
+ /* 0x02B2 */ u8 isAnimFinished;
/* 0x02B3 */ union {
u8 formBigslimeTimer; // Bigslime will start forming when timer reaches 0
u8 minislimeCounter;
@@ -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;
@@ -106,7 +106,7 @@ typedef struct EnBigslime {
Vec3f frozenPos;
Vec3f subCamDistToFrog; // Used to zoom into frogs as Gekko despawns/Frog spawns
};
- /* 0x02F8 */ Vec3f limbPos[12];
+ /* 0x02F8 */ Vec3f gekkoBodyPartsPos[GEKKO_BODYPART_MAX];
/* 0x0388 */ f32 gekkoDrawDmgEffAlpha;
/* 0x038C */ f32 gekkoDrawDmgEffScale;
/* 0x0390 */ f32 gekkoDrawDmgEffFrozenSteamScale;
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 ed7b8c194..a9f290371 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
@@ -6,7 +6,7 @@
#include "z_en_bji_01.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnBji01*)thisx)
@@ -15,20 +15,15 @@ void EnBji01_Destroy(Actor* thisx, PlayState* play);
void EnBji01_Update(Actor* thisx, PlayState* play);
void EnBji01_Draw(Actor* thisx, PlayState* play);
-void func_809CCE98(EnBji01* this, PlayState* play);
void func_809CCEE8(EnBji01* this, PlayState* play);
void func_809CD028(EnBji01* this, PlayState* play);
void EnBji01_DialogueHandler(EnBji01* this, PlayState* play);
-void func_809CCDE0(EnBji01* this, PlayState* play);
void func_809CD634(EnBji01* this, PlayState* play);
void EnBji01_DoNothing(EnBji01* this, PlayState* play);
void func_809CD6C0(EnBji01* this, PlayState* play);
void func_809CD70C(EnBji01* this, PlayState* play);
void func_809CD77C(EnBji01* this, PlayState* play);
-s32 EnBji01_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx);
-void EnBji01_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx);
-
ActorInit En_Bji_01_InitVars = {
ACTOR_EN_BJI_01,
ACTORCAT_NPC,
@@ -61,12 +56,20 @@ static ColliderCylinderInit sCylinderInit = {
{ 18, 64, 0, { 0, 0, 0 } },
};
-/* Animations struct */
-static AnimationSpeedInfo sAnimationInfo[] = {
- { &object_bji_Anim_000FDC, 1.0f, ANIMMODE_LOOP, 0.0f }, /* Looking through telescope */
- { &object_bji_Anim_005B58, 1.0f, ANIMMODE_LOOP, 10.0f }, /* Breathing? Unused? */
- { &object_bji_Anim_000AB0, 1.0f, ANIMMODE_LOOP, 0.0f }, /* Talking */
- { &object_bji_Anim_00066C, 1.0f, ANIMMODE_ONCE, -5.0f }, /* Scratching chin? */
+typedef enum {
+ /* -1 */ SHIKASHI_ANIM_NONE = -1,
+ /* 0 */ SHIKASHI_ANIM_LOOK_THROUGH_TELESCOPE,
+ /* 1 */ SHIKASHI_ANIM_BREATHE,
+ /* 2 */ SHIKASHI_ANIM_TALK,
+ /* 3 */ SHIKASHI_ANIM_SCRATCH_CHIN,
+ /* 4 */ SHIKASHI_ANIM_MAX
+} ShikashiAnimation;
+
+static AnimationSpeedInfo sAnimationSpeedInfo[SHIKASHI_ANIM_MAX] = {
+ { &object_bji_Anim_000FDC, 1.0f, ANIMMODE_LOOP, 0.0f }, // SHIKASHI_ANIM_LOOK_THROUGH_TELESCOPE
+ { &object_bji_Anim_005B58, 1.0f, ANIMMODE_LOOP, 10.0f }, // SHIKASHI_ANIM_BREATHE
+ { &object_bji_Anim_000AB0, 1.0f, ANIMMODE_LOOP, 0.0f }, // SHIKASHI_ANIM_TALK
+ { &object_bji_Anim_00066C, 1.0f, ANIMMODE_ONCE, -5.0f }, // SHIKASHI_ANIM_SCRATCH_CHIN
};
void func_809CCDE0(EnBji01* this, PlayState* play) {
@@ -82,7 +85,8 @@ void func_809CCDE0(EnBji01* this, PlayState* play) {
}
void func_809CCE98(EnBji01* this, PlayState* play) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 0, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, SHIKASHI_ANIM_LOOK_THROUGH_TELESCOPE,
+ &this->animIndex);
this->actor.textId = 0;
this->actionFunc = func_809CCEE8;
}
@@ -97,7 +101,7 @@ void func_809CCEE8(EnBji01* this, PlayState* play) {
}
}
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- play->msgCtx.msgMode = 0;
+ play->msgCtx.msgMode = MSGMODE_NONE;
play->msgCtx.msgLength = 0;
func_809CD028(this, play);
} else {
@@ -109,7 +113,7 @@ void func_809CCEE8(EnBji01* this, PlayState* play) {
} else {
this->moonsTear = (ObjMoonStone*)SubS_FindActor(play, NULL, ACTORCAT_PROP, ACTOR_OBJ_MOON_STONE);
}
- func_800B8500(&this->actor, play, 60.0f, 10.0f, PLAYER_IA_NONE);
+ Actor_OfferTalkExchange(&this->actor, play, 60.0f, 10.0f, PLAYER_IA_NONE);
}
}
@@ -119,7 +123,7 @@ void func_809CD028(EnBji01* this, PlayState* play) {
switch (this->actor.params) {
case SHIKASHI_TYPE_DEFAULT:
case SHIKASHI_TYPE_FINISHED_CONVERSATION:
- switch (gSaveContext.save.playerForm) {
+ switch (GET_PLAYER_FORM) {
case PLAYER_FORM_DEKU:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_17_10)) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_74_80)) {
@@ -132,6 +136,7 @@ void func_809CD028(EnBji01* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_17_10);
}
break;
+
case PLAYER_FORM_HUMAN:
if (Player_GetMask(play) == PLAYER_MASK_KAFEIS_MASK) {
this->textId = 0x236A;
@@ -142,6 +147,7 @@ void func_809CD028(EnBji01* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_74_10);
}
break;
+
case PLAYER_FORM_GORON:
case PLAYER_FORM_ZORA:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_75_08)) {
@@ -151,31 +157,39 @@ void func_809CD028(EnBji01* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_75_08);
}
break;
+
+ default:
+ break;
}
break;
+
case SHIKASHI_TYPE_LOOKED_THROUGH_TELESCOPE:
- switch (gSaveContext.save.playerForm) {
+ switch (GET_PLAYER_FORM) {
case PLAYER_FORM_DEKU:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_74_80)) {
this->textId = 0x5F2;
} else {
this->textId = 0x5F1;
}
- func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel,
- PLAYER_IA_NONE);
+ Actor_OfferTalkExchange(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel,
+ PLAYER_IA_NONE);
break;
+
case PLAYER_FORM_HUMAN:
this->textId = 0x5F7;
break;
+
case PLAYER_FORM_GORON:
case PLAYER_FORM_ZORA:
switch (CURRENT_DAY) {
case 1:
this->textId = 0x5E9;
break;
+
case 2:
this->textId = 0x5EA;
break;
+
case 3:
timeUntilMoonCrash = TIME_UNTIL_MOON_CRASH;
if (timeUntilMoonCrash < CLOCK_TIME_F(1, 0)) {
@@ -184,11 +198,21 @@ void func_809CD028(EnBji01* this, PlayState* play) {
this->textId = 0x5EB;
}
break;
+
+ default:
+ break;
}
+ break;
+
+ default:
+ break;
}
break;
+
+ default:
+ break;
}
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 2, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, SHIKASHI_ANIM_TALK, &this->animIndex);
this->actionFunc = EnBji01_DialogueHandler;
}
@@ -201,51 +225,67 @@ void EnBji01_DialogueHandler(EnBji01* this, PlayState* play) {
Message_StartTextbox(play, this->textId, &this->actor);
}
break;
+
case TEXT_STATE_CHOICE:
if (Message_ShouldAdvance(play)) {
this->actor.flags &= ~ACTOR_FLAG_10000;
this->actor.params = SHIKASHI_TYPE_FINISHED_CONVERSATION;
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
- func_801477B4(play);
+ Audio_PlaySfx_MessageDecide();
+ Message_CloseTextbox(play);
func_809CD634(this, play);
break;
+
case 1:
- func_8019F230();
- switch (gSaveContext.save.playerForm) {
+ Audio_PlaySfx_MessageCancel();
+ switch (GET_PLAYER_FORM) {
case PLAYER_FORM_DEKU:
- func_80151938(play, 0x5F0);
+ Message_ContinueTextbox(play, 0x5F0);
break;
+
case PLAYER_FORM_HUMAN:
- func_80151938(play, 0x5F8);
+ Message_ContinueTextbox(play, 0x5F8);
break;
+
case PLAYER_FORM_GORON:
case PLAYER_FORM_ZORA:
- func_80151938(play, 0x5E1);
+ Message_ContinueTextbox(play, 0x5E1);
+ break;
+
+ default:
break;
}
break;
+
+ default:
+ break;
}
}
break;
+
case TEXT_STATE_5:
if (Message_ShouldAdvance(play)) {
this->actor.flags &= ~ACTOR_FLAG_10000;
switch (play->msgCtx.currentTextId) {
case 0x5DE:
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 3, &this->animIndex);
- func_80151938(play, 0x5DF);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo,
+ SHIKASHI_ANIM_SCRATCH_CHIN, &this->animIndex);
+ Message_ContinueTextbox(play, 0x5DF);
break;
+
case 0x5E4:
- func_80151938(play, 0x5E7);
+ Message_ContinueTextbox(play, 0x5E7);
break;
+
case 0x5E5:
- func_80151938(play, 0x5E0);
+ Message_ContinueTextbox(play, 0x5E0);
break;
+
case 0x5E7:
- func_80151938(play, 0x5E5);
+ Message_ContinueTextbox(play, 0x5E5);
break;
+
case 0x5DC:
case 0x5DD:
case 0x5DF:
@@ -254,12 +294,14 @@ void EnBji01_DialogueHandler(EnBji01* this, PlayState* play) {
case 0x5EE:
case 0x5F2:
case 0x5F5:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
+
case 0x5F0:
case 0x5F6:
- func_80151938(play, 0x5EF);
+ Message_ContinueTextbox(play, 0x5EF);
break;
+
case 0x5E1:
case 0x5E8:
case 0x5E9:
@@ -270,29 +312,36 @@ void EnBji01_DialogueHandler(EnBji01* this, PlayState* play) {
case 0x5F4:
case 0x5F7:
case 0x5F8:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actor.flags &= ~ACTOR_FLAG_10000;
this->actor.params = SHIKASHI_TYPE_FINISHED_CONVERSATION;
func_809CCE98(this, play);
break;
+
+ default:
+ break;
}
}
break;
+
case TEXT_STATE_DONE:
this->actor.params = SHIKASHI_TYPE_FINISHED_CONVERSATION;
this->actor.flags &= ~ACTOR_FLAG_10000;
func_809CCE98(this, play);
break;
+
+ default:
+ break;
}
- if ((this->animIndex == 3) && (this->skelAnime.curFrame == this->skelAnime.endFrame)) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 2, &this->animIndex);
+ if ((this->animIndex == SHIKASHI_ANIM_SCRATCH_CHIN) && (this->skelAnime.curFrame == this->skelAnime.endFrame)) {
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, SHIKASHI_ANIM_TALK, &this->animIndex);
}
}
void func_809CD634(EnBji01* this, PlayState* play) {
AudioSfx_MuteBanks((1 << BANK_PLAYER) | (1 << BANK_ITEM) | (1 << BANK_ENV) | (1 << BANK_ENEMY) |
(1 << BANK_OCARINA) | (1 << BANK_VOICE));
- Audio_QueueSeqCmd(0xE0000101);
+ SEQCMD_DISABLE_PLAY_SEQUENCES(true);
play->nextEntrance = ENTRANCE(TERMINA_FIELD, 10); /* Telescope entrance */
gSaveContext.respawn[RESPAWN_MODE_DOWN].entrance = play->nextEntrance;
func_80169EFC(&play->state); /* Load new entrance? */
@@ -304,7 +353,7 @@ void EnBji01_DoNothing(EnBji01* this, PlayState* play) {
}
void func_809CD6C0(EnBji01* this, PlayState* play) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 2, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, SHIKASHI_ANIM_TALK, &this->animIndex);
this->actionFunc = func_809CD70C;
}
@@ -332,12 +381,12 @@ void EnBji01_Init(Actor* thisx, PlayState* play) {
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
- this->actor.targetMode = 0;
+ this->actor.targetMode = TARGET_MODE_0;
this->actor.child = NULL;
- this->animIndex = -1;
+ this->animIndex = SHIKASHI_ANIM_NONE;
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) {
@@ -346,13 +395,15 @@ void EnBji01_Init(Actor* thisx, PlayState* play) {
this->actor.params = SHIKASHI_TYPE_DEFAULT;
func_809CCE98(this, play);
break;
+
case ENTRANCE(ASTRAL_OBSERVATORY, 2): /* Telescope entrance */
this->actor.flags |= ACTOR_FLAG_10000;
AudioSfx_MuteBanks(0);
- Audio_QueueSeqCmd(0xE0000100);
+ SEQCMD_DISABLE_PLAY_SEQUENCES(false);
this->actor.params = SHIKASHI_TYPE_LOOKED_THROUGH_TELESCOPE;
func_809CCE98(this, play);
break;
+
default:
Actor_Kill(&this->actor);
break;
@@ -371,11 +422,12 @@ 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) {
- if (--this->blinkSeqIndex < 0) {
+ this->blinkSeqIndex--;
+ if (this->blinkSeqIndex < 0) {
this->blinkSeqIndex = 4;
this->blinkTimer = (Rand_ZeroOne() * 60.0f) + 20.0f;
} else {
@@ -404,10 +456,14 @@ s32 EnBji01_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
rot->x += this->torsoXRotStep;
rot->z += this->torsoZRotStep;
break;
+
case SHIKASHI_LIMB_HEAD:
rot->x += this->headXRotStep;
rot->z += this->headZRotStep;
break;
+
+ default:
+ break;
}
return false;
}
@@ -432,9 +488,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 08070b61d..ed68e212f 100644
--- a/src/overlays/actors/ovl_En_Bjt/z_en_bjt.c
+++ b/src/overlays/actors/ovl_En_Bjt/z_en_bjt.c
@@ -6,7 +6,7 @@
#include "z_en_bjt.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnBjt*)thisx)
@@ -87,16 +87,17 @@ typedef enum {
/* 2 */ TOILET_HAND_ANIM_WAGGING_FINGER, // Wrong
/* 3 */ TOILET_HAND_ANIM_THUMBS_UP, // Right
/* 4 */ TOILET_HAND_ANIM_OPEN_HAND,
- /* 5 */ TOILET_HAND_ANIM_FIST // i.e. holding the reward
+ /* 5 */ TOILET_HAND_ANIM_FIST, // i.e. holding the reward
+ /* 6 */ TOILET_HAND_ANIM_MAX
} ToiletHandAnimation;
-static AnimationInfoS sAnimationInfo[] = {
- /* 0 */ { &gToiletHandWaitingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- /* 1 */ { &gToiletHandWaitingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- /* 2 */ { &gToiletHandWaggingFingerAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- /* 3 */ { &gToiletHandThumbsUpAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- /* 4 */ { &gToiletHandOpenHandAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- /* 5 */ { &gToiletHandFistAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
+static AnimationInfoS sAnimationInfo[TOILET_HAND_ANIM_MAX] = {
+ { &gToiletHandWaitingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // TOILET_HAND_ANIM_WAITING
+ { &gToiletHandWaitingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // TOILET_HAND_ANIM_WAITING_MORPH
+ { &gToiletHandWaggingFingerAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // TOILET_HAND_ANIM_WAGGING_FINGER
+ { &gToiletHandThumbsUpAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // TOILET_HAND_ANIM_THUMBS_UP
+ { &gToiletHandOpenHandAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // TOILET_HAND_ANIM_OPEN_HAND
+ { &gToiletHandFistAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // TOILET_HAND_ANIM_FIST
};
void EnBjt_UpdateSkelAnime(EnBjt* this) {
@@ -106,10 +107,10 @@ void EnBjt_UpdateSkelAnime(EnBjt* this) {
s32 EnBjt_ChangeAnim(EnBjt* this, s32 animIndex) {
s32 changeAnim = false;
- s32 changed = false;
+ s32 didAnimChange = false;
if ((animIndex == TOILET_HAND_ANIM_WAITING) || (animIndex == TOILET_HAND_ANIM_WAITING_MORPH)) {
- if (!((this->animIndex == TOILET_HAND_ANIM_WAITING) || (this->animIndex == TOILET_HAND_ANIM_WAITING_MORPH))) {
+ if ((this->animIndex != TOILET_HAND_ANIM_WAITING) && (this->animIndex != TOILET_HAND_ANIM_WAITING_MORPH)) {
changeAnim = true;
}
} else if (this->animIndex != animIndex) {
@@ -118,11 +119,11 @@ s32 EnBjt_ChangeAnim(EnBjt* this, s32 animIndex) {
if (changeAnim) {
this->animIndex = animIndex;
- changed = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
+ didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
this->animPlaySpeed = this->skelAnime.playSpeed;
}
- return changed;
+ return didAnimChange;
}
void EnBjt_UpdateCollision(EnBjt* this, PlayState* play) {
@@ -182,7 +183,7 @@ s32 EnBjt_Appear(EnBjt* this) {
s32 finished = false;
if (!this->playedSfx) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_TOILET_HAND_APPEAR);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_TOILET_HAND_APPEAR);
this->playedSfx = true;
}
@@ -207,7 +208,7 @@ s32 EnBjt_Vanish(EnBjt* this) {
s32 finished = false;
if (!this->playedSfx) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_TOILET_HAND_VANISH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_TOILET_HAND_VANISH);
this->playedSfx = true;
}
@@ -229,7 +230,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
@@ -275,9 +276,9 @@ s32 EnBjt_ChooseBehaviour(Actor* thisx, PlayState* play) {
break;
case TOILET_HAND_BEHAVIOUR_TAKE_ITEM:
- if (player->exchangeItemId != PLAYER_IA_NONE) {
- EnBjt_TakeItem(player->exchangeItemId);
- player->exchangeItemId = PLAYER_IA_NONE;
+ if (player->exchangeItemAction != PLAYER_IA_NONE) {
+ EnBjt_TakeItem(player->exchangeItemAction);
+ player->exchangeItemAction = PLAYER_IA_NONE;
}
if (EnBjt_Vanish(this)) {
this->timer = 60;
@@ -292,7 +293,7 @@ s32 EnBjt_ChooseBehaviour(Actor* thisx, PlayState* play) {
this->playedSfx = false;
this->behaviour++;
} else if (this->timer == 10) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_TOILET_WATER);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_TOILET_WATER);
}
break;
@@ -319,9 +320,10 @@ s32 EnBjt_ChooseBehaviour(Actor* thisx, PlayState* play) {
s32 EnBjt_CheckTalk(EnBjt* this, PlayState* play) {
s32 ret = false;
- if ((this->stateFlags & 7) && Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ if (((this->stateFlags & SUBS_OFFER_MODE_MASK) != SUBS_OFFER_MODE_NONE) &&
+ Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->stateFlags |= TOILET_HAND_STATE_TALKING;
- SubS_UpdateFlags(&this->stateFlags, 0, 7);
+ SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
this->msgEventCallback = EnBjt_ChooseBehaviour;
this->behaviour = 0;
this->actionFunc = EnBjt_Talk;
@@ -363,8 +365,8 @@ void EnBjt_Talk(EnBjt* this, PlayState* play) {
s16 yaw = this->actor.yawTowardsPlayer;
if (func_8010BF58(&this->actor, play, sMsgEventScript, this->msgEventCallback, &this->msgEventArg4)) {
- this->actor.flags &= ~ACTOR_FLAG_100;
- SubS_UpdateFlags(&this->stateFlags, 3, 7);
+ this->actor.flags &= ~ACTOR_FLAG_TALK_REQUESTED;
+ SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->stateFlags &= ~TOILET_HAND_STATE_TALKING;
this->msgEventArg4 = 0;
this->actionFunc = EnBjt_FollowSchedule;
@@ -383,7 +385,7 @@ void EnBjt_FollowSchedule(EnBjt* this, PlayState* play) {
if (scheduleOutput.result == TOILET_HAND_SCH_AVAILABLE) {
if (this->stateFlags & TOILET_HAND_STATE_APPEARING) {
if (EnBjt_Appear(this)) {
- SubS_UpdateFlags(&this->stateFlags, 3, 7);
+ SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
}
} else if (this->stateFlags & TOILET_HAND_STATE_VANISHING) {
EnBjt_Vanish(this);
@@ -391,7 +393,7 @@ void EnBjt_FollowSchedule(EnBjt* this, PlayState* play) {
// Vanish if player goes too far away or heart piece given
if ((fabsf(this->actor.playerHeightRel) > 70.0f) || (this->actor.xzDistToPlayer > 140.0f) ||
CHECK_WEEKEVENTREG(WEEKEVENTREG_90_80)) {
- SubS_UpdateFlags(&this->stateFlags, 0, 7);
+ SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
this->playedSfx = false;
this->stateFlags &= ~TOILET_HAND_STATE_VISIBLE;
this->stateFlags |= TOILET_HAND_STATE_VANISHING;
@@ -406,7 +408,7 @@ void EnBjt_FollowSchedule(EnBjt* this, PlayState* play) {
}
this->scheduleResult = scheduleOutput.result;
} else {
- this->actor.flags |= ACTOR_FLAG_8000000;
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
Actor_SetScale(&this->actor, 0.0f);
this->stateFlags = 0;
this->msgEventCallback = NULL;
@@ -426,7 +428,7 @@ void EnBjt_Init(Actor* thisx, PlayState* play) {
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit);
- this->actor.flags |= ACTOR_FLAG_8000000;
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
Actor_SetScale(&this->actor, 0.0f);
this->scheduleResult = TOILET_HAND_SCH_NONE;
@@ -446,7 +448,7 @@ void EnBjt_Update(Actor* thisx, PlayState* play) {
if (this->scheduleResult != TOILET_HAND_SCH_NONE) {
EnBjt_UpdateSkelAnime(this);
- func_8013C964(&this->actor, play, 60.0f, 10.0f, PLAYER_IA_NONE, this->stateFlags & 7);
+ SubS_Offer(&this->actor, play, 60.0f, 10.0f, PLAYER_IA_NONE, this->stateFlags & SUBS_OFFER_MODE_MASK);
Actor_SetFocus(&this->actor, 26.0f);
EnBjt_UpdateCollision(this, play);
}
@@ -456,7 +458,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_Boj_01/z_en_boj_01.c b/src/overlays/actors/ovl_En_Boj_01/z_en_boj_01.c
index bd4b0e499..6abc25f79 100644
--- a/src/overlays/actors/ovl_En_Boj_01/z_en_boj_01.c
+++ b/src/overlays/actors/ovl_En_Boj_01/z_en_boj_01.c
@@ -6,7 +6,7 @@
#include "z_en_boj_01.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnBoj01*)thisx)
@@ -29,9 +29,12 @@ ActorInit En_Boj_01_InitVars = {
void EnBoj01_Init(Actor* thisx, PlayState* play) {
}
+
void EnBoj01_Destroy(Actor* thisx, PlayState* play) {
}
+
void EnBoj01_Update(Actor* thisx, PlayState* play) {
}
+
void EnBoj01_Draw(Actor* thisx, PlayState* play) {
}
diff --git a/src/overlays/actors/ovl_En_Boj_02/z_en_boj_02.c b/src/overlays/actors/ovl_En_Boj_02/z_en_boj_02.c
index 89f6ba0cb..ccf96aa67 100644
--- a/src/overlays/actors/ovl_En_Boj_02/z_en_boj_02.c
+++ b/src/overlays/actors/ovl_En_Boj_02/z_en_boj_02.c
@@ -6,7 +6,7 @@
#include "z_en_boj_02.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnBoj02*)thisx)
@@ -29,9 +29,12 @@ ActorInit En_Boj_02_InitVars = {
void EnBoj02_Init(Actor* thisx, PlayState* play) {
}
+
void EnBoj02_Destroy(Actor* thisx, PlayState* play) {
}
+
void EnBoj02_Update(Actor* thisx, PlayState* play) {
}
+
void EnBoj02_Draw(Actor* thisx, PlayState* play) {
}
diff --git a/src/overlays/actors/ovl_En_Boj_03/z_en_boj_03.c b/src/overlays/actors/ovl_En_Boj_03/z_en_boj_03.c
index 0c55b79a6..ee00b2b5c 100644
--- a/src/overlays/actors/ovl_En_Boj_03/z_en_boj_03.c
+++ b/src/overlays/actors/ovl_En_Boj_03/z_en_boj_03.c
@@ -6,7 +6,7 @@
#include "z_en_boj_03.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnBoj03*)thisx)
@@ -29,9 +29,12 @@ ActorInit En_Boj_03_InitVars = {
void EnBoj03_Init(Actor* thisx, PlayState* play) {
}
+
void EnBoj03_Destroy(Actor* thisx, PlayState* play) {
}
+
void EnBoj03_Update(Actor* thisx, PlayState* play) {
}
+
void EnBoj03_Draw(Actor* thisx, PlayState* play) {
}
diff --git a/src/overlays/actors/ovl_En_Boj_04/z_en_boj_04.c b/src/overlays/actors/ovl_En_Boj_04/z_en_boj_04.c
index 7fe308520..8ef2c98ea 100644
--- a/src/overlays/actors/ovl_En_Boj_04/z_en_boj_04.c
+++ b/src/overlays/actors/ovl_En_Boj_04/z_en_boj_04.c
@@ -6,7 +6,7 @@
#include "z_en_boj_04.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnBoj04*)thisx)
@@ -29,9 +29,12 @@ ActorInit En_Boj_04_InitVars = {
void EnBoj04_Init(Actor* thisx, PlayState* play) {
}
+
void EnBoj04_Destroy(Actor* thisx, PlayState* play) {
}
+
void EnBoj04_Update(Actor* thisx, PlayState* play) {
}
+
void EnBoj04_Draw(Actor* thisx, PlayState* play) {
}
diff --git a/src/overlays/actors/ovl_En_Boj_05/z_en_boj_05.c b/src/overlays/actors/ovl_En_Boj_05/z_en_boj_05.c
index da6816840..ccb7f1cef 100644
--- a/src/overlays/actors/ovl_En_Boj_05/z_en_boj_05.c
+++ b/src/overlays/actors/ovl_En_Boj_05/z_en_boj_05.c
@@ -6,7 +6,7 @@
#include "z_en_boj_05.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnBoj05*)thisx)
@@ -29,9 +29,12 @@ ActorInit En_Boj_05_InitVars = {
void EnBoj05_Init(Actor* thisx, PlayState* play) {
}
+
void EnBoj05_Destroy(Actor* thisx, PlayState* play) {
}
+
void EnBoj05_Update(Actor* thisx, PlayState* play) {
}
+
void EnBoj05_Draw(Actor* thisx, PlayState* play) {
}
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 a25a33904..2f76201c5 100644
--- a/src/overlays/actors/ovl_En_Bom/z_en_bom.c
+++ b/src/overlays/actors/ovl_En_Bom/z_en_bom.c
@@ -6,6 +6,7 @@
#include "z_en_bom.h"
#include "z64rumble.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "objects/gameplay_keep/gameplay_keep.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20)
@@ -17,11 +18,12 @@ void EnBom_Destroy(Actor* thisx, PlayState* play);
void EnBom_Update(Actor* thisx, PlayState* play);
void EnBom_Draw(Actor* thisx, PlayState* play);
-void func_80871058(EnBom* this, PlayState* play);
-void func_808714D4(EnBom* this, PlayState* play);
+void EnBom_Move(EnBom* this, PlayState* play);
+void EnBom_WaitForRelease(EnBom* this, PlayState* play);
+
void func_80872648(PlayState* play, Vec3f* arg1);
void func_808726DC(PlayState* play, Vec3f* arg1, Vec3f* arg2, Vec3f* arg3, s32 arg4);
-void func_80872BC0(PlayState* play, s32 arg1);
+void EnBom_DrawKeg(PlayState* play, s32 arg1);
typedef struct {
/* 0x00 */ Vec3f pos;
@@ -30,7 +32,7 @@ typedef struct {
/* 0x1A */ s16 rotX;
} PowderKegFuseSegment; // size = 0x1C
-static PowderKegFuseSegment sPowderKegFuseSegments[16];
+PowderKegFuseSegment sPowderKegFuseSegments[16];
ActorInit En_Bom_InitVars = {
ACTOR_EN_BOM,
@@ -137,7 +139,7 @@ void EnBom_Init(Actor* thisx, PlayState* play) {
this->actor.colChkInfo.cylHeight = 10;
this->flashSpeedScale = 7;
- this->isPowderKeg = ENBOM_GETX_1(&this->actor);
+ this->isPowderKeg = ENBOM_GET_1(&this->actor);
if (this->isPowderKeg) {
play->actorCtx.flags |= ACTORCTX_FLAG_0;
this->timer = gSaveContext.powderKegTimer;
@@ -150,19 +152,19 @@ void EnBom_Init(Actor* thisx, PlayState* play) {
Collider_SetCylinder(play, &this->collider1, &this->actor, &sCylinderInit);
if (!this->isPowderKeg) {
- Collider_SetJntSph(play, &this->collider2, &this->actor, &sJntSphInit1, &this->collider3);
+ Collider_SetJntSph(play, &this->collider2, &this->actor, &sJntSphInit1, this->collider2Elements);
this->collider1.dim.radius = 6;
this->collider1.dim.height = 11;
} else {
- Collider_SetJntSph(play, &this->collider2, &this->actor, &sJntSphInit2, &this->collider3);
+ Collider_SetJntSph(play, &this->collider2, &this->actor, &sJntSphInit2, this->collider2Elements);
this->collider1.dim.radius = 20;
this->collider1.dim.height = 36;
func_80872648(play, &this->actor.world.pos);
}
- this->collider3.info.toucher.damage += ENBOM_GETZ_FF00(thisx);
+ this->collider2Elements[0].info.toucher.damage += ENBOM_GET_FF00(thisx);
this->actor.shape.rot.z &= 0xFF;
- if (ENBOM_GETZ_80(&this->actor)) {
+ if (ENBOM_GET_80(&this->actor)) {
this->actor.shape.rot.z |= 0xFF00;
}
@@ -173,11 +175,11 @@ void EnBom_Init(Actor* thisx, PlayState* play) {
this->actor.flags |= ACTOR_FLAG_100000;
if (Actor_HasParent(&this->actor, play)) {
- this->actionFunc = func_808714D4;
+ this->actionFunc = EnBom_WaitForRelease;
this->actor.room = -1;
Actor_SetScale(&this->actor, enBomScales[this->isPowderKeg]);
} else {
- this->actionFunc = func_80871058;
+ this->actionFunc = EnBom_Move;
gSaveContext.powderKegTimer = 0;
}
}
@@ -192,24 +194,26 @@ void EnBom_Destroy(Actor* thisx, PlayState* play) {
}
}
-void func_80871058(EnBom* this, PlayState* play) {
+void EnBom_Move(EnBom* this, PlayState* play) {
static Vec3f D_80872E68[] = {
{ 2.0f, -6.0f, -0.3f },
{ 1.5f, -5.0f, -0.6f },
{ 0.2f, -6.0f, -0.1f },
};
+ // if bomb has a parent actor, the bomb hasnt been released yet
if (Actor_HasParent(&this->actor, play)) {
- this->actionFunc = func_808714D4;
+ this->actionFunc = EnBom_WaitForRelease;
this->actor.room = -1;
return;
}
- if ((this->actor.velocity.y > 0.0f) && (this->actor.bgCheckFlags & 0x10)) {
+ if ((this->actor.velocity.y > 0.0f) && (this->actor.bgCheckFlags & BGCHECKFLAG_CEILING)) {
this->actor.velocity.y = -this->actor.velocity.y;
}
- if ((this->actor.speedXZ != 0.0f) && (this->actor.bgCheckFlags & 8)) {
+ // rebound bomb off the wall it hits
+ if ((this->actor.speed != 0.0f) && (this->actor.bgCheckFlags & BGCHECKFLAG_WALL)) {
s16 yDiff = BINANG_SUB(this->actor.wallYaw, this->actor.world.rot.y);
if (ABS_ALT(yDiff) > 0x4000) {
@@ -217,17 +221,17 @@ void func_80871058(EnBom* this, PlayState* play) {
BINANG_SUB(this->actor.wallYaw - this->actor.world.rot.y + this->actor.wallYaw, 0x8000);
}
- Actor_PlaySfxAtPos(&this->actor, this->isPowderKeg ? NA_SE_EV_PUT_DOWN_WOODBOX : NA_SE_EV_BOMB_BOUND);
+ Actor_PlaySfx(&this->actor, this->isPowderKeg ? NA_SE_EV_PUT_DOWN_WOODBOX : NA_SE_EV_BOMB_BOUND);
Actor_MoveWithGravity(&this->actor);
- this->actor.speedXZ *= 0.7f;
- this->actor.bgCheckFlags &= ~8;
+ this->actor.speed *= 0.7f;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_WALL;
}
- if (!(this->actor.bgCheckFlags & 1)) {
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.08f);
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ 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;
@@ -236,11 +240,11 @@ void func_80871058(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);
@@ -251,64 +255,65 @@ void func_80871058(EnBom* this, PlayState* play) {
Math_ApproachF(&this->actor.shape.yOffset, 700.0f, 1.0f, 700.0f);
}
- sp40 = Math_SinS(this->actor.world.rot.y) * this->actor.speedXZ;
- sp3C = Math_CosS(this->actor.world.rot.y) * this->actor.speedXZ;
+ sp40 = Math_SinS(this->actor.world.rot.y) * this->actor.speed;
+ sp3C = Math_CosS(this->actor.world.rot.y) * this->actor.speed;
Actor_GetSlopeDirection(this->actor.floorPoly, &slopeNormal, &downwardSlopeYaw);
sp40 += 3.0f * slopeNormal.x;
sp3C += 3.0f * slopeNormal.z;
sp38 = sqrtf(SQ(sp40) + SQ(sp3C));
- if ((sp38 < this->actor.speedXZ) ||
- (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.speedXZ = 16.0f;
+ this->actor.speed = 16.0f;
} else {
- this->actor.speedXZ = sp38;
+ this->actor.speed = sp38;
}
this->actor.world.rot.y = Math_Atan2S_XY(sp3C, sp40);
}
- if (!Math_StepToF(&this->actor.speedXZ, 0.0f, sp58->x)) {
+ if (!Math_StepToF(&this->actor.speed, 0.0f, sp58->x)) {
s16 temp = this->actor.world.rot.y;
s32 pad;
if (ABS_ALT(BINANG_SUB(this->actor.world.rot.y, this->actor.shape.rot.y)) > 0x4000) {
temp = BINANG_ROT180(temp);
}
- Math_ScaledStepToS(&this->actor.shape.rot.y, temp, this->actor.speedXZ * 100.0f);
- this->unk_1FA += (s16)(this->actor.speedXZ * 800.0f);
+ Math_ScaledStepToS(&this->actor.shape.rot.y, temp, this->actor.speed * 100.0f);
+ this->unk_1FA += (s16)(this->actor.speed * 800.0f);
}
- if (this->actor.bgCheckFlags & 2) {
- Actor_PlaySfxAtPos(&this->actor, this->isPowderKeg ? NA_SE_EV_TRE_BOX_BOUND : NA_SE_EV_BOMB_BOUND);
+ 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;
}
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
}
} else if (this->timer >= 4) {
- Actor_LiftActor(&this->actor, play);
+ Actor_OfferCarry(&this->actor, play);
}
}
Actor_MoveWithGravity(&this->actor);
}
-void func_808714D4(EnBom* this, PlayState* play) {
+void EnBom_WaitForRelease(EnBom* this, PlayState* play) {
+ // if parent is NULL bomb has been released
if (Actor_HasNoParent(&this->actor, play)) {
- this->actionFunc = func_80871058;
+ this->actionFunc = EnBom_Move;
this->actor.room = play->roomCtx.curRoom.num;
this->actor.flags &= ~ACTOR_FLAG_100000;
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
Math_Vec3s_ToVec3f(&this->actor.prevPos, &this->actor.home.rot);
if (this->isPowderKeg) {
gSaveContext.powderKegTimer = 0;
}
- func_80871058(this, play);
+ EnBom_Move(this, play);
} else {
Math_Vec3f_ToVec3s(&this->actor.home.rot, &this->actor.parent->world.pos);
if (this->isPowderKeg) {
@@ -318,12 +323,12 @@ void func_808714D4(EnBom* this, PlayState* play) {
Math_ScaledStepToS(&this->unk_1FA, 0, 2000);
}
-void func_808715B8(EnBom* this, PlayState* play) {
+void EnBom_Explode(EnBom* this, PlayState* play) {
static s16 D_80872E8C[] = { 100, 200 };
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;
@@ -344,35 +349,35 @@ void func_808715B8(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 == ENBOM_1) {
+ if (this->actor.params == BOMB_TYPE_EXPLOSION) {
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider2.base);
}
- if (play->envCtx.lightSettings.diffuseColor1[0] != 0) {
- play->envCtx.lightSettings.diffuseColor1[0] -= 25;
+ if (play->envCtx.adjLightSettings.light1Color[0] != 0) {
+ play->envCtx.adjLightSettings.light1Color[0] -= 25;
}
- if (play->envCtx.lightSettings.diffuseColor1[1] != 0) {
- play->envCtx.lightSettings.diffuseColor1[1] -= 25;
+ if (play->envCtx.adjLightSettings.light1Color[1] != 0) {
+ play->envCtx.adjLightSettings.light1Color[1] -= 25;
}
- if (play->envCtx.lightSettings.diffuseColor1[2] != 0) {
- play->envCtx.lightSettings.diffuseColor1[2] -= 25;
+ if (play->envCtx.adjLightSettings.light1Color[2] != 0) {
+ play->envCtx.adjLightSettings.light1Color[2] -= 25;
}
- if (play->envCtx.lightSettings.ambientColor[0] != 0) {
- play->envCtx.lightSettings.ambientColor[0] -= 25;
+ if (play->envCtx.adjLightSettings.ambientColor[0] != 0) {
+ play->envCtx.adjLightSettings.ambientColor[0] -= 25;
}
- if (play->envCtx.lightSettings.ambientColor[1] != 0) {
- play->envCtx.lightSettings.ambientColor[1] -= 25;
+ if (play->envCtx.adjLightSettings.ambientColor[1] != 0) {
+ play->envCtx.adjLightSettings.ambientColor[1] -= 25;
}
- if (play->envCtx.lightSettings.ambientColor[2] != 0) {
- play->envCtx.lightSettings.ambientColor[2] -= 25;
+ if (play->envCtx.adjLightSettings.ambientColor[2] != 0) {
+ play->envCtx.adjLightSettings.ambientColor[2] -= 25;
}
if (this->timer == 0) {
@@ -390,11 +395,11 @@ void func_808715B8(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 {
@@ -419,16 +424,16 @@ void func_808715B8(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 spA4 = { 0.0f, 0.0f, 0.0f };
- Vec3f sp98 = { 0.0f, 0.1f, 0.0f };
- Vec3f sp8C = { 0.0f, 0.0f, 0.0f };
- Vec3f sp80;
- Vec3f sp74 = { 0.0f, 0.6f, 0.0f };
- Color_RGBA8 sp70 = { 255, 255, 255, 255 };
+ Vec3f effVelocity = { 0.0f, 0.0f, 0.0f };
+ Vec3f bomb2Accel = { 0.0f, 0.1f, 0.0f }; // unused
+ Vec3f effAccel = { 0.0f, 0.0f, 0.0f };
+ Vec3f effPos;
+ Vec3f dustAccel = { 0.0f, 0.6f, 0.0f };
+ Color_RGBA8 dustColor = { 255, 255, 255, 255 };
EnBom* this = THIS;
s32 pad;
Player* player = GET_PLAYER(play);
@@ -444,9 +449,9 @@ void EnBom_Update(Actor* thisx, PlayState* play) {
if (this->unk_1FC != 0) {
this->unk_1FC--;
- Math_ApproachZeroF(&thisx->speedXZ, 1.0f, 1.0f);
+ 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;
@@ -456,13 +461,13 @@ void EnBom_Update(Actor* thisx, PlayState* play) {
} else {
thisx->gravity = -1.2f;
if (this->timer != 0) {
- if (!this->isPowderKeg || (func_808715B8 == this->actionFunc) || !Play_InCsMode(play)) {
+ if (!this->isPowderKeg || (EnBom_Explode == this->actionFunc) || !Play_InCsMode(play)) {
this->timer--;
}
}
if ((!this->isPowderKeg && (this->timer == 67)) || (this->isPowderKeg && (this->timer <= 2400))) {
- Actor_PlaySfxAtPos(thisx, NA_SE_PL_TAKE_OUT_SHIELD);
+ Actor_PlaySfx(thisx, NA_SE_PL_TAKE_OUT_SHIELD);
Actor_SetScale(thisx, enBomScales[this->isPowderKeg]);
}
@@ -472,44 +477,52 @@ void EnBom_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
- Actor_UpdateBgCheckInfo(play, thisx, 35.0f, 10.0f, 36.0f, 0x1F);
- if (thisx->params == ENBOM_0) {
+ 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 },
{ 300, 60, 600 },
};
Vec3us* sp60 = &D_80872ED4[this->isPowderKeg];
- sp74.y = 0.2f;
- Math_Vec3f_Copy(&sp80, &thisx->home.pos);
+ // spawn spark effect on even frames
+ dustAccel.y = 0.2f;
+ Math_Vec3f_Copy(&effPos, &thisx->home.pos);
if ((play->gameplayFrames % 2) == 0) {
- EffectSsGSpk_SpawnFuse(play, thisx, &sp80, &spA4, &sp8C);
+ EffectSsGSpk_SpawnFuse(play, thisx, &effPos, &effVelocity, &effAccel);
}
if (this->isPowderKeg) {
- func_801A0810(&thisx->projectedPos, NA_SE_IT_BIG_BOMB_IGNIT - SFX_FLAG,
- (this->flashSpeedScale == 7) ? 0
- : (this->flashSpeedScale == 3) ? 1
- : 2);
+ Audio_PlaySfx_AtPosWithChannelIO(&thisx->projectedPos, NA_SE_IT_BIG_BOMB_IGNIT - SFX_FLAG,
+ (this->flashSpeedScale == 7) ? 0
+ : (this->flashSpeedScale == 3) ? 1
+ : 2);
} else {
- Actor_PlaySfxAtPos(thisx, NA_SE_IT_BOMB_IGNIT - SFX_FLAG);
+ Actor_PlaySfx(thisx, NA_SE_IT_BOMB_IGNIT - SFX_FLAG);
}
- sp80.y += 3.0f;
- func_800B0DE0(play, &sp80, &spA4, &sp74, &sp70, &sp70, 50, 5);
+ effPos.y += 3.0f;
+ func_800B0DE0(play, &effPos, &effVelocity, &dustAccel, &dustColor, &dustColor, 50, 5);
if ((this->collider1.base.acFlags & AC_HIT) ||
((this->collider1.base.ocFlags1 & OC1_HIT) && ((this->collider1.base.oc->category == ACTORCAT_ENEMY) ||
(this->collider1.base.oc->category == ACTORCAT_BOSS)))) {
this->timer = 0;
thisx->shape.rot.z = 0;
- } else if ((this->timer > 100) && (Player_IsBurningStickInRange(play, &thisx->world.pos, 30.0f, 50.0f))) {
- this->timer = 100;
+ } else {
+ // if a lit stick touches the bomb, set timer to 100
+ // these bombs never have a timer over 70, so this isn't used
+ if ((this->timer > 100) && Player_IsBurningStickInRange(play, &thisx->world.pos, 30.0f, 50.0f)) {
+ this->timer = 100;
+ }
}
- sp74.y = 0.2f;
- sp80 = thisx->world.pos;
- sp80.y += 10.0f;
+ dustAccel.y = 0.2f;
+ effPos = thisx->world.pos;
+ effPos.y += 10.0f;
+ // double bomb flash speed and adjust red color at certain times during the countdown
if ((this->timer == sp60->x) || (this->timer == sp60->y) || (this->timer == 3)) {
thisx->shape.rot.z = 0;
this->flashSpeedScale >>= 1;
@@ -526,62 +539,68 @@ void EnBom_Update(Actor* thisx, PlayState* play) {
}
if (this->timer == 0) {
- sp80 = thisx->world.pos;
- sp80.y += 10.0f;
+ effPos = thisx->world.pos;
+ effPos.y += 10.0f;
if (Actor_HasParent(thisx, play)) {
- sp80.y += 30.0f;
+ effPos.y += 30.0f;
}
- Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, sp80.x, sp80.y - 10.0f, sp80.z, 0, 0, 0,
- this->isPowderKeg);
- func_800BC848(thisx, play, D_80872E98[this->isPowderKeg], D_80872E9C[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] =
- play->envCtx.lightSettings.ambientColor[2] = 250;
+ //! @note Assumes `isPowderKeg` values aligns with clearTag params.
+ //! Here, 0/1 are small/large explosions respectively.
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, effPos.x, effPos.y - 10.0f, effPos.z, 0, 0, 0,
+ CLEAR_TAG_PARAMS(this->isPowderKeg));
+ Actor_RequestQuakeAndRumble(thisx, play, sQuakeY[this->isPowderKeg],
+ sQuakeDurations[this->isPowderKeg]);
+ play->envCtx.adjLightSettings.light1Color[0] = play->envCtx.adjLightSettings.light1Color[1] =
+ play->envCtx.adjLightSettings.light1Color[2] = 250;
+ play->envCtx.adjLightSettings.ambientColor[0] = play->envCtx.adjLightSettings.ambientColor[1] =
+ play->envCtx.adjLightSettings.ambientColor[2] = 250;
Camera_AddQuake(&play->mainCamera, 2, 11, 8);
- thisx->params = ENBOM_1;
+ thisx->params = BOMB_TYPE_EXPLOSION;
this->timer = 10;
thisx->flags |= (ACTOR_FLAG_20 | ACTOR_FLAG_100000);
- this->actionFunc = func_808715B8;
+ this->actionFunc = EnBom_Explode;
if (this->isPowderKeg) {
gSaveContext.powderKegTimer = 0;
- Actor_PlaySfxAtPos(thisx, NA_SE_IT_BIG_BOMB_EXPLOSION);
+ Actor_PlaySfx(thisx, NA_SE_IT_BIG_BOMB_EXPLOSION);
} else {
- Actor_PlaySfxAtPos(thisx, NA_SE_IT_BOMB_EXPLOSION);
+ Actor_PlaySfx(thisx, NA_SE_IT_BOMB_EXPLOSION);
}
}
}
Actor_SetFocus(thisx, 20.0f);
- if (thisx->params <= ENBOM_0) {
+ if (thisx->params <= BOMB_TYPE_BODY) {
Collider_UpdateCylinder(thisx, &this->collider1);
+
+ // if link is not holding the bomb anymore and bump conditions are met, subscribe to OC
if (!Actor_HasParent(thisx, play) && (this->unk_1F8 != 0)) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider1.base);
}
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider1.base);
}
- if ((enBomScales[this->isPowderKeg] <= thisx->scale.x) && (thisx->params != ENBOM_1)) {
+ if ((enBomScales[this->isPowderKeg] <= thisx->scale.x) && (thisx->params != BOMB_TYPE_EXPLOSION)) {
if (thisx->depthInWater >= 20.0f) {
- Vec3f sp54;
+ Vec3f effPos;
- sp54.x = thisx->world.pos.x;
- sp54.y = thisx->world.pos.y + thisx->depthInWater;
- sp54.z = thisx->world.pos.z;
- EffectSsGRipple_Spawn(play, &sp54, 70, 500, 0);
- EffectSsGRipple_Spawn(play, &sp54, 70, 500, 10);
- sp54.y += 10.0f;
- EffectSsGSplash_Spawn(play, &sp54, NULL, NULL, 1, 500);
- Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, sp54.x, sp54.y, sp54.z, 0, 0, 1, 200);
+ effPos.x = thisx->world.pos.x;
+ effPos.y = thisx->world.pos.y + thisx->depthInWater;
+ effPos.z = thisx->world.pos.z;
+ EffectSsGRipple_Spawn(play, &effPos, 70, 500, 0);
+ EffectSsGRipple_Spawn(play, &effPos, 70, 500, 10);
+ effPos.y += 10.0f;
+ EffectSsGSplash_Spawn(play, &effPos, NULL, NULL, 1, 500);
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, effPos.x, effPos.y, effPos.z, 0, 0, 1,
+ CLEAR_TAG_PARAMS(CLEAR_TAG_SMOKE));
SoundSource_PlaySfxAtFixedWorldPos(play, &thisx->world.pos, 30, NA_SE_IT_BOMB_UNEXPLOSION);
this->unk_1F4 = 0.0f;
thisx->velocity.y = (KREG(83) * 0.1f) + -2.0f;
thisx->gravity = (KREG(84) * 0.1f) + -0.5f;
this->unk_1FC = KREG(81) + 10;
- } else if (thisx->bgCheckFlags & 0x40) {
- thisx->bgCheckFlags &= ~0x40;
- Actor_PlaySfxAtPos(thisx, NA_SE_EV_BOMB_DROP_WATER);
+ } else if (thisx->bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) {
+ thisx->bgCheckFlags &= ~BGCHECKFLAG_WATER_TOUCH;
+ Actor_PlaySfx(thisx, NA_SE_EV_BOMB_DROP_WATER);
}
}
}
@@ -600,8 +619,8 @@ void EnBom_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- if (this->actor.params == ENBOM_0) {
- func_8012C28C(play->state.gfxCtx);
+ if (this->actor.params == BOMB_TYPE_BODY) {
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Collider_UpdateSpheres(0, &this->collider2);
@@ -644,7 +663,7 @@ void EnBom_Draw(Actor* thisx, PlayState* play) {
gSPDisplayList(POLY_OPA_DISP++, gPowderKegGoronSkullDL);
func_808726DC(play, &this->actor.home.pos, &sp58, &sp4C, this->timer);
- func_80872BC0(play, this->timer);
+ EnBom_DrawKeg(play, this->timer);
}
}
@@ -768,7 +787,7 @@ void func_808726DC(PlayState* play, Vec3f* arg1, Vec3f* arg2, Vec3f* arg3, s32 a
Math_Vec3f_Copy(arg1, &fuseSegmentPtr->pos);
}
-void func_80872BC0(PlayState* play, s32 arg1) {
+void EnBom_DrawKeg(PlayState* play, s32 arg1) {
s32 temp_s5;
s32 i;
PowderKegFuseSegment* fuseSegmentPtr = &sPowderKegFuseSegments[0];
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 23218a183..723c11e8a 100644
--- a/src/overlays/actors/ovl_En_Bom/z_en_bom.h
+++ b/src/overlays/actors/ovl_En_Bom/z_en_bom.h
@@ -7,20 +7,26 @@ struct EnBom;
typedef void (*EnBomActionFunc)(struct EnBom*, PlayState*);
-#define ENBOM_GETX_1(thisx) ((thisx)->shape.rot.x & 1)
-#define ENBOM_GETZ_80(thisx) ((thisx)->shape.rot.z & 0x80)
-#define ENBOM_GETZ_FF00(thisx) (((thisx)->shape.rot.z & 0xFF00) >> 8)
+#define ENBOM_GET_1(thisx) ((thisx)->shape.rot.x & 1)
+#define ENBOM_GET_80(thisx) ((thisx)->shape.rot.z & 0x80)
+#define ENBOM_GET_FF00(thisx) (((thisx)->shape.rot.z & 0xFF00) >> 8)
-enum {
- /* 0 */ ENBOM_0,
- /* 1 */ ENBOM_1,
-};
+typedef enum BombType {
+ /* 0 */ BOMB_TYPE_BODY,
+ /* 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;
/* 0x190 */ ColliderJntSph collider2;
- /* 0x1B0 */ ColliderJntSphElement collider3;
+ /* 0x1B0 */ ColliderJntSphElement collider2Elements[1];
/* 0x1F0 */ s16 timer;
/* 0x1F2 */ s16 flashSpeedScale;
/* 0x1F4 */ f32 unk_1F4;
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 da6e8d6d0..061081bc1 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
@@ -7,7 +7,7 @@
#include "z_en_bom_bowl_man.h"
#include "objects/object_cs/object_cs.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnBomBowlMan*)thisx)
@@ -49,16 +49,75 @@ ActorInit En_Bom_Bowl_Man_InitVars = {
(ActorFunc)EnBomBowlMan_Draw,
};
-static AnimationHeader* sAnimations[] = {
- &gBomberIdleAnim, &object_cs_Anim_00FAF4, &object_cs_Anim_0057C8, &object_cs_Anim_0053F4,
- &object_cs_Anim_002044, &object_cs_Anim_01007C, &object_cs_Anim_00349C, &object_cs_Anim_004960,
- &object_cs_Anim_005128, &object_cs_Anim_004C1C, &object_cs_Anim_001A1C, &object_cs_Anim_003EE4,
- &object_cs_Anim_00478C, &object_cs_Anim_00433C, &object_cs_Anim_0060E8, &object_cs_Anim_001708,
- &object_cs_Anim_005DC4, &object_cs_Anim_0026B0, &object_cs_Anim_0036B0, &object_cs_Anim_0031C4,
+typedef enum {
+ /* -1 */ ENBOMBOWLMAN_ANIM_NONE = -1,
+ /* 0x00 */ ENBOMBOWLMAN_ANIM_0,
+ /* 0x01 */ ENBOMBOWLMAN_ANIM_1,
+ /* 0x02 */ ENBOMBOWLMAN_ANIM_2,
+ /* 0x03 */ ENBOMBOWLMAN_ANIM_3,
+ /* 0x04 */ ENBOMBOWLMAN_ANIM_4,
+ /* 0x05 */ ENBOMBOWLMAN_ANIM_5,
+ /* 0x06 */ ENBOMBOWLMAN_ANIM_6,
+ /* 0x07 */ ENBOMBOWLMAN_ANIM_7,
+ /* 0x08 */ ENBOMBOWLMAN_ANIM_8,
+ /* 0x09 */ ENBOMBOWLMAN_ANIM_9,
+ /* 0x0A */ ENBOMBOWLMAN_ANIM_10,
+ /* 0x0B */ ENBOMBOWLMAN_ANIM_11,
+ /* 0x0C */ ENBOMBOWLMAN_ANIM_12,
+ /* 0x0D */ ENBOMBOWLMAN_ANIM_13,
+ /* 0x0E */ ENBOMBOWLMAN_ANIM_14,
+ /* 0x0F */ ENBOMBOWLMAN_ANIM_15,
+ /* 0x10 */ ENBOMBOWLMAN_ANIM_16,
+ /* 0x11 */ ENBOMBOWLMAN_ANIM_17,
+ /* 0x12 */ ENBOMBOWLMAN_ANIM_18,
+ /* 0x13 */ ENBOMBOWLMAN_ANIM_19,
+ /* 0x14 */ ENBOMBOWLMAN_ANIM_MAX
+} EnBomBowlManAnimation;
+
+static AnimationHeader* sAnimations[ENBOMBOWLMAN_ANIM_MAX] = {
+ &gBomberIdleAnim, // ENBOMBOWLMAN_ANIM_0
+ &object_cs_Anim_00FAF4, // ENBOMBOWLMAN_ANIM_1
+ &object_cs_Anim_0057C8, // ENBOMBOWLMAN_ANIM_2
+ &object_cs_Anim_0053F4, // ENBOMBOWLMAN_ANIM_3
+ &object_cs_Anim_002044, // ENBOMBOWLMAN_ANIM_4
+ &object_cs_Anim_01007C, // ENBOMBOWLMAN_ANIM_5
+ &object_cs_Anim_00349C, // ENBOMBOWLMAN_ANIM_6
+ &object_cs_Anim_004960, // ENBOMBOWLMAN_ANIM_7
+ &object_cs_Anim_005128, // ENBOMBOWLMAN_ANIM_8
+ &object_cs_Anim_004C1C, // ENBOMBOWLMAN_ANIM_9
+ &object_cs_Anim_001A1C, // ENBOMBOWLMAN_ANIM_10
+ &object_cs_Anim_003EE4, // ENBOMBOWLMAN_ANIM_11
+ &object_cs_Anim_00478C, // ENBOMBOWLMAN_ANIM_12
+ &object_cs_Anim_00433C, // ENBOMBOWLMAN_ANIM_13
+ &object_cs_Anim_0060E8, // ENBOMBOWLMAN_ANIM_14
+ &object_cs_Anim_001708, // ENBOMBOWLMAN_ANIM_15
+ &object_cs_Anim_005DC4, // ENBOMBOWLMAN_ANIM_16
+ &object_cs_Anim_0026B0, // ENBOMBOWLMAN_ANIM_17
+ &object_cs_Anim_0036B0, // ENBOMBOWLMAN_ANIM_18
+ &object_cs_Anim_0031C4, // ENBOMBOWLMAN_ANIM_19
};
-u8 D_809C6178[] = {
- 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 2, 0, 0,
+static u8 sAnimationModes[ENBOMBOWLMAN_ANIM_MAX] = {
+ ANIMMODE_LOOP, // ENBOMBOWLMAN_ANIM_0
+ ANIMMODE_LOOP, // ENBOMBOWLMAN_ANIM_1
+ ANIMMODE_LOOP, // ENBOMBOWLMAN_ANIM_2
+ ANIMMODE_LOOP, // ENBOMBOWLMAN_ANIM_3
+ ANIMMODE_LOOP, // ENBOMBOWLMAN_ANIM_4
+ ANIMMODE_LOOP, // ENBOMBOWLMAN_ANIM_5
+ ANIMMODE_ONCE, // ENBOMBOWLMAN_ANIM_6
+ ANIMMODE_ONCE, // ENBOMBOWLMAN_ANIM_7
+ ANIMMODE_LOOP, // ENBOMBOWLMAN_ANIM_8
+ ANIMMODE_LOOP, // ENBOMBOWLMAN_ANIM_9
+ ANIMMODE_LOOP, // ENBOMBOWLMAN_ANIM_10
+ ANIMMODE_ONCE, // ENBOMBOWLMAN_ANIM_11
+ ANIMMODE_LOOP, // ENBOMBOWLMAN_ANIM_12
+ ANIMMODE_LOOP, // ENBOMBOWLMAN_ANIM_13
+ ANIMMODE_LOOP, // ENBOMBOWLMAN_ANIM_14
+ ANIMMODE_ONCE, // ENBOMBOWLMAN_ANIM_15
+ ANIMMODE_LOOP, // ENBOMBOWLMAN_ANIM_16
+ ANIMMODE_ONCE, // ENBOMBOWLMAN_ANIM_17
+ ANIMMODE_LOOP, // ENBOMBOWLMAN_ANIM_18
+ ANIMMODE_LOOP, // ENBOMBOWLMAN_ANIM_19
};
u16 D_809C618C[] = { 0x710, 0x711, 0x715, 0x716, 0x717, 0x718 };
@@ -77,10 +136,10 @@ void EnBomBowlMan_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 19.0f);
this->actor.gravity = -3.0f;
SkelAnime_InitFlex(play, &this->skelAnime, &object_cs_Skel_00F82C, &gBomberIdleAnim, this->jointTable,
- this->morphTable, 21);
+ this->morphTable, OBJECT_CS_LIMB_MAX);
this->unk_2F6 = ENBOMBOWLMAN_GET_F0(&this->actor);
this->unk_2F4 = ENBOMBOWLMAN_GET_F(&this->actor);
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
Actor_SetScale(&this->actor, 0.01f);
if (this->unk_2F6 == ENBOMBOWLMAN_F0_0) {
@@ -93,14 +152,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);
@@ -112,38 +171,38 @@ void EnBomBowlMan_Init(Actor* thisx, PlayState* play) {
void EnBomBowlMan_Destroy(Actor* thisx, PlayState* play) {
}
-void func_809C493C(EnBomBowlMan* this, s32 arg1, f32 arg2) {
- this->unk_2F8 = arg1;
- this->unk_2C4 = Animation_GetLastFrame(sAnimations[arg1]);
- Animation_Change(&this->skelAnime, sAnimations[this->unk_2F8], arg2, 0.0f, this->unk_2C4, D_809C6178[this->unk_2F8],
- -4.0f);
+void EnBomBowlMan_ChangeAnim(EnBomBowlMan* this, s32 animIndex, f32 playSpeed) {
+ this->animIndex = animIndex;
+ this->animEndFrame = Animation_GetLastFrame(sAnimations[animIndex]);
+ Animation_Change(&this->skelAnime, sAnimations[this->animIndex], playSpeed, 0.0f, this->animEndFrame,
+ sAnimationModes[this->animIndex], -4.0f);
}
void func_809C49CC(EnBomBowlMan* this) {
- if ((this->unk_2F8 == 5) &&
+ if ((this->animIndex == ENBOMBOWLMAN_ANIM_5) &&
(Animation_OnFrame(&this->skelAnime, 9.0f) || Animation_OnFrame(&this->skelAnime, 10.0f) ||
Animation_OnFrame(&this->skelAnime, 17.0f) || Animation_OnFrame(&this->skelAnime, 18.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMBERS_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BOMBERS_WALK);
}
- if ((this->unk_2F8 == 0xB) &&
+ if ((this->animIndex == ENBOMBOWLMAN_ANIM_11) &&
(Animation_OnFrame(&this->skelAnime, 4.0f) || Animation_OnFrame(&this->skelAnime, 8.0f) ||
Animation_OnFrame(&this->skelAnime, 12.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMBERS_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BOMBERS_WALK);
}
- if ((this->unk_2F8 == 0x12) &&
+ if ((this->animIndex == ENBOMBOWLMAN_ANIM_18) &&
(Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 2.0f) ||
Animation_OnFrame(&this->skelAnime, 4.0f) || Animation_OnFrame(&this->skelAnime, 6.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMBERS_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BOMBERS_WALK);
}
- if ((this->unk_2F8 == 0xF) && Animation_OnFrame(&this->skelAnime, 15.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMBERS_LAND);
+ if ((this->animIndex == ENBOMBOWLMAN_ANIM_15) && Animation_OnFrame(&this->skelAnime, 15.0f)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BOMBERS_LAND);
}
- if ((this->unk_2F8 == 6) && Animation_OnFrame(&this->skelAnime, 8.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMBERS_LAND);
+ if ((this->animIndex == ENBOMBOWLMAN_ANIM_6) && Animation_OnFrame(&this->skelAnime, 8.0f)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BOMBERS_LAND);
}
}
@@ -156,7 +215,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);
}
@@ -171,11 +230,11 @@ void func_809C4BC4(EnBomBowlMan* this, PlayState* play) {
s8 code;
func_809C4B50(this);
- func_809C493C(this, 0, 1.0f);
+ EnBomBowlMan_ChangeAnim(this, ENBOMBOWLMAN_ANIM_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,14 +251,14 @@ 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);
+ EnBomBowlMan_ChangeAnim(this, ENBOMBOWLMAN_ANIM_3, 1.0f);
this->unk_2D4 = this->actor.yawTowardsPlayer;
this->unk_290 = this->actor.yawTowardsPlayer;
CLEAR_WEEKEVENTREG(WEEKEVENTREG_73_10);
@@ -214,18 +273,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;
@@ -242,22 +301,22 @@ void func_809C4DA4(EnBomBowlMan* this, PlayState* play) {
s32 pad;
s32 sp28 = false;
- func_801477B4(play);
+ Message_CloseTextbox(play);
switch (this->unk_2C0) {
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;
- func_809C493C(this, 17, 1.0f);
+ EnBomBowlMan_ChangeAnim(this, ENBOMBOWLMAN_ANIM_17, 1.0f);
break;
case 1:
D_809C6104 = 0;
- func_809C493C(this, 3, 1.0f);
+ EnBomBowlMan_ChangeAnim(this, ENBOMBOWLMAN_ANIM_3, 1.0f);
this->unk_2D4 = this->actor.yawTowardsPlayer;
this->unk_2C0 = 2;
if ((player->transformation == PLAYER_FORM_HUMAN) && CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
@@ -268,21 +327,21 @@ 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 {
this->unk_2C0 = 3;
play->msgCtx.msgLength = 0;
- func_809C493C(this, 1, 1.0f);
+ EnBomBowlMan_ChangeAnim(this, ENBOMBOWLMAN_ANIM_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,29 +358,32 @@ 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);
+ EnBomBowlMan_ChangeAnim(this, ENBOMBOWLMAN_ANIM_1, 1.0f);
D_809C6100 = 1;
this->actionFunc = func_809C5B1C;
sp28 = true;
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;
+
+ default:
+ break;
}
if (!sp28) {
if (player->transformation == PLAYER_FORM_HUMAN) {
- func_80151938(play, D_809C618C[this->unk_2C0]);
+ Message_ContinueTextbox(play, D_809C618C[this->unk_2C0]);
} else {
- func_80151938(play, D_809C6198[this->unk_2C0]);
+ Message_ContinueTextbox(play, D_809C6198[this->unk_2C0]);
}
}
}
@@ -330,8 +392,8 @@ void func_809C4DA4(EnBomBowlMan* this, PlayState* play) {
void func_809C51B4(EnBomBowlMan* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if ((play->msgCtx.unk120B1 == 0) &&
- ((play->msgCtx.msgMode == 0) || (Message_GetState(&play->msgCtx) == TEXT_STATE_DONE))) {
+ if ((play->msgCtx.bombersNotebookEventQueueCount == 0) &&
+ ((play->msgCtx.msgMode == MSGMODE_NONE) || (Message_GetState(&play->msgCtx) == TEXT_STATE_DONE))) {
play->nextEntrance = Entrance_CreateFromSpawn(6);
gSaveContext.nextCutsceneIndex = 0;
play->transitionTrigger = TRANS_TRIGGER_START;
@@ -351,8 +413,8 @@ void func_809C51B4(EnBomBowlMan* this, PlayState* play) {
void func_809C52B4(EnBomBowlMan* this) {
this->actor.draw = NULL;
this->actor.flags |= ACTOR_FLAG_10;
- this->actor.flags |= ACTOR_FLAG_8000000;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.world.pos.x = 1340.0f;
this->actor.world.pos.z = -1795.0f;
this->unk_29C = 3;
@@ -365,7 +427,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 {
@@ -378,7 +440,7 @@ void func_809C53A4(EnBomBowlMan* this) {
this->actor.draw = EnBomBowlMan_Draw;
this->actor.world.pos.x = 1360.0f;
this->actor.world.pos.z = -1870.0f;
- func_809C493C(this, 18, 1.0f);
+ EnBomBowlMan_ChangeAnim(this, ENBOMBOWLMAN_ANIM_18, 1.0f);
this->unk_29C = 3;
this->actionFunc = func_809C5408;
}
@@ -404,14 +466,14 @@ void func_809C5524(EnBomBowlMan* this, PlayState* play) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_85_02)) {
this->actor.textId = 0x72F;
}
- func_809C493C(this, 3, 1.0f);
+ EnBomBowlMan_ChangeAnim(this, ENBOMBOWLMAN_ANIM_3, 1.0f);
Message_StartTextbox(play, this->actor.textId, &this->actor);
this->actionFunc = func_809C5598;
}
void func_809C5598(EnBomBowlMan* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
if ((this->actor.textId == 0x72F) || (this->actor.textId == 0x730)) {
this->actor.textId = 0x731;
} else if (this->actor.textId == 0x731) {
@@ -423,23 +485,23 @@ 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_809C493C(this, 17, 1.0f);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_END);
+ EnBomBowlMan_ChangeAnim(this, ENBOMBOWLMAN_ANIM_17, 1.0f);
func_809C59A4(this, play);
return;
} else if (this->actor.textId == 0x716) {
this->actor.textId = 0x735;
} 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);
+ EnBomBowlMan_ChangeAnim(this, ENBOMBOWLMAN_ANIM_17, 1.0f);
+ 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;
}
- func_80151938(play, this->actor.textId);
+ Message_ContinueTextbox(play, this->actor.textId);
}
}
@@ -448,31 +510,31 @@ 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) &&
- ((play->msgCtx.msgMode == 0) || (Message_GetState(&play->msgCtx) == TEXT_STATE_DONE))) {
+ if ((play->msgCtx.bombersNotebookEventQueueCount == 0) &&
+ ((play->msgCtx.msgMode == MSGMODE_NONE) || (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);
+ EnBomBowlMan_ChangeAnim(this, ENBOMBOWLMAN_ANIM_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);
+ EnBomBowlMan_ChangeAnim(this, ENBOMBOWLMAN_ANIM_18, 1.0f);
}
} else {
Math_SmoothStepToS(&this->actor.world.rot.y, yaw, 1, 2000, 10);
@@ -485,7 +547,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;
}
@@ -496,7 +558,7 @@ void func_809C5738(EnBomBowlMan* this, PlayState* play) {
}
void func_809C59A4(EnBomBowlMan* this, PlayState* play) {
- Actor_PickUp(&this->actor, play, GI_BOMBERS_NOTEBOOK, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_BOMBERS_NOTEBOOK, 300.0f, 300.0f);
this->unk_29C = 1;
this->actionFunc = func_809C59F0;
}
@@ -510,10 +572,10 @@ void func_809C59F0(EnBomBowlMan* this, PlayState* play) {
} else {
this->actor.textId = 0x716;
}
- func_800B8500(&this->actor, play, 400.0f, 400.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 400.0f, 400.0f, PLAYER_IA_MINUS1);
this->actionFunc = func_809C5AA4;
} else {
- Actor_PickUp(&this->actor, play, GI_BOMBERS_NOTEBOOK, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_BOMBERS_NOTEBOOK, 300.0f, 300.0f);
}
}
@@ -525,63 +587,63 @@ void func_809C5AA4(EnBomBowlMan* this, PlayState* play) {
this->actionFunc = func_809C5598;
}
} else {
- func_800B8500(&this->actor, play, 400.0f, 400.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 400.0f, 400.0f, PLAYER_IA_MINUS1);
}
}
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);
}
}
void func_809C5BA0(EnBomBowlMan* this) {
if (this->unk_2F4 != 0) {
- func_809C493C(this, 0, 1.0f);
+ EnBomBowlMan_ChangeAnim(this, ENBOMBOWLMAN_ANIM_0, 1.0f);
} else {
- this->unk_2F8 = 0;
+ this->animIndex = ENBOMBOWLMAN_ANIM_0;
}
this->unk_29C = 2;
this->actionFunc = func_809C5BF4;
}
void func_809C5BF4(EnBomBowlMan* this, PlayState* play) {
- f32 sp2C = this->skelAnime.curFrame;
+ f32 curFrame = this->skelAnime.curFrame;
Camera* subCam;
- if ((D_809C6104 != 0) && (this->unk_2F8 != 15)) {
- func_809C493C(this, 15, 1.0f);
+ if ((D_809C6104 != 0) && (this->animIndex != ENBOMBOWLMAN_ANIM_15)) {
+ EnBomBowlMan_ChangeAnim(this, ENBOMBOWLMAN_ANIM_15, 1.0f);
}
- if ((this->unk_2F8 == 15) && (this->unk_2C4 <= sp2C)) {
- func_809C493C(this, 0, 1.0f);
+ if ((this->animIndex == ENBOMBOWLMAN_ANIM_15) && (curFrame >= this->animEndFrame)) {
+ EnBomBowlMan_ChangeAnim(this, ENBOMBOWLMAN_ANIM_0, 1.0f);
}
if (D_809C6100 != 0) {
- if ((this->unk_2F8 == 0) && (D_809C6100 == (this->unk_2F4 + 1))) {
- func_809C493C(this, 11, 1.0f);
+ if ((this->animIndex == ENBOMBOWLMAN_ANIM_0) && (D_809C6100 == (this->unk_2F4 + 1))) {
+ EnBomBowlMan_ChangeAnim(this, ENBOMBOWLMAN_ANIM_11, 1.0f);
}
- if ((this->unk_2F8 == 11) && (this->unk_2C4 <= sp2C)) {
- func_809C493C(this, 12, 1.0f);
+ if ((this->animIndex == ENBOMBOWLMAN_ANIM_11) && (curFrame >= this->animEndFrame)) {
+ EnBomBowlMan_ChangeAnim(this, ENBOMBOWLMAN_ANIM_12, 1.0f);
D_809C6100++;
}
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);
- func_801477B4(play);
+ Message_CloseTextbox(play);
Camera_SetTargetActor(subCam, &this->unk_2D8[0]->actor);
- func_809C493C(this, 13, 1.0f);
+ EnBomBowlMan_ChangeAnim(this, ENBOMBOWLMAN_ANIM_13, 1.0f);
D_809C6100 = 0;
if (player->transformation == PLAYER_FORM_HUMAN) {
this->unk_2C0 = 5;
@@ -630,25 +692,27 @@ 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) {
EnBomBowlMan* this = THIS;
- if (limbIndex == 15) {
+ if (limbIndex == OBJECT_CS_LIMB_0F) {
*dList = NULL;
}
- if (limbIndex == 17) {
+ if (limbIndex == OBJECT_CS_LIMB_11) {
rot->x += this->unk_28A;
}
- if ((limbIndex == 19) && (this->unk_2F6 == ENBOMBOWLMAN_F0_2)) {
+ if ((limbIndex == OBJECT_CS_LIMB_13) && (this->unk_2F6 == ENBOMBOWLMAN_F0_2)) {
*dList = NULL;
}
- if ((limbIndex == 20) && (this->unk_2F6 == ENBOMBOWLMAN_F0_0)) {
+ if ((limbIndex == OBJECT_CS_LIMB_14) && (this->unk_2F6 == ENBOMBOWLMAN_F0_0)) {
*dList = NULL;
}
return false;
@@ -676,8 +740,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..b6b749076 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
@@ -2,6 +2,7 @@
#define Z_EN_BOM_BOWL_MAN_H
#include "global.h"
+#include "objects/object_cs/object_cs.h"
struct EnBomBowlMan;
@@ -9,52 +10,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[OBJECT_CS_LIMB_MAX];
+ /* 0x206 */ Vec3s morphTable[OBJECT_CS_LIMB_MAX];
+ /* 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 animEndFrame;
+ /* 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 animIndex;
} 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 cbcc40211..4409a7316 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
@@ -58,7 +58,7 @@ static ColliderSphereInit sSphereInit = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_U8(targetMode, 2, ICHAIN_CONTINUE),
+ ICHAIN_U8(targetMode, TARGET_MODE_2, ICHAIN_CONTINUE),
ICHAIN_VEC3F_DIV1000(scale, 1000 * BOMBCHU_SCALE, ICHAIN_STOP),
};
@@ -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,14 +177,14 @@ 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;
- func_800B8EF4(play, &this->actor);
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
+ Actor_PlaySfx_SurfaceBomb(play, &this->actor);
this->isMoving = true;
- this->actor.speedXZ = 8.0f;
+ this->actor.speed = 8.0f;
this->movingSpeed = 8.0f;
EnBomChu_SetupMove(this);
}
@@ -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;
}
@@ -233,7 +233,7 @@ void EnBomChu_Move(EnBomChu* this, PlayState* play) {
bgIdUpDown = bgIdSide = BGCHECK_SCENE;
isFloorPolyValid = false;
- this->actor.speedXZ = this->movingSpeed;
+ this->actor.speed = this->movingSpeed;
lineLength = 2.0f * this->movingSpeed;
if ((this->timer == 0) || (this->collider.base.acFlags & AC_HIT) || (this->collider.base.ocFlags1 & OC1_HIT)) {
@@ -259,7 +259,7 @@ void EnBomChu_Move(EnBomChu* this, PlayState* play) {
isFloorPolyValid = EnBomChu_UpdateFloorPoly(this, polySide, play);
Math_Vec3f_Copy(&this->actor.world.pos, &posSide);
this->actor.floorBgId = bgIdSide;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
} else {
if (this->actor.floorPoly != polyUpDown) {
isFloorPolyValid = EnBomChu_UpdateFloorPoly(this, polyUpDown, play);
@@ -269,7 +269,7 @@ void EnBomChu_Move(EnBomChu* this, PlayState* play) {
this->actor.floorBgId = bgIdUpDown;
}
} else {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
lineLength *= 3.0f;
Math_Vec3f_Copy(&posA, &posB);
@@ -313,11 +313,11 @@ void EnBomChu_Move(EnBomChu* this, PlayState* play) {
}
if (this->isMoving) {
- func_800B8F98(&this->actor, NA_SE_IT_BOMBCHU_MOVE - SFX_FLAG);
+ Actor_PlaySfx_FlaggedCentered1(&this->actor, NA_SE_IT_BOMBCHU_MOVE - SFX_FLAG);
}
- if (this->actor.speedXZ != 0.0f) {
- this->movingSpeed = this->actor.speedXZ;
+ if (this->actor.speed != 0.0f) {
+ this->movingSpeed = this->actor.speed;
}
}
@@ -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;
@@ -336,7 +336,7 @@ void EnBomChu_Explode(EnBomChu* this, PlayState* play) {
}
this->timer = 1;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->actor.depthInWater > 0.0f) {
for (i = 0; i < 40; i++) {
@@ -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;
@@ -441,7 +441,7 @@ void EnBomChu_HandleNonSceneCollision(EnBomChu* this, PlayState* play) {
isFloorPolyValid = EnBomChu_UpdateFloorPoly(this, poly, play);
Math_Vec3f_Copy(&this->actor.world.pos, &originalWorldPos);
this->actor.floorBgId = bgId;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (isFloorPolyValid) {
EnBomChu_UpdateRotation(this);
@@ -512,23 +512,23 @@ void EnBomChu_Update(Actor* thisx, PlayState* play) {
this->actor.depthInWater = waterY - this->actor.world.pos.y;
if (this->actor.depthInWater < 0.0f) {
- if (this->actor.bgCheckFlags & 0x20) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER) {
EnBomChu_SpawnRipplesAndSplashes(this, play, waterY, true);
}
- this->actor.bgCheckFlags &= ~0x20;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_WATER;
return;
}
- if (!(this->actor.bgCheckFlags & 0x20) && (this->timer != 120)) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_WATER) && (this->timer != 120)) {
EnBomChu_SpawnRipplesAndSplashes(this, play, waterY, true);
} else {
EffectSsBubble_Spawn(play, &this->actor.world.pos, 0.0f, 3.0f, 15.0f, 0.25f);
}
- this->actor.bgCheckFlags |= 0x20;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_WATER;
} else {
- this->actor.bgCheckFlags &= ~0x20;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_WATER;
this->actor.depthInWater = BGCHECK_Y_MIN;
}
}
@@ -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 bcb7cb534..5d45ffc55 100644
--- a/src/overlays/actors/ovl_En_Bombal/z_en_bombal.c
+++ b/src/overlays/actors/ovl_En_Bombal/z_en_bombal.c
@@ -5,6 +5,7 @@
*/
#include "z_en_bombal.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "assets/objects/object_fusen/object_fusen.h"
#include "objects/gameplay_keep/gameplay_keep.h"
@@ -63,10 +64,10 @@ void EnBombal_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 25.0f);
this->actor.colChkInfo.mass = 0;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
this->actor.colChkInfo.health = 1;
this->scale = 0.1f;
- this->cutscene = this->actor.cutscene;
+ this->csId = this->actor.csId;
func_80C05B24(this);
}
@@ -105,20 +106,20 @@ void func_80C05B3C(EnBombal* this, PlayState* play) {
void func_80C05C44(EnBombal* this, PlayState* play) {
s32 phi_s0 = false;
s32 i;
- Vec3f pos;
+ Vec3f effPos;
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 {
@@ -126,17 +127,17 @@ void func_80C05C44(EnBombal* this, PlayState* play) {
}
if (phi_s0) {
- Math_Vec3f_Copy(&pos, &this->actor.world.pos);
- pos.y += 60.0f;
- Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, pos.x, pos.y, pos.z, 255, 255, 200,
- CLEAR_TAG_LARGE_EXPLOSION);
+ Math_Vec3f_Copy(&effPos, &this->actor.world.pos);
+ effPos.y += 60.0f;
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, effPos.x, effPos.y, effPos.z, 255, 255, 200,
+ CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_EXPLOSION));
for (i = 0; i < 100; i++) {
- EnBombal_InitEffects(this, &pos, 10);
+ EnBombal_InitEffects(this, &effPos, 10);
}
SET_WEEKEVENTREG(WEEKEVENTREG_83_04);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_MUJURA_BALLOON_BROKEN);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_MUJURA_BALLOON_BROKEN);
this->timer = 30;
this->isPopped = true;
this->actionFunc = func_80C05DE8;
@@ -147,7 +148,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;
@@ -194,24 +195,24 @@ void EnBombal_Draw(Actor* thisx, PlayState* play) {
void EnBombal_InitEffects(EnBombal* this, Vec3f* pos, s16 fadeDelay) {
s16 i;
- EnBombalEffect* sPtr = this->effects;
+ EnBombalEffect* effect = this->effects;
- for (i = 0; i < ARRAY_COUNT(this->effects); i++, sPtr++) {
- if (!sPtr->isEnabled) {
- sPtr->isEnabled = true;
- sPtr->pos = *pos;
- sPtr->alphaFadeDelay = fadeDelay;
- sPtr->alpha = 255;
+ for (i = 0; i < ARRAY_COUNT(this->effects); i++, effect++) {
+ if (!effect->isEnabled) {
+ effect->isEnabled = true;
+ effect->pos = *pos;
+ effect->alphaFadeDelay = fadeDelay;
+ effect->alpha = 255;
- sPtr->accel.x = (Rand_ZeroOne() - 0.5f) * 10.0f;
- sPtr->accel.y = (Rand_ZeroOne() - 0.5f) * 10.0f;
- sPtr->accel.z = (Rand_ZeroOne() - 0.5f) * 10.0f;
+ effect->accel.x = (Rand_ZeroOne() - 0.5f) * 10.0f;
+ effect->accel.y = (Rand_ZeroOne() - 0.5f) * 10.0f;
+ effect->accel.z = (Rand_ZeroOne() - 0.5f) * 10.0f;
- sPtr->velocity.x = Rand_ZeroOne() - 0.5f;
- sPtr->velocity.y = Rand_ZeroOne() - 0.5f;
- sPtr->velocity.z = Rand_ZeroOne() - 0.5f;
+ effect->velocity.x = Rand_ZeroOne() - 0.5f;
+ effect->velocity.y = Rand_ZeroOne() - 0.5f;
+ effect->velocity.z = Rand_ZeroOne() - 0.5f;
- sPtr->scale = (Rand_ZeroFloat(1.0f) * 0.5f) + 2.0f;
+ effect->scale = (Rand_ZeroFloat(1.0f) * 0.5f) + 2.0f;
return;
}
}
@@ -219,23 +220,23 @@ void EnBombal_InitEffects(EnBombal* this, Vec3f* pos, s16 fadeDelay) {
void EnBombal_UpdateEffects(EnBombal* this, PlayState* play) {
s32 i;
- EnBombalEffect* sPtr = this->effects;
+ EnBombalEffect* effect = this->effects;
- for (i = 0; i < ARRAY_COUNT(this->effects); i++, sPtr++) {
- if (sPtr->isEnabled) {
- sPtr->pos.x += sPtr->velocity.x;
- sPtr->pos.y += sPtr->velocity.y;
- sPtr->pos.z += sPtr->velocity.z;
- sPtr->velocity.x += sPtr->accel.x;
- sPtr->velocity.y += sPtr->accel.y;
- sPtr->velocity.z += sPtr->accel.z;
+ for (i = 0; i < ARRAY_COUNT(this->effects); i++, effect++) {
+ if (effect->isEnabled) {
+ effect->pos.x += effect->velocity.x;
+ effect->pos.y += effect->velocity.y;
+ effect->pos.z += effect->velocity.z;
+ effect->velocity.x += effect->accel.x;
+ effect->velocity.y += effect->accel.y;
+ effect->velocity.z += effect->accel.z;
- if (sPtr->alphaFadeDelay != 0) {
- sPtr->alphaFadeDelay--;
+ if (effect->alphaFadeDelay != 0) {
+ effect->alphaFadeDelay--;
} else {
- sPtr->alpha -= 10;
- if (sPtr->alpha < 10) {
- sPtr->isEnabled = 0;
+ effect->alpha -= 10;
+ if (effect->alpha < 10) {
+ effect->isEnabled = 0;
}
}
}
@@ -245,19 +246,19 @@ void EnBombal_UpdateEffects(EnBombal* this, PlayState* play) {
void EnBombal_DrawEffects(EnBombal* this, PlayState* play) {
s16 i;
GraphicsContext* gfxCtx = play->state.gfxCtx;
- EnBombalEffect* sPtr = this->effects;
+ EnBombalEffect* effect = this->effects;
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);
+ 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);
+ Matrix_Scale(effect->scale, effect->scale, effect->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));
@@ -266,10 +267,10 @@ void EnBombal_DrawEffects(EnBombal* this, PlayState* play) {
gDPPipeSync(POLY_XLU_DISP++);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255);
- gDPSetEnvColor(POLY_XLU_DISP++, 250, 180, 255, sPtr->alpha);
+ gDPSetEnvColor(POLY_XLU_DISP++, 250, 180, 255, effect->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 2ca62ef0a..4f4b15545 100644
--- a/src/overlays/actors/ovl_En_Bombers/z_en_bombers.c
+++ b/src/overlays/actors/ovl_En_Bombers/z_en_bombers.c
@@ -6,9 +6,8 @@
#include "z_en_bombers.h"
#include "overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.h"
-#include "objects/object_cs/object_cs.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnBombers*)thisx)
@@ -57,18 +56,66 @@ static ColliderCylinderInit sCylinderInit = {
{ 10, 30, 0, { 0, 0, 0 } },
};
-AnimationHeader* D_80C0479C[] = {
- &gBomberIdleAnim, &object_cs_Anim_0053F4, &object_cs_Anim_01007C, &object_cs_Anim_00349C,
- &object_cs_Anim_004960, &object_cs_Anim_005128, &object_cs_Anim_004C1C, &object_cs_Anim_001A1C,
- &object_cs_Anim_003EE4, &object_cs_Anim_00478C, &object_cs_Anim_00433C, &object_cs_Anim_0060E8,
- &object_cs_Anim_001708, &object_cs_Anim_005DC4, &object_cs_Anim_0026B0, &object_cs_Anim_0036B0,
- &object_cs_Anim_0031C4,
+typedef enum {
+ /* -1 */ ENBOMBERS_ANIM_NONE = -1,
+ /* 0x00 */ ENBOMBERS_ANIM_0,
+ /* 0x01 */ ENBOMBERS_ANIM_1,
+ /* 0x02 */ ENBOMBERS_ANIM_2,
+ /* 0x03 */ ENBOMBERS_ANIM_3,
+ /* 0x04 */ ENBOMBERS_ANIM_4,
+ /* 0x05 */ ENBOMBERS_ANIM_5,
+ /* 0x06 */ ENBOMBERS_ANIM_6,
+ /* 0x07 */ ENBOMBERS_ANIM_7,
+ /* 0x08 */ ENBOMBERS_ANIM_8,
+ /* 0x09 */ ENBOMBERS_ANIM_9,
+ /* 0x0A */ ENBOMBERS_ANIM_10,
+ /* 0x0B */ ENBOMBERS_ANIM_11,
+ /* 0x0C */ ENBOMBERS_ANIM_12,
+ /* 0x0D */ ENBOMBERS_ANIM_13,
+ /* 0x0E */ ENBOMBERS_ANIM_14,
+ /* 0x0F */ ENBOMBERS_ANIM_15,
+ /* 0x10 */ ENBOMBERS_ANIM_16,
+ /* 0x11 */ ENBOMBERS_ANIM_MAX
+} EnBombersAnimation;
+
+static AnimationHeader* sAnimations[ENBOMBERS_ANIM_MAX] = {
+ &gBomberIdleAnim, // ENBOMBERS_ANIM_0
+ &object_cs_Anim_0053F4, // ENBOMBERS_ANIM_1
+ &object_cs_Anim_01007C, // ENBOMBERS_ANIM_2
+ &object_cs_Anim_00349C, // ENBOMBERS_ANIM_3
+ &object_cs_Anim_004960, // ENBOMBERS_ANIM_4
+ &object_cs_Anim_005128, // ENBOMBERS_ANIM_5
+ &object_cs_Anim_004C1C, // ENBOMBERS_ANIM_6
+ &object_cs_Anim_001A1C, // ENBOMBERS_ANIM_7
+ &object_cs_Anim_003EE4, // ENBOMBERS_ANIM_8
+ &object_cs_Anim_00478C, // ENBOMBERS_ANIM_9
+ &object_cs_Anim_00433C, // ENBOMBERS_ANIM_10
+ &object_cs_Anim_0060E8, // ENBOMBERS_ANIM_11
+ &object_cs_Anim_001708, // ENBOMBERS_ANIM_12
+ &object_cs_Anim_005DC4, // ENBOMBERS_ANIM_13
+ &object_cs_Anim_0026B0, // ENBOMBERS_ANIM_14
+ &object_cs_Anim_0036B0, // ENBOMBERS_ANIM_15
+ &object_cs_Anim_0031C4, // ENBOMBERS_ANIM_16
};
-u8 D_80C047E0[] = {
- ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_ONCE, ANIMMODE_LOOP, ANIMMODE_LOOP,
- ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_LOOP,
- ANIMMODE_ONCE, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP,
+static u8 sAnimationModes[ENBOMBERS_ANIM_MAX] = {
+ ANIMMODE_LOOP, // ENBOMBERS_ANIM_0
+ ANIMMODE_LOOP, // ENBOMBERS_ANIM_1
+ ANIMMODE_LOOP, // ENBOMBERS_ANIM_2
+ ANIMMODE_ONCE, // ENBOMBERS_ANIM_3
+ ANIMMODE_ONCE, // ENBOMBERS_ANIM_4
+ ANIMMODE_LOOP, // ENBOMBERS_ANIM_5
+ ANIMMODE_LOOP, // ENBOMBERS_ANIM_6
+ ANIMMODE_LOOP, // ENBOMBERS_ANIM_7
+ ANIMMODE_ONCE, // ENBOMBERS_ANIM_8
+ ANIMMODE_LOOP, // ENBOMBERS_ANIM_9
+ ANIMMODE_LOOP, // ENBOMBERS_ANIM_10
+ ANIMMODE_LOOP, // ENBOMBERS_ANIM_11
+ ANIMMODE_ONCE, // ENBOMBERS_ANIM_12
+ ANIMMODE_LOOP, // ENBOMBERS_ANIM_13
+ ANIMMODE_ONCE, // ENBOMBERS_ANIM_14
+ ANIMMODE_LOOP, // ENBOMBERS_ANIM_15
+ ANIMMODE_LOOP, // ENBOMBERS_ANIM_16
};
#include "overlays/ovl_En_Bombers/ovl_En_Bombers.c"
@@ -95,9 +142,9 @@ void EnBombers_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 19.0f);
this->actor.gravity = -1.0f;
SkelAnime_InitFlex(play, &this->skelAnime, &object_cs_Skel_00F82C, &gBomberIdleAnim, this->jointTable,
- this->morphtable, 21);
+ this->morphTable, OBJECT_CS_LIMB_MAX);
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
- this->actor.targetMode = 0;
+ this->actor.targetMode = TARGET_MODE_0;
Actor_SetScale(&this->actor, 0.01f);
this->unk_2BC = ENBOMBERS_GET_F0(&this->actor);
@@ -124,11 +171,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);
@@ -154,24 +201,24 @@ void EnBombers_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyCylinder(play, &this->collider);
}
-void func_80C03824(EnBombers* this, s32 arg1, f32 arg2) {
- this->unk_2C4 = arg1;
- this->unk_2B0 = Animation_GetLastFrame(D_80C0479C[arg1]);
- Animation_Change(&this->skelAnime, D_80C0479C[this->unk_2C4], arg2, 0.0f, this->unk_2B0, D_80C047E0[this->unk_2C4],
- -10.0f);
+void EnBombers_ChangeAnim(EnBombers* this, s32 animIndex, f32 playSpeed) {
+ this->animIndex = animIndex;
+ this->animEndFrame = Animation_GetLastFrame(sAnimations[animIndex]);
+ Animation_Change(&this->skelAnime, sAnimations[this->animIndex], playSpeed, 0.0f, this->animEndFrame,
+ sAnimationModes[this->animIndex], -10.0f);
}
void func_80C038B4(EnBombers* this) {
- if ((this->unk_2C4 == 2) &&
+ if ((this->animIndex == ENBOMBERS_ANIM_2) &&
(Animation_OnFrame(&this->skelAnime, 9.0f) || Animation_OnFrame(&this->skelAnime, 10.0f) ||
Animation_OnFrame(&this->skelAnime, 17.0f) || Animation_OnFrame(&this->skelAnime, 18.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMBERS_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BOMBERS_WALK);
}
- if ((this->unk_2C4 == 15) &&
+ if ((this->animIndex == ENBOMBERS_ANIM_15) &&
(Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 2.0f) ||
Animation_OnFrame(&this->skelAnime, 4.0f) || Animation_OnFrame(&this->skelAnime, 6.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMBERS_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BOMBERS_WALK);
}
}
@@ -210,6 +257,9 @@ void func_80C039A8(EnBombers* this, PlayState* play) {
this->actor.textId = 0x744;
}
break;
+
+ default:
+ break;
}
}
@@ -236,13 +286,13 @@ 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,
&colPoly, true, false, false, true, &sp48)) {
- func_80C03824(this, 2, 1.0f);
+ EnBombers_ChangeAnim(this, ENBOMBERS_ANIM_2, 1.0f);
Math_Vec3f_Copy(&this->unk_294, &sp60);
this->unk_2AA = Rand_S16Offset(30, 50);
this->unk_2A0++;
@@ -265,9 +315,9 @@ void func_80C03AF4(EnBombers* this, PlayState* play) {
false, true, &sp48)) {
this->unk_2A8 = 0;
if (Rand_ZeroOne() < 0.5f) {
- func_80C03824(this, 16, 1.0f);
+ EnBombers_ChangeAnim(this, ENBOMBERS_ANIM_16, 1.0f);
} else {
- func_80C03824(this, 0, 1.0f);
+ EnBombers_ChangeAnim(this, ENBOMBERS_ANIM_0, 1.0f);
}
this->unk_2A0 = 0;
this->unk_2B4 = 0.0f;
@@ -281,9 +331,9 @@ void func_80C03AF4(EnBombers* this, PlayState* play) {
if ((this->unk_2AA == 0) || (sqrtf(SQ(x) + SQ(z)) < 4.0f)) {
this->unk_2A8 = Rand_S16Offset(20, 20);
if (!(this->unk_2A8 & 1)) {
- func_80C03824(this, 16, 1.0f);
+ EnBombers_ChangeAnim(this, ENBOMBERS_ANIM_16, 1.0f);
} else {
- func_80C03824(this, 0, 1.0f);
+ EnBombers_ChangeAnim(this, ENBOMBERS_ANIM_0, 1.0f);
}
this->unk_2A0 = 0;
this->unk_2B4 = 0.0f;
@@ -293,13 +343,16 @@ void func_80C03AF4(EnBombers* this, PlayState* play) {
Math_ApproachF(&this->unk_2B4, 1.0f, 0.3f, 0.5f);
}
break;
+
+ default:
+ break;
}
- if (!Text_GetFaceReaction(play, 0x12)) {
+ if (Text_GetFaceReaction(play, FACE_REACTION_SET_BOMBERS) == 0) {
func_80C039A8(this, play);
} else {
this->unk_2A6 = TEXT_STATE_5;
- this->actor.textId = Text_GetFaceReaction(play, 0x12);
+ this->actor.textId = Text_GetFaceReaction(play, FACE_REACTION_SET_BOMBERS);
}
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
@@ -308,13 +361,13 @@ void func_80C03AF4(EnBombers* this, PlayState* play) {
this->collider.dim.height = 60;
func_80C03F64(this);
} else {
- func_800B8614(&this->actor, play, 70.0f);
+ Actor_OfferTalk(&this->actor, play, 70.0f);
}
}
void func_80C03F64(EnBombers* this) {
this->unk_2A4 = this->actor.yawTowardsPlayer;
- func_80C03824(this, 1, 1.0f);
+ EnBombers_ChangeAnim(this, ENBOMBERS_ANIM_1, 1.0f);
this->unk_2C0 = 1;
this->actionFunc = func_80C03FAC;
}
@@ -334,11 +387,14 @@ void func_80C03FAC(EnBombers* this, PlayState* play) {
case PLAYER_FORM_ZORA:
this->unk_28E = -0x1770;
break;
+
+ default:
+ break;
}
if ((this->unk_2A6 == Message_GetState(&play->msgCtx)) && Message_ShouldAdvance(play)) {
sp2A = 0;
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->unk_2A6 = TEXT_STATE_5;
if ((this->actor.textId == 0x73D) || (this->actor.textId == 0x73E) || (this->actor.textId == 0x73F)) {
@@ -347,11 +403,11 @@ void func_80C03FAC(EnBombers* this, PlayState* play) {
sp2A = 1;
} else if (this->actor.textId == 0x740) {
if (play->msgCtx.choiceIndex == 0) {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
this->actor.textId = 0x742;
sp2A = 1;
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
this->actor.textId = 0x741;
sp2A = 1;
}
@@ -367,13 +423,13 @@ void func_80C03FAC(EnBombers* this, PlayState* play) {
sp2A = 1;
} else if (this->actor.textId == 0x74C) {
if (play->msgCtx.choiceIndex == 1) {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
this->actor.textId = 0x737;
sp2A = 1;
} else {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
this->actor.textId = 0x74D;
- func_80C03824(this, 14, 1.0f);
+ EnBombers_ChangeAnim(this, ENBOMBERS_ANIM_14, 1.0f);
sp2A = 1;
}
} else if (this->actor.textId == 0x744) {
@@ -409,6 +465,9 @@ void func_80C03FAC(EnBombers* this, PlayState* play) {
case ENBOMBERS_F_4:
SET_WEEKEVENTREG(WEEKEVENTREG_74_08);
break;
+
+ default:
+ break;
}
SET_WEEKEVENTREG(WEEKEVENTREG_73_40);
}
@@ -420,15 +479,18 @@ void func_80C03FAC(EnBombers* this, PlayState* play) {
break;
case 1:
- func_80151938(play, this->actor.textId);
+ Message_ContinueTextbox(play, this->actor.textId);
+ break;
+
+ default:
break;
}
}
}
void func_80C042F8(EnBombers* this) {
- if (this->unk_2C4 != 6) {
- func_80C03824(this, 6, 1.0f);
+ if (this->animIndex != ENBOMBERS_ANIM_6) {
+ EnBombers_ChangeAnim(this, ENBOMBERS_ANIM_6, 1.0f);
}
this->actor.textId = 0x72D;
this->unk_28E = 0x1F40;
@@ -442,14 +504,14 @@ void func_80C04354(EnBombers* this, PlayState* play) {
this->unk_28E = 0;
this->actionFunc = func_80C043C8;
} else {
- func_800B8614(&this->actor, play, 70.0f);
+ Actor_OfferTalk(&this->actor, play, 70.0f);
}
}
void func_80C043C8(EnBombers* this, PlayState* play) {
Math_SmoothStepToS(&this->unk_288, this->unk_28E, 1, 0x3E8, 0);
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_80C042F8(this);
}
}
@@ -487,7 +549,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 +581,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..500fff573 100644
--- a/src/overlays/actors/ovl_En_Bombers/z_en_bombers.h
+++ b/src/overlays/actors/ovl_En_Bombers/z_en_bombers.h
@@ -2,6 +2,7 @@
#define Z_EN_BOMBERS_H
#include "global.h"
+#include "objects/object_cs/object_cs.h"
struct EnBombers;
@@ -10,21 +11,21 @@ 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
typedef struct EnBombers {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[21];
- /* 0x206 */ Vec3s morphtable[21];
+ /* 0x188 */ Vec3s jointTable[OBJECT_CS_LIMB_MAX];
+ /* 0x206 */ Vec3s morphTable[OBJECT_CS_LIMB_MAX];
/* 0x284 */ EnBombersActionFunc actionFunc;
/* 0x288 */ s16 unk_288;
/* 0x28A */ s16 unk_28A;
@@ -39,14 +40,14 @@ typedef struct EnBombers {
/* 0x2A8 */ s16 unk_2A8;
/* 0x2AA */ s16 unk_2AA;
/* 0x2AC */ s16 unk_2AC;
- /* 0x2B0 */ f32 unk_2B0;
+ /* 0x2B0 */ f32 animEndFrame;
/* 0x2B4 */ f32 unk_2B4;
/* 0x2B8 */ s16 unk_2B8;
/* 0x2BA */ s16 unk_2BA;
/* 0x2BC */ s16 unk_2BC;
/* 0x2BE */ s16 unk_2BE;
/* 0x2C0 */ s16 unk_2C0;
- /* 0x2C4 */ s32 unk_2C4;
+ /* 0x2C4 */ s32 animIndex;
/* 0x2C8 */ ColliderCylinder collider;
} EnBombers; // size = 0x314
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 74575628f..b8795c3f2 100644
--- a/src/overlays/actors/ovl_En_Bombers2/z_en_bombers2.c
+++ b/src/overlays/actors/ovl_En_Bombers2/z_en_bombers2.c
@@ -6,7 +6,7 @@
#include "z_en_bombers2.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnBombers2*)thisx)
@@ -19,7 +19,6 @@ void func_80C04BA0(EnBombers2* this, PlayState* play);
void func_80C04D8C(EnBombers2* this, PlayState* play);
void func_80C0520C(EnBombers2* this, PlayState* play);
void func_80C04B40(EnBombers2* this);
-void EnBombers2_ChangeAnim(EnBombers2* this, s32 animIndex, f32 playSpeed);
void func_80C04D00(EnBombers2* this);
void func_80C050B8(EnBombers2* this, PlayState* play);
@@ -59,14 +58,36 @@ static ColliderCylinderInit sCylinderInit = {
{ 35, 30, 0, { 0, 0, 0 } },
};
-static AnimationHeader* sAnimations[] = {
- &gBomberIdleAnim, &object_cs_Anim_0053F4, &object_cs_Anim_01007C, &object_cs_Anim_00349C,
- &object_cs_Anim_0060E8, &object_cs_Anim_005DC4, &object_cs_Anim_0026B0,
+typedef enum {
+ /* -1 */ ENBOMBERS_ANIM_NONE = -1,
+ /* 0 */ ENBOMBERS_ANIM_0,
+ /* 1 */ ENBOMBERS_ANIM_1,
+ /* 2 */ ENBOMBERS_ANIM_2,
+ /* 3 */ ENBOMBERS_ANIM_3,
+ /* 4 */ ENBOMBERS_ANIM_4,
+ /* 5 */ ENBOMBERS_ANIM_5,
+ /* 6 */ ENBOMBERS_ANIM_6,
+ /* 7 */ ENBOMBERS_ANIM_MAX
+} EnBombersAnimation;
+
+static AnimationHeader* sAnimations[ENBOMBERS_ANIM_MAX] = {
+ &gBomberIdleAnim, // ENBOMBERS_ANIM_0
+ &object_cs_Anim_0053F4, // ENBOMBERS_ANIM_1
+ &object_cs_Anim_01007C, // ENBOMBERS_ANIM_2
+ &object_cs_Anim_00349C, // ENBOMBERS_ANIM_3
+ &object_cs_Anim_0060E8, // ENBOMBERS_ANIM_4
+ &object_cs_Anim_005DC4, // ENBOMBERS_ANIM_5
+ &object_cs_Anim_0026B0, // ENBOMBERS_ANIM_6
};
-static u8 sAnimationModes[] = {
- ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE,
- ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_LOOP,
+static u8 sAnimationModes[ENBOMBERS_ANIM_MAX] = {
+ ANIMMODE_LOOP, // ENBOMBERS_ANIM_0
+ ANIMMODE_LOOP, // ENBOMBERS_ANIM_1
+ ANIMMODE_LOOP, // ENBOMBERS_ANIM_2
+ ANIMMODE_ONCE, // ENBOMBERS_ANIM_3
+ ANIMMODE_LOOP, // ENBOMBERS_ANIM_4
+ ANIMMODE_LOOP, // ENBOMBERS_ANIM_5
+ ANIMMODE_ONCE, // ENBOMBERS_ANIM_6
};
static Gfx sSetPrimColorDL[] = {
@@ -90,9 +111,9 @@ void EnBombers2_Init(Actor* thisx, PlayState* play) {
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 19.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_cs_Skel_00F82C, &gBomberIdleAnim, this->morphTable,
- this->jointTable, OBJECT_CS_LIMB_MAX);
- this->actor.targetMode = 6;
+ SkelAnime_InitFlex(play, &this->skelAnime, &object_cs_Skel_00F82C, &gBomberIdleAnim, this->jointTable,
+ this->morphTable, OBJECT_CS_LIMB_MAX);
+ this->actor.targetMode = TARGET_MODE_6;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_73_80) || (gSaveContext.save.entrance == ENTRANCE(EAST_CLOCK_TOWN, 2))) {
@@ -101,8 +122,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);
@@ -115,20 +136,20 @@ void EnBombers2_Destroy(Actor* thisx, PlayState* play) {
}
void EnBombers2_ChangeAnim(EnBombers2* this, s32 animIndex, f32 playSpeed) {
- f32 lastFrame;
+ f32 endFrame;
this->animIndex = animIndex;
- lastFrame = Animation_GetLastFrame(sAnimations[this->animIndex]);
- this->lastAnimFrame = lastFrame;
- Animation_Change(&this->skelAnime, sAnimations[this->animIndex], playSpeed, 0.0f, lastFrame,
+ endFrame = Animation_GetLastFrame(sAnimations[this->animIndex]);
+ this->lastAnimFrame = endFrame;
+ Animation_Change(&this->skelAnime, sAnimations[this->animIndex], playSpeed, 0.0f, endFrame,
sAnimationModes[this->animIndex], -10.0f);
}
void func_80C04B40(EnBombers2* this) {
if (this->unk_2AC == 0) {
- EnBombers2_ChangeAnim(this, 4, 1.0f);
+ EnBombers2_ChangeAnim(this, ENBOMBERS_ANIM_4, 1.0f);
} else {
- EnBombers2_ChangeAnim(this, 0, 1.0f);
+ EnBombers2_ChangeAnim(this, ENBOMBERS_ANIM_0, 1.0f);
}
this->unk_2C0 = 0;
this->actionFunc = func_80C04BA0;
@@ -149,19 +170,23 @@ void func_80C04BA0(EnBombers2* this, PlayState* play) {
this->textIdIndex = 1;
this->talkState = TEXT_STATE_5;
break;
+
case PLAYER_FORM_DEKU:
case PLAYER_FORM_HUMAN:
this->textIdIndex = 2;
this->talkState = TEXT_STATE_5;
break;
+
+ default:
+ break;
}
if (this->unk_2AC != 0) {
this->textIdIndex = 7;
}
this->actor.textId = sTextIds[this->textIdIndex];
- if (Text_GetFaceReaction(play, 0x15) != 0) {
- this->actor.textId = Text_GetFaceReaction(play, 0x15);
+ if (Text_GetFaceReaction(play, FACE_REACTION_SET_BOMBERS_HIDEOUT_GUARD) != 0) {
+ this->actor.textId = Text_GetFaceReaction(play, FACE_REACTION_SET_BOMBERS_HIDEOUT_GUARD);
}
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
@@ -171,20 +196,20 @@ void func_80C04BA0(EnBombers2* this, PlayState* play) {
return;
}
if (yawDiffAbs < 0x3BB5) {
- func_800B8614(&this->actor, play, 70.0f);
+ Actor_OfferTalk(&this->actor, play, 70.0f);
}
}
void func_80C04D00(EnBombers2* this) {
if ((this->textIdIndex == 0) || (this->textIdIndex == 1)) {
- EnBombers2_ChangeAnim(this, 5, 1.0f);
+ EnBombers2_ChangeAnim(this, ENBOMBERS_ANIM_5, 1.0f);
} else {
- EnBombers2_ChangeAnim(this, 1, 1.0f);
+ EnBombers2_ChangeAnim(this, ENBOMBERS_ANIM_1, 1.0f);
}
this->unk_2A8 = 0;
if (this->unk_2AC != 0) {
- EnBombers2_ChangeAnim(this, 6, 1.0f);
+ EnBombers2_ChangeAnim(this, ENBOMBERS_ANIM_6, 1.0f);
}
this->unk_2C0 = 1;
this->actionFunc = func_80C04D8C;
@@ -192,13 +217,13 @@ void func_80C04D00(EnBombers2* this) {
void func_80C04D8C(EnBombers2* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- f32 temp = this->skelAnime.curFrame;
+ f32 curFrame = this->skelAnime.curFrame;
- if ((this->unk_2AC == 0) && (this->lastAnimFrame <= temp)) {
+ if ((this->unk_2AC == 0) && (curFrame >= this->lastAnimFrame)) {
if (!(this->unk_2A8 & 1)) {
- EnBombers2_ChangeAnim(this, 1, 1.0f);
+ EnBombers2_ChangeAnim(this, ENBOMBERS_ANIM_1, 1.0f);
} else {
- EnBombers2_ChangeAnim(this, 5, 1.0f);
+ EnBombers2_ChangeAnim(this, ENBOMBERS_ANIM_5, 1.0f);
}
this->unk_2A8++;
this->unk_2A8 &= 1;
@@ -207,10 +232,12 @@ void func_80C04D8C(EnBombers2* this, PlayState* play) {
case PLAYER_FORM_HUMAN:
this->unk_28E = -0xFA0;
break;
+
case PLAYER_FORM_GORON:
case PLAYER_FORM_ZORA:
this->unk_28E = -0x1770;
break;
+
default:
break;
}
@@ -220,7 +247,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;
}
}
@@ -233,15 +261,15 @@ void func_80C04D8C(EnBombers2* this, PlayState* play) {
if (correctDigits >= 5) {
this->textIdIndex = 6;
this->actor.textId = sTextIds[this->textIdIndex];
- func_80151938(play, this->actor.textId);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_PIECE_OF_HEART);
+ Message_ContinueTextbox(play, this->actor.textId);
+ Actor_PlaySfx(&this->actor, NA_SE_SY_PIECE_OF_HEART);
this->talkState = TEXT_STATE_5;
return;
}
}
- if (Text_GetFaceReaction(play, 0x15) != 0) {
+ if (Text_GetFaceReaction(play, FACE_REACTION_SET_BOMBERS_HIDEOUT_GUARD) != 0) {
this->unk_28E = 0;
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_80C04B40(this);
} else {
s32 j;
@@ -252,35 +280,42 @@ void func_80C04D8C(EnBombers2* this, PlayState* play) {
case 5:
case 7:
this->unk_28E = 0;
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_80C04B40(this);
break;
+
case 2:
this->textIdIndex = 3;
this->actor.textId = sTextIds[this->textIdIndex];
- func_80151938(play, this->actor.textId);
+ Message_ContinueTextbox(play, this->actor.textId);
this->talkState = TEXT_STATE_15;
break;
+
case 3:
for (j = 0; j < ARRAY_COUNT(this->correctDigitSlots); j++) {
this->correctDigitSlots[j] = false;
}
this->textIdIndex = 4;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_ERROR);
+ Actor_PlaySfx(&this->actor, NA_SE_SY_ERROR);
this->actor.textId = sTextIds[this->textIdIndex];
- func_80151938(play, this->actor.textId);
+ Message_ContinueTextbox(play, this->actor.textId);
this->talkState = TEXT_STATE_5;
break;
+
case 4:
this->textIdIndex = 5;
this->actor.textId = sTextIds[this->textIdIndex];
- func_80151938(play, this->actor.textId);
+ Message_ContinueTextbox(play, this->actor.textId);
this->talkState = TEXT_STATE_5;
break;
+
case 6:
play->msgCtx.msgLength = 0;
func_80C050B8(this, play);
break;
+
+ default:
+ break;
}
}
}
@@ -290,7 +325,7 @@ void func_80C050B8(EnBombers2* this, PlayState* play) {
Player* player = GET_PLAYER(play);
s16 homeYawToPlayer;
- EnBombers2_ChangeAnim(this, 2, 1.0f);
+ EnBombers2_ChangeAnim(this, ENBOMBERS_ANIM_2, 1.0f);
this->unk_2A8 = 0;
homeYawToPlayer = Math_Vec3f_Yaw(&this->actor.home.pos, &player->actor.world.pos);
Math_Vec3f_Copy(&this->unk_29C, &this->actor.world.pos);
@@ -308,13 +343,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 {
@@ -322,16 +357,16 @@ void func_80C0520C(EnBombers2* this, PlayState* play) {
if ((fabsf(this->unk_29C.x - this->actor.world.pos.x) < 3.0f) &&
(fabsf(this->unk_29C.z - this->actor.world.pos.z) < 3.0f)) {
this->unk_2B6 = this->actor.yawTowardsPlayer;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (fabsf(this->actor.world.rot.y - this->actor.yawTowardsPlayer) < 100.0f) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->talkState = TEXT_STATE_5;
this->textIdIndex = 7;
- EnBombers2_ChangeAnim(this, 6, 1.0f);
+ EnBombers2_ChangeAnim(this, ENBOMBERS_ANIM_6, 1.0f);
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);
@@ -354,10 +389,10 @@ void EnBombers2_Update(Actor* thisx, PlayState* play) {
if (this->unk_2B2 != 0) {
this->unk_2B2--;
}
- if ((this->animIndex == 2) &&
+ if ((this->animIndex == ENBOMBERS_ANIM_2) &&
(Animation_OnFrame(&this->skelAnime, 9.0f) || Animation_OnFrame(&this->skelAnime, 10.0f) ||
Animation_OnFrame(&this->skelAnime, 17.0f) || Animation_OnFrame(&this->skelAnime, 18.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMBERS_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BOMBERS_WALK);
}
this->actor.shape.rot.y = this->actor.world.rot.y;
if (this->unk_2C0 != 2) {
@@ -391,16 +426,18 @@ void EnBombers2_Update(Actor* thisx, PlayState* play) {
this->actor.world.pos.x = (Math_SinS((this->actor.world.rot.y + 0x8000)) * 26.0f) + sp34.x;
temp_f4 = Math_CosS(this->actor.world.rot.y + 0x8000) * 26.0f;
this->actor.world.pos.z = temp_f4 + sp34.z;
- this->collider.dim.radius = 0x23;
- this->collider.dim.height = 0x1E;
+ this->collider.dim.radius = 35;
+ this->collider.dim.height = 30;
} else {
- this->collider.dim.radius = 0xA;
- this->collider.dim.height = 0x19;
+ this->collider.dim.radius = 10;
+ this->collider.dim.height = 25;
}
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 +459,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..f02c5eccb 100644
--- a/src/overlays/actors/ovl_En_Bombers2/z_en_bombers2.h
+++ b/src/overlays/actors/ovl_En_Bombers2/z_en_bombers2.h
@@ -2,7 +2,6 @@
#define Z_EN_BOMBERS2_H
#include "global.h"
-
#include "objects/object_cs/object_cs.h"
struct EnBombers2;
@@ -12,8 +11,8 @@ typedef void (*EnBombers2ActionFunc)(struct EnBombers2*, PlayState*);
typedef struct EnBombers2 {
/* 0x000 */ Actor actor;
/* 0x14C */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s morphTable[OBJECT_CS_LIMB_MAX];
- /* 0x206 */ Vec3s jointTable[OBJECT_CS_LIMB_MAX];
+ /* 0x188 */ Vec3s jointTable[OBJECT_CS_LIMB_MAX];
+ /* 0x206 */ Vec3s morphTable[OBJECT_CS_LIMB_MAX];
/* 0x284 */ EnBombers2ActionFunc actionFunc;
/* 0x288 */ s16 unk_288;
/* 0x28A */ s16 unk_28A;
@@ -27,7 +26,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 0b5ffff54..92dfe8418 100644
--- a/src/overlays/actors/ovl_En_Bombf/z_en_bombf.c
+++ b/src/overlays/actors/ovl_En_Bombf/z_en_bombf.c
@@ -6,9 +6,10 @@
#include "z_en_bombf.h"
#include "z64rumble.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "objects/object_bombf/object_bombf.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_10)
#define THIS ((EnBombf*)thisx)
@@ -109,7 +110,7 @@ void EnBombf_Init(Actor* thisx, PlayState* play2) {
thisx->focus.pos = thisx->world.pos;
thisx->colChkInfo.cylRadius = 10;
thisx->colChkInfo.cylHeight = 10;
- thisx->targetMode = 0;
+ thisx->targetMode = TARGET_MODE_0;
if (ENBOMBF_GET(thisx) == ENBOMBF_0) {
this->timer = 140;
@@ -117,7 +118,7 @@ void EnBombf_Init(Actor* thisx, PlayState* play2) {
thisx->gravity = -1.5f;
func_800BC154(play, &play->actorCtx, thisx, 3);
thisx->colChkInfo.mass = 200;
- thisx->flags &= ~ACTOR_FLAG_1;
+ thisx->flags &= ~ACTOR_FLAG_TARGETABLE;
EnBombf_SetupAction(this, func_808AEE3C);
} else {
thisx->colChkInfo.mass = MASS_IMMOVABLE;
@@ -156,8 +157,8 @@ void func_808AEAE0(EnBombf* this, PlayState* play) {
func_800B8C20(&this->actor, &bombf->actor, play);
this->timer = 180;
this->unk_204 = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_PL_PULL_UP_ROCK);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ Actor_PlaySfx(&this->actor, NA_SE_PL_PULL_UP_ROCK);
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
} else {
player->actor.child = NULL;
player->heldActor = NULL;
@@ -168,7 +169,7 @@ void func_808AEAE0(EnBombf* this, PlayState* play) {
} else if ((this->colliderCylinder.base.acFlags & AC_HIT) &&
((this->colliderCylinder.info.acHitInfo->toucher.dmgFlags & 0x13828) ||
((this->colliderCylinder.info.acHitInfo->toucher.dmgFlags & 0x200) &&
- (player->transformation == PLAYER_FORM_GORON) && (player->actor.speedXZ > 15.0f)))) {
+ (player->transformation == PLAYER_FORM_GORON) && (player->actor.speed > 15.0f)))) {
this->colliderCylinder.base.acFlags &= ~AC_HIT;
if (this->colliderCylinder.base.ac->category != ACTORCAT_BOSS) {
bombf = (EnBombf*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOMBF, this->actor.world.pos.x,
@@ -177,7 +178,7 @@ void func_808AEAE0(EnBombf* this, PlayState* play) {
bombf->unk_1F8 = 1;
bombf->timer = 0;
this->timer = 180;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->unk_204 = 0.0f;
}
}
@@ -188,12 +189,12 @@ void func_808AEAE0(EnBombf* this, PlayState* play) {
if (bombf != NULL) {
bombf->timer = 100;
this->timer = 180;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->unk_204 = 0.0f;
}
} else {
if (!Actor_HasParent(&this->actor, play)) {
- Actor_LiftActor(&this->actor, play);
+ Actor_OfferCarry(&this->actor, play);
return;
}
player->actor.child = NULL;
@@ -208,7 +209,7 @@ void func_808AEAE0(EnBombf* this, PlayState* play) {
if (this->timer == 0) {
this->unk_204 += 0.05f;
if (this->unk_204 >= 1.0f) {
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}
}
@@ -232,27 +233,27 @@ void func_808AEE3C(EnBombf* this, PlayState* play) {
}
this->unk_204 = 1.0f;
- if (!(this->actor.bgCheckFlags & 1)) {
- Math_SmoothStepToF(&this->actor.speedXZ, 0.0f, 1.0f, 0.025f, 0.0f);
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ Math_SmoothStepToF(&this->actor.speed, 0.0f, 1.0f, 0.025f, 0.0f);
return;
}
- Math_SmoothStepToF(&this->actor.speedXZ, 0.0f, 1.0f, 1.5f, 0.0f);
- if (this->actor.bgCheckFlags & 2) {
- func_800B8EF4(play, &this->actor);
+ Math_SmoothStepToF(&this->actor.speed, 0.0f, 1.0f, 1.5f, 0.0f);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
+ Actor_PlaySfx_SurfaceBomb(play, &this->actor);
if (this->actor.velocity.y < -6.0f) {
this->actor.velocity.y *= -0.3f;
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
}
} else if (this->timer >= 4) {
- Actor_LiftActor(&this->actor, play);
+ Actor_OfferCarry(&this->actor, play);
}
}
void func_808AEF68(EnBombf* this, PlayState* play) {
if (Actor_HasNoParent(&this->actor, play)) {
EnBombf_SetupAction(this, func_808AEE3C);
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
func_808AEE3C(this, play);
} else {
this->actor.velocity.y = 0.0f;
@@ -272,28 +273,28 @@ void func_808AEFD4(EnBombf* this, PlayState* play) {
CollisionCheck_SetAT(play, &play->colChkCtx, &this->colliderJntSph.base);
}
- if (play->envCtx.lightSettings.diffuseColor1[0] != 0) {
- play->envCtx.lightSettings.diffuseColor1[0] -= 25;
+ if (play->envCtx.adjLightSettings.light1Color[0] != 0) {
+ play->envCtx.adjLightSettings.light1Color[0] -= 25;
}
- if (play->envCtx.lightSettings.diffuseColor1[1] != 0) {
- play->envCtx.lightSettings.diffuseColor1[1] -= 25;
+ if (play->envCtx.adjLightSettings.light1Color[1] != 0) {
+ play->envCtx.adjLightSettings.light1Color[1] -= 25;
}
- if (play->envCtx.lightSettings.diffuseColor1[2] != 0) {
- play->envCtx.lightSettings.diffuseColor1[2] -= 25;
+ if (play->envCtx.adjLightSettings.light1Color[2] != 0) {
+ play->envCtx.adjLightSettings.light1Color[2] -= 25;
}
- if (play->envCtx.lightSettings.ambientColor[0] != 0) {
- play->envCtx.lightSettings.ambientColor[0] -= 25;
+ if (play->envCtx.adjLightSettings.ambientColor[0] != 0) {
+ play->envCtx.adjLightSettings.ambientColor[0] -= 25;
}
- if (play->envCtx.lightSettings.ambientColor[1] != 0) {
- play->envCtx.lightSettings.ambientColor[1] -= 25;
+ if (play->envCtx.adjLightSettings.ambientColor[1] != 0) {
+ play->envCtx.adjLightSettings.ambientColor[1] -= 25;
}
- if (play->envCtx.lightSettings.ambientColor[2] != 0) {
- play->envCtx.lightSettings.ambientColor[2] -= 25;
+ if (play->envCtx.adjLightSettings.ambientColor[2] != 0) {
+ play->envCtx.adjLightSettings.ambientColor[2] -= 25;
}
if (this->timer == 0) {
@@ -313,7 +314,7 @@ void EnBombf_Update(Actor* thisx, PlayState* play) {
Vec3f sp8C = { 0.0f, 0.0f, 0.0f };
Vec3f sp80 = { 0.0f, 0.1f, 0.0f };
Vec3f sp74 = { 0.0f, 0.0f, 0.0f };
- Vec3f sp68;
+ Vec3f effPos;
Vec3f sp5C = { 0.0f, 0.6f, 0.0f };
Color_RGBA8 sp58 = { 255, 255, 255, 255 };
EnBombf* this = THIS;
@@ -336,29 +337,33 @@ 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;
}
if (ENBOMBF_GET(&this->actor) == ENBOMBF_0) {
- if ((this->actor.velocity.y > 0.0f) && (this->actor.bgCheckFlags & 0x10)) {
+ if ((this->actor.velocity.y > 0.0f) && (this->actor.bgCheckFlags & BGCHECKFLAG_CEILING)) {
this->actor.velocity.y = -this->actor.velocity.y;
}
- if ((this->actor.speedXZ != 0.0f) && (this->actor.bgCheckFlags & 8)) {
+ if ((this->actor.speed != 0.0f) && (this->actor.bgCheckFlags & BGCHECKFLAG_WALL)) {
s16 yDiff = BINANG_SUB(this->actor.wallYaw, this->actor.world.rot.y);
if (ABS_ALT(yDiff) > 0x4000) {
this->actor.world.rot.y =
BINANG_SUB(this->actor.wallYaw - this->actor.world.rot.y + this->actor.wallYaw, 0x8000);
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMB_BOUND);
+ 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.speedXZ *= 0.7f;
- this->actor.bgCheckFlags &= ~8;
+ this->actor.speed *= 0.7f;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_WALL;
}
if ((this->colliderCylinder.base.acFlags & AC_HIT) ||
@@ -371,16 +376,16 @@ void EnBombf_Update(Actor* thisx, PlayState* play) {
if (this->unk_1F8 != 0) {
sp5C.y = 0.2f;
- sp68 = this->actor.world.pos;
- sp68.y += 25.0f;
+ effPos = this->actor.world.pos;
+ effPos.y += 25.0f;
if (this->timer < 127) {
if ((play->gameplayFrames % 2) == 0) {
- EffectSsGSpk_SpawnFuse(play, &this->actor, &sp68, &sp8C, &sp74);
+ EffectSsGSpk_SpawnFuse(play, &this->actor, &effPos, &sp8C, &sp74);
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_BOMB_IGNIT - SFX_FLAG);
- sp68.y += 3.0f;
- func_800B0DE0(play, &sp68, &sp8C, &sp5C, &sp58, &sp58, 0x32, 5);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_BOMB_IGNIT - SFX_FLAG);
+ effPos.y += 3.0f;
+ func_800B0DE0(play, &effPos, &sp8C, &sp5C, &sp58, &sp58, 0x32, 5);
}
if ((this->timer == 3) || (this->timer == 30) || (this->timer == 50) || (this->timer == 70)) {
@@ -398,21 +403,21 @@ void EnBombf_Update(Actor* thisx, PlayState* play) {
}
if (this->timer == 0) {
- sp68 = this->actor.world.pos;
- sp68.y += 10.0f;
+ effPos = this->actor.world.pos;
+ effPos.y += 10.0f;
if (Actor_HasParent(&this->actor, play)) {
- sp68.y += 30.0f;
+ effPos.y += 30.0f;
}
- Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, sp68.x, sp68.y, sp68.z, 0, 0, 0,
- CLEAR_TAG_SMALL_EXPLOSION);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_BOMB_EXPLOSION);
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, effPos.x, effPos.y, effPos.z, 0, 0, 0,
+ CLEAR_TAG_PARAMS(CLEAR_TAG_SMALL_EXPLOSION));
+ Actor_PlaySfx(&this->actor, NA_SE_IT_BOMB_EXPLOSION);
- 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] =
- play->envCtx.lightSettings.ambientColor[2] = 250;
+ play->envCtx.adjLightSettings.light1Color[0] = play->envCtx.adjLightSettings.light1Color[1] =
+ play->envCtx.adjLightSettings.light1Color[2] = 250;
+ play->envCtx.adjLightSettings.ambientColor[0] = play->envCtx.adjLightSettings.ambientColor[1] =
+ play->envCtx.adjLightSettings.ambientColor[2] = 250;
Camera_AddQuake(&play->mainCamera, 2, 11, 8);
@@ -443,9 +448,9 @@ void EnBombf_Update(Actor* thisx, PlayState* play) {
return;
}
- if (this->actor.bgCheckFlags & 0x40) {
- this->actor.bgCheckFlags &= ~0x40;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMB_DROP_WATER);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) {
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_WATER_TOUCH;
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BOMB_DROP_WATER);
}
}
}
@@ -469,12 +474,12 @@ 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);
- gSPDisplayList(POLY_OPA_DISP++, object_bombf_DL_000340);
- gSPDisplayList(POLY_OPA_DISP++, object_bombf_DL_000530);
+ gSPDisplayList(POLY_OPA_DISP++, gBombFlowerLeavesDL);
+ gSPDisplayList(POLY_OPA_DISP++, gBombFlowerBaseLeavesDL);
Matrix_Translate(0.0f, 1000.0f, 0.0f, MTXMODE_APPLY);
Matrix_Scale(this->unk_204, this->unk_204, this->unk_204, MTXMODE_APPLY);
@@ -491,7 +496,7 @@ void EnBombf_Draw(Actor* thisx, PlayState* play) {
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gfx));
}
- gSPDisplayList(POLY_OPA_DISP++, object_bombf_DL_000408);
+ gSPDisplayList(POLY_OPA_DISP++, gBombFlowerBombAndSparkDL);
} else {
Collider_UpdateSpheres(0, &this->colliderJntSph);
}
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 b17079b6e..cb8d48d3e 100644
--- a/src/overlays/actors/ovl_En_Bomjima/z_en_bomjima.c
+++ b/src/overlays/actors/ovl_En_Bomjima/z_en_bomjima.c
@@ -6,9 +6,8 @@
#include "overlays/actors/ovl_En_Bombal/z_en_bombal.h"
#include "z_en_bomjima.h"
-#include "objects/object_cs/object_cs.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnBomjima*)thisx)
@@ -39,7 +38,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 +46,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;
@@ -99,18 +98,75 @@ u16 D_80C00A70[] = {
u16 D_80C00A8C[] = { 0x736, 0x737, 0x738, 0x74E };
-static AnimationHeader* sAnimations[] = {
- &gBomberIdleAnim, &object_cs_Anim_00FAF4, &object_cs_Anim_0057C8, &object_cs_Anim_0053F4,
- &object_cs_Anim_002044, &object_cs_Anim_01007C, &object_cs_Anim_00349C, &object_cs_Anim_004960,
- &object_cs_Anim_005128, &object_cs_Anim_004C1C, &object_cs_Anim_001A1C, &object_cs_Anim_003EE4,
- &object_cs_Anim_00478C, &object_cs_Anim_00433C, &object_cs_Anim_0060E8, &object_cs_Anim_001708,
- &object_cs_Anim_005DC4, &object_cs_Anim_0026B0, &object_cs_Anim_0036B0, &object_cs_Anim_0031C4,
+typedef enum {
+ /* -1 */ ENBOMJIMA_ANIM_NONE = -1,
+ /* 0x00 */ ENBOMJIMA_ANIM_0,
+ /* 0x01 */ ENBOMJIMA_ANIM_1,
+ /* 0x02 */ ENBOMJIMA_ANIM_2,
+ /* 0x03 */ ENBOMJIMA_ANIM_3,
+ /* 0x04 */ ENBOMJIMA_ANIM_4,
+ /* 0x05 */ ENBOMJIMA_ANIM_5,
+ /* 0x06 */ ENBOMJIMA_ANIM_6,
+ /* 0x07 */ ENBOMJIMA_ANIM_7,
+ /* 0x08 */ ENBOMJIMA_ANIM_8,
+ /* 0x09 */ ENBOMJIMA_ANIM_9,
+ /* 0x0A */ ENBOMJIMA_ANIM_10,
+ /* 0x0B */ ENBOMJIMA_ANIM_11,
+ /* 0x0C */ ENBOMJIMA_ANIM_12,
+ /* 0x0D */ ENBOMJIMA_ANIM_13,
+ /* 0x0E */ ENBOMJIMA_ANIM_14,
+ /* 0x0F */ ENBOMJIMA_ANIM_15,
+ /* 0x10 */ ENBOMJIMA_ANIM_16,
+ /* 0x11 */ ENBOMJIMA_ANIM_17,
+ /* 0x12 */ ENBOMJIMA_ANIM_18,
+ /* 0x13 */ ENBOMJIMA_ANIM_19,
+ /* 0x16 */ ENBOMJIMA_ANIM_MAX
+} EnBomjimaAnimation;
+
+static AnimationHeader* sAnimations[ENBOMJIMA_ANIM_MAX] = {
+ &gBomberIdleAnim, // ENBOMJIMA_ANIM_0
+ &object_cs_Anim_00FAF4, // ENBOMJIMA_ANIM_1
+ &object_cs_Anim_0057C8, // ENBOMJIMA_ANIM_2
+ &object_cs_Anim_0053F4, // ENBOMJIMA_ANIM_3
+ &object_cs_Anim_002044, // ENBOMJIMA_ANIM_4
+ &object_cs_Anim_01007C, // ENBOMJIMA_ANIM_5
+ &object_cs_Anim_00349C, // ENBOMJIMA_ANIM_6
+ &object_cs_Anim_004960, // ENBOMJIMA_ANIM_7
+ &object_cs_Anim_005128, // ENBOMJIMA_ANIM_8
+ &object_cs_Anim_004C1C, // ENBOMJIMA_ANIM_9
+ &object_cs_Anim_001A1C, // ENBOMJIMA_ANIM_10
+ &object_cs_Anim_003EE4, // ENBOMJIMA_ANIM_11
+ &object_cs_Anim_00478C, // ENBOMJIMA_ANIM_12
+ &object_cs_Anim_00433C, // ENBOMJIMA_ANIM_13
+ &object_cs_Anim_0060E8, // ENBOMJIMA_ANIM_14
+ &object_cs_Anim_001708, // ENBOMJIMA_ANIM_15
+ &object_cs_Anim_005DC4, // ENBOMJIMA_ANIM_16
+ &object_cs_Anim_0026B0, // ENBOMJIMA_ANIM_17
+ &object_cs_Anim_0036B0, // ENBOMJIMA_ANIM_18
+ &object_cs_Anim_0031C4, // ENBOMJIMA_ANIM_19
};
-u8 D_80C00AE4[] = {
- ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE,
- ANIMMODE_ONCE, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_LOOP, ANIMMODE_LOOP,
- ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_LOOP, ANIMMODE_LOOP,
+static u8 sAnimationModes[ENBOMJIMA_ANIM_MAX] = {
+ ANIMMODE_LOOP, // ENBOMJIMA_ANIM_0
+ ANIMMODE_LOOP, // ENBOMJIMA_ANIM_1
+ ANIMMODE_LOOP, // ENBOMJIMA_ANIM_2
+ ANIMMODE_LOOP, // ENBOMJIMA_ANIM_3
+ ANIMMODE_LOOP, // ENBOMJIMA_ANIM_4
+ ANIMMODE_LOOP, // ENBOMJIMA_ANIM_5
+ ANIMMODE_ONCE, // ENBOMJIMA_ANIM_6
+ ANIMMODE_ONCE, // ENBOMJIMA_ANIM_7
+ ANIMMODE_LOOP, // ENBOMJIMA_ANIM_8
+ ANIMMODE_LOOP, // ENBOMJIMA_ANIM_9
+ ANIMMODE_LOOP, // ENBOMJIMA_ANIM_10
+ ANIMMODE_ONCE, // ENBOMJIMA_ANIM_11
+ ANIMMODE_LOOP, // ENBOMJIMA_ANIM_12
+ ANIMMODE_LOOP, // ENBOMJIMA_ANIM_13
+ ANIMMODE_LOOP, // ENBOMJIMA_ANIM_14
+ ANIMMODE_ONCE, // ENBOMJIMA_ANIM_15
+ ANIMMODE_LOOP, // ENBOMJIMA_ANIM_16
+ ANIMMODE_ONCE, // ENBOMJIMA_ANIM_17
+ ANIMMODE_LOOP, // ENBOMJIMA_ANIM_18
+ ANIMMODE_LOOP, // ENBOMJIMA_ANIM_19
};
s16 D_80C00AF8[] = {
@@ -119,7 +175,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;
@@ -129,18 +185,18 @@ void EnBomjima_Init(Actor* thisx, PlayState* play) {
this->morphTable, OBJECT_CS_LIMB_MAX);
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_83_04);
- this->actor.targetMode = 0;
+ this->actor.targetMode = TARGET_MODE_0;
this->unk_2E6 = ENBOMJIMA_GET_F0(&this->actor);
this->unk_2E4 = ENBOMJIMA_GET_F(&this->actor);
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++;
}
@@ -205,35 +261,38 @@ void func_80BFE32C(EnBomjima* this, PlayState* play, s32 arg2) {
case 3:
this->actor.textId = D_80C00A8C[this->unk_2C8];
break;
+
+ default:
+ break;
}
}
-void func_80BFE494(EnBomjima* this, s32 animIndex, f32 playSpeed) {
+void EnBomjima_ChangeAnim(EnBomjima* this, s32 animIndex, f32 playSpeed) {
this->animIndex = animIndex;
- this->animLastFrame = Animation_GetLastFrame(sAnimations[animIndex]);
- Animation_Change(&this->skelAnime, sAnimations[this->animIndex], playSpeed, 0.0f, this->animLastFrame,
- D_80C00AE4[this->animIndex], -4.0f);
+ this->animEndFrame = Animation_GetLastFrame(sAnimations[animIndex]);
+ Animation_Change(&this->skelAnime, sAnimations[this->animIndex], playSpeed, 0.0f, this->animEndFrame,
+ sAnimationModes[this->animIndex], -4.0f);
}
void func_80BFE524(EnBomjima* this) {
- if ((this->animIndex == 5) &&
+ if ((this->animIndex == ENBOMJIMA_ANIM_5) &&
(Animation_OnFrame(&this->skelAnime, 9.0f) || Animation_OnFrame(&this->skelAnime, 10.0f) ||
Animation_OnFrame(&this->skelAnime, 17.0f) || Animation_OnFrame(&this->skelAnime, 18.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMBERS_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BOMBERS_WALK);
}
- if ((this->animIndex == 18) &&
+ if ((this->animIndex == ENBOMJIMA_ANIM_18) &&
(Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 2.0f) ||
Animation_OnFrame(&this->skelAnime, 4.0f) || Animation_OnFrame(&this->skelAnime, 6.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMBERS_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BOMBERS_WALK);
}
- if ((this->animIndex == 15) && Animation_OnFrame(&this->skelAnime, 15.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMBERS_LAND);
+ if ((this->animIndex == ENBOMJIMA_ANIM_15) && Animation_OnFrame(&this->skelAnime, 15.0f)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BOMBERS_LAND);
}
- if ((this->animIndex == 6) && Animation_OnFrame(&this->skelAnime, 8.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMBERS_LAND);
+ if ((this->animIndex == ENBOMJIMA_ANIM_6) && Animation_OnFrame(&this->skelAnime, 8.0f)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BOMBERS_LAND);
}
}
@@ -247,7 +306,7 @@ void func_80BFE65C(EnBomjima* this) {
}
void func_80BFE67C(EnBomjima* this, PlayState* play) {
- f32 sp84 = this->skelAnime.curFrame;
+ f32 curFrame = this->skelAnime.curFrame;
f32 x;
f32 z;
s16 abs;
@@ -266,13 +325,13 @@ 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,
&sp50, true, false, false, true, &sp4C)) {
- func_80BFE494(this, 5, 1.0f);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_5, 1.0f);
Math_Vec3f_Copy(&this->unk_2A4, &sp54);
this->unk_2BE = Rand_S16Offset(30, 50);
this->unk_2A2++;
@@ -281,7 +340,7 @@ void func_80BFE67C(EnBomjima* this, PlayState* play) {
break;
case 1:
- if (sp84 >= 0.0f) {
+ if (curFrame >= 0.0f) {
this->unk_2DC = Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_2A4);
Math_SmoothStepToS(&this->actor.world.rot.y, this->unk_2DC, 10, 2000, 20);
}
@@ -297,9 +356,9 @@ void func_80BFE67C(EnBomjima* this, PlayState* play) {
false, true, &sp4C)) {
this->unk_2C0 = 0;
if (Rand_ZeroOne() < 0.5f) {
- func_80BFE494(this, 19, 1.0f);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_19, 1.0f);
} else {
- func_80BFE494(this, 0, 1.0f);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_0, 1.0f);
}
this->unk_2A2 = 0;
this->unk_2D0 = 0.0f;
@@ -313,13 +372,13 @@ void func_80BFE67C(EnBomjima* this, PlayState* play) {
if ((this->unk_2BE == 0) || (sqrtf(SQ(x) + SQ(z)) < 4.0f)) {
this->unk_2C0 = Rand_S16Offset(20, 20);
if (!(this->unk_2C0 & 1)) {
- func_80BFE494(this, 19, 1.0f);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_19, 1.0f);
} else {
- func_80BFE494(this, 0, 1.0f);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_0, 1.0f);
}
this->unk_2A2 = 0;
this->unk_2D0 = 0.0f;
- } else if (sp84 >= 0.0f) {
+ } else if (curFrame >= 0.0f) {
Math_ApproachF(&this->actor.world.pos.x, this->unk_2A4.x, 0.3f, this->unk_2D0);
Math_ApproachF(&this->actor.world.pos.z, this->unk_2A4.z, 0.3f, this->unk_2D0);
Math_ApproachF(&this->unk_2D0, 1.0f, 0.3f, 0.5f);
@@ -340,8 +399,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;
@@ -349,7 +408,7 @@ void func_80BFEA94(EnBomjima* this, PlayState* play) {
}
void func_80BFEB1C(EnBomjima* this) {
- func_80BFE494(this, 1, 1.0f);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_1, 1.0f);
func_80BFE65C(this);
this->action = EN_BOMJIMA_ACTION_0;
this->actionFunc = func_80BFEB64;
@@ -379,8 +438,8 @@ void func_80BFEB64(EnBomjima* this, PlayState* play) {
}
}
- if (Text_GetFaceReaction(play, 0x11) != 0) {
- this->actor.textId = Text_GetFaceReaction(play, 0x11);
+ if (Text_GetFaceReaction(play, FACE_REACTION_SET_JIM) != 0) {
+ this->actor.textId = Text_GetFaceReaction(play, FACE_REACTION_SET_JIM);
}
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
@@ -389,8 +448,8 @@ void func_80BFEB64(EnBomjima* this, PlayState* play) {
return;
}
- if (ActorCutscene_GetCurrentIndex() == -1) {
- func_800B8614(&this->actor, play, 70.0f);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_NONE) {
+ Actor_OfferTalk(&this->actor, play, 70.0f);
}
if ((this->bombal->actor.update == NULL) || (this->bombal->actor.colChkInfo.health == 0)) {
@@ -400,7 +459,7 @@ void func_80BFEB64(EnBomjima* this, PlayState* play) {
switch (this->unk_2A2) {
case 0:
- func_80BFE494(this, 4, 1.0f);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_4, 1.0f);
this->unk_29A = -7000;
this->unk_2A2++;
break;
@@ -409,7 +468,7 @@ void func_80BFEB64(EnBomjima* this, PlayState* play) {
this->unk_2DC = Math_Vec3f_Yaw(&this->actor.world.pos, &this->bombal->actor.world.pos);
if (Animation_OnFrame(&this->skelAnime, 19.0f)) {
this->unk_2C0 = 5;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMBERS_SHOT_BREATH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BOMBERS_SHOT_BREATH);
}
if (this->unk_2C0 == 1) {
@@ -422,7 +481,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);
@@ -430,11 +489,11 @@ void func_80BFEB64(EnBomjima* this, PlayState* play) {
this->unk_2BC++;
if (((s16)Rand_ZeroFloat(2.0f) + 3) < this->unk_2BC) {
- func_80BFE494(this, 5, 1.0f);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_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++;
}
}
@@ -456,7 +515,7 @@ void func_80BFEB64(EnBomjima* this, PlayState* play) {
void func_80BFEFF0(EnBomjima* this) {
this->bombal = NULL;
- func_80BFE494(this, 19, 1.0f);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_19, 1.0f);
func_80BFE65C(this);
this->action = EN_BOMJIMA_ACTION_1;
this->actionFunc = func_80BFF03C;
@@ -465,17 +524,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);
}
}
@@ -483,23 +542,23 @@ void func_80BFF03C(EnBomjima* this, PlayState* play) {
void func_80BFF120(EnBomjima* this) {
func_80BFE65C(this);
this->cutsceneTimer = 30;
- func_80BFE494(this, 6, 1.0f);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_6, 1.0f);
this->cutsceneEnded = false;
this->action = EN_BOMJIMA_ACTION_2;
this->actionFunc = func_80BFF174;
}
void func_80BFF174(EnBomjima* this, PlayState* play) {
- f32 sp2C = this->skelAnime.curFrame;
+ f32 curFrame = this->skelAnime.curFrame;
Player* player = GET_PLAYER(play);
if (this->cutsceneTimer == 1) {
- ActorCutscene_Stop(this->cutscenes[0]);
+ CutsceneManager_Stop(this->csIdList[0]);
this->cutsceneEnded = true;
}
- if (Text_GetFaceReaction(play, 0x11) != 0) {
- this->actor.textId = Text_GetFaceReaction(play, 0x11);
+ if (Text_GetFaceReaction(play, FACE_REACTION_SET_JIM) != 0) {
+ this->actor.textId = Text_GetFaceReaction(play, FACE_REACTION_SET_JIM);
}
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
@@ -510,10 +569,10 @@ void func_80BFF174(EnBomjima* this, PlayState* play) {
Math_SmoothStepToS(&this->actor.world.rot.y, this->unk_2DC, 1, 5000, 0);
- if ((this->animLastFrame <= sp2C) && (this->unk_2BC < 5)) {
+ if ((curFrame >= this->animEndFrame) && (this->unk_2BC < 5)) {
this->unk_2BC++;
- if (this->animIndex != 19) {
- func_80BFE494(this, 19, 1.0f);
+ if (this->animIndex != ENBOMJIMA_ANIM_19) {
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_19, 1.0f);
}
}
@@ -557,12 +616,12 @@ void func_80BFF174(EnBomjima* this, PlayState* play) {
if (this->unk_2BC >= 5) {
func_80BFE67C(this, play);
}
- func_800B8614(&this->actor, play, 70.0f);
+ Actor_OfferTalk(&this->actor, play, 70.0f);
}
}
void func_80BFF3F0(EnBomjima* this) {
- func_80BFE494(this, 15, 1.0f);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_15, 1.0f);
this->action = EN_BOMJIMA_ACTION_3;
this->actionFunc = func_80BFF430;
}
@@ -570,17 +629,17 @@ void func_80BFF3F0(EnBomjima* this) {
void func_80BFF430(EnBomjima* this, PlayState* play) {
f32 curFrame = this->skelAnime.curFrame;
- if (this->animLastFrame <= curFrame) {
+ if (curFrame >= this->animEndFrame) {
EnBombal* bombal = (EnBombal*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOMBAL, this->unk_2B0.x,
this->unk_2B0.y, this->unk_2B0.z, 0, 0, 0, 0);
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);
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80BFEA94;
}
}
@@ -594,11 +653,11 @@ void func_80BFF4F4(EnBomjima* this) {
void func_80BFF52C(EnBomjima* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
if (play->msgCtx.choiceIndex == 0) {
Player* player = GET_PLAYER(play);
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
func_80BFE65C(this);
this->unk_28E = 0;
this->unk_29A = 0;
@@ -608,15 +667,15 @@ void func_80BFF52C(EnBomjima* this, PlayState* play) {
} else {
this->actor.textId = D_80C00A70[this->unk_2C8];
}
- func_80151938(play, this->actor.textId);
- play_sound(NA_SE_SY_FOUND);
- func_80BFE494(this, 15, 1.0f);
+ Message_ContinueTextbox(play, this->actor.textId);
+ Audio_PlaySfx(NA_SE_SY_FOUND);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_15, 1.0f);
this->action = EN_BOMJIMA_ACTION_5;
this->actionFunc = func_80BFF6CC;
} else {
Player* player = GET_PLAYER(play);
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
func_80BFE65C(this);
this->unk_2C8 = 10;
if (player->transformation == PLAYER_FORM_DEKU) {
@@ -626,7 +685,7 @@ void func_80BFF52C(EnBomjima* this, PlayState* play) {
this->actor.textId = D_80C00A70[this->unk_2C8];
this->unk_2EA = 1;
}
- func_80151938(play, this->actor.textId);
+ Message_ContinueTextbox(play, this->actor.textId);
func_80C00234(this);
}
}
@@ -635,10 +694,10 @@ void func_80BFF52C(EnBomjima* this, PlayState* play) {
void func_80BFF6CC(EnBomjima* this, PlayState* play) {
f32 curFrame = this->skelAnime.curFrame;
- if (this->animLastFrame <= curFrame) {
+ if (curFrame >= this->animEndFrame) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
- func_80BFE494(this, 1, 1.0f);
+ Message_CloseTextbox(play);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_1, 1.0f);
this->actionFunc = func_80BFF754;
}
}
@@ -653,14 +712,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 +749,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,14 +779,14 @@ 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);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_3, 1.0f);
this->unk_2C8 = 9;
if (player->transformation == PLAYER_FORM_DEKU) {
@@ -735,15 +794,15 @@ void func_80BFF9B0(EnBomjima* this, PlayState* play) {
} else {
this->actor.textId = D_80C00A70[this->unk_2C8];
}
- func_80151938(play, this->actor.textId);
+ Message_ContinueTextbox(play, this->actor.textId);
this->actionFunc = func_80BFFB40;
}
}
void func_80BFFB40(EnBomjima* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
- func_80BFE494(this, 15, 1.0f);
+ Message_CloseTextbox(play);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_15, 1.0f);
D_80C009F0 = 100;
this->unk_2DC = 0;
this->actionFunc = func_80BFFBC4;
@@ -753,8 +812,8 @@ void func_80BFFB40(EnBomjima* this, PlayState* play) {
void func_80BFFBC4(EnBomjima* this, PlayState* play) {
f32 curFrame = this->skelAnime.curFrame;
- if ((this->animIndex != 1) && (this->animLastFrame <= curFrame)) {
- func_80BFE494(this, 1, 1.0f);
+ if ((this->animIndex != ENBOMJIMA_ANIM_1) && (curFrame >= this->animEndFrame)) {
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_1, 1.0f);
}
if ((D_80C009F4 != 0) && (this->unk_2C2 == 0)) {
@@ -768,19 +827,19 @@ void func_80BFFBC4(EnBomjima* this, PlayState* play) {
Math_SmoothStepToS(&this->unk_290, this->unk_2DC, 1, 5000, 0);
if (D_80C009F0 >= 104) {
D_80C009F0 = 0;
- func_801477B4(play);
+ Message_CloseTextbox(play);
play->nextEntrance = Entrance_CreateFromSpawn(6);
gSaveContext.nextCutsceneIndex = 0;
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]);
}
}
void func_80BFFCFC(EnBomjima* this) {
func_80BFE65C(this);
- func_80BFE494(this, 18, 1.0f);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_18, 1.0f);
this->action = EN_BOMJIMA_ACTION_6;
this->actionFunc = func_80BFFD48;
}
@@ -795,7 +854,7 @@ void func_80BFFD48(EnBomjima* this, PlayState* play) {
if (sqrtf(SQ(this->actor.world.pos.x - this->unk_2A4.x) + SQ(this->actor.world.pos.z - this->unk_2A4.z)) < 4.0f) {
D_80C009F0++;
this->unk_2DC = this->actor.parent->world.rot.y;
- func_80BFE494(this, 0, 1.0f);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_0, 1.0f);
this->actionFunc = func_80BFFE48;
}
}
@@ -807,7 +866,7 @@ void func_80BFFE48(EnBomjima* this, PlayState* play) {
if (D_80C009F0 >= 100) {
if (this->unk_2E4 != 4) {
- func_80BFE494(this, 15, 1.0f);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_15, 1.0f);
this->unk_2DC = 0;
func_80BFE65C(this);
this->actionFunc = func_80BFFF54;
@@ -815,7 +874,7 @@ void func_80BFFE48(EnBomjima* this, PlayState* play) {
Math_SmoothStepToS(&this->unk_290, 10000, 1, 5000, 0);
if (D_80C009F0 >= 103) {
this->unk_2DC = 0;
- func_80BFE494(this, 15, 1.0f);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_15, 1.0f);
func_80BFE65C(this);
this->actionFunc = func_80BFFF54;
}
@@ -837,22 +896,22 @@ void func_80BFFF54(EnBomjima* this, PlayState* play) {
}
if (this->unk_2E4 != 4) {
- if ((this->animIndex != 0) && (this->animLastFrame <= curFrame)) {
+ if ((this->animIndex != ENBOMJIMA_ANIM_0) && (curFrame >= this->animEndFrame)) {
D_80C009F0++;
- func_80BFE494(this, 0, 1.0f);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_0, 1.0f);
}
- } else if ((this->animIndex != 8) && (this->animLastFrame <= curFrame)) {
- func_80BFE494(this, 8, 1.0f);
+ } else if ((this->animIndex != ENBOMJIMA_ANIM_8) && (curFrame >= this->animEndFrame)) {
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_8, 1.0f);
D_80C009F4 = 1;
}
- if (this->animIndex == 8) {
+ if (this->animIndex == ENBOMJIMA_ANIM_8) {
if ((D_80C009F4 == 1) && Animation_OnFrame(&this->skelAnime, 7.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_HUMAN_BOUND);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_HUMAN_BOUND);
D_80C009F4 = 2;
}
- if ((this->animLastFrame <= curFrame) && (this->unk_2C0 == 0)) {
+ if ((curFrame >= this->animEndFrame) && (this->unk_2C0 == 0)) {
this->unk_2C0 = 10;
}
@@ -864,7 +923,7 @@ void func_80BFFF54(EnBomjima* this, PlayState* play) {
void func_80C0011C(EnBomjima* this) {
func_80BFE65C(this);
- func_80BFE494(this, 0, 1.0f);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_0, 1.0f);
this->action = EN_BOMJIMA_ACTION_7;
this->actionFunc = func_80C00168;
}
@@ -881,20 +940,20 @@ void func_80C00168(EnBomjima* this, PlayState* play) {
func_80BFE32C(this, play, 0);
func_80BFE67C(this, play);
- if (Text_GetFaceReaction(play, 0x11) != 0) {
- this->actor.textId = Text_GetFaceReaction(play, 0x11);
+ if (Text_GetFaceReaction(play, FACE_REACTION_SET_JIM) != 0) {
+ this->actor.textId = Text_GetFaceReaction(play, FACE_REACTION_SET_JIM);
}
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->unk_2DC = this->actor.yawTowardsPlayer;
func_80C00234(this);
} else {
- func_800B8614(&this->actor, play, 70.0f);
+ Actor_OfferTalk(&this->actor, play, 70.0f);
}
}
void func_80C00234(EnBomjima* this) {
- func_80BFE494(this, 3, 1.0f);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_3, 1.0f);
this->collider.dim.radius = 15;
this->collider.dim.height = 40;
func_80BFE65C(this);
@@ -903,16 +962,16 @@ void func_80C00234(EnBomjima* this) {
void func_80C00284(EnBomjima* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- f32 sp28 = this->skelAnime.curFrame;
+ f32 curFrame = this->skelAnime.curFrame;
Math_SmoothStepToS(&this->actor.world.rot.y, this->unk_2DC, 1, 5000, 0);
if (((this->action == EN_BOMJIMA_ACTION_0) || (this->unk_2C8 == 10) || (this->unk_2C8 == 11) ||
(this->unk_2CA == 1)) &&
- (this->animLastFrame <= sp28)) {
+ (curFrame >= this->animEndFrame)) {
if (!(this->unk_2BC & 1)) {
- func_80BFE494(this, 3, 1.0f);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_3, 1.0f);
} else {
- func_80BFE494(this, 16, 1.0f);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_16, 1.0f);
}
this->unk_2BC++;
this->unk_2BC &= 1;
@@ -927,6 +986,9 @@ void func_80C00284(EnBomjima* this, PlayState* play) {
case PLAYER_FORM_ZORA:
this->unk_28E = -0x1770;
break;
+
+ default:
+ break;
}
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
@@ -944,13 +1006,13 @@ void func_80C00284(EnBomjima* this, PlayState* play) {
func_80BFF3F0(this);
} else {
func_80BFE65C(this);
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80BFEA94;
}
return;
}
- func_801477B4(play);
+ Message_CloseTextbox(play);
switch (this->unk_2CA) {
case 0:
@@ -966,10 +1028,10 @@ void func_80C00284(EnBomjima* this, PlayState* play) {
if (this->unk_2C8 == 10) {
func_80BFE65C(this);
this->unk_28E = 0;
- func_80BFE494(this, 1, 1.0f);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_1, 1.0f);
this->action = EN_BOMJIMA_ACTION_2;
this->actionFunc = func_80BFF174;
- return;
+ break;
}
this->unk_2C8++;
@@ -984,7 +1046,7 @@ void func_80C00284(EnBomjima* this, PlayState* play) {
}
this->actor.textId = D_80C00A70[this->unk_2C8];
}
- func_80151938(play, this->actor.textId);
+ Message_ContinueTextbox(play, this->actor.textId);
if ((this->unk_2C8 == 7) || (this->unk_2C8 == 12)) {
func_80BFF4F4(this);
}
@@ -993,11 +1055,14 @@ void func_80C00284(EnBomjima* this, PlayState* play) {
case 3:
this->unk_2C8++;
this->actor.textId = D_80C00A8C[this->unk_2C8];
- func_80151938(play, this->actor.textId);
+ Message_ContinueTextbox(play, this->actor.textId);
if (this->unk_2C8 >= 2) {
- func_80BFE494(this, 17, 1.0f);
+ EnBomjima_ChangeAnim(this, ENBOMJIMA_ANIM_17, 1.0f);
}
break;
+
+ default:
+ break;
}
}
}
@@ -1044,7 +1109,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);
@@ -1053,24 +1120,24 @@ void EnBomjima_Update(Actor* thisx, PlayState* play) {
s32 EnBomjima_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnBomjima* this = THIS;
- if (limbIndex == 8) {
+ if (limbIndex == OBJECT_CS_LIMB_08) {
rot->z += this->unk_294;
}
- if ((limbIndex == 15) && (this->unk_2E6 == 2)) {
+ if ((limbIndex == OBJECT_CS_LIMB_0F) && (this->unk_2E6 == 2)) {
*dList = NULL;
}
- if (limbIndex == 17) {
+ if (limbIndex == OBJECT_CS_LIMB_11) {
rot->x += this->unk_28A;
rot->z += this->unk_288;
}
- if ((limbIndex == 19) && (this->unk_2E6 == 2)) {
+ if ((limbIndex == OBJECT_CS_LIMB_13) && (this->unk_2E6 == 2)) {
*dList = NULL;
}
- if ((limbIndex == 20) && (this->unk_2E6 == 0)) {
+ if ((limbIndex == OBJECT_CS_LIMB_14) && (this->unk_2E6 == 0)) {
*dList = NULL;
}
@@ -1096,8 +1163,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..15b4b10fb 100644
--- a/src/overlays/actors/ovl_En_Bomjima/z_en_bomjima.h
+++ b/src/overlays/actors/ovl_En_Bomjima/z_en_bomjima.h
@@ -2,6 +2,7 @@
#define Z_EN_BOMJIMA_H
#include "global.h"
+#include "objects/object_cs/object_cs.h"
struct EnBomjima;
@@ -13,8 +14,8 @@ typedef void (*EnBomjimaActionFunc)(struct EnBomjima*, PlayState*);
typedef struct EnBomjima {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[21];
- /* 0x206 */ Vec3s morphTable[21];
+ /* 0x188 */ Vec3s jointTable[OBJECT_CS_LIMB_MAX];
+ /* 0x206 */ Vec3s morphTable[OBJECT_CS_LIMB_MAX];
/* 0x284 */ EnBomjimaActionFunc actionFunc;
/* 0x288 */ s16 unk_288;
/* 0x28A */ s16 unk_28A;
@@ -38,9 +39,9 @@ typedef struct EnBomjima {
/* 0x2C6 */ s16 unk_2C6;
/* 0x2C8 */ s16 unk_2C8;
/* 0x2CA */ s16 unk_2CA;
- /* 0x2CC */ f32 animLastFrame;
+ /* 0x2CC */ f32 animEndFrame;
/* 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 +53,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 7e07ed9d6..2e1984651 100644
--- a/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.c
+++ b/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.c
@@ -6,9 +6,8 @@
#include "z_en_bomjimb.h"
#include "overlays/actors/ovl_En_Niw/z_en_niw.h"
-#include "objects/object_cs/object_cs.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnBomjimb*)thisx)
@@ -72,20 +71,81 @@ static ColliderCylinderInit sCylinderInit = {
{ 20, 30, 0, { 0, 0, 0 } },
};
-static AnimationHeader* sAnimations[] = {
- &gBomberIdleAnim, &object_cs_Anim_00FAF4, &object_cs_Anim_0057C8, &object_cs_Anim_0053F4,
- &object_cs_Anim_002044, &object_cs_Anim_01007C, &object_cs_Anim_00349C, &object_cs_Anim_004960,
- &object_cs_Anim_005128, &object_cs_Anim_004C1C, &object_cs_Anim_002930, &object_cs_Anim_001A1C,
- &object_cs_Anim_003EE4, &object_cs_Anim_00478C, &object_cs_Anim_00433C, &object_cs_Anim_0060E8,
- &object_cs_Anim_001708, &object_cs_Anim_005DC4, &object_cs_Anim_0026B0, &object_cs_Anim_0036B0,
- &object_cs_Anim_0031C4, &object_cs_Anim_010B68,
+typedef enum {
+ /* -1 */ ENBOMJIMB_ANIM_NONE = -1,
+ /* 0x00 */ ENBOMJIMB_ANIM_0,
+ /* 0x01 */ ENBOMJIMB_ANIM_1,
+ /* 0x02 */ ENBOMJIMB_ANIM_2,
+ /* 0x03 */ ENBOMJIMB_ANIM_3,
+ /* 0x04 */ ENBOMJIMB_ANIM_4,
+ /* 0x05 */ ENBOMJIMB_ANIM_5,
+ /* 0x06 */ ENBOMJIMB_ANIM_6,
+ /* 0x07 */ ENBOMJIMB_ANIM_7,
+ /* 0x08 */ ENBOMJIMB_ANIM_8,
+ /* 0x09 */ ENBOMJIMB_ANIM_9,
+ /* 0x0A */ ENBOMJIMB_ANIM_10,
+ /* 0x0B */ ENBOMJIMB_ANIM_11,
+ /* 0x0C */ ENBOMJIMB_ANIM_12,
+ /* 0x0D */ ENBOMJIMB_ANIM_13,
+ /* 0x0E */ ENBOMJIMB_ANIM_14,
+ /* 0x0F */ ENBOMJIMB_ANIM_15,
+ /* 0x10 */ ENBOMJIMB_ANIM_16,
+ /* 0x11 */ ENBOMJIMB_ANIM_17,
+ /* 0x12 */ ENBOMJIMB_ANIM_18,
+ /* 0x13 */ ENBOMJIMB_ANIM_19,
+ /* 0x14 */ ENBOMJIMB_ANIM_20,
+ /* 0x15 */ ENBOMJIMB_ANIM_21,
+ /* 0x16 */ ENBOMJIMB_ANIM_MAX
+} EnBomjimbAnimation;
+
+static AnimationHeader* sAnimations[ENBOMJIMB_ANIM_MAX] = {
+ &gBomberIdleAnim, // ENBOMJIMB_ANIM_0
+ &object_cs_Anim_00FAF4, // ENBOMJIMB_ANIM_1
+ &object_cs_Anim_0057C8, // ENBOMJIMB_ANIM_2
+ &object_cs_Anim_0053F4, // ENBOMJIMB_ANIM_3
+ &object_cs_Anim_002044, // ENBOMJIMB_ANIM_4
+ &object_cs_Anim_01007C, // ENBOMJIMB_ANIM_5
+ &object_cs_Anim_00349C, // ENBOMJIMB_ANIM_6
+ &object_cs_Anim_004960, // ENBOMJIMB_ANIM_7
+ &object_cs_Anim_005128, // ENBOMJIMB_ANIM_8
+ &object_cs_Anim_004C1C, // ENBOMJIMB_ANIM_9
+ &object_cs_Anim_002930, // ENBOMJIMB_ANIM_10
+ &object_cs_Anim_001A1C, // ENBOMJIMB_ANIM_11
+ &object_cs_Anim_003EE4, // ENBOMJIMB_ANIM_12
+ &object_cs_Anim_00478C, // ENBOMJIMB_ANIM_13
+ &object_cs_Anim_00433C, // ENBOMJIMB_ANIM_14
+ &object_cs_Anim_0060E8, // ENBOMJIMB_ANIM_15
+ &object_cs_Anim_001708, // ENBOMJIMB_ANIM_16
+ &object_cs_Anim_005DC4, // ENBOMJIMB_ANIM_17
+ &object_cs_Anim_0026B0, // ENBOMJIMB_ANIM_18
+ &object_cs_Anim_0036B0, // ENBOMJIMB_ANIM_19
+ &object_cs_Anim_0031C4, // ENBOMJIMB_ANIM_20
+ &object_cs_Anim_010B68, // ENBOMJIMB_ANIM_21
};
-static u8 sAnimationModes[] = {
- ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP,
- ANIMMODE_ONCE, ANIMMODE_ONCE, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP,
- ANIMMODE_ONCE, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_LOOP,
- ANIMMODE_ONCE, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_LOOP, ANIMMODE_LOOP,
+static u8 sAnimationModes[ENBOMJIMB_ANIM_MAX] = {
+ ANIMMODE_LOOP, // ENBOMJIMB_ANIM_0
+ ANIMMODE_LOOP, // ENBOMJIMB_ANIM_1
+ ANIMMODE_LOOP, // ENBOMJIMB_ANIM_2
+ ANIMMODE_LOOP, // ENBOMJIMB_ANIM_3
+ ANIMMODE_LOOP, // ENBOMJIMB_ANIM_4
+ ANIMMODE_LOOP, // ENBOMJIMB_ANIM_5
+ ANIMMODE_ONCE, // ENBOMJIMB_ANIM_6
+ ANIMMODE_ONCE, // ENBOMJIMB_ANIM_7
+ ANIMMODE_LOOP, // ENBOMJIMB_ANIM_8
+ ANIMMODE_LOOP, // ENBOMJIMB_ANIM_9
+ ANIMMODE_LOOP, // ENBOMJIMB_ANIM_10
+ ANIMMODE_LOOP, // ENBOMJIMB_ANIM_11
+ ANIMMODE_ONCE, // ENBOMJIMB_ANIM_12
+ ANIMMODE_LOOP, // ENBOMJIMB_ANIM_13
+ ANIMMODE_LOOP, // ENBOMJIMB_ANIM_14
+ ANIMMODE_LOOP, // ENBOMJIMB_ANIM_15
+ ANIMMODE_ONCE, // ENBOMJIMB_ANIM_16
+ ANIMMODE_LOOP, // ENBOMJIMB_ANIM_17
+ ANIMMODE_ONCE, // ENBOMJIMB_ANIM_18
+ ANIMMODE_LOOP, // ENBOMJIMB_ANIM_19
+ ANIMMODE_LOOP, // ENBOMJIMB_ANIM_20
+ ANIMMODE_ONCE, // ENBOMJIMB_ANIM_21
};
void EnBomjimb_Init(Actor* thisx, PlayState* play) {
@@ -97,7 +157,7 @@ void EnBomjimb_Init(Actor* thisx, PlayState* play) {
SkelAnime_InitFlex(play, &this->skelAnime, &object_cs_Skel_00F82C, &gBomberIdleAnim, this->jointTable,
this->morphTable, OBJECT_CS_LIMB_MAX);
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
Actor_SetScale(&this->actor, 0.01f);
this->unk_2C6 = ENBOMJIMB_GET_F0(&this->actor);
@@ -151,6 +211,9 @@ void EnBomjimb_Init(Actor* thisx, PlayState* play) {
return;
}
break;
+
+ default:
+ break;
}
}
@@ -174,31 +237,31 @@ void EnBomjimb_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyCylinder(play, &this->collider);
}
-void func_80C0113C(EnBomjimb* this, s32 arg1, f32 arg2) {
- this->unk_2DC = arg1;
- this->unk_2B8 = Animation_GetLastFrame(sAnimations[arg1]);
- Animation_Change(&this->skelAnime, sAnimations[this->unk_2DC], arg2, 0.0f, this->unk_2B8,
- sAnimationModes[this->unk_2DC], -4.0f);
+void EnBomjimb_ChangeAnim(EnBomjimb* this, s32 animIndex, f32 playSpeed) {
+ this->animIndex = animIndex;
+ this->animEndFrame = Animation_GetLastFrame(sAnimations[animIndex]);
+ Animation_Change(&this->skelAnime, sAnimations[this->animIndex], playSpeed, 0.0f, this->animEndFrame,
+ sAnimationModes[this->animIndex], -4.0f);
}
void func_80C011CC(EnBomjimb* this) {
- if ((this->unk_2DC == 5) &&
+ if ((this->animIndex == ENBOMJIMB_ANIM_5) &&
(Animation_OnFrame(&this->skelAnime, 9.0f) || Animation_OnFrame(&this->skelAnime, 10.0f) ||
Animation_OnFrame(&this->skelAnime, 17.0f) || Animation_OnFrame(&this->skelAnime, 18.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMBERS_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BOMBERS_WALK);
}
- if ((this->unk_2DC == 19) &&
+ if ((this->animIndex == ENBOMJIMB_ANIM_19) &&
(Animation_OnFrame(&this->skelAnime, 2.0f) || Animation_OnFrame(&this->skelAnime, 6.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMBERS_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BOMBERS_WALK);
}
- if ((this->unk_2DC == 18) && Animation_OnFrame(&this->skelAnime, 15.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMBERS_LAND);
+ if ((this->animIndex == ENBOMJIMB_ANIM_18) && Animation_OnFrame(&this->skelAnime, 15.0f)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BOMBERS_LAND);
}
- if ((this->unk_2DC == 7) && Animation_OnFrame(&this->skelAnime, 8.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMBERS_LAND);
+ if ((this->animIndex == ENBOMJIMB_ANIM_7) && Animation_OnFrame(&this->skelAnime, 8.0f)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BOMBERS_LAND);
}
}
@@ -215,7 +278,7 @@ s32 func_80C012FC(EnBomjimb* this, PlayState* play) {
if (!Play_InCsMode(play) && (this->actor.xzDistToPlayer < 40.0f) &&
(fabsf(player->actor.world.pos.y - this->actor.world.pos.y) < 50.0f) && (play->msgCtx.msgLength == 0)) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
func_80C02740(this, play);
return true;
}
@@ -275,13 +338,13 @@ 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,
&colPoly, true, false, false, true, &sp44)) {
- func_80C0113C(this, 5, 1.0f);
+ EnBomjimb_ChangeAnim(this, ENBOMJIMB_ANIM_5, 1.0f);
Math_Vec3f_Copy(&this->unk_294, &sp48);
this->unk_2B0 = Rand_S16Offset(30, 50);
this->unk_2CC++;
@@ -303,9 +366,9 @@ void func_80C014E4(EnBomjimb* this, PlayState* play) {
false, true, &sp44)) {
this->unk_2AE = 0;
if (Rand_ZeroOne() < 0.5f) {
- func_80C0113C(this, 20, 1.0f);
+ EnBomjimb_ChangeAnim(this, ENBOMJIMB_ANIM_20, 1.0f);
} else {
- func_80C0113C(this, 0, 1.0f);
+ EnBomjimb_ChangeAnim(this, ENBOMJIMB_ANIM_0, 1.0f);
}
this->unk_2CC = 0;
this->unk_2B4 = 0.0f;
@@ -319,9 +382,9 @@ void func_80C014E4(EnBomjimb* this, PlayState* play) {
if ((this->unk_2B0 == 0) || (sqrtf(SQ(x) + SQ(z)) < 4.0f)) {
this->unk_2AE = Rand_S16Offset(20, 20);
if (!(this->unk_2AE & 1)) {
- func_80C0113C(this, 20, 1.0f);
+ EnBomjimb_ChangeAnim(this, ENBOMJIMB_ANIM_20, 1.0f);
} else {
- func_80C0113C(this, 0, 1.0f);
+ EnBomjimb_ChangeAnim(this, ENBOMJIMB_ANIM_0, 1.0f);
}
this->unk_2CC = 0;
this->unk_2B4 = 0.0f;
@@ -331,6 +394,9 @@ void func_80C014E4(EnBomjimb* this, PlayState* play) {
Math_ApproachF(&this->unk_2B4, 1.0f, 0.3f, 0.5f);
}
break;
+
+ default:
+ break;
}
if (player->stateFlags3 != PLAYER_STATE3_1000000) {
@@ -353,7 +419,7 @@ void func_80C01984(EnBomjimb* this, PlayState* play) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_NIW, this->actor.world.pos.x, this->actor.world.pos.y + 30.0f,
this->actor.world.pos.z, 0, this->actor.world.rot.y, 0, 2);
if (this->unk_2E4 != NULL) {
- func_80C0113C(this, 11, 1.0f);
+ EnBomjimb_ChangeAnim(this, ENBOMJIMB_ANIM_11, 1.0f);
}
this->unk_2CA = 0;
this->actionFunc = func_80C01A24;
@@ -368,7 +434,7 @@ void func_80C01A24(EnBomjimb* this, PlayState* play) {
if ((this->unk_2E4 != NULL) && (this->unk_2E4->update != NULL)) {
((EnNiw*)this->unk_2E4)->unk2BC.z = 90000.0f;
}
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->unk_2E4 = NULL;
this->actor.gravity = -2.0f;
func_80C02108(this);
@@ -380,10 +446,10 @@ void func_80C01A24(EnBomjimb* this, PlayState* play) {
}
if (this->unk_2C0 != 0) {
- Math_ApproachF(&this->actor.speedXZ, 6.0f, 0.5f, 2.0f);
+ Math_ApproachF(&this->actor.speed, 6.0f, 0.5f, 2.0f);
}
- if ((this->unk_2C0 != 0) && !(this->actor.bgCheckFlags & 1)) {
+ if ((this->unk_2C0 != 0) && !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
func_80C01B40(this);
}
}
@@ -395,13 +461,13 @@ void func_80C01B40(EnBomjimb* this) {
}
void func_80C01B74(EnBomjimb* this, PlayState* play) {
- Math_ApproachF(&this->actor.speedXZ, 6.0f, 0.5f, 2.0f);
- if ((this->collider.base.acFlags & AC_HIT) || (this->actor.bgCheckFlags & 1)) {
+ Math_ApproachF(&this->actor.speed, 6.0f, 0.5f, 2.0f);
+ if ((this->collider.base.acFlags & AC_HIT) || (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
this->collider.base.acFlags &= ~AC_HIT;
if ((this->unk_2E4 != NULL) && (this->unk_2E4->update != NULL)) {
((EnNiw*)this->unk_2E4)->unk2BC.z = 90000.0f;
}
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->unk_2E4 = NULL;
this->actor.gravity = -2.0f;
func_80C02108(this);
@@ -419,13 +485,13 @@ void func_80C01C18(EnBomjimb* this, PlayState* play) {
this->unk_294.z = this->unk_2E4->world.pos.z;
}
}
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->unk_2CA = 2;
this->actionFunc = func_80C01CD0;
}
void func_80C01CD0(EnBomjimb* this, PlayState* play) {
- f32 sp3C = this->skelAnime.curFrame;
+ f32 curFrame = this->skelAnime.curFrame;
s32 pad[2];
if ((this->unk_2E4 != NULL) && ((this->unk_2E4->update == NULL) || Actor_HasParent(this->unk_2E4, play))) {
@@ -436,22 +502,22 @@ void func_80C01CD0(EnBomjimb* this, PlayState* play) {
return;
}
- if (this->unk_2DC != 7) {
+ if (this->animIndex != ENBOMJIMB_ANIM_7) {
Math_SmoothStepToS(&this->actor.world.rot.y, Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_294), 1, 3000,
0);
Math_ApproachF(&this->actor.world.pos.x, this->unk_294.x, 0.3f, 2.0f);
Math_ApproachF(&this->actor.world.pos.z, this->unk_294.z, 0.3f, 2.0f);
if (sqrtf(SQ(this->actor.world.pos.x - this->unk_294.x) + SQ(this->actor.world.pos.z - this->unk_294.z)) <
3.0f) {
- func_80C0113C(this, 7, 1.0f);
+ EnBomjimb_ChangeAnim(this, ENBOMJIMB_ANIM_7, 1.0f);
Math_Vec3f_Copy(&this->actor.world.pos, &this->unk_294);
}
- } else if (this->unk_2B8 <= sp3C) {
+ } else if (curFrame >= this->animEndFrame) {
this->actor.draw = NULL;
}
- if ((this->unk_2C0 == 0) && (this->unk_2E4->bgCheckFlags & 1)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_PUT_DOWN_WOODBOX);
+ if ((this->unk_2C0 == 0) && (this->unk_2E4->bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_PUT_DOWN_WOODBOX);
this->unk_2C0 = 1;
}
@@ -487,7 +553,7 @@ void func_80C01CD0(EnBomjimb* this, PlayState* play) {
void func_80C01FD4(EnBomjimb* this) {
this->actor.textId = 0x72D;
- func_80C0113C(this, 9, 1.0f);
+ EnBomjimb_ChangeAnim(this, ENBOMJIMB_ANIM_9, 1.0f);
this->unk_2CA = 4;
this->actionFunc = func_80C0201C;
}
@@ -509,12 +575,12 @@ void func_80C0201C(EnBomjimb* this, PlayState* play) {
this->unk_2CA = 10;
this->actionFunc = func_80C02A14;
} else {
- func_800B8614(&this->actor, play, 40.0f);
+ Actor_OfferTalk(&this->actor, play, 40.0f);
}
}
void func_80C02108(EnBomjimb* this) {
- func_80C0113C(this, 6, 1.0f);
+ EnBomjimb_ChangeAnim(this, ENBOMJIMB_ANIM_6, 1.0f);
this->unk_2D6 = BINANG_ROT180(this->actor.yawTowardsPlayer);
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
func_80C012E0(this);
@@ -544,16 +610,16 @@ void func_80C0217C(EnBomjimb* this, PlayState* play) {
return;
}
- if (this->unk_2DC == 6) {
+ if (this->animIndex == ENBOMJIMB_ANIM_6) {
f32 curFrame = this->skelAnime.curFrame;
- if (this->unk_2B8 <= curFrame) {
- func_80C0113C(this, 19, 2.0f);
+ if (curFrame >= this->animEndFrame) {
+ EnBomjimb_ChangeAnim(this, ENBOMJIMB_ANIM_19, 2.0f);
}
return;
}
- Math_ApproachF(&this->actor.speedXZ, 8.0f, 0.5f, 2.0f);
+ Math_ApproachF(&this->actor.speed, 8.0f, 0.5f, 2.0f);
Math_Vec3f_Copy(&sp74, &this->actor.world.pos);
sp74.x += Math_SinS(this->actor.world.rot.y) * 50.0f;
@@ -590,7 +656,7 @@ void func_80C0217C(EnBomjimb* this, PlayState* play) {
this->actor.world.rot.y = this->unk_2D6 + this->unk_2D4;
- if (SurfaceType_GetSceneExitIndex(&play->colCtx, sp58, sp5C)) {
+ if (SurfaceType_GetSceneExitIndex(&play->colCtx, sp58, sp5C) != 0) {
s16 temp = BINANG_SUB(this->actor.world.rot.y, this->actor.yawTowardsPlayer - 0x8000);
if (temp < 0) {
@@ -609,9 +675,9 @@ void func_80C0217C(EnBomjimb* this, PlayState* play) {
}
void func_80C0250C(EnBomjimb* this) {
- func_80C0113C(this, 15, 1.0f);
+ EnBomjimb_ChangeAnim(this, ENBOMJIMB_ANIM_15, 1.0f);
this->unk_2D4 = 0;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->unk_2D6 = BINANG_ROT180(this->actor.yawTowardsPlayer);
func_80C012E0(this);
this->unk_2CA = 6;
@@ -629,7 +695,7 @@ void func_80C02570(EnBomjimb* this, PlayState* play) {
if (this->actor.xzDistToPlayer < 200.0f) {
this->unk_2D6 = BINANG_ROT180(this->actor.yawTowardsPlayer);
- func_80C0113C(this, 19, 2.0f);
+ EnBomjimb_ChangeAnim(this, ENBOMJIMB_ANIM_19, 2.0f);
this->actionFunc = func_80C0217C;
} else if ((player->stateFlags3 == PLAYER_STATE3_1000000) || (this->actor.xzDistToPlayer > 410.0f)) {
Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 1, 3000, 0);
@@ -639,8 +705,8 @@ void func_80C02570(EnBomjimb* this, PlayState* play) {
void func_80C0267C(EnBomjimb* this) {
func_80C012E0(this);
- func_80C0113C(this, 8, 1.0f);
- this->actor.speedXZ = 0.0f;
+ EnBomjimb_ChangeAnim(this, ENBOMJIMB_ANIM_8, 1.0f);
+ this->actor.speed = 0.0f;
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
this->unk_2AE = 40;
this->unk_2C2 = 0;
@@ -662,9 +728,9 @@ void func_80C02740(EnBomjimb* this, PlayState* play) {
Player* player = GET_PLAYER(play);
func_80C012E0(this);
- func_80C0113C(this, 21, 1.0f);
+ EnBomjimb_ChangeAnim(this, ENBOMJIMB_ANIM_21, 1.0f);
if ((player->transformation != PLAYER_FORM_DEKU) && (player->transformation != PLAYER_FORM_HUMAN)) {
- func_80C0113C(this, 17, 1.0f);
+ EnBomjimb_ChangeAnim(this, ENBOMJIMB_ANIM_17, 1.0f);
Message_StartTextbox(play, 0x72E, &this->actor);
player->stateFlags1 |= PLAYER_STATE1_10000000;
player->actor.freezeTimer = 3;
@@ -676,7 +742,7 @@ void func_80C02740(EnBomjimb* this, PlayState* play) {
if (((player->transformation == PLAYER_FORM_DEKU) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_73_10)) ||
((player->transformation == PLAYER_FORM_HUMAN) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_85_02))) {
- func_80C0113C(this, 17, 1.0f);
+ EnBomjimb_ChangeAnim(this, ENBOMJIMB_ANIM_17, 1.0f);
Message_StartTextbox(play, 0x72E, &this->actor);
player->stateFlags1 |= PLAYER_STATE1_10000000;
player->actor.freezeTimer = 3;
@@ -686,14 +752,15 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_SY_PIECE_OF_HEART);
+ Actor_PlaySfx(&this->actor, NA_SE_SY_PIECE_OF_HEART);
}
switch (this->unk_2C8) {
@@ -721,6 +788,9 @@ void func_80C02740(EnBomjimb* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_76_10);
SET_WEEKEVENTREG(WEEKEVENTREG_11_10);
break;
+
+ default:
+ break;
}
if (!Play_InCsMode(play)) {
@@ -737,31 +807,31 @@ void func_80C02A14(EnBomjimb* this, PlayState* play) {
Player* player = GET_PLAYER(play);
f32 curFrame = this->skelAnime.curFrame;
- if (this->unk_2DC == 21) {
+ if (this->animIndex == ENBOMJIMB_ANIM_21) {
player->actor.freezeTimer = 3;
- if (this->unk_2B8 <= curFrame) {
- func_80C0113C(this, 9, 1.0f);
+ if (curFrame >= this->animEndFrame) {
+ EnBomjimb_ChangeAnim(this, ENBOMJIMB_ANIM_9, 1.0f);
}
return;
}
- if ((this->unk_2CA == 8) && (this->unk_2DC == 9)) {
+ if ((this->unk_2CA == 8) && (this->animIndex == ENBOMJIMB_ANIM_9)) {
player->actor.freezeTimer = 3;
if (this->unk_2E0 == 0) {
if (Animation_OnFrame(&this->skelAnime, 7.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_HUMAN_BOUND);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_HUMAN_BOUND);
this->unk_2E0 = 1;
}
}
}
- if ((this->unk_2DC == 15) && (this->unk_2CA == 8)) {
+ if ((this->animIndex == ENBOMJIMB_ANIM_15) && (this->unk_2CA == 8)) {
player->actor.freezeTimer = 3;
}
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
- if ((this->unk_2CA == 8) && (gSaveContext.save.bombersCaughtNum >= 5)) {
+ Message_CloseTextbox(play);
+ if ((this->unk_2CA == 8) && (gSaveContext.save.saveInfo.bombersCaughtNum >= 5)) {
func_80C02CA4(this, play);
} else {
if (this->unk_2CA == 8) {
@@ -779,7 +849,7 @@ void func_80C02BCC(EnBomjimb* this, PlayState* play) {
if (this->unk_2C0 == 0) {
player->actor.freezeTimer = 3;
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->unk_2C0 = 1;
player->stateFlags1 &= ~PLAYER_STATE1_10000000;
}
@@ -840,7 +910,7 @@ void EnBomjimb_Update(Actor* thisx, PlayState* play2) {
if (this->unk_2CA == 0) {
if ((this->unk_2E4 != NULL) && (this->unk_2E4->update != NULL)) {
Math_Vec3f_Copy(&this->unk_2E4->world.pos, &this->actor.world.pos);
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->unk_2E4->world.pos.y = this->actor.world.pos.y + 35.0f;
} else {
this->unk_2E4->world.pos.y = this->actor.world.pos.y + 25.0f;
@@ -858,7 +928,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);
@@ -870,20 +942,20 @@ void EnBomjimb_Update(Actor* thisx, PlayState* play2) {
s32 EnBomjimb_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnBomjimb* this = THIS;
- if (limbIndex == 15) {
+ if (limbIndex == OBJECT_CS_LIMB_0F) {
*dList = NULL;
}
- if (limbIndex == 17) {
+ if (limbIndex == OBJECT_CS_LIMB_11) {
rot->x += this->unk_28A;
rot->z += this->unk_288;
}
- if ((limbIndex == 19) && (this->unk_2C8 != ENBOMJIMB_F_0)) {
+ if ((limbIndex == OBJECT_CS_LIMB_13) && (this->unk_2C8 != ENBOMJIMB_F_0)) {
*dList = NULL;
}
- if ((limbIndex == 20) && (this->unk_2C8 == ENBOMJIMB_F_0)) {
+ if ((limbIndex == OBJECT_CS_LIMB_14) && (this->unk_2C8 == ENBOMJIMB_F_0)) {
*dList = NULL;
}
@@ -909,8 +981,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..9e2bb9cc5 100644
--- a/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.h
+++ b/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.h
@@ -2,6 +2,7 @@
#define Z_EN_BOMJIMB_H
#include "global.h"
+#include "objects/object_cs/object_cs.h"
struct EnBomjimb;
@@ -11,25 +12,25 @@ 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;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[21];
- /* 0x206 */ Vec3s morphTable[21];
+ /* 0x188 */ Vec3s jointTable[OBJECT_CS_LIMB_MAX];
+ /* 0x206 */ Vec3s morphTable[OBJECT_CS_LIMB_MAX];
/* 0x284 */ EnBomjimbActionFunc actionFunc;
/* 0x288 */ s16 unk_288;
/* 0x28A */ s16 unk_28A;
@@ -42,7 +43,7 @@ typedef struct EnBomjimb {
/* 0x2B0 */ s16 unk_2B0;
/* 0x2B2 */ s16 unk_2B2;
/* 0x2B4 */ f32 unk_2B4;
- /* 0x2B8 */ f32 unk_2B8;
+ /* 0x2B8 */ f32 animEndFrame;
/* 0x2BC */ UNK_TYPE1 unk2BC[4];
/* 0x2C0 */ s16 unk_2C0;
/* 0x2C2 */ s16 unk_2C2;
@@ -55,7 +56,7 @@ typedef struct EnBomjimb {
/* 0x2D4 */ s16 unk_2D4;
/* 0x2D6 */ s16 unk_2D6;
/* 0x2D8 */ UNK_TYPE1 unk2D8[4];
- /* 0x2DC */ s32 unk_2DC;
+ /* 0x2DC */ s32 animIndex;
/* 0x2E0 */ u8 unk_2E0;
/* 0x2E4 */ Actor* unk_2E4;
/* 0x2E8 */ ColliderCylinder collider;
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 33af85b3e..c89179e8b 100644
--- a/src/overlays/actors/ovl_En_Boom/z_en_boom.c
+++ b/src/overlays/actors/ovl_En_Boom/z_en_boom.c
@@ -52,7 +52,7 @@ static ColliderQuadInit sQuadInit = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(targetMode, 5, ICHAIN_CONTINUE),
+ ICHAIN_S8(targetMode, TARGET_MODE_5, ICHAIN_CONTINUE),
ICHAIN_VEC3S(shape.rot, 0, ICHAIN_STOP),
};
@@ -63,22 +63,23 @@ void EnBoom_SetupAction(EnBoom* this, EnBoomActionFunc actionFunc) {
void func_808A24DC(EnBoom* this, PlayState* play) {
WaterBox* sp54;
f32 sp50 = this->actor.world.pos.y;
- u16 sp4E = this->actor.bgCheckFlags & 0x20;
+ u16 sp4E = this->actor.bgCheckFlags & BGCHECKFLAG_WATER;
if (WaterBox_GetSurface1(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z, &sp50, &sp54) &&
(this->actor.world.pos.y < sp50)) {
Vec3f sp40;
- this->actor.bgCheckFlags |= 0x20;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_WATER;
sp40.x = this->actor.world.pos.x;
sp40.y = this->actor.world.pos.y - 20.0f;
sp40.z = this->actor.world.pos.z;
EffectSsBubble_Spawn(play, &sp40, 20.0f, 10.0f, 20.0f, 0.13f);
} else {
- this->actor.bgCheckFlags &= ~0x20;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_WATER;
}
- if ((this->actor.bgCheckFlags & 0x40) && ((this->actor.bgCheckFlags & 0x20) != sp4E)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) &&
+ ((this->actor.bgCheckFlags & BGCHECKFLAG_WATER) != sp4E)) {
Vec3f sp34;
Math_Vec3f_Diff(&this->actor.world.pos, &this->actor.prevPos, &sp34);
@@ -95,14 +96,14 @@ void func_808A24DC(EnBoom* this, PlayState* play) {
EffectSsGSplash_Spawn(play, &sp34, NULL, NULL, 0, 300);
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_DIVE_INTO_WATER_L);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_DIVE_INTO_WATER_L);
EffectSsGRipple_Spawn(play, &sp34, 100, 500, 0);
EffectSsGRipple_Spawn(play, &sp34, 100, 500, 4);
EffectSsGRipple_Spawn(play, &sp34, 100, 500, 8);
}
- this->actor.bgCheckFlags |= 0x40;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_WATER_TOUCH;
}
void EnBoom_Init(Actor* thisx, PlayState* play) {
@@ -163,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;
@@ -174,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_YawToPoint(&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_PitchToPoint(&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--;
@@ -201,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);
@@ -211,7 +213,7 @@ void func_808A2918(EnBoom* this, PlayState* play) {
Actor_SetSpeeds(&this->actor, 12.0f);
Actor_MoveWithGravity(&this->actor);
func_808A24DC(this, play);
- func_800B9010(&this->actor, NA_SE_IT_BOOMERANG_FLY - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_IT_BOOMERANG_FLY - SFX_FLAG);
if ((this->collider.base.atFlags & AT_HIT) && (((this->collider.base.at->id == ACTOR_EN_ITEM00) &&
(this->collider.base.at->params != ITEM00_HEART_CONTAINER) &&
@@ -241,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;
}
}
@@ -249,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 &= ~3;
+ 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);
}
}
}
@@ -297,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++;
@@ -309,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 } },
@@ -325,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);
@@ -334,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 33dd4f69f..8157d09c6 100644
--- a/src/overlays/actors/ovl_En_Box/z_en_box.c
+++ b/src/overlays/actors/ovl_En_Box/z_en_box.c
@@ -69,18 +69,7 @@ ActorInit En_Box_InitVars = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_U8(targetMode, 0, ICHAIN_STOP),
-};
-
-typedef struct {
- f32 data[5];
-} EnBox_PlaybackSpeed; // 0x14
-
-static EnBox_PlaybackSpeed sPlaybackSpeed = { { 1.5f, 1.0f, 1.5f, 1.0f, 1.5f } };
-
-static AnimationHeader* sBigChestAnimations[5] = {
- &gBoxBigChestOpenAdultAnim, &gBoxBigChestOpenGoronAnim, &gBoxBigChestOpenAdultAnim,
- &gBoxBigChestOpenDekuAnim, &gBoxBigChestOpenChildAnim,
+ ICHAIN_U8(targetMode, TARGET_MODE_0, ICHAIN_STOP),
};
void EnBox_SetupAction(EnBox* this, EnBoxActionFunc func) {
@@ -122,6 +111,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 +133,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,14 +178,14 @@ 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;
+ f32 startFrame;
+ f32 endFrame;
colHeader = NULL;
- animFrame = 0.0f;
- animFrameEnd = Animation_GetLastFrame(&gBoxChestOpenAnim);
+ startFrame = 0.0f;
+ endFrame = Animation_GetLastFrame(&gBoxChestOpenAnim);
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
DynaPolyActor_Init(&this->dyna, 0);
CollisionHeader_GetVirtual(&gBoxChestCol, &colHeader);
@@ -213,7 +204,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;
}
@@ -225,10 +216,10 @@ void EnBox_Init(Actor* thisx, PlayState* play) {
this->iceSmokeTimer = 100;
EnBox_SetupAction(this, EnBox_Open);
this->movementFlags |= ENBOX_MOVE_STICK_TO_GROUND;
- animFrame = animFrameEnd;
+ startFrame = endFrame;
} 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 +231,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 +245,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 {
@@ -265,7 +256,7 @@ void EnBox_Init(Actor* thisx, PlayState* play) {
this->dyna.actor.flags |= ACTOR_FLAG_10;
} else {
if ((this->type == ENBOX_TYPE_BIG_INVISIBLE) || (this->type == ENBOX_TYPE_SMALL_INVISIBLE)) {
- this->dyna.actor.flags |= ACTOR_FLAG_80;
+ this->dyna.actor.flags |= ACTOR_FLAG_REACT_TO_LENS;
}
EnBox_SetupAction(this, EnBox_WaitOpen);
this->movementFlags |= ENBOX_MOVE_IMMOBILE;
@@ -281,7 +272,7 @@ void EnBox_Init(Actor* thisx, PlayState* play) {
SkelAnime_Init(play, &this->skelAnime, &gBoxChestSkel, &gBoxChestOpenAnim, this->jointTable, this->morphTable,
OBJECT_BOX_CHEST_LIMB_MAX);
- Animation_Change(&this->skelAnime, &gBoxChestOpenAnim, 1.5f, animFrame, animFrameEnd, ANIMMODE_ONCE, 0.0f);
+ Animation_Change(&this->skelAnime, &gBoxChestOpenAnim, 1.5f, startFrame, endFrame, ANIMMODE_ONCE, 0.0f);
if (Actor_IsSmallChest(this)) {
Actor_SetScale(&this->dyna.actor, 0.0075f);
Actor_SetFocus(&this->dyna.actor, 20.0f);
@@ -290,17 +281,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);
}
@@ -345,7 +336,7 @@ void EnBox_Fall(EnBox* this, PlayState* play) {
this->alpha = 255;
this->movementFlags &= ~ENBOX_MOVE_IMMOBILE;
- if (this->dyna.actor.bgCheckFlags & 1) {
+ if (this->dyna.actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->movementFlags |= ENBOX_MOVE_UNUSED;
if (this->movementFlags & ENBOX_MOVE_FALL_ANGLE_SIDE) {
this->movementFlags &= ~ENBOX_MOVE_FALL_ANGLE_SIDE;
@@ -362,7 +353,7 @@ void EnBox_Fall(EnBox* this, PlayState* play) {
this->dyna.actor.world.pos.y = this->dyna.actor.floorHeight;
EnBox_SetupAction(this, EnBox_WaitOpen);
}
- Audio_PlaySfxAtPos(&this->dyna.actor.projectedPos, NA_SE_EV_TRE_BOX_BOUND);
+ Audio_PlaySfx_AtPos(&this->dyna.actor.projectedPos, NA_SE_EV_TRE_BOX_BOUND);
EnBox_SpawnDust(this, play);
}
yDiff = this->dyna.actor.world.pos.y - this->dyna.actor.floorHeight;
@@ -374,10 +365,10 @@ void EnBox_Fall(EnBox* this, PlayState* play) {
}
void EnBox_FallOnSwitchFlag(EnBox* this, PlayState* play) {
- func_800B8C50(&this->dyna.actor, 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)) {
@@ -386,43 +377,43 @@ void EnBox_FallOnSwitchFlag(EnBox* this, PlayState* play) {
}
void EnBox_AppearSwitchFlag(EnBox* this, PlayState* play) {
- func_800B8C50(&this->dyna.actor, 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);
}
}
}
void EnBox_AppearOnRoomClear(EnBox* this, PlayState* play) {
- func_800B8C50(&this->dyna.actor, 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);
- Audio_PlaySfxAtPos(&this->dyna.actor.projectedPos, NA_SE_EV_TRE_BOX_APPEAR);
+ Audio_PlaySfx_AtPos(&this->dyna.actor.projectedPos, NA_SE_EV_TRE_BOX_APPEAR);
}
}
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 +423,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 != CS_ID_NONE) && (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,37 +436,45 @@ 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);
}
}
void EnBox_WaitOpen(EnBox* this, PlayState* play) {
+ static AnimationHeader* sBigChestAnimations[PLAYER_FORM_MAX] = {
+ &gBoxBigChestOpenAdultAnim, // PLAYER_FORM_FIERCE_DEITY
+ &gBoxBigChestOpenGoronAnim, // PLAYER_FORM_GORON
+ &gBoxBigChestOpenAdultAnim, // PLAYER_FORM_ZORA
+ &gBoxBigChestOpenDekuAnim, // PLAYER_FORM_DEKU
+ &gBoxBigChestOpenChildAnim, // PLAYER_FORM_HUMAN
+ };
s32 pad;
- AnimationHeader* animHeader;
- f32 frameCount;
- f32 playbackSpeed;
- EnBox_PlaybackSpeed playbackSpeedTable;
- Player* player;
- Vec3f offset;
+ AnimationHeader* anim;
+ f32 endFrame;
+ f32 playSpeed;
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;
+ anim = &gBoxChestOpenAnim;
+ playSpeed = 1.5f;
} else {
- u8 playerForm;
+ f32 sPlaybackSpeeds[PLAYER_FORM_MAX] = {
+ 1.5f, // PLAYER_FORM_FIERCE_DEITY
+ 1.0f, // PLAYER_FORM_GORON
+ 1.5f, // PLAYER_FORM_ZORA
+ 1.0f, // PLAYER_FORM_DEKU
+ 1.5f, // PLAYER_FORM_HUMAN
+ };
- playbackSpeedTable = sPlaybackSpeed;
- playerForm = gSaveContext.save.playerForm;
- animHeader = sBigChestAnimations[playerForm];
- playbackSpeed = playbackSpeedTable.data[playerForm];
+ anim = sBigChestAnimations[GET_PLAYER_FORM];
+ playSpeed = sPlaybackSpeeds[GET_PLAYER_FORM];
}
- frameCount = Animation_GetLastFrame(animHeader);
- Animation_Change(&this->skelAnime, animHeader, playbackSpeed, 0.0f, frameCount, ANIMMODE_ONCE, 0.0f);
+ endFrame = Animation_GetLastFrame(anim);
+ Animation_Change(&this->skelAnime, anim, playSpeed, 0.0f, endFrame, ANIMMODE_ONCE, 0.0f);
EnBox_SetupAction(this, EnBox_Open);
if (this->unk_1EC > 0) {
Actor_SpawnAsChild(&play->actorCtx, &this->dyna.actor, play, ACTOR_DEMO_TRE_LGT,
@@ -494,9 +493,11 @@ void EnBox_WaitOpen(EnBox* this, PlayState* play) {
Flags_SetTreasure(play, ENBOX_GET_CHEST_FLAG(&this->dyna.actor));
}
} else {
- player = GET_PLAYER(play);
+ Player* player = GET_PLAYER(play);
+ Vec3f offset;
+
Actor_OffsetOfPointInActorCoords(&this->dyna.actor, &offset, &player->actor.world.pos);
- if (offset.z > -50.0f && offset.z < 0.0f && fabsf(offset.y) < 10.0f && fabsf(offset.x) < 20.0f &&
+ if ((offset.z > -50.0f) && (offset.z < 0.0f) && (fabsf(offset.y) < 10.0f) && (fabsf(offset.x) < 20.0f) &&
Player_IsFacingActor(&this->dyna.actor, 0x3000, play)) {
if (((this->getItemId == GI_HEART_PIECE) || (this->getItemId == GI_BOTTLE)) &&
Flags_GetCollectible(play, this->collectableFlag)) {
@@ -508,7 +509,7 @@ void EnBox_WaitOpen(EnBox* this, PlayState* play) {
if ((this->getItemId == GI_MASK_GIANT) && (INV_CONTENT(ITEM_MASK_GIANT) == ITEM_MASK_GIANT)) {
this->getItemId = GI_RECOVERY_HEART;
}
- Actor_PickUpNearby(&this->dyna.actor, play, -this->getItemId);
+ Actor_OfferGetItemNearby(&this->dyna.actor, play, -this->getItemId);
}
if (Flags_GetTreasure(play, ENBOX_GET_CHEST_FLAG(&this->dyna.actor))) {
EnBox_SetupAction(this, EnBox_Open);
@@ -519,7 +520,7 @@ void EnBox_WaitOpen(EnBox* this, PlayState* play) {
void EnBox_Open(EnBox* this, PlayState* play) {
s32 pad;
- this->dyna.actor.flags &= ~ACTOR_FLAG_80;
+ this->dyna.actor.flags &= ~ACTOR_FLAG_REACT_TO_LENS;
if (SkelAnime_Update(&this->skelAnime)) {
if (this->unk_1EC > 0) {
@@ -538,7 +539,8 @@ void EnBox_Open(EnBox* this, PlayState* play) {
Actor_SpawnAsChild(&play->actorCtx, &this->dyna.actor, play, ACTOR_EN_ELFORG, this->dyna.actor.world.pos.x,
this->dyna.actor.world.pos.y, this->dyna.actor.world.pos.z, this->dyna.actor.world.rot.x,
this->dyna.actor.world.rot.y, this->dyna.actor.world.rot.z,
- STRAY_FAIRY_PARAMS(ENBOX_GET_CHEST_FLAG(&this->dyna.actor), 0, STRAY_FAIRY_TYPE_CHEST));
+ STRAY_FAIRY_PARAMS(ENBOX_GET_CHEST_FLAG(&this->dyna.actor), STRAY_FAIRY_AREA_CLOCK_TOWN,
+ STRAY_FAIRY_TYPE_CHEST));
} else if (this->movementFlags & ENBOX_MOVE_0x40) {
this->movementFlags &= ~ENBOX_MOVE_0x40;
}
@@ -548,17 +550,16 @@ void EnBox_Open(EnBox* this, PlayState* play) {
s32 bgId;
u16 sfxId = 0;
- if (Animation_OnFrame(&this->skelAnime, gSaveContext.save.playerForm == PLAYER_FORM_DEKU ? 14.0f : 30.0f)) {
+ if (Animation_OnFrame(&this->skelAnime, GET_PLAYER_FORM == PLAYER_FORM_DEKU ? 14.0f : 30.0f)) {
sfxId = NA_SE_EV_TBOX_UNLOCK;
- } else if (Animation_OnFrame(&this->skelAnime,
- gSaveContext.save.playerForm == PLAYER_FORM_DEKU ? 15.0f : 90.0f)) {
+ } else if (Animation_OnFrame(&this->skelAnime, GET_PLAYER_FORM == PLAYER_FORM_DEKU ? 15.0f : 90.0f)) {
sfxId = NA_SE_EV_TBOX_OPEN;
}
- if (sfxId != 0) {
- Audio_PlaySfxAtPos(&this->dyna.actor.projectedPos, sfxId);
+ if (sfxId != NA_SE_NONE) {
+ Audio_PlaySfx_AtPos(&this->dyna.actor.projectedPos, sfxId);
}
- if (this->skelAnime.jointTable[3].z > 0) {
- this->unk_1A8 = (0x7D00 - this->skelAnime.jointTable[3].z) * 0.00006f;
+ if (this->skelAnime.jointTable[OBJECT_BOX_CHEST_LIMB_03].z > 0) {
+ this->unk_1A8 = (0x7D00 - this->skelAnime.jointTable[OBJECT_BOX_CHEST_LIMB_03].z) * 0.00006f;
if (this->unk_1A8 < 0.0f) {
this->unk_1A8 = 0.0f;
} else if (this->unk_1A8 > 1.0f) {
@@ -581,7 +582,7 @@ void EnBox_SpawnIceSmoke(EnBox* this, PlayState* play) {
this->iceSmokeTimer++;
//! @bug sfxId should be NA_SE_EN_MIMICK_BREATH, but uses OoT's sfxId value
- func_800B9010(&this->dyna.actor, NA_SE_EN_LAST3_COIL_ATTACK_OLD - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EN_LAST3_COIL_ATTACK_OLD - SFX_FLAG);
if (Rand_ZeroOne() < 0.3f) {
randomf = 2.0f * Rand_ZeroOne() - 1.0f;
pos = this->dyna.actor.world.pos;
@@ -612,7 +613,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,22 +695,23 @@ 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);
}
if (((this->alpha == 255) && (this->type != ENBOX_TYPE_BIG_INVISIBLE) &&
(this->type != ENBOX_TYPE_SMALL_INVISIBLE)) ||
- (!CHECK_FLAG_ALL(this->dyna.actor.flags, ACTOR_FLAG_80) &&
+ (!CHECK_FLAG_ALL(this->dyna.actor.flags, ACTOR_FLAG_REACT_TO_LENS) &&
((this->type == ENBOX_TYPE_BIG_INVISIBLE) || (this->type == ENBOX_TYPE_SMALL_INVISIBLE)))) {
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 +721,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_Bsb/z_en_bsb.c b/src/overlays/actors/ovl_En_Bsb/z_en_bsb.c
index 6c6e832c8..cdcf0879f 100644
--- a/src/overlays/actors/ovl_En_Bsb/z_en_bsb.c
+++ b/src/overlays/actors/ovl_En_Bsb/z_en_bsb.c
@@ -8,7 +8,7 @@
#include "z64rumble.h"
#include "z64shrink_window.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_2000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_2000000)
#define THIS ((EnBsb*)thisx)
diff --git a/src/overlays/actors/ovl_En_Bu/z_en_bu.c b/src/overlays/actors/ovl_En_Bu/z_en_bu.c
index 043f1ebb7..ad26cf99d 100644
--- a/src/overlays/actors/ovl_En_Bu/z_en_bu.c
+++ b/src/overlays/actors/ovl_En_Bu/z_en_bu.c
@@ -6,7 +6,7 @@
#include "z_en_bu.h"
-#define FLAGS (ACTOR_FLAG_1)
+#define FLAGS (ACTOR_FLAG_TARGETABLE)
#define THIS ((EnBu*)thisx)
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 cbf9e9f3c..7453c6d79 100644
--- a/src/overlays/actors/ovl_En_Bubble/z_en_bubble.c
+++ b/src/overlays/actors/ovl_En_Bubble/z_en_bubble.c
@@ -6,7 +6,7 @@
#include "z_en_bubble.h"
-#define FLAGS (ACTOR_FLAG_1)
+#define FLAGS (ACTOR_FLAG_TARGETABLE)
#define THIS ((EnBubble*)thisx)
@@ -77,7 +77,7 @@ void EnBubble_SetDimensions(EnBubble* this, f32 dim) {
f32 z;
f32 norm;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
Actor_SetScale(&this->actor, 1.0f);
this->actor.shape.yOffset = 16.0f;
this->modelRotSpeed = 16.0f;
@@ -144,7 +144,7 @@ s32 EnBubble_Explosion(EnBubble* this, PlayState* play) {
&sEffectEnvColor, Rand_S16Offset(100, 50), 25, 0);
}
Item_DropCollectibleRandom(play, NULL, &this->actor.world.pos, 0x50);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
return Rand_S16Offset(90, 60);
}
@@ -247,10 +247,10 @@ void EnBubble_Fly(EnBubble* this, PlayState* play) {
this->velocityFromBounce.y = this->bounceDirection.y * bounceSpeed;
this->velocityFromBounce.z = this->bounceDirection.z * bounceSpeed;
this->yVelocity = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_AWA_BOUND);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_AWA_BOUND);
this->modelRotSpeed = 128.0f;
this->modelEllipticity = 0.48f;
- } else if ((this->actor.bgCheckFlags & 0x20) && (bounceDirection.y < 0.0f)) {
+ } else if ((this->actor.bgCheckFlags & BGCHECKFLAG_WATER) && (bounceDirection.y < 0.0f)) {
normal.x = normal.z = 0.0f;
normal.y = 1.0f;
EnBubble_Vec3fNormalizedReflect(&bounceDirection, &normal, &bounceDirection);
@@ -266,7 +266,7 @@ void EnBubble_Fly(EnBubble* this, PlayState* play) {
this->velocityFromBounce.y = (this->bounceDirection.y * bounceSpeed);
this->velocityFromBounce.z = (this->bounceDirection.z * bounceSpeed);
this->yVelocity = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_AWA_BOUND);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_AWA_BOUND);
this->modelRotSpeed = 128.0f;
this->modelEllipticity = 0.48f;
}
@@ -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 eb3365b83..d27aaf679 100644
--- a/src/overlays/actors/ovl_En_Butte/z_en_butte.c
+++ b/src/overlays/actors/ovl_En_Butte/z_en_butte.c
@@ -5,6 +5,7 @@
*/
#include "z_en_butte.h"
+#include "overlays/actors/ovl_En_Elf/z_en_elf.h"
#include "objects/gameplay_field_keep/gameplay_field_keep.h"
#include "objects/gameplay_keep/gameplay_keep.h"
@@ -139,7 +140,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);
@@ -164,8 +165,8 @@ void EnButte_Init(Actor* thisx, PlayState* play) {
s32 pad;
EnButte* this = THIS;
- if (ENBUTTE_GET(&this->actor) == ENBUTTE_MINUS1) {
- this->actor.params = ENBUTTE_0;
+ if (BUTTERFLY_GET(&this->actor) == BUTTERFLY_MINUS1) {
+ this->actor.params = BUTTERFLY_0;
}
this->actor.world.rot.y = Rand_Next();
@@ -173,12 +174,12 @@ void EnButte_Init(Actor* thisx, PlayState* play) {
this->actor.shape.rot.y = this->actor.world.rot.y;
Actor_ProcessInitChain(&this->actor, sInitChain);
- if ((ENBUTTE_GET_1(&this->actor) & 0xFF) == ENBUTTE_1) {
+ if ((BUTTERFLY_GET_1(&this->actor) & 0xFF) == BUTTERFLY_1) {
this->actor.uncullZoneScale = 200.0f;
}
SkelAnime_Init(play, &this->skelAnime, &gameplay_field_keep_Skel_002FA0, &gameplay_field_keep_Anim_001D20,
- this->jointTable, this->morphTable, 8);
+ this->jointTable, this->morphTable, BUTTERFLY_LIMB_MAX);
Collider_InitJntSph(play, &this->collider);
Collider_SetJntSph(play, &this->collider, &this->actor, &sJntSphInit, this->colldierElements);
@@ -241,7 +242,7 @@ void func_8091C794(EnButte* this, PlayState* play) {
s16 yaw;
func_8091C524(this);
- Math_SmoothStepToF(&this->actor.speedXZ, sp4C->unk_04, sp4C->unk_08, sp4C->unk_0C, 0.0f);
+ Math_SmoothStepToF(&this->actor.speed, sp4C->unk_04, sp4C->unk_08, sp4C->unk_0C, 0.0f);
if (this->unk_24F == 1) {
distSq = SQ(100.0f);
@@ -276,9 +277,8 @@ void func_8091C794(EnButte* this, PlayState* play) {
func_8091C6B4(this);
- playSpeed =
- (((this->actor.speedXZ * 0.5f) + (Rand_ZeroOne() * 0.2f)) + ((1.0f - Math_SinS(this->unk_258)) * 0.15f)) +
- ((1.0f - Math_SinS(this->unk_256)) * 0.3f) + sp38;
+ playSpeed = (((this->actor.speed * 0.5f) + (Rand_ZeroOne() * 0.2f)) + ((1.0f - Math_SinS(this->unk_258)) * 0.15f)) +
+ ((1.0f - Math_SinS(this->unk_256)) * 0.3f) + sp38;
this->skelAnime.playSpeed = CLAMP(playSpeed, 0.2f, 1.5f);
SkelAnime_Update(&this->skelAnime);
@@ -287,7 +287,7 @@ void func_8091C794(EnButte* this, PlayState* play) {
func_8091C0A0(this, &D_8091D324[this->unk_24E]);
}
- if ((ENBUTTE_GET_1(&this->actor) == ENBUTTE_1) && (player->heldItemAction == PLAYER_IA_STICK) &&
+ if ((BUTTERFLY_GET_1(&this->actor) == BUTTERFLY_1) && (player->heldItemAction == PLAYER_IA_DEKU_STICK) &&
(this->unk_252 <= 0) &&
((Math3D_XZDistanceSquared(player->actor.world.pos.x, player->actor.world.pos.z, this->actor.home.pos.x,
this->actor.home.pos.z) < SQ(120.0f)) ||
@@ -318,7 +318,7 @@ void func_8091CBB4(EnButte* this, PlayState* play) {
s16 yaw;
func_8091C5EC(this);
- Math_SmoothStepToF(&this->actor.speedXZ, sp5C->unk_04, sp5C->unk_08, sp5C->unk_0C, 0.0f);
+ Math_SmoothStepToF(&this->actor.speed, sp5C->unk_04, sp5C->unk_08, sp5C->unk_0C, 0.0f);
sp40 = 0.0f;
if ((this->unk_24E != 0) && (this->unk_24C < 12)) {
@@ -344,7 +344,7 @@ void func_8091CBB4(EnButte* this, PlayState* play) {
func_8091C6B4(this);
- playSpeed = ((this->actor.speedXZ * 0.5f) + (Rand_ZeroOne() * 0.2f) + ((1.0f - Math_SinS(this->unk_258)) * 0.15f)) +
+ playSpeed = ((this->actor.speed * 0.5f) + (Rand_ZeroOne() * 0.2f) + ((1.0f - Math_SinS(this->unk_258)) * 0.15f)) +
((1.0f - Math_SinS(this->unk_256)) * 0.3f) + sp40;
this->skelAnime.playSpeed = CLAMP(playSpeed, 0.2f, 1.5f);
SkelAnime_Update(&this->skelAnime);
@@ -356,8 +356,8 @@ void func_8091CBB4(EnButte* this, PlayState* play) {
distSq = Math3D_XZDistanceSquared(this->actor.world.pos.x, this->actor.world.pos.z, this->actor.home.pos.x,
this->actor.home.pos.z);
- if ((player->heldItemAction != PLAYER_IA_STICK) || !(fabsf(player->actor.speedXZ) < 1.8f) || (this->unk_252 > 0) ||
- !(distSq < SQ(320.0f))) {
+ if ((player->heldItemAction != PLAYER_IA_DEKU_STICK) || !(fabsf(player->actor.speed) < 1.8f) ||
+ (this->unk_252 > 0) || !(distSq < SQ(320.0f))) {
func_8091C748(this);
} else if ((distSq > SQ(240.0f)) &&
(Math3D_XZDistanceSquared(player->meleeWeaponInfo[0].tip.x, player->meleeWeaponInfo[0].tip.z,
@@ -382,7 +382,7 @@ void func_8091CFB4(EnButte* this, PlayState* play) {
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 60, NA_SE_EV_BUTTERFRY_TO_FAIRY);
} else if (this->unk_24C == 4) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELF, this->actor.focus.pos.x, this->actor.focus.pos.y,
- this->actor.focus.pos.z, 0, this->actor.shape.rot.y, 0, 2);
+ this->actor.focus.pos.z, 0, this->actor.shape.rot.y, 0, FAIRY_PARAMS(FAIRY_TYPE_2, false, 0));
this->unk_250 = 0;
} else if (this->unk_24C <= 0) {
func_8091D070(this);
@@ -416,8 +416,8 @@ void EnButte_Update(Actor* thisx, PlayState* play) {
this->unk_256 += 0x1000;
this->unk_258 += 0x600;
- if (ENBUTTE_GET_1(&this->actor) == ENBUTTE_1) {
- if (GET_PLAYER(play)->meleeWeaponState == 0) {
+ if (BUTTERFLY_GET_1(&this->actor) == BUTTERFLY_1) {
+ if (GET_PLAYER(play)->meleeWeaponState == PLAYER_MELEE_WEAPON_STATE_0) {
if (this->unk_252 > 0) {
this->unk_252--;
}
@@ -447,11 +447,11 @@ 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);
}
- if ((ENBUTTE_GET_1(&this->actor) == ENBUTTE_1) && (this->actionFunc == func_8091CFB4)) {
+ if ((BUTTERFLY_GET_1(&this->actor) == BUTTERFLY_1) && (this->actionFunc == func_8091CFB4)) {
func_8091C178(this, play);
}
}
diff --git a/src/overlays/actors/ovl_En_Butte/z_en_butte.h b/src/overlays/actors/ovl_En_Butte/z_en_butte.h
index 4bcaf440c..39c24a533 100644
--- a/src/overlays/actors/ovl_En_Butte/z_en_butte.h
+++ b/src/overlays/actors/ovl_En_Butte/z_en_butte.h
@@ -2,25 +2,28 @@
#define Z_EN_BUTTE_H
#include "global.h"
+#include "objects/gameplay_field_keep/gameplay_field_keep.h"
struct EnButte;
typedef void (*EnButteActionFunc)(struct EnButte*, PlayState*);
-#define ENBUTTE_GET(thisx) ((thisx)->params)
-#define ENBUTTE_GET_1(thisx) ((thisx)->params & 1)
+#define BUTTERFLY_GET(thisx) ((thisx)->params)
+#define BUTTERFLY_GET_1(thisx) ((thisx)->params & 1)
-#define ENBUTTE_MINUS1 -1
-#define ENBUTTE_0 0
-#define ENBUTTE_1 1
+#define BUTTERFLY_MINUS1 -1
+#define BUTTERFLY_0 0
+#define BUTTERFLY_1 1
+
+#define BUTTERFLY_PARAMS(param) (param)
typedef struct EnButte {
/* 0x000 */ Actor actor;
/* 0x144 */ ColliderJntSph collider;
/* 0x164 */ ColliderJntSphElement colldierElements[1];
/* 0x1A4 */ SkelAnime skelAnime;
- /* 0x1E8 */ Vec3s jointTable[8];
- /* 0x218 */ Vec3s morphTable[8];
+ /* 0x1E8 */ Vec3s jointTable[BUTTERFLY_LIMB_MAX];
+ /* 0x218 */ Vec3s morphTable[BUTTERFLY_LIMB_MAX];
/* 0x248 */ EnButteActionFunc actionFunc;
/* 0x24C */ s16 unk_24C;
/* 0x24E */ u8 unk_24E;
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 d32fe32ac..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,24 +72,24 @@ 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);
}
}
void EnCha_Idle(EnCha* this, PlayState* play) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_60_04)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_DOOR_BELL);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_DOOR_BELL);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_60_04);
this->actor.home.rot.z = 0x7D0;
}
if (this->collider.base.acFlags & AC_HIT) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_DOOR_BELL);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_DOOR_BELL);
this->actor.home.rot.z = 0x7D0;
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_51_04)) {
SET_WEEKEVENTREG(WEEKEVENTREG_51_04);
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 bfc828194..89e73c9a6 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
@@ -7,7 +7,7 @@
#include "z_en_clear_tag.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((EnClearTag*)thisx)
@@ -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);
@@ -422,7 +422,7 @@ void EnClearTag_Init(Actor* thisx, PlayState* play) {
Vec3f vel;
Vec3f accel;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
if (thisx->params >= 0) {
this->activeTimer = 70;
Math_Vec3f_Copy(&pos, &this->actor.world.pos);
@@ -435,7 +435,7 @@ void EnClearTag_Init(Actor* thisx, PlayState* play) {
if (thisx->params != CLEAR_TAG_SPLASH) {
// Initialize isolated light ray effect
- if (thisx->params == CLEAR_TAG_SMALL_LIGHT_RAYS || thisx->params == CLEAR_TAG_LARGE_LIGHT_RAYS) {
+ if ((thisx->params == CLEAR_TAG_SMALL_LIGHT_RAYS) || (thisx->params == CLEAR_TAG_LARGE_LIGHT_RAYS)) {
for (i = 0; i < 54; i++) {
lightRayMaxScale =
sLightRayMaxScale[thisx->params] + Rand_ZeroFloat(sLightRayMaxScale[thisx->params]);
@@ -463,12 +463,12 @@ 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);
// Is not underwater
- if (!(this->actor.bgCheckFlags & 0x20)) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_WATER)) {
if (thisx->params < 10) {
pos.y = this->actor.world.pos.y - 40.0f;
@@ -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;
@@ -549,14 +549,14 @@ void EnClearTag_UpdateCamera(EnClearTag* this, PlayState* play) {
player->actor.world.pos.z = -950.0f;
}
- player->actor.speedXZ = 0.0f;
+ player->actor.speed = 0.0f;
if (this->activeTimer == 0) {
this->cameraState = 1;
}
}
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);
@@ -570,7 +570,7 @@ void EnClearTag_UpdateCamera(EnClearTag* this, PlayState* play) {
this->subCamAt.z = mainCam->at.z;
Message_StartTextbox(play, 0xF, NULL);
this->cameraState = 2;
- func_8019FDC8(&gSfxDefaultPos, NA_SE_VO_NA_LISTEN, 0x20);
+ Audio_PlaySfx_AtPosWithReverb(&gSfxDefaultPos, NA_SE_VO_NA_LISTEN, 0x20);
case 2:
if (player->actor.world.pos.z > 0.0f) {
player->actor.world.pos.z = 290.0f;
@@ -578,15 +578,15 @@ void EnClearTag_UpdateCamera(EnClearTag* this, PlayState* play) {
player->actor.world.pos.z = -950.0f;
}
- player->actor.speedXZ = 0.0f;
+ player->actor.speed = 0.0f;
if (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE) {
mainCam = Play_GetCamera(play, CAM_ID_MAIN);
mainCam->eye = this->subCamEye;
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_Clear_Tag/z_en_clear_tag.h b/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h
index 677fcc698..9498e8e25 100644
--- a/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h
+++ b/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h
@@ -5,6 +5,18 @@
struct EnClearTag;
+#define CLEAR_TAG_PARAMS(type) (type)
+
+typedef enum {
+ /* 0x00 */ CLEAR_TAG_SMALL_EXPLOSION,
+ /* 0x01 */ CLEAR_TAG_LARGE_EXPLOSION,
+ /* 0x02 */ CLEAR_TAG_POP,
+ /* 0x03 */ CLEAR_TAG_SMALL_LIGHT_RAYS,
+ /* 0x04 */ CLEAR_TAG_LARGE_LIGHT_RAYS,
+ /* 0x23 */ CLEAR_TAG_SPLASH = 35,
+ /* 0xC8 */ CLEAR_TAG_SMOKE = 200
+} ClearTagType;
+
typedef struct EnClearTagEffect {
/* 0x00 */ u8 type;
/* 0x01 */ u8 actionTimer;
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..09d67ac24 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
@@ -7,7 +7,7 @@
#include "z_en_cne_01.h"
#include "objects/object_cne/object_cne.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnCne01*)thisx)
@@ -115,8 +115,7 @@ void EnCne01_UpdateModel(EnCne01* this, PlayState* play) {
Math_SmoothStepToS(&this->enHy.torsoRot.x, 0, 4, 0x3E8, 1);
Math_SmoothStepToS(&this->enHy.torsoRot.y, 0, 4, 0x3E8, 1);
}
- SubS_FillLimbRotTables(play, this->enHy.limbRotTableY, this->enHy.limbRotTableZ,
- ARRAY_COUNT(this->enHy.limbRotTableY));
+ SubS_UpdateFidgetTables(play, this->enHy.fidgetTableY, this->enHy.fidgetTableZ, ENHY_LIMB_MAX);
EnHy_UpdateCollider(&this->enHy, play);
}
@@ -142,17 +141,17 @@ s32 func_809CB4A0(EnCne01* this, PlayState* play) {
Actor_GetScreenPos(play, &this->enHy.actor, &x, &y);
//! @bug: Both x and y conditionals are always true, || should be an &&
if (!this->enHy.waitingOnInit && ((x >= 0) || (x < SCREEN_WIDTH)) && ((y >= 0) || (y < SCREEN_HEIGHT))) {
- func_800B85E0(&this->enHy.actor, play, 30.0f, PLAYER_IA_MAGIC_BEANS);
+ Actor_OfferTalkExchangeEquiCylinder(&this->enHy.actor, play, 30.0f, PLAYER_IA_MAGIC_BEANS);
}
return true;
}
void EnCne01_FinishInit(EnHy* this, PlayState* play) {
if (EnHy_Init(this, play, &gCneSkel, ENHY_ANIM_OS_ANIME_11)) {
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
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;
@@ -196,6 +195,9 @@ void EnCne01_Talk(EnHy* this, PlayState* play) {
this->actionFunc = this->prevActionFunc;
this->prevActionFunc = NULL;
break;
+
+ default:
+ break;
}
}
@@ -216,8 +218,8 @@ void EnCne01_Init(Actor* thisx, PlayState* play) {
Collider_InitCylinder(play, &this->enHy.collider);
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.actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ 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,27 +236,29 @@ 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);
}
s32 EnCne01_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnCne01* this = THIS;
- s8 bodyPart;
+ s8 bodyPartIndex;
Vec3f zeroVec = { 0.0f, 0.0f, 0.0f };
- bodyPart = gEnHyBodyParts[limbIndex];
- if (bodyPart >= 0) {
- Matrix_MultVec3f(&zeroVec, &this->enHy.bodyPartsPos[bodyPart]);
+ bodyPartIndex = gEnHyLimbToBodyParts[limbIndex];
+ if (bodyPartIndex > BODYPART_NONE) {
+ Matrix_MultVec3f(&zeroVec, &this->enHy.bodyPartsPos[bodyPartIndex]);
}
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);
+
+ gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[this->enHy.headObjIndex].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->enHy.headObjIndex].segment);
*dList = gCneHeadBrownHairDL;
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->enHy.skelLowerObjIndex].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->enHy.skelLowerObjIndex].segment);
+
CLOSE_DISPS(play->state.gfxCtx);
}
if (limbIndex == CNE_LIMB_HEAD) {
@@ -275,8 +279,8 @@ s32 EnCne01_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
if ((limbIndex == CNE_LIMB_TORSO) || (limbIndex == CNE_LIMB_LEFT_UPPER_ARM) ||
(limbIndex == CNE_LIMB_RIGHT_UPPER_ARM)) {
- rot->y += (s16)(Math_SinS(this->enHy.limbRotTableY[limbIndex]) * 200.0f);
- rot->z += (s16)(Math_CosS(this->enHy.limbRotTableZ[limbIndex]) * 200.0f);
+ rot->y += (s16)(Math_SinS(this->enHy.fidgetTableY[limbIndex]) * 200.0f);
+ rot->z += (s16)(Math_CosS(this->enHy.fidgetTableZ[limbIndex]) * 200.0f);
}
return false;
@@ -289,8 +293,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);
+
+ gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[this->enHy.skelUpperObjIndex].segment);
+ gSegments[0x06] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->enHy.skelUpperObjIndex].segment);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -310,7 +316,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));
@@ -324,8 +330,8 @@ void EnCne01_Draw(Actor* thisx, PlayState* play) {
*shadowTexIter++ = 0;
}
for (i = 0; i < 5; i++) {
- SubS_GenShadowTex(this->enHy.bodyPartsPos, &this->enHy.actor.world.pos, shadowTex, i / 5.0f,
- ARRAY_COUNT(this->enHy.bodyPartsPos), gEnHyShadowSizes, gEnHyParentBodyParts);
+ SubS_GenShadowTex(this->enHy.bodyPartsPos, &this->enHy.actor.world.pos, shadowTex, i / 5.0f, ENHY_BODYPART_MAX,
+ gEnHyShadowSizes, gEnHyParentShadowBodyParts);
}
SubS_DrawShadowTex(&this->enHy.actor, &play->state, shadowTex);
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 b3038dd60..0c10f72cd 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
@@ -6,6 +6,7 @@
#include "z_en_col_man.h"
#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "objects/gameplay_keep/gameplay_keep.h"
#define FLAGS (ACTOR_FLAG_100000)
@@ -59,14 +60,11 @@ ActorInit En_Col_Man_InitVars = {
(ActorFunc)NULL,
};
-static Color_RGBA8 primColor = { 60, 50, 20, 255 };
-static Color_RGBA8 envColor = { 40, 30, 30, 255 };
-
void EnColMan_Init(Actor* thisx, PlayState* play) {
EnColMan* this = THIS;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
- this->actor.targetMode = 1;
+ this->actor.targetMode = TARGET_MODE_1;
this->scale = (BREG(55) / 1000.0f) + 0.01f;
switch (this->actor.params) {
@@ -76,10 +74,12 @@ void EnColMan_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 10.0f);
func_80AFDD60(this);
break;
+
case EN_COL_MAN_FALLING_ROCK:
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 10.0f);
func_80AFDF60(this);
break;
+
case EN_COL_MAN_CUTSCENE_BOMB:
case EN_COL_MAN_GAMEPLAY_BOMB:
func_80AFE234(this);
@@ -114,13 +114,13 @@ void func_80AFDD60(EnColMan* this) {
}
void func_80AFDE00(EnColMan* this, PlayState* play) {
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
if (this->actor.params == EN_COL_MAN_HEART_PIECE) {
this->actor.params = EN_COL_MAN_RECOVERY_HEART;
- this->actor.speedXZ = 2.0f;
+ this->actor.speed = 2.0f;
this->actor.velocity.y = 8.0f;
} else {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
}
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_56_02)) {
@@ -131,9 +131,9 @@ void func_80AFDE00(EnColMan* this, PlayState* play) {
this->actor.draw = NULL;
this->actionFunc = EnColMan_SetHeartPieceCollectedAndKill;
} else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_56_02)) {
- Actor_PickUp(&this->actor, play, GI_HEART_PIECE, 40.0f, 40.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_HEART_PIECE, 40.0f, 40.0f);
} else {
- Actor_PickUp(&this->actor, play, GI_RECOVERY_HEART, 40.0f, 40.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_RECOVERY_HEART, 40.0f, 40.0f);
}
}
@@ -155,31 +155,33 @@ void func_80AFDF60(EnColMan* this) {
}
void func_80AFDFB4(EnColMan* this, PlayState* play) {
+ static Color_RGBA8 sPrimColor = { 60, 50, 20, 255 };
+ static Color_RGBA8 sEnvColor = { 40, 30, 30, 255 };
s32 i;
Vec3f velocity;
Vec3f accel;
this->scale = (BREG(55) / 10000.0f) + 0.0015f;
- if ((this->actor.bgCheckFlags & 1) && (this->actor.velocity.y < 0.0f)) {
+ 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.speedXZ = 2.0f + BREG(56) + Rand_ZeroFloat(2.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;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_ANSATSUSYA_ROCK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_ANSATSUSYA_ROCK);
return;
}
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;
- func_800B0EB0(play, &this->actor.world.pos, &velocity, &accel, &primColor, &envColor,
+ func_800B0EB0(play, &this->actor.world.pos, &velocity, &accel, &sPrimColor, &sEnvColor,
Rand_ZeroFloat(50.0f) + 60.0f, 30, Rand_ZeroFloat(5.0f) + 20.0f);
}
@@ -200,17 +202,18 @@ void func_80AFE25C(EnColMan* this, PlayState* play) {
if (this->actor.params == EN_COL_MAN_CUTSCENE_BOMB) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->actor.parent->world.pos.x,
this->actor.parent->world.pos.y, this->actor.parent->world.pos.z, 0, 0, 0,
- CLEAR_TAG_SMALL_EXPLOSION);
+ CLEAR_TAG_PARAMS(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;
}
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_BOMB_EXPLOSION);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_BOMB_EXPLOSION);
Actor_Kill(&this->actor);
}
}
@@ -222,7 +225,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 +236,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 4e9040d83..5a234c05e 100644
--- a/src/overlays/actors/ovl_En_Cow/z_en_cow.c
+++ b/src/overlays/actors/ovl_En_Cow/z_en_cow.c
@@ -5,8 +5,9 @@
*/
#include "z_en_cow.h"
+#include "z64horse.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnCow*)thisx)
@@ -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;
@@ -126,13 +127,14 @@ void EnCow_Init(Actor* thisx, PlayState* play) {
this->actor.world.pos.y, this->actor.world.pos.z, 0, this->actor.shape.rot.y, 0,
EN_COW_TYPE_TAIL);
- this->animationTimer = Rand_ZeroFloat(1000.0f) + 40.0f;
- this->animationCycle = 0;
- this->actor.targetMode = 6;
+ this->animTimer = Rand_ZeroFloat(1000.0f) + 40.0f;
+ this->animCycle = 0;
+ this->actor.targetMode = TARGET_MODE_6;
- D_801BDAA4 = 0;
+ gHorsePlayedEponasSong = false;
func_801A5080(4);
break;
+
case EN_COW_TYPE_TAIL:
SkelAnime_InitFlex(play, &this->skelAnime, &gCowTailSkel, NULL, this->jointTable, this->morphTable,
COW_TAIL_LIMB_MAX);
@@ -144,8 +146,11 @@ void EnCow_Init(Actor* thisx, PlayState* play) {
EnCow_SetTailPos(this);
- this->actor.flags &= ~ACTOR_FLAG_1;
- this->animationTimer = Rand_ZeroFloat(1000.0f) + 40.0f;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ this->animTimer = Rand_ZeroFloat(1000.0f) + 40.0f;
+ break;
+
+ default:
break;
}
@@ -166,10 +171,10 @@ void EnCow_Destroy(Actor* thisx, PlayState* play) {
}
void EnCow_UpdateAnimation(EnCow* this, PlayState* play) {
- if (this->animationTimer > 0) {
- this->animationTimer--;
+ if (this->animTimer > 0) {
+ this->animTimer--;
} else {
- this->animationTimer = Rand_ZeroFloat(500.0f) + 40.0f;
+ this->animTimer = Rand_ZeroFloat(500.0f) + 40.0f;
Animation_Change(&this->skelAnime, &gCowChewAnim, 1.0f, this->skelAnime.curFrame,
Animation_GetLastFrame(&gCowChewAnim), ANIMMODE_ONCE, 1.0f);
}
@@ -177,23 +182,23 @@ void EnCow_UpdateAnimation(EnCow* this, PlayState* play) {
if (!(this->flags & EN_COW_FLAG_PLAYER_HAS_APPROACHED)) {
this->flags |= EN_COW_FLAG_PLAYER_HAS_APPROACHED;
if (this->skelAnime.animation == &gCowChewAnim) {
- this->animationTimer = 0;
+ this->animTimer = 0;
}
}
}
- this->animationCycle++;
- if (this->animationCycle > 0x30) {
- this->animationCycle = 0;
+ this->animCycle++;
+ if (this->animCycle > 0x30) {
+ this->animCycle = 0;
}
- if (this->animationCycle < 0x20) {
- this->actor.scale.x = ((Math_SinS(this->animationCycle * 0x400) * (1.0f / 100.0f)) + 1.0f) * 0.01f;
+ if (this->animCycle < 0x20) {
+ this->actor.scale.x = ((Math_SinS(this->animCycle * 0x400) * (1.0f / 100.0f)) + 1.0f) * 0.01f;
} else {
this->actor.scale.x = 0.01f;
}
- if (this->animationCycle > 0x10) {
- this->actor.scale.y = ((Math_SinS((this->animationCycle * 0x400) - 0x4000) * (1.0f / 100.0f)) + 1.0f) * 0.01f;
+ if (this->animCycle > 0x10) {
+ this->actor.scale.y = ((Math_SinS((this->animCycle * 0x400) - 0x4000) * (1.0f / 100.0f)) + 1.0f) * 0.01f;
} else {
this->actor.scale.y = 0.01f;
}
@@ -202,7 +207,7 @@ void EnCow_UpdateAnimation(EnCow* this, PlayState* play) {
void EnCow_TalkEnd(EnCow* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
this->actor.flags &= ~ACTOR_FLAG_10000;
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = EnCow_Idle;
}
}
@@ -219,26 +224,26 @@ void EnCow_GiveMilkWait(EnCow* this, PlayState* play) {
this->actor.parent = NULL;
this->actionFunc = EnCow_GiveMilkEnd;
} else {
- Actor_PickUp(&this->actor, play, GI_MILK, 10000.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_MILK, 10000.0f, 100.0f);
}
}
void EnCow_GiveMilk(EnCow* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
this->actor.flags &= ~ACTOR_FLAG_10000;
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = EnCow_GiveMilkWait;
- Actor_PickUp(&this->actor, play, GI_MILK, 10000.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_MILK, 10000.0f, 100.0f);
}
}
void EnCow_CheckForEmptyBottle(EnCow* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
if (Inventory_HasEmptyBottle()) {
- func_80151938(play, 0x32C9); // Text to give milk.
+ Message_ContinueTextbox(play, 0x32C9); // Text to give milk.
this->actionFunc = EnCow_GiveMilk;
} else {
- func_80151938(play, 0x32CA); // Text if you don't have an empty bottle.
+ Message_ContinueTextbox(play, 0x32CA); // Text if you don't have an empty bottle.
this->actionFunc = EnCow_TalkEnd;
}
}
@@ -255,7 +260,7 @@ void EnCow_Talk(EnCow* this, PlayState* play) {
}
} else {
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8614(&this->actor, play, 170.0f);
+ Actor_OfferTalk(&this->actor, play, 170.0f);
this->actor.textId = 0x32C8; //! @bug textId is reset to this no matter the intial value
}
@@ -263,17 +268,17 @@ 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 ((play->msgCtx.ocarinaMode == OCARINA_MODE_NONE) || (play->msgCtx.ocarinaMode == OCARINA_MODE_END)) {
+ 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);
+ Actor_OfferTalk(&this->actor, play, 170.0f);
this->actor.textId = 0x32C8; // Text to give milk after playing Epona's Song.
EnCow_UpdateAnimation(this, play);
@@ -297,7 +302,7 @@ void EnCow_Idle(EnCow* this, PlayState* play) {
this->actor.textId = 0x32CA; // Text if you don't have an empty bottle.
}
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8614(&this->actor, play, 170.0f);
+ Actor_OfferTalk(&this->actor, play, 170.0f);
this->actionFunc = EnCow_Talk;
}
} else {
@@ -309,10 +314,10 @@ void EnCow_Idle(EnCow* this, PlayState* play) {
}
void EnCow_DoTail(EnCow* this, PlayState* play) {
- if (this->animationTimer > 0) {
- this->animationTimer--;
+ if (this->animTimer > 0) {
+ this->animTimer--;
} else {
- this->animationTimer = Rand_ZeroFloat(200.0f) + 40.0f;
+ this->animTimer = Rand_ZeroFloat(200.0f) + 40.0f;
Animation_Change(&this->skelAnime, &gCowTailIdleAnim, 1.0f, this->skelAnime.curFrame,
Animation_GetLastFrame(&gCowTailIdleAnim), ANIMMODE_ONCE, 1.0f);
}
@@ -322,7 +327,7 @@ void EnCow_DoTail(EnCow* this, PlayState* play) {
if (!(this->flags & EN_COW_FLAG_PLAYER_HAS_APPROACHED)) {
this->flags |= EN_COW_FLAG_PLAYER_HAS_APPROACHED;
if (this->skelAnime.animation == &gCowTailIdleAnim) {
- this->animationTimer = 0;
+ this->animTimer = 0;
}
}
}
@@ -340,11 +345,11 @@ 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) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_COW_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_COW_CRY);
Animation_Change(&this->skelAnime, &gCowMooAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gCowMooAnim),
ANIMMODE_ONCE, 1.0f);
} else {
@@ -421,7 +426,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 +434,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..b4a88a6fc 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;
@@ -27,8 +27,8 @@ typedef struct EnCow {
/* 0x0244 */ Vec3s morphTable[COW_LIMB_MAX];
/* 0x0268 */ Vec3s headTilt;
/* 0x026E */ u16 flags;
- /* 0x0270 */ u16 animationTimer;
- /* 0x0272 */ u16 animationCycle;
+ /* 0x0270 */ u16 animTimer;
+ /* 0x0272 */ u16 animCycle;
/* 0x0274 */ EnCowActionFunc actionFunc;
} EnCow; // size = 0x278
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 b9e1071fe..ca1f1db13 100644
--- a/src/overlays/actors/ovl_En_Crow/z_en_crow.c
+++ b/src/overlays/actors/ovl_En_Crow/z_en_crow.c
@@ -5,8 +5,9 @@
*/
#include "z_en_crow.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_1000 | ACTOR_FLAG_4000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_4000)
#define THIS ((EnCrow*)thisx)
@@ -74,7 +75,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 = {
@@ -129,7 +130,7 @@ void EnCrow_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->actor, sInitChain);
SkelAnime_InitFlex(play, &this->skelAnime, &gGuaySkel, &gGuayFlyAnim, this->jointTable, this->morphTable,
OBJECT_CROW_LIMB_MAX);
- Collider_InitAndSetJntSph(play, &this->collider, &this->actor, &sJntSphInit, this->colliderItems);
+ Collider_InitAndSetJntSph(play, &this->collider, &this->actor, &sJntSphInit, this->colliderElements);
this->collider.elements->dim.worldSphere.radius = sJntSphInit.elements[0].dim.modelSphere.radius;
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
ActorShape_Init(&this->actor.shape, 2000.0f, ActorShadow_DrawCircle, 20.0f);
@@ -137,7 +138,7 @@ void EnCrow_Init(Actor* thisx, PlayState* play) {
sDeadCount = 0;
if (this->actor.parent != NULL) {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
EnCrow_SetupFlyIdle(this);
}
@@ -158,41 +159,41 @@ void EnCrow_SetupFlyIdle(EnCrow* this) {
void EnCrow_FlyIdle(EnCrow* this, PlayState* play) {
Player* player = GET_PLAYER(play);
f32 dist;
- s32 onInitialAnimFrame;
+ s32 onAnimFirstFrame;
s16 yaw;
SkelAnime_Update(&this->skelAnime);
- onInitialAnimFrame = Animation_OnFrame(&this->skelAnime, 0.0f);
- this->actor.speedXZ = (Rand_ZeroOne() * 1.5f) + 3.0f;
+ onAnimFirstFrame = Animation_OnFrame(&this->skelAnime, 0.0f);
+ this->actor.speed = (Rand_ZeroOne() * 1.5f) + 3.0f;
if ((this->actor.parent != NULL) && (this->actor.parent->home.rot.z == 0)) {
this->actor.home.pos.x = this->actor.parent->world.pos.x;
this->actor.home.pos.z = this->actor.parent->world.pos.z;
- dist = Actor_XZDistanceToPoint(&this->actor, &this->actor.parent->world.pos);
+ dist = Actor_WorldDistXZToPoint(&this->actor, &this->actor.parent->world.pos);
} else {
dist = 450.0f;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->yawTarget = this->actor.wallYaw;
- } else if (Actor_XZDistanceToPoint(&this->actor, &this->actor.home.pos) > 300.0f) {
- this->yawTarget = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ } else if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) > 300.0f) {
+ this->yawTarget = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
}
- if ((Math_SmoothStepToS(&this->actor.shape.rot.y, this->yawTarget, 5, 0x300, 0x10) == 0) && onInitialAnimFrame &&
+ if ((Math_SmoothStepToS(&this->actor.shape.rot.y, this->yawTarget, 5, 0x300, 0x10) == 0) && onAnimFirstFrame &&
(Rand_ZeroOne() < 0.1f)) {
- yaw = (Actor_YawToPoint(&this->actor, &this->actor.home.pos) - this->actor.shape.rot.y);
+ yaw = (Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos) - this->actor.shape.rot.y);
if (yaw > 0) {
this->yawTarget += Rand_S16Offset(0x1000, 0x1000);
} else {
this->yawTarget -= Rand_S16Offset(0x1000, 0x1000);
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KAICHO_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KAICHO_CRY);
}
- if ((this->actor.depthInWater > -40.0f) || (this->actor.bgCheckFlags & 1)) {
+ if ((this->actor.depthInWater > -40.0f) || (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
this->pitchTarget = -0x1000;
} else if (this->actor.world.pos.y < (this->actor.home.pos.y - 50.0f)) {
this->pitchTarget = -Rand_S16Offset(0x800, 0x800);
@@ -200,7 +201,7 @@ void EnCrow_FlyIdle(EnCrow* this, PlayState* play) {
this->pitchTarget = Rand_S16Offset(0x800, 0x800);
}
- if ((Math_SmoothStepToS(&this->actor.shape.rot.x, this->pitchTarget, 0xA, 0x100, 8) == 0) && onInitialAnimFrame &&
+ if (!Math_SmoothStepToS(&this->actor.shape.rot.x, this->pitchTarget, 0xA, 0x100, 8) && onAnimFirstFrame &&
(Rand_ZeroOne() < 0.1f)) {
if (this->actor.home.pos.y < this->actor.world.pos.y) {
this->pitchTarget -= Rand_S16Offset(0x400, 0x400);
@@ -211,7 +212,7 @@ void EnCrow_FlyIdle(EnCrow* this, PlayState* play) {
this->pitchTarget = CLAMP(this->pitchTarget, -0x1000, 0x1000);
}
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
Math_ScaledStepToS(&this->actor.shape.rot.x, -0x100, 0x400);
}
@@ -233,7 +234,7 @@ void EnCrow_FlyIdle(EnCrow* this, PlayState* play) {
void EnCrow_SetupDiveAttack(EnCrow* this) {
this->timer = 300;
this->actionFunc = EnCrow_DiveAttack;
- this->actor.speedXZ = 4.0f;
+ this->actor.speed = 4.0f;
this->skelAnime.playSpeed = 2.0f;
}
@@ -258,27 +259,28 @@ void EnCrow_DiveAttack(EnCrow* this, PlayState* play) {
}
targetPos.x = this->actor.child->world.pos.x;
targetPos.z = this->actor.child->world.pos.z;
- pitchTarget = Actor_PitchToPoint(&this->actor, &targetPos);
+ pitchTarget = Actor_WorldPitchTowardPoint(&this->actor, &targetPos);
pitchTarget = CLAMP(pitchTarget, -0x3000, 0x3000);
Math_SmoothStepToS(&this->actor.shape.rot.x, pitchTarget, 2, 0x400, 0x40);
} else {
Math_SmoothStepToS(&this->actor.shape.rot.x, -0x800, 2, 0x100, 0x10);
}
- if (isFacingActor || (Actor_XZDistanceBetweenActors(&this->actor, this->actor.child) > 80.0f)) {
- Math_SmoothStepToS(&this->actor.shape.rot.y, Actor_YawBetweenActors(&this->actor, this->actor.child), 4, 0xC00,
- 0xC0);
+ if (isFacingActor || (Actor_WorldDistXZToActor(&this->actor, this->actor.child) > 80.0f)) {
+ Math_SmoothStepToS(&this->actor.shape.rot.y, Actor_WorldYawTowardActor(&this->actor, this->actor.child), 4,
+ 0xC00, 0xC0);
}
if (((this->timer == 0) || ((&player->actor != this->actor.child) && (this->actor.child->home.rot.z != 0)) ||
((&player->actor == this->actor.child) &&
((Player_GetMask(play) == PLAYER_MASK_STONE) || (player->stateFlags1 & PLAYER_STATE1_800000))) ||
- ((this->collider.base.atFlags & AT_HIT) || (this->actor.bgCheckFlags & 9))) ||
+ ((this->collider.base.atFlags & AT_HIT) ||
+ (this->actor.bgCheckFlags & (BGCHECKFLAG_GROUND | BGCHECKFLAG_WALL)))) ||
(this->actor.depthInWater > -40.0f)) {
if (this->collider.base.atFlags & AT_HIT) {
this->collider.base.atFlags &= ~AT_HIT;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KAICHO_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KAICHO_ATTACK);
}
EnCrow_SetupFlyIdle(this);
}
@@ -288,22 +290,22 @@ void EnCrow_CheckIfFrozen(EnCrow* this, PlayState* play) {
if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->drawDmgEffAlpha = 0.0f;
- Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, 4, 2, 0.2f, 0.2f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, GUAY_BODYPART_MAX, 2, 0.2f, 0.2f);
}
}
void EnCrow_SetupDamaged(EnCrow* this, PlayState* play) {
f32 scale;
- this->actor.speedXZ *= Math_CosS(this->actor.world.rot.x);
+ this->actor.speed *= Math_CosS(this->actor.world.rot.x);
this->actor.velocity.y = 0.0f;
Animation_Change(&this->skelAnime, &gGuayFlyAnim, 0.4f, 0.0f, 0.0f, ANIMMODE_LOOP_INTERP, -3.0f);
this->actor.shape.yOffset = 0.0f;
this->actor.targetArrowOffset = 0.0f;
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
scale = (this->actor.scale.x * 100.0f);
this->actor.world.pos.y += 20.0f * scale;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KAICHO_DEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KAICHO_DEAD);
if (this->actor.colChkInfo.damageEffect == GUAY_DMGEFF_ICE) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX;
@@ -316,16 +318,16 @@ void EnCrow_SetupDamaged(EnCrow* this, PlayState* play) {
this->drawDmgEffFrozenSteamScale = 0.5f;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->collider.elements->info.bumper.hitPos.x,
this->collider.elements->info.bumper.hitPos.y, this->collider.elements->info.bumper.hitPos.z, 0, 0,
- 0, CLEAR_TAG_SMALL_LIGHT_RAYS);
+ 0, CLEAR_TAG_PARAMS(CLEAR_TAG_SMALL_LIGHT_RAYS));
} else if (this->actor.colChkInfo.damageEffect == GUAY_DMGEFF_FIRE) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->drawDmgEffAlpha = 4.0f;
this->drawDmgEffFrozenSteamScale = 0.5f;
}
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 40);
if (this->actor.flags & ACTOR_FLAG_8000) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
this->collider.base.acFlags &= ~AC_ON;
@@ -335,7 +337,7 @@ void EnCrow_SetupDamaged(EnCrow* this, PlayState* play) {
}
void EnCrow_Damaged(EnCrow* this, PlayState* play) {
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f);
+ Math_StepToF(&this->actor.speed, 0.0f, 0.5f);
this->actor.colorFilterTimer = 40;
if (!(this->actor.flags & ACTOR_FLAG_8000)) {
@@ -343,7 +345,7 @@ void EnCrow_Damaged(EnCrow* this, PlayState* play) {
Math_ScaledStepToS(&this->actor.shape.rot.x, 0x4000, 0x200);
this->actor.shape.rot.z += 0x1780;
}
- if ((this->actor.bgCheckFlags & 1) || (this->actor.floorHeight == BGCHECK_Y_MIN)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (this->actor.floorHeight == BGCHECK_Y_MIN)) {
EnCrow_CheckIfFrozen(this, play);
func_800B3030(play, &this->actor.world.pos, &gZeroVec3f, &gZeroVec3f, this->actor.scale.x * 10000.0f, 0, 0);
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 11, NA_SE_EN_EXTINCT);
@@ -385,22 +387,22 @@ void EnCrow_Die(EnCrow* this, PlayState* play) {
void EnCrow_SetupTurnAway(EnCrow* this) {
this->timer = 100;
this->pitchTarget = -0x1000;
- this->actor.speedXZ = 3.5f;
+ this->actor.speed = 3.5f;
this->yawTarget = this->actor.yawTowardsPlayer + 0x8000;
this->skelAnime.playSpeed = 2.0f;
if (this->actor.colChkInfo.damageEffect == GUAY_DMGEFF_STUN) {
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 40);
} else {
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 40);
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
this->actionFunc = EnCrow_TurnAway;
}
void EnCrow_TurnAway(EnCrow* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->yawTarget = this->actor.wallYaw;
} else {
this->yawTarget = this->actor.yawTowardsPlayer + 0x8000;
@@ -454,7 +456,7 @@ void EnCrow_Respawn(EnCrow* this, PlayState* play) {
scaleTarget = 0.01f;
}
if (Math_StepToF(&this->actor.scale.x, scaleTarget, scaleTarget * 0.1f)) {
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actor.flags &= ~ACTOR_FLAG_10;
this->actor.colChkInfo.health = 1;
EnCrow_SetupFlyIdle(this);
@@ -464,8 +466,8 @@ void EnCrow_Respawn(EnCrow* this, PlayState* play) {
}
void EnCrow_UpdateDamage(EnCrow* this, PlayState* play) {
- if (this->collider.base.acFlags & AT_HIT) {
- this->collider.base.acFlags &= ~AT_HIT;
+ if (this->collider.base.acFlags & AC_HIT) {
+ this->collider.base.acFlags &= ~AC_HIT;
Actor_SetDropFlag(&this->actor, &this->collider.elements->info);
if (this->actor.colChkInfo.damageEffect == GUAY_DMGEFF_STUN) {
@@ -479,7 +481,7 @@ void EnCrow_UpdateDamage(EnCrow* this, PlayState* play) {
} else {
this->actor.colChkInfo.health = 0;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
Enemy_StartFinishingBlow(play, &this->actor);
EnCrow_SetupDamaged(this, play);
}
@@ -506,7 +508,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;
}
@@ -527,8 +530,8 @@ void EnCrow_Update(Actor* thisx, PlayState* play) {
Actor_SetFocus(&this->actor, height);
- if ((this->actor.colChkInfo.health != 0) && (Animation_OnFrame(&this->skelAnime, 3.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KAICHO_FLUTTER);
+ if ((this->actor.colChkInfo.health != 0) && Animation_OnFrame(&this->skelAnime, 3.0f)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KAICHO_FLUTTER);
}
if (this->drawDmgEffAlpha > 0.0f) {
if (this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
@@ -540,7 +543,7 @@ void EnCrow_Update(Actor* thisx, PlayState* play) {
this->drawDmgEffFrozenSteamScale = this->drawDmgEffFrozenSteamScale;
}
} else if (!Math_StepToF(&this->drawDmgEffScale, 0.5f, 0.5f * 0.025f)) {
- func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
}
}
@@ -550,9 +553,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;
@@ -562,7 +565,7 @@ void EnCrow_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot
EnCrow* this = THIS;
if (limbIndex == OBJECT_CROW_LIMB_BODY) {
- Matrix_MultVecX(2500.0f, this->bodyPartsPos);
+ Matrix_MultVecX(2500.0f, &this->bodyPartsPos[GUAY_BODYPART_BODY]);
} else if ((limbIndex == OBJECT_CROW_LIMB_RIGHT_WING_TIP) || (limbIndex == OBJECT_CROW_LIMB_LEFT_WING_TIP) ||
(limbIndex == OBJECT_CROW_LIMB_TAIL)) {
Matrix_MultZero(&this->bodyPartsPos[(limbIndex >> 1) - 1]);
@@ -572,10 +575,10 @@ 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),
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, GUAY_BODYPART_MAX,
this->actor.scale.x * 100.0f * this->drawDmgEffFrozenSteamScale, this->drawDmgEffScale,
this->drawDmgEffAlpha, this->drawDmgEffType);
}
diff --git a/src/overlays/actors/ovl_En_Crow/z_en_crow.h b/src/overlays/actors/ovl_En_Crow/z_en_crow.h
index 527f822f6..fca2cc0b0 100644
--- a/src/overlays/actors/ovl_En_Crow/z_en_crow.h
+++ b/src/overlays/actors/ovl_En_Crow/z_en_crow.h
@@ -13,6 +13,14 @@ struct EnCrow;
typedef void (*EnCrowActionFunc)(struct EnCrow*, PlayState*);
+typedef enum GuayBodyPart {
+ /* 0 */ GUAY_BODYPART_BODY,
+ /* 1 */ GUAY_BODYPART_RIGHT_WING_TIP,
+ /* 2 */ GUAY_BODYPART_LEFT_WING_TIP,
+ /* 3 */ GUAY_BODYPART_TAIL,
+ /* 4 */ GUAY_BODYPART_MAX
+} GuayBodyPart;
+
typedef struct EnCrow {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
@@ -24,8 +32,8 @@ typedef struct EnCrow {
/* 0x194 */ Vec3s jointTable[OBJECT_CROW_LIMB_MAX];
/* 0x1CA */ Vec3s morphTable[OBJECT_CROW_LIMB_MAX];
/* 0x200 */ ColliderJntSph collider;
- /* 0x220 */ ColliderJntSphElement colliderItems[1];
- /* 0x260 */ Vec3f bodyPartsPos[4];
+ /* 0x220 */ ColliderJntSphElement colliderElements[1];
+ /* 0x260 */ Vec3f bodyPartsPos[GUAY_BODYPART_MAX];
/* 0x290 */ f32 drawDmgEffAlpha;
/* 0x294 */ f32 drawDmgEffFrozenSteamScale;
/* 0x298 */ f32 drawDmgEffScale;
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 2f2496f57..d9147aa26 100644
--- a/src/overlays/actors/ovl_En_Dai/z_en_dai.c
+++ b/src/overlays/actors/ovl_En_Dai/z_en_dai.c
@@ -5,9 +5,8 @@
*/
#include "z_en_dai.h"
-#include "objects/object_dai/object_dai.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_2000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_2000000)
#define THIS ((EnDai*)thisx)
@@ -62,7 +61,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) {
@@ -127,62 +126,76 @@ s32 func_80B3E5B4(EnDai* this, PlayState* play) {
return 0;
}
-s32 func_80B3E5DC(EnDai* this, s32 arg1) {
- static AnimationInfoS sAnimationInfo[] = {
- { &object_dai_Anim_0079E4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dai_Anim_0079E4, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_dai_Anim_007354, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &object_dai_Anim_000CEC, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &object_dai_Anim_0069DC, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &object_dai_Anim_00563C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dai_Anim_00563C, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &object_dai_Anim_002E58, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_dai_Anim_006590, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- };
+typedef enum {
+ /* -1 */ ENDAI_ANIM_NONE = -1,
+ /* 0 */ ENDAI_ANIM_0,
+ /* 1 */ ENDAI_ANIM_1,
+ /* 2 */ ENDAI_ANIM_2,
+ /* 3 */ ENDAI_ANIM_3,
+ /* 4 */ ENDAI_ANIM_4,
+ /* 5 */ ENDAI_ANIM_5,
+ /* 6 */ ENDAI_ANIM_6,
+ /* 7 */ ENDAI_ANIM_7,
+ /* 8 */ ENDAI_ANIM_8,
+ /* 9 */ ENDAI_ANIM_MAX
+} EnDaiAnimation;
- s32 phi_v1 = false;
- s32 ret = false;
+static AnimationInfoS sAnimationInfo[ENDAI_ANIM_MAX] = {
+ { &object_dai_Anim_0079E4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENDAI_ANIM_0
+ { &object_dai_Anim_0079E4, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENDAI_ANIM_1
+ { &object_dai_Anim_007354, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENDAI_ANIM_2
+ { &object_dai_Anim_000CEC, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENDAI_ANIM_3
+ { &object_dai_Anim_0069DC, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENDAI_ANIM_4
+ { &object_dai_Anim_00563C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENDAI_ANIM_5
+ { &object_dai_Anim_00563C, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENDAI_ANIM_6
+ { &object_dai_Anim_002E58, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENDAI_ANIM_7
+ { &object_dai_Anim_006590, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENDAI_ANIM_8
+};
- switch (arg1) {
- case 0:
- case 1:
- if ((this->unk_A70 != 0) && (this->unk_A70 != 1)) {
- phi_v1 = true;
+s32 EnDai_ChangeAnim(EnDai* this, s32 animIndex) {
+ s32 changeAnim = false;
+ s32 didAnimChange = false;
+
+ switch (animIndex) {
+ case ENDAI_ANIM_0:
+ case ENDAI_ANIM_1:
+ if ((this->animIndex != ENDAI_ANIM_0) && (this->animIndex != ENDAI_ANIM_1)) {
+ changeAnim = true;
}
break;
- case 5:
- case 6:
- if ((this->unk_A70 != 5) && (this->unk_A70 != 6)) {
- phi_v1 = true;
+ case ENDAI_ANIM_5:
+ case ENDAI_ANIM_6:
+ if ((this->animIndex != ENDAI_ANIM_5) && (this->animIndex != ENDAI_ANIM_6)) {
+ changeAnim = true;
}
break;
default:
- if (arg1 != this->unk_A70) {
- phi_v1 = true;
+ if (this->animIndex != animIndex) {
+ changeAnim = true;
}
break;
}
- if (phi_v1) {
- this->unk_A70 = arg1;
- ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, arg1);
+ if (changeAnim) {
+ this->animIndex = animIndex;
+ didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
}
- return ret;
+ return didAnimChange;
}
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;
@@ -202,12 +215,11 @@ s32 func_80B3E69C(EnDai* this, PlayState* play) {
s32 func_80B3E7C8(EnDai* this, PlayState* play) {
s32 ret = false;
- if (this->unk_1CE & 7) {
- if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- SubS_UpdateFlags(&this->unk_1CE, 0, 7);
- this->actionFunc = func_80B3EF90;
- ret = true;
- }
+ if (((this->unk_1CE & SUBS_OFFER_MODE_MASK) != SUBS_OFFER_MODE_NONE) &&
+ Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ SubS_SetOfferMode(&this->unk_1CE, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
+ this->actionFunc = func_80B3EF90;
+ ret = true;
}
return ret;
@@ -240,26 +252,26 @@ static s32 D_80B3FC8C[] = {
0x920C0F0C, 0x930C1211, 0x5520100E, 0x0C940C12, 0x10000000,
};
-s16 func_80B3E8BC(EnDai* this, s32 arg1) {
- 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,
- };
+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,
+};
- static f32 D_80B3FCE4[] = {
- 5.0f, 15.0f, 18.0f, 45.0f, 47.0f, 49.0f, 51.0f, 53.0f, 55.0f, 5.0f, 35.0f, 45.0f,
- };
+static f32 D_80B3FCE4[] = {
+ 5.0f, 15.0f, 18.0f, 45.0f, 47.0f, 49.0f, 51.0f, 53.0f, 55.0f, 5.0f, 35.0f, 45.0f,
+};
- static s16 D_80B3FD14[] = {
- 4, 5, 2, 0, 4, 5, 2, 5, 4, 4, 5, 2,
- };
+static s16 D_80B3FD14[] = {
+ 4, 5, 2, 0, 4, 5, 2, 5, 4, 4, 5, 2,
+};
+s16 func_80B3E8BC(EnDai* this, s32 cueId) {
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 {
@@ -267,7 +279,7 @@ s16 func_80B3E8BC(EnDai* this, s32 arg1) {
}
while (i < end) {
- if ((D_80B3FCB4[i] <= this->skelAnime.curFrame) && (D_80B3FCE4[i] >= this->skelAnime.curFrame)) {
+ if ((this->skelAnime.curFrame >= D_80B3FCB4[i]) && (this->skelAnime.curFrame <= D_80B3FCE4[i])) {
return D_80B3FD14[i];
}
i++;
@@ -286,30 +298,33 @@ s32 func_80B3E96C(EnDai* this, PlayState* play) {
((this->unk_1DC == 0) || Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame))) {
switch (this->unk_1DC) {
case 0:
- func_80B3E5DC(this, 2);
+ EnDai_ChangeAnim(this, ENDAI_ANIM_2);
this->unk_1DC++;
break;
case 1:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_SNOWSTORM_HARD);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_SNOWSTORM_HARD);
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_WEATHER_TAG, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0x1388, 0x708, 0x3E8, 0);
- func_80B3E5DC(this, 3);
+ EnDai_ChangeAnim(this, ENDAI_ANIM_3);
this->unk_1DC++;
break;
case 2:
- func_80B3E5DC(this, 4);
+ EnDai_ChangeAnim(this, ENDAI_ANIM_4);
this->unk_1DC++;
break;
case 3:
- func_80B3E5DC(this, 1);
+ EnDai_ChangeAnim(this, ENDAI_ANIM_1);
this->unk_1F0 = D_80B3FBF0;
this->unk_1FC = D_80B3FBF0;
this->unk_1DC = 0;
this->unk_1DA = Rand_S16Offset(20, 20);
break;
+
+ default:
+ break;
}
} else if (this->unk_1DC == 2) {
sp50.x = sp50.y = 0.0f;
@@ -337,30 +352,30 @@ void func_80B3EC10(f32 arg0, Vec3f arg1, f32 arg2, Vec3f arg3, f32 arg4, Vec3f*
arg5->z = ((arg3.z - arg1.z) * temp_f0) + arg1.z;
}
+static f32 D_80B3FD2C[] = {
+ 6.0f, 11.0f, 15.0f, 0.0f, 12.0f, 17.0f, 0.0f, 3.0f,
+};
+
+static f32 D_80B3FD4C[] = {
+ 8.0f, 15.0f, 24.0f, 4.0f, 17.0f, 26.0f, 3.0f, 7.0f,
+};
+
+static s16 D_80B3FD6C[] = {
+ 1, 1, 1, 2, 2, 2, 3, 3,
+};
+
+static Vec3f D_80B3FD7C[] = {
+ { 1.0f, 1.0f, 1.0f }, { 1.0f, 0.8f, 0.8f }, { 1.0f, 1.1f, 1.1f }, { 1.0f, 1.3f, 1.3f }, { 1.0f, 0.7f, 0.9f },
+ { 1.0f, 0.8f, 0.9f }, { 1.0f, 0.7f, 0.9f }, { 1.0f, 0.8f, 0.9f }, { 1.0f, 1.0f, 1.0f },
+};
+
s32 func_80B3EC84(EnDai* this) {
- static f32 D_80B3FD2C[] = {
- 6.0f, 11.0f, 15.0f, 0.0f, 12.0f, 17.0f, 0.0f, 3.0f,
- };
-
- static f32 D_80B3FD4C[] = {
- 8.0f, 15.0f, 24.0f, 4.0f, 17.0f, 26.0f, 3.0f, 7.0f,
- };
-
- static s16 D_80B3FD6C[] = {
- 1, 1, 1, 2, 2, 2, 3, 3,
- };
-
- static Vec3f D_80B3FD7C[] = {
- { 1.0f, 1.0f, 1.0f }, { 1.0f, 0.8, 0.8 }, { 1.0f, 1.1f, 1.1f }, { 1.0f, 1.3f, 1.3f }, { 1.0f, 0.7f, 0.9f },
- { 1.0f, 0.8, 0.9f }, { 1.0f, 0.7f, 0.9f }, { 1.0f, 0.8, 0.9f }, { 1.0f, 1.0f, 1.0f },
- };
-
s32 i;
s32 ret = false;
for (i = 0; i < ARRAY_COUNT(D_80B3FD6C); i++) {
- if ((this->unk_1DC == D_80B3FD6C[i]) && (D_80B3FD2C[i] < this->skelAnime.curFrame) &&
- (D_80B3FD4C[i] >= this->skelAnime.curFrame)) {
+ if ((this->unk_1DC == D_80B3FD6C[i]) && (this->skelAnime.curFrame > D_80B3FD2C[i]) &&
+ (this->skelAnime.curFrame <= D_80B3FD4C[i])) {
func_80B3EC10(D_80B3FD2C[i], D_80B3FD7C[i], D_80B3FD4C[i], D_80B3FD7C[i + 1], this->skelAnime.curFrame,
&this->unk_1F0);
ret = true;
@@ -371,17 +386,20 @@ s32 func_80B3EC84(EnDai* this) {
return ret;
}
+static f32 D_80B3FDE8[] = { 22.0f, 0.0f, 0.0f };
+
+static f32 D_80B3FDF4[] = { 29.0f, 3.0f, 9.0f };
+
+static s16 D_80B3FE00[] = { 1, 2, 3 };
+
+static Vec3f D_80B3FE08[] = {
+ { 1.0f, 1.0f, 1.0f },
+ { 1.0f, 1.2f, 1.2f },
+ { 1.0f, 0.7f, 0.8f },
+ { 1.0f, 1.0f, 1.0f },
+};
+
s32 func_80B3ED88(EnDai* this) {
- static f32 D_80B3FDE8[] = { 22.0f, 0.0f, 0.0f };
-
- static f32 D_80B3FDF4[] = { 29.0f, 3.0f, 9.0f };
-
- static s16 D_80B3FE00[] = { 1, 2, 3 };
-
- static Vec3f D_80B3FE08[] = {
- 1.0f, 1.0f, 1.0f, 1.0f, 1.2f, 1.2f, 1.0f, 0.7f, 0.8f, 1.0f, 1.0f, 1.0f,
- };
-
s32 i;
s32 ret = false;
@@ -399,34 +417,34 @@ 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);
}
}
void func_80B3EEDC(EnDai* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if ((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == 3) &&
+ if ((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) &&
(play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY)) {
- func_80B3E5DC(this, 1);
+ EnDai_ChangeAnim(this, ENDAI_ANIM_1);
this->actionFunc = func_80B3EE8C;
} else if (!(player->stateFlags2 & PLAYER_STATE2_8000000)) {
func_80B3E96C(this, play);
this->unk_A6C = 0;
} else if (this->unk_A6C == 0) {
- play_sound(NA_SE_SY_TRE_BOX_APPEAR);
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
this->unk_A6C = 1;
}
}
void func_80B3EF90(EnDai* this, PlayState* play) {
if (func_8010BF58(&this->actor, play, D_80B3FC8C, NULL, &this->unk_1D0)) {
- SubS_UpdateFlags(&this->unk_1CE, 3, 7);
+ SubS_SetOfferMode(&this->unk_1CE, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_1D0 = 0;
this->actionFunc = func_80B3F00C;
} else {
@@ -438,36 +456,39 @@ void func_80B3F00C(EnDai* this, PlayState* play) {
Math_ApproachS(&this->actor.shape.rot.y, this->actor.world.rot.y, 3, 0x2AA8);
}
-void func_80B3F044(EnDai* this, PlayState* play) {
- static s32 D_80B3FE38[] = {
- 0, 0, 6, 7, 8,
+void EnDai_HandleCutscene(EnDai* this, PlayState* play) {
+ static s32 sCsAnimIndex[] = {
+ ENDAI_ANIM_0, ENDAI_ANIM_0, ENDAI_ANIM_6, ENDAI_ANIM_7, ENDAI_ANIM_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) {
+ EnDai_ChangeAnim(this, sCsAnimIndex[cueId]);
+ switch (cueId) {
case 1:
this->unk_1E0 = 0.0f;
break;
case 2:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_ROLL_AND_FALL);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_ROLL_AND_FALL);
break;
case 3:
this->unk_1CE &= ~0x80;
break;
+
+ default:
+ 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) {
@@ -478,52 +499,56 @@ void func_80B3F044(EnDai* this, PlayState* play) {
break;
case 2:
- if (play->csCtx.frames == 360) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DAIGOLON_SLEEP3 - SFX_FLAG);
+ if (play->csCtx.curFrame == 360) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DAIGOLON_SLEEP3 - SFX_FLAG);
}
if (Animation_OnFrame(&this->skelAnime, 43.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_GORON_BOUND_1);
+ 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_PlaySfxAtPos(&this->actor, NA_SE_EN_DAIGOLON_SLEEP1);
+ 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:
if (Animation_OnFrame(&this->skelAnime, 30.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DAIGOLON_SLEEP2);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DAIGOLON_SLEEP2);
}
if (Animation_OnFrame(&this->skelAnime, 35.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_GORON_BOUND_0);
+ 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;
+
+ default:
break;
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, sp2C);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
void EnDai_Init(Actor* thisx, PlayState* play) {
EnDai* this = THIS;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 0.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_dai_Skel_0130D0, NULL, this->jointTable, this->morphTable, 19);
- this->unk_A70 = -1;
- func_80B3E5DC(this, 0);
+ SkelAnime_InitFlex(play, &this->skelAnime, &object_dai_Skel_0130D0, NULL, this->jointTable, this->morphTable,
+ OBJECT_DAI_LIMB_MAX);
+ this->animIndex = ENDAI_ANIM_NONE;
+ EnDai_ChangeAnim(this, ENDAI_ANIM_0);
Actor_SetScale(&this->actor, 0.2f);
- this->actor.targetMode = 10;
+ this->actor.targetMode = TARGET_MODE_10;
this->unk_1F0 = D_80B3FBF0;
this->unk_1FC = D_80B3FBF0;
this->unk_1CE = 0;
this->unk_1D6 = 0;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_33_80)) {
- SubS_UpdateFlags(&this->unk_1CE, 3, 7);
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE)) {
+ SubS_SetOfferMode(&this->unk_1CE, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_1CE |= 0x80;
this->unk_1CD = 0xFF;
this->actionFunc = func_80B3F00C;
@@ -536,7 +561,7 @@ void EnDai_Init(Actor* thisx, PlayState* play) {
}
this->unk_1CD = 0;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->unk_1CE |= (0x100 | 0x20);
this->unk_1CE |= 0x80;
this->actionFunc = func_80B3EEDC;
@@ -551,7 +576,7 @@ void EnDai_Update(Actor* thisx, PlayState* play) {
Player* player = GET_PLAYER(play);
if (!func_80B3E7C8(this, play) && func_80B3E69C(this, play)) {
- func_80B3F044(this, play);
+ EnDai_HandleCutscene(this, play);
SkelAnime_Update(&this->skelAnime);
func_80B3E834(this);
func_80B3E460(this);
@@ -561,7 +586,7 @@ void EnDai_Update(Actor* thisx, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
func_80B3E834(this);
if (!(this->unk_1CE & 0x200)) {
- func_8013C964(&this->actor, play, 0.0f, 0.0f, PLAYER_IA_NONE, this->unk_1CE & 7);
+ SubS_Offer(&this->actor, play, 0.0f, 0.0f, PLAYER_IA_NONE, this->unk_1CE & SUBS_OFFER_MODE_MASK);
}
func_80B3E460(this);
}
@@ -576,11 +601,11 @@ s32 EnDai_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
*dList = NULL;
}
- if (limbIndex == 11) {
+ if (limbIndex == OBJECT_DAI_LIMB_0B) {
Matrix_MultVec3f(&gZeroVec3f, &this->unk_1E4);
}
- if (limbIndex == 10) {
+ if (limbIndex == OBJECT_DAI_LIMB_0A) {
*dList = NULL;
}
@@ -595,7 +620,7 @@ void EnDai_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
MtxF sp24;
switch (limbIndex) {
- case 11:
+ case OBJECT_DAI_LIMB_0B:
D_80B3FE4C.x = sREG(0);
D_80B3FE4C.y = sREG(1);
D_80B3FE4C.z = sREG(2);
@@ -606,9 +631,12 @@ void EnDai_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
this->unk_1D4 = BINANG_SUB(sp64.y, 0x4000);
break;
- case 10:
+ case OBJECT_DAI_LIMB_0A:
Matrix_Get(&this->unk_18C);
break;
+
+ default:
+ break;
}
}
@@ -616,19 +644,22 @@ void EnDai_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx, Gfx**
EnDai* this = THIS;
switch (limbIndex) {
- case 9:
+ case OBJECT_DAI_LIMB_09:
if (this->unk_1CE & 0x100) {
func_80B3EC84(this);
}
Matrix_Scale(this->unk_1F0.x, this->unk_1F0.y, this->unk_1F0.z, MTXMODE_APPLY);
break;
- case 2:
+ case OBJECT_DAI_LIMB_02:
if (this->unk_1CE & 0x100) {
func_80B3ED88(this);
}
Matrix_Scale(this->unk_1FC.x, this->unk_1FC.y, this->unk_1FC.z, MTXMODE_APPLY);
break;
+
+ default:
+ break;
}
}
@@ -642,11 +673,11 @@ void func_80B3F78C(EnDai* this, PlayState* play) {
if (play->actorCtx.lensActorsDrawn) {
this->unk_1CE |= 0x40;
} else {
- Actor_RecordUndrawnActor(play, &this->actor);
+ Actor_AddToLensActors(play, &this->actor);
this->unk_1CE &= ~0x40;
}
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
@@ -675,12 +706,11 @@ void func_80B3F920(EnDai* this, PlayState* play) {
object_dai_Tex_0107B0, object_dai_Tex_010FB0, object_dai_Tex_0117B0,
object_dai_Tex_010FB0, object_dai_Tex_011FB0, object_dai_Tex_0127B0,
};
-
s32 pad;
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);
@@ -698,7 +728,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..90456b833 100644
--- a/src/overlays/actors/ovl_En_Dai/z_en_dai.h
+++ b/src/overlays/actors/ovl_En_Dai/z_en_dai.h
@@ -2,6 +2,7 @@
#define Z_EN_DAI_H
#include "global.h"
+#include "objects/object_dai/object_dai.h"
struct EnDai;
@@ -26,7 +27,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;
@@ -39,11 +40,11 @@ typedef struct EnDai {
/* 0x1E4 */ Vec3f unk_1E4;
/* 0x1F0 */ Vec3f unk_1F0;
/* 0x1FC */ Vec3f unk_1FC;
- /* 0x208 */ Vec3s jointTable[19];
- /* 0x27A */ Vec3s morphTable[19];
+ /* 0x208 */ Vec3s jointTable[OBJECT_DAI_LIMB_MAX];
+ /* 0x27A */ Vec3s morphTable[OBJECT_DAI_LIMB_MAX];
/* 0x2EC */ EnDaiEffect effects[EN_DAI_EFFECT_COUNT];
/* 0xA6C */ s32 unk_A6C;
- /* 0xA70 */ s32 unk_A70;
+ /* 0xA70 */ s32 animIndex;
} EnDai; // size = 0xA74
#endif // Z_EN_DAI_H
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 263b22ada..ddf98cd3d 100644
--- a/src/overlays/actors/ovl_En_Daiku/z_en_daiku.c
+++ b/src/overlays/actors/ovl_En_Daiku/z_en_daiku.c
@@ -5,9 +5,8 @@
*/
#include "z_en_daiku.h"
-#include "objects/object_daiku/object_daiku.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnDaiku*)thisx)
@@ -57,15 +56,42 @@ static ColliderCylinderInit sCylinderInit = {
{ 20, 60, 0, { 0, 0, 0 } },
};
-static AnimationHeader* sAnimations[] = {
- &object_daiku_Anim_002FA0, &object_daiku_Anim_00ACD0, &object_daiku_Anim_00C92C,
- &object_daiku_Anim_000C44, &object_daiku_Anim_00C234, &object_daiku_Anim_000600,
- &object_daiku_Anim_001114, &object_daiku_Anim_00B690, &object_daiku_Anim_00BEAC,
+typedef enum {
+ /* -1 */ ENDAIKU_ANIM_NONE = -1,
+ /* 0 */ ENDAIKU_ANIM_0,
+ /* 1 */ ENDAIKU_ANIM_1,
+ /* 2 */ ENDAIKU_ANIM_2,
+ /* 3 */ ENDAIKU_ANIM_3,
+ /* 4 */ ENDAIKU_ANIM_4,
+ /* 5 */ ENDAIKU_ANIM_5,
+ /* 6 */ ENDAIKU_ANIM_6,
+ /* 7 */ ENDAIKU_ANIM_7,
+ /* 8 */ ENDAIKU_ANIM_8,
+ /* 9 */ ENDAIKU_ANIM_MAX
+} EnDaiAnimation;
+
+static AnimationHeader* sAnimations[ENDAIKU_ANIM_MAX] = {
+ &object_daiku_Anim_002FA0, // ENDAIKU_ANIM_0
+ &object_daiku_Anim_00ACD0, // ENDAIKU_ANIM_1
+ &object_daiku_Anim_00C92C, // ENDAIKU_ANIM_2
+ &object_daiku_Anim_000C44, // ENDAIKU_ANIM_3
+ &object_daiku_Anim_00C234, // ENDAIKU_ANIM_4
+ &object_daiku_Anim_000600, // ENDAIKU_ANIM_5
+ &object_daiku_Anim_001114, // ENDAIKU_ANIM_6
+ &object_daiku_Anim_00B690, // ENDAIKU_ANIM_7
+ &object_daiku_Anim_00BEAC, // ENDAIKU_ANIM_8
};
-static u8 sAnimationModes[] = {
- ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE,
- ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_ONCE,
+static u8 sAnimationModes[ENDAIKU_ANIM_MAX] = {
+ ANIMMODE_LOOP, // ENDAIKU_ANIM_0
+ ANIMMODE_LOOP, // ENDAIKU_ANIM_1
+ ANIMMODE_LOOP, // ENDAIKU_ANIM_2
+ ANIMMODE_LOOP, // ENDAIKU_ANIM_3
+ ANIMMODE_ONCE, // ENDAIKU_ANIM_4
+ ANIMMODE_LOOP, // ENDAIKU_ANIM_5
+ ANIMMODE_LOOP, // ENDAIKU_ANIM_6
+ ANIMMODE_ONCE, // ENDAIKU_ANIM_7
+ ANIMMODE_ONCE, // ENDAIKU_ANIM_8
};
void EnDaiku_Init(Actor* thisx, PlayState* play) {
@@ -73,21 +99,21 @@ void EnDaiku_Init(Actor* thisx, PlayState* play) {
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 40.0f);
- this->actor.targetMode = 0;
+ this->actor.targetMode = TARGET_MODE_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;
- this->actor.flags |= ACTOR_FLAG_8000000;
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_63_80) || ((gSaveContext.save.day == 3) && gSaveContext.save.isNight)) {
Actor_Kill(&this->actor);
}
@@ -100,22 +126,25 @@ 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);
+ this->jointTable, this->morphTable, OBJECT_DAIKU_LIMB_MAX);
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);
+ this->jointTable, this->morphTable, OBJECT_DAIKU_LIMB_MAX);
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);
+ this->jointTable, this->morphTable, OBJECT_DAIKU_LIMB_MAX);
+ break;
+
+ default:
break;
}
@@ -128,14 +157,15 @@ void EnDaiku_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyCylinder(play, &this->collider);
}
-void func_8094373C(EnDaiku* this, s32 arg1) {
- this->unk_284 = Animation_GetLastFrame(sAnimations[arg1]);
- Animation_Change(&this->skelAnime, sAnimations[arg1], 1.0f, 0.0f, this->unk_284, sAnimationModes[arg1], -4.0f);
+void EnDaiku_ChangeAnim(EnDaiku* this, s32 animIndex) {
+ this->animEndFrame = Animation_GetLastFrame(sAnimations[animIndex]);
+ Animation_Change(&this->skelAnime, sAnimations[animIndex], 1.0f, 0.0f, this->animEndFrame,
+ sAnimationModes[animIndex], -4.0f);
}
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);
}
}
@@ -147,15 +177,18 @@ void func_80943820(EnDaiku* this) {
switch (this->unk_278) {
case 0:
case 1:
- func_8094373C(this, 0);
+ EnDaiku_ChangeAnim(this, ENDAIKU_ANIM_0);
break;
case 2:
- func_8094373C(this, 7);
+ EnDaiku_ChangeAnim(this, ENDAIKU_ANIM_7);
break;
case 3:
- func_8094373C(this, 6);
+ EnDaiku_ChangeAnim(this, ENDAIKU_ANIM_6);
+ break;
+
+ default:
break;
}
@@ -167,13 +200,13 @@ void func_80943820(EnDaiku* this) {
}
void func_809438F8(EnDaiku* this, PlayState* play) {
- f32 currentFrame = this->skelAnime.curFrame;
+ f32 curFrame = this->skelAnime.curFrame;
s32 pad;
s32 day = gSaveContext.save.day - 1;
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,16 +221,17 @@ 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) && (curFrame >= this->animEndFrame)) {
if (Rand_ZeroOne() < 0.5f) {
- func_8094373C(this, 7);
+ EnDaiku_ChangeAnim(this, ENDAIKU_ANIM_7);
} else {
- func_8094373C(this, 8);
+ EnDaiku_ChangeAnim(this, ENDAIKU_ANIM_8);
}
}
- 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 +239,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,11 +252,12 @@ 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)) {
- func_800B8614(&this->actor, play, 100.0f);
+ if ((this->unk_278 == ENDAIKU_PARAM_FF_1) || (this->unk_278 == ENDAIKU_PARAM_FF_2) || (angle <= 0x2890)) {
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
}
}
@@ -233,18 +268,18 @@ void func_80943BC0(EnDaiku* this) {
}
void func_80943BDC(EnDaiku* this, PlayState* play) {
- f32 currentFrame = this->skelAnime.curFrame;
+ f32 curFrame = this->skelAnime.curFrame;
- if ((this->unk_278 == ENDAIKU_PARAMS_FF_2) && (this->unk_284 <= currentFrame)) {
+ if ((this->unk_278 == ENDAIKU_PARAM_FF_2) && (curFrame >= this->animEndFrame)) {
if (Rand_ZeroOne() < 0.5f) {
- func_8094373C(this, 7);
+ EnDaiku_ChangeAnim(this, ENDAIKU_ANIM_7);
} else {
- func_8094373C(this, 8);
+ EnDaiku_ChangeAnim(this, ENDAIKU_ANIM_8);
}
}
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_80943820(this);
}
}
@@ -257,7 +292,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 +313,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);
@@ -287,7 +324,7 @@ void EnDaiku_Update(Actor* thisx, PlayState* play) {
s32 EnDaiku_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnDaiku* this = THIS;
- if (limbIndex == 15) {
+ if (limbIndex == OBJECT_DAIKU_LIMB_0F) {
rot->x += this->unk_260;
rot->z += this->unk_25E;
}
@@ -306,11 +343,11 @@ void EnDaiku_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* ro
OPEN_DISPS(play->state.gfxCtx);
- if (limbIndex == 15) {
+ if (limbIndex == OBJECT_DAIKU_LIMB_0F) {
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 == OBJECT_DAIKU_LIMB_08)) {
gSPDisplayList(POLY_OPA_DISP++, object_daiku_DL_008EC8);
}
@@ -322,7 +359,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 fa161e9fd..60275bbfa 100644
--- a/src/overlays/actors/ovl_En_Daiku/z_en_daiku.h
+++ b/src/overlays/actors/ovl_En_Daiku/z_en_daiku.h
@@ -2,28 +2,31 @@
#define Z_EN_DAIKU_H
#include "global.h"
+#include "objects/object_daiku/object_daiku.h"
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_FF(thisx) ((thisx)->params & 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;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[17];
- /* 0x1EE */ Vec3s morphTable[17];
+ /* 0x188 */ Vec3s jointTable[OBJECT_DAIKU_LIMB_MAX];
+ /* 0x1EE */ Vec3s morphTable[OBJECT_DAIKU_LIMB_MAX];
/* 0x254 */ EnDaikuActionFunc actionFunc;
- /* 0x258 */ Path* unk_258;
+ /* 0x258 */ Path* path;
/* 0x25C */ s16 unk_25C;
/* 0x25E */ s16 unk_25E;
/* 0x260 */ s16 unk_260;
@@ -37,8 +40,8 @@ typedef struct EnDaiku {
/* 0x27E */ s16 unk_27E;
/* 0x280 */ s16 unk_280;
/* 0x282 */ s16 unk_282;
- /* 0x284 */ f32 unk_284;
- /* 0x288 */ s16 unk_288;
+ /* 0x284 */ f32 animEndFrame;
+ /* 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 0e5e7a3ea..01b701ce1 100644
--- a/src/overlays/actors/ovl_En_Daiku2/z_en_daiku2.c
+++ b/src/overlays/actors/ovl_En_Daiku2/z_en_daiku2.c
@@ -9,7 +9,7 @@
#include "objects/object_daiku/object_daiku.h"
#include "objects/object_bombiwa/object_bombiwa.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnDaiku2*)thisx)
@@ -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);
}
}
@@ -83,12 +83,12 @@ void EnDaiku2_Init(Actor* thisx, PlayState* play) {
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 40.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &object_daiku_Skel_00A850, &object_daiku_Anim_002FA0, this->jointTable,
- this->morphTable, 17);
- this->actor.targetMode = 0;
+ this->morphTable, OBJECT_DAIKU_LIMB_MAX);
+ this->actor.targetMode = TARGET_MODE_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->switchFlag = ENDAIKU2_GET_SWITCH_FLAG(&this->actor);
+ 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) {
@@ -97,10 +97,10 @@ void EnDaiku2_Init(Actor* thisx, PlayState* play) {
return;
}
- 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;
+ if (this->switchFlag == 0x7F) {
+ this->switchFlag = -1;
+ } else if (Flags_GetSwitch(play, this->switchFlag)) {
+ this->unk_25C = this->path->count - 1;
func_80BE61D0(this);
Math_Vec3f_Copy(&this->actor.world.pos, &this->unk_268);
}
@@ -120,25 +120,61 @@ void EnDaiku2_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyCylinder(play, &this->collider);
}
-void func_80BE6408(EnDaiku2* this, s32 arg1) {
- static AnimationHeader* sAnimations[] = {
- &object_daiku_Anim_002FA0, &object_daiku_Anim_00ACD0, &object_daiku_Anim_00C92C, &object_daiku_Anim_000C44,
- &object_daiku_Anim_00C234, &object_daiku_Anim_000600, &object_daiku_Anim_001114, &object_daiku_Anim_00B690,
- &object_daiku_Anim_001A24, &object_daiku_Anim_002134, &object_daiku_Anim_00D328,
- };
- static u8 D_80BE7958[] = {
- ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_LOOP,
- ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_LOOP,
- };
- f32 sp34 = 1.0f;
+typedef enum {
+ /* -1 */ ENDAIKU2_ANIM_NONE = -1,
+ /* 0 */ ENDAIKU2_ANIM_0,
+ /* 1 */ ENDAIKU2_ANIM_1,
+ /* 2 */ ENDAIKU2_ANIM_2,
+ /* 3 */ ENDAIKU2_ANIM_3,
+ /* 4 */ ENDAIKU2_ANIM_4,
+ /* 5 */ ENDAIKU2_ANIM_5,
+ /* 6 */ ENDAIKU2_ANIM_6,
+ /* 7 */ ENDAIKU2_ANIM_7,
+ /* 8 */ ENDAIKU2_ANIM_8,
+ /* 9 */ ENDAIKU2_ANIM_9,
+ /* 10 */ ENDAIKU2_ANIM_10,
+ /* 11 */ ENDAIKU2_ANIM_MAX,
+ /* 11 */ ENDAIKU2_ANIM_11 = ENDAIKU2_ANIM_MAX // for object_daiku_Anim_002134 set external to `EnDaiku2_ChangeAnim`
+} EnDaiAnimation;
- this->unk_276 = arg1;
- this->unk_284 = Animation_GetLastFrame(sAnimations[this->unk_276]);
- if (this->unk_276 == 3) {
- sp34 = 2.0f;
+static AnimationHeader* sAnimations[ENDAIKU2_ANIM_MAX] = {
+ &object_daiku_Anim_002FA0, // ENDAIKU2_ANIM_0
+ &object_daiku_Anim_00ACD0, // ENDAIKU2_ANIM_1
+ &object_daiku_Anim_00C92C, // ENDAIKU2_ANIM_2
+ &object_daiku_Anim_000C44, // ENDAIKU2_ANIM_3
+ &object_daiku_Anim_00C234, // ENDAIKU2_ANIM_4
+ &object_daiku_Anim_000600, // ENDAIKU2_ANIM_5
+ &object_daiku_Anim_001114, // ENDAIKU2_ANIM_6
+ &object_daiku_Anim_00B690, // ENDAIKU2_ANIM_7
+ &object_daiku_Anim_001A24, // ENDAIKU2_ANIM_8
+ &object_daiku_Anim_002134, // ENDAIKU2_ANIM_9
+ &object_daiku_Anim_00D328, // ENDAIKU2_ANIM_10
+};
+
+static u8 sAnimationModes[ENDAIKU2_ANIM_MAX] = {
+ ANIMMODE_LOOP, // ENDAIKU2_ANIM_0
+ ANIMMODE_LOOP, // ENDAIKU2_ANIM_1
+ ANIMMODE_LOOP, // ENDAIKU2_ANIM_2
+ ANIMMODE_LOOP, // ENDAIKU2_ANIM_3
+ ANIMMODE_ONCE, // ENDAIKU2_ANIM_4
+ ANIMMODE_LOOP, // ENDAIKU2_ANIM_5
+ ANIMMODE_LOOP, // ENDAIKU2_ANIM_6
+ ANIMMODE_LOOP, // ENDAIKU2_ANIM_7
+ ANIMMODE_LOOP, // ENDAIKU2_ANIM_8
+ ANIMMODE_ONCE, // ENDAIKU2_ANIM_9
+ ANIMMODE_LOOP, // ENDAIKU2_ANIM_10
+};
+
+void EnDaiku2_ChangeAnim(EnDaiku2* this, s32 animIndex) {
+ f32 playSpeed = 1.0f;
+
+ this->animIndex = animIndex;
+ this->animEndFrame = Animation_GetLastFrame(sAnimations[this->animIndex]);
+ if (this->animIndex == ENDAIKU2_ANIM_3) {
+ playSpeed = 2.0f;
}
- Animation_Change(&this->skelAnime, sAnimations[this->unk_276], sp34, 0.0f, this->unk_284, D_80BE7958[this->unk_276],
- -4.0f);
+ Animation_Change(&this->skelAnime, sAnimations[this->animIndex], playSpeed, 0.0f, this->animEndFrame,
+ sAnimationModes[this->animIndex], -4.0f);
}
s32 func_80BE64C0(EnDaiku2* this, PlayState* play) {
@@ -149,7 +185,7 @@ s32 func_80BE64C0(EnDaiku2* this, PlayState* play) {
Math_Vec3f_Copy(&this->actor.world.pos, &this->actor.home.pos);
bomb = (EnBom*)Actor_FindNearby(play, &this->actor, -1, ACTORCAT_EXPLOSIVES, BREG(7) + 240.0f);
Math_Vec3f_Copy(&this->actor.world.pos, &sp30);
- if ((this->unk_278 >= ENDAIKU2_GET_7F_0) && !Flags_GetSwitch(play, this->unk_278) && (bomb != NULL) &&
+ if ((this->switchFlag >= 0) && !Flags_GetSwitch(play, this->switchFlag) && (bomb != NULL) &&
(bomb->actor.id == ACTOR_EN_BOM)) {
if (!bomb->isPowderKeg) {
this->actor.textId = 0x32D3;
@@ -170,7 +206,7 @@ void func_80BE65B4(EnDaiku2* this, PlayState* play) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_64_02)) {
this->unk_28A = 6;
}
- func_80BE6408(this, 8);
+ EnDaiku2_ChangeAnim(this, ENDAIKU2_ANIM_8);
break;
case 1:
@@ -178,21 +214,24 @@ void func_80BE65B4(EnDaiku2* this, PlayState* play) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_64_04)) {
this->unk_28A = 7;
}
- func_80BE6408(this, 8);
+ EnDaiku2_ChangeAnim(this, ENDAIKU2_ANIM_8);
break;
case 2:
this->unk_28A = 4;
this->unk_264 = 1.0f;
- func_80BE6408(this, 10);
+ EnDaiku2_ChangeAnim(this, ENDAIKU2_ANIM_10);
+ break;
+
+ default:
break;
}
this->unk_264 = 1.0f;
- if ((this->unk_278 >= ENDAIKU2_GET_7F_0) && Flags_GetSwitch(play, this->unk_278)) {
+ if ((this->switchFlag >= 0) && Flags_GetSwitch(play, this->switchFlag)) {
this->unk_28A = 5;
- if (this->unk_276 != 10) {
- func_80BE6408(this, 10);
+ if (this->animIndex != ENDAIKU2_ANIM_10) {
+ EnDaiku2_ChangeAnim(this, ENDAIKU2_ANIM_10);
}
}
@@ -201,7 +240,7 @@ void func_80BE65B4(EnDaiku2* this, PlayState* play) {
}
void func_80BE66E4(EnDaiku2* this, PlayState* play) {
- f32 sp9C = this->skelAnime.curFrame;
+ f32 curFrame = this->skelAnime.curFrame;
s32 sp98 = gSaveContext.save.day - 1;
s32 i;
Vec3f sp88;
@@ -212,10 +251,10 @@ void func_80BE66E4(EnDaiku2* this, PlayState* play) {
Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.home.rot.y, 1, 0xBB8, 0x0);
if (sp98 != 2) {
- if ((this->unk_278 >= ENDAIKU2_GET_7F_0) && Flags_GetSwitch(play, this->unk_278)) {
+ if ((this->switchFlag >= 0) && Flags_GetSwitch(play, this->switchFlag)) {
this->unk_28A = 5;
- if (this->unk_276 != 10) {
- func_80BE6408(this, 10);
+ if (this->animIndex != ENDAIKU2_ANIM_10) {
+ EnDaiku2_ChangeAnim(this, ENDAIKU2_ANIM_10);
}
}
}
@@ -232,9 +271,9 @@ void func_80BE66E4(EnDaiku2* this, PlayState* play) {
return;
}
- func_800B8614(&this->actor, play, 80.0f);
- if ((this->unk_276 == 8) && Animation_OnFrame(&this->skelAnime, 6.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_ROCK_BROKEN);
+ Actor_OfferTalk(&this->actor, play, 80.0f);
+ if ((this->animIndex == ENDAIKU2_ANIM_8) && Animation_OnFrame(&this->skelAnime, 6.0f)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_ROCK_BROKEN);
for (i = 0; i < 10; i++) {
Math_Vec3f_Copy(&sp70, &this->actor.world.pos);
@@ -243,9 +282,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;
@@ -260,22 +299,22 @@ void func_80BE66E4(EnDaiku2* this, PlayState* play) {
temp_v0 = ABS_ALT(BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.home.rot.y));
if (temp_v0 > 0x2890) {
if (sp98 != 2) {
- if ((this->unk_276 == 5) || (this->unk_276 == 9)) {
- func_80BE6408(this, 10);
- } else if ((this->unk_276 == 10) && (this->unk_284 <= sp9C)) {
- this->unk_284 = Animation_GetLastFrame(&object_daiku_Anim_002134);
- Animation_Change(&this->skelAnime, &object_daiku_Anim_002134, -1.0f, this->unk_284, 0.0f, ANIMMODE_ONCE,
- -4.0f);
- this->unk_276 = 11;
- } else if ((this->unk_276 == 11) && (sp9C <= 0.0f)) {
- func_80BE6408(this, 8);
+ if ((this->animIndex == ENDAIKU2_ANIM_5) || (this->animIndex == ENDAIKU2_ANIM_9)) {
+ EnDaiku2_ChangeAnim(this, ENDAIKU2_ANIM_10);
+ } else if ((this->animIndex == ENDAIKU2_ANIM_10) && (curFrame >= this->animEndFrame)) {
+ this->animEndFrame = Animation_GetLastFrame(&object_daiku_Anim_002134);
+ Animation_Change(&this->skelAnime, &object_daiku_Anim_002134, -1.0f, this->animEndFrame, 0.0f,
+ ANIMMODE_ONCE, -4.0f);
+ this->animIndex = ENDAIKU2_ANIM_11;
+ } else if ((this->animIndex == ENDAIKU2_ANIM_11) && (curFrame <= 0.0f)) {
+ EnDaiku2_ChangeAnim(this, ENDAIKU2_ANIM_8);
}
}
} else if (sp98 != 2) {
- if ((this->unk_276 != 9) && (this->unk_276 != 10)) {
- func_80BE6408(this, 9);
- } else if ((this->unk_276 == 9) && (this->unk_284 <= sp9C)) {
- func_80BE6408(this, 10);
+ if ((this->animIndex != ENDAIKU2_ANIM_9) && (this->animIndex != ENDAIKU2_ANIM_10)) {
+ EnDaiku2_ChangeAnim(this, ENDAIKU2_ANIM_9);
+ } else if ((this->animIndex == ENDAIKU2_ANIM_9) && (curFrame >= this->animEndFrame)) {
+ EnDaiku2_ChangeAnim(this, ENDAIKU2_ANIM_10);
}
}
}
@@ -284,10 +323,10 @@ void func_80BE6B40(EnDaiku2* this, PlayState* play) {
s32 day = gSaveContext.save.day;
this->unk_288 = 1;
- if ((day != 3) && Flags_GetSwitch(play, this->unk_278)) {
+ if ((day != 3) && Flags_GetSwitch(play, this->switchFlag)) {
this->actionFunc = func_80BE6BC0;
} else {
- func_80BE6408(this, 5);
+ EnDaiku2_ChangeAnim(this, ENDAIKU2_ANIM_5);
this->actionFunc = func_80BE6BC0;
}
}
@@ -297,7 +336,7 @@ void func_80BE6BC0(EnDaiku2* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
s32 day = gSaveContext.save.day - 1;
- func_801477B4(play);
+ Message_CloseTextbox(play);
if (this->unk_288 == 2) {
this->actionFunc = func_80BE6D40;
@@ -305,7 +344,7 @@ void func_80BE6BC0(EnDaiku2* this, PlayState* play) {
this->actionFunc = func_80BE6EF0;
} else if ((this->unk_28A == 0) || (this->unk_28A == 2)) {
this->unk_28A++;
- func_80151938(play, sTextIds[this->unk_28A]);
+ Message_ContinueTextbox(play, sTextIds[this->unk_28A]);
} else {
switch (day) {
case 0:
@@ -315,6 +354,9 @@ void func_80BE6BC0(EnDaiku2* this, PlayState* play) {
case 1:
SET_WEEKEVENTREG(WEEKEVENTREG_64_04);
break;
+
+ default:
+ break;
}
func_80BE65B4(this, play);
}
@@ -322,7 +364,7 @@ void func_80BE6BC0(EnDaiku2* this, PlayState* play) {
}
void func_80BE6CFC(EnDaiku2* this) {
- func_80BE6408(this, 3);
+ EnDaiku2_ChangeAnim(this, ENDAIKU2_ANIM_3);
this->unk_288 = 2;
this->actionFunc = func_80BE6D40;
this->unk_264 = 0.0f;
@@ -342,26 +384,26 @@ 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;
}
func_80BE61D0(this);
}
- func_800B8614(&this->actor, play, 80.0f);
+ Actor_OfferTalk(&this->actor, play, 80.0f);
}
void func_80BE6EB0(EnDaiku2* this) {
- func_80BE6408(this, 2);
+ EnDaiku2_ChangeAnim(this, ENDAIKU2_ANIM_2);
this->unk_274 = 0;
this->unk_288 = 3;
this->actionFunc = func_80BE6EF0;
}
void func_80BE6EF0(EnDaiku2* this, PlayState* play) {
- f32 sp5C = this->skelAnime.curFrame;
+ f32 curFrame = this->skelAnime.curFrame;
s32 pad[4];
Vec3f sp40;
s16 var;
@@ -372,7 +414,7 @@ void func_80BE6EF0(EnDaiku2* this, PlayState* play) {
}
Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.home.rot.y, 1, 0xBB8, 0x0);
- if (this->unk_284 <= sp5C) {
+ if (curFrame >= this->animEndFrame) {
this->unk_274 = 1;
}
@@ -385,16 +427,16 @@ 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);
+ if (this->animIndex != ENDAIKU2_ANIM_3) {
+ EnDaiku2_ChangeAnim(this, ENDAIKU2_ANIM_3);
}
- if ((this->unk_278 >= ENDAIKU2_GET_7F_0) && Flags_GetSwitch(play, this->unk_278)) {
+ if ((this->switchFlag >= 0) && Flags_GetSwitch(play, this->switchFlag)) {
this->unk_28A = 5;
- if (this->unk_276 != 10) {
- func_80BE6408(this, 10);
+ if (this->animIndex != ENDAIKU2_ANIM_10) {
+ EnDaiku2_ChangeAnim(this, ENDAIKU2_ANIM_10);
}
func_80BE65B4(this, play);
return;
@@ -412,7 +454,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;
@@ -421,24 +463,24 @@ void func_80BE6EF0(EnDaiku2* this, PlayState* play) {
Math_Vec3f_Copy(&this->unk_268, &sp40);
}
}
- func_800B8614(&this->actor, play, 80.0f);
+ Actor_OfferTalk(&this->actor, play, 80.0f);
}
void func_80BE71A0(EnDaiku2* this) {
- func_80BE6408(this, 9);
+ EnDaiku2_ChangeAnim(this, ENDAIKU2_ANIM_9);
this->actionFunc = func_80BE71D8;
}
void func_80BE71D8(EnDaiku2* this, PlayState* play) {
- f32 currentFrame = this->skelAnime.curFrame;
+ f32 curFrame = this->skelAnime.curFrame;
if (func_80BE64C0(this, play)) {
func_80BE6CFC(this);
- } else if ((this->unk_276 == 9) && (this->unk_284 <= currentFrame)) {
- func_80BE6408(this, 0);
- } else if ((this->unk_276 == 0) && (this->unk_284 <= currentFrame)) {
- func_80BE6408(this, 5);
- } else if ((this->unk_276 == 5) && (this->unk_284 <= currentFrame)) {
+ } else if ((this->animIndex == ENDAIKU2_ANIM_9) && (curFrame >= this->animEndFrame)) {
+ EnDaiku2_ChangeAnim(this, ENDAIKU2_ANIM_0);
+ } else if ((this->animIndex == ENDAIKU2_ANIM_0) && (curFrame >= this->animEndFrame)) {
+ EnDaiku2_ChangeAnim(this, ENDAIKU2_ANIM_5);
+ } else if ((this->animIndex == ENDAIKU2_ANIM_5) && (curFrame >= this->animEndFrame)) {
func_80BE65B4(this, play);
}
}
@@ -453,7 +495,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,15 +508,15 @@ 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) {
+ if (limbIndex == OBJECT_DAIKU_LIMB_0E) {
Matrix_Scale(this->unk_260, this->unk_260, this->unk_260, 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_daiku_DL_009638);
}
- if (limbIndex == 15) {
+ if (limbIndex == OBJECT_DAIKU_LIMB_0F) {
gSPDisplayList(POLY_OPA_DISP++, object_daiku_DL_00A390);
}
@@ -484,7 +528,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 +549,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,12 +586,12 @@ 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);
+ objectIdx = Object_GetSlot(&play->objectCtx, OBJECT_BOMBIWA);
if ((objectIdx >= 0) && Object_IsLoaded(&play->objectCtx, objectIdx)) {
gDPPipeSync(POLY_OPA_DISP++);
- gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[objectIdx].segment);
+ gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[objectIdx].segment);
for (i = 0; i < ARRAY_COUNT(this->effects); i++, effect++) {
if (effect->isEnabled) {
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 f13b89611..c047b6577 100644
--- a/src/overlays/actors/ovl_En_Daiku2/z_en_daiku2.h
+++ b/src/overlays/actors/ovl_En_Daiku2/z_en_daiku2.h
@@ -2,20 +2,17 @@
#define Z_EN_DAIKU2_H
#include "global.h"
+#include "objects/object_daiku/object_daiku.h"
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_8000(thisx) (((thisx)->params >> 15) & 0x1);
+#define ENDAIKU2_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
+#define ENDAIKU2_GET_PATH_INDEX(thisx) (((thisx)->params >> 7) & 0x3F)
+#define ENDAIKU2_GET_8000(thisx) (((thisx)->params >> 15) & 0x1)
-enum {
- /* -1 */ ENDAIKU2_GET_7F_MINUS1 = -1,
- /* 0 */ ENDAIKU2_GET_7F_0,
- /* 127 */ ENDAIKU2_GET_7F_127 = 127,
-};
+#define ENDAIKU2_PATH_INDEX_NONE 0x3F
typedef struct EnDaiku2Effect {
/* 0x00 */ u8 isEnabled;
@@ -32,21 +29,21 @@ typedef struct EnDaiku2Effect {
typedef struct EnDaiku2 {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[17];
- /* 0x1EE */ Vec3s morphTable[17];
+ /* 0x188 */ Vec3s jointTable[OBJECT_DAIKU_LIMB_MAX];
+ /* 0x1EE */ Vec3s morphTable[OBJECT_DAIKU_LIMB_MAX];
/* 0x254 */ EnDaiku2ActionFunc actionFunc;
- /* 0x258 */ Path* unk_258;
+ /* 0x258 */ Path* path;
/* 0x25C */ s16 unk_25C;
/* 0x260 */ f32 unk_260;
/* 0x264 */ f32 unk_264;
/* 0x268 */ Vec3f unk_268;
/* 0x274 */ s16 unk_274;
- /* 0x276 */ s16 unk_276;
- /* 0x278 */ s16 unk_278;
- /* 0x27A */ s16 unk_27A;
+ /* 0x276 */ s16 animIndex;
+ /* 0x278 */ s16 switchFlag;
+ /* 0x27A */ s16 pathIndex;
/* 0x27C */ UNK_TYPE1 unk_27C[0x4];
/* 0x280 */ s32 unk_280;
- /* 0x284 */ f32 unk_284;
+ /* 0x284 */ f32 animEndFrame;
/* 0x288 */ s16 unk_288;
/* 0x28A */ s16 unk_28A;
/* 0x28C */ EnDaiku2Effect effects[EN_DAIKU2_EFFECT_COUNT];
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..ca7fd6a3b 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_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_IGNORE_QUAKE)
#define THIS ((EnDeath*)thisx)
@@ -133,7 +133,7 @@ static InitChainEntry D_808C9A60[] = {
ICHAIN_VEC3F(scale, 0, ICHAIN_CONTINUE),
ICHAIN_S8(hintId, TATL_HINT_ID_GOMESS, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 6000, ICHAIN_CONTINUE),
- ICHAIN_U8(targetMode, 5, ICHAIN_STOP),
+ ICHAIN_U8(targetMode, TARGET_MODE_5, ICHAIN_STOP),
};
#endif
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 93d495267..aa0b0ff5f 100644
--- a/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.c
+++ b/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.c
@@ -5,8 +5,11 @@
*/
#include "z_en_dekubaba.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
+#include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_400)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_400)
#define THIS ((EnDekubaba*)thisx)
@@ -15,23 +18,31 @@ void EnDekubaba_Destroy(Actor* thisx, PlayState* play);
void EnDekubaba_Update(Actor* thisx, PlayState* play);
void EnDekubaba_Draw(Actor* thisx, PlayState* play);
-void func_808B1B14(EnDekubaba* this, PlayState* play);
-void func_808B1CF0(EnDekubaba* this, PlayState* play);
-void func_808B2240(EnDekubaba* this, PlayState* play);
-void func_808B2660(EnDekubaba* this, PlayState* play);
-void func_808B28B4(EnDekubaba* this, PlayState* play);
-void func_808B29C4(EnDekubaba* this, PlayState* play);
-void func_808B2CB8(EnDekubaba* this, PlayState* play);
-void func_808B3078(EnDekubaba* this, PlayState* play);
-void func_808B3280(EnDekubaba* this, PlayState* play);
-void func_808B3404(EnDekubaba* this, PlayState* play);
-void func_808B37E8(EnDekubaba* this, PlayState* play);
-void func_808B3B48(EnDekubaba* this, PlayState* play);
-void func_808B3C50(EnDekubaba* this, PlayState* play);
-void func_808B3DA8(EnDekubaba* this, PlayState* play);
-void func_808B3EE8(EnDekubaba* this, PlayState* play);
+void EnDekubaba_SetupWait(EnDekubaba* this);
+void EnDekubaba_Wait(EnDekubaba* this, PlayState* play);
+void EnDekubaba_SetupGrow(EnDekubaba* this);
+void EnDekubaba_Grow(EnDekubaba* this, PlayState* play);
+void EnDekubaba_SetupRetract(EnDekubaba* this);
+void EnDekubaba_Retract(EnDekubaba* this, PlayState* play);
+void EnDekubaba_DecideLunge(EnDekubaba* this, PlayState* play);
+void EnDekubaba_SetupPrepareLunge(EnDekubaba* this);
+void EnDekubaba_PrepareLunge(EnDekubaba* this, PlayState* play);
+void EnDekubaba_SetupLunge(EnDekubaba* this);
+void EnDekubaba_Lunge(EnDekubaba* this, PlayState* play);
+void EnDekubaba_SetupPullBack(EnDekubaba* this);
+void EnDekubaba_PullBack(EnDekubaba* this, PlayState* play);
+void EnDekubaba_Recover(EnDekubaba* this, PlayState* play);
+void EnDekubaba_Hit(EnDekubaba* this, PlayState* play);
+void EnDekubaba_PrunedSomersaultDie(EnDekubaba* this, PlayState* play);
+void EnDekubaba_SetupShrinkDie(EnDekubaba* this);
+void EnDekubaba_ShrinkDie(EnDekubaba* this, PlayState* play);
+void EnDekubaba_SetupStunnedVertical(EnDekubaba* this);
+void EnDekubaba_StunnedVertical(EnDekubaba* this, PlayState* play);
+void EnDekubaba_Sway(EnDekubaba* this, PlayState* play);
+void EnDekubaba_Frozen(EnDekubaba* this, PlayState* play);
+void EnDekubaba_SetupDeadStickDrop(EnDekubaba* this, PlayState* play);
+void EnDekubaba_DeadStickDrop(EnDekubaba* this, PlayState* play);
-#if 0
ActorInit En_Dekubaba_InitVars = {
ACTOR_EN_DEKUBABA,
ACTORCAT_ENEMY,
@@ -44,188 +55,1334 @@ ActorInit En_Dekubaba_InitVars = {
(ActorFunc)EnDekubaba_Draw,
};
-// static ColliderJntSphElementInit sJntSphElementsInit[7] = {
-static ColliderJntSphElementInit D_808B4D60[7] = {
+static ColliderJntSphElementInit sJntSphElementsInit[7] = {
{
- { ELEMTYPE_UNK0, { 0xF7CFFFFF, 0x00, 0x08 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_HARD, BUMP_ON | BUMP_HOOKABLE, OCELEM_ON, },
+ {
+ ELEMTYPE_UNK0,
+ { 0xF7CFFFFF, 0x00, 0x08 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_ON | TOUCH_SFX_HARD,
+ BUMP_ON | BUMP_HOOKABLE,
+ OCELEM_ON,
+ },
{ 1, { { 0, 100, 1000 }, 15 }, 100 },
},
{
- { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_NONE, OCELEM_ON, },
+ {
+ ELEMTYPE_UNK0,
+ { 0x00000000, 0x00, 0x00 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_NONE,
+ OCELEM_ON,
+ },
{ 51, { { 0, 0, 1500 }, 8 }, 100 },
},
{
- { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_NONE, OCELEM_NONE, },
+ {
+ ELEMTYPE_UNK0,
+ { 0x00000000, 0x00, 0x00 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_NONE,
+ OCELEM_NONE,
+ },
{ 52, { { 0, 0, 500 }, 8 }, 100 },
},
{
- { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_NONE, OCELEM_NONE, },
+ {
+ ELEMTYPE_UNK0,
+ { 0x00000000, 0x00, 0x00 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_NONE,
+ OCELEM_NONE,
+ },
{ 53, { { 0, 0, 1500 }, 8 }, 100 },
},
{
- { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_NONE, OCELEM_NONE, },
+ {
+ ELEMTYPE_UNK0,
+ { 0x00000000, 0x00, 0x00 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_NONE,
+ OCELEM_NONE,
+ },
{ 54, { { 0, 0, 500 }, 8 }, 100 },
},
{
- { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_NONE, OCELEM_NONE, },
+ {
+ ELEMTYPE_UNK0,
+ { 0x00000000, 0x00, 0x00 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_NONE,
+ OCELEM_NONE,
+ },
{ 55, { { 0, 0, 1500 }, 8 }, 100 },
},
{
- { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_NONE, OCELEM_NONE, },
+ {
+ ELEMTYPE_UNK0,
+ { 0x00000000, 0x00, 0x00 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_NONE,
+ OCELEM_NONE,
+ },
{ 56, { { 0, 0, 500 }, 8 }, 100 },
},
};
-// static ColliderJntSphInit sJntSphInit = {
-static ColliderJntSphInit D_808B4E5C = {
- { COLTYPE_HIT6, AT_ON | AT_TYPE_ENEMY, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_JNTSPH, },
- ARRAY_COUNT(sJntSphElementsInit), D_808B4D60, // sJntSphElementsInit,
+static ColliderJntSphInit sJntSphInit = {
+ {
+ COLTYPE_HIT6,
+ AT_ON | AT_TYPE_ENEMY,
+ AC_ON | AC_TYPE_PLAYER,
+ OC1_ON | OC1_TYPE_ALL,
+ OC2_TYPE_1,
+ COLSHAPE_JNTSPH,
+ },
+ ARRAY_COUNT(sJntSphElementsInit),
+ sJntSphElementsInit,
};
-// sColChkInfoInit
-static CollisionCheckInfoInit D_808B4E6C = { 2, 25, 25, MASS_IMMOVABLE };
+static CollisionCheckInfoInit sColChkInfoInit = { 2, 25, 25, MASS_IMMOVABLE };
-// static DamageTable sDamageTable = {
-static DamageTable D_808B4E74 = {
- /* 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, 0xF),
- /* Normal arrow */ DMG_ENTRY(3, 0x0),
- /* UNK_DMG_0x06 */ DMG_ENTRY(0, 0x0),
- /* Hookshot */ DMG_ENTRY(0, 0xD),
- /* Goron punch */ DMG_ENTRY(2, 0x0),
- /* Sword */ DMG_ENTRY(1, 0xF),
- /* Goron pound */ DMG_ENTRY(4, 0x0),
- /* Fire arrow */ DMG_ENTRY(1, 0x2),
- /* Ice arrow */ DMG_ENTRY(3, 0x3),
- /* Light arrow */ DMG_ENTRY(3, 0x4),
- /* Goron spikes */ DMG_ENTRY(1, 0x0),
- /* Deku spin */ DMG_ENTRY(1, 0xF),
- /* Deku bubble */ DMG_ENTRY(3, 0x0),
- /* Deku launch */ DMG_ENTRY(2, 0x0),
- /* UNK_DMG_0x12 */ DMG_ENTRY(0, 0x1),
- /* Zora barrier */ DMG_ENTRY(0, 0x5),
- /* Normal shield */ DMG_ENTRY(0, 0x0),
- /* Light ray */ DMG_ENTRY(0, 0x0),
- /* Thrown object */ DMG_ENTRY(1, 0x0),
- /* Zora punch */ DMG_ENTRY(1, 0x0),
- /* Spin attack */ DMG_ENTRY(1, 0xF),
- /* 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),
+typedef enum {
+ /* 0x0 */ DEKUBABA_DMGEFF_NONE,
+ /* 0x1 */ DEKUBABA_DMGEFF_NUT,
+ /* 0x2 */ DEKUBABA_DMGEFF_FIRE,
+ /* 0x3 */ DEKUBABA_DMGEFF_ICE,
+ /* 0x4 */ DEKUBABA_DMGEFF_LIGHT,
+ /* 0x5 */ DEKUBABA_DMGEFF_ELECTRIC,
+ /* 0xD */ DEKUBABA_DMGEFF_HOOKSHOT = 0xD,
+ /* 0xF */ DEKUBABA_DMGEFF_CUT = 0xF
+} DekuBabaDamageEffect;
+
+static DamageTable sDamageTable = {
+ /* Deku Nut */ DMG_ENTRY(0, DEKUBABA_DMGEFF_NUT),
+ /* Deku Stick */ DMG_ENTRY(3, DEKUBABA_DMGEFF_NONE),
+ /* Horse trample */ DMG_ENTRY(1, DEKUBABA_DMGEFF_NONE),
+ /* Explosives */ DMG_ENTRY(1, DEKUBABA_DMGEFF_NONE),
+ /* Zora boomerang */ DMG_ENTRY(1, DEKUBABA_DMGEFF_CUT),
+ /* Normal arrow */ DMG_ENTRY(3, DEKUBABA_DMGEFF_NONE),
+ /* UNK_DMG_0x06 */ DMG_ENTRY(0, DEKUBABA_DMGEFF_NONE),
+ /* Hookshot */ DMG_ENTRY(0, DEKUBABA_DMGEFF_HOOKSHOT),
+ /* Goron punch */ DMG_ENTRY(2, DEKUBABA_DMGEFF_NONE),
+ /* Sword */ DMG_ENTRY(1, DEKUBABA_DMGEFF_CUT),
+ /* Goron pound */ DMG_ENTRY(4, DEKUBABA_DMGEFF_NONE),
+ /* Fire arrow */ DMG_ENTRY(1, DEKUBABA_DMGEFF_FIRE),
+ /* Ice arrow */ DMG_ENTRY(3, DEKUBABA_DMGEFF_ICE),
+ /* Light arrow */ DMG_ENTRY(3, DEKUBABA_DMGEFF_LIGHT),
+ /* Goron spikes */ DMG_ENTRY(1, DEKUBABA_DMGEFF_NONE),
+ /* Deku spin */ DMG_ENTRY(1, DEKUBABA_DMGEFF_CUT),
+ /* Deku bubble */ DMG_ENTRY(3, DEKUBABA_DMGEFF_NONE),
+ /* Deku launch */ DMG_ENTRY(2, DEKUBABA_DMGEFF_NONE),
+ /* UNK_DMG_0x12 */ DMG_ENTRY(0, DEKUBABA_DMGEFF_NUT),
+ /* Zora barrier */ DMG_ENTRY(0, DEKUBABA_DMGEFF_ELECTRIC),
+ /* Normal shield */ DMG_ENTRY(0, DEKUBABA_DMGEFF_NONE),
+ /* Light ray */ DMG_ENTRY(0, DEKUBABA_DMGEFF_NONE),
+ /* Thrown object */ DMG_ENTRY(1, DEKUBABA_DMGEFF_NONE),
+ /* Zora punch */ DMG_ENTRY(1, DEKUBABA_DMGEFF_NONE),
+ /* Spin attack */ DMG_ENTRY(1, DEKUBABA_DMGEFF_CUT),
+ /* Sword beam */ DMG_ENTRY(0, DEKUBABA_DMGEFF_NONE),
+ /* Normal Roll */ DMG_ENTRY(0, DEKUBABA_DMGEFF_NONE),
+ /* UNK_DMG_0x1B */ DMG_ENTRY(0, DEKUBABA_DMGEFF_NONE),
+ /* UNK_DMG_0x1C */ DMG_ENTRY(0, DEKUBABA_DMGEFF_NONE),
+ /* Unblockable */ DMG_ENTRY(0, DEKUBABA_DMGEFF_NONE),
+ /* UNK_DMG_0x1E */ DMG_ENTRY(0, DEKUBABA_DMGEFF_NONE),
+ /* Powder Keg */ DMG_ENTRY(1, DEKUBABA_DMGEFF_NONE),
};
-// static InitChainEntry sInitChain[] = {
-static InitChainEntry D_808B4E94[] = {
+static InitChainEntry sInitChain[] = {
ICHAIN_F32(targetArrowOffset, 1500, ICHAIN_STOP),
};
-#endif
+void EnDekubaba_Init(Actor* thisx, PlayState* play) {
+ EnDekubaba* this = THIS;
+ s32 i;
-extern ColliderJntSphElementInit D_808B4D60[7];
-extern ColliderJntSphInit D_808B4E5C;
-extern CollisionCheckInfoInit D_808B4E6C;
-extern DamageTable D_808B4E74;
-extern InitChainEntry D_808B4E94[];
+ Actor_ProcessInitChain(&this->actor, sInitChain);
+ ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 22.0f);
+ SkelAnime_Init(play, &this->skelAnime, &gDekuBabaSkel, &gDekuBabaFastChompAnim, this->jointTable, this->morphTable,
+ DEKUBABA_LIMB_MAX);
+ Collider_InitAndSetJntSph(play, &this->collider, &this->actor, &sJntSphInit, this->colliderElements);
+ CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
-extern UNK_TYPE D_06000208;
-extern UNK_TYPE D_060002B8;
-extern UNK_TYPE D_060010F0;
-extern UNK_TYPE D_06001330;
-extern UNK_TYPE D_06001828;
+ if (this->actor.params == DEKUBABA_BIG) {
+ this->size = 2.5f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/EnDekubaba_Init.s")
+ for (i = 0; i < sJntSphInit.count; i++) {
+ this->collider.elements[i].dim.worldSphere.radius = this->collider.elements[i].dim.modelSphere.radius =
+ (sJntSphElementsInit[i].dim.modelSphere.radius * 2.50f);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/EnDekubaba_Destroy.s")
+ this->actor.colChkInfo.health = 4;
+ // Big Deku Baba hint does not exist in MM
+ this->actor.hintId = TATL_HINT_ID_BIO_DEKU_BABA;
+ this->actor.targetMode = TARGET_MODE_2;
+ } else {
+ this->size = 1.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B1530.s")
+ for (i = 0; i < sJntSphInit.count; i++) {
+ this->collider.elements[i].dim.worldSphere.radius = this->collider.elements[i].dim.modelSphere.radius;
+ }
+ this->actor.hintId = TATL_HINT_ID_DEKU_BABA;
+ this->actor.targetMode = TARGET_MODE_1;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B15B8.s")
+ EnDekubaba_SetupWait(this);
+ this->timer = 0;
+ this->boundFloor = NULL;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B16BC.s")
+void EnDekubaba_Destroy(Actor* thisx, PlayState* play) {
+ EnDekubaba* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B1798.s")
+ Collider_DestroyJntSph(play, &this->collider);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B1814.s")
+void EnDekubaba_DisableHitboxes(EnDekubaba* this) {
+ s32 i;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B18A8.s")
+ for (i = 1; i < ARRAY_COUNT(this->colliderElements); i++) {
+ this->collider.elements[i].info.bumperFlags &= ~BUMP_ON;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B1B14.s")
+void EnDekubaba_UpdateHeadPosition(EnDekubaba* this) {
+ f32 horizontalHeadShift = (Math_CosS(this->stemSectionAngle[0]) + Math_CosS(this->stemSectionAngle[1]) +
+ Math_CosS(this->stemSectionAngle[2])) *
+ 20.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B1BC0.s")
+ this->actor.world.pos.x =
+ this->actor.home.pos.x + Math_SinS(this->actor.shape.rot.y) * (horizontalHeadShift * this->size);
+ this->actor.world.pos.y =
+ this->actor.home.pos.y - (Math_SinS(this->stemSectionAngle[0]) + Math_SinS(this->stemSectionAngle[1]) +
+ Math_SinS(this->stemSectionAngle[2])) *
+ 20.0f * this->size;
+ this->actor.world.pos.z =
+ this->actor.home.pos.z + Math_CosS(this->actor.shape.rot.y) * (horizontalHeadShift * this->size);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B1CF0.s")
+void EnDekubaba_SetFireLightEffects(EnDekubaba* this, PlayState* play, s32 index) {
+ ColliderJntSphElement* sphElement;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B2158.s")
+ if (this->actor.colChkInfo.damageEffect == DEKUBABA_DMGEFF_FIRE) {
+ this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
+ this->drawDmgEffScale = 0.75f;
+ this->drawDmgEffAlpha = 4.0f;
+ } else if (this->actor.colChkInfo.damageEffect == DEKUBABA_DMGEFF_LIGHT) {
+ this->drawDmgEffType = ACTOR_DRAW_DMGEFF_LIGHT_ORBS;
+ this->drawDmgEffScale = 0.75f;
+ this->drawDmgEffAlpha = 4.0f;
+ sphElement = &this->collider.elements[index];
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, sphElement->info.bumper.hitPos.x,
+ sphElement->info.bumper.hitPos.y, sphElement->info.bumper.hitPos.z, 0, 0, 0,
+ CLEAR_TAG_PARAMS(CLEAR_TAG_SMALL_LIGHT_RAYS));
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B2240.s")
+void EnDekubaba_SetFrozenEffects(EnDekubaba* this) {
+ this->drawDmgEffScale = 0.75f;
+ this->drawDmgEffFrozenSteamScale = 1.125f;
+ this->drawDmgEffAlpha = 1.0f;
+ this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX;
+ this->collider.base.colType = COLTYPE_HIT3;
+ this->timer = 80;
+ this->actor.flags &= ~ACTOR_FLAG_400;
+ Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 80);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B2608.s")
+void EnDekubaba_SpawnIceEffects(EnDekubaba* this, PlayState* play) {
+ if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
+ this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
+ this->collider.base.colType = COLTYPE_HIT6;
+ this->drawDmgEffAlpha = 0.0f;
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, DEKUBABA_BODYPART_MAX, 4, this->size * 0.3f,
+ this->size * 0.2f);
+ this->actor.flags |= ACTOR_FLAG_400;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B2660.s")
+void EnDekubaba_SetupWait(EnDekubaba* this) {
+ s32 i;
+ ColliderJntSphElement* element;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B2890.s")
+ this->actor.shape.rot.x = -0x4000;
+ this->stemSectionAngle[0] = this->stemSectionAngle[1] = this->stemSectionAngle[2] = this->actor.shape.rot.x;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B28B4.s")
+ this->actor.world.pos.x = this->actor.home.pos.x;
+ this->actor.world.pos.z = this->actor.home.pos.z;
+ this->actor.world.pos.y = this->actor.home.pos.y + 14.0f * this->size;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B2980.s")
+ Actor_SetScale(&this->actor, this->size * 0.01f * 0.5f);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B29C4.s")
+ this->collider.base.colType = COLTYPE_HARD;
+ this->collider.base.acFlags |= AC_HARD;
+ this->timer = 45;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B2C40.s")
+ for (i = 1; i < ARRAY_COUNT(this->colliderElements); i++) {
+ element = &this->collider.elements[i];
+ element->dim.worldSphere.center.x = this->actor.world.pos.x;
+ element->dim.worldSphere.center.y = (s32)this->actor.world.pos.y - 7;
+ element->dim.worldSphere.center.z = this->actor.world.pos.z;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B2CB8.s")
+ this->actionFunc = EnDekubaba_Wait;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B3044.s")
+void EnDekubaba_Wait(EnDekubaba* this, PlayState* play) {
+ if (this->timer != 0) {
+ this->timer--;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B3078.s")
+ this->actor.world.pos.x = this->actor.home.pos.x;
+ this->actor.world.pos.z = this->actor.home.pos.z;
+ this->actor.world.pos.y = this->actor.home.pos.y + 14.0f * this->size;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B3170.s")
+ if ((this->timer == 0) && (this->actor.xzDistToPlayer < (200.0f * this->size)) &&
+ (fabsf(this->actor.playerHeightRel) < 30.0f * this->size)) {
+ EnDekubaba_SetupGrow(this);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B3280.s")
+void EnDekubaba_SetupGrow(EnDekubaba* this) {
+ s32 i;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B3390.s")
+ Animation_Change(&this->skelAnime, &gDekuBabaFastChompAnim,
+ Animation_GetLastFrame(&gDekuBabaFastChompAnim) * (1.0f / 15), 0.0f,
+ Animation_GetLastFrame(&gDekuBabaFastChompAnim), ANIMMODE_ONCE, 0.0f);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B3404.s")
+ this->timer = 15;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B3768.s")
+ for (i = 2; i < ARRAY_COUNT(this->colliderElements); i++) {
+ this->collider.elements[i].info.ocElemFlags |= OCELEM_ON;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B37E8.s")
+ this->collider.base.colType = COLTYPE_HIT6;
+ this->collider.base.acFlags &= ~AC_HARD;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEKU_WAKEUP);
+ this->actionFunc = EnDekubaba_Grow;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B39AC.s")
+void EnDekubaba_Grow(EnDekubaba* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+ f32 headDistHorizontal;
+ f32 headDistVertical;
+ f32 headShiftX;
+ f32 headShiftZ;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B3B48.s")
+ if (this->timer != 0) {
+ this->timer--;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B3BE4.s")
+ SkelAnime_Update(&this->skelAnime);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B3C50.s")
+ this->actor.scale.x = this->actor.scale.y = this->actor.scale.z =
+ this->size * 0.01f * (0.5f + (15 - this->timer) * 0.5f / 15.0f);
+ Math_ScaledStepToS(&this->actor.shape.rot.x, 0x1800, 0x800);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B3D74.s")
+ headDistVertical = Math_SinF(CLAMP_MAX((15 - this->timer) * (1.0f / 15), 0.7f) * M_PI) * 32.0f + 14.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B3DA8.s")
+ if (this->actor.shape.rot.x < -0x38E3) {
+ headDistHorizontal = 0.0f;
+ } else if (this->actor.shape.rot.x < -0x238E) {
+ Math_ScaledStepToS(&this->stemSectionAngle[0], -0x5555, 0x38E);
+ headDistHorizontal = Math_CosS(this->stemSectionAngle[0]) * 20.0f;
+ } else if (this->actor.shape.rot.x < -0xE38) {
+ Math_ScaledStepToS(&this->stemSectionAngle[0], -0xAAA, 0x38E);
+ Math_ScaledStepToS(&this->stemSectionAngle[1], -0x5555, 0x38E);
+ Math_ScaledStepToS(&this->stemSectionAngle[2], -0x5555, 0x222);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B3E40.s")
+ headDistHorizontal = 20.0f * (Math_CosS(this->stemSectionAngle[0]) + Math_CosS(this->stemSectionAngle[1])) +
+ (headDistVertical -
+ 20.0f * (-Math_SinS(this->stemSectionAngle[0]) - Math_SinS(this->stemSectionAngle[1]))) *
+ Math_CosS(this->stemSectionAngle[2]) / -Math_SinS(this->stemSectionAngle[2]);
+ } else {
+ Math_ScaledStepToS(&this->stemSectionAngle[0], -0xAAA, 0x38E);
+ Math_ScaledStepToS(&this->stemSectionAngle[1], -0x31C7, 0x222);
+ Math_ScaledStepToS(&this->stemSectionAngle[2], -0x5555, 0x222);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B3EE8.s")
+ headDistHorizontal = 20.0f * (Math_CosS(this->stemSectionAngle[0]) + Math_CosS(this->stemSectionAngle[1])) +
+ (headDistVertical -
+ 20.0f * (-Math_SinS(this->stemSectionAngle[0]) - Math_SinS(this->stemSectionAngle[1]))) *
+ Math_CosS(this->stemSectionAngle[2]) / -Math_SinS(this->stemSectionAngle[2]);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B3F50.s")
+ if (this->timer < 10) {
+ Math_ApproachS(&this->actor.shape.rot.y, Math_Vec3f_Yaw(&this->actor.home.pos, &player->actor.world.pos), 2,
+ 0xE38);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/EnDekubaba_Update.s")
+ this->actor.world.pos.y = this->actor.home.pos.y + (headDistVertical * this->size);
+ //! FAKE:
+ headShiftX = headDistHorizontal;
+ headShiftX = headShiftX * this->size * Math_SinS(this->actor.shape.rot.y);
+ headShiftZ = headDistHorizontal;
+ headShiftZ = headShiftZ * this->size * Math_CosS(this->actor.shape.rot.y);
+ this->actor.world.pos.x = this->actor.home.pos.x + headShiftX;
+ this->actor.world.pos.z = this->actor.home.pos.z + headShiftZ;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B4548.s")
+ EffectSsHahen_SpawnBurst(play, &this->actor.home.pos, this->size * 3.0f, 0, this->size * 12.0f, this->size * 5.0f,
+ 1, HAHEN_OBJECT_DEFAULT, 10, NULL);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B465C.s")
+ if (this->timer == 0) {
+ if (Math_Vec3f_DistXZ(&this->actor.home.pos, &player->actor.world.pos) < (240.0f * this->size)) {
+ EnDekubaba_SetupPrepareLunge(this);
+ } else {
+ EnDekubaba_SetupRetract(this);
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B48FC.s")
+void EnDekubaba_SetupRetract(EnDekubaba* this) {
+ s32 i;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B49C8.s")
+ Animation_Change(&this->skelAnime, &gDekuBabaFastChompAnim, -1.5f, Animation_GetLastFrame(&gDekuBabaFastChompAnim),
+ 0.0f, ANIMMODE_ONCE, -3.0f);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/func_808B4ABC.s")
+ this->timer = 15;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dekubaba/EnDekubaba_Draw.s")
+ for (i = 2; i < ARRAY_COUNT(this->colliderElements); i++) {
+ this->collider.elements[i].info.ocElemFlags &= ~OCELEM_ON;
+ }
+
+ this->actionFunc = EnDekubaba_Retract;
+}
+
+void EnDekubaba_Retract(EnDekubaba* this, PlayState* play) {
+ f32 headDistHorizontal;
+ f32 headDistVertical;
+ f32 xShift;
+ f32 zShift;
+
+ if (this->timer != 0) {
+ this->timer--;
+ }
+
+ SkelAnime_Update(&this->skelAnime);
+
+ this->actor.scale.x = this->actor.scale.y = this->actor.scale.z =
+ this->size * 0.01f * (0.5f + this->timer * (1.0f / 30));
+ Math_ScaledStepToS(&this->actor.shape.rot.x, -0x4000, 0x300);
+
+ 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;
+ } else if (this->actor.shape.rot.x < -0x238E) {
+ Math_ScaledStepToS(&this->stemSectionAngle[0], -0x4000, 0x555);
+ headDistHorizontal = Math_CosS(this->stemSectionAngle[0]) * 20.0f;
+ } else if (this->actor.shape.rot.x < -0xE38) {
+ Math_ScaledStepToS(&this->stemSectionAngle[0], -0x5555, 0x555);
+ Math_ScaledStepToS(&this->stemSectionAngle[1], -0x4000, 0x555);
+ Math_ScaledStepToS(&this->stemSectionAngle[2], -0x4000, 0x333);
+
+ headDistHorizontal = 20.0f * (Math_CosS(this->stemSectionAngle[0]) + Math_CosS(this->stemSectionAngle[1])) +
+ (headDistVertical -
+ 20.0f * (-Math_SinS(this->stemSectionAngle[0]) - Math_SinS(this->stemSectionAngle[1]))) *
+ Math_CosS(this->stemSectionAngle[2]) / -Math_SinS(this->stemSectionAngle[2]);
+ } else {
+ Math_ScaledStepToS(&this->stemSectionAngle[0], -0x5555, 0x555);
+ Math_ScaledStepToS(&this->stemSectionAngle[1], -0x5555, 0x333);
+ Math_ScaledStepToS(&this->stemSectionAngle[2], -0x4000, 0x333);
+
+ headDistHorizontal = 20.0f * (Math_CosS(this->stemSectionAngle[0]) + Math_CosS(this->stemSectionAngle[1])) +
+ (headDistVertical -
+ 20.0f * (-Math_SinS(this->stemSectionAngle[0]) - Math_SinS(this->stemSectionAngle[1]))) *
+ Math_CosS(this->stemSectionAngle[2]) / -Math_SinS(this->stemSectionAngle[2]);
+ }
+
+ this->actor.world.pos.y = this->actor.home.pos.y + (headDistVertical * this->size);
+ xShift = headDistHorizontal * this->size * Math_SinS(this->actor.shape.rot.y);
+ zShift = headDistHorizontal * this->size * Math_CosS(this->actor.shape.rot.y);
+ this->actor.world.pos.x = this->actor.home.pos.x + xShift;
+ this->actor.world.pos.z = this->actor.home.pos.z + zShift;
+
+ EffectSsHahen_SpawnBurst(play, &this->actor.home.pos, this->size * 3.0f, 0, this->size * 12.0f, this->size * 5.0f,
+ 1, HAHEN_OBJECT_DEFAULT, 10, NULL);
+ if (this->timer == 0) {
+ EnDekubaba_SetupWait(this);
+ }
+}
+
+void EnDekubaba_SetupDecideLunge(EnDekubaba* this) {
+ this->timer = Animation_GetLastFrame(&gDekuBabaFastChompAnim) * 2;
+ Animation_MorphToLoop(&this->skelAnime, &gDekuBabaFastChompAnim, -3.0f);
+ this->actionFunc = EnDekubaba_DecideLunge;
+}
+
+void EnDekubaba_DecideLunge(EnDekubaba* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+
+ SkelAnime_Update(&this->skelAnime);
+ if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 12.0f)) {
+ if (this->actor.params == DEKUBABA_BIG) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEKU_MOUTH);
+ } else {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MIZUBABA1_MOUTH);
+ }
+ }
+
+ if (this->timer != 0) {
+ this->timer--;
+ }
+
+ Math_ApproachS(&this->actor.shape.rot.y, Math_Vec3f_Yaw(&this->actor.home.pos, &player->actor.world.pos), 2,
+ (this->timer % 5) * 0x222);
+
+ if (this->timer < 10) {
+ this->stemSectionAngle[0] += 0x16C;
+ this->stemSectionAngle[1] += 0x16C;
+ this->stemSectionAngle[2] += 0xB6;
+ this->actor.shape.rot.x += 0x222;
+ } else if (this->timer < 20) {
+ this->stemSectionAngle[0] -= 0x16C;
+ this->stemSectionAngle[1] += 0x111;
+ this->actor.shape.rot.x += 0x16C;
+ } else if (this->timer < 30) {
+ this->stemSectionAngle[1] -= 0x111;
+ this->actor.shape.rot.x -= 0xB6;
+ } else {
+ this->stemSectionAngle[1] -= 0xB6;
+ this->stemSectionAngle[2] += 0xB6;
+ this->actor.shape.rot.x -= 0x16C;
+ }
+
+ EnDekubaba_UpdateHeadPosition(this);
+
+ if ((240.0f * this->size) < Math_Vec3f_DistXZ(&this->actor.home.pos, &player->actor.world.pos)) {
+ EnDekubaba_SetupRetract(this);
+ } else if ((this->timer == 0) || (this->actor.xzDistToPlayer < (80.0f * this->size))) {
+ EnDekubaba_SetupPrepareLunge(this);
+ }
+}
+
+void EnDekubaba_SetupPrepareLunge(EnDekubaba* this) {
+ this->timer = 8;
+ this->skelAnime.playSpeed = 0.0f;
+ this->actionFunc = EnDekubaba_PrepareLunge;
+}
+
+void EnDekubaba_PrepareLunge(EnDekubaba* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+
+ if (this->timer != 0) {
+ this->timer--;
+ }
+
+ Math_SmoothStepToS(&this->actor.shape.rot.x, 0x1800, 2, 0xE38, 0x71C);
+ Math_ApproachS(&this->actor.shape.rot.y, Math_Vec3f_Yaw(&this->actor.home.pos, &player->actor.world.pos), 2, 0xE38);
+ Math_ScaledStepToS(this->stemSectionAngle, 0xAAA, 0x444);
+ Math_ScaledStepToS(&this->stemSectionAngle[1], -0x4718, 0x888);
+ Math_ScaledStepToS(&this->stemSectionAngle[2], -0x6AA4, 0x888);
+
+ if (this->timer == 0) {
+ EnDekubaba_SetupLunge(this);
+ }
+
+ EnDekubaba_UpdateHeadPosition(this);
+}
+
+void EnDekubaba_SetupLunge(EnDekubaba* this) {
+ Animation_PlayOnce(&this->skelAnime, &gDekuBabaPauseChompAnim);
+ this->timer = 0;
+ this->actionFunc = EnDekubaba_Lunge;
+}
+
+void EnDekubaba_Lunge(EnDekubaba* this, PlayState* play) {
+ static Color_RGBA8 sDustPrimColor = { 105, 255, 105, 255 };
+ static Color_RGBA8 sDustEnvColor = { 150, 250, 150, 0 };
+ s32 allStepsDone;
+ s16 curFrame10;
+ Vec3f velocity;
+
+ SkelAnime_Update(&this->skelAnime);
+
+ if (this->timer == 0) {
+ if (Animation_OnFrame(&this->skelAnime, 1.0f)) {
+ if (this->actor.params == DEKUBABA_BIG) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEKU_ATTACK);
+ } else {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MIZUBABA1_ATTACK);
+ }
+ }
+
+ Math_ScaledStepToS(&this->actor.shape.rot.x, 0, 0x222);
+
+ curFrame10 = (s32)(this->skelAnime.curFrame * 10.0f);
+
+ allStepsDone = true;
+ allStepsDone &= Math_ScaledStepToS(&this->stemSectionAngle[0], -0xE38, curFrame10 + 0x38E);
+ allStepsDone &= Math_ScaledStepToS(&this->stemSectionAngle[1], -0xE38, curFrame10 + 0x71C);
+ allStepsDone &= Math_ScaledStepToS(&this->stemSectionAngle[2], -0xE38, curFrame10 + 0xE38);
+ if (allStepsDone) {
+ Animation_PlayLoopSetSpeed(&this->skelAnime, &gDekuBabaFastChompAnim, 4.0f);
+ velocity.x = Math_SinS(this->actor.shape.rot.y) * 5.0f;
+ velocity.y = 0.0f;
+ velocity.z = Math_CosS(this->actor.shape.rot.y) * 5.0f;
+ func_800B0DE0(play, &this->actor.world.pos, &velocity, &gZeroVec3f, &sDustPrimColor, &sDustEnvColor, 1,
+ (s32)(this->size * 100.0f));
+ this->timer = 1;
+ }
+ } else if (this->timer > 10) {
+ EnDekubaba_SetupPullBack(this);
+ } else {
+ this->timer++;
+
+ if ((this->timer >= 4) && !Actor_IsFacingPlayer(&this->actor, 0x16C)) {
+ Math_ApproachS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0xF, 0x71C);
+ }
+
+ if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 12.0f)) {
+ if (this->actor.params == DEKUBABA_BIG) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEKU_MOUTH);
+ } else {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MIZUBABA1_MOUTH);
+ }
+ }
+ }
+
+ EnDekubaba_UpdateHeadPosition(this);
+}
+
+void EnDekubaba_SetupPullBack(EnDekubaba* this) {
+ Animation_Change(&this->skelAnime, &gDekuBabaPauseChompAnim, 1.0f, 15.0f,
+ Animation_GetLastFrame(&gDekuBabaPauseChompAnim), ANIMMODE_ONCE, -3.0f);
+ this->timer = 0;
+ this->actionFunc = EnDekubaba_PullBack;
+}
+
+void EnDekubaba_PullBack(EnDekubaba* this, PlayState* play) {
+ Vec3f dustPos;
+ f32 xIncr;
+ f32 zIncr;
+ s32 i;
+
+ SkelAnime_Update(&this->skelAnime);
+
+ if (this->timer == 0) {
+ Math_ScaledStepToS(&this->actor.shape.rot.x, -0x93E, 0x38E);
+ Math_ScaledStepToS(&this->stemSectionAngle[0], -0x888, 0x16C);
+ Math_ScaledStepToS(&this->stemSectionAngle[1], -0x888, 0x16C);
+
+ if (Math_ScaledStepToS(&this->stemSectionAngle[2], -0x888, 0x16C)) {
+ xIncr = Math_SinS(this->actor.shape.rot.y) * 30.0f * this->size;
+ zIncr = Math_CosS(this->actor.shape.rot.y) * 30.0f * this->size;
+ dustPos = this->actor.home.pos;
+
+ for (i = 0; i < 3; i++) {
+ func_800B1210(play, &dustPos, &gZeroVec3f, &gZeroVec3f, (s32)(this->size * 500.0f),
+ (s32)(this->size * 50.0f));
+ dustPos.x += xIncr;
+ dustPos.z += zIncr;
+ }
+
+ this->timer = 1;
+ }
+ } else if (this->timer == 11) {
+ Math_ScaledStepToS(&this->actor.shape.rot.x, -0x93E, 0x200);
+ Math_ScaledStepToS(this->stemSectionAngle, -0xAAA, 0x200);
+ Math_ScaledStepToS(&this->stemSectionAngle[2], -0x5C71, 0x200);
+
+ if (Math_ScaledStepToS(&this->stemSectionAngle[1], 0x238C, 0x200)) {
+ this->timer = 12;
+ }
+ } else if (this->timer == 18) {
+ Math_ScaledStepToS(&this->actor.shape.rot.x, 0x2AA8, 0xAAA);
+
+ if (Math_ScaledStepToS(&this->stemSectionAngle[0], 0x1554, 0x5B0)) {
+ this->timer = 25;
+ }
+
+ Math_ScaledStepToS(&this->stemSectionAngle[1], -0x38E3, 0xAAA);
+ Math_ScaledStepToS(&this->stemSectionAngle[2], -0x5C71, 0x2D8);
+ } else if (this->timer == 25) {
+ Math_ScaledStepToS(&this->actor.shape.rot.x, -0x5550, 0xAAA);
+
+ if (Math_ScaledStepToS(&this->stemSectionAngle[0], -0x6388, 0x93E)) {
+ this->timer = 26;
+ }
+
+ Math_ScaledStepToS(&this->stemSectionAngle[1], -0x3FFC, 0x4FA);
+ Math_ScaledStepToS(&this->stemSectionAngle[2], -0x238C, 0x444);
+ } else if (this->timer == 26) {
+ Math_ScaledStepToS(&this->actor.shape.rot.x, 0x1800, 0x93E);
+
+ if (Math_ScaledStepToS(&this->stemSectionAngle[0], -0x1555, 0x71C)) {
+ this->timer = 27;
+ }
+
+ Math_ScaledStepToS(&this->stemSectionAngle[1], -0x38E3, 0x2D8);
+ Math_ScaledStepToS(&this->stemSectionAngle[2], -0x5C71, 0x5B0);
+ } else if (this->timer >= 27) {
+ this->timer++;
+ if (this->timer > 30) {
+ if (this->actor.xzDistToPlayer < (80.0f * this->size)) {
+ EnDekubaba_SetupPrepareLunge(this);
+ } else {
+ EnDekubaba_SetupDecideLunge(this);
+ }
+ }
+ } else {
+ this->timer++;
+ if (this->timer == 10) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEKU_SCRAPE);
+ }
+
+ if (this->timer >= 12) {
+ Math_ScaledStepToS(&this->stemSectionAngle[2], -0x5C71, 0x88);
+ }
+ }
+
+ EnDekubaba_UpdateHeadPosition(this);
+}
+
+void EnDekubaba_SetupRecover(EnDekubaba* this) {
+ this->timer = 9;
+ this->collider.base.acFlags |= AC_ON;
+ this->skelAnime.playSpeed = -1.0f;
+ this->actionFunc = EnDekubaba_Recover;
+}
+
+void EnDekubaba_Recover(EnDekubaba* this, PlayState* play) {
+ s32 anyStepsDone;
+
+ SkelAnime_Update(&this->skelAnime);
+
+ if (this->timer > 8) {
+ anyStepsDone = Math_SmoothStepToS(&this->actor.shape.rot.x, 0x1800, 1, 0x11C6, 0x71C);
+ anyStepsDone |= Math_SmoothStepToS(&this->stemSectionAngle[0], -0x1555, 1, 0xAAA, 0x71C);
+ anyStepsDone |= Math_SmoothStepToS(&this->stemSectionAngle[1], -0x38E3, 1, 0xE38, 0x71C);
+ anyStepsDone |= Math_SmoothStepToS(&this->stemSectionAngle[2], -0x5C71, 1, 0x11C6, 0x71C);
+ if (!anyStepsDone) {
+ this->timer = 8;
+ }
+ } else {
+ if (this->timer != 0) {
+ this->timer--;
+ }
+
+ if (this->timer == 0) {
+ EnDekubaba_SetupDecideLunge(this);
+ }
+ }
+
+ EnDekubaba_UpdateHeadPosition(this);
+}
+
+typedef enum {
+ /* 0 */ DEKUBABA_HIT_NO_STUN,
+ /* 1 */ DEKUBABA_HIT_STUN_OTHER,
+ /* 2 */ DEKUBABA_HIT_STUN_NUT,
+ /* 3 */ DEKUBABA_HIT_STUN_ELECTRIC
+} DekuBabaHitType;
+
+void EnDekubaba_SetupHit(EnDekubaba* this, s32 hitType) {
+ Animation_MorphToPlayOnce(&this->skelAnime, &gDekuBabaPauseChompAnim, -5.0f);
+ this->timer = hitType;
+ this->collider.base.acFlags &= ~AC_ON;
+ Actor_SetScale(&this->actor, this->size * 0.01f);
+
+ if (hitType == DEKUBABA_HIT_STUN_NUT) {
+ Actor_SetColorFilter(&this->actor, 0, 155, 0, 42);
+ } else if (hitType == DEKUBABA_HIT_STUN_ELECTRIC) {
+ Actor_SetColorFilter(&this->actor, 0, 155, 0, 42);
+ this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_LARGE;
+ this->drawDmgEffScale = 0.75f;
+ this->drawDmgEffAlpha = 2.0f;
+ } else {
+ Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 42);
+ }
+ this->actionFunc = EnDekubaba_Hit;
+}
+
+/**
+ * Hit by a weapon or hit something when lunging.
+ */
+void EnDekubaba_Hit(EnDekubaba* this, PlayState* play) {
+ s32 allStepsDone;
+
+ SkelAnime_Update(&this->skelAnime);
+ allStepsDone = true;
+ allStepsDone &= Math_ScaledStepToS(&this->actor.shape.rot.x, -0x4000, 0xE38);
+ allStepsDone &= Math_ScaledStepToS(this->stemSectionAngle, -0x4000, 0xE38);
+ allStepsDone &= Math_ScaledStepToS(&this->stemSectionAngle[1], -0x4000, 0xE38);
+ allStepsDone &= Math_ScaledStepToS(&this->stemSectionAngle[2], -0x4000, 0xE38);
+ if (allStepsDone) {
+ if (this->actor.colChkInfo.health == 0) {
+ EnDekubaba_SetupShrinkDie(this);
+ } else {
+ this->collider.base.acFlags |= AC_ON;
+
+ if (this->timer == DEKUBABA_HIT_NO_STUN) {
+ if (this->actor.xzDistToPlayer < (80.0f * this->size)) {
+ EnDekubaba_SetupPrepareLunge(this);
+ } else {
+ EnDekubaba_SetupRecover(this);
+ }
+ } else {
+ EnDekubaba_SetupStunnedVertical(this);
+ }
+ }
+ }
+
+ EnDekubaba_UpdateHeadPosition(this);
+}
+
+void EnDekubaba_SetupPrunedSomersaultDie(EnDekubaba* this) {
+ this->timer = 0;
+ this->skelAnime.playSpeed = 0.0f;
+ this->actor.gravity = -0.8f;
+ this->actor.velocity.y = 4.0f;
+ this->actor.world.rot.y = this->actor.shape.rot.y + 0x8000;
+ this->actor.speed = this->size * 3.0f;
+ this->collider.base.acFlags &= ~AC_ON;
+ this->actor.flags |= ACTOR_FLAG_10 | ACTOR_FLAG_20;
+ this->actionFunc = EnDekubaba_PrunedSomersaultDie;
+}
+
+void EnDekubaba_PrunedSomersaultDie(EnDekubaba* this, PlayState* play) {
+ s32 i;
+ Vec3f dustPos;
+ f32 deltaX;
+ f32 deltaY;
+ f32 deltaZ;
+
+ Math_StepToF(&this->actor.speed, 0.0f, this->size * 0.1f);
+
+ if (this->timer == 0) {
+ Math_ScaledStepToS(&this->actor.shape.rot.x, 0x4800, 0x71C);
+ Math_ScaledStepToS(this->stemSectionAngle, 0x4800, 0x71C);
+ Math_ScaledStepToS(&this->stemSectionAngle[1], 0x4800, 0x71C);
+
+ EffectSsHahen_SpawnBurst(play, &this->actor.world.pos, this->size * 3.0f, 0, (s32)(this->size * 12.0f),
+ (s32)(this->size * 5.0f), 1, HAHEN_OBJECT_DEFAULT, 10, NULL);
+
+ if ((this->actor.scale.x > 0.005f) &&
+ ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) || (this->actor.bgCheckFlags & BGCHECKFLAG_WALL))) {
+ this->actor.scale.z = 0.0f;
+ this->actor.scale.y = 0.0f;
+ this->actor.scale.x = 0.0f;
+ this->actor.speed = 0.0f;
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY);
+ EffectSsHahen_SpawnBurst(play, &this->actor.world.pos, this->size * 3.0f, 0, (s32)(this->size * 12.0f),
+ (s32)(this->size * 5.0f), 15, HAHEN_OBJECT_DEFAULT, 10, NULL);
+ }
+
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_ATTACK);
+ this->timer = 1;
+ }
+ } else if (this->timer == 1) {
+ dustPos = this->actor.world.pos;
+
+ deltaY = 20.0f * Math_SinS(this->actor.shape.rot.x);
+ deltaX = -20.0f * Math_CosS(this->actor.shape.rot.x) * Math_SinS(this->actor.shape.rot.y);
+ deltaZ = -20.0f * Math_CosS(this->actor.shape.rot.x) * Math_CosS(this->actor.shape.rot.y);
+
+ for (i = 0; i < 4; i++) {
+ func_800B1210(play, &dustPos, &gZeroVec3f, &gZeroVec3f, 500, 50);
+ dustPos.x += deltaX;
+ dustPos.y += deltaY;
+ dustPos.z += deltaZ;
+ }
+
+ func_800B1210(play, &this->actor.home.pos, &gZeroVec3f, &gZeroVec3f, (s32)(this->size * 500.0f),
+ (s32)(this->size * 100.0f));
+ EnDekubaba_SetupDeadStickDrop(this, play);
+ }
+}
+
+void EnDekubaba_SetupShrinkDie(EnDekubaba* this) {
+ Animation_Change(&this->skelAnime, &gDekuBabaFastChompAnim, -1.5f, Animation_GetLastFrame(&gDekuBabaFastChompAnim),
+ 0.0f, ANIMMODE_ONCE, -3.0f);
+ this->collider.base.acFlags &= ~AC_ON;
+ this->actionFunc = EnDekubaba_ShrinkDie;
+}
+
+/**
+ * Die and drop Deku Nuts (Deku Stick drop is handled elsewhere).
+ */
+void EnDekubaba_ShrinkDie(EnDekubaba* this, PlayState* play) {
+ Math_StepToF(&this->actor.world.pos.y, this->actor.home.pos.y, this->size * 5.0f);
+
+ if (Math_StepToF(&this->actor.scale.x, this->size * 0.1f * 0.01f, this->size * 0.1f * 0.01f)) {
+ func_800B1210(play, &this->actor.home.pos, &gZeroVec3f, &gZeroVec3f, (s32)(this->size * 500.0f),
+ (s32)(this->size * 100.0f));
+
+ if (!this->actor.dropFlag) {
+ Item_DropCollectible(play, &this->actor.world.pos, ITEM00_DEKU_NUTS_1);
+ if (this->actor.params == DEKUBABA_BIG) {
+ Item_DropCollectible(play, &this->actor.world.pos, ITEM00_DEKU_NUTS_1);
+ Item_DropCollectible(play, &this->actor.world.pos, ITEM00_DEKU_NUTS_1);
+ }
+ } else {
+ Item_DropCollectibleRandom(play, &this->actor, &this->actor.world.pos, 0x30);
+ }
+ Actor_Kill(&this->actor);
+ }
+
+ this->actor.scale.y = this->actor.scale.z = this->actor.scale.x;
+ this->actor.shape.rot.z += 0x1C70;
+ EffectSsHahen_SpawnBurst(play, &this->actor.home.pos, this->size * 3.0f, 0, (s32)(this->size * 12.0f),
+ (s32)(this->size * 5.0f), 1, HAHEN_OBJECT_DEFAULT, 10, NULL);
+}
+
+void EnDekubaba_SetupStunnedVertical(EnDekubaba* this) {
+ s32 i;
+
+ for (i = 1; i < ARRAY_COUNT(this->colliderElements); i++) {
+ this->collider.elements[i].info.bumperFlags |= BUMP_ON;
+ }
+
+ if (this->timer == 1) {
+ Animation_Change(&this->skelAnime, &gDekuBabaFastChompAnim, 4.0f, 0.0f,
+ Animation_GetLastFrame(&gDekuBabaFastChompAnim), ANIMMODE_LOOP, -3.0f);
+ this->timer = 40;
+ } else {
+ Animation_Change(&this->skelAnime, &gDekuBabaFastChompAnim, 0.0f, 0.0f,
+ Animation_GetLastFrame(&gDekuBabaFastChompAnim), ANIMMODE_LOOP, -3.0f);
+ if (this->timer == 2) {
+ this->timer = 40;
+ } else {
+ this->timer = 40;
+ }
+ }
+
+ this->actor.world.pos.x = this->actor.home.pos.x;
+ this->actor.world.pos.y = this->actor.home.pos.y + (60.0f * this->size);
+ this->actor.world.pos.z = this->actor.home.pos.z;
+ this->actionFunc = EnDekubaba_StunnedVertical;
+}
+
+void EnDekubaba_StunnedVertical(EnDekubaba* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+
+ if (this->timer != 0) {
+ this->timer--;
+ }
+
+ if (this->timer == 0) {
+ EnDekubaba_DisableHitboxes(this);
+
+ if (this->actor.xzDistToPlayer < (80.0f * this->size)) {
+ EnDekubaba_SetupPrepareLunge(this);
+ } else {
+ EnDekubaba_SetupRecover(this);
+ }
+ }
+}
+
+void EnDekubaba_SetupSway(EnDekubaba* this) {
+ this->targetSwayAngle = -0x6000;
+ this->stemSectionAngle[2] = -0x5000;
+ this->stemSectionAngle[1] = -0x4800;
+ EnDekubaba_DisableHitboxes(this);
+ Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 35);
+ this->collider.base.acFlags &= ~AC_ON;
+ this->actionFunc = EnDekubaba_Sway;
+}
+
+/**
+ * Sway back and forth with decaying amplitude until close enough to vertical.
+ */
+void EnDekubaba_Sway(EnDekubaba* this, PlayState* play) {
+ s16 angleToVertical;
+
+ SkelAnime_Update(&this->skelAnime);
+ Math_ScaledStepToS(&this->actor.shape.rot.x, this->stemSectionAngle[0], 0x71C);
+ Math_ScaledStepToS(this->stemSectionAngle, this->stemSectionAngle[1], 0x71C);
+ Math_ScaledStepToS(&this->stemSectionAngle[1], this->stemSectionAngle[2], 0x71C);
+ if (Math_ScaledStepToS(&this->stemSectionAngle[2], this->targetSwayAngle, 0x71C) != 0) {
+ this->targetSwayAngle = -0x4000 - (s32)((this->targetSwayAngle + 0x4000) * 0.8f);
+ }
+
+ angleToVertical = this->targetSwayAngle + 0x4000;
+
+ if (ABS_ALT(angleToVertical) < 0x100) {
+ this->collider.base.acFlags |= AC_ON;
+ if (this->actor.xzDistToPlayer < (80.0f * this->size)) {
+ EnDekubaba_SetupPrepareLunge(this);
+ } else {
+ EnDekubaba_SetupRecover(this);
+ }
+ }
+ EnDekubaba_UpdateHeadPosition(this);
+}
+
+void EnDekubaba_SetupFrozen(EnDekubaba* this) {
+ EnDekubaba_SetFrozenEffects(this);
+ this->actionFunc = EnDekubaba_Frozen;
+}
+
+void EnDekubaba_Frozen(EnDekubaba* this, PlayState* play) {
+ if (this->timer != 0) {
+ this->timer--;
+ }
+ if (this->timer == 0) {
+ EnDekubaba_SpawnIceEffects(this, play);
+
+ if (this->actor.colChkInfo.health == 0) {
+ EnDekubaba_SetupShrinkDie(this);
+ } else if (this->actor.xzDistToPlayer < (80.0f * this->size)) {
+ EnDekubaba_SetupPrepareLunge(this);
+ } else {
+ EnDekubaba_SetupRecover(this);
+ }
+ }
+}
+
+void EnDekubaba_SetupDeadStickDrop(EnDekubaba* this, PlayState* play) {
+ Actor_SetScale(&this->actor, 0.03f);
+ this->actor.shape.rot.x -= 0x4000;
+ this->actor.shape.yOffset = 1000.0f;
+ this->actor.gravity = 0.0f;
+ this->actor.velocity.y = 0.0f;
+ this->actor.shape.shadowScale = 3.0f;
+ func_800BC154(play, &play->actorCtx, &this->actor, ACTORCAT_MISC);
+ this->actor.flags &= ~ACTOR_FLAG_20;
+ this->timer = 200;
+ this->drawDmgEffAlpha = 0.0f;
+ this->actionFunc = EnDekubaba_DeadStickDrop;
+}
+
+void EnDekubaba_DeadStickDrop(EnDekubaba* this, PlayState* play) {
+ if (this->timer != 0) {
+ this->timer--;
+ }
+
+ if (Actor_HasParent(&this->actor, play) || (this->timer == 0)) {
+ Actor_Kill(&this->actor);
+ return;
+ }
+
+ Actor_OfferGetItemNearby(&this->actor, play, GI_DEKU_STICKS_1);
+}
+
+/* Update and associated functions */
+
+void EnDekubaba_UpdateDamage(EnDekubaba* this, PlayState* play) {
+ s32 newHealth;
+ s32 i;
+ ColliderJntSphElement* sphElement;
+
+ if (this->collider.base.acFlags & AC_HIT) {
+ this->collider.base.acFlags &= ~AC_HIT;
+ Actor_SetDropFlagJntSph(&this->actor, &this->collider);
+
+ if ((this->collider.base.colType != COLTYPE_HARD) &&
+ (this->actor.colChkInfo.damageEffect != DEKUBABA_DMGEFF_HOOKSHOT)) {
+ sphElement = &this->collider.elements[0];
+ for (i = 0; i < ARRAY_COUNT(this->colliderElements); i++, sphElement++) {
+ if (sphElement->info.bumperFlags & BUMP_HIT) {
+ break;
+ }
+ }
+
+ if ((i != ARRAY_COUNT(this->colliderElements)) &&
+ ((this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) ||
+ (!(sphElement->info.acHitInfo->toucher.dmgFlags & 0xDB0B3)))) {
+ EnDekubaba_SpawnIceEffects(this, play);
+ newHealth = this->actor.colChkInfo.health - this->actor.colChkInfo.damage;
+
+ if (this->actionFunc != EnDekubaba_StunnedVertical) {
+ if (this->actor.colChkInfo.damageEffect == DEKUBABA_DMGEFF_ICE) {
+ EnDekubaba_SetupFrozen(this);
+ } else if (this->actor.colChkInfo.damageEffect == DEKUBABA_DMGEFF_ELECTRIC) {
+ EnDekubaba_SetupHit(this, DEKUBABA_HIT_STUN_ELECTRIC);
+ } else if (this->actor.colChkInfo.damageEffect == DEKUBABA_DMGEFF_NUT) {
+ EnDekubaba_SetupHit(this, DEKUBABA_HIT_STUN_NUT);
+ } else {
+ EnDekubaba_SetFireLightEffects(this, play, i);
+
+ if (this->actionFunc == EnDekubaba_PullBack) {
+ if (newHealth <= 0) {
+ newHealth = 1;
+ }
+
+ EnDekubaba_SetupHit(this, DEKUBABA_HIT_STUN_OTHER);
+ } else {
+ EnDekubaba_SetupHit(this, DEKUBABA_HIT_NO_STUN);
+ }
+ }
+ } else {
+ if (this->actor.colChkInfo.damageEffect == DEKUBABA_DMGEFF_CUT) {
+ if (newHealth > 0) {
+ EnDekubaba_SetupSway(this);
+ } else {
+ EnDekubaba_SetupPrunedSomersaultDie(this);
+ }
+ } else if (this->actor.colChkInfo.damageEffect == DEKUBABA_DMGEFF_ELECTRIC) {
+ EnDekubaba_SetupHit(this, DEKUBABA_HIT_STUN_ELECTRIC);
+ } else if (this->actor.colChkInfo.damageEffect == DEKUBABA_DMGEFF_NUT) {
+ EnDekubaba_SetupHit(this, DEKUBABA_HIT_STUN_NUT);
+ } else if (this->actor.colChkInfo.damageEffect == DEKUBABA_DMGEFF_ICE) {
+ EnDekubaba_SetupFrozen(this);
+ } else {
+ EnDekubaba_SetFireLightEffects(this, play, i);
+ EnDekubaba_SetupHit(this, DEKUBABA_HIT_NO_STUN);
+ }
+ }
+
+ if (newHealth < 0) {
+ this->actor.colChkInfo.health = 0;
+ } else {
+ this->actor.colChkInfo.health = newHealth;
+ }
+ } else {
+ return;
+ }
+ } else {
+ return;
+ }
+ } else if ((play->actorCtx.unk2 != 0) && (this->actor.xyzDistToPlayerSq < SQ(200.0f)) &&
+ (this->collider.base.colType != COLTYPE_HARD) && (this->actionFunc != EnDekubaba_StunnedVertical) &&
+ (this->actionFunc != EnDekubaba_Hit) && (this->actor.colChkInfo.health != 0)) {
+ this->actor.colChkInfo.health--;
+ this->actor.dropFlag = 0;
+ EnDekubaba_SetupHit(this, DEKUBABA_HIT_STUN_OTHER);
+ } else {
+ return;
+ }
+
+ if (this->actor.colChkInfo.health != 0) {
+ if ((this->timer == 2) || (this->timer == 3)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ } else {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEKU_DAMAGE);
+ }
+ } else {
+ Enemy_StartFinishingBlow(play, &this->actor);
+
+ if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
+ this->timer = 3;
+ this->collider.base.acFlags &= ~AC_ON;
+ } else if (this->drawDmgEffAlpha > 1.5f) {
+ this->drawDmgEffAlpha = 1.5f;
+ }
+
+ if (this->actor.params == DEKUBABA_BIG) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEKU_DEAD);
+ } else {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEKU_JR_DEAD);
+ }
+ }
+}
+
+void EnDekubaba_Update(Actor* thisx, PlayState* play) {
+ s32 pad;
+ EnDekubaba* this = THIS;
+
+ if (this->collider.base.atFlags & AT_HIT) {
+ this->collider.base.atFlags &= ~AT_HIT;
+ EnDekubaba_SetupRecover(this);
+ }
+
+ EnDekubaba_UpdateDamage(this, play);
+ this->actionFunc(this, play);
+
+ if (this->actionFunc == EnDekubaba_PrunedSomersaultDie) {
+ Actor_MoveWithGravity(&this->actor);
+ 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, UPDBGCHECKINFO_FLAG_4);
+ if (this->boundFloor == NULL) {
+ this->boundFloor = this->actor.floorPoly;
+ }
+ }
+
+ if (this->actionFunc == EnDekubaba_Lunge) {
+ CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
+ this->actor.flags |= ACTOR_FLAG_1000000;
+ }
+
+ if (this->collider.base.acFlags & AC_ON) {
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
+ }
+
+ if (this->actionFunc != EnDekubaba_DeadStickDrop) {
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
+ }
+
+ 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.375f;
+ this->drawDmgEffScale = CLAMP_MAX(this->drawDmgEffScale, 0.75f);
+ } else if (!Math_StepToF(&this->drawDmgEffFrozenSteamScale, 0.75f, 0.75f / 40)) {
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ }
+ }
+}
+
+/* Draw functions */
+
+void EnDekubaba_DrawStemRetracted(EnDekubaba* this, PlayState* play) {
+ f32 horizontalScale;
+ s32 i;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ horizontalScale = this->size * 0.01f;
+
+ Matrix_Translate(this->actor.home.pos.x, this->actor.home.pos.y + (-6.0f * this->size), this->actor.home.pos.z,
+ MTXMODE_NEW);
+ Matrix_RotateZYX(this->stemSectionAngle[0], this->actor.shape.rot.y, 0, MTXMODE_APPLY);
+ Matrix_Scale(horizontalScale, horizontalScale, horizontalScale, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gDekuBabaStemTopDL);
+
+ for (i = DEKUBABA_BODYPART_1; i < DEKUBABA_BODYPART_MAX; i++) {
+ Matrix_MultZero(&this->bodyPartsPos[i]);
+ }
+
+ Actor_SetFocus(&this->actor, 0.0f);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void EnDekubaba_DrawStemExtended(EnDekubaba* this, PlayState* play) {
+ static Gfx* sStemDLists[] = { gDekuBabaStemTopDL, gDekuBabaStemMiddleDL, gDekuBabaStemBaseDL };
+ MtxF mf;
+ s32 i;
+ f32 scale;
+ f32 horizontalStepSize;
+ s32 stemSections;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ if (this->actionFunc == EnDekubaba_PrunedSomersaultDie) {
+ stemSections = 2;
+ } else {
+ stemSections = 3;
+ }
+
+ scale = this->size * 0.01f;
+ Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, MTXMODE_NEW);
+ Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
+ Matrix_Get(&mf);
+
+ for (i = 0; i < stemSections; i++) {
+ mf.yw += 20.0f * Math_SinS(this->stemSectionAngle[i]) * this->size;
+ horizontalStepSize = Math_CosS(this->stemSectionAngle[i]) * 20.0f * this->size;
+ mf.xw -= horizontalStepSize * Math_SinS(this->actor.shape.rot.y);
+ mf.zw -= horizontalStepSize * Math_CosS(this->actor.shape.rot.y);
+
+ Matrix_Put(&mf);
+ Matrix_RotateZYX(this->stemSectionAngle[i], this->actor.shape.rot.y, 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++, sStemDLists[i]);
+
+ Collider_UpdateSpheres(51 + 2 * i, &this->collider);
+ Collider_UpdateSpheres(52 + 2 * i, &this->collider);
+
+ if (i == 0) {
+ if (this->actionFunc != EnDekubaba_Sway) {
+ this->actor.focus.pos.x = mf.xw;
+ this->actor.focus.pos.y = mf.yw;
+ this->actor.focus.pos.z = mf.zw;
+ } else {
+ this->actor.focus.pos.x = this->actor.home.pos.x;
+ this->actor.focus.pos.y = this->actor.home.pos.y + (40.0f * this->size);
+ this->actor.focus.pos.z = this->actor.home.pos.z;
+ }
+ }
+
+ Matrix_MultZero(&this->bodyPartsPos[DEKUBABA_BODYPART_1 + i]);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void EnDekubaba_DrawStemBasePruned(EnDekubaba* this, PlayState* play) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Matrix_RotateZYX(this->stemSectionAngle[2], this->actor.shape.rot.y, 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++, gDekuBabaStemBaseDL);
+
+ Collider_UpdateSpheres(55, &this->collider);
+ Collider_UpdateSpheres(56, &this->collider);
+
+ Matrix_MultZero(&this->bodyPartsPos[DEKUBABA_BODYPART_3]);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void EnDekubaba_DrawShadow(EnDekubaba* this, PlayState* play) {
+ MtxF mf;
+ f32 horizontalScale;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
+
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, 255);
+
+ func_800C0094(this->boundFloor, this->actor.home.pos.x, this->actor.home.pos.y, this->actor.home.pos.z, &mf);
+ Matrix_Mult(&mf, MTXMODE_NEW);
+ horizontalScale = this->size * 0.15f;
+ Matrix_Scale(horizontalScale, 1.0f, horizontalScale, MTXMODE_APPLY);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gCircleShadowDL);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void EnDekubaba_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
+ EnDekubaba* this = THIS;
+
+ if (limbIndex == DEKUBABA_LIMB_ROOT) {
+ Collider_UpdateSpheres(limbIndex, &this->collider);
+ }
+}
+
+void EnDekubaba_Draw(Actor* thisx, PlayState* play) {
+ EnDekubaba* this = THIS;
+ f32 scale;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Math_Vec3f_Copy(&this->bodyPartsPos[DEKUBABA_BODYPART_0], &this->actor.world.pos);
+
+ if (this->actionFunc != EnDekubaba_DeadStickDrop) {
+ SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, EnDekubaba_PostLimbDraw,
+ &this->actor);
+ if (this->actionFunc == EnDekubaba_Wait) {
+ EnDekubaba_DrawStemRetracted(this, play);
+ } else {
+ EnDekubaba_DrawStemExtended(this, play);
+ }
+
+ scale = this->size * 0.01f;
+ Matrix_Translate(this->actor.home.pos.x, this->actor.home.pos.y, this->actor.home.pos.z, MTXMODE_NEW);
+ Matrix_RotateYS(this->actor.home.rot.y, MTXMODE_APPLY);
+ Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gDekuBabaBaseLeavesDL);
+
+ if (this->actionFunc == EnDekubaba_PrunedSomersaultDie) {
+ EnDekubaba_DrawStemBasePruned(this, play);
+ }
+ if (this->boundFloor != NULL) {
+ EnDekubaba_DrawShadow(this, play);
+ }
+
+ // Display solid until 40 frames left, then blink until killed.
+ } else if ((this->timer > 40) || ((this->timer % 2) != 0)) {
+ Matrix_Translate(0.0f, 0.0f, 200.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++, gDekuBabaStickDropDL);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, DEKUBABA_BODYPART_MAX,
+ this->drawDmgEffScale * this->size, this->drawDmgEffFrozenSteamScale, this->drawDmgEffAlpha,
+ this->drawDmgEffType);
+}
diff --git a/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.h b/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.h
index 848f056bf..b29dbe8db 100644
--- a/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.h
+++ b/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.h
@@ -2,16 +2,43 @@
#define Z_EN_DEKUBABA_H
#include "global.h"
+#include "objects/object_dekubaba/object_dekubaba.h"
struct EnDekubaba;
typedef void (*EnDekubabaActionFunc)(struct EnDekubaba*, PlayState*);
+typedef enum {
+ /* 0 */ DEKUBABA_NORMAL,
+ /* 1 */ DEKUBABA_BIG
+} DekuBabaType;
+
+typedef enum DekuBabaBodyPart {
+ /* 0 */ DEKUBABA_BODYPART_0,
+ /* 1 */ DEKUBABA_BODYPART_1,
+ /* 2 */ DEKUBABA_BODYPART_2,
+ /* 3 */ DEKUBABA_BODYPART_3,
+ /* 4 */ DEKUBABA_BODYPART_MAX
+} DekuBabaBodyPart;
+
typedef struct EnDekubaba {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x44];
+ /* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ EnDekubabaActionFunc actionFunc;
- /* 0x18C */ char unk_18C[0x290];
+ /* 0x18C */ u8 drawDmgEffType;
+ /* 0x18E */ s16 timer;
+ /* 0x190 */ s16 targetSwayAngle;
+ /* 0x192 */ s16 stemSectionAngle[3];
+ /* 0x198 */ Vec3s jointTable[DEKUBABA_LIMB_MAX];
+ /* 0x1C8 */ Vec3s morphTable[DEKUBABA_LIMB_MAX];
+ /* 0x1F8 */ f32 size;
+ /* 0x1FC */ f32 drawDmgEffAlpha;
+ /* 0x200 */ f32 drawDmgEffScale;
+ /* 0x204 */ f32 drawDmgEffFrozenSteamScale;
+ /* 0x208 */ Vec3f bodyPartsPos[DEKUBABA_BODYPART_MAX];
+ /* 0x238 */ CollisionPoly* boundFloor;
+ /* 0x23C */ ColliderJntSph collider;
+ /* 0x25C */ ColliderJntSphElement colliderElements[7];
} EnDekubaba; // size = 0x41C
#endif // Z_EN_DEKUBABA_H
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 6bc0fd8d1..4fb015365 100644
--- a/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.c
+++ b/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.c
@@ -5,10 +5,11 @@
*/
#include "z_en_dekunuts.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "overlays/actors/ovl_Obj_Etcetera/z_obj_etcetera.h"
#include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY)
#define THIS ((EnDekunuts*)thisx)
@@ -130,11 +131,11 @@ void EnDekunuts_Init(Actor* thisx, PlayState* play) {
}
if (this->actor.params == ENDEKUNUTS_GET_FF00_1) {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->collider.base.colType = COLTYPE_NONE;
this->collider.info.bumperFlags |= (BUMP_NO_HITMARK | BUMP_NO_SWORD_SFX | BUMP_NO_DAMAGE | BUMP_NO_AT_INFO);
} else if (this->actor.params == ENDEKUNUTS_GET_FF00_2) {
- this->actor.targetMode = 0;
+ this->actor.targetMode = TARGET_MODE_0;
}
func_808BD428(this);
@@ -149,11 +150,11 @@ void EnDekunuts_Destroy(Actor* thisx, PlayState* play) {
void func_808BD348(EnDekunuts* this) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX;
this->drawDmgEffScale = 0.55f;
- this->drawDmgEffFrozenSteamScale = 0.82500005f;
+ this->drawDmgEffFrozenSteamScale = 825.0f * 0.001f;
this->drawDmgEffAlpha = 1.0f;
this->collider.base.colType = COLTYPE_HIT3;
this->unk_190 = 80;
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 80);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 80);
}
void func_808BD3B4(EnDekunuts* this, PlayState* play) {
@@ -161,7 +162,7 @@ void func_808BD3B4(EnDekunuts* this, PlayState* play) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->collider.base.colType = COLTYPE_HIT6;
this->drawDmgEffAlpha = 0.0f;
- Actor_SpawnIceEffects(play, &this->actor, this->limbPos, 8, 2, 0.2f, 0.2f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, ENDEKUNUTS_BODYPART_MAX, 2, 0.2f, 0.2f);
}
}
@@ -188,7 +189,7 @@ void func_808BD49C(EnDekunuts* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, 9.0f)) {
this->collider.base.acFlags |= AC_ON;
} else if (Animation_OnFrame(&this->skelAnime, 8.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_UP);
}
this->collider.dim.height = (s32)((CLAMP(this->skelAnime.curFrame, 9.0f, 12.0f) - 9.0f) * 9.0f) + 5;
@@ -299,7 +300,7 @@ void func_808BDA4C(EnDekunuts* this, PlayState* play) {
sp58.x = player->actor.world.pos.x;
sp58.z = player->actor.world.pos.z;
sp58.y = player->actor.world.pos.y + 40.0f;
- pitch = Actor_PitchToPoint(&this->actor, &sp58);
+ pitch = Actor_WorldPitchTowardPoint(&this->actor, &sp58);
pitch = CLAMP(pitch, -0x3800, -0x2000);
if (this->skelAnime.curFrame < 7.0f) {
Math_ScaledStepToS(&this->actor.world.rot.x, pitch, 0x800);
@@ -320,7 +321,7 @@ void func_808BDA4C(EnDekunuts* this, PlayState* play) {
if (Actor_Spawn(&play->actorCtx, play, ACTOR_EN_NUTSBALL, pos.x, pos.y, pos.z, this->actor.world.rot.x,
this->actor.shape.rot.y, 0, params) != NULL) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_THROW);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_THROW);
}
} else if ((this->unk_190 >= 2) && Animation_OnFrame(&this->skelAnime, 12.0f)) {
Animation_MorphToPlayOnce(&this->skelAnime, &gDekuScrubSpitAnim, -3.0f);
@@ -333,7 +334,7 @@ void func_808BDA4C(EnDekunuts* this, PlayState* play) {
void func_808BDC9C(EnDekunuts* this) {
Animation_MorphToPlayOnce(&this->skelAnime, &gDekuScrubBurrowAnim, -5.0f);
this->unk_190 = 0;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_DOWN);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_DOWN);
this->actionFunc = func_808BDD54;
}
@@ -341,7 +342,7 @@ void func_808BDCF0(EnDekunuts* this) {
Animation_MorphToPlayOnce(&this->skelAnime, &gDekuScrubBurrowAnim, -5.0f);
this->collider.base.acFlags &= ~AC_ON;
this->unk_190 = 80;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_DOWN);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_DOWN);
this->actionFunc = func_808BDD54;
}
@@ -369,7 +370,7 @@ void func_808BDE7C(EnDekunuts* this) {
Animation_MorphToPlayOnce(&this->skelAnime, &gDekuScrubUnburrowAnim, -3.0f);
this->collider.dim.height = 37;
this->actor.colChkInfo.mass = 50;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_DAMAGE);
this->actor.world.rot.x = 0;
this->actor.flags |= ACTOR_FLAG_20;
this->collider.base.acFlags &= ~AC_ON;
@@ -405,20 +406,20 @@ void func_808BDFB8(EnDekunuts* this, PlayState* play) {
}
if (this->unk_18C != 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_WALK);
this->unk_18C = 0;
} else {
this->unk_18C = 1;
}
- Math_StepToF(&this->actor.speedXZ, 7.5f, 1.0f);
+ Math_StepToF(&this->actor.speed, 7.5f, 1.0f);
if (!Math_SmoothStepToS(&this->actor.world.rot.y, this->unk_192, 1, 0xE38, 0xB6)) {
- if (this->actor.bgCheckFlags & 0x20) {
- this->unk_192 = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
- } else if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER) {
+ this->unk_192 = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->unk_192 = this->actor.wallYaw;
} else if (this->unk_18D == 0) {
- yaw = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ yaw = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
yaw2 = yaw - this->actor.yawTowardsPlayer;
if (ABS_ALT(yaw2) > 0x2000) {
this->unk_192 = yaw;
@@ -431,11 +432,11 @@ void func_808BDFB8(EnDekunuts* this, PlayState* play) {
}
this->actor.shape.rot.y = BINANG_ROT180(this->actor.world.rot.y);
- if ((this->unk_18D == 0) && (Actor_XZDistanceToPoint(&this->actor, &this->actor.home.pos) < 20.0f) &&
+ if ((this->unk_18D == 0) && (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) < 20.0f) &&
(fabsf(this->actor.world.pos.y - this->actor.home.pos.y) < 2.0f)) {
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
this->actor.flags &= ~ACTOR_FLAG_20;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
func_808BDC9C(this);
} else if (this->unk_190 == 0) {
func_808BE1CC(this);
@@ -445,7 +446,7 @@ void func_808BDFB8(EnDekunuts* this, PlayState* play) {
void func_808BE1CC(EnDekunuts* this) {
Animation_PlayLoop(&this->skelAnime, &gDekuScrubPantingAnim);
this->unk_190 = 3;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->unk_18D != 0) {
this->unk_18D--;
}
@@ -468,7 +469,7 @@ void func_808BE22C(EnDekunuts* this, PlayState* play) {
void func_808BE294(EnDekunuts* this, s32 arg1) {
Animation_MorphToPlayOnce(&this->skelAnime, &gDekuScrubDamageAnim, -3.0f);
if (this->actor.params == ENDEKUNUTS_GET_FF00_0) {
- this->actor.speedXZ = 10.0f;
+ this->actor.speed = 10.0f;
if (arg1 != 0) {
func_800BE504(&this->actor, &this->collider);
}
@@ -477,20 +478,21 @@ void func_808BE294(EnDekunuts* this, s32 arg1) {
this->actor.world.rot.x = 0;
this->collider.base.acFlags &= ~AC_ON;
this->actionFunc = func_808BE358;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_DAMAGE);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_CUTBODY);
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, Animation_GetLastFrame(&gDekuScrubDamageAnim));
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_CUTBODY);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA,
+ Animation_GetLastFrame(&gDekuScrubDamageAnim));
}
void func_808BE358(EnDekunuts* this, PlayState* play) {
- Math_StepToF(&this->actor.speedXZ, 0.0f, 1.0f);
+ Math_StepToF(&this->actor.speed, 0.0f, 1.0f);
if (SkelAnime_Update(&this->skelAnime)) {
func_808BE484(this);
}
}
void func_808BE3A8(EnDekunuts* this) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->actor.velocity.y > 0.0f) {
this->actor.velocity.y = 0.0f;
}
@@ -520,8 +522,8 @@ void func_808BE3FC(EnDekunuts* this, PlayState* play) {
void func_808BE484(EnDekunuts* this) {
Animation_PlayOnce(&this->skelAnime, &gDekuScrubDieAnim);
this->actionFunc = func_808BE4D4;
- this->actor.speedXZ = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_DEAD);
+ this->actor.speed = 0.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_DEAD);
}
void func_808BE4D4(EnDekunuts* this, PlayState* play) {
@@ -593,8 +595,8 @@ void func_808BE73C(EnDekunuts* this, PlayState* play) {
if (this->actor.colChkInfo.damageEffect == 1) {
this->unk_190 = 40;
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 40);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
func_808BE3A8(this);
return;
}
@@ -609,7 +611,7 @@ void func_808BE73C(EnDekunuts* this, PlayState* play) {
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_SMALL_LIGHT_RAYS);
+ CLEAR_TAG_PARAMS(CLEAR_TAG_SMALL_LIGHT_RAYS));
} else if (this->actor.colChkInfo.damageEffect == 5) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_LARGE;
this->drawDmgEffAlpha = 4.0f;
@@ -642,7 +644,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) {
@@ -657,30 +661,32 @@ void EnDekunuts_Update(Actor* thisx, PlayState* play) {
this->drawDmgEffScale = CLAMP_MAX(this->drawDmgEffScale, 0.55f);
} else if ((this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) &&
!Math_StepToF(&this->drawDmgEffFrozenSteamScale, 0.55f, (33.0f / 1600.0f))) {
- func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
}
}
s32 EnDekunuts_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnDekunuts* this = THIS;
- f32 arg1, arg2, arg3;
- f32 currentFrame;
+ f32 arg1;
+ f32 arg2;
+ f32 arg3;
+ f32 curFrame;
if (this->actionFunc == func_808BDA4C) {
if (limbIndex == DEKU_SCRUB_LIMB_SNOUT) {
- currentFrame = this->skelAnime.curFrame;
- if (currentFrame <= 6.0f) {
- arg2 = 1.0f - (currentFrame * 0.0833f);
- arg1 = (currentFrame * 0.1167f) + 1.0f;
- arg3 = (currentFrame * 0.1167f) + 1.0f;
- } else if (currentFrame <= 7.0f) {
- currentFrame -= 6.0f;
- arg2 = 0.5f + currentFrame;
- arg1 = 1.7f - (currentFrame * 0.7f);
- arg3 = 1.7f - (currentFrame * 0.7f);
- } else if (currentFrame <= 10.0f) {
- arg2 = 1.5f - ((currentFrame - 7.0f) * 0.1667f);
+ curFrame = this->skelAnime.curFrame;
+ if (curFrame <= 6.0f) {
+ arg2 = 1.0f - (curFrame * 0.0833f);
+ arg1 = (curFrame * 0.1167f) + 1.0f;
+ arg3 = (curFrame * 0.1167f) + 1.0f;
+ } else if (curFrame <= 7.0f) {
+ curFrame -= 6.0f;
+ arg2 = 0.5f + curFrame;
+ arg1 = 1.7f - (curFrame * 0.7f);
+ arg3 = 1.7f - (curFrame * 0.7f);
+ } else if (curFrame <= 10.0f) {
+ arg2 = 1.5f - ((curFrame - 7.0f) * 0.1667f);
arg1 = 1.0f;
arg3 = 1.0f;
} else {
@@ -694,28 +700,42 @@ s32 EnDekunuts_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
return false;
}
+static s8 sLimbToBodyParts[DEKU_SCRUB_LIMB_MAX] = {
+ BODYPART_NONE, // DEKU_SCRUB_LIMB_NONE
+ BODYPART_NONE, // DEKU_SCRUB_LIMB_BODY
+ BODYPART_NONE, // DEKU_SCRUB_LIMB_HEAD
+ ENDEKUNUTS_BODYPART_3, // DEKU_SCRUB_LIMB_HEADDRESS
+ BODYPART_NONE, // DEKU_SCRUB_LIMB_CREST
+ ENDEKUNUTS_BODYPART_0, // DEKU_SCRUB_LIMB_SNOUT
+ BODYPART_NONE, // DEKU_SCRUB_LIMB_LEFT_LEG
+ ENDEKUNUTS_BODYPART_1, // DEKU_SCRUB_LIMB_LEFT_FOOT
+ BODYPART_NONE, // DEKU_SCRUB_LIMB_RIGHT_LEG
+ ENDEKUNUTS_BODYPART_2, // DEKU_SCRUB_LIMB_RIGHT_FOOT
+};
+
+static Vec3f D_808BEFA4[] = {
+ { -1500.0f, 0.0f, -1700.0f }, // ENDEKUNUTS_BODYPART_4
+ { -1500.0f, 0.0f, 1700.0f }, // ENDEKUNUTS_BODYPART_5
+ { -2500.0f, -2000.0f, 0.0f }, // ENDEKUNUTS_BODYPART_6
+ { -1000.0f, 1000.0f, 0.0f }, // ENDEKUNUTS_BODYPART_7
+};
+
void EnDekunuts_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
- static s8 D_808BEF98[] = {
- -1, -1, -1, 3, -1, 0, -1, 1, -1, 2, 0, 0,
- };
- static Vec3f D_808BEFA4[] = {
- { -1500.0f, 0.0f, -1700.0f }, { -1500.0f, 0.0f, 1700.0f }, { -2500.0f, -2000.0f, 0.0f },
- { -1000.0f, 1000.0f, 0.0f }, { 0.0f, 0.0f, 0.0f },
- };
EnDekunuts* this = THIS;
s32 i;
Vec3f* ptr1;
Vec3f* ptr2;
- s32 value = D_808BEF98[limbIndex];
+ s32 bodyPartIndex = sLimbToBodyParts[limbIndex];
- if (value != -1) {
- if (value < 3) {
- Matrix_MultVecX(1000.0f, &this->limbPos[value]);
+ if (bodyPartIndex != BODYPART_NONE) {
+ if (bodyPartIndex <= ENDEKUNUTS_BODYPART_2) {
+ Matrix_MultVecX(1000.0f, &this->bodyPartsPos[bodyPartIndex]);
} else {
- Matrix_MultZero(&this->limbPos[value]);
+ // ENDEKUNUTS_BODYPART_3
+ Matrix_MultZero(&this->bodyPartsPos[bodyPartIndex]);
ptr1 = &D_808BEFA4[0];
- ptr2 = &this->limbPos[value + 1];
- for (i = value + 1; i < ARRAY_COUNT(this->limbPos); i++) {
+ ptr2 = &this->bodyPartsPos[bodyPartIndex + 1];
+ for (i = bodyPartIndex + 1; i < ENDEKUNUTS_BODYPART_MAX; i++) {
Matrix_MultVec3f(ptr1, ptr2);
ptr1++, ptr2++;
}
@@ -739,6 +759,6 @@ void EnDekunuts_Draw(Actor* thisx, PlayState* play) {
func_800AE5A0(play);
}
Gfx_DrawDListOpa(play, gDekuScrubFlowerDL);
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), this->drawDmgEffScale,
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, ENDEKUNUTS_BODYPART_MAX, this->drawDmgEffScale,
this->drawDmgEffFrozenSteamScale, this->drawDmgEffAlpha, this->drawDmgEffType);
}
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 c6672b06e..9580cb3e6 100644
--- a/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.h
+++ b/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.h
@@ -8,14 +8,26 @@ struct EnDekunuts;
typedef void (*EnDekunutsActionFunc)(struct EnDekunuts*, PlayState*);
-#define ENDEKUNUTS_GET_FF00(thisx) (((thisx)->params >> 8) & 0xFF);
+#define ENDEKUNUTS_GET_FF00(thisx) (((thisx)->params >> 8) & 0xFF)
-enum {
- /* 0x0 */ ENDEKUNUTS_GET_FF00_0,
- /* 0x1 */ ENDEKUNUTS_GET_FF00_1,
- /* 0x2 */ ENDEKUNUTS_GET_FF00_2,
- /* 0xFF*/ ENDEKUNUTS_GET_FF00_FF = 0xFF,
-};
+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 enum DekunutsBodyPart {
+ /* 0 */ ENDEKUNUTS_BODYPART_0,
+ /* 1 */ ENDEKUNUTS_BODYPART_1,
+ /* 2 */ ENDEKUNUTS_BODYPART_2,
+ /* 3 */ ENDEKUNUTS_BODYPART_3,
+ /* 4 */ ENDEKUNUTS_BODYPART_4,
+ /* 5 */ ENDEKUNUTS_BODYPART_5,
+ /* 6 */ ENDEKUNUTS_BODYPART_6,
+ /* 7 */ ENDEKUNUTS_BODYPART_7,
+ /* 8 */ ENDEKUNUTS_BODYPART_MAX
+} DekunutsBodyPart;
typedef struct EnDekunuts {
/* 0x000 */ Actor actor;
@@ -32,7 +44,7 @@ typedef struct EnDekunuts {
/* 0x210 */ f32 drawDmgEffAlpha;
/* 0x214 */ f32 drawDmgEffScale;
/* 0x218 */ f32 drawDmgEffFrozenSteamScale;
- /* 0x21C */ Vec3f limbPos[8];
+ /* 0x21C */ Vec3f bodyPartsPos[ENDEKUNUTS_BODYPART_MAX];
/* 0x27C */ ColliderCylinder collider;
} EnDekunuts; // size = 0x2C8
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 2a4eb1553..3d4d95b87 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
@@ -6,7 +6,7 @@
#include "z_en_demo_heishi.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnDemoheishi*)thisx)
@@ -15,20 +15,10 @@ void EnDemoheishi_Destroy(Actor* thisx, PlayState* play);
void EnDemoheishi_Update(Actor* thisx, PlayState* play);
void EnDemoheishi_Draw(Actor* thisx, PlayState* play);
-void EnDemoheishi_ChangeAnim(EnDemoheishi* this, s32 animIndex);
void EnDemoheishi_SetupIdle(EnDemoheishi* this);
void EnDemoheishi_Idle(EnDemoheishi* this, PlayState* play);
void EnDemoheishi_SetupTalk(EnDemoheishi* this);
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
-} EnDemoheishiAnimation;
ActorInit En_Demo_heishi_InitVars = {
ACTOR_EN_DEMO_HEISHI,
@@ -71,7 +61,7 @@ void EnDemoheishi_Init(Actor* thisx, PlayState* play) {
SkelAnime_InitFlex(play, &this->skelAnime, &gSoldierSkel, &gSoldierWave, this->jointTable, this->morphTable,
SOLDIER_LIMB_MAX);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
this->actor.gravity = -3.0f;
Collider_InitAndSetCylinder(play, &this->colliderCylinder, &this->actor, &sCylinderInit);
EnDemoheishi_SetupIdle(this);
@@ -83,18 +73,35 @@ void EnDemoheishi_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyCylinder(play, &this->colliderCylinder);
}
-void EnDemoheishi_ChangeAnim(EnDemoheishi* this, s32 animIndex) {
- static AnimationHeader* sAnimations[] = {
- &gSoldierStandHandOnHip, &gSoldierCheerWithSpear, &gSoldierWave, &gSoldierSitAndReach, &gSoldierStandUp,
- };
- static u8 sAnimationModes[] = {
- ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_LOOP,
- ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP,
- };
+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,
+ /* 5 */ DEMOHEISHI_ANIM_MAX
+} EnDemoheishiAnimation;
+static AnimationHeader* sAnimations[DEMOHEISHI_ANIM_MAX] = {
+ &gSoldierStandHandOnHip, // DEMOHEISHI_ANIM_STAND_HAND_ON_HIP
+ &gSoldierCheerWithSpear, // DEMOHEISHI_ANIM_CHEER_WITH_SPEAR
+ &gSoldierWave, // DEMOHEISHI_ANIM_WAVE
+ &gSoldierSitAndReach, // DEMOHEISHI_ANIM_SIT_AND_REACH
+ &gSoldierStandUp, // DEMOHEISHI_ANIM_STAND_UP
+};
+
+static u8 sAnimationModes[DEMOHEISHI_ANIM_MAX] = {
+ ANIMMODE_LOOP, // DEMOHEISHI_ANIM_STAND_HAND_ON_HIP
+ ANIMMODE_LOOP, // DEMOHEISHI_ANIM_CHEER_WITH_SPEAR
+ ANIMMODE_LOOP, // DEMOHEISHI_ANIM_WAVE
+ ANIMMODE_LOOP, // DEMOHEISHI_ANIM_SIT_AND_REACH
+ ANIMMODE_ONCE, // DEMOHEISHI_ANIM_STAND_UP
+};
+
+void EnDemoheishi_ChangeAnim(EnDemoheishi* this, s32 animIndex) {
this->animIndex = animIndex;
- this->frameCount = Animation_GetLastFrame(sAnimations[animIndex]);
- Animation_Change(&this->skelAnime, sAnimations[this->animIndex], 1.0f, 0.0f, this->frameCount,
+ this->animEndFrame = Animation_GetLastFrame(sAnimations[animIndex]);
+ Animation_Change(&this->skelAnime, sAnimations[this->animIndex], 1.0f, 0.0f, this->animEndFrame,
sAnimationModes[this->animIndex], -10.0f);
}
@@ -125,14 +132,14 @@ void EnDemoheishi_Idle(EnDemoheishi* this, PlayState* play) {
s32 absYawDiff;
s16 yawDiff;
- this->actor.flags &= ~ACTOR_FLAG_8000000;
+ this->actor.flags &= ~ACTOR_FLAG_CANT_LOCK_ON;
yawDiff = this->actor.yawTowardsPlayer - this->actor.world.rot.y;
absYawDiff = ABS_ALT(yawDiff);
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
EnDemoheishi_SetupTalk(this);
} else if (absYawDiff <= 0x4BB8) {
- func_800B8614(&this->actor, play, 70.0f);
+ Actor_OfferTalk(&this->actor, play, 70.0f);
}
}
@@ -143,7 +150,7 @@ void EnDemoheishi_SetupTalk(EnDemoheishi* this) {
void EnDemoheishi_Talk(EnDemoheishi* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
EnDemoheishi_SetupIdle(this);
}
}
@@ -160,7 +167,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 +195,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_Demo_heishi/z_en_demo_heishi.h b/src/overlays/actors/ovl_En_Demo_heishi/z_en_demo_heishi.h
index 9d9714b95..8c1a576f5 100644
--- a/src/overlays/actors/ovl_En_Demo_heishi/z_en_demo_heishi.h
+++ b/src/overlays/actors/ovl_En_Demo_heishi/z_en_demo_heishi.h
@@ -22,7 +22,7 @@ typedef struct EnDemoheishi {
/* 0x262 */ s16 headRotZTarget;
/* 0x264 */ s32 animIndex;
/* 0x268 */ s16 timer;
- /* 0x26C */ f32 frameCount;
+ /* 0x26C */ f32 animEndFrame;
/* 0x270 */ s16 isTalking;
/* 0x272 */ s16 textIdIndex;
/* 0x274 */ ColliderCylinder colliderCylinder;
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 d9bebb404..bd0139222 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 FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | 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
@@ -186,33 +185,41 @@ typedef enum {
/* 16 */ DOG_ANIM_MAX
} DogAnimation;
-static AnimationInfoS sAnimationInfo[] = {
- { &gDogWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, { &gDogWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -6 },
- { &gDogRunAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, { &gDogBarkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -6 },
- { &gDogSitAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -6 }, { &gDogSitAnim, 1.0f, 0, -1, ANIMMODE_LOOP_PARTIAL, -6 },
- { &gDogLyingDownAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -6 }, { &gDogLyingDownLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -6 },
- { &gDogLyingDownAnim, 1.0f, 0, 27, ANIMMODE_ONCE, -6 }, { &gDogLyingDownAnim, 1.0f, 28, -1, ANIMMODE_ONCE, -6 },
- { &gDogLyingDownAnim, 1.0f, 54, 54, ANIMMODE_ONCE, -6 }, { &gDogWalkAnim, -1.5f, -1, 0, ANIMMODE_LOOP, -6 },
- { &gDogJumpAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, { &gDogLongJumpAnim, 1.2f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gDogJumpAttackAnim, 1.2f, 0, -1, ANIMMODE_ONCE, 0 }, { &gDogWalkAnim, 0.5f, 0, -1, ANIMMODE_LOOP, 0 },
+static AnimationInfoS sAnimationInfo[DOG_ANIM_MAX] = {
+ { &gDogWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DOG_ANIM_WALK_AFTER_TALKING
+ { &gDogWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -6 }, // DOG_ANIM_WALK
+ { &gDogRunAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DOG_ANIM_RUN
+ { &gDogBarkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -6 }, // DOG_ANIM_BARK
+ { &gDogSitAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -6 }, // DOG_ANIM_SIT_DOWN_ONCE
+ { &gDogSitAnim, 1.0f, 0, -1, ANIMMODE_LOOP_PARTIAL, -6 }, // DOG_ANIM_SIT_DOWN
+ { &gDogLyingDownAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -6 }, // DOG_ANIM_LYING_DOWN_START_1
+ { &gDogLyingDownLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -6 }, // DOG_ANIM_LYING_DOWN_LOOP
+ { &gDogLyingDownAnim, 1.0f, 0, 27, ANIMMODE_ONCE, -6 }, // DOG_ANIM_LYING_DOWN_START_2
+ { &gDogLyingDownAnim, 1.0f, 28, -1, ANIMMODE_ONCE, -6 }, // DOG_ANIM_LYING_DOWN_START_3
+ { &gDogLyingDownAnim, 1.0f, 54, 54, ANIMMODE_ONCE, -6 }, // DOG_ANIM_LYING_DOWN_START_4
+ { &gDogWalkAnim, -1.5f, -1, 0, ANIMMODE_LOOP, -6 }, // DOG_ANIM_WALK_BACKWARDS
+ { &gDogJumpAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DOG_ANIM_JUMP
+ { &gDogLongJumpAnim, 1.2f, 0, -1, ANIMMODE_ONCE, 0 }, // DOG_ANIM_LONG_JUMP
+ { &gDogJumpAttackAnim, 1.2f, 0, -1, ANIMMODE_ONCE, 0 }, // DOG_ANIM_JUMP_ATTACK
+ { &gDogWalkAnim, 0.5f, 0, -1, ANIMMODE_LOOP, 0 }, // DOG_ANIM_SWIM
};
static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneForward, 1000, ICHAIN_STOP),
};
-void EnDg_ChangeAnim(SkelAnime* skelAnime, AnimationInfoS* animationInfo, s32 animIndex) {
- f32 frameCount;
+void EnDg_ChangeAnim(SkelAnime* skelAnime, AnimationInfoS* animInfo, s32 animIndex) {
+ f32 endFrame;
- animationInfo += animIndex;
- if (animationInfo->frameCount < 0) {
- frameCount = Animation_GetLastFrame(animationInfo->animation);
+ animInfo += animIndex;
+ if (animInfo->frameCount < 0) {
+ endFrame = Animation_GetLastFrame(animInfo->animation);
} else {
- frameCount = animationInfo->frameCount;
+ endFrame = animInfo->frameCount;
}
- Animation_Change(skelAnime, animationInfo->animation, animationInfo->playSpeed + (BREG(88) * 0.1f),
- animationInfo->startFrame, frameCount, animationInfo->mode, animationInfo->morphFrames);
+ Animation_Change(skelAnime, animInfo->animation, animInfo->playSpeed + (BREG(88) * 0.1f), animInfo->startFrame,
+ endFrame, animInfo->mode, animInfo->morphFrames);
}
void EnDg_UpdateCollision(EnDg* this, PlayState* play) {
@@ -237,7 +244,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 +288,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 +317,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));
}
/**
@@ -322,7 +329,7 @@ void EnDg_MoveAlongPath(EnDg* this, PlayState* play) {
if (this->path != NULL) {
yRotation = EnDg_GetYRotation(this->path, this->currentPoint, &this->actor.world.pos, &distSq);
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
yRotation = this->actor.wallYaw;
}
@@ -338,15 +345,15 @@ void EnDg_MoveAlongPath(EnDg* this, PlayState* play) {
if ((this->index == ENDG_INDEX_SWAMP_SPIDER_HOUSE) ||
((this->index == ENDG_INDEX_ROMANI_RANCH) && (play->sceneId == SCENE_OMOYA))) {
- Math_ApproachF(&this->actor.speedXZ, 1.0f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 1.0f, 0.2f, 1.0f);
} else if (this->index == ENDG_INDEX_ROMANI_RANCH) {
- Math_ApproachF(&this->actor.speedXZ, 3.5f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 3.5f, 0.2f, 1.0f);
} else if (play->sceneId == SCENE_CLOCKTOWER) {
- Math_ApproachF(&this->actor.speedXZ, 3.5f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 3.5f, 0.2f, 1.0f);
} else if (sRacetrackDogInfo[this->index].textId & 0x11) {
- Math_ApproachF(&this->actor.speedXZ, 1.0f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 1.0f, 0.2f, 1.0f);
} else {
- Math_ApproachF(&this->actor.speedXZ, 3.5f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 3.5f, 0.2f, 1.0f);
}
} else {
Actor_Kill(&this->actor);
@@ -355,49 +362,49 @@ void EnDg_MoveAlongPath(EnDg* this, PlayState* play) {
void EnDg_SpawnFloorDustRing(EnDg* this, PlayState* play) {
s16 curFrame = this->skelAnime.curFrame;
- s16 mod = (this->actor.speedXZ > 6.0f) ? 2 : 3;
+ s16 mod = (this->actor.speed > 6.0f) ? 2 : 3;
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);
}
}
void EnDg_PlaySfxWalk(EnDg* this) {
if (Animation_OnFrame(&this->skelAnime, 1.0f) || Animation_OnFrame(&this->skelAnime, 7.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_MONKEY_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_MONKEY_WALK);
}
}
void EnDg_PlaySfxBark(EnDg* this, f32 frame) {
if (Animation_OnFrame(&this->skelAnime, frame)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_SMALL_DOG_BARK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_SMALL_DOG_BARK);
}
}
void EnDg_PlaySfxAngryBark(EnDg* this, f32 frame) {
if (Animation_OnFrame(&this->skelAnime, frame)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_SMALL_DOG_ANG_BARK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_SMALL_DOG_ANG_BARK);
}
}
void EnDg_PlaySfxWhine(EnDg* this) {
if (Animation_OnFrame(&this->skelAnime, 23.0f) || Animation_OnFrame(&this->skelAnime, 28.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_SMALL_DOG_WHINE);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_SMALL_DOG_WHINE);
}
}
void EnDg_PlaySfxGrowl(EnDg* this, f32 frame) {
if (Animation_OnFrame(&this->skelAnime, frame)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_SMALL_DOG_GROAN);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_SMALL_DOG_GROAN);
}
}
void EnDg_SetupIdleMove(EnDg* this, PlayState* play) {
- if (!(this->actor.bgCheckFlags & 0x20)) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_WATER)) {
if ((this->index == ENDG_INDEX_SWAMP_SPIDER_HOUSE) ||
((this->index == ENDG_INDEX_ROMANI_RANCH) && (play->sceneId == SCENE_OMOYA))) {
EnDg_ChangeAnim(&this->skelAnime, sAnimationInfo, DOG_ANIM_WALK);
@@ -417,20 +424,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);
}
@@ -473,35 +473,35 @@ void EnDg_StartTextBox(EnDg* this, PlayState* play) {
*/
void EnDg_TryPickUp(EnDg* this, PlayState* play) {
if (sIsAnyDogHeld && !(this->dogFlags & DOG_FLAG_HELD)) {
- this->actor.flags |= ACTOR_FLAG_8000000;
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
this->dogFlags |= DOG_FLAG_HELD;
} else if (!sIsAnyDogHeld && (this->dogFlags & DOG_FLAG_HELD)) {
- this->actor.flags &= ~ACTOR_FLAG_8000000;
+ this->actor.flags &= ~ACTOR_FLAG_CANT_LOCK_ON;
this->dogFlags &= ~DOG_FLAG_HELD;
}
if (Actor_HasParent(&this->actor, play)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_SMALL_DOG_BARK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_SMALL_DOG_BARK);
this->grabState = DOG_GRAB_STATE_HELD;
sSelectedRacetrackDogInfo = sRacetrackDogInfo[this->index];
if (!sIsAnyDogHeld) {
- this->actor.flags |= ACTOR_FLAG_8000000;
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
sIsAnyDogHeld = true;
this->dogFlags |= DOG_FLAG_HELD;
}
EnDg_ChangeAnim(&this->skelAnime, sAnimationInfo, DOG_ANIM_SIT_DOWN);
- this->actor.flags &= ~ACTOR_FLAG_1;
- this->actor.speedXZ = 0.0f;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ this->actor.speed = 0.0f;
if (Player_GetMask(play) == PLAYER_MASK_TRUTH) {
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
this->actionFunc = EnDg_SetupTalk;
} else {
this->actionFunc = EnDg_Held;
}
} else {
- Actor_LiftActor(&this->actor, play);
+ Actor_OfferCarry(&this->actor, play);
}
}
@@ -516,7 +516,7 @@ s32 EnDg_FindFollowerForBremenMask(PlayState* play) {
while (enemy != NULL) {
if (enemy->id == ACTOR_EN_DG) {
- if (enemy->isTargeted) {
+ if (enemy->isLockedOn) {
sBremenMaskFollowerIndex = ((EnDg*)enemy)->index;
return true;
}
@@ -562,7 +562,7 @@ void EnDg_CheckForBremenMaskMarch(EnDg* this, PlayState* play) {
} else if ((this->actionFunc == EnDg_ApproachPlayer) || (this->actionFunc == EnDg_SitNextToPlayer)) {
if (DECR(this->bremenBarkTimer) == 0) {
this->bremenBarkTimer = 10;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_SMALL_DOG_BARK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_SMALL_DOG_BARK);
}
}
}
@@ -608,7 +608,7 @@ s32 EnDg_ShouldReactToNonHumanPlayer(EnDg* this, PlayState* play) {
void EnDg_ChooseActionForForm(EnDg* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (!(this->actor.bgCheckFlags & 0x20)) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_WATER)) {
switch (player->transformation) {
case PLAYER_FORM_HUMAN:
if (this->behavior != DOG_BEHAVIOR_HUMAN) {
@@ -620,7 +620,7 @@ void EnDg_ChooseActionForForm(EnDg* this, PlayState* play) {
case PLAYER_FORM_ZORA:
this->dogFlags &= ~DOG_FLAG_JUMP_ATTACKING;
- if ((this->behavior != DOG_BEHAVIOR_ZORA) && (player->actor.speedXZ > 1.0f)) {
+ if ((this->behavior != DOG_BEHAVIOR_ZORA) && (player->actor.speed > 1.0f)) {
this->behavior = DOG_BEHAVIOR_ZORA;
EnDg_ChangeAnim(&this->skelAnime, sAnimationInfo, DOG_ANIM_RUN);
this->actionFunc = EnDg_ApproachPlayer;
@@ -634,7 +634,7 @@ void EnDg_ChooseActionForForm(EnDg* this, PlayState* play) {
case PLAYER_FORM_GORON:
this->dogFlags &= ~DOG_FLAG_JUMP_ATTACKING;
- if ((this->behavior != DOG_BEHAVIOR_GORON) && (player->actor.speedXZ > 1.0f)) {
+ if ((this->behavior != DOG_BEHAVIOR_GORON) && (player->actor.speed > 1.0f)) {
this->behavior = DOG_BEHAVIOR_GORON;
EnDg_ChangeAnim(&this->skelAnime, sAnimationInfo, DOG_ANIM_WALK_BACKWARDS);
this->timer = 50;
@@ -649,7 +649,7 @@ void EnDg_ChooseActionForForm(EnDg* this, PlayState* play) {
case PLAYER_FORM_DEKU:
this->dogFlags &= ~DOG_FLAG_JUMP_ATTACKING;
- if ((this->behavior != DOG_BEHAVIOR_DEKU) && (player->actor.speedXZ > 1.0f)) {
+ if ((this->behavior != DOG_BEHAVIOR_DEKU) && (player->actor.speed > 1.0f)) {
this->behavior = DOG_BEHAVIOR_DEKU;
EnDg_ChangeAnim(&this->skelAnime, sAnimationInfo, DOG_ANIM_RUN);
this->actionFunc = EnDg_ApproachPlayerToAttack;
@@ -680,7 +680,7 @@ void EnDg_IdleMove(EnDg* this, PlayState* play) {
EnDg_CheckForBremenMaskMarch(this, play);
EnDg_PlaySfxWalk(this);
- if (!(this->actor.bgCheckFlags & 1)) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
this->actionFunc = EnDg_Fall;
}
@@ -704,7 +704,7 @@ void EnDg_IdleBark(EnDg* this, PlayState* play) {
EnDg_PlaySfxBark(this, 13.0f);
EnDg_PlaySfxBark(this, 19.0f);
- if (!(this->actor.bgCheckFlags & 1)) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
this->actionFunc = EnDg_Fall;
}
@@ -728,12 +728,12 @@ void EnDg_BackAwayFromGoron(EnDg* this, PlayState* play) {
this->actionFunc = EnDg_RunAwayFromGoron;
} else {
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 4, 0x3E8, 1);
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->actor.shape.rot.y = this->actor.wallYaw;
}
this->actor.world.rot.y = this->actor.shape.rot.y;
- Math_ApproachF(&this->actor.speedXZ, -1.5f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, -1.5f, 0.2f, 1.0f);
Actor_MoveWithGravity(&this->actor);
}
@@ -752,7 +752,7 @@ void EnDg_RunAwayFromGoron(EnDg* this, PlayState* play) {
if (this->actor.xzDistToPlayer < 250.0f) {
Math_ApproachS(&this->actor.shape.rot.y, -this->actor.yawTowardsPlayer, 4, 0xC00);
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
yRotation = this->actor.wallYaw;
} else {
yRotation = 0;
@@ -760,27 +760,27 @@ void EnDg_RunAwayFromGoron(EnDg* this, PlayState* play) {
Math_SmoothStepToS(&this->actor.world.rot.y, yRotation, 4, 0x3E8, 1);
this->actor.world.rot.y = this->actor.shape.rot.y;
- if (player->actor.speedXZ != 0.0f) {
- Math_ApproachF(&this->actor.speedXZ, player->actor.speedXZ, 0.2f, 1.0f);
+ if (player->actor.speed != 0.0f) {
+ Math_ApproachF(&this->actor.speed, player->actor.speed, 0.2f, 1.0f);
} else {
- Math_ApproachF(&this->actor.speedXZ, 3.5f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 3.5f, 0.2f, 1.0f);
}
} else {
EnDg_ChangeAnim(&this->skelAnime, sAnimationInfo, DOG_ANIM_BARK);
this->actionFunc = EnDg_BarkAtGoron;
}
- if (this->actor.speedXZ > 7.0f) {
- this->actor.speedXZ = 7.0f;
+ if (this->actor.speed > 7.0f) {
+ this->actor.speed = 7.0f;
}
Actor_MoveWithGravity(&this->actor);
EnDg_PlaySfxWalk(this);
if (Animation_OnFrame(&this->skelAnime, 3.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_SMALL_DOG_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_SMALL_DOG_CRY);
} else if (Animation_OnFrame(&this->skelAnime, 6.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_MONKEY_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_MONKEY_WALK);
}
}
@@ -805,13 +805,13 @@ void EnDg_ApproachPlayerToAttack(EnDg* this, PlayState* play) {
this->actor.velocity.y = 0.0f;
this->actor.gravity = -3.0f;
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->actor.shape.rot.y = this->actor.wallYaw;
}
this->actor.world.rot.y = this->actor.shape.rot.y;
if (this->actor.xzDistToPlayer < 70.0f) {
- Math_ApproachZeroF(&this->actor.speedXZ, 0.2f, 1.0f);
+ Math_ApproachZeroF(&this->actor.speed, 0.2f, 1.0f);
if (Animation_OnFrame(&this->skelAnime, 7.0f)) {
s16 yawDiff = ABS_ALT(player->actor.shape.rot.y - this->actor.shape.rot.y);
@@ -827,7 +827,7 @@ void EnDg_ApproachPlayerToAttack(EnDg* this, PlayState* play) {
}
} else {
Math_ApproachS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 4, 0xC00);
- Math_ApproachF(&this->actor.speedXZ, 5.0f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 5.0f, 0.2f, 1.0f);
}
Actor_MoveWithGravity(&this->actor);
@@ -841,7 +841,7 @@ void EnDg_ApproachPlayerToAttack(EnDg* this, PlayState* play) {
*/
void EnDg_RunAfterAttacking(EnDg* this, PlayState* play) {
this->dogFlags &= ~DOG_FLAG_BOUNCED;
- Math_ApproachF(&this->actor.speedXZ, 3.5f, 0.1f, 0.5f);
+ Math_ApproachF(&this->actor.speed, 3.5f, 0.1f, 0.5f);
Actor_MoveWithGravity(&this->actor);
if (DECR(this->attackTimer) == 0) {
this->attackTimer = 20;
@@ -859,7 +859,7 @@ void EnDg_RunAfterAttacking(EnDg* this, PlayState* play) {
void EnDg_SitNextToPlayer(EnDg* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (!(this->actor.bgCheckFlags & 1)) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
this->actionFunc = EnDg_Fall;
}
@@ -893,7 +893,7 @@ void EnDg_JumpAttack(EnDg* this, PlayState* play) {
this->dogFlags &= ~DOG_FLAG_JUMP_ATTACKING;
this->dogFlags |= DOG_FLAG_BOUNCED;
this->collider.base.atFlags &= ~AT_BOUNCED;
- this->actor.speedXZ *= -1.0f;
+ this->actor.speed *= -1.0f;
EnDg_ChangeAnim(&this->skelAnime, sAnimationInfo, DOG_ANIM_RUN);
this->actionFunc = EnDg_RunAfterAttacking;
return;
@@ -908,20 +908,20 @@ 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;
- this->actor.speedXZ = 8.0f + rand;
+ this->actor.speed = 8.0f + rand;
} else if (curFrame > 20) {
- Math_ApproachF(&this->actor.speedXZ, 2.5f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 2.5f, 0.2f, 1.0f);
}
if (curFrame > 23) {
@@ -949,7 +949,7 @@ void EnDg_WalkToPlayer(EnDg* this, PlayState* play) {
} else {
Math_ApproachS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 4, 0xC00);
this->actor.world.rot.y = this->actor.shape.rot.y;
- Math_ApproachF(&this->actor.speedXZ, 2.0f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 2.0f, 0.2f, 1.0f);
Actor_MoveWithGravity(&this->actor);
}
@@ -960,13 +960,13 @@ void EnDg_WalkToPlayer(EnDg* this, PlayState* play) {
void EnDg_SetupBremenMaskApproachPlayer(EnDg* this, PlayState* play) {
if (func_801A46F8() == 1) {
this->bremenBarkTimer = 10;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_SMALL_DOG_BARK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_SMALL_DOG_BARK);
this->actionFunc = EnDg_ApproachPlayer;
}
}
void EnDg_Fall(EnDg* this, PlayState* play) {
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
EnDg_ChangeAnim(&this->skelAnime, sAnimationInfo, DOG_ANIM_RUN);
this->actionFunc = EnDg_IdleMove;
}
@@ -996,12 +996,12 @@ void EnDg_ApproachPlayer(EnDg* this, PlayState* play) {
this->actionFunc = EnDg_SitNextToPlayer;
} else if (player->stateFlags3 & PLAYER_STATE3_20000000) {
if ((this->actor.xzDistToPlayer > 40.0f) && (player->linearVelocity == 0.0f)) {
- Math_ApproachF(&this->actor.speedXZ, 1.5f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 1.5f, 0.2f, 1.0f);
} else {
- Math_ApproachF(&this->actor.speedXZ, player->actor.speedXZ, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, player->actor.speed, 0.2f, 1.0f);
}
} else {
- Math_ApproachF(&this->actor.speedXZ, 3.5f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 3.5f, 0.2f, 1.0f);
}
EnDg_CheckForBremenMaskMarch(this, play);
@@ -1026,14 +1026,14 @@ void EnDg_SlowlyBackUpBeforeAttacking(EnDg* this, PlayState* play) {
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 4, 0x3E8, 1);
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->actor.shape.rot.y = this->actor.wallYaw;
EnDg_ChangeAnim(&this->skelAnime, sAnimationInfo, DOG_ANIM_JUMP_ATTACK);
this->actionFunc = EnDg_JumpAttack;
}
this->actor.world.rot.y = this->actor.shape.rot.y;
- Math_ApproachF(&this->actor.speedXZ, -1.0f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, -1.0f, 0.2f, 1.0f);
Actor_MoveWithGravity(&this->actor);
EnDg_PlaySfxWalk(this);
EnDg_PlaySfxGrowl(this, 4.0f);
@@ -1054,17 +1054,17 @@ void EnDg_BackAwayFromPlayer(EnDg* this, PlayState* play) {
this->actionFunc = EnDg_BarkAtPlayer;
} else {
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 4, 0x3E8, 1);
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->actor.shape.rot.y = this->actor.wallYaw;
}
this->actor.world.rot.y = this->actor.shape.rot.y;
- Math_ApproachF(&this->actor.speedXZ, -2.0f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, -2.0f, 0.2f, 1.0f);
Actor_MoveWithGravity(&this->actor);
}
EnDg_PlaySfxWalk(this);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_SMALL_DOG_GROAN);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_SMALL_DOG_GROAN);
}
/**
@@ -1106,11 +1106,11 @@ void EnDg_SetupSwim(EnDg* this, PlayState* play) {
this->actor.gravity = 0.0f;
this->actor.velocity.y = -3.0f;
this->swimTimer = 10;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMB_DROP_WATER);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BOMB_DROP_WATER);
this->actionFunc = EnDg_Swim;
}
- Math_ApproachF(&this->actor.speedXZ, 1.0f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 1.0f, 0.2f, 1.0f);
Actor_MoveWithGravity(&this->actor);
}
@@ -1138,7 +1138,7 @@ void EnDg_Swim(EnDg* this, PlayState* play) {
if (DECR(this->swimTimer) == 0) {
if (!(this->dogFlags & DOG_FLAG_SWIMMING)) {
this->dogFlags |= DOG_FLAG_SWIMMING;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_OUT_OF_WATER);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_OUT_OF_WATER);
}
this->swimTimer = 5;
@@ -1158,7 +1158,7 @@ void EnDg_Swim(EnDg* this, PlayState* play) {
// over. For example, if the player throws the dog at a tall wall next to some water,
// this code will make the dog "skip" along the water's surface, assuming the floor
// height is low enough to make it try to jump out.
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
if (!WaterBox_GetSurface1(play, &play->colCtx, pos.x, pos.z, &waterSurface, &waterBox)) {
if (floorHeight > -100.0f) {
this->dogFlags &= ~DOG_FLAG_SWIMMING;
@@ -1176,20 +1176,20 @@ void EnDg_Swim(EnDg* this, PlayState* play) {
} else {
yRotation = this->actor.wallYaw;
}
- } else if ((this->actor.bgCheckFlags & 1) && !(this->actor.bgCheckFlags & 0x20)) {
+ } else if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && !(this->actor.bgCheckFlags & BGCHECKFLAG_WATER)) {
this->actor.gravity = -3.0f;
this->dogFlags &= ~DOG_FLAG_SWIMMING;
this->behavior = DOG_BEHAVIOR_DEFAULT;
this->timer = Rand_S16Offset(60, 60);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_OUT_OF_WATER);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_OUT_OF_WATER);
EnDg_ChangeAnim(&this->skelAnime, sAnimationInfo, DOG_ANIM_RUN);
- Math_ApproachF(&this->actor.speedXZ, 3.5f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 3.5f, 0.2f, 1.0f);
this->actionFunc = EnDg_IdleMove;
}
Math_SmoothStepToS(&this->actor.world.rot.y, yRotation, 4, 0x3E8, 1);
this->actor.shape.rot.y = this->actor.world.rot.y;
- Math_ApproachF(&this->actor.speedXZ, 0.5f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 0.5f, 0.2f, 1.0f);
Actor_MoveWithGravity(&this->actor);
}
@@ -1216,23 +1216,23 @@ void EnDg_JumpOutOfWater(EnDg* this, PlayState* play) {
this->actor.velocity.y = -1.0f;
}
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->actor.world.pos.y = pos.y;
this->actor.velocity.y = 10.0f;
EffectSsGSplash_Spawn(play, &pos, NULL, NULL, 0, 800);
}
- if (!(this->actor.bgCheckFlags & 0x20)) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_WATER)) {
this->behavior = DOG_BEHAVIOR_DEFAULT;
this->actor.velocity.y = 10.0f;
this->actor.gravity = -3.0f;
this->timer = Rand_S16Offset(60, 60);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_OUT_OF_WATER);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_OUT_OF_WATER);
EnDg_ChangeAnim(&this->skelAnime, sAnimationInfo, DOG_ANIM_RUN);
this->actionFunc = EnDg_IdleMove;
- Math_ApproachF(&this->actor.speedXZ, 3.5f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 3.5f, 0.2f, 1.0f);
} else {
- Math_ApproachF(&this->actor.speedXZ, 0.5f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 0.5f, 0.2f, 1.0f);
}
Actor_MoveWithGravity(&this->actor);
@@ -1241,9 +1241,9 @@ void EnDg_JumpOutOfWater(EnDg* this, PlayState* play) {
void EnDg_Held(EnDg* this, PlayState* play) {
if (Actor_HasNoParent(&this->actor, play)) {
this->grabState = DOG_GRAB_STATE_THROWN_OR_SITTING_AFTER_THROW;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
if (sIsAnyDogHeld) {
- this->actor.flags &= ~ACTOR_FLAG_8000000;
+ this->actor.flags &= ~ACTOR_FLAG_CANT_LOCK_ON;
sIsAnyDogHeld = false;
this->dogFlags &= ~DOG_FLAG_HELD;
}
@@ -1260,13 +1260,13 @@ void EnDg_Held(EnDg* this, PlayState* play) {
void EnDg_Thrown(EnDg* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
if (this->dogFlags & DOG_FLAG_THROWN) {
this->dogFlags &= ~DOG_FLAG_THROWN;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_MONKEY_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_MONKEY_WALK);
}
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.gravity = -3.0f;
if (player->transformation == PLAYER_FORM_HUMAN) {
EnDg_TryPickUp(this, play);
@@ -1288,7 +1288,7 @@ void EnDg_SetupTalk(EnDg* this, PlayState* play) {
EnDg_StartTextBox(this, play);
this->actionFunc = EnDg_Talk;
} else {
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
}
@@ -1310,9 +1310,9 @@ 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.targetMode = TARGET_MODE_1;
this->actor.gravity = -3.0f;
this->timer = Rand_S16Offset(60, 60);
this->dogFlags = DOG_FLAG_NONE;
@@ -1350,7 +1350,7 @@ void EnDg_Update(Actor* thisx, PlayState* play) {
EnDg_SetupIdleMove(this, play);
}
- if ((this->actor.bgCheckFlags & 0x40) && Actor_HasNoParent(&this->actor, play)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) && Actor_HasNoParent(&this->actor, play)) {
EnDg_ChangeAnim(&this->skelAnime, sAnimationInfo, DOG_ANIM_SWIM);
this->actionFunc = EnDg_SetupSwim;
}
@@ -1387,7 +1387,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 643c167f0..22c247c1f 100644
--- a/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.c
+++ b/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.c
@@ -5,9 +5,9 @@
*/
#include "z_en_dinofos.h"
-#include "objects/object_dinofos/object_dinofos.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_400)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_400)
#define THIS ((EnDinofos*)thisx)
@@ -241,14 +241,14 @@ static DamageTable sDamageTable = {
static CollisionCheckInfoInit sColChkInfoInit = { 4, 40, 100, 80 };
-static TexturePtr D_8089E33C[] = {
- object_dinofos_Tex_008E30,
- object_dinofos_Tex_009030,
- object_dinofos_Tex_009230,
- object_dinofos_Tex_009030,
+static TexturePtr sEyeTextures[] = {
+ gDinolfosEyeOpenTex,
+ gDinolfosEyeHalfTex,
+ gDinolfosEyeClosedTex,
+ gDinolfosEyeHalfTex,
};
-static s16 D_8089E34C = -1;
+static s16 sCsId = CS_ID_NONE;
static s32 D_8089E350 = 0;
static InitChainEntry sInitChain[] = {
@@ -274,12 +274,12 @@ void EnDinofos_Init(Actor* thisx, PlayState* play) {
Collider_InitAndSetJntSph(play, &this->colliderJntSph, &this->actor, &sJntSphInit, this->colliderJntSphElement);
Collider_InitAndSetQuad(play, &this->colliderQuad, &this->actor, &sQuadInit);
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_dinofos_Skel_009570, &object_dinofos_Anim_002E40,
- this->jointTable, this->morphTable, 21);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gDinolfosSkel, &gDinolfosIdleAnim, this->jointTable, this->morphTable,
+ DINOLFOS_LIMB_MAX);
if (D_8089E364 == 0) {
- for (i = 0; i < ARRAY_COUNT(D_8089E33C); i++) {
- D_8089E33C[i] = Lib_SegmentedToVirtual(D_8089E33C[i]);
+ for (i = 0; i < ARRAY_COUNT(sEyeTextures); i++) {
+ sEyeTextures[i] = Lib_SegmentedToVirtual(sEyeTextures[i]);
}
D_8089E364 = 1;
}
@@ -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);
}
}
}
@@ -378,11 +378,11 @@ void func_8089AC70(EnDinofos* this) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX;
this->drawDmgEffScale = 0.55f;
this->colliderJntSph.base.colType = COLTYPE_HIT3;
- this->drawDmgEffFrozenSteamScale = 0.82500005f;
+ this->drawDmgEffFrozenSteamScale = 825.0f * 0.001f;
this->drawDmgEffAlpha = 1.0f;
this->unk_290 = 80;
this->actor.flags &= ~ACTOR_FLAG_400;
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 80);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 80);
}
void func_8089ACEC(EnDinofos* this, PlayState* play) {
@@ -390,7 +390,7 @@ void func_8089ACEC(EnDinofos* this, PlayState* play) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->colliderJntSph.base.colType = COLTYPE_HIT0;
this->drawDmgEffAlpha = 0.0f;
- Actor_SpawnIceEffects(play, &this->actor, this->limbPos, 12, 2, 0.3f, 0.2f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, DINOFOS_BODYPART_MAX, 2, 0.3f, 0.2f);
this->actor.flags |= ACTOR_FLAG_400;
}
}
@@ -415,20 +415,20 @@ s32 func_8089AE00(EnDinofos* this, PlayState* play) {
temp_v0 = func_800BC270(play, &this->actor, 80.0f, 0x138B0);
if (temp_v0 != NULL) {
- temp_v1 = (Actor_YawBetweenActors(&this->actor, temp_v0) - this->actor.shape.rot.y) - this->unk_28E;
+ temp_v1 = (Actor_WorldYawTowardActor(&this->actor, temp_v0) - this->actor.shape.rot.y) - this->unk_28E;
if (ABS_ALT(temp_v1) < 0x3000) {
func_8089D11C(this, temp_v1 + this->unk_28E);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_RIZA_WARAU);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_RIZA_WARAU);
return true;
}
}
temp_v0 = func_800BC444(play, &this->actor, 80.0f);
if ((temp_v0 != NULL) && (temp_v0->id == ACTOR_EN_BOM_CHU)) {
- temp_v1_2 = (Actor_YawBetweenActors(&this->actor, temp_v0) - this->actor.shape.rot.y) - this->unk_28E;
+ temp_v1_2 = (Actor_WorldYawTowardActor(&this->actor, temp_v0) - this->actor.shape.rot.y) - this->unk_28E;
if (ABS_ALT(temp_v1_2) < 0x3000) {
func_8089C024(this, 1);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_RIZA_WARAU);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_RIZA_WARAU);
return true;
}
}
@@ -438,19 +438,20 @@ 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.isLockedOn && (Rand_ZeroOne() < 0.5f) && func_8089A968(this) &&
+ Player_IsFacingActor(&this->actor, 0x2000, play)) {
if (Rand_ZeroOne() < 0.5f) {
func_8089C024(this, 2);
} else {
func_8089C024(this, 3);
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_RIZA_WARAU);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_RIZA_WARAU);
return true;
}
- if ((gSaveContext.save.playerForm == PLAYER_FORM_GORON) && (player->actor.velocity.y < -5.0f) &&
- (player->unk_AE7 == 1) && (this->unk_28B == 0)) {
+ if ((GET_PLAYER_FORM == PLAYER_FORM_GORON) && (player->actor.velocity.y < -5.0f) && (player->actionVar1 == 1) &&
+ (this->unk_28B == 0)) {
this->unk_28B = 1;
for (i = 0; i < ARRAY_COUNT(this->colliderJntSphElement) - 3; i++) {
this->colliderJntSph.elements[i].info.bumper.dmgFlags &= ~0x400;
@@ -465,9 +466,8 @@ void func_8089B100(EnDinofos* this, PlayState* play) {
Player* player = GET_PLAYER(play);
Vec3f sp3C;
- Animation_Change(&this->skelAnime, &object_dinofos_Anim_001CCC, 1.0f,
- Animation_GetLastFrame(&object_dinofos_Anim_001CCC),
- Animation_GetLastFrame(&object_dinofos_Anim_001CCC), ANIMMODE_ONCE, 0.0f);
+ Animation_Change(&this->skelAnime, &gDinolfosJumpAnim, 1.0f, Animation_GetLastFrame(&gDinolfosJumpAnim),
+ Animation_GetLastFrame(&gDinolfosJumpAnim), ANIMMODE_ONCE, 0.0f);
func_800BE33C(&subCam->eye, &subCam->at, &this->unk_29A, true);
Math_Vec3f_Diff(&this->actor.world.pos, &player->actor.world.pos, &sp3C);
this->unk_2BC.x = player->actor.world.pos.x + (0.4f * sp3C.x);
@@ -496,7 +496,7 @@ void func_8089B288(EnDinofos* this, PlayState* play) {
void func_8089B320(EnDinofos* this) {
this->actor.gravity = -2.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_RIZA_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_RIZA_CRY);
this->unk_2BC.x = (Math_SinS(this->actor.shape.rot.y - 0x0E00) * 86.0f) + this->actor.world.pos.x;
this->unk_2BC.y = this->actor.floorHeight + 6.0f;
this->unk_2BC.z = (Math_CosS(this->actor.shape.rot.y - 0x0E00) * 86.0f) + this->actor.world.pos.z;
@@ -523,7 +523,7 @@ void func_8089B3D4(EnDinofos* this, PlayState* play) {
}
Play_SetCameraAtEye(play, this->subCamId, &subCamAt, &subCam->eye);
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
func_8089B4A4(this);
}
}
@@ -532,11 +532,11 @@ void func_8089B4A4(EnDinofos* this) {
if (this->unk_290 < 10) {
Audio_PlayBgm_StorePrevBgm(NA_BGM_MINI_BOSS);
}
- Animation_PlayOnce(&this->skelAnime, &object_dinofos_Anim_00C974);
+ Animation_PlayOnce(&this->skelAnime, &gDinolfosIntroAnim);
this->unk_2BC.x = (Math_SinS(this->actor.shape.rot.y + 0x200) * 123.0f) + this->actor.world.pos.x;
this->unk_2BC.y = this->actor.floorHeight + 11.0f;
this->unk_2BC.z = (Math_CosS(this->actor.shape.rot.y + 0x200) * 123.0f) + this->actor.world.pos.z;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BOMCHU_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BOMCHU_WALK);
this->unk_290 = 0;
this->unk_292 = -1;
this->actionFunc = func_8089B580;
@@ -558,12 +558,12 @@ void func_8089B580(EnDinofos* this, PlayState* play) {
Math_Vec3f_StepTo(&subCam->eye, &this->unk_2BC, 10.0f);
Play_SetCameraAtEye(play, this->subCamId, &this->actor.focus.pos, &subCam->eye);
if (this->skelAnime.curFrame <= 55.0f) {
- func_800B9010(&this->actor, NA_SE_EN_DODO_J_FIRE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_DODO_J_FIRE - SFX_FLAG);
}
}
if ((play->sceneId == SCENE_MITURIN) && Animation_OnFrame(&this->skelAnime, 55.0f)) {
- play->envCtx.lightSettingOverride = 0xFF;
+ play->envCtx.lightSettingOverride = LIGHT_SETTING_OVERRIDE_NONE;
}
if (SkelAnime_Update(&this->skelAnime)) {
@@ -572,28 +572,28 @@ void func_8089B580(EnDinofos* this, PlayState* play) {
}
void func_8089B6E8(EnDinofos* this) {
- Animation_MorphToPlayOnce(&this->skelAnime, &object_dinofos_Anim_009B70, -3.0f);
+ Animation_MorphToPlayOnce(&this->skelAnime, &gDinolfosCryAnim, -3.0f);
this->actionFunc = func_8089B72C;
}
void func_8089B72C(EnDinofos* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, 2.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_RIZA_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_RIZA_ATTACK);
}
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);
}
}
void func_8089B7B0(EnDinofos* this) {
- Animation_MorphToLoop(&this->skelAnime, &object_dinofos_Anim_002E40, -4.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gDinolfosIdleAnim, -4.0f);
this->unk_290 = (s32)Rand_ZeroFloat(20.0f) + 40;
this->unk_292 = 30;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
func_8089AD70(this);
this->actionFunc = func_8089B834;
@@ -618,16 +618,16 @@ void func_8089B8B0(EnDinofos* this, PlayState* play) {
f32 phi_f0;
if (this->actionFunc != func_8089B98C) {
- Animation_MorphToLoop(&this->skelAnime, &object_dinofos_Anim_000580, -4.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gDinolfosWalkAnim, -4.0f);
if (Actor_OtherIsTargeted(play, &this->actor)) {
phi_f0 = 170.0f;
} else {
phi_f0 = 70.0f;
}
if (this->actor.xzDistToPlayer <= phi_f0) {
- this->actor.speedXZ = -3.5f;
+ this->actor.speed = -3.5f;
} else {
- this->actor.speedXZ = 3.5f;
+ this->actor.speed = 3.5f;
}
}
@@ -650,9 +650,9 @@ void func_8089B98C(EnDinofos* this, PlayState* play) {
Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0x100);
this->actor.world.rot.y = this->actor.shape.rot.y;
if (this->actor.xzDistToPlayer <= phi_f0) {
- Math_StepToF(&this->actor.speedXZ, -7.0f, 0.5f);
+ Math_StepToF(&this->actor.speed, -7.0f, 0.5f);
} else {
- Math_StepToF(&this->actor.speedXZ, 7.0f, 0.5f);
+ Math_StepToF(&this->actor.speed, 7.0f, 0.5f);
}
if (this->actor.xzDistToPlayer < 80.0f) {
@@ -666,15 +666,15 @@ void func_8089B98C(EnDinofos* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 6.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_RIZA_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_RIZA_WALK);
}
}
}
void func_8089BAC0(EnDinofos* this) {
if (this->actionFunc != func_8089BB60) {
- Animation_MorphToLoop(&this->skelAnime, &object_dinofos_Anim_000580, -4.0f);
- this->actor.speedXZ = 0.0f;
+ Animation_MorphToLoop(&this->skelAnime, &gDinolfosWalkAnim, -4.0f);
+ this->actor.speed = 0.0f;
}
if (BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y) > 0) {
this->unk_28C = BINANG_ADD(this->actor.shape.rot.y, 0x4000);
@@ -701,21 +701,21 @@ void func_8089BBB4(EnDinofos* this, PlayState* play) {
s16 rotY = player->actor.shape.rot.y - this->actor.shape.rot.y;
if (ABS_ALT(rotY) > 0x7800) {
if (Rand_ZeroOne() < 0.5f) {
- this->actor.speedXZ = 6.0f;
+ this->actor.speed = 6.0f;
} else {
- this->actor.speedXZ = -6.0f;
+ this->actor.speed = -6.0f;
}
} else if (rotY >= 0) {
- this->actor.speedXZ = 6.0f;
+ this->actor.speed = 6.0f;
} else {
- this->actor.speedXZ = -6.0f;
+ this->actor.speed = -6.0f;
}
if (this->actionFunc == func_8089D1E0) {
- this->skelAnime.playSpeed = this->actor.speedXZ * 0.166666671634f;
+ this->skelAnime.playSpeed = this->actor.speed * 0.166666671634f;
} else {
- Animation_Change(&this->skelAnime, &object_dinofos_Anim_00D62C, this->actor.speedXZ * 0.166666671634f, 0.0f,
- 0.0f, ANIMMODE_LOOP, -4.0f);
+ Animation_Change(&this->skelAnime, &gDinolfosSidestepAnim, this->actor.speed * 0.166666671634f, 0.0f, 0.0f,
+ ANIMMODE_LOOP, -4.0f);
}
this->actor.world.rot.y = BINANG_ADD(this->actor.shape.rot.y, 0x4000);
@@ -733,8 +733,8 @@ void func_8089BD28(EnDinofos* this, PlayState* play) {
Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0xBB8);
if (!func_8089AE00(this, play)) {
- if (this->actor.bgCheckFlags & 8) {
- if (this->actor.speedXZ >= 0.0f) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
+ if (this->actor.speed >= 0.0f) {
phi_v0 = BINANG_ADD(this->actor.shape.rot.y, 0x4000);
} else {
phi_v0 = BINANG_SUB(this->actor.shape.rot.y, 0x4000);
@@ -742,23 +742,23 @@ void func_8089BD28(EnDinofos* this, PlayState* play) {
phi_v0 = this->actor.wallYaw - phi_v0;
if (ABS_ALT(phi_v0) > 0x4000) {
- this->actor.speedXZ *= -0.8f;
- if (this->actor.speedXZ < 0.0f) {
- this->actor.speedXZ -= 0.5f;
+ this->actor.speed *= -0.8f;
+ if (this->actor.speed < 0.0f) {
+ this->actor.speed -= 0.5f;
} else {
- this->actor.speedXZ += 0.5f;
+ this->actor.speed += 0.5f;
}
}
}
phi_v0 = BINANG_SUB(player->actor.shape.rot.y, this->actor.shape.rot.y);
if ((phi_v0 >= 0) && (phi_v0 < 0x7800)) {
- this->actor.speedXZ += 0.125f;
+ this->actor.speed += 0.125f;
} else if ((phi_v0 < 0) && (phi_v0 > -0x7800)) {
- this->actor.speedXZ -= 0.125f;
+ this->actor.speed -= 0.125f;
}
- if (this->actor.speedXZ > 0.0f) {
+ if (this->actor.speed > 0.0f) {
this->skelAnime.playSpeed = 1.0f;
} else {
this->skelAnime.playSpeed = -1.0f;
@@ -787,24 +787,24 @@ void func_8089BD28(EnDinofos* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 5.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_RIZA_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_RIZA_WALK);
}
}
}
void func_8089C024(EnDinofos* this, s32 arg1) {
if (arg1 == 0) {
- Animation_MorphToPlayOnce(&this->skelAnime, &object_dinofos_Anim_001CCC, 2.0f);
+ Animation_MorphToPlayOnce(&this->skelAnime, &gDinolfosJumpAnim, 2.0f);
func_8089AD70(this);
} else {
- Animation_MorphToPlayOnce(&this->skelAnime, &object_dinofos_Anim_001CCC, -1.0f);
+ Animation_MorphToPlayOnce(&this->skelAnime, &gDinolfosJumpAnim, -1.0f);
if ((arg1 == 2) || (arg1 == 3)) {
this->colliderJntSph.base.acFlags &= ~AC_ON;
func_8089AD70(this);
}
}
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->unk_290 = arg1;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = func_8089C0DC;
@@ -825,33 +825,33 @@ void func_8089C0DC(EnDinofos* this, PlayState* play) {
void func_8089C164(EnDinofos* this) {
if (this->unk_290 == 2) {
- this->actor.speedXZ = -10.0f;
+ this->actor.speed = -10.0f;
this->actor.velocity.y = 9.0f;
this->colliderJntSph.base.acFlags |= AC_ON;
} else {
this->actor.velocity.y = 12.5f;
if (this->unk_290 == 0) {
- this->actor.speedXZ = 4.5f;
+ this->actor.speed = 4.5f;
}
}
- this->actor.bgCheckFlags &= ~1;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_RIZA_JUMP);
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_RIZA_JUMP);
this->actionFunc = func_8089C1F8;
}
void func_8089C1F8(EnDinofos* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
func_8089C398(this);
}
}
void func_8089C244(EnDinofos* this) {
- this->actor.bgCheckFlags &= ~1;
- this->actor.speedXZ = 8.0f;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
+ this->actor.speed = 8.0f;
this->actor.velocity.y = 16.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_RIZA_JUMP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_RIZA_JUMP);
this->unk_290 = 0;
this->unk_292 = -1;
this->actionFunc = func_8089C2A8;
@@ -861,13 +861,13 @@ void func_8089C2A8(EnDinofos* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
this->unk_290++;
Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0x1800);
- if ((this->actor.velocity.y < 0.0f) && (this->skelAnime.animation == &object_dinofos_Anim_001CCC)) {
+ if ((this->actor.velocity.y < 0.0f) && (this->skelAnime.animation == &gDinolfosJumpAnim)) {
this->colliderQuad.base.atFlags |= AT_ON;
this->colliderJntSph.base.acFlags |= AC_ON;
- Animation_Change(&this->skelAnime, &object_dinofos_Anim_0025B4, 1.0f, 7.0f, 13.0f, ANIMMODE_ONCE, -2.0f);
+ Animation_Change(&this->skelAnime, &gDinolfosAttackAnim, 1.0f, 7.0f, 13.0f, ANIMMODE_ONCE, -2.0f);
}
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->colliderQuad.base.atFlags &= ~AT_ON;
func_8089C398(this);
}
@@ -875,20 +875,20 @@ void func_8089C2A8(EnDinofos* this, PlayState* play) {
void func_8089C398(EnDinofos* this) {
if (this->actionFunc != func_8089C2A8) {
- Animation_PlayOnce(&this->skelAnime, &object_dinofos_Anim_000AF0);
+ Animation_PlayOnce(&this->skelAnime, &gDinolfosLandAnim);
} else {
- this->skelAnime.endFrame = Animation_GetLastFrame(&object_dinofos_Anim_0025B4);
+ this->skelAnime.endFrame = Animation_GetLastFrame(&gDinolfosAttackAnim);
}
- if (this->actor.speedXZ < 0.0f) {
+ if (this->actor.speed < 0.0f) {
this->unk_290 = 1;
} else {
this->unk_290 = 0;
}
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
func_8089AD70(this);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BOMCHU_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BOMCHU_WALK);
this->actionFunc = func_8089C44C;
}
@@ -904,12 +904,12 @@ void func_8089C44C(EnDinofos* this, PlayState* play) {
}
void func_8089C4F8(EnDinofos* this) {
- Animation_PlayOnce(&this->skelAnime, &object_dinofos_Anim_0025B4);
+ Animation_PlayOnce(&this->skelAnime, &gDinolfosAttackAnim);
this->colliderQuad.base.atFlags &= ~AT_BOUNCED;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_RIZA_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_RIZA_CRY);
this->unk_290 = 0;
this->unk_292 = -1;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = func_8089C56C;
}
@@ -928,27 +928,27 @@ void func_8089C56C(EnDinofos* this, PlayState* play) {
} else if (Animation_OnFrame(&this->skelAnime, 13.0f)) {
this->colliderQuad.base.atFlags &= ~AT_ON;
} else if (Animation_OnFrame(&this->skelAnime, 11.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_RIZA_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_RIZA_ATTACK);
} else if (this->skelAnime.curFrame < 7.0f) {
func_8089AE00(this, play);
}
}
void func_8089C690(EnDinofos* this) {
- Animation_Change(&this->skelAnime, &object_dinofos_Anim_0025B4, -1.0f, this->skelAnime.curFrame, 0.0f,
- ANIMMODE_ONCE, 0.0f);
+ Animation_Change(&this->skelAnime, &gDinolfosAttackAnim, -1.0f, this->skelAnime.curFrame, 0.0f, ANIMMODE_ONCE,
+ 0.0f);
this->colliderQuad.base.atFlags &= ~(AT_ON | AT_BOUNCED);
if (this->actionFunc != func_8089C2A8) {
this->actor.world.rot.y = this->actor.shape.rot.y;
} else {
- this->actor.speedXZ = 3.0f;
+ this->actor.speed = 3.0f;
}
this->actionFunc = func_8089C724;
}
void func_8089C724(EnDinofos* this, PlayState* play) {
- if (this->actor.bgCheckFlags & 1) {
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ Math_StepToF(&this->actor.speed, 0.0f, 0.5f);
}
if (SkelAnime_Update(&this->skelAnime)) {
@@ -957,7 +957,7 @@ void func_8089C724(EnDinofos* this, PlayState* play) {
}
void func_8089C784(EnDinofos* this) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->actor.velocity.y > 0.0f) {
this->actor.velocity.y = 0.0f;
}
@@ -972,7 +972,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);
@@ -986,25 +986,25 @@ void func_8089C7B8(EnDinofos* this, PlayState* play) {
}
void func_8089C87C(EnDinofos* this, s32 arg1) {
- Animation_PlayOnce(&this->skelAnime, &object_dinofos_Anim_00D21C);
+ Animation_PlayOnce(&this->skelAnime, &gDinolfosHitAnim);
func_800BE5CC(&this->actor, &this->colliderJntSph, arg1);
this->actor.shape.rot.y = BINANG_ROT180(this->actor.world.rot.y);
- this->actor.speedXZ = 10.0f;
+ this->actor.speed = 10.0f;
if (this->actor.velocity.y > 0.0f) {
this->actor.velocity.y = 0.0f;
}
this->unk_28E = 0;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_RIZA_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_RIZA_DAMAGE);
this->colliderJntSph.base.acFlags &= ~AC_ON;
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 18);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 18);
this->actionFunc = func_8089C938;
}
void func_8089C938(EnDinofos* this, PlayState* play) {
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f);
- if (SkelAnime_Update(&this->skelAnime) && (this->actor.bgCheckFlags & 1)) {
+ 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);
@@ -1019,20 +1019,20 @@ void func_8089C938(EnDinofos* this, PlayState* play) {
}
void func_8089CA14(EnDinofos* this) {
- Animation_MorphToPlayOnce(&this->skelAnime, &object_dinofos_Anim_001040, -5.0f);
+ Animation_MorphToPlayOnce(&this->skelAnime, &gDinolfosFireStartAnim, -5.0f);
this->colliderJntSph.base.acFlags |= AC_ON;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = func_8089CA74;
}
void func_8089CA74(EnDinofos* this, PlayState* play) {
Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0x800);
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f);
+ Math_StepToF(&this->actor.speed, 0.0f, 0.5f);
if (SkelAnime_Update(&this->skelAnime)) {
func_8089CB10(this, play);
} else if (!func_8089AE00(this, play) && Animation_OnFrame(&this->skelAnime, 12.0f)) {
- this->actor.speedXZ = 8.0f;
+ this->actor.speed = 8.0f;
}
}
@@ -1040,17 +1040,17 @@ void func_8089CB10(EnDinofos* this, PlayState* play) {
s32 i;
Sphere16* worldSphere;
- Animation_PlayLoop(&this->skelAnime, &object_dinofos_Anim_0013C0);
+ Animation_PlayLoop(&this->skelAnime, &gDinolfosFireLoopAnim);
this->unk_290 = 20;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->colliderJntSph.base.atFlags |= AT_ON;
func_8089AD70(this);
for (i = 6; i < ARRAY_COUNT(this->colliderJntSphElement); i++) {
worldSphere = &this->colliderJntSph.elements[i].dim.worldSphere;
- worldSphere->center.x = this->limbPos[10].x;
- worldSphere->center.y = this->limbPos[10].y;
- worldSphere->center.z = this->limbPos[10].z;
+ worldSphere->center.x = this->bodyPartsPos[DINOFOS_BODYPART_JAW].x;
+ worldSphere->center.y = this->bodyPartsPos[DINOFOS_BODYPART_JAW].y;
+ worldSphere->center.z = this->bodyPartsPos[DINOFOS_BODYPART_JAW].z;
}
if (play->sceneId == SCENE_MITURIN) {
@@ -1061,7 +1061,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,13 +1080,14 @@ 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);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_DODO_J_FIRE - SFX_FLAG);
+ EffectSsDFire_Spawn(play, &this->bodyPartsPos[DINOFOS_BODYPART_JAW], &sp88, &sp7C, 30, 22, 255 - (temp_s0 * 20), 20,
+ 3, 8);
for (end = 6, i = 3; i > 0; i--) {
if (this->unk_290 < (20 + -(i * 2))) {
@@ -1097,11 +1098,13 @@ 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;
- dim->worldSphere.center.z = (s32)this->limbPos[10].z + (s32)(Math_CosS(temp_s3) * dim->modelSphere.center.z);
+ dim->worldSphere.center.x =
+ (s32)this->bodyPartsPos[DINOFOS_BODYPART_JAW].x + (s32)(Math_SinS(temp_s3) * dim->modelSphere.center.z);
+ dim->worldSphere.center.y = (s32)this->bodyPartsPos[DINOFOS_BODYPART_JAW].y + (s32)dim->modelSphere.center.y;
+ dim->worldSphere.center.z =
+ (s32)this->bodyPartsPos[DINOFOS_BODYPART_JAW].z + (s32)(Math_CosS(temp_s3) * dim->modelSphere.center.z);
}
if (this->unk_290 != 0) {
@@ -1112,10 +1115,10 @@ void func_8089CBEC(EnDinofos* this, PlayState* play) {
}
void func_8089CF00(EnDinofos* this, PlayState* play) {
- Animation_PlayOnce(&this->skelAnime, &object_dinofos_Anim_0017B8);
+ Animation_PlayOnce(&this->skelAnime, &gDinolfosFireEndAnim);
this->colliderJntSph.base.atFlags &= ~AT_ON;
if (play->sceneId == SCENE_MITURIN) {
- play->envCtx.lightSettingOverride = 255;
+ play->envCtx.lightSettingOverride = LIGHT_SETTING_OVERRIDE_NONE;
}
this->actionFunc = func_8089CF70;
}
@@ -1127,10 +1130,10 @@ void func_8089CF70(EnDinofos* this, PlayState* play) {
}
void func_8089CFAC(EnDinofos* this) {
- Animation_PlayOnce(&this->skelAnime, &object_dinofos_Anim_00ABD0);
- this->actor.flags &= ~ACTOR_FLAG_1;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_RIZA_DEAD);
- this->actor.speedXZ = 0.0f;
+ Animation_PlayOnce(&this->skelAnime, &gDinolfosDieAnim);
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_RIZA_DEAD);
+ this->actor.speed = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = func_8089D018;
}
@@ -1157,17 +1160,17 @@ void func_8089D018(EnDinofos* this, PlayState* play) {
this->actor.shape.shadowAlpha = this->unk_288;
} else if (Animation_OnFrame(&this->skelAnime, 26.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GERUDOFT_DOWN);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GERUDOFT_DOWN);
}
}
void func_8089D11C(EnDinofos* this, s16 arg1) {
if (arg1 >= 0) {
- this->actor.speedXZ = -15.0f;
+ this->actor.speed = -15.0f;
} else {
- this->actor.speedXZ = 15.0f;
+ this->actor.speed = 15.0f;
}
- Animation_Change(&this->skelAnime, &object_dinofos_Anim_00D62C, this->actor.speedXZ * (1.0f / 7.5f), 0.0f, 0.0f,
+ Animation_Change(&this->skelAnime, &gDinolfosSidestepAnim, this->actor.speed * (1.0f / 7.5f), 0.0f, 0.0f,
ANIMMODE_LOOP, -4.0f);
this->actor.world.rot.y = BINANG_ADD(this->actor.shape.rot.y, 0x4000);
this->unk_292 = 10;
@@ -1178,10 +1181,10 @@ void func_8089D11C(EnDinofos* this, s16 arg1) {
void func_8089D1E0(EnDinofos* this, PlayState* play) {
Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0xBB8);
- Math_StepToF(&this->actor.speedXZ, 0.0f, 2.0f);
+ Math_StepToF(&this->actor.speed, 0.0f, 2.0f);
this->skelAnime.playSpeed =
- (1.0f + fabsf(this->actor.speedXZ * (1.0f / 15.0f))) * ((this->actor.speedXZ >= 0.0f) ? 1.0f : -1.0f);
+ (1.0f + fabsf(this->actor.speed * (1.0f / 15.0f))) * ((this->actor.speed >= 0.0f) ? 1.0f : -1.0f);
this->actor.world.rot.y = BINANG_ADD(this->actor.shape.rot.y, 0x4000);
SkelAnime_Update(&this->skelAnime);
if (this->unk_292 != 0) {
@@ -1191,26 +1194,26 @@ void func_8089D1E0(EnDinofos* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 5.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_RIZA_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_RIZA_WALK);
}
}
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 +1224,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 +1234,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 +1276,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();
}
}
@@ -1286,7 +1289,7 @@ s32 func_8089D60C(EnDinofos* this, PlayState* play) {
func_8089ACEC(this, play);
func_8089AD70(this);
if (play->sceneId == SCENE_MITURIN) {
- play->envCtx.lightSettingOverride = 255;
+ play->envCtx.lightSettingOverride = LIGHT_SETTING_OVERRIDE_NONE;
}
this->colliderQuad.base.atFlags &= ~(AT_ON | AT_BOUNCED);
@@ -1303,19 +1306,19 @@ s32 func_8089D60C(EnDinofos* this, PlayState* play) {
if (this->actor.colChkInfo.damageEffect == 1) {
this->unk_290 = 40;
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 40);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
func_8089C784(this);
return true;
}
if (this->actor.colChkInfo.damageEffect == 5) {
this->unk_290 = 40;
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 40);
this->drawDmgEffScale = 0.55f;
this->drawDmgEffAlpha = 2.0f;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_MEDIUM;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
func_8089C784(this);
return true;
}
@@ -1331,7 +1334,8 @@ s32 func_8089D60C(EnDinofos* this, PlayState* play) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG,
this->colliderJntSph.elements[i].info.bumper.hitPos.x,
this->colliderJntSph.elements[i].info.bumper.hitPos.y,
- this->colliderJntSph.elements[i].info.bumper.hitPos.z, 0, 0, 0, CLEAR_TAG_LARGE_LIGHT_RAYS);
+ this->colliderJntSph.elements[i].info.bumper.hitPos.z, 0, 0, 0,
+ CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
}
func_8089C87C(this, i);
return true;
@@ -1344,7 +1348,7 @@ void EnDinofos_Update(Actor* thisx, PlayState* play2) {
PlayState* play = play2;
EnDinofos* this = THIS;
s32 pad;
- Vec3f sp30;
+ Vec3f bodyPartPos;
if (this->actionFunc != func_8089C7B8) {
func_8089A900(this);
@@ -1356,13 +1360,16 @@ 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)) {
- Math_Vec3f_Copy(&sp30, &this->limbPos[1 + (play->gameplayFrames % 4)]);
- sp30.y = this->actor.world.pos.y + this->actor.depthInWater;
- EffectSsGRipple_Spawn(play, &sp30, 100, 320, 0);
+ if (((play->gameplayFrames % 4) & 1) == 0) {
+ Math_Vec3f_Copy(&bodyPartPos,
+ &this->bodyPartsPos[DINOFOS_BODYPART_LEFT_CLAWS + (play->gameplayFrames % 4)]);
+ bodyPartPos.y = this->actor.world.pos.y + this->actor.depthInWater;
+ EffectSsGRipple_Spawn(play, &bodyPartPos, 100, 320, 0);
}
}
if (this->actionFunc != func_8089D018) {
@@ -1374,7 +1381,7 @@ void EnDinofos_Update(Actor* thisx, PlayState* play2) {
Math_ScaledStepToS(&this->unk_28E, 0, 2000);
}
- Math_Vec3f_Copy(&this->actor.focus.pos, &this->limbPos[4]);
+ Math_Vec3f_Copy(&this->actor.focus.pos, &this->bodyPartsPos[DINOFOS_BODYPART_UPPER_BODY]);
this->actor.focus.rot.y = this->actor.shape.rot.y + this->unk_28E;
if (this->colliderJntSph.base.acFlags & AC_ON) {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->colliderJntSph.base);
@@ -1395,7 +1402,7 @@ void EnDinofos_Update(Actor* thisx, PlayState* play2) {
this->drawDmgEffScale = (this->drawDmgEffAlpha + 1.0f) * (11.0f / 40.0f);
this->drawDmgEffScale = CLAMP_MAX(this->drawDmgEffScale, 0.55f);
} else if (!Math_StepToF(&this->drawDmgEffFrozenSteamScale, 0.55f, 0.01375f)) {
- func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
}
}
@@ -1403,20 +1410,42 @@ void EnDinofos_Update(Actor* thisx, PlayState* play2) {
s32 func_8089DC4C(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx, Gfx** gfx) {
EnDinofos* this = THIS;
- if (limbIndex == 16) {
+ if (limbIndex == DINOLFOS_LIMB_HEAD) {
rot->y -= this->unk_28E;
}
return 0;
}
+static Vec3f D_8089E38C = { 400.0f, -3600.0f, 0.0f };
+static Vec3f D_8089E398 = { 300.0f, 500.0f, 0.0f };
+static Vec3f D_8089E3A4 = { 700.0f, 400.0f, 0.0f };
+
+static s8 sLimbToBodyParts[DINOLFOS_LIMB_MAX] = {
+ BODYPART_NONE, // DINOLFOS_LIMB_NONE
+ BODYPART_NONE, // DINOLFOS_LIMB_LOWER_BODY
+ DINOFOS_BODYPART_LEFT_UPPER_LEG, // DINOLFOS_LIMB_LEFT_UPPER_LEG
+ BODYPART_NONE, // DINOLFOS_LIMB_LEFT_LOWER_LEG
+ DINOFOS_BODYPART_LEFT_CLAWS, // DINOLFOS_LIMB_LEFT_CLAWS
+ DINOFOS_BODYPART_RIGHT_UPPER_LEG, // DINOLFOS_LIMB_RIGHT_UPPER_LEG
+ BODYPART_NONE, // DINOLFOS_LIMB_RIGHT_LOWER_LEG
+ DINOFOS_BODYPART_RIGHT_CLAWS, // DINOLFOS_LIMB_RIGHT_CLAWS
+ DINOFOS_BODYPART_UPPER_BODY, // DINOLFOS_LIMB_UPPER_BODY
+ BODYPART_NONE, // DINOLFOS_LIMB_LEFT_UPPER_ARM
+ DINOFOS_BODYPART_LEFT_FOREARM, // DINOLFOS_LIMB_LEFT_FOREARM
+ DINOFOS_BODYPART_LEFT_HAND, // DINOLFOS_LIMB_LEFT_HAND
+ BODYPART_NONE, // DINOLFOS_LIMB_RIGHT_UPPER_ARM
+ DINOFOS_BODYPART_RIGHT_FOREARM, // DINOLFOS_LIMB_RIGHT_FOREARM
+ DINOFOS_BODYPART_RIGHT_HAND, // DINOLFOS_LIMB_RIGHT_HAND
+ BODYPART_NONE, // DINOLFOS_LIMB_NECK
+ DINOFOS_BODYPART_HEAD, // DINOLFOS_LIMB_HEAD
+ DINOFOS_BODYPART_JAW, // DINOLFOS_LIMB_JAW
+ BODYPART_NONE, // DINOLFOS_LIMB_UPPER_TAIL
+ DINOFOS_BODYPART_LOWER_TAIL, // DINOLFOS_LIMB_LOWER_TAIL
+ BODYPART_NONE, // DINOLFOS_LIMB_KNIFE
+};
+
void func_8089DC84(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx, Gfx** gfx) {
- static Vec3f D_8089E38C = { 400.0f, -3600.0f, 0.0f };
- static Vec3f D_8089E398 = { 300.0f, 500.0f, 0.0f };
- static Vec3f D_8089E3A4 = { 700.0f, 400.0f, 0.0f };
- static s8 D_8089E3B0[] = {
- -1, -1, 0, -1, 1, 2, -1, 3, 4, -1, 5, 6, -1, 7, 8, -1, 9, 10, -1, 11, -1,
- };
EnDinofos* this = THIS;
Vec3f sp80;
Vec3f sp74;
@@ -1427,11 +1456,11 @@ void func_8089DC84(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Acto
MtxF* sp48;
Collider_UpdateSpheres(limbIndex, &this->colliderJntSph);
- if (D_8089E3B0[limbIndex] != -1) {
- Matrix_MultZero(&this->limbPos[D_8089E3B0[limbIndex]]);
+ if (sLimbToBodyParts[limbIndex] != BODYPART_NONE) {
+ Matrix_MultZero(&this->bodyPartsPos[sLimbToBodyParts[limbIndex]]);
}
- if ((limbIndex == 14) && (this->unk_292 != this->unk_290) &&
+ if ((limbIndex == DINOLFOS_LIMB_RIGHT_HAND) && (this->unk_292 != this->unk_290) &&
((this->actionFunc == func_8089C56C) || (this->actionFunc == func_8089C2A8))) {
Math_Vec3f_Copy(&sp74, &this->colliderQuad.dim.quad[0]);
Math_Vec3f_Copy(&sp80, &this->colliderQuad.dim.quad[1]);
@@ -1444,13 +1473,13 @@ void func_8089DC84(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Acto
this->unk_292 = this->unk_290;
}
- if (limbIndex == 4) {
+ if (limbIndex == DINOLFOS_LIMB_LEFT_CLAWS) {
Matrix_MultVecX(300.0f, &this->actor.shape.feetPos[0]);
- } else if (limbIndex == 7) {
+ } else if (limbIndex == DINOLFOS_LIMB_RIGHT_CLAWS) {
Matrix_MultVecX(300.0f, &this->actor.shape.feetPos[1]);
}
- if ((limbIndex == 16) && (this->actionFunc == func_8089B580)) {
+ if ((limbIndex == DINOLFOS_LIMB_HEAD) && (this->actionFunc == func_8089B580)) {
if ((this->skelAnime.curFrame > 38.0f) && (this->skelAnime.curFrame <= 55.0f) &&
(this->unk_292 != this->unk_290)) {
sp48 = Matrix_GetCurrent();
@@ -1460,7 +1489,8 @@ void func_8089DC84(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Acto
sp4C.x -= sp48->mf[3][0];
sp4C.y -= sp48->mf[3][1];
sp4C.z -= sp48->mf[3][2];
- EffectSsDFire_Spawn(play, &this->limbPos[10], &sp4C, &gZeroVec3f, 30, 22, 255 - (sp58 * 20), 20, 3, 8);
+ EffectSsDFire_Spawn(play, &this->bodyPartsPos[DINOFOS_BODYPART_JAW], &sp4C, &gZeroVec3f, 30, 22,
+ 255 - (sp58 * 20), 20, 3, 8);
this->unk_292 = this->unk_290;
}
}
@@ -1472,10 +1502,10 @@ 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]);
+ gSPSegment(POLY_OPA_DISP++, 0x08, sEyeTextures[this->unk_289]);
gDPSetEnvColor(POLY_OPA_DISP++, 20, 40, 40, 255);
Scene_SetRenderModeXlu(play, 0, 1);
@@ -1483,10 +1513,10 @@ 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]);
+ gSPSegment(POLY_XLU_DISP++, 0x08, sEyeTextures[this->unk_289]);
gDPSetEnvColor(POLY_XLU_DISP++, 20, 40, 40, this->unk_288);
Scene_SetRenderModeXlu(play, 1, 2);
@@ -1495,7 +1525,7 @@ void EnDinofos_Draw(Actor* thisx, PlayState* play) {
func_8089DC4C, func_8089DC84, &this->actor, POLY_XLU_DISP);
}
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), this->drawDmgEffScale,
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, DINOFOS_BODYPART_MAX, this->drawDmgEffScale,
this->drawDmgEffFrozenSteamScale, this->drawDmgEffAlpha, this->drawDmgEffType);
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.h b/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.h
index 4284d5595..dd39135ae 100644
--- a/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.h
+++ b/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.h
@@ -2,16 +2,33 @@
#define Z_EN_DINOFOS_H
#include "global.h"
+#include "objects/object_dinofos/object_dinofos.h"
struct EnDinofos;
typedef void (*EnDinofosActionFunc)(struct EnDinofos*, PlayState*);
+typedef enum EnDinofosBodyPart {
+ /* 0 */ DINOFOS_BODYPART_LEFT_UPPER_LEG,
+ /* 1 */ DINOFOS_BODYPART_LEFT_CLAWS,
+ /* 2 */ DINOFOS_BODYPART_RIGHT_UPPER_LEG,
+ /* 3 */ DINOFOS_BODYPART_RIGHT_CLAWS,
+ /* 4 */ DINOFOS_BODYPART_UPPER_BODY,
+ /* 5 */ DINOFOS_BODYPART_LEFT_FOREARM,
+ /* 6 */ DINOFOS_BODYPART_LEFT_HAND,
+ /* 7 */ DINOFOS_BODYPART_RIGHT_FOREARM,
+ /* 8 */ DINOFOS_BODYPART_RIGHT_HAND,
+ /* 9 */ DINOFOS_BODYPART_HEAD,
+ /* 10 */ DINOFOS_BODYPART_JAW,
+ /* 11 */ DINOFOS_BODYPART_LOWER_TAIL,
+ /* 12 */ DINOFOS_BODYPART_MAX
+} EnDinofosBodyPart;
+
typedef struct EnDinofos {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[21];
- /* 0x206 */ Vec3s morphTable[21];
+ /* 0x188 */ Vec3s jointTable[DINOLFOS_LIMB_MAX];
+ /* 0x206 */ Vec3s morphTable[DINOLFOS_LIMB_MAX];
/* 0x284 */ EnDinofosActionFunc actionFunc;
/* 0x288 */ u8 unk_288;
/* 0x289 */ u8 unk_289;
@@ -33,7 +50,7 @@ typedef struct EnDinofos {
/* 0x2B8 */ f32 drawDmgEffFrozenSteamScale;
/* 0x2BC */ Vec3f unk_2BC;
/* 0x2C8 */ Vec3f unk_2C8;
- /* 0x2D4 */ Vec3f limbPos[12];
+ /* 0x2D4 */ Vec3f bodyPartsPos[DINOFOS_BODYPART_MAX];
/* 0x364 */ ColliderJntSph colliderJntSph;
/* 0x384 */ ColliderJntSphElement colliderJntSphElement[9];
/* 0x5C4 */ ColliderQuad colliderQuad;
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 615383a27..c7dbd8888 100644
--- a/src/overlays/actors/ovl_En_Dnb/z_en_dnb.c
+++ b/src/overlays/actors/ovl_En_Dnb/z_en_dnb.c
@@ -8,7 +8,7 @@
#include "objects/object_hanareyama_obj/object_hanareyama_obj.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_80)
+#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_REACT_TO_LENS)
#define THIS ((EnDnb*)thisx)
@@ -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,35 +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();
-
- 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_Dnh/z_en_dnh.c b/src/overlays/actors/ovl_En_Dnh/z_en_dnh.c
index 9413b046c..4039386e0 100644
--- a/src/overlays/actors/ovl_En_Dnh/z_en_dnh.c
+++ b/src/overlays/actors/ovl_En_Dnh/z_en_dnh.c
@@ -6,7 +6,7 @@
#include "z_en_dnh.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnDnh*)thisx)
@@ -16,9 +16,32 @@ void EnDnh_Update(Actor* thisx, PlayState* play);
void EnDnh_Draw(Actor* thisx, PlayState* play);
void func_80A50F38(EnDnh* this, PlayState* play);
-void func_80A50F9C(EnDnh* this, PlayState* play);
+void EnDnh_DoNothing(EnDnh* this, PlayState* play);
+
+UNK_TYPE D_80A51250[] = {
+ 0x000C0800, 0x080E0862, 0x0C111101, 0x10040005, 0x0E08670C, 0x10001402, 0x007A0019, 0x1000300E, 0x08590C25,
+ 0x000D0018, 0x0F08630C, 0x12060043, 0x00001300, 0x430C0700, 0x000E088D, 0x0C190007, 0x0F088D0C, 0x19000012,
+ 0x11191009, 0x00001000, 0x1A100016, 0x0E085A11, 0x1A100C0F, 0x085B0C0F, 0x085C0C05, 0x00060024, 0x00060E08,
+ 0x5B19FFEE, 0x300F085E, 0x0C08000A, 0x00050F08, 0x750C1014, 0xFFF60F08, 0x600C1211, 0x19100900, 0x0010310F,
+ 0x085F0C10, 0x00192000, 0x49001A10, 0x003D0E08, 0x68111A10, 0x0C0F0869, 0x0C0F086A, 0x0C0F086B, 0x0C0F086C,
+ 0x0C050000, 0x00190000, 0x300E086E, 0x1119201C, 0x03201D03, 0x401D0380, 0x1D04010C, 0x12090000, 0x10310E08,
+ 0x6D0C100E, 0x08700C19, 0xFFCB0019, 0x2000070E, 0x08710C19, 0xFFBB0E08, 0x720C0F08, 0x730C0500, 0x00001700,
+ 0x0008000A, 0x0006320F, 0x08750C10, 0x3014FFF6, 0x001A4000, 0x0919FFA8, 0x310E0874, 0x0C100E08, 0x76111920,
+ 0x1C03201D, 0x03401D03, 0x801D0401, 0x0C120900, 0x00100000,
+};
+
+UNK_TYPE D_80A51384[] = {
+ 0x0E08610C,
+ 0x16100000,
+};
+
+UNK_TYPE D_80A5138C[] = {
+ 0x1B034000, 0x67001A40, 0x003A1B03, 0x80001A0E, 0x087C0C00, 0x5B20000A, 0x0F087E0C, 0x115B2019,
+ 0x004E0F08, 0x7B0C1900, 0x470E087D, 0x0C120600, 0x0C000013, 0x000C0C07, 0x00000E08, 0x7E0C111A,
+ 0x4019002C, 0x1B038000, 0x0B0E087A, 0x0C0F087B, 0x0C19001C, 0x0E08780C, 0x12060005, 0x00001300,
+ 0x050C0700, 0x000E0879, 0x0C190004, 0x0E08770C, 0x1D03201D, 0x03401D03, 0x801D0401, 0x16100000,
+};
-#if 0
ActorInit En_Dnh_InitVars = {
ACTOR_EN_DNH,
ACTORCAT_NPC,
@@ -31,28 +54,142 @@ ActorInit En_Dnh_InitVars = {
(ActorFunc)EnDnh_Draw,
};
-#endif
+typedef enum {
+ /* 0 */ ENDNH_ANIM_HEAD_MOVING,
+ /* 1 */ ENDNH_ANIM_MAX
+} EnDnhAnimation;
-extern UNK_TYPE D_06002950;
+static AnimationInfoS sAnimationInfo[ENDNH_ANIM_MAX] = {
+ { &gKoumeKioskHeadMoving, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENDNH_ANIM_HEAD_MOVING
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dnh/func_80A50D40.s")
+static TexturePtr sEyeTextures[] = {
+ gKoumeKioskEyeOpenTex,
+ gKoumeKioskEyeHalfTex,
+ gKoumeKioskEyeClosedTex,
+ gKoumeKioskEyeHalfTex,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dnh/func_80A50DF8.s")
+s32 func_80A50D40(Actor* actor, PlayState* play) {
+ func_800B7298(play, actor, PLAYER_CSMODE_WAIT);
+ if (CHECK_EVENTINF(EVENTINF_35)) {
+ play->nextEntrance = ENTRANCE(SOUTHERN_SWAMP_CLEARED, 6);
+ } else {
+ play->nextEntrance = ENTRANCE(SOUTHERN_SWAMP_POISONED, 6);
+ }
+ gSaveContext.nextCutsceneIndex = 0;
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ play->transitionType = TRANS_TYPE_FADE_WHITE;
+ gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE_SLOW;
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_90_40);
+ CLEAR_EVENTINF(EVENTINF_50);
+ return 1;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dnh/func_80A50E40.s")
+void* func_80A50DF8(EnDnh* this, PlayState* play) {
+ switch (this->unk198) {
+ case 1:
+ return D_80A51384;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dnh/func_80A50EC0.s")
+ case 2:
+ return D_80A5138C;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dnh/func_80A50F38.s")
+ default:
+ return D_80A51250;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dnh/func_80A50F9C.s")
+s32 func_80A50E40(EnDnh* this, PlayState* play) {
+ if (((this->unk18C & SUBS_OFFER_MODE_MASK) == SUBS_OFFER_MODE_NONE) ||
+ !Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ return 0;
+ }
+ SubS_SetOfferMode(&this->unk18C, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
+ this->msgEventScript = func_80A50DF8(this, play);
+ this->actionFunc = func_80A50F38;
+ return 1;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dnh/EnDnh_Init.s")
+s32 func_80A50EC0(EnDnh* this) {
+ if (DECR(this->blinkTimer) == 0) {
+ this->eyeTexIndex++;
+ if (this->eyeTexIndex >= ARRAY_COUNT(sEyeTextures)) {
+ this->blinkTimer = Rand_S16Offset(30, 30);
+ this->eyeTexIndex = 0;
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dnh/EnDnh_Destroy.s")
+void func_80A50F38(EnDnh* this, PlayState* play) {
+ if (func_8010BF58(&this->actor, play, this->msgEventScript, this->msgEventCallback, &this->unk194)) {
+ SubS_SetOfferMode(&this->unk18C, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
+ this->unk194 = 0;
+ this->unk198 = 0;
+ this->actionFunc = EnDnh_DoNothing;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dnh/EnDnh_Update.s")
+void EnDnh_DoNothing(EnDnh* this, PlayState* play) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dnh/func_80A51168.s")
+void EnDnh_Init(Actor* thisx, PlayState* play) {
+ EnDnh* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dnh/EnDnh_Draw.s")
+ ActorShape_Init(&this->actor.shape, 0.0f, NULL, 0.0f);
+ SkelAnime_Init(play, &this->skelAnime, &gKoumeKioskSkel, NULL, this->jointTable, this->morphTable,
+ KOUME_KIOSK_LIMB_MAX);
+ SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, ENDNH_ANIM_HEAD_MOVING);
+ this->actor.shape.yOffset = 1100.0f;
+
+ if (gSaveContext.save.entrance != ENTRANCE(TOURIST_INFORMATION, 1)) {
+ SubS_SetOfferMode(&this->unk18C, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
+ this->unk198 = 0;
+ } else {
+ SubS_SetOfferMode(&this->unk18C, SUBS_OFFER_MODE_AUTO, SUBS_OFFER_MODE_MASK);
+ this->unk198 = CHECK_EVENTINF(EVENTINF_35) ? 2 : 1;
+ }
+
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_SAVED_KOUME)) {
+ this->actor.draw = NULL;
+ }
+
+ this->msgEventCallback = func_80A50D40;
+ this->unk194 = 0;
+ this->actionFunc = EnDnh_DoNothing;
+}
+
+void EnDnh_Destroy(Actor* thisx, PlayState* play) {
+}
+
+void EnDnh_Update(Actor* thisx, PlayState* play) {
+ EnDnh* this = THIS;
+
+ func_80A50E40(this, play);
+ this->actionFunc(this, play);
+ func_80A50EC0(this);
+ SkelAnime_Update(&this->skelAnime);
+ SubS_Offer(&this->actor, play, 60.0f, 30.0f, PLAYER_IA_NONE, this->unk18C & SUBS_OFFER_MODE_MASK);
+ Actor_SetFocus(&this->actor, 26.0f);
+}
+
+s32 EnDnh_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
+ EnDnh* this = THIS;
+
+ if (limbIndex == KOUME_KIOSK_LIMB_HEAD) {
+ Matrix_Translate(0.0f, this->actor.shape.yOffset, 0.0f, MTXMODE_APPLY);
+ }
+ return false;
+}
+
+void EnDnh_Draw(Actor* thisx, PlayState* play) {
+ EnDnh* this = THIS;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
+ SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnDnh_OverrideLimbDraw, NULL,
+ &this->actor);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_En_Dnh/z_en_dnh.h b/src/overlays/actors/ovl_En_Dnh/z_en_dnh.h
index c2331d777..3aa83d154 100644
--- a/src/overlays/actors/ovl_En_Dnh/z_en_dnh.h
+++ b/src/overlays/actors/ovl_En_Dnh/z_en_dnh.h
@@ -2,15 +2,27 @@
#define Z_EN_DNH_H
#include "global.h"
+#include "objects/object_tro/object_tro.h"
struct EnDnh;
typedef void (*EnDnhActionFunc)(struct EnDnh*, PlayState*);
+typedef s32 (*MsgEventFunc)(Actor*, PlayState*);
typedef struct EnDnh {
/* 0x000 */ Actor actor;
/* 0x144 */ EnDnhActionFunc actionFunc;
- /* 0x148 */ char unk_148[0x74];
+ /* 0x148 */ SkelAnime skelAnime;
+ /* 0x18C */ u16 unk18C;
+ /* 0x190 */ s32 msgEventScript;
+ /* 0x194 */ s32 unk194;
+ /* 0x198 */ s16 unk198;
+ /* 0x19A */ UNK_TYPE1 pad19A[0x2];
+ /* 0x19C */ s16 blinkTimer;
+ /* 0x19E */ s16 eyeTexIndex;
+ /* 0x1A0 */ MsgEventFunc msgEventCallback;
+ /* 0x1A4 */ Vec3s jointTable[KOUME_KIOSK_LIMB_MAX];
+ /* 0x1B0 */ Vec3s morphTable[KOUME_KIOSK_LIMB_MAX];
} EnDnh; // size = 0x1BC
#endif // Z_EN_DNH_H
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 ee035f06b..61170a5d0 100644
--- a/src/overlays/actors/ovl_En_Dnk/z_en_dnk.c
+++ b/src/overlays/actors/ovl_En_Dnk/z_en_dnk.c
@@ -5,11 +5,8 @@
*/
#include "z_en_dnk.h"
-#include "objects/object_dnk/object_dnk.h"
-#include "objects/object_hintnuts/object_hintnuts.h"
-#include "objects/object_dekunuts/object_dekunuts.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnDnk*)thisx)
@@ -17,7 +14,7 @@ void EnDnk_Init(Actor* thisx, PlayState* play);
void EnDnk_Destroy(Actor* thisx, PlayState* play);
void EnDnk_Update(Actor* thisx, PlayState* play);
-void func_80A51890(EnDnk* this, PlayState* play);
+void EnDnk_HandleCutscene(EnDnk* this, PlayState* play);
void EnDnk_DoNothing(EnDnk* this, PlayState* play);
void func_80A52018(Actor* thisx, PlayState* play);
void func_80A52134(EnDnk* this, PlayState* play);
@@ -93,66 +90,108 @@ static DamageTable sDamageTable = {
/* Powder Keg */ DMG_ENTRY(1, 0x0),
};
-static AnimationInfoS sAnimationInfo[] = {
- { &gDekuPalaceGuardStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gDekuPalaceGuardStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &gDekuPalaceGuardWaitAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuPalaceGuardAttackAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuPalaceGuardDigAnim, 1.0f, -1, -1, ANIMMODE_ONCE, 0 },
- { &gDekuPalaceGuardDigAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &gDekuPalaceGuardJumpAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &gDekuPalaceGuardWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &gDekuPalaceGuardWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuPalaceGuardHappyAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_hintnuts_Anim_000168, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &object_hintnuts_Anim_0024CC, 1.0f, -1, -1, ANIMMODE_ONCE, 0 },
- { &object_hintnuts_Anim_0024CC, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &object_hintnuts_Anim_0026C4, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &object_hintnuts_Anim_002894, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &object_hintnuts_Anim_002B90, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &object_hintnuts_Anim_002F7C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_hintnuts_Anim_002F7C, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_hintnuts_Anim_003128, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_hintnuts_Anim_003128, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_hintnuts_Anim_0029BC, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_hintnuts_Anim_002E84, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuScrubSpitAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuScrubDamageAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &gDekuScrubBurrowAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gDekuScrubBurrowAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &gDekuScrubDieAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &gDekuScrubUnburrowAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &gDekuScrubLookAroundAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuScrubUpAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &gDekuScrubIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &gDekuScrubIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuScrubPantingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuScrubRunAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &gDekuScrubRunAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuScrubStandingIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+typedef enum {
+ /* -1 */ ENDNK_ANIM_NONE = -1,
+ /* 0 */ ENDNK_ANIM_0,
+ /* 1 */ ENDNK_ANIM_1,
+ /* 2 */ ENDNK_ANIM_2,
+ /* 3 */ ENDNK_ANIM_3,
+ /* 4 */ ENDNK_ANIM_4,
+ /* 5 */ ENDNK_ANIM_5,
+ /* 6 */ ENDNK_ANIM_6,
+ /* 7 */ ENDNK_ANIM_7,
+ /* 8 */ ENDNK_ANIM_8,
+ /* 9 */ ENDNK_ANIM_9,
+ /* 10 */ ENDNK_ANIM_10,
+ /* 11 */ ENDNK_ANIM_11,
+ /* 12 */ ENDNK_ANIM_12,
+ /* 13 */ ENDNK_ANIM_13,
+ /* 14 */ ENDNK_ANIM_14,
+ /* 15 */ ENDNK_ANIM_15,
+ /* 16 */ ENDNK_ANIM_16,
+ /* 17 */ ENDNK_ANIM_17,
+ /* 18 */ ENDNK_ANIM_18,
+ /* 19 */ ENDNK_ANIM_19,
+ /* 20 */ ENDNK_ANIM_20,
+ /* 21 */ ENDNK_ANIM_21,
+ /* 22 */ ENDNK_ANIM_22,
+ /* 23 */ ENDNK_ANIM_23,
+ /* 24 */ ENDNK_ANIM_24,
+ /* 25 */ ENDNK_ANIM_25,
+ /* 26 */ ENDNK_ANIM_26,
+ /* 27 */ ENDNK_ANIM_27,
+ /* 28 */ ENDNK_ANIM_28,
+ /* 29 */ ENDNK_ANIM_29,
+ /* 30 */ ENDNK_ANIM_30,
+ /* 31 */ ENDNK_ANIM_31,
+ /* 32 */ ENDNK_ANIM_32,
+ /* 33 */ ENDNK_ANIM_33,
+ /* 34 */ ENDNK_ANIM_34,
+ /* 35 */ ENDNK_ANIM_35,
+ /* 36 */ ENDNK_ANIM_MAX
+} EnDnkAnimation;
+
+static AnimationInfoS sAnimationInfo[ENDNK_ANIM_MAX] = {
+ { &gDekuPalaceGuardStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENDNK_ANIM_0
+ { &gDekuPalaceGuardStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENDNK_ANIM_1
+ { &gDekuPalaceGuardWaitAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENDNK_ANIM_2
+ { &gDekuPalaceGuardAttackAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENDNK_ANIM_3
+ { &gDekuPalaceGuardDigAnim, 1.0f, -1, -1, ANIMMODE_ONCE, 0 }, // ENDNK_ANIM_4
+ { &gDekuPalaceGuardDigAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENDNK_ANIM_5
+ { &gDekuPalaceGuardJumpAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENDNK_ANIM_6
+ { &gDekuPalaceGuardWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENDNK_ANIM_7
+ { &gDekuPalaceGuardWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENDNK_ANIM_8
+ { &gDekuPalaceGuardHappyAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENDNK_ANIM_9
+ { &object_hintnuts_Anim_000168, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENDNK_ANIM_10
+ { &object_hintnuts_Anim_0024CC, 1.0f, -1, -1, ANIMMODE_ONCE, 0 }, // ENDNK_ANIM_11
+ { &object_hintnuts_Anim_0024CC, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENDNK_ANIM_12
+ { &object_hintnuts_Anim_0026C4, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENDNK_ANIM_13
+ { &object_hintnuts_Anim_002894, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENDNK_ANIM_14
+ { &object_hintnuts_Anim_002B90, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENDNK_ANIM_15
+ { &object_hintnuts_Anim_002F7C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENDNK_ANIM_16
+ { &object_hintnuts_Anim_002F7C, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENDNK_ANIM_17
+ { &object_hintnuts_Anim_003128, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENDNK_ANIM_18
+ { &object_hintnuts_Anim_003128, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENDNK_ANIM_19
+ { &object_hintnuts_Anim_0029BC, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENDNK_ANIM_20
+ { &object_hintnuts_Anim_002E84, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENDNK_ANIM_21
+ { &gDekuScrubSpitAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENDNK_ANIM_22
+ { &gDekuScrubDamageAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENDNK_ANIM_23
+ { &gDekuScrubBurrowAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENDNK_ANIM_24
+ { &gDekuScrubBurrowAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENDNK_ANIM_25
+ { &gDekuScrubDieAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENDNK_ANIM_26
+ { &gDekuScrubUnburrowAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENDNK_ANIM_27
+ { &gDekuScrubLookAroundAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENDNK_ANIM_28
+ { &gDekuScrubUpAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENDNK_ANIM_29
+ { &gDekuScrubIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENDNK_ANIM_30
+ { &gDekuScrubIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENDNK_ANIM_31
+ { &gDekuScrubPantingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENDNK_ANIM_32
+ { &gDekuScrubRunAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENDNK_ANIM_33
+ { &gDekuScrubRunAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENDNK_ANIM_34
+ { &gDekuScrubStandingIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENDNK_ANIM_35
};
-s32 func_80A514F0(SkelAnime* skelAnime, s16 animIndex) {
- s16 frame;
- s16 frameCount;
- s32 sp30 = false;
+s32 EnDnk_ChangeAnim(SkelAnime* skelAnime, s16 animIndex) {
+ s16 startFrame;
+ s16 endFrame;
+ s32 didAnimChange = false;
if (animIndex >= 0) {
if (animIndex < ARRAY_COUNT(sAnimationInfo)) {
- sp30 = true;
- frameCount = sAnimationInfo[animIndex].frameCount;
- if (frameCount < 0) {
- frameCount = Animation_GetLastFrame(sAnimationInfo[animIndex].animation);
+ didAnimChange = true;
+ endFrame = sAnimationInfo[animIndex].frameCount;
+ if (endFrame < 0) {
+ endFrame = Animation_GetLastFrame(sAnimationInfo[animIndex].animation);
}
- frame = sAnimationInfo[animIndex].startFrame;
- if (frame < 0) {
- frame = frameCount;
+ startFrame = sAnimationInfo[animIndex].startFrame;
+ if (startFrame < 0) {
+ startFrame = endFrame;
}
- Animation_Change(skelAnime, sAnimationInfo[animIndex].animation, sAnimationInfo[animIndex].playSpeed, frame,
- frameCount, sAnimationInfo[animIndex].mode, sAnimationInfo[animIndex].morphFrames);
+ Animation_Change(skelAnime, sAnimationInfo[animIndex].animation, sAnimationInfo[animIndex].playSpeed,
+ startFrame, endFrame, sAnimationInfo[animIndex].mode,
+ sAnimationInfo[animIndex].morphFrames);
}
}
- return sp30;
+ return didAnimChange;
}
s32 func_80A515C4(EnDnk* this) {
@@ -171,7 +210,7 @@ s32 func_80A515C4(EnDnk* this) {
void func_80A51648(EnDnk* this, PlayState* play) {
if (SubS_IsObjectLoaded(this->unk_28E, play) == true) {
- gSegments[0x06] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->unk_28E].segment);
+ gSegments[0x06] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->unk_28E].segment);
this->actor.draw = func_80A52018;
this->actor.objBankIndex = this->unk_28E;
ActorShape_Init(&this->actor.shape, 0.0f, NULL, 18.0f);
@@ -180,19 +219,19 @@ void func_80A51648(EnDnk* this, PlayState* play) {
case ENDNK_GET_3_0:
SkelAnime_Init(play, &this->skelAnime, &gDekuPalaceGuardSkel, NULL, this->jointTable, this->morphTable,
DEKU_PALACE_GUARD_LIMB_MAX);
- func_80A514F0(&this->skelAnime, 7);
+ EnDnk_ChangeAnim(&this->skelAnime, ENDNK_ANIM_7);
break;
case ENDNK_GET_3_1:
SkelAnime_Init(play, &this->skelAnime, &object_hintnuts_Skel_0023B8.sh, NULL, this->jointTable,
- this->morphTable, 10);
- func_80A514F0(&this->skelAnime, 18);
+ this->morphTable, OBJECT_HINTNUTS_LIMB_MAX);
+ EnDnk_ChangeAnim(&this->skelAnime, ENDNK_ANIM_18);
break;
case ENDNK_GET_3_2:
SkelAnime_Init(play, &this->skelAnime, &gDekuScrubSkel, NULL, this->jointTable, this->morphTable,
DEKU_SCRUB_LIMB_MAX);
- func_80A514F0(&this->skelAnime, 35);
+ EnDnk_ChangeAnim(&this->skelAnime, ENDNK_ANIM_35);
break;
}
@@ -200,21 +239,21 @@ void func_80A51648(EnDnk* this, PlayState* play) {
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
if (ENDNK_GET_3C(&this->actor) == 4) {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.flags |= (ACTOR_FLAG_10 | ACTOR_FLAG_20);
- this->actionFunc = func_80A51890;
+ this->actionFunc = EnDnk_HandleCutscene;
Actor_SetScale(&this->actor, 0.1f);
} else {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actionFunc = EnDnk_DoNothing;
Actor_SetScale(&this->actor, 0.01f);
}
}
}
-void func_80A51890(EnDnk* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 126)) {
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, 126));
+void EnDnk_HandleCutscene(EnDnk* this, PlayState* play) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_126)) {
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_126));
}
}
@@ -284,7 +323,7 @@ void func_80A51AA4(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Acto
Vec3f sp44;
Vec3s sp3C;
- if (limbIndex == 2) {
+ if (limbIndex == DEKU_PALACE_GUARD_LIMB_HEAD) {
Matrix_MultVec3f(&sp50, &sp44);
Matrix_Get(&sp5C);
Matrix_MtxFToYXZRot(&sp5C, &sp3C, false);
@@ -334,7 +373,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++);
@@ -360,7 +399,9 @@ void func_80A51DA4(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Acto
Vec3f sp44;
Vec3s sp3C;
- if (limbIndex == 2) {
+ // Note: Also for `limbIndex == OBJECT_HINTNUTS_LIMB_02`
+ // Assumes `OBJECT_HINTNUTS_LIMB_02` is the same value as `DEKU_SCRUB_LIMB_HEAD`
+ if (limbIndex == DEKU_SCRUB_LIMB_HEAD) {
Matrix_MultVec3f(&sp50, &sp44);
Matrix_Get(&sp5C);
Matrix_MtxFToYXZRot(&sp5C, &sp3C, false);
@@ -402,7 +443,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);
}
@@ -419,35 +460,41 @@ void func_80A52018(Actor* thisx, PlayState* play) {
case ENDNK_GET_3_2:
func_80A51FC0(this, play);
break;
+
+ default:
+ break;
}
}
void func_80A52074(EnDnk* this, PlayState* play) {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 80:
- func_8019F128(NA_SE_EN_DEKNUTS_DANCE1);
+ Audio_PlaySfx_2(NA_SE_EN_DEKNUTS_DANCE1);
break;
case 123:
- func_8019F128(NA_SE_EN_DEKNUTS_DANCE2);
+ Audio_PlaySfx_2(NA_SE_EN_DEKNUTS_DANCE2);
break;
case 438:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DEKNUTS_DANCE_BIG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEKNUTS_DANCE_BIG);
break;
case 493:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_APPEAR);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_APPEAR);
+ break;
+
+ default:
break;
}
- if ((play->csCtx.frames >= 198) && (play->csCtx.frames < 438)) {
- func_8019F128(NA_SE_EN_DEKNUTS_DANCE - SFX_FLAG);
+ if ((play->csCtx.curFrame >= 198) && (play->csCtx.curFrame < 438)) {
+ Audio_PlaySfx_2(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..ba870d67b 100644
--- a/src/overlays/actors/ovl_En_Dnk/z_en_dnk.h
+++ b/src/overlays/actors/ovl_En_Dnk/z_en_dnk.h
@@ -2,6 +2,9 @@
#define Z_EN_DNK_H
#include "global.h"
+#include "objects/object_dnk/object_dnk.h"
+#include "objects/object_hintnuts/object_hintnuts.h"
+#include "objects/object_dekunuts/object_dekunuts.h"
struct EnDnk;
@@ -10,13 +13,15 @@ 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;
+
+#define DNK_LIMB_MAX MAX(MAX((s32)DEKU_PALACE_GUARD_LIMB_MAX, (s32)OBJECT_HINTNUTS_LIMB_MAX), (s32)DEKU_SCRUB_LIMB_MAX)
typedef struct EnDnk {
/* 0x000 */ Actor actor;
@@ -24,9 +29,9 @@ typedef struct EnDnk {
/* 0x188 */ EnDnkActionFunc actionFunc;
/* 0x18C */ UNK_TYPE1 unk_18C[0x4];
/* 0x190 */ ColliderCylinder collider;
- /* 0x1DC */ Vec3s jointTable[11];
- /* 0x21E */ Vec3s morphTable[11];
- /* 0x260 */ Gfx* unk_260[11];
+ /* 0x1DC */ Vec3s jointTable[DNK_LIMB_MAX];
+ /* 0x21E */ Vec3s morphTable[DNK_LIMB_MAX];
+ /* 0x260 */ Gfx* unk_260[DEKU_PALACE_GUARD_LIMB_MAX];
/* 0x28C */ u16 unk_28C;
/* 0x28E */ s8 unk_28E;
/* 0x290 */ s16 unk_290;
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 12e048955..d32f2f3f4 100644
--- a/src/overlays/actors/ovl_En_Dno/z_en_dno.c
+++ b/src/overlays/actors/ovl_En_Dno/z_en_dno.c
@@ -12,7 +12,7 @@
#include "overlays/actors/ovl_Bg_Crace_Movebg/z_bg_crace_movebg.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((EnDno*)thisx)
@@ -44,6 +44,7 @@ s32 EnDno_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
void EnDno_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx);
typedef enum {
+ /* -1 */ EN_DNO_ANIM_NONE = -1,
/* 0 */ EN_DNO_ANIM_START_RACE_START,
/* 1 */ EN_DNO_ANIM_START_RACE_END,
/* 2 */ EN_DNO_ANIM_FLY,
@@ -64,29 +65,30 @@ typedef enum {
/* 17 */ EN_DNO_ANIM_SHOCK_START,
/* 18 */ EN_DNO_ANIM_SHOCK_LOOP,
/* 19 */ EN_DNO_ANIM_GRIEVE,
+ /* 20 */ EN_DNO_ANIM_MAX
} EnDnoAnimation;
-static AnimationSpeedInfo sAnimations[] = {
- { &gDekuButlerStartRaceStartAnim, 1.0f, ANIMMODE_ONCE, 0.0f },
- { &gDekuButlerStartRaceEndAnim, 1.0f, ANIMMODE_ONCE, 0.0f },
- { &gDekuButlerFlyAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &gDekuButlerFarewellAnim, 1.0f, ANIMMODE_ONCE, 0.0f },
- { &gDekuButlerGreetingAnim, 1.0f, ANIMMODE_ONCE, 0.0f },
- { &gDekuButlerGreetingWithCandleAnim, 1.0f, ANIMMODE_ONCE, 0.0f },
- { &gDekuButlerPrayerLoopAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &gDekuButlerCloseParasolAnim, 1.0f, ANIMMODE_ONCE, 0.0f },
- { &gDekuButlerOpenParasolAnim, 1.0f, ANIMMODE_ONCE, 0.0f },
- { &gDekuButlerImploreLoopAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &gDekuButlerImploreEndAnim, 1.0f, ANIMMODE_ONCE, 0.0f },
- { &gDekuButlerTalkAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &gDekuButlerTalkWithParasolAndCandleAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &gDekuButlerIdleAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &gDekuButlerIdleWithCandleAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &gDekuButlerPrayerStartAnim, 1.0f, ANIMMODE_ONCE, 0.0f },
- { &gDekuButlerImploreStartAnim, 1.0f, ANIMMODE_ONCE, 0.0f },
- { &gDekuButlerShockStartAnim, 1.0f, ANIMMODE_ONCE, 0.0f },
- { &gDekuButlerShockLoopAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &gDekuButlerGrieveAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+static AnimationSpeedInfo sAnimationSpeedInfo[EN_DNO_ANIM_MAX] = {
+ { &gDekuButlerStartRaceStartAnim, 1.0f, ANIMMODE_ONCE, 0.0f }, // EN_DNO_ANIM_START_RACE_START
+ { &gDekuButlerStartRaceEndAnim, 1.0f, ANIMMODE_ONCE, 0.0f }, // EN_DNO_ANIM_START_RACE_END
+ { &gDekuButlerFlyAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // EN_DNO_ANIM_FLY
+ { &gDekuButlerFarewellAnim, 1.0f, ANIMMODE_ONCE, 0.0f }, // EN_DNO_ANIM_FAREWELL
+ { &gDekuButlerGreetingAnim, 1.0f, ANIMMODE_ONCE, 0.0f }, // EN_DNO_ANIM_GREETING
+ { &gDekuButlerGreetingWithCandleAnim, 1.0f, ANIMMODE_ONCE, 0.0f }, // EN_DNO_ANIM_GREETING_WITH_CANDLE
+ { &gDekuButlerPrayerLoopAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // EN_DNO_ANIM_PRAYER_LOOP
+ { &gDekuButlerCloseParasolAnim, 1.0f, ANIMMODE_ONCE, 0.0f }, // EN_DNO_ANIM_CLOSE_PARASOL
+ { &gDekuButlerOpenParasolAnim, 1.0f, ANIMMODE_ONCE, 0.0f }, // EN_DNO_ANIM_OPEN_PARASOL
+ { &gDekuButlerImploreLoopAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // EN_DNO_ANIM_IMPLORE_LOOP
+ { &gDekuButlerImploreEndAnim, 1.0f, ANIMMODE_ONCE, 0.0f }, // EN_DNO_ANIM_IMPLORE_END
+ { &gDekuButlerTalkAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // EN_DNO_ANIM_TALK
+ { &gDekuButlerTalkWithParasolAndCandleAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // EN_DNO_ANIM_TALK_WITH_PARSOL_AND_CANDLE
+ { &gDekuButlerIdleAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // EN_DNO_ANIM_IDLE
+ { &gDekuButlerIdleWithCandleAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // EN_DNO_ANIM_IDLE_WITH_CANDLE
+ { &gDekuButlerPrayerStartAnim, 1.0f, ANIMMODE_ONCE, 0.0f }, // EN_DNO_ANIM_PRAYER_START
+ { &gDekuButlerImploreStartAnim, 1.0f, ANIMMODE_ONCE, 0.0f }, // EN_DNO_ANIM_IMPLORE_START
+ { &gDekuButlerShockStartAnim, 1.0f, ANIMMODE_ONCE, 0.0f }, // EN_DNO_ANIM_SHOCK_START
+ { &gDekuButlerShockLoopAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // EN_DNO_ANIM_SHOCK_LOOP
+ { &gDekuButlerGrieveAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // EN_DNO_ANIM_GRIEVE
};
ActorInit En_Dno_InitVars = {
@@ -235,15 +237,15 @@ 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);
- 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,
- sAnimations[EN_DNO_ANIM_IDLE_WITH_CANDLE].morphFrames);
+ Actor_UpdateBgCheckInfo(play, thisx, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
+ Animation_Change(&this->skelAnime, sAnimationSpeedInfo[EN_DNO_ANIM_IDLE_WITH_CANDLE].animation, 1.0f, 0.0f,
+ Animation_GetLastFrame(sAnimationSpeedInfo[EN_DNO_ANIM_IDLE_WITH_CANDLE].animation),
+ sAnimationSpeedInfo[EN_DNO_ANIM_IDLE_WITH_CANDLE].mode,
+ sAnimationSpeedInfo[EN_DNO_ANIM_IDLE_WITH_CANDLE].morphFrames);
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)) {
@@ -252,8 +254,8 @@ void EnDno_Init(Actor* thisx, PlayState* play) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_23_20) || CHECK_WEEKEVENTREG(WEEKEVENTREG_93_02)) {
Actor_Kill(thisx);
} else {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_IDLE_WITH_CANDLE,
- &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo,
+ EN_DNO_ANIM_IDLE_WITH_CANDLE, &this->animIndex);
thisx->room = -1;
gSaveContext.timerStates[TIMER_ID_MINIGAME_1] = TIMER_STATE_STOP;
this->lightNode = LightContext_InsertLight(play, &play->lightCtx, &this->lightInfo);
@@ -267,7 +269,7 @@ void EnDno_Init(Actor* thisx, PlayState* play) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_23_20)) {
Actor_Kill(thisx);
} else {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, EN_DNO_ANIM_IDLE,
&this->animIndex);
this->unk_460 = SubS_FindActor(play, NULL, ACTORCAT_NPC, ACTOR_EN_DNQ);
if (this->unk_460 == NULL) {
@@ -296,7 +298,7 @@ void EnDno_Destroy(Actor* thisx, PlayState* play) {
void func_80A71B04(EnDno* this, PlayState* play) {
this->unk_452 = 0;
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_GRIEVE, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, EN_DNO_ANIM_GRIEVE, &this->animIndex);
this->actionFunc = EnDno_DoNothing;
}
@@ -309,15 +311,15 @@ void func_80A71B68(EnDno* this, PlayState* play) {
if (CHECK_QUEST_ITEM(QUEST_SONG_SONATA)) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_27_01)) {
if (!(this->unk_3B0 & 0x20)) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_PRAYER_LOOP,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, EN_DNO_ANIM_PRAYER_LOOP,
&this->animIndex);
- this->actor.shape.rot.y = Actor_YawBetweenActors(&this->actor, this->unk_460);
+ this->actor.shape.rot.y = Actor_WorldYawTowardActor(&this->actor, this->unk_460);
}
} else {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_IDLE, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, EN_DNO_ANIM_IDLE, &this->animIndex);
}
} else {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_IDLE, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, EN_DNO_ANIM_IDLE, &this->animIndex);
}
this->actionFunc = func_80A71C3C;
}
@@ -326,29 +328,35 @@ void func_80A71C3C(EnDno* this, PlayState* play) {
switch (this->animIndex) {
case EN_DNO_ANIM_IMPLORE_LOOP:
case EN_DNO_ANIM_IMPLORE_START:
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_IMPLORE_END, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, EN_DNO_ANIM_IMPLORE_END,
+ &this->animIndex);
break;
case EN_DNO_ANIM_FAREWELL:
case EN_DNO_ANIM_IMPLORE_END:
if (this->skelAnime.curFrame == this->skelAnime.endFrame) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_IDLE, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, EN_DNO_ANIM_IDLE,
+ &this->animIndex);
}
break;
case EN_DNO_ANIM_TALK:
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_PRAYER_START, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, EN_DNO_ANIM_PRAYER_START,
+ &this->animIndex);
break;
case EN_DNO_ANIM_PRAYER_START:
if (this->skelAnime.curFrame == this->skelAnime.endFrame) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_PRAYER_LOOP,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, EN_DNO_ANIM_PRAYER_LOOP,
&this->animIndex);
}
case EN_DNO_ANIM_PRAYER_LOOP:
- Math_SmoothStepToS(&this->actor.shape.rot.y, Actor_YawBetweenActors(&this->actor, this->unk_460), 2, 0xE38,
- 0x222);
+ Math_SmoothStepToS(&this->actor.shape.rot.y, Actor_WorldYawTowardActor(&this->actor, this->unk_460), 2,
+ 0xE38, 0x222);
+ break;
+
+ default:
break;
}
@@ -364,11 +372,11 @@ void func_80A71C3C(EnDno* this, PlayState* play) {
}
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- play->msgCtx.msgMode = 0;
+ play->msgCtx.msgMode = MSGMODE_NONE;
play->msgCtx.msgLength = 0;
func_80A71E54(this, play);
} else if (this->actor.xzDistToPlayer < 60.0f) {
- func_800B8614(&this->actor, play, 60.0f);
+ Actor_OfferTalk(&this->actor, play, 60.0f);
}
}
@@ -404,8 +412,8 @@ void func_80A71F18(EnDno* this, PlayState* play) {
Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0xE38)) {
switch (this->textId) {
case 0x80B:
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_IMPLORE_START,
- &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo,
+ EN_DNO_ANIM_IMPLORE_START, &this->animIndex);
case 0x811:
Message_StartTextbox(play, this->textId, &this->actor);
@@ -414,15 +422,18 @@ void func_80A71F18(EnDno* this, PlayState* play) {
case 0x80C:
case 0x80F:
if (this->animIndex == EN_DNO_ANIM_IDLE) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_GREETING,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, EN_DNO_ANIM_GREETING,
&this->animIndex);
} else if ((this->animIndex == EN_DNO_ANIM_GREETING) &&
(this->skelAnime.curFrame == this->skelAnime.endFrame)) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_TALK,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, EN_DNO_ANIM_TALK,
&this->animIndex);
Message_StartTextbox(play, this->textId, &this->actor);
}
break;
+
+ default:
+ break;
}
}
break;
@@ -432,21 +443,24 @@ void func_80A71F18(EnDno* this, PlayState* play) {
switch (this->animIndex) {
case EN_DNO_ANIM_IMPLORE_START:
if (this->skelAnime.curFrame == this->skelAnime.endFrame) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_IMPLORE_LOOP,
- &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo,
+ EN_DNO_ANIM_IMPLORE_LOOP, &this->animIndex);
}
Math_ScaledStepToS(&this->actor.shape.rot.y,
- Actor_YawBetweenActors(&this->actor, this->unk_460), 0x71C);
+ Actor_WorldYawTowardActor(&this->actor, this->unk_460), 0x71C);
break;
case EN_DNO_ANIM_IMPLORE_END:
if (this->skelAnime.curFrame == this->skelAnime.endFrame) {
- func_801477B4(play);
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_IDLE,
+ Message_CloseTextbox(play);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, EN_DNO_ANIM_IDLE,
&this->animIndex);
func_80A71B68(this, play);
}
break;
+
+ default:
+ break;
}
}
break;
@@ -459,92 +473,101 @@ void func_80A71F18(EnDno* this, PlayState* play) {
switch (this->animIndex) {
case EN_DNO_ANIM_IMPLORE_START:
if (this->skelAnime.curFrame == this->skelAnime.endFrame) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_IMPLORE_LOOP,
- &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo,
+ EN_DNO_ANIM_IMPLORE_LOOP, &this->animIndex);
}
break;
case EN_DNO_ANIM_IMPLORE_LOOP:
if (Message_ShouldAdvance(play)) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_IMPLORE_END,
- &this->animIndex);
- play->msgCtx.msgMode = 0x44;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo,
+ EN_DNO_ANIM_IMPLORE_END, &this->animIndex);
+ play->msgCtx.msgMode = MSGMODE_PAUSED;
}
break;
case EN_DNO_ANIM_IMPLORE_END:
if (this->skelAnime.curFrame == this->skelAnime.endFrame) {
- func_801477B4(play);
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_IDLE,
+ Message_CloseTextbox(play);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, EN_DNO_ANIM_IDLE,
&this->animIndex);
func_80A71B68(this, play);
}
break;
+
+ default:
+ break;
}
break;
case 0x80C:
if (Message_ShouldAdvance(play)) {
- func_80151938(play, 0x80D);
+ Message_ContinueTextbox(play, 0x80D);
}
break;
case 0x80D:
if (Message_ShouldAdvance(play)) {
- func_80151938(play, 0x80E);
+ Message_ContinueTextbox(play, 0x80E);
}
break;
case 0x80E:
if (this->animIndex == EN_DNO_ANIM_TALK) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_FAREWELL,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, EN_DNO_ANIM_FAREWELL,
&this->animIndex);
} else if (this->animIndex == EN_DNO_ANIM_FAREWELL) {
if (this->skelAnime.curFrame == this->skelAnime.endFrame) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_IDLE,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, EN_DNO_ANIM_IDLE,
&this->animIndex);
}
} else if ((this->animIndex == EN_DNO_ANIM_IDLE) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_80A71B68(this, play);
}
break;
case 0x80F:
if (Message_ShouldAdvance(play)) {
- func_80151938(play, 0x810);
+ Message_ContinueTextbox(play, 0x810);
}
break;
case 0x810:
if (Message_ShouldAdvance(play)) {
this->unk_3B0 |= 0x20;
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_80A71B68(this, play);
break;
}
switch (this->animIndex) {
case EN_DNO_ANIM_TALK:
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_PRAYER_START,
- &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo,
+ EN_DNO_ANIM_PRAYER_START, &this->animIndex);
break;
case EN_DNO_ANIM_PRAYER_START:
if (this->skelAnime.curFrame == this->skelAnime.endFrame) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_PRAYER_LOOP,
- &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo,
+ EN_DNO_ANIM_PRAYER_LOOP, &this->animIndex);
}
break;
+
+ default:
+ break;
}
break;
case 0x811:
if (Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_80A71B68(this, play);
}
break;
+
+ default:
+ break;
}
break;
}
@@ -552,7 +575,8 @@ void func_80A71F18(EnDno* this, PlayState* play) {
void func_80A72438(EnDno* this, PlayState* play) {
this->unk_452 = 1;
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_IDLE_WITH_CANDLE, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, EN_DNO_ANIM_IDLE_WITH_CANDLE,
+ &this->animIndex);
this->actor.textId = 0;
if (Flags_GetSwitch(play, EN_DNO_GET_RACE_STARTED_SWITCH_FLAG(&this->actor))) {
this->unk_454 = 1.0f;
@@ -568,12 +592,13 @@ void func_80A724B8(EnDno* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
func_80A725E0(this, play);
} else if (this->actor.xzDistToPlayer < 60.0f) {
- func_800B8614(&this->actor, play, 60.0f);
+ Actor_OfferTalk(&this->actor, play, 60.0f);
}
}
void func_80A7256C(EnDno* this, PlayState* play) {
- func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel,
+ PLAYER_IA_MINUS1);
}
void func_80A72598(EnDno* this, PlayState* play) {
@@ -598,7 +623,7 @@ void func_80A725F8(EnDno* this, PlayState* play) {
case 0:
if (this->animIndex == EN_DNO_ANIM_IDLE_WITH_CANDLE) {
if (Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0x2D8)) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo,
EN_DNO_ANIM_GREETING_WITH_CANDLE, &this->animIndex);
}
} else if ((this->animIndex == EN_DNO_ANIM_GREETING_WITH_CANDLE) &&
@@ -610,8 +635,8 @@ void func_80A725F8(EnDno* this, PlayState* play) {
} else {
Message_StartTextbox(play, 0x800, &this->actor);
}
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_IDLE_WITH_CANDLE,
- &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo,
+ EN_DNO_ANIM_IDLE_WITH_CANDLE, &this->animIndex);
}
break;
@@ -625,6 +650,9 @@ void func_80A725F8(EnDno* this, PlayState* play) {
case 3:
Message_StartTextbox(play, 0x804, &this->actor);
break;
+
+ default:
+ break;
}
break;
@@ -637,7 +665,7 @@ void func_80A725F8(EnDno* this, PlayState* play) {
if (this->skelAnime.curFrame <= 23.0f) {
this->unk_452 = 3;
if (Animation_OnFrame(&this->skelAnime, 23.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_OPEN_AMBRELLA);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_OPEN_AMBRELLA);
}
} else if (this->skelAnime.curFrame <= 24.0f) {
this->unk_452 = 4;
@@ -646,7 +674,7 @@ void func_80A725F8(EnDno* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo,
EN_DNO_ANIM_TALK_WITH_PARSOL_AND_CANDLE, &this->animIndex);
Message_StartTextbox(play, 0x803, &this->actor);
}
@@ -660,10 +688,10 @@ void func_80A725F8(EnDno* this, PlayState* play) {
case 0x800:
case 0x801:
if (Message_ShouldAdvance(play)) {
- play->msgCtx.msgMode = 0x44;
+ play->msgCtx.msgMode = MSGMODE_PAUSED;
this->unk_452 = 1;
this->unk_454 = 0.0f;
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_OPEN_PARASOL,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, EN_DNO_ANIM_OPEN_PARASOL,
&this->animIndex);
}
break;
@@ -675,8 +703,8 @@ void func_80A725F8(EnDno* this, PlayState* play) {
} else {
this->getItemId = GI_MASK_SCENTS;
}
- Actor_PickUp(&this->actor, play, this->getItemId, 60.0f, 60.0f);
- func_801477B4(play);
+ Actor_OfferGetItem(&this->actor, play, this->getItemId, 60.0f, 60.0f);
+ Message_CloseTextbox(play);
func_80A72B84(this, play);
}
break;
@@ -690,7 +718,7 @@ void func_80A725F8(EnDno* this, PlayState* play) {
case 0x804:
if (this->animIndex == EN_DNO_ANIM_IDLE_WITH_CANDLE) {
if (Message_ShouldAdvance(play)) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo,
EN_DNO_ANIM_GREETING_WITH_CANDLE, &this->animIndex);
if (!(this->unk_3B0 & 0x40)) {
func_80A72CF8(this, play);
@@ -699,14 +727,14 @@ void func_80A725F8(EnDno* this, PlayState* play) {
}
} else if ((this->animIndex == EN_DNO_ANIM_GREETING_WITH_CANDLE) &&
(this->skelAnime.curFrame == this->skelAnime.endFrame)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_80A72438(this, play);
}
break;
case 0x806:
if (Message_ShouldAdvance(play)) {
- func_80151938(play, 0x800);
+ Message_ContinueTextbox(play, 0x800);
}
break;
@@ -719,7 +747,8 @@ void func_80A725F8(EnDno* this, PlayState* play) {
}
void func_80A72AE4(EnDno* this, PlayState* play) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_START_RACE_START, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, EN_DNO_ANIM_START_RACE_START,
+ &this->animIndex);
func_80A714B4(this, play);
this->actionFunc = func_80A72B3C;
}
@@ -741,14 +770,15 @@ void func_80A72BA4(EnDno* this, PlayState* play) {
this->actor.parent = NULL;
this->actionFunc = func_80A72598;
} else {
- Actor_PickUp(&this->actor, play, this->getItemId, 60.0f, 60.0f);
+ Actor_OfferGetItem(&this->actor, play, this->getItemId, 60.0f, 60.0f);
}
}
void func_80A72C04(EnDno* this, PlayState* play) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_START_RACE_START, &this->animIndex);
- this->actor.flags |= ACTOR_FLAG_8000000;
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, EN_DNO_ANIM_START_RACE_START,
+ &this->animIndex);
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
Math_Vec3f_Copy(&this->unk_334, &this->actor.world.pos);
SubS_ActorPathing_Init(play, &this->unk_334, &this->actor, &this->actorPath, play->setupPathList,
EN_DNO_GET_7F(&this->actor), 1, 0, 1, 0);
@@ -762,7 +792,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);
}
@@ -779,21 +809,21 @@ s32 EnDno_ActorPathing_UpdateActorInfo(PlayState* play, ActorPathing* actorPath)
thisx->gravity = 0.0f;
temp_v0 = thisx->yawTowardsPlayer - thisx->world.rot.y;
if ((temp_v0 <= 0x4000) && (temp_v0 >= -0x4000)) {
- Math_SmoothStepToF(&thisx->speedXZ, 15.0f, 0.8f, 1.0f, 0.01f);
+ Math_SmoothStepToF(&thisx->speed, 15.0f, 0.8f, 1.0f, 0.01f);
} else {
if (thisx->xzDistToPlayer <= 80.0f) {
- Math_SmoothStepToF(&thisx->speedXZ, 8.0f, 0.5f, 0.5f, 0.01f);
+ Math_SmoothStepToF(&thisx->speed, 8.0f, 0.5f, 0.5f, 0.01f);
} else if (thisx->xzDistToPlayer <= 360.0f) {
- Math_SmoothStepToF(&thisx->speedXZ, 7.0f, 0.5f, 0.5f, 0.01f);
+ Math_SmoothStepToF(&thisx->speed, 7.0f, 0.5f, 0.5f, 0.01f);
} else {
- Math_SmoothStepToF(&thisx->speedXZ, 3.5f, 0.5f, 0.5f, 0.01f);
+ Math_SmoothStepToF(&thisx->speed, 3.5f, 0.5f, 0.5f, 0.01f);
}
}
- if (actorPath->distSqToCurPoint < SQ(thisx->speedXZ)) {
+ if (actorPath->distSqToCurPoint < SQ(thisx->speed)) {
ret = true;
} else {
- sp38 = thisx->speedXZ / sqrtf(actorPath->distSqToCurPointXZ);
+ sp38 = thisx->speed / sqrtf(actorPath->distSqToCurPointXZ);
sp2C = ABS(actorPath->rotToCurPoint.x - thisx->world.rot.x);
temp_v0_2 = sp2C;
temp_v0_2 *= sp38;
@@ -810,11 +840,11 @@ s32 EnDno_ActorPathing_UpdateActorInfo(PlayState* play, ActorPathing* actorPath)
s32 EnDno_ActorPathing_Move(PlayState* play, ActorPathing* actorPath) {
Actor* thisx = actorPath->actor;
EnDno* this = (EnDno*)thisx;
- f32 sp24 = Math_CosS(-thisx->world.rot.x) * thisx->speedXZ;
+ f32 sp24 = Math_CosS(-thisx->world.rot.x) * thisx->speed;
f32 sp20 = gFramerateDivisorHalf;
thisx->velocity.x = Math_SinS(thisx->world.rot.y) * sp24;
- thisx->velocity.y = Math_SinS(-thisx->world.rot.x) * thisx->speedXZ;
+ thisx->velocity.y = Math_SinS(-thisx->world.rot.x) * thisx->speed;
thisx->velocity.z = Math_CosS(thisx->world.rot.y) * sp24;
this->unk_334.x += (this->actor.velocity.x * sp20) + this->actor.colChkInfo.displacement.x;
@@ -825,26 +855,29 @@ s32 EnDno_ActorPathing_Move(PlayState* play, ActorPathing* actorPath) {
}
void func_80A730A0(EnDno* this, PlayState* play) {
- s32 phi_a2;
+ s32 nextAnimIndex;
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- phi_a2 = -1;
+ nextAnimIndex = EN_DNO_ANIM_NONE;
switch (this->animIndex) {
case EN_DNO_ANIM_START_RACE_START:
if (this->unk_44E >= 20) {
- phi_a2 = EN_DNO_ANIM_START_RACE_END;
+ nextAnimIndex = EN_DNO_ANIM_START_RACE_END;
} else {
this->unk_44E = 20;
}
break;
case EN_DNO_ANIM_START_RACE_END:
- phi_a2 = EN_DNO_ANIM_FLY;
+ nextAnimIndex = EN_DNO_ANIM_FLY;
+ break;
+
+ default:
break;
}
- if (phi_a2 >= 0) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, phi_a2, &this->animIndex);
+ if (nextAnimIndex > EN_DNO_ANIM_NONE) {
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, nextAnimIndex, &this->animIndex);
}
}
@@ -861,10 +894,10 @@ void func_80A730A0(EnDno* this, PlayState* play) {
this->unk_3AE += 1000;
this->actor.shape.rot.y = this->actor.yawTowardsPlayer;
func_80A715DC(this, play);
- func_800B9010(&this->actor, NA_SE_EV_BUTLER_FRY - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_BUTLER_FRY - SFX_FLAG);
if (this->actorPath.flags & ACTOR_PATHING_REACHED_END_PERMANENT) {
Math_Vec3f_Copy(&this->actor.world.pos, &this->actorPath.curPoint);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.velocity.x = 0.0f;
this->actor.velocity.y = 0.0f;
this->actor.velocity.z = 0.0f;
@@ -873,10 +906,10 @@ void func_80A730A0(EnDno* this, PlayState* play) {
}
void func_80A73244(EnDno* this, PlayState* play) {
- this->actor.flags &= ~ACTOR_FLAG_8000000;
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.flags &= ~ACTOR_FLAG_CANT_LOCK_ON;
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
this->unk_328 = 2;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
Flags_UnsetSwitch(play, EN_DNO_GET_RACE_STARTED_SWITCH_FLAG(&this->actor));
gSaveContext.timerStates[TIMER_ID_MINIGAME_1] = TIMER_STATE_STOP;
this->unk_44E = 0;
@@ -890,11 +923,12 @@ void func_80A732C8(EnDno* this, PlayState* play) {
if (Math_ScaledStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 0x71C)) {
this->unk_3B0 |= 4;
this->unk_44E = 3;
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_CLOSE_PARASOL, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, EN_DNO_ANIM_CLOSE_PARASOL,
+ &this->animIndex);
}
} else if (this->unk_44E == 3) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_IDLE_WITH_CANDLE,
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, EN_DNO_ANIM_IDLE_WITH_CANDLE,
&this->animIndex);
func_80A72438(this, play);
} else {
@@ -903,7 +937,7 @@ void func_80A732C8(EnDno* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, 4.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CLOSE_AMBRELLA);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_CLOSE_AMBRELLA);
this->unk_452 = 4;
} else if (Animation_OnFrame(&this->skelAnime, 5.0f)) {
this->unk_452 = 3;
@@ -914,39 +948,45 @@ void func_80A732C8(EnDno* this, PlayState* play) {
}
void func_80A73408(EnDno* this, PlayState* play) {
- s32 phi_a2;
- u8 sp33 = true;
- s32 temp_v0;
+ s32 nextAnimIndex;
+ u8 changeAnim = true;
+ 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;
+ nextAnimIndex = EN_DNO_ANIM_IDLE;
break;
case 2:
- phi_a2 = 17;
+ nextAnimIndex = EN_DNO_ANIM_SHOCK_START;
break;
default:
- phi_a2 = 0;
- sp33 = false;
+ nextAnimIndex = EN_DNO_ANIM_START_RACE_START;
+ changeAnim = false;
break;
}
- if (sp33) {
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, phi_a2, &this->animIndex);
+ if (changeAnim) {
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, nextAnimIndex, &this->animIndex);
}
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, temp_v0);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
- if ((Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) &&
- (this->animIndex == EN_DNO_ANIM_SHOCK_START)) {
- if (0) {};
- SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, EN_DNO_ANIM_SHOCK_LOOP, &this->animIndex);
+ if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
+ switch (this->animIndex) {
+ case EN_DNO_ANIM_SHOCK_START:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationSpeedInfo, EN_DNO_ANIM_SHOCK_LOOP,
+ &this->animIndex);
+ break;
+
+ default:
+ break;
+ }
}
}
@@ -958,7 +998,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);
@@ -976,7 +1016,7 @@ s32 EnDno_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
EnDno* this = THIS;
*dList = NULL;
- if (limbIndex == 9) {
+ if (limbIndex == DEKU_BUTLER_LIMB_EYES) {
rot->x += this->unk_466;
}
return false;
@@ -994,44 +1034,55 @@ void EnDno_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
if (*dList != NULL) {
switch (this->unk_452) {
case 0:
- if ((limbIndex != 25) && (limbIndex != 26) && (limbIndex != 13) && (limbIndex != 15) &&
- (limbIndex != 16) && (limbIndex != 14)) {
+ if ((limbIndex != DEKU_BUTLER_LIMB_CANDLE) && (limbIndex != DEKU_BUTLER_LIMB_CANDLE_WICK) &&
+ (limbIndex != DEKU_BUTLER_LIMB_PARASOL_HANDLE) &&
+ (limbIndex != DEKU_BUTLER_LIMB_PARASOL_LOWER_PETALS) &&
+ (limbIndex != DEKU_BUTLER_LIMB_PARASOL_MIDDLE_PETALS) &&
+ (limbIndex != DEKU_BUTLER_LIMB_PARASOL_UPPER_PETALS)) {
phi_v0 = true;
}
break;
case 1:
- if ((limbIndex != 26) && (limbIndex != 13) && (limbIndex != 15) && (limbIndex != 16) &&
- (limbIndex != 14)) {
+ if ((limbIndex != DEKU_BUTLER_LIMB_CANDLE_WICK) && (limbIndex != DEKU_BUTLER_LIMB_PARASOL_HANDLE) &&
+ (limbIndex != DEKU_BUTLER_LIMB_PARASOL_LOWER_PETALS) &&
+ (limbIndex != DEKU_BUTLER_LIMB_PARASOL_MIDDLE_PETALS) &&
+ (limbIndex != DEKU_BUTLER_LIMB_PARASOL_UPPER_PETALS)) {
phi_v0 = true;
}
break;
case 2:
- if ((limbIndex != 15) && (limbIndex != 16)) {
+ if ((limbIndex != DEKU_BUTLER_LIMB_PARASOL_LOWER_PETALS) &&
+ (limbIndex != DEKU_BUTLER_LIMB_PARASOL_MIDDLE_PETALS)) {
phi_v0 = true;
}
break;
case 3:
- if ((limbIndex != 16) && (limbIndex != 14)) {
+ if ((limbIndex != DEKU_BUTLER_LIMB_PARASOL_MIDDLE_PETALS) &&
+ (limbIndex != DEKU_BUTLER_LIMB_PARASOL_UPPER_PETALS)) {
phi_v0 = true;
}
break;
case 4:
- if ((limbIndex != 15) && (limbIndex != 14)) {
+ if ((limbIndex != DEKU_BUTLER_LIMB_PARASOL_LOWER_PETALS) &&
+ (limbIndex != DEKU_BUTLER_LIMB_PARASOL_UPPER_PETALS)) {
phi_v0 = true;
}
break;
+
+ default:
+ break;
}
}
if (phi_v0 == true) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- if (limbIndex == 13) {
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ if (limbIndex == DEKU_BUTLER_LIMB_PARASOL_HANDLE) {
Matrix_Scale(this->unk_454, this->unk_454, this->unk_454, MTXMODE_APPLY);
Matrix_RotateXS(this->unk_45C, MTXMODE_APPLY);
}
@@ -1044,7 +1095,7 @@ void EnDno_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
CLOSE_DISPS(play->state.gfxCtx);
}
- if ((this->unk_3B0 & 1) && (limbIndex == 26)) {
+ if ((this->unk_3B0 & 1) && (limbIndex == DEKU_BUTLER_LIMB_CANDLE_WICK)) {
u32 frames;
OPEN_DISPS(play->state.gfxCtx);
@@ -1056,7 +1107,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 b504e9a11..2518cbc47 100644
--- a/src/overlays/actors/ovl_En_Dnp/z_en_dnp.c
+++ b/src/overlays/actors/ovl_En_Dnp/z_en_dnp.c
@@ -9,7 +9,7 @@
#include "z_en_dnp.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnDnp*)thisx)
@@ -25,11 +25,11 @@ void func_80B3D3F8(EnDnp* this, PlayState* play);
void func_80B3D558(EnDnp* this, PlayState* play);
typedef enum {
- /* 0 */ EN_DNP_EYE_OPEN,
- /* 1 */ EN_DNP_EYE_HALF,
- /* 2 */ EN_DNP_EYE_CLOSED,
- /* 3 */ EN_DNP_EYE_ANGRY,
- /* 4 */ EN_DNP_EYE_MAX,
+ /* 0 */ DEKU_PRINCESS_EYE_OPEN,
+ /* 1 */ DEKU_PRINCESS_EYE_HALF,
+ /* 2 */ DEKU_PRINCESS_EYE_CLOSED,
+ /* 3 */ DEKU_PRINCESS_EYE_ANGRY,
+ /* 4 */ DEKU_PRINCESS_EYE_MAX
} EnDnpEyeIndex;
ActorInit En_Dnp_InitVars = {
@@ -67,62 +67,63 @@ static ColliderCylinderInit sCylinderInit = {
static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE };
typedef enum {
- /* -1 */ EN_DNP_ANIM_NONE = -1,
- /* 0 */ EN_DNP_ANIM_JUMP_KICK, // Can be triggered by a cutscene, but no cutscene in the final game does so
- /* 1 */ EN_DNP_ANIM_HURRY,
- /* 2 */ EN_DNP_ANIM_CUTSCENE_HURRY,
- /* 3 */ EN_DNP_ANIM_HURRY_END,
- /* 4 */ EN_DNP_ANIM_SCOLD, // Unused
- /* 5 */ EN_DNP_ANIM_LAUGH_START,
- /* 6 */ EN_DNP_ANIM_LAUGH_LOOP,
- /* 7 */ EN_DNP_ANIM_TURN_AROUND,
- /* 8 */ EN_DNP_ANIM_BOW,
- /* 9 */ EN_DNP_ANIM_RUN, // Unused
- /* 10 */ EN_DNP_ANIM_THINK_START,
- /* 11 */ EN_DNP_ANIM_THINK_LOOP,
- /* 12 */ EN_DNP_ANIM_ARMS_TOGETHER_START,
- /* 13 */ EN_DNP_ANIM_ARMS_TOGETHER_LOOP,
- /* 14 */ EN_DNP_ANIM_GREETING,
- /* 15 */ EN_DNP_ANIM_IDLE,
- /* 16 */ EN_DNP_ANIM_CUTSCENE_IDLE,
- /* 17 */ EN_DNP_ANIM_UNUSED_WALK, // Unused
- /* 18 */ EN_DNP_ANIM_WALK, // Can be triggered by a cutscene, but no cutscene in the final game does so
- /* 19 */ EN_DNP_ANIM_ANGRY_START,
- /* 20 */ EN_DNP_ANIM_ANGRY_LOOP,
- /* 21 */ EN_DNP_ANIM_JUMP,
- /* 22 */ EN_DNP_ANIM_BOUNCE_START,
- /* 23 */ EN_DNP_ANIM_BOUNCE_LOOP,
- /* 24 */ EN_DNP_ANIM_GLARE_START,
- /* 25 */ EN_DNP_ANIM_GLARE_LOOP
-} EnDnpAnimation;
+ /* -1 */ DEKU_PRINCESS_ANIM_NONE = -1,
+ /* 0 */ DEKU_PRINCESS_ANIM_JUMP_KICK, // Can be triggered by a cutscene, but no cutscene in the final game does so
+ /* 1 */ DEKU_PRINCESS_ANIM_HURRY,
+ /* 2 */ DEKU_PRINCESS_ANIM_CUTSCENE_HURRY,
+ /* 3 */ DEKU_PRINCESS_ANIM_HURRY_END,
+ /* 4 */ DEKU_PRINCESS_ANIM_SCOLD, // Unused
+ /* 5 */ DEKU_PRINCESS_ANIM_LAUGH_START,
+ /* 6 */ DEKU_PRINCESS_ANIM_LAUGH_LOOP,
+ /* 7 */ DEKU_PRINCESS_ANIM_TURN_AROUND,
+ /* 8 */ DEKU_PRINCESS_ANIM_BOW,
+ /* 9 */ DEKU_PRINCESS_ANIM_RUN, // Unused
+ /* 10 */ DEKU_PRINCESS_ANIM_THINK_START,
+ /* 11 */ DEKU_PRINCESS_ANIM_THINK_LOOP,
+ /* 12 */ DEKU_PRINCESS_ANIM_ARMS_TOGETHER_START,
+ /* 13 */ DEKU_PRINCESS_ANIM_ARMS_TOGETHER_LOOP,
+ /* 14 */ DEKU_PRINCESS_ANIM_GREETING,
+ /* 15 */ DEKU_PRINCESS_ANIM_IDLE,
+ /* 16 */ DEKU_PRINCESS_ANIM_CUTSCENE_IDLE,
+ /* 17 */ DEKU_PRINCESS_ANIM_UNUSED_WALK, // Unused
+ /* 18 */ DEKU_PRINCESS_ANIM_WALK, // Can be triggered by a cutscene, but no cutscene in the final game does so
+ /* 19 */ DEKU_PRINCESS_ANIM_ANGRY_START,
+ /* 20 */ DEKU_PRINCESS_ANIM_ANGRY_LOOP,
+ /* 21 */ DEKU_PRINCESS_ANIM_JUMP,
+ /* 22 */ DEKU_PRINCESS_ANIM_BOUNCE_START,
+ /* 23 */ DEKU_PRINCESS_ANIM_BOUNCE_LOOP,
+ /* 24 */ DEKU_PRINCESS_ANIM_GLARE_START,
+ /* 25 */ DEKU_PRINCESS_ANIM_GLARE_LOOP,
+ /* 26 */ DEKU_PRINCESS_ANIM_MAX
+} DekuPrincessAnimation;
-static AnimationInfoS sAnimationInfo[] = {
- { &gDekuPrincessJumpKickAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &gDekuPrincessHurryAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &gDekuPrincessHurryAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuPrincessHurryEndAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &gDekuPrincessScoldAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &gDekuPrincessLaughStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &gDekuPrincessLaughLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuPrincessTurnAroundAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gDekuPrincessBowAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuPrincessRunAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuPrincessThinkStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &gDekuPrincessThinkLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuPrincessArmsTogetherStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &gDekuPrincessArmsTogetherLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuPrincessGreetingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuPrincessIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &gDekuPrincessIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuPrincessWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuPrincessWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &gDekuPrincessAngryStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &gDekuPrincessAngryLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuPrincessJumpAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &gDekuPrincessBounceStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gDekuPrincessBounceLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuPrincessGlareStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gDekuPrincessGlareLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
+static AnimationInfoS sAnimationInfo[DEKU_PRINCESS_ANIM_MAX] = {
+ { &gDekuPrincessJumpKickAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // DEKU_PRINCESS_ANIM_JUMP_KICK
+ { &gDekuPrincessHurryAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DEKU_PRINCESS_ANIM_HURRY
+ { &gDekuPrincessHurryAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // DEKU_PRINCESS_ANIM_CUTSCENE_HURRY
+ { &gDekuPrincessHurryEndAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // DEKU_PRINCESS_ANIM_HURRY_END
+ { &gDekuPrincessScoldAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // DEKU_PRINCESS_ANIM_SCOLD
+ { &gDekuPrincessLaughStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // DEKU_PRINCESS_ANIM_LAUGH_START
+ { &gDekuPrincessLaughLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // DEKU_PRINCESS_ANIM_LAUGH_LOOP
+ { &gDekuPrincessTurnAroundAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DEKU_PRINCESS_ANIM_TURN_AROUND
+ { &gDekuPrincessBowAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // DEKU_PRINCESS_ANIM_BOW
+ { &gDekuPrincessRunAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // DEKU_PRINCESS_ANIM_RUN
+ { &gDekuPrincessThinkStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // DEKU_PRINCESS_ANIM_THINK_START
+ { &gDekuPrincessThinkLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // DEKU_PRINCESS_ANIM_THINK_LOOP
+ { &gDekuPrincessArmsTogetherStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // DEKU_PRINCESS_ANIM_ARMS_TOGETHER_START
+ { &gDekuPrincessArmsTogetherLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // DEKU_PRINCESS_ANIM_ARMS_TOGETHER_LOOP
+ { &gDekuPrincessGreetingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // DEKU_PRINCESS_ANIM_GREETING
+ { &gDekuPrincessIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DEKU_PRINCESS_ANIM_IDLE
+ { &gDekuPrincessIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // DEKU_PRINCESS_ANIM_CUTSCENE_IDLE
+ { &gDekuPrincessWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // DEKU_PRINCESS_ANIM_UNUSED_WALK
+ { &gDekuPrincessWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DEKU_PRINCESS_ANIM_WALK
+ { &gDekuPrincessAngryStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // DEKU_PRINCESS_ANIM_ANGRY_START
+ { &gDekuPrincessAngryLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // DEKU_PRINCESS_ANIM_ANGRY_LOOP
+ { &gDekuPrincessJumpAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // DEKU_PRINCESS_ANIM_JUMP
+ { &gDekuPrincessBounceStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DEKU_PRINCESS_ANIM_BOUNCE_START
+ { &gDekuPrincessBounceLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // DEKU_PRINCESS_ANIM_BOUNCE_LOOP
+ { &gDekuPrincessGlareStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DEKU_PRINCESS_ANIM_GLARE_START
+ { &gDekuPrincessGlareLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // DEKU_PRINCESS_ANIM_GLARE_LOOP
};
static s32 D_80B3DE58[] = {
@@ -130,40 +131,42 @@ static s32 D_80B3DE58[] = {
};
s32 func_80B3CA20(EnDnp* this) {
- if ((this->animIndex == EN_DNP_ANIM_CUTSCENE_HURRY) || (this->animIndex == EN_DNP_ANIM_RUN)) {
+ if ((this->animIndex == DEKU_PRINCESS_ANIM_CUTSCENE_HURRY) || (this->animIndex == DEKU_PRINCESS_ANIM_RUN)) {
if (Animation_OnFrame(&this->skelAnime, 1.0f) || Animation_OnFrame(&this->skelAnime, 5.0f) ||
Animation_OnFrame(&this->skelAnime, 9.0f) || Animation_OnFrame(&this->skelAnime, 13.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DEKUHIME_TURN);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEKUHIME_TURN);
}
- } else if ((this->animIndex == EN_DNP_ANIM_GLARE_START) || (this->animIndex == EN_DNP_ANIM_TURN_AROUND)) {
+ } else if ((this->animIndex == DEKU_PRINCESS_ANIM_GLARE_START) ||
+ (this->animIndex == DEKU_PRINCESS_ANIM_TURN_AROUND)) {
if (Animation_OnFrame(&this->skelAnime, 1.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DEKUHIME_TURN);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEKUHIME_TURN);
}
- } else if (this->animIndex == EN_DNP_ANIM_GREETING) {
+ } else if (this->animIndex == DEKU_PRINCESS_ANIM_GREETING) {
if (Animation_OnFrame(&this->skelAnime, 7.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DEKUHIME_GREET);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEKUHIME_GREET);
}
if (Animation_OnFrame(&this->skelAnime, 22.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DEKUHIME_GREET2);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEKUHIME_GREET2);
}
- } else if (this->animIndex == EN_DNP_ANIM_BOW) {
+ } else if (this->animIndex == DEKU_PRINCESS_ANIM_BOW) {
if (Animation_OnFrame(&this->skelAnime, 9.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DEKUHIME_GREET);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEKUHIME_GREET);
}
if (Animation_OnFrame(&this->skelAnime, 18.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DEKUHIME_GREET2);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEKUHIME_GREET2);
}
- } else if ((this->animIndex == EN_DNP_ANIM_UNUSED_WALK) && (this->animIndex == EN_DNP_ANIM_WALK)) {
+ } else if ((this->animIndex == DEKU_PRINCESS_ANIM_UNUSED_WALK) && (this->animIndex == DEKU_PRINCESS_ANIM_WALK)) {
+ //! @bug: Impossible to reach, && should be an ||
if (Animation_OnFrame(&this->skelAnime, 7.0f) || Animation_OnFrame(&this->skelAnime, 15.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DEKUHIME_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEKUHIME_WALK);
}
- } else if (this->animIndex == EN_DNP_ANIM_JUMP) {
+ } else if (this->animIndex == DEKU_PRINCESS_ANIM_JUMP) {
if (Animation_OnFrame(&this->skelAnime, 17.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DEKUHIME_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEKUHIME_WALK);
}
- } else if (this->animIndex == EN_DNP_ANIM_BOUNCE_LOOP) {
+ } else if (this->animIndex == DEKU_PRINCESS_ANIM_BOUNCE_LOOP) {
if (Animation_OnFrame(&this->skelAnime, 3.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DEKUHIME_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEKUHIME_WALK);
}
}
@@ -171,14 +174,14 @@ s32 func_80B3CA20(EnDnp* this) {
}
s32 EnDnp_ChangeAnim(EnDnp* this, s32 animIndex) {
- s32 ret = false;
+ s32 didAnimChange = false;
- if (animIndex != this->animIndex) {
+ if (this->animIndex != animIndex) {
this->animIndex = animIndex;
- ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
+ didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
}
- return ret;
+ return didAnimChange;
}
void func_80B3CC80(EnDnp* this, PlayState* play) {
@@ -193,9 +196,9 @@ void func_80B3CC80(EnDnp* this, PlayState* play) {
void func_80B3CD1C(EnDnp* this) {
if ((this->unk_322 & 0x80) && (DECR(this->blinkTimer) == 0)) {
this->eyeIndex++;
- if (this->eyeIndex >= EN_DNP_EYE_MAX) {
+ if (this->eyeIndex >= DEKU_PRINCESS_EYE_MAX) {
this->blinkTimer = Rand_S16Offset(30, 30);
- this->eyeIndex = EN_DNP_EYE_OPEN;
+ this->eyeIndex = DEKU_PRINCESS_EYE_OPEN;
}
}
}
@@ -217,7 +220,8 @@ s32 func_80B3CDA4(EnDnp* this, PlayState* play) {
pitch = Math_Vec3f_Pitch(&sp3C, &sp30);
//! FAKE
- if (1) {};
+ if (1) {}
+
Math_SmoothStepToS(&this->unk_330, pitch, 3, 0x2AA8, 0x1);
return 1;
@@ -243,13 +247,14 @@ s32 func_80B3CEC0(EnDnp* this, PlayState* play) {
s32 func_80B3CF60(EnDnp* this, PlayState* play) {
s32 ret = false;
- if ((this->unk_322 & 7) && Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- SubS_UpdateFlags(&this->unk_322, 0, 7);
+ if (((this->unk_322 & SUBS_OFFER_MODE_MASK) != SUBS_OFFER_MODE_NONE) &&
+ Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ SubS_SetOfferMode(&this->unk_322, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
this->unk_322 |= 8;
this->actionFunc = func_80B3D3F8;
ret = true;
} else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_23_20) && Actor_HasParent(&this->actor, play)) {
- SubS_UpdateFlags(&this->unk_322, 0, 7);
+ SubS_SetOfferMode(&this->unk_322, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
this->unk_322 &= ~0x500;
this->actor.parent = NULL;
this->unk_32E = 0;
@@ -263,18 +268,18 @@ 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->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ this->cueId = 255;
}
- SubS_UpdateFlags(&this->unk_322, 0, 7);
+ SubS_SetOfferMode(&this->unk_322, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
this->actionFunc = func_80B3D11C;
ret = true;
} else if (this->unk_322 & 0x200) {
- this->actor.flags |= ACTOR_FLAG_1;
- SubS_UpdateFlags(&this->unk_322, 3, 7);
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
+ SubS_SetOfferMode(&this->unk_322, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_322 &= ~(0x200 | 0x10);
this->actionFunc = func_80B3D2D4;
}
@@ -283,52 +288,54 @@ s32 func_80B3D044(EnDnp* this, PlayState* play) {
}
void func_80B3D11C(EnDnp* this, PlayState* play) {
- static s32 sCsAnimations[] = {
- EN_DNP_ANIM_JUMP_KICK, EN_DNP_ANIM_CUTSCENE_IDLE, EN_DNP_ANIM_GREETING,
- EN_DNP_ANIM_THINK_START, EN_DNP_ANIM_WALK, EN_DNP_ANIM_ARMS_TOGETHER_START,
- EN_DNP_ANIM_LAUGH_START, EN_DNP_ANIM_TURN_AROUND, EN_DNP_ANIM_CUTSCENE_HURRY,
- EN_DNP_ANIM_ANGRY_START, EN_DNP_ANIM_JUMP, EN_DNP_ANIM_BOUNCE_START,
- EN_DNP_ANIM_GLARE_START, EN_DNP_ANIM_BOW,
+ static s32 sCsAnimIndex[] = {
+ DEKU_PRINCESS_ANIM_JUMP_KICK, DEKU_PRINCESS_ANIM_CUTSCENE_IDLE, DEKU_PRINCESS_ANIM_GREETING,
+ DEKU_PRINCESS_ANIM_THINK_START, DEKU_PRINCESS_ANIM_WALK, DEKU_PRINCESS_ANIM_ARMS_TOGETHER_START,
+ DEKU_PRINCESS_ANIM_LAUGH_START, DEKU_PRINCESS_ANIM_TURN_AROUND, DEKU_PRINCESS_ANIM_CUTSCENE_HURRY,
+ DEKU_PRINCESS_ANIM_ANGRY_START, DEKU_PRINCESS_ANIM_JUMP, DEKU_PRINCESS_ANIM_BOUNCE_START,
+ DEKU_PRINCESS_ANIM_GLARE_START, DEKU_PRINCESS_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 (this->animIndex == EN_DNP_ANIM_CUTSCENE_IDLE) {
+ 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, sCsAnimIndex[cueId]);
+ if (this->animIndex == DEKU_PRINCESS_ANIM_CUTSCENE_IDLE) {
this->unk_322 |= 8;
} else {
this->unk_322 &= ~8;
}
- if (this->animIndex == EN_DNP_ANIM_ANGRY_START) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_VO_DHVO04);
+ if (this->animIndex == DEKU_PRINCESS_ANIM_ANGRY_START) {
+ Actor_PlaySfx(&this->actor, NA_SE_VO_DHVO04);
}
- if (this->animIndex == EN_DNP_ANIM_GLARE_START) {
+ if (this->animIndex == DEKU_PRINCESS_ANIM_GLARE_START) {
this->unk_322 &= ~0x80;
- this->eyeIndex = EN_DNP_EYE_ANGRY;
+ this->eyeIndex = DEKU_PRINCESS_EYE_ANGRY;
this->blinkTimer = 0;
}
}
- this->unk_324 = val;
- 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)) &&
+ this->cueId = cueId;
+ if (((this->animIndex == DEKU_PRINCESS_ANIM_THINK_START) ||
+ (this->animIndex == DEKU_PRINCESS_ANIM_ARMS_TOGETHER_START) ||
+ (this->animIndex == DEKU_PRINCESS_ANIM_LAUGH_START) ||
+ (this->animIndex == DEKU_PRINCESS_ANIM_ANGRY_START) ||
+ (this->animIndex == DEKU_PRINCESS_ANIM_BOUNCE_START) ||
+ (this->animIndex == DEKU_PRINCESS_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);
}
}
@@ -354,14 +361,14 @@ void func_80B3D338(EnDnp* this, PlayState* play) {
} else {
this->actor.textId = 0x971;
player->actor.textId = this->actor.textId;
- func_800B8500(&this->actor, play, 9999.9f, 9999.9f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 9999.9f, 9999.9f, PLAYER_IA_MINUS1);
}
}
}
void func_80B3D3F8(EnDnp* this, PlayState* play) {
if (func_8010BF58(&this->actor, play, D_80B3DE58, NULL, &this->unk_328)) {
- SubS_UpdateFlags(&this->unk_322, 3, 7);
+ SubS_SetOfferMode(&this->unk_322, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_322 &= ~8;
this->actionFunc = func_80B3D2D4;
} else {
@@ -370,11 +377,11 @@ void func_80B3D3F8(EnDnp* this, PlayState* play) {
}
void func_80B3D47C(EnDnp* this, PlayState* play) {
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
Math_SmoothStepToF(&this->actor.scale.x, 0.0085f, 0.1f, 0.01f, 0.001f);
if ((s32)(this->actor.scale.x * 10000.0f) >= 85) {
- this->actor.flags |= ACTOR_FLAG_1;
- SubS_UpdateFlags(&this->unk_322, 3, 7);
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
+ SubS_SetOfferMode(&this->unk_322, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_322 &= ~0x10;
this->unk_322 |= 0x400;
this->actor.scale.x = 0.0085f;
@@ -385,11 +392,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);
}
}
@@ -399,32 +406,32 @@ void EnDnp_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 16.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &gDekuPrincessSkel, NULL, this->jointTable, this->morphTable,
DEKU_PRINCESS_LIMB_MAX);
- this->animIndex = EN_DNP_ANIM_NONE;
- EnDnp_ChangeAnim(this, EN_DNP_ANIM_IDLE);
+ this->animIndex = DEKU_PRINCESS_ANIM_NONE;
+ EnDnp_ChangeAnim(this, DEKU_PRINCESS_ANIM_IDLE);
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit);
this->unk_322 = 0;
- this->actor.targetMode = 0;
+ this->actor.targetMode = TARGET_MODE_0;
this->unk_322 |= (0x100 | 0x80 | 0x10);
this->actor.gravity = -1.0f;
- if (EN_DNP_GET_TYPE(&this->actor) == EN_DNP_TYPE_RELEASED_FROM_BOTTLE) {
- this->actor.flags &= ~ACTOR_FLAG_1;
- Actor_SetScale(&this->actor, 0.00085000007f);
- SubS_UpdateFlags(&this->unk_322, 0, 7);
+ if (DEKU_PRINCESS_GET_TYPE(&this->actor) == DEKU_PRINCESS_TYPE_RELEASED_FROM_BOTTLE) {
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ Actor_SetScale(&this->actor, 0.85f * 0.001f);
+ SubS_SetOfferMode(&this->unk_322, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
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) &&
+ } else if (((DEKU_PRINCESS_GET_TYPE(&this->actor) == DEKU_PRINCESS_TYPE_WOODFALL_TEMPLE) &&
!Inventory_HasItemInBottle(ITEM_DEKU_PRINCESS) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_23_20)) ||
- ((EN_DNP_GET_TYPE(&this->actor) == EN_DNP_TYPE_DEKU_KINGS_CHAMBER) &&
+ ((DEKU_PRINCESS_GET_TYPE(&this->actor) == DEKU_PRINCESS_TYPE_DEKU_KINGS_CHAMBER) &&
CHECK_WEEKEVENTREG(WEEKEVENTREG_23_20))) {
Actor_SetScale(&this->actor, 0.0085f);
- SubS_UpdateFlags(&this->unk_322, 3, 7);
+ SubS_SetOfferMode(&this->unk_322, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_322 |= 0x400;
if ((play->sceneId == SCENE_MITURIN) && CHECK_WEEKEVENTREG(WEEKEVENTREG_29_40)) {
this->unk_322 |= 0x20;
- EnDnp_ChangeAnim(this, EN_DNP_ANIM_HURRY);
+ EnDnp_ChangeAnim(this, DEKU_PRINCESS_ANIM_HURRY);
}
this->actionFunc = func_80B3D2D4;
} else {
@@ -455,13 +462,13 @@ 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)) {
- Actor_PickUp(&this->actor, play, GI_MAX, sp2C, sp28);
+ Actor_OfferGetItem(&this->actor, play, GI_MAX, sp2C, sp28);
}
- func_8013C964(&this->actor, play, sp2C, sp28, PLAYER_IA_NONE, this->unk_322 & 7);
+ SubS_Offer(&this->actor, play, sp2C, sp28, PLAYER_IA_NONE, this->unk_322 & SUBS_OFFER_MODE_MASK);
Actor_SetFocus(&this->actor, 30.0f);
func_80B3CC80(this, play);
}
@@ -541,7 +548,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..4bd0fe14c 100644
--- a/src/overlays/actors/ovl_En_Dnp/z_en_dnp.h
+++ b/src/overlays/actors/ovl_En_Dnp/z_en_dnp.h
@@ -8,12 +8,14 @@ struct EnDnp;
typedef void (*EnDnpActionFunc)(struct EnDnp*, PlayState*);
-#define EN_DNP_GET_TYPE(thisx) ((thisx)->params & 7)
+#define DEKU_PRINCESS_GET_TYPE(thisx) ((thisx)->params & 7)
+
+#define DEKU_PRINCESS_PARAMS(type) ((type) & 7)
typedef enum {
- /* 0x0 */ EN_DNP_TYPE_WOODFALL_TEMPLE,
- /* 0x1 */ EN_DNP_TYPE_RELEASED_FROM_BOTTLE,
- /* 0x2 */ EN_DNP_TYPE_DEKU_KINGS_CHAMBER,
+ /* 0 */ DEKU_PRINCESS_TYPE_WOODFALL_TEMPLE,
+ /* 1 */ DEKU_PRINCESS_TYPE_RELEASED_FROM_BOTTLE,
+ /* 2 */ DEKU_PRINCESS_TYPE_DEKU_KINGS_CHAMBER
} EnDnpType;
typedef struct EnDnp {
@@ -26,7 +28,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 4b1087311..cd25a835b 100644
--- a/src/overlays/actors/ovl_En_Dnq/z_en_dnq.c
+++ b/src/overlays/actors/ovl_En_Dnq/z_en_dnq.c
@@ -9,7 +9,7 @@
#include "z_en_dnq.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnDnq*)thisx)
@@ -59,27 +59,52 @@ static ColliderCylinderInit sCylinderInit = {
static CollisionCheckInfoInit2 sColChkInfoInit = { 1, 0, 0, 0, MASS_IMMOVABLE };
-static AnimationInfoS sAnimationInfo[] = {
- { &gDekuKingIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &gDekuKingIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuKingSurpriseAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &gDekuKingJumpedOnStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gDekuKingJumpedOnLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuKingJumpedOnEndAnim, 0.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gDekuKingJumpedOnEndAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &gDekuKingLyingDownTwitchAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuKingWailLoopAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &gDekuKingFootStampStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &gDekuKingFootStampLoopAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &gDekuKingWailStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &gDekuKingMarchAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gDekuKingSpinScepterAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gDekuKingIntimidateAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuKingPointScepterAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuKingJumpAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuKingLaughAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &gDekuKingFootStampLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gDekuKingLaughAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
+typedef enum {
+ /* -1 */ DEKU_KING_ANIM_NONE = -1,
+ /* 0 */ DEKU_KING_ANIM_IDLE,
+ /* 1 */ DEKU_KING_ANIM_IDLE_MORPH,
+ /* 2 */ DEKU_KING_ANIM_SURPRISE,
+ /* 3 */ DEKU_KING_ANIM_JUMPED_ON_START,
+ /* 4 */ DEKU_KING_ANIM_JUMPED_ON_LOOP,
+ /* 5 */ DEKU_KING_ANIM_JUMPED_ON_END,
+ /* 6 */ DEKU_KING_ANIM_JUMPED_ON_END_MORPH,
+ /* 7 */ DEKU_KING_ANIM_LYING_DOWN_TWITCH,
+ /* 8 */ DEKU_KING_ANIM_WAIL,
+ /* 9 */ DEKU_KING_ANIM_FOOT_STAMP_START,
+ /* 10 */ DEKU_KING_ANIM_FOOT_STAMP_ONCE,
+ /* 11 */ DEKU_KING_ANIM_WAIL_START,
+ /* 12 */ DEKU_KING_ANIM_MARCH,
+ /* 13 */ DEKU_KING_ANIM_SPIN_SCEPTER,
+ /* 14 */ DEKU_KING_ANIM_INTIMIDATE,
+ /* 15 */ DEKU_KING_ANIM_POINT_SCEPTER,
+ /* 16 */ DEKU_KING_ANIM_JUMP,
+ /* 17 */ DEKU_KING_ANIM_LAUGH_ONCE,
+ /* 18 */ DEKU_KING_ANIM_FOOT_STAMP_LOOP,
+ /* 19 */ DEKU_KING_ANIM_LAUGH_LOOP,
+ /* 36 */ ENDNQ_ANIM_MAX
+} EnDnkAnimation;
+
+static AnimationInfoS sAnimationInfo[ENDNQ_ANIM_MAX] = {
+ { &gDekuKingIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DEKU_KING_ANIM_IDLE
+ { &gDekuKingIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // DEKU_KING_ANIM_IDLE_MORPH
+ { &gDekuKingSurpriseAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // DEKU_KING_ANIM_SURPRISE
+ { &gDekuKingJumpedOnStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DEKU_KING_ANIM_JUMPED_ON_START
+ { &gDekuKingJumpedOnLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // DEKU_KING_ANIM_JUMPED_ON_LOOP
+ { &gDekuKingJumpedOnEndAnim, 0.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DEKU_KING_ANIM_JUMPED_ON_END
+ { &gDekuKingJumpedOnEndAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // DEKU_KING_ANIM_JUMPED_ON_END_MORPH
+ { &gDekuKingLyingDownTwitchAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // DEKU_KING_ANIM_LYING_DOWN_TWITCH
+ { &gDekuKingWailLoopAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // DEKU_KING_ANIM_WAIL
+ { &gDekuKingFootStampStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // DEKU_KING_ANIM_FOOT_STAMP_START
+ { &gDekuKingFootStampLoopAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // DEKU_KING_ANIM_FOOT_STAMP_ONCE
+ { &gDekuKingWailStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // DEKU_KING_ANIM_WAIL_START
+ { &gDekuKingMarchAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DEKU_KING_ANIM_MARCH
+ { &gDekuKingSpinScepterAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DEKU_KING_ANIM_SPIN_SCEPTER
+ { &gDekuKingIntimidateAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // DEKU_KING_ANIM_INTIMIDATE
+ { &gDekuKingPointScepterAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // DEKU_KING_ANIM_POINT_SCEPTER
+ { &gDekuKingJumpAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // DEKU_KING_ANIM_JUMP
+ { &gDekuKingLaughAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // DEKU_KING_ANIM_LAUGH_ONCE
+ { &gDekuKingFootStampLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // DEKU_KING_ANIM_FOOT_STAMP_LOOP
+ { &gDekuKingLaughAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // DEKU_KING_ANIM_LAUGH_LOOP
};
s32 EnDnq_ValidatePictograph(PlayState* play, Actor* thisx) {
@@ -87,30 +112,30 @@ s32 EnDnq_ValidatePictograph(PlayState* play, Actor* thisx) {
480.0f, 0x38E3);
}
-s32 func_80A5257C(EnDnq* this, s32 arg1) {
- s32 phi_v1 = false;
- s32 ret = false;
+s32 EnDnq_ChangeAnim(EnDnq* this, s32 animIndex) {
+ s32 changeAnim = false;
+ s32 didAnimChange = false;
- if ((arg1 == 0) || (arg1 == 1)) {
- switch (this->unk_398) {
- case 0:
- case 1:
+ if ((animIndex == DEKU_KING_ANIM_IDLE) || (animIndex == DEKU_KING_ANIM_IDLE_MORPH)) {
+ switch (this->animIndex) {
+ case DEKU_KING_ANIM_IDLE:
+ case DEKU_KING_ANIM_IDLE_MORPH:
break;
default:
- phi_v1 = true;
+ changeAnim = true;
break;
}
- } else if (arg1 != this->unk_398) {
- phi_v1 = true;
+ } else if (this->animIndex != animIndex) {
+ changeAnim = true;
}
- if (phi_v1) {
- this->unk_398 = arg1;
- ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, arg1);
+ if (changeAnim) {
+ this->animIndex = animIndex;
+ didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
}
- return ret;
+ return didAnimChange;
}
void func_80A52604(EnDnq* this, PlayState* play) {
@@ -121,20 +146,20 @@ 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->picto.actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ this->cueId = 255;
this->unk_37C |= 0x20;
}
- SubS_UpdateFlags(&this->unk_37C, 0, 7);
+ SubS_SetOfferMode(&this->unk_37C, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
ret = true;
} else {
if (this->unk_37C & 0x20) {
- this->picto.actor.flags |= ACTOR_FLAG_1;
- this->unk_1DC = 0xFF;
+ this->picto.actor.flags |= ACTOR_FLAG_TARGETABLE;
+ this->cueId = 255;
this->unk_37C &= ~0x20;
- SubS_UpdateFlags(&this->unk_37C, 3, 7);
+ SubS_SetOfferMode(&this->unk_37C, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
}
}
@@ -143,45 +168,48 @@ s32 func_80A52648(EnDnq* this, PlayState* play) {
s32 func_80A526F8(EnDnq* this) {
if (this->unk_386 == 0) {
- func_80A5257C(this, 8);
+ EnDnq_ChangeAnim(this, DEKU_KING_ANIM_WAIL);
this->unk_38C = ((s32)(Rand_ZeroOne() * 100.0f) % 4) + 3;
this->unk_388 = 0;
this->unk_386 = 1;
} else if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- switch (this->unk_398) {
- case 8:
+ switch (this->animIndex) {
+ case DEKU_KING_ANIM_WAIL:
if (DECR(this->unk_38C) == 0) {
- func_80A5257C(this, 9);
+ EnDnq_ChangeAnim(this, DEKU_KING_ANIM_FOOT_STAMP_START);
}
break;
- case 9:
- func_80A5257C(this, 10);
+ case DEKU_KING_ANIM_FOOT_STAMP_START:
+ EnDnq_ChangeAnim(this, DEKU_KING_ANIM_FOOT_STAMP_ONCE);
this->unk_38C = ((s32)(Rand_ZeroOne() * 100.0f) % 3) + 2;
break;
- case 10:
+ case DEKU_KING_ANIM_FOOT_STAMP_ONCE:
if (DECR(this->unk_38C) == 0) {
this->unk_388++;
if ((this->unk_38C != 0) || (this->unk_388 < 2)) {
- func_80A5257C(this, 11);
+ EnDnq_ChangeAnim(this, DEKU_KING_ANIM_WAIL_START);
} else {
- func_80A5257C(this, 17);
+ EnDnq_ChangeAnim(this, DEKU_KING_ANIM_LAUGH_ONCE);
this->unk_38C = 4;
}
}
break;
- case 11:
- func_80A5257C(this, 8);
+ case DEKU_KING_ANIM_WAIL_START:
+ EnDnq_ChangeAnim(this, DEKU_KING_ANIM_WAIL);
this->unk_38C = ((s32)(Rand_ZeroOne() * 100.0f) % 4) + 3;
break;
- case 17:
+ case DEKU_KING_ANIM_LAUGH_ONCE:
if (DECR(this->unk_38C) == 0) {
this->unk_386 = 0;
}
break;
+
+ default:
+ break;
}
if (this->unk_386 != 0) {
@@ -197,7 +225,7 @@ s32 func_80A52944(EnDnq* this) {
s16 phi_v1 = 0;
if (this->unk_386 == 0) {
- func_80A5257C(this, 12);
+ EnDnq_ChangeAnim(this, DEKU_KING_ANIM_MARCH);
this->unk_38C = 1;
this->picto.actor.shape.rot.y = this->picto.actor.world.rot.y;
this->unk_386 = 1;
@@ -206,7 +234,7 @@ s32 func_80A52944(EnDnq* this) {
} else if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
this->unk_386++;
if (this->unk_386 >= 6) {
- func_80A5257C(this, 12);
+ EnDnq_ChangeAnim(this, DEKU_KING_ANIM_MARCH);
this->unk_386 = 1;
phi_v1 = this->unk_38C * 0x2000;
} else if (this->unk_386 <= 3) {
@@ -214,7 +242,7 @@ s32 func_80A52944(EnDnq* this) {
this->skelAnime.curFrame = 0.0f;
phi_v1 = this->unk_38C * 0x2000;
} else {
- func_80A5257C(this, 13);
+ EnDnq_ChangeAnim(this, DEKU_KING_ANIM_SPIN_SCEPTER);
this->skelAnime.curFrame = 0.0f;
}
this->picto.actor.shape.rot.y = this->picto.actor.world.rot.y;
@@ -227,7 +255,8 @@ s32 func_80A52944(EnDnq* this) {
s32 func_80A52A78(EnDnq* this, PlayState* play) {
static s32 D_80A535DC[] = {
- 17, 12, 14, 13, 16,
+ DEKU_KING_ANIM_LAUGH_ONCE, DEKU_KING_ANIM_MARCH, DEKU_KING_ANIM_INTIMIDATE,
+ DEKU_KING_ANIM_SPIN_SCEPTER, DEKU_KING_ANIM_JUMP,
};
if (this->unk_38A == 0) {
@@ -247,7 +276,7 @@ s32 func_80A52A78(EnDnq* this, PlayState* play) {
this->unk_388 += 3;
this->unk_388 %= 5;
}
- func_80A5257C(this, D_80A535DC[this->unk_388]);
+ EnDnq_ChangeAnim(this, D_80A535DC[this->unk_388]);
this->skelAnime.curFrame = 0.0f;
}
@@ -257,36 +286,39 @@ s32 func_80A52A78(EnDnq* this, PlayState* play) {
s32 func_80A52B68(EnDnq* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- u16 temp = play->msgCtx.currentTextId;
+ u16 textId = play->msgCtx.currentTextId;
if ((player->stateFlags1 & PLAYER_STATE1_40) && (player->talkActor == &this->picto.actor)) {
- switch (temp) {
+ switch (textId) {
case 0x89B:
- func_80A5257C(this, 18);
+ EnDnq_ChangeAnim(this, DEKU_KING_ANIM_FOOT_STAMP_LOOP);
break;
case 0x89E:
- func_80A5257C(this, 19);
+ EnDnq_ChangeAnim(this, DEKU_KING_ANIM_LAUGH_LOOP);
break;
case 0x898:
case 0x89F:
- func_80A5257C(this, 16);
+ EnDnq_ChangeAnim(this, DEKU_KING_ANIM_JUMP);
break;
case 0x899:
case 0x89D:
- func_80A5257C(this, 14);
+ EnDnq_ChangeAnim(this, DEKU_KING_ANIM_INTIMIDATE);
break;
case 0x89A:
case 0x89C:
- func_80A5257C(this, 15);
+ EnDnq_ChangeAnim(this, DEKU_KING_ANIM_POINT_SCEPTER);
+ break;
+
+ default:
break;
}
this->unk_39C = 1;
} else if (this->unk_39C != 0) {
- func_80A5257C(this, 0);
+ EnDnq_ChangeAnim(this, DEKU_KING_ANIM_IDLE);
this->unk_39C = 0;
this->unk_37E = 0;
this->unk_386 = 0;
@@ -323,8 +355,9 @@ s32* func_80A52CF8(EnDnq* this, PlayState* play) {
s32 func_80A52D44(EnDnq* this, PlayState* play) {
s32 ret = false;
- if ((this->unk_37C & 7) && Actor_ProcessTalkRequest(&this->picto.actor, &play->state)) {
- SubS_UpdateFlags(&this->unk_37C, 0, 7);
+ if (((this->unk_37C & SUBS_OFFER_MODE_MASK) != SUBS_OFFER_MODE_NONE) &&
+ Actor_ProcessTalkRequest(&this->picto.actor, &play->state)) {
+ SubS_SetOfferMode(&this->unk_37C, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
this->unk_380 = func_80A52CF8(this, play);
this->actionFunc = func_80A52FB8;
ret = true;
@@ -338,15 +371,15 @@ void func_80A52DC8(EnDnq* this, PlayState* play) {
s16 yaw = this->picto.actor.yawTowardsPlayer - this->picto.actor.world.rot.y;
if (yaw <= 0x3800) {
- SubS_UpdateFlags(&this->unk_37C, 3, 7);
+ SubS_SetOfferMode(&this->unk_37C, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
} else {
- SubS_UpdateFlags(&this->unk_37C, 0, 7);
+ SubS_SetOfferMode(&this->unk_37C, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
}
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;
@@ -379,7 +412,7 @@ void func_80A52FB8(EnDnq* this, PlayState* play) {
s16 sp2E = this->picto.actor.yawTowardsPlayer;
if (func_8010BF58(&this->picto.actor, play, this->unk_380, NULL, &this->unk_1E0)) {
- SubS_UpdateFlags(&this->unk_37C, 3, 7);
+ SubS_SetOfferMode(&this->unk_37C, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_386 = 0;
this->actionFunc = func_80A52DC8;
} else {
@@ -387,31 +420,34 @@ void func_80A52FB8(EnDnq* this, PlayState* play) {
}
}
-void func_80A53038(EnDnq* this, PlayState* play) {
- static s32 D_80A535FC[] = {
- 0, 1, 2, 3, 5, 6,
+void EnDnq_HandleCutscene(EnDnq* this, PlayState* play) {
+ static s32 sCsAnimIndex[] = {
+ DEKU_KING_ANIM_IDLE, DEKU_KING_ANIM_IDLE_MORPH,
+ DEKU_KING_ANIM_SURPRISE, DEKU_KING_ANIM_JUMPED_ON_START,
+ DEKU_KING_ANIM_JUMPED_ON_END, DEKU_KING_ANIM_JUMPED_ON_END_MORPH,
};
- 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) {
+ EnDnq_ChangeAnim(this, sCsAnimIndex[cueId]);
+ this->cueId = cueId;
}
- if ((this->unk_398 == 4) && Animation_OnFrame(&this->skelAnime, 2.0f)) {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_KINGNUTS_DAMAGE);
+ if ((this->animIndex == DEKU_KING_ANIM_JUMPED_ON_LOOP) && Animation_OnFrame(&this->skelAnime, 2.0f)) {
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_KINGNUTS_DAMAGE);
}
- if (((this->unk_398 == 3) || (this->unk_398 == 6)) &&
+ if (((this->animIndex == DEKU_KING_ANIM_JUMPED_ON_START) ||
+ (this->animIndex == DEKU_KING_ANIM_JUMPED_ON_END_MORPH)) &&
Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- func_80A5257C(this, this->unk_398 + 1);
+ EnDnq_ChangeAnim(this, this->animIndex + 1);
}
- Cutscene_ActorTranslateAndYaw(&this->picto.actor, play, temp_v0);
+ Cutscene_ActorTranslateAndYaw(&this->picto.actor, play, cueChannel);
}
}
@@ -421,15 +457,15 @@ void EnDnq_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->picto.actor.shape, 0.0f, NULL, 14.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &gDekuKingSkel, NULL, this->jointTable, this->morphTable,
DEKU_KING_LIMB_MAX);
- this->unk_398 = -1;
- func_80A5257C(this, 0);
+ this->animIndex = DEKU_KING_ANIM_NONE;
+ EnDnq_ChangeAnim(this, DEKU_KING_ANIM_IDLE);
Collider_InitAndSetCylinder(play, &this->collider, &this->picto.actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->picto.actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit);
Actor_SetScale(&this->picto.actor, 0.02f);
- this->picto.actor.targetMode = 1;
+ this->picto.actor.targetMode = TARGET_MODE_1;
this->unk_386 = 0;
this->unk_37C = 0;
- SubS_UpdateFlags(&this->unk_37C, 3, 7);
+ SubS_SetOfferMode(&this->unk_37C, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_09_80)) {
this->unk_3A4 = 1;
} else {
@@ -449,17 +485,17 @@ void EnDnq_Update(Actor* thisx, PlayState* play) {
EnDnq* this = THIS;
if (!func_80A52D44(this, play) && func_80A52648(this, play)) {
- func_80A53038(this, play);
+ EnDnq_HandleCutscene(this, play);
SkelAnime_Update(&this->skelAnime);
} else {
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,
- PLAYER_IA_NONE, this->unk_37C & 7);
+ SubS_Offer(&this->picto.actor, play, this->unk_390, fabsf(this->picto.actor.playerHeightRel) + 1.0f,
+ PLAYER_IA_NONE, this->unk_37C & SUBS_OFFER_MODE_MASK);
this->picto.actor.xzDistToPlayer = this->unk_394;
Actor_SetFocus(&this->picto.actor, 46.0f);
func_80A52604(this, play);
@@ -469,7 +505,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..ddb6616a2 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];
@@ -29,7 +29,7 @@ typedef struct EnDnq {
/* 0x38C */ s16 unk_38C;
/* 0x390 */ f32 unk_390;
/* 0x394 */ f32 unk_394;
- /* 0x398 */ s32 unk_398;
+ /* 0x398 */ s32 animIndex;
/* 0x39C */ s32 unk_39C;
/* 0x3A0 */ UNK_TYPE1 unk_3A0[0x4];
/* 0x3A4 */ s32 unk_3A4;
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 a8a94d9a4..723ee895f 100644
--- a/src/overlays/actors/ovl_En_Dns/z_en_dns.c
+++ b/src/overlays/actors/ovl_En_Dns/z_en_dns.c
@@ -6,7 +6,7 @@
#include "z_en_dns.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnDns*)thisx)
@@ -19,20 +19,6 @@ void func_8092D330(EnDns* this, PlayState* play);
void EnDns_DoNothing(EnDns* this, PlayState* play);
void func_8092D4D8(EnDns* this, PlayState* play);
-typedef enum {
- /* 0 */ EN_DNS_ANIM_IDLE_1,
- /* 1 */ EN_DNS_ANIM_IDLE_2,
- /* 2 */ EN_DNS_ANIM_WALK_1,
- /* 3 */ EN_DNS_ANIM_WALK_2,
- /* 4 */ EN_DNS_ANIM_SURPRISE_START,
- /* 5 */ EN_DNS_ANIM_SURPRISE_LOOP,
- /* 6 */ EN_DNS_ANIM_RUN_START,
- /* 7 */ EN_DNS_ANIM_RUN_LOOP,
- /* 8 */ EN_DNS_ANIM_DANCE,
- /* 9 */ EN_DNS_ANIM_FLIP,
- /* 10 */ EN_DNS_ANIM_MAX,
-} EnDnsAnimation;
-
static s32 D_8092DCB0[] = {
0x00172000, 0x050E082F, 0x0C100E08, 0x200C1000, 0x00172000, 0x050E0830, 0x0C100E08, 0x210C1000,
0x00172000, 0x050E0831, 0x0C100E08, 0x220C1000, 0x00172000, 0x050E0832, 0x0C100E08, 0x230C1000,
@@ -73,60 +59,75 @@ static ColliderCylinderInit sCylinderInit = {
static CollisionCheckInfoInit2 sColChkInfoInit = { 1, 0, 0, 0, MASS_IMMOVABLE };
-static AnimationInfoS sAnimationInfo[] = {
- { &gKingsChamberDekuGuardIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &gKingsChamberDekuGuardIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gKingsChamberDekuGuardWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &gKingsChamberDekuGuardWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gKingsChamberDekuGuardSurpriseStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gKingsChamberDekuGuardSurpriseLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &gKingsChamberDekuGuardRunStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gKingsChamberDekuGuardRunLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &gKingsChamberDekuGuardDanceAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gKingsChamberDekuGuardFlipAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+typedef enum {
+ /* -1 */ EN_DNS_ANIM_NONE = -1,
+ /* 0 */ EN_DNS_ANIM_IDLE,
+ /* 1 */ EN_DNS_ANIM_IDLE_MORPH,
+ /* 2 */ EN_DNS_ANIM_WALK,
+ /* 3 */ EN_DNS_ANIM_WALK_MORPH,
+ /* 4 */ EN_DNS_ANIM_SURPRISE_START,
+ /* 5 */ EN_DNS_ANIM_SURPRISE_LOOP,
+ /* 6 */ EN_DNS_ANIM_RUN_START,
+ /* 7 */ EN_DNS_ANIM_RUN_LOOP,
+ /* 8 */ EN_DNS_ANIM_DANCE,
+ /* 9 */ EN_DNS_ANIM_FLIP,
+ /* 10 */ EN_DNS_ANIM_MAX
+} EnDnsAnimation;
+
+static AnimationInfoS sAnimationInfo[EN_DNS_ANIM_MAX] = {
+ { &gKingsChamberDekuGuardIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // EN_DNS_ANIM_IDLE
+ { &gKingsChamberDekuGuardIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // EN_DNS_ANIM_IDLE_MORPH
+ { &gKingsChamberDekuGuardWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // EN_DNS_ANIM_WALK
+ { &gKingsChamberDekuGuardWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // EN_DNS_ANIM_WALK_MORPH
+ { &gKingsChamberDekuGuardSurpriseStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // EN_DNS_ANIM_SURPRISE_START
+ { &gKingsChamberDekuGuardSurpriseLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // EN_DNS_ANIM_SURPRISE_LOOP
+ { &gKingsChamberDekuGuardRunStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // EN_DNS_ANIM_RUN_START
+ { &gKingsChamberDekuGuardRunLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // EN_DNS_ANIM_RUN_LOOP
+ { &gKingsChamberDekuGuardDanceAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // EN_DNS_ANIM_DANCE
+ { &gKingsChamberDekuGuardFlipAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // EN_DNS_ANIM_FLIP
};
void func_8092C5C0(EnDns* this) {
s32 pad;
- if (((this->animIndex == EN_DNS_ANIM_WALK_1) || (this->animIndex == EN_DNS_ANIM_WALK_2) ||
+ if (((this->animIndex == EN_DNS_ANIM_WALK) || (this->animIndex == EN_DNS_ANIM_WALK_MORPH) ||
(this->animIndex == EN_DNS_ANIM_RUN_START) || (this->animIndex == EN_DNS_ANIM_RUN_LOOP)) &&
(Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 3.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_WALK);
}
}
-s32 func_8092C63C(EnDns* this, s32 arg1) {
- s32 phi_v1 = false;
- s32 ret = false;
+s32 EnDns_ChangeAnim(EnDns* this, s32 animIndex) {
+ s32 changeAnim = false;
+ s32 didAnimChange = false;
- switch (arg1) {
- case EN_DNS_ANIM_IDLE_1:
- case EN_DNS_ANIM_IDLE_2:
- if ((this->animIndex != EN_DNS_ANIM_IDLE_1) && (this->animIndex != EN_DNS_ANIM_IDLE_2)) {
- phi_v1 = true;
+ switch (animIndex) {
+ case EN_DNS_ANIM_IDLE:
+ case EN_DNS_ANIM_IDLE_MORPH:
+ if ((this->animIndex != EN_DNS_ANIM_IDLE) && (this->animIndex != EN_DNS_ANIM_IDLE_MORPH)) {
+ changeAnim = true;
}
break;
- case EN_DNS_ANIM_WALK_1:
- case EN_DNS_ANIM_WALK_2:
- if ((this->animIndex != EN_DNS_ANIM_WALK_1) && (this->animIndex != EN_DNS_ANIM_WALK_2)) {
- phi_v1 = true;
+ case EN_DNS_ANIM_WALK:
+ case EN_DNS_ANIM_WALK_MORPH:
+ if ((this->animIndex != EN_DNS_ANIM_WALK) && (this->animIndex != EN_DNS_ANIM_WALK_MORPH)) {
+ changeAnim = true;
}
break;
default:
- if (this->animIndex != arg1) {
- phi_v1 = true;
+ if (this->animIndex != animIndex) {
+ changeAnim = true;
}
}
- if (phi_v1) {
- this->animIndex = arg1;
- ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, arg1);
+ if (changeAnim) {
+ this->animIndex = animIndex;
+ didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
}
- return ret;
+ return didAnimChange;
}
void func_8092C6FC(EnDns* this, PlayState* play) {
@@ -200,48 +201,49 @@ s32* func_8092C9BC(EnDns* this, PlayState* play) {
case ENDNS_GET_7_3:
return &D_8092DCB0[12];
- }
- return 0;
+ default:
+ return NULL;
+ }
}
-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;
+ default:
+ return 0;
+ }
}
s32 func_8092CAD0(EnDns* this, PlayState* play) {
s32 ret = false;
- if (this->unk_2C6 & 7) {
- if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- SubS_UpdateFlags(&this->unk_2C6, 0, 7);
- this->unk_2C6 &= ~0x10;
- if (ENDNS_GET_4000(&this->actor)) {
- this->unk_2F0 = 0.0f;
- if (this->unk_2D2 != 0) {
- this->unk_2F0 = this->skelAnime.curFrame;
- func_8092C63C(this, EN_DNS_ANIM_WALK_1);
- }
- this->unk_2DA = this->actor.world.rot.y;
+ if (((this->unk_2C6 & SUBS_OFFER_MODE_MASK) != SUBS_OFFER_MODE_NONE) &&
+ Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ SubS_SetOfferMode(&this->unk_2C6, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
+ this->unk_2C6 &= ~0x10;
+ if (ENDNS_GET_4000(&this->actor)) {
+ this->animCurFrame = 0.0f;
+ if (this->unk_2D2 != 0) {
+ this->animCurFrame = this->skelAnime.curFrame;
+ EnDns_ChangeAnim(this, EN_DNS_ANIM_WALK);
}
- this->unk_1E0 = func_8092C9BC(this, play);
- this->actionFunc = func_8092D4D8;
- ret = true;
+ this->unk_2DA = this->actor.world.rot.y;
}
+ this->unk_1E0 = func_8092C9BC(this, play);
+ this->actionFunc = func_8092D4D8;
+ ret = true;
}
return ret;
}
@@ -249,18 +251,18 @@ 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->actor.flags &= ~ACTOR_FLAG_1;
- SubS_UpdateFlags(&this->unk_2C6, 0, 7);
+ this->cueType = EnDns_GetCueType(this);
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ SubS_SetOfferMode(&this->unk_2C6, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
this->unk_2C6 |= 0x80;
- this->unk_1D8 = 0xFF;
+ this->cueId = 255;
}
phi_v1 = 1;
} else if (this->unk_2C6 & 0x80) {
- this->actor.flags |= ACTOR_FLAG_1;
- SubS_UpdateFlags(&this->unk_2C6, 3, 7);
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
+ SubS_SetOfferMode(&this->unk_2C6, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_2C6 &= ~0x80;
}
return phi_v1;
@@ -272,7 +274,8 @@ s32 func_8092CC68(PlayState* play) {
s32 ret = false;
s16 bgId;
- if (!Play_InCsMode(play) && (player->actor.bgCheckFlags & 1) && (player->transformation != PLAYER_FORM_DEKU)) {
+ if (!Play_InCsMode(play) && (player->actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
+ (player->transformation != PLAYER_FORM_DEKU)) {
bgId = player->actor.floorBgId;
if (SurfaceType_GetSceneExitIndex(&play->colCtx, player->actor.floorPoly, bgId) != 4) {
ret = true;
@@ -305,17 +308,17 @@ s32 func_8092CCEC(EnDns* this, PlayState* play) {
s32 func_8092CE38(EnDns* this) {
static s32 D_8092DE00[] = { EN_DNS_ANIM_DANCE, EN_DNS_ANIM_DANCE, EN_DNS_ANIM_FLIP };
- s16 frame;
+ s16 rotVelocity;
s32 pad;
Vec3f sp2C;
s32 ret = false;
if ((this->unk_2C6 & 0x200) || Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- func_8092C63C(this, D_8092DE00[this->unk_2D2]);
+ EnDns_ChangeAnim(this, D_8092DE00[this->unk_2D2]);
this->unk_2C6 &= ~0x200;
this->skelAnime.curFrame = 0.0f;
if (this->unk_2D2 == 2) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_JUMP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_JUMP);
}
this->unk_2D2++;
if (this->unk_2D2 >= 3) {
@@ -328,18 +331,18 @@ s32 func_8092CE38(EnDns* this) {
this->actor.world.rot.y = BINANG_ROT180(this->actor.world.rot.y);
this->unk_2E4 = 0.0f;
this->actor.shape.rot.y = this->actor.world.rot.y;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_JUMP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_JUMP);
} else if (this->skelAnime.curFrame < 13.0f) {
- frame = this->skelAnime.curFrame;
+ rotVelocity = this->skelAnime.curFrame;
this->actor.shape.rot.y = this->actor.world.rot.y;
- frame *= 2520;
- this->actor.shape.rot.y += frame;
+ rotVelocity *= 0x9D8;
+ this->actor.shape.rot.y += rotVelocity;
this->unk_2E4 -= -(40.0f / 13.0f);
}
} else {
if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 6.0f) ||
Animation_OnFrame(&this->skelAnime, 13.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_WALK);
}
if (this->skelAnime.curFrame > 7.0f) {
@@ -376,7 +379,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);
@@ -400,15 +403,15 @@ void func_8092D1B8(EnDns* this, PlayState* play) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_23_20) && !CHECK_EVENTINF(EVENTINF_15) && func_8092CC68(play)) {
player->stateFlags1 |= PLAYER_STATE1_20;
this->unk_2C6 |= 0x100;
- SubS_UpdateFlags(&this->unk_2C6, 4, 7);
- play_sound(NA_SE_SY_FOUND);
+ SubS_SetOfferMode(&this->unk_2C6, SUBS_OFFER_MODE_AUTO, SUBS_OFFER_MODE_MASK);
+ Audio_PlaySfx(NA_SE_SY_FOUND);
SET_EVENTINF(EVENTINF_15);
this->unk_2F4 = func_8092CCEC;
- func_8092C63C(this, EN_DNS_ANIM_WALK_1);
+ EnDns_ChangeAnim(this, EN_DNS_ANIM_WALK);
this->actionFunc = EnDns_DoNothing;
} else if (CHECK_EVENTINF(EVENTINF_16)) {
func_8092CCEC(this, play);
- func_8092C63C(this, EN_DNS_ANIM_WALK_1);
+ EnDns_ChangeAnim(this, EN_DNS_ANIM_WALK);
this->actionFunc = func_8092D330;
}
Math_ApproachS(&this->actor.shape.rot.y, sp22, 3, 0x2AA8);
@@ -450,16 +453,16 @@ void func_8092D4D8(EnDns* this, PlayState* play) {
if (ENDNS_GET_4000(&this->actor) && (this->unk_2D2 == 0)) {
if (func_8092CE38(this)) {
- func_8092C63C(this, EN_DNS_ANIM_WALK_1);
+ EnDns_ChangeAnim(this, EN_DNS_ANIM_WALK);
}
} else if (func_8010BF58(&this->actor, play, this->unk_1E0, this->unk_2F4, &this->unk_1DC)) {
- SubS_UpdateFlags(&this->unk_2C6, 3, 7);
+ SubS_SetOfferMode(&this->unk_2C6, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_2F4 = NULL;
if (ENDNS_GET_4000(&this->actor)) {
if (!CHECK_EVENTINF(EVENTINF_15)) {
- this->skelAnime.curFrame = this->unk_2F0;
+ this->skelAnime.curFrame = this->animCurFrame;
this->actor.world.rot.y = this->unk_2DA;
- func_8092C63C(this, EN_DNS_ANIM_DANCE);
+ EnDns_ChangeAnim(this, EN_DNS_ANIM_DANCE);
}
this->unk_2CC = 0;
this->unk_2CE = 0;
@@ -471,30 +474,30 @@ void func_8092D4D8(EnDns* this, PlayState* play) {
}
}
-void func_8092D5E8(EnDns* this, PlayState* play) {
- static s32 D_8092DE0C[] = {
- EN_DNS_ANIM_IDLE_1,
- EN_DNS_ANIM_IDLE_1,
+void EnDns_HandleCutscene(EnDns* this, PlayState* play) {
+ static s32 sCsAnimIndex[] = {
+ EN_DNS_ANIM_IDLE,
+ EN_DNS_ANIM_IDLE,
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) {
+ EnDns_ChangeAnim(this, sCsAnimIndex[cueId]);
+ this->cueId = cueId;
}
if (((this->animIndex == EN_DNS_ANIM_SURPRISE_START) || (this->animIndex == EN_DNS_ANIM_RUN_START)) &&
Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- func_8092C63C(this, this->animIndex + 1);
+ EnDns_ChangeAnim(this, this->animIndex + 1);
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, temp_v0);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
}
@@ -509,16 +512,16 @@ void EnDns_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, NULL, 18.0f);
SkelAnime_Init(play, &this->skelAnime, &gKingsChamberDekuGuardSkel, NULL, this->jointTable, this->morphTable,
KINGS_CHAMBER_DEKU_GUARD_LIMB_MAX);
- this->animIndex = -1;
- func_8092C63C(this, EN_DNS_ANIM_WALK_1);
+ this->animIndex = EN_DNS_ANIM_NONE;
+ EnDns_ChangeAnim(this, EN_DNS_ANIM_WALK);
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit);
Actor_SetScale(&this->actor, 0.01f);
- this->actor.targetMode = 0;
+ this->actor.targetMode = TARGET_MODE_0;
this->actor.gravity = -0.8f;
this->unk_2D2 = 0;
this->unk_2C6 = 0;
- SubS_UpdateFlags(&this->unk_2C6, 3, 7);
+ SubS_SetOfferMode(&this->unk_2C6, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_2C6 |= (0x40 | 0x10);
this->unk_2C6 |= 0x200;
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_09_80)) {
@@ -541,7 +544,7 @@ void EnDns_Update(Actor* thisx, PlayState* play) {
EnDns* this = THIS;
if (!func_8092CAD0(this, play) && func_8092CB98(this, play)) {
- func_8092D5E8(this, play);
+ EnDns_HandleCutscene(this, play);
SkelAnime_Update(&this->skelAnime);
func_8092C5C0(this);
} else {
@@ -549,8 +552,8 @@ 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);
- func_8013C964(&this->actor, play, 80.0f, 40.0f, PLAYER_IA_NONE, this->unk_2C6 & 7);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
+ SubS_Offer(&this->actor, play, 80.0f, 40.0f, PLAYER_IA_NONE, this->unk_2C6 & SUBS_OFFER_MODE_MASK);
Actor_SetFocus(&this->actor, 34.0f);
func_8092C6FC(this, play);
func_8092C5C0(this);
@@ -639,7 +642,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..5b926f9db 100644
--- a/src/overlays/actors/ovl_En_Dns/z_en_dns.h
+++ b/src/overlays/actors/ovl_En_Dns/z_en_dns.h
@@ -13,29 +13,28 @@ 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];
+ /* 0x1E4 */ Gfx* unk_1E4[KINGS_CHAMBER_DEKU_GUARD_LIMB_MAX];
/* 0x218 */ Vec3f unk_218;
/* 0x224 */ Vec3s unk_224;
/* 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;
@@ -51,7 +50,7 @@ typedef struct EnDns {
/* 0x2E4 */ f32 unk_2E4;
/* 0x2E8 */ UNK_TYPE1 unk_2E8[0x4];
/* 0x2EC */ f32 unk_2EC;
- /* 0x2F0 */ f32 unk_2F0;
+ /* 0x2F0 */ f32 animCurFrame;
/* 0x2F4 */ EnDnsFunc unk_2F4;
/* 0x2F8 */ s32 animIndex;
/* 0x2FC */ s32 unk_2FC;
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 d1ec4ea70..c85cdf6ee 100644
--- a/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c
+++ b/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c
@@ -7,9 +7,9 @@
#include "z_en_dodongo.h"
#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
#include "overlays/actors/ovl_En_Bombf/z_en_bombf.h"
-#include "objects/object_dodongo/object_dodongo.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_400)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_400)
#define THIS ((EnDodongo*)thisx)
@@ -296,7 +296,7 @@ void EnDodongo_Init(Actor* thisx, PlayState* play) {
Math_Vec3f_Copy(&this->unk_314, &gOneVec3f);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 48.0f);
SkelAnime_Init(play, &this->skelAnime, &object_dodongo_Skel_008318, &object_dodongo_Anim_004C20, this->jointTable,
- this->morphTable, 31);
+ this->morphTable, OBJECT_DODONGO_LIMB_MAX);
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
Collider_InitAndSetJntSph(play, &this->collider2, &this->actor, &sJntSphInit2, this->collider2Elements);
Collider_InitAndSetJntSph(play, &this->collider1, &this->actor, &sJntSphInit1, this->collider1Elements);
@@ -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);
}
}
@@ -408,7 +408,8 @@ void func_80876BD0(EnDodongo* this, PlayState* play, s32 arg2) {
this->drawDmgEffAlpha = 4.0f;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->collider1.elements[arg2].info.bumper.hitPos.x,
this->collider1.elements[arg2].info.bumper.hitPos.y,
- this->collider1.elements[arg2].info.bumper.hitPos.z, 0, 0, 0, CLEAR_TAG_LARGE_LIGHT_RAYS);
+ this->collider1.elements[arg2].info.bumper.hitPos.z, 0, 0, 0,
+ CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
}
}
@@ -420,7 +421,7 @@ void func_80876CAC(EnDodongo* this) {
this->drawDmgEffAlpha = 1.0f;
this->timer = 80;
this->actor.flags &= ~ACTOR_FLAG_400;
- Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, 0, 80);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 80);
}
void func_80876D28(EnDodongo* this, PlayState* play) {
@@ -430,7 +431,8 @@ void func_80876D28(EnDodongo* this, PlayState* play) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->collider1.base.colType = COLTYPE_HIT0;
this->drawDmgEffAlpha = 0.0f;
- Actor_SpawnIceEffects(play, &this->actor, &this->limbPos[0], 9, 2, this->unk_334 * 0.3f, this->unk_334 * 0.2f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, DODONGO_BODYPART_MAX, 2, this->unk_334 * 0.3f,
+ this->unk_334 * 0.2f);
this->actor.flags |= ACTOR_FLAG_400;
}
}
@@ -446,7 +448,7 @@ void func_80876DC4(EnDodongo* this, PlayState* play) {
f32 temp_f22;
f32 temp_f20;
- Math_Vec3f_Copy(&sp68, &this->limbPos[0]);
+ Math_Vec3f_Copy(&sp68, &this->bodyPartsPos[DODONGO_BODYPART_0]);
sp66 = ((s32)Rand_Next() >> 0x12) + this->actor.shape.rot.y;
temp_f20 = Math_CosS(sp66);
temp_f22 = Math_SinS(sp66);
@@ -494,8 +496,8 @@ void func_80876DC4(EnDodongo* this, PlayState* play) {
sp74.z = (Rand_ZeroFloat(0.1f) + 0.15f) * -temp_f22 * this->unk_334;
func_800B0EB0(play, &sp68, &sp80, &sp74, &this->unk_32C, &this->unk_330, sp64, sp62, 0x14);
- sp68.x = this->limbPos[0].x + (temp_f20 * 6.0f * this->unk_334);
- sp68.z = this->limbPos[0].z - (temp_f22 * 6.0f * this->unk_334);
+ sp68.x = this->bodyPartsPos[DODONGO_BODYPART_0].x + (temp_f20 * 6.0f * this->unk_334);
+ sp68.z = this->bodyPartsPos[DODONGO_BODYPART_0].z - (temp_f22 * 6.0f * this->unk_334);
sp80.x *= -1.0f;
sp80.z = sp80.z * -1.0f;
sp74.x = (Rand_ZeroFloat(0.1f) + 0.15f) * -temp_f20 * this->unk_334;
@@ -536,7 +538,7 @@ s32 func_80877278(EnDodongo* this, PlayState* play) {
void func_808773C4(EnDodongo* this) {
Animation_MorphToLoop(&this->skelAnime, &object_dodongo_Anim_004C20, -4.0f);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->timer = Rand_S16Offset(30, 50);
this->actionFunc = func_80877424;
}
@@ -556,7 +558,7 @@ void func_80877424(EnDodongo* this, PlayState* play) {
void func_80877494(EnDodongo* this) {
Animation_MorphToLoop(&this->skelAnime, &object_dodongo_Anim_008B1C, -4.0f);
- this->actor.speedXZ = this->unk_334 * 1.5f;
+ this->actor.speed = this->unk_334 * 1.5f;
this->timer = Rand_S16Offset(50, 70);
this->actionFunc = func_80877500;
}
@@ -568,13 +570,13 @@ void func_80877500(EnDodongo* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (Animation_OnFrame(&this->skelAnime, 19.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DODO_J_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DODO_J_WALK);
sp30.x = this->collider1Elements[2].dim.worldSphere.center.x;
sp30.y = this->collider1Elements[2].dim.worldSphere.center.y;
sp30.z = this->collider1Elements[2].dim.worldSphere.center.z;
func_80876930(this, play, &sp30);
} else if (Animation_OnFrame(&this->skelAnime, 39.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DODO_J_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DODO_J_WALK);
sp30.x = this->collider1Elements[1].dim.worldSphere.center.x;
sp30.y = this->collider1Elements[1].dim.worldSphere.center.y;
sp30.z = this->collider1Elements[1].dim.worldSphere.center.z;
@@ -592,9 +594,10 @@ void func_80877500(EnDodongo* this, PlayState* play) {
}
}
} else {
- if ((Actor_XZDistanceToPoint(&this->actor, &this->actor.home.pos) > 150.0f) ||
+ if ((Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) > 150.0f) ||
(Player_GetMask(play) == PLAYER_MASK_STONE)) {
- Math_ScaledStepToS(&this->actor.world.rot.y, Actor_YawToPoint(&this->actor, &this->actor.home.pos), 0x1F4);
+ Math_ScaledStepToS(&this->actor.world.rot.y, Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos),
+ 0x1F4);
}
this->timer--;
@@ -615,14 +618,14 @@ void func_808777A8(EnDodongo* this) {
Sphere16* sph;
Animation_MorphToPlayOnce(&this->skelAnime, &object_dodongo_Anim_0028F0, -4.0f);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
for (i = 0; i < ARRAY_COUNT(this->collider3Elements); i++) {
sph = &this->collider3.elements[i].dim.worldSphere;
- sph->center.x = this->limbPos[0].x;
- sph->center.y = this->limbPos[0].y;
- sph->center.z = this->limbPos[0].z;
+ sph->center.x = this->bodyPartsPos[DODONGO_BODYPART_0].x;
+ sph->center.y = this->bodyPartsPos[DODONGO_BODYPART_0].y;
+ sph->center.z = this->bodyPartsPos[DODONGO_BODYPART_0].z;
sph->radius = 0;
}
@@ -640,11 +643,11 @@ void func_8087784C(EnDodongo* this, PlayState* play) {
f32 temp_f12;
if (Animation_OnFrame(&this->skelAnime, 24.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DODO_J_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DODO_J_CRY);
}
if (func_8087721C(this)) {
- func_800B9010(&this->actor, NA_SE_EN_DODO_J_FIRE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_DODO_J_FIRE - SFX_FLAG);
frame = this->skelAnime.curFrame - 29.0f;
end = frame >> 1;
if (end > 3) {
@@ -656,10 +659,12 @@ void func_8087784C(EnDodongo* this, PlayState* play) {
temp_f12 = Math_CosS(this->actor.shape.rot.y) * this->unk_334;
for (i = 0; i < end; i++, element++) {
- element->dim.worldSphere.center.x = this->limbPos[0].x + (element->dim.modelSphere.center.z * temp_f2);
+ element->dim.worldSphere.center.x =
+ this->bodyPartsPos[DODONGO_BODYPART_0].x + (element->dim.modelSphere.center.z * temp_f2);
element->dim.worldSphere.center.y =
- this->limbPos[0].y + (element->dim.modelSphere.center.y * this->unk_334);
- element->dim.worldSphere.center.z = this->limbPos[0].z + (element->dim.modelSphere.center.z * temp_f12);
+ this->bodyPartsPos[DODONGO_BODYPART_0].y + (element->dim.modelSphere.center.y * this->unk_334);
+ element->dim.worldSphere.center.z =
+ this->bodyPartsPos[DODONGO_BODYPART_0].z + (element->dim.modelSphere.center.z * temp_f12);
element->dim.worldSphere.radius = element->dim.modelSphere.radius;
}
@@ -667,10 +672,10 @@ void func_8087784C(EnDodongo* this, PlayState* play) {
D_80879348.x = 2.5f * temp_f2;
D_80879348.y = this->unk_334 * 1.4f;
D_80879348.z = 2.5f * temp_f12;
- EffectSsDFire_Spawn(play, &this->limbPos[0], &D_80879354, &D_80879348, this->unk_334 * 100.0f,
- this->unk_334 * 35.0f, 0xFF - (frame * 10), 5, 0, 8);
+ EffectSsDFire_Spawn(play, &this->bodyPartsPos[DODONGO_BODYPART_0], &D_80879354, &D_80879348,
+ this->unk_334 * 100.0f, this->unk_334 * 35.0f, 0xFF - (frame * 10), 5, 0, 8);
} else if ((this->skelAnime.curFrame >= 2.0f) && (this->skelAnime.curFrame <= 20.0f)) {
- func_800B9010(&this->actor, NA_SE_EN_DODO_J_BREATH - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_DODO_J_BREATH - SFX_FLAG);
}
if (SkelAnime_Update(&this->skelAnime)) {
@@ -695,7 +700,7 @@ void func_80877DE0(EnDodongo* this) {
this->actor.flags |= ACTOR_FLAG_10;
this->timer = 25;
this->actionFunc = func_80877E60;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
void func_80877E60(EnDodongo* this, PlayState* play) {
@@ -727,7 +732,7 @@ void func_80877E60(EnDodongo* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, 28.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DODO_J_EAT);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DODO_J_EAT);
if (this->actor.child != NULL) {
Actor_Kill(this->actor.child);
this->actor.child = NULL;
@@ -737,9 +742,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;
@@ -750,14 +755,14 @@ void func_80877E60(EnDodongo* this, PlayState* play) {
this->unk_334 * 10.0f, 10);
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_BOMB_EXPLOSION);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_BOMB_EXPLOSION);
if (this->actor.colChkInfo.health <= 4) {
this->actor.colChkInfo.health = 0;
Enemy_StartFinishingBlow(play, &this->actor);
} else {
this->actor.colChkInfo.health -= 4;
}
- Actor_SetColorFilter(&this->actor, 0x4000, 0x78, 0, 8);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 120, COLORFILTER_BUFFLAG_OPA, 8);
}
} else if (Animation_OnFrame(&this->skelAnime, 24.0f)) {
this->timer--;
@@ -770,13 +775,13 @@ void func_80877E60(EnDodongo* this, PlayState* play) {
} else {
sp5E = this->unk_334 * 50.0f;
sp5C = this->unk_334 * 5.0f;
- Math_Vec3f_Copy(&sp64, &this->limbPos[0]);
+ Math_Vec3f_Copy(&sp64, &this->bodyPartsPos[DODONGO_BODYPART_0]);
func_800B0DE0(play, &sp64, &gZeroVec3f, &D_80879360, &D_8087936C, &D_8087936C, sp5E, sp5C);
sp64.x -= Math_CosS(this->actor.shape.rot.y) * 6.0f * this->unk_334;
sp64.z += Math_SinS(this->actor.shape.rot.y) * 6.0f * this->unk_334;
func_800B0DE0(play, &sp64, &gZeroVec3f, &D_80879360, &D_8087936C, &D_8087936C, sp5E, sp5C);
- sp64.x = (2.0f * this->limbPos[0].x) - sp64.x;
- sp64.z = (2.0f * this->limbPos[0].z) - sp64.z;
+ sp64.x = (2.0f * this->bodyPartsPos[DODONGO_BODYPART_0].x) - sp64.x;
+ sp64.z = (2.0f * this->bodyPartsPos[DODONGO_BODYPART_0].z) - sp64.z;
func_800B0DE0(play, &sp64, &gZeroVec3f, &D_80879360, &D_8087936C, &D_8087936C, sp5E, sp5C);
}
}
@@ -797,20 +802,20 @@ void func_80877E60(EnDodongo* this, PlayState* play) {
void func_80878354(EnDodongo* this) {
s32 pad;
- AnimationHeader* sp18;
+ AnimationHeader* anim;
s16 yDiff = this->actor.yawTowardsPlayer - this->actor.shape.rot.y;
this->unk_306 = (0xFFFF - ABS_ALT(yDiff)) / 15;
if (yDiff >= 0) {
- sp18 = &object_dodongo_Anim_0042C4;
+ anim = &object_dodongo_Anim_0042C4;
this->unk_306 = -this->unk_306;
} else {
- sp18 = &object_dodongo_Anim_003B14;
+ anim = &object_dodongo_Anim_003B14;
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DODO_J_TAIL);
- Animation_PlayOnceSetSpeed(&this->skelAnime, sp18, 2.0f);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DODO_J_TAIL);
+ Animation_PlayOnceSetSpeed(&this->skelAnime, anim, 2.0f);
this->timer = 0;
this->collider1.base.atFlags |= AT_ON;
this->unk_304 = -1;
@@ -848,7 +853,7 @@ void func_80878424(EnDodongo* this, PlayState* play) {
void func_80878594(EnDodongo* this) {
this->actionFunc = func_808785B0;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
void func_808785B0(EnDodongo* this, PlayState* play) {
@@ -870,11 +875,11 @@ void func_808785B0(EnDodongo* this, PlayState* play) {
void func_8087864C(EnDodongo* this) {
Animation_MorphToPlayOnce(&this->skelAnime, &object_dodongo_Anim_001A44, -4.0f);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DODO_J_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DODO_J_DAMAGE);
this->timer = 0;
this->unk_304 = 0;
- this->actor.speedXZ = 0.0f;
- Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, 0, 8);
+ this->actor.speed = 0.0f;
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
this->actionFunc = func_808786C8;
}
@@ -892,10 +897,10 @@ void func_80878724(EnDodongo* this) {
Animation_MorphToPlayOnce(&this->skelAnime, &object_dodongo_Anim_0013C4, -8.0f);
this->timer = 0;
this->unk_304 = 0;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DODO_J_DEAD);
- this->actor.flags &= ~ACTOR_FLAG_1;
- this->actor.speedXZ = 0.0f;
- Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, 0, 8);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DODO_J_DEAD);
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ this->actor.speed = 0.0f;
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
this->actionFunc = func_808787B0;
}
@@ -907,20 +912,21 @@ void func_808787B0(EnDodongo* this, PlayState* play) {
func_80876DC4(this, play);
}
} else if (this->actor.colorFilterTimer == 0) {
- Actor_SetColorFilter(&this->actor, 0x4000, 0x78, 0, 4);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 120, COLORFILTER_BUFFLAG_OPA, 4);
}
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;
}
this->timer = 8;
}
} else if (Animation_OnFrame(&this->skelAnime, 52.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GERUDOFT_DOWN);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GERUDOFT_DOWN);
}
if (this->timer != 0) {
@@ -993,13 +999,13 @@ void EnDodongo_UpdateDamage(EnDodongo* this, PlayState* play) {
}
} else if (this->actor.colChkInfo.damageEffect == 1) {
this->timer = 40;
- Actor_SetColorFilter(&this->actor, 0, 0xFF, 0, 40);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
func_80878594(this);
} else if (this->actor.colChkInfo.damageEffect == 5) {
this->timer = 40;
- Actor_SetColorFilter(&this->actor, 0, 0xFF, 0, 40);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_SMALL;
this->drawDmgEffScale = 0.75f;
this->drawDmgEffAlpha = 2.0f;
@@ -1023,9 +1029,11 @@ 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);
- if (this->actor.bgCheckFlags & 2) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GERUDOFT_DOWN);
+ 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);
}
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider1.base);
@@ -1049,7 +1057,7 @@ void EnDodongo_Update(Actor* thisx, PlayState* play2) {
this->drawDmgEffScale = (this->drawDmgEffAlpha + 1.0f) * 0.375f;
this->drawDmgEffScale = (this->drawDmgEffScale > 0.75f) ? 0.75f : this->drawDmgEffScale;
} else if (!Math_StepToF(&this->drawDmgEffFrozenSteamScale, 0.75f, 0.01875f)) {
- func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
}
}
@@ -1057,41 +1065,74 @@ void EnDodongo_Update(Actor* thisx, PlayState* play2) {
s32 EnDodongo_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnDodongo* this = THIS;
- if (limbIndex == 1) {
+ if (limbIndex == OBJECT_DODONGO_LIMB_01) {
pos->z += 1000.0f;
- } else if ((limbIndex == 15) || (limbIndex == 16)) {
+ } else if ((limbIndex == OBJECT_DODONGO_LIMB_0F) || (limbIndex == OBJECT_DODONGO_LIMB_10)) {
Matrix_Scale(this->unk_314.x, this->unk_314.y, this->unk_314.z, MTXMODE_APPLY);
}
return false;
}
+static Vec3f D_80879370 = { 1800.0f, 1200.0f, 0.0f };
+static Vec3f D_8087937C = { 1500.0f, 300.0f, 0.0f };
+
+static s8 sLimbToBodyParts[OBJECT_DODONGO_LIMB_MAX] = {
+ BODYPART_NONE, // OBJECT_DODONGO_LIMB_NONE
+ BODYPART_NONE, // OBJECT_DODONGO_LIMB_01
+ BODYPART_NONE, // OBJECT_DODONGO_LIMB_02
+ BODYPART_NONE, // OBJECT_DODONGO_LIMB_03
+ BODYPART_NONE, // OBJECT_DODONGO_LIMB_04
+ BODYPART_NONE, // OBJECT_DODONGO_LIMB_05
+ BODYPART_NONE, // OBJECT_DODONGO_LIMB_06
+ BODYPART_NONE, // OBJECT_DODONGO_LIMB_07
+ BODYPART_NONE, // OBJECT_DODONGO_LIMB_08
+ BODYPART_NONE, // OBJECT_DODONGO_LIMB_09
+ BODYPART_NONE, // OBJECT_DODONGO_LIMB_0A
+ BODYPART_NONE, // OBJECT_DODONGO_LIMB_0B
+ BODYPART_NONE, // OBJECT_DODONGO_LIMB_0C
+ DODONGO_BODYPART_2, // OBJECT_DODONGO_LIMB_0D
+ DODONGO_BODYPART_3, // OBJECT_DODONGO_LIMB_0E
+ DODONGO_BODYPART_4, // OBJECT_DODONGO_LIMB_0F
+ BODYPART_NONE, // OBJECT_DODONGO_LIMB_10
+ BODYPART_NONE, // OBJECT_DODONGO_LIMB_11
+ BODYPART_NONE, // OBJECT_DODONGO_LIMB_12
+ BODYPART_NONE, // OBJECT_DODONGO_LIMB_13
+ BODYPART_NONE, // OBJECT_DODONGO_LIMB_14
+ DODONGO_BODYPART_5, // OBJECT_DODONGO_LIMB_15
+ DODONGO_BODYPART_6, // OBJECT_DODONGO_LIMB_16
+ BODYPART_NONE, // OBJECT_DODONGO_LIMB_17
+ BODYPART_NONE, // OBJECT_DODONGO_LIMB_18
+ BODYPART_NONE, // OBJECT_DODONGO_LIMB_19
+ BODYPART_NONE, // OBJECT_DODONGO_LIMB_1A
+ BODYPART_NONE, // OBJECT_DODONGO_LIMB_1B
+ DODONGO_BODYPART_7, // OBJECT_DODONGO_LIMB_1C
+ DODONGO_BODYPART_8, // OBJECT_DODONGO_LIMB_1D
+ BODYPART_NONE, // OBJECT_DODONGO_LIMB_1E
+};
+
void EnDodongo_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
- static Vec3f D_80879370 = { 1800.0f, 1200.0f, 0.0f };
- static Vec3f D_8087937C = { 1500.0f, 300.0f, 0.0f };
- static s8 D_80879388[] = {
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 3, 4,
- -1, -1, -1, -1, -1, 5, 6, -1, -1, -1, -1, -1, 7, 8, -1, 0,
- };
EnDodongo* this = THIS;
Collider_UpdateSpheres(limbIndex, &this->collider1);
Collider_UpdateSpheres(limbIndex, &this->collider2);
- if (D_80879388[limbIndex] != -1) {
- Matrix_MultZero(&this->limbPos[D_80879388[limbIndex]]);
+ if (sLimbToBodyParts[limbIndex] != BODYPART_NONE) {
+ Matrix_MultZero(&this->bodyPartsPos[sLimbToBodyParts[limbIndex]]);
}
- if (limbIndex == 7) {
+ if (limbIndex == OBJECT_DODONGO_LIMB_07) {
Matrix_MultVec3f(&D_80879370, &this->unk_308);
- Matrix_MultVec3f(&D_8087937C, &this->limbPos[0]);
+ Matrix_MultVec3f(&D_8087937C, &this->bodyPartsPos[DODONGO_BODYPART_0]);
Matrix_MultZero(&this->actor.focus.pos);
- Matrix_MultVecY(-200.0f, &this->limbPos[1]);
- } else if (limbIndex == 13) {
+ Matrix_MultVecY(-200.0f, &this->bodyPartsPos[DODONGO_BODYPART_1]);
+ } else if (limbIndex == OBJECT_DODONGO_LIMB_0D) {
Matrix_MultVecX(1600.0f, &this->unk_320);
}
- if ((limbIndex == 30) && (this->actionFunc == func_80878424) && (this->timer != this->unk_304)) {
- EffectBlure_AddVertex(Effect_GetByIndex(this->unk_338), &this->unk_320, &this->limbPos[4]);
+ if ((limbIndex == OBJECT_DODONGO_LIMB_1E) && (this->actionFunc == func_80878424) &&
+ (this->timer != this->unk_304)) {
+ EffectBlure_AddVertex(Effect_GetByIndex(this->unk_338), &this->unk_320,
+ &this->bodyPartsPos[DODONGO_BODYPART_4]);
this->unk_304 = this->timer;
}
}
@@ -1099,10 +1140,10 @@ 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),
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, DODONGO_BODYPART_MAX,
this->drawDmgEffScale * this->unk_334, this->drawDmgEffFrozenSteamScale * this->unk_334,
this->drawDmgEffAlpha, this->drawDmgEffType);
}
diff --git a/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.h b/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.h
index 3cc80b0d1..33e580539 100644
--- a/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.h
+++ b/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.h
@@ -2,16 +2,30 @@
#define Z_EN_DODONGO_H
#include "global.h"
+#include "objects/object_dodongo/object_dodongo.h"
struct EnDodongo;
typedef void (*EnDodongoActionFunc)(struct EnDodongo*, PlayState*);
+typedef enum DodongoBodyPart {
+ /* 0 */ DODONGO_BODYPART_0,
+ /* 1 */ DODONGO_BODYPART_1,
+ /* 2 */ DODONGO_BODYPART_2,
+ /* 3 */ DODONGO_BODYPART_3,
+ /* 4 */ DODONGO_BODYPART_4,
+ /* 5 */ DODONGO_BODYPART_5,
+ /* 6 */ DODONGO_BODYPART_6,
+ /* 7 */ DODONGO_BODYPART_7,
+ /* 8 */ DODONGO_BODYPART_8,
+ /* 9 */ DODONGO_BODYPART_MAX
+} DodongoBodyPart;
+
typedef struct EnDodongo {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[31];
- /* 0x242 */ Vec3s morphTable[31];
+ /* 0x188 */ Vec3s jointTable[OBJECT_DODONGO_LIMB_MAX];
+ /* 0x242 */ Vec3s morphTable[OBJECT_DODONGO_LIMB_MAX];
/* 0x2FC */ EnDodongoActionFunc actionFunc;
/* 0x300 */ u8 drawDmgEffType;
/* 0x302 */ s16 timer;
@@ -27,7 +41,7 @@ typedef struct EnDodongo {
/* 0x33C */ f32 drawDmgEffAlpha;
/* 0x340 */ f32 drawDmgEffScale;
/* 0x344 */ f32 drawDmgEffFrozenSteamScale;
- /* 0x348 */ Vec3f limbPos[9];
+ /* 0x348 */ Vec3f bodyPartsPos[DODONGO_BODYPART_MAX];
/* 0x3B4 */ ColliderJntSph collider1;
/* 0x3D4 */ ColliderJntSphElement collider1Elements[10];
/* 0x654 */ ColliderJntSph collider2;
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 3d7e79a3d..124dee6f7 100644
--- a/src/overlays/actors/ovl_En_Door/z_en_door.c
+++ b/src/overlays/actors/ovl_En_Door/z_en_door.c
@@ -5,7 +5,7 @@
*/
#include "z_en_door.h"
-#include "objects/object_mkk/object_mkk.h"
+#include "objects/object_kinsta2_obj/object_kinsta2_obj.h"
#include "objects/object_dor01/object_dor01.h"
#include "objects/object_dor02/object_dor02.h"
#include "objects/object_dor03/object_dor03.h"
@@ -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 },
@@ -348,60 +347,92 @@ static EnDoorInfo sObjInfo[] = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_U8(targetMode, 0, ICHAIN_CONTINUE),
+ ICHAIN_U8(targetMode, TARGET_MODE_0, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneForward, 4000, ICHAIN_CONTINUE),
ICHAIN_U16(shape.rot.x, 0, ICHAIN_CONTINUE),
ICHAIN_U16(shape.rot.z, 0, ICHAIN_STOP),
};
-static AnimationHeader* sAnimations[] = {
- &gameplay_keep_Anim_020658, &gameplay_keep_Anim_022CA8, &gameplay_keep_Anim_020658, &gameplay_keep_Anim_022E68,
- &gameplay_keep_Anim_0204B4, &gameplay_keep_Anim_022BE8, &gameplay_keep_Anim_022D90, &gameplay_keep_Anim_022BE8,
- &gameplay_keep_Anim_022FF0, &gameplay_keep_Anim_0205A0,
+static AnimationHeader* sAnimations[2 * PLAYER_FORM_MAX] = {
+ // left
+ &gameplay_keep_Anim_020658, // PLAYER_FORM_FIERCE_DEITY
+ &gameplay_keep_Anim_022CA8, // PLAYER_FORM_GORON
+ &gameplay_keep_Anim_020658, // PLAYER_FORM_ZORA
+ &gameplay_keep_Anim_022E68, // PLAYER_FORM_DEKU
+ &gameplay_keep_Anim_0204B4, // PLAYER_FORM_HUMAN
+ // right
+ &gameplay_keep_Anim_022BE8, // PLAYER_FORM_FIERCE_DEITY
+ &gameplay_keep_Anim_022D90, // PLAYER_FORM_GORON
+ &gameplay_keep_Anim_022BE8, // PLAYER_FORM_ZORA
+ &gameplay_keep_Anim_022FF0, // PLAYER_FORM_DEKU
+ &gameplay_keep_Anim_0205A0, // PLAYER_FORM_HUMAN
};
-static u8 sAnimOpenFrames[10] = {
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+static u8 sAnimOpenFrames[2 * PLAYER_FORM_MAX] = {
+ // left
+ 25, // PLAYER_FORM_FIERCE_DEITY
+ 25, // PLAYER_FORM_GORON
+ 25, // PLAYER_FORM_ZORA
+ 25, // PLAYER_FORM_DEKU
+ 25, // PLAYER_FORM_HUMAN
+ // right
+ 25, // PLAYER_FORM_FIERCE_DEITY
+ 25, // PLAYER_FORM_GORON
+ 25, // PLAYER_FORM_ZORA
+ 25, // PLAYER_FORM_DEKU
+ 25, // PLAYER_FORM_HUMAN
};
-static u8 sAnimCloseFrames[10] = {
- 60, 60, 60, 70, 70, 60, 60, 60, 60, 70,
+static u8 sAnimCloseFrames[2 * PLAYER_FORM_MAX] = {
+ // left
+ 60, // PLAYER_FORM_FIERCE_DEITY
+ 60, // PLAYER_FORM_GORON
+ 60, // PLAYER_FORM_ZORA
+ 70, // PLAYER_FORM_DEKU
+ 70, // PLAYER_FORM_HUMAN
+ // right
+ 60, // PLAYER_FORM_FIERCE_DEITY
+ 60, // PLAYER_FORM_GORON
+ 60, // PLAYER_FORM_ZORA
+ 60, // PLAYER_FORM_DEKU
+ 70, // PLAYER_FORM_HUMAN
};
static Gfx* D_808679A4[14][2] = {
{ gDoorLeftDL, gDoorRightDL },
{ gWoodfallDoorDL, gWoodfallDoorDL },
- { object_dor01_DL_000448, object_dor01_DL_000448 },
+ { gObservatoryLabDoorDL, gObservatoryLabDoorDL },
{ gZoraHallDoorDL, gZoraHallDoorDL },
{ gSwampDoorDL, gSwampDoorDL },
{ gMagicHagPotionShopDoorDL, gMagicHagPotionShopDoorDL },
- { object_wdor01_DL_000548, object_wdor01_DL_000548 }, // Lottery Shop / Curiosity Shop / Mayor's House Door
- { object_wdor02_DL_000548, object_wdor02_DL_000548 }, // Trading Post / Post Office Door
- { object_wdor03_DL_000548, object_wdor03_DL_000548 }, // Stockpot Inn & Swordsman's School Door
+ { gLotteryCuriosityShopMayorHouseDoorDL, gLotteryCuriosityShopMayorHouseDoorDL },
+ { gPostOfficeTradingPostDoorDL, gPostOfficeTradingPostDoorDL },
+ { gInnSchoolDoorDL, gInnSchoolDoorDL },
{ gMilkBarDoorDL, gMilkBarDoorDL },
{ gMusicBoxHouseDoorDL, gMusicBoxHouseDoorDL },
{ gPiratesFortressDoorDL, gPiratesFortressDoorDL },
- { object_mkk_DL_000310, object_mkk_DL_000310 },
+ { gOceansideSpiderHouseDoorDL, gOceansideSpiderHouseDoorDL },
{ gFieldWoodDoorLeftDL, gFieldWoodDoorRightDL },
};
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_SWITCH_FLAG(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++) {
@@ -409,57 +440,58 @@ void EnDoor_Init(Actor* thisx, PlayState* play2) {
break;
}
}
- if ((i >= ARRAY_COUNT(sObjInfo) - 34) && (Object_GetIndex(&play->objectCtx, GAMEPLAY_FIELD_KEEP) >= 0)) {
+ if ((i >= ARRAY_COUNT(sObjInfo) - 34) && (Object_GetSlot(&play->objectCtx, GAMEPLAY_FIELD_KEEP) >= 0)) {
objectInfo++;
}
}
- this->dlIndex = objectInfo->dListIndex;
- objectBankIndex = Object_GetIndex(&play->objectCtx, objectInfo->objectId);
+ this->knobDoor.dlIndex = objectInfo->dListIndex;
+ objectBankIndex = Object_GetSlot(&play->objectCtx, objectInfo->objectId);
if (objectBankIndex < 0) {
objectInfo = &sObjInfo[15];
- objectBankIndex = Object_GetIndex(&play->objectCtx, objectInfo->objectId);
+ objectBankIndex = Object_GetSlot(&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_XZDistanceBetweenActors(&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;
}
}
}
@@ -467,85 +499,83 @@ void func_80866A5C(EnDoor* this, PlayState* play) {
void func_80866B20(EnDoor* this, PlayState* play) {
static s32 D_80867BC0;
Player* player = GET_PLAYER(play);
- Vec3f playerPosRelToDoor;
- s16 temp_a2;
- s16 yawDiff;
- s32 temp_a1_2;
- s32 temp_t0;
- u8 temp_a1;
- 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_PlaySfxAtPos(&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_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_DOOR_OPEN);
+ Actor_PlaySfx(&this->knobDoor.dyna.actor, NA_SE_EV_DOOR_OPEN);
} else if (!Player_InCsMode(play)) {
- Actor_OffsetOfPointInActorCoords(&this->dyna.actor, &playerPosRelToDoor, &player->actor.world.pos);
+ Vec3f playerPosRelToDoor;
+
+ 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))) {
- 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);
}
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)) {
- s32 textIdOffset;
+ 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;
- temp_t0 = (play->actorCtx.unkC & 0x2AA) >> 1;
- temp_a2 = D_801AED48[this->switchFlag & 7];
- temp_a1_2 = play->actorCtx.unkC & 0x155;
- textIdOffset = (this->switchFlag >> 3) & 0xF;
- if (((this->unk_1A4 == 0) && (((temp_t0 | temp_a1_2) & temp_a2) == 0)) ||
- ((this->unk_1A4 == 2) && ((temp_a2 & temp_a1_2) == 0)) ||
- ((this->unk_1A4 == 3) && ((temp_a2 & temp_t0) == 0))) {
+ 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)) {
- ScheduleOutput sp30;
+ } else if ((this->doorType == ENDOOR_TYPE_5) && (playerPosRelToDoor.z > 0.0f)) {
+ ScheduleOutput scheduleOutput;
- if (Schedule_RunScript(play, D_8086778C[this->switchFlag], &sp30)) {
- this->dyna.actor.textId = sp30.result + 0x1800;
+ if (Schedule_RunScript(play, D_8086778C[this->switchFlag], &scheduleOutput)) {
+ 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_PlaySfxAtPos(&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;
}
}
@@ -560,34 +590,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_PlaySfxAtPos(&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_PlaySfxAtPos(&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;
}
}
@@ -597,19 +627,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_PlaySfxAtPos(&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_PlaySfxAtPos(&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);
}
}
}
@@ -624,28 +654,29 @@ 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[DOOR_LIMB_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];
@@ -657,17 +688,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);
@@ -676,6 +708,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..5ea0b7df3 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_SWITCH_FLAG(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..b771d09fe 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
@@ -79,7 +79,7 @@ EnDoorEtcInfo sObjInfo[] = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_U8(targetMode, 0, ICHAIN_CONTINUE),
+ ICHAIN_U8(targetMode, TARGET_MODE_0, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneForward, 4000, ICHAIN_CONTINUE),
ICHAIN_U16(shape.rot.x, 0, ICHAIN_CONTINUE),
ICHAIN_U16(shape.rot.z, 0, ICHAIN_STOP),
@@ -92,33 +92,33 @@ 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) {
break;
}
}
- if ((i >= 15) && (Object_GetIndex(&play->objectCtx, GAMEPLAY_FIELD_KEEP) >= 0)) {
+ if ((i >= 15) && (Object_GetSlot(&play->objectCtx, GAMEPLAY_FIELD_KEEP) >= 0)) {
objectInfo++;
}
- objectIndex = Object_GetIndex(&play->objectCtx, objectInfo->objectId);
+ objectIndex = Object_GetSlot(&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_SWITCH_FLAG(&this->knobDoor.dyna.actor))) {
+ Flags_UnsetSwitch(play, ENDOORETC_GET_SWITCH_FLAG(&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..c0bbdf98b 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,19 +2,16 @@
#define Z_EN_DOOR_ETC_H
#include "global.h"
+#include "z64door.h"
struct EnDoorEtc;
-#define ENDOORETC_GET_SWITCHFLAG(thisx) ((thisx)->params & 0x7F)
+#define ENDOORETC_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
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 83b93cf52..59d504705 100644
--- a/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c
+++ b/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c
@@ -5,8 +5,9 @@
*/
#include "z_en_dragon.h"
+#include "overlays/actors/ovl_En_Ot/z_en_ot.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((EnDragon*)thisx)
@@ -24,28 +25,21 @@ void EnDragon_SetupAttack(EnDragon* this);
void EnDragon_Attack(EnDragon* this, PlayState* play);
void EnDragon_Dead(EnDragon* this, PlayState* play);
-typedef enum {
- /* 0 */ DEEP_PYTHON_ANIM_SMALL_SIDE_SWAY,
- /* 1 */ DEEP_PYTHON_ANIM_LARGE_SIDE_SWAY,
- /* 2 */ DEEP_PYTHON_ANIM_VERTICAL_SWAY,
- /* 3 */ DEEP_PYTHON_ANIM_IDLE
-} DeepPythonAnimation;
-
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;
@@ -214,7 +208,7 @@ void EnDragon_Init(Actor* thisx, PlayState* play) {
this->actor.colChkInfo.health = 4;
this->actor.colChkInfo.damageTable = &sDamageTable;
- this->actor.targetMode = 0xA;
+ this->actor.targetMode = TARGET_MODE_10;
Collider_InitAndSetJntSph(play, &this->collider, &this->actor, &sJntSphInit, this->colliderElements);
this->collider.elements[0].dim.scale = this->collider.elements[1].dim.scale = this->collider.elements[2].dim.scale =
@@ -244,7 +238,7 @@ void EnDragon_Init(Actor* thisx, PlayState* play) {
this->action = DEEP_PYTHON_ACTION_IDLE;
this->actor.hintId = TATL_HINT_ID_DEEP_PYTHON;
this->scale = 0.5f;
- this->actor.flags &= ~ACTOR_FLAG_8000000;
+ this->actor.flags &= ~ACTOR_FLAG_CANT_LOCK_ON;
EnDragon_SetupRetreatOrIdle(this);
}
@@ -255,26 +249,39 @@ void EnDragon_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyJntSph(play, &this->collider);
}
-static AnimationHeader* sAnimations[] = {
- &gDeepPythonSmallSideSwayAnim,
- &gDeepPythonLargeSideSwayAnim,
- &gDeepPythonVerticalSwayAnim,
- &gDeepPythonSmallSideSwayAnim,
+typedef enum {
+ /* 0 */ DEEP_PYTHON_ANIM_SMALL_SIDE_SWAY,
+ /* 1 */ DEEP_PYTHON_ANIM_LARGE_SIDE_SWAY,
+ /* 2 */ DEEP_PYTHON_ANIM_VERTICAL_SWAY,
+ /* 3 */ DEEP_PYTHON_ANIM_IDLE,
+ /* 4 */ DEEP_PYTHON_ANIM_MAX
+} DeepPythonAnimation;
+
+static AnimationHeader* sAnimations[DEEP_PYTHON_ANIM_MAX] = {
+ &gDeepPythonSmallSideSwayAnim, // DEEP_PYTHON_ANIM_SMALL_SIDE_SWAY
+ &gDeepPythonLargeSideSwayAnim, // DEEP_PYTHON_ANIM_LARGE_SIDE_SWAY
+ &gDeepPythonVerticalSwayAnim, // DEEP_PYTHON_ANIM_VERTICAL_SWAY
+ &gDeepPythonSmallSideSwayAnim, // DEEP_PYTHON_ANIM_IDLE
};
-static u8 sAnimationModes[] = { ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_ONCE };
+static u8 sAnimationModes[DEEP_PYTHON_ANIM_MAX] = {
+ ANIMMODE_LOOP, // DEEP_PYTHON_ANIM_SMALL_SIDE_SWAY
+ ANIMMODE_LOOP, // DEEP_PYTHON_ANIM_LARGE_SIDE_SWAY
+ ANIMMODE_ONCE, // DEEP_PYTHON_ANIM_VERTICAL_SWAY
+ ANIMMODE_ONCE, // DEEP_PYTHON_ANIM_IDLE
+};
void EnDragon_ChangeAnim(EnDragon* this, s32 animIndex) {
f32 startFrame;
this->animIndex = animIndex;
- this->endFrame = Animation_GetLastFrame(sAnimations[animIndex]);
+ this->animEndFrame = Animation_GetLastFrame(sAnimations[animIndex]);
startFrame = 0.0f;
if (this->animIndex == DEEP_PYTHON_ANIM_IDLE) {
- startFrame = this->endFrame;
+ startFrame = this->animEndFrame;
}
- Animation_Change(&this->skelAnime, sAnimations[animIndex], 1.0f, startFrame, this->endFrame,
+ Animation_Change(&this->skelAnime, sAnimations[animIndex], 1.0f, startFrame, this->animEndFrame,
sAnimationModes[this->animIndex], -4.0f);
}
@@ -299,11 +306,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 +318,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,
@@ -345,9 +352,9 @@ void EnDragon_RetreatOrIdle(EnDragon* this, PlayState* play) {
EnDragon_SetupExtend(this);
} else if ((this->timer != 0) && (fabsf(this->actor.world.pos.x - this->actor.home.pos.x) > 101.0f) &&
(fabsf(this->actor.world.pos.z - this->actor.home.pos.z) > 101.0f)) {
- this->actor.speedXZ = -100.0f;
+ this->actor.speed = -100.0f;
} else {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if ((fabsf(this->actor.world.pos.x - this->actor.home.pos.x) > 4.0f) &&
(fabsf(this->actor.world.pos.z - this->actor.home.pos.z) > 4.0f)) {
@@ -362,38 +369,38 @@ void EnDragon_RetreatOrIdle(EnDragon* this, PlayState* play) {
void EnDragon_SetupExtend(EnDragon* this) {
this->state = 0;
this->behindJawRetreatTimer = this->state;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_UTSUBO_APPEAR_TRG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_UTSUBO_APPEAR_TRG);
this->retreatTimer = 250;
this->actionFunc = EnDragon_Extend;
}
void EnDragon_Extend(EnDragon* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- f32 currentFrame = this->skelAnime.curFrame;
+ f32 curFrame = this->skelAnime.curFrame;
s16 yaw;
EnDragon_SpawnBubbles(this, play, this->jawPos);
if (this->action >= DEEP_PYTHON_ACTION_DAMAGE) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_UTSUBO_BACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_UTSUBO_BACK);
EnDragon_SetupRetreatOrIdle(this);
} else if (this->retreatTimer == 0) {
this->action = DEEP_PYTHON_ACTION_RETREAT;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_UTSUBO_BACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_UTSUBO_BACK);
EnDragon_SetupRetreatOrIdle(this);
} else if (this->state == DEEP_PYTHON_EXTEND_STATE_NOT_FULLY_EXTENDED) {
Vec3f extendedPos;
Math_Vec3f_Copy(&extendedPos, &this->burrowEntrancePos);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_UTSUBO_APPEAR - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_UTSUBO_APPEAR - SFX_FLAG);
extendedPos.x += Math_SinS(this->actor.world.rot.y) * -530.0f;
extendedPos.z += Math_CosS(this->actor.world.rot.y) * -530.0f;
- this->actor.speedXZ = 40.0f;
+ this->actor.speed = 40.0f;
Math_SmoothStepToS(&this->jawZRotation, 0xFA0, 5, 0xBB8, 0x14);
if ((fabsf(this->actor.world.pos.x - extendedPos.x) < 51.0f) &&
(fabsf(this->actor.world.pos.z - extendedPos.z) < 51.0f)) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
Math_ApproachF(&this->actor.world.pos.x, extendedPos.x, 0.3f, 50.0f);
Math_ApproachF(&this->actor.world.pos.z, extendedPos.z, 0.3f, 50.0f);
if ((fabsf(this->actor.world.pos.x - extendedPos.x) < 4.0f) &&
@@ -409,7 +416,7 @@ void EnDragon_Extend(EnDragon* this, PlayState* play) {
Math_SmoothStepToS(&this->jawZRotation, 0, 5, 0xBB8, 0x14);
SkelAnime_Update(&this->skelAnime);
if (this->state == DEEP_PYTHON_EXTEND_STATE_FULLY_EXTENDED) {
- if (currentFrame < this->endFrame) {
+ if (curFrame < this->animEndFrame) {
return;
}
@@ -419,7 +426,7 @@ void EnDragon_Extend(EnDragon* this, PlayState* play) {
yaw = ABS_ALT(BINANG_SUB(Math_Vec3f_Yaw(&this->jawPos, &player->actor.world.pos), this->actor.shape.rot.y));
if (yaw < 0x5000) {
// Player is in front of the jaw
- if ((this->endFrame <= currentFrame) && (this->largeSwayWaitTimer == 0)) {
+ if ((curFrame >= this->animEndFrame) && (this->largeSwayWaitTimer == 0)) {
if (this->animIndex != DEEP_PYTHON_ANIM_LARGE_SIDE_SWAY) {
EnDragon_ChangeAnim(this, DEEP_PYTHON_ANIM_LARGE_SIDE_SWAY);
}
@@ -432,14 +439,14 @@ void EnDragon_Extend(EnDragon* this, PlayState* play) {
// Player is in behind the jaw
if (this->state == DEEP_PYTHON_EXTEND_STATE_REPEAT_LARGE_SWAY) {
EnDragon_ChangeAnim(this, DEEP_PYTHON_ANIM_SMALL_SIDE_SWAY);
- this->largeSwayWaitTimer = Rand_ZeroFloat(20.0f) + this->endFrame;
+ this->largeSwayWaitTimer = Rand_ZeroFloat(20.0f) + this->animEndFrame;
this->state = DEEP_PYTHON_EXTEND_STATE_REPEAT_SMALL_SWAY;
}
this->behindJawRetreatTimer++;
if (this->behindJawRetreatTimer > 60) {
this->action = DEEP_PYTHON_ACTION_RETREAT;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_UTSUBO_BACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_UTSUBO_BACK);
EnDragon_SetupRetreatOrIdle(this);
}
}
@@ -447,7 +454,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 +465,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 +503,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) {
@@ -513,7 +520,7 @@ void EnDragon_Grab(EnDragon* this, PlayState* play) {
pos.z += Math_CosS(this->actor.world.rot.y) * -930.0f;
Math_Vec3f_Copy(&this->actor.world.pos, &pos);
this->jawZRotation = 0x1450;
- this->actor.speedXZ = 60.0f;
+ this->actor.speed = 60.0f;
}
this->grabTimer++;
@@ -535,15 +542,15 @@ 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;
}
play->unk_18770(play, player);
player->actor.parent = &this->actor;
- player->unk_AE8 = 50;
+ player->actionVar2 = 50;
this->action = DEEP_PYTHON_ACTION_GRAB;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_UTSUBO_EAT);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_UTSUBO_EAT);
EnDragon_SetupAttack(this);
}
}
@@ -561,7 +568,7 @@ void EnDragon_SetupAttack(EnDragon* this) {
void EnDragon_Attack(EnDragon* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- f32 currentFrame = this->skelAnime.curFrame;
+ f32 curFrame = this->skelAnime.curFrame;
Vec3f pos; // used as both the extended position and the camera eye
Vec3f subCamAt;
@@ -572,8 +579,8 @@ void EnDragon_Attack(EnDragon* this, PlayState* play) {
//! @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
- func_800B8E58((Player*)this, player->ageProperties->voiceSfxIdOffset + NA_SE_VO_LI_DAMAGE_S);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_UTSUBO_BITE);
+ Player_PlaySfx((Player*)&this->actor, player->ageProperties->voiceSfxIdOffset + NA_SE_VO_LI_DAMAGE_S);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_UTSUBO_BITE);
CollisionCheck_GreenBlood(play, NULL, &player->actor.world.pos);
}
@@ -602,8 +609,8 @@ void EnDragon_Attack(EnDragon* this, PlayState* play) {
Math_ApproachF(&this->actor.world.pos.y, pos.y, 0.3f, 200.0f);
Math_ApproachF(&this->actor.world.pos.z, pos.z, 0.3f, 200.0f);
- if ((this->state <= DEEP_PYTHON_ATTACK_STATE_START) && (this->endFrame <= currentFrame)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_UTSUBO_BITE);
+ if ((this->state <= DEEP_PYTHON_ATTACK_STATE_START) && (curFrame >= this->animEndFrame)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_UTSUBO_BITE);
if (this->animIndex != DEEP_PYTHON_ANIM_LARGE_SIDE_SWAY) {
EnDragon_ChangeAnim(this, DEEP_PYTHON_ANIM_LARGE_SIDE_SWAY);
}
@@ -611,20 +618,20 @@ void EnDragon_Attack(EnDragon* this, PlayState* play) {
this->state++;
}
- if (((this->state != DEEP_PYTHON_ATTACK_STATE_START) && (this->endFrame <= currentFrame)) ||
+ if (((this->state != DEEP_PYTHON_ATTACK_STATE_START) && (curFrame >= this->animEndFrame)) ||
(!(player->stateFlags2 & PLAYER_STATE2_80)) || ((this->collider.elements[0].info.bumperFlags & BUMP_HIT)) ||
(this->collider.elements[1].info.bumperFlags & BUMP_HIT) ||
(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;
+ player->actionVar2 = 100;
}
this->actor.flags &= ~ACTOR_FLAG_100000;
- if ((this->state != DEEP_PYTHON_ATTACK_STATE_START) && (this->endFrame <= currentFrame)) {
+ if ((this->state != DEEP_PYTHON_ATTACK_STATE_START) && (curFrame >= this->animEndFrame)) {
this->timer = 3;
this->actionFunc = EnDragon_RetreatOnceTimerEnds;
} else {
@@ -634,11 +641,11 @@ 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);
- this->endFrame = Animation_GetLastFrame(&gDeepPythonSmallSideSwayAnim);
+ CutsceneManager_StartWithPlayerCs(this->deathCsId, &this->actor);
+ this->animEndFrame = Animation_GetLastFrame(&gDeepPythonSmallSideSwayAnim);
Animation_Change(&this->skelAnime, &gDeepPythonSmallSideSwayAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f);
this->timer = 20;
this->actionFunc = EnDragon_Dead;
@@ -655,7 +662,7 @@ void EnDragon_Dead(EnDragon* this, PlayState* play) {
if ((this->timer != 0) && (fabsf(this->actor.world.pos.x - this->actor.home.pos.x) > 121.0f) &&
(fabsf(this->actor.world.pos.z - this->actor.home.pos.z) > 121.0f)) {
- this->actor.speedXZ = -120.0f;
+ this->actor.speed = -120.0f;
if (((this->pythonIndex & 1) == 0) && (Rand_ZeroOne() < 0.5f)) {
//! @bug: !play->gameplayFrames is 0 essentially all the time, so this code never runs.
if (((!play->gameplayFrames) & 0x1F)) {
@@ -667,7 +674,7 @@ void EnDragon_Dead(EnDragon* this, PlayState* play) {
return;
}
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if ((fabsf(this->actor.world.pos.x - this->actor.home.pos.x) > 20.0f) &&
(fabsf(this->actor.world.pos.z - this->actor.home.pos.z) > 20.0f)) {
Math_ApproachF(&this->actor.world.pos.x, this->actor.home.pos.x, 0.3f, 300.0f);
@@ -682,8 +689,9 @@ 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,
- this->actor.unk20, NULL)) {
+ seahorsePos.z, 0, this->actor.shape.rot.y, 0,
+ SEAHORSE_PARAMS(SEAHORSE_TYPE_1, 0, 0), this->actor.csId,
+ this->actor.halfDaysBits, NULL)) {
SET_WEEKEVENTREG(WEEKEVENTREG_13_01);
switch (this->pythonIndex) {
case 0:
@@ -725,7 +733,7 @@ void EnDragon_Dead(EnDragon* this, PlayState* play) {
void EnDragon_UpdateDamage(EnDragon* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- u32 sp30;
+ PlayerImpactType playerImpactType;
if (this->action == DEEP_PYTHON_ACTION_EXTEND) {
if ((this->collider.elements[2].info.bumperFlags & BUMP_HIT) ||
@@ -735,15 +743,15 @@ void EnDragon_UpdateDamage(EnDragon* this, PlayState* play) {
(this->collider.elements[6].info.bumperFlags & BUMP_HIT) ||
(this->collider.elements[7].info.bumperFlags & BUMP_HIT)) {
Actor_ApplyDamage(&this->actor);
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 25);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 25);
if (this->actor.colChkInfo.health > 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_UTSUBO_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_UTSUBO_DAMAGE);
this->action = DEEP_PYTHON_ACTION_DAMAGE;
} else {
Enemy_StartFinishingBlow(play, &this->actor);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_UTSUBO_DEAD);
- this->actor.flags |= ACTOR_FLAG_8000000;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_UTSUBO_DEAD);
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.flags |= ACTOR_FLAG_100000;
this->action = DEEP_PYTHON_ACTION_SETUP_DEAD;
this->actionFunc = EnDragon_SetupDead;
@@ -753,8 +761,9 @@ 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))) {
- this->actor.speedXZ = 0.0f;
+ !((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;
this->actionFunc = EnDragon_SetupGrab;
@@ -834,8 +843,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..fa0979389 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,14 +47,13 @@ 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
/* 0x2CC */ s16 unk_2CC; // Initialized, but never used
- /* 0x2CE */ UNK_TYPE1 unk_2CE[0x2];
- /* 0x2D0 */ f32 endFrame;
+ /* 0x2D0 */ f32 animEndFrame;
/* 0x2D4 */ f32 scale;
/* 0x2D8 */ UNK_TYPE1 unk_2D8[0x4];
/* 0x2DC */ ColliderJntSph collider;
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..a521abaa0 100644
--- a/src/overlays/actors/ovl_En_Drs/z_en_drs.c
+++ b/src/overlays/actors/ovl_En_Drs/z_en_drs.c
@@ -51,7 +51,14 @@ static ColliderCylinderInit sCylinderInit = {
static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE };
-static AnimationInfoS sAnimationInfo = { &gWeddingDressMannequinIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 };
+typedef enum {
+ /* 0 */ WEDDING_DRESS_MANNEQUIN_ANIM_IDLE,
+ /* 1 */ WEDDING_DRESS_MANNEQUIN_ANIM_MAX
+} WeddingDressMannequinAnimation;
+
+static AnimationInfoS sAnimationInfo[WEDDING_DRESS_MANNEQUIN_ANIM_MAX] = {
+ { &gWeddingDressMannequinIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // WEDDING_DRESS_MANNEQUIN_ANIM_IDLE
+};
void EnDrs_CollisionUpdate(EnDrs* this, PlayState* play) {
Collider_UpdateCylinder(&this->actor, &this->collider);
@@ -65,7 +72,7 @@ void EnDrs_Setup(EnDrs* this, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, NULL, 0.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &gWeddingDressMannequinSkel, NULL, this->jointTable,
this->morphTable, WEDDING_DRESS_MANNEQUIN_LIMB_MAX);
- SubS_ChangeAnimationByInfoS(&this->skelAnime, &sAnimationInfo, 0);
+ SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, WEDDING_DRESS_MANNEQUIN_ANIM_IDLE);
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit);
Actor_SetScale(&this->actor, 0.01f);
@@ -110,9 +117,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);
+
+ gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[temp].segment);
gSPDisplayList(POLY_OPA_DISP++, &gMoonMaskDL);
- gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[temp2].segment);
+ gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[temp2].segment);
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
@@ -120,7 +129,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..8287c0680 100644
--- a/src/overlays/actors/ovl_En_Ds2n/z_en_ds2n.c
+++ b/src/overlays/actors/ovl_En_Ds2n/z_en_ds2n.c
@@ -9,7 +9,7 @@
#include "z_en_ds2n.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
#define THIS ((EnDs2n*)thisx)
@@ -32,23 +32,24 @@ ActorInit En_Ds2n_InitVars = {
(ActorFunc)EnDs2n_Draw,
};
-static AnimationInfo sAnimationInfo[] = {
- { &gDs2nIdleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f },
+typedef enum {
+ /* 0 */ ENDS2N_ANIM_IDLE,
+ /* 1 */ ENDS2N_ANIM_MAX
+} EnDs2nAnimation;
+
+static AnimationInfo sAnimationInfo[ENDS2N_ANIM_MAX] = {
+ { &gDs2nIdleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENDS2N_ANIM_IDLE
};
-static Vec3f sZeroVec = { 0, 0, 0 };
-
-static TexturePtr sEyeTextures[] = { gDs2nEyeOpenTex, gDs2nEyeHalfTex, gDs2nEyeClosedTex };
-
void EnDs2n_SetupIdle(EnDs2n* this) {
this->blinkTimer = 20;
this->blinkState = 0;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENDS2N_ANIM_IDLE);
this->actionFunc = EnDs2n_Idle;
}
void EnDs2n_Idle(EnDs2n* this, PlayState* play) {
- SubS_FillLimbRotTables(play, this->limbRotTableY, this->limbRotTableZ, DS2N_LIMB_MAX);
+ SubS_UpdateFidgetTables(play, this->fidgetTableY, this->fidgetTableZ, DS2N_LIMB_MAX);
}
void EnDs2n_UpdateEyes(EnDs2n* this) {
@@ -70,7 +71,7 @@ void EnDs2n_Init(Actor* thisx, PlayState* play) {
EnDs2n* this = THIS;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 20.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &gDs2nSkeleton, &gDs2nIdleAnim, NULL, NULL, 0);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gDs2nSkel, &gDs2nIdleAnim, NULL, NULL, 0);
EnDs2n_SetupIdle(this);
}
@@ -103,12 +104,12 @@ s32 EnDs2n_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
void EnDs2n_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnDs2n* this = THIS;
- Vec3f focusOffset = sZeroVec;
+ Vec3f focusOffset = { 0.0f, 0.0f, 0.0f };
if ((limbIndex == DS2N_LIMB_HIPS) || (limbIndex == DS2N_LIMB_LEFT_UPPER_ARM) ||
(limbIndex == DS2N_LIMB_RIGHT_UPPER_ARM)) {
- rot->y += (s16)Math_SinS(this->limbRotTableY[limbIndex]) * 0xC8;
- rot->z += (s16)Math_CosS(this->limbRotTableZ[limbIndex]) * 0xC8;
+ rot->y += (s16)Math_SinS(this->fidgetTableY[limbIndex]) * 200;
+ rot->z += (s16)Math_CosS(this->fidgetTableZ[limbIndex]) * 200;
}
if (limbIndex == DS2N_LIMB_HEAD) {
@@ -116,12 +117,14 @@ void EnDs2n_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot
}
}
+static TexturePtr sEyeTextures[] = { gDs2nEyeOpenTex, gDs2nEyeHalfTex, gDs2nEyeClosedTex };
+
void EnDs2n_Draw(Actor* thisx, PlayState* play) {
EnDs2n* 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(sEyeTextures[this->blinkState]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sEyeTextures[this->blinkState]));
diff --git a/src/overlays/actors/ovl_En_Ds2n/z_en_ds2n.h b/src/overlays/actors/ovl_En_Ds2n/z_en_ds2n.h
index f2a6c0725..4e759be0b 100644
--- a/src/overlays/actors/ovl_En_Ds2n/z_en_ds2n.h
+++ b/src/overlays/actors/ovl_En_Ds2n/z_en_ds2n.h
@@ -13,8 +13,8 @@ typedef struct EnDs2n {
/* 0x144 */ ColliderCylinder collider; // unused
/* 0x190 */ SkelAnime skelAnime;
/* 0x1D4 */ EnDs2nActionFunc actionFunc;
- /* 0x1D8 */ s16 limbRotTableY[DS2N_LIMB_MAX];
- /* 0x1FE */ s16 limbRotTableZ[DS2N_LIMB_MAX];
+ /* 0x1D8 */ s16 fidgetTableY[DS2N_LIMB_MAX];
+ /* 0x1FE */ s16 fidgetTableZ[DS2N_LIMB_MAX];
/* 0x224 */ Vec3s headRot;
/* 0x22A */ Vec3s chestRot; // set by function, but not applied in limbdraw
/* 0x230 */ s16 blinkState;
diff --git a/src/overlays/actors/ovl_En_Dt/z_en_dt.c b/src/overlays/actors/ovl_En_Dt/z_en_dt.c
index 0ac7dcb4b..e82d6d6e3 100644
--- a/src/overlays/actors/ovl_En_Dt/z_en_dt.c
+++ b/src/overlays/actors/ovl_En_Dt/z_en_dt.c
@@ -6,7 +6,7 @@
#include "z_en_dt.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnDt*)thisx)
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 dfd97196a..b8dea95a0 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
@@ -16,8 +16,8 @@ void EnDyExtra_Destroy(Actor* thisx, PlayState* play);
void EnDyExtra_Update(Actor* thisx, PlayState* play);
void EnDyExtra_Draw(Actor* thisx, PlayState* play);
-void func_80A61334(EnDyExtra* this, PlayState* play);
-void func_80A613C8(EnDyExtra* this, PlayState* play);
+void EnDyExtra_WaitForTrigger(EnDyExtra* this, PlayState* play);
+void EnDyExtra_Fall(EnDyExtra* this, PlayState* play);
ActorInit En_Dy_Extra_InitVars = {
ACTOR_EN_DY_EXTRA,
@@ -41,35 +41,35 @@ void EnDyExtra_Init(Actor* thisx, PlayState* play) {
this->actor.scale.x = 0.025f;
this->actor.scale.y = 0.039f;
this->actor.scale.z = 0.025f;
- this->unk160 = this->actor.world.pos;
+ this->initPos = this->actor.world.pos;
this->actor.gravity = -0.2f;
- this->unk150 = 1.0f;
- this->unk14C = 0x3C;
- this->actionFunc = func_80A61334;
+ this->alphaScale = 1.0f;
+ this->timer = 60;
+ this->actionFunc = EnDyExtra_WaitForTrigger;
}
-void func_80A61334(EnDyExtra* this, PlayState* play) {
+void EnDyExtra_WaitForTrigger(EnDyExtra* this, PlayState* play) {
Math_ApproachF(&this->actor.gravity, 0.0f, 0.1f, 0.005f);
if (this->actor.world.pos.y < -85.0f) {
this->actor.velocity.y = 0.0f;
}
- if (this->unk14C == 0 && this->unk14A != 0) {
- this->unk14C = 0x32;
- this->actionFunc = func_80A613C8;
+ if ((this->timer == 0) && this->trigger) {
+ this->timer = 50;
+ this->actionFunc = EnDyExtra_Fall;
}
}
-void func_80A613C8(EnDyExtra* this, PlayState* play) {
+void EnDyExtra_Fall(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->timer == 0) || (this->alphaScale < 0.02f)) {
Actor_Kill(&this->actor);
return;
}
- this->unk150 -= 0.02f;
+ this->alphaScale -= 0.02f;
if (this->actor.world.pos.y < -85.0f) {
this->actor.velocity.y = 0.0f;
@@ -79,51 +79,55 @@ void func_80A613C8(EnDyExtra* this, PlayState* play) {
void EnDyExtra_Update(Actor* thisx, PlayState* play) {
EnDyExtra* this = THIS;
- DECR(this->unk14C);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_PL_SPIRAL_HEAL_BEAM - SFX_FLAG);
+ DECR(this->timer);
+ Actor_PlaySfx(&this->actor, NA_SE_PL_SPIRAL_HEAL_BEAM - SFX_FLAG);
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
}
+static Color_RGBA8 sPrimColors[] = {
+ { 255, 255, 170, 255 }, { 255, 170, 255, 255 }, { 255, 255, 170, 255 },
+ { 170, 255, 255, 255 }, { 255, 255, 170, 255 },
+};
+
+static Color_RGBA8 sEnvColors[] = {
+ { 255, 100, 0, 255 }, { 255, 0, 100, 255 }, { 100, 255, 0, 255 }, { 0, 100, 255, 255 }, { 255, 230, 0, 255 }
+};
+
+static u8 sAlphaTypeIndices[] = {
+ 2, 1, 1, 2, 0, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 1, 2, 0,
+};
+
void EnDyExtra_Draw(Actor* thisx, PlayState* play) {
- static Color_RGBA8 D_80A61740[] = {
- { 255, 255, 170, 255 }, { 255, 170, 255, 255 }, { 255, 255, 170, 255 },
- { 170, 255, 255, 255 }, { 255, 255, 170, 255 },
- };
- static Color_RGBA8 D_80A61754[] = {
- { 255, 100, 0, 255 }, { 255, 0, 100, 255 }, { 100, 255, 0, 255 }, { 0, 100, 255, 255 }, { 255, 230, 0, 255 }
- };
- static u8 D_80A61768[] = { 0x02, 0x01, 0x01, 0x02, 0x00, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01,
- 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x01, 0x02, 0x00, 0x00 };
- EnDyExtra* this = THIS;
s32 pad;
+ EnDyExtra* this = THIS;
GraphicsContext* gfxCtx = play->state.gfxCtx;
- Vtx* vertices = Lib_SegmentedToVirtual(object_dy_obj_Vtx_00DD40);
+ Vtx* vertices = Lib_SegmentedToVirtual(gGreatFairySpiralBeamVtx);
s32 i;
- u8 unk[3];
+ u8 alphas[3];
- unk[0] = 0.0f;
- unk[1] = (s8)(this->unk150 * 240.0f);
- unk[2] = (s8)(this->unk150 * 255.0f);
+ alphas[0] = 0.0f;
+ alphas[1] = (s32)(this->alphaScale * 240.0f);
+ alphas[2] = (s32)(this->alphaScale * 255.0f);
- for (i = 0; i < 27; i++) {
- if (D_80A61768[i]) {
- vertices[i].v.cn[3] = unk[D_80A61768[i]];
+ for (i = 0; i < ARRAY_COUNT(sAlphaTypeIndices); i++) {
+ if (sAlphaTypeIndices[i]) {
+ vertices[i].v.cn[3] = alphas[sAlphaTypeIndices[i]];
}
}
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));
gDPPipeSync(POLY_XLU_DISP++);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, D_80A61740[this->type].r, D_80A61740[this->type].g,
- D_80A61740[this->type].b, 255);
- gDPSetEnvColor(POLY_XLU_DISP++, D_80A61754[this->type].r, D_80A61754[this->type].g, D_80A61754[this->type].b, 128);
- gSPDisplayList(POLY_XLU_DISP++, object_dy_obj_DL_00DEF0);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, sPrimColors[this->type].r, sPrimColors[this->type].g,
+ sPrimColors[this->type].b, 255);
+ gDPSetEnvColor(POLY_XLU_DISP++, sEnvColors[this->type].r, sEnvColors[this->type].g, sEnvColors[this->type].b, 128);
+ gSPDisplayList(POLY_XLU_DISP++, gGreatFairySpiralBeamDL);
CLOSE_DISPS(gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.h b/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.h
index 0e5d8614b..f36b12051 100644
--- a/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.h
+++ b/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.h
@@ -11,12 +11,11 @@ typedef struct EnDyExtra {
/* 0x000 */ Actor actor;
/* 0x144 */ EnDyExtraActionFunc actionFunc;
/* 0x148 */ s16 type;
- /* 0x14A */ s16 unk14A;
- /* 0x14C */ s16 unk14C;
- /* 0x14E */ s16 unk14E;
- /* 0x150 */ f32 unk150;
- /* 0x154 */ UNK_TYPE1 unk154[0xC];
- /* 0x160 */ Vec3f unk160;
+ /* 0x14A */ s16 trigger;
+ /* 0x14C */ s16 timer;
+ /* 0x150 */ f32 alphaScale;
+ /* 0x154 */ Vec3f scale; // not used, leftover from OoT
+ /* 0x160 */ Vec3f initPos; // set and not used
} EnDyExtra; // size = 0x16C
#endif // Z_EN_DY_EXTRA_H
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 de26515fa..bd9949c61 100644
--- a/src/overlays/actors/ovl_En_Egblock/z_en_egblock.c
+++ b/src/overlays/actors/ovl_En_Egblock/z_en_egblock.c
@@ -7,13 +7,13 @@
#include "z_en_egblock.h"
#include "objects/object_eg/object_eg.h"
-#define FLAGS (ACTOR_FLAG_8000000)
+#define FLAGS (ACTOR_FLAG_CANT_LOCK_ON)
#define THIS ((EnEgblock*)thisx)
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 f115ada7c..775a14eb5 100644
--- a/src/overlays/actors/ovl_En_Egol/z_en_egol.c
+++ b/src/overlays/actors/ovl_En_Egol/z_en_egol.c
@@ -7,11 +7,12 @@
#include "z_en_egol.h"
#include "objects/object_eg/object_eg.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#include "overlays/actors/ovl_En_Estone/z_en_estone.h"
#include "overlays/actors/ovl_En_Arrow/z_en_arrow.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
+#include "overlays/actors/ovl_En_Estone/z_en_estone.h"
#include "overlays/effects/ovl_Effect_Ss_Hitmark/z_eff_ss_hitmark.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_80000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_80000000)
#define THIS ((EnEgol*)thisx)
@@ -37,34 +38,15 @@ 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 {
- /* 0 */ EYEGORE_ANIM_STAND,
- /* 1 */ EYEGORE_ANIM_WALK,
- /* 2 */ EYEGORE_ANIM_SLAM,
- /* 3 */ EYEGORE_ANIM_SLAM_WAIT,
- /* 4 */ EYEGORE_ANIM_SLAM_END,
- /* 5 */ EYEGORE_ANIM_DAMAGED,
- /* 6 */ EYEGORE_ANIM_DEATH,
- /* 7 */ EYEGORE_ANIM_LASER,
- /* 8 */ EYEGORE_ANIM_LASER_END, // unused
- /* 9 */ EYEGORE_ANIM_STUNNED,
- /* 10 */ EYEGORE_ANIM_STUN_END,
- /* 11 */ EYEGORE_ANIM_RETREAT,
- /* 12 */ EYEGORE_ANIM_SIT,
- /* 13 */ EYEGORE_ANIM_LEFT_PUNCH,
- /* 14 */ EYEGORE_ANIM_RIGHT_PUNCH,
- /* 15 */ EYEGORE_ANIM_MAX,
-} EnEgolAnimation;
-
typedef enum {
/* 0 */ EYEGORE_LASER_OFF,
/* 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 +220,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 = {
@@ -305,42 +287,85 @@ ActorInit En_Egol_InitVars = {
(ActorFunc)EnEgol_Draw,
};
-void EnEgol_ChangeAnim(EnEgol* this, s32 animation) {
- static AnimationHeader* sAnimations[EYEGORE_ANIM_MAX] = {
- &gEyegoreStandAnim, &gEyegoreWalkAnim, &gEyegoreSlamAnim,
- &gEyegoreSlamWaitAnim, &gEyegoreSlamEndAnim, &gEyegoreDamagedAnim,
- &gEyegoreDeathAnim, &gEyegoreLaserAnim, &gEyegoreUnusedLaserEndAnim,
- &gEyegoreStunnedAnim, &gEyegoreStunEndAnim, &gEyegoreRetreatAnim,
- &gEyegoreSitAnim, &gEyegoreLeftPunchAnim, &gEyegoreRightPunchAnim,
- };
- static u8 sAnimModes[EYEGORE_ANIM_MAX] = {
- ANIMMODE_ONCE, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_ONCE, ANIMMODE_ONCE,
- ANIMMODE_ONCE, ANIMMODE_ONCE, ANIMMODE_ONCE, ANIMMODE_ONCE, ANIMMODE_ONCE,
- ANIMMODE_ONCE, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_ONCE, ANIMMODE_ONCE,
- };
- this->animation = animation;
- this->animEndFrame = Animation_GetLastFrame(sAnimations[this->animation]);
- Animation_Change(&this->skelAnime, sAnimations[this->animation], 1.0f, 0.0f, this->animEndFrame,
- sAnimModes[this->animation], 0.0f);
+typedef enum {
+ /* 0 */ EYEGORE_ANIM_STAND,
+ /* 1 */ EYEGORE_ANIM_WALK,
+ /* 2 */ EYEGORE_ANIM_SLAM,
+ /* 3 */ EYEGORE_ANIM_SLAM_WAIT,
+ /* 4 */ EYEGORE_ANIM_SLAM_END,
+ /* 5 */ EYEGORE_ANIM_DAMAGED,
+ /* 6 */ EYEGORE_ANIM_DEATH,
+ /* 7 */ EYEGORE_ANIM_LASER,
+ /* 8 */ EYEGORE_ANIM_LASER_END, // unused
+ /* 9 */ EYEGORE_ANIM_STUNNED,
+ /* 10 */ EYEGORE_ANIM_STUN_END,
+ /* 11 */ EYEGORE_ANIM_RETREAT,
+ /* 12 */ EYEGORE_ANIM_SIT,
+ /* 13 */ EYEGORE_ANIM_LEFT_PUNCH,
+ /* 14 */ EYEGORE_ANIM_RIGHT_PUNCH,
+ /* 15 */ EYEGORE_ANIM_MAX
+} EnEgolAnimation;
+
+static AnimationHeader* sAnimations[EYEGORE_ANIM_MAX] = {
+ &gEyegoreStandAnim, // EYEGORE_ANIM_STAND
+ &gEyegoreWalkAnim, // EYEGORE_ANIM_WALK
+ &gEyegoreSlamAnim, // EYEGORE_ANIM_SLAM
+ &gEyegoreSlamWaitAnim, // EYEGORE_ANIM_SLAM_WAIT
+ &gEyegoreSlamEndAnim, // EYEGORE_ANIM_SLAM_END
+ &gEyegoreDamagedAnim, // EYEGORE_ANIM_DAMAGED
+ &gEyegoreDeathAnim, // EYEGORE_ANIM_DEATH
+ &gEyegoreLaserAnim, // EYEGORE_ANIM_LASER
+ &gEyegoreUnusedLaserEndAnim, // EYEGORE_ANIM_LASER_END
+ &gEyegoreStunnedAnim, // EYEGORE_ANIM_STUNNED
+ &gEyegoreStunEndAnim, // EYEGORE_ANIM_STUN_END
+ &gEyegoreRetreatAnim, // EYEGORE_ANIM_RETREAT
+ &gEyegoreSitAnim, // EYEGORE_ANIM_SIT
+ &gEyegoreLeftPunchAnim, // EYEGORE_ANIM_LEFT_PUNCH
+ &gEyegoreRightPunchAnim, // EYEGORE_ANIM_RIGHT_PUNCH
+};
+
+static u8 sAnimationModes[EYEGORE_ANIM_MAX] = {
+ ANIMMODE_ONCE, // EYEGORE_ANIM_STAND
+ ANIMMODE_LOOP, // EYEGORE_ANIM_WALK
+ ANIMMODE_ONCE, // EYEGORE_ANIM_SLAM
+ ANIMMODE_ONCE, // EYEGORE_ANIM_SLAM_WAIT
+ ANIMMODE_ONCE, // EYEGORE_ANIM_SLAM_END
+ ANIMMODE_ONCE, // EYEGORE_ANIM_DAMAGED
+ ANIMMODE_ONCE, // EYEGORE_ANIM_DEATH
+ ANIMMODE_ONCE, // EYEGORE_ANIM_LASER
+ ANIMMODE_ONCE, // EYEGORE_ANIM_LASER_END
+ ANIMMODE_ONCE, // EYEGORE_ANIM_STUNNED
+ ANIMMODE_ONCE, // EYEGORE_ANIM_STUN_END
+ ANIMMODE_LOOP, // EYEGORE_ANIM_RETREAT
+ ANIMMODE_ONCE, // EYEGORE_ANIM_SIT
+ ANIMMODE_ONCE, // EYEGORE_ANIM_LEFT_PUNCH
+ ANIMMODE_ONCE, // EYEGORE_ANIM_RIGHT_PUNCH
+};
+
+void EnEgol_ChangeAnim(EnEgol* this, s32 animIndex) {
+ this->animIndex = animIndex;
+ this->animEndFrame = Animation_GetLastFrame(sAnimations[this->animIndex]);
+ Animation_Change(&this->skelAnime, sAnimations[this->animIndex], 1.0f, 0.0f, this->animEndFrame,
+ sAnimationModes[this->animIndex], 0.0f);
}
void EnEgol_FootstepEffects(EnEgol* this, PlayState* play, f32 leftFootFrame, f32 rightFootFrame) {
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_PlaySfxAtPos(&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;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_WALK);
+ 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);
@@ -384,7 +409,7 @@ void EnEgol_DestroyBlocks(EnEgol* this, PlayState* play, Vec3f pos1, Vec3f pos2)
dist2 = sqrtf(SQ(blockTo2.y));
if ((dist1 < 40.0f) || (dist2 < 40.0f)) {
prop->colChkInfo.health = 0;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_WALL_BROKEN);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_WALL_BROKEN);
break;
}
}
@@ -394,7 +419,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 +451,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 +470,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);
@@ -456,7 +481,7 @@ void EnEgol_Init(Actor* thisx, PlayState* play) {
EYEGORE_SET_SPH_DIM(this->bodyCollider.elements[4], 300, 200, 0, 25, 1.0f);
EYEGORE_SET_SPH_DIM(this->bodyCollider.elements[5], 2100, -300, 0, 37, 1.0f);
- this->switchFlag = EYEGORE_GET_SWITCH(&this->actor);
+ this->switchFlag = EYEGORE_GET_SWITCH_FLAG(&this->actor);
if (this->switchFlag == 0x7F) {
this->switchFlag = -1;
}
@@ -476,7 +501,7 @@ void EnEgol_Destroy(Actor* thisx, PlayState* play) {
}
void EnEgol_SetupWait(EnEgol* this) {
- this->actor.flags |= ACTOR_FLAG_8000000;
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
this->action = EYEGORE_ACTION_WAIT;
this->actionFunc = EnEgol_Wait;
}
@@ -493,9 +518,9 @@ void EnEgol_Wait(EnEgol* this, PlayState* play) {
void EnEgol_SetupStand(EnEgol* this) {
EnEgol_ChangeAnim(this, EYEGORE_ANIM_STAND);
- this->actor.flags &= ~ACTOR_FLAG_8000000;
+ this->actor.flags &= ~ACTOR_FLAG_CANT_LOCK_ON;
this->action = EYEGORE_ACTION_STAND;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EYEGOLE_STAND);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_STAND);
this->actionFunc = EnEgol_Stand;
}
@@ -610,8 +635,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) {
@@ -741,7 +765,7 @@ void EnEgol_Laser(EnEgol* this, PlayState* play) {
this->laserCount++;
}
} else if (this->laserState >= EYEGORE_LASER_FIRE) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EYEGOLE_BEAM - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_BEAM - SFX_FLAG);
if (this->laserState != EYEGORE_LASER_OFF) {
EnEgol_DestroyBlocks(this, play, this->laserCollider.dim.quad[0], this->laserCollider.dim.quad[1]);
}
@@ -755,7 +779,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,25 +788,25 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_EV_EXPLOSION);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_EXPLOSION);
func_800B31BC(play, &hitPos, 40, -2, 255, 20);
func_800BBFB0(play, &hitPos, 6.0f, 2, 120, 20, true);
@@ -855,7 +879,7 @@ void EnEgol_Stop(EnEgol* this, PlayState* play) {
this->isRetreating ^= true;
if (!this->isRetreating) {
EnEgol_ChangeAnim(this, EYEGORE_ANIM_SIT);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EYEGOLE_SIT);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_SIT);
this->laserCount = 0;
this->actionFunc = EnEgol_Wait;
} else {
@@ -880,16 +904,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_PlaySfxAtPos(&this->actor, NA_SE_EV_EXPLOSION);
- quakeSize = 4 - (s32)(dyToPlayer * 0.02f);
- if (quakeSize > 4) {
- quakeSize = 4;
- } else if (quakeSize < 1) {
- quakeSize = 1;
+ Actor_PlaySfx(&this->actor, NA_SE_EV_EXPLOSION);
+ 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;
@@ -909,7 +933,7 @@ void EnEgol_Slam(EnEgol* this, PlayState* play) {
}
EnEgol_DestroyBlocks(this, play, this->rightHandPos, this->leftHandPos);
}
- if (this->animEndFrame <= curFrame) {
+ if (curFrame >= this->animEndFrame) {
EnEgol_SetupSlamWait(this);
} else if ((this->skelAnime.curFrame <= 17.0f) && (this->skelAnime.curFrame >= 10.0f)) {
CollisionCheck_SetAT(play, &play->colChkCtx, &this->bodyCollider.base);
@@ -1033,9 +1057,9 @@ void EnEgol_Damaged(EnEgol* this, PlayState* play) {
EnEgol_SetupWalk(this);
} else {
Enemy_StartFinishingBlow(play, &this->actor);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EYEGOLE_DEAD);
- this->actor.flags |= ACTOR_FLAG_8000000;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_DEAD);
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.flags |= ACTOR_FLAG_100000;
this->actionFunc = EnEgol_StartDeathCutscene;
}
@@ -1043,11 +1067,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 +1088,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,20 +1099,20 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_EV_EXPLOSION);
- func_800BC848(&this->actor, play, 10, 5);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_EXPLOSION);
+ Actor_RequestQuakeAndRumble(&this->actor, play, 10, 5);
}
if ((curFrame >= this->animEndFrame) && (this->action != EYEGORE_ACTION_DEAD)) {
s32 i;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->actor.world.pos.x, this->actor.world.pos.y,
- this->actor.world.pos.z, 0, 0, 0, CLEAR_TAG_SMALL_EXPLOSION);
+ this->actor.world.pos.z, 0, 0, 0, CLEAR_TAG_PARAMS(CLEAR_TAG_SMALL_EXPLOSION));
this->waitTimer = 30;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_BOMB_EXPLOSION);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_BOMB_EXPLOSION);
this->action = EYEGORE_ACTION_DEAD;
for (i = 0; i < 20; i++) {
EnEgol_SpawnEffect(this, &this->actor.world.pos, &gZeroVec3s, 10.0f + Rand_ZeroFloat(20.0f),
@@ -1101,7 +1125,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) {
@@ -1129,7 +1153,7 @@ void EnEgol_CollisionCheck(EnEgol* this, PlayState* play) {
if ((this->action == EYEGORE_ACTION_STUNNED) || (this->action == EYEGORE_ACTION_SLAM_WAIT)) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->actor.focus.pos.x,
this->actor.focus.pos.y, this->actor.focus.pos.z, 0, 0, 0,
- CLEAR_TAG_LARGE_LIGHT_RAYS);
+ CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
this->dmgEffectTimer = 20;
reaction = EYEGORE_HIT_DAMAGE;
} else if ((this->action >= EYEGORE_ACTION_WALK) && (this->action <= EYEGORE_ACTION_STUN_END) &&
@@ -1145,8 +1169,9 @@ void EnEgol_CollisionCheck(EnEgol* this, PlayState* play) {
Math_Vec3f_Copy(&this->laserCollider.dim.quad[3], &this->laserBase);
Math_Vec3f_Copy(&this->laserCollider.dim.quad[0], &this->laserBase);
Math_Vec3f_Copy(&this->laserCollider.dim.quad[2], &this->laserBase);
- Actor_SetColorFilter(&this->actor, 0, 120, false, 40);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 120, COLORFILTER_BUFFLAG_OPA,
+ 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
EnEgol_SetupStunned(this);
}
}
@@ -1167,8 +1192,8 @@ void EnEgol_CollisionCheck(EnEgol* this, PlayState* play) {
CollisionCheck_BlueBlood(play, NULL, &this->eyePos);
CollisionCheck_BlueBlood(play, NULL, &this->eyePos);
CollisionCheck_BlueBlood(play, NULL, &this->eyePos);
- Actor_SetColorFilter(&this->actor, 0x4000, 255, false, 25);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EYEGOLE_DAMAGE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 25);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_DAMAGE);
EnEgol_SetupDamaged(this);
} else if (reaction == EYEGORE_HIT_IMMUNE) {
Vec3f hitPos;
@@ -1176,7 +1201,7 @@ void EnEgol_CollisionCheck(EnEgol* this, PlayState* play) {
hitPos.x = this->eyeCollider.elements[0].info.bumper.hitPos.x;
hitPos.y = this->eyeCollider.elements[0].info.bumper.hitPos.y;
hitPos.z = this->eyeCollider.elements[0].info.bumper.hitPos.z;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_SHIELD_BOUND);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_SHIELD_BOUND);
EffectSsHitmark_SpawnFixedScale(play, EFFECT_HITMARK_METAL, &hitPos);
CollisionCheck_SpawnShieldParticlesMetal(play, &hitPos);
}
@@ -1195,10 +1220,10 @@ void EnEgol_Update(Actor* thisx, PlayState* play) {
if ((ABS_ALT(angleToFacing) > 0x1888) && (ABS_ALT(angleBehind) > 0x2000) &&
(this->actor.xzDistToPlayer < 100.0f)) {
if (angleToFacing < 0) {
- if (this->animation != EYEGORE_ANIM_LEFT_PUNCH) {
+ if (this->animIndex != EYEGORE_ANIM_LEFT_PUNCH) {
EnEgol_ChangeAnim(this, EYEGORE_ANIM_LEFT_PUNCH);
}
- } else if (this->animation != EYEGORE_ANIM_RIGHT_PUNCH) {
+ } else if (this->animIndex != EYEGORE_ANIM_RIGHT_PUNCH) {
EnEgol_ChangeAnim(this, EYEGORE_ANIM_RIGHT_PUNCH);
}
this->chargingLaser = false;
@@ -1267,7 +1292,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) {
@@ -1293,7 +1319,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))) {
@@ -1432,10 +1460,10 @@ void EnEgol_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot
(limbIndex == EYEGORE_LIMB_RIGHT_HAND) || (limbIndex == EYEGORE_LIMB_UPPER_EYELID) ||
(limbIndex == EYEGORE_LIMB_LOWER_EYELID) || (limbIndex == EYEGORE_LIMB_HIPS) ||
(limbIndex == EYEGORE_LIMB_LEFT_SHIN) || (limbIndex == EYEGORE_LIMB_RIGHT_SHIN)) {
- Matrix_MultZero(&this->limbPos[this->limbPosIndex]);
- this->limbPosIndex++;
- if (this->limbPosIndex >= ARRAY_COUNT(this->limbPos)) {
- this->limbPosIndex = 0;
+ Matrix_MultZero(&this->bodyPartsPos[this->bodyPartIndex]);
+ this->bodyPartIndex++;
+ if (this->bodyPartIndex >= EYEGORE_BODYPART_MAX) {
+ this->bodyPartIndex = 0;
}
}
Collider_UpdateSpheres(limbIndex, &this->bodyCollider);
@@ -1448,7 +1476,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,
@@ -1458,7 +1486,7 @@ void EnEgol_Draw(Actor* thisx, PlayState* play2) {
if (this->dmgEffectTimer != 0) {
f32 drawDmgEffAlpha = 0.05f * this->dmgEffectTimer;
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), 0.8f, 0.8f,
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, EYEGORE_BODYPART_MAX, 0.8f, 0.8f,
drawDmgEffAlpha, ACTOR_DRAW_DMGEFF_LIGHT_ORBS);
}
if (this->laserState >= EYEGORE_LASER_FIRE) {
@@ -1473,7 +1501,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;
@@ -1530,9 +1558,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);
@@ -1596,7 +1624,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..0861ce580 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_SWITCH(thisx) (((thisx)->params >> 6) & 0x7F)
+#define EYEGORE_GET_PATH_INDEX(thisx) ((thisx)->params & 0x3F)
+#define EYEGORE_GET_SWITCH_FLAG(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
@@ -27,6 +29,22 @@ typedef struct {
/* 0x38 */ f32 scale;
} EnEgolEffect; // size = 0x3C
+typedef enum EyegoreBodyPart {
+ /* 0 */ EYEGORE_BODYPART_0,
+ /* 1 */ EYEGORE_BODYPART_1,
+ /* 2 */ EYEGORE_BODYPART_2,
+ /* 3 */ EYEGORE_BODYPART_3,
+ /* 4 */ EYEGORE_BODYPART_4,
+ /* 5 */ EYEGORE_BODYPART_5,
+ /* 6 */ EYEGORE_BODYPART_6,
+ /* 7 */ EYEGORE_BODYPART_7,
+ /* 8 */ EYEGORE_BODYPART_8,
+ /* 9 */ EYEGORE_BODYPART_9,
+ /* 10 */ EYEGORE_BODYPART_10,
+ /* 11 */ EYEGORE_BODYPART_11,
+ /* 12 */ EYEGORE_BODYPART_MAX
+} EyegoreBodyPart;
+
typedef struct EnEgol {
/* 0x0000 */ Actor actor;
/* 0x0144 */ SkelAnime skelAnime;
@@ -41,10 +59,10 @@ typedef struct EnEgol {
/* 0x02B4 */ s16 headRot;
/* 0x02BA */ s16 switchFlag;
/* 0x02BC */ s16 dmgEffectTimer;
- /* 0x02C0 */ Vec3f limbPos[12];
- /* 0x0350 */ s16 limbPosIndex;
+ /* 0x02C0 */ Vec3f bodyPartsPos[EYEGORE_BODYPART_MAX];
+ /* 0x0350 */ s16 bodyPartIndex;
/* 0x0352 */ s16 pathIndex;
- /* 0x0354 */ s32 animation;
+ /* 0x0354 */ s32 animIndex;
/* 0x0358 */ u8 isRetreating;
/* 0x035C */ f32 animEndFrame;
/* 0x0360 */ f32 wakeupRange;
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 54d5c3210..53864ab9c 100644
--- a/src/overlays/actors/ovl_En_Elf/z_en_elf.c
+++ b/src/overlays/actors/ovl_En_Elf/z_en_elf.c
@@ -5,7 +5,6 @@
*/
#include "z_en_elf.h"
-#include "objects/gameplay_keep/gameplay_keep.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_2000000)
@@ -62,8 +61,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 +200,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 +215,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;
}
}
@@ -233,7 +234,7 @@ void func_8088C9CC(EnElf* this, PlayState* play) {
this->unk_244 = 2;
this->unk_248 = 0x400;
this->unk_254 = 2.0f;
- this->actor.speedXZ = 1.5f;
+ this->actor.speed = 1.5f;
this->unk_26C = func_8088C920;
this->unk_25C = (s32)Rand_ZeroFloat(8.0f) + 4;
} else {
@@ -262,7 +263,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,12 +292,12 @@ 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;
this->disappearTimer = 240;
- if ((this->fairyFlags & 0x400) && Flags_GetCollectible(play, this->unk_260)) {
+ if ((this->fairyFlags & 0x400) && Flags_GetCollectible(play, this->collectibleFlag)) {
Actor_Kill(&this->actor);
}
}
@@ -318,11 +319,11 @@ void EnElf_Init(Actor* thisx, PlayState* play2) {
EnElf* this = THIS;
Player* player = GET_PLAYER(play);
s32 colorConfig;
- s32 params;
+ s32 fairyType;
Actor_ProcessInitChain(thisx, sInitChain);
SkelAnime_Init(play, &this->skelAnime, &gameplay_keep_Skel_02AF58.sh, &gameplay_keep_Anim_029140, this->jointTable,
- this->morphTable, 7);
+ this->morphTable, FAIRY_LIMB_MAX);
ActorShape_Init(&thisx->shape, 0.0f, NULL, 15.0f);
thisx->shape.shadowAlpha = 255;
@@ -338,15 +339,15 @@ void EnElf_Init(Actor* thisx, PlayState* play2) {
this->unk_240 = 0.0f;
colorConfig = 0;
- this->unk_260 = ENELF_GET_FE00(&this->actor);
- params = ENELF_GET_F(&this->actor);
- if (thisx->params & 0x100) {
+ this->collectibleFlag = FAIRY_GET_COLLECTIBLE_FLAG(&this->actor);
+ fairyType = FAIRY_GET_TYPE(&this->actor);
+ if (FAIRY_GET_BOOL_PARAM(thisx)) {
this->fairyFlags |= 0x400;
}
- this->actor.params = params;
- switch (params) {
- case 0:
+ this->actor.params = fairyType;
+ switch (fairyType) {
+ case FAIRY_TYPE_0:
thisx->room = -1;
EnElf_SetupAction(this, func_8088E850);
func_8088C51C(this, 0);
@@ -355,13 +356,14 @@ 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;
- case 1:
+ case FAIRY_TYPE_1:
colorConfig = -1;
gSaveContext.jinxTimer = 0;
EnElf_SetupAction(this, func_8088E0F0);
@@ -373,7 +375,7 @@ void EnElf_Init(Actor* thisx, PlayState* play2) {
this->unk_250 = 0.0f;
break;
- case 5:
+ case FAIRY_TYPE_5:
colorConfig = -1;
EnElf_SetupAction(this, func_8088E484);
this->unk_254 = 0.0f;
@@ -384,7 +386,7 @@ void EnElf_Init(Actor* thisx, PlayState* play2) {
this->unk_250 = 7.0f;
break;
- case 7:
+ case FAIRY_TYPE_7:
this->fairyFlags |= 0x200;
thisx->shape.shadowDraw = ActorShadow_DrawWhiteCircle;
this->fairyFlags |= 0x100;
@@ -394,7 +396,7 @@ void EnElf_Init(Actor* thisx, PlayState* play2) {
func_8088CC48(this, play);
break;
- case 2:
+ case FAIRY_TYPE_2:
this->fairyFlags |= 0x100;
colorConfig = -1;
this->fairyFlags |= 0x800;
@@ -403,7 +405,7 @@ void EnElf_Init(Actor* thisx, PlayState* play2) {
func_8088CC48(this, play);
break;
- case 6:
+ case FAIRY_TYPE_6:
colorConfig = -1;
this->fairyFlags |= 0x800;
this->fairyFlags |= 0x2000;
@@ -411,25 +413,25 @@ void EnElf_Init(Actor* thisx, PlayState* play2) {
func_8088CC48(this, play);
break;
- case 9:
+ case FAIRY_TYPE_9:
this->fairyFlags |= 0x1000;
- case 10:
+ case FAIRY_TYPE_10:
colorConfig = -2;
func_8088CC48(this, play);
break;
- case 8:
+ case FAIRY_TYPE_8:
Actor_Kill(thisx);
return;
- case 3:
+ case FAIRY_TYPE_3:
colorConfig = Rand_ZeroFloat(11.99f) + 1.0f;
EnElf_SetupAction(this, func_8088E018);
func_8088C51C(this, 0);
break;
- case 4:
+ case FAIRY_TYPE_4:
EnElf_SetupAction(this, func_8088E0E0);
func_8088C51C(this, 6);
this->fairyFlags |= 8;
@@ -438,10 +440,13 @@ void EnElf_Init(Actor* thisx, PlayState* play2) {
for (i = 0; i < 8; i++) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELF, thisx->world.pos.x, thisx->world.pos.y - 30.0f,
- thisx->world.pos.z, 0, 0, 0, 6);
+ thisx->world.pos.z, 0, 0, 0, FAIRY_PARAMS(FAIRY_TYPE_6, false, 0));
}
}
break;
+
+ default:
+ break;
}
this->unk_23C = 3.0f;
@@ -558,9 +563,9 @@ void func_8088D9BC(EnElf* this, PlayState* play) {
Vec3f* vec = &this->unk_224;
if (this->fairyFlags & 0x4000) {
- Math_SmoothStepToF(&this->actor.speedXZ, 5.0f, 0.5f, 1.0f, 0.01f);
+ Math_SmoothStepToF(&this->actor.speed, 5.0f, 0.5f, 1.0f, 0.01f);
} else {
- Math_SmoothStepToF(&this->actor.speedXZ, this->unk_254, 0.2f, 0.5f, 0.01f);
+ Math_SmoothStepToF(&this->actor.speed, this->unk_254, 0.2f, 0.5f, 0.01f);
}
switch (this->unk_244) {
@@ -606,7 +611,7 @@ void func_8088DB4C(EnElf* this, Vec3f* arg1, f32 arg2, f32 arg3, f32 arg4) {
xzVelocity = sqrtf(SQ(xVelTarget) + SQ(zVelTarget));
clampedXZ = CLAMP(xzVelocity, arg2, arg3);
- this->actor.speedXZ = clampedXZ;
+ this->actor.speed = clampedXZ;
if ((xzVelocity != clampedXZ) && (xzVelocity != 0.0f)) {
xzVelocity = clampedXZ / xzVelocity;
@@ -635,9 +640,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,14 +654,14 @@ 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[PLAYER_BODYPART_WAIST].y;
}
func_8088D8D0(this, &this->unk_224);
func_8088D9BC(this, play);
if (Actor_HasParent(&this->actor, play)) {
if (this->fairyFlags & 0x400) {
- Flags_SetCollectible(play, this->unk_260);
+ Flags_SetCollectible(play, this->collectibleFlag);
}
Actor_Kill(&this->actor);
return;
@@ -669,24 +674,24 @@ 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;
this->unk_246 = 0;
EnElf_SetupAction(this, func_8088E0F0);
if (this->fairyFlags & 0x400) {
- Flags_SetCollectible(play, this->unk_260);
+ Flags_SetCollectible(play, this->collectibleFlag);
}
return;
}
@@ -700,7 +705,7 @@ void func_8088DD34(EnElf* this, PlayState* play) {
}
if (this->fairyFlags & 0x2000) {
- Actor_PickUp(&this->actor, play, GI_MAX, 80.0f, 60.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_MAX, 80.0f, 60.0f);
}
}
@@ -739,7 +744,7 @@ void func_8088E0F0(EnElf* this, PlayState* play) {
if (this->unk_250 < 2.0f) {
this->unk_250 += 0.1f;
} else {
- gSaveContext.healthAccumulator = 160;
+ gSaveContext.healthAccumulator = 0xA0;
this->unk_246++;
}
break;
@@ -768,7 +773,7 @@ void func_8088E0F0(EnElf* this, PlayState* play) {
this->unk_258 = Math_Atan2S_XY(this->actor.velocity.z, this->actor.velocity.x);
func_8088F5F4(this, play, 32);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_FIATY_HEAL - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FIATY_HEAL - SFX_FLAG);
}
void func_8088E304(EnElf* this, PlayState* play) {
@@ -802,7 +807,7 @@ void func_8088E304(EnElf* this, PlayState* play) {
func_8088D7F8(this, &player->bodyPartsPos[PLAYER_BODYPART_WAIST]);
this->unk_258 = Math_Atan2S_XY(this->actor.velocity.z, this->actor.velocity.x);
func_8088F5F4(this, play, 0x20);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_FIATY_HEAL - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FIATY_HEAL - SFX_FLAG);
}
void func_8088E484(EnElf* this, PlayState* play) {
@@ -827,7 +832,7 @@ void func_8088E484(EnElf* this, PlayState* play) {
Actor_SetScale(&this->actor, (1.0f - (SQ(this->unk_250) * SQ(1.0f / 9.0f))) * 0.008f);
this->unk_258 = Math_Atan2S_XY(this->actor.velocity.z, this->actor.velocity.x);
func_8088F5F4(this, play, 32);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_FIATY_HEAL - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FIATY_HEAL - SFX_FLAG);
}
void func_8088E5A8(EnElf* this, PlayState* play) {
@@ -854,8 +859,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;
}
}
@@ -879,21 +884,21 @@ void func_8088E60C(EnElf* this, PlayState* play) {
void func_8088E850(EnElf* this, PlayState* play) {
Vec3f nextPos;
Player* player = GET_PLAYER(play);
- Actor* arrowPointedActor;
+ Actor* targetFairyActor;
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,15 +908,14 @@ 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))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
+ 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)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
+ 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 {
this->actor.shape.rot.x = 0;
@@ -966,17 +970,17 @@ void func_8088E850(EnElf* this, PlayState* play) {
break;
default:
- arrowPointedActor = play->actorCtx.targetContext.arrowPointedActor;
+ targetFairyActor = play->actorCtx.targetCtx.fairyActor;
if ((player->stateFlags1 & PLAYER_STATE1_40) && (player->talkActor != NULL)) {
Math_Vec3f_Copy(&nextPos, &player->talkActor->focus.pos);
} else {
- Math_Vec3f_Copy(&nextPos, &play->actorCtx.targetContext.unk0);
+ Math_Vec3f_Copy(&nextPos, &play->actorCtx.targetCtx.fairyPos);
}
nextPos.y += 1500.0f * this->actor.scale.y;
- if (arrowPointedActor != NULL) {
+ if (targetFairyActor != NULL) {
func_8088DB4C(this, &nextPos, 0.0f, 30.0f, 0.2f);
- if (this->actor.speedXZ >= 5.0f) {
+ if (this->actor.speed >= 5.0f) {
func_8088F5F4(this, play, 0x10);
}
} else {
@@ -994,7 +998,7 @@ void func_8088E850(EnElf* this, PlayState* play) {
if (distFromLinksHead > 100.0f) {
this->fairyFlags |= 2;
if (this->unk_269 == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BELL_DASH_NORMAL);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BELL_DASH_NORMAL);
}
this->unk_25C = 100;
}
@@ -1015,7 +1019,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;
}
}
@@ -1035,7 +1039,7 @@ void func_8088EF18(Color_RGBAf* dest, Color_RGBAf* newColor, Color_RGBAf* curCol
}
void func_8088EFA4(EnElf* this, PlayState* play) {
- Actor* arrayPointerActor = play->actorCtx.targetContext.arrowPointedActor;
+ Actor* targetFairyActor = play->actorCtx.targetCtx.fairyActor;
Player* player = GET_PLAYER(play);
f32 transitionRate;
@@ -1060,40 +1064,40 @@ void func_8088EFA4(EnElf* this, PlayState* play) {
this->outerColor.b = 80.0f;
this->outerColor.a = 0.0f;
}
- } else if (play->actorCtx.targetContext.unk40 != 0.0f) {
+ } else if (play->actorCtx.targetCtx.fairyMoveProgressFactor != 0.0f) {
this->unk_268 = 0;
this->unk_238 = 1.0f;
if (!this->unk_269) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BELL_DASH_NORMAL);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BELL_DASH_NORMAL);
}
} else if (this->unk_268 == 0) {
- if ((arrayPointerActor == NULL) ||
- (Math_Vec3f_DistXYZ(&this->actor.world.pos, &play->actorCtx.targetContext.unk0) < 50.0f)) {
+ if ((targetFairyActor == NULL) ||
+ (Math_Vec3f_DistXYZ(&this->actor.world.pos, &play->actorCtx.targetCtx.fairyPos) < 50.0f)) {
this->unk_268 = 1;
}
} else if (this->unk_238 != 0.0f) {
if (Math_StepToF(&this->unk_238, 0.0f, 0.25f)) {
- this->innerColor = play->actorCtx.targetContext.fairyInner;
- this->outerColor = play->actorCtx.targetContext.fairyOuter;
+ this->innerColor = play->actorCtx.targetCtx.fairyInnerColor;
+ this->outerColor = play->actorCtx.targetCtx.fairyOuterColor;
} else {
transitionRate = 0.25f / this->unk_238;
- func_8088EF18(&this->innerColor, &play->actorCtx.targetContext.fairyInner, &this->innerColor,
+ func_8088EF18(&this->innerColor, &play->actorCtx.targetCtx.fairyInnerColor, &this->innerColor,
transitionRate);
- func_8088EF18(&this->outerColor, &play->actorCtx.targetContext.fairyOuter, &this->outerColor,
+ func_8088EF18(&this->outerColor, &play->actorCtx.targetCtx.fairyOuterColor, &this->outerColor,
transitionRate);
}
}
if (this->fairyFlags & 1) {
- if ((arrayPointerActor == NULL) || (player->targetedActor == NULL)) {
+ if ((targetFairyActor == NULL) || (player->lockOnActor == NULL)) {
this->fairyFlags ^= 1;
}
- } else if ((arrayPointerActor != NULL) && (player->targetedActor != NULL)) {
+ } else if ((targetFairyActor != NULL) && (player->lockOnActor != 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_PlaySfxAtPos(&this->actor, targetSfxId);
+ Actor_PlaySfx(&this->actor, targetSfxId);
}
this->fairyFlags |= 1;
}
@@ -1101,13 +1105,13 @@ void func_8088EFA4(EnElf* this, PlayState* play) {
void func_8088F214(EnElf* this, PlayState* play) {
s32 sp34;
- Actor* arrowPointedActor;
+ Actor* targetFairyActor;
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;
@@ -1130,14 +1134,14 @@ void func_8088F214(EnElf* this, PlayState* play) {
}
} else if (this->unk_264 & 8) {
sp34 = 1;
- func_800B9010(&this->actor, NA_SE_EV_BELL_ANGER - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_BELL_ANGER - SFX_FLAG);
} else {
- arrowPointedActor = play->actorCtx.targetContext.arrowPointedActor;
+ targetFairyActor = play->actorCtx.targetCtx.fairyActor;
if (player->stateFlags1 & PLAYER_STATE1_400) {
sp34 = 10;
this->unk_25C = 100;
- } else if ((arrowPointedActor == NULL) || (arrowPointedActor->category == 4)) {
- if (arrowPointedActor != NULL) {
+ } else if ((targetFairyActor == NULL) || (targetFairyActor->category == ACTORCAT_NPC)) {
+ if (targetFairyActor != NULL) {
this->unk_25C = 100;
player->stateFlags2 |= PLAYER_STATE2_100000;
sp34 = 0;
@@ -1149,7 +1153,7 @@ void func_8088F214(EnElf* this, PlayState* play) {
sp34 = 0;
} else if (!(player->stateFlags1 & PLAYER_STATE1_40)) {
if (this->unk_269 == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_NAVY_VANISH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_NAVY_VANISH);
}
sp34 = 5;
} else {
@@ -1198,7 +1202,7 @@ void func_8088F214(EnElf* this, PlayState* play) {
if (!(player->stateFlags2 & PLAYER_STATE2_100000)) {
sp34 = 5;
if (this->unk_269 == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_NAVY_VANISH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_NAVY_VANISH);
}
}
break;
@@ -1208,7 +1212,7 @@ void func_8088F214(EnElf* this, PlayState* play) {
sp34 = 9;
this->unk_25C = 0x2A;
if (this->unk_269 == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BELL_DASH_NORMAL);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BELL_DASH_NORMAL);
}
} else if (player->stateFlags1 & PLAYER_STATE1_40) {
player->stateFlags2 |= PLAYER_STATE2_100000;
@@ -1245,9 +1249,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;
@@ -1276,13 +1280,13 @@ void func_8088FA38(EnElf* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (this->fairyFlags & 0x10) {
- refPos = play->actorCtx.targetContext.unk0;
+ refPos = play->actorCtx.targetCtx.fairyPos;
if (this->unk_234 != NULL) {
refPos = this->unk_234->world.pos;
} else {
- if ((player->targetedActor == NULL) || (&player->actor == player->targetedActor) ||
- (&this->actor == player->targetedActor) || (this->unk_264 & 4)) {
+ if ((player->lockOnActor == NULL) || (&player->actor == player->lockOnActor) ||
+ (&this->actor == player->lockOnActor) || (this->unk_264 & 4)) {
refPos.x =
player->bodyPartsPos[PLAYER_BODYPART_HEAD].x + (Math_SinS(player->actor.shape.rot.y) * 20.0f);
refPos.y = player->bodyPartsPos[PLAYER_BODYPART_HEAD].y + 5.0f;
@@ -1299,7 +1303,7 @@ void func_8088FA38(EnElf* this, PlayState* play) {
refPos = this->actor.focus.pos;
func_8088DB4C(this, &refPos, 0, 30.0f, 0.2f);
- if (this->actor.speedXZ >= 5.0f) {
+ if (this->actor.speed >= 5.0f) {
func_8088F5F4(this, play, 0x10);
}
@@ -1319,24 +1323,24 @@ void func_8088FC34(EnElf* this, PlayState* play) {
} else {
Math_StepToF(&this->unk_240, 1.0f, 0.05f);
}
- func_800FD2B4(play, SQ(this->unk_240), player->actor.projectedPos.z + 780.0f, 0.2f, 0.5f);
+ Environment_AdjustLights(play, SQ(this->unk_240), player->actor.projectedPos.z + 780.0f, 0.2f, 0.5f);
}
}
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 +1351,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;
}
@@ -1365,22 +1369,22 @@ void func_8088FE64(Actor* thisx, PlayState* play2) {
if (play->msgCtx.currentTextId == 0x202) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
break;
case 1:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
break;
}
}
switch (play->msgCtx.choiceIndex) {
case 0:
- func_80151938(play, play->msgCtx.currentTextId - 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId - 1);
break;
case 1:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
}
}
@@ -1390,7 +1394,7 @@ void func_8088FE64(Actor* thisx, PlayState* play2) {
if (Message_ShouldAdvance(play)) {
switch (play->msgCtx.currentTextId) {
case 0x240:
- func_80151938(play, 0x245);
+ Message_ContinueTextbox(play, 0x245);
break;
case 0x21D:
@@ -1407,28 +1411,28 @@ void func_8088FE64(Actor* thisx, PlayState* play2) {
case 0x244:
switch (CURRENT_DAY) {
case 1:
- func_80151938(play, 0x246);
+ Message_ContinueTextbox(play, 0x246);
break;
case 2:
- func_80151938(play, 0x247);
+ Message_ContinueTextbox(play, 0x247);
break;
case 3:
if (!gSaveContext.save.isNight) {
- func_80151938(play, 0x248);
+ Message_ContinueTextbox(play, 0x248);
} else if ((gSaveContext.save.time < CLOCK_TIME(6, 0)) &&
CHECK_WEEKEVENTREG(WEEKEVENTREG_74_20)) {
- func_80151938(play, 0x225);
+ Message_ContinueTextbox(play, 0x225);
} else {
- func_80151938(play, 0x249);
+ Message_ContinueTextbox(play, 0x249);
}
break;
}
break;
default:
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_8088FDCC(this);
break;
}
@@ -1455,11 +1459,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 ((player->tatlTextId == 0) && (player->lockOnActor == NULL)) {
+ if ((gSaveContext.save.saveInfo.playerData.tatlTimer >= 600) &&
+ (gSaveContext.save.saveInfo.playerData.tatlTimer <= 3000)) {
player->tatlTextId = QuestHint_GetTatlTextId(play);
}
}
@@ -1469,12 +1474,12 @@ void func_8089010C(Actor* thisx, PlayState* play) {
}
if (Actor_ProcessTalkRequest(thisx, &play->state)) {
- func_8019FDC8(&gSfxDefaultPos, NA_SE_VO_NA_LISTEN, 0x20);
+ Audio_PlaySfx_AtPosWithReverb(&gSfxDefaultPos, NA_SE_VO_NA_LISTEN, 0x20);
thisx->focus.pos = thisx->world.pos;
if (thisx->textId == QuestHint_GetTatlTextId(play)) {
this->fairyFlags |= 0x80;
- gSaveContext.save.playerData.tatlTimer = 3001;
+ gSaveContext.save.saveInfo.playerData.tatlTimer = 3001;
}
this->fairyFlags |= 0x10;
@@ -1482,9 +1487,9 @@ void func_8089010C(Actor* thisx, PlayState* play) {
thisx->update = func_8088FE64;
func_8088C51C(this, 3);
if (this->elfMsg != NULL) {
- this->elfMsg->flags |= ACTOR_FLAG_100;
- thisx->cutscene = this->elfMsg->cutscene;
- if (thisx->cutscene != -1) {
+ this->elfMsg->flags |= ACTOR_FLAG_TALK_REQUESTED;
+ thisx->csId = this->elfMsg->csId;
+ if (thisx->csId != CS_ID_NONE) {
func_8088FD04(this);
}
if (this->elfMsg->home.rot.x == -0x961) {
@@ -1492,7 +1497,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 +1510,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;
}
}
}
@@ -1516,8 +1521,8 @@ void func_8089010C(Actor* thisx, PlayState* play) {
this->elfMsg = NULL;
this->timer++;
- if ((this->unk_240 >= 0.0f) &&
- func_800FD2B4(play, SQ(this->unk_240) * this->unk_240, player->actor.projectedPos.z + 780.0f, 0.2f, 0.5f)) {
+ if ((this->unk_240 >= 0.0f) && Environment_AdjustLights(play, SQ(this->unk_240) * this->unk_240,
+ player->actor.projectedPos.z + 780.0f, 0.2f, 0.5f)) {
Math_StepToF(&this->unk_240, -0.05f, 0.05f);
}
@@ -1525,7 +1530,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;
}
}
@@ -1551,7 +1556,7 @@ s32 EnElf_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
Vec3f sp34;
f32 scale;
- if (limbIndex == 6) {
+ if (limbIndex == FAIRY_LIMB_6) {
scale = ((Math_SinS(this->timer * 4096) * 0.1f) + 1.0f) * 0.012f;
if (this->fairyFlags & 0x200) {
scale *= 2.0f;
@@ -1563,8 +1568,11 @@ s32 EnElf_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
}
+ //! @note: `limbIndex` extends past `FAIRY_LIMB_MAX`.
+ //! This code was copied from OoT despite the number of limbs decreasing.
+ //! In OoT, this was intented to not draw wings for big fairies
if ((this->fairyFlags & 0x200) &&
- ((limbIndex == 4) || (limbIndex == 7) || (limbIndex == 11) || (limbIndex == 14))) {
+ ((limbIndex == FAIRY_LIMB_4) || (limbIndex == 7) || (limbIndex == 11) || (limbIndex == 14))) {
*dList = NULL;
}
return false;
@@ -1578,8 +1586,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 +1595,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 +1630,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..dbc1e191d 100644
--- a/src/overlays/actors/ovl_En_Elf/z_en_elf.h
+++ b/src/overlays/actors/ovl_En_Elf/z_en_elf.h
@@ -2,20 +2,38 @@
#define Z_EN_ELF_H
#include "global.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
struct EnElf;
typedef void (*EnElfActionFunc)(struct EnElf*, PlayState*);
typedef void (*EnElfUnkFunc)(struct EnElf*, PlayState*);
-#define ENELF_GET_F(thisx) ((thisx)->params & 0xF)
-#define ENELF_GET_FE00(thisx) (((thisx)->params & 0xFE00) >> 9)
+#define FAIRY_GET_TYPE(thisx) ((thisx)->params & 0xF)
+#define FAIRY_GET_BOOL_PARAM(thisx) ((thisx)->params & 0x100)
+#define FAIRY_GET_COLLECTIBLE_FLAG(thisx) (((thisx)->params & 0xFE00) >> 9)
+
+#define FAIRY_PARAMS(type, boolParam, collectibleFlag) (((type) /* & 0xF */) | (((boolParam) & 0x1) << 8) | ((((collectibleFlag) & 0x7F) << 9) & 0xFE00))
+
+typedef enum {
+ /* 0x0 */ FAIRY_TYPE_0,
+ /* 0x1 */ FAIRY_TYPE_1,
+ /* 0x2 */ FAIRY_TYPE_2,
+ /* 0x3 */ FAIRY_TYPE_3,
+ /* 0x4 */ FAIRY_TYPE_4,
+ /* 0x5 */ FAIRY_TYPE_5,
+ /* 0x6 */ FAIRY_TYPE_6,
+ /* 0x7 */ FAIRY_TYPE_7,
+ /* 0x8 */ FAIRY_TYPE_8,
+ /* 0x9 */ FAIRY_TYPE_9,
+ /* 0xA */ FAIRY_TYPE_10
+} FairyType;
typedef struct EnElf {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[7];
- /* 0x1B2 */ Vec3s morphTable[7];
+ /* 0x188 */ Vec3s jointTable[FAIRY_LIMB_MAX];
+ /* 0x1B2 */ Vec3s morphTable[FAIRY_LIMB_MAX];
/* 0x1DC */ Color_RGBAf innerColor;
/* 0x1EC */ Color_RGBAf outerColor;
/* 0x1FC */ LightInfo lightInfoGlow;
@@ -39,7 +57,7 @@ typedef struct EnElf {
/* 0x25A */ u16 timer;
/* 0x25C */ s16 unk_25C;
/* 0x25E */ s16 disappearTimer;
- /* 0x260 */ s16 unk_260;
+ /* 0x260 */ s16 collectibleFlag;
/* 0x262 */ u16 fairyFlags;
/* 0x264 */ u16 unk_264;
/* 0x266 */ u16 unk_266;
@@ -49,15 +67,4 @@ typedef struct EnElf {
/* 0x270 */ EnElfActionFunc actionFunc;
} 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
-} 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..c9d86e4f6 100644
--- a/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.c
+++ b/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.c
@@ -8,7 +8,7 @@
#include "overlays/actors/ovl_En_Elforg/z_en_elforg.h"
#include "objects/object_bubble/object_bubble.h"
-#define FLAGS (ACTOR_FLAG_1)
+#define FLAGS (ACTOR_FLAG_TARGETABLE)
#define THIS ((EnElfbub*)thisx)
@@ -56,7 +56,7 @@ void EnElfbub_Init(Actor* thisx, PlayState* play) {
EnElfbub* this = THIS;
Actor* childActor;
- if (Flags_GetSwitch(play, ENELFBUB_GET_SWITCHFLAG(&this->actor))) {
+ if (Flags_GetSwitch(play, ENELFBUB_GET_SWITCH_FLAG(&this->actor))) {
Actor_Kill(&this->actor);
return;
}
@@ -66,23 +66,24 @@ 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;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
- childActor = Actor_SpawnAsChild(
- &play->actorCtx, &this->actor, play, ACTOR_EN_ELFORG, this->actor.world.pos.x, this->actor.world.pos.y + 12.0f,
- this->actor.world.pos.z, this->actor.world.rot.x, this->actor.world.rot.y, this->actor.world.rot.z,
- STRAY_FAIRY_PARAMS(ENELFBUB_GET_SWITCHFLAG(&this->actor), 0, STRAY_FAIRY_TYPE_BUBBLE));
+ childActor = Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_ELFORG, this->actor.world.pos.x,
+ this->actor.world.pos.y + 12.0f, this->actor.world.pos.z, this->actor.world.rot.x,
+ this->actor.world.rot.y, this->actor.world.rot.z,
+ STRAY_FAIRY_PARAMS(ENELFBUB_GET_SWITCH_FLAG(&this->actor),
+ STRAY_FAIRY_AREA_CLOCK_TOWN, STRAY_FAIRY_TYPE_BUBBLE));
if (childActor != NULL) {
childActor->parent = &this->actor;
}
this->oscillationAngle = 0;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
void EnElfbub_Destroy(Actor* thisx, PlayState* play) {
@@ -140,6 +141,7 @@ void EnElfbub_Idle(EnElfbub* this, PlayState* play) {
void EnElfbub_Update(Actor* thisx, PlayState* play) {
EnElfbub* this = THIS;
+
Collider_UpdateCylinder(&this->actor, &this->collider);
this->actionFunc(this, play);
Actor_SetFocus(&this->actor, this->actor.shape.yOffset);
@@ -151,7 +153,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_Elfbub/z_en_elfbub.h b/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.h
index 50c6bd672..d115ab91c 100644
--- a/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.h
+++ b/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.h
@@ -3,7 +3,7 @@
#include "global.h"
-#define ENELFBUB_GET_SWITCHFLAG(thisx) ((((thisx)->params) & 0xFE00) >> 9)
+#define ENELFBUB_GET_SWITCH_FLAG(thisx) ((((thisx)->params) & 0xFE00) >> 9)
struct EnElfbub;
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 169d56fdd..3eb2e357b 100644
--- a/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.c
+++ b/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.c
@@ -1,11 +1,38 @@
-/*
- * File: z_en_elfgrp.c
+/**
+ * @file z_en_elfgrp.c
* Overlay: ovl_En_Elfgrp
- * Description: Group of Stray Fairies in Fairy Fountain
+ * Description: Manager for group of Stray Fairies and Great Fairy in Fairy's Fountains
+ *
+ * There are many different quantities associated to the Stray Fairies in each of the 3 places (missing, in the
+ * Fountain, held by Player)
+ * - Total number of fairies (always 25 in the original game)
+ * - Original number in the Fountain (24 for Clock Town Fairy Fountain, 10 for the other 4)
+ * - Current number in the Fountain (bitpacked in Fountain scene flags, see below)
+ * - Total number found (stored in save context)
+ * - Current number held (i.e. found but not returned)
+ *
+ * The permanentSceneFlags for Fairy Fountains used in this actor are of the form
+ * ```c
+ * struct {
+ * u32 clockTown : 1;
+ * u32 fountains[4] : 5;
+ * } FairyFountains;
+ * ```
+ * where arg1 is:
+ * - 0: Clock Town
+ * - 1: Woodfall,
+ * - 2: Snowhead,
+ * - 3: Great Bay,
+ * - 4: Ikana
+ *
+ * Clock Town is handled separately, and then the fountains are looked up with manual array indexing
+ *
+ * @note Clock Town is handled separately in a number of places
*/
#include "z_en_elfgrp.h"
#include "overlays/actors/ovl_En_Elforg/z_en_elforg.h"
+#include "overlays/actors/ovl_Demo_Effect/z_demo_effect.h"
#define FLAGS (ACTOR_FLAG_10)
@@ -17,24 +44,28 @@ void EnElfgrp_Init(Actor* thisx, PlayState* play);
void EnElfgrp_Destroy(Actor* thisx, PlayState* play);
void EnElfgrp_Update(Actor* thisx, PlayState* play);
-s32 func_80A39BD0(PlayState* play, s32 arg2);
-s32 func_80A39C1C(PlayState* play, s32 arg1);
-void func_80A39DC8(EnElfgrp* this, PlayState* play, s32 arg2, s32 arg3);
-void func_80A3A0AC(EnElfgrp* this, PlayState* play);
-void func_80A3A0F4(EnElfgrp* this, PlayState* play);
-void func_80A3A210(EnElfgrp* this, PlayState* play);
-void func_80A3A274(EnElfgrp* this, PlayState* play);
+s32 EnElfgrp_GetHeldFairiesCount(PlayState* play, s32 type);
+s32 EnElfgrp_GetFountainFairiesCount(PlayState* play, s32 type);
+void EnElfgrp_SpawnStrayFairies(EnElfgrp* this, PlayState* play, s32 count, s32 fairyType);
void func_80A3A398(EnElfgrp* this, PlayState* play);
-void func_80A3A484(EnElfgrp* this, PlayState* play);
-void func_80A3A4AC(EnElfgrp* this, PlayState* play);
void func_80A3A520(EnElfgrp* this, PlayState* play);
-void func_80A3A600(EnElfgrp* this, PlayState* play);
-void func_80A3A610(EnElfgrp* this, PlayState* play);
-void func_80A3A6F4(EnElfgrp* this, PlayState* play);
-void func_80A3A77C(EnElfgrp* this, PlayState* play);
+void EnElfgrp_DoNothing(EnElfgrp* this, PlayState* play);
void func_80A3A7FC(EnElfgrp* this, PlayState* play);
void func_80A3A8F8(EnElfgrp* this, PlayState* play);
+// State flags
+#define ELFGRP_STATE_0 (1 << 0)
+#define ELFGRP_STATE_1 (1 << 1)
+#define ELFGRP_STATE_2 (1 << 2)
+#define ELFGRP_STATE_3 (1 << 3)
+#define ELFGRP_STATE_4 (1 << 4)
+
+// Used for the type in EnElfgrp_SpawnStrayFairies
+typedef enum ElfgrpSpawnedFairyTypes {
+ /* 0 */ SPAWNED_STRAY_FAIRY_TYPE_PRESENT, // STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN
+ /* 1 */ SPAWNED_STRAY_FAIRY_TYPE_RETURNING // STRAY_FAIRY_TYPE_RETURNING_TO_FOUNTAIN
+} ElfgrpSpawnedFairyTypes;
+
ActorInit En_Elfgrp_InitVars = {
ACTOR_EN_ELFGRP,
ACTORCAT_PROP,
@@ -47,129 +78,145 @@ ActorInit En_Elfgrp_InitVars = {
(ActorFunc)NULL,
};
-void func_80A396B0(EnElfgrp* this, s32 arg1) {
- while (arg1 > 0) {
- if (this->actor.cutscene == -1) {
+/**
+ * Set the actor's cutscene id to a later one, or -1 if run out.
+ *
+ * @note This is only expected to be called in Init when this actor has the first cutscene set, but can also work for
+ * later cutscenes if \p numCutscenes is set correcly.
+ *
+ * @param numCutscenes Number of cutscenes in the list to skip forward to set this one.
+ */
+void EnElfgrp_SetCutscene(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--;
}
}
void EnElfgrp_Init(Actor* thisx, PlayState* play) {
s32 pad;
EnElfgrp* this = THIS;
- s32 sp24;
+ s32 numberInFountain;
- this->unk_147 = ENELFGRP_GET(&this->actor);
+ this->type = ENELFGRP_GET_TYPE(&this->actor);
this->unk_148 = 0;
- this->unk_14A = 0;
+ this->stateFlags = 0;
this->actor.focus.pos.y += 40.0f;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
- switch (this->unk_147) {
- case ENELFGRP_1:
- case ENELFGRP_2:
- case ENELFGRP_3:
- case ENELFGRP_4:
- this->unk_148 = this->unk_147 - 1;
- sp24 = func_80A39C1C(play, this->unk_147);
- this->unk_146 = 1 << this->unk_147;
+ switch (this->type) {
+ case ENELFGRP_TYPE_POWER:
+ case ENELFGRP_TYPE_WISDOM:
+ case ENELFGRP_TYPE_COURAGE:
+ case ENELFGRP_TYPE_KINDNESS:
+ this->unk_148 = this->type - 1;
+ numberInFountain = EnElfgrp_GetFountainFairiesCount(play, this->type);
+ this->talkedOnceFlag = 1 << this->type;
- if (sp24 < 25) {
- func_80A39DC8(this, play, sp24, 0);
+ if (numberInFountain < STRAY_FAIRY_TOTAL) {
+ EnElfgrp_SpawnStrayFairies(this, play, numberInFountain, SPAWNED_STRAY_FAIRY_TYPE_PRESENT);
}
- if (sp24 >= 25) {
+ if (numberInFountain >= STRAY_FAIRY_TOTAL) {
this->actionFunc = func_80A3A520;
- func_80A396B0(this, 2);
- return;
+ EnElfgrp_SetCutscene(this, 2);
+ break;
}
- if ((func_80A39BD0(play, this->unk_147) + sp24) >= 25) {
+ if ((EnElfgrp_GetHeldFairiesCount(play, this->type) + numberInFountain) >= STRAY_FAIRY_TOTAL) {
this->actionFunc = func_80A3A398;
- switch (this->unk_147) {
- case ENELFGRP_1:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_23_02)) {
- func_80A396B0(this, 1);
+ switch (this->type) {
+ case ENELFGRP_TYPE_POWER:
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_OBTAINED_GREAT_SPIN_ATTACK)) {
+ EnElfgrp_SetCutscene(this, 1);
} else {
- this->unk_14A |= 4;
+ this->stateFlags |= ELFGRP_STATE_2;
}
break;
- case ENELFGRP_2:
- if (gSaveContext.save.playerData.isDoubleMagicAcquired == true) {
- func_80A396B0(this, 1);
+ case ENELFGRP_TYPE_WISDOM:
+ if (gSaveContext.save.saveInfo.playerData.isDoubleMagicAcquired == true) {
+ EnElfgrp_SetCutscene(this, 1);
}
break;
- case ENELFGRP_3:
- if (gSaveContext.save.playerData.doubleDefense) {
- func_80A396B0(this, 1);
+ case ENELFGRP_TYPE_COURAGE:
+ if (gSaveContext.save.saveInfo.playerData.doubleDefense) {
+ EnElfgrp_SetCutscene(this, 1);
}
break;
- case ENELFGRP_4:
+ case ENELFGRP_TYPE_KINDNESS:
if (INV_CONTENT(ITEM_SWORD_GREAT_FAIRY) == ITEM_SWORD_GREAT_FAIRY) {
- func_80A396B0(this, 1);
+ EnElfgrp_SetCutscene(this, 1);
} else {
- this->unk_14A |= 0x10;
+ this->stateFlags |= ELFGRP_STATE_4;
}
break;
+
+ default:
+ break;
}
- } else if (func_80A39BD0(play, this->unk_147)) {
+ } else if (EnElfgrp_GetHeldFairiesCount(play, this->type)) {
this->actionFunc = func_80A3A7FC;
- this->actor.textId = (this->unk_147 * 3) + 0x581;
+ this->actor.textId = (this->type * 3) + 0x581;
} else {
this->actionFunc = func_80A3A8F8;
- if ((gSaveContext.save.weekEventReg[9] & this->unk_146)) {
- this->actor.textId = (this->unk_147 * 3) + 0x580;
+
+ if ((gSaveContext.save.saveInfo.weekEventReg[9] & this->talkedOnceFlag)) { // talked for first time
+ this->actor.textId = (this->type * 3) + 0x580;
} else {
- this->actor.textId = (this->unk_147 * 3) + 0x57F;
+ this->actor.textId = (this->type * 3) + 0x57F;
}
}
break;
- default:
- sp24 = func_80A39C1C(play, 0);
- this->unk_146 = ENELFGRP_1;
- if (sp24 >= 25) {
+ default: // ENELFGRP_TYPE_MAGIC
+ numberInFountain = EnElfgrp_GetFountainFairiesCount(play, ENELFGRP_TYPE_MAGIC);
+ this->talkedOnceFlag = 1 << ENELFGRP_TYPE_MAGIC;
+
+ if (numberInFountain >= STRAY_FAIRY_TOTAL) {
this->actionFunc = func_80A3A520;
- if ((this->actor.home.rot.z != 0) && Flags_GetSwitch(play, this->actor.home.rot.z)) {
- this->actionFunc = func_80A3A600;
+
+ if ((ENELFGRP_GET_SWITCHFLAG_ROT(&this->actor) != 0) &&
+ Flags_GetSwitch(play, ENELFGRP_GET_SWITCHFLAG_ROT(&this->actor))) {
+ this->actionFunc = EnElfgrp_DoNothing;
} else if (INV_CONTENT(ITEM_MASK_GREAT_FAIRY) == ITEM_MASK_GREAT_FAIRY) {
- func_80A396B0(this, 4);
+ EnElfgrp_SetCutscene(this, 4);
} else if (INV_CONTENT(ITEM_MASK_DEKU) != ITEM_MASK_DEKU) {
- func_80A396B0(this, 5);
+ EnElfgrp_SetCutscene(this, 5);
} else {
- this->unk_14A |= 2;
- func_80A396B0(this, 6);
+ this->stateFlags |= ELFGRP_STATE_1;
+ EnElfgrp_SetCutscene(this, 6);
}
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_08_80)) {
- func_80A39DC8(this, play, 24, 0);
+ EnElfgrp_SpawnStrayFairies(this, play, STRAY_FAIRY_TOTAL - 1, SPAWNED_STRAY_FAIRY_TYPE_PRESENT);
this->actionFunc = func_80A3A398;
+
if (INV_CONTENT(ITEM_MASK_DEKU) == ITEM_MASK_DEKU) {
if (INV_CONTENT(ITEM_MASK_GREAT_FAIRY) == ITEM_MASK_GREAT_FAIRY) {
- func_80A396B0(this, 2);
+ EnElfgrp_SetCutscene(this, 2);
} else {
- func_80A396B0(this, 3);
- this->unk_14A |= 2;
+ EnElfgrp_SetCutscene(this, 3);
+ this->stateFlags |= ELFGRP_STATE_1;
}
- } else if (gSaveContext.save.playerData.isMagicAcquired == true) {
- func_80A396B0(this, 1);
+ } else if (gSaveContext.save.saveInfo.playerData.isMagicAcquired == true) {
+ EnElfgrp_SetCutscene(this, 1);
}
} else {
- func_80A39DC8(this, play, 24, 0);
+ EnElfgrp_SpawnStrayFairies(this, play, STRAY_FAIRY_TOTAL - 1, SPAWNED_STRAY_FAIRY_TYPE_PRESENT);
this->actionFunc = func_80A3A8F8;
- if ((gSaveContext.save.weekEventReg[9] & this->unk_146)) {
+ if ((gSaveContext.save.saveInfo.weekEventReg[9] & this->talkedOnceFlag)) {
this->actor.textId = 0x580;
} else {
this->actor.textId = 0x578;
}
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
}
break;
}
@@ -178,116 +225,119 @@ void EnElfgrp_Init(Actor* thisx, PlayState* play) {
void EnElfgrp_Destroy(Actor* thisx, PlayState* play) {
}
-s32 func_80A39BD0(PlayState* play, s32 arg2) {
- if ((arg2 < 1) || (arg2 >= 5)) {
+// Number of Stray Fairies currently held by Player
+s32 EnElfgrp_GetHeldFairiesCount(PlayState* play, s32 type) {
+ if ((type <= ENELFGRP_TYPE_MAGIC) || (type > ENELFGRP_TYPE_KINDNESS)) {
return 0;
}
- return (((void)0, gSaveContext.save.inventory.strayFairies[arg2 - 1]) - func_80A39C1C(play, arg2)) + 10;
+ // Number in fountain originally + total number collected - number currently in fountain
+ return (STRAY_FAIRY_TOTAL - STRAY_FAIRY_SCATTERED_TOTAL) +
+ ((void)0, gSaveContext.save.saveInfo.inventory.strayFairies[type - 1]) -
+ EnElfgrp_GetFountainFairiesCount(play, type);
}
-s32 func_80A39C1C(PlayState* play, s32 arg1) {
- // the permanentSceneFlags access here is in the form
- // struct {
- // u32 clockTown : 1;
- // u32 fountains[4] : 5;
- // } FairyFountains;
- // where arg1 is:
- // 0: clocktown
- // 1: woodfall,
- // 2: snowhead,
- // 3: great bay,
- // 4: stone tower
- // clocktown is handled separately, and then the fountains are looked up as array indexing
+// Number of Stray Fairies in currently in Fountain
+s32 EnElfgrp_GetFountainFairiesCount(PlayState* play, s32 type) {
+ s32 numberInFountain;
- s32 temp_v1;
-
- if ((arg1 < 0) || (arg1 >= 5)) {
+ if ((type < ENELFGRP_TYPE_MAGIC) || (type > ENELFGRP_TYPE_KINDNESS)) {
return 0;
}
- if (arg1 == 0) {
- if (gSaveContext.save.permanentSceneFlags[play->sceneId].unk_14 & 1) {
- return 25;
+ if (type == ENELFGRP_TYPE_MAGIC) {
+ if (gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 & 1) {
+ return STRAY_FAIRY_TOTAL;
+ } else {
+ return STRAY_FAIRY_TOTAL - 1;
}
- return 24;
}
- temp_v1 = (gSaveContext.save.permanentSceneFlags[play->sceneId].unk_14 >> (((arg1 - 1) * 5) + 1)) & 0x1F;
- if (temp_v1 < 10) {
- temp_v1 = 10;
- } else if (temp_v1 > 25) {
- temp_v1 = 25;
+ numberInFountain =
+ (gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 >> (((type - 1) * 5) + 1)) & 0x1F;
+ if (numberInFountain < STRAY_FAIRY_TOTAL - STRAY_FAIRY_SCATTERED_TOTAL) {
+ numberInFountain = STRAY_FAIRY_TOTAL - STRAY_FAIRY_SCATTERED_TOTAL;
+ } else if (numberInFountain > STRAY_FAIRY_TOTAL) {
+ numberInFountain = STRAY_FAIRY_TOTAL;
}
- return temp_v1;
+ return numberInFountain;
}
-void func_80A39CD4(PlayState* play, s32 arg1, s32 arg2) {
- if ((arg1 < 0) || (arg1 > 4) || (arg2 < 10) || (arg2 > 25)) {
+// Update number of Stray Fairies in Fountain
+void EnElfgrp_SetFountainFairiesCount(PlayState* play, s32 type, s32 newCount) {
+ if ((type < ENELFGRP_TYPE_MAGIC) || (type > ENELFGRP_TYPE_KINDNESS) ||
+ (newCount < (STRAY_FAIRY_TOTAL - STRAY_FAIRY_SCATTERED_TOTAL)) || (newCount > STRAY_FAIRY_TOTAL)) {
return;
}
- if (arg1 == 0) {
- if (arg2 == 25) {
- gSaveContext.save.permanentSceneFlags[play->sceneId].unk_14 |= 1;
+ if (type == ENELFGRP_TYPE_MAGIC) {
+ if (newCount == STRAY_FAIRY_TOTAL) {
+ 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 << ((type * 5) - 4));
+ gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 |= newCount << ((type * 5) - 4);
}
}
-void func_80A39DC8(EnElfgrp* this, PlayState* play, s32 arg2, s32 arg3) {
+void EnElfgrp_SpawnStrayFairies(EnElfgrp* this, PlayState* play, s32 count, s32 fairyType) {
s32 pad;
s32 i;
- Actor* elforg;
- s32 params;
- Vec3f sp6C;
+ Actor* strayFairy;
+ s32 strayFairyParams;
+ Vec3f spawnCenterPos;
Player* player = GET_PLAYER(play);
- if (arg3 == 0) {
- this->unk_14A |= 8;
+ if (fairyType == 0) {
+ this->stateFlags |= ELFGRP_STATE_3;
}
- if (arg3 == 0) {
- sp6C = this->actor.world.pos;
- sp6C.y += 20.0f;
- params = STRAY_FAIRY_PARAMS(0, this->unk_147, STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN);
+ if (fairyType == 0) {
+ spawnCenterPos = this->actor.world.pos;
+ spawnCenterPos.y += 20.0f;
+ strayFairyParams = STRAY_FAIRY_PARAMS(0, this->type, STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN);
} else {
- sp6C = player->actor.world.pos;
- sp6C.y += 20.0f;
- params = STRAY_FAIRY_PARAMS(0, this->unk_147, STRAY_FAIRY_TYPE_TURN_IN_TO_FAIRY_FOUNTAIN);
+ spawnCenterPos = player->actor.world.pos;
+ spawnCenterPos.y += 20.0f;
+ strayFairyParams = STRAY_FAIRY_PARAMS(0, this->type, STRAY_FAIRY_TYPE_RETURNING_TO_FOUNTAIN);
}
- 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);
- if (elforg == NULL) {
+ for (i = 0; i < count; i++) {
+ strayFairy =
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELFORG, Rand_CenteredFloat(20.0f) + spawnCenterPos.x,
+ spawnCenterPos.y, Rand_CenteredFloat(20.0f) + spawnCenterPos.z, 0, 0, 0, strayFairyParams);
+
+ if (strayFairy == NULL) {
continue;
}
- elforg->home.pos.x = this->actor.home.pos.x;
- elforg->home.pos.y = this->actor.home.pos.y + 20.0f;
- elforg->home.pos.z = this->actor.home.pos.z;
+ strayFairy->home.pos.x = this->actor.home.pos.x;
+ strayFairy->home.pos.y = this->actor.home.pos.y + 20.0f;
+ strayFairy->home.pos.z = this->actor.home.pos.z;
}
}
-s32 func_80A39F50(PlayState* play) {
+/**
+ * Tell any spawned Stray Fairies to come to the Fountain center.
+ *
+ * @return s32 always 0
+ */
+s32 EnElfgrp_SummonStrayFairies(PlayState* play) {
Actor* itemAction = play->actorCtx.actorLists[ACTORCAT_ITEMACTION].first;
- EnElforg* elfOrg;
+ EnElforg* strayFairy;
while (itemAction != NULL) {
if ((itemAction->id != ACTOR_EN_ELFORG) ||
((STRAY_FAIRY_TYPE(itemAction) != STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN) &&
- (STRAY_FAIRY_TYPE(itemAction) != STRAY_FAIRY_TYPE_TURN_IN_TO_FAIRY_FOUNTAIN))) {
+ (STRAY_FAIRY_TYPE(itemAction) != STRAY_FAIRY_TYPE_RETURNING_TO_FOUNTAIN))) {
itemAction = itemAction->next;
continue;
}
- elfOrg = (EnElforg*)itemAction;
- if (!(elfOrg->strayFairyFlags & STRAY_FAIRY_FLAG_MOVES_QUICKLY_TO_HOME)) {
- elfOrg->strayFairyFlags |= STRAY_FAIRY_FLAG_MOVES_QUICKLY_TO_HOME;
+ strayFairy = (EnElforg*)itemAction;
+ if (!(strayFairy->strayFairyFlags & STRAY_FAIRY_FLAG_MOVES_QUICKLY_TO_HOME)) {
+ strayFairy->strayFairyFlags |= STRAY_FAIRY_FLAG_MOVES_QUICKLY_TO_HOME;
}
itemAction = itemAction->next;
}
@@ -295,203 +345,219 @@ s32 func_80A39F50(PlayState* play) {
return 0;
}
-s32 func_80A39FBC(PlayState* play) {
+/**
+ * Make the Stray Fairies in the fountain spin quickly when healing Player.
+ *
+ * @return s32 time to spend in healing action.
+ */
+s32 EnElfgrp_SpinStrayFairies(PlayState* play) {
Actor* itemAction = play->actorCtx.actorLists[ACTORCAT_ITEMACTION].first;
- EnElforg* elfOrg;
- s32 phi_v1 = 30;
+ EnElforg* strayFairy;
+ s32 timer = 30;
while (itemAction != NULL) {
if ((itemAction->id != ACTOR_EN_ELFORG) ||
((STRAY_FAIRY_TYPE(itemAction) != STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN) &&
- (STRAY_FAIRY_TYPE(itemAction) != STRAY_FAIRY_TYPE_TURN_IN_TO_FAIRY_FOUNTAIN))) {
+ (STRAY_FAIRY_TYPE(itemAction) != STRAY_FAIRY_TYPE_RETURNING_TO_FOUNTAIN))) {
itemAction = itemAction->next;
continue;
}
- elfOrg = (EnElforg*)itemAction;
- if (!(elfOrg->strayFairyFlags & STRAY_FAIRY_FLAG_CIRCLES_QUICKLY_IN_FOUNTAIN)) {
- elfOrg->strayFairyFlags |= STRAY_FAIRY_FLAG_CIRCLES_QUICKLY_IN_FOUNTAIN;
- if (phi_v1 >= 100) {
- return phi_v1;
+ strayFairy = (EnElforg*)itemAction;
+ if (!(strayFairy->strayFairyFlags & STRAY_FAIRY_FLAG_CIRCLES_QUICKLY_IN_FOUNTAIN)) {
+ strayFairy->strayFairyFlags |= STRAY_FAIRY_FLAG_CIRCLES_QUICKLY_IN_FOUNTAIN;
+ if (timer >= 100) {
+ return timer;
}
- elfOrg->secondaryTimer = phi_v1;
- phi_v1 += 5;
+ strayFairy->secondaryTimer = timer;
+ timer += 5;
}
itemAction = itemAction->next;
}
- return phi_v1;
+ return timer;
}
-void func_80A3A044(PlayState* play) {
+/**
+ * Tell the Stray Fairies to disappear, before reviving the Great Fairy
+ */
+void EnElfgrp_VanishStrayFairies(PlayState* play) {
Actor* itemAction = play->actorCtx.actorLists[ACTORCAT_ITEMACTION].first;
- EnElforg* elfOrg;
+ EnElforg* strayFairy;
while (itemAction != NULL) {
if ((itemAction->id != ACTOR_EN_ELFORG) ||
((STRAY_FAIRY_TYPE(itemAction) != STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN) &&
- (STRAY_FAIRY_TYPE(itemAction) != STRAY_FAIRY_TYPE_TURN_IN_TO_FAIRY_FOUNTAIN))) {
+ (STRAY_FAIRY_TYPE(itemAction) != STRAY_FAIRY_TYPE_RETURNING_TO_FOUNTAIN))) {
itemAction = itemAction->next;
continue;
}
- elfOrg = (EnElforg*)itemAction;
- elfOrg->actor.home.rot.x = 0x14;
- elfOrg->strayFairyFlags |= STRAY_FAIRY_FLAG_SPARKLES_AND_SHRINKS;
+ strayFairy = (EnElforg*)itemAction;
+ STRAY_FAIRY_SPARKLE_COUNT(&strayFairy->actor) = 20;
+ strayFairy->strayFairyFlags |= STRAY_FAIRY_FLAG_SPARKLES_AND_SHRINKS;
itemAction = itemAction->next;
}
}
void func_80A3A0AC(EnElfgrp* this, PlayState* play) {
- if (!Cutscene_CheckActorAction(play, 0x64)) {
- this->actionFunc = func_80A3A600;
- ActorCutscene_Stop(this->actor.cutscene);
+ if (!Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_100)) {
+ this->actionFunc = EnElfgrp_DoNothing;
+ CutsceneManager_Stop(this->actor.csId);
}
}
void func_80A3A0F4(EnElfgrp* this, PlayState* play) {
- if (this->unk_144 == 10) {
- play_sound(NA_SE_SY_WHITE_OUT_T);
- if (ENELFGRP_GET(&this->actor) < ENELFGRP_4) {
+ if (this->timer == 10) {
+ Audio_PlaySfx(NA_SE_SY_WHITE_OUT_T);
+ if (ENELFGRP_GET_TYPE(&this->actor) < ENELFGRP_TYPE_KINDNESS) {
Actor_Spawn(&play->actorCtx, play, ACTOR_DEMO_EFFECT, this->actor.world.pos.x,
this->actor.world.pos.y + 30.0f, this->actor.world.pos.z, 0, 0, 0,
- ENELFGRP_GET(&this->actor) + ENELFGRP_4);
- } else {
+ ENELFGRP_GET_TYPE(&this->actor) + DEMO_EFFECT_TYPE_LIGHT_BASE);
+ } else { // ENELFGRP_TYPE_KINDNESS
Actor_Spawn(&play->actorCtx, play, ACTOR_DEMO_EFFECT, this->actor.world.pos.x,
- this->actor.world.pos.y + 30.0f, this->actor.world.pos.z, 0, 0, 0, 4);
+ this->actor.world.pos.y + 30.0f, this->actor.world.pos.z, 0, 0, 0,
+ DEMO_EFFECT_TYPE_LIGHT_DARK_YELLOW);
}
}
- if ((this->unk_144 > 10) && (this->unk_14A & 1)) {
- func_800B9010(&this->actor, NA_SE_EV_FAIRY_GROUP_FRY - SFX_FLAG);
+ if ((this->timer > 10) && (this->stateFlags & ELFGRP_STATE_0)) {
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_FAIRY_GROUP_FRY - SFX_FLAG);
}
- if (this->unk_144 == 0) {
+ if (this->timer == 0) {
this->actionFunc = func_80A3A0AC;
}
}
void func_80A3A210(EnElfgrp* this, PlayState* play) {
- if (this->unk_144 == 0) {
+ if (this->timer == 0) {
this->actionFunc = func_80A3A0F4;
- func_80A3A044(play);
- this->unk_144 = 30;
+ EnElfgrp_VanishStrayFairies(play);
+ this->timer = 30;
}
- if (this->unk_14A & 1) {
- func_800B9010(&this->actor, NA_SE_EV_FAIRY_GROUP_FRY - SFX_FLAG);
+ if (this->stateFlags & ELFGRP_STATE_0) {
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_FAIRY_GROUP_FRY - SFX_FLAG);
}
}
void func_80A3A274(EnElfgrp* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 0x64)) {
- if (this->unk_14A & 1) {
- func_800B9010(&this->actor, NA_SE_PL_CHIBI_FAIRY_HEAL - SFX_FLAG);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_100)) {
+ if (this->stateFlags & ELFGRP_STATE_0) {
+ Actor_PlaySfx_Flagged(&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) {
- func_80A39DC8(this, play, 1, 1);
+ if (!(this->stateFlags & ELFGRP_STATE_0)) {
+ if (this->type == ENELFGRP_TYPE_MAGIC) { // Clock Town
+ EnElfgrp_SpawnStrayFairies(this, play, 1, SPAWNED_STRAY_FAIRY_TYPE_RETURNING);
} else {
- func_80A39DC8(this, play, func_80A39BD0(play, this->unk_147), 1);
+ EnElfgrp_SpawnStrayFairies(this, play, EnElfgrp_GetHeldFairiesCount(play, this->type),
+ SPAWNED_STRAY_FAIRY_TYPE_RETURNING);
}
- this->unk_14A |= 1;
- func_80A39CD4(play, this->unk_147, 25);
+ this->stateFlags |= ELFGRP_STATE_0;
+ EnElfgrp_SetFountainFairiesCount(play, this->type, STRAY_FAIRY_TOTAL);
}
break;
case 3:
- func_80A39F50(play);
+ EnElfgrp_SummonStrayFairies(play);
this->actionFunc = func_80A3A210;
- this->unk_144 = 90;
+ this->timer = 90;
+ break;
+
+ default:
break;
}
}
}
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) {
+ Flags_UnsetSwitch(play, ENELFGRP_GET_SWITCH_FLAG_PARAMS(&this->actor));
+
+ if (this->stateFlags & ELFGRP_STATE_1) {
Item_Give(play, ITEM_MASK_GREAT_FAIRY);
}
- if ((this->unk_14A & 4) != 0) {
- SET_WEEKEVENTREG(WEEKEVENTREG_23_02);
+ if (this->stateFlags & ELFGRP_STATE_2) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_OBTAINED_GREAT_SPIN_ATTACK);
}
- if (this->unk_14A & 0x10) {
+ if (this->stateFlags & ELFGRP_STATE_4) {
Item_Give(play, ITEM_SWORD_GREAT_FAIRY);
}
- this->unk_14A &= ~8;
+
+ this->stateFlags &= ~ELFGRP_STATE_3;
} else if (this->actor.xzDistToPlayer < 350.0f) {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
void func_80A3A484(EnElfgrp* this, PlayState* play) {
- if (this->unk_144 == 0) {
+ if (this->timer == 0) {
this->actionFunc = func_80A3A0F4;
- this->unk_144 = 30;
+ this->timer = 30;
}
}
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;
+ this->timer = 90;
}
}
}
void func_80A3A520(EnElfgrp* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 0x67)) {
- this->actionFunc = func_80A3A600;
- } else if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103)) {
+ this->actionFunc = EnElfgrp_DoNothing;
+ } 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));
+ Flags_SetSwitch(play, ENELFGRP_GET_SWITCH_FLAG_PARAMS(&this->actor));
- if (this->unk_14A & 2) {
+ if (this->stateFlags & ELFGRP_STATE_1) {
Item_Give(play, ITEM_MASK_GREAT_FAIRY);
}
- if (this->actor.home.rot.z != 0) {
- Flags_SetSwitch(play, this->actor.home.rot.z);
+ if (ENELFGRP_GET_SWITCHFLAG_ROT(&this->actor) != 0) {
+ Flags_SetSwitch(play, ENELFGRP_GET_SWITCHFLAG_ROT(&this->actor));
}
} else if (this->actor.xzDistToPlayer < 350.0f) {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
-void func_80A3A600(EnElfgrp* this, PlayState* play) {
+void EnElfgrp_DoNothing(EnElfgrp* this, PlayState* play) {
}
-void func_80A3A610(EnElfgrp* this, PlayState* play) {
+void EnElfgrp_HealPlayer(EnElfgrp* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (this->unk_144 == 60) {
+ if (this->timer == 60) {
Magic_Add(play, MAGIC_FILL_TO_CAPACITY);
- gSaveContext.healthAccumulator = 320;
+ gSaveContext.healthAccumulator = 0x140;
}
- if (this->unk_144 > 0) {
+ if (this->timer > 0) {
player->actor.freezeTimer = 100;
player->stateFlags1 |= PLAYER_STATE1_20000000;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_FAIRY_GROUP_HEAL - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FAIRY_GROUP_HEAL - SFX_FLAG);
} else {
player->actor.freezeTimer = 0;
player->stateFlags1 &= ~PLAYER_STATE1_20000000;
- this->actionFunc = func_80A3A600;
- this->unk_14A |= 8;
+ this->actionFunc = EnElfgrp_DoNothing;
+ this->stateFlags |= ELFGRP_STATE_3;
}
}
@@ -502,9 +568,9 @@ void func_80A3A6F4(EnElfgrp* this, PlayState* play) {
if (Actor_TextboxIsClosing(&this->actor, play)) {
player->actor.freezeTimer = 100;
player->stateFlags1 |= PLAYER_STATE1_20000000;
- this->unk_144 = func_80A39FBC(play);
- this->actionFunc = func_80A3A610;
- this->unk_14A &= ~8;
+ this->timer = EnElfgrp_SpinStrayFairies(play);
+ this->actionFunc = EnElfgrp_HealPlayer;
+ this->stateFlags &= ~ELFGRP_STATE_3;
}
}
@@ -514,28 +580,30 @@ void func_80A3A77C(EnElfgrp* this, PlayState* play) {
player->actor.freezeTimer = 100;
player->stateFlags1 |= PLAYER_STATE1_20000000;
if (Actor_TextboxIsClosing(&this->actor, play)) {
- this->unk_144 = func_80A39FBC(play);
- this->actionFunc = func_80A3A610;
- this->unk_14A &= ~8;
+ this->timer = EnElfgrp_SpinStrayFairies(play);
+ this->actionFunc = EnElfgrp_HealPlayer;
+ this->stateFlags &= ~ELFGRP_STATE_3;
}
}
void func_80A3A7FC(EnElfgrp* this, PlayState* play) {
- s32 temp_s0;
+ s32 curTotalFairies;
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- gSaveContext.save.weekEventReg[9] |= this->unk_146;
+ gSaveContext.save.saveInfo.weekEventReg[9] |= this->talkedOnceFlag;
this->actionFunc = func_80A3A6F4;
- temp_s0 = func_80A39BD0(play, this->unk_147);
- func_80A39DC8(this, play, temp_s0, 1);
- temp_s0 += func_80A39C1C(play, this->unk_147);
- if (temp_s0 > 25) {
- temp_s0 = 25;
+
+ curTotalFairies = EnElfgrp_GetHeldFairiesCount(play, this->type);
+ EnElfgrp_SpawnStrayFairies(this, play, curTotalFairies, SPAWNED_STRAY_FAIRY_TYPE_RETURNING);
+ curTotalFairies += EnElfgrp_GetFountainFairiesCount(play, this->type);
+ if (curTotalFairies > STRAY_FAIRY_TOTAL) {
+ curTotalFairies = STRAY_FAIRY_TOTAL;
}
- func_80A39CD4(play, this->unk_147, temp_s0);
+
+ EnElfgrp_SetFountainFairiesCount(play, this->type, curTotalFairies);
} else if (this->actor.xzDistToPlayer < 280.0f) {
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8614(&this->actor, play, 300.0f);
+ Actor_OfferTalk(&this->actor, play, 300.0f);
}
}
@@ -544,29 +612,29 @@ 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->talkedOnceFlag;
this->actionFunc = func_80A3A6F4;
return;
}
- if (this->unk_147 != ENELFGRP_0) {
- if (func_80A39BD0(play, this->unk_147) > 0) {
+ if (this->type != ENELFGRP_TYPE_MAGIC) {
+ if (EnElfgrp_GetHeldFairiesCount(play, this->type) > 0) {
this->actionFunc = func_80A3A7FC;
return;
}
}
if (this->actor.xzDistToPlayer < 30.0f) {
- if (gSaveContext.save.playerForm == PLAYER_FORM_DEKU) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_DEKU) {
this->actor.flags &= ~ACTOR_FLAG_10000;
player->actor.freezeTimer = 100;
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->talkedOnceFlag;
} else {
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
} else {
this->actor.flags &= ~ACTOR_FLAG_10000;
@@ -578,11 +646,11 @@ void EnElfgrp_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
- if (this->unk_14A & 8) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_FAIRY_GROUP_FRY - SFX_FLAG);
+ if (this->stateFlags & ELFGRP_STATE_3) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FAIRY_GROUP_FRY - SFX_FLAG);
}
- if (this->unk_144 != 0) {
- this->unk_144--;
+ if (this->timer != 0) {
+ this->timer--;
}
}
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..90f73a8a6 100644
--- a/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.h
+++ b/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.h
@@ -2,29 +2,32 @@
#define Z_EN_ELFGRP_H
#include "global.h"
+#include "overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.h"
struct EnElfgrp;
typedef void (*EnElfgrpActionFunc)(struct EnElfgrp*, PlayState*);
-#define ENELFGRP_GET(thisx) ((thisx)->params & 0xF)
-#define ENELFGRP_GET_FE00(thisx) (((thisx)->params & 0xFE00) >> 9)
+#define ENELFGRP_GET_TYPE(thisx) ((thisx)->params & 0xF) //!< Same type as Great Fairies
+#define ENELFGRP_GET_SWITCH_FLAG_PARAMS(thisx) (((thisx)->params & 0xFE00) >> 9)
+#define ENELFGRP_GET_SWITCHFLAG_ROT(thisx) ((thisx)->home.rot.z)
-enum {
- /* 0 */ ENELFGRP_0,
- /* 2 */ ENELFGRP_1,
- /* 2 */ ENELFGRP_2,
- /* 3 */ ENELFGRP_3,
- /* 4 */ ENELFGRP_4,
-};
+typedef enum ElfgrpType {
+ /* 0 */ ENELFGRP_TYPE_MAGIC = GREAT_FAIRY_TYPE_MAGIC,
+ /* 1 */ ENELFGRP_TYPE_POWER = GREAT_FAIRY_TYPE_POWER,
+ /* 2 */ ENELFGRP_TYPE_WISDOM = GREAT_FAIRY_TYPE_WISDOM,
+ /* 3 */ ENELFGRP_TYPE_COURAGE = GREAT_FAIRY_TYPE_COURAGE,
+ /* 4 */ ENELFGRP_TYPE_KINDNESS = GREAT_FAIRY_TYPE_KINDNESS,
+ /* 5 */ ENELFGRP_TYPE_MAX
+} ElfgrpType;
typedef struct EnElfgrp {
/* 0x000 */ Actor actor;
- /* 0x144 */ s16 unk_144;
- /* 0x146 */ u8 unk_146;
- /* 0x147 */ u8 unk_147;
- /* 0x148 */ s8 unk_148;
- /* 0x14A */ u16 unk_14A;
+ /* 0x144 */ s16 timer;
+ /* 0x146 */ u8 talkedOnceFlag;
+ /* 0x147 */ u8 type;
+ /* 0x148 */ s8 unk_148; // set and not used
+ /* 0x14A */ u16 stateFlags;
/* 0x14C */ EnElfgrpActionFunc actionFunc;
} EnElfgrp; // size = 0x150
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 803a66ac4..3dc3cd7bc 100644
--- a/src/overlays/actors/ovl_En_Elforg/z_en_elforg.c
+++ b/src/overlays/actors/ovl_En_Elforg/z_en_elforg.c
@@ -55,10 +55,10 @@ static ColliderCylinderInit sCylinderInit = {
};
void EnElforg_InitializeParams(EnElforg* this) {
- this->actor.speedXZ = 1.0f;
+ 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;
@@ -87,14 +87,7 @@ void EnElforg_Init(Actor* thisx, PlayState* play) {
break;
case STRAY_FAIRY_TYPE_COLLECTIBLE:
- if (Flags_GetCollectible(play, STRAY_FAIRY_FLAG(thisx))) {
- Actor_Kill(thisx);
- return;
- }
- break;
-
- default:
- if (Flags_GetSwitch(play, STRAY_FAIRY_FLAG(thisx))) {
+ if (Flags_GetCollectible(play, STRAY_FAIRY_GET_FLAG(thisx))) {
Actor_Kill(thisx);
return;
}
@@ -103,7 +96,14 @@ void EnElforg_Init(Actor* thisx, PlayState* play) {
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:
+ case STRAY_FAIRY_TYPE_RETURNING_TO_FOUNTAIN:
+ break;
+
+ default:
+ if (Flags_GetSwitch(play, STRAY_FAIRY_GET_FLAG(thisx))) {
+ Actor_Kill(thisx);
+ return;
+ }
break;
}
@@ -121,7 +121,7 @@ void EnElforg_Init(Actor* thisx, PlayState* play) {
this->targetDistanceFromHome = Rand_ZeroFloat(100.0f) + 50.0f;
break;
- case STRAY_FAIRY_TYPE_TURN_IN_TO_FAIRY_FOUNTAIN:
+ case STRAY_FAIRY_TYPE_RETURNING_TO_FOUNTAIN:
EnElforg_InitializeParams(this);
this->actionFunc = EnElforg_TurnInFairy;
this->secondaryTimer = 60;
@@ -164,7 +164,7 @@ void EnElforg_Destroy(Actor* thisx, PlayState* play) {
void EnElforg_SpawnSparkles(EnElforg* this, PlayState* play, s32 life) {
static Vec3f sVelocity = { 0.0f, -0.05f, 0.0f };
- static Vec3f sAcceleration = { 0.0f, -0.025f, 0.0f };
+ static Vec3f sAccel = { 0.0f, -0.025f, 0.0f };
static Color_RGBA8 sPrimColors[] = {
{ 255, 235, 220, 255 }, { 255, 220, 220, 255 }, { 220, 255, 220, 255 },
{ 220, 220, 255, 255 }, { 255, 255, 200, 255 },
@@ -176,35 +176,35 @@ 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;
- EffectSsKirakira_SpawnDispersed(play, &pos, &sVelocity, &sAcceleration, &sPrimColors[index], &sEnvColors[index],
- 1000, life);
+ EffectSsKirakira_SpawnDispersed(play, &pos, &sVelocity, &sAccel, &sPrimColors[index], &sEnvColors[index], 1000,
+ life);
}
void EnElforg_ApproachTargetYPosition(EnElforg* this, Vec3f* targetPos) {
f32 yDifference = targetPos->y - this->actor.world.pos.y;
- if (fabsf(yDifference) < this->actor.speedXZ) {
+ if (fabsf(yDifference) < this->actor.speed) {
this->actor.world.pos.y = targetPos->y;
} else if (yDifference > 0.0f) {
- this->actor.world.pos.y += this->actor.speedXZ;
+ this->actor.world.pos.y += this->actor.speed;
} else {
- this->actor.world.pos.y -= this->actor.speedXZ;
+ this->actor.world.pos.y -= this->actor.speed;
}
}
void EnElforg_ApproachTargetSpeedXZ(EnElforg* this) {
- if (this->actor.speedXZ > this->targetSpeedXZ) {
- this->actor.speedXZ *= 0.9f;
- } else if (this->actor.speedXZ < (this->targetSpeedXZ - 0.1f)) {
- this->actor.speedXZ += 0.1f;
+ if (this->actor.speed > this->targetSpeedXZ) {
+ this->actor.speed *= 0.9f;
+ } else if (this->actor.speed < (this->targetSpeedXZ - 0.1f)) {
+ this->actor.speed += 0.1f;
} else {
- this->actor.speedXZ = this->targetSpeedXZ;
+ this->actor.speed = this->targetSpeedXZ;
}
}
@@ -216,7 +216,7 @@ void EnElforg_MoveToTargetFairyFountain(EnElforg* this, Vec3f* homePos) {
s16 angleAdjustment;
s16 targetAngle;
- this->actor.shape.yOffset += 100.0f * Math_SinS(this->timer << 9);
+ this->actor.shape.yOffset += 100.0f * Math_SinS(this->timer * 0x200);
EnElforg_ApproachTargetYPosition(this, homePos);
xDifference = this->actor.world.pos.x - homePos->x;
zDifference = this->actor.world.pos.z - homePos->z;
@@ -245,7 +245,7 @@ void EnElforg_MoveToTargetFairyFountain(EnElforg* this, Vec3f* homePos) {
void EnElforg_MoveToTarget(EnElforg* this, Vec3f* targetPos) {
s16 targetAngle;
- this->actor.shape.yOffset += 100.0f * Math_SinS(this->timer << 9);
+ this->actor.shape.yOffset += 100.0f * Math_SinS(this->timer * 0x200);
EnElforg_ApproachTargetYPosition(this, targetPos);
targetAngle = Math_Atan2S_XY(-(this->actor.world.pos.z - targetPos->z), -(this->actor.world.pos.x - targetPos->x));
@@ -273,7 +273,7 @@ void EnElforg_TrappedByBubble(EnElforg* this, PlayState* play) {
EnElforg_InitializeParams(this);
this->actionFunc = EnElforg_FreeFloating;
} else {
- this->actor.shape.yOffset += 10.0f * Math_SinS(this->timer << 9);
+ this->actor.shape.yOffset += 10.0f * Math_SinS(this->timer * 0x200);
this->actor.world.pos = this->actor.parent->world.pos;
this->actor.world.pos.y += 12.0f;
}
@@ -292,7 +292,7 @@ void EnElforg_TurnInFairy(EnElforg* this, PlayState* play) {
// flying towards the fountain's center.
SkelAnime_Update(&this->skelAnime);
this->actor.shape.yOffset *= 0.9f;
- this->actor.speedXZ = 5.0f;
+ this->actor.speed = 5.0f;
EnElforg_ApproachTargetYPosition(this, &player->bodyPartsPos[PLAYER_BODYPART_WAIST]);
xzDistToPlayer = this->actor.xzDistToPlayer;
@@ -324,6 +324,7 @@ void EnElforg_TurnInFairy(EnElforg* this, PlayState* play) {
void EnElforg_QuicklyCircleFairyFountain(EnElforg* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
EnElforg_MoveToTargetFairyFountain(this, &this->actor.home.pos);
+
if (this->secondaryTimer <= 30) {
this->actionFunc = EnElforg_TurnInFairy;
}
@@ -367,9 +368,9 @@ void EnElforg_FreeFloatingFairyFountain(EnElforg* this, PlayState* play) {
if (this->strayFairyFlags & STRAY_FAIRY_FLAG_SPARKLES_AND_SHRINKS) {
// This happens right before the Great Fairy appears once all
// Stray Fairies are saved.
- if (this->actor.home.rot.x > 0) {
+ if (STRAY_FAIRY_SPARKLE_COUNT(&this->actor) > 0) {
EnElforg_SpawnSparkles(this, play, 10);
- this->actor.home.rot.x--;
+ STRAY_FAIRY_SPARKLE_COUNT(&this->actor)--;
}
Actor_SetScale(&this->actor, this->actor.scale.x * 0.9f);
@@ -383,28 +384,30 @@ void EnElforg_CirclePlayer(EnElforg* this, PlayState* play) {
s32 pad;
Actor* playerActor = &GET_PLAYER(play)->actor;
Player* player = GET_PLAYER(play);
- f32 distanceFromPlayer;
+ f32 orbitRadius;
- if (gSaveContext.save.playerForm == PLAYER_FORM_GORON) {
- distanceFromPlayer = 40.0f;
+ if (GET_PLAYER_FORM == PLAYER_FORM_GORON) {
+ orbitRadius = 40.0f;
} else {
- distanceFromPlayer = 20.0f;
+ orbitRadius = 20.0f;
}
- this->actor.world.pos.x = (Math_SinS(this->timer << 12) * distanceFromPlayer) + playerActor->world.pos.x;
- this->actor.world.pos.z = (Math_CosS(this->timer << 12) * distanceFromPlayer) + playerActor->world.pos.z;
+ this->actor.world.pos.x = (Math_SinS(this->timer * 0x1000) * orbitRadius) + playerActor->world.pos.x;
+ this->actor.world.pos.z = (Math_CosS(this->timer * 0x1000) * orbitRadius) + playerActor->world.pos.z;
this->actor.world.pos.y = player->bodyPartsPos[PLAYER_BODYPART_WAIST].y;
+
EnElforg_SpawnSparkles(this, play, 16);
}
void EnElforg_FairyCollected(EnElforg* this, PlayState* play) {
EnElforg_CirclePlayer(this, play);
+
if (this->timer > 80) {
Actor_Kill(&this->actor);
return;
}
- func_800B9010(&this->actor, NA_SE_PL_CHIBI_FAIRY_HEAL - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_PL_CHIBI_FAIRY_HEAL - SFX_FLAG);
}
void EnElforg_SetupFairyCollected(EnElforg* this, PlayState* play) {
@@ -424,23 +427,25 @@ void EnElforg_ClockTownFairyCollected(EnElforg* this, PlayState* play) {
Player* player = GET_PLAYER(play);
EnElforg_CirclePlayer(this, play);
+
player->actor.freezeTimer = 100;
player->stateFlags1 |= PLAYER_STATE1_20000000;
+
if (Actor_TextboxIsClosing(&this->actor, play)) {
player->actor.freezeTimer = 0;
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);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_PL_CHIBI_FAIRY_HEAL - SFX_FLAG);
+ 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);
}
}
}
@@ -451,6 +456,7 @@ void EnElforg_FreeFloating(EnElforg* this, PlayState* play) {
Player* player = GET_PLAYER(play);
SkelAnime_Update(&this->skelAnime);
+
if (Player_GetMask(play) == PLAYER_MASK_GREAT_FAIRY) {
pos = player->bodyPartsPos[PLAYER_BODYPART_WAIST];
this->targetSpeedXZ = 5.0f;
@@ -461,21 +467,23 @@ void EnElforg_FreeFloating(EnElforg* this, PlayState* play) {
}
scaledYDistance = this->actor.playerHeightRel - (this->actor.shape.yOffset * this->actor.scale.y);
+
if (!Player_InCsMode(play)) {
if ((this->actor.xzDistToPlayer < 30.0f) && (scaledYDistance < 12.0f) && (scaledYDistance > -68.0f)) {
EnElforg_SetupFairyCollected(this, play);
Health_ChangeBy(play, 0x30);
+
switch (STRAY_FAIRY_TYPE(&this->actor)) {
case STRAY_FAIRY_TYPE_COLLECTIBLE:
- Flags_SetCollectible(play, STRAY_FAIRY_FLAG(&this->actor));
+ Flags_SetCollectible(play, STRAY_FAIRY_GET_FLAG(&this->actor));
break;
case STRAY_FAIRY_TYPE_CHEST:
- Flags_SetTreasure(play, STRAY_FAIRY_FLAG(&this->actor));
+ Flags_SetTreasure(play, STRAY_FAIRY_GET_FLAG(&this->actor));
break;
default:
- Flags_SetSwitch(play, STRAY_FAIRY_FLAG(&this->actor));
+ Flags_SetSwitch(play, STRAY_FAIRY_GET_FLAG(&this->actor));
break;
}
@@ -485,25 +493,28 @@ 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] >=
+ STRAY_FAIRY_SCATTERED_TOTAL) {
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)) {
- play_sound(NA_SE_SY_FAIRY_MASK_SUCCESS);
+ Audio_PlaySfx(NA_SE_SY_FAIRY_MASK_SUCCESS);
}
this->strayFairyFlags |= STRAY_FAIRY_FLAG_GREAT_FAIRYS_MASK_EQUIPPED;
@@ -539,7 +550,7 @@ void EnElforg_TrappedByEnemy(EnElforg* this, PlayState* play) {
EnElforg_InitializeParams(this);
this->actionFunc = EnElforg_FreeFloating;
this->actor.draw = EnElforg_Draw;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CHIBI_FAIRY_SAVED);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_CHIBI_FAIRY_SAVED);
} else {
// The enemy is still alive, so have the Stray Fairy
// track the enemy in case it's moving around.
@@ -560,7 +571,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;
}
@@ -573,7 +584,7 @@ void EnElforg_HiddenByCollider(EnElforg* this, PlayState* play) {
this->actor.draw = EnElforg_Draw;
this->actor.world.pos.y += 40.0f;
this->actor.home.pos.y += 40.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CHIBI_FAIRY_SAVED);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_CHIBI_FAIRY_SAVED);
} else {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
}
@@ -586,7 +597,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 +636,8 @@ 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));
@@ -643,7 +655,7 @@ void EnElforg_Draw(Actor* thisx, PlayState* play) {
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gStrayFairyStoneTowerTexAnim));
break;
- default:
+ default: // STRAY_FAIRY_AREA_CLOCK_TOWN
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gStrayFairyClockTownTexAnim));
break;
}
diff --git a/src/overlays/actors/ovl_En_Elforg/z_en_elforg.h b/src/overlays/actors/ovl_En_Elforg/z_en_elforg.h
index 798982b09..f4da3cd5e 100644
--- a/src/overlays/actors/ovl_En_Elforg/z_en_elforg.h
+++ b/src/overlays/actors/ovl_En_Elforg/z_en_elforg.h
@@ -2,36 +2,41 @@
#define Z_EN_ELFORG_H
#include "global.h"
+#include "overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.h"
#include "objects/gameplay_keep/gameplay_keep.h"
#define STRAY_FAIRY_TYPE(thisx) ((thisx)->params & 0xF)
#define STRAY_FAIRY_GET_NON_DUNGEON_AREA(thisx) (((thisx)->params & 0x1C0) >> 6)
-#define STRAY_FAIRY_FLAG(thisx) (((thisx)->params & 0xFE00) >> 9)
-#define STRAY_FAIRY_PARAMS(flag, nonDungeonArea, type) (((flag & 0x7F) << 9) | ((nonDungeonArea & 7) << 6) | (type & 0xF))
+#define STRAY_FAIRY_GET_FLAG(thisx) (((thisx)->params & 0xFE00) >> 9)
+#define STRAY_FAIRY_SPARKLE_COUNT(thisx) ((thisx)->home.rot.x)
+
+//! @note `nonDungeonArea` does not always use the enum
+#define STRAY_FAIRY_PARAMS(flag, nonDungeonArea, type) ((((flag) & 0x7F) << 9) | (((nonDungeonArea) & 7) << 6) | ((type) & 0xF))
#define STRAY_FAIRY_FLAG_MOVES_QUICKLY_TO_HOME (1 << 0)
#define STRAY_FAIRY_FLAG_SPARKLES_AND_SHRINKS (1 << 1)
#define STRAY_FAIRY_FLAG_CIRCLES_QUICKLY_IN_FOUNTAIN (1 << 2)
#define STRAY_FAIRY_FLAG_GREAT_FAIRYS_MASK_EQUIPPED (1 << 3)
-typedef enum {
- /* 0 */ STRAY_FAIRY_TYPE_FREE_FLOATING, // The ones just floating around
- /* 1 */ STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN, // The ones already present when you enter a Fairy Fountain
- /* 2 */ STRAY_FAIRY_TYPE_BUBBLE, // The ones trapped in bubbles
- /* 3 */ STRAY_FAIRY_TYPE_CLOCK_TOWN, // The free-floating Stray Fairies in Clock Town
- /* 4 */ STRAY_FAIRY_TYPE_ENEMY, // The ones trapped inside enemies
- /* 5 */ STRAY_FAIRY_TYPE_COLLIDER, // Unused in retail. The fairy is hidden until the collider is hit
- /* 6 */ STRAY_FAIRY_TYPE_CHEST, // The ones in treasure chests
- /* 7 */ STRAY_FAIRY_TYPE_COLLECTIBLE, // The ones in boxes, pots, beehives, etc.
- /* 8 */ STRAY_FAIRY_TYPE_TURN_IN_TO_FAIRY_FOUNTAIN // The ones you "turn in" by walking into a Fairy Fountain
+typedef enum StrayFairyType {
+ /* 0 */ STRAY_FAIRY_TYPE_FREE_FLOATING, // The ones just floating around
+ /* 1 */ STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN, // The ones already present when you enter a Fairy Fountain
+ /* 2 */ STRAY_FAIRY_TYPE_BUBBLE, // The ones trapped in bubbles
+ /* 3 */ STRAY_FAIRY_TYPE_CLOCK_TOWN, // The free-floating Stray Fairies in Clock Town
+ /* 4 */ STRAY_FAIRY_TYPE_ENEMY, // The ones trapped inside enemies
+ /* 5 */ STRAY_FAIRY_TYPE_COLLIDER, // Unused in retail. The fairy is hidden until the collider is hit
+ /* 6 */ STRAY_FAIRY_TYPE_CHEST, // The ones in treasure chests
+ /* 7 */ STRAY_FAIRY_TYPE_COLLECTIBLE, // The ones in boxes, pots, beehives, etc.
+ /* 8 */ STRAY_FAIRY_TYPE_RETURNING_TO_FOUNTAIN // The ones you "turn in" by walking into a Fairy Fountain
} StrayFairyType;
-typedef enum {
- /* 0 */ STRAY_FAIRY_AREA_CLOCK_TOWN,
- /* 1 */ STRAY_FAIRY_AREA_WOODFALL,
- /* 2 */ STRAY_FAIRY_AREA_SNOWHEAD,
- /* 3 */ STRAY_FAIRY_AREA_GREAT_BAY,
- /* 4 */ STRAY_FAIRY_AREA_STONE_TOWER,
+// Corresponds to the Great Fairy types
+typedef enum StrayFairyArea {
+ /* 0 */ STRAY_FAIRY_AREA_CLOCK_TOWN = GREAT_FAIRY_TYPE_MAGIC,
+ /* 1 */ STRAY_FAIRY_AREA_WOODFALL = GREAT_FAIRY_TYPE_POWER,
+ /* 2 */ STRAY_FAIRY_AREA_SNOWHEAD = GREAT_FAIRY_TYPE_WISDOM,
+ /* 3 */ STRAY_FAIRY_AREA_GREAT_BAY = GREAT_FAIRY_TYPE_COURAGE,
+ /* 4 */ STRAY_FAIRY_AREA_STONE_TOWER = GREAT_FAIRY_TYPE_KINDNESS,
/* 5 */ STRAY_FAIRY_AREA_MAX
} StrayFairyArea;
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 2e6a44b64..22a28ed43 100644
--- a/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c
+++ b/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c
@@ -5,15 +5,18 @@
*/
#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_8000000)
+#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_100000 | ACTOR_FLAG_CANT_LOCK_ON)
#define THIS ((EnEncount1*)thisx)
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[] = {
+ DRAGONFLY_PARAMS(DRAGONFLY_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->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ 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,39 @@ 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;
+
+ default:
+ 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 656ec7936..c840c33e1 100644
--- a/src/overlays/actors/ovl_En_Encount2/z_en_encount2.c
+++ b/src/overlays/actors/ovl_En_Encount2/z_en_encount2.c
@@ -5,6 +5,7 @@
*/
#include "z_en_encount2.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "objects/object_fusen/object_fusen.h"
#include "objects/gameplay_keep/gameplay_keep.h"
@@ -20,7 +21,7 @@ void EnEncount2_Draw(Actor* thisx, PlayState* play);
void EnEncount2_Idle(EnEncount2* this, PlayState* play);
void EnEncount2_Popped(EnEncount2* this, PlayState* play);
void EnEncount2_Die(EnEncount2* this, PlayState* play);
-void EnEncount2_SetIdle(EnEncount2* this);
+void EnEncount2_SetupIdle(EnEncount2* this);
void EnEncount2_InitEffects(EnEncount2* this, Vec3f* pos, s16 fadeDelay);
void EnEncount2_UpdateEffects(EnEncount2* this, PlayState* play);
void EnEncount2_DrawEffects(EnEncount2* this, PlayState* play);
@@ -111,28 +112,28 @@ void EnEncount2_Init(Actor* thisx, PlayState* play) {
this->dyna.actor.colChkInfo.mass = MASS_IMMOVABLE;
Collider_InitAndSetJntSph(play, &this->collider, &this->dyna.actor, &sJntSphInit, &this->colElement);
- this->dyna.actor.targetMode = 6;
+ this->dyna.actor.targetMode = TARGET_MODE_6;
this->dyna.actor.colChkInfo.health = 1;
- this->scale = 0.1;
+ this->scale = 0.1f;
this->switchFlag = ENCOUNT2_GET_SWITCH_FLAG(&this->dyna.actor);
if (this->switchFlag == 0x7F) {
this->switchFlag = -1;
}
- if ((this->switchFlag >= 0) && (Flags_GetSwitch(play, this->switchFlag))) {
+ if ((this->switchFlag >= 0) && Flags_GetSwitch(play, this->switchFlag)) {
Actor_Kill(&this->dyna.actor);
return;
}
- this->collider.elements->dim.modelSphere.radius = 0x39;
+ this->collider.elements->dim.modelSphere.radius = 57;
this->collider.elements->dim.scale = 1.0f;
this->collider.elements->dim.modelSphere.center.x = 0;
this->collider.elements->dim.modelSphere.center.y = -4;
this->collider.elements->dim.modelSphere.center.z = 0;
this->dyna.actor.colChkInfo.damageTable = &sDamageTable;
- EnEncount2_SetIdle(this);
+ EnEncount2_SetupIdle(this);
}
void EnEncount2_Destroy(Actor* thisx, PlayState* play) {
@@ -142,7 +143,7 @@ void EnEncount2_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyJntSph(play, &this->collider);
}
-void EnEncount2_SetIdle(EnEncount2* this) {
+void EnEncount2_SetupIdle(EnEncount2* this) {
this->isPopped = false;
this->actionFunc = EnEncount2_Idle;
}
@@ -151,6 +152,7 @@ void EnEncount2_Idle(EnEncount2* this, PlayState* play) {
this->oscillationAngle += 1500.0f;
this->dyna.actor.velocity.y = Math_SinS(this->oscillationAngle);
Math_ApproachF(&this->scale, 0.1f, 0.3f, 0.01f);
+
if ((this->collider.base.acFlags & AC_HIT) && (this->dyna.actor.colChkInfo.damageEffect == 0xE)) {
this->dyna.actor.colChkInfo.health = 0;
this->isPopped = true;
@@ -160,18 +162,18 @@ void EnEncount2_Idle(EnEncount2* this, PlayState* play) {
void EnEncount2_Popped(EnEncount2* this, PlayState* play) {
s32 i;
- Vec3f curPos;
+ Vec3f effPos;
- Math_Vec3f_Copy(&curPos, &this->dyna.actor.world.pos);
- curPos.y += 60.0f;
- Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, curPos.x, curPos.y, curPos.z, 255, 255, 200,
- CLEAR_TAG_LARGE_EXPLOSION);
+ Math_Vec3f_Copy(&effPos, &this->dyna.actor.world.pos);
+ effPos.y += 60.0f;
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, effPos.x, effPos.y, effPos.z, 255, 255, 200,
+ CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_EXPLOSION));
for (i = 0; i < ARRAY_COUNT(this->effects) / 2; ++i) {
- EnEncount2_InitEffects(this, &curPos, 10);
+ EnEncount2_InitEffects(this, &effPos, 10);
}
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_MUJURA_BALLOON_BROKEN);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_MUJURA_BALLOON_BROKEN);
this->deathTimer = 30;
this->actionFunc = EnEncount2_Die;
}
@@ -216,24 +218,24 @@ void EnEncount2_Draw(Actor* thisx, PlayState* play) {
void EnEncount2_InitEffects(EnEncount2* this, Vec3f* pos, s16 fadeDelay) {
s16 i;
- EnEncount2Effect* sPtr = this->effects;
+ EnEncount2Effect* effect = this->effects;
- for (i = 0; i < ARRAY_COUNT(this->effects); i++, sPtr++) {
- if (!sPtr->isEnabled) {
- sPtr->isEnabled = true;
- sPtr->pos = *pos;
- sPtr->alphaFadeDelay = fadeDelay;
- sPtr->alpha = 255;
+ for (i = 0; i < ARRAY_COUNT(this->effects); i++, effect++) {
+ if (!effect->isEnabled) {
+ effect->isEnabled = true;
+ effect->pos = *pos;
+ effect->alphaFadeDelay = fadeDelay;
+ effect->alpha = 255;
- sPtr->accel.x = (Rand_ZeroOne() - 0.5f) * 10.0f;
- sPtr->accel.y = (Rand_ZeroOne() - 0.5f) * 10.0f;
- sPtr->accel.z = (Rand_ZeroOne() - 0.5f) * 10.0f;
+ effect->accel.x = (Rand_ZeroOne() - 0.5f) * 10.0f;
+ effect->accel.y = (Rand_ZeroOne() - 0.5f) * 10.0f;
+ effect->accel.z = (Rand_ZeroOne() - 0.5f) * 10.0f;
- sPtr->velocity.x = Rand_ZeroOne() - 0.5f;
- sPtr->velocity.y = Rand_ZeroOne() - 0.5f;
- sPtr->velocity.z = Rand_ZeroOne() - 0.5f;
+ effect->velocity.x = Rand_ZeroOne() - 0.5f;
+ effect->velocity.y = Rand_ZeroOne() - 0.5f;
+ effect->velocity.z = Rand_ZeroOne() - 0.5f;
- sPtr->scale = (Rand_ZeroFloat(1.0f) * 0.5f) + 2.0f;
+ effect->scale = (Rand_ZeroFloat(1.0f) * 0.5f) + 2.0f;
return;
}
}
@@ -241,23 +243,23 @@ void EnEncount2_InitEffects(EnEncount2* this, Vec3f* pos, s16 fadeDelay) {
void EnEncount2_UpdateEffects(EnEncount2* this, PlayState* play) {
s32 i;
- EnEncount2Effect* sPtr = this->effects;
+ EnEncount2Effect* effect = this->effects;
- for (i = 0; i < ARRAY_COUNT(this->effects); i++, sPtr++) {
- if (sPtr->isEnabled) {
- sPtr->pos.x += sPtr->velocity.x;
- sPtr->pos.y += sPtr->velocity.y;
- sPtr->pos.z += sPtr->velocity.z;
- sPtr->velocity.x += sPtr->accel.x;
- sPtr->velocity.y += sPtr->accel.y;
- sPtr->velocity.z += sPtr->accel.z;
+ for (i = 0; i < ARRAY_COUNT(this->effects); i++, effect++) {
+ if (effect->isEnabled) {
+ effect->pos.x += effect->velocity.x;
+ effect->pos.y += effect->velocity.y;
+ effect->pos.z += effect->velocity.z;
+ effect->velocity.x += effect->accel.x;
+ effect->velocity.y += effect->accel.y;
+ effect->velocity.z += effect->accel.z;
- if (sPtr->alphaFadeDelay != 0) {
- sPtr->alphaFadeDelay--;
+ if (effect->alphaFadeDelay != 0) {
+ effect->alphaFadeDelay--;
} else {
- sPtr->alpha -= 10;
- if (sPtr->alpha < 10) {
- sPtr->isEnabled = 0;
+ effect->alpha -= 10;
+ if (effect->alpha < 10) {
+ effect->isEnabled = 0;
}
}
}
@@ -266,28 +268,30 @@ void EnEncount2_UpdateEffects(EnEncount2* this, PlayState* play) {
void EnEncount2_DrawEffects(EnEncount2* this, PlayState* play) {
s16 i;
- EnEncount2Effect* sPtr;
+ EnEncount2Effect* effect;
GraphicsContext* gfxCtx = play->state.gfxCtx;
OPEN_DISPS(gfxCtx);
- sPtr = this->effects;
- func_8012C28C(gfxCtx);
- func_8012C2DC(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);
+
+ effect = this->effects;
+ Gfx_SetupDL25_Opa(gfxCtx);
+ Gfx_SetupDL25_Xlu(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);
+ Matrix_Scale(effect->scale, effect->scale, effect->scale, MTXMODE_APPLY);
+ 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);
+ gDPSetEnvColor(POLY_XLU_DISP++, 250, 180, 255, effect->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_Encount3/z_en_encount3.c b/src/overlays/actors/ovl_En_Encount3/z_en_encount3.c
index 869d8681e..931e8c6d4 100644
--- a/src/overlays/actors/ovl_En_Encount3/z_en_encount3.c
+++ b/src/overlays/actors/ovl_En_Encount3/z_en_encount3.c
@@ -5,21 +5,23 @@
*/
#include "z_en_encount3.h"
+#include "objects/object_big_fwall/object_big_fwall.h"
-#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_8000000)
+#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_CANT_LOCK_ON)
#define THIS ((EnEncount3*)thisx)
void EnEncount3_Init(Actor* thisx, PlayState* play);
void EnEncount3_Destroy(Actor* thisx, PlayState* play);
-void EnEncount3_Update(Actor* thisx, PlayState* play);
+void EnEncount3_Update(Actor* thisx, PlayState* play2);
void EnEncount3_Draw(Actor* thisx, PlayState* play);
+void func_809AD058(EnEncount3* this);
+
void func_809AD084(EnEncount3* this, PlayState* play);
void func_809AD194(EnEncount3* this, PlayState* play);
void func_809AD1EC(EnEncount3* this, PlayState* play);
-#if 0
ActorInit En_Encount3_InitVars = {
ACTOR_EN_ENCOUNT3,
ACTORCAT_ENEMY,
@@ -32,22 +34,174 @@ ActorInit En_Encount3_InitVars = {
(ActorFunc)EnEncount3_Draw,
};
-#endif
+s32 D_809AD810 = false;
-extern UNK_TYPE D_060009A0;
+void EnEncount3_Init(Actor* thisx, PlayState* play) {
+ EnEncount3* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Encount3/EnEncount3_Init.s")
+ this->unk14A = ENCOUNT3_GET_SPAWN_INDEX(thisx);
+ this->childParams = ENCOUNT3_GET_PARAM_F80(thisx);
+ this->switchFlag = ENCOUNT3_GET_SWITCH_FLAG(thisx);
+ this->csId = this->actor.csId;
+ this->unk16C = ENCOUNT3_GET_ROTZ(thisx) * 10.0f;
+ if (this->unk16C < 10.0f) {
+ this->unk16C = 10.0f;
+ } else if (this->unk16C > 1000.0f) {
+ this->unk16C = 1000.0f;
+ }
+ if (this->switchFlag == 0x7F) {
+ this->switchFlag = -1;
+ }
+ if ((this->switchFlag >= 0) && Flags_GetSwitch(play, this->switchFlag)) {
+ Actor_Kill(&this->actor);
+ }
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ func_809AD058(this);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Encount3/EnEncount3_Destroy.s")
+void EnEncount3_Destroy(Actor* thisx, PlayState* play) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Encount3/func_809AD058.s")
+void func_809AD058(EnEncount3* this) {
+ this->childActorId = ACTOR_EN_JSO;
+ this->unk150 = 1;
+ this->timer = 30;
+ this->actionFunc = func_809AD084;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Encount3/func_809AD084.s")
+void func_809AD084(EnEncount3* this, PlayState* play) {
+ if ((this->switchFlag >= 0) && Flags_GetSwitch(play, this->switchFlag)) {
+ Actor_Kill(&this->actor);
+ return;
+ }
+ if (!(this->unk16C < this->actor.xzDistToPlayer) && (Player_GetMask(play) == PLAYER_MASK_GARO) && !D_809AD810) {
+ if (this->timer > 0) {
+ this->timer--;
+ } else {
+ this->child =
+ Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, this->childActorId, this->actor.world.pos.x,
+ this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, this->childParams);
+ if (this->child != NULL) {
+ this->unk14E++;
+ D_809AD810 = true;
+ this->actionFunc = func_809AD194;
+ }
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Encount3/func_809AD194.s")
+void func_809AD194(EnEncount3* this, PlayState* play) {
+ if (this->unk14E == 0) {
+ this->unk178 = 0.0f;
+ if (this->switchFlag >= 0) {
+ Flags_SetSwitch(play, this->switchFlag);
+ }
+ this->actionFunc = func_809AD1EC;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Encount3/func_809AD1EC.s")
+void func_809AD1EC(EnEncount3* this, PlayState* play) {
+ if (this->unk174 < 0.002f) {
+ D_809AD810 = false;
+ Actor_Kill(&this->actor);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Encount3/EnEncount3_Update.s")
+void EnEncount3_Update(Actor* thisx, PlayState* play2) {
+ EnEncount3* this = THIS;
+ f32 new_var;
+ PlayState* play = play2;
+ Player* player = GET_PLAYER(play);
+ f32 sp3C;
+ f32 sp38;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Encount3/EnEncount3_Draw.s")
+ this->actionFunc(this, play);
+ if (this->actionFunc == func_809AD194) {
+ new_var = this->unk16C * 0.52f;
+ if (new_var < this->actor.xzDistToPlayer) {
+ this->unk178 = ((this->unk16C * 0.03125f) * 0.001f) + 0.1f;
+ } else {
+ this->unk178 = 0.06f;
+ }
+
+ if (((this->unk16C + 50.0f) + BREG(0)) < this->actor.xzDistToPlayer) {
+ if (this->actionFunc == func_809AD194) {
+ this->unk148 = 0;
+ this->unk178 = 0.0f;
+ D_809AD810 = false;
+ if (((this->child != NULL) && (this->child->update != NULL)) && (this->child->colChkInfo.health > 0)) {
+ Actor_Kill(this->child);
+ this->child = NULL;
+ }
+ func_809AD058(this);
+ }
+ } else if (this->unk16C < this->actor.xzDistToPlayer) {
+ s16 i;
+
+ for (i = 0; i < PLAYER_BODYPART_MAX; i++) {
+ player->flameTimers[i] = Rand_S16Offset(0, 200);
+ }
+ player->isBurning = true;
+
+ sp3C = this->actor.world.pos.x - player->actor.world.pos.x;
+ sp38 = this->actor.world.pos.z - player->actor.world.pos.z;
+ if (!Play_InCsMode(play)) {
+ func_800B8D50(play, &this->actor, 10.0f, Math_Atan2S_XY(sp38, sp3C), 0.0f, 1);
+ }
+ }
+ this->child->colChkInfo = this->child->colChkInfo;
+ }
+
+ this->unk168 = this->unk16C;
+ this->unk168 /= 7666.0f;
+ if (this->actionFunc != func_809AD194) {
+ Math_ApproachZeroF(&this->unk170, 0.3f, 10.0f);
+ Math_ApproachZeroF(&this->unk160, 0.3f, 5.0f);
+ if (this->unk160 < 1.0f) {
+ play->unk_18880 = 0;
+ }
+ } else if (this->unk148 != 0) {
+ Math_ApproachF(&this->unk170, 255.0f, 0.4f, 10.0f);
+ Math_ApproachF(&this->unk160, 60.0f, 0.3f, 5.0f);
+ }
+ Math_ApproachF(&this->unk174, this->unk178, 0.3f, 0.03f);
+
+ this->unk164 = this->unk160 / 60.0f;
+ if (this->unk164 != 0.0f) {
+ play->envCtx.adjLightSettings.fogNear = (960 - play->envCtx.lightSettings.fogNear) * this->unk164;
+ play->envCtx.adjLightSettings.fogColor[0] = (40.0f - play->envCtx.lightSettings.fogColor[0]) * this->unk164;
+ play->envCtx.adjLightSettings.fogColor[1] = (10.0f - play->envCtx.lightSettings.fogColor[1]) * this->unk164;
+ play->envCtx.adjLightSettings.fogColor[2] = (0.0f - play->envCtx.lightSettings.fogColor[2]) * this->unk164;
+ }
+}
+
+void EnEncount3_Draw(Actor* thisx, PlayState* play) {
+ EnEncount3* this = THIS;
+ s32 pad;
+
+ if (this->unk170 > 0.0f) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ Matrix_Push();
+
+ gDPPipeSync(POLY_XLU_DISP++);
+ gSPSegment(POLY_XLU_DISP++, 0x08,
+ Gfx_TwoTexScroll(play->state.gfxCtx, 0, (s32)play->gameplayFrames, 0, 0x20, 0x40, 1,
+ (s32)play->gameplayFrames * -2, (s32)play->gameplayFrames * -8, 0x20, 0x20));
+
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 200, 0, (s8)this->unk170);
+ gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 128);
+
+ Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y - 40.0f, this->actor.world.pos.z,
+ MTXMODE_NEW);
+ Matrix_Scale(this->unk168, this->unk174, this->unk168, 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_big_fwall_DL_0009A0);
+
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+}
diff --git a/src/overlays/actors/ovl_En_Encount3/z_en_encount3.h b/src/overlays/actors/ovl_En_Encount3/z_en_encount3.h
index 9ebc87303..9e8bd01ad 100644
--- a/src/overlays/actors/ovl_En_Encount3/z_en_encount3.h
+++ b/src/overlays/actors/ovl_En_Encount3/z_en_encount3.h
@@ -7,10 +7,36 @@ struct EnEncount3;
typedef void (*EnEncount3ActionFunc)(struct EnEncount3*, PlayState*);
+#define ENCOUNT3_GET_SPAWN_INDEX(thisx) (((thisx)->params >> 0xC) & 0xF)
+#define ENCOUNT3_GET_PARAM_F80(thisx) (((thisx)->params >> 7) & 0x1F)
+#define ENCOUNT3_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
+
+#define ENCOUNT3_GET_ROTZ(thisx) ((thisx)->world.rot.z)
+
typedef struct EnEncount3 {
/* 0x000 */ Actor actor;
/* 0x144 */ EnEncount3ActionFunc actionFunc;
- /* 0x148 */ char unk_148[0x84];
+ /* 0x148 */ u8 unk148;
+ /* 0x14A */ s16 unk14A;
+ /* 0x14C */ UNK_TYPE1 pad14C[0x2];
+ /* 0x14E */ s16 unk14E;
+ /* 0x150 */ s16 unk150;
+ /* 0x152 */ s16 unk152;
+ /* 0x154 */ s16 childActorId;
+ /* 0x156 */ s16 unk156;
+ /* 0x158 */ s16 childParams;
+ /* 0x15A */ s16 csId;
+ /* 0x15C */ s16 switchFlag;
+ /* 0x15E */ s16 timer;
+ /* 0x160 */ f32 unk160;
+ /* 0x164 */ f32 unk164;
+ /* 0x168 */ f32 unk168;
+ /* 0x16C */ f32 unk16C;
+ /* 0x170 */ f32 unk170;
+ /* 0x174 */ f32 unk174;
+ /* 0x178 */ f32 unk178;
+ /* 0x17C */ Actor* child;
+ /* 0x180 */ UNK_TYPE1 unk180[0x4C];
} EnEncount3; // size = 0x1CC
#endif // Z_EN_ENCOUNT3_H
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 311668bfe..077273309 100644
--- a/src/overlays/actors/ovl_En_Encount4/z_en_encount4.c
+++ b/src/overlays/actors/ovl_En_Encount4/z_en_encount4.c
@@ -6,7 +6,7 @@
#include "z_en_encount4.h"
-#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_8000000)
+#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_CANT_LOCK_ON)
#define THIS ((EnEncount4*)thisx)
@@ -53,7 +53,7 @@ void EnEncount4_Init(Actor* thisx, PlayState* play) {
return;
}
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actionFunc = func_809C3FD8;
}
@@ -72,11 +72,12 @@ void func_809C3FD8(EnEncount4* this, PlayState* play) {
while (actor != NULL) {
if (actor->id != ACTOR_EN_BSB) {
actor = actor->next;
- } else {
- this->captainKeeta = (EnBsb*)actor;
- this->actionFunc = func_809C4078;
- break;
+ continue;
}
+
+ this->captainKeeta = (EnBsb*)actor;
+ this->actionFunc = func_809C4078;
+ break;
}
}
}
@@ -103,11 +104,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)) {
@@ -145,15 +146,16 @@ void func_809C42A8(EnEncount4* this, PlayState* play) {
if ((this->captainKeeta->actor.id != ACTOR_EN_BSB) || (captainKeeta->actor.update == NULL)) {
Actor_Kill(&this->actor);
}
-
return;
- } else if (this->unk_14E >= 2) {
+ }
+
+ if (this->unk_14E >= 2) {
this->timer = 100;
this->actionFunc = func_809C464C;
-
return;
- } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_85_40) || (this->unk_14C >= 2) ||
- (this->actor.xzDistToPlayer > 240.0f)) {
+ }
+
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_85_40) || (this->unk_14C >= 2) || (this->actor.xzDistToPlayer > 240.0f)) {
return;
}
@@ -167,14 +169,14 @@ void func_809C42A8(EnEncount4* this, PlayState* play) {
}
pos.y = yIntersect;
- yRot = (s32)Rand_ZeroFloat(512.0f) + this->actor.world.rot.y + 0x3800;
+ yRot = (s32)Rand_ZeroFloat(0x200) + this->actor.world.rot.y + 0x3800;
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 6cdf54d70..c281bd61f 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
@@ -5,9 +5,8 @@
*/
#include "z_en_ending_hero.h"
-#include "objects/object_dt/object_dt.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnEndingHero*)thisx)
@@ -16,8 +15,8 @@ void EnEndingHero_Destroy(Actor* thisx, PlayState* play);
void EnEndingHero_Update(Actor* thisx, PlayState* play);
void EnEndingHero_Draw(Actor* thisx, PlayState* play);
-void func_80C1E748(EnEndingHero* this);
-void func_80C1E764(EnEndingHero* this, PlayState* play);
+void EnEndingHero1_SetupIdle(EnEndingHero* this);
+void EnEndingHero1_Idle(EnEndingHero* this, PlayState* play);
ActorInit En_Ending_Hero_InitVars = {
ACTOR_EN_ENDING_HERO,
@@ -36,23 +35,23 @@ void EnEndingHero_Init(Actor* thisx, PlayState* play) {
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
Actor_SetScale(&this->actor, 0.01f);
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
this->actor.gravity = -3.0f;
SkelAnime_InitFlex(play, &this->skelAnime, &object_dt_Skel_00B0CC, &object_dt_Anim_000BE0, this->jointTable,
- this->morphTable, 15);
+ this->morphTable, OBJECT_DT_LIMB_MAX);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 25.0f);
- func_80C1E748(this);
+ EnEndingHero1_SetupIdle(this);
}
void EnEndingHero_Destroy(Actor* thisx, PlayState* play) {
}
-void func_80C1E748(EnEndingHero* this) {
- this->unk244 = 1;
- this->actionFunc = func_80C1E764;
+void EnEndingHero1_SetupIdle(EnEndingHero* this) {
+ this->isIdle = true;
+ this->actionFunc = EnEndingHero1_Idle;
}
-void func_80C1E764(EnEndingHero* this, PlayState* play) {
+void EnEndingHero1_Idle(EnEndingHero* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
}
@@ -60,7 +59,7 @@ void EnEndingHero_Update(Actor* thisx, PlayState* play) {
EnEndingHero* this = THIS;
if (this->unk240 == 0) {
- this->unk242 += 1;
+ this->unk242++;
if (this->unk242 > 2) {
this->unk242 = 0;
this->unk240 = (s16)Rand_ZeroFloat(60.0f) + 0x14;
@@ -68,16 +67,18 @@ 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 D_80C1E970[] = {
- object_dt_Tex_007350, object_dt_Tex_009590, object_dt_Tex_009F90, object_dt_Tex_00A790, object_dt_Tex_00AB90,
+static TexturePtr sEyeTextures[] = {
+ gDotourEyeShockTex, gDotourEyeOpenTex, gDotourEyeClosedTex, gDotourEyeLookDownTex, gDotourEyeSquintTex,
};
-static TexturePtr D_80C1E984[] = {
- object_dt_Tex_007750,
- object_dt_Tex_00A390,
- object_dt_Tex_00A490,
+static TexturePtr sEyebrowTextures[] = {
+ gDotourEyebrowHighTex,
+ gDotourEyebrowMidTex,
+ gDotourEyebrowLowTex,
};
void EnEndingHero_Draw(Actor* thisx, PlayState* play) {
@@ -85,16 +86,17 @@ 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);
- gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80C1E970[this->unk242]));
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->unk242]));
if (this->unk242 < 3) {
index = this->unk242;
}
- gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80C1E984[index]));
+ gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sEyebrowTextures[index]));
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_Hero/z_en_ending_hero.h b/src/overlays/actors/ovl_En_Ending_Hero/z_en_ending_hero.h
index 6049e3449..21f5266e7 100644
--- a/src/overlays/actors/ovl_En_Ending_Hero/z_en_ending_hero.h
+++ b/src/overlays/actors/ovl_En_Ending_Hero/z_en_ending_hero.h
@@ -2,6 +2,7 @@
#define Z_EN_ENDING_HERO_H
#include "global.h"
+#include "objects/object_dt/object_dt.h"
struct EnEndingHero;
@@ -10,12 +11,12 @@ typedef void (*EnEndingHeroActionFunc)(struct EnEndingHero*, PlayState*);
typedef struct EnEndingHero {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[15];
- /* 0x1E2 */ Vec3s morphTable[15];
+ /* 0x188 */ Vec3s jointTable[OBJECT_DT_LIMB_MAX];
+ /* 0x1E2 */ Vec3s morphTable[OBJECT_DT_LIMB_MAX];
/* 0x23C */ EnEndingHeroActionFunc actionFunc;
/* 0x240 */ s16 unk240;
/* 0x242 */ s16 unk242;
- /* 0x244 */ u16 unk244;
+ /* 0x244 */ u16 isIdle;
} EnEndingHero; // size = 0x248
#endif // Z_EN_ENDING_HERO_H
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..31bc4be65 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
@@ -5,9 +5,8 @@
*/
#include "z_en_ending_hero2.h"
-#include "objects/object_bai/object_bai.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnEndingHero2*)thisx)
@@ -16,8 +15,8 @@ void EnEndingHero2_Destroy(Actor* thisx, PlayState* play);
void EnEndingHero2_Update(Actor* thisx, PlayState* play);
void EnEndingHero2_Draw(Actor* thisx, PlayState* play);
-void func_80C232E8(EnEndingHero2* this);
-void func_80C23304(EnEndingHero2* this, PlayState* play);
+void EnEndingHero2_SetupIdle(EnEndingHero2* this);
+void EnEndingHero2_Idle(EnEndingHero2* this, PlayState* play);
ActorInit En_Ending_Hero2_InitVars = {
ACTOR_EN_ENDING_HERO2,
@@ -36,23 +35,23 @@ void EnEndingHero2_Init(Actor* thisx, PlayState* play) {
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
Actor_SetScale(&this->actor, 0.01f);
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
this->actor.gravity = -3.0f;
SkelAnime_InitFlex(play, &this->skelAnime, &object_bai_Skel_007908, &object_bai_Anim_0011C0, this->jointTable,
- this->morphTable, 20);
+ this->morphTable, OBJECT_BAI_LIMB_MAX);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 25.0f);
- func_80C232E8(this);
+ EnEndingHero2_SetupIdle(this);
}
void EnEndingHero2_Destroy(Actor* thisx, PlayState* play) {
}
-void func_80C232E8(EnEndingHero2* this) {
- this->unk27C = 1;
- this->actionFunc = func_80C23304;
+void EnEndingHero2_SetupIdle(EnEndingHero2* this) {
+ this->isIdle = true;
+ this->actionFunc = EnEndingHero2_Idle;
}
-void func_80C23304(EnEndingHero2* this, PlayState* play) {
+void EnEndingHero2_Idle(EnEndingHero2* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
}
@@ -61,14 +60,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_Hero2/z_en_ending_hero2.h b/src/overlays/actors/ovl_En_Ending_Hero2/z_en_ending_hero2.h
index 2ad3b4914..4f18b8e22 100644
--- a/src/overlays/actors/ovl_En_Ending_Hero2/z_en_ending_hero2.h
+++ b/src/overlays/actors/ovl_En_Ending_Hero2/z_en_ending_hero2.h
@@ -2,6 +2,7 @@
#define Z_EN_ENDING_HERO2_H
#include "global.h"
+#include "objects/object_bai/object_bai.h"
struct EnEndingHero2;
@@ -10,10 +11,10 @@ typedef void (*EnEndingHero2ActionFunc)(struct EnEndingHero2*, PlayState*);
typedef struct EnEndingHero2 {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[20];
- /* 0x200 */ Vec3s morphTable[20];
+ /* 0x188 */ Vec3s jointTable[OBJECT_BAI_LIMB_MAX];
+ /* 0x200 */ Vec3s morphTable[OBJECT_BAI_LIMB_MAX];
/* 0x278 */ EnEndingHero2ActionFunc actionFunc;
- /* 0x27C */ u16 unk27C;
+ /* 0x27C */ u16 isIdle;
} EnEndingHero2; // size = 0x280
#endif // Z_EN_ENDING_HERO2_H
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..bfca5a5b5 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
@@ -5,9 +5,8 @@
*/
#include "z_en_ending_hero3.h"
-#include "objects/object_toryo/object_toryo.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnEndingHero3*)thisx)
@@ -16,8 +15,8 @@ void EnEndingHero3_Destroy(Actor* thisx, PlayState* play);
void EnEndingHero3_Update(Actor* thisx, PlayState* play);
void EnEndingHero3_Draw(Actor* thisx, PlayState* play);
-void func_80C23518(EnEndingHero3* this);
-void func_80C23534(EnEndingHero3* this, PlayState* play);
+void EnEndingHero3_SetupIdle(EnEndingHero3* this);
+void EnEndingHero3_Idle(EnEndingHero3* this, PlayState* play);
ActorInit En_Ending_Hero3_InitVars = {
ACTOR_EN_ENDING_HERO3,
@@ -36,23 +35,23 @@ void EnEndingHero3_Init(Actor* thisx, PlayState* play) {
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
Actor_SetScale(&this->actor, 0.01f);
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
this->actor.gravity = -3.0f;
SkelAnime_InitFlex(play, &this->skelAnime, &object_toryo_Skel_007150, &object_toryo_Anim_000E50, this->jointTable,
- this->morphTable, 17);
+ this->morphTable, OBJECT_TORYO_LIMB_MAX);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 25.0f);
- func_80C23518(this);
+ EnEndingHero3_SetupIdle(this);
}
void EnEndingHero3_Destroy(Actor* thisx, PlayState* play) {
}
-void func_80C23518(EnEndingHero3* this) {
- this->unk258 = 1;
- this->actionFunc = func_80C23534;
+void EnEndingHero3_SetupIdle(EnEndingHero3* this) {
+ this->isIdle = true;
+ this->actionFunc = EnEndingHero3_Idle;
}
-void func_80C23534(EnEndingHero3* this, PlayState* play) {
+void EnEndingHero3_Idle(EnEndingHero3* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
}
@@ -61,14 +60,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_Hero3/z_en_ending_hero3.h b/src/overlays/actors/ovl_En_Ending_Hero3/z_en_ending_hero3.h
index 0887df1ab..21aaa079e 100644
--- a/src/overlays/actors/ovl_En_Ending_Hero3/z_en_ending_hero3.h
+++ b/src/overlays/actors/ovl_En_Ending_Hero3/z_en_ending_hero3.h
@@ -2,6 +2,7 @@
#define Z_EN_ENDING_HERO3_H
#include "global.h"
+#include "objects/object_toryo/object_toryo.h"
struct EnEndingHero3;
@@ -10,10 +11,10 @@ typedef void (*EnEndingHero3ActionFunc)(struct EnEndingHero3*, PlayState*);
typedef struct EnEndingHero3 {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[17];
- /* 0x1EE */ Vec3s morphTable[17];
+ /* 0x188 */ Vec3s jointTable[OBJECT_TORYO_LIMB_MAX];
+ /* 0x1EE */ Vec3s morphTable[OBJECT_TORYO_LIMB_MAX];
/* 0x254 */ EnEndingHero3ActionFunc actionFunc;
- /* 0x258 */ u16 unk258;
+ /* 0x258 */ u16 isIdle;
} EnEndingHero3; // size = 0x25C
#endif // Z_EN_ENDING_HERO3_H
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..3d75e19d7 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
@@ -5,9 +5,8 @@
*/
#include "z_en_ending_hero4.h"
-#include "objects/object_sdn/object_sdn.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnEndingHero4*)thisx)
@@ -16,8 +15,8 @@ void EnEndingHero4_Destroy(Actor* thisx, PlayState* play);
void EnEndingHero4_Update(Actor* thisx, PlayState* play);
void EnEndingHero4_Draw(Actor* thisx, PlayState* play);
-void func_80C23748(EnEndingHero4* this);
-void func_80C23764(EnEndingHero4* this, PlayState* play);
+void EnEndingHero4_SetupIdle(EnEndingHero4* this);
+void EnEndingHero4_Idle(EnEndingHero4* this, PlayState* play);
ActorInit En_Ending_Hero4_InitVars = {
ACTOR_EN_ENDING_HERO4,
@@ -36,23 +35,23 @@ void EnEndingHero4_Init(Actor* thisx, PlayState* play) {
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
Actor_SetScale(&this->actor, 0.01f);
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
this->actor.gravity = -3.0f;
SkelAnime_InitFlex(play, &this->skelAnime, &gSoldierSkel, &gSoldierCheerWithSpear, this->jointTable,
- this->morphTable, 17);
+ this->morphTable, SOLDIER_LIMB_MAX);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 25.0f);
- func_80C23748(this);
+ EnEndingHero4_SetupIdle(this);
}
void EnEndingHero4_Destroy(Actor* thisx, PlayState* play) {
}
-void func_80C23748(EnEndingHero4* this) {
- this->unk258 = 1;
- this->actionFunc = func_80C23764;
+void EnEndingHero4_SetupIdle(EnEndingHero4* this) {
+ this->isIdle = true;
+ this->actionFunc = EnEndingHero4_Idle;
}
-void func_80C23764(EnEndingHero4* this, PlayState* play) {
+void EnEndingHero4_Idle(EnEndingHero4* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
}
@@ -61,14 +60,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_Hero4/z_en_ending_hero4.h b/src/overlays/actors/ovl_En_Ending_Hero4/z_en_ending_hero4.h
index 4cada4183..e52b41124 100644
--- a/src/overlays/actors/ovl_En_Ending_Hero4/z_en_ending_hero4.h
+++ b/src/overlays/actors/ovl_En_Ending_Hero4/z_en_ending_hero4.h
@@ -2,6 +2,7 @@
#define Z_EN_ENDING_HERO4_H
#include "global.h"
+#include "objects/object_sdn/object_sdn.h"
struct EnEndingHero4;
@@ -10,10 +11,10 @@ typedef void (*EnEndingHero4ActionFunc)(struct EnEndingHero4*, PlayState*);
typedef struct EnEndingHero4 {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[17];
- /* 0x1EE */ Vec3s morphTable[17];
+ /* 0x188 */ Vec3s jointTable[SOLDIER_LIMB_MAX];
+ /* 0x1EE */ Vec3s morphTable[SOLDIER_LIMB_MAX];
/* 0x254 */ EnEndingHero4ActionFunc actionFunc;
- /* 0x258 */ u16 unk258;
+ /* 0x258 */ u16 isIdle;
} EnEndingHero4; // size = 0x25C
#endif // Z_EN_ENDING_HERO4_H
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..2120f0a27 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
@@ -5,9 +5,8 @@
*/
#include "z_en_ending_hero5.h"
-#include "objects/object_daiku/object_daiku.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnEndingHero5*)thisx)
@@ -16,8 +15,8 @@ void EnEndingHero5_Destroy(Actor* thisx, PlayState* play);
void EnEndingHero5_Update(Actor* thisx, PlayState* play);
void EnEndingHero5_Draw(Actor* thisx, PlayState* play);
-void func_80C23980(EnEndingHero5* this);
-void func_80C2399C(EnEndingHero5* this, PlayState* play);
+void EnEndingHero5_SetupIdle(EnEndingHero5* this);
+void EnEndingHero5_Idle(EnEndingHero5* this, PlayState* play);
ActorInit En_Ending_Hero5_InitVars = {
ACTOR_EN_ENDING_HERO5,
@@ -36,24 +35,24 @@ void EnEndingHero5_Init(Actor* thisx, PlayState* play) {
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
Actor_SetScale(&this->actor, 0.01f);
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
this->actor.gravity = -3.0f;
SkelAnime_InitFlex(play, &this->skelAnime, &object_daiku_Skel_00A850, &object_daiku_Anim_002FA0, this->jointTable,
- this->morphTable, 17);
+ this->morphTable, OBJECT_DAIKU_LIMB_MAX);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 25.0f);
this->unk25C = this->actor.params;
- func_80C23980(this);
+ EnEndingHero5_SetupIdle(this);
}
void EnEndingHero5_Destroy(Actor* thisx, PlayState* play) {
}
-void func_80C23980(EnEndingHero5* this) {
- this->unk258 = 1;
- this->actionFunc = func_80C2399C;
+void EnEndingHero5_SetupIdle(EnEndingHero5* this) {
+ this->isIdle = true;
+ this->actionFunc = EnEndingHero5_Idle;
}
-void func_80C2399C(EnEndingHero5* this, PlayState* play) {
+void EnEndingHero5_Idle(EnEndingHero5* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
}
@@ -62,7 +61,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,
@@ -73,7 +74,7 @@ void EnEndingHero5_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
OPEN_DISPS(play->state.gfxCtx);
- if (limbIndex == 15) {
+ if (limbIndex == OBJECT_DAIKU_LIMB_0F) {
gSPDisplayList(POLY_OPA_DISP++, D_80C23BF0[this->unk25C]);
}
@@ -83,26 +84,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_Hero5/z_en_ending_hero5.h b/src/overlays/actors/ovl_En_Ending_Hero5/z_en_ending_hero5.h
index 9e3dab09e..fec2d112a 100644
--- a/src/overlays/actors/ovl_En_Ending_Hero5/z_en_ending_hero5.h
+++ b/src/overlays/actors/ovl_En_Ending_Hero5/z_en_ending_hero5.h
@@ -2,6 +2,7 @@
#define Z_EN_ENDING_HERO5_H
#include "global.h"
+#include "objects/object_daiku/object_daiku.h"
struct EnEndingHero5;
@@ -10,10 +11,10 @@ typedef void (*EnEndingHero5ActionFunc)(struct EnEndingHero5*, PlayState*);
typedef struct EnEndingHero5 {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[17];
- /* 0x1EE */ Vec3s morphTable[17];
+ /* 0x188 */ Vec3s jointTable[OBJECT_DAIKU_LIMB_MAX];
+ /* 0x1EE */ Vec3s morphTable[OBJECT_DAIKU_LIMB_MAX];
/* 0x254 */ EnEndingHero5ActionFunc actionFunc;
- /* 0x258 */ u16 unk258;
+ /* 0x258 */ u16 isIdle;
/* 0x25C */ s32 unk25C;
} EnEndingHero5; // size = 0x260
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 8f19fe9f8..64b7ea1c2 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
@@ -5,13 +5,8 @@
*/
#include "z_en_ending_hero6.h"
-#include "objects/object_dt/object_dt.h"
-#include "objects/object_daiku/object_daiku.h"
-#include "objects/object_bai/object_bai.h"
-#include "objects/object_toryo/object_toryo.h"
-#include "objects/object_sdn/object_sdn.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnEndingHero6*)thisx)
@@ -20,7 +15,6 @@ void EnEndingHero6_Destroy(Actor* thisx, PlayState* play);
void EnEndingHero6_Update(Actor* thisx, PlayState* play);
void EnEndingHero6_Draw(Actor* thisx, PlayState* play);
-void EnEndingHero6_InitSkelAnime(EnEndingHero6* this, s32 npcIndex);
void EnEndingHero6_SetupIdle(EnEndingHero6* this);
void EnEndingHero6_Idle(EnEndingHero6* this, PlayState* play);
@@ -36,29 +30,64 @@ ActorInit En_Ending_Hero6_InitVars = {
(ActorFunc)EnEndingHero6_Draw,
};
-static FlexSkeletonHeader* sSkeletons[] = {
- &object_dt_Skel_00B0CC, &object_bai_Skel_007908, &object_toryo_Skel_007150, &gSoldierSkel,
- &object_daiku_Skel_00A850, &object_daiku_Skel_00A850, &object_daiku_Skel_00A850, &object_daiku_Skel_00A850,
- &object_daiku_Skel_00A850,
+typedef enum {
+ /* 0 */ ENDING_HERO6_TYPE_DT,
+ /* 1 */ ENDING_HERO6_TYPE_BAI,
+ /* 2 */ ENDING_HERO6_TYPE_TORYO,
+ /* 3 */ ENDING_HERO6_TYPE_SOLDIER,
+ /* 4 */ ENDING_HERO6_TYPE_DAIKU_RED,
+ /* 5 */ ENDING_HERO6_TYPE_DAIKU_BLUE,
+ /* 6 */ ENDING_HERO6_TYPE_DAIKU_GREEN,
+ /* 7 */ ENDING_HERO6_TYPE_DAIKU_PURPLE,
+ /* 8 */ ENDING_HERO6_TYPE_DAIKU_ORANGE,
+ /* 9 */ ENDING_HERO6_TYPE_MAX
+} EndingHero6Type;
+
+static FlexSkeletonHeader* sSkeletons[ENDING_HERO6_TYPE_MAX] = {
+ &object_dt_Skel_00B0CC, // ENDING_HERO6_TYPE_DT
+ &object_bai_Skel_007908, // ENDING_HERO6_TYPE_BAI
+ &object_toryo_Skel_007150, // ENDING_HERO6_TYPE_TORYO
+ &gSoldierSkel, // ENDING_HERO6_TYPE_SOLDIER
+ &object_daiku_Skel_00A850, // ENDING_HERO6_TYPE_DAIKU_RED
+ &object_daiku_Skel_00A850, // ENDING_HERO6_TYPE_DAIKU_BLUE
+ &object_daiku_Skel_00A850, // ENDING_HERO6_TYPE_DAIKU_GREEN
+ &object_daiku_Skel_00A850, // ENDING_HERO6_TYPE_DAIKU_PURPLE
+ &object_daiku_Skel_00A850, // ENDING_HERO6_TYPE_DAIKU_ORANGE
};
-static AnimationHeader* sAnimations[] = {
- &object_dt_Anim_000BE0, &object_bai_Anim_0011C0, &object_toryo_Anim_000E50,
- &gSoldierCheerWithSpear, &object_daiku_Anim_002FA0, &object_daiku_Anim_002FA0,
- &object_daiku_Anim_002FA0, &object_daiku_Anim_002FA0, &object_daiku_Anim_002FA0,
+static AnimationHeader* sAnimations[ENDING_HERO6_TYPE_MAX] = {
+ &object_dt_Anim_000BE0, // ENDING_HERO6_TYPE_DT
+ &object_bai_Anim_0011C0, // ENDING_HERO6_TYPE_BAI
+ &object_toryo_Anim_000E50, // ENDING_HERO6_TYPE_TORYO
+ &gSoldierCheerWithSpear, // ENDING_HERO6_TYPE_SOLDIER
+ &object_daiku_Anim_002FA0, // ENDING_HERO6_TYPE_DAIKU_RED
+ &object_daiku_Anim_002FA0, // ENDING_HERO6_TYPE_DAIKU_BLUE
+ &object_daiku_Anim_002FA0, // ENDING_HERO6_TYPE_DAIKU_GREEN
+ &object_daiku_Anim_002FA0, // ENDING_HERO6_TYPE_DAIKU_PURPLE
+ &object_daiku_Anim_002FA0, // ENDING_HERO6_TYPE_DAIKU_ORANGE
};
-static s32 sLimbCounts[] = { 15, 20, 17, 17, 17, 17, 17, 17, 17 };
+static s32 sLimbCounts[ENDING_HERO6_TYPE_MAX] = {
+ OBJECT_DT_LIMB_MAX, // ENDING_HERO6_TYPE_DT
+ OBJECT_BAI_LIMB_MAX, // ENDING_HERO6_TYPE_BAI
+ OBJECT_TORYO_LIMB_MAX, // ENDING_HERO6_TYPE_TORYO
+ SOLDIER_LIMB_MAX, // ENDING_HERO6_TYPE_SOLDIER
+ OBJECT_DAIKU_LIMB_MAX, // ENDING_HERO6_TYPE_DAIKU_RED
+ OBJECT_DAIKU_LIMB_MAX, // ENDING_HERO6_TYPE_DAIKU_BLUE
+ OBJECT_DAIKU_LIMB_MAX, // ENDING_HERO6_TYPE_DAIKU_GREEN
+ OBJECT_DAIKU_LIMB_MAX, // ENDING_HERO6_TYPE_DAIKU_PURPLE
+ OBJECT_DAIKU_LIMB_MAX, // ENDING_HERO6_TYPE_DAIKU_ORANGE
+};
void EnEndingHero6_Init(Actor* thisx, PlayState* play) {
EnEndingHero6* this = THIS;
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
Actor_SetScale(&this->actor, 0.01f);
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
this->actor.gravity = -3.0f;
- SkelAnime_InitFlex(play, &this->skelAnime, sSkeletons[this->npcIndex], sAnimations[this->npcIndex],
- this->jointTable, this->morphTable, sLimbCounts[this->npcIndex]);
+ SkelAnime_InitFlex(play, &this->skelAnime, sSkeletons[this->type], sAnimations[this->type], this->jointTable,
+ this->morphTable, sLimbCounts[this->type]);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 25.0f);
EnEndingHero6_SetupIdle(this);
}
@@ -66,15 +95,16 @@ void EnEndingHero6_Init(Actor* thisx, PlayState* play) {
void EnEndingHero6_Destroy(Actor* thisx, PlayState* play) {
}
-void EnEndingHero6_InitSkelAnime(EnEndingHero6* this, s32 npcIndex) {
- this->animIndex = npcIndex;
- this->frameCount = Animation_GetLastFrame(sAnimations[npcIndex]);
- Animation_Change(&this->skelAnime, sAnimations[this->animIndex], 1.0f, 0.f, this->frameCount, ANIMMODE_LOOP, 0.0f);
+void EnEndingHero6_ChangeAnim(EnEndingHero6* this, s32 type) {
+ this->animIndex = type;
+ this->animEndFrame = Animation_GetLastFrame(sAnimations[type]);
+ Animation_Change(&this->skelAnime, sAnimations[this->animIndex], 1.0f, 0.f, this->animEndFrame, ANIMMODE_LOOP,
+ 0.0f);
}
void EnEndingHero6_SetupIdle(EnEndingHero6* this) {
- EnEndingHero6_InitSkelAnime(this, this->npcIndex);
- this->isIdle = 1;
+ EnEndingHero6_ChangeAnim(this, this->type);
+ this->isIdle = true;
this->actionFunc = EnEndingHero6_Idle;
}
@@ -101,68 +131,82 @@ 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) {
- static Gfx* D_80C2426C[] = { object_daiku_DL_0070C0, object_daiku_DL_006FB0, object_daiku_DL_006E80,
- object_daiku_DL_006D70, object_daiku_DL_00A390 };
+ static Gfx* D_80C2426C[] = {
+ object_daiku_DL_0070C0, // ENDING_HERO6_TYPE_DAIKU_RED
+ object_daiku_DL_006FB0, // ENDING_HERO6_TYPE_DAIKU_BLUE
+ object_daiku_DL_006E80, // ENDING_HERO6_TYPE_DAIKU_GREEN
+ object_daiku_DL_006D70, // ENDING_HERO6_TYPE_DAIKU_PURPLE
+ object_daiku_DL_00A390, // ENDING_HERO6_TYPE_DAIKU_ORANGE
+ };
EnEndingHero6* this = THIS;
- s32 index;
+ s32 daikuIndex;
OPEN_DISPS(play->state.gfxCtx);
- if (this->npcIndex >= 4 && limbIndex == 15) {
- index = this->npcIndex - 4;
- gSPDisplayList(POLY_OPA_DISP++, D_80C2426C[index]);
+ if ((this->type >= ENDING_HERO6_TYPE_DAIKU_RED) && (limbIndex == OBJECT_DAIKU_LIMB_0F)) {
+ daikuIndex = this->type - ENDING_HERO6_TYPE_DAIKU_RED;
+ gSPDisplayList(POLY_OPA_DISP++, D_80C2426C[daikuIndex]);
}
CLOSE_DISPS(play->state.gfxCtx);
}
void EnEndingHero6_Draw(Actor* thisx, PlayState* play) {
- static TexturePtr D_80C24280[] = { object_dt_Tex_007350, object_dt_Tex_009590, object_dt_Tex_009F90,
- object_dt_Tex_00A790, object_dt_Tex_00AB90 };
- static TexturePtr D_80C24294[] = { object_dt_Tex_007750, object_dt_Tex_00A390, object_dt_Tex_00A490 };
+ static TexturePtr sEyeTextures[] = { gDotourEyeShockTex, gDotourEyeOpenTex, gDotourEyeClosedTex,
+ gDotourEyeLookDownTex, gDotourEyeSquintTex };
+ static TexturePtr sEyebrowTextures[] = { gDotourEyebrowHighTex, gDotourEyebrowMidTex, gDotourEyebrowLowTex };
s32 pad;
EnEndingHero6* this = THIS;
s32 index = 0;
- if (this->isIdle == 1) {
+ if (this->isIdle == true) {
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)) {
- gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->objectIndex].segment);
+ if ((this->objectIndex >= 0) && Object_IsLoaded(&play->objectCtx, this->objectIndex)) {
+ gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[this->objectIndex].segment);
- switch (this->npcIndex) {
- case 4:
+ switch (this->type) {
+ case ENDING_HERO6_TYPE_DAIKU_RED:
gDPSetEnvColor(POLY_OPA_DISP++, 170, 10, 70, 255);
break;
- case 5:
+
+ case ENDING_HERO6_TYPE_DAIKU_BLUE:
gDPSetEnvColor(POLY_OPA_DISP++, 170, 200, 255, 255);
break;
- case 6:
+
+ case ENDING_HERO6_TYPE_DAIKU_GREEN:
gDPSetEnvColor(POLY_OPA_DISP++, 0, 230, 70, 255);
break;
- case 7:
+
+ case ENDING_HERO6_TYPE_DAIKU_PURPLE:
gDPSetEnvColor(POLY_OPA_DISP++, 200, 0, 150, 255);
break;
- case 8:
+
+ case ENDING_HERO6_TYPE_DAIKU_ORANGE:
gDPSetEnvColor(POLY_OPA_DISP++, 245, 155, 0, 255);
break;
+
+ default:
+ break;
}
- if (this->npcIndex == 0) {
- gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80C24280[this->eyeState]));
+ if (this->type == ENDING_HERO6_TYPE_DT) {
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeState]));
if (this->eyeState < 3) {
index = this->eyeState;
}
- gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80C24294[index]));
+ gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sEyebrowTextures[index]));
}
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
diff --git a/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.h b/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.h
index 76af1d67f..808267b7b 100644
--- a/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.h
+++ b/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.h
@@ -2,24 +2,36 @@
#define Z_EN_ENDING_HERO6_H
#include "global.h"
+#include "objects/object_dt/object_dt.h"
+#include "objects/object_daiku/object_daiku.h"
+#include "objects/object_bai/object_bai.h"
+#include "objects/object_toryo/object_toryo.h"
+#include "objects/object_sdn/object_sdn.h"
struct EnEndingHero6;
typedef void (*EnEndingHero6ActionFunc)(struct EnEndingHero6*, PlayState*);
+#define ENDING_HERO6_LIMB_MAX \
+ MAX(MAX(MAX(MAX((s32)OBJECT_DT_LIMB_MAX, \
+ (s32)OBJECT_BAI_LIMB_MAX), \
+ (s32)OBJECT_TORYO_LIMB_MAX), \
+ (s32)SOLDIER_LIMB_MAX), \
+ (s32)OBJECT_DAIKU_LIMB_MAX)
+
typedef struct EnEndingHero6 {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[20];
- /* 0x200 */ Vec3s morphTable[20];
+ /* 0x188 */ Vec3s jointTable[ENDING_HERO6_LIMB_MAX];
+ /* 0x200 */ Vec3s morphTable[ENDING_HERO6_LIMB_MAX];
/* 0x278 */ EnEndingHero6ActionFunc actionFunc;
/* 0x27C */ s32 animIndex;
- /* 0x280 */ s32 npcIndex;
+ /* 0x280 */ s32 type;
/* 0x284 */ s8 objectIndex;
/* 0x286 */ s16 timer;
/* 0x288 */ s16 blinkTimer;
/* 0x28A */ s16 eyeState;
- /* 0x28C */ f32 frameCount;
+ /* 0x28C */ f32 animEndFrame;
/* 0x290 */ s16 isIdle;
} EnEndingHero6; // size = 0x294
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 c55ab5272..a40bf8718 100644
--- a/src/overlays/actors/ovl_En_Estone/z_en_estone.c
+++ b/src/overlays/actors/ovl_En_Estone/z_en_estone.c
@@ -64,19 +64,19 @@ 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) {
- this->actor.speedXZ = Rand_ZeroFloat(5.0f) + 2.0f;
+ this->actor.speed = Rand_ZeroFloat(5.0f) + 2.0f;
this->scale = (Rand_ZeroFloat(1.0f) * 0.005f) + 0.005f;
this->actor.velocity.y = Rand_ZeroFloat(10.0f) + 15.0f;
this->actor.gravity = -2.0f;
- } else {
- this->actor.speedXZ = Rand_ZeroFloat(3.0f) + 1.0f;
+ } else { // ENESTONE_TYPE_SMALL
+ this->actor.speed = Rand_ZeroFloat(3.0f) + 1.0f;
this->scale = (Rand_ZeroFloat(1.0f) * 0.003f) + 0.003f;
this->actor.velocity.y = Rand_ZeroFloat(5.0f) + 7.0f;
this->actor.gravity = -1.0f;
@@ -121,8 +121,9 @@ void EnEstone_Active(EnEstone* this, PlayState* play) {
Actor_Kill(&this->actor);
return;
}
- if (((this->actor.bgCheckFlags & 1) && (this->actor.velocity.y < 0.0f)) || (this->collider.base.atFlags & 4)) {
- this->collider.base.atFlags &= ~4;
+ if (((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->actor.velocity.y < 0.0f)) ||
+ (this->collider.base.atFlags & AT_BOUNCED)) {
+ this->collider.base.atFlags &= ~AT_BOUNCED;
if (this->actor.params == ENESTONE_TYPE_LARGE) {
for (i = 0; i < 2; i++) {
accel.x = 2.0f * (Rand_ZeroOne() - 0.5f);
@@ -139,11 +140,11 @@ void EnEstone_Active(EnEstone* this, PlayState* play) {
velocity.y = this->actor.floorHeight;
Actor_SpawnFloorDustRing(play, &this->actor, &velocity, 0.0f, 10, 6.0f, 50, 30, true);
this->actor.velocity.y = this->actor.gravity = 0.0f;
- this->actor.speedXZ *= 0.3f;
+ this->actor.speed *= 0.3f;
this->actor.shape.shadowScale = 0.0f;
this->inactive = true;
this->timer = 50;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_WALL_BROKEN);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_WALL_BROKEN);
this->actionFunc = EnEstone_Inactive;
} else {
//! FAKE: https://decomp.me/scratch/YiPVN
@@ -173,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);
@@ -193,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);
@@ -222,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;
}
}
@@ -264,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 ea76ef074..e902baa2d 100644
--- a/src/overlays/actors/ovl_En_Fall/z_en_fall.c
+++ b/src/overlays/actors/ovl_En_Fall/z_en_fall.c
@@ -16,6 +16,7 @@
*/
#include "z_en_fall.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "objects/object_fall/object_fall.h"
#include "objects/object_fall2/object_fall2.h"
#include "objects/object_lodmoon/object_lodmoon.h"
@@ -52,11 +53,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
@@ -114,6 +115,9 @@ void EnFall_Moon_AdjustScaleAndPosition(EnFall* this, PlayState* play) {
this->actor.home.pos.y - (finalDayRelativeHeight * 6700.0f * (this->scale * 6.25f));
}
break;
+
+ default:
+ break;
}
}
@@ -161,19 +165,19 @@ void EnFall_Init(Actor* thisx, PlayState* play) {
case EN_FALL_TYPE_LODMOON_NO_LERP:
case EN_FALL_TYPE_LODMOON:
case EN_FALL_TYPE_LODMOON_INVERTED_STONE_TOWER:
- objectIndex = Object_GetIndex(&play->objectCtx, OBJECT_LODMOON);
+ objectIndex = Object_GetSlot(&play->objectCtx, OBJECT_LODMOON);
break;
case EN_FALL_TYPE_MOONS_TEAR:
- objectIndex = Object_GetIndex(&play->objectCtx, OBJECT_MOONSTON);
+ objectIndex = Object_GetSlot(&play->objectCtx, OBJECT_MOONSTON);
break;
case EN_FALL_TYPE_STOPPED_MOON_OPEN_MOUTH:
- objectIndex = Object_GetIndex(&play->objectCtx, OBJECT_FALL2);
+ objectIndex = Object_GetSlot(&play->objectCtx, OBJECT_FALL2);
break;
default:
- objectIndex = Object_GetIndex(&play->objectCtx, OBJECT_FALL);
+ objectIndex = Object_GetSlot(&play->objectCtx, OBJECT_FALL);
break;
}
@@ -315,10 +319,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 +331,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 +355,10 @@ void EnFall_CrashingMoon_HandleGiantsCutscene(EnFall* this, PlayState* play) {
break;
case 9:
- play->csCtx.frames--;
+ play->csCtx.curFrame--;
+ break;
+
+ default:
break;
}
}
@@ -359,15 +366,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,11 +383,11 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_EV_MOON_EYE_FLASH);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_MOON_EYE_FLASH);
}
this->eyeGlowIntensity += 1 / 30.0f;
if (this->eyeGlowIntensity > 1.0f) {
@@ -391,69 +398,84 @@ void EnFall_StoppedOpenMouthMoon_PerformCutsceneActions(EnFall* this, PlayState*
case 4:
this->actor.draw = EnFall_OpenMouthMoon_Draw;
break;
+
+ default:
+ break;
}
}
}
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:
this->actor.draw = NULL;
break;
+
+ default:
+ break;
}
}
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_PlaySfxAtPos(&this->actor, NA_SE_EN_MOON_SCREAM1);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MOON_SCREAM1);
break;
case 1089:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_MOON_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_MOON_CRY);
break;
case 1303:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_SLIP_MOON);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_SLIP_MOON);
+ break;
+
+ default:
break;
}
- if (play->csCtx.frames >= 1145) {
- func_800B9010(&this->actor, NA_SE_EV_FALL_POWER - SFX_FLAG);
+ if (play->csCtx.curFrame >= 1145) {
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_FALL_POWER - SFX_FLAG);
}
break;
case 1:
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 561:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_MOON_SCREAM1);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MOON_SCREAM1);
break;
case 590:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_MOON_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_MOON_CRY);
break;
case 737:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_SLIP_MOON);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_SLIP_MOON);
+ break;
+
+ default:
break;
}
- if (play->csCtx.frames >= 650) {
- func_800B9010(&this->actor, NA_SE_EV_FALL_POWER - SFX_FLAG);
+ if (play->csCtx.curFrame >= 650) {
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_FALL_POWER - SFX_FLAG);
}
break;
+
+ default:
+ break;
}
}
}
void EnFall_ClockTowerOrTitleScreenMoon_PerformCutsceneActions(EnFall* this, PlayState* play) {
- if (play->csCtx.state != 0 && play->sceneId == SCENE_OKUJOU) {
- func_800B9010(&this->actor, NA_SE_EV_MOON_FALL - SFX_FLAG);
+ if ((play->csCtx.state != CS_STATE_IDLE) && (play->sceneId == SCENE_OKUJOU)) {
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_MOON_FALL - SFX_FLAG);
}
}
@@ -463,16 +485,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 {
@@ -499,7 +521,7 @@ void EnFall_MoonsTear_Initialize(EnFall* this) {
}
this->actor.world.rot.y = Math_Vec3f_Yaw(&this->actor.world.pos, &this->actor.home.pos);
this->actor.world.rot.x = Math_Vec3f_Pitch(&this->actor.world.pos, &this->actor.home.pos);
- this->actor.speedXZ = Math_Vec3f_DistXYZ(&this->actor.world.pos, &this->actor.home.pos) / 82.0f;
+ this->actor.speed = Math_Vec3f_DistXYZ(&this->actor.world.pos, &this->actor.home.pos) / 82.0f;
this->actor.shape.rot.x = this->actor.world.rot.x;
this->actor.shape.rot.y = this->actor.world.rot.y;
}
@@ -510,24 +532,25 @@ 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);
}
if (this->actor.draw != NULL) {
- if (Math_Vec3f_StepTo(&this->actor.world.pos, &this->actor.home.pos, this->actor.speedXZ) <= 0.0f) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_GORON_BOUND_1);
+ if (Math_Vec3f_StepTo(&this->actor.world.pos, &this->actor.home.pos, this->actor.speed) <= 0.0f) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_GORON_BOUND_1);
SET_WEEKEVENTREG(WEEKEVENTREG_74_80);
SET_WEEKEVENTREG(WEEKEVENTREG_74_20);
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_TEST, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, -2);
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->actor.world.pos.x, this->actor.world.pos.y,
- this->actor.world.pos.z, 0, 0, 0, CLEAR_TAG_LARGE_EXPLOSION);
+ this->actor.world.pos.z, 0, 0, 0, CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_EXPLOSION));
this->actor.draw = NULL;
this->actionFunc = EnFall_MoonsTear_DoNothing;
} else {
- func_800B9010(&this->actor, NA_SE_EV_MOONSTONE_FALL - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_MOONSTONE_FALL - SFX_FLAG);
}
}
}
@@ -538,20 +561,20 @@ void EnFall_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
}
+static u8 sAlphaTableIndices[] = {
+ 4, 4, 0, 1, 1, 1, 1, 1, 1, 3, 3, 0, 0, 3, 0, 1, 1, 1, 4, 0, 4, 0, 1, 1, 1, 3, 0, 3, 0, 1, 1, 1, 4, 4, 1,
+ 1, 0, 4, 4, 0, 1, 1, 1, 1, 1, 1, 3, 3, 0, 0, 3, 3, 0, 0, 1, 1, 1, 1, 1, 4, 0, 4, 4, 0, 4, 4, 1, 1, 1, 1,
+ 1, 1, 3, 3, 0, 0, 3, 3, 0, 0, 1, 1, 1, 1, 1, 1, 4, 4, 0, 4, 0, 1, 1, 1, 3, 0, 3, 3, 0, 0, 1, 1, 1, 1, 1,
+ 1, 4, 4, 0, 4, 4, 0, 1, 1, 1, 1, 1, 1, 3, 3, 0, 0, 0, 0, 0, 2, 2, 1, 1, 0, 0, 2, 2, 0, 1, 1, 0, 0, 1, 0,
+ 2, 0, 0, 1, 0, 2, 0, 0, 2, 1, 2, 0, 1, 0, 1, 0, 0, 1, 2, 2, 0, 0, 2, 1, 1, 0, 0, 1, 1, 0, 0, 2, 2, 0, 0,
+ 0, 0, 2, 0, 2, 2, 0, 1, 1, 0, 0, 1, 0, 0, 1, 2, 2, 0, 0, 0, 2, 2, 1, 1, 0, 0, 1, 1, 0, 0, 2, 2, 0, 0,
+};
+
/**
* Updates the alpha for every vertex in the fire ball so that some parts of
* the sphere are more transparent or opaque than others.
*/
void EnFall_Fireball_SetPerVertexAlpha(f32 fireballAlpha) {
- static u8 sAlphaTableIndex[] = {
- 4, 4, 0, 1, 1, 1, 1, 1, 1, 3, 3, 0, 0, 3, 0, 1, 1, 1, 4, 0, 4, 0, 1, 1, 1, 3, 0, 3, 0, 1, 1, 1, 4, 4, 1,
- 1, 0, 4, 4, 0, 1, 1, 1, 1, 1, 1, 3, 3, 0, 0, 3, 3, 0, 0, 1, 1, 1, 1, 1, 4, 0, 4, 4, 0, 4, 4, 1, 1, 1, 1,
- 1, 1, 3, 3, 0, 0, 3, 3, 0, 0, 1, 1, 1, 1, 1, 1, 4, 4, 0, 4, 0, 1, 1, 1, 3, 0, 3, 3, 0, 0, 1, 1, 1, 1, 1,
- 1, 4, 4, 0, 4, 4, 0, 1, 1, 1, 1, 1, 1, 3, 3, 0, 0, 0, 0, 0, 2, 2, 1, 1, 0, 0, 2, 2, 0, 1, 1, 0, 0, 1, 0,
- 2, 0, 0, 1, 0, 2, 0, 0, 2, 1, 2, 0, 1, 0, 1, 0, 0, 1, 2, 2, 0, 0, 2, 1, 1, 0, 0, 1, 1, 0, 0, 2, 2, 0, 0,
- 0, 0, 2, 0, 2, 2, 0, 1, 1, 0, 0, 1, 0, 0, 1, 2, 2, 0, 0, 0, 2, 2, 1, 1, 0, 0, 1, 1, 0, 0, 2, 2, 0, 0,
- };
-
s32 pad;
u8 perVertexAlphaTable[5];
Vtx* vertices = Lib_SegmentedToVirtual(gMoonFireballVtx);
@@ -566,19 +589,19 @@ void EnFall_Fireball_SetPerVertexAlpha(f32 fireballAlpha) {
perVertexAlphaTable[3] = (s8)(104.0f * fireballAlpha);
perVertexAlphaTable[4] = (s8)(54.0f * fireballAlpha);
- for (i = 0; i < ARRAY_COUNT(sAlphaTableIndex); i++, vertices++) {
- vertices->v.cn[3] = perVertexAlphaTable[sAlphaTableIndex[i]];
+ for (i = 0; i < ARRAY_COUNT(sAlphaTableIndices); i++, vertices++) {
+ vertices->v.cn[3] = perVertexAlphaTable[sAlphaTableIndices[i]];
}
}
void EnFall_Fireball_Update(Actor* thisx, PlayState* play) {
EnFall* this = THIS;
- if ((play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 0) && (play->csCtx.currentCsIndex == 2)) {
- play->skyboxCtx.rotY -= 0.05f;
+ 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 +609,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,8 +648,8 @@ void EnFall_Fireball_Update(Actor* thisx, PlayState* play) {
this->actor.draw = NULL;
}
- if (Cutscene_CheckActorAction(play, 0x1C2) && this->fireballAlpha > 0) {
- func_8019F128(NA_SE_EV_MOON_FALL_LAST - SFX_FLAG);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_450) && (this->fireballAlpha > 0)) {
+ Audio_PlaySfx_2(NA_SE_EV_MOON_FALL_LAST - SFX_FLAG);
}
Actor_SetScale(&this->actor, this->scale * 1.74f);
}
@@ -661,16 +684,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 +705,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,10 +722,10 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_IT_DM_RING_EXPLOSION);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_DM_RING_EXPLOSION);
}
this->flags |= FLAG_FIRE_RING_APPEARS;
}
@@ -735,7 +758,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 +776,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 +794,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);
@@ -798,7 +821,7 @@ void EnFall_LodMoon_DrawWithoutLerp(Actor* thisx, PlayState* play) {
* to be 9000 units away before drawing it.
*/
void EnFall_LodMoon_DrawWithLerp(Actor* thisx, PlayState* play) {
- f32 distanceToEye = Actor_DistanceToPoint(thisx, &play->view.eye);
+ f32 distanceToEye = Actor_WorldDistXYZToPoint(thisx, &play->view.eye);
f32 scale;
Vec3f translation;
@@ -825,7 +848,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 +886,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 +912,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 +937,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..8ba7c66bc 100644
--- a/src/overlays/actors/ovl_En_Fall2/z_en_fall2.c
+++ b/src/overlays/actors/ovl_En_Fall2/z_en_fall2.c
@@ -15,11 +15,8 @@ void EnFall2_Destroy(Actor* thisx, PlayState* play);
void EnFall2_Update(Actor* thisx, PlayState* play);
void EnFall2_Draw(Actor* thisx, PlayState* play);
-void func_80C1B724(f32 arg0);
void EnFall2_DoNothing(EnFall2* this, PlayState* play);
-void func_80C1B9D4(EnFall2* this, PlayState* play);
-void func_80C1B8F0(EnFall2* this);
-void func_80C1B9D4(EnFall2* this, PlayState* play);
+void EnFall2_HandleCutscene(EnFall2* this, PlayState* play);
ActorInit En_Fall2_InitVars = {
ACTOR_EN_FALL2,
@@ -43,8 +40,8 @@ void EnFall2_Init(Actor* thisx, PlayState* play) {
func_801835EC(&this->skeletonInfo, object_fall2_Blob_005EF4);
this->unk2DC = Lib_SegmentedToVirtual(object_fall2_Matanimheader_008840);
Actor_SetScale(&this->actor, 0.02f);
- this->actionFunc = func_80C1B9D4;
- this->csActionIndex = 0x231;
+ this->actionFunc = EnFall2_HandleCutscene;
+ this->cueType = CS_CMD_ACTOR_CUE_561;
this->alphaLevel = 0.0f;
}
@@ -54,7 +51,7 @@ void EnFall2_Destroy(Actor* thisx, PlayState* play) {
func_8018349C(&this->skeletonInfo);
}
-u8 sAlphaTableIndices[] = {
+static u8 sAlphaTableIndices[] = {
0, 2, 0, 0, 4, 0, 4, 4, 2, 0, 0, 0, 0, 0, 0, 2, 4, 4, 4, 2, 0, 4, 2, 2, 0, 4, 4, 4, 4, 0, 2, 2, 4, 0, 2,
0, 4, 4, 2, 0, 2, 4, 4, 4, 2, 0, 4, 4, 4, 2, 2, 0, 4, 4, 2, 4, 0, 2, 0, 0, 2, 4, 4, 2, 0, 2, 4, 4, 4, 2,
0, 4, 4, 4, 4, 4, 2, 2, 0, 2, 4, 0, 2, 0, 0, 2, 4, 4, 2, 0, 2, 4, 4, 4, 2, 0, 0, 2, 2, 4, 4, 4, 4, 4, 4,
@@ -92,13 +89,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;
@@ -106,6 +103,7 @@ void func_80C1B8F0(EnFall2* this) {
this->alphaLevel = 1.0f;
}
break;
+
case 2:
if (this->alphaLevel > 0.0f) {
this->alphaLevel -= 0.1f;
@@ -120,22 +118,23 @@ void func_80C1B8F0(EnFall2* this) {
}
this->actor.scale.z = this->actor.scale.x;
}
+
+ default:
+ break;
}
}
-void func_80C1B9D4(EnFall2* this, PlayState* play) {
+void EnFall2_HandleCutscene(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);
if (this->alphaLevel > 0.0f) {
- func_800B9010(&this->actor, NA_SE_EV_MOON_LIGHT_PILLAR - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_MOON_LIGHT_PILLAR - SFX_FLAG);
}
} else {
this->actor.draw = NULL;
@@ -155,13 +154,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 27dcabc23..8219a23a3 100644
--- a/src/overlays/actors/ovl_En_Famos/z_en_famos.c
+++ b/src/overlays/actors/ovl_En_Famos/z_en_famos.c
@@ -9,7 +9,7 @@
#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY)
#define THIS ((EnFamos*)thisx)
@@ -18,9 +18,6 @@ void EnFamos_Destroy(Actor* thisx, PlayState* play);
void EnFamos_Update(Actor* thisx, PlayState* play);
void EnFamos_Draw(Actor* thisx, PlayState* play);
-void EnFamos_SetupAttackDebris(EnFamos* this);
-void EnFamos_SetupDeathDebris(EnFamos* this);
-s32 EnFamos_IsPlayerSeen(EnFamos* this, PlayState* play);
void EnFamos_SetupStillIdle(EnFamos* this);
void EnFamos_StillIdle(EnFamos* this, PlayState* play);
void EnFamos_SetupPathingIdle(EnFamos* this);
@@ -49,7 +46,6 @@ void EnFamos_SetupDeathExplosion(EnFamos* this);
void EnFamos_DeathExplosion(EnFamos* this, PlayState* play);
void EnFamos_SetupDeathFade(EnFamos* this);
void EnFamos_DeathFade(EnFamos* this, PlayState* play);
-void EnFamos_DrawDebris(EnFamos* this, PlayState* play);
ActorInit En_Famos_InitVars = {
ACTOR_EN_FAMOS,
@@ -166,18 +162,18 @@ 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;
}
}
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawSquare, 30.0f);
- SkelAnime_Init(play, &this->skelAnime, &gFamosSkeleton, &gFamosIdleAnim, this->jointTable, this->morphTable,
+ SkelAnime_Init(play, &this->skelAnime, &gFamosSkel, &gFamosIdleAnim, this->jointTable, this->morphTable,
FAMOS_LIMB_MAX);
Collider_InitAndSetCylinder(play, &this->collider1, &this->actor, &sCylinderInit1);
Collider_InitAndSetCylinder(play, &this->collider2, &this->actor, &sCylinderInit2);
@@ -232,9 +228,9 @@ void EnFamos_SetupAttackDebris(EnFamos* this) {
rock->velocity.x = randFloat * Math_CosS(randOffset) * Math_SinS(randVelDirection);
rock->velocity.y = Math_SinS(randOffset) * randFloat + 3.0f;
rock->velocity.z = randFloat * Math_CosS(randOffset) * Math_CosS(randVelDirection);
- rock->rotation.x = (s32)Rand_Next() >> 0x10;
- rock->rotation.y = (s32)Rand_Next() >> 0x10;
- rock->rotation.z = (s32)Rand_Next() >> 0x10;
+ rock->rot.x = (s32)Rand_Next() >> 0x10;
+ rock->rot.y = (s32)Rand_Next() >> 0x10;
+ rock->rot.z = (s32)Rand_Next() >> 0x10;
rock->pos.x = (Math_SinS(randVelDirection) * 20.0f) + this->actor.world.pos.x;
rock->pos.y = this->actor.floorHeight;
rock->pos.z = (Math_CosS(randVelDirection) * 20.0f) + this->actor.world.pos.z;
@@ -261,11 +257,11 @@ void EnFamos_SetupDeathDebris(EnFamos* this) {
rock->velocity.x = randFloat * Math_CosS(randSmaller) * Math_SinS(randVelDirection);
rock->velocity.y = Math_SinS(randSmaller) * randFloat + 4.5f;
rock->velocity.z = randFloat * Math_CosS(randSmaller) * Math_CosS(randVelDirection);
- rock->rotation.x = (s32)Rand_Next() >> 0x10;
- rock->rotation.y = (s32)Rand_Next() >> 0x10;
- rock->rotation.z = (s32)Rand_Next() >> 0x10;
+ rock->rot.x = (s32)Rand_Next() >> 0x10;
+ rock->rot.y = (s32)Rand_Next() >> 0x10;
+ rock->rot.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);
}
@@ -273,7 +269,7 @@ void EnFamos_SetupDeathDebris(EnFamos* this) {
s32 EnFamos_IsPlayerSeen(EnFamos* this, PlayState* play) {
if ((Player_GetMask(play) != PLAYER_MASK_STONE) &&
- (Actor_XZDistanceToPoint(&GET_PLAYER(play)->actor, &this->calmPos) < this->aggroDistance) &&
+ (Actor_WorldDistXZToPoint(&GET_PLAYER(play)->actor, &this->calmPos) < this->aggroDistance) &&
Actor_IsFacingPlayer(&this->actor, 0x5000)) {
return true;
} else {
@@ -290,9 +286,9 @@ void EnFamos_UpdateBobbingHeight(EnFamos* this) {
this->actor.world.pos.y = (Math_SinS(this->hoverTimer * 0x888) * 10.0f) + this->baseHeight;
if (ABS_ALT(this->flipRot) > 0x4000) { // is famos upside down
- func_800B9010(&this->actor, NA_SE_EN_FAMOS_FLOAT_REVERSE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_FAMOS_FLOAT_REVERSE - SFX_FLAG);
} else {
- func_800B9010(&this->actor, NA_SE_EN_FAMOS_FLOAT - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_FAMOS_FLOAT - SFX_FLAG);
}
}
@@ -308,12 +304,12 @@ void EnFamos_UpdateFlipStatus(EnFamos* this) {
if (this->hasFinishedRotating == true) {
if (this->animatedMaterialIndex != FAMOS_ANIMATED_MAT_NORMAL) {
this->animatedMaterialIndex = FAMOS_ANIMATED_MAT_NORMAL;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FAMOS_REVERSE2);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FAMOS_REVERSE2);
} else {
this->animatedMaterialIndex = FAMOS_ANIMATED_MAT_FLIPPED;
this->flippedTimer = 100;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FAMOS_REVERSE1);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EYEGOLE_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FAMOS_REVERSE1);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_DAMAGE);
}
this->hasFinishedRotating = false;
}
@@ -322,7 +318,7 @@ void EnFamos_UpdateFlipStatus(EnFamos* this) {
this->flippedTimer--;
if (this->flippedTimer == 0) {
if (this->animatedMaterialIndex != FAMOS_ANIMATED_MAT_NORMAL) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FAMOS_REVERSE2);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FAMOS_REVERSE2);
}
this->animatedMaterialIndex = FAMOS_ANIMATED_MAT_NORMAL;
@@ -347,7 +343,7 @@ void EnFamos_UpdateFlipStatus(EnFamos* this) {
*/
void EnFamos_SetupStillIdle(EnFamos* this) {
this->actionFunc = EnFamos_StillIdle;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
void EnFamos_StillIdle(EnFamos* this, PlayState* play) {
@@ -365,18 +361,18 @@ 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]);
- this->targetYaw = Actor_YawToPoint(&this->actor, &this->targetDest);
+ Math_Vec3s_ToVec3f(&this->targetDest, &this->pathPoints[this->waypointIndex]);
+ this->targetYaw = Actor_WorldYawTowardPoint(&this->actor, &this->targetDest);
this->actionFunc = EnFamos_PathingIdle;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
void EnFamos_PathingIdle(EnFamos* this, PlayState* play) {
@@ -396,10 +392,10 @@ void EnFamos_PathingIdle(EnFamos* this, PlayState* play) {
* Famos lost player; Turning to face back toward home.
*/
void EnFamos_SetupTurnHome(EnFamos* this) {
- this->targetYaw = Actor_YawToPoint(&this->actor, &this->calmPos);
+ this->targetYaw = Actor_WorldYawTowardPoint(&this->actor, &this->calmPos);
Math_Vec3f_Copy(&this->targetDest, &this->calmPos);
this->actionFunc = EnFamos_TurnHome;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
void EnFamos_TurnHome(EnFamos* this, PlayState* play) {
@@ -416,14 +412,14 @@ void EnFamos_TurnHome(EnFamos* this, PlayState* play) {
*/
void EnFamos_SetupReturnHome(EnFamos* this) {
this->actor.world.rot.y = this->actor.shape.rot.y;
- this->actor.world.rot.x = -Actor_PitchToPoint(&this->actor, &this->targetDest);
+ this->actor.world.rot.x = -Actor_WorldPitchTowardPoint(&this->actor, &this->targetDest);
this->actionFunc = EnFamos_ReturnHome;
}
void EnFamos_ReturnHome(EnFamos* this, PlayState* play) {
- f32 distanceToHome = Actor_XZDistanceToPoint(&this->actor, &this->targetDest);
+ f32 distanceToHome = Actor_WorldDistXZToPoint(&this->actor, &this->targetDest);
- this->actor.shape.rot.y = Actor_YawToPoint(&this->actor, &this->targetDest);
+ this->actor.shape.rot.y = Actor_WorldYawTowardPoint(&this->actor, &this->targetDest);
this->actor.world.rot.y = this->actor.shape.rot.y;
EnFamos_UpdateBobbingHeight(this);
if (this->isCalm) {
@@ -439,9 +435,9 @@ void EnFamos_ReturnHome(EnFamos* this, PlayState* play) {
EnFamos_SetupStillIdle(this);
}
} else if (distanceToHome < 40.0f) {
- Math_StepToF(&this->actor.speedXZ, 0.5f, 0.3f);
+ Math_StepToF(&this->actor.speed, 0.5f, 0.3f);
} else {
- Math_StepToF(&this->actor.speedXZ, 3.0f, 0.3f);
+ Math_StepToF(&this->actor.speed, 3.0f, 0.3f);
}
}
@@ -451,7 +447,7 @@ void EnFamos_ReturnHome(EnFamos* this, PlayState* play) {
void EnFamos_SetupAlert(EnFamos* this) {
this->actor.world.rot.y = this->actor.shape.rot.y;
this->stateTimer = 8;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->isCalm == true) {
this->isCalm = false;
@@ -463,9 +459,9 @@ void EnFamos_SetupAlert(EnFamos* this) {
void EnFamos_Alert(EnFamos* this, PlayState* play) {
if (ABS_ALT(this->flipRot) > 0x4000) {
- func_800B9010(&this->actor, NA_SE_EN_FAMOS_FLOAT_REVERSE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_FAMOS_FLOAT_REVERSE - SFX_FLAG);
} else {
- func_800B9010(&this->actor, NA_SE_EN_FAMOS_FLOAT - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_FAMOS_FLOAT - SFX_FLAG);
}
this->stateTimer--;
@@ -489,7 +485,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);
@@ -497,16 +493,16 @@ void EnFamos_Chase(EnFamos* this, PlayState* play) {
abovePlayerPos.x = player->actor.world.pos.x;
abovePlayerPos.y = player->actor.world.pos.y + 100.0f;
abovePlayerPos.z = player->actor.world.pos.z;
- this->actor.world.rot.x = -Actor_PitchToPoint(&this->actor, &abovePlayerPos);
- Math_StepToF(&this->actor.speedXZ, 6.0f, 0.5f);
+ 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);
- if ((this->actor.xzDistToPlayer < 30.0f) && (this->actor.floorHeight > BGCHECK_Y_MIN) && // close enough
- (surfaceType != 0xC && surfaceType != 0xD)) {
+ surfaceType = SurfaceType_GetFloorProperty2(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
+ if ((this->actor.xzDistToPlayer < 30.0f) && (this->actor.floorHeight > BGCHECK_Y_MIN) &&
+ ((surfaceType != FLOOR_PROPERTY_12) && (surfaceType != FLOOR_PROPERTY_13))) {
EnFamos_SetupAttackAim(this);
} else if ((Player_GetMask(play) == PLAYER_MASK_STONE) ||
- (this->aggroDistance < Actor_XZDistanceToPoint(&GET_PLAYER(play)->actor, &this->calmPos)) ||
+ (this->aggroDistance < Actor_WorldDistXZToPoint(&GET_PLAYER(play)->actor, &this->calmPos)) ||
!Actor_IsFacingPlayer(&this->actor, 0x6000)) {
EnFamos_SetupScanForPlayer(this);
}
@@ -514,13 +510,13 @@ void EnFamos_Chase(EnFamos* this, PlayState* play) {
void EnFamos_SetupAttackAim(EnFamos* this) {
Animation_PlayOnce(&this->skelAnime, &gFamosShakeAnim);
- this->actor.speedXZ = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_AMOS_VOICE);
+ this->actor.speed = 0.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_AMOS_VOICE);
this->actionFunc = EnFamos_AttackAim;
}
void EnFamos_AttackAim(EnFamos* this, PlayState* play) {
- func_800B9010(&this->actor, NA_SE_EN_LAST1_FALL_OLD - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_LAST1_FALL_OLD - SFX_FLAG);
if (SkelAnime_Update(&this->skelAnime)) {
EnFamos_SetupAttack(this);
}
@@ -537,15 +533,16 @@ void EnFamos_Attack(EnFamos* this, PlayState* play) {
s32 hitFloor;
u32 surfaceType;
- Math_StepToF(&this->actor.speedXZ, 20.0f, 2.0f);
+ Math_StepToF(&this->actor.speed, 20.0f, 2.0f);
this->stateTimer--;
if (this->stateTimer == 0) {
this->emblemCollider.base.acFlags &= ~AC_ON;
}
- surfaceType = func_800C9B18(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
- hitFloor = this->actor.bgCheckFlags & 1;
- if (hitFloor || (this->actor.floorHeight == BGCHECK_Y_MIN) || (surfaceType == 0xC) || (surfaceType == 0xD)) {
+ 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 == FLOOR_PROPERTY_12) ||
+ (surfaceType == FLOOR_PROPERTY_13)) {
this->collider1.base.atFlags &= ~AT_ON;
this->collider2.base.atFlags |= AT_ON;
if (hitFloor) {
@@ -573,7 +570,7 @@ void EnFamos_Attack(EnFamos* this, PlayState* play) {
EnFamos_SetupAttackRebound(this);
}
} else {
- func_800B9010(&this->actor, NA_SE_EN_LAST1_FALL_OLD - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_LAST1_FALL_OLD - SFX_FLAG);
}
}
@@ -585,8 +582,8 @@ void EnFamos_SetupFinishAttack(EnFamos* this) {
SkelAnime_Update(&this->skelAnime);
this->emblemCollider.base.acFlags |= AC_ON;
this->stateTimer = 3;
- this->actor.speedXZ = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_EXPLOSION);
+ this->actor.speed = 0.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EV_EXPLOSION);
this->actionFunc = EnFamos_FinishAttack;
}
@@ -604,21 +601,21 @@ void EnFamos_FinishAttack(EnFamos* this, PlayState* play) {
void EnFamos_SetupAttackRebound(EnFamos* this) {
this->actor.world.rot.x = 0x4000;
this->actionFunc = EnFamos_AttackRebound;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
void EnFamos_AttackRebound(EnFamos* this, PlayState* play) {
- Math_StepToF(&this->actor.speedXZ, 5.0f, 0.3f);
- if (this->actor.speedXZ > 1.0f) {
+ Math_StepToF(&this->actor.speed, 5.0f, 0.3f);
+ if (this->actor.speed > 1.0f) {
if (ABS_ALT(this->flipRot) > 0x4000) {
- func_800B9010(&this->actor, NA_SE_EN_FAMOS_FLOAT_REVERSE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_FAMOS_FLOAT_REVERSE - SFX_FLAG);
} else {
- func_800B9010(&this->actor, NA_SE_EN_FAMOS_FLOAT - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_FAMOS_FLOAT - SFX_FLAG);
}
}
- if ((this->baseHeight < this->actor.world.pos.y) || (this->actor.bgCheckFlags & 0x10)) { // touching ceiling
- this->actor.speedXZ = 0.0f;
+ if ((this->baseHeight < this->actor.world.pos.y) || (this->actor.bgCheckFlags & BGCHECKFLAG_CEILING)) {
+ this->actor.speed = 0.0f;
EnFamos_SetupChase(this);
}
}
@@ -629,7 +626,7 @@ void EnFamos_AttackRebound(EnFamos* this, PlayState* play) {
void EnFamos_SetupScanForPlayer(EnFamos* this) {
this->stateTimer = 60;
this->actionFunc = EnFamos_ScanForPlayer;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
void EnFamos_ScanForPlayer(EnFamos* this, PlayState* play) {
@@ -651,11 +648,11 @@ void EnFamos_ScanForPlayer(EnFamos* this, PlayState* play) {
void EnFamos_SetupDeathSlam(EnFamos* this) {
this->emblemCollider.base.acFlags &= ~AC_ON;
this->stateTimer = 20;
- this->actor.speedXZ = 0.0f;
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 20);
+ this->actor.speed = 0.0f;
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 20);
this->flippedTimer = -1;
this->actor.world.pos.y = this->actor.floorHeight - 60.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EYEGOLE_DEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_DEAD);
this->actionFunc = EnFamos_DeathSlam;
}
@@ -673,7 +670,7 @@ void EnFamos_DeathSlam(EnFamos* this, PlayState* play) {
void EnFamos_SetupDeathExplosion(EnFamos* this) {
this->actor.world.rot.x = 0x4000;
- Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, false, 4);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 4);
this->stateTimer = 25;
Math_Vec3f_Copy(&this->targetDest, &this->actor.world.pos);
this->actor.flags |= ACTOR_FLAG_10;
@@ -681,17 +678,17 @@ void EnFamos_SetupDeathExplosion(EnFamos* this) {
}
void EnFamos_DeathExplosion(EnFamos* this, PlayState* play) {
- Math_StepToF(&this->actor.speedXZ, 3.0f, 0.3f);
+ Math_StepToF(&this->actor.speed, 3.0f, 0.3f);
if (this->actor.colorFilterTimer == 0) {
- Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, false, 4);
+ 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, ENBOM_0);
+ 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
}
@@ -709,10 +706,10 @@ void EnFamos_DeathExplosion(EnFamos* this, PlayState* play) {
void EnFamos_SetupDeathFade(EnFamos* this) {
EnFamos_SetupDeathDebris(this);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.shape.shadowDraw = NULL;
this->actionFunc = EnFamos_DeathFade;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
void EnFamos_DeathFade(EnFamos* this, PlayState* play) {
@@ -735,9 +732,9 @@ void EnFamos_UpdateDebrisPosRot(EnFamos* this) {
for (i = 0; i < ARRAY_COUNT(this->rocks); i++, rock++) {
rock->velocity.y -= 1.0f;
Math_Vec3f_Sum(&rock->pos, &rock->velocity, &rock->pos);
- rock->rotation.x += (s16)((Rand_Next() >> 0x17) + 0x700);
- rock->rotation.y += (s16)((Rand_Next() >> 0x17) + 0x900);
- rock->rotation.z += (s16)((Rand_Next() >> 0x17) + 0xB00);
+ rock->rot.x += (s16)((Rand_Next() >> 0x17) + 0x700);
+ rock->rot.y += (s16)((Rand_Next() >> 0x17) + 0x900);
+ rock->rot.z += (s16)((Rand_Next() >> 0x17) + 0xB00);
}
}
@@ -747,7 +744,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,9 +763,11 @@ 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 & 1)) { // touch floor
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
this->actor.world.pos.y -= 60.0f;
}
}
@@ -785,7 +784,7 @@ void EnFamos_Update(Actor* thisx, PlayState* play) {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->emblemCollider.base);
}
- if (this->collider2.base.atFlags & AC_ON) {
+ if (this->collider2.base.atFlags & AT_ON) {
Collider_UpdateCylinder(&this->actor, &this->collider2);
this->collider2.dim.pos.y = this->actor.floorHeight;
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider2.base);
@@ -827,9 +826,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);
@@ -838,7 +838,7 @@ void EnFamos_DrawDebris(EnFamos* this, PlayState* play) {
rock = &this->rocks[0];
for (i = 0; i < ARRAY_COUNT(this->rocks); i++, rock++) {
- Matrix_SetTranslateRotateYXZ(rock->pos.x, rock->pos.y, rock->pos.z, &rock->rotation);
+ Matrix_SetTranslateRotateYXZ(rock->pos.x, rock->pos.y, rock->pos.z, &rock->rot);
Matrix_Scale(rock->scale, rock->scale, rock->scale, MTXMODE_APPLY);
gSPMatrix(&dispOpa[3 + i * 2], Matrix_NewMtx(play->state.gfxCtx),
@@ -856,7 +856,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..955b4b31f 100644
--- a/src/overlays/actors/ovl_En_Famos/z_en_famos.h
+++ b/src/overlays/actors/ovl_En_Famos/z_en_famos.h
@@ -11,13 +11,15 @@ typedef void (*EnFamosActionFunc)(struct EnFamos*, PlayState*);
typedef struct EnFamosRock {
/* 0x00 */ Vec3f pos;
/* 0x0C */ Vec3f velocity;
- /* 0x18 */ Vec3s rotation;
- /* 0x20 */ f32 scale;
+ /* 0x18 */ Vec3s rot;
+ /* 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 6a4c357d9..3da9f2673 100644
--- a/src/overlays/actors/ovl_En_Fg/z_en_fg.c
+++ b/src/overlays/actors/ovl_En_Fg/z_en_fg.c
@@ -5,10 +5,9 @@
*/
#include "z_en_fg.h"
-#include "objects/object_fr/object_fr.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_200 | ACTOR_FLAG_4000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_200 | ACTOR_FLAG_4000)
#define THIS ((EnFg*)thisx)
@@ -20,9 +19,18 @@ void EnFg_Draw(Actor* thisx, PlayState* play);
void EnFg_Jump(EnFg* this, PlayState* play);
void EnFg_DoNothing(EnFg* this, PlayState* play);
void EnFg_Knockback(EnFg* this, PlayState* play);
-void EnFg_AddDust(EnFgEffectDust* dustEffect, Vec3f* worldPos);
-void EnFg_UpdateDust(EnFgEffectDust* dustEffect);
-void EnFg_DrawDust(PlayState* play, EnFgEffectDust* dustEffect);
+void EnFg_AddDust(BetaFrogEffectDust* dustEffect, Vec3f* pos);
+void EnFg_UpdateDust(BetaFrogEffectDust* dustEffect);
+void EnFg_DrawDust(PlayState* play, BetaFrogEffectDust* dustEffect);
+
+typedef enum {
+ /* 0 */ BETAFROG_DMGEFFECT_NONE,
+ /* 1 */ BETAFROG_DMGEFFECT_EXPLOSION, // Bomb or bombchu, not powderkeg
+ /* 2 */ BETAFROG_DMGEFFECT_DEKUSTICK,
+ /* 3 */ BETAFROG_DMGEFFECT_HOOKSHOT,
+ /* 4 */ BETAFROG_DMGEFFECT_ARROW,
+ /* 5 */ BETAFROG_DMGEFFECT_ICEARROW
+} BetaFrogDamageEffect;
ActorInit En_Fg_InitVars = {
ACTOR_EN_FG,
@@ -95,29 +103,37 @@ static DamageTable sDamageTable = {
/* Powder Keg */ DMG_ENTRY(0, 0x0),
};
-static AnimationInfoS sAnimationInfo[] = {
- { &object_fr_Anim_001534, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_fr_Anim_001534, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_fr_Anim_0011C0, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_fr_Anim_0007BC, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
+typedef enum {
+ /* -1 */ BETAFROG_ANIM_NONE = -1,
+ /* 0 */ BETAFROG_ANIM_IDLE,
+ /* 1 */ BETAFROG_ANIM_IDLE_MORPH,
+ /* 2 */ BETAFROG_ANIM_DANCE,
+ /* 3 */ BETAFROG_ANIM_JUMP,
+ /* 4 */ BETAFROG_ANIM_MAX
+} BetaFrogAnimation;
+
+static AnimationInfoS sAnimationInfo[BETAFROG_ANIM_MAX] = {
+ { &gFrogIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // BETAFROG_ANIM_IDLE
+ { &gFrogIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // BETAFROG_ANIM_IDLE_MORPH
+ { &gFrogDanceAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // BETAFROG_ANIM_DANCE
+ { &gFrogJumpAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // BETAFROG_ANIM_JUMP
};
s32 EnFg_ChangeAnim(SkelAnime* skelAnime, s16 animIndex) {
- s16 frameCount;
- s32 ret;
+ s16 endFrame;
+ s32 didAnimChange = false;
- ret = false;
- if (animIndex >= 0 && animIndex < 4) {
- ret = true;
- frameCount = sAnimationInfo[animIndex].frameCount;
- if (frameCount < 0) {
- frameCount = Animation_GetLastFrame(sAnimationInfo[animIndex].animation);
+ if ((animIndex > BETAFROG_ANIM_NONE) && (animIndex < BETAFROG_ANIM_MAX)) {
+ didAnimChange = true;
+ endFrame = sAnimationInfo[animIndex].frameCount;
+ if (endFrame < 0) {
+ endFrame = Animation_GetLastFrame(sAnimationInfo[animIndex].animation);
}
Animation_Change(skelAnime, sAnimationInfo[animIndex].animation, sAnimationInfo[animIndex].playSpeed,
- sAnimationInfo[animIndex].startFrame, frameCount, sAnimationInfo[animIndex].mode,
+ sAnimationInfo[animIndex].startFrame, endFrame, sAnimationInfo[animIndex].mode,
sAnimationInfo[animIndex].morphFrames);
}
- return ret;
+ return didAnimChange;
}
void func_80A2D348(EnFg* this, PlayState* play) {
@@ -130,7 +146,7 @@ void func_80A2D348(EnFg* this, PlayState* play) {
}
}
-void func_80A2D3D4(EnFg* this, PlayState* play) {
+void EnFg_UpdateSkelAnime(EnFg* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
}
@@ -144,24 +160,28 @@ u8 EnFg_UpdateHealth(EnFg* this) {
}
s32 EnFg_GetDamageEffect(EnFg* this) {
- s32 ret = 0;
+ s32 ret = BETAFROG_DMGEFFECT_NONE;
if (this->collider.base.acFlags & AC_HIT) {
switch (this->actor.colChkInfo.damageEffect) {
case 1:
- ret = FG_DMGEFFECT_DEKUSTICK;
+ ret = BETAFROG_DMGEFFECT_DEKUSTICK;
break;
+
case 15:
- ret = FG_DMGEFFECT_HOOKSHOT;
+ ret = BETAFROG_DMGEFFECT_HOOKSHOT;
break;
+
case 14:
- ret = FG_DMGEFFECT_ARROW;
+ ret = BETAFROG_DMGEFFECT_ARROW;
break;
+
case 3:
- ret = FG_DMGEFFECT_ICEARROW;
+ ret = BETAFROG_DMGEFFECT_ICEARROW;
break;
+
default:
- ret = FG_DMGEFFECT_EXPLOSION;
+ ret = BETAFROG_DMGEFFECT_EXPLOSION;
break;
}
this->collider.base.acFlags &= ~AC_HIT;
@@ -176,9 +196,9 @@ void EnFg_Idle(EnFg* this, PlayState* play) {
s16 rotX;
switch (EnFg_GetDamageEffect(this)) {
- case FG_DMGEFFECT_DEKUSTICK:
- this->actor.flags &= ~ACTOR_FLAG_1;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_FROG_CRY_1);
+ case BETAFROG_DMGEFFECT_DEKUSTICK:
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FROG_CRY_1);
this->skelAnime.playSpeed = 0.0f;
this->actor.shape.shadowDraw = NULL;
this->actor.scale.x *= 1.5f;
@@ -187,10 +207,12 @@ 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:
+
+ case BETAFROG_DMGEFFECT_HOOKSHOT:
break;
- case FG_DMGEFFECT_ARROW:
- this->actor.flags &= ~ACTOR_FLAG_1;
+
+ case BETAFROG_DMGEFFECT_ARROW:
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->skelAnime.playSpeed = 0.0f;
rotY = this->collider.base.ac->world.rot.y;
rotX = this->collider.base.ac->world.rot.x;
@@ -202,26 +224,27 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_EV_FROG_CRY_0);
- if (1) {}
- this->actor.params = FG_BLACK;
+
+ case BETAFROG_DMGEFFECT_EXPLOSION:
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FROG_CRY_0);
+ this->actor.params = BETAFROG_BLACK;
this->skelAnime.playSpeed = 0.0f;
ac = this->collider.base.ac;
this->actor.world.rot.y = Math_Vec3f_Yaw(&ac->world.pos, &this->actor.world.pos);
this->actor.shape.rot = this->actor.world.rot;
this->actor.velocity.y = 10.0f;
- this->actor.speedXZ = 3.0f;
+ this->actor.speed = 3.0f;
this->actor.gravity = -0.8f;
this->bounceCounter = 1;
this->timer = 0;
this->actionFunc = EnFg_Knockback;
break;
+
default:
if (DECR(this->timer) == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_FROG_JUMP);
- EnFg_ChangeAnim(&this->skelAnime, 3);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FROG_JUMP);
+ EnFg_ChangeAnim(&this->skelAnime, BETAFROG_ANIM_JUMP);
this->actor.velocity.y = 10.0f;
this->timer = Rand_S16Offset(30, 30);
this->actionFunc = EnFg_Jump;
@@ -237,8 +260,8 @@ void EnFg_Jump(EnFg* this, PlayState* play) {
s16 rotX;
switch (EnFg_GetDamageEffect(this)) {
- case FG_DMGEFFECT_ARROW:
- this->actor.flags &= ~ACTOR_FLAG_1;
+ case BETAFROG_DMGEFFECT_ARROW:
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->skelAnime.playSpeed = 0.0f;
ac = this->collider.base.ac;
rotY = ac->world.rot.y;
@@ -251,32 +274,35 @@ 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:
+
+ case BETAFROG_DMGEFFECT_HOOKSHOT:
break;
- case FG_DMGEFFECT_EXPLOSION:
- this->actor.flags &= ~ACTOR_FLAG_1;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_FROG_CRY_0);
- EnFg_ChangeAnim(&this->skelAnime, 0);
- this->actor.params = FG_BLACK;
+
+ case BETAFROG_DMGEFFECT_EXPLOSION:
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FROG_CRY_0);
+ EnFg_ChangeAnim(&this->skelAnime, BETAFROG_ANIM_IDLE);
+ this->actor.params = BETAFROG_BLACK;
this->skelAnime.playSpeed = 0.0f;
ac = this->collider.base.ac;
this->actor.world.rot.y = Math_Vec3f_Yaw(&ac->world.pos, &this->actor.world.pos);
this->actor.shape.rot = this->actor.world.rot;
this->actor.velocity.y = 10.0f;
- this->actor.speedXZ = 3.0f;
+ this->actor.speed = 3.0f;
this->actor.gravity = -0.8f;
this->bounceCounter = 1;
this->timer = 0;
this->actionFunc = EnFg_Knockback;
break;
+
default:
if (Animation_OnFrame(&this->skelAnime, 8.0f)) {
this->skelAnime.curFrame = 8.0f;
this->skelAnime.playSpeed = 0.0f;
}
- if ((this->actor.velocity.y <= 0.0f) && (this->actor.bgCheckFlags & 1)) {
- EnFg_ChangeAnim(&this->skelAnime, 0);
+ if ((this->actor.velocity.y <= 0.0f) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ EnFg_ChangeAnim(&this->skelAnime, BETAFROG_ANIM_IDLE);
this->actionFunc = EnFg_Idle;
this->actor.velocity.y = 0.0f;
} else {
@@ -289,7 +315,7 @@ void EnFg_DoNothing(EnFg* this, PlayState* play) {
}
void EnFg_Knockback(EnFg* this, PlayState* play) {
- if ((this->actor.velocity.y <= 0.0f) && (this->actor.bgCheckFlags & 1)) {
+ if ((this->actor.velocity.y <= 0.0f) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
this->bounceCounter++;
if (this->bounceCounter < 4) {
this->actor.shape.rot.x += 0x1000;
@@ -298,7 +324,7 @@ void EnFg_Knockback(EnFg* this, PlayState* play) {
this->actionFunc = EnFg_DoNothing;
}
} else {
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->actor.world.rot.y = this->actor.wallYaw;
this->actor.shape.rot = this->actor.world.rot;
}
@@ -315,8 +341,8 @@ void EnFg_Init(Actor* thisx, PlayState* play) {
EnFg* this = THIS;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 10.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_fr_Skel_00B538, NULL, this->jointTable, this->morphTable, 24);
- EnFg_ChangeAnim(&this->skelAnime, 0);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gFrogSkel, NULL, this->jointTable, this->morphTable, FROG_LIMB_MAX);
+ EnFg_ChangeAnim(&this->skelAnime, BETAFROG_ANIM_IDLE);
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit2);
@@ -338,18 +364,19 @@ 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);
}
}
- func_80A2D3D4(this, play);
+ EnFg_UpdateSkelAnime(this, play);
EnFg_UpdateDust(&this->dustEffect[0]);
func_80A2D348(this, play);
}
@@ -357,12 +384,12 @@ void EnFg_Update(Actor* thisx, PlayState* play) {
s32 EnFg_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnFg* this = THIS;
- if ((limbIndex == 7) || (limbIndex == 8)) {
+ if ((limbIndex == FROG_LIMB_RIGHT_EYE) || (limbIndex == FROG_LIMB_LEFT_EYE)) {
*dList = NULL;
}
if (this->actor.colChkInfo.health == 0) {
- if ((limbIndex == 5) || (limbIndex == 9)) {
+ if ((limbIndex == FROG_LIMB_RIGHT_IRIS) || (limbIndex == FROG_LIMB_LEFT_IRIS)) {
*dList = NULL;
}
}
@@ -372,20 +399,22 @@ s32 EnFg_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po
void EnFg_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnFg* this = THIS;
s16 pad;
- Vec3f vec1 = { 0.0f, 0.0f, 0.0f };
+ Vec3f zeroVec = { 0.0f, 0.0f, 0.0f };
- if ((limbIndex == 7) || (limbIndex == 8)) {
+ if ((limbIndex == FROG_LIMB_RIGHT_EYE) || (limbIndex == FROG_LIMB_LEFT_EYE)) {
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);
}
- if (limbIndex == 4) {
- Matrix_MultVec3f(&vec1, &this->actor.focus.pos);
+ if (limbIndex == FROG_LIMB_HEAD) {
+ Matrix_MultVec3f(&zeroVec, &this->actor.focus.pos);
}
}
@@ -393,8 +422,12 @@ void EnFg_Draw(Actor* thisx, PlayState* play) {
EnFg* this = THIS;
s32 pad;
Color_RGBA8 envColor[] = {
- { 200, 170, 0, 255 }, { 0, 170, 200, 255 }, { 210, 120, 100, 255 },
- { 120, 130, 230, 255 }, { 190, 190, 190, 255 }, { 0, 0, 0, 255 },
+ { 200, 170, 0, 255 }, // BETAFROG_YELLOW
+ { 0, 170, 200, 255 }, // BETAFROG_CYAN
+ { 210, 120, 100, 255 }, // BETAFROG_PINK
+ { 120, 130, 230, 255 }, // BETAFROG_BLUE
+ { 190, 190, 190, 255 }, // BETAFROG_WHITE
+ { 0, 0, 0, 255 }, // BETAFROG_BLACK
};
Matrix_Push();
@@ -402,19 +435,21 @@ 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);
- gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(object_fr_Tex_0059A0));
- gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(object_fr_Tex_0059A0));
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gFrogIrisOpenTex));
+ gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(gFrogIrisOpenTex));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnFg_OverrideLimbDraw, EnFg_PostLimbDraw, &this->actor);
+
CLOSE_DISPS(play->state.gfxCtx);
}
-void EnFg_AddDust(EnFgEffectDust* dustEffect, Vec3f* worldPos) {
- Vec3f vel = { 0.0f, 3.0f, 0.0f };
+void EnFg_AddDust(BetaFrogEffectDust* dustEffect, Vec3f* pos) {
+ Vec3f velocity = { 0.0f, 3.0f, 0.0f };
Vec3f unk_20 = { 0.0f, 0.0f, 0.0f };
s32 i;
@@ -422,8 +457,8 @@ void EnFg_AddDust(EnFgEffectDust* dustEffect, Vec3f* worldPos) {
if (!dustEffect->type) {
dustEffect->type = true;
dustEffect->timer = 16;
- dustEffect->pos = *worldPos;
- dustEffect->velocity = vel;
+ dustEffect->pos = *pos;
+ dustEffect->velocity = velocity;
dustEffect->unk_20 = unk_20;
dustEffect->xyScale = 0.4f;
break;
@@ -431,7 +466,7 @@ void EnFg_AddDust(EnFgEffectDust* dustEffect, Vec3f* worldPos) {
}
}
-void EnFg_UpdateDust(EnFgEffectDust* dustEffect) {
+void EnFg_UpdateDust(BetaFrogEffectDust* dustEffect) {
s32 i;
for (i = 0; i < 10; i++, dustEffect++) {
@@ -448,36 +483,39 @@ static TexturePtr sDustTextures[] = {
gEffDust8Tex, gEffDust7Tex, gEffDust6Tex, gEffDust5Tex, gEffDust4Tex, gEffDust3Tex, gEffDust2Tex, gEffDust1Tex,
};
-void EnFg_DrawDust(PlayState* play, EnFgEffectDust* dustEffect) {
+void EnFg_DrawDust(PlayState* play, BetaFrogEffectDust* dustEffect) {
s16 i;
s16 alpha;
s16 index;
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++, gFrogDustMaterialDL);
+ 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++, gFrogDustModelDL);
}
+
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..42d4936ee 100644
--- a/src/overlays/actors/ovl_En_Fg/z_en_fg.h
+++ b/src/overlays/actors/ovl_En_Fg/z_en_fg.h
@@ -2,6 +2,7 @@
#define Z_EN_FG_H
#include "global.h"
+#include "objects/object_fr/object_fr.h"
struct EnFg;
@@ -9,22 +10,13 @@ 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
-} 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,
-} FrogDamageEffect;
+ /* 0 */ BETAFROG_YELLOW,
+ /* 1 */ BETAFROG_CYAN,
+ /* 2 */ BETAFROG_PINK,
+ /* 3 */ BETAFROG_BLUE,
+ /* 4 */ BETAFROG_WHITE,
+ /* 5 */ BETAFROG_BLACK // All frogs are blackened when hit by an explosion
+} BetaFrogType;
typedef struct {
/* 0x00 */ u8 type;
@@ -35,18 +27,18 @@ typedef struct {
/* 0x20 */ Vec3f unk_20; // Likely acceleration, set to 0 but unused
/* 0x2C */ Vec3f velocity;
/* 0x38 */ UNK_TYPE1 unk_38[0x4];
-} EnFgEffectDust; // size = 0x3C
+} BetaFrogEffectDust; // size = 0x3C
typedef struct EnFg {
/* 0x000 */ Actor actor;
/* 0x144 */ EnFgActionFunc actionFunc;
/* 0x148 */ SkelAnime skelAnime;
/* 0x18C */ ColliderCylinder collider;
- /* 0x1D8 */ Vec3s jointTable[24];
- /* 0x268 */ Vec3s morphTable[24];
+ /* 0x1D8 */ Vec3s jointTable[FROG_LIMB_MAX];
+ /* 0x268 */ Vec3s morphTable[FROG_LIMB_MAX];
/* 0x2F8 */ s16 timer;
/* 0x2FA */ s16 bounceCounter;
- /* 0x2FC */ EnFgEffectDust dustEffect[10];
+ /* 0x2FC */ BetaFrogEffectDust dustEffect[10];
} EnFg; // size = 0x554
#endif // Z_EN_FG_H
diff --git a/src/overlays/actors/ovl_En_Fire_Rock/z_en_fire_rock.c b/src/overlays/actors/ovl_En_Fire_Rock/z_en_fire_rock.c
index 90801ef44..1e8425412 100644
--- a/src/overlays/actors/ovl_En_Fire_Rock/z_en_fire_rock.c
+++ b/src/overlays/actors/ovl_En_Fire_Rock/z_en_fire_rock.c
@@ -29,9 +29,12 @@ ActorInit En_Fire_Rock_InitVars = {
void EnFireRock_Init(Actor* thisx, PlayState* play) {
}
+
void EnFireRock_Destroy(Actor* thisx, PlayState* play) {
}
+
void EnFireRock_Update(Actor* thisx, PlayState* play) {
}
+
void EnFireRock_Draw(Actor* thisx, PlayState* play) {
}
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 5cdcd99fe..6b9d031df 100644
--- a/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c
+++ b/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c
@@ -5,10 +5,10 @@
*/
#include "z_en_firefly.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#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_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_4000)
#define THIS ((EnFirefly*)thisx)
@@ -125,7 +125,7 @@ static DamageTable sDamageTable = {
static InitChainEntry sInitChain[] = {
ICHAIN_VEC3F_DIV1000(scale, 5, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -500, ICHAIN_CONTINUE),
- ICHAIN_U8(targetMode, 2, ICHAIN_CONTINUE),
+ ICHAIN_U8(targetMode, TARGET_MODE_2, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 4000, ICHAIN_STOP),
};
@@ -134,13 +134,13 @@ void EnFirefly_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->actor, sInitChain);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 25.0f);
- SkelAnime_Init(play, &this->skelAnime, &object_firefly_Skel_0018B8, &object_firefly_Anim_00017C, this->jointTable,
- this->morphTable, 28);
+ SkelAnime_Init(play, &this->skelAnime, &gFireKeeseSkel, &gFireKeeseFlyAnim, this->jointTable, this->morphTable,
+ FIRE_KEESE_LIMB_MAX);
Collider_InitAndSetSphere(play, &this->collider, &this->actor, &sSphereInit);
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
if (this->actor.params & KEESE_INVISIBLE) {
- this->actor.flags |= ACTOR_FLAG_80;
+ this->actor.flags |= ACTOR_FLAG_REACT_TO_LENS;
this->actor.params = KEESE_GET_MAIN_TYPE(thisx);
this->isInvisible = true;
}
@@ -180,7 +180,7 @@ void EnFirefly_SpawnIceEffects(EnFirefly* this, PlayState* play) {
if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->drawDmgEffAlpha = 0.0f;
- Actor_SpawnIceEffects(play, &this->actor, &this->limbPos[0], 3, 2, 0.2f, 0.2f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, KEESE_BODYPART_MAX, 2, 0.2f, 0.2f);
}
}
@@ -208,19 +208,20 @@ s32 EnFirefly_ReturnToPerch(EnFirefly* this, PlayState* play) {
return false;
}
- if (Actor_XZDistanceToPoint(&player->actor, &this->actor.home.pos) > 300.0f) {
- distFromHome = Actor_DistanceToPoint(&this->actor, &this->actor.home.pos);
+ if (Actor_WorldDistXZToPoint(&player->actor, &this->actor.home.pos) > 300.0f) {
+ distFromHome = Actor_WorldDistXYZToPoint(&this->actor, &this->actor.home.pos);
if (distFromHome < 5.0f) {
EnFirefly_SetupPerch(this);
} else {
if (distFromHome * 0.05f < 1.0f) {
- this->actor.speedXZ *= distFromHome * 0.05f;
+ this->actor.speed *= distFromHome * 0.05f;
}
- Math_ScaledStepToS(&this->actor.shape.rot.y, Actor_YawToPoint(&this->actor, &this->actor.home.pos), 0x300);
+ Math_ScaledStepToS(&this->actor.shape.rot.y, Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos),
+ 0x300);
Math_ScaledStepToS(&this->actor.shape.rot.x,
- Actor_PitchToPoint(&this->actor, &this->actor.home.pos) + 0x1554, 0x100);
+ Actor_WorldPitchTowardPoint(&this->actor, &this->actor.home.pos) + 0x1554, 0x100);
}
return true;
@@ -242,7 +243,7 @@ s32 EnFirefly_SeekTorch(EnFirefly* this, PlayState* play) {
while (findTorch != NULL) {
if ((findTorch->actor.id == ACTOR_OBJ_SYOKUDAI) && (findTorch->snuffTimer != OBJ_SYOKUDAI_SNUFF_OUT)) {
- currentDist = Actor_DistanceBetweenActors(&this->actor, &findTorch->actor);
+ currentDist = Actor_WorldDistXYZToActor(&this->actor, &findTorch->actor);
if (currentDist < currentMinDist) {
currentMinDist = currentDist;
closestTorch = findTorch;
@@ -256,12 +257,13 @@ s32 EnFirefly_SeekTorch(EnFirefly* this, PlayState* play) {
flamePos.y = closestTorch->actor.world.pos.y + 52.0f + 30.0f;
flamePos.z = closestTorch->actor.world.pos.z;
- if (Actor_DistanceToPoint(&this->actor, &flamePos) < 15.0f) {
+ if (Actor_WorldDistXYZToPoint(&this->actor, &flamePos) < 15.0f) {
EnFirefly_Ignite(this);
} else {
- Math_ScaledStepToS(&this->actor.shape.rot.y, Actor_YawBetweenActors(&this->actor, &closestTorch->actor),
+ Math_ScaledStepToS(&this->actor.shape.rot.y, Actor_WorldYawTowardActor(&this->actor, &closestTorch->actor),
0x300);
- Math_ScaledStepToS(&this->actor.shape.rot.x, Actor_PitchToPoint(&this->actor, &flamePos) + 0x1554, 0x100);
+ Math_ScaledStepToS(&this->actor.shape.rot.x, Actor_WorldPitchTowardPoint(&this->actor, &flamePos) + 0x1554,
+ 0x100);
}
return true;
@@ -272,15 +274,15 @@ s32 EnFirefly_SeekTorch(EnFirefly* this, PlayState* play) {
void EnFirefly_SetupFlyIdle(EnFirefly* this) {
this->timer = Rand_S16Offset(70, 100);
- this->actor.speedXZ = (Rand_ZeroOne() * 1.5f) + 1.5f;
- Math_ScaledStepToS(&this->actor.shape.rot.y, Actor_YawToPoint(&this->actor, &this->actor.home.pos), 0x300);
+ this->actor.speed = (Rand_ZeroOne() * 1.5f) + 1.5f;
+ Math_ScaledStepToS(&this->actor.shape.rot.y, Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos), 0x300);
this->pitchTarget = ((this->maxAltitude < this->actor.world.pos.y) ? 0xC00 : -0xC00) + 0x1554;
this->skelAnime.playSpeed = 1.0f;
this->actionFunc = EnFirefly_FlyIdle;
}
void EnFirefly_FlyIdle(EnFirefly* this, PlayState* play) {
- s32 isSkelAnimeUpdated;
+ s32 onAnimFirstFrame;
f32 rand;
SkelAnime_Update(&this->skelAnime);
@@ -288,18 +290,18 @@ void EnFirefly_FlyIdle(EnFirefly* this, PlayState* play) {
this->timer--;
}
- isSkelAnimeUpdated = Animation_OnFrame(&this->skelAnime, 0.0f);
- this->actor.speedXZ = (Rand_ZeroOne() * 1.5f) + 1.5f;
+ onAnimFirstFrame = Animation_OnFrame(&this->skelAnime, 0.0f);
+ this->actor.speed = (Rand_ZeroOne() * 1.5f) + 1.5f;
if (!EnFirefly_ReturnToPerch(this, play) && !EnFirefly_SeekTorch(this, play)) {
- if (isSkelAnimeUpdated) {
+ if (onAnimFirstFrame) {
rand = Rand_ZeroOne();
if (rand < 0.5f) {
- Math_ScaledStepToS(&this->actor.shape.rot.y, Actor_YawToPoint(&this->actor, &this->actor.home.pos),
- 0x300);
+ 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
@@ -315,9 +317,10 @@ void EnFirefly_FlyIdle(EnFirefly* this, PlayState* play) {
this->pitchTarget = 0x2154;
}
} else {
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->pitchTarget = 0x954;
- } else if ((this->actor.bgCheckFlags & 0x10) || (this->maxAltitude < this->actor.world.pos.y)) {
+ } else if ((this->actor.bgCheckFlags & BGCHECKFLAG_CEILING) ||
+ (this->maxAltitude < this->actor.world.pos.y)) {
this->pitchTarget = 0x2154;
}
}
@@ -325,7 +328,7 @@ void EnFirefly_FlyIdle(EnFirefly* this, PlayState* play) {
Math_ScaledStepToS(&this->actor.shape.rot.x, this->pitchTarget, 0x100);
}
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.wallYaw, 2, 0xC00, 0x300);
}
@@ -337,14 +340,14 @@ void EnFirefly_FlyIdle(EnFirefly* this, PlayState* play) {
void EnFirefly_SetupFall(EnFirefly* this, PlayState* play) {
this->timer = 40;
this->actor.velocity.y = 0.0f;
- Animation_Change(&this->skelAnime, &object_firefly_Anim_00017C, 0.0f, 6.0f, 6.0f, ANIMMODE_ONCE, 0.0f);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FFLY_DEAD);
+ Animation_Change(&this->skelAnime, &gFireKeeseFlyAnim, 0.0f, 6.0f, 6.0f, ANIMMODE_ONCE, 0.0f);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FFLY_DEAD);
this->actor.flags |= ACTOR_FLAG_10;
if (this->isInvisible) {
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0x2000, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_XLU, 40);
} else {
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 40);
}
if (this->actor.colChkInfo.damageEffect == KEESE_DMGEFF_ICE) {
@@ -358,7 +361,7 @@ void EnFirefly_SetupFall(EnFirefly* this, PlayState* play) {
this->drawDmgEffScale = 0.55f;
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_SMALL_LIGHT_RAYS);
+ CLEAR_TAG_PARAMS(CLEAR_TAG_SMALL_LIGHT_RAYS));
} else if (this->actor.colChkInfo.damageEffect == KEESE_DMGEFF_FIRE) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->drawDmgEffAlpha = 4.0f;
@@ -370,7 +373,7 @@ void EnFirefly_SetupFall(EnFirefly* this, PlayState* play) {
}
if (this->actor.flags & ACTOR_FLAG_8000) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
this->actionFunc = EnFirefly_Fall;
@@ -379,7 +382,7 @@ void EnFirefly_SetupFall(EnFirefly* this, PlayState* play) {
// Fall to the ground after being hit
void EnFirefly_Fall(EnFirefly* this, PlayState* play) {
this->actor.colorFilterTimer = 40;
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f);
+ Math_StepToF(&this->actor.speed, 0.0f, 0.5f);
if (!(this->actor.flags & ACTOR_FLAG_8000)) {
if (this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
@@ -387,7 +390,7 @@ void EnFirefly_Fall(EnFirefly* this, PlayState* play) {
this->actor.shape.rot.y -= 0x300;
}
- if ((this->actor.bgCheckFlags & 1) || (this->actor.floorHeight == BGCHECK_Y_MIN)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (this->actor.floorHeight == BGCHECK_Y_MIN)) {
EnFirefly_SpawnIceEffects(this, play);
EnFirefly_SetupDie(this);
}
@@ -396,7 +399,7 @@ void EnFirefly_Fall(EnFirefly* this, PlayState* play) {
void EnFirefly_SetupDie(EnFirefly* this) {
this->timer = 15;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = EnFirefly_Die;
}
@@ -432,9 +435,9 @@ void EnFirefly_DiveAttack(EnFirefly* this, PlayState* play) {
this->timer--;
}
- Math_StepToF(&this->actor.speedXZ, 4.0f, 0.5f);
+ Math_StepToF(&this->actor.speed, 4.0f, 0.5f);
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.wallYaw, 2, 0xC00, 0x300);
Math_ScaledStepToS(&this->actor.shape.rot.x, this->pitchTarget, 0x100);
} else if (Actor_IsFacingPlayer(&this->actor, 0x2800)) {
@@ -447,19 +450,19 @@ void EnFirefly_DiveAttack(EnFirefly* this, PlayState* play) {
preyPos.x = player->actor.world.pos.x;
preyPos.y = player->actor.world.pos.y + 20.0f;
preyPos.z = player->actor.world.pos.z;
- Math_SmoothStepToS(&this->actor.shape.rot.x, Actor_PitchToPoint(&this->actor, &preyPos) + 0x1554, 2, 0x400,
- 0x100);
+ Math_SmoothStepToS(&this->actor.shape.rot.x, Actor_WorldPitchTowardPoint(&this->actor, &preyPos) + 0x1554, 2,
+ 0x400, 0x100);
} else {
this->skelAnime.playSpeed = 1.5f;
if (this->actor.xzDistToPlayer > 80.0f) {
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 2, 0xC00, 0x300);
}
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->pitchTarget = 0x954;
}
- if ((this->actor.bgCheckFlags & 0x10) || (this->maxAltitude < this->actor.world.pos.y)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_CEILING) || (this->maxAltitude < this->actor.world.pos.y)) {
this->pitchTarget = 0x2154;
} else {
this->pitchTarget = 0x954;
@@ -478,7 +481,7 @@ void EnFirefly_SetupRebound(EnFirefly* this) {
this->actor.world.rot.x = 0x7000;
this->timer = 18;
this->skelAnime.playSpeed = 1.0f;
- this->actor.speedXZ = 2.5f;
+ this->actor.speed = 2.5f;
this->actionFunc = EnFirefly_Rebound;
}
@@ -487,7 +490,7 @@ void EnFirefly_Rebound(EnFirefly* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
Math_ScaledStepToS(&this->actor.shape.rot.x, 0, 0x100);
Math_StepToF(&this->actor.velocity.y, 0.0f, 0.4f);
- if (Math_StepToF(&this->actor.speedXZ, 0.0f, 0.15f)) {
+ if (Math_StepToF(&this->actor.speed, 0.0f, 0.15f)) {
if (this->timer != 0) {
this->timer--;
}
@@ -519,20 +522,21 @@ void EnFirefly_FlyAway(EnFirefly* this, PlayState* play) {
return;
}
- Math_StepToF(&this->actor.speedXZ, 3.0f, 0.3f);
+ Math_StepToF(&this->actor.speed, 3.0f, 0.3f);
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->pitchTarget = 0x954;
- } else if ((this->actor.bgCheckFlags & 0x10) || (this->maxAltitude < this->actor.world.pos.y)) {
+ } else if ((this->actor.bgCheckFlags & BGCHECKFLAG_CEILING) || (this->maxAltitude < this->actor.world.pos.y)) {
this->pitchTarget = 0x2154;
} else {
this->pitchTarget = 0x954;
}
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.wallYaw, 2, 0xC00, 0x300);
} else {
- Math_ScaledStepToS(&this->actor.shape.rot.y, Actor_YawToPoint(&this->actor, &this->actor.home.pos), 0x300);
+ Math_ScaledStepToS(&this->actor.shape.rot.y, Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos),
+ 0x300);
}
Math_ScaledStepToS(&this->actor.shape.rot.x, this->pitchTarget, 0x100);
@@ -540,24 +544,24 @@ void EnFirefly_FlyAway(EnFirefly* this, PlayState* play) {
void EnFirefly_SetupStunned(EnFirefly* this) {
if (this->isInvisible) {
- Actor_SetColorFilter(&this->actor, 0, 255, 0x2000, this->timer);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_XLU, this->timer);
} else {
- Actor_SetColorFilter(&this->actor, 0, 255, 0, this->timer);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, this->timer);
}
if (this->actionFunc != EnFirefly_Stunned) {
this->actor.velocity.y = 0.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
this->auraType = KEESE_AURA_NONE;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
this->actionFunc = EnFirefly_Stunned;
}
void EnFirefly_Stunned(EnFirefly* this, PlayState* play) {
Math_ScaledStepToS(&this->actor.shape.rot.x, 0x1554, 0x100);
- if ((this->actor.bgCheckFlags & 1) || (this->actor.floorHeight == BGCHECK_Y_MIN)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (this->actor.floorHeight == BGCHECK_Y_MIN)) {
if (this->timer != 0) {
this->timer--;
}
@@ -583,7 +587,7 @@ void EnFirefly_Stunned(EnFirefly* this, PlayState* play) {
void EnFirefly_SetupPerch(EnFirefly* this) {
this->timer = 1;
this->actionFunc = EnFirefly_Perch;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
// When perching, sit on collision and flap at random intervals
@@ -608,7 +612,7 @@ void EnFirefly_SetupDisturbDiveAttack(EnFirefly* this) {
this->actor.shape.rot.x = 0x1554;
this->actor.shape.rot.y = this->actor.yawTowardsPlayer;
this->timer = 50;
- this->actor.speedXZ = 3.0f;
+ this->actor.speed = 3.0f;
this->actionFunc = EnFirefly_DisturbDiveAttack;
}
@@ -627,7 +631,8 @@ void EnFirefly_DisturbDiveAttack(EnFirefly* this, PlayState* play) {
preyPos.x = player->actor.world.pos.x;
preyPos.y = player->actor.world.pos.y + 20.0f;
preyPos.z = player->actor.world.pos.z;
- Math_ScaledStepToS(&this->actor.shape.rot.x, Actor_PitchToPoint(&this->actor, &preyPos) + 0x1554, 0x100);
+ Math_ScaledStepToS(&this->actor.shape.rot.x, Actor_WorldPitchTowardPoint(&this->actor, &preyPos) + 0x1554,
+ 0x100);
Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0x300);
}
@@ -653,7 +658,7 @@ void EnFirefly_UpdateDamage(EnFirefly* this, PlayState* play) {
} else {
Enemy_StartFinishingBlow(play, &this->actor);
this->actor.colChkInfo.health = 0;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
// Negate effects of fire on Fire Keese and Ice on Ice Keese
if (((this->currentType == KEESE_FIRE) && (this->actor.colChkInfo.damageEffect == KEESE_DMGEFF_FIRE)) ||
@@ -672,7 +677,7 @@ void EnFirefly_Update(Actor* thisx, PlayState* play2) {
if (this->collider.base.atFlags & AT_HIT) {
this->collider.base.atFlags &= ~AT_HIT;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FFLY_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FFLY_ATTACK);
if (this->currentType != KEESE_NORMAL) {
EnFirefly_Extinguish(this);
@@ -698,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;
@@ -712,7 +718,7 @@ void EnFirefly_Update(Actor* thisx, PlayState* play2) {
this->actor.world.rot.y = this->actor.shape.rot.y;
if (Animation_OnFrame(&this->skelAnime, 5.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FFLY_FLY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FFLY_FLY);
}
}
@@ -724,7 +730,7 @@ void EnFirefly_Update(Actor* thisx, PlayState* play2) {
this->drawDmgEffScale = (this->drawDmgEffAlpha + 1.0f) * 0.275f;
this->drawDmgEffScale = CLAMP_MAX(this->drawDmgEffScale, 0.55f);
} else if (!Math_StepToF(&this->drawDmgEffFrozenSteamScale, 0.55f, 0.55f / 40.0f)) {
- func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
}
@@ -741,7 +747,7 @@ s32 EnFirefly_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3
if (this->isInvisible && (play->actorCtx.lensMaskSize != LENS_MASK_ACTIVE_SIZE)) {
*dList = NULL;
- } else if (limbIndex == 1) {
+ } else if (limbIndex == FIRE_KEESE_LIMB_ROOT) {
pos->y += 2300.0f;
}
return false;
@@ -762,11 +768,11 @@ void EnFirefly_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
s32 pad;
EnFirefly* this = THIS;
- if ((this->currentType != KEESE_FIRE) && (limbIndex == 27)) {
- gSPDisplayList((*gfx)++, object_firefly_DL_001678);
+ if ((this->currentType != KEESE_FIRE) && (limbIndex == FIRE_KEESE_LIMB_HEAD)) {
+ gSPDisplayList((*gfx)++, gKeeseRedEyesDL);
} else if ((this->lastDrawnFrame != play->gameplayFrames) &&
((this->auraType == KEESE_AURA_FIRE) || (this->auraType == KEESE_AURA_ICE)) &&
- ((limbIndex == 15) || (limbIndex == 21))) {
+ ((limbIndex == FIRE_KEESE_LIMB_LEFT_WING_END) || (limbIndex == FIRE_KEESE_LIMB_RIGHT_WING_END_ROOT))) {
if (this->actionFunc != EnFirefly_Die) {
Matrix_MultZero(&auraPos);
auraPos.x += Rand_ZeroFloat(5.0f);
@@ -775,7 +781,7 @@ void EnFirefly_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
auraScaleStep = -40;
auraLife = 3;
} else {
- if (limbIndex == 15) {
+ if (limbIndex == FIRE_KEESE_LIMB_LEFT_WING_END) {
auraPos.x = Math_SinS(9100 * this->timer) * this->timer + this->actor.world.pos.x;
auraPos.z = Math_CosS(9100 * this->timer) * this->timer + this->actor.world.pos.z;
} else {
@@ -800,12 +806,12 @@ void EnFirefly_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
auraLife);
}
- if (limbIndex == 15) {
- Matrix_MultZero(&this->limbPos[0]);
- } else if (limbIndex == 21) {
- Matrix_MultZero(&this->limbPos[1]);
- } else if (limbIndex == 10) {
- Matrix_MultZero(&this->limbPos[2]);
+ if (limbIndex == FIRE_KEESE_LIMB_LEFT_WING_END) {
+ Matrix_MultZero(&this->bodyPartsPos[KEESE_BODYPART_LEFT_WING_END]);
+ } else if (limbIndex == FIRE_KEESE_LIMB_RIGHT_WING_END_ROOT) {
+ Matrix_MultZero(&this->bodyPartsPos[KEESE_BODYPART_RIGHT_WING_END_ROOT]);
+ } else if (limbIndex == FIRE_KEESE_LIMB_BODY) {
+ Matrix_MultZero(&this->bodyPartsPos[KEESE_BODYPART_BODY]);
}
}
@@ -822,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);
@@ -838,7 +844,7 @@ void EnFirefly_Draw(Actor* thisx, PlayState* play) {
POLY_OPA_DISP = gfx;
}
- Actor_DrawDamageEffects(play, NULL, this->limbPos, ARRAY_COUNT(this->limbPos),
+ Actor_DrawDamageEffects(play, NULL, this->bodyPartsPos, KEESE_BODYPART_MAX,
this->drawDmgEffScale * this->actor.scale.y * 200.0f, this->drawDmgEffFrozenSteamScale,
this->drawDmgEffAlpha, this->drawDmgEffType);
this->lastDrawnFrame = play->gameplayFrames;
diff --git a/src/overlays/actors/ovl_En_Firefly/z_en_firefly.h b/src/overlays/actors/ovl_En_Firefly/z_en_firefly.h
index 6ac9fb008..6174c2e87 100644
--- a/src/overlays/actors/ovl_En_Firefly/z_en_firefly.h
+++ b/src/overlays/actors/ovl_En_Firefly/z_en_firefly.h
@@ -2,6 +2,7 @@
#define Z_EN_FIREFLY_H
#include "global.h"
+#include "objects/object_firefly/object_firefly.h"
struct EnFirefly;
@@ -17,6 +18,13 @@ typedef enum {
#define KEESE_INVISIBLE (1 << 0xF)
#define KEESE_GET_MAIN_TYPE(thisx) ((thisx)->params & 0x7FFF)
+typedef enum KeeseBodyPart {
+ /* 0 */ KEESE_BODYPART_LEFT_WING_END,
+ /* 1 */ KEESE_BODYPART_RIGHT_WING_END_ROOT,
+ /* 2 */ KEESE_BODYPART_BODY,
+ /* 3 */ KEESE_BODYPART_MAX
+} KeeseBodyPart;
+
typedef struct EnFirefly {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
@@ -27,14 +35,14 @@ typedef struct EnFirefly {
/* 0x18F */ u8 drawDmgEffType;
/* 0x190 */ s16 timer;
/* 0x192 */ s16 pitchTarget;
- /* 0x194 */ Vec3s jointTable[28];
- /* 0x23C */ Vec3s morphTable[28];
+ /* 0x194 */ Vec3s jointTable[FIRE_KEESE_LIMB_MAX];
+ /* 0x23C */ Vec3s morphTable[FIRE_KEESE_LIMB_MAX];
/* 0x2E4 */ f32 maxAltitude;
/* 0x2E8 */ f32 drawDmgEffAlpha;
/* 0x2E8 */ f32 drawDmgEffScale;
/* 0x2E8 */ f32 drawDmgEffFrozenSteamScale;
/* 0x2F4 */ u32 lastDrawnFrame;
- /* 0x2F8 */ Vec3f limbPos[3];
+ /* 0x2F8 */ Vec3f bodyPartsPos[KEESE_BODYPART_MAX];
/* 0x31C */ ColliderSphere collider;
} EnFirefly; // size = 0x374
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..3459faf40 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,8 @@
#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_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | 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 5f9bbb2da..0a7e892a7 100644
--- a/src/overlays/actors/ovl_En_Fish/z_en_fish.c
+++ b/src/overlays/actors/ovl_En_Fish/z_en_fish.c
@@ -5,7 +5,6 @@
*/
#include "z_en_fish.h"
-#include "objects/gameplay_keep/gameplay_keep.h"
#define FLAGS 0x00000000
@@ -206,7 +205,7 @@ void EnFish_Init(Actor* thisx, PlayState* play) {
}
SkelAnime_InitFlex(play, &this->skelAnime, &gameplay_keep_Skel_02F028, &gameplay_keep_Anim_02F0EC, this->jointTable,
- this->morphTable, 7);
+ this->morphTable, FISH_LIMB_MAX);
Collider_SetJntSph(play, &this->collider, &this->actor, &sJntSphInit, this->colliderElements);
this->actor.colChkInfo.mass = this->unk_25C * 30.0f;
@@ -264,7 +263,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;
@@ -278,12 +277,12 @@ void func_8091DF68(Actor* thisx, PlayState* play) {
EnFish* this = THIS;
func_8091DD48(this);
- Math_SmoothStepToF(&thisx->speedXZ, 0.0f, 0.05f, 0.3f, 0.0f);
+ Math_SmoothStepToF(&thisx->speed, 0.0f, 0.05f, 0.3f, 0.0f);
- if ((thisx->speedXZ * 1.4f) + 0.8f > 2.0f) {
+ if ((thisx->speed * 1.4f) + 0.8f > 2.0f) {
this->skelAnime.playSpeed = 2.0f;
} else {
- this->skelAnime.playSpeed = (thisx->speedXZ * 1.4f) + 0.8f;
+ this->skelAnime.playSpeed = (thisx->speed * 1.4f) + 0.8f;
}
this->unk_270 >>= 1;
@@ -314,7 +313,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;
@@ -327,7 +326,7 @@ void func_8091E128(Actor* thisx, PlayState* play) {
EnFish* this = THIS;
func_8091DD48(this);
- Math_SmoothStepToF(&thisx->speedXZ, 1.8f, 0.08f, 0.4f, 0.0f);
+ Math_SmoothStepToF(&thisx->speed, 1.8f, 0.08f, 0.4f, 0.0f);
if ((func_8091D630(&thisx->world.pos, &thisx->home.pos) > SQ(80.0f)) || (this->unk_240 < 4)) {
this->unk_270 = this->unk_264;
@@ -342,10 +341,10 @@ void func_8091E128(Actor* thisx, PlayState* play) {
this->unk_24C = 0.0f;
}
- if ((thisx->speedXZ * 1.5f) + 0.8f > 4.0f) {
+ if ((thisx->speed * 1.5f) + 0.8f > 4.0f) {
this->skelAnime.playSpeed = 4.0f;
} else {
- this->skelAnime.playSpeed = (thisx->speedXZ * 1.5f) + 0.8f;
+ this->skelAnime.playSpeed = (thisx->speed * 1.5f) + 0.8f;
}
if (this->unk_240 <= 0) {
@@ -361,7 +360,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;
@@ -378,7 +377,7 @@ void func_8091E34C(Actor* thisx, PlayState* play2) {
s32 pad;
func_8091DD48(this);
- Math_SmoothStepToF(&thisx->speedXZ, 4.2f, 0.08f, 1.4f, 0.0f);
+ Math_SmoothStepToF(&thisx->speed, 4.2f, 0.08f, 1.4f, 0.0f);
if (func_8091D630(&thisx->world.pos, &thisx->home.pos) > SQ(160.0f)) {
this->unk_270 = this->unk_264;
@@ -418,10 +417,10 @@ void func_8091E34C(Actor* thisx, PlayState* play2) {
this->unk_24C = 0.0f;
}
- if ((thisx->speedXZ * 1.5f) + 0.8f > 4.0f) {
+ if ((thisx->speed * 1.5f) + 0.8f > 4.0f) {
this->skelAnime.playSpeed = 4.0f;
} else {
- this->skelAnime.playSpeed = (thisx->speedXZ * 1.5f) + 0.8f;
+ this->skelAnime.playSpeed = (thisx->speed * 1.5f) + 0.8f;
}
if ((this->unk_240 <= 0) || (!sp3C && (sp38 == 0))) {
@@ -440,7 +439,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;
}
@@ -453,7 +452,7 @@ void func_8091E658(Actor* thisx, PlayState* play) {
s16 sp32;
func_8091DD48(this);
- Math_SmoothStepToF(&thisx->speedXZ, 1.8f, 0.1f, 0.5f, 0.0f);
+ Math_SmoothStepToF(&thisx->speed, 1.8f, 0.1f, 0.5f, 0.0f);
if (func_8091D630(&thisx->world.pos, &thisx->home.pos) > SQ(80.0f)) {
this->unk_270 = this->unk_264;
@@ -475,10 +474,10 @@ void func_8091E658(Actor* thisx, PlayState* play) {
this->unk_24C = 1.2f;
}
- if ((thisx->speedXZ * 1.5f) + 0.8f > 4.0f) {
+ if ((thisx->speed * 1.5f) + 0.8f > 4.0f) {
this->skelAnime.playSpeed = 4.0f;
} else {
- this->skelAnime.playSpeed = (thisx->speedXZ * 1.5f) + 0.8f;
+ this->skelAnime.playSpeed = (thisx->speed * 1.5f) + 0.8f;
}
if (this->unk_240 <= 0) {
@@ -493,7 +492,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;
@@ -502,16 +501,16 @@ void func_8091E810(EnFish* this) {
void func_8091E880(Actor* thisx, PlayState* play) {
EnFish* this = THIS;
- Math_SmoothStepToF(&this->actor.speedXZ, 0.0f, 0.1f, 0.1f, 0.0f);
+ Math_SmoothStepToF(&this->actor.speed, 0.0f, 0.1f, 0.1f, 0.0f);
this->unk_26E = 0x43;
this->unk_272 = 0x43;
this->unk_268 = 0x4000;
this->unk_26C = -0x4000;
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->unk_240 = 400;
func_8091E9A4(this);
- } else if (this->actor.bgCheckFlags & 0x20) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_DIVE_INTO_WATER_L);
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_DIVE_INTO_WATER_L);
func_8091D840(thisx, play, 10, 15.0f);
if (func_8091DA14(this, play)) {
func_8091EF30(this);
@@ -551,10 +550,10 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_EV_FISH_LEAP);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FISH_LEAP);
}
}
@@ -563,7 +562,7 @@ void func_8091EAF0(Actor* thisx, PlayState* play) {
s32 sp40 = play->state.frames;
s16 phi_v1;
- Math_SmoothStepToF(&this->actor.speedXZ, Rand_ZeroOne() * 0.2f, 0.1f, 0.1f, 0.0f);
+ Math_SmoothStepToF(&this->actor.speed, Rand_ZeroOne() * 0.2f, 0.1f, 0.1f, 0.0f);
phi_v1 = (s16)((((sp40 >> 5) & 2) | ((sp40 >> 2) & 1)) << 0xB) * 0.3f;
if (sp40 & 4) {
phi_v1 *= -1;
@@ -592,13 +591,13 @@ void func_8091EAF0(Actor* thisx, PlayState* play) {
} else {
this->actor.draw = NULL;
}
- } else if (this->actor.bgCheckFlags & 0x20) {
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER) {
if (func_8091DA14(this, play)) {
func_8091EF30(this);
} else {
func_8091ECF4(this);
}
- } else if (this->actor.bgCheckFlags & 1) {
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
func_8091E9A4(this);
}
}
@@ -612,7 +611,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;
}
@@ -625,12 +624,12 @@ void func_8091ED70(Actor* thisx, PlayState* play) {
func_8091D840(thisx, play, 2, 25.0f);
}
- Math_SmoothStepToF(&thisx->speedXZ, 2.8f, 0.1f, 0.4f, 0.0f);
+ Math_SmoothStepToF(&thisx->speed, 2.8f, 0.1f, 0.4f, 0.0f);
- if ((thisx->bgCheckFlags & 8) || !(thisx->bgCheckFlags & 0x20)) {
+ if ((thisx->bgCheckFlags & BGCHECKFLAG_WALL) || !(thisx->bgCheckFlags & BGCHECKFLAG_WATER)) {
sp2E = Math_Vec3f_Yaw(&thisx->world.pos, &thisx->home.pos);
thisx->home.rot.y = Rand_S16Offset(-100, 100) + sp2E;
- thisx->speedXZ *= 0.5f;
+ thisx->speed *= 0.5f;
}
this->unk_268 = 0;
@@ -640,7 +639,7 @@ void func_8091ED70(Actor* thisx, PlayState* play) {
this->unk_270 = 2000;
this->unk_272 = 0x29B;
- if (thisx->bgCheckFlags & 1) {
+ if (thisx->bgCheckFlags & BGCHECKFLAG_GROUND) {
Math_StepToF(&thisx->world.pos.y, thisx->home.pos.y - 4.0f, 2.0f);
} else {
Math_StepToF(&thisx->world.pos.y, thisx->home.pos.y - 10.0f, 2.0f);
@@ -651,10 +650,10 @@ void func_8091ED70(Actor* thisx, PlayState* play) {
func_8091D728(this);
}
- if ((thisx->speedXZ * 1.5f) + 1.0f > 4.8f) {
+ if ((thisx->speed * 1.5f) + 1.0f > 4.8f) {
this->skelAnime.playSpeed = 4.8f;
} else {
- this->skelAnime.playSpeed = (thisx->speedXZ * 1.5f) + 1.0f;
+ this->skelAnime.playSpeed = (thisx->speed * 1.5f) + 1.0f;
}
if (this->unk_240 <= 0) {
@@ -677,7 +676,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;
}
@@ -700,18 +699,19 @@ void func_8091EFE8(Actor* thisx, PlayState* play) {
}
if (this->unk_277 == 0) {
- Math_SmoothStepToF(&this->actor.speedXZ, 2.8f, 0.1f, 0.4f, 0.0f);
+ Math_SmoothStepToF(&this->actor.speed, 2.8f, 0.1f, 0.4f, 0.0f);
if (this->unk_240 < 6) {
- this->actor.speedXZ *= 0.75f;
+ this->actor.speed *= 0.75f;
}
}
- if ((this->actor.bgCheckFlags & 8) && !(this->actor.bgCheckFlags & 0x20)) {
- this->actor.speedXZ *= 0.5f;
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) && !(this->actor.bgCheckFlags & BGCHECKFLAG_WATER)) {
+ this->actor.speed *= 0.5f;
}
- if (((Rand_Next() >> 0x1B) == 0) || ((this->actor.bgCheckFlags & 8) && ((Rand_Next() >> 0x1E) == 0)) ||
- !(this->actor.bgCheckFlags & 0x20)) {
+ if (((Rand_Next() >> 0x1B) == 0) ||
+ ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) && ((Rand_Next() >> 0x1E) == 0)) ||
+ !(this->actor.bgCheckFlags & BGCHECKFLAG_WATER)) {
temp_f0 = Rand_ZeroOne();
sp34 = (1.0f - SQ(temp_f0)) * sp3C->home.rot.x;
sp30 = Rand_ZeroOne() * sp3C->home.rot.z;
@@ -760,10 +760,10 @@ void func_8091EFE8(Actor* thisx, PlayState* play) {
}
this->actor.velocity.y *= 0.8f;
- if ((this->actor.speedXZ * 1.5f) + 1.0f > 4.8f) {
+ if ((this->actor.speed * 1.5f) + 1.0f > 4.8f) {
this->skelAnime.playSpeed = 4.8f;
} else {
- this->skelAnime.playSpeed = (this->actor.speedXZ * 1.5f) + 1.0f;
+ this->skelAnime.playSpeed = (this->actor.speed * 1.5f) + 1.0f;
}
}
@@ -771,7 +771,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;
@@ -804,7 +804,7 @@ void func_8091F3BC(Actor* thisx, PlayState* play) {
func_8091DD48(this);
Math_StepToF(&this->actor.world.pos.y, this->actor.home.pos.y, 2.0f);
- Math_SmoothStepToF(&this->actor.speedXZ, sp3C->x, sp3C->y, sp3C->z, 0.0f);
+ Math_SmoothStepToF(&this->actor.speed, sp3C->x, sp3C->y, sp3C->z, 0.0f);
this->unk_24C = 0.0f;
if (func_8091D630(&this->actor.world.pos, &this->actor.home.pos) > SQ(15.0f)) {
@@ -820,7 +820,7 @@ void func_8091F3BC(Actor* thisx, PlayState* play) {
phi_f0 = 0.0f;
}
- temp_f2 = this->actor.speedXZ + 0.4f + phi_f0;
+ temp_f2 = this->actor.speed + 0.4f + phi_f0;
this->skelAnime.playSpeed = CLAMP(temp_f2, 0.5f, 1.6f);
if (this->unk_240 <= 0) {
@@ -855,7 +855,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;
@@ -863,7 +863,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)) {
@@ -887,7 +887,7 @@ void func_8091F5A4(Actor* thisx, PlayState* play) {
func_8091D904(this);
} else if (func_8091DDF4(this, play)) {
- Actor_PickUp(&this->actor, play, GI_MAX, 80.0f, 25.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_MAX, 80.0f, 25.0f);
}
}
}
@@ -947,7 +947,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..e0837779d 100644
--- a/src/overlays/actors/ovl_En_Fish/z_en_fish.h
+++ b/src/overlays/actors/ovl_En_Fish/z_en_fish.h
@@ -2,31 +2,34 @@
#define Z_EN_FISH_H
#include "global.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
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;
+
+#define FISH_PARAMS(param) (param)
typedef struct EnFish {
/* 0x000 */ Actor actor;
/* 0x144 */ ColliderJntSph collider;
/* 0x164 */ ColliderJntSphElement colliderElements[1];
/* 0x1A4 */ SkelAnime skelAnime;
- /* 0x1E8 */ Vec3s jointTable[7];
- /* 0x212 */ Vec3s morphTable[7];
+ /* 0x1E8 */ Vec3s jointTable[FISH_LIMB_MAX];
+ /* 0x212 */ Vec3s morphTable[FISH_LIMB_MAX];
/* 0x23C */ EnFishUnkFunc unkFunc;
/* 0x240 */ s16 unk_240;
/* 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 c7dd18369..645ad7300 100644
--- a/src/overlays/actors/ovl_En_Fish2/z_en_fish2.c
+++ b/src/overlays/actors/ovl_En_Fish2/z_en_fish2.c
@@ -8,9 +8,8 @@
#include "overlays/actors/ovl_En_Mushi2/z_en_mushi2.h"
#include "z_en_fish2.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#include "objects/object_fb/object_fb.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnFish2*)thisx)
@@ -44,7 +43,7 @@ void func_80B2B180(EnFish2* this, PlayState* play);
static s32 D_80B2B2E0 = 0;
static s32 D_80B2B2E4 = 0;
-static s32 D_80B2B2E8 = 0;
+static s32 D_80B2B2E8 = false;
static s32 D_80B2B2EC = 0;
static s32 D_80B2B2F0 = 0;
static Actor* D_80B2B2F4 = NULL;
@@ -102,29 +101,51 @@ static ColliderJntSphInit sJntSphInit = {
static f32 D_80B2B370[] = { 0.01f, 0.012f, 0.014f, 0.017f };
static f32 D_80B2B380[] = { 0.019f, 0.033f };
-void func_80B28370(EnFish2* this, s32 arg0) {
- static AnimationHeader* D_80B2B388[] = {
- &object_fb_Anim_0013AC, &object_fb_Anim_0007D4, &object_fb_Anim_0006D8,
- &object_fb_Anim_0006D8, &object_fb_Anim_001174, &object_fb_Anim_000ACC,
- };
- static u8 D_80B2B3A0[] = {
- ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_ONCE, ANIMMODE_ONCE, ANIMMODE_ONCE,
- };
- f32 sp34;
+typedef enum {
+ /* 0 */ FISH2_ANIM_0,
+ /* 1 */ FISH2_ANIM_1,
+ /* 2 */ FISH2_ANIM_2,
+ /* 3 */ FISH2_ANIM_3,
+ /* 4 */ FISH2_ANIM_4,
+ /* 5 */ FISH2_ANIM_5,
+ /* 6 */ FISH2_ANIM_MAX
+} Fish2Animation;
- this->unk_2AC = arg0;
- this->unk_2CC = Animation_GetLastFrame(&D_80B2B388[arg0]->common);
- sp34 = 0.0f;
- if (this->unk_2AC == 3) {
- sp34 = Animation_GetLastFrame(&D_80B2B388[this->unk_2AC]->common) - 21.0f;
+static AnimationHeader* sAnimations[FISH2_ANIM_MAX] = {
+ &object_fb_Anim_0013AC, // FISH2_ANIM_0
+ &object_fb_Anim_0007D4, // FISH2_ANIM_1
+ &object_fb_Anim_0006D8, // FISH2_ANIM_2
+ &object_fb_Anim_0006D8, // FISH2_ANIM_3
+ &object_fb_Anim_001174, // FISH2_ANIM_4
+ &object_fb_Anim_000ACC, // FISH2_ANIM_5
+};
+
+static u8 sAnimationModes[FISH2_ANIM_MAX] = {
+ ANIMMODE_LOOP, // FISH2_ANIM_0
+ ANIMMODE_LOOP, // FISH2_ANIM_1
+ ANIMMODE_ONCE, // FISH2_ANIM_2
+ ANIMMODE_ONCE, // FISH2_ANIM_3
+ ANIMMODE_ONCE, // FISH2_ANIM_4
+ ANIMMODE_ONCE, // FISH2_ANIM_5
+};
+
+void EnFish2_ChangeAnim(EnFish2* this, s32 animIndex) {
+ f32 startFrame;
+
+ this->animIndex = animIndex;
+ this->animEndFrame = Animation_GetLastFrame(&sAnimations[animIndex]->common);
+
+ startFrame = 0.0f;
+ if (this->animIndex == FISH2_ANIM_3) {
+ startFrame = Animation_GetLastFrame(&sAnimations[this->animIndex]->common) - 21.0f;
}
- if (this->unk_2AC == 2) {
- this->unk_2CC = Animation_GetLastFrame(&D_80B2B388[this->unk_2AC]->common) - 21.0f;
+ if (this->animIndex == FISH2_ANIM_2) {
+ this->animEndFrame = Animation_GetLastFrame(&sAnimations[this->animIndex]->common) - 21.0f;
}
- Animation_Change(&this->skelAnime, D_80B2B388[this->unk_2AC], 1.0f, sp34, this->unk_2CC, D_80B2B3A0[this->unk_2AC],
- -10.0f);
+ Animation_Change(&this->skelAnime, sAnimations[this->animIndex], 1.0f, startFrame, this->animEndFrame,
+ sAnimationModes[this->animIndex], -10.0f);
}
s32 func_80B28478(EnFish2* this) {
@@ -151,7 +172,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;
@@ -160,7 +181,7 @@ void EnFish2_Init(Actor* thisx, PlayState* play) {
if (this->actor.params == 0) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 20.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &object_fb_Skel_006190, &object_fb_Anim_0013AC, this->jointTable,
- this->morphTable, 24);
+ this->morphTable, OBJECT_FB_LIMB_MAX);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
if (this->unk_344 == 0) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_81_10)) {
@@ -187,12 +208,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);
@@ -211,7 +232,7 @@ void EnFish2_Init(Actor* thisx, PlayState* play) {
} else if (this->actor.params != 0) {
this->unk_2B4 = 10;
this->actor.draw = NULL;
- this->actor.flags |= ACTOR_FLAG_8000000;
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
this->actionFunc = func_80B2A01C;
}
}
@@ -235,7 +256,7 @@ void func_80B287F4(EnFish2* this, s32 arg1) {
if (arg1 == 0) {
this->unk_338 = 410.0f - this->unk_2C4;
}
- Math_ApproachF(&this->unk_350->speedXZ, (D_80B2B380[0] - this->unk_330) * this->unk_338, 0.1f, 0.4f);
+ Math_ApproachF(&this->unk_350->speed, (D_80B2B380[0] - this->unk_330) * this->unk_338, 0.1f, 0.4f);
}
Math_Vec3f_Copy(&sp2C, &this->unk_350->world.pos);
this->unk_34A = Math_Vec3f_Yaw(&this->actor.world.pos, &sp2C);
@@ -309,7 +330,7 @@ void func_80B289DC(EnFish2* this, PlayState* play) {
}
void func_80B28B5C(EnFish2* this) {
- func_80B28370(this, 0);
+ EnFish2_ChangeAnim(this, FISH2_ANIM_0);
this->unk_2B4 = 0;
this->unk_348 = 0;
this->unk_2C4 = 0;
@@ -352,7 +373,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) {
@@ -377,17 +398,17 @@ void func_80B28C14(EnFish2* this, PlayState* play) {
}
if (this->unk_2B4 == 0) {
- Math_ApproachF(&this->actor.speedXZ, (D_80B2B380[0] - this->unk_330) * 400.0f, 0.3f, 0.3f);
- if (this->actor.speedXZ > 3.0f) {
- this->actor.speedXZ = 3.0f;
- } else if (this->actor.speedXZ < 1.5f) {
- this->actor.speedXZ = 1.5f;
+ Math_ApproachF(&this->actor.speed, (D_80B2B380[0] - this->unk_330) * 400.0f, 0.3f, 0.3f);
+ if (this->actor.speed > 3.0f) {
+ this->actor.speed = 3.0f;
+ } else if (this->actor.speed < 1.5f) {
+ this->actor.speed = 1.5f;
}
} else {
- Math_ApproachZeroF(&this->actor.speedXZ, 0.3f, 0.3f);
+ Math_ApproachZeroF(&this->actor.speed, 0.3f, 0.3f);
}
- if ((D_80B2B2E8 == 0) && (D_80B2B2E0 != 2)) {
+ if (!D_80B2B2E8 && (D_80B2B2E0 != 2)) {
while (itemAction != NULL) {
if ((itemAction->id != ACTOR_EN_FISH) && (itemAction->id != ACTOR_EN_MUSHI2)) {
itemAction = itemAction->next;
@@ -404,7 +425,7 @@ void func_80B28C14(EnFish2* this, PlayState* play) {
} else if ((itemAction->update != NULL) && (itemAction->params == 0) &&
(fabsf(itemAction->world.pos.x - this->actor.world.pos.x) < 100.0f) &&
(fabsf(itemAction->world.pos.z - this->actor.world.pos.z) < 100.0f) &&
- (itemAction->bgCheckFlags & 0x20)) {
+ (itemAction->bgCheckFlags & BGCHECKFLAG_WATER)) {
this->unk_350 = itemAction;
if (D_80B2B2E0 == 0) {
EnFish2* fish;
@@ -416,7 +437,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;
}
}
@@ -426,7 +447,7 @@ void func_80B28C14(EnFish2* this, PlayState* play) {
itemAction = itemAction->next;
}
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
}
@@ -436,7 +457,7 @@ void func_80B29128(EnFish2* this) {
void func_80B2913C(EnFish2* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_80B28B5C(this);
}
}
@@ -448,7 +469,7 @@ void func_80B29194(EnFish2* this) {
}
this->unk_2C4 = 0;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->unk_2C8 == 0) {
this->unk_34C = 400;
Math_Vec3f_Copy(&this->actor.world.pos, &this->unk_324);
@@ -457,18 +478,18 @@ void func_80B29194(EnFish2* this) {
this->unk_34A = 0;
this->unk_340 = (s32)Rand_ZeroOne() & 1;
- func_80B28370(this, 1);
+ EnFish2_ChangeAnim(this, FISH2_ANIM_1);
this->actionFunc = func_80B29250;
}
void func_80B29250(EnFish2* this, PlayState* play) {
if (!func_80B28478(this)) {
- Math_ApproachF(&this->actor.speedXZ, (D_80B2B380[0] - this->unk_330) * 1000.0f, 0.3f, 0.3f);
+ Math_ApproachF(&this->actor.speed, (D_80B2B380[0] - this->unk_330) * 1000.0f, 0.3f, 0.3f);
- if (this->actor.speedXZ > 4.0f) {
- this->actor.speedXZ = 4.0f;
- } else if (this->actor.speedXZ < 2.0f) {
- this->actor.speedXZ = 2.0f;
+ if (this->actor.speed > 4.0f) {
+ this->actor.speed = 4.0f;
+ } else if (this->actor.speed < 2.0f) {
+ this->actor.speed = 2.0f;
}
func_80B287F4(this, 0);
@@ -482,26 +503,26 @@ void func_80B29250(EnFish2* this, PlayState* play) {
}
void func_80B2938C(EnFish2* this) {
- func_80B28370(this, 5);
+ EnFish2_ChangeAnim(this, FISH2_ANIM_5);
this->unk_348 = 0;
this->actionFunc = func_80B293C4;
}
void func_80B293C4(EnFish2* this, PlayState* play) {
- f32 currentFrame = this->skelAnime.curFrame;
+ f32 curFrame = this->skelAnime.curFrame;
- if (func_80B28478(this) == 0) {
+ if (!func_80B28478(this)) {
func_80B287F4(this, 1);
- Math_ApproachF(&this->actor.speedXZ, (*D_80B2B380 - this->unk_330) * 1000.0f, 0.3f, 0.3f);
+ Math_ApproachF(&this->actor.speed, (*D_80B2B380 - this->unk_330) * 1000.0f, 0.3f, 0.3f);
- if (this->actor.speedXZ > 3.0f) {
- this->actor.speedXZ = 3.0f;
- } else if (this->actor.speedXZ < 1.0f) {
- this->actor.speedXZ = 1.0f;
+ if (this->actor.speed > 3.0f) {
+ this->actor.speed = 3.0f;
+ } else if (this->actor.speed < 1.0f) {
+ this->actor.speed = 1.0f;
}
- if (this->unk_2CC <= currentFrame) {
- func_80B28370(this, 1);
+ if (curFrame >= this->animEndFrame) {
+ EnFish2_ChangeAnim(this, FISH2_ANIM_1);
if (this->unk_2B0 == 0) {
this->actionFunc = func_80B29250;
} else {
@@ -526,34 +547,34 @@ void func_80B2951C(EnFish2* this) {
}
this->unk_2B4 = 10;
- this->actor.speedXZ = 3.0f;
+ this->actor.speed = 3.0f;
Actor_Kill(this->unk_350);
this->unk_350 = NULL;
D_80B2B2F4 = &this->actor;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DODO_M_EAT);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DODO_M_EAT);
this->actionFunc = func_80B295A4;
}
void func_80B295A4(EnFish2* this, PlayState* play) {
s32 i;
- f32 currentFrame = this->skelAnime.curFrame;
+ f32 curFrame = this->skelAnime.curFrame;
s32 pad;
Vec3f sp60;
SkelAnime_Update(&this->skelAnime);
Math_SmoothStepToS(&this->actor.world.rot.y, Math_Vec3f_Yaw(&this->actor.world.pos, &play->view.eye), 1, 0x1388, 0);
- Math_ApproachZeroF(&this->actor.speedXZ, 0.3f, 0.3f);
+ 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);
}
- } else if (this->unk_2CC <= currentFrame) {
- if (this->unk_2AC != 5) {
- func_80B28370(this, 5);
+ } else if (curFrame >= this->animEndFrame) {
+ if (this->animIndex != FISH2_ANIM_5) {
+ EnFish2_ChangeAnim(this, FISH2_ANIM_5);
} else if (this->unk_2C8 == 0) {
func_80B29778(this);
} else {
@@ -566,7 +587,7 @@ void func_80B295A4(EnFish2* this, PlayState* play) {
}
void func_80B29778(EnFish2* this) {
- func_80B28370(this, 0);
+ EnFish2_ChangeAnim(this, FISH2_ANIM_0);
this->unk_2B4 = 0;
this->unk_2C4 = 0;
this->unk_2B6 = this->unk_2B4;
@@ -576,7 +597,7 @@ void func_80B29778(EnFish2* this) {
}
this->actionFunc = func_80B297FC;
this->unk_324.y = this->unk_2D4;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
void func_80B297FC(EnFish2* this, PlayState* play) {
@@ -605,7 +626,7 @@ void func_80B297FC(EnFish2* this, PlayState* play) {
if ((fabsf(this->actor.world.pos.x - this->unk_324.x) < 2.0f) &&
(this->actor.world.pos.y < (this->unk_2D4 + 3.0f)) &&
(fabsf(this->actor.world.pos.z - this->unk_324.z) < 2.0f)) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->unk_34A = BINANG_ROT180(this->actor.home.rot.y);
this->unk_2C4++;
this->actor.velocity.y = 0.0f;
@@ -638,19 +659,19 @@ void func_80B297FC(EnFish2* this, PlayState* play) {
}
this->unk_2B6 = 4;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_FISH_GROW_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FISH_GROW_UP);
this->unk_2C4++;
}
break;
case 2:
phi_f0 = 0.1f;
-
+ // fallthrough
case 4:
if (phi_f0 == 0) {
phi_f0 = 0.3f;
}
-
+ // fallthrough
case 6:
if (phi_f0 == 0) {
phi_f0 = 0.5f;
@@ -676,12 +697,12 @@ void func_80B297FC(EnFish2* this, PlayState* play) {
case 3:
phi_f0 = 1.3f;
-
+ // fallthrough
case 5:
if (phi_f0 == 0) {
phi_f0 = 1.5f;
}
-
+ // fallthrough
case 7:
if (phi_f0 == 0) {
phi_f0 = 1.7f;
@@ -754,7 +775,7 @@ void func_80B29E5C(EnFish2* this, PlayState* play) {
if (&this->actor != prop) {
this->unk_350 = prop;
this->unk_2B0 = D_80B2B2E8 = 1;
- func_80B28370(this, 0);
+ EnFish2_ChangeAnim(this, FISH2_ANIM_0);
this->actionFunc = func_80B29EE4;
break;
}
@@ -770,8 +791,8 @@ void func_80B29EE4(EnFish2* this, PlayState* play) {
this->unk_2C4++;
}
this->unk_338 = 410.0f - this->unk_2C4;
- Math_ApproachF(&this->actor.speedXZ, 2.0f, 0.3f, 0.3f);
- Math_ApproachF(&this->unk_350->speedXZ, (D_80B2B380[0] - this->unk_330) * this->unk_338, 0.1f, 0.4f);
+ Math_ApproachF(&this->actor.speed, 2.0f, 0.3f, 0.3f);
+ Math_ApproachF(&this->unk_350->speed, (D_80B2B380[0] - this->unk_330) * this->unk_338, 0.1f, 0.4f);
func_80B289DC(this, play);
Math_Vec3f_Copy(&sp2C, &this->unk_350->world.pos);
this->unk_34A = Math_Vec3f_Yaw(&this->actor.world.pos, &sp2C);
@@ -784,11 +805,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 +822,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,13 +883,13 @@ 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);
}
}
void func_80B2A448(EnFish2* this) {
- func_80B28370(this, 4);
+ EnFish2_ChangeAnim(this, FISH2_ANIM_4);
this->unk_2B4 = 0;
this->unk_2C4 = 0;
this->unk_2B6 = this->unk_2B4;
@@ -877,19 +898,19 @@ void func_80B2A448(EnFish2* this) {
}
void func_80B2A498(EnFish2* this, PlayState* play) {
- f32 currentFrame = this->skelAnime.curFrame;
+ f32 curFrame = this->skelAnime.curFrame;
Vec3f sp80;
- if ((this->unk_2AC == 4) && Animation_OnFrame(&this->skelAnime, 13.0f)) {
+ if ((this->animIndex == FISH2_ANIM_4) && Animation_OnFrame(&this->skelAnime, 13.0f)) {
Actor* temp_v0;
Math_Vec3f_Copy(&sp80, &this->unk_318);
temp_v0 = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_COL_MAN, sp80.x, sp80.y, sp80.z, 0,
this->actor.world.rot.y, 0, 0);
if (temp_v0 != NULL) {
- temp_v0->speedXZ = 4.0f;
+ temp_v0->speed = 4.0f;
temp_v0->velocity.y = 15.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_PIECE_OF_HEART);
+ Actor_PlaySfx(&this->actor, NA_SE_SY_PIECE_OF_HEART);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_81_10);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_81_20);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_81_40);
@@ -899,7 +920,7 @@ void func_80B2A498(EnFish2* this, PlayState* play) {
}
}
- if ((this->unk_2AC == 4) &&
+ if ((this->animIndex == FISH2_ANIM_4) &&
(Animation_OnFrame(&this->skelAnime, 13.0f) || Animation_OnFrame(&this->skelAnime, 31.0f))) {
WaterBox* sp78;
@@ -912,20 +933,20 @@ 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);
}
}
}
- if ((this->unk_2CC <= currentFrame) && (this->unk_2AC == 4)) {
+ if ((curFrame >= this->animEndFrame) && (this->animIndex == FISH2_ANIM_4)) {
D_80B2B2E0 = 0;
D_80B2B2E4 = 3;
this->actor.world.pos.x = this->unk_324.x;
this->actor.world.pos.z = this->unk_324.z;
- func_80B28370(this, 0);
+ EnFish2_ChangeAnim(this, FISH2_ANIM_0);
}
}
@@ -970,11 +991,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 +1008,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);
@@ -1003,7 +1025,7 @@ void EnFish2_Update(Actor* thisx, PlayState* play2) {
}
}
- if ((D_80B2B2E8 == 0) && (this->actionFunc == func_80B28C14)) {
+ if (!D_80B2B2E8 && (this->actionFunc == func_80B28C14)) {
s32 temp_s0_2 = this->unk_344 * 2;
f32 phi_f2 = 0.0f;
f32 phi_f20 = 0;
@@ -1028,7 +1050,7 @@ void EnFish2_Update(Actor* thisx, PlayState* play2) {
}
}
- if (D_80B2B2E8 == 0) {
+ if (!D_80B2B2E8) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
}
}
@@ -1038,7 +1060,7 @@ void EnFish2_Update(Actor* thisx, PlayState* play2) {
s32 EnFish2_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnFish2* this = THIS;
- if ((limbIndex == 20) || (limbIndex == 21)) {
+ if ((limbIndex == OBJECT_FB_LIMB_14) || (limbIndex == OBJECT_FB_LIMB_15)) {
*dList = NULL;
}
@@ -1049,7 +1071,7 @@ void EnFish2_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* ro
EnFish2* this = THIS;
s32 pad;
- if ((limbIndex == 20) || (limbIndex == 21)) {
+ if ((limbIndex == OBJECT_FB_LIMB_14) || (limbIndex == OBJECT_FB_LIMB_15)) {
OPEN_DISPS(play->state.gfxCtx);
Matrix_Push();
@@ -1063,11 +1085,11 @@ void EnFish2_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* ro
CLOSE_DISPS(play->state.gfxCtx);
}
- if (limbIndex == 14) {
+ if (limbIndex == OBJECT_FB_LIMB_0E) {
Matrix_MultVec3f(&gZeroVec3f, &this->unk_318);
}
- if (limbIndex == 17) {
+ if (limbIndex == OBJECT_FB_LIMB_11) {
Matrix_MultVec3f(&gZeroVec3f, &this->unk_300);
}
@@ -1077,8 +1099,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 +1123,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 +1178,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..a324e0bab 100644
--- a/src/overlays/actors/ovl_En_Fish2/z_en_fish2.h
+++ b/src/overlays/actors/ovl_En_Fish2/z_en_fish2.h
@@ -2,6 +2,7 @@
#define Z_EN_FISH2_H
#include "global.h"
+#include "objects/object_fb/object_fb.h"
struct EnFish2;
@@ -18,46 +19,46 @@ typedef struct {
} EnFish2UnkStruct; // size = 0x24
typedef struct EnFish2 {
- /* 0x0000 */ Actor actor;
- /* 0x0144 */ SkelAnime skelAnime;
- /* 0x0188 */ Vec3s jointTable[24];
- /* 0x0218 */ Vec3s morphTable[24];
- /* 0x02A8 */ EnFish2ActionFunc actionFunc;
- /* 0x02AC */ s32 unk_2AC;
- /* 0x02B0 */ s32 unk_2B0;
- /* 0x02B4 */ s16 unk_2B4;
- /* 0x02B6 */ s16 unk_2B6;
- /* 0x02B8 */ s16 unk_2B8;
- /* 0x02BA */ s16 unk_2BA[3];
- /* 0x02C0 */ s32 unk_2C0;
- /* 0x02C4 */ s32 unk_2C4;
- /* 0x02C8 */ u8 unk_2C8;
- /* 0x02CA */ s16 subCamId;
- /* 0x02CC */ f32 unk_2CC;
- /* 0x02D0 */ UNK_TYPE1 unk_2D0[0x4];
- /* 0x02D4 */ f32 unk_2D4;
- /* 0x02D8 */ f32 unk_2D8;
- /* 0x02DC */ Vec3f subCamEye;
- /* 0x02E8 */ Vec3f subCamAt;
- /* 0x02F4 */ Vec3f unk_2F4;
- /* 0x0300 */ Vec3f unk_300;
- /* 0x030C */ Vec3f unk_30C;
- /* 0x0318 */ Vec3f unk_318;
- /* 0x0324 */ Vec3f unk_324;
- /* 0x0330 */ f32 unk_330;
- /* 0x0334 */ f32 unk_334;
- /* 0x0338 */ f32 unk_338;
- /* 0x033C */ f32 unk_33C;
- /* 0x0340 */ s32 unk_340;
- /* 0x0344 */ s32 unk_344;
- /* 0x0348 */ s16 unk_348;
- /* 0x034A */ s16 unk_34A;
- /* 0x034C */ s16 unk_34C;
- /* 0x0350 */ Actor* unk_350;
- /* 0x0354 */ struct EnFish2* unk_354;
- /* 0x0358 */ ColliderJntSph collider;
- /* 0x0378 */ ColliderJntSphElement colliderElements[2];
- /* 0x03F8 */ EnFish2UnkStruct unk_3F8[200];
+ /* 0x000 */ Actor actor;
+ /* 0x144 */ SkelAnime skelAnime;
+ /* 0x188 */ Vec3s jointTable[OBJECT_FB_LIMB_MAX];
+ /* 0x218 */ Vec3s morphTable[OBJECT_FB_LIMB_MAX];
+ /* 0x2A8 */ EnFish2ActionFunc actionFunc;
+ /* 0x2AC */ s32 animIndex;
+ /* 0x2B0 */ s32 unk_2B0;
+ /* 0x2B4 */ s16 unk_2B4;
+ /* 0x2B6 */ s16 unk_2B6;
+ /* 0x2B8 */ s16 unk_2B8;
+ /* 0x2BA */ s16 csIdList[3];
+ /* 0x2C0 */ s32 unk_2C0;
+ /* 0x2C4 */ s32 unk_2C4;
+ /* 0x2C8 */ u8 unk_2C8;
+ /* 0x2CA */ s16 subCamId;
+ /* 0x2CC */ f32 animEndFrame;
+ /* 0x2D0 */ UNK_TYPE1 unk_2D0[0x4];
+ /* 0x2D4 */ f32 unk_2D4;
+ /* 0x2D8 */ f32 unk_2D8;
+ /* 0x2DC */ Vec3f subCamEye;
+ /* 0x2E8 */ Vec3f subCamAt;
+ /* 0x2F4 */ Vec3f unk_2F4;
+ /* 0x300 */ Vec3f unk_300;
+ /* 0x30C */ Vec3f unk_30C;
+ /* 0x318 */ Vec3f unk_318;
+ /* 0x324 */ Vec3f unk_324;
+ /* 0x330 */ f32 unk_330;
+ /* 0x334 */ f32 unk_334;
+ /* 0x338 */ f32 unk_338;
+ /* 0x33C */ f32 unk_33C;
+ /* 0x340 */ s32 unk_340;
+ /* 0x344 */ s32 unk_344;
+ /* 0x348 */ s16 unk_348;
+ /* 0x34A */ s16 unk_34A;
+ /* 0x34C */ s16 unk_34C;
+ /* 0x350 */ Actor* unk_350;
+ /* 0x354 */ struct EnFish2* unk_354;
+ /* 0x358 */ ColliderJntSph collider;
+ /* 0x378 */ ColliderJntSphElement colliderElements[2];
+ /* 0x3F8 */ EnFish2UnkStruct unk_3F8[200];
} EnFish2; // size = 0x2018
#endif // Z_EN_FISH2_H
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 a64e8a947..9e442b637 100644
--- a/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c
+++ b/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c
@@ -3,6 +3,7 @@
* Overlay: ovl_En_Fishing
* Description: Fishing Pond Elements (Owner, Fish, Props, Effects...)
*/
+
#include "prevent_bss_reordering.h"
#include "z_en_fishing.h"
#include "z64rumble.h"
@@ -25,24 +26,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 +74,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 +94,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
@@ -791,7 +792,7 @@ FishingFishInit sFishInits[] = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_U8(targetMode, 5, ICHAIN_CONTINUE),
+ ICHAIN_U8(targetMode, TARGET_MODE_5, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 0, ICHAIN_STOP),
};
@@ -831,11 +832,10 @@ void EnFishing_Init(Actor* thisx, PlayState* play2) {
thisx->focus.pos = thisx->world.pos;
thisx->focus.pos.y += 75.0f;
- thisx->flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ thisx->flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
if (sLinkAge != 1) {
- // HIGH_SCORE(HS_FISHING) from OoT
- if (gSaveContext.save.unk_EE4 & 0x1000) {
+ if (HIGH_SCORE(HS_FISHING) & 0x1000) {
D_8090CD08 = 0;
} else {
D_8090CD08 = 1;
@@ -850,21 +850,21 @@ void EnFishing_Init(Actor* thisx, PlayState* play2) {
D_809171FC = 0;
D_809171F6 = 10;
- Audio_QueueSeqCmd(0x100100FF);
+ 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 (HIGH_SCORE(HS_FISHING) & 0x7F) {
+ D_809171CC = HIGH_SCORE(HS_FISHING) & 0x7F;
} else {
D_809171CC = 40.0f;
}
- } else if (gSaveContext.save.unk_EE4 & 0x7F000000) {
- D_809171CC = (gSaveContext.save.unk_EE4 & 0x7F000000) >> 0x18;
+ } else if (HIGH_SCORE(HS_FISHING) & 0x7F000000) {
+ D_809171CC = (HIGH_SCORE(HS_FISHING) & 0x7F000000) >> 0x18;
} else {
D_809171CC = 45.0f;
}
- D_809171D1 = (gSaveContext.save.unk_EE4 & 0xFF0000) >> 0x10;
+ D_809171D1 = (HIGH_SCORE(HS_FISHING) & 0xFF0000) >> 0x10;
if ((D_809171D1 & 7) == 7) {
play->roomCtx.unk7A[0] = 90;
D_809171CA = 1;
@@ -945,11 +945,11 @@ void EnFishing_Init(Actor* thisx, PlayState* play2) {
return;
}
- thisx->bgCheckFlags |= 0x800; // Added in MM
+ thisx->bgCheckFlags |= BGCHECKFLAG_PLAYER_800; // Added in MM
if ((thisx->params < 115) || (thisx->params == 200)) {
- SkelAnime_InitFlex(play, &this->skelAnime, &gFishingFishSkel, &gFishingFishAnim, NULL, NULL, 0);
- Animation_MorphToLoop(&this->skelAnime, &gFishingFishAnim, 0.0f);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gFishingBassSkel, &gFishingBassAnim, NULL, NULL, 0);
+ Animation_MorphToLoop(&this->skelAnime, &gFishingBassAnim, 0.0f);
} else {
SkelAnime_InitFlex(play, &this->skelAnime, &gFishingLoachSkel, &gFishingLoachAnim, NULL, NULL, 0);
Animation_MorphToLoop(&this->skelAnime, &gFishingLoachAnim, 0.0f);
@@ -960,8 +960,8 @@ void EnFishing_Init(Actor* thisx, PlayState* play2) {
if (thisx->params == 200) {
this->unk_150 = 100;
func_800BC154(play, &play->actorCtx, thisx, ACTORCAT_PROP);
- thisx->targetMode = 0;
- thisx->flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ thisx->targetMode = TARGET_MODE_0;
+ thisx->flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
this->lightNode = LightContext_InsertLight(play, &play->lightCtx, &this->lightInfo);
} else {
this->unk_150 = 10;
@@ -1130,7 +1130,7 @@ void EnFishing_UpdateEffects(FishingEffect* effect, PlayState* play) {
if ((effect->unk_2C >= 100) && (Message_GetState(&play->msgCtx) == TEXT_STATE_5)) {
if (Message_ShouldAdvance(play) || (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
Rupees_ChangeBy(-50);
effect->unk_2C = -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);
@@ -1573,7 +1573,7 @@ void EnFishing_DrawLureHook(PlayState* play, Vec3f* pos, Vec3f* refPos, u8 hookI
Matrix_Translate(pos->x, pos->y, pos->z, MTXMODE_NEW);
- if ((player->actor.speedXZ == 0.0f) && (D_809101B4 == 0.0f)) {
+ if ((player->actor.speed == 0.0f) && (D_809101B4 == 0.0f)) {
Math_ApproachF(&sLureHookRotY[hookIndex], ry, 0.1f, 0.3f);
} else {
sLureHookRotY[hookIndex] = ry;
@@ -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;
@@ -1784,7 +1784,7 @@ void EnFishing_DrawLureAndLine(PlayState* play, Vec3f* linePos, Vec3f* lineRot)
sLurePos = sReelLinePos[LINE_SEG_COUNT - 1];
sLureRot.x = sReelLineRot[LINE_SEG_COUNT - 2].x + M_PI;
- if ((player->actor.speedXZ == 0.0f) && (D_80917200 == 0)) {
+ if ((player->actor.speed == 0.0f) && (D_80917200 == 0)) {
Math_ApproachF(&sLureRot.y, sReelLineRot[LINE_SEG_COUNT - 2].y, 0.1f, 0.2f);
} else {
sLureRot.y = sReelLineRot[LINE_SEG_COUNT - 2].y;
@@ -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);
@@ -2159,7 +2159,7 @@ void EnFishing_UpdateLure(EnFishing* this, PlayState* play) {
if (D_80917204 == 0) {
if ((D_80917200 == 0) && (player->unk_B28 == 1)) {
D_80917204 = 37;
- func_801477B4(play);
+ Message_CloseTextbox(play);
}
} else {
sLureRot.x = sReelLineRot[LINE_SEG_COUNT - 2].x + M_PI;
@@ -2181,7 +2181,7 @@ void EnFishing_UpdateLure(EnFishing* this, PlayState* play) {
D_8091726C = 0.5f;
D_80917268 = Rand_ZeroFloat(1.9f);
sFishMouthOffset.y = 500.0f;
- Audio_PlaySfxAtPos(&D_8090D614, NA_SE_IT_SWORD_SWING_HARD);
+ Audio_PlaySfx_AtPos(&D_8090D614, NA_SE_IT_SWORD_SWING_HARD);
}
}
break;
@@ -2201,7 +2201,7 @@ void EnFishing_UpdateLure(EnFishing* this, PlayState* play) {
D_80917238.x *= 0.9f;
D_80917238.z *= 0.9f;
if (D_8090CD0C == 0) {
- play_sound(NA_SE_IT_FISHING_REEL_HIGH - SFX_FLAG);
+ Audio_PlaySfx(NA_SE_IT_FISHING_REEL_HIGH - SFX_FLAG);
}
}
@@ -2230,13 +2230,14 @@ 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 & 0x10) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_CEILING) {
D_80917238.y = -0.5f;
}
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
if (D_80917238.y > 0.0f) {
D_80917238.y = 0.0f;
}
@@ -2257,8 +2258,8 @@ void EnFishing_UpdateLure(EnFishing* this, PlayState* play) {
D_809101D0 = 0.0;
} else {
Math_ApproachF(&D_809101C4, 0.0f, 1.0f, 0.05f);
- Audio_PlaySfxAtPos(&D_8090D614,
- NA_SE_EN_WIZ_UNARI - SFX_FLAG); // changed from NA_SE_EN_FANTOM_FLOAT in OoT
+ Audio_PlaySfx_AtPos(&D_8090D614,
+ NA_SE_EN_WIZ_UNARI - SFX_FLAG); // changed from NA_SE_EN_FANTOM_FLOAT in OoT
}
} else {
f32 sp7C = WATER_SURFACE_Y(play);
@@ -2277,7 +2278,7 @@ void EnFishing_UpdateLure(EnFishing* this, PlayState* play) {
if ((sLurePos.y <= sp7C) && (sp7C < spE0) && (sp7C == WATER_SURFACE_Y(play))) {
D_80917264 = 10;
- Audio_PlaySfxAtPos(&D_8090D614, NA_SE_EV_BOMB_DROP_WATER);
+ Audio_PlaySfx_AtPos(&D_8090D614, NA_SE_EV_BOMB_DROP_WATER);
D_80917248.y = 0.0f;
D_80917238.y *= 0.2f;
@@ -2303,8 +2304,8 @@ void EnFishing_UpdateLure(EnFishing* this, PlayState* play) {
}
} else {
Math_ApproachZeroF(&D_809101C4, 1.0f, 0.05f);
- Audio_PlaySfxAtPos(&D_8090D614,
- NA_SE_EN_WIZ_UNARI - SFX_FLAG); // changed from NA_SE_EN_FANTOM_FLOAT in OoT
+ Audio_PlaySfx_AtPos(&D_8090D614,
+ NA_SE_EN_WIZ_UNARI - SFX_FLAG); // changed from NA_SE_EN_FANTOM_FLOAT in OoT
}
}
@@ -2408,7 +2409,7 @@ void EnFishing_UpdateLure(EnFishing* this, PlayState* play) {
D_8091725C = 0.5f;
D_809101C0 += (fabsf(sp70) * 7.5f);
- func_8019FAD8(&D_8090D614, NA_SE_EV_LURE_MOVE_W, (sp70 * 1.999f * 0.25f) + 0.75f);
+ Audio_PlaySfx_AtPosWithFreq(&D_8090D614, NA_SE_EV_LURE_MOVE_W, (sp70 * 1.999f * 0.25f) + 0.75f);
if (D_80917206 == 2) {
D_80917278.y = 5.0f * sp70;
@@ -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_PlaySfx_AtPos(&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;
@@ -2529,11 +2531,11 @@ void EnFishing_UpdateLure(EnFishing* this, PlayState* play) {
if (CHECK_BTN_ALL(input->cur.button, BTN_A)) {
if (CHECK_BTN_ALL(input->cur.button, BTN_R)) {
D_809101C0 += 1.5f;
- play_sound(NA_SE_IT_FISHING_REEL_HIGH - SFX_FLAG);
+ Audio_PlaySfx(NA_SE_IT_FISHING_REEL_HIGH - SFX_FLAG);
Math_ApproachF(&D_809101D0, 1000.0f, 1.0f, 2.0f);
} else {
D_809101C0 += D_8091726C;
- play_sound(NA_SE_IT_FISHING_REEL_SLOW - SFX_FLAG);
+ Audio_PlaySfx(NA_SE_IT_FISHING_REEL_SLOW - SFX_FLAG);
Math_ApproachF(&D_809101D0, 1000.0f, 1.0f, 0.2f);
}
@@ -2590,7 +2592,7 @@ void EnFishing_UpdateLure(EnFishing* this, PlayState* play) {
} else {
D_809101C0 += D_8091726C;
}
- play_sound(NA_SE_IT_FISHING_REEL_SLOW - SFX_FLAG);
+ Audio_PlaySfx(NA_SE_IT_FISHING_REEL_SLOW - SFX_FLAG);
}
if ((D_809171FE & 0x1F) == 0) {
@@ -2609,6 +2611,9 @@ void EnFishing_UpdateLure(EnFishing* this, PlayState* play) {
sReelLinePos[LINE_SEG_COUNT - 1].z = sLurePos.z;
D_809101C4 = 2.0f;
break;
+
+ default:
+ break;
}
}
@@ -2713,7 +2718,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)) {
@@ -2788,13 +2793,13 @@ void func_80903C60(EnFishing* this, u8 arg1) {
}
}
- Actor_PlaySfxAtPos(&this->actor, sfxId);
+ Actor_PlaySfx(&this->actor, sfxId);
}
void EnFishing_HandleAquariumDialog(EnFishing* this, PlayState* play) {
if (sLinkAge == 1) {
- if (gSaveContext.save.unk_EE4 & 0x7F) {
- if (gSaveContext.save.unk_EE4 & 0x80) {
+ if (HIGH_SCORE(HS_FISHING) & 0x7F) {
+ if (HIGH_SCORE(HS_FISHING) & 0x80) {
this->actor.textId = 0x40B1;
} else {
this->actor.textId = 0x4089;
@@ -2802,8 +2807,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 (HIGH_SCORE(HS_FISHING) & 0x7F000000) {
+ if (HIGH_SCORE(HS_FISHING) & 0x80000000) {
this->actor.textId = 0x40B1;
} else {
this->actor.textId = 0x4089;
@@ -2814,17 +2819,17 @@ void EnFishing_HandleAquariumDialog(EnFishing* this, PlayState* play) {
if (this->unk_1CB == 0) {
if (this->unk_1CC == 0) {
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
D_8090CCF8 = D_809171CC;
this->unk_1CB = 1;
} else {
- func_800B863C(&this->actor, play);
+ Actor_OfferTalkNearColChkInfoCylinder(&this->actor, play);
}
} else {
this->unk_1CC--;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
} else if (Actor_TextboxIsClosing(&this->actor, play)) {
this->unk_1CB = 0;
@@ -2870,16 +2875,16 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
this->actor.uncullZoneScale = 50.0f;
if (this->unk_148 == 0) {
- sp118 = (player->actor.speedXZ * 0.15f) + 0.25f;
+ sp118 = (player->actor.speed * 0.15f) + 0.25f;
} else {
- sp118 = (player->actor.speedXZ * 0.3f) + 0.25f;
+ sp118 = (player->actor.speed * 0.3f) + 0.25f;
}
if ((D_80917200 != 0) || (sSubCamId != SUB_CAM_ID_DONE) ||
((player->actor.world.pos.z > 1150.0f) && (this->unk_150 != 100))) {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
} else {
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
if (D_8090CD14 != 0) {
if (D_80917202 == 0) {
this->actor.focus.pos = sLurePos;
@@ -3001,9 +3006,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);
}
@@ -3017,7 +3022,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
case 10:
this->unk_1AC = this->actor.home.pos;
- Math_ApproachF(&this->actor.speedXZ, 2.0f, 1.0f, 0.5f);
+ Math_ApproachF(&this->actor.speed, 2.0f, 1.0f, 0.5f);
Math_ApproachF(&this->unk_1A8, 4096.0f, 1.0f, 256.0f);
if (sp124 < 40.0f) {
@@ -3039,7 +3044,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
case 11:
this->unk_1AC = this->actor.home.pos;
- Math_ApproachF(&this->actor.speedXZ, 0.0f, 1.0f, 0.05f);
+ Math_ApproachF(&this->actor.speed, 0.0f, 1.0f, 0.05f);
Math_ApproachF(&this->unk_1A8, 0.0f, 1.0f, 256.0f);
if (sp124 >= 40.0f) {
@@ -3069,7 +3074,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
break;
case 0:
- Math_ApproachF(&this->actor.speedXZ, 1.0f, 1.0f, 0.05f);
+ Math_ApproachF(&this->actor.speed, 1.0f, 1.0f, 0.05f);
Math_ApproachF(&this->unk_1A8, 0.0f, 1.0f, 256.0f);
if (this->unk_172[0] == 0) {
@@ -3078,9 +3083,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;
}
@@ -3089,7 +3094,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
if (D_80917206 == 2) {
func_809038A4(this, input);
} else {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
break;
@@ -3106,14 +3111,14 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
if ((this->actor.xzDistToPlayer < (250.0f * sp118)) || (this->unk_172[1] != 0)) {
Math_ApproachF(&this->unk_1A8, 8192.0f, 1.0f, 768.0f);
- Math_ApproachF(&this->actor.speedXZ, 4.2f, 1.0f, 0.75);
+ Math_ApproachF(&this->actor.speed, 4.2f, 1.0f, 0.75);
this->unk_188 = 1.2f;
this->unk_18C = 4000.0f;
this->unk_172[0] = 20;
} else {
this->unk_188 = 1.0f;
this->unk_18C = 2000.0f;
- Math_ApproachF(&this->actor.speedXZ, 1.5f, 1.0f, 0.1f);
+ Math_ApproachF(&this->actor.speed, 1.5f, 1.0f, 0.1f);
}
if ((this->unk_172[0] == 0) || (sp124 < 50.0f)) {
@@ -3126,7 +3131,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
if (D_80917206 == 2) {
func_809038A4(this, input);
} else {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
}
break;
@@ -3135,26 +3140,26 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
Math_ApproachS(&this->unk_15E, 0, 0x14, 0x20);
if ((this->actor.xzDistToPlayer < (250.0f * sp118)) || (this->unk_172[1] != 0)) {
- Math_ApproachF(&this->actor.speedXZ, 3.0f, 1.0f, 0.75);
+ Math_ApproachF(&this->actor.speed, 3.0f, 1.0f, 0.75);
this->unk_188 = 1.0f;
this->unk_172[0] = 20;
this->unk_18C = 4000.0f;
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) {
this->unk_188 = 0.8f;
this->unk_18C = 1500.0f;
- Math_ApproachF(&this->actor.speedXZ, 1.0f, 1.0f, 0.1f);
+ Math_ApproachF(&this->actor.speed, 1.0f, 1.0f, 0.1f);
Math_ApproachF(&this->unk_1A8, 2048.0f, 1.0f, 128.0f);
} else {
this->unk_188 = 0.4f;
this->unk_18C = 500.0f;
- Math_ApproachZeroF(&this->actor.speedXZ, 1.0f, 0.02f);
+ Math_ApproachZeroF(&this->actor.speed, 1.0f, 0.02f);
Math_ApproachF(&this->unk_1A8, 0.0f, 1.0f, 256.0f);
}
@@ -3169,7 +3174,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
this->unk_1AC.z = Rand_ZeroFloat(50.0f);
}
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
break;
case -2:
@@ -3183,11 +3188,11 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
Math_ApproachS(&this->unk_15E, -0x1000, 0x14, 0x100);
if (this->actor.world.pos.y < (WATER_SURFACE_Y(play) - 20.0f)) {
- Math_ApproachF(&this->actor.speedXZ, 0.5f, 1.0f, 0.1f);
+ Math_ApproachF(&this->actor.speed, 0.5f, 1.0f, 0.1f);
} else {
- Math_ApproachZeroF(&this->actor.speedXZ, 1.0f, 0.01f);
+ Math_ApproachZeroF(&this->actor.speed, 1.0f, 0.01f);
- if ((this->actor.speedXZ == 0.0f) || (this->actor.world.pos.y > (WATER_SURFACE_Y(play) - 5.0f))) {
+ if ((this->actor.speed == 0.0f) || (this->actor.world.pos.y > (WATER_SURFACE_Y(play) - 5.0f))) {
this->unk_1AC.x = Rand_ZeroFloat(300.0f);
this->unk_1AC.z = Rand_ZeroFloat(300.0f);
this->unk_1AC.y = this->actor.floorHeight + 10.0f;
@@ -3201,13 +3206,13 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
EnFishing_SpawnRipple(&this->actor.projectedPos, play->specialEffects, &spB8, 30.0f, 400.0f,
150, 90);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_PL_CATCH_BOOMERANG);
+ Actor_PlaySfx(&this->actor, NA_SE_PL_CATCH_BOOMERANG);
break;
}
}
Math_ApproachF(&this->unk_1A8, 2048.0f, 1.0f, 128.0f);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
break;
@@ -3221,7 +3226,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
if (sp124 > 40.0f) {
this->unk_188 = 0.7f;
this->unk_18C = 1200.0f;
- Math_ApproachF(&this->actor.speedXZ, 0.5f, 1.0f, 0.01f);
+ Math_ApproachF(&this->actor.speed, 0.5f, 1.0f, 0.01f);
Math_ApproachF(&this->unk_1A8, 2048.0f, 1.0f, 128.0f);
} else {
this->unk_150 = -1;
@@ -3284,7 +3289,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
this->unk_18C = 500.0f;
this->unk_172[0] = Rand_ZeroFloat(10.0f) + 2.0f;
}
- Math_ApproachF(&this->actor.speedXZ, -0.2f, 1.0f, 0.1f);
+ Math_ApproachF(&this->actor.speed, -0.2f, 1.0f, 0.1f);
this->unk_156 = 1;
} else {
if (this->unk_156 != 0) {
@@ -3292,7 +3297,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
this->unk_1A8 = 0.0f;
this->unk_18C = 3000.0f;
}
- Math_ApproachF(&this->actor.speedXZ, 3.0f, 1.0f, 0.15f);
+ Math_ApproachF(&this->actor.speed, 3.0f, 1.0f, 0.15f);
this->unk_156 = 0;
}
@@ -3376,7 +3381,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
this->unk_1AC.z = sLurePos.z + sp100.z;
this->unk_1AC.y = sLurePos.y - 10.0f;
this->unk_1A8 = 4096.0f;
- Math_ApproachF(&this->actor.speedXZ, this->unk_180 * 0.8f, 1.0f, 1.0f);
+ Math_ApproachF(&this->actor.speed, this->unk_180 * 0.8f, 1.0f, 1.0f);
if ((D_8090CD14 != 3) || (sLurePos.y > (WATER_SURFACE_Y(play) + 5.0f)) ||
(sqrtf(SQ(sLurePos.x) + SQ(sLurePos.z)) > 800.0f)) {
@@ -3401,7 +3406,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
this->unk_149 = 50;
sp134 = 2;
this->unk_1AC = sLurePos;
- Math_ApproachF(&this->actor.speedXZ, this->unk_180, 1.0f, 1.0f);
+ Math_ApproachF(&this->actor.speed, this->unk_180, 1.0f, 1.0f);
if ((D_8090CD14 != 3) || (this->unk_172[0] == 0) || (sLurePos.y > (WATER_SURFACE_Y(play) + 5.0f)) ||
(sqrtf(SQ(sLurePos.x) + SQ(sLurePos.z)) > 800.0f)) {
@@ -3466,7 +3471,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
case -3:
this->unk_149 = 50;
this->unk_1AC = sLurePos;
- Math_ApproachF(&this->actor.speedXZ, 2.0f, 1.0f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 2.0f, 1.0f, 1.0f);
if ((D_8090CD14 != 3) || (this->unk_172[0] == 0) || (sLurePos.y > (WATER_SURFACE_Y(play) + 5.0f)) ||
(sqrtf(SQ(sLurePos.x) + SQ(sLurePos.z)) > 800.0f)) {
@@ -3477,8 +3482,8 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
this->unk_18C = 2000.0f;
} else if (sp124 < 10.0f) {
if (sLurePos.y > (WATER_SURFACE_Y(play) - 10.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_JUMP_OUT_WATER);
- play_sound(NA_SE_PL_CATCH_BOOMERANG);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_JUMP_OUT_WATER);
+ Audio_PlaySfx(NA_SE_PL_CATCH_BOOMERANG);
}
func_809033F0(this, play, false);
@@ -3539,7 +3544,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
this->unk_190 = 1.7f;
this->unk_194 = 7000.0f;
D_80917274 = 1;
- Audio_QueueSeqCmd(0x881A); // Changed from 0x81A in OoT
+ SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_ENEMY | 0x800 | SEQ_FLAG_ASYNC);
D_809171F6 = 0;
if (this->unk_148 == 1) {
@@ -3554,7 +3559,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
Rumble_Override(0.0f, temp2, 120, 5);
D_809171F4 = 40;
D_80911E28 = 10;
- play_sound(NA_SE_IT_FISHING_HIT);
+ Audio_PlaySfx(NA_SE_IT_FISHING_HIT);
}
}
@@ -3598,8 +3603,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);
@@ -3640,17 +3645,17 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
D_8091726C = 0.0f;
this->unk_188 = 1.6f;
this->unk_18C = 6000.0f;
- Math_ApproachF(&this->actor.speedXZ, 7.5f, 1.0f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 7.5f, 1.0f, 1.0f);
Math_ApproachS(&this->unk_168, 0x4E20, 2, 0xFA0);
} else {
if ((D_80917274 == 0) && (D_80917206 == 2)) {
this->unk_188 = 1.0f;
this->unk_18C = 2000.0f;
- Math_ApproachF(&this->actor.speedXZ, 3.0f, 1.0f, 0.2f);
+ Math_ApproachF(&this->actor.speed, 3.0f, 1.0f, 0.2f);
} else {
this->unk_188 = 1.4f;
this->unk_18C = 5000.0f;
- Math_ApproachF(&this->actor.speedXZ, 5.0f, 1.0f, 0.5f);
+ Math_ApproachF(&this->actor.speed, 5.0f, 1.0f, 0.5f);
}
if (this->unk_148 == 0) {
@@ -3675,7 +3680,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
D_8091726C = 1.3f - (this->unk_1A4 * 0.00899f * 1.4f);
}
- Math_ApproachF(&this->actor.speedXZ, 2.0f, 1.0f, 0.5f);
+ Math_ApproachF(&this->actor.speed, 2.0f, 1.0f, 0.5f);
if (this->unk_172[1] == 0) {
this->unk_14A = 0;
@@ -3696,7 +3701,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
}
if (D_80917274 || (D_80917206 != 2)) {
- if (this->actor.speedXZ < 3.0f) {
+ if (this->actor.speed < 3.0f) {
if (D_809171FE & 8) {
sp100.x = -0.8f;
} else {
@@ -3719,11 +3724,11 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
if ((SQ(sp10C.x) + SQ(sp10C.y) + SQ(sp10C.z)) > SQ(20.0f)) {
Math_ApproachF(&this->actor.world.pos.x, sReelLinePos[LINE_SEG_COUNT - 2].x, 0.2f,
- 2.0f * (this->actor.speedXZ * 1.5f));
+ 2.0f * (this->actor.speed * 1.5f));
Math_ApproachF(&this->actor.world.pos.y, sReelLinePos[LINE_SEG_COUNT - 2].y, 0.2f,
- 2.0f * (this->actor.speedXZ * 1.5f) * 5.0f * 0.1f);
+ 2.0f * (this->actor.speed * 1.5f) * 5.0f * 0.1f);
Math_ApproachF(&this->actor.world.pos.z, sReelLinePos[LINE_SEG_COUNT - 2].z, 0.2f,
- 2.0f * (this->actor.speedXZ * 1.5f));
+ 2.0f * (this->actor.speed * 1.5f));
}
if (CHECK_BTN_ALL(input->cur.button, BTN_A) || (input->rel.stick_y < -30)) {
@@ -3743,14 +3748,14 @@ 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) && (HIGH_SCORE(HS_FISHING) & 0x400)) ||
+ ((sLinkAge != 1) && (HIGH_SCORE(HS_FISHING) & 0x800))) {
// Assignment of OoT's D_80B7A67C here removed in MM, this is now an empty branch
}
} else {
// Assignment of OoT's D_80B7E086 here removed in MM
Rumble_Override(0.0f, 1, 3, 1);
- Audio_QueueSeqCmd(0x100A00FF);
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 10);
}
this->unk_150 = this->unk_152 = 0;
@@ -3774,7 +3779,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 +3808,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;
@@ -3818,7 +3823,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
}
if (this->unk_172[0] == 90) {
- Audio_QueueSeqCmd(0x8924); // changed from 0x924 in OoT
+ SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_GET_HEART | 0x900 | SEQ_FLAG_ASYNC);
D_8090CCFC = 40;
if (this->unk_148 == 0) {
@@ -3862,7 +3867,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE) ||
Message_GetState(&play->msgCtx) == TEXT_STATE_NONE) {
if (Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
if (play->msgCtx.choiceIndex == 0) {
if (D_8090CCF0 == 0.0f) {
D_8090CCF0 = this->unk_1A4;
@@ -3890,11 +3895,12 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
}
}
break;
+
case 1:
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE) ||
Message_GetState(&play->msgCtx) == TEXT_STATE_NONE) {
if (Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
if (play->msgCtx.choiceIndex != 0) {
f32 temp1 = D_8090CCF0;
s16 temp2 = D_809171D0;
@@ -3907,6 +3913,9 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
}
}
break;
+
+ default:
+ break;
}
}
@@ -3922,17 +3931,18 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
SkelAnime_Free(&this->skelAnime, play);
if (this->unk_148 == 0) {
- SkelAnime_InitFlex(play, &this->skelAnime, &gFishingFishSkel, &gFishingFishAnim, 0, 0, 0);
- Animation_MorphToLoop(&this->skelAnime, &gFishingFishAnim, 0.0f);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gFishingBassSkel, &gFishingBassAnim, NULL, NULL, 0);
+ Animation_MorphToLoop(&this->skelAnime, &gFishingBassAnim, 0.0f);
} else {
- SkelAnime_InitFlex(play, &this->skelAnime, &gFishingLoachSkel, &gFishingLoachAnim, 0, 0, 0);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gFishingLoachSkel, &gFishingLoachAnim, NULL, NULL,
+ 0);
Animation_MorphToLoop(&this->skelAnime, &gFishingLoachAnim, 0.0f);
}
}
D_809101C4 = 520.0f;
D_809101C0 = 195.0f;
- Audio_QueueSeqCmd(0x100A00FF);
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 10);
D_809171F6 = 20;
D_8090CD4C = 3;
}
@@ -3954,7 +3964,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
D_8090CF18 = 3;
}
- Math_ApproachF(&this->actor.speedXZ, 5.0f, 1.0f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 5.0f, 1.0f, 1.0f);
if (sp124 < 20.0f) {
Math_ApproachS(&this->unk_168, 0x4E20, 2, 0xFA0);
@@ -4013,7 +4023,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
spF6 = -0x1F40;
}
- if (this->actor.speedXZ >= 3.2f) {
+ if (this->actor.speed >= 3.2f) {
Math_ApproachS(&this->unk_166, spF6, 2, 0x4E20);
} else {
Math_ApproachS(&this->unk_166, spF6, 3, 0xBB8);
@@ -4049,7 +4059,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
Math_ApproachS(&this->unk_15A, this->unk_160, spF0, spEE);
Math_ApproachS(&this->unk_15C, this->unk_162, spFA, 0x2000);
- if (this->actor.speedXZ <= 0.5f) {
+ if (this->actor.speed <= 0.5f) {
Math_ApproachS(&this->actor.shape.rot.x, 0, 10, this->unk_170);
Math_ApproachS(&this->unk_170, 0x500, 1, 0x20);
} else {
@@ -4065,7 +4075,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) {
@@ -4080,14 +4090,14 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
if ((this->actor.world.pos.y < WATER_SURFACE_Y(play)) &&
(this->actor.world.pos.y > (WATER_SURFACE_Y(play) - 10.0f)) && !(this->unk_154 & 1) &&
- (this->actor.speedXZ > 0.0f)) {
+ (this->actor.speed > 0.0f)) {
Vec3f pos = this->actor.world.pos;
pos.y = WATER_SURFACE_Y(play);
EnFishing_SpawnRipple(&this->actor.projectedPos, play->specialEffects, &pos, 80.0f, 500.0f, 150, 90);
}
- if ((this->actor.speedXZ > 0.0f) || (this->unk_150 == 5)) {
+ if ((this->actor.speed > 0.0f) || (this->unk_150 == 5)) {
f32 velocityY = this->actor.velocity.y;
spD8 = this->unk_1A4 * 0.1f;
@@ -4096,24 +4106,25 @@ 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;
this->actor.velocity.y = velocityY;
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->unk_198 = 20;
}
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
if (this->actor.world.pos.y > WATER_SURFACE_Y(play)) {
this->unk_17C = Rand_ZeroFloat(3.0f) + 3.0f;
this->actor.velocity.x = this->actor.world.pos.x * -0.003f;
this->actor.velocity.z = this->actor.world.pos.z * -0.003f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_FISH_LEAP);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FISH_LEAP);
func_809036BC(this, play);
if (Rand_ZeroOne() < 0.5f) {
@@ -4125,10 +4136,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 +4149,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,41 +4168,42 @@ 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);
}
}
}
-s32 EnFishing_FishOverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
+s32 EnFishing_BassOverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnFishing* this = THIS;
- if (limbIndex == 13) {
+ if (limbIndex == FISHING_BASS_LIMB_JAW) {
rot->z -= this->unk_168 - 11000;
- } else if ((limbIndex == 2) || (limbIndex == 3)) {
+ } else if ((limbIndex == FISHING_BASS_LIMB_MIDDLE_SEGMENT_ROOT) ||
+ (limbIndex == FISHING_BASS_LIMB_BACK_SEGMENT_ROOT)) {
rot->y += this->unk_164;
- } else if (limbIndex == 4) {
+ } else if (limbIndex == FISHING_BASS_LIMB_END_ROOT) {
rot->y += this->unk_16E;
- } else if (limbIndex == 0xE) {
+ } else if (limbIndex == FISHING_BASS_LIMB_RIGHT_PECTORAL_FIN) {
rot->y -= this->unk_16A;
- } else if (limbIndex == 0xF) {
+ } else if (limbIndex == FISHING_BASS_LIMB_LEFT_PECTORAL_FIN) {
rot->y += this->unk_16A;
- } else if (limbIndex == 8) {
+ } else if (limbIndex == FISHING_BASS_LIMB_TOP_REAR_FIN) {
rot->y += this->unk_16C;
- } else if (limbIndex == 9) {
+ } else if (limbIndex == FISHING_BASS_LIMB_BOTTOM_REAR_FIN) {
rot->y -= this->unk_16C;
}
return false;
}
-void EnFishing_FishPostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
+void EnFishing_BassPostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnFishing* this = THIS;
- if (limbIndex == 13) {
+ if (limbIndex == FISHING_BASS_LIMB_JAW) {
Matrix_MultVec3f(&sFishMouthOffset, &this->fishMouthPos);
}
}
@@ -4199,11 +4211,11 @@ void EnFishing_FishPostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
s32 EnFishing_LoachOverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnFishing* this = THIS;
- if (limbIndex == 3) {
+ if (limbIndex == FISHING_LOACH_LIMB_MIDDLE_SEGMENT) {
rot->y += this->unk_1C4[0];
- } else if (limbIndex == 4) {
+ } else if (limbIndex == FISHING_LOACH_LIMB_LOWER_BACK_FIN) {
rot->y += this->unk_1C4[1];
- } else if (limbIndex == 5) {
+ } else if (limbIndex == FISHING_LOACH_LIMB_TAIL_FIN) {
rot->y += this->unk_1C4[2];
}
@@ -4214,7 +4226,7 @@ void EnFishing_LoachPostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Ve
static Vec3f sLoachMouthOffset = { 500.0f, 500.0f, 0.0f };
EnFishing* this = THIS;
- if (limbIndex == 11) {
+ if (limbIndex == FISHING_LOACH_LIMB_JAW) {
Matrix_MultVec3f(&sLoachMouthOffset, &this->fishMouthPos);
}
}
@@ -4222,23 +4234,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);
+ EnFishing_BassOverrideLimbDraw, EnFishing_BassPostLimbDraw, &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);
@@ -4303,7 +4315,7 @@ void EnFishing_UpdatePondProps(PlayState* play) {
actor = play->actorCtx.actorLists[ACTORCAT_NPC].first;
while (actor != NULL) {
- if (!((actor->id == ACTOR_EN_FISHING) && (actor->params >= 100))) {
+ if ((actor->id != ACTOR_EN_FISHING) || (actor->params < 100)) {
actor = actor->next;
} else {
EnFishing_HandleReedContact(prop, &actor->world.pos);
@@ -4317,7 +4329,7 @@ void EnFishing_UpdatePondProps(PlayState* play) {
actor = play->actorCtx.actorLists[ACTORCAT_NPC].first;
while (actor != NULL) {
- if (!((actor->id == ACTOR_EN_FISHING) && (actor->params >= 100))) {
+ if ((actor->id != ACTOR_EN_FISHING) || (actor->params < 100)) {
actor = actor->next;
} else {
EnFishing_HandleLilyPadContact(prop, &actor->world.pos, ((EnFishing*)actor)->unk_149);
@@ -4408,7 +4420,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 +4577,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 +4672,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 +4694,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 ((HIGH_SCORE(HS_FISHING) & 0x100) && !(HIGH_SCORE(HS_FISHING) & 0x200)) {
this->actor.textId = 0x4093;
} else {
this->actor.textId = 0x407B;
@@ -4700,57 +4712,61 @@ void EnFishing_HandleOwnerDialog(EnFishing* this, PlayState* play) {
if (D_809171FC == 0) {
this->unk_154 = 1;
if (sLinkAge != 1) {
- gSaveContext.save.unk_EE4 |= 0x200;
+ HIGH_SCORE(HS_FISHING) |= 0x200;
} else {
- gSaveContext.save.unk_EE4 |= 0x100;
+ HIGH_SCORE(HS_FISHING) |= 0x100;
}
} else {
this->unk_154 = 10;
}
} else {
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
break;
case 1:
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(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;
} else {
this->actor.textId = 0x407D;
}
- func_80151938(play, this->actor.textId);
+ Message_ContinueTextbox(play, this->actor.textId);
this->unk_154 = 2;
} else {
- func_80151938(play, 0x407E);
+ Message_ContinueTextbox(play, 0x407E);
this->unk_154 = 3;
}
break;
+
case 1:
- func_80151938(play, 0x2D);
+ Message_ContinueTextbox(play, 0x2D);
this->unk_154 = 3;
break;
+
+ default:
+ break;
}
}
break;
case 2:
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
- func_80151938(play, 0x407F);
+ Message_CloseTextbox(play);
+ Message_ContinueTextbox(play, 0x407F);
this->unk_154 = 4;
}
break;
case 3:
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->unk_154 = 0;
}
if (Message_GetState(&play->msgCtx) == TEXT_STATE_DONE) {
@@ -4760,16 +4776,20 @@ void EnFishing_HandleOwnerDialog(EnFishing* this, PlayState* play) {
case 4:
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
switch (play->msgCtx.choiceIndex) {
case 0:
D_8090CCF8 = D_809171CC;
- func_80151938(play, 0x4080);
+ Message_ContinueTextbox(play, 0x4080);
this->unk_154 = 5;
break;
+
case 1:
- func_80151938(play, 0x407F);
+ Message_ContinueTextbox(play, 0x407F);
+ break;
+
+ default:
break;
}
}
@@ -4777,7 +4797,7 @@ void EnFishing_HandleOwnerDialog(EnFishing* this, PlayState* play) {
case 5:
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
play->interfaceCtx.unk_27E = 1;
play->startPlayerFishing(play);
@@ -4785,8 +4805,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 ((HIGH_SCORE(HS_FISHING) & 0xFF0000) < 0xFF0000) {
+ HIGH_SCORE(HS_FISHING) += 0x10000;
}
}
break;
@@ -4794,23 +4814,27 @@ void EnFishing_HandleOwnerDialog(EnFishing* this, PlayState* play) {
case 10:
if (D_8090CD0C != 0) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
switch (play->msgCtx.choiceIndex) {
case 0:
- func_80151938(play, 0x40B2);
+ Message_ContinueTextbox(play, 0x40B2);
D_8090CD08 = 1;
D_8090CD0C = 0;
this->unk_154 = 20;
break;
+
case 1:
this->unk_154 = 0;
break;
+
+ default:
+ break;
}
}
} else {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
switch (play->msgCtx.choiceIndex) {
case 0:
@@ -4834,12 +4858,13 @@ void EnFishing_HandleOwnerDialog(EnFishing* this, PlayState* play) {
this->actor.textId = 0x409B;
this->unk_154 = 11;
}
- func_80151938(play, this->actor.textId);
+ Message_ContinueTextbox(play, this->actor.textId);
break;
+
case 1:
if (D_8090CD00 > 36000) {
D_8090CD00 = 30000;
- func_80151938(play, 0x4088);
+ Message_ContinueTextbox(play, 0x4088);
} else {
if (D_809171CA == 0) {
if (D_809171D6 == 0) {
@@ -4848,9 +4873,9 @@ void EnFishing_HandleOwnerDialog(EnFishing* this, PlayState* play) {
}
if ((D_80917206 == 2) && (D_8090D638[D_809171D6] == 0x408D)) {
- func_80151938(play, 0x40AF);
+ Message_ContinueTextbox(play, 0x40AF);
} else {
- func_80151938(play, D_8090D638[D_809171D6]);
+ Message_ContinueTextbox(play, D_8090D638[D_809171D6]);
}
D_809171D6++;
@@ -4867,14 +4892,18 @@ void EnFishing_HandleOwnerDialog(EnFishing* this, PlayState* play) {
}
this->unk_154 = 0;
break;
+
case 2:
if (D_809171D8 == 0) {
- func_80151938(play, 0x4085);
+ Message_ContinueTextbox(play, 0x4085);
} else if (sLinkAge == 1) {
- func_80151938(play, 0x4092);
+ Message_ContinueTextbox(play, 0x4092);
}
this->unk_154 = 22;
break;
+
+ default:
+ break;
}
}
}
@@ -4886,7 +4915,7 @@ void EnFishing_HandleOwnerDialog(EnFishing* this, PlayState* play) {
Message_ShouldAdvance(play)) {
s32 getItemId;
- func_801477B4(play);
+ Message_CloseTextbox(play);
if (D_809171D0 == 0) {
D_809171CC = D_8090CCF0;
@@ -4895,29 +4924,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;
+ HIGH_SCORE(HS_FISHING) &= 0xFFFFFF00;
+ HIGH_SCORE(HS_FISHING) |= ((s16)D_809171CC & 0x7F);
+ temp = (HIGH_SCORE(HS_FISHING) & 0x7F000000) >> 0x18;
if (temp < D_809171CC) {
- gSaveContext.save.unk_EE4 &= 0xFFFFFF;
- gSaveContext.save.unk_EE4 |= ((s16)D_809171CC & 0x7F) << 0x18;
+ HIGH_SCORE(HS_FISHING) &= 0xFFFFFF;
+ HIGH_SCORE(HS_FISHING) |= ((s16)D_809171CC & 0x7F) << 0x18;
if (D_809171D2 == 2) {
- gSaveContext.save.unk_EE4 |= 0x80000000;
+ HIGH_SCORE(HS_FISHING) |= 0x80000000;
}
}
if (D_809171D2 == 2) {
- gSaveContext.save.unk_EE4 |= 0x80;
+ HIGH_SCORE(HS_FISHING) |= 0x80;
this->unk_154 = 0;
break;
}
} else {
- gSaveContext.save.unk_EE4 &= 0xFFFFFF;
- gSaveContext.save.unk_EE4 |= ((s16)D_809171CC & 0x7F) << 0x18;
+ HIGH_SCORE(HS_FISHING) &= 0xFFFFFF;
+ HIGH_SCORE(HS_FISHING) |= ((s16)D_809171CC & 0x7F) << 0x18;
if (D_809171D2 == 2) {
- gSaveContext.save.unk_EE4 |= 0x80000000;
+ HIGH_SCORE(HS_FISHING) |= 0x80000000;
this->unk_154 = 0;
break;
}
@@ -4934,14 +4963,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) && !(HIGH_SCORE(HS_FISHING) & 0x400)) {
+ HIGH_SCORE(HS_FISHING) |= 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) && !(HIGH_SCORE(HS_FISHING) & 0x800)) {
+ HIGH_SCORE(HS_FISHING) |= 0x800;
getItemId = GI_SKULL_TOKEN;
sSinkingLureLocation = Rand_ZeroFloat(3.999f) + 1.0f;
}
@@ -4952,34 +4981,38 @@ void EnFishing_HandleOwnerDialog(EnFishing* this, PlayState* play) {
}
this->actor.parent = NULL;
- Actor_PickUp(&this->actor, play, getItemId, 2000.0f, 1000.0f);
+ Actor_OfferGetItem(&this->actor, play, getItemId, 2000.0f, 1000.0f);
this->unk_154 = 23;
}
break;
case 20:
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->unk_154 = 0;
}
break;
case 21:
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
switch (play->msgCtx.choiceIndex) {
case 0:
this->unk_154 = 0;
break;
+
case 1:
if (D_809171D8 == 0) {
- func_80151938(play, 0x4085);
+ Message_ContinueTextbox(play, 0x4085);
} else if (sLinkAge == 1) {
- func_80151938(play, 0x4092);
+ Message_ContinueTextbox(play, 0x4092);
}
this->unk_154 = 22;
break;
+
+ default:
+ break;
}
}
break;
@@ -5001,7 +5034,7 @@ void EnFishing_HandleOwnerDialog(EnFishing* this, PlayState* play) {
if (Actor_HasParent(&this->actor, play)) {
this->unk_154 = 24;
} else {
- Actor_PickUp(&this->actor, play, GI_SKULL_TOKEN, 2000.0f, 1000.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_SKULL_TOKEN, 2000.0f, 1000.0f);
}
break;
@@ -5016,6 +5049,9 @@ void EnFishing_HandleOwnerDialog(EnFishing* this, PlayState* play) {
}
}
break;
+
+ default:
+ break;
}
}
@@ -5058,9 +5094,9 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) {
SkelAnime_Update(&this->skelAnime);
if ((D_8090CD04 != 0) || Message_GetState(&play->msgCtx) != TEXT_STATE_NONE) {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
} else {
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_20);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_20);
}
if ((this->actor.xzDistToPlayer < 120.0f) || Message_GetState(&play->msgCtx) != TEXT_STATE_NONE) {
@@ -5104,9 +5140,9 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) {
}
if (D_8090CD08 == 0) {
- gSaveContext.save.unk_EE4 |= 0x1000;
+ HIGH_SCORE(HS_FISHING) |= 0x1000;
} else if (D_8090CD08 == 1) {
- gSaveContext.save.unk_EE4 &= ~0x1000;
+ HIGH_SCORE(HS_FISHING) &= ~0x1000;
}
if (D_8090CCFC != 0) {
@@ -5132,7 +5168,7 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) {
if ((D_809171FC != 0) && (D_8090CD4C == 0) && (player->actor.world.pos.z > 1360.0f) &&
(fabsf(player->actor.world.pos.x) < 25.0f)) {
player->actor.world.pos.z = 1360.0f;
- player->actor.speedXZ = 0.0f;
+ player->actor.speed = 0.0f;
if (D_8090CD50 == 0) {
D_8090CD4C = 10;
@@ -5146,8 +5182,8 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) {
sSinkingLureLocation = 0;
D_8090CD4C = 20;
Rumble_Override(0.0f, 150, 10, 10);
- play_sound(NA_SE_SY_TRE_BOX_APPEAR);
- Audio_QueueSeqCmd(0x101400FF);
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 20);
}
if (D_8090CD50 != 0) {
@@ -5220,9 +5256,9 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) {
}
if ((D_809171DC == 0) || (D_809171DC == 3)) {
- play_sound(NA_SE_SY_CAMERA_ZOOM_DOWN);
+ Audio_PlaySfx(NA_SE_SY_CAMERA_ZOOM_DOWN);
} else {
- play_sound(NA_SE_SY_CAMERA_ZOOM_UP);
+ Audio_PlaySfx(NA_SE_SY_CAMERA_ZOOM_UP);
}
}
}
@@ -5275,17 +5311,17 @@ 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);
- play->envCtx.lightSettings.fogNear = 0;
+ Environment_EnableUnderwaterLights(play, 0);
+ play->envCtx.adjLightSettings.fogNear = 0;
player->unk_B28 = -5;
D_80917200 = 5;
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);
@@ -5305,7 +5341,7 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) {
// fallthrough
case 11:
player->actor.world.pos.z = 1360.0f;
- player->actor.speedXZ = 0.0f;
+ player->actor.speed = 0.0f;
if (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE) {
Camera* mainCam = Play_GetCamera(play, CAM_ID_MAIN);
@@ -5315,18 +5351,18 @@ 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;
- func_800F6834(play, 0);
- play->envCtx.lightSettings.fogNear = 0;
+ Environment_EnableUnderwaterLights(play, 0);
+ play->envCtx.adjLightSettings.fogNear = 0;
}
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);
@@ -5355,7 +5391,7 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) {
case 22:
if (D_8090CD50 == 30) {
- Audio_QueueSeqCmd(0x8922); // changed from 0x922 to 0x8922 in MM
+ SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_GET_ITEM | 0x900 | SEQ_FLAG_ASYNC);
}
D_8090CD54 = 1;
@@ -5406,7 +5442,7 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) {
if (Message_ShouldAdvance(play)) {
Camera* mainCam = Play_GetCamera(play, CAM_ID_MAIN);
- func_801477B4(play);
+ Message_CloseTextbox(play);
if (play->msgCtx.choiceIndex == 0) {
D_80917206 = 2;
D_809171D6 = 0;
@@ -5416,17 +5452,16 @@ 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;
D_80917200 = 5;
D_8090CD54 = 0;
D_809171F6 = 20;
- func_800F6834(play, 0);
- play->envCtx.lightSettings.fogNear = 0;
+ Environment_EnableUnderwaterLights(play, 0);
+ play->envCtx.adjLightSettings.fogNear = 0;
}
}
}
@@ -5441,31 +5476,31 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) {
Math_ApproachF(&sSubCamVelFactor, 1.0f, 1.0f, 0.02f);
if (sSubCamEye.y <= (WATER_SURFACE_Y(play) + 1.0f)) {
- func_800F6834(play, 1);
+ Environment_EnableUnderwaterLights(play, 1);
if (D_809171CA != 0) {
- play->envCtx.lightSettings.fogNear = -0xB2;
+ play->envCtx.adjLightSettings.fogNear = -178;
} else {
- play->envCtx.lightSettings.fogNear = -0x2E;
+ play->envCtx.adjLightSettings.fogNear = -46;
}
} else {
- func_800F6834(play, 0);
- play->envCtx.lightSettings.fogNear = 0;
+ Environment_EnableUnderwaterLights(play, 0);
+ play->envCtx.adjLightSettings.fogNear = 0;
}
}
if ((player->actor.floorHeight < (WATER_SURFACE_Y(play) - 3.0f)) &&
- (player->actor.world.pos.y < (player->actor.floorHeight + 3.0f)) && (player->actor.speedXZ > 1.0f) &&
+ (player->actor.world.pos.y < (player->actor.floorHeight + 3.0f)) && (player->actor.speed > 1.0f) &&
((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);
}
if ((player->actor.floorHeight < WATER_SURFACE_Y(play)) &&
- (player->actor.floorHeight > (WATER_SURFACE_Y(play) - 10.0f)) && (player->actor.speedXZ >= 4.0f) &&
+ (player->actor.floorHeight > (WATER_SURFACE_Y(play) - 10.0f)) && (player->actor.speed >= 4.0f) &&
((play->gameplayFrames % 4) == 0)) {
s16 i;
@@ -5499,10 +5534,10 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) {
if (Rand_ZeroOne() < 0.5f) {
D_8090CCD4 = Rand_ZeroFloat(10.0f) + 5.0f;
- play->envCtx.unk_E1 = 1;
+ play->envCtx.stormRequest = STORM_REQUEST_START;
} else {
D_8090CCD4 = 0;
- play->envCtx.unk_E1 = 2;
+ play->envCtx.stormRequest = STORM_REQUEST_STOP;
}
}
@@ -5524,7 +5559,7 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) {
Math_ApproachF(&D_8090CCDC.z, target, 1.0f, 5.0f);
if (D_8090CCDC.z < 1500.0f) {
- func_8019FAD8(&D_8090CCDC, NA_SE_EV_RAIN - SFX_FLAG, D_8090CCE8);
+ Audio_PlaySfx_AtPosWithFreq(&D_8090CCDC, NA_SE_EV_RAIN - SFX_FLAG, D_8090CCE8);
}
if (D_8090CCD4 != 0) {
@@ -5533,8 +5568,8 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) {
Math_ApproachZeroF(&D_8090CCD8, 1.0f, 2.0f);
}
- play->envCtx.lightSettings.diffuseColor1[0] = play->envCtx.lightSettings.diffuseColor1[1] =
- play->envCtx.lightSettings.diffuseColor1[2] = D_8090CCD8;
+ play->envCtx.adjLightSettings.light1Color[0] = play->envCtx.adjLightSettings.light1Color[1] =
+ play->envCtx.adjLightSettings.light1Color[2] = D_8090CCD8;
if ((u8)D_8090CCD0 > 0) {
s32 pad;
@@ -5550,9 +5585,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);
@@ -5568,9 +5603,9 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) {
SkinMatrix_Vec3fMtxFMultXYZW(&play->viewProjectionMtxF, &sStreamSoundPos, &sStreamSoundProjectedPos, &sProjectedW);
- Audio_PlaySfxAtPos(&sStreamSoundProjectedPos, NA_SE_EV_WATER_WALL - SFX_FLAG);
+ Audio_PlaySfx_AtPos(&sStreamSoundProjectedPos, NA_SE_EV_WATER_WALL - SFX_FLAG);
- if (gSaveContext.options.language == 0) { // Added in MM
+ if (gSaveContext.options.language == LANGUAGE_JPN) { // Added in MM
gSaveContext.minigameScore = D_8090CCF8;
} else {
gSaveContext.minigameScore = (SQ((f32)D_8090CCF8) * 0.0036f) + 0.5f;
@@ -5580,7 +5615,7 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) {
s32 EnFishing_OwnerOverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnFishing* this = THIS;
- if (limbIndex == 8) { // Head
+ if (limbIndex == FISHING_OWNER_LIMB_HEAD) {
rot->x -= this->unk_15C;
}
@@ -5588,7 +5623,7 @@ s32 EnFishing_OwnerOverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList,
}
void EnFishing_OwnerPostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
- if (limbIndex == 8) { // Head
+ if (limbIndex == FISHING_OWNER_LIMB_HEAD) {
OPEN_DISPS(play->state.gfxCtx);
Matrix_MultVec3f(&sZeroVec, &sOwnerHeadPos);
@@ -5616,8 +5651,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))) {
@@ -5637,15 +5672,15 @@ void EnFishing_DrawOwner(Actor* thisx, PlayState* play) {
if (D_809171F6 == 0) {
if (sLinkAge != 1) {
- Audio_QueueSeqCmd(0x8019); // Changed from 0x19 in OoT
+ SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_CLEAR_EVENT | SEQ_FLAG_ASYNC);
} else {
- Audio_QueueSeqCmd(0x8027); // Changed from 0x27 in OoT
+ SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_MUSIC_BOX_HOUSE | SEQ_FLAG_ASYNC);
}
if (sLinkAge != 1) {
- Audio_QueueSeqCmd(0x8019); // Changed from 0x19 in OoT
+ SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_CLEAR_EVENT | SEQ_FLAG_ASYNC);
} else {
- Audio_QueueSeqCmd(0x8027); // Changed from 0x27 in OoT
+ SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_MUSIC_BOX_HOUSE | SEQ_FLAG_ASYNC);
}
}
}
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 3ad6809dc..bd706810d 100644
--- a/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c
+++ b/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c
@@ -5,8 +5,9 @@
*/
#include "z_en_floormas.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_400)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_400)
#define THIS ((EnFloormas*)thisx)
@@ -134,17 +135,6 @@ static InitChainEntry sInitChain[] = {
ICHAIN_F32_DIV1000(gravity, -1000, ICHAIN_STOP),
};
-static Vec3f D_808D3900[] = {
- { 25.0f, 45.0f, -7.0f }, { 25.0f, 40.0f, -12.0f }, { 25.0f, 35.0f, -2.0f },
- { 10.0f, 20.0f, -4.0f }, { 15.0f, 25.0f, -2.0f },
-};
-
-static s8 D_808D393C[] = {
- -1, -1, -1, -1, 0, -1, -1, 1, -1, 2, -1, -1, 3, -1, 4, -1, -1, 5, -1, -1, -1, 6, 7, -1, 8,
-};
-
-static Color_RGBA8 D_808D3958 = { 0, 255, 0, 0 };
-
void EnFloormas_Init(Actor* thisx, PlayState* play2) {
PlayState* play = play2;
EnFloormas* this = THIS;
@@ -163,20 +153,20 @@ void EnFloormas_Init(Actor* thisx, PlayState* play2) {
this->actor.params = ENFLOORMAS_GET_7FFF(&this->actor);
if (params != 0) {
- this->actor.flags |= ACTOR_FLAG_80;
+ this->actor.flags |= ACTOR_FLAG_REACT_TO_LENS;
this->actor.draw = func_808D3754;
}
if (this->actor.params == ENFLOORMAS_GET_7FFF_10) {
this->actor.draw = NULL;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actionFunc = func_808D2AA8;
return;
}
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.unk20, 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 +174,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.unk20, NULL);
+ params + 0x10, CS_ID_NONE, this->actor.halfDaysBits, NULL);
if (this->actor.child == NULL) {
Actor_Kill(this->actor.parent);
Actor_Kill(&this->actor);
@@ -224,7 +214,7 @@ void func_808D0930(EnFloormas* this, PlayState* play) {
func_808D19D4((EnFloormas*)this->actor.child);
func_808D19D4((EnFloormas*)this->actor.parent);
func_808D19D4(this);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KUSAMUSHI_HIDE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KUSAMUSHI_HIDE);
} else {
Item_DropCollectibleRandom(play, &this->actor, &this->actor.world.pos, 0x90);
func_808D1ED4(this, play);
@@ -234,12 +224,12 @@ void func_808D0930(EnFloormas* this, PlayState* play) {
void func_808D09CC(EnFloormas* this) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX;
this->drawDmgEffScale = 0.55f;
- this->drawDmgEffFrozenSteamScale = 0.82500005f;
+ this->drawDmgEffFrozenSteamScale = 825.0f * 0.001f;
this->drawDmgEffAlpha = 1.0f;
this->collider.base.colType = COLTYPE_HIT3;
this->unk_18E = 80;
this->actor.flags &= ~(ACTOR_FLAG_200 | ACTOR_FLAG_400);
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 80);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 80);
}
void func_808D0A48(EnFloormas* this, PlayState* play) {
@@ -247,7 +237,7 @@ void func_808D0A48(EnFloormas* this, PlayState* play) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->collider.base.colType = COLTYPE_HIT0;
this->drawDmgEffAlpha = 0.0f;
- Actor_SpawnIceEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), 2,
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, ENFLOORMAS_BODYPART_MAX, 2,
this->actor.scale.x * 30.000002f, this->actor.scale.x * 20.0f);
if (this->actor.scale.x > 0.009f) {
this->actor.flags |= ACTOR_FLAG_400;
@@ -259,7 +249,7 @@ void func_808D0A48(EnFloormas* this, PlayState* play) {
void func_808D0B08(EnFloormas* this) {
Animation_PlayOnce(&this->skelAnime, &gWallmasterIdleAnim);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = func_808D0B50;
}
@@ -301,27 +291,27 @@ void func_808D0CE4(EnFloormas* this) {
}
this->unk_18E = Rand_S16Offset(2, 4);
- this->actor.speedXZ = 1.5f;
+ this->actor.speed = 1.5f;
this->actionFunc = func_808D0D70;
}
void func_808D0D70(EnFloormas* this, PlayState* play) {
- s32 temp_v0;
+ s32 onAnimFirstFrame;
SkelAnime_Update(&this->skelAnime);
- temp_v0 = Animation_OnFrame(&this->skelAnime, 0.0f);
- if ((temp_v0 != 0) && (this->unk_18E != 0)) {
+ onAnimFirstFrame = Animation_OnFrame(&this->skelAnime, 0.0f);
+ if (onAnimFirstFrame && (this->unk_18E != 0)) {
this->unk_18E--;
}
- if ((temp_v0 != 0) || Animation_OnFrame(&this->skelAnime, 12.0f) || Animation_OnFrame(&this->skelAnime, 24.0f) ||
+ if (onAnimFirstFrame || Animation_OnFrame(&this->skelAnime, 12.0f) || Animation_OnFrame(&this->skelAnime, 24.0f) ||
Animation_OnFrame(&this->skelAnime, 36.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FALL_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FALL_WALK);
}
if ((this->actor.xzDistToPlayer < 320.0f) && Actor_IsFacingPlayer(&this->actor, 0x4000)) {
func_808D0F50(this);
- } else if (this->actor.bgCheckFlags & 8) {
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->unk_190 = this->actor.wallYaw;
func_808D108C(this);
} else if ((this->actor.xzDistToPlayer < 400.0f) && !Actor_IsFacingPlayer(&this->actor, 0x4000)) {
@@ -334,7 +324,7 @@ void func_808D0D70(EnFloormas* this, PlayState* play) {
void func_808D0ECC(EnFloormas* this) {
Animation_PlayOnce(&this->skelAnime, &gWallmasterStopWalkAnim);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = func_808D0F14;
}
@@ -346,7 +336,7 @@ void func_808D0F14(EnFloormas* this, PlayState* play) {
void func_808D0F50(EnFloormas* this) {
this->unk_18E = 0;
- this->actor.speedXZ = 5.0f;
+ this->actor.speed = 5.0f;
this->skelAnime.playSpeed = 3.0f;
this->actionFunc = func_808D0F80;
}
@@ -355,12 +345,12 @@ void func_808D0F80(EnFloormas* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 12.0f) ||
Animation_OnFrame(&this->skelAnime, 24.0f) || Animation_OnFrame(&this->skelAnime, 36.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FALL_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FALL_WALK);
}
Math_ApproachS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 3, 0x71C);
if ((this->actor.xzDistToPlayer < 280.0f) && Actor_IsFacingPlayer(&this->actor, 0x2000) &&
- !(this->actor.bgCheckFlags & 8)) {
+ !(this->actor.bgCheckFlags & BGCHECKFLAG_WALL)) {
func_808D1380(this, play);
} else if (this->actor.xzDistToPlayer > 400.0f) {
func_808D0CE4(this);
@@ -370,7 +360,7 @@ void func_808D0F80(EnFloormas* this, PlayState* play) {
void func_808D108C(EnFloormas* this) {
s16 sp36 = this->unk_190 - this->actor.shape.rot.y;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (sp36 > 0) {
Animation_MorphToPlayOnce(&this->skelAnime, &gFloormasterTurnAnim, -3.0f);
} else {
@@ -389,7 +379,7 @@ void func_808D108C(EnFloormas* this) {
}
void func_808D11BC(EnFloormas* this, PlayState* play) {
- f32 frame;
+ f32 curFrame;
f32 sp30;
f32 sp2C;
@@ -400,14 +390,14 @@ void func_808D11BC(EnFloormas* this, PlayState* play) {
if (((this->skelAnime.playSpeed > 0.0f) && Animation_OnFrame(&this->skelAnime, 21.0f)) ||
((this->skelAnime.playSpeed < 0.0f) && Animation_OnFrame(&this->skelAnime, 6.0f))) {
if (this->actor.scale.x > 0.009f) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FALL_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FALL_WALK);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FLOORMASTER_SM_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FLOORMASTER_SM_WALK);
}
}
- frame = this->skelAnime.curFrame;
- if ((frame >= 7.0f) && (frame < 22.0f)) {
+ curFrame = this->skelAnime.curFrame;
+ if ((curFrame >= 7.0f) && (curFrame < 22.0f)) {
sp30 = Math_SinS(this->actor.shape.rot.y + 0x4268);
sp2C = Math_CosS(this->actor.shape.rot.y + 0x4268);
this->actor.shape.rot.y += this->unk_190;
@@ -419,11 +409,11 @@ void func_808D11BC(EnFloormas* this, PlayState* play) {
void func_808D1380(EnFloormas* this, PlayState* play) {
Animation_Change(&this->skelAnime, &gWallmasterHoverAnim, 3.0f, 0.0f, Animation_GetLastFrame(&gWallmasterHoverAnim),
ANIMMODE_ONCE, -3.0f);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.gravity = 0.0f;
func_808D08D0(this);
Actor_SpawnFloorDustRing(play, &this->actor, &this->actor.world.pos, 15.0f, 6, 20.0f, 300, 100, 1);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FLOORMASTER_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FLOORMASTER_ATTACK);
this->actionFunc = func_808D1458;
}
@@ -454,13 +444,13 @@ void func_808D14DC(EnFloormas* this, PlayState* play) {
sp28.x = Math_SinS(this->actor.shape.rot.y - 0x6000) * 7.0f;
sp28.z = Math_CosS(this->actor.shape.rot.y - 0x6000) * 7.0f;
func_800B1210(play, &sp34, &sp28, &gZeroVec3f, 0x1C2, 0x64);
- func_800B9010(&this->actor, NA_SE_EN_FLOORMASTER_SLIDING - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_FLOORMASTER_SLIDING - SFX_FLAG);
}
void func_808D161C(EnFloormas* this) {
this->unk_18E = 25;
this->actor.gravity = -0.15f;
- this->actor.speedXZ = 0.5f;
+ this->actor.speed = 0.5f;
this->actionFunc = func_808D1650;
}
@@ -471,7 +461,7 @@ void func_808D1650(EnFloormas* this, PlayState* play) {
this->unk_18E--;
}
- Math_StepToF(&this->actor.speedXZ, 15.0f, SQ(this->actor.speedXZ) * (1.0f / 3.0f));
+ Math_StepToF(&this->actor.speed, 15.0f, SQ(this->actor.speed) * (1.0f / 3.0f));
Math_ScaledStepToS(&this->actor.shape.rot.x, -0x1680, 0x140);
temp_f0_2 = this->actor.world.pos.y - this->actor.floorHeight;
@@ -485,14 +475,14 @@ void func_808D1650(EnFloormas* this, PlayState* play) {
func_808D14DC(this, play);
}
- if ((this->actor.bgCheckFlags & 8) || (this->unk_18E == 0)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) || (this->unk_18E == 0)) {
func_808D1740(this);
}
}
void func_808D1740(EnFloormas* this) {
Animation_Change(&this->skelAnime, &gWallmasterJumpAnim, 1.0f, 41.0f, 42.0f, ANIMMODE_ONCE, 5.0f);
- if ((this->actor.speedXZ < 0.0f) || (this->actionFunc != func_808D1650)) {
+ if ((this->actor.speed < 0.0f) || (this->actionFunc != func_808D1650)) {
this->unk_18E = 30;
} else {
this->unk_18E = 45;
@@ -502,31 +492,31 @@ void func_808D1740(EnFloormas* this) {
}
void func_808D17EC(EnFloormas* this, PlayState* play) {
- s32 sp24 = this->actor.bgCheckFlags & 1;
+ s32 sp24 = this->actor.bgCheckFlags & BGCHECKFLAG_GROUND;
- if (this->actor.bgCheckFlags & 2) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
if (this->actor.params != ENFLOORMAS_GET_7FFF_40) {
func_808D0908(this);
}
if (this->actor.velocity.y < -4.0f) {
if (this->actor.scale.x > 0.009f) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FALL_LAND);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FALL_LAND);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FLOORMASTER_SM_LAND);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FLOORMASTER_SM_LAND);
}
}
}
- if (this->actor.bgCheckFlags & 8) {
- this->actor.speedXZ = 0.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
+ this->actor.speed = 0.0f;
}
if (sp24 != 0) {
- Math_StepToF(&this->actor.speedXZ, 0.0f, 2.0f);
+ Math_StepToF(&this->actor.speed, 0.0f, 2.0f);
}
- if ((this->actor.speedXZ > 0.0f) && ((this->actor.world.pos.y - this->actor.floorHeight) < 12.0f)) {
+ if ((this->actor.speed > 0.0f) && ((this->actor.world.pos.y - this->actor.floorHeight) < 12.0f)) {
func_808D14DC(this, play);
}
@@ -558,7 +548,7 @@ void func_808D19D4(EnFloormas* this) {
this->drawDmgEffAlpha = 0.0f;
Actor_SetScale(&this->actor, 0.004f);
this->actor.flags |= ACTOR_FLAG_10;
- if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_80)) {
+ if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS)) {
this->actor.draw = func_808D3754;
} else {
this->actor.draw = EnFloormas_Draw;
@@ -575,28 +565,28 @@ void func_808D19D4(EnFloormas* this) {
this->actor.flags &= ~ACTOR_FLAG_400;
this->actor.flags |= ACTOR_FLAG_200;
this->actor.colChkInfo.health = 1;
- this->actor.speedXZ = 4.0f;
+ this->actor.speed = 4.0f;
this->actor.velocity.y = 7.0f;
this->actionFunc = func_808D1B44;
}
void func_808D1B44(EnFloormas* this, PlayState* play) {
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
if (SkelAnime_Update(&this->skelAnime)) {
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->unk_194 = 50;
func_808D0C14(this);
}
- Math_StepToF(&this->actor.speedXZ, 0.0f, 1.0f);
+ Math_StepToF(&this->actor.speed, 0.0f, 1.0f);
}
- if (this->actor.bgCheckFlags & 2) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FLOORMASTER_SM_LAND);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FLOORMASTER_SM_LAND);
}
}
void func_808D1BCC(EnFloormas* this) {
Animation_PlayLoopSetSpeed(&this->skelAnime, &gWallmasterWalkAnim, 4.5f);
- this->actor.speedXZ = 5.0f;
+ this->actor.speed = 5.0f;
this->actionFunc = func_808D1C1C;
}
@@ -607,12 +597,12 @@ void func_808D1C1C(EnFloormas* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 18.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FLOORMASTER_SM_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FLOORMASTER_SM_WALK);
}
if (this->unk_194 == 0) {
func_808D1D0C(this);
- } else if (this->actor.bgCheckFlags & 8) {
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->unk_190 = this->actor.wallYaw;
func_808D108C(this);
} else if (this->actor.xzDistToPlayer < 120.0f) {
@@ -624,7 +614,7 @@ void func_808D1D0C(EnFloormas* this) {
if (this->actionFunc != func_808D1C1C) {
Animation_PlayLoopSetSpeed(&this->skelAnime, &gWallmasterWalkAnim, 4.5f);
}
- this->actor.speedXZ = 5.0f;
+ this->actor.speed = 5.0f;
this->actionFunc = func_808D1D6C;
}
@@ -634,10 +624,10 @@ void func_808D1D6C(EnFloormas* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 18.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FLOORMASTER_SM_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FLOORMASTER_SM_WALK);
}
- flags = this->actor.bgCheckFlags & 8;
+ flags = this->actor.bgCheckFlags & BGCHECKFLAG_WALL;
if (flags) {
this->unk_190 = this->actor.wallYaw;
func_808D108C(this);
@@ -651,9 +641,9 @@ void func_808D1D6C(EnFloormas* this, PlayState* play) {
return;
}
- Math_ScaledStepToS(&this->actor.shape.rot.y, Actor_YawBetweenActors(&this->actor, sp2C), 0x38E);
+ Math_ScaledStepToS(&this->actor.shape.rot.y, Actor_WorldYawTowardActor(&this->actor, sp2C), 0x38E);
- if (Actor_XZDistanceBetweenActors(&this->actor, sp2C) < 80.0f) {
+ if (Actor_WorldDistXZToActor(&this->actor, sp2C) < 80.0f) {
func_808D2484(this);
}
} else {
@@ -667,7 +657,7 @@ void func_808D1D6C(EnFloormas* this, PlayState* play) {
void func_808D1ED4(EnFloormas* this, PlayState* play) {
Vec3f sp34;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.velocity.y = 0.0f;
sp34.x = this->actor.world.pos.x;
sp34.y = this->actor.world.pos.y + 15.0f;
@@ -686,7 +676,7 @@ void func_808D1F7C(EnFloormas* this, PlayState* play) {
void func_808D1FD4(EnFloormas* this) {
Animation_Change(&this->skelAnime, &gWallmasterJumpAnim, 2.0f, 0.0f, 41.0f, ANIMMODE_ONCE, 0.0f);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = func_808D2040;
}
@@ -697,12 +687,12 @@ void func_808D2040(EnFloormas* this, PlayState* play) {
if (this->skelAnime.curFrame < 20.0f) {
Math_ApproachS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 2, 0xE38);
} else if (Animation_OnFrame(&this->skelAnime, 20.0f)) {
- this->actor.speedXZ = 5.0f;
+ this->actor.speed = 5.0f;
this->actor.velocity.y = 7.0f;
- } else if (this->actor.bgCheckFlags & 2) {
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
this->unk_18E = 50;
- this->actor.speedXZ = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FLOORMASTER_SM_LAND);
+ this->actor.speed = 0.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FLOORMASTER_SM_LAND);
func_808D1740(this);
} else if ((this->actor.playerHeightRel < -10.0f) && (this->collider.base.ocFlags1 & OC1_HIT) &&
(&player->actor == this->collider.base.oc)) {
@@ -711,12 +701,20 @@ void func_808D2040(EnFloormas* this, PlayState* play) {
}
}
+static Vec3f D_808D3900[PLAYER_FORM_MAX] = {
+ { 25.0f, 45.0f, -7.0f }, // PLAYER_FORM_FIERCE_DEITY
+ { 25.0f, 40.0f, -12.0f }, // PLAYER_FORM_GORON
+ { 25.0f, 35.0f, -2.0f }, // PLAYER_FORM_ZORA
+ { 10.0f, 20.0f, -4.0f }, // PLAYER_FORM_DEKU
+ { 15.0f, 25.0f, -2.0f }, // PLAYER_FORM_HUMAN
+};
+
void func_808D217C(EnFloormas* this, Player* player) {
Vec3f* ptr;
Animation_Change(&this->skelAnime, &gWallmasterJumpAnim, 1.0f, 36.0f, 45.0f, ANIMMODE_ONCE, -3.0f);
- this->actor.flags &= ~ACTOR_FLAG_1;
- this->actor.speedXZ = 0.0f;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ this->actor.speed = 0.0f;
this->actor.velocity.y = 0.0f;
func_808D08D0(this);
ptr = &D_808D3900[GET_PLAYER_FORM];
@@ -758,19 +756,19 @@ void func_808D22C8(EnFloormas* this, PlayState* play) {
this->actor.shape.rot.x = 0;
this->actor.velocity.y = 6.0f;
- this->actor.flags |= ACTOR_FLAG_1;
- this->actor.speedXZ = -3.0f;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
+ this->actor.speed = -3.0f;
func_808D1740(this);
} else if ((this->unk_190 % 20) == 0) {
- func_800B8E58(player, NA_SE_VO_LI_DAMAGE_S + player->ageProperties->voiceSfxIdOffset);
+ Player_PlaySfx(player, NA_SE_VO_LI_DAMAGE_S + player->ageProperties->voiceSfxIdOffset);
play->damagePlayer(play, -4);
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FLOORMASTER_SM_STICK - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FLOORMASTER_SM_STICK - SFX_FLAG);
}
void func_808D2484(EnFloormas* this) {
Animation_Change(&this->skelAnime, &gWallmasterJumpAnim, 2.0f, 0.0f, 41.0f, ANIMMODE_ONCE, 0.0f);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = func_808D24F0;
}
@@ -783,7 +781,7 @@ void func_808D24F0(EnFloormas* this, PlayState* play) {
} else if (this->actor.child->params == ENFLOORMAS_GET_7FFF_40) {
phi_s1 = this->actor.child;
} else {
- if (this->actor.bgCheckFlags & 2) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
this->actor.params = ENFLOORMAS_GET_7FFF_10;
func_808D1740(this);
}
@@ -791,24 +789,24 @@ void func_808D24F0(EnFloormas* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, 20.0f)) {
- this->actor.speedXZ = 5.0f;
+ this->actor.speed = 5.0f;
this->actor.velocity.y = 7.0f;
} else if (this->skelAnime.curFrame < 20.0f) {
- Math_ApproachS(&this->actor.shape.rot.y, Actor_YawBetweenActors(&this->actor, phi_s1), 2, 0xE38);
+ Math_ApproachS(&this->actor.shape.rot.y, Actor_WorldYawTowardActor(&this->actor, phi_s1), 2, 0xE38);
} else if (((phi_s1->world.pos.y - this->actor.world.pos.y) < -10.0f) &&
(fabsf(this->actor.world.pos.x - phi_s1->world.pos.x) < 10.0f) &&
(fabsf(this->actor.world.pos.z - phi_s1->world.pos.z) < 10.0f)) {
func_808D2A20(this);
this->collider.base.ocFlags1 |= OC1_ON;
- } else if (this->actor.bgCheckFlags & 2) {
- this->actor.speedXZ = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FLOORMASTER_SM_LAND);
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
+ this->actor.speed = 0.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FLOORMASTER_SM_LAND);
func_808D1740(this);
}
if ((fabsf(this->actor.world.pos.x - phi_s1->world.pos.x) < 5.0f) &&
(fabsf(this->actor.world.pos.z - phi_s1->world.pos.z) < 5.0f)) {
- Math_StepToF(&this->actor.speedXZ, 0.0f, 2.0f);
+ Math_StepToF(&this->actor.speed, 0.0f, 2.0f);
}
}
@@ -817,7 +815,7 @@ void func_808D2700(EnFloormas* this) {
this->unk_18E = 0;
this->unk_194 = 1500;
this->actor.params = ENFLOORMAS_GET_7FFF_40;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
func_808D08D0(this);
this->actionFunc = func_808D2764;
}
@@ -862,7 +860,7 @@ void func_808D2764(EnFloormas* this, PlayState* play) {
this->actor.scale.y = this->actor.scale.z = this->actor.scale.x;
if (((temp_f2 == 0.007f) || (temp_f2 == 0.004f)) && (temp_f2 != this->actor.scale.x)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FLOORMASTER_EXPAND);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FLOORMASTER_EXPAND);
}
this->collider.dim.radius = sCylinderInit.dim.radius * 100.0f * this->actor.scale.x;
@@ -886,7 +884,7 @@ void func_808D2764(EnFloormas* this, PlayState* play) {
}
}
- func_800B9010(&this->actor, NA_SE_EN_FLOORMASTER_RESTORE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_FLOORMASTER_RESTORE - SFX_FLAG);
}
void func_808D2A20(EnFloormas* this) {
@@ -901,7 +899,7 @@ void func_808D2A20(EnFloormas* this) {
Actor_Kill(&this->actor);
} else {
this->actor.draw = NULL;
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_10);
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_10);
this->actionFunc = func_808D2AA8;
}
}
@@ -923,8 +921,8 @@ void func_808D2AF4(EnFloormas* this, PlayState* play) {
void func_808D2B18(EnFloormas* this) {
Animation_MorphToPlayOnce(&this->skelAnime, &gWallmasterDamageAnim, -3.0f);
func_800BE504(&this->actor, &this->collider);
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 20);
- this->actor.speedXZ = 5.0f;
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 20);
+ this->actor.speed = 5.0f;
this->actor.velocity.y = 5.5f;
if (this->actor.params == ENFLOORMAS_GET_7FFF_40) {
EnFloormas* parent = (EnFloormas*)this->actor.parent;
@@ -944,7 +942,7 @@ void func_808D2B18(EnFloormas* this) {
}
void func_808D2C08(EnFloormas* this, PlayState* play) {
- if (SkelAnime_Update(&this->skelAnime) && (this->actor.bgCheckFlags & 1)) {
+ if (SkelAnime_Update(&this->skelAnime) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
if (this->actor.colChkInfo.health == 0) {
func_808D0930(this, play);
} else {
@@ -954,18 +952,18 @@ void func_808D2C08(EnFloormas* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, 13.0f)) {
if (this->actor.scale.x > 0.009f) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EYEGOLE_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_ATTACK);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EYEGOLE_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_ATTACK);
}
}
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.2f);
+ Math_StepToF(&this->actor.speed, 0.0f, 0.2f);
}
void func_808D2CDC(EnFloormas* this) {
Animation_PlayOnce(&this->skelAnime, &gWallmasterRecoverFromDamageAnim);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.velocity.y = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = func_808D2D30;
@@ -978,7 +976,7 @@ void func_808D2D30(EnFloormas* this, PlayState* play) {
}
void func_808D2D6C(EnFloormas* this) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->actor.velocity.y > 0.0f) {
this->actor.velocity.y = 0.0f;
}
@@ -1022,14 +1020,14 @@ void func_808D2E34(EnFloormas* this, PlayState* play) {
if (this->collider.base.colType != COLTYPE_HARD) {
if (!Actor_ApplyDamage(&this->actor)) {
if (this->actor.scale.x > 0.009f) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DAIOCTA_REVERSE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DAIOCTA_REVERSE);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FLOORMASTER_SM_DEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FLOORMASTER_SM_DEAD);
}
Enemy_StartFinishingBlow(play, &this->actor);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
} else if (this->actor.colChkInfo.damage != 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FALL_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FALL_DAMAGE);
}
func_808D0A48(this, play);
@@ -1044,13 +1042,15 @@ void func_808D2E34(EnFloormas* this, PlayState* play) {
func_808D2D6C(this);
} else if (this->actor.colChkInfo.damageEffect == 1) {
this->unk_18E = 40;
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 40);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA,
+ 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
func_808D2D6C(this);
} else if (this->actor.colChkInfo.damageEffect == 5) {
this->unk_18E = 40;
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 40);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA,
+ 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
this->drawDmgEffScale = 0.55f;
this->drawDmgEffAlpha = 2.0f;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_MEDIUM;
@@ -1067,8 +1067,8 @@ void func_808D2E34(EnFloormas* this, PlayState* play) {
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,
- (this->actor.scale.x > 0.009f) ? CLEAR_TAG_LARGE_LIGHT_RAYS
- : CLEAR_TAG_SMALL_LIGHT_RAYS);
+ (this->actor.scale.x > 0.009f) ? CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS)
+ : CLEAR_TAG_PARAMS(CLEAR_TAG_SMALL_LIGHT_RAYS));
}
func_808D2B18(this);
}
@@ -1085,8 +1085,8 @@ void EnFloormas_Update(Actor* thisx, PlayState* play) {
if (this->actionFunc != func_808D2AA8) {
if (this->collider.base.atFlags & AT_HIT) {
this->collider.base.atFlags &= ~AT_HIT;
- this->actor.speedXZ *= -0.5f;
- this->actor.speedXZ = CLAMP_MAX(this->actor.speedXZ, -5.0f);
+ this->actor.speed *= -0.5f;
+ this->actor.speed = CLAMP_MAX(this->actor.speed, -5.0f);
this->actor.velocity.y = 5.0f;
func_808D1740(this);
}
@@ -1102,7 +1102,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;
@@ -1137,7 +1139,7 @@ void EnFloormas_Update(Actor* thisx, PlayState* play) {
this->drawDmgEffScale = (this->drawDmgEffAlpha + 1.0f) * 0.275f;
this->drawDmgEffScale = CLAMP_MAX(this->drawDmgEffScale, 0.55f);
} else if (!Math_StepToF(&this->drawDmgEffFrozenSteamScale, 0.55f, 0.01375f)) {
- func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
}
}
@@ -1155,16 +1157,44 @@ s32 EnFloormas_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
return false;
}
+static s8 sLimbToBodyParts[WALLMASTER_LIMB_MAX] = {
+ BODYPART_NONE, // WALLMASTER_LIMB_NONE
+ BODYPART_NONE, // WALLMASTER_LIMB_ROOT
+ BODYPART_NONE, // WALLMASTER_LIMB_HAND
+ BODYPART_NONE, // WALLMASTER_LIMB_INDEX_FINGER_ROOT
+ ENFLOORMAS_BODYPART_0, // WALLMASTER_LIMB_INDEX_FINGER_PROXIMAL
+ BODYPART_NONE, // WALLMASTER_LIMB_INDEX_FINGER_DISTAL_ROOT
+ BODYPART_NONE, // WALLMASTER_LIMB_INDEX_FINGER_MIDDLE
+ ENFLOORMAS_BODYPART_1, // WALLMASTER_LIMB_INDEX_FINGER_DISTAL
+ BODYPART_NONE, // WALLMASTER_LIMB_RING_FINGER_ROOT
+ ENFLOORMAS_BODYPART_2, // WALLMASTER_LIMB_RING_FINGER_PROXIMAL
+ BODYPART_NONE, // WALLMASTER_LIMB_RING_FINGER_DISTAL_ROOT
+ BODYPART_NONE, // WALLMASTER_LIMB_RING_FINGER_MIDDLE
+ ENFLOORMAS_BODYPART_3, // WALLMASTER_LIMB_RING_FINGER_DISTAL
+ BODYPART_NONE, // WALLMASTER_LIMB_MIDDLE_FINGER_ROOT
+ ENFLOORMAS_BODYPART_4, // WALLMASTER_LIMB_MIDDLE_FINGER_PROXIMAL
+ BODYPART_NONE, // WALLMASTER_LIMB_MIDDLE_FINGER_DISTAL_ROOT
+ BODYPART_NONE, // WALLMASTER_LIMB_MIDDLE_FINGER_MIDDLE
+ ENFLOORMAS_BODYPART_5, // WALLMASTER_LIMB_MIDDLE_FINGER_DISTAL
+ BODYPART_NONE, // WALLMASTER_LIMB_WRIST_ROOT
+ BODYPART_NONE, // WALLMASTER_LIMB_WRIST
+ BODYPART_NONE, // WALLMASTER_LIMB_THUMB_ROOT
+ ENFLOORMAS_BODYPART_6, // WALLMASTER_LIMB_THUMB_PROXIMAL
+ ENFLOORMAS_BODYPART_7, // WALLMASTER_LIMB_THUMB_DISTAL_ROOT
+ BODYPART_NONE, // WALLMASTER_LIMB_THUMB_MIDDLE
+ ENFLOORMAS_BODYPART_8, // WALLMASTER_LIMB_THUMB_DISTAL
+};
+
void EnFloormas_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx, Gfx** gfx) {
EnFloormas* this = THIS;
- if (D_808D393C[limbIndex] != -1) {
- Matrix_MultZero(&this->limbPos[D_808D393C[limbIndex]]);
+ if (sLimbToBodyParts[limbIndex] != BODYPART_NONE) {
+ Matrix_MultZero(&this->bodyPartsPos[sLimbToBodyParts[limbIndex]]);
}
if (limbIndex == WALLMASTER_LIMB_WRIST) {
- Matrix_MultVecX(1000.0f, &this->limbPos[9]);
- Matrix_MultVecX(-1000.0f, &this->limbPos[10]);
+ Matrix_MultVecX(1000.0f, &this->bodyPartsPos[ENFLOORMAS_BODYPART_9]);
+ Matrix_MultVecX(-1000.0f, &this->bodyPartsPos[ENFLOORMAS_BODYPART_10]);
} else if (limbIndex == WALLMASTER_LIMB_HAND) {
Matrix_Push();
Matrix_Translate(1600.0f, -700.0f, -1700.0f, MTXMODE_APPLY);
@@ -1179,12 +1209,14 @@ void EnFloormas_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
}
}
+static Color_RGBA8 D_808D3958 = { 0, 255, 0, 0 };
+
void EnFloormas_Draw(Actor* thisx, PlayState* play) {
EnFloormas* this = THIS;
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);
}
@@ -1198,7 +1230,7 @@ void EnFloormas_Draw(Actor* thisx, PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx);
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos),
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, ENFLOORMAS_BODYPART_MAX,
100.0f * (this->drawDmgEffScale * this->actor.scale.x),
100.0f * (this->drawDmgEffFrozenSteamScale * this->actor.scale.x), this->drawDmgEffAlpha,
this->drawDmgEffType);
@@ -1209,7 +1241,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);
}
@@ -1223,7 +1255,7 @@ void func_808D3754(Actor* thisx, PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx);
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos),
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, ENFLOORMAS_BODYPART_MAX,
this->drawDmgEffScale * this->actor.scale.x * 100.0f,
this->drawDmgEffFrozenSteamScale * this->actor.scale.x * 100.0f, this->drawDmgEffAlpha,
this->drawDmgEffType);
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..ac9b1954e 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,27 @@ 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 enum EnFloormasBodyPart {
+ /* 0 */ ENFLOORMAS_BODYPART_0,
+ /* 1 */ ENFLOORMAS_BODYPART_1,
+ /* 2 */ ENFLOORMAS_BODYPART_2,
+ /* 3 */ ENFLOORMAS_BODYPART_3,
+ /* 4 */ ENFLOORMAS_BODYPART_4,
+ /* 5 */ ENFLOORMAS_BODYPART_5,
+ /* 6 */ ENFLOORMAS_BODYPART_6,
+ /* 7 */ ENFLOORMAS_BODYPART_7,
+ /* 8 */ ENFLOORMAS_BODYPART_8,
+ /* 9 */ ENFLOORMAS_BODYPART_9,
+ /* 10 */ ENFLOORMAS_BODYPART_10,
+ /* 11 */ ENFLOORMAS_BODYPART_MAX
+} EnFloormasBodyPart;
typedef struct EnFloormas {
/* 0x000 */ Actor actor;
@@ -32,7 +47,7 @@ typedef struct EnFloormas {
/* 0x2C4 */ f32 drawDmgEffAlpha;
/* 0x2C8 */ f32 drawDmgEffScale;
/* 0x2CC */ f32 drawDmgEffFrozenSteamScale;
- /* 0x2D0 */ Vec3f limbPos[11];
+ /* 0x2D0 */ Vec3f bodyPartsPos[ENFLOORMAS_BODYPART_MAX];
/* 0x354 */ ColliderCylinder collider;
} EnFloormas; // size = 0x3A0
diff --git a/src/overlays/actors/ovl_En_Fr/z_en_fr.c b/src/overlays/actors/ovl_En_Fr/z_en_fr.c
index 0b645b302..07e4d60b9 100644
--- a/src/overlays/actors/ovl_En_Fr/z_en_fr.c
+++ b/src/overlays/actors/ovl_En_Fr/z_en_fr.c
@@ -29,7 +29,7 @@ ActorInit En_Fr_InitVars = {
void EnFr_Init(Actor* thisx, PlayState* play) {
EnFr* this = THIS;
- if (Flags_GetSwitch(play, ENFR_GET_SWITCHFLAG(&this->actor))) {
+ if (Flags_GetSwitch(play, ENFR_GET_SWITCH_FLAG(&this->actor))) {
Actor_Kill(&this->actor);
return;
}
@@ -43,7 +43,7 @@ void EnFr_Destroy(Actor* thisx, PlayState* play) {
void EnFr_Update(Actor* thisx, PlayState* play) {
EnFr* this = THIS;
- if (Flags_GetSwitch(play, ENFR_GET_SWITCHFLAG(&this->actor))) {
+ if (Flags_GetSwitch(play, ENFR_GET_SWITCH_FLAG(&this->actor))) {
Actor_Kill(&this->actor);
return;
}
diff --git a/src/overlays/actors/ovl_En_Fr/z_en_fr.h b/src/overlays/actors/ovl_En_Fr/z_en_fr.h
index 27682ce40..0227608fb 100644
--- a/src/overlays/actors/ovl_En_Fr/z_en_fr.h
+++ b/src/overlays/actors/ovl_En_Fr/z_en_fr.h
@@ -5,7 +5,7 @@
struct EnFr;
-#define ENFR_GET_SWITCHFLAG(thisx) ((thisx)->params & 0x7F)
+#define ENFR_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
#define ENFR_GET_TARGETMODE(thisx) (((thisx)->params >> 7) & 0xF)
typedef struct EnFr {
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 0fa23e71a..ec8c09b71 100644
--- a/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c
+++ b/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c
@@ -7,7 +7,7 @@
#include "z_en_fsn.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnFsn*)thisx)
@@ -52,6 +52,18 @@ typedef enum {
/* 2 */ ENFSN_CUTSCENESTATE_PLAYING
} EnFsnCutsceneState;
+ActorInit En_Fsn_InitVars = {
+ ACTOR_EN_FSN,
+ ACTORCAT_NPC,
+ FLAGS,
+ OBJECT_FSN,
+ sizeof(EnFsn),
+ (ActorFunc)EnFsn_Init,
+ (ActorFunc)EnFsn_Destroy,
+ (ActorFunc)EnFsn_Update,
+ (ActorFunc)EnFsn_Draw,
+};
+
typedef enum {
/* 0 */ FSN_ANIM_IDLE,
/* 1 */ FSN_ANIM_SCRATCH_BACK,
@@ -69,32 +81,20 @@ typedef enum {
/* 13 */ FSN_ANIM_MAX
} FsnAnimation;
-ActorInit En_Fsn_InitVars = {
- ACTOR_EN_FSN,
- ACTORCAT_NPC,
- FLAGS,
- OBJECT_FSN,
- sizeof(EnFsn),
- (ActorFunc)EnFsn_Init,
- (ActorFunc)EnFsn_Destroy,
- (ActorFunc)EnFsn_Update,
- (ActorFunc)EnFsn_Draw,
-};
-
-static AnimationInfoS sAnimationInfo[] = {
- { &gFsnIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &gFsnScratchBackAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &gFsnTurnAroundAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gFsnTurnAroundAnim, -1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gFsnHandsOnCounterStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gFsnHandsOnCounterLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &gFsnHandOnFaceStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gFsnHandOnFaceLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &gFsnLeanForwardStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gFsnLeanForwardLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &gFsnSlamCounterStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gFsnSlamCounterLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &gFsnMakeOfferAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+static AnimationInfoS sAnimationInfo[FSN_ANIM_MAX] = {
+ { &gFsnIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // FSN_ANIM_IDLE
+ { &gFsnScratchBackAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // FSN_ANIM_SCRATCH_BACK
+ { &gFsnTurnAroundAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // FSN_ANIM_TURN_AROUND_FORWARD
+ { &gFsnTurnAroundAnim, -1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // FSN_ANIM_TURN_AROUND_REVERSE
+ { &gFsnHandsOnCounterStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // FSN_ANIM_HANDS_ON_COUNTER_START
+ { &gFsnHandsOnCounterLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // FSN_ANIM_HANDS_ON_COUNTER_LOOP
+ { &gFsnHandOnFaceStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // FSN_ANIM_HAND_ON_FACE_START
+ { &gFsnHandOnFaceLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // FSN_ANIM_HAND_ON_FACE_LOOP
+ { &gFsnLeanForwardStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // FSN_ANIM_LEAN_FORWARD_START
+ { &gFsnLeanForwardLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // FSN_ANIM_LEAN_FORWARD_LOOP
+ { &gFsnSlamCounterStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // FSN_ANIM_SLAM_COUNTER_START
+ { &gFsnSlamCounterLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // FSN_ANIM_SLAM_COUNTER_LOOP
+ { &gFsnMakeOfferAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // FSN_ANIM_MAKE_OFFER
};
static ColliderCylinderInit sCylinderInit = {
@@ -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->textboxEndType == TEXTBOX_ENDTYPE_10) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_11)) {
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,66 +157,74 @@ 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);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
if (ENFSN_IS_SHOP(&this->actor)) {
this->actor.textId = 0;
}
@@ -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);
}
}
}
@@ -283,14 +295,14 @@ void EnFsn_CursorLeftRight(EnFsn* this) {
this->cursorIndex = cursorScan;
break;
} else if (cursorScan == 0) {
- play_sound(NA_SE_SY_CURSOR);
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
this->drawCursor = 0;
this->actionFunc = EnFsn_LookToShopkeeperFromShelf;
break;
}
}
} else {
- play_sound(NA_SE_SY_CURSOR);
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
this->drawCursor = 0;
this->actionFunc = EnFsn_LookToShopkeeperFromShelf;
if (this->itemIds[cursorScan] != -1) {
@@ -300,9 +312,10 @@ void EnFsn_CursorLeftRight(EnFsn* this) {
}
}
-s16 EnFsn_GetThirdDayItemId(void) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_33_04) && CURRENT_DAY == 3) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_33_08) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_79_40)) {
+s16 EnFsn_GetSpecialItemId(void) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_BOUGHT_CURIOSITY_SHOP_SPECIAL_ITEM) && (CURRENT_DAY == 3)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_RECOVERED_STOLEN_BOMB_BAG) &&
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_SAKON_DEAD)) {
return SI_BOMB_BAG_30_1;
}
return SI_MASK_ALL_NIGHT;
@@ -314,16 +327,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) {
@@ -335,7 +354,7 @@ s32 EnFsn_HasItemsToSell(void) {
}
if ((STOLEN_ITEM_1 != STOLEN_ITEM_NONE) || (STOLEN_ITEM_2 != STOLEN_ITEM_NONE) ||
- !CHECK_WEEKEVENTREG(WEEKEVENTREG_33_04)) {
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_BOUGHT_CURIOSITY_SHOP_SPECIAL_ITEM)) {
return true;
}
@@ -350,7 +369,7 @@ void EnFsn_GetShopItemIds(EnFsn* this) {
this->stolenItem1 = this->stolenItem2 = 0;
this->itemIds[0] = this->itemIds[1] = this->itemIds[2] = 0;
- itemId = EnFsn_GetThirdDayItemId();
+ itemId = EnFsn_GetSpecialItemId();
this->itemIds[this->totalSellingItems] = itemId;
if (itemId != SI_NONE) {
this->totalSellingItems++;
@@ -387,11 +406,11 @@ 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);
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
this->drawCursor = 0;
@@ -407,7 +426,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;
}
@@ -417,7 +436,7 @@ s32 EnFsn_TestEndInteraction(EnFsn* this, PlayState* play, Input* input) {
s32 EnFsn_TestCancelOption(EnFsn* this, PlayState* play, Input* input) {
if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
this->actionFunc = this->prevActionFunc;
- func_80151938(play, this->items[this->cursorIndex]->actor.textId);
+ Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
return true;
}
return false;
@@ -438,27 +457,31 @@ void EnFsn_UpdateCursorPos(EnFsn* this, PlayState* play) {
s32 EnFsn_FacingShopkeeperDialogResult(EnFsn* this, PlayState* play) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
if (CURRENT_DAY != 3) {
this->actor.textId = 0x29FB;
- } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_33_04)) {
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_BOUGHT_CURIOSITY_SHOP_SPECIAL_ITEM)) {
this->actor.textId = 0x29FF;
- } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_33_08) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_79_40)) {
+ } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_RECOVERED_STOLEN_BOMB_BAG) &&
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_SAKON_DEAD)) {
this->actor.textId = 0x29D7;
} else {
this->actor.textId = 0x29D8;
}
Message_StartTextbox(play, this->actor.textId, &this->actor);
return true;
+
case 1:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
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) {
@@ -468,14 +491,14 @@ s32 EnFsn_HasPlayerSelectedItem(EnFsn* this, PlayState* play, Input* input) {
if (EnFsn_TestItemSelected(play)) {
if (!this->items[this->cursorIndex]->isOutOfStock) {
this->prevActionFunc = this->actionFunc;
- func_80151938(play, this->items[this->cursorIndex]->choiceTextId);
- play_sound(NA_SE_SY_DECIDE);
+ Message_ContinueTextbox(play, this->items[this->cursorIndex]->choiceTextId);
+ Audio_PlaySfx(NA_SE_SY_DECIDE);
this->stickLeftPrompt.isEnabled = false;
this->stickRightPrompt.isEnabled = false;
this->drawCursor = 0;
this->actionFunc = EnFsn_SelectItem;
} else {
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
}
return true;
}
@@ -487,10 +510,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 +526,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;
@@ -722,8 +745,9 @@ void EnFsn_Idle(EnFsn* this, PlayState* play) {
if (this->animIndex == FSN_ANIM_HANDS_ON_COUNTER_START) {
s16 curFrame = this->skelAnime.curFrame;
- s16 frameCount = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
- if (curFrame == frameCount) {
+ s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
+
+ if (curFrame == endFrame) {
this->animIndex = FSN_ANIM_HANDS_ON_COUNTER_LOOP;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex);
}
@@ -737,11 +761,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);
@@ -752,21 +776,21 @@ void EnFsn_Idle(EnFsn* this, PlayState* play) {
} else if (((player->actor.world.pos.x >= -50.0f) && (player->actor.world.pos.x <= 15.0f)) &&
(player->actor.world.pos.y > 0.0f) &&
((player->actor.world.pos.z >= -35.0f) && (player->actor.world.pos.z <= -20.0f))) {
- func_800B8614(&this->actor, play, 400.0f);
+ Actor_OfferTalk(&this->actor, play, 400.0f);
}
}
void EnFsn_Haggle(EnFsn* this, PlayState* play) {
s16 curFrame = this->skelAnime.curFrame;
- s16 frameCount = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
+ s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
if (this->flags & ENFSN_ANGRY) {
this->flags &= ~ENFSN_ANGRY;
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)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_HANKO);
+ 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) {
this->flags &= ~ENFSN_CALM_DOWN;
@@ -778,12 +802,12 @@ void EnFsn_Haggle(EnFsn* this, PlayState* play) {
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex);
} else {
if (this->animIndex == FSN_ANIM_MAKE_OFFER) {
- if (curFrame == frameCount) {
+ if (curFrame == endFrame) {
this->animIndex = FSN_ANIM_HANDS_ON_COUNTER_LOOP;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex);
} else {
if (Animation_OnFrame(&this->skelAnime, 28.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_HANKO);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_HANKO);
}
return;
}
@@ -797,8 +821,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 +836,7 @@ void EnFsn_BeginInteraction(EnFsn* this, PlayState* play) {
this->actionFunc = EnFsn_SetupEndInteractionImmediately;
}
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
}
@@ -828,20 +852,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;
+ player->exchangeItemAction = PLAYER_IA_NONE;
this->actionFunc = EnFsn_SetupDeterminePrice;
break;
+
+ default:
+ break;
}
}
}
@@ -860,16 +890,19 @@ void EnFsn_AskBuyOrSell(EnFsn* this, PlayState* play) {
}
Message_StartTextbox(play, this->actor.textId, &this->actor);
break;
+
case 0x29D2:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_33_04)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_BOUGHT_CURIOSITY_SHOP_SPECIAL_ITEM)) {
this->actor.textId = 0x2A01;
- } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_33_08) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_79_40)) {
+ } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_RECOVERED_STOLEN_BOMB_BAG) &&
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_SAKON_DEAD)) {
this->actor.textId = 0x29D3;
} else {
this->actor.textId = 0x29D4;
}
Message_StartTextbox(play, this->actor.textId, &this->actor);
break;
+
case 0x29D3:
case 0x29D4:
case 0x29FA:
@@ -877,6 +910,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) {
@@ -884,7 +920,7 @@ void EnFsn_AskBuyOrSell(EnFsn* this, PlayState* play) {
if (!EnFsn_TestEndInteraction(this, play, CONTROLLER1(&play->state)) && Message_ShouldAdvance(play)) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
this->isSelling = true;
this->stickLeftPrompt.isEnabled = false;
this->stickRightPrompt.isEnabled = true;
@@ -892,14 +928,18 @@ void EnFsn_AskBuyOrSell(EnFsn* this, PlayState* play) {
Message_StartTextbox(play, this->actor.textId, &this->actor);
this->actionFunc = EnFsn_FaceShopkeeperSelling;
break;
+
case 1:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
this->isSelling = false;
this->actor.textId = 0x29CE;
EnFsn_HandleLookToShopkeeperBuyingCutscene(this);
Message_StartTextbox(play, this->actor.textId, &this->actor);
this->actionFunc = EnFsn_StartBuying;
break;
+
+ default:
+ break;
}
}
}
@@ -923,17 +963,17 @@ void EnFsn_DeterminePrice(EnFsn* this, PlayState* play) {
if (itemAction > PLAYER_IA_NONE) {
buttonItem = GET_CUR_FORM_BTN_ITEM(player->heldItemButton);
- this->price = (buttonItem < ITEM_MOON_TEAR) ? gItemPrices[buttonItem] : 0;
+ this->price = (buttonItem < ITEM_MOONS_TEAR) ? gItemPrices[buttonItem] : 0;
if (this->price > 0) {
player->actor.textId = 0x29EF;
- player->exchangeItemId = buttonItem;
+ player->exchangeItemAction = buttonItem;
this->actionFunc = EnFsn_MakeOffer;
} else {
player->actor.textId = 0x29CF;
this->actionFunc = EnFsn_StartBuying;
}
this->actor.textId = player->actor.textId;
- func_801477B4(play);
+ Message_CloseTextbox(play);
} else if (itemAction <= PLAYER_IA_MINUS1) {
if (CURRENT_DAY == 3) {
this->actor.textId = 0x29DF;
@@ -941,7 +981,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;
}
}
@@ -954,35 +994,43 @@ void EnFsn_MakeOffer(EnFsn* this, PlayState* play) {
if (talkState == TEXT_STATE_CHOICE && Message_ShouldAdvance(play)) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
- play->msgCtx.msgMode = 0x43;
+ Audio_PlaySfx_MessageDecide();
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
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;
+ Audio_PlaySfx_MessageCancel();
+ player->exchangeItemAction = PLAYER_IA_NONE;
this->actionFunc = EnFsn_SetupDeterminePrice;
break;
}
@@ -992,24 +1040,24 @@ 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) {
- Actor_PickUp(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f);
} else {
- Actor_PickUp(&this->actor, play, this->getItemId, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, this->getItemId, 300.0f, 300.0f);
}
}
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,31 +1069,31 @@ 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);
this->actionFunc = EnFsn_ConverseBackroom;
}
} else {
- func_800B85E0(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
}
}
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 +1106,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;
- func_80151938(play, this->items[this->cursorIndex]->actor.textId);
+ Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
}
@@ -1107,8 +1155,8 @@ void EnFsn_BrowseShelf(EnFsn* this, PlayState* play) {
if (!EnFsn_HasPlayerSelectedItem(this, play, CONTROLLER1(&play->state))) {
EnFsn_CursorLeftRight(this);
if (this->cursorIndex != prevCursorIdx) {
- play_sound(NA_SE_SY_CURSOR);
- func_80151938(play, this->items[this->cursorIndex]->actor.textId);
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
+ Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
}
}
}
@@ -1117,24 +1165,24 @@ 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;
this->actor.textId = 0x29D6;
- func_80151938(play, this->actor.textId);
+ Message_ContinueTextbox(play, this->actor.textId);
this->actionFunc = EnFsn_FaceShopkeeperSelling;
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
}
@@ -1144,18 +1192,19 @@ void EnFsn_HandleCanPlayerBuyItem(EnFsn* this, PlayState* play) {
switch (item->canBuyFunc(play, item)) {
case CANBUY_RESULT_SUCCESS_2:
- func_8019F208();
- SET_WEEKEVENTREG(WEEKEVENTREG_33_04);
+ Audio_PlaySfx_MessageDecide();
+ SET_WEEKEVENTREG(WEEKEVENTREG_BOUGHT_CURIOSITY_SHOP_SPECIAL_ITEM);
+ // 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();
+ Audio_PlaySfx_MessageDecide();
item = this->items[this->cursorIndex];
item->buyFanfareFunc(play, item);
- Actor_PickUp(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f);
- play->msgCtx.msgMode = 0x43;
+ Actor_OfferGetItem(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f);
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
this->drawCursor = 0;
@@ -1171,16 +1220,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);
- func_80151938(play, 0x29F0);
+ Audio_PlaySfx(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);
- func_80151938(play, 0x29DD);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
+ Message_ContinueTextbox(play, 0x29DD);
this->actionFunc = EnFsn_PlayerCannotBuy;
break;
+
+ default:
+ break;
}
}
@@ -1189,10 +1243,10 @@ 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;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
}
} else {
@@ -1211,10 +1265,15 @@ void EnFsn_SelectItem(EnFsn* this, PlayState* play) {
case 0:
EnFsn_HandleCanPlayerBuyItem(this, play);
break;
+
case 1:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
this->actionFunc = this->prevActionFunc;
- func_80151938(play, this->items[this->cursorIndex]->actor.textId);
+ Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
+ break;
+
+ default:
+ break;
}
}
}
@@ -1223,7 +1282,7 @@ void EnFsn_SelectItem(EnFsn* this, PlayState* play) {
void EnFsn_PlayerCannotBuy(EnFsn* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
this->actionFunc = this->prevActionFunc;
- func_80151938(play, this->items[this->cursorIndex]->actor.textId);
+ Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
}
}
@@ -1231,40 +1290,44 @@ 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) {
if (Message_ShouldAdvance(play)) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
this->actor.textId = 0xFF;
Message_StartTextbox(play, this->actor.textId, &this->actor);
this->actionFunc = EnFsn_DeterminePrice;
break;
+
case 1:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
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;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
}
} else {
@@ -1277,41 +1340,45 @@ 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) {
if (Message_ShouldAdvance(play)) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
this->isSelling = false;
this->actor.textId = 0x29CE;
Message_StartTextbox(play, this->actor.textId, &this->actor);
this->actionFunc = EnFsn_StartBuying;
break;
+
case 1:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
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;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
}
} else {
@@ -1335,12 +1402,13 @@ void EnFsn_FaceShopkeeperSelling(EnFsn* this, PlayState* play) {
this->actionFunc = EnFsn_LookToShelf;
func_8011552C(play, DO_ACTION_DECIDE);
this->stickRightPrompt.isEnabled = false;
- play_sound(NA_SE_SY_CURSOR);
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
}
}
} else if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
this->actor.textId = 0x29D6;
Message_StartTextbox(play, this->actor.textId, &this->actor);
+ //! FAKE:
if (play) {}
}
}
@@ -1356,8 +1424,8 @@ void EnFsn_IdleBackroom(EnFsn* this, PlayState* play) {
this->textId = 0;
EnFsn_HandleConversationBackroom(this, play);
this->actionFunc = EnFsn_ConverseBackroom;
- } else if (this->actor.xzDistToPlayer < 100.0f || this->actor.isTargeted) {
- func_800B8614(&this->actor, play, 100.0f);
+ } else if (this->actor.xzDistToPlayer < 100.0f || this->actor.isLockedOn) {
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
}
@@ -1365,12 +1433,12 @@ void EnFsn_ConverseBackroom(EnFsn* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
if (this->flags & ENFSN_END_CONVERSATION) {
this->flags &= ~ENFSN_END_CONVERSATION;
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->actionFunc = EnFsn_IdleBackroom;
} else if (this->flags & ENFSN_GIVE_ITEM) {
this->flags &= ~ENFSN_GIVE_ITEM;
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->actionFunc = EnFsn_GiveItem;
} else {
@@ -1380,10 +1448,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) {
@@ -1406,17 +1474,16 @@ void EnFsn_Init(Actor* thisx, PlayState* play) {
EnFsn* this = THIS;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 20.0f);
-
- // Note: adding 1 to FSN_LIMB_MAX due to bug in object_fsn, see bug in object_fsn.xml
SkelAnime_InitFlex(play, &this->skelAnime, &gFsnSkel, &gFsnIdleAnim, this->jointTable, this->morphTable,
- FSN_LIMB_MAX + 1);
+ ENFSN_LIMB_MAX);
+
if (ENFSN_IS_SHOP(&this->actor)) {
this->actor.shape.rot.y = BINANG_ROT180(this->actor.shape.rot.y);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
EnFsn_GetCutscenes(this);
EnFsn_InitShop(this, play);
} else {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_33_08) || CHECK_WEEKEVENTREG(WEEKEVENTREG_79_40)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_RECOVERED_STOLEN_BOMB_BAG) || CHECK_WEEKEVENTREG(WEEKEVENTREG_SAKON_DEAD)) {
Actor_Kill(&this->actor);
return;
}
@@ -1424,8 +1491,8 @@ void EnFsn_Init(Actor* thisx, PlayState* play) {
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
this->blinkTimer = 20;
this->eyeTexIndex = 0;
- this->actor.flags |= ACTOR_FLAG_1;
- this->actor.targetMode = 0;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
+ this->actor.targetMode = TARGET_MODE_0;
this->animIndex = FSN_ANIM_IDLE;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex);
this->actionFunc = EnFsn_IdleBackroom;
@@ -1444,7 +1511,7 @@ void EnFsn_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
Actor_TrackPlayer(play, &this->actor, &this->headRot, &this->unk27A, this->actor.focus.pos);
- SubS_FillLimbRotTables(play, this->limbRotYTable, this->limbRotZTable, ARRAY_COUNT(this->limbRotYTable));
+ SubS_UpdateFidgetTables(play, this->fidgetTableY, this->fidgetTableZ, ENFSN_LIMB_MAX);
EnFsn_Blink(this);
if (ENFSN_IS_SHOP(&this->actor) && EnFsn_HasItemsToSell()) {
EnFsn_UpdateJoystickInputState(this, play);
@@ -1470,7 +1537,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 +1594,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,
@@ -1566,7 +1633,7 @@ void EnFsn_DrawStickDirectionPrompts(EnFsn* this, PlayState* play) {
s32 EnFsn_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnFsn* this = THIS;
- s32 limbRotTableIdx;
+ s32 fidgetIndex;
if (limbIndex == FSN_LIMB_HEAD) {
Matrix_RotateXS(this->headRot.y, MTXMODE_APPLY);
@@ -1574,21 +1641,24 @@ s32 EnFsn_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
if (ENFSN_IS_BACKROOM(&this->actor)) {
switch (limbIndex) {
case FSN_LIMB_TORSO:
- limbRotTableIdx = 0;
+ fidgetIndex = 0;
break;
+
case FSN_LIMB_LEFT_HAND:
- limbRotTableIdx = 1;
+ fidgetIndex = 1;
break;
+
case FSN_LIMB_HEAD:
- limbRotTableIdx = 2;
+ fidgetIndex = 2;
break;
+
default:
- limbRotTableIdx = 9;
+ fidgetIndex = 9;
break;
}
- if (limbRotTableIdx < 9) {
- rot->y += (s16)(Math_SinS(this->limbRotYTable[limbRotTableIdx]) * 200.0f);
- rot->z += (s16)(Math_CosS(this->limbRotZTable[limbRotTableIdx]) * 200.0f);
+ if (fidgetIndex < 9) {
+ rot->y += (s16)(Math_SinS(this->fidgetTableY[fidgetIndex]) * 200.0f);
+ rot->z += (s16)(Math_CosS(this->fidgetTableZ[fidgetIndex]) * 200.0f);
}
}
if (limbIndex == FSN_LIMB_TOUPEE) {
@@ -1622,7 +1692,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..22133322e 100644
--- a/src/overlays/actors/ovl_En_Fsn/z_en_fsn.h
+++ b/src/overlays/actors/ovl_En_Fsn/z_en_fsn.h
@@ -13,6 +13,8 @@
#define ENFSN_ANGRY (1 << 8)
#define ENFSN_CALM_DOWN (1 << 9)
+#define ENFSN_LIMB_MAX FSN_LIMB_MAX + 1 // Note: adding 1 to FSN_LIMB_MAX due to bug in the skeleton, see bug in object_fsn.xml
+
struct EnFsn;
typedef void (*EnFsnActionFunc)(struct EnFsn*, PlayState*);
@@ -24,20 +26,20 @@ typedef struct EnFsn {
/* 0x1D4 */ EnFsnActionFunc actionFunc;
/* 0x1D8 */ EnFsnActionFunc prevActionFunc; // Used to return to correct browsing function
/* 0x1DC */ ColliderCylinder collider;
- /* 0x228 */ s16 limbRotYTable[19];
- /* 0x24E */ s16 limbRotZTable[19];
+ /* 0x228 */ s16 fidgetTableY[ENFSN_LIMB_MAX];
+ /* 0x24E */ s16 fidgetTableZ[ENFSN_LIMB_MAX];
/* 0x274 */ Vec3s headRot;
/* 0x27A */ Vec3s unk27A; // Set but never used
- /* 0x280 */ Vec3s jointTable[FSN_LIMB_MAX + 1]; // Note: adding 1 to FSN_LIMB_MAX due to bug in object_fsn, see bug in object_fsn.xml
- /* 0x2F2 */ Vec3s morphTable[FSN_LIMB_MAX + 1];
+ /* 0x280 */ Vec3s jointTable[ENFSN_LIMB_MAX];
+ /* 0x2F2 */ Vec3s morphTable[ENFSN_LIMB_MAX];
/* 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 f43d24432..6a68f283a 100644
--- a/src/overlays/actors/ovl_En_Fu/z_en_fu.c
+++ b/src/overlays/actors/ovl_En_Fu/z_en_fu.c
@@ -9,10 +9,10 @@
#include "overlays/actors/ovl_En_Fu_Kago/z_en_fu_kago.h"
#include "overlays/actors/ovl_Bg_Fu_Kaiten/z_bg_fu_kaiten.h"
#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
-#include "objects/object_mu/object_mu.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_2000000 | ACTOR_FLAG_8000000)
+#define FLAGS \
+ (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_2000000 | ACTOR_FLAG_CANT_LOCK_ON)
#define THIS ((EnFu*)thisx)
@@ -73,13 +73,31 @@ static Vec3f D_80964B0C = { 0.0f, 60.0f, -8.0f };
static Vec3f D_80964B18 = { 0.0f, 55.0f, 12.0f };
static Vec3f D_80964B24 = { 0.0f, 60.0f, 0.0f };
-static AnimationInfo sAnimationInfo[] = {
+typedef enum {
+ /* 0 */ HONEY_DARLING_ANIM_IDLE,
+ /* 1 */ HONEY_DARLING_ANIM_CUP_CHEEKS,
+ /* 2 */ HONEY_DARLING_ANIM_HUG,
+ /* 3 */ HONEY_DARLING_ANIM_GAME_DANCE,
+ /* 4 */ HONEY_DARLING_ANIM_HOLD_HANDS_MORPH,
+ /* 5 */ HONEY_DARLING_ANIM_HOLD_HANDS,
+ /* 6 */ HONEY_DARLING_ANIM_SURPRISE,
+ /* 7 */ HONEY_DARLING_ANIM_MAX
+} HoneyAndDarlingAnimation;
+
+static AnimationInfo sAnimationInfo[HONEY_DARLING_ANIM_MAX] = {
+ // HONEY_DARLING_ANIM_IDLE
{ &gHoneyAndDarlingIdleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
+ // HONEY_DARLING_ANIM_CUP_CHEEKS
{ &gHoneyAndDarlingCupCheeksLoopAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
+ // HONEY_DARLING_ANIM_HUG
{ &gHoneyAndDarlingHugLoopAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
+ // HONEY_DARLING_ANIM_GAME_DANCE
{ &gHoneyAndDarlingGameDanceLoopAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f },
+ // HONEY_DARLING_ANIM_HOLD_HANDS_MORPH
{ &gHoneyAndDarlingHoldHandsLoopAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
+ // HONEY_DARLING_ANIM_HOLD_HANDS
{ &gHoneyAndDarlingHoldHandsLoopAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f },
+ // HONEY_DARLING_ANIM_SURPRISE
{ &gHoneyAndDarlingSurpiseAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f },
};
@@ -111,7 +129,7 @@ void func_809616E0(EnFu* this, PlayState* play) {
s16 spA0 = false;
Vec3f sp94;
- if ((gSaveContext.save.playerForm == PLAYER_FORM_DEKU) && (CURRENT_DAY == 3)) {
+ if ((GET_PLAYER_FORM == PLAYER_FORM_DEKU) && (CURRENT_DAY == 3)) {
spA0 = true;
}
this->unk_54C = 0;
@@ -171,7 +189,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;
@@ -200,7 +218,7 @@ void EnFu_Init(Actor* thisx, PlayState* play) {
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
Actor_SetScale(&this->actor, 0.01f);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.gravity = -0.2f;
this->actor.shape.rot.y += 0x4000;
this->actor.world.rot = this->actor.shape.rot;
@@ -213,7 +231,7 @@ void EnFu_Init(Actor* thisx, PlayState* play) {
this->unk_54E = 0;
this->unk_550 = 0;
func_809622FC(this);
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
func_809619D0(this, play);
if (CURRENT_DAY == 2) {
Vec3f sp40 = this->actor.child->home.pos;
@@ -229,7 +247,7 @@ void EnFu_Init(Actor* thisx, PlayState* play) {
void EnFu_Destroy(Actor* thisx, PlayState* play) {
EnFu* this = THIS;
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_01);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_08_01);
Collider_DestroyCylinder(play, &this->collider);
}
@@ -254,7 +272,7 @@ void func_80961D7C(PlayState* play) {
Actor* explosive = play->actorCtx.actorLists[ACTORCAT_EXPLOSIVES].first;
while (explosive != NULL) {
- if ((explosive->id == ACTOR_EN_BOM) && (explosive->bgCheckFlags & 1)) {
+ if ((explosive->id == ACTOR_EN_BOM) && (explosive->bgCheckFlags & BGCHECKFLAG_GROUND)) {
EnBom* bomb = (EnBom*)explosive;
if (bomb->actor.floorBgId != BGCHECK_SCENE) {
@@ -371,7 +389,7 @@ void func_8096209C(EnFu* this, PlayState* play) {
}
void func_809622FC(EnFu* this) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HONEY_DARLING_ANIM_CUP_CHEEKS);
this->actionFunc = func_80962340;
}
@@ -385,7 +403,7 @@ void func_80962340(EnFu* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
if (this->unk_54A == 2) {
if (this->unk_552 == 0x287D) {
- if (gSaveContext.save.playerForm == PLAYER_FORM_DEKU) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_DEKU) {
Message_StartTextbox(play, 0x287E, &this->actor);
this->unk_552 = 0x287E;
} else if ((CURRENT_DAY == 3) && CHECK_WEEKEVENTREG(WEEKEVENTREG_22_10) &&
@@ -418,31 +436,32 @@ void func_80962340(EnFu* this, PlayState* play) {
}
func_809628BC(this);
} else if (this->unk_54A == 2) {
- func_800B8614(&this->actor, play, 500.0f);
+ Actor_OfferTalk(&this->actor, play, 500.0f);
} else {
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
Math_SmoothStepToS(&this->actor.shape.rot.y, BINANG_SUB(this->actor.child->shape.rot.y, 0x4000), 10, 3000, 100);
}
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) {
+ Audio_PlaySfx_MessageDecide();
+ Rupees_ChangeBy(-10);
+ func_80963DE4(this, play);
} else {
- func_8019F230();
- Message_StartTextbox(play, 0x2872, &this->actor);
- this->unk_552 = 0x2872;
+ Audio_PlaySfx(NA_SE_SY_ERROR);
+ Message_StartTextbox(play, 0x2873, &this->actor);
+ this->unk_552 = 0x2873;
}
+ } else {
+ Audio_PlaySfx_MessageCancel();
+ Message_StartTextbox(play, 0x2872, &this->actor);
+ this->unk_552 = 0x2872;
}
}
@@ -532,13 +551,13 @@ void func_80962660(EnFu* this, PlayState* play) {
break;
case 0x287D:
- SET_WEEKEVENTREG(WEEKEVENTREG_63_01);
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_02);
- func_801477B4(play);
+ SET_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED);
+ Message_CloseTextbox(play);
player->stateFlags1 |= PLAYER_STATE1_20;
this->unk_53C = 0;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
- func_801A2BB8(NA_BGM_TIMED_MINI_GAME);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HONEY_DARLING_ANIM_GAME_DANCE);
+ Audio_PlaySubBgm(NA_BGM_TIMED_MINI_GAME);
if (this->unk_542 == 0) {
if (this->unk_546 == 1) {
func_80961EC8(play);
@@ -560,7 +579,7 @@ void func_80962660(EnFu* this, PlayState* play) {
case 0x287E:
case 0x2880:
case 0x2883:
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_80963540(this);
func_80963560(this, play);
break;
@@ -605,8 +624,8 @@ void func_809628D0(EnFu* this, PlayState* play) {
case 0x2884:
case 0x2887:
case 0x288A:
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_01);
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_02);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED);
func_809622FC(this);
break;
@@ -616,6 +635,9 @@ void func_809628D0(EnFu* this, PlayState* play) {
}
}
break;
+
+ default:
+ break;
}
if (talkState != TEXT_STATE_3) {
@@ -643,7 +665,7 @@ void func_80962A10(EnFu* this, PlayState* play) {
return;
}
- play_sound(NA_SE_SY_FOUND);
+ Audio_PlaySfx(NA_SE_SY_FOUND);
player->stateFlags1 &= ~PLAYER_STATE1_20;
Interface_StartTimer(TIMER_ID_MINIGAME_2, 60);
if (this->unk_546 == 1) {
@@ -652,7 +674,7 @@ void func_80962A10(EnFu* this, PlayState* play) {
this->unk_546 = 1;
}
- if ((gSaveContext.save.playerForm == PLAYER_FORM_DEKU) && gSaveContext.save.playerData.isMagicAcquired) {
+ if ((GET_PLAYER_FORM == PLAYER_FORM_DEKU) && gSaveContext.save.saveInfo.playerData.isMagicAcquired) {
Magic_Add(play, MAGIC_FILL_TO_CAPACITY);
}
@@ -679,7 +701,7 @@ void func_80962BCC(EnFu* this, PlayState* play) {
return;
}
- play_sound(NA_SE_SY_FOUND);
+ Audio_PlaySfx(NA_SE_SY_FOUND);
player->stateFlags1 &= ~PLAYER_STATE1_20;
player->stateFlags3 |= PLAYER_STATE3_400000;
Interface_StartTimer(TIMER_ID_MINIGAME_2, 60);
@@ -710,7 +732,7 @@ void func_80962D60(EnFu* this, PlayState* play) {
return;
}
- play_sound(NA_SE_SY_FOUND);
+ Audio_PlaySfx(NA_SE_SY_FOUND);
player->stateFlags1 &= ~PLAYER_STATE1_20;
player->stateFlags3 |= PLAYER_STATE3_400000;
Interface_StartTimer(TIMER_ID_MINIGAME_2, 60);
@@ -727,16 +749,16 @@ 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);
}
}
}
void func_80962F10(EnFu* this) {
this->unk_548 = 0;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
SET_WEEKEVENTREG(WEEKEVENTREG_08_01);
this->actionFunc = func_80962F4C;
}
@@ -747,7 +769,7 @@ void func_80962F4C(EnFu* this, PlayState* play) {
switch (this->unk_542) {
case 0:
- if (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_HUMAN) {
player->stateFlags3 |= PLAYER_STATE3_400;
}
break;
@@ -759,6 +781,9 @@ void func_80962F4C(EnFu* this, PlayState* play) {
case 2:
play->unk_1887D = 30;
break;
+
+ default:
+ break;
}
if (gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] < SECONDS_TO_TIMER(20)) {
@@ -775,8 +800,8 @@ void func_80962F4C(EnFu* this, PlayState* play) {
Message_StartTextbox(play, 0x288B, &this->actor);
}
- if ((!DynaPolyActor_IsInRidingRotatingState((DynaPolyActor*)this->actor.child) &&
- (player->actor.bgCheckFlags & 1)) ||
+ 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;
func_80961E88(play);
@@ -789,14 +814,14 @@ void func_80962F4C(EnFu* this, PlayState* play) {
Message_StartTextbox(play, 0x2888, &this->actor);
this->unk_552 = 0x2888;
}
- func_801A2C20();
+ Audio_StopSubBgm();
gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] = SECONDS_TO_TIMER(0);
gSaveContext.timerStates[TIMER_ID_MINIGAME_2] = TIMER_STATE_STOP;
this->unk_548 = 0;
func_809632D0(this);
} else {
this->unk_548 = 0;
- func_801A2C20();
+ Audio_StopSubBgm();
gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] = SECONDS_TO_TIMER(0);
gSaveContext.timerStates[TIMER_ID_MINIGAME_2] = TIMER_STATE_STOP;
Audio_PlayFanfare(NA_BGM_GET_ITEM | 0x900);
@@ -820,7 +845,7 @@ void func_8096326C(EnFu* this, PlayState* play) {
}
void func_809632D0(EnFu* this) {
- if (gSaveContext.save.playerForm == PLAYER_FORM_DEKU) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_DEKU) {
Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
}
@@ -832,7 +857,7 @@ void func_809632D0(EnFu* this) {
mizu->unk_160 = 0;
}
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actionFunc = func_80963350;
}
@@ -843,7 +868,7 @@ void func_80963350(EnFu* this, PlayState* play) {
if ((this->unk_54A == 0) &&
(((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) ||
((Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) && (play->msgCtx.stateTimer == 1)))) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->unk_54A = 2;
D_80964C24 = 1;
}
@@ -879,9 +904,9 @@ void func_80963560(EnFu* this, PlayState* play) {
this->actor.parent = NULL;
func_80963610(this);
} else if ((this->unk_552 == 0x2880) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_22_80)) {
- Actor_PickUp(&this->actor, play, GI_HEART_PIECE, 500.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_HEART_PIECE, 500.0f, 100.0f);
} else {
- Actor_PickUp(&this->actor, play, GI_RUPEE_PURPLE, 500.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_RUPEE_PURPLE, 500.0f, 100.0f);
}
this->actor.child->freezeTimer = 10;
}
@@ -896,7 +921,7 @@ void func_80963630(EnFu* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_10) && CHECK_WEEKEVENTREG(WEEKEVENTREG_22_20) && (CURRENT_DAY == 3) &&
- (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN)) {
+ (GET_PLAYER_FORM == PLAYER_FORM_HUMAN)) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_40)) {
Message_StartTextbox(play, 0x2884, &this->actor);
this->unk_552 = 0x2884;
@@ -917,7 +942,7 @@ void func_80963630(EnFu* this, PlayState* play) {
this->actor.child->freezeTimer = 0;
func_809628BC(this);
- if (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_HUMAN) {
switch (CURRENT_DAY) {
case 1:
SET_WEEKEVENTREG(WEEKEVENTREG_22_10);
@@ -930,12 +955,15 @@ void func_80963630(EnFu* this, PlayState* play) {
case 3:
SET_WEEKEVENTREG(WEEKEVENTREG_22_40);
break;
+
+ default:
+ break;
}
}
player->stateFlags1 &= ~PLAYER_STATE1_20;
} else {
this->actor.child->freezeTimer = 10;
- func_800B85E0(&this->actor, play, 500.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 500.0f, PLAYER_IA_MINUS1);
}
}
@@ -968,46 +996,46 @@ s32 func_80963810(PlayState* play, Vec3f pos) {
s32 func_809638F8(PlayState* play) {
s32 ret = true;
- if (play->envCtx.lightSettings.diffuseColor1[0] > 25) {
- play->envCtx.lightSettings.diffuseColor1[0] -= 25;
+ if (play->envCtx.adjLightSettings.light1Color[0] > 25) {
+ play->envCtx.adjLightSettings.light1Color[0] -= 25;
ret = false;
} else {
- play->envCtx.lightSettings.diffuseColor1[0] = 0;
+ play->envCtx.adjLightSettings.light1Color[0] = 0;
}
- if (play->envCtx.lightSettings.diffuseColor1[1] > 25) {
- play->envCtx.lightSettings.diffuseColor1[1] -= 25;
+ if (play->envCtx.adjLightSettings.light1Color[1] > 25) {
+ play->envCtx.adjLightSettings.light1Color[1] -= 25;
ret = false;
} else {
- play->envCtx.lightSettings.diffuseColor1[1] = 0;
+ play->envCtx.adjLightSettings.light1Color[1] = 0;
}
- if (play->envCtx.lightSettings.diffuseColor1[2] > 25) {
- play->envCtx.lightSettings.diffuseColor1[2] -= 25;
+ if (play->envCtx.adjLightSettings.light1Color[2] > 25) {
+ play->envCtx.adjLightSettings.light1Color[2] -= 25;
ret = false;
} else {
- play->envCtx.lightSettings.diffuseColor1[2] = 0;
+ play->envCtx.adjLightSettings.light1Color[2] = 0;
}
- if (play->envCtx.lightSettings.ambientColor[0] > 25) {
- play->envCtx.lightSettings.ambientColor[0] -= 25;
+ if (play->envCtx.adjLightSettings.ambientColor[0] > 25) {
+ play->envCtx.adjLightSettings.ambientColor[0] -= 25;
ret = false;
} else {
- play->envCtx.lightSettings.ambientColor[0] = 0;
+ play->envCtx.adjLightSettings.ambientColor[0] = 0;
}
- if (play->envCtx.lightSettings.ambientColor[1] > 25) {
- play->envCtx.lightSettings.ambientColor[1] -= 25;
+ if (play->envCtx.adjLightSettings.ambientColor[1] > 25) {
+ play->envCtx.adjLightSettings.ambientColor[1] -= 25;
ret = false;
} else {
- play->envCtx.lightSettings.ambientColor[1] = 0;
+ play->envCtx.adjLightSettings.ambientColor[1] = 0;
}
- if (play->envCtx.lightSettings.ambientColor[2] > 25) {
- play->envCtx.lightSettings.ambientColor[2] -= 25;
+ if (play->envCtx.adjLightSettings.ambientColor[2] > 25) {
+ play->envCtx.adjLightSettings.ambientColor[2] -= 25;
ret = false;
} else {
- play->envCtx.lightSettings.ambientColor[2] = 0;
+ play->envCtx.adjLightSettings.ambientColor[2] = 0;
}
return ret;
}
@@ -1015,7 +1043,7 @@ s32 func_809638F8(PlayState* play) {
void func_809639D0(EnFu* this, PlayState* play) {
switch (CURRENT_DAY) {
case 1:
- if (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_HUMAN) {
if (CUR_UPG_VALUE(UPG_BOMB_BAG) == 0) {
Message_StartTextbox(play, 0x2853, &this->actor);
this->unk_552 = 0x2853;
@@ -1037,7 +1065,7 @@ void func_809639D0(EnFu* this, PlayState* play) {
break;
case 2:
- if (gSaveContext.save.playerForm != PLAYER_FORM_HUMAN) {
+ if (GET_PLAYER_FORM != PLAYER_FORM_HUMAN) {
Message_StartTextbox(play, 0x286F, &this->actor);
this->unk_552 = 0x286F;
} else if (CUR_UPG_VALUE(UPG_BOMB_BAG) == 0) {
@@ -1066,8 +1094,8 @@ void func_809639D0(EnFu* this, PlayState* play) {
break;
case 3:
- if (gSaveContext.save.playerForm != PLAYER_FORM_HUMAN) {
- if (gSaveContext.save.playerForm == PLAYER_FORM_DEKU) {
+ if (GET_PLAYER_FORM != PLAYER_FORM_HUMAN) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_DEKU) {
func_80963EAC(this, play);
} else {
Message_StartTextbox(play, 0x2841, &this->actor);
@@ -1111,13 +1139,16 @@ void func_809639D0(EnFu* this, PlayState* play) {
this->unk_552 = 0x286D;
}
break;
+
+ default:
+ break;
}
}
void func_80963DE4(EnFu* this, PlayState* play) {
switch (this->unk_542) {
case 0:
- if (gSaveContext.save.playerForm != PLAYER_FORM_HUMAN) {
+ if (GET_PLAYER_FORM != PLAYER_FORM_HUMAN) {
Message_StartTextbox(play, 0x2875, &this->actor);
this->unk_552 = 0x2875;
} else {
@@ -1135,11 +1166,14 @@ void func_80963DE4(EnFu* this, PlayState* play) {
Message_StartTextbox(play, 0x287B, &this->actor);
this->unk_552 = 0x287B;
break;
+
+ default:
+ break;
}
}
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;
@@ -1176,7 +1210,7 @@ void func_80963FF8(EnFu* this, PlayState* play) {
if (player->stateFlags1 & PLAYER_STATE1_100000) {
play->actorCtx.unk268 = 1;
- play->actorCtx.unk_26C.press.button = 0x8000;
+ play->actorCtx.unk_26C.press.button = BTN_A;
} else {
play->actorCtx.unk268 = 1;
}
@@ -1214,7 +1248,7 @@ void func_80964190(EnFu* this, PlayState* play) {
case 0x2842:
case 0x2844:
case 0x2848:
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HONEY_DARLING_ANIM_CUP_CHEEKS);
break;
case 0x2840:
@@ -1240,21 +1274,24 @@ void func_80964190(EnFu* this, PlayState* play) {
case 0x286B:
case 0x286D:
case 0x2871:
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 4);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HONEY_DARLING_ANIM_HOLD_HANDS_MORPH);
break;
case 0x2860:
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 5);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HONEY_DARLING_ANIM_HOLD_HANDS);
break;
case 0x285F:
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 6);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HONEY_DARLING_ANIM_SURPRISE);
break;
case 0x287E:
case 0x2880:
case 0x2883:
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HONEY_DARLING_ANIM_HUG);
+ break;
+
+ default:
break;
}
}
@@ -1337,7 +1374,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);
@@ -1347,13 +1384,13 @@ void EnFu_Update(Actor* thisx, PlayState* play) {
s32 EnFu_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnFu* this = THIS;
- if (limbIndex == 9) {
+ if (limbIndex == HONEY_AND_DARLING_LIMB_MAN_HEAD) {
Matrix_Translate(1600.0f, 300.0f, 0.0f, MTXMODE_APPLY);
Matrix_RotateXS(this->unk_524[1], MTXMODE_APPLY);
Matrix_RotateZS(this->unk_524[0], MTXMODE_APPLY);
Matrix_RotateYS(this->unk_524[2], MTXMODE_APPLY);
Matrix_Translate(-1600.0f, -300.0f, 0.0f, MTXMODE_APPLY);
- } else if (limbIndex == 20) {
+ } else if (limbIndex == HONEY_AND_DARLING_LIMB_WOMAN_HEAD) {
Matrix_Translate(1800.0f, 200.0f, 0.0f, MTXMODE_APPLY);
Matrix_RotateXS(this->unk_52A[1], MTXMODE_APPLY);
Matrix_RotateZS(this->unk_52A[0], MTXMODE_APPLY);
@@ -1368,9 +1405,9 @@ void EnFu_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
static Vec3f D_80964C34 = { -3500.0f, 0.0f, 0.0f };
EnFu* this = THIS;
- if (limbIndex == 9) {
+ if (limbIndex == HONEY_AND_DARLING_LIMB_MAN_HEAD) {
Matrix_MultVec3f(&D_80964C28, &this->unk_508);
- } else if (limbIndex == 20) {
+ } else if (limbIndex == HONEY_AND_DARLING_LIMB_WOMAN_HEAD) {
Matrix_MultVec3f(&D_80964C34, &this->unk_514);
}
}
@@ -1385,7 +1422,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 +1486,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/z_en_fu.h b/src/overlays/actors/ovl_En_Fu/z_en_fu.h
index 44f769a8c..ecd4878c2 100644
--- a/src/overlays/actors/ovl_En_Fu/z_en_fu.h
+++ b/src/overlays/actors/ovl_En_Fu/z_en_fu.h
@@ -2,6 +2,7 @@
#define Z_EN_FU_H
#include "global.h"
+#include "objects/object_mu/object_mu.h"
#include "overlays/actors/ovl_Bg_Fu_Mizu/z_bg_fu_mizu.h"
struct EnFu;
@@ -27,8 +28,8 @@ typedef struct EnFu {
/* 0x144 */ ColliderCylinder collider;
/* 0x190 */ SkelAnime skelAnime;
/* 0x1D4 */ EnFuActionFunc actionFunc;
- /* 0x1D8 */ Vec3s jointTable[21];
- /* 0x256 */ Vec3s morphTable[21];
+ /* 0x1D8 */ Vec3s jointTable[HONEY_AND_DARLING_LIMB_MAX];
+ /* 0x256 */ Vec3s morphTable[HONEY_AND_DARLING_LIMB_MAX];
/* 0x2D4 */ BgFuMizu* unk_2D4;
/* 0x2D8 */ EnFuUnkStruct unk_2D8[10];
/* 0x508 */ Vec3f unk_508;
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 b232210f5..8aa3909f7 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);
@@ -136,11 +136,11 @@ s32 func_80ACF8B8(EnFuKago* this, PlayState* play) {
return false;
}
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_SY_TRE_BOX_APPEAR);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_SY_TRE_BOX_APPEAR);
return true;
- } else {
- CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
}
+
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
return false;
}
@@ -227,8 +227,8 @@ void func_80ACFA78(EnFuKago* this, PlayState* play) {
this->unk_338 = 60;
this->unk_33A = 1;
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_WOODBOX_BREAK);
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_WOODBOX_BREAK);
+ 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 6f9706a2b..c7066cf30 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);
@@ -156,7 +156,7 @@ void func_80ACE51C(EnFuMato* this, PlayState* play) {
}
}
- this->dyna.actor.speedXZ = 2.0f;
+ this->dyna.actor.speed = 2.0f;
this->dyna.actor.shape.rot.y = Math_Vec3f_Yaw(&this->dyna.actor.world.pos, &this->dyna.actor.parent->world.pos);
Actor_MoveWithGravity(&this->dyna.actor);
@@ -174,7 +174,7 @@ void func_80ACE680(EnFuMato* this) {
this->unk_2FC.y = Rand_Next() & 0xFFF;
this->unk_2FC.z = Rand_Next() & 0xFFF;
this->unk_302 = 3;
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_WOODPLATE_BOUND);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_WOODPLATE_BOUND);
this->actionFunc = func_80ACE718;
}
@@ -185,9 +185,10 @@ 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 & 1) || (this->dyna.actor.world.pos.y < -500.0f)) {
+ if ((this->dyna.actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (this->dyna.actor.world.pos.y < -500.0f)) {
Vec3f sp3C = { 0.0f, 0.0f, 0.0f };
Vec3f sp30 = { 0.0f, 2.0f, 0.0f };
@@ -241,7 +242,7 @@ void func_80ACE850(EnFuMato* this, PlayState* play) {
this->dyna.actor.freezeTimer = 2;
EffectSsHahen_SpawnBurst(play, &this->dyna.actor.world.pos, 13.0f, 0, 7, 8, 20, HAHEN_OBJECT_DEFAULT, 10, NULL);
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_WOODPLATE_BROKEN);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_WOODPLATE_BROKEN);
this->actionFunc = func_80ACECFC;
}
@@ -329,8 +330,9 @@ 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);
- if (this->dyna.actor.bgCheckFlags & 1) {
+ 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);
}
}
@@ -368,10 +370,10 @@ s32 func_80ACF04C(EnFuMato* this, PlayState* play) {
this->collider.base.acFlags &= ~AC_HIT;
this->collider.base.ocFlags1 &= ~OC1_HIT;
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_SY_TRE_BOX_APPEAR);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_SY_TRE_BOX_APPEAR);
fu->unk_548++;
- if ((fu->unk_542 == 2) || (gSaveContext.save.playerForm == PLAYER_FORM_DEKU)) {
+ if ((fu->unk_542 == 2) || (GET_PLAYER_FORM == PLAYER_FORM_DEKU)) {
fu->unk_546 = 1;
func_80ACE680(this);
} else {
@@ -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 f7d1d7cd1..0bf2f3544 100644
--- a/src/overlays/actors/ovl_En_Fz/z_en_fz.c
+++ b/src/overlays/actors/ovl_En_Fz/z_en_fz.c
@@ -9,7 +9,7 @@
#include "objects/object_fz/object_fz.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnFz*)thisx)
@@ -157,7 +157,7 @@ static DamageTable sDamageTable = {
static InitChainEntry sInitChain[] = {
ICHAIN_S8(hintId, TATL_HINT_ID_FREEZARD, ICHAIN_CONTINUE),
- ICHAIN_U8(targetMode, 2, ICHAIN_CONTINUE),
+ ICHAIN_U8(targetMode, TARGET_MODE_2, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneForward, 1400, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 30, ICHAIN_STOP),
};
@@ -180,7 +180,7 @@ void EnFz_Init(Actor* thisx, PlayState* play) {
this->actor.gravity = 0.0f;
this->actor.velocity.y = 0.0f;
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->unk_BC8 = 0;
this->unk_BCF = 0;
this->unk_BCC = 1;
@@ -188,7 +188,7 @@ void EnFz_Init(Actor* thisx, PlayState* play) {
this->unk_BCE = 0;
this->unk_BD7 = 1;
this->unk_BD8 = 0;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.uncullZoneScale = 400.0f;
this->unk_BAC = this->actor.world.pos.y;
this->unk_BB4 = this->actor.world.pos.y;
@@ -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;
@@ -359,12 +359,12 @@ void func_80932C98(EnFz* this, PlayState* play) {
Vec3f sp3C;
if (this->unk_BCD != 0) {
- if ((this->actor.bgCheckFlags & 8) ||
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) ||
!Actor_TestFloorInDirection(&this->actor, play, 60.0f, this->actor.world.rot.y)) {
- this->actor.bgCheckFlags &= ~0x8;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_WALL;
this->unk_BCD = 0;
this->unk_BBC = 0.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
}
@@ -375,8 +375,8 @@ void func_80932C98(EnFz* this, PlayState* play) {
if ((parent->update == NULL) || (parent->colChkInfo.health <= 0)) {
this->actor.colChkInfo.health = 0;
this->unk_BC4 = 5;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FREEZAD_DEAD);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_ICE_BROKEN);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FREEZAD_DEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_ICE_BROKEN);
sp3C.x = this->actor.world.pos.x;
sp3C.y = this->actor.world.pos.y;
sp3C.z = this->actor.world.pos.z;
@@ -388,8 +388,8 @@ void func_80932C98(EnFz* this, PlayState* play) {
if ((this->actor.colChkInfo.health != 0) && (this->unk_BC4 == 1)) {
this->actor.colChkInfo.health = 0;
this->unk_BC4 = 5;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FREEZAD_DEAD);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_ICE_BROKEN);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FREEZAD_DEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_ICE_BROKEN);
sp3C.x = this->actor.world.pos.x;
sp3C.y = this->actor.world.pos.y;
sp3C.z = this->actor.world.pos.z;
@@ -401,11 +401,11 @@ void func_80932C98(EnFz* this, PlayState* play) {
}
if (this->unk_BCE != 0) {
- if (ENFZ_GET_8000(&this->actor) && (this->collider1.base.atFlags & AC_HIT)) {
+ if (ENFZ_GET_8000(&this->actor) && (this->collider1.base.atFlags & AT_HIT)) {
this->unk_BCD = 0;
this->unk_BBC = 0.0f;
this->collider1.base.acFlags &= ~AC_HIT;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->unk_BCA = 10;
func_809330D4(this);
} else if (this->collider2.base.acFlags & AC_BOUNCED) {
@@ -420,9 +420,9 @@ void func_80932C98(EnFz* this, PlayState* play) {
case 15:
Actor_ApplyDamage(&this->actor);
- Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, 0x2000, 8);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_XLU, 8);
if (this->actor.colChkInfo.health != 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FREEZAD_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FREEZAD_DAMAGE);
sp3C.x = this->actor.world.pos.x;
sp3C.y = this->actor.world.pos.y;
sp3C.z = this->actor.world.pos.z;
@@ -430,8 +430,8 @@ void func_80932C98(EnFz* this, PlayState* play) {
this->unk_BCF++;
break;
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FREEZAD_DEAD);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_ICE_BROKEN);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FREEZAD_DEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_ICE_BROKEN);
sp3C.x = this->actor.world.pos.x;
sp3C.y = this->actor.world.pos.y;
sp3C.z = this->actor.world.pos.z;
@@ -440,7 +440,7 @@ void func_80932C98(EnFz* this, PlayState* play) {
break;
case 2:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FREEZAD_DEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FREEZAD_DEAD);
func_80933790(this);
break;
}
@@ -472,7 +472,7 @@ void func_80933014(EnFz* this) {
void func_809330D4(EnFz* this) {
this->unk_BD6 = 2;
this->unk_BCE = 0;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actionFunc = func_80933104;
}
@@ -543,7 +543,7 @@ void func_80933324(EnFz* this) {
this->unk_BCA = 40;
this->unk_BCC = 1;
this->unk_BCE = 1;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actor.gravity = -1.0f;
this->actionFunc = func_80933368;
}
@@ -572,7 +572,7 @@ void func_809333D8(EnFz* this, PlayState* play) {
void func_80933414(EnFz* this) {
this->unk_BD6 = 1;
this->unk_BBC = 0.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->unk_BCA = 40;
this->actionFunc = func_80933444;
}
@@ -607,7 +607,7 @@ void func_809334B8(EnFz* this, PlayState* play) {
if (this->unk_BCA > 10) {
sp3F = 0;
sp3C = 150;
- func_800B9010(&this->actor, NA_SE_EN_FREEZAD_BREATH - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_FREEZAD_BREATH - SFX_FLAG);
if ((this->unk_BCA - 10) < 16) {
sp3C = (this->unk_BCA * 10) - 100;
}
@@ -649,11 +649,11 @@ void func_809336C0(EnFz* this, PlayState* play) {
this->unk_BBC = 0.0f;
this->actor.gravity = 0.0f;
this->actor.velocity.y = 0.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->unk_BCC = 1;
this->unk_BCE = 0;
this->unk_BD8 = 1;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->unk_BD7 = 0;
this->unk_BCA = 60;
func_800BC154(play, &play->actorCtx, &this->actor, ACTORCAT_PROP);
@@ -671,8 +671,8 @@ void func_80933790(EnFz* this) {
this->unk_BD6 = 3;
this->unk_BCE = 0;
this->unk_BD8 = 1;
- this->actor.flags &= ~ACTOR_FLAG_1;
- this->actor.speedXZ = 0.0f;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ this->actor.speed = 0.0f;
this->unk_BBC = 0.0f;
this->actionFunc = func_809337D4;
}
@@ -702,7 +702,7 @@ void func_8093389C(EnFz* this) {
this->unk_BCA = 40;
this->unk_BCC = 1;
this->unk_BCE = 1;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actor.gravity = -1.0f;
this->actionFunc = func_809338E0;
}
@@ -723,7 +723,7 @@ void func_809338E0(EnFz* this, PlayState* play) {
sp3F = 0;
sp3C = 150;
- func_800B9010(&this->actor, NA_SE_EN_FREEZAD_BREATH - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_FREEZAD_BREATH - SFX_FLAG);
if ((this->unk_BC6 & 0x3F) >= 0x30) {
sp3C = 630 - ((this->unk_BC6 & 0x3F) * 10);
@@ -763,7 +763,7 @@ void func_80933AF4(EnFz* this) {
this->unk_BCA = 40;
this->unk_BCC = 1;
this->unk_BCE = 1;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actor.gravity = -1.0f;
this->actionFunc = func_80933B38;
}
@@ -821,10 +821,10 @@ void EnFz_Update(Actor* thisx, PlayState* play) {
}
}
- Math_StepToF(&this->actor.speedXZ, this->unk_BBC, 0.2f);
+ 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,
@@ -863,14 +863,14 @@ void EnFz_Draw(Actor* thisx, PlayState* play) {
if (this->drawDmgEffTimer > 0) {
s32 pad2[6];
- Vec3f limbPos[2];
+ Vec3f bodyPartsPos[2];
s32 pad3;
- limbPos[0] = this->actor.world.pos;
- limbPos[1] = this->actor.world.pos;
- limbPos[0].y += 20.0f;
- limbPos[1].y += 40.0f;
- Actor_DrawDamageEffects(play, NULL, limbPos, ARRAY_COUNT(limbPos), this->drawDmgEffScale * 4.0f, 0.5f,
+ bodyPartsPos[0] = this->actor.world.pos;
+ bodyPartsPos[1] = this->actor.world.pos;
+ bodyPartsPos[0].y += 20.0f;
+ bodyPartsPos[1].y += 40.0f;
+ Actor_DrawDamageEffects(play, NULL, bodyPartsPos, ARRAY_COUNT(bodyPartsPos), this->drawDmgEffScale * 4.0f, 0.5f,
this->drawDmgEffAlpha, ACTOR_DRAW_DMGEFF_LIGHT_ORBS);
}
@@ -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 55dc23737..481c155b4 100644
--- a/src/overlays/actors/ovl_En_Gakufu/z_en_gakufu.c
+++ b/src/overlays/actors/ovl_En_Gakufu/z_en_gakufu.c
@@ -208,9 +208,9 @@ void EnGakufu_GiveReward(EnGakufu* this, PlayState* play) {
s32 hour;
s32 i;
- play_sound(NA_SE_SY_CORRECT_CHIME);
+ Audio_PlaySfx(NA_SE_SY_CORRECT_CHIME);
- hour = gSaveContext.save.time * (24.0f / 0x10000); // TIME_TO_HOURS_F
+ hour = TIME_TO_HOURS_F(gSaveContext.save.time);
for (i = 0; i < 3; i++) {
Item_DropCollectible(play, &sRewardDropsSpawnTerminaFieldPos, sRewardDrops[i + sRewardDropsIndex[hour]]);
}
@@ -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 40c3d5c05..97567e5f4 100644
--- a/src/overlays/actors/ovl_En_Gamelupy/z_en_gamelupy.c
+++ b/src/overlays/actors/ovl_En_Gamelupy/z_en_gamelupy.c
@@ -16,12 +16,12 @@ void EnGamelupy_Destroy(Actor* thisx, PlayState* play);
void EnGamelupy_Update(Actor* thisx, PlayState* play);
void EnGamelupy_Draw(Actor* thisx, PlayState* play);
-void func_80AF6958(EnGamelupy* this, PlayState* play);
-void func_80AF69A8(EnGamelupy* this, PlayState* play);
-void func_80AF6A78(EnGamelupy* this, PlayState* play);
-void func_80AF6944(EnGamelupy* this);
-void func_80AF6994(EnGamelupy* this);
-void func_80AF6A38(EnGamelupy* this);
+void EnGamelupy_FindSharedMemory(EnGamelupy* this, PlayState* play);
+void EnGamelupy_Idle(EnGamelupy* this, PlayState* play);
+void EnGamelupy_Collected(EnGamelupy* this, PlayState* play);
+void EnGamelupy_SetupFindSharedMemory(EnGamelupy* this);
+void EnGamelupy_SetupIdle(EnGamelupy* this);
+void EnGamelupy_SetupCollected(EnGamelupy* this);
ActorInit En_Gamelupy_InitVars = {
ACTOR_EN_GAMELUPY,
@@ -74,15 +74,15 @@ void EnGamelupy_Init(Actor* thisx, PlayState* play) {
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
this->actor.gravity = -0.5f;
this->actor.shape.rot.y = Rand_Next();
- this->unk_19C = 0;
- this->unk_19E = 0;
- this->unk_1A0 = 0x7D0;
- if (this->actor.params == 1) {
- this->rupeeIndex = 1;
+ this->collectedTimer = 0;
+ this->sparklesAngle = 0;
+ this->sparklesAngleStep = 0x7D0;
+ if (EN_GAMELUPY_GET_TYPE(&this->actor) == ENGAMELUPY_TYPE_BLUE) {
+ this->type = ENGAMELUPY_TYPE_BLUE;
} else {
- this->rupeeIndex = 0;
+ this->type = ENGAMELUPY_TYPE_GREEN;
}
- func_80AF6944(this);
+ EnGamelupy_SetupFindSharedMemory(this);
}
void EnGamelupy_Destroy(Actor* thisx, PlayState* play) {
@@ -91,77 +91,77 @@ void EnGamelupy_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyCylinder(play, &this->collider);
}
-void func_80AF6854(EnGamelupy* this, PlayState* play) {
- Vec3f sp4C;
- Vec3f sp40;
- Vec3f sp30;
+void EnGamelupy_SpawnSparkles(EnGamelupy* this, PlayState* play) {
+ Vec3f pos;
+ Vec3f accel;
+ Vec3f velocity;
- sp4C = this->actor.world.pos;
- sp30.x = Math_SinS(this->unk_19E) * 3.0f;
- sp30.y = 5.5f;
- sp30.z = Math_CosS(this->unk_19E) * 3.0f;
- sp40.x = -0.05f * sp30.x;
- sp40.y = -0.4f;
- sp40.z = -0.05f * sp30.z;
- EffectSsKirakira_SpawnDispersed(play, &sp4C, &sp30, &sp40, &sPrimColor, &sEnvColor, 3000, 40);
- this->unk_19E += this->unk_1A0;
+ pos = this->actor.world.pos;
+ velocity.x = Math_SinS(this->sparklesAngle) * 3.0f;
+ velocity.y = 5.5f;
+ velocity.z = Math_CosS(this->sparklesAngle) * 3.0f;
+ accel.x = -0.05f * velocity.x;
+ accel.y = -0.4f;
+ accel.z = -0.05f * velocity.z;
+ EffectSsKirakira_SpawnDispersed(play, &pos, &velocity, &accel, &sPrimColor, &sEnvColor, 3000, 40);
+ this->sparklesAngle += this->sparklesAngleStep;
}
-void func_80AF6944(EnGamelupy* this) {
- this->actionFunc = func_80AF6958;
+void EnGamelupy_SetupFindSharedMemory(EnGamelupy* this) {
+ this->actionFunc = EnGamelupy_FindSharedMemory;
}
-void func_80AF6958(EnGamelupy* this, PlayState* play) {
- s16* unk_198 = func_800B6680(play, ACTOR_EN_GAMELUPY);
+void EnGamelupy_FindSharedMemory(EnGamelupy* this, PlayState* play) {
+ s16* minigameScore = Actor_FindSharedMemoryEntry(play, ACTOR_EN_GAMELUPY);
- if (unk_198 != NULL) {
- this->unk_198 = unk_198;
- func_80AF6994(this);
+ if (minigameScore != NULL) {
+ this->minigameScore = minigameScore;
+ EnGamelupy_SetupIdle(this);
}
}
-void func_80AF6994(EnGamelupy* this) {
- this->actionFunc = func_80AF69A8;
+void EnGamelupy_SetupIdle(EnGamelupy* this) {
+ this->actionFunc = EnGamelupy_Idle;
}
-void func_80AF69A8(EnGamelupy* this, PlayState* play) {
+void EnGamelupy_Idle(EnGamelupy* this, PlayState* play) {
if (this->collider.base.ocFlags1 & OC1_HIT) {
- *this->unk_198 += 0x32;
- if (this->rupeeIndex == 1) {
+ *this->minigameScore += ENGAMELUPY_POINTS;
+ if (this->type == ENGAMELUPY_TYPE_BLUE) {
Rupees_ChangeBy(5);
} else {
Rupees_ChangeBy(1);
}
- func_80AF6A38(this);
+ EnGamelupy_SetupCollected(this);
}
this->actor.shape.rot.y += 0x1F4;
}
-void func_80AF6A38(EnGamelupy* this) {
- this->unk_19C = 0;
+void EnGamelupy_SetupCollected(EnGamelupy* this) {
+ this->collectedTimer = 0;
this->actor.gravity = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_GET_RUPY);
- this->actionFunc = func_80AF6A78;
+ Actor_PlaySfx(&this->actor, NA_SE_SY_GET_RUPY);
+ this->actionFunc = EnGamelupy_Collected;
}
-void func_80AF6A78(EnGamelupy* this, PlayState* play) {
+void EnGamelupy_Collected(EnGamelupy* this, PlayState* play) {
f32 scale;
Player* player = GET_PLAYER(play);
- if (this->unk_19C > 30) {
+ if (this->collectedTimer > 30) {
Actor_Kill(&this->actor);
} else {
- this->unk_19C++;
+ this->collectedTimer++;
this->actor.world.pos = player->actor.world.pos;
this->actor.world.pos.y += 40.0f;
- scale = (30.0f - this->unk_19C) * 0.001f;
+ scale = (30.0f - this->collectedTimer) * 0.001f;
Actor_SetScale(&this->actor, scale);
- func_80AF6854(this, play);
+ EnGamelupy_SpawnSparkles(this, play);
}
this->actor.shape.rot.y += 0x3E8;
}
-void func_80AF6B40(EnGamelupy* this, PlayState* play) {
+void EnGamelupy_UpdateCollision(EnGamelupy* this, PlayState* play) {
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
}
@@ -171,8 +171,8 @@ 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);
- func_80AF6B40(this, play);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 32.0f, 30.0f, 0.0f, UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8);
+ EnGamelupy_UpdateCollision(this, play);
}
void EnGamelupy_Draw(Actor* thisx, PlayState* play) {
@@ -181,10 +181,10 @@ 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]));
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sRupeeTextures[this->type]));
gSPDisplayList(POLY_OPA_DISP++, gRupeeDL);
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_En_Gamelupy/z_en_gamelupy.h b/src/overlays/actors/ovl_En_Gamelupy/z_en_gamelupy.h
index 5d45f3168..d9e5d2b7d 100644
--- a/src/overlays/actors/ovl_En_Gamelupy/z_en_gamelupy.h
+++ b/src/overlays/actors/ovl_En_Gamelupy/z_en_gamelupy.h
@@ -5,17 +5,27 @@
struct EnGamelupy;
+#define ENGAMELUPY_POINTS 50
+
typedef void (*EnGamelupyActionFunc)(struct EnGamelupy*, PlayState*);
+#define EN_GAMELUPY_GET_TYPE(thisx) ((thisx)->params)
+
+typedef enum {
+ /* 0 */ ENGAMELUPY_TYPE_GREEN,
+ /* 1 */ ENGAMELUPY_TYPE_BLUE,
+ /* 2 */ ENGAMELUPY_TYPE_MAX
+} EnGamelupyType;
+
typedef struct EnGamelupy {
/* 0x000 */ Actor actor;
/* 0x144 */ ColliderCylinder collider;
/* 0x190 */ EnGamelupyActionFunc actionFunc;
- /* 0x194 */ s32 rupeeIndex;
- /* 0x198 */ s16* unk_198;
- /* 0x19C */ s16 unk_19C;
- /* 0x19E */ s16 unk_19E;
- /* 0x1A0 */ s16 unk_1A0;
+ /* 0x194 */ s32 type;
+ /* 0x198 */ s16* minigameScore; // Pointer to shared memory location with actor EnLiftNuts
+ /* 0x19C */ s16 collectedTimer;
+ /* 0x19E */ s16 sparklesAngle;
+ /* 0x1A0 */ s16 sparklesAngleStep;
} EnGamelupy; // size = 0x1A4
#endif // Z_EN_GAMELUPY_H
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 d6643dbeb..e7d8e9032 100644
--- a/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c
+++ b/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c
@@ -5,9 +5,8 @@
*/
#include "z_en_gb2.h"
-#include "objects/object_ps/object_ps.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((EnGb2*)thisx)
@@ -163,7 +162,7 @@ u16 func_80B0F7FC(EnGb2* this) {
return 0x14E4;
}
- if (gSaveContext.save.playerData.health > 48) {
+ if (gSaveContext.save.saveInfo.playerData.health > 0x30) {
return 0x14D2;
}
@@ -171,7 +170,7 @@ u16 func_80B0F7FC(EnGb2* this) {
return 0x14D3;
case 0x14E4:
- if (gSaveContext.save.playerData.health > 48) {
+ if (gSaveContext.save.saveInfo.playerData.health > 0x30) {
return 0x14D2;
}
@@ -193,8 +192,10 @@ u16 func_80B0F7FC(EnGb2* this) {
case 0x14D9:
return 0x14DA;
+
+ default:
+ return 0;
}
- return 0;
}
u16 func_80B0F8F8(EnGb2* this) {
@@ -213,8 +214,10 @@ u16 func_80B0F8F8(EnGb2* this) {
case 0x14E1:
return 0x14E2;
+
+ default:
+ return 0;
}
- return 0;
}
u16 func_80B0F97C(EnGb2* this) {
@@ -236,14 +239,16 @@ u16 func_80B0F97C(EnGb2* this) {
case 0x14FA:
this->unk_26C |= 2;
return 0x14FB;
+
+ default:
+ return 0;
}
- return 0;
}
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) {
@@ -262,17 +267,19 @@ s32 func_80B0FA48(EnGb2* this, PlayState* play) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_80_40)) {
this->unk_26E = 0x14EB;
return false;
+ } else {
+ this->unk_26E = 0x14EE;
+ return true;
}
- this->unk_26E = 0x14EE;
- return true;
- }
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_80_20)) {
- this->unk_26E = 0x14EF;
- return false;
- } else {
- this->unk_26E = 0x14F4;
- return true;
+ default:
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_80_20)) {
+ this->unk_26E = 0x14EF;
+ return false;
+ } else {
+ this->unk_26E = 0x14F4;
+ return true;
+ }
}
}
@@ -314,12 +321,14 @@ u16 func_80B0FB24(EnGb2* this) {
case 0x14F2:
this->unk_26C |= 2;
return 0x14F3;
+
+ default:
+ return 0;
}
- return 0;
}
void func_80B0FBF0(EnGb2* this, PlayState* play) {
- Vec3f sp90[4] = {
+ Vec3f sp90[] = {
{ 120.0f, 0.0f, 800.0f },
{ -120.0f, 0.0f, 750.0f },
{ 60.0f, 0.0f, 750.0f },
@@ -355,7 +364,7 @@ void func_80B0FD8C(EnGb2* this, PlayState* play) {
}
void func_80B0FE18(PlayState* play) {
- func_800FD750(0x38);
+ Environment_ForcePlaySequence(NA_BGM_MINI_BOSS);
play->nextEntrance = ENTRANCE(GHOST_HUT, 1);
play->transitionType = TRANS_TYPE_64;
gSaveContext.nextTransitionType = TRANS_TYPE_64;
@@ -370,8 +379,8 @@ void func_80B0FE7C(PlayState* play) {
}
void func_80B0FEBC(EnGb2* this, PlayState* play) {
- if ((play->msgCtx.ocarinaMode == 3) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING)) {
- play->msgCtx.ocarinaMode = 4;
+ if ((play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING)) {
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
SET_EVENTINF(EVENTINF_47);
this->unk_26E = 0x14D1;
this->unk_288 = 10;
@@ -380,8 +389,8 @@ void func_80B0FEBC(EnGb2* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
Message_StartTextbox(play, this->unk_26E, &this->actor);
this->actionFunc = func_80B0FFA8;
- } else if ((this->actor.xzDistToPlayer < 300.0f) || this->actor.isTargeted) {
- func_800B863C(&this->actor, play);
+ } else if ((this->actor.xzDistToPlayer < 300.0f) || this->actor.isLockedOn) {
+ Actor_OfferTalkNearColChkInfoCylinder(&this->actor, play);
}
}
@@ -391,7 +400,7 @@ void func_80B0FFA8(EnGb2* this, PlayState* play) {
if (talkState == TEXT_STATE_5) {
if (Message_ShouldAdvance(play)) {
if (this->unk_26C & 2) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->unk_26E = 0x14D1;
this->unk_288 = 30;
@@ -407,42 +416,48 @@ 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) {
- play_sound(NA_SE_SY_ERROR);
+ if (gSaveContext.save.saveInfo.playerData.rupees < this->unk_288) {
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_26E = 0x14D7;
this->unk_26C |= 2;
Message_StartTextbox(play, this->unk_26E, &this->actor);
} else {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
this->unk_26E = 0x14D8;
Message_StartTextbox(play, this->unk_26E, &this->actor);
}
break;
case 1:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
this->unk_26E = 0x14D6;
this->unk_26C |= 2;
Message_StartTextbox(play, this->unk_26E, &this->actor);
break;
+
+ default:
+ break;
}
} else if (this->unk_26E == 0x14DA) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
Rupees_ChangeBy(-this->unk_288);
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
- func_800B7298(play, NULL, PLAYER_CSMODE_7);
+ func_800B7298(play, NULL, PLAYER_CSMODE_WAIT);
this->actionFunc = func_80B11344;
break;
case 1:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
this->unk_26E = 0x14DB;
this->unk_26C |= 2;
Message_StartTextbox(play, this->unk_26E, &this->actor);
break;
+
+ default:
+ break;
}
}
}
@@ -451,10 +466,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 +478,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 +520,7 @@ void func_80B10344(EnGb2* this, PlayState* play) {
}
}
- if (gSaveContext.save.playerData.health < 49) {
+ if (gSaveContext.save.saveInfo.playerData.health <= 0x30) {
gSaveContext.timerStates[TIMER_ID_MINIGAME_1] = TIMER_STATE_STOP;
SET_EVENTINF(EVENTINF_46);
SET_EVENTINF(EVENTINF_45);
@@ -543,7 +558,7 @@ void func_80B10584(EnGb2* this, PlayState* play) {
this->actionFunc = func_80B10634;
} else if (this->actor.xzDistToPlayer < 300.0f) {
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8614(&this->actor, play, 300.0f);
+ Actor_OfferTalk(&this->actor, play, 300.0f);
}
}
@@ -553,7 +568,7 @@ void func_80B10634(EnGb2* this, PlayState* play) {
if (talkState == TEXT_STATE_5) {
if (Message_ShouldAdvance(play)) {
if (this->unk_26C & 2) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->unk_26C &= ~2;
if (this->unk_26E == 0x14DD) {
@@ -575,64 +590,67 @@ 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) {
- play_sound(NA_SE_SY_ERROR);
+ if (gSaveContext.save.saveInfo.playerData.rupees < this->unk_288) {
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_26E = 0x14D7;
this->unk_26C |= 2;
Message_StartTextbox(play, this->unk_26E, &this->actor);
} else {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
Rupees_ChangeBy(-this->unk_288);
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
- func_800B7298(play, NULL, PLAYER_CSMODE_7);
+ func_800B7298(play, NULL, PLAYER_CSMODE_WAIT);
this->actionFunc = func_80B11344;
}
break;
case 1:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
this->unk_26E = 0x14E3;
this->unk_26C |= 2;
Message_StartTextbox(play, this->unk_26E, &this->actor);
break;
+
+ default:
+ break;
}
}
}
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_PickUp(&this->actor, play, sp24, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, getItemId, 300.0f, 300.0f);
}
}
@@ -641,7 +659,7 @@ void func_80B109DC(EnGb2* this, PlayState* play) {
Message_StartTextbox(play, this->unk_26E, &this->actor);
this->actionFunc = func_80B10634;
} else {
- func_800B85E0(&this->actor, play, 300.0f, -1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 300.0f, PLAYER_IA_MINUS1);
}
}
@@ -656,23 +674,26 @@ 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));
+ Flags_SetSwitch(play, ENGB2_GET_SWITCH_FLAG(&this->actor));
Actor_Kill(&this->actor);
return;
}
this->actor.draw = NULL;
this->unk_26C |= 0x100;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actionFunc = func_80B111AC;
break;
+
+ default:
+ break;
}
}
}
@@ -694,12 +715,12 @@ 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) {
+ } else if ((this->actor.xzDistToPlayer < 300.0f) && this->actor.isLockedOn) {
this->unk_26C |= 0x40;
- func_800B8614(&this->actor, play, 300.0f);
+ Actor_OfferTalk(&this->actor, play, 300.0f);
}
} else {
this->unk_26C &= ~0x40;
@@ -712,37 +733,37 @@ 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) {
if (!(this->unk_26C & 0x80)) {
this->actor.flags |= ACTOR_FLAG_10000;
this->unk_26C |= 0x20;
- func_800B8614(&this->actor, play, 300.0f);
+ Actor_OfferTalk(&this->actor, play, 300.0f);
}
}
}
}
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));
+ Flags_SetSwitch(play, ENGB2_GET_SWITCH_FLAG(&this->actor));
this->actionFunc = func_80B10868;
}
} 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]);
}
}
@@ -750,17 +771,17 @@ void func_80B10E98(EnGb2* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
if (this->unk_26C & 2) {
this->unk_26C &= ~2;
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
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))) {
+ } else if (Flags_GetSwitch(play, ENGB2_GET_SWITCH_FLAG(&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 +791,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;
}
}
@@ -786,14 +807,14 @@ void func_80B11048(EnGb2* this, PlayState* play) {
this->actionFunc = func_80B10DAC;
} else if (this->actor.xzDistToPlayer < 300.0f) {
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8614(&this->actor, play, 200.0f);
+ Actor_OfferTalk(&this->actor, play, 200.0f);
}
}
void func_80B110F8(EnGb2* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
if (this->unk_26C & 2) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->unk_26C &= ~2;
this->actionFunc = func_80B10A48;
@@ -832,19 +853,19 @@ void func_80B111AC(EnGb2* this, PlayState* play) {
this->actor.world.pos.x = D_80B11A00[index][0];
this->actor.world.pos.y = D_80B11A00[index][1];
this->actor.world.pos.z = D_80B11A00[index][2];
- this->actor.world.rot.y = D_80B11A00[index][3] * 182.04445f;
+ this->actor.world.rot.y = DEG_TO_BINANG(D_80B11A00[index][3]);
this->actor.shape.rot.y = this->actor.world.rot.y;
this->actionFunc = func_80B11268;
}
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;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actor.draw = EnGb2_Draw;
this->unk_26E = 0x14F9;
this->actionFunc = func_80B11048;
@@ -861,7 +882,7 @@ void func_80B11344(EnGb2* this, PlayState* play) {
}
static InitChainEntry sInitChain[] = {
- ICHAIN_U8(targetMode, 4, ICHAIN_CONTINUE),
+ ICHAIN_U8(targetMode, TARGET_MODE_4, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 2200, ICHAIN_STOP),
};
@@ -877,7 +898,7 @@ void EnGb2_Init(Actor* thisx, PlayState* play) {
this->actor.room = -1;
Actor_ProcessInitChain(&this->actor, sInitChain);
SkelAnime_InitFlex(play, &this->skelAnime, &object_ps_Skel_007230, &object_ps_Anim_00049C, this->jointTable,
- this->morphTable, 12);
+ this->morphTable, OBJECT_PS_LIMB_MAX);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 35.0f);
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinderType1(play, &this->collider, &this->actor, &sCylinderInit);
@@ -887,7 +908,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);
}
@@ -915,7 +936,7 @@ void EnGb2_Init(Actor* thisx, PlayState* play) {
return;
}
- if (Flags_GetSwitch(play, ENGB2_GET_7F8(thisx))) {
+ if (Flags_GetSwitch(play, ENGB2_GET_SWITCH_FLAG(thisx))) {
Actor_Kill(&this->actor);
return;
}
@@ -927,9 +948,9 @@ void EnGb2_Init(Actor* thisx, PlayState* play) {
break;
case ENGB2_7_2:
- this->unk_290 = 0;
- this->unk_282[0] = this->actor.cutscene;
- if (Flags_GetSwitch(play, ENGB2_GET_7F8(thisx))) {
+ this->csIdIndex = 0;
+ this->csIdList[0] = this->actor.csId;
+ if (Flags_GetSwitch(play, ENGB2_GET_SWITCH_FLAG(thisx))) {
Actor_Kill(&this->actor);
return;
}
@@ -943,7 +964,7 @@ void EnGb2_Init(Actor* thisx, PlayState* play) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_76_80)) {
this->actor.draw = NULL;
this->unk_26C |= 0x100;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actionFunc = func_80B111AC;
} else {
this->unk_28A = 255;
@@ -981,11 +1002,11 @@ s32 EnGb2_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
Gfx** gfx) {
EnGb2* this = THIS;
- if (limbIndex == 7) {
+ if (limbIndex == OBJECT_PS_LIMB_07) {
Matrix_RotateYS(this->unk_270.y, MTXMODE_APPLY);
}
- if (limbIndex == 1) {
+ if (limbIndex == OBJECT_PS_LIMB_01) {
*dList = NULL;
}
@@ -996,7 +1017,7 @@ void EnGb2_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
EnGb2* this = THIS;
Vec3f sp18 = { 2400.0f, 0.0f, 0.0f };
- if (limbIndex == 7) {
+ if (limbIndex == OBJECT_PS_LIMB_07) {
Matrix_MultVec3f(&sp18, &this->actor.focus.pos);
}
}
@@ -1007,7 +1028,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 +1037,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..e59eecee0 100644
--- a/src/overlays/actors/ovl_En_Gb2/z_en_gb2.h
+++ b/src/overlays/actors/ovl_En_Gb2/z_en_gb2.h
@@ -2,25 +2,26 @@
#define Z_EN_GB2_H
#include "global.h"
+#include "objects/object_ps/object_ps.h"
struct EnGb2;
typedef void (*EnGb2ActionFunc)(struct EnGb2*, PlayState*);
#define ENGB2_GET_7(thisx) ((thisx)->params & 7)
-#define ENGB2_GET_7F8(thisx) (((thisx)->params & 0x7F8) >> 3)
+#define ENGB2_GET_SWITCH_FLAG(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;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[12];
- /* 0x1D0 */ Vec3s morphTable[12];
+ /* 0x188 */ Vec3s jointTable[OBJECT_PS_LIMB_MAX];
+ /* 0x1D0 */ Vec3s morphTable[OBJECT_PS_LIMB_MAX];
/* 0x218 */ EnGb2ActionFunc actionFunc;
/* 0x21C */ ColliderCylinder collider;
/* 0x268 */ Actor* unk_268;
@@ -31,11 +32,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 3d4f4bd3d..c83305a8c 100644
--- a/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c
+++ b/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c
@@ -6,7 +6,7 @@
#include "z_en_ge1.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnGe1*)thisx)
@@ -70,9 +70,10 @@ typedef enum {
/* 7 */ GERUDO_WHITE_ANIM_SALUTE,
/* 8 */ GERUDO_WHITE_ANIM_LEADING_BOAT,
/* 9 */ GERUDO_WHITE_ANIM_BLOWN_AWAY,
-} GerudoWhiteAnimations;
+ /* 10 */ GERUDO_WHITE_ANIM_MAX
+} GerudoWhiteAnimation;
-void EnGe1_ChangeAnim(EnGe1* this, s16 animIndex, u8 mode, f32 morphFrames);
+void EnGe1_ChangeAnim(EnGe1* this, s16 animIndex, u8 animMode, f32 morphFrames);
void EnGe1_ShadowDraw(Actor* thisx, Lights* lights, PlayState* play);
void EnGe1_Wait(EnGe1* this, PlayState* play);
void EnGe1_PerformCutsceneActions(EnGe1* this, PlayState* play);
@@ -86,9 +87,9 @@ void EnGe1_Init(Actor* thisx, PlayState* play) {
this->morphTable, GERUDO_WHITE_LIMB_MAX);
Collider_InitAndSetCylinder(play, &this->collider, &this->picto.actor, &sCylinderInit);
this->picto.actor.colChkInfo.mass = MASS_IMMOVABLE;
- this->picto.actor.targetMode = 6;
+ this->picto.actor.targetMode = TARGET_MODE_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;
@@ -112,7 +113,7 @@ void EnGe1_Init(Actor* thisx, PlayState* play) {
this->actionFunc = EnGe1_PerformCutsceneActions;
this->picto.actor.draw = NULL;
this->picto.actor.flags |= ACTOR_FLAG_20 | ACTOR_FLAG_10;
- this->picto.actor.flags &= ~ACTOR_FLAG_1;
+ this->picto.actor.flags &= ~ACTOR_FLAG_TARGETABLE;
break;
}
@@ -127,8 +128,8 @@ void EnGe1_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyCylinder(play, &this->collider);
}
-void EnGe1_ChangeAnim(EnGe1* this, s16 animIndex, u8 mode, f32 morphFrames) {
- static AnimationHeader* sAnimations[] = {
+void EnGe1_ChangeAnim(EnGe1* this, s16 animIndex, u8 animMode, f32 morphFrames) {
+ static AnimationHeader* sAnimations[GERUDO_WHITE_ANIM_MAX] = {
&gGerudoWhiteArmsFoldedAnim, // GERUDO_WHITE_ANIM_ARMS_FOLDED,
&gGerudoWhiteUnfoldingArmsAnim, // GERUDO_WHITE_ANIM_UNFOLDING_ARMS
&gGerudoWhiteStandingHeadBowedAnim, // GERUDO_WHITE_ANIM_STANDING_HEAD_BOWED,
@@ -154,7 +155,7 @@ void EnGe1_ChangeAnim(EnGe1* this, s16 animIndex, u8 mode, f32 morphFrames) {
default:
Animation_Change(&this->skelAnime, sAnimations[animIndex], 1.0f, 0.0f,
- Animation_GetLastFrame(sAnimations[animIndex]), mode, morphFrames);
+ Animation_GetLastFrame(sAnimations[animIndex]), animMode, morphFrames);
break;
}
@@ -189,19 +190,20 @@ void EnGe1_SetupPath(EnGe1* this, PlayState* play) {
Vec3s* point;
Vec3f nextPoint;
- this->curPoint = 0;
- if (GERUDO_WHITE_GET_PATH(&this->picto.actor) != 0x3F) {
- this->path = &play->setupPathList[GERUDO_WHITE_GET_PATH(&this->picto.actor)];
+ this->curPointIndex = 0;
+
+ 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);
- this->curPoint++;
+ this->curPointIndex++;
point++;
Math_Vec3s_ToVec3f(&nextPoint, point);
this->picto.actor.world.rot.y = Math_Vec3f_Yaw(&this->picto.actor.world.pos, &nextPoint);
this->picto.actor.world.rot.x = Math_Vec3f_Pitch(&this->picto.actor.world.pos, &nextPoint);
- this->picto.actor.speedXZ = 15.0f;
+ this->picto.actor.speed = 15.0f;
}
} else {
this->path = NULL;
@@ -214,7 +216,7 @@ void EnGe1_SetupPath(EnGe1* this, PlayState* play) {
s32 EnGe1_FollowPath(EnGe1* this) {
s32 pad;
Path* path = this->path;
- Vec3s* points;
+ Vec3s* curPoint;
Vec3f point;
s16 yawTarget;
s16 pitchTarget;
@@ -223,10 +225,10 @@ s32 EnGe1_FollowPath(EnGe1* this) {
return true;
}
- points = Lib_SegmentedToVirtual(this->path->points);
- points += this->curPoint;
+ curPoint = Lib_SegmentedToVirtual(this->path->points);
+ curPoint += this->curPointIndex;
- Math_Vec3s_ToVec3f(&point, points);
+ Math_Vec3s_ToVec3f(&point, curPoint);
yawTarget = Math_Vec3f_Yaw(&this->picto.actor.world.pos, &point);
pitchTarget = Math_Vec3f_Pitch(&this->picto.actor.world.pos, &point);
Math_SmoothStepToS(&this->picto.actor.world.rot.y, yawTarget, 0xA, 0x3E8, 0x64);
@@ -242,9 +244,9 @@ s32 EnGe1_FollowPath(EnGe1* this) {
void EnGe1_Scream(EnGe1* this) {
if ((s32)Rand_ZeroFloat(2.0f) == 0) {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_VO_FPVO00);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_VO_FPVO00);
} else {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_VO_FPVO01);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_VO_FPVO01);
}
}
@@ -254,16 +256,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, 0x79)) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_121)) {
this->picto.actor.draw = EnGe1_Draw;
- csAction = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 0x79)]->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;
@@ -274,14 +276,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);
@@ -329,32 +332,37 @@ void EnGe1_PerformCutsceneActions(EnGe1* this, PlayState* play) {
if ((this->animIndex == GERUDO_WHITE_ANIM_TRUDGING_OFF) &&
(Animation_OnFrame(&this->skelAnime, 12.0f) || Animation_OnFrame(&this->skelAnime, 25.0f))) {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EV_PIRATE_WALK);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EV_PIRATE_WALK);
}
if ((this->animIndex == GERUDO_WHITE_ANIM_SALUTE) && Animation_OnFrame(&this->skelAnime, 14.0f)) {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EV_PIRATE_WALK);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EV_PIRATE_WALK);
}
} else {
this->picto.actor.draw = NULL;
}
- if (this->csAction == 9) {
- if ((this->curPoint < this->path->count) && EnGe1_FollowPath(this)) {
- this->curPoint++;
- }
+ switch (this->cueId) {
+ case 9:
+ if ((this->curPointIndex < this->path->count) && EnGe1_FollowPath(this)) {
+ this->curPointIndex++;
+ }
- // Tumble in the air
- this->picto.actor.shape.rot.x += 0x3E8;
- this->picto.actor.shape.rot.y += 0x7D0;
- this->picto.actor.shape.rot.z += 0x1F4;
+ // Tumble in the air
+ this->picto.actor.shape.rot.x += 0x3E8;
+ this->picto.actor.shape.rot.y += 0x7D0;
+ this->picto.actor.shape.rot.z += 0x1F4;
- if (this->screamTimer > 0) {
- this->screamTimer--;
- } else {
- this->screamTimer = (s32)(Rand_ZeroFloat(10.0f) + 20.0f);
- EnGe1_Scream(this);
- }
+ if (this->screamTimer > 0) {
+ this->screamTimer--;
+ } else {
+ this->screamTimer = (s32)(Rand_ZeroFloat(10.0f) + 20.0f);
+ EnGe1_Scream(this);
+ }
+ break;
+
+ default:
+ break;
}
}
@@ -369,7 +377,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;
@@ -433,6 +442,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);
@@ -449,7 +461,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 5388a1186..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 {
@@ -29,12 +31,12 @@ typedef struct EnGe1 {
/* 0x2A4 */ Vec3s headRot;
/* 0x2AA */ Vec3s torsoRot;
/* 0x2B0 */ Path* path;
- /* 0x2B4 */ s32 curPoint;
+ /* 0x2B4 */ s32 curPointIndex;
/* 0x2B8 */ s16 eyeIndex;
/* 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 4659c4aa9..45d304aaf 100644
--- a/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c
+++ b/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c
@@ -6,7 +6,7 @@
#include "z_en_ge2.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_80000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_80000000)
#define THIS ((EnGe2*)thisx)
@@ -15,18 +15,14 @@ void EnGe2_Destroy(Actor* thisx, PlayState* play);
void EnGe2_Update(Actor* thisx, PlayState* play);
void EnGe2_Draw(Actor* thisx, PlayState* play);
-void func_80B8BCEC(EnGe2* this, PlayState* play);
-void func_80B8BD38(EnGe2* this, PlayState* play);
-void func_80B8BE08(EnGe2* this, PlayState* play);
-void func_80B8BF04(EnGe2* this, PlayState* play);
-void func_80B8C048(EnGe2* this, PlayState* play);
-void func_80B8C0B0(EnGe2* this, PlayState* play);
-void func_80B8C45C(EnGe2* this, PlayState* play);
-void func_80B8C59C(EnGe2* this, PlayState* play);
-void func_80B8C644(EnGe2* this, PlayState* play);
-void func_80B8C9B8(EnGe2* this, PlayState* play);
+s32 EnGe2_SetupPath(EnGe2* this, PlayState* play);
+
+void EnGe2_LookAround(EnGe2* this, PlayState* play);
+void EnGe2_Walk(EnGe2* this, PlayState* play);
+void EnGe2_GuardStationary(EnGe2* this, PlayState* play);
+
+s32 EnGe2_ValidatePictograph(PlayState* play, Actor* thisx);
-#if 0
ActorInit En_Ge2_InitVars = {
ACTOR_EN_GE2,
ACTORCAT_NPC,
@@ -39,78 +35,747 @@ ActorInit En_Ge2_InitVars = {
(ActorFunc)EnGe2_Draw,
};
-// static ColliderCylinderInit sCylinderInit = {
-static ColliderCylinderInit D_80B8CE40 = {
- { COLTYPE_NONE, AT_NONE, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_CYLINDER, },
- { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0x038BFBB3, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, },
+typedef enum {
+ /* 0 */ GERUDO_PURPLE_DETECTION_UNDETECTED,
+ /* 1 */ GERUDO_PURPLE_DETECTION_HEARD,
+ /* 2 */ GERUDO_PURPLE_DETECTION_PROXIMITY //!< Higher priority
+} GerudoPurpleDetection;
+
+typedef enum {
+ /* 0 */ GERUDO_PURPLE_PATHSTATUS_NORMAL, //!< not near waypoint
+ /* 1 */ GERUDO_PURPLE_PATHSTATUS_AT_POINT, //!< no path or new waypoint
+ /* 2 */ GERUDO_PURPLE_PATHSTATUS_END //!< reached end of path
+} GerudoPurplePathStatus;
+
+#define GERUDO_PURPLE_STATE_PATH_REVERSE (1 << 0) //!< Follow path backwards instead of forwards.
+#define GERUDO_PURPLE_STATE_KO (1 << 1)
+#define GERUDO_PURPLE_STATE_STUNNED (1 << 2) //!< Specifically by Deku Nuts
+#define GERUDO_PURPLE_STATE_DISABLE_MOVEMENT \
+ (1 << 3) //!< Disable normal movement to let pathing function control it completely.
+#define GERUDO_PURPLE_STATE_CAPTURING (1 << 5) //!< Set but not used
+
+static ColliderCylinderInit sCylinderInit = {
+ {
+ COLTYPE_NONE,
+ AT_NONE,
+ AC_ON | AC_TYPE_PLAYER,
+ OC1_ON | OC1_TYPE_ALL,
+ OC2_TYPE_1,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK0,
+ { 0x00000000, 0x00, 0x00 },
+ { 0x038BFBB3, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_ON,
+ },
{ 30, 60, 0, { 0, 0, 0 } },
};
-#endif
+void EnGe2_Init(Actor* thisx, PlayState* play) {
+ s32 pad;
+ EnGe2* this = THIS;
-extern ColliderCylinderInit D_80B8CE40;
+ ActorShape_Init(&this->picto.actor.shape, 0.0f, ActorShadow_DrawCircle, 36.0f);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gGerudoPurpleSkel, NULL, this->jointTable, this->morphTable,
+ GERUDO_PURPLE_LIMB_MAX);
+ Animation_PlayLoop(&this->skelAnime, &gGerudoPurpleWalkingAnim);
-extern UNK_TYPE D_06008DD8;
-extern UNK_TYPE D_060091D0;
-extern UNK_TYPE D_06009D1C;
-extern UNK_TYPE D_0600A344;
+ Collider_InitAndSetCylinder(play, &this->collider, &this->picto.actor, &sCylinderInit);
+ this->picto.actor.colChkInfo.mass = MASS_IMMOVABLE;
+ Actor_SetScale(&this->picto.actor, 0.01f);
+ this->picto.actor.uncullZoneForward = 1200.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/EnGe2_Init.s")
+ if (this->picto.actor.world.rot.z == 0) {
+ this->verticalDetectRange = 40.0f;
+ } else {
+ this->verticalDetectRange = fabsf(this->picto.actor.world.rot.z * 20.0f);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/EnGe2_Destroy.s")
+ this->picto.actor.world.rot.x = this->picto.actor.shape.rot.x = 0;
+ this->picto.actor.world.rot.z = this->picto.actor.shape.rot.z = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8B514.s")
+ this->picto.actor.targetMode = TARGET_MODE_6;
+ this->stateFlags = 0;
+ this->detectedStatus = GERUDO_PURPLE_DETECTION_UNDETECTED;
+ this->cueId = -1;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8B5AC.s")
+ this->picto.actor.terminalVelocity = -9.0f;
+ this->picto.actor.gravity = -1.0f;
+ this->picto.actor.speed = 1.5f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8B6B4.s")
+ this->actionFunc = EnGe2_Walk;
+ this->picto.validationFunc = EnGe2_ValidatePictograph;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8B7A8.s")
+ EnGe2_SetupPath(this, play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8B848.s")
+ this->picto.actor.flags |= ACTOR_FLAG_10;
+ if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
+ this->picto.actor.flags |= (ACTOR_FLAG_10 | ACTOR_FLAG_20);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8B90C.s")
+ switch (GERUDO_PURPLE_GET_TYPE(&this->picto.actor)) {
+ case GERUDO_PURPLE_TYPE_BOAT_SENTRY:
+ Animation_Change(&this->skelAnime, &gGerudoPurpleLookingAboutAnim, 1.0f, 0.0f,
+ Animation_GetLastFrame(&gGerudoPurpleLookingAboutAnim), ANIMMODE_LOOP, 0.0f);
+ this->actionFunc = EnGe2_GuardStationary;
+ this->picto.actor.speed = 0.0f;
+ this->picto.actor.uncullZoneForward = 4000.0f;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8BA40.s")
+ case GERUDO_PURPLE_TYPE_AVEIL_GUARD:
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_83_02)) {
+ Actor_Kill(&this->picto.actor);
+ }
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8BB3C.s")
+ default:
+ break;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8BC1C.s")
+void EnGe2_Destroy(Actor* thisx, PlayState* play) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8BC78.s")
+// Detect Player through hearing or proximity
+GerudoPurpleDetection EnGe2_DetectPlayer(PlayState* play, EnGe2* this) {
+ if (this->picto.actor.xzDistToPlayer > 250.0f) {
+ return GERUDO_PURPLE_DETECTION_UNDETECTED;
+ } else if ((Player_GetMask(play) != PLAYER_MASK_STONE) && (this->picto.actor.xzDistToPlayer < 50.0f)) {
+ return GERUDO_PURPLE_DETECTION_PROXIMITY;
+ } else if (func_800B715C(play)) {
+ return GERUDO_PURPLE_DETECTION_HEARD;
+ } else {
+ return GERUDO_PURPLE_DETECTION_UNDETECTED;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8BCEC.s")
+/**
+ * Spotted Player with line-of-sight
+ *
+ * @param play PlayState
+ * @param thisx Actor to use for range and angle checks
+ * @param pos Position to check from
+ * @param yaw Center of yaw range to check
+ * @param yawRange Spread of angles from `yaw` to check. If 0, do not check yaw
+ * @param xzRange Horizontal range to check
+ * @param yRange Vertical range to check
+ * @return true if Player is visible with these settings
+ */
+s32 EnGe2_LookForPlayer(PlayState* play, Actor* actor, Vec3f* pos, s16 yaw, s16 yawRange, f32 xzRange, f32 yRange) {
+ s16 yawToPlayer;
+ Vec3f posResult;
+ CollisionPoly* outPoly;
+ Player* player = GET_PLAYER(play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8BD38.s")
+ if (Player_GetMask(play) == PLAYER_MASK_STONE) {
+ return false;
+ }
+ if (actor->xzDistToPlayer > xzRange) {
+ return false;
+ }
+ if (fabsf(actor->playerHeightRel) > yRange) {
+ return false;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8BD90.s")
+ yawToPlayer = actor->yawTowardsPlayer - yaw;
+ if ((yawRange > 0) && (yawRange < ABS_ALT(yawToPlayer))) {
+ return false;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8BE08.s")
+ if (BgCheck_AnyLineTest1(&play->colCtx, pos, &player->bodyPartsPos[PLAYER_BODYPART_HEAD], &posResult, &outPoly,
+ false)) {
+ return false;
+ } else {
+ return true;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8BF04.s")
+/* Path functions */
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8BFC8.s")
+/**
+ * Set up the path if it exists, choose the end and direction
+ *
+ * @return true if path is set up in reverse
+ */
+s32 EnGe2_SetupPath(EnGe2* this, PlayState* play) {
+ 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);
+ f32 diffX = points[0].x - this->picto.actor.world.pos.x;
+ f32 diffZ = points[0].z - this->picto.actor.world.pos.z;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8C048.s")
+ if ((SQ(diffX) + SQ(diffZ)) < SQ(10.0f)) {
+ this->curPointIndex = 0;
+ this->stateFlags &= ~GERUDO_PURPLE_STATE_PATH_REVERSE;
+ } else {
+ this->curPointIndex = path->count - 1;
+ this->stateFlags |= GERUDO_PURPLE_STATE_PATH_REVERSE;
+ return true;
+ }
+ }
+ } else {
+ this->path = NULL;
+ this->curPointIndex = 0;
+ }
+ return false;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8C0B0.s")
+void EnGe2_GetNextPath(EnGe2* this, PlayState* play) {
+ Path* curPath;
+ Path* nextPath;
+ Vec3s* points;
+ u8 nextPathIndex;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8C13C.s")
+ this->curPointIndex = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8C45C.s")
+ 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;
+ this->picto.actor.world.pos.z = points[0].z;
+ } else {
+ this->path = NULL;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8C59C.s")
+void EnGe2_SetupBlownAwayPath(EnGe2* this, PlayState* play) {
+ s32 pad;
+ Vec3s* points;
+ Vec3f nextPoint;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8C644.s")
+ this->curPointIndex = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8C9B8.s")
+ 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);
+ this->curPointIndex++;
+ points++;
+ Math_Vec3s_ToVec3f(&nextPoint, points);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/EnGe2_Update.s")
+ this->picto.actor.world.rot.y = Math_Vec3f_Yaw(&this->picto.actor.world.pos, &nextPoint);
+ this->picto.actor.world.rot.x = Math_Vec3f_Pitch(&this->picto.actor.world.pos, &nextPoint);
+ this->picto.actor.speed = 15.0f;
+ }
+ } else {
+ this->path = NULL;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8CC0C.s")
+GerudoPurplePathStatus EnGe2_FollowPath(EnGe2* this) {
+ Path* path = this->path;
+ Vec3s* curPoint;
+ f32 diffX;
+ f32 diffZ;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8CCB4.s")
+ if (path == NULL) {
+ return GERUDO_PURPLE_PATHSTATUS_AT_POINT;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/func_80B8CCFC.s")
+ curPoint = (Vec3s*)Lib_SegmentedToVirtual(path->points);
+ curPoint += this->curPointIndex;
+ diffX = curPoint->x - this->picto.actor.world.pos.x;
+ diffZ = curPoint->z - this->picto.actor.world.pos.z;
+ this->picto.actor.world.rot.y = Math_Atan2S(diffX, diffZ);
+ Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->picto.actor.world.rot.y, 2, 0x7D0, 0xC8);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge2/EnGe2_Draw.s")
+ if ((SQ(diffX) + SQ(diffZ)) < SQ(10.0f)) {
+ if (this->stateFlags & GERUDO_PURPLE_STATE_PATH_REVERSE) {
+ this->curPointIndex--;
+ if (this->curPointIndex < 0) {
+ return GERUDO_PURPLE_PATHSTATUS_END;
+ }
+ } else {
+ this->curPointIndex++;
+ if (this->curPointIndex >= path->count) {
+ return GERUDO_PURPLE_PATHSTATUS_END;
+ }
+ }
+ return GERUDO_PURPLE_PATHSTATUS_AT_POINT;
+ }
+
+ return GERUDO_PURPLE_PATHSTATUS_NORMAL;
+}
+
+/**
+ * Used for Blown Away cutscene path.
+ */
+s32 EnGe2_FollowPathWithoutGravity(EnGe2* this) {
+ s32 pad;
+ Vec3s* curPoint;
+ Path* path = this->path;
+ Vec3f point;
+ s16 yawTarget;
+ s16 pitchTarget;
+
+ if (this->path == NULL) {
+ return true;
+ }
+
+ curPoint = Lib_SegmentedToVirtual(path->points);
+ curPoint += this->curPointIndex;
+
+ Math_Vec3s_ToVec3f(&point, curPoint);
+ yawTarget = Math_Vec3f_Yaw(&this->picto.actor.world.pos, &point);
+ pitchTarget = Math_Vec3f_Pitch(&this->picto.actor.world.pos, &point);
+ Math_SmoothStepToS(&this->picto.actor.world.rot.y, yawTarget, 0xA, 0x3E8, 0x64);
+ Math_SmoothStepToS(&this->picto.actor.world.rot.x, pitchTarget, 6, 0x7D0, 0xC8);
+ this->picto.actor.speed = 15.0f;
+
+ Actor_MoveWithoutGravityReverse(&this->picto.actor);
+
+ if (Math_Vec3f_DistXYZ(&this->picto.actor.world.pos, &point) < 40.0f) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/* Action and helper functions */
+
+void EnGe2_SpawnEffects(EnGe2* this, PlayState* play) {
+ static Vec3f sEffectVelocity = { 0.0f, -0.05f, 0.0f };
+ static Vec3f sEffectAccel = { 0.0f, -0.025f, 0.0f };
+ static Color_RGBA8 sEffectPrimColor = { 255, 255, 255, 0 };
+ static Color_RGBA8 sEffectEnvColor = { 255, 150, 0, 0 };
+ s16 effectAngle = play->state.frames * 0x2800;
+ Vec3f effectPos;
+
+ effectPos.x = (Math_CosS(effectAngle) * 5.0f) + this->picto.actor.focus.pos.x;
+ effectPos.y = this->picto.actor.focus.pos.y + 10.0f;
+ effectPos.z = (Math_SinS(effectAngle) * 5.0f) + this->picto.actor.focus.pos.z;
+ EffectSsKirakira_SpawnDispersed(play, &effectPos, &sEffectVelocity, &sEffectAccel, &sEffectPrimColor,
+ &sEffectEnvColor, 1000, 16);
+}
+
+void EnGe2_Scream(EnGe2* this) {
+ if ((s32)Rand_ZeroFloat(2.0f) == 0) {
+ Actor_PlaySfx(&this->picto.actor, NA_SE_VO_FPVO00);
+ } else {
+ Actor_PlaySfx(&this->picto.actor, NA_SE_VO_FPVO01);
+ }
+}
+
+/**
+ * Wait for timer to finish, then set up the captured/thrown out transition.
+ */
+void EnGe2_ThrowPlayerOut(EnGe2* this, PlayState* play) {
+ if (this->timer > 0) {
+ this->timer--;
+ } else if (play->nextEntrance != play->setupExitList[GERUDO_PURPLE_GET_EXIT(&this->picto.actor)]) {
+ play->nextEntrance = play->setupExitList[GERUDO_PURPLE_GET_EXIT(&this->picto.actor)];
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ play->transitionType = TRANS_TYPE_38;
+ }
+}
+
+/**
+ * Used if Aveil spots Player.
+ */
+void EnGe2_TurnToPlayerFast(EnGe2* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->picto.actor.yawTowardsPlayer, 2, 0x1000, 0x200);
+}
+
+void EnGe2_CapturePlayer(EnGe2* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->picto.actor.yawTowardsPlayer, 2, 0x400, 0x100);
+ EnGe2_ThrowPlayerOut(this, play);
+}
+
+void EnGe2_SetupCapturePlayer(EnGe2* this) {
+ this->picto.actor.speed = 0.0f;
+ this->actionFunc = EnGe2_CapturePlayer;
+ Animation_Change(&this->skelAnime, &gGerudoPurpleLookingAboutAnim, 1.0f, 0.0f,
+ Animation_GetLastFrame(&gGerudoPurpleLookingAboutAnim), ANIMMODE_LOOP, -8.0f);
+}
+
+void EnGe2_Charge(EnGe2* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->picto.actor.yawTowardsPlayer, 2, 0x400, 0x100);
+ this->picto.actor.world.rot.y = this->picto.actor.shape.rot.y;
+
+ if (this->picto.actor.xzDistToPlayer < 50.0f) {
+ EnGe2_SetupCapturePlayer(this);
+ } else if (!(this->picto.actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ this->picto.actor.world.pos = this->picto.actor.prevPos;
+ EnGe2_SetupCapturePlayer(this);
+ }
+
+ if (this->timer > 0) {
+ this->timer--;
+ } else {
+ EnGe2_ThrowPlayerOut(this, play);
+ }
+
+ if (Animation_OnFrame(&this->skelAnime, 2.0f) || Animation_OnFrame(&this->skelAnime, 6.0f)) {
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EV_PIRATE_WALK);
+ }
+}
+
+void EnGe2_SetupCharge(EnGe2* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->picto.actor.yawTowardsPlayer, 2, 0x400, 0x100);
+ this->picto.actor.world.rot.y = this->picto.actor.shape.rot.y;
+
+ if (this->picto.actor.shape.rot.y == this->picto.actor.yawTowardsPlayer) {
+ Animation_Change(&this->skelAnime, &gGerudoPurpleChargingAnim, 1.0f, 0.0f,
+ Animation_GetLastFrame(&gGerudoPurpleChargingAnim), ANIMMODE_LOOP, -8.0f);
+ this->timer = 50;
+ this->picto.actor.speed = 4.0f;
+ this->actionFunc = EnGe2_Charge;
+ }
+}
+
+void EnGe2_SetupLookAround(EnGe2* this) {
+ Animation_Change(&this->skelAnime, &gGerudoPurpleLookingAboutAnim, 1.0f, 0.0f,
+ Animation_GetLastFrame(&gGerudoPurpleLookingAboutAnim), ANIMMODE_LOOP, -8.0f);
+ this->timer = 60;
+ this->picto.actor.speed = 0.0f;
+ this->actionFunc = EnGe2_LookAround;
+}
+
+void EnGe2_Stunned(EnGe2* this, PlayState* play) {
+ if (this->picto.actor.colorFilterTimer == 0) {
+ EnGe2_SetupLookAround(this);
+ this->detectedStatus = GERUDO_PURPLE_DETECTION_UNDETECTED;
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
+ this->stateFlags &= ~GERUDO_PURPLE_STATE_STUNNED;
+ }
+}
+
+void EnGe2_KnockedOut(EnGe2* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ EnGe2_SpawnEffects(this, play);
+
+ if (this->timer > 0) {
+ this->timer--;
+ } else {
+ EnGe2_SetupLookAround(this);
+ this->detectedStatus = GERUDO_PURPLE_DETECTION_UNDETECTED;
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
+ this->stateFlags &= ~GERUDO_PURPLE_STATE_KO;
+ this->picto.actor.flags |= ACTOR_FLAG_TARGETABLE;
+ }
+}
+
+/**
+ * Carries out various patrol functions:
+ * - Turning to Player if being arrested
+ * - Turning to Player if spotted by Aveil
+ * - Looking for Player
+ * - Managing collisions and collider
+ */
+void EnGe2_PatrolDuties(EnGe2* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+ f32 visionRange = gSaveContext.save.isNight ? 200.0f : 280.0f;
+
+ if (player->csMode == PLAYER_CSMODE_26) {
+ this->picto.actor.speed = 0.0f;
+ this->actionFunc = EnGe2_SetupCharge;
+ Animation_Change(&this->skelAnime, &gGerudoPurpleLookingAboutAnim, 1.0f, 0.0f,
+ Animation_GetLastFrame(&gGerudoPurpleLookingAboutAnim), ANIMMODE_LOOP, -8.0f);
+ this->stateFlags |= GERUDO_PURPLE_STATE_CAPTURING;
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_80_08)) {
+ this->picto.actor.speed = 0.0f;
+ this->actionFunc = EnGe2_TurnToPlayerFast;
+ Animation_Change(&this->skelAnime, &gGerudoPurpleLookingAboutAnim, 1.0f, 0.0f,
+ Animation_GetLastFrame(&gGerudoPurpleLookingAboutAnim), ANIMMODE_LOOP, -8.0f);
+ } else if (EnGe2_LookForPlayer(play, &this->picto.actor, &this->picto.actor.focus.pos,
+ this->picto.actor.shape.rot.y, 0x1800, visionRange, this->verticalDetectRange)) {
+ if ((GERUDO_PURPLE_GET_EXIT(&this->picto.actor) != GERUDO_PURPLE_EXIT_NONE) && !Play_InCsMode(play)) {
+ this->picto.actor.speed = 0.0f;
+ func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_26);
+ Lib_PlaySfx(NA_SE_SY_FOUND);
+ Message_StartTextbox(play, 0x1194, &this->picto.actor);
+ this->actionFunc = EnGe2_SetupCharge;
+ Animation_Change(&this->skelAnime, &gGerudoPurpleLookingAboutAnim, 1.0f, 0.0f,
+ Animation_GetLastFrame(&gGerudoPurpleLookingAboutAnim), ANIMMODE_LOOP, -8.0f);
+ }
+ } else if (this->collider.base.acFlags & AC_HIT) {
+ if ((this->collider.info.acHitInfo != NULL) &&
+ (this->collider.info.acHitInfo->toucher.dmgFlags & DMG_DEKU_NUT)) {
+ Actor_SetColorFilter(&this->picto.actor, 0, 120, 0, 400);
+ this->picto.actor.speed = 0.0f;
+ this->actionFunc = EnGe2_Stunned;
+ this->stateFlags |= GERUDO_PURPLE_STATE_STUNNED;
+ } else {
+ Animation_Change(&this->skelAnime, &gGerudoPurpleFallingToGroundAnim, 1.0f, 0.0f,
+ Animation_GetLastFrame(&gGerudoPurpleFallingToGroundAnim), ANIMMODE_ONCE, -8.0f);
+ this->timer = 200;
+ this->picto.actor.speed = 0.0f;
+ this->actionFunc = EnGe2_KnockedOut;
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_PIRATE_DEAD);
+ this->picto.actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ this->stateFlags |= GERUDO_PURPLE_STATE_KO;
+ }
+ } else if (this->picto.actor.home.rot.x == 0) {
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
+ }
+}
+
+void EnGe2_LookAround(EnGe2* this, PlayState* play) {
+ u8 detectedStatus;
+
+ SkelAnime_Update(&this->skelAnime);
+
+ detectedStatus = EnGe2_DetectPlayer(play, this);
+ if (detectedStatus != GERUDO_PURPLE_DETECTION_UNDETECTED) {
+ this->timer = 100;
+ this->yawTarget = this->picto.actor.yawTowardsPlayer;
+
+ if (this->detectedStatus < detectedStatus) {
+ this->detectedStatus = detectedStatus;
+ }
+ }
+
+ if (this->timer > 0) {
+ this->timer--;
+ } else {
+ this->actionFunc = EnGe2_Walk;
+ Animation_Change(&this->skelAnime, &gGerudoPurpleWalkingAnim, 1.0f, 0.0f,
+ Animation_GetLastFrame(&gGerudoPurpleWalkingAnim), ANIMMODE_LOOP, -8.0f);
+ this->headRot.y = 0;
+ this->detectedStatus = GERUDO_PURPLE_DETECTION_UNDETECTED;
+ }
+
+ switch (this->detectedStatus) {
+ case GERUDO_PURPLE_DETECTION_HEARD:
+ Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->yawTarget, 2, 0x3E8, 0x1F4);
+ break;
+
+ case GERUDO_PURPLE_DETECTION_PROXIMITY:
+ Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->yawTarget, 2, 0xBB8, 0x3E8);
+ break;
+
+ default:
+ break;
+ }
+
+ this->picto.actor.world.rot.y = this->picto.actor.shape.rot.y;
+ EnGe2_PatrolDuties(this, play);
+}
+
+void EnGe2_Walk(EnGe2* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ this->picto.actor.speed = 1.5f;
+
+ switch (EnGe2_FollowPath(this)) {
+ case GERUDO_PURPLE_PATHSTATUS_END:
+ EnGe2_SetupPath(this, play);
+ break;
+
+ case GERUDO_PURPLE_PATHSTATUS_AT_POINT:
+ EnGe2_SetupLookAround(this);
+ this->detectedStatus = GERUDO_PURPLE_DETECTION_UNDETECTED;
+ break;
+
+ default: // GERUDO_PURPLE_PATHSTATUS_NORMAL
+ break;
+ }
+
+ this->detectedStatus = EnGe2_DetectPlayer(play, this);
+ if (this->detectedStatus != GERUDO_PURPLE_DETECTION_UNDETECTED) {
+ EnGe2_SetupLookAround(this);
+ this->yawTarget = this->picto.actor.yawTowardsPlayer;
+ }
+ EnGe2_PatrolDuties(this, play);
+}
+
+void EnGe2_PerformCutsceneActions(EnGe2* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_476)) {
+ s16 cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_476)]->id;
+
+ 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), ANIMMODE_LOOP, -8.0f);
+ EnGe2_GetNextPath(this, play);
+ break;
+
+ case ENGE2_CUEID_BEEHIVE_RUN_AWAY:
+ Animation_Change(&this->skelAnime, &gGerudoPurpleRunningAwayCutsceneAnim, 1.0f, 0.0f,
+ Animation_GetLastFrame(&gGerudoPurpleRunningAwayCutsceneAnim), ANIMMODE_LOOP,
+ -5.0f);
+ this->screamTimer = (s32)(Rand_ZeroFloat(10.0f) + 20.0f);
+ break;
+
+ case ENGE2_CUEID_BEEHIVE_EXIT:
+ Actor_Kill(&this->picto.actor);
+ break;
+
+ case ENGE2_CUEID_GBT_ENTR_STAND_STILL:
+ Animation_Change(&this->skelAnime, &gGerudoPurpleGreatBayCutsceneAnim, 0.0f, 0.0f, 0.0f,
+ ANIMMODE_ONCE, 0.0f);
+ break;
+
+ case ENGE2_CUEID_GBT_ENTR_BLOWN_AWAY:
+ Animation_Change(&this->skelAnime, &gGerudoPurpleGreatBayCutsceneAnim, 0.0f, 1.0f, 1.0f,
+ ANIMMODE_ONCE, 0.0f);
+ EnGe2_SetupBlownAwayPath(this, play);
+ this->stateFlags |= GERUDO_PURPLE_STATE_DISABLE_MOVEMENT;
+ this->screamTimer = (s32)(Rand_ZeroFloat(10.0f) + 20.0f);
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ switch (this->cueId) {
+ case ENGE2_CUEID_BEEHIVE_RUN_AWAY:
+ EnGe2_FollowPath(this);
+ this->picto.actor.speed = 5.0f;
+
+ if (Animation_OnFrame(&this->skelAnime, 2.0f) || Animation_OnFrame(&this->skelAnime, 6.0f)) {
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EV_PIRATE_WALK);
+ }
+
+ if (this->screamTimer > 0) {
+ this->screamTimer--;
+ } else {
+ this->screamTimer = (s32)(Rand_ZeroFloat(10.0f) + 20.0f);
+ EnGe2_Scream(this);
+ }
+ break;
+
+ case ENGE2_CUEID_GBT_ENTR_BLOWN_AWAY:
+ if ((this->curPointIndex < this->path->count) && EnGe2_FollowPathWithoutGravity(this)) {
+ this->curPointIndex++;
+ }
+
+ // Tumble in the air
+ this->picto.actor.shape.rot.x += 0x3E8;
+ this->picto.actor.shape.rot.y += 0x7D0;
+ this->picto.actor.shape.rot.z += 0x1F4;
+
+ if (this->screamTimer > 0) {
+ this->screamTimer--;
+ } else {
+ this->screamTimer = (s32)(Rand_ZeroFloat(10.0f) + 20.0f);
+ EnGe2_Scream(this);
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+// Used for those on boats
+void EnGe2_GuardStationary(EnGe2* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ if (EnGe2_LookForPlayer(play, &this->picto.actor, &this->picto.actor.focus.pos, this->picto.actor.shape.rot.y,
+ 0x4000, 720.0f, this->verticalDetectRange)) {
+ if ((GERUDO_PURPLE_GET_EXIT(&this->picto.actor) != GERUDO_PURPLE_EXIT_NONE) && !Play_InCsMode(play)) {
+ func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_26);
+ Lib_PlaySfx(NA_SE_SY_FOUND);
+ Message_StartTextbox(play, 0x1194, &this->picto.actor);
+ this->timer = 50;
+ EnGe2_SetupCapturePlayer(this);
+ }
+ }
+
+ if (this->picto.actor.playerHeightRel < -150.0f) {
+ this->picto.actor.draw = NULL;
+ } else {
+ this->picto.actor.draw = EnGe2_Draw;
+ }
+}
+
+void EnGe2_Update(Actor* thisx, PlayState* play) {
+ s32 pad;
+ EnGe2* this = THIS;
+
+ 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,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
+ Collider_UpdateCylinder(&this->picto.actor, &this->collider);
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
+
+ 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;
+ this->picto.actor.flags |= ACTOR_FLAG_20;
+ this->picto.actor.speed = 0.0f;
+ }
+
+ this->actionFunc(this, play);
+
+ // Blinking
+ if (this->stateFlags & GERUDO_PURPLE_STATE_KO) {
+ this->eyeIndex = 2;
+ } else if (!(this->stateFlags & GERUDO_PURPLE_STATE_STUNNED)) {
+ if (DECR(this->blinkTimer) == 0) {
+ this->blinkTimer = Rand_S16Offset(60, 60);
+ }
+ this->eyeIndex = this->blinkTimer;
+ if (this->eyeIndex >= 3) {
+ this->eyeIndex = 0;
+ }
+ }
+}
+
+s32 EnGe2_ValidatePictograph(PlayState* play, Actor* thisx) {
+ s32 ret = Snap_ValidatePictograph(play, thisx, PICTO_VALID_PIRATE_GOOD, &thisx->focus.pos, &thisx->shape.rot, 10.0f,
+ 400.0f, -1);
+
+ ret |= Snap_ValidatePictograph(play, thisx, PICTO_VALID_PIRATE_TOO_FAR, &thisx->focus.pos, &thisx->shape.rot, 10.0f,
+ 1200.0f, -1);
+ return ret;
+}
+
+s32 EnGe2_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
+ EnGe2* this = THIS;
+
+ if (limbIndex == GERUDO_PURPLE_NECK_LIMB) {
+ rot->x += this->headRot.y;
+ rot->z += this->headRot.x;
+ }
+ return false;
+}
+
+void EnGe2_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
+ static Vec3f sFocusOffset = { 600.0f, 700.0f, 0.0f };
+
+ if (limbIndex == GERUDO_PURPLE_HEAD_LIMB) {
+ Matrix_MultVec3f(&sFocusOffset, &thisx->focus.pos);
+ }
+}
+
+void EnGe2_Draw(Actor* thisx, PlayState* play) {
+ static TexturePtr sEyeTextures[] = {
+ gGerudoPurpleEyeOpenTex,
+ gGerudoPurpleEyeHalfTex,
+ gGerudoPurpleEyeClosedTex,
+ };
+ s32 pad;
+ EnGe2* this = THIS;
+
+ OPEN_DISPS(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,
+ EnGe2_OverrideLimbDraw, EnGe2_PostLimbDraw, &this->picto.actor);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
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 0558166db..ee0d99d00 100644
--- a/src/overlays/actors/ovl_En_Ge2/z_en_ge2.h
+++ b/src/overlays/actors/ovl_En_Ge2/z_en_ge2.h
@@ -2,14 +2,58 @@
#define Z_EN_GE2_H
#include "global.h"
+#include "z64snap.h"
+#include "objects/object_gla/object_gla.h"
struct EnGe2;
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_INDEX(thisx) ((((thisx)->params) & 0xFC00) >> 10)
+
+#define GERUDO_PURPLE_PARAMS(exit, type, pathIndex) (((exit) & 0x1F) | (((type) & 7) << 5) | (((pathIndex) & 0x3F) << 10))
+
+#define GERUDO_PURPLE_EXIT_NONE 0x1F
+#define GERUDO_PRUPLE_PATH_INDEX_NONE 0x3F
+
+typedef enum {
+ /* 0 */ GERUDO_PURPLE_TYPE_CUTSCENE,
+ /* 1 */ GERUDO_PURPLE_TYPE_BOAT_SENTRY, //!< on boats
+ /* 2 */ GERUDO_PURPLE_TYPE_AVEIL_GUARD,
+ /* 7 */ GERUDO_PURPLE_TYPE_FORTRESS = 7 //!< In both courtyard and rooms
+} GerudoPurpleType;
+
+//! TODO: work out where to put this
+typedef enum {
+ /* 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 {
- /* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x1C4];
+ /* 0x000 */ PictoActor picto;
+ /* 0x148 */ ColliderCylinder collider;
+ /* 0x194 */ SkelAnime skelAnime;
+ /* 0x1D8 */ Vec3s jointTable[GERUDO_PURPLE_LIMB_MAX];
+ /* 0x25C */ Vec3s morphTable[GERUDO_PURPLE_LIMB_MAX];
+ /* 0x2E0 */ s16 eyeIndex;
+ /* 0x2E2 */ s16 blinkTimer;
+ /* 0x2E4 */ Vec3s headRot;
+ /* 0x2E8 */ Vec3s torsoRot; // unused, inferred from similar usage in other actors
+ /* 0x2F0 */ Path* path;
+ /* 0x2F4 */ s32 curPointIndex;
+ /* 0x2F8 */ u16 stateFlags;
+ /* 0x2FA */ s16 yawTarget; //!< used when Player detected to fix the yaw to turn to
+ /* 0x2FC */ f32 verticalDetectRange; //!< vertical range to look for the player within
+ /* 0x300 */ u8 timer;
+ /* 0x301 */ u8 detectedStatus;
+ /* 0x302 */ s16 cueId;
+ /* 0x304 */ s16 unk304; // unused
+ /* 0x306 */ s16 screamTimer;
/* 0x308 */ EnGe2ActionFunc actionFunc;
} EnGe2; // size = 0x30C
diff --git a/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c b/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c
index 1f680e9e8..21f207e7c 100644
--- a/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c
+++ b/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c
@@ -1,12 +1,12 @@
/*
* File: z_en_ge3.c
* Overlay: ovl_En_Ge3
- * Description: Aviel
+ * Description: Aviel, leader of the Gerudo Pirates
*/
#include "z_en_ge3.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_80000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_80000000)
#define THIS ((EnGe3*)thisx)
@@ -15,7 +15,26 @@ void EnGe3_Destroy(Actor* thisx, PlayState* play);
void EnGe3_Update(Actor* thisx, PlayState* play);
void EnGe3_Draw(Actor* thisx, PlayState* play);
-#if 0
+void EnGe3_ChangeAnim(EnGe3* this, s16 animIndex, u8 animMode, f32 morphFrames);
+void EnGe3_SetupPath(EnGe3* this, PlayState* play);
+void EnGe3_Idle(EnGe3* this, PlayState* play);
+void EnGe3_AveilsChamberIdle(EnGe3* this, PlayState* play);
+s32 EnGe3_ValidatePictograph(PlayState* play, Actor* thisx);
+
+typedef enum GerudoAveilAnimation {
+ /* -1 */ GERUDO_AVEIL_ANIM_NONE = -1,
+ /* 0 */ GERUDO_AVEIL_ANIM_STAND,
+ /* 1 */ GERUDO_AVEIL_ANIM_WALK,
+ /* 2 */ GERUDO_AVEIL_ANIM_HAND_ON_HIP_WAIT,
+ /* 3 */ GERUDO_AVEIL_ANIM_TURN_HEAD,
+ /* 4 */ GERUDO_AVEIL_ANIM_WAIT,
+ /* 5 */ GERUDO_AVEIL_ANIM_DEMAND,
+ /* 6 */ GERUDO_AVEIL_ANIM_DISMISS,
+ /* 7 */ GERUDO_AVEIL_ANIM_BEG,
+ /* 8 */ GERUDO_AVEIL_ANIM_RUN_AWAY,
+ /* 9 */ GERUDO_AVEIL_ANIM_MAX
+} GerudoAveilAnimation;
+
ActorInit En_Ge3_InitVars = {
ACTOR_EN_GE3,
ACTORCAT_NPC,
@@ -28,49 +47,386 @@ ActorInit En_Ge3_InitVars = {
(ActorFunc)EnGe3_Draw,
};
-// static ColliderCylinderInit sCylinderInit = {
-static ColliderCylinderInit D_809A0DA0 = {
- { COLTYPE_NONE, AT_NONE, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_CYLINDER, },
- { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0x01000222, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, },
+static ColliderCylinderInit sCylinderInit = {
+ {
+ COLTYPE_NONE,
+ AT_NONE,
+ AC_ON | AC_TYPE_PLAYER,
+ OC1_ON | OC1_TYPE_ALL,
+ OC2_TYPE_1,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK0,
+ { 0x00000000, 0x00, 0x00 },
+ { 0x01000222, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_ON,
+ },
{ 20, 50, 0, { 0, 0, 0 } },
};
-#endif
+void EnGe3_Init(Actor* thisx, PlayState* play) {
+ s32 pad;
+ EnGe3* this = THIS;
-extern ColliderCylinderInit D_809A0DA0;
+ ActorShape_Init(&this->picto.actor.shape, 0.0f, ActorShadow_DrawCircle, 20.0f);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gGerudoRedSkel, NULL, this->jointTable, this->morphTable,
+ GERUDO_RED_LIMB_MAX);
+ Animation_PlayLoop(&this->skelAnime, &gGerudoRedHandOnHipWaitAnim);
+ Collider_InitAndSetCylinder(play, &this->collider, &this->picto.actor, &sCylinderInit);
+ this->picto.actor.colChkInfo.mass = MASS_IMMOVABLE;
+ Actor_SetScale(&this->picto.actor, 0.01f);
-extern UNK_TYPE D_0600A808;
+ this->animIndex = GERUDO_AVEIL_ANIM_NONE;
+ this->cueId = GERUDO_AVEIL_CUEID_NONE;
+ this->picto.validationFunc = EnGe3_ValidatePictograph;
+ EnGe3_SetupPath(this, play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge3/EnGe3_Init.s")
+ if (GERUDO_AVEIL_GET_TYPE(&this->picto.actor) == GERUDO_AVEIL_TYPE_AVEILS_CHAMBER) {
+ EnGe3_ChangeAnim(this, GERUDO_AVEIL_ANIM_HAND_ON_HIP_WAIT, ANIMMODE_LOOP, 0.0f);
+ this->actionFunc = EnGe3_AveilsChamberIdle;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge3/EnGe3_Destroy.s")
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_83_02)) {
+ Actor_Kill(&this->picto.actor);
+ return;
+ }
+ } else {
+ EnGe3_ChangeAnim(this, GERUDO_AVEIL_ANIM_WALK, ANIMMODE_LOOP, 0.0f);
+ this->actionFunc = EnGe3_Idle;
+ this->picto.actor.speed = 1.5f;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge3/func_809A0070.s")
+ this->stateFlags = 0;
+ this->picto.actor.targetMode = 6;
+ this->picto.actor.terminalVelocity = -4.0f;
+ this->picto.actor.gravity = -1.0f;
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_80_08);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge3/func_809A00F8.s")
+void EnGe3_Destroy(Actor* thisx, PlayState* play) {
+ EnGe3* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge3/func_809A020C.s")
+ Collider_DestroyCylinder(play, &this->collider);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge3/func_809A024C.s")
+void EnGe3_ChangeAnim(EnGe3* this, s16 animIndex, u8 animMode, f32 morphFrames) {
+ static AnimationHeader* sAnimations[GERUDO_AVEIL_ANIM_MAX] = {
+ &gGerudoRedStandAnim, // GERUDO_AVEIL_ANIM_STAND
+ &gGerudoRedWalkAnim, // GERUDO_AVEIL_ANIM_WALK
+ &gGerudoRedHandOnHipWaitAnim, // GERUDO_AVEIL_ANIM_HAND_ON_HIP_WAIT
+ &gGerudoRedTurnHeadAnim, // GERUDO_AVEIL_ANIM_TURN_HEAD
+ &gGerudoRedWaitAnim, // GERUDO_AVEIL_ANIM_WAIT
+ &gGerudoRedDemandAnim, // GERUDO_AVEIL_ANIM_DEMAND
+ &gGerudoRedDismissAnim, // GERUDO_AVEIL_ANIM_DISMISS
+ &gGerudoRedBegAnim, // GERUDO_AVEIL_ANIM_BEG
+ &gGerudoRedRunAwayAnim, // GERUDO_AVEIL_ANIM_RUN_AWAY
+ };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge3/func_809A0350.s")
+ Animation_Change(&this->skelAnime, sAnimations[animIndex], 1.0f, 0.0f,
+ Animation_GetLastFrame(sAnimations[animIndex]), animMode, morphFrames);
+ this->animIndex = animIndex;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge3/func_809A03AC.s")
+void EnGe3_LookAtPlayer(EnGe3* this, PlayState* play) {
+ s16 yawDiff = this->picto.actor.yawTowardsPlayer - this->picto.actor.shape.rot.y;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge3/func_809A03FC.s")
+ if ((ABS_ALT(yawDiff) <= 0x2300) && (this->picto.actor.xzDistToPlayer < 100.0f)) {
+ Actor_TrackPlayer(play, &this->picto.actor, &this->headRot, &this->torsoRot, this->picto.actor.focus.pos);
+ } else {
+ Math_SmoothStepToS(&this->headRot.x, 0, 6, 0x1838, 0x64);
+ Math_SmoothStepToS(&this->headRot.y, 0, 6, 0x1838, 0x64);
+ Math_SmoothStepToS(&this->torsoRot.x, 0, 6, 0x1838, 0x64);
+ Math_SmoothStepToS(&this->torsoRot.y, 0, 6, 0x1838, 0x64);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge3/func_809A04D0.s")
+void EnGe3_SetupPath(EnGe3* this, PlayState* play) {
+ this->curPointIndex = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge3/func_809A0820.s")
+ if (GERUDO_AVEIL_GET_PATH(&this->picto.actor) != GERUDO_AVEIL_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[GERUDO_AVEIL_GET_PATH(&this->picto.actor)];
+ } else {
+ this->path = NULL;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge3/func_809A08A4.s")
+/**
+ * @return true if no path or reached end of path
+ */
+s32 EnGe3_FollowPath(EnGe3* this) {
+ Path* path = this->path;
+ Vec3s* curPoint;
+ f32 diffX;
+ f32 diffZ;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge3/EnGe3_Update.s")
+ if (path == NULL) {
+ return true;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge3/func_809A096C.s")
+ curPoint = Lib_SegmentedToVirtual(path->points);
+ curPoint += this->curPointIndex;
+ diffX = curPoint->x - this->picto.actor.world.pos.x;
+ diffZ = curPoint->z - this->picto.actor.world.pos.z;
+ this->picto.actor.world.rot.y = Math_Atan2S(diffX, diffZ);
+ Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->picto.actor.world.rot.y, 2, 0x7D0, 0xC8);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge3/func_809A0A14.s")
+ if ((SQ(diffX) + SQ(diffZ)) < SQ(10.0f)) {
+ this->curPointIndex++;
+ if (this->curPointIndex >= path->count) {
+ return true;
+ }
+ }
+ return false;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge3/func_809A0C60.s")
+void EnGe3_Scream(EnGe3* this) {
+ if ((s32)Rand_ZeroFloat(2.0f) == 0) {
+ Actor_PlaySfx(&this->picto.actor, NA_SE_VO_FPVO00);
+ } else {
+ Actor_PlaySfx(&this->picto.actor, NA_SE_VO_FPVO01);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ge3/EnGe3_Draw.s")
+void EnGe3_Idle(EnGe3* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ EnGe3_LookAtPlayer(this, play);
+
+ if (EnGe3_FollowPath(this)) {
+ EnGe3_SetupPath(this, play);
+ }
+}
+
+void EnGe3_ThrowPlayerOut(EnGe3* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->picto.actor.yawTowardsPlayer, 2, 0x400, 0x100);
+
+ if (this->actionTimer > 0) {
+ this->actionTimer--;
+ } else if (play->nextEntrance != play->setupExitList[GERUDO_AVEIL_GET_EXIT(&this->picto.actor)]) {
+ play->nextEntrance = play->setupExitList[GERUDO_AVEIL_GET_EXIT(&this->picto.actor)];
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ play->transitionType = TRANS_TYPE_38;
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_80_08);
+ }
+}
+
+void EnGe3_AveilsChamberIdle(EnGe3* this, PlayState* play) {
+ if (SkelAnime_Update(&this->skelAnime) && (this->cueId == GERUDO_AVEIL_CUEID_INSTRUCT)) {
+ EnGe3_ChangeAnim(this, GERUDO_AVEIL_ANIM_WAIT, ANIMMODE_ONCE, 0.0f);
+ }
+
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_108)) {
+ s16 cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_108)]->id;
+
+ if (this->cueId != GERUDO_AVEIL_CUEID_BEEHIVE_RUN_AWAY) {
+ Cutscene_ActorTranslateAndYaw(&this->picto.actor, play, Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_108));
+ }
+
+ if (this->cueId != cueId) {
+ this->cueId = cueId;
+ switch (this->cueId) {
+ // Both cutscenes
+ case GERUDO_AVEIL_CUEID_WAIT:
+ EnGe3_ChangeAnim(this, GERUDO_AVEIL_ANIM_HAND_ON_HIP_WAIT, ANIMMODE_LOOP, 0.0f);
+ break;
+
+ // Instructing expedition leader cutscene
+ case GERUDO_AVEIL_CUEID_PAUSE:
+ EnGe3_ChangeAnim(this, GERUDO_AVEIL_ANIM_TURN_HEAD, ANIMMODE_ONCE, 0.0f);
+ this->skelAnime.playSpeed = 0.0f;
+ break;
+
+ case GERUDO_AVEIL_CUEID_INSTRUCT:
+ EnGe3_ChangeAnim(this, GERUDO_AVEIL_ANIM_TURN_HEAD, ANIMMODE_ONCE, 0.0f);
+ break;
+
+ case GERUDO_AVEIL_CUEID_DEMAND:
+ EnGe3_ChangeAnim(this, GERUDO_AVEIL_ANIM_DEMAND, ANIMMODE_LOOP, 0.0f);
+ break;
+
+ case GERUDO_AVEIL_CUEID_DISMISS:
+ EnGe3_ChangeAnim(this, GERUDO_AVEIL_ANIM_DISMISS, ANIMMODE_ONCE, 0.0f);
+ break;
+
+ case GERUDO_AVEIL_CUEID_BEG:
+ EnGe3_ChangeAnim(this, GERUDO_AVEIL_ANIM_BEG, ANIMMODE_LOOP, 0.0f);
+ break;
+
+ // Fleeing from bees cutscene
+ case GERUDO_AVEIL_CUEID_BEEHIVE_RUN_AWAY:
+ EnGe3_ChangeAnim(this, GERUDO_AVEIL_ANIM_RUN_AWAY, ANIMMODE_LOOP, 0.0f);
+ this->picto.actor.speed = 5.0f;
+ this->screamTimer = (s32)(Rand_ZeroFloat(10.0f) + 20.0f);
+ break;
+
+ case GERUDO_AVEIL_CUEID_BEEHIVE_VANISH:
+ Actor_Kill(&this->picto.actor);
+ break;
+
+ default:
+ break;
+ }
+
+ SkelAnime_Update(&this->skelAnime);
+ }
+ } else if ((this->picto.actor.xzDistToPlayer < 700.0f) && (fabsf(this->picto.actor.playerHeightRel) < 100.0f) &&
+ !Play_InCsMode(play)) {
+ func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_26);
+ Lib_PlaySfx(NA_SE_SY_FOUND);
+
+ if (Player_GetMask(play) == PLAYER_MASK_STONE) { // Not fooled by Stone Mask
+ Message_StartTextbox(play, 0x11AF, &this->picto.actor);
+ } else {
+ Message_StartTextbox(play, 0x11AE, &this->picto.actor);
+ }
+
+ this->actionFunc = EnGe3_ThrowPlayerOut;
+ this->actionTimer = 50;
+ SET_WEEKEVENTREG(WEEKEVENTREG_80_08);
+ }
+
+ if (this->cueId == GERUDO_AVEIL_CUEID_BEEHIVE_RUN_AWAY) {
+ this->picto.actor.speed = 5.0f;
+ EnGe3_FollowPath(this);
+
+ if (Animation_OnFrame(&this->skelAnime, 2.0f) || Animation_OnFrame(&this->skelAnime, 6.0f)) {
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EV_PIRATE_WALK);
+ }
+
+ if (this->screamTimer > 0) {
+ this->screamTimer--;
+ } else {
+ this->screamTimer = (s32)(Rand_ZeroFloat(10.0f) + 20.0f);
+ EnGe3_Scream(this);
+ }
+ }
+}
+
+void EnGe3_UpdateColliderAndMove(Actor* thisx, PlayState* play) {
+ s32 pad;
+ EnGe3* this = THIS;
+
+ Collider_UpdateCylinder(&this->picto.actor, &this->collider);
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
+ Actor_MoveWithGravity(&this->picto.actor);
+ Actor_UpdateBgCheckInfo(play, &this->picto.actor, 40.0f, 25.0f, 40.0f, UPDBGCHECKINFO_FLAG_4);
+}
+
+void EnGe3_Blink(EnGe3* this, PlayState* play) {
+ if (DECR(this->blinkTimer) == 0) {
+ this->blinkTimer = Rand_S16Offset(60, 60);
+ }
+
+ this->eyeIndex = this->blinkTimer;
+
+ if (this->eyeIndex >= 3) {
+ this->eyeIndex = 0;
+ }
+}
+
+void EnGe3_Update(Actor* thisx, PlayState* play) {
+ EnGe3* this = THIS;
+
+ EnGe3_UpdateColliderAndMove(&this->picto.actor, play);
+ this->actionFunc(this, play);
+ EnGe3_Blink(this, play);
+}
+
+s32 EnGe3_ValidatePictograph(PlayState* play, Actor* thisx) {
+ s32 ret = Snap_ValidatePictograph(play, thisx, PICTO_VALID_PIRATE_GOOD, &thisx->focus.pos, &thisx->shape.rot, 10.0f,
+ 400.0f, -1);
+
+ ret |= Snap_ValidatePictograph(play, thisx, PICTO_VALID_PIRATE_TOO_FAR, &thisx->focus.pos, &thisx->shape.rot, 10.0f,
+ 1200.0f, -1);
+
+ return ret;
+}
+
+s32 EnGe3_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
+ EnGe3* this = THIS;
+
+ switch (limbIndex) {
+ case GERUDO_RED_LIMB_VEIL:
+ case GERUDO_RED_LIMB_RIGHT_SWORD:
+ case GERUDO_RED_LIMB_LEFT_SWORD:
+ *dList = NULL;
+ return false;
+
+ case GERUDO_RED_LIMB_HEAD:
+ rot->x += this->headRot.y;
+ // fallthrough
+ default:
+ // This is required since EnGe3 shares a skeleton with EnKaizoku; it avoids stale colours being used in the
+ // displaylists.
+ OPEN_DISPS(play->state.gfxCtx);
+
+ switch (limbIndex) {
+ case GERUDO_RED_LIMB_NECK:
+ break;
+
+ case GERUDO_RED_LIMB_HEAD:
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetEnvColor(POLY_OPA_DISP++, 80, 60, 10, 255);
+ break;
+
+ case GERUDO_RED_LIMB_RIGHT_SWORD:
+ case GERUDO_RED_LIMB_LEFT_SWORD:
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetEnvColor(POLY_OPA_DISP++, 140, 170, 230, 255);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
+ break;
+
+ default:
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetEnvColor(POLY_OPA_DISP++, 140, 0, 0, 255);
+ break;
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+
+ if (this->animIndex == GERUDO_AVEIL_ANIM_HAND_ON_HIP_WAIT) {
+ // Fidget
+ if ((limbIndex == GERUDO_RED_LIMB_RIGHT_FOREARM) || (limbIndex == GERUDO_RED_LIMB_LEFT_FOREARM) ||
+ (limbIndex == GERUDO_RED_LIMB_TORSO)) {
+ s32 temp = limbIndex * 50;
+
+ // required to match
+ rot->y = rot->y + (s32)(Math_SinS(play->state.frames * (temp + 0x814)) * 200.0f);
+ rot->z = rot->z + (s32)(Math_CosS(play->state.frames * (temp + 0x940)) * 200.0f);
+ }
+ }
+ break;
+ }
+ return false;
+}
+
+void EnGe3_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
+ EnGe3* this = THIS;
+ Vec3f sFocusOffset = { 600.0f, 700.0f, 0.0f };
+
+ if (limbIndex == GERUDO_RED_LIMB_HEAD) {
+ Matrix_MultVec3f(&sFocusOffset, &this->picto.actor.focus.pos);
+ }
+}
+
+void EnGe3_Draw(Actor* thisx, PlayState* play) {
+ static TexturePtr sEyeTextures[] = {
+ gGerudoRedEyeOpenTex,
+ gGerudoRedEyeHalfTex,
+ gGerudoRedEyeClosedTex,
+ };
+ s32 pad;
+ EnGe3* this = THIS;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeIndex]));
+ func_800B8050(&this->picto.actor, play, 0);
+ SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
+ EnGe3_OverrideLimbDraw, EnGe3_PostLimbDraw, &this->picto.actor);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_En_Ge3/z_en_ge3.h b/src/overlays/actors/ovl_En_Ge3/z_en_ge3.h
index 909ed7599..f2611e408 100644
--- a/src/overlays/actors/ovl_En_Ge3/z_en_ge3.h
+++ b/src/overlays/actors/ovl_En_Ge3/z_en_ge3.h
@@ -2,14 +2,54 @@
#define Z_EN_GE3_H
#include "global.h"
+#include "z64snap.h"
+#include "objects/object_geldb/object_geldb.h"
struct EnGe3;
typedef void (*EnGe3ActionFunc)(struct EnGe3*, PlayState*);
+#define GERUDO_AVEIL_GET_PATH(thisx) (((thisx)->params & 0xFC00) >> 10)
+#define GERUDO_AVEIL_GET_EXIT(thisx) (((thisx)->params & 0x1F0) >> 4)
+#define GERUDO_AVEIL_GET_TYPE(thisx) ((thisx)->params & 1)
+
+#define GERUDO_AVEIL_PATH_INDEX_NONE 0x3F
+
+typedef enum GerudoAveilType {
+ /* 0 */ GERUDO_AVEIL_TYPE_0, // Unused, just walks forwards
+ /* 1 */ GERUDO_AVEIL_TYPE_AVEILS_CHAMBER
+} GerudoAveilType;
+
+typedef enum GerudoAveilCueId {
+ /* -1 */ GERUDO_AVEIL_CUEID_NONE = -1,
+ /* 0 */ GERUDO_AVEIL_CUEID_0, // Unused
+ /* 1 */ GERUDO_AVEIL_CUEID_WAIT,
+ /* 2 */ GERUDO_AVEIL_CUEID_PAUSE,
+ /* 3 */ GERUDO_AVEIL_CUEID_INSTRUCT,
+ /* 4 */ GERUDO_AVEIL_CUEID_DEMAND,
+ /* 5 */ GERUDO_AVEIL_CUEID_DISMISS,
+ /* 6 */ GERUDO_AVEIL_CUEID_BEG,
+ /* 7 */ GERUDO_AVEIL_CUEID_BEEHIVE_RUN_AWAY,
+ /* 8 */ GERUDO_AVEIL_CUEID_BEEHIVE_VANISH
+} GerudoAveilCueId;
+
typedef struct EnGe3 {
- /* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x1D8];
+ /* 0x000 */ PictoActor picto;
+ /* 0x148 */ ColliderCylinder collider;
+ /* 0x194 */ SkelAnime skelAnime;
+ /* 0x1D8 */ Vec3s jointTable[GERUDO_RED_LIMB_MAX];
+ /* 0x268 */ Vec3s morphTable[GERUDO_RED_LIMB_MAX];
+ /* 0x2F8 */ s16 eyeIndex;
+ /* 0x2FA */ s16 blinkTimer;
+ /* 0x2FC */ Path* path;
+ /* 0x300 */ s32 curPointIndex;
+ /* 0x304 */ Vec3s headRot;
+ /* 0x30A */ Vec3s torsoRot;
+ /* 0x310 */ s16 stateFlags; // Set and not used, named based on OoT use
+ /* 0x312 */ s16 animIndex;
+ /* 0x314 */ s16 cueId;
+ /* 0x316 */ s16 actionTimer;
+ /* 0x318 */ s16 screamTimer;
/* 0x31C */ EnGe3ActionFunc actionFunc;
} EnGe3; // size = 0x320
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 1da6c1a61..938874266 100644
--- a/src/overlays/actors/ovl_En_Geg/z_en_geg.c
+++ b/src/overlays/actors/ovl_En_Geg/z_en_geg.c
@@ -7,12 +7,11 @@
#include "z_en_geg.h"
#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
#include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h"
-#include "objects/object_oF1d_map/object_oF1d_map.h"
#include "objects/object_taisou/object_taisou.h"
#include "objects/object_hakugin_demo/object_hakugin_demo.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnGeg*)thisx)
@@ -126,68 +125,112 @@ static DamageTable sDamageTable = {
/* Powder Keg */ DMG_ENTRY(1, 0x0),
};
-static AnimationInfoS sAnimationInfo[] = {
- { &gGoronLyingDownIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &gGoronLyingDownIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &gGoronUnrollAnim, 2.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gGoronUnrollAnim, 2.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &gGoronUnrollAnim, -2.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &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 },
- { &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 },
- { &gGoronShiveringSurprisedAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gGoronStandingIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+typedef enum {
+ /* -1 */ ENGEG_ANIM_NONE = -1,
+ /* 0x00 */ ENGEG_ANIM_0,
+ /* 0x01 */ ENGEG_ANIM_1,
+ /* 0x02 */ ENGEG_ANIM_2,
+ /* 0x03 */ ENGEG_ANIM_3,
+ /* 0x04 */ ENGEG_ANIM_4,
+ /* 0x05 */ ENGEG_ANIM_5,
+ /* 0x06 */ ENGEG_ANIM_6,
+ /* 0x07 */ ENGEG_ANIM_7,
+ /* 0x08 */ ENGEG_ANIM_8,
+ /* 0x09 */ ENGEG_ANIM_9,
+ /* 0x0A */ ENGEG_ANIM_10,
+ /* 0x0B */ ENGEG_ANIM_11,
+ /* 0x0C */ ENGEG_ANIM_12,
+ /* 0x0D */ ENGEG_ANIM_13,
+ /* 0x0E */ ENGEG_ANIM_14,
+ /* 0x0F */ ENGEG_ANIM_15,
+ /* 0x10 */ ENGEG_ANIM_16,
+ /* 0x11 */ ENGEG_ANIM_17,
+ /* 0x12 */ ENGEG_ANIM_18,
+ /* 0x13 */ ENGEG_ANIM_19,
+ /* 0x14 */ ENGEG_ANIM_20,
+ /* 0x15 */ ENGEG_ANIM_MAX
+} EnGegAnimation;
+
+static AnimationInfoS sAnimationInfo[ENGEG_ANIM_MAX] = {
+ { &gGoronLyingDownIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGEG_ANIM_0
+ { &gGoronLyingDownIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENGEG_ANIM_1
+ { &gGoronUnrollAnim, 2.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENGEG_ANIM_2
+ { &gGoronUnrollAnim, 2.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENGEG_ANIM_3
+ { &gGoronUnrollAnim, -2.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENGEG_ANIM_4
+ { &gGoronShiverAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGEG_ANIM_5
+ { &gGoronShiverAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENGEG_ANIM_6
+ { &gGoronDropKegAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENGEG_ANIM_7
+ { &gGoronAthleticsSquatSideToSideAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGEG_ANIM_8
+ { &gGoronAthleticsDoubleArmSideBendAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGEG_ANIM_9
+ { &gGoronAthleticsShakeLimbsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGEG_ANIM_10
+ { &gGoronAthleticsSingleArmSideBendAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGEG_ANIM_11
+ { &gGoronAthleticsHamstringStretchSittingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGEG_ANIM_12
+ { &gGoronAthleticsCheerAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGEG_ANIM_13
+ { &gGoronAthleticsShoutAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGEG_ANIM_14
+ { &gGoronAthleticsHamstringStretchStandingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGEG_ANIM_15
+ { &gGoronCoverEarsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGEG_ANIM_16
+ { &gGoronSpringLookAroundAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENGEG_ANIM_17
+ { &gGoronSpringLookAroundLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENGEG_ANIM_18
+ { &gGoronShiveringSurprisedAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENGEG_ANIM_19
+ { &gGoronStandingIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGEG_ANIM_20
};
u16 func_80BB16D0(EnGeg* this) {
switch (this->unk_496) {
case 0xD5E:
return 0xD5F;
+
case 0xD5F:
return 0xD60;
+
case 0xD60:
return 0xD61;
+
case 0xD62:
return 0xD63;
+
case 0xD64:
return 0xD65;
+
case 0xD66:
return 0xD67;
+
case 0xD67:
return 0xD68;
+
case 0xD68:
return 0xD69;
+
case 0xD6A:
return 0xD6B;
+
case 0xD6B:
return 0xD6C;
+
case 0xD6C:
return 0xD6D;
+
case 0xD6E:
return 0xD6F;
+
case 0xD70:
return 0xD71;
+
case 0xD71:
return 0xD72;
+
case 0xD73:
return 0xD74;
+
case 0xD74:
return 0xD75;
+
case 0xD89:
return 0xD8A;
+
+ default:
+ return 0;
}
- return 0;
}
void func_80BB178C(EnGeg* this, PlayState* play) {
@@ -217,18 +260,18 @@ 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);
}
}
s32 func_80BB18FC(EnGeg* this, Actor* actor) {
- if (actor->bgCheckFlags & 1) {
+ if (actor->bgCheckFlags & BGCHECKFLAG_GROUND) {
f32 sp24 = Math_Vec3f_DistXZ(&this->actor.world.pos, &actor->world.pos);
f32 sp20 = Math_Vec3f_DiffY(&this->actor.world.pos, &actor->world.pos);
if ((sp24 < 150.0f) && (fabsf(sp20) < 5.0f)) {
this->unk_230 |= 0x20;
- actor->speedXZ = 0.0f;
+ actor->speed = 0.0f;
actor->velocity.y = 0.0f;
this->actor.child = actor;
actor->parent = &this->actor;
@@ -304,10 +347,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]);
}
}
@@ -372,14 +415,14 @@ s32 func_80BB1D64(EnGeg* this, PlayState* play) {
return true;
}
-void func_80BB1FCC(EnGeg* this, PlayState* play) {
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->unk_248].segment);
+void EnGeg_UpdateSkelAnime(EnGeg* this, PlayState* play) {
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->unk_248].segment);
SkelAnime_Update(&this->skelAnime);
}
-void func_80BB2020(EnGeg* this, PlayState* play) {
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->unk_248].segment);
- SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->unk_4AC);
+void EnGeg_ChangeAnim(EnGeg* this, PlayState* play) {
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->unk_248].segment);
+ SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex);
}
s32 func_80BB2088(EnGeg* this, PlayState* play) {
@@ -393,7 +436,7 @@ s32 func_80BB2088(EnGeg* this, PlayState* play) {
}
if (Actor_IsFacingAndNearPlayer(&this->actor, 300.0f, 0x7FF8) &&
- ((this->unk_4AC == 5) || ((this->unk_4AC == 13) && (this->unk_496 == 0xD69)))) {
+ ((this->animIndex == ENGEG_ANIM_5) || ((this->animIndex == ENGEG_ANIM_13) && (this->unk_496 == 0xD69)))) {
this->unk_230 |= 2;
func_80BB1D64(this, play);
} else {
@@ -412,15 +455,15 @@ s32 func_80BB2088(EnGeg* this, PlayState* play) {
void func_80BB217C(EnGeg* this, PlayState* play) {
if (Object_IsLoaded(&play->objectCtx, this->unk_248)) {
- this->unk_4AC = 5;
- func_80BB2020(this, play);
+ this->animIndex = ENGEG_ANIM_5;
+ EnGeg_ChangeAnim(this, play);
Actor_SetScale(&this->actor, 0.01f);
this->unk_230 = 0;
this->actor.shape.shadowScale = 20.0f;
this->actor.gravity = -1.0f;
func_80BB1C1C(this);
this->actionFunc = func_80BB221C;
- this->actor.targetMode = 3;
+ this->actor.targetMode = TARGET_MODE_3;
}
}
@@ -432,15 +475,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);
@@ -449,7 +492,7 @@ void func_80BB221C(EnGeg* this, PlayState* play) {
} else if (this->actor.xzDistToPlayer < 300.0f) {
this->unk_230 |= 4;
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8614(&this->actor, play, 300.0f);
+ Actor_OfferTalk(&this->actor, play, 300.0f);
}
} else {
this->unk_230 &= ~4;
@@ -459,21 +502,21 @@ void func_80BB221C(EnGeg* this, PlayState* play) {
Message_StartTextbox(play, this->unk_496, &this->actor);
this->unk_230 &= ~8;
this->actionFunc = func_80BB27D4;
- } else if ((this->actor.xzDistToPlayer < 300.0f) && this->actor.isTargeted) {
- func_800B8614(&this->actor, play, 300.0f);
+ } else if ((this->actor.xzDistToPlayer < 300.0f) && this->actor.isLockedOn) {
+ Actor_OfferTalk(&this->actor, play, 300.0f);
this->unk_230 |= 8;
}
} 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;
this->actor.flags &= ~ACTOR_FLAG_10000;
} else if (this->actor.xzDistToPlayer < 300.0f) {
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8614(&this->actor, play, 300.0f);
+ Actor_OfferTalk(&this->actor, play, 300.0f);
this->unk_230 |= 8;
}
}
@@ -481,18 +524,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) {
@@ -507,17 +550,17 @@ void func_80BB2520(EnGeg* this, PlayState* play) {
break;
case 0xD66:
- this->unk_248 = Object_GetIndex(&play->objectCtx, OBJECT_OF1D_MAP);
+ this->unk_248 = Object_GetSlot(&play->objectCtx, OBJECT_OF1D_MAP);
if (this->unk_248 >= 0) {
- this->unk_4AC = 19;
- func_80BB2020(this, play);
+ this->animIndex = ENGEG_ANIM_19;
+ EnGeg_ChangeAnim(this, play);
}
this->unk_230 |= 0x20;
this->actionFunc = func_80BB2944;
break;
case 0xD67:
- this->unk_498 = this->unk_49C[5];
+ this->csId = this->csIdList[5];
this->actionFunc = func_80BB2B1C;
break;
@@ -525,20 +568,23 @@ void func_80BB2520(EnGeg* this, PlayState* play) {
case 0xD72:
case 0xD75:
case 0xD8B:
- this->unk_248 = Object_GetIndex(&play->objectCtx, OBJECT_OF1D_MAP);
+ this->unk_248 = Object_GetSlot(&play->objectCtx, OBJECT_OF1D_MAP);
if (this->unk_248 >= 0) {
- this->unk_4AC = 4;
- func_80BB2020(this, play);
+ this->animIndex = ENGEG_ANIM_4;
+ EnGeg_ChangeAnim(this, play);
}
this->actionFunc = func_80BB2E00;
break;
+
+ default:
+ 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,17 +592,20 @@ 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);
- play->msgCtx.msgMode = 0x43;
+ CutsceneManager_Stop(this->csId);
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->unk_230 &= ~0x10;
this->actionFunc = func_80BB221C;
return;
+
+ default:
+ break;
}
this->unk_496 = func_80BB16D0(this);
@@ -568,14 +617,14 @@ void func_80BB27D4(EnGeg* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
switch (this->unk_496) {
case 0xD63:
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->actionFunc = func_80BB221C;
break;
case 0xD69:
- this->unk_49A = this->unk_49C[6];
- play->msgCtx.msgMode = 0x43;
+ this->nextCsId = this->csIdList[6];
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->actionFunc = func_80BB2520;
break;
@@ -583,7 +632,7 @@ void func_80BB27D4(EnGeg* this, PlayState* play) {
case 0xD6D:
case 0xD6F:
case 0xD8A:
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->actionFunc = func_80BB31B8;
break;
@@ -591,10 +640,10 @@ void func_80BB27D4(EnGeg* this, PlayState* play) {
case 0xD72:
case 0xD75:
case 0xD8B:
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
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;
@@ -609,22 +658,22 @@ void func_80BB27D4(EnGeg* this, PlayState* play) {
void func_80BB2944(EnGeg* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
s16 curFrame = this->skelAnime.curFrame;
- s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_4AC].animation);
+ s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
- if (this->unk_4AC == 19) {
- if (curFrame == lastFrame) {
- this->unk_4AC = 6;
- func_80BB2020(this, play);
+ if (this->animIndex == ENGEG_ANIM_19) {
+ if (curFrame == endFrame) {
+ this->animIndex = ENGEG_ANIM_6;
+ EnGeg_ChangeAnim(this, play);
}
} else if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
if (this->unk_496 == 0xD67) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
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);
- func_80151938(play, this->unk_496);
+ Message_ContinueTextbox(play, this->unk_496);
}
}
}
@@ -632,10 +681,10 @@ 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;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->actionFunc = func_80BB347C;
} else {
@@ -654,27 +703,27 @@ 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;
- func_80151938(play, this->unk_496);
- this->unk_248 = Object_GetIndex(&play->objectCtx, OBJECT_TAISOU);
+ Message_ContinueTextbox(play, this->unk_496);
+ this->unk_248 = Object_GetSlot(&play->objectCtx, OBJECT_TAISOU);
if (this->unk_248 >= 0) {
- this->unk_4AC = 13;
- func_80BB2020(this, play);
+ this->animIndex = ENGEG_ANIM_13;
+ EnGeg_ChangeAnim(this, 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;
@@ -700,25 +749,25 @@ void func_80BB2B1C(EnGeg* this, PlayState* play) {
this->unk_4E0--;
}
AudioSfx_LowerSfxSettingsReverb(&this->actor.projectedPos, true);
- func_8019F4AC(&this->actor.projectedPos, NA_SE_EN_GOLON_SIRLOIN_EAT - SFX_FLAG);
+ Audio_PlaySfx_WithSfxSettingsReverb(&this->actor.projectedPos, NA_SE_EN_GOLON_SIRLOIN_EAT - SFX_FLAG);
}
void func_80BB2E00(EnGeg* this, PlayState* play) {
- s16 sp2E = this->skelAnime.curFrame;
- s16 sp2C = Animation_GetLastFrame(sAnimationInfo[this->unk_4AC].animation);
+ s16 curFrame = this->skelAnime.curFrame;
+ s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
- if (this->unk_4AC == 2) {
+ if (this->animIndex == ENGEG_ANIM_2) {
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);
- this->unk_4AC = 20;
- func_80BB2020(this, play);
+ if (curFrame == endFrame) {
+ CutsceneManager_Stop(this->csId);
+ this->animIndex = ENGEG_ANIM_20;
+ EnGeg_ChangeAnim(this, play);
this->actionFunc = func_80BB30B4;
} else if (Animation_OnFrame(&this->skelAnime, 24.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_STAND_IMT);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_STAND_IMT);
}
- } else if (this->unk_4AC == 4) {
+ } else if (this->animIndex == ENGEG_ANIM_4) {
if (Animation_OnFrame(&this->skelAnime, 0.0f)) {
this->unk_230 |= 1;
this->actor.shape.yOffset = 14.0f;
@@ -729,7 +778,7 @@ void func_80BB2E00(EnGeg* this, PlayState* play) {
this->actionFunc = func_80BB3318;
}
} else if (Animation_OnFrame(&this->skelAnime, 24.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_SIT_IMT);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_SIT_IMT);
}
}
}
@@ -739,24 +788,24 @@ void func_80BB2F7C(EnGeg* this, PlayState* play) {
this->actor.shape.rot.y = this->actor.world.rot.y;
if ((this->actor.xzDistToPlayer < 150.0f) && (fabsf(this->actor.playerHeightRel) < 10.0f) &&
- (this->actor.bgCheckFlags & 1)) {
- this->unk_4AC = 2;
- this->actor.speedXZ = 0.0f;
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ this->animIndex = ENGEG_ANIM_2;
+ this->actor.speed = 0.0f;
this->unk_230 &= ~1;
this->actor.shape.yOffset = 0.0f;
- func_80BB2020(this, play);
+ EnGeg_ChangeAnim(this, play);
this->actionFunc = func_80BB2E00;
} else {
- this->actor.speedXZ = 5.0f;
+ this->actor.speed = 5.0f;
Actor_MoveWithGravity(&this->actor);
}
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
if (this->unk_230 & 0x80) {
- func_800B9010(&this->actor, NA_SE_EN_GOLON_SIRLOIN_ROLL - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_GOLON_SIRLOIN_ROLL - SFX_FLAG);
} else {
this->unk_230 |= 0x80;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EYEGOLE_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_ATTACK);
}
}
}
@@ -777,7 +826,7 @@ void func_80BB30B4(EnGeg* this, PlayState* play) {
this->actor.flags &= ~ACTOR_FLAG_10000;
} else if (this->actor.xzDistToPlayer < 150.0f) {
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8614(&this->actor, play, 150.0f);
+ Actor_OfferTalk(&this->actor, play, 150.0f);
}
}
@@ -804,7 +853,7 @@ void func_80BB31B8(EnGeg* this, PlayState* play) {
}
this->actionFunc = func_80BB32AC;
} else {
- Actor_PickUp(&this->actor, play, getItemId, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, getItemId, 300.0f, 300.0f);
}
}
@@ -813,7 +862,7 @@ void func_80BB32AC(EnGeg* this, PlayState* play) {
Message_StartTextbox(play, this->unk_496, &this->actor);
this->actionFunc = func_80BB27D4;
} else {
- func_800B85E0(&this->actor, play, 400.0f, -1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
}
}
@@ -837,15 +886,15 @@ 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 {
- Math_ApproachF(&this->actor.speedXZ, 10.0f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 10.0f, 0.2f, 1.0f);
Actor_MoveWithGravity(&this->actor);
}
- func_800B9010(&this->actor, NA_SE_EN_GOLON_SIRLOIN_ROLL - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_GOLON_SIRLOIN_ROLL - SFX_FLAG);
}
void func_80BB347C(EnGeg* this, PlayState* play) {
@@ -877,7 +926,7 @@ void EnGeg_Init(Actor* thisx, PlayState* play) {
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
if (this->actor.update != NULL) {
- this->unk_248 = Object_GetIndex(&play->objectCtx, OBJECT_OF1D_MAP);
+ this->unk_248 = Object_GetSlot(&play->objectCtx, OBJECT_OF1D_MAP);
if (this->unk_248 < 0) {
Actor_Kill(&this->actor);
}
@@ -902,10 +951,10 @@ void EnGeg_Update(Actor* thisx, PlayState* play) {
EnGeg* this = THIS;
this->actionFunc(this, play);
- func_80BB1FCC(this, play);
+ EnGeg_UpdateSkelAnime(this, play);
func_80BB2088(this, play);
func_80BB1C8C(this);
- SubS_FillLimbRotTables(play, this->unk_238, this->unk_232, ARRAY_COUNT(this->unk_238));
+ SubS_UpdateFidgetTables(play, this->fidgetTableY, this->fidgetTableZ, ENGEG_FIDGET_TABLE_LEN);
func_80BB1D04(this);
func_80BB178C(this, play);
}
@@ -951,7 +1000,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 +1094,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++);
@@ -1058,11 +1107,11 @@ void func_80BB3BE0(EnGeg* this, PlayState* play) {
}
void func_80BB3CB4(EnGeg* this, PlayState* play) {
- f32 sp24 = play->state.frames * this->actor.speedXZ * 1400.0f;
+ f32 sp24 = play->state.frames * this->actor.speed * 1400.0f;
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..980ada9fd 100644
--- a/src/overlays/actors/ovl_En_Geg/z_en_geg.h
+++ b/src/overlays/actors/ovl_En_Geg/z_en_geg.h
@@ -2,11 +2,14 @@
#define Z_EN_GEG_H
#include "global.h"
+#include "objects/object_oF1d_map/object_oF1d_map.h"
struct EnGeg;
typedef void (*EnGegActionFunc)(struct EnGeg*, PlayState*);
+#define ENGEG_FIDGET_TABLE_LEN 3
+
typedef struct EnGeg {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
@@ -14,15 +17,15 @@ typedef struct EnGeg {
/* 0x18C */ ColliderCylinder colliderCylinder;
/* 0x1D8 */ ColliderSphere colliderSphere;
/* 0x230 */ u16 unk_230;
- /* 0x232 */ s16 unk_232[3];
- /* 0x238 */ s16 unk_238[3];
+ /* 0x232 */ s16 fidgetTableZ[ENGEG_FIDGET_TABLE_LEN];
+ /* 0x238 */ s16 fidgetTableY[ENGEG_FIDGET_TABLE_LEN];
/* 0x23E */ s16 unk_23E;
/* 0x240 */ s16 unk_240;
/* 0x242 */ s16 unk_242;
/* 0x244 */ s16 unk_244;
/* 0x248 */ s32 unk_248;
- /* 0x24C */ Vec3s jointTable[18];
- /* 0x2B8 */ Vec3s morphTable[18];
+ /* 0x24C */ Vec3s jointTable[GORON_LIMB_MAX];
+ /* 0x2B8 */ Vec3s morphTable[GORON_LIMB_MAX];
/* 0x324 */ UNK_TYPE1 unk324[0x144];
/* 0x468 */ s16 unk_468;
/* 0x46A */ s16 unk_46A;
@@ -33,10 +36,10 @@ 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];
- /* 0x4AC */ s32 unk_4AC;
+ /* 0x498 */ s16 csId;
+ /* 0x49A */ s16 nextCsId;
+ /* 0x49C */ s16 csIdList[8];
+ /* 0x4AC */ s32 animIndex;
/* 0x4B0 */ s16 unk_4B0;
/* 0x4B4 */ Vec3f unk_4B4;
/* 0x4C0 */ Vec3f unk_4C0[2];
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 a6c2a31ec..5a0f0f3f2 100644
--- a/src/overlays/actors/ovl_En_Gg/z_en_gg.c
+++ b/src/overlays/actors/ovl_En_Gg/z_en_gg.c
@@ -6,9 +6,8 @@
#include "z_en_gg.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#include "objects/object_gg/object_gg.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_80)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_REACT_TO_LENS)
#define THIS ((EnGg*)thisx)
@@ -95,15 +94,44 @@ static DamageTable sDamageTable = {
/* Powder Keg */ DMG_ENTRY(0, 0x0),
};
-static AnimationInfo sAnimationInfo[] = {
- { &object_gg_Anim_00F578, 1.0f, 0.0f, 0.0f, 0, -10.0f }, { &object_gg_Anim_00D528, 1.0f, 0.0f, 0.0f, 2, -10.0f },
- { &object_gg_Anim_00D174, 1.0f, 0.0f, 0.0f, 2, -10.0f }, { &object_gg_Anim_00ECC0, 1.0f, 0.0f, 0.0f, 2, -10.0f },
- { &object_gg_Anim_00BAF0, 1.0f, 0.0f, 0.0f, 0, -10.0f }, { &object_gg_Anim_00AF40, 1.0f, 0.0f, 0.0f, 0, -10.0f },
- { &object_gg_Anim_00F578, 1.0f, 0.0f, 0.0f, 0, -10.0f }, { &object_gg_Anim_00AF40, 1.0f, 0.0f, 0.0f, 0, -10.0f },
- { &object_gg_Anim_00F578, 1.0f, 0.0f, 0.0f, 0, -10.0f }, { &object_gg_Anim_0100C8, 1.0f, 0.0f, 0.0f, 0, 0.0f },
- { &object_gg_Anim_00CDA0, 1.0f, 0.0f, 0.0f, 0, 0.0f }, { &object_gg_Anim_00B560, 1.0f, 0.0f, 0.0f, 0, 0.0f },
- { &object_gg_Anim_00A4B4, 1.0f, 0.0f, 0.0f, 2, 0.0f }, { &object_gg_Anim_00E86C, 1.0f, 0.0f, 0.0f, 2, 0.0f },
- { &object_gg_Anim_00D99C, 1.0f, 0.0f, 0.0f, 2, 0.0f }, { &object_gg_Anim_00E2A4, 1.0f, 0.0f, 0.0f, 0, 0.0f },
+typedef enum {
+ /* -1 */ ENGG_ANIM_NONE = -1,
+ /* 0x00 */ ENGG_ANIM_0,
+ /* 0x01 */ ENGG_ANIM_1,
+ /* 0x02 */ ENGG_ANIM_2,
+ /* 0x03 */ ENGG_ANIM_3,
+ /* 0x04 */ ENGG_ANIM_4,
+ /* 0x05 */ ENGG_ANIM_5,
+ /* 0x06 */ ENGG_ANIM_6,
+ /* 0x07 */ ENGG_ANIM_7,
+ /* 0x08 */ ENGG_ANIM_8,
+ /* 0x09 */ ENGG_ANIM_9,
+ /* 0x0A */ ENGG_ANIM_10,
+ /* 0x0B */ ENGG_ANIM_11,
+ /* 0x0C */ ENGG_ANIM_12,
+ /* 0x0D */ ENGG_ANIM_13,
+ /* 0x0E */ ENGG_ANIM_14,
+ /* 0x0F */ ENGG_ANIM_15,
+ /* 0x10 */ ENGG_ANIM_MAX
+} EnGgAnimation;
+
+static AnimationInfo sAnimationInfo[ENGG_ANIM_MAX] = {
+ { &object_gg_Anim_00F578, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -10.0f }, // ENGG_ANIM_0
+ { &object_gg_Anim_00D528, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -10.0f }, // ENGG_ANIM_1
+ { &object_gg_Anim_00D174, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -10.0f }, // ENGG_ANIM_2
+ { &object_gg_Anim_00ECC0, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -10.0f }, // ENGG_ANIM_3
+ { &object_gg_Anim_00BAF0, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -10.0f }, // ENGG_ANIM_4
+ { &object_gg_Anim_00AF40, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -10.0f }, // ENGG_ANIM_5
+ { &object_gg_Anim_00F578, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -10.0f }, // ENGG_ANIM_6
+ { &object_gg_Anim_00AF40, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -10.0f }, // ENGG_ANIM_7
+ { &object_gg_Anim_00F578, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -10.0f }, // ENGG_ANIM_8
+ { &object_gg_Anim_0100C8, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGG_ANIM_9
+ { &object_gg_Anim_00CDA0, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGG_ANIM_10
+ { &object_gg_Anim_00B560, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGG_ANIM_11
+ { &object_gg_Anim_00A4B4, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // ENGG_ANIM_12
+ { &object_gg_Anim_00E86C, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // ENGG_ANIM_13
+ { &object_gg_Anim_00D99C, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // ENGG_ANIM_14
+ { &object_gg_Anim_00E2A4, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGG_ANIM_15
};
void func_80B34F70(EnGg* this) {
@@ -129,7 +157,7 @@ s32 func_80B34FB4(EnGg* this, PlayState* play) {
pitch = Math_Vec3f_Pitch(&sp34, &sp40);
if ((this->actor.xzDistToPlayer < 250.0f) && (this->actor.xzDistToPlayer > 50.0f) &&
- (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_80) || CHECK_WEEKEVENTREG(WEEKEVENTREG_19_80))) {
+ (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS) || CHECK_WEEKEVENTREG(WEEKEVENTREG_19_80))) {
Math_SmoothStepToS(&this->unk_2E8, pitch, 4, 0x2AA8, 1);
} else {
Math_SmoothStepToS(&this->unk_2E8, 0, 4, 0x2AA8, 1);
@@ -144,11 +172,12 @@ 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) {
- if ((this->unk_2E6 == 2) || (this->unk_2E6 == 3)) {
+ if ((this->animIndex == ENGG_ANIM_2) || (this->animIndex == ENGG_ANIM_3)) {
this->unk_2E2 = 3;
} else {
s16 temp = this->unk_2E4 - 1;
@@ -169,78 +198,78 @@ void func_80B351A4(EnGg* this) {
void func_80B35250(EnGg* this) {
this->unk_2E4 = 20;
this->unk_2E2 = 0;
- this->unk_2E6 = 0;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0);
+ this->animIndex = ENGG_ANIM_0;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG_ANIM_0);
this->actionFunc = func_80B35450;
}
void func_80B352A4(EnGg* this, PlayState* play) {
- s16 sp26 = this->skelAnime.curFrame;
- s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_2E6].animation);
+ s16 curFrame = this->skelAnime.curFrame;
+ s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
- if (sp26 == lastFrame) {
+ if (curFrame == endFrame) {
switch (this->actor.textId) {
case 0xCE5:
- this->unk_2E6 = 1;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ this->animIndex = ENGG_ANIM_1;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG_ANIM_1);
break;
case 0xCE6:
case 0xCEC:
- this->unk_2E6 = 0;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0);
+ this->animIndex = ENGG_ANIM_0;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG_ANIM_0);
break;
case 0xCE8:
- this->unk_2E6 = 2;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
+ this->animIndex = ENGG_ANIM_2;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG_ANIM_2);
break;
case 0xCE9:
- this->unk_2E6 = 3;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
+ this->animIndex = ENGG_ANIM_3;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG_ANIM_3);
break;
case 0xCED:
case 0xCEE:
- this->unk_2E6 = 4;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 4);
+ this->animIndex = ENGG_ANIM_4;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG_ANIM_4);
break;
default:
- this->unk_2E6 = 0;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0);
+ this->animIndex = ENGG_ANIM_0;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG_ANIM_0);
break;
}
SET_WEEKEVENTREG(WEEKEVENTREG_19_80);
this->actionFunc = func_80B3556C;
- } else if ((this->unk_2E6 == 0) && ((this->actor.textId == 0xCED) || (this->actor.textId == 0xCEE))) {
- if (sp26 < (lastFrame - 1)) {
+ } else if ((this->animIndex == ENGG_ANIM_0) && ((this->actor.textId == 0xCED) || (this->actor.textId == 0xCEE))) {
+ if (curFrame < (endFrame - 1)) {
this->skelAnime.playSpeed = 2.0f;
} else {
- this->unk_2E6 = 4;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 4);
+ this->animIndex = ENGG_ANIM_4;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG_ANIM_4);
}
}
}
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);
}
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_80)) {
+ if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS)) {
Actor_DeactivateLens(play);
}
this->unk_308 = 1;
this->actionFunc = func_80B352A4;
} else if ((this->actor.xzDistToPlayer < 200.0f) && (this->actor.xzDistToPlayer > 50.0f)) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_19_80)) {
- func_800B863C(&this->actor, play);
+ Actor_OfferTalkNearColChkInfoCylinder(&this->actor, play);
this->actor.textId = 0xCEE;
- } else if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_80)) {
- func_800B863C(&this->actor, play);
+ } else if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS)) {
+ Actor_OfferTalkNearColChkInfoCylinder(&this->actor, play);
this->actor.textId = 0xCE5;
}
}
@@ -248,11 +277,11 @@ void func_80B35450(EnGg* this, PlayState* play) {
void func_80B3556C(EnGg* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- if (this->unk_2E6 == 4) {
- play->msgCtx.msgMode = 0x43;
+ if (this->animIndex == ENGG_ANIM_4) {
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->unk_308 = 0;
- this->actor.flags &= ~ACTOR_FLAG_80;
+ this->actor.flags &= ~ACTOR_FLAG_REACT_TO_LENS;
func_80B35250(this);
} else {
this->actor.textId = func_80B357F0(this);
@@ -264,57 +293,53 @@ 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;
+ this->csAnimIndex = ENGG_ANIM_0;
+ this->animIndex = ENGG_ANIM_0;
break;
case 2:
- this->unk_2DA = 9;
- this->unk_2E6 = 9;
+ this->csAnimIndex = ENGG_ANIM_9;
+ this->animIndex = ENGG_ANIM_9;
break;
case 3:
- this->unk_2DA = 10;
- this->unk_2E6 = 10;
+ this->csAnimIndex = ENGG_ANIM_10;
+ this->animIndex = ENGG_ANIM_10;
break;
case 4:
- do {
- this->unk_344.unk_30 = this->unk_2DA = 11;
- } while (0);
- this->unk_2E6 = 11;
+ this->unk_344.animIndex = this->csAnimIndex = ENGG_ANIM_11;
+ this->animIndex = ENGG_ANIM_11;
func_80B364D4(&this->unk_344, play);
break;
case 5:
- do {
- this->unk_344.unk_30 = this->unk_2DA = 12;
- } while (0);
- this->unk_2E6 = 12;
+ this->unk_344.animIndex = this->csAnimIndex = ENGG_ANIM_12;
+ //! FAKE:
+ if (1) {}
+ this->animIndex = ENGG_ANIM_12;
break;
case 6:
- do {
- this->unk_344.unk_30 = this->unk_2DA = 13;
- } while (0);
- this->unk_2E6 = 13;
+ this->unk_344.animIndex = this->csAnimIndex = ENGG_ANIM_13;
+ //! FAKE:
+ if (1) {}
+ this->animIndex = ENGG_ANIM_13;
break;
case 7:
- do {
- this->unk_344.unk_30 = this->unk_2DA = 14;
- } while (0);
- this->unk_2E6 = 14;
+ this->unk_344.animIndex = this->csAnimIndex = ENGG_ANIM_14;
+ this->animIndex = ENGG_ANIM_14;
func_80B364D4(&this->unk_344, play);
break;
@@ -323,20 +348,20 @@ void func_80B35634(EnGg* this, PlayState* play) {
return;
default:
- this->unk_2DA = 0;
+ this->csAnimIndex = ENGG_ANIM_0;
break;
}
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->unk_2DA);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->csAnimIndex);
}
- if (this->unk_2DA == 14) {
+ if (this->csAnimIndex == ENGG_ANIM_14) {
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;
}
}
@@ -344,16 +369,22 @@ u16 func_80B357F0(EnGg* this) {
switch (this->actor.textId) {
case 0xCE5:
return 0xCE6;
+
case 0xCE6:
return 0xCE8;
+
case 0xCE8:
return 0xCE9;
+
case 0xCE9:
return 0xCEC;
+
case 0xCEC:
return 0xCED;
+
+ default:
+ return 0;
}
- return 0;
}
void func_80B3584C(EnGg* this) {
@@ -365,12 +396,12 @@ void func_80B3584C(EnGg* this) {
}
void func_80B358D8(EnGg* this, PlayState* play) {
- s16 sp1E = this->skelAnime.curFrame;
- s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_2DA].animation);
+ s16 curFrame = this->skelAnime.curFrame;
+ s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->csAnimIndex].animation);
- if ((this->unk_2E6 == 14) && (sp1E == lastFrame)) {
- this->unk_2E6 = 15;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 15);
+ if ((this->animIndex == ENGG_ANIM_14) && (curFrame == endFrame)) {
+ this->animIndex = ENGG_ANIM_15;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG_ANIM_15);
}
}
@@ -378,8 +409,8 @@ void func_80B35968(EnGg* this, PlayState* play) {
if (this->unk_344.unk_34 != NULL) {
this->unk_344.unk_34(&this->unk_344, play);
} else {
- if ((this->unk_2DA == 11) || (this->unk_2DA == 14)) {
- this->unk_344.unk_30 = this->unk_2DA;
+ if ((this->csAnimIndex == ENGG_ANIM_11) || (this->csAnimIndex == ENGG_ANIM_14)) {
+ this->unk_344.animIndex = this->csAnimIndex;
}
func_80B363E8(&this->unk_344, play, &this->unk_320, &this->unk_32C, &this->unk_338);
}
@@ -392,13 +423,13 @@ void func_80B359DC(EnGg* this, PlayState* play) {
if (this->unk_306 == 0) {
if (player->stateFlags2 & PLAYER_STATE2_8000000) {
this->unk_306 = 1;
- play_sound(NA_SE_SY_TRE_BOX_APPEAR);
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
}
} else if (!(player->stateFlags2 & PLAYER_STATE2_8000000)) {
this->unk_306 = 0;
}
- if ((player->transformation == PLAYER_FORM_HUMAN) && (play->msgCtx.ocarinaMode == 3) &&
+ if ((player->transformation == PLAYER_FORM_HUMAN) && (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) &&
(play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING)) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_19_80)) {
SET_WEEKEVENTREG(WEEKEVENTREG_19_80);
@@ -406,16 +437,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 {
@@ -432,7 +463,7 @@ void func_80B35B24(EnGgStruct* ptr, PlayState* play) {
}
void func_80B35B44(EnGgStruct* ptr, PlayState* play) {
- if (ptr->unk_30 == 0xE) {
+ if (ptr->animIndex == ENGG_ANIM_14) {
ptr->unk_40++;
if (ptr->unk_40 > 0x46) {
ptr->unk_48 = 1;
@@ -454,13 +485,13 @@ void func_80B35B44(EnGgStruct* ptr, PlayState* play) {
ptr->unk_44 = 0x37;
}
}
- } else if ((ptr->unk_30 == 11) || (ptr->unk_30 == 12)) {
+ } else if ((ptr->animIndex == ENGG_ANIM_11) || (ptr->animIndex == ENGG_ANIM_12)) {
ptr->unk_40++;
if (ptr->unk_40 > 0x46) {
ptr->unk_48 = 1;
ptr->unk_40 = 0;
}
- } else if (ptr->unk_30 == 0xD) {
+ } else if (ptr->animIndex == ENGG_ANIM_13) {
ptr->unk_48 = 0;
ptr->unk_40++;
if (ptr->unk_40 > 0x46) {
@@ -495,7 +526,7 @@ void func_80B35C84(EnGgStruct* ptr, PlayState* play) {
sp74 = ptr->unk_40 % temp;
ptr->unk_40 = sp74;
phi_s7 = 0x46;
- } else if (ptr->unk_30 == 0xD) {
+ } else if (ptr->animIndex == ENGG_ANIM_13) {
sp74 = ptr->unk_40;
phi_s7 = 0x46;
} else {
@@ -518,6 +549,7 @@ void func_80B35C84(EnGgStruct* ptr, PlayState* play) {
temp_f26 = ptr->unk_00.z + (ptr->unk_18.z * temp_f20) + (0.5f * ptr->unk_24.z * temp_f20 * temp_f20);
temp_f20 = Rand_ZeroOne() * 0.003f;
+ //! FAKE:
if (1) {}
Matrix_Translate(temp_f22, temp_f24, temp_f26, MTXMODE_NEW);
@@ -526,7 +558,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 +582,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 +635,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);
@@ -629,9 +661,9 @@ void func_80B363E8(EnGgStruct* ptr, PlayState* play, Vec3f* arg1, Vec3f* arg2, V
ptr->unk_00.x += -4.0f;
ptr->unk_0C.x += 4.0f;
- if ((ptr->unk_30 == 11) || (ptr->unk_30 == 12) || (ptr->unk_30 == 13)) {
+ if ((ptr->animIndex == ENGG_ANIM_11) || (ptr->animIndex == ENGG_ANIM_12) || (ptr->animIndex == ENGG_ANIM_13)) {
ptr->unk_38 = func_80B35C84;
- } else if (ptr->unk_30 == 14) {
+ } else if (ptr->animIndex == ENGG_ANIM_14) {
ptr->unk_38 = func_80B3610C;
}
}
@@ -652,9 +684,9 @@ void EnGg_Init(Actor* thisx, PlayState* play) {
}
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 30.0f);
- this->actor.bgCheckFlags |= 0x400;
+ 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->morphTable, OBJECT_GG_LIMB_MAX);
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
@@ -663,9 +695,9 @@ void EnGg_Init(Actor* thisx, PlayState* play) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_20_04);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_20_08);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_20_10);
- this->actor.flags &= ~ACTOR_FLAG_80;
+ 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;
@@ -683,33 +715,35 @@ void EnGg_Update(Actor* thisx, PlayState* play) {
EnGg* this = THIS;
if (play->actorCtx.lensMaskSize == LENS_MASK_ACTIVE_SIZE) {
- this->actor.flags |= ACTOR_FLAG_80;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_REACT_TO_LENS;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
} else {
- this->actor.flags &= ~ACTOR_FLAG_80;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_REACT_TO_LENS;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_19_80)) {
- if (play->csCtx.state == 0) {
- this->actor.flags |= ACTOR_FLAG_1;
+ if (play->csCtx.state == CS_STATE_IDLE) {
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
} else {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
}
- if ((play->csCtx.state == 0) &&
- ((this->unk_2DA != 14) && (this->unk_2DA != 11) && (this->unk_2DA != 12) && (this->unk_2DA != 13))) {
+ if ((play->csCtx.state == CS_STATE_IDLE) &&
+ ((this->csAnimIndex != ENGG_ANIM_14) && (this->csAnimIndex != ENGG_ANIM_11) &&
+ (this->csAnimIndex != ENGG_ANIM_12) && (this->csAnimIndex != ENGG_ANIM_13))) {
func_80B364D4(&this->unk_344, play);
}
- if (((this->unk_2DA == 14) || (this->unk_2DA == 11) || (this->unk_2DA == 12) || (this->unk_2DA == 13)) &&
+ if (((this->csAnimIndex == ENGG_ANIM_14) || (this->csAnimIndex == ENGG_ANIM_11) ||
+ (this->csAnimIndex == ENGG_ANIM_12) || (this->csAnimIndex == ENGG_ANIM_13)) &&
(this->unk_309 == 1)) {
func_80B35968(this, play);
}
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_91_10) &&
- (CHECK_WEEKEVENTREG(WEEKEVENTREG_19_80) || CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_80) ||
+ (CHECK_WEEKEVENTREG(WEEKEVENTREG_19_80) || CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS) ||
(this->unk_308 == 1))) {
SET_WEEKEVENTREG(WEEKEVENTREG_91_10);
}
@@ -722,7 +756,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;
@@ -737,7 +771,7 @@ s32 EnGg_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po
Gfx** gfx) {
EnGg* this = THIS;
- if (limbIndex == 2) {
+ if (limbIndex == OBJECT_GG_LIMB_02) {
Matrix_RotateZS(this->unk_2E8, MTXMODE_APPLY);
}
return false;
@@ -749,12 +783,13 @@ void EnGg_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
Vec3f sp30 = { 0.0f, 0.0f, 0.0f };
Vec3f sp24 = { 0.0f, 0.0f, 0.0f };
- if (this->unk_2DA == 14) {
+ if (this->csAnimIndex == ENGG_ANIM_14) {
sp30.y = 3.0f;
sp30.z = -1.0f;
sp24.y = -0.07f;
this->unk_309 = 1;
- } else if ((this->unk_2DA == 11) || (this->unk_2DA == 12) || (this->unk_2DA == 13)) {
+ } else if ((this->csAnimIndex == ENGG_ANIM_11) || (this->csAnimIndex == ENGG_ANIM_12) ||
+ (this->csAnimIndex == ENGG_ANIM_13)) {
sp30.x = 3.0f;
sp24.x = 0.5f;
this->unk_309 = 1;
@@ -762,7 +797,7 @@ void EnGg_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
this->unk_309 = 0;
}
- if (limbIndex == 4) {
+ if (limbIndex == OBJECT_GG_LIMB_04) {
Matrix_MultVec3f(&D_80B36DF0, &this->unk_320);
Matrix_Push();
Matrix_RotateYS(this->actor.shape.rot.y, MTXMODE_NEW);
@@ -790,15 +825,15 @@ 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]));
POLY_OPA_DISP =
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_80) || (this->unk_308 == 1)) {
- func_8012C2DC(play->state.gfxCtx);
+ } else if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS) || (this->unk_308 == 1)) {
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(D_80B36DFC[this->unk_2E2]));
@@ -806,7 +841,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..436d5a4ab 100644
--- a/src/overlays/actors/ovl_En_Gg/z_en_gg.h
+++ b/src/overlays/actors/ovl_En_Gg/z_en_gg.h
@@ -2,6 +2,7 @@
#define Z_EN_GG_H
#include "global.h"
+#include "objects/object_gg/object_gg.h"
struct EnGg;
struct EnGgStruct;
@@ -14,14 +15,14 @@ typedef struct EnGgStruct {
/* 0x0C */ Vec3f unk_0C;
/* 0x18 */ Vec3f unk_18;
/* 0x24 */ Vec3f unk_24;
- /* 0x30 */ u8 unk_30;
+ /* 0x30 */ u8 animIndex;
/* 0x34 */ EnGgUnkFunc unk_34;
/* 0x38 */ EnGgUnkFunc unk_38;
/* 0x3C */ s32 unk_3C;
/* 0x40 */ s32 unk_40;
/* 0x44 */ s32 unk_44;
/* 0x48 */ u8 unk_48;
-} EnGgStruct; // size == 0x4C
+} EnGgStruct; // size = 0x4C
typedef struct EnGg {
/* 0x000 */ Actor actor;
@@ -30,16 +31,16 @@ typedef struct EnGg {
/* 0x1D4 */ EnGgActionFunc actionFunc;
/* 0x1D8 */ Vec3s unk_1D8;
/* 0x1DE */ Vec3s unk_1DE;
- /* 0x1E4 */ Vec3s jointTable[20];
- /* 0x25C */ Vec3s morphTable[20];
+ /* 0x1E4 */ Vec3s jointTable[OBJECT_GG_LIMB_MAX];
+ /* 0x25C */ Vec3s morphTable[OBJECT_GG_LIMB_MAX];
/* 0x2D4 */ UNK_TYPE1 unk_2D4[0x6];
- /* 0x2DA */ u8 unk_2DA;
- /* 0x2DB */ u8 unk_2DB;
- /* 0x2DC */ s16 unk_2DC;
+ /* 0x2DA */ u8 csAnimIndex;
+ /* 0x2DB */ u8 cueId;
+ /* 0x2DC */ s16 csId;
/* 0x2DE */ UNK_TYPE1 unk2DE[4];
/* 0x2E2 */ s16 unk_2E2;
/* 0x2E4 */ s16 unk_2E4;
- /* 0x2E6 */ s16 unk_2E6;
+ /* 0x2E6 */ s16 animIndex;
/* 0x2E8 */ s16 unk_2E8;
/* 0x2EA */ UNK_TYPE1 unk2EA[0x1A];
/* 0x304 */ s16 unk_304;
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 6da3b1378..3b6d62775 100644
--- a/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c
+++ b/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c
@@ -5,9 +5,8 @@
*/
#include "z_en_gg2.h"
-#include "objects/object_gg/object_gg.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_80)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_REACT_TO_LENS)
#define THIS ((EnGg2*)thisx)
@@ -39,15 +38,44 @@ ActorInit En_Gg2_InitVars = {
(ActorFunc)EnGg2_Draw,
};
-AnimationInfo D_80B3BF00[] = {
- { &object_gg_Anim_00F578, 1.0f, 0.0f, 0.0f, 0, -10.0f }, { &object_gg_Anim_00D528, 1.0f, 0.0f, 0.0f, 2, -10.0f },
- { &object_gg_Anim_00D174, 1.0f, 0.0f, 0.0f, 2, -10.0f }, { &object_gg_Anim_00ECC0, 1.0f, 0.0f, 0.0f, 2, -10.0f },
- { &object_gg_Anim_00BAF0, 1.0f, 0.0f, 0.0f, 0, -10.0f }, { &object_gg_Anim_00AF40, 1.0f, 0.0f, 0.0f, 0, -10.0f },
- { &object_gg_Anim_00F578, 1.0f, 0.0f, 0.0f, 0, -10.0f }, { &object_gg_Anim_00AF40, 1.0f, 0.0f, 0.0f, 0, -10.0f },
- { &object_gg_Anim_00F578, 1.0f, 0.0f, 0.0f, 0, -10.0f }, { &object_gg_Anim_0100C8, 1.0f, 0.0f, 0.0f, 0, 0.0f },
- { &object_gg_Anim_00CDA0, 1.0f, 0.0f, 0.0f, 0, 0.0f }, { &object_gg_Anim_00B560, 1.0f, 0.0f, 0.0f, 0, 0.0f },
- { &object_gg_Anim_00A4B4, 1.0f, 0.0f, 0.0f, 2, 0.0f }, { &object_gg_Anim_00E86C, 1.0f, 0.0f, 0.0f, 2, 0.0f },
- { &object_gg_Anim_00D99C, 1.0f, 0.0f, 0.0f, 2, 0.0f }, { &object_gg_Anim_00E2A4, 1.0f, 0.0f, 0.0f, 0, 0.0f },
+typedef enum {
+ /* -1 */ ENGG2_ANIM_NONE = -1,
+ /* 0x00 */ ENGG2_ANIM_0,
+ /* 0x01 */ ENGG2_ANIM_1,
+ /* 0x02 */ ENGG2_ANIM_2,
+ /* 0x03 */ ENGG2_ANIM_3,
+ /* 0x04 */ ENGG2_ANIM_4,
+ /* 0x05 */ ENGG2_ANIM_5,
+ /* 0x06 */ ENGG2_ANIM_6,
+ /* 0x07 */ ENGG2_ANIM_7,
+ /* 0x08 */ ENGG2_ANIM_8,
+ /* 0x09 */ ENGG2_ANIM_9,
+ /* 0x0A */ ENGG2_ANIM_10,
+ /* 0x0B */ ENGG2_ANIM_11,
+ /* 0x0C */ ENGG2_ANIM_12,
+ /* 0x0D */ ENGG2_ANIM_13,
+ /* 0x0E */ ENGG2_ANIM_14,
+ /* 0x0F */ ENGG2_ANIM_15,
+ /* 0x10 */ ENGG2_ANIM_MAX
+} EnGg2Animation;
+
+static AnimationInfo sAnimationInfo[ENGG2_ANIM_MAX] = {
+ { &object_gg_Anim_00F578, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -10.0f }, // ENGG2_ANIM_0
+ { &object_gg_Anim_00D528, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -10.0f }, // ENGG2_ANIM_1
+ { &object_gg_Anim_00D174, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -10.0f }, // ENGG2_ANIM_2
+ { &object_gg_Anim_00ECC0, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -10.0f }, // ENGG2_ANIM_3
+ { &object_gg_Anim_00BAF0, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -10.0f }, // ENGG2_ANIM_4
+ { &object_gg_Anim_00AF40, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -10.0f }, // ENGG2_ANIM_5
+ { &object_gg_Anim_00F578, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -10.0f }, // ENGG2_ANIM_6
+ { &object_gg_Anim_00AF40, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -10.0f }, // ENGG2_ANIM_7
+ { &object_gg_Anim_00F578, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -10.0f }, // ENGG2_ANIM_8
+ { &object_gg_Anim_0100C8, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGG2_ANIM_9
+ { &object_gg_Anim_00CDA0, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGG2_ANIM_10
+ { &object_gg_Anim_00B560, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGG2_ANIM_11
+ { &object_gg_Anim_00A4B4, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // ENGG2_ANIM_12
+ { &object_gg_Anim_00E86C, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // ENGG2_ANIM_13
+ { &object_gg_Anim_00D99C, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // ENGG2_ANIM_14
+ { &object_gg_Anim_00E2A4, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGG2_ANIM_15
};
Color_RGBA8 D_80B3C080 = { 255, 255, 255, 255 };
@@ -89,7 +117,7 @@ s32 func_80B3AC94(EnGg2* this, PlayState* play) {
pitch = Math_Vec3f_Pitch(&sp34, &sp40);
if ((this->actor.xzDistToPlayer < 250.0f) && (this->actor.xzDistToPlayer > 50.0f) &&
- CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_80)) {
+ CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS)) {
Math_SmoothStepToS(&this->unk_2F4, pitch, 4, 0x2AA8, 1);
} else {
Math_SmoothStepToS(&this->unk_2F4, 0, 4, 0x2AA8, 1);
@@ -116,38 +144,38 @@ void func_80B3ADD8(EnGg2* this) {
void func_80B3AE60(EnGg2* this, PlayState* play) {
s16 curFrame = this->skelAnime.curFrame;
- s16 lastFrame = Animation_GetLastFrame(D_80B3BF00[this->unk_2EE].animation);
+ s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
- if (curFrame == lastFrame) {
- switch (this->unk_2EE) {
- case 0:
- this->unk_2EE = 1;
- Actor_ChangeAnimationByInfo(&this->skelAnime, D_80B3BF00, 1);
+ if (curFrame == endFrame) {
+ switch (this->animIndex) {
+ case ENGG2_ANIM_0:
+ this->animIndex = ENGG2_ANIM_1;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG2_ANIM_1);
this->actionFunc = func_80B3B0A0;
break;
- case 1:
- case 8:
- this->unk_2EE = 5;
- this->actor.flags &= ~ACTOR_FLAG_1;
- Actor_ChangeAnimationByInfo(&this->skelAnime, D_80B3BF00, 5);
+ case ENGG2_ANIM_1:
+ case ENGG2_ANIM_8:
+ this->animIndex = ENGG2_ANIM_5;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG2_ANIM_5);
this->actionFunc = func_80B3B120;
break;
- case 5:
- this->unk_2EE = 6;
- Actor_ChangeAnimationByInfo(&this->skelAnime, D_80B3BF00, 0);
+ case ENGG2_ANIM_5:
+ this->animIndex = ENGG2_ANIM_6;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG2_ANIM_0);
this->actionFunc = func_80B3B21C;
break;
- case 6:
- this->unk_2EE = 7;
- Actor_ChangeAnimationByInfo(&this->skelAnime, D_80B3BF00, 5);
+ case ENGG2_ANIM_6:
+ this->animIndex = ENGG2_ANIM_7;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG2_ANIM_5);
this->actionFunc = func_80B3B294;
break;
default:
- Actor_ChangeAnimationByInfo(&this->skelAnime, D_80B3BF00, 0);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG2_ANIM_0);
this->actionFunc = func_80B3AFB0;
break;
}
@@ -159,21 +187,21 @@ void func_80B3AFB0(EnGg2* this, PlayState* play) {
this->unk_2F0 = 1;
this->actionFunc = func_80B3AE60;
} else if ((this->actor.xzDistToPlayer < 100.0f) && (this->actor.xzDistToPlayer > 50.0f) &&
- CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_80)) {
- func_800B863C(&this->actor, play);
+ CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS)) {
+ Actor_OfferTalkNearColChkInfoCylinder(&this->actor, play);
this->actor.textId = 0xCE4;
}
}
void func_80B3B05C(EnGg2* this, PlayState* play) {
- if ((this->actor.xzDistToPlayer < 100.0f) && CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_80)) {
+ if ((this->actor.xzDistToPlayer < 100.0f) && CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS)) {
this->actionFunc = func_80B3B5D4;
}
}
void func_80B3B0A0(EnGg2* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->unk_2F0 = 0;
this->actionFunc = func_80B3B5D4;
@@ -183,28 +211,28 @@ 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.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
} else {
this->unk_1DC++;
}
}
- Math_ApproachF(&this->actor.speedXZ, 5.0f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 5.0f, 0.2f, 1.0f);
}
}
void func_80B3B21C(EnGg2* this, PlayState* play) {
- this->actor.speedXZ = 0.0f;
- if ((this->actor.xzDistToPlayer < 100.0f) && CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_80)) {
- this->unk_2E4 = ActorCutscene_GetAdditionalCutscene(this->unk_2E4);
+ this->actor.speed = 0.0f;
+ if ((this->actor.xzDistToPlayer < 100.0f) && CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS)) {
+ this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
this->actionFunc = func_80B3B5D4;
}
}
@@ -227,15 +255,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;
@@ -256,7 +284,7 @@ void func_80B3B294(EnGg2* this, PlayState* play) {
}
}
}
- Math_ApproachF(&this->actor.speedXZ, 5.0f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 5.0f, 0.2f, 1.0f);
}
void func_80B3B4B0(EnGg2* this, PlayState* play) {
@@ -274,14 +302,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 +338,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;
@@ -338,7 +366,7 @@ f32 func_80B3B7E4(Path* path, s32 arg1, Vec3f* arg2, Vec3s* arg3) {
void func_80B3B8A4(EnGg2* this) {
f32 sp1C;
- if ((this->unk_2EE != 5) && (this->unk_2EE != 7)) {
+ if ((this->animIndex != ENGG2_ANIM_5) && (this->animIndex != ENGG2_ANIM_7)) {
this->unk_2F2 += 0x62C;
sp1C = 1100.0f;
} else {
@@ -366,17 +394,17 @@ void EnGg2_Init(Actor* thisx, PlayState* play2) {
}
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 30.0f);
- this->actor.bgCheckFlags |= 0x400;
+ 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->actor.flags &= ~ACTOR_FLAG_80;
+ this->morphTable, OBJECT_GG_LIMB_MAX);
+ 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;
@@ -384,15 +412,15 @@ void EnGg2_Init(Actor* thisx, PlayState* play2) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_20_04);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_20_08);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_20_10);
- this->unk_2EE = 0;
- Actor_ChangeAnimationByInfo(&this->skelAnime, D_80B3BF00, 0);
+ this->animIndex = ENGG2_ANIM_0;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG2_ANIM_0);
this->actionFunc = func_80B3AFB0;
} else if (play->sceneId == SCENE_17SETUGEN) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_20_04) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_20_08) &&
!CHECK_WEEKEVENTREG(WEEKEVENTREG_20_10)) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_20_04);
- this->unk_2EE = 8;
- Actor_ChangeAnimationByInfo(&this->skelAnime, D_80B3BF00, 0);
+ this->animIndex = ENGG2_ANIM_8;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG2_ANIM_0);
this->actionFunc = func_80B3B05C;
} else {
Actor_Kill(&this->actor);
@@ -401,8 +429,8 @@ void EnGg2_Init(Actor* thisx, PlayState* play2) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_20_04) && CHECK_WEEKEVENTREG(WEEKEVENTREG_20_08) &&
!CHECK_WEEKEVENTREG(WEEKEVENTREG_20_10)) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_20_08);
- this->unk_2EE = 8;
- Actor_ChangeAnimationByInfo(&this->skelAnime, D_80B3BF00, 0);
+ this->animIndex = ENGG2_ANIM_8;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGG2_ANIM_0);
this->actionFunc = func_80B3B05C;
} else {
Actor_Kill(&this->actor);
@@ -422,14 +450,14 @@ void EnGg2_Update(Actor* thisx, PlayState* play) {
EnGg2* this = THIS;
if (play->actorCtx.lensMaskSize == LENS_MASK_ACTIVE_SIZE) {
- this->actor.flags |= ACTOR_FLAG_80;
- this->actor.flags |= ACTOR_FLAG_1;
- if ((this->unk_2EE == 5) && (this->unk_2EE == 7)) {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_REACT_TO_LENS;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
+ if ((this->animIndex == ENGG2_ANIM_5) && (this->animIndex == ENGG2_ANIM_7)) {
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
} else {
- this->actor.flags &= ~ACTOR_FLAG_80;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_REACT_TO_LENS;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
this->actionFunc(this, play);
@@ -441,8 +469,8 @@ void EnGg2_Update(Actor* thisx, PlayState* play) {
func_80B3B8A4(this);
Actor_TrackPlayer(play, &this->actor, &this->unk_1E0, &this->unk_1E6, this->actor.focus.pos);
- if ((this->unk_2EE == 5) || (this->unk_2EE == 7)) {
- func_800B9010(&this->actor, NA_SE_EN_SHARP_FLOAT - SFX_FLAG);
+ if ((this->animIndex == ENGG2_ANIM_5) || (this->animIndex == ENGG2_ANIM_7)) {
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_SHARP_FLOAT - SFX_FLAG);
if ((play->actorCtx.lensMaskSize == LENS_MASK_ACTIVE_SIZE) && ((play->state.frames % 4) == 0)) {
func_80B3B4B0(this, play);
}
@@ -454,12 +482,12 @@ void EnGg2_Update(Actor* thisx, PlayState* play) {
s32 func_80B3BD44(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx, Gfx** gfx) {
EnGg2* this = THIS;
- if ((this->unk_2EE != 5) && (this->unk_2EE != 7)) {
- if (limbIndex == 1) {
+ if ((this->animIndex != ENGG2_ANIM_5) && (this->animIndex != ENGG2_ANIM_7)) {
+ if (limbIndex == OBJECT_GG_LIMB_01) {
Matrix_RotateYS(this->unk_2F6, MTXMODE_APPLY);
}
- if (limbIndex == 2) {
+ if (limbIndex == OBJECT_GG_LIMB_02) {
Matrix_RotateZS(this->unk_2F4, MTXMODE_APPLY);
}
}
@@ -469,7 +497,7 @@ s32 func_80B3BD44(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s
void func_80B3BDC0(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx, Gfx** gfx) {
EnGg2* this = THIS;
- if (limbIndex == 4) {
+ if (limbIndex == OBJECT_GG_LIMB_04) {
Matrix_MultVec3f(&D_80B3C0A0, &this->unk_304);
}
}
@@ -479,9 +507,9 @@ 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_80) || (this->unk_2F0 == 1)) {
+ 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]));
POLY_XLU_DISP =
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..dd68c20b1 100644
--- a/src/overlays/actors/ovl_En_Gg2/z_en_gg2.h
+++ b/src/overlays/actors/ovl_En_Gg2/z_en_gg2.h
@@ -2,30 +2,33 @@
#define Z_EN_GG2_H
#include "global.h"
+#include "objects/object_gg/object_gg.h"
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];
+ /* 0x1EC */ Vec3s jointTable[OBJECT_GG_LIMB_MAX];
+ /* 0x264 */ Vec3s morphTable[OBJECT_GG_LIMB_MAX];
/* 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;
- /* 0x2EE */ s16 unk_2EE;
+ /* 0x2EE */ s16 animIndex;
/* 0x2F0 */ u8 unk_2F0;
/* 0x2F1 */ u8 unk_2F1;
/* 0x2F2 */ s16 unk_2F2;
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 dbd180359..d68e6902f 100644
--- a/src/overlays/actors/ovl_En_Giant/z_en_giant.c
+++ b/src/overlays/actors/ovl_En_Giant/z_en_giant.c
@@ -28,10 +28,45 @@ void EnGiant_PerformCutsceneActions(EnGiant* this, PlayState* play);
#define GIANT_TYPE_IS_CLOCK_TOWER_FAILURE(type) \
(type >= GIANT_TYPE_MOUNTAIN_CLOCK_TOWER_FAILURE && type <= GIANT_TYPE_OCEAN_CLOCK_TOWER_FAILURE)
+/**
+ * Used as values for cueId. The UNKNOWN ones are never used in-game.
+ */
+typedef enum {
+ /* 0 */ GIANT_CUEID_NONE,
+ /* 1 */ GIANT_CUEID_IDLE,
+ /* 2 */ GIANT_CUEID_WALKING,
+ /* 3 */ GIANT_CUEID_LOOKING_UP,
+ /* 4 */ GIANT_CUEID_RAISING_ARMS,
+ /* 5 */ GIANT_CUEID_STRUGGLING,
+ /* 6 */ GIANT_CUEID_FALLING_OVER,
+ /* 7 */ GIANT_CUEID_IDLE_FADE_IN,
+ /* 8 */ GIANT_CUEID_TALKING,
+ /* 9 */ GIANT_CUEID_DONE_TALKING,
+ /* 10 */ GIANT_CUEID_TEACHING_OATH_TO_ORDER,
+ /* 11 */ GIANT_CUEID_PLAYER_LEARNED_OATH_TO_ORDER,
+ /* 12 */ GIANT_CUEID_UNKNOWN_12,
+ /* 13 */ GIANT_CUEID_UNKNOWN_13,
+ /* 14 */ GIANT_CUEID_UNKNOWN_14,
+ /* 15 */ GIANT_CUEID_HOLDING_UP_MOON_IN_CLOCK_TOWER
+} GiantCueId;
+
+ActorInit En_Giant_InitVars = {
+ ACTOR_EN_GIANT,
+ ACTORCAT_NPC,
+ FLAGS,
+ OBJECT_GIANT,
+ sizeof(EnGiant),
+ (ActorFunc)EnGiant_Init,
+ (ActorFunc)EnGiant_Destroy,
+ (ActorFunc)EnGiant_Update,
+ (ActorFunc)EnGiant_Draw,
+};
+
/**
* These values are used to index into sAnimations to pick the appropriate animation.
*/
typedef enum {
+ /* -1 */ GIANT_ANIM_NONE = -1,
/* 0 */ GIANT_ANIM_LOOK_UP_START,
/* 1 */ GIANT_ANIM_LOOK_UP_LOOP,
/* 2 */ GIANT_ANIM_FALLING_OVER,
@@ -50,49 +85,26 @@ typedef enum {
/* 15 */ GIANT_ANIM_MAX
} GiantAnimation;
-/**
- * Used as values for csAction. 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;
-
-ActorInit En_Giant_InitVars = {
- ACTOR_EN_GIANT,
- ACTORCAT_NPC,
- FLAGS,
- OBJECT_GIANT,
- sizeof(EnGiant),
- (ActorFunc)EnGiant_Init,
- (ActorFunc)EnGiant_Destroy,
- (ActorFunc)EnGiant_Update,
- (ActorFunc)EnGiant_Draw,
-};
-
-static AnimationHeader* sAnimations[] = {
- &gGiantLookUpStartAnim, &gGiantLookUpLoopAnim, &gGiantFallingOverAnim, &gGiantRaisedArmsStartAnim,
- &gGiantRaisedArmsLoopAnim, &gGiantStruggleStartAnim, &gGiantStruggleLoopAnim, &gGiantIdleAnim,
- &gGiantWalkingAnim, &gGiantBigCallStartAnim, &gGiantBigCallLoopAnim, &gGiantBigCallEndAnim,
- &gGiantSmallCallStartAnim, &gGiantSmallCallLoopAnim, &gGiantSmallCallEndAnim,
+static AnimationHeader* sAnimations[GIANT_ANIM_MAX] = {
+ &gGiantLookUpStartAnim, // GIANT_ANIM_LOOK_UP_START
+ &gGiantLookUpLoopAnim, // GIANT_ANIM_LOOK_UP_LOOP
+ &gGiantFallingOverAnim, // GIANT_ANIM_FALLING_OVER
+ &gGiantRaisedArmsStartAnim, // GIANT_ANIM_RAISED_ARMS_START
+ &gGiantRaisedArmsLoopAnim, // GIANT_ANIM_RAISED_ARMS_LOOP
+ &gGiantStruggleStartAnim, // GIANT_ANIM_STRUGGLE_START
+ &gGiantStruggleLoopAnim, // GIANT_ANIM_STRUGGLE_LOOP
+ &gGiantIdleAnim, // GIANT_ANIM_IDLE_LOOP
+ &gGiantWalkingAnim, // GIANT_ANIM_WALKING_LOOP
+ &gGiantBigCallStartAnim, // GIANT_ANIM_BIG_CALL_START
+ &gGiantBigCallLoopAnim, // GIANT_ANIM_BIG_CALL_LOOP
+ &gGiantBigCallEndAnim, // GIANT_ANIM_BIG_CALL_END
+ &gGiantSmallCallStartAnim, // GIANT_ANIM_SMALL_CALL_START
+ &gGiantSmallCallLoopAnim, // GIANT_ANIM_SMALL_CALL_LOOP
+ &gGiantSmallCallEndAnim, // GIANT_ANIM_SMALL_CALL_END
};
void EnGiant_ChangeAnim(EnGiant* this, s16 animIndex) {
- if (animIndex >= GIANT_ANIM_LOOK_UP_START && animIndex < GIANT_ANIM_MAX) {
+ if ((animIndex >= GIANT_ANIM_LOOK_UP_START) && (animIndex < GIANT_ANIM_MAX)) {
if (((this->animIndex == GIANT_ANIM_WALKING_LOOP) && (animIndex != GIANT_ANIM_WALKING_LOOP)) ||
((animIndex == GIANT_ANIM_WALKING_LOOP) && (this->animIndex != GIANT_ANIM_WALKING_LOOP))) {
Animation_Change(&this->skelAnime, sAnimations[animIndex], 1.0f, 0.0f,
@@ -114,6 +126,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 +135,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 +144,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 +153,9 @@ s32 EnGiant_IsImprisoned(EnGiant* this) {
return true;
}
break;
+
+ default:
+ break;
}
return false;
@@ -154,31 +172,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_CUEID_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 +210,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 +247,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,67 +283,84 @@ 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_CUEID_IDLE:
EnGiant_ChangeAnim(this, GIANT_ANIM_IDLE_LOOP);
break;
- case GIANT_CS_ACTION_WALKING:
+
+ case GIANT_CUEID_WALKING:
EnGiant_ChangeAnim(this, GIANT_ANIM_WALKING_LOOP);
break;
- case GIANT_CS_ACTION_STRUGGLING:
+
+ case GIANT_CUEID_STRUGGLING:
EnGiant_ChangeAnim(this, GIANT_ANIM_STRUGGLE_START);
break;
- case GIANT_CS_ACTION_FALLING_OVER:
+
+ case GIANT_CUEID_FALLING_OVER:
EnGiant_ChangeAnim(this, GIANT_ANIM_FALLING_OVER);
break;
- case GIANT_CS_ACTION_IDLE_FADE_IN:
+
+ case GIANT_CUEID_IDLE_FADE_IN:
EnGiant_ChangeAnim(this, GIANT_ANIM_IDLE_LOOP);
this->alpha = 0;
break;
- case GIANT_CS_ACTION_TALKING:
+
+ case GIANT_CUEID_TALKING:
EnGiant_ChangeAnim(this, GIANT_ANIM_BIG_CALL_START);
break;
- case GIANT_CS_ACTION_DONE_TALKING:
+
+ case GIANT_CUEID_DONE_TALKING:
EnGiant_ChangeAnim(this, GIANT_ANIM_BIG_CALL_END);
break;
- case GIANT_CS_ACTION_TEACHING_OATH_TO_ORDER:
+
+ case GIANT_CUEID_TEACHING_OATH_TO_ORDER:
EnGiant_ChangeAnim(this, GIANT_ANIM_SMALL_CALL_START);
break;
- case GIANT_CS_ACTION_PLAYER_LEARNED_OATH_TO_ORDER:
+
+ case GIANT_CUEID_PLAYER_LEARNED_OATH_TO_ORDER:
EnGiant_ChangeAnim(this, GIANT_ANIM_SMALL_CALL_END);
break;
- case GIANT_CS_ACTION_UNKNOWN_12:
+
+ case GIANT_CUEID_UNKNOWN_12:
EnGiant_ChangeAnim(this, GIANT_ANIM_IDLE_LOOP);
break;
- case GIANT_CS_ACTION_UNKNOWN_13:
+
+ case GIANT_CUEID_UNKNOWN_13:
EnGiant_ChangeAnim(this, GIANT_ANIM_WALKING_LOOP);
break;
- case GIANT_CS_ACTION_UNKNOWN_14:
+
+ case GIANT_CUEID_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_CUEID_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_CUEID_FALLING_OVER:
if (this->skelAnime.curFrame >= 90.0f && this->alpha > 0) {
this->alpha -= 12;
}
break;
- case GIANT_CS_ACTION_UNKNOWN_14:
+
+ case GIANT_CUEID_UNKNOWN_14:
this->alpha -= 12;
break;
+
default:
if (this->alpha < 255) {
this->alpha += 8;
@@ -336,83 +377,91 @@ 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_CUEID_FALLING_OVER))) {
EnGiant_ChangeAnim(this, this->animIndex);
- switch (this->csAction) {
- case GIANT_CS_ACTION_LOOKING_UP:
+
+ switch (this->cueId) {
+ case GIANT_CUEID_LOOKING_UP:
EnGiant_ChangeToStartOrLoopAnimation(this, GIANT_ANIM_LOOK_UP_START);
break;
- case GIANT_CS_ACTION_RAISING_ARMS:
+
+ case GIANT_CUEID_RAISING_ARMS:
EnGiant_ChangeToStartOrLoopAnimation(this, GIANT_ANIM_RAISED_ARMS_START);
break;
- case GIANT_CS_ACTION_STRUGGLING:
+
+ case GIANT_CUEID_STRUGGLING:
EnGiant_ChangeToStartOrLoopAnimation(this, GIANT_ANIM_STRUGGLE_START);
break;
- case GIANT_CS_ACTION_FALLING_OVER:
+
+ case GIANT_CUEID_FALLING_OVER:
// Unused
EnGiant_ChangeToStartOrLoopAnimation(this, GIANT_ANIM_FALLING_OVER);
break;
- case GIANT_CS_ACTION_TALKING:
+
+ case GIANT_CUEID_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_CUEID_DONE_TALKING:
+ case GIANT_CUEID_PLAYER_LEARNED_OATH_TO_ORDER:
EnGiant_ChangeAnim(this, GIANT_ANIM_IDLE_LOOP);
break;
- case GIANT_CS_ACTION_TEACHING_OATH_TO_ORDER:
+
+ case GIANT_CUEID_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_PlaySfxAtPos(&this->actor, NA_SE_EV_KYOJIN_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_KYOJIN_WALK);
}
- if (this->animIndex == GIANT_ANIM_FALLING_OVER && Animation_OnFrame(&this->skelAnime, 40.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_KYOJIN_VOICE_FAIL);
+ 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)) {
- func_800B9010(&this->actor, this->sfxId);
+ if ((this->sfxId != 0xFFFF) &&
+ (((this->animIndex == GIANT_ANIM_BIG_CALL_START) && (this->skelAnime.curFrame >= 18.0f)) ||
+ (this->animIndex == GIANT_ANIM_BIG_CALL_LOOP))) {
+ Actor_PlaySfx_Flagged(&this->actor, this->sfxId);
}
- 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);
+ if (((this->animIndex == GIANT_ANIM_SMALL_CALL_START) && (this->skelAnime.curFrame >= 18.0f)) ||
+ (this->animIndex == GIANT_ANIM_SMALL_CALL_LOOP)) {
+ Actor_PlaySfx_Flagged(&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) {
- func_800B9010(&this->actor, NA_SE_IT_KYOJIN_BEARING - SFX_FLAG);
+ if (this->cueId == GIANT_CUEID_STRUGGLING) {
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_IT_KYOJIN_BEARING - SFX_FLAG);
}
EnGiant_PlayAndUpdateAnimation(this);
}
@@ -424,13 +473,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 +496,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 +541,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 +549,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 88d55dc14..2a5e6712a 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
@@ -5,9 +5,8 @@
*/
#include "z_en_ginko_man.h"
-#include "objects/object_boj/object_boj.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnGinkoMan*)thisx)
@@ -47,21 +46,22 @@ typedef enum {
/* 1 */ GINKO_ANIM_SITTING,
/* 2 */ GINKO_ANIM_REACHING,
/* 3 */ GINKO_ANIM_AMAZED,
- /* 4 */ GINKO_ANIM_ADVERTISING,
+ /* 4 */ GINKO_ANIM_ADVERTISING, // looking around for customers
+ /* 5 */ GINKO_ANIM_MAX
} GinkoAnimation;
-static AnimationInfo sAnimationInfo[] = {
- { &object_boj_Anim_0008C0, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
- { &object_boj_Anim_0043F0, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
- { &object_boj_Anim_004F40, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f },
- { &object_boj_Anim_000AC4, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // looking around for customers
- { &object_boj_Anim_004A7C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
+static AnimationInfo sAnimationInfo[GINKO_ANIM_MAX] = {
+ { &object_boj_Anim_0008C0, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // GINKO_ANIM_LEGSMACKING
+ { &object_boj_Anim_0043F0, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // GINKO_ANIM_SITTING
+ { &object_boj_Anim_004F40, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, // GINKO_ANIM_REACHING
+ { &object_boj_Anim_000AC4, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // GINKO_ANIM_AMAZED
+ { &object_boj_Anim_004A7C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // GINKO_ANIM_ADVERTISING
};
void EnGinkoMan_Init(Actor* thisx, PlayState* play) {
EnGinkoMan* this = THIS;
- this->actor.targetMode = 1;
+ this->actor.targetMode = TARGET_MODE_1;
this->actor.uncullZoneForward = 400.0f;
Actor_SetScale(&this->actor, 0.01f);
this->actor.colChkInfo.cylRadius = 100;
@@ -71,7 +71,7 @@ void EnGinkoMan_Init(Actor* thisx, PlayState* play) {
this->choiceDepositWithdrawl = GINKOMAN_CHOICE_RESET;
this->serviceFee = 0;
SkelAnime_InitFlex(play, &this->skelAnime, &object_boj_Skel_00C240, &object_boj_Anim_0043F0, this->jointTable,
- this->morphTable, 16);
+ this->morphTable, OBJECT_BOJ_LIMB_MAX);
EnGinkoMan_SetupIdle(this);
}
@@ -79,7 +79,7 @@ void EnGinkoMan_Destroy(Actor* thisx, PlayState* play) {
}
void EnGinkoMan_SetupIdle(EnGinkoMan* this) {
- this->actor.flags |= ACTOR_FLAG_1; // targetable
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_SITTING);
this->actionFunc = EnGinkoMan_Idle;
}
@@ -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 (HS_GET_BANK_RUPEES() == 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
@@ -97,15 +97,15 @@ void EnGinkoMan_Idle(EnGinkoMan* this, PlayState* play) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_SITTING);
if ((CURRENT_DAY == 3) && (gSaveContext.save.isNight == true)) {
Message_StartTextbox(play, 0x467, &this->actor);
- this->curTextId = 0x467; // "What's this? You need somethin' on a day like this?
+ this->curTextId = 0x467;
} else {
Message_StartTextbox(play, 0x466, &this->actor);
- this->curTextId = 0x466; // What's this? You need somethin'?
+ this->curTextId = 0x466;
}
}
EnGinkoMan_SetupDialogue(this);
} else if (ABS_ALT(yaw) < 0x1555) {
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
}
@@ -116,25 +116,26 @@ void EnGinkoMan_DepositDialogue(EnGinkoMan* this, PlayState* play) {
}
switch (this->curTextId) {
- case 0x44C: // "Hey there, little guy! Won't you deposit some Rupees? (first dialogue)
+ case 0x44C:
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_SITTING);
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_10_08)) {
Message_StartTextbox(play, 0x44E, &this->actor);
- this->curTextId = 0x44E; //" ...So, what'll it be? Deposit Rupees Don't deposit Rupees"
+ this->curTextId = 0x44E;
} else {
Message_StartTextbox(play, 0x44D, &this->actor);
- this->curTextId =
- 0x44D; // "For example, if you deposit 200 Rupees, you'll get an item that holds a lot of Rupees."
+ this->curTextId = 0x44D;
}
break;
- case 0x44D: // "For example, if you deposit 200 Rupees, you'll get an item that holds a lot of Rupees."
+
+ case 0x44D:
Message_StartTextbox(play, 0x44E, &this->actor);
- this->curTextId = 0x44E; //" ...So, what'll it be? Deposit Rupees Don't deposit Rupees"
+ this->curTextId = 0x44E;
break;
- case 0x44F: // "...So, what'll it be? Deposit Rupees Don't deposit Rupees"
+
+ case 0x44F:
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_LEGSMACKING);
Message_StartTextbox(play, 0x450, &this->actor);
- this->curTextId = 0x450; // "How much? How much? [rupee prompt]
+ this->curTextId = 0x450;
break;
case 0x453: // you deposited a tiny amount
@@ -142,334 +143,353 @@ void EnGinkoMan_DepositDialogue(EnGinkoMan* this, PlayState* play) {
case 0x455: // you deposited a lot
if (this->isNewAccount == true) {
this->isNewAccount = false;
- if (this->curTextId != 0x453) { // "That's it? That ain't nothing at all, big spender!
+ if (this->curTextId != 0x453) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_SITTING);
}
Message_StartTextbox(play, 0x461, &this->actor);
- this->curTextId = 0x461; // So, little guy, what's your name?
+ this->curTextId = 0x461;
} else {
- if (this->curTextId == 0x453) { // "That's it? That ain't nothing at all, big spender!
+ if (this->curTextId == 0x453) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_LEGSMACKING);
}
- play->msgCtx.bankRupees = gSaveContext.save.bankRupees & 0xFFFF;
+ play->msgCtx.bankRupees = HS_GET_BANK_RUPEES();
Message_StartTextbox(play, 0x45A, &this->actor);
- this->curTextId = 0x45A; // "All right, little guy, now I've got a total of [rupees] from you!"
+ this->curTextId = 0x45A;
}
break;
- case 0x456: // "Is that so? Think about it, little guy!"
- case 0x459: // "Heyyy! You don't have that much!
+
+ case 0x456:
+ case 0x459:
Message_StartTextbox(play, 0x44E, &this->actor);
- this->curTextId = 0x44E; //" ...So, what'll it be? Deposit Rupees Don't deposit Rupees"
+ this->curTextId = 0x44E;
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) &&
+
+ case 0x45A:
+ if ((HS_GET_BANK_RUPEES() >= 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) &&
+ this->curTextId = 0x45B;
+ } else if ((HS_GET_BANK_RUPEES() >= 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) {
+ this->curTextId = 0x45C;
+ } else if (HS_GET_BANK_RUPEES() >= 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)) {
+ this->curTextId = 0x45D;
+ } else if (this->previousBankValue < (s16)HS_GET_BANK_RUPEES()) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_SITTING);
Message_StartTextbox(play, 0x45E, &this->actor);
- this->curTextId =
- 0x45E; // "...Hang on there, little guy. I can't take any more deposits. Sorry..."
+ this->curTextId = 0x45E;
} else {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_LEGSMACKING);
Message_StartTextbox(play, 0x460, &this->actor);
- this->curTextId = 0x460; // "Come back and deposit some after you save up a bunch!"
+ this->curTextId = 0x460;
}
} else {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_LEGSMACKING);
Message_StartTextbox(play, 0x460, &this->actor);
- this->curTextId = 0x460; // "Come back and deposit some after you save up a bunch!"
+ this->curTextId = 0x460;
}
break;
+
case 0x45B: // given 200 reward
case 0x45C: // given 1000 reward
case 0x45D: // given 5000 reward
this->isStampChecked = false;
- func_801477B4(play);
+ Message_CloseTextbox(play);
EnGinkoMan_SetupBankAward(this);
EnGinkoMan_BankAward(this, play);
break;
- case 0x461: // So, little guy, what's your name?
+
+ case 0x461:
Message_StartTextbox(play, 0x462, &this->actor);
- this->curTextId = 0x462; // Hmm... Link is it?
+ this->curTextId = 0x462;
break;
- case 0x462: // Hmm.. Link is it?
+
+ case 0x462:
Message_StartTextbox(play, 0x463, &this->actor);
- this->curTextId = 0x463; // Got it... I won't forget your deposits. Let me stamp you
+ this->curTextId = 0x463;
break;
- case 0x463: // Got it... I won't forget your deposits. Let me stamp you
+
+ case 0x463:
Message_StartTextbox(play, 0x464, &this->actor);
- this->curTextId = 0x464; // Hey, relax! It doesn't leave any marks
+ this->curTextId = 0x464;
break;
- case 0x464: // Hey, relax! It doesn't leave any marks
- play->msgCtx.msgMode = 0x44;
+
+ case 0x464:
+ play->msgCtx.msgMode = MSGMODE_PAUSED;
EnGinkoMan_SetupStamp(this); // stamp player
break;
- case 0x465: // "There! Now I'll know you when I see you!"
+
+ case 0x465:
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_LEGSMACKING);
- play->msgCtx.bankRupees = gSaveContext.save.bankRupees & 0xFFFF;
+ play->msgCtx.bankRupees = HS_GET_BANK_RUPEES();
Message_StartTextbox(play, 0x45A, &this->actor);
- this->curTextId = 0x45A; // "All right, little guy, now I've got a total of [rupees] from you!"
+ this->curTextId = 0x45A;
break;
- case 0x466: // What's this? You need somethin'?
- case 0x467: // "What's this? You need somethin' on a day like this? You haven't evacuated yet?
+
+ case 0x466:
+ case 0x467:
Message_StartTextbox(play, 0x468, &this->actor);
- this->curTextId = 0x468; // " Deposit Rupees Withdraw Rupees Nothing really"
+ this->curTextId = 0x468;
break;
- case 0x469: // "Excuse me, but let me take a look at you..."
+
+ case 0x469:
EnGinkoMan_SetupStamp(this); // stamp player
break;
- case 0x46A: // "Ah, yes...[Link]. If I remember, you're the little guy who deposited [rupees]."
- case 0x46C: // "Ah, yes...[Link], right? If I remember, you're the little guy who deposited [rupees]."
- case 0x47E: // "Your deposits total [rupees]."
+
+ case 0x46A:
+ case 0x46C:
+ case 0x47E:
if (this->choiceDepositWithdrawl == GINKOMAN_CHOICE_DEPOSIT) {
- if ((u32)(gSaveContext.save.bankRupees & 0xFFFF) >= 5000) {
+ if (HS_GET_BANK_RUPEES() >= 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) {
+ this->curTextId = 0x45F;
+ } 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!
+ this->curTextId = 0x458;
} else {
Message_StartTextbox(play, 0x479, &this->actor);
- this->curTextId = 0x479; // "Well, are you gonna make a deposit?"
+ this->curTextId = 0x479;
}
} else if ((CURRENT_DAY == 3) && (gSaveContext.save.isNight == true)) {
Message_StartTextbox(play, 0x46D, &this->actor);
- // "Look, little guy, if it's 'cause of the bad rumors going around, forget it! They're just rumors!"
+
this->curTextId = 0x46D;
} else { // GINKOMAN_CHOICE_WITHDRAWL
Message_StartTextbox(play, 0x46B, &this->actor);
- this->curTextId = 0x46B; // "So..."
+ this->curTextId = 0x46B;
}
this->choiceDepositWithdrawl = GINKOMAN_CHOICE_RESET;
break;
- case 0x46B: // So...
+
+ case 0x46B:
Message_StartTextbox(play, 0x46E, &this->actor);
- this->curTextId = 0x46E; // "How much do you want? [rupee prompt]
+ this->curTextId = 0x46E;
break;
- case 0x46D: // "Look, little guy, if it's 'cause of the bad rumors going around, forget it! They're just
- // rumors!"
+
+ case 0x46D:
Message_StartTextbox(play, 0x46B, &this->actor);
- this->curTextId = 0x46B; // So...
+ this->curTextId = 0x46B;
break;
- case 0x470: // "Is that so? Come back and deposit some after saving up a bunch!"
+
+ case 0x470:
if (Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->isStampChecked = false;
EnGinkoMan_SetupIdle(this); // change to waiting for approach
}
break;
- case 0x476: // "...You haven't deposited that many Rupees, so that much isn't available for withdrawal. Do the
- // math!
+
+ case 0x476:
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_SITTING);
- case 0x475: // "What's this? Look, little guy, you can't hold this many rupees! You got that?"
- case 0x47C: // "Is that so? Think it over, little guy! So what are you gonna do?"
- case 0x47D: // duplicate of 48
+ // fallthrough
+ case 0x475:
+ case 0x47C:
+ case 0x47D:
Message_StartTextbox(play, 0x468, &this->actor);
- this->curTextId = 0x468; // " Deposit Rupees Withdraw Rupees Nothing really"
+ this->curTextId = 0x468;
break;
- case 0x472: // "What's this? It's a waste to take out such a tiny bit! ...But if you say so!"
- 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) {
+
+ case 0x472:
+ case 0x473:
+ case 0x474:
+ if (HS_GET_BANK_RUPEES() == 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 = HS_GET_BANK_RUPEES();
Message_StartTextbox(play, 0x45A, &this->actor);
- this->curTextId = 0x45A; // "All right, little guy, now I've got a total of [rupees] from you!"
+ this->curTextId = 0x45A;
}
break;
- case 0x477: // "...You know, at this time of day there's a 4 Rupee service charge on withdrawals!"
+
+ case 0x477:
Message_StartTextbox(play, 0x471, &this->actor);
- this->curTextId = 0x471; // "Are you really withdrawing [rupees selected]? Y/n"
+ this->curTextId = 0x471;
this->serviceFee = play->msgCtx.unk1206C;
break;
- case 0x479: // Well, are you gonna make a deposit?
+
+ case 0x479:
Message_StartTextbox(play, 0x44F, &this->actor);
- this->curTextId = 0x44F; // "All right! So..."
+ this->curTextId = 0x44F;
+ break;
+
+ default:
break;
}
}
-// actionfunc: wait for player dialogue input
void EnGinkoMan_WaitForDialogueInput(EnGinkoMan* this, PlayState* play) {
if (!Message_ShouldAdvance(play)) {
return;
}
switch (this->curTextId) {
- case 0x44E: // "...So, what'll it be?
+ case 0x44E:
if (play->msgCtx.choiceIndex == GINKOMAN_CHOICE_YES) {
- if ((gSaveContext.save.bankRupees & 0xFFFF) >= 5000) {
- play_sound(NA_SE_SY_ERROR);
+ if (HS_GET_BANK_RUPEES() >= 5000) {
+ Audio_PlaySfx(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) {
- func_8019F208();
+ if (gSaveContext.save.saveInfo.playerData.rupees > 0) {
+ Audio_PlaySfx_MessageDecide();
Message_StartTextbox(play, 0x44F, &this->actor);
- this->curTextId = 0x44F; // "All right! so..."
+ this->curTextId = 0x44F;
} else {
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
Message_StartTextbox(play, 0x458, &this->actor);
this->curTextId = 0x458; // you haven't even gotten a single rup
}
}
} else { // GINKOMAN_CHOICE_NO
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
Message_StartTextbox(play, 0x451, &this->actor);
- this->curTextId = 0x451; // dont say that, come on, trust me!
+ this->curTextId = 0x451;
}
break;
- case 0x452: // Really? are you really depositing rupees?
+
+ case 0x452:
if (play->msgCtx.choiceIndex == GINKOMAN_CHOICE_YES) {
- if (gSaveContext.save.playerData.rupees < play->msgCtx.bankRupeesSelected) {
- play_sound(NA_SE_SY_ERROR);
+ if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.bankRupeesSelected) {
+ Audio_PlaySfx(NA_SE_SY_ERROR);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_SITTING);
Message_StartTextbox(play, 0x459, &this->actor);
- this->curTextId = 0x459; // HEY you dont have that much
+ this->curTextId = 0x459;
} else {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
if (play->msgCtx.bankRupeesSelected >= 100) {
Message_StartTextbox(play, 0x455, &this->actor);
- this->curTextId = 0x455; // You're really going to be give me that much? Rich little guy!
+ this->curTextId = 0x455;
} else if (play->msgCtx.bankRupeesSelected >= 10) {
Message_StartTextbox(play, 0x454, &this->actor);
- this->curTextId = 0x454; // Seriously? that's a lot. A lot!
+ this->curTextId = 0x454;
} else {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_SITTING);
Message_StartTextbox(play, 0x453, &this->actor);
- this->curTextId = 0x453; // That's it? That aint nothing at all
+ this->curTextId = 0x453;
}
- if ((gSaveContext.save.bankRupees & 0xFFFF) == 0) {
+ if (HS_GET_BANK_RUPEES() == 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 = HS_GET_BANK_RUPEES();
+ HS_SET_BANK_RUPEES(HS_GET_BANK_RUPEES() + play->msgCtx.bankRupeesSelected);
}
} else { // GINKOMAN_CHOICE_NO
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_SITTING);
- if ((gSaveContext.save.bankRupees & 0xFFFF) == 0) {
+ if (HS_GET_BANK_RUPEES() == 0) {
Message_StartTextbox(play, 0x456, &this->actor);
- this->curTextId = 0x456; // Is that so? think about it
+ this->curTextId = 0x456;
} else {
Message_StartTextbox(play, 0x47D, &this->actor);
- this->curTextId = 0x47D; // is that so? think it over
+ this->curTextId = 0x47D;
}
}
break;
- case 0x468: // Deposit OR withdrawl OR cancel screen
+
+ case 0x468:
if (play->msgCtx.choiceIndex == GINKOMAN_CHOICE_CANCEL) {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
Message_StartTextbox(play, 0x470, &this->actor);
- this->curTextId = 0x470; // "Is that so? Come back and deposit some after saving up a bunch!"
+ this->curTextId = 0x470;
} else {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
this->choiceDepositWithdrawl = play->msgCtx.choiceIndex;
if (!this->isStampChecked) {
this->isStampChecked = true;
Message_StartTextbox(play, 0x469, &this->actor);
- this->curTextId = 0x469; // "Excuse me, but let me take a look at you..."
+ this->curTextId = 0x469;
} else {
Message_StartTextbox(play, 0x47E, &this->actor);
- this->curTextId = 0x47E; // "Your deposits total [rupees]."
+ this->curTextId = 0x47E;
}
}
break;
- case 0x471: // Are you really withdrawling [selected rupees]?
+
+ case 0x471:
if (play->msgCtx.choiceIndex == GINKOMAN_CHOICE_YES) {
- if ((s32)((gSaveContext.save.bankRupees & 0xFFFF)) <
- ((s32)(play->msgCtx.bankRupeesSelected + this->serviceFee))) {
- play_sound(NA_SE_SY_ERROR);
+ if ((s32)HS_GET_BANK_RUPEES() < (play->msgCtx.bankRupeesSelected + this->serviceFee)) {
+ Audio_PlaySfx(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
+ this->curTextId = 0x476;
} 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);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
Message_StartTextbox(play, 0x475, &this->actor);
- this->curTextId = 0x475; // You can't hold that many in your wallet
+ this->curTextId = 0x475;
} else {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
if (play->msgCtx.bankRupeesSelected >= 100) {
Message_StartTextbox(play, 0x474, &this->actor);
- this->curTextId = 0x474; // Aw, you're taking out all that?
+ this->curTextId = 0x474;
} else if (play->msgCtx.bankRupeesSelected >= 10) {
Message_StartTextbox(play, 0x473, &this->actor);
- this->curTextId = 0x473; // use it wisely
+ this->curTextId = 0x473;
} else {
Message_StartTextbox(play, 0x472, &this->actor);
- this->curTextId = 0x472; // It's a waste to take out such a tiny bit
+ this->curTextId = 0x472;
}
- this->previousBankValue = (s16)(gSaveContext.save.bankRupees & 0xFFFF);
- gSaveContext.save.bankRupees =
- (((gSaveContext.save.bankRupees & 0xFFFF) - play->msgCtx.bankRupeesSelected) -
- this->serviceFee) |
- (gSaveContext.save.bankRupees & 0xFFFF0000);
+ this->previousBankValue = HS_GET_BANK_RUPEES();
+ HS_SET_BANK_RUPEES(HS_GET_BANK_RUPEES() - play->msgCtx.bankRupeesSelected - this->serviceFee);
Rupees_ChangeBy(play->msgCtx.bankRupeesSelected);
}
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
Message_StartTextbox(play, 0x47C, &this->actor);
- this->curTextId = 0x47C; // "Is that so? Think it over, little guy! So what are you gonna do?"
+ this->curTextId = 0x47C;
}
break;
+
+ default:
+ break;
}
}
void EnGinkoMan_WaitForRupeeCount(EnGinkoMan* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
switch (this->curTextId) {
- case 0x450: // "How much? How much?" [rupee prompt] Set the amount with [Control Stick] and
+ case 0x450:
if (play->msgCtx.bankRupeesSelected == 0) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_SITTING);
Message_StartTextbox(play, 0x457, &this->actor);
- this->curTextId = 0x457; // Zero Rupees? Cruel joke!
+ this->curTextId = 0x457;
} else {
Message_StartTextbox(play, 0x452, &this->actor);
- this->curTextId = 0x452; // Really? are you really depositing [x]? Y/n
+ this->curTextId = 0x452;
}
break;
- case 0x46E: // "How much do you want?" [rupee prompt] Set the amount with [Control Stick]
+
+ case 0x46E:
if (play->msgCtx.bankRupeesSelected == 0) {
Message_StartTextbox(play, 0x46F, &this->actor);
- this->curTextId = 0x46F; // "Zero Rupees?!? That's a cruel joke!"
+ this->curTextId = 0x46F;
} else if (gSaveContext.save.isNight == true) {
Message_StartTextbox(play, 0x477, &this->actor);
- this->curTextId = 0x477; // "...You know, at this time of day there's a 4 Rupee service charge...
+ this->curTextId = 0x477;
} else {
Message_StartTextbox(play, 0x471, &this->actor);
- this->curTextId = 0x471; // "Are you really withdrawing [rupees selected]? Y/n
+ this->curTextId = 0x471;
this->serviceFee = 0;
}
break;
+
+ default:
+ break;
}
}
}
@@ -510,7 +530,7 @@ void EnGinkoMan_Dialogue(EnGinkoMan* this, PlayState* play) {
if ((this->skelAnime.animation == &object_boj_Anim_0008C0) &&
Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BANK_MAN_HAND_HIT);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BANK_MAN_HAND_HIT);
}
}
@@ -523,18 +543,18 @@ void EnGinkoMan_BankAward(EnGinkoMan* this, PlayState* play) {
// Parent is the player when starting to receive the award
this->actor.parent = NULL;
EnGinkoMan_SetupBankAward2(this);
- } else if (this->curTextId == 0x45B) { // "Whats this, you already saved up 200?"
+ } else if (this->curTextId == 0x45B) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_10_08)) {
- Actor_PickUp(&this->actor, play, GI_WALLET_ADULT + CUR_UPG_VALUE(UPG_WALLET), 500.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_WALLET_ADULT + CUR_UPG_VALUE(UPG_WALLET), 500.0f, 100.0f);
} else {
- Actor_PickUp(&this->actor, play, GI_RUPEE_BLUE, 500.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_RUPEE_BLUE, 500.0f, 100.0f);
}
- } else if (this->curTextId == 0x45C) { // "Whats this, you already saved up 5000?"
- Actor_PickUp(&this->actor, play, GI_RUPEE_BLUE, 500.0f, 100.0f);
+ } else if (this->curTextId == 0x45C) {
+ Actor_OfferGetItem(&this->actor, play, GI_RUPEE_BLUE, 500.0f, 100.0f);
} else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_59_08)) {
- Actor_PickUp(&this->actor, play, GI_HEART_PIECE, 500.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_HEART_PIECE, 500.0f, 100.0f);
} else {
- Actor_PickUp(&this->actor, play, GI_RUPEE_BLUE, 500.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_RUPEE_BLUE, 500.0f, 100.0f);
}
}
@@ -547,8 +567,6 @@ void EnGinkoMan_SetupBankAward2(EnGinkoMan* this) {
void EnGinkoMan_BankAward2(EnGinkoMan* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_10_08) && (this->curTextId == 0x45B)) {
- // "What's this? You've already saved up 200 Rupees!?! Well, little guy, here's your special gift. Take
- // it!"
SET_WEEKEVENTREG(WEEKEVENTREG_10_08);
Message_StartTextbox(play, 0x47A, &this->actor);
this->curTextId = 0x47A; // Message after receiving reward for depositing 200 rupees.
@@ -567,7 +585,7 @@ void EnGinkoMan_BankAward2(EnGinkoMan* this, PlayState* play) {
EnGinkoMan_SetupIdle(this);
}
} else {
- func_800B85E0(&this->actor, play, 500.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 500.0f, PLAYER_IA_MINUS1);
}
}
@@ -577,29 +595,32 @@ void EnGinkoMan_SetupStamp(EnGinkoMan* this) {
}
void EnGinkoMan_Stamp(EnGinkoMan* this, PlayState* play) {
- if ((this->curTextId == 0x464) // "Hey, relax! It doesn't leave any marks, and it's not gonna hurt."
- && (Animation_OnFrame(&this->skelAnime, 10.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_HANKO); // "stamp"
+ if ((this->curTextId == 0x464) && Animation_OnFrame(&this->skelAnime, 10.0f)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_HANKO); // "stamp"
}
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
switch (this->curTextId) {
- case 0x464: // "Hey, relax! It doesn't leave any marks, and it's not gonna hurt."
+ case 0x464:
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_SITTING);
Message_StartTextbox(play, 0x465, &this->actor);
- this->curTextId = 0x465; // "There! Now I'll know you when I see you!"
+ this->curTextId = 0x465;
break;
- case 0x469: // "Excuse me, but let me take a look at you..."
+
+ case 0x469:
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_SITTING);
- play->msgCtx.bankRupees = (gSaveContext.save.bankRupees & 0xFFFF);
+ play->msgCtx.bankRupees = HS_GET_BANK_RUPEES();
if ((CURRENT_DAY == 3) && (gSaveContext.save.isNight == true)) {
Message_StartTextbox(play, 0x46C, &this->actor);
- this->curTextId = 0x46C; // "Ah, yes...[Link], right?
+ this->curTextId = 0x46C;
} else {
Message_StartTextbox(play, 0x46A, &this->actor);
- this->curTextId = 0x46A; // "Ah, yes...[Link].
+ this->curTextId = 0x46A;
}
break;
+
+ default:
+ break;
}
EnGinkoMan_SetupDialogue(this);
@@ -643,16 +664,16 @@ void EnGinkoMan_Update(Actor* thisx, PlayState* play) {
s32 EnGinkoMan_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnGinkoMan* this = THIS;
- if (limbIndex == 15) {
+ if (limbIndex == OBJECT_BOJ_LIMB_0F) {
*dList = object_boj_DL_00B1D8;
}
- if (limbIndex == 15) {
+ if (limbIndex == OBJECT_BOJ_LIMB_0F) {
Matrix_Translate(1500.0f, 0.0f, 0.0f, MTXMODE_APPLY);
Matrix_RotateXS(this->limb15Rot.y, MTXMODE_APPLY);
Matrix_RotateZS(this->limb15Rot.x, MTXMODE_APPLY);
Matrix_Translate(-1500.0f, 0.0f, 0.0f, MTXMODE_APPLY);
- } else if (limbIndex == 8) {
+ } else if (limbIndex == OBJECT_BOJ_LIMB_08) {
Matrix_RotateXS(-this->limb8Rot.y, MTXMODE_APPLY);
Matrix_RotateZS(-this->limb8Rot.x, MTXMODE_APPLY);
}
@@ -668,7 +689,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_Ginko_Man/z_en_ginko_man.h b/src/overlays/actors/ovl_En_Ginko_Man/z_en_ginko_man.h
index b8a19d0f3..48ef4bdb1 100644
--- a/src/overlays/actors/ovl_En_Ginko_Man/z_en_ginko_man.h
+++ b/src/overlays/actors/ovl_En_Ginko_Man/z_en_ginko_man.h
@@ -2,6 +2,7 @@
#define Z_EN_GINKO_MAN_H
#include "global.h"
+#include "objects/object_boj/object_boj.h"
struct EnGinkoMan;
@@ -11,8 +12,8 @@ typedef struct EnGinkoMan {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ EnGinkoManActionFunc actionFunc;
- /* 0x18C */ Vec3s jointTable[0x10];
- /* 0x1EC */ Vec3s morphTable[0x10];
+ /* 0x18C */ Vec3s jointTable[OBJECT_BOJ_LIMB_MAX];
+ /* 0x1EC */ Vec3s morphTable[OBJECT_BOJ_LIMB_MAX];
/* 0x24C */ Vec3s limb15Rot;
/* 0x252 */ Vec3s limb8Rot;
/* 0x258 */ s16 curTextId;
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 65df46284..299ab5c4b 100644
--- a/src/overlays/actors/ovl_En_GirlA/z_en_girla.c
+++ b/src/overlays/actors/ovl_En_GirlA/z_en_girla.c
@@ -6,7 +6,7 @@
#include "z_en_girla.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnGirlA*)thisx)
@@ -78,12 +78,12 @@ static ShopItemEntry sShopItemEntries[] = {
EnGirlA_BuyBottleItem, EnGirlA_BuyFanfare },
{ OBJECT_GI_SHIELD_2, GID_SHIELD_HERO, func_800B8050, 1, 0x06AE, 0x06AF, GI_SHIELD_HERO, EnGirlA_CanBuyShieldHero,
EnGirlA_BuyShieldHero, EnGirlA_BuyFanfare },
- { OBJECT_GI_STICK, GID_STICK, NULL, 1, 0x06B4, 0x06B5, GI_STICKS_1, EnGirlA_CanBuyStick, EnGirlA_BuyStick,
+ { OBJECT_GI_STICK, GID_DEKU_STICK, NULL, 1, 0x06B4, 0x06B5, GI_DEKU_STICKS_1, EnGirlA_CanBuyStick, EnGirlA_BuyStick,
EnGirlA_BuyFanfare },
{ OBJECT_GI_ARROW, GID_ARROWS_MEDIUM, func_800B8050, 30, 0x06B8, 0x06B9, GI_ARROWS_30, EnGirlA_CanBuyArrows,
EnGirlA_BuyArrows, EnGirlA_BuyFanfare },
- { OBJECT_GI_NUTS, GID_NUTS, func_800B8118, 10, 0x06B0, 0x06B1, GI_NUTS_10, EnGirlA_CanBuyNuts, EnGirlA_BuyNuts,
- EnGirlA_BuyFanfare },
+ { OBJECT_GI_NUTS, GID_DEKU_NUTS, func_800B8118, 10, 0x06B0, 0x06B1, GI_DEKU_NUTS_10, EnGirlA_CanBuyNuts,
+ EnGirlA_BuyNuts, EnGirlA_BuyFanfare },
{ OBJECT_GI_LIQUID, GID_POTION_RED, func_800B8050, 1, 0x06AC, 0x06AD, GI_POTION_RED, EnGirlA_CanBuyPotionRed,
EnGirlA_BuyBottleItem, EnGirlA_BuyFanfare },
{ OBJECT_GI_BOTTLE_04, GID_FAIRY, func_800B8050, 1, 0x06D3, 0x06D4, GI_FAIRY, EnGirlA_CanBuyFairy,
@@ -94,9 +94,9 @@ static ShopItemEntry sShopItemEntries[] = {
EnGirlA_BuyArrows, EnGirlA_BuyFanfare },
{ OBJECT_GI_LIQUID, GID_POTION_GREEN, func_800B8050, 1, 0x06CF, 0x06D0, GI_POTION_GREEN, EnGirlA_CanBuyPotionGreen,
EnGirlA_BuyBottleItem, EnGirlA_BuyFanfare },
- { OBJECT_GI_NUTS, GID_NUTS, func_800B8118, 10, 0x06CD, 0x06CE, GI_NUTS_10, EnGirlA_CanBuyNuts, EnGirlA_BuyNuts,
- EnGirlA_BuyFanfare },
- { OBJECT_GI_STICK, GID_STICK, NULL, 1, 0x06D1, 0x06D2, GI_STICKS_1, EnGirlA_CanBuyStick, EnGirlA_BuyStick,
+ { OBJECT_GI_NUTS, GID_DEKU_NUTS, func_800B8118, 10, 0x06CD, 0x06CE, GI_DEKU_NUTS_10, EnGirlA_CanBuyNuts,
+ EnGirlA_BuyNuts, EnGirlA_BuyFanfare },
+ { OBJECT_GI_STICK, GID_DEKU_STICK, NULL, 1, 0x06D1, 0x06D2, GI_DEKU_STICKS_1, EnGirlA_CanBuyStick, EnGirlA_BuyStick,
EnGirlA_BuyFanfare },
{ OBJECT_GI_SHIELD_2, GID_SHIELD_HERO, func_800B8050, 1, 0x06CB, 0x06CC, GI_SHIELD_HERO, EnGirlA_CanBuyShieldHero,
EnGirlA_BuyShieldHero, EnGirlA_BuyFanfare },
@@ -159,13 +159,13 @@ void EnGirlA_SetupAction(EnGirlA* this, EnGirlAActionFunc action) {
void EnGirlA_InitObjIndex(EnGirlA* this, PlayState* play) {
s16 params = this->actor.params;
- //! @bug: Condition is impossible, && should be an ||
if ((params >= SI_MAX) && (params < SI_POTION_RED_1)) {
+ //! @bug: Impossible to reach, && should be an ||
Actor_Kill(&this->actor);
return;
}
- this->objIndex = Object_GetIndex(&play->objectCtx, sShopItemEntries[params].objectId);
+ this->objIndex = Object_GetSlot(&play->objectCtx, sShopItemEntries[params].objectId);
if (this->objIndex < 0) {
Actor_Kill(&this->actor);
return;
@@ -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,23 +198,23 @@ 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;
}
s32 EnGirlA_CanBuyPotionBlue(PlayState* play, EnGirlA* this) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_53_08)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_GAVE_KOTAKE_MUSHROOM)) {
return CANBUY_RESULT_CANNOT_GET_NOW;
}
if (!Inventory_HasEmptyBottle()) {
return CANBUY_RESULT_NEED_EMPTY_BOTTLE;
}
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_53_10)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_FREE_BLUE_POTION)) {
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,20 +227,20 @@ 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_DEKU_NUTS) != 0) && (CUR_CAPACITY(UPG_DEKU_NUTS) <= AMMO(ITEM_DEKU_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) {
+ if (Item_CheckObtainability(ITEM_DEKU_NUT) == ITEM_NONE) {
return CANBUY_RESULT_SUCCESS_1;
}
return CANBUY_RESULT_SUCCESS_2;
@@ -250,27 +250,27 @@ 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_DEKU_STICKS) != 0) && (AMMO(ITEM_DEKU_STICK) >= CUR_CAPACITY(UPG_DEKU_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) {
+ if (Item_CheckObtainability(ITEM_DEKU_STICK) == ITEM_NONE) {
return CANBUY_RESULT_SUCCESS_1;
}
return CANBUY_RESULT_SUCCESS_2;
}
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);
}
@@ -409,10 +415,14 @@ void EnGirlA_BuyArrows(PlayState* play, EnGirlA* this) {
void EnGirlA_BuyNuts(PlayState* play, EnGirlA* this) {
switch (this->itemParams) {
case 5:
- Item_Give(play, ITEM_NUTS_5);
+ Item_Give(play, ITEM_DEKU_NUTS_5);
break;
+
case 10:
- Item_Give(play, ITEM_NUTS_10);
+ Item_Give(play, ITEM_DEKU_NUTS_10);
+ break;
+
+ default:
break;
}
Rupees_ChangeBy(-play->msgCtx.unk1206C);
@@ -424,7 +434,7 @@ void EnGirlA_BuyShieldHero(PlayState* play, EnGirlA* this) {
}
void EnGirlA_BuyStick(PlayState* play, EnGirlA* this) {
- Item_Give(play, ITEM_STICK);
+ Item_Give(play, ITEM_DEKU_STICK);
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);
}
@@ -558,7 +585,7 @@ void EnGirlA_InitalUpdate(EnGirlA* this, PlayState* play) {
this->itemParams = shopItem->params;
this->drawFunc = shopItem->drawFunc;
this->getItemDrawId = shopItem->getItemDrawId;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
Actor_SetScale(&this->actor, 0.25f);
this->actor.shape.yOffset = 24.0f;
this->actor.shape.shadowScale = 4.0f;
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 9704d6204..c631b24e3 100644
--- a/src/overlays/actors/ovl_En_Gk/z_en_gk.c
+++ b/src/overlays/actors/ovl_En_Gk/z_en_gk.c
@@ -5,9 +5,8 @@
*/
#include "z_en_gk.h"
-#include "objects/object_gk/object_gk.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnGk*)thisx)
@@ -102,14 +101,38 @@ static DamageTable sDamageTable = {
/* Powder Keg */ DMG_ENTRY(0, 0x0),
};
-static AnimationInfo sAnimationInfo[] = {
- { &object_gk_Anim_00787C, 1.0f, 0.0f, 0.0f, 0, 0.0f }, { &object_gk_Anim_007DC4, 1.0f, 0.0f, 0.0f, 2, 0.0f },
- { &object_gk_Anim_0092C0, 1.0f, 0.0f, 0.0f, 0, 0.0f }, { &object_gk_Anim_005EDC, 1.0f, 0.0f, 0.0f, 0, 0.0f },
- { &object_gk_Anim_009638, 1.0f, 0.0f, 0.0f, 0, 0.0f }, { &object_gk_Anim_008774, 1.0f, 0.0f, 0.0f, 0, 0.0f },
- { &object_gk_Anim_00AE34, 1.0f, 0.0f, 0.0f, 0, 0.0f }, { &object_gk_Anim_00BD90, 1.0f, 0.0f, 0.0f, 2, 0.0f },
- { &object_gk_Anim_00C308, 1.0f, 0.0f, 0.0f, 0, 0.0f }, { &object_gk_Anim_009858, 1.0f, 0.0f, 0.0f, 2, 0.0f },
- { &object_gk_Anim_009D88, 1.0f, 0.0f, 0.0f, 0, 0.0f }, { &object_gk_Anim_00A21C, 1.0f, 0.0f, 0.0f, 2, 0.0f },
- { &object_gk_Anim_00AAEC, 1.0f, 0.0f, 0.0f, 0, 0.0f },
+typedef enum {
+ /* -1 */ ENGK_ANIM_NONE = -1,
+ /* 0x0 */ ENGK_ANIM_0,
+ /* 0x1 */ ENGK_ANIM_1,
+ /* 0x2 */ ENGK_ANIM_2,
+ /* 0x3 */ ENGK_ANIM_3,
+ /* 0x4 */ ENGK_ANIM_4,
+ /* 0x5 */ ENGK_ANIM_5,
+ /* 0x6 */ ENGK_ANIM_6,
+ /* 0x7 */ ENGK_ANIM_7,
+ /* 0x8 */ ENGK_ANIM_8,
+ /* 0x9 */ ENGK_ANIM_9,
+ /* 0xA */ ENGK_ANIM_10,
+ /* 0xB */ ENGK_ANIM_11,
+ /* 0xC */ ENGK_ANIM_12,
+ /* 0xD */ ENGK_ANIM_MAX
+} EnGkAnimation;
+
+static AnimationInfo sAnimationInfo[ENGK_ANIM_MAX] = {
+ { &object_gk_Anim_00787C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGK_ANIM_0
+ { &object_gk_Anim_007DC4, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // ENGK_ANIM_1
+ { &object_gk_Anim_0092C0, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGK_ANIM_2
+ { &object_gk_Anim_005EDC, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGK_ANIM_3
+ { &object_gk_Anim_009638, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGK_ANIM_4
+ { &object_gk_Anim_008774, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGK_ANIM_5
+ { &object_gk_Anim_00AE34, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGK_ANIM_6
+ { &object_gk_Anim_00BD90, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // ENGK_ANIM_7
+ { &object_gk_Anim_00C308, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGK_ANIM_8
+ { &object_gk_Anim_009858, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // ENGK_ANIM_9
+ { &object_gk_Anim_009D88, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGK_ANIM_10
+ { &object_gk_Anim_00A21C, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // ENGK_ANIM_11
+ { &object_gk_Anim_00AAEC, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // ENGK_ANIM_12
};
Color_RGBA8 D_80B533A0 = { 255, 255, 255, 255 };
@@ -124,18 +147,24 @@ u16 func_80B50410(EnGk* this, PlayState* play) {
switch (this->unk_31C) {
case 0xE7A:
return 0xE7B;
+
case 0xE7B:
return 0xE7C;
+
case 0xE7C:
return 0xE7D;
+
case 0xE7D:
return 0xE7E;
+
case 0xE7E:
return 0xE7F;
+
case 0xE7F:
SET_WEEKEVENTREG(WEEKEVENTREG_40_80);
this->unk_1E4 |= 1;
return 0xE80;
+
default:
return 0xE7A;
}
@@ -147,16 +176,21 @@ u16 func_80B50410(EnGk* this, PlayState* play) {
switch (this->unk_31C) {
case 0xE82:
return 0xE83;
+
case 0xE83:
return 0xE7D;
+
case 0xE7D:
return 0xE7E;
+
case 0xE7E:
return 0xE7F;
+
case 0xE7F:
SET_WEEKEVENTREG(WEEKEVENTREG_41_01);
this->unk_1E4 |= 1;
return 0xE80;
+
default:
return 0xE82;
}
@@ -197,10 +231,12 @@ u16 func_80B50410(EnGk* this, PlayState* play) {
switch (this->unk_31C) {
case 0xE85:
return 0xE86;
+
case 0xE86:
SET_WEEKEVENTREG(WEEKEVENTREG_41_02);
this->unk_1E4 |= 1;
return 0xE87;
+
default:
return 0xE85;
}
@@ -208,9 +244,9 @@ u16 func_80B50410(EnGk* this, PlayState* play) {
this->unk_1E4 |= 1;
return 0xE87;
}
- } else {
- return 0;
}
+
+ return 0;
}
u16 func_80B50710(EnGk* this) {
@@ -229,8 +265,10 @@ u16 func_80B50710(EnGk* this) {
this->unk_1E4 |= 0x10;
this->unk_1E4 |= 1;
return 0xE8C;
+
+ default:
+ return 0;
}
- return 0;
}
void func_80B507A0(EnGk* this, PlayState* play) {
@@ -240,7 +278,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) {
@@ -249,17 +288,17 @@ s32 func_80B50854(EnGk* this, PlayState* play) {
if (!(this->unk_1E4 & 0x40)) {
if (player->stateFlags2 & PLAYER_STATE2_8000000) {
this->unk_1E4 |= 0x40;
- play_sound(NA_SE_SY_TRE_BOX_APPEAR);
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
}
} else if (!(player->stateFlags2 & PLAYER_STATE2_8000000)) {
this->unk_1E4 &= ~0x40;
}
- if ((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == 3) &&
+ if ((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) &&
(play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY)) {
- Flags_SetSwitch(play, ENGK_GET_3F00(&this->actor));
- this->unk_2E4 = 3;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
+ Flags_SetSwitch(play, ENGK_GET_SWITCH_FLAG(&this->actor));
+ this->animIndex = ENGK_ANIM_3;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGK_ANIM_3);
this->actionFunc = func_80B521E8;
return true;
}
@@ -268,7 +307,7 @@ s32 func_80B50854(EnGk* this, PlayState* play) {
void func_80B50954(EnGk* this) {
if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 4.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLONKID_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLONKID_WALK);
}
}
@@ -284,12 +323,13 @@ void func_80B509A8(EnGk* this, PlayState* play) {
this->unk_30C.y += Rand_ZeroOne();
this->unk_30C.z += 2.0f * Rand_Centered();
- if (this->unk_2E4 == 0) {
+ if (this->animIndex == ENGK_ANIM_0) {
sp4C.x = 0.0f;
sp4C.z = 0.0f;
sp4C.y = -1.2f;
phi_s1 = 25;
- } else if ((this->unk_2E4 == 2) || (this->unk_2E4 == 9) || (this->unk_2E4 == 10) || (this->unk_2E4 == 11)) {
+ } else if ((this->animIndex == ENGK_ANIM_2) || (this->animIndex == ENGK_ANIM_9) ||
+ (this->animIndex == ENGK_ANIM_10) || (this->animIndex == ENGK_ANIM_11)) {
sp4C.x = 0.0f;
sp4C.z = 0.0f;
sp4C.y = -0.5f;
@@ -306,28 +346,28 @@ void func_80B50B38(EnGk* this, PlayState* play) {
s16 i;
s16 temp;
- switch (this->unk_2E4) {
- case 0:
+ switch (this->animIndex) {
+ case ENGK_ANIM_0:
this->unk_2E0 = 3;
for (i = 0; i < 2; i++) {
func_80B509A8(this, play);
}
break;
- case 2:
+ case ENGK_ANIM_2:
this->unk_2E0 = 3;
func_80B509A8(this, play);
break;
- case 1:
- case 3:
- case 12:
+ case ENGK_ANIM_1:
+ case ENGK_ANIM_3:
+ case ENGK_ANIM_12:
this->unk_2E0 = 2;
break;
- case 9:
- case 10:
- case 11:
+ case ENGK_ANIM_9:
+ case ENGK_ANIM_10:
+ case ENGK_ANIM_11:
this->unk_2E0 = 3;
func_80B509A8(this, play);
break;
@@ -373,7 +413,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;
@@ -482,22 +522,22 @@ s32 func_80B5123C(EnGk* this, PlayState* play) {
}
void func_80B51308(EnGk* this, PlayState* play) {
- s16 sp1E = this->skelAnime.curFrame;
- s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_31A].animation);
+ s16 curFrame = this->skelAnime.curFrame;
+ s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->csAnimIndex].animation);
- if ((this->unk_2E4 == 7) && (sp1E == lastFrame)) {
- this->unk_2E4 = 8;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 8);
+ if ((this->animIndex == ENGK_ANIM_7) && (curFrame == endFrame)) {
+ this->animIndex = ENGK_ANIM_8;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGK_ANIM_8);
}
}
void func_80B51398(EnGk* this, PlayState* play) {
- s16 sp1E = this->skelAnime.curFrame;
- s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[9].animation);
+ s16 curFrame = this->skelAnime.curFrame;
+ s16 endFrame = Animation_GetLastFrame(sAnimationInfo[9].animation);
- if ((this->unk_2E4 == 9) && (sp1E == lastFrame)) {
- this->unk_2E4 = 10;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 10);
+ if ((this->animIndex == ENGK_ANIM_9) && (curFrame == endFrame)) {
+ this->animIndex = ENGK_ANIM_10;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGK_ANIM_10);
}
}
@@ -505,24 +545,24 @@ void func_80B51410(EnGk* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (this->actor.xzDistToPlayer < 100.0f) {
- if ((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == 3) &&
+ if ((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) &&
(play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY_INTRO)) {
this->unk_1E4 |= 0x20;
}
- if (ActorCutscene_GetCanPlayNext(this->unk_318)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLONKID_SOB_TALK);
- ActorCutscene_Start(this->unk_318, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLONKID_SOB_TALK);
+ 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,105 +571,109 @@ void func_80B51410(EnGk* this, PlayState* play) {
void func_80B51510(EnGk* this, PlayState* play) {
s32 pad;
- s32 actionIndex;
+ s32 cueChannel;
- if (this) {}
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_479)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_479);
- if (Cutscene_CheckActorAction(play, 479)) {
- actionIndex = Cutscene_GetActorActionIndex(play, 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;
+ this->csAnimIndex = ENGK_ANIM_0;
+ this->animIndex = ENGK_ANIM_0;
break;
case 2:
- this->unk_31A = 2;
- this->unk_2E4 = 2;
+ this->csAnimIndex = ENGK_ANIM_2;
+ this->animIndex = ENGK_ANIM_2;
break;
case 3:
- this->unk_31A = 7;
- this->unk_2E4 = 7;
+ this->csAnimIndex = ENGK_ANIM_7;
+ this->animIndex = ENGK_ANIM_7;
break;
case 4:
- this->unk_31A = 3;
- this->unk_2E4 = 3;
+ this->csAnimIndex = ENGK_ANIM_3;
+ this->animIndex = ENGK_ANIM_3;
break;
case 5:
- this->unk_31A = 1;
- this->unk_2E4 = 1;
+ this->csAnimIndex = ENGK_ANIM_1;
+ this->animIndex = ENGK_ANIM_1;
this->unk_1E4 |= 0x80;
this->actionFunc = func_80B5227C;
break;
case 6:
- this->unk_31A = 12;
- this->unk_2E4 = 12;
+ this->csAnimIndex = ENGK_ANIM_12;
+ this->animIndex = ENGK_ANIM_12;
break;
case 7:
- Flags_SetSwitch(play, ENGK_GET_3F00(&this->actor));
+ Flags_SetSwitch(play, ENGK_GET_SWITCH_FLAG(&this->actor));
+ break;
+
+ default:
break;
}
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->unk_31A);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->csAnimIndex);
}
- if (this->unk_31A == 7) {
+ if (this->csAnimIndex == ENGK_ANIM_7) {
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;
}
}
void func_80B51698(EnGk* this, PlayState* play) {
- s16 sp26 = this->skelAnime.curFrame;
- s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_2E4].animation);
+ s16 curFrame = this->skelAnime.curFrame;
+ s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
- if (sp26 == lastFrame) {
- switch (this->unk_2E4) {
- case 0:
- this->unk_2E4 = 2;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
+ if (curFrame == endFrame) {
+ switch (this->animIndex) {
+ case ENGK_ANIM_0:
+ this->animIndex = ENGK_ANIM_2;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGK_ANIM_2);
this->actionFunc = func_80B5216C;
break;
- case 2:
- this->unk_2E4 = 0;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0);
+ case ENGK_ANIM_2:
+ this->animIndex = ENGK_ANIM_0;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGK_ANIM_0);
this->actionFunc = func_80B5202C;
break;
+
+ default:
+ break;
}
}
}
void func_80B51760(EnGk* this, PlayState* play) {
- s16 sp2E = this->skelAnime.curFrame;
- s16 lastFrame;
+ s16 curFrame = this->skelAnime.curFrame;
+ s16 endFrame;
- if (this->unk_2E4 == 11) {
- lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_2E4].animation);
- if (sp2E == lastFrame) {
- this->unk_2E4 = 5;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->unk_2E4);
+ if (this->animIndex == ENGK_ANIM_11) {
+ endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
+ if (curFrame == endFrame) {
+ this->animIndex = ENGK_ANIM_5;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
}
- } else if (this->unk_2E4 == 10) {
- lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_2E4].animation);
- if (sp2E == lastFrame) {
- this->unk_2E4 = 11;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->unk_2E4);
+ } else if (this->animIndex == ENGK_ANIM_10) {
+ endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
+ if (curFrame == endFrame) {
+ this->animIndex = ENGK_ANIM_11;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
}
} else {
- if (Flags_GetSwitch(play, ENGK_GET_3F00(&this->actor))) {
+ if (Flags_GetSwitch(play, ENGK_GET_SWITCH_FLAG(&this->actor))) {
SET_WEEKEVENTREG(WEEKEVENTREG_40_40);
this->actionFunc = func_80B51D9C;
return;
@@ -641,12 +685,12 @@ void func_80B51760(EnGk* this, PlayState* play) {
Message_StartTextbox(play, this->unk_31C, &this->actor);
this->actionFunc = func_80B51970;
if (this->unk_31C == 0xE81) {
- this->unk_2E4 = 0;
+ this->animIndex = ENGK_ANIM_0;
this->unk_1E4 |= 2;
}
- } else if (((this->actor.xzDistToPlayer < 100.0f) || this->actor.isTargeted) &&
+ } else if (((this->actor.xzDistToPlayer < 100.0f) || this->actor.isLockedOn) &&
(gSaveContext.save.entrance != ENTRANCE(GORON_RACETRACK, 1))) {
- func_800B863C(&this->actor, play);
+ Actor_OfferTalkNearColChkInfoCylinder(&this->actor, play);
}
if (this->unk_1E4 & 4) {
@@ -661,9 +705,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;
}
@@ -671,7 +715,7 @@ void func_80B51970(EnGk* this, PlayState* play) {
if (this->unk_1E4 & 1) {
this->unk_1E4 &= ~1;
this->unk_1E4 &= ~4;
- if (this->unk_2E4 == 10) {
+ if (this->animIndex == ENGK_ANIM_10) {
this->unk_1E4 &= ~2;
}
this->actionFunc = func_80B51760;
@@ -688,11 +732,11 @@ void func_80B51970(EnGk* this, PlayState* play) {
}
if (this->unk_1E4 & 2) {
- func_801A4748(&this->actor.projectedPos, NA_SE_EN_GOLON_KID_CRY - SFX_FLAG);
- if (this->unk_2E4 != 10) {
- if (this->unk_2E4 != 9) {
- this->unk_2E4 = 9;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 9);
+ Audio_PlaySfx_AtFixedPos(&this->actor.projectedPos, NA_SE_EN_GOLON_KID_CRY - SFX_FLAG);
+ if (this->animIndex != ENGK_ANIM_10) {
+ if (this->animIndex != ENGK_ANIM_9) {
+ this->animIndex = ENGK_ANIM_9;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGK_ANIM_9);
} else {
func_80B51398(this, play);
}
@@ -701,7 +745,7 @@ void func_80B51970(EnGk* 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 (this->unk_2E4 == 6) {
+ if (this->animIndex == ENGK_ANIM_6) {
func_80B50954(this);
}
}
@@ -715,7 +759,7 @@ void func_80B51B40(EnGk* this, PlayState* play) {
this->unk_1E4 &= ~1;
this->unk_1E4 &= ~4;
- if (this->unk_2E4 == 10) {
+ if (this->animIndex == ENGK_ANIM_10) {
this->unk_1E4 &= ~2;
}
@@ -740,25 +784,28 @@ void func_80B51B40(EnGk* this, PlayState* play) {
} else if ((talkState == TEXT_STATE_CHOICE) && Message_ShouldAdvance(play)) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
this->unk_31C = 0xE8E;
Message_StartTextbox(play, this->unk_31C, &this->actor);
break;
case 1:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
this->unk_31C = 0xE8A;
Message_StartTextbox(play, this->unk_31C, &this->actor);
break;
+
+ default:
+ break;
}
}
if (this->unk_1E4 & 2) {
- func_801A4748(&this->actor.projectedPos, NA_SE_EN_GOLON_KID_CRY - SFX_FLAG);
- if (this->unk_2E4 != 10) {
- if (this->unk_2E4 != 9) {
- this->unk_2E4 = 9;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 9);
+ Audio_PlaySfx_AtFixedPos(&this->actor.projectedPos, NA_SE_EN_GOLON_KID_CRY - SFX_FLAG);
+ if (this->animIndex != ENGK_ANIM_10) {
+ if (this->animIndex != ENGK_ANIM_9) {
+ this->animIndex = ENGK_ANIM_9;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGK_ANIM_9);
} else {
func_80B51398(this, play);
}
@@ -772,12 +819,12 @@ 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;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 6);
+ this->animIndex = ENGK_ANIM_6;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGK_ANIM_6);
this->actionFunc = func_80B51EA4;
} else {
this->unk_1E4 |= 4;
@@ -790,10 +837,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,19 +856,19 @@ 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++;
}
}
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
sp38.y = this->actor.wallYaw;
}
if (ABS_ALT(sp36) < 0x2AAA) {
- Math_ApproachF(&this->actor.speedXZ, 3.0f, 0.2f, 0.5f);
+ Math_ApproachF(&this->actor.speed, 3.0f, 0.2f, 0.5f);
}
Actor_MoveWithGravity(&this->actor);
}
@@ -829,9 +876,9 @@ 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);
+ Audio_PlaySfx_AtFixedPos(&this->actor.projectedPos, NA_SE_EN_GOLON_KID_CRY - SFX_FLAG);
} else {
this->unk_1E4 |= 2;
}
@@ -841,7 +888,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);
}
@@ -849,8 +896,8 @@ void func_80B5202C(EnGk* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
SET_WEEKEVENTREG(WEEKEVENTREG_24_80);
this->actionFunc = func_80B51698;
- } else if ((this->actor.xzDistToPlayer < 100.0f) || this->actor.isTargeted) {
- func_800B863C(&this->actor, play);
+ } else if ((this->actor.xzDistToPlayer < 100.0f) || this->actor.isLockedOn) {
+ Actor_OfferTalkNearColChkInfoCylinder(&this->actor, play);
if (player->transformation == PLAYER_FORM_GORON) {
this->actor.textId = 0xE74;
} else {
@@ -859,8 +906,9 @@ 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)) {
- func_801A4748(&this->actor.projectedPos, NA_SE_EN_GOLON_KID_CRY - SFX_FLAG);
+ if ((play->msgCtx.ocarinaMode != OCARINA_MODE_ACTIVE) && (play->msgCtx.ocarinaMode != OCARINA_MODE_EVENT) &&
+ (play->csCtx.state == CS_STATE_IDLE)) {
+ Audio_PlaySfx_AtFixedPos(&this->actor.projectedPos, NA_SE_EN_GOLON_KID_CRY - SFX_FLAG);
}
} else {
this->unk_1E4 |= 2;
@@ -870,34 +918,34 @@ void func_80B5202C(EnGk* this, PlayState* play) {
void func_80B5216C(EnGk* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->actionFunc = func_80B51698;
}
}
void func_80B521E8(EnGk* this, PlayState* play) {
- s16 sp1E = this->skelAnime.curFrame;
- s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_2E4].animation);
+ s16 curFrame = this->skelAnime.curFrame;
+ s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
- if (sp1E == lastFrame) {
- this->unk_2E4 = 1;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ if (curFrame == endFrame) {
+ this->animIndex = ENGK_ANIM_1;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGK_ANIM_1);
this->actionFunc = func_80B5227C;
}
}
void func_80B5227C(EnGk* this, PlayState* play) {
- s16 sp26 = this->skelAnime.curFrame;
- s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_2E4].animation);
+ s16 curFrame = this->skelAnime.curFrame;
+ s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
- if ((sp26 + 1) == lastFrame) {
+ if (curFrame == (endFrame - 1)) {
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_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_SIT_IMT);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_SIT_IMT);
this->unk_350 = 0x4000;
this->actionFunc = func_80B52654;
}
@@ -917,7 +965,7 @@ void func_80B52340(EnGk* this, PlayState* play) {
this->actor.flags &= ~ACTOR_FLAG_10000;
} else {
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 5, 0x1000, 0x100);
this->actor.world.rot.y = this->actor.shape.rot.y;
@@ -945,6 +993,9 @@ void func_80B52430(EnGk* this, PlayState* play) {
this->unk_1E4 &= ~4;
this->actionFunc = func_80B51760;
return;
+
+ default:
+ break;
}
}
@@ -953,22 +1004,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_PickUp(&this->actor, play, sp24, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, getItemId, 300.0f, 300.0f);
}
}
@@ -978,14 +1029,14 @@ void func_80B525E0(EnGk* this, PlayState* play) {
Message_StartTextbox(play, this->unk_31C, &this->actor);
this->actionFunc = func_80B52430;
} else {
- func_800B85E0(&this->actor, play, 400.0f, -1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
}
}
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;
@@ -993,7 +1044,7 @@ void func_80B52654(EnGk* this, PlayState* play) {
this->actor.scale.z = 0.006f - this->unk_354;
this->actor.scale.x = 0.006f + this->unk_354;
if (this->unk_350 == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLONKID_SNORE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLONKID_SNORE);
}
}
@@ -1002,7 +1053,7 @@ void EnGk_Init(Actor* thisx, PlayState* play) {
EnGk* this = THIS;
SkelAnime_InitFlex(play, &this->skelAnime, &object_gk_Skel_0079C0, &object_gk_Anim_00787C, this->jointTable,
- this->morphTable, 20);
+ this->morphTable, OBJECT_GK_LIMB_MAX);
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
@@ -1016,18 +1067,18 @@ void EnGk_Init(Actor* thisx, PlayState* play) {
this->actor.gravity = -1.0f;
if (ENGK_GET_F(&this->actor) == ENGK_F_1) {
- this->unk_2E4 = 5;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 5);
+ this->animIndex = ENGK_ANIM_5;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGK_ANIM_5);
if (play->sceneId == SCENE_17SETUGEN2) {
- if (Flags_GetSwitch(play, ENGK_GET_3F00(&this->actor))) {
+ if (Flags_GetSwitch(play, ENGK_GET_SWITCH_FLAG(&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->actionFunc = func_80B51760;
+ return;
}
+ 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,20 +1093,20 @@ 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;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
} else {
Actor_Kill(&this->actor);
}
- } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
- this->unk_2E4 = 0;
- this->unk_318 = this->actor.cutscene;
+ } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
+ this->animIndex = ENGK_ANIM_0;
+ this->csId = this->actor.csId;
this->actor.flags |= ACTOR_FLAG_10;
this->actor.flags |= ACTOR_FLAG_2000000;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENGK_ANIM_0);
this->actionFunc = func_80B5202C;
} else {
this->actionFunc = func_80B52654;
@@ -1074,7 +1125,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);
@@ -1108,7 +1159,7 @@ void EnGk_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
sp28.x = 1100.0f;
sp28.z = -500.0f;
- if (this->unk_2E4 == 0) {
+ if (this->animIndex == ENGK_ANIM_0) {
sp34.y = -100.0f;
sp28.y = -100.0f;
@@ -1118,7 +1169,8 @@ void EnGk_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
sp4C = sp40;
sp4C.x *= -1.0f;
- } else if ((this->unk_2E4 == 2) || (this->unk_2E4 == 9) || (this->unk_2E4 == 10) || (this->unk_2E4 == 11)) {
+ } else if ((this->animIndex == ENGK_ANIM_2) || (this->animIndex == ENGK_ANIM_9) ||
+ (this->animIndex == ENGK_ANIM_10) || (this->animIndex == ENGK_ANIM_11)) {
sp34.y = 400.0f;
sp28.y = 400.0f;
@@ -1130,7 +1182,7 @@ void EnGk_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
sp4C.x *= -1.0f;
}
- if (limbIndex == 17) {
+ if (limbIndex == OBJECT_GK_LIMB_11) {
if (ENGK_GET_F(&this->actor) == ENGK_F_1) {
phi_f0 = 100.0f;
} else {
@@ -1161,7 +1213,7 @@ void EnGk_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
s32 phi_v1;
switch (limbIndex) {
- case 18:
+ case OBJECT_GK_LIMB_12:
if (this->unk_1E4 & 8) {
phi_v1 = true;
} else {
@@ -1188,7 +1240,7 @@ void EnGk_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
Matrix_Push();
break;
- case 9:
+ case OBJECT_GK_LIMB_09:
if (this->unk_1E4 & 8) {
phi_v1 = true;
} else {
@@ -1213,6 +1265,9 @@ void EnGk_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
Matrix_Push();
break;
+
+ default:
+ break;
}
}
@@ -1226,28 +1281,28 @@ TexturePtr D_80B533E4[] = {
void EnGk_Draw(Actor* thisx, PlayState* play) {
s32 pad;
EnGk* this = THIS;
- Vec3f sp5C;
- Vec3f sp50;
+ Vec3f pos;
+ Vec3f scale;
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);
- sp5C = this->actor.world.pos;
- sp50.x = 0.2f;
- sp50.y = 0.2f;
- sp50.z = 0.2f;
+ pos = this->actor.world.pos;
+ scale.x = 0.2f;
+ scale.y = 0.2f;
+ scale.z = 0.2f;
- func_800BC620(&sp5C, &sp50, 255, play);
+ func_800BC620(&pos, &scale, 255, play);
} else {
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80B533E4[this->unk_2E0]));
@@ -1256,23 +1311,25 @@ 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);
- if ((this->unk_2E4 == 0) || (this->unk_2E4 == 1) || (this->unk_2E4 == 2) || (this->unk_2E4 == 3) ||
- (this->unk_2E4 == 4)) {
- sp5C.x = this->actor.world.pos.x - 15.0f;
- sp5C.y = this->actor.world.pos.y;
- sp5C.z = this->actor.world.pos.z;
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ if ((this->animIndex == ENGK_ANIM_0) || (this->animIndex == ENGK_ANIM_1) ||
+ (this->animIndex == ENGK_ANIM_2) || (this->animIndex == ENGK_ANIM_3) ||
+ (this->animIndex == ENGK_ANIM_4)) {
+ pos.x = this->actor.world.pos.x - 15.0f;
+ pos.y = this->actor.world.pos.y;
+ pos.z = this->actor.world.pos.z;
- sp50.x = 0.2f;
- sp50.y = 0.2f;
- sp50.z = 0.2f;
+ scale.x = 0.2f;
+ scale.y = 0.2f;
+ scale.z = 0.2f;
} else {
- sp5C = this->actor.world.pos;
- sp50.x = 0.2f;
- sp50.y = 0.2f;
- sp50.z = 0.2f;
+ pos = this->actor.world.pos;
+ scale.x = 0.2f;
+ scale.y = 0.2f;
+ scale.z = 0.2f;
}
- func_800BC620(&sp5C, &sp50, 255, play);
+
+ func_800BC620(&pos, &scale, 255, play);
}
}
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..b9d237cd5 100644
--- a/src/overlays/actors/ovl_En_Gk/z_en_gk.h
+++ b/src/overlays/actors/ovl_En_Gk/z_en_gk.h
@@ -2,23 +2,26 @@
#define Z_EN_GK_H
#include "global.h"
+#include "objects/object_gk/object_gk.h"
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_3F00(thisx) (((thisx)->params & 0x3F00) >> 8)
+#define ENGK_GET_PATH_INDEX(thisx) (((thisx)->params & 0xF0) >> 4)
+#define ENGK_GET_SWITCH_FLAG(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;
@@ -30,18 +33,18 @@ typedef struct EnGk {
/* 0x1E4 */ u16 unk_1E4;
/* 0x1E8 */ Path* path;
/* 0x1EC */ s32 unk_1EC;
- /* 0x1F0 */ Vec3s jointTable[20];
- /* 0x1F0 */ Vec3s morphTable[20];
+ /* 0x1F0 */ Vec3s jointTable[OBJECT_GK_LIMB_MAX];
+ /* 0x1F0 */ Vec3s morphTable[OBJECT_GK_LIMB_MAX];
/* 0x2E0 */ s16 unk_2E0;
/* 0x2E2 */ s16 unk_2E2;
- /* 0x2E4 */ s16 unk_2E4;
+ /* 0x2E4 */ s16 animIndex;
/* 0x2E8 */ Vec3f unk_2E8;
/* 0x2F4 */ Vec3f unk_2F4;
/* 0x300 */ Vec3f unk_300;
/* 0x30C */ Vec3f unk_30C;
- /* 0x318 */ s16 unk_318;
- /* 0x31A */ u8 unk_31A;
- /* 0x31B */ u8 unk_31B;
+ /* 0x318 */ s16 csId;
+ /* 0x31A */ u8 csAnimIndex;
+ /* 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 01146c0cf..39b705649 100644
--- a/src/overlays/actors/ovl_En_Gm/z_en_gm.c
+++ b/src/overlays/actors/ovl_En_Gm/z_en_gm.c
@@ -6,9 +6,8 @@
#include "z_en_gm.h"
#include "overlays/actors/ovl_En_Door/z_en_door.h"
-#include "objects/object_in2/object_in2.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnGm*)thisx)
@@ -209,20 +208,38 @@ static ColliderSphereInit sSphereInit = {
static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE };
-static AnimationInfoS sAnimationInfo[] = {
- { &object_in2_Anim_009CDC, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_in2_Anim_009CDC, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_in2_Anim_00A5E0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_in2_Anim_00A70C, 1.0f, 0, 1, ANIMMODE_LOOP, 0 },
- { &object_in2_Anim_008090, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_in2_Anim_00898C, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &object_in2_Anim_009450, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &object_in2_Anim_00AD18, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_in2_Anim_00AD18, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_in2_Anim_00B8B0, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_in2_Anim_00BA80, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_in2_Anim_00C03C, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_in2_Anim_00B990, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
+typedef enum {
+ /* -1 */ ENGM_ANIM_NONE = -1,
+ /* 0x0 */ ENGM_ANIM_0,
+ /* 0x1 */ ENGM_ANIM_1,
+ /* 0x2 */ ENGM_ANIM_2,
+ /* 0x3 */ ENGM_ANIM_3,
+ /* 0x4 */ ENGM_ANIM_4,
+ /* 0x5 */ ENGM_ANIM_5,
+ /* 0x6 */ ENGM_ANIM_6,
+ /* 0x7 */ ENGM_ANIM_7,
+ /* 0x8 */ ENGM_ANIM_8,
+ /* 0x9 */ ENGM_ANIM_9,
+ /* 0xA */ ENGM_ANIM_10,
+ /* 0xB */ ENGM_ANIM_11,
+ /* 0xC */ ENGM_ANIM_12,
+ /* 0xD */ ENGM_ANIM_MAX
+} EnGmAnimation;
+
+static AnimationInfoS sAnimationInfo[ENGM_ANIM_MAX] = {
+ { &object_in2_Anim_009CDC, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGM_ANIM_0
+ { &object_in2_Anim_009CDC, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENGM_ANIM_1
+ { &object_in2_Anim_00A5E0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGM_ANIM_2
+ { &object_in2_Anim_00A70C, 1.0f, 0, 1, ANIMMODE_LOOP, 0 }, // ENGM_ANIM_3
+ { &object_in2_Anim_008090, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGM_ANIM_4
+ { &object_in2_Anim_00898C, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENGM_ANIM_5
+ { &object_in2_Anim_009450, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENGM_ANIM_6
+ { &object_in2_Anim_00AD18, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENGM_ANIM_7
+ { &object_in2_Anim_00AD18, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENGM_ANIM_8
+ { &object_in2_Anim_00B8B0, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENGM_ANIM_9
+ { &object_in2_Anim_00BA80, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENGM_ANIM_10
+ { &object_in2_Anim_00C03C, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENGM_ANIM_11
+ { &object_in2_Anim_00B990, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENGM_ANIM_12
};
Actor* func_8094DEE0(EnGm* this, PlayState* play, u8 arg2, s16 arg3) {
@@ -286,49 +303,49 @@ EnDoor* func_8094DF90(PlayState* play, s32 arg1) {
return SubS_FindDoor(play, phi_a1);
}
-s32 func_8094DFF8(EnGm* this, PlayState* play) {
- s32 ret = false;
+s32 EnGm_UpdateSkelAnime(EnGm* this, PlayState* play) {
+ s32 isAnimFinished = false;
if (this->unk_262 < 0) {
return false;
}
if (this->unk_262 >= 0) {
- this->skelAnime.playSpeed = this->unk_3A8;
- ret = SkelAnime_Update(&this->skelAnime);
+ this->skelAnime.playSpeed = this->animPlaySpeed;
+ isAnimFinished = SkelAnime_Update(&this->skelAnime);
}
- return ret;
+ return isAnimFinished;
}
-s32 func_8094E054(EnGm* this, PlayState* play, s32 arg2) {
+s32 EnGm_ChangeAnim(EnGm* this, PlayState* play, s32 animIndex) {
s8 tmp = this->unk_262;
- s32 phi_v1 = false;
- s32 ret = false;
+ s32 changeAnim = false;
+ s32 didAnimChange = false;
- if ((arg2 == 0) || (arg2 == 1)) {
- if ((this->unk_3E8 != 0) && (this->unk_3E8 != 1)) {
- phi_v1 = true;
+ if ((animIndex == ENGM_ANIM_0) || (animIndex == ENGM_ANIM_1)) {
+ if ((this->animIndex != ENGM_ANIM_0) && (this->animIndex != ENGM_ANIM_1)) {
+ changeAnim = true;
}
- } else if (arg2 != this->unk_3E8) {
- phi_v1 = true;
+ } else if (this->animIndex != animIndex) {
+ changeAnim = true;
}
- if (phi_v1) {
+ if (changeAnim) {
if (tmp >= 0) {
- this->unk_3E8 = arg2;
- ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, arg2);
- this->unk_3A8 = this->skelAnime.playSpeed;
+ this->animIndex = animIndex;
+ didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
+ this->animPlaySpeed = this->skelAnime.playSpeed;
}
}
- return ret;
+ return didAnimChange;
}
s32 func_8094E0F8(EnGm* this, PlayState* play) {
s32 ret = false;
- if ((this->unk_260 != play->roomCtx.curRoom.num) && (play->roomCtx.unk31 == 0)) {
+ if ((this->unk_260 != play->roomCtx.curRoom.num) && (play->roomCtx.status == 0)) {
this->unk_260 = play->roomCtx.curRoom.num;
this->unk_262 = SubS_GetObjectIndex(OBJECT_IN2, play);
this->actor.draw = NULL;
@@ -425,48 +442,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,17 +491,21 @@ 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;
+
+ default:
+ break;
}
return ret;
@@ -492,7 +513,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;
@@ -500,8 +521,8 @@ s32 func_8094E69C(EnGm* this, PlayState* play) {
switch (this->unk_3E0) {
case 0:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CHAIR_ROLL);
- func_8094E054(this, play, 2);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_CHAIR_ROLL);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_2);
this->unk_3E2 = 0;
this->unk_3E0++;
break;
@@ -530,10 +551,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 +565,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++;
@@ -552,11 +573,12 @@ s32 func_8094E69C(EnGm* this, PlayState* play) {
break;
case 8:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CHAIR_ROLL);
- ActorCutscene_Stop(sp4A);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_CHAIR_ROLL);
+ CutsceneManager_Stop(csId);
this->unk_3E2 = 0;
this->unk_3E0++;
break;
+
case 9:
sp48 = this->actor.world.rot.y;
this->unk_3E2++;
@@ -564,13 +586,16 @@ s32 func_8094E69C(EnGm* this, PlayState* play) {
Math_ApproachS(&this->actor.shape.rot.y, sp48, 3, 0x2AA8);
this->unk_3A4 &= ~0x20;
} else {
- func_8094E054(this, play, 1);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_1);
this->actor.shape.rot.y = sp48;
this->unk_3E0++;
this->unk_3E2 = 0;
ret = true;
}
break;
+
+ default:
+ break;
}
return ret;
}
@@ -637,8 +662,8 @@ s32 func_8094EB1C(EnGm* this, PlayState* play) {
ret = true;
break;
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CHAIR_ROLL);
- func_8094E054(this, play, 2);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_CHAIR_ROLL);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_2);
this->unk_3E2 = 0;
this->unk_3E0++;
@@ -657,7 +682,7 @@ s32 func_8094EB1C(EnGm* this, PlayState* play) {
break;
case 2:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CHAIR_ROLL);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_CHAIR_ROLL);
this->unk_3E2 = 0;
this->unk_3E0++;
@@ -668,7 +693,7 @@ s32 func_8094EB1C(EnGm* this, PlayState* play) {
Math_ApproachS(&this->actor.shape.rot.y, oldYaw, 3, 0x2AA8);
this->unk_3A4 &= ~0x20;
} else {
- func_8094E054(this, play, 1);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_1);
this->actor.shape.rot.y = oldYaw;
this->unk_3E2 = 0;
this->unk_3E0++;
@@ -731,28 +756,27 @@ s32* func_8094EDBC(EnGm* this, PlayState* play) {
s32 func_8094EE84(EnGm* this, PlayState* play) {
s32 ret = false;
- if (this->unk_3A4 & 7) {
- if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- SubS_UpdateFlags(&this->unk_3A4, 0, 7);
- this->unk_3E0 = 0;
- this->unk_3E4 = NULL;
- this->actor.child = this->unk_268;
- this->unk_264 = func_8094EDBC(this, play);
+ if (((this->unk_3A4 & SUBS_OFFER_MODE_MASK) != SUBS_OFFER_MODE_NONE) &&
+ Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ SubS_SetOfferMode(&this->unk_3A4, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
+ this->unk_3E0 = 0;
+ this->unk_3E4 = NULL;
+ this->actor.child = this->unk_268;
+ this->unk_264 = func_8094EDBC(this, play);
- if ((this->unk_258 == 5) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_50_01) &&
- !CHECK_WEEKEVENTREG(WEEKEVENTREG_51_80) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_75_02)) {
- this->unk_3A4 |= 0x20;
- } else if ((this->unk_258 != 1) && (this->unk_258 != 5) && (this->unk_258 != 7)) {
- this->unk_3A4 |= 0x20;
- }
-
- if ((this->unk_258 == 3) && CHECK_WEEKEVENTREG(WEEKEVENTREG_75_01)) {
- this->unk_3A4 &= ~0x20;
- }
-
- this->actionFunc = func_80950DB8;
- ret = true;
+ if ((this->unk_258 == 5) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_50_01) &&
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_51_80) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_75_02)) {
+ this->unk_3A4 |= 0x20;
+ } else if ((this->unk_258 != 1) && (this->unk_258 != 5) && (this->unk_258 != 7)) {
+ this->unk_3A4 |= 0x20;
}
+
+ if ((this->unk_258 == 3) && CHECK_WEEKEVENTREG(WEEKEVENTREG_75_01)) {
+ this->unk_3A4 &= ~0x20;
+ }
+
+ this->actionFunc = func_80950DB8;
+ ret = true;
}
return ret;
}
@@ -760,13 +784,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);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_0);
this->unk_258 = 255;
}
- this->unk_259 = 255;
+ this->cueId = 255;
this->unk_3F8 = 1;
}
ret = true;
@@ -821,7 +845,7 @@ void func_8094F0E0(EnGm* this) {
Math_Vec3f_Copy(&sp34, &this->actor.focus.pos);
if (this->unk_268->id == ACTOR_PLAYER) {
- sp40.y = ((Player*)this->unk_268)->bodyPartsPos[7].y + 3.0f;
+ sp40.y = ((Player*)this->unk_268)->bodyPartsPos[PLAYER_BODYPART_HEAD].y + 3.0f;
} else {
Math_Vec3f_Copy(&sp40, &this->unk_268->focus.pos);
}
@@ -879,9 +903,9 @@ void func_8094F3D0(EnGm* this, PlayState* play) {
}
s32 func_8094F4EC(EnGm* this, PlayState* play) {
- if ((this->unk_258 != 6) && (this->unk_3E8 == 12)) {
+ if ((this->unk_258 != 6) && (this->animIndex == ENGM_ANIM_12)) {
this->unk_3A4 &= ~0x2000;
- func_8094E054(this, play, 8);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_8);
}
return true;
}
@@ -897,30 +921,30 @@ s32 func_8094F53C(EnGm* this, PlayState* play) {
if (this->unk_3A6 != sp32) {
switch (sp32) {
case 0x2B13:
- func_8094E054(this, play, 2);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_2);
break;
case 0x2B14:
case 0x2B18:
- func_8094E054(this, play, 0);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_0);
break;
case 0x2B16:
- func_8094E054(this, play, 1);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_1);
break;
case 0x2B15:
- func_8094E054(this, play, 5);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_5);
break;
case 0x2B17:
- func_8094E054(this, play, 6);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_6);
break;
default:
- if ((this->unk_3E8 == 7) || (this->unk_3E8 == 8)) {
+ if ((this->animIndex == ENGM_ANIM_7) || (this->animIndex == ENGM_ANIM_8)) {
this->unk_3A4 |= 0x2000;
- func_8094E054(this, play, 12);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_12);
}
break;
}
@@ -941,6 +965,9 @@ s32 func_8094F53C(EnGm* this, PlayState* play) {
this->unk_268 = toto;
}
break;
+
+ default:
+ break;
}
if (sp32 == 0x2AA8) {
@@ -963,16 +990,16 @@ s32 func_8094F53C(EnGm* this, PlayState* play) {
this->unk_18C(this, play);
}
- if ((this->unk_3E8 == 6) && !(play->actorCtx.flags & ACTORCTX_FLAG_5) &&
+ if ((this->animIndex == ENGM_ANIM_6) && !(play->actorCtx.flags & ACTORCTX_FLAG_5) &&
Animation_OnFrame(&this->skelAnime, 20.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_HANKO);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_HANKO);
}
return false;
}
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 +1011,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 +1030,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 +1042,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 +1055,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;
@@ -1036,10 +1063,10 @@ s32 func_8094F904(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->unk_3B8 = scheduleOutput->time1 - scheduleOutput->time0;
this->unk_3BA = sp56 - scheduleOutput->time0;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->unk_3A4 |= 0x100;
this->unk_3A4 |= 0x200;
- func_8094E054(this, play, 7);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_7);
this->actor.gravity = 0.0f;
ret = true;
}
@@ -1050,14 +1077,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)) {
@@ -1084,10 +1111,10 @@ s32 func_8094FAC4(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
(this->timePathElapsedTime / this->timePathWaypointTime) + (SUBS_TIME_PATHING_ORDER - 1);
this->unk_3A4 &= ~0x8;
this->unk_3A4 &= ~0x10;
- SubS_UpdateFlags(&this->unk_3A4, 3, 7);
+ SubS_SetOfferMode(&this->unk_3A4, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_3A4 |= 0x100;
this->unk_3A4 |= 0x200;
- func_8094E054(this, play, 7);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_7);
this->actor.gravity = -1.0f;
ret = true;
}
@@ -1101,10 +1128,10 @@ s32 func_8094FCC4(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
if (func_8094F7D0(this, play, scheduleOutput, ACTORCAT_NPC, ACTOR_EN_TAB)) {
if (this->unk_258 == 0) {
Math_Vec3f_Copy(&this->actor.world.pos, &D_80951D90);
- SubS_UpdateFlags(&this->unk_3A4, 3, 7);
- func_8094E054(this, play, 0);
+ SubS_SetOfferMode(&this->unk_3A4, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_0);
} else {
- func_8094E054(this, play, 9);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_9);
this->skelAnime.moveFlags = ANIM_FLAG_NOMOVE;
}
this->unk_3A4 |= 0x100;
@@ -1118,8 +1145,8 @@ s32 func_8094FD88(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret = false;
if (func_8094F7D0(this, play, scheduleOutput, ACTORCAT_NPC, ACTOR_EN_RECEPGIRL)) {
- func_8094E054(this, play, 11);
- SubS_UpdateFlags(&this->unk_3A4, 3, 7);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_11);
+ SubS_SetOfferMode(&this->unk_3A4, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_3A4 |= 0x100;
this->unk_3A4 |= 0x200;
ret = true;
@@ -1134,8 +1161,8 @@ s32 func_8094FE10(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
al = func_8094DEE0(this, play, ACTORCAT_NPC, ACTOR_EN_AL);
if (func_8094F7D0(this, play, scheduleOutput, ACTORCAT_NPC, ACTOR_EN_TOTO) && (al != NULL) &&
(al->update != NULL)) {
- func_8094E054(this, play, 11);
- SubS_UpdateFlags(&this->unk_3A4, 3, 7);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_11);
+ SubS_SetOfferMode(&this->unk_3A4, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_268 = al;
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_86_20)) {
this->unk_3C8 = 2;
@@ -1151,7 +1178,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 +1188,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) {
@@ -1172,15 +1199,15 @@ s32 func_8094FF04(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->actor.world.rot.y = Math_Vec3f_Yaw(&sp3C, &sp30);
if (this->unk_258 == 0) {
Math_Vec3f_Copy(&this->actor.world.pos, &D_80951D9C);
- SubS_UpdateFlags(&this->unk_3A4, 3, 7);
+ SubS_SetOfferMode(&this->unk_3A4, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_3C8 = 4;
this->unk_3CA = 4;
this->unk_3CC = 8;
- func_8094E054(this, play, 0);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_0);
func_8094E278(play);
} else {
Math_Vec3f_Copy(&this->actor.world.pos, &sp30);
- func_8094E054(this, play, 9);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_9);
this->skelAnime.moveFlags = ANIM_FLAG_NOMOVE;
}
this->unk_400 = 0;
@@ -1199,10 +1226,10 @@ s32 func_80950088(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
Math_Vec3f_Copy(&this->actor.world.pos, &D_80951DA8);
Math_Vec3s_Copy(&this->actor.world.rot, &D_80951DB4);
Math_Vec3s_Copy(&this->actor.shape.rot, &this->actor.world.rot);
- SubS_UpdateFlags(&this->unk_3A4, 3, 7);
+ SubS_SetOfferMode(&this->unk_3A4, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_3A4 |= (0x2000 | 0x100);
this->unk_3A4 |= 0x200;
- func_8094E054(this, play, 12);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_12);
return true;
}
@@ -1214,10 +1241,10 @@ s32 func_80950120(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
Math_Vec3f_Copy(&this->actor.world.pos, &D_80951DBC);
Math_Vec3s_Copy(&this->actor.world.rot, &D_80951DC8);
Math_Vec3s_Copy(&this->actor.shape.rot, &this->actor.world.rot);
- SubS_UpdateFlags(&this->unk_3A4, 3, 7);
+ SubS_SetOfferMode(&this->unk_3A4, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_3A4 |= (0x800 | 0x100);
this->unk_3A4 |= 0x200;
- func_8094E054(this, play, 4);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_4);
return true;
}
@@ -1229,24 +1256,24 @@ s32 func_809501B8(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
Math_Vec3f_Copy(&this->actor.world.pos, &D_80951DD0);
Math_Vec3s_Copy(&this->actor.world.rot, &D_80951DDC);
Math_Vec3s_Copy(&this->actor.shape.rot, &this->actor.world.rot);
- this->actor.targetMode = 6;
- SubS_UpdateFlags(&this->unk_3A4, 3, 7);
+ this->actor.targetMode = TARGET_MODE_6;
+ SubS_SetOfferMode(&this->unk_3A4, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_3A4 |= (0x1000 | 0x100);
this->unk_3A4 |= 0x200;
this->unk_3C8 = 3;
this->unk_3CA = 3;
this->unk_3CC = 8;
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
this->unk_3B4 = 60.0f;
- func_8094E054(this, play, 10);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_10);
return true;
}
s32 func_80950280(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 phi_v1;
- this->actor.flags |= ACTOR_FLAG_1;
- this->actor.targetMode = 0;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
+ this->actor.targetMode = TARGET_MODE_0;
this->unk_3A4 = 0;
this->unk_3C8 = 0;
this->unk_3CA = 0;
@@ -1334,11 +1361,11 @@ s32 func_80950388(EnGm* this, PlayState* play) {
s32 func_809503F8(EnGm* this, PlayState* play) {
s32 pad;
- if (this->unk_3E8 == 9) {
+ if (this->animIndex == ENGM_ANIM_9) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
- SubS_UpdateFlags(&this->unk_3A4, 3, 7);
- func_8094E054(this, play, 0);
+ SubS_SetOfferMode(&this->unk_3A4, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_0);
} else {
AnimationContext_SetMoveActor(play, &this->actor, &this->skelAnime, 1.0f);
}
@@ -1348,7 +1375,8 @@ s32 func_809503F8(EnGm* this, PlayState* play) {
s32 func_80950490(EnGm* this, PlayState* play) {
static s32 D_80951DE4[] = {
- 1, 5, 5, 1, 6, 5, 1, 5, 6, 1, 5, 6,
+ ENGM_ANIM_1, ENGM_ANIM_5, ENGM_ANIM_5, ENGM_ANIM_1, ENGM_ANIM_6, ENGM_ANIM_5,
+ ENGM_ANIM_1, ENGM_ANIM_5, ENGM_ANIM_6, ENGM_ANIM_1, ENGM_ANIM_5, ENGM_ANIM_6,
};
s32 pad;
@@ -1358,32 +1386,32 @@ s32 func_80950490(EnGm* this, PlayState* play) {
this->unk_3CA = 1;
this->unk_3CC = 8;
this->unk_400 = 1;
- func_8094E054(this, play, 3);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_3);
}
return false;
}
this->unk_400 = 0;
- switch (this->unk_3E8) {
- case 9:
+ switch (this->animIndex) {
+ case ENGM_ANIM_9:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
- SubS_UpdateFlags(&this->unk_3A4, 3, 7);
+ SubS_SetOfferMode(&this->unk_3A4, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_3C8 = 4;
this->unk_3CA = 4;
this->unk_3CC = 8;
- func_8094E054(this, play, 0);
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_0);
func_8094E278(play);
} else {
AnimationContext_SetMoveActor(play, &this->actor, &this->skelAnime, 1.0f);
}
break;
- case 5:
- case 6:
+ case ENGM_ANIM_5:
+ case ENGM_ANIM_6:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- func_8094E054(this, play, D_80951DE4[this->unk_3F4]);
+ EnGm_ChangeAnim(this, play, D_80951DE4[this->unk_3F4]);
this->unk_3F4++;
this->unk_3F4 %= 12;
this->unk_3DE = Rand_S16Offset(30, 30);
@@ -1392,7 +1420,7 @@ s32 func_80950490(EnGm* this, PlayState* play) {
default:
if (DECR(this->unk_3DE) == 0) {
- func_8094E054(this, play, D_80951DE4[this->unk_3F4]);
+ EnGm_ChangeAnim(this, play, D_80951DE4[this->unk_3F4]);
this->unk_3F4++;
this->unk_3F4 %= 12;
this->unk_3DE = Rand_S16Offset(30, 30);
@@ -1427,16 +1455,17 @@ s32 func_80950690(EnGm* this, PlayState* play) {
case 7:
this->unk_3D0 += 992;
if (DECR(this->unk_3B8) == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_VO_GO_SLEEP);
+ Actor_PlaySfx(&this->actor, NA_SE_VO_GO_SLEEP);
this->unk_3B8 = 30;
}
break;
case 8:
+ default:
break;
}
- SubS_FillLimbRotTables(play, this->unk_3D8, this->unk_3D2, ARRAY_COUNT(this->unk_3D8));
+ SubS_UpdateFidgetTables(play, this->fidgetTableY, this->fidgetTableZ, ENGM_FIDGET_TABLE_LEN);
return false;
}
@@ -1449,7 +1478,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 {
@@ -1465,7 +1494,7 @@ s32 func_80950804(EnGm* this, PlayState* play) {
Lib_Vec3f_TranslateAndRotateY(&this->unk_278, this->actor.world.rot.y, &sp38, &this->actor.world.pos);
this->unk_3BA += this->timePathTimeSpeed;
if (Animation_OnFrame(&this->skelAnime, 3.0f) || Animation_OnFrame(&this->skelAnime, 13.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_PIRATE_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_PIRATE_WALK);
}
}
@@ -1521,7 +1550,7 @@ s32 func_8095097C(EnGm* this, PlayState* play) {
this->timePathWaypoint = sp50;
this->timePathTargetPos = timePathTargetPos;
} else if (Animation_OnFrame(&this->skelAnime, 3.0f) || Animation_OnFrame(&this->skelAnime, 13.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_PIRATE_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_PIRATE_WALK);
}
return false;
}
@@ -1574,6 +1603,9 @@ void func_80950C24(EnGm* this, PlayState* play) {
case 30:
func_8095097C(this, play);
break;
+
+ default:
+ break;
}
Math_ApproachS(&this->actor.shape.rot.y, this->actor.world.rot.y, 3, 0x2AA8);
@@ -1587,11 +1619,11 @@ void func_80950CDC(EnGm* this, PlayState* play) {
if (!Schedule_RunScript(play, D_80951820, &sp20) ||
((this->unk_258 != sp20.result) && !func_80950280(this, play, &sp20))) {
this->actor.shape.shadowDraw = NULL;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
sp20.result = 0;
} else {
this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}
this->unk_258 = sp20.result;
this->unk_268 = func_8094F074(this, play);
@@ -1605,7 +1637,7 @@ void func_80950DB8(EnGm* this, PlayState* play) {
Actor* al;
if (func_8010BF58(&this->actor, play, this->unk_264, this->unk_3E4, &this->unk_25C)) {
- SubS_UpdateFlags(&this->unk_3A4, 3, 7);
+ SubS_SetOfferMode(&this->unk_3A4, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
al = func_8094DEE0(this, play, ACTORCAT_NPC, ACTOR_EN_AL);
if ((this->unk_258 == 2) && (al != NULL) && (al->update != NULL)) {
this->unk_268 = al;
@@ -1625,29 +1657,29 @@ void func_80950DB8(EnGm* this, PlayState* play) {
Math_ApproachS(&this->actor.shape.rot.y, Math_Vec3f_Yaw(&sp34, &sp40), 4, 0x2AA8);
}
}
- SubS_FillLimbRotTables(play, this->unk_3D8, this->unk_3D2, ARRAY_COUNT(this->unk_3D8));
+ SubS_UpdateFidgetTables(play, this->fidgetTableY, this->fidgetTableZ, ENGM_FIDGET_TABLE_LEN);
}
void func_80950F2C(EnGm* this, PlayState* play) {
- s32 sp50[] = { 0, 0, 3, 2 };
+ s32 csAnimIndex[] = { ENGM_ANIM_0, ENGM_ANIM_0, ENGM_ANIM_3, ENGM_ANIM_2 };
Player* player = GET_PLAYER(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) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CHAIR_ROLL);
+ 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;
+ EnGm_ChangeAnim(this, play, csAnimIndex[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);
@@ -1670,9 +1702,10 @@ void EnGm_Init(Actor* thisx, PlayState* play) {
}
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 22.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_in2_Skel_0078B0, NULL, this->jointTable, this->morphTable, 20);
- this->unk_3E8 = -1;
- func_8094E054(this, play, 0);
+ SkelAnime_InitFlex(play, &this->skelAnime, &object_in2_Skel_0078B0, NULL, this->jointTable, this->morphTable,
+ OBJECT_IN2_LIMB_MAX);
+ this->animIndex = ENGM_ANIM_NONE;
+ EnGm_ChangeAnim(this, play, ENGM_ANIM_0);
Collider_InitAndSetCylinder(play, &this->colliderCylinder, &this->actor, &sCylinderInit);
Collider_InitAndSetSphere(play, &this->colliderSphere, &this->actor, &sSphereInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit);
@@ -1698,7 +1731,7 @@ void EnGm_Update(Actor* thisx, PlayState* play) {
if (!func_8094E0F8(this, play)) {
if (!func_8094EE84(this, play) && func_8094EFC4(this, play)) {
func_80950F2C(this, play);
- func_8094DFF8(this, play);
+ EnGm_UpdateSkelAnime(this, play);
func_8094E2D0(this);
return;
}
@@ -1708,13 +1741,13 @@ void EnGm_Update(Actor* thisx, PlayState* play) {
func_8094F53C(this, play);
if (this->unk_258 != 0) {
- func_8094DFF8(this, play);
+ EnGm_UpdateSkelAnime(this, play);
func_8094E2D0(this);
func_8094F2E8(this);
- func_8013C964(&this->actor, play, this->unk_3B4, 30.0f, PLAYER_IA_NONE, this->unk_3A4 & 7);
+ SubS_Offer(&this->actor, play, this->unk_3B4, 30.0f, PLAYER_IA_NONE, this->unk_3A4 & SUBS_OFFER_MODE_MASK);
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);
}
@@ -1724,33 +1757,33 @@ void EnGm_Update(Actor* thisx, PlayState* play) {
s32 EnGm_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
s32 pad;
EnGm* this = THIS;
- s32 phi_v0;
+ s32 fidgetIndex;
- if (limbIndex == 16) {
+ if (limbIndex == OBJECT_IN2_LIMB_10) {
func_8094F3D0(this, play);
}
switch (limbIndex) {
- case 9:
- phi_v0 = 0;
+ case OBJECT_IN2_LIMB_09:
+ fidgetIndex = 0;
break;
- case 10:
- phi_v0 = 1;
+ case OBJECT_IN2_LIMB_0A:
+ fidgetIndex = 1;
break;
- case 13:
- phi_v0 = 2;
+ case OBJECT_IN2_LIMB_0D:
+ fidgetIndex = 2;
break;
default:
- phi_v0 = 9;
+ fidgetIndex = 9;
break;
}
- if ((this->unk_3A4 & 0x2000) && (phi_v0 < 9)) {
- rot->y += (s16)(Math_SinS(this->unk_3D8[phi_v0]) * 200.0f);
- rot->z += (s16)(Math_CosS(this->unk_3D2[phi_v0]) * 200.0f);
+ if ((this->unk_3A4 & 0x2000) && (fidgetIndex < 9)) {
+ rot->y += (s16)(Math_SinS(this->fidgetTableY[fidgetIndex]) * 200.0f);
+ rot->z += (s16)(Math_CosS(this->fidgetTableZ[fidgetIndex]) * 200.0f);
}
return false;
@@ -1763,20 +1796,20 @@ 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 == OBJECT_IN2_LIMB_10)) {
Matrix_MultVec3f(&D_80951E24, &this->actor.focus.pos);
Math_Vec3s_Copy(&this->actor.focus.rot, &this->actor.world.rot);
}
OPEN_DISPS(play->state.gfxCtx);
- if ((limbIndex == 15) && (this->unk_3A4 & 0x800)) {
+ if ((limbIndex == OBJECT_IN2_LIMB_0F) && (this->unk_3A4 & 0x800)) {
gSPDisplayList(POLY_OPA_DISP++, object_in2_DL_007528);
}
CLOSE_DISPS(play->state.gfxCtx);
- if (limbIndex == 9) {
+ if (limbIndex == OBJECT_IN2_LIMB_09) {
Matrix_MultVec3f(&gZeroVec3f, &sp30);
Math_Vec3f_ToVec3s(&this->colliderSphere.dim.worldSphere.center, &sp30);
}
@@ -1799,7 +1832,7 @@ void EnGm_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
overrideRot = false;
}
- if (limbIndex == 16) {
+ if (limbIndex == OBJECT_IN2_LIMB_10) {
SubS_UpdateLimb(BINANG_ADD(this->unk_3BC + this->unk_3C0, 0x4000),
BINANG_ADD(this->unk_3BE + this->unk_3C2 + this->actor.shape.rot.y, 0x4000), &this->unk_290,
&this->unk_2A8, stepRot, overrideRot);
@@ -1810,7 +1843,7 @@ void EnGm_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
Matrix_RotateXS(this->unk_2A8.x, MTXMODE_APPLY);
Matrix_RotateZS(this->unk_2A8.z, MTXMODE_APPLY);
Matrix_Push();
- } else if (limbIndex == 9) {
+ } else if (limbIndex == OBJECT_IN2_LIMB_09) {
SubS_UpdateLimb(BINANG_ADD(this->unk_3C0, 0x4000), BINANG_ADD(this->unk_3C2 + this->actor.shape.rot.y, 0x4000),
&this->unk_29C, &this->unk_2AE, stepRot, overrideRot);
Matrix_Pop();
@@ -1824,14 +1857,16 @@ void EnGm_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
}
void EnGm_Draw(Actor* thisx, PlayState* play) {
- static TexturePtr D_80951E30[] = { object_in2_Tex_0054A8, object_in2_Tex_005028, object_in2_Tex_006828,
- object_in2_Tex_005028, object_in2_Tex_005CE8, object_in2_Tex_006C68 };
+ static TexturePtr D_80951E30[] = {
+ object_in2_Tex_0054A8, object_in2_Tex_005028, object_in2_Tex_006828,
+ object_in2_Tex_005028, object_in2_Tex_005CE8, object_in2_Tex_006C68,
+ };
EnGm* this = THIS;
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..968d6dd07 100644
--- a/src/overlays/actors/ovl_En_Gm/z_en_gm.h
+++ b/src/overlays/actors/ovl_En_Gm/z_en_gm.h
@@ -2,6 +2,7 @@
#define Z_EN_GM_H
#include "global.h"
+#include "objects/object_in2/object_in2.h"
struct EnGm;
@@ -9,7 +10,9 @@ 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)
+
+#define ENGM_FIDGET_TABLE_LEN 3
typedef struct EnGm {
/* 0x000 */ Actor actor;
@@ -26,7 +29,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;
@@ -40,11 +43,11 @@ typedef struct EnGm {
/* 0x29C */ Vec3f unk_29C;
/* 0x2A8 */ Vec3s unk_2A8;
/* 0x2AE */ Vec3s unk_2AE;
- /* 0x2B4 */ Vec3s jointTable[20];
- /* 0x32C */ Vec3s morphTable[20];
+ /* 0x2B4 */ Vec3s jointTable[OBJECT_IN2_LIMB_MAX];
+ /* 0x32C */ Vec3s morphTable[OBJECT_IN2_LIMB_MAX];
/* 0x3A4 */ u16 unk_3A4;
/* 0x3A6 */ u16 unk_3A6;
- /* 0x3A8 */ f32 unk_3A8;
+ /* 0x3A8 */ f32 animPlaySpeed;
/* 0x3AC */ f32 unk_3AC;
/* 0x3B0 */ f32 unk_3B0;
/* 0x3B4 */ f32 unk_3B4;
@@ -61,13 +64,13 @@ typedef struct EnGm {
/* 0x3CC */ s16 unk_3CC;
/* 0x3CE */ s16 unk_3CE;
/* 0x3D0 */ s16 unk_3D0;
- /* 0x3D2 */ s16 unk_3D2[3];
- /* 0x3D8 */ s16 unk_3D8[3];
+ /* 0x3D2 */ s16 fidgetTableZ[ENGM_FIDGET_TABLE_LEN];
+ /* 0x3D8 */ s16 fidgetTableY[ENGM_FIDGET_TABLE_LEN];
/* 0x3DE */ s16 unk_3DE;
/* 0x3E0 */ s16 unk_3E0;
/* 0x3E2 */ s16 unk_3E2;
/* 0x3E4 */ EnGmUnkFunc unk_3E4;
- /* 0x3E8 */ s32 unk_3E8;
+ /* 0x3E8 */ s32 animIndex;
/* 0x3EC */ UNK_TYPE1 unk3EC[0x4];
/* 0x3F0 */ s32 prevTalkState;
/* 0x3F4 */ s32 unk_3F4;
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 e1250dbc6..2f6217411 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,136 @@
* 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 FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | 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 EnGoAnimation {
+ /* -1 */ ENGO_ANIM_NONE = -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
+} EnGoAnimation;
+
+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);
+
+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 +139,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 +164,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 +221,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 +242,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 +265,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 EnGoAnimation
+ */
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 +325,456 @@ 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_SNOW_EFFECT_COUNT], Vec3f pos) {
+ static u8 sEffectIndexToSnowEffectTable[ENGO_SNOW_EFFECT_COUNT] = {
+ 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 = sEffectIndexToSnowEffectTable[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);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
- for (i = 0; i < 16; i++, ptr++) {
- if (ptr->unk_00 == arg4) {
- if (!flag) {
- gSPDisplayList(POLY_OPA_DISP++, arg2);
- flag = true;
- }
-
- Matrix_Push();
- Matrix_Translate(ptr->unk_10.x, ptr->unk_10.y, ptr->unk_10.z, MTXMODE_NEW);
- Matrix_Scale(0.08f, 0.08f, 0.08f, MTXMODE_APPLY);
- Matrix_RotateZS(ptr->unk_0A.z, MTXMODE_APPLY);
- Matrix_RotateXS(ptr->unk_0A.x, MTXMODE_APPLY);
- Matrix_RotateYS(ptr->unk_0A.y, MTXMODE_APPLY);
-
- if (1) {
- gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, arg3);
- }
-
- Matrix_Pop();
+ for (i = 0; i < ENGO_SNOW_EFFECT_COUNT; i++, effect++) {
+ if (effect->type != effectType) {
+ continue;
}
+
+ if (!isMaterialSet) {
+ gSPDisplayList(POLY_OPA_DISP++, material);
+ isMaterialSet = true;
+ }
+
+ Matrix_Push();
+ Matrix_Translate(effect->pos.x, effect->pos.y, effect->pos.z, MTXMODE_NEW);
+ Matrix_Scale(0.08f, 0.08f, 0.08f, MTXMODE_APPLY);
+ Matrix_RotateZS(effect->rotAngle.z, MTXMODE_APPLY);
+ Matrix_RotateXS(effect->rotAngle.x, MTXMODE_APPLY);
+ Matrix_RotateYS(effect->rotAngle.y, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, model);
+
+ Matrix_Pop();
}
CLOSE_DISPS(play->state.gfxCtx);
}
-#else
-void func_80A11EC0(EnGoStruct* ptr, PlayState* play, Gfx* arg2, Gfx* arg3, u8 arg4);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Go/func_80A11EC0.s")
-#endif
-void func_80A1203C(EnGo* this) {
- EnGoStruct* ptr = this->unk_3F8;
+/**
+ * Update all effects, potentially fading them away to nothing.
+ */
+void EnGo_UpdateEffects(EnGo* this) {
+ EnGoEffect* effect = this->effectTable;
s32 i;
- for (i = 0; i < ARRAY_COUNT(this->unk_3F8); i++, ptr++) {
- if (ptr->unk_00 != 0) {
- if (ptr->unk_02 == 0) {
- ptr->unk_00 = 0;
- } else if ((ptr->unk_00 > 0) && (ptr->unk_00 < 4)) {
- func_80A11BF8(ptr, this->actor.world.pos.y);
- } else {
- ptr->unk_10.x += ptr->unk_28.x;
- ptr->unk_10.y += ptr->unk_28.y;
- ptr->unk_10.z += ptr->unk_28.z;
+ for (i = 0; i < ENGO_EFFECT_COUNT; i++, effect++) {
+ if (effect->type == ENGO_EFFECT_NONE) {
+ continue;
+ }
- ptr->unk_28.x += ptr->unk_1C.x;
- ptr->unk_28.y += ptr->unk_1C.y;
- ptr->unk_28.z += ptr->unk_1C.z;
+ if (effect->alphaNumer == 0) {
+ // End usage of the effect
+ effect->type = ENGO_EFFECT_NONE;
+ } else if ((effect->type > ENGO_EFFECT_NONE) && (effect->type < ENGO_EFFECT_DUST_MIN)) {
+ // Snow rotates, and changes to dust upon dropping below the actor position
+ EnGo_UpdateSnow(effect, this->actor.world.pos.y);
+ } else {
+ // Dust and steam move according to their initial values
+ effect->pos.x += effect->velocity.x;
+ effect->pos.y += effect->velocity.y;
+ effect->pos.z += effect->velocity.z;
- ptr->unk_34 += ptr->unk_38;
- ptr->unk_02--;
- }
+ effect->velocity.x += effect->accel.x;
+ effect->velocity.y += effect->accel.y;
+ effect->velocity.z += effect->accel.z;
+
+ effect->scaleXY += effect->scaleXYDelta;
+ effect->alphaNumer--;
}
}
}
-void func_80A1213C(EnGo* this, PlayState* play) {
- func_80A11EC0(this->unk_3F8, play, gGoronLargeSnowballFragmentMaterialDL, gGoronLargeSnowballFragmentModelDL, 1);
- func_80A11EC0(this->unk_3F8, play, gGoronMediumSnowballFragmentMaterialDL, gGoronMediumSnowballFragmentModelDL, 2);
- func_80A11EC0(this->unk_3F8, play, gGoronSmallSnowballFragmentMaterialDL, gGoronSmallSnowballFragmentModelDL, 3);
- func_80A11144(this->unk_3F8, play);
- func_80A115B4(this->unk_3F8, play);
+/**
+ * Draw all effects.
+ */
+void EnGo_DrawEffects(EnGo* this, PlayState* play) {
+ EnGo_DrawSnow(this->effectTable, play, gGoronLargeSnowballFragmentMaterialDL, gGoronLargeSnowballFragmentModelDL,
+ ENGO_EFFECT_SNOW1);
+ EnGo_DrawSnow(this->effectTable, play, gGoronMediumSnowballFragmentMaterialDL, gGoronMediumSnowballFragmentModelDL,
+ ENGO_EFFECT_SNOW2);
+ EnGo_DrawSnow(this->effectTable, play, gGoronSmallSnowballFragmentMaterialDL, gGoronSmallSnowballFragmentModelDL,
+ ENGO_EFFECT_SNOW3);
+ EnGo_DrawSteam(this->effectTable, play);
+ EnGo_DrawDust(this->effectTable, play);
}
-s32 func_80A121F4(PlayState* play) {
+/**
+ * Check if the Goron can hurt the player.
+ */
+s32 EnGo_CanSnowballHurtPlayer(PlayState* play) {
Player* player = GET_PLAYER(play);
if ((player->transformation == PLAYER_FORM_GORON) && (player->stateFlags3 & PLAYER_STATE3_2000000)) {
return false;
+ } else {
+ return true;
}
- return true;
}
-s32 func_80A1222C(EnGo* this, PlayState* play) {
+/**
+ * Check if the Goron is falling asleep.
+ */
+s32 EnGo_IsFallingAsleep(EnGo* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- s32 ret = false;
+ s32 isFallingAsleep = false;
- if (((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == 3) &&
- (play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY) && (this->unk_3EC == 0) &&
+ if (((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) &&
+ (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 +783,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,378 +808,449 @@ 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 & SUBS_OFFER_MODE_MASK) == SUBS_OFFER_MODE_NONE) ||
+ !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_SetOfferMode(&this->actionFlags, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
+ 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) {
- this->actor.flags &= ~ACTOR_FLAG_1;
- this->unk_394 = 255;
- this->unk_3F0 = 1;
- this->unk_18C = this->actionFunc;
+/**
+ * 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) {
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ 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) {
- 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;
+ SubS_SetOfferMode(&this->actionFlags, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
+ this->actionFunc = EnGo_HandleSpringArrivalCutscene;
+ } else if (this->springArrivalCutsceneActive) {
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
+ this->springArrivalCueId = 255;
+ this->springArrivalCutsceneActive = false;
+ SubS_SetOfferMode(&this->actionFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
+ 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_UpdateSkelAnime(EnGo* this, PlayState* play) {
+ s8 objIndex = this->actor.objBankIndex;
+ s8 extraObjIndex = -1;
+ s32 isAnimFinished = 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->animIndex >= ENGO_ANIM_SPRING_MIN) && (this->hakuginDemoObjIndex >= 0)) {
+ extraObjIndex = this->hakuginDemoObjIndex;
+ } else if ((this->animIndex >= ENGO_ANIM_ATHLETICS_MIN) && (this->taisouObjIndex >= 0)) {
+ extraObjIndex = this->taisouObjIndex;
+ } else if (this->animIndex < 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;
- ret = SkelAnime_Update(&this->skelAnime);
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objIdx].segment);
+ if (extraObjIndex >= 0) {
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[extraObjIndex].segment);
+ this->skelAnime.playSpeed = this->animPlaySpeed;
+ isAnimFinished = SkelAnime_Update(&this->skelAnime);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objIndex].segment);
}
- return ret;
+ return isAnimFinished;
}
-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->animIndex == ENGO_ANIM_ROLL) {
if (Animation_OnFrame(&this->skelAnime, 2.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_CIRCLE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_CIRCLE);
}
if (Animation_OnFrame(&this->skelAnime, 22.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_SIT_IMT);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_SIT_IMT);
}
- } else if ((this->unk_3DC == 2) || (this->unk_3DC == 3)) {
+ } else if ((this->animIndex == ENGO_ANIM_UNROLL) || (this->animIndex == ENGO_ANIM_UNROLL_IMM)) {
if (Animation_OnFrame(&this->skelAnime, 2.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_CIRCLE_OFF);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_CIRCLE_OFF);
}
if (Animation_OnFrame(&this->skelAnime, 24.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_STAND_IMT);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_STAND_IMT);
}
}
}
return 0;
}
-s32 func_80A12C48(EnGo* this, PlayState* play, s32 arg2) {
- s8 objIdx = this->actor.objBankIndex;
- s8 objIdx2 = -1;
- s32 ret = false;
+/**
+ * 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, EnGoAnimation animIndex) {
+ s8 objIndex = this->actor.objBankIndex;
+ s8 extraObjIndex = -1;
+ s32 didAnimChange = 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.slots[extraObjIndex].segment);
+ this->animIndex = animIndex;
+ didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
+ this->animPlaySpeed = this->skelAnime.playSpeed;
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[objIndex].segment);
}
- return ret;
+ return didAnimChange;
}
-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[PLAYER_BODYPART_HEAD].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_SetOfferMode(&this->actionFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
+ } 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_SetOfferMode(&this->actionFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
} else {
- SubS_UpdateFlags(&this->unk_390, 4, 7);
+ SubS_SetOfferMode(&this->actionFlags, SUBS_OFFER_MODE_AUTO, SUBS_OFFER_MODE_MASK);
}
}
-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_SetOfferMode(&this->actionFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
} else {
- SubS_UpdateFlags(&this->unk_390, 4, 7);
+ SubS_SetOfferMode(&this->actionFlags, SUBS_OFFER_MODE_AUTO, SUBS_OFFER_MODE_MASK);
}
}
-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 +1258,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 +1277,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 & 2) {
- ret = true;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
+ // 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,417 +1421,522 @@ 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) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_JUMP);
- this->actor.velocity.y = 10.0f;
+ this->cutsceneDelayTimer++;
+ if (this->cutsceneDelayTimer >= 10) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_JUMP);
+ 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)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_LAND_BIG);
- func_80A13728(this, play);
- this->unk_3C4++;
- this->unk_3C2 = 0;
- SET_WEEKEVENTREG(WEEKEVENTREG_88_40);
+ 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);
+ 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)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_GORON_HAND_HIT);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_GORON_HAND_HIT);
}
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->animIndex == 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);
+
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ 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;
- 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;
+ EnGo_ChangeAnim(this, play, sSubtypeToAnimIndex[ENGO_GET_SUBTYPE(&this->actor) % 2]);
+ animFrame = Rand_ZeroOne() * this->skelAnime.endFrame;
+ this->skelAnime.curFrame = animFrame;
+
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ 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->animIndex = ENGO_ANIM_NONE;
+ 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_SetOfferMode(&this->actionFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
+ 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_SetOfferMode(&this->actionFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
+ 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);
- this->actor.flags &= ~ACTOR_FLAG_1;
- this->actor.targetMode = 3;
- this->unk_390 = 0;
+/**
+ * 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_TARGETABLE;
+ this->actor.targetMode = TARGET_MODE_3;
+ 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_SetOfferMode(&this->actionFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
+ 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->animIndex = ENGO_ANIM_NONE;
+ 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->actor.targetMode = TARGET_MODE_1;
+ 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,390 +1946,475 @@ 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))) {
- Actor_PlaySfxAtPos(&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);
+ 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_TYPE(&this->actor) != ENGO_MEDIGORON) {
+ // All others besides the Medigoron in the Powder Keg Shop can fall asleep
+ if (EnGo_IsFallingAsleep(this, play)) {
+ SubS_SetOfferMode(&this->actionFlags, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
+ 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_SetOfferMode(&this->actionFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
} else {
- SubS_UpdateFlags(&this->unk_390, 0, 7);
+ SubS_SetOfferMode(&this->actionFlags, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
}
}
}
- 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;
- }
- Actor_PlaySfxAtPos(&this->actor, sfxId);
+ } 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_SetOfferMode(&this->actionFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
}
} 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_UpdateFidgetTables(play, this->fidgetTableY, this->fidgetTableZ, ENGO_FIDGET_TABLE_LEN);
+ 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_GET_TYPE(actorCollidedWith) != AQUA_TYPE_COLD)) ||
+ (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) {
- Actor_PlaySfxAtPos(&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);
+ if ((s32)(this->iceBlockScale * 3.0f) != 0) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_ICE_MELT_LEVEL - SFX_FLAG);
+ 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_SetOfferMode(&this->actionFlags, SUBS_OFFER_MODE_AUTO, SUBS_OFFER_MODE_MASK);
+ 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->animIndex == 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->animIndex == ENGO_ANIM_SHOW)) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_SHOW_LOOPED);
}
break;
case 6:
- if ((s32)(this->unk_39C * 3.0f) != 0) {
- Actor_PlaySfxAtPos(&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);
+ if ((s32)(this->iceBlockScale * 3.0f) != 0) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_ICE_MELT_LEVEL - SFX_FLAG);
+ 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:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_COLD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_COLD);
break;
case 185:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_WAKE_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_WAKE_UP);
break;
case 250:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_EYE_BIG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_EYE_BIG);
break;
case 465:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_IWAIGORON_SOLO);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_IWAIGORON_SOLO);
break;
case 490:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_VOICE_EATFULL);
+ 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_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_COLD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_COLD);
break;
case 430:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_WAKE_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_WAKE_UP);
break;
case 450:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_EYE_BIG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_EYE_BIG);
break;
case 480:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_VOICE_EATFULL);
+ 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_UpdateFidgetTables(play, this->fidgetTableY, this->fidgetTableZ, ENGO_FIDGET_TABLE_LEN);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
}
}
-void func_80A153FC(EnGo* this, PlayState* play) {
- Vec3s* sp5C;
- Vec3f sp50;
- Vec3f sp44;
-
- if ((this->unk_390 & 0x1000) && (this->actor.colChkInfo.damageEffect == 0xF)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_SNOWBALL_BROKEN);
+/**
+ * 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->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.speedXZ = 0.0f;
-
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_COLD);
+ 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) {
- func_800B8E58(GET_PLAYER(play), NA_SE_PL_BODY_HIT);
+ } 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 & 1) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BIGBALL_ROLL - SFX_FLAG);
- func_800AE930(&play->colCtx, Effect_GetByIndex(this->unk_3E8), &this->actor.world.pos, 18.0f,
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BIGBALL_ROLL - SFX_FLAG);
+ 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.speedXZ = 4.0f;
- this->actor.shape.rot.x += (s16)(this->actor.speedXZ * 546.0f);
+ this->actor.speed = 4.0f;
+ this->actor.shape.rot.x += (s16)(this->actor.speed * 546.0f);
Actor_MoveWithGravity(&this->actor);
}
}
-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_UpdateFidgetTables(play, this->fidgetTableY, this->fidgetTableZ, ENGO_FIDGET_TABLE_LEN);
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_SetOfferMode(&this->actionFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
+ 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 +2422,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_UpdateSkelAnime(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);
+ SubS_Offer(&this->actor, play, xzRange, 20.0f, PLAYER_IA_NONE, this->actionFlags & SUBS_OFFER_MODE_MASK);
+ } else if ((this->actionFlags & ENGO_FLAG_ROLLED_UP) && (this->sleepState != ENGO_AWAKE)) {
+ xzRange = this->colliderCylinder.dim.radius + 40;
+ SubS_Offer(&this->actor, play, xzRange, 20.0f, PLAYER_IA_NONE, this->actionFlags & SUBS_OFFER_MODE_MASK);
}
- 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 +2484,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 +2493,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 fidgetIndex;
- 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:
+ fidgetIndex = 0;
break;
- case 11:
- idx = 1;
+ case GORON_LIMB_LEFT_UPPER_ARM:
+ fidgetIndex = 1;
break;
- case 14:
- idx = 2;
+ case GORON_LIMB_RIGHT_UPPER_ARM:
+ fidgetIndex = 2;
break;
default:
- idx = 9;
+ fidgetIndex = 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) && (fidgetIndex < 9)) {
+ rot->y += (s16)(Math_SinS(this->fidgetTableY[fidgetIndex]) * 200.0f);
+ rot->z += (s16)(Math_CosS(this->fidgetTableZ[fidgetIndex]) * 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 +2556,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->animIndex == 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 +2608,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..97959a03e 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,144 @@
#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_FIDGET_TABLE_LEN 3
+
+#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 animPlaySpeed;
+ /* 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 fidgetTableZ[ENGO_FIDGET_TABLE_LEN];
+ /* 0x3CE */ s16 fidgetTableY[ENGO_FIDGET_TABLE_LEN];
+ /* 0x3D4 */ s16 surprisePhase;
+ /* 0x3D8 */ MsgEventFunc msgEventFunc;
+ /* 0x3DC */ s32 animIndex;
/* 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 98d27f735..aa6eb041f 100644
--- a/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c
+++ b/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c
@@ -358,7 +358,7 @@ s32 func_8093F34C(EnGoroiwa* this) {
f32 x;
f32 z;
- Math_StepToF(&this->actor.speedXZ, D_80942DFC[this->unk_1E4], 0.3f);
+ Math_StepToF(&this->actor.speed, D_80942DFC[this->unk_1E4], 0.3f);
Actor_UpdateVelocityWithGravity(&this->actor);
temp_v0 = &this->unk_1D0[this->unk_1D8];
this->actor.velocity.y *= 0.97f;
@@ -368,7 +368,7 @@ s32 func_8093F34C(EnGoroiwa* this) {
tempX = x - this->actor.world.pos.x;
tempZ = z - this->actor.world.pos.z;
- if (SQ(this->actor.speedXZ + 1.0f) < (SQ(tempX) + SQ(tempZ))) {
+ if (SQ(this->actor.speed + 1.0f) < (SQ(tempX) + SQ(tempZ))) {
this->actor.world.pos.x += this->actor.velocity.x;
this->actor.world.pos.y += this->actor.velocity.y;
this->actor.world.pos.z += this->actor.velocity.z;
@@ -393,12 +393,12 @@ s32 func_8093F498(EnGoroiwa* this) {
sp2C.y = temp_v0->y;
sp2C.z = temp_v0->z;
- Math_StepToF(&this->actor.speedXZ, D_80942DFC[this->unk_1E4], 0.3f);
+ Math_StepToF(&this->actor.speed, D_80942DFC[this->unk_1E4], 0.3f);
Math_Vec3f_Diff(&sp2C, &this->actor.world.pos, &this->actor.velocity);
temp_f0 = Math3D_Vec3fMagnitude(&this->actor.velocity);
- if ((this->actor.speedXZ + 1.0f) < temp_f0) {
- Math_Vec3f_Scale(&this->actor.velocity, this->actor.speedXZ / temp_f0);
+ if ((this->actor.speed + 1.0f) < temp_f0) {
+ Math_Vec3f_Scale(&this->actor.velocity, this->actor.speed / temp_f0);
this->actor.world.pos.x += this->actor.velocity.x;
this->actor.world.pos.y += this->actor.velocity.y;
this->actor.world.pos.z += this->actor.velocity.z;
@@ -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;
@@ -483,7 +483,7 @@ s32 func_8093F6F8(EnGoroiwa* this, PlayState* play) {
func_8093EF54(play, &sp48, &D_80942E30[ENGOROIWA_GET_C000(&this->actor)],
&D_80942E3C[ENGOROIWA_GET_C000(&this->actor)], this->actor.scale.x);
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BIGBALL_BOUND);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BIGBALL_BOUND);
}
}
}
@@ -674,6 +674,7 @@ void func_80940090(EnGoroiwa* this, PlayState* play) {
sp10C.x = this->actor.world.pos.x;
sp10C.y = this->actor.world.pos.y + this->unk_1DC;
sp10C.z = this->actor.world.pos.z;
+ //! FAKE:
if (1) {}
spD8 = spEC * 150.0f;
spA8 = 0x10000 / spD8;
@@ -894,7 +895,7 @@ void func_80940E38(EnGoroiwa* this, PlayState* play) {
if (this->actor.flags & ACTOR_FLAG_40) {
if (this->actor.xzDistToPlayer < 1000.0f) {
- sp5C = (1000.0f - this->actor.xzDistToPlayer) * 0.0012f * (this->actor.speedXZ * 0.1f);
+ sp5C = (1000.0f - this->actor.xzDistToPlayer) * 0.0012f * (this->actor.speed * 0.1f);
if (Rand_ZeroOne() < sp5C) {
this->unk_1CE += 20000;
sp46 = (s32)Rand_ZeroFloat(20000.0f) + this->unk_1CE;
@@ -1049,7 +1050,7 @@ s32 func_8094156C(EnGoroiwa* this, PlayState* play) {
temp2 = Math_SinS(ptr->unk_1E);
temp3 = Math_SinS(this->actor.world.rot.y);
- ptr->unk_0C = ((1.0f / D_80942DFC[this->unk_1E4]) * (temp3 * 14.0f * this->actor.speedXZ)) +
+ ptr->unk_0C = ((1.0f / D_80942DFC[this->unk_1E4]) * (temp3 * 14.0f * this->actor.speed)) +
(temp2 * (temp + 5.0f));
ptr->unk_10 = (Rand_ZeroOne() * 11.0f) + 20.0f;
@@ -1057,7 +1058,7 @@ s32 func_8094156C(EnGoroiwa* this, PlayState* play) {
temp = Rand_ZeroOne();
temp2 = Math_CosS(ptr->unk_1E);
temp3 = Math_CosS(this->actor.world.rot.y);
- ptr->unk_14 = ((1.0f / D_80942DFC[this->unk_1E4]) * ((temp3 * 14.0f) * this->actor.speedXZ)) +
+ ptr->unk_14 = ((1.0f / D_80942DFC[this->unk_1E4]) * ((temp3 * 14.0f) * this->actor.speed)) +
(temp2 * (temp + 5.0f));
ptr->unk_1C = 0;
@@ -1117,8 +1118,8 @@ void func_809419D0(EnGoroiwa* this) {
void func_80941A10(EnGoroiwa* this, PlayState* play) {
static EnGoroiwaUnkFunc D_80942E94[] = {
- &func_8093F498,
- &func_8093F34C,
+ func_8093F498,
+ func_8093F34C,
};
static u16 D_80942E9C[][2] = {
{ NA_SE_EV_BIGBALL_ROLL - SFX_FLAG, NA_SE_EV_BIGBALL_ROLL_SR - SFX_FLAG },
@@ -1168,7 +1169,7 @@ void func_80941A10(EnGoroiwa* this, PlayState* play) {
func_80941DB4(this);
}
- func_800B8E58(player, NA_SE_PL_BODY_HIT);
+ Player_PlaySfx(player, NA_SE_PL_BODY_HIT);
if ((sp34 == 1) || (sp34 == 2)) {
this->unk_1CC = 50;
@@ -1207,8 +1208,8 @@ void func_80941A10(EnGoroiwa* this, PlayState* play) {
}
}
- if (this->actor.bgCheckFlags & 1) {
- Actor_PlaySfxAtPos(&this->actor, D_80942E9C[this->unk_1E4][this->actor.home.rot.x & 1]);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ Actor_PlaySfx(&this->actor, D_80942E9C[this->unk_1E4][this->actor.home.rot.x & 1]);
}
}
}
@@ -1218,14 +1219,14 @@ void func_80941DB4(EnGoroiwa* this) {
func_8093EAB0(this, 6);
this->actor.gravity = -0.86f;
this->actor.terminalVelocity = -15.0f;
- this->actor.speedXZ *= 0.15f;
+ this->actor.speed *= 0.15f;
this->actor.velocity.y = 5.0f;
this->unk_1C4 = 1.0f;
}
void func_80941E28(EnGoroiwa* this, PlayState* play) {
func_8093F34C(this);
- if ((this->actor.bgCheckFlags & 1) && (this->actor.velocity.y < 0.0f)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->actor.velocity.y < 0.0f)) {
if ((this->unk_1E5 & 8) && ((this->actor.home.rot.z & 3) == 1)) {
func_8093EDB0(this);
}
@@ -1237,7 +1238,7 @@ void func_80941EB4(EnGoroiwa* this) {
static s16 D_80942EAC[] = { 20, 6, 20 };
this->actionFunc = func_80941F10;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
func_8093EAB0(this, 6);
this->unk_1C8 = D_80942EAC[this->actor.home.rot.z & 3];
this->unk_1C4 = 0.0f;
@@ -1257,7 +1258,7 @@ void func_80941F54(EnGoroiwa* this) {
this->actionFunc = func_80941FA4;
func_8093EAB0(this, 7);
this->unk_1C4 = 0.0f;
- this->actor.velocity.y = fabsf(this->actor.speedXZ) * 0.1f;
+ this->actor.velocity.y = fabsf(this->actor.speed) * 0.1f;
}
void func_80941FA4(EnGoroiwa* this, PlayState* play) {
@@ -1266,14 +1267,14 @@ void func_80941FA4(EnGoroiwa* this, PlayState* play) {
if (func_8094156C(this, play) == 0) {
if ((this->collider.base.atFlags & AT_HIT) && !(player->stateFlags3 & PLAYER_STATE3_80000)) {
func_800B8D50(play, &this->actor, 2.0f, this->actor.yawTowardsPlayer, 0.0f, 0);
- func_800B8E58(player, NA_SE_PL_BODY_HIT);
+ Player_PlaySfx(player, NA_SE_PL_BODY_HIT);
if (((this->actor.home.rot.z & 3) == 1) || ((this->actor.home.rot.z & 3) == 2)) {
this->unk_1CC = 50;
}
} else if (func_8093F5EC(this)) {
func_8093FC00(this);
func_809419D0(this);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
}
}
@@ -1283,7 +1284,7 @@ void func_80942084(EnGoroiwa* this) {
func_8093EAB0(this, 7);
this->unk_1C4 = 0.3f;
this->unk_1CA = 0;
- this->actor.velocity.y = fabsf(this->actor.speedXZ) * -0.3f;
+ this->actor.velocity.y = fabsf(this->actor.speed) * -0.3f;
this->unk_1E5 |= 0x10;
this->unk_1E5 &= ~0x20;
}
@@ -1294,7 +1295,7 @@ void func_809420F0(EnGoroiwa* this, PlayState* play) {
if (func_8094156C(this, play) == 0) {
if ((this->collider.base.atFlags & AT_HIT) && !(player->stateFlags3 & PLAYER_STATE3_80000)) {
func_800B8D50(play, &this->actor, 2.0f, this->actor.yawTowardsPlayer, 0.0f, 0);
- func_800B8E58(player, NA_SE_PL_BODY_HIT);
+ Player_PlaySfx(player, NA_SE_PL_BODY_HIT);
if (((this->actor.home.rot.z & 3) == 1) || ((this->actor.home.rot.z & 3) == 2)) {
this->unk_1CC = 50;
}
@@ -1302,7 +1303,7 @@ void func_809420F0(EnGoroiwa* this, PlayState* play) {
func_8093FC00(this);
func_809419D0(this);
this->unk_1E5 &= ~0x10;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
}
}
@@ -1431,7 +1432,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 &
@@ -1440,8 +1441,8 @@ void EnGoroiwa_Update(Actor* thisx, PlayState* play) {
this->unk_1CC--;
}
- if ((ENGOROIWA_GET_3000(&this->actor) == ENGOROIWA_3000_2) && (this->actor.bgCheckFlags & 1) &&
- (this->actionFunc == func_80941A10) && (this->actor.speedXZ > 2.0f)) {
+ if ((ENGOROIWA_GET_3000(&this->actor) == ENGOROIWA_3000_2) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
+ (this->actionFunc == func_80941A10) && (this->actor.speed > 2.0f)) {
Math_StepToF(&this->actor.scale.x, 0.16f,
(this->actor.xzDistToPlayer < 400.0f) ? this->unk_1E0 * 1.4f : this->unk_1E0);
@@ -1453,9 +1454,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 +1486,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:
@@ -1497,15 +1499,18 @@ void EnGoroiwa_Update(Actor* thisx, PlayState* play) {
if (this->actor.floorHeight > BGCHECK_Y_MIN) {
this->actor.floorBgId = bgId;
if (this->actor.world.pos.y <= (this->actor.floorHeight + 2.0f)) {
- this->actor.bgCheckFlags |= 1;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_GROUND;
} else {
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
}
} else {
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
this->actor.floorBgId = 50;
}
break;
+
+ default:
+ break;
}
func_8093FAA4(this, play);
@@ -1574,7 +1579,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 eb7948ffb..90b39f860 100644
--- a/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.c
+++ b/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.c
@@ -5,9 +5,10 @@
*/
#include "z_en_grasshopper.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnGrasshopper*)thisx)
@@ -42,99 +43,171 @@ void EnGrasshopper_UpdateEffects(EnGrasshopper* this, PlayState* play);
void EnGrasshopper_DrawEffects(EnGrasshopper* this, PlayState* play);
typedef enum {
- /* 0 */ EN_GRASSHOPPER_ACTION_FLY,
- /* 1 */ EN_GRASSHOPPER_ACTION_ROAM_IN_CIRCLES,
- /* 2 */ EN_GRASSHOPPER_ACTION_BANK,
- /* 3 */ EN_GRASSHOPPER_ACTION_BOUNCED,
- /* 4 */ EN_GRASSHOPPER_ACTION_DECIDE_ACTION,
- /* 5 */ EN_GRASSHOPPER_ACTION_APPROACH_PLAYER,
- /* 6 */ EN_GRASSHOPPER_ACTION_ATTACK,
- /* 7 */ EN_GRASSHOPPER_ACTION_WAIT_AFTER_ATTACK,
- /* 8 */ EN_GRASSHOPPER_ACTION_DAMAGED,
- /* 9 */ EN_GRASSHOPPER_ACTION_DEAD,
- /* 10 */ EN_GRASSHOPPER_ACTION_FALL,
+ /* 0 */ DRAGONFLY_ACTION_FLY,
+ /* 1 */ DRAGONFLY_ACTION_ROAM_IN_CIRCLES,
+ /* 2 */ DRAGONFLY_ACTION_BANK,
+ /* 3 */ DRAGONFLY_ACTION_BOUNCED,
+ /* 4 */ DRAGONFLY_ACTION_DECIDE_ACTION,
+ /* 5 */ DRAGONFLY_ACTION_APPROACH_PLAYER,
+ /* 6 */ DRAGONFLY_ACTION_ATTACK,
+ /* 7 */ DRAGONFLY_ACTION_WAIT_AFTER_ATTACK,
+ /* 8 */ DRAGONFLY_ACTION_DAMAGED,
+ /* 9 */ DRAGONFLY_ACTION_DEAD,
+ /* 10 */ DRAGONFLY_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
+ /* 0 */ DRAGONFLY_DECISION_ATTACK,
+ /* 1 */ DRAGONFLY_DECISION_FLY,
+ /* 2 */ DRAGONFLY_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,
+ /* 0 */ DRAGONFLY_BANK_STATE_BANKING,
+ /* 1 */ DRAGONFLY_BANK_STATE_DONE
} EnGrasshopperBankState;
typedef enum {
- /* 0 */ EN_GRASSHOPPER_ANIM_RAISE_TAIL,
- /* 1 */ EN_GRASSHOPPER_ANIM_LOWER_TAIL,
- /* 2 */ EN_GRASSHOPPER_ANIM_FLY,
- /* 3 */ EN_GRASSHOPPER_ANIM_ATTACK,
- /* 4 */ EN_GRASSHOPPER_ANIM_HOVER,
- /* 5 */ EN_GRASSHOPPER_ANIM_DAMAGE,
- /* 6 */ EN_GRASSHOPPER_ANIM_DEAD,
- /* 7 */ EN_GRASSHOPPER_ANIM_FALL,
-} EnGrasshopperAnim;
+ /* 0 */ DRAGONFLY_ANIM_RAISE_TAIL,
+ /* 1 */ DRAGONFLY_ANIM_LOWER_TAIL,
+ /* 2 */ DRAGONFLY_ANIM_FLY,
+ /* 3 */ DRAGONFLY_ANIM_ATTACK,
+ /* 4 */ DRAGONFLY_ANIM_HOVER,
+ /* 5 */ DRAGONFLY_ANIM_DAMAGE,
+ /* 6 */ DRAGONFLY_ANIM_DEAD,
+ /* 7 */ DRAGONFLY_ANIM_FALL,
+ /* 8 */ DRAGONFLY_ANIM_MAX
+} DragonflyAnimation;
static s32 sOccupiedIndices[] = {
false, false, false, false, false,
};
-static s8 sLimbIndexToShadowBodyPartsIndex[DRAGONFLY_LIMB_MAX] = {
- -1, -1, 0, 1, 2, 3, 4, 5, -1, -1, 6, 7, -1, 8, 9, -1, 10, 11, -1, 12, 13, -1, -1, -1,
+static s8 sLimbToShadowBodyParts[DRAGONFLY_LIMB_MAX] = {
+ BODYPART_NONE, // DRAGONFLY_LIMB_NONE
+ BODYPART_NONE, // DRAGONFLY_LIMB_ROOT
+ DRAGONFLY_SHADOW_BODYPART_0, // DRAGONFLY_LIMB_TAIL_SEGMENT_1
+ DRAGONFLY_SHADOW_BODYPART_1, // DRAGONFLY_LIMB_TAIL_SEGMENT_2
+ DRAGONFLY_SHADOW_BODYPART_2, // DRAGONFLY_LIMB_TAIL_SEGMENT_3
+ DRAGONFLY_SHADOW_BODYPART_3, // DRAGONFLY_LIMB_TAIL_SEGMENT_4
+ DRAGONFLY_SHADOW_BODYPART_4, // DRAGONFLY_LIMB_TAIL_TIP
+ DRAGONFLY_SHADOW_BODYPART_5, // DRAGONFLY_LIMB_THORAX
+ BODYPART_NONE, // DRAGONFLY_LIMB_LEFT_WING
+ BODYPART_NONE, // DRAGONFLY_LIMB_RIGHT_WING
+ DRAGONFLY_SHADOW_BODYPART_6, // DRAGONFLY_LIMB_BACK_LEFT_UPPER_LEG
+ DRAGONFLY_SHADOW_BODYPART_7, // DRAGONFLY_LIMB_BACK_LEFT_LOWER_LEG
+ BODYPART_NONE, // DRAGONFLY_LIMB_BACK_LEFT_FOOT
+ DRAGONFLY_SHADOW_BODYPART_8, // DRAGONFLY_LIMB_BACK_RIGHT_UPPER_LEG
+ DRAGONFLY_SHADOW_BODYPART_9, // DRAGONFLY_LIMB_BACK_RIGHT_LOWER_LEG
+ BODYPART_NONE, // DRAGONFLY_LIMB_BACK_RIGHT_FOOT
+ DRAGONFLY_SHADOW_BODYPART_10, // DRAGONFLY_LIMB_FRONT_LEFT_UPPER_LEG
+ DRAGONFLY_SHADOW_BODYPART_11, // DRAGONFLY_LIMB_FRONT_LEFT_LOWER_LEG
+ BODYPART_NONE, // DRAGONFLY_LIMB_FRONT_LEFT_FOOT
+ DRAGONFLY_SHADOW_BODYPART_12, // DRAGONFLY_LIMB_FRONT_RIGHT_UPPER_LEG
+ DRAGONFLY_SHADOW_BODYPART_13, // DRAGONFLY_LIMB_FRONT_RIGHT_LOWER_LEG
+ BODYPART_NONE, // DRAGONFLY_LIMB_FRONT_RIGHT_FOOT
+ BODYPART_NONE, // DRAGONFLY_LIMB_HEAD
+ BODYPART_NONE, // DRAGONFLY_LIMB_JAW
};
-static s8 sParentBodyParts[DRAGONFLY_LIMB_MAX] = {
- -1, -1, -1, 0, 1, 2, 3, -1, -1, -1, -1, 6, -1, -1, 8, -1, -1, 10, -1, -1, 12, -1, -1, -1,
+// Should be `DRAGONFLY_SHADOW_BODYPART_MAX`
+static s8 sParentShadowBodyParts[DRAGONFLY_LIMB_MAX] = {
+ BODYPART_NONE, // DRAGONFLY_SHADOW_BODYPART_0
+ BODYPART_NONE, // DRAGONFLY_SHADOW_BODYPART_1
+ BODYPART_NONE, // DRAGONFLY_SHADOW_BODYPART_2
+ DRAGONFLY_SHADOW_BODYPART_0, // DRAGONFLY_SHADOW_BODYPART_3
+ DRAGONFLY_SHADOW_BODYPART_1, // DRAGONFLY_SHADOW_BODYPART_4
+ DRAGONFLY_SHADOW_BODYPART_2, // DRAGONFLY_SHADOW_BODYPART_5
+ DRAGONFLY_SHADOW_BODYPART_3, // DRAGONFLY_SHADOW_BODYPART_6
+ BODYPART_NONE, // DRAGONFLY_SHADOW_BODYPART_7
+ BODYPART_NONE, // DRAGONFLY_SHADOW_BODYPART_8
+ BODYPART_NONE, // DRAGONFLY_SHADOW_BODYPART_9
+ BODYPART_NONE, // DRAGONFLY_SHADOW_BODYPART_10
+ DRAGONFLY_SHADOW_BODYPART_6, // DRAGONFLY_SHADOW_BODYPART_11
+ BODYPART_NONE, // DRAGONFLY_SHADOW_BODYPART_12
+ BODYPART_NONE, // DRAGONFLY_SHADOW_BODYPART_13
+ DRAGONFLY_SHADOW_BODYPART_8, //
+ BODYPART_NONE, //
+ BODYPART_NONE, //
+ DRAGONFLY_SHADOW_BODYPART_10, //
+ BODYPART_NONE, //
+ BODYPART_NONE, //
+ DRAGONFLY_SHADOW_BODYPART_12, //
+ BODYPART_NONE, //
+ BODYPART_NONE, //
+ BODYPART_NONE, //
};
+// Should be `DRAGONFLY_SHADOW_BODYPART_MAX`
static u8 sShadowSizes[DRAGONFLY_LIMB_MAX] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, // DRAGONFLY_SHADOW_BODYPART_0
+ 0, // DRAGONFLY_SHADOW_BODYPART_1
+ 0, // DRAGONFLY_SHADOW_BODYPART_2
+ 0, // DRAGONFLY_SHADOW_BODYPART_3
+ 0, // DRAGONFLY_SHADOW_BODYPART_4
+ 0, // DRAGONFLY_SHADOW_BODYPART_5
+ 0, // DRAGONFLY_SHADOW_BODYPART_6
+ 0, // DRAGONFLY_SHADOW_BODYPART_7
+ 0, // DRAGONFLY_SHADOW_BODYPART_8
+ 0, // DRAGONFLY_SHADOW_BODYPART_9
+ 0, // DRAGONFLY_SHADOW_BODYPART_10
+ 0, // DRAGONFLY_SHADOW_BODYPART_11
+ 0, // DRAGONFLY_SHADOW_BODYPART_12
+ 0, // DRAGONFLY_SHADOW_BODYPART_13
+ 0, //
+ 0, //
+ 0, //
+ 0, //
+ 0, //
+ 0, //
+ 0, //
+ 0, //
+ 0, //
+ 0, //
};
typedef enum {
- /* 0x0 */ EN_GRASSHOPPER_DMGEFF_IMMUNE, // Deals no damage
- /* 0x2 */ EN_GRASSHOPPER_DMGEFF_FIRE = 0x2, // Damages and sets the Dragonfly on fire
- /* 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
+ /* 0x0 */ DRAGONFLY_DMGEFF_IMMUNE, // Deals no damage
+ /* 0x2 */ DRAGONFLY_DMGEFF_FIRE = 0x2, // Damages and sets the Dragonfly on fire
+ /* 0x3 */ DRAGONFLY_DMGEFF_FREEZE, // Damages and freezes the Dragonfly in ice
+ /* 0x4 */ DRAGONFLY_DMGEFF_LIGHT_ORB, // Damages and surrounds the Dragonfly with light orbs
+ /* 0xE */ DRAGONFLY_DMGEFF_HOOK = 0xE, // If hit by the Hookshot, it pulls the Dragonfly towards the player
+ /* 0xF */ DRAGONFLY_DMGEFF_NONE // Deals regular damage with no extra effect
} EnDragonflyDamageEffect;
static DamageTable sDamageTable = {
- /* Deku Nut */ DMG_ENTRY(1, EN_GRASSHOPPER_DMGEFF_NONE),
- /* Deku Stick */ DMG_ENTRY(1, EN_GRASSHOPPER_DMGEFF_NONE),
- /* Horse trample */ DMG_ENTRY(0, EN_GRASSHOPPER_DMGEFF_IMMUNE),
- /* Explosives */ DMG_ENTRY(1, EN_GRASSHOPPER_DMGEFF_NONE),
- /* Zora boomerang */ DMG_ENTRY(1, EN_GRASSHOPPER_DMGEFF_NONE),
- /* Normal arrow */ DMG_ENTRY(1, EN_GRASSHOPPER_DMGEFF_NONE),
- /* UNK_DMG_0x06 */ DMG_ENTRY(0, EN_GRASSHOPPER_DMGEFF_IMMUNE),
- /* Hookshot */ DMG_ENTRY(0, EN_GRASSHOPPER_DMGEFF_HOOK),
- /* Goron punch */ DMG_ENTRY(1, EN_GRASSHOPPER_DMGEFF_NONE),
- /* Sword */ DMG_ENTRY(1, EN_GRASSHOPPER_DMGEFF_NONE),
- /* Goron pound */ DMG_ENTRY(0, EN_GRASSHOPPER_DMGEFF_NONE),
- /* Fire arrow */ DMG_ENTRY(2, EN_GRASSHOPPER_DMGEFF_FIRE),
- /* Ice arrow */ DMG_ENTRY(2, EN_GRASSHOPPER_DMGEFF_FREEZE),
- /* Light arrow */ DMG_ENTRY(2, EN_GRASSHOPPER_DMGEFF_LIGHT_ORB),
- /* Goron spikes */ DMG_ENTRY(1, EN_GRASSHOPPER_DMGEFF_NONE),
- /* Deku spin */ DMG_ENTRY(1, EN_GRASSHOPPER_DMGEFF_NONE),
- /* Deku bubble */ DMG_ENTRY(1, EN_GRASSHOPPER_DMGEFF_NONE),
- /* Deku launch */ DMG_ENTRY(2, EN_GRASSHOPPER_DMGEFF_NONE),
- /* UNK_DMG_0x12 */ DMG_ENTRY(1, EN_GRASSHOPPER_DMGEFF_NONE),
- /* Zora barrier */ DMG_ENTRY(1, EN_GRASSHOPPER_DMGEFF_NONE),
- /* Normal shield */ DMG_ENTRY(0, EN_GRASSHOPPER_DMGEFF_IMMUNE),
- /* Light ray */ DMG_ENTRY(0, EN_GRASSHOPPER_DMGEFF_IMMUNE),
- /* Thrown object */ DMG_ENTRY(1, EN_GRASSHOPPER_DMGEFF_NONE),
- /* Zora punch */ DMG_ENTRY(1, EN_GRASSHOPPER_DMGEFF_NONE),
- /* Spin attack */ DMG_ENTRY(1, EN_GRASSHOPPER_DMGEFF_NONE),
- /* Sword beam */ DMG_ENTRY(0, EN_GRASSHOPPER_DMGEFF_IMMUNE),
- /* Normal Roll */ DMG_ENTRY(0, EN_GRASSHOPPER_DMGEFF_IMMUNE),
- /* UNK_DMG_0x1B */ DMG_ENTRY(0, EN_GRASSHOPPER_DMGEFF_IMMUNE),
- /* UNK_DMG_0x1C */ DMG_ENTRY(0, EN_GRASSHOPPER_DMGEFF_IMMUNE),
- /* Unblockable */ DMG_ENTRY(0, EN_GRASSHOPPER_DMGEFF_IMMUNE),
- /* UNK_DMG_0x1E */ DMG_ENTRY(0, EN_GRASSHOPPER_DMGEFF_IMMUNE),
- /* Powder Keg */ DMG_ENTRY(1, EN_GRASSHOPPER_DMGEFF_HOOK),
+ /* Deku Nut */ DMG_ENTRY(1, DRAGONFLY_DMGEFF_NONE),
+ /* Deku Stick */ DMG_ENTRY(1, DRAGONFLY_DMGEFF_NONE),
+ /* Horse trample */ DMG_ENTRY(0, DRAGONFLY_DMGEFF_IMMUNE),
+ /* Explosives */ DMG_ENTRY(1, DRAGONFLY_DMGEFF_NONE),
+ /* Zora boomerang */ DMG_ENTRY(1, DRAGONFLY_DMGEFF_NONE),
+ /* Normal arrow */ DMG_ENTRY(1, DRAGONFLY_DMGEFF_NONE),
+ /* UNK_DMG_0x06 */ DMG_ENTRY(0, DRAGONFLY_DMGEFF_IMMUNE),
+ /* Hookshot */ DMG_ENTRY(0, DRAGONFLY_DMGEFF_HOOK),
+ /* Goron punch */ DMG_ENTRY(1, DRAGONFLY_DMGEFF_NONE),
+ /* Sword */ DMG_ENTRY(1, DRAGONFLY_DMGEFF_NONE),
+ /* Goron pound */ DMG_ENTRY(0, DRAGONFLY_DMGEFF_NONE),
+ /* Fire arrow */ DMG_ENTRY(2, DRAGONFLY_DMGEFF_FIRE),
+ /* Ice arrow */ DMG_ENTRY(2, DRAGONFLY_DMGEFF_FREEZE),
+ /* Light arrow */ DMG_ENTRY(2, DRAGONFLY_DMGEFF_LIGHT_ORB),
+ /* Goron spikes */ DMG_ENTRY(1, DRAGONFLY_DMGEFF_NONE),
+ /* Deku spin */ DMG_ENTRY(1, DRAGONFLY_DMGEFF_NONE),
+ /* Deku bubble */ DMG_ENTRY(1, DRAGONFLY_DMGEFF_NONE),
+ /* Deku launch */ DMG_ENTRY(2, DRAGONFLY_DMGEFF_NONE),
+ /* UNK_DMG_0x12 */ DMG_ENTRY(1, DRAGONFLY_DMGEFF_NONE),
+ /* Zora barrier */ DMG_ENTRY(1, DRAGONFLY_DMGEFF_NONE),
+ /* Normal shield */ DMG_ENTRY(0, DRAGONFLY_DMGEFF_IMMUNE),
+ /* Light ray */ DMG_ENTRY(0, DRAGONFLY_DMGEFF_IMMUNE),
+ /* Thrown object */ DMG_ENTRY(1, DRAGONFLY_DMGEFF_NONE),
+ /* Zora punch */ DMG_ENTRY(1, DRAGONFLY_DMGEFF_NONE),
+ /* Spin attack */ DMG_ENTRY(1, DRAGONFLY_DMGEFF_NONE),
+ /* Sword beam */ DMG_ENTRY(0, DRAGONFLY_DMGEFF_IMMUNE),
+ /* Normal Roll */ DMG_ENTRY(0, DRAGONFLY_DMGEFF_IMMUNE),
+ /* UNK_DMG_0x1B */ DMG_ENTRY(0, DRAGONFLY_DMGEFF_IMMUNE),
+ /* UNK_DMG_0x1C */ DMG_ENTRY(0, DRAGONFLY_DMGEFF_IMMUNE),
+ /* Unblockable */ DMG_ENTRY(0, DRAGONFLY_DMGEFF_IMMUNE),
+ /* UNK_DMG_0x1E */ DMG_ENTRY(0, DRAGONFLY_DMGEFF_IMMUNE),
+ /* Powder Keg */ DMG_ENTRY(1, DRAGONFLY_DMGEFF_HOOK),
};
ActorInit En_Grasshopper_InitVars = {
@@ -192,7 +265,7 @@ void EnGrasshopper_Init(Actor* thisx, PlayState* play) {
s32 i;
this->actor.hintId = TATL_HINT_ID_DRAGONFLY;
- this->actor.targetMode = 4;
+ this->actor.targetMode = TARGET_MODE_4;
this->actor.colChkInfo.mass = 60;
this->actor.colChkInfo.health = 2;
@@ -210,7 +283,7 @@ void EnGrasshopper_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, NULL, 1.0f);
this->actor.colChkInfo.damageTable = &sDamageTable;
Math_Vec3f_Copy(&this->flyingHomePos, &this->actor.home.pos);
- this->action = EN_GRASSHOPPER_ACTION_FLY;
+ this->action = DRAGONFLY_ACTION_FLY;
this->index = -1;
for (i = 0; i < ARRAY_COUNT(sOccupiedIndices); i++) {
@@ -228,12 +301,12 @@ void EnGrasshopper_Init(Actor* thisx, PlayState* play) {
SkelAnime_Init(play, &this->skelAnime, &gDragonflySkel, &gDragonflyFlyAnim, this->jointTable, this->morphTable,
DRAGONFLY_LIMB_MAX);
- this->type = EN_GRASSHOPPER_GET_TYPE(&this->actor);
- if (this->type < EN_GRASSHOPPER_TYPE_UNUSED_NORMAL) {
- this->type = EN_GRASSHOPPER_TYPE_NORMAL;
+ this->type = DRAGONFLY_GET_TYPE(&this->actor);
+ if (this->type < DRAGONFLY_TYPE_UNUSED_NORMAL) {
+ this->type = DRAGONFLY_TYPE_NORMAL;
}
- if (this->type != EN_GRASSHOPPER_TYPE_GROWS_WHEN_SPAWNED) {
+ if (this->type != DRAGONFLY_TYPE_GROWS_WHEN_SPAWNED) {
this->dragonflyScale = 0.01f;
} else {
this->dragonflyScale = 0.0f;
@@ -246,7 +319,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);
}
@@ -261,70 +334,70 @@ void EnGrasshopper_Destroy(Actor* thisx, PlayState* play) {
sOccupiedIndices[this->index] = false;
}
-static AnimationHeader* sAnimations[] = {
- &gDragonflyRaiseTailAnim, // EN_GRASSHOPPER_ANIM_RAISE_TAIL
- &gDragonflyLowerTailAnim, // EN_GRASSHOPPER_ANIM_LOWER_TAIL
- &gDragonflyFlyAnim, // EN_GRASSHOPPER_ANIM_FLY
- &gDragonflyAttackAnim, // EN_GRASSHOPPER_ANIM_ATTACK
- &gDragonflyHoverAnim, // EN_GRASSHOPPER_ANIM_HOVER
- &gDragonflyDamageAnim, // EN_GRASSHOPPER_ANIM_DAMAGE
- &gDragonflyDeadAnim, // EN_GRASSHOPPER_ANIM_DEAD
- &gDragonflyFallAnim, // EN_GRASSHOPPER_ANIM_FALL
+static AnimationHeader* sAnimations[DRAGONFLY_ANIM_MAX] = {
+ &gDragonflyRaiseTailAnim, // DRAGONFLY_ANIM_RAISE_TAIL
+ &gDragonflyLowerTailAnim, // DRAGONFLY_ANIM_LOWER_TAIL
+ &gDragonflyFlyAnim, // DRAGONFLY_ANIM_FLY
+ &gDragonflyAttackAnim, // DRAGONFLY_ANIM_ATTACK
+ &gDragonflyHoverAnim, // DRAGONFLY_ANIM_HOVER
+ &gDragonflyDamageAnim, // DRAGONFLY_ANIM_DAMAGE
+ &gDragonflyDeadAnim, // DRAGONFLY_ANIM_DEAD
+ &gDragonflyFallAnim, // DRAGONFLY_ANIM_FALL
};
-static u8 sAnimationModes[] = {
- ANIMMODE_ONCE, // EN_GRASSHOPPER_ANIM_RAISE_TAIL
- ANIMMODE_ONCE, // EN_GRASSHOPPER_ANIM_LOWER_TAIL
- ANIMMODE_LOOP, // EN_GRASSHOPPER_ANIM_FLY
- ANIMMODE_ONCE, // EN_GRASSHOPPER_ANIM_ATTACK
- ANIMMODE_LOOP, // EN_GRASSHOPPER_ANIM_HOVER
- ANIMMODE_ONCE, // EN_GRASSHOPPER_ANIM_DAMAGE
- ANIMMODE_ONCE, // EN_GRASSHOPPER_ANIM_DEAD
- ANIMMODE_ONCE, // EN_GRASSHOPPER_ANIM_FALL
+static u8 sAnimationModes[DRAGONFLY_ANIM_MAX] = {
+ ANIMMODE_ONCE, // DRAGONFLY_ANIM_RAISE_TAIL
+ ANIMMODE_ONCE, // DRAGONFLY_ANIM_LOWER_TAIL
+ ANIMMODE_LOOP, // DRAGONFLY_ANIM_FLY
+ ANIMMODE_ONCE, // DRAGONFLY_ANIM_ATTACK
+ ANIMMODE_LOOP, // DRAGONFLY_ANIM_HOVER
+ ANIMMODE_ONCE, // DRAGONFLY_ANIM_DAMAGE
+ ANIMMODE_ONCE, // DRAGONFLY_ANIM_DEAD
+ ANIMMODE_ONCE, // DRAGONFLY_ANIM_FALL
};
void EnGrasshopper_ChangeAnim(EnGrasshopper* this, s32 animIndex) {
f32 morphFrames;
- this->endFrame = Animation_GetLastFrame(sAnimations[animIndex]);
+ this->animEndFrame = Animation_GetLastFrame(sAnimations[animIndex]);
morphFrames = 0.0f;
- if ((animIndex == EN_GRASSHOPPER_ANIM_ATTACK) || (animIndex == EN_GRASSHOPPER_ANIM_HOVER) ||
- (animIndex == EN_GRASSHOPPER_ANIM_DAMAGE)) {
+ if ((animIndex == DRAGONFLY_ANIM_ATTACK) || (animIndex == DRAGONFLY_ANIM_HOVER) ||
+ (animIndex == DRAGONFLY_ANIM_DAMAGE)) {
morphFrames = -3.0f;
}
- Animation_Change(&this->skelAnime, sAnimations[animIndex], 1.0f, 0.0f, this->endFrame, sAnimationModes[animIndex],
- morphFrames);
+ Animation_Change(&this->skelAnime, sAnimations[animIndex], 1.0f, 0.0f, this->animEndFrame,
+ sAnimationModes[animIndex], morphFrames);
}
void EnGrasshopper_RaiseTail(EnGrasshopper* this) {
- EnGrasshopper_ChangeAnim(this, EN_GRASSHOPPER_ANIM_RAISE_TAIL);
- if (this->decision != EN_GRASSHOPPER_DECISION_ROAM_IN_CIRCLES) {
- this->decision = EN_GRASSHOPPER_DECISION_FLY;
+ EnGrasshopper_ChangeAnim(this, DRAGONFLY_ANIM_RAISE_TAIL);
+ if (this->decision != DRAGONFLY_DECISION_ROAM_IN_CIRCLES) {
+ this->decision = DRAGONFLY_DECISION_FLY;
}
- this->action = EN_GRASSHOPPER_ACTION_DECIDE_ACTION;
+ this->action = DRAGONFLY_ACTION_DECIDE_ACTION;
this->actionFunc = EnGrasshopper_DecideAction;
}
void EnGrasshopper_LowerTail(EnGrasshopper* this) {
- EnGrasshopper_ChangeAnim(this, EN_GRASSHOPPER_ANIM_LOWER_TAIL);
- this->action = EN_GRASSHOPPER_ACTION_DECIDE_ACTION;
- this->decision = EN_GRASSHOPPER_DECISION_ATTACK;
+ EnGrasshopper_ChangeAnim(this, DRAGONFLY_ANIM_LOWER_TAIL);
+ this->action = DRAGONFLY_ACTION_DECIDE_ACTION;
+ this->decision = DRAGONFLY_DECISION_ATTACK;
this->actionFunc = EnGrasshopper_DecideAction;
}
void EnGrasshopper_DecideAction(EnGrasshopper* this, PlayState* play) {
f32 curFrame = this->skelAnime.curFrame;
- if (curFrame >= this->endFrame) {
- if (this->decision == EN_GRASSHOPPER_DECISION_ATTACK) {
+ if (curFrame >= this->animEndFrame) {
+ if (this->decision == DRAGONFLY_DECISION_ATTACK) {
EnGrasshopper_SetupAttack(this);
} else {
Math_Vec3f_Copy(&this->flyingHomePos, &this->actor.world.pos);
this->flyingHomePos.y = this->actor.floorHeight + 90.0f;
- EnGrasshopper_ChangeAnim(this, EN_GRASSHOPPER_ANIM_FLY);
- if (this->decision != EN_GRASSHOPPER_DECISION_ROAM_IN_CIRCLES) {
+ EnGrasshopper_ChangeAnim(this, DRAGONFLY_ANIM_FLY);
+ if (this->decision != DRAGONFLY_DECISION_ROAM_IN_CIRCLES) {
if (Player_GetMask(play) == PLAYER_MASK_STONE) {
EnGrasshopper_SetupFly(this);
} else {
@@ -332,8 +405,8 @@ void EnGrasshopper_DecideAction(EnGrasshopper* this, PlayState* play) {
}
} else {
this->timer = 0;
- this->action = EN_GRASSHOPPER_ACTION_ROAM_IN_CIRCLES;
- this->decision = EN_GRASSHOPPER_DECISION_ATTACK;
+ this->action = DRAGONFLY_ACTION_ROAM_IN_CIRCLES;
+ this->decision = DRAGONFLY_DECISION_ATTACK;
this->waitTimer = this->timer;
this->actionFunc = EnGrasshopper_RoamInCircles;
}
@@ -342,9 +415,9 @@ 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->action = EN_GRASSHOPPER_ACTION_FLY;
+ EnGrasshopper_ChangeAnim(this, DRAGONFLY_ANIM_FLY);
+ this->baseFlyHeight = Rand_CenteredFloat(50.0f) + this->flyingHomePos.y;
+ this->action = DRAGONFLY_ACTION_FLY;
this->actionFunc = EnGrasshopper_Fly;
}
@@ -354,11 +427,10 @@ void EnGrasshopper_Fly(EnGrasshopper* this, PlayState* play) {
f32 targetSpeed;
Vec3f collisionCheckPos;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BATTA_FLY - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BATTA_FLY - SFX_FLAG);
diffX = this->flyingHomePos.x - this->actor.world.pos.x;
diffZ = this->flyingHomePos.z - this->actor.world.pos.z;
- if ((this->type != EN_GRASSHOPPER_TYPE_WOODFALL_TEMPLE_FINAL_ROOM) &&
- (this->type != EN_GRASSHOPPER_TYPE_WOODFALL)) {
+ if ((this->type != DRAGONFLY_TYPE_WOODFALL_TEMPLE_FINAL_ROOM) && (this->type != DRAGONFLY_TYPE_WOODFALL)) {
this->bobPhase += 0xAF0;
this->targetPosY = (Math_SinS(this->bobPhase) * 10.0f) + this->baseFlyHeight;
Math_ApproachF(&this->actor.world.pos.y, this->targetPosY, 0.1f, 10.0f);
@@ -376,15 +448,15 @@ void EnGrasshopper_Fly(EnGrasshopper* this, PlayState* play) {
this->shouldTurn = false;
}
- //! @bug Unreachable code. To get here, the type must NOT be EN_GRASSHOPPER_TYPE_WOODFALL
- if (this->type == EN_GRASSHOPPER_TYPE_WOODFALL) {
+ //! @bug Unreachable code. To get here, the type must NOT be DRAGONFLY_TYPE_WOODFALL
+ if (this->type == DRAGONFLY_TYPE_WOODFALL) {
if (sqrtf(SQ(this->actor.world.pos.x) + SQ(this->actor.world.pos.z)) < 600.0f) {
this->shouldTurn = true;
}
}
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);
}
@@ -397,22 +469,22 @@ void EnGrasshopper_Fly(EnGrasshopper* this, PlayState* play) {
Math_SmoothStepToS(&this->actor.world.rot.z, this->targetRot.z, 5, 0x3E8, 5);
this->targetRot.z *= 0.8f;
if (this->waitTimer != 0) {
- Math_ApproachZeroF(&this->actor.speedXZ, 0.2f, 0.5f);
+ Math_ApproachZeroF(&this->actor.speed, 0.2f, 0.5f);
} else {
this->targetRot.z = (this->actor.world.rot.y - this->targetRot.y) * 0.2f;
targetSpeed = (this->index * 0.1f) + 4.0f;
- Math_ApproachF(&this->actor.speedXZ, targetSpeed, 0.4f, 0.7f);
- Math_ApproachF(&this->rotationalVelocity, 2000.0f, 1.0f, 50.0f);
- Math_SmoothStepToS(&this->actor.world.rot.y, this->targetRot.y, 5, this->rotationalVelocity, 5);
+ Math_ApproachF(&this->actor.speed, targetSpeed, 0.4f, 0.7f);
+ Math_ApproachF(&this->angularVelocity, 2000.0f, 1.0f, 50.0f);
+ Math_SmoothStepToS(&this->actor.world.rot.y, this->targetRot.y, 5, this->angularVelocity, 5);
if (this->timer == 0) {
if (Rand_ZeroFloat(1.0f) < 0.3f) {
this->waitTimer = Rand_S16Offset(10, 10);
- this->rotationalVelocity = 0.0f;
+ this->angularVelocity = 0.0f;
}
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;
}
}
}
@@ -430,7 +502,7 @@ void EnGrasshopper_RoamInCircles(EnGrasshopper* this, PlayState* play) {
Vec3f collisionCheckPos;
Player* player = GET_PLAYER(play);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BATTA_FLY - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BATTA_FLY - SFX_FLAG);
if (Player_GetMask(play) == PLAYER_MASK_STONE) {
EnGrasshopper_SetupFly(this);
} else {
@@ -441,7 +513,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);
}
@@ -450,7 +522,8 @@ void EnGrasshopper_RoamInCircles(EnGrasshopper* this, PlayState* play) {
collisionCheckPos.y = this->actor.world.pos.y;
collisionCheckPos.z = (Math_CosS(this->actor.shape.rot.y) * 100.0f) + this->actor.world.pos.z;
- if ((this->actor.bgCheckFlags & 8) || BgCheck_SphVsFirstPoly(&play->colCtx, &collisionCheckPos, 10.0f)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) ||
+ BgCheck_SphVsFirstPoly(&play->colCtx, &collisionCheckPos, 10.0f)) {
EnGrasshopper_SetupBank(this);
} else if (player->stateFlags1 & PLAYER_STATE1_8000000) {
this->collider.elements[0].info.toucherFlags |= (TOUCH_ON | TOUCH_SFX_WOOD);
@@ -464,7 +537,7 @@ void EnGrasshopper_RoamInCircles(EnGrasshopper* this, PlayState* play) {
rotationSpeed = this->index + 70;
targetSpeed = (this->index * 0.05f) + 4.0f;
this->targetRot.y = Math_Atan2S(diffX, diffZ);
- Math_ApproachF(&this->actor.speedXZ, targetSpeed, 0.4f, 0.8f);
+ Math_ApproachF(&this->actor.speed, targetSpeed, 0.4f, 0.8f);
Math_SmoothStepToS(&this->actor.world.rot.y, this->targetRot.y, rotationSpeed, 0xFA0, 0xA);
}
}
@@ -474,11 +547,11 @@ void EnGrasshopper_RoamInCircles(EnGrasshopper* this, PlayState* play) {
* Unused in the final game.
*/
void EnGrasshopper_SetupBank(EnGrasshopper* this) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BATTA_FLY - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BATTA_FLY - SFX_FLAG);
this->targetBankRot.y = this->actor.world.rot.y + 0x8000;
- this->action = EN_GRASSHOPPER_ACTION_BANK;
- this->bankState = EN_GRASSHOPPER_BANK_STATE_BANKING;
- this->actor.speedXZ = 2.0f;
+ this->action = DRAGONFLY_ACTION_BANK;
+ this->bankState = DRAGONFLY_BANK_STATE_BANKING;
+ this->actor.speed = 2.0f;
this->actionFunc = EnGrasshopper_Bank;
}
@@ -487,27 +560,30 @@ void EnGrasshopper_SetupBank(EnGrasshopper* this) {
* it flies forward for 100 frames.
*/
void EnGrasshopper_Bank(EnGrasshopper* this, PlayState* play) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BATTA_FLY - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BATTA_FLY - SFX_FLAG);
switch (this->bankState) {
- case EN_GRASSHOPPER_BANK_STATE_BANKING:
+ case DRAGONFLY_BANK_STATE_BANKING:
Math_SmoothStepToS(&this->actor.world.rot.y, this->targetBankRot.y, 0x64, 0x3E8, 0x3E8);
Math_SmoothStepToS(&this->actor.world.rot.z, 0x4000, 0x64, 0x1F40, 0xBB8);
if (fabsf(this->actor.world.rot.y - (f32)this->targetBankRot.y) < 10.0f) {
this->postBankTimer = 100;
- this->bankState = EN_GRASSHOPPER_BANK_STATE_DONE;
+ this->bankState = DRAGONFLY_BANK_STATE_DONE;
}
break;
- case EN_GRASSHOPPER_BANK_STATE_DONE:
+ case DRAGONFLY_BANK_STATE_DONE:
Math_SmoothStepToS(&this->actor.world.rot.z, 0, 0x64, 0x1F40, 0xBB8);
if (this->postBankTimer == 0) {
this->timer = 0;
- this->action = EN_GRASSHOPPER_ACTION_ROAM_IN_CIRCLES;
- this->decision = EN_GRASSHOPPER_DECISION_ATTACK;
+ this->action = DRAGONFLY_ACTION_ROAM_IN_CIRCLES;
+ this->decision = DRAGONFLY_DECISION_ATTACK;
this->waitTimer = this->timer;
this->actionFunc = EnGrasshopper_RoamInCircles;
}
break;
+
+ default:
+ break;
}
}
@@ -518,7 +594,7 @@ void EnGrasshopper_SetupBounced(EnGrasshopper* this) {
this->targetRot.y = -this->actor.yawTowardsPlayer;
this->timer = Rand_S16Offset(30, 30);
this->targetRot.z = (this->actor.world.rot.y - this->targetRot.y) * 0.2f;
- this->action = EN_GRASSHOPPER_ACTION_BOUNCED;
+ this->action = DRAGONFLY_ACTION_BOUNCED;
this->actionFunc = EnGrasshopper_Bounced;
}
@@ -529,16 +605,16 @@ void EnGrasshopper_SetupBounced(EnGrasshopper* this) {
void EnGrasshopper_Bounced(EnGrasshopper* this, PlayState* play) {
f32 targetSpeed;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BATTA_FLY - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BATTA_FLY - SFX_FLAG);
targetSpeed = (this->index * 0.05f) + 7.0f;
- Math_ApproachF(&this->actor.speedXZ, targetSpeed, 0.4f, 0.8f);
+ Math_ApproachF(&this->actor.speed, targetSpeed, 0.4f, 0.8f);
Math_SmoothStepToS(&this->actor.world.rot.z, this->targetRot.z, 5, 0x3E8, 5);
this->targetRot.z *= 0.8f;
- Math_SmoothStepToS(&this->actor.world.rot.y, this->targetRot.y, 5, this->rotationalVelocity, 5);
+ Math_SmoothStepToS(&this->actor.world.rot.y, this->targetRot.y, 5, this->angularVelocity, 5);
if (this->timer == 0) {
this->collider.elements[0].info.toucherFlags |= (TOUCH_ON | TOUCH_SFX_WOOD);
this->timer = 0;
- this->action = EN_GRASSHOPPER_ACTION_ROAM_IN_CIRCLES;
+ this->action = DRAGONFLY_ACTION_ROAM_IN_CIRCLES;
this->waitTimer = this->timer;
this->actionFunc = EnGrasshopper_RoamInCircles;
}
@@ -549,7 +625,7 @@ void EnGrasshopper_SetupApproachPlayer(EnGrasshopper* this, PlayState* play) {
Player* player = GET_PLAYER(play);
this->timer = 50;
- this->action = EN_GRASSHOPPER_ACTION_APPROACH_PLAYER;
+ this->action = DRAGONFLY_ACTION_APPROACH_PLAYER;
this->approachSpeed = 0.0f;
this->targetApproachPos.x = (Math_SinS(player->actor.shape.rot.y) * 130.0f) + player->actor.world.pos.x;
this->targetApproachPos.z = (Math_CosS(player->actor.shape.rot.y) * 130.0f) + player->actor.world.pos.z;
@@ -564,7 +640,7 @@ void EnGrasshopper_ApproachPlayer(EnGrasshopper* this, PlayState* play) {
WaterBox* waterBox;
Vec3f splashPos;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BATTA_FLY - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BATTA_FLY - SFX_FLAG);
this->bobPhase += 0xAF0;
this->targetApproachPos.y = (Math_SinS(this->bobPhase) * 10.0f) + (player->actor.world.pos.y + 120.0f);
@@ -582,8 +658,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);
}
@@ -600,15 +676,15 @@ void EnGrasshopper_ApproachPlayer(EnGrasshopper* this, PlayState* play) {
}
void EnGrasshopper_SetupAttack(EnGrasshopper* this) {
- EnGrasshopper_ChangeAnim(this, EN_GRASSHOPPER_ANIM_ATTACK);
+ EnGrasshopper_ChangeAnim(this, DRAGONFLY_ANIM_ATTACK);
this->approachSpeed = 0.0f;
Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 0xA, 0xFA0, 0xA);
- this->actor.speedXZ = 3.0f;
+ this->actor.speed = 3.0f;
this->baseFlyHeight = this->actor.world.pos.y;
this->collider.elements[0].info.toucherFlags &= ~(TOUCH_ON | TOUCH_SFX_WOOD);
this->collider.elements[1].info.toucherFlags |= (TOUCH_ON | TOUCH_SFX_WOOD);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BATTA_ATTACK);
- this->action = EN_GRASSHOPPER_ACTION_ATTACK;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BATTA_ATTACK);
+ this->action = DRAGONFLY_ACTION_ATTACK;
this->actionFunc = EnGrasshopper_Attack;
}
@@ -632,8 +708,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);
}
@@ -663,19 +739,19 @@ void EnGrasshopper_Attack(EnGrasshopper* this, PlayState* play) {
Math_ApproachF(&this->actor.world.pos.y, this->targetApproachPos.y, 0.1f, this->approachSpeed);
Math_ApproachF(&this->approachSpeed, 10.0f, 0.1f, 1.0f);
Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 0xA, 0xFA0, 0xA);
- if (curFrame >= this->endFrame) {
+ if (curFrame >= this->animEndFrame) {
EnGrasshopper_SetupWaitAfterAttack(this);
}
}
void EnGrasshopper_SetupWaitAfterAttack(EnGrasshopper* this) {
- EnGrasshopper_ChangeAnim(this, EN_GRASSHOPPER_ANIM_HOVER);
+ EnGrasshopper_ChangeAnim(this, DRAGONFLY_ANIM_HOVER);
this->bobPhase += 0xAF0;
this->targetPosY = (Math_SinS(this->bobPhase) * 10.0f) + this->baseFlyHeight;
Math_ApproachF(&this->actor.world.pos.y, this->targetPosY, 0.1f, 10.0f);
- this->action = EN_GRASSHOPPER_ACTION_WAIT_AFTER_ATTACK;
+ this->action = DRAGONFLY_ACTION_WAIT_AFTER_ATTACK;
this->waitTimer = 20;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->collider.elements[1].info.toucherFlags &= ~(TOUCH_ON | TOUCH_SFX_WOOD);
this->actionFunc = EnGrasshopper_WaitAfterAttack;
}
@@ -696,9 +772,9 @@ void EnGrasshopper_WaitAfterAttack(EnGrasshopper* this, PlayState* play) {
void EnGrasshopper_SetupDamaged(EnGrasshopper* this, PlayState* play) {
Vec3f damagedVelocity;
- EnGrasshopper_ChangeAnim(this, EN_GRASSHOPPER_ANIM_DAMAGE);
- this->actor.speedXZ = 0.0f;
- this->actor.flags |= ACTOR_FLAG_1;
+ EnGrasshopper_ChangeAnim(this, DRAGONFLY_ANIM_DAMAGE);
+ this->actor.speed = 0.0f;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->approachSpeed = 0.0f;
this->collider.elements[1].info.toucherFlags &= ~(TOUCH_ON | TOUCH_SFX_WOOD);
Matrix_RotateYS(this->actor.yawTowardsPlayer, MTXMODE_NEW);
@@ -707,13 +783,13 @@ void EnGrasshopper_SetupDamaged(EnGrasshopper* this, PlayState* play) {
if (((this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX) ||
(this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) &&
(this->drawDmgEffTimer != 0)) {
- Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, ARRAY_COUNT(this->bodyPartsPos), 2, 0.3f, 0.2f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, DRAGONFLY_BODYPART_MAX, 2, 0.3f, 0.2f);
this->drawDmgEffTimer = 0;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
}
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
- this->action = EN_GRASSHOPPER_ACTION_DAMAGED;
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
+ this->action = DRAGONFLY_ACTION_DAMAGED;
this->actionFunc = EnGrasshopper_Damaged;
}
@@ -725,9 +801,9 @@ void EnGrasshopper_Damaged(EnGrasshopper* this, PlayState* play) {
}
void EnGrasshopper_SetupDead(EnGrasshopper* this, PlayState* play) {
- EnGrasshopper_ChangeAnim(this, EN_GRASSHOPPER_ANIM_DEAD);
- this->actor.flags |= ACTOR_FLAG_8000000;
- this->actor.speedXZ = 0.0f;
+ EnGrasshopper_ChangeAnim(this, DRAGONFLY_ANIM_DEAD);
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ this->actor.speed = 0.0f;
this->approachSpeed = 0.0f;
this->actor.velocity.y = 5.0f;
this->actor.gravity = -0.5f;
@@ -737,10 +813,10 @@ void EnGrasshopper_SetupDead(EnGrasshopper* this, PlayState* play) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
}
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 25);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 25);
Enemy_StartFinishingBlow(play, &this->actor);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BATTA_DEAD);
- this->action = EN_GRASSHOPPER_ACTION_DEAD;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BATTA_DEAD);
+ this->action = DRAGONFLY_ACTION_DEAD;
this->actionFunc = EnGrasshopper_Dead;
}
@@ -754,21 +830,21 @@ void EnGrasshopper_Dead(EnGrasshopper* this, PlayState* play) {
if (((this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX) ||
(this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) &&
(this->drawDmgEffTimer < 2)) {
- Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, ARRAY_COUNT(this->bodyPartsPos), 2, 0.3f, 0.2f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, DRAGONFLY_BODYPART_MAX, 2, 0.3f, 0.2f);
this->drawDmgEffTimer = 0;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
}
- if (curFrame >= this->endFrame) {
+ if (curFrame >= this->animEndFrame) {
this->actor.flags &= ~ACTOR_FLAG_10;
EnGrasshopper_SetupFall(this);
}
}
void EnGrasshopper_SetupFall(EnGrasshopper* this) {
- EnGrasshopper_ChangeAnim(this, EN_GRASSHOPPER_ANIM_FALL);
- this->action = EN_GRASSHOPPER_ACTION_FALL;
- this->actor.speedXZ = 0.0f;
+ EnGrasshopper_ChangeAnim(this, DRAGONFLY_ANIM_FALL);
+ this->action = DRAGONFLY_ACTION_FALL;
+ this->actor.speed = 0.0f;
this->approachSpeed = 0.0f;
this->actionFunc = EnGrasshopper_Fall;
}
@@ -795,8 +871,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));
}
@@ -809,7 +885,7 @@ void EnGrasshopper_Fall(EnGrasshopper* this, PlayState* play) {
(((this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX)) ||
(this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) &&
(this->drawDmgEffTimer != 0)) {
- Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, ARRAY_COUNT(this->bodyPartsPos), 2, 0.3f, 0.2f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, DRAGONFLY_BODYPART_MAX, 2, 0.3f, 0.2f);
this->drawDmgEffTimer = 0;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
}
@@ -825,7 +901,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,
@@ -833,7 +909,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);
}
@@ -851,15 +927,15 @@ void EnGrasshopper_UpdateDamage(EnGrasshopper* this, PlayState* play) {
if ((this->collider.elements[0].info.bumperFlags & BUMP_HIT) ||
(this->collider.elements[1].info.bumperFlags & BUMP_HIT)) {
this->collider.base.acFlags &= ~AC_HIT;
- if ((this->action != EN_GRASSHOPPER_ACTION_DAMAGED) && (this->action != EN_GRASSHOPPER_ACTION_DEAD) &&
- (this->action != EN_GRASSHOPPER_ACTION_FALL)) {
- if (this->actor.colChkInfo.damageEffect == EN_GRASSHOPPER_DMGEFF_NONE) {
+ if ((this->action != DRAGONFLY_ACTION_DAMAGED) && (this->action != DRAGONFLY_ACTION_DEAD) &&
+ (this->action != DRAGONFLY_ACTION_FALL)) {
+ if (this->actor.colChkInfo.damageEffect == DRAGONFLY_DMGEFF_NONE) {
attackDealsDamage = true;
- } else if (this->actor.colChkInfo.damageEffect == EN_GRASSHOPPER_DMGEFF_FIRE) {
+ } else if (this->actor.colChkInfo.damageEffect == DRAGONFLY_DMGEFF_FIRE) {
this->drawDmgEffTimer = 40;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
attackDealsDamage = true;
- } else if (this->actor.colChkInfo.damageEffect == EN_GRASSHOPPER_DMGEFF_FREEZE) {
+ } else if (this->actor.colChkInfo.damageEffect == DRAGONFLY_DMGEFF_FREEZE) {
if ((this->drawDmgEffType != ACTOR_DRAW_DMGEFF_BLUE_FIRE) || (this->drawDmgEffTimer == 0)) {
Actor_ApplyDamage(&this->actor);
attackDealsDamage = false;
@@ -873,12 +949,12 @@ void EnGrasshopper_UpdateDamage(EnGrasshopper* this, PlayState* play) {
EnGrasshopper_SetupDead(this, play);
return;
}
- } else if (this->actor.colChkInfo.damageEffect == EN_GRASSHOPPER_DMGEFF_LIGHT_ORB) {
- Actor_SetColorFilter(&this->actor, 0x8000, 255, 0, 25);
+ } else if (this->actor.colChkInfo.damageEffect == DRAGONFLY_DMGEFF_LIGHT_ORB) {
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_GRAY, 255, COLORFILTER_BUFFLAG_OPA, 25);
this->drawDmgEffTimer = 20;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_LIGHT_ORBS;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->actor.focus.pos.x, this->actor.focus.pos.y,
- this->actor.focus.pos.z, 0, 0, 0, CLEAR_TAG_LARGE_LIGHT_RAYS);
+ this->actor.focus.pos.z, 0, 0, 0, CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
attackDealsDamage = true;
}
}
@@ -887,7 +963,7 @@ void EnGrasshopper_UpdateDamage(EnGrasshopper* this, PlayState* play) {
if (attackDealsDamage) {
Actor_ApplyDamage(&this->actor);
if (this->actor.colChkInfo.health > 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BATTA_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BATTA_DAMAGE);
EnGrasshopper_SetupDamaged(this, play);
} else {
EnGrasshopper_SetupDead(this, play);
@@ -918,12 +994,14 @@ void EnGrasshopper_Update(Actor* thisx, PlayState* play) {
Math_ApproachZeroF(&this->damagedVelocity.x, 1.0f, 2.0f);
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);
+ if ((this->action != DRAGONFLY_ACTION_FALL) && (this->type != DRAGONFLY_TYPE_WOODFALL)) {
+ 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;
- if (this->type == EN_GRASSHOPPER_TYPE_GROWS_WHEN_SPAWNED) {
+ if (this->type == DRAGONFLY_TYPE_GROWS_WHEN_SPAWNED) {
f32 targetScale = this->type * 0.01f;
if (targetScale >= 0.018f) {
@@ -933,15 +1011,15 @@ void EnGrasshopper_Update(Actor* thisx, PlayState* play) {
Math_ApproachF(&this->dragonflyScale, targetScale, 0.1f, 0.01f);
}
- if ((this->action != EN_GRASSHOPPER_ACTION_FALL) && (this->action != EN_GRASSHOPPER_ACTION_APPROACH_PLAYER)) {
+ if ((this->action != DRAGONFLY_ACTION_FALL) && (this->action != DRAGONFLY_ACTION_APPROACH_PLAYER)) {
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.world.rot.y, 5, 0x3E8, 5);
}
EnGrasshopper_UpdateEffects(this, play);
- if ((this->action != EN_GRASSHOPPER_ACTION_DEAD) && (this->action != EN_GRASSHOPPER_ACTION_FALL)) {
+ if ((this->action != DRAGONFLY_ACTION_DEAD) && (this->action != DRAGONFLY_ACTION_FALL)) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
- if ((this->action == EN_GRASSHOPPER_ACTION_APPROACH_PLAYER) || (this->action == EN_GRASSHOPPER_ACTION_ATTACK)) {
+ if ((this->action == DRAGONFLY_ACTION_APPROACH_PLAYER) || (this->action == DRAGONFLY_ACTION_ATTACK)) {
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
}
}
@@ -954,10 +1032,9 @@ void EnGrasshopper_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
Matrix_Push();
- if ((this->type != EN_GRASSHOPPER_TYPE_WOODFALL_TEMPLE_FINAL_ROOM) &&
- (this->type != EN_GRASSHOPPER_TYPE_WOODFALL)) {
- if ((s8)(sLimbIndexToShadowBodyPartsIndex[limbIndex] >= 0)) {
- Matrix_MultVec3f(&sZeroVec3f, &this->shadowBodyPartsPos[sLimbIndexToShadowBodyPartsIndex[limbIndex]]);
+ if ((this->type != DRAGONFLY_TYPE_WOODFALL_TEMPLE_FINAL_ROOM) && (this->type != DRAGONFLY_TYPE_WOODFALL)) {
+ if ((s8)(sLimbToShadowBodyParts[limbIndex] > BODYPART_NONE)) {
+ Matrix_MultVec3f(&sZeroVec3f, &this->shadowBodyPartsPos[sLimbToShadowBodyParts[limbIndex]]);
}
}
@@ -968,6 +1045,7 @@ void EnGrasshopper_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
}
Collider_UpdateSpheres(limbIndex, &this->collider);
+
if ((limbIndex == DRAGONFLY_LIMB_ROOT) || (limbIndex == DRAGONFLY_LIMB_TAIL_SEGMENT_2) ||
(limbIndex == DRAGONFLY_LIMB_TAIL_TIP) || (limbIndex == DRAGONFLY_LIMB_BACK_LEFT_UPPER_LEG) ||
(limbIndex == DRAGONFLY_LIMB_BACK_RIGHT_UPPER_LEG) || (limbIndex == DRAGONFLY_LIMB_FRONT_LEFT_UPPER_LEG) ||
@@ -979,45 +1057,40 @@ void EnGrasshopper_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
// While checking for DRAGONFLY_LIMB_ROOT twice is not a bug by itself, it causes another bug below.
(limbIndex == DRAGONFLY_LIMB_ROOT)) {
//! @bug: This code only works properly if all 12 elements of bodyPartsPos are updated every frame, since
- //! otherwise bodyPartsPosIndex will be non-zero at the end of a frame. Despite the fact that there are 12
+ //! otherwise bodyPartIndex will be non-zero at the end of a frame. Despite the fact that there are 12
//! checks in the above if-statement, only 9 of them are valid and non-duplicate, so only 9 elements of
//! bodyPartsPos are updated on each frame. As a result, three elements in bodyPartsPos will either be (0, 0, 0)
//! or be a value carried over from the previous frame.
- Matrix_MultZero(&this->bodyPartsPos[this->bodyPartsPosIndex]);
- this->bodyPartsPosIndex++;
- if (this->bodyPartsPosIndex >= ARRAY_COUNT(this->bodyPartsPos)) {
- this->bodyPartsPosIndex = 0;
+ Matrix_MultZero(&this->bodyPartsPos[this->bodyPartIndex]);
+ this->bodyPartIndex++;
+ if (this->bodyPartIndex >= DRAGONFLY_BODYPART_MAX) {
+ this->bodyPartIndex = 0;
}
}
Matrix_Pop();
}
-// We need to pass in 14 into SubS_GenShadowTex for the bodyPartsNum, NOT the actual size of the
-// parent body parts array. This is both necessary to match and to prevent extra dots from being
-// drawn with the shadow.
-#define SHADOW_BODY_PARTS_NUM 14
-
void EnGrasshopper_Draw(Actor* thisx, PlayState* play) {
EnGrasshopper* this = THIS;
s32 i;
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) &&
- (this->type != EN_GRASSHOPPER_TYPE_WOODFALL)) {
+ if ((this->type != DRAGONFLY_TYPE_WOODFALL_TEMPLE_FINAL_ROOM) && (this->type != DRAGONFLY_TYPE_WOODFALL)) {
Matrix_RotateXS(0, MTXMODE_NEW);
for (i = 0, shadowTexIter = shadowTex; i < SUBS_SHADOW_TEX_SIZE; i++) {
- *shadowTexIter++ = 0;
+ *shadowTexIter = 0;
+ shadowTexIter++;
}
for (i = 0; i < 5; i++) {
SubS_GenShadowTex(this->shadowBodyPartsPos, &this->actor.world.pos, shadowTex, i / 5.0f,
- SHADOW_BODY_PARTS_NUM, sShadowSizes, sParentBodyParts);
+ DRAGONFLY_SHADOW_BODYPART_MAX, sShadowSizes, sParentShadowBodyParts);
//! FAKE: Needed to fix some regs and stack
//! https://decomp.me/scratch/4wJBW
if ((shadowTex && shadowTex) && shadowTex) {}
@@ -1042,9 +1115,8 @@ void EnGrasshopper_Draw(Actor* thisx, PlayState* play) {
this->drawDmgEffFrozenSteamScale = 0.8f;
}
- Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, ARRAY_COUNT(this->bodyPartsPos),
- this->drawDmgEffScale, this->drawDmgEffFrozenSteamScale, drawDmgEffAlpha,
- this->drawDmgEffType);
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, DRAGONFLY_BODYPART_MAX, this->drawDmgEffScale,
+ this->drawDmgEffFrozenSteamScale, drawDmgEffAlpha, this->drawDmgEffType);
}
EnGrasshopper_DrawEffects(this, play);
@@ -1059,10 +1131,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;
}
}
@@ -1131,7 +1203,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..a07091dd8 100644
--- a/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.h
+++ b/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.h
@@ -4,18 +4,20 @@
#include "global.h"
#include "objects/object_grasshopper/object_grasshopper.h"
-#define EN_GRASSHOPPER_GET_TYPE(thisx) ((thisx)->params)
+#define DRAGONFLY_GET_TYPE(thisx) ((thisx)->params)
+
+#define DRAGONFLY_PARAMS(type) (type)
struct EnGrasshopper;
typedef void (*EnGrasshopperActionFunc)(struct EnGrasshopper*, PlayState*);
typedef enum EnGrasshopperType {
- /* -1 */ EN_GRASSHOPPER_TYPE_UNUSED_NORMAL = -1, // Acts exactly like EN_GRASSHOPPER_TYPE_NORMAL
- /* 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,
+ /* -1 */ DRAGONFLY_TYPE_UNUSED_NORMAL = -1, // Acts exactly like DRAGONFLY_TYPE_NORMAL
+ /* 0 */ DRAGONFLY_TYPE_NORMAL,
+ /* 1 */ DRAGONFLY_TYPE_GROWS_WHEN_SPAWNED, // Spawned by EnEncount1
+ /* 2 */ DRAGONFLY_TYPE_WOODFALL_TEMPLE_FINAL_ROOM,
+ /* 3 */ DRAGONFLY_TYPE_WOODFALL
} EnGrasshopperType;
typedef struct EnGrasshopperEffect {
@@ -28,7 +30,41 @@ typedef struct EnGrasshopperEffect {
/* 0x2E */ s16 lightningIndex;
} EnGrasshopperEffect; // size = 0x30
-#define EN_GRASSHOPPER_EFFECT_COUNT 100
+#define DRAGONFLY_EFFECT_COUNT 100
+
+typedef enum EnGrasshopperBodyPart {
+ /* 0 */ DRAGONFLY_BODYPART_0,
+ /* 1 */ DRAGONFLY_BODYPART_1,
+ /* 2 */ DRAGONFLY_BODYPART_2,
+ /* 3 */ DRAGONFLY_BODYPART_3,
+ /* 4 */ DRAGONFLY_BODYPART_4,
+ /* 5 */ DRAGONFLY_BODYPART_5,
+ /* 6 */ DRAGONFLY_BODYPART_6,
+ /* 7 */ DRAGONFLY_BODYPART_7,
+ /* 8 */ DRAGONFLY_BODYPART_8,
+ /* 9 */ DRAGONFLY_BODYPART_9,
+ /* 10 */ DRAGONFLY_BODYPART_10,
+ /* 11 */ DRAGONFLY_BODYPART_11,
+ /* 12 */ DRAGONFLY_BODYPART_MAX
+} EnGrasshopperBodyPart;
+
+typedef enum EnGrasshopperShadowBodyPart {
+ /* 0 */ DRAGONFLY_SHADOW_BODYPART_0,
+ /* 1 */ DRAGONFLY_SHADOW_BODYPART_1,
+ /* 2 */ DRAGONFLY_SHADOW_BODYPART_2,
+ /* 3 */ DRAGONFLY_SHADOW_BODYPART_3,
+ /* 4 */ DRAGONFLY_SHADOW_BODYPART_4,
+ /* 5 */ DRAGONFLY_SHADOW_BODYPART_5,
+ /* 6 */ DRAGONFLY_SHADOW_BODYPART_6,
+ /* 7 */ DRAGONFLY_SHADOW_BODYPART_7,
+ /* 8 */ DRAGONFLY_SHADOW_BODYPART_8,
+ /* 9 */ DRAGONFLY_SHADOW_BODYPART_9,
+ /* 10 */ DRAGONFLY_SHADOW_BODYPART_10,
+ /* 11 */ DRAGONFLY_SHADOW_BODYPART_11,
+ /* 12 */ DRAGONFLY_SHADOW_BODYPART_12,
+ /* 13 */ DRAGONFLY_SHADOW_BODYPART_13,
+ /* 14 */ DRAGONFLY_SHADOW_BODYPART_MAX
+} EnGrasshopperShadowBodyPart;
typedef struct EnGrasshopper {
/* 0x0000 */ Actor actor;
@@ -46,16 +82,16 @@ typedef struct EnGrasshopper {
/* 0x02B8 */ s16 drawDmgEffType;
/* 0x02BC */ f32 drawDmgEffScale;
/* 0x02C0 */ f32 drawDmgEffFrozenSteamScale;
- /* 0x02C4 */ Vec3f bodyPartsPos[12];
- /* 0x0354 */ s16 bodyPartsPosIndex;
+ /* 0x02C4 */ Vec3f bodyPartsPos[DRAGONFLY_BODYPART_MAX];
+ /* 0x0354 */ s16 bodyPartIndex;
/* 0x0356 */ s16 splashCount;
/* 0x0358 */ s16 action;
/* 0x035A */ s16 index; // Has a minor effect on speed for some reason.
/* 0x035C */ s16 bankState;
/* 0x035E */ s16 type;
/* 0x0360 */ f32 dragonflyScale;
- /* 0x0364 */ f32 rotationalVelocity;
- /* 0x0368 */ f32 endFrame;
+ /* 0x0364 */ f32 angularVelocity;
+ /* 0x0368 */ f32 animEndFrame;
/* 0x036C */ f32 approachSpeed;
/* 0x0370 */ f32 baseFlyHeight;
/* 0x0374 */ f32 targetPosY;
@@ -66,13 +102,13 @@ typedef struct EnGrasshopper {
/* 0x03B4 */ Vec3f targetApproachPos;
/* 0x03C0 */ Vec3f tailTipPos;
/* 0x03CC */ Vec3f effectBasePos;
- /* 0x03D8 */ Vec3f shadowBodyPartsPos[DRAGONFLY_LIMB_MAX];
+ /* 0x03D8 */ Vec3f shadowBodyPartsPos[DRAGONFLY_LIMB_MAX]; // Should be `DRAGONFLY_SHADOW_BODYPART_MAX`
/* 0x04F8 */ f32 waterSurface;
/* 0x04FC */ Vec3f damagedVelocity;
/* 0x0508 */ Vec3s targetBankRot;
/* 0x0510 */ ColliderJntSph collider;
/* 0x0530 */ ColliderJntSphElement colliderElements[2];
- /* 0x0570 */ EnGrasshopperEffect effects[EN_GRASSHOPPER_EFFECT_COUNT];
+ /* 0x0570 */ EnGrasshopperEffect effects[DRAGONFLY_EFFECT_COUNT];
} EnGrasshopper; // size = 0x1870
#endif // Z_EN_GRASSHOPPER_H
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 08133cc63..17f8cbb1d 100644
--- a/src/overlays/actors/ovl_En_Gs/z_en_gs.c
+++ b/src/overlays/actors/ovl_En_Gs/z_en_gs.c
@@ -5,10 +5,12 @@
*/
#include "z_en_gs.h"
+#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
+#include "overlays/actors/ovl_En_Elf/z_en_elf.h"
#include "objects/object_gs/object_gs.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
#define THIS ((EnGs*)thisx)
@@ -112,7 +114,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;
}
@@ -141,12 +143,12 @@ void EnGs_Init(Actor* thisx, PlayState* play) {
this->unk_204 = 1;
this->unk_198 = this->actor.world.rot.z;
this->unk_195 = ENGS_GET_1F(thisx);
- this->unk_196 = ENGS_GET_FE0(thisx);
+ this->switchFlag = ENGS_GET_SWITCH_FLAG(thisx);
this->actor.params = ENGS_GET_F000(thisx);
this->actor.world.rot.z = 0;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
this->unk_216 = 0;
this->unk_218 = 0;
this->unk_200 = 1.0f;
@@ -156,7 +158,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);
@@ -183,8 +185,8 @@ void func_80997D38(EnGs* this, PlayState* play) {
if (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE) {
if (this->actor.xzDistToPlayer <= D_8099A408[this->actor.params]) {
- func_8013E8F8(&this->actor, play, D_8099A408[this->actor.params], D_8099A408[this->actor.params],
- PLAYER_IA_NONE, 0x2000, 0x2000);
+ SubS_OfferTalkExchangeFacing(&this->actor, play, D_8099A408[this->actor.params],
+ D_8099A408[this->actor.params], PLAYER_IA_NONE, 0x2000, 0x2000);
}
}
@@ -248,8 +250,11 @@ void func_80997E4C(EnGs* this, PlayState* play) {
case ENGS_2:
this->unk_210 = this->unk_195 + 0x20F7;
break;
+
+ default:
+ break;
}
- func_80151938(play, this->unk_210);
+ Message_ContinueTextbox(play, this->unk_210);
break;
default:
@@ -258,45 +263,51 @@ void func_80997E4C(EnGs* this, PlayState* play) {
}
}
break;
+
+ default:
+ break;
}
}
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);
}
}
void func_80998040(EnGs* this, PlayState* play) {
- func_80152434(play, 1);
+ Message_DisplayOcarinaStaff(play, OCARINA_ACTION_FREE_PLAY);
this->actionFunc = func_8099807C;
}
void func_8099807C(EnGs* this, PlayState* play) {
switch (play->msgCtx.ocarinaMode) {
- case 3:
+ case OCARINA_MODE_EVENT:
switch (play->msgCtx.lastPlayedSong) {
case OCARINA_SONG_HEALING:
case OCARINA_SONG_EPONAS:
- if (!Flags_GetSwitch(play, this->unk_196)) {
+ if (!Flags_GetSwitch(play, this->switchFlag)) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELF, this->actor.world.pos.x,
- this->actor.world.pos.y + 40.0f, this->actor.world.pos.z, 0, 0, 0, 2);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BUTTERFRY_TO_FAIRY);
- Flags_SetSwitch(play, this->unk_196);
+ this->actor.world.pos.y + 40.0f, this->actor.world.pos.z, 0, 0, 0,
+ FAIRY_PARAMS(FAIRY_TYPE_2, false, 0));
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BUTTERFRY_TO_FAIRY);
+ Flags_SetSwitch(play, this->switchFlag);
}
break;
case OCARINA_SONG_STORMS:
- if (!Flags_GetSwitch(play, this->unk_196)) {
+ if (!Flags_GetSwitch(play, this->switchFlag)) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELF, this->actor.world.pos.x,
- this->actor.world.pos.y + 40.0f, this->actor.world.pos.z, 0, 0, 0, 7);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BUTTERFRY_TO_FAIRY);
- Flags_SetSwitch(play, this->unk_196);
+ this->actor.world.pos.y + 40.0f, this->actor.world.pos.z, 0, 0, 0,
+ FAIRY_PARAMS(FAIRY_TYPE_7, false, 0));
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BUTTERFRY_TO_FAIRY);
+ Flags_SetSwitch(play, this->switchFlag);
}
break;
case OCARINA_SONG_SONATA:
- if ((this->actor.params == ENGS_1) && (gSaveContext.save.playerForm == PLAYER_FORM_DEKU)) {
+ if ((this->actor.params == ENGS_1) && (GET_PLAYER_FORM == PLAYER_FORM_DEKU)) {
this->unk_194 = 1;
this->unk_19C = 5;
this->unk_19A |= 1;
@@ -306,7 +317,7 @@ void func_8099807C(EnGs* this, PlayState* play) {
break;
case OCARINA_SONG_NEW_WAVE:
- if ((this->actor.params == ENGS_1) && (gSaveContext.save.playerForm == PLAYER_FORM_ZORA)) {
+ if ((this->actor.params == ENGS_1) && (GET_PLAYER_FORM == PLAYER_FORM_ZORA)) {
this->unk_194 = 3;
this->unk_19C = 5;
this->unk_19A |= 1;
@@ -316,7 +327,7 @@ void func_8099807C(EnGs* this, PlayState* play) {
break;
case OCARINA_SONG_GORON_LULLABY:
- if ((this->actor.params == ENGS_1) && (gSaveContext.save.playerForm == PLAYER_FORM_GORON)) {
+ if ((this->actor.params == ENGS_1) && (GET_PLAYER_FORM == PLAYER_FORM_GORON)) {
this->unk_194 = 2;
this->unk_19C = 5;
this->unk_19A |= 1;
@@ -324,22 +335,28 @@ void func_8099807C(EnGs* this, PlayState* play) {
func_809984F4(this, play);
}
break;
+
+ default:
+ break;
}
break;
- case 0:
- case 4:
+ case OCARINA_MODE_NONE:
+ case OCARINA_MODE_END:
func_80998300(this, play);
- case 26:
+ case OCARINA_MODE_APPLY_DOUBLE_SOT:
func_80997D14(this, play);
break;
+
+ default:
+ break;
}
}
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 +366,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 +389,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 +397,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 +405,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 {
@@ -411,7 +428,7 @@ void func_809985B8(EnGs* this, PlayState* play) {
void func_80998704(EnGs* this, PlayState* play) {
this->unk_19D = 0;
this->unk_19A &= ~(0x100 | 0x4);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_G_STONE_CHANGE_COLOR);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_G_STONE_CHANGE_COLOR);
this->actionFunc = func_8099874C;
}
@@ -439,6 +456,9 @@ void func_8099874C(EnGs* this, PlayState* play) {
case 4:
phi_v0 = func_809995A4(this, play);
break;
+
+ default:
+ break;
}
if (phi_v0 == 0) {
@@ -446,46 +466,49 @@ 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;
+
+ default:
+ break;
}
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 +523,7 @@ void func_8099874C(EnGs* this, PlayState* play) {
}
void func_809989B4(EnGs* this, PlayState* play) {
- Actor_PickUp(&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 +532,8 @@ void func_809989F4(EnGs* this, PlayState* play) {
this->actor.parent = NULL;
func_80997D14(this, play);
} else {
- Actor_PickUp(&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);
}
}
@@ -518,12 +542,12 @@ s32 func_80998A48(EnGs* this, PlayState* play) {
if (this->unk_19D == 0) {
this->unk_216 = 200;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_ATTACK);
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;
@@ -536,7 +560,7 @@ s32 func_80998A48(EnGs* this, PlayState* play) {
if ((this->actor.params != ENGS_0) && !Play_InCsMode(play) &&
(Message_GetState(&play->msgCtx) == TEXT_STATE_NONE)) {
this->unk_216 = 0;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_FAIVE_LUPY_COUNT);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FAIVE_LUPY_COUNT);
Message_StartTextbox(play, 0x20D2, NULL);
}
this->unk_19A &= ~1;
@@ -551,19 +575,19 @@ s32 func_80998BBC(EnGs* this, PlayState* play) {
if (this->unk_19D == 0) {
this->unk_216 = 200;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_ATTACK);
this->unk_1DC = 0.3f;
this->unk_1E0 = 0.0f;
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;
} else if (this->unk_19D == 1) {
- this->unk_19E[0].z = (this->unk_1D4 % 8) * 0.125f * 360.0f * (0x10000 / 360.0f);
+ this->unk_19E[0].z = DEG_TO_BINANG((this->unk_1D4 % 8) * 0.125f * 360.0f);
this->unk_19E[1].z = -this->unk_19E[0].z;
if (func_80998334(this, play, &this->unk_1DC, &this->unk_1E0, &this->unk_1D4, 0.8f, 0.005f, 0.001f, 7, 0) ==
0.0f) {
@@ -582,10 +606,10 @@ s32 func_80998D44(EnGs* this, PlayState* play) {
this->unk_216 = 200;
this->unk_1DC = this->unk_1B0[0].y - 1.0f;
this->unk_1E0 = -0.8f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_G_STONE_CRUSH);
+ 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,10 +634,10 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_ATTACK);
this->unk_19D += 1;
}
} else if ((this->unk_19D == 4) && (func_80998334(this, play, &this->unk_1DC, &this->unk_1E0, &this->unk_1D4, 1.0f,
@@ -640,15 +664,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,13 +680,13 @@ 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;
this->unk_1E4 = this->unk_1B0[1].y - 1.0f;
this->unk_1E8 = -0.3f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_STONE_GROW_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_STONE_GROW_UP);
this->unk_19D = 3;
}
}
@@ -712,9 +736,9 @@ s32 func_80998F9C(EnGs* this, PlayState* play) {
this->unk_1E8 = 0.0f;
this->unk_1F0 = 0.0f;
this->unk_1EC = 0.5f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_ATTACK);
- this->unk_21C = 20;
- this->unk_21E = 2;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_ATTACK);
+ this->quakeY = 20;
+ this->quakeDuration = 2;
this->unk_19D = 6;
}
}
@@ -725,8 +749,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;
@@ -735,7 +759,7 @@ s32 func_80998F9C(EnGs* this, PlayState* play) {
}
if ((u16)this->unk_19E[0].y < sp3A) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_STONE_ROLLING);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_STONE_ROLLING);
}
return sp4C;
@@ -748,16 +772,16 @@ void func_80999584(Color_RGB8* arg0, Color_RGB8* arg1) {
}
s32 func_809995A4(EnGs* this, PlayState* play) {
- static Color_RGB8 flashColours[] = {
+ static Color_RGB8 sFlashColours[] = {
{ 255, 50, 50 },
{ 50, 50, 255 },
{ 255, 255, 255 },
};
- static Vec3f dustAccel = { 0.0f, -0.3f, 0.0f };
- static Color_RGBA8 dustPrim = { 200, 200, 200, 128 };
- static Color_RGBA8 dustEnv = { 100, 100, 100, 0 };
- static Vec3f bomb2Velocity = { 0.0f, 0.0f, 0.0f };
- static Vec3f bomb2Accel = { 0.0f, 0.0f, 0.0f };
+ static Vec3f sDustAccel = { 0.0f, -0.3f, 0.0f };
+ static Color_RGBA8 sDustPrimColor = { 200, 200, 200, 128 };
+ static Color_RGBA8 sDustEnvColor = { 100, 100, 100, 0 };
+ static Vec3f sBomb2Velocity = { 0.0f, 0.0f, 0.0f };
+ static Vec3f sBomb2Accel = { 0.0f, 0.0f, 0.0f };
s32 sp7C = -1;
if (this->unk_19D == 0) {
@@ -778,20 +802,20 @@ s32 func_809995A4(EnGs* this, PlayState* play) {
u8 pad;
this->unk_1D4--;
- func_80999584(&this->unk_1FA, &flashColours[2]);
+ func_80999584(&this->unk_1FA, &sFlashColours[2]);
if (this->unk_1D4 < 80) {
if ((this->unk_1D4 % 20) < 8) {
if (this->unk_1D4 < 20) {
if ((this->unk_1D4 % 20) == 7) {
- func_80999584(&this->unk_1FA, &flashColours[0]);
+ func_80999584(&this->unk_1FA, &sFlashColours[0]);
this->unk_1F4 = this->unk_1FA;
- play_sound(NA_SE_SY_WARNING_COUNT_E);
+ Audio_PlaySfx(NA_SE_SY_WARNING_COUNT_E);
this->unk_200 = 0.0f;
}
} else if ((this->unk_1D4 % 20) == 7) {
- func_80999584(&this->unk_1FA, &flashColours[1]);
+ func_80999584(&this->unk_1FA, &sFlashColours[1]);
this->unk_1F4 = this->unk_1FA;
- play_sound(NA_SE_SY_WARNING_COUNT_N);
+ Audio_PlaySfx(NA_SE_SY_WARNING_COUNT_N);
this->unk_200 = 0.0f;
}
}
@@ -799,8 +823,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,18 +836,19 @@ 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;
sp6C.z = this->actor.world.pos.z + (2.0f * sp60.z);
- func_800B0EB0(play, &sp6C, &sp60, &dustAccel, &dustPrim, &dustEnv, Rand_ZeroFloat(50.0f) + 200.0f, 40, 15);
+ func_800B0EB0(play, &sp6C, &sp60, &sDustAccel, &sDustPrimColor, &sDustEnvColor,
+ Rand_ZeroFloat(50.0f) + 200.0f, 40, 15);
}
- func_800B9010(&this->actor, NA_SE_EV_FIRE_PILLAR - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_FIRE_PILLAR - SFX_FLAG);
if (this->unk_1D4++ >= 40) {
this->unk_19A |= 0x10;
@@ -833,8 +858,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,21 +867,21 @@ s32 func_809995A4(EnGs* this, PlayState* play) {
}
if (this->unk_19D == 4) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 60.0f, 3);
- if (this->actor.bgCheckFlags & (0x10 | 0x8)) {
+ 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;
sp54.x = this->actor.world.pos.x;
sp54.y = this->actor.world.pos.y;
sp54.z = this->actor.world.pos.z;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_BOMB_EXPLOSION);
- EffectSsBomb2_SpawnLayered(play, &sp54, &bomb2Velocity, &bomb2Accel, 100, 20);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_BOMB_EXPLOSION);
+ EffectSsBomb2_SpawnLayered(play, &sp54, &sBomb2Velocity, &sBomb2Accel, 100, 20);
this->unk_1D4 = 10;
this->unk_19A |= 8;
this->unk_216 = 0;
this->actionFunc = func_80999A8C;
} else {
- func_800B9010(&this->actor, NA_SE_EV_STONE_LAUNCH - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_STONE_LAUNCH - SFX_FLAG);
}
Actor_MoveWithGravity(&this->actor);
@@ -870,7 +895,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;
}
@@ -921,7 +946,7 @@ void func_80999BC8(Actor* thisx, PlayState* play2) {
EnGs* this = THIS;
s32 pad;
- if (this->actor.isTargeted && !func_801A5100()) {
+ if (this->actor.isLockedOn && !func_801A5100()) {
this->unk_19D = 0;
this->unk_19A |= 1;
func_80999AC0(this);
@@ -1005,14 +1030,14 @@ void EnGs_Update(Actor* thisx, PlayState* play) {
EnGs* this = THIS;
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- play->msgCtx.msgMode = 0;
+ play->msgCtx.msgMode = MSGMODE_NONE;
play->msgCtx.msgLength = 0;
this->collider.base.acFlags &= ~AC_HIT;
func_80997DEC(this, 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 +1052,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;
@@ -1041,14 +1066,14 @@ void EnGs_Update(Actor* thisx, PlayState* play) {
Math_StepToF(&this->unk_200, 1.0f, 0.02f);
}
func_80997AFC(this->unk_194, &this->unk_1F7);
- Lib_LerpRGB(&this->unk_1F4, &this->unk_1F7, this->unk_200, &this->unk_1FA);
+ Color_RGB8_Lerp(&this->unk_1F4, &this->unk_1F7, this->unk_200, &this->unk_1FA);
if (this->unk_200 >= 1.0f) {
this->unk_1F4 = this->unk_1FA;
}
}
- if (this->unk_21C > 0) {
- this->unk_21C = 0;
+ if (this->quakeY > 0) {
+ this->quakeY = 0;
}
func_80999B34(this);
@@ -1068,7 +1093,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 +1115,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..ffeb3083e 100644
--- a/src/overlays/actors/ovl_En_Gs/z_en_gs.h
+++ b/src/overlays/actors/ovl_En_Gs/z_en_gs.h
@@ -8,15 +8,15 @@ struct EnGs;
typedef void (*EnGsActionFunc)(struct EnGs*, PlayState*);
#define ENGS_GET_1F(thisx) ((thisx)->params & 0x1F)
-#define ENGS_GET_FE0(thisx) (((thisx)->params >> 5) & 0x7F)
+#define ENGS_GET_SWITCH_FLAG(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;
@@ -24,7 +24,7 @@ typedef struct EnGs {
/* 0x190 */ EnGsActionFunc actionFunc;
/* 0x194 */ s8 unk_194;
/* 0x195 */ u8 unk_195;
- /* 0x196 */ u8 unk_196;
+ /* 0x196 */ u8 switchFlag;
/* 0x197 */ s8 unk_197;
/* 0x198 */ s16 unk_198;
/* 0x19A */ s16 unk_19A;
@@ -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 b13bca1dd..e00f3b523 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
@@ -7,7 +7,7 @@
#include "z_en_guard_nuts.h"
#include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_100000 | ACTOR_FLAG_80000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_100000 | ACTOR_FLAG_80000000)
#define THIS ((EnGuardNuts*)thisx)
@@ -61,18 +61,32 @@ s32 sGuardCount = 0;
s32 D_80ABBE20 = 0;
-static u16 sTextIDs[] = { 0x0824, 0x0825, 0x0826, 0x082D, 0x0827, 0x0828, 0x0829, 0x082A, 0x082B, 0x082C };
+static u16 sTextIds[] = { 0x0824, 0x0825, 0x0826, 0x082D, 0x0827, 0x0828, 0x0829, 0x082A, 0x082B, 0x082C };
s16 D_80ABBE38[] = { 0x0000, 0x0000, 0x0002, 0x0001, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0002 };
-static AnimationHeader* sAnimations[] = {
- &gDekuPalaceGuardWaitAnim,
- &gDekuPalaceGuardWalkAnim,
- &gDekuPalaceGuardDigAnim,
- &gDekuPalaceGuardWalkAnim,
+typedef enum {
+ /* -1 */ GUARD_NUTS_ANIM_NONE = -1,
+ /* 0 */ GUARD_NUTS_ANIM_WAIT_HEAD_TILT,
+ /* 1 */ GUARD_NUTS_ANIM_WALK,
+ /* 2 */ GUARD_NUTS_ANIM_DIG,
+ /* 3 */ GUARD_NUTS_ANIM_WALK_2,
+ /* 4 */ GUARD_NUTS_ANIM_MAX
+} EnGuardNutsAnimation;
+
+static AnimationHeader* sAnimations[GUARD_NUTS_ANIM_MAX] = {
+ &gDekuPalaceGuardWaitAnim, // GUARD_NUTS_ANIM_WAIT_HEAD_TILT
+ &gDekuPalaceGuardWalkAnim, // GUARD_NUTS_ANIM_WALK
+ &gDekuPalaceGuardDigAnim, // GUARD_NUTS_ANIM_DIG
+ &gDekuPalaceGuardWalkAnim, // GUARD_NUTS_ANIM_WALK_2
};
-static u8 sAnimationModes[] = { ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_ONCE };
+static u8 sAnimationModes[GUARD_NUTS_ANIM_MAX] = {
+ ANIMMODE_LOOP, // GUARD_NUTS_ANIM_WAIT_HEAD_TILT
+ ANIMMODE_LOOP, // GUARD_NUTS_ANIM_WALK
+ ANIMMODE_ONCE, // GUARD_NUTS_ANIM_DIG
+ ANIMMODE_ONCE, // GUARD_NUTS_ANIM_WALK_2
+};
static TexturePtr sEyeTextures[] = {
gDekuPalaceGuardEyeOpenTex,
@@ -80,13 +94,6 @@ static TexturePtr sEyeTextures[] = {
gDekuPalaceGuardEyeClosedTex,
};
-typedef enum {
- /* 0 */ WAIT_HEAD_TILT_ANIM,
- /* 1 */ WALK_ANIM,
- /* 2 */ DIG_ANIM,
- /* 3 */ WALK_ANIM_2,
-} EnGuardNutsAnim;
-
typedef enum {
/* 0 */ GUARD_NUTS_WAIT_STATE,
/* 1 */ GUARD_NUTS_TALKING_STATE,
@@ -101,7 +108,7 @@ void EnGuardNuts_Init(Actor* thisx, PlayState* play) {
SkelAnime_Init(play, &this->skelAnime, &gDekuPalaceGuardSkel, &gDekuPalaceGuardWaitAnim, this->jointTable,
this->morphTable, DEKU_PALACE_GUARD_LIMB_MAX);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
- this->actor.targetMode = 1;
+ this->actor.targetMode = TARGET_MODE_1;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
Actor_SetScale(&this->actor, 0.015f);
Math_Vec3f_Copy(&this->guardPos, &this->actor.world.pos);
@@ -123,20 +130,20 @@ void EnGuardNuts_Destroy(Actor* thisx, PlayState* play) {
}
/**
- * @brief Changes the animation to the provided index. Updates animIndex and animFrameCount for the animation.
+ * @brief Changes the animation to the provided index. Updates animIndex and animEndFrame for the animation.
*
* @param this
* @param animIndex the index of sAnimations to change to
*/
void EnGuardNuts_ChangeAnim(EnGuardNuts* this, s32 animIndex) {
this->animIndex = animIndex;
- this->animFrameCount = Animation_GetLastFrame(sAnimations[this->animIndex]);
- Animation_Change(&this->skelAnime, sAnimations[this->animIndex], 1.0f, 0.0f, this->animFrameCount,
+ this->animEndFrame = Animation_GetLastFrame(sAnimations[this->animIndex]);
+ Animation_Change(&this->skelAnime, sAnimations[this->animIndex], 1.0f, 0.0f, this->animEndFrame,
sAnimationModes[this->animIndex], -2.0f);
}
void EnGuardNuts_SetupWait(EnGuardNuts* this) {
- EnGuardNuts_ChangeAnim(this, WAIT_HEAD_TILT_ANIM);
+ EnGuardNuts_ChangeAnim(this, GUARD_NUTS_ANIM_WAIT_HEAD_TILT);
this->state = GUARD_NUTS_WAIT_STATE;
this->actionFunc = EnGuardNuts_Wait;
}
@@ -169,22 +176,22 @@ void EnGuardNuts_Wait(EnGuardNuts* this, PlayState* play) {
// No place for an outsider
this->guardTextIndex = 3;
}
- this->actor.textId = sTextIDs[this->guardTextIndex];
+ this->actor.textId = sTextIds[this->guardTextIndex];
phi_a1 = this->actor.world.rot.y;
if (D_80ABBE20 == 2) {
EnGuardNuts_Burrow(this, play);
return;
}
if (D_80ABBE20 == 1) {
- if (this->animIndex != WALK_ANIM) {
- EnGuardNuts_ChangeAnim(this, WALK_ANIM);
+ if (this->animIndex != GUARD_NUTS_ANIM_WALK) {
+ EnGuardNuts_ChangeAnim(this, GUARD_NUTS_ANIM_WALK);
}
phi_a1 = (this->actor.home.rot.y + 0x8000);
}
if (fabsf((f32)(this->actor.shape.rot.y - phi_a1)) < 100.0f) {
this->actor.shape.rot.y = phi_a1;
- if ((D_80ABBE20 == 1) && (this->animIndex != WALK_ANIM_2)) {
- EnGuardNuts_ChangeAnim(this, WALK_ANIM_2);
+ if ((D_80ABBE20 == 1) && (this->animIndex != GUARD_NUTS_ANIM_WALK_2)) {
+ EnGuardNuts_ChangeAnim(this, GUARD_NUTS_ANIM_WALK_2);
}
} else {
Math_SmoothStepToS(&this->actor.shape.rot.y, phi_a1, 1, 0xBB8, 0);
@@ -195,11 +202,11 @@ void EnGuardNuts_Wait(EnGuardNuts* this, PlayState* play) {
this->targetHeadPos.y = -this->targetHeadPos.y;
}
}
- func_800B8614(&this->actor, play, 70.0f);
+ Actor_OfferTalk(&this->actor, play, 70.0f);
}
void func_80ABB540(EnGuardNuts* this) {
- EnGuardNuts_ChangeAnim(this, WALK_ANIM);
+ EnGuardNuts_ChangeAnim(this, GUARD_NUTS_ANIM_WALK);
this->targetHeadPos.x = this->targetHeadPos.y = 0;
this->timer = 16;
this->state = GUARD_NUTS_TALKING_STATE;
@@ -216,7 +223,7 @@ void func_80ABB590(EnGuardNuts* this, PlayState* play) {
if (fabsf((this->actor.shape.rot.y - yaw)) < 100.0f) {
this->actor.shape.rot.y = yaw;
curFrame = this->skelAnime.curFrame;
- if ((curFrame < this->animFrameCount) || (this->guardTextIndex >= 7)) {
+ if ((curFrame < this->animEndFrame) || (this->guardTextIndex >= 7)) {
SkelAnime_Update(&this->skelAnime);
}
} else {
@@ -226,19 +233,19 @@ void func_80ABB590(EnGuardNuts* this, PlayState* play) {
if (Message_GetState(&play->msgCtx) == TEXT_STATE_5) {
this->targetHeadPos.y = 0;
this->targetHeadPos.x = 0;
- if ((this->guardTextIndex == 3) && (this->animIndex == WAIT_HEAD_TILT_ANIM)) {
- EnGuardNuts_ChangeAnim(this, WAIT_HEAD_TILT_ANIM);
+ if ((this->guardTextIndex == 3) && (this->animIndex == GUARD_NUTS_ANIM_WAIT_HEAD_TILT)) {
+ EnGuardNuts_ChangeAnim(this, GUARD_NUTS_ANIM_WAIT_HEAD_TILT);
}
if (Message_ShouldAdvance(play)) {
if (D_80ABBE38[this->guardTextIndex] != 1) {
if (D_80ABBE38[this->guardTextIndex] == 2) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
D_80ABBE20 = 2;
SET_WEEKEVENTREG(WEEKEVENTREG_12_40);
EnGuardNuts_Burrow(this, play);
} else {
this->guardTextIndex++;
- Message_StartTextbox(play, sTextIDs[this->guardTextIndex], &this->actor);
+ Message_StartTextbox(play, sTextIds[this->guardTextIndex], &this->actor);
if (D_80ABBE38[this->guardTextIndex] == 2) {
D_80ABBE20 = 1;
}
@@ -247,11 +254,11 @@ void func_80ABB590(EnGuardNuts* this, PlayState* play) {
} else if (this->guardTextIndex != 3) {
this->targetHeadPos.x = 0;
this->targetHeadPos.y = this->targetHeadPos.x;
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->state = GUARD_NUTS_UNK_STATE;
this->actionFunc = EnGuardNuts_Unburrow;
} else {
- func_801477B4(play);
+ Message_CloseTextbox(play);
EnGuardNuts_SetupWait(this);
}
}
@@ -271,15 +278,15 @@ void func_80ABB590(EnGuardNuts* this, PlayState* play) {
void EnGuardNuts_Burrow(EnGuardNuts* this, PlayState* play) {
Vec3f digPos;
- EnGuardNuts_ChangeAnim(this, DIG_ANIM);
+ EnGuardNuts_ChangeAnim(this, GUARD_NUTS_ANIM_DIG);
Math_Vec3f_Copy(&digPos, &this->actor.world.pos);
digPos.y = this->actor.floorHeight;
EffectSsHahen_SpawnBurst(play, &digPos, 4.0f, 0, 10, 3, 15, HAHEN_OBJECT_DEFAULT, 10, NULL);
this->targetHeadPos.y = 0;
- this->actor.flags |= ACTOR_FLAG_8000000;
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
this->targetHeadPos.x = this->targetHeadPos.y;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_DOWN);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_DOWN);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_UP);
this->actionFunc = EnGuardNuts_SetupUnburrow;
}
@@ -287,7 +294,7 @@ void EnGuardNuts_SetupUnburrow(EnGuardNuts* this, PlayState* play) {
f32 curFrame = this->skelAnime.curFrame;
SkelAnime_Update(&this->skelAnime);
- if (this->animFrameCount <= curFrame) {
+ if (curFrame >= this->animEndFrame) {
this->state = GUARD_NUTS_BURROWED_STATE;
this->actionFunc = EnGuardNuts_Unburrow;
this->actor.world.rot.y = this->actor.home.rot.y;
@@ -306,12 +313,12 @@ void EnGuardNuts_Unburrow(EnGuardNuts* this, PlayState* play) {
Math_Vec3f_Copy(&digPos, &this->actor.world.pos);
digPos.y = this->actor.floorHeight;
EffectSsHahen_SpawnBurst(play, &digPos, 4.0f, 0, 10, 3, 15, HAHEN_OBJECT_DEFAULT, 10, NULL);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_UP);
D_80ABBE20 = 0;
if (this->guardTextIndex == 9) {
this->hasCompletedConversation = true;
}
- this->actor.flags &= ~ACTOR_FLAG_8000000;
+ this->actor.flags &= ~ACTOR_FLAG_CANT_LOCK_ON;
EnGuardNuts_SetupWait(this);
}
}
@@ -322,14 +329,15 @@ void EnGuardNuts_Update(Actor* thisx, PlayState* play) {
s32 pad;
if (this->blinkTimer == 0) {
- if (++(this->eyeState) >= 3) {
+ this->eyeState++;
+ if (this->eyeState >= 3) {
this->eyeState = 0;
this->blinkTimer = (s16)Rand_ZeroFloat(60.0f) + 20;
}
}
- if ((this->animIndex == WALK_ANIM) &&
- ((Animation_OnFrame(&this->skelAnime, 1.0f)) || (Animation_OnFrame(&this->skelAnime, 5.0f)))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_WALK);
+ if ((this->animIndex == GUARD_NUTS_ANIM_WALK) &&
+ (Animation_OnFrame(&this->skelAnime, 1.0f) || Animation_OnFrame(&this->skelAnime, 5.0f))) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_WALK);
}
this->actionFunc(this, play);
@@ -345,7 +353,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 +378,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_Guard_Nuts/z_en_guard_nuts.h b/src/overlays/actors/ovl_En_Guard_Nuts/z_en_guard_nuts.h
index 8cbe26f03..e07e70eaf 100644
--- a/src/overlays/actors/ovl_En_Guard_Nuts/z_en_guard_nuts.h
+++ b/src/overlays/actors/ovl_En_Guard_Nuts/z_en_guard_nuts.h
@@ -25,7 +25,7 @@ typedef struct EnGuardNuts {
/* 0x228 */ Vec3f guardPos;
/* 0x234 */ Vec3s headRot;
/* 0x23A */ Vec3s targetHeadPos;
- /* 0x240 */ f32 animFrameCount;
+ /* 0x240 */ f32 animEndFrame;
/* 0x244 */ ColliderCylinder collider;
} EnGuardNuts; // size = 0x290
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 f7eddbe6f..92afb3083 100644
--- a/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.c
+++ b/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.c
@@ -5,9 +5,8 @@
*/
#include "z_en_guruguru.h"
-#include "objects/object_fu/object_fu.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnGuruguru*)thisx)
@@ -62,20 +61,38 @@ static ColliderCylinderInit sCylinderInit = {
{ 15, 20, 0, { 0, 0, 0 } },
};
-static AnimationHeader* sAnimations[] = { &object_fu_Anim_000B04, &object_fu_Anim_00057C };
-static u8 sAnimationModes[] = { ANIMMODE_LOOP, ANIMMODE_LOOP };
-static f32 sPlaySpeeds[] = { 1.0f, 1.0f };
-static TexturePtr sEyeTextures[] = { object_fu_Tex_005F20, object_fu_Tex_006320 };
-static TexturePtr sMouthTextures[] = { object_fu_Tex_006720, object_fu_Tex_006920 };
+typedef enum {
+ /* 0 */ GURU_GURU_ANIM_PLAY_STILL,
+ /* 1 */ GURU_GURU_ANIM_PLAY_MOVE_HEAD,
+ /* 2 */ GURU_GURU_ANIM_MAX
+} GuruGuruAnimation;
+
+static AnimationHeader* sAnimations[GURU_GURU_ANIM_MAX] = {
+ &gGuruGuruPlayStillAnim, // GURU_GURU_ANIM_PLAY_STILL
+ &gGuruGuruPlayAndMoveHeadAnim, // GURU_GURU_ANIM_PLAY_MOVE_HEAD
+};
+
+static u8 sAnimationModes[GURU_GURU_ANIM_MAX] = {
+ ANIMMODE_LOOP, // GURU_GURU_ANIM_PLAY_STILL
+ ANIMMODE_LOOP, // GURU_GURU_ANIM_PLAY_MOVE_HEAD
+};
+
+static f32 sPlaySpeeds[GURU_GURU_ANIM_MAX] = {
+ 1.0f, // GURU_GURU_ANIM_PLAY_STILL
+ 1.0f, // GURU_GURU_ANIM_PLAY_MOVE_HEAD
+};
+
+static TexturePtr sEyeTextures[] = { gGuruGuruEyeClosedTex, gGuruGuruEyeAngryTex };
+static TexturePtr sMouthTextures[] = { gGuruGuruMouthOpenTex, gGuruGuruMouthAngryTex };
void EnGuruguru_Init(Actor* thisx, PlayState* play) {
EnGuruguru* this = THIS;
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 19.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_fu_Skel_006C90, &object_fu_Anim_000B04, this->jointTable,
- this->morphTable, 16);
- this->actor.targetMode = 0;
+ SkelAnime_InitFlex(play, &this->skelAnime, &gGuruGuruSkel, &gGuruGuruPlayStillAnim, this->jointTable,
+ this->morphTable, GURU_GURU_LIMB_MAX);
+ this->actor.targetMode = TARGET_MODE_0;
if (this->actor.params != 2) {
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
}
@@ -83,9 +100,9 @@ void EnGuruguru_Init(Actor* thisx, PlayState* play) {
if (this->actor.params == 0) {
func_80BC6E10(this);
} else if (this->actor.params == 2) {
- this->actor.flags |= ACTOR_FLAG_8000000;
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
this->actor.draw = NULL;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actionFunc = EnGuruguru_DoNothing;
} else {
Actor_Kill(&this->actor);
@@ -106,8 +123,8 @@ void EnGuruguru_Destroy(Actor* thisx, PlayState* play) {
}
void EnGuruguru_ChangeAnim(EnGuruguru* this, s32 animIndex) {
- this->frameCount = Animation_GetLastFrame(sAnimations[animIndex]);
- Animation_Change(&this->skelAnime, sAnimations[animIndex], sPlaySpeeds[animIndex], 0.0f, this->frameCount,
+ this->animEndFrame = Animation_GetLastFrame(sAnimations[animIndex]);
+ Animation_Change(&this->skelAnime, sAnimations[animIndex], sPlaySpeeds[animIndex], 0.0f, this->animEndFrame,
sAnimationModes[animIndex], -4.0f);
}
@@ -115,7 +132,7 @@ void EnGuruguru_DoNothing(EnGuruguru* this, PlayState* play) {
}
void func_80BC6E10(EnGuruguru* this) {
- EnGuruguru_ChangeAnim(this, 0);
+ EnGuruguru_ChangeAnim(this, GURU_GURU_ANIM_PLAY_STILL);
this->textIdIndex = 0;
this->unk270 = 0;
if (this->actor.params == 0) {
@@ -131,7 +148,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 {
@@ -167,7 +184,7 @@ void func_80BC6F14(EnGuruguru* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
func_80BC701C(this, play);
} else if (yaw <= 0x2890) {
- func_800B8614(&this->actor, play, 60.0f);
+ Actor_OfferTalk(&this->actor, play, 60.0f);
}
}
@@ -175,7 +192,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;
}
@@ -208,10 +225,10 @@ void func_80BC7068(EnGuruguru* this, PlayState* play) {
}
}
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(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 +240,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 +251,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;
}
@@ -257,11 +274,11 @@ void func_80BC7068(EnGuruguru* this, PlayState* play) {
}
if ((this->unk268 != 0) && (this->textIdIndex >= 7)) {
this->skelAnime.playSpeed = 2.0f;
- func_801A29D4(3, 1.18921f, 2);
+ Audio_SetSeqTempoAndFreq(3, 1.18921f, 2);
func_801A3B48(0);
} else {
if (this->skelAnime.playSpeed == 2.0f) {
- func_801A29D4(3, 1.0f, 2);
+ Audio_SetSeqTempoAndFreq(3, 1.0f, 2);
}
if (this->unk268 == 0) {
func_801A3B48(1);
@@ -271,11 +288,11 @@ void func_80BC7068(EnGuruguru* this, PlayState* play) {
this->skelAnime.playSpeed = 1.0f;
}
this->unk266 = 1;
- func_80151938(play, textIDs[this->textIdIndex]);
+ Message_ContinueTextbox(play, textIDs[this->textIdIndex]);
return;
}
func_801A3B48(0);
- func_80151BB4(play, 0x13);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GURU_GURU);
func_80BC6E10(this);
}
}
@@ -295,12 +312,12 @@ void func_80BC7440(EnGuruguru* this, PlayState* play) {
this->textIdIndex++;
this->actor.textId = textIDs[this->textIdIndex];
func_801A3B48(1);
- func_800B8500(&this->actor, play, 400.0f, 400.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 400.0f, 400.0f, PLAYER_IA_MINUS1);
this->unk268 = 0;
SET_WEEKEVENTREG(WEEKEVENTREG_38_40);
this->actionFunc = func_80BC7520;
} else {
- Actor_PickUp(&this->actor, play, GI_MASK_BREMEN, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_MASK_BREMEN, 300.0f, 300.0f);
}
}
@@ -309,7 +326,7 @@ void func_80BC7520(EnGuruguru* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actionFunc = func_80BC7068;
} else {
- func_800B8500(&this->actor, play, 400.0f, 400.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 400.0f, 400.0f, PLAYER_IA_MINUS1);
}
}
@@ -324,7 +341,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 +369,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 +380,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);
}
@@ -371,7 +390,7 @@ void EnGuruguru_Update(Actor* thisx, PlayState* play) {
s32 EnGuruguru_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnGuruguru* this = THIS;
- if (limbIndex == 14) {
+ if (limbIndex == GURU_GURU_LIMB_HEAD) {
rot->x += this->headXRot;
rot->z += this->headZRot;
}
@@ -383,11 +402,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_Guruguru/z_en_guruguru.h b/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.h
index 0158e3ddc..4913d4124 100644
--- a/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.h
+++ b/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.h
@@ -2,6 +2,7 @@
#define Z_EN_GURUGURU_H
#include "global.h"
+#include "objects/object_fu/object_fu.h"
struct EnGuruguru;
@@ -10,8 +11,8 @@ typedef void (*EnGuruguruActionFunc)(struct EnGuruguru*, PlayState*);
typedef struct EnGuruguru {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[16];
- /* 0x1E8 */ Vec3s morphTable[16];
+ /* 0x188 */ Vec3s jointTable[GURU_GURU_LIMB_MAX];
+ /* 0x1E8 */ Vec3s morphTable[GURU_GURU_LIMB_MAX];
/* 0x248 */ EnGuruguruActionFunc actionFunc;
/* 0x24C */ s16 headZRot;
/* 0x24E */ s16 headXRot;
@@ -22,7 +23,7 @@ typedef struct EnGuruguru {
/* 0x264 */ s16 unusedTimer; // set to 6 and decremented, but never has any effect
/* 0x266 */ s16 unk266;
/* 0x268 */ s16 unk268;
- /* 0x26C */ f32 frameCount;
+ /* 0x26C */ f32 animEndFrame;
/* 0x270 */ u8 unk270;
/* 0x272 */ s16 unk272; // set, but never used
/* 0x274 */ s16 textIdIndex;
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 0e1d2f050..f5885b3cf 100644
--- a/src/overlays/actors/ovl_En_Hakurock/z_en_hakurock.c
+++ b/src/overlays/actors/ovl_En_Hakurock/z_en_hakurock.c
@@ -165,7 +165,7 @@ void func_80B21EA4(EnHakurock* this, s32 arg1) {
}
void func_80B21FFC(EnHakurock* this) {
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
this->collider.base.atFlags &= ~AT_HIT;
this->collider.base.ocFlags1 &= ~OC1_HIT;
this->actor.draw = NULL;
@@ -186,7 +186,7 @@ void func_80B22040(EnHakurock* this, PlayState* play) {
void func_80B220A8(EnHakurock* this) {
this->actor.params = EN_HAKUROCK_TYPE_BOULDER;
this->actor.draw = func_80B228F4;
- this->actor.speedXZ = Rand_ZeroFloat(3.5f) + 2.5f;
+ this->actor.speed = Rand_ZeroFloat(3.5f) + 2.5f;
this->actor.velocity.y = Rand_ZeroFloat(4.5f) + 18.0f;
Actor_SetScale(&this->actor, (Rand_ZeroFloat(5.0f) + 15.0f) * 0.001f);
this->actor.world.rot.y = ((s32)Rand_Next() >> 0x12) + this->actor.parent->shape.rot.y + 0x8000;
@@ -210,8 +210,8 @@ void func_80B221E8(EnHakurock* this, PlayState* play) {
this->actor.shape.rot.z += 0xB00;
if ((this->collider.base.atFlags & AT_HIT) || ((this->counter == 0) && (this->collider.base.ocFlags1 & OC1_HIT)) ||
- ((this->actor.bgCheckFlags & 1) && (this->actor.velocity.y < 0.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_ROCK_BROKEN);
+ ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->actor.velocity.y < 0.0f))) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_ROCK_BROKEN);
func_80B21EA4(this, 0);
func_80B21FFC(this);
}
@@ -244,9 +244,9 @@ void func_80B2242C(EnHakurock* this, PlayState* play) {
if ((this->collider.base.ocFlags1 & OC1_HIT) && (this->collider.base.oc == this->actor.parent)) {
func_80B21EA4(this, 1);
func_80B21FFC(this);
- } else if ((this->actor.bgCheckFlags & 1)) {
+ } else if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
func_80B21EA4(this, 2);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_OBJECT_STICK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_OBJECT_STICK);
func_80B224C0(this);
}
}
@@ -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 507bf9deb..85000e5cb 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,48 +141,49 @@ 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);
sp53 = 0xFF;
- if (sp53) {}
for (i = 0; i < 400; i++, arg0++) {
- if (arg0->unk_00 == 1) {
- Matrix_Translate(arg0->unk_08.x, arg0->unk_08.y, arg0->unk_08.z, MTXMODE_NEW);
- Matrix_ReplaceRotation(&play->billboardMtxF);
- if (arg0->unk_01 < 40) {
- Matrix_Scale(arg0->unk_04 * 0.025f * arg0->unk_01, arg0->unk_04 * 0.025f * arg0->unk_01, 1.0f,
- MTXMODE_APPLY);
- } else {
- Matrix_Scale(arg0->unk_04, arg0->unk_04, 1.0f, MTXMODE_APPLY);
- }
- Matrix_RotateZS(play->gameplayFrames * 4864, MTXMODE_APPLY);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
-
- if (sp53 != arg0->unk_02) {
- gDPPipeSync(POLY_XLU_DISP++);
- gDPSetEnvColor(POLY_XLU_DISP++, D_80B23C40[arg0->unk_02], D_80B23C40[arg0->unk_02 + 1],
- D_80B23C40[arg0->unk_02 + 2], 255);
-
- sp53 = arg0->unk_02;
- }
-
- if (arg0->unk_01 < 6) {
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, D_80B23C2C[arg0->unk_02], D_80B23C2C[arg0->unk_02 + 1],
- D_80B23C2C[arg0->unk_02 + 2], arg0->unk_01 * 50);
- } else {
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, D_80B23C2C[arg0->unk_02], D_80B23C2C[arg0->unk_02 + 1],
- D_80B23C2C[arg0->unk_02 + 2], 255);
- }
-
- gSPDisplayList(POLY_XLU_DISP++, gSunSparkleModelDL);
+ if (arg0->unk_00 != 1) {
+ continue;
}
+
+ Matrix_Translate(arg0->unk_08.x, arg0->unk_08.y, arg0->unk_08.z, MTXMODE_NEW);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ if (arg0->unk_01 < 40) {
+ Matrix_Scale(arg0->unk_04 * 0.025f * arg0->unk_01, arg0->unk_04 * 0.025f * arg0->unk_01, 1.0f,
+ MTXMODE_APPLY);
+ } else {
+ Matrix_Scale(arg0->unk_04, arg0->unk_04, 1.0f, MTXMODE_APPLY);
+ }
+ Matrix_RotateZS(play->gameplayFrames * 4864, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ if (sp53 != arg0->unk_02) {
+ gDPPipeSync(POLY_XLU_DISP++);
+ gDPSetEnvColor(POLY_XLU_DISP++, D_80B23C40[arg0->unk_02], D_80B23C40[arg0->unk_02 + 1],
+ D_80B23C40[arg0->unk_02 + 2], 255);
+
+ sp53 = arg0->unk_02;
+ }
+
+ if (arg0->unk_01 < 6) {
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, D_80B23C2C[arg0->unk_02], D_80B23C2C[arg0->unk_02 + 1],
+ D_80B23C2C[arg0->unk_02 + 2], arg0->unk_01 * 50);
+ } else {
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, D_80B23C2C[arg0->unk_02], D_80B23C2C[arg0->unk_02 + 1],
+ D_80B23C2C[arg0->unk_02 + 2], 255);
+ }
+
+ gSPDisplayList(POLY_XLU_DISP++, gSunSparkleModelDL);
}
CLOSE_DISPS(gfxCtx);
@@ -193,6 +194,7 @@ void EnHanabi_Init(Actor* thisx, PlayState* play2) {
EnHanabi* this = THIS;
s32 i;
+ //! FAKE:
if (1) {}
Actor_SetScale(thisx, 1.0f);
@@ -286,10 +288,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);
@@ -297,7 +299,7 @@ void func_80B236C8(EnHanabi* this, PlayState* play) {
this->actor.home.rot.y += (s16)((Rand_ZeroFloat(40.0f) + 80.0f) * 256.0f);
this->unk_144 = (s32)Rand_ZeroFloat(5.0f) + 20;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_OC_FIREWORKS);
+ Actor_PlaySfx(&this->actor, NA_SE_OC_FIREWORKS);
func_80B235CC(this, &sp34, sp28);
}
}
@@ -324,15 +326,15 @@ 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);
+ Actor_PlaySfx_FlaggedCentered3(&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)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_KYOJIN_GROAN);
+ 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..b22949cb0 100644
--- a/src/overlays/actors/ovl_En_Hata/z_en_hata.c
+++ b/src/overlays/actors/ovl_En_Hata/z_en_hata.c
@@ -33,13 +33,12 @@ void EnHata_Init(Actor* thisx, PlayState* play) {
s32 rand;
f32 endFrame;
- SkelAnime_Init(play, &this->skelAnime, &object_hata_Skel_002FD0, NULL, this->jointTable, this->morphTable,
- OBJECT_HATA_LIMB_MAX);
- endFrame = Animation_GetLastFrame(&object_hata_Anim_000444);
- Animation_Change(&this->skelAnime, &object_hata_Anim_000444, 1.0f, 0.0f, endFrame, ANIMMODE_LOOP, 0.0f);
+ SkelAnime_Init(play, &this->skelAnime, &gFlagpoleSkel, NULL, this->jointTable, this->morphTable, FLAGPOLE_LIMB_MAX);
+ endFrame = Animation_GetLastFrame(&gFlagpoleFlapAnim);
+ Animation_Change(&this->skelAnime, &gFlagpoleFlapAnim, 1.0f, 0.0f, endFrame, ANIMMODE_LOOP, 0.0f);
rand = Rand_ZeroFloat(endFrame);
this->skelAnime.curFrame = rand;
- DynaPolyActor_LoadMesh(play, &this->dyna, &object_hata_Colheader_0000C0);
+ DynaPolyActor_LoadMesh(play, &this->dyna, &gFlagpoleCol);
Actor_SetScale(&this->dyna.actor, 0.013f);
this->dyna.actor.uncullZoneScale = 500.0f;
this->dyna.actor.uncullZoneDownward = 500.0f;
@@ -63,10 +62,10 @@ void EnHata_Update(Actor* thisx, PlayState* play2) {
this->skelAnime.playSpeed = 2.75f * phi_fv0;
this->skelAnime.playSpeed += 1.0f + Rand_ZeroFloat(1.25f);
- sp34.x = play->envCtx.windDir.x;
- sp34.y = play->envCtx.windDir.y + ((1.0f - phi_fv0) * 240.0f);
+ sp34.x = play->envCtx.windDirection.x;
+ sp34.y = play->envCtx.windDirection.y + ((1.0f - phi_fv0) * 240.0f);
sp34.y = CLAMP(sp34.y, -118.0f, 118.0f);
- sp34.z = play->envCtx.windDir.z;
+ sp34.z = play->envCtx.windDirection.z;
phi_fv0 = CLAMP(phi_fv0, 0.1f, 0.4f);
Math_ApproachF(&this->unk_2A4.x, sp34.x, phi_fv0, 1000.0f);
@@ -84,7 +83,7 @@ void EnHata_Update(Actor* thisx, PlayState* play2) {
s32 EnHata_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnHata* this = THIS;
- if ((limbIndex == OBJECT_HATA_LIMB_04) || (limbIndex == OBJECT_HATA_LIMB_0D)) {
+ if ((limbIndex == FLAGPOLE_LIMB_FLAG1_HOIST_END_BASE) || (limbIndex == FLAGPOLE_LIMB_FLAG2_HOIST_END_BASE)) {
rot->y += this->unk_29C;
rot->z += this->unk_2A0;
}
@@ -94,7 +93,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_Hata/z_en_hata.h b/src/overlays/actors/ovl_En_Hata/z_en_hata.h
index 155460f60..60e3edba8 100644
--- a/src/overlays/actors/ovl_En_Hata/z_en_hata.h
+++ b/src/overlays/actors/ovl_En_Hata/z_en_hata.h
@@ -9,8 +9,8 @@ struct EnHata;
typedef struct EnHata {
/* 0x000 */ DynaPolyActor dyna;
/* 0x15C */ SkelAnime skelAnime;
- /* 0x1A0 */ Vec3s jointTable[OBJECT_HATA_LIMB_MAX];
- /* 0x21E */ Vec3s morphTable[OBJECT_HATA_LIMB_MAX];
+ /* 0x1A0 */ Vec3s jointTable[FLAGPOLE_LIMB_MAX];
+ /* 0x21E */ Vec3s morphTable[FLAGPOLE_LIMB_MAX];
/* 0x29C */ s16 unk_29C;
/* 0x29E */ UNK_TYPE1 pad_29E[2];
/* 0x2A0 */ s16 unk_2A0;
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 756f37eb8..19c2a34a8 100644
--- a/src/overlays/actors/ovl_En_Heishi/z_en_heishi.c
+++ b/src/overlays/actors/ovl_En_Heishi/z_en_heishi.c
@@ -6,7 +6,7 @@
#include "z_en_heishi.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnHeishi*)thisx)
@@ -20,14 +20,6 @@ void EnHeishi_SetHeadRotation(EnHeishi* this);
void EnHeishi_SetupIdle(EnHeishi* this);
void EnHeishi_Idle(EnHeishi* this, PlayState* play);
-typedef enum {
- /* 0 */ HEISHI_ANIM_STAND_HAND_ON_HIP,
- /* 1 */ HEISHI_ANIM_CHEER_WITH_SPEAR,
- /* 2 */ HEISHI_ANIM_WAVE,
- /* 3 */ HEISHI_ANIM_SIT_AND_REACH,
- /* 4 */ HEISHI_ANIM_STAND_UP
-} EnHeishiAnimation;
-
ActorInit En_Heishi_InitVars = {
ACTOR_EN_HEISHI,
ACTORCAT_NPC,
@@ -84,10 +76,10 @@ void EnHeishi_Init(Actor* thisx, PlayState* play) {
}
}
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
this->actor.gravity = -3.0f;
Collider_InitAndSetCylinder(play, &this->colliderCylinder, &this->actor, &sCylinderInit);
- this->actor.flags |= ACTOR_FLAG_8000000;
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
EnHeishi_SetupIdle(this);
}
@@ -97,19 +89,36 @@ void EnHeishi_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyCylinder(play, &this->colliderCylinder);
}
+typedef enum EnHeishiAnimation {
+ /* 0 */ HEISHI_ANIM_STAND_HAND_ON_HIP,
+ /* 1 */ HEISHI_ANIM_CHEER_WITH_SPEAR,
+ /* 2 */ HEISHI_ANIM_WAVE,
+ /* 3 */ HEISHI_ANIM_SIT_AND_REACH,
+ /* 4 */ HEISHI_ANIM_STAND_UP,
+ /* 5 */ HEISHI_ANIM_MAX
+} EnHeishiAnimation;
+
+static AnimationHeader* sAnimations[HEISHI_ANIM_MAX] = {
+ &gSoldierStandHandOnHip, // HEISHI_ANIM_STAND_HAND_ON_HIP
+ &gSoldierCheerWithSpear, // HEISHI_ANIM_CHEER_WITH_SPEAR
+ &gSoldierWave, // HEISHI_ANIM_WAVE
+ &gSoldierSitAndReach, // HEISHI_ANIM_SIT_AND_REACH
+ &gSoldierStandUp, // HEISHI_ANIM_STAND_UP
+};
+
+static u8 sAnimationModes[HEISHI_ANIM_MAX] = {
+ ANIMMODE_LOOP, // HEISHI_ANIM_STAND_HAND_ON_HIP
+ ANIMMODE_LOOP, // HEISHI_ANIM_CHEER_WITH_SPEAR
+ ANIMMODE_LOOP, // HEISHI_ANIM_WAVE
+ ANIMMODE_LOOP, // HEISHI_ANIM_SIT_AND_REACH
+ ANIMMODE_ONCE, // HEISHI_ANIM_STAND_UP
+};
+
void EnHeishi_ChangeAnim(EnHeishi* this, s32 animIndex) {
- static AnimationHeader* sAnimations[] = {
- &gSoldierStandHandOnHip, &gSoldierCheerWithSpear, &gSoldierWave, &gSoldierSitAndReach, &gSoldierStandUp,
- };
- static u8 sAnimationModes[] = {
- ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_LOOP,
- ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP,
- ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP,
- };
this->animIndex = animIndex;
- this->frameCount = Animation_GetLastFrame(sAnimations[this->animIndex]);
- Animation_Change(&this->skelAnime, sAnimations[this->animIndex], 1.0f, 0.0f, this->frameCount,
+ this->animEndFrame = Animation_GetLastFrame(sAnimations[this->animIndex]);
+ Animation_Change(&this->skelAnime, sAnimations[this->animIndex], 1.0f, 0.0f, this->animEndFrame,
sAnimationModes[this->animIndex], -10.0f);
}
@@ -156,7 +165,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 +195,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_Heishi/z_en_heishi.h b/src/overlays/actors/ovl_En_Heishi/z_en_heishi.h
index 1758ceae6..4d886cb3c 100644
--- a/src/overlays/actors/ovl_En_Heishi/z_en_heishi.h
+++ b/src/overlays/actors/ovl_En_Heishi/z_en_heishi.h
@@ -25,7 +25,7 @@ typedef struct EnHeishi {
/* 0x26C */ s32 shouldSetHeadRotation;
/* 0x270 */ s16 timer;
/* 0x272 */ s16 yawTowardsPlayer;
- /* 0x274 */ f32 frameCount;
+ /* 0x274 */ f32 animEndFrame;
/* 0x278 */ s16 unk278; // set and not used
/* 0x27C */ UNK_TYPE1 unk_27C[0x8];
/* 0x284 */ ColliderCylinder colliderCylinder;
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 e100a2de3..648b63b6b 100644
--- a/src/overlays/actors/ovl_En_Hg/z_en_hg.c
+++ b/src/overlays/actors/ovl_En_Hg/z_en_hg.c
@@ -6,7 +6,7 @@
#include "z_en_hg.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_100000 | ACTOR_FLAG_2000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_100000 | ACTOR_FLAG_2000000)
#define THIS ((EnHg*)thisx)
@@ -29,22 +29,11 @@ void EnHg_HandleCsAction(EnHg* this, PlayState* play);
s32 EnHg_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx);
void EnHg_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx);
-typedef enum {
- /* 0 */ HG_ANIM_IDLE,
- /* 1 */ HG_ANIM_LURCH_FORWARD,
- /* 2 */ HG_ANIM_RECOIL,
- /* 3 */ HG_ANIM_LEAN_FORWARD,
- /* 4 */ HG_ANIM_REACH_FORWARD,
- /* 5 */ HG_ANIM_CURL_UP,
- /* 6 */ HG_ANIM_CROUCHED_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 = {
@@ -118,22 +107,34 @@ static CollisionCheckInfoInit2 sColChkInfoInit2 = {
0, 0, 0, 0, 0x80,
};
-static AnimationInfo sAnimationInfo[] = {
- { &gPamelasFatherIdleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
- { &gPamelasFatherLurchForwardAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
- { &gPamelasFatherRecoilFromHitAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
- { &gPamelasFatherLeanForwardAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f },
- { &gPamelasFatherReachForwardAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f },
- { &gPamelasFatherCurlUpAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f },
- { &gPamelasFatherCrouchedPanicAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f },
- { &gPamelasFatherPanicAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f },
+typedef enum {
+ /* 0 */ HG_ANIM_IDLE,
+ /* 1 */ HG_ANIM_LURCH_FORWARD,
+ /* 2 */ HG_ANIM_RECOIL,
+ /* 3 */ HG_ANIM_LEAN_FORWARD,
+ /* 4 */ HG_ANIM_REACH_FORWARD,
+ /* 5 */ HG_ANIM_CURL_UP,
+ /* 6 */ HG_ANIM_CROUCHED_PANIC,
+ /* 7 */ HG_ANIM_PANIC,
+ /* 8 */ HG_ANIM_MAX
+} HgAnimation;
+
+static AnimationInfo sAnimationInfo[HG_ANIM_MAX] = {
+ { &gPamelasFatherIdleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // HG_ANIM_IDLE
+ { &gPamelasFatherLurchForwardAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // HG_ANIM_LURCH_FORWARD
+ { &gPamelasFatherRecoilFromHitAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // HG_ANIM_RECOIL
+ { &gPamelasFatherLeanForwardAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // HG_ANIM_LEAN_FORWARD
+ { &gPamelasFatherReachForwardAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // HG_ANIM_REACH_FORWARD
+ { &gPamelasFatherCurlUpAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // HG_ANIM_CURL_UP
+ { &gPamelasFatherCrouchedPanicAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // HG_ANIM_CROUCHED_PANIC
+ { &gPamelasFatherPanicAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // HG_ANIM_PANIC
};
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 +143,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.targetMode = TARGET_MODE_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,13 +172,13 @@ 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))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_HALF_REDEAD_SURPRISE);
+ 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);
}
}
}
@@ -191,8 +192,8 @@ void EnHg_ChasePlayer(EnHg* this, PlayState* play) {
Player* player = GET_PLAYER(play);
s32 pad;
- this->actor.speedXZ = 1.6f;
- if (!(player->stateFlags2 & PLAYER_STATE2_8000000) && Message_GetState(&play->msgCtx) == TEXT_STATE_NONE) {
+ this->actor.speed = 1.6f;
+ if (!(player->stateFlags2 & PLAYER_STATE2_8000000) && (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE)) {
if (((this->skelAnime.curFrame > 9.0f) && (this->skelAnime.curFrame < 16.0f)) ||
((this->skelAnime.curFrame > 44.0f) && (this->skelAnime.curFrame < 51.0f))) {
Actor_MoveWithGravity(&this->actor);
@@ -233,10 +234,9 @@ void EnHg_ReactToHit(EnHg* this, PlayState* play) {
void EnHg_HandleTatlDialog(EnHg* this, PlayState* play) {
if (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- // "...Sort of looks different..."
Message_StartTextbox(play, 0x24F, &this->actor);
} else {
- func_800B8614(&this->actor, play, 80.0f);
+ Actor_OfferTalk(&this->actor, play, 80.0f);
}
}
}
@@ -245,7 +245,7 @@ void EnHg_PlayRedeadSfx(EnHg* this, PlayState* play) {
if (this->actor.colChkInfo.health == 1) {
if ((this->actionFunc == EnHg_ChasePlayer) || (this->actionFunc == EnHg_ReactToHit) ||
(this->actionFunc == EnHg_ChasePlayerWait)) {
- func_800B9010(&this->actor, NA_SE_EN_HALF_REDEAD_LOOP - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_HALF_REDEAD_LOOP - SFX_FLAG);
}
}
}
@@ -270,52 +270,52 @@ 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;
+ this->animIndex = HG_ANIM_IDLE;
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)) {
- func_8019F128(NA_SE_EN_HALF_REDEAD_TRANS);
+ if ((this->csIdIndex == HG_CS_GET_MASK) || (this->csIdIndex == HG_CS_SONG_OF_HEALING)) {
+ Audio_PlaySfx_2(NA_SE_EN_HALF_REDEAD_TRANS);
}
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HG_ANIM_PANIC);
break;
@@ -329,6 +329,9 @@ void EnHg_HandleCsAction(EnHg* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_75_20);
Actor_Kill(&this->actor);
break;
+
+ default:
+ break;
}
} else if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
switch (this->animIndex) {
@@ -341,36 +344,41 @@ void EnHg_HandleCsAction(EnHg* this, PlayState* play) {
this->animIndex = HG_ANIM_CROUCHED_PANIC;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HG_ANIM_CROUCHED_PANIC);
break;
+
+ default:
+ break;
}
}
switch (this->animIndex) {
case HG_ANIM_LEAN_FORWARD:
case HG_ANIM_REACH_FORWARD:
- func_800B9010(&this->actor, NA_SE_EN_HALF_REDEAD_LOOP - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_HALF_REDEAD_LOOP - SFX_FLAG);
break;
case HG_ANIM_CURL_UP:
case HG_ANIM_CROUCHED_PANIC:
- func_800B9010(&this->actor, NA_SE_EN_HALF_REDEAD_SCREAME - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_HALF_REDEAD_SCREAME - SFX_FLAG);
break;
case HG_ANIM_PANIC:
- if ((this->cutsceneIndex == HG_CS_FIRST_ENCOUNTER) ||
- (this->cutsceneIndex == HG_CS_SUBSEQUENT_ENCOUNTER)) {
- func_800B9010(&this->actor, NA_SE_EN_HALF_REDEAD_SCREAME - SFX_FLAG);
+ if ((this->csIdIndex == HG_CS_FIRST_ENCOUNTER) || (this->csIdIndex == HG_CS_SUBSEQUENT_ENCOUNTER)) {
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_HALF_REDEAD_SCREAME - SFX_FLAG);
}
break;
+
+ default:
+ 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) {
@@ -383,20 +391,19 @@ void EnHg_WaitForPlayerAction(EnHg* this, PlayState* play) {
if (player->stateFlags2 & PLAYER_STATE2_8000000) {
if (!sHasSoundPlayed) {
- play_sound(NA_SE_SY_TRE_BOX_APPEAR);
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
}
sHasSoundPlayed = true;
} else {
sHasSoundPlayed = false;
}
- if (play->msgCtx.ocarinaMode == 3) {
- if ((play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING) &&
- (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN)) {
+ if (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) {
+ if ((play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING) && (GET_PLAYER_FORM == 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 +414,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 +435,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 +456,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 f7a9df82a..c4d9c0371 100644
--- a/src/overlays/actors/ovl_En_Hgo/z_en_hgo.c
+++ b/src/overlays/actors/ovl_En_Hgo/z_en_hgo.c
@@ -6,7 +6,7 @@
#include "z_en_hgo.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
#define THIS ((EnHgo*)thisx)
@@ -38,16 +38,6 @@ typedef enum {
/* 2 */ HGO_EYE_CLOSED
} EyeState;
-typedef enum {
- /* 0 */ HGO_ANIM_ARMS_FOLDED,
- /* 1 */ HGO_ANIM_ASTONISHED,
- /* 2 */ HGO_ANIM_KNEEL_DOWN_AND_HUG,
- /* 3 */ HGO_ANIM_CONSOLE,
- /* 4 */ HGO_ANIM_CONSOLE_HEAD_UP,
- /* 5 */ HGO_ANIM_REACH_DOWN_TO_LIFT,
- /* 6 */ HGO_ANIM_TOSS,
-} HgoAnimation;
-
ActorInit En_Hgo_InitVars = {
ACTOR_EN_HGO,
ACTORCAT_NPC,
@@ -60,14 +50,25 @@ ActorInit En_Hgo_InitVars = {
(ActorFunc)EnHgo_Draw,
};
-static AnimationInfo sAnimationInfo[] = {
- { &gPamelasFatherArmsFoldedAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
- { &gPamelasFatherAstonishedAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f },
- { &gPamelasFatherKneelDownAndHugAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f },
- { &gPamelasFatherConsoleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f },
- { &gPamelasFatherConsoleHeadUpAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f },
- { &gPamelasFatherReachDownToLiftAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f },
- { &gPamelasFatherTossAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f },
+typedef enum {
+ /* 0 */ HGO_ANIM_ARMS_FOLDED,
+ /* 1 */ HGO_ANIM_ASTONISHED,
+ /* 2 */ HGO_ANIM_KNEEL_DOWN_AND_HUG,
+ /* 3 */ HGO_ANIM_CONSOLE,
+ /* 4 */ HGO_ANIM_CONSOLE_HEAD_UP,
+ /* 5 */ HGO_ANIM_REACH_DOWN_TO_LIFT,
+ /* 6 */ HGO_ANIM_TOSS,
+ /* 7 */ HGO_ANIM_MAX
+} HgoAnimation;
+
+static AnimationInfo sAnimationInfo[HGO_ANIM_MAX] = {
+ { &gPamelasFatherArmsFoldedAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // HGO_ANIM_ARMS_FOLDED
+ { &gPamelasFatherAstonishedAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // HGO_ANIM_ASTONISHED
+ { &gPamelasFatherKneelDownAndHugAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // HGO_ANIM_KNEEL_DOWN_AND_HUG
+ { &gPamelasFatherConsoleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // HGO_ANIM_CONSOLE
+ { &gPamelasFatherConsoleHeadUpAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // HGO_ANIM_CONSOLE_HEAD_UP
+ { &gPamelasFatherReachDownToLiftAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // HGO_ANIM_REACH_DOWN_TO_LIFT
+ { &gPamelasFatherTossAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, // HGO_ANIM_TOSS
};
static ColliderCylinderInit sCylinderInit = {
@@ -102,14 +103,15 @@ void EnHgo_Init(Actor* thisx, PlayState* play) {
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&thisx->colChkInfo, NULL, &sColChkInfoInit);
- thisx->targetMode = 6;
+ thisx->targetMode = TARGET_MODE_6;
this->eyeIndex = 0;
this->blinkTimer = 0;
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;
@@ -124,7 +126,7 @@ void EnHgo_Destroy(Actor* thisx, PlayState* play) {
}
void EnHgo_SetupDoNothing(EnHgo* this) {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actionFunc = EnHgo_DoNothing;
}
@@ -143,7 +145,7 @@ void EnHgo_UpdateCollision(EnHgo* this, PlayState* play) {
}
void EnHgo_SetupTalk(EnHgo* this) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HGO_ANIM_ARMS_FOLDED);
this->actionFunc = EnHgo_Talk;
}
@@ -159,7 +161,7 @@ void EnHgo_Talk(EnHgo* this, PlayState* play) {
Message_StartTextbox(play, 0x15A7, &this->actor);
this->textId = 0x15A7; // can I research that mask
}
- } else if (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) {
+ } else if (GET_PLAYER_FORM == PLAYER_FORM_HUMAN) {
if (!(this->talkFlags & TALK_FLAG_HAS_SPOKEN_WITH_HUMAN)) {
this->talkFlags |= TALK_FLAG_HAS_SPOKEN_WITH_HUMAN;
Message_StartTextbox(play, 0x158F, &this->actor);
@@ -180,7 +182,7 @@ void EnHgo_Talk(EnHgo* this, PlayState* play) {
}
EnHgo_SetupDialogueHandler(this);
} else {
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
}
@@ -206,6 +208,9 @@ void EnHgo_DefaultDialogueHandler(EnHgo* this, PlayState* play) {
EnHgo_SetupTalk(this);
}
break;
+
+ default:
+ break;
}
Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 0xA, 0x71C, 0xB6);
@@ -268,81 +273,89 @@ void EnHgo_HandlePlayerChoice(EnHgo* this, PlayState* play) {
break;
case 0x15A7:
- func_801477B4(play);
+ Message_CloseTextbox(play);
EnHgo_SetupTalk(this);
break;
+
+ default:
+ break;
}
}
}
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);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HGO_ANIM_ARMS_FOLDED);
break;
case 2:
this->actor.draw = EnHgo_Draw;
this->animIndex = HGO_ANIM_ASTONISHED;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HGO_ANIM_ASTONISHED);
break;
case 3:
this->animIndex = HGO_ANIM_KNEEL_DOWN_AND_HUG;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HGO_ANIM_KNEEL_DOWN_AND_HUG);
break;
case 4:
this->animIndex = HGO_ANIM_CONSOLE;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HGO_ANIM_CONSOLE);
break;
case 5:
this->animIndex = HGO_ANIM_CONSOLE_HEAD_UP;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 4);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HGO_ANIM_CONSOLE_HEAD_UP);
break;
case 6:
this->animIndex = HGO_ANIM_REACH_DOWN_TO_LIFT;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 5);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HGO_ANIM_REACH_DOWN_TO_LIFT);
+ break;
+
+ default:
break;
}
} else if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
switch (this->animIndex) {
case HGO_ANIM_ASTONISHED:
- if ((Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) &&
- (this->isInCutscene == false)) {
+ if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame) && !this->isInCutscene) {
this->isInCutscene = true;
if ((gSaveContext.sceneLayer == 0) &&
- ((play->csCtx.currentCsIndex == 2) || (play->csCtx.currentCsIndex == 4))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_VO_GBVO02);
+ ((play->csCtx.scriptIndex == 2) || (play->csCtx.scriptIndex == 4))) {
+ Actor_PlaySfx(&this->actor, NA_SE_VO_GBVO02);
}
}
break;
case HGO_ANIM_KNEEL_DOWN_AND_HUG:
this->animIndex = HGO_ANIM_CONSOLE;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HGO_ANIM_CONSOLE);
break;
case HGO_ANIM_REACH_DOWN_TO_LIFT:
this->animIndex = HGO_ANIM_TOSS;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 6);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HGO_ANIM_TOSS);
+
+ default:
+ break;
}
}
- 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 +363,7 @@ s32 EnHgo_HandleCsAction(EnHgo* this, PlayState* play) {
EnHgo_SetupInitCollision(this);
}
- this->csAction = 0x63;
+ this->cueId = 99;
return false;
}
@@ -416,12 +429,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 d8df99887..48f75aa68 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
@@ -6,9 +6,8 @@
#include "z_en_hidden_nuts.h"
#include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h"
-#include "objects/object_hintnuts/object_hintnuts.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_2000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_2000000)
#define THIS ((EnHiddenNuts*)thisx)
@@ -63,15 +62,41 @@ static ColliderCylinderInit sCylinderInit = {
{ 30, 20, 0, { 0, 0, 0 } },
};
-static AnimationHeader* D_80BDC0FC[] = {
- &object_hintnuts_Anim_000168, &object_hintnuts_Anim_0024CC, &object_hintnuts_Anim_0026C4,
- &object_hintnuts_Anim_002894, &object_hintnuts_Anim_002B90, &object_hintnuts_Anim_002F7C,
- &object_hintnuts_Anim_003128, &object_hintnuts_Anim_0029BC, &object_hintnuts_Anim_0024CC,
+typedef enum EnHiddenNutsAnimation {
+ /* 0 */ ENHIDDENNUTS_ANIM_0,
+ /* 1 */ ENHIDDENNUTS_ANIM_1,
+ /* 2 */ ENHIDDENNUTS_ANIM_2,
+ /* 3 */ ENHIDDENNUTS_ANIM_3,
+ /* 4 */ ENHIDDENNUTS_ANIM_4,
+ /* 5 */ ENHIDDENNUTS_ANIM_5,
+ /* 6 */ ENHIDDENNUTS_ANIM_6,
+ /* 7 */ ENHIDDENNUTS_ANIM_7,
+ /* 8 */ ENHIDDENNUTS_ANIM_8,
+ /* 9 */ ENHIDDENNUTS_ANIM_MAX
+} EnHiddenNutsAnimation;
+
+static AnimationHeader* sAnimations[ENHIDDENNUTS_ANIM_MAX] = {
+ &object_hintnuts_Anim_000168, // ENHIDDENNUTS_ANIM_0
+ &object_hintnuts_Anim_0024CC, // ENHIDDENNUTS_ANIM_1
+ &object_hintnuts_Anim_0026C4, // ENHIDDENNUTS_ANIM_2
+ &object_hintnuts_Anim_002894, // ENHIDDENNUTS_ANIM_3
+ &object_hintnuts_Anim_002B90, // ENHIDDENNUTS_ANIM_4
+ &object_hintnuts_Anim_002F7C, // ENHIDDENNUTS_ANIM_5
+ &object_hintnuts_Anim_003128, // ENHIDDENNUTS_ANIM_6
+ &object_hintnuts_Anim_0029BC, // ENHIDDENNUTS_ANIM_7
+ &object_hintnuts_Anim_0024CC, // ENHIDDENNUTS_ANIM_8
};
-u8 D_80BDC120[] = {
- ANIMMODE_ONCE, ANIMMODE_ONCE, ANIMMODE_ONCE, ANIMMODE_LOOP, ANIMMODE_ONCE,
- ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_ONCE, ANIMMODE_LOOP,
+static u8 sAnimationModes[ENHIDDENNUTS_ANIM_MAX] = {
+ ANIMMODE_ONCE, // ENHIDDENNUTS_ANIM_0
+ ANIMMODE_ONCE, // ENHIDDENNUTS_ANIM_1
+ ANIMMODE_ONCE, // ENHIDDENNUTS_ANIM_2
+ ANIMMODE_LOOP, // ENHIDDENNUTS_ANIM_3
+ ANIMMODE_ONCE, // ENHIDDENNUTS_ANIM_4
+ ANIMMODE_LOOP, // ENHIDDENNUTS_ANIM_5
+ ANIMMODE_LOOP, // ENHIDDENNUTS_ANIM_6
+ ANIMMODE_ONCE, // ENHIDDENNUTS_ANIM_7
+ ANIMMODE_ONCE, // ENHIDDENNUTS_ANIM_8
};
void EnHiddenNuts_Init(Actor* thisx, PlayState* play) {
@@ -79,16 +104,16 @@ void EnHiddenNuts_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 20.0f);
SkelAnime_Init(play, &this->skelAnime, &object_hintnuts_Skel_0023B8.sh, &object_hintnuts_Anim_0024CC,
- this->jointTable, this->morphTable, 10);
+ this->jointTable, this->morphTable, OBJECT_HINTNUTS_LIMB_MAX);
Actor_SetScale(&this->actor, 0.01f);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
- this->actor.targetMode = 0;
+ this->actor.targetMode = TARGET_MODE_0;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
- this->unk_21E = ENHIDDENNUTS_GET_F80(&this->actor);
- this->switchFlag = ENHIDDENNUTS_GET_SWITCHFLAG(&this->actor);
+ this->pathIndex = ENHIDDENNUTS_GET_PATH_INDEX(&this->actor);
+ this->switchFlag = ENHIDDENNUTS_GET_SWITCH_FLAG(&this->actor);
if (this->switchFlag == 0x7F) {
this->switchFlag = -1;
@@ -99,13 +124,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);
}
@@ -116,27 +141,29 @@ void EnHiddenNuts_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyCylinder(play, &this->collider);
}
-void func_80BDB1B4(EnHiddenNuts* this, s32 arg1) {
- f32 sp34;
- f32 sp30;
+void EnHiddenNuts_ChangeAnim(EnHiddenNuts* this, s32 animIndex) {
+ f32 startFrame;
+ f32 morphFrames;
- this->unk_220 = arg1;
- sp34 = 0.0f;
- sp30 = -4.0f;
- this->unk_22C = Animation_GetLastFrame(D_80BDC0FC[arg1]);
- if (this->unk_220 == 1) {
- sp34 = this->unk_22C;
- sp30 = 0.0f;
+ this->animIndex = animIndex;
+ startFrame = 0.0f;
+ morphFrames = -4.0f;
+ this->animEndFrame = Animation_GetLastFrame(sAnimations[animIndex]);
+
+ if (this->animIndex == ENHIDDENNUTS_ANIM_1) {
+ startFrame = this->animEndFrame;
+ morphFrames = 0.0f;
}
- Animation_Change(&this->skelAnime, D_80BDC0FC[this->unk_220], 1.0f, sp34, this->unk_22C, D_80BDC120[this->unk_220],
- sp30);
+
+ Animation_Change(&this->skelAnime, sAnimations[this->animIndex], 1.0f, startFrame, this->animEndFrame,
+ sAnimationModes[this->animIndex], morphFrames);
}
void func_80BDB268(EnHiddenNuts* this) {
this->actor.textId = 0x234;
this->unk_228 = 1600.0f;
this->actor.shape.yOffset = 1600.0f;
- func_80BDB1B4(this, 1);
+ EnHiddenNuts_ChangeAnim(this, ENHIDDENNUTS_ANIM_1);
this->unk_21A = 0;
this->actionFunc = func_80BDB2B8;
}
@@ -145,18 +172,18 @@ void func_80BDB2B8(EnHiddenNuts* this, PlayState* play) {
Player* player = GET_PLAYER(play);
s32 i;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NEMURI_SLEEP - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NEMURI_SLEEP - SFX_FLAG);
if (player->stateFlags2 & PLAYER_STATE2_8000000) {
- if (this->unk_20A == 0) {
- play_sound(NA_SE_SY_TRE_BOX_APPEAR);
- this->unk_20A = 1;
+ if (!this->unk_20A) {
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
+ this->unk_20A = true;
}
} else {
- this->unk_20A = 0;
+ this->unk_20A = false;
}
- if (Actor_ProcessTalkRequest(&this->actor, &play->state) != 0) {
+ if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
func_80BDB580(this);
return;
}
@@ -173,8 +200,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);
@@ -183,13 +210,13 @@ void func_80BDB2B8(EnHiddenNuts* this, PlayState* play) {
}
if (!(this->actor.xzDistToPlayer > 120.0f)) {
- if ((play->msgCtx.ocarinaMode == 3) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_SONATA)) {
- play->msgCtx.ocarinaMode = 4;
+ if ((play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_SONATA)) {
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
func_80BDB788(this);
} else if (func_801A5100() == 2) {
func_80BDB788(this);
} else {
- func_800B8614(&this->actor, play, BREG(13) + 100.0f);
+ Actor_OfferTalk(&this->actor, play, BREG(13) + 100.0f);
}
}
}
@@ -202,7 +229,7 @@ void func_80BDB580(EnHiddenNuts* this) {
void func_80BDB59C(EnHiddenNuts* this, PlayState* play) {
s32 i;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NEMURI_SLEEP - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NEMURI_SLEEP - SFX_FLAG);
if (this->unk_218 == 0) {
Vec3f sp98 = { 0.0f, 0.0f, 0.0f };
@@ -216,8 +243,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);
@@ -226,16 +253,16 @@ void func_80BDB59C(EnHiddenNuts* this, PlayState* play) {
}
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_80BDB268(this);
}
}
void func_80BDB788(EnHiddenNuts* this) {
this->actor.flags |= ACTOR_FLAG_10;
- this->actor.flags |= ACTOR_FLAG_8000000;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_UP);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_DEAD);
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_DEAD);
this->unk_21A = 2;
this->actionFunc = func_80BDB7E8;
}
@@ -243,18 +270,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);
@@ -262,21 +289,21 @@ void func_80BDB7E8(EnHiddenNuts* this, PlayState* play) {
EffectSsHahen_SpawnBurst(play, &sp3C, 4.0f, 0, 10, 3, 15, HAHEN_OBJECT_DEFAULT, 10, NULL);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_UP);
- func_80BDB1B4(this, 7);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_UP);
+ EnHiddenNuts_ChangeAnim(this, ENHIDDENNUTS_ANIM_7);
this->actionFunc = func_80BDB8F4;
}
void func_80BDB8F4(EnHiddenNuts* this, PlayState* play) {
f32 curFrame = this->skelAnime.curFrame;
- if (this->unk_22C <= curFrame) {
+ if (curFrame >= this->animEndFrame) {
func_80BDB930(this);
}
}
void func_80BDB930(EnHiddenNuts* this) {
- func_80BDB1B4(this, 3);
+ EnHiddenNuts_ChangeAnim(this, ENHIDDENNUTS_ANIM_3);
this->unk_21A = 3;
this->unk_228 = 500.0f;
this->actionFunc = func_80BDB978;
@@ -287,10 +314,10 @@ void func_80BDB978(EnHiddenNuts* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 8.0f) ||
Animation_OnFrame(&this->skelAnime, 18.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUT_FAINT);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUT_FAINT);
}
- if (this->unk_22C <= curFrame) {
+ if (curFrame >= this->animEndFrame) {
this->unk_224++;
if (this->unk_224 >= 2) {
func_80BDBA28(this, play);
@@ -301,7 +328,7 @@ void func_80BDB978(EnHiddenNuts* this, PlayState* play) {
void func_80BDBA28(EnHiddenNuts* this, PlayState* play) {
Vec3f sp44;
- func_80BDB1B4(this, 2);
+ EnHiddenNuts_ChangeAnim(this, ENHIDDENNUTS_ANIM_2);
this->unk_228 = 0.0f;
Math_Vec3f_Copy(&sp44, &this->actor.world.pos);
@@ -309,14 +336,14 @@ void func_80BDBA28(EnHiddenNuts* this, PlayState* play) {
EffectSsHahen_SpawnBurst(play, &sp44, 4.0f, 0, 10, 3, 15, HAHEN_OBJECT_DEFAULT, 10, NULL);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_UP);
this->unk_208 = 1;
if ((this->path != NULL) && !SubS_CopyPointFromPath(this->path, this->unk_208, &this->unk_20C)) {
Actor_Kill(&this->actor);
}
- this->actor.speedXZ = 2.0f;
+ this->actor.speed = 2.0f;
this->actor.gravity = -2.0f;
this->actor.velocity.y = 4.0f;
this->actor.world.rot.y = Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_20C);
@@ -326,10 +353,10 @@ void func_80BDBA28(EnHiddenNuts* this, PlayState* play) {
void func_80BDBB48(EnHiddenNuts* this, PlayState* play) {
s32 pad[3];
- f32 sp58 = this->skelAnime.curFrame;
+ f32 curFrame = this->skelAnime.curFrame;
WaterBox* sp54;
f32 sp50;
- s16 sp4E = 0;
+ s16 sp4E = false;
Vec3f sp40;
if (WaterBox_GetSurface1(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z, &sp50, &sp54) &&
@@ -345,24 +372,24 @@ void func_80BDBB48(EnHiddenNuts* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 5.0f) ||
Animation_OnFrame(&this->skelAnime, 10.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_WALK_WATER);
- sp4E = 1;
+ Actor_PlaySfx(&this->actor, NA_SE_EV_WALK_WATER);
+ sp4E = true;
}
}
- if ((sp4E != 0) && (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 5.0f) ||
- Animation_OnFrame(&this->skelAnime, 10.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_WALK);
+ if (sp4E && (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 5.0f) ||
+ Animation_OnFrame(&this->skelAnime, 10.0f))) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_WALK);
}
Math_SmoothStepToS(&this->actor.world.rot.y, Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_20C), 1, 0x1388, 0);
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.world.rot.y, 1, 0x3E8, 0);
- if (this->unk_220 == 2) {
- if (this->unk_22C <= sp58) {
- this->actor.speedXZ = 0.0f;
+ if (this->animIndex == ENHIDDENNUTS_ANIM_2) {
+ if (curFrame >= this->animEndFrame) {
+ this->actor.speed = 0.0f;
this->actor.velocity.y = 0.0f;
- func_80BDB1B4(this, 6);
+ EnHiddenNuts_ChangeAnim(this, ENHIDDENNUTS_ANIM_6);
}
} else {
Math_ApproachF(&this->actor.world.pos.x, this->unk_20C.x, 0.5f,
@@ -387,7 +414,7 @@ void func_80BDBE70(EnHiddenNuts* this, PlayState* play) {
if (this->switchFlag >= 0) {
Flags_SetSwitch(play, this->switchFlag);
}
- func_80BDB1B4(this, 8);
+ EnHiddenNuts_ChangeAnim(this, ENHIDDENNUTS_ANIM_8);
this->unk_21A = 5;
this->actionFunc = func_80BDBED4;
}
@@ -396,11 +423,11 @@ void func_80BDBED4(EnHiddenNuts* this, PlayState* play) {
f32 curFrame = this->skelAnime.curFrame;
Vec3f sp38;
- if (this->unk_22C <= curFrame) {
+ if (curFrame >= this->animEndFrame) {
Math_Vec3f_Copy(&sp38, &this->actor.world.pos);
sp38.y = this->actor.floorHeight;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_DOWN);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_DOWN);
EffectSsHahen_SpawnBurst(play, &sp38, 4.0f, 0, 10, 3, 15, HAHEN_OBJECT_DEFAULT, 10, NULL);
Actor_Kill(&this->actor);
}
@@ -423,7 +450,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 +462,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..7df4b5f01 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
@@ -2,19 +2,23 @@
#define Z_EN_HIDDEN_NUTS_H
#include "global.h"
+#include "objects/object_hintnuts/object_hintnuts.h"
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_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
+#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;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[10];
- /* 0x1C4 */ Vec3s morphTable[10];
+ /* 0x188 */ Vec3s jointTable[OBJECT_HINTNUTS_LIMB_MAX];
+ /* 0x1C4 */ Vec3s morphTable[OBJECT_HINTNUTS_LIMB_MAX];
/* 0x200 */ EnHiddenNutsActionFunc actionFunc;
/* 0x204 */ Path* path;
/* 0x208 */ s16 unk_208;
@@ -23,12 +27,12 @@ typedef struct EnHiddenNuts {
/* 0x218 */ s16 unk_218;
/* 0x21A */ s16 unk_21A;
/* 0x21C */ s16 switchFlag;
- /* 0x21E */ s16 unk_21E;
- /* 0x220 */ s32 unk_220;
+ /* 0x21E */ s16 pathIndex;
+ /* 0x220 */ s32 animIndex;
/* 0x224 */ s16 unk_224;
- /* 0x226 */ s16 unk_226;
+ /* 0x226 */ s16 csId;
/* 0x228 */ f32 unk_228;
- /* 0x22C */ f32 unk_22C;
+ /* 0x22C */ f32 animEndFrame;
/* 0x230 */ UNK_TYPE1 unk230[4];
/* 0x234 */ ColliderCylinder collider;
} EnHiddenNuts; // size = 0x280
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 c07bbc5da..b0ea746d9 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
@@ -6,9 +6,8 @@
#include "z_en_hint_skb.h"
#include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h"
-#include "objects/object_skb/object_skb.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnHintSkb*)thisx)
@@ -126,20 +125,37 @@ static DamageTable sDamageTable = {
/* Powder Keg */ DMG_ENTRY(1, 0xF),
};
-static AnimationInfo sAnimationInfo[] = {
- { &object_skb_Anim_0064E0, 0.96f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
- { &object_skb_Anim_003584, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f },
- { &object_skb_Anim_002190, 0.6f, 0.0f, 0.0f, ANIMMODE_ONCE_INTERP, 4.0f },
- { &object_skb_Anim_002AC8, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f },
- { &object_skb_Anim_00270C, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f },
- { &object_skb_Anim_00697C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
- { &object_skb_Anim_006D90, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
- { &object_skb_Anim_001D1C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
- { &object_skb_Anim_003584, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f },
- { &object_skb_Anim_003584, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -16.0f },
- { &object_skb_Anim_002AC8, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f },
- { &object_skb_Anim_0015EC, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f },
- { &object_skb_Anim_0009E4, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
+typedef enum EnHinkSkbAnimation {
+ /* 0 */ ENHINTSKB_ANIM_0,
+ /* 1 */ ENHINTSKB_ANIM_1,
+ /* 2 */ ENHINTSKB_ANIM_2,
+ /* 3 */ ENHINTSKB_ANIM_3,
+ /* 4 */ ENHINTSKB_ANIM_4,
+ /* 5 */ ENHINTSKB_ANIM_5,
+ /* 6 */ ENHINTSKB_ANIM_6,
+ /* 7 */ ENHINTSKB_ANIM_7,
+ /* 8 */ ENHINTSKB_ANIM_8,
+ /* 9 */ ENHINTSKB_ANIM_9,
+ /* 10 */ ENHINTSKB_ANIM_10,
+ /* 11 */ ENHINTSKB_ANIM_11,
+ /* 12 */ ENHINTSKB_ANIM_12,
+ /* 13 */ ENHINTSKB_ANIM_MAX
+} EnHinkSkbAnimation;
+
+static AnimationInfo sAnimationInfo[ENHINTSKB_ANIM_MAX] = {
+ { &object_skb_Anim_0064E0, 0.96f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // ENHINTSKB_ANIM_0
+ { &object_skb_Anim_003584, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f }, // ENHINTSKB_ANIM_1
+ { &object_skb_Anim_002190, 0.6f, 0.0f, 0.0f, ANIMMODE_ONCE_INTERP, 4.0f }, // ENHINTSKB_ANIM_2
+ { &object_skb_Anim_002AC8, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, // ENHINTSKB_ANIM_3
+ { &object_skb_Anim_00270C, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, // ENHINTSKB_ANIM_4
+ { &object_skb_Anim_00697C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // ENHINTSKB_ANIM_5
+ { &object_skb_Anim_006D90, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // ENHINTSKB_ANIM_6
+ { &object_skb_Anim_001D1C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // ENHINTSKB_ANIM_7
+ { &object_skb_Anim_003584, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f }, // ENHINTSKB_ANIM_8
+ { &object_skb_Anim_003584, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -16.0f }, // ENHINTSKB_ANIM_9
+ { &object_skb_Anim_002AC8, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f }, // ENHINTSKB_ANIM_10
+ { &object_skb_Anim_0015EC, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f }, // ENHINTSKB_ANIM_11
+ { &object_skb_Anim_0009E4, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // ENHINTSKB_ANIM_12
};
static InitChainEntry sInitChain[] = {
@@ -153,7 +169,7 @@ void EnHintSkb_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 36.0f);
SkelAnime_Init(play, &this->skelAnime, &object_skb_Skel_005EF8, &object_skb_Anim_00697C, this->jointTable,
- this->morphtable, 20);
+ this->morphTable, OBJECT_SKB_LIMB_MAX);
Collider_InitJntSph(play, &this->collider);
Collider_SetJntSph(play, &this->collider, &this->actor, &sJntSphInit, this->colliderElement);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
@@ -181,14 +197,14 @@ void func_80C1FE20(EnHintSkb* this, PlayState* play) {
}
void func_80C1FE30(EnHintSkb* this) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0);
- this->actor.speedXZ = 1.6f;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_0);
+ this->actor.speed = 1.6f;
this->actionFunc = func_80C1FE80;
}
void func_80C1FE80(EnHintSkb* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, 8.0f) || Animation_OnFrame(&this->skelAnime, 15.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_WALK);
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 1, 750, 0);
this->actor.world.rot.y = this->actor.shape.rot.y;
@@ -199,8 +215,8 @@ void func_80C1FE80(EnHintSkb* this, PlayState* play) {
void func_80C1FF30(EnHintSkb* this) {
this->collider.base.atFlags &= ~AT_BOUNCED;
- this->actor.speedXZ = 0.0f;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
+ this->actor.speed = 0.0f;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_2);
this->actionFunc = func_80C1FF88;
}
@@ -211,7 +227,7 @@ void func_80C1FF88(EnHintSkb* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, 3.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_ATTACK);
}
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
@@ -241,23 +257,23 @@ void func_80C200B8(EnHintSkb* this, PlayState* play) {
}
void func_80C2011C(EnHintSkb* this) {
- if (this->actor.bgCheckFlags & 1) {
- this->actor.speedXZ = 0.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->actor.speed = 0.0f;
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
this->actionFunc = func_80C2016C;
}
void func_80C2016C(EnHintSkb* this, PlayState* play) {
- if (this->actor.bgCheckFlags & 2) {
- this->actor.speedXZ = 0.0f;
- } else if (this->actor.bgCheckFlags & 1) {
- if (this->actor.speedXZ < 0.0f) {
- this->actor.speedXZ += 0.05f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
+ this->actor.speed = 0.0f;
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ if (this->actor.speed < 0.0f) {
+ this->actor.speed += 0.05f;
}
}
- if ((this->actor.colorFilterTimer == 0) && (this->actor.bgCheckFlags & 1)) {
+ if ((this->actor.colorFilterTimer == 0) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
if (this->actor.colChkInfo.health == 0) {
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EN_STALKID_DEAD);
func_80C20484(this);
@@ -274,52 +290,53 @@ void func_80C2016C(EnHintSkb* this, PlayState* play) {
void func_80C20274(EnHintSkb* this) {
if (this->skelAnime.animation == &object_skb_Anim_00697C) {
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 8);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_8);
this->actor.gravity = -1.0f;
- this->actor.speedXZ = 1.0f;
+ this->actor.speed = 1.0f;
} else {
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
- if (this->actor.bgCheckFlags & 1) {
- this->actor.speedXZ = -4.0f;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_3);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->actor.speed = -4.0f;
}
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_DAMAGE);
this->actionFunc = func_80C20334;
}
void func_80C20334(EnHintSkb* this, PlayState* play) {
- if (this->actor.bgCheckFlags & 2) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
s32 i;
for (i = 0; i < 10; i++) {
func_80C215E4(play, this, &this->actor.world.pos);
}
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
- if (this->actor.bgCheckFlags & 1) {
- if (this->actor.speedXZ < 0.0f) {
- this->actor.speedXZ += 0.05f;
- } else if (this->actor.speedXZ != 0.0f) {
- this->actor.speedXZ -= 0.05f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ if (this->actor.speed < 0.0f) {
+ this->actor.speed += 0.05f;
+ } else if (this->actor.speed != 0.0f) {
+ this->actor.speed -= 0.05f;
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 1, 2500, 0);
}
Math_SmoothStepToS(&this->actor.shape.rot.x, 0, 16, 2000, 100);
- if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame) && (this->actor.bgCheckFlags & 1)) {
+ if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame) &&
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
this->actor.world.rot = this->actor.shape.rot;
func_80C1FE30(this);
}
}
void func_80C20484(EnHintSkb* this) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 4);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_4);
this->unk_3E8 |= 4;
- if (this->actor.bgCheckFlags & 1) {
- this->actor.speedXZ = -6.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->actor.speed = -6.0f;
}
this->actionFunc = func_80C204F0;
}
@@ -334,10 +351,10 @@ void func_80C204F0(EnHintSkb* this, PlayState* play) {
}
void func_80C20540(EnHintSkb* this) {
- if (this->actor.bgCheckFlags & 1) {
- this->actor.speedXZ = 0.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->actor.speed = 0.0f;
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
this->actionFunc = func_80C20590;
}
@@ -347,9 +364,9 @@ void func_80C20590(EnHintSkb* this, PlayState* play) {
this->drawDmgEffScale = 0.0f;
this->drawDmgEffAlpha = 0.0f;
if (this->actor.colChkInfo.health != 0) {
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_DAMAGE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_3);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_DAMAGE);
this->unk_3E8 |= 1;
func_80C20274(this);
} else {
@@ -362,8 +379,8 @@ void func_80C20590(EnHintSkb* this, PlayState* play) {
}
void func_80C2066C(EnHintSkb* this) {
- if (this->actor.bgCheckFlags & 1) {
- this->actor.speedXZ = 0.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->actor.speed = 0.0f;
}
this->actionFunc = func_80C2069C;
}
@@ -374,9 +391,9 @@ void func_80C2069C(EnHintSkb* this, PlayState* play) {
this->drawDmgEffScale = 0.0f;
this->drawDmgEffAlpha = 0.0f;
if (this->actor.colChkInfo.health != 0) {
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_DAMAGE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_3);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_DAMAGE);
this->unk_3E8 |= 1;
func_80C20274(this);
} else {
@@ -388,7 +405,7 @@ void func_80C2069C(EnHintSkb* this, PlayState* play) {
void func_80C2075C(EnHintSkb* this) {
this->unk_3E0 = 0;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = func_80C2077C;
}
@@ -400,20 +417,20 @@ void func_80C2077C(EnHintSkb* this, PlayState* play) {
Message_StartTextbox(play, 0x1147, &this->actor);
this->unk_3E6 = 0x1147;
if (this->skelAnime.animation == &object_skb_Anim_00697C) {
- play->msgCtx.msgMode = 0x44;
- this->actor.speedXZ = 2.4f;
+ play->msgCtx.msgMode = MSGMODE_PAUSED;
+ this->actor.speed = 2.4f;
this->actor.gravity = -1.0f;
this->actor.velocity.y = 3.0f;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 8);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_8);
}
} else {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 11);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_11);
Message_StartTextbox(play, 0x1148, &this->actor);
this->unk_3E6 = 0x1148;
}
func_80C208BC(this);
} else if ((this->actor.xzDistToPlayer < 100.0f) && !(this->collider.base.acFlags & AC_HIT)) {
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
}
@@ -448,14 +465,15 @@ void func_80C208D0(EnHintSkb* this, PlayState* play) {
case TEXT_STATE_NONE:
case TEXT_STATE_1:
case TEXT_STATE_CLOSING:
+ default:
break;
}
if (this->unk_3E6 == 0x1147) {
- if (this->actor.bgCheckFlags & 2) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
s32 i;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
for (i = 0; i < 10; i++) {
func_80C215E4(play, this, &this->actor.world.pos);
@@ -466,11 +484,11 @@ void func_80C208D0(EnHintSkb* this, PlayState* play) {
Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
Message_StartTextbox(play, 0x1147, &this->actor);
this->unk_3E6 = 0x1147;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_0);
}
}
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 5, 0x71C, 0xB6);
this->actor.shape.rot.y = this->actor.world.rot.y;
}
@@ -520,12 +538,12 @@ void func_80C20A74(EnHintSkb* this, PlayState* play) {
void func_80C20B88(EnHintSkb* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
if (play->msgCtx.choiceIndex == 0) {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
this->unk_3E8 |= 0x10;
Message_StartTextbox(play, 0x1150, &this->actor);
this->unk_3E6 = 0x1150;
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
Message_StartTextbox(play, 0x1152, &this->actor);
this->unk_3E6 = 0x1152;
}
@@ -541,7 +559,7 @@ void func_80C20C24(EnHintSkb* this, PlayState* play) {
case 0x1147:
Message_StartTextbox(play, 0x1148, &this->actor);
this->unk_3E6 = 0x1148;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 11);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_11);
break;
case 0x1148:
@@ -569,7 +587,7 @@ void func_80C20C24(EnHintSkb* this, PlayState* play) {
break;
case 0x1151:
- func_801477B4(play);
+ Message_CloseTextbox(play);
if (this->unk_3E8 & 0x10) {
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EN_STALKID_DEAD);
func_80C20484(this);
@@ -577,6 +595,9 @@ void func_80C20C24(EnHintSkb* this, PlayState* play) {
func_80C2075C(this);
}
break;
+
+ default:
+ break;
}
}
@@ -585,18 +606,18 @@ void func_80C20D64(EnHintSkb* this, PlayState* play) {
(this->actionFunc == func_80C1FE80)) {
if (this->actionFunc != func_80C2077C) {
if (Player_GetMask(play) == PLAYER_MASK_CAPTAIN) {
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_4);
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
this->actor.hintId = TATL_HINT_ID_NONE;
this->actor.textId = 0;
if (this->actionFunc == func_80C1FE80) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 12);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_12);
}
func_80C2075C(this);
}
} else if (Player_GetMask(play) != PLAYER_MASK_CAPTAIN) {
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_4);
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY);
this->actor.hintId = TATL_HINT_ID_STALCHILD;
this->actor.textId = 0;
if (this->skelAnime.animation == &object_skb_Anim_00697C) {
@@ -611,7 +632,8 @@ void func_80C20D64(EnHintSkb* this, PlayState* play) {
void func_80C20E90(EnHintSkb* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if ((this->actor.bgCheckFlags & 0x60) && (this->actor.depthInWater >= 40.0f)) {
+ if ((this->actor.bgCheckFlags & (BGCHECKFLAG_WATER | BGCHECKFLAG_WATER_TOUCH)) &&
+ (this->actor.depthInWater >= 40.0f)) {
this->actor.colChkInfo.health = 0;
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EN_STALKID_DEAD);
func_80C20484(this);
@@ -661,12 +683,12 @@ void func_80C20E90(EnHintSkb* this, PlayState* play) {
this->drawDmgEffTimer = 40;
this->drawDmgEffAlpha = 1.0f;
this->drawDmgEffScale = 0.0f;
- Actor_SetColorFilter(&this->actor, 0, 120, 0, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 120, COLORFILTER_BUFFLAG_OPA, 40);
func_80C2011C(this);
break;
case 1:
- Actor_SetColorFilter(&this->actor, 0, 120, 0, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 120, COLORFILTER_BUFFLAG_OPA, 40);
func_80C2011C(this);
break;
@@ -675,14 +697,15 @@ void func_80C20E90(EnHintSkb* this, PlayState* play) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->drawDmgEffAlpha = 1.0f;
this->drawDmgEffScale = 0.0f;
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_DAMAGE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_DAMAGE);
this->unk_3E8 |= 1;
func_80C20274(this);
break;
+
case 3:
if (this->actor.colChkInfo.health != 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_DAMAGE);
this->drawDmgEffTimer = 80;
} else {
this->drawDmgEffTimer = 3;
@@ -690,24 +713,25 @@ void func_80C20E90(EnHintSkb* this, PlayState* play) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FROZEN_SFX;
this->drawDmgEffAlpha = 1.0f;
this->drawDmgEffScale = 0.5f;
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
func_80C20540(this);
break;
+
case 4:
this->drawDmgEffTimer = 40;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_LIGHT_ORBS;
this->drawDmgEffAlpha = 1.0f;
this->drawDmgEffScale = 0.5f;
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_DAMAGE);
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_DAMAGE);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_3);
func_80C2066C(this);
break;
case 12:
case 14:
this->unk_3E8 |= 1;
-
+ // fallthrough
case 15:
if ((player->meleeWeaponAnimation == PLAYER_MWA_RIGHT_SLASH_1H) ||
(player->meleeWeaponAnimation == PLAYER_MWA_LEFT_COMBO_2H) ||
@@ -715,11 +739,11 @@ void func_80C20E90(EnHintSkb* this, PlayState* play) {
(player->meleeWeaponAnimation == PLAYER_MWA_BACKSLASH_LEFT)) {
this->unk_3E8 |= 1;
}
-
+ // fallthrough
case 13:
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_DAMAGE);
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_DAMAGE);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENHINTSKB_ANIM_3);
func_80C20274(this);
break;
@@ -729,6 +753,7 @@ void func_80C20E90(EnHintSkb* this, PlayState* play) {
case 8:
case 9:
case 10:
+ default:
break;
}
}
@@ -781,26 +806,26 @@ void func_80C21468(EnHintSkb* this, PlayState* play) {
static Color_RGBA8 D_80C21E48 = { 200, 200, 255, 255 };
static Vec3f D_80C21E4C = { 0.0f, -1.0f, 0.0f };
Vec3f sp84;
- s32 phi_s4;
+ s32 bodyPartsCount;
s16 temp_s1;
s32 i;
if (this->unk_3E8 & 2) {
- phi_s4 = ARRAY_COUNT(this->limbPos) - 1;
+ bodyPartsCount = ENHINTSKB_BODYPART_MAX - 1;
} else {
- phi_s4 = ARRAY_COUNT(this->limbPos);
+ bodyPartsCount = ENHINTSKB_BODYPART_MAX;
}
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 30, NA_SE_EV_ICE_BROKEN);
- for (i = 0; i < phi_s4; i++) {
- temp_s1 = Math_Vec3f_Yaw(&this->actor.world.pos, &this->limbPos[i]);
+ for (i = 0; i < bodyPartsCount; i++) {
+ temp_s1 = Math_Vec3f_Yaw(&this->actor.world.pos, &this->bodyPartsPos[i]);
sp84.x = Math_SinS(temp_s1) * 3.0f;
sp84.z = Math_CosS(temp_s1) * 3.0f;
sp84.y = (Rand_ZeroOne() * 4.0f) + 4.0f;
- EffectSsEnIce_Spawn(play, &this->limbPos[i], 0.6f, &sp84, &D_80C21E4C, &D_80C21E44, &D_80C21E48, 30);
+ EffectSsEnIce_Spawn(play, &this->bodyPartsPos[i], 0.6f, &sp84, &D_80C21E4C, &D_80C21E44, &D_80C21E48, 30);
}
}
@@ -812,11 +837,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;
@@ -836,7 +861,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);
@@ -846,7 +873,7 @@ s32 EnHintSkb_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3
EnHintSkb* this = THIS;
f32 temp_f10;
- if (limbIndex == 11) {
+ if (limbIndex == OBJECT_SKB_LIMB_0B) {
OPEN_DISPS(play->state.gfxCtx);
temp_f10 = fabsf(Math_SinS(play->state.frames * 6000) * 95.0f) + 160.0f;
@@ -855,13 +882,13 @@ s32 EnHintSkb_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3
gDPSetEnvColor(POLY_OPA_DISP++, (s16)temp_f10, (s16)temp_f10, (s16)temp_f10, 255);
CLOSE_DISPS(play->state.gfxCtx);
- } else if (limbIndex == 10) {
+ } else if (limbIndex == OBJECT_SKB_LIMB_0A) {
Matrix_MultZero(&this->actor.focus.pos);
- } else if ((limbIndex == 12) && (this->unk_3DE == 1)) {
+ } else if ((limbIndex == OBJECT_SKB_LIMB_0C) && (this->unk_3DE == 1)) {
Matrix_RotateZS(0x71C, MTXMODE_APPLY);
}
- if (((limbIndex == 11) || (limbIndex == 12)) && (this->unk_3E8 & 2)) {
+ if (((limbIndex == OBJECT_SKB_LIMB_0B) || (limbIndex == OBJECT_SKB_LIMB_0C)) && (this->unk_3E8 & 2)) {
*dList = NULL;
}
@@ -875,23 +902,27 @@ void EnHintSkb_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
if (!(this->unk_3E8 & 8)) {
Collider_UpdateSpheres(limbIndex, &this->collider);
- if ((limbIndex == 11) && (this->unk_3E8 & 1) && !(this->unk_3E8 & 2)) {
+ if ((limbIndex == OBJECT_SKB_LIMB_0B) && (this->unk_3E8 & 1) && !(this->unk_3E8 & 2)) {
Actor_SpawnBodyParts(&this->actor, play, 1, dList);
this->unk_3E8 |= 2;
- } else if ((this->unk_3E8 & 4) && !(this->unk_3E8 & 8) && ((limbIndex != 11) || !(this->unk_3E8 & 1)) &&
- (limbIndex != 12)) {
+ } else if ((this->unk_3E8 & 4) && !(this->unk_3E8 & 8) &&
+ ((limbIndex != OBJECT_SKB_LIMB_0B) || !(this->unk_3E8 & 1)) && (limbIndex != OBJECT_SKB_LIMB_0C)) {
Actor_SpawnBodyParts(&this->actor, play, 1, dList);
}
if (this->drawDmgEffTimer != 0) {
- if ((limbIndex == 2) || (limbIndex == 4) || (limbIndex == 5) || (limbIndex == 6) || (limbIndex == 7) ||
- (limbIndex == 8) || (limbIndex == 9) || (limbIndex == 13) || (limbIndex == 14) || (limbIndex == 15) ||
- (limbIndex == 16) || (limbIndex == 17) || (limbIndex == 18)) {
- Matrix_MultZero(&this->limbPos[this->limbCount]);
- this->limbCount++;
- } else if ((limbIndex == 11) && !(this->unk_3E8 & 2)) {
- Matrix_MultVec3f(&D_80C21E70, &this->limbPos[this->limbCount]);
- this->limbCount++;
+ if ((limbIndex == OBJECT_SKB_LIMB_02) || (limbIndex == OBJECT_SKB_LIMB_04) ||
+ (limbIndex == OBJECT_SKB_LIMB_05) || (limbIndex == OBJECT_SKB_LIMB_06) ||
+ (limbIndex == OBJECT_SKB_LIMB_07) || (limbIndex == OBJECT_SKB_LIMB_08) ||
+ (limbIndex == OBJECT_SKB_LIMB_09) || (limbIndex == OBJECT_SKB_LIMB_0D) ||
+ (limbIndex == OBJECT_SKB_LIMB_0E) || (limbIndex == OBJECT_SKB_LIMB_0F) ||
+ (limbIndex == OBJECT_SKB_LIMB_10) || (limbIndex == OBJECT_SKB_LIMB_11) ||
+ (limbIndex == OBJECT_SKB_LIMB_12)) {
+ Matrix_MultZero(&this->bodyPartsPos[this->bodyPartsCount]);
+ this->bodyPartsCount++;
+ } else if ((limbIndex == OBJECT_SKB_LIMB_0B) && !(this->unk_3E8 & 2)) {
+ Matrix_MultVec3f(&D_80C21E70, &this->bodyPartsPos[this->bodyPartsCount]);
+ this->bodyPartsCount++;
}
}
}
@@ -900,13 +931,13 @@ void EnHintSkb_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
void EnHintSkb_Draw(Actor* thisx, PlayState* play) {
EnHintSkb* this = THIS;
- this->limbCount = 0;
- func_8012C28C(play->state.gfxCtx);
+ this->bodyPartsCount = 0;
+ 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) {
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, this->limbCount, this->drawDmgEffScale, 0.5f,
- this->drawDmgEffAlpha, this->drawDmgEffType);
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, this->bodyPartsCount, this->drawDmgEffScale,
+ 0.5f, this->drawDmgEffAlpha, this->drawDmgEffType);
}
if (this->unk_3E8 & 4) {
diff --git a/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.h b/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.h
index 22f72084d..95576210d 100644
--- a/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.h
+++ b/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.h
@@ -2,6 +2,7 @@
#define Z_EN_HINT_SKB_H
#include "global.h"
+#include "objects/object_skb/object_skb.h"
struct EnHintSkb;
@@ -9,18 +10,36 @@ typedef void (*EnHintSkbActionFunc)(struct EnHintSkb*, PlayState*);
#define ENHINTSKB_GET_FF(thisx) ((thisx)->params & 0xFF)
+typedef enum EnHintSkbBodyPart {
+ /* 0 */ ENHINTSKB_BODYPART_0,
+ /* 1 */ ENHINTSKB_BODYPART_1,
+ /* 2 */ ENHINTSKB_BODYPART_2,
+ /* 3 */ ENHINTSKB_BODYPART_3,
+ /* 4 */ ENHINTSKB_BODYPART_4,
+ /* 5 */ ENHINTSKB_BODYPART_5,
+ /* 6 */ ENHINTSKB_BODYPART_6,
+ /* 7 */ ENHINTSKB_BODYPART_7,
+ /* 8 */ ENHINTSKB_BODYPART_8,
+ /* 9 */ ENHINTSKB_BODYPART_9,
+ /* 10 */ ENHINTSKB_BODYPART_10,
+ /* 11 */ ENHINTSKB_BODYPART_11,
+ /* 12 */ ENHINTSKB_BODYPART_12,
+ /* 13 */ ENHINTSKB_BODYPART_13,
+ /* 14 */ ENHINTSKB_BODYPART_MAX
+} EnHintSkbBodyPart;
+
typedef struct EnHintSkb {
/* 0x000 */ Actor actor;
/* 0x144 */ ColliderJntSph collider;
/* 0x164 */ ColliderJntSphElement colliderElement[2];
/* 0x1E4 */ SkelAnime skelAnime;
/* 0x228 */ EnHintSkbActionFunc actionFunc;
- /* 0x22C */ Vec3f limbPos[14];
+ /* 0x22C */ Vec3f bodyPartsPos[ENHINTSKB_BODYPART_MAX];
/* 0x2D4 */ f32 drawDmgEffAlpha;
/* 0x2D8 */ f32 drawDmgEffScale;
- /* 0x2DC */ s32 limbCount;
- /* 0x2E0 */ Vec3s jointTable[20];
- /* 0x358 */ Vec3s morphtable[20];
+ /* 0x2DC */ s32 bodyPartsCount;
+ /* 0x2E0 */ Vec3s jointTable[OBJECT_SKB_LIMB_MAX];
+ /* 0x358 */ Vec3s morphTable[OBJECT_SKB_LIMB_MAX];
/* 0x3D0 */ UNK_TYPE1 unk3D0[0xC];
/* 0x3DC */ s16 unk_3DC;
/* 0x3DE */ s16 unk_3DE;
diff --git a/src/overlays/actors/ovl_En_Hit_Tag/z_en_hit_tag.c b/src/overlays/actors/ovl_En_Hit_Tag/z_en_hit_tag.c
index c76d92106..208708c58 100644
--- a/src/overlays/actors/ovl_En_Hit_Tag/z_en_hit_tag.c
+++ b/src/overlays/actors/ovl_En_Hit_Tag/z_en_hit_tag.c
@@ -56,7 +56,7 @@ void EnHitTag_Init(Actor* thisx, PlayState* play) {
this->actionFunc = EnHitTag_WaitForHit;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
Collider_UpdateCylinder(&this->actor, &this->collider);
- if (Flags_GetSwitch(play, ENHITTAG_GET_SWITCHFLAG(thisx))) {
+ if (Flags_GetSwitch(play, ENHITTAG_GET_SWITCH_FLAG(thisx))) {
Actor_Kill(&this->actor);
}
}
@@ -72,7 +72,7 @@ void EnHitTag_WaitForHit(EnHitTag* this, PlayState* play) {
s32 i;
if (this->collider.base.acFlags & AC_HIT) {
- play_sound(NA_SE_SY_GET_RUPY);
+ Audio_PlaySfx(NA_SE_SY_GET_RUPY);
Actor_Kill(&this->actor);
dropLocation.x = this->actor.world.pos.x;
dropLocation.y = this->actor.world.pos.y;
diff --git a/src/overlays/actors/ovl_En_Hit_Tag/z_en_hit_tag.h b/src/overlays/actors/ovl_En_Hit_Tag/z_en_hit_tag.h
index e2effa078..645c95465 100644
--- a/src/overlays/actors/ovl_En_Hit_Tag/z_en_hit_tag.h
+++ b/src/overlays/actors/ovl_En_Hit_Tag/z_en_hit_tag.h
@@ -7,7 +7,7 @@ struct EnHitTag;
typedef void (*EnHitTagActionFunc)(struct EnHitTag*, PlayState*);
-#define ENHITTAG_GET_SWITCHFLAG(thisx) (((thisx)->params & 0xFE00) >> 9)
+#define ENHITTAG_GET_SWITCH_FLAG(thisx) (((thisx)->params & 0xFE00) >> 9)
typedef struct EnHitTag {
/* 0x000 */ Actor actor;
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 e7615d25f..d715e4c7d 100644
--- a/src/overlays/actors/ovl_En_Holl/z_en_holl.c
+++ b/src/overlays/actors/ovl_En_Holl/z_en_holl.c
@@ -151,15 +151,17 @@ void EnHoll_VisibleIdle(EnHoll* this, PlayState* play) {
f32 playerDistFromCentralPlane;
if (this->type == EN_HOLL_TYPE_DEFAULT) {
- u32 actorCtxBitmask = (play->actorCtx.unkC & 0x2AA) >> 1 | (play->actorCtx.unkC & 0x155);
+ u32 halfDaysBit =
+ ((play->actorCtx.halfDaysBit & HALFDAYBIT_DAWNS) >> 1) | (play->actorCtx.halfDaysBit & HALFDAYBIT_NIGHTS);
u32 zActorBitmask = D_801AED48[EN_HOLL_GET_Z_ACTOR_BITMASK_INDEX(&this->actor)];
- if (!(actorCtxBitmask & zActorBitmask)) {
+ if (!(halfDaysBit & zActorBitmask)) {
Actor_Kill(&this->actor);
return;
}
+
if (this == sInstancePlayingSound) {
- func_800B9010(&this->actor, NA_SE_EV_INVISIBLE_MONKEY - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_INVISIBLE_MONKEY - SFX_FLAG);
}
}
if ((play->transitionTrigger != TRANS_TRIGGER_OFF) || (play->transitionMode != TRANS_MODE_OFF)) {
@@ -180,7 +182,7 @@ void EnHoll_VisibleIdle(EnHoll* this, PlayState* play) {
u32 enHollId = EN_HOLL_GET_ID(&this->actor);
if (sLoadingPlaneDistance < playerDistFromCentralPlane) {
- if ((play->roomCtx.prevRoom.num >= 0) && (play->roomCtx.unk31 == 0)) {
+ if ((play->roomCtx.prevRoom.num >= 0) && (play->roomCtx.status == 0)) {
this->actor.room = play->doorCtx.transitionActorList[enHollId].sides[this->playerSide].room;
if (play->roomCtx.prevRoom.num == this->actor.room) {
EnHoll_ChangeRooms(play);
@@ -189,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);
@@ -218,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;
@@ -296,7 +298,7 @@ void EnHoll_VerticalIdle(EnHoll* this, PlayState* play) {
}
void EnHoll_RoomTransitionIdle(EnHoll* this, PlayState* play) {
- if (play->roomCtx.unk31 == 0) {
+ if (play->roomCtx.status == 0) {
func_8012EBF8(play, &play->roomCtx);
if (play->bgCoverAlpha == 0) {
this->bgCoverAlphaActive = false;
@@ -317,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_Honotrap/z_en_honotrap.c b/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.c
index 3e56c0970..1c4dec2e6 100644
--- a/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.c
+++ b/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.c
@@ -201,7 +201,7 @@ void func_8092E840(EnHonotrap* this, PlayState* play) {
this->unk228 = GET_PLAYER(play)->actor.world.pos;
this->unk228.y += 10.0f;
this->unk23A = Rand_ZeroOne() * 511.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_FLAME_IGNITION);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FLAME_IGNITION);
if (params == 2) {
this->actor.room = -1;
this->collider.cyl.dim.radius = 12;
@@ -229,7 +229,7 @@ void func_8092E988(EnHonotrap* this, PlayState* play) {
var_s0 &= 0x1FF;
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_FLAME_IGNITION);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FLAME_IGNITION);
func_8092F854(this);
}
@@ -294,7 +294,7 @@ void func_8092EC9C(EnHonotrap* this) {
this->actionFunc = func_8092ECF0;
Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 40);
this->unk220 = 30;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_RED_EYE);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_RED_EYE);
}
void func_8092ECF0(EnHonotrap* this, PlayState* play) {
@@ -355,7 +355,7 @@ void func_8092EE90(EnHonotrap* this, PlayState* play) {
}
void func_8092EF3C(EnHonotrap* this) {
- Actor_PlaySfxAtPos(&this->actor, 0x2881U);
+ Actor_PlaySfx(&this->actor, 0x2881U);
Actor_SetColorFilter(&this->actor, 0x4000U, 255, 0, 40);
this->unk220 = 0x28;
this->actionFunc = func_8092EF98;
@@ -460,7 +460,7 @@ void func_8092F34C(EnHonotrap* this) {
f32 temp_fv1;
this->actionFunc = func_8092F3D8;
- temp_fv1 = 1.0f / (Actor_DistanceToPoint(&this->actor, &this->unk228) + 1.0f);
+ temp_fv1 = 1.0f / (Actor_WorldDistXYZToPoint(&this->actor, &this->unk228) + 1.0f);
this->actor.velocity.x = (this->unk228.x - this->actor.world.pos.x) * temp_fv1;
this->actor.velocity.y = (this->unk228.y - this->actor.world.pos.y) * temp_fv1;
this->actor.velocity.z = (this->unk228.z - this->actor.world.pos.z) * temp_fv1;
@@ -498,13 +498,13 @@ void func_8092F3D8(EnHonotrap* this, PlayState* play) {
func_8092E5A4(&sp4C, &sp34);
sp40 = this->actor.velocity;
func_80179F64(&sp40, &sp4C, &this->actor.velocity);
- this->actor.speedXZ = this->unk234 * 0.5f;
+ this->actor.speed = this->unk234 * 0.5f;
this->actor.world.rot.y = Math_Atan2S_XY(this->actor.velocity.z, this->actor.velocity.x);
func_8092F7A8(this);
return;
}
if (this->collider.tris.base.atFlags & 2) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.velocity.y = 0.0f;
func_8092F7A8(this);
return;
@@ -524,7 +524,7 @@ void func_8092F3D8(EnHonotrap* this, PlayState* play) {
void func_8092F5AC(EnHonotrap* this) {
this->actionFunc = func_8092F5EC;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.velocity.x = this->actor.velocity.y = this->actor.velocity.z = 0.0f;
this->unk220 = 100;
this->actor.world.rot.x = this->actor.world.rot.y = this->actor.world.rot.z = 0;
@@ -534,7 +534,7 @@ void func_8092F5EC(EnHonotrap* this, PlayState* play) {
s32 pad;
Math_ScaledStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 0x300);
- Math_StepToF(&this->actor.speedXZ, 3.0f, 0.1f);
+ Math_StepToF(&this->actor.speed, 3.0f, 0.1f);
if (-this->actor.playerHeightRel < 10.0f) {
this->actor.gravity = 0.08f;
} else {
@@ -556,7 +556,7 @@ void func_8092F5EC(EnHonotrap* this, PlayState* play) {
this->actor.world.rot.y = ((sp30.y * 2) - this->actor.world.rot.y) + 0x8000;
func_8092F7A8(this);
} else if (this->collider.tris.base.atFlags & 2) {
- this->actor.speedXZ *= 0.1f;
+ this->actor.speed *= 0.1f;
this->actor.velocity.y *= 0.1f;
func_8092F7A8(this);
} else if ((this->actor.bgCheckFlags & 8) || (this->unk220 <= 0)) {
@@ -718,7 +718,7 @@ void func_8092FE44(Actor* thisx, PlayState* play) {
this->actor.shape.yOffset = Math_SinS(this->unk238) * 1000.0f + 600.0f;
}
Actor_SetFocus(&this->actor, 5.0f);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BURN_OUT - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BURN_OUT - SFX_FLAG);
this->actionFunc(this, play);
this->unk23A -= 0x14;
this->unk23A &= 0x1FF;
@@ -736,7 +736,7 @@ void func_8092FEFC(Actor* thisx, PlayState* play) {
this->unk220--;
}
this->unk238 += 0x640;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BURN_OUT - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BURN_OUT - SFX_FLAG);
this->actionFunc(this, play);
}
@@ -744,7 +744,7 @@ void EnHonotrap_Draw(Actor* thisx, PlayState* play) {
EnHonotrap* this = (EnHonotrap*)thisx;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, D_809303F0[this->unk222]);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, &D_050085F0);
@@ -756,7 +756,7 @@ void func_80930030(Actor* thisx, PlayState* play) {
EnHonotrap* this = (EnHonotrap*)thisx;
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, this->unk23A, 32, 128));
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 200, 0, 255);
@@ -776,7 +776,7 @@ void func_80930190(Actor* thisx, PlayState* play) {
s32 i; // s4
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 200, 0, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 0);
Camera_GetCamDir(&spB8, play->cameraPtrs[play->activeCamId]);
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 5ffc364c3..df5718605 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"
@@ -39,10 +40,10 @@ void EnHorse_StartReversing(EnHorse* this);
void EnHorse_StartLowJump(EnHorse* this, PlayState* play);
void EnHorse_StartHighJump(EnHorse* this, PlayState* play);
void EnHorse_InitInactive(EnHorse* this);
-void EnHorse_ChangeIdleAnimation(EnHorse* this, s32 anim, f32 morphFrames);
+void EnHorse_ChangeIdleAnimation(EnHorse* this, s32 animIndex, f32 morphFrames);
void EnHorse_ResetIdleAnimation(EnHorse* this);
void EnHorse_StartIdleRidable(EnHorse* this);
-void EnHorse_StartMovingAnimation(EnHorse* this, s32 anim, f32 morphFrames, f32 startFrames);
+void EnHorse_StartMovingAnimation(EnHorse* this, s32 animIndex, f32 morphFrames, f32 startFrames);
void EnHorse_SetFollowAnimation(EnHorse* this, PlayState* play);
void EnHorse_InitIngoHorse(EnHorse* this);
void EnHorse_UpdateIngoHorseAnim(EnHorse* this);
@@ -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,57 +92,73 @@ 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;
+ /* 0x0 */ s32 numWaypoints;
+ /* 0x4 */ RaceWaypoint* waypoints;
+} RaceInfo; // size = 0x8
-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;
-
-static AnimationHeader* sEponaAnimations[] = {
- &object_horse_link_child_Anim_006D44, &object_horse_link_child_Anim_007468, &object_horse_link_child_Anim_005F64,
- &object_horse_link_child_Anim_004DE8, &object_horse_link_child_Anim_007D50, &object_horse_link_child_Anim_0043AC,
- &object_horse_link_child_Anim_002F98, &object_horse_link_child_Anim_0035B0, &object_horse_link_child_Anim_003D38,
+static AnimationHeader* sEponaAnimations[ENHORSE_ANIM_MAX] = {
+ &gEponaIdleAnim, // ENHORSE_ANIM_IDLE
+ &gEponaWhinnyAnim, // ENHORSE_ANIM_WHINNY
+ &object_horse_link_child_Anim_005F64, // ENHORSE_ANIM_STOPPING
+ &object_horse_link_child_Anim_004DE8, // ENHORSE_ANIM_REARING
+ &gEponaWalkAnim, // ENHORSE_ANIM_WALK
+ &gEponaTrotAnim, // ENHORSE_ANIM_TROT
+ &gEponaGallopAnim, // ENHORSE_ANIM_GALLOP
+ &object_horse_link_child_Anim_0035B0, // ENHORSE_ANIM_LOW_JUMP
+ &object_horse_link_child_Anim_003D38, // ENHORSE_ANIM_HIGH_JUMP
};
-static AnimationHeader* sHniAnimations[] = {
- &object_ha_Anim_00C850, &object_ha_Anim_00CE70, &object_ha_Anim_00B9C8,
- &object_ha_Anim_00B00C, &object_ha_Anim_00D648, &object_ha_Anim_00A650,
- &object_ha_Anim_009208, &object_ha_Anim_009858, &object_ha_Anim_00A05C,
+static AnimationHeader* sHniAnimations[ENHORSE_ANIM_MAX] = {
+ &gHorseIdleAnim, // ENHORSE_ANIM_IDLE
+ &gHorseShakeHeadAnim, // ENHORSE_ANIM_WHINNY
+ &gHorseStopAnim, // ENHORSE_ANIM_STOPPING
+ &gHorseWhinnyAnim, // ENHORSE_ANIM_REARING @TODO: Does not line up
+ &gHorseWalkAnim, // ENHORSE_ANIM_WALK
+ &gHorseTrotAnim, // ENHORSE_ANIM_TROT
+ &gHorseGallopAnim, // ENHORSE_ANIM_GALLOP
+ &gHorseJumpLowAnim, // ENHORSE_ANIM_LOW_JUMP
+ &gHorseJumpHighAnim, // ENHORSE_ANIM_HIGH_JUMP
};
-static AnimationHeader** sAnimationHeaders[] = {
- NULL, NULL, sEponaAnimations, sHniAnimations, sHniAnimations,
+static AnimationHeader** sAnimationHeaders[HORSE_TYPE_MAX] = {
+ NULL, // HORSE_TYPE_EPONA
+ NULL, // HORSE_TYPE_HNI
+ sEponaAnimations, // HORSE_TYPE_2
+ sHniAnimations, // HORSE_TYPE_BANDIT
+ sHniAnimations, // HORSE_TYPE_DONKEY
};
-static f32 sPlaybackSpeeds[] = {
- 2.0f / 3.0f, 2.0f / 3.0f, 3.0f / 3.0f, 3.0f / 3.0f, 3.0f / 3.0f, 3.0f / 3.0f, 3.0f / 3.0f, 2.0f / 3.0f, 2.0f / 3.0f,
+static f32 sPlaybackSpeeds[ENHORSE_ANIM_MAX] = {
+ 2.0f / 3.0f, // ENHORSE_ANIM_IDLE
+ 2.0f / 3.0f, // ENHORSE_ANIM_WHINNY
+ 3.0f / 3.0f, // ENHORSE_ANIM_STOPPING
+ 3.0f / 3.0f, // ENHORSE_ANIM_REARING
+ 3.0f / 3.0f, // ENHORSE_ANIM_WALK
+ 3.0f / 3.0f, // ENHORSE_ANIM_TROT
+ 3.0f / 3.0f, // ENHORSE_ANIM_GALLOP
+ 2.0f / 3.0f, // ENHORSE_ANIM_LOW_JUMP
+ 2.0f / 3.0f, // ENHORSE_ANIM_HIGH_JUMP
};
-static SkeletonHeader* sSkeletonHeaders[] = {
- NULL, NULL, &object_horse_link_child_Skel_00A480, NULL, NULL,
+static SkeletonHeader* sSkeletonHeaders[HORSE_TYPE_MAX] = {
+ NULL, // HORSE_TYPE_EPONA
+ NULL, // HORSE_TYPE_HNI
+ &gEponaSkel, // HORSE_TYPE_2
+ NULL, // HORSE_TYPE_BANDIT
+ NULL, // HORSE_TYPE_DONKEY
};
ActorInit En_Horse_InitVars = {
@@ -290,8 +307,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) {
@@ -345,7 +362,7 @@ void func_8087B7C0(EnHorse* this, PlayState* play, Path* path) {
func_8017D7C0(this->actor.world.pos.x, this->actor.world.pos.z, sp80.x, sp80.z, sp8C.x, sp8C.z, &sp70);
- if ((this->actor.bgCheckFlags & 8) || (this->unk_1EC & 4)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) || (this->unk_1EC & 4)) {
EnHorse_RotateToPoint(this, play, &sp8C, 0xC80);
if (this->unk_1EC & 4) {
this->unk_1EC &= ~4;
@@ -402,81 +419,81 @@ void func_8087B7C0(EnHorse* this, PlayState* play, Path* path) {
this->unk_58C = 0x2B;
}
this->unk_58C--;
- if (this->actor.speedXZ > 5.0f) {
- this->actor.speedXZ -= 0.5f;
+ if (this->actor.speed > 5.0f) {
+ this->actor.speed -= 0.5f;
}
} else if (this->unk_590 > 0) {
if (this->unk_590 == 0x1F4) {
if (this->rider != NULL) {
- Actor_PlaySfxAtPos(&this->rider->actor, NA_SE_VO_IN_CRY_0);
+ Actor_PlaySfx(&this->rider->actor, NA_SE_VO_IN_CRY_0);
}
}
this->unk_590--;
- if (this->actor.speedXZ < this->unk_398) {
- this->actor.speedXZ += 1.0f;
+ if (this->actor.speed < this->unk_398) {
+ this->actor.speed += 1.0f;
} else {
- this->actor.speedXZ -= 0.5f;
+ this->actor.speed -= 0.5f;
}
} else if (this->actor.params == ENHORSE_5) {
s16 sp4A;
if (sp68 >= this->curRaceWaypoint) {
- if (this->actor.speedXZ < this->unk_398) {
- this->actor.speedXZ += 0.5f;
+ if (this->actor.speed < this->unk_398) {
+ this->actor.speed += 0.5f;
} else {
- this->actor.speedXZ -= 0.5f;
+ this->actor.speed -= 0.5f;
}
this->unk_394 |= 1;
return;
}
- sp4A = Actor_YawBetweenActors(&this->actor, &GET_PLAYER(play)->actor) - this->actor.world.rot.y;
+ sp4A = Actor_WorldYawTowardActor(&this->actor, &GET_PLAYER(play)->actor) - this->actor.world.rot.y;
if ((fabsf(Math_SinS(sp4A)) < 0.9f) && (Math_CosS(sp4A) > 0.0f)) {
- if (this->actor.speedXZ < this->unk_398) {
- this->actor.speedXZ += 0.5f;
+ if (this->actor.speed < this->unk_398) {
+ this->actor.speed += 0.5f;
} else {
- this->actor.speedXZ -= 0.25f;
+ this->actor.speed -= 0.25f;
}
this->unk_394 |= 1;
} else {
- if (this->actor.speedXZ < 13.0f) {
- this->actor.speedXZ += 0.4f;
+ if (this->actor.speed < 13.0f) {
+ this->actor.speed += 0.4f;
} else {
- this->actor.speedXZ -= 0.2f;
+ this->actor.speed -= 0.2f;
}
this->unk_394 &= ~1;
}
} else if (sp68 >= this->curRaceWaypoint) {
- if (this->actor.speedXZ < this->unk_398) {
- this->actor.speedXZ += 0.5f;
+ if (this->actor.speed < this->unk_398) {
+ this->actor.speed += 0.5f;
} else {
- this->actor.speedXZ -= 0.5f;
+ this->actor.speed -= 0.5f;
}
this->unk_394 |= 1;
} else if ((sp68 + 1) == this->curRaceWaypoint) {
- s16 sp48 = Actor_YawBetweenActors(&this->actor, &GET_PLAYER(play)->actor) - this->actor.world.rot.y;
+ s16 sp48 = Actor_WorldYawTowardActor(&this->actor, &GET_PLAYER(play)->actor) - this->actor.world.rot.y;
if ((fabsf(Math_SinS(sp48)) < 0.9f) && (Math_CosS(sp48) > 0.0f)) {
- if (this->actor.speedXZ < this->unk_398) {
- this->actor.speedXZ += 0.5f;
+ if (this->actor.speed < this->unk_398) {
+ this->actor.speed += 0.5f;
} else {
- this->actor.speedXZ -= 0.25f;
+ this->actor.speed -= 0.25f;
}
this->unk_394 |= 1;
} else {
- if (this->actor.speedXZ < 12.0f) {
- this->actor.speedXZ += 0.4f;
+ if (this->actor.speed < 12.0f) {
+ this->actor.speed += 0.4f;
} else {
- this->actor.speedXZ -= 0.2f;
+ this->actor.speed -= 0.2f;
}
this->unk_394 &= ~1;
}
} else {
- if (this->actor.speedXZ < 13.0f) {
- this->actor.speedXZ += 0.4f;
+ if (this->actor.speed < 13.0f) {
+ this->actor.speed += 0.4f;
} else {
- this->actor.speedXZ -= 0.2f;
+ this->actor.speed -= 0.2f;
}
this->unk_394 &= ~1;
}
@@ -489,9 +506,9 @@ void EnHorse_PlayWalkingSound(EnHorse* this) {
}
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_WALK);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_WALK);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_WALK);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_WALK);
}
this->soundTimer++;
@@ -503,17 +520,17 @@ void EnHorse_PlayWalkingSound(EnHorse* this) {
void func_8087C178(EnHorse* this) {
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
}
}
void func_8087C1C0(EnHorse* this) {
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
}
}
@@ -572,16 +589,17 @@ void EnHorse_IdleAnimSounds(EnHorse* this, PlayState* play) {
!(this->stateFlags & ENHORSE_SANDDUST_SOUND)) {
this->stateFlags |= ENHORSE_SANDDUST_SOUND;
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST);
}
- } else if ((this->animIndex == 3) && (this->curFrame > 25.0f) && !(this->stateFlags & ENHORSE_LAND2_SOUND)) {
+ } else if ((this->animIndex == ENHORSE_ANIM_REARING) && (this->curFrame > 25.0f) &&
+ !(this->stateFlags & ENHORSE_LAND2_SOUND)) {
this->stateFlags |= ENHORSE_LAND2_SOUND;
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
}
}
}
@@ -594,15 +612,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);
@@ -622,7 +640,7 @@ s32 EnHorse_Spawn(EnHorse* this, PlayState* play) {
this->actor.world.pos.z = spawnPos.z;
this->actor.prevPos = this->actor.world.pos;
this->actor.world.rot.y = 0;
- this->actor.shape.rot.y = Actor_YawBetweenActors(&this->actor, &GET_PLAYER(play)->actor);
+ this->actor.shape.rot.y = Actor_WorldYawTowardActor(&this->actor, &GET_PLAYER(play)->actor);
spawn = true;
SkinMatrix_Vec3fMtxFMultXYZW(&play->viewProjectionMtxF, &this->actor.world.pos, &this->actor.projectedPos,
&this->actor.projectedW);
@@ -648,7 +666,7 @@ s32 EnHorse_Spawn(EnHorse* this, PlayState* play) {
this->actor.world.pos.z = spawnPos.z;
this->actor.prevPos = this->actor.world.pos;
this->actor.world.rot.y = 0;
- this->actor.shape.rot.y = Actor_YawBetweenActors(&this->actor, &GET_PLAYER(play)->actor);
+ this->actor.shape.rot.y = Actor_WorldYawTowardActor(&this->actor, &GET_PLAYER(play)->actor);
spawn = true;
SkinMatrix_Vec3fMtxFMultXYZW(&play->viewProjectionMtxF, &this->actor.world.pos, &this->actor.projectedPos,
&this->actor.projectedW);
@@ -672,9 +690,9 @@ s32 EnHorse_PlayerCanMove(EnHorse* this, PlayState* play) {
if ((player->stateFlags1 & PLAYER_STATE1_1) || (func_800B7128(GET_PLAYER(play)) == true) ||
(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_100) ||
- (play->csCtx.state != CS_STATE_0) || (ActorCutscene_GetCurrentIndex() != -1) ||
- (player->stateFlags1 & PLAYER_STATE1_20) || (player->csMode != PLAYER_CSMODE_0)) {
+ (this->action == ENHORSE_ACTION_HBA) || (player->actor.flags & ACTOR_FLAG_TALK_REQUESTED) ||
+ (play->csCtx.state != CS_STATE_IDLE) || (CutsceneManager_GetCurrentCsId() != CS_ID_NONE) ||
+ (player->stateFlags1 & PLAYER_STATE1_20) || (player->csMode != PLAYER_CSMODE_NONE)) {
return false;
}
return true;
@@ -703,7 +721,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;
@@ -720,7 +738,7 @@ void EnHorse_Init(Actor* thisx, PlayState* play2) {
this->type = HORSE_TYPE_DONKEY;
this->unk_528 = 80.0f;
this->boostSpeed = 12;
- if ((this->bankIndex = Object_GetIndex(&play->objectCtx, OBJECT_HA)) < 0) {
+ if ((this->bankIndex = Object_GetSlot(&play->objectCtx, OBJECT_HA)) < 0) {
Actor_Kill(&this->actor);
return;
}
@@ -730,8 +748,8 @@ void EnHorse_Init(Actor* thisx, PlayState* play2) {
this->type = HORSE_TYPE_2;
this->unk_528 = 64.8f;
this->boostSpeed = 15;
- if ((this->bankIndex = Object_GetIndex(&play->objectCtx, OBJECT_HORSE_LINK_CHILD)) < 0) {
- thisx->objBankIndex = Object_Spawn(&play->objectCtx, OBJECT_HORSE_LINK_CHILD);
+ if ((this->bankIndex = Object_GetSlot(&play->objectCtx, OBJECT_HORSE_LINK_CHILD)) < 0) {
+ thisx->objBankIndex = Object_SpawnPersistent(&play->objectCtx, OBJECT_HORSE_LINK_CHILD);
Actor_SetObjectDependency(play, &this->actor);
Skin_Init(&play->state, &this->skin, sSkeletonHeaders[this->type], sAnimationHeaders[this->type][0]);
Animation_PlayOnce(&this->skin.skelAnime, sAnimationHeaders[this->type][this->animIndex]);
@@ -742,7 +760,7 @@ void EnHorse_Init(Actor* thisx, PlayState* play2) {
} else if (ENHORSE_IS_BANDIT_TYPE(&this->actor)) {
this->type = HORSE_TYPE_BANDIT;
this->boostSpeed = 12;
- if ((this->bankIndex = Object_GetIndex(&play->objectCtx, OBJECT_HA)) < 0) {
+ if ((this->bankIndex = Object_GetSlot(&play->objectCtx, OBJECT_HA)) < 0) {
Actor_Kill(&this->actor);
return;
}
@@ -792,7 +810,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;
}
@@ -800,7 +819,7 @@ void EnHorse_Init(Actor* thisx, PlayState* play2) {
thisx->gravity = -3.5f;
ActorShape_Init(&thisx->shape, 0.0f, ActorShadow_DrawHorse, 20.0f);
this->action = ENHORSE_ACTION_IDLE;
- thisx->speedXZ = 0.0f;
+ thisx->speed = 0.0f;
if (this->type == HORSE_TYPE_2) {
sJntSphInit.elements[0].dim.limb = 13;
@@ -841,7 +860,7 @@ void EnHorse_Init(Actor* thisx, PlayState* play2) {
Skin_Init(&play->state, &this->skin, sSkeletonHeaders[this->type], sAnimationHeaders[this->type][0]);
}
- this->animIndex = 0;
+ this->animIndex = ENHORSE_ANIM_IDLE;
this->numBoosts = 6;
this->boostRegenTime = 0;
this->postDrawFunc = NULL;
@@ -935,11 +954,11 @@ void func_8087D540(Actor* thisx, PlayState* play) {
this->actor.update = EnHorse_Update;
if (this->unk_1EC & 1) {
if (this->type == HORSE_TYPE_BANDIT) {
- SkelAnime_InitFlex(play, &this->skin.skelAnime, &object_ha_Skel_008C68, NULL, this->jointTable,
- this->morphTable, OBJECT_HA_1_LIMB_MAX);
+ SkelAnime_InitFlex(play, &this->skin.skelAnime, &gHorseBanditSkel, NULL, this->jointTable,
+ this->morphTable, HORSE_BANDIT_LIMB_MAX);
} else {
- SkelAnime_InitFlex(play, &this->skin.skelAnime, &object_ha_Skel_0150D8, NULL, this->jointTable,
- this->morphTable, OBJECT_HA_2_LIMB_MAX);
+ SkelAnime_InitFlex(play, &this->skin.skelAnime, &gDonkeySkel, NULL, this->jointTable, this->morphTable,
+ DONKEY_LIMB_MAX);
}
} else {
Skin_Init(&play->state, &this->skin, sSkeletonHeaders[this->type], sAnimationHeaders[this->type][0]);
@@ -989,7 +1008,7 @@ void EnHorse_Freeze(EnHorse* this, PlayState* play) {
}
void EnHorse_Frozen(EnHorse* this, PlayState* play) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->noInputTimer--;
if (this->noInputTimer < 0) {
this->colliderCylinder1.base.ocFlags1 |= OC1_ON;
@@ -1001,10 +1020,10 @@ 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.speedXZ = 8.0f;
+ this->actor.speed = 8.0f;
EnHorse_StartGalloping(this);
}
} else if (this->prevAction == ENHORSE_ACTION_IDLE) {
@@ -1035,10 +1054,10 @@ void EnHorse_UpdateSpeed(EnHorse* this, PlayState* play, f32 brakeDecel, f32 bra
f32 temp_f12;
if (!EnHorse_PlayerCanMove(this, play)) {
- if (this->actor.speedXZ > 8.0f) {
- this->actor.speedXZ -= decel;
- } else if (this->actor.speedXZ < 0.0f) {
- this->actor.speedXZ = 0.0f;
+ if (this->actor.speed > 8.0f) {
+ this->actor.speed -= decel;
+ } else if (this->actor.speed < 0.0f) {
+ this->actor.speed = 0.0f;
}
return;
}
@@ -1047,63 +1066,62 @@ void EnHorse_UpdateSpeed(EnHorse* this, PlayState* play, f32 brakeDecel, f32 bra
EnHorse_StickDirection(&this->curStick, &stickMag, &stickAngle);
if (Math_CosS(stickAngle) <= brakeAngle) {
- this->actor.speedXZ -= brakeDecel;
- this->actor.speedXZ = CLAMP_MIN(this->actor.speedXZ, 0.0f);
+ this->actor.speed -= brakeDecel;
+ this->actor.speed = CLAMP_MIN(this->actor.speed, 0.0f);
return;
}
if (stickMag < minStickMag) {
this->stateFlags &= ~ENHORSE_BOOST;
this->stateFlags &= ~ENHORSE_BOOST_DECEL;
- this->actor.speedXZ -= decel;
- if (this->actor.speedXZ < 0.0f) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed -= decel;
+ if (this->actor.speed < 0.0f) {
+ this->actor.speed = 0.0f;
}
return;
}
if (this->stateFlags & ENHORSE_BOOST) {
if ((16 - this->boostTimer) > 0) {
- this->actor.speedXZ =
- (((EnHorse_SlopeSpeedMultiplier(this, play) * this->boostSpeed) - this->actor.speedXZ) /
- (16.0f - this->boostTimer)) +
- this->actor.speedXZ;
+ this->actor.speed = (((EnHorse_SlopeSpeedMultiplier(this, play) * this->boostSpeed) - this->actor.speed) /
+ (16.0f - this->boostTimer)) +
+ this->actor.speed;
} else {
- this->actor.speedXZ = EnHorse_SlopeSpeedMultiplier(this, play) * this->boostSpeed;
+ this->actor.speed = EnHorse_SlopeSpeedMultiplier(this, play) * this->boostSpeed;
}
- if ((EnHorse_SlopeSpeedMultiplier(this, play) * this->boostSpeed) <= this->actor.speedXZ) {
+ if ((EnHorse_SlopeSpeedMultiplier(this, play) * this->boostSpeed) <= this->actor.speed) {
this->stateFlags &= ~ENHORSE_BOOST;
this->stateFlags |= ENHORSE_BOOST_DECEL;
}
} else if (this->stateFlags & ENHORSE_BOOST_DECEL) {
- if (this->actor.speedXZ > baseSpeed) {
- this->actor.speedXZ -= 0.06f;
- } else if (this->actor.speedXZ < baseSpeed) {
- this->actor.speedXZ = baseSpeed;
+ if (this->actor.speed > baseSpeed) {
+ this->actor.speed -= 0.06f;
+ } else if (this->actor.speed < baseSpeed) {
+ this->actor.speed = baseSpeed;
this->stateFlags &= ~ENHORSE_BOOST_DECEL;
}
} else {
- if (this->actor.speedXZ <= (baseSpeed * (1.0f / 54.0f) * stickMag)) {
+ if (this->actor.speed <= (baseSpeed * (1.0f / 54.0f) * stickMag)) {
phi_f0 = 1.0f;
} else {
phi_f0 = -1.0f;
}
- this->actor.speedXZ += phi_f0 * 50.0f * 0.01f;
+ this->actor.speed += phi_f0 * 50.0f * 0.01f;
- if (this->actor.speedXZ > baseSpeed) {
- this->actor.speedXZ -= decel;
- if (this->actor.speedXZ < baseSpeed) {
- this->actor.speedXZ = baseSpeed;
+ if (this->actor.speed > baseSpeed) {
+ this->actor.speed -= decel;
+ if (this->actor.speed < baseSpeed) {
+ this->actor.speed = baseSpeed;
}
}
}
temp_f12 = stickAngle * (1 / 32236.f);
- turn = stickAngle * temp_f12 * temp_f12 * (2.2f - (this->actor.speedXZ * (1.0f / this->boostSpeed)));
- turn = CLAMP(turn, -turnSpeed * (2.2f - (1.7f * this->actor.speedXZ * (1.0f / this->boostSpeed))),
- turnSpeed * (2.2f - (1.7f * this->actor.speedXZ * (1.0f / this->boostSpeed))));
+ turn = stickAngle * temp_f12 * temp_f12 * (2.2f - (this->actor.speed * (1.0f / this->boostSpeed)));
+ turn = CLAMP(turn, -turnSpeed * (2.2f - (1.7f * this->actor.speed * (1.0f / this->boostSpeed))),
+ turnSpeed * (2.2f - (1.7f * this->actor.speed * (1.0f / this->boostSpeed))));
this->actor.world.rot.y += turn;
this->actor.shape.rot.y = this->actor.world.rot.y;
}
@@ -1125,9 +1143,9 @@ void EnHorse_StartMountedIdle(EnHorse* this) {
if (!(this->stateFlags & ENHORSE_SANDDUST_SOUND)) {
this->stateFlags |= ENHORSE_SANDDUST_SOUND;
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST);
}
}
}
@@ -1141,7 +1159,7 @@ void EnHorse_MountedIdle(EnHorse* this, PlayState* play) {
f32 mag;
s16 angle = 0;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
EnHorse_StickDirection(&this->curStick, &mag, &angle);
if (mag > 10.0f) {
if (EnHorse_PlayerCanMove(this, play) == true) {
@@ -1177,9 +1195,9 @@ void EnHorse_MountedIdleWhinny(EnHorse* this) {
Animation_GetLastFrame(sAnimationHeaders[this->type][1]), ANIMMODE_ONCE, -3.0f);
if (this->stateFlags & ENHORSE_DRAW) {
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_GROAN);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_KID_HORSE_GROAN);
} else {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_GROAN);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_HORSE_GROAN);
}
}
}
@@ -1188,7 +1206,7 @@ void EnHorse_MountedIdleWhinnying(EnHorse* this, PlayState* play) {
f32 stickMag;
s16 stickAngle = 0;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
EnHorse_StickDirection(&this->curStick, &stickMag, &stickAngle);
if (stickMag > 10.0f) {
if (EnHorse_PlayerCanMove(this, play) == true) {
@@ -1222,7 +1240,7 @@ void EnHorse_MountedTurn(EnHorse* this, PlayState* play) {
s16 clampedYaw;
s16 stickAngle;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
EnHorse_PlayWalkingSound(this);
if (EnHorse_PlayerCanMove(this, play) == true) {
EnHorse_StickDirection(&this->curStick, &stickMag, &stickAngle);
@@ -1300,15 +1318,15 @@ void EnHorse_MountedWalk(EnHorse* this, PlayState* play) {
((this->noInputTimer > 0) && (this->noInputTimer < (this->noInputTimerMax - 20)))) {
EnHorse_UpdateSpeed(this, play, 0.3f, -0.5f, 10.0f, 0.06f, 3.0f, 0x320);
} else {
- this->actor.speedXZ = 3.0f;
+ this->actor.speed = 3.0f;
}
- if (this->actor.speedXZ == 0.0f) {
+ if (this->actor.speed == 0.0f) {
this->stateFlags &= ~ENHORSE_FLAG_9;
EnHorse_StartMountedIdleResetAnim(this);
this->noInputTimer = 0;
this->noInputTimerMax = 0;
- } else if (this->actor.speedXZ > 3.0f) {
+ } else if (this->actor.speed > 3.0f) {
this->stateFlags &= ~ENHORSE_FLAG_9;
EnHorse_StartTrotting(this);
this->noInputTimer = 0;
@@ -1324,9 +1342,9 @@ void EnHorse_MountedWalk(EnHorse* this, PlayState* play) {
if (this->waitTimer <= 0) {
this->stateFlags &= ~ENHORSE_FLAG_9;
- this->skin.skelAnime.playSpeed = this->actor.speedXZ * 0.75f;
- if ((SkelAnime_Update(&this->skin.skelAnime) || (this->actor.speedXZ == 0.0f)) && (this->noInputTimer <= 0)) {
- if (this->actor.speedXZ > 3.0f) {
+ this->skin.skelAnime.playSpeed = this->actor.speed * 0.75f;
+ if ((SkelAnime_Update(&this->skin.skelAnime) || (this->actor.speed == 0.0f)) && (this->noInputTimer <= 0)) {
+ if (this->actor.speed > 3.0f) {
EnHorse_StartTrotting(this);
this->noInputTimer = 0;
this->noInputTimerMax = 0;
@@ -1340,7 +1358,7 @@ void EnHorse_MountedWalk(EnHorse* this, PlayState* play) {
}
} else {
this->waitTimer--;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
}
@@ -1363,18 +1381,18 @@ void EnHorse_MountedTrot(EnHorse* this, PlayState* play) {
EnHorse_UpdateSpeed(this, play, 0.3f, -0.5f, 10.0f, 0.06f, 6.0f, 800);
EnHorse_StickDirection(&this->curStick, &stickMag, &stickAngle);
- if (this->actor.speedXZ < 3.0f) {
+ if (this->actor.speed < 3.0f) {
EnHorse_StartWalkingInterruptable(this);
}
- this->skin.skelAnime.playSpeed = this->actor.speedXZ * 0.375f;
+ this->skin.skelAnime.playSpeed = this->actor.speed * 0.375f;
if (SkelAnime_Update(&this->skin.skelAnime)) {
func_8087C178(this);
Rumble_Request(0.0f, 60, 8, 255);
- if (this->actor.speedXZ >= 6.0f) {
+ if (this->actor.speed >= 6.0f) {
EnHorse_StartGallopingInterruptable(this);
- } else if (this->actor.speedXZ < 3.0f) {
+ } else if (this->actor.speed < 3.0f) {
EnHorse_StartWalkingInterruptable(this);
} else {
EnHorse_MountedTrotReset(this);
@@ -1428,14 +1446,14 @@ void EnHorse_MountedGallop(EnHorse* this, PlayState* play) {
EnHorse_UpdateSpeed(this, play, 0.3f, -0.5f, 10.0f, 0.06f, 8.0f, 800);
} else if (this->noInputTimer > 0) {
this->noInputTimer--;
- this->actor.speedXZ = 8.0f;
+ this->actor.speed = 8.0f;
}
- if (this->actor.speedXZ < 6.0f) {
+ if (this->actor.speed < 6.0f) {
EnHorse_StartTrotting(this);
}
- this->skin.skelAnime.playSpeed = this->actor.speedXZ * 0.3f;
+ this->skin.skelAnime.playSpeed = this->actor.speed * 0.3f;
if (SkelAnime_Update(&this->skin.skelAnime)) {
func_8087C1C0(this);
@@ -1443,7 +1461,7 @@ void EnHorse_MountedGallop(EnHorse* this, PlayState* play) {
if (EnHorse_PlayerCanMove(this, play) == true) {
if ((stickMag >= 10.0f) && (Math_CosS(stickAngle) <= -0.5f)) {
EnHorse_StartBraking(this, play);
- } else if (this->actor.speedXZ < 6.0f) {
+ } else if (this->actor.speed < 6.0f) {
EnHorse_StartTrotting(this);
} else {
EnHorse_MountedGallopReset(this);
@@ -1462,9 +1480,9 @@ void EnHorse_StartRearing(EnHorse* this) {
if (Rand_ZeroOne() > 0.5f) {
if (this->stateFlags & ENHORSE_DRAW) {
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
} else {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
}
}
Rumble_Request(0.0f, 180, 20, 100);
@@ -1476,9 +1494,9 @@ void EnHorse_StartRearing(EnHorse* this) {
this->stateFlags &= ~ENHORSE_LAND2_SOUND;
if (this->stateFlags & ENHORSE_DRAW) {
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
} else {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
}
}
@@ -1491,14 +1509,14 @@ void EnHorse_MountedRearing(EnHorse* this, PlayState* play) {
f32 stickMag;
s16 stickAngle;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->curFrame > 25.0f) {
if (!(this->stateFlags & ENHORSE_LAND2_SOUND)) {
this->stateFlags |= ENHORSE_LAND2_SOUND;
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
}
Rumble_Request(0.0f, 180, 20, 100);
}
@@ -1536,9 +1554,9 @@ void EnHorse_StartBraking(EnHorse* this, PlayState* play) {
if (Rand_ZeroOne() > 0.5f) {
if (this->stateFlags & ENHORSE_DRAW) {
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
} else {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
}
}
Rumble_Request(0.0f, 180, 20, 100);
@@ -1548,9 +1566,9 @@ void EnHorse_StartBraking(EnHorse* this, PlayState* play) {
}
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_SLIP);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_SLIP);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_SLIP);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_SLIP);
}
Animation_Change(&this->skin.skelAnime, sAnimationHeaders[this->type][this->animIndex], 1.5f, 0.0f,
@@ -1560,22 +1578,22 @@ void EnHorse_StartBraking(EnHorse* this, PlayState* play) {
}
void EnHorse_Stopping(EnHorse* this, PlayState* play) {
- if (this->actor.speedXZ > 0.0f) {
- this->actor.speedXZ -= 0.6f;
- if (this->actor.speedXZ < 0.0f) {
- this->actor.speedXZ = 0.0f;
+ if (this->actor.speed > 0.0f) {
+ this->actor.speed -= 0.6f;
+ if (this->actor.speed < 0.0f) {
+ this->actor.speed = 0.0f;
}
}
if ((this->stateFlags & ENHORSE_STOPPING_NEIGH_SOUND) && (this->skin.skelAnime.curFrame > 29.0f)) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if ((Rand_ZeroOne() > 0.5f) &&
((gSaveContext.save.entrance != ENTRANCE(ROMANI_RANCH, 0)) || (Cutscene_GetSceneLayer(play) == 0))) {
if (this->stateFlags & ENHORSE_DRAW) {
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
} else {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
}
}
Rumble_Request(0.0f, 180, 20, 100);
@@ -1586,9 +1604,9 @@ void EnHorse_Stopping(EnHorse* this, PlayState* play) {
}
if (this->skin.skelAnime.curFrame > 29.0f) {
- this->actor.speedXZ = 0.0f;
- } else if ((this->actor.speedXZ > 3.0f) && (this->stateFlags & ENHORSE_FORCE_REVERSING)) {
- this->actor.speedXZ = 3.0f;
+ this->actor.speed = 0.0f;
+ } else if ((this->actor.speed > 3.0f) && (this->stateFlags & ENHORSE_FORCE_REVERSING)) {
+ this->actor.speed = 3.0f;
}
if (SkelAnime_Update(&this->skin.skelAnime)) {
@@ -1630,29 +1648,29 @@ void EnHorse_Reverse(EnHorse* this, PlayState* play) {
((this->noInputTimer > 0) && (this->noInputTimer < (this->noInputTimerMax - 20)))) {
if ((stickMag < 10.0f) && (this->noInputTimer <= 0)) {
EnHorse_StartMountedIdleResetAnim(this);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
return;
} else if (stickMag < 10.0f) {
stickAngle = -0x7FFF;
} else if (Math_CosS(stickAngle) > -0.5f) {
this->noInputTimerMax = 0;
EnHorse_StartMountedIdleResetAnim(this);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
return;
}
} else if (stickMag < 10.0f) {
stickAngle = -0x7FFF;
}
- } else if ((player->actor.flags & ACTOR_FLAG_100) || (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.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
return;
} else {
stickAngle = -0x7FFF;
}
- this->actor.speedXZ = -2.0f;
+ this->actor.speed = -2.0f;
turnAmount = -0x8000 - stickAngle;
turnAmount = CLAMP(turnAmount, -2400.0f, 2400.0f);
this->actor.world.rot.y += turnAmount;
@@ -1665,7 +1683,7 @@ void EnHorse_Reverse(EnHorse* this, PlayState* play) {
}
}
- this->skin.skelAnime.playSpeed = this->actor.speedXZ * 0.5f * 1.5f;
+ this->skin.skelAnime.playSpeed = this->actor.speed * 0.5f * 1.5f;
if (SkelAnime_Update(&this->skin.skelAnime) && (this->noInputTimer <= 0) &&
(EnHorse_PlayerCanMove(this, play) == true)) {
@@ -1706,9 +1724,9 @@ void EnHorse_StartLowJump(EnHorse* this, PlayState* play) {
this->riderPos.y -= ((y * 0.01f) * this->unk_528) * 0.01f;
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_JUMP);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_JUMP);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_JUMP);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_JUMP);
}
Rumble_Request(0.0f, 170, 10, 10);
}
@@ -1724,8 +1742,8 @@ void EnHorse_LowJump(EnHorse* this, PlayState* play) {
this->stateFlags |= ENHORSE_JUMPING;
- if (this->actor.speedXZ < 12.0f) {
- this->actor.speedXZ = 12.0f;
+ if (this->actor.speed < 12.0f) {
+ this->actor.speed = 12.0f;
}
if (this->actor.floorHeight != BGCHECK_Y_MIN) {
@@ -1765,9 +1783,9 @@ void EnHorse_LowJump(EnHorse* this, PlayState* play) {
((curFrame > 17.0f) &&
(this->actor.world.pos.y < ((this->actor.floorHeight - this->actor.velocity.y) + 80.0f)))) {
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND);
}
Rumble_Request(0.0f, 255, 10, 80);
this->stateFlags &= ~ENHORSE_JUMPING;
@@ -1804,9 +1822,9 @@ void EnHorse_StartHighJump(EnHorse* this, PlayState* play) {
this->stateFlags |= ENHORSE_CALC_RIDER_POS;
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_JUMP);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_JUMP);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_JUMP);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_JUMP);
}
Rumble_Request(0.0f, 170, 10, 10);
}
@@ -1822,8 +1840,8 @@ void EnHorse_HighJump(EnHorse* this, PlayState* play) {
this->stateFlags |= ENHORSE_JUMPING;
- if (this->actor.speedXZ < 13.0f) {
- this->actor.speedXZ = 13.0f;
+ if (this->actor.speed < 13.0f) {
+ this->actor.speed = 13.0f;
}
if (this->actor.floorHeight != BGCHECK_Y_MIN) {
@@ -1862,9 +1880,9 @@ void EnHorse_HighJump(EnHorse* this, PlayState* play) {
((curFrame > 23.0f) &&
(this->actor.world.pos.y < ((this->actor.floorHeight - this->actor.velocity.y) + 80.0f)))) {
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND);
}
Rumble_Request(0.0f, 255, 10, 80);
this->stateFlags &= ~ENHORSE_JUMPING;
@@ -1886,11 +1904,11 @@ 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);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_NEIGH);
}
this->stateFlags &= ~ENHORSE_INACTIVE;
}
@@ -1906,37 +1924,37 @@ void EnHorse_Inactive(EnHorse* this, PlayState* play) {
}
}
-void EnHorse_PlayIdleAnimation(EnHorse* this, s32 anim, f32 morphFrames, f32 startFrames) {
+void EnHorse_PlayIdleAnimation(EnHorse* this, s32 animIndex, f32 morphFrames, f32 startFrames) {
this->action = ENHORSE_ACTION_IDLE;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
- if ((anim != ENHORSE_ANIM_IDLE) && (anim != ENHORSE_ANIM_WHINNY) && (anim != ENHORSE_ANIM_REARING)) {
- anim = ENHORSE_ANIM_IDLE;
+ if ((animIndex != ENHORSE_ANIM_IDLE) && (animIndex != ENHORSE_ANIM_WHINNY) && (animIndex != ENHORSE_ANIM_REARING)) {
+ animIndex = ENHORSE_ANIM_IDLE;
}
- if (sAnimationHeaders[this->type][anim] == NULL) {
- anim = ENHORSE_ANIM_IDLE;
+ if (sAnimationHeaders[this->type][animIndex] == NULL) {
+ animIndex = ENHORSE_ANIM_IDLE;
}
- if (anim != this->animIndex) {
- this->animIndex = anim;
- if (anim == ENHORSE_ANIM_IDLE) {
+ if (this->animIndex != animIndex) {
+ this->animIndex = animIndex;
+ if (animIndex == ENHORSE_ANIM_IDLE) {
this->stateFlags &= ~ENHORSE_SANDDUST_SOUND;
} else {
if (this->animIndex == ENHORSE_ANIM_WHINNY) {
if (this->stateFlags & ENHORSE_DRAW) {
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_GROAN);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_KID_HORSE_GROAN);
} else {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_GROAN);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_HORSE_GROAN);
}
}
} else if (this->animIndex == ENHORSE_ANIM_REARING) {
if (this->stateFlags & ENHORSE_DRAW) {
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
} else {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
}
}
this->stateFlags &= ~ENHORSE_LAND2_SOUND;
@@ -1948,8 +1966,8 @@ void EnHorse_PlayIdleAnimation(EnHorse* this, s32 anim, f32 morphFrames, f32 sta
}
}
-void EnHorse_ChangeIdleAnimation(EnHorse* this, s32 anim, f32 morphFrames) {
- EnHorse_PlayIdleAnimation(this, anim, morphFrames, this->curFrame);
+void EnHorse_ChangeIdleAnimation(EnHorse* this, s32 animIndex, f32 morphFrames) {
+ EnHorse_PlayIdleAnimation(this, animIndex, morphFrames, this->curFrame);
}
void EnHorse_ResetIdleAnimation(EnHorse* this) {
@@ -1963,26 +1981,26 @@ void EnHorse_StartIdleRidable(EnHorse* this) {
}
void EnHorse_Idle(EnHorse* this, PlayState* play) {
- this->actor.speedXZ = 0.0f;
+ 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) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_NEIGH);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_NEIGH);
}
this->followTimer = 0;
EnHorse_SetFollowAnimation(this, play);
}
} else {
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_NEIGH);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_NEIGH);
}
this->followTimer = 0;
EnHorse_StartMovingAnimation(this, 6, -3.0f, 0.0f);
@@ -2005,16 +2023,16 @@ void EnHorse_Idle(EnHorse* this, PlayState* play) {
}
}
-void EnHorse_StartMovingAnimation(EnHorse* this, s32 anim, f32 morphFrames, f32 startFrames) {
+void EnHorse_StartMovingAnimation(EnHorse* this, s32 animIndex, f32 morphFrames, f32 startFrames) {
this->action = ENHORSE_ACTION_FOLLOW_PLAYER;
this->stateFlags &= ~ENHORSE_TURNING_TO_PLAYER;
- if ((anim != ENHORSE_ANIM_TROT) && (anim != ENHORSE_ANIM_GALLOP) && (anim != ENHORSE_ANIM_WALK)) {
- anim = ENHORSE_ANIM_WALK;
+ if ((animIndex != ENHORSE_ANIM_TROT) && (animIndex != ENHORSE_ANIM_GALLOP) && (animIndex != ENHORSE_ANIM_WALK)) {
+ animIndex = ENHORSE_ANIM_WALK;
}
- if (anim != this->animIndex) {
- this->animIndex = anim;
+ if (this->animIndex != animIndex) {
+ this->animIndex = animIndex;
Animation_Change(&this->skin.skelAnime, sAnimationHeaders[this->type][this->animIndex], 1.0f, startFrames,
Animation_GetLastFrame(sAnimationHeaders[this->type][this->animIndex]), ANIMMODE_ONCE,
morphFrames);
@@ -2025,45 +2043,45 @@ void EnHorse_StartMovingAnimation(EnHorse* this, s32 anim, f32 morphFrames, f32
}
void EnHorse_SetFollowAnimation(EnHorse* this, PlayState* play) {
- s32 anim = ENHORSE_ANIM_WALK;
- f32 distToPlayer = Actor_XZDistanceBetweenActors(&this->actor, &GET_PLAYER(play)->actor);
+ s32 animIndex = ENHORSE_ANIM_WALK;
+ f32 distToPlayer = Actor_WorldDistXZToActor(&this->actor, &GET_PLAYER(play)->actor);
if (distToPlayer > 400.0f) {
- anim = ENHORSE_ANIM_GALLOP;
+ animIndex = ENHORSE_ANIM_GALLOP;
} else if (!(distToPlayer <= 300.0f) && (distToPlayer <= 400.0f)) {
- anim = ENHORSE_ANIM_TROT;
+ animIndex = ENHORSE_ANIM_TROT;
}
if (this->animIndex == ENHORSE_ANIM_GALLOP) {
if (distToPlayer > 400.0f) {
- anim = ENHORSE_ANIM_GALLOP;
+ animIndex = ENHORSE_ANIM_GALLOP;
} else {
- anim = ENHORSE_ANIM_TROT;
+ animIndex = ENHORSE_ANIM_TROT;
}
} else if (this->animIndex == ENHORSE_ANIM_TROT) {
if (distToPlayer > 400.0f) {
- anim = ENHORSE_ANIM_GALLOP;
+ animIndex = ENHORSE_ANIM_GALLOP;
} else if (distToPlayer < 300.0f) {
- anim = ENHORSE_ANIM_WALK;
+ animIndex = ENHORSE_ANIM_WALK;
} else {
- anim = ENHORSE_ANIM_TROT;
+ animIndex = ENHORSE_ANIM_TROT;
}
} else if (this->animIndex == ENHORSE_ANIM_WALK) {
if (distToPlayer > 300.0f) {
- anim = ENHORSE_ANIM_TROT;
+ animIndex = ENHORSE_ANIM_TROT;
} else {
- anim = ENHORSE_ANIM_WALK;
+ animIndex = ENHORSE_ANIM_WALK;
}
}
- EnHorse_StartMovingAnimation(this, anim, -3.0f, 0.0f);
+ EnHorse_StartMovingAnimation(this, animIndex, -3.0f, 0.0f);
}
void EnHorse_FollowPlayer(EnHorse* this, PlayState* play) {
f32 distToPlayer;
- D_801BDAA4 = 0;
- distToPlayer = Actor_XZDistanceBetweenActors(&this->actor, &GET_PLAYER(play)->actor);
+ 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) &&
!(this->stateFlags & ENHORSE_TURNING_TO_PLAYER)) {
@@ -2071,7 +2089,7 @@ void EnHorse_FollowPlayer(EnHorse* this, PlayState* play) {
this->animIndex = ENHORSE_ANIM_REARING;
this->stateFlags |= ENHORSE_TURNING_TO_PLAYER;
- this->angleToPlayer = Actor_YawBetweenActors(&this->actor, &GET_PLAYER(play)->actor);
+ this->angleToPlayer = Actor_WorldYawTowardActor(&this->actor, &GET_PLAYER(play)->actor);
angleDiff = (f32)this->angleToPlayer - this->actor.world.rot.y;
if (angleDiff > 0x7FFF) {
@@ -2092,9 +2110,9 @@ void EnHorse_FollowPlayer(EnHorse* this, PlayState* play) {
if ((this->curFrame > 25.0f) && !(this->stateFlags & ENHORSE_LAND2_SOUND)) {
this->stateFlags |= ENHORSE_LAND2_SOUND;
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
}
}
} else {
@@ -2102,18 +2120,18 @@ void EnHorse_FollowPlayer(EnHorse* this, PlayState* play) {
}
if (this->animIndex == ENHORSE_ANIM_GALLOP) {
- this->actor.speedXZ = 8.0f;
- this->skin.skelAnime.playSpeed = this->actor.speedXZ * 0.3f;
+ this->actor.speed = 8.0f;
+ this->skin.skelAnime.playSpeed = this->actor.speed * 0.3f;
} else {
if (this->animIndex == ENHORSE_ANIM_TROT) {
- this->actor.speedXZ = 6.0f;
- this->skin.skelAnime.playSpeed = this->actor.speedXZ * 0.375f;
+ this->actor.speed = 6.0f;
+ this->skin.skelAnime.playSpeed = this->actor.speed * 0.375f;
} else if (this->animIndex == ENHORSE_ANIM_WALK) {
- this->actor.speedXZ = 3.0f;
+ this->actor.speed = 3.0f;
EnHorse_PlayWalkingSound(this);
- this->skin.skelAnime.playSpeed = this->actor.speedXZ * 0.75f;
+ this->skin.skelAnime.playSpeed = this->actor.speed * 0.75f;
} else {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->skin.skelAnime.playSpeed = 1.0f;
}
}
@@ -2124,9 +2142,9 @@ void EnHorse_FollowPlayer(EnHorse* this, PlayState* play) {
EnHorse_StartIdleRidable(this);
if (this->stateFlags & ENHORSE_DRAW) {
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
} else {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
}
}
}
@@ -2152,16 +2170,16 @@ void EnHorse_FollowPlayer(EnHorse* this, PlayState* play) {
void EnHorse_InitIngoHorse(EnHorse* this) {
this->curRaceWaypoint = 0;
this->soundTimer = 0;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
EnHorse_UpdateIngoHorseAnim(this);
if (this->stateFlags & ENHORSE_DRAW) {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_IT_INGO_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_IT_INGO_HORSE_NEIGH);
}
}
void EnHorse_SetIngoAnimation(s32 animIndex, f32 curFrame, s32 arg2, s16* animIndexOut) {
*animIndexOut = sIngoAnimIndices[animIndex];
- if (arg2 == ENIN_ANIM_1) {
+ if (arg2 == 1) {
if (animIndex == ENHORSE_ANIM_TROT) {
*animIndexOut = ENIN_ANIM_4;
} else if (animIndex == ENHORSE_ANIM_GALLOP) {
@@ -2177,17 +2195,17 @@ void EnHorse_UpdateIngoHorseAnim(EnHorse* this) {
this->action = ENHORSE_ACTION_INGO_RACE;
this->stateFlags &= ~ENHORSE_SANDDUST_SOUND;
- if (this->actor.speedXZ == 0.0f) {
+ if (this->actor.speed == 0.0f) {
if (this->animIndex != ENHORSE_ANIM_IDLE) {
animChanged = true;
}
this->animIndex = ENHORSE_ANIM_IDLE;
- } else if (this->actor.speedXZ <= 3.0f) {
+ } else if (this->actor.speed <= 3.0f) {
if (this->animIndex != ENHORSE_ANIM_WALK) {
animChanged = true;
}
this->animIndex = ENHORSE_ANIM_WALK;
- } else if (this->actor.speedXZ <= 6.0f) {
+ } else if (this->actor.speed <= 6.0f) {
if (this->animIndex != ENHORSE_ANIM_TROT) {
animChanged = true;
}
@@ -2200,20 +2218,20 @@ void EnHorse_UpdateIngoHorseAnim(EnHorse* this) {
}
if (this->animIndex == ENHORSE_ANIM_WALK) {
- animSpeed = this->actor.speedXZ * 0.5f;
+ animSpeed = this->actor.speed * 0.5f;
} else if (this->animIndex == ENHORSE_ANIM_TROT) {
- animSpeed = this->actor.speedXZ * 0.25f;
+ animSpeed = this->actor.speed * 0.25f;
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
}
} else if (this->animIndex == ENHORSE_ANIM_GALLOP) {
- animSpeed = this->actor.speedXZ * 0.2f;
+ animSpeed = this->actor.speed * 0.2f;
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
}
} else {
animSpeed = 1.0f;
@@ -2240,26 +2258,26 @@ void EnHorse_UpdateIngoRace(EnHorse* this, PlayState* play) {
}
if (!this->inRace) {
- this->actor.speedXZ = 0.0f;
- this->rider->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
+ this->rider->actor.speed = 0.0f;
if (this->animIndex != ENHORSE_ANIM_IDLE) {
EnHorse_UpdateIngoHorseAnim(this);
}
}
if (this->animIndex == ENHORSE_ANIM_WALK) {
- playSpeed = this->actor.speedXZ * 0.5f;
+ playSpeed = this->actor.speed * 0.5f;
} else if (this->animIndex == ENHORSE_ANIM_TROT) {
- playSpeed = this->actor.speedXZ * 0.25f;
+ playSpeed = this->actor.speed * 0.25f;
} else if (this->animIndex == ENHORSE_ANIM_GALLOP) {
- playSpeed = this->actor.speedXZ * 0.2f;
+ playSpeed = this->actor.speed * 0.2f;
} else {
playSpeed = 1.0f;
}
this->skin.skelAnime.playSpeed = playSpeed;
if (SkelAnime_Update(&this->skin.skelAnime) ||
- ((this->animIndex == ENHORSE_ANIM_IDLE) && (this->actor.speedXZ != 0.0f))) {
+ ((this->animIndex == ENHORSE_ANIM_IDLE) && (this->actor.speed != 0.0f))) {
EnHorse_UpdateIngoHorseAnim(this);
}
}
@@ -2282,9 +2300,9 @@ void func_80881290(EnHorse* this, PlayState* play) {
this->actor.velocity.y = 0.0f;
this->jumpStartY = this->actor.world.pos.y;
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_JUMP);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_JUMP);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_JUMP);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_JUMP);
}
Rumble_Request(0.0f, 170, 10, 10);
}
@@ -2292,15 +2310,15 @@ void func_80881290(EnHorse* this, PlayState* play) {
void func_80881398(EnHorse* this, PlayState* play) {
Vec3s* jointTable;
f32 y;
- s32 animeUpdated;
+ s32 isAnimFinished;
f32 curFrame;
this->stateFlags |= ENHORSE_JUMPING;
- if (this->actor.speedXZ < 14.0f) {
- this->actor.speedXZ = 14.0f;
+ if (this->actor.speed < 14.0f) {
+ this->actor.speed = 14.0f;
}
- animeUpdated = SkelAnime_Update(&this->skin.skelAnime);
+ isAnimFinished = SkelAnime_Update(&this->skin.skelAnime);
curFrame = this->skin.skelAnime.curFrame;
if (curFrame > 23.0f) {
@@ -2319,12 +2337,12 @@ void func_80881398(EnHorse* this, PlayState* play) {
this->actor.world.pos.y = this->jumpStartY + (y * 0.01f * this->unk_528 * 0.01f);
}
- if (animeUpdated || ((curFrame > 17.0f) &&
- (this->actor.world.pos.y < ((this->actor.floorHeight - this->actor.velocity.y) + 80.0f)))) {
+ if (isAnimFinished || ((curFrame > 17.0f) &&
+ (this->actor.world.pos.y < ((this->actor.floorHeight - this->actor.velocity.y) + 80.0f)))) {
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND);
}
Rumble_Request(0.0f, 255, 10, 80);
this->stateFlags &= ~ENHORSE_JUMPING;
@@ -2352,10 +2370,10 @@ void func_8088159C(EnHorse* this, PlayState* play) {
void func_80881634(EnHorse* this) {
this->curRaceWaypoint = 0;
this->soundTimer = 0;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
func_8088168C(this);
if (this->stateFlags & ENHORSE_DRAW) {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_IT_INGO_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_IT_INGO_HORSE_NEIGH);
}
}
@@ -2367,17 +2385,17 @@ void func_8088168C(EnHorse* this) {
this->action = ENHORSE_ACTION_5;
this->stateFlags &= ~ENHORSE_SANDDUST_SOUND;
- if (this->actor.speedXZ == 0.0f) {
+ if (this->actor.speed == 0.0f) {
if (this->animIndex != ENHORSE_ANIM_IDLE) {
animChanged = true;
}
this->animIndex = ENHORSE_ANIM_IDLE;
- } else if (this->actor.speedXZ <= 3.0f) {
+ } else if (this->actor.speed <= 3.0f) {
if (this->animIndex != ENHORSE_ANIM_WALK) {
animChanged = true;
}
this->animIndex = ENHORSE_ANIM_WALK;
- } else if (this->actor.speedXZ <= 6.0f) {
+ } else if (this->actor.speed <= 6.0f) {
if (this->animIndex != ENHORSE_ANIM_TROT) {
animChanged = true;
}
@@ -2390,20 +2408,20 @@ void func_8088168C(EnHorse* this) {
}
if (this->animIndex == ENHORSE_ANIM_WALK) {
- animSpeed = this->actor.speedXZ * 0.5f;
+ animSpeed = this->actor.speed * 0.5f;
} else if (this->animIndex == ENHORSE_ANIM_TROT) {
- animSpeed = this->actor.speedXZ * 0.25f;
+ animSpeed = this->actor.speed * 0.25f;
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
}
} else if (this->animIndex == ENHORSE_ANIM_GALLOP) {
- animSpeed = this->actor.speedXZ * 0.2f;
+ animSpeed = this->actor.speed * 0.2f;
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
}
} else {
animSpeed = 1.0f;
@@ -2434,8 +2452,8 @@ void func_808819D8(EnHorse* this, PlayState* play) {
}
if (!this->inRace) {
- this->actor.speedXZ = 0.0f;
- this->rider->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
+ this->rider->actor.speed = 0.0f;
if (this->animIndex != ENHORSE_ANIM_IDLE) {
EnHorse_UpdateIngoHorseAnim(this);
}
@@ -2450,65 +2468,65 @@ void func_808819D8(EnHorse* this, PlayState* play) {
}
if (!this->inRace) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->animIndex != ENHORSE_ANIM_IDLE) {
func_8088168C(this);
}
}
if (this->animIndex == ENHORSE_ANIM_WALK) {
- animSpeed = this->actor.speedXZ * 0.5f;
+ animSpeed = this->actor.speed * 0.5f;
} else if (this->animIndex == ENHORSE_ANIM_TROT) {
- animSpeed = this->actor.speedXZ * 0.25f;
+ animSpeed = this->actor.speed * 0.25f;
} else if (this->animIndex == ENHORSE_ANIM_GALLOP) {
- animSpeed = this->actor.speedXZ * 0.2f;
+ animSpeed = this->actor.speed * 0.2f;
} else {
animSpeed = 1.0f;
}
this->skin.skelAnime.playSpeed = animSpeed;
if (SkelAnime_Update(&this->skin.skelAnime) ||
- ((this->animIndex == ENHORSE_ANIM_IDLE) && (this->actor.speedXZ != 0.0f))) {
+ ((this->animIndex == ENHORSE_ANIM_IDLE) && (this->actor.speed != 0.0f))) {
func_8088168C(this);
}
- if (GET_WEEKEVENTREG_RACE_FLAGS == WEEKEVENTREG_RACE_FLAG_3) {
- this->rider->unk488 = 7;
+ if (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_3) {
+ this->rider->animIndex2 = ENIN_ANIM2_7;
} else {
EnHorse_SetIngoAnimation(this->animIndex, this->skin.skelAnime.curFrame, this->unk_394 & 1,
- &this->rider->unk488);
+ &this->rider->animIndex2);
}
}
-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.speedXZ * 0.2f * 1.5f);
+ 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);
- this->actor.speedXZ = 8.0f;
- this->skin.skelAnime.playSpeed = this->actor.speedXZ * 0.3f;
+ this->actor.speed = 8.0f;
+ this->skin.skelAnime.playSpeed = this->actor.speed * 0.3f;
} else {
this->actor.world.pos = endPos;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
if (SkelAnime_Update(&this->skin.skelAnime)) {
func_8087C1C0(this);
Rumble_Request(0.0f, 120, 8, 255);
Animation_PlayOnceSetSpeed(&this->skin.skelAnime, sAnimationHeaders[this->type][this->animIndex],
- this->actor.speedXZ * 0.3f);
+ this->actor.speed * 0.3f);
}
}
@@ -2537,32 +2555,32 @@ void EnHorse_CsPlayHighJumpAnim(EnHorse* this, PlayState* play) {
this->stateFlags |= ENHORSE_ANIM_HIGH_JUMP;
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_JUMP);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_JUMP);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_JUMP);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_JUMP);
}
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;
}
curFrame = this->skin.skelAnime.curFrame;
- this->actor.speedXZ = 13.0f;
+ this->actor.speed = 13.0f;
this->stateFlags |= ENHORSE_JUMPING;
if (curFrame > 19.0f) {
@@ -2587,9 +2605,9 @@ void EnHorse_CsJump(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
(this->actor.world.pos.y < ((this->actor.floorHeight - this->actor.velocity.y) + 80.0f)))) {
this->cutsceneFlags |= 1;
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND);
}
Rumble_Request(0.0f, 255, 10, 80);
this->stateFlags &= ~ENHORSE_JUMPING;
@@ -2609,31 +2627,31 @@ 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;
this->stateFlags &= ~ENHORSE_LAND2_SOUND;
if (this->stateFlags & ENHORSE_DRAW) {
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
} else {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
}
}
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 EnHorse_CsRearing(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
- this->actor.speedXZ = 0.0f;
+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)) {
this->stateFlags |= ENHORSE_LAND2_SOUND;
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
}
}
}
@@ -2653,53 +2671,53 @@ 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;
this->cutsceneAction = 4;
Animation_PlayOnceSetSpeed(&this->skin.skelAnime, sAnimationHeaders[this->type][this->animIndex],
- this->actor.speedXZ * 0.3f);
+ 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);
- this->actor.speedXZ = 8.0f;
- this->skin.skelAnime.playSpeed = this->actor.speedXZ * 0.3f;
+ this->actor.speed = 8.0f;
+ this->skin.skelAnime.playSpeed = this->actor.speed * 0.3f;
} else {
this->actor.world.pos = endPos;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
if (SkelAnime_Update(&this->skin.skelAnime)) {
func_8087C1C0(this);
Rumble_Request(0.0f, 120, 8, 255);
Animation_PlayOnceSetSpeed(&this->skin.skelAnime, sAnimationHeaders[this->type][this->animIndex],
- this->actor.speedXZ * 0.3f);
+ this->actor.speed * 0.3f);
}
}
-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;
@@ -2709,24 +2727,24 @@ void EnHorse_CsWarpRearingInit(EnHorse* this, PlayState* play, CsCmdActorAction*
if (this->stateFlags & ENHORSE_DRAW) {
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
} else {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
}
}
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 EnHorse_CsWarpRearing(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
- this->actor.speedXZ = 0.0f;
+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)) {
this->stateFlags |= ENHORSE_LAND2_SOUND;
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
}
}
}
@@ -2750,19 +2768,19 @@ void EnHorse_InitCutscene(EnHorse* this, PlayState* play) {
this->playerControlled = false;
this->action = ENHORSE_ACTION_CS_UPDATE;
this->cutsceneAction = 0;
- this->actor.speedXZ = 0.0f;
+ 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;
}
}
@@ -2771,9 +2789,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;
@@ -2781,23 +2799,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);
}
}
}
@@ -2829,12 +2847,12 @@ s32 EnHorse_UpdateHbaRaceInfo(EnHorse* this, PlayState* play, RaceInfo* raceInfo
}
this->actor.shape.rot.y = this->actor.world.rot.y;
- if ((this->actor.speedXZ < raceInfo->waypoints[this->curRaceWaypoint].speed) && !(this->hbaFlags & 1)) {
- this->actor.speedXZ += 0.4f;
+ if ((this->actor.speed < raceInfo->waypoints[this->curRaceWaypoint].speed) && !(this->hbaFlags & 1)) {
+ this->actor.speed += 0.4f;
} else {
- this->actor.speedXZ -= 0.4f;
- if (this->actor.speedXZ < 0.0f) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed -= 0.4f;
+ if (this->actor.speed < 0.0f) {
+ this->actor.speed = 0.0f;
}
}
return false;
@@ -2845,7 +2863,7 @@ void EnHorse_InitHorsebackArchery(EnHorse* this) {
this->soundTimer = 0;
this->curRaceWaypoint = 0;
this->hbaTimer = 0;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
EnHorse_UpdateHbaAnim(this);
}
@@ -2854,17 +2872,17 @@ void EnHorse_UpdateHbaAnim(EnHorse* this) {
f32 animSpeed;
this->action = ENHORSE_ACTION_HBA;
- if (this->actor.speedXZ == 0.0f) {
+ if (this->actor.speed == 0.0f) {
if (this->animIndex != ENHORSE_ANIM_IDLE) {
animChanged = true;
}
this->animIndex = ENHORSE_ANIM_IDLE;
- } else if (this->actor.speedXZ <= 3.0f) {
+ } else if (this->actor.speed <= 3.0f) {
if (this->animIndex != ENHORSE_ANIM_WALK) {
animChanged = true;
}
this->animIndex = ENHORSE_ANIM_WALK;
- } else if (this->actor.speedXZ <= 6.0f) {
+ } else if (this->actor.speed <= 6.0f) {
if (this->animIndex != ENHORSE_ANIM_TROT) {
animChanged = true;
}
@@ -2877,21 +2895,21 @@ void EnHorse_UpdateHbaAnim(EnHorse* this) {
}
if (this->animIndex == ENHORSE_ANIM_WALK) {
- animSpeed = this->actor.speedXZ * 0.5f;
+ animSpeed = this->actor.speed * 0.5f;
} else if (this->animIndex == ENHORSE_ANIM_TROT) {
- animSpeed = this->actor.speedXZ * 0.25f;
+ animSpeed = this->actor.speed * 0.25f;
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
}
Rumble_Request(0.0f, 60, 8, 255);
} else if (this->animIndex == ENHORSE_ANIM_GALLOP) {
- animSpeed = this->actor.speedXZ * 0.2f;
+ animSpeed = this->actor.speed * 0.2f;
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
}
Rumble_Request(0.0f, 120, 8, 255);
} else {
@@ -2926,7 +2944,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;
}
@@ -2935,29 +2953,29 @@ void EnHorse_UpdateHorsebackArchery(EnHorse* this, PlayState* play) {
if (((play->interfaceCtx.minigameAmmo == 0) || (this->hbaFlags & 2)) && (this->hbaFlags & 4)) {
this->hbaFlags &= ~4;
- Audio_QueueSeqCmd(0x8041);
+ SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_HORSE_GOAL | SEQ_FLAG_ASYNC);
}
if (this->hbaStarted == 0) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->animIndex != ENHORSE_ANIM_IDLE) {
EnHorse_UpdateHbaAnim(this);
}
}
if (this->animIndex == ENHORSE_ANIM_WALK) {
- playSpeed = this->actor.speedXZ * 0.5f;
+ playSpeed = this->actor.speed * 0.5f;
} else if (this->animIndex == ENHORSE_ANIM_TROT) {
- playSpeed = this->actor.speedXZ * 0.25f;
+ playSpeed = this->actor.speed * 0.25f;
} else if (this->animIndex == ENHORSE_ANIM_GALLOP) {
- playSpeed = this->actor.speedXZ * 0.2f;
+ playSpeed = this->actor.speed * 0.2f;
} else {
playSpeed = 1.0f;
}
this->skin.skelAnime.playSpeed = playSpeed;
if (SkelAnime_Update(&this->skin.skelAnime) ||
- ((this->animIndex == ENHORSE_ANIM_IDLE) && (this->actor.speedXZ != 0.0f))) {
+ ((this->animIndex == ENHORSE_ANIM_IDLE) && (this->actor.speed != 0.0f))) {
EnHorse_UpdateHbaAnim(this);
}
}
@@ -2968,15 +2986,15 @@ void EnHorse_FleePlayer(EnHorse* this, PlayState* play) {
f32 playerDistToHome;
f32 distToPlayer;
s32 nextAnimIndex = this->animIndex;
- s32 animFinished;
+ s32 isAnimFinished;
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);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_NEIGH);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_NEIGH);
}
}
@@ -2986,36 +3004,36 @@ void EnHorse_FleePlayer(EnHorse* this, PlayState* play) {
if (playerDistToHome > 300.0f) {
if (distToHome > 150.0f) {
- this->actor.speedXZ += 0.4f;
- if (this->actor.speedXZ > 8.0f) {
- this->actor.speedXZ = 8.0f;
+ this->actor.speed += 0.4f;
+ if (this->actor.speed > 8.0f) {
+ this->actor.speed = 8.0f;
}
} else {
- this->actor.speedXZ -= 0.5f;
- if (this->actor.speedXZ < 0.0f) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed -= 0.5f;
+ if (this->actor.speed < 0.0f) {
+ this->actor.speed = 0.0f;
}
}
} else if (distToPlayer < 300.0f) {
- this->actor.speedXZ += 0.4f;
- if (this->actor.speedXZ > 8.0f) {
- this->actor.speedXZ = 8.0f;
+ this->actor.speed += 0.4f;
+ if (this->actor.speed > 8.0f) {
+ this->actor.speed = 8.0f;
}
} else {
- this->actor.speedXZ -= 0.5f;
- if (this->actor.speedXZ < 0.0f) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed -= 0.5f;
+ if (this->actor.speed < 0.0f) {
+ this->actor.speed = 0.0f;
}
}
- if (this->actor.speedXZ >= 6.0f) {
- this->skin.skelAnime.playSpeed = this->actor.speedXZ * 0.3f;
+ if (this->actor.speed >= 6.0f) {
+ this->skin.skelAnime.playSpeed = this->actor.speed * 0.3f;
nextAnimIndex = ENHORSE_ANIM_GALLOP;
- } else if (this->actor.speedXZ >= 3.0f) {
- this->skin.skelAnime.playSpeed = this->actor.speedXZ * 0.375f;
+ } else if (this->actor.speed >= 3.0f) {
+ this->skin.skelAnime.playSpeed = this->actor.speed * 0.375f;
nextAnimIndex = ENHORSE_ANIM_TROT;
- } else if (this->actor.speedXZ > 0.1f) {
- this->skin.skelAnime.playSpeed = this->actor.speedXZ * 0.75f;
+ } else if (this->actor.speed > 0.1f) {
+ this->skin.skelAnime.playSpeed = this->actor.speed * 0.75f;
nextAnimIndex = ENHORSE_ANIM_WALK;
EnHorse_PlayWalkingSound(this);
} else {
@@ -3032,7 +3050,7 @@ void EnHorse_FleePlayer(EnHorse* this, PlayState* play) {
(nextAnimIndex == ENHORSE_ANIM_WALK)) {
if (playerDistToHome < 300.0f) {
yaw = player->actor.shape.rot.y;
- yaw += ((Actor_YawBetweenActors(&this->actor, &player->actor) > 0) ? 1 : -1) * 0x3FFF;
+ yaw += ((Actor_WorldYawTowardActor(&this->actor, &player->actor) > 0) ? 1 : -1) * 0x3FFF;
} else {
yaw = Math_Vec3f_Yaw(&this->actor.world.pos, &this->actor.home.pos) - this->actor.world.rot.y;
}
@@ -3047,7 +3065,7 @@ void EnHorse_FleePlayer(EnHorse* this, PlayState* play) {
this->actor.shape.rot.y = this->actor.world.rot.y;
}
- animFinished = SkelAnime_Update(&this->skin.skelAnime);
+ isAnimFinished = SkelAnime_Update(&this->skin.skelAnime);
if (((this->animIndex == ENHORSE_ANIM_IDLE) || (this->animIndex == ENHORSE_ANIM_WHINNY)) &&
((nextAnimIndex == ENHORSE_ANIM_GALLOP) || (nextAnimIndex == ENHORSE_ANIM_TROT) ||
@@ -3060,7 +3078,7 @@ void EnHorse_FleePlayer(EnHorse* this, PlayState* play) {
} else if (this->animIndex == ENHORSE_ANIM_TROT) {
func_8087C178(this);
}
- } else if (animFinished) {
+ } else if (isAnimFinished) {
if (nextAnimIndex == ENHORSE_ANIM_GALLOP) {
func_8087C1C0(this);
} else if (nextAnimIndex == ENHORSE_ANIM_TROT) {
@@ -3081,9 +3099,9 @@ void EnHorse_FleePlayer(EnHorse* this, PlayState* play) {
this->animIndex = ENHORSE_ANIM_WHINNY;
if (this->stateFlags & ENHORSE_DRAW) {
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_GROAN);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_KID_HORSE_GROAN);
} else {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_GROAN);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_HORSE_GROAN);
}
}
}
@@ -3109,28 +3127,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;
@@ -3139,74 +3157,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);
+ Audio_PlaySfx_AtPos(&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);
+ Audio_PlaySfx_AtPos(&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);
@@ -3214,36 +3232,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);
+ Audio_PlaySfx_AtPos(&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);
@@ -3251,17 +3269,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);
@@ -3272,48 +3290,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->actor.speedXZ = 0.0f;
+ 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,9 +3347,9 @@ void func_808848C8(EnHorse* this, PlayState* play) {
Vec3f sp24 = { -1916.0f, -106.0f, -523.0f };
EnHorse_PlayWalkingSound(this);
- this->actor.speedXZ = 4.0f;
- func_800F415C(&this->actor, &sp24, 2000);
- this->skin.skelAnime.playSpeed = this->actor.speedXZ * 0.75f;
+ this->actor.speed = 4.0f;
+ 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) {
this->stateFlags &= ~ENHORSE_UNRIDEABLE;
@@ -3383,12 +3401,12 @@ void func_80884A40(EnHorse* this, PlayState* play) {
}
if ((this->unk_538 == OBJ_UM_ANIM_TROT) || (this->unk_538 == OBJ_UM_ANIM_GALLOP)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_HORSE_RUN);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_HORSE_RUN);
} else if (this->unk_538 == OBJ_UM_ANIM_IDLE) {
if (this->animIndex == ENHORSE_ANIM_IDLE) {
EnHorse_IdleAnimSounds(this, play);
} else if (this->animIndex == ENHORSE_ANIM_WHINNY) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_HORSE_GROAN);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_HORSE_GROAN);
}
}
}
@@ -3397,12 +3415,12 @@ void func_80884A40(EnHorse* this, PlayState* play) {
void func_80884D04(EnHorse* this, PlayState* play) {
f32 playSpeed;
- this->actor.speedXZ = 10.0f;
+ this->actor.speed = 10.0f;
this->action = ENHORSE_ACTION_25;
this->unk_540 = this->actor.world.pos;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_INGO_HORSE_NEIGH);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_INGO_HORSE_NEIGH);
this->animIndex = ENHORSE_ANIM_GALLOP;
- playSpeed = this->actor.speedXZ * 0.2f;
+ playSpeed = this->actor.speed * 0.2f;
Animation_Change(&this->skin.skelAnime, sAnimationHeaders[this->type][this->animIndex],
sPlaybackSpeeds[this->animIndex] * playSpeed * 2.5f, 0.0f,
Animation_GetLastFrame(sAnimationHeaders[this->type][this->animIndex]), ANIMMODE_ONCE, 0.0f);
@@ -3420,7 +3438,7 @@ void func_80884E0C(EnHorse* this, PlayState* play) {
Animation_Change(&this->skin.skelAnime, sAnimationHeaders[this->type][this->animIndex],
sPlaybackSpeeds[this->animIndex] * playSpeed * 2.5f, 0.0f,
Animation_GetLastFrame(sAnimationHeaders[this->type][this->animIndex]), ANIMMODE_ONCE, 0.0f);
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
}
this->unk_57C = this->actor.world.pos;
@@ -3429,10 +3447,10 @@ void func_80884E0C(EnHorse* this, PlayState* play) {
this->unk_56C = Math3D_Distance(&this->actor.world.pos, &this->actor.prevPos);
if (((this->unk_550 == 5) || (this->unk_550 == 7)) && (Player_GetMask(play) != PLAYER_MASK_CIRCUS_LEADER)) {
- this->rider->unk488 = 7;
+ this->rider->animIndex2 = ENIN_ANIM2_7;
} else {
EnHorse_SetIngoAnimation(this->animIndex, this->skin.skelAnime.curFrame, this->unk_394 & 1,
- &this->rider->unk488);
+ &this->rider->animIndex2);
}
pos = this->actor.world.pos;
@@ -3473,7 +3491,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
}
@@ -3493,19 +3511,19 @@ void EnHorse_ObstructMovement(EnHorse* this, PlayState* play, s32 obstacleType,
if ((this->action == ENHORSE_ACTION_5) || (this->action == ENHORSE_ACTION_6)) {
this->actor.world.pos = this->actor.prevPos;
this->actor.world.rot.y -= 0x640;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.shape.rot.y = this->actor.world.rot.y;
this->unk_1EC |= 4;
} else if (this->action == ENHORSE_ACTION_25) {
this->unk_1EC |= 0x80;
this->actor.world.pos = this->actor.prevPos;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
} else if ((play->sceneId != SCENE_KOEPONARACE) || (this->unk_1EC & 2)) {
this->unk_1EC &= ~2;
this->actor.world.pos = this->lastPos;
this->stateFlags |= ENHORSE_OBSTACLE;
if (this->playerControlled == 0) {
- if (this->animIndex != 3) {}
+ if (this->animIndex != ENHORSE_ANIM_REARING) {}
} else if (this->action != ENHORSE_ACTION_MOUNTED_REARING) {
if (this->stateFlags & ENHORSE_JUMPING) {
this->stateFlags &= ~ENHORSE_JUMPING;
@@ -3539,7 +3557,7 @@ void EnHorse_CheckFloors(EnHorse* this, PlayState* play) {
f32 nx;
f32 ny;
f32 nz;
- s32 galloping = this->actor.speedXZ > 8.0f;
+ s32 galloping = this->actor.speed > 8.0f;
s32 status;
f32 waterHeight;
WaterBox* waterbox;
@@ -3600,7 +3618,7 @@ void EnHorse_CheckFloors(EnHorse* this, PlayState* play) {
pos.y = this->yFront;
dist = Math3D_DistPlaneToPos(nx, ny, nz, this->actor.floorPoly->dist, &pos);
- if ((frontFloor != this->actor.floorPoly) && (this->actor.speedXZ >= 0.0f) &&
+ if ((frontFloor != this->actor.floorPoly) && (this->actor.speed >= 0.0f) &&
((!(this->stateFlags & ENHORSE_JUMPING) && (dist < -40.0f)) ||
((this->stateFlags & ENHORSE_JUMPING) && (dist < -200.0f)))) {
EnHorse_ObstructMovement(this, play, 4, galloping);
@@ -3611,7 +3629,7 @@ void EnHorse_CheckFloors(EnHorse* this, PlayState* play) {
pos.y = this->yBack;
dist = Math3D_DistPlaneToPos(nx, ny, nz, this->actor.floorPoly->dist, &pos);
- if ((backFloor != this->actor.floorPoly) && (this->actor.speedXZ <= 0.0f) &&
+ if ((backFloor != this->actor.floorPoly) && (this->actor.speed <= 0.0f) &&
((!(this->stateFlags & ENHORSE_JUMPING) && (dist < -40.0f)) ||
((this->stateFlags & ENHORSE_JUMPING) && (dist < -200.0f)))) {
EnHorse_ObstructMovement(this, play, 5, galloping);
@@ -3620,8 +3638,8 @@ 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)) {
- if (this->actor.speedXZ >= 0.0f) {
+ (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 {
EnHorse_ObstructMovement(this, play, 5, galloping);
@@ -3740,18 +3758,22 @@ 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 & 8) && (Math_CosS(this->actor.wallYaw - this->actor.world.rot.y) < -0.3f)) {
- if (this->actor.speedXZ > 4.0f) {
- this->actor.speedXZ -= 1.0f;
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) &&
+ (Math_CosS(this->actor.wallYaw - this->actor.world.rot.y) < -0.3f)) {
+ if (this->actor.speed > 4.0f) {
+ this->actor.speed -= 1.0f;
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST);
}
}
}
@@ -3763,12 +3785,12 @@ void EnHorse_UpdateBgCheckInfo(EnHorse* this, PlayState* play) {
((horseJump->actor.params & 0xFF) == 5)) {
this->stateFlags |= ENHORSE_FLAG_28;
this->unk_3E8 += ((-10.0f / this->actor.scale.y) - this->unk_3E8) * 0.5f;
- if (this->actor.speedXZ > 2.0f) {
- this->actor.speedXZ -= 1.0f;
+ if (this->actor.speed > 2.0f) {
+ this->actor.speed -= 1.0f;
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST);
}
}
} else {
@@ -3777,13 +3799,13 @@ void EnHorse_UpdateBgCheckInfo(EnHorse* this, PlayState* play) {
}
}
- if ((this->stateFlags & ENHORSE_JUMPING) || (this->stateFlags & ENHORSE_FLAG_28) || (this->actor.speedXZ < 0.0f) ||
+ if ((this->stateFlags & ENHORSE_JUMPING) || (this->stateFlags & ENHORSE_FLAG_28) || (this->actor.speed < 0.0f) ||
(this->action == ENHORSE_ACTION_STOPPING) || (this->action == ENHORSE_ACTION_MOUNTED_REARING)) {
return;
}
- if (this->actor.speedXZ > 8.0f) {
- if (this->actor.speedXZ < 12.8f) {
+ if (this->actor.speed > 8.0f) {
+ if (this->actor.speed < 12.8f) {
intersectDist = 160.0f;
movingFast = false;
} else {
@@ -3888,7 +3910,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 +3973,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;
@@ -3973,9 +3995,9 @@ void EnHorse_UpdateBgCheckInfo(EnHorse* this, PlayState* play) {
EnHorse_Stub1(this);
this->postDrawFunc = EnHorse_LowJumpInit;
} else if ((movingFast == true) &&
- (((this->actor.speedXZ < 13.8f) && ((19.0f * temp_f0) < obstacleHeight) &&
+ (((this->actor.speed < 13.8f) && ((19.0f * temp_f0) < obstacleHeight) &&
(obstacleHeight <= (72.0f * temp_f0))) ||
- ((this->actor.speedXZ > 13.8f) && (obstacleHeight <= (112.0f * temp_f0))))) {
+ ((this->actor.speed > 13.8f) && (obstacleHeight <= (112.0f * temp_f0))))) {
EnHorse_Stub2(this);
this->postDrawFunc = EnHorse_HighJumpInit;
}
@@ -4018,9 +4040,9 @@ void func_80886C00(EnHorse* this, PlayState* play) {
}
} else if ((this->stateFlags & ENHORSE_DRAW) && (Rand_ZeroOne() < 0.1f)) {
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
} else {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
}
}
}
@@ -4034,7 +4056,7 @@ void EnHorse_RegenBoost(EnHorse* this, PlayState* play) {
this->numBoosts++;
if (!EN_HORSE_CHECK_4(this)) {
- play_sound(NA_SE_SY_CARROT_RECOVER);
+ Audio_PlaySfx(NA_SE_SY_CARROT_RECOVER);
}
if (this->numBoosts < 6) {
@@ -4049,7 +4071,7 @@ void EnHorse_RegenBoost(EnHorse* this, PlayState* play) {
this->numBoosts = 6;
if (!EN_HORSE_CHECK_4(this)) {
- play_sound(NA_SE_SY_CARROT_RECOVER);
+ Audio_PlaySfx(NA_SE_SY_CARROT_RECOVER);
}
}
}
@@ -4057,9 +4079,9 @@ void EnHorse_RegenBoost(EnHorse* this, PlayState* play) {
if (this->boostTimer == 8) {
if ((Rand_ZeroOne() < 0.25f) && (this->stateFlags & ENHORSE_DRAW)) {
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
} else {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
}
}
}
@@ -4069,7 +4091,7 @@ void EnHorse_RegenBoost(EnHorse* this, PlayState* play) {
void EnHorse_UpdatePlayerDir(EnHorse* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- s16 angle = Actor_YawBetweenActors(&this->actor, &player->actor) - this->actor.world.rot.y;
+ s16 angle = Actor_WorldYawTowardActor(&this->actor, &player->actor) - this->actor.world.rot.y;
f32 s = Math_SinS(angle);
f32 c = Math_CosS(angle);
@@ -4096,7 +4118,7 @@ void EnHorse_TiltBody(EnHorse* this, PlayState* play) {
s32 targetRoll;
s16 turnVel;
- speed = this->actor.speedXZ / this->boostSpeed;
+ speed = this->actor.speed / this->boostSpeed;
turnVel = this->actor.shape.rot.y - this->lastYaw;
targetRoll = -((s16)((2730.0f * speed) * (turnVel / 960.00006f)));
rollDiff = targetRoll - this->actor.world.rot.z;
@@ -4119,12 +4141,13 @@ 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;
}
conveyorDir = SurfaceType_GetConveyorDirection(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
- conveyorDir = (conveyorDir * 0x400) - this->actor.world.rot.y;
+ conveyorDir = CONVEYOR_DIRECTION_TO_BINANG(conveyorDir) - this->actor.world.rot.y;
if (conveyorDir > 0x640) {
this->actor.world.rot.y += 0x640;
} else if (conveyorDir < -0x640) {
@@ -4223,8 +4246,8 @@ void EnHorse_Update(Actor* thisx, PlayState* play2) {
EnHorse_RegenBoost(this, play);
}
- if (ActorCutscene_GetCurrentIndex() != -1) {
- thisx->speedXZ = 0.0f;
+ if (CutsceneManager_GetCurrentCsId() != CS_ID_NONE) {
+ thisx->speed = 0.0f;
}
if (this->action != ENHORSE_ACTION_25) {
@@ -4252,16 +4275,16 @@ void EnHorse_Update(Actor* thisx, PlayState* play2) {
}
if (this->colliderJntSph.elements->info.ocElemFlags & OCELEM_HIT) {
- if (thisx->speedXZ > 10.0f) {
- thisx->speedXZ -= 1.0f;
+ if (thisx->speed > 10.0f) {
+ thisx->speed -= 1.0f;
}
}
if ((this->colliderJntSph.base.acFlags & AC_HIT) && (this->stateFlags & ENHORSE_DRAW)) {
if (this->type == HORSE_TYPE_2) {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
} else {
- Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
}
}
@@ -4351,13 +4374,13 @@ void EnHorse_Update(Actor* thisx, PlayState* play2) {
}
}
- if ((thisx->speedXZ == 0.0f) && !(this->stateFlags & ENHORSE_FLAG_19)) {
+ if ((thisx->speed == 0.0f) && !(this->stateFlags & ENHORSE_FLAG_19)) {
thisx->colChkInfo.mass = MASS_IMMOVABLE;
} else {
thisx->colChkInfo.mass = MASS_HEAVY;
}
- if (thisx->speedXZ >= 5.0f) {
+ if (thisx->speed >= 5.0f) {
this->colliderCylinder1.base.atFlags |= AT_ON;
} else {
this->colliderCylinder1.base.atFlags &= ~AT_ON;
@@ -4399,7 +4422,7 @@ s32 EnHorse_PlayerDirToMountSide(EnHorse* this, PlayState* play, Player* player)
s32 EnHorse_MountSideCheck(EnHorse* this, PlayState* play, Player* player) {
s32 mountSide;
- if (Actor_XZDistanceBetweenActors(&this->actor, &player->actor) > 75.0f) {
+ if (Actor_WorldDistXZToActor(&this->actor, &player->actor) > 75.0f) {
return 0;
}
@@ -4407,7 +4430,7 @@ s32 EnHorse_MountSideCheck(EnHorse* this, PlayState* play, Player* player) {
return 0;
}
- if (Math_CosS(Actor_YawBetweenActors(&player->actor, &this->actor) - player->actor.world.rot.y) <
+ if (Math_CosS(Actor_WorldYawTowardActor(&player->actor, &this->actor) - player->actor.world.rot.y) <
0.17364818f) { // cos(80 degrees)
return 0;
}
@@ -4639,9 +4662,9 @@ void EnHorse_PostDraw(Actor* thisx, PlayState* play, Skin* skin) {
s32 EnHorse_OverrideLimbDraw(Actor* thisx, PlayState* play, s32 limbIndex, Skin* skin) {
static TexturePtr D_80889204[] = {
- object_horse_link_child_Tex_001D28,
- object_horse_link_child_Tex_001928,
- object_horse_link_child_Tex_001B28,
+ gEponaEyeOpenTex,
+ gEponaEyeHalfTex,
+ gEponaEyeClosedTex,
};
static u8 D_80889210[] = { 0, 1, 2, 1 };
EnHorse* this = THIS;
@@ -4678,7 +4701,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..f3c868c85 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,12 +84,26 @@ 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,
+ /* 9 */ ENHORSE_ANIM_MAX
+} EnHorseAnimation;
+
+typedef enum HorseType {
/* 0 */ HORSE_TYPE_EPONA,
/* 1 */ HORSE_TYPE_HNI,
/* 2 */ HORSE_TYPE_2,
/* 3 */ HORSE_TYPE_BANDIT,
- /* 4 */ HORSE_TYPE_DONKEY // Cremia's donkey
+ /* 4 */ HORSE_TYPE_DONKEY, // Cremia's donkey
+ /* 5 */ HORSE_TYPE_MAX
} HorseType;
#define ENHORSE_PARAM_BANDIT 0x2000
@@ -100,7 +114,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 +135,7 @@ typedef enum {
/* 17 */ ENHORSE_17,
/* 18 */ ENHORSE_18,
/* 19 */ ENHORSE_19,
- /* 20 */ ENHORSE_20,
+ /* 20 */ ENHORSE_20
} EnHorseParam;
/**
@@ -190,15 +204,15 @@ 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;
- /* 0x3EE */ Vec3s jointTable[OBJECT_HA_1_LIMB_MAX];
- /* 0x48A */ Vec3s morphTable[OBJECT_HA_1_LIMB_MAX];
+ /* 0x3EE */ Vec3s jointTable[HORSE_BANDIT_LIMB_MAX];
+ /* 0x48A */ Vec3s morphTable[HORSE_BANDIT_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 e650ef6d3..7fbd43a54 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,7 +5,9 @@
*/
#include "z_en_horse_game_check.h"
+#include "z64horse.h"
#include "objects/object_horse_game_check/object_horse_game_check.h"
+#include "debug.h"
#define FLAGS (ACTOR_FLAG_10)
@@ -59,7 +61,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 +118,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;
}
@@ -127,13 +129,13 @@ s32 func_808F8CCC(EnHorseGameCheck* this, PlayState* play2) {
this->horse1 = (EnHorse*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, -1149.0f, -106.0f, 470.0f, 0, 0x7FFF, 0,
ENHORSE_PARAMS(ENHORSE_PARAM_BANDIT, ENHORSE_4));
if (this->horse1 == NULL) {
- __assert("../z_en_horse_game_check.c", 1517);
+ _dbg_hungup("../z_en_horse_game_check.c", 1517);
}
this->horse2 = (EnHorse*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, -1376.0f, -106.0f, 470.0f, 0, 0x7FFF, 0,
ENHORSE_PARAMS(ENHORSE_PARAM_BANDIT, ENHORSE_5));
if (this->horse2 == NULL) {
- __assert("../z_en_horse_game_check.c", 1526);
+ _dbg_hungup("../z_en_horse_game_check.c", 1526);
}
this->unk_17C = -1;
@@ -156,21 +158,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;
@@ -248,11 +250,11 @@ s32 func_808F8FAC(EnHorseGameCheck* this, PlayState* play) {
}
if (gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] >= SECONDS_TO_TIMER(180)) {
- Audio_QueueSeqCmd(0x8041);
- play_sound(NA_SE_SY_START_SHOT);
+ SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_HORSE_GOAL | SEQ_FLAG_ASYNC);
+ Audio_PlaySfx(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;
}
@@ -281,11 +283,11 @@ s32 func_808F8FAC(EnHorseGameCheck* this, PlayState* play) {
if ((this->unk_164 & 0x4000) && (horseGameCheck != NULL) &&
(horseGameCheck->dyna.actor.id == ACTOR_EN_HORSE_GAME_CHECK) &&
(horseGameCheck->unk_15C == ENHORSEGAMECHECK_FF_7) && !(this->unk_164 & 0x40000)) {
- Audio_QueueSeqCmd(0x8041);
- play_sound(NA_SE_SY_START_SHOT);
+ SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_HORSE_GOAL | SEQ_FLAG_ASYNC);
+ Audio_PlaySfx(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;
}
@@ -314,11 +316,11 @@ s32 func_808F8FAC(EnHorseGameCheck* this, PlayState* play) {
if ((this->unk_164 & 0x200000) && (horseGameCheck != NULL) &&
(horseGameCheck->dyna.actor.id == ACTOR_EN_HORSE_GAME_CHECK) &&
(horseGameCheck->unk_15C == ENHORSEGAMECHECK_FF_7) && !(this->unk_164 & 0x02000000)) {
- Audio_QueueSeqCmd(0x8041);
- play_sound(NA_SE_SY_START_SHOT);
+ SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_HORSE_GOAL | SEQ_FLAG_ASYNC);
+ Audio_PlaySfx(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;
}
@@ -343,11 +345,11 @@ s32 func_808F8FAC(EnHorseGameCheck* this, PlayState* play) {
if ((this->unk_164 & 0x80) && (horseGameCheck != NULL) &&
(horseGameCheck->dyna.actor.id == ACTOR_EN_HORSE_GAME_CHECK) &&
(horseGameCheck->unk_15C == ENHORSEGAMECHECK_FF_7) && !(this->unk_164 & 0x800)) {
- Audio_QueueSeqCmd(0x8041);
- play_sound(NA_SE_SY_START_SHOT);
+ SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_HORSE_GOAL | SEQ_FLAG_ASYNC);
+ Audio_PlaySfx(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 a10504720..78d6f8624 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
@@ -1,10 +1,12 @@
/*
* File: z_en_horse_link_child.c
* Overlay: ovl_En_Horse_Link_Child
- * Description: Child Epona
+ * Description: Child Epona from OoT, when player learns Epona's song
+ * (Unused in MM and broken)
*/
#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)
@@ -16,15 +18,17 @@ void EnHorseLinkChild_Destroy(Actor* thisx, PlayState* play);
void EnHorseLinkChild_Update(Actor* thisx, PlayState* play);
void EnHorseLinkChild_Draw(Actor* thisx, PlayState* play);
-void func_808DEA0C(EnHorseLinkChild* this, PlayState* play);
-void func_808DEB14(EnHorseLinkChild* this, PlayState* play);
-void func_808DECA0(EnHorseLinkChild* this);
-void func_808DED40(EnHorseLinkChild* this, PlayState* play);
-void func_808DEFE8(EnHorseLinkChild* this);
-void func_808DF194(EnHorseLinkChild* this, PlayState* play);
-void func_808DF620(EnHorseLinkChild* this, PlayState* play);
-void func_808DF788(EnHorseLinkChild* this);
-void func_808DF838(EnHorseLinkChild* this, PlayState* play);
+void EnHorseLinkChild_ActionFunc0(EnHorseLinkChild* this, PlayState* play);
+void EnHorseLinkChild_SetupWaitForPlayer(EnHorseLinkChild* this, s32 animIndex);
+void EnHorseLinkChild_WaitForPlayer(EnHorseLinkChild* this, PlayState* play);
+void EnHorseLinkChild_SetupGreetPlayer(EnHorseLinkChild* this);
+void EnHorseLinkChild_GreetPlayer(EnHorseLinkChild* this, PlayState* play);
+void EnHorseLinkChild_SetupLonLonIdle(EnHorseLinkChild* this);
+void EnHorseLinkChild_LonLonIdle(EnHorseLinkChild* this, PlayState* play);
+void EnHorseLinkChild_SetupActionFunc5(EnHorseLinkChild* this);
+void EnHorseLinkChild_ActionFunc5(EnHorseLinkChild* this, PlayState* play);
+void EnHorseLinkChild_SetupActionFunc4(EnHorseLinkChild* this);
+void EnHorseLinkChild_ActionFunc4(EnHorseLinkChild* this, PlayState* play);
ActorInit En_Horse_Link_Child_InitVars = {
ACTOR_EN_HORSE_LINK_CHILD,
@@ -38,10 +42,22 @@ ActorInit En_Horse_Link_Child_InitVars = {
(ActorFunc)EnHorseLinkChild_Draw,
};
-AnimationHeader* D_808DFEC0[] = { &object_horse_link_child_Anim_006D44, &object_horse_link_child_Anim_007468 };
+typedef enum {
+ /* 0 */ OOT_CHILD_EPONA_ANIM_IDLE, // head down + pawing
+ /* 1 */ OOT_CHILD_EPONA_ANIM_WHINNY, // head shake
+ /* 2 */ OOT_CHILD_EPONA_ANIM_WALK, // slow
+ /* 3 */ OOT_CHILD_EPONA_ANIM_TROT, // mid
+ /* 4 */ OOT_CHILD_EPONA_ANIM_GALLOP, // fast
+ /* 5 */ OOT_CHILD_EPONA_ANIM_MAX
+} OoTEponaAnimation;
-AnimationHeader* D_808DFEC8[] = { &object_horse_link_child_Anim_007D50, &object_horse_link_child_Anim_0043AC,
- &object_horse_link_child_Anim_002F98 };
+static AnimationHeader* sAnimations[OOT_CHILD_EPONA_ANIM_MAX] = {
+ &gEponaIdleAnim, // OOT_CHILD_EPONA_ANIM_IDLE
+ &gEponaWhinnyAnim, // OOT_CHILD_EPONA_ANIM_WHINNY
+ &gEponaWalkAnim, // OOT_CHILD_EPONA_ANIM_WALK
+ &gEponaTrotAnim, // OOT_CHILD_EPONA_ANIM_TROT
+ &gEponaGallopAnim, // OOT_CHILD_EPONA_ANIM_GALLOP
+};
static ColliderJntSphElementInit sJntSphElementsInit[] = {
{
@@ -72,96 +88,123 @@ static ColliderJntSphInit sJntSphInit = {
static CollisionCheckInfoInit sColChkInfoInit = { 10, 35, 100, MASS_HEAVY };
-s32 D_808DFF10[] = { 1, 19 };
+// the animation frames that should have sfx
+static s32 sAnimSoundFrames[] = { 1, 19 };
-f32 D_808DFF18[] = { 1.0f, 1.0f, 1.5f, 1.5f, 1.5f };
+static f32 sAnimPlaySpeeds[OOT_CHILD_EPONA_ANIM_MAX] = {
+ 1.0f, // OOT_CHILD_EPONA_ANIM_IDLE
+ 1.0f, // OOT_CHILD_EPONA_ANIM_WHINNY
+ 1.5f, // OOT_CHILD_EPONA_ANIM_WALK
+ 1.5f, // OOT_CHILD_EPONA_ANIM_TROT
+ 1.5f // OOT_CHILD_EPONA_ANIM_GALLOP
+};
static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneScale, 1200, ICHAIN_STOP),
};
-EnHorseLinkChildUnkFunc D_808DFF30[] = {
- func_808DEA0C, func_808DED40, func_808DEB14, func_808DF194, func_808DF838, func_808DF620,
+typedef enum {
+ /* 0 */ OOT_CHILD_EPONA_ACTION_0, // unfinished
+ /* 1 */ OOT_CHILD_EPONA_ACTION_GREET_PLAYER, // approaching
+ /* 2 */ OOT_CHILD_EPONA_ACTION_WAIT_FOR_PLAYER,
+ /* 3 */ OOT_CHILD_EPONA_ACTION_LONLON_IDLE,
+ /* 4 */ OOT_CHILD_EPONA_ACTION_4,
+ /* 5 */ OOT_CHILD_EPONA_ACTION_5,
+ /* 6 */ OOT_CHILD_EPONA_ACTION_MAX
+} OoTEponaAction;
+
+static EnHorseLinkChildActionFunc sActionFuncs[] = {
+ EnHorseLinkChild_ActionFunc0, // OOT_CHILD_EPONA_ACTION_0
+ EnHorseLinkChild_GreetPlayer, // OOT_CHILD_EPONA_ACTION_GREET_PLAYER
+ EnHorseLinkChild_WaitForPlayer, // OOT_CHILD_EPONA_ACTION_WAIT_FOR_PLAYER
+ EnHorseLinkChild_LonLonIdle, // OOT_CHILD_EPONA_ACTION_LONLON_IDLE
+ EnHorseLinkChild_ActionFunc4, // OOT_CHILD_EPONA_ACTION_4
+ EnHorseLinkChild_ActionFunc5, // OOT_CHILD_EPONA_ACTION_5
};
-TexturePtr D_808DFF48[] = { object_horse_link_child_Tex_001D28, object_horse_link_child_Tex_001928,
- object_horse_link_child_Tex_001B28 };
+static TexturePtr sEyeTextures[] = { gEponaEyeOpenTex, gEponaEyeHalfTex, gEponaEyeClosedTex };
-s8 D_808DFF54[] = { 0, 1, 2, 1 };
+s8 sEyeTextureIndexOverride[] = { 0, 1, 2, 1 };
-void func_808DE5C0(EnHorseLinkChild* this) {
- if ((D_808DFF10[this->unk_1E8] < this->skin.skelAnime.curFrame) &&
- ((this->unk_1E8 != 0) || !(D_808DFF10[1] < this->skin.skelAnime.curFrame))) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_WALK);
- this->unk_1E8++;
- if (this->unk_1E8 >= 2) {
- this->unk_1E8 = 0;
+// This plays the walking/gallop sfx, which needs to be timed based on horse speed,
+// this is only used for animation OOT_CHILD_EPONA_ANIM_WALK
+void EnHorseLinkChild_PlayWalkingSound(EnHorseLinkChild* this) {
+ if ((sAnimSoundFrames[this->footstepCounter] < this->skin.skelAnime.curFrame) &&
+ ((this->footstepCounter != 0) || !(sAnimSoundFrames[1] < this->skin.skelAnime.curFrame))) {
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_WALK);
+
+ this->footstepCounter++;
+ if (this->footstepCounter >= 2) {
+ this->footstepCounter = 0;
}
}
}
-void func_808DE660(EnHorseLinkChild* this) {
- if (this->unk_148 == 2) {
- func_808DE5C0(this);
+void EnHorseLinkChild_PlaySound(EnHorseLinkChild* this) {
+ if (this->animIndex == OOT_CHILD_EPONA_ANIM_WALK) {
+ EnHorseLinkChild_PlayWalkingSound(this);
} else if (this->skin.skelAnime.curFrame == 0.0f) {
- if ((this->unk_148 == 3) || (this->unk_148 == 4)) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
- } else if (this->unk_148 == 1) {
+ if ((this->animIndex == OOT_CHILD_EPONA_ANIM_TROT) || (this->animIndex == OOT_CHILD_EPONA_ANIM_GALLOP)) {
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
+ } else if (this->animIndex == OOT_CHILD_EPONA_ANIM_WHINNY) {
if (Rand_ZeroOne() > 0.5f) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_GROAN);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_GROAN);
} else {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_NEIGH);
}
}
}
}
-f32 func_808DE728(EnHorseLinkChild* this) {
- f32 phi_fv1;
+f32 EnHorseLinkChild_GetAnimSpeed(EnHorseLinkChild* this) {
+ f32 animSpeed;
- if (this->unk_148 == 2) {
- phi_fv1 = D_808DFF18[this->unk_148] * this->actor.speedXZ * (1.0f / 2.0f);
- } else if (this->unk_148 == 3) {
- phi_fv1 = D_808DFF18[this->unk_148] * this->actor.speedXZ * (1.0f / 3.0f);
- } else if (this->unk_148 == 4) {
- phi_fv1 = D_808DFF18[this->unk_148] * this->actor.speedXZ * (1.0f / 5.0f);
+ if (this->animIndex == OOT_CHILD_EPONA_ANIM_WALK) {
+ animSpeed = sAnimPlaySpeeds[this->animIndex] * this->actor.speed * (1.0f / 2.0f);
+ } else if (this->animIndex == OOT_CHILD_EPONA_ANIM_TROT) {
+ animSpeed = sAnimPlaySpeeds[this->animIndex] * this->actor.speed * (1.0f / 3.0f);
+ } else if (this->animIndex == OOT_CHILD_EPONA_ANIM_GALLOP) {
+ animSpeed = sAnimPlaySpeeds[this->animIndex] * this->actor.speed * (1.0f / 5.0f);
} else {
- phi_fv1 = D_808DFF18[this->unk_148];
+ animSpeed = sAnimPlaySpeeds[this->animIndex];
}
- return phi_fv1;
+
+ return animSpeed;
}
void EnHorseLinkChild_Init(Actor* thisx, PlayState* play) {
EnHorseLinkChild* this = THIS;
Actor_ProcessInitChain(&this->actor, sInitChain);
- Actor_SetScale(&this->actor, 0.00648f);
+ Actor_SetScale(&this->actor, 64.8f * 0.0001f);
this->actor.gravity = -3.5f;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawHorse, 20.0f);
- this->unk_144 = 1;
- this->actor.speedXZ = 0.0f;
+ this->action = OOT_CHILD_EPONA_ACTION_GREET_PLAYER;
+ this->actor.speed = 0.0f;
this->actor.focus.pos = this->actor.world.pos;
this->actor.focus.pos.y += 70.0f;
- Skin_Init(&play->state, &this->skin, &object_horse_link_child_Skel_00A480, &object_horse_link_child_Anim_002F98);
- this->unk_148 = 0;
- Animation_PlayOnce(&this->skin.skelAnime, D_808DFEC0[0]);
+ Skin_Init(&play->state, &this->skin, &gEponaSkel, &gEponaGallopAnim);
+ this->animIndex = OOT_CHILD_EPONA_ANIM_IDLE;
+
+ // this gets overwritten by EnHorseLinkChild_SetupLonLonIdle below
+ Animation_PlayOnce(&this->skin.skelAnime, sAnimations[OOT_CHILD_EPONA_ANIM_IDLE]);
Collider_InitCylinder(play, &this->colldierCylinder);
Collider_InitJntSph(play, &this->colliderJntSph);
Collider_SetJntSph(play, &this->colliderJntSph, &this->actor, &sJntSphInit, this->colliderJntSphElements);
CollisionCheck_SetInfo(&this->actor.colChkInfo, NULL, &sColChkInfoInit);
- this->unk_1E8 = 0;
- this->unk_1E4 = 0;
+ this->footstepCounter = 0;
+ this->eyeTexIndex = 0;
- if (gSaveContext.sceneLayer >= 4) {
- func_808DEFE8(this);
+ if (gSaveContext.sceneLayer >= 4) { // IS_CUTSCENE_LAYER in OoT
+ EnHorseLinkChild_SetupLonLonIdle(this);
} else {
- func_808DEFE8(this);
+ EnHorseLinkChild_SetupLonLonIdle(this);
}
this->actor.home.rot.z = this->actor.world.rot.z = this->actor.shape.rot.z = 0;
@@ -175,349 +218,369 @@ void EnHorseLinkChild_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyJntSph(play, &this->colliderJntSph);
}
-void func_808DE9A8(EnHorseLinkChild* this) {
- this->unk_144 = 0;
- this->unk_148++;
- if (this->unk_148 >= ARRAY_COUNT(D_808DFF18)) {
- this->unk_148 = 0;
+void EnHorseLinkChild_SetupActionFunc0(EnHorseLinkChild* this) {
+ this->action = OOT_CHILD_EPONA_ACTION_0;
+ this->animIndex++;
+ if (this->animIndex >= OOT_CHILD_EPONA_ANIM_MAX) {
+ this->animIndex = OOT_CHILD_EPONA_ANIM_IDLE;
}
- Animation_PlayOnce(&this->skin.skelAnime, D_808DFEC0[this->unk_148]);
- this->skin.skelAnime.playSpeed = func_808DE728(this);
+ Animation_PlayOnce(&this->skin.skelAnime, sAnimations[this->animIndex]);
+ this->skin.skelAnime.playSpeed = EnHorseLinkChild_GetAnimSpeed(this);
}
-void func_808DEA0C(EnHorseLinkChild* this, PlayState* play) {
- this->actor.speedXZ = 0.0f;
+/**
+ * Mostly broken
+ */
+void EnHorseLinkChild_ActionFunc0(EnHorseLinkChild* this, PlayState* play) {
+ this->actor.speed = 0.0f;
if (SkelAnime_Update(&this->skin.skelAnime)) {
- func_808DE9A8(this);
+ EnHorseLinkChild_SetupActionFunc0(this);
}
}
-void func_808DEA54(EnHorseLinkChild* this, s32 arg1) {
- this->unk_144 = 2;
- this->actor.speedXZ = 0.0f;
+void EnHorseLinkChild_SetupWaitForPlayer(EnHorseLinkChild* this, s32 animIndex) {
+ this->action = OOT_CHILD_EPONA_ACTION_WAIT_FOR_PLAYER;
+ this->actor.speed = 0.0f;
- if ((arg1 != 0) && (arg1 != 1)) {
- arg1 = 0;
+ if ((animIndex != OOT_CHILD_EPONA_ANIM_IDLE) && (animIndex != OOT_CHILD_EPONA_ANIM_WHINNY)) {
+ animIndex = OOT_CHILD_EPONA_ANIM_IDLE;
}
- if (arg1 != this->unk_148) {
- this->unk_148 = arg1;
- Animation_Change(&this->skin.skelAnime, D_808DFEC0[this->unk_148], func_808DE728(this), 0.0f,
- Animation_GetLastFrame(D_808DFEC0[this->unk_148]), ANIMMODE_ONCE, -5.0f);
+ if (this->animIndex != animIndex) {
+ this->animIndex = animIndex;
+ Animation_Change(&this->skin.skelAnime, sAnimations[this->animIndex], EnHorseLinkChild_GetAnimSpeed(this), 0.0f,
+ Animation_GetLastFrame(sAnimations[this->animIndex]), ANIMMODE_ONCE, -5.0f);
}
}
-void func_808DEB14(EnHorseLinkChild* this, PlayState* play) {
- f32 sp44 = Actor_XZDistanceBetweenActors(&this->actor, &GET_PLAYER(play)->actor);
- s32 phi_v0;
+/**
+ * Waiting for the player to get close, to notice and begin to approach the player.
+ */
+void EnHorseLinkChild_WaitForPlayer(EnHorseLinkChild* this, PlayState* play) {
+ f32 distToPlayer = Actor_WorldDistXZToActor(&this->actor, &GET_PLAYER(play)->actor);
+ s32 animIndex;
if (SkelAnime_Update(&this->skin.skelAnime)) {
- if ((sp44 < 1000.0f) && (sp44 > 70.0f)) {
- func_808DECA0(this);
+ if ((distToPlayer < 1000.0f) && (distToPlayer > 70.0f)) {
+ EnHorseLinkChild_SetupGreetPlayer(this);
return;
}
- if (this->unk_148 == 1) {
- phi_v0 = 0;
+ if (this->animIndex == OOT_CHILD_EPONA_ANIM_WHINNY) {
+ animIndex = OOT_CHILD_EPONA_ANIM_IDLE;
} else {
- phi_v0 = 1;
+ animIndex = OOT_CHILD_EPONA_ANIM_WHINNY;
}
- if (phi_v0 != this->unk_148) {
- this->unk_148 = phi_v0;
- Animation_Change(&this->skin.skelAnime, D_808DFEC0[this->unk_148], func_808DE728(this), 0.0f,
- Animation_GetLastFrame(D_808DFEC0[this->unk_148]), ANIMMODE_ONCE, -5.0f);
+ if (this->animIndex != animIndex) {
+ this->animIndex = animIndex;
+ Animation_Change(&this->skin.skelAnime, sAnimations[this->animIndex], EnHorseLinkChild_GetAnimSpeed(this),
+ 0.0f, Animation_GetLastFrame(sAnimations[this->animIndex]), ANIMMODE_ONCE, -5.0f);
} else {
- 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);
+ Animation_Change(&this->skin.skelAnime, sAnimations[this->animIndex], EnHorseLinkChild_GetAnimSpeed(this),
+ 0.0f, Animation_GetLastFrame(sAnimations[this->animIndex]), ANIMMODE_ONCE, 0.0f);
}
}
}
-void func_808DECA0(EnHorseLinkChild* this) {
- this->unk_144 = 1;
- this->unk_148 = 0;
- this->actor.speedXZ = 0.0f;
- Animation_Change(&this->skin.skelAnime, D_808DFEC0[this->unk_148], func_808DE728(this), 0.0f,
- Animation_GetLastFrame(D_808DFEC0[this->unk_148]), ANIMMODE_ONCE, -5.0f);
+void EnHorseLinkChild_SetupGreetPlayer(EnHorseLinkChild* this) {
+ this->action = OOT_CHILD_EPONA_ACTION_GREET_PLAYER;
+ this->animIndex = OOT_CHILD_EPONA_ANIM_IDLE;
+ this->actor.speed = 0.0f;
+ Animation_Change(&this->skin.skelAnime, sAnimations[this->animIndex], EnHorseLinkChild_GetAnimSpeed(this), 0.0f,
+ Animation_GetLastFrame(sAnimations[this->animIndex]), ANIMMODE_ONCE, -5.0f);
}
-void func_808DED40(EnHorseLinkChild* this, PlayState* play) {
- f32 temp_fv0;
- s16 temp_a0;
- s32 phi_v0;
+/**
+ * Chasing the player down.
+ */
+void EnHorseLinkChild_GreetPlayer(EnHorseLinkChild* this, PlayState* play) {
+ f32 distToPlayer;
+ s16 yawTowardPlayerDiff;
+ s32 animIndex;
- if ((this->unk_148 == 4) || (this->unk_148 == 3) || (this->unk_148 == 2)) {
- temp_a0 = Actor_YawBetweenActors(&this->actor, &GET_PLAYER(play)->actor) - this->actor.world.rot.y;
- if (temp_a0 > 0x12C) {
+ if ((this->animIndex == OOT_CHILD_EPONA_ANIM_GALLOP) || (this->animIndex == OOT_CHILD_EPONA_ANIM_TROT) ||
+ (this->animIndex == OOT_CHILD_EPONA_ANIM_WALK)) {
+ yawTowardPlayerDiff =
+ Actor_WorldYawTowardActor(&this->actor, &GET_PLAYER(play)->actor) - this->actor.world.rot.y;
+ if (yawTowardPlayerDiff > 0x12C) {
this->actor.world.rot.y += 0x12C;
- } else if (temp_a0 < -0x12C) {
+ } else if (yawTowardPlayerDiff < -0x12C) {
this->actor.world.rot.y -= 0x12C;
} else {
- this->actor.world.rot.y += temp_a0;
+ this->actor.world.rot.y += yawTowardPlayerDiff;
}
this->actor.shape.rot.y = this->actor.world.rot.y;
}
if (SkelAnime_Update(&this->skin.skelAnime)) {
- temp_fv0 = Actor_XZDistanceBetweenActors(&this->actor, &GET_PLAYER(play)->actor);
- if (temp_fv0 > 1000.0f) {
- func_808DEA54(this, 0);
+ distToPlayer = Actor_WorldDistXZToActor(&this->actor, &GET_PLAYER(play)->actor);
+ if (distToPlayer > 1000.0f) {
+ EnHorseLinkChild_SetupWaitForPlayer(this, 0);
return;
}
- if ((temp_fv0 < 1000.0f) && (temp_fv0 >= 300.0f)) {
- phi_v0 = 4;
- this->actor.speedXZ = 6.0f;
- } else if ((temp_fv0 < 300.0f) && (temp_fv0 >= 150.0f)) {
- phi_v0 = 3;
- this->actor.speedXZ = 4.0f;
- } else if ((temp_fv0 < 150.0f) && (temp_fv0 >= 70.0f)) {
- phi_v0 = 2;
- this->unk_1E8 = 0;
- this->actor.speedXZ = 2.0f;
+ if ((distToPlayer < 1000.0f) && (distToPlayer >= 300.0f)) {
+ animIndex = OOT_CHILD_EPONA_ANIM_GALLOP;
+ this->actor.speed = 6.0f;
+ } else if ((distToPlayer < 300.0f) && (distToPlayer >= 150.0f)) {
+ animIndex = OOT_CHILD_EPONA_ANIM_TROT;
+ this->actor.speed = 4.0f;
+ } else if ((distToPlayer < 150.0f) && (distToPlayer >= 70.0f)) {
+ animIndex = OOT_CHILD_EPONA_ANIM_WALK;
+ this->footstepCounter = 0;
+ this->actor.speed = 2.0f;
} else {
- func_808DEA54(this, 1);
+ EnHorseLinkChild_SetupWaitForPlayer(this, 1);
return;
}
- if (phi_v0 != this->unk_148) {
- this->unk_148 = phi_v0;
- Animation_Change(&this->skin.skelAnime, D_808DFEC0[this->unk_148], func_808DE728(this), 0.0f,
- Animation_GetLastFrame(D_808DFEC0[this->unk_148]), ANIMMODE_ONCE, -5.0f);
+ if (this->animIndex != animIndex) {
+ this->animIndex = animIndex;
+ Animation_Change(&this->skin.skelAnime, sAnimations[this->animIndex], EnHorseLinkChild_GetAnimSpeed(this),
+ 0.0f, Animation_GetLastFrame(sAnimations[this->animIndex]), ANIMMODE_ONCE, -5.0f);
} else {
- 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);
+ Animation_Change(&this->skin.skelAnime, sAnimations[this->animIndex], EnHorseLinkChild_GetAnimSpeed(this),
+ 0.0f, Animation_GetLastFrame(sAnimations[this->animIndex]), ANIMMODE_ONCE, 0.0f);
}
}
}
-void func_808DEFE8(EnHorseLinkChild* this) {
- this->unk_144 = 3;
- this->unk_148 = 0;
- this->actor.speedXZ = 0.0f;
- Animation_Change(&this->skin.skelAnime, D_808DFEC0[this->unk_148], func_808DE728(this), 0.0f,
- Animation_GetLastFrame(D_808DFEC0[this->unk_148]), ANIMMODE_ONCE, -5.0f);
+void EnHorseLinkChild_SetupLonLonIdle(EnHorseLinkChild* this) {
+ this->action = OOT_CHILD_EPONA_ACTION_LONLON_IDLE;
+ this->animIndex = OOT_CHILD_EPONA_ANIM_IDLE;
+ this->actor.speed = 0.0f;
+ Animation_Change(&this->skin.skelAnime, sAnimations[this->animIndex], EnHorseLinkChild_GetAnimSpeed(this), 0.0f,
+ Animation_GetLastFrame(sAnimations[this->animIndex]), ANIMMODE_ONCE, -5.0f);
}
void func_808DF088(EnHorseLinkChild* this, PlayState* play) {
- if ((this->unk_148 == 4) || (this->unk_148 == 3) || (this->unk_148 == 2)) {
+ if ((this->animIndex == OOT_CHILD_EPONA_ANIM_GALLOP) || (this->animIndex == OOT_CHILD_EPONA_ANIM_TROT) ||
+ (this->animIndex == OOT_CHILD_EPONA_ANIM_WALK)) {
Player* player = GET_PLAYER(play);
- s16 sp32;
- s32 phi_v0;
+ s16 newYawDiff;
+ s32 newYawDir;
s32 pad;
if (Math3D_Distance(&player->actor.world.pos, &this->actor.home.pos) < 250.0f) {
- sp32 = player->actor.shape.rot.y;
- if (Actor_YawBetweenActors(&this->actor, &player->actor) > 0) {
- phi_v0 = 1;
+ newYawDiff = player->actor.shape.rot.y;
+ if (Actor_WorldYawTowardActor(&this->actor, &player->actor) > 0) {
+ newYawDir = 1;
} else {
- phi_v0 = -1;
+ newYawDir = -1;
}
- sp32 += (phi_v0 << 0xE);
+ newYawDiff += (newYawDir * 0x4000);
} else {
- sp32 = Math_Vec3f_Yaw(&this->actor.world.pos, &this->actor.home.pos) - this->actor.world.rot.y;
+ newYawDiff = Math_Vec3f_Yaw(&this->actor.world.pos, &this->actor.home.pos) - this->actor.world.rot.y;
}
- if (sp32 > 0x12C) {
+ if (newYawDiff > 0x12C) {
this->actor.world.rot.y += 0x12C;
- } else if (sp32 < -0x12C) {
+ } else if (newYawDiff < -0x12C) {
this->actor.world.rot.y += -0x12C;
} else {
- this->actor.world.rot.y += sp32;
+ this->actor.world.rot.y += newYawDiff;
}
this->actor.shape.rot.y = this->actor.world.rot.y;
}
}
-void func_808DF194(EnHorseLinkChild* this, PlayState* play) {
+/**
+ * Idle in one spot, waiting for player to finish getting Epona song.
+ * However, the flag was not migrated from OoT corectly, so it checks for the wrong flag.
+ */
+void EnHorseLinkChild_LonLonIdle(EnHorseLinkChild* this, PlayState* play) {
Player* player;
- f32 sp50;
- s32 sp4C;
- s32 sp48;
+ f32 distToPlayer;
+ s32 isAnimFinished;
+ s32 animIndex;
func_808DF088(this, play);
player = GET_PLAYER(play);
- sp50 = Actor_XZDistanceBetweenActors(&this->actor, &player->actor);
- sp48 = this->unk_148;
- sp4C = SkelAnime_Update(&this->skin.skelAnime);
+ distToPlayer = Actor_WorldDistXZToActor(&this->actor, &player->actor);
+ animIndex = this->animIndex;
+ isAnimFinished = SkelAnime_Update(&this->skin.skelAnime);
- if ((sp4C != 0) || (this->unk_148 == 1) || (this->unk_148 == 0)) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_01_20)) {
- f32 sp44 = Math3D_Distance(&this->actor.world.pos, &this->actor.home.pos);
+ if (isAnimFinished || (this->animIndex == OOT_CHILD_EPONA_ANIM_WHINNY) ||
+ (this->animIndex == OOT_CHILD_EPONA_ANIM_IDLE)) {
+ //! @bug: The carry-over of this flag from OoT was not done correctly
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_ENTERED_ZORA_HALL)) {
+ f32 distToHome = Math3D_Distance(&this->actor.world.pos, &this->actor.home.pos);
s32 pad;
if (Math3D_Distance(&player->actor.world.pos, &this->actor.home.pos) > 250.0f) {
- if (sp44 >= 300.0f) {
- sp48 = 4;
- this->actor.speedXZ = 6.0f;
- } else if ((sp44 < 300.0f) && (sp44 >= 150.0f)) {
- sp48 = 3;
- this->actor.speedXZ = 4.0f;
- } else if ((sp44 < 150.0f) && (sp44 >= 70.0f)) {
- sp48 = 2;
- this->unk_1E8 = 0;
- this->actor.speedXZ = 2.0f;
+ if (distToHome >= 300.0f) {
+ animIndex = OOT_CHILD_EPONA_ANIM_GALLOP;
+ this->actor.speed = 6.0f;
+ } else if ((distToHome < 300.0f) && (distToHome >= 150.0f)) {
+ animIndex = OOT_CHILD_EPONA_ANIM_TROT;
+ this->actor.speed = 4.0f;
+ } else if ((distToHome < 150.0f) && (distToHome >= 70.0f)) {
+ animIndex = OOT_CHILD_EPONA_ANIM_WALK;
+ this->footstepCounter = 0;
+ this->actor.speed = 2.0f;
} else {
- this->actor.speedXZ = 0.0f;
- if (this->unk_148 == 0) {
- sp48 = (sp4C == 1) ? 1 : 0;
+ this->actor.speed = 0.0f;
+ if (this->animIndex == OOT_CHILD_EPONA_ANIM_IDLE) {
+ animIndex = (isAnimFinished == true) ? OOT_CHILD_EPONA_ANIM_WHINNY : OOT_CHILD_EPONA_ANIM_IDLE;
} else {
- sp48 = (sp4C == 1) ? 0 : 1;
+ animIndex = (isAnimFinished == true) ? OOT_CHILD_EPONA_ANIM_IDLE : OOT_CHILD_EPONA_ANIM_WHINNY;
}
}
- } else if (sp50 < 200.0f) {
- sp48 = 4;
- this->actor.speedXZ = 6.0f;
- } else if (sp50 < 300.0f) {
- sp48 = 3;
- this->actor.speedXZ = 4.0f;
- } else if (sp50 < 400.0f) {
- sp48 = 2;
- this->unk_1E8 = 0;
- this->actor.speedXZ = 2.0f;
+ } else if (distToPlayer < 200.0f) {
+ animIndex = OOT_CHILD_EPONA_ANIM_GALLOP;
+ this->actor.speed = 6.0f;
+ } else if (distToPlayer < 300.0f) {
+ animIndex = OOT_CHILD_EPONA_ANIM_TROT;
+ this->actor.speed = 4.0f;
+ } else if (distToPlayer < 400.0f) {
+ animIndex = OOT_CHILD_EPONA_ANIM_WALK;
+ this->footstepCounter = 0;
+ this->actor.speed = 2.0f;
} else {
- this->actor.speedXZ = 0.0f;
- if (this->unk_148 == 0) {
- sp48 = (sp4C == 1) ? 1 : 0;
+ this->actor.speed = 0.0f;
+ if (this->animIndex == OOT_CHILD_EPONA_ANIM_IDLE) {
+ animIndex = (isAnimFinished == true) ? OOT_CHILD_EPONA_ANIM_WHINNY : OOT_CHILD_EPONA_ANIM_IDLE;
} else {
- sp48 = (sp4C == 1) ? 0 : 1;
+ animIndex = (isAnimFinished == true) ? OOT_CHILD_EPONA_ANIM_IDLE : OOT_CHILD_EPONA_ANIM_WHINNY;
}
}
} else {
- this->actor.speedXZ = 0.0f;
- if (this->unk_148 == 0) {
- sp48 = (sp4C == 1) ? 1 : 0;
+ this->actor.speed = 0.0f;
+ if (this->animIndex == OOT_CHILD_EPONA_ANIM_IDLE) {
+ animIndex = (isAnimFinished == true) ? OOT_CHILD_EPONA_ANIM_WHINNY : OOT_CHILD_EPONA_ANIM_IDLE;
} else {
- sp48 = (sp4C == 1) ? 0 : 1;
+ animIndex = (isAnimFinished == true) ? OOT_CHILD_EPONA_ANIM_IDLE : OOT_CHILD_EPONA_ANIM_WHINNY;
}
}
}
- if ((sp48 != this->unk_148) || (sp4C == 1)) {
- this->unk_148 = sp48;
- Animation_Change(&this->skin.skelAnime, D_808DFEC0[this->unk_148], func_808DE728(this), 0.0f,
- Animation_GetLastFrame(D_808DFEC0[this->unk_148]), ANIMMODE_ONCE, -5.0f);
+ if ((this->animIndex != animIndex) || (isAnimFinished == true)) {
+ this->animIndex = animIndex;
+ Animation_Change(&this->skin.skelAnime, sAnimations[this->animIndex], EnHorseLinkChild_GetAnimSpeed(this), 0.0f,
+ Animation_GetLastFrame(sAnimations[this->animIndex]), ANIMMODE_ONCE, -5.0f);
} else {
- Animation_Change(&this->skin.skelAnime, D_808DFEC0[this->unk_148], func_808DE728(this),
- this->skin.skelAnime.curFrame, Animation_GetLastFrame(D_808DFEC0[this->unk_148]),
+ Animation_Change(&this->skin.skelAnime, sAnimations[this->animIndex], EnHorseLinkChild_GetAnimSpeed(this),
+ this->skin.skelAnime.curFrame, Animation_GetLastFrame(sAnimations[this->animIndex]),
ANIMMODE_ONCE, 0.0f);
}
}
-void func_808DF560(EnHorseLinkChild* this) {
- this->unk_144 = 5;
+void EnHorseLinkChild_SetupActionFunc5(EnHorseLinkChild* this) {
+ this->action = OOT_CHILD_EPONA_ACTION_5;
if (Rand_ZeroOne() > 0.5f) {
- this->unk_148 = 0;
+ this->animIndex = OOT_CHILD_EPONA_ANIM_IDLE;
} else {
- this->unk_148 = 1;
+ this->animIndex = OOT_CHILD_EPONA_ANIM_WHINNY;
}
- D_801BDAA4 = 0;
- 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);
+ gHorsePlayedEponasSong = false;
+ Animation_Change(&this->skin.skelAnime, sAnimations[this->animIndex], EnHorseLinkChild_GetAnimSpeed(this), 0.0f,
+ Animation_GetLastFrame(sAnimations[this->animIndex]), ANIMMODE_ONCE, 0.0f);
}
-void func_808DF620(EnHorseLinkChild* this, PlayState* play) {
- s16 sp36;
+void EnHorseLinkChild_ActionFunc5(EnHorseLinkChild* this, PlayState* play) {
+ s16 yawTowardsPlayer;
- if (D_801BDAA4 != 0) {
- D_801BDAA4 = 0;
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_NEIGH);
- func_808DF788(this);
+ if (gHorsePlayedEponasSong) {
+ gHorsePlayedEponasSong = false;
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_NEIGH);
+ EnHorseLinkChild_SetupActionFunc4(this);
return;
}
- this->actor.speedXZ = 0.0f;
- sp36 = Actor_YawBetweenActors(&this->actor, &GET_PLAYER(play)->actor) - this->actor.world.rot.y;
+ this->actor.speed = 0.0f;
+ yawTowardsPlayer = 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);
+ if ((Math_CosS(yawTowardsPlayer) < 0.7071f) && (this->animIndex == OOT_CHILD_EPONA_ANIM_WALK)) {
+ Horse_RotateToPoint(&this->actor, &GET_PLAYER(play)->actor.world.pos, 0x12C);
}
if (SkelAnime_Update(&this->skin.skelAnime)) {
- if (Math_CosS(sp36) < 0.0f) {
- this->unk_148 = 2;
- Animation_Change(&this->skin.skelAnime, D_808DFEC0[this->unk_148], D_808DFF18[this->unk_148], 0.0f,
- Animation_GetLastFrame(D_808DFEC8[0]), ANIMMODE_ONCE, -5.0f);
+ if (Math_CosS(yawTowardsPlayer) < 0.0f) {
+ this->animIndex = OOT_CHILD_EPONA_ANIM_WALK;
+ Animation_Change(&this->skin.skelAnime, sAnimations[this->animIndex], sAnimPlaySpeeds[this->animIndex],
+ 0.0f, Animation_GetLastFrame(sAnimations[OOT_CHILD_EPONA_ANIM_WALK]), ANIMMODE_ONCE,
+ -5.0f);
} else {
- func_808DF560(this);
+ EnHorseLinkChild_SetupActionFunc5(this);
}
}
}
-void func_808DF788(EnHorseLinkChild* this) {
- this->unk_1DC = 0;
- this->unk_144 = 4;
- this->unk_148 = 2;
- this->unk_1E0 = 0;
- this->actor.speedXZ = 2.0f;
- Animation_Change(&this->skin.skelAnime, D_808DFEC0[this->unk_148], func_808DE728(this), 0.0f,
- Animation_GetLastFrame(D_808DFEC0[this->unk_148]), ANIMMODE_ONCE, -5.0f);
+void EnHorseLinkChild_SetupActionFunc4(EnHorseLinkChild* this) {
+ this->timer = 0;
+ this->action = OOT_CHILD_EPONA_ACTION_4;
+ this->animIndex = OOT_CHILD_EPONA_ANIM_WALK;
+ this->isReturningHome = false;
+ this->actor.speed = 2.0f;
+ Animation_Change(&this->skin.skelAnime, sAnimations[this->animIndex], EnHorseLinkChild_GetAnimSpeed(this), 0.0f,
+ Animation_GetLastFrame(sAnimations[this->animIndex]), ANIMMODE_ONCE, -5.0f);
}
-void func_808DF838(EnHorseLinkChild* this, PlayState* play) {
+void EnHorseLinkChild_ActionFunc4(EnHorseLinkChild* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- f32 phi_fv0;
- s32 phi_v0;
+ f32 distToTargetPos;
+ s32 animIndex;
- this->unk_1DC++;
- if (this->unk_1DC > 300) {
- this->unk_1E0 = 1;
+ this->timer++;
+ if (this->timer > 300) {
+ this->isReturningHome = true;
}
- 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);
+ if ((this->animIndex == OOT_CHILD_EPONA_ANIM_GALLOP) || (this->animIndex == OOT_CHILD_EPONA_ANIM_TROT) ||
+ (this->animIndex == OOT_CHILD_EPONA_ANIM_WALK)) {
+ if (!this->isReturningHome) {
+ 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);
}
}
if (SkelAnime_Update(&this->skin.skelAnime)) {
- if (this->unk_1E0 == 0) {
- phi_fv0 = Actor_XZDistanceBetweenActors(&this->actor, &GET_PLAYER(play)->actor);
+ if (!this->isReturningHome) {
+ distToTargetPos = Actor_WorldDistXZToActor(&this->actor, &GET_PLAYER(play)->actor);
} else {
- phi_fv0 = Math3D_Distance(&this->actor.world.pos, &this->actor.home.pos);
+ distToTargetPos = Math3D_Distance(&this->actor.world.pos, &this->actor.home.pos);
}
- if (this->unk_1E0 == 0) {
- if (phi_fv0 >= 300.0f) {
- phi_v0 = 4;
- this->actor.speedXZ = 6.0f;
- } else if (phi_fv0 >= 150.0f) {
- phi_v0 = 3;
- this->actor.speedXZ = 4.0f;
+ if (!this->isReturningHome) {
+ if (distToTargetPos >= 300.0f) {
+ animIndex = OOT_CHILD_EPONA_ANIM_GALLOP;
+ this->actor.speed = 6.0f;
+ } else if (distToTargetPos >= 150.0f) {
+ animIndex = OOT_CHILD_EPONA_ANIM_TROT;
+ this->actor.speed = 4.0f;
} else {
- phi_v0 = 2;
- this->unk_1E8 = 0;
- this->actor.speedXZ = 2.0f;
+ animIndex = OOT_CHILD_EPONA_ANIM_WALK;
+ this->footstepCounter = 0;
+ this->actor.speed = 2.0f;
}
- } else if (phi_fv0 >= 300.0f) {
- phi_v0 = 4;
- this->actor.speedXZ = 6.0f;
- } else if (phi_fv0 >= 150.0f) {
- phi_v0 = 3;
- this->actor.speedXZ = 4.0f;
- } else if (phi_fv0 >= 70.0f) {
- phi_v0 = 2;
- this->unk_1E8 = 0;
- this->actor.speedXZ = 2.0f;
+ } else if (distToTargetPos >= 300.0f) {
+ animIndex = OOT_CHILD_EPONA_ANIM_GALLOP;
+ this->actor.speed = 6.0f;
+ } else if (distToTargetPos >= 150.0f) {
+ animIndex = OOT_CHILD_EPONA_ANIM_TROT;
+ this->actor.speed = 4.0f;
+ } else if (distToTargetPos >= 70.0f) {
+ animIndex = OOT_CHILD_EPONA_ANIM_WALK;
+ this->footstepCounter = 0;
+ this->actor.speed = 2.0f;
} else {
- func_808DF560(this);
+ EnHorseLinkChild_SetupActionFunc5(this);
return;
}
- if (phi_v0 != this->unk_148) {
- this->unk_148 = phi_v0;
- Animation_Change(&this->skin.skelAnime, D_808DFEC0[this->unk_148], func_808DE728(this), 0.0f,
- Animation_GetLastFrame(D_808DFEC0[this->unk_148]), ANIMMODE_ONCE, -5.0f);
+ if (this->animIndex != animIndex) {
+ this->animIndex = animIndex;
+ Animation_Change(&this->skin.skelAnime, sAnimations[this->animIndex], EnHorseLinkChild_GetAnimSpeed(this),
+ 0.0f, Animation_GetLastFrame(sAnimations[this->animIndex]), ANIMMODE_ONCE, -5.0f);
} else {
- 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);
+ Animation_Change(&this->skin.skelAnime, sAnimations[this->animIndex], EnHorseLinkChild_GetAnimSpeed(this),
+ 0.0f, Animation_GetLastFrame(sAnimations[this->animIndex]), ANIMMODE_ONCE, 0.0f);
}
}
}
@@ -526,26 +589,29 @@ void EnHorseLinkChild_Update(Actor* thisx, PlayState* play) {
s32 pad;
EnHorseLinkChild* this = THIS;
- D_808DFF30[this->unk_144](this, play);
+ sActionFuncs[this->action](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;
- if ((Rand_ZeroOne() < 0.025f) && (this->unk_1E4 == 0)) {
- this->unk_1E4++;
- } else if (this->unk_1E4 > 0) {
- this->unk_1E4++;
- if (this->unk_1E4 >= 4) {
- this->unk_1E4 = 0;
+ if ((Rand_ZeroOne() < 0.025f) && (this->eyeTexIndex == 0)) {
+ this->eyeTexIndex++;
+ } else if (this->eyeTexIndex > 0) {
+ this->eyeTexIndex++;
+ if (this->eyeTexIndex >= 4) {
+ this->eyeTexIndex = 0;
}
}
Collider_UpdateCylinder(&this->actor, &this->colldierCylinder);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->colldierCylinder.base);
- func_808DE660(this);
+ EnHorseLinkChild_PlaySound(this);
}
void EnHorseLinkChild_PostSkinDraw(Actor* thisx, PlayState* play, Skin* skin) {
@@ -577,9 +643,9 @@ s32 EnHorseLinkChild_OverrideSkinDraw(Actor* thisx, PlayState* play, s32 limbInd
OPEN_DISPS(play->state.gfxCtx);
if (limbIndex == OBJECT_HORSE_LINK_CHILD_LIMB_0D) {
- u8 index = D_808DFF54[this->unk_1E4];
+ u8 index = sEyeTextureIndexOverride[this->eyeTexIndex];
- gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_808DFF48[index]));
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[index]));
}
CLOSE_DISPS(play->state.gfxCtx);
@@ -590,7 +656,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_Horse_Link_Child/z_en_horse_link_child.h b/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.h
index 62fac6a63..0d5e30165 100644
--- a/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.h
+++ b/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.h
@@ -6,17 +6,17 @@
struct EnHorseLinkChild;
-typedef void (*EnHorseLinkChildUnkFunc)(struct EnHorseLinkChild*, PlayState*);
+typedef void (*EnHorseLinkChildActionFunc)(struct EnHorseLinkChild*, PlayState*);
typedef struct EnHorseLinkChild {
/* 0x000 */ Actor actor;
- /* 0x144 */ s32 unk_144;
- /* 0x148 */ s32 unk_148;
+ /* 0x144 */ s32 action; // index to action func list
+ /* 0x148 */ s32 animIndex;
/* 0x14C */ Skin skin;
- /* 0x1DC */ s32 unk_1DC;
- /* 0x1DC */ s32 unk_1E0;
- /* 0x1E4 */ u8 unk_1E4;
- /* 0x1E8 */ s32 unk_1E8;
+ /* 0x1DC */ s32 timer;
+ /* 0x1DC */ s32 isReturningHome;
+ /* 0x1E4 */ u8 eyeTexIndex;
+ /* 0x1E8 */ s32 footstepCounter; // two sfx per animation loop
/* 0x1EC */ ColliderCylinder colldierCylinder;
/* 0x238 */ ColliderJntSph colliderJntSph;
/* 0x258 */ ColliderJntSphElement colliderJntSphElements[1];
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 2eb1c71a6..ef991495a 100644
--- a/src/overlays/actors/ovl_En_Hs/z_en_hs.c
+++ b/src/overlays/actors/ovl_En_Hs/z_en_hs.c
@@ -6,7 +6,7 @@
#include "z_en_hs.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnHs*)thisx)
@@ -74,7 +74,7 @@ void EnHs_Init(Actor* thisx, PlayState* play) {
EnHs* this = THIS;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 36.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &gHsSkeleton, &gHsIdleAnim, this->jointTable, this->morphTable,
+ SkelAnime_InitFlex(play, &this->skelAnime, &gHsSkel, &gHsIdleAnim, this->jointTable, this->morphTable,
OBJECT_HS_LIMB_MAX);
Animation_PlayLoop(&this->skelAnime, &gHsIdleAnim);
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
@@ -87,7 +87,7 @@ void EnHs_Init(Actor* thisx, PlayState* play) {
}
this->stateFlags = 0;
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
func_80952C50(this, play);
}
@@ -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) {
@@ -110,7 +110,7 @@ void EnHs_UpdateChickPos(Vec3f* dst, Vec3f src, f32 offset) {
Math_Vec3f_Diff(&src, dst, &diff);
- distance = SQ(diff.x) + SQ(diff.z); // gets un-squared after we check if we are too close
+ distance = SQXZ(diff); // gets un-squared after we check if we are too close
if (SQ(offset) > distance) {
return;
@@ -150,7 +150,7 @@ void func_80952FE0(EnHs* this, PlayState* play) {
} else {
this->actionFunc = func_80953180;
this->stateFlags &= ~4;
- func_80151938(play, 0x33F6);
+ Message_ContinueTextbox(play, 0x33F6);
func_80952DFC(play);
}
this->stateTimer++;
@@ -162,13 +162,13 @@ void func_80953098(EnHs* this, PlayState* play) {
this->actionFunc = func_8095345C;
this->actor.flags |= ACTOR_FLAG_10000;
this->stateFlags |= 0x10;
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
} else {
this->stateFlags |= 8;
if (INV_CONTENT(ITEM_MASK_BUNNY) == ITEM_MASK_BUNNY) {
- Actor_PickUp(&this->actor, play, GI_RUPEE_RED, 10000.0f, 50.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_RUPEE_RED, 10000.0f, 50.0f);
} else {
- Actor_PickUp(&this->actor, play, GI_MASK_BUNNY, 10000.0f, 50.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_MASK_BUNNY, 10000.0f, 50.0f);
}
}
}
@@ -176,22 +176,22 @@ void func_80953098(EnHs* this, PlayState* play) {
void func_80953180(EnHs* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
switch (play->msgCtx.currentTextId) {
- case 0x33F4: // text: laughing that they are all roosters (!)
- case 0x33F6: // text: Grog regrets not being able to see his chicks reach adult hood
- func_801477B4(play);
+ case 0x33F4: // laughing that they are all roosters (!)
+ case 0x33F6: // Grog regrets not being able to see his chicks reach adult hood
+ Message_CloseTextbox(play);
this->actionFunc = func_8095345C;
break;
- case 0x33F7: // text: notice his chicks are grown up, happy, wants to give you bunny hood
+ case 0x33F7: // notice his chicks are grown up, happy, wants to give you bunny hood
this->actor.flags &= ~ACTOR_FLAG_10000;
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80953098;
func_80953098(this, play);
break;
- case 0x33F9: // text: laughing that they are all roosters (.)
+ case 0x33F9: // laughing that they are all roosters (.)
this->actor.flags &= ~ACTOR_FLAG_10000;
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_8095345C;
break;
@@ -204,7 +204,7 @@ void func_80953180(EnHs* this, PlayState* play) {
break;
default:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_8095345C;
break;
}
@@ -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;
}
}
@@ -264,10 +264,10 @@ void func_8095345C(EnHs* this, PlayState* play) {
this->actionFunc = func_80953354;
this->stateTimer = 40;
} else if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_10000)) {
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
this->stateFlags |= 1;
} else if ((this->actor.xzDistToPlayer < 120.0f) && Player_IsFacingActor(&this->actor, 0x2000, play)) {
- func_800B8614(&this->actor, play, 130.0f);
+ Actor_OfferTalk(&this->actor, play, 130.0f);
this->stateFlags |= 1;
} else {
this->stateFlags &= ~1;
@@ -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;
@@ -341,6 +341,9 @@ s32 EnHs_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po
return false;
}
break;
+
+ default:
+ break;
}
return false;
}
@@ -356,7 +359,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_Hs2/z_en_hs2.c b/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c
index 8273d8789..07a6748af 100644
--- a/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c
+++ b/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c
@@ -6,7 +6,7 @@
#include "z_en_hs2.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnHs2*)thisx)
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 2468e5961..3006c7bfe 100644
--- a/src/overlays/actors/ovl_En_Ig/z_en_ig.c
+++ b/src/overlays/actors/ovl_En_Ig/z_en_ig.c
@@ -6,9 +6,8 @@
#include "z_en_ig.h"
#include "overlays/actors/ovl_En_Door/z_en_door.h"
-#include "objects/object_dai/object_dai.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnIg*)thisx)
@@ -25,7 +24,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 +41,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(),
@@ -143,17 +142,32 @@ static ColliderSphereInit sSphereInit = {
static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE };
-static AnimationInfoS sAnimationInfo[] = {
- { &object_dai_Anim_0048B4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dai_Anim_0048B4, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_dai_Anim_005100, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dai_Anim_005100, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_dai_Anim_0010F8, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dai_Anim_001E44, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_dai_Anim_0014BC, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dai_Anim_003CAC, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &object_dai_Anim_0040E0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dai_Anim_0040E0, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
+typedef enum EnIgAnimation {
+ /* -1 */ ENIG_ANIM_NONE = -1,
+ /* 0 */ ENIG_ANIM_0,
+ /* 1 */ ENIG_ANIM_1,
+ /* 2 */ ENIG_ANIM_2,
+ /* 3 */ ENIG_ANIM_3,
+ /* 4 */ ENIG_ANIM_4,
+ /* 5 */ ENIG_ANIM_5,
+ /* 6 */ ENIG_ANIM_6,
+ /* 7 */ ENIG_ANIM_7,
+ /* 8 */ ENIG_ANIM_8,
+ /* 9 */ ENIG_ANIM_9,
+ /* 10 */ ENIG_ANIM_MAX
+} EnIgAnimation;
+
+static AnimationInfoS sAnimationInfo[ENIG_ANIM_MAX] = {
+ { &object_dai_Anim_0048B4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENIG_ANIM_0
+ { &object_dai_Anim_0048B4, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIG_ANIM_1
+ { &object_dai_Anim_005100, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENIG_ANIM_2
+ { &object_dai_Anim_005100, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIG_ANIM_3
+ { &object_dai_Anim_0010F8, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENIG_ANIM_4
+ { &object_dai_Anim_001E44, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIG_ANIM_5
+ { &object_dai_Anim_0014BC, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENIG_ANIM_6
+ { &object_dai_Anim_003CAC, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENIG_ANIM_7
+ { &object_dai_Anim_0040E0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENIG_ANIM_8
+ { &object_dai_Anim_0040E0, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIG_ANIM_9
};
Actor* func_80BF1150(EnIg* this, PlayState* play, u8 actorCat, s16 actorId) {
@@ -204,44 +218,44 @@ EnDoor* func_80BF1200(PlayState* play, s32 arg1) {
return SubS_FindDoor(play, phi_a1);
}
-void func_80BF1258(EnIg* this) {
- this->skelAnime.playSpeed = this->unk_3D4;
+void EnIg_UpdateSkelAnime(EnIg* this) {
+ this->skelAnime.playSpeed = this->animPlaySpeed;
SkelAnime_Update(&this->skelAnime);
}
-s32 func_80BF1284(EnIg* this, s32 arg1) {
- s32 phi_v1 = false;
- s32 ret = false;
+s32 EnIg_ChangeAnim(EnIg* this, s32 animIndex) {
+ s32 changeAnim = false;
+ s32 didAnimChange = false;
- switch (arg1) {
- case 0:
- case 1:
- if ((this->unk_3FC != 0) && (this->unk_3FC != 1)) {
- phi_v1 = true;
+ switch (animIndex) {
+ case ENIG_ANIM_0:
+ case ENIG_ANIM_1:
+ if ((this->animIndex != ENIG_ANIM_0) && (this->animIndex != ENIG_ANIM_1)) {
+ changeAnim = true;
}
break;
- case 2:
- case 3:
- if ((this->unk_3FC != 2) && (this->unk_3FC != 3)) {
- phi_v1 = true;
+ case ENIG_ANIM_2:
+ case ENIG_ANIM_3:
+ if ((this->animIndex != ENIG_ANIM_2) && (this->animIndex != ENIG_ANIM_3)) {
+ changeAnim = true;
}
break;
default:
- if (arg1 != this->unk_3FC) {
- phi_v1 = true;
+ if (this->animIndex != animIndex) {
+ changeAnim = true;
}
break;
}
- if (phi_v1) {
- this->unk_3FC = arg1;
- ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, arg1);
- this->unk_3D4 = this->skelAnime.playSpeed;
+ if (changeAnim) {
+ this->animIndex = animIndex;
+ didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
+ this->animPlaySpeed = this->skelAnime.playSpeed;
}
- return ret;
+ return didAnimChange;
}
void func_80BF1354(EnIg* this, PlayState* play) {
@@ -286,7 +300,7 @@ void func_80BF14B0(EnIg* this) {
Math_Vec3f_Copy(&sp34, &this->actor.focus.pos);
if (this->unk_2A8->id == ACTOR_PLAYER) {
- sp40.y = ((Player*)this->unk_2A8)->bodyPartsPos[7].y + 3.0f;
+ sp40.y = ((Player*)this->unk_2A8)->bodyPartsPos[PLAYER_BODYPART_HEAD].y + 3.0f;
} else {
Math_Vec3f_Copy(&sp40, &this->unk_2A8->focus.pos);
}
@@ -320,73 +334,78 @@ 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)) {
- case 2:
- case 4:
- if ((this->actor.child != NULL) && (this->actor.child->update != NULL)) {
- Camera_SetTargetActor(Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(sp2A)),
- this->actor.child);
- }
- this->unk_3F6++;
- ret = true;
+ if (!func_80BF16C8(this, csId)) {
+ break;
}
+ // fallthrough
+ case 2:
+ case 4:
+ if ((this->actor.child != NULL) && (this->actor.child->update != NULL)) {
+ Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId)),
+ this->actor.child);
+ }
+ this->unk_3F6++;
+ ret = true;
break;
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;
+
+ default:
+ break;
}
return ret;
}
@@ -420,29 +439,28 @@ s32* func_80BF1920(EnIg* this, PlayState* play) {
s32 func_80BF19A0(EnIg* this, PlayState* play) {
s32 ret = false;
- if (this->unk_3D0 & 7) {
- if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- SubS_UpdateFlags(&this->unk_3D0, 0, 7);
- this->unk_3F6 = 0;
- this->unk_3F8 = NULL;
- this->actor.child = this->unk_2A8;
- this->unk_29C = func_80BF1920(this, play);
- if ((this->scheduleResult != 2) && (this->scheduleResult != 3) && (this->scheduleResult != 4)) {
- this->unk_3D0 |= 0x20;
- }
- this->actionFunc = func_80BF2BD4;
- ret = true;
+ if (((this->unk_3D0 & SUBS_OFFER_MODE_MASK) != SUBS_OFFER_MODE_NONE) &&
+ Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ SubS_SetOfferMode(&this->unk_3D0, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
+ this->unk_3F6 = 0;
+ this->unk_3F8 = NULL;
+ this->actor.child = this->unk_2A8;
+ this->unk_29C = func_80BF1920(this, play);
+ if ((this->scheduleResult != 2) && (this->scheduleResult != 3) && (this->scheduleResult != 4)) {
+ this->unk_3D0 |= 0x20;
}
+ this->actionFunc = func_80BF2BD4;
+ ret = true;
}
return ret;
}
void func_80BF1A60(EnIg* this, PlayState* play) {
if (this->unk_3F4 == 0) {
- func_80BF1284(this, 4);
+ EnIg_ChangeAnim(this, ENIG_ANIM_4);
this->unk_3F4++;
} else if ((this->unk_3F4 == 1) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- func_80BF1284(this, 5);
+ EnIg_ChangeAnim(this, ENIG_ANIM_5);
this->unk_3F4++;
}
}
@@ -450,7 +468,7 @@ void func_80BF1A60(EnIg* this, PlayState* play) {
s32 func_80BF1AE0(EnIg* this, PlayState* play) {
switch (this->scheduleResult) {
case 3:
- func_80BF1284(this, 0);
+ EnIg_ChangeAnim(this, ENIG_ANIM_0);
break;
case 10:
@@ -458,7 +476,10 @@ s32 func_80BF1AE0(EnIg* this, PlayState* play) {
case 12:
case 13:
case 14:
- func_80BF1284(this, 2);
+ EnIg_ChangeAnim(this, ENIG_ANIM_2);
+ break;
+
+ default:
break;
}
return true;
@@ -472,8 +493,8 @@ s32 func_80BF1B40(EnIg* this, PlayState* play) {
if (player->stateFlags1 & (PLAYER_STATE1_40 | PLAYER_STATE1_400 | PLAYER_STATE1_800)) {
this->unk_3D0 |= 0x400;
if (this->unk_3D2 != temp) {
- if ((this->unk_3FC == 2) || (this->unk_3FC == 3)) {
- func_80BF1284(this, 0);
+ if ((this->animIndex == ENIG_ANIM_2) || (this->animIndex == ENIG_ANIM_3)) {
+ EnIg_ChangeAnim(this, ENIG_ANIM_0);
}
if ((temp == 0x28B0) || (temp == 0x28B7)) {
@@ -485,7 +506,10 @@ s32 func_80BF1B40(EnIg* this, PlayState* play) {
} else if (this->unk_3D0 & 0x400) {
this->unk_3D2 = 0;
this->unk_3D0 &= ~0x400;
+
+ //! FAKE:
if (1) {}
+
func_80BF1AE0(this, play);
}
@@ -497,7 +521,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 +533,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)) {
@@ -530,8 +554,8 @@ s32 func_80BF1D78(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 sp2C = 0;
if (func_80BF1C44(this, play, scheduleOutput, ACTORCAT_NPC, ACTOR_EN_AN)) {
- func_80BF1284(this, 0);
- SubS_UpdateFlags(&this->unk_3D0, 3, 7);
+ EnIg_ChangeAnim(this, ENIG_ANIM_0);
+ SubS_SetOfferMode(&this->unk_3D0, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_3D0 |= 0x20;
this->unk_3D0 |= 0x100;
sp2C = true;
@@ -541,7 +565,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 +577,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 +590,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;
@@ -574,9 +598,9 @@ s32 func_80BF1DF4(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->unk_3E0 = scheduleOutput->time1 - scheduleOutput->time0;
this->unk_3E2 = sp56 - scheduleOutput->time0;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->unk_3D0 |= 0x100;
- func_80BF1284(this, 3);
+ EnIg_ChangeAnim(this, ENIG_ANIM_3);
this->actor.gravity = 0.0f;
ret = true;
}
@@ -587,7 +611,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 +619,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)) {
@@ -625,9 +649,9 @@ s32 func_80BF1FA8(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->unk_3D0 &= ~0x8;
this->unk_3D0 &= ~0x10;
- SubS_UpdateFlags(&this->unk_3D0, 3, 7);
+ SubS_SetOfferMode(&this->unk_3D0, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_3D0 |= 0x100;
- func_80BF1284(this, 2);
+ EnIg_ChangeAnim(this, ENIG_ANIM_2);
this->actor.gravity = -1.0f;
ret = true;
}
@@ -635,7 +659,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 +669,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)) {
@@ -661,17 +685,20 @@ s32 func_80BF219C(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
case 2:
this->actor.home.rot.y = this->actor.world.rot.y;
this->actor.home.rot.y += 0x8000;
- SubS_UpdateFlags(&this->unk_3D0, 3, 7);
+ SubS_SetOfferMode(&this->unk_3D0, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_3D0 |= 0x100;
- func_80BF1284(this, 1);
+ EnIg_ChangeAnim(this, ENIG_ANIM_1);
break;
case 4:
this->actor.world.rot.y += 0x8000;
this->actor.shape.rot.y = this->actor.world.rot.y;
- SubS_UpdateFlags(&this->unk_3D0, 3, 7);
+ SubS_SetOfferMode(&this->unk_3D0, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_3D0 |= 0x100;
- func_80BF1284(this, 8);
+ EnIg_ChangeAnim(this, ENIG_ANIM_8);
+ break;
+
+ default:
break;
}
ret = true;
@@ -682,9 +709,9 @@ s32 func_80BF219C(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 func_80BF2368(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret = false;
- this->actor.targetMode = 0;
+ this->actor.targetMode = TARGET_MODE_0;
this->unk_3D0 = 0;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
switch (scheduleOutput->result) {
case 5:
@@ -711,6 +738,9 @@ s32 func_80BF2368(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
case 3:
ret = func_80BF1D78(this, play, scheduleOutput);
break;
+
+ default:
+ break;
}
return ret;
}
@@ -735,7 +765,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 {
@@ -750,7 +780,7 @@ s32 func_80BF2470(EnIg* this, PlayState* play) {
Lib_Vec3f_TranslateAndRotateY(&this->unk_2B0, this->actor.world.rot.y, &sp38, &this->actor.world.pos);
this->unk_3E2 += this->timePathTimeSpeed;
if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 13.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_PIRATE_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_PIRATE_WALK);
}
}
return false;
@@ -766,6 +796,7 @@ s32 func_80BF25E8(EnIg* this, PlayState* play) {
s32 pad;
SubS_TimePathing_FillKnots(knots, SUBS_TIME_PATHING_ORDER, this->timePath->count + SUBS_TIME_PATHING_ORDER);
+
if (!(this->unk_3D0 & 8)) {
timePathTargetPos = gZeroVec3f;
SubS_TimePathing_Update(this->timePath, &this->timePathProgress, &this->timePathElapsedTime,
@@ -804,7 +835,7 @@ s32 func_80BF25E8(EnIg* this, PlayState* play) {
this->timePathWaypoint = sp50;
this->timePathTargetPos = timePathTargetPos;
} else if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 13.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_PIRATE_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_PIRATE_WALK);
}
return false;
}
@@ -816,9 +847,9 @@ s32 func_80BF2890(EnIg* this, PlayState* play) {
if (!(this->unk_3D0 & 0x100) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
if (this->unk_408 != 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_SNORE1);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_SNORE1);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_SNORE2);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_SNORE2);
}
this->unk_408 ^= 1;
}
@@ -831,11 +862,11 @@ s32 func_80BF293C(EnIg* this, PlayState* play) {
Math_ApproachS(&this->actor.world.rot.y, this->actor.home.rot.y, 3, 0x2AA8);
} else {
this->actor.world.rot.y = this->actor.home.rot.y;
- func_80BF1284(this, 7);
+ EnIg_ChangeAnim(this, ENIG_ANIM_7);
}
- } else if ((this->unk_3FC == 7) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- SubS_UpdateFlags(&this->unk_3D0, 3, 7);
- func_80BF1284(this, 9);
+ } else if ((this->animIndex == ENIG_ANIM_7) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
+ SubS_SetOfferMode(&this->unk_3D0, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
+ EnIg_ChangeAnim(this, ENIG_ANIM_9);
}
return true;
}
@@ -869,6 +900,9 @@ void func_80BF2A50(EnIg* this, PlayState* play) {
case 4:
func_80BF2890(this, play);
break;
+
+ default:
+ break;
}
Math_ApproachS(&this->actor.shape.rot.y, this->actor.world.rot.y, 3, 0x2AA8);
}
@@ -881,11 +915,11 @@ void func_80BF2AF8(EnIg* this, PlayState* play) {
if (!Schedule_RunScript(play, D_80BF3260, &sp20) ||
((this->scheduleResult != sp20.result) && !func_80BF2368(this, play, &sp20))) {
this->actor.shape.shadowDraw = NULL;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
sp20.result = 0;
} else {
this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}
this->unk_2A8 = func_80BF146C(this, play);
this->scheduleResult = sp20.result;
@@ -898,7 +932,7 @@ void func_80BF2BD4(EnIg* this, PlayState* play) {
Vec3f sp2C;
if (func_8010BF58(&this->actor, play, this->unk_29C, this->unk_3F8, &this->unk_2A0)) {
- SubS_UpdateFlags(&this->unk_3D0, 3, 7);
+ SubS_SetOfferMode(&this->unk_3D0, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_3D0 &= ~0x20;
this->unk_3D0 |= 0x200;
this->unk_3EE = 20;
@@ -917,9 +951,10 @@ void EnIg_Init(Actor* thisx, PlayState* play) {
EnIg* this = THIS;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 28.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_dai_Skel_0130D0, NULL, this->jointTable, this->morphTable, 19);
- this->unk_3FC = -1;
- func_80BF1284(this, 0);
+ SkelAnime_InitFlex(play, &this->skelAnime, &object_dai_Skel_0130D0, NULL, this->jointTable, this->morphTable,
+ OBJECT_DAI_LIMB_MAX);
+ this->animIndex = ENIG_ANIM_NONE;
+ EnIg_ChangeAnim(this, ENIG_ANIM_0);
Collider_InitAndSetCylinder(play, &this->collider1, &this->actor, &sCylinderInit);
Collider_InitAndSetSphere(play, &this->collider2, &this->actor, &sSphereInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit);
@@ -947,12 +982,12 @@ void EnIg_Update(Actor* thisx, PlayState* play) {
func_80BF1B40(this, play);
if (this->scheduleResult != 0) {
- func_80BF1258(this);
+ EnIg_UpdateSkelAnime(this);
func_80BF13E4(this);
func_80BF15EC(this);
- func_8013C964(&this->actor, play, 60.0f, 30.0f, PLAYER_IA_NONE, this->unk_3D0 & 7);
+ SubS_Offer(&this->actor, play, 60.0f, 30.0f, PLAYER_IA_NONE, this->unk_3D0 & SUBS_OFFER_MODE_MASK);
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);
}
}
@@ -961,7 +996,7 @@ s32 EnIg_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po
Gfx** gfx) {
EnIg* this = THIS;
- if (limbIndex == 10) {
+ if (limbIndex == OBJECT_DAI_LIMB_0A) {
*dList = NULL;
}
return false;
@@ -974,7 +1009,7 @@ void EnIg_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
EnIg* this = THIS;
Vec3f sp2C;
- if (limbIndex == 11) {
+ if (limbIndex == OBJECT_DAI_LIMB_0B) {
Matrix_MultVec3f(&D_80BF3528, &this->actor.focus.pos);
Math_Vec3s_Copy(&this->actor.focus.rot, &this->actor.world.rot);
@@ -982,17 +1017,17 @@ void EnIg_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
gSPDisplayList((*gfx)++, object_dai_DL_0087B8);
}
- if (limbIndex == 12) {
+ if (limbIndex == OBJECT_DAI_LIMB_0C) {
gSPDisplayList((*gfx)++, object_dai_DL_0089D8);
}
- if (limbIndex == 9) {
+ if (limbIndex == OBJECT_DAI_LIMB_09) {
gSPDisplayList((*gfx)++, object_dai_DL_008B00);
Matrix_MultVec3f(&D_80BF351C, &sp2C);
Math_Vec3f_ToVec3s(&this->collider2.dim.worldSphere.center, &sp2C);
}
- if (limbIndex == 10) {
+ if (limbIndex == OBJECT_DAI_LIMB_0A) {
Matrix_Get(&this->unk_190);
}
}
@@ -1014,7 +1049,7 @@ void EnIg_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx, Gfx**
stepRot = false;
}
- if (limbIndex == 9) {
+ if (limbIndex == OBJECT_DAI_LIMB_09) {
SubS_UpdateLimb(this->unk_3E8 + 0x4000, this->unk_3EA + this->actor.shape.rot.y + 0x4000, &this->unk_2D4,
&this->unk_2E6, stepRot, overrideRot);
Matrix_Pop();
@@ -1036,7 +1071,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..71c7c509d 100644
--- a/src/overlays/actors/ovl_En_Ig/z_en_ig.h
+++ b/src/overlays/actors/ovl_En_Ig/z_en_ig.h
@@ -2,6 +2,7 @@
#define Z_EN_IG_H
#include "global.h"
+#include "objects/object_dai/object_dai.h"
struct EnIg;
@@ -9,7 +10,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;
@@ -38,11 +39,11 @@ typedef struct EnIg {
/* 0x2D4 */ Vec3f unk_2D4;
/* 0x2E0 */ UNK_TYPE1 unk2E0[0x6];
/* 0x2E6 */ Vec3s unk_2E6;
- /* 0x2EC */ Vec3s jointTable[19];
- /* 0x35E */ Vec3s morphTable[19];
+ /* 0x2EC */ Vec3s jointTable[OBJECT_DAI_LIMB_MAX];
+ /* 0x35E */ Vec3s morphTable[OBJECT_DAI_LIMB_MAX];
/* 0x3D0 */ u16 unk_3D0;
/* 0x3D2 */ u16 unk_3D2;
- /* 0x3D4 */ f32 unk_3D4;
+ /* 0x3D4 */ f32 animPlaySpeed;
/* 0x3D8 */ UNK_TYPE1 unk3D8[0x8];
/* 0x3E0 */ s16 unk_3E0;
/* 0x3E2 */ s16 unk_3E2;
@@ -57,7 +58,7 @@ typedef struct EnIg {
/* 0x3F4 */ s16 unk_3F4;
/* 0x3F6 */ s16 unk_3F6;
/* 0x3F8 */ EnIgUnkFunc unk_3F8;
- /* 0x3FC */ s32 unk_3FC;
+ /* 0x3FC */ s32 animIndex;
/* 0x400 */ UNK_TYPE1 unk400[0x8];
/* 0x408 */ s32 unk_408;
} EnIg; // size = 0x40C
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 4188f44c4..7f3ed6de4 100644
--- a/src/overlays/actors/ovl_En_Ik/z_en_ik.c
+++ b/src/overlays/actors/ovl_En_Ik/z_en_ik.c
@@ -6,8 +6,9 @@
#include "z_en_ik.h"
#include "z64rumble.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_400)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_400)
#define THIS ((EnIk*)thisx)
@@ -53,14 +54,14 @@ typedef struct {
/* 0x4 */ s16 unk04;
} EnIkUnkStruct; // size = 0x8
-EnIkUnkStruct sIronKnuckleArmorMarkings[] = {
- { gIronKnuckleHelmetMarkingDL, 0x0000 },
- { gIronKnuckleFrontTorsoArmorMarkingDL, 0x0000 },
- { gIronKnuckleRearTorsoArmorMarkingDL, 0x7FFF },
- { gIronKnuckleRivetsMarking2DL, 0x4000 },
- { gIronKnuckleRivetsMarking1DL, 0xC000 },
- { NULL, 0x4000 },
- { NULL, 0xC000 },
+EnIkUnkStruct sIronKnuckleArmorMarkings[IRON_KNUCKLE_ARMOR_BODYPART_MAX] = {
+ { gIronKnuckleHelmetMarkingDL, 0x0000 }, // IRON_KNUCKLE_ARMOR_BODYPART_HELMET
+ { gIronKnuckleFrontTorsoArmorMarkingDL, 0x0000 }, // IRON_KNUCKLE_ARMOR_BODYPART_CHEST_FRONT
+ { gIronKnuckleRearTorsoArmorMarkingDL, 0x7FFF }, // IRON_KNUCKLE_ARMOR_BODYPART_CHEST_BACK
+ { gIronKnuckleRivetsMarking2DL, 0x4000 }, // IRON_KNUCKLE_ARMOR_BODYPART_UPPER_LEFT_PAULDRON
+ { gIronKnuckleRivetsMarking1DL, -0x4000 }, // IRON_KNUCKLE_ARMOR_BODYPART_UPPER_RIGHT_PAULDRON
+ { NULL, 0x4000 }, // IRON_KNUCKLE_ARMOR_BODYPART_LOWER_LEFT_PAULDRON
+ { NULL, -0x4000 }, // IRON_KNUCKLE_ARMOR_BODYPART_LOWER_RIGHT_PAULDRON
};
// sIronKnuckleArmorType[PARAM_VALUE][ARMOR_SECTIONS]
@@ -169,8 +170,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 = {
@@ -266,7 +266,7 @@ void EnIk_Init(Actor* thisx, PlayState* play) {
this->morphTable, IRON_KNUCKLE_LIMB_MAX);
Collider_InitAndSetCylinder(play, &this->colliderCylinder, &this->actor, &sCylinderInit);
Collider_UpdateCylinder(&this->actor, &this->colliderCylinder);
- Collider_InitAndSetTris(play, &this->colliderTris, &this->actor, &sTrisInit, this->shieldColliderItems);
+ Collider_InitAndSetTris(play, &this->colliderTris, &this->actor, &sTrisInit, this->shieldColliderElements);
Collider_InitAndSetQuad(play, &this->colliderQuad, &this->actor, &sQuadInit);
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTableArmor, &sColChkInfoInit);
this->actor.params = IK_GET_ARMOR_TYPE(&this->actor);
@@ -300,14 +300,14 @@ void EnIk_Freeze(EnIk* this) {
this->drawDmgEffAlpha = 1.0f;
this->timer = 80;
this->actor.flags &= ~ACTOR_FLAG_400;
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 80);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 80);
}
void EnIk_Thaw(EnIk* this, PlayState* play) {
if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->drawDmgEffAlpha = 0.0f;
- Actor_SpawnIceEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), 2, 0.3f, 0.2f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, IRON_KNUCKLE_BODYPART_MAX, 2, 0.3f, 0.2f);
this->actor.flags |= ACTOR_FLAG_400;
}
}
@@ -318,7 +318,7 @@ void EnIk_HitArmor(EnIk* this, PlayState* play) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_LIGHT_ORBS;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->colliderCylinder.info.bumper.hitPos.x,
this->colliderCylinder.info.bumper.hitPos.y, this->colliderCylinder.info.bumper.hitPos.z, 0, 0, 0,
- CLEAR_TAG_LARGE_LIGHT_RAYS);
+ CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
}
s32 EnIk_IsChangingAction(EnIk* this, PlayState* play) {
@@ -356,7 +356,7 @@ s32 EnIk_ChooseAttack(EnIk* this) {
void EnIk_CheckActions(EnIk* this, PlayState* play) {
if (!EnIk_IsChangingAction(this, play) && !EnIk_ChooseAttack(this)) {
- if (this->drawArmorFlags) {
+ if (this->drawArmorFlags != 0) {
EnIk_SetupRun(this);
} else {
EnIk_SetupWalk(this);
@@ -365,17 +365,17 @@ void EnIk_CheckActions(EnIk* this, PlayState* play) {
}
void EnIk_SetupIdle(EnIk* this) {
- f32 frameCount = Animation_GetLastFrame(&gIronKnuckleHorizontalAttackAnim);
+ f32 endFrame = Animation_GetLastFrame(&gIronKnuckleHorizontalAttackAnim);
- if (this->drawArmorFlags) {
+ if (this->drawArmorFlags != 0) {
this->timer = 10;
} else {
this->timer = 0;
}
- Animation_Change(&this->skelAnime, &gIronKnuckleEndHorizontalAttackAnim, 1.0f, frameCount, frameCount,
- ANIMMODE_ONCE, this->timer);
+ Animation_Change(&this->skelAnime, &gIronKnuckleEndHorizontalAttackAnim, 1.0f, endFrame, endFrame, ANIMMODE_ONCE,
+ this->timer);
this->actionFunc = EnIk_Idle;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
void EnIk_Idle(EnIk* this, PlayState* play) {
@@ -386,7 +386,7 @@ void EnIk_Idle(EnIk* this, PlayState* play) {
EnIk_CheckActions(this, play);
}
} else if (this->colliderCylinder.base.acFlags & AC_HIT) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_IRONNACK_ARMOR_HIT);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_IRONNACK_ARMOR_HIT);
Audio_PlayBgm_StorePrevBgm(NA_BGM_MINI_BOSS);
this->actor.hintId = TATL_HINT_ID_IRON_KNUCKLE;
this->colliderCylinder.base.acFlags &= ~AC_HIT;
@@ -397,7 +397,7 @@ void EnIk_Idle(EnIk* this, PlayState* play) {
void EnIk_SetupWalk(EnIk* this) {
Animation_MorphToLoop(&this->skelAnime, &gIronKnuckleWalkAnim, -4.0f);
- this->actor.speedXZ = 0.9f;
+ this->actor.speed = 0.9f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = EnIk_WalkTowardsPlayer;
}
@@ -407,10 +407,10 @@ void EnIk_WalkTowardsPlayer(EnIk* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 16.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_IRONNACK_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_IRONNACK_WALK);
}
yawDiff = this->actor.wallYaw - this->actor.shape.rot.y;
- if ((this->actor.bgCheckFlags & 8) && (ABS_ALT(yawDiff) >= 0x4000)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) && (ABS_ALT(yawDiff) >= 0x4000)) {
yawDiff = (this->actor.yawTowardsPlayer > 0) ? this->actor.wallYaw - 0x4000 : this->actor.wallYaw + 0x4000;
Math_ScaledStepToS(&this->actor.shape.rot.y, yawDiff, 0x320);
} else {
@@ -424,8 +424,8 @@ void EnIk_WalkTowardsPlayer(EnIk* this, PlayState* play) {
void EnIk_SetupRun(EnIk* this) {
Animation_MorphToLoop(&this->skelAnime, &gIronKnuckleRunAnim, -4.0f);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_TWINROBA_SHOOT_VOICE);
- this->actor.speedXZ = 2.5f;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_TWINROBA_SHOOT_VOICE);
+ this->actor.speed = 2.5f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = EnIk_RunTowardsPlayer;
}
@@ -435,10 +435,10 @@ void EnIk_RunTowardsPlayer(EnIk* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (Animation_OnFrame(&this->skelAnime, 2.0f) || Animation_OnFrame(&this->skelAnime, 9.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_IRONNACK_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_IRONNACK_WALK);
}
yawDiff = this->actor.wallYaw - this->actor.shape.rot.y;
- if ((this->actor.bgCheckFlags & 8) && (ABS_ALT(yawDiff) >= 0x4000)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) && (ABS_ALT(yawDiff) >= 0x4000)) {
yawDiff = (this->actor.yawTowardsPlayer > 0) ? this->actor.wallYaw - 0x4000 : this->actor.wallYaw + 0x4000;
Math_ScaledStepToS(&this->actor.shape.rot.y, yawDiff, 0x4B0);
} else {
@@ -454,14 +454,14 @@ void EnIk_SetupVerticalAttack(EnIk* this) {
s32 pad;
f32 playbackSpeed;
- this->actor.speedXZ = 0.0f;
- if (this->drawArmorFlags) {
+ this->actor.speed = 0.0f;
+ if (this->drawArmorFlags != 0) {
playbackSpeed = 1.5f;
} else {
playbackSpeed = 1.2f;
}
Animation_Change(&this->skelAnime, &gIronKnuckleVerticalAttackAnim, playbackSpeed, 0.0f,
- Animation_GetLastFrame(&gIronKnuckleVerticalAttackAnim.common), 3, -4.0f);
+ Animation_GetLastFrame(&gIronKnuckleVerticalAttackAnim.common), ANIMMODE_ONCE_INTERP, -4.0f);
this->timer = 0;
this->blurEffectSpawnLock = -1;
this->actionFunc = EnIk_VerticalAttack;
@@ -473,13 +473,13 @@ void EnIk_VerticalAttack(EnIk* this, PlayState* play) {
this->timer++;
if (!(this->skelAnime.curFrame < 7.0f) || !EnIk_IsChangingAction(this, play)) {
if (Animation_OnFrame(&this->skelAnime, 15.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_IRONNACK_SWING_AXE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_IRONNACK_SWING_AXE);
} else if (Animation_OnFrame(&this->skelAnime, 21.0f)) {
particlePos.x = (Math_SinS((this->actor.shape.rot.y + 0x6A4)) * 70.0f) + this->actor.world.pos.x;
particlePos.z = (Math_CosS((this->actor.shape.rot.y + 0x6A4)) * 70.0f) + this->actor.world.pos.z;
particlePos.y = this->actor.world.pos.y;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_IRONNACK_HIT_GND);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_IRONNACK_HIT_GND);
Camera_AddQuake(GET_ACTIVE_CAM(play), 2, 25, 5);
Rumble_Request(this->actor.xyzDistToPlayerSq, 180, 20, 100);
CollisionCheck_SpawnShieldParticles(play, &particlePos);
@@ -487,12 +487,12 @@ 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.speedXZ = sin_rad((this->skelAnime.curFrame - 13.0f) * (M_PI / 20)) * 10.0f;
+ if (this->drawArmorFlags != 0) {
+ this->actor.speed = Math_SinF((this->skelAnime.curFrame - 13.0f) * (M_PI / 20)) * 10.0f;
}
} else {
this->colliderQuad.base.atFlags &= ~AT_ON;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
if ((this->drawArmorFlags) && (this->skelAnime.curFrame < 13.0f)) {
@@ -508,7 +508,7 @@ void EnIk_VerticalAttack(EnIk* this, PlayState* play) {
void EnIk_SetupTakeOutAxe(EnIk* this) {
Animation_PlayOnce(&this->skelAnime, &gIronKnuckleEndVerticalAttackAnim);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_IRONNACK_PULLOUT);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_IRONNACK_PULLOUT);
this->actionFunc = EnIk_TakeOutAxe;
}
@@ -525,7 +525,7 @@ void EnIk_TakeOutAxe(EnIk* this, PlayState* play) {
}
void EnIk_SetupHorizontalDoubleAttack(EnIk* this) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
Animation_Change(&this->skelAnime, &gIronKnuckleHorizontalAttackAnim, (this->drawArmorFlags) ? 1.3f : 1.0f, 0.0f,
Animation_GetLastFrame(&gIronKnuckleHorizontalAttackAnim.common), ANIMMODE_ONCE_INTERP,
(this->drawArmorFlags) ? 4.0f : 10.0f);
@@ -538,12 +538,12 @@ void EnIk_HorizontalDoubleAttack(EnIk* this, PlayState* play) {
f32 phi_f2;
this->timer++;
- if ((Animation_OnFrame(&this->skelAnime, 1.0f)) || (Animation_OnFrame(&this->skelAnime, 13.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_IRONNACK_SWING_AXE);
+ if (Animation_OnFrame(&this->skelAnime, 1.0f) || Animation_OnFrame(&this->skelAnime, 13.0f)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_IRONNACK_SWING_AXE);
}
if (((this->skelAnime.curFrame > 1.0f) && (this->skelAnime.curFrame < 9.0f)) ||
((this->skelAnime.curFrame > 12.0f) && (this->skelAnime.curFrame < 20.0f))) {
- if (this->drawArmorFlags) {
+ if (this->drawArmorFlags != 0) {
Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0x5DC);
this->actor.world.rot.y = this->actor.shape.rot.y;
if (this->skelAnime.curFrame > 12.0f) {
@@ -551,12 +551,12 @@ void EnIk_HorizontalDoubleAttack(EnIk* this, PlayState* play) {
} else {
phi_f2 = this->skelAnime.curFrame - 1.0f;
}
- this->actor.speedXZ = 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 {
this->colliderQuad.base.atFlags &= ~AT_ON;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
if (SkelAnime_Update(&this->skelAnime)) {
EnIk_SetupEndHorizontalAttack(this);
@@ -566,8 +566,8 @@ void EnIk_HorizontalDoubleAttack(EnIk* this, PlayState* play) {
void EnIk_SetupSingleHorizontalAttack(EnIk* this) {
f32 playSpeed;
- this->actor.speedXZ = 0.0f;
- if (this->drawArmorFlags) {
+ this->actor.speed = 0.0f;
+ if (this->drawArmorFlags != 0) {
this->actor.world.rot.z = 0x1000;
playSpeed = 1.3f;
} else {
@@ -584,7 +584,7 @@ void EnIk_SetupSingleHorizontalAttack(EnIk* this) {
void EnIk_SingleHorizontalAttack(EnIk* this, PlayState* play) {
this->timer++;
if (Animation_OnFrame(&this->skelAnime, 13.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_IRONNACK_SWING_AXE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_IRONNACK_SWING_AXE);
}
if ((this->skelAnime.curFrame > 12.0f) && (this->skelAnime.curFrame < 20.0f)) {
this->colliderQuad.base.atFlags |= AT_ON;
@@ -611,7 +611,7 @@ void EnIk_EndHorizontalAttack(EnIk* this, PlayState* play) {
}
void EnIk_SetupBlock(EnIk* this) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
Animation_Change(&this->skelAnime, &gIronKnuckleBlockAnim, 2.0f, 0.0f,
Animation_GetLastFrame(&gIronKnuckleBlockAnim), ANIMMODE_ONCE, -2.0f);
this->timer = 20;
@@ -634,7 +634,7 @@ void EnIk_SetupReactToAttack(EnIk* this, s32 arg1) {
if (arg1) {
func_800BE504(&this->actor, &this->colliderCylinder);
}
- this->actor.speedXZ = 6.0f;
+ this->actor.speed = 6.0f;
temp_v0 = (this->actor.world.rot.y - this->actor.shape.rot.y) + 0x8000;
if (ABS_ALT(temp_v0) <= 0x4000) {
Animation_MorphToPlayOnce(&this->skelAnime, &gIronKnuckleFrontHitAnim, -4.0f);
@@ -645,13 +645,13 @@ void EnIk_SetupReactToAttack(EnIk* this, s32 arg1) {
}
void EnIk_ReactToAttack(EnIk* this, PlayState* play) {
- Math_StepToF(&this->actor.speedXZ, 0.0f, 1.0f);
+ Math_StepToF(&this->actor.speed, 0.0f, 1.0f);
if (this->subCamId != SUB_CAM_ID_DONE) {
Play_SetCameraAtEye(play, this->subCamId, &this->actor.focus.pos, &Play_GetCamera(play, this->subCamId)->eye);
}
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 {
@@ -664,10 +664,10 @@ void EnIk_ReactToAttack(EnIk* this, PlayState* play) {
}
void EnIk_SetupDie(EnIk* this) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
Animation_MorphToPlayOnce(&this->skelAnime, &gIronKnuckleDeathAnim, -4.0f);
this->timer = 24;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_IRONNACK_DEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_IRONNACK_DEAD);
this->actionFunc = EnIk_Die;
}
@@ -686,26 +686,26 @@ 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);
}
}
} else if (Animation_OnFrame(&this->skelAnime, 23.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_IRONNACK_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_IRONNACK_WALK);
}
}
void EnIk_SetupFrozen(EnIk* this) {
this->invincibilityFrames = 0;
this->actionFunc = EnIk_Frozen;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
void EnIk_Frozen(EnIk* this, PlayState* play) {
@@ -723,8 +723,8 @@ void EnIk_Frozen(EnIk* this, PlayState* play) {
}
void EnIk_SetupCutscene(EnIk* this) {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
- this->actor.speedXZ = 0.0f;
+ CutsceneManager_Queue(this->actor.csId);
+ this->actor.speed = 0.0f;
if (this->actor.colChkInfo.health != 0) {
func_800BE504(&this->actor, &this->colliderCylinder);
}
@@ -735,10 +735,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 +750,7 @@ void EnIk_PlayCutscene(EnIk* this, PlayState* play) {
EnIk_SetupDie(this);
}
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -776,7 +776,7 @@ void EnIk_UpdateDamage(EnIk* this, PlayState* play) {
if ((this->actor.colChkInfo.damageEffect != DMG_EFF_IMMUNE) &&
((this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) ||
(!(this->colliderCylinder.info.acHitInfo->toucher.dmgFlags & 0xDB0B3)))) {
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 12);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 12);
this->invincibilityFrames = 12;
EnIk_Thaw(this, play);
this->colliderQuad.base.atFlags &= ~AT_ON;
@@ -793,9 +793,9 @@ void EnIk_UpdateDamage(EnIk* this, PlayState* play) {
this->drawArmorFlags = 1;
this->colliderCylinder.base.colType = 3;
this->actor.colChkInfo.damageTable = &sDamageTableNoArmor;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_IRONNACK_ARMOR_OFF_DEMO);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_IRONNACK_ARMOR_OFF_DEMO);
EnIk_SetupCutscene(this);
- } else if (this->drawArmorFlags) {
+ } else if (this->drawArmorFlags != 0) {
if (this->actor.colChkInfo.damageEffect == DMG_EFF_ICE) {
EnIk_Freeze(this);
EnIk_SetupFrozen(this);
@@ -811,7 +811,7 @@ void EnIk_UpdateDamage(EnIk* this, PlayState* play) {
} else if (this->actor.colChkInfo.damageEffect == DMG_EFF_LIGHT_SPARKS) {
EnIk_HitArmor(this, play);
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_IRONNACK_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_IRONNACK_DAMAGE);
if (this->actor.colChkInfo.health != 0) {
EnIk_SetupReactToAttack(this, true);
} else {
@@ -819,8 +819,8 @@ void EnIk_UpdateDamage(EnIk* this, PlayState* play) {
}
}
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_IRONNACK_ARMOR_HIT);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_IRONNACK_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_IRONNACK_ARMOR_HIT);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_IRONNACK_DAMAGE);
if (this->actor.colChkInfo.damageEffect == 4) {
EnIk_HitArmor(this, play);
}
@@ -846,9 +846,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 +870,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) {
@@ -920,38 +922,95 @@ void EnIk_Update(Actor* thisx, PlayState* play2) {
this->drawDmgEffScale = this->drawDmgEffScale;
}
} else if (!Math_StepToF(&this->drawDmgEffFrozenSteamScale, 0.65f, 0.01625f)) {
- func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
}
EnIk_UpdateArmor(this, play);
}
-s8 D_8092C1A8[] = {
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 3, 5, 4, 6, 1, 2, -1, -1, 0, 0,
+static s8 sLimbToArmorBodyParts[IRON_KNUCKLE_LIMB_MAX] = {
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_NONE
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_ROOT
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_TASSET_CENTER
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_TASSET_RIGHT
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_RIGHT_LEG
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_RIGHT_FOOT
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_TASSET_LEFT
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_LEFT_LEG
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_LEFT_FOOT
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_UPPER_BODY_ROOT
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_UNK_ROOT
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_HEAD_ROOT
+ IRON_KNUCKLE_ARMOR_BODYPART_HELMET, // IRON_KNUCKLE_LIMB_HELMET_ARMOR
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_HEAD
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_RIGHT_UPPER_ARM
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_RIGHT_FOREARM
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_AXE_ROOT
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_AXE
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_RIGHT_HAND
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_LEFT_UPPER_ARM
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_LEFT_FOREARM
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_LEFT_HAND
+ IRON_KNUCKLE_ARMOR_BODYPART_UPPER_LEFT_PAULDRON, // IRON_KNUCKLE_LIMB_UPPER_LEFT_PAULDRON
+ IRON_KNUCKLE_ARMOR_BODYPART_LOWER_LEFT_PAULDRON, // IRON_KNUCKLE_LIMB_LOWER_LEFT_PAULDRON
+ IRON_KNUCKLE_ARMOR_BODYPART_UPPER_RIGHT_PAULDRON, // IRON_KNUCKLE_LIMB_UPPER_RIGHT_PAULDRON
+ IRON_KNUCKLE_ARMOR_BODYPART_LOWER_RIGHT_PAULDRON, // IRON_KNUCKLE_LIMB_LOWER_RIGHT_PAULDRON
+ IRON_KNUCKLE_ARMOR_BODYPART_CHEST_FRONT, // IRON_KNUCKLE_LIMB_CHEST_ARMOR_FRONT
+ IRON_KNUCKLE_ARMOR_BODYPART_CHEST_BACK, // IRON_KNUCKLE_LIMB_CHEST_ARMOR_BACK
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_TORSO
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_WAIST
};
s32 EnIk_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnIk* this = THIS;
- if (this->drawArmorFlags) {
- if (D_8092C1A8[limbIndex] > 0) {
+ if (this->drawArmorFlags != 0) {
+ if (sLimbToArmorBodyParts[limbIndex] >= IRON_KNUCKLE_ARMOR_BODYPART_CHEST_FRONT) {
*dList = NULL;
}
}
return false;
}
-void EnIk_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
- static Vec3f D_8092C1C8 = { 2000.0f, -200.0f, -5200.0f };
- static Vec3f D_8092C1D4 = { 300.0f, -200.0f, 0.0f };
- static s8 limbPosIndex[] = {
- -1, -1, -1, 0, 1, 2, 3, 4, 5, -1, -1, -1, 6, -1, -1, 7,
- -1, -1, 8, -1, 9, 10, -1, 11, -1, 12, -1, -1, -1, -1, 0, 0,
- };
+static Vec3f D_8092C1C8 = { 2000.0f, -200.0f, -5200.0f };
+static Vec3f D_8092C1D4 = { 300.0f, -200.0f, 0.0f };
+static s8 sLimbToBodyParts[IRON_KNUCKLE_LIMB_MAX] = {
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_NONE
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_ROOT
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_TASSET_CENTER
+ IRON_KNUCKLE_BODYPART_TASSET_RIGHT, // IRON_KNUCKLE_LIMB_TASSET_RIGHT
+ IRON_KNUCKLE_BODYPART_RIGHT_LEG, // IRON_KNUCKLE_LIMB_RIGHT_LEG
+ IRON_KNUCKLE_BODYPART_RIGHT_FOOT, // IRON_KNUCKLE_LIMB_RIGHT_FOOT
+ IRON_KNUCKLE_BODYPART_TASSET_LEFT, // IRON_KNUCKLE_LIMB_TASSET_LEFT
+ IRON_KNUCKLE_BODYPART_LEFT_LEG, // IRON_KNUCKLE_LIMB_LEFT_LEG
+ IRON_KNUCKLE_BODYPART_LEFT_FOOT, // IRON_KNUCKLE_LIMB_LEFT_FOOT
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_UPPER_BODY_ROOT
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_UNK_ROOT
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_HEAD_ROOT
+ IRON_KNUCKLE_BODYPART_HELMET_ARMOR, // IRON_KNUCKLE_LIMB_HELMET_ARMOR
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_HEAD
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_RIGHT_UPPER_ARM
+ IRON_KNUCKLE_BODYPART_RIGHT_FOREARM, // IRON_KNUCKLE_LIMB_RIGHT_FOREARM
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_AXE_ROOT
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_AXE
+ IRON_KNUCKLE_BODYPART_RIGHT_HAND, // IRON_KNUCKLE_LIMB_RIGHT_HAND
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_LEFT_UPPER_ARM
+ IRON_KNUCKLE_BODYPART_LEFT_FOREARM, // IRON_KNUCKLE_LIMB_LEFT_FOREARM
+ IRON_KNUCKLE_BODYPART_LEFT_HAND, // IRON_KNUCKLE_LIMB_LEFT_HAND
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_UPPER_LEFT_PAULDRON
+ IRON_KNUCKLE_BODYPART_LOWER_LEFT_PAULDRON, // IRON_KNUCKLE_LIMB_LOWER_LEFT_PAULDRON
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_UPPER_RIGHT_PAULDRON
+ IRON_KNUCKLE_BODYPART_LOWER_RIGHT_PAULDRON, // IRON_KNUCKLE_LIMB_LOWER_RIGHT_PAULDRON
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_CHEST_ARMOR_FRONT
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_CHEST_ARMOR_BACK
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_TORSO
+ BODYPART_NONE, // IRON_KNUCKLE_LIMB_WAIST
+};
+
+void EnIk_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnIk* this = THIS;
- s32 index = D_8092C1A8[limbIndex];
+ s32 armorBodyPart = sLimbToArmorBodyParts[limbIndex];
Gfx* xlu;
IronKnuckleEffect* ikEffect;
s16 sp76;
@@ -962,15 +1021,16 @@ void EnIk_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
MtxF* mf;
if (this->drawArmorFlags == 0x1) {
- if (index > 0) {
- ikEffect = &this->effects[index];
+ if (armorBodyPart >= IRON_KNUCKLE_ARMOR_BODYPART_CHEST_FRONT) {
+ ikEffect = &this->effects[armorBodyPart];
mf = Matrix_GetCurrent();
ikEffect->pos.x = mf->mf[3][0];
ikEffect->pos.y = mf->mf[3][1];
ikEffect->pos.z = mf->mf[3][2];
Matrix_MtxFToYXZRot(mf, &ikEffect->rot, false);
ikEffect->enabled = true;
- sp76 = sIronKnuckleArmorMarkings[index].unk04 + (((s32)Rand_Next() >> 0x13) + this->actor.shape.rot.y);
+ sp76 =
+ sIronKnuckleArmorMarkings[armorBodyPart].unk04 + (((s32)Rand_Next() >> 0x13) + this->actor.shape.rot.y);
ikEffect->vel.x = Math_SinS(sp76) * 5.0f;
ikEffect->vel.y = 6.0f;
ikEffect->vel.z = Math_CosS(sp76) * 5.0f;
@@ -1002,18 +1062,19 @@ void EnIk_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
this->blurEffectSpawnLock = this->timer;
}
- if (limbPosIndex[limbIndex] != -1) {
- Matrix_MultZero(&this->limbPos[limbPosIndex[limbIndex]]);
+ if (sLimbToBodyParts[limbIndex] != BODYPART_NONE) {
+ Matrix_MultZero(&this->bodyPartsPos[sLimbToBodyParts[limbIndex]]);
}
- if ((index == 0) ||
- ((index != -1) && (this->drawArmorFlags == 0) && (sIronKnuckleArmorMarkings[index].unk00 != 0))) {
+ if ((armorBodyPart == IRON_KNUCKLE_ARMOR_BODYPART_HELMET) ||
+ ((armorBodyPart != BODYPART_NONE) && (this->drawArmorFlags == 0) &&
+ (sIronKnuckleArmorMarkings[armorBodyPart].unk00 != NULL))) {
OPEN_DISPS(play->state.gfxCtx);
xlu = POLY_XLU_DISP;
gSPMatrix(&xlu[0], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(&xlu[1], sIronKnuckleArmorMarkings[index].unk00);
+ gSPDisplayList(&xlu[1], sIronKnuckleArmorMarkings[armorBodyPart].unk00);
POLY_XLU_DISP = &xlu[2];
CLOSE_DISPS(play->state.gfxCtx);
@@ -1031,6 +1092,7 @@ void EnIk_UpdateArmorDraw(EnIk* this, PlayState* play) {
sp54 = 0;
OPEN_DISPS(play->state.gfxCtx);
+
gfxOpa = POLY_OPA_DISP;
gfxXlu = POLY_XLU_DISP;
@@ -1064,7 +1126,7 @@ void EnIk_UpdateArmorDraw(EnIk* this, PlayState* play) {
}
void EnIk_Draw(Actor* thisx, PlayState* play) {
- static Vec3f D_8092C200 = { 0.53f, 0.53f, 0.53f };
+ static Vec3f sScale = { 0.53f, 0.53f, 0.53f };
EnIk* this = THIS;
Gfx* gfx;
Gfx** gfxArmorType;
@@ -1075,10 +1137,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]);
@@ -1091,8 +1153,8 @@ void EnIk_Draw(Actor* thisx, PlayState* play) {
if (this->actor.colorFilterTimer != 0) {
func_800AE5A0(play);
}
- func_800BC620(&this->actor.focus.pos, &D_8092C200, 255, play);
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), this->drawDmgEffScale,
+ func_800BC620(&this->actor.focus.pos, &sScale, 255, play);
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, IRON_KNUCKLE_BODYPART_MAX, this->drawDmgEffScale,
this->drawDmgEffFrozenSteamScale, this->drawDmgEffAlpha, this->drawDmgEffType);
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_En_Ik/z_en_ik.h b/src/overlays/actors/ovl_En_Ik/z_en_ik.h
index 3489329b1..a6d56bca6 100644
--- a/src/overlays/actors/ovl_En_Ik/z_en_ik.h
+++ b/src/overlays/actors/ovl_En_Ik/z_en_ik.h
@@ -24,6 +24,34 @@ typedef struct {
/* 0x24 */ s32 enabled;
} IronKnuckleEffect; // size = 0x28
+typedef enum IronKnuckleBodyPart {
+ /* 0 */ IRON_KNUCKLE_BODYPART_TASSET_RIGHT,
+ /* 1 */ IRON_KNUCKLE_BODYPART_RIGHT_LEG,
+ /* 2 */ IRON_KNUCKLE_BODYPART_RIGHT_FOOT,
+ /* 3 */ IRON_KNUCKLE_BODYPART_TASSET_LEFT,
+ /* 4 */ IRON_KNUCKLE_BODYPART_LEFT_LEG,
+ /* 5 */ IRON_KNUCKLE_BODYPART_LEFT_FOOT,
+ /* 6 */ IRON_KNUCKLE_BODYPART_HELMET_ARMOR,
+ /* 7 */ IRON_KNUCKLE_BODYPART_RIGHT_FOREARM,
+ /* 8 */ IRON_KNUCKLE_BODYPART_RIGHT_HAND,
+ /* 9 */ IRON_KNUCKLE_BODYPART_LEFT_FOREARM,
+ /* 10 */ IRON_KNUCKLE_BODYPART_LEFT_HAND,
+ /* 11 */ IRON_KNUCKLE_BODYPART_LOWER_LEFT_PAULDRON,
+ /* 12 */ IRON_KNUCKLE_BODYPART_LOWER_RIGHT_PAULDRON,
+ /* 13 */ IRON_KNUCKLE_BODYPART_MAX
+} IronKnuckleBodyPart;
+
+typedef enum IronKnuckleArmorBodyPart {
+ /* 0 */ IRON_KNUCKLE_ARMOR_BODYPART_HELMET,
+ /* 1 */ IRON_KNUCKLE_ARMOR_BODYPART_CHEST_FRONT,
+ /* 2 */ IRON_KNUCKLE_ARMOR_BODYPART_CHEST_BACK,
+ /* 3 */ IRON_KNUCKLE_ARMOR_BODYPART_UPPER_LEFT_PAULDRON,
+ /* 4 */ IRON_KNUCKLE_ARMOR_BODYPART_UPPER_RIGHT_PAULDRON,
+ /* 5 */ IRON_KNUCKLE_ARMOR_BODYPART_LOWER_LEFT_PAULDRON,
+ /* 6 */ IRON_KNUCKLE_ARMOR_BODYPART_LOWER_RIGHT_PAULDRON,
+ /* 7 */ IRON_KNUCKLE_ARMOR_BODYPART_MAX
+} IronKnuckleArmorBodyPart;
+
typedef struct EnIk {
/* 0x0000 */ Actor actor;
/* 0x0144 */ SkelAnime skelAnime;
@@ -40,12 +68,12 @@ typedef struct EnIk {
/* 0x0304 */ f32 drawDmgEffAlpha;
/* 0x0308 */ f32 drawDmgEffScale;
/* 0x030C */ f32 drawDmgEffFrozenSteamScale;
- /* 0x0310 */ Vec3f limbPos[13];
+ /* 0x0310 */ Vec3f bodyPartsPos[IRON_KNUCKLE_BODYPART_MAX];
/* 0x03AC */ ColliderCylinder colliderCylinder;
/* 0x03F8 */ ColliderQuad colliderQuad;
/* 0x0478 */ ColliderTris colliderTris;
- /* 0x0498 */ ColliderTrisElement shieldColliderItems[2];
- /* 0x0550 */ IronKnuckleEffect effects[7];
+ /* 0x0498 */ ColliderTrisElement shieldColliderElements[2];
+ /* 0x0550 */ IronKnuckleEffect effects[IRON_KNUCKLE_ARMOR_BODYPART_MAX];
} EnIk; // size = 0x668
#endif // Z_EN_IK_H
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 3a83564e5..54b21b7ba 100644
--- a/src/overlays/actors/ovl_En_In/z_en_in.c
+++ b/src/overlays/actors/ovl_En_In/z_en_in.c
@@ -5,10 +5,10 @@
*/
#include "z_en_in.h"
-#include "objects/object_in/object_in.h"
+#include "z64horse.h"
#include "overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnIn*)thisx)
@@ -118,25 +118,25 @@ static DamageTable sDamageTable = {
/* Powder Keg */ DMG_ENTRY(0, 0x0),
};
-static AnimationInfoS sAnimationInfo[] = {
- { &object_in_Anim_001D10, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_in_Anim_001D10, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_in_Anim_014F8C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_in_Anim_014F8C, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_in_Anim_000CB0, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_in_Anim_0003B4, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_in_Anim_001BE0, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_in_Anim_015918, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_in_Anim_01C0B0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_in_Anim_01C0B0, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_in_Anim_01A140, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_in_Anim_01A140, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_in_Anim_01B904, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_in_Anim_01B904, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_in_Anim_01B3C4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_in_Anim_01B3C4, 0.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_in_Anim_01B3C4, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_in_Anim_019EB4, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
+static AnimationInfoS sAnimationInfo[ENIN_ANIM_MAX] = {
+ { &object_in_Anim_001D10, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENIN_ANIM_0
+ { &object_in_Anim_001D10, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIN_ANIM_1
+ { &object_in_Anim_014F8C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENIN_ANIM_2
+ { &object_in_Anim_014F8C, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIN_ANIM_3
+ { &object_in_Anim_000CB0, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIN_ANIM_4
+ { &object_in_Anim_0003B4, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIN_ANIM_5
+ { &object_in_Anim_001BE0, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIN_ANIM_6
+ { &object_in_Anim_015918, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIN_ANIM_7
+ { &object_in_Anim_01C0B0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENIN_ANIM_8
+ { &object_in_Anim_01C0B0, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIN_ANIM_9
+ { &object_in_Anim_01A140, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENIN_ANIM_10
+ { &object_in_Anim_01A140, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIN_ANIM_11
+ { &object_in_Anim_01B904, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENIN_ANIM_12
+ { &object_in_Anim_01B904, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIN_ANIM_13
+ { &object_in_Anim_01B3C4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENIN_ANIM_14
+ { &object_in_Anim_01B3C4, 0.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENIN_ANIM_15
+ { &object_in_Anim_01B3C4, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENIN_ANIM_16
+ { &object_in_Anim_019EB4, 1.0f, 0, -1, ANIMMODE_ONCE, -4 }, // ENIN_ANIM_17
};
static TrackOptionsSet sTrackOptions = {
@@ -147,20 +147,20 @@ static TrackOptionsSet sTrackOptions = {
};
s32 EnIn_ChangeAnim(SkelAnime* skelAnime, s16 animIndex) {
- s16 frameCount;
- s32 ret = false;
+ s16 endFrame;
+ s32 didAnimChange = false;
- if (animIndex >= 0 && animIndex < 18) {
- ret = true;
- frameCount = sAnimationInfo[animIndex].frameCount;
- if (frameCount < 0) {
- frameCount = Animation_GetLastFrame(sAnimationInfo[animIndex].animation);
+ if ((animIndex > ENIN_ANIM_NONE) && (animIndex < ENIN_ANIM_MAX)) {
+ didAnimChange = true;
+ endFrame = sAnimationInfo[animIndex].frameCount;
+ if (endFrame < 0) {
+ endFrame = Animation_GetLastFrame(sAnimationInfo[animIndex].animation);
}
Animation_Change(skelAnime, sAnimationInfo[animIndex].animation, sAnimationInfo[animIndex].playSpeed,
- sAnimationInfo[animIndex].startFrame, frameCount, sAnimationInfo[animIndex].mode,
+ sAnimationInfo[animIndex].startFrame, endFrame, sAnimationInfo[animIndex].mode,
sAnimationInfo[animIndex].morphFrames);
}
- return ret;
+ return didAnimChange;
}
s32 func_808F3178(EnIn* this, PlayState* play) {
@@ -169,12 +169,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_PlaySfxAtPos(&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_PlaySfxAtPos(&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;
@@ -214,7 +214,7 @@ s32 func_808F3334(EnIn* this, PlayState* play) {
if (this->colliderJntSph.base.atFlags & AT_BOUNCED) {
return 0;
}
- Actor_PlaySfxAtPos(&player->actor, NA_SE_PL_BODY_HIT);
+ Actor_PlaySfx(&player->actor, NA_SE_PL_BODY_HIT);
func_800B8D98(play, &this->actor, 3.0f, this->actor.yawTowardsPlayer, 6.0f);
}
return 1;
@@ -224,7 +224,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;
}
@@ -252,7 +252,7 @@ void func_808F3414(EnIn* this, PlayState* play) {
}
func_808F322C(this, 3);
func_808F3178(this, play);
- SubS_FillLimbRotTables(play, this->unk376, this->unk39E, ARRAY_COUNT(this->unk376));
+ SubS_UpdateFidgetTables(play, this->fidgetTableY, this->fidgetTableZ, OBJECT_IN_LIMB_MAX);
}
void func_808F35AC(EnIn* this, PlayState* play) {
@@ -273,10 +273,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;
@@ -287,8 +287,8 @@ void func_808F3690(EnIn* this, PlayState* play) {
s16 sp36;
Vec3f sp28;
- Math_SmoothStepToF(&this->actor.speedXZ, 1.0f, 0.4f, 1000.0f, 0.0f);
- sp36 = this->actor.speedXZ * 400.0f;
+ Math_SmoothStepToF(&this->actor.speed, 1.0f, 0.4f, 1000.0f, 0.0f);
+ sp36 = this->actor.speed * 400.0f;
if (SubS_CopyPointFromPath(this->path, this->unk244, &sp28) && SubS_MoveActorToPoint(&this->actor, &sp28, sp36)) {
this->unk244++;
if (this->unk244 >= this->path->count) {
@@ -298,28 +298,37 @@ void func_808F3690(EnIn* this, PlayState* play) {
}
void func_808F374C(EnIn* this, PlayState* play) {
- AnimationHeader* sAnimations[] = {
- &object_in_Anim_015E38, &object_in_Anim_016A60, &object_in_Anim_0177AC, &object_in_Anim_016484,
- &object_in_Anim_0170DC, &object_in_Anim_018240, &object_in_Anim_0187C8, &object_in_Anim_0198A8,
+ AnimationHeader* sAnimations[ENIN_ANIM2_MAX] = {
+ &object_in_Anim_015E38, // ENIN_ANIM2_0
+ &object_in_Anim_016A60, // ENIN_ANIM2_1
+ &object_in_Anim_0177AC, // ENIN_ANIM2_2
+ &object_in_Anim_016484, // ENIN_ANIM2_3
+ &object_in_Anim_0170DC, // ENIN_ANIM2_4
+ &object_in_Anim_018240, // ENIN_ANIM2_5
+ &object_in_Anim_0187C8, // ENIN_ANIM2_6
+ &object_in_Anim_0198A8, // ENIN_ANIM2_7
};
- if (this->skelAnime.animation == &object_in_Anim_016484 || this->skelAnime.animation == &object_in_Anim_0170DC) {
+ if ((this->skelAnime.animation == &object_in_Anim_016484) ||
+ (this->skelAnime.animation == &object_in_Anim_0170DC)) {
if (Animation_OnFrame(&this->skelAnime, 8.0f)) {
- func_8019F88C(&this->actor.projectedPos, NA_SE_VO_IN_LASH_0, 2);
+ Audio_PlaySfx_Randomized(&this->actor.projectedPos, NA_SE_VO_IN_LASH_0, 2);
if (Rand_ZeroOne() < 0.3f) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_IT_INGO_HORSE_NEIGH);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_IT_INGO_HORSE_NEIGH);
}
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_IT_LASH);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_IT_LASH);
}
}
- if (this->skelAnime.animation == &object_in_Anim_0198A8 && Animation_OnFrame(&this->skelAnime, 20.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_VO_IN_CRY_0);
+
+ if ((this->skelAnime.animation == &object_in_Anim_0198A8) && Animation_OnFrame(&this->skelAnime, 20.0f)) {
+ Actor_PlaySfx(&this->actor, NA_SE_VO_IN_CRY_0);
}
+
if (SkelAnime_Update(&this->skelAnime)) {
- this->unk488 %= ARRAY_COUNT(sAnimations);
- this->unk486 = this->unk488;
- Animation_Change(&this->skelAnime, sAnimations[this->unk488], 1.0f, 0.0f,
- Animation_GetLastFrame(sAnimations[this->unk488]), ANIMMODE_ONCE, -10.0f);
+ this->animIndex2 %= ENIN_ANIM2_MAX;
+ this->unk486 = this->animIndex2;
+ Animation_Change(&this->skelAnime, sAnimations[this->animIndex2], 1.0f, 0.0f,
+ Animation_GetLastFrame(sAnimations[this->animIndex2]), ANIMMODE_ONCE, -10.0f);
}
}
@@ -328,7 +337,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 +345,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)) {
@@ -344,7 +353,7 @@ void func_808F395C(EnIn* this, PlayState* play) {
this->actionFunc = func_808F5A34;
this->unk48C = 1;
} else {
- func_800B8614(&this->actor, play, 200.0f);
+ Actor_OfferTalk(&this->actor, play, 200.0f);
}
}
@@ -352,33 +361,41 @@ 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) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_VO_IN_LOST);
+ if (this->unk4B0 == WEEKEVENTREG_HORSE_RACE_STATE_2) {
+ Actor_PlaySfx(&this->actor, NA_SE_VO_IN_LOST);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_VO_IN_JOY0);
+ Actor_PlaySfx(&this->actor, NA_SE_VO_IN_JOY0);
}
}
@@ -388,7 +405,7 @@ void func_808F3AD4(EnIn* this, PlayState* play) {
this->unk48C = 1;
this->actionFunc = func_808F5A94;
} else {
- func_800B85E0(&this->actor, play, 200.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 200.0f, PLAYER_IA_MINUS1);
}
}
@@ -399,10 +416,10 @@ void func_808F3B40(EnIn* this, PlayState* play) {
this->actor.parent = NULL;
this->actor.flags |= ACTOR_FLAG_10000;
this->actionFunc = func_808F3AD4;
- textId = gSaveContext.save.day != 3 ? 0x3481 : 0x34A4;
+ textId = (gSaveContext.save.day != 3) ? 0x3481 : 0x34A4;
this->actor.textId = textId;
} else {
- Actor_PickUp(&this->actor, play, GI_MILK, 500.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_MILK, 500.0f, 100.0f);
}
}
@@ -412,7 +429,7 @@ void func_808F3BD4(EnIn* this, PlayState* play) {
this->unk48C = 1;
this->actionFunc = func_808F5A94;
} else {
- func_800B85E0(&this->actor, play, 200.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 200.0f, PLAYER_IA_MINUS1);
}
}
@@ -426,7 +443,7 @@ void func_808F3C40(EnIn* this, PlayState* play) {
textId = gSaveContext.save.day != 3 ? 0x346A : 0x3492;
this->actor.textId = textId;
} else {
- Actor_PickUp(&this->actor, play, GI_MILK, 500.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_MILK, 500.0f, 100.0f);
}
}
@@ -436,7 +453,7 @@ void func_808F3CD4(EnIn* this, PlayState* play) {
this->unk48C = 1;
this->actionFunc = func_808F5A94;
} else {
- func_800B85E0(&this->actor, play, 200.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 200.0f, PLAYER_IA_MINUS1);
}
}
@@ -450,7 +467,7 @@ void func_808F3D40(EnIn* this, PlayState* play) {
this->actor.textId = textId;
this->actor.flags |= ACTOR_FLAG_10000;
} else {
- Actor_PickUp(&this->actor, play, GI_MASK_GARO, 500.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_MASK_GARO, 500.0f, 100.0f);
}
}
@@ -470,10 +487,9 @@ u16 func_808F3DD4(PlayState* play, EnIn* this, u32 arg2) {
switch (arg2) {
case 0:
- if ((gSaveContext.save.playerForm == PLAYER_FORM_ZORA) ||
- (gSaveContext.save.playerForm == PLAYER_FORM_GORON)) {
+ if ((GET_PLAYER_FORM == PLAYER_FORM_ZORA) || (GET_PLAYER_FORM == PLAYER_FORM_GORON)) {
textId = 0x345C;
- } else if (gSaveContext.save.playerForm == PLAYER_FORM_DEKU) {
+ } else if (GET_PLAYER_FORM == PLAYER_FORM_DEKU) {
textId = 0x3460;
} else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_15_08)) {
textId = 0x3458;
@@ -481,6 +497,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 +505,11 @@ u16 func_808F3DD4(PlayState* play, EnIn* this, u32 arg2) {
textId = 0x346B;
}
break;
+
case 3:
- if (gSaveContext.save.playerForm == PLAYER_FORM_DEKU) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_DEKU) {
textId = 0x3485;
- } else if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA ||
- gSaveContext.save.playerForm == PLAYER_FORM_GORON) {
+ } else if ((GET_PLAYER_FORM == PLAYER_FORM_ZORA) || (GET_PLAYER_FORM == PLAYER_FORM_GORON)) {
textId = 0x3484;
} else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_56_04)) {
textId = 0x346D;
@@ -500,10 +517,11 @@ 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 ((GET_PLAYER_FORM == PLAYER_FORM_ZORA) || (GET_PLAYER_FORM == PLAYER_FORM_GORON)) {
textId = 0x348A;
- } else if (gSaveContext.save.playerForm == PLAYER_FORM_DEKU) {
+ } else if (GET_PLAYER_FORM == PLAYER_FORM_DEKU) {
textId = 0x348B;
} else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_16_01)) {
textId = 0x3486;
@@ -511,6 +529,7 @@ u16 func_808F3DD4(PlayState* play, EnIn* this, u32 arg2) {
textId = 0x3489;
}
break;
+
case 5:
if (func_808F33B8()) {
textId = 0x34B3;
@@ -520,17 +539,21 @@ u16 func_808F3DD4(PlayState* play, EnIn* this, u32 arg2) {
textId = 0x3493;
}
break;
+
case 7:
- if (gSaveContext.save.playerForm == PLAYER_FORM_DEKU) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_DEKU) {
textId = 0x34A8;
- } else if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA ||
- gSaveContext.save.playerForm == PLAYER_FORM_GORON) {
+ } else if ((GET_PLAYER_FORM == PLAYER_FORM_ZORA) || (GET_PLAYER_FORM == 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 +562,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 +576,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 +598,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) {
+ Audio_PlaySfx_MessageDecide();
+ 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);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
+ Actor_ContinueText(play, thisx, 0x3473);
}
} else {
- func_8019F230();
- Actor_ContinueText(play, &this->actor, 0x3472);
+ Audio_PlaySfx_MessageCancel();
+ 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) {
+ Audio_PlaySfx_MessageDecide();
+ if (gSaveContext.save.saveInfo.playerData.rupees >= fee) {
Rupees_ChangeBy(-fee);
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_57_01)) {
if (arg4 != 0) {
@@ -618,7 +644,7 @@ s32 func_808F4270(PlayState* play, EnIn* this, s32 arg2, MessageContext* msgCtx,
}
}
} else {
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
if (arg4 != 0) {
Actor_ContinueText(play, &this->actor, 0x3473);
} else {
@@ -626,7 +652,7 @@ s32 func_808F4270(PlayState* play, EnIn* this, s32 arg2, MessageContext* msgCtx,
}
}
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
Actor_ContinueText(play, &this->actor, 0x3472);
}
return 0;
@@ -635,7 +661,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 +676,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 +720,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,21 +783,24 @@ 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) {
+ Audio_PlaySfx_MessageDecide();
+ if (gSaveContext.save.saveInfo.playerData.rupees >= play->msgCtx.unk1206C) {
if (Inventory_HasEmptyBottle()) {
this->actionFunc = func_808F3C40;
- Actor_PickUp(&this->actor, play, GI_MILK, 500.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_MILK, 500.0f, 100.0f);
Rupees_ChangeBy(-play->msgCtx.unk1206C);
ret = true;
} else {
@@ -758,90 +808,107 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
ret = false;
}
} else {
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
Actor_ContinueText(play, &this->actor, 0x3468);
ret = false;
}
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
Actor_ContinueText(play, &this->actor, 0x3467);
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);
- func_800FD750(NA_BGM_HORSE);
+ SET_WEEKEVENTREG_HORSE_RACE_STATE(WEEKEVENTREG_HORSE_RACE_STATE_START);
+ Environment_ForcePlaySequence(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);
ret = false;
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
CLEAR_WEEKEVENTREG(WEEKEVENTREG_56_08);
func_808F4108(this, play, 0x3479);
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 +917,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);
@@ -892,53 +967,64 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
ret = false;
}
break;
+
case 0x347E:
func_808F35D8(this, play);
if (Inventory_HasEmptyBottle()) {
this->actionFunc = func_808F3B40;
- Actor_PickUp(&this->actor, play, GI_MILK, 500.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_MILK, 500.0f, 100.0f);
ret = true;
} else {
Actor_ContinueText(play, &this->actor, 0x347F);
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_PickUp(&this->actor, play, GI_MASK_GARO, 500.0f, 100.0f);
+ 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,63 +1032,78 @@ 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) {
+ Audio_PlaySfx_MessageDecide();
+ if (gSaveContext.save.saveInfo.playerData.rupees >= play->msgCtx.unk1206C) {
if (Inventory_HasEmptyBottle()) {
this->actionFunc = func_808F3C40;
- Actor_PickUp(&this->actor, play, GI_MILK, 500.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_MILK, 500.0f, 100.0f);
Rupees_ChangeBy(-play->msgCtx.unk1206C);
ret = true;
} else {
@@ -1010,67 +1111,78 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
ret = false;
}
} else {
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
Actor_ContinueText(play, &this->actor, 0x3468);
ret = false;
}
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
Actor_ContinueText(play, &this->actor, 0x3491);
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);
- func_800FD750(NA_BGM_HORSE);
+ SET_WEEKEVENTREG_HORSE_RACE_STATE(WEEKEVENTREG_HORSE_RACE_STATE_START);
+ Environment_ForcePlaySequence(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,95 +1195,118 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
ret = false;
}
break;
+
case 0x349F:
this->actionFunc = func_808F3D40;
- Actor_PickUp(&this->actor, play, GI_MASK_GARO, 500.0f, 100.0f);
+ 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()) {
this->actionFunc = func_808F3B40;
- Actor_PickUp(&this->actor, play, GI_MILK, 500.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_MILK, 500.0f, 100.0f);
ret = true;
} else {
Actor_ContinueText(play, &this->actor, 0x34A2);
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);
ret = false;
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
Actor_ContinueText(play, &this->actor, 0x349C);
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,13 +1320,17 @@ 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)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
ret = true;
}
break;
+
+ default:
+ break;
}
return ret;
}
@@ -1199,7 +1338,6 @@ s32 func_808F5674(PlayState* play, EnIn* this, s32 arg2) {
s32 func_808F5728(PlayState* play, EnIn* this, s32 arg2, s32* arg3) {
s16 rotDiff;
s16 yawDiff;
- Player* player;
if (*arg3 == 4) {
return 0;
@@ -1210,7 +1348,7 @@ s32 func_808F5728(PlayState* play, EnIn* this, s32 arg2, s32* arg3) {
return 0;
}
if (*arg3 == 3) {
- func_80151938(play, this->actor.textId);
+ Message_ContinueTextbox(play, this->actor.textId);
*arg3 = 1;
return 0;
}
@@ -1219,9 +1357,8 @@ s32 func_808F5728(PlayState* play, EnIn* this, s32 arg2, s32* arg3) {
return 1;
}
if (*arg3 == 1) {
- s32 requiredScopeTemp;
+ Player* player = GET_PLAYER(play);
- player = GET_PLAYER(play);
func_808F5994(this, play, &player->actor.world.pos, 0xC80);
} else {
rotDiff = this->actor.home.rot.y - this->actor.world.rot.y;
@@ -1247,14 +1384,14 @@ s32 func_808F5728(PlayState* play, EnIn* this, s32 arg2, s32* arg3) {
if (yawDiff >= 0x4300) {
return 0;
}
- if (this->actor.xyzDistToPlayerSq > SQ(160.0f) && !this->actor.isTargeted) {
+ if (this->actor.xyzDistToPlayerSq > SQ(160.0f) && !this->actor.isLockedOn) {
return 0;
}
if (this->actor.xyzDistToPlayerSq <= SQ(80.0f)) {
- if (func_800B8614(&this->actor, play, 80.0f)) {
+ if (Actor_OfferTalk(&this->actor, play, 80.0f)) {
this->actor.textId = func_808F3DD4(play, this, arg2);
}
- } else if (func_800B863C(&this->actor, play)) {
+ } else if (Actor_OfferTalkNearColChkInfoCylinder(&this->actor, play)) {
this->actor.textId = func_808F3DD4(play, this, arg2);
}
return 0;
@@ -1286,7 +1423,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,8 +1439,8 @@ void func_808F5A94(EnIn* this, PlayState* play) {
}
void func_808F5B58(EnIn* this, PlayState* play) {
- if (func_800F41E4(play, &play->actorCtx)) {
- if ((Player_GetMask(play) == PLAYER_MASK_CIRCUS_LEADER && CHECK_WEEKEVENTREG(WEEKEVENTREG_63_40)) ||
+ 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) {
func_808F5728(play, this, 6, &this->unk48C);
@@ -1311,8 +1448,8 @@ void func_808F5B58(EnIn* this, PlayState* play) {
func_808F5728(play, this, 2, &this->unk48C);
}
}
- } else if (Player_GetMask(play) != PLAYER_MASK_CIRCUS_LEADER ||
- (Player_GetMask(play) == PLAYER_MASK_CIRCUS_LEADER && CHECK_WEEKEVENTREG(WEEKEVENTREG_63_40))) {
+ } else if ((Player_GetMask(play) != PLAYER_MASK_CIRCUS_LEADER) ||
+ ((Player_GetMask(play) == PLAYER_MASK_CIRCUS_LEADER) && CHECK_WEEKEVENTREG(WEEKEVENTREG_63_40))) {
if (gSaveContext.save.day == 3) {
func_808F5728(play, this, 4, &this->unk48C);
} else {
@@ -1322,10 +1459,10 @@ 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)) ||
+ if (((Player_GetMask(play) == PLAYER_MASK_CIRCUS_LEADER) && CHECK_WEEKEVENTREG(WEEKEVENTREG_63_40)) ||
CHECK_WEEKEVENTREG(WEEKEVENTREG_56_08)) {
if (gSaveContext.save.day != 3) {
func_808F5728(play, this, 2, &this->unk48C);
@@ -1334,10 +1471,10 @@ void func_808F5C98(EnIn* this, PlayState* play) {
}
}
if (this->unk4A8 == 2) {
- if (this->unk4B0 == WEEKEVENTREG_RACE_FLAG_2) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_VO_IN_LOST);
+ if (this->unk4B0 == WEEKEVENTREG_HORSE_RACE_STATE_2) {
+ Actor_PlaySfx(&this->actor, NA_SE_VO_IN_LOST);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_VO_IN_JOY0);
+ Actor_PlaySfx(&this->actor, NA_SE_VO_IN_JOY0);
}
this->unk4A8 = 3;
} else if (this->unk4A8 < 3) {
@@ -1357,7 +1494,8 @@ void EnIn_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->actor, sInitChain);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 30.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_in_Skel_014EA8, NULL, this->jointTable, this->morphTable, 20);
+ SkelAnime_InitFlex(play, &this->skelAnime, &object_in_Skel_014EA8, NULL, this->jointTable, this->morphTable,
+ OBJECT_IN_LIMB_MAX);
EnIn_ChangeAnim(&this->skelAnime, ENIN_ANIM_0);
Collider_InitCylinder(play, &this->colliderCylinder);
Collider_SetCylinder(play, &this->colliderCylinder, &this->actor, &sCylinderInit);
@@ -1366,13 +1504,13 @@ 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;
+ this->animIndex2 = ENIN_ANIM2_1;
Animation_Change(&this->skelAnime, &object_in_Anim_016A60, 1.0f, 0.0f,
Animation_GetLastFrame(&object_in_Anim_016A60), ANIMMODE_ONCE, 0.0f);
Actor_SetScale(&this->actor, 0.01f);
@@ -1384,24 +1522,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 +1548,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 +1557,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 +1568,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 +1606,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 +1615,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;
@@ -1496,40 +1634,41 @@ void func_808F6334(EnIn* this, PlayState* play) {
s32 EnIn_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnIn* this = THIS;
s32 pad;
- Gfx* sp50[] = {
- NULL,
- NULL,
- object_in_DL_0149A8,
- object_in_DL_014AE0,
- object_in_DL_014C30,
- object_in_DL_0145D8,
- object_in_DL_014710,
- object_in_DL_014860,
- object_in_DL_014420,
- object_in_DL_012A78,
- object_in_DL_013DE0,
- object_in_DL_013F10,
- object_in_DL_014040,
- object_in_DL_0137A0,
- object_in_DL_0138D0,
- object_in_DL_013A00,
- object_in_DL_012DF8,
- object_in_DL_013670,
- object_in_DL_013540,
- object_in_DL_013440,
+ Gfx* sp50[OBJECT_IN_LIMB_MAX] = {
+ NULL, // OBJECT_IN_LIMB_NONE
+ NULL, // OBJECT_IN_LIMB_01
+ object_in_DL_0149A8, // OBJECT_IN_LIMB_02
+ object_in_DL_014AE0, // OBJECT_IN_LIMB_03
+ object_in_DL_014C30, // OBJECT_IN_LIMB_04
+ object_in_DL_0145D8, // OBJECT_IN_LIMB_05
+ object_in_DL_014710, // OBJECT_IN_LIMB_06
+ object_in_DL_014860, // OBJECT_IN_LIMB_07
+ object_in_DL_014420, // OBJECT_IN_LIMB_08
+ object_in_DL_012A78, // OBJECT_IN_LIMB_09
+ object_in_DL_013DE0, // OBJECT_IN_LIMB_0A
+ object_in_DL_013F10, // OBJECT_IN_LIMB_0B
+ object_in_DL_014040, // OBJECT_IN_LIMB_0C
+ object_in_DL_0137A0, // OBJECT_IN_LIMB_0D
+ object_in_DL_0138D0, // OBJECT_IN_LIMB_0E
+ object_in_DL_013A00, // OBJECT_IN_LIMB_0F
+ object_in_DL_012DF8, // OBJECT_IN_LIMB_10
+ object_in_DL_013670, // OBJECT_IN_LIMB_11
+ object_in_DL_013540, // OBJECT_IN_LIMB_12
+ object_in_DL_013440, // OBJECT_IN_LIMB_13
};
- if (this->unk23C != 0 && limbIndex != 16) {
+ if ((this->unk23C != 0) && (limbIndex != OBJECT_IN_LIMB_10)) {
if (sp50[limbIndex] != NULL) {
*dList = sp50[limbIndex];
}
}
- if (this->unk4AC & 4 && limbIndex == 16) {
+ if ((this->unk4AC & 4) && (limbIndex == OBJECT_IN_LIMB_10)) {
*dList = object_in_DL_01C528;
}
OPEN_DISPS(play->state.gfxCtx);
- if (limbIndex == 16) {
+
+ if (limbIndex == OBJECT_IN_LIMB_10) {
TexturePtr sp38[] = { object_in_Tex_0035E0, object_in_Tex_004820, object_in_Tex_004C20, object_in_Tex_0043E0 };
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sp38[this->unk482]));
@@ -1537,33 +1676,37 @@ 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) {
+ if (limbIndex == OBJECT_IN_LIMB_10) {
Matrix_Translate(1500.0f, 0.0f, 0.0f, MTXMODE_APPLY);
Matrix_RotateXS(this->headRot.y, MTXMODE_APPLY);
Matrix_RotateZS(-this->headRot.x, MTXMODE_APPLY);
Matrix_Translate(-1500.0f, 0.0f, 0.0f, MTXMODE_APPLY);
func_808F6334(this, play);
}
- if (limbIndex == 9) {
+
+ if (limbIndex == OBJECT_IN_LIMB_09) {
Matrix_RotateYS(this->torsoRot.y, MTXMODE_APPLY);
Matrix_RotateXS(this->torsoRot.x, MTXMODE_APPLY);
}
- 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);
+
+ if ((limbIndex == OBJECT_IN_LIMB_09) || (limbIndex == OBJECT_IN_LIMB_0A) || (limbIndex == OBJECT_IN_LIMB_0D)) {
+ rot->y += (s16)(Math_SinS(this->fidgetTableY[limbIndex]) * 200.0f);
+ rot->z += (s16)(Math_CosS(this->fidgetTableZ[limbIndex]) * 200.0f);
}
+
if (this->unk4AC & 0x40) {
- if (limbIndex == 18) {
+ if (limbIndex == OBJECT_IN_LIMB_12) {
rot->x = 0x1F40;
rot->y = -0x3E8;
rot->z = 0x1D4C;
- } else if (limbIndex == 17) {
+ } else if (limbIndex == OBJECT_IN_LIMB_11) {
rot->x = -0x1F40;
rot->y = 0x3E8;
rot->z = 0x1D4C;
- } else if (limbIndex == 19) {
+ } else if (limbIndex == OBJECT_IN_LIMB_13) {
rot->x = 0;
rot->y = 0x7FFF;
rot->z = -0x2328;
@@ -1577,36 +1720,40 @@ void EnIn_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
Vec3f sp50 = { 1600.0f, 0.0f, 0.0f };
Vec3f sp44 = { 0.0f, 0.0f, 0.0f };
- if (limbIndex == 16) {
+ if (limbIndex == OBJECT_IN_LIMB_10) {
Matrix_MultVec3f(&sp50, &this->unk4B4);
Math_Vec3f_Copy(&this->actor.focus.pos, &this->unk4B4);
}
if (this->unk23D == 0) {
Collider_UpdateSpheres(limbIndex, &this->colliderJntSph);
- if (limbIndex == 4) {
+ if (limbIndex == OBJECT_IN_LIMB_04) {
Matrix_MultVec3f(&sp44, &this->unk248);
}
- if (limbIndex == 7) {
+ if (limbIndex == OBJECT_IN_LIMB_07) {
Matrix_MultVec3f(&sp44, &this->unk254);
}
if (this->unk23C == 0) {
if (!(this->unk4AC & 8)) {
OPEN_DISPS(play->state.gfxCtx);
- if (limbIndex == 12) {
+
+ if (limbIndex == OBJECT_IN_LIMB_0C) {
gSPDisplayList(POLY_OPA_DISP++, object_in_DL_007A70);
}
- if (limbIndex == 15) {
+ if (limbIndex == OBJECT_IN_LIMB_0F) {
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) {
+
+ if (limbIndex == OBJECT_IN_LIMB_0C) {
gSPDisplayList(POLY_OPA_DISP++, object_in_DL_007C48);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
@@ -1615,9 +1762,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..ab774606a 100644
--- a/src/overlays/actors/ovl_En_In/z_en_in.h
+++ b/src/overlays/actors/ovl_En_In/z_en_in.h
@@ -2,6 +2,7 @@
#define Z_EN_IN_H
#include "global.h"
+#include "assets/objects/object_in/object_in.h"
struct EnIn;
@@ -15,7 +16,13 @@ typedef enum {
/* 4 */ ENIN_BLUE_SHIRT
} EnInType;
-typedef enum {
+#define ENIN_GET_TYPE(thisx) ((thisx)->params & 0x1FF)
+#define ENIN_GET_PATH_INDEX(thisx) (((thisx)->params & 0x7E00) >> 9) // Only used with ENIN_UNK_TYPE
+
+#define ENIN_PATH_INDEX_NONE 0x3F
+
+typedef enum EnInAnimation {
+ /* -1 */ ENIN_ANIM_NONE = -1,
/* 0 */ ENIN_ANIM_0,
/* 1 */ ENIN_ANIM_1,
/* 2 */ ENIN_ANIM_2,
@@ -34,10 +41,21 @@ typedef enum {
/* 15 */ ENIN_ANIM_15,
/* 16 */ ENIN_ANIM_16,
/* 17 */ ENIN_ANIM_17,
+ /* 18 */ ENIN_ANIM_MAX
} EnInAnimation;
-#define ENIN_GET_TYPE(thisx) ((thisx)->params & 0x1FF)
-#define ENIN_GET_PATH(thisx) (((thisx)->params & 0x7E00) >> 9) // Only used with ENIN_UNK_TYPE
+typedef enum EnInAnimation2 {
+ /* -1 */ ENIN_ANIM2_NONE = -1,
+ /* 0 */ ENIN_ANIM2_0,
+ /* 1 */ ENIN_ANIM2_1,
+ /* 2 */ ENIN_ANIM2_2,
+ /* 3 */ ENIN_ANIM2_3,
+ /* 4 */ ENIN_ANIM2_4,
+ /* 5 */ ENIN_ANIM2_5,
+ /* 6 */ ENIN_ANIM2_6,
+ /* 7 */ ENIN_ANIM2_7,
+ /* 8 */ ENIN_ANIM2_MAX
+} EnInAnimation2;
typedef struct EnIn {
/* 0x000 */ Actor actor;
@@ -55,19 +73,19 @@ typedef struct EnIn {
/* 0x254 */ Vec3f unk254;
/* 0x260 */ u8 unk260;
/* 0x261 */ u8 unk261;
- /* 0x262 */ Vec3s jointTable[20];
- /* 0x2DA */ Vec3s morphTable[20];
+ /* 0x262 */ Vec3s jointTable[OBJECT_IN_LIMB_MAX];
+ /* 0x2DA */ Vec3s morphTable[OBJECT_IN_LIMB_MAX];
/* 0x352 */ Vec3s trackTarget;
/* 0x358 */ Vec3s headRot;
/* 0x35E */ Vec3s torsoRot;
/* 0x364 */ UNK_TYPE1 unk364[0x12];
- /* 0x376 */ s16 unk376[20];
- /* 0x39E */ s16 unk39E[20];
+ /* 0x376 */ s16 fidgetTableY[OBJECT_IN_LIMB_MAX];
+ /* 0x39E */ s16 fidgetTableZ[OBJECT_IN_LIMB_MAX];
/* 0x3C6 */ UNK_TYPE1 unk3C6[0xBC];
/* 0x482 */ s16 unk482;
/* 0x484 */ s16 unk484;
/* 0x486 */ s16 unk486;
- /* 0x488 */ s16 unk488;
+ /* 0x488 */ s16 animIndex2;
/* 0x48A */ u16 unk48A;
/* 0x48C */ s32 unk48C;
/* 0x490 */ UNK_TYPE1 unk490[0x4];
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 9eae19437..9d8667f0a 100644
--- a/src/overlays/actors/ovl_En_Insect/z_en_insect.c
+++ b/src/overlays/actors/ovl_En_Insect/z_en_insect.c
@@ -5,7 +5,6 @@
*/
#include "z_en_insect.h"
-#include "objects/gameplay_keep/gameplay_keep.h"
#define FLAGS 0x00000000
@@ -112,7 +111,7 @@ void func_8091A9E4(EnInsect* this) {
return;
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_MUSI_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MUSI_WALK);
this->unk_316 = 3.0f / CLAMP_MIN(this->skelAnime.playSpeed, 0.1f);
if (this->unk_316 < 2) {
@@ -132,7 +131,7 @@ void EnInsect_Init(Actor* thisx, PlayState* play) {
func_8091A8A0(this);
SkelAnime_Init(play, &this->skelAnime, &gameplay_keep_Skel_0527A0, &gameplay_keep_Anim_05140C, this->jointTable,
- this->morphTable, 24);
+ this->morphTable, BUG_LIMB_MAX);
Animation_Change(&this->skelAnime, &gameplay_keep_Anim_05140C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP_INTERP, 0.0f);
Collider_InitJntSph(play, &this->collider);
Collider_SetJntSph(play, &this->collider, &this->actor, &sJntSphInit, this->colliderElements);
@@ -181,9 +180,9 @@ void func_8091AC78(EnInsect* this) {
void func_8091ACC4(EnInsect* this, PlayState* play) {
f32 temp_f2;
- Math_SmoothStepToF(&this->actor.speedXZ, 0.0f, 0.1f, 0.5f, 0.0f);
+ Math_SmoothStepToF(&this->actor.speed, 0.0f, 0.1f, 0.5f, 0.0f);
- temp_f2 = (Rand_ZeroOne() * 0.8f) + (this->actor.speedXZ * 1.2f);
+ temp_f2 = (Rand_ZeroOne() * 0.8f) + (this->actor.speed * 1.2f);
if (temp_f2 < 0.0f) {
this->skelAnime.playSpeed = 0.0f;
} else {
@@ -201,7 +200,7 @@ void func_8091ACC4(EnInsect* this, PlayState* play) {
if ((this->unk_30C & 4) && (this->unk_314 <= 0)) {
func_8091B3D0(this);
- } else if ((this->unk_30C & 1) && (this->actor.bgCheckFlags & 0x40)) {
+ } else if ((this->unk_30C & 1) && (this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH)) {
func_8091B618(this);
} else if (this->actor.xzDistToPlayer < 40.0f) {
func_8091B030(this);
@@ -218,7 +217,7 @@ void func_8091AE5C(EnInsect* this, PlayState* play) {
s32 pad;
f32 temp_f0;
- Math_SmoothStepToF(&this->actor.speedXZ, 1.5f, 0.1f, 0.5f, 0.0f);
+ Math_SmoothStepToF(&this->actor.speed, 1.5f, 0.1f, 0.5f, 0.0f);
if ((EnInsect_XZDistanceSquared(&this->actor.world.pos, &this->actor.home.pos) > SQ(40.0f)) ||
(this->unk_312 < 4)) {
@@ -231,7 +230,7 @@ void func_8091AE5C(EnInsect* this, PlayState* play) {
this->actor.shape.rot.y = this->actor.world.rot.y;
- temp_f0 = this->actor.speedXZ * 1.4f;
+ temp_f0 = this->actor.speed * 1.4f;
this->skelAnime.playSpeed = CLAMP(temp_f0, 0.7f, 1.9f);
SkelAnime_Update(&this->skelAnime);
@@ -241,7 +240,7 @@ void func_8091AE5C(EnInsect* this, PlayState* play) {
if ((this->unk_30C & 4) && (this->unk_314 <= 0)) {
func_8091B3D0(this);
- } else if ((this->unk_30C & 1) && (this->actor.bgCheckFlags & 0x40)) {
+ } else if ((this->unk_30C & 1) && (this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH)) {
func_8091B618(this);
} else if (this->actor.xzDistToPlayer < 40.0f) {
func_8091B030(this);
@@ -261,7 +260,7 @@ void func_8091B07C(EnInsect* this, PlayState* play) {
s16 yaw;
s32 sp38 = this->actor.xzDistToPlayer < 40.0f;
- Math_SmoothStepToF(&this->actor.speedXZ, 1.8f, 0.1f, 0.5f, 0.0f);
+ Math_SmoothStepToF(&this->actor.speed, 1.8f, 0.1f, 0.5f, 0.0f);
if ((EnInsect_XZDistanceSquared(&this->actor.world.pos, &this->actor.home.pos) > SQ(160.0f)) ||
(this->unk_312 < 4)) {
@@ -278,19 +277,21 @@ void func_8091B07C(EnInsect* this, PlayState* play) {
yaw -= 0x2000;
}
+ //! FAKE:
if (play) {}
+
Math_ScaledStepToS(&this->actor.world.rot.y, yaw, 0x7D0);
}
this->actor.shape.rot.y = this->actor.world.rot.y;
- speed = this->actor.speedXZ * 1.6f;
+ speed = this->actor.speed * 1.6f;
this->skelAnime.playSpeed = CLAMP(speed, 0.8f, 1.9f);
SkelAnime_Update(&this->skelAnime);
if ((this->unk_312 <= 0) || !sp38) {
func_8091AC78(this);
- } else if ((this->unk_30C & 1) && (this->actor.bgCheckFlags & 0x40)) {
+ } else if ((this->unk_30C & 1) && (this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH)) {
func_8091B618(this);
}
}
@@ -299,7 +300,7 @@ void func_8091B274(EnInsect* this) {
this->unk_312 = 200;
Actor_SetScale(&this->actor, 0.001f);
this->actor.draw = NULL;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->skelAnime.playSpeed = 0.3f;
this->actionFunc = func_8091B2D8;
this->unk_30C &= ~0x100;
@@ -325,7 +326,7 @@ void func_8091B2D8(EnInsect* this, PlayState* play) {
void func_8091B3D0(EnInsect* this) {
this->unk_312 = 60;
this->skelAnime.playSpeed = 1.9f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALTURA_BOUND);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALTURA_BOUND);
Math_Vec3f_Copy(&this->actor.home.pos, &this->actor.world.pos);
this->actionFunc = func_8091B440;
this->unk_30C &= ~0x100;
@@ -336,7 +337,7 @@ void func_8091B440(EnInsect* this, PlayState* play) {
s32 pad[2];
Vec3f sp34;
- Math_SmoothStepToF(&this->actor.speedXZ, 0.0f, 0.1f, 0.5f, 0.0f);
+ Math_SmoothStepToF(&this->actor.speed, 0.0f, 0.1f, 0.5f, 0.0f);
Math_StepToS(&this->actor.shape.rot.x, 0x2AAA, 0x160);
Actor_SetScale(&this->actor, CLAMP_MIN(this->actor.scale.x - 0.0002f, 0.001f));
@@ -373,9 +374,9 @@ void func_8091B670(EnInsect* this, PlayState* play) {
Vec3f sp40;
if (this->unk_312 > 80) {
- Math_StepToF(&this->actor.speedXZ, 0.6f, 0.08f);
+ Math_StepToF(&this->actor.speed, 0.6f, 0.08f);
} else {
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.02f);
+ Math_StepToF(&this->actor.speed, 0.0f, 0.02f);
}
this->actor.velocity.y = 0.0f;
@@ -409,7 +410,7 @@ void func_8091B670(EnInsect* this, PlayState* play) {
if ((this->unk_312 <= 0) || ((this->unk_30C & 4) && (this->unk_314 <= 0))) {
func_8091B928(this);
- } else if (!(this->actor.bgCheckFlags & 0x40)) {
+ } else if (!(this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH)) {
func_8091AC78(this);
}
}
@@ -417,7 +418,7 @@ void func_8091B670(EnInsect* this, PlayState* play) {
void func_8091B928(EnInsect* this) {
this->unk_312 = 100;
this->actor.velocity.y = 0.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.terminalVelocity = -0.8f;
this->actor.gravity = -0.04f;
this->unk_30C &= ~1;
@@ -442,7 +443,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;
@@ -462,7 +463,7 @@ void EnInsect_Update(Actor* thisx, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
if (this->unk_30C & 0x100) {
if (this->unk_30C & 1) {
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
func_8091A9E4(this);
}
} else {
@@ -470,14 +471,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)) {
@@ -494,7 +495,7 @@ void EnInsect_Update(Actor* thisx, PlayState* play) {
}
if (!(this->unk_30C & 8) && (D_8091BD60 < 4) && EnInsect_InBottleRange(this, play) &&
- Actor_PickUp(&this->actor, play, GI_MAX, 60.0f, 30.0f)) {
+ Actor_OfferGetItem(&this->actor, play, GI_MAX, 60.0f, 30.0f)) {
D_8091BD60++;
}
}
@@ -506,7 +507,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_Insect/z_en_insect.h b/src/overlays/actors/ovl_En_Insect/z_en_insect.h
index ea4025414..4fd2985f1 100644
--- a/src/overlays/actors/ovl_En_Insect/z_en_insect.h
+++ b/src/overlays/actors/ovl_En_Insect/z_en_insect.h
@@ -2,6 +2,7 @@
#define Z_EN_INSECT_H
#include "global.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
struct EnInsect;
@@ -9,13 +10,15 @@ typedef void (*EnInsectActionFunc)(struct EnInsect*, PlayState*);
#define ENINSECT_GET_1(thisx) ((thisx)->params & 1)
+#define ENINSECT_PARAMS(param) (param)
+
typedef struct EnInsect {
/* 0x000 */ Actor actor;
/* 0x144 */ ColliderJntSph collider;
/* 0x164 */ ColliderJntSphElement colliderElements[1];
/* 0x1A4 */ SkelAnime skelAnime;
- /* 0x1E8 */ Vec3s jointTable[24];
- /* 0x278 */ Vec3s morphTable[24];
+ /* 0x1E8 */ Vec3s jointTable[BUG_LIMB_MAX];
+ /* 0x278 */ Vec3s morphTable[BUG_LIMB_MAX];
/* 0x308 */ EnInsectActionFunc actionFunc;
/* 0x30C */ u16 unk_30C;
/* 0x30E */ s16 unk_30E;
diff --git a/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.c b/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.c
index f1ebe1bb2..e29a91b4b 100644
--- a/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.c
+++ b/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.c
@@ -1,17 +1,4 @@
-/*
- * File: z_en_invadepoh.c
- * Overlay: ovl_En_Invadepoh
- * Description: Ranch nighttime actors
- */
-#include "prevent_bss_reordering.h"
#include "z_en_invadepoh.h"
-#include "overlays/actors/ovl_En_Door/z_en_door.h"
-#include "objects/gameplay_keep/gameplay_keep.h"
-#include "objects/object_ma1/object_ma1.h"
-#include "objects/object_ma2/object_ma2.h"
-#include "objects/object_dog/object_dog.h"
-#include "objects/object_cow/object_cow.h"
-#include "objects/object_uch/object_uch.h"
#define FLAGS (ACTOR_FLAG_10)
@@ -21,164 +8,8 @@ void EnInvadepoh_Init(Actor* thisx, PlayState* play);
void EnInvadepoh_Destroy(Actor* thisx, PlayState* play);
void EnInvadepoh_Update(Actor* thisx, PlayState* play);
-void func_80B46DA8(EnInvadepoh* this);
-void func_80B46DC8(EnInvadepoh* this, PlayState* play);
-void func_80B46E20(EnInvadepoh* this);
-void func_80B46E44(EnInvadepoh* this, PlayState* play);
-void func_80B46EC0(EnInvadepoh* this);
-void func_80B46EE8(EnInvadepoh* this, PlayState* play);
-void func_80B46F88(EnInvadepoh* this);
-void func_80B46FA8(EnInvadepoh* this, PlayState* play);
-void func_80B47064(EnInvadepoh* this);
-void func_80B47084(EnInvadepoh* this, PlayState* play);
-void func_80B470E0(EnInvadepoh* this);
-void func_80B47108(EnInvadepoh* this, PlayState* play);
-void func_80B471C0(EnInvadepoh* this);
-void func_80B471E0(EnInvadepoh* this, PlayState* play);
-void func_80B47248(EnInvadepoh* this);
-void func_80B47268(EnInvadepoh* this, PlayState* play);
-void func_80B47298(EnInvadepoh* this, PlayState* play);
-void func_80B47304(EnInvadepoh* this);
-void func_80B47324(EnInvadepoh* this, PlayState* play);
-void func_80B473E4(EnInvadepoh* this, PlayState* play);
-void func_80B474DC(EnInvadepoh* this, PlayState* play);
-void func_80B47600(EnInvadepoh* this, PlayState* play);
-void func_80B477B4(EnInvadepoh* this, PlayState* play);
-void func_80B48324(EnInvadepoh* this, PlayState* play);
-void func_80B4ACF0(EnInvadepoh* this, PlayState* play);
-void func_80B4AD3C(EnInvadepoh* this);
-void func_80B4AD60(EnInvadepoh* this, PlayState* play);
-void func_80B4ADB8(EnInvadepoh* this);
-void func_80B4ADCC(EnInvadepoh* this, PlayState* play);
-void func_80B4AEC0(EnInvadepoh* this);
-void func_80B4AEDC(EnInvadepoh* this, PlayState* play);
-void func_80B4AF80(EnInvadepoh* this);
-void func_80B4AF94(EnInvadepoh* this, PlayState* play);
-void func_80B4B024(EnInvadepoh* this);
-void func_80B4B048(EnInvadepoh* this, PlayState* play);
-void func_80B4B484(EnInvadepoh* this, PlayState* play);
-void func_80B4B510(EnInvadepoh* this);
-void func_80B4B564(EnInvadepoh* this, PlayState* play);
-void func_80B4B724(EnInvadepoh* this);
-void func_80B4B768(EnInvadepoh* this, PlayState* play);
-void func_80B4B820(EnInvadepoh* this);
-void func_80B4B864(EnInvadepoh* this, PlayState* play);
-void func_80B48374(EnInvadepoh* this);
-void func_80B483CC(EnInvadepoh* this, PlayState* play);
-void func_80B49A00(EnInvadepoh* this, PlayState* play);
-void func_80B4994C(EnInvadepoh* this, PlayState* play);
-void func_80B497EC(EnInvadepoh* this, PlayState* play);
-void func_80B49628(EnInvadepoh* this);
-void func_80B49670(EnInvadepoh* this, PlayState* play);
-void func_80B49454(EnInvadepoh* this, PlayState* play);
-void func_80B4934C(EnInvadepoh* this, PlayState* play);
-void func_80B491EC(EnInvadepoh* this);
-void func_80B49228(EnInvadepoh* this, PlayState* play);
-void func_80B49C38(EnInvadepoh* this, PlayState* play);
-void func_80B49DFC(EnInvadepoh* this, PlayState* play);
-void func_80B4A350(EnInvadepoh* this, PlayState* play);
-void func_80B4A5E4(EnInvadepoh* this, PlayState* play);
-void func_80B4A67C(EnInvadepoh* this, PlayState* play);
-void func_80B4A81C(EnInvadepoh* this, PlayState* play);
-void func_80B4BC4C(EnInvadepoh* this, PlayState* play);
-void func_80B4C058(EnInvadepoh* this, PlayState* play);
-void func_80B4C218(EnInvadepoh* this, PlayState* play);
-void func_80B4C730(EnInvadepoh* this, PlayState* play);
-void func_80B4CB0C(EnInvadepoh* this, PlayState* play);
-void func_80B4CCCC(EnInvadepoh* this, PlayState* play);
-void func_80B4D480(EnInvadepoh* this, PlayState* play);
-void func_80B47568(EnInvadepoh* this);
-void func_80B478F4(EnInvadepoh* this, PlayState* play);
-void func_80B47938(EnInvadepoh* this);
-void func_80B479E8(EnInvadepoh* this, PlayState* play);
-void func_80B4843C(EnInvadepoh* this);
-void func_80B484EC(EnInvadepoh* this, PlayState* play);
-void func_80B48588(EnInvadepoh* this);
-void func_80B48610(EnInvadepoh* this, PlayState* play);
-void func_80B48848(EnInvadepoh* this, PlayState* play);
-void func_80B47278(EnInvadepoh* this);
-void func_80B48AD4(EnInvadepoh* this, PlayState* play);
-void func_80B48E4C(EnInvadepoh* this, PlayState* play);
-void func_80B49404(EnInvadepoh* this);
-void func_80B4A570(EnInvadepoh* this);
-void func_80B4C1BC(EnInvadepoh* this);
-void func_80B4D290(EnInvadepoh* this, PlayState* play);
-void func_80B4CC70(EnInvadepoh* this);
-void func_80B4770C(EnInvadepoh* this);
-void func_80B48948(EnInvadepoh* this);
-void func_80B49904(EnInvadepoh* this);
-void func_80B499BC(EnInvadepoh* this);
-void func_80B492FC(EnInvadepoh* this);
-void func_80B4627C(EnInvadepoh* this, PlayState* play);
-void EnInvadepoh_InitAlien(EnInvadepoh* this, PlayState* play);
-void EnInvadepoh_InitParentCow(EnInvadepoh* this, PlayState* play);
-void EnInvadepoh_InitChildCow(EnInvadepoh* this, PlayState* play);
-void EnInvadepoh_InitRomani(EnInvadepoh* this, PlayState* play);
-void func_80B468B4(EnInvadepoh* this, PlayState* play);
-void EnInvadepoh_InitDog(EnInvadepoh* this, PlayState* play);
-void EnInvadepoh_InitCremia(EnInvadepoh* this, PlayState* play);
-void func_80B46BB0(EnInvadepoh* this, PlayState* play);
-void func_80B46BC0(EnInvadepoh* this, PlayState* play);
-void func_80B46C08(EnInvadepoh* this, PlayState* play);
-void func_80B46C34(EnInvadepoh* this, PlayState* play);
-void func_80B46C50(EnInvadepoh* this, PlayState* play);
-void func_80B46C50(EnInvadepoh* this, PlayState* play);
-void func_80B46C7C(EnInvadepoh* this, PlayState* play);
-void func_80B46C50(EnInvadepoh* this, PlayState* play);
-void func_80B46C50(EnInvadepoh* this, PlayState* play);
-void func_80B46C50(EnInvadepoh* this, PlayState* play);
-void func_80B46C94(EnInvadepoh* this, PlayState* play);
-void func_80B46CC0(EnInvadepoh* this, PlayState* play);
-void func_80B46CF4(EnInvadepoh* this, PlayState* play);
-void func_80B46D28(EnInvadepoh* this, PlayState* play);
-void func_80B4D670(Actor* thisx, PlayState* play);
-void func_80B47BAC(Actor* thisx, PlayState* play);
-void func_80B47D30(Actor* thisx, PlayState* play);
-void func_80B47FA8(Actor* thisx, PlayState* play);
-void func_80B48060(Actor* thisx, PlayState* play);
-void func_80B481C4(Actor* thisx, PlayState* play);
-void func_80B4827C(Actor* thisx, PlayState* play);
-void func_80B48620(Actor* thisx, PlayState* play);
-void func_80B48FB0(Actor* thisx, PlayState* play);
-void func_80B49F88(Actor* thisx, PlayState* play);
-void func_80B4A9C8(Actor* thisx, PlayState* play);
-void func_80B4B0C4(Actor* thisx, PlayState* play);
-void func_80B4CE54(Actor* thisx, PlayState* play);
-void func_80B4B8BC(Actor* thisx, PlayState* play);
-void func_80B4C3A0(Actor* thisx, PlayState* play);
-void func_80B49B1C(Actor* thisx, PlayState* play);
-void func_80B4E158(Actor* thisx, PlayState* play);
-void func_80B4E3F0(Actor* thisx, PlayState* play);
-void func_80B4D9B4(Actor* thisx, PlayState* play);
-void func_80B4E1B0(Actor* thisx, PlayState* play);
-void func_80B4E324(Actor* thisx, PlayState* play);
-void func_80B4BA84(Actor* thisx, PlayState* play);
-void func_80B4E660(Actor* thisx, PlayState* play);
-void func_80B4C5C0(Actor* thisx, PlayState* play);
-void func_80B4E7BC(Actor* thisx, PlayState* play);
-void func_80B4A1B8(Actor* thisx, PlayState* play);
-void func_80B4ABDC(Actor* thisx, PlayState* play);
-void func_80B4D054(Actor* thisx, PlayState* play);
-void func_80B4DB14(Actor* thisx, PlayState* play);
-void func_80B4D760(Actor* thisx, PlayState* play);
-void func_80B4A168(Actor* thisx, PlayState* play);
-void func_80B4873C(Actor* thisx, PlayState* play);
-void func_80B490F0(Actor* thisx, PlayState* play);
-void func_80B4AB8C(Actor* thisx, PlayState* play);
-void func_80B4B218(Actor* thisx, PlayState* play);
-void func_80B4BA30(Actor* thisx, PlayState* play);
-void func_80B4C568(Actor* thisx, PlayState* play);
-void func_80B4CFFC(Actor* thisx, PlayState* play);
-void func_80B46184(unkStruct80B50350* unkStruct);
-s32 func_80B450C0(f32* x1, f32* z1, f32 x2, f32 z2, f32 speed);
-s32 func_80B4516C(EnInvadepoh* this);
-void func_80B45A4C(EnInvadePohStruct* s, unkstructInvadepoh4** u);
-void func_80B45A94(EnInvadePohStruct* s, unkstructInvadepoh4** u);
-void func_80B45B1C(EnInvadePohStruct* s, unkstructInvadepoh4** u);
-
-extern s32 D_801BDA9C;
-
-ActorInit En_Invadepoh_InitVars = {
+/*
+const ActorInit En_Invadepoh_InitVars = {
ACTOR_EN_INVADEPOH,
ACTORCAT_PROP,
FLAGS,
@@ -189,4414 +20,492 @@ ActorInit En_Invadepoh_InitVars = {
(ActorFunc)EnInvadepoh_Update,
(ActorFunc)NULL,
};
+*/
-static ColliderCylinderInit sCylinderInitAlien = {
- {
- COLTYPE_HIT3,
- AT_ON | AT_TYPE_ENEMY,
- AC_ON | AC_TYPE_PLAYER,
- OC1_ON | OC1_TYPE_ALL,
- OC2_TYPE_1,
- COLSHAPE_CYLINDER,
- },
- {
- ELEMTYPE_UNK4,
- { 0xF7CFFFFF, 0x00, 0x04 },
- { 0x00003820, 0x00, 0x00 },
- TOUCH_ON | TOUCH_SFX_NONE,
- BUMP_ON,
- OCELEM_ON,
- },
- { 40, 95, 10, { 0, 0, 0 } },
-};
-
-static ColliderCylinderInit sCylinderInitRomaniAndCremia = {
- {
- COLTYPE_NONE,
- AT_NONE,
- AC_NONE,
- OC1_ON | OC1_TYPE_ALL,
- OC2_TYPE_2,
- COLSHAPE_CYLINDER,
- },
- {
- ELEMTYPE_UNK0,
- { 0x00000000, 0x00, 0x00 },
- { 0x00000000, 0x00, 0x00 },
- TOUCH_NONE | TOUCH_SFX_NORMAL,
- BUMP_NONE,
- OCELEM_ON,
- },
- { 18, 46, 0, { 0, 0, 0 } },
-};
-
-static ColliderCylinderInit sCylinderInitDog = {
- {
- COLTYPE_NONE,
- AT_NONE,
- AC_NONE,
- OC1_ON | OC1_TYPE_ALL,
- OC2_TYPE_1,
- COLSHAPE_CYLINDER,
- },
- {
- ELEMTYPE_UNK1,
- { 0x00000000, 0x00, 0x00 },
- { 0x00000000, 0x00, 0x00 },
- TOUCH_NONE | TOUCH_SFX_NORMAL,
- BUMP_NONE,
- OCELEM_ON,
- },
- { 13, 19, 0, { 0, 0, 0 } },
-};
-
-static Vec3f D_80B4E934 = { 216.0f, -20.0f, 1395.0f };
-
-static s32 D_80B4E940 = 0;
-
-static TexturePtr sRomaniEyeTextures[] = {
- gRomaniEyeOpenTex, gRomaniEyeHalfTex, gRomaniEyeClosedTex, gRomaniEyeHappyTex, gRomaniEyeSadTex,
-};
-
-static TexturePtr sRomaniMouthTextures[] = {
- gRomaniMouthHappyTex,
- gRomaniMouthFrownTex,
- gRomaniMouthHangingOpenTex,
- gRomaniMouthSmileTex,
-};
-
-static s8 D_80B4E968 = 0;
-
-static TexturePtr sCremiaEyeTextures[] = {
- gCremiaEyeOpenTex, gCremiaEyeHalfTex, gCremiaEyeClosedTex, gCremiaEyeHappyTex, gCremiaEyeAngryTex, gCremiaEyeSadTex,
-};
-
-static TexturePtr sCremiaMouthTextures[] = {
- gCremiaMouthNormalTex,
- gCremiaMouthSlightSmileTex,
- gCremiaMouthFrownTex,
- gCremiaMouthHangingOpenTex,
-};
-
-static s8 D_80B4E994 = 0;
-
-static s8 D_80B4E998 = 0;
-
-static s8 D_80B4E99C[] = { 0 };
-
-static s8 D_80B4E9A0[] = { 0, 1, 2, 0 };
-
-static s8 D_80B4E9A4[] = { 0, 1, 2, 1, 0 };
-
-static s8 D_80B4E9AC[] = { 0, 1, 2, 2, 1, 0 };
-
-static s8 D_80B4E9B4[] = {
- 0, 1, 2, 1, 0, 1, 2, 0,
-};
-
-static s8 D_80B4E9BC[] = { 1 };
-
-static s8 D_80B4E9C0[] = { 3 };
-
-static unkstructInvadepoh0 D_80B4E9C4 = { D_80B4E99C, 1 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B439B0.s")
-static unkstructInvadepoh0 D_80B4E9CC = { D_80B4E9A0, 4 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B43A24.s")
-static unkstructInvadepoh0 D_80B4E9D4 = { D_80B4E9A4, 5 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B43A74.s")
-static unkstructInvadepoh0 D_80B4E9DC = { D_80B4E9AC, 6 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B43A9C.s")
-static unkstructInvadepoh0 D_80B4E9E4 = { D_80B4E9B4, 8 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B43AB0.s")
-static unkstructInvadepoh0 D_80B4E9EC = { D_80B4E9BC, 1 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B43AF0.s")
-static unkstructInvadepoh0 D_80B4E9F4 = { D_80B4E9C0, 1 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B43B80.s")
-static unkstructInvadepoh2 D_80B4E9FC = { 0, &D_80B4E9C4 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B43BC8.s")
-static unkstructInvadepoh1 D_80B4EA04[] = {
- { 2, 0.5f },
- { 3, 0.9f },
- { 4, 0.97f },
- { 5, 1.0f },
-};
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B43DD4.s")
-static unkstructInvadepoh1 D_80B4EA24[] = {
- { 1, 1.0f },
-};
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B43E6C.s")
-static unkstructInvadepoh4 D_80B4EA2C = { 2, &D_80B4E9C4, 4, D_80B4EA04, 0x28, 0x3C };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B43F0C.s")
-static unkstructInvadepoh3 D_80B4EA40 = {
- 1,
- &D_80B4E9CC,
- 1,
- D_80B4EA24,
-};
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B43F70.s")
-static unkstructInvadepoh3 D_80B4EA50 = {
- 1,
- &D_80B4E9D4,
- 1,
- D_80B4EA24,
-};
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B44024.s")
-static unkstructInvadepoh3 D_80B4EA60 = {
- 1,
- &D_80B4E9DC,
- 1,
- D_80B4EA24,
-};
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4407C.s")
-static unkstructInvadepoh3 D_80B4EA70 = {
- 1,
- &D_80B4E9E4,
- 1,
- D_80B4EA24,
-};
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B440B8.s")
-static unkstructInvadepoh2 D_80B4EA80 = {
- 0,
- &D_80B4E9EC,
-};
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B44234.s")
-static unkstructInvadepoh2 D_80B4EA88 = {
- 0,
- &D_80B4E9F4,
-};
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B442E4.s")
-static void* D_80B4EA90[] = {
- &D_80B4E9FC, &D_80B4EA2C, &D_80B4EA40, &D_80B4EA50, &D_80B4EA60, &D_80B4EA70, &D_80B4EA80, &D_80B4EA88,
-};
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B443A0.s")
-static s8 D_80B4EAB0[] = { 0 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B444BC.s")
-static s8 D_80B4EAB4[] = { 1 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B444F4.s")
-static s8 D_80B4EAB8[] = { 2 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B44514.s")
-static s8 D_80B4EABC[] = { 3 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B44540.s")
-static unkstructInvadepoh0 D_80B4EAC0 = { D_80B4EAB0, 1 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B44570.s")
-static unkstructInvadepoh0 D_80B4EAC8 = { D_80B4EAB4, 1 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B44620.s")
-static unkstructInvadepoh0 D_80B4EAD0 = { D_80B4EAB8, 1 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B44640.s")
-static unkstructInvadepoh0 D_80B4EAD8 = { D_80B4EABC, 1 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B44664.s")
-static unkstructInvadepoh2 D_80B4EAE0 = { 0, &D_80B4EAC0 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B44690.s")
-static unkstructInvadepoh2 D_80B4EAE8 = { 0, &D_80B4EAC8 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B446D0.s")
-static unkstructInvadepoh2 D_80B4EAF0 = { 0, &D_80B4EAD0 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B44700.s")
-static unkstructInvadepoh2 D_80B4EAF8 = { 0, &D_80B4EAD8 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B447C0.s")
-static void* D_80B4EB00[] = {
- &D_80B4EAE0,
- &D_80B4EAE8,
- &D_80B4EAF0,
- &D_80B4EAF8,
-};
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B44A90.s")
-static s8 D_80B4EB10[] = { 0 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B44B78.s")
-static s8 D_80B4EB14[] = { 0, 1, 2, 0 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B44B84.s")
-static s8 D_80B4EB18[] = { 0, 1, 2, 1, 0 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B44C24.s")
-static s8 D_80B4EB20[] = { 0, 1, 2, 2, 1, 0 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B44C80.s")
-static s8 D_80B4EB28[] = { 0, 1, 2, 1, 0, 1, 2, 0 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B44E90.s")
-static unkstructInvadepoh0 D_80B4EB30 = { D_80B4EB10, 1 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B44EFC.s")
-static unkstructInvadepoh0 D_80B4EB38 = { D_80B4EB14, 4 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B44F58.s")
-static unkstructInvadepoh0 D_80B4EB40 = { D_80B4EB18, 5 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B44FEC.s")
-static unkstructInvadepoh0 D_80B4EB48 = { D_80B4EB20, 6 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B45080.s")
-static unkstructInvadepoh0 D_80B4EB50 = { D_80B4EB28, 8 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B450C0.s")
-static unkstructInvadepoh2 D_80B4EB58 = { 0, &D_80B4EB30 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4516C.s")
-static unkstructInvadepoh1 D_80B4EB60[] = {
- { 2, 0.5f },
- { 3, 0.9f },
- { 4, 0.95f },
- { 5, 1.0f },
-};
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B451A0.s")
-static unkstructInvadepoh1 D_80B4EB80[] = {
- { 1, 1.0f },
-};
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B452EC.s")
-static unkstructInvadepoh4 D_80B4EB88 = { 2, &D_80B4EB30, 4, D_80B4EB60, 0x28, 0x3C };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B453F4.s")
-static unkstructInvadepoh3 D_80B4EB9C = {
- 1,
- &D_80B4EB38,
- 1,
- D_80B4EB80,
-};
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B45460.s")
-static unkstructInvadepoh3 D_80B4EBAC = {
- 1,
- &D_80B4EB40,
- 1,
- D_80B4EB80,
-};
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B454BC.s")
-static unkstructInvadepoh3 D_80B4EBBC = {
- 1,
- &D_80B4EB48,
- 1,
- D_80B4EB80,
-};
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B45518.s")
-static unkstructInvadepoh3 D_80B4EBCC = {
- 1,
- &D_80B4EB50,
- 1,
- D_80B4EB80,
-};
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B45550.s")
-static void* D_80B4EBDC[] = {
- &D_80B4EB58, &D_80B4EB88, &D_80B4EB9C, &D_80B4EBAC, &D_80B4EBBC, &D_80B4EBCC,
-};
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4560C.s")
-static s8 D_80B4EBF4[] = { 0 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B45648.s")
-static unkstructInvadepoh0 D_80B4EBF8 = { D_80B4EBF4, 1 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B456A8.s")
-static unkstructInvadepoh2 D_80B4EC00 = { 0, &D_80B4EBF8 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B457A0.s")
-static void* D_80B4EC08[] = { &D_80B4EC00 };
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B458D8.s")
-static void (*D_80B4EC0C[])(struct EnInvadePohStruct*, unkstructInvadepoh4** arg1) = {
- func_80B45A4C,
- func_80B45A94,
- func_80B45B1C,
-};
-
-static Color_RGBA8 D_80B4EC18 = { 255, 255, 200, 255 };
-
-static Color_RGBA8 D_80B4EC1C = { 255, 200, 0, 0 };
-
-static void (*D_80B4EC20[])(struct unkStruct80B50350*) = { func_80B46184 };
-
-static InitChainEntry D_80B4EC24[] = {
- ICHAIN_F32(uncullZoneForward, 20000, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneScale, 500, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneDownward, 600, ICHAIN_CONTINUE),
- ICHAIN_VEC3F_DIV1000(scale, 10, ICHAIN_STOP),
-};
-
-static InitChainEntry sInitChainParentCow[] = {
- ICHAIN_F32(uncullZoneForward, 20000, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneScale, 200, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneDownward, 300, ICHAIN_CONTINUE),
- ICHAIN_VEC3F_DIV1000(scale, 10, ICHAIN_STOP),
-};
-
-static InitChainEntry sInitChainChildCow[] = {
- ICHAIN_F32(uncullZoneForward, 20000, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneScale, 100, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneDownward, 100, ICHAIN_CONTINUE),
- ICHAIN_VEC3F_DIV1000(scale, 10, ICHAIN_STOP),
-};
-
-static InitChainEntry sInitChainRomani[] = {
- ICHAIN_F32(uncullZoneForward, 20000, ICHAIN_CONTINUE), ICHAIN_F32(uncullZoneScale, 100, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneDownward, 100, ICHAIN_CONTINUE), ICHAIN_F32(targetArrowOffset, 1500, ICHAIN_CONTINUE),
- ICHAIN_VEC3F_DIV1000(scale, 10, ICHAIN_STOP),
-};
-
-static InitChainEntry D_80B4EC68[] = {
- ICHAIN_F32(uncullZoneForward, 20000, ICHAIN_CONTINUE), ICHAIN_F32(uncullZoneScale, 1000, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneDownward, 1000, ICHAIN_CONTINUE), ICHAIN_VEC3S(shape.rot, 0, ICHAIN_CONTINUE),
- ICHAIN_F32(terminalVelocity, -100, ICHAIN_CONTINUE), ICHAIN_VEC3F_DIV1000(scale, 1000, ICHAIN_STOP),
-};
-
-static InitChainEntry sInitChainDog[] = {
- ICHAIN_F32(uncullZoneForward, 2000, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneScale, 50, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneDownward, 50, ICHAIN_CONTINUE),
- ICHAIN_F32(gravity, -3, ICHAIN_CONTINUE),
- ICHAIN_U8(targetMode, 4, ICHAIN_CONTINUE),
- ICHAIN_VEC3F_DIV1000(scale, 7, ICHAIN_STOP),
-};
-
-static InitChainEntry sInitChainCremia[] = {
- ICHAIN_F32(uncullZoneForward, 20000, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneScale, 100, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneDownward, 150, ICHAIN_CONTINUE),
- ICHAIN_F32(targetArrowOffset, 1500, ICHAIN_CONTINUE),
- ICHAIN_U8(targetMode, 3, ICHAIN_CONTINUE),
- ICHAIN_VEC3F_DIV1000(scale, 10, ICHAIN_STOP),
-};
-
-static EnInvadepohInitFunc D_80B4ECB0[] = {
- func_80B4627C,
- EnInvadepoh_InitAlien,
- EnInvadepoh_InitParentCow,
- EnInvadepoh_InitChildCow,
- EnInvadepoh_InitRomani,
- EnInvadepoh_InitRomani,
- func_80B468B4,
- EnInvadepoh_InitRomani,
- EnInvadepoh_InitRomani,
- EnInvadepoh_InitRomani,
- EnInvadepoh_InitDog,
- EnInvadepoh_InitCremia,
- EnInvadepoh_InitRomani,
- EnInvadepoh_InitAlien,
-};
-
-static EnInvadepohDestroyFunc D_80B4ECE8[] = {
- func_80B46BB0, func_80B46BC0, func_80B46C08, func_80B46C34, func_80B46C50, func_80B46C50, func_80B46C7C,
- func_80B46C50, func_80B46C50, func_80B46C50, func_80B46C94, func_80B46CC0, func_80B46CF4, func_80B46D28,
-};
-
-static s16 D_80B4ED20[] = {
- 130, 125, 115, 100, 80, 78, 76, 74,
-};
-
-static Vec3f D_80B4ED30[] = {
- { 0.01f, 0.01f, 0.01f }, { 0.02f, 0.01f, 0.005f }, { -0.01f, 0.0f, 0.0f },
- { 0.01f, 0.01f, 0.01f }, { 0.005f, 0.01f, 0.02f },
-};
-
-static Vec3f D_80B4ED6C[] = {
- { 0.0005f, 0.0279999990016f, 0.01f }, { -0.01f, 0.0f, 0.0f }, { -0.01f, 0.0f, 0.0f },
- { 0.016f, 0.0004f, 0.01f }, { -0.01f, 0.0f, 0.0f }, { 0.0005f, 0.0005f, 0.0005f },
- { 0.0002f, 0.0002f, 0.0002f },
-};
-
-static s16 D_80B4EDC0[] = { 0xE0C0, 0xE890, 0xD508 };
-
-static s16 D_80B4EDC8[] = {
- -1800,
- -1000,
- 0,
- 2000,
-};
-
-static Vec3f D_80B4EDD0[] = {
- { -1813.0f, 374.0f, 1900.0f }, { 2198.0f, 153.0f, 3365.0f }, { -1434.0f, 262.0f, 3365.0f },
- { -393.0f, 396.0f, 1084.0f }, { 0.0f, 1500.0f, 0.0f },
-};
-
-static unkstruct80B4EE0C D_80B4EE0C[] = {
- { 0.08f, 0x02BC, 0xFFF6 },
- { 0.09f, 0x012C, 0xFFFB },
- { 0.05f, 0x0190, 0x0000 },
-};
-
-static Vec3f D_80B4EE24 = {
- 2000.0f,
- 1000.0f,
- 0.0f,
-};
-
-static Vec3f D_80B4EE30 = {
- 400.0f,
- 270.0f,
- 0.0f,
-};
-
-MtxF D_80B502A0;
-MtxF D_80B502E0;
-EnInvadepoh* D_80B50320[8];
-u8 D_80B50340[8];
-UNK_TYPE1 D_80B50348;
-unkStruct80B50350 D_80B50350[10];
-EnInvadepoh* D_80B503F0;
-EnInvadepoh* D_80B503F4;
-EnInvadepoh* D_80B503F8;
-AnimatedMaterial* sAlienEyeBeamTexAnim;
-AnimatedMaterial* sAlienEmptyTexAnim;
-s16 D_80B50404[3];
-EnInvadepoh* D_80B5040C;
-
-void func_80B439B0(s32 arg0, s32 arg1) {
- arg1 -= 0x1AAA;
- if (arg1 < 0) {
- arg1 = 0;
- }
-
- if (!(arg0 & 1)) {
- gSaveContext.save.unk_E88[arg0 >> 1] = (gSaveContext.save.unk_E88[arg0 >> 1] & 0xFFFF0000) | (arg1 & 0xFFFF);
- } else {
- gSaveContext.save.unk_E88[arg0 >> 1] =
- (gSaveContext.save.unk_E88[arg0 >> 1] & 0xFFFF) | ((arg1 & 0xFFFF) << 0x10);
- }
-}
-
-s32 func_80B43A24(s32 arg0) {
- u32 phi_v1;
-
- if ((arg0 & 1) == 0) {
- phi_v1 = gSaveContext.save.unk_E88[arg0 >> 1] & 0xFFFF;
- } else {
- phi_v1 = (gSaveContext.save.unk_E88[arg0 >> 1] & 0xFFFF0000) >> 0x10;
- }
- return phi_v1 + 0x1AAA;
-}
-
-void func_80B43A74(s32 arg0) {
- gSaveContext.save.unk_E88[4] = (gSaveContext.save.unk_E88[4] & ~0xFF) | (arg0 & 0xFF);
-}
-
-s32 func_80B43A9C(void) {
- return (gSaveContext.save.unk_E88[4] >> 0) & 0xFF;
-}
-
-s32 func_80B43AB0(void) {
- s32 retVal = func_80B43A9C();
-
- if (retVal < 0xC) {
- retVal++;
- func_80B43A74(retVal);
- }
- return retVal;
-}
-
-void func_80B43AF0(s32 arg0) {
- s32 currentTime = gSaveContext.save.time;
-
- if (((CURRENT_DAY == 1) && (currentTime >= CLOCK_TIME(2, 30))) && (currentTime < CLOCK_TIME(5, 15))) {
- s32 adjustment = (0xC - func_80B43A9C()) * 25.0f;
-
- func_80B439B0(arg0, currentTime + adjustment);
- }
-}
-
-s32 func_80B43B80(EnInvadepoh* this) {
- s32 i;
- s32 temp = this->endPoint - 1;
-
- for (i = 0; i < temp; i++) {
- if (this->unk37C[i] > this->clockTime) {
- break;
- }
- }
-
- return i;
-}
-
-void func_80B43BC8(EnInvadepoh* this, s8* arg1, Vec3f* arg2) {
- s32 temp_s5 = this->endPoint;
- f32 pathTotalDistInv = 1.0f / this->pathTotalDist;
- Vec3s* phi_s0 = &this->pathPoints[1];
- Vec3s* phi_s1 = &this->pathPoints[0];
- f32 new_var;
- Vec3f sp70;
- s32 phi_s2;
- f32 temp_f0;
- f32 temp_f12;
- f32 temp_f14;
- f32 temp_f6;
- f32 phi_f20 = 0.0f;
- f32 phi_f24 = 0.0f;
-
- for (phi_s2 = 0; phi_s2 < temp_s5; phi_s2++) {
- sp70.x = phi_s0->x - phi_s1->x;
- sp70.y = phi_s0->y - phi_s1->y;
- sp70.z = phi_s0->z - phi_s1->z;
- new_var = Math3D_Vec3fMagnitude(&sp70);
- temp_f14 = phi_f20 + new_var;
- temp_f12 = temp_f14 * pathTotalDistInv;
-
- if (this->clockTime <= temp_f12) {
- temp_f6 = temp_f12 - phi_f24;
- *arg1 = phi_s2;
- temp_f0 = (this->clockTime - phi_f24) / temp_f6;
- arg2->x = (temp_f0 * sp70.x) + phi_s1->x;
- arg2->y = (temp_f0 * sp70.y) + phi_s1->y;
- arg2->z = (temp_f0 * sp70.z) + phi_s1->z;
- return;
- }
-
- phi_s1 = phi_s0;
- phi_s0++;
- phi_f20 = temp_f14;
- phi_f24 = temp_f12;
- }
-
- *arg1 = temp_s5;
- arg2->x = this->pathPoints[temp_s5].x;
- arg2->y = this->pathPoints[temp_s5].y;
- arg2->z = this->pathPoints[temp_s5].z;
-}
-
-void func_80B43DD4(EnInvadepoh* this, s16 arg1, s16 arg2) {
- s32 pad;
- Vec3s* arr = &this->pathPoints[this->pathIndex];
- s32 pad2;
- Vec3f sp30;
- Vec3f sp24;
-
- if (this->pathIndex != this->endPoint) {
- Math_Vec3s_ToVec3f(&sp30, &arr[0]);
- Math_Vec3s_ToVec3f(&sp24, &arr[1]);
- Math_ScaledStepToS(&this->actor.shape.rot.y, Math_Vec3f_Yaw(&sp30, &sp24) + arg2, arg1);
- }
-}
-
-void func_80B43E6C(EnInvadepoh* this, s16 arg1, s16 arg2, s16 arg3) {
- s32 pad;
- Vec3s* arr = &this->pathPoints[this->pathIndex];
- s32 pad2;
- Vec3f sp38;
- Vec3f sp2C;
-
- if (this->pathIndex != this->endPoint) {
- Math_Vec3s_ToVec3f(&sp38, &arr[0]);
- Math_Vec3s_ToVec3f(&sp2C, &arr[1]);
- Math_SmoothStepToS(&this->actor.shape.rot.y, Math_Vec3f_Yaw(&sp38, &sp2C), arg1, arg2, arg3);
- }
-}
-
-void func_80B43F0C(EnInvadepoh* this) {
- s32 pad;
- Vec3s* arr = &this->pathPoints[this->pathIndex];
- s32 pad2;
- Vec3f sp28;
- Vec3f sp1C;
-
- Math_Vec3s_ToVec3f(&sp28, &arr[0]);
- Math_Vec3s_ToVec3f(&sp1C, &arr[1]);
- this->actor.shape.rot.y = Math_Vec3f_Yaw(&sp28, &sp1C);
-}
-
-f32 EnInvadepoh_GetTotalPathLength(EnInvadepoh* this) {
- f32 distance;
- s32 pad;
- Vec3f sp54;
- Vec3f pathPointF;
- Vec3s* pathPoint;
- f32 totalDistance;
- s32 i;
- s32 temp_s4;
-
- temp_s4 = this->endPoint + 1;
- pathPoint = this->pathPoints;
- totalDistance = 0.0f;
- Math_Vec3s_ToVec3f(&pathPointF, pathPoint);
- pathPoint++;
- for (i = 1; i < temp_s4; i++) {
- Math_Vec3f_Copy(&sp54, &pathPointF);
- Math_Vec3s_ToVec3f(&pathPointF, pathPoint);
- distance = Math3D_Distance(&sp54, &pathPointF);
- pathPoint++;
- totalDistance += distance;
- }
-
- return totalDistance;
-}
-
-void func_80B44024(EnInvadepoh* this, PlayState* play) {
- Path* path = &play->setupPathList[(this->actor.params >> 8) & 0x7F];
-
- this->endPoint = path->count - 1;
- this->pathPoints = Lib_SegmentedToVirtual(path->points);
-}
-
-void EnInvadepoh_SetPathPointToWorldPos(EnInvadepoh* this, s32 pathIndex) {
- Math_Vec3s_ToVec3f(&this->actor.world.pos, &this->pathPoints[pathIndex]);
-}
-
-s32 func_80B440B8(EnInvadepoh* this, f32 arg1, f32 arg2) {
- Vec3s* temp_a3 = &this->pathPoints[this->pathIndex + 1];
- Vec3s* sp48 = &this->pathPoints[this->pathIndex];
- f32 new_var;
- f32 sp40;
- f32 sp3C;
- f32 sp38;
- f32 sp34;
- f32 sp30;
- f32 sp2C;
- f32 temp_f12_2;
- s32 pad1;
- s32 pad2;
- s16 sp1E;
-
- if (this->pathIndex >= this->endPoint) {
- return false;
- }
-
- sp40 = temp_a3->x - sp48->x;
- sp3C = temp_a3->z - sp48->z;
- sp1E = Math_Atan2S_XY(sp3C, sp40);
- sp38 = Math_CosS(sp1E);
- sp34 = Math_SinS(sp1E);
- sp30 = this->actor.world.pos.x - sp48->x;
- sp2C = this->actor.world.pos.z - sp48->z;
-
- if ((arg1 - arg2) < fabsf((sp30 * sp38) - (sp2C * sp34))) {
- return false;
- }
-
- temp_f12_2 = (sp2C * sp38) + (sp30 * sp34);
- new_var = Math3D_XZLength(sp40, sp3C);
-
- if ((temp_f12_2 < 0.0f) || (new_var < temp_f12_2)) {
- return false;
- }
-
- return true;
-}
-
-s32 func_80B44234(EnInvadepoh* this, Vec3f* vec) {
- f32 distance;
- s8 temp_s3 = this->endPoint;
- f32 min = FLT_MAX;
- Vec3f sp48;
- s32 i;
- s32 ret = 0;
- Vec3s* arr;
-
- for (i = 0, arr = this->pathPoints; i < temp_s3; i++, arr++) {
- Math_Vec3s_ToVec3f(&sp48, arr);
- distance = Math3D_Vec3fDistSq(&sp48, vec);
- if (distance < min) {
- min = distance;
- ret = i;
- }
- }
-
- return ret;
-}
-
-void func_80B442E4(EnInvadepoh* this) {
- s32 temp_v1_2 = ((void)0, (s32)gSaveContext.save.time) - func_80B43A24(this->actor.params & 7);
-
- if (D_80B4E940 == 1) {
- this->clockTime = 0.0f;
- } else if (D_80B4E940 == 2) {
- if (temp_v1_2 < 0) {
- this->clockTime = 0.0f;
- } else {
- this->clockTime = temp_v1_2 * 0.00027777779f;
- if (this->clockTime > 1.0f) {
- this->clockTime = 1.0f;
- }
- }
- }
-
- this->pathIndex = func_80B43B80(this);
-}
-
-void func_80B443A0(EnInvadepoh* this) {
- f32 pathTotalDistInv;
- s8 temp_s5;
- Vec3s* phi_s1;
- Vec3f sp70;
- Vec3f sp64;
- f32* phi_s0;
- f32 phi_f20;
- s32 i;
-
- temp_s5 = this->endPoint;
- pathTotalDistInv = 1.0f / this->pathTotalDist;
- phi_f20 = 0.0f;
- phi_s1 = this->pathPoints;
- Math_Vec3s_ToVec3f(&sp64, phi_s1);
- phi_s1++;
- phi_s0 = this->unk37C;
-
- for (i = 1; i < temp_s5; i++, phi_s1++, phi_s0++) {
- Math_Vec3f_Copy(&sp70, &sp64);
- Math_Vec3s_ToVec3f(&sp64, phi_s1);
- phi_f20 += Math3D_Distance(&sp70, &sp64);
- *phi_s0 = phi_f20 * pathTotalDistInv;
- if (*phi_s0 < 0.0f) {
- *phi_s0 = 0.0f;
- } else if (*phi_s0 > 1.0f) {
- *phi_s0 = 1.0f;
- }
- }
-}
-
-void func_80B444BC(EnInvadepoh* this, PlayState* play) {
- func_80B44024(this, play);
- this->pathTotalDist = EnInvadepoh_GetTotalPathLength(this);
- func_80B443A0(this);
-}
-
-void func_80B444F4(EnInvadepoh* this, PlayState* play) {
- func_80B44024(this, play);
-}
-
-void func_80B44514(EnInvadepoh* this) {
- this->pathIndex++;
- if (this->pathIndex >= this->endPoint) {
- this->pathIndex = 0;
- }
-}
-
-void func_80B44540(EnInvadepoh* this, PlayState* play) {
- func_80B44024(this, play);
- this->pathTotalDist = EnInvadepoh_GetTotalPathLength(this);
-}
-
-void func_80B44570(EnInvadepoh* this) {
- s32 currentTime = gSaveContext.save.time;
-
- if ((currentTime < CLOCK_TIME(2, 0)) || (currentTime >= CLOCK_TIME(6, 0))) {
- this->clockTime = 0.0f;
- } else if ((currentTime >= CLOCK_TIME(2, 15)) && (currentTime < CLOCK_TIME(6, 0))) {
- this->clockTime = 1.0f;
- } else {
- f32 new_var = (currentTime - 0x1555) * 0.0014641288f;
-
- this->clockTime = new_var;
- this->clockTime = CLAMP(this->clockTime, 0.0f, 1.0f);
- }
-}
-
-void func_80B44620(EnInvadepoh* this, PlayState* play) {
- func_80B44024(this, play);
-}
-
-void func_80B44640(EnInvadepoh* this) {
- if (this->pathIndex < this->endPoint) {
- this->pathIndex++;
- }
-}
-
-void func_80B44664(EnInvadepoh* this, PlayState* play) {
- func_80B44024(this, play);
- this->direction = DIRECTION_FORWARD;
-}
-
-void func_80B44690(EnInvadepoh* this) {
- this->pathIndex += this->direction;
- if (this->pathIndex >= this->endPoint) {
- this->pathIndex = 0;
- } else if (this->pathIndex < 0) {
- this->pathIndex = this->endPoint - 1;
- }
-}
-
-void func_80B446D0(EnInvadepoh* this, PlayState* play) {
- func_80B44024(this, play);
- this->pathTotalDist = EnInvadepoh_GetTotalPathLength(this);
-}
-
-void func_80B44700(EnInvadepoh* this) {
- s32 currentTime = gSaveContext.save.time;
- s32 new_var4 = 0xFFFF2AAB;
-
- if ((currentTime < CLOCK_TIME(20, 0)) && (currentTime >= CLOCK_TIME(6, 0))) {
- this->clockTime = 0.0f;
- } else if ((currentTime > 0xD7E0) || (currentTime < CLOCK_TIME(6, 0))) {
- this->clockTime = 1.0f;
- } else {
- f32 new_var = 0.00153374229558f;
-
- this->clockTime = (currentTime + new_var4) * new_var;
- this->clockTime = CLAMP(this->clockTime, 0.0f, 1.0f);
- }
-}
-
-void func_80B447C0(EnInvadepoh* this, PlayState* play) {
- s32 pad1;
- Vec3s* sp60;
- s32 pad2;
- Vec3f sp50;
- Vec3f sp44;
- f32 sp40 = this->actor.world.pos.y;
- f32 sp3C;
- s32 pad3;
- f32 sp34;
- f32 sp30;
- f32 sp2C;
- f32 phi_f2;
-
- sp60 = &this->pathPoints[this->pathIndex];
- if (this->pathIndex <= 0) {
- sp3C = 0.0f;
- } else {
- sp3C = this->unk37C[this->pathIndex - 1];
- }
-
- if (this->pathIndex < (this->endPoint - 1)) {
- phi_f2 = this->unk37C[this->pathIndex];
- } else {
- phi_f2 = 1.0f;
- }
-
- if ((phi_f2 - sp3C) < 0.001f) {
- Math_Vec3s_ToVec3f(&this->curPathPos, sp60);
- } else {
- sp34 = this->clockTime - sp3C;
- sp30 = phi_f2 - this->clockTime;
- sp2C = 1.0f / (phi_f2 - sp3C);
- Math_Vec3s_ToVec3f(&sp50, &sp60[0]);
- Math_Vec3s_ToVec3f(&sp44, &sp60[1]);
- this->curPathPos.x = ((sp50.x * sp30) + (sp44.x * sp34)) * sp2C;
- this->curPathPos.y = ((sp50.y * sp30) + (sp44.y * sp34)) * sp2C;
- this->curPathPos.z = ((sp50.z * sp30) + (sp44.z * sp34)) * sp2C;
- }
-
- Math_Vec3f_Copy(&this->actor.world.pos, &this->curPathPos);
- func_800B4AEC(play, &this->actor, 0.0f);
- if (this->actor.floorHeight > BGCHECK_Y_MIN + 1) {
- if (sp40 < this->actor.floorHeight) {
- if (this->actor.velocity.y < 0.0f) {
- this->actor.velocity.y = 0.0f;
- } else {
- this->actor.velocity.y += 2.0f;
- this->actor.velocity.y = CLAMP_MAX(this->actor.velocity.y, 30.0f);
- }
- this->actor.world.pos.y = this->actor.velocity.y + sp40;
- if (this->actor.world.pos.y > this->actor.floorHeight) {
- this->actor.world.pos.y = this->actor.floorHeight;
- }
- } else {
- if (this->actor.velocity.y > 0.0f) {
- this->actor.velocity.y = 0.0f;
- } else {
- this->actor.velocity.y -= 2.0f;
- }
-
- this->actor.world.pos.y = this->actor.velocity.y + sp40;
- if (this->actor.world.pos.y < this->actor.floorHeight) {
- this->actor.world.pos.y = this->actor.floorHeight;
- this->actor.velocity.y = CLAMP_MIN(this->actor.velocity.y, -30.0f);
- }
- }
- } else {
- this->actor.world.pos.y = sp40;
- }
-}
-
-void func_80B44A90(EnInvadepoh* this, PlayState* play) {
- if (this->actor.bgCheckFlags & 1) {
- this->actor.velocity.y *= 0.3f;
- this->actor.speedXZ *= 0.8f;
- } else if (this->actor.bgCheckFlags & 8) {
- this->actor.velocity.y *= 0.8f;
- this->actor.speedXZ *= 0.3f;
- } else {
- this->actor.velocity.y *= 0.8f;
- this->actor.speedXZ *= 0.8f;
- }
- Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 40.0f, 0.0f, 5);
-}
-
-void func_80B44B78(EnInvadepoh* this) {
-}
-
-s32 func_80B44B84(EnInvadepoh* this, PlayState* play, f32 speed, f32 arg3) {
- s32 pad;
- Vec3s* pathPoint = &this->pathPoints[this->pathIndex + 1];
- s32 retVal = func_80B450C0(&this->actor.world.pos.x, &this->actor.world.pos.z, pathPoint->x, pathPoint->z, speed);
-
- func_800B4AEC(play, &this->actor, arg3);
- func_80B4516C(this);
- return retVal;
-}
-
-void func_80B44C24(EnInvadepoh* this, PlayState* play) {
- s32 pad;
- f32 worldPosY = this->actor.world.pos.y;
-
- func_80B43BC8(this, &this->pathIndex, &this->actor.world.pos);
- this->actor.world.pos.y = worldPosY;
- func_800B4AEC(play, &this->actor, 50.0f);
- func_80B4516C(this);
-}
-
-s32 func_80B44C80(EnInvadepoh* this, PlayState* play) {
- s32 pad[6];
- Vec3s* temp_a2 = &this->pathPoints[this->pathIndex];
- f32 temp_f0;
- Vec3f sp6C;
- Vec3f sp60;
- f32 temp_f0_2;
- Vec3s* temp_v0_2;
- f32 temp_f0_3;
- f32 temp_f12;
- f32 temp_f2;
- f32 temp_f14;
- f32 sp44;
- s32 sp40 = 0;
- s32 temp_v1 = this->pathIndex + this->direction;
- s32 phi_v0;
-
- if (temp_v1 >= this->endPoint) {
- temp_v1 = 0;
- } else if (temp_v1 < 0) {
- temp_v1 = this->endPoint - 1;
- }
-
- temp_v0_2 = &this->pathPoints[temp_v1];
-
- temp_f0 = temp_a2->x;
- temp_f2 = temp_a2->z;
- temp_f12 = temp_v0_2->x;
- temp_f14 = temp_v0_2->z;
- sp6C.x = temp_f12 - temp_f0;
- sp6C.y = 0.0f;
- sp6C.z = temp_f14 - temp_f2;
- sp60.x = temp_f12 - this->actor.world.pos.x;
- sp60.y = 0.0f;
- sp60.z = temp_f14 - this->actor.world.pos.z;
- temp_f0_3 = temp_f0 - this->actor.world.pos.x;
- temp_f0_2 = temp_f2 - this->actor.world.pos.z;
-
- if (this->actor.speedXZ > 0.0f) {
- if (Math3D_AngleBetweenVectors(&sp6C, &sp60, &sp44) != 0) {
- sp40 = 1;
- } else if (sp44 <= 0.0f) {
- sp40 = 1;
- }
- }
-
- Math_SmoothStepToS(&this->actor.world.rot.y,
- Math_Atan2S_XY(((sp60.z + temp_f0_2) * 0.9f) + sp6C.z, ((sp60.x + temp_f0_3) * 0.9f) + sp6C.x),
- 4, 0xFA0, 0x64);
- Actor_MoveWithGravity(&this->actor);
- if (func_80B440B8(this, 50.0f, 15.0f)) {
- phi_v0 = 4;
- } else {
- phi_v0 = 5;
- }
-
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 15.0f, 0.0f, phi_v0);
- Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.world.rot.y, 3, 0x1F40, 0x64);
- return sp40;
-}
-
-void func_80B44E90(EnInvadepoh* this, PlayState* play) {
- Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 15.0f, 0.0f, 5);
- Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.world.rot.y, 3, 0x1F40, 0x64);
-}
-
-void func_80B44EFC(EnInvadepoh* this, PlayState* play) {
- s32 pad;
- f32 worldPosY = this->actor.world.pos.y;
-
- func_80B43BC8(this, &this->pathIndex, &this->actor.world.pos);
- this->actor.world.pos.y = worldPosY;
- func_800B4AEC(play, &this->actor, 50.0f);
- func_80B4516C(this);
-}
-
-void func_80B44F58(void) {
- s32 i;
- TexturePtr* iter;
-
- if (!D_80B4E968) {
- D_80B4E968 = true;
- for (i = 0, iter = sRomaniEyeTextures; i < ARRAY_COUNT(sRomaniEyeTextures); i++, iter++) {
- *iter = Lib_SegmentedToVirtual(*iter);
- }
-
- for (i = 0, iter = sRomaniMouthTextures; i < ARRAY_COUNT(sRomaniMouthTextures); i++, iter++) {
- *iter = Lib_SegmentedToVirtual(*iter);
- }
- }
-}
-
-void func_80B44FEC(void) {
- s32 i;
- TexturePtr* iter;
-
- if (!D_80B4E994) {
- D_80B4E994 = true;
- for (i = 0, iter = sCremiaEyeTextures; i < ARRAY_COUNT(sCremiaEyeTextures); i++, iter++) {
- *iter = Lib_SegmentedToVirtual(*iter);
- }
-
- for (i = 0, iter = sCremiaMouthTextures; i < ARRAY_COUNT(sCremiaMouthTextures); i++, iter++) {
- *iter = Lib_SegmentedToVirtual(*iter);
- }
- }
-}
-
-void func_80B45080(void) {
- sAlienEmptyTexAnim = Lib_SegmentedToVirtual(gAlienEmptyTexAnim);
- sAlienEyeBeamTexAnim = Lib_SegmentedToVirtual(gAlienEyeBeamTexAnim);
-}
-
-s32 func_80B450C0(f32* x1, f32* z1, f32 x2, f32 z2, f32 speed) {
- f32 deltaX = x2 - *x1;
- f32 deltaZ = z2 - *z1;
- f32 temp_f0 = Math3D_XZLength(deltaX, deltaZ);
-
- if (speed < temp_f0) {
- f32 temp_f2 = speed / temp_f0;
- *x1 += (temp_f2 * deltaX);
- *z1 += (temp_f2 * deltaZ);
- return false;
- } else {
- *x1 = x2;
- *z1 = z2;
- return true;
- }
-}
-
-s32 func_80B4516C(EnInvadepoh* this) {
- if (this->actor.floorHeight > BGCHECK_Y_MIN + 1) {
- this->actor.world.pos.y = this->actor.floorHeight;
- return true;
- }
- return false;
-}
-
-void func_80B451A0(EnInvadepoh* this, PlayState* play) {
- s32 currentTime;
- s32 temp_v0_2;
- s32 i;
- s32 phi_s1_3;
-
- if (D_80B4E940 == 0) {
- if (CURRENT_DAY <= 0) {
- D_80B4E940 = 1;
- } else if (CURRENT_DAY == 1) {
- currentTime = gSaveContext.save.time;
- if ((currentTime < CLOCK_TIME(2, 30)) || (currentTime >= CLOCK_TIME(6, 0))) {
- D_80B4E940 = 1;
- } else if (currentTime < CLOCK_TIME(5, 15)) {
- phi_s1_3 = CLOCK_TIME(5, 15);
- for (i = 0; i < this->unk379; i++) {
- temp_v0_2 = func_80B43A24(i);
- if (temp_v0_2 < phi_s1_3) {
- phi_s1_3 = temp_v0_2;
- }
- }
-
- if (currentTime < (phi_s1_3 + 0xE11)) {
- D_80B4E940 = 2;
- }
-
- if (i) {} // required
- }
- }
-
- if (D_80B4E940 == 0) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
- D_80B4E940 = 3;
- } else {
- D_80B4E940 = 4;
- }
- }
- }
-}
-
-void func_80B452EC(EnInvadepoh* this, PlayState* play) {
- s32 phi_s2 = (this->actor.params >> 8) & 0x7F;
- s32 i;
-
- for (i = 0; i < this->unk379; i++) {
- D_80B50320[i] = (EnInvadepoh*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_INVADEPOH, this->actor.world.pos.x,
- this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0,
- (i & 7) | ((phi_s2 << 8) & 0x7F00) | 0x10);
- if (phi_s2 != 0xFF) {
- Path* path = &play->setupPathList[phi_s2];
- phi_s2 = path->unk1;
- }
- }
-}
-
-void func_80B453F4(EnInvadepoh* this, PlayState* play, s32 arg2) {
- Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_INVADEPOH, this->actor.home.pos.x,
- this->actor.home.pos.y, this->actor.home.pos.z, 0, 0, 0, (arg2 & 7) | 0x20);
-}
-
-void func_80B45460(EnInvadepoh* this, PlayState* play) {
- Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_INVADEPOH, this->actor.home.pos.x,
- this->actor.home.pos.y, this->actor.home.pos.z, 0, 0, 0, 0x40);
-}
-
-void func_80B454BC(EnInvadepoh* this, PlayState* play) {
- D_80B503F0 = (EnInvadepoh*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_INVADEPOH, this->actor.world.pos.x,
- this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, 0x60);
-}
-
-void EnInvadepoh_SetSysMatrix(Vec3f* vec) {
- MtxF* sysMatrix = Matrix_GetCurrent();
-
- sysMatrix->xw = vec->x;
- sysMatrix->yw = vec->y;
- sysMatrix->zw = vec->z;
-}
-
-s32 func_80B45550(EnInvadepoh* this, PlayState* play, f32 range, s32 arg3) {
- s32 pad;
- Actor* actorIterator = play->actorCtx.actorLists[ACTORCAT_DOOR].first;
- s32 retVal = false;
-
- while (actorIterator != NULL) {
- if ((actorIterator->id == ACTOR_EN_DOOR) && (actorIterator->update != NULL) &&
- (actorIterator->room == this->actor.room) &&
- Math3D_Vec3fDistSq(&actorIterator->world.pos, &this->actor.world.pos) < range) {
- ((EnDoor*)actorIterator)->unk_1A7 = arg3;
- retVal = true;
- break;
- }
- actorIterator = actorIterator->next;
- }
- return retVal;
-}
-
-void EnInvadepoh_SetTextID(EnInvadepoh* this, PlayState* play, u16 arg2) {
- this->textId = arg2;
- Message_StartTextbox(play, arg2, &this->actor);
-}
-
-void func_80B45648(EnInvadepoh* this) {
- s32 i;
- s16 cs = this->actor.cutscene;
-
- for (i = 0; i < 3; i++) {
- D_80B50404[i] = cs;
- cs = ActorCutscene_GetAdditionalCutscene(cs);
- }
-}
-
-s32 func_80B456A8(PlayState* play, Vec3f* worldPos) {
- Vec3f projectedPos;
- f32 invW;
-
- Actor_GetProjectedPos(play, worldPos, &projectedPos, &invW);
- if (((projectedPos.z > 1.0f) && (fabsf(projectedPos.x * invW) < 1.0f)) && (fabsf(projectedPos.y * invW) < 1.0f)) {
- 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);
- if (wZ < zBuf) {
- return true;
- }
- }
-
- return false;
-}
-
-void func_80B457A0(EnInvadepoh* this) {
- f32 distanceSquared;
- f32 phi_f20 = FLT_MAX;
- s32 i;
- s32 phi_s5 = -1;
-
- for (i = 0; i < this->unk379; i++) {
- if ((D_80B50320[i] != NULL) && D_80B50320[i]->drawAlien) {
- distanceSquared = Math3D_Vec3fDistSq(&D_80B50320[i]->actor.world.pos, &this->actor.world.pos);
- if (distanceSquared < phi_f20) {
- phi_f20 = distanceSquared;
- phi_s5 = i;
- }
- }
- D_80B50340[i] &= ~2;
- }
-
- D_80B50348 = 0;
- if (phi_f20 <= SQ(2000.0f)) {
- D_80B50340[phi_s5] |= 2;
- if (phi_f20 <= SQ(340.0f)) {
- D_80B50348 = 1;
- }
- }
-}
-
-EnInvadepoh* func_80B458D8(void) {
- s32 i;
-
- for (i = 0; i < 8; i++) {
- if (D_80B50340[i] & 2) {
- return D_80B50320[i];
- }
- }
-
- return NULL;
-}
-
-s8 func_80B45980(unkstructInvadepoh1* arg0, s32 arg1) {
- f32 rand = Rand_ZeroOne();
- s32 i;
- unkstructInvadepoh1* ptr = arg0;
-
- arg1--;
- for (i = 0; i < arg1; i++, ptr++) {
- if (ptr->unk04 >= rand) {
- break;
- }
- }
-
- return (arg0 + i)->unk00;
-}
-
-void func_80B459E8(EnInvadePohStruct* s, unkstructInvadepoh4* u) {
- s->unk4 = u->unk00;
- s->unk8 = u;
- s->unkE = 0;
- s->unkF = *u->unk04->unk00;
- if (s->unk4 == 2) {
- s->unkC = Rand_S16Offset(u->unk10, u->unk12);
- }
-}
-
-void func_80B45A4C(EnInvadePohStruct* s, unkstructInvadepoh4** u) {
- unkstructInvadepoh4* new_var = s->unk8;
- unkstructInvadepoh0* temp_v1 = new_var->unk04;
-
- if (s->unkE < (temp_v1->unk04 - 1)) {
- s->unkE++;
- s->unkF = temp_v1->unk00[s->unkE];
- }
-}
-
-void func_80B45A94(EnInvadePohStruct* s, unkstructInvadepoh4** u) {
- unkstructInvadepoh0* temp_v1 = s->unk8->unk04;
- unkstructInvadepoh1* temp_a0;
-
- if (s->unkE < (temp_v1->unk04 - 1)) {
- s->unkE++;
- s->unkF = temp_v1->unk00[s->unkE];
- } else {
- func_80B459E8(s, u[func_80B45980(s->unk8->unk0C, s->unk8->unk08)]);
- }
-}
-
-void func_80B45B1C(EnInvadePohStruct* s, unkstructInvadepoh4** u) {
- unkstructInvadepoh0* temp_v1 = s->unk8->unk04;
- unkstructInvadepoh1* temp_a0;
-
- if (s->unkE < (temp_v1->unk04 - 1)) {
- s->unkE++;
- s->unkF = temp_v1->unk00[s->unkE];
- } else if (s->unkC > 0) {
- s->unkC--;
- } else {
- func_80B459E8(s, u[func_80B45980(s->unk8->unk0C, s->unk8->unk08)]);
- }
-}
-
-void func_80B45BB8(EnInvadePohStruct* s) {
- if ((s->unk0 != 0) && (s->unk8 != 0)) {
- D_80B4EC0C[s->unk4](s, (unkstructInvadepoh4**)s->unk0);
- }
-}
-
-void func_80B45C04(AlienBehaviorInfo* substruct, void* arg1[], s32 arg2, void* arg3[], s32 arg4, Vec3s* arg5, s16 arg6,
- f32 arg7, f32 arg8, f32 arg9) {
- unkstructInvadepoh4* temp_v0;
-
- Math_Vec3s_Copy(&substruct->unk26, arg5);
- substruct->unk2C = arg6;
- substruct->unk30 = arg7;
- substruct->unk38 = arg8;
- substruct->unk3C = arg9;
- if (arg1 != NULL) {
- temp_v0 = arg1[arg2];
- substruct->unk0.unk0 = (unkstructInvadepoh4*)arg1;
- substruct->unk0.unk4 = temp_v0->unk00;
- substruct->unk0.unkC = 0;
- substruct->unk0.unkE = 0;
- substruct->unk0.unk8 = temp_v0;
- substruct->unk0.unkF = *temp_v0->unk04->unk00;
- }
- if (arg3 != NULL) {
- temp_v0 = arg3[arg4];
- substruct->unk10.unk0 = (unkstructInvadepoh4*)arg3;
- substruct->unk10.unk4 = temp_v0->unk00;
- substruct->unk10.unkC = 0;
- substruct->unk10.unkE = 0;
- substruct->unk10.unk8 = temp_v0;
- substruct->unk10.unkF = *temp_v0->unk04->unk00;
- }
-}
-
-void func_80B45CE0(AlienBehaviorInfo* substruct) {
- Vec3f sp3C;
- Vec3s sp34;
- s16 step;
-
- sp34.x = substruct->unk26.x - substruct->unk20.x;
- sp34.y = substruct->unk26.y - substruct->unk20.y;
- sp34.z = substruct->unk26.z - substruct->unk20.z;
- Math_Vec3s_ToVec3f(&sp3C, &sp34);
- Math_Vec3f_Scale(&sp3C, substruct->unk30);
- Math_Vec3f_ToVec3s(&sp34, &sp3C);
- sp34.x = ABS(sp34.x);
- sp34.y = ABS(sp34.y);
- sp34.z = ABS(sp34.z);
- sp34.x = CLAMP_MAX(sp34.x, substruct->unk2C);
- sp34.y = CLAMP_MAX(sp34.y, substruct->unk2C);
- sp34.z = CLAMP_MAX(sp34.z, substruct->unk2C);
- Math_ScaledStepToS(&substruct->unk20.x, substruct->unk26.x, sp34.x);
- Math_ScaledStepToS(&substruct->unk20.y, substruct->unk26.y, sp34.y);
- Math_ScaledStepToS(&substruct->unk20.z, substruct->unk26.z, sp34.z);
- Math_StepToF(&substruct->unk34, substruct->unk38, substruct->unk3C);
-
- if (substruct->unk40 != substruct->unk42) {
- step = substruct->unk42 - substruct->unk40;
- step *= substruct->unk44;
- step = ABS(step);
- step = CLAMP(step, 100, substruct->unk48);
- Math_ScaledStepToS(&substruct->unk40, substruct->unk42, step);
- }
- func_80B45BB8(&substruct->unk0);
- func_80B45BB8(&substruct->unk10);
-}
-
-void func_80B45EC8(EnInvadepoh* this, PlayState* play, s32 arg2) {
- s16 phi_s0 = 0;
- Vec3f spA8;
- Vec3f sp9C;
- Vec3f sp90;
- f32 temp_f20;
- s32 i;
-
- for (i = 0; i < arg2; i++) {
- phi_s0 += (s16)(65536.0f / arg2);
-
- temp_f20 = (Rand_ZeroOne() * 0.5f) + 0.5f;
- spA8.x = Math_SinS(phi_s0) * temp_f20;
- spA8.z = Math_CosS(phi_s0) * temp_f20;
-
- sp9C.x = ((Rand_ZeroOne() * 16.0f) + (spA8.x * 30.0f)) - 8.0f;
- sp9C.y = -8.0f;
- sp9C.z = ((Rand_ZeroOne() * 16.0f) + (spA8.z * 30.0f)) - 8.0f;
-
- sp90.x = sp9C.x * -0.025f;
- sp90.y = sp9C.y * -0.025f;
- sp90.z = sp9C.z * -0.025f;
-
- spA8.x = (spA8.x * 100.0f) + this->actor.world.pos.x;
- spA8.y = ((Rand_ZeroOne() * 180.0f) + this->actor.world.pos.y) - 90.0f;
- spA8.z = (spA8.z * 100.0f) + this->actor.world.pos.z;
-
- EffectSsKirakira_SpawnDispersed(play, &spA8, &sp9C, &sp90, &D_80B4EC18, &D_80B4EC1C, 6000, -40);
- }
-}
-
-s32 func_80B46118(Vec3f* actorPos) {
- unkStruct80B50350* phi_v1;
- s32 i;
-
- for (phi_v1 = D_80B50350, i = 0; i < 10; phi_v1++, i++) {
- if (phi_v1->unk1 <= 0) {
- phi_v1->unk0 = 0;
- phi_v1->unk1 = 40;
- Math_Vec3f_Copy(&phi_v1->unk4, actorPos);
- phi_v1->unk2 = 0;
- return true;
- }
- }
- return false;
-}
-
-void func_80B46184(unkStruct80B50350* unkStruct) {
- if (unkStruct->unk1 > 20) {
- if (unkStruct->unk2 < 125) {
- unkStruct->unk2 += 10;
- } else {
- unkStruct->unk2 = 135;
- }
- } else if (unkStruct->unk2 > 13) {
- unkStruct->unk2 -= 13;
-
- } else {
- unkStruct->unk2 = 0;
- }
-}
-
-s32 func_80B461DC(void) {
- s32 phi_s4 = false;
- unkStruct80B50350* phi_s0;
- s32 i;
-
- for (phi_s0 = D_80B50350, i = 0; i < 10; phi_s0++, i++) {
- if (phi_s0->unk1 > 0) {
- D_80B4EC20[phi_s0->unk0](phi_s0);
- phi_s0->unk1--;
- phi_s4 = true;
- }
- }
- return phi_s4;
-}
-
-void func_80B4627C(EnInvadepoh* this, PlayState* play) {
- s32 invadepohType;
- s32 i;
-
- this->actor.flags |= ACTOR_FLAG_20;
- invadepohType = (this->actor.params >> 8) & 0x7F;
-
- for (i = 1; i < 8; i++) {
- Path* path = &play->setupPathList[invadepohType];
- invadepohType = path->unk1;
- if (invadepohType == 0xFF) {
- break;
- }
- }
-
- this->unk379 = i;
- func_80B451A0(this, play);
- func_80B45648(this);
- func_800BC154(play, &play->actorCtx, &this->actor, ACTORCAT_SWITCH);
-
- if (D_80B4E940 == 1) {
- func_80B46DA8(this);
- } else if (D_80B4E940 == 2) {
- if (gSaveContext.save.time < CLOCK_TIME(2, 31)) {
- func_80B46DA8(this);
- } else {
- func_80B454BC(this, play);
- func_80B452EC(this, play);
- Audio_QueueSeqCmd(NA_BGM_ALIEN_INVASION | 0x8000);
- func_80B46F88(this);
- }
- } else if (D_80B4E940 == 3) {
- if (gSaveContext.save.entrance == ENTRANCE(ROMANI_RANCH, 6)) {
- func_80B471C0(this);
-
- } else if (gSaveContext.save.entrance == ENTRANCE(ROMANI_RANCH, 7)) {
- func_80B47248(this);
- } else {
- func_80B47248(this);
- }
- } else if (D_80B4E940 == 4) {
- func_80B47304(this);
- }
-}
-
-void EnInvadepoh_InitAlien(EnInvadepoh* this, PlayState* play) {
- s32 pad;
-
- Actor_ProcessInitChain(&this->actor, D_80B4EC24);
- Collider_InitCylinder(play, &this->collider);
- ActorShape_Init(&this->actor.shape, 6800.0f, ActorShadow_DrawWhiteCircle, 150.0f);
- this->actor.shape.shadowAlpha = 140;
- this->actor.flags = (ACTOR_FLAG_10 | ACTOR_FLAG_1000 | ACTOR_FLAG_80000000);
- if (INVADEPOH_TYPE(&this->actor) == TYPE_ALIEN_CARRYING_COW) {
- this->actor.update = func_80B4D670;
- this->actor.world.pos.y = this->actor.home.pos.y + 150.0f;
- } else {
- this->actor.update = func_80B47BAC;
- Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInitAlien);
- this->actor.colChkInfo.mass = 40;
- }
- this->bankIndex = Object_GetIndex(&play->objectCtx, OBJECT_UCH);
- if (this->bankIndex < 0) {
- Actor_Kill(&this->actor);
- }
-}
-
-void EnInvadepoh_InitParentCow(EnInvadepoh* this, PlayState* play) {
- Actor_ProcessInitChain(&this->actor, sInitChainParentCow);
- this->actor.update = func_80B47FA8;
- Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_INVADEPOH, 0.0f, 0.0f, 0.0f, 0, 0, 0, 0x30);
- this->bankIndex = Object_GetIndex(&play->objectCtx, OBJECT_COW);
- if (this->bankIndex < 0) {
- Actor_Kill(&this->actor);
- }
-}
-
-void EnInvadepoh_InitChildCow(EnInvadepoh* this, PlayState* play) {
- Actor_ProcessInitChain(&this->actor, sInitChainChildCow);
- this->actor.update = func_80B481C4;
- this->bankIndex = Object_GetIndex(&play->objectCtx, OBJECT_COW);
- if (this->bankIndex < 0) {
- Actor_Kill(&this->actor);
- }
-}
-
-void EnInvadepoh_InitRomani(EnInvadepoh* this, PlayState* play) {
- s32 pad;
- s32 temp = INVADEPOH_TYPE(&this->actor);
-
- Actor_ProcessInitChain(&this->actor, sInitChainRomani);
-
- this->actor.targetMode = (temp == 7 || temp == 0xC) ? 3 : 6;
-
- func_800BC154(play, &play->actorCtx, &this->actor, ACTORCAT_NPC);
- Collider_InitCylinder(play, &this->collider);
- if (temp != 4) {
- ActorShape_Init(&this->actor.shape, 0, ActorShadow_DrawCircle, 18.0f);
- Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInitRomaniAndCremia);
- this->actor.colChkInfo.mass = MASS_IMMOVABLE;
- }
- if (temp == 4) {
- this->actor.update = func_80B48620;
- } else if (temp == 5) {
- this->actor.update = func_80B48FB0;
- this->actor.flags = (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10);
- } else if (temp == 7) {
- this->actor.update = func_80B49F88;
- } else if (temp == 8) {
- this->actor.update = func_80B4A9C8;
- } else if (temp == 9) {
- this->actor.update = func_80B4B0C4;
- } else {
- this->actor.update = func_80B4CE54;
- }
-
- this->bankIndex = Object_GetIndex(&play->objectCtx, OBJECT_MA1);
- if (this->bankIndex < 0) {
- Actor_Kill(&this->actor);
- }
-
- if (temp == 5) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
- Actor_Kill(&this->actor);
- return;
- }
- } else if (temp == 7) {
- if (gSaveContext.save.time < CLOCK_TIME(6, 0) && gSaveContext.save.time >= CLOCK_TIME(2, 15)) {
- Actor_Kill(&this->actor);
- return;
- }
- } else if (temp != 8) {
- if (temp == 9) {
- if (gSaveContext.save.entrance != ENTRANCE(ROMANI_RANCH, 6)) {
- Actor_Kill(&this->actor);
- return;
- }
- } else if (temp == 0xC) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
- Actor_Kill(&this->actor);
- }
- D_80B503F4 = this;
- }
- }
-}
-
-void func_80B468B4(EnInvadepoh* this, PlayState* play) {
- Actor_ProcessInitChain(&this->actor, D_80B4EC68);
- this->actor.update = func_80B49B1C;
- this->actor.draw = func_80B4E3F0;
- func_800BC154(play, &play->actorCtx, &this->actor, ACTORCAT_NPC);
- if (D_80B4E940 == 1 || gSaveContext.save.time < CLOCK_TIME(2, 31)) {
- this->actor.world.pos.x += D_80B4E934.x;
- this->actor.world.pos.y += D_80B4E934.y + 3000.0f;
- this->actor.world.pos.z += D_80B4E934.z;
- func_80B491EC(this);
- } else if (D_80B4E940 == 2) {
- this->actor.world.pos.y += 1500.0f;
- func_80B49628(this);
- } else {
- Actor_Kill(&this->actor);
- }
-}
-
-void EnInvadepoh_InitDog(EnInvadepoh* this, PlayState* play) {
- s32 pad;
-
- Actor_ProcessInitChain(&this->actor, sInitChainDog);
- this->actor.update = func_80B4B8BC;
- Collider_InitCylinder(play, &this->collider);
- Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInitDog);
- this->actor.colChkInfo.mass = 80;
- ActorShape_Init(&this->actor.shape, 0, ActorShadow_DrawCircle, 24.0f);
- this->bankIndex = Object_GetIndex(&play->objectCtx, OBJECT_DOG);
- if (this->bankIndex < 0) {
- Actor_Kill(&this->actor);
- }
-}
-
-void EnInvadepoh_InitCremia(EnInvadepoh* this, PlayState* play) {
- s32 pad;
-
- Actor_ProcessInitChain(&this->actor, sInitChainCremia);
- this->actor.update = func_80B4C3A0;
- func_800BC154(play, &play->actorCtx, &this->actor, ACTORCAT_NPC);
- Collider_InitCylinder(play, &this->collider);
- Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInitRomaniAndCremia);
- this->actor.colChkInfo.mass = MASS_HEAVY;
- ActorShape_Init(&this->actor.shape, 0, ActorShadow_DrawCircle, 18.0f);
- this->bankIndex = Object_GetIndex(&play->objectCtx, OBJECT_MA2);
- if (this->bankIndex < 0) {
- Actor_Kill(&this->actor);
- }
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
- Actor_Kill(&this->actor);
- }
- D_80B503F8 = this;
-}
-
-void EnInvadepoh_Init(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
-
- D_80B4ECB0[INVADEPOH_TYPE(&this->actor)](this, play);
-}
-
-void func_80B46BB0(EnInvadepoh* this, PlayState* play) {
-}
-
-void func_80B46BC0(EnInvadepoh* this, PlayState* play) {
- s32 pad;
- s32 invadepohType = this->actor.params & 7;
-
- Collider_DestroyCylinder(play, &this->collider);
- D_80B50320[invadepohType] = 0;
-}
-
-void func_80B46C08(EnInvadepoh* this, PlayState* play) {
- if (this->actor.parent != NULL) {
- this->actor.parent->child = NULL;
- }
-
- if (this->actor.child != NULL) {
- this->actor.child->parent = NULL;
- }
-}
-
-void func_80B46C34(EnInvadepoh* this, PlayState* play) {
- if (this->actor.parent != NULL) {
- this->actor.parent->child = NULL;
- }
-}
-
-void func_80B46C50(EnInvadepoh* this, PlayState* play) {
- Collider_DestroyCylinder(play, &this->collider);
-}
-
-void func_80B46C7C(EnInvadepoh* this, PlayState* play) {
- D_80B503F0 = NULL;
-}
-
-void func_80B46C94(EnInvadepoh* this, PlayState* play) {
- Collider_DestroyCylinder(play, &this->collider);
-}
-
-void func_80B46CC0(EnInvadepoh* this, PlayState* play) {
- Collider_DestroyCylinder(play, &this->collider);
- D_80B503F8 = NULL;
-}
-
-void func_80B46CF4(EnInvadepoh* this, PlayState* play) {
- Collider_DestroyCylinder(play, &this->collider);
- D_80B503F4 = NULL;
-}
-
-void func_80B46D28(EnInvadepoh* this, PlayState* play) {
- Collider_DestroyCylinder(play, &this->collider);
- if (!this) {} // required to match
- if (this->actor.child != NULL) {
- this->actor.child->parent = NULL;
- }
-}
-
-void EnInvadepoh_Destroy(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
-
- D_80B4ECE8[INVADEPOH_TYPE(&this->actor)](this, play);
-}
-
-void func_80B46DA8(EnInvadepoh* this) {
- D_80B4E940 = 1;
- this->actionFunc = func_80B46DC8;
-}
-
-void func_80B46DC8(EnInvadepoh* this, PlayState* play) {
- if ((gSaveContext.save.time < CLOCK_TIME(6, 0)) && (gSaveContext.save.time >= CLOCK_TIME(2, 30))) {
- func_80B454BC(this, play);
- func_80B452EC(this, play);
- func_80B46E20(this);
- }
-}
-
-void func_80B46E20(EnInvadepoh* this) {
- D_80B4E940 = 2;
- this->actionTimer = 2;
- this->actionFunc = func_80B46E44;
-}
-
-void func_80B46E44(EnInvadepoh* this, PlayState* play) {
- if (this->actionTimer > 0) {
- this->actionTimer--;
- } else if (ActorCutscene_GetCanPlayNext(D_80B50404[0])) {
- ActorCutscene_StartAndSetUnkLinkFields(D_80B50404[0], &this->actor);
- func_80B46EC0(this);
- } else {
- ActorCutscene_SetIntentToPlay(D_80B50404[0]);
- }
-}
-
-void func_80B46EC0(EnInvadepoh* this) {
- D_80B4E940 = 2;
- this->actionTimer = 160;
- this->actionFunc = func_80B46EE8;
-}
-
-void func_80B46EE8(EnInvadepoh* this, PlayState* play) {
- s32 i;
-
- for (i = 0; i < 8; i++) {
- if (this->actionTimer == D_80B4ED20[i]) {
- D_80B50340[i] |= 1;
- }
- }
-
- this->actionTimer--;
- if (this->actionTimer <= 0) {
- ActorCutscene_Stop(D_80B50404[0]);
- Audio_QueueSeqCmd(NA_BGM_ALIEN_INVASION | 0x8000);
- func_80B46F88(this);
- }
-}
-
-void func_80B46F88(EnInvadepoh* this) {
- D_80B4E940 = 2;
- this->actionFunc = func_80B46FA8;
-}
-
-void func_80B46FA8(EnInvadepoh* this, PlayState* play) {
- s32 i;
-
- if ((gSaveContext.save.time < CLOCK_TIME(6, 0)) && (gSaveContext.save.time >= CLOCK_TIME(5, 15))) {
- SET_WEEKEVENTREG(WEEKEVENTREG_22_01);
- func_80B47064(this);
- } else {
- func_80B457A0(this);
- for (i = 0; i < this->unk379; i++) {
- if ((D_80B50320[i] != NULL) && (D_80B50320[i]->unk38A != 0)) {
- func_80B47278(this);
- break;
- }
- }
- }
-}
-
-void func_80B47064(EnInvadepoh* this) {
- D_80B4E940 = 3;
- this->actionFunc = func_80B47084;
-}
-
-void func_80B47084(EnInvadepoh* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(D_80B50404[1])) {
- ActorCutscene_StartAndSetUnkLinkFields(D_80B50404[1], &this->actor);
- func_80B470E0(this);
- } else {
- ActorCutscene_SetIntentToPlay(D_80B50404[1]);
- }
-}
-
-void func_80B470E0(EnInvadepoh* this) {
- D_80B4E940 = 3;
- this->actionTimer = 110;
- this->actionFunc = func_80B47108;
-}
-
-void func_80B47108(EnInvadepoh* this, PlayState* play) {
- if (this->actionTimer == 100) {
- Audio_PlayFanfare(NA_BGM_CLEAR_EVENT);
- }
- this->actionTimer--;
- if (this->actionTimer <= 0) {
- play->nextEntrance = ENTRANCE(ROMANI_RANCH, 6);
- gSaveContext.nextCutsceneIndex = 0;
- play->transitionTrigger = TRANS_TRIGGER_START;
- play->transitionType = TRANS_TYPE_73;
- gSaveContext.nextTransitionType = TRANS_TYPE_72;
- D_801BDAA0 = 1;
- D_801BDA9C = 0;
- func_80B47248(this);
- }
-}
-
-void func_80B471C0(EnInvadepoh* this) {
- D_80B4E940 = 3;
- this->actionFunc = func_80B471E0;
-}
-
-void func_80B471E0(EnInvadepoh* this, PlayState* play) {
- if (D_80B4E998) {
- play->nextEntrance = ENTRANCE(ROMANI_RANCH, 7);
- gSaveContext.nextCutsceneIndex = 0;
- play->transitionTrigger = TRANS_TRIGGER_START;
- play->transitionType = TRANS_TYPE_72;
- gSaveContext.nextTransitionType = TRANS_TYPE_72;
- func_80B47248(this);
- }
-}
-
-void func_80B47248(EnInvadepoh* this) {
- D_80B4E940 = 3;
- this->actionFunc = func_80B47268;
-}
-
-void func_80B47268(EnInvadepoh* this, PlayState* play) {
-}
-
-void func_80B47278(EnInvadepoh* this) {
- D_80B4E940 = 4;
- this->actionFunc = func_80B47298;
-}
-
-void func_80B47298(EnInvadepoh* this, PlayState* play) {
- play->nextEntrance = ENTRANCE(ROMANI_RANCH, 0);
- gSaveContext.nextCutsceneIndex = 0xFFF3;
- play->transitionTrigger = TRANS_TRIGGER_START;
- play->transitionType = TRANS_TYPE_72;
- gSaveContext.nextTransitionType = TRANS_TYPE_72;
- SET_WEEKEVENTREG(WEEKEVENTREG_89_10);
- func_80B47304(this);
-}
-
-void func_80B47304(EnInvadepoh* this) {
- D_80B4E940 = 4;
- this->actionFunc = func_80B47324;
-}
-
-void func_80B47324(EnInvadepoh* this, PlayState* play) {
-}
-
-void EnInvadepoh_Update(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
-
- this->actionFunc(this, play);
- if (func_80B461DC()) {
- this->actor.draw = func_80B4D9B4;
- } else {
- this->actor.draw = NULL;
- }
-}
-
-void func_80B47380(EnInvadepoh* this) {
- this->collider.base.atFlags &= ~AT_ON;
- this->collider.base.acFlags &= ~AC_ON;
- this->collider.base.ocFlags1 &= ~OC1_ON;
- this->actor.flags &= ~ACTOR_FLAG_80000000;
- this->alienAlpha = 0;
- this->actor.draw = NULL;
- this->drawAlien = false;
- this->drawAlienDeathEffect = false;
- this->alienBeamAlpha = 0;
- this->actionFunc = func_80B473E4;
-}
-
-void func_80B473E4(EnInvadepoh* this, PlayState* play) {
- func_80B442E4(this);
- func_80B447C0(this, play);
- func_80B43DD4(this, 800, 0);
- if (D_80B50340[this->actor.params & 7] & 1) {
- Actor_SetScale(&this->actor, 0.01f);
- func_80B4516C(this);
- func_80B46118(&this->actor.world.pos);
- func_80B47568(this);
- }
-}
-
-void func_80B47478(EnInvadepoh* this) {
- this->collider.base.atFlags &= ~AT_ON;
- this->collider.base.acFlags &= ~AC_ON;
- this->collider.base.ocFlags1 &= ~OC1_ON;
- this->actor.flags &= ~ACTOR_FLAG_80000000;
- this->alienAlpha = 0;
- this->actor.draw = NULL;
- this->drawAlien = false;
- this->drawAlienDeathEffect = false;
- this->alienBeamAlpha = 0;
- this->actionFunc = func_80B474DC;
-}
-
-void func_80B474DC(EnInvadepoh* this, PlayState* play) {
- func_80B442E4(this);
- func_80B447C0(this, play);
- func_80B43DD4(this, 800, 0);
- if (this->clockTime > 0.0f) {
- Actor_SetScale(&this->actor, 0.01f);
- func_80B4516C(this);
- func_80B46118(&this->actor.world.pos);
- func_80B47568(this);
- }
-}
-
-void func_80B47568(EnInvadepoh* this) {
- Animation_MorphToLoop(&this->skelAnime, &gAlienFloatAnim, -6.0f);
- this->collider.base.atFlags &= ~AT_ON;
- this->collider.base.acFlags &= ~AC_ON;
- this->collider.base.ocFlags1 &= ~OC1_ON;
- this->alienAlpha = 0;
- this->actor.draw = func_80B4DB14;
- this->drawAlien = true;
- this->drawAlienDeathEffect = false;
- this->alienBeamAlpha = 0;
- this->actor.flags |= ACTOR_FLAG_80000000;
- this->actionFunc = func_80B47600;
-}
-
-void func_80B47600(EnInvadepoh* this, PlayState* play) {
- func_80B442E4(this);
- func_80B447C0(this, play);
- func_80B43DD4(this, 800, 0);
- func_800B9010(&this->actor, NA_SE_EN_FOLLOWERS_BEAM_PRE - SFX_FLAG);
- if (this->clockTime >= 0.9999f) {
- this->unk38A = 1;
- }
- if (this->alienAlpha > 248) {
- this->alienAlpha = 255;
- } else {
- this->alienAlpha += 6;
- }
- if (this->alienAlpha > 128) {
- this->collider.base.atFlags |= AT_ON;
- this->collider.base.acFlags |= AC_ON;
- this->collider.base.ocFlags1 |= OC1_ON;
- }
- if (this->alienAlpha == 255) {
- if (this->alienBeamAlpha >= 245) {
- this->alienBeamAlpha = 255;
- func_80B4770C(this);
- } else {
- this->alienBeamAlpha += 10;
- }
- }
-}
-
-void func_80B4770C(EnInvadepoh* this) {
- if (this->skelAnime.animation != &gAlienFloatAnim) {
- Animation_MorphToLoop(&this->skelAnime, &gAlienFloatAnim, -6.0f);
- }
- this->collider.base.atFlags |= AT_ON;
- this->collider.base.acFlags |= AC_ON;
- this->collider.base.ocFlags1 |= OC1_ON;
- this->alienAlpha = 255;
- this->actor.draw = func_80B4DB14;
- this->drawAlien = true;
- this->drawAlienDeathEffect = false;
- this->alienBeamAlpha = 255;
- this->actor.flags |= ACTOR_FLAG_80000000;
- this->actionFunc = func_80B477B4;
-}
-
-void func_80B477B4(EnInvadepoh* this, PlayState* play) {
- func_80B442E4(this);
- func_80B447C0(this, play);
- func_80B43DD4(this, 800, 0);
- func_800B9010(&this->actor, NA_SE_EN_FOLLOWERS_BEAM_PRE - SFX_FLAG);
- if (this->clockTime >= 0.9999f) {
- this->unk38A = 1;
- }
-}
-
-void func_80B47830(EnInvadepoh* this) {
- this->collider.base.atFlags &= ~AT_ON;
- this->collider.base.acFlags &= ~AC_ON;
- this->collider.base.ocFlags1 |= OC1_ON;
- Animation_PlayLoop(&this->skelAnime, &gAlienJerkingAnim);
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 16);
- this->alienAlpha = 255;
- this->actor.draw = func_80B4DB14;
- this->drawAlien = true;
- this->drawAlienDeathEffect = false;
- this->alienBeamAlpha = 0;
- this->actionTimer = 8;
- this->counter = 0;
- this->actor.flags |= ACTOR_FLAG_80000000;
- this->actionFunc = func_80B478F4;
-}
-
-void func_80B478F4(EnInvadepoh* this, PlayState* play) {
- func_80B44A90(this, play);
- this->actionTimer--;
- if (this->actionTimer <= 0) {
- func_80B47938(this);
- }
-}
-
-void func_80B47938(EnInvadepoh* this) {
- this->collider.base.atFlags &= ~AT_ON;
- this->collider.base.acFlags &= ~AC_ON;
- this->collider.base.ocFlags1 &= ~OC1_ON;
- Animation_PlayLoop(&this->skelAnime, &gAlienDeathAnim);
- this->actor.flags &= ~ACTOR_FLAG_1;
- this->actionTimer = 10;
- this->alienAlpha = 255;
- this->actor.draw = func_80B4DB14;
- this->drawAlien = true;
- this->drawAlienDeathEffect = false;
- this->alienBeamAlpha = 255;
- this->actor.flags |= ACTOR_FLAG_80000000;
- this->actionFunc = func_80B479E8;
-}
-
-void func_80B479E8(EnInvadepoh* this, PlayState* play) {
- s16 unk2F2;
- u32 index;
-
- func_80B44B78(this);
- if (this->counter < 5) {
- if (D_80B4ED30[this->counter].x > 0.0f) {
- this->drawAlien = true;
- this->alienBeamAlpha = 255;
- Math_Vec3f_Copy(&this->actor.scale, &D_80B4ED30[this->counter]);
- } else {
- this->drawAlien = false;
- this->alienBeamAlpha = 0;
- }
- } else {
- this->drawAlien = false;
- this->alienBeamAlpha = 0;
- }
-
- unk2F2 = this->counter;
- if ((unk2F2 >= 2) && (unk2F2 < 9)) {
- index = unk2F2 - 2;
- if (D_80B4ED6C[index].x > 0.0f) {
- this->drawAlienDeathEffect = true;
- Math_Vec3f_Copy(&this->alienDeathEffectScale, &D_80B4ED6C[index]);
- } else {
- this->drawAlienDeathEffect = false;
- }
- } else {
- this->drawAlienDeathEffect = false;
- }
-
- this->counter++;
- if (this->actionTimer == 8) {
- Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->actor.world.pos.x, this->actor.world.pos.y - 10.0f,
- this->actor.world.pos.z, 0, 0, 3, CLEAR_TAG_SMOKE);
- }
-
- if (this->actionTimer == 8) {
- Enemy_StartFinishingBlow(play, &this->actor);
- }
-
- this->actionTimer--;
- if (this->actionTimer <= 0) {
- func_80B43AF0(this->actor.params & 7);
- func_80B43AB0();
- Item_DropCollectible(play, &this->actor.world.pos, ITEM00_ARROWS_30);
- func_80B47478(this);
- }
-}
-
-void func_80B47BAC(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
-
- if (Object_IsLoaded(&play->objectCtx, this->bankIndex)) {
- this->actor.objBankIndex = this->bankIndex;
- Actor_SetObjectDependency(play, &this->actor);
- func_80B45080();
- this->actor.update = func_80B47D30;
- SkelAnime_InitFlex(play, &this->skelAnime, &gAlienSkel, &gAlienFloatAnim, this->jointTable, this->morphTable,
- ALIEN_LIMB_MAX);
- this->skelAnime.curFrame = (this->actor.params & 7) * this->skelAnime.endFrame * 0.125f;
- func_80B444BC(this, play);
- func_80B442E4(this);
- func_80B447C0(this, play);
- func_80B43F0C(this);
- func_80B4516C(this);
- if (D_80B4E940 == 1 || gSaveContext.save.time < CLOCK_TIME(2, 31)) {
- func_80B47380(this);
- } else if (D_80B4E940 == 2) {
- if (this->clockTime >= 0.0001f) {
- func_80B4770C(this);
- } else {
- func_80B47568(this);
- }
- } else {
- Actor_Kill(&this->actor);
- }
- }
-}
-
-void func_80B47D30(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
- s32 pad;
-
- if (D_80B4E940 == 3) {
- if ((this->actionFunc == func_80B477B4) || (this->actionFunc == func_80B47600)) {
- thisx->speedXZ = 0.0f;
- thisx->velocity.y = 0.0f;
- thisx->gravity = 0.0f;
- func_80B47830(this);
- } else if ((this->actionFunc == func_80B474DC) || (this->actionFunc == func_80B473E4)) {
- Actor_Kill(&this->actor);
- return;
- }
- } else if (this->collider.base.acFlags & AC_HIT) {
- Actor* acAttached = this->collider.base.ac;
-
- thisx->speedXZ = acAttached->speedXZ * 0.5f;
- thisx->speedXZ = CLAMP(thisx->speedXZ, -60.0f, 60.0f);
- thisx->world.rot.y = acAttached->world.rot.y;
- thisx->gravity = 0.0f;
- thisx->velocity.y = acAttached->velocity.y * 0.5f;
- thisx->velocity.y = CLAMP(thisx->velocity.y, -30.0f, 30.0f);
- SoundSource_PlaySfxAtFixedWorldPos(play, &thisx->world.pos, 50, NA_SE_EN_INVADER_DEAD);
- func_80B47830(this);
- }
-
- this->actionFunc(this, play);
- if (thisx->draw != NULL) {
- this->animPlayFlag = SkelAnime_Update(&this->skelAnime);
- }
-
- Collider_UpdateCylinder(&this->actor, &this->collider);
- if (this->collider.base.atFlags & AT_ON) {
- CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
- } else {
- this->collider.base.atFlags &= ~AT_HIT;
- }
-
- if (this->collider.base.acFlags & AC_ON) {
- CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
- } else {
- this->collider.base.acFlags &= ~AC_HIT;
- }
-
- if (this->collider.base.ocFlags1 & OC1_ON) {
- CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- } else {
- this->collider.base.ocFlags1 &= ~OC1_HIT;
- }
-}
-
-void func_80B47FA8(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
- s32 pad;
-
- if (Object_IsLoaded(&play->objectCtx, this->bankIndex)) {
- this->actor.objBankIndex = this->bankIndex;
- Actor_SetObjectDependency(play, thisx);
- this->actor.update = func_80B48060;
- this->actor.draw = func_80B4E158;
- SkelAnime_InitFlex(play, &this->skelAnime, &gCowSkel, NULL, this->jointTable, this->morphTable, COW_LIMB_MAX);
- Animation_PlayLoop(&this->skelAnime, &gCowMooAnim);
- }
-}
-
-void func_80B48060(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
- s32 pad;
- s32 temp;
- s32 pad2;
- MtxF unkMtx;
-
- if (D_80B503F0 == NULL || this->actor.parent == NULL) {
- Actor_Kill(&this->actor);
- return;
- }
-
- temp = this->actor.params & 7;
- SkelAnime_Update(&this->skelAnime);
- Math_ScaledStepToS(&this->actor.shape.rot.x, D_80B4EDC0[temp], 0x32);
- if (this->actor.child != NULL) {
- Matrix_Push();
- Matrix_SetTranslateRotateYXZ(this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z,
- &this->actor.shape.rot);
- Matrix_Translate(0, 57.0f, -36.0f, MTXMODE_APPLY);
- Matrix_RotateXS(this->actor.shape.rot.x * -0.7f, MTXMODE_APPLY);
- Matrix_RotateZS(this->actor.shape.rot.z * -0.7f, MTXMODE_APPLY);
- Matrix_MultZero(&this->actor.child->world.pos);
- Matrix_Get(&unkMtx);
- Matrix_MtxFToYXZRot(&unkMtx, &this->actor.child->shape.rot, false);
- Matrix_Pop();
- }
-}
-
-void func_80B481C4(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
- s32 pad;
-
- if (Object_IsLoaded(&play->objectCtx, this->bankIndex)) {
- this->actor.objBankIndex = this->bankIndex;
- Actor_SetObjectDependency(play, &this->actor);
- this->actor.update = func_80B4827C;
- this->actor.draw = func_80B4E1B0;
- SkelAnime_InitFlex(play, &this->skelAnime, &gCowTailSkel, NULL, this->jointTable, this->morphTable,
- COW_TAIL_LIMB_MAX);
- Animation_PlayLoop(&this->skelAnime, &gCowTailSwishAnim);
- }
-}
-
-void func_80B4827C(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
-
- if (D_80B503F0 == NULL || this->actor.parent == NULL) {
- Actor_Kill(&this->actor);
- return;
- }
-
- SkelAnime_Update(&this->skelAnime);
-}
-
-void func_80B482D4(EnInvadepoh* this) {
- this->actionTimer = 40;
- Animation_MorphToLoop(&this->skelAnime, &gRomaniLookAroundAnim, -10.0f);
- this->actor.draw = NULL;
- this->actionFunc = func_80B48324;
-}
-
-void func_80B48324(EnInvadepoh* this, PlayState* play) {
- this->actionTimer--;
- if (this->actionTimer <= 0) {
- EnInvadepoh_SetTextID(this, play, 0x332F);
- this->actor.draw = func_80B4E324;
- func_80B48374(this);
- }
-}
-
-void func_80B48374(EnInvadepoh* this) {
- this->actionTimer = 60;
- Animation_MorphToLoop(&this->skelAnime, &gRomaniLookAroundAnim, -10.0f);
- this->actor.draw = func_80B4E324;
- this->actionFunc = func_80B483CC;
-}
-
-void func_80B483CC(EnInvadepoh* this, PlayState* play) {
- if (this->actionTimer == 20) {
- f32 unkFloat = 0.1f;
-
- this->behaviorInfo.unk26.x = 2000;
- this->behaviorInfo.unk26.y = 0;
- this->behaviorInfo.unk26.z = 0;
- this->behaviorInfo.unk30 = unkFloat;
- this->behaviorInfo.unk2C = 1000;
- }
-
- this->actionTimer--;
- if (this->actionTimer <= 0) {
- func_80B4843C(this);
- }
-}
-
-void func_80B4843C(EnInvadepoh* this) {
- this->behaviorInfo.unk26.x = 3000;
- this->behaviorInfo.unk26.y = 0;
- this->behaviorInfo.unk26.z = 0;
- this->behaviorInfo.unk30 = 0.24f;
- this->behaviorInfo.unk2C = 3000;
- this->behaviorInfo.unk42 = 15000;
- this->behaviorInfo.unk44 = 0.1f;
- this->behaviorInfo.unk48 = 2000;
- this->actionTimer = 50;
- Animation_Change(&this->skelAnime, &gRomaniRunAnim, 2.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -5.0f);
- this->actor.draw = func_80B4E324;
- this->actionFunc = func_80B484EC;
-}
-
-void func_80B484EC(EnInvadepoh* this, PlayState* play) {
- if (this->actionTimer == 40) {
- this->behaviorInfo.unk26.y = 7000;
- } else if (this->actionTimer == 30) {
- this->behaviorInfo.unk26.y = -7000;
- } else if (this->actionTimer == 20) {
- this->behaviorInfo.unk26.y = 7000;
- } else if (this->actionTimer == 10) {
- this->behaviorInfo.unk26.y = 0;
- }
- this->actionTimer--;
- if (this->actionTimer <= 0) {
- func_80B48588(this);
- }
-}
-
-void func_80B48588(EnInvadepoh* this) {
- this->behaviorInfo.unk26.x = 0;
- this->behaviorInfo.unk26.y = 0;
- this->behaviorInfo.unk26.z = 0;
- this->behaviorInfo.unk30 = 0.24f;
- this->behaviorInfo.unk2C = 5000;
- this->behaviorInfo.unk42 = 0;
- this->behaviorInfo.unk44 = 0.28f;
- this->behaviorInfo.unk48 = 7000;
- Animation_MorphToPlayOnce(&this->skelAnime, &gRomaniIdleAnim, -10.0f);
- this->actor.draw = func_80B4E324;
- this->actionFunc = func_80B48610;
-}
-
-void func_80B48610(EnInvadepoh* this, PlayState* play) {
-}
-
-void func_80B48620(Actor* thisx, PlayState* play) {
- s32 pad[2];
- EnInvadepoh* this = THIS;
-
- if (Object_IsLoaded(&play->objectCtx, this->bankIndex)) {
- this->actor.objBankIndex = this->bankIndex;
- Actor_SetObjectDependency(play, &this->actor);
- func_80B44F58();
- this->actor.update = func_80B4873C;
- SkelAnime_InitFlex(play, &this->skelAnime, &gRomaniSkel, &gRomaniIdleAnim, this->jointTable, this->morphTable,
- ROMANI_LIMB_MAX);
- func_80B45C04(&this->behaviorInfo, D_80B4EA90, 6, D_80B4EB00, 2, &gZeroVec3s, 5000, 0.05f, 0.3f, 0.12f);
- Animation_PlayLoop(&this->skelAnime, &gRomaniIdleAnim);
- func_80B482D4(this);
- }
-}
-
-void func_80B4873C(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
- s32 pad;
- AlienBehaviorInfo* substruct = &this->behaviorInfo;
-
- if (this->actor.parent == NULL) {
- Actor_Kill(&this->actor);
- return;
- }
- this->actionFunc(this, play);
- SkelAnime_Update(&this->skelAnime);
- func_80B45CE0(substruct);
- if (substruct->unk40 != 0) {
- this->actor.shape.rot.x = -substruct->unk40;
- }
-}
-
-void func_80B487B4(EnInvadepoh* this) {
- AlienBehaviorInfo* substruct = &this->behaviorInfo;
- u32 new_var;
-
- this->actionTimer = Rand_S16Offset(150, 250);
- new_var = Rand_Next();
- substruct->unk26.x = D_80B4EDC8[new_var >> 0x1E];
- substruct->unk26.y = 0;
- substruct->unk26.z = 0;
- substruct->unk30 = 0.1f;
- substruct->unk2C = 800;
- Animation_MorphToLoop(&this->skelAnime, &gRomaniWalkAnim, -10.0f);
- this->actionFunc = func_80B48848;
-}
-
-void func_80B48848(EnInvadepoh* this, PlayState* play) {
- s32 pad;
-
- Math_StepToF(&this->actor.speedXZ, 1.6f, 0.1f);
- if (func_80B44B84(this, play, this->actor.speedXZ, 50.0f)) {
- func_80B44514(this);
- this->behaviorInfo.unk4C = 0xC8;
- this->actor.speedXZ *= 0.25f;
- } else {
- Math_StepToS(&this->behaviorInfo.unk4C, 0x7D0, 0x46);
- }
- func_80B43E6C(this, 6, this->behaviorInfo.unk4C, 0x46);
- if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_40) &&
- (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 7.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_ROMANI_WALK);
- }
- if (this->actionTimer > 0) {
- this->actionTimer--;
- } else {
- func_80B48948(this);
- }
-}
-
-void func_80B48948(EnInvadepoh* this) {
- AlienBehaviorInfo* substruct = &this->behaviorInfo;
- f32 rand = Rand_ZeroOne();
-
- this->actionTimer = Rand_S16Offset(150, 150);
- if (rand < 0.5f) {
- this->rand = 0;
- Math_Vec3s_Copy(&substruct->unk26, &gZeroVec3s);
- substruct->unk30 = 0.1f;
- substruct->unk2C = 1000;
- } else if (rand < 0.75f) {
- this->rand = 1;
- substruct->unk26.x = Rand_S16Offset(0, 2000);
- substruct->unk26.y = 0;
- substruct->unk26.z = 0;
- substruct->unk30 = 0.06f;
- substruct->unk2C = 1000;
- } else if (rand < 0.8f) {
- this->rand = 2;
- substruct->unk26.x = Rand_S16Offset(-2000, 2000);
- substruct->unk26.y = 0;
- substruct->unk26.z = 0;
- substruct->unk30 = 0.05f;
- substruct->unk2C = 1000;
- } else {
- this->rand = 3;
- substruct->unk26.x = 0;
- substruct->unk26.y = 0;
- substruct->unk26.z = Rand_S16Offset(-2500, 5000);
- substruct->unk30 = 0.04f;
- substruct->unk2C = 1000;
- }
-
- Animation_MorphToLoop(&this->skelAnime, &gRomaniIdleAnim, -10.0f);
- this->actionFunc = func_80B48AD4;
-}
-
-void func_80B48AD4(EnInvadepoh* this, PlayState* play) {
- AlienBehaviorInfo* substruct = &this->behaviorInfo;
- Player* player;
- s16 new_var3;
- s16 temp_v1;
- s32 temp_v1_3;
-
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.2f);
- if (func_80B44B84(this, play, this->actor.speedXZ, 50.0f)) {
- func_80B44514(this);
- }
-
- if (this->rand == 0) {
- s32 requiredScopeTemp;
-
- if ((this->actor.xzDistToPlayer < 350.0f) && ((play->gameplayFrames & 0x60) != 0)) {
- player = GET_PLAYER(play);
- temp_v1 = Math_Vec3f_Pitch(&this->actor.focus.pos, &player->actor.focus.pos) * 0.85f;
- temp_v1 -= this->actor.shape.rot.x;
- substruct->unk26.x = CLAMP(temp_v1, -2500, 2500);
- new_var3 = BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y);
- temp_v1 = new_var3 * 0.7f;
- substruct->unk26.y = CLAMP(temp_v1, -0x1F40, 0x1F40);
- }
- } else {
- substruct->unk26.x = 0;
- substruct->unk26.y = 0;
- }
-
- if (this->actionTimer > 0) {
- temp_v1_3 = this->actionTimer & 0x1F;
- if ((temp_v1_3 == 0) && (Rand_ZeroOne() < 0.3f)) {
- temp_v1_3 = (s32)Rand_Next() % 4;
- if (temp_v1_3 != this->rand) {
- this->rand = temp_v1_3;
- if (this->rand == 0) {
- Math_Vec3s_Copy(&substruct->unk26, &gZeroVec3s);
- substruct->unk30 = 0.07f;
- } else if (this->rand == 1) {
- substruct->unk26.x = Rand_S16Offset(1000, 1000);
- substruct->unk26.y = Rand_S16Offset(-1000, 2000);
- substruct->unk26.z = Rand_S16Offset(-800, 1600);
- substruct->unk30 = 0.06f;
- } else if (this->rand == 2) {
- substruct->unk26.x = Rand_S16Offset(-2000, 1000);
- substruct->unk26.y = Rand_S16Offset(-1000, 2000);
- substruct->unk26.z = Rand_S16Offset(-800, 1600);
- substruct->unk30 = 0.05f;
- } else {
- substruct->unk26.x = Rand_S16Offset(-1000, 2000);
- substruct->unk26.y = Rand_S16Offset(-2000, 4000);
- substruct->unk26.z = Rand_S16Offset(-2000, 4000);
- substruct->unk30 = 0.04f;
- }
- }
- }
-
- this->actionTimer--;
- } else {
- func_80B487B4(this);
- }
-}
-
-void func_80B48DE4(EnInvadepoh* this) {
- AlienBehaviorInfo* substruct = &this->behaviorInfo;
-
- this->actor.speedXZ = 0.0f;
- Animation_MorphToLoop(&this->skelAnime, &gRomaniIdleAnim, -10.0f);
- this->behaviorInfo.unk4C = 0;
- substruct->unk30 = 0.05f;
- substruct->unk2C = 1200;
- this->actionFunc = func_80B48E4C;
-}
-
-void func_80B48E4C(EnInvadepoh* this, PlayState* play) {
- AlienBehaviorInfo* substruct = &this->behaviorInfo;
- Player* player = GET_PLAYER(play);
- s16 temp_v1;
- s16 diff;
-
- Math_StepToS(&this->behaviorInfo.unk4C, 2000, 50);
- Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 6, this->behaviorInfo.unk4C, 35);
- temp_v1 = Math_Vec3f_Pitch(&this->actor.focus.pos, &player->actor.focus.pos);
- temp_v1 *= 0.85f;
- temp_v1 -= this->actor.shape.rot.x;
- substruct->unk26.x = CLAMP(temp_v1, -0xBB8, 0xBB8);
- diff = BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y);
- temp_v1 = diff * 0.7f;
- substruct->unk26.y = CLAMP(temp_v1, -0x1F40, 0x1F40);
- if (Actor_TextboxIsClosing(&this->actor, play)) {
- func_80B48948(this);
- }
-}
-
-void func_80B48FB0(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
-
- if (Object_IsLoaded(&play->objectCtx, this->bankIndex)) {
- this->actor.objBankIndex = this->bankIndex;
- Actor_SetObjectDependency(play, &this->actor);
- func_80B44F58();
- this->actor.update = func_80B490F0;
- this->actor.draw = func_80B4E324;
- this->actor.textId = 0x3330;
- SkelAnime_InitFlex(play, &this->skelAnime, &gRomaniSkel, &gRomaniIdleAnim, this->jointTable, this->morphTable,
- ROMANI_LIMB_MAX);
- func_80B45C04(&this->behaviorInfo, D_80B4EA90, 6, D_80B4EB00, 2, &gZeroVec3s, 100, 0.03, 0.3, 0.03);
- func_80B444F4(this, play);
- EnInvadepoh_SetPathPointToWorldPos(this, 0);
- func_800B4AEC(play, &this->actor, 50.0f);
- func_80B4516C(this);
- func_80B487B4(this);
- }
-}
-
-void func_80B490F0(Actor* thisx, PlayState* play) {
- s32 pad;
- EnInvadepoh* this = THIS;
- s32 sp2C = CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_40);
- s32 isTalking = Actor_ProcessTalkRequest(&this->actor, &play->state);
-
- if (isTalking) {
- func_80151BB4(play, 5);
- func_80B48DE4(this);
- }
- this->actionFunc(this, play);
- if (sp2C) {
- SkelAnime_Update(&this->skelAnime);
- func_80B45CE0(&this->behaviorInfo);
- if ((this->actionFunc != func_80B48E4C) && !isTalking && this->actor.isTargeted) {
- func_800B8614(&this->actor, play, 100.0f);
- }
- Collider_UpdateCylinder(&this->actor, &this->collider);
- CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- }
-}
-
-void func_80B491EC(EnInvadepoh* this) {
- this->scaleFactorAdj = 0.0f;
- this->scaleStep = 0.0f;
- this->unk3AA = 0;
- this->actor.gravity = -15.0f;
- this->scaleTarget = 1.0f;
- this->actionFunc = func_80B49228;
-}
-
-void func_80B49228(EnInvadepoh* this, PlayState* play) {
- s32 pad;
- f32 temp_f0;
-
- Actor_UpdateVelocityWithGravity(&this->actor);
- this->actor.velocity.y *= 0.97f;
- temp_f0 = Math_SmoothStepToF(&this->actor.world.pos.y, this->actor.home.pos.y + D_80B4E934.y + 300.0f, 0.7f,
- fabsf(this->actor.velocity.y), 1.0f);
- func_800B9010(&this->actor, NA_SE_EV_UFO_APPEAR - SFX_FLAG);
- if (fabsf(temp_f0) < 1.0f) {
- func_80B45EC8(this, play, 50);
- func_80B492FC(this);
- }
-}
-
-void func_80B492FC(EnInvadepoh* this) {
- this->actor.velocity.y *= 0.1f;
- this->actionTimer = 20;
- this->scaleTarget = 0.3f;
- this->scaleStep = 0.03f;
- this->unk3AA = 3000;
- this->actionFunc = func_80B4934C;
-}
-
-void func_80B4934C(EnInvadepoh* this, PlayState* play) {
- f32 temp = this->actor.home.pos.y + D_80B4E934.y + 300.0f;
-
- if (this->actor.world.pos.y < temp) {
- this->actor.gravity = 3.0f;
- } else {
- this->actor.gravity = -2.0f;
- }
- this->actor.velocity.y *= 0.96f;
- Actor_MoveWithGravity(&this->actor);
- func_800B9010(&this->actor, NA_SE_EV_UFO_APPEAR - SFX_FLAG);
- this->actionTimer--;
- if (this->actionTimer <= 0) {
- func_80B49404(this);
- }
-}
-
-void func_80B49404(EnInvadepoh* this) {
- this->actionTimer = 120;
- this->scaleTarget = 0.2f;
- this->scaleStep = 0.01f;
- this->unk3AA = 3000;
- this->unk3AC = 0;
- this->counter = 0;
- this->actor.gravity = 33.0f;
- this->actionFunc = func_80B49454;
-}
-
-void func_80B49454(EnInvadepoh* this, PlayState* play) {
- s32 pad;
- Vec3f sp30;
- s32 pad2;
-
- if (this->counter < 25) {
- this->counter++;
- } else {
- this->counter = 0;
- this->unk3AC++;
- this->unk3AC = CLAMP_MAX(this->unk3AC, 4);
- this->actor.gravity = 33.0f;
- func_80B45EC8(this, play, 20);
- }
-
- Math_Vec3f_Sum(&D_80B4EDD0[this->unk3AC], &this->actor.home.pos, &sp30);
- if (Math3D_Vec3fDistSq(&this->actor.world.pos, &sp30) < SQ(400.0f)) {
- this->actor.speedXZ *= 0.8f;
- } else {
- Math_StepToF(&this->actor.speedXZ, 170.0f, 21.0f);
- this->actor.speedXZ *= 0.98f;
- }
- if (func_80B450C0(&this->actor.world.pos.x, &this->actor.world.pos.z, sp30.x, sp30.z, this->actor.speedXZ)) {
- this->actor.speedXZ = 0.0f;
- }
- if (sp30.y < this->actor.world.pos.y) {
- Math_StepToF(&this->actor.gravity, -12.0f, 7.0f);
- } else {
- Math_StepToF(&this->actor.gravity, 5.0f, 4.0f);
- }
- this->actor.velocity.y += this->actor.gravity;
- this->actor.velocity.y *= 0.97f;
- this->actor.world.pos.y += this->actor.velocity.y;
- func_800B9010(&this->actor, NA_SE_EV_UFO_APPEAR - SFX_FLAG);
- if (this->actionTimer > 0) {
- this->actionTimer--;
- } else {
- func_80B49628(this);
- }
-}
-
-void func_80B49628(EnInvadepoh* this) {
- this->scaleTarget = 0.2f;
- this->scaleStep = 0.01f;
- this->unk3AA = 3000;
- this->actor.velocity.y *= 0.8f;
- this->actionFunc = func_80B49670;
-}
-
-void func_80B49670(EnInvadepoh* this, PlayState* play) {
- s32 pad;
- Vec3f sp30;
-
- sp30.x = this->actor.home.pos.x;
- sp30.y = this->actor.home.pos.y + 1500.0f;
- sp30.z = this->actor.home.pos.z;
- Math_SmoothStepToS(&this->actor.world.rot.y, Math_Vec3f_Yaw(&this->actor.world.pos, &sp30), 0xA, 0xBB8, 0x64);
- if ((play->gameplayFrames % 64) < 14) {
- Math_StepToF(&this->actor.speedXZ, 5.0f, 1.0f);
- } else {
- this->actor.speedXZ *= 0.97f;
- }
- if (sp30.y < this->actor.world.pos.y) {
- this->actor.gravity = -0.5f;
- } else {
- this->actor.gravity = 2.0f;
- }
- this->actor.velocity.y *= 0.97f;
- Actor_MoveWithGravity(&this->actor);
- if (D_80B4E940 == 3) {
- func_80B499BC(this);
- }
-}
-
-void func_80B497A4(EnInvadepoh* this) {
- this->scaleTarget = 0.2f;
- this->scaleStep = 0.01f;
- this->unk3AA = 3000;
- this->actionTimer = 35;
- this->actor.gravity = -1.5f;
- this->actionFunc = func_80B497EC;
-}
-
-void func_80B497EC(EnInvadepoh* this, PlayState* play) {
- s32 pad;
- Vec3f sp30;
-
- sp30.x = this->actor.home.pos.x + D_80B4E934.x;
- sp30.y = this->actor.home.pos.y + D_80B4E934.y + 400.0f;
- sp30.z = this->actor.home.pos.z + D_80B4E934.z;
- Math_SmoothStepToS(&this->actor.world.rot.y, Math_Vec3f_Yaw(&this->actor.world.pos, &sp30), 4, 0x1F40, 0x64);
- Math_StepToF(&this->actor.speedXZ, 70.0f, 3.0f);
- if (sp30.y < this->actor.world.pos.y) {
- this->actor.gravity = -2.0f;
- } else {
- this->actor.gravity = 2.0f;
- }
- this->actor.velocity.y *= 0.97f;
- Actor_MoveWithGravity(&this->actor);
- if (this->actionTimer > 0) {
- this->actionTimer--;
- } else {
- func_80B49904(this);
- }
-}
-
-void func_80B49904(EnInvadepoh* this) {
- this->scaleTarget = 0.2f;
- this->scaleStep = 0.01f;
- this->unk3AA = 3000;
- this->actionTimer = 60;
- this->actor.gravity = 1.0f;
- this->actionFunc = func_80B4994C;
-}
-
-void func_80B4994C(EnInvadepoh* this, PlayState* play) {
- Math_StepToF(&this->actor.speedXZ, 150.0f, 4.0f);
- this->actor.velocity.y *= 0.95f;
- Actor_MoveWithGravity(&this->actor);
- if (this->actionTimer > 0) {
- this->actionTimer--;
- } else {
- Actor_Kill(&this->actor);
- }
-}
-
-void func_80B499BC(EnInvadepoh* this) {
- this->actionTimer = 40;
- this->scaleTarget = 0.2f;
- this->scaleStep = 0.01f;
- this->unk3AA = 3000;
- this->actor.speedXZ = 0.0f;
- this->actionFunc = func_80B49A00;
-}
-
-void func_80B49A00(EnInvadepoh* this, PlayState* play) {
- s32 pad;
- Vec3f sp30;
-
- sp30.x = this->actor.home.pos.x;
- sp30.y = this->actor.home.pos.y + 800.0f;
- sp30.z = this->actor.home.pos.z;
- Math_SmoothStepToS(&this->actor.world.rot.y, Math_Vec3f_Yaw(&this->actor.world.pos, &sp30), 4, 0x1F40, 0x64);
- Math_StepToF(&this->actor.speedXZ, 30.0f, 3.0f);
- this->actor.velocity.y *= 0.98f;
- if (sp30.y < this->actor.world.pos.y) {
- this->actor.gravity = -0.5f;
- } else {
- this->actor.gravity = 2.0f;
- }
- Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
- if (this->actionTimer > 0) {
- this->actionTimer--;
- } else {
- func_80B497A4(this);
- }
-}
-
-void func_80B49B1C(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
- f32 scale;
-
- this->actionFunc(this, play);
- this->scaleAdjAngle += this->unk3AA;
- Math_StepToF(&this->scaleFactorAdj, this->scaleTarget, this->scaleStep);
- scale = Math_SinS(this->scaleAdjAngle) * this->scaleFactorAdj + 1.0f;
- Actor_SetScale(&this->actor, 0.27f * scale);
- Math_StepToS(&this->unk306, 600, 8);
- this->actor.world.rot.y += this->unk306;
- this->unk304 += 600;
-}
-
-void func_80B49BD0(EnInvadepoh* this) {
- AlienBehaviorInfo* substruct = &this->behaviorInfo;
-
- Animation_MorphToLoop(&this->skelAnime, &gRomaniWalkAnim, -10.0f);
- substruct->unk26.x = 0;
- substruct->unk26.y = 0;
- substruct->unk26.z = 0;
- substruct->unk30 = 0.1f;
- substruct->unk2C = 800;
- this->actionFunc = func_80B49C38;
-}
-
-void func_80B49C38(EnInvadepoh* this, PlayState* play) {
- s32 pad;
- s32 temp_v0_2;
-
- func_80B44570(this);
- func_80B44C24(this, play);
- func_80B43E6C(this, 6, 2000, 100);
- if (1) {}
- if (this->pathIndex == 0 || (this->pathIndex + 1) == this->endPoint) {
- if (this->unk378 == 0) {
- temp_v0_2 = func_800FE620(play);
- if (temp_v0_2 > 0) {
- temp_v0_2 = (R_TIME_SPEED * -16.0f / temp_v0_2) - 0.5f;
- this->unk378 = func_80B45550(this, play, SQ(80.0f), temp_v0_2);
- }
- }
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
- } else {
- this->unk378 = 0;
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
- }
-
- if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_40) &&
- (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 7.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_ROMANI_WALK);
- }
- if (this->clockTime >= 0.9999f) {
- Actor_Kill(&this->actor);
- }
-}
-
-void func_80B49DA0(EnInvadepoh* this) {
- this->behaviorInfo.unk30 = 0.08f;
- this->behaviorInfo.unk2C = 2000;
- this->behaviorInfo.unk4C = 0;
- Animation_MorphToLoop(&this->skelAnime, &gRomaniIdleAnim, -10.0f);
- this->actionFunc = func_80B49DFC;
-}
-
-void func_80B49DFC(EnInvadepoh* this, PlayState* play) {
- AlienBehaviorInfo* substruct = &this->behaviorInfo;
- Player* player = GET_PLAYER(play);
- s16 temp_v1;
- s16 diff;
-
- Math_StepToS(&this->behaviorInfo.unk4C, 2000, 500);
- Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 5, this->behaviorInfo.unk4C, 40);
- temp_v1 = (Math_Vec3f_Pitch(&this->actor.focus.pos, &player->actor.focus.pos) * 0.85f);
- temp_v1 -= this->actor.shape.rot.x;
- substruct->unk26.x = CLAMP(temp_v1, -0xBB8, 0xBB8);
- diff = BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y);
- temp_v1 = diff;
- temp_v1 *= 0.7f;
- substruct->unk26.y = CLAMP(temp_v1, -0x1F40, 0x1F40);
- if (Actor_TextboxIsClosing(&this->actor, play)) {
- if (this->actor.textId == 0x332D) {
- SET_WEEKEVENTREG(WEEKEVENTREG_54_10);
- this->actor.textId = 0x332E;
- }
- func_80B49BD0(this);
- }
-}
-
-void func_80B49F88(Actor* thisx, PlayState* play) {
- s32 pad[2];
- EnInvadepoh* this = THIS;
- s32 sp38;
-
- if (Object_IsLoaded(&play->objectCtx, this->bankIndex)) {
- sp38 = gSaveContext.save.time;
- this->actor.objBankIndex = this->bankIndex;
- Actor_SetObjectDependency(play, &this->actor);
- func_80B44F58();
- SkelAnime_InitFlex(play, &this->skelAnime, &gRomaniSkel, &gRomaniWalkAnim, this->jointTable, this->morphTable,
- ROMANI_LIMB_MAX);
- func_80B45C04(&this->behaviorInfo, D_80B4EA90, 1, D_80B4EB00, 1, &gZeroVec3s, 100, 0.03, 0.3, 0.03);
- func_80B44540(this, play);
- func_80B44570(this);
- func_80B44C24(this, play);
- func_80B43F0C(this);
- func_80B4516C(this);
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_21_20)) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_54_10)) {
- this->actor.textId = 0x332E;
- } else {
- this->actor.textId = 0x332D;
- }
-
- } else {
- this->actor.textId = 0x332C;
- }
-
- if (sp38 >= CLOCK_TIME(18, 0) || sp38 < CLOCK_TIME(2, 0)) {
- this->actor.update = func_80B4A168;
- this->actor.draw = NULL;
- } else if ((sp38 < CLOCK_TIME(6, 0)) && (sp38 >= CLOCK_TIME(2, 0)) && (sp38 < CLOCK_TIME(2, 15))) {
- this->actor.update = func_80B4A1B8;
- this->actor.draw = func_80B4E324;
- func_80B49BD0(this);
- } else {
- Actor_Kill(&this->actor);
- }
- }
-}
-
-void func_80B4A168(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
-
- if ((gSaveContext.save.time < CLOCK_TIME(6, 0)) && (gSaveContext.save.time >= CLOCK_TIME(2, 0))) {
- this->actor.update = func_80B4A1B8;
- this->actor.draw = func_80B4E324;
- func_80B49BD0(this);
- }
-}
-
-void func_80B4A1B8(Actor* thisx, PlayState* play) {
- s32 pad;
- EnInvadepoh* this = THIS;
- s32 sp2C = CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_40);
- s32 isTalking = Actor_ProcessTalkRequest(&this->actor, &play->state);
-
- if (isTalking) {
- func_80151BB4(play, 5);
- func_80B49DA0(this);
- }
- this->actionFunc(this, play);
- if (sp2C && this->actor.update != NULL) {
- SkelAnime_Update(&this->skelAnime);
- func_80B45CE0(&this->behaviorInfo);
- if ((this->actionFunc != func_80B49DFC) && !isTalking && this->actor.isTargeted) {
- func_800B8614(&this->actor, play, 350.0f);
- }
- Collider_UpdateCylinder(&this->actor, &this->collider);
- CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- }
-}
-
-void func_80B4A2C0(EnInvadepoh* this) {
- AlienBehaviorInfo* substruct = &this->behaviorInfo;
-
- Animation_MorphToLoop(&this->skelAnime, &gRomaniIdleAnim, -10.0f);
- substruct->unk26.x = 0;
- substruct->unk26.y = 0;
- substruct->unk26.z = 0;
- substruct->unk30 = 0.1f;
- substruct->unk2C = 1500;
- this->actionTimer = Rand_S16Offset(200, 200);
- this->unk304 = this->actor.shape.rot.y;
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
- this->actionFunc = func_80B4A350;
-}
-
-void func_80B4A350(EnInvadepoh* this, PlayState* play) {
- s16 temp_v0;
- s16 temp_v1_2;
- s16 diff;
- Vec3f sp44;
- s16 sp42;
- AlienBehaviorInfo* substruct = &this->behaviorInfo;
-
- if ((play->gameplayFrames % 256) == 0) {
- Math_Vec3s_ToVec3f(&sp44, this->pathPoints);
- sp42 = Math_Vec3f_Yaw(&this->actor.world.pos, &sp44);
- temp_v0 = Rand_S16Offset(-0x1F40, 0x3E80);
- this->unk304 = temp_v0 + sp42;
- this->behaviorInfo.unk4C = 0;
- }
-
- Math_StepToS(&this->behaviorInfo.unk4C, 2000, 40);
- Math_SmoothStepToS(&this->actor.shape.rot.y, this->unk304, 6, this->behaviorInfo.unk4C, 40);
- if (this->actor.xzDistToPlayer < 300.0f) {
- Player* player = GET_PLAYER(play);
-
- temp_v1_2 = Math_Vec3f_Pitch(&this->actor.focus.pos, &player->actor.focus.pos);
- temp_v1_2 *= 0.85f;
- temp_v1_2 -= this->actor.shape.rot.x;
- substruct->unk26.x = CLAMP(temp_v1_2, -0x9C4, 0x9C4);
- diff = BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y);
- temp_v1_2 = diff;
- temp_v1_2 *= 0.7f;
- substruct->unk26.y = CLAMP(temp_v1_2, -0x1F40, 0x1F40);
- if ((play->gameplayFrames % 256) == 0) {
- substruct->unk26.z = Rand_S16Offset(-0x5DC, 0xBB8);
- }
- } else {
- substruct->unk26.x = 0;
- substruct->unk26.y = 0;
- substruct->unk26.z = 0;
- }
- if (this->actionTimer > 0) {
- this->actionTimer--;
- } else {
- func_80B4A570(this);
- }
-}
-
-void func_80B4A570(EnInvadepoh* this) {
- AlienBehaviorInfo* substruct = &this->behaviorInfo;
-
- Animation_MorphToPlayOnce(&this->skelAnime, &gRomaniLookAroundAnim, -10.0f);
- substruct->unk26.x = 0;
- substruct->unk26.y = 0;
- substruct->unk26.z = 0;
- substruct->unk30 = 0.1f;
- substruct->unk2C = 800;
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
- this->actionFunc = func_80B4A5E4;
-}
-
-void func_80B4A5E4(EnInvadepoh* this, PlayState* play) {
- if (this->animPlayFlag) {
- func_80B4A2C0(this);
- }
-}
-
-void func_80B4A614(EnInvadepoh* this) {
- AlienBehaviorInfo* substruct = &this->behaviorInfo;
-
- Animation_MorphToLoop(&this->skelAnime, &gRomaniWalkAnim, 0.0f);
- substruct->unk26.x = 0;
- substruct->unk26.y = 0;
- substruct->unk26.z = 0;
- substruct->unk30 = 0.1f;
- substruct->unk2C = 800;
- this->actionFunc = func_80B4A67C;
-}
-
-void func_80B4A67C(EnInvadepoh* this, PlayState* play) {
- s32 pad;
-
- Math_StepToF(&this->actor.speedXZ, 5.0f, 1.0f);
- if (func_80B44B84(this, play, this->actor.speedXZ, 50.0f)) {
- func_80B44640(this);
- this->behaviorInfo.unk4C = 0x5DC;
- this->actor.speedXZ *= 0.5f;
- } else {
- Math_StepToS(&this->behaviorInfo.unk4C, 0x190, 0x32);
- }
- func_80B43E6C(this, 6, this->behaviorInfo.unk4C, 0x32);
- if (this->pathIndex == 0) {
- if (this->unk378 == 0) {
- this->unk378 = func_80B45550(this, play, SQ(80.0f), -0xF);
- }
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
- } else {
- this->unk378 = 0;
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
- }
- if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_40) &&
- (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 7.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_ROMANI_WALK);
- }
- if (this->pathIndex == this->endPoint) {
- func_80B4A2C0(this);
- }
-}
-
-void func_80B4A7C0(EnInvadepoh* this) {
- this->behaviorInfo.unk30 = 0.08f;
- this->behaviorInfo.unk2C = 2000;
- this->behaviorInfo.unk4C = 0;
- Animation_MorphToLoop(&this->skelAnime, &gRomaniIdleAnim, 0.0f);
- this->actionFunc = func_80B4A81C;
-}
-
-void func_80B4A81C(EnInvadepoh* this, PlayState* play) {
- AlienBehaviorInfo* substruct = &this->behaviorInfo;
- Player* player = GET_PLAYER(play);
- s16 temp_v1;
- s16 diff;
-
- Math_StepToS(&this->behaviorInfo.unk4C, 2000, 500);
- Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 5, this->behaviorInfo.unk4C, 40);
- temp_v1 = (Math_Vec3f_Pitch(&this->actor.focus.pos, &player->actor.focus.pos) * 0.85f);
- temp_v1 -= this->actor.shape.rot.x;
- substruct->unk26.x = CLAMP(temp_v1, -0xBB8, 0xBB8);
- diff = BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y);
- temp_v1 = diff;
- temp_v1 *= 0.7f;
- substruct->unk26.y = CLAMP(temp_v1, -0x1F40, 0x1F40);
-
- if (Actor_TextboxIsClosing(&this->actor, play)) {
- if (this->actor.textId == 0x332D) {
- SET_WEEKEVENTREG(WEEKEVENTREG_54_10);
- this->actor.textId = 0x332E;
- }
- if (this->pathIndex == this->endPoint) {
- func_80B4A2C0(this);
- } else {
- func_80B4A614(this);
- }
- }
-}
-
-void func_80B4A9C8(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
- s32 pad[2];
- s32 sp38;
-
- if (Object_IsLoaded(&play->objectCtx, this->bankIndex)) {
- sp38 = gSaveContext.save.time;
- this->actor.objBankIndex = this->bankIndex;
- Actor_SetObjectDependency(play, &this->actor);
- func_80B44F58();
- SkelAnime_InitFlex(play, &this->skelAnime, &gRomaniSkel, &gRomaniWalkAnim, this->jointTable, this->morphTable,
- ROMANI_LIMB_MAX);
- func_80B45C04(&this->behaviorInfo, D_80B4EA90, 1, D_80B4EB00, 1, &gZeroVec3s, 100, 0.03f, 0.3f, 0.03f);
- func_80B44620(this, play);
- if ((sp38 < CLOCK_TIME(2, 15)) || (sp38 >= CLOCK_TIME(6, 0))) {
- this->pathIndex = 0;
- this->actor.update = func_80B4AB8C;
- } else {
- this->pathIndex = this->endPoint;
- this->actor.update = func_80B4ABDC;
- this->actor.draw = func_80B4E324;
- func_80B4A2C0(this);
- }
-
- EnInvadepoh_SetPathPointToWorldPos(this, this->pathIndex);
- func_80B43F0C(this);
- func_800B4AEC(play, &this->actor, 50.0f);
- func_80B4516C(this);
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_21_20)) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_54_10)) {
- this->actor.textId = 0x332E;
- } else {
- this->actor.textId = 0x332D;
- }
- } else {
- this->actor.textId = 0x332C;
- }
- }
-}
-
-void func_80B4AB8C(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
-
- if ((gSaveContext.save.time < CLOCK_TIME(6, 0)) && (gSaveContext.save.time >= CLOCK_TIME(2, 15))) {
- this->actor.update = func_80B4ABDC;
- this->actor.draw = func_80B4E324;
- func_80B4A614(this);
- }
-}
-
-void func_80B4ABDC(Actor* thisx, PlayState* play) {
- s32 pad;
- EnInvadepoh* this = THIS;
- s32 sp2C = CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_40);
- s32 isTalking = Actor_ProcessTalkRequest(&this->actor, &play->state);
-
- if (isTalking) {
- func_80151BB4(play, 5);
- func_80B4A7C0(this);
- }
- this->actionFunc(this, play);
- if (sp2C) {
- this->animPlayFlag = SkelAnime_Update(&this->skelAnime);
- func_80B45CE0(&this->behaviorInfo);
- if ((this->actionFunc != func_80B4A81C) && !isTalking && this->actor.isTargeted) {
- func_800B8614(&this->actor, play, 100.0f);
- }
- Collider_UpdateCylinder(&this->actor, &this->collider);
- CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- }
-}
-
-void func_80B4ACDC(EnInvadepoh* this) {
- this->actionFunc = func_80B4ACF0;
-}
-
-void func_80B4ACF0(EnInvadepoh* this, PlayState* play) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
- this->actor.draw = func_80B4E324;
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
- func_80B4AD3C(this);
- }
-}
-
-void func_80B4AD3C(EnInvadepoh* this) {
- this->actor.flags |= ACTOR_FLAG_10000;
- this->actionFunc = func_80B4AD60;
-}
-
-void func_80B4AD60(EnInvadepoh* this, PlayState* play) {
- if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- EnInvadepoh_SetTextID(this, play, 0x3331);
- func_80B4ADB8(this);
- } else {
- func_800B8614(&this->actor, play, 2000.0f);
- }
-}
-
-void func_80B4ADB8(EnInvadepoh* this) {
- this->actionFunc = func_80B4ADCC;
-}
-
-void func_80B4ADCC(EnInvadepoh* this, PlayState* play) {
- if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- if (this->textId == 0x3331) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_02)) {
- EnInvadepoh_SetTextID(this, play, 0x3334);
- func_80151BB4(play, 0x1D);
- func_80151BB4(play, 5);
- return;
- }
- EnInvadepoh_SetTextID(this, play, 0x3333);
- return;
- }
- if (this->textId == 0x3333) {
- func_80B4AEC0(this);
- } else if (this->textId == 0x3334) {
- func_801477B4(play);
- func_80B4B024(this);
- }
- }
-}
-
-void func_80B4AEC0(EnInvadepoh* this) {
- this->actionTimer = 2;
- this->actionFunc = func_80B4AEDC;
-}
-
-void func_80B4AEDC(EnInvadepoh* this, PlayState* play) {
- if (this->actionTimer > 0) {
- this->actionTimer--;
- if (this->actionTimer == 0) {
- func_801477B4(play);
- }
- }
- if (Actor_HasParent(&this->actor, play)) {
- this->actor.parent = NULL;
- SET_WEEKEVENTREG(WEEKEVENTREG_22_02);
- func_80B4AF80(this);
- } else {
- Actor_PickUp(&this->actor, play, GI_MILK_BOTTLE, 2000.0f, 2000.0f);
- }
-}
-
-void func_80B4AF80(EnInvadepoh* this) {
- this->actionFunc = func_80B4AF94;
-}
-
-void func_80B4AF94(EnInvadepoh* this, PlayState* play) {
- if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- EnInvadepoh_SetTextID(this, play, 0x3334);
- func_80151BB4(play, 0x1E);
- func_80151BB4(play, 0x1D);
- func_80151BB4(play, 5);
- func_80B4ADB8(this);
- } else {
- func_800B85E0(&this->actor, play, 2000.0f, PLAYER_IA_MINUS1);
- }
-}
-
-void func_80B4B024(EnInvadepoh* this) {
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
- this->actionFunc = func_80B4B048;
-}
-
-void func_80B4B048(EnInvadepoh* this, PlayState* play) {
- if (play->msgCtx.unk120B1 == 0) {
- if (play->msgCtx.msgMode == 0) {
- D_80B4E998 = 1;
- } else if ((Message_GetState(&play->msgCtx) == TEXT_STATE_DONE) ||
- (Message_GetState(&play->msgCtx) == TEXT_STATE_5)) {
- D_80B4E998 = 1;
- }
- }
-}
-
-void func_80B4B0C4(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
- AlienBehaviorInfo* substruct;
- s32 pad;
-
- if (Object_IsLoaded(&play->objectCtx, this->bankIndex)) {
- this->actor.objBankIndex = this->bankIndex;
- Actor_SetObjectDependency(play, &this->actor);
- func_80B44F58();
- this->actor.update = func_80B4B218;
- SkelAnime_InitFlex(play, &this->skelAnime, &gRomaniSkel, &gRomaniWalkAnim, this->jointTable, this->morphTable,
- ROMANI_LIMB_MAX);
- Animation_MorphToLoop(&this->skelAnime, &gRomaniIdleAnim, 0.0f);
- substruct = &this->behaviorInfo;
- func_80B45C04(&this->behaviorInfo, D_80B4EA90, 1, D_80B4EB00, 3, &gZeroVec3s, 2000, 0.08f, 0.3f, 0.03f);
- substruct->unk30 = 0.08f;
- substruct->unk2C = 0x7D0;
- func_800B4AEC(play, &this->actor, 50.0f);
- func_80B4516C(this);
- func_80B4ACDC(this);
- }
-}
-
-void func_80B4B218(Actor* thisx, PlayState* play) {
- s16 diff;
- EnInvadepoh* this = THIS;
- s16 temp_v1;
- s32 sp38 = CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_40);
- Player* player;
- AlienBehaviorInfo* substruct = &this->behaviorInfo;
-
- this->actionFunc(this, play);
- if (sp38 && this->actor.update != NULL) {
- SkelAnime_Update(&this->skelAnime);
- player = GET_PLAYER(play);
- Math_StepToS(&this->behaviorInfo.unk4C, 2000, 40);
- Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 6, this->behaviorInfo.unk4C, 40);
- temp_v1 = (Math_Vec3f_Pitch(&this->actor.focus.pos, &player->actor.focus.pos) * 0.9f);
- temp_v1 -= this->actor.shape.rot.x;
- substruct->unk26.x = CLAMP(temp_v1, -0xBB8, 0xBB8);
- diff = BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y);
- temp_v1 = diff;
- temp_v1 *= 0.7f;
- substruct->unk26.y = CLAMP(temp_v1, -0x1F40, 0x1F40);
- func_80B45CE0(substruct);
- Collider_UpdateCylinder(&this->actor, &this->collider);
- CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- }
-}
-
-void func_80B4B3DC(EnInvadepoh* this) {
- s32 pad;
-
- if (Animation_OnFrame(&this->skelAnime, 1.0f) || Animation_OnFrame(&this->skelAnime, 7.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_MONKEY_WALK);
- }
-}
-
-void func_80B4B430(EnInvadepoh* this) {
- Animation_MorphToLoop(&this->skelAnime, &gDogWalkAnim, -6.0f);
- this->actionTimer = Rand_S16Offset(50, 80);
- this->actionFunc = func_80B4B484;
-}
-
-void func_80B4B484(EnInvadepoh* this, PlayState* play) {
- Math_StepToF(&this->actor.speedXZ, 1.1f, 0.5f);
- if (func_80B44C80(this, play)) {
- func_80B44690(this);
- }
- func_80B4B3DC(this);
- if (this->unk3BC >= 0) {
- this->actionTimer = 0;
- }
-
- if (this->actionTimer > 0) {
- this->actionTimer--;
- } else {
- func_80B4B510(this);
- }
-}
-
-void func_80B4B510(EnInvadepoh* this) {
- Animation_MorphToLoop(&this->skelAnime, &gDogRunAnim, -6.0f);
- this->actionTimer = Rand_S16Offset(50, 200);
- this->actionFunc = func_80B4B564;
-}
-
-void func_80B4B564(EnInvadepoh* this, PlayState* play) {
- s32 pad;
- Vec3f sp28;
- f32 temp_f0;
-
- Math_StepToF(&this->actor.speedXZ, 3.8f, 0.45f);
-
- if (this->unk3BC >= 0) {
- Math_Vec3s_ToVec3f(&sp28, &this->pathPoints[this->unk3BC]);
- temp_f0 = Math3D_Vec3fDistSq(&this->actor.world.pos, &sp28);
- if (temp_f0 < SQ(80.0f)) {
- this->actor.speedXZ *= 0.85f;
- } else if (temp_f0 < SQ(150.0f)) {
- this->actor.speedXZ *= 0.93f;
- } else if (temp_f0 < SQ(250.0f)) {
- this->actor.speedXZ *= 0.96f;
- }
- if (this->pathIndex == this->unk3BC || temp_f0 < SQ(50.0f)) {
- this->actionTimer = 0;
- }
- }
- func_80B4B3DC(this);
- if (func_80B44C80(this, play)) {
- func_80B44690(this);
- }
-
- if (this->actionTimer > 0) {
- this->actionTimer--;
- } else if (this->unk3BC >= 0) {
- if ((D_80B50348 == 0) && (Rand_ZeroOne() < 0.4f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_SMALL_DOG_GROAN);
- }
- func_80B4B724(this);
- } else {
- func_80B4B430(this);
- }
-}
-
-void func_80B4B724(EnInvadepoh* this) {
- Animation_MorphToPlayOnce(&this->skelAnime, &gDogBarkAnim, -6.0f);
- this->actionFunc = func_80B4B768;
-}
-
-void func_80B4B768(EnInvadepoh* this, PlayState* play) {
- s32 pad;
-
- Math_StepToF(&this->actor.speedXZ, 0.0f, 1.0f);
- Math_SmoothStepToS(&this->actor.world.rot.y, Actor_YawBetweenActors(&this->actor, &D_80B5040C->actor), 5, 0x1388,
- 0x64);
- func_80B44E90(this, play);
- if (Animation_OnFrame(&this->skelAnime, 13.0f) || Animation_OnFrame(&this->skelAnime, 19.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_SMALL_DOG_ANG_BARK);
- }
- if (this->animPlayFlag) {
- func_80B4B510(this);
- }
-}
-
-void func_80B4B820(EnInvadepoh* this) {
- Animation_MorphToPlayOnce(&this->skelAnime, &gDogJumpAnim, -6.0f);
- this->actionFunc = func_80B4B864;
-}
-
-void func_80B4B864(EnInvadepoh* this, PlayState* play) {
- Math_StepToF(&this->actor.speedXZ, 0.5f, 1.0f);
- func_80B44E90(this, play);
- if (this->animPlayFlag) {
- func_80B4B510(this);
- }
-}
-
-void func_80B4B8BC(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
- s32 pad;
-
- if (Object_IsLoaded(&play->objectCtx, this->bankIndex)) {
- this->actor.objBankIndex = this->bankIndex;
- Actor_SetObjectDependency(play, &this->actor);
- SkelAnime_InitFlex(play, &this->skelAnime, &gDogSkel, &gDogWalkAnim, this->jointTable, this->morphTable,
- DOG_LIMB_MAX);
- func_80B45C04(&this->behaviorInfo, 0, 0, 0, 0, &gZeroVec3s, 3000, 0.1f, 0.0f, 0.0f);
- func_80B44664(this, play);
- EnInvadepoh_SetPathPointToWorldPos(this, 0);
- func_800B4AEC(play, &this->actor, 50.0f);
- func_80B4516C(this);
- Math_Vec3f_Copy(&this->curPathPos, &this->actor.world.pos);
- if (D_80B4E940 == 2) {
- this->actor.update = func_80B4BA84;
- this->actor.draw = func_80B4E660;
- this->actor.flags |= ACTOR_FLAG_1;
- func_80B4B430(this);
- } else if (D_80B4E940 == 1) {
- this->actor.update = func_80B4BA30;
- } else {
- Actor_Kill(&this->actor);
- if (!this) {}
- }
- }
-}
-
-void func_80B4BA30(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
-
- if (D_80B4E940 == 2) {
- this->actor.update = func_80B4BA84;
- this->actor.draw = func_80B4E660;
- this->actor.flags |= ACTOR_FLAG_1;
- func_80B4B430(this);
- }
-}
-
-void func_80B4BA84(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
- s32 temp_v0_3;
- s32 sp34 = CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_40);
- s32 temp_v1_2;
- s32 sp2C;
- s32 temp_v0_2;
- s32 phi_v0;
-
- D_80B5040C = func_80B458D8();
- if (D_80B5040C == NULL) {
- temp_v0_2 = this->unk3BC >= 0;
- this->unk3BC = -1;
- if (temp_v0_2) {
- func_80B4B820(this);
- }
- } else {
- sp2C = this->unk3BC;
- this->unk3BC = func_80B44234(this, &D_80B5040C->actor.world.pos);
- if (sp2C != this->unk3BC) {
- phi_v0 = this->unk3BC - this->pathIndex;
- if (phi_v0 < 0) {
- phi_v0 += this->endPoint;
- }
-
- if ((this->endPoint >> 1) < phi_v0) {
- this->direction = DIRECTION_BACKWARD;
- } else if (phi_v0 < (this->endPoint >> 1)) {
- this->direction = DIRECTION_FORWARD;
- }
- }
- }
-
- this->actionFunc(this, play);
- this->animPlayFlag = SkelAnime_Update(&this->skelAnime);
- if (sp34 && (this->actor.update != NULL)) {
- func_80B45CE0(&this->behaviorInfo);
- Collider_UpdateCylinder(&this->actor, &this->collider);
- CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- }
-}
-
-void func_80B4BBE0(EnInvadepoh* this) {
- AlienBehaviorInfo* substruct = &this->behaviorInfo;
-
- Animation_MorphToLoop(&this->skelAnime, &gCremiaWalkAnim, -6.0f);
- substruct->unk26.x = 0;
- substruct->unk26.y = 0;
- substruct->unk26.z = 0;
- substruct->unk30 = 0.1f;
- substruct->unk2C = 800;
-
- this->behaviorInfo.unk4C = 0;
- this->actionFunc = func_80B4BC4C;
-}
-
-void func_80B4BC4C(EnInvadepoh* this, PlayState* play) {
- s8 temp_v0;
- s16 diff;
- EnInvadepoh* temp_t6 = D_80B503F4;
- s16 temp_v1_2;
- s32 temp_v1;
- AlienBehaviorInfo* substruct = &this->behaviorInfo;
- s16 temp_a0;
- s16 sp40;
-
- if (temp_t6 != NULL) {
- temp_v0 = temp_t6->pathIndex;
- if (temp_v0 == 0) {
- this->xzPosAdjFactor = 40.0f;
- this->unk304 = -0x8000;
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
-
- } else if (temp_v0 < (temp_t6->endPoint - 1)) {
- this->xzPosAdjFactor = 40.0f;
- Math_ScaledStepToS(&this->unk304, -0x4800, 0xC8);
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
- } else {
- Math_StepToF(&this->xzPosAdjFactor, 5.0f, 3.0f);
- Math_ScaledStepToS(&this->unk304, -0x8000, 0x12C);
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
- }
- temp_a0 = this->unk304 + temp_t6->actor.world.rot.y;
- this->actor.world.pos.x = (Math_SinS(temp_a0) * this->xzPosAdjFactor) + temp_t6->actor.world.pos.x;
- this->actor.world.pos.y = temp_t6->actor.world.pos.y;
- this->actor.world.pos.z = (Math_CosS(temp_a0) * this->xzPosAdjFactor) + temp_t6->actor.world.pos.z;
- func_800B4AEC(play, &this->actor, 50.0f);
- func_80B4516C(this);
- Math_StepToS(&this->behaviorInfo.unk4C, 0xBB8, 0x1F5);
- if (Math3D_Vec3fDistSq(&this->actor.prevPos, &this->actor.world.pos) > SQ(0.01f)) {
- Math_SmoothStepToS(&this->actor.shape.rot.y, Math_Vec3f_Yaw(&this->actor.prevPos, &this->actor.world.pos),
- 3, this->behaviorInfo.unk4C, 0x1F4);
- }
- temp_v1 = (play->gameplayFrames + 0x14) % 128;
- if ((temp_v1 & 0x40) != 0) {
- sp40 = Math_Vec3f_Yaw(&this->actor.world.pos, &temp_t6->actor.world.pos);
- if (temp_v1 == 64) {
- this->behaviorInfo.unk4C = 0;
- }
- Math_StepToS(&this->behaviorInfo.unk4C, 2000, 40);
- Math_SmoothStepToS(&this->actor.shape.rot.y, sp40, 6, this->behaviorInfo.unk4C, 40);
- temp_v1_2 = Math_Vec3f_Pitch(&this->actor.focus.pos, &temp_t6->actor.focus.pos);
- temp_v1_2 *= 0.85f;
- temp_v1_2 -= this->actor.shape.rot.x;
- substruct->unk26.x = CLAMP(temp_v1_2, -3000, 3000);
- diff = BINANG_SUB(sp40, this->actor.shape.rot.y);
- temp_v1_2 = diff;
- temp_v1_2 *= 0.7f;
- substruct->unk26.y = CLAMP(temp_v1_2, -8000, 8000);
- }
- }
-
- if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_40) &&
- (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 12.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_ROMANI_WALK);
- }
- if (gSaveContext.save.time > CLOCK_TIME(20, 15)) {
- Actor_Kill(&this->actor);
- } else if ((temp_t6 != NULL) && (temp_t6->actionFunc == func_80B4CB0C)) {
- func_80B4C1BC(this);
- }
-}
-
-void func_80B4BFFC(EnInvadepoh* this) {
- this->behaviorInfo.unk30 = 0.08f;
- this->behaviorInfo.unk2C = 2000;
- Animation_MorphToLoop(&this->skelAnime, &gCremiaIdleAnim, -6.0f);
- this->behaviorInfo.unk4C = 0;
- this->actionFunc = func_80B4C058;
-}
-
-void func_80B4C058(EnInvadepoh* this, PlayState* play) {
- AlienBehaviorInfo* substruct = &this->behaviorInfo;
- Player* player = GET_PLAYER(play);
- s16 temp_v1;
- s16 diff;
-
- Math_StepToS(&this->behaviorInfo.unk4C, 2500, 450);
- Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 5, this->behaviorInfo.unk4C, 40);
- temp_v1 = Math_Vec3f_Pitch(&this->actor.focus.pos, &player->actor.focus.pos);
- temp_v1 *= 0.85f;
- temp_v1 -= this->actor.shape.rot.x;
- substruct->unk26.x = CLAMP(temp_v1, -0xBB8, 0xBB8);
-
- diff = BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y);
- temp_v1 = diff;
- temp_v1 *= 0.7f;
-
- substruct->unk26.y = CLAMP(temp_v1, -0x1F40, 0x1F40);
-
- if (Actor_TextboxIsClosing(&this->actor, play)) {
- func_80B4BBE0(this);
- }
-}
-
-void func_80B4C1BC(EnInvadepoh* this) {
- this->behaviorInfo.unk30 = 0.08f;
- this->behaviorInfo.unk2C = 2000;
- Animation_MorphToLoop(&this->skelAnime, &gCremiaIdleAnim, -6.0f);
- this->behaviorInfo.unk4C = 0;
- this->actionFunc = func_80B4C218;
-}
-
-void func_80B4C218(EnInvadepoh* this, PlayState* play) {
- AlienBehaviorInfo* substruct = &this->behaviorInfo;
- Player* player = GET_PLAYER(play);
- Actor* temp_v0;
- s16 temp_v1;
- s16 diff;
-
- Math_StepToS(&this->behaviorInfo.unk4C, 2000, 200);
- Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 6, this->behaviorInfo.unk4C, 40);
- temp_v1 = Math_Vec3f_Pitch(&this->actor.focus.pos, &player->actor.focus.pos);
- temp_v1 *= 0.85f;
- temp_v1 -= this->actor.shape.rot.x;
- substruct->unk26.x = CLAMP(temp_v1, -0xBB8, 0xBB8);
- diff = BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y);
- temp_v1 = diff;
- temp_v1 *= 0.7f;
- substruct->unk26.y = CLAMP(temp_v1, -0x1F40, 0x1F40);
-
- if (D_80B503F4 == NULL) {
- func_80B4BBE0(this);
- } else if ((D_80B503F4 != NULL) && (D_80B503F4->actionFunc != func_80B4CB0C)) {
- func_80B4BBE0(this);
- }
-}
-
-void func_80B4C3A0(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
-
- if (Object_IsLoaded(&play->objectCtx, this->bankIndex)) {
- s32 pad[2];
- s32 currentTime = gSaveContext.save.time;
-
- this->actor.objBankIndex = this->bankIndex;
- Actor_SetObjectDependency(play, &this->actor);
- func_80B44FEC();
- SkelAnime_InitFlex(play, &this->skelAnime, &gCremiaSkel, &gCremiaWalkAnim, this->jointTable, this->morphTable,
- CREMIA_LIMB_MAX);
- func_80B45C04(&this->behaviorInfo, D_80B4EBDC, 1, D_80B4EC08, 0, &gZeroVec3s, 100, 0.03f, 0.3f, 0.03f);
- this->actor.textId = 0x33CD;
- if (currentTime < 0xD5A0) {
- this->unk304 = -0x8000;
- this->xzPosAdjFactor = 40.0f;
- } else if (currentTime >= 0xD7D4) {
- this->unk304 = -0x4800;
- this->xzPosAdjFactor = 20.0f;
- } else {
- this->unk304 = -0x8000;
- this->xzPosAdjFactor = 40.0f;
- }
-
- if ((currentTime >= CLOCK_TIME(6, 0)) && (currentTime < 0xD573)) {
- this->actor.update = func_80B4C568;
- this->actor.draw = NULL;
- } else if ((currentTime >= 0xD573) && (currentTime < CLOCK_TIME(20, 15))) {
- this->actor.update = func_80B4C5C0;
- this->actor.draw = func_80B4E7BC;
- func_80B4BBE0(this);
- } else {
- Actor_Kill(&this->actor);
- }
- }
-}
-
-void func_80B4C568(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
-
- if ((gSaveContext.save.time >= 0xD573) && (gSaveContext.save.time < CLOCK_TIME(20, 15))) {
- this->actor.update = func_80B4C5C0;
- this->actor.draw = func_80B4E7BC;
- func_80B4BBE0(this);
- }
-}
-
-void func_80B4C5C0(Actor* thisx, PlayState* play) {
- s32 pad;
- EnInvadepoh* this = THIS;
- s32 sp2C = CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_40);
- s32 isTalking = Actor_ProcessTalkRequest(&this->actor, &play->state);
-
- if (isTalking) {
- func_80151BB4(play, 6);
- func_80B4BFFC(this);
- }
- this->actionFunc(this, play);
- if (sp2C && (this->actor.update != NULL)) {
- SkelAnime_Update(&this->skelAnime);
- func_80B45CE0(&this->behaviorInfo);
- if ((this->actionFunc != func_80B4C058) && !isTalking && this->actor.isTargeted) {
- func_800B8614(&this->actor, play, 350.0f);
- }
- Collider_UpdateCylinder(&this->actor, &this->collider);
- CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- }
-}
-
-void func_80B4C6C8(EnInvadepoh* this) {
- AlienBehaviorInfo* substruct = &this->behaviorInfo;
-
- Animation_MorphToLoop(&this->skelAnime, &gRomaniWalkAnim, -10.0f);
- substruct->unk26.x = 0;
- substruct->unk26.y = 0;
- substruct->unk26.z = 0;
- substruct->unk30 = 0.1f;
- substruct->unk2C = 0x320;
- this->actionFunc = func_80B4C730;
-}
-
-void func_80B4C730(EnInvadepoh* this, PlayState* play) {
- AlienBehaviorInfo* substruct = &this->behaviorInfo;
- EnInvadepoh* sp68 = D_80B503F8;
- s32 phi_a2;
- s32 temp_v1_3;
- s16 temp_v1_4;
- s32 temp_v0_2;
- Vec3f sp4C;
- Vec3f sp40;
- s16 diff;
- s16 pad;
- s16 sp3A;
- s16 pad2;
-
- func_80B44700(this);
- func_80B44EFC(this, play);
- func_80B43E6C(this, 6, 2000, 100);
- phi_a2 = ((this->pathIndex < this->endPoint) ? this->pathIndex : this->endPoint - 1);
-
- Math_Vec3s_ToVec3f(&sp4C, &this->pathPoints[phi_a2]);
- Math_Vec3s_ToVec3f(&sp40, &this->pathPoints[phi_a2 + 1]);
- Math_SmoothStepToS(&this->actor.world.rot.y, Math_Vec3f_Yaw(&sp4C, &sp40), 5, 0x7D0, 0x64);
- if ((this->pathIndex == 0) || ((this->pathIndex + 1) == this->endPoint)) {
- if (this->unk378 == 0) {
- temp_v0_2 = func_800FE620(play);
- if (temp_v0_2 > 0) {
- temp_v0_2 = (R_TIME_SPEED * -23.0f / temp_v0_2) - 0.5f;
- this->unk378 = func_80B45550(this, play, SQ(80.0f), temp_v0_2);
- }
- }
-
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
- } else {
- this->unk378 = 0;
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
- }
-
- temp_v1_3 = play->gameplayFrames % 128;
- if ((temp_v1_3 & 0x40) != 0) {
- sp3A = Math_Vec3f_Yaw(&this->actor.world.pos, &sp68->actor.world.pos);
- if (temp_v1_3 == 64) {
- this->behaviorInfo.unk4C = 0;
- }
-
- Math_StepToS(&this->behaviorInfo.unk4C, 2000, 40);
- Math_SmoothStepToS(&this->actor.shape.rot.y, sp3A, 6, this->behaviorInfo.unk4C, 40);
- temp_v1_4 = Math_Vec3f_Pitch(&this->actor.focus.pos, &sp68->actor.focus.pos);
- temp_v1_4 *= 0.85f;
- temp_v1_4 -= this->actor.shape.rot.x;
- substruct->unk26.x = CLAMP(temp_v1_4, -3000, 3000);
- diff = BINANG_SUB(sp3A, this->actor.shape.rot.y);
- temp_v1_4 = diff;
- temp_v1_4 *= 0.7f;
- substruct->unk26.y = CLAMP(temp_v1_4, -8000, 8000);
- }
-
- if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_40) &&
- (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 7.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_ROMANI_WALK);
- }
-
- if (this->clockTime >= 0.9999f) {
- Actor_Kill(&this->actor);
- return;
- }
-
- if ((sp68 != NULL) && (sp68->actionFunc == func_80B4C058)) {
- func_80B4CC70(this);
- }
-}
-
-void func_80B4CAB0(EnInvadepoh* this) {
- this->behaviorInfo.unk30 = 0.08f;
- this->behaviorInfo.unk2C = 4000;
- Animation_MorphToLoop(&this->skelAnime, &gRomaniIdleAnim, -10.0f);
- this->behaviorInfo.unk4C = 0;
- this->actionFunc = func_80B4CB0C;
-}
-
-void func_80B4CB0C(EnInvadepoh* this, PlayState* play) {
- AlienBehaviorInfo* substruct = &this->behaviorInfo;
- Player* player = GET_PLAYER(play);
- s16 temp_v1;
- s16 diff;
-
- Math_StepToS(&this->behaviorInfo.unk4C, 3000, 500);
- Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 6, this->behaviorInfo.unk4C, 40);
- temp_v1 = (Math_Vec3f_Pitch(&this->actor.focus.pos, &player->actor.focus.pos));
- temp_v1 *= 0.85f;
- temp_v1 -= this->actor.shape.rot.x;
- substruct->unk26.x = CLAMP(temp_v1, -0xBB8, 0xBB8);
- diff = BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y);
- temp_v1 = diff;
- temp_v1 *= 0.7f;
- substruct->unk26.y = CLAMP(temp_v1, -0x1F40, 0x1F40);
- if (Actor_TextboxIsClosing(&this->actor, play)) {
- func_80B4C6C8(this);
- }
-}
-
-void func_80B4CC70(EnInvadepoh* this) {
- this->behaviorInfo.unk30 = 0.08f;
- this->behaviorInfo.unk2C = 2000;
- Animation_MorphToLoop(&this->skelAnime, &gRomaniIdleAnim, -10.0f);
- this->behaviorInfo.unk4C = 0;
- this->actionFunc = func_80B4CCCC;
-}
-
-void func_80B4CCCC(EnInvadepoh* this, PlayState* play) {
- AlienBehaviorInfo* substruct = &this->behaviorInfo;
- Player* player = GET_PLAYER(play);
- s16 temp_v1;
- s16 diff;
-
- Math_StepToS(&this->behaviorInfo.unk4C, 2000, 200);
- Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 6, this->behaviorInfo.unk4C, 40);
- temp_v1 = Math_Vec3f_Pitch(&this->actor.focus.pos, &player->actor.focus.pos);
- temp_v1 *= 0.85f;
- temp_v1 -= this->actor.shape.rot.x;
- substruct->unk26.x = CLAMP(temp_v1, -0xBB8, 0xBB8);
- diff = BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y);
- temp_v1 = diff;
- temp_v1 *= 0.7f;
- substruct->unk26.y = CLAMP(temp_v1, -0x1F40, 0x1F40);
- if (D_80B503F8 == NULL) {
- func_80B4C6C8(this);
- } else if ((D_80B503F8 != NULL) && (D_80B503F8->actionFunc != func_80B4C058)) {
- func_80B4C6C8(this);
- }
-}
-
-void func_80B4CE54(Actor* thisx, PlayState* play) {
- s32 pad[2];
- EnInvadepoh* this = THIS;
- s32 sp38;
-
- if (Object_IsLoaded(&play->objectCtx, this->bankIndex)) {
- sp38 = gSaveContext.save.time;
-
- this->actor.objBankIndex = this->bankIndex;
- Actor_SetObjectDependency(play, &this->actor);
- func_80B44F58();
- SkelAnime_InitFlex(play, &this->skelAnime, &gRomaniSkel, &gRomaniWalkAnim, this->jointTable, this->morphTable,
- ROMANI_LIMB_MAX);
- func_80B45C04(&this->behaviorInfo, D_80B4EA90, 1, D_80B4EB00, 3, &gZeroVec3s, 100, 0.03f, 0.3f, 0.03f);
- func_80B446D0(this, play);
- this->actor.world.rot.y = this->actor.shape.rot.y;
- func_80B44700(this);
- func_80B44EFC(this, play);
- func_80B43F0C(this);
- func_80B4516C(this);
- this->actor.textId = 0x33CE;
- if ((sp38 >= CLOCK_TIME(6, 0)) && (sp38 < CLOCK_TIME(20, 0))) {
- this->actor.update = func_80B4CFFC;
- this->actor.draw = NULL;
- } else if ((sp38 >= 0xD555) && (sp38 < 0xD7E1)) {
- this->actor.update = func_80B4D054;
- this->actor.draw = func_80B4E324;
- func_80B4C6C8(this);
- } else {
- Actor_Kill(&this->actor);
- }
- }
-}
-
-void func_80B4CFFC(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
-
- if ((gSaveContext.save.time >= CLOCK_TIME(20, 0)) && (gSaveContext.save.time < 0xD7E1)) {
- this->actor.update = func_80B4D054;
- this->actor.draw = func_80B4E324;
- func_80B4C6C8(this);
- }
-}
-
-void func_80B4D054(Actor* thisx, PlayState* play) {
- s32 pad;
- EnInvadepoh* this = THIS;
- s32 sp2C = CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_40);
- s32 isTalking = Actor_ProcessTalkRequest(&this->actor, &play->state);
-
- if (isTalking) {
- func_80151BB4(play, 5);
- func_80B4CAB0(this);
- }
- this->actionFunc(this, play);
- if (sp2C && this->actor.update != NULL) {
- SkelAnime_Update(&this->skelAnime);
- func_80B45CE0(&this->behaviorInfo);
- if ((this->actionFunc != func_80B4CB0C) && !isTalking && this->actor.isTargeted) {
- func_800B8614(thisx, play, 350.0f);
- }
- Collider_UpdateCylinder(&this->actor, &this->collider);
- CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- }
-}
-
-void func_80B4D15C(EnInvadepoh* this) {
- s32 pad;
- s32 temp_v1 = this->actor.params & 7;
- unkstruct80B4EE0C* temp_v0;
-
- Animation_PlayLoop(&this->skelAnime, &gAlienHoldingCowAnim);
- this->skelAnime.curFrame = ((this->actor.params & 7) * this->skelAnime.endFrame) * 0.25f;
- this->alienAlpha = 255;
- this->actor.draw = func_80B4DB14;
- this->drawAlien = true;
- this->drawAlienDeathEffect = false;
- this->alienBeamAlpha = 255;
- temp_v0 = &D_80B4EE0C[temp_v1];
- this->velocityStep = temp_v0->unk00;
- this->unk304 = temp_v1 * 0x5555;
- this->actor.world.pos.x = this->actor.home.pos.x + (Math_SinS(this->unk304) * 80.0f);
- this->actor.world.pos.y = this->actor.home.pos.y;
- this->actor.world.pos.z = this->actor.home.pos.z + (Math_CosS(this->unk304) * 80.0f);
- this->actor.shape.rot.y = this->unk304 + 0x4000;
- this->behaviorInfo.unk4C = temp_v0->unk04;
- this->behaviorInfo.unk4E = temp_v0->unk06;
- this->actionFunc = func_80B4D290;
- this->actor.velocity.y = 0.0f;
-}
-
-void func_80B4D290(EnInvadepoh* this, PlayState* play) {
- Actor* temp_v1;
- f32 sp28;
-
- if (D_80B503F0 == NULL) {
- Actor_Kill(&this->actor);
- return;
- }
-
- Math_StepToF(&this->actor.velocity.y, 15.0f, this->velocityStep);
- sp28 = Math_SmoothStepToF(&this->actor.world.pos.y, this->actor.home.pos.y + 850.0f, 0.2f, this->actor.velocity.y,
- 0.01f);
- this->unk304 += 0x2BC;
- this->actor.world.pos.x = this->actor.home.pos.x + Math_SinS(this->unk304) * 80.0f;
- this->actor.world.pos.z = this->actor.home.pos.z + Math_CosS(this->unk304) * 80.0f;
- this->behaviorInfo.unk4C += this->behaviorInfo.unk4E;
- this->actor.shape.rot.y += this->behaviorInfo.unk4C;
- temp_v1 = this->actor.child;
-
- if (this->actor.child != NULL) {
- this->actor.child->world.pos.x = this->actor.world.pos.x;
- temp_v1->world.pos.y = this->actor.world.pos.y - 38.0f;
- temp_v1->world.pos.z = this->actor.world.pos.z;
- temp_v1->shape.rot.y = this->actor.shape.rot.y;
- }
-
- if (sp28 < 5.0f) {
- Actor_Kill(&this->actor);
- }
-}
-
-void func_80B4D3E4(EnInvadepoh* this) {
- Animation_PlayLoop(&this->skelAnime, &gAlienHoldingCowAnim);
- this->skelAnime.curFrame = (this->actor.params & 7) * this->skelAnime.endFrame * 0.25f;
- this->alienAlpha = 255;
- this->actor.draw = NULL;
- this->drawAlien = true;
- this->drawAlienDeathEffect = false;
- this->alienBeamAlpha = 255;
- this->unk306 = 400;
- this->unk304 = 0;
- this->actionTimer = 200;
- this->actor.velocity.y = 0.0f;
- this->actionFunc = func_80B4D480;
-}
-
-void func_80B4D480(EnInvadepoh* this, PlayState* play) {
- f32 target;
- s32 pad2;
- s32 sp2C = false;
- f32 new_var3;
-
- if (this->actionTimer > 0) {
- this->actionTimer--;
- }
-
- if (this->actionTimer > 160) {
- this->actor.draw = NULL;
- } else {
- this->actor.draw = func_80B4DB14;
- if (1) {}
- if ((this->actionTimer < 105) && (this->actionTimer >= 100)) {
- this->actor.gravity = -1.0f;
- Math_SmoothStepToS(&this->actor.shape.rot.x, 0x2000, 8, 0x320, 0x28);
- } else {
- this->actor.gravity = 0.7f;
- Math_SmoothStepToS(&this->actor.shape.rot.x, 0, 8, 0x320, 0x28);
- }
-
- this->actor.velocity.y += this->actor.gravity;
- this->actor.velocity.y *= 0.92f;
- if (this->actionTimer > 80) {
- this->actor.world.pos.y += this->actor.velocity.y;
- } else {
- target = (this->actor.home.pos.y + 850.0f);
- sp2C = Math_StepToF(&this->actor.world.pos.y, target, fabsf(this->actor.velocity.y));
- }
-
- new_var3 = (this->unk304 * -0.06f + this->unk306);
- new_var3 *= 0.98f;
- this->unk306 = new_var3;
- this->actor.shape.rot.y += this->unk306;
-
- if (this->actor.child != NULL) {
- Actor* temp_v1 = this->actor.child;
-
- temp_v1->world.pos.x = this->actor.world.pos.x;
- temp_v1->world.pos.y = this->actor.world.pos.y - 30.0f;
- temp_v1->world.pos.z = this->actor.world.pos.z;
- temp_v1->shape.rot.y = this->actor.shape.rot.y;
- }
- }
-
- if ((this->actionTimer <= 0) || sp2C) {
- Actor_Kill(&this->actor);
- }
-}
-
-void func_80B4D670(Actor* thisx, PlayState* play) {
- s32 pad;
- EnInvadepoh* this = THIS;
- s32 invadepohType;
-
- if (Object_IsLoaded(&play->objectCtx, this->bankIndex)) {
- invadepohType = this->actor.params & 7;
- this->actor.objBankIndex = this->bankIndex;
- Actor_SetObjectDependency(play, &this->actor);
- func_80B45080();
- this->actor.update = func_80B4D760;
- SkelAnime_InitFlex(play, &this->skelAnime, &gAlienSkel, &gAlienHoldingCowAnim, this->jointTable,
- this->morphTable, ALIEN_LIMB_MAX);
- if (invadepohType < 3) {
- func_80B453F4(this, play, invadepohType);
- func_80B4D15C(this);
- } else {
- func_80B45460(this, play);
- func_80B4D3E4(this);
- }
- }
-}
-
-void func_80B4D760(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
-
- this->actionFunc(this, play);
- if (this->actor.update != NULL) {
- SkelAnime_Update(&this->skelAnime);
- func_800B9010(&this->actor, NA_SE_EN_FOLLOWERS_BEAM_PRE - SFX_FLAG);
- }
-}
-
-void func_80B4D7B8(PlayState* play) {
- u32 temp_s5;
- u32 temp_s6;
- unkStruct80B50350* phi_s2;
- s32 i;
-
- OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
- for (phi_s2 = D_80B50350, i = 0; i < 10; phi_s2++, i++) {
- if (phi_s2->unk1 > 0) {
- temp_s5 = (play->gameplayFrames + ((0x10 * i) & 0xFF)) & 0x7F;
- temp_s6 = (u8)(play->gameplayFrames * -0xF);
- Matrix_Translate(phi_s2->unk4.x, phi_s2->unk4.y, phi_s2->unk4.z, MTXMODE_NEW);
- Matrix_Scale(0.1f, 0.1f, 0.1f, MTXMODE_APPLY);
- gDPPipeSync(POLY_XLU_DISP++);
- gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 255, 170, phi_s2->unk2);
- gDPSetEnvColor(POLY_XLU_DISP++, 255, 50, 0, 0);
- gSPSegment(POLY_XLU_DISP++, 0x08,
- Gfx_TwoTexScroll(play->state.gfxCtx, 0, temp_s5, 0, 0x20, 0x40, 1, 0, temp_s6, 0x20, 0x40));
- 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_02E510);
- }
- }
- CLOSE_DISPS(play->state.gfxCtx);
-}
-
-void func_80B4D9B4(Actor* thisx, PlayState* play) {
- func_80B4D7B8(play);
-}
-
-s32 func_80B4D9D8(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx, Gfx** gfx) {
- return false;
-}
-
-void func_80B4D9F4(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx, Gfx** gfx) {
- EnInvadepoh* this = THIS;
-
- if ((limbIndex == 12) && (this->alienBeamAlpha != 0)) {
- Matrix_Push();
- Matrix_RotateZS(-0x53ED, MTXMODE_APPLY);
- Matrix_RotateYS(-0x3830, MTXMODE_APPLY);
- Matrix_Scale(1.0f, 1.0f, 1.5f, MTXMODE_APPLY);
- Matrix_Get(&D_80B502A0);
- Matrix_Pop();
- } else if ((limbIndex == 13) && (this->alienBeamAlpha != 0)) {
- Matrix_Push();
- Matrix_RotateZS(-0x53ED, MTXMODE_APPLY);
- Matrix_RotateYS(-0x47D0, MTXMODE_APPLY);
- Matrix_Scale(1.0f, 1.0f, 1.5f, MTXMODE_APPLY);
- Matrix_Get(&D_80B502E0);
- Matrix_Pop();
- }
- if (limbIndex == 11) {
- Matrix_MultVec3f(&D_80B4EE24, &this->actor.focus.pos);
- }
-}
-
-void func_80B4DB14(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
- Gfx* gfx;
- GraphicsContext* spCC = play->state.gfxCtx;
-
- OPEN_DISPS(spCC);
- func_8012C2DC(spCC);
- Matrix_Push();
- if (this->drawAlien) {
- Gfx* new_var6;
- Gfx* spBC;
- GraphicsContext* spB8;
-
- if (this->alienAlpha == 255) {
- func_8012C28C(play->state.gfxCtx);
- AnimatedMat_Draw(play, sAlienEmptyTexAnim);
- Scene_SetRenderModeXlu(play, 0, 1);
- gDPSetEnvColor(spCC->polyOpa.p++, 0, 0, 0, 255);
- spCC->polyOpa.p = SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
- this->skelAnime.dListCount, func_80B4D9D8, func_80B4D9F4, &this->actor,
- spCC->polyOpa.p);
- } else {
- AnimatedMat_Draw(play, sAlienEmptyTexAnim);
- Scene_SetRenderModeXlu(play, 1, 2);
- gDPSetEnvColor(spCC->polyXlu.p++, 0, 0, 0, this->alienAlpha);
- spCC->polyXlu.p = SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
- this->skelAnime.dListCount, func_80B4D9D8, func_80B4D9F4, &this->actor,
- spCC->polyXlu.p);
- }
-
- if (this->alienBeamAlpha != 0) {
- AnimatedMat_Draw(play, sAlienEyeBeamTexAnim);
- spB8 = play->state.gfxCtx;
- gfx = spBC = spB8->polyXlu.p;
- gDPPipeSync(spBC++);
- gDPSetPrimColor(spBC++, 0, 255, 240, 180, 100, 60);
- gDPSetEnvColor(spBC++, 255, 255, 255, this->alienBeamAlpha * (150.0f / 255.0f));
- Matrix_Mult(&D_80B502A0, MTXMODE_NEW);
- gSPMatrix(spBC++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(spBC++, gAlienEyeBeamDL);
- Matrix_Mult(&D_80B502E0, MTXMODE_NEW);
- gSPMatrix(spBC++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(spBC++, gAlienEyeBeamDL);
- spB8->polyXlu.p = spBC;
- }
- }
-
- if (this->drawAlienDeathEffect) {
- Matrix_SetTranslateRotateYXZ(this->actor.world.pos.x, this->actor.world.pos.y + 68.0f, this->actor.world.pos.z,
- &this->actor.shape.rot);
- Matrix_Scale(this->alienDeathEffectScale.x, this->alienDeathEffectScale.y, this->alienDeathEffectScale.z,
- MTXMODE_APPLY);
- gSPMatrix(spCC->polyXlu.p++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(spCC->polyXlu.p++, gAlienDeathFlashDL);
- }
-
- if (this->drawAlien) {
- Vec3f sp80;
- Vec3f sp74;
- s32 alpha2;
- GraphicsContext* sp6C = play->state.gfxCtx;
- u32 pad;
-
- gfx = sp6C->polyXlu.p;
- gfx = func_8012C868(gfx);
- gDPSetDither(gfx++, G_CD_NOISE);
- gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE,
- 0);
- Matrix_Mult(&play->billboardMtxF, MTXMODE_NEW);
- Matrix_MultVecZ(60.0f, &sp80);
- sp74.x = thisx->world.pos.x + sp80.x;
- sp74.y = thisx->world.pos.y + sp80.y + 68.0f;
- sp74.z = thisx->world.pos.z + sp80.z;
- Matrix_Translate(sp74.x, sp74.y, sp74.z, MTXMODE_NEW);
- Matrix_Scale(0.25f, 0.25f, 0.25f, MTXMODE_APPLY);
- alpha2 = this->alienAlpha * (100.0f / 255.0f);
- gSPDisplayList(gfx++, gameplay_keep_DL_029CB0);
- gDPSetPrimColor(gfx++, 0, 0, 240, 180, 100, alpha2);
- gSPMatrix(gfx++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(gfx++, gameplay_keep_DL_029CF0);
- sp6C->polyXlu.p = gfx;
- if ((this->alienAlpha > 128) && func_80B456A8(play, &sp74)) {
- func_800F9824(play, &play->envCtx, &play->view, play->state.gfxCtx, sp74, 10.0f, 9.0f, 0, 0);
- }
- }
-
- Matrix_Pop();
- CLOSE_DISPS(spCC);
-}
-
-s32 func_80B4E120(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
- if (limbIndex == 5) {
- EnInvadepoh* this = THIS;
- rot->x -= this->actor.shape.rot.x;
- }
- return false;
-}
-
-void func_80B4E158(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
-
- func_8012C5B0(play->state.gfxCtx);
- SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
- func_80B4E120, NULL, &this->actor);
-}
-
-void func_80B4E1B0(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
-
- func_8012C5B0(play->state.gfxCtx);
- SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
- NULL, &this->actor);
-}
-
-s32 func_80B4E200(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
- if (limbIndex == ROMANI_LIMB_HEAD) {
- EnInvadepoh* this = THIS; // both of these needed to match
-
- rot->x += this->behaviorInfo.unk20.y;
- rot->y += this->behaviorInfo.unk20.z;
- rot->z += this->behaviorInfo.unk20.x;
- } else if (limbIndex == ROMANI_LIMB_TORSO) {
- EnInvadepoh* this = THIS; // both of these needed to match
-
- rot->x += (s16)(this->behaviorInfo.unk34 * this->behaviorInfo.unk20.y);
- rot->z += this->behaviorInfo.unk40;
- }
- return false;
-}
-
-void func_80B4E2AC(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
- EnInvadepoh* this = THIS;
-
- if (limbIndex == ROMANI_LIMB_LEFT_HAND) {
- OPEN_DISPS(play->state.gfxCtx);
- gSPDisplayList(POLY_OPA_DISP++, gRomaniBowDL);
- CLOSE_DISPS(play->state.gfxCtx);
- } else if (limbIndex == ROMANI_LIMB_HEAD) {
- Matrix_MultVec3f(&D_80B4EE30, &this->actor.focus.pos);
- }
-}
-
-void func_80B4E324(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
-
- OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- gSPSegment(POLY_OPA_DISP++, 0x09, sRomaniMouthTextures[this->behaviorInfo.unk10.unkF]);
- gSPSegment(POLY_OPA_DISP++, 0x08, sRomaniEyeTextures[this->behaviorInfo.unk0.unkF]);
- SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
- func_80B4E200, func_80B4E2AC, &this->actor);
- CLOSE_DISPS(play->state.gfxCtx);
-}
-
-void func_80B4E3F0(Actor* thisx, PlayState* play) {
- s32 pad;
- EnInvadepoh* this = THIS;
- Vec3f sp5C;
-
- Matrix_Push();
- Matrix_Mult(&play->billboardMtxF, MTXMODE_NEW);
- Matrix_MultVecZ(200.0f, &sp5C);
- Matrix_Pop();
- sp5C.x += thisx->world.pos.x;
- sp5C.y += thisx->world.pos.y;
- sp5C.z += thisx->world.pos.z;
- EnInvadepoh_SetSysMatrix(&sp5C);
- Matrix_ReplaceRotation(&play->billboardMtxF);
- Matrix_RotateZS(this->unk304, MTXMODE_APPLY);
- OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gDPSetPrimColor(POLY_XLU_DISP++, 0xFF, 0x80, 255, 255, 0, 180);
- gDPSetEnvColor(POLY_XLU_DISP++, 255, 50, 0, 0);
- gSPDisplayList(POLY_XLU_DISP++, gEffFlash1DL);
- if (func_80B456A8(play, &sp5C)) {
- func_800F9824(play, &play->envCtx, &play->view, play->state.gfxCtx, sp5C, 20.0f, 9.0f, 0, 0);
- }
-
- CLOSE_DISPS(play->state.gfxCtx);
-}
-
-s32 func_80B4E5B0(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
- if ((limbIndex == DOG_LIMB_HEAD) || (limbIndex == DOG_LIMB_RIGHT_FACE_HAIR) ||
- (limbIndex == DOG_LIMB_LEFT_FACE_HAIR)) {
- EnInvadepoh* this = THIS;
-
- rot->x += this->behaviorInfo.unk20.x;
- rot->y += this->behaviorInfo.unk20.y;
- rot->z += this->behaviorInfo.unk20.z;
- }
-
- return false;
-}
-
-void func_80B4E61C(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
- EnInvadepoh* this = THIS;
-
- if (limbIndex == DOG_LIMB_HEAD) {
- Matrix_MultVecY(20.0f, &this->actor.focus.pos);
- }
-}
-
-void func_80B4E660(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
-
- OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 200, 0);
- SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
- func_80B4E5B0, func_80B4E61C, &this->actor);
- CLOSE_DISPS(play->state.gfxCtx);
-}
-
-s32 func_80B4E6E4(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
- if (limbIndex == 9) {
- EnInvadepoh* this = THIS; // both of these needed to match
-
- rot->x += this->behaviorInfo.unk20.y;
- rot->y += this->behaviorInfo.unk20.z;
- rot->z += this->behaviorInfo.unk20.x;
- } else if (limbIndex == 2) {
- EnInvadepoh* this = THIS; // both of these needed to match
-
- rot->x += (s16)(this->behaviorInfo.unk34 * this->behaviorInfo.unk20.y);
- }
- return false;
-}
-
-void func_80B4E784(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
- EnInvadepoh* this = THIS;
-
- if (limbIndex == 9) {
- Matrix_MultZero(&this->actor.focus.pos);
- }
-}
-
-void func_80B4E7BC(Actor* thisx, PlayState* play) {
- EnInvadepoh* this = THIS;
-
- OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- gSPSegment(POLY_OPA_DISP++, 0x09, sCremiaMouthTextures[this->behaviorInfo.unk10.unkF]);
- gSPSegment(POLY_OPA_DISP++, 0x08, sCremiaEyeTextures[this->behaviorInfo.unk0.unkF]);
- SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
- func_80B4E6E4, func_80B4E784, &this->actor);
- CLOSE_DISPS(play->state.gfxCtx);
-}
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B45980.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B459E8.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B45A4C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B45A94.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B45B1C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B45BB8.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B45C04.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B45CE0.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B45EC8.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B46118.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B46184.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B461DC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4627C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B46414.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B46520.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B465CC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B46644.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B468B4.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B469C4.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B46A80.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/EnInvadepoh_Init.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B46BB0.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B46BC0.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B46C08.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B46C34.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B46C50.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B46C7C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B46C94.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B46CC0.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B46CF4.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B46D28.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/EnInvadepoh_Destroy.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B46DA8.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B46DC8.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B46E20.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B46E44.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B46EC0.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B46EE8.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B46F88.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B46FA8.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B47064.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B47084.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B470E0.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B47108.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B471C0.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B471E0.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B47248.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B47268.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B47278.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B47298.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B47304.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B47324.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/EnInvadepoh_Update.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B47380.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B473E4.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B47478.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B474DC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B47568.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B47600.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4770C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B477B4.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B47830.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B478F4.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B47938.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B479E8.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B47BAC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B47D30.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B47FA8.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B48060.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B481C4.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4827C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B482D4.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B48324.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B48374.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B483CC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4843C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B484EC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B48588.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B48610.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B48620.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4873C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B487B4.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B48848.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B48948.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B48AD4.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B48DE4.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B48E4C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B48FB0.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B490F0.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B491EC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B49228.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B492FC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4934C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B49404.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B49454.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B49628.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B49670.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B497A4.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B497EC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B49904.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4994C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B499BC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B49A00.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B49B1C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B49BD0.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B49C38.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B49DA0.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B49DFC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B49F88.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4A168.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4A1B8.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4A2C0.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4A350.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4A570.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4A5E4.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4A614.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4A67C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4A7C0.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4A81C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4A9C8.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4AB8C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4ABDC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4ACDC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4ACF0.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4AD3C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4AD60.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4ADB8.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4ADCC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4AEC0.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4AEDC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4AF80.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4AF94.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4B024.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4B048.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4B0C4.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4B218.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4B3DC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4B430.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4B484.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4B510.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4B564.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4B724.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4B768.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4B820.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4B864.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4B8BC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4BA30.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4BA84.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4BBE0.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4BC4C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4BFFC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4C058.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4C1BC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4C218.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4C3A0.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4C568.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4C5C0.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4C6C8.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4C730.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4CAB0.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4CB0C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4CC70.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4CCCC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4CE54.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4CFFC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4D054.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4D15C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4D290.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4D3E4.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4D480.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4D670.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4D760.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4D7B8.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4D9B4.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4D9D8.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4D9F4.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4DB14.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4E120.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4E158.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4E1B0.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4E200.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4E2AC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4E324.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4E3F0.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4E5B0.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4E61C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4E660.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4E6E4.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4E784.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh/func_80B4E7BC.s")
diff --git a/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.h b/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.h
index 061d9c326..54253ad03 100644
--- a/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.h
+++ b/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.h
@@ -5,151 +5,9 @@
struct EnInvadepoh;
-typedef void (*EnInvadepohInitFunc)(struct EnInvadepoh*, PlayState*);
-typedef void (*EnInvadepohDestroyFunc)(struct EnInvadepoh*, PlayState*);
-typedef void (*EnInvadepohActionFunc)(struct EnInvadepoh*, PlayState*);
-
-#define INVADEPOH_TYPE(thisx) (((thisx)->params >> 4) & 0xF)
-
-typedef enum{
- /* 0 */ TYPE_UNK0,
- /* 1 */ TYPE_ALIEN,
- /* 2 */ TYPE_PARENT_COW,
- /* 3 */ TYPE_CHILD_COW,
- /* 4 */ TYPE_ROMANI,
- /* 5 */ TYPE_ROMANI1,
- /* 6 */ TYPE_UNK6,
- /* 7 */ TYPE_ROMANI2,
- /* 8 */ TYPE_ROMANI3,
- /* 9 */ TYPE_ROMANI4,
- /* 10 */ TYPE_DOG,
- /* 11 */ TYPE_CREMIA,
- /* 12 */ TYPE_ROMANI5,
- /* 13 */ TYPE_ALIEN_CARRYING_COW
-} EnInvadepohType;
-
-typedef enum {
- /* -1 */ DIRECTION_BACKWARD = -1,
- /* 1 */ DIRECTION_FORWARD = 1,
-} EnInvadepohDirection;
-
-typedef struct unkStruct80B50350 {
- /* 0x0 */ s8 unk0;
- /* 0x1 */ s8 unk1;
- /* 0x2 */ u8 unk2;
- /* 0x4 */ Vec3f unk4;
-} unkStruct80B50350; // size = 0x10;
-
-typedef struct {
- /* 0x0 */ s8* unk00;
- /* 0x4 */ s8 unk04;
-} unkstructInvadepoh0; // size = 0x8
-
-typedef struct {
- /* 0x0 */ s8 unk00;
- /* 0x4 */ f32 unk04;
-} unkstructInvadepoh1; // size = 0x8
-
-typedef struct {
- /* 0x0 */ s8 unk00;
- /* 0x4 */ unkstructInvadepoh0* unk04;
-} unkstructInvadepoh2; // size = 0x8
-
-typedef struct {
- /* 0x0 */ s8 unk0;
- /* 0x4 */ unkstructInvadepoh0* unk4;
- /* 0x8 */ s8 unk8;
- /* 0xC */ unkstructInvadepoh1* unkC;
-} unkstructInvadepoh3; // size = 0x10
-
-typedef struct {
- /* 0x00 */ s8 unk00;
- /* 0x04 */ unkstructInvadepoh0* unk04;
- /* 0x08 */ s8 unk08;
- /* 0x0C */ unkstructInvadepoh1* unk0C;
- /* 0x10 */ s16 unk10;
- /* 0x12 */ s16 unk12;
-} unkstructInvadepoh4; // size = 0x14
-
-typedef struct {
- /* 0x0 */ f32 unk00;
- /* 0x4 */ s16 unk04;
- /* 0x6 */ s16 unk06;
-} unkstruct80B4EE0C; // size = 0x8
-
-typedef struct EnInvadePohStruct {
- /* 0x0 */ unkstructInvadepoh4* unk0;
- /* 0x4 */ s8 unk4;
- /* 0x8 */ unkstructInvadepoh4* unk8;
- /* 0xC */ s16 unkC;
- /* 0xE */ s8 unkE;
- /* 0xF */ s8 unkF;
-} EnInvadePohStruct; // size = 0x10;
-
-typedef struct AlienBehaviorInfo {
- /* 0x00 */ EnInvadePohStruct unk0;
- /* 0x10 */ EnInvadePohStruct unk10;
- /* 0x20 */ Vec3s unk20;
- /* 0x26 */ Vec3s unk26;
- /* 0x2C */ s16 unk2C;
- /* 0x2E */ u16 unk2E;
- /* 0x30 */ f32 unk30;
- /* 0x34 */ f32 unk34;
- /* 0x38 */ f32 unk38;
- /* 0x3C */ f32 unk3C;
- /* 0x40 */ s16 unk40;
- /* 0x42 */ s16 unk42;
- /* 0x44 */ f32 unk44;
- /* 0x48 */ s16 unk48;
- /* 0x4A */ UNK_TYPE1 unk4A[0x2];
- /* 0x4C */ s16 unk4C;
- /* 0x4E */ s16 unk4E;
-} AlienBehaviorInfo; // size = 0x50
-
typedef struct EnInvadepoh {
/* 0x000 */ Actor actor;
- /* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[23];
- /* 0x212 */ Vec3s morphTable[23];
- /* 0x29C */ s8 animPlayFlag;
- /* 0x2A0 */ ColliderCylinder collider;
- /* 0x2EC */ EnInvadepohActionFunc actionFunc;
- /* 0x2F0 */ s16 actionTimer;
- /* 0x2F2 */ s16 counter; // general counter variable
- /* 0x2F4 */ s8 bankIndex;
- /* 0x2F8 */ f32 xzPosAdjFactor;
- /* 0x2FC */ UNK_TYPE unk2FC; // unused
- /* 0x300 */ f32 velocityStep;
- /* 0x304 */ s16 unk304; // angle of some sort
- /* 0x306 */ s16 unk306;
- /* 0x308 */ s8 endPoint;
- /* 0x309 */ s8 pathIndex;
- /* 0x30A */ s8 direction; // only ever 1 or -1
- /* 0x30C */ Vec3s* pathPoints;
- /* 0x310 */ f32 pathTotalDist;
- /* 0x314 */ Vec3f curPathPos;
- /* 0x320 */ f32 clockTime;
- /* 0x324 */ AlienBehaviorInfo behaviorInfo;
- /* 0x374 */ s8 rand;
- /* 0x376 */ u16 textId;
- /* 0x378 */ s8 unk378;
- /* 0x379 */ s8 unk379;
- /* 0x37C */ f32 unk37C[3];
- /* 0x388 */ s8 unk388; // unused
- /* 0x389 */ u8 alienAlpha;
- /* 0x38A */ s8 unk38A; // bool
- /* 0x38B */ s8 drawAlien;
- /* 0x38C */ s8 drawAlienDeathEffect;
- /* 0x38D */ u8 alienBeamAlpha;
- /* 0x390 */ Vec3f alienDeathEffectScale;
- /* 0x39C */ f32 scaleFactorAdj;
- /* 0x3A0 */ f32 scaleTarget;
- /* 0x3A4 */ f32 scaleStep;
- /* 0x3A8 */ s16 scaleAdjAngle;
- /* 0x3AA */ s16 unk3AA;
- /* 0x3AC */ s8 unk3AC; // index for D_80B4EDD0
- /* 0x3AD */ UNK_TYPE1 unk3AD[0xF];
- /* 0x3BC */ s8 unk3BC;
+ /* 0x144 */ char unk_144[0x27C];
} EnInvadepoh; // size = 0x3C0
#endif // Z_EN_INVADEPOH_H
diff --git a/src/overlays/actors/ovl_En_Invadepoh_Demo/z_en_invadepoh_demo.c b/src/overlays/actors/ovl_En_Invadepoh_Demo/z_en_invadepoh_demo.c
index 6a73eceec..77b4ce909 100644
--- a/src/overlays/actors/ovl_En_Invadepoh_Demo/z_en_invadepoh_demo.c
+++ b/src/overlays/actors/ovl_En_Invadepoh_Demo/z_en_invadepoh_demo.c
@@ -1,9 +1,21 @@
/*
* File: z_en_invadepoh_demo.c
* Overlay: ovl_En_Invadepoh_Demo
- * Description:
+ * Description: Aliens cutscene actors
+ *
+ * This actor is responsible for handling the characters that appear in two cutscenes:
+ * 1. The cutscene where Romani introduces the aliens to the player.
+ * 2. The cutscene where the aliens abduct the cows and Romani from the barn.
+ *
+ * To be more specific, this actor has five variations:
+ * 1. An alien
+ * 2. Romani
+ * 3. A cow (minus the tail)
+ * 4. The UFO (which appears as a spinning ball of light)
+ * 5. A cow tail
*/
+#include "sys_cfb.h"
#include "z_en_invadepoh_demo.h"
#define FLAGS (ACTOR_FLAG_10)
@@ -15,14 +27,72 @@ void EnInvadepohDemo_Destroy(Actor* thisx, PlayState* play);
void EnInvadepohDemo_Update(Actor* thisx, PlayState* play);
void EnInvadepohDemo_Draw(Actor* thisx, PlayState* play);
-void func_80C19AB4(EnInvadepohDemo* this, PlayState* play);
-void func_80C19D00(EnInvadepohDemo* this, PlayState* play);
-void func_80C19D48(EnInvadepohDemo* this, PlayState* play);
-void func_80C19E04(EnInvadepohDemo* this, PlayState* play);
-void func_80C19EC0(EnInvadepohDemo* this, PlayState* play);
-void func_80C19F7C(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_DoNothing(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_Alien_Init(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_Romani_Init(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_Cow_Init(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_Ufo_Init(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_CowTail_Init(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_Cow_Destroy(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_CowTail_Destroy(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_Alien_Idle(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_Alien_FollowPath(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_Romani_Idle(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_Romani_FollowPath(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_Cow_Idle(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_Cow_FollowPath(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_Ufo_Idle(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_Ufo_FollowPath(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_SelectCueAction(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_CowTail_Idle(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_Alien_WaitForObject(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_Romani_WaitForObject(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_Cow_WaitForObject(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_CowTail_WaitForObject(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_Alien_Draw(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_Romani_Draw(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_Cow_Draw(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_Ufo_Draw(EnInvadepohDemo* this, PlayState* play);
+void EnInvadepohDemo_CowTail_Draw(EnInvadepohDemo* this, PlayState* play);
+
+#define DRAW_FLAG_SHOULD_DRAW 1
+#define EN_INVADEPOH_DEMO_CUEID_NONE -1
+
+typedef enum {
+ /* 0 */ EN_INVADEPOH_DEMO_ALIEN_CUEID_DO_NOTHING,
+ /* 1 */ EN_INVADEPOH_DEMO_ALIEN_CUEID_IDLE,
+ /* 2 */ EN_INVADEPOH_DEMO_ALIEN_CUEID_FOLLOW_PATH_1,
+ /* 3 */ EN_INVADEPOH_DEMO_ALIEN_CUEID_FOLLOW_PATH_2,
+ /* 4 */ EN_INVADEPOH_DEMO_ALIEN_CUEID_FOLLOW_PATH_3,
+ /* 5 */ EN_INVADEPOH_DEMO_ALIEN_CUEID_FOLLOW_PATH_4,
+ /* 6 */ EN_INVADEPOH_DEMO_ALIEN_CUEID_FOLLOW_PATH_5, // Doesn't seem to be actually used in the final game
+ /* 7 */ EN_INVADEPOH_DEMO_ALIEN_CUEID_MAX
+} EnInvadepohDemoAlienCueId;
+
+typedef enum {
+ /* 0 */ EN_INVADEPOH_DEMO_ROMANI_CUEID_DO_NOTHING,
+ /* 1 */ EN_INVADEPOH_DEMO_ROMANI_CUEID_IDLE,
+ /* 2 */ EN_INVADEPOH_DEMO_ROMANI_CUEID_FOLLOW_PATH,
+ /* 3 */ EN_INVADEPOH_DEMO_ROMANI_CUEID_MAX
+} EnInvadepohDemoRomaniCueId;
+
+typedef enum {
+ /* 0 */ EN_INVADEPOH_DEMO_COW_CUEID_DO_NOTHING,
+ /* 1 */ EN_INVADEPOH_DEMO_COW_CUEID_IDLE,
+ /* 2 */ EN_INVADEPOH_DEMO_COW_CUEID_FOLLOW_PATH_1,
+ /* 3 */ EN_INVADEPOH_DEMO_COW_CUEID_FOLLOW_PATH_2,
+ /* 4 */ EN_INVADEPOH_DEMO_COW_CUEID_FOLLOW_PATH_3,
+ /* 5 */ EN_INVADEPOH_DEMO_COW_CUEID_MAX
+} EnInvadepohDemoCowCueId;
+
+typedef enum {
+ /* 0 */ EN_INVADEPOH_DEMO_UFO_CUEID_DO_NOTHING,
+ /* 1 */ EN_INVADEPOH_DEMO_UFO_CUEID_IDLE_1,
+ /* 2 */ EN_INVADEPOH_DEMO_UFO_CUEID_FOLLOW_PATH,
+ /* 3 */ EN_INVADEPOH_DEMO_UFO_CUEID_IDLE_2, // Doesn't seem to be actually used in the final game
+ /* 4 */ EN_INVADEPOH_DEMO_UFO_CUEID_MAX
+} EnInvadepohDemoUfoCueId;
-#if 0
ActorInit En_Invadepoh_Demo_InitVars = {
ACTOR_EN_INVADEPOH_DEMO,
ACTORCAT_PROP,
@@ -35,134 +105,710 @@ ActorInit En_Invadepoh_Demo_InitVars = {
(ActorFunc)EnInvadepohDemo_Draw,
};
-// static InitChainEntry sInitChain[] = {
-static InitChainEntry D_80C1AA74[] = {
- ICHAIN_F32(uncullZoneForward, 20000, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneScale, 500, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneDownward, 600, ICHAIN_CONTINUE),
- ICHAIN_F32(targetArrowOffset, 6000, ICHAIN_CONTINUE),
+static s32 sCueTypes[EN_INVADEPOH_DEMO_TYPE_MAX] = {
+ CS_CMD_ACTOR_CUE_553, // EN_INVADEPOH_DEMO_TYPE_ALIEN
+ CS_CMD_ACTOR_CUE_554, // EN_INVADEPOH_DEMO_TYPE_ROMANI
+ CS_CMD_ACTOR_CUE_563, // EN_INVADEPOH_DEMO_TYPE_COW
+ CS_CMD_ACTOR_CUE_555, // EN_INVADEPOH_DEMO_TYPE_UFO
+ CS_CAM_STOP, // EN_INVADEPOH_DEMO_TYPE_COW_TAIL
+};
+
+static InitChainEntry sAlienInitChain[] = {
+ ICHAIN_F32(uncullZoneForward, 20000, ICHAIN_CONTINUE), ICHAIN_F32(uncullZoneScale, 500, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneDownward, 600, ICHAIN_CONTINUE), ICHAIN_F32(targetArrowOffset, 6000, ICHAIN_CONTINUE),
ICHAIN_VEC3F_DIV1000(scale, 10, ICHAIN_STOP),
};
-// static InitChainEntry sInitChain[] = {
-static InitChainEntry D_80C1AA88[] = {
- ICHAIN_F32(uncullZoneForward, 20000, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneScale, 100, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneDownward, 100, ICHAIN_CONTINUE),
- ICHAIN_F32(targetArrowOffset, 1500, ICHAIN_CONTINUE),
- ICHAIN_U8(targetMode, 6, ICHAIN_CONTINUE),
- ICHAIN_VEC3F_DIV1000(scale, 10, ICHAIN_STOP),
+static InitChainEntry sRomaniInitChain[] = {
+ ICHAIN_F32(uncullZoneForward, 20000, ICHAIN_CONTINUE), ICHAIN_F32(uncullZoneScale, 100, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneDownward, 100, ICHAIN_CONTINUE), ICHAIN_F32(targetArrowOffset, 1500, ICHAIN_CONTINUE),
+ ICHAIN_U8(targetMode, TARGET_MODE_6, ICHAIN_CONTINUE), ICHAIN_VEC3F_DIV1000(scale, 10, ICHAIN_STOP),
};
-// static InitChainEntry sInitChain[] = {
-static InitChainEntry D_80C1AAA0[] = {
+static InitChainEntry sCowInitChain[] = {
ICHAIN_F32(uncullZoneForward, 20000, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneScale, 200, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneDownward, 300, ICHAIN_CONTINUE),
ICHAIN_VEC3F_DIV1000(scale, 10, ICHAIN_STOP),
};
-// static InitChainEntry sInitChain[] = {
-static InitChainEntry D_80C1AAB0[] = {
- ICHAIN_F32(uncullZoneForward, 20000, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneScale, 1000, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneDownward, 1000, ICHAIN_CONTINUE),
- ICHAIN_VEC3S(shape.rot, 0, ICHAIN_CONTINUE),
- ICHAIN_F32(terminalVelocity, -100, ICHAIN_CONTINUE),
- ICHAIN_VEC3F_DIV1000(scale, 800, ICHAIN_STOP),
+static InitChainEntry sUfoInitChain[] = {
+ ICHAIN_F32(uncullZoneForward, 20000, ICHAIN_CONTINUE), ICHAIN_F32(uncullZoneScale, 1000, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneDownward, 1000, ICHAIN_CONTINUE), ICHAIN_VEC3S(shape.rot, 0, ICHAIN_CONTINUE),
+ ICHAIN_F32(terminalVelocity, -100, ICHAIN_CONTINUE), ICHAIN_VEC3F_DIV1000(scale, 800, ICHAIN_STOP),
};
-// static InitChainEntry sInitChain[] = {
-static InitChainEntry D_80C1AAC8[] = {
+static InitChainEntry sCowTailInitChain[] = {
ICHAIN_F32(uncullZoneForward, 20000, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneScale, 100, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneDownward, 100, ICHAIN_CONTINUE),
ICHAIN_VEC3F_DIV1000(scale, 10, ICHAIN_STOP),
};
-#endif
+static EnInvadepohDemoFunc sInitFuncs[EN_INVADEPOH_DEMO_TYPE_MAX] = {
+ EnInvadepohDemo_Alien_Init, // EN_INVADEPOH_DEMO_TYPE_ALIEN
+ EnInvadepohDemo_Romani_Init, // EN_INVADEPOH_DEMO_TYPE_ROMANI
+ EnInvadepohDemo_Cow_Init, // EN_INVADEPOH_DEMO_TYPE_COW
+ EnInvadepohDemo_Ufo_Init, // EN_INVADEPOH_DEMO_TYPE_UFO
+ EnInvadepohDemo_CowTail_Init, // EN_INVADEPOH_DEMO_TYPE_COW_TAIL
+};
-extern InitChainEntry D_80C1AA74[];
-extern InitChainEntry D_80C1AA88[];
-extern InitChainEntry D_80C1AAA0[];
-extern InitChainEntry D_80C1AAB0[];
-extern InitChainEntry D_80C1AAC8[];
+static EnInvadepohDemoFunc sDestroyFuncs[EN_INVADEPOH_DEMO_TYPE_MAX] = {
+ EnInvadepohDemo_DoNothing, // EN_INVADEPOH_DEMO_TYPE_ALIEN
+ EnInvadepohDemo_DoNothing, // EN_INVADEPOH_DEMO_TYPE_ROMANI
+ EnInvadepohDemo_Cow_Destroy, // EN_INVADEPOH_DEMO_TYPE_COW
+ EnInvadepohDemo_DoNothing, // EN_INVADEPOH_DEMO_TYPE_UFO
+ EnInvadepohDemo_CowTail_Destroy, // EN_INVADEPOH_DEMO_TYPE_COW_TAIL
+};
-extern UNK_TYPE D_06000560;
-extern UNK_TYPE D_06001D80;
-extern UNK_TYPE D_06004264;
-extern UNK_TYPE D_06004E98;
-extern UNK_TYPE D_06011FC8;
-extern UNK_TYPE D_06016588;
+static EnInvadepohDemoFunc sAlienCueActionCsFuncs[EN_INVADEPOH_DEMO_ALIEN_CUEID_MAX] = {
+ EnInvadepohDemo_DoNothing, // EN_INVADEPOH_DEMO_ALIEN_CUEID_DO_NOTHING
+ EnInvadepohDemo_Alien_Idle, // EN_INVADEPOH_DEMO_ALIEN_CUEID_IDLE
+ EnInvadepohDemo_Alien_FollowPath, // EN_INVADEPOH_DEMO_ALIEN_CUEID_FOLLOW_PATH_1
+ EnInvadepohDemo_Alien_FollowPath, // EN_INVADEPOH_DEMO_ALIEN_CUEID_FOLLOW_PATH_2
+ EnInvadepohDemo_Alien_FollowPath, // EN_INVADEPOH_DEMO_ALIEN_CUEID_FOLLOW_PATH_3
+ EnInvadepohDemo_Alien_FollowPath, // EN_INVADEPOH_DEMO_ALIEN_CUEID_FOLLOW_PATH_4
+ EnInvadepohDemo_Alien_FollowPath, // EN_INVADEPOH_DEMO_ALIEN_CUEID_FOLLOW_PATH_5
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C192A0.s")
+static EnInvadepohDemoFunc sRomaniCueActionCsFuncs[EN_INVADEPOH_DEMO_ROMANI_CUEID_MAX] = {
+ EnInvadepohDemo_DoNothing, // EN_INVADEPOH_DEMO_ROMANI_CUEID_DO_NOTHING
+ EnInvadepohDemo_Romani_Idle, // EN_INVADEPOH_DEMO_ROMANI_CUEID_IDLE
+ EnInvadepohDemo_Romani_FollowPath, // EN_INVADEPOH_DEMO_ROMANI_CUEID_FOLLOW_PATH
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C192B0.s")
+static EnInvadepohDemoFunc sCowCueActionCsFuncs[EN_INVADEPOH_DEMO_COW_CUEID_MAX] = {
+ EnInvadepohDemo_DoNothing, // EN_INVADEPOH_DEMO_COW_CUEID_DO_NOTHING
+ EnInvadepohDemo_Cow_Idle, // EN_INVADEPOH_DEMO_COW_CUEID_IDLE
+ EnInvadepohDemo_Cow_FollowPath, // EN_INVADEPOH_DEMO_COW_CUEID_FOLLOW_PATH_1
+ EnInvadepohDemo_Cow_FollowPath, // EN_INVADEPOH_DEMO_COW_CUEID_FOLLOW_PATH_2
+ EnInvadepohDemo_Cow_FollowPath, // EN_INVADEPOH_DEMO_COW_CUEID_FOLLOW_PATH_3
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C19334.s")
+static EnInvadepohDemoFunc sUfoCueActionCsFuncs[EN_INVADEPOH_DEMO_UFO_CUEID_MAX] = {
+ EnInvadepohDemo_DoNothing, // EN_INVADEPOH_DEMO_UFO_CUEID_DO_NOTHING
+ EnInvadepohDemo_Ufo_Idle, // EN_INVADEPOH_DEMO_UFO_CUEID_IDLE_1
+ EnInvadepohDemo_Ufo_FollowPath, // EN_INVADEPOH_DEMO_UFO_CUEID_FOLLOW_PATH
+ EnInvadepohDemo_Ufo_Idle, // EN_INVADEPOH_DEMO_UFO_CUEID_IDLE_2
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C193A8.s")
+static EnInvadepohDemoFunc sDrawFuncs[EN_INVADEPOH_DEMO_TYPE_MAX] = {
+ EnInvadepohDemo_Alien_Draw, // EN_INVADEPOH_DEMO_TYPE_ALIEN
+ EnInvadepohDemo_Romani_Draw, // EN_INVADEPOH_DEMO_TYPE_ROMANI
+ EnInvadepohDemo_Cow_Draw, // EN_INVADEPOH_DEMO_TYPE_COW
+ EnInvadepohDemo_Ufo_Draw, // EN_INVADEPOH_DEMO_TYPE_UFO
+ EnInvadepohDemo_CowTail_Draw, // EN_INVADEPOH_DEMO_TYPE_COW_TAIL
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C19454.s")
+MtxF sAlienLeftEyeBeamMtxF;
+MtxF sAlienRightEyeBeamMtxF;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C19498.s")
+void EnInvadepohDemo_DoNothing(EnInvadepohDemo* this, PlayState* play) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C1950C.s")
+void EnInvadepohDemo_Alien_Init(EnInvadepohDemo* this, PlayState* play) {
+ Actor_ProcessInitChain(&this->actor, sAlienInitChain);
+ this->actor.flags = ACTOR_FLAG_10 | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_80000000;
+ this->objectIndex = Object_GetSlot(&play->objectCtx, OBJECT_UCH);
+ if (this->objectIndex < 0) {
+ Actor_Kill(&this->actor);
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C19548.s")
+ this->actionFunc = EnInvadepohDemo_Alien_WaitForObject;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C19564.s")
+void EnInvadepohDemo_Romani_Init(EnInvadepohDemo* this, PlayState* play) {
+ Actor_ProcessInitChain(&this->actor, sRomaniInitChain);
+ this->objectIndex = Object_GetSlot(&play->objectCtx, OBJECT_MA1);
+ if (this->objectIndex < 0) {
+ Actor_Kill(&this->actor);
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C19590.s")
+ this->actionFunc = EnInvadepohDemo_Romani_WaitForObject;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C1965C.s")
+void EnInvadepohDemo_Cow_Init(EnInvadepohDemo* this, PlayState* play) {
+ Actor_ProcessInitChain(&this->actor, sCowInitChain);
+ Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_INVADEPOH_DEMO, 0.0f, 0.0f, 0.0f, 0, 0, 0,
+ EN_INVADEPOH_DEMO_TYPE_COW_TAIL);
+ this->objectIndex = Object_GetSlot(&play->objectCtx, OBJECT_COW);
+ if (this->objectIndex < 0) {
+ Actor_Kill(&this->actor);
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C19688.s")
+ this->actionFunc = EnInvadepohDemo_Cow_WaitForObject;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C19754.s")
+void EnInvadepohDemo_Ufo_Init(EnInvadepohDemo* this, PlayState* play) {
+ Actor_ProcessInitChain(&this->actor, sUfoInitChain);
+ this->actionFunc = EnInvadepohDemo_SelectCueAction;
+ this->drawFlags |= DRAW_FLAG_SHOULD_DRAW;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C1985C.s")
+void EnInvadepohDemo_CowTail_Init(EnInvadepohDemo* this, PlayState* play) {
+ Actor_ProcessInitChain(&this->actor, sCowTailInitChain);
+ this->objectIndex = Object_GetSlot(&play->objectCtx, OBJECT_COW);
+ if (this->objectIndex < 0) {
+ Actor_Kill(&this->actor);
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C1987C.s")
+ this->actionFunc = EnInvadepohDemo_CowTail_WaitForObject;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C199BC.s")
+void EnInvadepohDemo_Cow_Destroy(EnInvadepohDemo* this, PlayState* play) {
+ Actor* thisx = &this->actor;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C199EC.s")
+ if (thisx->child != NULL) {
+ thisx->child->parent = NULL;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C19AB4.s")
+ Actor_Kill(thisx->child);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C19D00.s")
+void EnInvadepohDemo_CowTail_Destroy(EnInvadepohDemo* this, PlayState* play) {
+ if (this->actor.parent != NULL) {
+ this->actor.parent->child = NULL;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C19D48.s")
+void EnInvadepohDemo_Alien_Idle(EnInvadepohDemo* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C19E04.s")
+void EnInvadepohDemo_Alien_FollowPath(EnInvadepohDemo* this, PlayState* play) {
+ Path* path = &play->setupPathList[this->pathIndex];
+ s32 pathCount = path->count;
+ Vec3s* points = Lib_SegmentedToVirtual(path->points);
+ Vec3f point;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C19EC0.s")
+ if (pathCount != 0) {
+ Math_Vec3s_ToVec3f(&point, &points[this->pointIndex]);
+ if (Math_Vec3f_StepTo(&this->actor.world.pos, &point, this->speed) < this->speed) {
+ this->pointIndex++;
+ if (this->pointIndex >= pathCount) {
+ Actor_Kill(&this->actor);
+ }
+ } else {
+ SkelAnime_Update(&this->skelAnime);
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C19F7C.s")
+void EnInvadepohDemo_Romani_Idle(EnInvadepohDemo* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C1A038.s")
+void EnInvadepohDemo_Romani_FollowPath(EnInvadepohDemo* this, PlayState* play) {
+ Path* path = &play->setupPathList[this->pathIndex];
+ s32 pathCount = path->count;
+ Vec3s* points = Lib_SegmentedToVirtual(path->points);
+ Vec3f point;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C1A070.s")
+ if (pathCount != 0) {
+ Math_Vec3s_ToVec3f(&point, &points[this->pointIndex]);
+ if (Math_Vec3f_StepTo(&this->actor.world.pos, &point, this->speed) < this->speed) {
+ this->pointIndex++;
+ if (this->pointIndex >= pathCount) {
+ Actor_Kill(&this->actor);
+ }
+ } else {
+ SkelAnime_Update(&this->skelAnime);
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C1A168.s")
+/**
+ * Positions the cow tail actor at the appropriate spot on the cow's body and rotates it to
+ * match the cow's rotation. This function is also responsible for playing the cow's animation.
+ */
+void EnInvadepohDemo_Cow_UpdateCommon(EnInvadepohDemo* this, PlayState* play) {
+ s32 pad;
+ MtxF mtx;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C1A244.s")
+ if (this->actor.child != NULL) {
+ Matrix_Push();
+ Matrix_SetTranslateRotateYXZ(this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z,
+ &this->actor.shape.rot);
+ Matrix_Translate(0.0f, 57.0f, -36.0f, MTXMODE_APPLY);
+ Matrix_RotateXS(this->actor.shape.rot.x * -0.7f, MTXMODE_APPLY);
+ Matrix_RotateZS(this->actor.shape.rot.z * -0.7f, MTXMODE_APPLY);
+ Matrix_MultZero(&this->actor.child->world.pos);
+ Matrix_Get(&mtx);
+ Matrix_MtxFToYXZRot(&mtx, &this->actor.child->shape.rot, false);
+ Matrix_Pop();
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C1A590.s")
+ SkelAnime_Update(&this->skelAnime);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C1A650.s")
+void EnInvadepohDemo_Cow_Idle(EnInvadepohDemo* this, PlayState* play) {
+ EnInvadepohDemo_Cow_UpdateCommon(this, play);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C1A670.s")
+void EnInvadepohDemo_Cow_FollowPath(EnInvadepohDemo* this, PlayState* play) {
+ Path* path = &play->setupPathList[this->pathIndex];
+ s32 pathCount = path->count;
+ Vec3s* points = Lib_SegmentedToVirtual(path->points);
+ Vec3f point;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C1A6C8.s")
+ if (pathCount != 0) {
+ if (((this->cueId == EN_INVADEPOH_DEMO_COW_CUEID_FOLLOW_PATH_1) && (play->csCtx.curFrame == 343)) ||
+ ((this->cueId == EN_INVADEPOH_DEMO_COW_CUEID_FOLLOW_PATH_2) && (play->csCtx.curFrame == 421)) ||
+ ((this->cueId == EN_INVADEPOH_DEMO_COW_CUEID_FOLLOW_PATH_3) && (play->csCtx.curFrame == 521))) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_COW_CRY);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/func_80C1A854.s")
+ Math_Vec3s_ToVec3f(&point, &points[this->pointIndex]);
+ if (Math_Vec3f_StepTo(&this->actor.world.pos, &point, this->speed) < this->speed) {
+ this->pointIndex++;
+ if (this->pointIndex >= pathCount) {
+ Actor_Kill(&this->actor);
+ }
+ } else {
+ EnInvadepohDemo_Cow_UpdateCommon(this, play);
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/EnInvadepohDemo_Init.s")
+void EnInvadepohDemo_Ufo_Idle(EnInvadepohDemo* this, PlayState* play) {
+ this->ufoRotZ += 0x258;
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_UFO_FLY - SFX_FLAG);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/EnInvadepohDemo_Destroy.s")
+void EnInvadepohDemo_Ufo_FollowPath(EnInvadepohDemo* this, PlayState* play) {
+ Path* path = &play->setupPathList[this->pathIndex];
+ s32 pathCount = path->count;
+ Vec3s* points = Lib_SegmentedToVirtual(path->points);
+ Vec3f point;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/EnInvadepohDemo_Update.s")
+ if (pathCount != 0) {
+ this->ufoRotZ += 0x258;
+ Math_Vec3s_ToVec3f(&point, &points[this->pointIndex]);
+ if (Math_Vec3f_StepTo(&this->actor.world.pos, &point, this->speed) < this->speed) {
+ this->pointIndex++;
+ if (this->pointIndex >= pathCount) {
+ Actor_Kill(&this->actor);
+ }
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Invadepoh_Demo/EnInvadepohDemo_Draw.s")
+/**
+ * Updates the actor's cue ID if certain conditions are met and calls a function based
+ * on their current cue ID. Specifically, cows and aliens offset the cue ID from their
+ * cue channel (which applies to *all* aliens/cows, not just this specific actor), then
+ * they compare this offset value to a value read from their params. If these two values
+ * match, the actor's cue ID is updated.
+ *
+ * The distinction between a "global" cue ID from the cue channel and a "local" cue ID
+ * specific to an instance of this actor is used to prevent all the cows or aliens from
+ * moving along the path at once. The cow or alien waits in a stationary "idle" state
+ * until the "global" cue ID changes to a specific value; if the cue ID offset matches
+ * what this actor specifies in its params, then that acts like a signal to tell the
+ * actor to update the "local" cue ID and start moving. The other cows or aliens in
+ * the scene should have different params, meaning the cue ID offset will not match;
+ * they will thus ignore this "global" cue ID change and remain idle.
+ */
+void EnInvadepohDemo_SelectCueAction(EnInvadepohDemo* this, PlayState* play) {
+ CsCmdActorCue* cue;
+ s32 cueIdOffset;
+
+ if (Cutscene_IsCueInChannel(play, sCueTypes[this->type])) {
+ this->cueChannel = Cutscene_GetCueChannel(play, sCueTypes[this->type]);
+ cue = play->csCtx.actorCues[this->cueChannel];
+
+ switch (this->type) {
+ case EN_INVADEPOH_DEMO_TYPE_UFO:
+ if (this->cueId != cue->id) {
+ if (cue->id == EN_INVADEPOH_DEMO_UFO_CUEID_FOLLOW_PATH) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_UFO_DASH);
+ }
+
+ this->cueId = cue->id;
+ }
+ break;
+
+ case EN_INVADEPOH_DEMO_TYPE_ROMANI:
+ if (this->cueId != cue->id) {
+ this->cueId = cue->id;
+ }
+ break;
+
+ case EN_INVADEPOH_DEMO_TYPE_ALIEN:
+ if (cue->id > EN_INVADEPOH_DEMO_ALIEN_CUEID_IDLE) {
+ cueIdOffset = cue->id - EN_INVADEPOH_DEMO_ALIEN_CUEID_FOLLOW_PATH_1;
+ if (this->cueIdOffset != cueIdOffset) {
+ break;
+ }
+ }
+
+ if (this->cueId != cue->id) {
+ this->cueId = cue->id;
+ }
+ break;
+
+ case EN_INVADEPOH_DEMO_TYPE_COW:
+ if (cue->id > EN_INVADEPOH_DEMO_COW_CUEID_IDLE) {
+ cueIdOffset = cue->id - EN_INVADEPOH_DEMO_COW_CUEID_IDLE;
+ if (this->cueIdOffset != cueIdOffset) {
+ break;
+ }
+ }
+
+ if (this->cueId != cue->id) {
+ this->cueId = cue->id;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ switch (this->type) {
+ case EN_INVADEPOH_DEMO_TYPE_UFO:
+ sUfoCueActionCsFuncs[this->cueId](this, play);
+ break;
+
+ case EN_INVADEPOH_DEMO_TYPE_ALIEN:
+ sAlienCueActionCsFuncs[this->cueId](this, play);
+ break;
+
+ case EN_INVADEPOH_DEMO_TYPE_ROMANI:
+ sRomaniCueActionCsFuncs[this->cueId](this, play);
+ break;
+
+ case EN_INVADEPOH_DEMO_TYPE_COW:
+ sCowCueActionCsFuncs[this->cueId](this, play);
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+void EnInvadepohDemo_CowTail_Idle(EnInvadepohDemo* this, PlayState* play) {
+ if (this->actor.parent == NULL) {
+ Actor_Kill(&this->actor);
+ return;
+ }
+
+ SkelAnime_Update(&this->skelAnime);
+}
+
+void EnInvadepohDemo_Alien_WaitForObject(EnInvadepohDemo* this, PlayState* play) {
+ s32 pad[2];
+
+ if (Object_IsLoaded(&play->objectCtx, this->objectIndex)) {
+ this->actor.objBankIndex = this->objectIndex;
+ Actor_SetObjectDependency(play, &this->actor);
+ this->drawFlags |= DRAW_FLAG_SHOULD_DRAW;
+ this->actionFunc = EnInvadepohDemo_SelectCueAction;
+ SkelAnime_InitFlex(play, &this->skelAnime, &gAlienSkel, &gAlienFloatAnim, this->jointTable, this->morphTable,
+ ALIEN_LIMB_MAX);
+ Animation_PlayLoop(&this->skelAnime, &gAlienFloatAnim);
+ }
+}
+
+void EnInvadepohDemo_Romani_WaitForObject(EnInvadepohDemo* this, PlayState* play) {
+ s32 pad[2];
+
+ if (Object_IsLoaded(&play->objectCtx, this->objectIndex)) {
+ this->actor.objBankIndex = this->objectIndex;
+ Actor_SetObjectDependency(play, &this->actor);
+ this->drawFlags |= DRAW_FLAG_SHOULD_DRAW;
+ this->actionFunc = EnInvadepohDemo_SelectCueAction;
+ SkelAnime_InitFlex(play, &this->skelAnime, &gRomaniSkel, &gRomaniAbductedAnim, this->jointTable,
+ this->morphTable, ROMANI_LIMB_MAX);
+ Animation_PlayLoop(&this->skelAnime, &gRomaniAbductedAnim);
+ }
+}
+
+void EnInvadepohDemo_Cow_WaitForObject(EnInvadepohDemo* this, PlayState* play) {
+ s32 pad[2];
+
+ if (Object_IsLoaded(&play->objectCtx, this->objectIndex)) {
+ this->actor.objBankIndex = this->objectIndex;
+ Actor_SetObjectDependency(play, &this->actor);
+ this->drawFlags |= DRAW_FLAG_SHOULD_DRAW;
+ this->actionFunc = EnInvadepohDemo_SelectCueAction;
+ SkelAnime_InitFlex(play, &this->skelAnime, &gCowSkel, &gCowMooAnim, this->jointTable, this->morphTable,
+ COW_LIMB_MAX);
+ Animation_PlayLoop(&this->skelAnime, &gCowMooAnim);
+ }
+}
+
+void EnInvadepohDemo_CowTail_WaitForObject(EnInvadepohDemo* this, PlayState* play) {
+ s32 pad[2];
+
+ if (Object_IsLoaded(&play->objectCtx, this->objectIndex)) {
+ this->actor.objBankIndex = this->objectIndex;
+ Actor_SetObjectDependency(play, &this->actor);
+ this->drawFlags |= DRAW_FLAG_SHOULD_DRAW;
+ this->actionFunc = EnInvadepohDemo_CowTail_Idle;
+ SkelAnime_InitFlex(play, &this->skelAnime, &gCowTailSkel, &gCowTailSwishAnim, this->jointTable,
+ this->morphTable, COW_TAIL_LIMB_MAX);
+ Animation_PlayLoop(&this->skelAnime, &gCowTailSwishAnim);
+ }
+}
+
+void EnInvadepohDemo_Ufo_UpdateMatrixTranslation(Vec3f* translation) {
+ MtxF* currentMatrix = Matrix_GetCurrent();
+
+ currentMatrix->xw = translation->x;
+ currentMatrix->yw = translation->y;
+ currentMatrix->zw = translation->z;
+}
+
+s32 EnInvadepohDemo_Ufo_ShouldDrawLensFlare(PlayState* play, Vec3f* pos) {
+ Vec3f projectedPos;
+ f32 invW;
+
+ Actor_GetProjectedPos(play, pos, &projectedPos, &invW);
+ if ((projectedPos.z > 1.0f) && (fabsf(projectedPos.x * invW) < 1.0f) && (fabsf(projectedPos.y * invW) < 1.0f)) {
+ f32 screenPosX = PROJECTED_TO_SCREEN_X(projectedPos, invW);
+ f32 screenPosY = PROJECTED_TO_SCREEN_Y(projectedPos, invW);
+ s32 wZ = (s32)(projectedPos.z * invW * 16352.0f) + 16352;
+
+ if (wZ < SysCfb_GetZBufferInt(screenPosX, screenPosY)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void EnInvadepohDemo_Alien_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx,
+ Gfx** gfx) {
+ if (limbIndex == ALIEN_LIMB_LEFT_EYE) {
+ Matrix_Push();
+ Matrix_RotateZS(-0x53ED, MTXMODE_APPLY);
+ Matrix_RotateYS(-0x3830, MTXMODE_APPLY);
+ Matrix_Scale(1.0f, 1.0f, 1.5f, MTXMODE_APPLY);
+ Matrix_Get(&sAlienLeftEyeBeamMtxF);
+ Matrix_Pop();
+ } else if (limbIndex == ALIEN_LIMB_RIGHT_EYE) {
+ Matrix_Push();
+ Matrix_RotateZS(-0x53ED, MTXMODE_APPLY);
+ Matrix_RotateYS(-0x47D0, MTXMODE_APPLY);
+ Matrix_Scale(1.0f, 1.0f, 1.5f, MTXMODE_APPLY);
+ Matrix_Get(&sAlienRightEyeBeamMtxF);
+ Matrix_Pop();
+ }
+}
+
+void EnInvadepohDemo_Alien_Draw(EnInvadepohDemo* this, PlayState* play) {
+ s32 pad[2];
+ Mtx* mtx;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Matrix_Push();
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(&gAlienEmptyTexAnim));
+ Scene_SetRenderModeXlu(play, 0, 1);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+ POLY_OPA_DISP =
+ SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
+ EnInvadepohDemo_Alien_PostLimbDraw, &this->actor, POLY_OPA_DISP);
+
+ // In EnInvadepoh, the eye beam alpha is controlled by an instance variable, and there is an if-block that checks
+ // to see if this variable is not zero. In this actor, the eye beam alpha is hardcoded, but this block is still
+ // necessary to prevent reordering; this is likely a result of copy-pasting from EnInvadepoh.
+ if (true) {
+ Gfx* gfx;
+
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(&gAlienEyeBeamTexAnim));
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ gfx = POLY_XLU_DISP;
+ gDPPipeSync(gfx++);
+ gDPSetPrimColor(gfx++, 0, 0xFF, 240, 180, 100, 60);
+ gDPSetEnvColor(gfx++, 255, 255, 255, 150);
+ Matrix_Mult(&sAlienLeftEyeBeamMtxF, MTXMODE_NEW);
+
+ mtx = Matrix_NewMtx(play->state.gfxCtx);
+
+ if (mtx != NULL) {
+ gSPMatrix(gfx++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(gfx++, gAlienEyeBeamDL);
+ Matrix_Mult(&sAlienRightEyeBeamMtxF, MTXMODE_NEW);
+
+ mtx = Matrix_NewMtx(play->state.gfxCtx);
+
+ if (mtx != NULL) {
+ gSPMatrix(gfx++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(gfx++, gAlienEyeBeamDL);
+ POLY_XLU_DISP = gfx;
+ }
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+
+ // In EnInvadepoh, the code to draw the light flash checks an instance variable which is set to true if the actor
+ // should draw. In this actor, an equivalent variable is checked in EnInvadepohDemo_Draw, so it isn't checked here.
+ // However, this block is still necessary to prevent reordering; this is likely a result of copy-pasting from
+ // EnInvadepoh. Similarly, this function requires a lot of extra stack space for unused variables; the names and
+ // types of these variables are inferred from EnInvadepoh's version of this code.
+ if (true) {
+ Gfx* gfx;
+ Vec3f glowOffset;
+ Vec3f glowPos; // unused, inferred from EnInvadepoh
+ s32 glowAlpha; // unused, inferred from EnInvadepoh
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ gfx = POLY_XLU_DISP;
+ gfx = Gfx_SetupDL20_NoCD(gfx);
+
+ gDPSetDither(gfx++, G_CD_NOISE);
+ gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE,
+ 0);
+ Matrix_Mult(&play->billboardMtxF, MTXMODE_NEW);
+ Matrix_MultVecZ(90.0f, &glowOffset);
+ Matrix_Translate(this->actor.world.pos.x + glowOffset.x, this->actor.world.pos.y + glowOffset.y + 25.0f,
+ this->actor.world.pos.z + glowOffset.z, MTXMODE_NEW);
+ Matrix_Scale(0.15f, 0.15f, 0.15f, MTXMODE_APPLY);
+ gSPDisplayList(gfx++, gameplay_keep_DL_029CB0);
+ gDPSetPrimColor(gfx++, 0, 0, 240, 180, 100, 100);
+
+ mtx = Matrix_NewMtx(play->state.gfxCtx);
+
+ if (mtx != NULL) {
+ gSPMatrix(gfx++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(gfx++, gameplay_keep_DL_029CF0);
+ POLY_XLU_DISP = gfx;
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+
+ Matrix_Pop();
+}
+
+void EnInvadepohDemo_Romani_Draw(EnInvadepohDemo* this, PlayState* play) {
+ s32 pad[2];
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(&gRomaniEyeSadTex));
+ gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(&gRomaniMouthHangingOpenTex));
+ SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
+ NULL, &this->actor);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+s32 EnInvadepohDemo_Cow_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot,
+ Actor* thisx) {
+ if (limbIndex == COW_LIMB_NOSE_RING) {
+ *dList = NULL;
+ }
+
+ return false;
+}
+
+void EnInvadepohDemo_Cow_Draw(EnInvadepohDemo* this, PlayState* play) {
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
+ SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
+ EnInvadepohDemo_Cow_OverrideLimbDraw, NULL, &this->actor);
+}
+
+void EnInvadepohDemo_Ufo_Draw(EnInvadepohDemo* this, PlayState* play) {
+ s32 pad[2];
+ Vec3f flashPos = gZeroVec3f;
+ Mtx* mtx;
+
+ flashPos.x = this->actor.world.pos.x;
+ flashPos.y = this->actor.world.pos.y;
+ flashPos.z = this->actor.world.pos.z;
+ EnInvadepohDemo_Ufo_UpdateMatrixTranslation(&flashPos);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_RotateZS(this->ufoRotZ, MTXMODE_APPLY);
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ mtx = Matrix_NewMtx(play->state.gfxCtx);
+ if (mtx != NULL) {
+ gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0xFF, 0x80, 255, 255, 0, 180);
+ gDPSetEnvColor(POLY_XLU_DISP++, 255, 50, 0, 0);
+ gSPDisplayList(POLY_XLU_DISP++, gEffFlash1DL);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+
+ if (EnInvadepohDemo_Ufo_ShouldDrawLensFlare(play, &flashPos)) {
+ Environment_DrawLensFlare(play, &play->envCtx, &play->view, play->state.gfxCtx, flashPos, 20.0f, 9.0f, 0, 0);
+ }
+}
+
+void EnInvadepohDemo_CowTail_Draw(EnInvadepohDemo* this, PlayState* play) {
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
+ SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
+ NULL, &this->actor);
+}
+
+void EnInvadepohDemo_Init(Actor* thisx, PlayState* play) {
+ s32 pad;
+ EnInvadepohDemo* this = THIS;
+
+ this->cueIdOffset = EN_INVADEPOH_DEMO_GET_CUEID_OFFSET(&this->actor);
+ this->type = EN_INVADEPOH_DEMO_GET_TYPE(&this->actor);
+ if ((this->type < EN_INVADEPOH_DEMO_TYPE_ALIEN) || (this->type > EN_INVADEPOH_DEMO_TYPE_COW_TAIL)) {
+ Actor_Kill(&this->actor);
+ return;
+ }
+
+ if (this->type == EN_INVADEPOH_DEMO_TYPE_UFO) {
+ this->actor.world.rot.z = 0;
+ this->speed = EN_INVADEPOH_DEMO_GET_SPEED(&this->actor);
+ this->actor.shape.rot.z = this->actor.world.rot.z;
+ } else {
+ this->actor.world.rot.z = 0;
+ this->speed = EN_INVADEPOH_DEMO_GET_SPEED(&this->actor) / 10.0f;
+ this->actor.shape.rot.z = this->actor.world.rot.z;
+ }
+
+ this->drawFlags = 0;
+ this->cueId = EN_INVADEPOH_DEMO_CUEID_NONE;
+ this->ufoRotZ = 0;
+ this->pathIndex = EN_INVADEPOH_DEMO_GET_PATH_INDEX(&this->actor);
+ this->pointIndex = 0;
+ this->objectIndex = -1;
+ sInitFuncs[this->type](this, play);
+}
+
+void EnInvadepohDemo_Destroy(Actor* thisx, PlayState* play) {
+ s32 pad;
+ EnInvadepohDemo* this = THIS;
+
+ sDestroyFuncs[this->type](this, play);
+}
+
+void EnInvadepohDemo_Update(Actor* thisx, PlayState* play) {
+ s32 pad;
+ EnInvadepohDemo* this = THIS;
+
+ this->actionFunc(this, play);
+}
+
+void EnInvadepohDemo_Draw(Actor* thisx, PlayState* play) {
+ s32 pad;
+ EnInvadepohDemo* this = THIS;
+
+ if ((this->cueId != EN_INVADEPOH_DEMO_CUEID_NONE) && (this->drawFlags & DRAW_FLAG_SHOULD_DRAW)) {
+ sDrawFuncs[this->type](this, play);
+ }
+}
diff --git a/src/overlays/actors/ovl_En_Invadepoh_Demo/z_en_invadepoh_demo.h b/src/overlays/actors/ovl_En_Invadepoh_Demo/z_en_invadepoh_demo.h
index ff13ca668..ac93078ec 100644
--- a/src/overlays/actors/ovl_En_Invadepoh_Demo/z_en_invadepoh_demo.h
+++ b/src/overlays/actors/ovl_En_Invadepoh_Demo/z_en_invadepoh_demo.h
@@ -2,15 +2,54 @@
#define Z_EN_INVADEPOH_DEMO_H
#include "global.h"
+#include "assets/objects/gameplay_keep/gameplay_keep.h"
+#include "assets/objects/object_cow/object_cow.h"
+#include "assets/objects/object_ma1/object_ma1.h"
+#include "assets/objects/object_uch/object_uch.h"
+
+typedef enum {
+ /* 0 */ EN_INVADEPOH_DEMO_TYPE_ALIEN,
+ /* 1 */ EN_INVADEPOH_DEMO_TYPE_ROMANI,
+ /* 2 */ EN_INVADEPOH_DEMO_TYPE_COW,
+ /* 3 */ EN_INVADEPOH_DEMO_TYPE_UFO,
+ /* 4 */ EN_INVADEPOH_DEMO_TYPE_COW_TAIL,
+ /* 5 */ EN_INVADEPOH_DEMO_TYPE_MAX
+} EnInvadepohDemoType;
+
+#define EN_INVADEPOH_DEMO_GET_TYPE(thisx) ((thisx)->params & 0xF)
+#define EN_INVADEPOH_DEMO_GET_CUEID_OFFSET(thisx) (((thisx)->params >> 11) & 0x7)
+#define EN_INVADEPOH_DEMO_GET_PATH_INDEX(thisx) (((thisx)->params >> 4) & 0x7F)
+#define EN_INVADEPOH_DEMO_GET_SPEED(thisx) ((thisx)->shape.rot.z)
struct EnInvadepohDemo;
typedef void (*EnInvadepohDemoActionFunc)(struct EnInvadepohDemo*, PlayState*);
+// This actor has multiple arrays of function pointers which are used for things like
+// Init, Destroy, Draw, and something similar to an Update function. Some of these
+// functions do not have any stack space for a recast temp, which means that they must
+// take an EnInvadepohDemo pointer, not an Actor pointer. In other words, these
+// functions are not ActorFuncs. This typedef is used for these arrays of function
+// pointers to better distinguish them from "actual" action functions, even if they
+// have the exact same signature.
+typedef void (*EnInvadepohDemoFunc)(struct EnInvadepohDemo*, PlayState*);
+
typedef struct EnInvadepohDemo {
/* 0x000 */ Actor actor;
/* 0x144 */ EnInvadepohDemoActionFunc actionFunc;
- /* 0x148 */ char unk_148[0x180];
+ /* 0x148 */ s32 type; // "type"
+ /* 0x14C */ f32 speed;
+ /* 0x150 */ s32 cueChannel;
+ /* 0x154 */ s32 cueId; // "demo_mode"
+ /* 0x158 */ s32 pathIndex;
+ /* 0x15C */ s32 pointIndex;
+ /* 0x160 */ s32 objectIndex;
+ /* 0x164 */ s32 drawFlags; // Only has one flag to control whether or not to draw
+ /* 0x168 */ s32 cueIdOffset;
+ /* 0x16C */ s16 ufoRotZ;
+ /* 0x170 */ SkelAnime skelAnime;
+ /* 0x1B4 */ Vec3s jointTable[ROMANI_LIMB_MAX];
+ /* 0x23E */ Vec3s morphTable[ROMANI_LIMB_MAX];
} EnInvadepohDemo; // size = 0x2C8
#endif // Z_EN_INVADEPOH_DEMO_H
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 70f77b18a..dcecdac43 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,30 +55,33 @@ 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) {
if (this->collider.base.ocFlags1 & OC1_HIT) {
- switch (INVISIBLERUPPE_GET_3(this)) {
+ switch (INVISIBLERUPPE_GET_3(&this->actor)) {
case 0:
- play_sound(NA_SE_SY_GET_RUPY);
+ Audio_PlaySfx(NA_SE_SY_GET_RUPY);
Item_DropCollectible(play, &this->actor.world.pos, 0x8000 | ITEM00_RUPEE_GREEN);
break;
case 1:
- play_sound(NA_SE_SY_GET_RUPY);
+ Audio_PlaySfx(NA_SE_SY_GET_RUPY);
Item_DropCollectible(play, &this->actor.world.pos, 0x8000 | ITEM00_RUPEE_BLUE);
break;
case 2:
- play_sound(NA_SE_SY_GET_RUPY);
+ Audio_PlaySfx(NA_SE_SY_GET_RUPY);
Item_DropCollectible(play, &this->actor.world.pos, 0x8000 | ITEM00_RUPEE_RED);
break;
+
+ default:
+ break;
}
- if (this->unk_190 >= 0) {
- Flags_SetSwitch(play, this->unk_190);
+ if (this->switchFlag >= 0) {
+ Flags_SetSwitch(play, this->switchFlag);
}
this->actionFunc = func_80C259E8;
@@ -93,13 +96,13 @@ void EnInvisibleRuppe_Init(Actor* thisx, PlayState* play) {
s32 pad;
EnInvisibleRuppe* this = THIS;
- this->unk_190 = INVISIBLERUPPE_GET_1FC(this);
+ this->switchFlag = INVISIBLERUPPE_GET_SWITCH_FLAG(&this->actor);
- if (this->unk_190 == 0x7F) {
- this->unk_190 = -1;
+ if (this->switchFlag == 0x7F) {
+ this->switchFlag = -1;
}
- if ((this->unk_190 >= 0) && Flags_GetSwitch(play, this->unk_190)) {
+ if ((this->switchFlag >= 0) && Flags_GetSwitch(play, this->switchFlag)) {
Actor_Kill(&this->actor);
return;
}
diff --git a/src/overlays/actors/ovl_En_Invisible_Ruppe/z_en_invisible_ruppe.h b/src/overlays/actors/ovl_En_Invisible_Ruppe/z_en_invisible_ruppe.h
index 5b6f6ca64..2257a649a 100644
--- a/src/overlays/actors/ovl_En_Invisible_Ruppe/z_en_invisible_ruppe.h
+++ b/src/overlays/actors/ovl_En_Invisible_Ruppe/z_en_invisible_ruppe.h
@@ -7,13 +7,13 @@ struct EnInvisibleRuppe;
typedef void (*EnInvisibleRuppeActionFunc)(struct EnInvisibleRuppe*, PlayState*);
-#define INVISIBLERUPPE_GET_3(thisx) ((thisx)->actor.params & 3)
-#define INVISIBLERUPPE_GET_1FC(thisx) (((thisx)->actor.params & 0x1FC) >> 2)
+#define INVISIBLERUPPE_GET_3(thisx) ((thisx)->params & 3)
+#define INVISIBLERUPPE_GET_SWITCH_FLAG(thisx) (((thisx)->params & 0x1FC) >> 2)
typedef struct EnInvisibleRuppe {
/* 0x000 */ Actor actor;
/* 0x144 */ ColliderCylinder collider;
- /* 0x190 */ s16 unk_190;
+ /* 0x190 */ s16 switchFlag;
/* 0x192 */ s16 unk_192;
/* 0x194 */ EnInvisibleRuppeActionFunc actionFunc;
} EnInvisibleRuppe; // size = 0x198
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 f911bc4f4..2e3e2fc39 100644
--- a/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c
+++ b/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c
@@ -10,6 +10,7 @@
#include "objects/gameplay_field_keep/gameplay_field_keep.h"
#include "objects/gameplay_keep/gameplay_keep.h"
#include "objects/object_ishi/object_ishi.h"
+#include "overlays/actors/ovl_En_Insect/z_en_insect.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_800000)
@@ -180,7 +181,7 @@ void func_8095D804(Actor* thisx, PlayState* play) {
if (!ENISHI_GET_8(&this->actor)) {
phi_s4 = gameplay_field_keep_DL_0066B0;
} else {
- phi_s4 = object_ishi_DL_0009B0;
+ phi_s4 = gSmallRockDL;
}
temp = D_8095F6E8[ENISHI_GET_8(&this->actor)];
@@ -191,11 +192,11 @@ void func_8095D804(Actor* thisx, PlayState* play) {
spB8.z = ((Rand_ZeroOne() - 0.5f) * 8.0f) + this->actor.world.pos.z;
Math_Vec3f_Copy(&spC4, &this->actor.velocity);
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
spC4.x *= 0.6f;
spC4.y *= -0.3f;
spC4.z *= 0.6f;
- } else if (this->actor.bgCheckFlags & 8) {
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
spC4.x *= -0.5f;
spC4.y *= 0.5f;
spC4.z *= -0.5f;
@@ -230,11 +231,11 @@ void func_8095DABC(Actor* thisx, PlayState* play) {
Math_Vec3f_Copy(&spD8, &this->actor.velocity);
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
spD8.x *= 0.9f;
spD8.y *= -0.8f;
spD8.z *= 0.9f;
- } else if (this->actor.bgCheckFlags & 8) {
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
spD8.x *= -0.9f;
spD8.y *= 0.8f;
spD8.z *= -0.9f;
@@ -265,11 +266,11 @@ void func_8095DDA8(EnIshi* this, PlayState* play) {
Vec3f sp2C;
Math_Vec3f_Copy(&sp2C, &this->actor.world.pos);
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
sp2C.x += 2.0f * this->actor.velocity.x;
sp2C.y -= 2.0f * this->actor.velocity.y;
sp2C.z += 2.0f * this->actor.velocity.z;
- } else if (this->actor.bgCheckFlags & 8) {
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
sp2C.x -= 2.0f * this->actor.velocity.x;
sp2C.y += 2.0f * this->actor.velocity.y;
sp2C.z -= 2.0f * this->actor.velocity.z;
@@ -281,11 +282,11 @@ void func_8095DE9C(EnIshi* this, PlayState* play) {
Vec3f sp2C;
Math_Vec3f_Copy(&sp2C, &this->actor.world.pos);
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
sp2C.x += 2.0f * this->actor.velocity.x;
sp2C.y -= 2.0f * this->actor.velocity.y;
sp2C.z += 2.0f * this->actor.velocity.z;
- } else if (this->actor.bgCheckFlags & 8) {
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
sp2C.x -= 2.0f * this->actor.velocity.x;
sp2C.y += 2.0f * this->actor.velocity.y;
sp2C.z -= 2.0f * this->actor.velocity.z;
@@ -309,7 +310,7 @@ void func_8095DFF0(EnIshi* this, PlayState* play) {
s16 temp_v1_2;
if (temp >= 0) {
- sp3C = Item_DropCollectible(play, &this->actor.world.pos, temp | (ENISHI_GET_FE00(&this->actor) << 8));
+ sp3C = Item_DropCollectible(play, &this->actor.world.pos, temp | (ENISHI_GET_FLAG(&this->actor) << 8));
if (sp3C != NULL) {
Matrix_Push();
Matrix_RotateYS(this->actor.shape.rot.y, MTXMODE_NEW);
@@ -353,8 +354,9 @@ 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.unk20, NULL) == NULL) {
+ this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0,
+ ENINSECT_PARAMS(true), this->actor.csId, this->actor.halfDaysBits,
+ NULL) == NULL) {
break;
}
}
@@ -386,7 +388,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;
}
@@ -397,7 +399,7 @@ void EnIshi_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, D_8095F6B8[sp34]);
func_8095D6E0(&this->actor, play);
- if ((sp34 == 1) && Flags_GetSwitch(play, ENISHI_GET_FE00(&this->actor))) {
+ if ((sp34 == 1) && Flags_GetSwitch(play, ENISHI_GET_FLAG(&this->actor))) {
Actor_Kill(&this->actor);
return;
}
@@ -423,7 +425,7 @@ void EnIshi_Init(Actor* thisx, PlayState* play) {
this->unk_197 |= 1;
}
- this->unk_196 = Object_GetIndex(&play->objectCtx, D_8095F6E8[ENISHI_GET_8(&this->actor)]);
+ this->unk_196 = Object_GetSlot(&play->objectCtx, D_8095F6E8[ENISHI_GET_8(&this->actor)]);
if (this->unk_196 < 0) {
Actor_Kill(&this->actor);
return;
@@ -513,9 +515,9 @@ void func_8095E660(EnIshi* this, PlayState* play) {
if ((this->actor.xzDistToPlayer < 90.0f) && (sp30 == 0)) {
if (sp38 == 1) {
- Actor_PickUp(&this->actor, play, GI_NONE, 80.0f, 20.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_NONE, 80.0f, 20.0f);
} else {
- Actor_PickUp(&this->actor, play, GI_NONE, 50.0f, 10.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_NONE, 50.0f, 10.0f);
}
}
}
@@ -535,13 +537,15 @@ void func_8095E95C(EnIshi* this, PlayState* play) {
if (Actor_HasNoParent(&this->actor, play)) {
this->actor.room = play->roomCtx.curRoom.num;
if (ENISHI_GET_1(&this->actor) == 1) {
- Flags_SetSwitch(play, ENISHI_GET_FE00(&this->actor));
+ Flags_SetSwitch(play, ENISHI_GET_FLAG(&this->actor));
}
func_8095EA70(this);
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;
@@ -554,8 +558,8 @@ void func_8095E95C(EnIshi* this, PlayState* play) {
void func_8095EA70(EnIshi* this) {
f32 sp24;
- this->actor.velocity.x = Math_SinS(this->actor.world.rot.y) * this->actor.speedXZ;
- this->actor.velocity.z = Math_CosS(this->actor.world.rot.y) * this->actor.speedXZ;
+ this->actor.velocity.x = Math_SinS(this->actor.world.rot.y) * this->actor.speed;
+ this->actor.velocity.z = Math_CosS(this->actor.world.rot.y) * this->actor.speed;
if (!ENISHI_GET_1(&this->actor)) {
sp24 = Rand_ZeroOne() - 0.9f;
D_8095F690 = sp24 * 11000.0f;
@@ -585,21 +589,21 @@ void func_8095EBDC(EnIshi* this, PlayState* play) {
this->unk_194--;
- if ((this->actor.bgCheckFlags & 9) || temp_v0 || (this->unk_194 <= 0)) {
+ if ((this->actor.bgCheckFlags & (BGCHECKFLAG_GROUND | BGCHECKFLAG_WALL)) || temp_v0 || (this->unk_194 <= 0)) {
func_8095DF90(this, play);
D_8095F6D8[sp70](&this->actor, play);
- if (!(this->actor.bgCheckFlags & 0x20)) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_WATER)) {
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, D_8095F6D4[sp70], D_8095F6D0[sp70]);
D_8095F6E0[sp70](this, 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);
}
@@ -608,7 +612,7 @@ void func_8095EBDC(EnIshi* this, PlayState* play) {
return;
}
- if (this->actor.bgCheckFlags & 0x40) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) {
if (sp70 == 0) {
sp58.x = this->actor.world.pos.x;
sp58.y = this->actor.world.pos.y + this->actor.depthInWater;
@@ -639,7 +643,7 @@ void func_8095EBDC(EnIshi* this, PlayState* play) {
D_8095F694 >>= 2;
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EV_DIVE_INTO_WATER_L);
- this->actor.bgCheckFlags &= ~0x40;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_WATER_TOUCH;
}
Math_StepToF(&this->actor.shape.yOffset, 0.0f, 2.0f);
@@ -648,7 +652,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 +662,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 +670,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 +687,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 +712,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 +732,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 +743,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);
@@ -757,5 +763,5 @@ void func_8095F61C(Actor* thisx, PlayState* play) {
}
void func_8095F654(Actor* thisx, PlayState* play) {
- Gfx_DrawDListOpa(play, object_ishi_DL_0009B0);
+ Gfx_DrawDListOpa(play, gSmallRockDL);
}
diff --git a/src/overlays/actors/ovl_En_Ishi/z_en_ishi.h b/src/overlays/actors/ovl_En_Ishi/z_en_ishi.h
index 65381f638..81fc78368 100644
--- a/src/overlays/actors/ovl_En_Ishi/z_en_ishi.h
+++ b/src/overlays/actors/ovl_En_Ishi/z_en_ishi.h
@@ -16,7 +16,7 @@ typedef void (*EnIshiUnkFunc2)(Actor*, PlayState*);
#define ENISHI_GET_70(thisx) (((thisx)->params >> 4) & 7)
#define ENISHI_GET_F0(thisx) (((thisx)->params >> 4) & 0xF)
#define ENISHI_GET_100(thisx) (((thisx)->params >> 8) & 1)
-#define ENISHI_GET_FE00(thisx) (((thisx)->params >> 9) & 0x7F)
+#define ENISHI_GET_FLAG(thisx) (((thisx)->params >> 9) & 0x7F)
typedef struct EnIshi {
/* 0x000 */ Actor actor;
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..6bf6b4434 100644
--- a/src/overlays/actors/ovl_En_Ja/z_en_ja.c
+++ b/src/overlays/actors/ovl_En_Ja/z_en_ja.c
@@ -5,9 +5,8 @@
*/
#include "z_en_ja.h"
-#include "objects/object_boj/object_boj.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnJa*)thisx)
@@ -89,27 +88,41 @@ static ColliderCylinderInit sCylinderInit = {
static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE };
-static AnimationInfoS sAnimationInfo[] = {
- { &object_boj_Anim_002734, 1.0f, 0, -1, 0, 0 }, { &object_boj_Anim_0033B0, 1.0f, 0, -1, 0, 0 },
- { &object_boj_Anim_002734, 1.0f, 0, -1, 0, -4 }, { &object_boj_Anim_0033B0, 1.0f, 0, -1, 0, -4 },
- { &object_boj_Anim_004078, 1.0f, 0, -1, 0, 0 }, { &object_boj_Anim_005CE4, 1.0f, 0, -1, 0, 0 },
+typedef enum EnJaAnimation {
+ /* -1 */ ENJA_ANIM_NONE = -1,
+ /* 0 */ ENJA_ANIM_0,
+ /* 1 */ ENJA_ANIM_1,
+ /* 2 */ ENJA_ANIM_2,
+ /* 3 */ ENJA_ANIM_3,
+ /* 4 */ ENJA_ANIM_4,
+ /* 5 */ ENJA_ANIM_5,
+ /* 6 */ ENJA_ANIM_MAX
+} EnJaAnimation;
+
+static AnimationInfoS sAnimationInfo[ENJA_ANIM_MAX] = {
+ { &object_boj_Anim_002734, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENJA_ANIM_0
+ { &object_boj_Anim_0033B0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENJA_ANIM_1
+ { &object_boj_Anim_002734, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENJA_ANIM_2
+ { &object_boj_Anim_0033B0, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // ENJA_ANIM_3
+ { &object_boj_Anim_004078, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENJA_ANIM_4
+ { &object_boj_Anim_005CE4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENJA_ANIM_5
};
-void func_80BC1900(EnJa* this) {
- this->skelAnime.playSpeed = this->unk_344;
+void EnJa_UpdateSkelAnime(EnJa* this) {
+ this->skelAnime.playSpeed = this->animPlaySpeed;
SkelAnime_Update(&this->skelAnime);
}
-s32 func_80BC192C(EnJa* this, s32 arg1) {
- s32 ret = false;
+s32 EnJa_ChangeAnim(EnJa* this, s32 animIndex) {
+ s32 didAnimChange = false;
- if (arg1 != this->unk_36C) {
- this->unk_36C = arg1;
- ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, arg1);
- this->unk_344 = this->skelAnime.playSpeed;
+ if (this->animIndex != animIndex) {
+ this->animIndex = animIndex;
+ didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
+ this->animPlaySpeed = this->skelAnime.playSpeed;
}
- return ret;
+ return didAnimChange;
}
void func_80BC1984(EnJa* this, PlayState* play) {
@@ -123,8 +136,9 @@ void func_80BC1984(EnJa* this, PlayState* play) {
s32 func_80BC19FC(EnJa* this, PlayState* play) {
s32 ret = false;
- if ((this->unk_340 & 7) && Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- SubS_UpdateFlags(&this->unk_340, 0, 7);
+ if (((this->unk_340 & SUBS_OFFER_MODE_MASK) != SUBS_OFFER_MODE_NONE) &&
+ Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ SubS_SetOfferMode(&this->unk_340, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
this->actionFunc = func_80BC22F4;
ret = true;
}
@@ -243,9 +257,9 @@ s32 func_80BC1FC8(EnJa* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret = false;
if (func_80BC1AE0(this, play)) {
- SubS_UpdateFlags(&this->unk_340, 3, 7);
+ SubS_SetOfferMode(&this->unk_340, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_340 |= 0x10;
- func_80BC192C(this, 5);
+ EnJa_ChangeAnim(this, ENJA_ANIM_5);
func_80BC2EA4(this);
ret = true;
}
@@ -257,11 +271,11 @@ s32 func_80BC203C(EnJa* this, PlayState* play, ScheduleOutput* scheduleOutput) {
if (func_80BC1AE0(this, play)) {
if (ENJA_GET_3(&this->actor) == 0) {
- func_80BC192C(this, 1);
+ EnJa_ChangeAnim(this, ENJA_ANIM_1);
} else {
- func_80BC192C(this, 4);
+ EnJa_ChangeAnim(this, ENJA_ANIM_4);
}
- SubS_UpdateFlags(&this->unk_340, 3, 7);
+ SubS_SetOfferMode(&this->unk_340, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->actor.shape.shadowDraw = NULL;
this->unk_340 |= 0x50;
ret = true;
@@ -283,6 +297,9 @@ s32 func_80BC20D0(EnJa* this, PlayState* play, ScheduleOutput* scheduleOutput) {
case 2:
ret = func_80BC203C(this, play, scheduleOutput);
break;
+
+ default:
+ break;
}
return ret;
}
@@ -305,11 +322,11 @@ void func_80BC21A8(EnJa* this, PlayState* play) {
if (!Schedule_RunScript(play, D_80BC35F0, &sp18) ||
((this->unk_1D8.unk_00 != sp18.result) && !func_80BC20D0(this, play, &sp18))) {
this->actor.shape.shadowDraw = NULL;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
sp18.result = 0;
} else {
this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}
this->unk_1D8.unk_00 = sp18.result;
func_80BC2150(this, play);
@@ -328,14 +345,16 @@ s32* func_80BC2274(EnJa* this, PlayState* play) {
return D_80BC362C;
}
return D_80BC366C;
+
+ default:
+ return D_80BC360C;
}
- return D_80BC360C;
}
void func_80BC22F4(EnJa* this, PlayState* play) {
if (func_8010BF58(&this->actor, play, func_80BC2274(this, play), this->unk_368, &this->unk_1D8.unk_04)) {
this->unk_340 &= ~8;
- SubS_UpdateFlags(&this->unk_340, 3, 7);
+ SubS_SetOfferMode(&this->unk_340, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_1D8.unk_04 = 0;
this->unk_340 |= 0x10;
this->actor.shape.rot.y = this->actor.world.rot.y;
@@ -347,16 +366,17 @@ void EnJa_Init(Actor* thisx, PlayState* play) {
EnJa* this = THIS;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 18.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_boj_Skel_00C240, NULL, this->jointTable, this->morphTable, 16);
- this->unk_36C = -1;
- func_80BC192C(this, 0);
+ SkelAnime_InitFlex(play, &this->skelAnime, &object_boj_Skel_00C240, NULL, this->jointTable, this->morphTable,
+ OBJECT_BOJ_LIMB_MAX);
+ this->animIndex = ENJA_ANIM_NONE;
+ EnJa_ChangeAnim(this, ENJA_ANIM_0);
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit);
Actor_SetScale(&this->actor, 0.01f);
- this->actor.targetMode = 0;
+ this->actor.targetMode = TARGET_MODE_0;
this->actor.uncullZoneForward = 800.0f;
this->actor.gravity = 0.0f;
- SubS_UpdateFlags(&this->unk_340, 0, 7);
+ SubS_SetOfferMode(&this->unk_340, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
this->unk_340 |= 0x10;
this->unk_1D8.unk_00 = 0;
this->unk_368 = NULL;
@@ -379,17 +399,17 @@ void EnJa_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
if (this->unk_1D8.unk_00 != 0) {
- func_80BC1900(this);
+ EnJa_UpdateSkelAnime(this);
func_80BC1A68(this);
func_80BC1D70(this, play);
radius = this->collider.dim.radius + 30;
height = this->collider.dim.height + 10;
- func_8013C964(&this->actor, play, radius, height, PLAYER_IA_NONE, this->unk_340 & 7);
+ SubS_Offer(&this->actor, play, radius, height, PLAYER_IA_NONE, this->unk_340 & SUBS_OFFER_MODE_MASK);
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);
}
@@ -402,7 +422,7 @@ void EnJa_Update(Actor* thisx, PlayState* play) {
s32 EnJa_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnJa* this = THIS;
- if (limbIndex == 15) {
+ if (limbIndex == OBJECT_BOJ_LIMB_0F) {
func_80BC1E40(this, play);
}
return false;
@@ -418,10 +438,10 @@ void EnJa_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
EnJa* this = THIS;
s32 pad2;
- if (limbIndex == 15) {
+ if (limbIndex == OBJECT_BOJ_LIMB_0F) {
Matrix_MultVec3f(&D_80BC3780, &this->actor.focus.pos);
Math_Vec3s_Copy(&this->actor.focus.rot, &this->actor.world.rot);
- } else if ((this->unk_340 & 0x40) && (limbIndex == 11)) {
+ } else if ((this->unk_340 & 0x40) && (limbIndex == OBJECT_BOJ_LIMB_0B)) {
OPEN_DISPS(play->state.gfxCtx);
Matrix_Push();
@@ -436,8 +456,9 @@ void EnJa_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
}
if (this->unk_1D8.unk_00 == 1) {
- if ((limbIndex == 11) && (((this->skelAnime.curFrame >= 0.0f) && (this->skelAnime.curFrame <= 6.0f)) ||
- ((this->skelAnime.curFrame >= 35.0f) && (this->skelAnime.curFrame <= 47.0f)))) {
+ if ((limbIndex == OBJECT_BOJ_LIMB_0B) &&
+ (((this->skelAnime.curFrame >= 0.0f) && (this->skelAnime.curFrame <= 6.0f)) ||
+ ((this->skelAnime.curFrame >= 35.0f) && (this->skelAnime.curFrame <= 47.0f)))) {
OPEN_DISPS(play->state.gfxCtx);
Matrix_Push();
@@ -474,7 +495,7 @@ void EnJa_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
Matrix_Pop();
CLOSE_DISPS(play->state.gfxCtx);
- } else if (limbIndex == 14) {
+ } else if (limbIndex == OBJECT_BOJ_LIMB_0E) {
if ((this->skelAnime.curFrame >= 0.0f) && (this->skelAnime.curFrame <= 18.0f)) {
OPEN_DISPS(play->state.gfxCtx);
@@ -540,8 +561,8 @@ void EnJa_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
overrideRot = false;
}
- if (limbIndex != 8) {
- if (limbIndex == 15) {
+ switch (limbIndex) {
+ case OBJECT_BOJ_LIMB_0F:
SubS_UpdateLimb(this->unk_354 + this->unk_358 + 0x4000,
this->unk_356 + this->unk_35A + this->actor.shape.rot.y + 0x4000, &this->unk_1EC,
&this->unk_274, stepRot, overrideRot);
@@ -552,17 +573,22 @@ void EnJa_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
Matrix_RotateXS(this->unk_274.x, MTXMODE_APPLY);
Matrix_RotateZS(this->unk_274.z, MTXMODE_APPLY);
Matrix_Push();
- }
- } else {
- SubS_UpdateLimb(this->unk_358 + 0x4000, this->unk_35A + this->actor.shape.rot.y + 0x4000, &this->unk_1F8,
- &this->unk_27A, stepRot, overrideRot);
- Matrix_Pop();
- Matrix_Translate(this->unk_1F8.x, this->unk_1F8.y, this->unk_1F8.z, MTXMODE_NEW);
- Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
- Matrix_RotateYS(this->unk_27A.y, MTXMODE_APPLY);
- Matrix_RotateXS(this->unk_27A.x, MTXMODE_APPLY);
- Matrix_RotateZS(this->unk_27A.z, MTXMODE_APPLY);
- Matrix_Push();
+ break;
+
+ case OBJECT_BOJ_LIMB_08:
+ SubS_UpdateLimb(this->unk_358 + 0x4000, this->unk_35A + this->actor.shape.rot.y + 0x4000, &this->unk_1F8,
+ &this->unk_27A, stepRot, overrideRot);
+ Matrix_Pop();
+ Matrix_Translate(this->unk_1F8.x, this->unk_1F8.y, this->unk_1F8.z, MTXMODE_NEW);
+ Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
+ Matrix_RotateYS(this->unk_27A.y, MTXMODE_APPLY);
+ Matrix_RotateXS(this->unk_27A.x, MTXMODE_APPLY);
+ Matrix_RotateZS(this->unk_27A.z, MTXMODE_APPLY);
+ Matrix_Push();
+ break;
+
+ default:
+ break;
}
}
@@ -594,7 +620,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_Ja/z_en_ja.h b/src/overlays/actors/ovl_En_Ja/z_en_ja.h
index 00746ec63..fcbbf485f 100644
--- a/src/overlays/actors/ovl_En_Ja/z_en_ja.h
+++ b/src/overlays/actors/ovl_En_Ja/z_en_ja.h
@@ -2,6 +2,7 @@
#define Z_EN_JA_H
#include "global.h"
+#include "objects/object_boj/object_boj.h"
struct EnJa;
@@ -37,10 +38,10 @@ typedef struct EnJa {
/* 0x234 */ EnJaStruct unk_234[4];
/* 0x274 */ Vec3s unk_274;
/* 0x27A */ Vec3s unk_27A;
- /* 0x280 */ Vec3s jointTable[16];
- /* 0x2E0 */ Vec3s morphTable[16];
+ /* 0x280 */ Vec3s jointTable[OBJECT_BOJ_LIMB_MAX];
+ /* 0x2E0 */ Vec3s morphTable[OBJECT_BOJ_LIMB_MAX];
/* 0x340 */ u16 unk_340;
- /* 0x344 */ f32 unk_344;
+ /* 0x344 */ f32 animPlaySpeed;
/* 0x348 */ f32 unk_348;
/* 0x34C */ f32 unk_34C;
/* 0x350 */ UNK_TYPE1 unk350[0x4];
@@ -55,7 +56,7 @@ typedef struct EnJa {
/* 0x364 */ s16 unk_364;
/* 0x366 */ s16 unk_366;
/* 0x368 */ void* unk_368;
- /* 0x36C */ s32 unk_36C;
+ /* 0x36C */ s32 animIndex;
/* 0x370 */ UNK_TYPE1 unk_370[4];
/* 0x374 */ s32 prevTalkState;
} EnJa; // size = 0x378
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 03cc41f20..c66c9a355 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
@@ -93,7 +93,7 @@ s32 EnJcMato_CheckForHit(EnJcMato* this, PlayState* play) {
this->collider.dim.worldSphere.center.z = this->pos.z;
if ((this->collider.base.acFlags & AC_HIT) && !this->hitFlag && (this->actor.colChkInfo.damageEffect == 0xF)) {
this->collider.base.acFlags &= ~AC_HIT;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
+ Actor_PlaySfx(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
play->interfaceCtx.minigamePoints = 1;
this->hitFlag = true;
return 1;
@@ -122,7 +122,7 @@ void EnJcMato_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
Collider_InitSphere(play, &this->collider);
Collider_SetSphere(play, &this->collider, &this->actor, &sSphereInit);
- this->collider.dim.worldSphere.radius = 0xF;
+ this->collider.dim.worldSphere.radius = 15;
this->actor.colChkInfo.damageTable = &sDamageTable;
Actor_SetScale(&this->actor, 0.008f);
this->hitFlag = false;
@@ -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 e7c2ad78d..4573bdcf5 100644
--- a/src/overlays/actors/ovl_En_Jg/z_en_jg.c
+++ b/src/overlays/actors/ovl_En_Jg/z_en_jg.c
@@ -7,7 +7,7 @@
#include "z_en_jg.h"
#include "overlays/actors/ovl_En_S_Goro/z_en_s_goro.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnJg*)thisx)
@@ -35,33 +35,10 @@ s32 EnJg_GetStartingConversationTextId(EnJg* this, PlayState* play);
void EnJg_CheckIfTalkingToPlayerAndHandleFreezeTimer(EnJg* this, PlayState* play);
typedef enum {
- /* 0 */ EN_JG_ANIM_IDLE,
- /* 1 */ EN_JG_ANIM_WALK,
- /* 2 */ EN_JG_ANIM_WAVING,
- /* 3 */ EN_JG_ANIM_SHAKING_HEAD,
- /* 4 */ EN_JG_ANIM_SURPRISE_START,
- /* 5 */ EN_JG_ANIM_SURPRISE_LOOP,
- /* 6 */ EN_JG_ANIM_ANGRY,
- /* 7 */ EN_JG_ANIM_FROZEN_START,
- /* 8 */ EN_JG_ANIM_FROZEN_LOOP,
- /* 9 */ EN_JG_ANIM_WALK_2,
- /* 10 */ EN_JG_ANIM_TAKING_OUT_DRUM,
- /* 11 */ EN_JG_ANIM_DRUM_IDLE,
- /* 12 */ EN_JG_ANIM_PLAYING_DRUM,
- /* 13 */ EN_JG_ANIM_THINKING,
- /* 14 */ EN_JG_ANIM_REMEMBERING,
- /* 15 */ EN_JG_ANIM_STRONG_REMEMBERING,
- /* 16 */ EN_JG_ANIM_DEPRESSED,
- /* 17 */ EN_JG_ANIM_CUTSCENE_IDLE,
- /* 18 */ EN_JG_ANIM_CRADLE,
- /* 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 = {
@@ -133,26 +110,49 @@ static DamageTable sDamageTable = {
/* Powder Keg */ DMG_ENTRY(0, 0x0),
};
-static AnimationInfoS sAnimationInfo[] = {
- { &gGoronElderIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -10 },
- { &gGoronElderWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -10 },
- { &gGoronElderWavingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -10 },
- { &gGoronElderHeadShakeAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -10 },
- { &gGoronElderSurpriseStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -10 },
- { &gGoronElderSurpriseLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -10 },
- { &gGoronElderAngryAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -10 },
- { &gGoronElderSurpriseStartAnim, 2.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gGoronElderSurpriseStartAnim, -2.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gGoronElderWalkAnim, -1.0f, 0, -1, ANIMMODE_LOOP, -10 },
- { &gGoronElderTakeOutDrumAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gGoronElderDrumIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &gGoronElderPlayingDrumAnim, 1.0f, 1, 44, ANIMMODE_ONCE, 0 },
- { &gGoronElderThinkingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &gGoronElderRememberingAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gGoronElderStrongRememberingAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &gGoronElderDepressedAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &gGoronElderIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &gGoronElderCradleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+typedef enum EnJgAnimation {
+ /* 0 */ EN_JG_ANIM_IDLE,
+ /* 1 */ EN_JG_ANIM_WALK,
+ /* 2 */ EN_JG_ANIM_WAVING,
+ /* 3 */ EN_JG_ANIM_SHAKING_HEAD,
+ /* 4 */ EN_JG_ANIM_SURPRISE_START,
+ /* 5 */ EN_JG_ANIM_SURPRISE_LOOP,
+ /* 6 */ EN_JG_ANIM_ANGRY,
+ /* 7 */ EN_JG_ANIM_FROZEN_START,
+ /* 8 */ EN_JG_ANIM_FROZEN_LOOP,
+ /* 9 */ EN_JG_ANIM_WALK_2,
+ /* 10 */ EN_JG_ANIM_TAKING_OUT_DRUM,
+ /* 11 */ EN_JG_ANIM_DRUM_IDLE,
+ /* 12 */ EN_JG_ANIM_PLAYING_DRUM,
+ /* 13 */ EN_JG_ANIM_THINKING,
+ /* 14 */ EN_JG_ANIM_REMEMBERING,
+ /* 15 */ EN_JG_ANIM_STRONG_REMEMBERING,
+ /* 16 */ EN_JG_ANIM_DEPRESSED,
+ /* 17 */ EN_JG_ANIM_CUTSCENE_IDLE,
+ /* 18 */ EN_JG_ANIM_CRADLE,
+ /* 19 */ EN_JG_ANIM_MAX
+} EnJgAnimation;
+
+static AnimationInfoS sAnimationInfo[EN_JG_ANIM_MAX] = {
+ { &gGoronElderIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -10 }, // EN_JG_ANIM_IDLE
+ { &gGoronElderWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -10 }, // EN_JG_ANIM_WALK
+ { &gGoronElderWavingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -10 }, // EN_JG_ANIM_WAVING
+ { &gGoronElderHeadShakeAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -10 }, // EN_JG_ANIM_SHAKING_HEAD
+ { &gGoronElderSurpriseStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -10 }, // EN_JG_ANIM_SURPRISE_START
+ { &gGoronElderSurpriseLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -10 }, // EN_JG_ANIM_SURPRISE_LOOP
+ { &gGoronElderAngryAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -10 }, // EN_JG_ANIM_ANGRY
+ { &gGoronElderSurpriseStartAnim, 2.0f, 0, -1, ANIMMODE_ONCE, 0 }, // EN_JG_ANIM_FROZEN_START
+ { &gGoronElderSurpriseStartAnim, -2.0f, 0, -1, ANIMMODE_ONCE, 0 }, // EN_JG_ANIM_FROZEN_LOOP
+ { &gGoronElderWalkAnim, -1.0f, 0, -1, ANIMMODE_LOOP, -10 }, // EN_JG_ANIM_WALK_2
+ { &gGoronElderTakeOutDrumAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // EN_JG_ANIM_TAKING_OUT_DRUM
+ { &gGoronElderDrumIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // EN_JG_ANIM_DRUM_IDLE
+ { &gGoronElderPlayingDrumAnim, 1.0f, 1, 44, ANIMMODE_ONCE, 0 }, // EN_JG_ANIM_PLAYING_DRUM
+ { &gGoronElderThinkingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // EN_JG_ANIM_THINKING
+ { &gGoronElderRememberingAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // EN_JG_ANIM_REMEMBERING
+ { &gGoronElderStrongRememberingAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // EN_JG_ANIM_STRONG_REMEMBERING
+ { &gGoronElderDepressedAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // EN_JG_ANIM_DEPRESSED
+ { &gGoronElderIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // EN_JG_ANIM_CUTSCENE_IDLE
+ { &gGoronElderCradleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // EN_JG_ANIM_CRADLE
};
static Vec3f sSfxPos = { 0.0f, 0.0f, 0.0f };
@@ -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) {
@@ -339,6 +340,9 @@ void EnJg_SetupTalk(EnJg* this, PlayState* play) {
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex);
this->actionFunc = EnJg_Talk;
break;
+
+ default:
+ break;
}
}
@@ -351,8 +355,8 @@ void EnJg_GoronShrineIdle(EnJg* this, PlayState* play) {
this->flags |= FLAG_LOOKING_AT_PLAYER;
Message_StartTextbox(play, this->textId, &this->actor);
this->actionFunc = EnJg_GoronShrineTalk;
- } else if ((this->actor.xzDistToPlayer < 100.0f) || (this->actor.isTargeted)) {
- func_800B863C(&this->actor, play);
+ } else if ((this->actor.xzDistToPlayer < 100.0f) || (this->actor.isLockedOn)) {
+ Actor_OfferTalkNearColChkInfoCylinder(&this->actor, play);
this->textId = EnJg_GetStartingConversationTextId(this, play);
}
}
@@ -361,7 +365,7 @@ void EnJg_GoronShrineTalk(EnJg* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
if ((this->textId == 0xDCC) || (this->textId == 0xDDD) || (this->textId == 0xDE0)) {
// There is nothing more to say after these lines, so end the current conversation.
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->flags &= ~FLAG_LOOKING_AT_PLAYER;
this->actionFunc = EnJg_GoronShrineIdle;
@@ -373,7 +377,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 +386,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);
}
}
@@ -416,17 +420,17 @@ void EnJg_GoronShrineCheer(EnJg* this, PlayState* play) {
*/
void EnJg_AlternateTalkOrWalkInPlace(EnJg* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
- s16 currentFrame = this->skelAnime.curFrame;
- s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
+ s16 curFrame = this->skelAnime.curFrame;
+ s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
if (this->animIndex == EN_JG_ANIM_SURPRISE_START) {
- if (currentFrame == lastFrame) {
+ if (curFrame == endFrame) {
this->animIndex = EN_JG_ANIM_SURPRISE_LOOP;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex);
}
} else if (this->animIndex == EN_JG_ANIM_SURPRISE_LOOP) {
if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->flags &= ~FLAG_LOOKING_AT_PLAYER;
this->animIndex = EN_JG_ANIM_WALK;
@@ -434,7 +438,7 @@ void EnJg_AlternateTalkOrWalkInPlace(EnJg* this, PlayState* play) {
this->actionFunc = EnJg_Walk;
}
} else if (this->animIndex == EN_JG_ANIM_WALK) {
- Math_ApproachF(&this->actor.speedXZ, 0.0f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 0.0f, 0.2f, 1.0f);
EnJg_CheckIfTalkingToPlayerAndHandleFreezeTimer(this, play);
}
}
@@ -445,7 +449,7 @@ void EnJg_Walk(EnJg* this, PlayState* play) {
if (this->path != NULL) {
yRotation = EnJg_GetWalkingYRotation(this->path, this->currentPoint, &this->actor.world.pos, &distSQ);
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
yRotation = this->actor.wallYaw;
}
@@ -459,10 +463,10 @@ void EnJg_Walk(EnJg* this, PlayState* play) {
this->actionFunc = EnJg_AlternateTalkOrWalkInPlace;
} else {
this->currentPoint++;
- Math_ApproachF(&this->actor.speedXZ, 0.5f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 0.5f, 0.2f, 1.0f);
}
} else {
- Math_ApproachF(&this->actor.speedXZ, 0.5f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 0.5f, 0.2f, 1.0f);
}
}
@@ -471,11 +475,11 @@ void EnJg_Walk(EnJg* this, PlayState* play) {
void EnJg_Talk(EnJg* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
- s16 currentFrame = this->skelAnime.curFrame;
- s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
+ s16 curFrame = this->skelAnime.curFrame;
+ s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
u16 temp;
- if ((this->animIndex == EN_JG_ANIM_SURPRISE_START) && (currentFrame == lastFrame)) {
+ if ((this->animIndex == EN_JG_ANIM_SURPRISE_START) && (curFrame == endFrame)) {
this->animIndex = EN_JG_ANIM_SURPRISE_LOOP;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex);
}
@@ -484,7 +488,7 @@ void EnJg_Talk(EnJg* this, PlayState* play) {
temp = this->textId;
if ((temp == 0xDB4) || (temp == 0xDB5) || (temp == 0xDC4) || (temp == 0xDC6)) {
// There is nothing more to say after these lines, so end the current conversation.
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->flags &= ~FLAG_LOOKING_AT_PLAYER;
this->actionFunc = EnJg_SetupWalk;
@@ -496,12 +500,12 @@ void EnJg_Talk(EnJg* this, PlayState* play) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_24_80)) {
// The player hasn't talked to the Goron Child at least once, so they can't learn
// the Lullaby Intro. End the current conversation with the player.
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->flags &= ~FLAG_LOOKING_AT_PLAYER;
this->actionFunc = EnJg_SetupWalk;
- } else if ((CHECK_WEEKEVENTREG(WEEKEVENTREG_24_40)) ||
- (CHECK_QUEST_ITEM(QUEST_SONG_LULLABY) || CHECK_QUEST_ITEM(QUEST_SONG_LULLABY_INTRO))) {
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_24_40) || CHECK_QUEST_ITEM(QUEST_SONG_LULLABY) ||
+ CHECK_QUEST_ITEM(QUEST_SONG_LULLABY_INTRO)) {
// The player already has the Lullaby or Lullaby Intro, so say "I'm counting on you"
this->textId = EnJg_GetNextTextId(this);
Message_StartTextbox(play, this->textId, &this->actor);
@@ -510,14 +514,14 @@ void EnJg_Talk(EnJg* this, PlayState* play) {
// To get to this point, the player *has* talked to the Goron Child, but doesn't
// already have the Lullaby or Lullaby Intro. End the current conversation and
// start the cutscene that teaches the Lullaby Intro.
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
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 {
@@ -541,13 +545,13 @@ void EnJg_SetupWalk(EnJg* this, PlayState* play) {
}
void EnJg_Freeze(EnJg* this, PlayState* play) {
- s16 currentFrame = this->skelAnime.curFrame;
- s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
+ s16 curFrame = this->skelAnime.curFrame;
+ s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
if (this->action == EN_JG_ACTION_SPAWNING) {
this->action = EN_JG_ACTION_FROZEN_OR_NON_FIRST_THAW;
this->freezeTimer = 1000;
- this->skelAnime.curFrame = lastFrame;
+ this->skelAnime.curFrame = endFrame;
this->icePoly = Actor_Spawn(&play->actorCtx, play, ACTOR_OBJ_ICE_POLY, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, this->actor.world.rot.x,
this->actor.world.rot.y, this->actor.world.rot.z, 0xFF50);
@@ -556,7 +560,7 @@ void EnJg_Freeze(EnJg* this, PlayState* play) {
this->actionFunc = EnJg_FrozenIdle;
} else if (this->animIndex == EN_JG_ANIM_FROZEN_START) {
this->action = EN_JG_ACTION_FROZEN_OR_NON_FIRST_THAW;
- if (currentFrame == lastFrame) {
+ if (curFrame == endFrame) {
this->freezeTimer = 1000;
this->icePoly = Actor_Spawn(&play->actorCtx, play, ACTOR_OBJ_ICE_POLY, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, this->actor.world.rot.x,
@@ -593,44 +597,44 @@ void EnJg_FrozenIdle(EnJg* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
Message_StartTextbox(play, 0x236, &this->actor); // The old Goron is frozen solid!
this->actionFunc = EnJg_EndFrozenInteraction;
- } else if (this->actor.isTargeted) {
- func_800B863C(&this->actor, play);
+ } else if (this->actor.isLockedOn) {
+ Actor_OfferTalkNearColChkInfoCylinder(&this->actor, play);
}
}
}
void EnJg_EndFrozenInteraction(EnJg* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(play)) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->actionFunc = EnJg_FrozenIdle;
}
}
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;
+ this->csAnimIndex = EN_JG_ANIM_CUTSCENE_IDLE;
if (this->drum != NULL) {
Actor_Kill(this->drum);
this->drum = NULL;
@@ -638,67 +642,66 @@ void EnJg_LullabyIntroCutsceneAction(EnJg* this, PlayState* play) {
break;
case 2:
- this->cutsceneAnimIndex = EN_JG_ANIM_TAKING_OUT_DRUM;
+ this->csAnimIndex = EN_JG_ANIM_TAKING_OUT_DRUM;
break;
case 3:
- this->cutsceneAnimIndex = EN_JG_ANIM_DRUM_IDLE;
+ this->csAnimIndex = EN_JG_ANIM_DRUM_IDLE;
break;
case 4:
- this->cutsceneAnimIndex = EN_JG_ANIM_PLAYING_DRUM;
+ this->csAnimIndex = EN_JG_ANIM_PLAYING_DRUM;
break;
case 5:
- this->cutsceneAnimIndex = EN_JG_ANIM_THINKING;
+ this->csAnimIndex = EN_JG_ANIM_THINKING;
break;
case 6:
- this->cutsceneAnimIndex = EN_JG_ANIM_REMEMBERING;
+ this->csAnimIndex = EN_JG_ANIM_REMEMBERING;
break;
case 7:
- this->cutsceneAnimIndex = EN_JG_ANIM_STRONG_REMEMBERING;
+ this->csAnimIndex = EN_JG_ANIM_STRONG_REMEMBERING;
break;
case 8:
- this->cutsceneAnimIndex = EN_JG_ANIM_DEPRESSED;
+ this->csAnimIndex = EN_JG_ANIM_DEPRESSED;
break;
case 9:
- this->cutsceneAnimIndex = EN_JG_ANIM_CRADLE;
+ this->csAnimIndex = EN_JG_ANIM_CRADLE;
break;
default:
- this->cutsceneAnimIndex = EN_JG_ANIM_IDLE;
+ this->csAnimIndex = EN_JG_ANIM_IDLE;
break;
}
- SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->cutsceneAnimIndex);
+ SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->csAnimIndex);
}
- if ((!(this->flags & FLAG_DRUM_SPAWNED)) &&
- (((this->cutsceneAnimIndex == EN_JG_ANIM_TAKING_OUT_DRUM) && (Animation_OnFrame(&this->skelAnime, 14.0f)) &&
+ if (!(this->flags & FLAG_DRUM_SPAWNED) &&
+ (((this->csAnimIndex == EN_JG_ANIM_TAKING_OUT_DRUM) && Animation_OnFrame(&this->skelAnime, 14.0f) &&
(this->action != EN_JG_ACTION_LULLABY_INTRO_CS)) ||
- (((this->cutsceneAnimIndex == EN_JG_ANIM_DRUM_IDLE) ||
- (this->cutsceneAnimIndex == EN_JG_ANIM_PLAYING_DRUM)) &&
+ (((this->csAnimIndex == EN_JG_ANIM_DRUM_IDLE) || (this->csAnimIndex == EN_JG_ANIM_PLAYING_DRUM)) &&
(this->action == EN_JG_ACTION_LULLABY_INTRO_CS)))) {
this->flags |= FLAG_DRUM_SPAWNED;
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.unk20, NULL);
+ this->actor.params, this->actor.csId, this->actor.halfDaysBits, NULL);
}
- if (this->cutsceneAnimIndex == EN_JG_ANIM_TAKING_OUT_DRUM) {
+ if (this->csAnimIndex == EN_JG_ANIM_TAKING_OUT_DRUM) {
if (Animation_OnFrame(&this->skelAnime, 23.0f)) {
- Audio_PlaySfxAtPos(&sSfxPos, NA_SE_EV_WOOD_BOUND_S);
+ Audio_PlaySfx_AtPos(&sSfxPos, NA_SE_EV_WOOD_BOUND_S);
} else if (Animation_OnFrame(&this->skelAnime, 38.0f)) {
- Audio_PlaySfxAtPos(&sSfxPos, NA_SE_EV_OBJECT_SLIDE);
+ Audio_PlaySfx_AtPos(&sSfxPos, NA_SE_EV_OBJECT_SLIDE);
}
}
} else {
- this->csAction = 99;
+ this->cueId = 99;
this->freezeTimer = 1000;
SET_WEEKEVENTREG(WEEKEVENTREG_24_40);
this->actionFunc = EnJg_Idle;
@@ -757,10 +760,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?
@@ -898,12 +901,12 @@ void EnJg_SpawnBreath(EnJg* this, PlayState* play) {
* handing it off to EnJg_Freeze.
*/
void EnJg_CheckIfTalkingToPlayerAndHandleFreezeTimer(EnJg* this, PlayState* play) {
- s16 currentFrame = this->skelAnime.curFrame;
- s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
+ s16 curFrame = this->skelAnime.curFrame;
+ s16 endFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->flags |= FLAG_LOOKING_AT_PLAYER;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->textId == 0xDAC) {
this->action = EN_JG_ACTION_FIRST_THAW;
@@ -916,18 +919,18 @@ void EnJg_CheckIfTalkingToPlayerAndHandleFreezeTimer(EnJg* this, PlayState* play
Message_StartTextbox(play, this->textId, &this->actor);
this->actionFunc = EnJg_SetupTalk;
} else {
- if ((this->actor.xzDistToPlayer < 100.0f) || (this->actor.isTargeted)) {
- func_800B863C(&this->actor, play);
+ if ((this->actor.xzDistToPlayer < 100.0f) || (this->actor.isLockedOn)) {
+ Actor_OfferTalkNearColChkInfoCylinder(&this->actor, play);
if (this->action == EN_JG_ACTION_FIRST_THAW) {
this->textId = EnJg_GetStartingConversationTextId(this, play);
}
}
this->freezeTimer--;
- if ((this->freezeTimer <= 0) && (currentFrame == lastFrame)) {
+ if ((this->freezeTimer <= 0) && (curFrame == endFrame)) {
this->animIndex = EN_JG_ANIM_FROZEN_START;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex);
- Audio_PlaySfxAtPos(&sSfxPos, NA_SE_EV_FREEZE_S);
+ Audio_PlaySfx_AtPos(&sSfxPos, NA_SE_EV_FREEZE_S);
this->actionFunc = EnJg_Freeze;
}
}
@@ -948,7 +951,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 +959,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 +970,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..30c84973c 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;
- /* 0x3CA */ u8 cutsceneAnimIndex;
- /* 0x3CB */ u8 csAction;
+ /* 0x3C8 */ s16 csId;
+ /* 0x3CA */ u8 csAnimIndex;
+ /* 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 2db753d01..aba7cdeeb 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
@@ -7,7 +7,7 @@
#include "z_en_jgame_tsn.h"
#include "overlays/actors/ovl_Obj_Jgame_Light/z_obj_jgame_light.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
#define THIS ((EnJgameTsn*)thisx)
@@ -48,10 +48,18 @@ ActorInit En_Jgame_Tsn_InitVars = {
(ActorFunc)EnJgameTsn_Draw,
};
-static AnimationInfo sAnimationInfo[] = {
- { &object_tsn_Anim_0092FC, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -6.0f },
- { &object_tsn_Anim_000964, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -6.0f },
- { &object_tsn_Anim_001198, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -6.0f },
+typedef enum EnJgameTsnAnimation {
+ /* -1 */ ENJGAMETSN_ANIM_NONE = -1,
+ /* 0 */ ENJGAMETSN_ANIM_0,
+ /* 1 */ ENJGAMETSN_ANIM_1,
+ /* 2 */ ENJGAMETSN_ANIM_2,
+ /* 3 */ ENJGAMETSN_ANIM_MAX
+} EnJgameTsnAnimation;
+
+static AnimationInfo sAnimationInfo[ENJGAMETSN_ANIM_MAX] = {
+ { &object_tsn_Anim_0092FC, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -6.0f }, // ENJGAMETSN_ANIM_0
+ { &object_tsn_Anim_000964, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -6.0f }, // ENJGAMETSN_ANIM_1
+ { &object_tsn_Anim_001198, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -6.0f }, // ENJGAMETSN_ANIM_2
};
static ColliderCylinderInit sCylinderInit = {
@@ -90,7 +98,7 @@ void EnJgameTsn_Init(Actor* thisx, PlayState* play) {
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
this->actor.velocity.y = 0.0f;
@@ -119,7 +127,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 +136,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);
}
@@ -145,7 +153,7 @@ void EnJgameTsn_Destroy(Actor* thisx, PlayState* play) {
}
void func_80C13B74(EnJgameTsn* this) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_0);
this->actionFunc = func_80C13BB8;
}
@@ -156,15 +164,15 @@ void func_80C13BB8(EnJgameTsn* this, PlayState* play) {
if (this->actor.flags & ACTOR_FLAG_10000) {
this->actor.flags &= ~ACTOR_FLAG_10000;
if (gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] > SECONDS_TO_TIMER(0)) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_1);
Message_StartTextbox(play, 0x10A2, &this->actor);
this->unk_300 = 0x10A2;
} else if (gSaveContext.minigameScore < 20) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_1);
Message_StartTextbox(play, 0x10A2, &this->actor);
this->unk_300 = 0x10A2;
} else {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_2);
Message_StartTextbox(play, 0x10A3, &this->actor);
this->unk_300 = 0x10A3;
}
@@ -174,26 +182,26 @@ void func_80C13BB8(EnJgameTsn* this, PlayState* play) {
this->unk_300 = 0x1094;
} else if (this->unk_2F8 == 0) {
this->unk_2F8 = 1;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_1);
Message_StartTextbox(play, 0x1095, &this->actor);
this->unk_300 = 0x1095;
} else {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_1);
Message_StartTextbox(play, 0x1096, &this->actor);
this->unk_300 = 0x1096;
}
func_80C14030(this);
} else if (this->actor.flags & ACTOR_FLAG_10000) {
- func_800B8614(&this->actor, play, 200.0f);
+ Actor_OfferTalk(&this->actor, play, 200.0f);
} else {
- func_800B8614(&this->actor, play, 80.0f);
+ Actor_OfferTalk(&this->actor, play, 80.0f);
}
- if ((player->actor.bgCheckFlags & 1) && !(player->stateFlags1 & PLAYER_STATE1_2000) && (this->unk_2FE == 0) &&
- (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) && func_80C149B0(play, &this->unk_1F8)) {
+ if ((player->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && !(player->stateFlags1 & PLAYER_STATE1_2000) &&
+ (this->unk_2FE == 0) && (GET_PLAYER_FORM == PLAYER_FORM_HUMAN) && func_80C149B0(play, &this->unk_1F8)) {
this->unk_2FE = 1;
func_80C13E6C(this);
- } else if (!(player->actor.bgCheckFlags & 1)) {
+ } else if (!(player->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
this->unk_2FE = 0;
}
@@ -211,17 +219,17 @@ void func_80C13E90(EnJgameTsn* this, PlayState* play) {
this->actor.flags &= ~ACTOR_FLAG_10000;
if (((gSaveContext.save.time > CLOCK_TIME(4, 0)) && (gSaveContext.save.time < CLOCK_TIME(7, 0))) ||
((gSaveContext.save.time > CLOCK_TIME(16, 0)) && (gSaveContext.save.time < CLOCK_TIME(19, 0)))) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_2);
Message_StartTextbox(play, 0x1094, &this->actor);
this->unk_300 = 0x1094;
} else {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_1);
Message_StartTextbox(play, 0x1098, &this->actor);
this->unk_300 = 0x1098;
}
func_80C14030(this);
} else {
- func_800B8614(&this->actor, play, 1000.0f);
+ Actor_OfferTalk(&this->actor, play, 1000.0f);
}
}
@@ -230,15 +238,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);
@@ -267,12 +275,15 @@ 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);
}
break;
+
+ default:
+ break;
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 5, 0x71C, 0xB6);
@@ -283,7 +294,7 @@ void func_80C1410C(EnJgameTsn* this, PlayState* play) {
Player* player = GET_PLAYER(play);
player->stateFlags1 |= PLAYER_STATE1_20;
- func_801A2BB8(0x25);
+ Audio_PlaySubBgm(NA_BGM_TIMED_MINI_GAME);
play->interfaceCtx.minigameState = MINIGAME_STATE_COUNTDOWN_SETUP_3;
Interface_InitMinigame(play);
SET_WEEKEVENTREG(WEEKEVENTREG_90_20);
@@ -334,21 +345,22 @@ void func_80C14230(EnJgameTsn* this, PlayState* play) {
this->unk_2FC++;
- if ((player->actor.bgCheckFlags & 2) && func_80C149B0(play, &this->unk_200)) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
+ if ((player->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) && func_80C149B0(play, &this->unk_200)) {
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_2);
Message_StartTextbox(play, 0x109F, &this->actor);
this->unk_300 = 0x109F;
player->stateFlags1 |= PLAYER_STATE1_20;
*this->unk_208[this->unk_218] &= ~OBJLUPYGAMELIFT_IGNITE_FIRE;
- func_801A2C20();
+ Audio_StopSubBgm();
func_80C14030(this);
- } else if ((player->actor.bgCheckFlags & 0x40) || (player->actor.bgCheckFlags & 0x20)) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
+ } else if ((player->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) ||
+ (player->actor.bgCheckFlags & BGCHECKFLAG_WATER)) {
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_2);
Message_StartTextbox(play, 0x10A0, &this->actor);
this->unk_300 = 0x10A0;
player->stateFlags1 |= PLAYER_STATE1_20;
*this->unk_208[this->unk_218] &= ~OBJLUPYGAMELIFT_IGNITE_FIRE;
- func_801A2C20();
+ Audio_StopSubBgm();
func_80C14030(this);
}
@@ -357,7 +369,7 @@ void func_80C14230(EnJgameTsn* this, PlayState* play) {
this->unk_300 = 0x10A1;
player->stateFlags1 |= PLAYER_STATE1_20;
*this->unk_208[this->unk_218] &= ~OBJLUPYGAMELIFT_IGNITE_FIRE;
- func_801A2C20();
+ Audio_StopSubBgm();
func_80C14030(this);
}
}
@@ -384,9 +396,9 @@ void func_80C14554(EnJgameTsn* this, PlayState* play) {
}
func_80C145FC(this);
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_82_10)) {
- Actor_PickUp(&this->actor, play, GI_RUPEE_PURPLE, 500.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_RUPEE_PURPLE, 500.0f, 100.0f);
} else {
- Actor_PickUp(&this->actor, play, GI_HEART_PIECE, 500.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_HEART_PIECE, 500.0f, 100.0f);
}
}
@@ -400,24 +412,24 @@ void func_80C14610(EnJgameTsn* this, PlayState* play) {
this->unk_300 = 0x10A4;
func_80C14030(this);
} else {
- func_800B85E0(&this->actor, play, 200.0f, -1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 200.0f, PLAYER_IA_MINUS1);
}
}
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);
} else {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_2);
Message_StartTextbox(play, 0x109D, &this->actor);
this->unk_300 = 0x109D;
}
} else {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_2);
Message_StartTextbox(play, 0x109C, &this->actor);
this->unk_300 = 0x109C;
}
@@ -460,16 +472,16 @@ void func_80C147B4(EnJgameTsn* this, PlayState* play) {
break;
case 0x109A:
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENJGAMETSN_ANIM_0);
Message_StartTextbox(play, 0x109B, &this->actor);
this->unk_300 = 0x109B;
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);
}
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_80C1476C(this, play);
func_80C1410C(this, play);
break;
@@ -477,7 +489,7 @@ void func_80C147B4(EnJgameTsn* this, PlayState* play) {
case 0x109F:
case 0x10A0:
case 0x10A1:
- func_801477B4(play);
+ Message_CloseTextbox(play);
gSaveContext.minigameStatus = MINIGAME_STATUS_END;
gSaveContext.timerStates[TIMER_ID_MINIGAME_2] = TIMER_STATE_STOP;
CLEAR_WEEKEVENTREG(WEEKEVENTREG_90_20);
@@ -485,10 +497,13 @@ void func_80C147B4(EnJgameTsn* this, PlayState* play) {
break;
case 0x10A3:
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_80C14540(this);
func_80C14554(this, play);
break;
+
+ default:
+ break;
}
}
}
@@ -549,7 +564,7 @@ s32 func_80C14BCC(EnJgameTsn* this, PlayState* play) {
s32 i;
s32 phi_s3 = -1;
- if (player->actor.bgCheckFlags & 2) {
+ if (player->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
for (i = 0; i < ARRAY_COUNT(this->unk_1D8); i++) {
if (func_80C149B0(play, &this->unk_1D8[i])) {
phi_s3 = i;
@@ -561,19 +576,19 @@ s32 func_80C14BCC(EnJgameTsn* this, PlayState* play) {
}
if (phi_s3 == this->unk_218) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
+ Actor_PlaySfx(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
*this->unk_208[phi_s3] |= OBJLUPYGAMELIFT_DISPLAY_CORRECT;
play->interfaceCtx.minigamePoints = 1;
return true;
}
if (*this->unk_208[phi_s3] & OBJLUPYGAMELIFT_IGNITE_FIRE) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
+ Actor_PlaySfx(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
*this->unk_208[phi_s3] |= OBJLUPYGAMELIFT_DISPLAY_CORRECT;
play->interfaceCtx.minigamePoints = 1;
} else {
*this->unk_208[phi_s3] |= OBJLUPYGAMELIFT_DISPLAY_INCORRECT;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_ERROR);
+ Actor_PlaySfx(&this->actor, NA_SE_SY_ERROR);
}
}
@@ -634,7 +649,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 ecfaa6b8b..7d5185935 100644
--- a/src/overlays/actors/ovl_En_Js/z_en_js.c
+++ b/src/overlays/actors/ovl_En_Js/z_en_js.c
@@ -6,7 +6,7 @@
#include "z_en_js.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnJs*)thisx)
@@ -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:
@@ -117,6 +117,7 @@ void EnJs_Init(Actor* thisx, PlayState* play) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_84_20);
}
break;
+
case 1:
case 2:
case 3:
@@ -130,6 +131,7 @@ void EnJs_Init(Actor* thisx, PlayState* play) {
return;
}
break;
+
case 5:
case 6:
case 7:
@@ -137,6 +139,7 @@ void EnJs_Init(Actor* thisx, PlayState* play) {
this->maskType = ENJS_GET_TYPE(&this->actor) - 4;
this->actionFunc = func_8096A104;
break;
+
default:
break;
}
@@ -153,6 +156,7 @@ void EnJs_Destroy(Actor* thisx, PlayState* play) {
case 0:
Play_DisableMotionBlur();
break;
+
case 5:
case 6:
case 7:
@@ -161,6 +165,7 @@ void EnJs_Destroy(Actor* thisx, PlayState* play) {
func_80969400(ENJS_GET_TYPE(&this->actor));
}
break;
+
default:
break;
}
@@ -194,7 +199,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;
@@ -254,7 +259,7 @@ s32 func_80968CB8(EnJs* this) {
return true;
}
- Math_StepToF(&this->actor.speedXZ, this->unk_2B4, 0.5f);
+ Math_StepToF(&this->actor.speed, this->unk_2B4, 0.5f);
return false;
}
@@ -377,7 +382,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;
@@ -414,6 +419,7 @@ s32 func_809692A8(s32 arg0) {
return false;
}
return true;
+
case 5:
case 6:
case 7:
@@ -422,6 +428,7 @@ s32 func_809692A8(s32 arg0) {
return false;
}
return true;
+
default:
return false;
}
@@ -441,6 +448,7 @@ s32 func_8096933C(s32 arg0) {
} else {
return true;
}
+
case 5:
case 6:
case 7:
@@ -451,6 +459,7 @@ s32 func_8096933C(s32 arg0) {
} else {
return true;
}
+
default:
return false;
}
@@ -475,20 +484,20 @@ void func_80969400(s32 arg0) {
void func_80969494(EnJs* this, PlayState* play) {
func_80968A5C(this);
- func_801477B4(play);
- this->actor.flags &= ~ACTOR_FLAG_100;
+ Message_CloseTextbox(play);
+ this->actor.flags &= ~ACTOR_FLAG_TALK_REQUESTED;
this->actionFunc = func_80969B5C;
}
void func_809694E8(EnJs* this, PlayState* play) {
- func_801477B4(play);
- this->actor.flags &= ~ACTOR_FLAG_100;
+ Message_CloseTextbox(play);
+ this->actor.flags &= ~ACTOR_FLAG_TALK_REQUESTED;
this->actionFunc = func_8096A104;
}
void func_80969530(EnJs* this, PlayState* play) {
- func_801477B4(play);
- this->actor.flags &= ~ACTOR_FLAG_100;
+ Message_CloseTextbox(play);
+ this->actor.flags &= ~ACTOR_FLAG_TALK_REQUESTED;
this->actionFunc = func_8096A6F4;
if ((this->actor.home.rot.y == this->actor.shape.rot.y) && (this->unk_2B8 & 0x10)) {
Animation_Change(&this->skelAnime, &gMoonChildGettingUpAnim, -1.0f,
@@ -511,17 +520,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) {
@@ -542,8 +551,8 @@ void func_80969748(EnJs* this, PlayState* play) {
this->actionFunc = func_80969898;
}
if (itemAction > PLAYER_IA_NONE) {
- func_801477B4(play);
- if ((itemAction >= PLAYER_IA_MASK_TRUTH) && (itemAction <= PLAYER_IA_MASK_GIANT)) {
+ Message_CloseTextbox(play);
+ 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 +560,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;
@@ -559,7 +568,7 @@ void func_80969748(EnJs* this, PlayState* play) {
}
if (itemAction <= PLAYER_IA_MINUS1) {
- func_80151938(play, 0x2216);
+ Message_ContinueTextbox(play, 0x2216);
}
}
}
@@ -576,62 +585,74 @@ void func_80969898(EnJs* this, PlayState* play) {
if (Message_ShouldAdvance(play) && (play->msgCtx.currentTextId == 0x2215)) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
- func_80151938(play, 0x2217);
+ Audio_PlaySfx_MessageDecide();
+ Message_ContinueTextbox(play, 0x2217);
break;
+
case 1:
- func_8019F230();
- func_80151938(play, 0x2216);
+ Audio_PlaySfx_MessageCancel();
+ Message_ContinueTextbox(play, 0x2216);
+ break;
+
+ default:
break;
}
}
break;
+
case TEXT_STATE_5:
if (Message_ShouldAdvance(play)) {
switch (play->msgCtx.currentTextId) {
case 0x220C:
this->unk_2B8 |= 1;
if (!func_8096933C(ENJS_GET_TYPE(&this->actor))) {
- func_80151938(play, 0x220F);
- break;
+ Message_ContinueTextbox(play, 0x220F);
+ } else {
+ Message_ContinueTextbox(play, 0x220D);
}
- func_80151938(play, 0x220D);
break;
+
case 0x220D:
case 0x2213:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
+
case 0x220E:
- func_80151938(play, 0xFF);
+ Message_ContinueTextbox(play, 0xFF);
this->actionFunc = func_80969748;
break;
+
case 0x2210:
case 0x2211:
case 0x2212:
- player->exchangeItemId = PLAYER_IA_NONE;
- func_80151938(play, 0xFF);
+ player->exchangeItemAction = PLAYER_IA_NONE;
+ Message_ContinueTextbox(play, 0xFF);
this->actionFunc = func_80969748;
break;
+
case 0x2214:
case 0x2217:
if (!func_809695FC(this, play)) {
func_80969494(this, play);
- break;
}
break;
+
default:
func_80969494(this, play);
break;
}
}
break;
+
+ default:
+ break;
}
}
void func_80969AA0(EnJs* this, PlayState* play) {
u16 textId;
- if (gSaveContext.save.playerForm != PLAYER_FORM_HUMAN) {
+ if (GET_PLAYER_FORM != PLAYER_FORM_HUMAN) {
textId = 0x220B;
} else {
textId = 0x2215;
@@ -667,11 +688,11 @@ void func_80969B5C(EnJs* this, PlayState* play) {
}
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actionFunc = func_80969898;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->unk_2B4 = 0.0f;
func_80969AA0(this, play);
} else if ((this->actor.xzDistToPlayer < 100.0f) && Player_IsFacingActor(&this->actor, 0x3000, play)) {
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
}
func_80968CB8(this);
}
@@ -691,8 +712,8 @@ void func_80969C54(EnJs* this, PlayState* play) {
}
if (itemAction > PLAYER_IA_NONE) {
- func_801477B4(play);
- if ((itemAction >= PLAYER_IA_MASK_TRUTH) && (itemAction <= PLAYER_IA_MASK_GIANT)) {
+ Message_CloseTextbox(play);
+ 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 +721,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;
@@ -708,7 +729,7 @@ void func_80969C54(EnJs* this, PlayState* play) {
}
if (itemAction <= PLAYER_IA_MINUS1) {
- func_80151938(play, 0x221E);
+ Message_ContinueTextbox(play, 0x221E);
}
}
}
@@ -726,15 +747,18 @@ void func_80969DA4(EnJs* this, PlayState* play) {
((play->msgCtx.currentTextId == 0x2219) || (play->msgCtx.currentTextId == 0x221E))) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
if (!func_809695FC(this, play)) {
func_809694E8(this, play);
- break;
}
break;
+
case 1:
- func_8019F230();
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Audio_PlaySfx_MessageCancel();
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
+ break;
+
+ default:
break;
}
}
@@ -744,70 +768,85 @@ void func_80969DA4(EnJs* this, PlayState* play) {
switch (play->msgCtx.currentTextId) {
case 0x221B:
if (!func_8096933C(ENJS_GET_TYPE(&this->actor))) {
- func_80151938(play, 0x2219);
- break;
+ Message_ContinueTextbox(play, 0x2219);
+ } else {
+ Message_ContinueTextbox(play, 0x221C);
}
- func_80151938(play, 0x221C);
break;
+
case 0x2224:
case 0x2226:
case 0x2228:
case 0x222A:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
+
case 0x2225:
case 0x2227:
case 0x2229:
case 0x222B:
if (!func_809695FC(this, play)) {
func_809694E8(this, play);
- break;
}
break;
+
case 0x2222:
- player->exchangeItemId = PLAYER_IA_NONE;
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ player->exchangeItemAction = PLAYER_IA_NONE;
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
+
case 0x2223:
switch (ENJS_GET_TYPE(&this->actor)) {
case 5:
- func_80151938(play, 0x2224);
+ Message_ContinueTextbox(play, 0x2224);
break;
+
case 6:
- func_80151938(play, 0x2226);
+ Message_ContinueTextbox(play, 0x2226);
break;
+
case 7:
- func_80151938(play, 0x2228);
+ Message_ContinueTextbox(play, 0x2228);
break;
+
case 8:
- func_80151938(play, 0x222A);
+ Message_ContinueTextbox(play, 0x222A);
+ break;
+
+ default:
break;
}
break;
+
case 0x221C:
- func_80151938(play, 0xFF);
+ Message_ContinueTextbox(play, 0xFF);
this->actionFunc = func_80969C54;
break;
+
case 0x221D:
case 0x2220:
case 0x2221:
- player->exchangeItemId = PLAYER_IA_NONE;
- func_80151938(play, 0xFF);
+ player->exchangeItemAction = PLAYER_IA_NONE;
+ Message_ContinueTextbox(play, 0xFF);
this->actionFunc = func_80969C54;
break;
+
default:
func_809694E8(this, play);
break;
}
}
break;
+
+ default:
+ break;
}
}
void func_8096A080(EnJs* this, PlayState* play) {
u16 textId;
- if (gSaveContext.save.playerForm != PLAYER_FORM_HUMAN) {
+ if (GET_PLAYER_FORM != PLAYER_FORM_HUMAN) {
textId = 0x2218;
} else {
textId = 0x221B;
@@ -830,14 +869,14 @@ void func_8096A104(EnJs* this, PlayState* play) {
this->actionFunc = func_80969DA4;
func_8096A080(this, play);
} else if (func_80968DD0(this, play)) {
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
}
}
void func_8096A184(EnJs* this, PlayState* play) {
u16 textId;
- if (gSaveContext.save.playerForm != PLAYER_FORM_HUMAN) {
+ if (GET_PLAYER_FORM != PLAYER_FORM_HUMAN) {
textId = 0x220B;
} else if (func_80968E38(0) >= 20) {
textId = 0x2202;
@@ -858,7 +897,7 @@ void func_8096A1E8(EnJs* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_84_20);
func_809696EC(this, 0);
} else {
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
}
}
@@ -870,9 +909,9 @@ void func_8096A2C0(EnJs* this, PlayState* play) {
this->actor.parent = NULL;
this->actor.flags |= ACTOR_FLAG_10000;
this->actionFunc = func_8096A1E8;
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
} else {
- Actor_PickUp(&this->actor, play, GI_MASK_FIERCE_DEITY, 10000.0f, 1000.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_MASK_FIERCE_DEITY, 10000.0f, 1000.0f);
}
}
@@ -886,11 +925,14 @@ void func_8096A38C(EnJs* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
break;
case 1:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
+ break;
+
+ default:
break;
}
@@ -898,12 +940,16 @@ void func_8096A38C(EnJs* this, PlayState* play) {
case 0x21FC:
switch (play->msgCtx.choiceIndex) {
case 0:
- func_80151938(play, 0x21FE);
+ Message_ContinueTextbox(play, 0x21FE);
Animation_MorphToPlayOnce(&this->skelAnime, &gMoonChildGettingUpAnim, -5.0f);
this->unk_2B8 |= 0x10;
break;
+
case 1:
- func_80151938(play, 0x21FD);
+ Message_ContinueTextbox(play, 0x21FD);
+ break;
+
+ default:
break;
}
break;
@@ -911,11 +957,15 @@ void func_8096A38C(EnJs* this, PlayState* play) {
case 0x21FE:
switch (play->msgCtx.choiceIndex) {
case 0:
- func_80151938(play, 0x2200);
+ Message_ContinueTextbox(play, 0x2200);
func_809696EC(this, 0);
break;
+
case 1:
- func_80151938(play, 0x21FF);
+ Message_ContinueTextbox(play, 0x21FF);
+ break;
+
+ default:
break;
}
break;
@@ -923,17 +973,25 @@ void func_8096A38C(EnJs* this, PlayState* play) {
case 0x2203:
switch (play->msgCtx.choiceIndex) {
case 0:
- func_80151938(play, 0x2205);
+ Message_ContinueTextbox(play, 0x2205);
Animation_MorphToPlayOnce(&this->skelAnime, &gMoonChildGettingUpAnim, -5.0f);
this->unk_2B8 |= 0x10;
break;
+
case 1:
- func_80151938(play, 0x2204);
+ Message_ContinueTextbox(play, 0x2204);
+ break;
+
+ default:
break;
}
+
+ default:
+ break;
}
}
break;
+
case TEXT_STATE_5:
if (Message_ShouldAdvance(play)) {
switch (play->msgCtx.currentTextId) {
@@ -941,28 +999,27 @@ void func_8096A38C(EnJs* this, PlayState* play) {
case 0x2205:
case 0x2206:
case 0x2209:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x2200:
case 0x2208:
func_809696EC(this, 1);
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x2207:
if (INV_CONTENT(ITEM_MASK_FIERCE_DEITY) == ITEM_MASK_FIERCE_DEITY) {
- func_80151938(play, 0x2208);
+ Message_ContinueTextbox(play, 0x2208);
func_809696EC(this, 0);
} else {
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_8096A2C0;
func_8096A2C0(this, play);
}
break;
case 0x2201:
-
case 0x220A:
if (!func_809695FC(this, play)) {
func_80969530(this, play);
@@ -975,6 +1032,9 @@ void func_8096A38C(EnJs* this, PlayState* play) {
}
}
break;
+
+ default:
+ break;
}
}
@@ -1003,7 +1063,7 @@ void func_8096A6F4(EnJs* this, PlayState* play) {
}
if (!(this->unk_2B8 & 8) && (this->actor.xzDistToPlayer < 100.0f) &&
Player_IsFacingActor(&this->actor, 0x3000, play) && Actor_IsFacingPlayer(&this->actor, 0x1000)) {
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
}
}
@@ -1015,18 +1075,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 +1118,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_Jso/z_en_jso.c b/src/overlays/actors/ovl_En_Jso/z_en_jso.c
index f36629d27..43a27759f 100644
--- a/src/overlays/actors/ovl_En_Jso/z_en_jso.c
+++ b/src/overlays/actors/ovl_En_Jso/z_en_jso.c
@@ -6,7 +6,7 @@
#include "z_en_jso.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnJso*)thisx)
diff --git a/src/overlays/actors/ovl_En_Jso2/z_en_jso2.c b/src/overlays/actors/ovl_En_Jso2/z_en_jso2.c
index b7ad94d93..b9bdbe6b9 100644
--- a/src/overlays/actors/ovl_En_Jso2/z_en_jso2.c
+++ b/src/overlays/actors/ovl_En_Jso2/z_en_jso2.c
@@ -6,7 +6,9 @@
#include "z_en_jso2.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_100000 | ACTOR_FLAG_80000000)
+#define FLAGS \
+ (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_100000 | \
+ ACTOR_FLAG_80000000)
#define THIS ((EnJso2*)thisx)
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 70ca7313a..abba3efac 100644
--- a/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.c
+++ b/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.c
@@ -5,8 +5,9 @@
*/
#include "z_en_kaizoku.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_100000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_100000)
#define THIS ((EnKaizoku*)thisx)
@@ -252,13 +253,13 @@ void EnKaizoku_Init(Actor* thisx, PlayState* play) {
EffectBlureInit1 blureInit;
this->picto.actor.hintId = TATL_HINT_ID_PIRATE;
- this->picto.actor.targetMode = 3;
+ this->picto.actor.targetMode = TARGET_MODE_3;
this->picto.actor.colChkInfo.mass = 80;
ActorShape_Init(&this->picto.actor.shape, 0.0f, ActorShadow_DrawFeet, 0.0f);
this->unk_2CA = this->picto.actor.world.rot.z;
this->picto.actor.colChkInfo.health = 8;
this->exitIndex = KAIZOKU_GET_EXIT_INDEX(&this->picto.actor);
- this->switchFlag = KAIZOKU_GET_SWITCHFLAG(&this->picto.actor);
+ this->switchFlag = KAIZOKU_GET_SWITCH_FLAG(&this->picto.actor);
if (this->unk_2CA >= 2) {
this->unk_2CA = 0;
@@ -284,8 +285,8 @@ void EnKaizoku_Init(Actor* thisx, PlayState* play) {
blureInit.calcMode = 2;
Effect_Add(play, &this->blureIndex, EFFECT_BLURE1, 0, 0, &blureInit);
Actor_SetScale(&this->picto.actor, 0.0125f);
- this->picto.actor.flags |= ACTOR_FLAG_8000000;
- this->picto.actor.flags &= ~ACTOR_FLAG_1;
+ this->picto.actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ this->picto.actor.flags &= ~ACTOR_FLAG_TARGETABLE;
if (this->switchFlag == 127) {
this->switchFlag = -1;
}
@@ -298,7 +299,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 +322,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) {
@@ -371,7 +372,7 @@ s32 func_80B85A00(EnKaizoku* this, PlayState* play, s16 arg2) {
}
} else if (func_800BE184(play, &this->picto.actor, 100.0f, 0x5DC0, 0x2AA8, this->picto.actor.shape.rot.y)) {
this->picto.actor.shape.rot.y = this->picto.actor.world.rot.y = this->picto.actor.yawTowardsPlayer;
- if ((this->picto.actor.bgCheckFlags & 8) && (ABS_ALT(sp32) < 0x2EE0) &&
+ if ((this->picto.actor.bgCheckFlags & BGCHECKFLAG_WALL) && (ABS_ALT(sp32) < 0x2EE0) &&
(this->picto.actor.xzDistToPlayer < 90.0f)) {
if (this->action != KAIZOKU_ACTION_6) {
func_80B87C7C(this);
@@ -393,9 +394,10 @@ s32 func_80B85A00(EnKaizoku* this, PlayState* play, s16 arg2) {
if (explosiveActor != NULL) {
this->picto.actor.shape.rot.y = this->picto.actor.world.rot.y = this->picto.actor.yawTowardsPlayer;
- if (((this->picto.actor.bgCheckFlags & 8) && (sp32 < 0x2EE0)) || (explosiveActor->id == ACTOR_EN_BOM_CHU)) {
+ if (((this->picto.actor.bgCheckFlags & BGCHECKFLAG_WALL) && (sp32 < 0x2EE0)) ||
+ (explosiveActor->id == ACTOR_EN_BOM_CHU)) {
if ((explosiveActor->id == ACTOR_EN_BOM_CHU) &&
- (Actor_DistanceBetweenActors(&this->picto.actor, explosiveActor) < 80.0f) &&
+ (Actor_WorldDistXYZToActor(&this->picto.actor, explosiveActor) < 80.0f) &&
(BINANG_ADD(this->picto.actor.shape.rot.y - explosiveActor->world.rot.y, 0x8000) < 0x4000)) {
if (this->action != KAIZOKU_ACTION_6) {
func_80B87C7C(this);
@@ -422,8 +424,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;
@@ -440,8 +442,8 @@ s32 func_80B85A00(EnKaizoku* this, PlayState* play, s16 arg2) {
void EnKaizoku_ChangeAnim(EnKaizoku* this, EnKaizokuAnimation animIndex) {
this->animIndex = animIndex;
- this->frameCount = Animation_GetLastFrame(sAnimations[this->animIndex]);
- Animation_Change(&this->skelAnime, sAnimations[this->animIndex], 1.0f, 0.0f, this->frameCount,
+ this->animEndFrame = Animation_GetLastFrame(sAnimations[this->animIndex]);
+ Animation_Change(&this->skelAnime, sAnimations[this->animIndex], 1.0f, 0.0f, this->animEndFrame,
sAnimationModes[this->animIndex], 0.0f);
}
@@ -473,14 +475,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);
- func_800B7298(play, &this->picto.actor, 0x15);
- this->subCamId = ActorCutscene_GetCurrentSubCamId(this->picto.actor.cutscene);
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->picto.actor);
+ func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_21);
+ 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;
@@ -492,12 +494,12 @@ void func_80B85FA8(EnKaizoku* this, PlayState* play) {
player->actor.world.pos.z = this->picto.actor.home.pos.z - 30.0f;
}
- player->actor.speedXZ = 0.0f;
+ player->actor.speed = 0.0f;
this->picto.actor.world.pos.x = this->picto.actor.home.pos.x;
this->picto.actor.world.pos.z = this->picto.actor.home.pos.z;
Message_StartTextbox(play, D_80B8A8D0[sp54], &this->picto.actor);
this->unk_2C8++;
- this->picto.actor.flags &= ~ACTOR_FLAG_1;
+ this->picto.actor.flags &= ~ACTOR_FLAG_TARGETABLE;
player->actor.shape.rot.y = player->actor.world.rot.y =
Math_Vec3f_Yaw(&player->actor.world.pos, &this->picto.actor.world.pos);
Math_Vec3f_Copy(&this->subCamEye, &this->unk_5C8);
@@ -505,9 +507,9 @@ void func_80B85FA8(EnKaizoku* this, PlayState* play) {
this->subCamUp.x = -0.11f;
this->picto.actor.draw = EnKaizoku_Draw;
this->unk_598 = 0;
- func_801A0238(0, 0xA);
+ 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);
@@ -522,7 +524,7 @@ void func_80B85FA8(EnKaizoku* this, PlayState* play) {
}
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
EnKaizoku_ChangeAnim(this, EN_KAIZOKU_ANIM_11);
this->unk_598 = 0;
this->unk_59C++;
@@ -531,15 +533,15 @@ void func_80B85FA8(EnKaizoku* this, PlayState* play) {
break;
case 2:
- if (this->picto.actor.bgCheckFlags & 1) {
+ if (this->picto.actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
if (this->unk_2D8 != 0) {
this->unk_2D8 = 0;
this->picto.actor.world.pos.y = this->picto.actor.floorHeight;
this->picto.actor.velocity.y = 0.0f;
- func_800B7298(play, &this->picto.actor, 4);
+ func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_4);
Actor_SpawnFloorDustRing(play, &this->picto.actor, &this->leftFootPos, 3.0f, 2, 2.0f, 0, 0, 0);
Actor_SpawnFloorDustRing(play, &this->picto.actor, &this->rightFootPos, 3.0f, 2, 2.0f, 0, 0, 0);
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_PIRATE_ONGND);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_PIRATE_ONGND);
}
if (curFrame >= 11.0f) {
@@ -551,7 +553,7 @@ void func_80B85FA8(EnKaizoku* this, PlayState* play) {
break;
case 3:
- if (this->frameCount <= curFrame) {
+ if (curFrame >= this->animEndFrame) {
sp54 = this->unk_2CA * 4 + this->unk_2C8;
if (Player_GetMask(play) == PLAYER_MASK_STONE) {
if (D_80B8A8D0[sp54] == 0x11A5) {
@@ -571,10 +573,10 @@ void func_80B85FA8(EnKaizoku* this, PlayState* play) {
case 4:
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->unk_598 = 0;
this->unk_59C++;
- func_801A0238(0x7F, 0);
+ Audio_SetMainBgmVolume(0x7F, 0);
Audio_PlayBgm_StorePrevBgm(NA_BGM_MINI_BOSS);
EnKaizoku_ChangeAnim(this, EN_KAIZOKU_ANIM_13);
}
@@ -583,7 +585,7 @@ void func_80B85FA8(EnKaizoku* this, PlayState* play) {
case 5:
Math_ApproachF(&this->unk_5E0, 2.0f, 0.2f, 1.0f);
if (Animation_OnFrame(&this->skelAnime, 20.0f)) {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_BOSU_SWORD);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_BOSU_SWORD);
}
if (curFrame >= 30.0f) {
this->unk_598 = 0;
@@ -593,7 +595,7 @@ void func_80B85FA8(EnKaizoku* this, PlayState* play) {
case 6:
Math_ApproachF(&this->unk_5E0, 5.0f, 0.3f, 1.0f);
- if (this->frameCount <= curFrame) {
+ if (curFrame >= this->animEndFrame) {
this->unk_598 = 7;
this->unk_2F8.x = 1.0f;
this->unk_59C++;
@@ -607,13 +609,13 @@ 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);
+ func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_END);
+ 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_8000000;
- this->picto.actor.flags |= ACTOR_FLAG_1;
+ this->picto.actor.flags &= ~ACTOR_FLAG_CANT_LOCK_ON;
+ this->picto.actor.flags |= ACTOR_FLAG_TARGETABLE;
func_80B872A4(this);
}
break;
@@ -656,7 +658,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);
@@ -664,24 +666,24 @@ 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);
+ func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_96);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(this->picto.actor.csId);
this->unk_2B2 = 30;
- this->picto.actor.flags &= ~ACTOR_FLAG_1;
+ this->picto.actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->unk_598 = 0;
this->unk_59C = 0;
this->unk_2D8 = 0;
this->action = KAIZOKU_ACTION_0;
this->actionFunc = func_80B868B8;
- this->picto.actor.speedXZ = 0.0f;
+ this->picto.actor.speed = 0.0f;
}
void func_80B868B8(EnKaizoku* this, PlayState* play) {
@@ -698,7 +700,7 @@ void func_80B868B8(EnKaizoku* this, PlayState* play) {
switch (this->unk_59C) {
case 0:
- if (this->frameCount <= curFrame) {
+ if (curFrame >= this->animEndFrame) {
EnKaizoku_ChangeAnim(this, EN_KAIZOKU_ANIM_14);
this->unk_2C8 = 3;
this->unk_598 = 0;
@@ -707,13 +709,13 @@ void func_80B868B8(EnKaizoku* this, PlayState* play) {
break;
case 1:
- if (this->frameCount <= curFrame) {
+ if (curFrame >= this->animEndFrame) {
s32 textId;
EnKaizoku_ChangeAnim(this, EN_KAIZOKU_ANIM_15);
textId = this->unk_2CA * 4 + this->unk_2C8;
Message_StartTextbox(play, D_80B8A8D0[textId], &this->picto.actor);
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_LAST2_SHOUT);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_LAST2_SHOUT);
this->unk_598 = 0;
this->unk_59C++;
}
@@ -721,10 +723,10 @@ void func_80B868B8(EnKaizoku* this, PlayState* play) {
case 2:
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
- func_800B7298(play, &this->picto.actor, 6);
- ActorCutscene_Stop(this->unk_2D6);
- this->subCamId = 0;
+ Message_CloseTextbox(play);
+ func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_END);
+ CutsceneManager_Stop(this->csId);
+ this->subCamId = SUB_CAM_ID_DONE;
play->nextEntrance = play->setupExitList[this->exitIndex];
gSaveContext.nextCutsceneIndex = 0;
Scene_SetExitFade(play);
@@ -732,11 +734,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;
@@ -783,19 +787,19 @@ void func_80B86B74(EnKaizoku* this, PlayState* play) {
break;
case 1:
- if (this->frameCount <= curFrame) {
+ if (curFrame >= this->animEndFrame) {
if (this->unk_2D9 == 0) {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_PIRATE_DAMM_BREATH);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_PIRATE_DAMM_BREATH);
this->unk_2D9 = 1;
} else {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_PIRATE_BREATH);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_PIRATE_BREATH);
}
}
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
EnKaizoku_ChangeAnim(this, EN_KAIZOKU_ANIM_18);
- func_800B7298(play, &this->picto.actor, 0x85);
+ func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_133);
this->unk_5A0 = 0;
this->unk_598 = 0;
this->unk_59C++;
@@ -820,7 +824,7 @@ void func_80B86B74(EnKaizoku* this, PlayState* play) {
if (this->unk_5A0 == 0x12) {
Actor* temp_v0_2;
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_PIRATE_SHOUT);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_PIRATE_SHOUT);
temp_v0_2 = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ARROW, this->picto.actor.world.pos.x,
this->picto.actor.world.pos.y + 10.0f, this->picto.actor.world.pos.z,
this->picto.actor.shape.rot.x, this->picto.actor.shape.rot.y,
@@ -839,7 +843,7 @@ void func_80B86B74(EnKaizoku* this, PlayState* play) {
255;
}
- if ((this->frameCount <= curFrame) && (this->unk_5A0 >= 0x28)) {
+ if ((curFrame >= this->animEndFrame) && (this->unk_5A0 >= 0x28)) {
this->picto.actor.draw = NULL;
this->unk_598 = 10;
Math_Vec3f_Copy(&this->unk_2F8, &gZeroVec3f);
@@ -860,9 +864,9 @@ void func_80B86B74(EnKaizoku* this, PlayState* play) {
play->envCtx.screenFillColor[3] = 0;
play->envCtx.fillScreen = false;
this->unk_59C = 0;
- this->subCamId = 0;
- func_800B7298(play, &this->picto.actor, 6);
- ActorCutscene_Stop(this->unk_2D6);
+ this->subCamId = SUB_CAM_ID_DONE;
+ func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_END);
+ CutsceneManager_Stop(this->csId);
if (this->switchFlag >= 0) {
Flags_SetSwitch(play, this->switchFlag);
}
@@ -870,6 +874,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);
@@ -879,7 +886,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;
@@ -888,7 +895,7 @@ void func_80B86B74(EnKaizoku* this, PlayState* play) {
}
void func_80B872A4(EnKaizoku* this) {
- this->picto.actor.speedXZ = 0.0f;
+ this->picto.actor.speed = 0.0f;
EnKaizoku_ChangeAnim(this, EN_KAIZOKU_ANIM_0);
this->action = KAIZOKU_ACTION_1;
this->actionFunc = func_80B872F4;
@@ -901,7 +908,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)) {
@@ -928,13 +936,13 @@ void func_80B874D8(EnKaizoku* this, PlayState* play) {
EnKaizoku_ChangeAnim(this, EN_KAIZOKU_ANIM_3);
if (Math_SinS(player->actor.shape.rot.y - this->picto.actor.shape.rot.y) > 0.0f) {
- this->picto.actor.speedXZ = -10.0f;
+ this->picto.actor.speed = -10.0f;
} else if (Math_SinS(player->actor.shape.rot.y - this->picto.actor.shape.rot.y) < 0.0f) {
- this->picto.actor.speedXZ = 10.0f;
+ this->picto.actor.speed = 10.0f;
} else if (Rand_ZeroOne() > 0.5f) {
- this->picto.actor.speedXZ = 10.0f;
+ this->picto.actor.speed = 10.0f;
} else {
- this->picto.actor.speedXZ = -10.0f;
+ this->picto.actor.speed = -10.0f;
}
this->skelAnime.playSpeed = 1.0f;
@@ -951,18 +959,18 @@ void func_80B8760C(EnKaizoku* this, PlayState* play) {
s32 temp_ft1;
this->picto.actor.world.rot.y = this->picto.actor.yawTowardsPlayer + 0x3A98;
- if ((this->picto.actor.bgCheckFlags & 8) ||
- !Actor_TestFloorInDirection(&this->picto.actor, play, this->picto.actor.speedXZ,
+ if ((this->picto.actor.bgCheckFlags & BGCHECKFLAG_WALL) ||
+ !Actor_TestFloorInDirection(&this->picto.actor, play, this->picto.actor.speed,
this->picto.actor.shape.rot.y + 0x4000)) {
- if (this->picto.actor.bgCheckFlags & 8) {
- if (this->picto.actor.speedXZ >= 0.0f) {
+ if (this->picto.actor.bgCheckFlags & BGCHECKFLAG_WALL) {
+ if (this->picto.actor.speed >= 0.0f) {
var_v0 = this->picto.actor.shape.rot.y + 0x4000;
} else {
var_v0 = this->picto.actor.shape.rot.y - 0x4000;
}
var_v0 = this->picto.actor.wallYaw - var_v0;
} else {
- this->picto.actor.speedXZ *= -0.8f;
+ this->picto.actor.speed *= -0.8f;
var_v0 = 0;
}
@@ -988,12 +996,13 @@ 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))) {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_GERUDOFT_WALK);
+ 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);
}
if (!(play->gameplayFrames & 0x5F)) {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_PIRATE_BREATH);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_PIRATE_BREATH);
}
if (this->unk_2B2 == 0) {
@@ -1005,12 +1014,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.speedXZ >= 0.0f) {
- this->picto.actor.shape.rot.y += 0x4000;
- } else {
- this->picto.actor.shape.rot.y -= 0x4000;
- }
+ this->picto.actor.shape.rot.y -= 0x4000;
}
}
@@ -1021,7 +1028,7 @@ void func_80B87900(EnKaizoku* this) {
this->swordState = -1;
}
this->unk_2D8 = 0;
- this->picto.actor.speedXZ = 0.0f;
+ this->picto.actor.speed = 0.0f;
this->unk_2B2 = Rand_S16Offset(10, 10);
this->bodyCollider.base.acFlags |= AC_HARD;
this->lookTimer = 12;
@@ -1040,8 +1047,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;
@@ -1066,7 +1073,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;
@@ -1089,9 +1096,9 @@ void func_80B8798C(EnKaizoku* this, PlayState* play) {
void func_80B87C7C(EnKaizoku* this) {
EnKaizoku_ChangeAnim(this, EN_KAIZOKU_ANIM_8);
- this->picto.actor.speedXZ = 6.5f;
+ this->picto.actor.speed = 6.5f;
this->picto.actor.velocity.y = 15.0f;
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_TEKU_JUMP);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_TEKU_JUMP);
this->picto.actor.world.rot.y = this->picto.actor.shape.rot.y;
this->bodyCollider.info.elemType = ELEMTYPE_UNK4;
this->bodyCollider.base.colType = COLTYPE_NONE;
@@ -1120,13 +1127,14 @@ void func_80B87D3C(EnKaizoku* this, PlayState* play) {
}
this->unk_2D8 = 0;
- if ((this->frameCount <= curFrame) && (this->picto.actor.bgCheckFlags & 3)) {
+ if ((curFrame >= this->animEndFrame) &&
+ (this->picto.actor.bgCheckFlags & (BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH))) {
this->bodyCollider.info.elemType = ELEMTYPE_UNK1;
this->bodyCollider.base.colType = COLTYPE_HIT3;
this->swordCollider.info.elemType = ELEMTYPE_UNK2;
this->picto.actor.shape.rot.x = 0;
this->picto.actor.world.rot.y = this->picto.actor.shape.rot.y = this->picto.actor.yawTowardsPlayer;
- this->picto.actor.speedXZ = 0.0f;
+ this->picto.actor.speed = 0.0f;
this->picto.actor.velocity.y = 0.0f;
this->picto.actor.world.pos.y = this->picto.actor.floorHeight;
func_80B87F70(this);
@@ -1135,8 +1143,8 @@ void func_80B87D3C(EnKaizoku* this, PlayState* play) {
void func_80B87E28(EnKaizoku* this) {
EnKaizoku_ChangeAnim(this, EN_KAIZOKU_ANIM_8);
- this->picto.actor.speedXZ = -8.0f;
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_TEKU_JUMP);
+ this->picto.actor.speed = -8.0f;
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_TEKU_JUMP);
this->bodyCollider.info.elemType = ELEMTYPE_UNK4;
this->bodyCollider.base.colType = COLTYPE_NONE;
this->swordCollider.info.elemType = ELEMTYPE_UNK4;
@@ -1149,7 +1157,7 @@ void func_80B87E9C(EnKaizoku* this, PlayState* play) {
f32 curFrame = this->skelAnime.curFrame;
this->unk_2D8 = 0;
- if (this->frameCount <= curFrame) {
+ if (curFrame >= this->animEndFrame) {
if ((this->picto.actor.xzDistToPlayer < 170.0f) && (this->picto.actor.xzDistToPlayer > 140.0f) &&
(Rand_ZeroOne() < 0.2f)) {
func_80B88910(this);
@@ -1158,7 +1166,7 @@ void func_80B87E9C(EnKaizoku* this, PlayState* play) {
}
}
if (!(play->state.frames & 0x5F)) {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_PIRATE_BREATH);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_PIRATE_BREATH);
}
}
@@ -1166,7 +1174,7 @@ void func_80B87F70(EnKaizoku* this) {
EnKaizoku_ChangeAnim(this, EN_KAIZOKU_ANIM_9);
this->unk_2D0 = 0;
this->swordCollider.base.atFlags &= ~AT_BOUNCED;
- this->picto.actor.speedXZ = 0.0f;
+ this->picto.actor.speed = 0.0f;
AudioSfx_StopByPosAndId(&this->picto.actor.projectedPos, NA_SE_EN_PIRATE_BREATH);
this->action = KAIZOKU_ACTION_9;
this->actionFunc = func_80B87FDC;
@@ -1182,10 +1190,10 @@ void func_80B87FDC(EnKaizoku* this, PlayState* play2) {
curFrame = this->skelAnime.curFrame;
sp2E = ABS_ALT(player->actor.shape.rot.y - this->picto.actor.shape.rot.y);
sp2C = ABS_ALT(this->picto.actor.yawTowardsPlayer - this->picto.actor.shape.rot.y);
- this->picto.actor.speedXZ = 0.0f;
+ this->picto.actor.speed = 0.0f;
if (Animation_OnFrame(&this->skelAnime, 1.0f)) {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_PIRATE_ATTACK);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_PIRATE_ATTACK);
this->swordState = 1;
} else if (Animation_OnFrame(&this->skelAnime, 6.0f)) {
this->swordState = -1;
@@ -1199,7 +1207,7 @@ void func_80B87FDC(EnKaizoku* this, PlayState* play2) {
}
this->unk_2D8 = 0;
- if (this->frameCount <= curFrame) {
+ if (curFrame >= this->animEndFrame) {
if (!Actor_IsFacingPlayer(&this->picto.actor, 0x1554)) {
func_80B872A4(this);
@@ -1233,9 +1241,9 @@ void func_80B87FDC(EnKaizoku* this, PlayState* play2) {
void func_80B88214(EnKaizoku* this) {
EnKaizoku_ChangeAnim(this, EN_KAIZOKU_ANIM_8);
this->unk_2B2 = 0;
- this->picto.actor.speedXZ = 10.0f;
+ this->picto.actor.speed = 10.0f;
this->picto.actor.world.rot.y = this->picto.actor.shape.rot.y = this->picto.actor.yawTowardsPlayer;
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_TEKU_JUMP);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_TEKU_JUMP);
this->action = KAIZOKU_ACTION_5;
this->actionFunc = func_80B88278;
}
@@ -1244,8 +1252,8 @@ void func_80B88278(EnKaizoku* this, PlayState* play) {
f32 curFrame = this->skelAnime.curFrame;
this->unk_2D8 = 0;
- if (this->frameCount <= curFrame) {
- this->picto.actor.speedXZ = 0.0f;
+ if (curFrame >= this->animEndFrame) {
+ this->picto.actor.speed = 0.0f;
if (!Actor_IsFacingPlayer(&this->picto.actor, 0x1554)) {
func_80B872A4(this);
this->unk_2B2 = Rand_ZeroOne() * 5.0f + 5.0f;
@@ -1254,7 +1262,7 @@ void func_80B88278(EnKaizoku* this, PlayState* play) {
}
}
if (!(play->gameplayFrames & 0x5F)) {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_PIRATE_BREATH);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_PIRATE_BREATH);
}
}
@@ -1274,16 +1282,17 @@ void func_80B88378(EnKaizoku* this, PlayState* play) {
Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->picto.actor.yawTowardsPlayer, 1, 0x2EE, 0);
this->picto.actor.world.rot.y = this->picto.actor.shape.rot.y;
if (this->picto.actor.xzDistToPlayer <= 40.0f) {
- Math_ApproachF(&this->picto.actor.speedXZ, -8.0f, 1.0f, 1.5f);
+ Math_ApproachF(&this->picto.actor.speed, -8.0f, 1.0f, 1.5f);
} else if (this->picto.actor.xzDistToPlayer > 55.0f) {
- Math_ApproachF(&this->picto.actor.speedXZ, 8.0f, 1.0f, 1.5f);
+ Math_ApproachF(&this->picto.actor.speed, 8.0f, 1.0f, 1.5f);
} else {
- Math_ApproachZeroF(&this->picto.actor.speedXZ, 2.0f, 6.65f);
+ Math_ApproachZeroF(&this->picto.actor.speed, 2.0f, 6.65f);
}
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);
@@ -1310,7 +1319,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) {
@@ -1325,11 +1334,11 @@ void func_80B88378(EnKaizoku* this, PlayState* play) {
}
if (!(play->gameplayFrames & 0x5F)) {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_PIRATE_BREATH);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_PIRATE_BREATH);
}
- if ((this->skelAnime.curFrame != 0.0f) && ((sp30 < 0 && sp2C > 0) || (sp30 < 4 && sp2C >= 5))) {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_GERUDOFT_WALK);
+ if ((this->skelAnime.curFrame != 0.0f) && (((sp30 < 0) && (sp2C > 0)) || ((sp30 < 4) && (sp2C >= 5)))) {
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_GERUDOFT_WALK);
}
}
}
@@ -1364,7 +1373,7 @@ void func_80B887AC(EnKaizoku* this, PlayState* play) {
}
}
if (!(play->gameplayFrames & 0x5F)) {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_PIRATE_BREATH);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_PIRATE_BREATH);
}
}
}
@@ -1375,7 +1384,7 @@ void func_80B88910(EnKaizoku* this) {
this->unk_2D0 = 0;
this->action = KAIZOKU_ACTION_11;
this->actionFunc = func_80B88964;
- this->picto.actor.speedXZ = 0.0f;
+ this->picto.actor.speed = 0.0f;
}
void func_80B88964(EnKaizoku* this, PlayState* play) {
@@ -1395,22 +1404,20 @@ void func_80B88964(EnKaizoku* this, PlayState* play) {
if (this->skelAnime.curFrame <= 8.0f) {
this->picto.actor.shape.rot.y = this->picto.actor.world.rot.y = this->picto.actor.yawTowardsPlayer;
- } else {
- if (Animation_OnFrame(&this->skelAnime, 13.0f)) {
- Actor_SpawnFloorDustRing(play, &this->picto.actor, &this->leftFootPos, 3.0f, 2, 2.0f, 0, 0, 0);
- Actor_SpawnFloorDustRing(play, &this->picto.actor, &this->rightFootPos, 3.0f, 2, 2.0f, 0, 0, 0);
- this->swordState = 1;
- this->picto.actor.speedXZ = 10.0f;
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_PIRATE_ATTACK);
- } else if (Animation_OnFrame(&this->skelAnime, 21.0f)) {
- this->picto.actor.speedXZ = 0.0f;
- } else if (Animation_OnFrame(&this->skelAnime, 24.0f)) {
- this->swordState = -1;
- }
+ } else if (Animation_OnFrame(&this->skelAnime, 13.0f)) {
+ Actor_SpawnFloorDustRing(play, &this->picto.actor, &this->leftFootPos, 3.0f, 2, 2.0f, 0, 0, 0);
+ Actor_SpawnFloorDustRing(play, &this->picto.actor, &this->rightFootPos, 3.0f, 2, 2.0f, 0, 0, 0);
+ this->swordState = 1;
+ this->picto.actor.speed = 10.0f;
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_PIRATE_ATTACK);
+ } else if (Animation_OnFrame(&this->skelAnime, 21.0f)) {
+ this->picto.actor.speed = 0.0f;
+ } else if (Animation_OnFrame(&this->skelAnime, 24.0f)) {
+ this->swordState = -1;
}
this->unk_2D8 = 0;
- if (this->frameCount <= curFrame && this->unk_2D0 < 2) {
+ if ((curFrame >= this->animEndFrame) && (this->unk_2D0 < 2)) {
if (!Actor_IsFacingPlayer(&this->picto.actor, 0x1554)) {
func_80B872A4(this);
this->unk_2B2 = Rand_ZeroOne() * 5.0f + 5.0f;
@@ -1453,7 +1460,7 @@ void func_80B88964(EnKaizoku* this, PlayState* play) {
void func_80B88CD8(EnKaizoku* this) {
EnKaizoku_ChangeAnim(this, EN_KAIZOKU_ANIM_3);
- this->picto.actor.speedXZ = 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;
@@ -1474,39 +1481,39 @@ void func_80B88D6C(EnKaizoku* this, PlayState* play) {
this->picto.actor.world.rot.y = this->picto.actor.shape.rot.y + 0x4000;
sp2A = player->actor.shape.rot.y + 0x8000;
if (Math_SinS(sp2A - this->picto.actor.shape.rot.y) >= 0.0f) {
- this->picto.actor.speedXZ -= 0.25f;
- if (this->picto.actor.speedXZ < -8.0f) {
- this->picto.actor.speedXZ = -8.0f;
+ this->picto.actor.speed -= 0.25f;
+ if (this->picto.actor.speed < -8.0f) {
+ this->picto.actor.speed = -8.0f;
}
} else if (Math_SinS((sp2A - this->picto.actor.shape.rot.y)) < 0.0f) {
- this->picto.actor.speedXZ += 0.25f;
- if (this->picto.actor.speedXZ > 8.0f) {
- this->picto.actor.speedXZ = 8.0f;
+ this->picto.actor.speed += 0.25f;
+ if (this->picto.actor.speed > 8.0f) {
+ this->picto.actor.speed = 8.0f;
}
}
- if ((this->picto.actor.bgCheckFlags & 8) ||
- !Actor_TestFloorInDirection(&this->picto.actor, play, this->picto.actor.speedXZ,
+ if ((this->picto.actor.bgCheckFlags & BGCHECKFLAG_WALL) ||
+ !Actor_TestFloorInDirection(&this->picto.actor, play, this->picto.actor.speed,
this->picto.actor.shape.rot.y + 0x4000)) {
- if (this->picto.actor.bgCheckFlags & 8) {
- if (this->picto.actor.speedXZ >= 0.0f) {
+ if (this->picto.actor.bgCheckFlags & BGCHECKFLAG_WALL) {
+ if (this->picto.actor.speed >= 0.0f) {
yaw = this->picto.actor.shape.rot.y + 0x4000;
} else {
yaw = this->picto.actor.shape.rot.y - 0x4000;
}
yaw = this->picto.actor.wallYaw - yaw;
} else {
- this->picto.actor.speedXZ *= -0.8f;
+ this->picto.actor.speed *= -0.8f;
yaw = 0;
}
if (ABS_ALT(yaw) > 0x4000) {
- this->picto.actor.speedXZ *= -0.8f;
- if (this->picto.actor.speedXZ < 0.0f) {
- this->picto.actor.speedXZ -= 0.5f;
+ this->picto.actor.speed *= -0.8f;
+ if (this->picto.actor.speed < 0.0f) {
+ this->picto.actor.speed -= 0.5f;
} else {
- this->picto.actor.speedXZ += 0.5f;
+ this->picto.actor.speed += 0.5f;
}
}
}
@@ -1527,13 +1534,13 @@ 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))) {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_GERUDOFT_WALK);
+ if ((((temp_ft4 < 0) && (temp_ft5 > 0)) || ((temp_ft4 < 5) && (temp_ft5 > 5)))) {
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_GERUDOFT_WALK);
}
}
if (!(play->gameplayFrames & 0x5F)) {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_PIRATE_BREATH);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_PIRATE_BREATH);
}
if (this->picto.actor.xzDistToPlayer <= 65.0f) {
@@ -1550,8 +1557,8 @@ void func_80B88D6C(EnKaizoku* this, PlayState* play) {
// EnKaizoku_SetupStunned
void func_80B891B8(EnKaizoku* this) {
- if (this->picto.actor.bgCheckFlags & 1) {
- this->picto.actor.speedXZ = 0.0f;
+ if (this->picto.actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->picto.actor.speed = 0.0f;
}
if (this->action == KAIZOKU_ACTION_11) {
@@ -1565,7 +1572,7 @@ void func_80B891B8(EnKaizoku* this) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
}
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_COMMON_FREEZE);
this->unk_2D8 = 1;
if ((this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_SFX) &&
@@ -1580,30 +1587,29 @@ 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;
}
}
- if (this->picto.actor.bgCheckFlags & 2) {
- this->picto.actor.speedXZ = 0.0f;
+ if (this->picto.actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
+ this->picto.actor.speed = 0.0f;
}
- if (this->picto.actor.bgCheckFlags & 1) {
- if (this->picto.actor.speedXZ < 0.0f) {
- this->picto.actor.speedXZ += 0.05f;
+ if (this->picto.actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ if (this->picto.actor.speed < 0.0f) {
+ this->picto.actor.speed += 0.05f;
}
}
if ((this->unk_2B6 == 0) && (this->unk_2B8 == 0) && !CHECK_FLAG_ALL(this->picto.actor.flags, ACTOR_FLAG_2000) &&
- (this->picto.actor.bgCheckFlags & 1)) {
+ (this->picto.actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
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) {
- Actor_SpawnIceEffects(play, &this->picto.actor, this->bodyPartsPos, ARRAY_COUNT(this->bodyPartsPos), 2,
- 0.7f, 0.4f);
+ if ((this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX) ||
+ (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) {
+ Actor_SpawnIceEffects(play, &this->picto.actor, this->bodyPartsPos, KAIZOKU_BODYPART_MAX, 2, 0.7f, 0.4f);
this->unk_2B8 = 0;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->picto.actor.flags |= ACTOR_FLAG_400;
@@ -1619,20 +1625,19 @@ void func_80B893CC(EnKaizoku* this, PlayState* play) {
Math_Vec3f_Copy(&this->unk_3C4, &sp34);
this->lookTimer = 0;
this->unk_2D8 = 0;
- this->picto.actor.speedXZ = 0.0f;
+ this->picto.actor.speed = 0.0f;
EnKaizoku_ChangeAnim(this, EN_KAIZOKU_ANIM_5);
if (((this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX) ||
(this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) &&
(this->unk_2B8 != 0)) {
- Actor_SpawnIceEffects(play, &this->picto.actor, this->bodyPartsPos, ARRAY_COUNT(this->bodyPartsPos), 2, 0.7f,
- 0.4f);
+ Actor_SpawnIceEffects(play, &this->picto.actor, this->bodyPartsPos, KAIZOKU_BODYPART_MAX, 2, 0.7f, 0.4f);
this->unk_2B8 = 0;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->picto.actor.flags |= ACTOR_FLAG_400;
}
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_PIRATE_DAMAGE);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_PIRATE_DAMAGE);
this->action = KAIZOKU_ACTION_14;
this->actionFunc = func_80B894C0;
}
@@ -1644,14 +1649,14 @@ void func_80B894C0(EnKaizoku* this, PlayState* play) {
if (!func_80B85858(this, play) && !func_80B85A00(this, play, false) && (this->unk_3C4.x < 1.0f) &&
(this->unk_3C4.z < 1.0f)) {
temp_v0 = this->picto.actor.wallYaw - this->picto.actor.shape.rot.y;
- if (this->picto.actor.bgCheckFlags & 8) {
+ if (this->picto.actor.bgCheckFlags & BGCHECKFLAG_WALL) {
if (ABS_ALT(temp_v0) < 0x3000 && (this->picto.actor.xzDistToPlayer < 90.0f)) {
func_80B87C7C(this);
return;
}
}
- 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 {
@@ -1674,13 +1679,13 @@ void func_80B8960C(EnKaizoku* this, PlayState* play) {
(this->unk_2B8 == 0)) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
}
- this->picto.actor.speedXZ = 0.0f;
+ this->picto.actor.speed = 0.0f;
this->unk_2D8 = 1;
- func_800B7298(play, &this->picto.actor, 0x7B);
+ func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_123);
Enemy_StartFinishingBlow(play, &this->picto.actor);
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_PIRATE_DEAD);
- this->picto.actor.flags |= ACTOR_FLAG_8000000;
- this->picto.actor.flags &= ~ACTOR_FLAG_1;
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_PIRATE_DEAD);
+ this->picto.actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ this->picto.actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->picto.actor.flags &= ~ACTOR_FLAG_400;
this->unk_598 = 0;
this->unk_59C = 0;
@@ -1692,12 +1697,12 @@ void func_80B8971C(EnKaizoku* this, PlayState* play) {
f32 curFrame = this->skelAnime.curFrame;
Player* player;
- if (this->picto.actor.bgCheckFlags & 2) {
- this->picto.actor.speedXZ = 0.0f;
+ if (this->picto.actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
+ this->picto.actor.speed = 0.0f;
}
- if (this->picto.actor.bgCheckFlags & 1) {
- Math_SmoothStepToF(&this->picto.actor.speedXZ, 0.0f, 1.0f, 0.5f, 0.0f);
+ if (this->picto.actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ Math_SmoothStepToF(&this->picto.actor.speed, 0.0f, 1.0f, 0.5f, 0.0f);
}
if ((this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX) ||
@@ -1705,21 +1710,20 @@ void func_80B8971C(EnKaizoku* this, PlayState* play) {
if (this->unk_2B8 == 0) {
return;
}
- Actor_SpawnIceEffects(play, &this->picto.actor, this->bodyPartsPos, ARRAY_COUNT(this->bodyPartsPos), 2, 0.7f,
- 0.4f);
+ Actor_SpawnIceEffects(play, &this->picto.actor, this->bodyPartsPos, KAIZOKU_BODYPART_MAX, 2, 0.7f, 0.4f);
this->unk_2B8 = 0;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
}
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);
@@ -1739,7 +1743,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;
@@ -1749,11 +1753,11 @@ void func_80B8971C(EnKaizoku* this, PlayState* play) {
Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->picto.actor.yawTowardsPlayer, 1, 0xFA0, 1);
SkelAnime_Update(&this->skelAnime);
- if (this->frameCount <= curFrame) {
+ if (curFrame >= this->animEndFrame) {
this->unk_2D8 = 0;
func_80B86B58(this);
} else if (Animation_OnFrame(&this->skelAnime, 10.0f)) {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_GERUDOFT_DOWN);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_GERUDOFT_DOWN);
}
}
@@ -1762,42 +1766,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;
@@ -1809,7 +1813,7 @@ void func_80B89A08(EnKaizoku* this, PlayState* play) {
}
}
- if ((this->picto.actor.bgCheckFlags & 8) && (this->picto.actor.wallBgId != BG_ACTOR_MAX) &&
+ if ((this->picto.actor.bgCheckFlags & BGCHECKFLAG_WALL) && (this->picto.actor.wallBgId != BG_ACTOR_MAX) &&
((this->action == KAIZOKU_ACTION_2) || (this->action == KAIZOKU_ACTION_3) ||
(this->action == KAIZOKU_ACTION_4) || (this->action == KAIZOKU_ACTION_1))) {
func_80B87F70(this);
@@ -1829,12 +1833,13 @@ 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)) ||
this->unk_2B8 == 0) {
- Actor_SetColorFilter(&this->picto.actor, 0, 120, 0, 40);
+ Actor_SetColorFilter(&this->picto.actor, COLORFILTER_COLORFLAG_BLUE, 120, COLORFILTER_BUFFLAG_OPA,
+ 40);
this->bodyCollider.info.elemType = ELEMTYPE_UNK1;
this->bodyCollider.base.colType = COLTYPE_HIT3;
this->swordCollider.info.elemType = ELEMTYPE_UNK2;
@@ -1899,14 +1904,17 @@ void func_80B89A08(EnKaizoku* this, PlayState* play) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_LIGHT_ORBS;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->picto.actor.focus.pos.x,
this->picto.actor.focus.pos.y, this->picto.actor.focus.pos.z, 0, 0, 0,
- CLEAR_TAG_LARGE_LIGHT_RAYS);
+ CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
sp64 = 1;
}
break;
+
+ default:
+ break;
}
if (sp64) {
- Actor_SetColorFilter(&this->picto.actor, 0x4000, 255, 0, 8);
+ Actor_SetColorFilter(&this->picto.actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
Actor_ApplyDamage(&this->picto.actor);
if (this->picto.actor.colChkInfo.health <= 0) {
func_80B8960C(this, play);
@@ -1935,12 +1943,12 @@ 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;
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_IT_SHIELD_BOUND);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_IT_SHIELD_BOUND);
EffectSsHitmark_SpawnFixedScale(play, 3, &pos);
CollisionCheck_SpawnShieldParticlesMetal(play, &pos);
}
@@ -2015,7 +2023,7 @@ void EnKaizoku_Update(Actor* thisx, PlayState* play2) {
}
}
- if (this->picto.actor.bgCheckFlags & 1) {
+ if (this->picto.actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
Matrix_RotateYS(this->picto.actor.shape.rot.y + this->unk_2F4, 0);
Matrix_MultVecZ(this->unk_2F0, &sp34);
this->picto.actor.world.pos.x += this->unk_3C4.x + sp34.x;
@@ -2025,7 +2033,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)) {
@@ -2097,16 +2107,16 @@ 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) {
- Matrix_MultZero(&this->bodyPartsPos[this->bodyPartsPosIndex]);
+ 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->bodyPartIndex]);
- this->bodyPartsPosIndex++;
- if (this->bodyPartsPosIndex >= ARRAY_COUNT(this->bodyPartsPos)) {
- this->bodyPartsPosIndex = 0;
+ this->bodyPartIndex++;
+ if (this->bodyPartIndex >= KAIZOKU_BODYPART_MAX) {
+ this->bodyPartIndex = 0;
}
}
}
@@ -2127,8 +2137,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);
@@ -2152,7 +2162,7 @@ void EnKaizoku_Draw(Actor* thisx, PlayState* play) {
this->drawDmgEffFrozenSteamScale = 0.8f;
}
- Actor_DrawDamageEffects(play, &this->picto.actor, this->bodyPartsPos, ARRAY_COUNT(this->bodyPartsPos),
+ Actor_DrawDamageEffects(play, &this->picto.actor, this->bodyPartsPos, KAIZOKU_BODYPART_MAX,
this->drawDmgEffScale, this->drawDmgEffFrozenSteamScale, drawDmgEffAlpha,
this->drawDmgEffType);
}
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..423819eb3 100644
--- a/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.h
+++ b/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.h
@@ -6,7 +6,7 @@
#include "objects/object_kz/object_kz.h"
#define KAIZOKU_GET_EXIT_INDEX(thisx) ((thisx)->params & 0x3F)
-#define KAIZOKU_GET_SWITCHFLAG(thisx) (((thisx)->params >> 6) & 0x7F)
+#define KAIZOKU_GET_SWITCH_FLAG(thisx) (((thisx)->params >> 6) & 0x7F)
struct EnKaizoku;
@@ -35,6 +35,25 @@ typedef enum EnKaizokuAnimation {
/* 19 */ EN_KAIZOKU_ANIM_MAX
} EnKaizokuAnimation;
+typedef enum EnKaizokuBodyPart {
+ /* 0 */ KAIZOKU_BODYPART_0,
+ /* 1 */ KAIZOKU_BODYPART_1,
+ /* 2 */ KAIZOKU_BODYPART_2,
+ /* 3 */ KAIZOKU_BODYPART_3,
+ /* 4 */ KAIZOKU_BODYPART_4,
+ /* 5 */ KAIZOKU_BODYPART_5,
+ /* 6 */ KAIZOKU_BODYPART_6,
+ /* 7 */ KAIZOKU_BODYPART_7,
+ /* 8 */ KAIZOKU_BODYPART_8,
+ /* 9 */ KAIZOKU_BODYPART_9,
+ /* 10 */ KAIZOKU_BODYPART_10,
+ /* 11 */ KAIZOKU_BODYPART_11,
+ /* 12 */ KAIZOKU_BODYPART_12,
+ /* 13 */ KAIZOKU_BODYPART_13,
+ /* 14 */ KAIZOKU_BODYPART_14,
+ /* 15 */ KAIZOKU_BODYPART_MAX
+} EnKaizokuBodyPart;
+
typedef struct EnKaizoku {
/* 0x000 */ PictoActor picto;
/* 0x148 */ SkelAnime skelAnime;
@@ -58,19 +77,19 @@ 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;
+ /* 0x2DC */ f32 animEndFrame;
/* 0x2E0 */ f32 unk_2E0;
/* 0x2E4 */ EnKaizokuAnimation animIndex;
- /* 0x2E8 */ s32 bodyPartsPosIndex;
+ /* 0x2E8 */ s32 bodyPartIndex;
/* 0x2EC */ s32 unk_2EC;
/* 0x2F0 */ f32 unk_2F0;
/* 0x2F4 */ s16 unk_2F4;
/* 0x2F8 */ Vec3f unk_2F8;
/* 0x304 */ Vec3f unk_304;
- /* 0x310 */ Vec3f bodyPartsPos[15];
+ /* 0x310 */ Vec3f bodyPartsPos[KAIZOKU_BODYPART_MAX];
/* 0x3C4 */ Vec3f unk_3C4;
/* 0x3D0 */ s32 blureIndex;
/* 0x3D4 */ ColliderCylinder bodyCollider;
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 3ef617aec..a3d0e4608 100644
--- a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c
+++ b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c
@@ -8,7 +8,7 @@
#include "z_en_kakasi.h"
#include "objects/object_ka/object_ka.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
#define THIS ((EnKakasi*)thisx)
@@ -113,26 +113,40 @@ 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
+ /* 9 */ ENKAKASI_ANIM_MAX
} EnKakasiAnimation;
-static AnimationHeader* sAnimations[] = {
- &object_ka_Anim_007444, &object_ka_Anim_00686C, &object_ka_Anim_0081A4,
- &object_ka_Anim_007B90, &object_ka_Anim_0071EC, &object_ka_Anim_007444,
- &object_ka_Anim_00686C, &object_ka_Anim_0081A4, &object_ka_Anim_000214,
+static AnimationHeader* sAnimations[ENKAKASI_ANIM_MAX] = {
+ &object_ka_Anim_007444, // ENKAKASI_ANIM_ARMS_CROSSED_ROCKING
+ &object_ka_Anim_00686C, // ENKAKASI_ANIM_SIDEWAYS_SHAKING
+ &object_ka_Anim_0081A4, // ENKAKASI_ANIM_HOPPING_REGULAR
+ &object_ka_Anim_007B90, // ENKAKASI_ANIM_SPIN_REACH_OFFER
+ &object_ka_Anim_0071EC, // ENKAKASI_ANIM_TWIRL
+ &object_ka_Anim_007444, // ENKAKASI_ANIM_ARMS_CROSSED_STILL
+ &object_ka_Anim_00686C, // ENKAKASI_ANIM_WAVE
+ &object_ka_Anim_0081A4, // ENKAKASI_ANIM_SLOWROLL
+ &object_ka_Anim_000214, // ENKAKASI_ANIM_IDLE
};
-static u8 sAnimationModes[] = {
- ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_ONCE,
- ANIMMODE_ONCE, ANIMMODE_ONCE, ANIMMODE_ONCE, ANIMMODE_ONCE,
+static u8 sAnimationModes[ENKAKASI_ANIM_MAX] = {
+ ANIMMODE_LOOP, // ENKAKASI_ANIM_ARMS_CROSSED_ROCKING
+ ANIMMODE_LOOP, // ENKAKASI_ANIM_SIDEWAYS_SHAKING
+ ANIMMODE_LOOP, // ENKAKASI_ANIM_HOPPING_REGULAR
+ ANIMMODE_ONCE, // ENKAKASI_ANIM_SPIN_REACH_OFFER
+ ANIMMODE_ONCE, // ENKAKASI_ANIM_TWIRL
+ ANIMMODE_ONCE, // ENKAKASI_ANIM_ARMS_CROSSED_STILL
+ ANIMMODE_ONCE, // ENKAKASI_ANIM_WAVE
+ ANIMMODE_ONCE, // ENKAKASI_ANIM_SLOWROLL
+ ANIMMODE_ONCE, // ENKAKASI_ANIM_IDLE
};
void EnKakasi_Destroy(Actor* thisx, PlayState* play) {
@@ -143,11 +157,11 @@ 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);
- SkelAnime_InitFlex(play, &this->skelanime, &object_ka_Skel_0065B0, &object_ka_Anim_000214, 0, 0, 0);
+ SkelAnime_InitFlex(play, &this->skelAnime, &object_ka_Skel_0065B0, &object_ka_Anim_000214, NULL, NULL, 0);
this->songSummonDist = KAKASI_GET_SUMMON_DISTANCE(&this->picto.actor) * 20.0f;
if (this->songSummonDist < 40.0f) {
@@ -156,8 +170,8 @@ 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) {
+ this->picto.actor.targetMode = TARGET_MODE_0;
+ 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 +183,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++;
}
@@ -197,9 +211,9 @@ void EnKakasi_Init(Actor* thisx, PlayState* play) {
void EnKakasi_ChangeAnim(EnKakasi* this, s32 animIndex) {
this->animIndex = animIndex;
- this->animeFrameCount = Animation_GetLastFrame(&sAnimations[this->animIndex]->common);
+ this->animEndFrame = Animation_GetLastFrame(&sAnimations[this->animIndex]->common);
// 1: regular playback speed, 0: starting frame
- Animation_Change(&this->skelanime, sAnimations[this->animIndex], 1.0f, 0.0f, this->animeFrameCount,
+ Animation_Change(&this->skelAnime, sAnimations[this->animIndex], 1.0f, 0.0f, this->animEndFrame,
sAnimationModes[this->animIndex], -4.0f);
}
@@ -208,26 +222,26 @@ 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 (Animation_OnFrame(&this->skelanime, 1.0f) || Animation_OnFrame(&this->skelanime, 8.0f)) {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EV_KAKASHI_SWING);
+ 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 (Animation_OnFrame(&this->skelanime, 4.0f) || Animation_OnFrame(&this->skelanime, 8.0f)) {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EV_KAKASHI_SWING);
+ 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);
}
- if (Animation_OnFrame(&this->skelanime, 1.0f) || Animation_OnFrame(&this->skelanime, 9.0f) ||
- Animation_OnFrame(&this->skelanime, 16.0f)) {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_IT_KAKASHI_JUMP);
+ if (Animation_OnFrame(&this->skelAnime, 1.0f) || Animation_OnFrame(&this->skelAnime, 9.0f) ||
+ Animation_OnFrame(&this->skelAnime, 16.0f)) {
+ Actor_PlaySfx(&this->picto.actor, NA_SE_IT_KAKASHI_JUMP);
}
- if (Animation_OnFrame(&this->skelanime, 18.0f)) {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EV_KAKASHI_ROLL);
+ if (Animation_OnFrame(&this->skelAnime, 18.0f)) {
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EV_KAKASHI_ROLL);
}
}
- if (this->animIndex == ENKAKASI_ANIM_SPIN_REACH_OFFER || this->animIndex == ENKAKASI_ANIM_TWIRL) {
- if (Animation_OnFrame(&this->skelanime, 1.0f)) {
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EV_KAKASH_LONGI_ROLL);
+ 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,19 +288,20 @@ 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) {
- // why not 0 < x < 4? fewer branches
+ if ((play->msgCtx.ocarinaButtonIndex == OCARINA_BTN_A) || (play->msgCtx.ocarinaButtonIndex == OCARINA_BTN_C_DOWN) ||
+ (play->msgCtx.ocarinaButtonIndex == OCARINA_BTN_C_RIGHT) ||
+ (play->msgCtx.ocarinaButtonIndex == OCARINA_BTN_C_LEFT) ||
+ (play->msgCtx.ocarinaButtonIndex == OCARINA_BTN_C_UP)) {
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) {
this->unk190 = 8;
}
if (this->unk190 != 0) {
- Math_ApproachF(&this->skelanime.playSpeed, 1.0f, 0.1f, 0.2f);
+ Math_ApproachF(&this->skelAnime.playSpeed, 1.0f, 0.1f, 0.2f);
this->picto.actor.shape.rot.y += 0x800;
}
}
@@ -299,8 +314,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) {
@@ -318,7 +333,7 @@ void EnKakasi_TimeSkipDialogue(EnKakasi* this, PlayState* play) {
this->picto.actor.flags &= ~ACTOR_FLAG_10000;
this->actionFunc = EnKakasi_RegularDialogue;
} else {
- func_800B8500(&this->picto.actor, play, 9999.9f, 9999.9f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->picto.actor, play, 9999.9f, 9999.9f, PLAYER_IA_MINUS1);
}
}
}
@@ -330,45 +345,45 @@ void EnKakasi_SetupIdleStanding(EnKakasi* this) {
}
void EnKakasi_IdleStanding(EnKakasi* this, PlayState* play) {
- u32 saveContextDay = gSaveContext.save.day;
+ u32 day = gSaveContext.save.day;
s16 x;
s16 y;
// first talk to scarecrow dialogue
this->picto.actor.textId = 0x1644;
if (func_800B8718(&this->picto.actor, &play->state)) {
- this->skelanime.playSpeed = 1.0f;
+ this->skelAnime.playSpeed = 1.0f;
EnKakasi_SetupSongTeach(this, play);
return;
}
if (Actor_ProcessTalkRequest(&this->picto.actor, &play->state)) {
- this->skelanime.playSpeed = 1.0f;
+ this->skelAnime.playSpeed = 1.0f;
EnKakasi_SetupDialogue(this);
return;
}
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;
+ this->skelAnime.playSpeed = 2.0f;
}
} else if (Player_GetMask(play) == PLAYER_MASK_KAMARO) {
if (this->animIndex != ENKAKASI_ANIM_SIDEWAYS_SHAKING) {
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SIDEWAYS_SHAKING);
- this->skelanime.playSpeed = 2.0f;
+ this->skelAnime.playSpeed = 2.0f;
}
- } else if (saveContextDay == 3 && gSaveContext.save.isNight) {
- this->skelanime.playSpeed = 1.0f;
+ } else if ((day == 3) && gSaveContext.save.isNight) {
+ this->skelAnime.playSpeed = 1.0f;
if (this->animIndex != ENKAKASI_ANIM_SIDEWAYS_SHAKING) {
- EnKakasi_ChangeAnim(this, 1);
+ EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SIDEWAYS_SHAKING);
}
} else if (this->animIndex != ENKAKASI_ANIM_IDLE) {
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_IDLE);
}
if (this->picto.actor.xzDistToPlayer < 120.0f) {
- func_800B8614(&this->picto.actor, play, 100.0f);
+ Actor_OfferTalk(&this->picto.actor, play, 100.0f);
func_800B874C(&this->picto.actor, play, 100.0f, 80.0f);
}
}
@@ -386,39 +401,40 @@ void EnKakasi_SetupDialogue(EnKakasi* this) {
}
void EnKakasi_RegularDialogue(EnKakasi* this, PlayState* play) {
- u32 saveContextDay = gSaveContext.save.day;
- f32 currentAnimeFrame = this->skelanime.curFrame;
+ u32 day = gSaveContext.save.day;
+ f32 curFrame = this->skelAnime.curFrame;
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) && (curFrame >= this->animEndFrame) &&
+ (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->unkCounter1A4 >= 2) {
+ if ((this->picto.actor.textId == 0x1651) || (this->picto.actor.textId == 0x1659)) {
+ if ((curFrame >= this->animEndFrame) && (this->animIndex != ENKAKASI_ANIM_SPIN_REACH_OFFER)) {
+ this->unkCounter1A4++;
+ if (this->unkCounter1A4 >= 2) {
this->unkCounter1A4 = 0;
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SPIN_REACH_OFFER);
}
}
}
- 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;
}
if ((this->talkState == Message_GetState(&play->msgCtx)) && Message_ShouldAdvance(play)) {
- func_801477B4(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 +445,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) {
@@ -440,29 +456,29 @@ void EnKakasi_RegularDialogue(EnKakasi* this, PlayState* play) {
this->picto.actor.textId = 0x1645;
}
- func_80151938(play, this->picto.actor.textId);
+ 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);
@@ -512,19 +528,19 @@ void EnKakasi_RegularDialogue(EnKakasi* this, PlayState* play) {
this->talkState = TEXT_STATE_5;
if (play->msgCtx.choiceIndex == 1) {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
if (this->picto.actor.textId == 0x1656) {
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 ((day == 3) && gSaveContext.save.isNight) {
this->picto.actor.textId = 0x164F;
} else {
this->picto.actor.textId = 0x1652;
}
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_HOPPING_REGULAR);
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
if (this->picto.actor.textId == 0x1656) { // would you like to learn a song? yes/no
this->picto.actor.textId = 0x1657;
} else if (this->picto.actor.textId == 0x165C) { // would you like to learn a song? yes/no
@@ -538,7 +554,7 @@ void EnKakasi_RegularDialogue(EnKakasi* this, PlayState* play) {
}
}
}
- func_80151938(play, this->picto.actor.textId);
+ Message_ContinueTextbox(play, this->picto.actor.textId);
}
}
@@ -559,21 +575,21 @@ void EnKakasi_SetupSongTeach(EnKakasi* this, PlayState* play) {
*/
void EnKakasi_OcarinaRemark(EnKakasi* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_80152434(play, 0x35);
+ Message_DisplayOcarinaStaff(play, OCARINA_ACTION_SCARECROW_SPAWN_RECORDING);
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 +602,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,19 +625,18 @@ 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);
func_8096FAAC(this, play);
func_8096FBB8(this, play);
- if (play->msgCtx.ocarinaMode == 4) { // song failed
+ if (play->msgCtx.ocarinaMode == OCARINA_MODE_END) { // song failed
this->unk190 = 0;
this->unkCounter1A4 = 0;
- ActorCutscene_Stop(this->actorCutscenes[0]);
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_YASE_DEAD);
- if (this) {}
+ CutsceneManager_Stop(this->csIdList[0]);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_YASE_DEAD);
this->unkState196 = 2;
this->subCamId = SUB_CAM_ID_DONE;
this->picto.actor.textId = 0x1647;
@@ -630,9 +645,9 @@ void EnKakasi_TeachingSong(EnKakasi* this, PlayState* play) {
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_ARMS_CROSSED_ROCKING);
this->actionFunc = EnKakasi_RegularDialogue;
- } else if (play->msgCtx.ocarinaMode == 3) { // song success
+ } else if (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) { // song success
this->postTeachTimer = 30;
- this->skelanime.playSpeed = 2.0f;
+ this->skelAnime.playSpeed = 2.0f;
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_HOPPING_REGULAR);
this->actionFunc = EnKakasi_PostSongLearnTwirl;
}
@@ -640,20 +655,20 @@ void EnKakasi_TeachingSong(EnKakasi* this, PlayState* play) {
}
void EnKakasi_PostSongLearnTwirl(EnKakasi* this, PlayState* play) {
- f32 animeFrame = this->skelanime.curFrame;
+ f32 curFrame = 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;
+ 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) && (curFrame >= this->animEndFrame)) {
EnKakasi_SetupPostSongLearnDialogue(this, play);
}
}
void EnKakasi_SetupPostSongLearnDialogue(EnKakasi* this, PlayState* play) {
- ActorCutscene_Stop(this->actorCutscenes[0]);
- play->msgCtx.ocarinaMode = 4;
+ CutsceneManager_Stop(this->csIdList[0]);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
this->unk190 = 0;
this->unkCounter1A4 = 0;
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_HOPPING_REGULAR);
@@ -667,14 +682,14 @@ void EnKakasi_SetupPostSongLearnDialogue(EnKakasi* this, PlayState* play) {
void EnKakasi_PostSongLearnDialogue(EnKakasi* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- f32 tempAnimFrame = this->skelanime.curFrame;
+ f32 curFrame = this->skelAnime.curFrame;
Vec3f vec3fCopy;
Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->picto.actor.home.rot.y, 1, 3000, 0);
Math_SmoothStepToS(&player->actor.shape.rot.y, this->picto.actor.yawTowardsPlayer + 0x8000, 5, 1000, 0);
if (this->unk190 == 0) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_86);
this->picto.actor.textId = 0x1648;
Message_StartTextbox(play, (this->picto.actor.textId), &this->picto.actor);
@@ -682,16 +697,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) &&
+ (curFrame >= this->animEndFrame)) {
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) &&
+ (curFrame >= this->animEndFrame)) {
this->unkCounter1A4++;
if (this->unkCounter1A4 >= 2) {
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SPIN_REACH_OFFER);
@@ -699,18 +714,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 +737,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;
@@ -735,7 +750,7 @@ void EnKakasi_PostSongLearnDialogue(EnKakasi* this, PlayState* play) {
if ((this->unkState1A8 != 0) && (Message_GetState(&play->msgCtx) == this->talkState) &&
Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
if (this->talkState == TEXT_STATE_5) {
this->unk190++;
@@ -744,7 +759,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 +777,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;
}
@@ -771,14 +786,14 @@ void EnKakasi_PostSongLearnDialogue(EnKakasi* this, PlayState* play) {
} else {
this->talkState = TEXT_STATE_5;
if (play->msgCtx.choiceIndex == 1) {
- func_8019F208(); // play 0x4808 sfx (decide) and calls AudioSfx_StopById
+ Audio_PlaySfx_MessageDecide();
this->picto.actor.textId = 0x164A;
} else {
- func_8019F230(); // play 0x480A sfx (cancel) and calls AudioSfx_StopById
+ Audio_PlaySfx_MessageCancel();
this->picto.actor.textId = 0x1661;
}
}
- func_80151938(play, this->picto.actor.textId);
+ Message_ContinueTextbox(play, this->picto.actor.textId);
}
}
@@ -789,18 +804,18 @@ 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 {
- func_801A2BB8(NA_BGM_SARIAS_SONG);
+ Audio_PlaySubBgm(NA_BGM_SARIAS_SONG);
EnKakasi_SetupDanceNightAway(this);
}
}
@@ -818,11 +833,10 @@ void EnKakasi_SetupDanceNightAway(EnKakasi* this) {
}
void EnKakasi_DancingNightAway(EnKakasi* this, PlayState* play) {
- f32 currentFrame;
+ f32 curFrame = this->skelAnime.curFrame;
Vec3f localVec3f;
Player* player;
- currentFrame = this->skelanime.curFrame;
EnKakasi_CheckPlayerPosition(this, play);
Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->picto.actor.home.rot.y, 1, 3000, 0);
this->unk22C.y = this->picto.actor.home.pos.y + 50.0f;
@@ -831,17 +845,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 +866,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) && (curFrame >= this->animEndFrame)) {
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 +941,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,13 +954,10 @@ 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 (0) {}
-
- 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);
+ SET_EVENTINF(EVENTINF_TRIGGER_DAYTELOP);
} else {
gSaveContext.save.time = CLOCK_TIME(18, 0);
gSaveContext.respawnFlag = -8;
@@ -948,6 +966,10 @@ void EnKakasi_DancingNightAway(EnKakasi* this, PlayState* play) {
this->unk190 = 0;
this->actionFunc = EnKakasi_DoNothing;
}
+ break;
+
+ default:
+ break;
}
}
@@ -978,7 +1000,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,25 +1019,25 @@ 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 {
Actor_SpawnFloorDustRing(play, &this->picto.actor, &this->picto.actor.world.pos,
this->picto.actor.shape.shadowScale - 20.0f, 5, 4.0f, 200, 10, 1);
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_AKINDONUTS_HIDE);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_AKINDONUTS_HIDE);
}
}
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);
@@ -1025,38 +1047,36 @@ void EnKakasi_DiggingAway(EnKakasi* this, PlayState* play) {
void EnKakasi_SetupIdleUnderground(EnKakasi* this) {
this->picto.actor.shape.yOffset = -7000.0;
this->picto.actor.draw = NULL;
- this->picto.actor.flags |= ACTOR_FLAG_8000000;
+ this->picto.actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
this->unkState196 = 5;
this->actionFunc = EnKakasi_IdleUnderground;
}
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)) {
- this->picto.actor.flags &= ~ACTOR_FLAG_8000000;
- play->msgCtx.ocarinaMode = 4;
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_79_08) && (this->picto.actor.xzDistToPlayer < this->songSummonDist) &&
+ ((BREG(1) != 0) || (play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_SCARECROW_SPAWN))) {
+ this->picto.actor.flags &= ~ACTOR_FLAG_CANT_LOCK_ON;
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
this->actionFunc = EnKakasi_SetupRiseOutOfGround;
}
}
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);
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_AKINDONUTS_HIDE);
+ 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;
this->actionFunc = EnKakasi_RisingOutOfGround;
@@ -1073,7 +1093,7 @@ void EnKakasi_RisingOutOfGround(EnKakasi* this, PlayState* play) {
if ((play->gameplayFrames % 8) == 0) {
Actor_SpawnFloorDustRing(play, &this->picto.actor, &this->picto.actor.world.pos,
this->picto.actor.shape.shadowScale - 20.0f, 10, 8.0f, 500, 10, 1);
- Actor_PlaySfxAtPos(&this->picto.actor, NA_SE_EN_AKINDONUTS_HIDE);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EN_AKINDONUTS_HIDE);
}
Math_ApproachF(&this->picto.actor.shape.yOffset, 0.0f, 0.5f, 200.0f);
} else {
@@ -1094,7 +1114,7 @@ void EnKakasi_IdleRisen(EnKakasi* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->picto.actor, &play->state)) {
this->actionFunc = EnKakasi_RisenDialogue;
} else {
- func_800B8614(&this->picto.actor, play, 70.0f);
+ Actor_OfferTalk(&this->picto.actor, play, 70.0f);
}
}
@@ -1102,7 +1122,7 @@ void EnKakasi_RisenDialogue(EnKakasi* this, PlayState* play) {
Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->picto.actor.yawTowardsPlayer, 5, 1000, 0);
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
EnKakasi_SetupIdleRisen(this);
}
}
@@ -1111,7 +1131,7 @@ void EnKakasi_Update(Actor* thisx, PlayState* play) {
EnKakasi* this = THIS;
s32 pad;
- SkelAnime_Update(&this->skelanime);
+ SkelAnime_Update(&this->skelAnime);
if (this->picto.actor.draw != NULL) {
EnKakasi_CheckAnimationSfx(this);
}
@@ -1121,10 +1141,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 +1156,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);
@@ -1147,14 +1168,14 @@ void EnKakasi_Update(Actor* thisx, PlayState* play) {
void EnKakasi_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnKakasi* this = THIS;
- if (limbIndex == 4) {
+ if (limbIndex == OBJECT_KA_LIMB_04) {
Matrix_MultVec3f(&gZeroVec3f, &this->unk1BC);
}
}
void EnKakasi_Draw(Actor* thisx, PlayState* play) {
EnKakasi* this = THIS;
- func_8012C28C(play->state.gfxCtx);
- SkelAnime_DrawFlexOpa(play, this->skelanime.skeleton, this->skelanime.jointTable, this->skelanime.dListCount, NULL,
+ 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..689e475b2 100644
--- a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.h
+++ b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.h
@@ -11,7 +11,7 @@ typedef void (*EnKakasiActionFunc)(struct EnKakasi*, PlayState*);
typedef struct EnKakasi {
/* 0x000 */ PictoActor picto;
/* 0x148 */ EnKakasiActionFunc actionFunc;
- /* 0x14C */ SkelAnime skelanime;
+ /* 0x14C */ SkelAnime skelAnime;
/* 0x190 */ s16 unk190; // camera index for song teaching angles?
/* 0x192 */ s16 postTeachTimer;
/* 0x194 */ s16 aboveGroundStatus; // from params, changed to 2 in init
@@ -21,8 +21,8 @@ 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];
- /* 0x1B4 */ f32 animeFrameCount;
+ /* 0x1AE */ s16 csIdList[3];
+ /* 0x1B4 */ f32 animEndFrame;
/* 0x1B8 */ f32 unkHeight;
/* 0x1BC */ Vec3f unk1BC; // set by post limbdraw func for one limb
/* 0x1C8 */ UNK_TYPE1 pad1C8[0x3C];
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 6e021186f..8171e56b4 100644
--- a/src/overlays/actors/ovl_En_Kame/z_en_kame.c
+++ b/src/overlays/actors/ovl_En_Kame/z_en_kame.c
@@ -1,13 +1,13 @@
/*
* File: z_en_kame.c
* Overlay: ovl_En_Kame
- * Description: Snapper Turtle
+ * Description: Snapper
*/
#include "z_en_kame.h"
-#include "objects/object_tl/object_tl.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_400)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_400)
#define THIS ((EnKame*)thisx)
@@ -16,30 +16,46 @@ void EnKame_Destroy(Actor* thisx, PlayState* play);
void EnKame_Update(Actor* thisx, PlayState* play);
void EnKame_Draw(Actor* thisx, PlayState* play);
-void func_80AD70A0(EnKame* this);
-void func_80AD70EC(EnKame* this, PlayState* play);
-void func_80AD71B4(EnKame* this);
-void func_80AD7254(EnKame* this, PlayState* play);
-void func_80AD73A8(EnKame* this);
-void func_80AD7424(EnKame* this, PlayState* play);
-void func_80AD76CC(EnKame* this);
-void func_80AD7798(EnKame* this, PlayState* play);
-void func_80AD792C(EnKame* this);
-void func_80AD7948(EnKame* this, PlayState* play);
-void func_80AD7B18(EnKame* this);
-void func_80AD7B90(EnKame* this, PlayState* play);
-void func_80AD7D40(EnKame* this, PlayState* play);
-void func_80AD7DA4(EnKame* this);
-void func_80AD7E0C(EnKame* this, PlayState* play);
-void func_80AD7EC0(EnKame* this);
-void func_80AD7F10(EnKame* this, PlayState* play);
-void func_80AD7FF8(EnKame* this, PlayState* play);
-void func_80AD810C(EnKame* this, PlayState* play);
-void func_80AD8148(EnKame* this, PlayState* play);
-void func_80AD825C(EnKame* this, PlayState* play);
-void func_80AD8364(EnKame* this);
-void func_80AD8388(EnKame* this, PlayState* play);
-void func_80AD8D64(Actor* thisx, PlayState* play);
+void EnKame_SetupIdle(EnKame* this);
+void EnKame_Idle(EnKame* this, PlayState* play);
+void EnKame_SetupWalk(EnKame* this);
+void EnKame_Walk(EnKame* this, PlayState* play);
+void EnKame_SetupRetreatIntoShell(EnKame* this);
+void EnKame_RetreatIntoShell(EnKame* this, PlayState* play);
+void EnKame_SetupPrepareToAttack(EnKame* this);
+void EnKame_PrepareToAttack(EnKame* this, PlayState* play);
+void EnKame_SetupAttack(EnKame* this);
+void EnKame_Attack(EnKame* this, PlayState* play);
+void EnKame_SetupEmergeFromShell(EnKame* this);
+void EnKame_EmergeFromShell(EnKame* this, PlayState* play);
+void EnKame_Flip(EnKame* this, PlayState* play);
+void EnKame_SetupStruggle(EnKame* this);
+void EnKame_Struggle(EnKame* this, PlayState* play);
+void EnKame_SetupFlipUpright(EnKame* this);
+void EnKame_FlipUpright(EnKame* this, PlayState* play);
+void EnKame_Stunned(EnKame* this, PlayState* play);
+void EnKame_Damaged(EnKame* this, PlayState* play);
+void EnKame_SetupDead(EnKame* this, PlayState* play);
+void EnKame_Dead(EnKame* this, PlayState* play);
+void EnKame_SetupBurstIntoFlames(EnKame* this);
+void EnKame_BurstIntoFlames(EnKame* this, PlayState* play);
+void EnKame_DrawSpikedSnapper(Actor* thisx, PlayState* play);
+
+// This enum is used for when the Snapper is forcibly flipped
+// by one of the player's attacks. It is *not* used for when
+// the Snapper flips itself upright.
+typedef enum {
+ /* 0 */ EN_KAME_FLIP_TYPE_UPSIDE_DOWN,
+ /* 1 */ EN_KAME_FLIP_TYPE_RIGHTSIDE_UP
+} EnKameFlipType;
+
+typedef enum {
+ /* 0 */ EN_KAME_EYE_OPEN,
+ /* 1 */ EN_KAME_EYE_HALF_CLOSING,
+ /* 2 */ EN_KAME_EYE_CLOSED,
+ /* 3 */ EN_KAME_EYE_HALF_OPENING,
+ /* 4 */ EN_KAME_EYE_MAX
+} EnKameEyeTexture;
ActorInit En_Kame_InitVars = {
ACTOR_EN_KAME,
@@ -75,43 +91,54 @@ static ColliderCylinderInit sCylinderInit = {
static CollisionCheckInfoInit sColChkInfoInit = { 3, 15, 30, 80 };
+typedef enum {
+ /* 0x0 */ EN_KAME_DMGEFF_NONE, // Has no special effect
+ /* 0x1 */ EN_KAME_DMGEFF_STUN, // Cannot damage the Snapper, but stuns it for 40 frames
+ /* 0x2 */ EN_KAME_DMGEFF_FIRE, // Sets the Snapper on fire
+ /* 0x3 */ EN_KAME_DMGEFF_FREEZE, // Stuns the Snapper for 80 frames and surrounds it with ice
+ /* 0x4 */ EN_KAME_DMGEFF_LIGHT_ORB, // Surrounds the snapper with light orbs
+ /* 0x5 */ EN_KAME_DMGEFF_ELECTRIC_STUN, // Similar to EN_KAME_DMGEFF_STUN, but also applies an electric effect
+ /* 0xD */ EN_KAME_DMGEFF_HOOKSHOT = 0xD, // Cannot damage the Snapper, but pulls the player towards it
+ /* 0xE */ EN_KAME_DMGEFF_INSTANT_KILL, // Instantly kills the Snapper if it hits, even when it is rightside-up
+ /* 0xF */ EN_KAME_DMGEFF_FLIP_OVER // Flips over Snappers if they are rightside-up
+} EnKameDamageEffect;
+
static DamageTable sDamageTable = {
- /* Deku Nut */ DMG_ENTRY(0, 0x1),
- /* Deku Stick */ DMG_ENTRY(1, 0x0),
- /* Horse trample */ DMG_ENTRY(1, 0x0),
- /* Explosives */ DMG_ENTRY(1, 0xF),
- /* Zora boomerang */ DMG_ENTRY(1, 0x0),
- /* Normal arrow */ DMG_ENTRY(1, 0x0),
- /* UNK_DMG_0x06 */ DMG_ENTRY(0, 0x0),
- /* Hookshot */ DMG_ENTRY(0, 0xD),
- /* Goron punch */ DMG_ENTRY(1, 0x0),
- /* Sword */ DMG_ENTRY(1, 0x0),
- /* Goron pound */ DMG_ENTRY(0, 0xF),
- /* Fire arrow */ DMG_ENTRY(2, 0x2),
- /* Ice arrow */ DMG_ENTRY(2, 0x3),
- /* Light arrow */ DMG_ENTRY(2, 0x4),
- /* Goron spikes */ DMG_ENTRY(1, 0x0),
- /* Deku spin */ DMG_ENTRY(0, 0x1),
- /* Deku bubble */ DMG_ENTRY(1, 0x0),
- /* Deku launch */ DMG_ENTRY(2, 0xE),
- /* UNK_DMG_0x12 */ DMG_ENTRY(0, 0x1),
- /* Zora barrier */ DMG_ENTRY(0, 0x5),
- /* Normal shield */ DMG_ENTRY(0, 0x0),
- /* Light ray */ DMG_ENTRY(0, 0x0),
- /* Thrown object */ DMG_ENTRY(1, 0x0),
- /* 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, 0xF),
+ /* Deku Nut */ DMG_ENTRY(0, EN_KAME_DMGEFF_STUN),
+ /* Deku Stick */ DMG_ENTRY(1, EN_KAME_DMGEFF_NONE),
+ /* Horse trample */ DMG_ENTRY(1, EN_KAME_DMGEFF_NONE),
+ /* Explosives */ DMG_ENTRY(1, EN_KAME_DMGEFF_FLIP_OVER),
+ /* Zora boomerang */ DMG_ENTRY(1, EN_KAME_DMGEFF_NONE),
+ /* Normal arrow */ DMG_ENTRY(1, EN_KAME_DMGEFF_NONE),
+ /* UNK_DMG_0x06 */ DMG_ENTRY(0, EN_KAME_DMGEFF_NONE),
+ /* Hookshot */ DMG_ENTRY(0, EN_KAME_DMGEFF_HOOKSHOT),
+ /* Goron punch */ DMG_ENTRY(1, EN_KAME_DMGEFF_NONE),
+ /* Sword */ DMG_ENTRY(1, EN_KAME_DMGEFF_NONE),
+ /* Goron pound */ DMG_ENTRY(0, EN_KAME_DMGEFF_FLIP_OVER),
+ /* Fire arrow */ DMG_ENTRY(2, EN_KAME_DMGEFF_FIRE),
+ /* Ice arrow */ DMG_ENTRY(2, EN_KAME_DMGEFF_FREEZE),
+ /* Light arrow */ DMG_ENTRY(2, EN_KAME_DMGEFF_LIGHT_ORB),
+ /* Goron spikes */ DMG_ENTRY(1, EN_KAME_DMGEFF_NONE),
+ /* Deku spin */ DMG_ENTRY(0, EN_KAME_DMGEFF_STUN),
+ /* Deku bubble */ DMG_ENTRY(1, EN_KAME_DMGEFF_NONE),
+ /* Deku launch */ DMG_ENTRY(2, EN_KAME_DMGEFF_INSTANT_KILL),
+ /* UNK_DMG_0x12 */ DMG_ENTRY(0, EN_KAME_DMGEFF_STUN),
+ /* Zora barrier */ DMG_ENTRY(0, EN_KAME_DMGEFF_ELECTRIC_STUN),
+ /* Normal shield */ DMG_ENTRY(0, EN_KAME_DMGEFF_NONE),
+ /* Light ray */ DMG_ENTRY(0, EN_KAME_DMGEFF_NONE),
+ /* Thrown object */ DMG_ENTRY(1, EN_KAME_DMGEFF_NONE),
+ /* Zora punch */ DMG_ENTRY(1, EN_KAME_DMGEFF_NONE),
+ /* Spin attack */ DMG_ENTRY(1, EN_KAME_DMGEFF_NONE),
+ /* Sword beam */ DMG_ENTRY(0, EN_KAME_DMGEFF_NONE),
+ /* Normal Roll */ DMG_ENTRY(0, EN_KAME_DMGEFF_NONE),
+ /* UNK_DMG_0x1B */ DMG_ENTRY(0, EN_KAME_DMGEFF_NONE),
+ /* UNK_DMG_0x1C */ DMG_ENTRY(0, EN_KAME_DMGEFF_NONE),
+ /* Unblockable */ DMG_ENTRY(0, EN_KAME_DMGEFF_NONE),
+ /* UNK_DMG_0x1E */ DMG_ENTRY(0, EN_KAME_DMGEFF_NONE),
+ /* Powder Keg */ DMG_ENTRY(1, EN_KAME_DMGEFF_FLIP_OVER),
};
-static TexturePtr D_80AD8E34[] = { object_tl_Tex_0055A0, object_tl_Tex_0057A0, object_tl_Tex_0059A0,
- object_tl_Tex_0057A0 };
+static TexturePtr sEyeTextures[] = { gSnapperEyeOpenTex, gSnapperEyeHalfTex, gSnapperEyeClosedTex, gSnapperEyeHalfTex };
static InitChainEntry sInitChain[] = {
ICHAIN_S8(hintId, TATL_HINT_ID_SNAPPER, ICHAIN_CONTINUE),
@@ -119,30 +146,31 @@ static InitChainEntry sInitChain[] = {
ICHAIN_F32(targetArrowOffset, 3500, ICHAIN_STOP),
};
-static s32 D_80AD8E50 = false;
+static s32 sTexturesDesegmented = false;
void EnKame_Init(Actor* thisx, PlayState* play) {
EnKame* this = THIS;
Actor_ProcessInitChain(&this->actor, sInitChain);
- SkelAnime_InitFlex(play, &this->skelAnime1, &object_tl_Skel_007C70, &object_tl_Anim_004210, this->jointTable1,
- this->morphTable1, 13);
- SkelAnime_InitFlex(play, &this->skelAnime2, &object_tl_Skel_001A50, &object_tl_Anim_000B30, this->jointTable2,
- this->morphTable2, 4);
+ SkelAnime_InitFlex(play, &this->snapperSkelAnime, &gSnapperSkel, &gSnapperIdleAnim, this->snapperJointTable,
+ this->snapperMorphTable, SNAPPER_LIMB_MAX);
+ SkelAnime_InitFlex(play, &this->spikedSnapperSkelAnime, &gSpikedSnapperSkel, &gSpikedSnapperIdleAnim,
+ this->spikedSnapperJointTable, this->spikedSnapperMorphTable, SPIKED_SNAPPER_LIMB_MAX);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 55.0f);
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
- if (!D_80AD8E50) {
+ if (!sTexturesDesegmented) {
s32 i;
- for (i = 0; i < ARRAY_COUNT(D_80AD8E34); i++) {
- D_80AD8E34[i] = Lib_SegmentedToVirtual(D_80AD8E34[i]);
+ for (i = 0; i < ARRAY_COUNT(sEyeTextures); i++) {
+ sEyeTextures[i] = Lib_SegmentedToVirtual(sEyeTextures[i]);
}
- D_80AD8E50 = true;
+
+ sTexturesDesegmented = true;
}
- func_80AD70A0(this);
+ EnKame_SetupIdle(this);
}
void EnKame_Destroy(Actor* thisx, PlayState* play) {
@@ -151,448 +179,565 @@ void EnKame_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyCylinder(play, &this->collider);
}
-void func_80AD6F34(EnKame* this) {
- if (this->unk_29C != 0) {
- this->unk_29C++;
- if (this->unk_29C == 4) {
- this->unk_29C = 0;
+void EnKame_Blink(EnKame* this) {
+ if (this->eyeIndex != EN_KAME_EYE_OPEN) {
+ this->eyeIndex++;
+ if (this->eyeIndex == EN_KAME_EYE_MAX) {
+ this->eyeIndex = EN_KAME_EYE_OPEN;
}
} else if (Rand_ZeroOne() < 0.05f) {
- this->unk_29C = 1;
+ this->eyeIndex = EN_KAME_EYE_HALF_CLOSING;
}
}
-void func_80AD6F9C(EnKame* this) {
+void EnKame_Freeze(EnKame* this) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX;
this->drawDmgEffScale = 0.6f;
- this->drawDmgEffFrozenSteamScale = 0.90000004f;
+ this->drawDmgEffFrozenSteamScale = 900.0f * 0.001f;
this->drawDmgEffAlpha = 1.0f;
this->collider.base.colType = COLTYPE_HIT3;
- this->unk_2A2 = 80;
+ this->stunTimer = 80;
this->actor.flags &= ~ACTOR_FLAG_400;
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 80);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 80);
}
-void func_80AD7018(EnKame* this, PlayState* play) {
+void EnKame_Thaw(EnKame* this, PlayState* play) {
if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->collider.base.colType = COLTYPE_HIT6;
this->drawDmgEffAlpha = 0.0f;
- Actor_SpawnIceEffects(play, &this->actor, this->limbPos, 10, 2, 0.3f, 0.2f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, SNAPPER_BODYPART_MAX, 2, 0.3f, 0.2f);
this->actor.flags |= ACTOR_FLAG_400;
}
}
-void func_80AD70A0(EnKame* this) {
- Animation_MorphToPlayOnce(&this->skelAnime1, &object_tl_Anim_004210, -5.0f);
- this->actor.speedXZ = 0.0f;
- this->actionFunc = func_80AD70EC;
+void EnKame_SetupIdle(EnKame* this) {
+ Animation_MorphToPlayOnce(&this->snapperSkelAnime, &gSnapperIdleAnim, -5.0f);
+ this->actor.speed = 0.0f;
+ this->actionFunc = EnKame_Idle;
}
-void func_80AD70EC(EnKame* this, PlayState* play) {
+/**
+ * Plays the idle animation, then starts walking once the animation is over. If the player gets close enough to
+ * the Snapper without the Stone Mask equipped, it will retreat into its shell to begin attacking them.
+ */
+void EnKame_Idle(EnKame* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (Animation_OnFrame(&this->skelAnime1, 10.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PAMET_VOICE);
- this->unk_2A0 = 40;
+ if (Animation_OnFrame(&this->snapperSkelAnime, 10.0f)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PAMET_VOICE);
+ this->voiceTimer = 40;
}
if ((Player_GetMask(play) != PLAYER_MASK_STONE) && !(player->stateFlags1 & PLAYER_STATE1_800000) &&
(this->actor.xzDistToPlayer < 240.0f)) {
- func_80AD73A8(this);
- } else if (SkelAnime_Update(&this->skelAnime1)) {
- func_80AD71B4(this);
+ EnKame_SetupRetreatIntoShell(this);
+ } else if (SkelAnime_Update(&this->snapperSkelAnime)) {
+ EnKame_SetupWalk(this);
}
}
-void func_80AD71B4(EnKame* this) {
- Animation_MorphToLoop(&this->skelAnime1, &object_tl_Anim_00823C, -5.0f);
- this->actor.speedXZ = 0.5f;
- this->unk_29E = Animation_GetLastFrame(&object_tl_Anim_00823C) * ((s32)Rand_ZeroFloat(5.0f) + 3);
- this->unk_2A4 = this->actor.shape.rot.y;
+void EnKame_SetupWalk(EnKame* this) {
+ Animation_MorphToLoop(&this->snapperSkelAnime, &gSnapperWalkAnim, -5.0f);
+ this->actor.speed = 0.5f;
+ this->timer = Animation_GetLastFrame(&gSnapperWalkAnim) * ((s32)Rand_ZeroFloat(5.0f) + 3);
+ this->targetRotY = this->actor.shape.rot.y;
this->collider.base.acFlags |= (AC_HARD | AC_ON);
this->collider.base.colType = COLTYPE_HARD;
- this->actionFunc = func_80AD7254;
+ this->actionFunc = EnKame_Walk;
}
-void func_80AD7254(EnKame* this, PlayState* play) {
+/**
+ * Walk semi-randomly around the Snapper's home until the timer reaches 0, then transition back to being idle.
+ * If the player gets close enough to the Snapper without the Stone Mask equipped, it will retreat into its
+ * shell to begin attacking them.
+ */
+void EnKame_Walk(EnKame* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if ((Player_GetMask(play) != PLAYER_MASK_STONE) && !(player->stateFlags1 & PLAYER_STATE1_800000) &&
(this->actor.xzDistToPlayer < 240.0f)) {
- func_80AD73A8(this);
+ EnKame_SetupRetreatIntoShell(this);
return;
}
- SkelAnime_Update(&this->skelAnime1);
+ SkelAnime_Update(&this->snapperSkelAnime);
- if (this->unk_2A4 != this->actor.shape.rot.y) {
- Math_ScaledStepToS(&this->actor.shape.rot.y, this->unk_2A4, 0x100);
+ if (this->targetRotY != this->actor.shape.rot.y) {
+ Math_ScaledStepToS(&this->actor.shape.rot.y, this->targetRotY, 0x100);
this->actor.world.rot.y = this->actor.shape.rot.y;
- } else if (Actor_XZDistanceToPoint(&this->actor, &this->actor.home.pos) > 40.0f) {
- this->unk_2A4 = Actor_YawToPoint(&this->actor, &this->actor.home.pos) + ((s32)Rand_Next() >> 0x14);
+ } else if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) > 40.0f) {
+ this->targetRotY = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos) + ((s32)Rand_Next() >> 0x14);
}
- this->unk_29E--;
- if (this->unk_29E == 0) {
- func_80AD70A0(this);
- } else if (Animation_OnFrame(&this->skelAnime1, 0.0f) || Animation_OnFrame(&this->skelAnime1, 15.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PAMET_WALK);
+ this->timer--;
+ if (this->timer == 0) {
+ EnKame_SetupIdle(this);
+ } else if (Animation_OnFrame(&this->snapperSkelAnime, 0.0f) || Animation_OnFrame(&this->snapperSkelAnime, 15.0f)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PAMET_WALK);
}
}
-void func_80AD73A8(EnKame* this) {
- Animation_MorphToPlayOnce(&this->skelAnime1, &object_tl_Anim_001C68, -3.0f);
- this->unk_29E = 0;
- this->unk_2AC = 1.0f;
- this->unk_2A8 = 1.0f;
- this->actor.speedXZ = 0.0f;
- if (this->unk_2A0 == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PAMET_VOICE);
+void EnKame_SetupRetreatIntoShell(EnKame* this) {
+ Animation_MorphToPlayOnce(&this->snapperSkelAnime, &gSnapperRetreatIntoShellAnim, -3.0f);
+ this->timer = 0;
+ this->limbScaleY = 1.0f;
+ this->limbScaleXZ = 1.0f;
+ this->actor.speed = 0.0f;
+
+ // If the Snapper recently played this same sound effect while it was idle, don't play it again.
+ if (this->voiceTimer == 0) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PAMET_VOICE);
}
- this->actionFunc = func_80AD7424;
+
+ this->actionFunc = EnKame_RetreatIntoShell;
}
-void func_80AD7424(EnKame* this, PlayState* play) {
+/**
+ * Plays the animation of the Snapper retreating its shell, and scales its limbs appropriately to
+ * make it appear like its head and legs are going into the shell. Once the animation is over, the
+ * Snapper will either prepare for an attack (if the player is close enough and not wearing the
+ * Stone Mask), or it will emerge from its shell.
+ */
+void EnKame_RetreatIntoShell(EnKame* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (SkelAnime_Update(&this->skelAnime1)) {
+ if (SkelAnime_Update(&this->snapperSkelAnime)) {
if ((Player_GetMask(play) != PLAYER_MASK_STONE) && !(player->stateFlags1 & PLAYER_STATE1_800000) &&
- ((this->unk_29E == 0) || (this->actor.xzDistToPlayer < 120.0f))) {
- func_80AD76CC(this);
+ ((this->timer == 0) || (this->actor.xzDistToPlayer < 120.0f))) {
+ EnKame_SetupPrepareToAttack(this);
} else {
- this->unk_29E--;
- if (this->unk_29E == 0) {
- func_80AD7B18(this);
+ this->timer--;
+ if (this->timer == 0) {
+ EnKame_SetupEmergeFromShell(this);
}
}
- } else if (this->skelAnime1.curFrame > 2.0f) {
- this->unk_2AC = 1.5f - ((this->skelAnime1.curFrame - 2.0f) * (7.0f / 30));
- this->unk_2A8 = 1.5f - ((this->skelAnime1.curFrame - 2.0f) * (1.0f / 12));
+ } else if (this->snapperSkelAnime.curFrame > 2.0f) {
+ this->limbScaleY = 1.5f - ((this->snapperSkelAnime.curFrame - 2.0f) * (7.0f / 30));
+ this->limbScaleXZ = 1.5f - ((this->snapperSkelAnime.curFrame - 2.0f) * (1.0f / 12));
} else {
- f32 frame = this->skelAnime1.curFrame;
+ f32 curFrame = this->snapperSkelAnime.curFrame;
- this->unk_2AC = (0.25f * frame) + 1.0f;
- this->unk_2A8 = (0.25f * frame) + 1.0f;
+ this->limbScaleY = (0.25f * curFrame) + 1.0f;
+ this->limbScaleXZ = (0.25f * curFrame) + 1.0f;
}
}
-void func_80AD7568(EnKame* this) {
- this->actor.speedXZ = this->unk_2A6 * (5.0f / 7552);
- this->actor.shape.rot.z = this->unk_2A6 * 0.11016949f;
+/**
+ * Sets the Snapper's speed and z-rotation based on its angular velocity. When the Snapper is done with the first
+ * part of its attack, it will slowly "wind up" before moving back to its home; by setting the speed to be a multiple
+ * of its angular velocity, the Snapper will smootly ramp up its speed during the "wind up". As for the z-rotation,
+ * setting it in this manner gives the Snapper a subtle, almost-imperceptible tilt as it spins.
+ */
+void EnKame_SetAttackSpeed(EnKame* this) {
+ this->actor.speed = this->angularVelocityY * (5.0f / 0x1D80);
+ this->actor.shape.rot.z = this->angularVelocityY * (13.0f / 118.0f);
}
-void func_80AD75A8(EnKame* this, PlayState* play) {
- static Color_RGBA8 D_80AD8E54 = { 250, 250, 250, 255 };
- static Color_RGBA8 D_80AD8E58 = { 180, 180, 180, 255 };
- static Vec3f D_80AD8E5C = { 0.0f, 0.75f, 0.0f };
+/**
+ * If the Snapper is moving quickly enough over certain surface materials, this function will spawn dirt or snow-colored
+ * dust on even-numbered frames. Additionally, this function is also responsible for playing the Snapper's spinning
+ * sound effect if its angular velocity is large enough.
+ */
+void EnKame_ProcessAttackEffects(EnKame* this, PlayState* play) {
+ static Color_RGBA8 sSnowPrimColor = { 250, 250, 250, 255 };
+ static Color_RGBA8 sSnowEnvColor = { 180, 180, 180, 255 };
+ static Vec3f sVelocity = { 0.0f, 0.75f, 0.0f };
- if ((this->actor.bgCheckFlags & 1) && (this->actor.speedXZ >= 3.0f)) {
+ 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)) {
- func_800B1210(play, &this->actor.world.pos, &D_80AD8E5C, &gZeroVec3f, 550, 100);
- } else if (temp_v0 == 14) {
- func_800B0DE0(play, &this->actor.world.pos, &D_80AD8E5C, &gZeroVec3f, &D_80AD8E54, &D_80AD8E58, 550,
- 100);
+ if ((surfaceMaterial == SURFACE_MATERIAL_DIRT) || (surfaceMaterial == SURFACE_MATERIAL_SAND)) {
+ func_800B1210(play, &this->actor.world.pos, &sVelocity, &gZeroVec3f, 550, 100);
+ } else if (surfaceMaterial == SURFACE_MATERIAL_SNOW) {
+ func_800B0DE0(play, &this->actor.world.pos, &sVelocity, &gZeroVec3f, &sSnowPrimColor, &sSnowEnvColor,
+ 550, 100);
}
}
}
- if (this->unk_2A6 > 0x1200) {
- func_800B9010(&this->actor, NA_SE_EN_PAMET_ROLL - SFX_FLAG);
+ if (this->angularVelocityY > 0x1200) {
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_PAMET_ROLL - SFX_FLAG);
}
}
-void func_80AD76CC(EnKame* this) {
+void EnKame_SetupPrepareToAttack(EnKame* this) {
+ // The Snapper's attack can be divided into roughly two phases:
+ // - Charging towards the player
+ // - Going back to their home
+ // This if-statement is checking which of the two is the current phase. If the Snapper is in the first
+ // phase of the attack, then it just finished retreating into its shell, and it hasn't switched to its
+ // "spiked" form yet. Thus, we check the draw function here to determine which phase the Snapper is in.
if (this->actor.draw == EnKame_Draw) {
- this->actor.draw = func_80AD8D64;
- this->unk_2A6 = 0x3B00;
- this->unk_2AC = 0.5f;
- func_80AD7568(this);
- this->unk_29E = 15;
- this->actor.speedXZ = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PAMET_CUTTER_ON);
- this->unk_2BC.y = this->actor.home.pos.y - 100.0f;
+ this->actor.draw = EnKame_DrawSpikedSnapper;
+ this->angularVelocityY = 0x3B00;
+ this->spikesScale = 0.5f;
+ EnKame_SetAttackSpeed(this);
+ this->timer = 15;
+ this->actor.speed = 0.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PAMET_CUTTER_ON);
+ // As stated above, we could tell this was the first phase of the Snapper's attack because it hadn't
+ // changed its draw function to the "spiked" version yet. However, we won't be able to check the draw
+ // function in the future, because we just changed it; we need some other way to tell which phase of
+ // the attack the Snapper is in. Setting the targetPos's y-position here to something less than the
+ // home's y-position will be used as a signal in future functions to indicate this is the first phase
+ // of the attack. Nothing looks at the y-position of the targetPos, so we can use it however we want,
+ // and during the second phase of the attack, the Snapper's home position is copied into targetPos,
+ // including the y-position; the targetPos's y-position will *only* differ from the home's y-position
+ // during the first phase of the attack due to the code below.
+ this->targetPos.y = this->actor.home.pos.y - 100.0f;
} else {
- this->actor.world.rot.y = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
- Math_Vec3f_Copy(&this->unk_2BC, &this->actor.home.pos);
- this->unk_29E = 0;
+ this->actor.world.rot.y = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
+ Math_Vec3f_Copy(&this->targetPos, &this->actor.home.pos);
+ this->timer = 0;
}
+
this->actor.flags |= ACTOR_FLAG_10;
- this->actionFunc = func_80AD7798;
+ this->actionFunc = EnKame_PrepareToAttack;
}
-void func_80AD7798(EnKame* this, PlayState* play) {
- if (this->unk_29E == 15) {
- this->unk_2AC += 0.2f;
- if (this->unk_2AC > 1.1f) {
- this->unk_29E--;
+/**
+ * This function gradually increases the angular velocity to 0x3B00 and does a few other miscellaneous tasks (e.g.,
+ * scaling the spikes up and making the Snapper face the player for the first phase of the attack) before attacking.
+ */
+void EnKame_PrepareToAttack(EnKame* this, PlayState* play) {
+ // In EnKame_SetupPrepareToAttack, the timer is set to 15 if it was the first phase of the attack, so this is yet
+ // another way of checking the current phase. Gradually scale the spikes up, and once they reach their full size,
+ // enable AT collisions so the Snapper can damage the player.
+ if (this->timer == 15) {
+ this->spikesScale += 0.2f;
+ if (this->spikesScale > 1.1f) {
+ this->timer--;
this->collider.base.atFlags |= AT_ON;
- this->unk_2AC = 1.0f;
+ this->spikesScale = 1.0f;
}
- } else if (this->unk_29E > 0) {
- this->unk_29E--;
- } else if (Math_ScaledStepToS(&this->unk_2A6, 0x3B00, (s32)(this->unk_2A6 * 0.09f) + 45)) {
- if (this->unk_2BC.y < this->actor.home.pos.y) {
+ } else if (this->timer > 0) {
+ this->timer--;
+ } else if (Math_ScaledStepToS(&this->angularVelocityY, 0x3B00, (s32)(this->angularVelocityY * 0.09f) + 45)) {
+ // If it's the first phase of the attack, rotate the Snapper to face the player and set the targetPos to a
+ // fixed position in that direction. This will make them charge towards the player once they start moving.
+ if (this->targetPos.y < this->actor.home.pos.y) {
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
- this->unk_2BC.x = (Math_SinS(this->actor.world.rot.y) * 360.0f) + this->actor.world.pos.x;
- this->unk_2BC.z = (Math_CosS(this->actor.world.rot.y) * 360.0f) + this->actor.world.pos.z;
+ this->targetPos.x = (Math_SinS(this->actor.world.rot.y) * 360.0f) + this->actor.world.pos.x;
+ this->targetPos.z = (Math_CosS(this->actor.world.rot.y) * 360.0f) + this->actor.world.pos.z;
}
- func_80AD792C(this);
+
+ EnKame_SetupAttack(this);
}
- this->actor.shape.rot.y += this->unk_2A6;
+ this->actor.shape.rot.y += this->angularVelocityY;
- if (!(this->unk_2BC.y < this->actor.home.pos.y) || (this->actionFunc != func_80AD7798)) {
- func_80AD7568(this);
+ // Calling EnKame_SetAttackSpeed will set the Snapper's speed based on its current angular velocity; since we are
+ // gradually scaling up the angular velocity, this would gradually scale up the speed as well. However, during the
+ // first phase of the attack, the Snapper should wait in place until it reaches its maximum angular velocity. This
+ // check will prevent us from changing the Snapper's speed during the first phase until we're just about to attack.
+ if (!(this->targetPos.y < this->actor.home.pos.y) || (this->actionFunc != EnKame_PrepareToAttack)) {
+ EnKame_SetAttackSpeed(this);
}
- func_80AD75A8(this, play);
+
+ EnKame_ProcessAttackEffects(this, play);
}
-void func_80AD792C(EnKame* this) {
- this->unk_29E = -1;
- this->actionFunc = func_80AD7948;
+void EnKame_SetupAttack(EnKame* this) {
+ this->targetAngularVelocityY = -1;
+ this->actionFunc = EnKame_Attack;
}
-void func_80AD7948(EnKame* this, PlayState* play) {
- s32 temp_v1;
+/**
+ * Moves the Snapper towards its target while spinning until it hits a wall or reaches the target. Once that happens,
+ * the Snapper will either reduce its angular velocity to 0x300 and prepare for the second phase of the attack (if the
+ * Snapper is currently in the first phase), or it will reduce its angular velocity to 0 and emerge from its shell (if
+ * the Snapper is currently in the second phase).
+ */
+void EnKame_Attack(EnKame* this, PlayState* play) {
+ this->actor.shape.rot.y += this->angularVelocityY;
+ EnKame_ProcessAttackEffects(this, play);
- this->actor.shape.rot.y += this->unk_2A6;
- func_80AD75A8(this, play);
+ if (this->targetAngularVelocityY == -1) {
+ s32 absYawToTarget;
+ s16 yawToTarget = Actor_WorldYawTowardPoint(&this->actor, &this->targetPos) - this->actor.world.rot.y;
- if (this->unk_29E == -1) {
- s16 temp_v0 = Actor_YawToPoint(&this->actor, &this->unk_2BC) - this->actor.world.rot.y;
+ absYawToTarget = ABS_ALT(yawToTarget);
- temp_v1 = ABS_ALT(temp_v0);
-
- if ((this->actor.bgCheckFlags & 8) || (temp_v1 > 0x3000) ||
- (Actor_XZDistanceToPoint(&this->actor, &this->unk_2BC) < 50.0f)) {
+ // If the yaw toward the targetPos is too large, that indicates the Snapper probably moved
+ // beyond its target (in other words, the target is now "behind" the Snapper).
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) || (absYawToTarget > 0x3000) ||
+ (Actor_WorldDistXZToPoint(&this->actor, &this->targetPos) < 50.0f)) {
s8 pad;
- if (this->unk_2BC.y < this->actor.home.pos.y) {
- this->unk_29E = 0x300;
+ if (this->targetPos.y < this->actor.home.pos.y) {
+ this->targetAngularVelocityY = 0x300;
} else {
- this->unk_29E = 0;
+ this->targetAngularVelocityY = 0;
}
}
return;
}
- if (Math_ScaledStepToS(&this->unk_2A6, this->unk_29E, (s32)(this->unk_2A6 * 0.09f) + 45)) {
- if (this->unk_29E == 0) {
- if (this->unk_2AC >= 1.0f) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PAMET_CUTTER_OFF);
+ if (Math_ScaledStepToS(&this->angularVelocityY, this->targetAngularVelocityY,
+ (s32)(this->angularVelocityY * 0.09f) + 45)) {
+ if (this->targetAngularVelocityY == 0) {
+ if (this->spikesScale >= 1.0f) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PAMET_CUTTER_OFF);
}
- this->unk_2AC -= 0.1f;
+
+ this->spikesScale -= 0.1f;
this->collider.base.atFlags &= ~AT_ON;
- if (this->unk_2AC < 0.5f) {
+ if (this->spikesScale < 0.5f) {
this->actor.flags &= ~ACTOR_FLAG_10;
- func_80AD7B18(this);
+ EnKame_SetupEmergeFromShell(this);
}
} else {
- func_80AD76CC(this);
+ EnKame_SetupPrepareToAttack(this);
}
}
- func_80AD7568(this);
+
+ EnKame_SetAttackSpeed(this);
}
-void func_80AD7B18(EnKame* this) {
+void EnKame_SetupEmergeFromShell(EnKame* this) {
this->actor.draw = EnKame_Draw;
- Animation_MorphToPlayOnce(&this->skelAnime1, &object_tl_Anim_0031DC, -3.0f);
- this->actor.speedXZ = 0.0f;
- this->unk_2AC = 0.1f;
- this->unk_2A8 = 1.0f;
+ Animation_MorphToPlayOnce(&this->snapperSkelAnime, &gSnapperEmergeFromShellAnim, -3.0f);
+ this->actor.speed = 0.0f;
+ this->limbScaleY = 0.1f;
+ this->limbScaleXZ = 1.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
- this->actionFunc = func_80AD7B90;
+ this->actionFunc = EnKame_EmergeFromShell;
}
-void func_80AD7B90(EnKame* this, PlayState* play) {
- if (SkelAnime_Update(&this->skelAnime1)) {
- func_80AD71B4(this);
- } else if (this->skelAnime1.curFrame > 7.0f) {
- this->unk_2AC = 1.5f - ((this->skelAnime1.curFrame - 7.0f) * (1.0f / 6));
- this->unk_2A8 = 1.5f - ((this->skelAnime1.curFrame - 7.0f) * (1.0f / 6));
+/**
+ * Plays the animation of the Snapper emerging from its shell, and scales its limbs appropriately to
+ * make it appear like its head and legs are coming out of the shell. Once the animation is over, this
+ * will make the Snapper start walking again.
+ */
+void EnKame_EmergeFromShell(EnKame* this, PlayState* play) {
+ if (SkelAnime_Update(&this->snapperSkelAnime)) {
+ EnKame_SetupWalk(this);
+ } else if (this->snapperSkelAnime.curFrame > 7.0f) {
+ this->limbScaleY = 1.5f - ((this->snapperSkelAnime.curFrame - 7.0f) * (1.0f / 6));
+ this->limbScaleXZ = 1.5f - ((this->snapperSkelAnime.curFrame - 7.0f) * (1.0f / 6));
} else {
- f32 frame = this->skelAnime1.curFrame;
+ f32 curFrame = this->snapperSkelAnime.curFrame;
- this->unk_2AC = (0.2f * frame) + 0.1f;
- this->unk_2A8 = ((1.0f / 14) * frame) + 1.0f;
+ this->limbScaleY = (0.2f * curFrame) + 0.1f;
+ this->limbScaleXZ = ((1.0f / 14) * curFrame) + 1.0f;
}
}
-void func_80AD7C54(EnKame* this) {
- if (this->actionFunc == func_80AD7E0C) {
- Animation_MorphToPlayOnce(&this->skelAnime1, &object_tl_Anim_0035EC, -3.0f);
- this->unk_29E = 1;
+void EnKame_SetupFlip(EnKame* this) {
+ if (this->actionFunc == EnKame_Struggle) {
+ Animation_MorphToPlayOnce(&this->snapperSkelAnime, &gSnapperBouncedUprightAnim, -3.0f);
+ this->flipType = EN_KAME_FLIP_TYPE_RIGHTSIDE_UP;
this->collider.info.bumper.dmgFlags &= ~0x8000;
} else {
- Animation_MorphToPlayOnce(&this->skelAnime1, &object_tl_Anim_0039C0, -3.0f);
- this->unk_29E = 0;
+ Animation_MorphToPlayOnce(&this->snapperSkelAnime, &gSnapperFlipOverAnim, -3.0f);
+ this->flipType = EN_KAME_FLIP_TYPE_UPSIDE_DOWN;
this->collider.info.bumper.dmgFlags |= 0x8000;
}
this->actor.draw = EnKame_Draw;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->collider.base.acFlags &= ~AC_ON;
this->collider.base.atFlags &= ~AT_ON;
this->collider.base.atFlags &= ~(AT_BOUNCED | AT_HIT);
this->actor.flags &= ~ACTOR_FLAG_10;
this->actor.shape.rot.z = 0;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PAMET_REVERSE);
- this->actionFunc = func_80AD7D40;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PAMET_REVERSE);
+ this->actionFunc = EnKame_Flip;
}
-void func_80AD7D40(EnKame* this, PlayState* play) {
- if (SkelAnime_Update(&this->skelAnime1)) {
- if (this->unk_29E == 1) {
- func_80AD71B4(this);
+/**
+ * If the Snapper is flipped upside-down, this will make it struggle for 200 frames once the flip animation ends.
+ * If the Snapper is flipped rightside-up, this will make it start walking once the flip animation ends.
+ */
+void EnKame_Flip(EnKame* this, PlayState* play) {
+ if (SkelAnime_Update(&this->snapperSkelAnime)) {
+ if (this->flipType == EN_KAME_FLIP_TYPE_RIGHTSIDE_UP) {
+ EnKame_SetupWalk(this);
} else {
- this->unk_29E = 200;
- func_80AD7DA4(this);
+ this->timer = 200;
+ EnKame_SetupStruggle(this);
}
}
}
-void func_80AD7DA4(EnKame* this) {
- Animation_MorphToPlayOnce(&this->skelAnime1, &object_tl_Anim_0027D8, -3.0f);
+void EnKame_SetupStruggle(EnKame* this) {
+ Animation_MorphToPlayOnce(&this->snapperSkelAnime, &gSnapperWiggleLegsAnim, -3.0f);
this->collider.base.acFlags |= AC_ON;
this->collider.base.acFlags &= ~AC_HARD;
this->collider.base.colType = COLTYPE_HIT6;
- this->actor.speedXZ = 0.0f;
- this->actionFunc = func_80AD7E0C;
+ this->actor.speed = 0.0f;
+ this->actionFunc = EnKame_Struggle;
}
-void func_80AD7E0C(EnKame* this, PlayState* play) {
- if (this->unk_29E > 0) {
- this->unk_29E--;
- if (SkelAnime_Update(&this->skelAnime1)) {
+/**
+ * Plays various struggling animations until the timer reaches 0, then it flips itself upright.
+ */
+void EnKame_Struggle(EnKame* this, PlayState* play) {
+ if (this->timer > 0) {
+ this->timer--;
+ if (SkelAnime_Update(&this->snapperSkelAnime)) {
if (Rand_ZeroOne() > 0.5f) {
- Animation_PlayOnce(&this->skelAnime1, &object_tl_Anim_0027D8);
+ Animation_PlayOnce(&this->snapperSkelAnime, &gSnapperWiggleLegsAnim);
} else {
- Animation_PlayOnce(&this->skelAnime1, &object_tl_Anim_002F88);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PAMET_ROAR);
+ Animation_PlayOnce(&this->snapperSkelAnime, &gSnapperFailToFlipUprightAnim);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PAMET_ROAR);
}
}
} else {
- func_80AD7EC0(this);
+ EnKame_SetupFlipUpright(this);
}
}
-void func_80AD7EC0(EnKame* this) {
- Animation_MorphToPlayOnce(&this->skelAnime1, &object_tl_Anim_002510, -3.0f);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PAMET_WAKEUP);
- this->actionFunc = func_80AD7F10;
+void EnKame_SetupFlipUpright(EnKame* this) {
+ Animation_MorphToPlayOnce(&this->snapperSkelAnime, &gSnapperFlipUprightAnim, -3.0f);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PAMET_WAKEUP);
+ this->actionFunc = EnKame_FlipUpright;
}
-void func_80AD7F10(EnKame* this, PlayState* play) {
- if (SkelAnime_Update(&this->skelAnime1)) {
+/**
+ * Plays the animation of the Snapper flipping itself upright, then transitions back to walking.
+ */
+void EnKame_FlipUpright(EnKame* this, PlayState* play) {
+ if (SkelAnime_Update(&this->snapperSkelAnime)) {
this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
- func_80AD71B4(this);
- } else if (this->skelAnime1.curFrame >= 10.0f) {
+ EnKame_SetupWalk(this);
+ } else if (this->snapperSkelAnime.curFrame >= 10.0f) {
+ // This is the part of the animation where the Snapper starts to flip itself
+ // upright. During this flip, this actor needs to manually control when
+ // ActorShadow_DrawCircle is called, so the shadowDraw pointer is set to NULL.
+ // See EnKame_PostLimbDraw and EnKame_Draw for more information.
this->actor.shape.shadowDraw = NULL;
this->collider.base.acFlags &= ~AC_ON;
this->collider.info.bumper.dmgFlags &= ~0x8000;
}
}
-void func_80AD7FA4(EnKame* this) {
- this->actor.speedXZ = 0.0f;
+void EnKame_SetupStunned(EnKame* this) {
+ this->actor.speed = 0.0f;
if (this->actor.velocity.y > 0.0f) {
this->actor.velocity.y = 0.0f;
}
+
func_800BE504(&this->actor, &this->collider);
- this->actionFunc = func_80AD7FF8;
+ this->actionFunc = EnKame_Stunned;
}
-void func_80AD7FF8(EnKame* this, PlayState* play) {
- if (this->unk_2A2 != 0) {
- this->unk_2A2--;
+/**
+ * Stops the Snapper's animation and locks it in place until the stun timer reaches zero. After that, the
+ * Snapper either dies (if the attack that stunned it reduced its health to 0) or goes back to struggling.
+ * If the Snapper dies in this state, it skips the "finishing blow" screen flash and game freeze.
+ */
+void EnKame_Stunned(EnKame* this, PlayState* play) {
+ if (this->stunTimer != 0) {
+ this->stunTimer--;
}
- if (this->unk_2A2 == 0) {
- func_80AD7018(this, play);
+ if (this->stunTimer == 0) {
+ EnKame_Thaw(this, play);
if (this->actor.colChkInfo.health == 0) {
- func_80AD8148(this, NULL);
+ EnKame_SetupDead(this, NULL);
} else {
this->actor.world.rot.y = this->actor.shape.rot.y;
- func_80AD7DA4(this);
+ EnKame_SetupStruggle(this);
}
}
}
-void func_80AD8060(EnKame* this) {
- s16 sp36 = Animation_GetLastFrame(&object_tl_Anim_0008B4);
+void EnKame_SetupDamaged(EnKame* this) {
+ s16 endFrame = Animation_GetLastFrame(&gSnapperDamageAnim);
- Animation_Change(&this->skelAnime1, &object_tl_Anim_0008B4, 1.0f, 0.0f, sp36, ANIMMODE_ONCE, -3.0f);
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, sp36);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PAMET_DAMAGE);
+ Animation_Change(&this->snapperSkelAnime, &gSnapperDamageAnim, 1.0f, 0.0f, endFrame, ANIMMODE_ONCE, -3.0f);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, endFrame);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PAMET_DAMAGE);
this->collider.base.acFlags &= ~AC_ON;
- this->actionFunc = func_80AD810C;
+ this->actionFunc = EnKame_Damaged;
}
-void func_80AD810C(EnKame* this, PlayState* play) {
- if (SkelAnime_Update(&this->skelAnime1)) {
- func_80AD7DA4(this);
+/**
+ * Plays the damaged animation, then goes back to struggling to flip itself upright.
+ */
+void EnKame_Damaged(EnKame* this, PlayState* play) {
+ if (SkelAnime_Update(&this->snapperSkelAnime)) {
+ EnKame_SetupStruggle(this);
}
}
-void func_80AD8148(EnKame* this, PlayState* play) {
- Animation_PlayLoop(&this->skelAnime1, &object_tl_Anim_000AF4);
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 20);
+void EnKame_SetupDead(EnKame* this, PlayState* play) {
+ Animation_PlayLoop(&this->snapperSkelAnime, &gSnapperDeathAnim);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 20);
this->collider.base.acFlags &= ~AC_ON;
this->collider.base.atFlags &= ~AT_ON;
this->collider.base.atFlags &= ~(AC_HARD | AC_HIT);
this->actor.velocity.y = 15.0f;
- this->actor.speedXZ = 1.5f;
+ this->actor.speed = 1.5f;
+
+ // This allows callers of this function to skip the "finishing blow" screen flash and game freeze as well
+ // as the rotation that happens if the Snapper is killed by a projectile. Only EnKame_Stunned calls this
+ // while passing NULL instead of play; in practice, this means that the only way to skip this code is to
+ // kill the Snapper with an Ice Arrow, since that's the only attack that both stuns it and deals damage.
if (play != NULL) {
Enemy_StartFinishingBlow(play, &this->actor);
- if (this->actor.draw == func_80AD8D64) {
+ if (this->actor.draw == EnKame_DrawSpikedSnapper) {
this->actor.draw = EnKame_Draw;
} else {
func_800BE504(&this->actor, &this->collider);
}
}
- this->actor.bgCheckFlags &= ~0x1;
- this->actor.flags &= ~ACTOR_FLAG_1;
+
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.flags |= ACTOR_FLAG_10;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PAMET_DEAD);
- this->unk_29E = 0;
- this->actionFunc = func_80AD825C;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PAMET_DEAD);
+ this->timer = 0;
+ this->actionFunc = EnKame_Dead;
}
-void func_80AD825C(EnKame* this, PlayState* play) {
- SkelAnime_Update(&this->skelAnime1);
- if ((this->actor.bgCheckFlags & 1) && (this->actor.velocity.y < 0.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_HIPLOOP_LAND);
- func_80AD8364(this);
+/**
+ * Launches the Snapper into the air and spins it around wildly. Makes the Snapper
+ * burst into flames once it touches the ground.
+ */
+void EnKame_Dead(EnKame* this, PlayState* play) {
+ SkelAnime_Update(&this->snapperSkelAnime);
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->actor.velocity.y < 0.0f)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_HIPLOOP_LAND);
+ EnKame_SetupBurstIntoFlames(this);
} else {
- if (this->unk_29E == 1) {
+ //! @bug unreachable code: EnKame_SetupDead sets this variable to 0, and no other code that runs
+ //! while the Snapper is in this state will change it to anything else.
+ if (this->timer == 1) {
this->actor.colorFilterTimer = 100;
} else if (this->actor.colorFilterTimer == 0) {
- Actor_SetColorFilter(&this->actor, 0xC000, 255, 0, 100);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_NONE, 255, COLORFILTER_BUFFLAG_OPA, 100);
}
+
this->actor.shape.rot.x += Rand_S16Offset(0x700, 0x1400);
this->actor.shape.rot.y += (s16)Rand_ZeroFloat(5120.0f);
this->actor.shape.rot.z += Rand_S16Offset(0x700, 0x1400);
}
}
-void func_80AD8364(EnKame* this) {
- this->unk_29E = 20;
- this->actor.speedXZ = 0.0f;
- this->actionFunc = func_80AD8388;
+void EnKame_SetupBurstIntoFlames(EnKame* this) {
+ this->timer = 20;
+ this->actor.speed = 0.0f;
+ this->actionFunc = EnKame_BurstIntoFlames;
}
-void func_80AD8388(EnKame* this, PlayState* play) {
- Vec3f sp34;
+/**
+ * After waiting for the timer to reach 0, this function gradually shrinks the actor
+ * and spawns blue flames around it. Once the Snapper shrinks enough, this drops a
+ * random item and kills the actor.
+ */
+void EnKame_BurstIntoFlames(EnKame* this, PlayState* play) {
+ Vec3f flamePos;
- SkelAnime_Update(&this->skelAnime1);
+ SkelAnime_Update(&this->snapperSkelAnime);
this->actor.colorFilterTimer = 100;
- if (this->unk_29E > 0) {
- this->unk_29E--;
- if (this->unk_29E == 0) {
+ if (this->timer > 0) {
+ this->timer--;
+ if (this->timer == 0) {
SoundSource_PlaySfxEachFrameAtFixedWorldPos(play, &this->actor.world.pos, 21,
NA_SE_EN_COMMON_EXTINCT_LEV - SFX_FLAG);
}
@@ -605,14 +750,15 @@ 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.y = this->actor.world.pos.y + 15.0f;
- sp34.z = randPlusMinusPoint5Scaled(40.0f) + this->actor.world.pos.z;
- func_800B3030(play, &sp34, &gZeroVec3f, &gZeroVec3f, 100, 0, 2);
+
+ flamePos.x = Rand_CenteredFloat(40.0f) + this->actor.world.pos.x;
+ flamePos.y = this->actor.world.pos.y + 15.0f;
+ flamePos.z = Rand_CenteredFloat(40.0f) + this->actor.world.pos.z;
+ func_800B3030(play, &flamePos, &gZeroVec3f, &gZeroVec3f, 100, 0, 2);
}
}
-void func_80AD84C0(EnKame* this, PlayState* play) {
+void EnKame_UpdateDamage(EnKame* this, PlayState* play) {
if (this->collider.base.acFlags & AC_HIT) {
this->collider.base.acFlags &= ~AC_HIT;
@@ -622,63 +768,64 @@ void func_80AD84C0(EnKame* this, PlayState* play) {
return;
}
- func_80AD7018(this, play);
- if (this->actor.colChkInfo.damageEffect == 13) {
+ EnKame_Thaw(this, play);
+ if (this->actor.colChkInfo.damageEffect == EN_KAME_DMGEFF_HOOKSHOT) {
return;
}
- if (this->actor.colChkInfo.damageEffect == 14) {
- func_80AD8148(this, play);
- } else if (this->actor.colChkInfo.damageEffect == 15) {
+ if (this->actor.colChkInfo.damageEffect == EN_KAME_DMGEFF_INSTANT_KILL) {
+ EnKame_SetupDead(this, play);
+ } else if (this->actor.colChkInfo.damageEffect == EN_KAME_DMGEFF_FLIP_OVER) {
if (this->collider.base.acFlags & AC_HARD) {
- func_80AD7C54(this);
+ EnKame_SetupFlip(this);
} else if (!Actor_ApplyDamage(&this->actor)) {
- func_80AD8148(this, play);
+ EnKame_SetupDead(this, play);
} else {
- func_80AD8060(this);
+ EnKame_SetupDamaged(this);
}
- } else if ((this->actionFunc == func_80AD70EC) || (this->actionFunc == func_80AD7254)) {
- func_80AD73A8(this);
- this->unk_29E = 21;
+ } else if ((this->actionFunc == EnKame_Idle) || (this->actionFunc == EnKame_Walk)) {
+ EnKame_SetupRetreatIntoShell(this);
+ this->timer = 21;
} else if (!(this->collider.base.acFlags & AC_HARD)) {
- if (this->actor.colChkInfo.damageEffect == 5) {
- this->unk_2A2 = 40;
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 40);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ if (this->actor.colChkInfo.damageEffect == EN_KAME_DMGEFF_ELECTRIC_STUN) {
+ this->stunTimer = 40;
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
this->drawDmgEffScale = 0.6f;
this->drawDmgEffAlpha = 2.0f;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_SMALL;
- func_80AD7FA4(this);
- } else if (this->actor.colChkInfo.damageEffect == 1) {
- this->unk_2A2 = 40;
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 40);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
- func_80AD7FA4(this);
- } else if (this->actor.colChkInfo.damageEffect == 3) {
- func_80AD6F9C(this);
+ EnKame_SetupStunned(this);
+ } else if (this->actor.colChkInfo.damageEffect == EN_KAME_DMGEFF_STUN) {
+ this->stunTimer = 40;
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ EnKame_SetupStunned(this);
+ } else if (this->actor.colChkInfo.damageEffect == EN_KAME_DMGEFF_FREEZE) {
+ EnKame_Freeze(this);
if (!Actor_ApplyDamage(&this->actor)) {
- this->unk_2A2 = 3;
+ this->stunTimer = 3;
this->collider.base.acFlags &= ~AC_ON;
}
- func_80AD7FA4(this);
+
+ EnKame_SetupStunned(this);
} else {
- if (this->actor.colChkInfo.damageEffect == 2) {
+ if (this->actor.colChkInfo.damageEffect == EN_KAME_DMGEFF_FIRE) {
this->drawDmgEffScale = 0.6f;
this->drawDmgEffAlpha = 4.0f;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
- } else if (this->actor.colChkInfo.damageEffect == 4) {
+ } else if (this->actor.colChkInfo.damageEffect == EN_KAME_DMGEFF_LIGHT_ORB) {
this->drawDmgEffScale = 0.6f;
this->drawDmgEffAlpha = 4.0f;
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);
+ CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
}
if (!Actor_ApplyDamage(&this->actor)) {
- func_80AD8148(this, play);
+ EnKame_SetupDead(this, play);
} else {
- func_80AD8060(this);
+ EnKame_SetupDamaged(this);
}
}
}
@@ -686,8 +833,8 @@ void func_80AD84C0(EnKame* this, PlayState* play) {
if ((play->actorCtx.unk2 != 0) && (this->actor.xyzDistToPlayerSq < SQ(200.0f)) &&
(this->collider.base.acFlags & AC_ON)) {
- func_80AD7018(this, play);
- func_80AD7C54(this);
+ EnKame_Thaw(this, play);
+ EnKame_SetupFlip(this);
}
}
@@ -695,29 +842,32 @@ void EnKame_Update(Actor* thisx, PlayState* play) {
s32 pad;
EnKame* this = THIS;
- func_80AD6F34(this);
+ EnKame_Blink(this);
- if (this->unk_2A0 != 0) {
- this->unk_2A0--;
- }
+ DECR(this->voiceTimer);
- func_80AD84C0(this, play);
+ EnKame_UpdateDamage(this, play);
if ((this->collider.base.atFlags & AT_HIT) && (this->collider.base.atFlags & AT_BOUNCED)) {
this->collider.base.atFlags &= ~(AT_BOUNCED | AT_HIT);
- func_80AD76CC(this);
- if (Actor_XZDistanceToPoint(&this->actor, &this->unk_2BC) < 50.0f) {
+ EnKame_SetupPrepareToAttack(this);
+ if (Actor_WorldDistXZToPoint(&this->actor, &this->targetPos) < 50.0f) {
this->collider.base.atFlags &= ~AT_ON;
}
- this->unk_2A6 = 0x3B00;
- func_80AD7568(this);
+
+ this->angularVelocityY = 0x3B00;
+ EnKame_SetAttackSpeed(this);
}
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);
+ // When the Snapper is in the middle of the animation where it's flipping upright,
+ // setting the focus and updating the collider is handled in EnKame_Draw instead.
if (this->actor.shape.shadowDraw != NULL) {
Actor_SetFocus(&this->actor, 25.0f);
Collider_UpdateCylinder(&this->actor, &this->collider);
@@ -742,102 +892,149 @@ void EnKame_Update(Actor* thisx, PlayState* play) {
} else {
this->drawDmgEffScale = this->drawDmgEffScale;
}
- } else if (!Math_StepToF(&this->drawDmgEffFrozenSteamScale, 0.6f, 0.015000001f)) {
- func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ } else if (!Math_StepToF(&this->drawDmgEffFrozenSteamScale, 0.6f, 15.0f * 0.001f)) {
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
}
}
-s32 func_80AD8A48(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
+s32 EnKame_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnKame* this = THIS;
- if ((this->actionFunc == func_80AD7424) || (this->actionFunc == func_80AD7B90)) {
- if (limbIndex == 2) {
- Matrix_Scale(this->unk_2A8, this->unk_2AC, this->unk_2A8, MTXMODE_APPLY);
- } else if ((limbIndex == 11) || (limbIndex == 9) || (limbIndex == 7) || (limbIndex == 5)) {
- Matrix_Scale(this->unk_2A8, this->unk_2AC, this->unk_2AC, MTXMODE_APPLY);
+ if ((this->actionFunc == EnKame_RetreatIntoShell) || (this->actionFunc == EnKame_EmergeFromShell)) {
+ if (limbIndex == SNAPPER_LIMB_HEAD) {
+ Matrix_Scale(this->limbScaleXZ, this->limbScaleY, this->limbScaleXZ, MTXMODE_APPLY);
+ } else if ((limbIndex == SNAPPER_LIMB_BACK_RIGHT_LEG) || (limbIndex == SNAPPER_LIMB_BACK_LEFT_LEG) ||
+ (limbIndex == SNAPPER_LIMB_FRONT_RIGHT_LEG) || (limbIndex == SNAPPER_LIMB_FRONT_LEFT_LEG)) {
+ Matrix_Scale(this->limbScaleXZ, this->limbScaleY, this->limbScaleY, MTXMODE_APPLY);
}
}
+
return false;
}
-void func_80AD8AF8(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
- static Vec3f D_80AD8E68[] = {
- { 1500.0f, 0.0f, -2000.0f }, { 1500.0f, 0.0f, 2000.0f }, { 1500.0f, 2000.0f, 0.0f },
- { 1500.0f, -2000.0f, 0.0f }, { 2500.0f, 0.0f, 0.0f },
- };
- static s8 D_80AD8EA4[] = { -1, -1, -1, 0, -1, -1, 1, -1, 2, -1, 3, -1, 4 };
+/**
+ * Five of the entries in the body parts array are used for rendering
+ * multiple effects on the Snapper's body limb. The positions of these
+ * effects are offset from the body limb using the values in this array.
+ */
+static Vec3f sBodyLimbBodyPartOffsets[] = {
+ { 1500.0f, 0.0f, -2000.0f }, // SNAPPER_BODYPART_BODY_1
+ { 1500.0f, 0.0f, 2000.0f }, // SNAPPER_BODYPART_BODY_2
+ { 1500.0f, 2000.0f, 0.0f }, // SNAPPER_BODYPART_BODY_3
+ { 1500.0f, -2000.0f, 0.0f }, // SNAPPER_BODYPART_BODY_4
+ { 2500.0f, 0.0f, 0.0f }, // SNAPPER_BODYPART_BODY_5
+};
+
+static s8 sLimbToBodyParts[SNAPPER_LIMB_MAX] = {
+ BODYPART_NONE, // SNAPPER_LIMB_NONE
+ BODYPART_NONE, // SNAPPER_LIMB_BODY
+ BODYPART_NONE, // SNAPPER_LIMB_HEAD
+ SNAPPER_BODYPART_JAW, // SNAPPER_LIMB_JAW
+ BODYPART_NONE, // SNAPPER_LIMB_EYES
+ BODYPART_NONE, // SNAPPER_LIMB_FRONT_LEFT_LEG
+ SNAPPER_BODYPART_FRONT_LEFT_FOOT, // SNAPPER_LIMB_FRONT_LEFT_FOOT
+ BODYPART_NONE, // SNAPPER_LIMB_FRONT_RIGHT_LEG
+ SNAPPER_BODYPART_FRONT_RIGHT_FOOT, // SNAPPER_LIMB_FRONT_RIGHT_FOOT
+ BODYPART_NONE, // SNAPPER_LIMB_BACK_LEFT_LEG
+ SNAPPER_BODYPART_BACK_LEFT_FOOT, // SNAPPER_LIMB_BACK_LEFT_FOOT
+ BODYPART_NONE, // SNAPPER_LIMB_BACK_RIGHT_LEG
+ SNAPPER_BODYPART_BACK_RIGHT_FOOT, // SNAPPER_LIMB_BACK_RIGHT_FOOT
+};
+
+void EnKame_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnKame* this = THIS;
- if (D_80AD8EA4[limbIndex] != -1) {
- Matrix_MultZero(&this->limbPos[D_80AD8EA4[limbIndex]]);
+ if (sLimbToBodyParts[limbIndex] != BODYPART_NONE) {
+ Matrix_MultZero(&this->bodyPartsPos[sLimbToBodyParts[limbIndex]]);
}
- if (limbIndex == 1) {
+ if (limbIndex == SNAPPER_LIMB_BODY) {
s32 i;
- Vec3f* ptr;
- Vec3f* ptr2;
+ Vec3f* bodyPartsPosPtr;
+ Vec3f* bodyLimbOffsetsPtr;
+ // When the Snapper is flipping itself upright, the animation will make it appear
+ // as if it is jumping off the ground. This is purely visual, though, so if we do
+ // nothing, the actor's position won't actually change during this apparent "jump",
+ // which causes certain things like the circle shadow and the actor's focus to look
+ // incorrect. To fix this, we temporarily adjust the actor's position during this
+ // animation so that everything looks correct. This position change is overridden
+ // at the end of EnKame_Draw, so from the perspective of most other functions,
+ // nothing really changes.
if (this->actor.shape.shadowDraw == NULL) {
Matrix_MultZero(&this->actor.world.pos);
}
- ptr2 = D_80AD8E68;
- ptr = &this->limbPos[5];
- for (i = 0; i < ARRAY_COUNT(D_80AD8E68); i++) {
- Matrix_MultVec3f(ptr2, ptr);
- ptr2++;
- ptr++;
+ bodyLimbOffsetsPtr = sBodyLimbBodyPartOffsets;
+ bodyPartsPosPtr = &this->bodyPartsPos[SNAPPER_BODYPART_BODY_1];
+ for (i = 0; i < ARRAY_COUNT(sBodyLimbBodyPartOffsets); i++) {
+ Matrix_MultVec3f(bodyLimbOffsetsPtr, bodyPartsPosPtr);
+ bodyLimbOffsetsPtr++;
+ bodyPartsPosPtr++;
}
}
}
void EnKame_Draw(Actor* thisx, PlayState* play) {
EnKame* this = THIS;
- Vec3f sp40;
+ Vec3f originalPos;
- if (this->actor.shape.shadowDraw == 0) {
- Math_Vec3f_Copy(&sp40, &this->actor.world.pos);
+ // If the Snapper is flipping itself upright, we'll update its position inside EnKame_PostLimbDraw
+ // to make it better match the "jump" that it does in the animation. We want to make sure that its
+ // original position is restored before we exit this function, however, so we save it here before
+ // we ever call EnKame_PostLimbDraw.
+ if (this->actor.shape.shadowDraw == NULL) {
+ Math_Vec3f_Copy(&originalPos, &this->actor.world.pos);
}
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]);
+ gSPSegment(POLY_OPA_DISP++, 0x08, sEyeTextures[this->eyeIndex]);
- SkelAnime_DrawFlexOpa(play, this->skelAnime1.skeleton, this->skelAnime1.jointTable, this->skelAnime1.dListCount,
- func_80AD8A48, func_80AD8AF8, &this->actor);
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), this->drawDmgEffScale,
+ SkelAnime_DrawFlexOpa(play, this->snapperSkelAnime.skeleton, this->snapperSkelAnime.jointTable,
+ this->snapperSkelAnime.dListCount, EnKame_OverrideLimbDraw, EnKame_PostLimbDraw,
+ &this->actor);
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, SNAPPER_BODYPART_MAX, this->drawDmgEffScale,
this->drawDmgEffFrozenSteamScale, this->drawDmgEffAlpha, this->drawDmgEffType);
+ // The Snapper is in the middle of the animation where it's flipping upright, and we updated its position
+ // in EnKame_PostLimbDraw as explained earlier. We draw the circle shadow, set the focus, and update its
+ // collider; all of these rely on the Snapper's position being updated earlier to match the "jump" that it
+ // does in its animation. Once we're done, we restore the Snappper's position back to what it was before
+ // because we want other functions to act like the position never changed.
if (this->actor.shape.shadowDraw == NULL) {
ActorShadow_DrawCircle(&this->actor, NULL, play);
Actor_SetFocus(&this->actor, 25.0f);
Collider_UpdateCylinder(&this->actor, &this->collider);
- Math_Vec3f_Copy(&this->actor.world.pos, &sp40);
+ Math_Vec3f_Copy(&this->actor.world.pos, &originalPos);
}
CLOSE_DISPS(play->state.gfxCtx);
}
-s32 Enkame_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
+s32 EnKame_SpikedSnapperOverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot,
+ Actor* thisx) {
EnKame* this = THIS;
- if (limbIndex == 1) {
+ if (limbIndex == SPIKED_SNAPPER_LIMB_BODY) {
pos->y -= 700.0f;
}
- if ((this->unk_2AC != 1.0f) && (limbIndex == 3)) {
- Matrix_Scale(1.0f, this->unk_2AC, this->unk_2AC, MTXMODE_APPLY);
+ if ((this->spikesScale != 1.0f) && (limbIndex == SPIKED_SNAPPER_LIMB_SPIKES)) {
+ Matrix_Scale(1.0f, this->spikesScale, this->spikesScale, MTXMODE_APPLY);
}
+
return false;
}
-void func_80AD8D64(Actor* thisx, PlayState* play) {
+void EnKame_DrawSpikedSnapper(Actor* thisx, PlayState* play) {
EnKame* this = THIS;
- func_8012C28C(play->state.gfxCtx);
- SkelAnime_DrawFlexOpa(play, this->skelAnime2.skeleton, this->skelAnime2.jointTable, this->skelAnime2.dListCount,
- Enkame_OverrideLimbDraw, NULL, &this->actor);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ SkelAnime_DrawFlexOpa(play, this->spikedSnapperSkelAnime.skeleton, this->spikedSnapperSkelAnime.jointTable,
+ this->spikedSnapperSkelAnime.dListCount, EnKame_SpikedSnapperOverrideLimbDraw, NULL,
+ &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Kame/z_en_kame.h b/src/overlays/actors/ovl_En_Kame/z_en_kame.h
index b6ebc3a23..2ca2f4047 100644
--- a/src/overlays/actors/ovl_En_Kame/z_en_kame.h
+++ b/src/overlays/actors/ovl_En_Kame/z_en_kame.h
@@ -2,34 +2,56 @@
#define Z_EN_KAME_H
#include "global.h"
+#include "objects/object_tl/object_tl.h"
struct EnKame;
typedef void (*EnKameActionFunc)(struct EnKame*, PlayState*);
+typedef enum SnapperBodyPart {
+ /* 0 */ SNAPPER_BODYPART_JAW,
+ /* 1 */ SNAPPER_BODYPART_FRONT_LEFT_FOOT,
+ /* 2 */ SNAPPER_BODYPART_FRONT_RIGHT_FOOT,
+ /* 3 */ SNAPPER_BODYPART_BACK_LEFT_FOOT,
+ /* 4 */ SNAPPER_BODYPART_BACK_RIGHT_FOOT,
+ /* 5 */ SNAPPER_BODYPART_BODY_1,
+ /* 6 */ SNAPPER_BODYPART_BODY_2,
+ /* 7 */ SNAPPER_BODYPART_BODY_3,
+ /* 8 */ SNAPPER_BODYPART_BODY_4,
+ /* 9 */ SNAPPER_BODYPART_BODY_5,
+ /* 10 */ SNAPPER_BODYPART_MAX
+} SnapperBodyPart;
+
typedef struct EnKame {
/* 0x000 */ Actor actor;
- /* 0x144 */ SkelAnime skelAnime1;
- /* 0x188 */ Vec3s jointTable1[13];
- /* 0x1D6 */ Vec3s morphTable1[13];
- /* 0x224 */ SkelAnime skelAnime2;
- /* 0x268 */ Vec3s jointTable2[4];
- /* 0x280 */ Vec3s morphTable2[4];
+ /* 0x144 */ SkelAnime snapperSkelAnime;
+ /* 0x188 */ Vec3s snapperJointTable[SNAPPER_LIMB_MAX];
+ /* 0x1D6 */ Vec3s snapperMorphTable[SNAPPER_LIMB_MAX];
+ /* 0x224 */ SkelAnime spikedSnapperSkelAnime;
+ /* 0x268 */ Vec3s spikedSnapperJointTable[SPIKED_SNAPPER_LIMB_MAX];
+ /* 0x280 */ Vec3s spikedSnapperMorphTable[SPIKED_SNAPPER_LIMB_MAX];
/* 0x298 */ EnKameActionFunc actionFunc;
- /* 0x29C */ u8 unk_29C;
+ /* 0x29C */ u8 eyeIndex;
/* 0x29D */ u8 drawDmgEffType;
- /* 0x29E */ s16 unk_29E;
- /* 0x2A0 */ s16 unk_2A0;
- /* 0x2A2 */ s16 unk_2A2;
- /* 0x2A4 */ s16 unk_2A4;
- /* 0x2A6 */ s16 unk_2A6;
- /* 0x2A8 */ f32 unk_2A8;
- /* 0x2AC */ f32 unk_2AC;
+ /* 0x29E */ union {
+ s16 timer;
+ s16 targetAngularVelocityY;
+ s16 flipType;
+ };
+ /* 0x2A0 */ s16 voiceTimer;
+ /* 0x2A2 */ s16 stunTimer;
+ /* 0x2A4 */ s16 targetRotY;
+ /* 0x2A6 */ s16 angularVelocityY;
+ /* 0x2A8 */ f32 limbScaleXZ;
+ /* 0x2AC */ union {
+ f32 limbScaleY; // used the Snapper's regular form (i.e., when it's walking around on its legs)
+ f32 spikesScale; // used for the Snapper's "spiked" form
+ };
/* 0x2B0 */ f32 drawDmgEffAlpha;
/* 0x2B4 */ f32 drawDmgEffScale;
/* 0x2B8 */ f32 drawDmgEffFrozenSteamScale;
- /* 0x2BC */ Vec3f unk_2BC;
- /* 0x2C8 */ Vec3f limbPos[10];
+ /* 0x2BC */ Vec3f targetPos; // this actor relies on the y-position of this variable to be set in a specific way, see EnKame_SetupPrepareToAttack
+ /* 0x2C8 */ Vec3f bodyPartsPos[SNAPPER_BODYPART_MAX];
/* 0x340 */ ColliderCylinder collider;
} EnKame; // size = 0x38C
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 54df1bcd7..cd34383be 100644
--- a/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c
+++ b/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c
@@ -8,7 +8,7 @@
#include "objects/object_kanban/object_kanban.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnKanban*)thisx)
@@ -50,8 +50,9 @@ static ColliderCylinderInit sCylinderInit = {
};
static u16 sPartFlags[] = {
- PART_UPPER_LEFT, PART_LEFT_UPPER, PART_LEFT_LOWER, PART_RIGHT_UPPER, PART_RIGHT_LOWER, PART_LOWER_LEFT,
- PART_UPPER_RIGHT, PART_LOWER_RIGHT, PART_POST_UPPER, PART_POST_LOWER, PART_POST_STAND,
+ PART_UPPER_SIDE_LEFT, PART_LEFT_SIDE_UPPER, PART_LEFT_SIDE_LOWER, PART_RIGHT_SIDE_UPPER,
+ PART_RIGHT_SIDE_LOWER, PART_LOWER_SIDE_LEFT, PART_UPPER_SIDE_RIGHT, PART_LOWER_SIDE_RIGHT,
+ PART_POST_UPPER, PART_POST_LOWER, PART_POST_STAND,
};
static Vec3f sPieceOffsets[] = {
@@ -135,8 +136,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);
}
}
@@ -145,8 +146,8 @@ void EnKanban_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 0.01f);
if (this->actor.params != ENKANBAN_PIECE) {
- this->actor.targetMode = 0;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.targetMode = TARGET_MODE_0;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->unk_19A = Rand_ZeroFloat(1.9f);
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
@@ -163,7 +164,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);
}
}
@@ -186,7 +187,7 @@ void func_80954BE8(EnKanban* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->msgFlag = true;
} else {
- func_800B8614(&this->actor, play, 68.0f);
+ Actor_OfferTalk(&this->actor, play, 68.0f);
}
}
} else {
@@ -198,20 +199,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++;
@@ -230,7 +227,7 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
}
if (this->zTargetTimer == 1) {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
if (this->partFlags == 0xFFFF) {
@@ -293,40 +290,48 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
this->zTargetTimer = 10;
}
- if ((piece->partFlags & PART_UPPER_LEFT) && (piece->partFlags & PART_LOWER_RIGHT)) {
+ if ((piece->partFlags & PART_UPPER_SIDE_LEFT) && (piece->partFlags & PART_LOWER_SIDE_RIGHT)) {
piece->pieceType = PIECE_WHOLE_SIGN;
- } else if ((piece->partFlags & PART_LEFT_UPPER) && (piece->partFlags & PART_RIGHT_UPPER)) {
+ } else if ((piece->partFlags & PART_LEFT_SIDE_UPPER) &&
+ (piece->partFlags & PART_RIGHT_SIDE_UPPER)) {
piece->pieceType = PIECE_UPPER_HALF;
- } else if ((piece->partFlags & PART_LEFT_LOWER) && (piece->partFlags & PART_RIGHT_LOWER)) {
+ } else if ((piece->partFlags & PART_LEFT_SIDE_LOWER) &&
+ (piece->partFlags & PART_RIGHT_SIDE_LOWER)) {
piece->pieceType = PIECE_LOWER_HALF;
- } else if ((piece->partFlags & PART_UPPER_RIGHT) && (piece->partFlags & PART_LOWER_RIGHT)) {
+ } else if ((piece->partFlags & PART_UPPER_SIDE_RIGHT) &&
+ (piece->partFlags & PART_LOWER_SIDE_RIGHT)) {
piece->pieceType = PIECE_RIGHT_HALF;
- } else if ((piece->partFlags & PART_UPPER_LEFT) && (piece->partFlags & PART_LOWER_LEFT)) {
+ } else if ((piece->partFlags & PART_UPPER_SIDE_LEFT) &&
+ (piece->partFlags & PART_LOWER_SIDE_LEFT)) {
piece->pieceType = PIECE_LEFT_HALF;
- } else if ((piece->partFlags & PART_UPPER_LEFT) && (piece->partFlags & PART_LEFT_UPPER)) {
+ } else if ((piece->partFlags & PART_UPPER_SIDE_LEFT) &&
+ (piece->partFlags & PART_LEFT_SIDE_UPPER)) {
piece->pieceType = PIECE_2ND_QUAD;
- } else if ((piece->partFlags & PART_UPPER_RIGHT) && (piece->partFlags & PART_RIGHT_UPPER)) {
+ } else if ((piece->partFlags & PART_UPPER_SIDE_RIGHT) &&
+ (piece->partFlags & PART_RIGHT_SIDE_UPPER)) {
piece->pieceType = PIECE_1ST_QUAD;
- } else if ((piece->partFlags & PART_LEFT_LOWER) && (piece->partFlags & PART_LOWER_LEFT)) {
+ } else if ((piece->partFlags & PART_LEFT_SIDE_LOWER) &&
+ (piece->partFlags & PART_LOWER_SIDE_LEFT)) {
piece->pieceType = PIECE_3RD_QUAD;
- } else if ((piece->partFlags & PART_RIGHT_LOWER) && (piece->partFlags & PART_LOWER_RIGHT)) {
+ } else if ((piece->partFlags & PART_RIGHT_SIDE_LOWER) &&
+ (piece->partFlags & PART_LOWER_SIDE_RIGHT)) {
piece->pieceType = PIECE_4TH_QUAD;
- } else if (piece->partFlags & PART_UPPER_LEFT) {
- piece->pieceType = PIECE_UPPER_LEFT;
- } else if (piece->partFlags & PART_LEFT_UPPER) {
- piece->pieceType = PIECE_LEFT_UPPER;
- } else if (piece->partFlags & PART_LEFT_LOWER) {
- piece->pieceType = PIECE_LEFT_LOWER;
- } else if (piece->partFlags & PART_LOWER_LEFT) {
- piece->pieceType = PIECE_LOWER_LEFT;
- } else if (piece->partFlags & PART_UPPER_RIGHT) {
- piece->pieceType = PIECE_UPPER_RIGHT;
- } else if (piece->partFlags & PART_RIGHT_UPPER) {
- piece->pieceType = PIECE_RIGHT_UPPER;
- } else if (piece->partFlags & PART_RIGHT_LOWER) {
- piece->pieceType = PIECE_RIGHT_LOWER;
- } else if (piece->partFlags & PART_LOWER_RIGHT) {
- piece->pieceType = PIECE_LOWER_RIGHT;
+ } else if (piece->partFlags & PART_UPPER_SIDE_LEFT) {
+ piece->pieceType = PIECE_UPPER_SIDE_LEFT;
+ } else if (piece->partFlags & PART_LEFT_SIDE_UPPER) {
+ piece->pieceType = PIECE_LEFT_SIDE_UPPER;
+ } else if (piece->partFlags & PART_LEFT_SIDE_LOWER) {
+ piece->pieceType = PIECE_LEFT_SIDE_LOWER;
+ } else if (piece->partFlags & PART_LOWER_SIDE_LEFT) {
+ piece->pieceType = PIECE_LOWER_SIDE_LEFT;
+ } else if (piece->partFlags & PART_UPPER_SIDE_RIGHT) {
+ piece->pieceType = PIECE_UPPER_SIDE_RIGHT;
+ } else if (piece->partFlags & PART_RIGHT_SIDE_UPPER) {
+ piece->pieceType = PIECE_RIGHT_SIDE_UPPER;
+ } else if (piece->partFlags & PART_RIGHT_SIDE_LOWER) {
+ piece->pieceType = PIECE_RIGHT_SIDE_LOWER;
+ } else if (piece->partFlags & PART_LOWER_SIDE_RIGHT) {
+ piece->pieceType = PIECE_LOWER_SIDE_RIGHT;
} else if (piece->partFlags & PART_POST_UPPER) {
piece->pieceType = PIECE_POST_UPPER;
} else if (piece->partFlags & PART_POST_LOWER) {
@@ -354,15 +359,15 @@ 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)) {
piece->actor.velocity.y = Rand_ZeroFloat(3.0f) + 6.0f;
- piece->actor.speedXZ = Rand_ZeroFloat(4.0f) + 6.0f;
+ piece->actor.speed = Rand_ZeroFloat(4.0f) + 6.0f;
} else {
piece->actor.velocity.y = Rand_ZeroFloat(2.0f) + 3.0f;
- piece->actor.speedXZ = Rand_ZeroFloat(2.0f) + 3.0f;
+ piece->actor.speed = Rand_ZeroFloat(2.0f) + 3.0f;
}
if (piece->partCount >= 4) {
@@ -373,7 +378,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;
@@ -381,10 +386,10 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
piece->direction = -1;
}
piece->airTimer = 100;
- piece->actor.flags &= ~ACTOR_FLAG_1;
+ piece->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
piece->actor.flags |= ACTOR_FLAG_2000000;
this->cutMarkTimer = 5;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_SWORD_STRIKE);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_SWORD_STRIKE);
}
}
}
@@ -397,7 +402,7 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
if (this->actor.xzDistToPlayer > 500.0f) {
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->partFlags = 0xFFFF;
}
@@ -423,8 +428,8 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
f32 tempY;
f32 tempZ;
f32 tempWaterDepth;
- u16 tempBgFlags;
- u8 onGround;
+ s32 pad2;
+ u16 bgCheckFlags;
if (this->unk_198 != 0) {
this->actor.velocity.y = -2.0f;
@@ -433,121 +438,122 @@ 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;
tempZ = this->actor.world.pos.z;
- tempBgFlags = this->actor.bgCheckFlags;
+ bgCheckFlags = this->actor.bgCheckFlags;
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;
this->actor.world.pos.y = tempY;
this->actor.world.pos.z = tempZ;
- this->actor.bgCheckFlags = tempBgFlags;
+ this->actor.bgCheckFlags = bgCheckFlags;
this->actor.depthInWater = tempWaterDepth;
- if (1) {}
+ if (1) {
+ u8 onGround = (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND);
- onGround = (this->actor.bgCheckFlags & 1);
-
- 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 & 8) {
- if (!(this->actor.bgCheckFlags & 1)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_WOODPLATE_BOUND);
- }
- this->actor.speedXZ *= -0.5f;
- }
-
- if (this->actor.bgCheckFlags & 0x40) {
- this->actionState = ENKANBAN_WATER;
- Actor_PlaySfxAtPos(&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.speedXZ = 0.0f;
- } else if ((this->floorRot.x > 0.1f) || (this->floorRot.z > 0.1f)) {
- this->airTimer = 10;
- if (this->actor.bgCheckFlags & 8) {
- this->actionState = ENKANBAN_GROUND;
- this->actor.speedXZ = 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);
@@ -556,88 +562,89 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
Math_ApproachF(&this->actor.velocity.z, spC8.z, 0.5f, (KREG(21) * 0.01f) + 0.3f);
this->actor.world.rot.y = Math_Atan2S(spC8.x, spC8.z);
this->unk_198 = 1;
- this->actor.speedXZ = sqrtf(SQXZ(this->actor.velocity));
+ 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.speedXZ, 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 * 0x4000, 1, 0x2000);
} else {
- this->actor.speedXZ *= 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_PlaySfxAtPos(&this->actor, NA_SE_PL_WALK_SNOW);
+ Actor_PlaySfx(&this->actor, NA_SE_PL_WALK_GROUND + SURFACE_SFX_OFFSET_SNOW);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_WOODPLATE_BOUND);
+ 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 +662,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 +673,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) {
@@ -687,38 +694,39 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
s16 rippleDelay;
s32 rippleScale;
- if ((player->actor.speedXZ > 0.0f) && (player->actor.world.pos.y < this->actor.world.pos.y) &&
+ if ((player->actor.speed > 0.0f) && (player->actor.world.pos.y < this->actor.world.pos.y) &&
(this->actor.xyzDistToPlayerSq < SQ(50.0f))) {
- Math_ApproachF(&this->actor.speedXZ, player->actor.speedXZ, 1.0f, 0.2f);
- if (this->actor.speedXZ > 1.0f) {
- this->actor.speedXZ = 1.0f;
+ Math_ApproachF(&this->actor.speed, player->actor.speed, 1.0f, 0.2f);
+ if (this->actor.speed > 1.0f) {
+ this->actor.speed = 1.0f;
}
if (Math_SmoothStepToS(&this->actor.world.rot.y, BINANG_ROT180(this->actor.yawTowardsPlayer), 1,
0x1000, 0) > 0) {
- this->spinVel.y = this->actor.speedXZ * 1000.0f;
+ this->spinVel.y = this->actor.speed * 1000.0f;
} else {
- this->spinVel.y = this->actor.speedXZ * -1000.0f;
+ this->spinVel.y = this->actor.speed * -1000.0f;
}
}
- if (this->actor.bgCheckFlags & 1) {
- this->actor.speedXZ = 0.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->actor.speed = 0.0f;
}
Actor_MoveWithGravity(&this->actor);
- if (this->actor.speedXZ != 0.0f) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 50.0f, 5);
- if (this->actor.bgCheckFlags & 8) {
- this->actor.speedXZ *= -0.5f;
+ if (this->actor.speed != 0.0f) {
+ 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) {
this->spinVel.y = -2000;
} else {
this->spinVel.y = 2000;
}
}
- Math_ApproachZeroF(&this->actor.speedXZ, 1.0f, 0.15f);
+ Math_ApproachZeroF(&this->actor.speed, 1.0f, 0.15f);
}
this->actor.shape.rot.y += this->spinVel.y;
Math_ApproachS(&this->spinVel.y, 0, 1, 0x3A);
@@ -728,9 +736,9 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
Math_ApproachZeroF(&this->floorRot.x, 0.5f, 0.2f);
Math_ApproachZeroF(&this->floorRot.z, 0.5f, 0.2f);
- if (fabsf(this->actor.speedXZ) > 1.0f) {
+ if (fabsf(this->actor.speed) > 1.0f) {
rippleDelay = 0;
- } else if (fabsf(this->actor.speedXZ) > 0.5f) {
+ } else if (fabsf(this->actor.speed) > 0.5f) {
rippleDelay = 3;
} else {
rippleDelay = 7;
@@ -751,20 +759,20 @@ 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;
this->actor.velocity.y = 2.0f + hammerStrength;
- this->actor.speedXZ = Rand_ZeroFloat(1.0f);
+ this->actor.speed = Rand_ZeroFloat(1.0f);
} else {
this->bounceX = Rand_ZeroFloat(7.0f) + 3.0f;
this->bounceZ = Rand_ZeroFloat(7.0f) + 3.0f;
this->actor.velocity.y = 3.0f + hammerStrength;
- this->actor.speedXZ = Rand_ZeroFloat(1.5f);
+ 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;
@@ -801,15 +809,15 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
this->bounceX = Rand_ZeroFloat(10.0f) + 6.0f;
this->bounceZ = Rand_ZeroFloat(10.0f) + 6.0f;
this->actor.velocity.y = 2.5f + bombStrength;
- this->actor.speedXZ = 3.0f + bombStrength;
+ this->actor.speed = 3.0f + bombStrength;
} else {
this->bounceX = Rand_ZeroFloat(7.0f) + 3.0f;
this->bounceZ = Rand_ZeroFloat(7.0f) + 3.0f;
this->actor.velocity.y = 5.0f + bombStrength;
- this->actor.speedXZ = 4.0f + bombStrength;
+ 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;
@@ -825,18 +833,22 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
switch (this->ocarinaFlag) {
case 0:
- if (play->msgCtx.ocarinaMode == 1) {
+ if (play->msgCtx.ocarinaMode == OCARINA_MODE_ACTIVE) {
this->ocarinaFlag = 1;
}
break;
case 1:
- if ((play->msgCtx.ocarinaMode == 4) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING)) {
+ if ((play->msgCtx.ocarinaMode == OCARINA_MODE_END) &&
+ (play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING)) {
this->actionState = ENKANBAN_REPAIR;
this->bounceX = 1;
- play_sound(NA_SE_SY_TRE_BOX_APPEAR);
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
}
break;
+
+ default:
+ break;
}
break;
@@ -875,25 +887,22 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
((pDiff + yDiff + rDiff + this->spinRot.x + this->spinRot.z) == 0) && (this->floorRot.x == 0.0f) &&
(this->floorRot.z == 0.0f)) {
signpost->partFlags |= this->partFlags;
- signpost->actor.flags |= ACTOR_FLAG_1;
+ signpost->actor.flags |= ACTOR_FLAG_TARGETABLE;
Actor_Kill(&this->actor);
return;
}
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,
- object_kanban_DL_000FF8, object_kanban_DL_0010B8, object_kanban_DL_0011C0, object_kanban_DL_0012C8,
- object_kanban_DL_0013D0, object_kanban_DL_001488, object_kanban_DL_001540,
+ gSignUpperSideLeftModelDL, gSignLeftSideUpperModelDL, gSignLeftSideLowerModelDL, gSignRightSideUpperModelDL,
+ gSignRightSideLowerModelDL, gSignLowerSideLeftModelDL, gSignUpperSideRightModelDL, gSignLowerSideRightModelDL,
+ gSignPostUpperModelDL, gSignPostLowerModelDL, gSignPostStandModelDL,
};
#include "z_en_kanban_gfx.c"
@@ -921,10 +930,10 @@ 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);
+ gSPDisplayList(POLY_OPA_DISP++, gSignMaterialDL);
if (this->actionState != ENKANBAN_SIGN) {
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, MTXMODE_NEW);
@@ -983,7 +992,7 @@ void EnKanban_Draw(Actor* thisx, PlayState* play) {
gDPSetPrimColor(POLY_XLU_DISP++, 0x00, 0x00, 255, 255, 255, this->cutMarkAlpha);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 150, 0);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, object_kanban_DL_001630);
+ gSPDisplayList(POLY_XLU_DISP++, gSignParticleDL);
}
}
diff --git a/src/overlays/actors/ovl_En_Kanban/z_en_kanban.h b/src/overlays/actors/ovl_En_Kanban/z_en_kanban.h
index e54bb3fad..43b3b61fb 100644
--- a/src/overlays/actors/ovl_En_Kanban/z_en_kanban.h
+++ b/src/overlays/actors/ovl_En_Kanban/z_en_kanban.h
@@ -5,22 +5,22 @@
struct EnKanban;
-#define PART_UPPER_LEFT (1 << 0)
-#define PART_LEFT_UPPER (1 << 1)
-#define PART_LEFT_LOWER (1 << 2)
-#define PART_RIGHT_UPPER (1 << 3)
-#define PART_RIGHT_LOWER (1 << 4)
-#define PART_LOWER_LEFT (1 << 5)
-#define PART_UPPER_RIGHT (1 << 6)
-#define PART_LOWER_RIGHT (1 << 7)
+#define PART_UPPER_SIDE_LEFT (1 << 0)
+#define PART_LEFT_SIDE_UPPER (1 << 1)
+#define PART_LEFT_SIDE_LOWER (1 << 2)
+#define PART_RIGHT_SIDE_UPPER (1 << 3)
+#define PART_RIGHT_SIDE_LOWER (1 << 4)
+#define PART_LOWER_SIDE_LEFT (1 << 5)
+#define PART_UPPER_SIDE_RIGHT (1 << 6)
+#define PART_LOWER_SIDE_RIGHT (1 << 7)
#define PART_POST_UPPER (1 << 8)
#define PART_POST_LOWER (1 << 9)
#define PART_POST_STAND (1 << 10)
-#define LEFT_HALF (PART_UPPER_LEFT | PART_LEFT_UPPER | PART_LEFT_LOWER | PART_LOWER_LEFT)
-#define RIGHT_HALF (PART_UPPER_RIGHT | PART_RIGHT_UPPER | PART_RIGHT_LOWER | PART_LOWER_RIGHT)
-#define UPPER_HALF (PART_POST_UPPER | PART_UPPER_RIGHT | PART_RIGHT_UPPER | PART_UPPER_LEFT | PART_LEFT_UPPER)
-#define UPPERLEFT_HALF (PART_POST_UPPER | PART_UPPER_RIGHT | PART_LEFT_LOWER | PART_UPPER_LEFT | PART_LEFT_UPPER)
-#define UPPERRIGHT_HALF (PART_POST_UPPER | PART_UPPER_RIGHT | PART_RIGHT_UPPER | PART_UPPER_LEFT | PART_RIGHT_LOWER)
+#define LEFT_HALF (PART_UPPER_SIDE_LEFT | PART_LEFT_SIDE_UPPER | PART_LEFT_SIDE_LOWER | PART_LOWER_SIDE_LEFT)
+#define RIGHT_HALF (PART_UPPER_SIDE_RIGHT | PART_RIGHT_SIDE_UPPER | PART_RIGHT_SIDE_LOWER | PART_LOWER_SIDE_RIGHT)
+#define UPPER_HALF (PART_POST_UPPER | PART_UPPER_SIDE_RIGHT | PART_RIGHT_SIDE_UPPER | PART_UPPER_SIDE_LEFT | PART_LEFT_SIDE_UPPER)
+#define UPPERLEFT_HALF (PART_POST_UPPER | PART_UPPER_SIDE_RIGHT | PART_LEFT_SIDE_LOWER | PART_UPPER_SIDE_LEFT | PART_LEFT_SIDE_UPPER)
+#define UPPERRIGHT_HALF (PART_POST_UPPER | PART_UPPER_SIDE_RIGHT | PART_RIGHT_SIDE_UPPER | PART_UPPER_SIDE_LEFT | PART_RIGHT_SIDE_LOWER)
#define ALL_PARTS (LEFT_HALF | RIGHT_HALF | PART_POST_UPPER | PART_POST_LOWER)
typedef enum {
@@ -42,14 +42,14 @@ typedef enum {
/* 6 */ PIECE_1ST_QUAD,
/* 7 */ PIECE_3RD_QUAD,
/* 8 */ PIECE_4TH_QUAD,
- /* 9 */ PIECE_UPPER_LEFT,
- /* 10 */ PIECE_LEFT_UPPER,
- /* 11 */ PIECE_LEFT_LOWER,
- /* 12 */ PIECE_LOWER_LEFT,
- /* 13 */ PIECE_UPPER_RIGHT,
- /* 14 */ PIECE_RIGHT_UPPER,
- /* 15 */ PIECE_RIGHT_LOWER,
- /* 16 */ PIECE_LOWER_RIGHT,
+ /* 9 */ PIECE_UPPER_SIDE_LEFT,
+ /* 10 */ PIECE_LEFT_SIDE_UPPER,
+ /* 11 */ PIECE_LEFT_SIDE_LOWER,
+ /* 12 */ PIECE_LOWER_SIDE_LEFT,
+ /* 13 */ PIECE_UPPER_SIDE_RIGHT,
+ /* 14 */ PIECE_RIGHT_SIDE_UPPER,
+ /* 15 */ PIECE_RIGHT_SIDE_LOWER,
+ /* 16 */ PIECE_LOWER_SIDE_RIGHT,
/* 17 */ PIECE_POST_UPPER,
/* 18 */ PIECE_POST_LOWER,
/* 100 */ PIECE_OTHER = 100
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 46ad2c30b..903b1232b 100644
--- a/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.c
+++ b/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.c
@@ -1,15 +1,15 @@
/*
* File: z_en_karebaba.c
* Overlay: ovl_En_Karebaba
- * Description: Wilted Deku Baba
+ * Description: Wilted Deku Baba and Mini Baba
*/
#include "z_en_karebaba.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#include "objects/object_dekubaba/object_dekubaba.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY)
#define THIS ((EnKarebaba*)thisx)
@@ -18,27 +18,26 @@ void EnKarebaba_Destroy(Actor* thisx, PlayState* play);
void EnKarebaba_Update(Actor* thisx, PlayState* play2);
void EnKarebaba_Draw(Actor* thisx, PlayState* play);
-void func_808F155C(EnKarebaba* this);
-void func_808F15B0(EnKarebaba* this, PlayState* play);
-void func_808F1648(EnKarebaba* this);
-void func_808F169C(EnKarebaba* this, PlayState* play);
-void func_808F16FC(EnKarebaba* this);
-void func_808F1778(EnKarebaba* this, PlayState* play);
-void func_808F1878(EnKarebaba* this);
-void func_808F190C(EnKarebaba* this, PlayState* play);
-void func_808F1A3C(EnKarebaba* this);
-void func_808F1A58(EnKarebaba* this, PlayState* play);
-void func_808F1BF8(EnKarebaba* this);
-void func_808F1C84(EnKarebaba* this, PlayState* play);
-void func_808F1FAC(EnKarebaba* this);
-void func_808F200C(EnKarebaba* this, PlayState* play);
-void func_808F20FC(EnKarebaba* this, PlayState* play);
-void func_808F21A4(EnKarebaba* this, PlayState* play);
-void func_808F220C(EnKarebaba* this);
-void func_808F228C(EnKarebaba* this, PlayState* play);
-void func_808F238C(EnKarebaba* this);
-void func_808F241C(EnKarebaba* this, PlayState* play);
-void func_808F254C(EnKarebaba* this, PlayState* play);
+void EnKarebaba_SetupGrow(EnKarebaba* this);
+void EnKarebaba_Grow(EnKarebaba* this, PlayState* play);
+void EnKarebaba_SetupIdle(EnKarebaba* this);
+void EnKarebaba_Idle(EnKarebaba* this, PlayState* play);
+void EnKarebaba_SetupAwaken(EnKarebaba* this);
+void EnKarebaba_Awaken(EnKarebaba* this, PlayState* play);
+void EnKarebaba_SetupUpright(EnKarebaba* this);
+void EnKarebaba_Upright(EnKarebaba* this, PlayState* play);
+void EnKarebaba_SetupSpin(EnKarebaba* this);
+void EnKarebaba_Spin(EnKarebaba* this, PlayState* play);
+void EnKarebaba_SetupDying(EnKarebaba* this);
+void EnKarebaba_Dying(EnKarebaba* this, PlayState* play);
+void EnKarebaba_SetupShrinkDie(EnKarebaba* this);
+void EnKarebaba_ShrinkDie(EnKarebaba* this, PlayState* play);
+void EnKarebaba_SetupDeadItemDrop(EnKarebaba* this, PlayState* play);
+void EnKarebaba_DeadItemDrop(EnKarebaba* this, PlayState* play);
+void EnKarebaba_SetupRetract(EnKarebaba* this);
+void EnKarebaba_Retract(EnKarebaba* this, PlayState* play);
+void EnKarebaba_SetupDead(EnKarebaba* this);
+void EnKarebaba_Dead(EnKarebaba* this, PlayState* play);
ActorInit En_Karebaba_InitVars = {
ACTOR_EN_KAREBABA,
@@ -52,7 +51,7 @@ ActorInit En_Karebaba_InitVars = {
(ActorFunc)EnKarebaba_Draw,
};
-static ColliderCylinderInit sCylinderInit1 = {
+static ColliderCylinderInit sHurtCylinderInit = {
{
COLTYPE_HARD,
AT_NONE,
@@ -72,7 +71,7 @@ static ColliderCylinderInit sCylinderInit1 = {
{ 7, 25, 0, { 0, 0, 0 } },
};
-static ColliderCylinderInit sCylinderInit2 = {
+static ColliderCylinderInit sAttackCylinderInit = {
{
COLTYPE_HARD,
AT_ON | AT_TYPE_ENEMY,
@@ -94,484 +93,489 @@ static ColliderCylinderInit sCylinderInit2 = {
static CollisionCheckInfoInit sColChkInfoInit = { 1, 15, 80, MASS_HEAVY };
+typedef enum {
+ /* 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 = {
- /* Deku Nut */ DMG_ENTRY(0, 0x0),
- /* 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(1, 0x0),
- /* Goron punch */ DMG_ENTRY(2, 0x0),
- /* Sword */ DMG_ENTRY(1, 0x0),
- /* Goron pound */ DMG_ENTRY(1, 0x0),
- /* Fire arrow */ DMG_ENTRY(1, 0x2),
- /* 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(1, 0x0),
- /* Deku launch */ DMG_ENTRY(2, 0x0),
- /* UNK_DMG_0x12 */ DMG_ENTRY(0, 0x0),
- /* Zora barrier */ DMG_ENTRY(1, 0x5),
- /* Normal shield */ DMG_ENTRY(0, 0x0),
- /* Light ray */ DMG_ENTRY(0, 0x0),
- /* Thrown object */ DMG_ENTRY(1, 0x0),
- /* 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),
+ /* Deku Nut */ DMG_ENTRY(0, KAREBABA_DMGEFF_NONE),
+ /* Deku Stick */ DMG_ENTRY(3, KAREBABA_DMGEFF_NONE),
+ /* Horse trample */ DMG_ENTRY(1, KAREBABA_DMGEFF_NONE),
+ /* Explosives */ DMG_ENTRY(1, KAREBABA_DMGEFF_NONE),
+ /* Zora boomerang */ DMG_ENTRY(1, KAREBABA_DMGEFF_NONE),
+ /* Normal arrow */ DMG_ENTRY(1, KAREBABA_DMGEFF_NONE),
+ /* UNK_DMG_0x06 */ DMG_ENTRY(0, KAREBABA_DMGEFF_NONE),
+ /* Hookshot */ DMG_ENTRY(1, KAREBABA_DMGEFF_NONE),
+ /* Goron punch */ DMG_ENTRY(2, KAREBABA_DMGEFF_NONE),
+ /* Sword */ DMG_ENTRY(1, KAREBABA_DMGEFF_NONE),
+ /* Goron pound */ DMG_ENTRY(1, KAREBABA_DMGEFF_NONE),
+ /* Fire arrow */ DMG_ENTRY(1, KAREBABA_DMGEFF_FIRE),
+ /* Ice arrow */ DMG_ENTRY(2, KAREBABA_DMGEFF_ICE),
+ /* Light arrow */ DMG_ENTRY(2, KAREBABA_DMGEFF_LIGHT),
+ /* Goron spikes */ DMG_ENTRY(1, KAREBABA_DMGEFF_NONE),
+ /* Deku spin */ DMG_ENTRY(1, KAREBABA_DMGEFF_NONE),
+ /* Deku bubble */ DMG_ENTRY(1, KAREBABA_DMGEFF_NONE),
+ /* Deku launch */ DMG_ENTRY(2, KAREBABA_DMGEFF_NONE),
+ /* UNK_DMG_0x12 */ DMG_ENTRY(0, KAREBABA_DMGEFF_NONE),
+ /* Zora barrier */ DMG_ENTRY(1, KAREBABA_DMGEFF_ELECTRIC),
+ /* Normal shield */ DMG_ENTRY(0, KAREBABA_DMGEFF_NONE),
+ /* Light ray */ DMG_ENTRY(0, KAREBABA_DMGEFF_NONE),
+ /* Thrown object */ DMG_ENTRY(1, KAREBABA_DMGEFF_NONE),
+ /* Zora punch */ DMG_ENTRY(1, KAREBABA_DMGEFF_NONE),
+ /* Spin attack */ DMG_ENTRY(1, KAREBABA_DMGEFF_NONE),
+ /* Sword beam */ DMG_ENTRY(0, KAREBABA_DMGEFF_NONE),
+ /* Normal Roll */ DMG_ENTRY(0, KAREBABA_DMGEFF_NONE),
+ /* UNK_DMG_0x1B */ DMG_ENTRY(0, KAREBABA_DMGEFF_NONE),
+ /* UNK_DMG_0x1C */ DMG_ENTRY(0, KAREBABA_DMGEFF_NONE),
+ /* Unblockable */ DMG_ENTRY(0, KAREBABA_DMGEFF_NONE),
+ /* UNK_DMG_0x1E */ DMG_ENTRY(0, KAREBABA_DMGEFF_NONE),
+ /* Powder Keg */ DMG_ENTRY(1, KAREBABA_DMGEFF_NONE),
};
static InitChainEntry sInitChain[] = {
ICHAIN_F32(targetArrowOffset, 2500, ICHAIN_CONTINUE),
- ICHAIN_U8(targetMode, 1, ICHAIN_STOP),
+ ICHAIN_U8(targetMode, TARGET_MODE_1, ICHAIN_STOP),
};
-Color_RGBA8 D_808F2E28 = { 0, 0, 0, 0 };
-
-Gfx* D_808F2E2C[] = { object_dekubaba_DL_001330, object_dekubaba_DL_001628, object_dekubaba_DL_001828 };
-
void EnKarebaba_Init(Actor* thisx, PlayState* play) {
EnKarebaba* this = THIS;
Actor_ProcessInitChain(&this->actor, sInitChain);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 22.0f);
- SkelAnime_Init(play, &this->skelAnime, &object_dekubaba_Skel_002A40, &object_dekubaba_Anim_0002B8, this->jointTable,
- this->morphTable, 8);
+ SkelAnime_Init(play, &this->skelAnime, &gDekuBabaSkel, &gDekuBabaFastChompAnim, this->jointTable, this->morphTable,
+ DEKUBABA_LIMB_MAX);
- Collider_InitAndSetCylinder(play, &this->collider2, &this->actor, &sCylinderInit1);
- Collider_UpdateCylinder(&this->actor, &this->collider2);
- Collider_InitAndSetCylinder(play, &this->collider1, &this->actor, &sCylinderInit2);
- Collider_UpdateCylinder(&this->actor, &this->collider1);
+ Collider_InitAndSetCylinder(play, &this->hurtCollider, &this->actor, &sHurtCylinderInit);
+ Collider_UpdateCylinder(&this->actor, &this->hurtCollider);
+ Collider_InitAndSetCylinder(play, &this->attackCollider, &this->actor, &sAttackCylinderInit);
+ Collider_UpdateCylinder(&this->actor, &this->attackCollider);
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
- this->unk_22C = NULL;
- if (this->actor.params == ENKAREBABA_2) {
+ this->boundFloor = NULL;
+ if (this->actor.params == KAREBABA_MINI) {
this->actor.hintId = TATL_HINT_ID_MINI_BABA;
} else {
this->actor.hintId = TATL_HINT_ID_WILTED_DEKU_BABA;
}
if (this->actor.params == ENKAREBABA_0) {
- func_808F155C(this);
+ EnKarebaba_SetupGrow(this);
} else {
- func_808F1648(this);
+ EnKarebaba_SetupIdle(this);
}
}
void EnKarebaba_Destroy(Actor* thisx, PlayState* play) {
EnKarebaba* this = THIS;
- Collider_DestroyCylinder(play, &this->collider2);
- Collider_DestroyCylinder(play, &this->collider1);
+ Collider_DestroyCylinder(play, &this->hurtCollider);
+ Collider_DestroyCylinder(play, &this->attackCollider);
}
-void func_808F1374(EnKarebaba* this, PlayState* play) {
- s32 phi_a3;
+void EnKarebaba_SpawnIceEffects(EnKarebaba* this, PlayState* play) {
+ s32 bodyPartsCount;
if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->drawDmgEffAlpha = 0.0f;
- if (this->actor.params == ENKAREBABA_2) {
- phi_a3 = 1;
+
+ if (this->actor.params == KAREBABA_MINI) {
+ bodyPartsCount = 1;
} else {
- phi_a3 = 4;
+ bodyPartsCount = KAREBABA_BODYPART_MAX;
}
- Actor_SpawnIceEffects(play, &this->actor, this->limbPos, phi_a3, 4, 0.3f, 0.2f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, bodyPartsCount, 4, 0.3f, 0.2f);
}
}
-void func_808F13FC(EnKarebaba* this, PlayState* play) {
- if (this->actor.colChkInfo.damageEffect == 2) {
+void EnKarebaba_SetDamageEffects(EnKarebaba* this, PlayState* play) {
+ if (this->actor.colChkInfo.damageEffect == KAREBABA_DMGEFF_FIRE) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->drawDmgEffScale = 0.75f;
this->drawDmgEffAlpha = 3.0f;
- } else if (this->actor.colChkInfo.damageEffect == 4) {
+ } else if (this->actor.colChkInfo.damageEffect == KAREBABA_DMGEFF_LIGHT) {
this->drawDmgEffScale = 0.75f;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_LIGHT_ORBS;
this->drawDmgEffAlpha = 3.0f;
- Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->collider2.info.bumper.hitPos.x,
- this->collider2.info.bumper.hitPos.y, this->collider2.info.bumper.hitPos.z, 0, 0, 0,
- CLEAR_TAG_SMALL_LIGHT_RAYS);
- } else if (this->actor.colChkInfo.damageEffect == 3) {
+
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->hurtCollider.info.bumper.hitPos.x,
+ this->hurtCollider.info.bumper.hitPos.y, this->hurtCollider.info.bumper.hitPos.z, 0, 0, 0,
+ CLEAR_TAG_PARAMS(CLEAR_TAG_SMALL_LIGHT_RAYS));
+ } else if (this->actor.colChkInfo.damageEffect == KAREBABA_DMGEFF_ICE) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX;
this->drawDmgEffScale = 0.75f;
this->drawDmgEffAlpha = 1.0f;
this->drawDmgEffFrozenSteamScale = 1.125f;
- } else if (this->actor.colChkInfo.damageEffect == 5) {
+ } else if (this->actor.colChkInfo.damageEffect == KAREBABA_DMGEFF_ELECTRIC) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_MEDIUM;
this->drawDmgEffScale = 0.75f;
this->drawDmgEffAlpha = 3.0f;
}
}
-void func_808F152C(EnKarebaba* this) {
- this->collider2.dim.radius = 7;
- this->collider2.dim.height = 25;
- this->collider2.base.colType = COLTYPE_HARD;
- this->collider2.base.acFlags |= AC_HARD;
- this->collider1.dim.height = 25;
+void EnKarebaba_ResetColliders(EnKarebaba* this) {
+ this->hurtCollider.dim.radius = 7;
+ this->hurtCollider.dim.height = 25;
+ this->hurtCollider.base.colType = COLTYPE_HARD;
+ this->hurtCollider.base.acFlags |= AC_HARD;
+ this->attackCollider.dim.height = 25;
}
-void func_808F155C(EnKarebaba* this) {
+void EnKarebaba_SetupGrow(EnKarebaba* this) {
Actor_SetScale(&this->actor, 0.0f);
this->actor.shape.rot.x = -0x4000;
- this->unk_1EE = 0;
+ this->timer = 0;
this->actor.world.pos.y = this->actor.home.pos.y + 14.0f;
- this->actionFunc = func_808F15B0;
+ this->actionFunc = EnKarebaba_Grow;
}
-void func_808F15B0(EnKarebaba* this, PlayState* play) {
- f32 sp1C;
+void EnKarebaba_Grow(EnKarebaba* this, PlayState* play) {
+ f32 scale;
- this->unk_1EE++;
- sp1C = this->unk_1EE * 0.05f;
- Actor_SetScale(&this->actor, 0.005f * sp1C);
- this->actor.world.pos.y = this->actor.home.pos.y + (14.0f * sp1C);
- if (this->unk_1EE == 20) {
- func_808F1648(this);
+ this->timer++;
+ scale = this->timer * 0.05f;
+ Actor_SetScale(&this->actor, 0.005f * scale);
+ this->actor.world.pos.y = this->actor.home.pos.y + (14.0f * scale);
+ if (this->timer == 20) {
+ EnKarebaba_SetupIdle(this);
}
}
-void func_808F1648(EnKarebaba* this) {
+void EnKarebaba_SetupIdle(EnKarebaba* this) {
Actor_SetScale(&this->actor, 0.005f);
this->actor.shape.rot.x = -0x4000;
this->actor.world.pos.y = this->actor.home.pos.y + 14.0f;
- this->actionFunc = func_808F169C;
+ this->actionFunc = EnKarebaba_Idle;
}
-void func_808F169C(EnKarebaba* this, PlayState* play) {
+void EnKarebaba_Idle(EnKarebaba* this, PlayState* play) {
if ((this->actor.xzDistToPlayer < 200.0f) && (fabsf(this->actor.playerHeightRel) < 30.0f)) {
- func_808F16FC(this);
+ EnKarebaba_SetupAwaken(this);
}
}
-void func_808F16FC(EnKarebaba* this) {
- Animation_Change(&this->skelAnime, &object_dekubaba_Anim_0002B8, 4.0f, 0.0f,
- Animation_GetLastFrame(&object_dekubaba_Anim_0002B8), ANIMMODE_LOOP, -3.0f);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DEKU_WAKEUP);
- this->actionFunc = func_808F1778;
+void EnKarebaba_SetupAwaken(EnKarebaba* this) {
+ Animation_Change(&this->skelAnime, &gDekuBabaFastChompAnim, 4.0f, 0.0f,
+ Animation_GetLastFrame(&gDekuBabaFastChompAnim), ANIMMODE_LOOP, -3.0f);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEKU_WAKEUP);
+ this->actionFunc = EnKarebaba_Awaken;
}
-void func_808F1778(EnKarebaba* this, PlayState* play) {
+void EnKarebaba_Awaken(EnKarebaba* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
- if (Math_StepToF(&this->actor.scale.x, 0.01f, 0.0005f) && (this->actor.params == ENKAREBABA_2)) {
- func_808F1878(this);
+ if (Math_StepToF(&this->actor.scale.x, 0.01f, 0.0005f) && (this->actor.params == KAREBABA_MINI)) {
+ EnKarebaba_SetupUpright(this);
}
- this->actor.scale.z = this->actor.scale.x;
- this->actor.scale.y = this->actor.scale.x;
+ this->actor.scale.y = this->actor.scale.z = this->actor.scale.x;
if ((this->actor.params == ENKAREBABA_1) &&
Math_StepToF(&this->actor.world.pos.y, this->actor.home.pos.y + 60.0f, 5.0f)) {
- func_808F1878(this);
+ EnKarebaba_SetupUpright(this);
}
- this->actor.shape.rot.y += 0x1999;
+ this->actor.shape.rot.y += 0x10000 / 10;
EffectSsHahen_SpawnBurst(play, &this->actor.home.pos, 3.0f, 0, 12, 5, 1, HAHEN_OBJECT_DEFAULT, 10, NULL);
}
-void func_808F1878(EnKarebaba* this) {
- if (this->actionFunc != func_808F1A58) {
+void EnKarebaba_SetupUpright(EnKarebaba* this) {
+ if (this->actionFunc != EnKarebaba_Spin) {
Actor_SetScale(&this->actor, 0.01f);
- this->collider2.base.colType = COLTYPE_HIT6;
- this->collider2.base.acFlags &= ~AC_HARD;
- this->collider2.dim.radius = 15;
+ this->hurtCollider.base.colType = COLTYPE_HIT6;
+ this->hurtCollider.base.acFlags &= ~AC_HARD;
+ this->hurtCollider.dim.radius = 15;
if (this->actor.params == ENKAREBABA_1) {
- this->collider2.dim.height = 80;
- this->collider1.dim.height = 80;
+ this->hurtCollider.dim.height = 80;
+ this->attackCollider.dim.height = 80;
} else {
- this->collider2.dim.height = 35;
- this->collider1.dim.height = 35;
+ this->hurtCollider.dim.height = 35;
+ this->attackCollider.dim.height = 35;
}
}
- this->unk_1EE = 40;
- this->actionFunc = func_808F190C;
+ this->timer = 40;
+ this->actionFunc = EnKarebaba_Upright;
}
-void func_808F190C(EnKarebaba* this, PlayState* play) {
+void EnKarebaba_Upright(EnKarebaba* this, PlayState* play) {
Player* player = GET_PLAYER(play);
SkelAnime_Update(&this->skelAnime);
- if (this->unk_1EE != 0) {
- this->unk_1EE--;
+ if (this->timer != 0) {
+ this->timer--;
}
if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 12.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_MIZUBABA1_MOUTH);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MIZUBABA1_MOUTH);
}
- if (this->collider2.base.acFlags & AC_HIT) {
- func_808F13FC(this, play);
+ if (this->hurtCollider.base.acFlags & AC_HIT) {
+ EnKarebaba_SetDamageEffects(this, play);
if (this->actor.params == ENKAREBABA_1) {
- func_808F1BF8(this);
+ EnKarebaba_SetupDying(this);
} else {
- func_808F1FAC(this);
+ EnKarebaba_SetupShrinkDie(this);
}
Enemy_StartFinishingBlow(play, &this->actor);
} else if (Math_Vec3f_DistXZ(&this->actor.home.pos, &player->actor.world.pos) > 240.0f) {
- func_808F220C(this);
- } else if ((this->unk_1EE == 0) && (this->actor.params == ENKAREBABA_1)) {
- func_808F1A3C(this);
+ EnKarebaba_SetupRetract(this);
+ } else if ((this->timer == 0) && (this->actor.params == ENKAREBABA_1)) {
+ EnKarebaba_SetupSpin(this);
}
}
-void func_808F1A3C(EnKarebaba* this) {
- this->unk_1EE = 40;
- this->actionFunc = func_808F1A58;
+void EnKarebaba_SetupSpin(EnKarebaba* this) {
+ this->timer = 40;
+ this->actionFunc = EnKarebaba_Spin;
}
-void func_808F1A58(EnKarebaba* this, PlayState* play) {
- s32 phi_v0;
- f32 sp28;
+void EnKarebaba_Spin(EnKarebaba* this, PlayState* play) {
+ s32 temp; // Used for cylinder radius and shape rotations
+ f32 headDistHorizontal;
- if (this->unk_1EE != 0) {
- this->unk_1EE--;
+ if (this->timer != 0) {
+ this->timer--;
}
SkelAnime_Update(&this->skelAnime);
if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 12.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_MIZUBABA1_MOUTH);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MIZUBABA1_MOUTH);
}
- phi_v0 = 20 - this->unk_1EE;
- phi_v0 = 20 - ABS_ALT(phi_v0);
- if (phi_v0 > 10) {
- phi_v0 = 10;
+ temp = 20 - this->timer;
+ temp = 20 - ABS_ALT(temp);
+ if (temp > 10) {
+ temp = 10;
}
- this->collider1.dim.radius = sCylinderInit2.dim.radius + (phi_v0 * 2);
- this->actor.shape.rot.x = 0xC000 - (phi_v0 << 8);
- this->actor.shape.rot.y += phi_v0 * 0x2C0;
+ this->attackCollider.dim.radius = sAttackCylinderInit.dim.radius + (temp * 2);
+ this->actor.shape.rot.x = 0xC000 - temp * 0x100;
+ this->actor.shape.rot.y += temp * 0x2C0;
this->actor.world.pos.y = (Math_SinS(this->actor.shape.rot.x) * -60.0f) + this->actor.home.pos.y;
- sp28 = Math_CosS(this->actor.shape.rot.x) * 60.0f;
- this->actor.world.pos.x = (Math_SinS(this->actor.shape.rot.y) * sp28) + this->actor.home.pos.x;
- this->actor.world.pos.z = (Math_CosS(this->actor.shape.rot.y) * sp28) + this->actor.home.pos.z;
+ headDistHorizontal = Math_CosS(this->actor.shape.rot.x) * 60.0f;
+ this->actor.world.pos.x = (Math_SinS(this->actor.shape.rot.y) * headDistHorizontal) + this->actor.home.pos.x;
+ this->actor.world.pos.z = (Math_CosS(this->actor.shape.rot.y) * headDistHorizontal) + this->actor.home.pos.z;
- if (this->collider2.base.acFlags & AC_HIT) {
- func_808F13FC(this, play);
- func_808F1BF8(this);
+ if (this->hurtCollider.base.acFlags & AC_HIT) {
+ EnKarebaba_SetDamageEffects(this, play);
+ EnKarebaba_SetupDying(this);
Enemy_StartFinishingBlow(play, &this->actor);
- } else if (this->unk_1EE == 0) {
- func_808F1878(this);
+ } else if (this->timer == 0) {
+ EnKarebaba_SetupUpright(this);
}
}
-void func_808F1BF8(EnKarebaba* this) {
+void EnKarebaba_SetupDying(EnKarebaba* this) {
if (this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
- this->unk_1EE = 0;
+ this->timer = 0;
this->actor.gravity = -0.8f;
this->actor.velocity.y = 4.0f;
this->actor.world.rot.y = BINANG_ROT180(this->actor.shape.rot.y);
- this->actor.speedXZ = 3.0f;
+ this->actor.speed = 3.0f;
} else {
- this->unk_1EE = 3;
+ this->timer = 3;
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DEKU_JR_DEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEKU_JR_DEAD);
this->actor.flags |= (ACTOR_FLAG_10 | ACTOR_FLAG_20);
- this->actionFunc = func_808F1C84;
+ this->actionFunc = EnKarebaba_Dying;
}
-void func_808F1C84(EnKarebaba* this, PlayState* play) {
+void EnKarebaba_Dying(EnKarebaba* this, PlayState* play) {
s32 i;
- Vec3f sp78;
- f32 temp_f20;
- f32 temp_f22;
- f32 temp_f24;
+ Vec3f dustPos;
+ f32 xIncr;
+ f32 zIncr;
+ f32 yIncr;
if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
- this->unk_1EE--;
- if (this->unk_1EE == 0) {
+ this->timer--;
+ if (this->timer == 0) {
this->actor.gravity = -0.8f;
- this->actor.speedXZ = 3.0f;
+ this->actor.speed = 3.0f;
this->actor.velocity.y = 4.0f;
this->actor.world.rot.y = BINANG_ROT180(this->actor.shape.rot.y);
- func_808F1374(this, play);
+ EnKarebaba_SpawnIceEffects(this, play);
}
} else {
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.1f);
+ Math_StepToF(&this->actor.speed, 0.0f, 0.1f);
- if (this->unk_1EE == 0) {
+ if (this->timer == 0) {
Math_ScaledStepToS(&this->actor.shape.rot.x, 0x4800, 0x71C);
EffectSsHahen_SpawnBurst(play, &this->actor.world.pos, 3.0f, 0, 12, 5, 1, HAHEN_OBJECT_DEFAULT, 10, NULL);
- if ((this->actor.scale.x > 0.005f) && ((this->actor.bgCheckFlags & 2) || (this->actor.bgCheckFlags & 8))) {
+ if ((this->actor.scale.x > 0.005f) && ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) ||
+ (this->actor.bgCheckFlags & BGCHECKFLAG_WALL))) {
this->actor.scale.z = 0.0f;
this->actor.scale.y = 0.0f;
this->actor.scale.x = 0.0f;
- this->actor.speedXZ = 0.0f;
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_4);
+ this->actor.speed = 0.0f;
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY);
EffectSsHahen_SpawnBurst(play, &this->actor.world.pos, 3.0f, 0, 12, 5, 15, HAHEN_OBJECT_DEFAULT, 10,
NULL);
}
- if (this->actor.bgCheckFlags & 2) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EYEGOLE_ATTACK);
- this->unk_1EE = 1;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_ATTACK);
+ this->timer = 1;
}
- } else if (this->unk_1EE == 1) {
- Math_Vec3f_Copy(&sp78, &this->actor.world.pos);
+ } else if (this->timer == 1) {
+ Math_Vec3f_Copy(&dustPos, &this->actor.world.pos);
- temp_f24 = Math_SinS(this->actor.shape.rot.x) * 20.0f;
- temp_f20 = (-20.0f * Math_CosS(this->actor.shape.rot.x)) * Math_SinS(this->actor.shape.rot.y);
- temp_f22 = (-20.0f * Math_CosS(this->actor.shape.rot.x)) * Math_CosS(this->actor.shape.rot.y);
+ yIncr = Math_SinS(this->actor.shape.rot.x) * 20.0f;
+ xIncr = -20.0f * Math_CosS(this->actor.shape.rot.x) * Math_SinS(this->actor.shape.rot.y);
+ zIncr = -20.0f * Math_CosS(this->actor.shape.rot.x) * Math_CosS(this->actor.shape.rot.y);
for (i = 0; i < 4; i++) {
- func_800B1210(play, &sp78, &gZeroVec3f, &gZeroVec3f, 500, 50);
- sp78.x += temp_f20;
- sp78.y += temp_f24;
- sp78.z += temp_f22;
+ func_800B1210(play, &dustPos, &gZeroVec3f, &gZeroVec3f, 500, 50);
+ dustPos.x += xIncr;
+ dustPos.y += yIncr;
+ dustPos.z += zIncr;
}
func_800B1210(play, &this->actor.home.pos, &gZeroVec3f, &gZeroVec3f, 500, 100);
- func_808F20FC(this, play);
+ EnKarebaba_SetupDeadItemDrop(this, play);
}
}
}
-void func_808F1FAC(EnKarebaba* this) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DEKU_JR_DEAD);
+void EnKarebaba_SetupShrinkDie(EnKarebaba* this) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEKU_JR_DEAD);
this->actor.flags |= (ACTOR_FLAG_10 | ACTOR_FLAG_20);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
- this->unk_1EE = 3;
+ this->timer = 3;
}
- this->actionFunc = func_808F200C;
+ this->actionFunc = EnKarebaba_ShrinkDie;
}
-void func_808F200C(EnKarebaba* this, PlayState* play) {
+void EnKarebaba_ShrinkDie(EnKarebaba* this, PlayState* play) {
if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
- this->unk_1EE--;
- if (this->unk_1EE == 0) {
- func_808F1374(this, play);
+ this->timer--;
+ if (this->timer == 0) {
+ EnKarebaba_SpawnIceEffects(this, play);
}
} else {
if (Math_StepToF(&this->actor.scale.x, 0.0f, 0.0005f)) {
- Item_DropCollectible(play, &this->actor.world.pos, ITEM00_NUTS_1);
- func_808F238C(this);
+ Item_DropCollectible(play, &this->actor.world.pos, ITEM00_DEKU_NUTS_1);
+ EnKarebaba_SetupDead(this);
} else {
EffectSsHahen_SpawnBurst(play, &this->actor.world.pos, 3.0f, 0, 12, 5, 1, HAHEN_OBJECT_DEFAULT, 10, NULL);
Math_StepToF(&this->actor.world.pos.y, this->actor.home.pos.y, 1.0f);
}
- this->actor.scale.y = this->actor.scale.x;
- this->actor.scale.z = this->actor.scale.x;
+
+ this->actor.scale.z = this->actor.scale.y = this->actor.scale.x;
}
}
-void func_808F20FC(EnKarebaba* this, PlayState* play) {
+void EnKarebaba_SetupDeadItemDrop(EnKarebaba* this, PlayState* play) {
Actor_SetScale(&this->actor, 0.03f);
this->actor.shape.rot.x -= 0x4000;
this->actor.shape.yOffset = 1000.0f;
this->actor.gravity = 0.0f;
this->actor.velocity.y = 0.0f;
this->actor.shape.shadowScale = 3.0f;
- func_800BC154(play, &play->actorCtx, &this->actor, 8);
- this->unk_1EE = 200;
+ func_800BC154(play, &play->actorCtx, &this->actor, ACTORCAT_MISC);
+ this->timer = 200;
this->actor.flags &= ~ACTOR_FLAG_20;
this->drawDmgEffAlpha = 0.0f;
- this->actionFunc = func_808F21A4;
+ this->actionFunc = EnKarebaba_DeadItemDrop;
}
-void func_808F21A4(EnKarebaba* this, PlayState* play) {
- if (this->unk_1EE != 0) {
- this->unk_1EE--;
+void EnKarebaba_DeadItemDrop(EnKarebaba* this, PlayState* play) {
+ if (this->timer != 0) {
+ this->timer--;
}
- if (Actor_HasParent(&this->actor, play) || (this->unk_1EE == 0)) {
- func_808F238C(this);
+ if (Actor_HasParent(&this->actor, play) || (this->timer == 0)) {
+ EnKarebaba_SetupDead(this);
} else {
- Actor_PickUpNearby(&this->actor, play, GI_STICKS_1);
+ Actor_OfferGetItemNearby(&this->actor, play, GI_DEKU_STICKS_1);
}
}
-void func_808F220C(EnKarebaba* this) {
- Animation_Change(&this->skelAnime, &object_dekubaba_Anim_0002B8, -3.0f,
- Animation_GetLastFrame(&object_dekubaba_Anim_0002B8), 0.0f, ANIMMODE_ONCE, -3.0f);
- func_808F152C(this);
- this->actionFunc = func_808F228C;
+void EnKarebaba_SetupRetract(EnKarebaba* this) {
+ Animation_Change(&this->skelAnime, &gDekuBabaFastChompAnim, -3.0f, Animation_GetLastFrame(&gDekuBabaFastChompAnim),
+ 0.0f, ANIMMODE_ONCE, -3.0f);
+ EnKarebaba_ResetColliders(this);
+ this->actionFunc = EnKarebaba_Retract;
}
-void func_808F228C(EnKarebaba* this, PlayState* play) {
+void EnKarebaba_Retract(EnKarebaba* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
- if (Math_StepToF(&this->actor.scale.x, 0.005f, 0.0005f) && (this->actor.params == ENKAREBABA_2)) {
- func_808F1648(this);
+ if (Math_StepToF(&this->actor.scale.x, 0.005f, 0.0005f) && (this->actor.params == KAREBABA_MINI)) {
+ EnKarebaba_SetupIdle(this);
}
- this->actor.scale.z = this->actor.scale.x;
- this->actor.scale.y = this->actor.scale.x;
+ this->actor.scale.y = this->actor.scale.z = this->actor.scale.x;
if ((this->actor.params == ENKAREBABA_1) &&
Math_StepToF(&this->actor.world.pos.y, this->actor.home.pos.y + 14.0f, 5.0f)) {
- func_808F1648(this);
+ EnKarebaba_SetupIdle(this);
}
- this->actor.shape.rot.y += 0x1999;
+ this->actor.shape.rot.y += 0x10000 / 10;
EffectSsHahen_SpawnBurst(play, &this->actor.home.pos, 3.0f, 0, 12, 5, 1, HAHEN_OBJECT_DEFAULT, 10, NULL);
}
-void func_808F238C(EnKarebaba* this) {
- Animation_Change(&this->skelAnime, &object_dekubaba_Anim_0002B8, 0.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f);
- func_808F152C(this);
+void EnKarebaba_SetupDead(EnKarebaba* this) {
+ Animation_Change(&this->skelAnime, &gDekuBabaFastChompAnim, 0.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f);
+ EnKarebaba_ResetColliders(this);
this->actor.shape.rot.x = -0x4000;
- this->unk_1EE = 200;
+ this->timer = 200;
this->actor.parent = NULL;
this->actor.shape.shadowScale = 0.0f;
this->drawDmgEffAlpha = 0.0f;
Math_Vec3f_Copy(&this->actor.world.pos, &this->actor.home.pos);
- this->actionFunc = func_808F254C;
+ this->actionFunc = EnKarebaba_Dead;
}
-void func_808F241C(EnKarebaba* this, PlayState* play) {
- f32 sp1C;
+void EnKarebaba_Regrow(EnKarebaba* this, PlayState* play) {
+ f32 scale;
- this->unk_1EE++;
- sp1C = this->unk_1EE * 0.05f;
- Actor_SetScale(&this->actor, 0.005f * sp1C);
- this->actor.world.pos.y = this->actor.home.pos.y + (14.0f * sp1C);
+ this->timer++;
+ scale = this->timer * 0.05f;
+ Actor_SetScale(&this->actor, 0.005f * scale);
+ this->actor.world.pos.y = this->actor.home.pos.y + (14.0f * scale);
- if (this->unk_1EE == 20) {
+ if (this->timer == 20) {
this->actor.flags &= ~ACTOR_FLAG_10;
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_4);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY);
if (this->actor.params == ENKAREBABA_1) {
- func_800BC154(play, &play->actorCtx, &this->actor, 5);
+ func_800BC154(play, &play->actorCtx, &this->actor, ACTORCAT_ENEMY);
}
- func_808F1648(this);
+ EnKarebaba_SetupIdle(this);
}
}
-void func_808F24F8(EnKarebaba* this) {
+void EnKarebaba_SetupRegrow(EnKarebaba* this) {
this->actor.shape.yOffset = 0.0f;
this->actor.shape.shadowScale = 22.0f;
- this->collider1.dim.radius = sCylinderInit2.dim.radius;
+ this->attackCollider.dim.radius = sAttackCylinderInit.dim.radius;
Actor_SetScale(&this->actor, 0.0f);
- this->actionFunc = func_808F241C;
+ this->actionFunc = EnKarebaba_Regrow;
}
-void func_808F254C(EnKarebaba* this, PlayState* play) {
+void EnKarebaba_Dead(EnKarebaba* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
- if (this->unk_1EE != 0) {
- this->unk_1EE--;
+ if (this->timer != 0) {
+ this->timer--;
}
- if (this->unk_1EE == 0) {
- func_808F24F8(this);
+ if (this->timer == 0) {
+ EnKarebaba_SetupRegrow(this);
}
}
@@ -591,30 +595,31 @@ void EnKarebaba_Update(Actor* thisx, PlayState* play2) {
} else {
this->drawDmgEffScale = this->drawDmgEffScale;
}
- } else if (!Math_StepToF(&this->drawDmgEffFrozenSteamScale, 0.75f, 0.01875f)) {
- func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ } else if (!Math_StepToF(&this->drawDmgEffFrozenSteamScale, 0.75f, 0.75f / 40)) {
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
}
- if (this->actionFunc != func_808F254C) {
- if (this->actionFunc == func_808F1C84) {
+ 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);
- if (this->unk_22C == 0) {
- this->unk_22C = this->actor.floorPoly;
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
+ if (this->boundFloor == 0) {
+ this->boundFloor = this->actor.floorPoly;
}
}
- if ((this->actionFunc != func_808F1C84) && (this->actionFunc != func_808F200C) &&
- (this->actionFunc != func_808F21A4)) {
- if ((this->actionFunc != func_808F241C) && (this->actionFunc != func_808F15B0)) {
- CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider1.base);
- CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider2.base);
+ if ((this->actionFunc != EnKarebaba_Dying) && (this->actionFunc != EnKarebaba_ShrinkDie) &&
+ (this->actionFunc != EnKarebaba_DeadItemDrop)) {
+ if ((this->actionFunc != EnKarebaba_Regrow) && (this->actionFunc != EnKarebaba_Grow)) {
+ CollisionCheck_SetAT(play, &play->colChkCtx, &this->attackCollider.base);
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->hurtCollider.base);
}
- CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider1.base);
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->attackCollider.base);
Actor_SetFocus(&this->actor, (this->actor.scale.x * 10.0f) / 0.01f);
max = this->actor.home.pos.y + 40.0f;
@@ -625,19 +630,18 @@ void EnKarebaba_Update(Actor* thisx, PlayState* play2) {
}
}
-void func_808F280C(EnKarebaba* this, PlayState* play) {
- MtxF sp40;
+void EnKarebaba_DrawShadow(EnKarebaba* this, PlayState* play) {
+ MtxF mf;
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);
- func_800C0094(this->unk_22C, this->actor.home.pos.x, this->actor.home.pos.y, this->actor.home.pos.z, &sp40);
- Matrix_Mult(&sp40, MTXMODE_NEW);
+ func_800C0094(this->boundFloor, this->actor.home.pos.x, this->actor.home.pos.y, this->actor.home.pos.z, &mf);
+ Matrix_Mult(&mf, MTXMODE_NEW);
Matrix_Scale(0.15f, 1.0f, 0.15f, MTXMODE_APPLY);
-
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, gCircleShadowDL);
@@ -645,53 +649,53 @@ void func_808F280C(EnKarebaba* this, PlayState* play) {
}
void EnKarebaba_Draw(Actor* thisx, PlayState* play) {
+ static Color_RGBA8 sFogColor = { 0, 0, 0, 0 };
+ static Gfx* sStemDLists[] = { gDekuBabaStemTopDL, gDekuBabaStemMiddleDL, gDekuBabaStemBaseDL };
EnKarebaba* this = THIS;
s32 i;
- s32 sp94;
- s16 limbCount;
- f32 sp8C = 0.01f;
+ s32 stemSections;
+ s16 bodyPartsCount;
+ f32 scale = 0.01f;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- Math_Vec3f_Copy(this->limbPos, &this->actor.world.pos);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Math_Vec3f_Copy(this->bodyPartsPos, &this->actor.world.pos);
- if (this->actionFunc == func_808F21A4) {
- if ((this->unk_1EE > 40) || (this->unk_1EE & 1)) {
+ if (this->actionFunc == EnKarebaba_DeadItemDrop) {
+ if ((this->timer > 40) || (this->timer & 1)) {
Matrix_Translate(0.0f, 0.0f, 200.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++, object_dekubaba_DL_003070);
+ gSPDisplayList(POLY_OPA_DISP++, gDekuBabaStickDropDL);
}
- } else if (this->actionFunc != func_808F254C) {
- func_800AE2A0(play, &D_808F2E28, 1, 2);
+ } else if (this->actionFunc != EnKarebaba_Dead) {
+ func_800AE2A0(play, &sFogColor, 1, 2);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, NULL, NULL);
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, MTXMODE_NEW);
- if ((this->actionFunc == func_808F241C) || (this->actionFunc == func_808F200C) ||
- (this->actionFunc == func_808F15B0)) {
- sp8C = this->unk_1EE * 0.0005f;
+ if ((this->actionFunc == EnKarebaba_Regrow) || (this->actionFunc == EnKarebaba_ShrinkDie) ||
+ (this->actionFunc == EnKarebaba_Grow)) {
+ scale = this->timer * 0.0005f;
}
- Matrix_Scale(sp8C, sp8C, sp8C, MTXMODE_APPLY);
+ Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
Matrix_RotateZYX(this->actor.shape.rot.x, this->actor.shape.rot.y, 0, MTXMODE_APPLY);
- if (this->actor.params == ENKAREBABA_2) {
- sp94 = 1;
- } else if (this->actionFunc == func_808F1C84) {
- sp94 = 2;
+ if (this->actor.params == KAREBABA_MINI) {
+ stemSections = 1;
+ } else if (this->actionFunc == EnKarebaba_Dying) {
+ stemSections = 2;
} else {
- sp94 = 3;
+ stemSections = 3;
}
- for (i = 0; i < sp94; i++) {
+ for (i = 0; i < stemSections; i++) {
Matrix_Translate(0.0f, 0.0f, -2000.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++, D_808F2E2C[i]);
+ gSPDisplayList(POLY_OPA_DISP++, sStemDLists[i]);
- Matrix_MultZero(&this->limbPos[1 + i]);
- if ((i == 0) && (this->actionFunc == func_808F1C84)) {
+ Matrix_MultZero(&this->bodyPartsPos[KAREBABA_BODYPART_1 + i]);
+ if ((i == 0) && (this->actionFunc == EnKarebaba_Dying)) {
Matrix_MultZero(&this->actor.focus.pos);
}
}
@@ -699,41 +703,39 @@ void EnKarebaba_Draw(Actor* thisx, PlayState* play) {
func_800AE5A0(play);
}
- func_800AE2A0(play, &D_808F2E28, 1, 2);
+ func_800AE2A0(play, &sFogColor, 1, 2);
Matrix_Translate(this->actor.home.pos.x, this->actor.home.pos.y, this->actor.home.pos.z, MTXMODE_NEW);
- if (this->actionFunc != func_808F15B0) {
- sp8C = 0.01f;
+ if (this->actionFunc != EnKarebaba_Grow) {
+ scale = 0.01f;
}
- Matrix_Scale(sp8C, sp8C, sp8C, MTXMODE_APPLY);
+ Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
Matrix_RotateYS(this->actor.home.rot.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++, object_dekubaba_DL_0010F0);
+ gSPDisplayList(POLY_OPA_DISP++, gDekuBabaBaseLeavesDL);
- if (this->actionFunc == func_808F1C84) {
+ if (this->actionFunc == EnKarebaba_Dying) {
Matrix_RotateZYX(-0x4000, this->actor.shape.rot.y - this->actor.home.rot.y, 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_dekubaba_DL_001828);
+ gSPDisplayList(POLY_OPA_DISP++, gDekuBabaStemBaseDL);
- Matrix_MultZero(&this->limbPos[3]);
+ Matrix_MultZero(&this->bodyPartsPos[KAREBABA_BODYPART_3]);
}
func_800AE5A0(play);
- if (this->actor.params == ENKAREBABA_2) {
- limbCount = 1;
+ if (this->actor.params == KAREBABA_MINI) {
+ bodyPartsCount = 1;
} else {
- limbCount = ARRAY_COUNT(this->limbPos);
+ bodyPartsCount = KAREBABA_BODYPART_MAX;
}
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, limbCount, this->drawDmgEffScale,
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, bodyPartsCount, this->drawDmgEffScale,
this->drawDmgEffFrozenSteamScale, this->drawDmgEffAlpha, this->drawDmgEffType);
- if (this->unk_22C != 0) {
- func_808F280C(this, play);
+ if (this->boundFloor != 0) {
+ EnKarebaba_DrawShadow(this, play);
}
CLOSE_DISPS(play->state.gfxCtx);
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 5063a8dbe..f0edcdd0b 100644
--- a/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.h
+++ b/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.h
@@ -2,32 +2,41 @@
#define Z_EN_KAREBABA_H
#include "global.h"
+#include "objects/object_dekubaba/object_dekubaba.h"
struct EnKarebaba;
typedef void (*EnKarebabaActionFunc)(struct EnKarebaba*, PlayState*);
-enum {
- /* 0 */ ENKAREBABA_0,
- /* 1 */ ENKAREBABA_1,
- /* 2 */ ENKAREBABA_2,
-};
+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
+} KarebabaType;
+
+typedef enum KarebabaBodyPart {
+ /* 0 */ KAREBABA_BODYPART_0,
+ /* 1 */ KAREBABA_BODYPART_1,
+ /* 2 */ KAREBABA_BODYPART_2,
+ /* 3 */ KAREBABA_BODYPART_3,
+ /* 4 */ KAREBABA_BODYPART_MAX
+} KarebabaBodyPart;
typedef struct EnKarebaba {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ EnKarebabaActionFunc actionFunc;
- /* 0x18C */ Vec3s jointTable[8];
- /* 0x1BC */ Vec3s morphTable[8];
+ /* 0x18C */ Vec3s jointTable[DEKUBABA_LIMB_MAX];
+ /* 0x1BC */ Vec3s morphTable[DEKUBABA_LIMB_MAX];
/* 0x1EC */ u8 drawDmgEffType;
- /* 0x1EE */ s16 unk_1EE;
+ /* 0x1EE */ s16 timer;
/* 0x1F0 */ f32 drawDmgEffAlpha;
/* 0x1F4 */ f32 drawDmgEffScale;
/* 0x1F8 */ f32 drawDmgEffFrozenSteamScale;
- /* 0x1FC */ Vec3f limbPos[4];
- /* 0x22C */ CollisionPoly* unk_22C;
- /* 0x230 */ ColliderCylinder collider1;
- /* 0x27C */ ColliderCylinder collider2;
+ /* 0x1FC */ Vec3f bodyPartsPos[KAREBABA_BODYPART_MAX];
+ /* 0x22C */ CollisionPoly* boundFloor;
+ /* 0x230 */ ColliderCylinder attackCollider;
+ /* 0x27C */ ColliderCylinder hurtCollider;
} EnKarebaba; // size = 0x2C8
#endif // Z_EN_KAREBABA_H
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..01e781ecb 100644
--- a/src/overlays/actors/ovl_En_Kbt/z_en_kbt.c
+++ b/src/overlays/actors/ovl_En_Kbt/z_en_kbt.c
@@ -6,7 +6,7 @@
#include "z_en_kbt.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnKbt*)thisx)
@@ -17,11 +17,28 @@ void EnKbt_Draw(Actor* thisx, PlayState* play);
s32 func_80B33E64(PlayState* play);
s32 func_80B33E8C(PlayState* play);
-void func_80B33EF0(EnKbt* this, s16 arg1);
+void EnKbt_ChangeAnim(EnKbt* this, s16 animIndex);
Actor* func_80B3403C(PlayState* play);
void func_80B34314(EnKbt* this, PlayState* play);
void func_80B34598(EnKbt* this, PlayState* play);
+typedef enum EnKbtAnimation {
+ /* 0 */ ENKBT_ANIM_0,
+ /* 1 */ ENKBT_ANIM_1,
+ /* 2 */ ENKBT_ANIM_2,
+ /* 3 */ ENKBT_ANIM_3,
+ /* 4 */ ENKBT_ANIM_4,
+ /* 5 */ ENKBT_ANIM_5,
+ /* 6 */ ENKBT_ANIM_6,
+ /* 7 */ ENKBT_ANIM_7,
+ /* 8 */ ENKBT_ANIM_8,
+ /* 9 */ ENKBT_ANIM_9,
+ /* 10 */ ENKBT_ANIM_10,
+ /* 11 */ ENKBT_ANIM_11,
+ /* 12 */ ENKBT_ANIM_12,
+ /* 13 */ ENKBT_ANIM_MAX
+} EnKbtAnimation;
+
ActorInit En_Kbt_InitVars = {
ACTOR_EN_KBT,
ACTORCAT_NPC,
@@ -44,13 +61,13 @@ void EnKbt_Init(Actor* thisx, PlayState* play) {
this->actor.home.rot.z = 0;
this->unk_27E = 4;
this->unk_27F = 0;
- this->unk_280 = 13;
+ this->animIndex = ENKBT_ANIM_MAX;
this->unk_282 = 13;
this->unk_278 = func_80B3403C(play);
this->unk_284 = 0;
this->actor.textId = 0;
if (func_80B33E64(play)) {
- func_80B33EF0(this, 6);
+ EnKbt_ChangeAnim(this, ENKBT_ANIM_6);
this->unk_282 = 11;
if (func_80B33E8C(play)) {
this->actor.textId = 0xC50;
@@ -60,49 +77,70 @@ void EnKbt_Init(Actor* thisx, PlayState* play) {
}
this->actionFunc = func_80B34314;
} else {
- func_80B33EF0(this, 0);
+ EnKbt_ChangeAnim(this, ENKBT_ANIM_0);
this->unk_282 = 0;
this->actionFunc = func_80B34598;
}
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
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;
}
-void func_80B33EF0(EnKbt* this, s16 arg1) {
- static AnimationHeader* sAnimations[] = {
- &object_kbt_Anim_000670, &object_kbt_Anim_001674, &object_kbt_Anim_002084, &object_kbt_Anim_000FE8,
- &object_kbt_Anim_001940, &object_kbt_Anim_00E7BC, &object_kbt_Anim_00F0C8, &object_kbt_Anim_002710,
- &object_kbt_Anim_002DE0, &object_kbt_Anim_003414, &object_kbt_Anim_003D24, &object_kbt_Anim_001BF4,
- &object_kbt_Anim_002084,
+void EnKbt_ChangeAnim(EnKbt* this, s16 animIndex) {
+ static AnimationHeader* sAnimations[ENKBT_ANIM_MAX] = {
+ &object_kbt_Anim_000670, // ENKBT_ANIM_0
+ &object_kbt_Anim_001674, // ENKBT_ANIM_1
+ &object_kbt_Anim_002084, // ENKBT_ANIM_2
+ &object_kbt_Anim_000FE8, // ENKBT_ANIM_3
+ &object_kbt_Anim_001940, // ENKBT_ANIM_4
+ &object_kbt_Anim_00E7BC, // ENKBT_ANIM_5
+ &object_kbt_Anim_00F0C8, // ENKBT_ANIM_6
+ &object_kbt_Anim_002710, // ENKBT_ANIM_7
+ &object_kbt_Anim_002DE0, // ENKBT_ANIM_8
+ &object_kbt_Anim_003414, // ENKBT_ANIM_9
+ &object_kbt_Anim_003D24, // ENKBT_ANIM_10
+ &object_kbt_Anim_001BF4, // ENKBT_ANIM_11
+ &object_kbt_Anim_002084, // ENKBT_ANIM_12
};
- u8 sp38[] = {
- ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_LOOP, ANIMMODE_LOOP,
- ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_ONCE,
+ u8 animationModes[ENKBT_ANIM_MAX] = {
+ ANIMMODE_LOOP, // ENKBT_ANIM_0
+ ANIMMODE_LOOP, // ENKBT_ANIM_1
+ ANIMMODE_ONCE, // ENKBT_ANIM_2
+ ANIMMODE_LOOP, // ENKBT_ANIM_3
+ ANIMMODE_ONCE, // ENKBT_ANIM_4
+ ANIMMODE_LOOP, // ENKBT_ANIM_5
+ ANIMMODE_LOOP, // ENKBT_ANIM_6
+ ANIMMODE_LOOP, // ENKBT_ANIM_7
+ ANIMMODE_LOOP, // ENKBT_ANIM_8
+ ANIMMODE_LOOP, // ENKBT_ANIM_9
+ ANIMMODE_LOOP, // ENKBT_ANIM_10
+ ANIMMODE_ONCE, // ENKBT_ANIM_11
+ ANIMMODE_ONCE, // ENKBT_ANIM_12
};
- if (arg1 != this->unk_280) {
- if (arg1 >= 12) {
- Animation_Change(&this->skelAnime, sAnimations[arg1], -1.0f,
- Animation_GetLastFrame(sAnimations[arg1]) - 1.0f, 0.0f, sp38[arg1], -5.0f);
+ if (this->animIndex != animIndex) {
+ if (animIndex >= ENKBT_ANIM_12) {
+ Animation_Change(&this->skelAnime, sAnimations[animIndex], -1.0f,
+ Animation_GetLastFrame(sAnimations[animIndex]) - 1.0f, 0.0f, animationModes[animIndex],
+ -5.0f);
} else {
- Animation_Change(&this->skelAnime, sAnimations[arg1], 1.0f, 0.0f, Animation_GetLastFrame(sAnimations[arg1]),
- sp38[arg1], -5.0f);
+ Animation_Change(&this->skelAnime, sAnimations[animIndex], 1.0f, 0.0f,
+ Animation_GetLastFrame(sAnimations[animIndex]), animationModes[animIndex], -5.0f);
}
- this->unk_280 = arg1;
+ this->animIndex = animIndex;
}
}
@@ -124,11 +162,11 @@ void func_80B34078(EnKbt* this) {
if (this->unk_284 > 0) {
this->unk_284--;
} else {
- switch (this->unk_280) {
- case 2:
+ switch (this->animIndex) {
+ case ENKBT_ANIM_2:
switch (this->unk_282) {
case 0:
- func_80B33EF0(this, 12);
+ EnKbt_ChangeAnim(this, ENKBT_ANIM_12);
break;
case 5:
@@ -136,21 +174,24 @@ void func_80B34078(EnKbt* this) {
break;
default:
- func_80B33EF0(this, 5);
+ EnKbt_ChangeAnim(this, ENKBT_ANIM_5);
break;
}
break;
- case 12:
- func_80B33EF0(this, 0);
+ case ENKBT_ANIM_12:
+ EnKbt_ChangeAnim(this, ENKBT_ANIM_0);
this->actor.home.rot.z = 0;
break;
- case 4:
- func_80B33EF0(this, 1);
+ case ENKBT_ANIM_4:
+ EnKbt_ChangeAnim(this, ENKBT_ANIM_1);
this->unk_27E = 2;
this->actor.home.rot.z = 0;
break;
+
+ default:
+ break;
}
}
}
@@ -169,74 +210,75 @@ void func_80B3415C(EnKbt* this) {
switch (this->unk_282) {
case 0:
- if ((this->unk_280 != 2) && (this->unk_280 != 12)) {
- func_80B33EF0(this, 0);
+ if ((this->animIndex != ENKBT_ANIM_2) && (this->animIndex != ENKBT_ANIM_12)) {
+ EnKbt_ChangeAnim(this, ENKBT_ANIM_0);
}
break;
case 1:
- func_80B33EF0(this, 2);
+ EnKbt_ChangeAnim(this, ENKBT_ANIM_2);
this->unk_282 = 0;
break;
case 2:
- if (this->unk_280 != 12) {
- func_80B33EF0(this, 3);
+ if (this->animIndex != ENKBT_ANIM_12) {
+ EnKbt_ChangeAnim(this, ENKBT_ANIM_3);
}
break;
case 3:
- if (this->unk_280 != 1) {
- func_80B33EF0(this, 4);
+ if (this->animIndex != ENKBT_ANIM_1) {
+ EnKbt_ChangeAnim(this, ENKBT_ANIM_4);
}
break;
case 10:
- func_80B33EF0(this, 11);
+ EnKbt_ChangeAnim(this, ENKBT_ANIM_11);
break;
case 4:
- func_80B33EF0(this, 2);
+ EnKbt_ChangeAnim(this, ENKBT_ANIM_2);
this->unk_282 = 6;
break;
case 6:
- if (this->unk_280 != 2) {
- func_80B33EF0(this, 5);
+ if (this->animIndex != ENKBT_ANIM_2) {
+ EnKbt_ChangeAnim(this, ENKBT_ANIM_5);
}
break;
case 11:
- func_80B33EF0(this, 6);
+ EnKbt_ChangeAnim(this, ENKBT_ANIM_6);
break;
case 7:
- if (this->unk_280 != 2) {
- func_80B33EF0(this, 7);
+ if (this->animIndex != ENKBT_ANIM_2) {
+ EnKbt_ChangeAnim(this, ENKBT_ANIM_7);
}
break;
case 8:
- if (this->unk_280 != 2) {
- func_80B33EF0(this, 8);
+ if (this->animIndex != ENKBT_ANIM_2) {
+ EnKbt_ChangeAnim(this, ENKBT_ANIM_8);
}
break;
case 9:
- if (this->unk_280 != 2) {
- func_80B33EF0(this, 9);
+ if (this->animIndex != ENKBT_ANIM_2) {
+ EnKbt_ChangeAnim(this, ENKBT_ANIM_9);
}
break;
case 12:
- func_80B33EF0(this, 10);
+ EnKbt_ChangeAnim(this, ENKBT_ANIM_10);
+ break;
+
+ default:
break;
}
}
void func_80B34314(EnKbt* this, PlayState* play) {
- s32 playerForm;
-
func_80B34078(this);
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
@@ -250,10 +292,9 @@ void func_80B34314(EnKbt* this, PlayState* play) {
} else if (this->actor.xzDistToPlayer < 250.0f) {
if ((this->unk_278 != NULL) && (this->unk_278->xzDistToPlayer < 250.0f)) {
if (this->unk_27C & 4) {
- playerForm = gSaveContext.save.playerForm;
- if (((playerForm ^ 0) != PLAYER_FORM_HUMAN) || ((CUR_FORM_EQUIP(EQUIP_SLOT_B) != ITEM_SWORD_KOKIRI) &&
- (CUR_FORM_EQUIP(EQUIP_SLOT_B) != ITEM_SWORD_RAZOR) &&
- (CUR_FORM_EQUIP(EQUIP_SLOT_B) != ITEM_SWORD_GILDED))) {
+ if ((GET_PLAYER_FORM != PLAYER_FORM_HUMAN) || ((CUR_FORM_EQUIP(EQUIP_SLOT_B) != ITEM_SWORD_KOKIRI) &&
+ (CUR_FORM_EQUIP(EQUIP_SLOT_B) != ITEM_SWORD_RAZOR) &&
+ (CUR_FORM_EQUIP(EQUIP_SLOT_B) != ITEM_SWORD_GILDED))) {
this->actor.textId = 0xC38;
} else if (CURRENT_DAY == 3) {
this->actor.textId = 0xC39;
@@ -264,19 +305,29 @@ void func_80B34314(EnKbt* this, PlayState* play) {
}
}
- if (this->actor.textId != 0xC37) {
- if (((this->actor.textId == 0xC4E) || (this->actor.textId == 0xC4F) || (this->actor.textId == 0xC50)) &&
- (gSaveContext.save.playerForm != PLAYER_FORM_HUMAN)) {
- this->actor.textId = 0xC37;
- }
- } else if (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) {
- if (func_80B33E8C(play)) {
- this->actor.textId = 0xC50;
- } else {
- this->actor.textId = 0xC4E;
- }
+ switch (this->actor.textId) {
+ case 0xC4E:
+ case 0xC4F:
+ case 0xC50:
+ if (GET_PLAYER_FORM != PLAYER_FORM_HUMAN) {
+ this->actor.textId = 0xC37;
+ }
+ break;
+
+ case 0xC37:
+ if (GET_PLAYER_FORM == PLAYER_FORM_HUMAN) {
+ if (func_80B33E8C(play)) {
+ this->actor.textId = 0xC50;
+ } else {
+ this->actor.textId = 0xC4E;
+ }
+ }
+ break;
+
+ default:
+ break;
}
- func_800B8614(&this->actor, play, 260.0f);
+ Actor_OfferTalk(&this->actor, play, 260.0f);
}
}
func_80B3415C(this);
@@ -320,7 +371,7 @@ void func_80B34598(EnKbt* this, PlayState* play) {
this->unk_27E = 4;
this->unk_27F = 0;
this->unk_282 = 0;
- func_80B33EF0(this, 12);
+ EnKbt_ChangeAnim(this, ENKBT_ANIM_12);
break;
case 0x6:
@@ -404,26 +455,26 @@ void func_80B34598(EnKbt* this, PlayState* play) {
case 0xC35:
this->unk_27E = 4;
this->unk_27F = 0;
- func_80B33EF0(this, 2);
+ EnKbt_ChangeAnim(this, ENKBT_ANIM_2);
this->unk_282 = 5;
break;
case 0xC36:
this->unk_27E = 1;
this->unk_27F = 1;
- func_80B33EF0(this, 7);
+ EnKbt_ChangeAnim(this, ENKBT_ANIM_7);
this->unk_282 = 7;
break;
case 0xC37:
- func_80B33EF0(this, 10);
+ EnKbt_ChangeAnim(this, ENKBT_ANIM_10);
this->unk_27E = 0;
this->unk_27F = 1;
break;
case 0xC38:
case 0xC39:
- func_80B33EF0(this, 7);
+ EnKbt_ChangeAnim(this, ENKBT_ANIM_7);
this->unk_27E = 0;
this->unk_27F = 1;
break;
@@ -510,6 +561,9 @@ void func_80B34598(EnKbt* this, PlayState* play) {
this->unk_27F = 1;
this->unk_282 = 12;
break;
+
+ default:
+ break;
}
this->actor.textId = 0;
@@ -557,7 +611,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_Kbt/z_en_kbt.h b/src/overlays/actors/ovl_En_Kbt/z_en_kbt.h
index eb491bf28..9a7a5cdf0 100644
--- a/src/overlays/actors/ovl_En_Kbt/z_en_kbt.h
+++ b/src/overlays/actors/ovl_En_Kbt/z_en_kbt.h
@@ -17,7 +17,7 @@ typedef struct EnKbt {
/* 0x27C */ u16 unk_27C;
/* 0x27E */ u8 unk_27E;
/* 0x27F */ u8 unk_27F;
- /* 0x280 */ s16 unk_280;
+ /* 0x280 */ s16 animIndex;
/* 0x282 */ s16 unk_282;
/* 0x284 */ s16 unk_284;
/* 0x288 */ EnKbtActionFunc actionFunc;
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 c02b00b5a..31d98abf0 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
@@ -6,9 +6,9 @@
#include "z_en_kendo_js.h"
#include "overlays/actors/ovl_En_Maruta/z_en_maruta.h"
-#include "objects/object_js/object_js.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_2000000 | ACTOR_FLAG_8000000)
+#define FLAGS \
+ (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_2000000 | ACTOR_FLAG_CANT_LOCK_ON)
#define THIS ((EnKendoJs*)thisx)
@@ -71,12 +71,21 @@ static ColliderCylinderInit sCylinderInit = {
static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE };
-static AnimationInfo sAnimationInfo[] = {
- { &object_js_Anim_000C7C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
- { &object_js_Anim_000F4C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
- { &object_js_Anim_00016C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
- { &object_js_Anim_0003DC, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f },
- { &object_js_Anim_000AD4, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
+typedef enum EnKendoJsAnimation {
+ /* 0 */ ENKENDOJS_ANIM_0,
+ /* 1 */ ENKENDOJS_ANIM_1,
+ /* 2 */ ENKENDOJS_ANIM_2,
+ /* 3 */ ENKENDOJS_ANIM_3,
+ /* 4 */ ENKENDOJS_ANIM_4,
+ /* 5 */ ENKENDOJS_ANIM_MAX
+} EnKendoJsAnimation;
+
+static AnimationInfo sAnimationInfo[ENKENDOJS_ANIM_MAX] = {
+ { &object_js_Anim_000C7C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // ENKENDOJS_ANIM_0
+ { &object_js_Anim_000F4C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // ENKENDOJS_ANIM_1
+ { &object_js_Anim_00016C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // ENKENDOJS_ANIM_2
+ { &object_js_Anim_0003DC, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f }, // ENKENDOJS_ANIM_3
+ { &object_js_Anim_000AD4, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // ENKENDOJS_ANIM_4
};
s16 D_80B27CE0[][3] = {
@@ -109,7 +118,7 @@ void EnKendoJs_Init(Actor* thisx, PlayState* play) {
CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit);
SkelAnime_InitFlex(play, &this->skelAnime, &object_js_Skel_006990, &object_js_Anim_000F4C, this->jointTable,
- this->morphTable, 13);
+ this->morphTable, OBJECT_JS_LIMB_MAX);
if ((CURRENT_DAY == 3) &&
!((gSaveContext.save.time <= CLOCK_TIME(23, 0)) && (gSaveContext.save.time >= CLOCK_TIME(6, 0)))) {
@@ -119,13 +128,13 @@ void EnKendoJs_Init(Actor* thisx, PlayState* play) {
this->actor.home.rot.z, 0x10);
Actor_Kill(&this->actor);
} else {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 4);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENKENDOJS_ANIM_4);
}
} else if (ENKENDOJS_GET_FF(&this->actor) == ENKENDOJS_FF_1) {
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)];
@@ -133,7 +142,7 @@ void EnKendoJs_Init(Actor* thisx, PlayState* play) {
this->unk_274 = Lib_SegmentedToVirtual(path->points);
}
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.focus.pos = this->actor.world.pos;
this->actor.focus.pos.y += 30.0f;
this->actor.child = NULL;
@@ -159,7 +168,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 {
@@ -169,8 +178,8 @@ void func_80B2654C(EnKendoJs* this, PlayState* play) {
if (ENKENDOJS_GET_FF(&this->actor) == ENKENDOJS_FF_1) {
Message_StartTextbox(play, 0x273C, &this->actor);
this->unk_288 = 0x273C;
- } else if (gSaveContext.save.playerForm != PLAYER_FORM_HUMAN) {
- switch (gSaveContext.save.playerForm) {
+ } else if (GET_PLAYER_FORM != PLAYER_FORM_HUMAN) {
+ switch (GET_PLAYER_FORM) {
case PLAYER_FORM_DEKU:
phi_v0 = 0;
break;
@@ -193,7 +202,8 @@ void func_80B2654C(EnKendoJs* this, PlayState* play) {
} else if ((Player_GetMask(play) != PLAYER_MASK_NONE) && (Player_GetMask(play) < PLAYER_MASK_GIANT)) {
u16 sp2E = Player_GetMask(play) + 0x273C;
- if (0) {}
+ //! FAKE:
+ if (1) {}
Message_StartTextbox(play, sp2E, &this->actor);
this->unk_288 = sp2E;
@@ -210,7 +220,7 @@ void func_80B2654C(EnKendoJs* this, PlayState* play) {
func_80B26AE8(this);
} else {
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
}
@@ -219,16 +229,16 @@ void func_80B26758(EnKendoJs* this, PlayState* play) {
switch (play->msgCtx.choiceIndex) {
case 0:
if (GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == EQUIP_VALUE_SWORD_NONE) {
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
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) {
- play_sound(NA_SE_SY_ERROR);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENKENDOJS_ANIM_2);
+ } else if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk1206C) {
+ Audio_PlaySfx(NA_SE_SY_ERROR);
Message_StartTextbox(play, 0x2718, &this->actor);
this->unk_288 = 0x2718;
} else {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
Rupees_ChangeBy(-play->msgCtx.unk1206C);
Message_StartTextbox(play, 0x2719, &this->actor);
this->unk_288 = 0x2719;
@@ -237,16 +247,16 @@ void func_80B26758(EnKendoJs* this, PlayState* play) {
case 1:
if (GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == EQUIP_VALUE_SWORD_NONE) {
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
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) {
- play_sound(NA_SE_SY_ERROR);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENKENDOJS_ANIM_2);
+ } else if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk12070) {
+ Audio_PlaySfx(NA_SE_SY_ERROR);
Message_StartTextbox(play, 0x2718, &this->actor);
this->unk_288 = 0x2718;
} else {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
Rupees_ChangeBy(-play->msgCtx.unk12070);
Message_StartTextbox(play, 0x273A, &this->actor);
this->unk_288 = 0x273A;
@@ -254,9 +264,12 @@ void func_80B26758(EnKendoJs* this, PlayState* play) {
break;
case 2:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
Message_StartTextbox(play, 0x2717, &this->actor);
this->unk_288 = 0x2717;
+
+ default:
+ break;
}
}
}
@@ -280,13 +293,13 @@ void func_80B269A4(EnKendoJs* this, PlayState* play) {
break;
case 0x2719:
- func_801477B4(play);
+ Message_CloseTextbox(play);
player->stateFlags1 |= PLAYER_STATE1_20;
func_80B2701C(this);
break;
case 0x271A:
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_80B2714C(this);
break;
@@ -296,18 +309,21 @@ void func_80B269A4(EnKendoJs* this, PlayState* play) {
break;
case 0x273B:
- func_801477B4(play);
+ Message_CloseTextbox(play);
Interface_InitMinigame(play);
player->stateFlags1 |= PLAYER_STATE1_20;
func_80B273D0(this);
break;
case 0x272D:
- func_801477B4(play);
+ Message_CloseTextbox(play);
gSaveContext.minigameStatus = MINIGAME_STATUS_END;
func_80B276C4(this);
func_80B276D8(this, play);
break;
+
+ default:
+ break;
}
}
@@ -330,7 +346,7 @@ void func_80B26AFC(EnKendoJs* this, PlayState* play) {
case TEXT_STATE_DONE:
if (Message_ShouldAdvance(play)) {
if (this->unk_288 == 0x272C) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENKENDOJS_ANIM_3);
}
if ((this->unk_288 == 0x272E) || (this->unk_288 == 0x272F) || (this->unk_288 == 0x2730)) {
@@ -345,6 +361,7 @@ void func_80B26AFC(EnKendoJs* this, PlayState* play) {
case TEXT_STATE_1:
case TEXT_STATE_CLOSING:
case TEXT_STATE_3:
+ default:
break;
}
}
@@ -358,8 +375,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;
@@ -369,7 +386,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;
@@ -379,8 +397,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;
@@ -440,6 +458,9 @@ s32 func_80B26BF8(EnKendoJs* this, PlayState* play) {
return 1;
}
break;
+
+ default:
+ break;
}
return 2;
}
@@ -460,7 +481,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;
@@ -474,6 +495,9 @@ s32 func_80B26F6C(EnKendoJs* this, PlayState* play) {
return true;
}
break;
+
+ default:
+ break;
}
return false;
}
@@ -498,7 +522,7 @@ void func_80B27030(EnKendoJs* this, PlayState* play) {
this->unk_288 = 0x271A;
func_80B26AE8(this);
} else {
- func_800B8614(&this->actor, play, 800.0f);
+ Actor_OfferTalk(&this->actor, play, 800.0f);
}
}
}
@@ -520,10 +544,10 @@ void func_80B27188(EnKendoJs* this, PlayState* play) {
func_80B26F14(this, play);
} else if (!func_80B26F6C(this, play)) {
if (this->skelAnime.animation == &object_js_Anim_00016C) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENKENDOJS_ANIM_3);
}
this->unk_286 = 2;
- func_801477B4(play);
+ Message_CloseTextbox(play);
player->stateFlags1 &= ~PLAYER_STATE1_20;
}
} else if (this->unk_286 == 2) {
@@ -534,18 +558,18 @@ void func_80B27188(EnKendoJs* this, PlayState* play) {
switch (func_80B26BF8(this, play)) {
case 0:
this->unk_286 = 0;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
+ Actor_PlaySfx(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
player->stateFlags1 |= PLAYER_STATE1_20;
func_80B26EB4(this, play);
break;
case 1:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_ERROR);
+ Actor_PlaySfx(&this->actor, NA_SE_SY_ERROR);
this->unk_286 = 0;
player->stateFlags1 |= PLAYER_STATE1_20;
Message_StartTextbox(play, 0x2729, &this->actor);
this->unk_288 = 0x2729;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENKENDOJS_ANIM_2);
break;
default:
@@ -561,7 +585,7 @@ void func_80B27188(EnKendoJs* this, PlayState* play) {
if ((this->skelAnime.animation == &object_js_Anim_0003DC) &&
Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENKENDOJS_ANIM_1);
}
if (this->unk_284 == 7) {
@@ -610,7 +634,7 @@ void func_80B274BC(EnKendoJs* this, PlayState* play) {
return;
}
- play_sound(NA_SE_SY_FOUND);
+ Audio_PlaySfx(NA_SE_SY_FOUND);
func_80B279F0(this, play, ((u8)Rand_Next() % 3) + 1);
func_80B279F0(this, play, ((u8)Rand_Next() % 3) + 4);
this->unk_290 = 0;
@@ -634,7 +658,7 @@ void func_80B274BC(EnKendoJs* this, PlayState* play) {
} else {
play->interfaceCtx.minigamePoints = 1;
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
+ Actor_PlaySfx(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
this->unk_28E = 0;
}
func_80B2783C(this, play);
@@ -649,9 +673,9 @@ void func_80B276D8(EnKendoJs* this, PlayState* play) {
this->actor.parent = NULL;
func_80B27760(this);
} else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_63_20)) {
- Actor_PickUp(&this->actor, play, GI_HEART_PIECE, 800.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_HEART_PIECE, 800.0f, 100.0f);
} else {
- Actor_PickUp(&this->actor, play, GI_RUPEE_RED, 800.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_RUPEE_RED, 800.0f, 100.0f);
}
}
@@ -674,14 +698,14 @@ void func_80B27774(EnKendoJs* this, PlayState* play) {
func_80B26AE8(this);
player->stateFlags1 &= ~PLAYER_STATE1_20;
} else {
- func_800B85E0(&this->actor, play, 1000.0f, -1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 1000.0f, PLAYER_IA_MINUS1);
}
}
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);
}
}
@@ -761,7 +785,7 @@ void EnKendoJs_Update(Actor* thisx, PlayState* play) {
s32 EnKendoJs_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnKendoJs* this = THIS;
- if (limbIndex == 12) {
+ if (limbIndex == OBJECT_JS_LIMB_0C) {
rot->y -= this->unk_278.y;
}
return false;
@@ -773,7 +797,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_Kendo_Js/z_en_kendo_js.h b/src/overlays/actors/ovl_En_Kendo_Js/z_en_kendo_js.h
index 1992f7234..8602550e0 100644
--- a/src/overlays/actors/ovl_En_Kendo_Js/z_en_kendo_js.h
+++ b/src/overlays/actors/ovl_En_Kendo_Js/z_en_kendo_js.h
@@ -2,6 +2,7 @@
#define Z_EN_KENDO_JS_H
#include "global.h"
+#include "objects/object_js/object_js.h"
struct EnKendoJs;
@@ -17,8 +18,8 @@ typedef struct EnKendoJs {
/* 0x144 */ ColliderCylinder collider;
/* 0x190 */ SkelAnime skelAnime;
/* 0x1D4 */ EnKendoJsActionFunc actionFunc;
- /* 0x1D8 */ Vec3s jointTable[13];
- /* 0x226 */ Vec3s morphTable[13];
+ /* 0x1D8 */ Vec3s jointTable[OBJECT_JS_LIMB_MAX];
+ /* 0x226 */ Vec3s morphTable[OBJECT_JS_LIMB_MAX];
/* 0x274 */ Vec3s* unk_274;
/* 0x278 */ Vec3s unk_278;
/* 0x27E */ Vec3s unk_27E;
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 f188e1df0..5f180a285 100644
--- a/src/overlays/actors/ovl_En_Kgy/z_en_kgy.c
+++ b/src/overlays/actors/ovl_En_Kgy/z_en_kgy.c
@@ -5,10 +5,9 @@
*/
#include "z_en_kgy.h"
-#include "objects/object_kgy/object_kgy.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnKgy*)thisx)
@@ -17,7 +16,7 @@ void EnKgy_Destroy(Actor* thisx, PlayState* play);
void EnKgy_Update(Actor* thisx, PlayState* play);
void EnKgy_Draw(Actor* thisx, PlayState* play);
-void EnKgy_ChangeAnim(EnKgy* this, s16 animIndex, u8 mode, f32 morphFrames);
+void EnKgy_ChangeAnim(EnKgy* this, s16 animIndex, u8 animMode, f32 morphFrames);
EnKbt* EnKgy_FindZubora(PlayState* play);
ObjIcePoly* EnKgy_FindIceBlock(PlayState* play);
void func_80B40D30(PlayState* play);
@@ -31,6 +30,21 @@ void func_80B425A0(EnKgy* this, PlayState* play);
void func_80B42714(EnKgy* this, PlayState* play);
void func_80B42D28(EnKgy* this, PlayState* play);
+typedef enum EnKgyAnimation {
+ /* -1 */ ENKGY_ANIM_NONE = -1,
+ /* 0 */ ENKGY_ANIM_0,
+ /* 1 */ ENKGY_ANIM_1,
+ /* 2 */ ENKGY_ANIM_2,
+ /* 3 */ ENKGY_ANIM_3,
+ /* 4 */ ENKGY_ANIM_4,
+ /* 5 */ ENKGY_ANIM_5,
+ /* 6 */ ENKGY_ANIM_6,
+ /* 7 */ ENKGY_ANIM_7,
+ /* 8 */ ENKGY_ANIM_8,
+ /* 9 */ ENKGY_ANIM_9,
+ /* 10 */ ENKGY_ANIM_MAX
+} EnKgyAnimation;
+
ActorInit En_Kgy_InitVars = {
ACTOR_EN_KGY,
ACTORCAT_NPC,
@@ -45,53 +59,54 @@ 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);
SkelAnime_InitFlex(play, &this->skelAnime, &object_kgy_Skel_00F910, &object_kgy_Anim_004B98, this->jointTable,
- this->morphTable, 23);
- this->unk_2D2 = -1;
+ this->morphTable, OBJECT_KGY_LIMB_MAX);
+ this->animIndex = ENKGY_ANIM_NONE;
this->unk_29C = 0;
this->unk_2E4 = 0;
- this->unk_2E2 = -1;
+ this->animIndex2 = ENKGY_ANIM_NONE;
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)) {
- Flags_SetSwitch(play, ENKGY_GET_FE00(&this->actor) + 1);
+ Flags_UnsetSwitch(play, ENKGY_GET_SWITCH_FLAG(&this->actor) + 1);
+ if (Flags_GetSwitch(play, ENKGY_GET_SWITCH_FLAG(&this->actor)) ||
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE)) {
+ Flags_SetSwitch(play, ENKGY_GET_SWITCH_FLAG(&this->actor) + 1);
play->envCtx.lightSettingOverride = 1;
SET_WEEKEVENTREG(WEEKEVENTREG_21_01);
if (!func_80B40D64(play)) {
- EnKgy_ChangeAnim(this, 4, ANIMMODE_LOOP, 0);
+ EnKgy_ChangeAnim(this, ENKGY_ANIM_4, ANIMMODE_LOOP, 0);
this->actionFunc = func_80B425A0;
this->actor.textId = 0xC35;
} else if (!func_80B40DB4(play)) {
- EnKgy_ChangeAnim(this, 6, ANIMMODE_ONCE, 0);
+ EnKgy_ChangeAnim(this, ENKGY_ANIM_6, ANIMMODE_ONCE, 0);
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);
+ EnKgy_ChangeAnim(this, ENKGY_ANIM_4, ANIMMODE_LOOP, 0);
this->actionFunc = func_80B42714;
this->actor.textId = 0xC50;
}
} else {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_20_80)) {
- EnKgy_ChangeAnim(this, 4, ANIMMODE_LOOP, 0);
+ EnKgy_ChangeAnim(this, ENKGY_ANIM_4, ANIMMODE_LOOP, 0);
} else {
- EnKgy_ChangeAnim(this, 0, ANIMMODE_LOOP, 0);
+ EnKgy_ChangeAnim(this, ENKGY_ANIM_0, ANIMMODE_LOOP, 0);
}
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);
}
}
@@ -99,7 +114,7 @@ void EnKgy_Init(Actor* thisx, PlayState* play) {
this->actor.world.pos.z, 255, 64, 64, -1);
this->lightNode = LightContext_InsertLight(play, &play->lightCtx, &this->lightInfo);
this->unk_300 = -1;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
void EnKgy_Destroy(Actor* thisx, PlayState* play) {
@@ -108,21 +123,28 @@ void EnKgy_Destroy(Actor* thisx, PlayState* play) {
LightContext_RemoveLight(play, &play->lightCtx, this->lightNode);
}
-void EnKgy_ChangeAnim(EnKgy* this, s16 animIndex, u8 mode, f32 morphFrames) {
- static AnimationHeader* sAnimations[] = {
- &object_kgy_Anim_004B98, &object_kgy_Anim_0008FC, &object_kgy_Anim_00292C, &object_kgy_Anim_0042E4,
- &object_kgy_Anim_0101F0, &object_kgy_Anim_001764, &object_kgy_Anim_003334, &object_kgy_Anim_010B84,
- &object_kgy_Anim_001EA4, &object_kgy_Anim_003D88,
- };
+static AnimationHeader* sAnimations[ENKGY_ANIM_MAX] = {
+ &object_kgy_Anim_004B98, // ENKGY_ANIM_0
+ &object_kgy_Anim_0008FC, // ENKGY_ANIM_1
+ &object_kgy_Anim_00292C, // ENKGY_ANIM_2
+ &object_kgy_Anim_0042E4, // ENKGY_ANIM_3
+ &object_kgy_Anim_0101F0, // ENKGY_ANIM_4
+ &object_kgy_Anim_001764, // ENKGY_ANIM_5
+ &object_kgy_Anim_003334, // ENKGY_ANIM_6
+ &object_kgy_Anim_010B84, // ENKGY_ANIM_7
+ &object_kgy_Anim_001EA4, // ENKGY_ANIM_8
+ &object_kgy_Anim_003D88, // ENKGY_ANIM_9
+};
+void EnKgy_ChangeAnim(EnKgy* this, s16 animIndex, u8 animMode, f32 morphFrames) {
Animation_Change(&this->skelAnime, sAnimations[animIndex], 1.0f, 0.0f,
- Animation_GetLastFrame(sAnimations[animIndex]), mode, morphFrames);
- this->unk_2D2 = animIndex;
+ Animation_GetLastFrame(sAnimations[animIndex]), animMode, morphFrames);
+ this->animIndex = animIndex;
}
-void func_80B40BC0(EnKgy* this, s16 arg1) {
- if (arg1 != this->unk_2D2) {
- EnKgy_ChangeAnim(this, arg1, ANIMMODE_LOOP, -5.0f);
+void EnKgy_ChangeAnimLoopMorph(EnKgy* this, s16 animIndex) {
+ if (this->animIndex != animIndex) {
+ EnKgy_ChangeAnim(this, animIndex, ANIMMODE_LOOP, -5.0f);
}
}
@@ -151,33 +173,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;
@@ -203,7 +225,7 @@ s32 func_80B40E54(EnKgy* this) {
}
void func_80B40E74(EnKgy* this, PlayState* play, u16 textId) {
- func_80151938(play, textId);
+ Message_ContinueTextbox(play, textId);
this->actor.textId = textId;
func_80B40E18(this, this->actor.textId);
}
@@ -217,24 +239,24 @@ void func_80B40EE8(EnKgy* this, PlayState* play) {
if (this->unk_2E4 > 0) {
this->unk_2E4--;
- if ((this->unk_2E4 == 0) && (this->unk_2E2 >= 0)) {
- if (this->unk_2E2 == 3) {
- EnKgy_ChangeAnim(this, 3, ANIMMODE_ONCE, -5.0f);
+ if ((this->unk_2E4 == 0) && (this->animIndex2 > ENKGY_ANIM_NONE)) {
+ if (this->animIndex2 == ENKGY_ANIM_3) {
+ EnKgy_ChangeAnim(this, ENKGY_ANIM_3, ANIMMODE_ONCE, -5.0f);
} else {
- func_80B40BC0(this, this->unk_2E2);
+ EnKgy_ChangeAnimLoopMorph(this, this->animIndex2);
}
- this->unk_2E2 = -1;
+ this->animIndex2 = ENKGY_ANIM_NONE;
}
}
- 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]);
}
}
@@ -250,21 +272,21 @@ void func_80B40EE8(EnKgy* this, PlayState* play) {
}
if (((temp_f0 < 0.15f) && (temp_f0 > -0.15f)) || (this->unk_2E6 == 0)) {
- func_80151938(play, this->actor.textId);
+ Message_ContinueTextbox(play, this->actor.textId);
this->unk_29C &= ~0x2;
func_80B40E18(this, this->actor.textId);
switch (this->actor.textId) {
case 0xC22:
this->unk_2E4 = 20;
- this->unk_2E2 = 3;
+ this->animIndex2 = ENKGY_ANIM_3;
break;
case 0xC43:
if (func_80B40D64(play)) {
- func_80B40BC0(this, 7);
+ EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_7);
} else {
- func_80B40BC0(this, 1);
+ EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_1);
}
this->unk_2E4 = 30;
this->actionFunc = func_80B41A48;
@@ -272,7 +294,10 @@ void func_80B40EE8(EnKgy* this, PlayState* play) {
case 0xC52:
case 0xC54:
- func_80B40BC0(this, 1);
+ EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_1);
+ break;
+
+ default:
break;
}
}
@@ -287,7 +312,7 @@ void func_80B40EE8(EnKgy* this, PlayState* play) {
if (this->unk_2E8 == 0) {
if ((this->actor.textId == 0xC1D) || (this->actor.textId == 0xC2D)) {
this->unk_2E4 = 20;
- this->unk_2E2 = 3;
+ this->animIndex2 = ENKGY_ANIM_3;
func_80B40EBC(this, play, this->actor.textId);
} else {
func_80B40EBC(this, play, this->actor.textId);
@@ -304,7 +329,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 +337,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 +345,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 +353,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 +361,16 @@ 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;
+
+ default:
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,14 +381,14 @@ 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;
}
s32 func_80B41460(void) {
- if ((gSaveContext.save.playerForm != PLAYER_FORM_HUMAN) ||
+ if ((GET_PLAYER_FORM != PLAYER_FORM_HUMAN) ||
((CUR_FORM_EQUIP(EQUIP_SLOT_B) != ITEM_SWORD_KOKIRI) && (CUR_FORM_EQUIP(EQUIP_SLOT_B) != ITEM_SWORD_RAZOR) &&
(CUR_FORM_EQUIP(EQUIP_SLOT_B) != ITEM_SWORD_GILDED))) {
return 0xC38;
@@ -418,16 +446,16 @@ void func_80B4163C(EnKgy* this, PlayState* play) {
this->actor.focus.pos = this->unk_2A8;
if (SkelAnime_Update(&this->skelAnime)) {
- if (this->unk_2D2 == 6) {
- if (this->unk_2EA > 0) {
- EnKgy_ChangeAnim(this, 6, ANIMMODE_ONCE, 0.0f);
- this->unk_2EA--;
+ if (this->animIndex == ENKGY_ANIM_6) {
+ if (this->getItemId > GI_NONE) {
+ EnKgy_ChangeAnim(this, ENKGY_ANIM_6, ANIMMODE_ONCE, 0.0f);
+ this->getItemId--;
} else {
- EnKgy_ChangeAnim(this, 9, ANIMMODE_ONCE, -5.0f);
- this->unk_2EA = (s32)Rand_ZeroFloat(3.0f) + 2;
+ EnKgy_ChangeAnim(this, ENKGY_ANIM_9, ANIMMODE_ONCE, -5.0f);
+ this->getItemId = (s32)Rand_ZeroFloat(GI_RUPEE_PURPLE - GI_RUPEE_BLUE) + GI_RUPEE_BLUE;
}
} else {
- EnKgy_ChangeAnim(this, 6, ANIMMODE_ONCE, -5.0f);
+ EnKgy_ChangeAnim(this, ENKGY_ANIM_6, ANIMMODE_ONCE, -5.0f);
}
SkelAnime_Update(&this->skelAnime);
}
@@ -443,7 +471,10 @@ void func_80B4163C(EnKgy* this, PlayState* play) {
this->lightInfo.params.point.y = this->unk_2C0.y;
this->lightInfo.params.point.z = this->unk_2C0.z;
this->unk_300 = 200;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_SWORD_FORGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_SWORD_FORGE);
+ break;
+
+ default:
break;
}
@@ -456,9 +487,9 @@ void func_80B4163C(EnKgy* this, PlayState* play) {
void func_80B417B8(EnKgy* this, PlayState* play) {
func_80B4163C(this, play);
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_80B413C8(this);
- this->actor.flags &= ~ACTOR_FLAG_100;
+ this->actor.flags &= ~ACTOR_FLAG_TALK_REQUESTED;
this->actionFunc = func_80B419B0;
func_80B40E18(this, 7);
}
@@ -467,12 +498,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]);
}
}
@@ -481,12 +512,12 @@ void func_80B418C4(EnKgy* this, PlayState* play) {
if ((this->unk_2E4 <= 0) && !(this->unk_29C & 2) && (func_80B40E54(this) == 0) &&
(Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play) &&
((play->msgCtx.currentTextId == 0xC4E) || (play->msgCtx.currentTextId == 0xC4F))) {
- func_801477B4(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_100;
+ this->actor.flags &= ~ACTOR_FLAG_TALK_REQUESTED;
}
func_80B40EE8(this, play);
}
@@ -529,7 +560,7 @@ void func_80B41ACC(EnKgy* this, PlayState* play) {
}
if (itemAction > PLAYER_IA_NONE) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
if (itemAction == PLAYER_IA_BOTTLE_GOLD_DUST) {
if (this->unk_29C & 0x10) {
this->actor.textId = 0xC55;
@@ -573,7 +604,7 @@ void func_80B41C54(EnKgy* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (Actor_TextboxIsClosing(&this->actor, play)) {
this->actionFunc = func_80B41C30;
- this->actor.flags &= ~ACTOR_FLAG_100;
+ this->actor.flags &= ~ACTOR_FLAG_TALK_REQUESTED;
}
func_80B40EE8(this, play);
}
@@ -586,7 +617,7 @@ void func_80B41CBC(EnKgy* this, PlayState* play) {
this->actionFunc = func_80B41E18;
func_80B411DC(this, play, 4);
} else {
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
}
}
@@ -595,9 +626,9 @@ void func_80B41D64(EnKgy* this, PlayState* play) {
if (Actor_HasParent(&this->actor, play)) {
this->actionFunc = func_80B41CBC;
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
} else {
- Actor_PickUp(&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);
}
@@ -607,11 +638,11 @@ void func_80B41E18(EnKgy* this, PlayState* play) {
s32 pad;
Player* player = GET_PLAYER(play);
- if (SkelAnime_Update(&this->skelAnime) && (this->unk_2D2 == 3)) {
- func_80B40BC0(this, 4);
+ if (SkelAnime_Update(&this->skelAnime) && (this->animIndex == ENKGY_ANIM_3)) {
+ EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_4);
}
- if ((this->unk_2E4 <= 0) && !(this->unk_29C & 2) && func_80B40E54(this) == 0) {
+ if ((this->unk_2E4 <= 0) && !(this->unk_29C & 2) && (func_80B40E54(this) == 0)) {
switch (Message_GetState(&play->msgCtx)) {
case TEXT_STATE_CHOICE:
if (Message_ShouldAdvance(play)) {
@@ -621,36 +652,45 @@ void func_80B41E18(EnKgy* this, PlayState* play) {
case 0xC3B:
switch (play->msgCtx.choiceIndex) {
case 0:
- if (gSaveContext.save.playerData.rupees < play->msgCtx.unk1206C) {
- play_sound(NA_SE_SY_ERROR);
+ if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk1206C) {
+ Audio_PlaySfx(NA_SE_SY_ERROR);
func_80B40E74(this, play, 0xC3F);
} else {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
func_80B40E74(this, play, 0xC42);
Rupees_ChangeBy(-play->msgCtx.unk1206C);
}
break;
case 1:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
func_80B40EBC(this, play, textId);
break;
+
+ default:
+ break;
}
break;
case 0xC3E:
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
func_80B40E74(this, play, func_80B41460());
break;
case 1:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
func_80B40E74(this, play, 0xC3C);
break;
+
+ default:
+ break;
}
break;
+
+ default:
+ break;
}
}
break;
@@ -678,17 +718,17 @@ void func_80B41E18(EnKgy* this, PlayState* play) {
case 0xC39:
case 0xC52:
case 0xC54:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80B425A0;
func_80B413C8(this);
func_80B40E18(this, 5);
- func_80B40BC0(this, 4);
+ EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_4);
this->actor.textId = 0xC35;
break;
case 0xC3A:
func_80B40E74(this, play, func_80B41528(play));
- func_80B40BC0(this, 4);
+ EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_4);
break;
case 0xC3C:
@@ -698,7 +738,7 @@ void func_80B41E18(EnKgy* this, PlayState* play) {
break;
case 0xC3D:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80B41C54;
this->actor.textId = 0xC3E;
func_80B413C8(this);
@@ -734,7 +774,7 @@ void func_80B41E18(EnKgy* this, PlayState* play) {
case 0xC57:
this->unk_29C &= ~0x8;
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80B41C54;
this->actor.textId = 0xC58;
func_80B413C8(this);
@@ -743,8 +783,8 @@ void func_80B41E18(EnKgy* this, PlayState* play) {
case 0xC46:
case 0xC55:
- Player_UpdateBottleHeld(play, GET_PLAYER(play), ITEM_BOTTLE, PLAYER_IA_BOTTLE);
- player->exchangeItemId = PLAYER_IA_NONE;
+ Player_UpdateBottleHeld(play, GET_PLAYER(play), ITEM_BOTTLE, PLAYER_IA_BOTTLE_EMPTY);
+ player->exchangeItemAction = PLAYER_IA_NONE;
this->unk_29C &= ~0x8;
play->msgCtx.msgLength = 0;
func_80B41368(this, play, 4);
@@ -757,9 +797,9 @@ void func_80B41E18(EnKgy* this, PlayState* play) {
break;
case 0xC47:
- func_80B40BC0(this, 1);
+ EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_1);
if (this->unk_29C & 8) {
- player->exchangeItemId = PLAYER_IA_NONE;
+ player->exchangeItemAction = PLAYER_IA_NONE;
this->unk_29C &= ~8;
}
func_80B40EBC(this, play, textId);
@@ -779,8 +819,8 @@ void func_80B41E18(EnKgy* this, PlayState* play) {
case 0xC4A:
case 0xC4B:
- func_80B40BC0(this, 4);
- func_801477B4(play);
+ EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_4);
+ Message_CloseTextbox(play);
this->actionFunc = func_80B41C54;
this->actor.textId = 0xC4B;
func_80B413C8(this);
@@ -789,16 +829,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;
}
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80B41D64;
func_80B413C8(this);
- Actor_PickUp(&this->actor, play, this->unk_2EA, 2000.0f, 1000.0f);
+ Actor_OfferGetItem(&this->actor, play, this->getItemId, 2000.0f, 1000.0f);
break;
case 0xC51:
@@ -810,15 +850,21 @@ void func_80B41E18(EnKgy* this, PlayState* play) {
break;
case 0xC56:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80B41C54;
this->actor.textId = 0xC56;
func_80B413C8(this);
func_80B40E18(this, 8);
break;
+
+ default:
+ break;
}
}
break;
+
+ default:
+ break;
}
}
@@ -843,11 +889,11 @@ void func_80B425A0(EnKgy* this, PlayState* play) {
this->actor.focus.pos = this->unk_2A8;
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actionFunc = func_80B41E18;
- func_80B40BC0(this, 1);
+ EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_1);
func_80B411DC(this, play, 0);
func_80B40E18(this, this->actor.textId);
} else if (this->actor.xzDistToPlayer < 200.0f) {
- func_800B8614(&this->actor, play, 210.0f);
+ Actor_OfferTalk(&this->actor, play, 210.0f);
}
}
@@ -855,9 +901,9 @@ void func_80B42660(EnKgy* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
this->actor.focus.pos = this->unk_2A8;
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_80B413C8(this);
- this->actor.flags &= ~ACTOR_FLAG_100;
+ this->actor.flags &= ~ACTOR_FLAG_TALK_REQUESTED;
this->actionFunc = func_80B42714;
func_80B40E18(this, 7);
}
@@ -886,11 +932,11 @@ void func_80B427C8(EnKgy* this, PlayState* play) {
u16 textId;
if (SkelAnime_Update(&this->skelAnime)) {
- if (this->unk_2D2 == 5) {
- func_80B40BC0(this, 7);
+ if (this->animIndex == ENKGY_ANIM_5) {
+ EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_7);
}
- if (this->unk_2D2 == 3) {
- func_80B40BC0(this, 4);
+ if (this->animIndex == ENKGY_ANIM_3) {
+ EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_4);
}
}
@@ -918,37 +964,40 @@ void func_80B427C8(EnKgy* this, PlayState* play) {
break;
case 0xC34:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80B41C54;
func_80B413C8(this);
func_80B40E18(this, 6);
- func_80B40BC0(this, 4);
+ EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_4);
this->actor.textId = 0xC3A;
break;
+
+ default:
+ break;
}
}
func_80B40EE8(this, play);
}
void func_80B4296C(EnKgy* this, PlayState* play) {
- if (SkelAnime_Update(&this->skelAnime) && (this->unk_2D2 == 8)) {
- func_80B40BC0(this, 2);
+ if (SkelAnime_Update(&this->skelAnime) && (this->animIndex == ENKGY_ANIM_8)) {
+ EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_2);
}
this->actor.focus.pos = this->unk_2A8;
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actionFunc = func_80B427C8;
- if (this->unk_2D2 == 4) {
- func_80B40BC0(this, 7);
+ if (this->animIndex == ENKGY_ANIM_4) {
+ EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_7);
} else {
- EnKgy_ChangeAnim(this, 5, ANIMMODE_ONCE, -5.0f);
+ EnKgy_ChangeAnim(this, ENKGY_ANIM_5, ANIMMODE_ONCE, -5.0f);
}
func_80B411DC(this, play, 0);
func_80B40E18(this, this->actor.textId);
this->actor.flags &= ~ACTOR_FLAG_10000;
} else {
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_NONE);
+ Actor_OfferTalkExchange(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_NONE);
}
}
@@ -957,12 +1006,12 @@ void func_80B42A8C(EnKgy* this, PlayState* play) {
s32 pad;
if (SkelAnime_Update(&this->skelAnime)) {
- if (this->unk_2D2 == 5) {
- func_80B40BC0(this, 1);
+ if (this->animIndex == ENKGY_ANIM_5) {
+ EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_1);
}
- if (this->unk_2D2 == 3) {
- func_80B40BC0(this, 4);
+ if (this->animIndex == ENKGY_ANIM_3) {
+ EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_4);
}
}
@@ -994,7 +1043,7 @@ void func_80B42A8C(EnKgy* this, PlayState* play) {
case 0xC20:
case 0xC28:
- func_80B40BC0(this, 1);
+ EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_1);
play->msgCtx.msgLength = 0;
this->unk_29C |= 4;
this->unk_2E8 = 3;
@@ -1026,54 +1075,57 @@ void func_80B42A8C(EnKgy* this, PlayState* play) {
case 0xC2A:
this->unk_2E4 = 20;
- this->unk_2E2 = 3;
+ this->animIndex2 = ENKGY_ANIM_3;
func_80B40EBC(this, play, this->actor.textId);
break;
case 0xC2C:
case 0xC2F:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80B42D28;
func_80B413C8(this);
func_80B40E18(this, 1);
break;
+
+ default:
+ break;
}
}
func_80B40EE8(this, play);
}
void func_80B42D28(EnKgy* this, PlayState* play) {
- if (SkelAnime_Update(&this->skelAnime) && (this->unk_2D2 == 8)) {
- func_80B40BC0(this, 2);
+ if (SkelAnime_Update(&this->skelAnime) && (this->animIndex == ENKGY_ANIM_8)) {
+ EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_2);
}
this->actor.focus.pos = this->unk_2A8;
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actionFunc = func_80B42A8C;
if (this->actor.textId == 0xC2D) {
- func_80B40BC0(this, 1);
+ EnKgy_ChangeAnimLoopMorph(this, ENKGY_ANIM_1);
} else {
- EnKgy_ChangeAnim(this, 5, ANIMMODE_ONCE, -5.0f);
+ EnKgy_ChangeAnim(this, ENKGY_ANIM_5, ANIMMODE_ONCE, -5.0f);
SET_WEEKEVENTREG(WEEKEVENTREG_20_80);
}
func_80B411DC(this, play, 0);
func_80B40E18(this, this->actor.textId);
} else {
- if (Flags_GetSwitch(play, ENKGY_GET_FE00(&this->actor))) {
+ if (Flags_GetSwitch(play, ENKGY_GET_SWITCH_FLAG(&this->actor))) {
this->actor.textId = 0xC30;
this->actionFunc = func_80B4296C;
SET_WEEKEVENTREG(WEEKEVENTREG_21_01);
} else if (this->actor.xzDistToPlayer < 200.0f) {
- if (this->unk_2D2 == 4) {
+ if (this->animIndex == ENKGY_ANIM_4) {
this->actor.textId = 0xC2D;
} else {
this->actor.textId = 0xC1D;
}
- func_800B8614(&this->actor, play, 210.0f);
+ Actor_OfferTalk(&this->actor, play, 210.0f);
}
- if ((this->unk_2D2 == 0) && (this->actor.xzDistToPlayer < 200.0f)) {
- EnKgy_ChangeAnim(this, 8, ANIMMODE_ONCE, 5.0f);
+ if ((this->animIndex == ENKGY_ANIM_0) && (this->actor.xzDistToPlayer < 200.0f)) {
+ EnKgy_ChangeAnim(this, ENKGY_ANIM_8, ANIMMODE_ONCE, 5.0f);
}
}
}
@@ -1084,7 +1136,7 @@ void EnKgy_Update(Actor* thisx, PlayState* play) {
Vec3s sp30;
this->actionFunc(this, play);
- if (this->unk_2D2 == 2) {
+ if (this->animIndex == ENKGY_ANIM_2) {
sp30.z = 0;
sp30.y = 0;
sp30.x = 0;
@@ -1099,14 +1151,14 @@ s32 EnKgy_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
EnKgy* this = THIS;
if (!(this->unk_29C & 1)) {
- if (limbIndex == 17) {
+ if (limbIndex == OBJECT_KGY_LIMB_11) {
*dList = NULL;
}
- } else if (limbIndex == 16) {
+ } else if (limbIndex == OBJECT_KGY_LIMB_10) {
*dList = NULL;
}
- if (limbIndex == 11) {
+ if (limbIndex == OBJECT_KGY_LIMB_0B) {
rot->x += this->unk_2CC.y;
}
@@ -1118,11 +1170,11 @@ void EnKgy_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
static Vec3f D_80B432E4 = { 3000.0f, 4000.0f, 300.0f };
EnKgy* this = THIS;
- if (limbIndex == 11) {
+ if (limbIndex == OBJECT_KGY_LIMB_0B) {
Matrix_MultVec3f(&D_80B432D8, &this->unk_2A8);
}
- if (limbIndex == 16) {
+ if (limbIndex == OBJECT_KGY_LIMB_10) {
Matrix_MultVec3f(&D_80B432E4, &this->unk_2C0);
}
}
@@ -1133,8 +1185,8 @@ void func_80B43074(EnKgy* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_800B8050(&this->actor, play, MTXMODE_NEW);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ func_800B8050(&this->actor, play, 0);
Matrix_Push();
Matrix_Translate(-800.0f, 3100.0f, 8400.0f, MTXMODE_APPLY);
Matrix_RotateXS(0x4000, MTXMODE_APPLY);
@@ -1165,7 +1217,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..9cd6f6848 100644
--- a/src/overlays/actors/ovl_En_Kgy/z_en_kgy.h
+++ b/src/overlays/actors/ovl_En_Kgy/z_en_kgy.h
@@ -2,6 +2,7 @@
#define Z_EN_KGY_H
#include "global.h"
+#include "objects/object_kgy/object_kgy.h"
#include "overlays/actors/ovl_En_Kbt/z_en_kbt.h"
#include "overlays/actors/ovl_Obj_Ice_Poly/z_obj_ice_poly.h"
@@ -10,13 +11,13 @@ struct EnKgy;
typedef void (*EnKgyActionFunc)(struct EnKgy*, PlayState*);
#define ENKGY_GET_1F(thisx) ((thisx)->params & 0x1F)
-#define ENKGY_GET_FE00(thisx) (((thisx)->params & 0xFE00) >> 9)
+#define ENKGY_GET_SWITCH_FLAG(thisx) (((thisx)->params & 0xFE00) >> 9)
typedef struct EnKgy {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[23];
- /* 0x212 */ Vec3s morphTable[23];
+ /* 0x188 */ Vec3s jointTable[OBJECT_KGY_LIMB_MAX];
+ /* 0x212 */ Vec3s morphTable[OBJECT_KGY_LIMB_MAX];
/* 0x29C */ u16 unk_29C;
/* 0x2A0 */ EnKbt* zubora;
/* 0x2A4 */ ObjIcePoly* iceBlock;
@@ -24,14 +25,14 @@ typedef struct EnKgy {
/* 0x2B4 */ Vec3f unk_2B4;
/* 0x2C0 */ Vec3f unk_2C0;
/* 0x2CC */ Vec3s unk_2CC;
- /* 0x2D2 */ s16 unk_2D2;
- /* 0x2D4 */ s16 unk_2D4[6];
- /* 0x2E0 */ s16 unk_2E0;
- /* 0x2E2 */ s16 unk_2E2;
+ /* 0x2D2 */ s16 animIndex;
+ /* 0x2D4 */ s16 csIdList[6];
+ /* 0x2E0 */ s16 csIdIndex;
+ /* 0x2E2 */ s16 animIndex2;
/* 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_Kitan/z_en_kitan.c b/src/overlays/actors/ovl_En_Kitan/z_en_kitan.c
index c9d40c1e7..d1edd3880 100644
--- a/src/overlays/actors/ovl_En_Kitan/z_en_kitan.c
+++ b/src/overlays/actors/ovl_En_Kitan/z_en_kitan.c
@@ -6,7 +6,7 @@
#include "z_en_kitan.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnKitan*)thisx)
diff --git a/src/overlays/actors/ovl_En_Knight/z_en_knight.c b/src/overlays/actors/ovl_En_Knight/z_en_knight.c
index 0d80d6020..fd4bc7a5b 100644
--- a/src/overlays/actors/ovl_En_Knight/z_en_knight.c
+++ b/src/overlays/actors/ovl_En_Knight/z_en_knight.c
@@ -7,7 +7,7 @@
#include "z_en_knight.h"
#include "z64shrink_window.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((EnKnight*)thisx)
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 511a5dc46..24fa855c5 100644
--- a/src/overlays/actors/ovl_En_Kujiya/z_en_kujiya.c
+++ b/src/overlays/actors/ovl_En_Kujiya/z_en_kujiya.c
@@ -9,7 +9,7 @@
#include "z_en_kujiya.h"
#include "objects/object_kujiya/object_kujiya.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_8000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_CANT_LOCK_ON)
#define THIS ((EnKujiya*)thisx)
@@ -46,21 +46,21 @@ 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]) == \
+ ((HS_GET_LOTTERY_CODE_GUESS() & 0xF00) >> 8)) && \
+ ((u32)((void)0, gSaveContext.save.saveInfo.lotteryCodes[CURRENT_DAY - 1][1]) == \
+ ((HS_GET_LOTTERY_CODE_GUESS() & 0xF0) >> 4)) && \
+ ((u32)((void)0, gSaveContext.save.saveInfo.lotteryCodes[CURRENT_DAY - 1][2]) == \
+ (HS_GET_LOTTERY_CODE_GUESS() & 0xF)))
void EnKujiya_Init(Actor* thisx, PlayState* play) {
EnKujiya* this = THIS;
Actor_SetScale(&this->actor, 0.1f);
- this->actor.flags &= ~ACTOR_FLAG_1;
- this->actor.targetMode = 6;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ this->actor.targetMode = TARGET_MODE_6;
this->actor.focus.pos = this->actor.world.pos;
this->actor.focus.pos.y += 30.0f;
@@ -104,25 +104,25 @@ void EnKujiya_Wait(EnKujiya* this, PlayState* play) {
(this->actor.shape.rot.y == 0)) {
EnKujiya_SetupTurnToOpen(this);
} else if (this->actor.xzDistToPlayer < 100.0f) {
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
}
void EnKujiya_HandlePlayerChoice(EnKujiya* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
if (play->msgCtx.choiceIndex == 0) { // Buy
- if (gSaveContext.save.playerData.rupees < 10) {
- play_sound(NA_SE_SY_ERROR);
+ if (gSaveContext.save.saveInfo.playerData.rupees < 10) {
+ Audio_PlaySfx(NA_SE_SY_ERROR);
Message_StartTextbox(play, 0x2B62, &this->actor);
this->textId = 0x2B62; // Not enough Rupees
} else {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
Rupees_ChangeBy(-10);
Message_StartTextbox(play, 0x2B5F, &this->actor);
this->textId = 0x2B5F; // Enter number
}
} else { // Don't buy
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
Message_StartTextbox(play, 0x2B5E, &this->actor);
this->textId = 0x2B5E; // Too bad
}
@@ -147,7 +147,7 @@ void EnKujiya_ChooseNextDialogue(EnKujiya* this, PlayState* play) {
case 0x2B60:
EnKujiya_SetBoughtTicket();
- func_801477B4(play);
+ Message_CloseTextbox(play);
EnKujiya_SetupTurnToClosed(this);
break;
@@ -159,7 +159,7 @@ void EnKujiya_ChooseNextDialogue(EnKujiya* this, PlayState* play) {
break;
case 0x2B65:
- if (CHECK_LOTTERY_NUMBERS) {
+ if (CHECK_LOTTERY_NUMBERS()) {
Message_StartTextbox(play, 0x2B66, &this->actor);
this->textId = 0x2B66; // Won 50 Rupees
} else {
@@ -169,10 +169,13 @@ void EnKujiya_ChooseNextDialogue(EnKujiya* this, PlayState* play) {
break;
case 0x2B66:
- func_801477B4(play);
+ Message_CloseTextbox(play);
EnKujiya_SetupGivePrize(this);
EnKujiya_GivePrize(this, play);
break;
+
+ default:
+ break;
}
}
}
@@ -207,6 +210,9 @@ void EnKujiya_Talk(EnKujiya* this, PlayState* play) {
this->textId = 0x2B60; // Will announce winning numbers after 6
}
break;
+
+ default:
+ break;
}
}
@@ -218,7 +224,7 @@ void EnKujiya_GivePrize(EnKujiya* this, PlayState* play) {
if (Actor_HasParent(&this->actor, play)) {
EnKujiya_SetupFinishGivePrize(this);
} else {
- Actor_PickUp(&this->actor, play, GI_RUPEE_PURPLE, 500.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_RUPEE_PURPLE, 500.0f, 100.0f);
}
}
@@ -251,6 +257,9 @@ s32 EnKujiya_CheckBoughtTicket(void) {
return true;
}
break;
+
+ default:
+ break;
}
return false;
}
@@ -268,6 +277,9 @@ void EnKujiya_SetBoughtTicket(void) {
case 3:
SET_WEEKEVENTREG(WEEKEVENTREG_33_40);
break;
+
+ default:
+ break;
}
}
@@ -287,6 +299,9 @@ void EnKujiya_UnsetBoughtTicket(void) {
case 3:
CLEAR_WEEKEVENTREG(WEEKEVENTREG_33_40);
break;
+
+ default:
+ break;
}
}
@@ -296,25 +311,25 @@ 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 {
this->timer++;
}
} else {
- func_800B9010(&this->actor, NA_SE_EV_WINDMILL_LEVEL - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_WINDMILL_LEVEL - SFX_FLAG);
}
}
@@ -324,25 +339,25 @@ 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 {
this->timer++;
}
} else {
- func_800B9010(&this->actor, NA_SE_EV_WINDMILL_LEVEL - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_WINDMILL_LEVEL - SFX_FLAG);
}
}
@@ -359,7 +374,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 39d55f7f8..0b246b4df 100644
--- a/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c
+++ b/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c
@@ -4,11 +4,11 @@
* Description: Grass / Bush
*/
-#include "prevent_bss_reordering.h"
#include "z_en_kusa.h"
#include "objects/object_kusa/object_kusa.h"
#include "objects/gameplay_keep/gameplay_keep.h"
#include "objects/gameplay_field_keep/gameplay_field_keep.h"
+#include "overlays/actors/ovl_En_Insect/z_en_insect.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_800000)
@@ -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));
+ } else { // ENKUSA_TYPE_GRASS_2
+ collectible = func_800A8150(KUSA_GET_PARAM_FC(&this->actor));
if (collectible >= 0) {
collectableParams = KUSA_GET_COLLECTIBLE_ID(&this->actor);
Item_DropCollectible(play, &this->actor.world.pos, (collectableParams << 8) | collectible);
@@ -327,9 +327,9 @@ void EnKusa_SpawnBugs(EnKusa* this, PlayState* play) {
u32 numBugs;
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.unk20, 0);
+ 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, ENINSECT_PARAMS(true), 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);
@@ -393,7 +393,7 @@ void EnKusa_Init(Actor* thisx, PlayState* play) {
this->isInWater |= 1;
}
- this->objIndex = Object_GetIndex(&play->objectCtx, objectIds[(KUSA_GET_TYPE(&this->actor))]);
+ this->objIndex = Object_GetSlot(&play->objectCtx, objectIds[(KUSA_GET_TYPE(&this->actor))]);
if (this->objIndex < 0) {
Actor_Kill(&this->actor);
return;
@@ -490,7 +490,7 @@ void EnKusa_WaitForInteract(EnKusa* this, PlayState* play) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
if (this->actor.xzDistToPlayer < 100.0f) {
if (KUSA_GET_TYPE(&this->actor) != ENKUSA_TYPE_GRASS_2) {
- Actor_LiftActor(&this->actor, play);
+ Actor_OfferCarry(&this->actor, play);
}
}
}
@@ -512,14 +512,16 @@ void EnKusa_LiftedUp(EnKusa* this, PlayState* play) {
if (Actor_HasNoParent(&this->actor, play)) {
this->actor.room = play->roomCtx.curRoom.num;
EnKusa_SetupFall(this);
- this->actor.velocity.x = this->actor.speedXZ * Math_SinS(this->actor.world.rot.y);
- this->actor.velocity.z = this->actor.speedXZ * Math_CosS(this->actor.world.rot.y);
+ this->actor.velocity.x = this->actor.speed * Math_SinS(this->actor.world.rot.y);
+ this->actor.velocity.z = this->actor.speed * Math_CosS(this->actor.world.rot.y);
this->actor.colChkInfo.mass = 80;
this->actor.gravity = -0.1f;
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;
@@ -552,8 +554,9 @@ void EnKusa_Fall(EnKusa* this, PlayState* play) {
this->collider.base.atFlags &= ~AT_HIT;
}
this->timer++;
- if ((this->actor.bgCheckFlags & 0xB) || wasHit || (this->timer >= 100)) {
- if (!(this->actor.bgCheckFlags & 0x20)) {
+ if ((this->actor.bgCheckFlags & (BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH | BGCHECKFLAG_WALL)) || wasHit ||
+ (this->timer >= 100)) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_WATER)) {
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 20, NA_SE_EV_PLANT_BROKEN);
}
EnKusa_SpawnFragments(this, play);
@@ -568,10 +571,13 @@ void EnKusa_Fall(EnKusa* this, PlayState* play) {
EnKusa_SetupUprootedWaitRegrow(this);
this->actor.shape.shadowDraw = NULL;
break;
+
+ default:
+ break;
}
} else {
- if (this->actor.bgCheckFlags & 0x40) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) {
contactPos.y = this->actor.world.pos.y + this->actor.depthInWater;
for (angleOffset = 0, i = 0; i < 4; i++, angleOffset += 0x4000) {
contactPos.x =
@@ -593,7 +599,7 @@ void EnKusa_Fall(EnKusa* this, PlayState* play) {
rotSpeedXtarget >>= 1;
rotSpeedY >>= 1;
rotSpeedYtarget >>= 1;
- this->actor.bgCheckFlags &= ~0x40;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_WATER_TOUCH;
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EV_DIVE_INTO_WATER_L);
}
EnKusa_UpdateVelY(this);
@@ -603,7 +609,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);
@@ -616,9 +624,13 @@ void EnKusa_SetupCut(EnKusa* this) {
case ENKUSA_TYPE_GRASS_2:
this->actionFunc = EnKusa_DoNothing;
break;
+
case ENKUSA_TYPE_REGROWING_GRASS:
this->actionFunc = EnKusa_CutWaitRegrow;
break;
+
+ default:
+ break;
}
this->timer = 0;
}
@@ -683,7 +695,8 @@ void EnKusa_Update(Actor* thisx, PlayState* play2) {
} else {
this->actor.shape.yOffset = 0.0f;
}
- if ((kusaGameplayFrames != play->gameplayFrames) && (play->roomCtx.curRoom.unk3 == 0)) {
+ if ((kusaGameplayFrames != play->gameplayFrames) &&
+ (play->roomCtx.curRoom.behaviorType1 == ROOM_BEHAVIOR_TYPE1_0)) {
EnKusa_Sway();
kusaGameplayFrames = play->gameplayFrames;
}
@@ -695,8 +708,9 @@ void EnKusa_DrawBush(Actor* thisx, PlayState* play2) {
if ((this->actor.projectedPos.z <= 1200.0f) || ((this->isInWater & 1) && (this->actor.projectedPos.z < 1300.0f))) {
- if ((play->roomCtx.curRoom.unk3 == 0) && (this->actionFunc == EnKusa_WaitForInteract) &&
- (this->actor.projectedPos.z > -150.0f) && (this->actor.projectedPos.z < 400.0f)) {
+ if ((play->roomCtx.curRoom.behaviorType1 == ROOM_BEHAVIOR_TYPE1_0) &&
+ (this->actionFunc == EnKusa_WaitForInteract) && (this->actor.projectedPos.z > -150.0f) &&
+ (this->actor.projectedPos.z < 400.0f)) {
EnKusa_ApplySway(&D_80936AD8[this->kusaMtxIdx]);
}
@@ -708,7 +722,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);
@@ -724,7 +738,8 @@ void EnKusa_DrawGrass(Actor* thisx, PlayState* play) {
if (this->isCut) {
Gfx_DrawDListOpa(play, gKusaStump);
} else {
- if ((play->roomCtx.curRoom.unk3 == 0) && (this->actionFunc == EnKusa_WaitForInteract)) {
+ if ((play->roomCtx.curRoom.behaviorType1 == ROOM_BEHAVIOR_TYPE1_0) &&
+ (this->actionFunc == EnKusa_WaitForInteract)) {
if ((this->actor.projectedPos.z > -150.0f) && (this->actor.projectedPos.z < 400.0f)) {
EnKusa_ApplySway(&D_80936AD8[this->kusaMtxIdx]);
}
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..1871b1dbe 100644
--- a/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h
+++ b/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h
@@ -7,6 +7,19 @@ struct EnKusa;
typedef void (*EnKusaActionFunc)(struct EnKusa*, PlayState*);
+#define KUSA_GET_TYPE(thisx)((thisx)->params & 0x3)
+
+// `ENKUSA_TYPE_BUSH` and `ENKUSA_TYPE_GRASS`
+#define KUSA_GET_RAND_COLLECTIBLE_ID(thisx) (((thisx)->params >> 8) & 0xF)
+#define KUSA_GET_PARAM_0C(thisx) (((thisx)->params >> 12) & 1)
+
+// `ENKUSA_TYPE_REGROWING_GRASS`, `ENKUSA_TYPE_BUSH` and `ENKUSA_TYPE_GRASS`
+#define KUSA_SHOULD_SPAWN_BUGS(thisx) (((thisx)->params >> 4) & 1)
+
+// `ENKUSA_TYPE_GRASS_2`
+#define KUSA_GET_COLLECTIBLE_ID(thisx) (((thisx)->params >> 8) & 0x7F)
+#define KUSA_GET_PARAM_FC(thisx) (((thisx)->params >> 2) & 0x3F)
+
typedef enum {
/* 0 */ ENKUSA_TYPE_BUSH,
/* 1 */ ENKUSA_TYPE_REGROWING_GRASS,
@@ -14,6 +27,19 @@ typedef enum {
/* 3 */ ENKUSA_TYPE_GRASS_2
} EnKusaType;
+#define KUSA_BUSH_PARAMS(spawnBugs, randCollectibleId, param0C) \
+ ((ENKUSA_TYPE_BUSH & 0x3) | (((spawnBugs) & 1) << 4) | (((randCollectibleId) & 0xF) << 8) | (((param0C) & 1) << 12))
+
+#define KUSA_REGROWING_GRASS_PARAMS(spawnBugs) \
+ ((ENKUSA_TYPE_REGROWING_GRASS & 0x3) | (((spawnBugs) & 1) << 4))
+
+#define KUSA_GRASS_PARAMS(spawnBugs, randCollectibleId, param0C) \
+ ((ENKUSA_TYPE_GRASS & 0x3) | (((spawnBugs) & 1) << 4) | (((randCollectibleId) & 0xF) << 8) | (((param0C) & 1) << 12))
+
+#define KUSA_GRASS_2_PARAMS(paramFC, collectibleId) \
+ ((ENKUSA_TYPE_GRASS_2 & 0x3) | (((paramFC) & 0x3F) << 2) | (((collectibleId) & 0x7F) << 8))
+
+
typedef struct EnKusa {
/* 0x000 */ Actor actor;
/* 0x144 */ EnKusaActionFunc actionFunc;
@@ -25,13 +51,4 @@ typedef struct EnKusa {
/* 0x198 */ u8 isInWater;
} EnKusa; // size = 0x19C
-#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_TYPE(thisx)((thisx)->params & 0x3)
-
#endif // Z_EN_KUSA_H
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 0f95122d4..53e203330 100644
--- a/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c
+++ b/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c
@@ -102,7 +102,7 @@ void func_80A5B160(EnKusa2* this, PlayState* play) {
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.unk20, NULL);
+ this->actor.world.pos.z, 0, Rand_Next() >> 0x10, 0, 1, this->actor.csId, this->actor.halfDaysBits, NULL);
*ptr = actor;
if (*ptr != NULL) {
@@ -112,13 +112,13 @@ void func_80A5B160(EnKusa2* this, PlayState* play) {
}
for (i = 1; i < ARRAY_COUNT(this->unk_194); i++) {
- temp_s1 = (i << 0xD) - 0x2000;
+ temp_s1 = (i * 0x2000) - 0x2000;
if (this->unk_194[i] == NULL) {
ptr = &this->unk_194[i];
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.unk20, NULL);
+ 0, 1, this->actor.csId, this->actor.halfDaysBits, NULL);
*ptr = actor;
if (*ptr != NULL) {
(*ptr)->actor.room = this->actor.room;
@@ -159,7 +159,8 @@ 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.unk20, NULL);
+ ENKUSA2_GET_7F00(&this->actor) << 9, this->actor.csId, this->actor.halfDaysBits,
+ NULL);
}
void func_80A5B508(void) {
@@ -269,7 +270,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) {
@@ -701,7 +703,7 @@ void func_80A5CB74(EnKusa2* this) {
sp3E = Rand_S16Offset(-10000, 20000) + this->actor.world.rot.y;
if (this->unk_1C0 != NULL) {
- sp36 = Actor_YawBetweenActors(&this->actor, &this->unk_1C0->actor);
+ sp36 = Actor_WorldYawTowardActor(&this->actor, &this->unk_1C0->actor);
sp3C = Rand_S16Offset(-4000, 8000) + sp36;
} else {
sp3C = 0;
@@ -959,14 +961,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;
@@ -974,23 +976,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_YawBetweenActors(&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_PlaySfxAtPos(&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_LiftActor(&this->actor, play);
+ if (thisx->xzDistToPlayer < 100.0f) {
+ Actor_OfferCarry(thisx, play);
}
}
}
@@ -1038,7 +1040,7 @@ void func_80A5D9C8(EnKusa2* this, PlayState* play) {
this->actor.colChkInfo.mass = 80;
this->actor.home.rot.y = this->actor.world.rot.y;
this->actor.velocity.y = 12.5f;
- this->actor.speedXZ += 3.0f;
+ this->actor.speed += 3.0f;
Actor_MoveWithGravity(&this->actor);
func_80A5BAFC(this, play);
func_80A5CD0C(this);
@@ -1055,7 +1057,7 @@ void func_80A5D9C8(EnKusa2* this, PlayState* play) {
this->unk_1D0--;
if (this->unk_1D0 <= 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KUSAMUSHI_VIBE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KUSAMUSHI_VIBE);
this->unk_1D0 = (Rand_Next() >> 0x1D) + 14;
}
@@ -1087,12 +1089,12 @@ void func_80A5DC98(EnKusa2* this, PlayState* play) {
func_80A5BF38(this, 4);
func_80A5BF84(this, play);
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
func_80A5CD0C(this);
func_80A5BB40(this, play, 1);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_WALK);
func_80A5DE18(this);
- } else if (this->actor.bgCheckFlags & 0x20) {
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER) {
func_80A5BDB0(this, play);
func_80A5E418(this);
} else if (this->unk_1CA > 0) {
@@ -1122,14 +1124,14 @@ void func_80A5DEB4(EnKusa2* this, PlayState* play) {
if (this->unk_1D0 > 0) {
this->unk_1D0--;
if (this->unk_1D0 == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KUSAMUSHI_VIBE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KUSAMUSHI_VIBE);
}
}
if (this->unk_1D1 > 0) {
this->unk_1D1--;
if (this->unk_1D1 == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KUSAMUSHI_VIBE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KUSAMUSHI_VIBE);
}
}
@@ -1137,10 +1139,10 @@ void func_80A5DEB4(EnKusa2* this, PlayState* play) {
Math_StepToF(&this->actor.scale.x, 0.4f, 0.032f);
this->unk_1C4 += 0x4650;
this->actor.scale.z = this->actor.scale.x;
- this->actor.speedXZ = fabsf(Math_CosS(this->unk_1C4) + 0.5f) * 1.5f;
+ this->actor.speed = fabsf(Math_CosS(this->unk_1C4) + 0.5f) * 1.5f;
- if (this->actor.speedXZ < 0.0f) {
- this->actor.speedXZ = 0.0f;
+ if (this->actor.speed < 0.0f) {
+ this->actor.speed = 0.0f;
}
Actor_MoveWithGravity(&this->actor);
@@ -1157,7 +1159,7 @@ void func_80A5DEB4(EnKusa2* this, PlayState* play) {
func_80A5CD0C(this);
}
- if (this->actor.bgCheckFlags & 0x20) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER) {
func_80A5BDB0(this, play);
func_80A5E418(this);
} else {
@@ -1165,16 +1167,16 @@ void func_80A5DEB4(EnKusa2* this, PlayState* play) {
if (this->unk_1C8 <= 0) {
func_80A5CD0C(this);
func_80A5BB40(this, play, 4);
- this->actor.speedXZ += 4.0f;
+ this->actor.speed += 4.0f;
this->actor.velocity.y = (Rand_ZeroOne() * 4.0f) + 15.0f;
func_80A5E1D8(this);
- } else if (this->actor.bgCheckFlags & 1) {
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->unk_1CA--;
if (this->unk_1CA <= 0) {
func_80A5CD0C(this);
func_80A5BB40(this, play, 2);
this->actor.velocity.y = (Rand_ZeroOne() * 6.0f) + 7.0f;
- this->actor.speedXZ += 2.0f;
+ this->actor.speed += 2.0f;
if (this->actor.yawTowardsPlayer < this->actor.world.rot.y) {
sp20 = 10000;
} else {
@@ -1200,9 +1202,9 @@ void func_80A5E1D8(EnKusa2* this) {
void func_80A5E210(EnKusa2* this, PlayState* play) {
Math_StepToF(&this->actor.gravity, -4.0f, 0.5f);
- if (this->actor.bgCheckFlags & 1) {
- this->actor.speedXZ *= 0.4f;
- if (this->actor.bgCheckFlags & 2) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->actor.speed *= 0.4f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
func_80A5D178(this);
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EN_KUSAMUSHI_HIDE);
}
@@ -1229,7 +1231,7 @@ void func_80A5E210(EnKusa2* this, PlayState* play) {
if (this->actor.velocity.y > 1.0f) {
Math_StepToF(&this->actor.scale.y, 0.24000001f, 0.080000006f);
Math_StepToF(&this->actor.scale.x, 0.32000002f, 0.040000003f);
- } else if (this->actor.bgCheckFlags & 1) {
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
Math_StepToF(&this->actor.scale.y, 0.0f, 0.120000005f);
Math_StepToF(&this->actor.scale.x, 0.48000002f, 0.120000005f);
} else {
@@ -1253,7 +1255,7 @@ void func_80A5E418(EnKusa2* this) {
this->actor.velocity.y *= 0.25f;
this->actor.velocity.z *= 0.1f;
this->actor.draw = func_80A5EA48;
- this->actor.speedXZ *= 0.1f;
+ this->actor.speed *= 0.1f;
this->actor.gravity *= 0.25f;
this->unk_1CC = Rand_S16Offset(-800, 1600);
this->actionFunc = func_80A5E4BC;
@@ -1269,7 +1271,8 @@ void func_80A5E4BC(EnKusa2* this, PlayState* play) {
this->actor.shape.rot.x -= 0x5DC;
this->actor.shape.rot.y += this->unk_1CC;
- if ((this->actor.bgCheckFlags & 0x20) && (this->actor.depthInWater > 5.0f) && (Rand_ZeroOne() < 0.8f)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WATER) && (this->actor.depthInWater > 5.0f) &&
+ (Rand_ZeroOne() < 0.8f)) {
EffectSsBubble_Spawn(play, &this->actor.world.pos, 20.0f, 10.0f, 20.0f, (Rand_ZeroOne() * 0.08f) + 0.04f);
}
@@ -1290,7 +1293,7 @@ void func_80A5E604(Actor* thisx, PlayState* play) {
} else {
this->actor.draw = func_80A5E6F0;
- if (play->roomCtx.curRoom.unk3 == 0) {
+ if (play->roomCtx.curRoom.behaviorType1 == ROOM_BEHAVIOR_TYPE1_0) {
func_80A5B508();
}
func_80A5CAF4(&D_80A5F1C0);
@@ -1320,7 +1323,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];
@@ -1340,7 +1343,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);
@@ -1353,7 +1356,7 @@ void EnKusa2_Draw(Actor* thisx, PlayState* play) {
EnKusa2* this = THIS;
if (this->actor.projectedPos.z <= 1200.0f) {
- if ((play->roomCtx.curRoom.unk3 == 0) && (this->actor.projectedPos.z > -150.0f) &&
+ if ((play->roomCtx.curRoom.behaviorType1 == ROOM_BEHAVIOR_TYPE1_0) && (this->actor.projectedPos.z > -150.0f) &&
(this->actor.projectedPos.z < 400.0f)) {
func_80A5B954(&D_80A60908[this->unk_1CE], 0.0015f);
}
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 aafc12b51..b9044ea38 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
@@ -5,8 +5,9 @@
*/
#include "z_en_lift_nuts.h"
+#include "overlays/actors/ovl_En_Gamelupy/z_en_gamelupy.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
#define THIS ((EnLiftNuts*)thisx)
@@ -15,39 +16,38 @@ void EnLiftNuts_Destroy(Actor* thisx, PlayState* play);
void EnLiftNuts_Update(Actor* thisx, PlayState* play);
void EnLiftNuts_Draw(Actor* thisx, PlayState* play);
-void func_80AEA910(EnLiftNuts* this, PlayState* play);
+void EnLiftNuts_HandleConversation5(EnLiftNuts* this, PlayState* play);
-s32 func_80AE9B8C(void);
-void func_80AE9F28(EnLiftNuts* this);
-void func_80AE9F70(EnLiftNuts* this, PlayState* play);
-void func_80AEA044(EnLiftNuts* this, PlayState* play);
-void func_80AEA0B4(EnLiftNuts* this);
-void func_80AEA128(EnLiftNuts* this, PlayState* play);
-void func_80AEA1A0(EnLiftNuts* this, PlayState* play);
-void func_80AEABF0(EnLiftNuts* this);
-void func_80AEAC64(EnLiftNuts* this, PlayState* play);
-void func_80AEACF8(EnLiftNuts* this, PlayState* play);
-void func_80AEAEAC(EnLiftNuts* this);
-void func_80AEAF14(EnLiftNuts* this, PlayState* play);
-void func_80AEAF8C(EnLiftNuts* this);
-void func_80AEAFA0(EnLiftNuts* this, PlayState* play);
-void func_80AEB114(EnLiftNuts* this);
-void func_80AEB148(EnLiftNuts* this, PlayState* play);
-void func_80AEB1C8(EnLiftNuts* this);
-void func_80AEB230(EnLiftNuts* this, PlayState* play);
-void func_80AEB280(EnLiftNuts* this);
-void func_80AEB294(EnLiftNuts* this, PlayState* play);
-void func_80AEB3E0(EnLiftNuts* this, PlayState* play);
-void func_80AEB428(EnLiftNuts* this, PlayState* play);
-void func_80AEB584(EnLiftNuts* this);
-void func_80AEB598(EnLiftNuts* this, PlayState* play);
-void func_80AEB684(EnLiftNuts* this);
-void func_80AEB698(EnLiftNuts* this, PlayState* play);
-void func_80AEB828(EnLiftNuts* this);
-void func_80AEB8A4(EnLiftNuts* this, PlayState* play);
-void func_80AEB934(EnLiftNuts* this, PlayState* play);
-void func_80AEB974(EnLiftNuts* this);
-void func_80AEB9E0(EnLiftNuts* this, PlayState* play);
+void EnLiftNuts_SetupIdleHidden(EnLiftNuts* this);
+void EnLiftNuts_IdleHidden(EnLiftNuts* this, PlayState* play);
+void EnLiftNuts_Burrow(EnLiftNuts* this, PlayState* play);
+void EnLiftNuts_SetupIdle(EnLiftNuts* this);
+void EnLiftNuts_RiseUp(EnLiftNuts* this, PlayState* play);
+void EnLiftNuts_Idle(EnLiftNuts* this, PlayState* play);
+void EnLiftNuts_SetupStartConversation(EnLiftNuts* this);
+void EnLiftNuts_StartConversation(EnLiftNuts* this, PlayState* play);
+void EnLiftNuts_HandleConversation(EnLiftNuts* this, PlayState* play);
+void EnLiftNuts_SetupMove(EnLiftNuts* this);
+void EnLiftNuts_Move(EnLiftNuts* this, PlayState* play);
+void EnLiftNuts_SetupMovePlayer(EnLiftNuts* this);
+void EnLiftNuts_MovePlayer(EnLiftNuts* this, PlayState* play);
+void EnLiftNuts_SetupStartGame(EnLiftNuts* this);
+void EnLiftNuts_StartGame(EnLiftNuts* this, PlayState* play);
+void EnLiftNuts_SetupStartGameImmediately(EnLiftNuts* this);
+void EnLiftNuts_StartGameImmediately(EnLiftNuts* this, PlayState* play);
+void EnLiftNuts_SetupRunGame(EnLiftNuts* this);
+void EnLiftNuts_RunGame(EnLiftNuts* this, PlayState* play);
+void EnLiftNuts_SetupEndGame(EnLiftNuts* this, PlayState* play);
+void EnLiftNuts_EndGame(EnLiftNuts* this, PlayState* play);
+void EnLiftNuts_SetupGiveReward(EnLiftNuts* this);
+void EnLiftNuts_GiveReward(EnLiftNuts* this, PlayState* play);
+void EnLiftNuts_SetupResumeConversation(EnLiftNuts* this);
+void EnLiftNuts_ResumeConversation(EnLiftNuts* this, PlayState* play);
+void EnLiftNuts_SetupStartHiding(EnLiftNuts* this);
+void EnLiftNuts_StartHiding(EnLiftNuts* this, PlayState* play);
+void EnLiftNuts_Hide(EnLiftNuts* this, PlayState* play);
+void EnLiftNuts_UpdateEyes(EnLiftNuts* this);
+void EnLiftNuts_SpawnDust(EnLiftNuts* this, PlayState* play);
ActorInit En_Lift_Nuts_InitVars = {
ACTOR_EN_LIFT_NUTS,
@@ -61,34 +61,54 @@ ActorInit En_Lift_Nuts_InitVars = {
(ActorFunc)EnLiftNuts_Draw,
};
-static AnimationInfo sAnimations[] = {
- { &object_dnt_Anim_005488, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
- { &object_dnt_Anim_00B0B4, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
- { &object_dnt_Anim_004AA0, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f },
- { &object_dnt_Anim_0029E8, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f },
- { &object_dnt_Anim_005CA8, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f },
- { &object_dnt_Anim_0038CC, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
- { &object_dnt_Anim_003CC0, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f },
- { &object_dnt_Anim_0012F4, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f },
- { &object_dnt_Anim_004700, 0.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f },
- { &object_dnt_Anim_001BC8, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
- { &object_dnt_Anim_003438, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -2.0f },
- { &object_dnt_Anim_001E2C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
- { &object_dnt_Anim_000994, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f },
- { &object_dnt_Anim_002268, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f },
- { &object_dnt_Anim_002F08, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
- { &object_dnt_Anim_00577C, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
- { &object_dnt_Anim_004E38, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f },
- { &object_dnt_Anim_0029E8, 1.0f, 4.0f, 0.0f, ANIMMODE_ONCE, -4.0f },
- { &object_dnt_Anim_0029E8, 1.0f, 8.0f, 0.0f, ANIMMODE_ONCE, 0.0f },
+typedef enum {
+ /* 0 */ ENLIFTNUTS_ANIM_STANDING,
+ /* 1 */ ENLIFTNUTS_ANIM_WALK,
+ /* 2 */ ENLIFTNUTS_ANIM_RISE_UP,
+ /* 3 */ ENLIFTNUTS_ANIM_BURROW_LONG,
+ /* 4 */ ENLIFTNUTS_ANIM_EXCITED_START,
+ /* 5 */ ENLIFTNUTS_ANIM_EXCITED_LOOP,
+ /* 6 */ ENLIFTNUTS_ANIM_EXCITED_END,
+ /* 7 */ ENLIFTNUTS_ANIM_TAKE_OFF_HAT,
+ /* 8 */ ENLIFTNUTS_ANIM_FLY_START,
+ /* 9 */ ENLIFTNUTS_ANIM_FLY_LOOP,
+ /* 10 */ ENLIFTNUTS_ANIM_SHOCKED_START,
+ /* 11 */ ENLIFTNUTS_ANIM_SHOCKED_SHAKE_HEAD,
+ /* 12 */ ENLIFTNUTS_ANIM_SHOCKED_POUND,
+ /* 13 */ ENLIFTNUTS_ANIM_SHOCKED_END,
+ /* 14 */ ENLIFTNUTS_ANIM_THINK,
+ /* 15 */ ENLIFTNUTS_ANIM_BOB,
+ /* 16 */ ENLIFTNUTS_ANIM_JUMP,
+ /* 17 */ ENLIFTNUTS_ANIM_BURROW_HALF,
+ /* 18 */ ENLIFTNUTS_ANIM_BURROW_SHORT,
+ /* 19 */ ENLIFTNUTS_ANIM_MAX
+} EnLiftNutsAnimation;
+
+static AnimationInfo sAnimations[ENLIFTNUTS_ANIM_MAX] = {
+ { &gBusinessScrubStandingAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
+ { &gBusinessScrubWalkAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
+ { &gBusinessScrubRiseUpAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f },
+ { &gBusinessScrubBurrowAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f },
+ { &gBusinessScrubExcitedStartAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f },
+ { &gBusinessScrubExcitedLoopAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
+ { &gBusinessScrubExcitedEndAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f },
+ { &gBusinessScrubTakeOffHatAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f },
+ { &gBusinessScrubFlyStartAnim, 0.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f },
+ { &gBusinessScrubFlyLoopAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
+ { &gBusinessScrubShockedStartAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -2.0f },
+ { &gBusinessScrubShockedShakeHeadAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
+ { &gBusinessScrubShockedPoundAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f },
+ { &gBusinessScrubShockedEndAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f },
+ { &gBusinessScrubThinkAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
+ { &gBusinessScrubBobAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f },
+ { &gBusinessScrubJumpAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f },
+ { &gBusinessScrubBurrowAnim, 1.0f, 4.0f, 0.0f, ANIMMODE_ONCE, -4.0f },
+ { &gBusinessScrubBurrowAnim, 1.0f, 8.0f, 0.0f, ANIMMODE_ONCE, 0.0f },
};
-Gfx* D_80AEBF18[] = {
- object_dnt_DL_008290,
- object_dnt_DL_001350,
- object_dnt_DL_001420,
- NULL,
-};
+Gfx* sEyeTextures[] = { gBusinessScrubEyesDL, gBusinessScrubEyesWideDL, gBusinessScrubEyesSquintDL };
+
+static s32 sPad = 0;
static ColliderCylinderInit sCylinderInit = {
{
@@ -112,48 +132,54 @@ static ColliderCylinderInit sCylinderInit = {
static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE };
-void func_80AE9A20(EnLiftNuts* this, PlayState* play) {
- static s16 D_80AEBF60 = 0;
- static s32 D_80AEBF64 = false;
+void EnLiftNuts_AddSharedMemoryEntry(EnLiftNuts* this, PlayState* play) {
+ static s16 sMinigameScore = 0;
+ static s32 sAddedSharedMemory = false;
- if (!D_80AEBF64) {
- func_800B6584(play, ACTOR_EN_GAMELUPY, &D_80AEBF60, sizeof(s16));
- D_80AEBF64 = true;
+ if (!sAddedSharedMemory) {
+ Actor_AddSharedMemoryEntry(play, ACTOR_EN_GAMELUPY, &sMinigameScore, sizeof(s16));
+ sAddedSharedMemory = true;
}
- this->ptr_1EC = &D_80AEBF60;
+ this->minigameScore = &sMinigameScore;
}
-void func_80AE9A80(EnLiftNuts* this, PlayState* play) {
- static s16 D_80AEBF68 = false;
+void EnLiftNuts_FreeSharedMemoryEntry(EnLiftNuts* this, PlayState* play) {
+ static s16 sFreedSharedMemory = false;
- if (!D_80AEBF68) {
- func_800B6608(play, ACTOR_EN_GAMELUPY);
- D_80AEBF68 = true;
+ if (!sFreedSharedMemory) {
+ Actor_FreeSharedMemoryEntry(play, ACTOR_EN_GAMELUPY);
+ sFreedSharedMemory = true;
}
}
-s32 func_80AE9AC4(EnLiftNuts* this, s32 arg1) {
- static s32 D_80AEBF6C = 0;
+typedef enum {
+ /* 0 */ ENLIFTNUTS_AUTOTALK_MODE_CHECK_OFF,
+ /* 1 */ ENLIFTNUTS_AUTOTALK_MODE_SET_ON,
+ /* 2 */ ENLIFTNUTS_AUTOTALK_MODE_SET_OFF
+} EnLiftNutsAutotalkMode;
- switch (arg1) {
- case 0:
- if (D_80AEBF6C == 0) {
+s32 EnLiftNuts_Autotalk(EnLiftNuts* this, EnLiftNutsAutotalkMode mode) {
+ static s32 sIsAutotalkOn = false;
+
+ switch (mode) {
+ case ENLIFTNUTS_AUTOTALK_MODE_CHECK_OFF:
+ if (!sIsAutotalkOn) {
return true;
}
break;
- case 1:
- if (D_80AEBF6C == 0) {
- this->unk_34E = 1;
- D_80AEBF6C = 1;
+ case ENLIFTNUTS_AUTOTALK_MODE_SET_ON:
+ if (!sIsAutotalkOn) {
+ this->autotalk = true;
+ sIsAutotalkOn = true;
return true;
}
break;
- case 2:
- if (D_80AEBF6C == 1) {
- this->unk_34E = 0;
- D_80AEBF6C = 0;
+ case ENLIFTNUTS_AUTOTALK_MODE_SET_OFF:
+ if (sIsAutotalkOn == true) {
+ this->autotalk = false;
+ sIsAutotalkOn = false;
return true;
}
break;
@@ -161,64 +187,97 @@ s32 func_80AE9AC4(EnLiftNuts* this, s32 arg1) {
default:
break;
}
+
return false;
}
-s32 func_80AE9B4C(s32 arg0, s32 arg1) {
- static s32 D_80AEBF70 = 0;
+typedef enum {
+ /* 0 */ ENLIFTNUTS_MINIGAME_STATE_MODE_CHECK,
+ /* 1 */ ENLIFTNUTS_MINIGAME_STATE_MODE_SET
+} EnLiftNutsMiniGameStateMode;
- if (arg0 == 0) {
- if (D_80AEBF70 == arg1) {
+typedef enum {
+ /* 0 */ ENLIFTNUTS_MINIGAME_STATE_NONE,
+ /* 1 */ ENLIFTNUTS_MINIGAME_STATE_STARTING,
+ /* 2 */ ENLIFTNUTS_MINIGAME_STATE_RUNNING,
+ /* 3 */ ENLIFTNUTS_MINIGAME_STATE_AFTER,
+ /* 4 */ ENLIFTNUTS_MINIGAME_STATE_HIDING
+} EnLiftNutsMiniGameState;
+
+/**
+ * Will either check or set the current minigame state based on the given mode
+ *
+ * @return boolean, based on the mode
+ * ENLIFTNUTS_MINIGAME_STATE_MODE_CHECK: true if the current minigame state equals the provided state, false otherwise
+ * ENLIFTNUTS_MINIGAME_STATE_MODE_SET: true if the minigame state was set succesfully to the provided state, false
+ * otherwise
+ */
+s32 EnLiftNuts_MinigameState(EnLiftNutsMiniGameStateMode mode, EnLiftNutsMiniGameState state) {
+ static EnLiftNutsMiniGameState sMinigameState = ENLIFTNUTS_MINIGAME_STATE_NONE;
+
+ if (mode == ENLIFTNUTS_MINIGAME_STATE_MODE_CHECK) {
+ if (sMinigameState == state) {
return true;
}
- } else if (arg0 == 1) {
- D_80AEBF70 = arg1;
+ } else if (mode == ENLIFTNUTS_MINIGAME_STATE_MODE_SET) {
+ sMinigameState = state;
return true;
}
return false;
}
-s32 func_80AE9B8C() {
- s32 ret = 0;
+s32 EnLiftNuts_GetNumDaysWon(void) {
+ s32 numDays = 0;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_10)) {
- ret = 1;
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_1)) {
+ numDays++;
}
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_20)) {
- ret++;
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_2)) {
+ numDays++;
}
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_40)) {
- ret++;
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_3)) {
+ numDays++;
}
- return ret;
+ return numDays;
}
-void func_80AE9BCC(EnLiftNuts* this, PlayState* play) {
- if ((this->actionFunc != func_80AEB934) && (this->actionFunc != func_80AEB8A4) &&
- (this->actionFunc != func_80AEACF8) && (this->actionFunc != func_80AEAC64) &&
- (this->actionFunc != func_80AEA044) && (this->actionFunc != func_80AEB598) &&
- (this->actionFunc != func_80AEB698) && !func_80AE9B4C(0, 3) && (func_80AE9B8C() == 3) &&
- (gSaveContext.save.playerForm == PLAYER_FORM_DEKU) && (this->actor.xzDistToPlayer < 150.0f)) {
- func_80AEB828(this);
+/**
+ * Will check if the actor should hide, and if so starts hiding.
+ */
+void EnLiftNuts_TryHide(EnLiftNuts* this, PlayState* play) {
+ if (((this->actionFunc == EnLiftNuts_Hide) || (this->actionFunc == EnLiftNuts_StartHiding) ||
+ (this->actionFunc == EnLiftNuts_HandleConversation) || (this->actionFunc == EnLiftNuts_StartConversation) ||
+ (this->actionFunc == EnLiftNuts_Burrow) || (this->actionFunc == EnLiftNuts_GiveReward) ||
+ (this->actionFunc == EnLiftNuts_ResumeConversation))) {
+ return;
+ }
+
+ if (EnLiftNuts_MinigameState(ENLIFTNUTS_MINIGAME_STATE_MODE_CHECK, ENLIFTNUTS_MINIGAME_STATE_AFTER)) {
+ return;
+ }
+
+ if ((EnLiftNuts_GetNumDaysWon() == 3) && (GET_PLAYER_FORM == PLAYER_FORM_DEKU) &&
+ (this->actor.xzDistToPlayer < 150.0f)) {
+ EnLiftNuts_SetupStartHiding(this);
}
}
void EnLiftNuts_Init(Actor* thisx, PlayState* play) {
+ s32 pad;
EnLiftNuts* this = THIS;
Path* path;
- Vec3s* pathPos;
- s32 pad;
+ Vec3s* points;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 35.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_dnt_Skel_00AC70, &object_dnt_Anim_0029E8, this->jointTable,
- this->morphTable, OBJECT_DNT_LIMB_MAX);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gBusinessScrubSkel, &gBusinessScrubBurrowAnim, this->jointTable,
+ this->morphTable, BUSINESS_SCRUB_LIMB_MAX);
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);
@@ -227,32 +286,32 @@ void EnLiftNuts_Init(Actor* thisx, PlayState* play) {
this->actor.home.pos = bgActor->actor.world.pos;
}
}
- this->actor.targetMode = 0;
- this->unk_354 = 0;
- this->unk_34E = 0;
- this->unk_356 = 0;
- this->unk_1E4 = 0;
- this->unk_1E8 = 0;
+ this->actor.targetMode = TARGET_MODE_0;
+ this->timer = 0;
+ this->autotalk = false;
+ this->isFirstTimeHiding = false;
+ this->eyeTexIndex = 0;
+ this->unk1E8 = 0;
this->actor.gravity = -2.0f;
- path = &play->setupPathList[ENLIFTNUTS_GET_FF00(&this->actor)];
- pathPos = Lib_SegmentedToVirtual(path->points);
- this->vec_1D8.x = pathPos->x;
- this->vec_1D8.y = pathPos->y;
- this->vec_1D8.z = pathPos->z;
- func_80AE9A20(this, play);
+ path = &play->setupPathList[ENLIFTNUTS_GET_PATH_INDEX(&this->actor)];
+ points = Lib_SegmentedToVirtual(path->points);
+ this->waypointPos.x = points[0].x;
+ this->waypointPos.y = points[0].y;
+ this->waypointPos.z = points[0].z;
+ EnLiftNuts_AddSharedMemoryEntry(this, play);
if (!Flags_GetSwitch(play, 0x41)) {
- func_80AE9B4C(1, 0);
- func_80AE9F28(this);
- } else if (func_80AE9AC4(this, 0)) {
+ EnLiftNuts_MinigameState(ENLIFTNUTS_MINIGAME_STATE_MODE_SET, ENLIFTNUTS_MINIGAME_STATE_NONE);
+ EnLiftNuts_SetupIdleHidden(this);
+ } else if (EnLiftNuts_Autotalk(this, ENLIFTNUTS_AUTOTALK_MODE_CHECK_OFF)) {
Player* player = GET_PLAYER(play);
player->stateFlags1 |= PLAYER_STATE1_20;
- func_80AE9AC4(this, 1);
- func_80AE9B4C(1, 3);
- func_80AEA0B4(this);
+ EnLiftNuts_Autotalk(this, ENLIFTNUTS_AUTOTALK_MODE_SET_ON);
+ EnLiftNuts_MinigameState(ENLIFTNUTS_MINIGAME_STATE_MODE_SET, ENLIFTNUTS_MINIGAME_STATE_AFTER);
+ EnLiftNuts_SetupIdle(this);
} else {
- func_80AE9F28(this);
+ EnLiftNuts_SetupIdleHidden(this);
}
}
@@ -260,76 +319,79 @@ void EnLiftNuts_Destroy(Actor* thisx, PlayState* play) {
EnLiftNuts* this = THIS;
Collider_DestroyCylinder(play, &this->collider);
- func_80AE9A80(this, play);
+ EnLiftNuts_FreeSharedMemoryEntry(this, play);
}
-void func_80AE9F28(EnLiftNuts* this) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 18);
- this->actionFunc = func_80AE9F70;
- this->unk_354 = 0;
+void EnLiftNuts_SetupIdleHidden(EnLiftNuts* this) {
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_BURROW_SHORT);
+ this->actionFunc = EnLiftNuts_IdleHidden;
+ this->timer = 0;
}
-void func_80AE9F70(EnLiftNuts* this, PlayState* play) {
- if (this->unk_354 < 40) {
- this->unk_354++;
+void EnLiftNuts_IdleHidden(EnLiftNuts* this, PlayState* play) {
+ if (this->timer < 40) {
+ this->timer++;
} else if (this->actor.xzDistToPlayer < 100.0f) {
- func_80AEA0B4(this);
+ EnLiftNuts_SetupIdle(this);
}
}
-void func_80AE9FC8(EnLiftNuts* this) {
- if (this->actionFunc == func_80AEA1A0) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 17);
+void EnLiftNuts_SetupBurrow(EnLiftNuts* this) {
+ if (this->actionFunc == EnLiftNuts_Idle) {
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_BURROW_HALF);
} else {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 3);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_BURROW_LONG);
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
- this->actionFunc = func_80AEA044;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
+ this->actionFunc = EnLiftNuts_Burrow;
}
-void func_80AEA044(EnLiftNuts* this, PlayState* play) {
+void EnLiftNuts_Burrow(EnLiftNuts* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- func_80AE9F28(this);
+ EnLiftNuts_SetupIdleHidden(this);
} else if (Animation_OnFrame(&this->skelAnime, 5.0f)) {
- func_80AEB9E0(this, play);
+ EnLiftNuts_SpawnDust(this, play);
}
}
-void func_80AEA0B4(EnLiftNuts* this) {
- if (func_80AE9B4C(0, 1)) {
- this->actionFunc = func_80AEA1A0;
+void EnLiftNuts_SetupIdle(EnLiftNuts* this) {
+ if (EnLiftNuts_MinigameState(ENLIFTNUTS_MINIGAME_STATE_MODE_CHECK, ENLIFTNUTS_MINIGAME_STATE_STARTING)) {
+ this->actionFunc = EnLiftNuts_Idle;
} else {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 2);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
- this->actionFunc = func_80AEA128;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_RISE_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
+ this->actionFunc = EnLiftNuts_RiseUp;
}
}
-void func_80AEA128(EnLiftNuts* this, PlayState* play) {
+void EnLiftNuts_RiseUp(EnLiftNuts* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 15);
- this->actionFunc = func_80AEA1A0;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_BOB);
+ this->actionFunc = EnLiftNuts_Idle;
} else if (Animation_OnFrame(&this->skelAnime, 8.0f)) {
- func_80AEB9E0(this, play);
+ EnLiftNuts_SpawnDust(this, play);
}
}
-void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
- if ((func_80AE9B4C(0, 3) || func_80AE9B4C(0, 1)) && this->unk_34E == 1) {
+void EnLiftNuts_Idle(EnLiftNuts* this, PlayState* play) {
+ if ((EnLiftNuts_MinigameState(ENLIFTNUTS_MINIGAME_STATE_MODE_CHECK, ENLIFTNUTS_MINIGAME_STATE_AFTER) ||
+ EnLiftNuts_MinigameState(ENLIFTNUTS_MINIGAME_STATE_MODE_CHECK, ENLIFTNUTS_MINIGAME_STATE_STARTING)) &&
+ (this->autotalk == true)) {
this->actor.flags |= ACTOR_FLAG_10000;
} else if (this->actor.xzDistToPlayer > 120.0f) {
- func_80AE9FC8(this);
+ EnLiftNuts_SetupBurrow(this);
}
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- if (gSaveContext.save.playerForm == PLAYER_FORM_DEKU) {
- if (func_80AE9B4C(0, 0)) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_DEKU) {
+ if (EnLiftNuts_MinigameState(ENLIFTNUTS_MINIGAME_STATE_MODE_CHECK, ENLIFTNUTS_MINIGAME_STATE_NONE)) {
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)) {
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_1)) {
Message_StartTextbox(play, 0x27D9, &this->actor);
this->textId = 0x27D9;
} else {
@@ -339,17 +401,18 @@ 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 {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_20)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_2)) {
Message_StartTextbox(play, 0x27DB, &this->actor);
this->textId = 0x27DB;
break;
}
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_10)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_1)) {
Message_StartTextbox(play, 0x27DC, &this->actor);
this->textId = 0x27DC;
} else {
@@ -360,16 +423,17 @@ 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)) {
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_3)) {
Message_StartTextbox(play, 0x27DE, &this->actor);
this->textId = 0x27DE;
- } else if (func_80AE9B8C() == 2) {
+ } else if (EnLiftNuts_GetNumDaysWon() == 2) {
Message_StartTextbox(play, 0x27DF, &this->actor);
this->textId = 0x27DF;
- } else if (func_80AE9B8C() == 1) {
+ } else if (EnLiftNuts_GetNumDaysWon() == 1) {
Message_StartTextbox(play, 0x27E0, &this->actor);
this->textId = 0x27E0;
} else {
@@ -378,13 +442,14 @@ void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
}
break;
}
- } else if (func_80AE9B4C(0, 3)) {
+ } else if (EnLiftNuts_MinigameState(ENLIFTNUTS_MINIGAME_STATE_MODE_CHECK,
+ ENLIFTNUTS_MINIGAME_STATE_AFTER)) {
if (Flags_GetSwitch(play, 0x40)) {
Flags_UnsetSwitch(play, 0x40);
Inventory_SaveDekuPlaygroundHighScore(4);
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_10) && CHECK_WEEKEVENTREG(WEEKEVENTREG_14_20) &&
- CURRENT_DAY == 3) {
- this->unk_354 = 0;
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_1) &&
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_2) && (CURRENT_DAY == 3)) {
+ this->timer = 0;
Message_StartTextbox(play, 0x27F4, &this->actor);
this->textId = 0x27F4;
} else {
@@ -393,8 +458,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 {
@@ -408,7 +473,7 @@ void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
}
Flags_UnsetSwitch(play, 0x41);
this->actor.flags &= ~ACTOR_FLAG_10000;
- } else if (!Flags_GetSwitch(play, 0x42)) {
+ } else if (!Flags_GetSwitch(play, 0x42)) { // Explain Rules
Flags_SetSwitch(play, 0x42);
Message_StartTextbox(play, 0x27E6, &this->actor);
this->textId = 0x27E6;
@@ -428,44 +493,47 @@ void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
Message_StartTextbox(play, 0x27E9, &this->actor);
this->textId = 0x27E9;
break;
+
+ default:
+ break;
}
}
} else {
Message_StartTextbox(play, 0x27D8, &this->actor);
this->textId = 0x27D8;
}
- func_80AEABF0(this);
- } else if (func_80AE9AC4(this, 0) || this->unk_34E == 1) {
- if (this->unk_34E == 1) {
- func_800B8614(&this->actor, play, 200.0f);
+ EnLiftNuts_SetupStartConversation(this);
+ } else if (EnLiftNuts_Autotalk(this, ENLIFTNUTS_AUTOTALK_MODE_CHECK_OFF) || (this->autotalk == true)) {
+ if (this->autotalk == true) {
+ Actor_OfferTalk(&this->actor, play, 200.0f);
} else if (this->actor.playerHeightRel >= -13.0f) {
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0xA, 0x1000, 0x500);
}
-void func_80AEA7A4(EnLiftNuts* this, PlayState* play) {
+void EnLiftNuts_HandleConversationChoice(EnLiftNuts* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (Message_ShouldAdvance(play)) {
switch (this->textId) {
case 0x27E2:
if (play->msgCtx.choiceIndex == 0) { // Yes
- if (gSaveContext.save.playerData.rupees >= 10) {
- func_8019F208();
+ if (gSaveContext.save.saveInfo.playerData.rupees >= 10) {
+ Audio_PlaySfx_MessageDecide();
Message_StartTextbox(play, 0x27E5, &this->actor);
this->textId = 0x27E5;
Rupees_ChangeBy(-10);
} else {
- play_sound(NA_SE_SY_ERROR);
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 1);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_WALK);
Message_StartTextbox(play, 0x27E4, &this->actor);
this->textId = 0x27E4;
}
} else {
- func_8019F230();
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 1);
+ Audio_PlaySfx_MessageCancel();
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_WALK);
Message_StartTextbox(play, 0x27E3, &this->actor);
this->textId = 0x27E3;
}
@@ -474,20 +542,21 @@ void func_80AEA7A4(EnLiftNuts* this, PlayState* play) {
case 0x238D:
if (play->msgCtx.choiceIndex == 0) { // Yes
player->stateFlags1 |= PLAYER_STATE1_20;
- func_80AEB1C8(this);
+ EnLiftNuts_SetupStartGameImmediately(this);
} else {
- func_80AE9FC8(this);
+ EnLiftNuts_SetupBurrow(this);
}
break;
default:
- func_80AE9FC8(this);
+ EnLiftNuts_SetupBurrow(this);
break;
}
}
}
-void func_80AEA910(EnLiftNuts* this, PlayState* play) {
+// TODO: name based on TEXT_STATE_5
+void EnLiftNuts_HandleConversation5(EnLiftNuts* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (Message_ShouldAdvance(play)) {
@@ -507,17 +576,17 @@ void func_80AEA910(EnLiftNuts* this, PlayState* play) {
case 0x27E3:
case 0x27E4:
- func_80AE9FC8(this);
+ EnLiftNuts_SetupBurrow(this);
break;
case 0x27E5:
- func_801477B4(play);
+ Message_CloseTextbox(play);
player->stateFlags1 |= PLAYER_STATE1_20;
- func_80AEAEAC(this);
+ EnLiftNuts_SetupMove(this);
break;
case 0x27E6:
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 1);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_WALK);
switch (CURRENT_DAY) {
case 1:
Message_StartTextbox(play, 0x27E7, &this->actor);
@@ -533,6 +602,9 @@ void func_80AEA910(EnLiftNuts* this, PlayState* play) {
Message_StartTextbox(play, 0x27E9, &this->actor);
this->textId = 0x27E9;
break;
+
+ default:
+ break;
}
break;
@@ -544,21 +616,21 @@ void func_80AEA910(EnLiftNuts* this, PlayState* play) {
break;
case 0x27FA:
- func_801477B4(play);
+ Message_CloseTextbox(play);
player->stateFlags1 &= ~PLAYER_STATE1_20;
- func_80AEB114(this);
+ EnLiftNuts_SetupStartGame(this);
break;
case 0x27EE:
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 0x10);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_JUMP);
Message_StartTextbox(play, 0x27EF, &this->actor);
this->textId = 0x27EF;
break;
case 0x27EF:
- func_801477B4(play);
- func_80AEB584(this);
- func_80AEB598(this, play);
+ Message_CloseTextbox(play);
+ EnLiftNuts_SetupGiveReward(this);
+ EnLiftNuts_GiveReward(this, play);
break;
case 0x27F1:
@@ -567,254 +639,268 @@ void func_80AEA910(EnLiftNuts* this, PlayState* play) {
break;
case 0x27F2:
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 1);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_WALK);
Message_StartTextbox(play, 0x27F3, &this->actor);
this->textId = 0x27F3;
break;
case 0x27F4:
- func_801477B4(play);
- func_80AEB584(this);
- func_80AEB598(this, play);
+ Message_CloseTextbox(play);
+ EnLiftNuts_SetupGiveReward(this);
+ EnLiftNuts_GiveReward(this, play);
break;
case 0x27F5:
- func_801477B4(play);
- func_80AE9B4C(1, 0);
+ Message_CloseTextbox(play);
+ EnLiftNuts_MinigameState(ENLIFTNUTS_MINIGAME_STATE_MODE_SET, ENLIFTNUTS_MINIGAME_STATE_NONE);
player->stateFlags1 &= ~PLAYER_STATE1_20;
- func_80AE9FC8(this);
+ EnLiftNuts_SetupBurrow(this);
break;
case 0x27F9:
Message_StartTextbox(play, 0x27ED, &this->actor);
this->textId = 0x27ED;
break;
+
+ default:
+ break;
}
}
}
-void func_80AEABF0(EnLiftNuts* this) {
- this->unk_354 = 0;
+void EnLiftNuts_SetupStartConversation(EnLiftNuts* this) {
+ this->timer = 0;
- if (this->actionFunc != func_80AEB698) {
- if (func_80AE9B4C(0, 0)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
+ if (this->actionFunc != EnLiftNuts_ResumeConversation) {
+ if (EnLiftNuts_MinigameState(ENLIFTNUTS_MINIGAME_STATE_MODE_CHECK, ENLIFTNUTS_MINIGAME_STATE_NONE)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
}
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 16);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_JUMP);
}
- this->actionFunc = func_80AEAC64;
+ this->actionFunc = EnLiftNuts_StartConversation;
}
-void func_80AEAC64(EnLiftNuts* this, PlayState* play) {
+void EnLiftNuts_StartConversation(EnLiftNuts* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
if ((this->textId == 0x27EE) || (this->textId == 0x27F4) || (this->textId == 0x27F5)) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 10);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_SHOCKED_START);
} else {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 0);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_STANDING);
}
- this->actionFunc = func_80AEACF8;
+ this->actionFunc = EnLiftNuts_HandleConversation;
}
}
-void func_80AEACF8(EnLiftNuts* this, PlayState* play) {
+void EnLiftNuts_HandleConversation(EnLiftNuts* this, PlayState* play) {
Player* player = GET_PLAYER(play);
switch (Message_GetState(&play->msgCtx)) {
- case 0:
- case 1:
- case 2:
- case 3:
+ case TEXT_STATE_NONE:
+ case TEXT_STATE_1:
+ case TEXT_STATE_CLOSING:
+ case TEXT_STATE_3:
break;
- case 4:
- func_80AEA7A4(this, play);
+ case TEXT_STATE_CHOICE:
+ EnLiftNuts_HandleConversationChoice(this, play);
break;
- case 5:
- func_80AEA910(this, play);
+ case TEXT_STATE_5:
+ EnLiftNuts_HandleConversation5(this, play);
break;
- case 6:
+ case TEXT_STATE_DONE:
if (Message_ShouldAdvance(play)) {
player->stateFlags1 &= ~PLAYER_STATE1_20;
- func_80AE9FC8(this);
- func_80AE9AC4(this, 2);
- if (func_80AE9B4C(0, 3)) {
- func_80AE9B4C(1, 0);
+ EnLiftNuts_SetupBurrow(this);
+ EnLiftNuts_Autotalk(this, ENLIFTNUTS_AUTOTALK_MODE_SET_OFF);
+ if (EnLiftNuts_MinigameState(ENLIFTNUTS_MINIGAME_STATE_MODE_CHECK, ENLIFTNUTS_MINIGAME_STATE_AFTER)) {
+ EnLiftNuts_MinigameState(ENLIFTNUTS_MINIGAME_STATE_MODE_SET, ENLIFTNUTS_MINIGAME_STATE_NONE);
}
}
break;
+
+ default:
+ break;
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0xA, 0x2000, 0x500);
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
switch (this->textId) {
case 0x27EE:
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 11);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_SHOCKED_SHAKE_HEAD);
break;
case 0x27EF:
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 1);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_WALK);
break;
case 0x27F4:
- if (this->unk_354 == 0) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 11);
- this->unk_354++;
- } else if (this->unk_354 == 4) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 12);
- this->unk_354 = 0;
+ if (this->timer == 0) {
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_SHOCKED_SHAKE_HEAD);
+ this->timer++;
+ } else if (this->timer == 4) {
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_SHOCKED_POUND);
+ this->timer = 0;
} else {
- this->unk_354++;
+ this->timer++;
}
break;
+
+ default:
+ break;
}
}
- func_80AEB974(this);
+ EnLiftNuts_UpdateEyes(this);
}
-void func_80AEAEAC(EnLiftNuts* this) {
- this->actor.speedXZ = 2.0f;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 1);
- func_80AE9AC4(this, 1);
- func_80AE9B4C(1, 1);
- this->actionFunc = func_80AEAF14;
+void EnLiftNuts_SetupMove(EnLiftNuts* this) {
+ this->actor.speed = 2.0f;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_WALK);
+ EnLiftNuts_Autotalk(this, ENLIFTNUTS_AUTOTALK_MODE_SET_ON);
+ EnLiftNuts_MinigameState(ENLIFTNUTS_MINIGAME_STATE_MODE_SET, ENLIFTNUTS_MINIGAME_STATE_STARTING);
+ this->actionFunc = EnLiftNuts_Move;
}
-void func_80AEAF14(EnLiftNuts* this, PlayState* play) {
+void EnLiftNuts_Move(EnLiftNuts* this, PlayState* play) {
f32 dist;
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.home.rot.y, 10, 0x1000, 0x500);
- dist = Math_Vec3f_StepTo(&this->actor.world.pos, &this->vec_1D8, this->actor.speedXZ);
+ dist = Math_Vec3f_StepTo(&this->actor.world.pos, &this->waypointPos, this->actor.speed);
this->actor.world.pos.y += this->actor.gravity;
if (dist == 0.0f) {
- func_80AEAF8C(this);
+ EnLiftNuts_SetupMovePlayer(this);
}
}
-void func_80AEAF8C(EnLiftNuts* this) {
- this->actionFunc = func_80AEAFA0;
+void EnLiftNuts_SetupMovePlayer(EnLiftNuts* this) {
+ this->actionFunc = EnLiftNuts_MovePlayer;
}
-void func_80AEAFA0(EnLiftNuts* this, PlayState* play) {
+void EnLiftNuts_MovePlayer(EnLiftNuts* this, PlayState* play) {
Player* player = GET_PLAYER(play);
f32 dist;
- f32 temp_fv0;
+ f32 magnitude;
+ s16 playerYaw;
s16 yaw;
- s16 sp28;
s16 yawDiff;
- sp28 = this->actor.yawTowardsPlayer - 0x8000;
- yaw = Math_Vec3f_Yaw(&player->actor.world.pos, &this->actor.home.pos);
- yawDiff = yaw - sp28;
+ yaw = this->actor.yawTowardsPlayer - 0x8000;
+ playerYaw = Math_Vec3f_Yaw(&player->actor.world.pos, &this->actor.home.pos);
+ yawDiff = playerYaw - yaw;
dist = Math_Vec3f_DistXZ(&player->actor.world.pos, &this->actor.home.pos);
if (this->actor.xzDistToPlayer < dist) {
if (ABS_ALT(yawDiff) < 0x2000) {
- yaw = (yawDiff > 0) ? (yaw + 0x2000) : (yaw - 0x2000);
+ playerYaw = (yawDiff > 0) ? (playerYaw + 0x2000) : (playerYaw - 0x2000);
}
}
+
if (dist < 5.0f) {
- temp_fv0 = 10.0f;
+ magnitude = 10.0f;
} else if (dist < 30.0f) {
- temp_fv0 = 40.0f;
+ magnitude = 40.0f;
} else {
- temp_fv0 = 80.0f;
+ magnitude = 80.0f;
}
- play->actorCtx.unk268 = 1;
- func_800B6F20(play, &play->actorCtx.unk_26C, temp_fv0, yaw);
+ play->actorCtx.unk268 = true;
+ func_800B6F20(play, &play->actorCtx.unk_26C, magnitude, playerYaw);
+
if (dist < 5.0f) {
- func_80AEA0B4(this);
+ EnLiftNuts_SetupIdle(this);
}
}
-void func_80AEB114(EnLiftNuts* this) {
- func_801A2BB8(NA_BGM_TIMED_MINI_GAME);
- this->actionFunc = func_80AEB148;
+void EnLiftNuts_SetupStartGame(EnLiftNuts* this) {
+ Audio_PlaySubBgm(NA_BGM_TIMED_MINI_GAME);
+ this->actionFunc = EnLiftNuts_StartGame;
}
-void func_80AEB148(EnLiftNuts* this, PlayState* play) {
+void EnLiftNuts_StartGame(EnLiftNuts* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (player->stateFlags3 & PLAYER_STATE3_200) {
- this->actor.speedXZ = 2.0f;
+ this->actor.speed = 2.0f;
SET_EVENTINF(EVENTINF_34);
- Interface_StartTimer(4, 0);
- func_80AE9B4C(1, 2);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_FOUND);
- func_80AEB280(this);
+ Interface_StartTimer(TIMER_ID_MINIGAME_2, 0);
+ EnLiftNuts_MinigameState(ENLIFTNUTS_MINIGAME_STATE_MODE_SET, ENLIFTNUTS_MINIGAME_STATE_RUNNING);
+ Actor_PlaySfx(&this->actor, NA_SE_SY_FOUND);
+ EnLiftNuts_SetupRunGame(this);
}
}
-void func_80AEB1C8(EnLiftNuts* this) {
- this->actor.speedXZ = 2.0f;
+/**
+ * Does not wait for the player to pop out of the flower to start the minigame.
+ */
+void EnLiftNuts_SetupStartGameImmediately(EnLiftNuts* this) {
+ this->actor.speed = 2.0f;
SET_EVENTINF(EVENTINF_34);
- Interface_StartTimer(4, 0);
- func_80AE9B4C(1, 2);
- this->actionFunc = func_80AEB230;
+ Interface_StartTimer(TIMER_ID_MINIGAME_2, 0);
+ EnLiftNuts_MinigameState(ENLIFTNUTS_MINIGAME_STATE_MODE_SET, ENLIFTNUTS_MINIGAME_STATE_RUNNING);
+ this->actionFunc = EnLiftNuts_StartGameImmediately;
}
-void func_80AEB230(EnLiftNuts* this, PlayState* play) {
+void EnLiftNuts_StartGameImmediately(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);
+ EnLiftNuts_SetupRunGame(this);
}
}
-void func_80AEB280(EnLiftNuts* this) {
- this->actionFunc = func_80AEB294;
+void EnLiftNuts_SetupRunGame(EnLiftNuts* this) {
+ this->actionFunc = EnLiftNuts_RunGame;
}
-void func_80AEB294(EnLiftNuts* this, PlayState* play) {
+void EnLiftNuts_RunGame(EnLiftNuts* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (((player->actor.bgCheckFlags & 1) && (player->actor.floorBgId == BG_ACTOR_MAX) &&
- player->actor.world.pos.y < 20.0f) ||
- gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] >= 0x2EE0) {
+ 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] >= SECONDS_TO_TIMER(120))) {
player->stateFlags1 |= PLAYER_STATE1_20;
Flags_SetSwitch(play, 0x41);
- func_80AEB3E0(this, play);
+ EnLiftNuts_SetupEndGame(this, play);
}
- if (*this->ptr_1EC == 300) {
+ if (*this->minigameScore == (ENGAMELUPY_POINTS * 6)) {
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);
- func_80AEB3E0(this, play);
+ EnLiftNuts_SetupEndGame(this, play);
}
}
-void func_80AEB3E0(EnLiftNuts* this, PlayState* play) {
- play_sound(NA_SE_SY_FOUND);
- this->unk_354 = 0;
+void EnLiftNuts_SetupEndGame(EnLiftNuts* this, PlayState* play) {
+ Audio_PlaySfx(NA_SE_SY_FOUND);
+ this->timer = 0;
gSaveContext.timerStates[TIMER_ID_MINIGAME_2] = TIMER_STATE_6;
- this->actionFunc = func_80AEB428;
+ this->actionFunc = EnLiftNuts_EndGame;
}
-void func_80AEB428(EnLiftNuts* this, PlayState* play) {
+void EnLiftNuts_EndGame(EnLiftNuts* this, PlayState* play) {
s32 pad;
- if (this->unk_354 == 10) {
+ if (this->timer == 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) {
+ } else if (*this->minigameScore == (ENGAMELUPY_POINTS * 6)) {
Message_StartTextbox(play, 0x27F8, &this->actor);
this->textId = 0x27F8;
} else {
Message_StartTextbox(play, 0x27EC, &this->actor);
this->textId = 0x27EC;
}
- } else if (this->unk_354 == 30) {
+ } else if (this->timer == 30) {
CLEAR_EVENTINF(EVENTINF_34);
gSaveContext.respawn[RESPAWN_MODE_DOWN].entrance = ENTRANCE(DEKU_SCRUB_PLAYGROUND, 1);
gSaveContext.nextCutsceneIndex = 0;
@@ -823,40 +909,45 @@ void func_80AEB428(EnLiftNuts* this, PlayState* play) {
play->transitionType = TRANS_TYPE_64;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK;
}
- this->unk_354++;
+ this->timer++;
}
-void func_80AEB584(EnLiftNuts* this) {
- this->actionFunc = func_80AEB598;
+void EnLiftNuts_SetupGiveReward(EnLiftNuts* this) {
+ this->actionFunc = EnLiftNuts_GiveReward;
}
-void func_80AEB598(EnLiftNuts* this, PlayState* play) {
+void EnLiftNuts_GiveReward(EnLiftNuts* this, PlayState* play) {
if (Actor_HasParent(&this->actor, play)) {
this->actor.parent = NULL;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_10) && CHECK_WEEKEVENTREG(WEEKEVENTREG_14_20) && (CURRENT_DAY == 3) &&
- !CHECK_WEEKEVENTREG(WEEKEVENTREG_14_80)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_14_80);
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_1) &&
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_2) && (CURRENT_DAY == 3) &&
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_DEKU_PLAYGROUND_HEART_PIECE)) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_DEKU_PLAYGROUND_HEART_PIECE);
}
- func_80AEB684(this);
- } else if ((this->textId == 0x27F4) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_14_80)) {
- Actor_PickUp(&this->actor, play, GI_HEART_PIECE, 500.0f, 100.0f);
+ EnLiftNuts_SetupResumeConversation(this);
+ } else if ((this->textId == 0x27F4) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_DEKU_PLAYGROUND_HEART_PIECE)) {
+ Actor_OfferGetItem(&this->actor, play, GI_HEART_PIECE, 500.0f, 100.0f);
} else {
- Actor_PickUp(&this->actor, play, GI_RUPEE_PURPLE, 500.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_RUPEE_PURPLE, 500.0f, 100.0f);
}
}
-void func_80AEB684(EnLiftNuts* this) {
- this->actionFunc = func_80AEB698;
+void EnLiftNuts_SetupResumeConversation(EnLiftNuts* this) {
+ this->actionFunc = EnLiftNuts_ResumeConversation;
}
-void func_80AEB698(EnLiftNuts* this, PlayState* play) {
+/**
+ * Resumes the current conversation after giving player the reward for winning the minigame.
+ */
+void EnLiftNuts_ResumeConversation(EnLiftNuts* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_10) && CHECK_WEEKEVENTREG(WEEKEVENTREG_14_20) && (CURRENT_DAY == 3)) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 13);
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_1) &&
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_2) && (CURRENT_DAY == 3)) {
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_SHOCKED_END);
Message_StartTextbox(play, 0x27F5, &this->actor);
this->textId = 0x27F5;
- } else if (func_80AE9B8C() > 0) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 1);
+ } else if (EnLiftNuts_GetNumDaysWon() > 0) {
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_WALK);
Message_StartTextbox(play, 0x27F0, &this->actor);
this->textId = 0x27F0;
} else {
@@ -864,86 +955,85 @@ void func_80AEB698(EnLiftNuts* this, PlayState* play) {
this->textId = 0x27F1;
}
this->actor.flags &= ~ACTOR_FLAG_10000;
- func_80AEABF0(this);
+ EnLiftNuts_SetupStartConversation(this);
switch (CURRENT_DAY) {
case 1:
- SET_WEEKEVENTREG(WEEKEVENTREG_14_10);
+ SET_WEEKEVENTREG(WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_1);
break;
case 2:
- SET_WEEKEVENTREG(WEEKEVENTREG_14_20);
+ SET_WEEKEVENTREG(WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_2);
break;
case 3:
- SET_WEEKEVENTREG(WEEKEVENTREG_14_40);
+ SET_WEEKEVENTREG(WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_3);
break;
default:
break;
}
} else {
- func_800B85E0(&this->actor, play, 200.0f, -1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 200.0f, PLAYER_IA_MINUS1);
}
}
-void func_80AEB828(EnLiftNuts* this) {
- if (!func_80AE9B4C(0, 4)) {
- func_80AE9B4C(1, 4);
- this->unk_356 = 1;
+void EnLiftNuts_SetupStartHiding(EnLiftNuts* this) {
+ if (!EnLiftNuts_MinigameState(ENLIFTNUTS_MINIGAME_STATE_MODE_CHECK, ENLIFTNUTS_MINIGAME_STATE_HIDING)) {
+ EnLiftNuts_MinigameState(ENLIFTNUTS_MINIGAME_STATE_MODE_SET, ENLIFTNUTS_MINIGAME_STATE_HIDING);
+ this->isFirstTimeHiding = true;
}
- if (this->actionFunc == func_80AE9F70) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 15);
+ if (this->actionFunc == EnLiftNuts_IdleHidden) {
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_BOB);
}
- this->unk_354 = 0;
- this->actionFunc = func_80AEB8A4;
+ this->timer = 0;
+ this->actionFunc = EnLiftNuts_StartHiding;
}
-void func_80AEB8A4(EnLiftNuts* this, PlayState* play) {
- if (this->unk_354 == 22) {
- if (this->unk_356 == 1) {
+void EnLiftNuts_StartHiding(EnLiftNuts* this, PlayState* play) {
+ if (this->timer == 22) {
+ if (this->isFirstTimeHiding == true) {
Message_StartTextbox(play, 0x27F6, &this->actor);
this->textId = 0x27F6;
}
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 17);
- this->actionFunc = func_80AEB934;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_BURROW_HALF);
+ this->actionFunc = EnLiftNuts_Hide;
}
- this->unk_354++;
+ this->timer++;
}
-void func_80AEB934(EnLiftNuts* this, PlayState* play) {
+void EnLiftNuts_Hide(EnLiftNuts* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, 5.0f)) {
- func_80AEB9E0(this, play);
+ EnLiftNuts_SpawnDust(this, play);
}
}
-void func_80AEB974(EnLiftNuts* this) {
- s16 textId = this->textId;
-
- switch (textId) {
- default:
- this->unk_1E4 = 0;
- break;
-
+void EnLiftNuts_UpdateEyes(EnLiftNuts* this) {
+ switch (this->textId) {
case 0x27EE:
case 0x27EF:
- this->unk_1E4 = 1;
+ this->eyeTexIndex = 1;
break;
case 0x27F5:
- this->unk_1E4 = 2;
+ this->eyeTexIndex = 2;
break;
case 0x27F4:
- if (this->unk_354 == 0) {
- this->unk_1E4 = 2;
- break;
+ if (this->timer == 0) {
+ this->eyeTexIndex = 2;
+ } else {
+ this->eyeTexIndex = 1;
}
- this->unk_1E4 = 1;
+ break;
+
+ default:
+ this->eyeTexIndex = 0;
+ break;
}
}
-void func_80AEB9E0(EnLiftNuts* this, PlayState* play) {
- Vec3f worldPos = this->actor.world.pos;
+void EnLiftNuts_SpawnDust(EnLiftNuts* this, PlayState* play) {
+ Vec3f pos = this->actor.world.pos;
Vec3f velocity;
Vec3f accel;
Color_RGBA8 primColor = { 170, 130, 90, 255 };
@@ -960,11 +1050,11 @@ void func_80AEB9E0(EnLiftNuts* this, PlayState* play) {
accel.x = -0.2f * velocity.x;
accel.z = -0.2f * velocity.z;
- func_800B0EB0(play, &worldPos, &velocity, &accel, &primColor, &envColor, 80, 25, 10);
+ func_800B0EB0(play, &pos, &velocity, &accel, &primColor, &envColor, 80, 25, 10);
}
}
-void func_80AEBB30(EnLiftNuts* this, PlayState* play) {
+void EnLiftNuts_UpdateCollision(EnLiftNuts* this, PlayState* play) {
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
}
@@ -974,42 +1064,44 @@ 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);
- func_80AE9BCC(this, play);
+ EnLiftNuts_UpdateCollision(this, play);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
+ EnLiftNuts_TryHide(this, play);
- if (func_80AE9B4C(0, 2)) {
- thisx->flags &= ~ACTOR_FLAG_1;
+ if (EnLiftNuts_MinigameState(ENLIFTNUTS_MINIGAME_STATE_MODE_CHECK, ENLIFTNUTS_MINIGAME_STATE_RUNNING)) {
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
}
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 == BUSINESS_SCRUB_LIMB_RIGHT_HAND_HAT) || (limbIndex == BUSINESS_SCRUB_LIMB_RIGHT_HAND_BAG) ||
+ (limbIndex == BUSINESS_SCRUB_LIMB_LEFT_HAND_BAG) || (limbIndex == BUSINESS_SCRUB_LIMB_SCALP) ||
+ (limbIndex == BUSINESS_SCRUB_LIMB_HAIR) || (limbIndex == BUSINESS_SCRUB_LIMB_LEFT_HAND_BAG) ||
+ (limbIndex == BUSINESS_SCRUB_LIMB_LEFT_ARM_BAG)) {
*dList = NULL;
}
- if (limbIndex == OBJECT_DNT_LIMB_1A) {
- *dList = D_80AEBF18[this->unk_1E4];
+ if (limbIndex == BUSINESS_SCRUB_LIMB_EYES) {
+ *dList = sEyeTextures[this->eyeTexIndex];
}
return false;
}
void EnLiftNuts_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
static Vec3f sFocusOffset = { 0.0f, 0.0f, 0.0f };
+ EnLiftNuts* this = THIS;
- if (limbIndex == OBJECT_DNT_LIMB_19) {
- Matrix_MultVec3f(&sFocusOffset, &thisx->focus.pos);
+ if (limbIndex == BUSINESS_SCRUB_LIMB_HAT) {
+ Matrix_MultVec3f(&sFocusOffset, &this->actor.focus.pos);
}
}
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_Lift_Nuts/z_en_lift_nuts.h b/src/overlays/actors/ovl_En_Lift_Nuts/z_en_lift_nuts.h
index 9a54132a4..2ee5897bd 100644
--- a/src/overlays/actors/ovl_En_Lift_Nuts/z_en_lift_nuts.h
+++ b/src/overlays/actors/ovl_En_Lift_Nuts/z_en_lift_nuts.h
@@ -8,25 +8,25 @@ struct EnLiftNuts;
typedef void (*EnLiftNutsActionFunc)(struct EnLiftNuts*, PlayState*);
-#define ENLIFTNUTS_GET_FF00(thisx) (((thisx)->params & 0xFF00) >> 8)
+#define ENLIFTNUTS_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFF00) >> 8)
typedef struct EnLiftNuts {
/* 0x000 */ Actor actor;
/* 0x144 */ ColliderCylinder collider;
/* 0x190 */ SkelAnime skelAnime;
/* 0x1D4 */ EnLiftNutsActionFunc actionFunc;
- /* 0x1D8 */ Vec3f vec_1D8;
- /* 0x1E4 */ s32 unk_1E4;
- /* 0x1E8 */ s32 unk_1E8;
- /* 0x1EC */ s16* ptr_1EC;
- /* 0x1F0 */ Vec3s jointTable[OBJECT_DNT_LIMB_MAX];
- /* 0x298 */ Vec3s morphTable[OBJECT_DNT_LIMB_MAX];
+ /* 0x1D8 */ Vec3f waypointPos;
+ /* 0x1E4 */ s32 eyeTexIndex;
+ /* 0x1E8 */ s32 unk1E8; // Set but never used
+ /* 0x1EC */ s16* minigameScore; // Pointer to shared memory location with actor EnGamelupy
+ /* 0x1F0 */ Vec3s jointTable[BUSINESS_SCRUB_LIMB_MAX];
+ /* 0x298 */ Vec3s morphTable[BUSINESS_SCRUB_LIMB_MAX];
/* 0x340 */ UNK_TYPE1 unk_340[0xC];
/* 0x34C */ s16 textId;
- /* 0x34E */ s16 unk_34E;
+ /* 0x34E */ s16 autotalk;
/* 0x350 */ UNK_TYPE1 unk_350[0x4];
- /* 0x354 */ s16 unk_354;
- /* 0x356 */ s16 unk_356;
+ /* 0x354 */ s16 timer; // Frame counter used for various different things
+ /* 0x356 */ s16 isFirstTimeHiding;
} EnLiftNuts; // size = 0x358
#endif // Z_EN_LIFT_NUTS_H
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 b988fcce3..065a58cf5 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[] = {
@@ -52,7 +52,7 @@ void EnLight_Init(Actor* thisx, PlayState* play) {
EnLight* this = THIS;
if (!ENLIGHT_GET_4000(&this->actor)) {
- if ((gSaveContext.gameMode == 3) || ENLIGHT_GET_2000(&this->actor)) {
+ if ((gSaveContext.gameMode == GAMEMODE_END_CREDITS) || ENLIGHT_GET_2000(&this->actor)) {
Lights_PointNoGlowSetInfo(&this->lightInfo, this->actor.world.pos.x,
((this->actor.params < 0) ? 1 : 40) + (s32)this->actor.world.pos.y,
this->actor.world.pos.z, 255, 255, 180, -1);
@@ -70,7 +70,7 @@ void EnLight_Init(Actor* thisx, PlayState* play) {
if (ENLIGHT_GET_800(&this->actor)) {
this->actor.update = func_80865F38;
- if (ENLIGHT_GET_1000(&this->actor) && Flags_GetSwitch(play, ENLIGHT_SWITCHFLAG(&this->actor))) {
+ if (ENLIGHT_GET_1000(&this->actor) && Flags_GetSwitch(play, ENLIGHT_SWITCH_FLAG(&this->actor))) {
Actor_SetScale(&this->actor, 0.0f);
}
} else if (ENLIGHT_GET_2000(&this->actor)) {
@@ -112,7 +112,7 @@ void EnLight_Update(Actor* thisx, PlayState* play) {
func_80865BF8(this, play);
if ((this->actor.params >= 0) && !ENLIGHT_GET_4000(&this->actor)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_TORCH - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_TORCH - SFX_FLAG);
}
}
@@ -124,7 +124,7 @@ void func_80865F38(Actor* thisx, PlayState* play) {
s32 sp2C = false;
if (ENLIGHT_GET_1000(&this->actor)) {
- if (Flags_GetSwitch(play, ENLIGHT_SWITCHFLAG(&this->actor))) {
+ if (Flags_GetSwitch(play, ENLIGHT_SWITCH_FLAG(&this->actor))) {
Math_StepToF(&sp30, 1.0f, 0.05f);
sp2C = true;
} else {
@@ -134,7 +134,7 @@ void func_80865F38(Actor* thisx, PlayState* play) {
}
Math_StepToF(&sp30, 0.0f, 0.05f);
}
- } else if (Flags_GetSwitch(play, ENLIGHT_SWITCHFLAG(&this->actor))) {
+ } else if (Flags_GetSwitch(play, ENLIGHT_SWITCH_FLAG(&this->actor))) {
if (sp30 < 0.1f) {
Actor_SetScale(&this->actor, 0.0f);
sp30 = 0.0f;
@@ -156,7 +156,7 @@ void func_80865F38(Actor* thisx, PlayState* play) {
func_80865BF8(this, play);
if ((this->actor.params >= 0) && (sp2C == true)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_TORCH - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_TORCH - SFX_FLAG);
}
}
@@ -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_Light/z_en_light.h b/src/overlays/actors/ovl_En_Light/z_en_light.h
index 17762d7fa..25e1b5851 100644
--- a/src/overlays/actors/ovl_En_Light/z_en_light.h
+++ b/src/overlays/actors/ovl_En_Light/z_en_light.h
@@ -8,7 +8,7 @@ struct EnLight;
#define ENLIGHT_GET_1(thisx) ((thisx)->params & 1)
#define ENLIGHT_GET_F(thisx) ((thisx)->params & 0xF)
#define ENLIGHT_GET_800(thisx) ((thisx)->params & 0x800)
-#define ENLIGHT_SWITCHFLAG(thisx) (((thisx)->params & 0x7F0) >> 4)
+#define ENLIGHT_SWITCH_FLAG(thisx) (((thisx)->params & 0x7F0) >> 4)
#define ENLIGHT_GET_1000(thisx) ((thisx)->params & 0x1000)
#define ENLIGHT_GET_2000(thisx) ((thisx)->params & 0x2000)
#define ENLIGHT_GET_4000(thisx) ((thisx)->params & 0x4000)
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 ac376bb16..880f48e82 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
@@ -109,10 +109,10 @@ void EnLookNuts_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 0.01f);
this->actor.colChkInfo.damageTable = &sDamageTable;
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
- this->actor.targetMode = 1;
+ this->actor.targetMode = TARGET_MODE_1;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
- this->actor.flags |= ACTOR_FLAG_8000000;
- this->pathLocation = LOOKNUTS_GET_PATROL_LOCATION(&this->actor);
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ 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;
}
@@ -151,31 +151,31 @@ void EnLookNuts_Patrol(EnLookNuts* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (Play_InCsMode(play)) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
return;
}
- this->actor.speedXZ = 2.0f;
+ this->actor.speed = 2.0f;
if (Animation_OnFrame(&this->skelAnime, 1.0f) || Animation_OnFrame(&this->skelAnime, 5.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_WALK);
}
if (D_80A6862C != 0) {
- Math_ApproachZeroF(&this->actor.speedXZ, 0.3f, 1.0f);
+ Math_ApproachZeroF(&this->actor.speed, 0.3f, 1.0f);
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);
@@ -207,7 +207,7 @@ void EnLookNuts_StandAndWait(EnLookNuts* this, PlayState* play) {
s16 randOffset;
SkelAnime_Update(&this->skelAnime);
- Math_ApproachZeroF(&this->actor.speedXZ, 0.3f, 1.0f);
+ Math_ApproachZeroF(&this->actor.speed, 0.3f, 1.0f);
if (!Play_InCsMode(play) && (D_80A6862C == 0) && (this->eventTimer == 0)) {
this->eventTimer = 10;
switch (this->waitTimer) {
@@ -273,13 +273,13 @@ void EnLookNuts_DetectedPlayer(EnLookNuts* this, PlayState* play) {
void EnLookNuts_RunToPlayer(EnLookNuts* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (Animation_OnFrame(&this->skelAnime, 1.0f) || Animation_OnFrame(&this->skelAnime, 5.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_WALK);
}
- this->actor.speedXZ = 4.0f;
+ this->actor.speed = 4.0f;
Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 1, 0xBB8, 0);
if ((this->actor.xzDistToPlayer < 70.0f) || (this->eventTimer == 0)) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
EnLookNuts_SetupSendPlayerToSpawn(this);
}
}
@@ -295,7 +295,7 @@ void EnLookNuts_SendPlayerToSpawn(EnLookNuts* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 1, 0xBB8, 0);
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
play->nextEntrance = Entrance_CreateFromSpawn(this->spawnIndex);
gSaveContext.nextCutsceneIndex = 0;
Scene_SetExitFade(play);
@@ -358,10 +358,10 @@ void EnLookNuts_Update(Actor* thisx, PlayState* play) {
if (!(player->stateFlags3 & PLAYER_STATE3_100) && !Play_InCsMode(play)) {
Math_Vec3f_Copy(&this->headRotTarget, &gZeroVec3f);
this->state = PALACE_GUARD_RUNNING_TO_PLAYER;
- play_sound(NA_SE_SY_FOUND);
+ Audio_PlaySfx(NA_SE_SY_FOUND);
func_800B7298(play, &this->actor, PLAYER_CSMODE_26);
D_80A6862C = 1;
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_10);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_10);
this->actor.gravity = 0.0f;
EnLookNuts_DetectedPlayer(this, play);
} else {
@@ -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..89b9fcfff 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
@@ -119,7 +119,7 @@ void EnMThunder_Init(Actor* thisx, PlayState* play) {
this->collider.dim.yShift = -20;
this->timer = 8;
this->scroll = 0.0f;
- this->actor.world.pos = player->bodyPartsPos[0];
+ this->actor.world.pos = player->bodyPartsPos[PLAYER_BODYPART_WAIST];
this->lightColorFrac = 0.0f;
this->adjustLightsArg1 = 0.0f;
this->actor.shape.rot.y = player->actor.shape.rot.y + 0x8000;
@@ -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,
@@ -143,11 +143,11 @@ void EnMThunder_Init(Actor* thisx, PlayState* play) {
player->stateFlags2 &= ~PLAYER_STATE2_20000;
this->isCharging = false;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_23_02)) {
- player->unk_B08[0] = 1.0f;
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_OBTAINED_GREAT_SPIN_ATTACK)) {
+ 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) {
+ if (this->type == ENMTHUNDER_TYPE_GREAT_FAIRYS_SWORD) {
this->scaleTarget = 6;
} else if (this->type == ENMTHUNDER_TYPE_GILDED_SWORD) {
this->scaleTarget = 4;
@@ -155,10 +155,10 @@ 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) {
+ if (this->type == ENMTHUNDER_TYPE_GREAT_FAIRYS_SWORD) {
this->scaleTarget = 4;
} else if (this->type == ENMTHUNDER_TYPE_GILDED_SWORD) {
this->scaleTarget = 3;
@@ -203,7 +203,7 @@ void EnMThunder_Destroy(Actor* thisx, PlayState* play) {
}
void EnMThunder_AdjustLights(PlayState* play, f32 arg1) {
- func_800FD2B4(play, arg1, 850.0f, 0.2f, 0.0f);
+ Environment_AdjustLights(play, arg1, 850.0f, 0.2f, 0.0f);
}
void EnMThunder_Spin_AttackNoMagic(EnMThunder* this, PlayState* play) {
@@ -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->actor.world.pos = player->bodyPartsPos[0];
+ this->unk1B0 = player->unk_B08;
+ this->actor.world.pos = player->bodyPartsPos[PLAYER_BODYPART_WAIST];
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,10 +273,10 @@ 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) {
+ if (this->type == ENMTHUNDER_TYPE_GREAT_FAIRYS_SWORD) {
this->scaleTarget = 4;
} else if (this->type == ENMTHUNDER_TYPE_GILDED_SWORD) {
this->scaleTarget = 3;
@@ -286,7 +286,7 @@ void EnMThunder_Charge(EnMThunder* this, PlayState* play) {
} else {
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) {
+ if (this->type == ENMTHUNDER_TYPE_GREAT_FAIRYS_SWORD) {
this->scaleTarget = 6;
} else if (this->type == ENMTHUNDER_TYPE_GILDED_SWORD) {
this->scaleTarget = 4;
@@ -320,27 +320,27 @@ 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) {
- func_8019F900(&player->actor.projectedPos, 2);
- } else if (player->unk_B08[0] > 0.15f) {
- func_8019F900(&player->actor.projectedPos, 1);
- } else if (player->unk_B08[0] > 0.1f) {
- func_8019F900(&player->actor.projectedPos, 0);
+ if (player->unk_B08 > 0.85f) {
+ Audio_PlaySfx_SwordCharge(&player->actor.projectedPos, 2);
+ } else if (player->unk_B08 > 0.15f) {
+ Audio_PlaySfx_SwordCharge(&player->actor.projectedPos, 1);
+ } else if (player->unk_B08 > 0.1f) {
+ Audio_PlaySfx_SwordCharge(&player->actor.projectedPos, 0);
}
if (Play_InCsMode(play)) {
@@ -380,8 +380,8 @@ void EnMThunder_Spin_Attack(EnMThunder* this, PlayState* play) {
}
if (this->timer > 0) {
- this->actor.world.pos.x = player->bodyPartsPos[0].x;
- this->actor.world.pos.z = player->bodyPartsPos[0].z;
+ this->actor.world.pos.x = player->bodyPartsPos[PLAYER_BODYPART_WAIST].x;
+ this->actor.world.pos.z = player->bodyPartsPos[PLAYER_BODYPART_WAIST].z;
this->timer--;
}
@@ -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_M_Thunder/z_en_m_thunder.h b/src/overlays/actors/ovl_En_M_Thunder/z_en_m_thunder.h
index 9842eeb78..1068173e7 100644
--- a/src/overlays/actors/ovl_En_M_Thunder/z_en_m_thunder.h
+++ b/src/overlays/actors/ovl_En_M_Thunder/z_en_m_thunder.h
@@ -12,7 +12,7 @@ typedef enum {
/* 0x00 */ ENMTHUNDER_TYPE_KOKIRI_SWORD,
/* 0x01 */ ENMTHUNDER_TYPE_RAZOR_SWORD,
/* 0x02 */ ENMTHUNDER_TYPE_GILDED_SWORD,
- /* 0x03 */ ENMTHUNDER_TYPE_GREAT_FAIRY_SWORD,
+ /* 0x03 */ ENMTHUNDER_TYPE_GREAT_FAIRYS_SWORD,
/* 0x80 */ ENMTHUNDER_TYPE_UNK = 0x80
} EnMThunderType;
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 973e91553..516112d3d 100644
--- a/src/overlays/actors/ovl_En_Ma4/z_en_ma4.c
+++ b/src/overlays/actors/ovl_En_Ma4/z_en_ma4.c
@@ -6,7 +6,7 @@
#include "z_en_ma4.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_2000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_2000000)
#define THIS ((EnMa4*)thisx)
@@ -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 = {
@@ -142,28 +142,30 @@ void EnMa4_ChangeAnim(EnMa4* this, s32 animIndex) {
void func_80ABDD9C(EnMa4* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- s16 flag;
+ s16 trackingMode;
- if (this->unk_1D8.unk_00 == 0 &&
+ if ((this->interactInfo.talkState == NPC_TALK_STATE_IDLE) &&
((this->skelAnime.animation == &gRomaniRunAnim) || (this->skelAnime.animation == &gRomaniLookAroundAnim) ||
(this->skelAnime.animation == &gRomaniShootBowAnim))) {
- flag = 1;
+ trackingMode = NPC_TRACKING_NONE;
} else {
- flag = (this->type == MA4_TYPE_ALIENS_WON && this->actionFunc != EnMa4_DialogueHandler) ? 1 : 0;
+ trackingMode = ((this->type == MA4_TYPE_ALIENS_WON) && (this->actionFunc != EnMa4_DialogueHandler))
+ ? NPC_TRACKING_NONE
+ : NPC_TRACKING_PLAYER_AUTO_TURN;
}
- this->unk_1D8.unk_18 = player->actor.world.pos;
- this->unk_1D8.unk_18.y -= -10.0f;
- func_800BD888(&this->actor, &this->unk_1D8, 0, flag);
+ this->interactInfo.trackPos = player->actor.world.pos;
+ this->interactInfo.trackPos.y -= -10.0f;
+ Npc_TrackPoint(&this->actor, &this->interactInfo, 0, trackingMode);
}
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;
@@ -188,11 +190,11 @@ 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;
- this->unk_1D8.unk_00 = 0;
+ this->actor.targetMode = TARGET_MODE_0;
+ this->interactInfo.talkState = NPC_TALK_STATE_IDLE;
this->unk_334 = 0;
this->hasBow = true;
this->mouthTexIndex = 0;
@@ -200,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;
@@ -250,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++;
@@ -260,26 +262,26 @@ void EnMa4_RunInCircles(EnMa4* this, PlayState* play) {
sAnimIndex = 13;
}
} else {
- this->actor.speedXZ = 2.7f;
+ this->actor.speed = 2.7f;
EnMa4_ChangeAnim(this, 9);
sAnimIndex = 9;
}
}
- if (sAnimIndex == 13 && Animation_OnFrame(&this->skelAnime, 37.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_ROMANI_BOW_FLICK);
+ 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);
Math_SmoothStepToS(&this->actor.shape.rot.y, sp2E, 5, 0x3000, 0x100);
} else {
if ((D_80AC0254 == 0) && ((Rand_Next() % 4) == 0)) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
D_80AC0254 = 2;
EnMa4_ChangeAnim(this, 3);
sAnimIndex = 3;
@@ -289,18 +291,18 @@ 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)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_ROMANI_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_ROMANI_WALK);
}
}
}
@@ -309,14 +311,14 @@ void EnMa4_SetupWait(EnMa4* this) {
if ((this->state != MA4_STATE_AFTERHORSEBACKGAME) && (this->state != MA4_STATE_AFTERDESCRIBETHEMCS)) {
if (this->type != MA4_TYPE_ALIENS_WON) {
EnMa4_ChangeAnim(this, 9);
- this->actor.speedXZ = 2.7f;
+ this->actor.speed = 2.7f;
} else {
EnMa4_ChangeAnim(this, 15);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
} else {
EnMa4_ChangeAnim(this, 1);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
this->actor.gravity = -0.2f;
@@ -343,12 +345,12 @@ 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) {
if (!(player->stateFlags1 & PLAYER_STATE1_800000)) {
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
}
}
@@ -359,11 +361,11 @@ void EnMa4_HandlePlayerChoice(EnMa4* this, PlayState* play) {
switch (this->textId) {
case 0x3339:
if (play->msgCtx.choiceIndex == 0) {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
Message_StartTextbox(play, 0x333A, &this->actor);
this->textId = 0x333A;
} else {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
Message_StartTextbox(play, 0x333B, &this->actor);
this->textId = 0x333B;
}
@@ -371,28 +373,28 @@ void EnMa4_HandlePlayerChoice(EnMa4* this, PlayState* play) {
case 0x3341:
if (play->msgCtx.choiceIndex == 0) {
- func_8019F208();
- SET_WEEKEVENTREG(WEEKEVENTREG_21_20);
+ Audio_PlaySfx_MessageDecide();
+ SET_WEEKEVENTREG(WEEKEVENTREG_PROMISED_TO_HELP_WITH_THEM);
Message_StartTextbox(play, 0x3343, &this->actor);
this->textId = 0x3343;
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
EnMa4_SetFaceExpression(this, 0, 1);
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);
+ Audio_PlaySfx_MessageDecide();
+ SET_WEEKEVENTREG(WEEKEVENTREG_PROMISED_TO_HELP_WITH_THEM);
Message_StartTextbox(play, 0x3343, &this->actor);
this->textId = 0x3343;
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
EnMa4_SetFaceExpression(this, 0, 1);
Message_StartTextbox(play, 0x3342, &this->actor);
this->textId = 0x3342;
@@ -401,14 +403,14 @@ void EnMa4_HandlePlayerChoice(EnMa4* this, PlayState* play) {
case 0x3347:
if (play->msgCtx.choiceIndex == 0) {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
Message_StartTextbox(play, 0x3349, &this->actor);
this->textId = 0x3349;
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
Message_StartTextbox(play, 0x3348, &this->actor);
this->textId = 0x3348;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
}
break;
@@ -416,15 +418,15 @@ void EnMa4_HandlePlayerChoice(EnMa4* this, PlayState* play) {
if (play->msgCtx.choiceIndex == 0) { // Yes
s32 aux;
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
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();
+ Audio_PlaySfx_MessageCancel();
EnMa4_SetFaceExpression(this, 0, 0);
Message_StartTextbox(play, 0x334C, &this->actor);
this->textId = 0x334C;
@@ -433,54 +435,57 @@ void EnMa4_HandlePlayerChoice(EnMa4* this, PlayState* play) {
case 0x3354:
if (play->msgCtx.choiceIndex == 0) {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
Message_StartTextbox(play, 0x3349, &this->actor);
this->textId = 0x3349;
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
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;
case 0x3356:
// "Try again?"
if (play->msgCtx.choiceIndex == 0) { // Yes
- func_8019F208();
- func_801477B4(play);
+ Audio_PlaySfx_MessageDecide();
+ Message_CloseTextbox(play);
EnMa4_SetupBeginHorsebackGame(this);
} else { // No
if (this->type == MA4_TYPE_ALIENS_DEFEATED) {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
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();
+ Audio_PlaySfx_MessageCancel();
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;
case 0x3359:
if (play->msgCtx.choiceIndex == 0) {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
Message_StartTextbox(play, 0x3349, &this->actor);
this->textId = 0x3349;
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
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;
}
}
}
@@ -492,7 +497,7 @@ void EnMa4_ChooseNextDialogue(EnMa4* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
switch (this->textId) {
case 0x2390:
- func_801477B4(play);
+ Message_CloseTextbox(play);
EnMa4_SetupBeginHorsebackGame(this);
break;
@@ -500,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:
@@ -527,7 +532,7 @@ void EnMa4_ChooseNextDialogue(EnMa4* this, PlayState* play) {
break;
case 0x333E:
- func_801477B4(play);
+ Message_CloseTextbox(play);
EnMa4_SetupBeginDescribeThemCs(this);
break;
@@ -564,7 +569,7 @@ void EnMa4_ChooseNextDialogue(EnMa4* this, PlayState* play) {
break;
case 0x334A:
- func_801477B4(play);
+ Message_CloseTextbox(play);
EnMa4_SetupBeginHorsebackGame(this);
break;
@@ -595,7 +600,7 @@ void EnMa4_ChooseNextDialogue(EnMa4* this, PlayState* play) {
Message_StartTextbox(play, 0x334C, &this->actor);
this->textId = 0x334C;
} else {
- func_801477B4(play);
+ Message_CloseTextbox(play);
player->stateFlags1 |= PLAYER_STATE1_20;
EnMa4_SetupBeginEponasSongCs(this);
EnMa4_BeginEponasSongCs(this, play);
@@ -603,15 +608,18 @@ void EnMa4_ChooseNextDialogue(EnMa4* this, PlayState* play) {
break;
case 0x3358:
- if ((gSaveContext.save.playerForm != PLAYER_FORM_HUMAN) || !CHECK_QUEST_ITEM(QUEST_SONG_EPONA)) {
+ if ((GET_PLAYER_FORM != 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;
}
}
}
@@ -627,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;
@@ -640,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);
}
}
@@ -650,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) {
@@ -675,7 +683,7 @@ void EnMa4_HorsebackGameCheckPlayerInteractions(EnMa4* this, PlayState* play) {
Message_StartTextbox(play, 0x336E, &this->actor);
this->actionFunc = EnMa4_HorsebackGameTalking;
} else if (gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] < SECONDS_TO_TIMER(115)) {
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
}
@@ -728,8 +736,8 @@ void EnMa4_HorsebackGameWait(EnMa4* this, PlayState* play) {
void EnMa4_SetupHorsebackGameEnd(EnMa4* this, PlayState* play) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_08_01);
this->actionFunc = EnMa4_HorsebackGameEnd;
- Audio_QueueSeqCmd(NA_BGM_STOP);
- Audio_QueueSeqCmd(NA_BGM_HORSE_GOAL | 0x8000);
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0);
+ SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_HORSE_GOAL | SEQ_FLAG_ASYNC);
}
void EnMa4_HorsebackGameEnd(EnMa4* this, PlayState* play) {
@@ -778,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);
}
}
@@ -796,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);
@@ -816,20 +824,23 @@ 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 {
Player* player = GET_PLAYER(play);
player->stateFlags1 |= PLAYER_STATE1_20;
- func_800B85E0(&this->actor, play, 200.0f, PLAYER_IA_MINUS1);
- D_80AC0260 = 99;
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 200.0f, PLAYER_IA_MINUS1);
+ sCueId = 99;
this->hasBow = true;
EnMa4_SetupEndEponasSongCs(this);
}
@@ -843,14 +854,14 @@ 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;
this->actor.flags &= ~ACTOR_FLAG_10000;
EnMa4_SetupDialogueHandler(this);
} else {
- func_800B85E0(&this->actor, play, 200.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 200.0f, PLAYER_IA_MINUS1);
}
}
@@ -872,12 +883,12 @@ void EnMa4_StartDialogue(EnMa4* this, PlayState* play) {
switch (this->type) {
case MA4_TYPE_DAY1:
- if (gSaveContext.save.playerForm != PLAYER_FORM_HUMAN) {
+ if (GET_PLAYER_FORM != PLAYER_FORM_HUMAN) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_21_80)) {
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;
@@ -885,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 {
@@ -905,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 < HS_GET_HORSE_BACK_BALLOON_TIME()) {
// [Score] New record!
- gSaveContext.save.horseBackBalloonHighScore = time;
+ HS_SET_HORSE_BACK_BALLOON_TIME(time);
EnMa4_SetFaceExpression(this, 0, 3);
Message_StartTextbox(play, 0x3350, &this->actor);
this->textId = 0x3350;
@@ -928,12 +939,12 @@ void EnMa4_StartDialogue(EnMa4* this, PlayState* play) {
break;
case MA4_TYPE_ALIENS_DEFEATED:
- if (gSaveContext.save.playerForm != PLAYER_FORM_HUMAN) {
+ if (GET_PLAYER_FORM != PLAYER_FORM_HUMAN) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_21_80)) {
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;
@@ -949,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 < HS_GET_HORSE_BACK_BALLOON_TIME()) {
+ HS_SET_HORSE_BACK_BALLOON_TIME(time);
EnMa4_SetFaceExpression(this, 0, 3);
Message_StartTextbox(play, 0x3350, &this->actor);
this->textId = 0x3350;
@@ -976,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 < HS_GET_HORSE_BACK_BALLOON_TIME()) {
// New record
- gSaveContext.save.horseBackBalloonHighScore = time;
+ HS_SET_HORSE_BACK_BALLOON_TIME(time);
Message_StartTextbox(play, 0x335D, &this->actor);
this->textId = 0x335D;
} else {
@@ -1027,17 +1038,17 @@ void EnMa4_Update(Actor* thisx, PlayState* play) {
s32 EnMa4_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnMa4* this = THIS;
- Vec3s sp4;
+ Vec3s limbRot;
if (limbIndex == ROMANI_LIMB_HEAD) {
- sp4 = this->unk_1D8.unk_08;
- rot->x = rot->x + sp4.y;
- rot->z = rot->z + sp4.x;
+ limbRot = this->interactInfo.headRot;
+ rot->x += limbRot.y;
+ rot->z += limbRot.x;
}
if (limbIndex == ROMANI_LIMB_TORSO) {
- sp4 = this->unk_1D8.unk_0E;
- rot->x = rot->x - sp4.y;
- rot->z = rot->z - sp4.x;
+ limbRot = this->interactInfo.torsoRot;
+ rot->x -= limbRot.y;
+ rot->z -= limbRot.x;
}
return false;
@@ -1052,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);
}
}
@@ -1062,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 3ac405b00..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,18 +8,20 @@ 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;
/* 0x188 */ EnMa4ActionFunc actionFunc;
/* 0x18C */ ColliderCylinder collider;
- /* 0x1D8 */ struct_800BD888_arg1 unk_1D8;
+ /* 0x1D8 */ NpcInteractInfo interactInfo;
/* 0x200 */ Vec3s* pathPoints;
/* 0x204 */ Vec3s jointTable[ROMANI_LIMB_MAX];
/* 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 fb10d9311..72fcc61d6 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
@@ -7,7 +7,7 @@
#include "z_en_ma_yto.h"
#include "overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_100000 | ACTOR_FLAG_2000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_100000 | ACTOR_FLAG_2000000)
#define THIS ((EnMaYto*)thisx)
@@ -147,13 +147,13 @@ void EnMaYto_Init(Actor* thisx, PlayState* play) {
EnMaYto* this = THIS;
s32 pad;
- this->actor.targetMode = 0;
+ this->actor.targetMode = TARGET_MODE_0;
this->unk200 = 0;
this->unk310 = 0;
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);
@@ -267,7 +268,7 @@ void EnMaYto_ChooseAction(EnMaYto* this, PlayState* play) {
break;
case MA_YTO_TYPE_DINNER:
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
EnMaYto_SetupDinnerWait(this);
break;
@@ -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);
}
@@ -404,7 +405,7 @@ void EnMaYto_DefaultWait(EnMaYto* this, PlayState* play) {
EnMaYto_DefaultStartDialogue(this, play);
EnMaYto_SetupDefaultDialogueHandler(this);
} else if (ABS_ALT(direction) < 0x1555) {
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
}
@@ -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);
}
@@ -448,13 +449,13 @@ void EnMaYto_DefaultDialogueHandler(EnMaYto* this, PlayState* play) {
void EnMaYto_DefaultHandlePlayerChoice(EnMaYto* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
if (play->msgCtx.choiceIndex == 0) { // Yes
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
EnMaYto_SetFaceExpression(this, 0, 3);
// "Milk Road is fixed!"
Message_StartTextbox(play, 0x3392, &this->actor);
this->textId = 0x3392;
} else { // No
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
// "Don't lie!"
Message_StartTextbox(play, 0x3391, &this->actor);
this->textId = 0x3391;
@@ -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,19 +520,19 @@ 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);
} else if (ABS_ALT(direction) < 0x4000) {
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&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) {
- func_800B8614(child, play, 120.0f);
+ Actor_OfferTalk(child, play, 120.0f);
}
}
}
@@ -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);
@@ -573,13 +577,13 @@ void EnMaYto_DinnerDialogueHandler(EnMaYto* this, PlayState* play) {
void EnMaYto_DinnerHandlePlayerChoice(EnMaYto* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
if (play->msgCtx.choiceIndex == 0) { // Yes
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
EnMaYto_SetFaceExpression(this, 0, 3);
// "Milk Road is fixed!"
Message_StartTextbox(play, 0x3399, &this->actor);
this->textId = 0x3399;
} else { // No
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
// "Don't lie!"
Message_StartTextbox(play, 0x3398, &this->actor);
this->textId = 0x3398;
@@ -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,23 +718,23 @@ 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) {
- func_800B8614(&this->actor, play, 100.0f);
+ } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM) || (ABS_ALT(direction) < 0x2000)) {
+ Actor_OfferTalk(&this->actor, play, 100.0f);
child = this->actor.child;
if (child != NULL) {
- func_800B8614(child, play, 100.0f);
+ Actor_OfferTalk(child, play, 100.0f);
}
}
}
}
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,13 +908,13 @@ 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;
}
EnMaYto_SetupAfterMilkRunDialogueHandler(this);
} else {
- func_800B8614(&this->actor, play, 200.0f);
+ Actor_OfferTalk(&this->actor, play, 200.0f);
}
}
@@ -944,10 +951,13 @@ void EnMaYto_AfterMilkRunChooseNextDialogue(EnMaYto* this, PlayState* play) {
break;
case 0x33C2:
- func_801477B4(play);
+ Message_CloseTextbox(play);
EnMaYto_SetupPostMilkRunGiveReward(this);
EnMaYto_PostMilkRunGiveReward(this, play);
break;
+
+ default:
+ break;
}
}
}
@@ -960,10 +970,10 @@ void EnMaYto_PostMilkRunGiveReward(EnMaYto* this, PlayState* play) {
if (Actor_HasParent(&this->actor, play)) {
EnMaYto_SetupPostMilkRunExplainReward(this);
} else if (INV_CONTENT(ITEM_MASK_ROMANI) == ITEM_MASK_ROMANI) {
- Actor_PickUp(&this->actor, play, GI_RUPEE_HUGE, 500.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_RUPEE_HUGE, 500.0f, 100.0f);
this->unk310 = 2;
} else {
- Actor_PickUp(&this->actor, play, GI_MASK_ROMANI, 500.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_MASK_ROMANI, 500.0f, 100.0f);
this->unk310 = 1;
}
}
@@ -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,11 +1002,11 @@ 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 {
- func_800B85E0(&this->actor, play, 200.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 200.0f, PLAYER_IA_MINUS1);
}
}
@@ -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);
- func_801477B4(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_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) && (GET_PLAYER_FORM == 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) && (GET_PLAYER_FORM == 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);
@@ -1268,29 +1284,29 @@ void EnMaYto_ChangeAnim(EnMaYto* this, s32 animIndex) {
void func_80B90C78(EnMaYto* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- s16 flag;
+ s16 trackingMode;
SkelAnime_Update(&this->skelAnime);
- flag = this->unk31E == 2 ? true : false;
+ trackingMode = (this->unk31E == 2) ? NPC_TRACKING_NONE : NPC_TRACKING_PLAYER_AUTO_TURN;
if (this->unk31E == 0) {
- this->unk_1D8.unk_18 = player->actor.world.pos;
- this->unk_1D8.unk_14 = 0.0f;
+ this->interactInfo.trackPos = player->actor.world.pos;
+ this->interactInfo.yOffset = 0.0f;
} else if (this->unk31E == 1) {
- Math_Vec3f_StepTo(&this->unk_1D8.unk_18, &this->actor.child->world.pos, 8.0f);
- this->unk_1D8.unk_14 = 0.0f;
+ Math_Vec3f_StepTo(&this->interactInfo.trackPos, &this->actor.child->world.pos, 8.0f);
+ this->interactInfo.yOffset = 0.0f;
}
if (this->unk320 == 0) {
if (this->actionFunc == EnMaYto_WarmFuzzyFeelingCs) {
- this->unk_1D8.unk_08.y = 0;
- this->unk_1D8.unk_08.x = 0;
+ this->interactInfo.headRot.y = 0;
+ this->interactInfo.headRot.x = 0;
} else {
- func_800BD888(&this->actor, &this->unk_1D8, 0xD, flag);
+ Npc_TrackPoint(&this->actor, &this->interactInfo, 13, trackingMode);
}
} else {
- Math_SmoothStepToS(&this->unk_1D8.unk_08.y, 0, 3, 0x71C, 0xB6);
- Math_SmoothStepToS(&this->unk_1D8.unk_08.x, 0x18E3, 5, 0x71C, 0xB6);
+ Math_SmoothStepToS(&this->interactInfo.headRot.y, 0, 3, 0x71C, 0xB6);
+ Math_SmoothStepToS(&this->interactInfo.headRot.x, 0x18E3, 5, 0x71C, 0xB6);
}
EnMaYto_UpdateEyes(this);
@@ -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;
}
}
@@ -1423,26 +1448,26 @@ void EnMaYto_Update(Actor* thisx, PlayState* play) {
s32 EnMaYto_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnMaYto* this = THIS;
- Vec3s sp4;
+ Vec3s limbRot;
if (limbIndex == CREMIA_LIMB_HEAD) {
- sp4 = this->unk_1D8.unk_08;
+ limbRot = this->interactInfo.headRot;
- rot->x += sp4.y;
- rot->z += sp4.x;
+ rot->x += limbRot.y;
+ rot->z += limbRot.x;
} else if (limbIndex == CREMIA_LIMB_TORSO) {
- if (this->skelAnime.animation != &gCremiaSittingPetCowAnim &&
- this->skelAnime.animation != &gCremiaSittingLookDownAnim) {
- sp4 = this->unk_1D8.unk_0E;
+ if ((this->skelAnime.animation != &gCremiaSittingPetCowAnim) &&
+ (this->skelAnime.animation != &gCremiaSittingLookDownAnim)) {
+ limbRot = this->interactInfo.torsoRot;
- rot->x += sp4.y;
- if (this->skelAnime.animation == &gCremiaIdleAnim || this->skelAnime.animation == &gCremiaSittingAnim ||
- this->skelAnime.animation == &gCremiaSittingLookDownAnim) {
- rot->z += sp4.x;
+ rot->x += limbRot.y;
+ if ((this->skelAnime.animation == &gCremiaIdleAnim) || (this->skelAnime.animation == &gCremiaSittingAnim) ||
+ (this->skelAnime.animation == &gCremiaSittingLookDownAnim)) {
+ rot->z += limbRot.x;
}
}
}
- return 0;
+ return false;
}
void EnMaYto_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
@@ -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_Yto/z_en_ma_yto.h b/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.h
index 0955cd8e8..208e41270 100644
--- a/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.h
+++ b/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.h
@@ -13,7 +13,7 @@ typedef struct EnMaYto {
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ EnMaYtoActionFunc actionFunc;
/* 0x18C */ ColliderCylinder collider;
- /* 0x1D8 */ struct_800BD888_arg1 unk_1D8;
+ /* 0x1D8 */ NpcInteractInfo interactInfo;
/* 0x200 */ s32 unk200; // unused
/* 0x204 */ s32 type;
/* 0x208 */ Vec3s jointTable[CREMIA_LIMB_MAX];
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 64a6d138c..651f8115f 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
@@ -6,7 +6,7 @@
#include "z_en_ma_yts.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_100000 | ACTOR_FLAG_2000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_100000 | ACTOR_FLAG_2000000)
#define THIS ((EnMaYts*)thisx)
@@ -121,30 +121,30 @@ void EnMaYts_ChangeAnim(EnMaYts* this, s32 animIndex) {
void func_80B8D12C(EnMaYts* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- s16 flag = this->unk_32C == 2 ? true : false;
+ s16 trackingMode = (this->unk_32C == 2) ? NPC_TRACKING_NONE : NPC_TRACKING_PLAYER_AUTO_TURN;
- if (this->unk_32C == 0 || this->actor.parent == NULL) {
- this->unk_1D8.unk_18 = player->actor.world.pos;
- this->unk_1D8.unk_18.y -= -10.0f;
+ if ((this->unk_32C == 0) || (this->actor.parent == NULL)) {
+ this->interactInfo.trackPos = player->actor.world.pos;
+ this->interactInfo.trackPos.y -= -10.0f;
} else {
- Math_Vec3f_StepTo(&this->unk_1D8.unk_18, &this->actor.parent->world.pos, 8.0f);
- this->unk_1D8.unk_18.y -= -10.0f;
+ Math_Vec3f_StepTo(&this->interactInfo.trackPos, &this->actor.parent->world.pos, 8.0f);
+ this->interactInfo.trackPos.y -= -10.0f;
}
- func_800BD888(&this->actor, &this->unk_1D8, 0, flag);
+ Npc_TrackPoint(&this->actor, &this->interactInfo, 0, trackingMode);
}
void EnMaYts_InitAnimation(EnMaYts* this, PlayState* play) {
switch (this->type) {
case MA_YTS_TYPE_BARN:
- this->actor.targetMode = 0;
+ this->actor.targetMode = TARGET_MODE_0;
EnMaYts_ChangeAnim(this, 0);
break;
case MA_YTS_TYPE_SITTING:
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_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);
@@ -152,13 +152,13 @@ void EnMaYts_InitAnimation(EnMaYts* this, PlayState* play) {
break;
case MA_YTS_TYPE_SLEEPING:
- this->actor.targetMode = 0;
+ this->actor.targetMode = TARGET_MODE_0;
this->actor.draw = EnMaYts_DrawSleeping;
EnMaYts_ChangeAnim(this, 0);
break;
case MA_YTS_TYPE_ENDCREDITS:
- this->actor.targetMode = 0;
+ this->actor.targetMode = TARGET_MODE_0;
EnMaYts_ChangeAnim(this, 0);
break;
@@ -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,10 +241,10 @@ 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->unk_1D8.unk_00 = 0;
+ this->interactInfo.talkState = NPC_TALK_STATE_IDLE;
this->unk_200 = 0;
this->blinkTimer = 0;
@@ -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);
@@ -295,7 +302,7 @@ void EnMaYts_StartDialogue(EnMaYts* this, PlayState* play) {
s16 sp26 = this->actor.shape.rot.y - this->actor.yawTowardsPlayer;
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- if (!(gSaveContext.save.playerForm == PLAYER_FORM_HUMAN)) {
+ if (GET_PLAYER_FORM != PLAYER_FORM_HUMAN) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_65_80)) {
// Saying to non-human Link: "Cremia went to town."
SET_WEEKEVENTREG(WEEKEVENTREG_65_80);
@@ -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,12 +344,12 @@ 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);
} else if (ABS_ALT(sp26) < 0x4000) {
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
}
}
@@ -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:
@@ -501,18 +511,18 @@ void EnMaYts_Update(Actor* thisx, PlayState* play) {
s32 EnMaYts_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnMaYts* this = THIS;
- Vec3s sp4;
+ Vec3s limbRot;
if (limbIndex == ROMANI_LIMB_HEAD) {
- sp4 = this->unk_1D8.unk_08;
- rot->x += sp4.y;
+ limbRot = this->interactInfo.headRot;
+ rot->x += limbRot.y;
if ((this->skelAnime.animation == &gRomaniIdleAnim) || (this->skelAnime.animation == &gRomaniSittingAnim)) {
- rot->z += sp4.x;
+ rot->z += limbRot.x;
}
} else if (limbIndex == ROMANI_LIMB_TORSO) {
- sp4 = this->unk_1D8.unk_0E;
- rot->x += sp4.y;
- rot->z += sp4.x;
+ limbRot = this->interactInfo.torsoRot;
+ rot->x += limbRot.y;
+ rot->z += limbRot.x;
}
return false;
@@ -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_Ma_Yts/z_en_ma_yts.h b/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.h
index eb700d8c2..65e7a0eb6 100644
--- a/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.h
+++ b/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.h
@@ -13,7 +13,7 @@ typedef struct EnMaYts {
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ EnMaYtsActionFunc actionFunc;
/* 0x18C */ ColliderCylinder collider;
- /* 0x1D8 */ struct_800BD888_arg1 unk_1D8;
+ /* 0x1D8 */ NpcInteractInfo interactInfo;
/* 0x200 */ s32 unk_200; // Set, but not used
/* 0x204 */ Vec3s jointTable[ROMANI_LIMB_MAX];
/* 0x28E */ UNK_TYPE1 unk_28E[0x6];
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 4a8ce8731..856c13c0d 100644
--- a/src/overlays/actors/ovl_En_Mag/z_en_mag.c
+++ b/src/overlays/actors/ovl_En_Mag/z_en_mag.c
@@ -239,8 +239,8 @@ 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)) {
- play_sound(NA_SE_SY_PIECE_OF_HEART);
+ if (!CutsceneFlags_Get(play, 4)) {
+ Audio_PlaySfx(NA_SE_SY_PIECE_OF_HEART);
this->state = MAG_STATE_CALLED;
this->unk11F00 = 0;
this->unk11F02 = 30;
@@ -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 = 2; // Go to FileChoose
+ Audio_PlaySfx(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;
@@ -430,7 +430,7 @@ void EnMag_Update(Actor* thisx, PlayState* play) {
if (CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_START) ||
CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A) ||
CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_B)) {
- play_sound(NA_SE_SY_PIECE_OF_HEART);
+ Audio_PlaySfx(NA_SE_SY_PIECE_OF_HEART);
this->state = MAG_STATE_CALLED;
}
}
@@ -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);
@@ -707,9 +707,9 @@ void EnMag_DrawInner(Actor* thisx, PlayState* play, Gfx** gfxp) {
s16 step;
// 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);
+ gSPSegment(gfx++, 0x06, play->objectCtx.slots[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 65e3d8b38..f19dbae14 100644
--- a/src/overlays/actors/ovl_En_Maruta/z_en_maruta.c
+++ b/src/overlays/actors/ovl_En_Maruta/z_en_maruta.c
@@ -8,7 +8,7 @@
#include "overlays/actors/ovl_En_Kendo_Js/z_en_kendo_js.h"
#include "objects/object_maruta/object_maruta.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_10)
#define THIS ((EnMaruta*)thisx)
@@ -214,7 +214,7 @@ void EnMaruta_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 0.1f);
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
this->actor.focus.pos = this->actor.world.pos;
this->actor.focus.pos.y += 50.0f;
@@ -285,7 +285,7 @@ void func_80B372CC(EnMaruta* this, PlayState* play) {
if ((this->actor.parent != NULL) && (this->actor.parent->id == ACTOR_EN_KENDO_JS)) {
EnKendoJs* kendoJs = (EnKendoJs*)this->actor.parent;
- kendoJs->unk_292 = this->actor.isTargeted;
+ kendoJs->unk_292 = this->actor.isLockedOn;
}
}
@@ -322,7 +322,7 @@ void func_80B37428(EnMaruta* this, PlayState* play) {
}
void func_80B374B8(EnMaruta* this) {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
if (this->actionFunc != func_80B37428) {
this->unk_21E = 0;
this->actor.gravity = -2.0f;
@@ -422,7 +422,7 @@ void func_80B37590(EnMaruta* this, PlayState* play) {
this->unk_21A |= 0xFF;
}
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actionFunc = func_80B37950;
}
@@ -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;
@@ -525,7 +525,7 @@ void func_80B37CA0(EnMaruta* this, PlayState* play) {
((this->actionFunc == func_80B37428) && !(this->actor.world.pos.y < (this->actor.floorHeight - 20.0f)))) {
if ((this->collider.base.acFlags & AC_HIT) && (this->actionFunc == func_80B372CC)) {
this->collider.base.acFlags &= ~AC_HIT;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_SWORD_STRIKE);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_SWORD_STRIKE);
if (D_80B386CC[player->meleeWeaponAnimation] != 0) {
s32 temp = D_80B386CC[player->meleeWeaponAnimation] + 1;
@@ -587,7 +587,7 @@ void func_80B37EC0(EnMaruta* this, PlayState* play) {
if (this->actor.velocity.y < -this->actor.gravity) {
func_80B382E4(play, sp34);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_LOG_BOUND);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_LOG_BOUND);
this->actor.velocity.y *= -0.6f;
func_80B38060(this, &sp34);
}
@@ -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_Minideath/z_en_minideath.c b/src/overlays/actors/ovl_En_Minideath/z_en_minideath.c
index d47992114..f4e66b7b4 100644
--- a/src/overlays/actors/ovl_En_Minideath/z_en_minideath.c
+++ b/src/overlays/actors/ovl_En_Minideath/z_en_minideath.c
@@ -6,7 +6,7 @@
#include "z_en_minideath.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnMinideath*)thisx)
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 f459a6a41..8495411d5 100644
--- a/src/overlays/actors/ovl_En_Minifrog/z_en_minifrog.c
+++ b/src/overlays/actors/ovl_En_Minifrog/z_en_minifrog.c
@@ -5,10 +5,9 @@
*/
#include "z_en_minifrog.h"
-#include "objects/object_fr/object_fr.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnMinifrog*)thisx)
@@ -60,17 +59,20 @@ static ColliderCylinderInit sCylinderInit = {
static CollisionCheckInfoInit sColChkInfoInit = { 1, 12, 14, MASS_IMMOVABLE };
-// sEyeTextures???
-static TexturePtr D_808A4D74[] = {
- object_fr_Tex_0059A0,
- object_fr_Tex_005BA0,
+static TexturePtr sEyeTextures[] = {
+ gFrogIrisOpenTex,
+ gFrogIrisClosedTex,
};
-static u16 isFrogReturnedFlags[] = {
- 0, WEEKEVENTREG_32_40, WEEKEVENTREG_32_80, WEEKEVENTREG_33_01, WEEKEVENTREG_33_02,
+static u16 sIsFrogReturnedFlags[] = {
+ 0, // FROG_YELLOW
+ WEEKEVENTREG_32_40, // FROG_CYAN
+ WEEKEVENTREG_32_80, // FROG_PINK
+ WEEKEVENTREG_33_01, // FROG_BLUE
+ WEEKEVENTREG_33_02, // FROG_WHITE
};
-static s32 isInitialized = false;
+static s32 sIsInitialized = false;
static InitChainEntry sInitChain[] = {
ICHAIN_F32_DIV1000(gravity, -800, ICHAIN_STOP),
@@ -82,43 +84,43 @@ void EnMinifrog_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->actor, sInitChain);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 15.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_fr_Skel_00B538, &object_fr_Anim_001534, this->jointTable,
- this->morphTable, 24);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gFrogSkel, &gFrogIdleAnim, this->jointTable, this->morphTable,
+ FROG_LIMB_MAX);
CollisionCheck_SetInfo(&this->actor.colChkInfo, NULL, &sColChkInfoInit);
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
- if (!isInitialized) {
- for (i = 0; i < ARRAY_COUNT(D_808A4D74); i++) {
- D_808A4D74[i] = Lib_SegmentedToVirtual(D_808A4D74[i]);
+ if (!sIsInitialized) {
+ for (i = 0; i < ARRAY_COUNT(sEyeTextures); i++) {
+ sEyeTextures[i] = Lib_SegmentedToVirtual(sEyeTextures[i]);
}
- isInitialized = true;
+ sIsInitialized = true;
}
this->frogIndex = (this->actor.params & 0xF);
if (this->frogIndex >= 5) {
- this->frogIndex = MINIFROG_YELLOW;
+ this->frogIndex = FROG_YELLOW;
}
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = EnMinifrog_Idle;
- this->jumpState = MINIFROG_STATE_GROUND;
+ this->jumpState = FROG_STATE_GROUND;
this->flags = 0;
this->timer = 0;
if (1) {}
- if (!EN_MINIFROG_IS_RETURNED(&this->actor)) {
- if ((this->frogIndex == MINIFROG_YELLOW) || CHECK_WEEKEVENTREG(isFrogReturnedFlags[this->frogIndex])) {
+ if (!EN_FROG_IS_RETURNED(&this->actor)) {
+ if ((this->frogIndex == FROG_YELLOW) || CHECK_WEEKEVENTREG(sIsFrogReturnedFlags[this->frogIndex])) {
Actor_Kill(&this->actor);
return;
}
this->timer = 30;
this->actionFunc = EnMinifrog_SpawnGrowAndShrink;
- this->actor.textId = 0xD81; // "Ah! Don Gero! It has been so long."
+ this->actor.textId = 0xD81;
this->actor.colChkInfo.mass = 30;
} else { // Frogs in mountain village
- if (this->frogIndex == MINIFROG_YELLOW) {
+ if (this->frogIndex == FROG_YELLOW) {
this->actor.textId = 0;
this->actionFunc = EnMinifrog_SetupYellowFrogDialog;
@@ -130,10 +132,10 @@ void EnMinifrog_Init(Actor* thisx, PlayState* play) {
this->frog = NULL;
} else {
this->frog = EnMinifrog_GetFrog(play);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
// Frog has been returned
- if (CHECK_WEEKEVENTREG(isFrogReturnedFlags[this->frogIndex])) {
+ if (CHECK_WEEKEVENTREG(sIsFrogReturnedFlags[this->frogIndex])) {
this->actionFunc = EnMinifrog_SetupNextFrogInit;
} else {
this->actor.draw = NULL;
@@ -167,9 +169,9 @@ EnMinifrog* EnMinifrog_GetFrog(PlayState* play) {
}
void EnMinifrog_SetJumpState(EnMinifrog* this) {
- if (this->jumpState == MINIFROG_STATE_GROUND) {
- this->jumpState = MINIFROG_STATE_JUMP;
- Animation_Change(&this->skelAnime, &object_fr_Anim_0007BC, 1.0f, 0.0f, 7.0f, ANIMMODE_ONCE, -5.0f);
+ if (this->jumpState == FROG_STATE_GROUND) {
+ this->jumpState = FROG_STATE_JUMP;
+ Animation_Change(&this->skelAnime, &gFrogJumpAnim, 1.0f, 0.0f, 7.0f, ANIMMODE_ONCE, -5.0f);
}
}
@@ -185,21 +187,25 @@ void EnMinifrog_JumpTimer(EnMinifrog* this) {
void EnMinifrog_Jump(EnMinifrog* this) {
SkelAnime_Update(&this->skelAnime);
switch (this->jumpState) {
- case MINIFROG_STATE_JUMP:
+ case FROG_STATE_JUMP:
if (Animation_OnFrame(&this->skelAnime, 4.0f)) {
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
this->actor.velocity.y = 6.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_FROG_JUMP);
- this->jumpState = MINIFROG_STATE_AIR;
+ Actor_PlaySfx(&this->actor, NA_SE_EV_FROG_JUMP);
+ this->jumpState = FROG_STATE_AIR;
}
break;
- case MINIFROG_STATE_AIR:
- if (this->actor.bgCheckFlags & 1) {
- this->jumpState = MINIFROG_STATE_GROUND;
- Animation_MorphToLoop(&this->skelAnime, &object_fr_Anim_001534, -2.5f);
+
+ case FROG_STATE_AIR:
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->jumpState = FROG_STATE_GROUND;
+ Animation_MorphToLoop(&this->skelAnime, &gFrogIdleAnim, -2.5f);
SkelAnime_Update(&this->skelAnime);
}
break;
+
+ default:
+ break;
}
}
@@ -219,7 +225,7 @@ static Color_RGBA8 sEnvColor = { 80, 80, 80, 255 };
void EnMinifrog_SpawnDust(EnMinifrog* this, PlayState* play) {
Vec3f pos;
Vec3f vec5;
- Vec3f vel;
+ Vec3f velocity;
Vec3f accel;
s16 yaw;
s16 pitch;
@@ -233,16 +239,16 @@ 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);
- accel.x = -vel.x * 0.1f;
- accel.y = -vel.y * 0.1f;
- accel.z = -vel.z * 0.1f;
- pos.x = vec5.x + vel.x;
- pos.y = vec5.y + vel.y;
- pos.z = vec5.z + vel.z;
- func_800B0F80(play, &pos, &vel, &accel, &sPrimColor, &sEnvColor, 300, 30, 10);
+ velocity.x = Rand_CenteredFloat(4.0f);
+ velocity.y = Rand_CenteredFloat(4.0f);
+ velocity.z = Rand_CenteredFloat(4.0f);
+ accel.x = -velocity.x * 0.1f;
+ accel.y = -velocity.y * 0.1f;
+ accel.z = -velocity.z * 0.1f;
+ pos.x = vec5.x + velocity.x;
+ pos.y = vec5.y + velocity.y;
+ pos.z = vec5.z + velocity.z;
+ func_800B0F80(play, &pos, &velocity, &accel, &sPrimColor, &sEnvColor, 300, 30, 10);
}
}
@@ -254,32 +260,32 @@ void EnMinifrog_ReturnFrogCutscene(EnMinifrog* this, PlayState* play) {
EnMinifrog_SetJumpState(this);
switch (play->msgCtx.currentTextId) {
- case 0xD81: // "Ah! Don Gero! It has been so long."
- case 0xD83: // "Could it be... Has spring finally come to the mountains?"
- case 0xD84: // "That look...It is true! Winter was so long that I began to lose all hope."
- case 0xD86: // "Could it be... You came all this way looking for me?"
- case 0xD87: // "Ah! You need not say a thing. Upon seeing that face, I understand!" ...
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ case 0xD81:
+ case 0xD83:
+ case 0xD84:
+ case 0xD86:
+ case 0xD87:
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
- case 0xD82: // "What has brought you all this way?"
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_33_80)) {
- func_80151938(play, 0xD83); // "Could it be... Has spring finally come to the mountains?"
+ case 0xD82:
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE)) {
+ Message_ContinueTextbox(play, 0xD83);
} else {
- func_80151938(play, 0xD86); // "Could it be... You came all this way looking for me?"
+ Message_ContinueTextbox(play, 0xD86);
}
- SET_WEEKEVENTREG(isFrogReturnedFlags[this->frogIndex]);
+ SET_WEEKEVENTREG(sIsFrogReturnedFlags[this->frogIndex]);
break;
- case 0xD85: // "I understand. I shall head for the mountains immediately."
+ case 0xD85:
default:
- func_801477B4(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 +295,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,12 +325,12 @@ 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) &&
(Player_GetMask(play) == PLAYER_MASK_DON_GERO)) {
- func_800B8614(&this->actor, play, 110.0f);
+ Actor_OfferTalk(&this->actor, play, 110.0f);
}
}
@@ -338,7 +344,7 @@ void EnMinifrog_SetupNextFrogInit(EnMinifrog* this, PlayState* play) {
missingFrog = nextFrog->frog;
if (nextFrog->frog != NULL) {
this->actor.home.rot.y =
- (s16)Actor_YawBetweenActors(&this->actor, &missingFrog->actor); // Set home to missing frog
+ (s16)Actor_WorldYawTowardActor(&this->actor, &missingFrog->actor); // Set home to missing frog
EnMinifrog_TurnToMissingFrog(this);
} else {
EnMinifrog_TurnToPlayer(this);
@@ -354,10 +360,9 @@ void EnMinifrog_SetupNextFrogInit(EnMinifrog* this, PlayState* play) {
void EnMinifrog_CheckChoirSuccess(EnMinifrog* this, PlayState* play) {
this->actionFunc = EnMinifrog_YellowFrogDialog;
if (this->frog != NULL) {
- func_80151938(play, 0xD78); // "Unfortunately, it seems not all of our members have gathered."
+ Message_ContinueTextbox(play, 0xD78);
} else {
- func_80151938(play,
- 0xD7C); // "The conducting was spectacular. And all of our members rose to the occasion!"
+ Message_ContinueTextbox(play, 0xD7C);
}
EnMinifrog_SetJumpState(this);
@@ -367,20 +372,25 @@ 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);
- 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);
- return; // necessary to match
- } else {
- ActorCutscene_SetIntentToPlay(0x7C);
+ return;
}
+
+ if (CutsceneManager_IsNext(CS_ID_GLOBAL_TALK)) {
+ CutsceneManager_Start(CS_ID_GLOBAL_TALK, NULL);
+ EnMinifrog_CheckChoirSuccess(this, play);
+ return;
+ }
+
+ if ((this->actor.csId != CS_ID_NONE) && (CutsceneManager_GetCurrentCsId() == this->actor.csId)) {
+ CutsceneManager_Stop(this->actor.csId);
+ CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
+ return;
+ }
+
+ CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
}
void EnMinifrog_NextFrogMissing(EnMinifrog* this, PlayState* play) {
@@ -399,9 +409,9 @@ void EnMinifrog_NextFrogReturned(EnMinifrog* this, PlayState* play) {
this->timer--;
} else {
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);
+ this->flags &= ~((0x2 << FROG_YELLOW) | (0x2 << FROG_CYAN) | (0x2 << FROG_PINK) | (0x2 << FROG_BLUE) |
+ (0x2 << FROG_WHITE));
+ play->setPlayerTalkAnim(play, &gPlayerAnim_link_normal_talk_free_wait, ANIMMODE_LOOP);
}
}
@@ -410,11 +420,11 @@ void EnMinifrog_SetupNextFrogChoir(EnMinifrog* this, PlayState* play) {
EnMinifrog_Jump(this);
frogIndex = func_801A39F8();
- if (frogIndex != MINIFROG_INVALID) {
- if (frogIndex == MINIFROG_YELLOW) {
+ if (frogIndex != FROG_NONE) {
+ if (frogIndex == FROG_YELLOW) {
EnMinifrog_SetJumpState(this);
} else {
- this->actor.home.rot.z = frogIndex; // This is strange to store the frog index in home z rotation
+ this->actor.home.rot.z = frogIndex;
}
if (!(this->flags & (0x2 << frogIndex))) {
@@ -427,12 +437,12 @@ void EnMinifrog_SetupNextFrogChoir(EnMinifrog* this, PlayState* play) {
this->actor.home.rot.z = 0;
this->actionFunc = EnMinifrog_NextFrogMissing;
this->timer = 60;
- this->actor.home.rot.y = Actor_YawBetweenActors(&this->actor, &this->frog->actor);
+ this->actor.home.rot.y = Actor_WorldYawTowardActor(&this->actor, &this->frog->actor);
func_801A1F88();
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);
+ this->flags &=
+ ~(0x2 << FROG_YELLOW | 0x2 << FROG_CYAN | 0x2 << FROG_PINK | 0x2 << FROG_BLUE | 0x2 << FROG_WHITE);
+ play->setPlayerTalkAnim(play, &gPlayerAnim_link_normal_talk_free_wait, ANIMMODE_LOOP);
} else if (this->timer <= 0) {
this->actionFunc = EnMinifrog_NextFrogReturned;
this->timer = 30;
@@ -441,20 +451,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);
}
}
@@ -462,10 +472,10 @@ void EnMinifrog_EndChoir(EnMinifrog* this, PlayState* play) {
EnMinifrog_TurnToPlayer(this);
EnMinifrog_Jump(this);
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- Message_StartTextbox(play, 0xD7E, &this->actor); // "Let us do it again sometime."
+ Message_StartTextbox(play, 0xD7E, &this->actor);
this->actionFunc = EnMinifrog_YellowFrogDialog;
} else {
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
}
}
@@ -476,9 +486,9 @@ void EnMinifrog_GetFrogHP(EnMinifrog* this, PlayState* play) {
this->actor.parent = NULL;
this->actionFunc = EnMinifrog_EndChoir;
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_NONE);
+ Actor_OfferTalkExchange(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_NONE);
} else {
- Actor_PickUp(&this->actor, play, GI_HEART_PIECE, 10000.0f, 50.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_HEART_PIECE, 10000.0f, 50.0f);
}
}
@@ -490,13 +500,17 @@ void EnMinifrog_YellowFrogDialog(EnMinifrog* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
switch (play->msgCtx.choiceIndex) {
case 0: // Yes
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
this->actionFunc = EnMinifrog_BeginChoirCutscene;
play->msgCtx.msgLength = 0;
break;
+
case 1: // No
- func_8019F230();
- func_80151938(play, 0xD7E); // "Let us do it again sometime."
+ Audio_PlaySfx_MessageCancel();
+ Message_ContinueTextbox(play, 0xD7E);
+ break;
+
+ default:
break;
}
}
@@ -506,46 +520,52 @@ void EnMinifrog_YellowFrogDialog(EnMinifrog* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
EnMinifrog_SetJumpState(this);
switch (play->msgCtx.currentTextId) {
- case 0xD76: // "I have been waiting for you, Don Gero. Forgive me if I'm mistaken, but it looks like
- // you've lost a little weight..."
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ case 0xD76:
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
this->actor.flags &= ~ACTOR_FLAG_10000;
SET_WEEKEVENTREG(WEEKEVENTREG_34_01);
break;
- case 0xD78: // "Unfortunately, it seems not all of our members have gathered."
- case 0xD79: // "Perhaps it is because winter was too long? They must not have realized that spring
- // has come to the mountains..."
- case 0xD7A: // "And when the great Don Gero has come for us, too...What a pity."
- case 0xD7F: // "Well, if it isn't the great Don Gero."
- func_80151938(play, play->msgCtx.currentTextId + 1);
+
+ case 0xD78:
+ case 0xD79:
+ case 0xD7A:
+ case 0xD7F:
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
- case 0xD77: // "Let us begin our chorus"
+
+ case 0xD77:
this->actionFunc = EnMinifrog_BeginChoirCutscene;
play->msgCtx.msgLength = 0;
break;
- case 0xD7C: // "The conducting was spectacular. And all of our members rose to the occasion!"
+
+ case 0xD7C:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_35_80)) { // Obtained Heart Piece
- func_80151938(play, 0xD7E);
+ Message_ContinueTextbox(play, 0xD7E);
} else {
- func_80151938(play, 0xD7D); // Get Heart Piece
+ Message_ContinueTextbox(play, 0xD7D); // Get Heart Piece
SET_WEEKEVENTREG(WEEKEVENTREG_35_80);
}
break;
- case 0xD7D: // "This is how deeply we were moved by your spectacular conducting..."
- func_801477B4(play);
+
+ case 0xD7D:
+ Message_CloseTextbox(play);
this->actionFunc = EnMinifrog_GetFrogHP;
EnMinifrog_GetFrogHP(this, play);
break;
- case 0xD7B: // "Where in the world could the other members be, and what could they be doing?"
- case 0xD7E: // "Let us do it again sometime."
+
+ case 0xD7B:
+ case 0xD7E:
default:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = EnMinifrog_SetupYellowFrogDialog;
this->actor.flags &= ~ACTOR_FLAG_10000;
break;
}
}
break;
+
+ default:
+ break;
}
}
@@ -558,17 +578,15 @@ void EnMinifrog_SetupYellowFrogDialog(EnMinifrog* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actionFunc = EnMinifrog_YellowFrogDialog;
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_34_01)) {
- Message_StartTextbox(play, 0xD76,
- &this->actor); // "I have been waiting for you, Don Gero. Forgive me if I'm mistaken,
- // but it looks like you've lost a little weight..."
+ Message_StartTextbox(play, 0xD76, &this->actor);
} else {
- Message_StartTextbox(play, 0xD7F, &this->actor); // "Well, if it isn't the great Don Gero."
+ Message_StartTextbox(play, 0xD7F, &this->actor);
}
} else if ((this->actor.xzDistToPlayer < 150.0f) &&
(Player_IsFacingActor(&this->actor, 0x3000, play) ||
CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_10000)) &&
Player_GetMask(play) == PLAYER_MASK_DON_GERO) {
- func_800B8614(&this->actor, play, 160.0f);
+ Actor_OfferTalk(&this->actor, play, 160.0f);
}
}
@@ -578,7 +596,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;
@@ -595,11 +615,11 @@ void EnMinifrog_UpdateMissingFrog(Actor* thisx, PlayState* play) {
}
s32 EnMinifrog_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
- if (limbIndex == 1) {
+ if (limbIndex == FROG_LIMB_LOWER_BODY) {
pos->z -= 500.0f;
}
- if ((limbIndex == 7) || (limbIndex == 8)) {
+ if ((limbIndex == FROG_LIMB_RIGHT_EYE) || (limbIndex == FROG_LIMB_LEFT_EYE)) {
*dList = NULL;
}
@@ -609,21 +629,27 @@ s32 EnMinifrog_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
void EnMinifrog_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnMinifrog* this = THIS;
- if ((limbIndex == 7) || (limbIndex == 8)) {
+ if ((limbIndex == FROG_LIMB_RIGHT_EYE) || (limbIndex == FROG_LIMB_LEFT_EYE)) {
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);
}
- if (limbIndex == 4) {
+ if (limbIndex == FROG_LIMB_HEAD) {
Matrix_MultZero(&this->actor.focus.pos);
}
}
-static Color_RGBA8 sEnMinifrogColor[] = {
- { 200, 170, 0, 255 }, { 0, 170, 200, 255 }, { 210, 120, 100, 255 }, { 120, 130, 230, 255 }, { 190, 190, 190, 255 },
+static Color_RGBA8 sFrogEnvColors[] = {
+ { 200, 170, 0, 255 }, // FROG_YELLOW
+ { 0, 170, 200, 255 }, // FROG_CYAN
+ { 210, 120, 100, 255 }, // FROG_PINK
+ { 120, 130, 230, 255 }, // FROG_BLUE
+ { 190, 190, 190, 255 }, // FROG_WHITE
};
void EnMinifrog_Draw(Actor* thisx, PlayState* play) {
@@ -631,12 +657,14 @@ void EnMinifrog_Draw(Actor* thisx, PlayState* play) {
Color_RGBA8* envColor;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- envColor = &sEnMinifrogColor[this->frogIndex];
- gSPSegment(POLY_OPA_DISP++, 0x08, D_808A4D74[0]);
- gSPSegment(POLY_OPA_DISP++, 0x09, D_808A4D74[0]);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ envColor = &sFrogEnvColors[this->frogIndex];
+ gSPSegment(POLY_OPA_DISP++, 0x08, sEyeTextures[0]);
+ gSPSegment(POLY_OPA_DISP++, 0x09, sEyeTextures[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..a2752c830 100644
--- a/src/overlays/actors/ovl_En_Minifrog/z_en_minifrog.h
+++ b/src/overlays/actors/ovl_En_Minifrog/z_en_minifrog.h
@@ -2,33 +2,34 @@
#define Z_EN_MINIFROG_H
#include "global.h"
+#include "objects/object_fr/object_fr.h"
struct EnMinifrog;
typedef void (*EnMinifrogActionFunc)(struct EnMinifrog*, PlayState*);
-#define EN_MINIFROG_IS_RETURNED(thisx) ((((thisx)->params) & 0xF0) >> 4)
+#define EN_FROG_IS_RETURNED(thisx) ((((thisx)->params) & 0xF0) >> 4)
typedef enum {
- /* 0x00 */ MINIFROG_YELLOW, // Mountain Village
- /* 0x01 */ MINIFROG_CYAN, // Woodfall Temple
- /* 0x02 */ MINIFROG_PINK, // Great Bay Temple
- /* 0x03 */ MINIFROG_BLUE, // Southern Swamp
- /* 0x04 */ MINIFROG_WHITE, // Laundry Pool
- /* 0xFF */ MINIFROG_INVALID = 0xFF // -1
-} MinifrogType;
+ /* 0x00 */ FROG_YELLOW, // Mountain Village
+ /* 0x01 */ FROG_CYAN, // Woodfall Temple
+ /* 0x02 */ FROG_PINK, // Great Bay Temple
+ /* 0x03 */ FROG_BLUE, // Southern Swamp
+ /* 0x04 */ FROG_WHITE, // Laundry Pool
+ /* 0xFF */ FROG_NONE = 0xFF // -1
+} FrogType;
typedef enum {
- /* 0x00 */ MINIFROG_STATE_JUMP,
- /* 0x01 */ MINIFROG_STATE_AIR,
- /* 0x02 */ MINIFROG_STATE_GROUND
-} MinifrogJumpState;
+ /* 0 */ FROG_STATE_JUMP,
+ /* 1 */ FROG_STATE_AIR,
+ /* 2 */ FROG_STATE_GROUND
+} FrogJumpState;
typedef struct EnMinifrog {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[24];
- /* 0x218 */ Vec3s morphTable[24];
+ /* 0x188 */ Vec3s jointTable[FROG_LIMB_MAX];
+ /* 0x218 */ Vec3s morphTable[FROG_LIMB_MAX];
/* 0x2A8 */ EnMinifrogActionFunc actionFunc;
/* 0x2AC */ struct EnMinifrog* frog;
/* 0x2B0 */ s16 frogIndex;
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 1ab5f2cc6..0f44becad 100644
--- a/src/overlays/actors/ovl_En_Minislime/z_en_minislime.c
+++ b/src/overlays/actors/ovl_En_Minislime/z_en_minislime.c
@@ -7,7 +7,7 @@
#include "z_en_minislime.h"
#include "overlays/actors/ovl_En_Bigslime/z_en_bigslime.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_200)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_200)
#define THIS ((EnMinislime*)thisx)
@@ -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 = {
@@ -121,7 +121,7 @@ static DamageTable sDamageTable = {
void EnMinislime_Init(Actor* thisx, PlayState* play) {
EnMinislime* this = THIS;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
this->id = this->actor.params;
@@ -140,54 +140,54 @@ void EnMinislime_CheckBackgroundCollision(EnMinislime* this) {
f32 scaleY = this->actor.scale.y * 400.0f;
f32 scaleZ = this->actor.scale.z * 400.0f;
- this->actor.bgCheckFlags &= ~(0x10 | 0x8 | 0x2);
+ this->actor.bgCheckFlags &= ~(BGCHECKFLAG_GROUND_TOUCH | BGCHECKFLAG_WALL | BGCHECKFLAG_CEILING);
if ((this->actor.world.pos.y + scaleY) > GBT_ROOM_5_MAX_Y) {
- this->actor.bgCheckFlags |= 0x10;
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_CEILING;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
this->actor.world.pos.y = GBT_ROOM_5_MAX_Y - scaleY;
} else if ((this->actor.world.pos.y - scaleY) < GBT_ROOM_5_MIN_Y) {
this->actor.world.pos.y = GBT_ROOM_5_MIN_Y + scaleY;
- if (!(this->actor.bgCheckFlags & 1)) {
- this->actor.bgCheckFlags |= 2;
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ this->actor.bgCheckFlags |= BGCHECKFLAG_GROUND_TOUCH;
}
- this->actor.bgCheckFlags |= 1;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_GROUND;
} else {
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
}
if ((this->actor.world.pos.x + scaleX) > GBT_ROOM_5_MAX_X) {
- this->actor.bgCheckFlags |= 8;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_WALL;
this->actor.world.pos.x = GBT_ROOM_5_MAX_X - scaleX;
} else if ((this->actor.world.pos.x - scaleX) < GBT_ROOM_5_MIN_X) {
this->actor.world.pos.x = GBT_ROOM_5_MIN_X + scaleX;
- this->actor.bgCheckFlags |= 8;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_WALL;
}
if ((this->actor.world.pos.z + scaleZ) > GBT_ROOM_5_MAX_Z) {
- this->actor.bgCheckFlags |= 8;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_WALL;
this->actor.world.pos.z = GBT_ROOM_5_MAX_Z - scaleZ;
} else if ((this->actor.world.pos.z - scaleZ) < GBT_ROOM_5_MIN_Z) {
this->actor.world.pos.z = GBT_ROOM_5_MIN_Z + scaleZ;
- this->actor.bgCheckFlags |= 8;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_WALL;
}
}
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,22 +198,22 @@ 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;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_ICE_BROKEN);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_ICE_BROKEN);
}
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);
}
@@ -240,14 +240,14 @@ void EnMinislime_SetupFall(EnMinislime* this, PlayState* play) {
this->collider.base.atFlags |= AT_ON;
this->collider.base.acFlags |= AC_ON;
this->collider.base.ocFlags1 |= OC1_ON;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.gravity = -2.0f;
if (this->actionFunc != EnMinislime_GekkoThrow) {
this->actor.scale.x = 0.095f;
this->actor.scale.z = 0.095f;
this->actor.scale.y = 0.10700001f;
- if (Actor_XZDistanceBetweenActors(&this->actor, &player->actor) < 225.0f) {
- yaw = Actor_YawBetweenActors(&player->actor, &this->actor);
+ if (Actor_WorldDistXZToActor(&this->actor, &player->actor) < 225.0f) {
+ yaw = Actor_WorldYawTowardActor(&player->actor, &this->actor);
this->actor.world.pos.x = Math_SinS(yaw) * 225.0f + player->actor.world.pos.x;
this->actor.world.pos.z = Math_CosS(yaw) * 225.0f + player->actor.world.pos.z;
}
@@ -259,7 +259,7 @@ void EnMinislime_Fall(EnMinislime* this, PlayState* play) {
Math_StepToF(&this->actor.scale.x, 0.17999999f, 0.003f);
Math_StepToF(&this->actor.scale.y, 0.05f, 0.003f);
this->actor.scale.z = this->actor.scale.x;
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
EnMinislime_SetupGrowAndShrink(this);
}
}
@@ -267,11 +267,11 @@ void EnMinislime_Fall(EnMinislime* this, PlayState* play) {
void EnMinislime_SetupBreakFromBigslime(EnMinislime* this) {
f32 velY;
- this->actor.world.rot.y = Actor_YawBetweenActors(this->actor.parent, &this->actor);
+ this->actor.world.rot.y = Actor_WorldYawTowardActor(this->actor.parent, &this->actor);
this->actor.shape.rot.y = this->actor.world.rot.y;
- this->actor.speedXZ = Math_CosS(this->actor.world.rot.x) * 15.0f;
+ this->actor.speed = Math_CosS(this->actor.world.rot.x) * 15.0f;
velY = Math_SinS(this->actor.world.rot.x) * 15.0f;
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
this->actor.velocity.y = velY + 2.0f;
this->actor.gravity = -1.0f;
this->frozenScale = 0.1f;
@@ -289,7 +289,7 @@ void EnMinislime_BreakFromBigslime(EnMinislime* this, PlayState* play) {
this->actor.shape.rot.x += this->actor.world.rot.x;
if (this->actor.velocity.y < 0.0f) {
this->collider.base.ocFlags1 |= OC1_ON;
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
EnMinislime_AddIceShardEffect(this);
this->attackTimer = 40;
EnMinislime_SetupGrowAndShrink(this);
@@ -300,20 +300,15 @@ void EnMinislime_BreakFromBigslime(EnMinislime* this, PlayState* play) {
void EnMinislime_SetupIceArrowDamage(EnMinislime* this) {
this->collider.base.atFlags &= ~AT_ON;
this->frozenTimer = 80;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->frozenScale = 0.1f;
this->actionFunc = EnMinislime_IceArrowDamage;
}
void EnMinislime_IceArrowDamage(EnMinislime* this, PlayState* play) {
- f32 invFrozenTimer;
- s32 pad;
- f32 randFloat;
- s32 randSign;
-
if (this->frozenTimer == 80) {
this->frozenAlpha += 10;
- func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
if (this->frozenAlpha >= 200) {
this->frozenAlpha = 200;
this->frozenTimer--;
@@ -324,11 +319,11 @@ void EnMinislime_IceArrowDamage(EnMinislime* this, PlayState* play) {
Math_Vec3f_Copy(&this->shakeRefPos, &this->actor.world.pos);
} else if (this->frozenTimer > 0) {
if ((this->frozenTimer < 20) || ((this->frozenTimer < 40) && ((this->frozenTimer % 2) != 0))) {
- s32 requiredScopeTemp;
+ f32 invFrozenTimer = 1.0f / this->frozenTimer;
+ s32 pad;
+ f32 randFloat = Rand_ZeroFloat(invFrozenTimer);
+ s32 randSign = Rand_ZeroOne() < 0.5f ? -1 : 1;
- invFrozenTimer = 1.0f / this->frozenTimer;
- randFloat = Rand_ZeroFloat(invFrozenTimer);
- randSign = Rand_ZeroOne() < 0.5f ? -1 : 1;
this->actor.world.pos.x = randSign * (invFrozenTimer + randFloat) + this->shakeRefPos.x;
randFloat = Rand_ZeroFloat(invFrozenTimer);
randSign = Rand_ZeroOne() < 0.5f ? -1 : 1;
@@ -341,7 +336,7 @@ void EnMinislime_IceArrowDamage(EnMinislime* this, PlayState* play) {
return;
}
- if (this->actor.bgCheckFlags & 2) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
EnMinislime_AddIceShardEffect(this);
EnMinislime_SetupGrowAndShrink(this);
}
@@ -354,7 +349,7 @@ void EnMinislime_SetupFireArrowDamage(EnMinislime* this) {
this->actor.shape.rot.z = 0;
this->actor.world.rot.x = 0;
this->collider.base.acFlags &= ~AC_ON;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = EnMinislime_FireArrowDamage;
}
@@ -371,7 +366,7 @@ void EnMinislime_FireArrowDamage(EnMinislime* this, PlayState* play) {
this->frozenAlpha = 10 * this->meltTimer;
}
- func_800B9010(&this->actor, NA_SE_EV_ICE_MELT_LEVEL - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_MELT_LEVEL - SFX_FLAG);
if (this->meltTimer == 0) {
EnMinislime_SetupIdle(this);
}
@@ -385,13 +380,13 @@ void EnMinislime_SetupGrowAndShrink(EnMinislime* this) {
this->actor.shape.rot.y = 0;
this->actor.shape.rot.z = 0;
this->actor.world.rot.x = 0;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
Math_Vec3f_Copy(&this->actor.home.pos, &this->actor.world.pos);
this->growShrinkTimer = 42;
this->actor.scale.x = 0.19f;
this->actor.scale.y = 0.044999998f;
this->actor.scale.z = 0.19f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_SLIME_JUMP2);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_SLIME_JUMP2);
this->actionFunc = EnMinislime_GrowAndShrink;
}
@@ -401,8 +396,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,18 +419,19 @@ void EnMinislime_Idle(EnMinislime* this, PlayState* play) {
f32 speedXZ;
this->idleTimer--;
- speedXZ = sin_rad(this->idleTimer * (M_PI / 10));
- this->actor.speedXZ = speedXZ * 1.5f;
- this->actor.speedXZ = CLAMP_MIN(this->actor.speedXZ, 0.0f);
+ 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) {
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
} else {
- if (Actor_XZDistanceToPoint(&this->actor, &this->actor.home.pos) < 200.0f) {
- this->actor.world.rot.y = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) < 200.0f) {
+ this->actor.world.rot.y = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
} else {
this->actor.world.rot.y += (s16)((s32)Rand_Next() >> 0x13);
}
@@ -451,9 +447,9 @@ void EnMinislime_Idle(EnMinislime* this, PlayState* play) {
}
void EnMinislime_SetupBounce(EnMinislime* this) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->bounceTimer = (this->actionFunc == EnMinislime_GrowAndShrink) ? 1 : 4;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_SLIME_JUMP1);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_SLIME_JUMP1);
this->actionFunc = EnMinislime_Bounce;
}
@@ -466,7 +462,7 @@ void EnMinislime_Bounce(EnMinislime* this, PlayState* play) {
if (this->bounceTimer == 0) {
this->actor.gravity = -2.0f;
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
- this->actor.speedXZ = 1.0f;
+ this->actor.speed = 1.0f;
this->actor.velocity.y = 12.0f;
this->actor.shape.rot.y = this->actor.world.rot.y;
}
@@ -478,7 +474,7 @@ void EnMinislime_Bounce(EnMinislime* this, PlayState* play) {
} else {
Math_StepToF(&this->actor.scale.x, 0.17999999f, 0.003f);
Math_StepToF(&this->actor.scale.y, 0.05f, 0.003f);
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
EnMinislime_SetupGrowAndShrink(this);
return;
}
@@ -490,9 +486,9 @@ void EnMinislime_Bounce(EnMinislime* this, PlayState* play) {
void EnMinislime_SetupMoveToBigslime(EnMinislime* this) {
this->actor.gravity = 0.0f;
- this->actor.speedXZ = 15.0f;
- this->actor.shape.rot.x = Actor_PitchToPoint(&this->actor, &this->actor.parent->home.pos);
- this->actor.shape.rot.y = Actor_YawToPoint(&this->actor, &this->actor.parent->home.pos);
+ this->actor.speed = 15.0f;
+ this->actor.shape.rot.x = Actor_WorldPitchTowardPoint(&this->actor, &this->actor.parent->home.pos);
+ this->actor.shape.rot.y = Actor_WorldYawTowardPoint(&this->actor, &this->actor.parent->home.pos);
this->actor.world.rot.x = -this->actor.shape.rot.x;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->collider.base.atFlags &= ~AT_ON;
@@ -517,7 +513,7 @@ void EnMinislime_MoveToBigslime(EnMinislime* this, PlayState* play) {
EnMinislime_SetupDisappear(this);
} else if ((this->actor.scale.x > 0.0f) && (this->actor.world.pos.y > (GBT_ROOM_5_MAX_Y - 100.0f))) {
this->actor.params = MINISLIME_SETUP_DISAPPEAR;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
Actor_SetScale(&this->actor, 0.0f);
}
}
@@ -526,7 +522,7 @@ void EnMinislime_SetupKnockback(EnMinislime* this) {
this->collider.base.acFlags &= ~AC_ON;
this->collider.base.ocFlags1 |= OC1_ON;
this->knockbackTimer = 30;
- this->actor.speedXZ = 20.0f;
+ this->actor.speed = 20.0f;
func_800BE504(&this->actor, &this->collider);
this->actionFunc = EnMinislime_Knockback;
}
@@ -535,15 +531,15 @@ void EnMinislime_Knockback(EnMinislime* this, PlayState* play) {
f32 sqrtFrozenTimer;
this->knockbackTimer--;
- Math_StepToF(&this->actor.speedXZ, 0.0f, 1.0f);
+ 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) {
@@ -556,7 +552,7 @@ void EnMinislime_SetupDefeatIdle(EnMinislime* this) {
this->idleTimer = 20;
this->collider.base.atFlags &= ~(AT_ON | AT_HIT);
this->collider.base.acFlags &= ~(AC_ON | AC_HIT);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->frozenAlpha > 20) {
EnMinislime_AddIceShardEffect(this);
}
@@ -575,9 +571,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;
@@ -603,7 +600,7 @@ void EnMinislime_DefeatMelt(EnMinislime* this, PlayState* play) {
EnMinislime_AddIceSmokeEffect(this, play);
}
- func_800B9010(&this->actor, NA_SE_EV_ICE_MELT_LEVEL - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_MELT_LEVEL - SFX_FLAG);
if (Math_StepToF(&this->actor.scale.y, 0.001f, 0.00075f)) {
if ((this->actor.shape.shadowAlpha - 4) <= 0) {
this->actor.shape.shadowAlpha = 0;
@@ -625,7 +622,7 @@ void EnMinislime_Despawn(EnMinislime* this, PlayState* play) {
}
void EnMinislime_SetupMoveToGekko(EnMinislime* this) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.gravity = 0.0f;
this->actor.velocity.y = 0.0f;
this->collider.base.acFlags &= ~AC_ON;
@@ -657,11 +654,11 @@ void EnMinislime_SetupGekkoThrow(EnMinislime* this) {
this->collider.base.acFlags |= AC_ON;
this->collider.base.ocFlags1 |= OC1_ON;
xzDistToPlayer = CLAMP_MIN(this->actor.xzDistToPlayer, 200.0f);
- this->actor.speedXZ = 17.5f;
+ this->actor.speed = 17.5f;
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
this->actor.gravity = -1.0f;
this->actor.velocity.y = ((xzDistToPlayer - 200.0f) * 0.01f) + 3.0f;
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
this->throwTimer = 10;
this->actionFunc = EnMinislime_GekkoThrow;
}
@@ -670,15 +667,15 @@ 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;
}
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
EnMinislime_SetupGrowAndShrink(this);
}
}
@@ -713,7 +710,7 @@ void EnMinislime_Update(Actor* thisx, PlayState* play) {
s32 pad;
Vec3f vec1;
- if ((this->actor.params == MINISLIME_DEFEAT_IDLE) && (this->actor.bgCheckFlags & 1)) {
+ if ((this->actor.params == MINISLIME_DEFEAT_IDLE) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
EnMinislime_SetupDefeatIdle(this);
} else if (this->actor.params == MINISLIME_DEFEAT_MELT) {
EnMinislime_SetupDefeatMelt(this, play);
@@ -761,7 +758,7 @@ void EnMinislime_Update(Actor* thisx, PlayState* play) {
this->attackTimer--;
}
- if (this->actor.bgCheckFlags & 2) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
player = GET_PLAYER(play);
vec1.x = this->actor.world.pos.x;
vec1.z = this->actor.world.pos.z;
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 894d73a6f..0c9f545f1 100644
--- a/src/overlays/actors/ovl_En_Mk/z_en_mk.c
+++ b/src/overlays/actors/ovl_En_Mk/z_en_mk.c
@@ -6,7 +6,7 @@
#include "z_en_mk.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnMk*)thisx)
@@ -57,8 +57,8 @@ static ColliderCylinderInit sCylinderInit = {
s32 func_809592E0(EnMk* this, s16 index) {
AnimationHeader* sAnimations[] = {
- &object_mk_Anim_001C38, &object_mk_Anim_000438, &object_mk_Anim_0007D8,
- &object_mk_Anim_0010F4, &object_mk_Anim_001964,
+ &gMarineResearcherIdleAnim, &gMarineResearcherHeadWaggleAnim, &gMarineResearcherYellAnim,
+ &gMarineResearcherShakeInFearAnim, &gMarineResearcherStrokeChinAnim,
};
if (index == this->unk_27C) {
@@ -76,14 +76,14 @@ 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;
this->actor.gravity = -1.0f;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 36.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_mk_Skel_006CA0, &object_mk_Anim_001C38, this->jointTable,
- this->morphTable, OBJECT_MK_LIMB_MAX);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gMarineResearcherSkel, &gMarineResearcherIdleAnim, this->jointTable,
+ this->morphTable, MARINE_RESEARCHER_LIMB_MAX);
this->unk_27C = -1;
func_809592E0(this, 0);
@@ -95,22 +95,22 @@ void EnMk_Init(Actor* thisx, PlayState* play) {
this->actionFunc = func_80959E18;
this->unk_27A = 0;
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
if (func_80959524(play) < 7) {
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,23 @@ 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;
+
+ default:
break;
}
} else {
@@ -144,10 +147,10 @@ void func_8095954C(EnMk* this, PlayState* play) {
void func_80959624(EnMk* this, PlayState* play) {
u16 textId;
- if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ if (GET_PLAYER_FORM == 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;
@@ -170,7 +173,7 @@ void func_809596A0(EnMk* this, PlayState* play) {
switch (Message_GetState(&play->msgCtx)) {
case TEXT_STATE_5:
if (Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80959774;
}
break;
@@ -191,7 +194,7 @@ void func_80959774(EnMk* this, PlayState* play) {
func_80959624(this, play);
this->actionFunc = func_809596A0;
} else if ((this->actor.xzDistToPlayer < 120.0f) && Player_IsFacingActor(&this->actor, 0x3000, play)) {
- func_800B8614(&this->actor, play, 130.0f);
+ Actor_OfferTalk(&this->actor, play, 130.0f);
}
func_8095954C(this, play);
@@ -209,10 +212,10 @@ void func_80959844(EnMk* this, PlayState* play) {
} else if (func_80959524(play) >= 7) {
textId = 0xFB3;
} else {
- switch (gSaveContext.save.playerForm) {
+ switch (GET_PLAYER_FORM) {
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 +227,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 +242,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;
@@ -279,15 +282,15 @@ void func_80959A24(EnMk* this, PlayState* play) {
case 0xFA4:
case 0xFAA:
case 0xFAE:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0xFA2:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
- func_801477B4(play);
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
+ Message_CloseTextbox(play);
this->actionFunc = func_80959E18;
} else {
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
}
break;
@@ -303,53 +306,53 @@ void func_80959A24(EnMk* this, PlayState* play) {
case 0xFBD:
case 0xFBE:
case 0xFBF:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80959E18;
break;
case 0xFA0:
SET_WEEKEVENTREG(WEEKEVENTREG_19_04);
- func_80151938(play, 0xFA1);
+ Message_ContinueTextbox(play, 0xFA1);
break;
case 0xFA8:
SET_WEEKEVENTREG(WEEKEVENTREG_19_08);
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
- func_80151938(play, 0xFBD);
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
+ Message_ContinueTextbox(play, 0xFBD);
} else {
- func_80151938(play, 0xFA9);
+ Message_ContinueTextbox(play, 0xFA9);
}
break;
case 0xFAC:
SET_WEEKEVENTREG(WEEKEVENTREG_19_10);
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
- func_80151938(play, 0xFBE);
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
+ Message_ContinueTextbox(play, 0xFBE);
} else {
- func_80151938(play, 0xFAD);
+ Message_ContinueTextbox(play, 0xFAD);
}
break;
case 0xFB1:
SET_WEEKEVENTREG(WEEKEVENTREG_19_20);
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80959E18;
break;
case 0xFB3:
case 0xFB4:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80959E18;
this->actor.flags &= ~ACTOR_FLAG_10000;
break;
case 0xFB5:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80959E18;
break;
default:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80959E18;
break;
}
@@ -365,14 +368,14 @@ void func_80959C94(EnMk* this, PlayState* play) {
Message_StartTextbox(play, 0xFB3, &this->actor);
} else {
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, 350.0f, 1000.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 350.0f, 1000.0f, PLAYER_IA_MINUS1);
}
}
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 +384,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);
@@ -409,16 +412,16 @@ void func_80959E18(EnMk* this, PlayState* play) {
}
if (func_800B8718(&this->actor, &play->state)) {
- play->msgCtx.ocarinaMode = 4;
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
this->actionFunc = func_80959D28;
- if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
- this->actor.cutscene = this->unk_276[0];
+ if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
+ 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;
@@ -427,7 +430,7 @@ void func_80959E18(EnMk* this, PlayState* play) {
this->actionFunc = func_80959C94;
} else if ((this->actor.xzDistToPlayer < 120.0f) && (ABS_ALT(sp22) <= 0x4300)) {
this->unk_27A |= 1;
- func_800B8614(&this->actor, play, 200.0f);
+ Actor_OfferTalk(&this->actor, play, 200.0f);
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_20_40) && CHECK_WEEKEVENTREG(WEEKEVENTREG_19_40)) {
func_800B874C(&this->actor, play, 200.0f, 100.0f);
}
@@ -445,11 +448,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);
@@ -460,7 +463,7 @@ void EnMk_Update(Actor* thisx, PlayState* play) {
s32 EnMk_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnMk* this = THIS;
- if (limbIndex == OBJECT_MK_LIMB_0B) {
+ if (limbIndex == MARINE_RESEARCHER_LIMB_HEAD) {
rot->y -= this->unk_270.y;
rot->z += this->unk_270.x;
}
@@ -472,7 +475,7 @@ Vec3f D_8095A2A0 = { 1000.0f, -100.0f, 0.0f };
void EnMk_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnMk* this = THIS;
- if (limbIndex == OBJECT_MK_LIMB_0B) {
+ if (limbIndex == MARINE_RESEARCHER_LIMB_HEAD) {
Matrix_MultVec3f(&D_8095A2A0, &this->actor.focus.pos);
}
}
@@ -480,7 +483,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..9d32e9374 100644
--- a/src/overlays/actors/ovl_En_Mk/z_en_mk.h
+++ b/src/overlays/actors/ovl_En_Mk/z_en_mk.h
@@ -12,10 +12,10 @@ typedef struct EnMk {
/* 0x000 */ Actor actor;
/* 0x144 */ ColliderCylinder collider;
/* 0x190 */ SkelAnime skelAnime;
- /* 0x1D4 */ Vec3s jointTable[OBJECT_MK_LIMB_MAX];
- /* 0x222 */ Vec3s morphTable[OBJECT_MK_LIMB_MAX];
+ /* 0x1D4 */ Vec3s jointTable[MARINE_RESEARCHER_LIMB_MAX];
+ /* 0x222 */ Vec3s morphTable[MARINE_RESEARCHER_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 cbbaffca9..a6d8eb8bb 100644
--- a/src/overlays/actors/ovl_En_Mkk/z_en_mkk.c
+++ b/src/overlays/actors/ovl_En_Mkk/z_en_mkk.c
@@ -7,7 +7,7 @@
#include "z_en_mkk.h"
#include "objects/object_mkk/object_mkk.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY)
#define THIS ((EnMkk*)thisx)
@@ -128,8 +128,8 @@ static Color_RGBA8 sEffPrimColors[] = { { 50, 50, 50, 255 }, { 255, 255, 255, 25
static Color_RGBA8 sEffEnvColors[] = { { 200, 200, 200, 255 }, { 255, 255, 255, 255 } };
static EnMkkDlists sBoeDLists[] = {
- { object_mkk_DL_000030, object_mkk_DL_0000B0, object_mkk_DL_0000C8, object_mkk_DL_000140 },
- { object_mkk_DL_0001F0, object_mkk_DL_000278, object_mkk_DL_000290, object_mkk_DL_000310 },
+ { gBlackBoeBodyMaterialDL, gBlackBoeBodyModelDL, gBlackBoeEndDL, gBlackBoeEyesDL },
+ { gWhiteBoeBodyMaterialDL, gWhiteBoeBodyModelDL, gWhiteBoeEndDL, gWhiteBoeEyesDL },
};
static Color_RGBA8 D_80A4F7C4[] = {
@@ -195,7 +195,7 @@ void EnMkk_Destroy(Actor* thisx, PlayState* play) {
void func_80A4E0CC(EnMkk* this) {
this->alpha = 0;
this->unk_14B |= 3;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actionFunc = func_80A4E100;
}
@@ -211,7 +211,7 @@ void func_80A4E100(EnMkk* this, PlayState* play) {
this->primColorSelect = 3;
this->collider.base.acFlags |= AC_ON;
this->alpha = 255;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actor.shape.rot.y = this->actor.yawTowardsPlayer;
this->unk_14B &= ~4;
func_80A4E190(this);
@@ -256,31 +256,31 @@ void func_80A4E2E8(EnMkk* this, PlayState* play) {
s32 sp20;
this->unk_14E--;
- if ((this->actor.params == 1) && (this->actor.bgCheckFlags & 1) && (this->actor.speedXZ > 2.5f) &&
+ if ((this->actor.params == 1) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->actor.speed > 2.5f) &&
((play->gameplayFrames % 3) == 0)) {
func_80A4E22C(this, play);
}
if (this->unk_14E > 0) {
- Math_StepToF(&this->actor.speedXZ, 5.0f, 0.7f);
+ Math_StepToF(&this->actor.speed, 5.0f, 0.7f);
sp20 = false;
} else {
- sp20 = Math_StepToF(&this->actor.speedXZ, 0.0f, 0.7f);
+ sp20 = Math_StepToF(&this->actor.speed, 0.0f, 0.7f);
}
if ((player->stateFlags3 & 0x100) || (Player_GetMask(play) == PLAYER_MASK_STONE)) {
- Math_ScaledStepToS(&this->unk_150, Actor_YawToPoint(&this->actor, &this->actor.home.pos), 0x400);
+ Math_ScaledStepToS(&this->unk_150, Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos), 0x400);
} else if ((player->stateFlags2 & 0x80) || (player->actor.freezeTimer > 0)) {
Math_ScaledStepToS(&this->unk_150, this->actor.yawTowardsPlayer + 0x8000, 0x400);
} else {
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.speedXZ)) + this->unk_150;
- func_800B9010(&this->actor, NA_SE_EN_KUROSUKE_MOVE - SFX_FLAG);
+ (s32)(Math_SinF(this->unk_14E * ((2 * M_PI) / 15)) * (614.4f * this->actor.speed)) + this->unk_150;
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_KUROSUKE_MOVE - SFX_FLAG);
if (sp20) {
this->unk_14B &= ~2;
func_80A4E190(this);
} else if ((this->unk_149 == 0) && (!(player->stateFlags3 & 0x100)) &&
- (Player_GetMask(play) != PLAYER_MASK_STONE) && (this->actor.bgCheckFlags & 1) &&
+ (Player_GetMask(play) != PLAYER_MASK_STONE) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
(Actor_IsFacingPlayer(&this->actor, 0x1800)) && (this->actor.xzDistToPlayer < 120.0f) &&
(fabsf(this->actor.playerHeightRel) < 100.0f)) {
func_80A4E58C(this);
@@ -289,9 +289,9 @@ void func_80A4E2E8(EnMkk* this, PlayState* play) {
void func_80A4E58C(EnMkk* this) {
this->unk_14B |= 1;
- this->actor.speedXZ = 3.0f;
+ this->actor.speed = 3.0f;
this->actor.velocity.y = 5.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KUROSUKE_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KUROSUKE_ATTACK);
this->collider.base.atFlags |= AT_ON;
Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0x800);
this->actionFunc = func_80A4E60C;
@@ -301,7 +301,7 @@ void func_80A4E60C(EnMkk* this, PlayState* play) {
if (this->collider.base.atFlags & AT_HIT) {
this->collider.base.atFlags &= ~(AT_ON | AT_HIT);
}
- if ((this->actor.velocity.y < 0.0f) && (this->actor.bgCheckFlags & 1)) {
+ if ((this->actor.velocity.y < 0.0f) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
this->unk_149 = 2;
this->collider.base.atFlags &= ~AT_ON;
func_80A4E2B8(this);
@@ -310,38 +310,38 @@ void func_80A4E60C(EnMkk* this, PlayState* play) {
void func_80A4E67C(EnMkk* this) {
this->unk_14B |= 1;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->collider.base.acFlags &= ~AC_ON;
this->actor.flags |= ACTOR_FLAG_10;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_DEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_DEAD);
this->alpha = 254;
func_800BE568(&this->actor, &this->collider);
- this->actor.speedXZ = 7.0f;
+ this->actor.speed = 7.0f;
this->actor.shape.rot.y = this->actor.world.rot.y;
this->actor.velocity.y = 5.0f;
this->actor.gravity = -1.3f;
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
this->actionFunc = func_80A4E72C;
}
void func_80A4E72C(EnMkk* this, PlayState* play) {
Vec3f temp;
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
if (this->actor.velocity.y > -1.0f) {
temp.x = this->actor.world.pos.x;
temp.y = this->actor.world.pos.y + 15.0f;
temp.z = this->actor.world.pos.z;
EffectSsDeadDb_Spawn(play, &temp, &gZeroVec3f, &gZeroVec3f, &sEffPrimColors[this->actor.params],
&sEffEnvColors[this->actor.params], 0x46, 4, 0xC);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EXTINCT);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EXTINCT);
if (this->unk_14C != 0) {
Item_DropCollectibleRandom(play, &this->actor, &this->actor.world.pos, this->unk_14C * 0x10);
}
func_80A4EEF4(this);
} else {
this->actor.velocity.y *= -0.8f;
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
}
}
}
@@ -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.speedXZ * 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.speedXZ * 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.speedXZ * 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.speedXZ * sin_rad(this->unk_14E * (M_PI / 5))));
+ (s32)(1228.8f * this->actor.speed * Math_SinF(this->unk_14E * (M_PI / 5))));
}
}
@@ -415,13 +415,15 @@ 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);
}
if (Actor_IsFacingPlayer(&this->actor, 0x3000)) {
player = GET_PLAYER(play);
- this->actor.shape.rot.x = Actor_PitchToPoint(&this->actor, &player->actor.focus.pos);
+ this->actor.shape.rot.x = Actor_WorldPitchTowardPoint(&this->actor, &player->actor.focus.pos);
this->actor.shape.rot.x = CLAMP(this->actor.shape.rot.x, -0x1800, 0x1800);
}
Actor_SetFocus(&this->actor, 10.0f);
@@ -431,7 +433,7 @@ void EnMkk_Update(Actor* thisx, PlayState* play) {
if (this->collider.base.atFlags & AT_ON) {
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
}
- if (this->collider.base.acFlags & AT_ON) {
+ if (this->collider.base.acFlags & AC_ON) {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
}
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
@@ -440,7 +442,7 @@ void EnMkk_Update(Actor* thisx, PlayState* play) {
void func_80A4EDF0(EnMkk* this) {
this->alpha = 0;
this->unk_14B |= 3;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.draw = NULL;
this->actor.update = func_80A4F16C;
this->actor.gravity = -0.5f;
@@ -483,7 +485,7 @@ void func_80A4EF74(EnMkk* this, PlayState* play) {
Math_Vec3f_Copy(&this->actor.world.pos, &this->actor.home.pos);
Math_Vec3f_Copy(&this->unk_154, &this->actor.world.pos);
Math_Vec3f_Copy(&this->unk_160, &this->actor.world.pos);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.velocity.y = 0.0f;
func_80A4EDF0(this);
} else {
@@ -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 d9b0bf507..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);
}
}
@@ -124,54 +124,55 @@ void func_80965DB4(EnMm* this, PlayState* play) {
if (Actor_HasParent(&this->actor, play)) {
func_80965BBC(this);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_PL_PULL_UP_ROCK);
+ Actor_PlaySfx(&this->actor, NA_SE_PL_PULL_UP_ROCK);
} else {
- if ((this->actor.velocity.y > 0.0f) && (this->actor.bgCheckFlags & 0x10)) {
+ if ((this->actor.velocity.y > 0.0f) && (this->actor.bgCheckFlags & BGCHECKFLAG_CEILING)) {
this->actor.velocity.y = 0.0f;
}
- if ((this->actor.speedXZ != 0.0f) && (this->actor.bgCheckFlags & 8)) {
+ if ((this->actor.speed != 0.0f) && (this->actor.bgCheckFlags & BGCHECKFLAG_WALL)) {
angle = BINANG_SUB(this->actor.world.rot.y, BINANG_ROT180(this->actor.wallYaw));
this->actor.world.rot.y += BINANG_SUB(0x8000, (s16)(angle * 2));
- this->actor.speedXZ *= 0.5f;
+ this->actor.speed *= 0.5f;
CollisionCheck_SpawnShieldParticles(play, &this->actor.world.pos);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_HUMAN_BOUND);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_HUMAN_BOUND);
}
- if (!(this->actor.bgCheckFlags & 1)) {
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.08f);
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ Math_StepToF(&this->actor.speed, 0.0f, 0.08f);
} else {
- temp_f14 = Math_SinS(this->actor.world.rot.y) * this->actor.speedXZ;
- temp_f12 = Math_CosS(this->actor.world.rot.y) * this->actor.speedXZ;
+ temp_f14 = Math_SinS(this->actor.world.rot.y) * this->actor.speed;
+ temp_f12 = Math_CosS(this->actor.world.rot.y) * this->actor.speed;
Actor_GetSlopeDirection(this->actor.floorPoly, &slopeNormal, &downwardSlopeYaw);
temp_f14 += 3.0f * slopeNormal.x;
temp_f12 += 3.0f * slopeNormal.z;
temp_f2 = sqrtf(SQ(temp_f14) + SQ(temp_f12));
- if ((temp_f2 < this->actor.speedXZ) ||
- (SurfaceType_GetSlope(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId) == 1)) {
- this->actor.speedXZ = CLAMP_MAX(temp_f2, 16.0f);
+ if ((temp_f2 < this->actor.speed) ||
+ (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);
}
- if (!Math_StepToF(&this->actor.speedXZ, 0.0f, 1.0f)) {
+ if (!Math_StepToF(&this->actor.speed, 0.0f, 1.0f)) {
direction = this->actor.world.rot.y;
if (ABS_ALT(BINANG_SUB(this->actor.world.rot.y, this->actor.shape.rot.y)) > 0x4000) {
direction = BINANG_ROT180(direction);
}
- Math_ScaledStepToS(&this->actor.shape.rot.y, direction, this->actor.speedXZ * 100.0f);
- this->unk_190 += (s16)(this->actor.speedXZ * 800.0f);
+ Math_ScaledStepToS(&this->actor.shape.rot.y, direction, this->actor.speed * 100.0f);
+ this->unk_190 += (s16)(this->actor.speed * 800.0f);
}
- if (this->actor.bgCheckFlags & 2) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
if (this->actor.velocity.y < -6.0f) {
this->actor.velocity.y *= -0.3f;
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_HUMAN_BOUND);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_HUMAN_BOUND);
} else {
- Actor_PickUp(&this->actor, play, GI_NONE, 50.0f, 30.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_NONE, 50.0f, 30.0f);
}
}
@@ -186,7 +187,7 @@ void func_8096611C(EnMm* this, PlayState* play) {
if (Actor_HasNoParent(&this->actor, play)) {
EnMm_SetupAction(this, func_80965DB4);
this->actor.room = play->roomCtx.curRoom.num;
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
Math_Vec3s_ToVec3f(&this->actor.prevPos, &this->actor.home.rot);
gSaveContext.unk_1014 = 0;
} else {
@@ -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 14c8d1170..64cc47ad8 100644
--- a/src/overlays/actors/ovl_En_Mm2/z_en_mm2.c
+++ b/src/overlays/actors/ovl_En_Mm2/z_en_mm2.c
@@ -49,7 +49,7 @@ void EnMm2_Reading(EnMm2* this, PlayState* play) {
switch (Message_GetState(&play->msgCtx)) {
case TEXT_STATE_5:
if (Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = EnMm2_WaitForRead;
}
break;
@@ -69,7 +69,7 @@ void EnMm2_WaitForRead(EnMm2* this, PlayState* play) {
Message_StartTextbox(play, 0x277B, &this->actor);
this->actionFunc = EnMm2_Reading;
} else if ((this->actor.xzDistToPlayer < 60.0f) && (Player_IsFacingActor(&this->actor, 0x3000, play))) {
- func_800B8614(&this->actor, play, 110.0f);
+ Actor_OfferTalk(&this->actor, play, 110.0f);
}
}
@@ -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 3e58691cc..f544dd2d2 100644
--- a/src/overlays/actors/ovl_En_Mm3/z_en_mm3.c
+++ b/src/overlays/actors/ovl_En_Mm3/z_en_mm3.c
@@ -7,7 +7,7 @@
#include "z_en_mm3.h"
#include "objects/object_mm/object_mm.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnMm3*)thisx)
@@ -92,9 +92,9 @@ 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->actor.targetMode = TARGET_MODE_0;
this->unk_1DC = 1;
this->unk_2B4 = 0;
this->unk_2AE = 0;
@@ -106,7 +106,7 @@ void EnMm3_Init(Actor* thisx, PlayState* play) {
void EnMm3_Destroy(Actor* thisx, PlayState* play) {
EnMm3* this = THIS;
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_01);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
Collider_DestroyCylinder(play, &this->collider);
}
@@ -133,7 +133,7 @@ void func_80A6F2C8(EnMm3* this, PlayState* play) {
this->unk_2B4 = 0x278A;
func_80A6F9C8(this);
} else if (func_80A6F22C(this)) {
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
Math_SmoothStepToS(&this->unk_2A0.x, 0, 5, 0x1000, 0x100);
@@ -148,48 +148,48 @@ 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) {
- func_8019F208();
+ if (gSaveContext.save.saveInfo.playerData.rupees >= play->msgCtx.unk1206C) {
+ Audio_PlaySfx_MessageDecide();
Message_StartTextbox(play, 0x2790, &this->actor);
this->unk_2B4 = 0x2790;
Rupees_ChangeBy(-play->msgCtx.unk1206C);
} else {
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(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();
+ Audio_PlaySfx_MessageDecide();
Message_StartTextbox(play, 0x2790, &this->actor);
this->unk_2B4 = 0x2790;
}
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
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) {
- func_8019F208();
+ if (gSaveContext.save.saveInfo.playerData.rupees >= play->msgCtx.unk1206C) {
+ Audio_PlaySfx_MessageDecide();
Message_StartTextbox(play, 0x2790, &this->actor);
this->unk_2B4 = 0x2790;
Rupees_ChangeBy(-play->msgCtx.unk1206C);
} else {
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(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();
+ Audio_PlaySfx_MessageCancel();
Message_StartTextbox(play, 0x279B, &this->actor);
this->unk_2B4 = 0x279B;
- func_80151BB4(play, 0xB);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_POSTMAN);
}
break;
}
@@ -271,7 +271,7 @@ void func_80A6F5E4(EnMm3* this, PlayState* play) {
break;
case 0x2793:
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_80A6FE1C(this);
func_80A6FE30(this, play);
break;
@@ -279,10 +279,10 @@ void func_80A6F5E4(EnMm3* this, PlayState* play) {
case 0x2795:
case 0x2796:
case 0x2797:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_63_02)) {
+ 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;
@@ -305,7 +305,7 @@ void func_80A6F5E4(EnMm3* this, PlayState* play) {
if (gSaveContext.timerCurTimes[TIMER_ID_POSTMAN] == SECONDS_TO_TIMER(10)) {
Audio_PlayFanfare(NA_BGM_GET_ITEM | 0x900);
} else {
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
}
}
}
@@ -347,12 +347,12 @@ void func_80A6F9DC(EnMm3* this, PlayState* play) {
} else {
Interface_StartPostmanTimer(0, POSTMAN_MINIGAME_BUNNY_HOOD_OFF);
}
- func_801477B4(play);
- play_sound(NA_SE_SY_START_SHOT);
+ Message_CloseTextbox(play);
+ Audio_PlaySfx(NA_SE_SY_START_SHOT);
func_80A6FBA0(this);
} else {
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_01);
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_02);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED);
func_80A6F270(this);
}
}
@@ -365,7 +365,7 @@ void func_80A6F9DC(EnMm3* this, PlayState* play) {
if (((this->unk_2B4 == 0x279D) || (this->unk_2B4 == 0x27A0) || (this->unk_2B4 == 0x278B)) &&
Animation_OnFrame(&this->skelAnime, 8.0f) && (this->unk_2AE == 0)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_LIE_DOWN_ON_BED);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_LIE_DOWN_ON_BED);
this->unk_2AE = 1;
}
}
@@ -373,9 +373,9 @@ void func_80A6F9DC(EnMm3* this, PlayState* play) {
void func_80A6FBA0(EnMm3* this) {
AudioSfx_MuteBanks((1 << BANK_PLAYER) | (1 << BANK_ITEM) | (1 << BANK_ENV) | (1 << BANK_ENEMY) |
(1 << BANK_OCARINA) | (1 << BANK_VOICE));
- func_801A0238(0, 5);
- SET_WEEKEVENTREG(WEEKEVENTREG_63_01);
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_02);
+ Audio_SetMainBgmVolume(0, 5);
+ SET_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED);
this->actionFunc = func_80A6FBFC;
}
@@ -400,21 +400,21 @@ void func_80A6FBFC(EnMm3* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
AudioSfx_MuteBanks(0);
- func_801A0238(0x7F, 5);
+ Audio_SetMainBgmVolume(0x7F, 5);
Message_StartTextbox(play, 0x2791, &this->actor);
this->unk_2B4 = 0x2791;
this->unk_2AC = 7;
gSaveContext.timerStates[TIMER_ID_POSTMAN] = TIMER_STATE_OFF;
this->actor.flags &= ~ACTOR_FLAG_10000;
- play_sound(NA_SE_SY_START_SHOT);
+ Audio_PlaySfx(NA_SE_SY_START_SHOT);
func_80A6F9C8(this);
} else {
- func_800B8614(&this->actor, play, this->actor.xzDistToPlayer + 10.0f);
+ Actor_OfferTalk(&this->actor, play, this->actor.xzDistToPlayer + 10.0f);
func_80123E90(play, &this->actor);
if (Player_GetMask(play) == PLAYER_MASK_BUNNY) {
- play_sound(NA_SE_SY_STOPWATCH_TIMER_INF - SFX_FLAG);
+ Audio_PlaySfx(NA_SE_SY_STOPWATCH_TIMER_INF - SFX_FLAG);
} else {
- play_sound(NA_SE_SY_STOPWATCH_TIMER_3 - SFX_FLAG);
+ Audio_PlaySfx(NA_SE_SY_STOPWATCH_TIMER_3 - SFX_FLAG);
}
}
}
@@ -431,9 +431,9 @@ void func_80A6FE30(EnMm3* this, PlayState* play) {
this->actor.parent = NULL;
func_80A6FED8(this);
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_77_01)) {
- Actor_PickUp(&this->actor, play, GI_RUPEE_PURPLE, 500.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_RUPEE_PURPLE, 500.0f, 100.0f);
} else {
- Actor_PickUp(&this->actor, play, GI_HEART_PIECE, 500.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_HEART_PIECE, 500.0f, 100.0f);
}
}
@@ -448,18 +448,18 @@ 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 {
- func_800B85E0(&this->actor, play, 200.0f, -1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 200.0f, PLAYER_IA_MINUS1);
}
}
s32 func_80A6FFAC(EnMm3* this, PlayState* play) {
- switch (gSaveContext.save.playerForm) {
- case 4:
+ switch (GET_PLAYER_FORM) {
+ case PLAYER_FORM_HUMAN:
if (Player_GetMask(play) == PLAYER_MASK_BUNNY) {
if (this->unk_2B2 & 0x10) {
return true;
@@ -469,31 +469,34 @@ s32 func_80A6FFAC(EnMm3* this, PlayState* play) {
}
break;
- case 3:
+ case PLAYER_FORM_DEKU:
if (this->unk_2B2 & 2) {
return true;
}
break;
- case 2:
+ case PLAYER_FORM_ZORA:
if (this->unk_2B2 & 4) {
return true;
}
break;
- case 1:
+ case PLAYER_FORM_GORON:
if (this->unk_2B2 & 8) {
return true;
}
break;
+
+ default:
+ break;
}
return false;
}
void func_80A70084(EnMm3* this, PlayState* play) {
- switch (gSaveContext.save.playerForm) {
- case 4:
+ switch (GET_PLAYER_FORM) {
+ case PLAYER_FORM_HUMAN:
if (Player_GetMask(play) == PLAYER_MASK_BUNNY) {
this->unk_2B2 |= 0x10;
this->unk_2B2 |= 1;
@@ -502,17 +505,20 @@ void func_80A70084(EnMm3* this, PlayState* play) {
}
break;
- case 3:
+ case PLAYER_FORM_DEKU:
this->unk_2B2 |= 2;
break;
- case 2:
+ case PLAYER_FORM_ZORA:
this->unk_2B2 |= 4;
break;
- case 1:
+ case PLAYER_FORM_GORON:
this->unk_2B2 |= 8;
break;
+
+ default:
+ break;
}
}
@@ -561,7 +567,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_Mnk/z_en_mnk.c b/src/overlays/actors/ovl_En_Mnk/z_en_mnk.c
index ef064969e..82e25a95d 100644
--- a/src/overlays/actors/ovl_En_Mnk/z_en_mnk.c
+++ b/src/overlays/actors/ovl_En_Mnk/z_en_mnk.c
@@ -6,7 +6,7 @@
#include "z_en_mnk.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnMnk*)thisx)
@@ -15,8 +15,34 @@ void EnMnk_Destroy(Actor* thisx, PlayState* play);
void EnMnk_Update(Actor* thisx, PlayState* play);
void EnMnk_Draw(Actor* thisx, PlayState* play);
-#if 0
-ActorInit En_Mnk_InitVars = {
+// Draw funcs
+void EnMnk_MonkeyTiedUp_Draw(Actor* thisx, PlayState* play);
+void EnMnk_MonkeyHanging_Draw(Actor* thisx, PlayState* play);
+
+// Action funcs
+void EnMnk_Monkey_WaitToRunAndWaitAtEachPoint(EnMnk* this, PlayState* play);
+void EnMnk_MonkeyTiedUp_Wait(EnMnk* this, PlayState* play);
+void EnMnk_MonkeyHanging_StruggleBeforeDunk(EnMnk* this, PlayState* play);
+void EnMnk_Monkey_WaitToTalkAfterRun(EnMnk* this, PlayState* play);
+void EnMnk_Monkey_WaitForPlayerApproach(EnMnk* this, PlayState* play);
+void EnMnk_Monkey_WaitToFollowPath(EnMnk* this, PlayState* play);
+void EnMnk_MonkeyTiedUp_WaitUnused(EnMnk* this, PlayState* play);
+void EnMnk_MonkeyTiedUp_WaitForInstrument(EnMnk* this, PlayState* play);
+void EnMnk_MonkeyTiedUp_WaitForCutRope(EnMnk* this, PlayState* play);
+void EnMnk_MonkeyHanging_WaitAfterDunk(EnMnk* this, PlayState* play);
+void EnMnk_Monkey_WaitToTalkAfterSaved(EnMnk* this, PlayState* play);
+
+void EnMnk_DoNothing(EnMnk* this, PlayState* play);
+void EnMnk_Monkey_WaitOutsideWoods(EnMnk* this, PlayState* play);
+void EnMnk_Monkey_WaitOutsideChamber(EnMnk* this, PlayState* play);
+void EnMnk_Monkey_WaitToGuideThroughWoods(EnMnk* this, PlayState* play);
+void func_80AB9084(EnMnk* this, PlayState* play);
+void func_80AB92CC(EnMnk* this, PlayState* play);
+
+s32 EnMnk_ValidatePictograph(PlayState* play, Actor* thisx);
+s32 EnMnk_AlreadyExists(EnMnk* this, PlayState* play);
+
+const ActorInit En_Mnk_InitVars = {
ACTOR_EN_MNK,
ACTORCAT_NPC,
FLAGS,
@@ -28,191 +54,2198 @@ ActorInit En_Mnk_InitVars = {
(ActorFunc)EnMnk_Draw,
};
-// static ColliderCylinderInit sCylinderInit = {
-static ColliderCylinderInit D_80AB9D10 = {
- { COLTYPE_NONE, AT_NONE, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_CYLINDER, },
- { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0x01000200, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, },
+static ColliderCylinderInit sCylinderInit = {
+ {
+ COLTYPE_NONE,
+ AT_NONE,
+ AC_ON | AC_TYPE_PLAYER,
+ OC1_ON | OC1_TYPE_ALL,
+ OC2_TYPE_1,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK0,
+ { 0x00000000, 0x00, 0x00 },
+ { 0x01000200, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_ON,
+ },
{ 15, 30, 0, { 0, 0, 0 } },
};
-#endif
-
-extern ColliderCylinderInit D_80AB9D10;
-
-extern UNK_TYPE D_06003584;
-extern UNK_TYPE D_060082C8;
-extern UNK_TYPE D_06008814;
-extern UNK_TYPE D_06009CC0;
-extern UNK_TYPE D_060105DC;
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB4D10.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB4E34.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB4E58.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB4E88.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB4F68.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB4F8C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB50B0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB50D4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB5148.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB51C8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB52E8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/EnMnk_Init.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/EnMnk_Destroy.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB5A64.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/EnMnk_ValidatePictograph.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB5B84.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB5BCC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB5C14.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB5C74.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB5CD8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB5F6C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB60FC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB61E8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB6304.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB63CC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB64B8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB65F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB675C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB6870.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB6920.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB69C8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB6AF8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB6B78.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB6BE4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB6E08.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB6EB0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB6F98.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB7108.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB7204.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB72BC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB7354.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB740C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB7488.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB7504.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB75A4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB7620.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB76B0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB794C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB7AC8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB7B20.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB7DCC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB7E50.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB8040.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB80BC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB81D8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB8478.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB852C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB85C8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB8644.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB86AC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB8750.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB8878.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB8968.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB89F8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB8A74.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB8B18.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB8BD4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB8C60.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB8CFC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB8E4C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB8EF4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB8FD8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB9084.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB92CC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB94E4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/EnMnk_Update.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB96A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB96E8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB9708.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB973C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB977C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB97B4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB99D4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/EnMnk_Draw.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB9BAC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mnk/func_80AB9C4C.s")
+typedef enum {
+ /* 0 */ MONKEY_TIEDUP_ANIM_NONE = -1,
+ /* 0 */ MONKEY_TIEDUP_ANIM_KICKAROUND,
+ /* 1 */ MONKEY_TIEDUP_ANIM_KICKUPANDDOWN,
+ /* 2 */ MONKEY_TIEDUP_ANIM_SHH,
+ /* 3 */ MONKEY_TIEDUP_ANIM_SING,
+ /* 4 */ MONKEY_TIEDUP_ANIM_SMALLCLAPFEET,
+ /* 5 */ MONKEY_TIEDUP_ANIM_LARGECLAPFEET,
+ /* 6 */ MONKEY_TIEDUP_ANIM_SHAKEHEAD,
+ /* 7 */ MONKEY_TIEDUP_ANIM_WAIT,
+ /* 8 */ MONKEY_TIEDUP_ANIM_CONFUSED
+} MonkeyTiedUpAnim;
+
+typedef enum {
+ /* 0 */ MONKEY_HANGING_ANIM_FREEZE,
+ /* 1 */ MONKEY_HANGING_ANIM_RISE,
+ /* 2 */ MONKEY_HANGING_ANIM_STRUGGLE
+} MonkeyHangingAnim;
+
+typedef enum {
+ /* 0 */ MONKEY_FOLLOWPATH_RESULT_FOLLOWING,
+ /* 1 */ MONKEY_FOLLOWPATH_RESULT_SHORTRANGE_REACHEDPOINT,
+ /* 2 */ MONKEY_FOLLOWPATH_RESULT_SHORTRANGE_FINISHEDPATH,
+ /* 3 */ MONKEY_FOLLOWPATH_RESULT_LONGRANGE_REACHEDPOINT,
+ /* 4 */ MONKEY_FOLLOWPATH_RESULT_LONGRANGE_FINISHEDPATH
+} MonkeyFollowPathResult;
+
+#define MONKEY_FOLLOWPATH_FLAGS_REACHNEXTPOINT (1 << 0)
+#define MONKEY_FOLLOWPATH_FLAGS_LONGRANGE (1 << 1)
+
+AnimationHeader* sMonkeyTiedUpAnimations[] = {
+ &object_mnk_Anim_00D1C8, &object_mnk_Anim_00CD4C, &object_mnk_Anim_00C23C,
+ &object_mnk_Anim_00F248, &object_mnk_Anim_00F9A4, &object_mnk_Anim_00FE34,
+ &object_mnk_Anim_00EC44, &object_mnk_Anim_010298, &object_mnk_Anim_00CAE8,
+};
+
+AnimationHeader* sMonkeyTiedUpPoleAnimations[] = {
+ &object_mnk_Anim_003584, &object_mnk_Anim_005194, &object_mnk_Anim_0052C4,
+ &object_mnk_Anim_003854, &object_mnk_Anim_005390, &object_mnk_Anim_005414,
+ &object_mnk_Anim_0037E8, &object_mnk_Anim_0054B4, &object_mnk_Anim_003504,
+};
+
+AnimationHeader* sMonkeyHangingAnimations[] = {
+ &object_mnk_Anim_0062D8,
+ &object_mnk_Anim_007380,
+ &gMonkeyHangingStruggleAnim,
+};
+
+AnimationHeader* sMonkeyHangingRopeAnimations[] = {
+ &object_mnk_Anim_01C1B8,
+ &object_mnk_Anim_01C1F8,
+ &gMonkeyHangingRopeStruggleAnim,
+};
+
+AnimationHeader* sMonkeyAnimations[] = {
+ &object_mnk_Anim_0105DC, &object_mnk_Anim_009FE0, &object_mnk_Anim_0099B0, &object_mnk_Anim_0095B4,
+ &object_mnk_Anim_0095B4, &object_mnk_Anim_00B864, &object_mnk_Anim_00B864, &object_mnk_Anim_009CC0,
+ &object_mnk_Anim_009CC0, &object_mnk_Anim_008814, &object_mnk_Anim_005A08, &object_mnk_Anim_01A4F8,
+ &object_mnk_Anim_01B468, &object_mnk_Anim_01BB0C, &object_mnk_Anim_01C17C,
+};
+
+u32 D_80AB9DD8[] = { 2, 2, 3, 4, 5, 6, 100 };
+
+Color_RGBA8 sMonkeyHangingSplashPrimColor = { 255, 255, 155, 255 };
+Color_RGBA8 sMonkeyHangingSplashEnvColor = { 255, 100, 0, 255 };
+
+static Vec3f sMonkeyFocusPosOffset = { 300.0f, 400.0f, 0.0f };
+
+TexturePtr sMonkeyFaceTextures[] = {
+ object_mnk_Tex_015020, object_mnk_Tex_015920, object_mnk_Tex_016120, object_mnk_Tex_016920,
+ object_mnk_Tex_017120, object_mnk_Tex_017920, object_mnk_Tex_018120,
+};
+
+void EnMnk_MonkeyTiedUp_ChangeAnim(EnMnk* this, s32 animIndex, u8 animMode, f32 morphFrames) {
+ Animation_Change(&this->skelAnime, sMonkeyTiedUpAnimations[animIndex], 1.0f, 0.0f,
+ Animation_GetLastFrame(&sMonkeyTiedUpAnimations[animIndex]->common), animMode, morphFrames);
+ Animation_Change(&this->propSkelAnime, sMonkeyTiedUpPoleAnimations[animIndex], 1.0f, 0.0f,
+ Animation_GetLastFrame(&sMonkeyTiedUpPoleAnimations[animIndex]->common), animMode, morphFrames);
+
+ switch (animIndex) {
+ case MONKEY_TIEDUP_ANIM_KICKAROUND:
+ this->unk_3E0 = 5;
+ break;
+
+ case MONKEY_TIEDUP_ANIM_SHAKEHEAD:
+ this->unk_3E0 = 4;
+ break;
+
+ case MONKEY_TIEDUP_ANIM_SING:
+ case MONKEY_TIEDUP_ANIM_CONFUSED:
+ this->unk_3E0 = 6;
+ break;
+
+ default:
+ this->unk_3E0 = 0;
+ break;
+ }
+ this->animIndex = animIndex;
+}
+
+void EnMnk_MonkeyTiedUp_SetAnim(EnMnk* this, s32 animIndex) {
+ EnMnk_MonkeyTiedUp_ChangeAnim(this, animIndex, ANIMMODE_LOOP, -5.0f);
+}
+
+void EnMnk_MonkeyTiedUp_SetNewAnim(EnMnk* this, s32 animIndex) {
+ if (this->animIndex != animIndex) {
+ EnMnk_MonkeyTiedUp_ChangeAnim(this, animIndex, ANIMMODE_LOOP, -5.0f);
+ }
+}
+
+void EnMnk_MonkeyHanging_ChangeAnim(EnMnk* this, s32 animIndex, u8 animMode, f32 morphFrames) {
+ Animation_Change(&this->skelAnime, sMonkeyHangingAnimations[animIndex], 1.0f, 0.0f,
+ Animation_GetLastFrame(&sMonkeyHangingAnimations[animIndex]->common), animMode, morphFrames);
+ Animation_Change(&this->propSkelAnime, sMonkeyHangingRopeAnimations[animIndex], 1.0f, 0.0f,
+ Animation_GetLastFrame(&sMonkeyHangingRopeAnimations[animIndex]->common), animMode, morphFrames);
+ this->animIndex = animIndex;
+}
+
+void EnMnk_MonkeyHanging_SetAnim(EnMnk* this, s32 animIndex) {
+ EnMnk_MonkeyHanging_ChangeAnim(this, animIndex, ANIMMODE_LOOP, -5.0f);
+}
+
+void EnMnk_Monkey_ChangeAnim(EnMnk* this, s32 animIndex, u8 animMode, f32 morphFrames) {
+ s32 pad;
+
+ if (animIndex == 100) {
+ animIndex = (s32)Rand_ZeroFloat(3.99f) + 7;
+ }
+ if ((animIndex == 4) || (animIndex == 6)) {
+ Animation_Change(&this->skelAnime, sMonkeyAnimations[animIndex], -1.0f,
+ Animation_GetLastFrame(&sMonkeyAnimations[animIndex]->common), 0.0f, animMode, morphFrames);
+ } else {
+ Animation_Change(&this->skelAnime, sMonkeyAnimations[animIndex], 1.0f, 0.0f,
+ Animation_GetLastFrame(&sMonkeyAnimations[animIndex]->common), animMode, morphFrames);
+ }
+ this->unk_3E0 = 0;
+ this->animIndex = animIndex;
+}
+
+void EnMnk_Monkey_SetAnim(EnMnk* this, s32 animIndex) {
+ EnMnk_Monkey_ChangeAnim(this, animIndex, ANIMMODE_LOOP, -5.0f);
+}
+
+void EnMnk_Monkey_SetupWaitToRunAndWaitAtEachPoint(EnMnk* this, PlayState* play) {
+ this->picto.actor.textId = 0x7D8;
+ this->actionFunc = EnMnk_Monkey_WaitToRunAndWaitAtEachPoint;
+ this->destPointIndex = 0;
+ this->flags |= MONKEY_FLAGS_1 | MONKEY_FLAGS_2;
+ this->flags &= ~MONKEY_FLAGS_40;
+ Animation_PlayLoop(&this->skelAnime, &object_mnk_Anim_008814);
+ this->picto.actor.velocity.y = 0.0f;
+ this->picto.actor.terminalVelocity = 0.0f;
+ this->picto.actor.gravity = 0.0f;
+}
+
+void EnMnk_Monkey_StartInvisible(EnMnk* this, PlayState* play) {
+ this->picto.actor.draw = NULL;
+ this->picto.actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ this->collider.dim.radius = 100;
+ this->flags |= MONKEY_FLAGS_8;
+ this->flags |= MONKEY_FLAGS_20;
+ if ((MONKEY_GET_SWITCH_FLAG(&this->picto.actor) != 0x7F) &&
+ Flags_GetSwitch(play, MONKEY_GET_SWITCH_FLAG(&this->picto.actor))) {
+ Actor_Kill(&this->picto.actor);
+ return;
+ }
+}
+
+void EnMnk_MonkeyTiedUp_Init(Actor* thisx, PlayState* play) {
+ EnMnk* this = THIS;
+ s16 csId;
+ s32 i;
+
+ this->actionFunc = EnMnk_MonkeyTiedUp_Wait;
+ this->picto.actor.flags |= ACTOR_FLAG_2000000;
+ SkelAnime_InitFlex(play, &this->propSkelAnime, &gMonkeyTiedUpPoleSkel, &object_mnk_Anim_003584,
+ this->propJointTable, this->propMorphTable, OBJECT_MNK_1_LIMB_MAX);
+ this->cueId = 4;
+ this->animIndex = MONKEY_TIEDUP_ANIM_NONE;
+ EnMnk_MonkeyTiedUp_ChangeAnim(this, MONKEY_TIEDUP_ANIM_KICKAROUND, ANIMMODE_ONCE, 0.0f);
+ this->picto.actor.draw = EnMnk_MonkeyTiedUp_Draw;
+ this->picto.actor.shape.shadowDraw = NULL;
+ this->flags |= MONKEY_FLAGS_1 | MONKEY_FLAGS_2 | MONKEY_FLAGS_20 | MONKEY_FLAGS_200;
+ csId = this->picto.actor.csId;
+
+ for (i = 0; i < ARRAY_COUNT(this->csIdList); i++) {
+ this->csIdList[i] = csId;
+ if (csId != CS_ID_NONE) {
+ this->picto.actor.csId = csId;
+ csId = CutsceneManager_GetAdditionalCsId(this->picto.actor.csId);
+ }
+ }
+
+ this->csId = CS_ID_NONE;
+ this->picto.actor.csId = this->csIdList[0];
+}
+
+void EnMnk_MonkeyHanging_Init(Actor* thisx, PlayState* play) {
+ EnMnk* this = THIS;
+
+ func_800BC154(play, &play->actorCtx, &this->picto.actor, ACTORCAT_PROP);
+ this->actionFunc = EnMnk_MonkeyHanging_StruggleBeforeDunk;
+ this->picto.actor.textId = 0x8E8;
+ SkelAnime_InitFlex(play, &this->propSkelAnime, &gMonkeyHangingRopeSkel, &gMonkeyHangingStruggleAnim,
+ this->propJointTable, this->propMorphTable, OBJECT_MNK_3_LIMB_MAX);
+ EnMnk_MonkeyHanging_ChangeAnim(this, MONKEY_HANGING_ANIM_STRUGGLE, ANIMMODE_LOOP, 0.0f);
+ this->unk_3E0 = 5;
+ this->picto.actor.draw = EnMnk_MonkeyHanging_Draw;
+ this->picto.actor.shape.shadowDraw = NULL;
+ this->flags |= MONKEY_FLAGS_1 | MONKEY_FLAGS_2 | MONKEY_FLAGS_20;
+ this->approachPlayerRadius = -0.3f;
+ this->unk_3C8 = 60;
+ play->envCtx.lightSettingOverride = 1;
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_83_08);
+}
+
+void EnMnk_Init(Actor* thisx, PlayState* play) {
+ EnMnk* this = THIS;
+ s32 pad;
+
+ Actor_SetScale(&this->picto.actor, 0.012f);
+ ActorShape_Init(&this->picto.actor.shape, 0.0f, ActorShadow_DrawCircle, 12.0f);
+ this->actionFunc = EnMnk_DoNothing;
+ SkelAnime_InitFlex(play, &this->skelAnime, &gMonkeySkel, &object_mnk_Anim_0105DC, this->jointTable,
+ this->morphTable, OBJECT_MNK_2_LIMB_MAX);
+ Animation_PlayLoop(&this->skelAnime, &object_mnk_Anim_0105DC);
+ this->flags = 0;
+ this->unk_3D4 = 0;
+ this->unk_3E0 = 0;
+ this->unk_3CC = 0;
+ this->unk_3CE = 0;
+ this->cueId = 0;
+ this->picto.actor.colChkInfo.mass = MASS_IMMOVABLE;
+ this->picto.actor.colChkInfo.cylRadius = 40;
+ this->picto.actor.velocity.y = -9.0f;
+ this->picto.actor.terminalVelocity = -9.0f;
+ this->picto.actor.gravity = -1.0f;
+ Collider_InitAndSetCylinder(play, &this->collider, &this->picto.actor, &sCylinderInit);
+ Collider_UpdateCylinder(&this->picto.actor, &this->collider);
+ this->pathIndex = MONKEY_GET_PATH_INDEX(thisx);
+ this->approachPlayerRadius = 0.0f;
+ if (this->pathIndex == MONKEY_PATH_INDEX_NONE) {
+ this->pathIndex = PATH_INDEX_NONE;
+ }
+
+ switch (MONKEY_GET_TYPE(thisx)) {
+ case MONKEY_0:
+ if (!Flags_GetSwitch(play, MONKEY_GET_SWITCH_FLAG(&this->picto.actor)) ||
+ Flags_GetSwitch(play, MONKEY_GET_SWITCH_FLAG(&this->picto.actor) + 1) ||
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_09_80)) {
+ Actor_Kill(&this->picto.actor);
+ return;
+ }
+ break;
+
+ case MONKEY_OUTSIDEWOODS:
+ case MONKEY_OUTSIDEPALACE:
+ if (Flags_GetSwitch(play, MONKEY_GET_SWITCH_FLAG(&this->picto.actor))) {
+ Actor_Kill(thisx);
+ return;
+ }
+ break;
+
+ case MONKEY_OUTSIDECHAMBER:
+ if (Flags_GetSwitch(play, MONKEY_GET_SWITCH_FLAG(&this->picto.actor)) ||
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_29_80)) {
+ Actor_Kill(thisx);
+ return;
+ }
+ break;
+
+ case MONKEY_TIED_UP:
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_09_80) || CHECK_WEEKEVENTREG(WEEKEVENTREG_23_20)) {
+ Actor_Kill(thisx);
+ return;
+ }
+ break;
+
+ case MONKEY_HANGING:
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_09_80) || CHECK_WEEKEVENTREG(WEEKEVENTREG_23_20)) {
+ Actor_Kill(thisx);
+ return;
+ }
+ break;
+
+ case MONKEY_8:
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_23_20) || CHECK_WEEKEVENTREG(WEEKEVENTREG_29_80)) {
+ Actor_Kill(thisx);
+ return;
+ }
+ break;
+
+ case MONKEY_AFTER_SAVED:
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_29_80)) {
+ Actor_Kill(thisx);
+ return;
+ }
+ break;
+
+ case MONKEY_BY_WITCH:
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_79_02) || CHECK_WEEKEVENTREG(WEEKEVENTREG_SAVED_KOUME) ||
+ Flags_GetSwitch(play, MONKEY_GET_SWITCH_FLAG(&this->picto.actor))) {
+ Actor_Kill(thisx);
+ return;
+ }
+ break;
+
+ case MONKEY_WOODS_GUIDE:
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_79_02) || CHECK_WEEKEVENTREG(WEEKEVENTREG_SAVED_KOUME)) {
+ Actor_Kill(thisx);
+ return;
+ }
+ if (EnMnk_AlreadyExists(this, play)) {
+ Actor_Kill(thisx);
+ return;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ switch (MONKEY_GET_TYPE(thisx)) {
+ case MONKEY_0:
+ EnMnk_Monkey_SetupWaitToRunAndWaitAtEachPoint(this, play);
+ break;
+
+ case MONKEY_OUTSIDEWOODS:
+ this->actionFunc = EnMnk_Monkey_WaitOutsideWoods;
+ CLEAR_EVENTINF(EVENTINF_25);
+ CLEAR_EVENTINF(EVENTINF_26);
+ this->picto.actor.textId = 0x7D0;
+ EnMnk_Monkey_StartInvisible(this, play);
+ break;
+
+ case MONKEY_OUTSIDECHAMBER:
+ this->picto.actor.textId = 0x7D3;
+ this->actionFunc = EnMnk_Monkey_WaitOutsideChamber;
+ EnMnk_Monkey_StartInvisible(this, play);
+ this->collider.dim.radius = 120;
+ break;
+
+ case MONKEY_BY_WITCH:
+ EnMnk_Monkey_SetAnim(this, 0);
+ this->actionFunc = EnMnk_Monkey_WaitToFollowPath;
+ this->unk_3C8 = 0;
+ this->flags |= MONKEY_FLAGS_2;
+ this->picto.actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ this->picto.actor.velocity.y = 0.0f;
+ this->picto.actor.terminalVelocity = 0.0f;
+ this->picto.actor.gravity = 0.0f;
+ break;
+
+ case MONKEY_OUTSIDEPALACE:
+ EnMnk_Monkey_SetAnim(this, 0);
+ this->actionFunc = EnMnk_Monkey_WaitToFollowPath;
+ this->unk_3C8 = 0;
+ break;
+
+ case MONKEY_TIED_UP:
+ EnMnk_MonkeyTiedUp_Init(thisx, play);
+ break;
+
+ case MONKEY_HANGING:
+ EnMnk_MonkeyHanging_Init(thisx, play);
+ break;
+
+ case MONKEY_WOODS_GUIDE:
+ this->picto.actor.room = -1;
+ EnMnk_Monkey_SetAnim(this, 0);
+ this->actionFunc = EnMnk_Monkey_WaitToGuideThroughWoods;
+ this->unk_3C8 = 0;
+ this->destPointIndex = 0;
+
+ switch (this->picto.actor.home.rot.x) {
+ case 1:
+ this->picto.actor.textId = 0x7DD;
+ break;
+
+ case 2:
+ this->picto.actor.textId = 0x7DE;
+ break;
+
+ default:
+ this->picto.actor.textId = 0x7DC;
+ break;
+ }
+ break;
+
+ case MONKEY_8:
+ this->actionFunc = func_80AB9084;
+ this->cueId = 0;
+ break;
+
+ case MONKEY_AFTER_SAVED:
+ EnMnk_Monkey_SetAnim(this, 0);
+ this->unk_3C8 = 0;
+ this->actionFunc = EnMnk_Monkey_WaitToTalkAfterSaved;
+ this->picto.actor.textId = 0x8E5;
+ break;
+
+ case MONKEY_10:
+ this->actionFunc = func_80AB92CC;
+ this->cueId = 0;
+ break;
+
+ default:
+ this->actionFunc = EnMnk_DoNothing;
+ break;
+ }
+
+ this->picto.actor.world.rot.x = this->picto.actor.world.rot.z = 0;
+ this->picto.actor.shape.rot.x = this->picto.actor.shape.rot.z = 0;
+ this->picto.validationFunc = EnMnk_ValidatePictograph;
+}
+
+void EnMnk_Destroy(Actor* thisx, PlayState* play) {
+ EnMnk* this = THIS;
+
+ Collider_DestroyCylinder(play, &this->collider);
+ if ((MONKEY_GET_TYPE(&this->picto.actor) == MONKEY_TIED_UP) && (this->flags & MONKEY_FLAGS_2000)) {
+ Item_Give(play, ITEM_SONG_SONATA);
+ CLEAR_EVENTINF(EVENTINF_24);
+ }
+}
+
+s32 EnMnk_AlreadyExists(EnMnk* this, PlayState* play) {
+ Actor* thisActor = &this->picto.actor;
+ Actor* nextActor = NULL;
+ Actor* curActor;
+
+ while (true) {
+ curActor = SubS_FindActor(play, nextActor, ACTORCAT_NPC, ACTOR_EN_MNK);
+ if ((curActor != NULL) && (curActor != thisActor)) {
+ if ((thisActor->home.pos.x == curActor->home.pos.x) && (thisActor->home.pos.y == curActor->home.pos.y) &&
+ (thisActor->home.pos.z == curActor->home.pos.z)) {
+ return true;
+ }
+ nextActor = curActor->next;
+ continue;
+ }
+
+ if ((curActor != NULL) && (curActor->next != NULL)) {
+ nextActor = curActor->next;
+ continue;
+ }
+
+ return false;
+ };
+}
+
+s32 EnMnk_ValidatePictograph(PlayState* play, Actor* thisx) {
+ return Snap_ValidatePictograph(play, thisx, PICTO_VALID_MONKEY, &thisx->focus.pos, &thisx->shape.rot, 50.0f, 500.0f,
+ -1);
+}
+
+void EnMnk_PlayWalkSfx(EnMnk* this) {
+ if (Animation_OnFrame(&this->skelAnime, 1.0f)) {
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EV_MONKEY_VO_WALK);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EV_MONKEY_WALK);
+ }
+}
+
+void EnMnk_PlayWaterWalkSfx(EnMnk* this) {
+ if (Animation_OnFrame(&this->skelAnime, 1.0f)) {
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EV_MONKEY_VO_WALK);
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EV_WALK_WATER);
+ }
+}
+
+void EnMnk_SpawnWaterEffects(EnMnk* this, PlayState* play) {
+ Vec3f* effSpawnPos = &this->picto.actor.world.pos;
+
+ EffectSsGRipple_Spawn(play, effSpawnPos, 150, 500, 0);
+ EffectSsGSplash_Spawn(play, effSpawnPos, NULL, NULL, 0, 200);
+}
+
+void EnMnk_StartNextPath(EnMnk* this, PlayState* play) {
+ s32 pathIndex;
+
+ EnMnk_Monkey_SetAnim(this, 1);
+ pathIndex = this->pathIndex;
+ this->picto.actor.speed = 0.0f;
+ if (pathIndex != PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[pathIndex];
+ } else {
+ this->path = NULL;
+ }
+}
+
+s32 EnMnk_FollowPath(EnMnk* this, u16 flags) {
+ Path* path;
+ Vec3s* destPoint;
+ f32 dx;
+ f32 dz;
+ f32 distSq;
+ s16 arcTan;
+
+ if (this->path == NULL) {
+ return MONKEY_FOLLOWPATH_RESULT_SHORTRANGE_REACHEDPOINT;
+ }
+
+ path = this->path;
+ destPoint = &((Vec3s*)Lib_SegmentedToVirtual(path->points))[this->destPointIndex];
+ dx = destPoint->x - this->picto.actor.world.pos.x;
+ dz = destPoint->z - this->picto.actor.world.pos.z;
+ arcTan = Math_Atan2S_XY(dz, dx);
+ Math_SmoothStepToS(&this->picto.actor.world.rot.y, arcTan, 2, 0xBB8, 0xC8);
+ Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->picto.actor.world.rot.y, 2, 0xBB8, 0xC8);
+ arcTan -= this->picto.actor.world.rot.y;
+
+ if (ABS_ALT(arcTan) < 0x3E8) {
+ if (this->picto.actor.speed < 7.5f) {
+ this->picto.actor.speed += 1.5f;
+ }
+ } else {
+ if (this->picto.actor.speed > 4.0f) {
+ this->picto.actor.speed -= 1.5f;
+ } else if (this->picto.actor.speed < 2.0f) {
+ this->picto.actor.speed += 1.5f;
+ }
+ }
+
+ distSq = SQ(dx) + SQ(dz);
+ if (distSq < SQ(8.0f)) {
+ this->destPointIndex++;
+ this->picto.actor.world.pos.x = destPoint->x;
+ this->picto.actor.world.pos.z = destPoint->z;
+ if (this->destPointIndex >= path->count) {
+ return MONKEY_FOLLOWPATH_RESULT_SHORTRANGE_FINISHEDPATH;
+ }
+ if (flags & MONKEY_FOLLOWPATH_FLAGS_REACHNEXTPOINT) {
+ return MONKEY_FOLLOWPATH_RESULT_SHORTRANGE_REACHEDPOINT;
+ }
+ } else if ((flags & MONKEY_FOLLOWPATH_FLAGS_LONGRANGE) && (distSq < SQ(20.0f))) {
+ this->destPointIndex++;
+ if (this->destPointIndex >= path->count) {
+ return MONKEY_FOLLOWPATH_RESULT_LONGRANGE_FINISHEDPATH;
+ }
+ if (flags & MONKEY_FOLLOWPATH_FLAGS_REACHNEXTPOINT) {
+ return MONKEY_FOLLOWPATH_RESULT_LONGRANGE_REACHEDPOINT;
+ }
+ }
+ return MONKEY_FOLLOWPATH_RESULT_FOLLOWING;
+}
+
+void func_80AB5F6C(EnMnk* this) {
+ s32 pad;
+ u32 animIndex;
+
+ this->picto.actor.shape.rot.y = this->picto.actor.yawTowardsPlayer;
+ this->picto.actor.world.rot.y = this->picto.actor.yawTowardsPlayer;
+ SkelAnime_Update(&this->skelAnime);
+
+ if ((s32)this->skelAnime.curFrame == 0) {
+ if (this->unk_3C8 < 0) {
+ EnMnk_Monkey_ChangeAnim(this, 100, ANIMMODE_LOOP, 0.0f);
+ this->unk_3C8++;
+ } else if (this->unk_3C8 > 0) {
+ this->unk_3C8--;
+ } else {
+
+ do {
+ animIndex = D_80AB9DD8[(s32)Rand_ZeroFloat(7.0f)];
+ } while (animIndex == this->unk_3D4);
+
+ EnMnk_Monkey_ChangeAnim(this, animIndex, ANIMMODE_LOOP, 0.0f);
+
+ switch (animIndex) {
+ case 100:
+ this->unk_3C8 = -(s32)(Rand_ZeroFloat(6.0f) + 6.0f);
+ break;
+
+ case 2:
+ this->unk_3C8 = Rand_ZeroFloat(6.0f) + 6.0f;
+ break;
+
+ default:
+ this->unk_3C8 = Rand_ZeroFloat(2.0f) + 1.0f;
+ break;
+ }
+
+ this->unk_3D4 = animIndex;
+ }
+ }
+}
+
+void func_80AB60FC(EnMnk* this, PlayState* play) {
+ f32 depthInWater;
+
+ SkelAnime_Update(&this->skelAnime);
+ if (EnMnk_FollowPath(this, 0) != MONKEY_FOLLOWPATH_RESULT_FOLLOWING) {
+ this->pathIndex = this->path->additionalPathIndex;
+ if (this->pathIndex == ADDITIONAL_PATH_INDEX_NONE) {
+ Flags_SetSwitch(play, MONKEY_GET_SWITCH_FLAG(&this->picto.actor) + 1);
+ Actor_Kill(&this->picto.actor);
+ return;
+ }
+ }
+
+ depthInWater = this->picto.actor.depthInWater;
+ if (depthInWater > 0.0f) {
+ this->picto.actor.world.pos.y += depthInWater;
+ if ((s32)this->skelAnime.curFrame == 0) {
+ EnMnk_SpawnWaterEffects(this, play);
+ }
+ EnMnk_PlayWaterWalkSfx(this);
+ return;
+ }
+ if (this->picto.actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ EnMnk_PlayWalkSfx(this);
+ }
+}
+
+void func_80AB61E8(EnMnk* this, PlayState* play) {
+ this->picto.actor.world.rot.y = this->picto.actor.yawTowardsPlayer;
+ Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->picto.actor.world.rot.y, 2, 0xBB8, 0xC8);
+
+ if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
+ switch (play->msgCtx.currentTextId) {
+ case 0x7D9:
+ Message_ContinueTextbox(play, 0x7DA);
+ EnMnk_Monkey_SetAnim(this, 3);
+ break;
+
+ case 0x7DA:
+ Message_ContinueTextbox(play, 0x7DB);
+ EnMnk_Monkey_SetAnim(this, 2);
+ break;
+
+ case 0x7DB:
+ Message_CloseTextbox(play);
+ EnMnk_StartNextPath(this, play);
+ this->destPointIndex = 0;
+ this->actionFunc = func_80AB60FC;
+ this->picto.actor.velocity.y = -20.0f;
+ this->picto.actor.terminalVelocity = -20.0f;
+ break;
+
+ default:
+ break;
+ }
+ }
+ SkelAnime_Update(&this->skelAnime);
+}
+
+void func_80AB6304(EnMnk* this, PlayState* play) {
+ this->picto.actor.world.rot.y = this->picto.actor.yawTowardsPlayer;
+ Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->picto.actor.world.rot.y, 2, 0xBB8, 0xC8);
+
+ if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
+ this->flags |= MONKEY_FLAGS_4;
+ }
+
+ SkelAnime_Update(&this->skelAnime);
+ if (this->flags & MONKEY_FLAGS_4) {
+ Message_ContinueTextbox(play, 0x7D9);
+ EnMnk_Monkey_SetAnim(this, 7);
+ this->actionFunc = func_80AB61E8;
+ this->flags &= ~MONKEY_FLAGS_4;
+ }
+}
+
+void func_80AB63CC(EnMnk* this, PlayState* play) {
+ s32 pad;
+
+ if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
+ this->flags |= MONKEY_FLAGS_4;
+ }
+
+ this->picto.actor.world.rot.y = this->picto.actor.yawTowardsPlayer;
+ Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->picto.actor.world.rot.y, 2, 0xBB8, 0xC8);
+
+ if (SkelAnime_Update(&this->skelAnime)) {
+ Animation_PlayLoop(&this->skelAnime, &object_mnk_Anim_008814);
+ this->actionFunc = func_80AB6304;
+ }
+
+ if (this->picto.actor.velocity.y < 0.0f) {
+ this->flags &= ~MONKEY_FLAGS_2;
+ }
+
+ if (Animation_OnFrame(&this->skelAnime, 5.0f)) {
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EV_MONKEY_VO_JOY);
+ }
+}
+
+void func_80AB64B8(EnMnk* this, PlayState* play) {
+ if (!(this->flags & MONKEY_FLAGS_8)) {
+ SkelAnime_Update(&this->skelAnime);
+ this->picto.actor.world.rot.y = this->picto.actor.yawTowardsPlayer;
+ Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->picto.actor.world.rot.y, 2, 0xBB8, 0xC8);
+ }
+
+ if (Actor_ProcessTalkRequest(&this->picto.actor, &play->state)) {
+ this->picto.actor.flags &= ~ACTOR_FLAG_10000;
+ this->actionFunc = func_80AB63CC;
+ EnMnk_Monkey_ChangeAnim(this, 9, ANIMMODE_ONCE, -5.0f);
+ this->picto.actor.velocity.y = 3.6f;
+ this->picto.actor.terminalVelocity = -9.0f;
+ this->picto.actor.gravity = -0.4f;
+ this->flags &= ~MONKEY_FLAGS_1;
+ this->flags &= ~MONKEY_FLAGS_4;
+ } else if (this->picto.actor.xzDistToPlayer < 100.0f) {
+ this->picto.actor.flags |= ACTOR_FLAG_10000;
+ Actor_OfferTalk(&this->picto.actor, play, 120.0f);
+ } else {
+ this->picto.actor.flags &= ~ACTOR_FLAG_10000;
+ }
+}
+
+void EnMnk_Monkey_RunAndWaitAtEachPoint(EnMnk* this, PlayState* play) {
+ MonkeyFollowPathResult followPathResult;
+
+ SkelAnime_Update(&this->skelAnime);
+ followPathResult =
+ EnMnk_FollowPath(this, MONKEY_FOLLOWPATH_FLAGS_REACHNEXTPOINT | MONKEY_FOLLOWPATH_FLAGS_LONGRANGE);
+ if (followPathResult != MONKEY_FOLLOWPATH_RESULT_FOLLOWING) {
+ if ((followPathResult == MONKEY_FOLLOWPATH_RESULT_SHORTRANGE_FINISHEDPATH) ||
+ (followPathResult == MONKEY_FOLLOWPATH_RESULT_LONGRANGE_FINISHEDPATH)) {
+ this->pathIndex = this->path->additionalPathIndex;
+ if (this->pathIndex == ADDITIONAL_PATH_INDEX_NONE) {
+ this->pathIndex = PATH_INDEX_NONE;
+ }
+ this->path = &play->setupPathList[this->pathIndex];
+ this->destPointIndex = 0;
+ EnMnk_Monkey_SetAnim(this, 0);
+ this->actionFunc = func_80AB64B8;
+ this->picto.actor.terminalVelocity = -9.0f;
+ this->picto.actor.velocity.y = 0.0f;
+ this->picto.actor.speed = 0.0f;
+ this->picto.actor.gravity = -1.0f;
+ } else if (this->picto.actor.xzDistToPlayer > 160.0f) {
+ this->actionFunc = EnMnk_Monkey_WaitToRunAndWaitAtEachPoint;
+ this->flags |= MONKEY_FLAGS_1 | MONKEY_FLAGS_2;
+ this->picto.actor.speed = 0.0f;
+ EnMnk_Monkey_SetAnim(this, 9);
+ return;
+ }
+ }
+
+ if (this->flags & MONKEY_FLAGS_40) {
+ EnMnk_PlayWalkSfx(this);
+ } else {
+ if ((s32)this->skelAnime.curFrame == 0) {
+ EnMnk_SpawnWaterEffects(this, play);
+ }
+ EnMnk_PlayWaterWalkSfx(this);
+ }
+}
+
+void EnMnk_Monkey_WaitToRunAndWaitAtEachPoint(EnMnk* this, PlayState* play) {
+ s32 pad[2];
+
+ this->picto.actor.shape.rot.y = this->picto.actor.yawTowardsPlayer;
+ this->picto.actor.world.rot.y = this->picto.actor.yawTowardsPlayer;
+ SkelAnime_Update(&this->skelAnime);
+
+ if (this->picto.actor.xzDistToPlayer < 160.0f) {
+ this->flags |= MONKEY_FLAGS_80;
+ EnMnk_StartNextPath(this, play);
+ this->actionFunc = EnMnk_Monkey_RunAndWaitAtEachPoint;
+ this->flags &= ~MONKEY_FLAGS_1;
+ this->flags &= ~MONKEY_FLAGS_2;
+ }
+
+ if (!(this->flags & MONKEY_FLAGS_40)) {
+ if (((s32)this->skelAnime.curFrame == 0) || Animation_OnFrame(&this->skelAnime, 14.0f)) {
+ EnMnk_SpawnWaterEffects(this, play);
+ }
+ }
+
+ if (Animation_OnFrame(&this->skelAnime, 5.0f)) {
+ if ((this->unk_3D4 % 4) != 0) {
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EV_MONKEY_VO_JOY);
+ }
+ this->unk_3D4++;
+ }
+}
+
+void EnMnk_Monkey_TalkAfterRun(EnMnk* this, PlayState* play) {
+ if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
+ this->flags |= MONKEY_FLAGS_4;
+ Message_CloseTextbox(play);
+ }
+
+ if (SkelAnime_Update(&this->skelAnime)) {
+ if (this->flags & MONKEY_FLAGS_4) {
+ EnMnk_Monkey_SetAnim(this, 0);
+ this->actionFunc = EnMnk_Monkey_WaitToTalkAfterRun;
+ } else {
+ Animation_PlayOnce(&this->skelAnime, &object_mnk_Anim_009CC0);
+ }
+ }
+}
+
+void EnMnk_Monkey_WaitToTalkAfterRun(EnMnk* this, PlayState* play) {
+ s32 pad[2];
+
+ this->picto.actor.shape.rot.y = this->picto.actor.yawTowardsPlayer;
+ this->picto.actor.world.rot.y = this->picto.actor.yawTowardsPlayer;
+ SkelAnime_Update(&this->skelAnime);
+ if (Actor_ProcessTalkRequest(&this->picto.actor, &play->state)) {
+ Animation_PlayOnce(&this->skelAnime, &object_mnk_Anim_009CC0);
+ this->actionFunc = EnMnk_Monkey_TalkAfterRun;
+ this->flags &= ~MONKEY_FLAGS_4;
+ } else if (this->picto.actor.xzDistToPlayer < 100.0f) {
+ Actor_OfferTalk(&this->picto.actor, play, 120.0f);
+ }
+}
+
+void EnMnk_Monkey_Run(EnMnk* this, PlayState* play) {
+ s32 switchFlag;
+
+ SkelAnime_Update(&this->skelAnime);
+ if (EnMnk_FollowPath(this, MONKEY_FOLLOWPATH_FLAGS_LONGRANGE) != MONKEY_FOLLOWPATH_RESULT_FOLLOWING) {
+ EnMnk_Monkey_SetAnim(this, 0);
+ this->picto.actor.velocity.y = -9.0f;
+ this->picto.actor.terminalVelocity = -9.0f;
+ this->picto.actor.gravity = -1.0f;
+ this->picto.actor.speed = 0.0f;
+ if (MONKEY_GET_TYPE(&this->picto.actor) == MONKEY_OUTSIDECHAMBER) {
+ switchFlag = MONKEY_GET_SWITCH_FLAG(&this->picto.actor);
+ if (switchFlag != 0x7F) {
+ Flags_SetSwitch(play, switchFlag + 1);
+ }
+ Actor_Kill(&this->picto.actor);
+ } else {
+ this->picto.actor.textId = 0x7D2;
+ this->actionFunc = EnMnk_Monkey_WaitToTalkAfterRun;
+ }
+ }
+
+ if (this->picto.actor.depthInWater > 0.0f) {
+ this->picto.actor.world.pos.y += this->picto.actor.depthInWater;
+ if ((s32)this->skelAnime.curFrame == 0) {
+ EnMnk_SpawnWaterEffects(this, play);
+ }
+ EnMnk_PlayWaterWalkSfx(this);
+ } else if (this->picto.actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ EnMnk_PlayWalkSfx(this);
+ }
+}
+
+void EnMnk_Monkey_WaitToRun(EnMnk* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ if (CHECK_EVENTINF(EVENTINF_25)) {
+ EnMnk_StartNextPath(this, play);
+ this->destPointIndex = 0;
+ this->actionFunc = EnMnk_Monkey_Run;
+ this->collider.dim.radius = 15;
+ Collider_UpdateCylinder(&this->picto.actor, &this->collider);
+ this->flags &= ~MONKEY_FLAGS_8;
+ }
+}
+
+void EnMnk_Monkey_SetupRunAfterTalk(EnMnk* this, PlayState* play) {
+ Message_CloseTextbox(play);
+ EnMnk_StartNextPath(this, play);
+ this->destPointIndex = 0;
+ this->actionFunc = EnMnk_Monkey_Run;
+ this->collider.dim.radius = 15;
+ Collider_UpdateCylinder(&this->picto.actor, &this->collider);
+ this->unk_3E0 = 0;
+ this->flags &= ~MONKEY_FLAGS_8;
+}
+
+void EnMnk_Monkey_TalkAfterApproach(EnMnk* this, PlayState* play) {
+ if (SkelAnime_Update(&this->skelAnime)) {
+ EnMnk_Monkey_ChangeAnim(this, 100, ANIMMODE_ONCE, 0.0f);
+ SkelAnime_Update(&this->skelAnime);
+ }
+
+ switch (Message_GetState(&play->msgCtx)) {
+ case TEXT_STATE_CHOICE:
+ if (Message_ShouldAdvance(play)) {
+ switch (play->msgCtx.choiceIndex) {
+ case 1:
+ Audio_PlaySfx_MessageDecide();
+ EnMnk_Monkey_ChangeAnim(this, 10, ANIMMODE_ONCE, -5.0f);
+ Message_ContinueTextbox(play, 0x7D7);
+ break;
+
+ case 0:
+ Audio_PlaySfx_MessageCancel();
+ EnMnk_Monkey_SetAnim(this, 7);
+ Message_ContinueTextbox(play, 0x7D6);
+ this->unk_3E0 = 6;
+ break;
+ }
+ }
+ break;
+
+ case TEXT_STATE_5:
+ if (Message_ShouldAdvance(play)) {
+ switch (play->msgCtx.currentTextId) {
+ case 0x7D0:
+ EnMnk_Monkey_SetAnim(this, 3);
+ Message_ContinueTextbox(play, 0x7D1);
+ this->unk_3E0 = 5;
+ break;
+
+ case 0x7D3:
+ case 0x7D6:
+ EnMnk_Monkey_SetAnim(this, 3);
+ Message_ContinueTextbox(play, 0x7D4);
+ break;
+
+ case 0x7D1:
+ EnMnk_Monkey_SetAnim(this, 7);
+ Message_ContinueTextbox(play, 0x7D2);
+ this->unk_3E0 = 4;
+ break;
+
+ case 0x7D4:
+ EnMnk_Monkey_SetAnim(this, 5);
+ Message_ContinueTextbox(play, 0x7D5);
+ this->unk_3E0 = 6;
+ break;
+
+ case 0x7D2:
+ SET_EVENTINF(EVENTINF_25);
+ EnMnk_Monkey_SetupRunAfterTalk(this, play);
+ SET_WEEKEVENTREG(WEEKEVENTREG_79_02);
+ break;
+
+ case 0x7D7:
+ EnMnk_Monkey_SetupRunAfterTalk(this, play);
+ SET_WEEKEVENTREG(WEEKEVENTREG_08_02);
+ break;
+
+ default:
+ break;
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void EnMnk_Monkey_MoveRelativeToPlayer(EnMnk* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+ s16 angleToPlayer = Math_Atan2S_XY(player->actor.world.pos.z - this->picto.actor.home.pos.z,
+ player->actor.world.pos.x - this->picto.actor.home.pos.x);
+
+ this->picto.actor.shape.rot.y = angleToPlayer;
+
+ if (this->flags & MONKEY_FLAGS_10) {
+ this->picto.actor.shape.rot.y = (this->picto.actor.shape.rot.y + 0x8000) & 0xFFFF;
+ }
+
+ this->picto.actor.world.rot.y = this->picto.actor.shape.rot.y;
+ this->picto.actor.world.pos.x =
+ (Math_SinS(angleToPlayer) * this->approachPlayerRadius) + this->picto.actor.home.pos.x;
+ this->picto.actor.world.pos.z =
+ (Math_CosS(angleToPlayer) * this->approachPlayerRadius) + this->picto.actor.home.pos.z;
+}
+
+void EnMnk_Monkey_UnapproachPlayer(EnMnk* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ this->approachPlayerRadius -= 5.0f;
+ EnMnk_Monkey_MoveRelativeToPlayer(this, play);
+ if (this->approachPlayerRadius < 4.0f) {
+ EnMnk_Monkey_SetAnim(this, 0);
+ this->actionFunc = EnMnk_Monkey_WaitForPlayerApproach;
+ this->flags &= ~MONKEY_FLAGS_10;
+ this->approachPlayerRadius = 0.0f;
+ }
+ EnMnk_PlayWalkSfx(this);
+ if ((MONKEY_GET_TYPE(&this->picto.actor) == MONKEY_OUTSIDEWOODS) &&
+ (MONKEY_GET_SWITCH_FLAG(&this->picto.actor) != 0x7F) &&
+ Flags_GetSwitch(play, MONKEY_GET_SWITCH_FLAG(&this->picto.actor))) {
+ EnMnk_Monkey_SetAnim(this, 2);
+ this->actionFunc = EnMnk_Monkey_WaitToRun;
+ }
+}
+
+void EnMnk_Monkey_WaitToTalkAfterApproach(EnMnk* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ EnMnk_Monkey_MoveRelativeToPlayer(this, play);
+
+ if (Actor_ProcessTalkRequest(&this->picto.actor, &play->state)) {
+ if (MONKEY_GET_TYPE(&this->picto.actor) == MONKEY_OUTSIDECHAMBER) {
+ EnMnk_Monkey_SetAnim(this, 2);
+ } else {
+ EnMnk_Monkey_SetAnim(this, 5);
+ }
+ this->unk_3E0 = 6;
+ this->actionFunc = EnMnk_Monkey_TalkAfterApproach;
+ if (MONKEY_GET_SWITCH_FLAG(&this->picto.actor) != 0x7F) {
+ Flags_SetSwitch(play, MONKEY_GET_SWITCH_FLAG(&this->picto.actor));
+ }
+ } else if ((MONKEY_GET_TYPE(&this->picto.actor) == MONKEY_OUTSIDEWOODS) &&
+ (MONKEY_GET_SWITCH_FLAG(&this->picto.actor) != 0x7F) &&
+ Flags_GetSwitch(play, MONKEY_GET_SWITCH_FLAG(&this->picto.actor))) {
+ EnMnk_Monkey_SetAnim(this, 2);
+ this->actionFunc = EnMnk_Monkey_WaitToRun;
+ } else if (this->picto.actor.xzDistToPlayer > 150.0f) {
+ EnMnk_Monkey_SetAnim(this, 1);
+ this->flags |= MONKEY_FLAGS_10;
+ this->actionFunc = EnMnk_Monkey_UnapproachPlayer;
+ } else if (this->picto.actor.xzDistToPlayer < 100.0f) {
+ Actor_OfferTalk(&this->picto.actor, play, 120.0f);
+ }
+}
+
+void EnMnk_Monkey_ApproachPlayer(EnMnk* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ this->approachPlayerRadius += 5.0f;
+ EnMnk_Monkey_MoveRelativeToPlayer(this, play);
+
+ if (this->approachPlayerRadius > 84.0f) {
+ if (MONKEY_GET_TYPE(&this->picto.actor) == MONKEY_OUTSIDECHAMBER) {
+ EnMnk_Monkey_SetAnim(this, 7);
+ } else {
+ EnMnk_Monkey_SetAnim(this, 2);
+ }
+ this->actionFunc = EnMnk_Monkey_WaitToTalkAfterApproach;
+ }
+
+ EnMnk_PlayWalkSfx(this);
+
+ if ((MONKEY_GET_TYPE(&this->picto.actor) == MONKEY_OUTSIDEWOODS) &&
+ (MONKEY_GET_SWITCH_FLAG(&this->picto.actor) != 0x7F) &&
+ Flags_GetSwitch(play, MONKEY_GET_SWITCH_FLAG(&this->picto.actor))) {
+ EnMnk_Monkey_SetAnim(this, 2);
+ this->actionFunc = EnMnk_Monkey_WaitToRun;
+ }
+}
+
+void EnMnk_Monkey_WaitForPlayerApproach(EnMnk* this, PlayState* play) {
+ EnMnk_Monkey_MoveRelativeToPlayer(this, play);
+ SkelAnime_Update(&this->skelAnime);
+
+ if (this->picto.actor.xzDistToPlayer < 200.0f) {
+ EnMnk_Monkey_SetAnim(this, 1);
+ this->actionFunc = EnMnk_Monkey_ApproachPlayer;
+ }
+
+ if ((MONKEY_GET_TYPE(&this->picto.actor) == MONKEY_OUTSIDEWOODS) &&
+ (MONKEY_GET_SWITCH_FLAG(&this->picto.actor) != 0x7F) &&
+ Flags_GetSwitch(play, MONKEY_GET_SWITCH_FLAG(&this->picto.actor))) {
+ EnMnk_Monkey_SetAnim(this, 2);
+ this->actionFunc = EnMnk_Monkey_WaitToRun;
+ }
+}
+
+void EnMnk_Monkey_Drop(EnMnk* this, PlayState* play) {
+ if (((this->picto.actor.world.pos.y - this->picto.actor.home.pos.y) < 40.0f) &&
+ SkelAnime_Update(&this->skelAnime)) {
+ EnMnk_Monkey_SetAnim(this, 0);
+ this->actionFunc = EnMnk_Monkey_WaitForPlayerApproach;
+
+ if (MONKEY_GET_TYPE(&this->picto.actor) == MONKEY_OUTSIDEWOODS) {
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EV_MONKEY_WALK);
+ }
+ }
+}
+
+void EnMnk_Monkey_SetupDrop(EnMnk* this) {
+ this->flags &= ~MONKEY_FLAGS_20;
+ this->picto.actor.world.pos.y = this->picto.actor.home.pos.y + 200.0f;
+ this->actionFunc = EnMnk_Monkey_Drop;
+ this->picto.actor.velocity.y = -10.0f;
+ this->picto.actor.terminalVelocity = -10.0f;
+ this->picto.actor.flags |= ACTOR_FLAG_TARGETABLE;
+ this->picto.actor.draw = EnMnk_Draw;
+ Animation_Change(&this->skelAnime, &object_mnk_Anim_008814, 1.0f, 10.0f,
+ Animation_GetLastFrame(&object_mnk_Anim_008814), ANIMMODE_ONCE, 0.0f);
+}
+
+void EnMnk_Monkey_WaitOutsideWoods(EnMnk* this, PlayState* play) {
+ this->picto.actor.shape.rot.y = this->picto.actor.yawTowardsPlayer;
+ this->picto.actor.world.rot.y = this->picto.actor.yawTowardsPlayer;
+
+ if (((this->picto.actor.xzDistToPlayer < 200.0f) && CHECK_WEEKEVENTREG(WEEKEVENTREG_SAVED_KOUME)) ||
+ CHECK_EVENTINF(EVENTINF_26)) {
+ SET_EVENTINF(EVENTINF_26);
+ EnMnk_Monkey_SetupDrop(this);
+ }
+}
+
+void EnMnk_Monkey_WaitOutsideChamber(EnMnk* this, PlayState* play) {
+ this->picto.actor.shape.rot.y = this->picto.actor.yawTowardsPlayer;
+ this->picto.actor.world.rot.y = this->picto.actor.yawTowardsPlayer;
+ if ((this->picto.actor.xzDistToPlayer < 200.0f) &&
+ ((CHECK_WEEKEVENTREG(WEEKEVENTREG_18_01) || CHECK_WEEKEVENTREG(WEEKEVENTREG_88_01)) && (play->curSpawn != 0))) {
+ EnMnk_Monkey_SetupDrop(this);
+ }
+}
+
+void EnMnk_Monkey_FollowPathAndWait(EnMnk* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ if (EnMnk_FollowPath(this, MONKEY_FOLLOWPATH_FLAGS_LONGRANGE) != MONKEY_FOLLOWPATH_RESULT_FOLLOWING) {
+ this->pathIndex = this->path->additionalPathIndex;
+ if (this->pathIndex == ADDITIONAL_PATH_INDEX_NONE) {
+ Flags_SetSwitch(play, MONKEY_GET_SWITCH_FLAG(&this->picto.actor));
+ Actor_Kill(&this->picto.actor);
+ return;
+ }
+ EnMnk_Monkey_SetAnim(this, 0);
+ this->actionFunc = EnMnk_Monkey_WaitToFollowPath;
+ this->picto.actor.speed = 0.0f;
+ }
+ EnMnk_PlayWalkSfx(this);
+}
+
+void EnMnk_Monkey_WaitToFollowPath(EnMnk* this, PlayState* play) {
+ if ((this->picto.actor.playerHeightRel > -10.0f) && (this->picto.actor.xzDistToPlayer < 160.0f)) {
+ EnMnk_StartNextPath(this, play);
+ this->destPointIndex = 0;
+ this->actionFunc = EnMnk_Monkey_FollowPathAndWait;
+ } else {
+ func_80AB5F6C(this);
+ }
+}
+
+s32 EnMnk_PlayerIsInTalkRange(EnMnk* this, PlayState* play) {
+ s32 absYawTowardsPlayer;
+
+ if ((this->picto.actor.xzDistToPlayer < 100.0f) && (this->picto.actor.xzDistToPlayer > 20.0f)) {
+ absYawTowardsPlayer = ABS_ALT(this->picto.actor.yawTowardsPlayer);
+ if ((absYawTowardsPlayer > 0x4000) && Player_IsFacingActor(&this->picto.actor, 0x3000, play)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+void EnMnk_MonkeyTiedUp_TeachSong(EnMnk* this, PlayState* play) {
+ s32 pad;
+
+ SkelAnime_Update(&this->skelAnime);
+ SkelAnime_Update(&this->propSkelAnime);
+
+ switch (play->msgCtx.currentTextId) {
+ case 0x8D9:
+ EnMnk_MonkeyTiedUp_SetNewAnim(this, MONKEY_TIEDUP_ANIM_CONFUSED);
+ break;
+
+ case 0x8DC:
+ case 0x8DF:
+ EnMnk_MonkeyTiedUp_SetNewAnim(this, MONKEY_TIEDUP_ANIM_KICKAROUND);
+ break;
+
+ case 0x8DD:
+ EnMnk_MonkeyTiedUp_SetNewAnim(this, MONKEY_TIEDUP_ANIM_SMALLCLAPFEET);
+ this->unk_3E0 = 5;
+ break;
+
+ case 0x8DE:
+ EnMnk_MonkeyTiedUp_SetNewAnim(this, MONKEY_TIEDUP_ANIM_CONFUSED);
+ break;
+
+ case 0x8E0:
+ case 0x1B66:
+ EnMnk_MonkeyTiedUp_SetNewAnim(this, MONKEY_TIEDUP_ANIM_LARGECLAPFEET);
+ break;
+
+ case 0x8E1:
+ EnMnk_MonkeyTiedUp_SetNewAnim(this, MONKEY_TIEDUP_ANIM_KICKUPANDDOWN);
+ break;
+
+ case 0x1B5C:
+ EnMnk_MonkeyTiedUp_SetNewAnim(this, MONKEY_TIEDUP_ANIM_SING);
+ break;
+
+ case 0x8E2:
+ EnMnk_MonkeyTiedUp_SetNewAnim(this, MONKEY_TIEDUP_ANIM_KICKAROUND);
+ this->unk_3E0 = 0;
+ break;
+
+ default:
+ break;
+ }
+
+ if ((Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE) && !(this->flags & MONKEY_FLAGS_4000) &&
+ Message_ShouldAdvance(play)) {
+
+ switch (play->msgCtx.choiceIndex) {
+ case 1:
+ this->picto.actor.csId = this->csIdList[5];
+ this->csId = 5;
+ SET_WEEKEVENTREG(WEEKEVENTREG_09_80);
+ this->flags |= MONKEY_FLAGS_2000;
+ Audio_PlaySfx_MessageDecide();
+ break;
+
+ case 0:
+ Audio_PlaySfx_MessageCancel();
+ this->picto.actor.csId = this->csIdList[4];
+ this->csId = 4;
+ break;
+
+ default:
+ break;
+ }
+ this->flags |= MONKEY_FLAGS_4000;
+ }
+
+ if (this->picto.actor.csId != CS_ID_NONE) {
+ if (CutsceneManager_IsNext(this->picto.actor.csId)) {
+ this->flags &= ~MONKEY_FLAGS_4000;
+ CutsceneManager_StartWithPlayerCs(this->picto.actor.csId, &this->picto.actor);
+
+ switch (this->csId) {
+ case 2:
+ this->csId = 3;
+ break;
+
+ case 4:
+ this->csId = 3;
+ break;
+
+ case 5:
+ this->csId = 6;
+ break;
+
+ default:
+ this->picto.actor.csId = CS_ID_NONE;
+ return;
+ }
+ this->picto.actor.csId = this->csIdList[this->csId];
+ } else {
+ CutsceneManager_Queue(this->picto.actor.csId);
+ }
+ }
+}
+
+void EnMnk_MonkeyTiedUp_ReactToWrongInstrument(EnMnk* this, PlayState* play) {
+ Actor* actor = &this->picto.actor;
+
+ SkelAnime_Update(&this->skelAnime);
+ SkelAnime_Update(&this->propSkelAnime);
+
+ if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
+ switch (play->msgCtx.currentTextId) {
+ case 0x8D4:
+ case 0x8DA:
+ case 0x8DB:
+ Message_CloseTextbox(play);
+ this->actionFunc = EnMnk_MonkeyTiedUp_WaitForInstrument;
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
+ EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_WAIT);
+ if (this->csId != CS_ID_NONE) {
+ CutsceneManager_Stop(this->csId);
+ this->picto.actor.csId = this->csIdList[0];
+ this->csId = CS_ID_NONE;
+ return;
+ }
+ break;
+
+ case 0x8D5:
+ Message_ContinueTextbox(play, 0x8DA);
+ EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_CONFUSED);
+ break;
+
+ case 0x8D6:
+ Message_ContinueTextbox(play, 0x8DB);
+ EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_CONFUSED);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ if (actor->csId != CS_ID_NONE) {
+ if (CutsceneManager_IsNext(actor->csId)) {
+ CutsceneManager_Start(actor->csId, actor);
+
+ this->csId = actor->csId;
+ actor->csId = (actor->csId == this->csIdList[0]) ? this->csIdList[1] : CS_ID_NONE;
+ } else {
+ CutsceneManager_Queue(actor->csId);
+ }
+ }
+}
+
+void EnMnk_MonkeyTiedUp_TalkUnused(EnMnk* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ SkelAnime_Update(&this->propSkelAnime);
+ if (Actor_TextboxIsClosing(&this->picto.actor, play)) {
+ this->actionFunc = EnMnk_MonkeyTiedUp_WaitUnused;
+ }
+}
+
+void EnMnk_MonkeyTiedUp_TransitionAfterTalk(EnMnk* this, PlayState* play) {
+ s32 pad;
+
+ SkelAnime_Update(&this->skelAnime);
+ SkelAnime_Update(&this->propSkelAnime);
+ if (play->msgCtx.currentTextId == 0x8CD) {
+ if (this->skelAnime.curFrame <= 17.0f) {
+ this->unk_3E0 = 0;
+ } else {
+ this->unk_3E0 = 2;
+ }
+ }
+
+ if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
+ switch (play->msgCtx.currentTextId) {
+ case 0x8CA:
+ EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_SHAKEHEAD);
+ if (play->curSpawn != 1) {
+ Message_ContinueTextbox(play, 0x8CB);
+ SET_WEEKEVENTREG(WEEKEVENTREG_88_01);
+ } else {
+ Message_ContinueTextbox(play, 0x8EB);
+ this->flags |= MONKEY_FLAGS_1000;
+ }
+ break;
+
+ case 0x8CB:
+ case 0x8EB:
+ case 0x8EC:
+ Message_CloseTextbox(play);
+ this->actionFunc = EnMnk_MonkeyTiedUp_Wait;
+ this->cueId = 4;
+ EnMnk_MonkeyTiedUp_ChangeAnim(this, MONKEY_TIEDUP_ANIM_KICKAROUND, ANIMMODE_ONCE, -5.0f);
+ break;
+
+ case 0x8CC:
+ EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_SHH);
+ this->unk_3E0 = 2;
+ Message_ContinueTextbox(play, 0x8CD);
+ break;
+
+ case 0x8CD:
+ EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_SHAKEHEAD);
+ Message_ContinueTextbox(play, 0x8CE);
+ break;
+
+ case 0x8CE:
+ EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_KICKUPANDDOWN);
+ Message_ContinueTextbox(play, 0x8CF);
+ break;
+
+ case 0x8CF:
+ case 0x8D0:
+ case 0x8D1:
+ Message_CloseTextbox(play);
+ this->actionFunc = EnMnk_MonkeyTiedUp_WaitForCutRope;
+ EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_KICKUPANDDOWN);
+ break;
+
+ case 0x8D3:
+ if ((gSaveContext.save.playerForm == PLAYER_FORM_FIERCE_DEITY) ||
+ (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN)) {
+ Message_CloseTextbox(play);
+ this->actionFunc = EnMnk_MonkeyTiedUp_WaitForInstrument;
+ EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_WAIT);
+ } else {
+ EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_CONFUSED);
+ Message_ContinueTextbox(play, 0x8D7);
+ }
+ break;
+
+ case 0x8D2:
+ case 0x8D7:
+ Message_CloseTextbox(play);
+ this->actionFunc = EnMnk_MonkeyTiedUp_WaitForInstrument;
+ EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_WAIT);
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+void EnMnk_MonkeyTiedUp_WaitUnused(EnMnk* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ SkelAnime_Update(&this->propSkelAnime);
+
+ if (Actor_ProcessTalkRequest(&this->picto.actor, &play->state)) {
+ this->actionFunc = EnMnk_MonkeyTiedUp_TalkUnused;
+ this->unk_3E0 = 0;
+ } else if (EnMnk_PlayerIsInTalkRange(this, play)) {
+ this->picto.actor.textId = 0x8E2;
+ Actor_OfferTalk(&this->picto.actor, play, 120.0f);
+ }
+}
+
+void EnMnk_MonkeyTiedUp_WaitForInstrument(EnMnk* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ SkelAnime_Update(&this->propSkelAnime);
+
+ if (func_800B8718(&this->picto.actor, &play->state)) {
+ switch (gSaveContext.save.playerForm) {
+ case PLAYER_FORM_HUMAN:
+ case PLAYER_FORM_FIERCE_DEITY:
+ this->picto.actor.textId = 0x8D4;
+ EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_SHAKEHEAD);
+ break;
+
+ case PLAYER_FORM_GORON:
+ this->picto.actor.textId = 0x8D5;
+ EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_SHAKEHEAD);
+ break;
+
+ case PLAYER_FORM_ZORA:
+ this->picto.actor.textId = 0x8D6;
+ EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_SHAKEHEAD);
+ break;
+
+ case PLAYER_FORM_DEKU:
+ this->picto.actor.textId = 0x8D8;
+ EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_KICKUPANDDOWN);
+ this->actionFunc = EnMnk_MonkeyTiedUp_TeachSong;
+ this->csId = 2;
+ SET_EVENTINF(EVENTINF_24);
+ this->picto.actor.csId = this->csIdList[2];
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
+ CutsceneManager_Queue(this->csIdList[2]);
+ return;
+
+ default:
+ this->picto.actor.textId = 0x8D4;
+ EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_SHAKEHEAD);
+ break;
+ }
+ this->actionFunc = EnMnk_MonkeyTiedUp_ReactToWrongInstrument;
+ this->picto.actor.csId = this->csIdList[0];
+ Message_StartTextbox(play, this->picto.actor.textId, NULL);
+ CutsceneManager_Queue(this->picto.actor.csId);
+ } else if (Actor_ProcessTalkRequest(&this->picto.actor, &play->state)) {
+ this->actionFunc = EnMnk_MonkeyTiedUp_TransitionAfterTalk;
+ EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_KICKAROUND);
+ } else if (EnMnk_PlayerIsInTalkRange(this, play)) {
+ this->picto.actor.textId = 0x8D3;
+ Actor_OfferTalk(&this->picto.actor, play, 100.0f);
+ func_800B874C(&this->picto.actor, play, 100.0f, 100.0f);
+ }
+}
+
+void EnMnk_MonkeyTiedUp_TalkAfterCutRope(EnMnk* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ SkelAnime_Update(&this->propSkelAnime);
+
+ if (Actor_ProcessTalkRequest(&this->picto.actor, &play->state)) {
+ this->actionFunc = EnMnk_MonkeyTiedUp_TransitionAfterTalk;
+ this->picto.actor.flags &= ~ACTOR_FLAG_10000;
+ } else {
+ Actor_OfferTalk(&this->picto.actor, play, 150.0f);
+ }
+}
+
+void EnMnk_MonkeyTiedUp_WaitForCutRope(EnMnk* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ SkelAnime_Update(&this->propSkelAnime);
+
+ if (Actor_ProcessTalkRequest(&this->picto.actor, &play->state)) {
+ if ((gSaveContext.save.playerForm == PLAYER_FORM_FIERCE_DEITY) ||
+ (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN)) {
+ EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_SHH);
+ this->unk_3E0 = 5;
+ } else {
+ EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_CONFUSED);
+ }
+ this->actionFunc = EnMnk_MonkeyTiedUp_TransitionAfterTalk;
+ } else if (this->collider.base.acFlags & AC_HIT) {
+ this->actionFunc = EnMnk_MonkeyTiedUp_TalkAfterCutRope;
+ this->picto.actor.textId = 0x8D2;
+ EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_SHAKEHEAD);
+ this->picto.actor.flags |= ACTOR_FLAG_10000;
+ } else if (EnMnk_PlayerIsInTalkRange(this, play)) {
+ if ((gSaveContext.save.playerForm != PLAYER_FORM_FIERCE_DEITY) &&
+ (gSaveContext.save.playerForm != PLAYER_FORM_HUMAN)) {
+ this->picto.actor.textId = 0x8D1;
+ } else {
+ this->picto.actor.textId = 0x8D0;
+ }
+ Actor_OfferTalk(&this->picto.actor, play, 100.0f);
+ }
+}
+
+void EnMnk_MonkeyTiedUp_Wait(EnMnk* this, PlayState* play) {
+ s32 pad;
+
+ SkelAnime_Update(&this->skelAnime);
+ if (SkelAnime_Update(&this->propSkelAnime)) {
+ this->cueId--;
+ if (this->cueId < 0) {
+ this->cueId = 4;
+ EnMnk_MonkeyTiedUp_ChangeAnim(this, MONKEY_TIEDUP_ANIM_KICKAROUND, ANIMMODE_ONCE, -5.0f);
+ } else if (this->cueId == 0) {
+ EnMnk_MonkeyTiedUp_ChangeAnim(this, MONKEY_TIEDUP_ANIM_SHAKEHEAD, ANIMMODE_ONCE, -5.0f);
+ } else {
+ EnMnk_MonkeyTiedUp_ChangeAnim(this, MONKEY_TIEDUP_ANIM_KICKAROUND, ANIMMODE_ONCE, 0.0f);
+ SkelAnime_Update(&this->skelAnime);
+ SkelAnime_Update(&this->propSkelAnime);
+ }
+ }
+ if (func_800B8718(&this->picto.actor, &play->state)) {
+ this->picto.actor.textId = 0x8D8;
+ EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_KICKUPANDDOWN);
+ this->actionFunc = EnMnk_MonkeyTiedUp_TeachSong;
+ this->csId = 2;
+ SET_EVENTINF(EVENTINF_24);
+ this->picto.actor.csId = this->csIdList[2];
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
+ CutsceneManager_Queue(this->csIdList[2]);
+ } else if (Actor_ProcessTalkRequest(&this->picto.actor, &play->state)) {
+ if (gSaveContext.save.playerForm == PLAYER_FORM_DEKU) {
+ if (this->picto.actor.textId == 0x8EC) {
+ EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_SHAKEHEAD);
+ } else {
+ EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_KICKAROUND);
+ }
+ } else {
+ EnMnk_MonkeyTiedUp_SetAnim(this, MONKEY_TIEDUP_ANIM_KICKUPANDDOWN);
+ }
+ this->actionFunc = EnMnk_MonkeyTiedUp_TransitionAfterTalk;
+ } else if (EnMnk_PlayerIsInTalkRange(this, play)) {
+ if (gSaveContext.save.playerForm == PLAYER_FORM_DEKU) {
+ if (this->flags & MONKEY_FLAGS_1000) {
+ this->picto.actor.textId = 0x8EC;
+ } else {
+ this->picto.actor.textId = 0x8CA;
+ }
+ func_800B874C(&this->picto.actor, play, 100.0f, 100.0f);
+ } else {
+ this->picto.actor.textId = 0x8CC;
+ }
+ Actor_OfferTalk(&this->picto.actor, play, 120.0f);
+ } else if ((play->curSpawn != 1) && (this->picto.actor.xzDistToPlayer < 140.0f) &&
+ Player_IsFacingActor(&this->picto.actor, 0x3000, play)) {
+ this->picto.actor.textId = 0x8CA;
+ Actor_OfferTalk(&this->picto.actor, play, 140.0f);
+ }
+}
+
+void EnMnk_MonkeyHanging_WaitForTextboxAfterDunk(EnMnk* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ SkelAnime_Update(&this->propSkelAnime);
+
+ if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
+ if (this->flags & MONKEY_FLAGS_800) {
+ this->flags &= ~MONKEY_FLAGS_800;
+ CutsceneManager_Stop(this->picto.actor.csId);
+ }
+ Message_CloseTextbox(play);
+ this->actionFunc = EnMnk_MonkeyHanging_WaitAfterDunk;
+ func_800B7298(play, NULL, PLAYER_CSMODE_END);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_83_08);
+ }
+}
+
+void EnMnk_MonkeyHanging_RaiseFromDunk2(EnMnk* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ SkelAnime_Update(&this->propSkelAnime);
+
+ if (this->unk_3C8 > 0) {
+ this->unk_3D0 -= 0x320;
+ this->approachPlayerRadius -= 0.01f;
+ this->unk_3C8--;
+ } else {
+ this->unk_3C8 = 240;
+ this->actionFunc = EnMnk_MonkeyHanging_WaitForTextboxAfterDunk;
+ EnMnk_MonkeyHanging_SetAnim(this, MONKEY_HANGING_ANIM_FREEZE);
+ Message_ContinueTextbox(play, 0x8EA);
+ }
+}
+
+void EnMnk_MonkeyHanging_PauseDuringDunk2(EnMnk* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ SkelAnime_Update(&this->propSkelAnime);
+ if (this->unk_3C8 > 0) {
+ this->unk_3C8--;
+ } else {
+ this->unk_3C8 = 60;
+ this->actionFunc = EnMnk_MonkeyHanging_RaiseFromDunk2;
+ EnMnk_MonkeyHanging_ChangeAnim(this, MONKEY_HANGING_ANIM_RISE, ANIMMODE_ONCE, -5.0f);
+ this->unk_3E0 = 3;
+ }
+}
+
+void EnMnk_MonkeyHanging_MakeSplash(EnMnk* this, PlayState* play) {
+ Vec3f effSpawnPos;
+
+ Math_Vec3f_Copy(&effSpawnPos, &this->picto.actor.focus.pos);
+ effSpawnPos.y += 20.0f;
+ EffectSsGSplash_Spawn(play, &effSpawnPos, &sMonkeyHangingSplashPrimColor, &sMonkeyHangingSplashEnvColor, 0, 300);
+}
+
+void EnMnk_MonkeyHanging_Dunk2(EnMnk* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ SkelAnime_Update(&this->propSkelAnime);
+
+ if (this->unk_3C8 > 0) {
+ this->unk_3D0 += 0x320;
+ this->approachPlayerRadius += 0.01f;
+ this->unk_3C8--;
+ if (this->unk_3C8 == 0xA) {
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EV_BOMB_DROP_WATER);
+ EnMnk_MonkeyHanging_MakeSplash(this, play);
+ }
+ } else {
+ this->unk_3C8 = 20;
+ this->actionFunc = EnMnk_MonkeyHanging_PauseDuringDunk2;
+ }
+}
+
+void EnMnk_MonkeyHanging_Plead(EnMnk* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ SkelAnime_Update(&this->propSkelAnime);
+
+ if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
+ switch (play->msgCtx.currentTextId) {
+ case 0x8E8:
+ Message_ContinueTextbox(play, 0x8E9);
+ break;
+
+ case 0x8E9:
+ this->actionFunc = EnMnk_MonkeyHanging_Dunk2;
+ Message_CloseTextbox(play);
+ func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_WAIT);
+ this->unk_3C8 = 60;
+ break;
+
+ default:
+ break;
+ }
+ }
+ if (!(this->flags & MONKEY_FLAGS_800)) {
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->picto.actor.csId);
+ } else if (CutsceneManager_IsNext(this->picto.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->picto.actor.csId, &this->picto.actor);
+ this->flags |= MONKEY_FLAGS_800;
+ } else {
+ CutsceneManager_Queue(this->picto.actor.csId);
+ }
+ }
+}
+
+void EnMnk_MonkeyHanging_WaitAfterDunk(EnMnk* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ SkelAnime_Update(&this->propSkelAnime);
+
+ if (Actor_ProcessTalkRequest(&this->picto.actor, &play->state)) {
+ this->actionFunc = EnMnk_MonkeyHanging_Plead;
+ CutsceneManager_Queue(this->picto.actor.csId);
+ SET_WEEKEVENTREG(WEEKEVENTREG_83_08);
+ EnMnk_MonkeyHanging_SetAnim(this, MONKEY_HANGING_ANIM_STRUGGLE);
+ this->unk_3E0 = 5;
+ } else if (this->unk_3C8 > 0) {
+ this->unk_3C8--;
+ if (this->picto.actor.isLockedOn && (this->picto.actor.csId != CS_ID_NONE)) {
+ Actor_OfferTalk(&this->picto.actor, play, 1000.0f);
+ }
+ } else {
+ this->unk_3C8 = 240;
+ this->actionFunc = EnMnk_MonkeyHanging_StruggleBeforeDunk;
+ EnMnk_MonkeyHanging_SetAnim(this, MONKEY_HANGING_ANIM_STRUGGLE);
+ this->unk_3E0 = 5;
+ }
+}
+
+void EnMnk_MonkeyHanging_RaiseFromDunk(EnMnk* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ SkelAnime_Update(&this->propSkelAnime);
+
+ if (this->unk_3C8 > 0) {
+ this->unk_3D0 -= 0x320;
+ this->approachPlayerRadius -= 0.01f;
+ this->unk_3C8--;
+ } else {
+ this->unk_3C8 = 240;
+ this->actionFunc = EnMnk_MonkeyHanging_WaitAfterDunk;
+ EnMnk_MonkeyHanging_SetAnim(this, MONKEY_HANGING_ANIM_FREEZE);
+ }
+}
+
+void EnMnk_MonkeyHanging_PauseDuringDunk(EnMnk* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ SkelAnime_Update(&this->propSkelAnime);
+
+ if (this->unk_3C8 > 0) {
+ this->unk_3C8--;
+ } else {
+ this->unk_3C8 = 60;
+ this->actionFunc = EnMnk_MonkeyHanging_RaiseFromDunk;
+ EnMnk_MonkeyHanging_ChangeAnim(this, MONKEY_HANGING_ANIM_RISE, ANIMMODE_ONCE, -5.0f);
+ this->unk_3E0 = 3;
+ }
+}
+
+void EnMnk_MonkeyHanging_Dunk(EnMnk* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ SkelAnime_Update(&this->propSkelAnime);
+
+ if (this->unk_3C8 > 0) {
+ this->unk_3D0 += 0x320;
+ this->approachPlayerRadius += 0.01f;
+ this->unk_3C8--;
+ if (this->unk_3C8 == 0xA) {
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EV_BOMB_DROP_WATER);
+ EnMnk_MonkeyHanging_MakeSplash(this, play);
+ }
+ } else {
+ this->unk_3C8 = 20;
+ this->actionFunc = EnMnk_MonkeyHanging_PauseDuringDunk;
+ }
+}
+
+void EnMnk_MonkeyHanging_StruggleBeforeDunk(EnMnk* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ SkelAnime_Update(&this->propSkelAnime);
+
+ if (Actor_ProcessTalkRequest(&this->picto.actor, &play->state)) {
+ this->actionFunc = EnMnk_MonkeyHanging_Plead;
+ CutsceneManager_Queue(this->picto.actor.csId);
+ SET_WEEKEVENTREG(WEEKEVENTREG_83_08);
+ } else if (this->unk_3C8 > 0) {
+ this->unk_3C8--;
+ if (this->picto.actor.isLockedOn) {
+ Actor_OfferTalk(&this->picto.actor, play, 1000.0f);
+ }
+ } else {
+ this->unk_3C8 = 60;
+ this->actionFunc = EnMnk_MonkeyHanging_Dunk;
+ }
+}
+
+void EnMnk_Monkey_GuideThroughWoods(EnMnk* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+
+ if (EnMnk_FollowPath(this, 0) != MONKEY_FOLLOWPATH_RESULT_FOLLOWING) {
+ this->pathIndex = this->path->additionalPathIndex;
+ if (this->pathIndex == ADDITIONAL_PATH_INDEX_NONE) {
+ Actor_Kill(&this->picto.actor);
+ return;
+ }
+ this->path = &play->setupPathList[this->pathIndex];
+ this->destPointIndex = 0;
+ }
+ EnMnk_PlayWalkSfx(this);
+}
+
+void EnMnk_Monkey_TalkBeforeGuideThroughWoods(EnMnk* this, PlayState* play) {
+ Math_SmoothStepToS(&this->picto.actor.world.rot.y, this->picto.actor.yawTowardsPlayer, 2, 0xBB8, 0xC8);
+ Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->picto.actor.world.rot.y, 2, 0xBB8, 0xC8);
+ SkelAnime_Update(&this->skelAnime);
+
+ if (Actor_TextboxIsClosing(&this->picto.actor, play)) {
+ EnMnk_StartNextPath(this, play);
+ this->actionFunc = EnMnk_Monkey_GuideThroughWoods;
+ this->flags |= MONKEY_FLAGS_8000;
+ }
+}
+
+void EnMnk_Monkey_SetupTalkBeforeGuideThroughWoods(EnMnk* this) {
+ switch ((u32)Rand_ZeroFloat(6.0f)) {
+ case 0:
+ EnMnk_Monkey_SetAnim(this, 3);
+ break;
+
+ case 1:
+ EnMnk_Monkey_SetAnim(this, 4);
+ break;
+
+ case 2:
+ EnMnk_Monkey_SetAnim(this, 5);
+ break;
+
+ case 3:
+ EnMnk_Monkey_SetAnim(this, 6);
+ break;
+
+ case 4:
+ EnMnk_Monkey_SetAnim(this, 2);
+ break;
+
+ default:
+ EnMnk_Monkey_SetAnim(this, 7);
+ break;
+ }
+ this->actionFunc = EnMnk_Monkey_TalkBeforeGuideThroughWoods;
+}
+
+void EnMnk_Monkey_WaitToGuideThroughWoods(EnMnk* this, PlayState* play) {
+ func_80AB5F6C(this);
+ if (Actor_ProcessTalkRequest(&this->picto.actor, &play->state)) {
+ EnMnk_Monkey_SetupTalkBeforeGuideThroughWoods(this);
+ } else if (this->picto.actor.isLockedOn || (this->picto.actor.xzDistToPlayer < 100.0f)) {
+ Actor_OfferTalk(&this->picto.actor, play, 120.0f);
+ }
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_SAVED_KOUME)) {
+ Actor_Kill(&this->picto.actor);
+ }
+}
+
+void EnMnk_Monkey_TalkAfterSaved(EnMnk* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+
+ if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
+ switch (play->msgCtx.currentTextId) {
+ case 0x8E5:
+ Message_ContinueTextbox(play, 0x8E6);
+ EnMnk_Monkey_SetAnim(this, 3);
+ break;
+
+ case 0x8E6:
+ Message_ContinueTextbox(play, 0x8E7);
+ EnMnk_Monkey_SetAnim(this, 5);
+ break;
+
+ case 0x8E7:
+ Message_CloseTextbox(play);
+ this->actionFunc = EnMnk_Monkey_WaitToTalkAfterSaved;
+ EnMnk_Monkey_SetAnim(this, 0);
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+void EnMnk_Monkey_WaitToTalkAfterSaved(EnMnk* this, PlayState* play) {
+ this->picto.actor.shape.rot.y = this->picto.actor.yawTowardsPlayer;
+ this->picto.actor.world.rot.y = this->picto.actor.yawTowardsPlayer;
+ SkelAnime_Update(&this->skelAnime);
+
+ if (Actor_ProcessTalkRequest(&this->picto.actor, &play->state)) {
+ this->actionFunc = EnMnk_Monkey_TalkAfterSaved;
+ EnMnk_Monkey_SetAnim(this, 7);
+ } else if ((this->picto.actor.xzDistToPlayer < 100.0f) && Player_IsFacingActor(&this->picto.actor, 0x3000, play)) {
+ Actor_OfferTalk(&this->picto.actor, play, 110.0f);
+ }
+}
+
+void func_80AB9084(EnMnk* this, PlayState* play) {
+ s16 cueId = 0;
+
+ if (SkelAnime_Update(&this->skelAnime)) {
+ switch (this->cueId) {
+ case 2:
+ EnMnk_Monkey_SetAnim(this, 0xD);
+ break;
+
+ case 3:
+ EnMnk_Monkey_SetAnim(this, 0);
+ break;
+
+ case 4:
+ EnMnk_Monkey_SetAnim(this, 0);
+ break;
+
+ default:
+ break;
+ }
+ SkelAnime_Update(&this->skelAnime);
+ SET_WEEKEVENTREG(WEEKEVENTREG_29_80);
+ }
+
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_106)) {
+ Cutscene_ActorTranslateAndYaw(&this->picto.actor, play, Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_106));
+ cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_106)]->id;
+ }
+
+ if ((cueId == 0) && (this->animIndex != 0)) {
+ EnMnk_Monkey_SetAnim(this, 0);
+ } else if (this->cueId != cueId) {
+ switch (cueId) {
+ case 1:
+ EnMnk_Monkey_ChangeAnim(this, 0, ANIMMODE_LOOP, 0.0f);
+ break;
+
+ case 2:
+ EnMnk_Monkey_ChangeAnim(this, 12, ANIMMODE_ONCE, 0.0f);
+ this->unk_3E0 = 6;
+ break;
+
+ case 3:
+ EnMnk_Monkey_ChangeAnim(this, 11, ANIMMODE_ONCE, 0.0f);
+ break;
+
+ case 4:
+ EnMnk_Monkey_ChangeAnim(this, 14, ANIMMODE_ONCE, -5.0f);
+ break;
+
+ default:
+ break;
+ }
+ this->cueId = cueId;
+ }
+
+ if (this->animIndex == 11) {
+ if ((this->skelAnime.curFrame >= 8.0f) && (this->skelAnime.curFrame < 14.0f)) {
+ this->unk_3E0 = 2;
+ } else {
+ this->unk_3E0 = 0;
+ }
+ if (Animation_OnFrame(&this->skelAnime, 8.0f)) {
+ Actor_PlaySfx(&this->picto.actor, NA_SE_EV_MONKEY_VO_REWARD);
+ }
+ }
+}
+
+void func_80AB92CC(EnMnk* this, PlayState* play) {
+ s16 cueId = 0;
+
+ if (SkelAnime_Update(&this->skelAnime)) {
+ switch (this->cueId) {
+ case 2:
+ EnMnk_Monkey_SetAnim(this, 0xD);
+ break;
+
+ case 3:
+ EnMnk_Monkey_SetAnim(this, 0);
+ break;
+
+ case 4:
+ EnMnk_Monkey_SetAnim(this, 0);
+ break;
+
+ default:
+ break;
+ }
+ SkelAnime_Update(&this->skelAnime);
+ }
+
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_106)) {
+ Cutscene_ActorTranslateAndYaw(&this->picto.actor, play, Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_106));
+ cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_106)]->id;
+ }
+
+ if ((cueId == 0) && (this->animIndex != 0)) {
+ EnMnk_Monkey_SetAnim(this, 0);
+ } else if (this->cueId != cueId) {
+ switch (cueId) {
+ case 1:
+ EnMnk_Monkey_ChangeAnim(this, 0, ANIMMODE_LOOP, 0.0f);
+ break;
+
+ case 2:
+ EnMnk_Monkey_ChangeAnim(this, 12, ANIMMODE_ONCE, 0.0f);
+ this->unk_3E0 = 6;
+ break;
+
+ case 3:
+ EnMnk_Monkey_ChangeAnim(this, 11, ANIMMODE_ONCE, 0.0f);
+ break;
+
+ case 4:
+ EnMnk_Monkey_ChangeAnim(this, 14, ANIMMODE_ONCE, -5.0f);
+ break;
+
+ default:
+ break;
+ }
+ this->cueId = cueId;
+ }
+ if (this->animIndex == 11) {
+ if ((this->skelAnime.curFrame >= 8.0f) && (this->skelAnime.curFrame < 14.0f)) {
+ this->unk_3E0 = 2;
+ } else {
+ this->unk_3E0 = 0;
+ }
+ }
+}
+
+void EnMnk_DoNothing(EnMnk* this, PlayState* play) {
+}
+
+void EnMnk_Update(Actor* thisx, PlayState* play) {
+ EnMnk* this = THIS;
+
+ if (!(this->flags & MONKEY_FLAGS_1)) {
+ Actor_MoveWithGravity(&this->picto.actor);
+ }
+ if (!(this->flags & MONKEY_FLAGS_2)) {
+ Actor_UpdateBgCheckInfo(play, &this->picto.actor, 20.0f, 25.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
+ if (this->picto.actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->flags |= MONKEY_FLAGS_40;
+ }
+ }
+
+ this->actionFunc(this, play);
+
+ if (!(this->flags & MONKEY_FLAGS_20)) {
+ if (!(this->flags & MONKEY_FLAGS_8)) {
+ Collider_UpdateCylinder(&this->picto.actor, &this->collider);
+ }
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
+ }
+ if (this->flags & MONKEY_FLAGS_200) {
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
+ }
+
+ if (DECR(this->blinkTimer) == 0) {
+ this->blinkTimer = Rand_S16Offset(60, 60);
+ }
+
+ this->blinkFrame = this->blinkTimer;
+ if (this->blinkFrame >= 3) {
+ this->blinkFrame = 0;
+ }
+
+ if (this->flags & MONKEY_FLAGS_80) {
+ s8 csId = this->picto.actor.csId;
+
+ if (csId == CS_ID_NONE) {
+ this->flags &= ~MONKEY_FLAGS_80;
+ } else if (CutsceneManager_IsNext(csId)) {
+ CutsceneManager_StartWithPlayerCs(this->picto.actor.csId, &this->picto.actor);
+ this->picto.actor.csId = CutsceneManager_GetAdditionalCsId(this->picto.actor.csId);
+ } else {
+ CutsceneManager_Queue(this->picto.actor.csId);
+ }
+ }
+}
+
+s32 EnMnk_Monkey_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
+ EnMnk* this = THIS;
+
+ if (limbIndex == OBJECT_MNK_2_LIMB_03) {
+ rot->x += this->unk_3CC;
+ rot->z += this->unk_3CE;
+ }
+ return false;
+}
+
+s32 EnMnk_MonkeyTiedUp_PropOverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot,
+ Actor* thisx) {
+ if (limbIndex == OBJECT_MNK_1_LIMB_01) {
+ *dList = NULL;
+ }
+ return false;
+}
+
+s32 EnMnk_MonkeyHanging_PropOverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot,
+ Actor* thisx) {
+ if ((limbIndex == OBJECT_MNK_3_LIMB_01) || (limbIndex == OBJECT_MNK_3_LIMB_02) ||
+ (limbIndex == OBJECT_MNK_3_LIMB_03)) {
+ *dList = NULL;
+ }
+ return false;
+}
+
+void EnMnk_Monkey_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
+ EnMnk* this = THIS;
+
+ if (limbIndex == OBJECT_MNK_2_LIMB_04) {
+ Matrix_MultVec3f(&sMonkeyFocusPosOffset, &this->picto.actor.focus.pos);
+ }
+}
+
+void EnMnk_MonkeyTiedUp_PropPostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
+ EnMnk* this = THIS;
+
+ if (limbIndex == OBJECT_MNK_1_LIMB_04) {
+ Matrix_Get(&this->unk_36C);
+ }
+}
+
+void EnMnk_MonkeyHanging_PropPostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
+ EnMnk* this = THIS;
+
+ switch (limbIndex) {
+ case OBJECT_MNK_3_LIMB_01:
+ if (*dList != NULL) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Matrix_Push();
+ Matrix_RotateZS(this->cueId, MTXMODE_APPLY);
+ 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);
+ }
+ break;
+
+ case OBJECT_MNK_3_LIMB_02:
+ if (*dList != NULL) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Matrix_Scale(this->approachPlayerRadius + 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);
+ gSPDisplayList(POLY_OPA_DISP++, *dList);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ break;
+
+ case OBJECT_MNK_3_LIMB_03:
+ if (*dList != NULL) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Matrix_Scale(1.0f, 1.0f / (this->approachPlayerRadius + 1.0f), 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++, *dList);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ Matrix_Get(&this->unk_36C);
+ break;
+
+ default:
+ break;
+ }
+}
+
+void EnMnk_Monkey_DrawFace(EnMnk* this, PlayState* play) {
+ s32 pad;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
+
+ switch (this->unk_3E0) {
+ case 4:
+ case 5:
+ case 6:
+ if (this->blinkFrame != 2) {
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sMonkeyFaceTextures[this->unk_3E0]));
+ } else {
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sMonkeyFaceTextures[this->blinkFrame]));
+ }
+ return;
+
+ case 2:
+ case 3:
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sMonkeyFaceTextures[this->unk_3E0]));
+ return;
+
+ default:
+ break;
+ }
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sMonkeyFaceTextures[this->blinkFrame]));
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void EnMnk_Draw(Actor* thisx, PlayState* play) {
+ EnMnk* this = THIS;
+
+ EnMnk_Monkey_DrawFace(this, play);
+ SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
+ EnMnk_Monkey_OverrideLimbDraw, EnMnk_Monkey_PostLimbDraw, &this->picto.actor);
+}
+
+void EnMnk_MonkeyTiedUp_Draw(Actor* thisx, PlayState* play) {
+ EnMnk* this = THIS;
+
+ SkelAnime_DrawFlexOpa(play, this->propSkelAnime.skeleton, this->propSkelAnime.jointTable,
+ this->propSkelAnime.dListCount, EnMnk_MonkeyTiedUp_PropOverrideLimbDraw,
+ EnMnk_MonkeyTiedUp_PropPostLimbDraw, &this->picto.actor);
+ EnMnk_Monkey_DrawFace(this, play);
+ Matrix_Mult(&this->unk_36C, MTXMODE_NEW);
+ SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
+ EnMnk_Monkey_OverrideLimbDraw, EnMnk_Monkey_PostLimbDraw, &this->picto.actor);
+}
+
+void EnMnk_MonkeyHanging_Draw(Actor* thisx, PlayState* play) {
+ EnMnk* this = THIS;
+
+ SkelAnime_DrawFlexOpa(play, this->propSkelAnime.skeleton, this->propSkelAnime.jointTable,
+ this->propSkelAnime.dListCount, EnMnk_MonkeyHanging_PropOverrideLimbDraw,
+ EnMnk_MonkeyHanging_PropPostLimbDraw, &this->picto.actor);
+ EnMnk_Monkey_DrawFace(this, play);
+ Matrix_Mult(&this->unk_36C, MTXMODE_NEW);
+ SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
+ EnMnk_Monkey_OverrideLimbDraw, EnMnk_Monkey_PostLimbDraw, &this->picto.actor);
+}
diff --git a/src/overlays/actors/ovl_En_Mnk/z_en_mnk.h b/src/overlays/actors/ovl_En_Mnk/z_en_mnk.h
index e2f739ada..a9493208f 100644
--- a/src/overlays/actors/ovl_En_Mnk/z_en_mnk.h
+++ b/src/overlays/actors/ovl_En_Mnk/z_en_mnk.h
@@ -2,15 +2,82 @@
#define Z_EN_MNK_H
#include "global.h"
+#include "objects/object_mnk/object_mnk.h"
#include "z64snap.h"
struct EnMnk;
typedef void (*EnMnkActionFunc)(struct EnMnk*, PlayState*);
+typedef void (*EnMnkFunc)(PlayState*, struct EnMnk*);
+
+#define MONKEY_GET_TYPE(thisx) (((thisx)->params & 0x780) >> 7)
+#define MONKEY_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
+#define MONKEY_GET_PATH_INDEX(thisx) (((thisx)->params & 0xF800) >> 11)
+
+#define MONKEY_PATH_INDEX_NONE 0x1F
+
+typedef enum {
+ /* 0 */ MONKEY_0,
+ /* 1 */ MONKEY_OUTSIDEWOODS,
+ /* 2 */ MONKEY_BY_WITCH,
+ /* 3 */ MONKEY_OUTSIDECHAMBER,
+ /* 4 */ MONKEY_OUTSIDEPALACE,
+ /* 5 */ MONKEY_TIED_UP,
+ /* 6 */ MONKEY_HANGING,
+ /* 7 */ MONKEY_WOODS_GUIDE,
+ /* 8 */ MONKEY_8,
+ /* 9 */ MONKEY_AFTER_SAVED,
+ /* 10 */ MONKEY_10
+} MonkeyType;
+
+#define MONKEY_FLAGS_1 (1 << 0)
+#define MONKEY_FLAGS_2 (1 << 1)
+#define MONKEY_FLAGS_4 (1 << 2)
+#define MONKEY_FLAGS_8 (1 << 3)
+#define MONKEY_FLAGS_10 (1 << 4)
+#define MONKEY_FLAGS_20 (1 << 5)
+#define MONKEY_FLAGS_40 (1 << 6)
+#define MONKEY_FLAGS_80 (1 << 7)
+#define MONKEY_FLAGS_100 (1 << 8)
+#define MONKEY_FLAGS_200 (1 << 9)
+#define MONKEY_FLAGS_400 (1 << 10)
+#define MONKEY_FLAGS_800 (1 << 11)
+#define MONKEY_FLAGS_1000 (1 << 12)
+#define MONKEY_FLAGS_2000 (1 << 13)
+#define MONKEY_FLAGS_4000 (1 << 14)
+#define MONKEY_FLAGS_8000 (1 << 15)
+
+#define MONKEY_PROP_LIMB_MAX MAX((s32)OBJECT_MNK_1_LIMB_MAX, (s32)OBJECT_MNK_3_LIMB_MAX)
typedef struct EnMnk {
/* 0x000 */ PictoActor picto;
- /* 0x148 */ char unk_148[0x2A0];
+ /* 0x148 */ SkelAnime skelAnime;
+ /* 0x18C */ Vec3s jointTable[OBJECT_MNK_2_LIMB_MAX];
+ /* 0x216 */ Vec3s morphTable[OBJECT_MNK_2_LIMB_MAX];
+ /* 0x2A0 */ SkelAnime propSkelAnime;
+ /* 0x2E4 */ Vec3s propJointTable[MONKEY_PROP_LIMB_MAX];
+ /* 0x302 */ Vec3s propMorphTable[MONKEY_PROP_LIMB_MAX];
+ /* 0x320 */ ColliderCylinder collider;
+ /* 0x36C */ MtxF unk_36C;
+ /* 0x3AC */ Path* path;
+ /* 0x3B0 */ s16 csIdList[6];
+ /* 0x3BC */ s16 csId;
+ /* 0x3BE */ s16 animIndex;
+ /* 0x3C0 */ s32 destPointIndex;
+ /* 0x3C4 */ s32 pathIndex;
+ /* 0x3C8 */ s32 unk_3C8;
+ /* 0x3CC */ s16 unk_3CC; // beard x rot?
+ /* 0x3CE */ s16 unk_3CE; // beard y rot?
+ /* 0x3D0 */ union {
+ s16 cueId; // Tied monkey
+ s16 unk_3D0; // Hanging monkey
+ };
+ /* 0x3D4 */ u32 unk_3D4;
+ /* 0x3D8 */ f32 approachPlayerRadius;
+ /* 0x3DC */ s16 blinkFrame;
+ /* 0x3DE */ s16 blinkTimer;
+ /* 0x3E0 */ s32 unk_3E0;
+ /* 0x3E4 */ u16 flags;
/* 0x3E8 */ EnMnkActionFunc actionFunc;
} EnMnk; // size = 0x3EC
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 6aac1355d..d17a8b98c 100644
--- a/src/overlays/actors/ovl_En_Ms/z_en_ms.c
+++ b/src/overlays/actors/ovl_En_Ms/z_en_ms.c
@@ -7,7 +7,7 @@
#include "z_en_ms.h"
#include "objects/object_ms/object_ms.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnMs*)thisx)
@@ -53,7 +53,7 @@ static ColliderCylinderInitType1 sCylinderInit = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_U8(targetMode, 2, ICHAIN_CONTINUE),
+ ICHAIN_U8(targetMode, TARGET_MODE_2, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 500, ICHAIN_STOP),
};
@@ -61,7 +61,7 @@ void EnMs_Init(Actor* thisx, PlayState* play) {
EnMs* this = THIS;
Actor_ProcessInitChain(thisx, sInitChain);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_ms_Skel_003DC0, &object_ms_Anim_0005EC, this->jointTable,
+ SkelAnime_InitFlex(play, &this->skelAnime, &gBeanSalesmanSkel, &gBeanSalesmanEatingAnim, this->jointTable,
this->morphTable, 9);
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinderType1(play, &this->collider, &this->actor, &sCylinderInit);
@@ -69,7 +69,7 @@ void EnMs_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 0.015f);
this->actor.colChkInfo.mass = MASS_IMMOVABLE; // Eating Magic Beans all day will do that to you
this->actionFunc = EnMs_Wait;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.velocity.y = 0.0f;
this->actor.gravity = -1.0f;
}
@@ -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 [...]"
@@ -92,7 +92,7 @@ void EnMs_Wait(EnMs* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actionFunc = EnMs_Talk;
} else if ((this->actor.xzDistToPlayer < 90.0f) && (ABS_ALT(yawDiff) < 0x2000)) {
- func_800B8614(&this->actor, play, 90.0f);
+ Actor_OfferTalk(&this->actor, play, 90.0f);
}
}
@@ -106,9 +106,9 @@ void EnMs_Talk(EnMs* this, PlayState* play) {
case TEXT_STATE_5:
if (Message_ShouldAdvance(play)) {
- func_801477B4(play);
- Actor_PickUp(&this->actor, play, GI_MAGIC_BEANS, this->actor.xzDistToPlayer,
- this->actor.playerHeightRel);
+ Message_CloseTextbox(play);
+ Actor_OfferGetItem(&this->actor, play, GI_MAGIC_BEANS, this->actor.xzDistToPlayer,
+ this->actor.playerHeightRel);
this->actionFunc = EnMs_Sell;
}
break;
@@ -117,16 +117,16 @@ void EnMs_Talk(EnMs* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
switch (play->msgCtx.choiceIndex) {
case 0: // yes
- func_801477B4(play);
- if (gSaveContext.save.playerData.rupees < 10) {
- play_sound(NA_SE_SY_ERROR);
- func_80151938(play, 0x935); // "[...] You don't have enough Rupees."
+ Message_CloseTextbox(play);
+ if (gSaveContext.save.saveInfo.playerData.rupees < 10) {
+ Audio_PlaySfx(NA_SE_SY_ERROR);
+ Message_ContinueTextbox(play, 0x935); // "[...] You don't have enough Rupees."
} else if (AMMO(ITEM_MAGIC_BEANS) >= 20) {
- play_sound(NA_SE_SY_ERROR);
- func_80151938(play, 0x937); // "[...] You can't carry anymore."
+ Audio_PlaySfx(NA_SE_SY_ERROR);
+ Message_ContinueTextbox(play, 0x937); // "[...] You can't carry anymore."
} else {
- func_8019F208();
- Actor_PickUp(&this->actor, play, GI_MAGIC_BEANS, 90.0f, 10.0f);
+ Audio_PlaySfx_MessageDecide();
+ Actor_OfferGetItem(&this->actor, play, GI_MAGIC_BEANS, 90.0f, 10.0f);
Rupees_ChangeBy(-10);
this->actionFunc = EnMs_Sell;
}
@@ -134,8 +134,8 @@ void EnMs_Talk(EnMs* this, PlayState* play) {
case 1: // no
default:
- func_8019F230();
- func_80151938(play, 0x934); // "[...] Well, if your mood changes [...]"
+ Audio_PlaySfx_MessageCancel();
+ Message_ContinueTextbox(play, 0x934); // "[...] Well, if your mood changes [...]"
break;
}
}
@@ -149,19 +149,21 @@ void EnMs_Talk(EnMs* this, PlayState* play) {
void EnMs_Sell(EnMs* this, PlayState* play) {
if (Actor_HasParent(&this->actor, play)) {
this->actor.textId = 0;
- func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel, PLAYER_IA_NONE);
+ Actor_OfferTalkExchange(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel,
+ PLAYER_IA_NONE);
this->actionFunc = EnMs_TalkAfterPurchase;
} else {
- Actor_PickUp(&this->actor, play, GI_MAGIC_BEANS, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
+ Actor_OfferGetItem(&this->actor, play, GI_MAGIC_BEANS, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
}
}
void EnMs_TalkAfterPurchase(EnMs* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- func_80151938(play, 0x936); // "You can plant 'em whenever you want [...]"
+ Message_ContinueTextbox(play, 0x936); // "You can plant 'em whenever you want [...]"
this->actionFunc = EnMs_Talk;
} else {
- func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel,
+ PLAYER_IA_MINUS1);
}
}
@@ -181,7 +183,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 7b2dc9db6..016f779e9 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 = {
@@ -220,7 +220,8 @@ s32 EnMttag_UpdateCheckpoints(EnMttag* this, PlayState* play) {
}
if ((currentCheckpoints[0] > 0) && (currentCheckpoints[0] < highestCurrentCheckpoint) &&
- (player->actor.bgCheckFlags & 1) && ((highestCurrentCheckpoint - currentCheckpoints[0]) >= 24)) {
+ (player->actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
+ ((highestCurrentCheckpoint - currentCheckpoints[0]) >= 24)) {
playerIsLikelyToLose = true;
}
@@ -234,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 {
@@ -245,7 +246,7 @@ s32 EnMttag_ExitRace(PlayState* play, s32 transitionType, s32 nextTransitionType
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = transitionType;
gSaveContext.nextTransitionType = nextTransitionType;
- func_801477B4(play);
+ Message_CloseTextbox(play);
return 1;
}
@@ -255,8 +256,8 @@ 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);
- Audio_QueueSeqCmd(0x101400FF);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_WAIT);
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 20);
this->actionFunc = EnMttag_PotentiallyRestartRace;
}
@@ -266,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;
}
@@ -274,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);
}
}
@@ -287,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;
}
@@ -316,8 +317,8 @@ void EnMttag_RaceStart(EnMttag* this, PlayState* play) {
if (DECR(this->timer) == 60) {
Interface_StartTimer(TIMER_ID_MINIGAME_2, 0);
play->interfaceCtx.minigameState = MINIGAME_STATE_COUNTDOWN_SETUP_3;
- Audio_QueueSeqCmd(NA_BGM_GORON_RACE | 0x8000);
- play->envCtx.unk_E4 = 0xFE;
+ SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_GORON_RACE | SEQ_FLAG_ASYNC);
+ play->envCtx.timeSeqState = TIMESEQ_REQUEST;
player->stateFlags1 &= ~PLAYER_STATE1_20;
} else if ((this->timer < 60) && (play->interfaceCtx.minigameState == MINIGAME_STATE_COUNTDOWN_GO)) {
this->timer = 0;
@@ -360,15 +361,15 @@ void EnMttag_Race(EnMttag* this, PlayState* play) {
if (EnMttag_IsInFinishLine(playerPos)) {
gSaveContext.timerStates[TIMER_ID_MINIGAME_2] = TIMER_STATE_6;
- play_sound(NA_SE_SY_START_SHOT);
- Audio_QueueSeqCmd(NA_BGM_GORON_GOAL | 0x8000);
+ Audio_PlaySfx(NA_SE_SY_START_SHOT);
+ SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_GORON_GOAL | SEQ_FLAG_ASYNC);
this->timer = 55;
SET_EVENTINF(EVENTINF_11);
this->actionFunc = EnMttag_RaceFinish;
} else if (EnMttag_IsAnyRaceGoronOverFinishLine(this)) {
gSaveContext.timerStates[TIMER_ID_MINIGAME_2] = TIMER_STATE_6;
- play_sound(NA_SE_SY_START_SHOT);
- Audio_QueueSeqCmd(NA_BGM_GORON_GOAL | 0x8000);
+ Audio_PlaySfx(NA_SE_SY_START_SHOT);
+ SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_GORON_GOAL | SEQ_FLAG_ASYNC);
this->timer = 55;
SET_EVENTINF(EVENTINF_12);
this->actionFunc = EnMttag_RaceFinish;
@@ -420,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 {
@@ -431,8 +432,8 @@ void EnMttag_PotentiallyRestartRace(EnMttag* this, PlayState* play) {
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK;
- func_801477B4(play);
- func_800B7298(play, &this->actor, PLAYER_CSMODE_7);
+ Message_CloseTextbox(play);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_WAIT);
Magic_Add(play, MAGIC_FILL_TO_CAPACITY);
CLEAR_EVENTINF(EVENTINF_10);
@@ -455,7 +456,7 @@ void EnMttag_HandleCantWinChoice(EnMttag* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE) && Message_ShouldAdvance(play)) {
if (play->msgCtx.choiceIndex != 0) {
// Exit the race
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
gSaveContext.timerStates[TIMER_ID_MINIGAME_2] = TIMER_STATE_OFF;
EnMttag_ExitRace(play, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK);
CLEAR_EVENTINF(EVENTINF_13);
@@ -465,9 +466,9 @@ void EnMttag_HandleCantWinChoice(EnMttag* this, PlayState* play) {
}
// Keep racing
- func_8019F208();
- func_801477B4(play);
- func_800B7298(play, &this->actor, PLAYER_CSMODE_6);
+ Audio_PlaySfx_MessageDecide();
+ Message_CloseTextbox(play);
+ 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 c10244e55..5ee8a68e0 100644
--- a/src/overlays/actors/ovl_En_Mushi2/z_en_mushi2.c
+++ b/src/overlays/actors/ovl_En_Mushi2/z_en_mushi2.c
@@ -103,7 +103,11 @@ static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneDownward, 20, ICHAIN_STOP),
};
-static f32 D_80A6BA14[] = { 0.06f, 0.1f, 0.13f };
+f32 D_80A6BA14[] = {
+ 0.06f, // ENMUSHI2_0
+ 0.1f, // ENMUSHI2_1
+ 0.13f, // ENMUSHI2_2
+};
void func_80A687A0(EnMushi2* this) {
MtxF* matrix = Matrix_GetCurrent();
@@ -178,7 +182,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.unk20, NULL);
+ (D_80A6B998 + i)->unk_00, this->actor.csId, this->actor.halfDaysBits, NULL);
}
}
@@ -204,7 +208,7 @@ void func_80A68BC8(EnMushi2* this) {
if (this->unk_36C > 0) {
this->unk_36C--;
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_MUSI_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MUSI_WALK);
this->unk_36C = 3.0f / CLAMP_MIN(this->skelAnime.playSpeed, 0.12f);
if (this->unk_36C < 2) {
@@ -275,9 +279,9 @@ s32 func_80A68DD4(EnMushi2* this, PlayState* play) {
}
void func_80A68ED8(EnMushi2* this) {
- this->actor.velocity.x = this->actor.speedXZ * this->unk_328.x;
- this->actor.velocity.y = this->actor.speedXZ * this->unk_328.y;
- this->actor.velocity.z = this->actor.speedXZ * this->unk_328.z;
+ this->actor.velocity.x = this->actor.speed * this->unk_328.x;
+ this->actor.velocity.y = this->actor.speed * this->unk_328.y;
+ this->actor.velocity.z = this->actor.speed * this->unk_328.z;
Actor_UpdatePos(&this->actor);
}
@@ -439,7 +443,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) {
@@ -742,10 +747,10 @@ void EnMushi2_Init(Actor* thisx, PlayState* play) {
s32 sp3C;
Actor_ProcessInitChain(&this->actor, sInitChain);
- if (!ENMUSHI2_GET_3(&this->actor)) {
+ if (ENMUSHI2_GET_3(&this->actor) == ENMUSHI2_0) {
func_80A68A78(this, play);
}
- this->actor.shape.rot.y += Rand_S16Offset(-2000, 4000);
+ this->actor.shape.rot.y += Rand_S16Offset(-0x7D0, 0xFA0);
this->actor.home.rot.y = this->actor.shape.rot.y;
this->actor.world.rot.y = this->actor.shape.rot.y;
func_80A68F24(this);
@@ -758,7 +763,8 @@ void EnMushi2_Init(Actor* thisx, PlayState* play) {
this->actor.colChkInfo.mass = 30;
sp3C = func_80A69EE4(this, play);
- if ((sp3C == 0) && func_80A68860(this, play) && func_80A68910(this, play) && !ENMUSHI2_GET_3(&this->actor)) {
+ if ((sp3C == 0) && func_80A68860(this, play) && func_80A68910(this, play) &&
+ (ENMUSHI2_GET_3(&this->actor) == ENMUSHI2_0)) {
func_80A6A024(this);
}
@@ -797,7 +803,7 @@ void func_80A6A36C(EnMushi2* this, PlayState* play) {
s32 pad;
s32 sp20 = false;
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.2f);
+ Math_StepToF(&this->actor.speed, 0.0f, 0.2f);
this->actor.velocity.y -= this->actor.velocity.y * D_80A6BA14[ENMUSHI2_GET_3(&this->actor)];
Actor_MoveWithGravity(&this->actor);
func_80A69424(this, play);
@@ -820,10 +826,10 @@ void func_80A6A36C(EnMushi2* this, PlayState* play) {
return;
}
- if (this->actor.bgCheckFlags & 0x20) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER) {
func_80A6AAA4(this);
- } else if (this->actor.bgCheckFlags & 1) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GERUDOFT_WALK);
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GERUDOFT_WALK);
func_80A68F24(this);
func_80A691EC(this, this->actor.floorPoly, -1.0f);
func_80A69388(this);
@@ -850,14 +856,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.speedXZ, 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.speedXZ *= temp;
+ thisx->speed *= temp;
}
func_80A68ED8(this);
@@ -866,8 +872,8 @@ void func_80A6A5C0(EnMushi2* this, PlayState* play) {
func_80A69388(this);
}
- this->skelAnime.playSpeed = this->actor.speedXZ * 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 +900,9 @@ void func_80A6A794(EnMushi2* this) {
}
void func_80A6A824(EnMushi2* this, PlayState* play) {
- EnMushi2* this2 = this;
+ Actor* thisx = &this->actor;
- Math_SmoothStepToF(&this->actor.speedXZ, 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 +910,8 @@ void func_80A6A824(EnMushi2* this, PlayState* play) {
func_80A69388(this);
}
- this->skelAnime.playSpeed = (Rand_ZeroOne() * 0.8f) + (this->actor.speedXZ * 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);
@@ -963,9 +969,9 @@ void func_80A6AB08(EnMushi2* this, PlayState* play) {
s16 temp;
if (this->unk_368 > 80) {
- Math_StepToF(&this->actor.speedXZ, 0.6f, 0.08f);
+ Math_StepToF(&this->actor.speed, 0.6f, 0.08f);
} else {
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.02f);
+ Math_StepToF(&this->actor.speed, 0.0f, 0.02f);
}
Actor_MoveWithGravity(&this->actor);
@@ -1005,7 +1011,7 @@ void func_80A6AB08(EnMushi2* this, PlayState* play) {
func_80A6A094(this);
func_80A6A0D8(this);
func_80A6AE14(this);
- } else if (!(this->actor.bgCheckFlags & 0x20)) {
+ } else if (!(this->actor.bgCheckFlags & BGCHECKFLAG_WATER)) {
func_80A6A794(this);
}
}
@@ -1025,8 +1031,8 @@ void func_80A6AE7C(EnMushi2* this, PlayState* play) {
this->actor.shape.rot.x -= 0x1F4;
this->actor.shape.rot.y += 0xC8;
- this->actor.speedXZ += (Rand_ZeroOne() - 0.5f) * 0.16f;
- this->actor.speedXZ *= 0.9f;
+ this->actor.speed += (Rand_ZeroOne() - 0.5f) * 0.16f;
+ this->actor.speed *= 0.9f;
this->actor.world.rot.y += (s16)((Rand_ZeroOne() - 0.5f) * 2000.0f);
this->actor.gravity = -0.04f - (Rand_ZeroOne() * 0.02f);
this->actor.velocity.y *= 0.95f;
@@ -1049,7 +1055,7 @@ void func_80A6B078(EnMushi2* this) {
this->unk_30C &= ~1;
this->unk_368 = 50;
this->skelAnime.playSpeed = 1.9f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALTURA_BOUND);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALTURA_BOUND);
func_80A68B6C(this);
this->actionFunc = func_80A6B0D8;
}
@@ -1058,7 +1064,7 @@ void func_80A6B0D8(EnMushi2* this, PlayState* play) {
s32 pad[2];
f32 temp_f2;
- Math_SmoothStepToF(&this->actor.speedXZ, 0.0f, 0.4f, 1.2f, 0.0f);
+ Math_SmoothStepToF(&this->actor.speed, 0.0f, 0.4f, 1.2f, 0.0f);
temp_f2 = this->actor.scale.x - 0.0002f;
Actor_SetScale(&this->actor, CLAMP_MIN(temp_f2, 0.001f));
@@ -1077,19 +1083,20 @@ void func_80A6B0D8(EnMushi2* this, PlayState* play) {
}
this->actor.velocity.x =
- (this->actor.speedXZ * this->unk_328.x) + (-0.01f * this->unk_31C.x) + (this->unk_310.x * temp_f2);
+ (this->actor.speed * this->unk_328.x) + (-0.01f * this->unk_31C.x) + (this->unk_310.x * temp_f2);
this->actor.velocity.y =
- (this->actor.speedXZ * this->unk_328.y) + (-0.01f * this->unk_31C.y) + (this->unk_310.y * temp_f2);
+ (this->actor.speed * this->unk_328.y) + (-0.01f * this->unk_31C.y) + (this->unk_310.y * temp_f2);
this->actor.velocity.z =
- (this->actor.speedXZ * this->unk_328.z) + (-0.01f * this->unk_31C.z) + (this->unk_310.z * temp_f2);
+ (this->actor.speed * this->unk_328.z) + (-0.01f * this->unk_31C.z) + (this->unk_310.z * temp_f2);
if ((this->actor.flags & ACTOR_FLAG_40) && (this->unk_368 > 20) && (Rand_ZeroOne() < 0.15f)) {
Vec3f sp48;
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 +1166,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);
}
@@ -1225,7 +1232,7 @@ void EnMushi2_Update(Actor* thisx, PlayState* play) {
}
if ((this->unk_30C & 1) && func_80A68DD4(this, play)) {
- Actor_PickUp(&this->actor, play, GI_MAX, 60.0f, 30.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_MAX, 60.0f, 30.0f);
}
}
}
@@ -1234,6 +1241,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_Mushi2/z_en_mushi2.h b/src/overlays/actors/ovl_En_Mushi2/z_en_mushi2.h
index 1a776a52a..e0c381133 100644
--- a/src/overlays/actors/ovl_En_Mushi2/z_en_mushi2.h
+++ b/src/overlays/actors/ovl_En_Mushi2/z_en_mushi2.h
@@ -9,6 +9,14 @@ typedef void (*EnMushi2ActionFunc)(struct EnMushi2*, PlayState*);
#define ENMUSHI2_GET_3(thisx) ((thisx)->params & 3)
+#define ENMUSHI2_PARAMS(param) ((param) & 3)
+
+typedef enum {
+ /* 0 */ ENMUSHI2_0,
+ /* 1 */ ENMUSHI2_1,
+ /* 2 */ ENMUSHI2_2
+} EnMush2Param;
+
typedef struct {
/* 0x0 */ s16 unk_00;
/* 0x2 */ s16 unk_02;
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 f9d17ca96..5ed82cbc2 100644
--- a/src/overlays/actors/ovl_En_Muto/z_en_muto.c
+++ b/src/overlays/actors/ovl_En_Muto/z_en_muto.c
@@ -7,7 +7,7 @@
#include "z_en_muto.h"
#include "objects/object_toryo/object_toryo.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnMuto*)thisx)
@@ -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 {
@@ -87,7 +87,7 @@ void EnMuto_Init(Actor* thisx, PlayState* play) {
}
}
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
this->actor.gravity = -3.0f;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
EnMuto_SetupIdle(this);
@@ -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;
}
@@ -177,7 +177,7 @@ void EnMuto_Idle(EnMuto* this, PlayState* play) {
}
}
- func_800B8614(&this->actor, play, 80.0f);
+ Actor_OfferTalk(&this->actor, play, 80.0f);
}
void EnMuto_SetupDialogue(EnMuto* this, PlayState* play) {
@@ -199,7 +199,7 @@ void EnMuto_InDialogue(EnMuto* this, PlayState* play) {
if (!this->isInMayorsRoom) {
this->yawTowardsTarget = this->actor.yawTowardsPlayer;
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
if (this->actor.textId == 0x62C) {
SET_WEEKEVENTREG(WEEKEVENTREG_88_08);
@@ -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..7ac6a3b58 100644
--- a/src/overlays/actors/ovl_En_Nb/z_en_nb.c
+++ b/src/overlays/actors/ovl_En_Nb/z_en_nb.c
@@ -7,7 +7,7 @@
#include "z_en_nb.h"
#include "objects/object_nb/object_nb.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((EnNb*)thisx)
@@ -26,9 +26,6 @@ s32 func_80BC00AC(Actor* thisx, PlayState* play);
s32 func_80BC01DC(Actor* thisx, PlayState* play);
#define EN_NB_FLAG_NONE (0)
-#define EN_NB_FLAG_1 (1 << 0)
-#define EN_NB_FLAG_2 (1 << 1)
-#define EN_NB_FLAG_4 (1 << 2)
#define EN_NB_FLAG_8 (1 << 3)
#define EN_NB_FLAG_10 (1 << 4)
#define EN_NB_FLAG_20 (1 << 5)
@@ -43,7 +40,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 +63,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 +224,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 +266,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 +279,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 +289,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 +297,7 @@ s32 func_80BC00AC(Actor* thisx, PlayState* play) {
break;
case ENNB_BEHAVIOUR_9:
- ActorCutscene_Stop(cutscene);
+ CutsceneManager_Stop(csId);
this->behaviour++;
ret = true;
break;
@@ -369,7 +366,7 @@ s32 func_80BC01DC(Actor* thisx, PlayState* play) {
gSaveContext.save.time = CLOCK_TIME(8, 0);
Sram_IncrementDay();
} else {
- func_800FE658(120.0f);
+ Environment_SetTimeJump(120.0f);
}
this->behaviour++;
@@ -403,18 +400,17 @@ u8* func_80BC045C(EnNb* this, PlayState* play) {
s32 func_80BC04FC(EnNb* this, PlayState* play) {
s32 ret = false;
- if (this->stateFlags & (EN_NB_FLAG_1 | EN_NB_FLAG_2 | EN_NB_FLAG_4)) {
- if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- this->stateFlags |= EN_NB_FLAG_20;
- SubS_UpdateFlags(&this->stateFlags, EN_NB_FLAG_NONE, EN_NB_FLAG_1 | EN_NB_FLAG_2 | EN_NB_FLAG_4);
- this->behaviour = ENNB_BEHAVIOUR_0;
- this->msgEventCallback = NULL;
- this->actor.child = this->unk_1E8;
- this->msgEventScript = func_80BC045C(this, play);
- this->stateFlags |= EN_NB_FLAG_20;
- this->actionFunc = func_80BC0EAC;
- ret = true;
- }
+ if (((this->stateFlags & SUBS_OFFER_MODE_MASK) != SUBS_OFFER_MODE_NONE) &&
+ Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ this->stateFlags |= EN_NB_FLAG_20;
+ SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
+ this->behaviour = ENNB_BEHAVIOUR_0;
+ this->msgEventCallback = NULL;
+ this->actor.child = this->unk_1E8;
+ this->msgEventScript = func_80BC045C(this, play);
+ this->stateFlags |= EN_NB_FLAG_20;
+ this->actionFunc = func_80BC0EAC;
+ ret = true;
}
return ret;
}
@@ -459,7 +455,7 @@ void func_80BC06C4(EnNb* this) {
if (this->unk_1E8->id == ACTOR_PLAYER) {
player = (Player*)this->unk_1E8;
- sp40.y = player->bodyPartsPos[7].y + 3.0f;
+ sp40.y = player->bodyPartsPos[PLAYER_BODYPART_HEAD].y + 3.0f;
} else {
Math_Vec3f_Copy(&sp40, &this->unk_1E8->focus.pos);
}
@@ -576,7 +572,7 @@ s32 func_80BC0B98(EnNb* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 success = false;
if (EnNb_FindActor(this, play, ACTORCAT_NPC, ACTOR_EN_AN) != NULL) {
- SubS_UpdateFlags(&this->stateFlags, EN_NB_FLAG_1 | EN_NB_FLAG_2, EN_NB_FLAG_1 | EN_NB_FLAG_2 | EN_NB_FLAG_4);
+ SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->stateFlags |= EN_NB_FLAG_20;
EnNb_ChangeAnim(this, EN_NB_ANIM_0);
success = true;
@@ -587,9 +583,9 @@ s32 func_80BC0B98(EnNb* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 func_80BC0C0C(EnNb* this, PlayState* play, ScheduleOutput* scheduleOutput) {
if (!CHECK_EVENTINF(EVENTINF_43)) {
- SubS_UpdateFlags(&this->stateFlags, EN_NB_FLAG_1 | EN_NB_FLAG_2, EN_NB_FLAG_1 | EN_NB_FLAG_2 | EN_NB_FLAG_4);
+ SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
} else {
- SubS_UpdateFlags(&this->stateFlags, EN_NB_FLAG_4, EN_NB_FLAG_1 | EN_NB_FLAG_2 | EN_NB_FLAG_4);
+ SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_AUTO, SUBS_OFFER_MODE_MASK);
}
EnNb_ChangeAnim(this, EN_NB_ANIM_0);
@@ -599,8 +595,8 @@ s32 func_80BC0C0C(EnNb* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 EnNb_ProcessScheduleOutput(EnNb* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 success;
- this->actor.flags |= ACTOR_FLAG_1;
- this->actor.targetMode = 0;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
+ this->actor.targetMode = TARGET_MODE_0;
this->stateFlags = EN_NB_FLAG_NONE;
this->unk_274 = 40.0f;
@@ -644,16 +640,16 @@ void EnNb_FollowSchedule(EnNb* this, PlayState* play) {
scheduleOutput.result = EN_NB_SCH_1;
EnNb_ProcessScheduleOutput(this, play, &scheduleOutput);
this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
} else if (!Schedule_RunScript(play, sScheduleScript, &scheduleOutput) ||
((this->scheduleResult != scheduleOutput.result) &&
!EnNb_ProcessScheduleOutput(this, play, &scheduleOutput))) {
this->actor.shape.shadowDraw = NULL;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
scheduleOutput.result = EN_NB_SCH_NONE;
} else {
this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}
this->scheduleResult = scheduleOutput.result;
@@ -668,7 +664,7 @@ void func_80BC0EAC(EnNb* this, PlayState* play) {
CLEAR_EVENTINF(EVENTINF_43);
}
- SubS_UpdateFlags(&this->stateFlags, EN_NB_FLAG_1 | EN_NB_FLAG_2, EN_NB_FLAG_1 | EN_NB_FLAG_2 | EN_NB_FLAG_4);
+ SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
if (this->scheduleResult != EN_NB_SCH_2) {
this->stateFlags &= ~EN_NB_FLAG_20;
}
@@ -696,7 +692,7 @@ void EnNb_Init(Actor* thisx, PlayState* play) {
this->stateFlags = EN_NB_FLAG_NONE;
if (CHECK_EVENTINF(EVENTINF_43)) {
- SubS_UpdateFlags(&this->stateFlags, EN_NB_FLAG_4, EN_NB_FLAG_1 | EN_NB_FLAG_2 | EN_NB_FLAG_4);
+ SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_AUTO, SUBS_OFFER_MODE_MASK);
} else {
CLEAR_EVENTINF(EVENTINF_42);
CLEAR_EVENTINF(EVENTINF_43);
@@ -724,8 +720,8 @@ void EnNb_Update(Actor* thisx, PlayState* play) {
EnNb_UpdateSkelAnime(this);
func_80BC0800(this);
if (Actor_IsFacingPlayer(&this->actor, 0x38E0)) {
- func_8013C964(&this->actor, play, this->unk_274, 30.0f, ITEM_OCARINA,
- this->stateFlags & (EN_NB_FLAG_1 | EN_NB_FLAG_2 | EN_NB_FLAG_4));
+ SubS_Offer(&this->actor, play, this->unk_274, 30.0f, PLAYER_IA_NONE,
+ this->stateFlags & SUBS_OFFER_MODE_MASK);
}
func_80BBFF24(this, play);
}
@@ -745,7 +741,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 +785,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 86099a214..a6301a495 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
@@ -7,7 +7,7 @@
#include "z_en_neo_reeba.h"
#include "objects/object_rb/object_rb.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_200)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_200)
#define THIS ((EnNeoReeba*)thisx)
@@ -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 = {
@@ -133,7 +133,7 @@ void EnNeoReeba_Init(Actor* thisx, PlayState* play) {
}
this->actor.colChkInfo.damageTable = &sDamageTable;
- this->actor.targetMode = 2;
+ this->actor.targetMode = TARGET_MODE_2;
this->actor.hintId = TATL_HINT_ID_LEEVER;
this->actor.gravity = -0.5f;
@@ -160,7 +160,7 @@ void EnNeoReeba_Destroy(Actor* thisx, PlayState* play) {
}
void EnNeoReeba_SetupWaitUnderground(EnNeoReeba* this) {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.draw = NULL;
this->actionTimer = 10;
this->actionFunc = EnNeoReeba_WaitUnderground;
@@ -171,7 +171,7 @@ void EnNeoReeba_WaitUnderground(EnNeoReeba* this, PlayState* play) {
s32 pad;
Player* player = GET_PLAYER(play);
- if ((Actor_XZDistanceToPoint(&player->actor, &this->actor.home.pos) < 200.0f) &&
+ if ((Actor_WorldDistXZToPoint(&player->actor, &this->actor.home.pos) < 200.0f) &&
(Player_GetMask(play) != PLAYER_MASK_STONE) && (fabsf(this->actor.playerHeightRel) < 100.0f)) {
EnNeoReeba_SetupRise(this);
}
@@ -199,7 +199,7 @@ void EnNeoReeba_SetupChooseAction(EnNeoReeba* this) {
void EnNeoReeba_ChooseAction(EnNeoReeba* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- f32 distToPlayer = Actor_XZDistanceToPoint(&player->actor, &this->actor.home.pos);
+ f32 distToPlayer = Actor_WorldDistXZToPoint(&player->actor, &this->actor.home.pos);
if ((distToPlayer > 200.0f) || (fabsf(this->actor.playerHeightRel) > 100.0f)) {
EnNeoReeba_SetupSink(this);
@@ -207,8 +207,8 @@ void EnNeoReeba_ChooseAction(EnNeoReeba* this, PlayState* play) {
if (this->actionTimer == 0) {
if ((distToPlayer < 140.0f) && (fabsf(this->actor.playerHeightRel) < 100.0f)) {
this->targetPos = player->actor.world.pos;
- this->targetPos.x += 10.0f * player->actor.speedXZ * Math_SinS(player->actor.world.rot.y);
- this->targetPos.z += 10.0f * player->actor.speedXZ * Math_CosS(player->actor.world.rot.y);
+ this->targetPos.x += 10.0f * player->actor.speed * Math_SinS(player->actor.world.rot.y);
+ this->targetPos.z += 10.0f * player->actor.speed * Math_CosS(player->actor.world.rot.y);
EnNeoReeba_SetupMove(this);
} else {
EnNeoReeba_SetupReturnHome(this);
@@ -224,7 +224,7 @@ void EnNeoReeba_ChooseAction(EnNeoReeba* this, PlayState* play) {
void EnNeoReeba_SetupSink(EnNeoReeba* this) {
this->sinkRiseRate = 0.0f;
this->skelAnime.playSpeed = 2.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
this->actionFunc = EnNeoReeba_Sink;
}
@@ -247,8 +247,8 @@ void EnNeoReeba_SetupRise(EnNeoReeba* this) {
this->actor.draw = EnNeoReeba_Draw;
this->sinkRiseRate = 300.0f;
this->skelAnime.playSpeed = 2.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_APPEAR);
- this->actor.flags |= ACTOR_FLAG_1;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_APPEAR);
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actionFunc = EnNeoReeba_RiseOutOfGround;
}
@@ -268,28 +268,28 @@ void EnNeoReeba_RiseOutOfGround(EnNeoReeba* this, PlayState* play) {
}
void EnNeoReeba_SetupMove(EnNeoReeba* this) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_RIVA_MOVE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_RIVA_MOVE);
this->sfxTimer = 10;
this->actionTimer = 60;
this->actionFunc = EnNeoReeba_Move;
this->skelAnime.playSpeed = 2.0f;
- this->actor.speedXZ = 14.0f;
+ this->actor.speed = 14.0f;
}
void EnNeoReeba_Move(EnNeoReeba* this, PlayState* play) {
- f32 remainingDist = Math_Vec3f_StepToXZ(&this->actor.world.pos, &this->targetPos, this->actor.speedXZ);
+ f32 remainingDist = Math_Vec3f_StepToXZ(&this->actor.world.pos, &this->targetPos, this->actor.speed);
Actor_SpawnFloorDustRing(play, &this->actor, &this->actor.world.pos, this->actor.shape.shadowScale, 1, 4.0f, 0xFA,
0xA, 1);
if (remainingDist < 2.0f) {
EnNeoReeba_SetupChooseAction(this);
- } else if (remainingDist < 40.0f && this->actor.speedXZ > 3.0f) {
- this->actor.speedXZ -= 2.0f;
+ } else if (remainingDist < 40.0f && this->actor.speed > 3.0f) {
+ this->actor.speed -= 2.0f;
}
if (this->sfxTimer == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_RIVA_MOVE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_RIVA_MOVE);
this->sfxTimer = 10;
} else {
this->sfxTimer--;
@@ -304,21 +304,21 @@ void EnNeoReeba_Move(EnNeoReeba* this, PlayState* play) {
void EnNeoReeba_SetupReturnHome(EnNeoReeba* this) {
this->actionFunc = EnNeoReeba_ReturnHome;
- this->actor.speedXZ = 6.0f;
+ this->actor.speed = 6.0f;
}
void EnNeoReeba_ReturnHome(EnNeoReeba* this, PlayState* play) {
Player* player = GET_PLAYER(play);
s32 pad;
- f32 remainingDist = Math_Vec3f_StepToXZ(&this->actor.world.pos, &this->actor.home.pos, this->actor.speedXZ);
+ f32 remainingDist = Math_Vec3f_StepToXZ(&this->actor.world.pos, &this->actor.home.pos, this->actor.speed);
if (remainingDist < 2.0f) {
EnNeoReeba_SetupChooseAction(this);
- } else if (remainingDist < 40.0f && this->actor.speedXZ > 3.0f) {
- this->actor.speedXZ -= 1.0f;
+ } else if (remainingDist < 40.0f && this->actor.speed > 3.0f) {
+ this->actor.speed -= 1.0f;
}
- if (Actor_XZDistanceToPoint(&player->actor, &this->actor.home.pos) > 200.0f ||
+ if (Actor_WorldDistXZToPoint(&player->actor, &this->actor.home.pos) > 200.0f ||
fabsf(this->actor.playerHeightRel) > 100.0f) {
EnNeoReeba_SetupSink(this);
}
@@ -333,7 +333,7 @@ void EnNeoReeba_SetupBounce(EnNeoReeba* this) {
}
void EnNeoReeba_Bounce(EnNeoReeba* this, PlayState* play) {
- if (Math_Vec3f_StepToXZ(&this->actor.world.pos, &this->targetPos, this->actor.speedXZ) < 2.0f) {
+ if (Math_Vec3f_StepToXZ(&this->actor.world.pos, &this->targetPos, this->actor.speed) < 2.0f) {
EnNeoReeba_SetupChooseAction(this);
}
@@ -345,7 +345,7 @@ void EnNeoReeba_Bounce(EnNeoReeba* this, PlayState* play) {
}
void EnNeoReeba_SetupStun(EnNeoReeba* this) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
this->actionFunc = EnNeoReeba_Stunned;
}
@@ -378,7 +378,7 @@ void EnNeoReeba_SetupFrozen(EnNeoReeba* this) {
this->stunTimer = 12;
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
this->actionFunc = EnNeoReeba_Frozen;
}
@@ -407,8 +407,8 @@ void EnNeoReeba_SetupDamageAnim(EnNeoReeba* this) {
this->velToTarget.x = Math_SinS(this->actor.yawTowardsPlayer) * -12.0f;
this->velToTarget.z = Math_CosS(this->actor.yawTowardsPlayer) * -12.0f;
this->rotationSpeed = 4551.0f;
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 25);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_RIVA_DAMAGE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 25);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_RIVA_DAMAGE);
this->actionFunc = EnNeoReeba_DamageAnim;
}
@@ -444,11 +444,11 @@ void EnNeoReeba_SetupDeathEffects(EnNeoReeba* this) {
this->velToTarget.z = Math_CosS(this->actor.yawTowardsPlayer) * -12.0f;
this->rotationSpeed = 3640.0f;
- Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, 0, 25);
- this->actor.flags |= ACTOR_FLAG_8000000;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 25);
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_RIVA_DEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_RIVA_DEAD);
this->actionFunc = EnNeoReeba_PlayDeathEffects;
}
@@ -562,12 +562,12 @@ void EnNeoReeba_HandleHit(EnNeoReeba* this, PlayState* play) {
this->stunTimer = 40;
this->drawEffectAlpha = 1.0f;
this->drawEffectScale = 2.0f;
- Actor_SetColorFilter(&this->actor, 0, 0x78, 0, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 120, COLORFILTER_BUFFLAG_OPA, 40);
EnNeoReeba_SetupStun(this);
break;
case EN_NEO_REEBA_DMGEFF_STUN:
- Actor_SetColorFilter(&this->actor, 0, 0x78, 0, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 120, COLORFILTER_BUFFLAG_OPA, 40);
EnNeoReeba_SetupStun(this);
break;
}
@@ -604,35 +604,35 @@ 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);
}
}
void EnNeoReeba_DrawFrozenEffects(EnNeoReeba* this, PlayState* play) {
s32 i;
- f32 limbPosScale = 10.0f;
+ f32 bodyPartPosScaleXZ = 10.0f;
f32 phi_f2 = 20.0f;
f32 drawEffectScale = 0.8f;
if (EN_NEO_REEBA_IS_LARGE(&this->actor)) {
- limbPosScale *= 1.5f;
+ bodyPartPosScaleXZ *= 1.5f;
phi_f2 *= 1.5f;
drawEffectScale *= 1.5f;
}
- for (i = 0; i < ARRAY_COUNT(this->limbPos) - 1; i++) {
- this->limbPos[i] = this->actor.world.pos;
+ for (i = 0; i <= EN_NEO_REEBA_BODYPART_2; i++) {
+ this->bodyPartsPos[i] = this->actor.world.pos;
- this->limbPos[i].x += limbPosScale * Math_SinS(BINANG_ADD(this->actor.shape.rot.y, i * 0x5555));
- this->limbPos[i].z += limbPosScale * Math_CosS(BINANG_ADD(this->actor.shape.rot.y, i * 0x5555));
- this->limbPos[i].y += 5.0f;
+ this->bodyPartsPos[i].x += bodyPartPosScaleXZ * Math_SinS(BINANG_ADD(this->actor.shape.rot.y, i * 0x5555));
+ this->bodyPartsPos[i].z += bodyPartPosScaleXZ * Math_CosS(BINANG_ADD(this->actor.shape.rot.y, i * 0x5555));
+ this->bodyPartsPos[i].y += 5.0f;
}
- this->limbPos[ARRAY_COUNT(this->limbPos) - 1] = this->actor.world.pos;
- this->limbPos[ARRAY_COUNT(this->limbPos) - 1].y += phi_f2;
+ this->bodyPartsPos[EN_NEO_REEBA_BODYPART_3] = this->actor.world.pos;
+ this->bodyPartsPos[EN_NEO_REEBA_BODYPART_3].y += phi_f2;
this->drawEffectScale = drawEffectScale;
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), drawEffectScale, 0.5f,
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, EN_NEO_REEBA_BODYPART_MAX, drawEffectScale, 0.5f,
this->drawEffectAlpha, this->drawEffectType);
}
@@ -646,15 +646,15 @@ void EnNeoReeba_DrawEffects(EnNeoReeba* this, PlayState* play) {
if ((this->drawEffectType == ACTOR_DRAW_DMGEFF_FIRE) || (this->drawEffectType == ACTOR_DRAW_DMGEFF_LIGHT_ORBS) ||
(this->drawEffectType == ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_SMALL)) {
- for (i = 0; i < ARRAY_COUNT(this->limbPos) - 1; i++) {
- this->limbPos[i] = this->actor.world.pos;
- this->limbPos[i].x += scale * Math_SinS(BINANG_ADD(this->actor.shape.rot.y, i * 0x5555));
- this->limbPos[i].z += scale * Math_CosS(BINANG_ADD(this->actor.shape.rot.y, i * 0x5555));
- this->limbPos[i].y += -20.0f;
+ for (i = 0; i <= EN_NEO_REEBA_BODYPART_2; i++) {
+ this->bodyPartsPos[i] = this->actor.world.pos;
+ this->bodyPartsPos[i].x += scale * Math_SinS(BINANG_ADD(this->actor.shape.rot.y, i * 0x5555));
+ this->bodyPartsPos[i].z += scale * Math_CosS(BINANG_ADD(this->actor.shape.rot.y, i * 0x5555));
+ this->bodyPartsPos[i].y += -20.0f;
}
- this->limbPos[ARRAY_COUNT(this->limbPos) - 1] = this->actor.world.pos;
- Actor_DrawDamageEffects(play, NULL, this->limbPos, ARRAY_COUNT(this->limbPos), this->drawEffectScale, 0.5f,
+ this->bodyPartsPos[EN_NEO_REEBA_BODYPART_3] = this->actor.world.pos;
+ Actor_DrawDamageEffects(play, NULL, this->bodyPartsPos, EN_NEO_REEBA_BODYPART_MAX, this->drawEffectScale, 0.5f,
this->drawEffectAlpha, this->drawEffectType);
}
}
@@ -672,8 +672,8 @@ void EnNeoReeba_SpawnIce(EnNeoReeba* this, PlayState* play) {
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 30, NA_SE_EV_ICE_BROKEN);
- for (i = 0; i < ARRAY_COUNT(this->limbPos); i++) {
- yaw = Math_Vec3f_Yaw(&this->actor.world.pos, &this->limbPos[i]);
+ for (i = 0; i < EN_NEO_REEBA_BODYPART_MAX; i++) {
+ yaw = Math_Vec3f_Yaw(&this->actor.world.pos, &this->bodyPartsPos[i]);
xVel = Math_SinS(yaw) * 3.0f;
zVel = Math_CosS(yaw) * 3.0f;
@@ -681,7 +681,8 @@ void EnNeoReeba_SpawnIce(EnNeoReeba* this, PlayState* play) {
iceVel.x = (Rand_Centered() * 3.0f) + xVel;
iceVel.z = (Rand_Centered() * 3.0f) + zVel;
iceVel.y = (Rand_ZeroOne() * 6.0f) + 4.0f;
- EffectSsEnIce_Spawn(play, &this->limbPos[i], 0.7f, &iceVel, &sIceAccel, &sIcePrimColor, &sIceEnvColor, 30);
+ EffectSsEnIce_Spawn(play, &this->bodyPartsPos[i], 0.7f, &iceVel, &sIceAccel, &sIcePrimColor, &sIceEnvColor,
+ 30);
}
}
}
@@ -729,11 +730,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_Neo_Reeba/z_en_neo_reeba.h b/src/overlays/actors/ovl_En_Neo_Reeba/z_en_neo_reeba.h
index 2cd24c88e..1be3d2c4a 100644
--- a/src/overlays/actors/ovl_En_Neo_Reeba/z_en_neo_reeba.h
+++ b/src/overlays/actors/ovl_En_Neo_Reeba/z_en_neo_reeba.h
@@ -10,6 +10,14 @@ struct EnNeoReeba;
typedef void (*EnNeoReebaActionFunc)(struct EnNeoReeba*, PlayState*);
+typedef enum EnNeoReebaBodyPart {
+ /* 0 */ EN_NEO_REEBA_BODYPART_0,
+ /* 1 */ EN_NEO_REEBA_BODYPART_1,
+ /* 2 */ EN_NEO_REEBA_BODYPART_2,
+ /* 3 */ EN_NEO_REEBA_BODYPART_3,
+ /* 4 */ EN_NEO_REEBA_BODYPART_MAX
+} EnNeoReebaBodyPart;
+
typedef struct EnNeoReeba {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
@@ -19,7 +27,7 @@ typedef struct EnNeoReeba {
/* 0x2AC */ EnNeoReebaActionFunc actionFunc;
/* 0x2B0 */ Vec3f targetPos;
/* 0x2BC */ Vec3f velToTarget;
- /* 0x2C8 */ Vec3f limbPos[4];
+ /* 0x2C8 */ Vec3f bodyPartsPos[EN_NEO_REEBA_BODYPART_MAX];
/* 0x2F8 */ f32 sinkRiseRate;
/* 0x2FC */ f32 rotationSpeed;
/* 0x300 */ f32 drawEffectAlpha;
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 abaf6c3e0..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) {
@@ -81,15 +81,15 @@ void EnNimotsu_Update(Actor* thisx, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
- if (!(this->dustDone & 1) && (this->actor.bgCheckFlags & 1)) {
+ if (!(this->dustDone & 1) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
if (DECR(this->timer) == 0) {
this->dustDone |= 1;
}
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 1c9212a63..fa8771862 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,
@@ -86,50 +86,29 @@ static ColliderCylinderInit sCylinderInit = {
{ 15, 25, 4, { 0, 0, 0 } },
};
-static Vec3f D_808934C4 = {
- 90000.0f,
- 90000.0f,
- 90000.0f,
-};
-
-static InitChainEntry sInitChain[] = {
- ICHAIN_U8(targetMode, 6, ICHAIN_CONTINUE),
- ICHAIN_F32_DIV1000(gravity, -2000, ICHAIN_CONTINUE),
- ICHAIN_F32(targetArrowOffset, 0, ICHAIN_STOP),
-};
-
-static Vec3f D_808934DC = {
- 90000.0f,
- 90000.0f,
- 90000.0f,
-};
-
-static Vec3f D_808934E8 = {
- 90000.0f,
- 90000.0f,
- 90000.0f,
-};
-
-static s32 pad = 0;
-
void EnNiw_Init(Actor* thisx, PlayState* play) {
+ static InitChainEntry sInitChain[] = {
+ ICHAIN_U8(targetMode, TARGET_MODE_6, ICHAIN_CONTINUE),
+ ICHAIN_F32_DIV1000(gravity, -2000, ICHAIN_CONTINUE),
+ ICHAIN_F32(targetArrowOffset, 0, ICHAIN_STOP),
+ };
EnNiw* this = THIS;
- Vec3f dTemp = D_808934C4;
+ Vec3f D_808934C4 = { 90000.0f, 90000.0f, 90000.0f };
if (this->actor.params < 0) { // all scene spawned cucco are (-1)
this->actor.params = NIW_TYPE_REGULAR;
}
- Math_Vec3f_Copy(&this->unk2BC, &dTemp);
+ Math_Vec3f_Copy(&this->unk2BC, &D_808934C4);
this->niwType = this->actor.params;
Actor_ProcessInitChain(&this->actor, sInitChain);
- this->actor.flags |= ACTOR_FLAG_1; // targetable ON
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
ActorShape_Init(&thisx->shape, 0.0f, ActorShadow_DrawCircle, 25.0f);
- SkelAnime_InitFlex(play, &this->skelanime, &gNiwSkeleton, &gNiwIdleAnim, this->jointTable, this->morphTable,
+ SkelAnime_InitFlex(play, &this->skelAnime, &gNiwSkel, &gNiwIdleAnim, this->jointTable, this->morphTable,
NIW_LIMB_MAX);
Math_Vec3f_Copy(&this->unk2A4, &this->actor.world.pos);
Math_Vec3f_Copy(&this->unk2B0, &this->actor.world.pos);
@@ -138,9 +117,6 @@ void EnNiw_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 0.01f);
if (this->niwType == NIW_TYPE_UNK1) {
- // @Bug this unused variant is broken and crashes on spawn (EnNiw_Update expects a parent, NULL)
- // if modified to change niwType to TYPE_REGULAR here, new size is smaller than normal
- // theory: was meant to be a small hand held cucco for grog to show the player
Actor_SetScale(&this->actor, (BREG(86) / 10000.0f) + 0.004f);
}
@@ -154,13 +130,13 @@ void EnNiw_Init(Actor* thisx, PlayState* play) {
}
if (this->niwType == NIW_TYPE_HELD) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CHICKEN_CRY_M);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_CHICKEN_CRY_M);
this->sfxTimer1 = 30;
this->heldTimer = 30;
- this->actor.flags &= ~ACTOR_FLAG_1; // targetable OFF
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->niwState = NIW_STATE_HELD;
this->actionFunc = EnNiw_Held;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->unk2BC.z = 0.0f;
this->actor.velocity.y = 0.0f;
this->actor.gravity = 0.0f;
@@ -212,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
@@ -259,6 +236,9 @@ void EnNiw_AnimateWingHead(EnNiw* this, PlayState* play, s16 animationState) {
this->targetLimbRots[7] = 10000.0f;
}
break;
+
+ default:
+ break;
}
}
@@ -295,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);
@@ -319,8 +299,8 @@ void EnNiw_UpdateRunning(EnNiw* this, PlayState* play, s32 isStormCucco) {
if (this->hopTimer == 0) {
this->hopTimer = 3;
- if (this->actor.bgCheckFlags & 1) { // hit floor
- this->actor.velocity.y = 3.5f; // hopping up while running away
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->actor.velocity.y = 3.5f; // hopping up while running away
}
}
@@ -336,8 +316,7 @@ void EnNiw_UpdateRunning(EnNiw* this, PlayState* play, s32 isStormCucco) {
runningDirection = -runningAngles[isStormCucco];
}
- if (isStormCucco == true &&
- (this->runAwayTimer == 0 || (this->actor.bgCheckFlags & 8))) { // bgCheckFlags 8: hit a wall
+ if ((isStormCucco == true) && ((this->runAwayTimer == 0) || (this->actor.bgCheckFlags & BGCHECKFLAG_WALL))) {
this->runAwayTimer = 150;
if (this->yawTimer == 0) {
this->yawTimer = 70;
@@ -352,7 +331,7 @@ void EnNiw_UpdateRunning(EnNiw* this, PlayState* play, s32 isStormCucco) {
}
void EnNiw_SetupIdle(EnNiw* this) {
- Animation_Change(&this->skelanime, &gNiwIdleAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gNiwIdleAnim), ANIMMODE_LOOP,
+ Animation_Change(&this->skelAnime, &gNiwIdleAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gNiwIdleAnim), ANIMMODE_LOOP,
-10.0f);
this->niwState = NIW_STATE_IDLE;
this->actionFunc = EnNiw_Idle;
@@ -361,22 +340,22 @@ 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) {
- if (Actor_HasParent(&this->actor, play)) { // picked up
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CHICKEN_CRY_M); // crow
+ if (Actor_HasParent(&this->actor, play)) { // picked up
+ Actor_PlaySfx(&this->actor, NA_SE_EV_CHICKEN_CRY_M); // crow
this->sfxTimer1 = 30;
this->heldTimer = 30;
- this->actor.flags &= ~ACTOR_FLAG_1; // targetable OFF
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->niwState = NIW_STATE_HELD;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = EnNiw_Held;
return;
} else {
- Actor_LiftActor(&this->actor, play);
+ Actor_OfferCarry(&this->actor, play);
}
} else { // NIW_TYPE_UNK1 || NIW_TYPE_HELD
this->unkIdleTimer2 = 10;
@@ -392,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);
@@ -414,8 +393,8 @@ void EnNiw_Idle(EnNiw* this, PlayState* play) {
} else {
this->unkIdleTimer = 4;
- if (this->actor.bgCheckFlags & 1) { // hit floor
- this->actor.speedXZ = 0.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->actor.speed = 0.0f;
this->actor.velocity.y = 3.5f; // hopping up and down
}
}
@@ -451,7 +430,7 @@ void EnNiw_Idle(EnNiw* this, PlayState* play) {
}
void EnNiw_Held(EnNiw* this, PlayState* play) {
- Vec3f vec3fcopy = D_808934DC;
+ Vec3f D_808934DC = { 90000.0f, 90000.0f, 90000.0f };
s16 rotZ;
if (this->heldTimer == 0) {
@@ -459,15 +438,15 @@ 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;
rotZ = this->actor.shape.rot.z;
this->niwState = NIW_STATE_FALLING;
- this->actor.flags |= ACTOR_FLAG_1; // targetable ON
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actionFunc = EnNiw_Thrown;
this->actor.shape.rot.y = rotZ;
this->actor.shape.rot.x = rotZ;
@@ -476,7 +455,7 @@ void EnNiw_Held(EnNiw* this, PlayState* play) {
this->actor.shape.rot.z = 0;
rotZ = this->actor.shape.rot.z;
this->actor.velocity.y = 8.0f;
- this->actor.speedXZ = 4.0f;
+ this->actor.speed = 4.0f;
this->actor.gravity = -2.0f;
this->niwState = NIW_STATE_FALLING;
this->unk2EC = 0;
@@ -484,8 +463,8 @@ void EnNiw_Held(EnNiw* this, PlayState* play) {
this->actor.shape.rot.y = rotZ;
this->actor.shape.rot.x = rotZ;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
- Math_Vec3f_Copy(&this->unk2BC, &vec3fcopy);
- this->actor.flags |= ACTOR_FLAG_1; // targetable ON
+ Math_Vec3f_Copy(&this->unk2BC, &D_808934DC);
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actionFunc = EnNiw_Thrown;
}
@@ -494,16 +473,16 @@ void EnNiw_Held(EnNiw* this, PlayState* play) {
void EnNiw_Thrown(EnNiw* this, PlayState* play) {
if (this->unk2EC == 0) {
- if (this->actor.bgCheckFlags & 1) { // hit floor
- this->unk2EC = 1;
- this->hoppingTimer = 80; // hop timer
- this->actor.speedXZ = 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 & 1) { // hit floor
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->sfxTimer1 = 0;
this->actor.velocity.y = 4.0f; // vertical hop
this->unk29E = 1;
@@ -519,17 +498,17 @@ void EnNiw_Thrown(EnNiw* this, PlayState* play) {
if (Actor_HasParent(&this->actor, play)) {
// picked up again before could run off
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CHICKEN_CRY_M); // crow
+ Actor_PlaySfx(&this->actor, NA_SE_EV_CHICKEN_CRY_M); // crow
this->sfxTimer1 = 30;
this->unk2EC = 0;
this->heldTimer = 30;
- this->actor.flags &= ~ACTOR_FLAG_1; // targetable OFF
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->niwState = NIW_STATE_HELD;
this->actionFunc = EnNiw_Held;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
} else {
if (this->hoppingTimer > 5) {
- Actor_LiftActor(&this->actor, play);
+ Actor_OfferCarry(&this->actor, play);
}
EnNiw_AnimateWingHead(this, play, NIW_ANIM_PECKING_AND_WAVING);
}
@@ -544,8 +523,8 @@ void EnNiw_Swimming(EnNiw* this, PlayState* play) {
EnNiw_SpawnAttackNiw(this, play); // spawn attack niw
}
- this->actor.speedXZ = 2.0f;
- if (this->actor.bgCheckFlags & 0x20) { // touching water
+ this->actor.speed = 2.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER) {
this->actor.gravity = 0.0f;
if (this->actor.depthInWater > 15.0f) {
this->actor.world.pos.y += 2.0f;
@@ -557,21 +536,21 @@ void EnNiw_Swimming(EnNiw* this, PlayState* play) {
EffectSsGRipple_Spawn(play, &ripplePos, 100, 500, 30);
}
- if (this->actor.bgCheckFlags & 8) { // hit a wall
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->actor.velocity.y = 10.0f; // fly up in straight line
- this->actor.speedXZ = 1.0f;
+ this->actor.speed = 1.0f;
}
} else {
this->actor.gravity = -2.0f;
- if (this->actor.bgCheckFlags & 8) { // hit a wall
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->actor.velocity.y = 10.0f; // fly up in straight line
- this->actor.speedXZ = 1.0f;
+ this->actor.speed = 1.0f;
this->actor.gravity = 0.0f;
} else {
- this->actor.speedXZ = 4.0f;
+ this->actor.speed = 4.0f;
}
- if (this->actor.bgCheckFlags & 1) { // hit floor
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->actor.gravity = -2.0f;
this->runAwayTimer = 100;
this->swimRippleTimer = 0;
@@ -629,13 +608,13 @@ void EnNiw_SetupCuccoStorm(EnNiw* this, PlayState* play) {
this->targetLimbRots[1] = 0.0f;
this->targetLimbRots[2] = 0.0f;
this->unkTimer24C = 10;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CHICKEN_CRY_M);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_CHICKEN_CRY_M);
}
if (this->cuccoStormTimer == 0) {
this->cuccoStormTimer = 10;
this->yawTowardsPlayer = this->actor.yawTowardsPlayer;
- this->actor.flags &= ~ACTOR_FLAG_1; // targetable OFF
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->niwState = NIW_STATE_ANGRY3;
this->actionFunc = EnNiw_CuccoStorm;
}
@@ -646,7 +625,7 @@ void EnNiw_SetupCuccoStorm(EnNiw* this, PlayState* play) {
void EnNiw_CuccoStorm(EnNiw* this, PlayState* play) {
EnNiw_SpawnAttackNiw(this, play);
if (this->cuccoStormTimer == 1) { // not countdown to 0? mistype?
- this->actor.speedXZ = 3.0f;
+ this->actor.speed = 3.0f;
this->isRunningRight = Rand_ZeroFloat(1.99f);
this->generalTimer1 = 0;
this->unkTimer24E = this->generalTimer1;
@@ -657,17 +636,17 @@ void EnNiw_CuccoStorm(EnNiw* this, PlayState* play) {
}
void EnNiw_SetupRunAway(EnNiw* this) {
- Animation_Change(&this->skelanime, &gNiwIdleAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gNiwIdleAnim), ANIMMODE_LOOP,
+ Animation_Change(&this->skelAnime, &gNiwIdleAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gNiwIdleAnim), ANIMMODE_LOOP,
-10.0f);
this->isRunningRight = Rand_ZeroFloat(1.99f);
this->niwState = NIW_STATE_RUNNING;
this->actionFunc = EnNiw_RunAway;
- this->actor.speedXZ = 4.0f;
+ this->actor.speed = 4.0f;
}
void EnNiw_RunAway(EnNiw* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- Vec3f tempVec3f = D_808934E8;
+ Vec3f D_808934E8 = { 90000.0f, 90000.0f, 90000.0f };
s16 temp298;
f32 dX;
f32 dZ;
@@ -678,12 +657,12 @@ void EnNiw_RunAway(EnNiw* this, PlayState* play) {
this->unk2A4.z = this->unk2B0.z = this->actor.world.pos.z;
this->generalTimer2 = this->generalTimer1 = this->unk298 = 0;
this->unk300 = this->unk304 = 0;
- this->actor.speedXZ = 0;
+ this->actor.speed = 0;
this->targetLimbRots[8] = 0;
this->targetLimbRots[6] = 0;
this->targetLimbRots[5] = 0;
this->targetLimbRots[7] = 0;
- Math_Vec3f_Copy(&this->unk2BC, &tempVec3f);
+ Math_Vec3f_Copy(&this->unk2BC, &D_808934E8);
EnNiw_SetupIdle(this);
@@ -702,20 +681,20 @@ void EnNiw_RunAway(EnNiw* this, PlayState* play) {
}
void EnNiw_LandBeforeIdle(EnNiw* this, PlayState* play) {
- if (this->actor.bgCheckFlags & 1) { // hit floor
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
EnNiw_SetupIdle(this);
}
}
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;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CHICKEN_CRY_M); // crow
+ Actor_PlaySfx(&this->actor, NA_SE_EV_CHICKEN_CRY_M); // crow
this->runAwayTimer = 100;
this->unk2EC = 0;
EnNiw_SetupRunAway(this);
@@ -728,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;
@@ -746,13 +725,13 @@ void EnNiw_CheckRage(EnNiw* this, PlayState* play) {
this->actionFunc = EnNiw_Trigger;
this->unk304 = 0.0f;
this->unk300 = 0.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
} else {
this->iframeTimer = 10;
this->sfxTimer1 = 30;
this->unk29E = 1;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CHICKEN_CRY_M); // crow
+ Actor_PlaySfx(&this->actor, NA_SE_EV_CHICKEN_CRY_M); // crow
this->runAwayTimer = 100;
this->unk2EC = 0;
EnNiw_SetupRunAway(this);
@@ -794,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;
@@ -837,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
@@ -857,7 +838,7 @@ void EnNiw_Update(Actor* thisx, PlayState* play) {
this->actor.world.pos.y = this->actor.home.pos.y + 300.0f;
}
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.gravity = -2.0f;
Math_Vec3f_Copy(&this->unk2A4, &this->actor.home.pos);
Math_Vec3f_Copy(&this->unk2B0, &this->actor.home.pos);
@@ -890,8 +871,8 @@ void EnNiw_Update(Actor* thisx, PlayState* play) {
return;
}
- if ((this->actor.bgCheckFlags & 0x20) && // touching water
- this->actor.depthInWater > 15.0f && this->niwState != NIW_STATE_SWIMMING) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WATER) && (this->actor.depthInWater > 15.0f) &&
+ (this->niwState != NIW_STATE_SWIMMING)) {
this->actor.velocity.y = 0.0f;
this->actor.gravity = 0.0f;
Math_Vec3f_Copy(&pos, &this->actor.world.pos);
@@ -904,33 +885,33 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_EN_CHICKEN_FLUTTER);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_CHICKEN_FLUTTER);
}
if (this->sfxTimer1 == 0) {
if (this->niwState != NIW_STATE_IDLE) {
this->sfxTimer1 = 30;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CHICKEN_CRY_A);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_CHICKEN_CRY_A);
} else {
this->sfxTimer1 = 300;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CHICKEN_CRY_N);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_CHICKEN_CRY_N);
}
}
- 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);
}
}
@@ -961,8 +942,8 @@ 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);
- SkelAnime_DrawFlexOpa(play, this->skelanime.skeleton, this->skelanime.jointTable, this->skelanime.dListCount,
+ 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);
}
@@ -1025,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 c1cec3b88..769a67c17 100644
--- a/src/overlays/actors/ovl_En_Niw/z_en_niw.h
+++ b/src/overlays/actors/ovl_En_Niw/z_en_niw.h
@@ -24,7 +24,7 @@ typedef struct {
typedef struct EnNiw {
/* 0x000 */ Actor actor;
- /* 0x144 */ SkelAnime skelanime;
+ /* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ Vec3s jointTable[NIW_LIMB_MAX];
/* 0x1E8 */ Vec3s morphTable[NIW_LIMB_MAX];
/* 0x248 */ EnNiwActionFunc actionFunc;
@@ -79,7 +79,7 @@ typedef struct EnNiw {
/* 0x2E8 */ s16 yawTowardsPlayer;
/* 0x2EA */ s16 headRotationToggle;
/* 0x2EC */ s16 unk2EC;
- /* 0x2EE */ UNK_TYPE1 pad2EE[0x6];
+ /* 0x2EE */ UNK_TYPE1 pad2EE[0x6];
/* 0x2F4 */ f32 unusedFloat2F4; // set in EnNiw_Update if Cucco falls off map, never read
/* 0x2F8 */ f32 unusedFloat2F8;
/* 0x2FC */ f32 unusedFloat2FC;
@@ -91,12 +91,13 @@ typedef struct EnNiw {
/* 0x35C */ EnNiwFeather feathers[NIW_FEATHER_COUNT];
} EnNiw; // size = 0x7BC
-// in init, any value below zero becomes zero
-// however, in vanilla, only 0xFFFF (-1) exists in scene spawns, actors can spawn 0x0
-#define NIW_TYPE_VANILLA 0xFFFF
-#define NIW_TYPE_REGULAR 0
-#define NIW_TYPE_UNK1 1
-#define NIW_TYPE_HELD 2 // spawns held by the bomber kid in east clock town during hide and seek
+typedef enum {
+ /* -1 */ NIW_TYPE_VANILLA = -1, // Will be converted to 0, in vanilla exists only in scene spawns
+ /* 0 */ NIW_TYPE_REGULAR,
+ /* 1 */ NIW_TYPE_UNK1, // This unused variant must be spawned as a child, as it expects a NON-NULL parent.
+ // Theory: This was meant to be a small hand held cucco for Grog to show the player
+ /* 2 */ NIW_TYPE_HELD // spawns held by the bomber kid in east clock town during hide and seek
+} NiwType;
// the attacking cuccos are not here, they are a different actor: [ ovl_En_Attack_Niw ]
typedef enum {
@@ -105,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..f5e35f478 100644
--- a/src/overlays/actors/ovl_En_Nnh/z_en_nnh.c
+++ b/src/overlays/actors/ovl_En_Nnh/z_en_nnh.c
@@ -7,7 +7,7 @@
#include "z_en_nnh.h"
#include "objects/object_nnh/object_nnh.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnNnh*)thisx)
@@ -59,7 +59,7 @@ void EnNnh_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 0.01f);
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
- this->actor.targetMode = 1;
+ this->actor.targetMode = TARGET_MODE_1;
this->actor.focus.pos = this->actor.world.pos;
this->actor.focus.pos.y += 30.0f;
EnNnh_SetupWaitForDialogue(this);
@@ -80,7 +80,7 @@ void EnNnh_WaitForDialogue(EnNnh* this, PlayState* play) {
Message_StartTextbox(play, 0x228, &this->actor);
EnNnh_SetupDialogue(this);
} else {
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
}
@@ -104,10 +104,11 @@ void EnNnh_Update(Actor* thisx, PlayState* play) {
}
void EnNnh_Draw(Actor* thisx, PlayState* play) {
- GraphicsContext* gfxCtx = play->state.gfxCtx;
- s32 pad;
+ OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(gfxCtx);
- gSPMatrix(gfxCtx->polyOpa.p++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(gfxCtx->polyOpa.p++, gButlerSonMainBodyDL);
+ 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++, gButlerSonMainBodyDL);
+
+ CLOSE_DISPS(play->state.gfxCtx);
}
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 ad872cd21..f8673c307 100644
--- a/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c
+++ b/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c
@@ -57,7 +57,7 @@ void EnNutsball_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 400.0f, ActorShadow_DrawCircle, 13.0f);
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
this->actor.shape.rot.y = 0;
- this->actor.speedXZ = 10.0f;
+ this->actor.speed = 10.0f;
if (this->actor.params == 2) {
this->timer = 1;
this->timerThreshold = 0;
@@ -80,7 +80,7 @@ void EnNutsball_Destroy(Actor* thisx, PlayState* play) {
}
void EnNutsball_InitColliderParams(EnNutsball* this) {
- this->collider.base.atFlags &= ~AT_TYPE_ENEMY & ~AT_BOUNCED & ~AT_HIT;
+ this->collider.base.atFlags &= ~(AT_HIT | AT_TYPE_ENEMY | AT_BOUNCED);
this->collider.base.atFlags |= AT_TYPE_PLAYER;
this->collider.info.toucher.dmgFlags = 0x400000;
this->collider.info.toucher.damage = 2;
@@ -107,9 +107,9 @@ void EnNutsball_Update(Actor* thisx, PlayState* play2) {
this->actor.world.rot.x = Math_Atan2S_XY(spdXZ, this->actor.velocity.y);
}
this->actor.home.rot.z += 0x2AA8;
- if ((this->actor.bgCheckFlags & 8) || (this->actor.bgCheckFlags & 1) || (this->actor.bgCheckFlags & 16) ||
- (this->collider.base.atFlags & AT_HIT) || (this->collider.base.acFlags & AC_HIT) ||
- (this->collider.base.ocFlags1 & OC1_HIT)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) || (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
+ (this->actor.bgCheckFlags & BGCHECKFLAG_CEILING) || (this->collider.base.atFlags & AT_HIT) ||
+ (this->collider.base.acFlags & AC_HIT) || (this->collider.base.ocFlags1 & OC1_HIT)) {
if ((player->currentShield == PLAYER_SHIELD_HEROS_SHIELD) && (this->collider.base.atFlags & AT_HIT) &&
(this->collider.base.atFlags & AT_TYPE_ENEMY) && (this->collider.base.atFlags & AT_BOUNCED)) {
EnNutsball_InitColliderParams(this);
@@ -136,18 +136,20 @@ 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 & 8) {
- if (func_800C9A4C(&play->colCtx, this->actor.wallPoly, this->actor.wallBgId) & 0x30) {
- this->actor.bgCheckFlags &= ~8;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
+ 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 {
- this->actor.bgCheckFlags |= 8;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_WALL;
}
} else {
Math_Vec3f_Copy(&this->actor.world.pos, &worldPos);
@@ -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 74ac78b5f..ed8edb377 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,
@@ -61,7 +61,7 @@ void EnNwc_Init(Actor* thisx, PlayState* play) {
s32 niwObjectIndex;
EnNwc* this = THIS;
- niwObjectIndex = Object_GetIndex(&play->objectCtx, OBJECT_NIW);
+ niwObjectIndex = Object_GetSlot(&play->objectCtx, OBJECT_NIW);
if (niwObjectIndex < 0) {
// niw object does not exist, we need it for tranformation, despawn
Actor_Kill(&this->actor);
@@ -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;
}
@@ -172,32 +172,40 @@ s32 EnNwc_IsFound(EnNwc* this, PlayState* play) {
}
void EnNwc_ChangeState(EnNwc* this, s16 newState) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
switch (newState) {
case NWC_STATE_CHECK_BREMAN:
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;
@@ -209,7 +217,7 @@ void EnNwc_ChangeState(EnNwc* this, s16 newState) {
* If previously checking for breman -> select random (NWC_STATE_TURNING, NWC_STATE_HOPPING_FORWARD)
*/
void EnNwc_ToggleState(EnNwc* this) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->state != NWC_STATE_CHECK_BREMAN) {
EnNwc_ChangeState(this, NWC_STATE_CHECK_BREMAN);
} else {
@@ -234,20 +242,20 @@ void EnNwc_CheckFound(EnNwc* this, PlayState* play) {
}
EnNwc_ChangeState(this, NWC_STATE_FOLLOWING);
- func_801A0868(&gSfxDefaultPos, NA_SE_SY_CHICK_JOIN_CHIME, currentChickCount);
+ Audio_PlaySfx_AtPosWithAllChannelsIO(&gSfxDefaultPos, NA_SE_SY_CHICK_JOIN_CHIME, currentChickCount);
}
}
void EnNwc_LoadNiwSkeleton(EnNwc* this, PlayState* play) {
if (Object_IsLoaded(&play->objectCtx, this->niwObjectIndex)) {
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->niwObjectIndex].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->niwObjectIndex].segment);
- SkelAnime_InitFlex(play, &this->niwSkeleton, &gNiwSkeleton, &gNiwIdleAnim, this->jointTable, this->morphTable,
+ SkelAnime_InitFlex(play, &this->niwSkeleton, &gNiwSkel, &gNiwIdleAnim, this->jointTable, this->morphTable,
NIW_LIMB_MAX);
Animation_Change(&this->niwSkeleton, &gNiwIdleAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gNiwIdleAnim),
ANIMMODE_LOOP, 0.0f);
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->nwcObjectIndex].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->nwcObjectIndex].segment);
this->state = NWC_STATE_NIW_LOADED;
EnNwc_ToggleState(this);
}
@@ -276,7 +284,7 @@ void EnNwc_Follow(EnNwc* this, PlayState* play) {
s16 targetUpperBodyRot = 0;
s16 targetFootRot = 0;
- if (this->actor.speedXZ > 0.0f) {
+ if (this->actor.speed > 0.0f) {
if (this->stateTimer & 4) {
targetFootRot = 0x1B58;
targetUpperBodyRot = -0x2710;
@@ -289,16 +297,16 @@ 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) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CHICK_SONG);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_CHICK_SONG);
}
}
- if (this->grog->actor.home.rot.z >= 20 && // all 10 chicks have been found
- (this->hasGrownUp & 1) == false) {
+ if ((this->grog->actor.home.rot.z >= 20) && // all 10 chicks have been found
+ !(this->hasGrownUp & 1)) {
this->transformTimer += 2;
if (this->transformTimer >= (s32)(s16)((this->actor.home.rot.z * 0x1E) + 0x1E)) {
// it is our turn to transform
@@ -306,13 +314,13 @@ void EnNwc_Follow(EnNwc* this, PlayState* play) {
this->grog->actor.home.rot.x += 2; // increment grog's adult tranformation counter
EnNwc_SpawnDust(this, play);
Actor_SetScale(&this->actor, 0.002f);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CHICK_TO_CHICKEN);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_CHICK_TO_CHICKEN);
}
}
Math_Vec3f_Diff(&chickCoords[this->actor.home.rot.z], &this->actor.world.pos, &targetVector);
if (SQXZ(targetVector) < SQ(5.0f)) { // too close to keep moving, stop
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
// first nwc in the line follows player, the rest follow the previous one
if (this->actor.home.rot.z == 1) {
@@ -323,13 +331,13 @@ 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) {
this->randomRot = -0x1388;
}
- this->actor.speedXZ = 2.0f;
+ this->actor.speed = 2.0f;
newRotY = Math_Vec3f_Yaw(&this->actor.world.pos, &chickCoords[this->actor.home.rot.z]) + this->randomRot;
}
@@ -356,9 +364,9 @@ void EnNwc_Follow(EnNwc* this, PlayState* play) {
}
if (this->grog->actor.home.rot.x >= 20) { // all chicks have turned into adult cucco, stop and crow
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CHICKEN_CRY_M);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_CHICKEN_CRY_M);
this->actionFunc = EnNwc_CrowAtTheEnd;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
Actor_SetScale(&this->actor, 0.01f);
}
}
@@ -378,14 +386,14 @@ void EnNwc_HopForward(EnNwc* this, PlayState* play) {
this->actor.velocity.y = 2.0f; // hop up and down
}
if ((this->stateTimer & 0xB) == 8) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CHICK_SONG);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_CHICK_SONG);
}
// they only move forward while off the ground, which gives the visual of them hopping to move
- if (this->actor.bgCheckFlags & 0x1) { // touching floor
- this->actor.speedXZ = 0.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->actor.speed = 0.0f;
} else {
- this->actor.speedXZ = 2.0f;
+ this->actor.speed = 2.0f;
}
}
@@ -404,11 +412,11 @@ void EnNwc_RunAway(EnNwc* this, PlayState* play) {
this->actor.velocity.y = 2.0f; // hop up and down
}
if ((this->stateTimer & 0xB) == 8) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CHICK_SONG);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_CHICK_SONG);
}
- this->actor.speedXZ = 2.0f;
- if (this->actor.bgCheckFlags & 0x8) { // touching wall
+ this->actor.speed = 2.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
EnNwc_ToggleState(this);
}
}
@@ -429,11 +437,11 @@ void EnNwc_Turn(EnNwc* this, PlayState* play) {
}
if ((this->stateTimer & 0xB) == 8) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_CHICK_SONG);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_CHICK_SONG);
}
// they only rotate when off the ground, giving the visual that they turn by hopping
- if (!(this->actor.bgCheckFlags & 0x1)) { // NOT touching floor
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
Math_SmoothStepToS(&this->actor.shape.rot.y, this->fallingRotY, 0xA, 0x1000, 0x800);
this->actor.world.rot.y = this->actor.shape.rot.y;
}
@@ -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_Effect/z_en_okarina_effect.c b/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.c
index df778f1a7..780e3b300 100644
--- a/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.c
+++ b/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.c
@@ -41,7 +41,7 @@ void EnOkarinaEffect_Destroy(Actor* thisx, PlayState* play) {
void EnOkarinaEffect_Init(Actor* thisx, PlayState* play) {
EnOkarinaEffect* this = THIS;
- if (play->envCtx.unk_F2[1]) {
+ if (play->envCtx.precipitation[PRECIP_RAIN_CUR] != 0) {
Actor_Kill(&this->actor);
}
EnOkarinaEffect_SetupAction(this, func_8096B104);
@@ -49,10 +49,10 @@ void EnOkarinaEffect_Init(Actor* thisx, PlayState* play) {
void func_8096B104(EnOkarinaEffect* this, PlayState* play) {
this->unk144 = 0x50;
- play->envCtx.unk_F2[4] = 0x3C;
- D_801F4E70 = 501.0f;
- play->envCtx.unk_E3 = 2;
- func_800FD78C(play);
+ play->envCtx.precipitation[PRECIP_SOS_MAX] = 60;
+ gLightningStrike.delayTimer = 501.0f;
+ play->envCtx.lightningState = LIGHTNING_LAST;
+ Environment_PlayStormNatureAmbience(play);
EnOkarinaEffect_SetupAction(this, func_8096B174);
}
@@ -65,11 +65,11 @@ void func_8096B174(EnOkarinaEffect* this, PlayState* play) {
}
void func_8096B1FC(EnOkarinaEffect* this, PlayState* play) {
- if (play->envCtx.unk_F2[4]) {
+ if (play->envCtx.precipitation[PRECIP_SOS_MAX] != 0) {
if ((play->state.frames & 3) == 0) {
- play->envCtx.unk_F2[4]--;
- if (play->envCtx.unk_F2[4] == 8) {
- func_800FD858(play);
+ play->envCtx.precipitation[PRECIP_SOS_MAX]--;
+ if (play->envCtx.precipitation[PRECIP_SOS_MAX] == 8) {
+ Environment_StopStormNatureAmbience(play);
}
}
} else {
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 d4d3db017..9119e0609 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
@@ -6,7 +6,7 @@
#include "z_en_okarina_tag.h"
-#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_2000000 | ACTOR_FLAG_8000000)
+#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_2000000 | ACTOR_FLAG_CANT_LOCK_ON)
#define THIS ((EnOkarinaTag*)thisx)
@@ -37,10 +37,10 @@ void EnOkarinaTag_Init(Actor* thisx, PlayState* play) {
f32 zRot = 0.0f;
s32 i = 0;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->unk148 = ENOKARINATAG_GET_F800(thisx);
this->unk14A = ENOKARINATAG_GET_780(thisx);
- this->switchFlags = ENOKARINATAG_GET_SWITCHFLAGS(thisx);
+ this->switchFlag = ENOKARINATAG_GET_SWITCH_FLAG(thisx);
if (this->actor.world.rot.z > 0) {
zRot = this->actor.world.rot.z;
while (zRot > 10.0f) {
@@ -50,13 +50,13 @@ void EnOkarinaTag_Init(Actor* thisx, PlayState* play) {
}
this->unk154 = zRot * 50.0f;
this->unk158 = i * 50.0f;
- if (this->switchFlags == 0x7F) {
- this->switchFlags = -1;
+ if (this->switchFlag == 0x7F) {
+ this->switchFlag = -1;
}
if (this->unk14A == 0xF) {
this->unk14A = -1;
}
- this->actor.targetMode = 1;
+ this->actor.targetMode = TARGET_MODE_1;
this->actionFunc = func_8093E518;
}
@@ -66,14 +66,14 @@ void func_8093E518(EnOkarinaTag* this, PlayState* play) {
s16 yDiff;
u16 var_v1;
- if (this->switchFlags >= 0) {
+ if (this->switchFlag >= 0) {
if (this->unk148 == 0) {
- if (Flags_GetSwitch(play, this->switchFlags)) {
+ if (Flags_GetSwitch(play, this->switchFlag)) {
return;
}
}
if (this->unk148 == 1) {
- if (!Flags_GetSwitch(play, this->switchFlags)) {
+ if (!Flags_GetSwitch(play, this->switchFlag)) {
return;
}
}
@@ -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.scarecrowSpawnSongSet) {
return;
}
}
@@ -89,7 +89,7 @@ void func_8093E518(EnOkarinaTag* this, PlayState* play) {
var_v1 = 0;
}
if (func_800B8718(&this->actor, &play->state)) {
- func_80152434(play, var_v1 + 0x29);
+ Message_DisplayOcarinaStaff(play, OCARINA_ACTION_CHECK_HEALING + var_v1);
this->actionFunc = func_8093E68C;
} else {
yDiff = ABS_ALT((s16)(this->actor.yawTowardsPlayer - this->actor.world.rot.y));
@@ -111,33 +111,36 @@ void func_8093E518(EnOkarinaTag* this, PlayState* play) {
}
void func_8093E68C(EnOkarinaTag* this, PlayState* play) {
- if (play->msgCtx.ocarinaMode == 4) {
+ if (play->msgCtx.ocarinaMode == OCARINA_MODE_END) {
this->actionFunc = func_8093E518;
} else {
- if ((play->msgCtx.ocarinaMode == 3) ||
- ((this->unk14A == -1) &&
- ((play->msgCtx.ocarinaMode == 5) || (play->msgCtx.ocarinaMode == 6) || (play->msgCtx.ocarinaMode == 7) ||
- (play->msgCtx.ocarinaMode == 8) || (play->msgCtx.ocarinaMode == 0xA) || (play->msgCtx.ocarinaMode == 9) ||
- (play->msgCtx.ocarinaMode == 0xF)))) {
- if (this->switchFlags >= 0) {
+ if ((play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) ||
+ ((this->unk14A == -1) && ((play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_TIME) ||
+ (play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_HEALING) ||
+ (play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_EPONAS) ||
+ (play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_SOARING) ||
+ (play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_SUNS) ||
+ (play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_STORMS) ||
+ (play->msgCtx.ocarinaMode == OCARINA_MODE_F)))) {
+ if (this->switchFlag >= 0) {
switch (this->unk148) {
case 0:
- Flags_SetSwitch(play, this->switchFlags);
+ Flags_SetSwitch(play, this->switchFlag);
break;
case 1:
- Flags_UnsetSwitch(play, this->switchFlags);
+ Flags_UnsetSwitch(play, this->switchFlag);
break;
case 2:
- if (Flags_GetSwitch(play, this->switchFlags)) {
- Flags_UnsetSwitch(play, this->switchFlags);
+ if (Flags_GetSwitch(play, this->switchFlag)) {
+ Flags_UnsetSwitch(play, this->switchFlag);
} else {
- Flags_SetSwitch(play, this->switchFlags);
+ Flags_SetSwitch(play, this->switchFlag);
}
break;
}
}
- play->msgCtx.ocarinaMode = 4;
- play_sound(NA_SE_SY_CORRECT_CHIME);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
+ Audio_PlaySfx(NA_SE_SY_CORRECT_CHIME);
this->actionFunc = func_8093E518;
}
}
diff --git a/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.h b/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.h
index 0dd15c1c9..4c968b362 100644
--- a/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.h
+++ b/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.h
@@ -7,7 +7,7 @@ struct EnOkarinaTag;
typedef void (*EnOkarinaTagActionFunc)(struct EnOkarinaTag*, PlayState*);
-#define ENOKARINATAG_GET_SWITCHFLAGS(thisx) (((thisx)->params & 0x7F))
+#define ENOKARINATAG_GET_SWITCH_FLAG(thisx) (((thisx)->params & 0x7F))
#define ENOKARINATAG_GET_780(thisx) (((thisx)->params >> 0x7) & 0xF)
#define ENOKARINATAG_GET_F800(thisx) (((thisx)->params >> 0xB) & 0x1F)
@@ -16,7 +16,7 @@ typedef struct EnOkarinaTag {
/* 0x144 */ EnOkarinaTagActionFunc actionFunc;
/* 0x148 */ s16 unk148;
/* 0x14A */ s16 unk14A;
- /* 0x14C */ s32 switchFlags;
+ /* 0x14C */ s32 switchFlag;
/* 0x150 */ s8 unk150;
/* 0x154 */ f32 unk154;
/* 0x158 */ f32 unk158;
diff --git a/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c b/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c
index 8241c7e5c..3263d9b71 100644
--- a/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c
+++ b/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c
@@ -6,7 +6,7 @@
#include "z_en_okuta.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY)
#define THIS ((EnOkuta*)thisx)
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 df18de3e7..4e666ed5c 100644
--- a/src/overlays/actors/ovl_En_Onpuman/z_en_onpuman.c
+++ b/src/overlays/actors/ovl_En_Onpuman/z_en_onpuman.c
@@ -6,7 +6,7 @@
#include "z_en_onpuman.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnOnpuman*)thisx)
@@ -56,7 +56,7 @@ void EnOnpuman_Init(Actor* thisx, PlayState* play) {
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
Actor_SetScale(&this->actor, 0.01f);
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
this->unk_2A4 = 0;
this->unk_2A0 = NULL;
this->actionFunc = func_80B121D8;
@@ -84,16 +84,16 @@ Actor* func_80B11F44(PlayState* play) {
}
void func_80B11F78(EnOnpuman* this, PlayState* play) {
- if (play->msgCtx.ocarinaMode == 4) {
+ if (play->msgCtx.ocarinaMode == OCARINA_MODE_END) {
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);
+ } else if (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) {
+ Audio_PlaySfx(NA_SE_SY_CORRECT_CHIME);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
+ if (this->actor.csId != CS_ID_NONE) {
+ CutsceneManager_Stop(this->actor.csId);
}
this->actionFunc = func_80B121D8;
}
@@ -106,11 +106,11 @@ void func_80B1202C(EnOnpuman* this, PlayState* play2) {
switch (play->msgCtx.currentTextId) {
case 0x8D4:
this->unk_2A4 |= 1;
- func_80151938(play, 0x8DA);
+ Message_ContinueTextbox(play, 0x8DA);
break;
case 0x8DA:
- func_80151938(play, 0x8D6);
+ Message_ContinueTextbox(play, 0x8D6);
if (this->unk_2A0 != NULL) {
this->unk_2A0->home.rot.x = 0x50;
}
@@ -118,7 +118,7 @@ void func_80B1202C(EnOnpuman* this, PlayState* play2) {
case 0x8D6:
this->actionFunc = func_80B11F78;
- func_80152434(play, 0x3A);
+ Message_DisplayOcarinaStaff(play, OCARINA_ACTION_3A);
if (this->unk_2A0 != NULL) {
this->unk_2A0->home.rot.x = 0;
}
@@ -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);
}
}
}
@@ -140,7 +140,7 @@ void func_80B1202C(EnOnpuman* this, PlayState* play2) {
void func_80B1217C(EnOnpuman* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && (Message_ShouldAdvance(play))) {
this->actionFunc = func_80B121D8;
- func_801477B4(play);
+ Message_CloseTextbox(play);
}
}
@@ -158,7 +158,7 @@ void func_80B121D8(EnOnpuman* this, PlayState* play) {
if (this->actor.xzDistToPlayer < 200.0f) {
if (ABS_ALT(yaw) <= 0x4300) {
this->actor.textId = 0x8D3;
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
func_800B874C(&this->actor, play, 100.0f, 100.0f);
}
}
@@ -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 ac3c5ef6b..3a58ba62b 100644
--- a/src/overlays/actors/ovl_En_Osk/z_en_osk.c
+++ b/src/overlays/actors/ovl_En_Osk/z_en_osk.c
@@ -8,7 +8,7 @@
#include "objects/gameplay_keep/gameplay_keep.h"
#include "objects/object_ikn_demo/object_ikn_demo.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnOsk*)thisx)
@@ -66,8 +66,8 @@ void EnOsk_Init(Actor* thisx, PlayState* play) {
this->actionFunc = func_80BF5F60;
this->unk_254 = -1;
- this->unk_256 = -1;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->cueId = -1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
switch (ENOSK_GET_F(&this->actor)) {
case ENOSK_1:
@@ -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;
@@ -181,20 +181,20 @@ void func_80BF609C(EnOsk* this, PlayState* play) {
case 0:
if (Animation_OnFrame(&this->skelAnime, this->unk_25C) ||
Animation_OnFrame(&this->skelAnime, this->unk_25C + 8.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BOSU_TALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BOSU_TALK);
}
break;
case 1:
if (Animation_OnFrame(&this->skelAnime, this->unk_25C)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BOSU_TALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BOSU_TALK);
}
break;
case 2:
if (Animation_OnFrame(&this->skelAnime, this->unk_25C) ||
Animation_OnFrame(&this->skelAnime, this->unk_25C + 6.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BOSU_TALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BOSU_TALK);
}
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,12 +216,12 @@ 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);
func_80BF5EBC(this, play);
- func_800B9010(&this->actor, NA_SE_EN_COMMON_EXTINCT_LEV - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_COMMON_EXTINCT_LEV - SFX_FLAG);
} else {
this->actor.draw = NULL;
}
@@ -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;
@@ -280,25 +280,25 @@ void func_80BF6478(EnOsk* this) {
case 1:
if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 6.0f) ||
Animation_OnFrame(&this->skelAnime, 11.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DEBU_HEAD_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEBU_HEAD_UP);
}
break;
case 3:
if (Animation_OnFrame(&this->skelAnime, 11.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DEBU_HEAD_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEBU_HEAD_UP);
}
break;
case 4:
if (Animation_OnFrame(&this->skelAnime, 5.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DEBU_HEAD_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEBU_HEAD_UP);
}
break;
case 10:
case 11:
- func_800B9010(&this->actor, NA_SE_EN_YASE_LAUGH_K - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_YASE_LAUGH_K - SFX_FLAG);
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,17 +340,17 @@ 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);
func_80BF5EBC(this, play);
- func_800B9010(&this->actor, NA_SE_EN_COMMON_EXTINCT_LEV - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_COMMON_EXTINCT_LEV - SFX_FLAG);
} else {
this->actor.draw = NULL;
}
@@ -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;
@@ -406,31 +406,31 @@ void func_80BF68E0(EnOsk* this) {
case 7:
if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 6.0f) ||
Animation_OnFrame(&this->skelAnime, 11.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DEBU_HEAD_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEBU_HEAD_UP);
}
break;
case 2:
if (Animation_OnFrame(&this->skelAnime, 4.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DEBU_HEAD_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEBU_HEAD_UP);
}
break;
case 4:
if (Animation_OnFrame(&this->skelAnime, 5.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DEBU_HEAD_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEBU_HEAD_UP);
}
break;
case 5:
- if ((Animation_OnFrame(&this->skelAnime, 6.0f)) || Animation_OnFrame(&this->skelAnime, 11.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DEBU_HEAD_UP);
+ if (Animation_OnFrame(&this->skelAnime, 6.0f) || Animation_OnFrame(&this->skelAnime, 11.0f)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEBU_HEAD_UP);
}
break;
case 8:
if (Animation_OnFrame(&this->skelAnime, 13.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DEBU_HEAD_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DEBU_HEAD_UP);
}
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,12 +477,12 @@ 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);
func_80BF5EBC(this, play);
- func_800B9010(&this->actor, NA_SE_EN_COMMON_EXTINCT_LEV - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_COMMON_EXTINCT_LEV - SFX_FLAG);
} else {
this->actor.draw = NULL;
}
@@ -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));
@@ -536,18 +536,16 @@ void EnOsk_Draw(Actor* thisx, PlayState* play) {
Matrix_Translate(this->actor.focus.pos.x + sp80.x, this->actor.focus.pos.y + sp80.y,
sp80.z = this->actor.focus.pos.z + sp80.z, MTXMODE_NEW);
- sp80.z = Math_SinS(play->gameplayFrames << 0xE);
+ sp80.z = Math_SinS(play->gameplayFrames * 0x4000);
sp80.z = ((sp80.z + 1.0f) * 0.1f) + 2.0f;
Matrix_Scale(this->actor.scale.x * sp80.z, this->actor.scale.y * sp80.z, this->actor.scale.z * sp80.z,
MTXMODE_APPLY);
}
- gfx = func_8012C868(POLY_XLU_DISP);
+ gfx = POLY_XLU_DISP;
+ gfx = Gfx_SetupDL20_NoCD(gfx);
- gSPSetOtherMode(gfx++, G_SETOTHERMODE_H, 4, 4, 0x00000080);
- if (1) {}
- if (1) {}
- if (1) {}
+ gDPSetDither(gfx++, G_CD_NOISE);
gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0);
gSPDisplayList(gfx++, gameplay_keep_DL_029CB0);
gDPSetPrimColor(gfx++, 0, 0, 130, 0, 255, 100);
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 7df9d843d..29361e80f 100644
--- a/src/overlays/actors/ovl_En_Osn/z_en_osn.c
+++ b/src/overlays/actors/ovl_En_Osn/z_en_osn.c
@@ -7,7 +7,7 @@
#include "z_en_osn.h"
#include "objects/object_osn/object_osn.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnOsn*)thisx)
@@ -176,7 +176,7 @@ static DamageTable sDamageTable = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_U8(targetMode, 0, ICHAIN_STOP),
+ ICHAIN_U8(targetMode, TARGET_MODE_0, ICHAIN_STOP),
};
void EnOsn_UpdateCollider(EnOsn* this, PlayState* play) {
@@ -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,25 +692,25 @@ 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);
}
}
}
void EnOsn_ChooseAction(EnOsn* this, PlayState* play) {
- u32 isFlagSet = Flags_GetSwitch(play, 0);
+ u32 isSwitchFlagSet = Flags_GetSwitch(play, 0);
- this->cutscene = this->actor.cutscene;
+ this->csId = this->actor.csId;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, OSN_ANIM_IDLE);
- if (!isFlagSet) {
+ if (!isSwitchFlagSet) {
this->actionFunc = EnOsn_HandleCsAction;
} else {
this->actionFunc = EnOsn_Idle;
@@ -719,45 +720,46 @@ 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) &&
+ } else if (((this->actor.xzDistToPlayer < 100.0f) || this->actor.isLockedOn) && (yaw < 0x4000) &&
(yaw > -0x4000)) {
- func_800B863C(&this->actor, play);
+ Actor_OfferTalkNearColChkInfoCylinder(&this->actor, play);
this->actor.textId = 0xFFFF;
}
} else if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->textId = EnOsn_GetInitialText(this, play);
Message_StartTextbox(play, this->textId, &this->actor);
this->actionFunc = EnOsn_Talk;
- } else if (((this->actor.xzDistToPlayer < 100.0f) || this->actor.isTargeted) && (yaw < 0x4000) && (yaw > -0x4000)) {
- func_800B863C(&this->actor, play);
+ } else if (((this->actor.xzDistToPlayer < 100.0f) || this->actor.isLockedOn) && (yaw < 0x4000) && (yaw > -0x4000)) {
+ Actor_OfferTalkNearColChkInfoCylinder(&this->actor, 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,8 +852,8 @@ void EnOsn_HandleCsAction(EnOsn* this, PlayState* play) {
}
if ((this->animIndex == OSN_ANIM_BELIEVE) && (play->sceneId == SCENE_SPOT00) &&
- (gSaveContext.sceneLayer == 0xB) && (play->csCtx.frames == 400)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_VO_OMVO00);
+ (gSaveContext.sceneLayer == 0xB) && (play->csCtx.curFrame == 400)) {
+ Actor_PlaySfx(&this->actor, NA_SE_VO_OMVO00);
}
if (this->animIndex == OSN_ANIM_TURN_AROUND_START) {
@@ -867,15 +869,15 @@ void EnOsn_HandleCsAction(EnOsn* this, PlayState* play) {
}
if ((this->animIndex == OSN_ANIM_WALK_AWAY) &&
- (((Animation_OnFrame(&this->skelAnime, 17.0f))) || (Animation_OnFrame(&this->skelAnime, 27.0f)) ||
- (Animation_OnFrame(&this->skelAnime, 37.0f)) || (Animation_OnFrame(&this->skelAnime, 47.0f)) ||
- (Animation_OnFrame(&this->skelAnime, 57.0f)) || (Animation_OnFrame(&this->skelAnime, 67.0f)))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_OMENYA_WALK);
+ (Animation_OnFrame(&this->skelAnime, 17.0f) || Animation_OnFrame(&this->skelAnime, 27.0f) ||
+ Animation_OnFrame(&this->skelAnime, 37.0f) || Animation_OnFrame(&this->skelAnime, 47.0f) ||
+ 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);
}
}
@@ -886,7 +888,7 @@ void EnOsn_Talk(EnOsn* this, PlayState* play) {
if (((talkState == TEXT_STATE_DONE) || (talkState == TEXT_STATE_5)) && Message_ShouldAdvance(play)) {
if (this->stateFlags & OSN_STATE_END_CONVERSATION) {
this->stateFlags &= ~OSN_STATE_END_CONVERSATION;
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->actionFunc = EnOsn_Idle;
} else {
@@ -946,7 +948,7 @@ void EnOsn_Init(Actor* thisx, PlayState* play) {
break;
case OSN_TYPE_CUTSCENE:
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actionFunc = EnOsn_HandleCsAction;
break;
@@ -966,20 +968,20 @@ void EnOsn_Destroy(Actor* thisx, PlayState* play) {
void EnOsn_Update(Actor* thisx, PlayState* play) {
s32 pad;
EnOsn* this = THIS;
- u32 isFlagSet = Flags_GetSwitch(play, 0);
+ u32 isSwitchFlagSet = Flags_GetSwitch(play, 0);
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
SkelAnime_Update(&this->skelAnime);
if (ENOSN_GET_TYPE(&this->actor) == OSN_TYPE_CHOOSE) {
- if (isFlagSet) {
- this->actor.flags |= ACTOR_FLAG_1;
+ if (isSwitchFlagSet) {
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
EnOsn_UpdateCollider(this, play);
this->actor.draw = EnOsn_Draw;
} else {
this->actor.draw = NULL;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
}
@@ -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 d1f7dbec9..368052dfc 100644
--- a/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c
+++ b/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c
@@ -7,7 +7,7 @@
#include "z_en_ossan.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnOssan*)thisx)
@@ -31,7 +31,7 @@ void EnOssan_InitShop(EnOssan* this, PlayState* play);
void EnOssan_Idle(EnOssan* this, PlayState* play);
void EnOssan_BeginInteraction(EnOssan* this, PlayState* play);
void EnOssan_Hello(EnOssan* this, PlayState* play);
-void EnOssan_SetHaveMet(EnOssan* this);
+void EnOssan_SetTalked(EnOssan* this);
void EnOssan_StartShopping(PlayState* play, EnOssan* this);
void EnOssan_FaceShopkeeper(EnOssan* this, PlayState* play);
void EnOssan_LookToShopkeeperFromShelf(EnOssan* this, PlayState* play);
@@ -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->textboxEndType == TEXTBOX_ENDTYPE_10) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_11)) {
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;
}
}
@@ -265,13 +269,13 @@ void EnOssan_Init(Actor* thisx, PlayState* play) {
EnOssan* this = THIS;
s16 id;
- //! @bug Condition is impossible, params cannot be both greater then 1 AND less then 0.
if ((this->actor.params > ENOSSAN_PART_TIME_WORKER) && (this->actor.params < ENOSSAN_CURIOSITY_SHOP_MAN)) {
+ //! @bug: Impossible to reach, && should be an ||
Actor_Kill(&this->actor);
return;
}
id = sObjectIds[this->actor.params];
- this->objIndex = Object_GetIndex(&play->objectCtx, id);
+ this->objIndex = Object_GetSlot(&play->objectCtx, id);
if (this->objIndex < 0) {
Actor_Kill(&this->actor);
return;
@@ -300,7 +304,7 @@ void EnOssan_EndInteraction(PlayState* play, EnOssan* this) {
Player* player = GET_PLAYER(play);
Actor_ProcessTalkRequest(&this->actor, &play->state);
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
this->drawCursor = 0;
@@ -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) {
@@ -332,7 +336,7 @@ s32 EnOssan_TestEndInteraction(EnOssan* this, PlayState* play, Input* input) {
s32 EnOssan_TestCancelOption(EnOssan* this, PlayState* play, Input* input) {
if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
this->actionFunc = this->prevActionFunc;
- func_80151938(play, this->items[this->cursorIndex]->actor.textId);
+ Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
return true;
}
return false;
@@ -349,14 +353,14 @@ void EnOssan_SetupStartShopping(PlayState* play, EnOssan* this, u8 skipHello) {
void EnOssan_StartShopping(PlayState* play, EnOssan* this) {
EnOssan_SetupAction(this, EnOssan_FaceShopkeeper);
- func_80151938(play, 0x640);
+ Message_ContinueTextbox(play, 0x640);
func_8011552C(play, DO_ACTION_DECIDE);
this->stickRightPrompt.isEnabled = true;
this->stickLeftPrompt.isEnabled = true;
}
void EnOssan_SetupLookToShopkeeperFromShelf(PlayState* play, EnOssan* this) {
- play_sound(NA_SE_SY_CURSOR);
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
this->drawCursor = 0;
EnOssan_SetupAction(this, EnOssan_LookToShopkeeperFromShelf);
}
@@ -364,23 +368,23 @@ void EnOssan_SetupLookToShopkeeperFromShelf(PlayState* play, EnOssan* this) {
void EnOssan_Idle(EnOssan* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- SubS_FillLimbRotTables(play, this->limbRotTableY, this->limbRotTableZ, ARRAY_COUNT(this->limbRotTableY));
+ SubS_UpdateFidgetTables(play, this->fidgetTableY, this->fidgetTableZ, ENOSSAN_LIMB_MAX);
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
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)) {
- func_800B8614(&this->actor, play, 100.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)) {
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
if (this->actor.params == ENOSSAN_PART_TIME_WORKER) {
Math_SmoothStepToS(&this->partTimerHeadRot.y, 8000, 3, 2000, 0);
@@ -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);
+ EnOssan_SetTalked(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);
@@ -445,7 +454,7 @@ void EnOssan_BeginInteraction(EnOssan* this, PlayState* play) {
}
}
} else {
- EnOssan_SetHaveMet(this);
+ EnOssan_SetTalked(this);
this->textId = EnOssan_PartTimer_GetWelcome(this, play);
Message_StartTextbox(play, this->textId, &this->actor);
EnOssan_SetupStartShopping(play, this, false);
@@ -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;
}
@@ -586,7 +595,7 @@ void EnOssan_Hello(EnOssan* this, PlayState* play) {
SubS_ChangeAnimationByInfoS(&this->skelAnime, animationInfo, ANI_ANIM_APOLOGY_LOOP);
}
if ((this->animIndex == FSN_ANIM_SLAM_COUNTER_LOOP) && Animation_OnFrame(&this->skelAnime, 18.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_HANKO);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_HANKO);
}
}
@@ -596,23 +605,26 @@ s32 EnOssan_FacingShopkeeperDialogResult(EnOssan* this, PlayState* play) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
if ((this->actor.params == ENOSSAN_PART_TIME_WORKER) && (player->transformation == PLAYER_FORM_ZORA)) {
this->animIndex = ANI_ANIM_APOLOGY_LOOP;
SubS_ChangeAnimationByInfoS(&this->skelAnime, animationInfo, 9);
}
EnOssan_SetupAction(this, EnOssan_TalkToShopkeeper);
- func_80151938(play, sTalkOptionTextIds[this->actor.params]);
+ Message_ContinueTextbox(play, sTalkOptionTextIds[this->actor.params]);
func_8011552C(play, DO_ACTION_DECIDE);
this->stickLeftPrompt.isEnabled = false;
this->stickRightPrompt.isEnabled = false;
return true;
+
case 1:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
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) {
@@ -640,7 +652,7 @@ void EnOssan_FaceShopkeeper(EnOssan* this, PlayState* play) {
EnOssan_SetupAction(this, EnOssan_LookToLeftShelf);
func_8011552C(play, DO_ACTION_DECIDE);
this->stickLeftPrompt.isEnabled = false;
- play_sound(NA_SE_SY_CURSOR);
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
}
} else if (this->stickAccumX > 0) {
cursorIndex = EnOssan_SetCursorIndexFromNeutral(this, 0);
@@ -649,14 +661,14 @@ void EnOssan_FaceShopkeeper(EnOssan* this, PlayState* play) {
EnOssan_SetupAction(this, EnOssan_LookToRightShelf);
func_8011552C(play, DO_ACTION_DECIDE);
this->stickRightPrompt.isEnabled = false;
- play_sound(NA_SE_SY_CURSOR);
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
}
}
} else {
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);
- func_80151938(play, this->items[this->cursorIndex]->actor.textId);
+ 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);
- func_80151938(play, this->items[this->cursorIndex]->actor.textId);
+ Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
this->stickAccumX = 0;
@@ -824,14 +836,14 @@ s32 EnOssan_HasPlayerSelectedItem(PlayState* play, EnOssan* this, Input* input)
if (EnOssan_TestItemSelected(play)) {
if (!item->isOutOfStock) {
this->prevActionFunc = this->actionFunc;
- func_80151938(play, this->items[this->cursorIndex]->choiceTextId);
+ Message_ContinueTextbox(play, this->items[this->cursorIndex]->choiceTextId);
this->stickLeftPrompt.isEnabled = false;
this->stickRightPrompt.isEnabled = false;
- play_sound(NA_SE_SY_DECIDE);
+ Audio_PlaySfx(NA_SE_SY_DECIDE);
this->drawCursor = 0;
EnOssan_SetupAction(this, EnOssan_SelectItem);
} else {
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
}
return true;
}
@@ -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;
@@ -888,8 +900,8 @@ void EnOssan_BrowseLeftShelf(EnOssan* this, PlayState* play) {
}
EnOssan_CursorUpDown(this);
if (this->cursorIndex != prevCursorIndex) {
- func_80151938(play, this->items[this->cursorIndex]->actor.textId);
- play_sound(NA_SE_SY_CURSOR);
+ Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
}
}
}
@@ -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;
@@ -946,8 +958,8 @@ void EnOssan_BrowseRightShelf(EnOssan* this, PlayState* play) {
}
EnOssan_CursorUpDown(this);
if (this->cursorIndex != prevCursorIndex) {
- func_80151938(play, this->items[this->cursorIndex]->actor.textId);
- play_sound(NA_SE_SY_CURSOR);
+ Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
}
}
}
@@ -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);
}
}
}
@@ -981,8 +993,8 @@ void EnOssan_LookToShopkeeperFromShelf(EnOssan* this, PlayState* play) {
void EnOssan_SetupBuyItemWithFanfare(PlayState* play, EnOssan* this) {
Player* player = GET_PLAYER(play);
- Actor_PickUp(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f);
- play->msgCtx.msgMode = 0x43;
+ Actor_OfferGetItem(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f);
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
player->stateFlags2 &= ~PLAYER_STATE2_20000000;
Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
@@ -991,12 +1003,12 @@ void EnOssan_SetupBuyItemWithFanfare(PlayState* play, EnOssan* this) {
}
void EnOssan_SetupCannotBuy(PlayState* play, EnOssan* this, u16 textId) {
- func_80151938(play, textId);
+ Message_ContinueTextbox(play, textId);
EnOssan_SetupAction(this, EnOssan_CannotBuy);
}
void EnOssan_SetupBuy(PlayState* play, EnOssan* this, u16 textId) {
- func_80151938(play, textId);
+ Message_ContinueTextbox(play, textId);
EnOssan_SetupAction(this, EnOssan_CanBuy);
}
@@ -1006,45 +1018,54 @@ 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();
+ Audio_PlaySfx_MessageDecide();
item->buyFanfareFunc(play, item);
EnOssan_SetupBuyItemWithFanfare(play, this);
this->drawCursor = 0;
this->shopItemSelectedTween = 0.0f;
item->boughtFunc(play, item);
break;
+
case CANBUY_RESULT_SUCCESS_2:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
item->buyFunc(play, item);
EnOssan_SetupBuy(play, this, sBuySuccessTextIds[this->actor.params]);
this->drawCursor = 0;
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);
+ Audio_PlaySfx(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);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
EnOssan_SetupCannotBuy(play, this, sNeedEmptyBottleTextIds[this->actor.params]);
break;
+
case CANBUY_RESULT_NEED_RUPEES:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(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);
+ Audio_PlaySfx(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);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
EnOssan_SetupCannotBuy(play, this, sNoRoomTextIds[this->actor.params]);
break;
+
+ default:
+ break;
}
}
@@ -1058,10 +1079,14 @@ void EnOssan_SelectItem(EnOssan* this, PlayState* play) {
case 0:
EnOssan_HandleCanBuyItem(play, this);
break;
+
case 1:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
this->actionFunc = this->prevActionFunc;
- func_80151938(play, this->items[this->cursorIndex]->actor.textId);
+ Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
+ break;
+
+ default:
break;
}
}
@@ -1071,7 +1096,7 @@ void EnOssan_SelectItem(EnOssan* this, PlayState* play) {
void EnOssan_CannotBuy(EnOssan* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
this->actionFunc = this->prevActionFunc;
- func_80151938(play, this->items[this->cursorIndex]->actor.textId);
+ Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
}
}
@@ -1084,7 +1109,7 @@ void EnOssan_CanBuy(EnOssan* this, PlayState* play) {
item = this->items[this->cursorIndex];
item->restockFunc(play, item);
this->actionFunc = this->prevActionFunc;
- func_80151938(play, this->items[this->cursorIndex]->actor.textId);
+ Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
}
}
@@ -1093,23 +1118,23 @@ void EnOssan_BuyItemWithFanfare(EnOssan* this, PlayState* play) {
this->actor.parent = NULL;
EnOssan_SetupAction(this, EnOssan_SetupItemPurchased);
} else {
- Actor_PickUp(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f);
}
}
void EnOssan_SetupItemPurchased(EnOssan* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(play)) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
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);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
}
}
@@ -1127,22 +1152,23 @@ void EnOssan_ContinueShopping(EnOssan* this, PlayState* play) {
if (!EnOssan_TestEndInteraction(this, play, CONTROLLER1(&play->state))) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
player->actor.shape.rot.y = BINANG_ROT180(player->actor.shape.rot.y);
player->stateFlags2 |= PLAYER_STATE2_20000000;
Message_StartTextbox(play, this->textId, &this->actor);
EnOssan_SetupStartShopping(play, this, true);
- func_800B85E0(&this->actor, play, 100.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 100.0f, PLAYER_IA_MINUS1);
break;
+
case 1:
default:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
EnOssan_EndInteraction(play, this);
break;
}
}
}
- } 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);
@@ -1150,7 +1176,7 @@ void EnOssan_ContinueShopping(EnOssan* this, PlayState* play) {
player->stateFlags2 |= PLAYER_STATE2_20000000;
Message_StartTextbox(play, this->textId, &this->actor);
EnOssan_SetupStartShopping(play, this, true);
- func_800B85E0(&this->actor, play, 100.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 100.0f, PLAYER_IA_MINUS1);
}
}
@@ -1158,23 +1184,23 @@ 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)) {
- func_80151938(play, 0x642);
+ Message_ContinueTextbox(play, 0x642);
} else {
- func_800B85E0(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
}
}
@@ -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;
}
}
}
@@ -1369,91 +1395,109 @@ void EnOssan_CuriosityShopMan_Init(EnOssan* this, PlayState* play) {
}
void EnOssan_PartTimer_Init(EnOssan* this, PlayState* play) {
- SkelAnime_InitFlex(play, &this->skelAnime, &gAniSkeleton, &gAniStandingNormalAnim, this->jointTable,
- this->morphTable, 16);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gAniSkel, &gAniStandingNormalAnim, this->jointTable, this->morphTable,
+ ANI_LIMB_MAX);
this->actor.draw = EnOssan_PartTimer_Draw;
}
u16 EnOssan_CuriosityShopMan_GetWelcome(EnOssan* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- u16 textId = Text_GetFaceReaction(play, 0x2F);
+ u16 textId = Text_GetFaceReaction(play, FACE_REACTION_SET_CURIOSITY_SHOP_MAN);
if (textId != 0) {
this->animIndex = FSN_ANIM_HANDS_ON_COUNTER_START;
this->flags |= END_INTERACTION;
return textId;
}
+
switch (player->transformation) {
case PLAYER_FORM_DEKU:
this->animIndex = FSN_ANIM_SLAM_COUNTER_START;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_18_10)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_CURIOSITY_SHOP_MAN_AS_DEKU)) {
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)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_CURIOSITY_SHOP_MAN_AS_ZORA)) {
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)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_CURIOSITY_SHOP_MAN_AS_GORON)) {
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) {
Player* player = GET_PLAYER(play);
- u16 textId = Text_GetFaceReaction(play, 0x36);
+ u16 textId = Text_GetFaceReaction(play, FACE_REACTION_SET_PART_TIMER);
if (textId != 0) {
this->flags |= END_INTERACTION;
return textId;
}
+
switch (player->transformation) {
case PLAYER_FORM_DEKU:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_10)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_PART_TIMER_AS_DEKU)) {
return sWelcomeDekuTextIds[ENOSSAN_PART_TIME_WORKER];
}
return sWelcomeDekuFirstTimeTextIds[ENOSSAN_PART_TIME_WORKER];
+
case PLAYER_FORM_ZORA:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_08)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_PART_TIMER_AS_ZORA)) {
return sWelcomeZoraTextIds[ENOSSAN_PART_TIME_WORKER];
}
return sWelcomeZoraFirstTimeTextIds[ENOSSAN_PART_TIME_WORKER];
+
case PLAYER_FORM_GORON:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_04)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_PART_TIMER_AS_GORON)) {
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) {
+void EnOssan_SetTalked(EnOssan* this) {
switch (this->textId) {
case 0x06A9:
- SET_WEEKEVENTREG(WEEKEVENTREG_18_10);
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_CURIOSITY_SHOP_MAN_AS_DEKU);
break;
+
case 0x06C6:
- SET_WEEKEVENTREG(WEEKEVENTREG_55_10);
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_PART_TIMER_AS_DEKU);
break;
+
case 0x06A7:
- SET_WEEKEVENTREG(WEEKEVENTREG_18_08);
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_CURIOSITY_SHOP_MAN_AS_ZORA);
break;
+
case 0x06C4:
- SET_WEEKEVENTREG(WEEKEVENTREG_55_08);
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_PART_TIMER_AS_ZORA);
break;
+
case 0x06A5:
- SET_WEEKEVENTREG(WEEKEVENTREG_18_04);
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_CURIOSITY_SHOP_MAN_AS_GORON);
break;
+
case 0x06C2:
- SET_WEEKEVENTREG(WEEKEVENTREG_55_04);
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_PART_TIMER_AS_GORON);
+ 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;
@@ -1532,16 +1576,16 @@ void EnOssan_InitShop(EnOssan* this, PlayState* play) {
this->blinkTimer = 20;
this->eyeTexIndex = 0;
this->blinkFunc = EnOssan_WaitForBlink;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
EnOssan_SetupAction(this, EnOssan_Idle);
}
}
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,9 +1742,10 @@ 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) {
- rot->y += (s16)Math_SinS(this->limbRotTableY[limbIndex]) * 200;
- rot->z += (s16)Math_CosS(this->limbRotTableZ[limbIndex]) * 200;
+ if ((limbIndex == FSN_LIMB_PELVIS) || (limbIndex == FSN_LIMB_LEFT_UPPER_ARM) ||
+ (limbIndex == FSN_LIMB_RIGHT_UPPER_ARM)) {
+ rot->y += (s16)Math_SinS(this->fidgetTableY[limbIndex]) * 200;
+ rot->z += (s16)Math_CosS(this->fidgetTableZ[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..da256322a 100644
--- a/src/overlays/actors/ovl_En_Ossan/z_en_ossan.h
+++ b/src/overlays/actors/ovl_En_Ossan/z_en_ossan.h
@@ -6,7 +6,7 @@
#include "objects/object_ani/object_ani.h"
#include "objects/object_fsn/object_fsn.h"
-// Note: adding 1 to FSN_LIMB_MAX due to bug in object_fsn, see bug in object_fsn.xml
+// Note: adding 1 to FSN_LIMB_MAX due to bug in the skeleton, see bug in object_fsn.xml
#define ENOSSAN_LIMB_MAX MAX((s32)FSN_LIMB_MAX + 1, (s32)ANI_LIMB_MAX)
struct EnOssan;
@@ -43,17 +43,17 @@ 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;
/* 0x2CC */ Vec3s unk2CC; // Set but never used
- /* 0x2D2 */ s16 limbRotTableY[19];
- /* 0x2F8 */ s16 limbRotTableZ[19];
+ /* 0x2D2 */ s16 fidgetTableY[ENOSSAN_LIMB_MAX];
+ /* 0x2F8 */ s16 fidgetTableZ[ENOSSAN_LIMB_MAX];
/* 0x31E */ Vec3s jointTable[ENOSSAN_LIMB_MAX];
/* 0x390 */ Vec3s morphTable[ENOSSAN_LIMB_MAX];
/* 0x402 */ s16 animIndex;
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 5fa27e026..fa7e72acc 100644
--- a/src/overlays/actors/ovl_En_Ot/z_en_ot.c
+++ b/src/overlays/actors/ovl_En_Ot/z_en_ot.c
@@ -4,12 +4,12 @@
* Description: Seahorse
*/
-#include "z_en_ot.h"
#include "prevent_bss_reordering.h"
+#include "z_en_ot.h"
#include "objects/object_ot/object_ot.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnOt*)thisx)
@@ -107,9 +107,9 @@ static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneForward, 4000, ICHAIN_STOP),
};
-void func_80B5B2E0(PlayState* play, Vec3f* pos, s16 params, Vec3f* vec, s32* index) {
+void func_80B5B2E0(PlayState* play, Vec3f* pos, s16 pathIndex, Vec3f* vec, s32* index) {
s32 i;
- Path* path = &play->setupPathList[params];
+ Path* path = &play->setupPathList[pathIndex];
f32 dist;
Vec3f sp58;
Vec3f sp4C;
@@ -118,7 +118,7 @@ void func_80B5B2E0(PlayState* play, Vec3f* pos, s16 params, Vec3f* vec, s32* ind
for (i = 0; i < path->count; i++) {
Math_Vec3s_ToVec3f(&sp58, &((Vec3s*)Lib_SegmentedToVirtual(path->points))[i]);
dist = Math_Vec3f_DistXYZ(pos, &sp58);
- if (dist < minDist) {
+ if (minDist > dist) {
minDist = dist;
Math_Vec3f_Copy(&sp4C, &sp58);
*index = i;
@@ -138,11 +138,11 @@ void EnOt_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->actor, sInitChain);
this->unk_388 = 0;
- this->unk_33C = ENOT_GET_C000(&this->actor);
- if (this->unk_33C == 0) {
+ this->type = SEAHORSE_GET_TYPE(&this->actor);
+ if (this->type == SEAHORSE_TYPE_0) {
D_80B5E880 = this;
- this->actor.flags |= ACTOR_FLAG_8000000;
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
this->actor.update = func_80B5DB6C;
this->actor.draw = NULL;
return;
@@ -156,13 +156,13 @@ void EnOt_Init(Actor* thisx, PlayState* play) {
Animation_GetLastFrame(&sAnimations[0].animation->common) * Rand_ZeroOne(),
Animation_GetLastFrame(&sAnimations[0].animation->common), sAnimations[0].mode,
sAnimations[0].morphFrames);
- this->unk_346 = ENOT_GET_7F(&this->actor);
+ this->pathIndex = SEAHORSE_GET_PATH_INDEX(&this->actor);
this->unk_344 = this->actor.world.rot.z;
this->actor.world.rot.z = 0;
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);
@@ -170,10 +170,10 @@ void EnOt_Init(Actor* thisx, PlayState* play) {
this->unk_744.g = 200;
this->unk_744.b = 80;
- switch (ENOT_GET_C000(&this->actor)) {
- case 1:
+ switch (SEAHORSE_GET_TYPE(&this->actor)) {
+ case SEAHORSE_TYPE_1:
D_80B5E884 = this;
- Actor_SetScale(&this->actor, 0.012999999f);
+ Actor_SetScale(&this->actor, 1.3f * 0.01f);
switch (this->unk_344) {
case 0:
@@ -186,7 +186,7 @@ void EnOt_Init(Actor* thisx, PlayState* play) {
Math_Vec3f_Sum(&this->actor.world.pos, &sp64, &sp64);
this->unk_360 = (EnOt*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_OT, sp64.x, sp64.y, sp64.z,
0, BINANG_ROT180(this->actor.shape.rot.y), 1,
- ENOT_GET_3FFF(&this->actor) | 0x8000);
+ SEAHORSE_PARAMS_PARTNER(&this->actor, SEAHORSE_TYPE_2));
if (this->unk_360 != NULL) {
this->unk_360->unk_360 = this;
this->unk_3A0 = 0;
@@ -224,7 +224,7 @@ void EnOt_Init(Actor* thisx, PlayState* play) {
}
break;
- case 2:
+ case SEAHORSE_TYPE_2:
D_80B5E888 = this;
switch (this->unk_344) {
@@ -249,7 +249,7 @@ void EnOt_Init(Actor* thisx, PlayState* play) {
break;
case 1:
- Actor_SetScale(&this->actor, 0.012999999f);
+ Actor_SetScale(&this->actor, 1.3f * 0.01f);
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_84_10)) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_32_01)) {
func_80B5C244(this, play);
@@ -263,10 +263,10 @@ void EnOt_Init(Actor* thisx, PlayState* play) {
}
break;
- case 3:
+ case SEAHORSE_TYPE_3:
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_26_08)) {
- this->actor.flags |= ACTOR_FLAG_8000000;
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
Actor_SetScale(&this->actor, 0.0064999997f);
this->collider.dim.radius *= 0.5f;
this->collider.dim.height *= 0.5f;
@@ -277,6 +277,9 @@ void EnOt_Init(Actor* thisx, PlayState* play) {
Actor_Kill(&this->actor);
}
break;
+
+ default:
+ break;
}
}
@@ -301,20 +304,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;
@@ -327,10 +330,10 @@ void func_80B5BE88(EnOt* this, PlayState* play) {
}
void func_80B5BED4(EnOt* this, PlayState* play) {
- func_800BE33C(&this->actor.world.pos, &this->unk_360->actor.world.pos, &this->actor.world.rot, 0);
- Math_SmoothStepToS(&this->actor.shape.rot.y, Actor_YawBetweenActors(&this->actor, &this->unk_360->actor), 3, 0xE38,
- 0x38E);
- this->actor.speedXZ = 3.5f;
+ func_800BE33C(&this->actor.world.pos, &this->unk_360->actor.world.pos, &this->actor.world.rot, false);
+ Math_SmoothStepToS(&this->actor.shape.rot.y, Actor_WorldYawTowardActor(&this->actor, &this->unk_360->actor), 3,
+ 0xE38, 0x38E);
+ this->actor.speed = 3.5f;
this->actor.world.pos.y = this->unk_360->actor.world.pos.y;
Actor_MoveWithoutGravityReverse(&this->actor);
}
@@ -349,10 +352,10 @@ void func_80B5BFB8(EnOt* this, PlayState* play) {
Math_StepToF(&this->actor.world.pos.y, temp_f0, 2.0f);
}
- Math_SmoothStepToS(&this->actor.shape.rot.y, Actor_YawBetweenActors(&this->actor, &this->unk_360->actor), 3, 0xE38,
- 0x38E);
+ Math_SmoothStepToS(&this->actor.shape.rot.y, Actor_WorldYawTowardActor(&this->actor, &this->unk_360->actor), 3,
+ 0xE38, 0x38E);
- if (Actor_DistanceBetweenActors(&this->actor, &this->unk_360->actor) <= 52.519997f) {
+ if (Actor_WorldDistXYZToActor(&this->actor, &this->unk_360->actor) <= 52.519997f) {
this->unk_73C = 50;
Matrix_RotateYS(this->actor.world.rot.y, MTXMODE_NEW);
Matrix_MultVecZ(52.519997f, &sp34);
@@ -382,7 +385,7 @@ void func_80B5C154(EnOt* this, PlayState* play) {
this->getItemId = GI_HEART_PIECE;
SET_WEEKEVENTREG(WEEKEVENTREG_32_01);
}
- Actor_PickUp(&this->actor, play, this->getItemId, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
+ Actor_OfferGetItem(&this->actor, play, this->getItemId, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
this->actionFunc = func_80B5C1CC;
}
@@ -392,7 +395,8 @@ void func_80B5C1CC(EnOt* this, PlayState* play) {
func_80B5C244(this, play);
func_80B5C244(this->unk_360, play);
} else {
- Actor_PickUp(&this->actor, play, this->getItemId, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
+ Actor_OfferGetItem(&this->actor, play, this->getItemId, this->actor.xzDistToPlayer,
+ this->actor.playerHeightRel);
}
}
@@ -401,21 +405,21 @@ void func_80B5C244(EnOt* this, PlayState* play) {
}
void func_80B5C25C(EnOt* this, PlayState* play) {
- this->unk_390 = Actor_YawBetweenActors(&this->actor, &this->unk_360->actor);
+ this->unk_390 = Actor_WorldYawTowardActor(&this->actor, &this->unk_360->actor);
Math_SmoothStepToS(&this->actor.shape.rot.y, this->unk_390, 3, 0xE38, 0x38E);
if (BINANG_SUB(BINANG_ROT180(this->unk_360->actor.shape.rot.y), this->actor.shape.rot.y) < 0x38E) {
this->unk_32C |= 0x80;
}
- if ((this->unk_33C == 2) && (this->unk_32C & 0x80) && (this->unk_360->unk_32C & 0x80)) {
+ if ((this->type == SEAHORSE_TYPE_2) && (this->unk_32C & 0x80) && (this->unk_360->unk_32C & 0x80)) {
this->unk_32C |= 0x100;
this->unk_360->unk_32C |= 0x100;
SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, 2, &this->animIndex);
SubS_ChangeAnimationBySpeedInfo(&this->unk_360->skelAnime, sAnimations, 2, &this->unk_360->animIndex);
- this->actor.flags |= ACTOR_FLAG_8000000;
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
- this->unk_360->actor.flags |= ACTOR_FLAG_8000000;
- this->unk_360->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
+ this->unk_360->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ this->unk_360->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
func_80B5C9A8(this->unk_360, play);
func_80B5C3B8(this, play);
}
@@ -450,13 +454,13 @@ void func_80B5C3D8(EnOt* this, PlayState* play) {
Math_Vec3f_Copy(&this->actor.world.pos, &this->unk_348);
Math_Vec3f_Copy(&this->unk_360->actor.world.pos, &this->unk_360->unk_348);
- temp = Actor_YawBetweenActors(&this->actor, &this->unk_360->actor);
+ temp = Actor_WorldYawTowardActor(&this->actor, &this->unk_360->actor);
this->actor.shape.rot.y = temp;
this->unk_360->actor.shape.rot.y = BINANG_ROT180(temp);
if (this->unk_740 < 1.0f) {
- Lib_LerpRGB(&D_80B5E408, &D_80B5E40C, this->unk_740, &this->unk_744);
- Lib_LerpRGB(&D_80B5E408, &D_80B5E40C, this->unk_740, &this->unk_360->unk_744);
+ Color_RGB8_Lerp(&D_80B5E408, &D_80B5E40C, this->unk_740, &this->unk_744);
+ Color_RGB8_Lerp(&D_80B5E408, &D_80B5E40C, this->unk_740, &this->unk_360->unk_744);
Math_StepToF(&this->unk_740, 1.0f, 0.05f);
}
@@ -488,7 +492,7 @@ void func_80B5C64C(EnOt* this, PlayState* play) {
}
void func_80B5C684(EnOt* this, PlayState* play) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, 0, &this->animIndex);
this->actionFunc = func_80B5C6DC;
}
@@ -499,20 +503,20 @@ void func_80B5C6DC(EnOt* this, PlayState* play) {
s16 sp3E;
Vec3f sp30;
- sp3E = Actor_YawToPoint(&player->actor, &this->unk_394);
+ sp3E = Actor_WorldYawTowardPoint(&player->actor, &this->unk_394);
Matrix_RotateYS(BINANG_ADD(sp3E, 0x4000), MTXMODE_NEW);
- if (this->unk_33C == 2) {
+ if (this->type == SEAHORSE_TYPE_2) {
Matrix_MultVecZ(26.259998f, &sp30);
} else {
if (this->unk_73C == 0) {
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;
@@ -527,7 +531,7 @@ void func_80B5C6DC(EnOt* this, PlayState* play) {
Math_SmoothStepToF(&this->actor.world.pos.x, this->unk_348.x, 1.0f, 2.0f, 0.01f);
Math_SmoothStepToF(&this->actor.world.pos.z, this->unk_348.z, 1.0f, 2.0f, 0.01f);
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 3, 0xE38, 0x38E);
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_84_10) && (this->unk_33C == 1)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_84_10) && (this->type == SEAHORSE_TYPE_1)) {
this->actor.textId = 0;
this->unk_384 = 1;
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
@@ -535,9 +539,9 @@ void func_80B5C6DC(EnOt* this, PlayState* play) {
this->unk_360->unk_3A0 = this->unk_3A0;
func_80B5C9A8(this, play);
func_80B5D114(this, play);
- } else if ((player->actor.bgCheckFlags & 1) && !func_801242B4(player) &&
+ } else if ((player->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && !func_801242B4(player) &&
(this->actor.xzDistToPlayer < 130.0f)) {
- func_800B8614(&this->actor, play, 130.0f);
+ Actor_OfferTalk(&this->actor, play, 130.0f);
}
}
}
@@ -555,7 +559,7 @@ void func_80B5C910(EnOt* this, PlayState* play) {
void func_80B5C950(EnOt* this, PlayState* play) {
if (this->unk_32C & 8) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_SEAHORSE_OUT_BOTTLE);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_SEAHORSE_OUT_BOTTLE);
SET_WEEKEVENTREG(WEEKEVENTREG_25_04);
func_80B5CAD0(this, play);
}
@@ -576,14 +580,14 @@ void func_80B5C9D0(EnOt* this, PlayState* play) {
this->actor.world.rot.x = this->actor.world.rot.x;
this->actor.world.rot.y = this->actor.world.rot.y;
this->actor.world.rot.z = this->actor.world.rot.z;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_SEAHORSE_OUT_BOTTLE);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_SEAHORSE_OUT_BOTTLE);
this->actionFunc = func_80B5CA30;
}
void func_80B5CA30(EnOt* this, PlayState* play) {
- Math_SmoothStepToF(&this->actor.scale.x, 0.012999999f, 0.7f, 0.0001f, 0.01f);
+ Math_SmoothStepToF(&this->actor.scale.x, 1.3f * 0.01f, 0.7f, 0.0001f, 0.01f);
Actor_SetScale(&this->actor, this->actor.scale.x);
- if (this->actor.scale.x == 0.012999999f) {
+ if (this->actor.scale.x == 1.3f * 0.01f) {
this->unk_360->unk_32C |= 0x1000;
this->unk_360->unk_360 = this;
func_80B5C9A8(this, play);
@@ -591,14 +595,14 @@ 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;
}
void func_80B5CB0C(EnOt* this, PlayState* play) {
- Math_SmoothStepToF(&this->actor.scale.x, 0.012999999f, 0.7f, 0.0001f, 0.01f);
+ Math_SmoothStepToF(&this->actor.scale.x, 1.3f * 0.01f, 0.7f, 0.0001f, 0.01f);
Actor_SetScale(&this->actor, this->actor.scale.x);
- if (this->actor.scale.x == 0.012999999f) {
+ if (this->actor.scale.x == 1.3f * 0.01f) {
this->unk_32C |= 0x800;
func_80B5CE6C(this, play);
}
@@ -606,7 +610,8 @@ void func_80B5CB0C(EnOt* this, PlayState* play) {
void func_80B5CBA0(EnOt* this, PlayState* play) {
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel, PLAYER_IA_NONE);
+ Actor_OfferTalkExchange(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel,
+ PLAYER_IA_NONE);
this->actionFunc = func_80B5CBEC;
}
@@ -617,7 +622,8 @@ void func_80B5CBEC(EnOt* this, PlayState* play) {
} else {
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 3, 0xE38, 0x38E);
this->actor.world.rot.y = this->actor.shape.rot.y;
- func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel, PLAYER_IA_NONE);
+ Actor_OfferTalkExchange(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel,
+ PLAYER_IA_NONE);
}
}
@@ -626,7 +632,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 +671,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;
}
}
@@ -693,15 +702,17 @@ void func_80B5CEC8(EnOt* this, PlayState* play) {
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 3, 0xE38, 0x38E);
if (this->unk_32C & 0x800) {
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel, PLAYER_IA_NONE);
+ Actor_OfferTalkExchange(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel,
+ PLAYER_IA_NONE);
} else {
this->actor.flags &= ~ACTOR_FLAG_10000;
- if ((player->actor.bgCheckFlags & 1) && !func_801242B4(player) && (this->actor.xzDistToPlayer < 130.0f)) {
- func_800B8614(&this->actor, play, 130.0f);
+ if ((player->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && !func_801242B4(player) &&
+ (this->actor.xzDistToPlayer < 130.0f)) {
+ Actor_OfferTalk(&this->actor, play, 130.0f);
}
}
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_84_10) && (ENOT_GET_C000(&this->actor) == 1)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_84_10) && (SEAHORSE_GET_TYPE(&this->actor) == 1)) {
if ((fabsf(this->actor.xzDistToPlayer) <= 130.0f) && (fabsf(this->actor.playerHeightRel) <= 130.0f)) {
player->unk_B2B = 29;
}
@@ -746,14 +757,14 @@ void func_80B5D160(EnOt* this, PlayState* play) {
if (temp == 0) {
switch (this->unk_384) {
case 0:
- if ((this->unk_33C != 1) && (this->unk_33C == 2)) {
+ if ((this->type != SEAHORSE_TYPE_1) && (this->type == SEAHORSE_TYPE_2)) {
if (this->unk_32C & 1) {
if (this->unk_32C & 4) {
phi_a1 = 0x106A;
} else {
phi_a1 = 0x1069;
}
- } else if (Flags_GetSwitch(play, ENOT_GET_3F80(&this->actor))) {
+ } else if (Flags_GetSwitch(play, SEAHORSE_GET_SWITCH_FLAG(&this->actor))) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_23_10)) {
phi_a1 = 0x106C;
} else {
@@ -803,12 +814,12 @@ void func_80B5D160(EnOt* this, PlayState* play) {
break;
case 0x10A5:
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_80B5CE6C(this, play);
break;
case 0x106D:
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_80B5C154(this, play);
break;
}
@@ -820,11 +831,11 @@ void func_80B5D160(EnOt* this, PlayState* play) {
s32 EnOt_ActorPathing_Move(PlayState* play, ActorPathing* actorPath) {
Actor* thisx = actorPath->actor;
EnOt* this = (EnOt*)thisx;
- f32 sp24 = Math_CosS(-thisx->world.rot.x) * thisx->speedXZ;
+ f32 sp24 = Math_CosS(-thisx->world.rot.x) * thisx->speed;
f32 sp20 = gFramerateDivisorHalf;
thisx->velocity.x = Math_SinS(thisx->world.rot.y) * sp24;
- thisx->velocity.y = Math_SinS(-thisx->world.rot.x) * thisx->speedXZ;
+ thisx->velocity.y = Math_SinS(-thisx->world.rot.x) * thisx->speed;
thisx->velocity.z = Math_CosS(thisx->world.rot.y) * sp24;
this->unk_330.x += (thisx->velocity.x * sp20) + thisx->colChkInfo.displacement.x;
@@ -846,7 +857,7 @@ s32 EnOt_ActorPathing_UpdateActorInfo(PlayState* play, ActorPathing* actorPath)
s32 sp34;
thisx->gravity = 0.0f;
- Math_SmoothStepToF(&thisx->speedXZ, 10.0f, 0.8f, 2.0f, 0.0f);
+ Math_SmoothStepToF(&thisx->speed, 10.0f, 0.8f, 2.0f, 0.0f);
sp50.x = actorPath->curPoint.x - thisx->world.pos.x;
sp50.y = actorPath->curPoint.y - thisx->world.pos.y;
@@ -857,10 +868,10 @@ s32 EnOt_ActorPathing_UpdateActorInfo(PlayState* play, ActorPathing* actorPath)
sp44.z = actorPath->curPoint.z - actorPath->prevPoint.z;
temp = Math3D_Parallel(&sp50, &sp44);
- if ((actorPath->distSqToCurPointXZ < SQ(thisx->speedXZ)) || (temp <= 0.0f)) {
+ if ((actorPath->distSqToCurPointXZ < SQ(thisx->speed)) || (temp <= 0.0f)) {
ret = true;
} else {
- temp = SQ(thisx->speedXZ) / actorPath->distSqToCurPoint;
+ temp = SQ(thisx->speed) / actorPath->distSqToCurPoint;
sp34 = ABS(actorPath->rotToCurPoint.x - thisx->world.rot.x);
sp2C = (s32)(sp34 * temp) + 0xAAA;
@@ -876,20 +887,20 @@ s32 EnOt_ActorPathing_UpdateActorInfo(PlayState* play, ActorPathing* actorPath)
}
void func_80B5D648(EnOt* this, PlayState* play) {
- func_80B5B2E0(play, &this->actor.world.pos, this->unk_346, &this->unk_348, &this->unk_340);
+ func_80B5B2E0(play, &this->actor.world.pos, this->pathIndex, &this->unk_348, &this->unk_340);
Math_Vec3f_Copy(&this->unk_330, &this->actor.world.pos);
- SubS_ActorPathing_Init(play, &this->unk_330, &this->actor, &this->actorPath, play->setupPathList, this->unk_346, 0,
- 0, this->unk_340, 0);
+ SubS_ActorPathing_Init(play, &this->unk_330, &this->actor, &this->actorPath, play->setupPathList, this->pathIndex,
+ 0, 0, this->unk_340, 0);
this->unk_32C = 0;
this->actorPath.pointOffset.x = 0.0f;
this->actorPath.pointOffset.y = 0.0f;
this->actorPath.pointOffset.z = 0.0f;
this->actor.gravity = 0.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, 1, &this->animIndex);
- this->actor.flags |= ACTOR_FLAG_8000000;
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
- Flags_SetSwitch(play, ENOT_GET_3F80(&this->actor));
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
+ Flags_SetSwitch(play, SEAHORSE_GET_SWITCH_FLAG(&this->actor));
this->actionFunc = func_80B5D750;
}
@@ -915,8 +926,8 @@ void func_80B5D750(EnOt* this, PlayState* play) {
}
if ((this->unk_32C & 1) && (this->actor.xzDistToPlayer <= 180.0f)) {
- this->actor.flags &= ~ACTOR_FLAG_8000000;
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.flags &= ~ACTOR_FLAG_CANT_LOCK_ON;
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
if (D_80B5E884 != 0) {
func_80B5C9A8(this, play);
} else {
@@ -930,11 +941,11 @@ void EnOt_Update(Actor* thisx, PlayState* play) {
EnOt* this = THIS;
if ((this->animIndex == 1) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_SEAHORSE_SWIM);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_SEAHORSE_SWIM);
}
this->actionFunc(this, play);
- if (this->actor.bgCheckFlags & 0x20) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER) {
if (DECR(this->unk_354) == 0) {
if (this->actor.flags & ACTOR_FLAG_40) {
s32 i;
@@ -947,7 +958,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;
@@ -989,10 +1000,11 @@ void func_80B5DB6C(Actor* thisx, PlayState* play) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_25_04)) {
Vec3f sp50;
- func_80B5B2E0(play, &this->actor.world.pos, ENOT_GET_7F(&this->actor), &sp50, &this->unk_340);
+ func_80B5B2E0(play, &this->actor.world.pos, SEAHORSE_GET_PATH_INDEX(&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.unk20, NULL) != NULL) {
+ this->actor.shape.rot.y, 1,
+ SEAHORSE_PARAMS_PARTNER(&this->actor, SEAHORSE_TYPE_2), this->actor.csId,
+ this->actor.halfDaysBits, NULL) != NULL) {
this->unk_32C |= 8;
}
} else if (D_80B5E888 != NULL) {
@@ -1008,9 +1020,9 @@ void func_80B5DB6C(Actor* thisx, PlayState* play) {
EnOt* temp = D_80B5E888;
temp->unk_32C |= 8;
- temp->unk_346 = ENOT_GET_7F(&this->actor);
+ temp->pathIndex = SEAHORSE_GET_PATH_INDEX(&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)) {
@@ -1030,8 +1042,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);
@@ -1043,7 +1055,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,
@@ -1138,24 +1150,25 @@ 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) {
- if (!flag) {
- gSPDisplayList(POLY_OPA_DISP++, object_ot_DL_000040);
- flag = true;
- if (play) {}
- }
-
- Matrix_Translate(arg1->unk_0C.x, arg1->unk_0C.y, arg1->unk_0C.z, MTXMODE_NEW);
- Matrix_RotateYS(BINANG_ROT180(Camera_GetCamDirYaw(GET_ACTIVE_CAM(play))), MTXMODE_APPLY);
- Matrix_Scale(arg1->unk_04, arg1->unk_04, arg1->unk_04, MTXMODE_APPLY);
-
- 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++, object_ot_DL_000078);
+ if (arg1->unk_00 == 0) {
+ continue;
}
+
+ if (!flag) {
+ gSPDisplayList(POLY_OPA_DISP++, object_ot_DL_000040);
+ flag = true;
+ }
+
+ Matrix_Translate(arg1->unk_0C.x, arg1->unk_0C.y, arg1->unk_0C.z, MTXMODE_NEW);
+ Matrix_RotateYS(BINANG_ROT180(Camera_GetCamDirYaw(GET_ACTIVE_CAM(play))), MTXMODE_APPLY);
+ Matrix_Scale(arg1->unk_04, arg1->unk_04, arg1->unk_04, MTXMODE_APPLY);
+
+ 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++, object_ot_DL_000078);
}
CLOSE_DISPS(play->state.gfxCtx);
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..aa90ffa0b 100644
--- a/src/overlays/actors/ovl_En_Ot/z_en_ot.h
+++ b/src/overlays/actors/ovl_En_Ot/z_en_ot.h
@@ -7,10 +7,19 @@ struct EnOt;
typedef void (*EnOtActionFunc)(struct EnOt*, PlayState*);
-#define ENOT_GET_7F(thisx) ((thisx)->params & 0x7F)
-#define ENOT_GET_3F80(thisx) (((thisx)->params >> 7) & 0x7F)
-#define ENOT_GET_3FFF(thisx) ((thisx)->params & 0x3FFF)
-#define ENOT_GET_C000(thisx) (((thisx)->params >> 0xE) & 3)
+#define SEAHORSE_GET_PATH_INDEX(thisx) ((thisx)->params & 0x7F)
+#define SEAHORSE_GET_SWITCH_FLAG(thisx) (((thisx)->params >> 7) & 0x7F)
+#define SEAHORSE_GET_TYPE(thisx) (((thisx)->params >> 0xE) & 3)
+
+#define SEAHORSE_PARAMS(type, pathIndex, switchFlag) (((pathIndex) & 0x7F) | (((switchFlag) & 0x7F) << 7) | (((type) & 3) << 0xE))
+#define SEAHORSE_PARAMS_PARTNER(thisx, type) (((thisx)->params & 0x3FFF) | (((type) & 3) << 0xE))
+
+typedef enum SeahorseType {
+ /* 0 */ SEAHORSE_TYPE_0,
+ /* 1 */ SEAHORSE_TYPE_1,
+ /* 2 */ SEAHORSE_TYPE_2,
+ /* 3 */ SEAHORSE_TYPE_3
+} SeahorseType;
typedef struct {
/* 0x00 */ u8 unk_00;
@@ -39,13 +48,13 @@ typedef struct EnOt {
/* 0x2C0 */ ActorPathing actorPath;
/* 0x32C */ u16 unk_32C;
/* 0x330 */ Vec3f unk_330;
- /* 0x33C */ s32 unk_33C;
+ /* 0x33C */ s32 type;
/* 0x340 */ s32 unk_340;
/* 0x344 */ s16 unk_344;
- /* 0x346 */ s16 unk_346;
+ /* 0x346 */ s16 pathIndex;
/* 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 8d7b92b69..db4d9386b 100644
--- a/src/overlays/actors/ovl_En_Owl/z_en_owl.c
+++ b/src/overlays/actors/ovl_En_Owl/z_en_owl.c
@@ -7,7 +7,7 @@
#include "z_en_owl.h"
#include "objects/object_owl/object_owl.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnOwl*)thisx)
@@ -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,25 +102,25 @@ 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);
this->actor.update = func_8095CCF4;
this->actor.draw = func_8095D074;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->unk_3D8 = 0;
this->unk_3DA = 0x320;
this->unk_3DC = 0x12C;
@@ -144,9 +144,9 @@ 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);
+ switchFlag = ENOWL_GET_SWITCH_FLAG(&this->actor);
switch (owlType) {
case ENOWL_GET_TYPE_1:
@@ -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_OF_TRUTH] == ITEM_LENS_OF_TRUTH) {
Actor_Kill(&this->actor);
return;
}
@@ -169,6 +169,9 @@ void EnOwl_Init(Actor* thisx, PlayState* play) {
return;
}
break;
+
+ default:
+ break;
}
this->unk_3DA = 0;
@@ -229,7 +232,7 @@ s32 func_8095A978(EnOwl* this, PlayState* play, u16 textId, f32 targetDist, f32
this->actor.textId = textId;
if (this->actor.xzDistToPlayer < targetDist) {
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, targetDist, arg4, PLAYER_IA_NONE);
+ Actor_OfferTalkExchange(&this->actor, play, targetDist, arg4, PLAYER_IA_NONE);
}
return false;
@@ -242,7 +245,7 @@ s32 func_8095A9FC(EnOwl* this, PlayState* play, u16 textId) {
this->actor.textId = textId;
if (this->actor.xzDistToPlayer < 120.0f) {
- func_800B8500(&this->actor, play, 350.0f, 1000.0f, PLAYER_IA_NONE);
+ Actor_OfferTalkExchange(&this->actor, play, 350.0f, 1000.0f, PLAYER_IA_NONE);
}
return false;
@@ -255,7 +258,7 @@ void func_8095AA70(EnOwl* this) {
}
void func_8095AAD0(EnOwl* this, PlayState* play) {
- s32 switchFlag = ENOWL_GET_SWITCHFLAG(&this->actor);
+ s32 switchFlag = ENOWL_GET_SWITCH_FLAG(&this->actor);
if (switchFlag < 0x7F) {
Flags_SetSwitch(play, switchFlag);
@@ -271,7 +274,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;
@@ -292,7 +295,7 @@ void func_8095ABA8(EnOwl* this) {
void func_8095ABF0(EnOwl* this, PlayState* play) {
if (Actor_TextboxIsClosing(&this->actor, play)) {
- Audio_QueueSeqCmd(0x110000FF);
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 0);
func_8095AAD0(this, play);
this->actor.flags &= ~ACTOR_FLAG_10000;
}
@@ -301,7 +304,7 @@ void func_8095ABF0(EnOwl* this, PlayState* play) {
// Unused?
void func_8095AC50(EnOwl* this, PlayState* play) {
if (Actor_TextboxIsClosing(&this->actor, play)) {
- Audio_QueueSeqCmd(0x110000FF);
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 0);
if ((this->unk_3DA % 64) == 0) {
func_8095AAD0(this, play);
} else {
@@ -315,11 +318,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;
}
}
@@ -327,28 +330,31 @@ void func_8095AD54(EnOwl* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE) && Message_ShouldAdvance(play)) {
switch (play->msgCtx.choiceIndex) {
case OWL_REPEAT:
- func_80151938(play, 0x7D1);
+ Message_ContinueTextbox(play, 0x7D1);
this->actionFunc = func_8095AE00;
break;
case OWL_OK:
- func_80151938(play, 0x7D3);
+ Message_ContinueTextbox(play, 0x7D3);
this->actionFunc = func_8095ABF0;
break;
+
+ default:
+ break;
}
}
}
void func_8095AE00(EnOwl* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_80151938(play, 0x7D2);
+ Message_ContinueTextbox(play, 0x7D2);
this->actionFunc = func_8095AD54;
}
}
void func_8095AE60(EnOwl* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_80151938(play, 0x7D1);
+ Message_ContinueTextbox(play, 0x7D1);
this->actionFunc = func_8095AE00;
}
}
@@ -367,10 +373,10 @@ void func_8095AF2C(EnOwl* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
if (play->msgCtx.currentTextId == 0xBFE) {
func_8095ACEC(this);
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_8095ABF0;
} else {
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
}
}
break;
@@ -379,6 +385,9 @@ void func_8095AF2C(EnOwl* this, PlayState* play) {
func_8095ACEC(this);
this->actionFunc = func_8095ABF0;
break;
+
+ default:
+ break;
}
}
@@ -387,7 +396,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;
}
}
@@ -419,13 +428,13 @@ void func_8095B158(EnOwl* this) {
if (Animation_OnFrame(&this->skelAnime1, 2.0f) || Animation_OnFrame(&this->skelAnime1, 9.0f) ||
Animation_OnFrame(&this->skelAnime1, 23.0f) || Animation_OnFrame(&this->skelAnime1, 40.0f) ||
Animation_OnFrame(&this->skelAnime1, 58.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_OWL_FLUTTER);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_OWL_FLUTTER);
}
}
void func_8095B1E4(EnOwl* this, PlayState* play) {
- if (this->actor.speedXZ < 6.0f) {
- this->actor.speedXZ += 1.0f;
+ if (this->actor.speed < 6.0f) {
+ this->actor.speed += 1.0f;
}
if (this->actor.xzDistToPlayer > 6000.0f) {
@@ -434,8 +443,8 @@ void func_8095B1E4(EnOwl* this, PlayState* play) {
}
void func_8095B254(EnOwl* this, PlayState* play) {
- if (this->actor.speedXZ < 6.0f) {
- this->actor.speedXZ += 1.0f;
+ if (this->actor.speed < 6.0f) {
+ this->actor.speed += 1.0f;
}
if (this->actionFlags & 1) {
@@ -491,7 +500,7 @@ void func_8095B480(EnOwl* this, PlayState* play) {
this->unk_3EC = this->actor.home.rot.y;
this->actor.world.pos = this->actor.home.pos;
func_8095A510(this, play);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = func_8095BE0C;
}
}
@@ -502,10 +511,10 @@ 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);
+ Actor_OfferTalkExchange(&this->actor, play, 200.0f, 400.0f, PLAYER_IA_NONE);
} else {
this->actor.flags &= ~ACTOR_FLAG_10000;
}
@@ -540,8 +549,8 @@ void func_8095B76C(EnOwl* this, PlayState* play) {
Math_SmoothStepToS(&this->actor.world.rot.y, sp4A, 6, 0x800, 0x200);
this->actor.shape.rot.y = this->actor.world.rot.y;
- if (sp44 < SQ(this->actor.speedXZ)) {
- this->actor.speedXZ = 0.0f;
+ if (sp44 < SQ(this->actor.speed)) {
+ this->actor.speed = 0.0f;
points = Lib_SegmentedToVirtual(this->path->points);
points += this->unk_3F8;
@@ -564,13 +573,13 @@ void func_8095B76C(EnOwl* this, PlayState* play) {
}
func_8095B0C8(this);
} else if (sp44 < SQ(21.0f)) {
- if (this->actor.speedXZ > 1.0f) {
- this->actor.speedXZ -= 1.0f;
+ if (this->actor.speed > 1.0f) {
+ this->actor.speed -= 1.0f;
} else {
- this->actor.speedXZ = 1.0f;
+ this->actor.speed = 1.0f;
}
- } else if (this->actor.speedXZ < 6.0f) {
- this->actor.speedXZ += 1.0f;
+ } else if (this->actor.speed < 6.0f) {
+ this->actor.speed += 1.0f;
}
func_8095B06C(this);
@@ -612,18 +621,21 @@ void func_8095BA84(EnOwl* this, PlayState* play) {
case 0xBEC:
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_09_40)) {
- func_80151938(play, 0xBF4);
+ Message_ContinueTextbox(play, 0xBF4);
} else {
SET_WEEKEVENTREG(WEEKEVENTREG_09_40);
- func_80151938(play, 0xBED);
+ Message_ContinueTextbox(play, 0xBED);
}
break;
case 1:
- func_8019F230();
- func_80151938(play, 0xBEF);
+ Audio_PlaySfx_MessageCancel();
+ Message_ContinueTextbox(play, 0xBEF);
+ break;
+
+ default:
break;
}
break;
@@ -631,16 +643,22 @@ void func_8095BA84(EnOwl* this, PlayState* play) {
case 0xBF2:
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
- func_80151938(play, 0xBF4);
- return;
+ Audio_PlaySfx_MessageDecide();
+ Message_ContinueTextbox(play, 0xBF4);
+ break;
case 1:
- func_8019F230();
- func_80151938(play, 0xBF3);
- return;
+ Audio_PlaySfx_MessageCancel();
+ Message_ContinueTextbox(play, 0xBF3);
+ break;
+
+ default:
+ break;
}
break;
+
+ default:
+ break;
}
}
break;
@@ -650,22 +668,22 @@ void func_8095BA84(EnOwl* this, PlayState* play) {
switch (play->msgCtx.currentTextId) {
case 0xBEA:
SET_WEEKEVENTREG(WEEKEVENTREG_09_20);
- func_80151938(play, 0xBEB);
+ Message_ContinueTextbox(play, 0xBEB);
break;
case 0xBEB:
case 0xBF0:
- func_80151938(play, 0xBEC);
+ Message_ContinueTextbox(play, 0xBEC);
break;
case 0xBED:
case 0xBF4:
- func_80151938(play, 0xBEE);
+ Message_ContinueTextbox(play, 0xBEE);
break;
case 0xBEE:
- func_801477B4(play);
- Audio_QueueSeqCmd(0x110000FF);
+ Message_CloseTextbox(play);
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 0);
EnOwl_ChangeMode(this, func_8095B9FC, func_8095C484, &this->skelAnime1, &object_owl_Anim_00CB94,
0.0f);
this->eyeTexIndex = 0;
@@ -674,14 +692,14 @@ 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;
case 0xBEF:
case 0xBF3:
- func_801477B4(play);
- Audio_QueueSeqCmd(0x110000FF);
+ Message_CloseTextbox(play);
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 0);
func_8095ACEC(this);
this->actor.flags &= ~ACTOR_FLAG_10000;
this->actor.textId = 0xBF0;
@@ -689,12 +707,12 @@ void func_8095BA84(EnOwl* this, PlayState* play) {
break;
case 0xBF1:
- func_80151938(play, 0xBF2);
+ Message_ContinueTextbox(play, 0xBF2);
break;
case 0xBF5:
- func_801477B4(play);
- Audio_QueueSeqCmd(0x110000FF);
+ Message_CloseTextbox(play);
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 0);
this->actor.flags &= ~ACTOR_FLAG_10000;
EnOwl_ChangeMode(this, func_8095B3DC, func_8095C484, &this->skelAnime1, &object_owl_Anim_00CB94,
0.0f);
@@ -703,9 +721,15 @@ void func_8095BA84(EnOwl* this, PlayState* play) {
this->actionFlags |= 8;
func_8095ACEC(this);
break;
+
+ default:
+ break;
}
}
break;
+
+ default:
+ break;
}
}
@@ -714,15 +738,15 @@ 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) {
- func_800B8500(&this->actor, play, 200.0f, 200.0f, PLAYER_IA_NONE);
+ if (this->actor.isLockedOn) {
+ Actor_OfferTalkExchange(&this->actor, play, 200.0f, 200.0f, PLAYER_IA_NONE);
}
} else if (this->actor.xzDistToPlayer < 200.0f) {
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, 200.0f, 200.0f, PLAYER_IA_NONE);
+ Actor_OfferTalkExchange(&this->actor, play, 200.0f, 200.0f, PLAYER_IA_NONE);
} else {
this->actor.flags &= ~ACTOR_FLAG_10000;
}
@@ -745,8 +769,8 @@ void func_8095BF78(EnOwl* this, PlayState* play) {
Math_SmoothStepToS(&this->actor.world.rot.y, this->unk_3EC, 2, 0x80, 0x40);
this->actor.shape.rot.y = this->actor.world.rot.y;
- if (this->actor.speedXZ < 16.0f) {
- this->actor.speedXZ += 0.5f;
+ if (this->actor.speed < 16.0f) {
+ this->actor.speed += 0.5f;
}
if ((this->unk_3E4 + 1000.0f) < this->actor.world.pos.y) {
@@ -767,11 +791,11 @@ void func_8095C09C(EnOwl* this, PlayState* play) {
if (this->skelAnime1.curFrame > 45.0f) {
this->actor.velocity.y = 2.0f;
this->actor.gravity = 0.0f;
- this->actor.speedXZ = 8.0f;
+ this->actor.speed = 8.0f;
} else if (this->skelAnime1.curFrame > 17.0f) {
this->actor.velocity.y = 6.0f;
this->actor.gravity = 0.0f;
- this->actor.speedXZ = 4.0f;
+ this->actor.speed = 4.0f;
}
if (this->actionFlags & 1) {
@@ -865,16 +889,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,171 +918,182 @@ 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) {
- if ((this->skelAnime1.animation == &object_owl_Anim_001ADC) && Animation_OnFrame(&this->skelAnime1, 4.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_OWL_FLUTTER);
+ if (this->actor.update == NULL) {
+ return;
+ }
+
+ if ((this->skelAnime1.animation == &object_owl_Anim_001ADC) && Animation_OnFrame(&this->skelAnime1, 4.0f)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_OWL_FLUTTER);
+ }
+
+ if (this->actionFlags & 2) {
+ this->eyeTexIndex = 2;
+ } else {
+ if (DECR(this->blinkTimer) == 0) {
+ this->blinkTimer = Rand_S16Offset(60, 60);
}
-
- if (this->actionFlags & 2) {
- this->eyeTexIndex = 2;
- } else {
- if (DECR(this->blinkTimer) == 0) {
- this->blinkTimer = Rand_S16Offset(60, 60);
- }
- this->eyeTexIndex = this->blinkTimer;
- if (this->eyeTexIndex >= 3) {
- this->eyeTexIndex = 0;
- }
+ this->eyeTexIndex = this->blinkTimer;
+ if (this->eyeTexIndex >= 3) {
+ this->eyeTexIndex = 0;
}
+ }
- if (!(this->actionFlags & 8)) {
- sp36 = 0;
+ if (!(this->actionFlags & 8)) {
+ sp36 = 0;
- if (this->actionFlags & 0x10) {
- switch (this->unk_408) {
- case 0:
- this->unk_408 = 1;
- this->unk_409 = 6;
- break;
+ if (this->actionFlags & 0x10) {
+ switch (this->unk_408) {
+ case 0:
+ this->unk_408 = 1;
+ this->unk_409 = 6;
+ break;
- case 1:
- this->unk_409--;
- if (this->unk_409 != 0) {
- sp36 = Math_CosS(this->unk_409 * 0x2000) * 0x1000;
+ case 1:
+ this->unk_409--;
+ if (this->unk_409 != 0) {
+ sp36 = Math_CosS(this->unk_409 * 0x2000) * 0x1000;
+ } else {
+ if (this->actionFlags & 2) {
+ this->unk_3DA = 0;
} else {
- if (this->actionFlags & 2) {
- this->unk_3DA = 0;
- } else {
- this->unk_3DA = 0x20;
- }
-
- if (this->actionFlags & 0x20) {
- this->unk_3DA -= 4;
- } else {
- this->unk_3DA += 4;
- }
- this->unk_408++;
+ this->unk_3DA = 0x20;
}
if (this->actionFlags & 0x20) {
- sp36 = -sp36;
- }
- break;
-
- case 2:
- if (func_8095C510(this)) {
- this->actionFlags &= ~0x10;
- this->unk_40A = (s32)Rand_ZeroFloat(20.0f) + 60;
- this->unk_408 = 0;
- func_8095AB4C(this);
- }
- break;
- }
- } else {
- if (this->unk_40A > 0) {
- this->unk_40A--;
- } else {
- if (this->unk_408 == 0) {
- if (Rand_ZeroOne() < 0.3f) {
- this->unk_408 = 4;
- this->unk_409 = 12;
+ this->unk_3DA -= 4;
} else {
- this->unk_408 = 1;
- this->unk_409 = 4;
+ this->unk_3DA += 4;
}
- }
- this->unk_409--;
-
- switch (this->unk_408) {
- case 1:
- sp36 = Math_SinS((-this->unk_409 * 0x1000) + 0x4000) * 5000.0f;
- if (this->unk_409 <= 0) {
- this->unk_409 = (s32)(Rand_ZeroFloat(15.0f) + 5.0f);
- this->unk_408 = 2;
- }
- break;
-
- case 2:
- sp36 = 0x1388;
- if (this->unk_409 <= 0) {
- this->unk_408 = 3;
- this->unk_409 = 4;
- }
- break;
-
- case 3:
- sp36 = Math_SinS(this->unk_409 * 0x1000) * 5000.0f;
- if (this->unk_409 <= 0) {
- this->unk_40A = (s32)Rand_ZeroFloat(20.0f) + 60;
- this->unk_408 = 0;
- func_8095AB4C(this);
- }
- break;
-
- case 4:
- sp36 = Math_SinS(this->unk_409 * 0x2000) * 5000.0f;
- if (this->unk_409 <= 0) {
- this->unk_40A = (s32)Rand_ZeroFloat(20.0f) + 60;
- this->unk_408 = 0;
- func_8095AB4C(this);
- }
- break;
+ this->unk_408++;
}
if (this->actionFlags & 0x20) {
sp36 = -sp36;
}
- }
+ break;
- if (this->unk_40D > 0) {
- this->unk_40D--;
- } else {
- this->unk_40C--;
- switch (this->unk_40B) {
- case 0:
- this->unk_3DE = (-this->unk_40C * 0x5DC) + 0x1770;
- if (this->unk_40C <= 0) {
- this->unk_40B = 1;
- this->unk_40C = (s8)(Rand_ZeroFloat(15.0f) + 5.0f);
- }
- break;
+ case 2:
+ if (func_8095C510(this)) {
+ this->actionFlags &= ~0x10;
+ this->unk_40A = (s32)Rand_ZeroFloat(20.0f) + 60;
+ this->unk_408 = 0;
+ func_8095AB4C(this);
+ }
+ break;
- case 1:
- this->unk_3DE = 0x1770;
- if (this->unk_40C <= 0) {
- this->unk_40B = 2;
- this->unk_40C = 4;
- }
- break;
-
- case 2:
- this->unk_3DE = this->unk_40C * 0x5DC;
- if (this->unk_40C <= 0) {
- this->unk_40B = 0;
- this->unk_40C = 4;
- this->unk_40D = (s32)Rand_ZeroFloat(40.0f) + 160;
- }
- break;
+ default:
+ break;
+ }
+ } else {
+ if (this->unk_40A > 0) {
+ this->unk_40A--;
+ } else {
+ if (this->unk_408 == 0) {
+ if (Rand_ZeroOne() < 0.3f) {
+ this->unk_408 = 4;
+ this->unk_409 = 12;
+ } else {
+ this->unk_408 = 1;
+ this->unk_409 = 4;
}
}
+ this->unk_409--;
+
+ switch (this->unk_408) {
+ case 1:
+ sp36 = Math_SinS((-this->unk_409 * 0x1000) + 0x4000) * 5000.0f;
+ if (this->unk_409 <= 0) {
+ this->unk_409 = (s32)(Rand_ZeroFloat(15.0f) + 5.0f);
+ this->unk_408 = 2;
+ }
+ break;
+
+ case 2:
+ sp36 = 0x1388;
+ if (this->unk_409 <= 0) {
+ this->unk_408 = 3;
+ this->unk_409 = 4;
+ }
+ break;
+
+ case 3:
+ sp36 = Math_SinS(this->unk_409 * 0x1000) * 5000.0f;
+ if (this->unk_409 <= 0) {
+ this->unk_40A = (s32)Rand_ZeroFloat(20.0f) + 60;
+ this->unk_408 = 0;
+ func_8095AB4C(this);
+ }
+ break;
+
+ case 4:
+ sp36 = Math_SinS(this->unk_409 * 0x2000) * 5000.0f;
+ if (this->unk_409 <= 0) {
+ this->unk_40A = (s32)Rand_ZeroFloat(20.0f) + 60;
+ this->unk_408 = 0;
+ func_8095AB4C(this);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ if (this->actionFlags & 0x20) {
+ sp36 = -sp36;
+ }
}
- if (sp36) {}
- this->unk_3DC = (u16)((this->unk_3DA << 2) << 8) + sp36;
- this->unk_3D8 = ABS(this->unk_3DC) >> 3;
- } else {
- this->unk_3DE = 0;
- if (this->actionFlags & 2) {
- this->unk_3DC = -0x8000;
+ if (this->unk_40D > 0) {
+ this->unk_40D--;
} else {
- this->unk_3DC = 0;
- }
+ this->unk_40C--;
+ switch (this->unk_40B) {
+ case 0:
+ this->unk_3DE = (-this->unk_40C * 0x5DC) + 0x1770;
+ if (this->unk_40C <= 0) {
+ this->unk_40B = 1;
+ this->unk_40C = (s8)(Rand_ZeroFloat(15.0f) + 5.0f);
+ }
+ break;
- this->unk_3D8 = ABS(this->unk_3DC) >> 3;
+ case 1:
+ this->unk_3DE = 0x1770;
+ if (this->unk_40C <= 0) {
+ this->unk_40B = 2;
+ this->unk_40C = 4;
+ }
+ break;
+
+ case 2:
+ this->unk_3DE = this->unk_40C * 0x5DC;
+ if (this->unk_40C <= 0) {
+ this->unk_40B = 0;
+ this->unk_40C = 4;
+ this->unk_40D = (s32)Rand_ZeroFloat(40.0f) + 160;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
}
+
+ if (sp36) {}
+ this->unk_3DC = (u16)((this->unk_3DA << 2) << 8) + sp36;
+ this->unk_3D8 = ABS(this->unk_3DC) >> 3;
+ } else {
+ this->unk_3DE = 0;
+ if (this->actionFlags & 2) {
+ this->unk_3DC = -0x8000;
+ } else {
+ this->unk_3DC = 0;
+ }
+
+ this->unk_3D8 = ABS(this->unk_3DC) >> 3;
}
}
@@ -1077,8 +1112,8 @@ 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);
- if (this->actor.bgCheckFlags & 1) {
+ 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) {
this->unk_3DC--;
@@ -1117,6 +1152,9 @@ s32 EnOwl_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
rot->y += (s16)(this->unk_3D8 * 1.5f);
}
break;
+
+ default:
+ break;
}
return false;
@@ -1151,7 +1189,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 +1210,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 +1218,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..3dfadc7d7 100644
--- a/src/overlays/actors/ovl_En_Owl/z_en_owl.h
+++ b/src/overlays/actors/ovl_En_Owl/z_en_owl.h
@@ -10,14 +10,14 @@ typedef void (*EnOwlFunc)(struct EnOwl*);
#define ENOWL_GET_F000(thisx) (((thisx)->params & 0xF000) >> 0xC)
#define ENOWL_GET_TYPE(thisx) (((thisx)->params & 0xF80) >> 7)
-#define ENOWL_GET_SWITCHFLAG(thisx) ((thisx)->params & 0x7F)
+#define ENOWL_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
typedef enum {
/* 0x001 */ ENOWL_GET_TYPE_1 = 1,
/* 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 bcbb78716..be1c95685 100644
--- a/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c
+++ b/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c
@@ -8,7 +8,7 @@
#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
#include "overlays/actors/ovl_En_Door/z_en_door.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnPamera*)thisx)
@@ -140,7 +140,7 @@ void EnPamera_Init(Actor* thisx, PlayState* play) {
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, NULL, &sColChkInfoInit2);
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
this->unk_312 = 0;
this->unk_310 = 0;
this->unk_314 = 0;
@@ -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);
}
}
@@ -235,27 +233,27 @@ void EnPamera_Destroy(Actor* thisx, PlayState* play) {
void func_80BD8700(EnPamera* this) {
this->hideInisdeTimer = 0;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0);
this->actionFunc = func_80BD8758;
}
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);
- this->actor.speedXZ = 1.5f;
+ 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.speedXZ = 1.5f;
+ 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;
@@ -277,7 +275,7 @@ void func_80BD8758(EnPamera* this, PlayState* play) {
void func_80BD8908(EnPamera* this) {
this->actor.draw = EnPamera_Draw;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
this->actionFunc = func_80BD8964;
}
@@ -290,7 +288,7 @@ void func_80BD8964(EnPamera* this, PlayState* play) {
vec.z = this->pathPoints->z;
if (Math_Vec3f_StepTo(&this->actor.world.pos, &vec, 1.0f) < 5.0f) {
- this->actor.speedXZ = 1.5f;
+ this->actor.speed = 1.5f;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
SET_WEEKEVENTREG(WEEKEVENTREG_59_01);
func_80BD8B50(this);
@@ -325,41 +323,41 @@ 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.speedXZ) > 10.0f) {
+ 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;
}
void func_80BD8CCC(EnPamera* this) {
this->hideInisdeTimer = 0;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
this->actionFunc = func_80BD8D1C;
}
void func_80BD8D1C(EnPamera* this, PlayState* play) {
if (this->hideInisdeTimer++ > 200) {
- this->actor.speedXZ = 1.5f;
+ this->actor.speed = 1.5f;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
func_80BD8D80(this);
}
}
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.speedXZ) > 10.0f) {
+ 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;
}
@@ -396,7 +394,7 @@ void func_80BD8F60(EnPamera* this, PlayState* play) {
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0xA, 0x3000, 0x1000);
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
- this->actor.speedXZ = 3.0f;
+ this->actor.speed = 3.0f;
func_80BD93CC(this, 0, 0);
func_80BD8D80(this);
}
@@ -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_80BD8DB0) || (this->actor.speedXZ != 3.0f)) &&
+ (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;
}
}
@@ -501,11 +499,11 @@ void func_80BD93F4(EnPamera* this, PlayState* play) {
(this->actionFunc == func_80BD8964) || (this->actionFunc == func_80BD8A7C)) {
if (this->skelAnime.animation == &object_pamera_Anim_008AE0) {
if (Animation_OnFrame(&this->skelAnime, 9.0f) || Animation_OnFrame(&this->skelAnime, 18.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_PAMERA_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_PAMERA_WALK);
}
} else if ((this->skelAnime.animation == &object_pamera_Anim_008E38) &&
(Animation_OnFrame(&this->skelAnime, 2.0f) || Animation_OnFrame(&this->skelAnime, 6.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_PAMERA_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_PAMERA_WALK);
}
}
}
@@ -513,7 +511,7 @@ void func_80BD93F4(EnPamera* this, PlayState* play) {
void func_80BD94E0(EnPamera* this, PlayState* play) {
if ((this->actionFunc != func_80BD8B70) && (this->actionFunc != func_80BD8964) &&
(this->actionFunc != func_80BD909C) && (this->actionFunc != func_80BD8D1C) &&
- ((this->actionFunc != func_80BD8DB0) || (this->actor.speedXZ == 3.0f))) {
+ ((this->actionFunc != func_80BD8DB0) || (this->actor.speed == 3.0f))) {
Actor_TrackPlayer(play, &this->actor, &this->headRot, &this->torsoRot, this->actor.focus.pos);
} else {
Actor_TrackNone(&this->headRot, &this->torsoRot);
@@ -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 {
@@ -585,7 +585,7 @@ void func_80BD9840(EnPamera* this, PlayState* play) {
}
void func_80BD9904(EnPamera* this) {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actionFunc = &func_80BD9928;
}
@@ -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))) {
+ } else if ((GET_PLAYER_FORM != PLAYER_FORM_HUMAN) ||
+ (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;
@@ -621,7 +621,7 @@ void func_80BD994C(EnPamera* this, PlayState* play) {
}
func_80BD9A9C(this);
} else {
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
}
@@ -680,7 +680,7 @@ void func_80BD9B4C(EnPamera* this, PlayState* play) {
break;
case 0x158E:
case 0x15A8:
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_80BD9C70(this, play);
break;
}
@@ -695,21 +695,21 @@ 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;
case 2:
if (this->actor.draw == NULL) {
this->actor.draw = EnPamera_Draw;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}
func_80BD9EE0(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;
}
@@ -772,7 +772,7 @@ void func_80BD9F3C(EnPamera* this, PlayState* play) {
Animation_OnFrame(&this->skelAnime, 10.0f) || Animation_OnFrame(&this->skelAnime, 14.0f) ||
Animation_OnFrame(&this->skelAnime, 18.0f) || Animation_OnFrame(&this->skelAnime, 22.0f) ||
Animation_OnFrame(&this->skelAnime, 25.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_PAMERA_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_PAMERA_WALK);
}
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
this->unk_31E = 0;
@@ -820,7 +820,7 @@ void func_80BDA1C8(EnPamera* this, PlayState* play) {
if (this->unk_31E == 1) {
if (Animation_OnFrame(&this->skelAnime, 2.0f) || Animation_OnFrame(&this->skelAnime, 6.0f) ||
Animation_OnFrame(&this->skelAnime, 10.0f) || Animation_OnFrame(&this->skelAnime, 14.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_PAMERA_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_PAMERA_WALK);
}
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
this->unk_31E = 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 82b424657..37c234538 100644
--- a/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c
+++ b/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c
@@ -8,9 +8,10 @@
#include "z64quake.h"
#include "z64rumble.h"
#include "overlays/actors/ovl_En_Bigpamet/z_en_bigpamet.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((EnPametfrog*)thisx)
@@ -80,12 +81,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 = {
@@ -168,10 +169,10 @@ static InitChainEntry sInitChain[] = {
ICHAIN_F32_DIV1000(targetArrowOffset, -13221, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -1000, ICHAIN_CONTINUE),
ICHAIN_VEC3F_DIV1000(scale, 7, ICHAIN_CONTINUE),
- ICHAIN_U8(targetMode, 10, ICHAIN_STOP),
+ ICHAIN_U8(targetMode, TARGET_MODE_10, ICHAIN_STOP),
};
-static s32 isFrogReturnedFlags[] = {
+static s32 sIsFrogReturnedFlags[] = {
WEEKEVENTREG_32_40,
WEEKEVENTREG_32_80,
WEEKEVENTREG_33_01,
@@ -191,7 +192,7 @@ void EnPametfrog_Init(Actor* thisx, PlayState* play) {
this->params = CLAMP(this->actor.params, 1, 4);
if (Flags_GetClear(play, play->roomCtx.curRoom.num)) {
Actor_Kill(&this->actor);
- if (!CHECK_WEEKEVENTREG(isFrogReturnedFlags[this->actor.params - 1])) {
+ if (!CHECK_WEEKEVENTREG(sIsFrogReturnedFlags[this->actor.params - 1])) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_MINIFROG, this->actor.world.pos.x, this->actor.world.pos.y,
this->actor.world.pos.z, 0, this->actor.shape.rot.y, 0, this->params);
}
@@ -244,7 +245,7 @@ void EnPametfrog_Thaw(EnPametfrog* this, PlayState* play) {
this->collider.base.colType = COLTYPE_HIT6;
this->collider.elements->info.elemType = ELEMTYPE_UNK1;
this->drawDmgEffAlpha = 0.0f;
- Actor_SpawnIceEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), 2, 0.3f, 0.2f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, GEKKO_BODYPART_MAX, 2, 0.3f, 0.2f);
}
}
@@ -306,7 +307,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 +342,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);
}
}
@@ -376,10 +377,10 @@ void EnPametfrog_PlaceSnapper(EnPametfrog* this, PlayState* play) {
void EnPametfrog_JumpOnGround(EnPametfrog* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, 1.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FROG_JUMP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FROG_JUMP);
} else if (Animation_OnFrame(&this->skelAnime, 11.0f)) {
EnPametfrog_JumpWaterEffects(this, play);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_WALK_WATER);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_WALK_WATER);
}
}
@@ -394,7 +395,7 @@ void EnPametfrog_ApplyMagicArrowEffects(EnPametfrog* this, PlayState* play) {
this->drawDmgEffAlpha = 3.0f;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->collider.elements[0].info.bumper.hitPos.x,
this->collider.elements[0].info.bumper.hitPos.y, this->collider.elements[0].info.bumper.hitPos.z, 0,
- 0, 0, CLEAR_TAG_LARGE_LIGHT_RAYS);
+ 0, 0, CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
} else if (this->actor.colChkInfo.damageEffect == GEKKO_DMGEFF_ICE) {
EnPametfrog_Freeze(this);
}
@@ -402,8 +403,8 @@ void EnPametfrog_ApplyMagicArrowEffects(EnPametfrog* this, PlayState* play) {
void EnPametfrog_ApplyElectricStun(EnPametfrog* this) {
this->freezeTimer = 40;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 40);
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_SMALL;
this->drawDmgEffScale = 0.75f;
this->drawDmgEffAlpha = 2.0f;
@@ -411,8 +412,8 @@ void EnPametfrog_ApplyElectricStun(EnPametfrog* this) {
void EnPametfrog_ApplyStun(EnPametfrog* this) {
this->freezeTimer = 40;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 40);
}
void EnPametfrog_SetupRearOnSnapper(EnPametfrog* this) {
@@ -424,7 +425,7 @@ void EnPametfrog_SetupRearOnSnapper(EnPametfrog* this) {
Animation_PlayOnce(&this->skelAnime, &gGekkoStandingIdleAnim);
}
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.params = GEKKO_ON_SNAPPER;
this->actionFunc = EnPametfrog_RearOnSnapper;
}
@@ -447,7 +448,7 @@ void EnPametfrog_RearOnSnapper(EnPametfrog* this, PlayState* play) {
rearingPoint.x = this->actor.world.pos.x;
rearingPoint.y = this->actor.world.pos.y + 10.0f;
rearingPoint.z = this->actor.world.pos.z;
- if (actor->world.rot.x < Actor_PitchToPoint(actor, &rearingPoint)) {
+ if (actor->world.rot.x < Actor_WorldPitchTowardPoint(actor, &rearingPoint)) {
EnPametfrog_SetupRearOnSnapperWave(this);
} else {
EnPametfrog_SetupRearOnSnapperRise(this);
@@ -497,19 +498,19 @@ void EnPametfrog_SetupFallOffSnapper(EnPametfrog* this, PlayState* play) {
Animation_PlayOnce(&this->skelAnime, &gGekkoFallInAirAnim);
this->actor.params = GEKKO_FALL_OFF_SNAPPER;
- this->actor.speedXZ = 7.0f;
+ this->actor.speed = 7.0f;
this->actor.velocity.y = 15.0f;
this->actor.world.rot.y = BINANG_ROT180(this->actor.child->world.rot.y);
this->actor.shape.rot.y = this->actor.world.rot.y;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->timer = 30;
this->collider.base.ocFlags1 |= OC1_ON;
- yaw = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ yaw = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
subCamEye.x = (Math_SinS(yaw) * 300.0f) + this->actor.focus.pos.x;
subCamEye.y = this->actor.focus.pos.y + 100.0f;
subCamEye.z = (Math_CosS(yaw) * 300.0f) + this->actor.focus.pos.z;
Play_SetCameraAtEye(play, this->subCamId, &this->actor.focus.pos, &subCamEye);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FROG_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FROG_DAMAGE);
this->actionFunc = EnPametfrog_FallOffSnapper;
}
@@ -523,9 +524,9 @@ 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 & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
EnPametfrog_StopCutscene(this, play);
EnPametfrog_SetupJumpToWall(this);
}
@@ -535,22 +536,22 @@ void EnPametfrog_SetupJumpToWall(EnPametfrog* this) {
Animation_Change(&this->skelAnime, &gGekkoJumpForwardAnim, 2.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -2.0f);
this->actor.shape.rot.x = 0;
this->actor.shape.rot.z = 0;
- this->actor.bgCheckFlags &= ~8;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FROG_VOICE2);
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_WALL;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FROG_VOICE2);
this->actionFunc = EnPametfrog_JumpToWall;
}
void EnPametfrog_JumpToWall(EnPametfrog* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
EnPametfrog_JumpOnGround(this, play);
- if ((this->actor.bgCheckFlags & 1) && (this->actor.bgCheckFlags & 8) && (this->actor.wallBgId == BGCHECK_SCENE) &&
- (COLPOLY_GET_NORMAL(this->actor.wallPoly->normal.y) < 0.5f)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) &&
+ (this->actor.wallBgId == BGCHECK_SCENE) && (COLPOLY_GET_NORMAL(this->actor.wallPoly->normal.y) < 0.5f)) {
EnPametfrog_SetupWallCrawl(this);
- } else if (!(this->actor.bgCheckFlags & 1) ||
+ } else if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
((this->skelAnime.curFrame > 1.0f) && (this->skelAnime.curFrame < 12.0f))) {
- this->actor.speedXZ = 12.0f;
+ this->actor.speed = 12.0f;
} else {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
}
@@ -579,8 +580,8 @@ void EnPametfrog_SetupWallCrawl(EnPametfrog* this) {
this->skelAnime.playSpeed = 1.0f;
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FROG_RUNAWAY);
- this->actor.speedXZ = 8.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FROG_RUNAWAY);
+ this->actor.speed = 8.0f;
this->timer = Rand_S16Offset(35, 15);
this->actionFunc = EnPametfrog_WallCrawl;
}
@@ -602,8 +603,8 @@ void EnPametfrog_WallCrawl(EnPametfrog* this, PlayState* play) {
} else {
SkelAnime_Update(&this->skelAnime);
this->timer--;
- this->actor.speedXZ = 8.0f;
- doubleSpeedXZ = this->actor.speedXZ * 2.0f;
+ this->actor.speed = 8.0f;
+ doubleSpeedXZ = this->actor.speed * 2.0f;
vec1.x = this->actor.world.pos.x + this->unk_2DC.x * 2.0f;
vec1.y = this->actor.world.pos.y + this->unk_2DC.y * 2.0f;
vec1.z = this->actor.world.pos.z + this->unk_2DC.z * 2.0f;
@@ -619,7 +620,7 @@ void EnPametfrog_WallCrawl(EnPametfrog* this, PlayState* play) {
isSuccess = func_8086A2CC(this, poly1);
Math_Vec3f_Copy(&this->actor.world.pos, &worldPos1);
this->actor.floorBgId = bgId1;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
} else {
if (this->actor.floorPoly != poly2) {
isSuccess = func_8086A2CC(this, poly2);
@@ -636,11 +637,11 @@ void EnPametfrog_WallCrawl(EnPametfrog* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, 15.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BOMCHU_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BOMCHU_WALK);
}
if (((play->gameplayFrames % 60) == 0) && (Rand_ZeroOne() < 0.8f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FROG_REAL);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FROG_REAL);
}
if ((this->timer == 0) ||
@@ -659,7 +660,7 @@ void EnPametfrog_SetupWallPause(EnPametfrog* this) {
s32 pad;
f32 randFloat;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->skelAnime.playSpeed = 1.5f;
if (this->timer != 0) {
this->wallRotation = this->unk_2E8.y > 0.0f ? (M_PI / 30) : (-M_PI / 30);
@@ -668,7 +669,7 @@ void EnPametfrog_SetupWallPause(EnPametfrog* this) {
this->wallRotation = (Rand_ZeroOne() < 0.5f ? -1 : 1) * (0x1000 + randFloat) * (M_PI / (15 * 0x8000));
}
this->timer = 15;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FROG_RUNAWAY2);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FROG_RUNAWAY2);
this->actionFunc = EnPametfrog_WallPause;
}
@@ -686,7 +687,7 @@ void EnPametfrog_WallPause(EnPametfrog* this, PlayState* play) {
Math3D_CrossProduct(&this->unk_2DC, &this->unk_2D0, &this->unk_2E8);
func_8086A238(this);
if (((play->gameplayFrames % 60) == 0) && (Rand_ZeroOne() < 0.8f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FROG_REAL);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FROG_REAL);
}
if (this->timer == 0) {
@@ -700,19 +701,19 @@ void EnPametfrog_SetupClimbDownWall(EnPametfrog* this) {
Animation_Change(&this->skelAnime, &gGekkoJumpForwardAnim, 0.0f, 0.0f,
Animation_GetLastFrame(&gGekkoJumpForwardAnim), ANIMMODE_ONCE, 0.0f);
- this->actor.shape.rot.y = Actor_YawBetweenActors(&this->actor, this->actor.child);
+ this->actor.shape.rot.y = Actor_WorldYawTowardActor(&this->actor, this->actor.child);
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actor.shape.rot.x = 0;
this->actor.shape.rot.z = 0;
this->actor.colChkInfo.mass = 50;
- this->actor.speedXZ = 5.0f;
+ this->actor.speed = 5.0f;
this->collider.base.acFlags &= ~AC_ON;
this->actor.velocity.y = 0.0f;
this->actor.gravity = -1.0f;
- yaw = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ yaw = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
this->actor.world.pos.x += 30.0f * Math_SinS(yaw);
this->actor.world.pos.z += 30.0f * Math_CosS(yaw);
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
this->actor.params = GEKKO_RETURN_TO_SNAPPER;
this->actionFunc = EnPametfrog_ClimbDownWall;
}
@@ -720,10 +721,10 @@ void EnPametfrog_SetupClimbDownWall(EnPametfrog* this) {
void EnPametfrog_ClimbDownWall(EnPametfrog* this, PlayState* play) {
s16 yaw;
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
EnPametfrog_SetupRunToSnapper(this);
} else if (this->actor.floorHeight == BGCHECK_Y_MIN) {
- yaw = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ yaw = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
this->actor.world.pos.x += 5.0f * Math_SinS(yaw);
this->actor.world.pos.z += 5.0f * Math_CosS(yaw);
if (this->actor.world.pos.y < (this->actor.home.pos.y - 5.0f)) {
@@ -741,15 +742,16 @@ void EnPametfrog_SetupRunToSnapper(EnPametfrog* this) {
void EnPametfrog_RunToSnapper(EnPametfrog* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
EnPametfrog_JumpOnGround(this, play);
- this->actor.shape.rot.y = Actor_YawBetweenActors(&this->actor, this->actor.child);
+ this->actor.shape.rot.y = Actor_WorldYawTowardActor(&this->actor, this->actor.child);
this->actor.world.rot.y = this->actor.shape.rot.y;
- if (!(this->actor.bgCheckFlags & 1) || ((this->skelAnime.curFrame > 1.0f) && (this->skelAnime.curFrame < 12.0f))) {
- this->actor.speedXZ = 12.0f;
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
+ ((this->skelAnime.curFrame > 1.0f) && (this->skelAnime.curFrame < 12.0f))) {
+ this->actor.speed = 12.0f;
} else {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
- if ((this->actor.child->params == 1) && (Actor_XZDistanceBetweenActors(&this->actor, this->actor.child) < 120.0f) &&
+ if ((this->actor.child->params == 1) && (Actor_WorldDistXZToActor(&this->actor, this->actor.child) < 120.0f) &&
Animation_OnFrame(&this->skelAnime, 0.0f)) {
EnPametfrog_SetupJumpOnSnapper(this);
}
@@ -760,12 +762,12 @@ void EnPametfrog_SetupJumpOnSnapper(EnPametfrog* this) {
this->timer = 6;
this->collider.base.ocFlags1 &= ~OC1_ON;
this->collider.base.acFlags &= ~AC_ON;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.velocity.y = 0.0f;
- this->actor.shape.rot.y = Actor_YawBetweenActors(&this->actor, this->actor.child);
+ this->actor.shape.rot.y = Actor_WorldYawTowardActor(&this->actor, this->actor.child);
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actor.params = GEKKO_JUMP_ON_SNAPPER;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FROG_GREET);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FROG_GREET);
this->actionFunc = EnPametfrog_JumpOnSnapper;
}
@@ -811,18 +813,18 @@ void EnPametfrog_SetupFallInAir(EnPametfrog* this, PlayState* play) {
this->actor.params = GEKKO_RETURN_TO_SNAPPER;
}
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.velocity.y = 0.0f;
this->collider.base.acFlags &= ~AC_ON;
this->timer = 10;
if (this->actor.colChkInfo.health == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FROG_DEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FROG_DEAD);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FROG_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FROG_DAMAGE);
}
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 16);
- yaw = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 16);
+ yaw = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
this->actor.world.pos.x += 30.0f * Math_SinS(yaw);
this->actor.world.pos.z += 30.0f * Math_CosS(yaw);
if (this->subCamId != SUB_CAM_ID_DONE) {
@@ -860,7 +862,7 @@ void EnPametfrog_FallInAir(EnPametfrog* this, PlayState* play) {
&Play_GetCamera(play, this->subCamId)->eye);
}
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
EnPametfrog_SetupFallOnGround(this, play);
}
}
@@ -875,7 +877,7 @@ void EnPametfrog_SetupFallOnGround(EnPametfrog* this, PlayState* play) {
this->timer = 5;
EnPametfrog_Thaw(this, play);
EnPametfrog_JumpWaterEffects(this, play);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_WALK_WATER);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_WALK_WATER);
this->actionFunc = EnPametfrog_FallOnGround;
}
@@ -898,7 +900,7 @@ void EnPametfrog_FallOnGround(EnPametfrog* this, PlayState* play) {
void EnPametfrog_SetupDefeatGekko(EnPametfrog* this, PlayState* play) {
Vec3f subCamEye;
- s16 yaw = Actor_YawToPoint(this->actor.child, &this->actor.home.pos);
+ s16 yaw = Actor_WorldYawTowardPoint(this->actor.child, &this->actor.home.pos);
s16 yawDiff = this->actor.yawTowardsPlayer - yaw;
yaw = yawDiff > 0 ? yaw - 0x2000 : yaw + 0x2000;
@@ -923,7 +925,7 @@ void EnPametfrog_DefeatGekko(EnPametfrog* this, PlayState* play) {
void EnPametfrog_SetupDefeatSnapper(EnPametfrog* this, PlayState* play) {
Vec3f subCamEye;
- s16 yaw = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ s16 yaw = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
s16 yawDiff = this->actor.yawTowardsPlayer - yaw;
yaw = yawDiff > 0 ? yaw - 0x2000 : yaw + 0x2000;
@@ -965,9 +967,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);
}
@@ -980,7 +982,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);
@@ -990,22 +992,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.speedXZ = 0.0f;
+ 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);
@@ -1016,14 +1018,14 @@ void EnPametfrog_PlayCutscene(EnPametfrog* this, PlayState* play) {
EnPametfrog_SetupFallOffSnapper(this, play);
}
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
void EnPametfrog_SetupLookAround(EnPametfrog* this) {
Animation_PlayOnce(&this->skelAnime, &gGekkoLookAroundAnim);
this->collider.base.atFlags &= ~AT_ON;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = EnPametfrog_LookAround;
}
@@ -1053,10 +1055,11 @@ void EnPametfrog_JumpToLink(EnPametfrog* this, PlayState* play) {
this->actor.shape.rot.y = this->actor.world.rot.y;
SkelAnime_Update(&this->skelAnime);
EnPametfrog_JumpOnGround(this, play);
- if (!(this->actor.bgCheckFlags & 1) || (this->skelAnime.curFrame > 1.0f && this->skelAnime.curFrame < 12.0f)) {
- this->actor.speedXZ = 8.0f;
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
+ (this->skelAnime.curFrame > 1.0f && this->skelAnime.curFrame < 12.0f)) {
+ this->actor.speed = 8.0f;
} else {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
if ((this->collider.base.ocFlags1 & OC1_HIT) && (this->collider.base.ocFlags2 & OC2_HIT_PLAYER) &&
@@ -1069,7 +1072,7 @@ void EnPametfrog_JumpToLink(EnPametfrog* this, PlayState* play) {
void EnPametfrog_SetupMeleeAttack(EnPametfrog* this) {
Animation_PlayOnce(&this->skelAnime, &gGekkoBoxingStanceAnim);
this->timer = 7;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = EnPametfrog_MeleeAttack;
}
@@ -1099,9 +1102,9 @@ void EnPametfrog_MeleeAttack(EnPametfrog* this, PlayState* play) {
((this->skelAnime.animation == &gGekkoWindupPunchAnim) && Animation_OnFrame(&this->skelAnime, 27.0f))) {
this->collider.base.atFlags |= AT_ON;
if (this->skelAnime.animation == &gGekkoKickAnim) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FROG_KICK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FROG_KICK);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FROG_PUNCH1);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FROG_PUNCH1);
}
} else {
this->collider.base.atFlags &= ~AT_ON;
@@ -1113,9 +1116,9 @@ void EnPametfrog_SetupDamage(EnPametfrog* this) {
this->timer = 20;
this->collider.base.atFlags &= ~AT_ON;
this->collider.base.acFlags &= ~AC_ON;
- this->actor.speedXZ = 10.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FROG_DAMAGE);
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 20);
+ this->actor.speed = 10.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FROG_DAMAGE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 20);
func_800BE5CC(&this->actor, &this->collider, 0);
this->actor.shape.rot.y = BINANG_ROT180(this->actor.world.rot.y);
this->actionFunc = EnPametfrog_Damage;
@@ -1124,7 +1127,7 @@ void EnPametfrog_SetupDamage(EnPametfrog* this) {
void EnPametfrog_Damage(EnPametfrog* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
this->timer--;
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f);
+ Math_StepToF(&this->actor.speed, 0.0f, 0.5f);
if (this->timer == 0) {
if (this->actor.colChkInfo.health > 0) {
EnPametfrog_SetupJumpToLink(this);
@@ -1141,7 +1144,7 @@ void EnPametfrog_SetupStun(EnPametfrog* this) {
}
this->collider.base.atFlags &= ~AT_ON;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->actor.colChkInfo.health == 0) {
this->collider.base.acFlags &= ~AC_ON;
@@ -1168,10 +1171,10 @@ void EnPametfrog_SetupCallSnapper(EnPametfrog* this, PlayState* play) {
s16 yawDiff;
Animation_MorphToPlayOnce(&this->skelAnime, &gGekkoCallAnim, 3.0f);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FROG_GREET);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FROG_GREET);
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.colChkInfo.health = 6;
- this->actor.world.rot.y = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ this->actor.world.rot.y = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
yawDiff = this->actor.yawTowardsPlayer - this->actor.world.rot.y;
if (yawDiff > 0) {
this->actor.world.rot.y -= 0x2000;
@@ -1209,7 +1212,7 @@ void EnPametfrog_SetupSnapperSpawn(EnPametfrog* this, PlayState* play) {
subCamAt.x = this->actor.child->world.pos.x;
subCamAt.z = this->actor.child->world.pos.z;
subCamAt.y = this->actor.child->floorHeight + 50.0f;
- if ((s16)(Actor_YawToPoint(&this->actor, &this->actor.home.pos) - this->actor.shape.rot.y) > 0) {
+ if ((s16)(Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos) - this->actor.shape.rot.y) > 0) {
yaw = this->actor.child->shape.rot.y - 0x1000;
} else {
yaw = this->actor.child->shape.rot.y + 0x1000;
@@ -1222,10 +1225,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);
@@ -1247,12 +1250,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);
@@ -1285,7 +1288,7 @@ void EnPametfrog_ApplyDamageEffect(EnPametfrog* this, PlayState* play) {
} else if (this->actor.colChkInfo.damageEffect == GEKKO_DMGEFF_ICE) {
EnPametfrog_Freeze(this);
this->freezeTimer = 80;
- Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, 0, 0x50);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 80);
EnPametfrog_SetupStun(this);
} else {
EnPametfrog_Thaw(this, play);
@@ -1297,10 +1300,11 @@ void EnPametfrog_ApplyDamageEffect(EnPametfrog* this, PlayState* play) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_LIGHT_ORBS;
this->drawDmgEffScale = 0.75f;
this->drawDmgEffAlpha = 4.0f;
- Actor_Spawn(
- &play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->collider.elements[0].info.bumper.hitPos.x,
- this->collider.elements[0].info.bumper.hitPos.y,
- this->collider.elements[0].info.bumper.hitPos.z, 0, 0, 0, CLEAR_TAG_LARGE_LIGHT_RAYS);
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG,
+ this->collider.elements[0].info.bumper.hitPos.x,
+ this->collider.elements[0].info.bumper.hitPos.y,
+ this->collider.elements[0].info.bumper.hitPos.z, 0, 0, 0,
+ CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
}
EnPametfrog_SetupDamage(this);
}
@@ -1308,7 +1312,7 @@ void EnPametfrog_ApplyDamageEffect(EnPametfrog* this, PlayState* play) {
this->collider.base.acFlags &= ~AC_ON;
EnPametfrog_ApplyMagicArrowEffects(this, play);
Enemy_StartFinishingBlow(play, &this->actor);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
Audio_RestorePrevBgm();
EnPametfrog_SetupCutscene(this);
} else if (this->actor.colChkInfo.damageEffect == GEKKO_DMGEFF_ZORA_BARRIER) {
@@ -1341,7 +1345,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;
@@ -1368,34 +1374,43 @@ void EnPametfrog_Update(Actor* thisx, PlayState* play) {
this->drawDmgEffScale = unk2C4;
this->drawDmgEffScale = unk2C4 > 0.75f ? 0.75f : this->drawDmgEffScale;
} else if (!Math_StepToF(&this->drawDmgEffFrozenSteamScale, 0.75f, (3.0f / 160.0f))) {
- func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
}
}
-/* value -1: Limb Not used
- * value 0: GEKKO_LIMB_WAIST
- * value 1: GEKKO_LIMB_LEFT_SHIN
- * value 2: GEKKO_LIMB_LEFT_FOOT
- * value 3: GEKKO_LIMB_RIGHT_SHIN
- * value 4: GEKKO_LIMB_RIGHT_FOOT
- * value 5: GEKKO_LIMB_LEFT_UPPER_ARM
- * value 6: GEKKO_LIMB_LEFT_FOREARM
- * value 7: GEKKO_LIMB_LEFT_HAND
- * value 8: GEKKO_LIMB_RIGHT_UPPER_ARM
- * value 9: GEKKO_LIMB_RIGHT_FOREARM
- * value 10: GEKKO_LIMB_RIGHT_HAND
- * value 11: GEKKO_LIMB_JAW
- */
-static s8 limbPosIndex[] = {
- -1, -1, 0, -1, 1, -1, 2, -1, 3, -1, 4, -1, 5, 6, -1, 7, 8, 9, -1, 10, -1, 11, -1, -1,
+static s8 sLimbToBodyParts[GEKKO_LIMB_MAX] = {
+ BODYPART_NONE, // GEKKO_LIMB_NONE
+ BODYPART_NONE, // GEKKO_LIMB_ROOT
+ GEKKO_BODYPART_WAIST, // GEKKO_LIMB_WAIST
+ BODYPART_NONE, // GEKKO_LIMB_LEFT_THIGH
+ GEKKO_BODYPART_LEFT_SHIN, // GEKKO_LIMB_LEFT_SHIN
+ BODYPART_NONE, // GEKKO_LIMB_LEFT_ANKLE
+ GEKKO_BODYPART_LEFT_FOOT, // GEKKO_LIMB_LEFT_FOOT
+ BODYPART_NONE, // GEKKO_LIMB_RIGHT_THIGH
+ GEKKO_BODYPART_RIGHT_SHIN, // GEKKO_LIMB_RIGHT_SHIN
+ BODYPART_NONE, // GEKKO_LIMB_RIGHT_ANKLE
+ GEKKO_BODYPART_RIGHT_FOOT, // GEKKO_LIMB_RIGHT_FOOT
+ BODYPART_NONE, // GEKKO_LIMB_TORSO
+ GEKKO_BODYPART_LEFT_UPPER_ARM, // GEKKO_LIMB_LEFT_UPPER_ARM
+ GEKKO_BODYPART_LEFT_FOREARM, // GEKKO_LIMB_LEFT_FOREARM
+ BODYPART_NONE, // GEKKO_LIMB_LEFT_WRIST
+ GEKKO_BODYPART_LEFT_HAND, // GEKKO_LIMB_LEFT_HAND
+ GEKKO_BODYPART_RIGHT_UPPER_ARM, // GEKKO_LIMB_RIGHT_UPPER_ARM
+ GEKKO_BODYPART_RIGHT_FOREARM, // GEKKO_LIMB_RIGHT_FOREARM
+ BODYPART_NONE, // GEKKO_LIMB_RIGHT_WRIST
+ GEKKO_BODYPART_RIGHT_HAND, // GEKKO_LIMB_RIGHT_HAND
+ BODYPART_NONE, // GEKKO_LIMB_HEAD
+ GEKKO_BODYPART_JAW, // GEKKO_LIMB_JAW
+ BODYPART_NONE, // GEKKO_LIMB_LEFT_EYE
+ BODYPART_NONE, // GEKKO_LIMB_RIGHT_EYE
};
void EnPametfrog_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnPametfrog* this = THIS;
Vec3f vec;
Vec3s* center;
- s8 index;
+ s8 bodyPartIndex;
if (limbIndex == GEKKO_LIMB_HEAD) {
Matrix_MultZero(&this->actor.focus.pos);
@@ -1411,19 +1426,19 @@ void EnPametfrog_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s
center->z = (Math_CosS(this->actor.shape.rot.y) * 35.0f) + this->actor.focus.pos.z;
}
- index = limbPosIndex[limbIndex];
- if (index != -1) {
- Matrix_MultZero(&this->limbPos[index]);
+ bodyPartIndex = sLimbToBodyParts[limbIndex];
+ if (bodyPartIndex != BODYPART_NONE) {
+ Matrix_MultZero(&this->bodyPartsPos[bodyPartIndex]);
}
}
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);
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), this->drawDmgEffScale,
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, GEKKO_BODYPART_MAX, this->drawDmgEffScale,
this->drawDmgEffFrozenSteamScale, this->drawDmgEffAlpha, this->drawDmgEffType);
}
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..ac0a0b3f5 100644
--- a/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.h
+++ b/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.h
@@ -9,18 +9,35 @@ 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 enum GekkoBodyPart {
+ /* -1 */ GEKKO_BODYPART_NONE = -1,
+ /* 0 */ GEKKO_BODYPART_WAIST,
+ /* 1 */ GEKKO_BODYPART_LEFT_SHIN,
+ /* 2 */ GEKKO_BODYPART_LEFT_FOOT,
+ /* 3 */ GEKKO_BODYPART_RIGHT_SHIN,
+ /* 4 */ GEKKO_BODYPART_RIGHT_FOOT,
+ /* 5 */ GEKKO_BODYPART_LEFT_UPPER_ARM,
+ /* 6 */ GEKKO_BODYPART_LEFT_FOREARM,
+ /* 7 */ GEKKO_BODYPART_LEFT_HAND,
+ /* 8 */ GEKKO_BODYPART_RIGHT_UPPER_ARM,
+ /* 9 */ GEKKO_BODYPART_RIGHT_FOREARM,
+ /* 10 */ GEKKO_BODYPART_RIGHT_HAND,
+ /* 11 */ GEKKO_BODYPART_JAW,
+ /* 12 */ GEKKO_BODYPART_MAX
+} GekkoBodyPart;
+
typedef struct EnPametfrog {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
@@ -30,7 +47,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;
@@ -44,7 +61,7 @@ typedef struct EnPametfrog {
/* 0x2D0 */ Vec3f unk_2D0; // MtxF xz/yz/zz
/* 0x2DC */ Vec3f unk_2DC; // MtxF xy/yy/zy: wallNorm/floorNorm/Base of Gekko walking???
/* 0x2E8 */ Vec3f unk_2E8; // MtxF xx/yx/zx
- /* 0x2F4 */ Vec3f limbPos[12];
+ /* 0x2F4 */ Vec3f bodyPartsPos[GEKKO_BODYPART_MAX];
/* 0x384 */ ColliderJntSph collider;
/* 0x3A4 */ ColliderJntSphElement colElement[2];
} EnPametfrog; // size = 0x424
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 527a91b3d..e56970e10 100644
--- a/src/overlays/actors/ovl_En_Part/z_en_part.c
+++ b/src/overlays/actors/ovl_En_Part/z_en_part.c
@@ -52,7 +52,7 @@ void func_80865390(EnPart* this, PlayState* play) {
this->actor.world.rot.y = this->actor.parent->shape.rot.y + 0x8000;
this->unk146 = 100;
this->actor.velocity.y = 7.0f;
- this->actor.speedXZ = 2.0f;
+ this->actor.speed = 2.0f;
this->actor.gravity = -1.0f;
break;
}
@@ -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 3e2fdcfac..e2557b1c3 100644
--- a/src/overlays/actors/ovl_En_Peehat/z_en_peehat.c
+++ b/src/overlays/actors/ovl_En_Peehat/z_en_peehat.c
@@ -6,10 +6,11 @@
#include "z_en_peehat.h"
#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h"
#include "objects/object_ph/object_ph.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnPeehat*)thisx)
@@ -230,11 +231,11 @@ void EnPeehat_Destroy(Actor* thisx, PlayState* play) {
void func_80897170(EnPeehat* this) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX;
this->drawDmgEffScale = 1.1f;
- this->drawDmgEffFrozenSteamScale = 1.6500001f;
+ this->drawDmgEffFrozenSteamScale = 1650.0f * 0.001f;
this->drawDmgEffAlpha = 1.0f;
this->colliderSphere.base.colType = COLTYPE_HIT3;
this->unk_2B0 = 80;
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 80);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 80);
}
void func_808971DC(EnPeehat* this, PlayState* play) {
@@ -242,7 +243,7 @@ void func_808971DC(EnPeehat* this, PlayState* play) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->colliderSphere.base.colType = COLTYPE_HIT6;
this->drawDmgEffAlpha = 0.0f;
- Actor_SpawnIceEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), 2, 0.5f, 0.35f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, PEEHAT_BODYPART_MAX, 2, 0.5f, 0.35f);
}
}
@@ -257,9 +258,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);
@@ -283,7 +284,7 @@ void func_80897390(EnPeehat* this, PlayState* play) {
}
this->unk_2B0 = 8;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PIHAT_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PIHAT_DAMAGE);
}
void func_80897498(EnPeehat* this) {
@@ -297,7 +298,7 @@ void func_80897498(EnPeehat* this) {
void func_80897520(EnPeehat* this, PlayState* play) {
if (!gSaveContext.save.isNight) {
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->colliderSphere.base.acFlags |= AC_ON;
if (this->actor.xzDistToPlayer < 740.0f) {
func_80897648(this);
@@ -305,7 +306,7 @@ void func_80897520(EnPeehat* this, PlayState* play) {
Math_StepToF(&this->actor.shape.yOffset, -1000.0f, 10.0f);
}
} else {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->colliderSphere.base.acFlags &= ~AC_ON;
Math_StepToF(&this->actor.shape.yOffset, -1000.0f, 50.0f);
if (this->unk_2B0 != 0) {
@@ -327,7 +328,7 @@ void func_80897648(EnPeehat* this) {
Animation_GetLastFrame(&object_ph_Anim_0009C4), ANIMMODE_ONCE, 0.0f);
}
this->unk_2B0 = 16;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PIHAT_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PIHAT_UP);
this->actionFunc = func_808976DC;
}
@@ -378,7 +379,7 @@ void func_80897864(EnPeehat* this) {
void func_80897910(EnPeehat* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- Math_StepToF(&this->actor.speedXZ, 3.0f, 0.25f);
+ Math_StepToF(&this->actor.speed, 3.0f, 0.25f);
Math_StepToF(&this->actor.world.pos.y, this->actor.floorHeight + 80.0f, 3.0f);
SkelAnime_Update(&this->skelAnime);
if (!gSaveContext.save.isNight && (Math_Vec3f_DistXZ(&this->actor.home.pos, &player->actor.world.pos) < 1200.0f)) {
@@ -390,13 +391,13 @@ void func_80897910(EnPeehat* this, PlayState* play) {
Math_ScaledStepToS(&this->unk_2B2, 4000, 500);
this->unk_2B4 += this->unk_2B2;
Math_StepToF(&this->unk_2C4, 0.075f, 0.005f);
- func_800B9010(&this->actor, NA_SE_EN_PIHAT_FLY - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_PIHAT_FLY - SFX_FLAG);
}
void func_80897A34(EnPeehat* this) {
Animation_PlayLoop(&this->skelAnime, &object_ph_Anim_0005C4);
this->unk_2B0 = 30;
- this->actor.speedXZ = 5.3f;
+ this->actor.speed = 5.3f;
this->colliderTris.base.atFlags |= AT_ON;
this->actionFunc = func_80897A94;
}
@@ -426,16 +427,16 @@ void func_80897A94(EnPeehat* this, PlayState* play) {
Math_ScaledStepToS(&this->unk_2B2, 4000, 500);
this->unk_2B4 += this->unk_2B2;
Math_StepToF(&this->unk_2C4, 0.075f, 0.005f);
- func_800B9010(&this->actor, NA_SE_EN_PIHAT_SM_FLY - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_PIHAT_SM_FLY - SFX_FLAG);
if (this->colliderTris.base.atFlags & AT_BOUNCED) {
this->colliderTris.base.atFlags &= ~(AT_BOUNCED | AT_ON);
this->actor.colChkInfo.health = 0;
func_808982E0(this);
- } else if ((this->colliderCylinder.base.acFlags & AC_HIT) || (this->actor.bgCheckFlags & 1)) {
+ } else if ((this->colliderCylinder.base.acFlags & AC_HIT) || (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
func_800B3030(play, &this->actor.world.pos, &gZeroVec3f, &gZeroVec3f, 40, 7, 0);
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 11, NA_SE_EN_EXTINCT);
- if (!(this->actor.bgCheckFlags & 1)) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EN_PIHAT_SM_DEAD);
}
Actor_Kill(&this->actor);
@@ -449,7 +450,7 @@ void func_80897A94(EnPeehat* this, PlayState* play) {
this->unk_2B0 = 40;
} else if (this->colliderCylinder.base.ocFlags1 & OC1_HIT) {
this->colliderCylinder.base.ocFlags1 &= ~OC1_HIT;
- if ((BINANG_SUB(Actor_YawBetweenActors(&this->actor, this->colliderCylinder.base.oc),
+ if ((BINANG_SUB(Actor_WorldYawTowardActor(&this->actor, this->colliderCylinder.base.oc),
this->actor.world.rot.y)) > 0) {
this->actor.world.rot.y -= 0x2000;
} else {
@@ -469,12 +470,12 @@ void func_80897D48(EnPeehat* this, PlayState* play) {
Vec3f sp34;
Math_StepToF(&this->actor.shape.yOffset, -1000.0f, 50.0f);
- Math_StepToF(&this->actor.speedXZ, 0.0f, 1.0f);
+ Math_StepToF(&this->actor.speed, 0.0f, 1.0f);
Math_ScaledStepToS(&this->actor.shape.rot.x, 0, 50);
if (SkelAnime_Update(&this->skelAnime)) {
func_80897498(this);
this->actor.world.pos.y = this->actor.floorHeight;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PIHAT_LAND);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PIHAT_LAND);
} else if (this->actor.floorHeight < this->actor.world.pos.y) {
Math_SmoothStepToF(&this->actor.world.pos.y, this->actor.floorHeight, 0.3f, 3.5f, 0.25f);
if ((this->actor.world.pos.y - this->actor.floorHeight) < 60.0f) {
@@ -490,7 +491,7 @@ void func_80897D48(EnPeehat* this, PlayState* play) {
void func_80897EAC(EnPeehat* this) {
Animation_PlayLoop(&this->skelAnime, &object_ph_Anim_0005C4);
- this->actor.speedXZ = Rand_ZeroFloat(0.5f) + 2.5f;
+ this->actor.speed = Rand_ZeroFloat(0.5f) + 2.5f;
this->unk_2B0 = Rand_ZeroFloat(10.0f) + 10.0f;
this->colliderTris.base.atFlags |= AT_ON;
this->colliderSphere.base.acFlags |= AC_ON;
@@ -506,15 +507,15 @@ 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--;
if (this->unk_2B0 <= 0) {
- this->actor.speedXZ = Rand_ZeroFloat(0.5f) + 2.5f;
+ 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);
@@ -531,12 +532,12 @@ void func_80897F44(EnPeehat* this, PlayState* play) {
Math_ScaledStepToS(&this->unk_2B2, 4000, 500);
this->unk_2B4 += this->unk_2B2;
Math_StepToF(&this->unk_2C4, 0.075f, 0.005f);
- func_800B9010(&this->actor, NA_SE_EN_PIHAT_FLY - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_PIHAT_FLY - SFX_FLAG);
}
void func_80898124(EnPeehat* this) {
this->actionFunc = func_80898144;
- this->actor.speedXZ = 2.5f;
+ this->actor.speed = 2.5f;
}
void func_80898144(EnPeehat* this, PlayState* play) {
@@ -549,10 +550,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);
@@ -569,12 +570,12 @@ void func_80898144(EnPeehat* this, PlayState* play) {
if (!gSaveContext.save.isNight && (Math_Vec3f_DistXZ(&this->actor.home.pos, &player->actor.world.pos) < 1200.0f)) {
func_80897864(this);
}
- func_800B9010(&this->actor, NA_SE_EN_PIHAT_FLY - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_PIHAT_FLY - SFX_FLAG);
}
void func_808982E0(EnPeehat* this) {
Animation_MorphToPlayOnce(&this->skelAnime, &object_ph_Anim_000844, -4.0f);
- this->actor.speedXZ = -9.0f;
+ this->actor.speed = -9.0f;
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
this->actionFunc = func_80898338;
}
@@ -583,7 +584,7 @@ void func_80898338(EnPeehat* this, PlayState* play) {
this->unk_2B4 += this->unk_2B2;
SkelAnime_Update(&this->skelAnime);
- if (Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f)) {
+ if (Math_StepToF(&this->actor.speed, 0.0f, 0.5f)) {
if (this->actor.params != 0) {
func_800B3030(play, &this->actor.world.pos, &gZeroVec3f, &gZeroVec3f, 40, 7, 0);
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 30, NA_SE_EN_EXTINCT);
@@ -593,13 +594,13 @@ void func_80898338(EnPeehat* this, PlayState* play) {
func_80897864(this);
}
}
- func_800B9010(&this->actor, NA_SE_EN_PIHAT_FLY - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_PIHAT_FLY - SFX_FLAG);
}
void func_80898414(EnPeehat* this) {
func_800BE568(&this->actor, &this->colliderSphere);
this->unk_2B2 = 0;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = func_80898454;
}
@@ -622,11 +623,11 @@ void func_80898454(EnPeehat* this, PlayState* play) {
void func_808984E0(EnPeehat* this) {
Animation_MorphToPlayOnce(&this->skelAnime, &object_ph_Anim_000844, -4.0f);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PIHAT_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PIHAT_DAMAGE);
this->unk_2B2 = 4000;
this->unk_2B0 = 14;
- this->actor.speedXZ = 10.0f;
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 14);
+ this->actor.speed = 10.0f;
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 14);
this->colliderSphere.base.acFlags &= ~AC_ON;
this->unk_2C4 = 0.0f;
if (this->actor.colChkInfo.health == 0) {
@@ -640,7 +641,7 @@ void func_80898594(EnPeehat* this, PlayState* play) {
this->unk_2B4 += this->unk_2B2;
Math_ScaledStepToS(&this->unk_2B2, 4000, 250);
Math_StepToF(&this->actor.world.pos.y, this->actor.floorHeight + 88.5f, 3.0f);
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f);
+ Math_StepToF(&this->actor.speed, 0.0f, 0.5f);
this->unk_2B0--;
if (this->unk_2B0 <= 0) {
if (this->actor.colChkInfo.health == 0) {
@@ -660,8 +661,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;
@@ -697,16 +699,16 @@ void func_8089874C(EnPeehat* this, PlayState* play) {
if (this->actor.colChkInfo.damageEffect == 5) {
this->unk_2B0 = 40;
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 40);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
this->drawDmgEffScale = 1.1f;
this->drawDmgEffAlpha = 2.0f;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_LARGE;
func_80898414(this);
} else if (this->actor.colChkInfo.damageEffect == 1) {
this->unk_2B0 = 40;
- Actor_SetColorFilter(&this->actor, 0, 200, 0, 40);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 200, COLORFILTER_BUFFLAG_OPA, 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
func_80898414(this);
} else if (this->actor.colChkInfo.damageEffect == 3) {
func_80897170(this);
@@ -726,7 +728,7 @@ void func_8089874C(EnPeehat* this, PlayState* play) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_LIGHT_ORBS;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->colliderSphere.info.bumper.hitPos.x,
this->colliderSphere.info.bumper.hitPos.y, this->colliderSphere.info.bumper.hitPos.z, 0,
- 0, 0, CLEAR_TAG_LARGE_LIGHT_RAYS);
+ 0, 0, CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
}
func_800BE568(&this->actor, &this->colliderSphere);
func_808984E0(this);
@@ -750,7 +752,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);
@@ -826,7 +828,7 @@ void EnPeehat_Update(Actor* thisx, PlayState* play2) {
this->drawDmgEffScale = CLAMP_MAX(this->drawDmgEffScale, 1.1f);
}
} else if (!Math_StepToF(&this->drawDmgEffFrozenSteamScale, 1.1f, 0.0275f)) {
- func_800B9010(thisx, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(thisx, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
}
}
@@ -864,25 +866,50 @@ s32 EnPeehat_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f
return false;
}
+static Vec3f D_80899570[] = {
+ { 1300.0f, 1200.0f, 0.0f }, // PEEHAT_BODYPART_12
+ { 1300.0f, -1200.0f, 0.0f }, // PEEHAT_BODYPART_13
+ { 1300.0f, 0.0f, 1200.0f }, // PEEHAT_BODYPART_14
+ { 1300.0f, 0.0f, -1200.0f }, // PEEHAT_BODYPART_15
+};
+
+static s8 sLimbToBodyParts[OBJECT_PH_LIMB_MAX] = {
+ BODYPART_NONE, // OBJECT_PH_LIMB_NONE
+ BODYPART_NONE, // OBJECT_PH_LIMB_01
+ BODYPART_NONE, // OBJECT_PH_LIMB_02
+ BODYPART_NONE, // OBJECT_PH_LIMB_03
+ BODYPART_NONE, // OBJECT_PH_LIMB_04
+ BODYPART_NONE, // OBJECT_PH_LIMB_05
+ BODYPART_NONE, // OBJECT_PH_LIMB_06
+ PEEHAT_BODYPART_0, // OBJECT_PH_LIMB_07
+ BODYPART_NONE, // OBJECT_PH_LIMB_08
+ BODYPART_NONE, // OBJECT_PH_LIMB_09
+ PEEHAT_BODYPART_2, // OBJECT_PH_LIMB_0A
+ BODYPART_NONE, // OBJECT_PH_LIMB_0B
+ BODYPART_NONE, // OBJECT_PH_LIMB_0C
+ PEEHAT_BODYPART_4, // OBJECT_PH_LIMB_0D
+ BODYPART_NONE, // OBJECT_PH_LIMB_0E
+ BODYPART_NONE, // OBJECT_PH_LIMB_0F
+ PEEHAT_BODYPART_6, // OBJECT_PH_LIMB_10
+ BODYPART_NONE, // OBJECT_PH_LIMB_11
+ BODYPART_NONE, // OBJECT_PH_LIMB_12
+ PEEHAT_BODYPART_8, // OBJECT_PH_LIMB_13
+ BODYPART_NONE, // OBJECT_PH_LIMB_14
+ BODYPART_NONE, // OBJECT_PH_LIMB_15
+ PEEHAT_BODYPART_10, // OBJECT_PH_LIMB_16
+ BODYPART_NONE, // OBJECT_PH_LIMB_17
+};
+
void EnPeehat_PostLimbDraw(PlayState* play2, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
- static Vec3f D_80899570[] = {
- { 1300.0f, 1200.0f, 0.0f },
- { 1300.0f, -1200.0f, 0.0f },
- { 1300.0f, 0.0f, 1200.0f },
- { 1300.0f, 0.0f, -1200.0f },
- };
- static s8 D_808995A0[] = {
- -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 2, -1, -1, 4, -1, -1, 6, -1, -1, 8, -1, -1, 10, -1,
- };
PlayState* play = play2;
EnPeehat* this = THIS;
s32 i;
- s32 index = D_808995A0[limbIndex];
+ s32 bodyPartIndex = sLimbToBodyParts[limbIndex];
Gfx* gfx;
- if (index != -1) {
- Matrix_MultVecX(2000.0f, &this->limbPos[index]);
- Matrix_MultVecX(4000.0f, &this->limbPos[index + 1]);
+ if (bodyPartIndex != BODYPART_NONE) {
+ Matrix_MultVecX(2000.0f, &this->bodyPartsPos[bodyPartIndex]);
+ Matrix_MultVecX(4000.0f, &this->bodyPartsPos[bodyPartIndex + 1]);
}
if (limbIndex == 4) {
@@ -890,16 +917,17 @@ void EnPeehat_PostLimbDraw(PlayState* play2, s32 limbIndex, Gfx** dList, Vec3s*
Matrix_MultVecZ(-5500.0f, &this->unk_2D4[1]);
} else if ((limbIndex == 3) && (thisx->params == 0)) {
Vec3f* vec = &D_80899570[0];
- Vec3f* vec2 = &this->limbPos[12];
+ Vec3f* bodyPartPosPtr = &this->bodyPartsPos[PEEHAT_BODYPART_12];
- for (i = 0; i < ARRAY_COUNT(D_80899570); i++, vec++, vec2++) {
- Matrix_MultVec3f(vec, vec2);
+ for (i = 0; i < ARRAY_COUNT(D_80899570); i++, vec++, bodyPartPosPtr++) {
+ Matrix_MultVec3f(vec, bodyPartPosPtr);
}
- Matrix_MultVecX(3000.0f, vec2++);
- Matrix_MultVecX(-400.0f, vec2);
+ Matrix_MultVecX(3000.0f, bodyPartPosPtr++); // PEEHAT_BODYPART_16
+ Matrix_MultVecX(-400.0f, bodyPartPosPtr); // PEEHAT_BODYPART_17
OPEN_DISPS(play->state.gfxCtx);
+
gfx = POLY_OPA_DISP;
Matrix_Translate(-1000.0f, 0.0f, 0.0f, MTXMODE_APPLY);
@@ -925,12 +953,12 @@ 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);
- if ((this->actor.speedXZ != 0.0f) || (this->actor.velocity.y != 0.0f)) {
+ if ((this->actor.speed != 0.0f) || (this->actor.velocity.y != 0.0f)) {
Matrix_MultVecZ(4500.0f, &sp40);
Matrix_MultVecZ(-4500.0f, &sp4C);
Matrix_MultVecX(4500.0f, &sp58);
@@ -940,11 +968,11 @@ void EnPeehat_Draw(Actor* thisx, PlayState* play) {
}
if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FIRE) {
- for (i = 0; i < ARRAY_COUNT(this->limbPos); i++) {
- this->limbPos[i].y -= 50.0f;
+ for (i = 0; i < PEEHAT_BODYPART_MAX; i++) {
+ this->bodyPartsPos[i].y -= 50.0f;
}
}
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), this->drawDmgEffScale,
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, PEEHAT_BODYPART_MAX, this->drawDmgEffScale,
this->drawDmgEffFrozenSteamScale, this->drawDmgEffAlpha, this->drawDmgEffType);
}
diff --git a/src/overlays/actors/ovl_En_Peehat/z_en_peehat.h b/src/overlays/actors/ovl_En_Peehat/z_en_peehat.h
index 248599c63..c5ff88b65 100644
--- a/src/overlays/actors/ovl_En_Peehat/z_en_peehat.h
+++ b/src/overlays/actors/ovl_En_Peehat/z_en_peehat.h
@@ -7,6 +7,28 @@ struct EnPeehat;
typedef void (*EnPeehatActionFunc)(struct EnPeehat*, PlayState*);
+typedef enum PeehatBodyPart {
+ /* 0 */ PEEHAT_BODYPART_0,
+ /* 1 */ PEEHAT_BODYPART_1,
+ /* 2 */ PEEHAT_BODYPART_2,
+ /* 3 */ PEEHAT_BODYPART_3,
+ /* 4 */ PEEHAT_BODYPART_4,
+ /* 5 */ PEEHAT_BODYPART_5,
+ /* 6 */ PEEHAT_BODYPART_6,
+ /* 7 */ PEEHAT_BODYPART_7,
+ /* 8 */ PEEHAT_BODYPART_8,
+ /* 9 */ PEEHAT_BODYPART_9,
+ /* 10 */ PEEHAT_BODYPART_10,
+ /* 11 */ PEEHAT_BODYPART_11,
+ /* 12 */ PEEHAT_BODYPART_12,
+ /* 13 */ PEEHAT_BODYPART_13,
+ /* 14 */ PEEHAT_BODYPART_14,
+ /* 15 */ PEEHAT_BODYPART_15,
+ /* 16 */ PEEHAT_BODYPART_16,
+ /* 17 */ PEEHAT_BODYPART_17,
+ /* 18 */ PEEHAT_BODYPART_MAX
+} PeehatBodyPart;
+
typedef struct EnPeehat {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
@@ -28,7 +50,7 @@ typedef struct EnPeehat {
/* 0x2CC */ f32 drawDmgEffScale;
/* 0x2D0 */ f32 drawDmgEffFrozenSteamScale;
/* 0x2D4 */ Vec3f unk_2D4[2];
- /* 0x2EC */ Vec3f limbPos[18];
+ /* 0x2EC */ Vec3f bodyPartsPos[PEEHAT_BODYPART_MAX];
/* 0x3C4 */ ColliderCylinder colliderCylinder;
/* 0x410 */ ColliderSphere colliderSphere;
/* 0x468 */ ColliderTris colliderTris;
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 c2846a26b..ab80d3d57 100644
--- a/src/overlays/actors/ovl_En_Pm/z_en_pm.c
+++ b/src/overlays/actors/ovl_En_Pm/z_en_pm.c
@@ -8,7 +8,7 @@
#include "overlays/actors/ovl_En_Door/z_en_door.h"
#include "objects/object_mm/object_mm.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((EnPm*)thisx)
@@ -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;
@@ -997,8 +999,9 @@ UNK_TYPE* func_80AF8540(EnPm* this, PlayState* play) {
s32 func_80AF86F0(EnPm* this, PlayState* play) {
s32 ret = false;
- if ((this->unk_356 & 7) && Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- SubS_UpdateFlags(&this->unk_356, 0, 7);
+ if (((this->unk_356 & SUBS_OFFER_MODE_MASK) != SUBS_OFFER_MODE_NONE) &&
+ Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ SubS_SetOfferMode(&this->unk_356, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
this->unk_398 = 0;
this->unk_378 = 0;
this->unk_37C = NULL;
@@ -1017,20 +1020,20 @@ 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);
this->unk_258 = 255;
this->unk_380 = true;
- this->actor.speedXZ = 4.0f;
+ this->actor.speed = 4.0f;
this->actor.gravity = -1.0f;
}
ret = true;
} else if (this->unk_380) {
this->unk_258 = 0;
this->unk_380 = false;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
return ret;
}
@@ -1073,7 +1076,7 @@ void func_80AF898C(EnPm* this) {
this->unk_372 = CLAMP(this->unk_372, -0x1FFE, 0x1FFE);
Math_Vec3f_Copy(&sp34, &this->actor.focus.pos);
if (this->unk_268->id == ACTOR_PLAYER) {
- sp40.y = ((Player*)this->unk_268)->bodyPartsPos[7].y + 3.0f;
+ sp40.y = ((Player*)this->unk_268)->bodyPartsPos[PLAYER_BODYPART_HEAD].y + 3.0f;
} else {
Math_Vec3f_Copy(&sp40, &this->unk_268->focus.pos);
}
@@ -1103,7 +1106,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 +1202,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 +1213,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 +1233,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 +1244,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 +1256,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 {
@@ -1258,7 +1265,7 @@ s32 func_80AF9008(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->unk_36C = scheduleOutput->time1 - scheduleOutput->time0;
this->unk_36E = sp56 - scheduleOutput->time0;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_90_08)) {
this->unk_356 |= 0x800;
}
@@ -1275,7 +1282,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 +1290,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)) {
@@ -1311,7 +1318,7 @@ s32 func_80AF91E8(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->unk_356 &= ~8;
this->unk_356 &= ~0x10;
if (this->unk_258 == 27) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_ROOM_CARTAIN);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_ROOM_CARTAIN);
Flags_UnsetSwitch(play, 0);
}
@@ -1337,7 +1344,7 @@ s32 func_80AF91E8(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
break;
default:
- SubS_UpdateFlags(&this->unk_356, 3, 7);
+ SubS_SetOfferMode(&this->unk_356, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
func_80AF7E98(this, 0);
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_90_08)) {
this->unk_356 |= 0x800;
@@ -1355,7 +1362,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 +1371,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 +1395,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 +1424,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)) {
@@ -1431,10 +1438,10 @@ s32 func_80AF95E8(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
switch (scheduleOutput->result) {
case 27:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_ROOM_CARTAIN);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_ROOM_CARTAIN);
Flags_SetSwitch(play, 0);
this->unk_36C = 20;
- SubS_UpdateFlags(&this->unk_356, 3, 7);
+ SubS_SetOfferMode(&this->unk_356, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
func_80AF7E98(this, 3);
break;
@@ -1464,7 +1471,7 @@ s32 func_80AF95E8(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
if (scheduleOutput->result == 29) {
this->actor.world.rot.y = BINANG_ROT180(this->actor.world.rot.y);
}
- SubS_UpdateFlags(&this->unk_356, 3, 7);
+ SubS_SetOfferMode(&this->unk_356, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_356 |= 0x9000;
func_80AF7E98(this, 3);
break;
@@ -1493,8 +1500,8 @@ s32 func_80AF992C(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
Math_Vec3f_Copy(&this->actor.world.pos, &D_80AFB8EC);
Math_Vec3s_Copy(&this->actor.world.rot, &D_80AFB8F8);
Math_Vec3s_Copy(&this->actor.shape.rot, &this->actor.world.rot);
- SubS_UpdateFlags(&this->unk_356, 3, 7);
- this->actor.targetMode = 6;
+ SubS_SetOfferMode(&this->unk_356, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
+ this->actor.targetMode = TARGET_MODE_6;
this->actor.gravity = -1.0f;
this->unk_368 = 80.0f;
if (scheduleOutput->result == 14) {
@@ -1511,7 +1518,7 @@ s32 func_80AF9A0C(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret = false;
if (func_80AF8ED4(this, play, scheduleOutput, ACTORCAT_NPC, ACTOR_EN_AN)) {
- SubS_UpdateFlags(&this->unk_356, 3, 7);
+ SubS_SetOfferMode(&this->unk_356, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_356 |= 0x20;
this->unk_356 |= 0x9000;
if (this->unk_258 != 0) {
@@ -1529,7 +1536,7 @@ s32 func_80AF9AB0(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret = false;
if (func_80AF8ED4(this, play, scheduleOutput, ACTORCAT_NPC, ACTOR_EN_TEST3)) {
- SubS_UpdateFlags(&this->unk_356, 3, 7);
+ SubS_SetOfferMode(&this->unk_356, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_356 |= 0x20;
this->unk_356 |= 0x9000;
if (this->unk_258 != 0) {
@@ -1547,7 +1554,7 @@ s32 func_80AF9B54(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret = false;
if (func_80AF8ED4(this, play, scheduleOutput, ACTORCAT_NPC, ACTOR_EN_AL)) {
- SubS_UpdateFlags(&this->unk_356, 3, 7);
+ SubS_SetOfferMode(&this->unk_356, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_356 |= 0x9000;
this->unk_356 |= 0x20;
if (this->unk_258 != 0) {
@@ -1564,8 +1571,8 @@ s32 func_80AF9B54(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 func_80AF9BF8(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret;
- this->actor.flags |= ACTOR_FLAG_1;
- this->actor.targetMode = 0;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
+ this->actor.targetMode = TARGET_MODE_0;
this->unk_394 = PLAYER_IA_NONE;
this->unk_356 = 0;
this->unk_368 = 40.0f;
@@ -1702,7 +1709,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 {
@@ -1717,7 +1724,7 @@ s32 func_80AF9D04(EnPm* this, PlayState* play) {
Lib_Vec3f_TranslateAndRotateY(&this->unk_26C, this->actor.world.rot.y, &sp38, &this->actor.world.pos);
this->unk_36E += this->timePathTimeSpeed;
if (Animation_OnFrame(&this->skelAnime, 3.0f) || Animation_OnFrame(&this->skelAnime, 8.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_POSTMAN_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_POSTMAN_WALK);
}
}
return false;
@@ -1774,7 +1781,7 @@ s32 func_80AF9E7C(EnPm* this, PlayState* play) {
this->timePathTargetPos = timePathTargetPos;
} else if ((this->unk_258 != 91) &&
(Animation_OnFrame(&this->skelAnime, 3.0f) || Animation_OnFrame(&this->skelAnime, 8.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_POSTMAN_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_POSTMAN_WALK);
}
if ((this->unk_356 & 0x10) && (this->unk_258 == 90)) {
@@ -1820,7 +1827,7 @@ s32 func_80AFA170(EnPm* this, PlayState* play) {
}
if ((this->unk_384 == 11) && Animation_OnFrame(&this->skelAnime, 8.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_POSTMACHINE_HIT_OPEN);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_POSTMACHINE_HIT_OPEN);
}
if (this->unk_258 == 19) {
@@ -1848,9 +1855,9 @@ s32 func_80AFA334(EnPm* this, PlayState* play) {
case 24:
temp_v0 = this->actor.yawTowardsPlayer - this->actor.shape.rot.y;
if (ABS_ALT(temp_v0) < 0x4000) {
- SubS_UpdateFlags(&this->unk_356, 3, 7);
+ SubS_SetOfferMode(&this->unk_356, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
} else {
- SubS_UpdateFlags(&this->unk_356, 0, 7);
+ SubS_SetOfferMode(&this->unk_356, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
}
break;
@@ -1865,7 +1872,7 @@ s32 func_80AFA334(EnPm* this, PlayState* play) {
case 21:
case 22:
if (Animation_OnFrame(&this->skelAnime, 0.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_VO_NP_SLEEP_OUT);
+ Actor_PlaySfx(&this->actor, NA_SE_VO_NP_SLEEP_OUT);
}
break;
@@ -1997,11 +2004,11 @@ void func_80AFA4D0(EnPm* this, PlayState* play) {
if (!Schedule_RunScript(play, D_80AFB900[this->unk_38C], &sp2C) ||
((this->unk_258 != sp2C.result) && !func_80AF9BF8(this, play, &sp2C))) {
this->actor.shape.shadowDraw = NULL;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
sp2C.result = 0;
} else {
this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}
this->unk_258 = sp2C.result;
@@ -2018,7 +2025,7 @@ void func_80AFA5FC(EnPm* this, PlayState* play) {
Vec3f sp2C;
if (func_8010BF58(&this->actor, play, this->unk_25C, this->unk_37C, &this->unk_264)) {
- SubS_UpdateFlags(&this->unk_356, 3, 7);
+ SubS_SetOfferMode(&this->unk_356, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_356 &= ~0x20;
this->unk_356 |= 0x200;
this->actor.child = NULL;
@@ -2042,9 +2049,9 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_EV_POSTMAN_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_POSTMAN_WALK);
}
}
@@ -2087,9 +2094,9 @@ void EnPm_Update(Actor* thisx, PlayState* play) {
func_80AF8DD4(this, play);
func_80AF7E6C(this);
func_80AF8AC8(this);
- func_8013C964(&this->actor, play, this->unk_368, 30.0f, this->unk_394, this->unk_356 & 7);
+ SubS_Offer(&this->actor, play, this->unk_368, 30.0f, this->unk_394, this->unk_356 & SUBS_OFFER_MODE_MASK);
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 +2119,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 +2186,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_Composer/z_en_po_composer.c b/src/overlays/actors/ovl_En_Po_Composer/z_en_po_composer.c
index 6d14ca25a..0772249ba 100644
--- a/src/overlays/actors/ovl_En_Po_Composer/z_en_po_composer.c
+++ b/src/overlays/actors/ovl_En_Po_Composer/z_en_po_composer.c
@@ -6,7 +6,7 @@
#include "z_en_po_composer.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_100000 | ACTOR_FLAG_2000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_100000 | ACTOR_FLAG_2000000)
#define THIS ((EnPoComposer*)thisx)
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 a9fcf95e3..d5174f66a 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
@@ -5,8 +5,8 @@
*/
#include "z_en_po_fusen.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "overlays/actors/ovl_En_Ma4/z_en_ma4.h"
-#include "objects/object_po_fusen/object_po_fusen.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_100000 | ACTOR_FLAG_80000000)
@@ -17,7 +17,7 @@ void EnPoFusen_Destroy(Actor* thisx, PlayState* play);
void EnPoFusen_Update(Actor* thisx, PlayState* play);
void EnPoFusen_Draw(Actor* thisx, PlayState* play);
-u16 EnPoFusen_CheckParent(EnPoFusen* this, PlayState* play);
+s32 EnPoFusen_CheckParent(EnPoFusen* this, PlayState* play);
void EnPoFusen_InitNoFuse(EnPoFusen* this);
void EnPoFusen_InitFuse(EnPoFusen* this);
void EnPoFusen_Pop(EnPoFusen* this, PlayState* play);
@@ -57,84 +57,87 @@ static ColliderSphereInit sSphereInit = {
{ 0, { { 0, 0, 0 }, 200 }, 100 },
};
+typedef enum {
+ /* 0x0 */ POE_BALLOON_DMGEFF_NONE,
+ /* 0xF */ POE_BALLOON_DMGEFF_POP = 0xF
+} PoeBalloonDamageEffect;
+
static DamageTable sDamageTable = {
- /* Deku Nut */ DMG_ENTRY(0, 0x0),
- /* Deku Stick */ DMG_ENTRY(0, 0x0),
- /* Horse trample */ DMG_ENTRY(0, 0x0),
- /* Explosives */ DMG_ENTRY(0, 0x0),
- /* Zora boomerang */ DMG_ENTRY(0, 0x0),
- /* Normal arrow */ DMG_ENTRY(1, 0xF),
- /* UNK_DMG_0x06 */ DMG_ENTRY(0, 0x0),
- /* Hookshot */ DMG_ENTRY(0, 0x0),
- /* Goron punch */ DMG_ENTRY(0, 0x0),
- /* Sword */ DMG_ENTRY(0, 0x0),
- /* Goron pound */ DMG_ENTRY(0, 0x0),
- /* Fire arrow */ DMG_ENTRY(1, 0xF),
- /* Ice arrow */ DMG_ENTRY(1, 0xF),
- /* Light arrow */ DMG_ENTRY(1, 0xF),
- /* Goron spikes */ DMG_ENTRY(1, 0xF),
- /* Deku spin */ DMG_ENTRY(0, 0x0),
- /* Deku bubble */ DMG_ENTRY(0, 0x0),
- /* Deku launch */ DMG_ENTRY(0, 0x0),
- /* UNK_DMG_0x12 */ DMG_ENTRY(0, 0x0),
- /* Zora barrier */ DMG_ENTRY(0, 0x0),
- /* Normal shield */ DMG_ENTRY(0, 0x0),
- /* Light ray */ DMG_ENTRY(0, 0x0),
- /* Thrown object */ DMG_ENTRY(0, 0x0),
- /* Zora punch */ DMG_ENTRY(0, 0x0),
- /* Spin attack */ DMG_ENTRY(0, 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(0, 0x0),
+ /* Deku Nut */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* Deku Stick */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* Horse trample */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* Explosives */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* Zora boomerang */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* Normal arrow */ DMG_ENTRY(1, POE_BALLOON_DMGEFF_POP),
+ /* UNK_DMG_0x06 */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* Hookshot */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* Goron punch */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* Sword */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* Goron pound */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* Fire arrow */ DMG_ENTRY(1, POE_BALLOON_DMGEFF_POP),
+ /* Ice arrow */ DMG_ENTRY(1, POE_BALLOON_DMGEFF_POP),
+ /* Light arrow */ DMG_ENTRY(1, POE_BALLOON_DMGEFF_POP),
+ /* Goron spikes */ DMG_ENTRY(1, POE_BALLOON_DMGEFF_POP),
+ /* Deku spin */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* Deku bubble */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* Deku launch */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* UNK_DMG_0x12 */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* Zora barrier */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* Normal shield */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* Light ray */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* Thrown object */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* Zora punch */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* Spin attack */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* Sword beam */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* Normal Roll */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* UNK_DMG_0x1B */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* UNK_DMG_0x1C */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* Unblockable */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* UNK_DMG_0x1E */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
+ /* Powder Keg */ DMG_ENTRY(0, POE_BALLOON_DMGEFF_NONE),
};
void EnPoFusen_Init(Actor* thisx, PlayState* play) {
EnPoFusen* this = THIS;
- f32 heightTemp;
+ f32 flyingHeightMin;
this->actor.scale.x = this->actor.scale.y = this->actor.scale.z = 0.007f;
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
this->actor.colChkInfo.damageTable = &sDamageTable;
Collider_InitSphere(play, &this->collider);
Collider_SetSphere(play, &this->collider, &this->actor, &sSphereInit);
- if (0) {}
this->collider.dim.worldSphere.radius = 40;
- SkelAnime_InitFlex(play, &this->anime, &object_po_fusen_Skel_0024F0, &object_po_fusen_Anim_000040, this->jointTable,
- this->morphTable, 10);
+ 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);
}
- heightTemp = this->actor.floorHeight + 90.0f;
- if (this->actor.home.pos.y < heightTemp) {
- this->actor.home.pos.y = heightTemp;
+ flyingHeightMin = this->actor.floorHeight + 90.0f;
+ if (this->actor.home.pos.y < flyingHeightMin) {
+ this->actor.home.pos.y = flyingHeightMin;
}
this->randScaleChange = (Rand_Next() % 0xFFFE) - 0x7FFF;
this->randYRotChange = (Rand_Next() % 0x4B0) - 0x258;
this->avgBaseRotation = 0x10000 / 12;
- this->limb3Rot = 0;
+ this->limbRotYRightUpperArm = 0;
this->limb46Rot = 0;
this->limb57Rot = 0;
- this->limb8Rot = 0;
- this->limb9Rot = 0x71C;
+ this->limbRotLeftHand = 0;
+ this->limbRotChainAndLantern = 0x71C;
this->randBaseRotChange = 0;
- if (ENPOFUSEN_IS_FUSE_TYPE(&this->actor)) {
+ if (POE_BALLOON_IS_FUSE_TYPE(&this->actor)) {
EnPoFusen_InitFuse(this);
- return;
+ } else {
+ EnPoFusen_InitNoFuse(this);
}
-
- EnPoFusen_InitNoFuse(this);
}
void EnPoFusen_Destroy(Actor* thisx, PlayState* play) {
@@ -143,26 +146,28 @@ void EnPoFusen_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroySphere(play, &this->collider);
}
-u16 EnPoFusen_CheckParent(EnPoFusen* this, PlayState* play) {
- Actor* actorPtr;
+/**
+ * Search for Romani's actor, beacuse it's PoFusen's job to update her actor when the balloon is popped.
+ */
+s32 EnPoFusen_CheckParent(EnPoFusen* this, PlayState* play) {
+ Actor* actorIter = play->actorCtx.actorLists[ACTORCAT_NPC].first;
- actorPtr = play->actorCtx.actorLists[ACTORCAT_NPC].first;
- if (ENPOFUSEN_IS_FUSE_TYPE(&this->actor)) {
+ if (POE_BALLOON_IS_FUSE_TYPE(&this->actor)) {
return true;
}
- while (actorPtr != NULL) {
- if (actorPtr->id == ACTOR_EN_MA4) {
- this->actor.parent = actorPtr;
+ while (actorIter != NULL) {
+ if (actorIter->id == ACTOR_EN_MA4) {
+ this->actor.parent = actorIter;
return true;
}
- actorPtr = actorPtr->next;
+ actorIter = actorIter->next;
}
return false;
}
-u16 EnPoFusen_CheckCollision(EnPoFusen* this, PlayState* play) {
+s32 EnPoFusen_CheckCollision(EnPoFusen* this, PlayState* play) {
if (this->actionFunc == EnPoFusen_IdleFuse) {
return false;
}
@@ -171,7 +176,7 @@ u16 EnPoFusen_CheckCollision(EnPoFusen* this, PlayState* play) {
this->collider.dim.worldSphere.center.y = this->actor.world.pos.y + 20.0f;
this->collider.dim.worldSphere.center.z = this->actor.world.pos.z;
- if ((this->collider.base.acFlags & AC_HIT) && (this->actor.colChkInfo.damageEffect == 0xF)) {
+ if ((this->collider.base.acFlags & AC_HIT) && (this->actor.colChkInfo.damageEffect == POE_BALLOON_DMGEFF_POP)) {
this->collider.base.acFlags &= ~AC_HIT;
return true;
}
@@ -191,7 +196,6 @@ void EnPoFusen_Idle(EnPoFusen* this, PlayState* play) {
f32 shadowScaleTmp;
f32 shadowAlphaTmp;
f32 heightOffset;
- f32 f255 = 255.0f;
this->actor.world.pos = this->actor.home.pos;
this->randScaleChange += 0x190;
@@ -203,30 +207,30 @@ void EnPoFusen_Idle(EnPoFusen* this, PlayState* play) {
this->actor.world.pos.y += heightOffset;
this->actor.shape.rot.z = (Math_SinS(this->randBaseRotChange) * 910.0f);
- if ((this->randScaleChange < 0x4000) && (this->randScaleChange >= -0x3FFF)) {
- Math_SmoothStepToS(&this->limb9Rot, 0x38E, 0x14, 0xBB8, 0x64);
+ if ((this->randScaleChange < 0x4000) && (this->randScaleChange > -0x4000)) {
+ Math_SmoothStepToS(&this->limbRotChainAndLantern, 0x38E, 0x14, 0xBB8, 0x64);
} else {
- Math_SmoothStepToS(&this->limb9Rot, 0x71C, 0x8, 0xBB8, 0x64);
+ Math_SmoothStepToS(&this->limbRotChainAndLantern, 0x71C, 0x8, 0xBB8, 0x64);
}
- this->avgBaseRotation = this->limb9Rot * 3;
- this->limb3Rot = (Math_SinS(this->randBaseRotChange + 0x38E3) * this->avgBaseRotation);
+ this->avgBaseRotation = this->limbRotChainAndLantern * 3;
+ this->limbRotYRightUpperArm = (Math_SinS(this->randBaseRotChange + 0x38E3) * this->avgBaseRotation);
this->limb46Rot = (Math_SinS(this->randBaseRotChange) * this->avgBaseRotation);
this->limb57Rot = (Math_SinS(this->randBaseRotChange - 0x38E3) * this->avgBaseRotation);
- this->limb8Rot = (Math_SinS(this->randBaseRotChange - 0x71C6) * this->avgBaseRotation);
+ this->limbRotLeftHand = (Math_SinS(this->randBaseRotChange - 0x71C6) * this->avgBaseRotation);
shadowScaleTmp = ((1.0f - Math_SinS(this->randScaleChange)) * 10.0f) + 50.0f;
shadowAlphaTmp = ((1.0f - Math_SinS(this->randScaleChange)) * 75.0f) + 100.0f;
this->actor.shape.shadowScale = shadowScaleTmp;
- this->actor.shape.shadowAlpha = (shadowAlphaTmp > f255) ? (u8)f255 : (u8)shadowAlphaTmp;
+ this->actor.shape.shadowAlpha = CLAMP_MAX(shadowAlphaTmp, 255.0f);
}
void EnPoFusen_IncrementRomaniPop(EnPoFusen* this) {
Actor* parent = this->actor.parent;
- EnMa4* romani;
if ((parent != NULL) && (parent->id == ACTOR_EN_MA4)) {
- romani = (EnMa4*)parent;
+ EnMa4* romani = (EnMa4*)parent;
+
romani->poppedBalloonCounter++;
}
@@ -236,14 +240,15 @@ void EnPoFusen_IncrementRomaniPop(EnPoFusen* this) {
void EnPoFusen_Pop(EnPoFusen* this, PlayState* play) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->actor.world.pos.x, this->actor.world.pos.y + 20.0f,
- this->actor.world.pos.z, 255, 255, 200, CLEAR_TAG_POP);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_BOMB_EXPLOSION);
+ this->actor.world.pos.z, 255, 255, 200, CLEAR_TAG_PARAMS(CLEAR_TAG_POP));
+ Actor_PlaySfx(&this->actor, NA_SE_IT_BOMB_EXPLOSION);
Actor_Kill(&this->actor);
}
void EnPoFusen_InitFuse(EnPoFusen* this) {
s16 rotZ = this->actor.shape.rot.z;
- this->fuse = ENPOFUSEN_GET_FUSE_LEN(&this->actor);
+
+ this->fuse = POE_BALLOON_GET_FUSE_LEN(&this->actor);
this->actor.shape.rot.z = 0;
this->randScaleChange = rotZ & 0xFFFF;
this->actionFunc = EnPoFusen_IdleFuse;
@@ -258,6 +263,7 @@ void EnPoFusen_IdleFuse(EnPoFusen* this, PlayState* play) {
void EnPoFusen_Update(Actor* thisx, PlayState* play) {
EnPoFusen* this = THIS;
+
this->actionFunc(this, play);
if (EnPoFusen_CheckCollision(this, play)) {
EnPoFusen_IncrementRomaniPop(this);
@@ -266,39 +272,38 @@ void EnPoFusen_Update(Actor* thisx, PlayState* play) {
s32 EnPoFusen_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnPoFusen* this = THIS;
- f32 zScale;
- f32 yScale;
- f32 xScale;
- s16 pad;
- s16 zRot;
- s16 pad2;
- s16 xRot;
- if (limbIndex == 2) {
- zScale = (Math_CosS(this->randScaleChange) * 0.08f) + 1.0f;
- xScale = zScale;
- if (!zScale) {}
+ if (limbIndex == POE_BALLOON_LIMB_BODY) {
+ f32 zScale = (Math_CosS(this->randScaleChange) * 0.08f) + 1.0f;
+ f32 yScale;
+ f32 xScale = zScale;
+ s16 pad;
+ s16 zRot;
+ s16 pad2;
+ s16 xRot;
+
yScale = (Math_SinS(this->randScaleChange) * 0.08f) + 1.0f;
- yScale = yScale * yScale;
+ yScale = SQ(yScale);
xRot = ((Math_SinS(this->randXZRotChange) * 2730.0f));
zRot = ((Math_CosS(this->randXZRotChange) * 2730.0f));
Matrix_RotateZYX(xRot, 0, zRot, MTXMODE_APPLY);
Matrix_Scale(xScale, yScale, zScale, MTXMODE_APPLY);
Matrix_RotateZS(-zRot, MTXMODE_APPLY);
Matrix_RotateXS(-xRot, MTXMODE_APPLY);
- } else if (limbIndex == 3) {
- rot->y += this->limb3Rot;
- } else if (limbIndex == 6) {
+
+ } else if (limbIndex == POE_BALLOON_RIGHT_UPPER_ARM) {
+ rot->y += this->limbRotYRightUpperArm;
+ } else if (limbIndex == POE_BALLOON_LEFT_UPPER_ARM) {
rot->y += this->limb46Rot;
- } else if (limbIndex == 4) {
+ } else if (limbIndex == POE_BALLOON_RIGHT_FOREARM) {
rot->z += this->limb46Rot;
- } else if ((limbIndex == 5) || (limbIndex == 7)) {
+ } else if ((limbIndex == POE_BALLOON_RIGHT_HAND) || (limbIndex == POE_BALLOON_LEFT_FOREARM)) {
rot->z += this->limb57Rot;
- } else if (limbIndex == 8) {
- rot->z += this->limb8Rot;
- } else if (limbIndex == 9) {
- rot->y += (s16)(this->limb9Rot * Math_SinS(this->randBaseRotChange));
- rot->z += (s16)(this->limb9Rot * Math_CosS(this->randBaseRotChange));
+ } else if (limbIndex == POE_BALLOON_LEFT_HAND) {
+ rot->z += this->limbRotLeftHand;
+ } else if (limbIndex == POE_BALLOON_LIMB_CHAIN_AND_LANTERN) {
+ rot->y += (s16)(this->limbRotChainAndLantern * Math_SinS(this->randBaseRotChange));
+ rot->z += (s16)(this->limbRotChainAndLantern * Math_CosS(this->randBaseRotChange));
}
return false;
}
@@ -311,7 +316,8 @@ 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_Fusen/z_en_po_fusen.h b/src/overlays/actors/ovl_En_Po_Fusen/z_en_po_fusen.h
index 740d65968..506f046d0 100644
--- a/src/overlays/actors/ovl_En_Po_Fusen/z_en_po_fusen.h
+++ b/src/overlays/actors/ovl_En_Po_Fusen/z_en_po_fusen.h
@@ -2,11 +2,13 @@
#define Z_EN_PO_FUSEN_H
#include "global.h"
+#include "objects/object_po_fusen/object_po_fusen.h"
struct EnPoFusen;
-#define ENPOFUSEN_GET_FUSE_LEN(thisx) ((thisx)->params & 0x3FF)
-#define ENPOFUSEN_IS_FUSE_TYPE(thisx) ((thisx)->params & 0x8000)
+// The version used in the credits, where we see romani shoot three in a row, are on timer, this is the fuse length.
+#define POE_BALLOON_GET_FUSE_LEN(thisx) ((thisx)->params & 0x3FF)
+#define POE_BALLOON_IS_FUSE_TYPE(thisx) ((thisx)->params & 0x8000)
typedef void (*EnPoFusenActionFunc)(struct EnPoFusen*, PlayState*);
@@ -15,17 +17,17 @@ typedef struct EnPoFusen {
/* 0x144 */ SkelAnime anime;
/* 0x188 */ EnPoFusenActionFunc actionFunc;
/* 0x18C */ ColliderSphere collider;
- /* 0x1E4 */ Vec3s jointTable[0xA];
- /* 0x220 */ Vec3s morphTable[0xA];
+ /* 0x1E4 */ Vec3s jointTable[POE_BALLOON_LIMB_MAX];
+ /* 0x220 */ Vec3s morphTable[POE_BALLOON_LIMB_MAX];
/* 0x25C */ s16 randScaleChange;
/* 0x25E */ s16 randXZRotChange;
/* 0x260 */ s16 randYRotChange;
/* 0x262 */ s16 avgBaseRotation;
- /* 0x264 */ s16 limb3Rot;
+ /* 0x264 */ s16 limbRotYRightUpperArm;
/* 0x266 */ s16 limb46Rot;
/* 0x268 */ s16 limb57Rot;
- /* 0x26A */ s16 limb8Rot;
- /* 0x26C */ s16 limb9Rot;
+ /* 0x26A */ s16 limbRotLeftHand;
+ /* 0x26C */ s16 limbRotChainAndLantern;
/* 0x26E */ s16 randBaseRotChange;
/* 0x270 */ s16 fuse;
} EnPoFusen; // size = 0x274
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 a89a55d9e..bc0a3610c 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
@@ -5,9 +5,11 @@
*/
#include "z_en_po_sisters.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.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_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_4000)
#define THIS ((EnPoSisters*)thisx)
@@ -97,46 +99,46 @@ static ColliderCylinderInit sCylinderInit = {
static CollisionCheckInfoInit sColChkInfoInit = { 6, 25, 60, 50 };
typedef enum {
- /* 0x0 */ POSISTERS_DAMAGEEFFECT_NOEFFECT,
- /* 0x1 */ POSISTERS_DAMAGEEFFECT_UNKDMG12, // set in DamageTable, but unused
- /* 0x4 */ POSISTERS_DAMAGEEFFECT_LIGHTARROWS = 0x4,
- /* 0xE */ POSISTERS_DAMAGEEFFECT_SPINATTACK = 0xE,
- /* 0xF */ POSISTERS_DAMAGEEFFECT_DEKUNUT = 0xF,
-} PoSisterDamageEffect;
+ /* 0x0 */ POE_SISTERS_DMGEFF_NONE,
+ /* 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
+} PoeSisterDamageEffect;
static DamageTable sDamageTable = {
- /* Deku Nut */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_DEKUNUT),
- /* Deku Stick */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* Horse trample */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* Explosives */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* Zora boomerang */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* Normal arrow */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* UNK_DMG_0x06 */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* Hookshot */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* Goron punch */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* Sword */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* Goron pound */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* Fire arrow */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* Ice arrow */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* Light arrow */ DMG_ENTRY(2, POSISTERS_DAMAGEEFFECT_LIGHTARROWS),
- /* Goron spikes */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* Deku spin */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* Deku bubble */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* Deku launch */ DMG_ENTRY(2, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* UNK_DMG_0x12 */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_UNKDMG12),
- /* Zora barrier */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* Normal shield */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* Light ray */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* Thrown object */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* Zora punch */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* Spin attack */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_SPINATTACK),
- /* Sword beam */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* Normal Roll */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* UNK_DMG_0x1B */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* UNK_DMG_0x1C */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* Unblockable */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* UNK_DMG_0x1E */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_NOEFFECT),
- /* Powder Keg */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* Deku Nut */ DMG_ENTRY(0, POE_SISTERS_DMGEFF_DEKUNUT),
+ /* Deku Stick */ DMG_ENTRY(1, POE_SISTERS_DMGEFF_NONE),
+ /* Horse trample */ DMG_ENTRY(1, POE_SISTERS_DMGEFF_NONE),
+ /* Explosives */ DMG_ENTRY(1, POE_SISTERS_DMGEFF_NONE),
+ /* Zora boomerang */ DMG_ENTRY(1, POE_SISTERS_DMGEFF_NONE),
+ /* Normal arrow */ DMG_ENTRY(1, POE_SISTERS_DMGEFF_NONE),
+ /* UNK_DMG_0x06 */ DMG_ENTRY(0, POE_SISTERS_DMGEFF_NONE),
+ /* Hookshot */ DMG_ENTRY(1, POE_SISTERS_DMGEFF_NONE),
+ /* Goron punch */ DMG_ENTRY(1, POE_SISTERS_DMGEFF_NONE),
+ /* Sword */ DMG_ENTRY(1, POE_SISTERS_DMGEFF_NONE),
+ /* Goron pound */ DMG_ENTRY(0, POE_SISTERS_DMGEFF_NONE),
+ /* Fire arrow */ DMG_ENTRY(1, POE_SISTERS_DMGEFF_NONE),
+ /* Ice arrow */ DMG_ENTRY(1, POE_SISTERS_DMGEFF_NONE),
+ /* Light arrow */ DMG_ENTRY(2, POE_SISTERS_DMGEFF_LIGHTARROWS),
+ /* Goron spikes */ DMG_ENTRY(1, POE_SISTERS_DMGEFF_NONE),
+ /* Deku spin */ DMG_ENTRY(1, POE_SISTERS_DMGEFF_NONE),
+ /* Deku bubble */ DMG_ENTRY(1, POE_SISTERS_DMGEFF_NONE),
+ /* Deku launch */ DMG_ENTRY(2, POE_SISTERS_DMGEFF_NONE),
+ /* UNK_DMG_0x12 */ DMG_ENTRY(0, POE_SISTERS_DMGEFF_UNKDMG12),
+ /* Zora barrier */ DMG_ENTRY(0, POE_SISTERS_DMGEFF_NONE),
+ /* Normal shield */ DMG_ENTRY(0, POE_SISTERS_DMGEFF_NONE),
+ /* Light ray */ DMG_ENTRY(0, POE_SISTERS_DMGEFF_NONE),
+ /* Thrown object */ DMG_ENTRY(1, POE_SISTERS_DMGEFF_NONE),
+ /* Zora punch */ DMG_ENTRY(1, POE_SISTERS_DMGEFF_NONE),
+ /* Spin attack */ DMG_ENTRY(1, POE_SISTERS_DMGEFF_SPINATTACK),
+ /* Sword beam */ DMG_ENTRY(0, POE_SISTERS_DMGEFF_NONE),
+ /* Normal Roll */ DMG_ENTRY(0, POE_SISTERS_DMGEFF_NONE),
+ /* UNK_DMG_0x1B */ DMG_ENTRY(0, POE_SISTERS_DMGEFF_NONE),
+ /* UNK_DMG_0x1C */ DMG_ENTRY(0, POE_SISTERS_DMGEFF_NONE),
+ /* Unblockable */ DMG_ENTRY(0, POE_SISTERS_DMGEFF_NONE),
+ /* UNK_DMG_0x1E */ DMG_ENTRY(0, POE_SISTERS_DMGEFF_NONE),
+ /* Powder Keg */ DMG_ENTRY(1, POE_SISTERS_DMGEFF_NONE),
};
static InitChainEntry sInitChain[] = {
@@ -146,15 +148,15 @@ static InitChainEntry sInitChain[] = {
// clang-format off
// PoSisters have their own flags variable for cross function behavior detection
-#define POSISTERS_FLAG_CLEAR (0)
-#define POSISTERS_FLAG_CHECK_AC (1 << 0)
-#define POSISTERS_FLAG_UPDATE_SHAPE_ROT (1 << 1)
-#define POSISTERS_FLAG_CHECK_Z_TARGET (1 << 2) // meg doesnt go invis if you ztarget her for too long
-#define POSISTERS_FLAG_MATCH_PLAYER_HEIGHT (1 << 3) // the po is attempting to level with player's height
-#define POSISTERS_FLAG_UPDATE_BGCHECK_INFO (1 << 4)
-#define POSISTERS_FLAG_UPDATE_FIRES (1 << 5) // firePos updated to match limb in PostLimbDraw
-#define POSISTERS_FLAG_REAL_MEG_ROTATION (1 << 6) // real meg rotates different than her clones for one cycle
-#define POSISTERS_FLAG_DRAW_TORCH (1 << 7)
+#define POE_SISTERS_FLAG_CLEAR (0)
+#define POE_SISTERS_FLAG_CHECK_AC (1 << 0)
+#define POE_SISTERS_FLAG_UPDATE_SHAPE_ROT (1 << 1)
+#define POE_SISTERS_FLAG_CHECK_Z_TARGET (1 << 2) // Meg doesnt go invisible if you ztarget her for too long
+#define POE_SISTERS_FLAG_MATCH_PLAYER_HEIGHT (1 << 3) // The Poe is attempting to level with player's height
+#define POE_SISTERS_FLAG_UPDATE_BGCHECK_INFO (1 << 4)
+#define POE_SISTERS_FLAG_UPDATE_FIRES (1 << 5) // firePos updated to match limb in PostLimbDraw
+#define POE_SISTERS_FLAG_REAL_MEG_ROTATION (1 << 6) // Real Meg rotates different than her clones for one cycle
+#define POE_SISTERS_FLAG_DRAW_TORCH (1 << 7)
// clang-format on
void EnPoSisters_Init(Actor* thisx, PlayState* play) {
@@ -163,8 +165,8 @@ void EnPoSisters_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->actor, sInitChain);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 50.0f);
- SkelAnime_Init(play, &this->skelAnime, &gPoSistersSkel, &gPoeSistersSwayAnim, this->jointTable, this->morphTable,
- POSISTERS_LIMB_MAX);
+ SkelAnime_Init(play, &this->skelAnime, &gPoeSistersSkel, &gPoeSistersSwayAnim, this->jointTable, this->morphTable,
+ POE_SISTERS_LIMB_MAX);
this->color.r = 255;
this->color.g = 255;
@@ -176,21 +178,21 @@ void EnPoSisters_Init(Actor* thisx, PlayState* play) {
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
- this->type = ENPOSISTERS_GET_TYPE(thisx);
+ this->type = POE_SISTERS_GET_TYPE(thisx);
this->actor.hintId = this->type + TATL_HINT_ID_POE_SISTER_MEG;
- this->megCloneId = ENPOSISTERS_GET_MEG_CLONE_ID(thisx);
+ this->megCloneId = POE_SISTERS_GET_MEG_CLONE_ID(thisx);
this->floatingBobbingTimer = 32;
this->zTargetTimer = 20;
this->fireCount = 1;
- this->poSisterFlags = POSISTERS_FLAG_UPDATE_FIRES;
+ this->poSisterFlags = POE_SISTERS_FLAG_UPDATE_FIRES;
this->megDistToPlayer = 110.0f;
- thisx->flags &= ~ACTOR_FLAG_1;
+ thisx->flags &= ~ACTOR_FLAG_TARGETABLE;
- if (ENPOSISTERS_GET_OBSERVER_FLAG(&this->actor)) {
- // if flagged observer, they are a floating prop spawned by EnGb2 (po hut proprieter)
+ if (POE_SISTERS_GET_OBSERVER_FLAG(&this->actor)) {
+ // "Flagged observer": non-enemy floating prop spawned by EnGb2 (Poe Hut Proprieter) for display
EnPoSisters_SetupObserverIdle(this);
- } else if (this->type == POSISTER_TYPE_MEG) {
- if (this->megCloneId == POSISTER_MEG_REAL) {
+ } else if (this->type == POE_SISTERS_TYPE_MEG) {
+ if (this->megCloneId == POE_SISTERS_MEG_REAL) {
this->actor.colChkInfo.health = 8;
this->collider.info.toucher.damage = 16;
this->collider.base.ocFlags1 = (OC1_TYPE_PLAYER | OC1_ON);
@@ -242,15 +244,16 @@ void EnPoSisters_MatchPlayerXZ(EnPoSisters* this, PlayState* play) {
Player* player = GET_PLAYER(play);
f32 dist;
- if (this->megCloneId == POSISTER_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 {
Math_StepToF(&this->megDistToPlayer, 170.0f, 10.0f);
}
dist = this->megDistToPlayer;
- } else if (this->megCloneId != POSISTER_MEG_REAL) {
+ } else if (this->megCloneId != POE_SISTERS_MEG_REAL) {
dist = this->actor.parent->xzDistToPlayer;
}
@@ -276,18 +279,19 @@ 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);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_PO_AWAY - SFX_FLAG);
} else {
- func_800B9010(&this->actor, NA_SE_EN_PO_FLY - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_PO_FLY - SFX_FLAG);
}
}
}
// check for z target
void EnPoSisters_CheckZTarget(EnPoSisters* this, PlayState* play) {
- if (this->actor.isTargeted && (this->color.a == 255)) {
+ if (this->actor.isLockedOn && (this->color.a == 255)) {
DECR(this->zTargetTimer);
} else {
this->zTargetTimer = 20;
@@ -309,7 +313,7 @@ void EnPoSisters_CheckZTarget(EnPoSisters* this, PlayState* play) {
void EnPoSisters_SetupObserverIdle(EnPoSisters* this) {
Animation_MorphToLoop(&this->skelAnime, &gPoeSistersSwayAnim, -3.0f);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->laughTimer = Rand_S16Offset(100, 50);
this->actionFunc = EnPoSisters_ObserverIdle;
}
@@ -318,7 +322,7 @@ void EnPoSisters_ObserverIdle(EnPoSisters* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (DECR(this->laughTimer) == 0) {
this->laughTimer = Rand_S16Offset(100, 50);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_LAUGH2);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_LAUGH2);
}
}
@@ -330,7 +334,7 @@ void EnPoSisters_ObserverIdle(EnPoSisters* this, PlayState* play) {
void EnPoSisters_SetupAimlessIdleFlying2(EnPoSisters* this) {
Animation_MorphToLoop(&this->skelAnime, &gPoeSistersSwayAnim, -3.0f);
this->idleFlyingAnimationCounter = Rand_S16Offset(2, 3);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = EnPoSisters_AimlessIdleFlying2;
}
@@ -353,29 +357,32 @@ void EnPoSisters_SetupAimlessIdleFlying(EnPoSisters* this) {
Animation_MorphToLoop(&this->skelAnime, &gPoeSistersFloatAnim, -3.0f);
}
this->idleFlyingAnimationCounter = Rand_S16Offset(15, 3);
- this->poSisterFlags |= (POSISTERS_FLAG_CHECK_Z_TARGET | POSISTERS_FLAG_UPDATE_SHAPE_ROT | POSISTERS_FLAG_CHECK_AC);
+ this->poSisterFlags |=
+ (POE_SISTERS_FLAG_CHECK_Z_TARGET | POE_SISTERS_FLAG_UPDATE_SHAPE_ROT | POE_SISTERS_FLAG_CHECK_AC);
this->actionFunc = EnPoSisters_AimlessIdleFlying;
}
void EnPoSisters_AimlessIdleFlying(EnPoSisters* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
- Math_StepToF(&this->actor.speedXZ, 1.0f, 0.2f);
+ Math_StepToF(&this->actor.speed, 1.0f, 0.2f);
if (Animation_OnFrame(&this->skelAnime, 0.0f)) {
DECR(this->idleFlyingAnimationCounter);
}
if ((this->actor.xzDistToPlayer < 600.0f) && (fabsf(this->actor.playerHeightRel + 5.0f) < 30.0f)) {
EnPoSisters_SetupInvestigating(this);
- } else if ((this->idleFlyingAnimationCounter == 0) && Math_StepToF(&this->actor.speedXZ, 0.0f, 0.2f)) {
+ } else if ((this->idleFlyingAnimationCounter == 0) && Math_StepToF(&this->actor.speed, 0.0f, 0.2f)) {
// ! @bug: this is never reached because speedXZ is reduced
// at the same rate it is increased at the top of this function
EnPoSisters_SetupAimlessIdleFlying2(this);
}
- if (this->actor.bgCheckFlags & 8) { // touching a wall
- Math_ScaledStepToS(&this->actor.world.rot.y, Actor_YawToPoint(&this->actor, &this->actor.home.pos), 0x71C);
- } else if (Actor_XZDistanceToPoint(&this->actor, &this->actor.home.pos) > 600.0f) {
- Math_ScaledStepToS(&this->actor.world.rot.y, Actor_YawToPoint(&this->actor, &this->actor.home.pos), 0x71C);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
+ Math_ScaledStepToS(&this->actor.world.rot.y, Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos),
+ 0x71C);
+ } else if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) > 600.0f) {
+ Math_ScaledStepToS(&this->actor.world.rot.y, Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos),
+ 0x71C);
}
}
@@ -392,7 +399,7 @@ void EnPoSisters_Investigating(EnPoSisters* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
yawDiff = this->actor.yawTowardsPlayer - player->actor.shape.rot.y;
- Math_StepToF(&this->actor.speedXZ, 2.0f, 0.2f);
+ Math_StepToF(&this->actor.speed, 2.0f, 0.2f);
if (yawDiff > 0x3000) {
Math_ScaledStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer + 0x3000, 0x71C);
@@ -418,10 +425,10 @@ void EnPoSisters_SetupSpinUp(EnPoSisters* this) {
this->collider.base.acFlags |= AC_HARD;
}
- Animation_MorphToLoop(&this->skelAnime, &gPoSistersAttackAnim, -5.0f);
- this->actor.speedXZ = 0.0f;
- this->spinupTimer = Animation_GetLastFrame(&gPoSistersAttackAnim.common) * 3 + 3;
- this->poSisterFlags &= ~POSISTERS_FLAG_UPDATE_SHAPE_ROT;
+ Animation_MorphToLoop(&this->skelAnime, &gPoeSistersAttackAnim, -5.0f);
+ this->actor.speed = 0.0f;
+ this->spinupTimer = Animation_GetLastFrame(&gPoeSistersAttackAnim.common) * 3 + 3;
+ this->poSisterFlags &= ~POE_SISTERS_FLAG_UPDATE_SHAPE_ROT;
this->actionFunc = EnPoSisters_SpinUp;
}
@@ -430,23 +437,23 @@ void EnPoSisters_SpinUp(EnPoSisters* this, PlayState* play) {
DECR(this->spinupTimer);
this->actor.shape.rot.y += ((s32)((this->skelAnime.endFrame + 1.0f) * 3.0f) - this->spinupTimer) * 0x180;
if ((this->spinupTimer == 18) || (this->spinupTimer == 7)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_ROLL);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_ROLL);
} else if (this->spinupTimer == 0) {
EnPoSisters_SetupSpinAttack(this);
}
}
void EnPoSisters_SetupSpinAttack(EnPoSisters* this) {
- this->actor.speedXZ = 5.0f;
- if (this->type == POSISTER_TYPE_MEG) {
+ this->actor.speed = 5.0f;
+ if (this->type == POE_SISTERS_TYPE_MEG) {
this->collider.base.colType = COLTYPE_METAL;
this->collider.base.acFlags |= AC_HARD;
- Animation_MorphToLoop(&this->skelAnime, &gPoSistersAttackAnim, -5.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gPoeSistersAttackAnim, -5.0f);
}
this->spinTimer = 5;
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
- this->poSisterFlags |= POSISTERS_FLAG_MATCH_PLAYER_HEIGHT;
+ this->poSisterFlags |= POE_SISTERS_FLAG_MATCH_PLAYER_HEIGHT;
this->actionFunc = EnPoSisters_SpinAttack;
}
@@ -462,19 +469,19 @@ void EnPoSisters_SpinAttack(EnPoSisters* this, PlayState* play) {
s16 rotY = this->actor.shape.rot.y - this->actor.world.rot.y;
if (ABS_ALT(rotY) < 0x1000) {
- if (this->type != POSISTER_TYPE_MEG) {
+ if (this->type != POE_SISTERS_TYPE_MEG) {
this->collider.base.colType = COLTYPE_HIT3;
this->collider.base.acFlags &= ~AC_HARD;
EnPoSisters_SetupAimlessIdleFlying(this);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_LAUGH2);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_LAUGH2);
EnPoSisters_MegCloneVanish(this, play);
}
}
}
if (Animation_OnFrame(&this->skelAnime, 1.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_ROLL);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_ROLL);
}
}
@@ -484,7 +491,7 @@ void EnPoSisters_SpinAttack(EnPoSisters* this, PlayState* play) {
void EnPoSisters_SetupAttackConnect(EnPoSisters* this) {
Animation_MorphToLoop(&this->skelAnime, &gPoeSistersFloatAnim, -3.0f);
this->actor.world.rot.y = BINANG_ROT180(this->actor.yawTowardsPlayer);
- if (this->type != POSISTER_TYPE_MEG) {
+ if (this->type != POE_SISTERS_TYPE_MEG) {
this->collider.base.colType = COLTYPE_HIT3;
this->collider.base.acFlags &= ~AC_HARD;
}
@@ -494,14 +501,14 @@ void EnPoSisters_SetupAttackConnect(EnPoSisters* this) {
void EnPoSisters_AttackConnectDrift(EnPoSisters* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
- this->actor.shape.rot.y -= (s16)(this->actor.speedXZ * 10.0f * 128.0f);
+ this->actor.shape.rot.y -= (s16)(this->actor.speed * 10.0f * 128.0f);
- if (Math_StepToF(&this->actor.speedXZ, 0.0f, 0.1f)) { // wait to stop moving
+ if (Math_StepToF(&this->actor.speed, 0.0f, 0.1f)) { // wait to stop moving
this->actor.world.rot.y = this->actor.shape.rot.y;
- if (this->type != POSISTER_TYPE_MEG) {
+ if (this->type != POE_SISTERS_TYPE_MEG) {
EnPoSisters_SetupAimlessIdleFlying(this);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_LAUGH2);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_LAUGH2);
EnPoSisters_MegCloneVanish(this, play);
}
}
@@ -513,22 +520,23 @@ void EnPoSisters_SetupDamageFlinch(EnPoSisters* this) {
func_800BE504(&this->actor, &this->collider);
}
- if (this->type != POSISTER_TYPE_MEG) {
- this->actor.speedXZ = 10.0f;
+ if (this->type != POE_SISTERS_TYPE_MEG) {
+ this->actor.speed = 10.0f;
}
this->poSisterFlags &=
- ~(POSISTERS_FLAG_MATCH_PLAYER_HEIGHT | POSISTERS_FLAG_UPDATE_SHAPE_ROT | POSISTERS_FLAG_CHECK_AC);
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 16);
+ ~(POE_SISTERS_FLAG_MATCH_PLAYER_HEIGHT | POE_SISTERS_FLAG_UPDATE_SHAPE_ROT | POE_SISTERS_FLAG_CHECK_AC);
+
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 16);
this->actionFunc = EnPoSisters_DamageFlinch;
}
void EnPoSisters_DamageFlinch(EnPoSisters* this, PlayState* play) {
if (SkelAnime_Update(&this->skelAnime) && !(this->actor.flags & ACTOR_FLAG_8000)) {
if (this->actor.colChkInfo.health != 0) {
- if (this->type != POSISTER_TYPE_MEG) {
+ if (this->type != POE_SISTERS_TYPE_MEG) {
EnPoSisters_SetupFlee(this);
- } else if (this->megCloneId != POSISTER_MEG_REAL) {
+ } else if (this->megCloneId != POE_SISTERS_MEG_REAL) {
EnPoSisters_MegCloneVanish(this, NULL);
} else {
EnPoSisters_MegCloneVanish(this, play);
@@ -538,28 +546,28 @@ void EnPoSisters_DamageFlinch(EnPoSisters* this, PlayState* play) {
}
}
- if (this->megCloneId != POSISTER_MEG_REAL) {
+ if (this->megCloneId != POE_SISTERS_MEG_REAL) {
s32 alpha;
Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.parent->shape.rot.y,
- (this->megCloneId == POSISTER_MEG_CLONE2) ? 0x800 : 0x400);
+ (this->megCloneId == POE_SISTERS_MEG_CLONE2) ? 0x800 : 0x400);
alpha = ((this->skelAnime.endFrame - this->skelAnime.curFrame) * 255.0f) / this->skelAnime.endFrame;
this->color.a = CLAMP(alpha, 0, 255);
this->actor.world.pos.y = this->actor.parent->world.pos.y;
EnPoSisters_MatchPlayerXZ(this, play);
- } else if (this->type != POSISTER_TYPE_MEG) {
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f);
+ } else if (this->type != POE_SISTERS_TYPE_MEG) {
+ Math_StepToF(&this->actor.speed, 0.0f, 0.5f);
}
}
void EnPoSisters_SetupFlee(EnPoSisters* this) {
- Animation_MorphToLoop(&this->skelAnime, &gPoSistersFleeAnim, -3.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gPoeSistersFleeAnim, -3.0f);
this->actor.world.rot.y = BINANG_ROT180(this->actor.shape.rot.y);
this->fleeTimer = 5;
this->poSisterFlags |=
- (POSISTERS_FLAG_MATCH_PLAYER_HEIGHT | POSISTERS_FLAG_UPDATE_SHAPE_ROT | POSISTERS_FLAG_CHECK_AC);
- this->actor.speedXZ = 5.0f;
+ (POE_SISTERS_FLAG_MATCH_PLAYER_HEIGHT | POE_SISTERS_FLAG_UPDATE_SHAPE_ROT | POE_SISTERS_FLAG_CHECK_AC);
+ this->actor.speed = 5.0f;
this->actionFunc = EnPoSisters_Flee;
}
@@ -570,11 +578,11 @@ void EnPoSisters_Flee(EnPoSisters* this, PlayState* play) {
DECR(this->fleeTimer);
}
- if (this->actor.bgCheckFlags & 8) { // touching a wall
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->actor.world.rot.y = this->actor.shape.rot.y;
- this->poSisterFlags |= POSISTERS_FLAG_UPDATE_SHAPE_ROT;
+ 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);
}
@@ -584,11 +592,11 @@ void EnPoSisters_SetupSpinToInvis(EnPoSisters* this) {
Animation_Change(&this->skelAnime, &gPoeSistersAppearDisappearAnim, 1.5f, 0.0f,
Animation_GetLastFrame(&gPoeSistersAppearDisappearAnim.common), ANIMMODE_ONCE, -3.0f);
this->invisibleTimer = 100; // 5 seconds
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
- this->poSisterFlags &= ~(POSISTERS_FLAG_CHECK_Z_TARGET | POSISTERS_FLAG_CHECK_AC);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_DISAPPEAR);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_LAUGH2);
+ this->poSisterFlags &= ~(POE_SISTERS_FLAG_CHECK_Z_TARGET | POE_SISTERS_FLAG_CHECK_AC);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_DISAPPEAR);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_LAUGH2);
this->actionFunc = EnPoSisters_SpinToInvis;
}
@@ -607,7 +615,7 @@ void EnPoSisters_SpinToInvis(EnPoSisters* this, PlayState* play) {
void EnPoSisters_SetupSpinBackToVisible(EnPoSisters* this, PlayState* play) {
Animation_Change(&this->skelAnime, &gPoeSistersAppearDisappearAnim, 1.5f, 0.0f,
Animation_GetLastFrame(&gPoeSistersAppearDisappearAnim.common), ANIMMODE_ONCE, -3.0f);
- if (this->type == POSISTER_TYPE_MEG) {
+ if (this->type == POE_SISTERS_TYPE_MEG) {
this->megDistToPlayer = 110.0f;
EnPoSisters_MatchPlayerXZ(this, play);
this->color.a = 0;
@@ -617,17 +625,17 @@ void EnPoSisters_SetupSpinBackToVisible(EnPoSisters* this, PlayState* play) {
}
this->spinInvisibleTimer = 15;
- this->actor.speedXZ = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_APPEAR);
- this->poSisterFlags &= ~POSISTERS_FLAG_CHECK_AC;
+ this->actor.speed = 0.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_APPEAR);
+ this->poSisterFlags &= ~POE_SISTERS_FLAG_CHECK_AC;
this->actionFunc = EnPoSisters_SpinBackToVisible;
}
void EnPoSisters_SpinBackToVisible(EnPoSisters* this, PlayState* play) {
if (SkelAnime_Update(&this->skelAnime)) {
this->color.a = 255; // fully visible
- if (this->type != POSISTER_TYPE_MEG) {
- this->poSisterFlags |= POSISTERS_FLAG_CHECK_AC;
+ if (this->type != POE_SISTERS_TYPE_MEG) {
+ this->poSisterFlags |= POE_SISTERS_FLAG_CHECK_AC;
this->collider.info.bumper.dmgFlags = ~(0x8000000 | 0x200000 | 0x100000 | 0x40000 | 0x1);
DECR(this->spinInvisibleTimer);
@@ -643,7 +651,7 @@ void EnPoSisters_SpinBackToVisible(EnPoSisters* this, PlayState* play) {
s32 alpha = (this->skelAnime.curFrame * 255.0f) / this->skelAnime.endFrame;
this->color.a = CLAMP(alpha, 0, 255);
- if (this->type == POSISTER_TYPE_MEG) {
+ if (this->type == POE_SISTERS_TYPE_MEG) {
EnPoSisters_MatchPlayerXZ(this, play);
}
}
@@ -651,11 +659,11 @@ void EnPoSisters_SpinBackToVisible(EnPoSisters* this, PlayState* play) {
void EnPoSisters_SetupDeathStage1(EnPoSisters* this) {
this->deathTimer = 0;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.world.pos.y += 42.0f;
this->actor.shape.yOffset = -6000.0f;
- this->actor.flags &= ~ACTOR_FLAG_1;
- this->poSisterFlags = POSISTERS_FLAG_CLEAR;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ this->poSisterFlags = POE_SISTERS_FLAG_CLEAR;
this->actionFunc = EnPoSisters_DeathStage1;
}
@@ -696,7 +704,7 @@ void EnPoSisters_DeathStage1(EnPoSisters* this, PlayState* play) {
}
if (this->deathTimer == 16) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WIZ_DISAPPEAR);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WIZ_DISAPPEAR);
}
}
@@ -724,15 +732,15 @@ void EnPoSisters_DeathStage2(EnPoSisters* this, PlayState* play) {
void EnPoSisters_SpawnMegClones(EnPoSisters* this, PlayState* play) {
Actor* clone1 = Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_PO_SISTERS,
this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, 0, 0,
- 0, ENPOSISTERS_PARAMS(false, POSISTER_MEG_CLONE1, POSISTER_TYPE_MEG));
+ 0, POE_SISTERS_PARAMS(false, POE_SISTERS_MEG_CLONE1, POE_SISTERS_TYPE_MEG));
Actor* clone2 = Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_PO_SISTERS,
this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, 0, 0,
- 0, ENPOSISTERS_PARAMS(false, POSISTER_MEG_CLONE2, POSISTER_TYPE_MEG));
+ 0, POE_SISTERS_PARAMS(false, POE_SISTERS_MEG_CLONE2, POE_SISTERS_TYPE_MEG));
Actor* clone3 = Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_PO_SISTERS,
this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, 0, 0,
- 0, ENPOSISTERS_PARAMS(false, POSISTER_MEG_CLONE3, POSISTER_TYPE_MEG));
+ 0, POE_SISTERS_PARAMS(false, POE_SISTERS_MEG_CLONE3, POE_SISTERS_TYPE_MEG));
- // if we cannot spawn all clones: abort
+ // If we cannot spawn all clones: Abort
if ((clone1 == NULL) || (clone2 == NULL) || (clone3 == NULL)) {
if (clone1 != NULL) {
Actor_Kill(clone1);
@@ -757,9 +765,9 @@ void EnPoSisters_MegCloneVanish(EnPoSisters* this, PlayState* play) {
Vec3f pos;
this->actor.draw = NULL;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->invisibleTimer = 100; // 5 seconds
- this->poSisterFlags = POSISTERS_FLAG_UPDATE_FIRES;
+ this->poSisterFlags = POE_SISTERS_FLAG_UPDATE_FIRES;
this->collider.base.colType = COLTYPE_HIT3;
this->collider.base.acFlags &= ~AC_HARD;
@@ -767,10 +775,10 @@ void EnPoSisters_MegCloneVanish(EnPoSisters* this, PlayState* play) {
pos.x = this->actor.world.pos.x;
pos.y = this->actor.world.pos.y + 45.0f;
pos.z = this->actor.world.pos.z;
- func_800B3030(play, &pos, &gZeroVec3f, &gZeroVec3f, 150, 0, 3); // spawns EffectSsDeadDb
+ func_800B3030(play, &pos, &gZeroVec3f, &gZeroVec3f, 150, 0, 3); // Spawns EffectSsDeadDb (flame effects)
}
- Lights_PointSetColorAndRadius(&this->lightInfo, 0, 0, 0, 0); // light OFF
+ Lights_PointSetColorAndRadius(&this->lightInfo, 0, 0, 0, 0); // Light OFF
this->actionFunc = EnPoSisters_MegCloneWaitForSpinBack;
}
@@ -778,7 +786,7 @@ void EnPoSisters_MegCloneWaitForSpinBack(EnPoSisters* this, PlayState* play) {
Player* player = GET_PLAYER(play);
EnPoSisters* parent = (EnPoSisters*)this->actor.parent;
- if (this->megCloneId == POSISTER_MEG_REAL) {
+ if (this->megCloneId == POE_SISTERS_MEG_REAL) {
DECR(this->invisibleTimer);
if (this->invisibleTimer == 0) {
s32 rand = Rand_ZeroFloat(4.0f);
@@ -803,8 +811,8 @@ void EnPoSisters_SetupMegSurroundPlayer(EnPoSisters* this) {
this->color.a = 255;
this->megSurroundTimer = 300; // 15 seconds
this->megClonesRemaining = 3;
- this->poSisterFlags |= (POSISTERS_FLAG_MATCH_PLAYER_HEIGHT | POSISTERS_FLAG_CHECK_AC);
- this->actor.flags |= ACTOR_FLAG_1;
+ this->poSisterFlags |= (POE_SISTERS_FLAG_MATCH_PLAYER_HEIGHT | POE_SISTERS_FLAG_CHECK_AC);
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actionFunc = EnPoSisters_MegSurroundPlayer;
}
@@ -813,49 +821,50 @@ 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 == POSISTER_MEG_REAL) {
+ if (this->megCloneId == POE_SISTERS_MEG_REAL) {
if (ABS_ALT(16 - this->floatingBobbingTimer) < 14) {
- // every x frames rotate around player, the fewer meg clones remaining the faster they spin
+ // Every N frames rotate around player. The fewer Meg clones remaining the faster they spin.
this->actor.shape.rot.y += (s16)((0x580 - (this->megClonesRemaining * 0x180)) *
fabsf(Math_SinS(this->floatingBobbingTimer * 0x800)));
}
- // twirl the real meg backwards for a bit for visual tell to player
+ // Twirl the real Meg backwards for a bit for a visual tell to player.
if ((this->megSurroundTimer >= 284) || (this->megSurroundTimer <= 30)) {
- this->poSisterFlags |= POSISTERS_FLAG_REAL_MEG_ROTATION;
+ this->poSisterFlags |= POE_SISTERS_FLAG_REAL_MEG_ROTATION;
} else {
- this->poSisterFlags &= ~POSISTERS_FLAG_REAL_MEG_ROTATION;
+ this->poSisterFlags &= ~POE_SISTERS_FLAG_REAL_MEG_ROTATION;
}
} else {
this->actor.shape.rot.y = this->actor.parent->shape.rot.y + (this->megCloneId * 0x4000);
}
}
- if (this->megCloneId == POSISTER_MEG_REAL) {
+ if (this->megCloneId == POE_SISTERS_MEG_REAL) {
if ((this->megSurroundTimer >= 284) || ((this->megSurroundTimer <= 30) && (this->megSurroundTimer >= 16))) {
- this->poSisterFlags |= POSISTERS_FLAG_REAL_MEG_ROTATION;
+ this->poSisterFlags |= POE_SISTERS_FLAG_REAL_MEG_ROTATION;
} else {
- this->poSisterFlags &= ~POSISTERS_FLAG_REAL_MEG_ROTATION;
+ this->poSisterFlags &= ~POE_SISTERS_FLAG_REAL_MEG_ROTATION;
}
}
if (this->megSurroundTimer == 0) {
- if (this->megCloneId == POSISTER_MEG_REAL) {
+ if (this->megCloneId == POE_SISTERS_MEG_REAL) {
EnPoSisters_SetupSpinAttack(this);
} else {
EnPoSisters_MegCloneVanish(this, play);
}
- } else if (this->megCloneId != POSISTER_MEG_REAL) {
+ } else if (this->megCloneId != POE_SISTERS_MEG_REAL) {
parent = (EnPoSisters*)this->actor.parent;
if (parent->actionFunc == EnPoSisters_DamageFlinch) {
- // flinch clones if you hit the real meg
+ // Clones flinch if you hit the real Meg
EnPoSisters_SetupDamageFlinch(this);
}
} else if (this->megClonesRemaining == 0) {
- // all meg clones have been killed, meg waits 15 frames then spin attacks
- // timer is negative because megClonesRemaining and megAttackTimer are the same union'd variable
+ // All Meg clones have been killed: Real Meg waits 15 frames then spin attacks in retaliation
+ // Timer is negative (inrecrements to zero)
+ // because megClonesRemaining and megAttackTimer are the same union'd variable
this->megAttackTimer = -15;
} else if (this->megAttackTimer < 0) {
this->megAttackTimer++;
@@ -872,18 +881,18 @@ void EnPoSisters_MegSurroundPlayer(EnPoSisters* this, PlayState* play) {
*/
void EnPoSisters_SetupSpawnPo(EnPoSisters* this) {
Animation_PlayOnce(&this->skelAnime, &gPoeSistersAppearDisappearAnim);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_APPEAR);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_APPEAR);
this->color.a = 0;
- this->poSisterFlags = POSISTERS_FLAG_UPDATE_FIRES;
+ this->poSisterFlags = POE_SISTERS_FLAG_UPDATE_FIRES;
this->actionFunc = EnPoSisters_PoeSpawn;
}
void EnPoSisters_PoeSpawn(EnPoSisters* this, PlayState* play) {
if (SkelAnime_Update(&this->skelAnime)) {
this->color.a = 255;
- this->actor.flags |= ACTOR_FLAG_1;
- this->poSisterFlags |= (POSISTERS_FLAG_UPDATE_BGCHECK_INFO | POSISTERS_FLAG_MATCH_PLAYER_HEIGHT);
- if (this->type == POSISTER_TYPE_MEG) {
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
+ this->poSisterFlags |= (POE_SISTERS_FLAG_UPDATE_BGCHECK_INFO | POE_SISTERS_FLAG_MATCH_PLAYER_HEIGHT);
+ if (this->type == POE_SISTERS_TYPE_MEG) {
EnPoSisters_MegCloneVanish(this, play);
} else {
EnPoSisters_SetupAimlessIdleFlying(this);
@@ -903,9 +912,9 @@ void EnPoSisters_CheckCollision(EnPoSisters* this, PlayState* play) {
this->collider.base.acFlags &= ~AC_HIT;
Actor_SetDropFlag(&this->actor, &this->collider.info);
- if (this->megCloneId != POSISTER_MEG_REAL) {
+ if (this->megCloneId != POE_SISTERS_MEG_REAL) {
((EnPoSisters*)this->actor.parent)->megClonesRemaining--;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_LAUGH2);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_LAUGH2);
EnPoSisters_MegCloneVanish(this, play);
if (Rand_ZeroOne() < 0.2f) {
pos.x = this->actor.world.pos.x;
@@ -914,32 +923,32 @@ void EnPoSisters_CheckCollision(EnPoSisters* this, PlayState* play) {
Item_DropCollectible(play, &pos, ITEM00_ARROWS_10);
}
} else if (this->collider.base.colType != 9) {
- if (this->actor.colChkInfo.damageEffect == POSISTERS_DAMAGEEFFECT_DEKUNUT) {
+ if (this->actor.colChkInfo.damageEffect == POE_SISTERS_DMGEFF_DEKUNUT) {
this->actor.world.rot.y = this->actor.shape.rot.y;
- this->poSisterFlags |= POSISTERS_FLAG_UPDATE_SHAPE_ROT;
+ this->poSisterFlags |= POE_SISTERS_FLAG_UPDATE_SHAPE_ROT;
EnPoSisters_SetupSpinBackToVisible(this, play);
- } else if ((this->type == POSISTER_TYPE_MEG) &&
- (this->actor.colChkInfo.damageEffect == POSISTERS_DAMAGEEFFECT_SPINATTACK) &&
+ } else if ((this->type == POE_SISTERS_TYPE_MEG) &&
+ (this->actor.colChkInfo.damageEffect == POE_SISTERS_DMGEFF_SPINATTACK) &&
(this->actionFunc == EnPoSisters_MegSurroundPlayer)) {
if (this->megClonesRemaining == 0) {
- // all meg clones have been killed, meg waits 45 frames then spin attacks
- // timer is negative because megClonesRemaining and megAttackTimer are the same union'd variable
+ // All Meg clones have been killed: Real Meg waits 45 frames then spin attacks
+ // Timer is negative because megClonesRemaining and megAttackTimer are the same union'd variable
this->megAttackTimer = -45;
}
} else {
if (Actor_ApplyDamage(&this->actor)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_DAMAGE);
} else {
Enemy_StartFinishingBlow(play, &this->actor);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_SISTER_DEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_SISTER_DEAD);
}
- if (this->actor.colChkInfo.damageEffect == POSISTERS_DAMAGEEFFECT_LIGHTARROWS) {
+ if (this->actor.colChkInfo.damageEffect == POE_SISTERS_DMGEFF_LIGHTARROWS) {
this->drawDmgEffAlpha = 4.0f;
this->drawDmgEffScale = 0.5f;
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);
+ CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
}
EnPoSisters_SetupDamageFlinch(this);
}
@@ -960,20 +969,20 @@ void EnPoSisters_Update(Actor* thisx, PlayState* play) {
}
EnPoSisters_CheckCollision(this, play);
- if (this->poSisterFlags & POSISTERS_FLAG_CHECK_Z_TARGET) {
+ if (this->poSisterFlags & POE_SISTERS_FLAG_CHECK_Z_TARGET) {
EnPoSisters_CheckZTarget(this, play);
}
this->actionFunc(this, play);
- if (this->poSisterFlags & POSISTERS_FLAG_MATCH_PLAYER_HEIGHT) {
+ if (this->poSisterFlags & POE_SISTERS_FLAG_MATCH_PLAYER_HEIGHT) {
EnPoSisters_MatchPlayerY(this, play);
}
Actor_MoveWithGravity(&this->actor);
- if (this->poSisterFlags & POSISTERS_FLAG_UPDATE_BGCHECK_INFO) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 0.0f, 5);
+ if (this->poSisterFlags & POE_SISTERS_FLAG_UPDATE_BGCHECK_INFO) {
+ 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;
@@ -999,8 +1008,8 @@ void EnPoSisters_Update(Actor* thisx, PlayState* play) {
}
if (this->poSisterFlags &
- (POSISTERS_FLAG_UPDATE_BGCHECK_INFO | POSISTERS_FLAG_MATCH_PLAYER_HEIGHT | POSISTERS_FLAG_CHECK_Z_TARGET |
- POSISTERS_FLAG_UPDATE_SHAPE_ROT | POSISTERS_FLAG_CHECK_AC)) {
+ (POE_SISTERS_FLAG_UPDATE_BGCHECK_INFO | POE_SISTERS_FLAG_MATCH_PLAYER_HEIGHT | POE_SISTERS_FLAG_CHECK_Z_TARGET |
+ POE_SISTERS_FLAG_UPDATE_SHAPE_ROT | POE_SISTERS_FLAG_CHECK_AC)) {
Collider_UpdateCylinder(&this->actor, &this->collider);
if ((this->actionFunc == EnPoSisters_SpinAttack) || (this->actionFunc == EnPoSisters_SpinUp)) {
this->fireCount++;
@@ -1014,7 +1023,7 @@ void EnPoSisters_Update(Actor* thisx, PlayState* play) {
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
}
- if (this->poSisterFlags & POSISTERS_FLAG_CHECK_AC) {
+ if (this->poSisterFlags & POE_SISTERS_FLAG_CHECK_AC) {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
}
@@ -1024,23 +1033,23 @@ void EnPoSisters_Update(Actor* thisx, PlayState* play) {
if (this->actionFunc == EnPoSisters_Flee) {
this->actor.shape.rot.y = BINANG_ROT180(this->actor.world.rot.y);
- } else if (this->poSisterFlags & POSISTERS_FLAG_UPDATE_SHAPE_ROT) {
+ } else if (this->poSisterFlags & POE_SISTERS_FLAG_UPDATE_SHAPE_ROT) {
this->actor.shape.rot.y = this->actor.world.rot.y;
}
}
}
void EnPoSisters_UpdateColors(EnPoSisters* this) {
- if (this->skelAnime.animation == &gPoSistersAttackAnim) {
+ if (this->skelAnime.animation == &gPoeSistersAttackAnim) {
this->color.r = CLAMP_MAX(this->color.r + 5, 255);
this->color.g = CLAMP_MIN(this->color.g - 5, 50);
this->color.b = CLAMP_MIN(this->color.b - 5, 0);
- } else if (this->skelAnime.animation == &gPoSistersFleeAnim) {
+ } else if (this->skelAnime.animation == &gPoeSistersFleeAnim) {
this->color.r = CLAMP_MAX(this->color.r + 5, 80);
this->color.g = CLAMP_MAX(this->color.g + 5, 255);
this->color.b = CLAMP_MAX(this->color.b + 5, 225);
} else if (this->skelAnime.animation == &gPoeSistersDamagedAnim) {
- // flash every other frame after taking damage
+ // Flash every other frame after taking damage
if (this->actor.colorFilterTimer & 0x2) {
this->color.r = 0;
this->color.g = 0;
@@ -1067,16 +1076,16 @@ void EnPoSisters_UpdateColors(EnPoSisters* this) {
s32 EnPoSisters_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx,
Gfx** gfx) {
static Gfx* gPoSisterBodyDisplayLists[] = {
- gPoSistersMegBodyDL,
- gPoSistersJoelleBodyDL,
- gPoSistersBethBodyDL,
- gPoSistersAmyBodyDL,
+ gPoeSistersMegBodyDL,
+ gPoeSistersJoelleBodyDL,
+ gPoeSistersBethBodyDL,
+ gPoeSistersAmyBodyDL,
};
static Gfx* gPoSisterFaceDisplayLists[] = {
- gPoSistersMegFaceDL,
- gPoSistersJoelleFaceDL,
- gPoSistersBethFaceDL,
- gPoSistersAmyFaceDL,
+ gPoeSistersMegFaceDL,
+ gPoeSistersJoelleFaceDL,
+ gPoeSistersBethFaceDL,
+ gPoeSistersAmyFaceDL,
};
static Color_RGBA8 gPoSisterColors[] = {
{ 80, 0, 100, 0 },
@@ -1086,7 +1095,7 @@ s32 EnPoSisters_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Ve
};
EnPoSisters* this = THIS;
- if (limbIndex == POSISTERS_LIMB_ROOT && (this->poSisterFlags & POSISTERS_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 {
@@ -1094,17 +1103,17 @@ s32 EnPoSisters_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Ve
}
}
- if ((this->color.a == 0) || (limbIndex == POSISTERS_LIMB_TORCH) ||
+ if ((this->color.a == 0) || (limbIndex == POE_SISTERS_LIMB_TORCH) ||
((this->actionFunc == EnPoSisters_DeathStage1) && (this->deathTimer >= 8))) {
*dList = NULL;
- } else if (limbIndex == POSISTERS_LIMB_MAIN_BODY) {
+ } else if (limbIndex == POE_SISTERS_LIMB_MAIN_BODY) {
*dList = gPoSisterBodyDisplayLists[this->type];
- } else if (limbIndex == POSISTERS_LIMB_FACE) {
+ } else if (limbIndex == POE_SISTERS_LIMB_FACE) {
*dList = gPoSisterFaceDisplayLists[this->type];
gDPPipeSync((*gfx)++);
gDPSetEnvColor((*gfx)++, this->color.r, this->color.g, this->color.b, this->color.a);
- } else if (limbIndex == POSISTERS_LIMB_LOWER_BODY) {
+ } else if (limbIndex == POE_SISTERS_LIMB_LOWER_BODY) {
Color_RGBA8* color = &gPoSisterColors[this->type];
gDPPipeSync((*gfx)++);
@@ -1114,46 +1123,47 @@ s32 EnPoSisters_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Ve
return false;
}
-#define POSISTER_LIMBPOS_INVALID -1
+static Vec3f D_80B1DAFC = { 1000.0f, -1700.0f, 0.0f };
+
+static s8 sLimbToBodyParts[POE_SISTERS_LIMB_MAX] = {
+ BODYPART_NONE, // POE_SISTERS_LIMB_NONE
+ BODYPART_NONE, // POE_SISTERS_LIMB_ROOT
+ POE_SISTERS_BODYPART_LEFT_ARM, // POE_SISTERS_LIMB_LEFT_ARM
+ POE_SISTERS_BODYPART_LEFT_HAND, // POE_SISTERS_LIMB_LEFT_HAND
+ POE_SISTERS_BODYPART_RIGHT_UPPER_ARM, // POE_SISTERS_LIMB_RIGHT_UPPER_ARM
+ BODYPART_NONE, // POE_SISTERS_LIMB_RIGHT_FOREARM
+ POE_SISTERS_BODYPART_TORCH_ROOT, // POE_SISTERS_LIMB_TORCH_ROOT
+ BODYPART_NONE, // POE_SISTERS_LIMB_RIGHT_HAND
+ BODYPART_NONE, // POE_SISTERS_LIMB_TORCH
+ BODYPART_NONE, // POE_SISTERS_LIMB_MAIN_BODY
+ BODYPART_NONE, // POE_SISTERS_LIMB_FACE
+ BODYPART_NONE, // POE_SISTERS_LIMB_LOWER_BODY
+};
void EnPoSisters_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx, Gfx** gfx) {
- static Vec3f D_80B1DAFC = { 1000.0f, -1700.0f, 0.0f };
- static s8 D_80B1DB08[] = {
- POSISTER_LIMBPOS_INVALID,
- POSISTER_LIMBPOS_INVALID,
- 0,
- 1,
- 2,
- POSISTER_LIMBPOS_INVALID,
- 3,
- POSISTER_LIMBPOS_INVALID,
- POSISTER_LIMBPOS_INVALID,
- POSISTER_LIMBPOS_INVALID,
- POSISTER_LIMBPOS_INVALID,
- POSISTER_LIMBPOS_INVALID,
- };
EnPoSisters* this = THIS;
s32 end;
f32 brightness;
- if (D_80B1DB08[limbIndex] != POSISTER_LIMBPOS_INVALID) {
- Matrix_MultZero(&this->limbPos[D_80B1DB08[limbIndex]]);
- } else if (limbIndex == POSISTERS_LIMB_MAIN_BODY) {
- Matrix_MultVecY(-2500.0f, &this->limbPos[4]);
- Matrix_MultVecY(3000.0f, &this->limbPos[5]);
- } else if (limbIndex == POSISTERS_LIMB_FACE) {
- Matrix_MultVecY(-4000.0f, &this->limbPos[6]);
- } else if (limbIndex == POSISTERS_LIMB_LOWER_BODY) {
- Matrix_MultVecX(3000.0f, &this->limbPos[7]);
+ if (sLimbToBodyParts[limbIndex] != BODYPART_NONE) {
+ Matrix_MultZero(&this->bodyPartsPos[sLimbToBodyParts[limbIndex]]);
+ } else if (limbIndex == POE_SISTERS_LIMB_MAIN_BODY) {
+ Matrix_MultVecY(-2500.0f, &this->bodyPartsPos[POE_SISTERS_BODYPART_MAIN_BODY_0]);
+ Matrix_MultVecY(3000.0f, &this->bodyPartsPos[POE_SISTERS_BODYPART_MAIN_BODY_1]);
+ } else if (limbIndex == POE_SISTERS_LIMB_FACE) {
+ Matrix_MultVecY(-4000.0f, &this->bodyPartsPos[POE_SISTERS_BODYPART_FACE]);
+ } else if (limbIndex == POE_SISTERS_LIMB_LOWER_BODY) {
+ Matrix_MultVecX(3000.0f, &this->bodyPartsPos[POE_SISTERS_BODYPART_LOWER_BODY]);
}
- if (this->actionFunc == EnPoSisters_DeathStage1 && this->deathTimer >= 8 && limbIndex == POSISTERS_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)++, gPoSistersBurnBodyDL);
+ gSPDisplayList((*gfx)++, gPoeSistersBurnBodyDL);
}
- if (limbIndex == POSISTERS_LIMB_TORCH) {
- if (this->poSisterFlags & POSISTERS_FLAG_UPDATE_FIRES) {
+ if (limbIndex == POE_SISTERS_LIMB_TORCH) {
+ if (this->poSisterFlags & POE_SISTERS_FLAG_UPDATE_FIRES) {
for (end = this->fireCount - 1; end > 0; end--) {
this->firePos[end] = this->firePos[end - 1];
}
@@ -1164,7 +1174,7 @@ void EnPoSisters_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s
if (this->fireCount > 0) {
Color_RGBA8* flameColor = &sPoSisterFlameColors[this->type];
- brightness = Rand_ZeroFloat(0.3f) + 0.7f; // flickering torch light level
+ brightness = Rand_ZeroFloat(0.3f) + 0.7f; // Flickering torch light level
if (this->actionFunc == EnPoSisters_DeathStage2) {
Lights_PointNoGlowSetInfo(&this->lightInfo, this->firePos[0].x, this->firePos[0].y + 15.0f,
@@ -1179,7 +1189,7 @@ void EnPoSisters_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s
Lights_PointSetColorAndRadius(&this->lightInfo, 0, 0, 0, 0);
}
- if (!(this->poSisterFlags & POSISTERS_FLAG_DRAW_TORCH)) {
+ if (!(this->poSisterFlags & POE_SISTERS_FLAG_DRAW_TORCH)) {
Matrix_Get(&this->mtxf);
}
}
@@ -1198,28 +1208,28 @@ 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);
- gSPSegment(POLY_OPA_DISP++, 0x09, D_801AEFA0); // empty
+ gSPSegment(POLY_OPA_DISP++, 0x09, D_801AEFA0); // Empty DL
POLY_OPA_DISP =
SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnPoSisters_OverrideLimbDraw,
EnPoSisters_PostLimbDraw, &this->actor, POLY_OPA_DISP);
} else {
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, this->color.a);
- gSPSegment(POLY_XLU_DISP++, 0x09, D_801AEF88); // xlu only DL
+ gSPSegment(POLY_XLU_DISP++, 0x09, D_801AEF88); // XLU only DL
POLY_XLU_DISP =
SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnPoSisters_OverrideLimbDraw,
EnPoSisters_PostLimbDraw, &this->actor, POLY_XLU_DISP);
}
- if (!(this->poSisterFlags & POSISTERS_FLAG_DRAW_TORCH)) {
+ if (!(this->poSisterFlags & POE_SISTERS_FLAG_DRAW_TORCH)) {
Matrix_Put(&this->mtxf);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, gPoSistersDrawTorchDL);
+ gSPDisplayList(POLY_OPA_DISP++, gPoeSistersTorchDL);
}
gSPSegment(
@@ -1256,7 +1266,7 @@ void EnPoSisters_Draw(Actor* thisx, PlayState* play) {
gSPDisplayList(POLY_XLU_DISP++, gEffFire1DL);
}
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos),
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, POE_SISTERS_BODYPART_MAX,
this->actor.scale.x * (1.0f / 0.007f) * this->drawDmgEffScale, 0.0f, this->drawDmgEffAlpha,
ACTOR_DRAW_DMGEFF_LIGHT_ORBS);
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 5e549c4d7..510a67f36 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
@@ -8,25 +8,37 @@ struct EnPoSisters;
typedef void (*EnPoSistersActionFunc)(struct EnPoSisters*, PlayState*);
-#define ENPOSISTERS_GET_OBSERVER_FLAG(thisx) ((thisx)->params & 0x1000)
-#define ENPOSISTERS_GET_MEG_CLONE_ID(thisx) (((thisx)->params >> 0xA) & 3)
-#define ENPOSISTERS_GET_TYPE(thisx) (((thisx)->params >> 8) & 3)
+#define POE_SISTERS_GET_OBSERVER_FLAG(thisx) ((thisx)->params & 0x1000)
+#define POE_SISTERS_GET_MEG_CLONE_ID(thisx) (((thisx)->params >> 0xA) & 3)
+#define POE_SISTERS_GET_TYPE(thisx) (((thisx)->params >> 8) & 3)
-#define ENPOSISTERS_PARAMS(observerFlag, megClone, type) (((observerFlag) << 0xC) | ((megClone & 3) << 0xA) | ((type & 3) << 8))
+#define POE_SISTERS_PARAMS(observerFlag, megClone, type) (((observerFlag) << 0xC) | ((megClone & 3) << 0xA) | ((type & 3) << 8))
typedef enum {
- /* 0 */ POSISTER_TYPE_MEG, // purple
- /* 1 */ POSISTER_TYPE_JO, // red
- /* 2 */ POSISTER_TYPE_BETH, // blue
- /* 3 */ POSISTER_TYPE_AMY, // green
-} EnPoSisterType;
+ /* 0 */ POE_SISTERS_TYPE_MEG, // purple
+ /* 1 */ POE_SISTERS_TYPE_JO, // red
+ /* 2 */ POE_SISTERS_TYPE_BETH, // blue
+ /* 3 */ POE_SISTERS_TYPE_AMY // green
+} PoeSisterType;
typedef enum {
- /* 0 */ POSISTER_MEG_REAL,
- /* 1 */ POSISTER_MEG_CLONE1,
- /* 2 */ POSISTER_MEG_CLONE2,
- /* 3 */ POSISTER_MEG_CLONE3,
-} EnPoSisterMegCloneID;
+ /* 0 */ POE_SISTERS_MEG_REAL,
+ /* 1 */ POE_SISTERS_MEG_CLONE1,
+ /* 2 */ POE_SISTERS_MEG_CLONE2,
+ /* 3 */ POE_SISTERS_MEG_CLONE3
+} PoeSisterMegCloneId;
+
+typedef enum PoeSisterBodyPart {
+ /* 0 */ POE_SISTERS_BODYPART_LEFT_ARM,
+ /* 1 */ POE_SISTERS_BODYPART_LEFT_HAND,
+ /* 2 */ POE_SISTERS_BODYPART_RIGHT_UPPER_ARM,
+ /* 3 */ POE_SISTERS_BODYPART_TORCH_ROOT,
+ /* 4 */ POE_SISTERS_BODYPART_MAIN_BODY_0,
+ /* 5 */ POE_SISTERS_BODYPART_MAIN_BODY_1,
+ /* 6 */ POE_SISTERS_BODYPART_FACE,
+ /* 7 */ POE_SISTERS_BODYPART_LOWER_BODY,
+ /* 8 */ POE_SISTERS_BODYPART_MAX
+} PoeSisterBodyPart;
typedef struct EnPoSisters {
/* 0x000 */ Actor actor;
@@ -54,11 +66,11 @@ typedef struct EnPoSisters {
s16 megAttackTimer; // delay until meg spin attacks player (negative frames counting up to 0)
s16 megClonesRemaining; // positive count of meg clones remaining
};
- /* 0x196 */ Vec3s jointTable[POSISTERS_LIMB_MAX];
- /* 0x1DE */ Vec3s morphTable[POSISTERS_LIMB_MAX];
+ /* 0x196 */ Vec3s jointTable[POE_SISTERS_LIMB_MAX];
+ /* 0x1DE */ Vec3s morphTable[POE_SISTERS_LIMB_MAX];
/* 0x226 */ Color_RGBA8 color;
/* 0x22C */ Vec3f firePos[8];
- /* 0x28C */ Vec3f limbPos[8]; // passed to Actor_DrawDamageEffects
+ /* 0x28C */ Vec3f bodyPartsPos[POE_SISTERS_BODYPART_MAX];
/* 0x2EC */ f32 megDistToPlayer;
/* 0x2F0 */ f32 drawDmgEffAlpha;
/* 0x2F4 */ f32 drawDmgEffScale;
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 f1b0f74d4..1c301a8bf 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,12 @@
* Description: Poe
*/
+#include "prevent_bss_reordering.h"
#include "z_en_poh.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.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_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_200 | ACTOR_FLAG_IGNORE_QUAKE)
#define THIS ((EnPoh*)thisx)
@@ -167,7 +169,7 @@ void EnPoh_Init(Actor* thisx, PlayState* play) {
255, 255, 255, 0);
SkelAnime_Init(play, &this->skelAnime, &object_po_Skel_0050D0, &object_po_Anim_000A60, this->jointTable,
this->morphTable, 21);
- this->actor.bgCheckFlags |= 0x400;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_PLAYER_400;
func_80B2D0E8(this);
}
@@ -216,7 +218,7 @@ void func_80B2CA4C(EnPoh* this) {
Animation_PlayLoop(&this->skelAnime, &object_po_Anim_0015B0);
this->unk_18E = Rand_S16Offset(2, 3);
this->actionFunc = func_80B2CAA4;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
void func_80B2CAA4(EnPoh* this, PlayState* play) {
@@ -234,7 +236,7 @@ void func_80B2CAA4(EnPoh* this, PlayState* play) {
}
if (this->unk_197 == 255) {
- func_800B9010(&this->actor, NA_SE_EN_PO_FLY - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_PO_FLY - SFX_FLAG);
}
}
@@ -247,13 +249,13 @@ void func_80B2CB60(EnPoh* this) {
void func_80B2CBBC(EnPoh* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
- Math_StepToF(&this->actor.speedXZ, 1.0f, 0.2f);
+ Math_StepToF(&this->actor.speed, 1.0f, 0.2f);
if (Animation_OnFrame(&this->skelAnime, 0.0f) && (this->unk_18E != 0)) {
this->unk_18E--;
}
- if (Actor_XZDistanceToPoint(&this->actor, &this->actor.home.pos) > 400.0f) {
- this->unk_192 = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) > 400.0f) {
+ this->unk_192 = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
}
Math_ScaledStepToS(&this->actor.world.rot.y, this->unk_192, 0x71C);
@@ -269,7 +271,7 @@ void func_80B2CBBC(EnPoh* this, PlayState* play) {
}
if (this->unk_197 == 255) {
- func_800B9010(&this->actor, NA_SE_EN_PO_FLY - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_PO_FLY - SFX_FLAG);
}
}
@@ -277,7 +279,7 @@ void func_80B2CD14(EnPoh* this) {
Animation_PlayLoop(&this->skelAnime, &object_po_Anim_000A60);
this->actionFunc = func_80B2CD64;
this->unk_18E = 0;
- this->actor.speedXZ = 2.0f;
+ this->actor.speed = 2.0f;
}
void func_80B2CD64(EnPoh* this, PlayState* play) {
@@ -308,22 +310,22 @@ void func_80B2CD64(EnPoh* this, PlayState* play) {
}
if (this->unk_197 == 255) {
- func_800B9010(&this->actor, NA_SE_EN_PO_FLY - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_PO_FLY - SFX_FLAG);
}
}
void func_80B2CEC8(EnPoh* this) {
Animation_MorphToLoop(&this->skelAnime, &object_po_Anim_0001A8, -6.0f);
this->unk_18E = 12;
- this->actor.speedXZ = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_LAUGH);
+ this->actor.speed = 0.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_LAUGH);
this->actionFunc = func_80B2CF28;
}
void func_80B2CF28(EnPoh* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (Animation_OnFrame(&this->skelAnime, 0.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_KANTERA);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_KANTERA);
if (this->unk_18E != 0) {
this->unk_18E--;
}
@@ -333,7 +335,7 @@ void func_80B2CF28(EnPoh* this, PlayState* play) {
if (this->unk_18E >= 10) {
Math_ScaledStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 0xAAA);
} else if (this->unk_18E == 9) {
- this->actor.speedXZ = 5.0f;
+ this->actor.speed = 5.0f;
this->skelAnime.playSpeed = 2.0f;
} else if (this->unk_18E == 0) {
func_80B2CB60(this);
@@ -345,13 +347,13 @@ void func_80B2CFF8(EnPoh* this) {
Animation_MorphToPlayOnce(&this->skelAnime, &object_po_Anim_0004EC, -6.0f);
func_800BE504(&this->actor, &this->colliderCylinder);
this->colliderCylinder.base.acFlags &= ~AC_ON;
- this->actor.speedXZ = 5.0f;
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 16);
+ this->actor.speed = 5.0f;
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 16);
this->actionFunc = func_80B2D07C;
}
void func_80B2D07C(EnPoh* this, PlayState* play) {
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f);
+ Math_StepToF(&this->actor.speed, 0.0f, 0.5f);
if (SkelAnime_Update(&this->skelAnime)) {
if (this->actor.colChkInfo.health != 0) {
func_80B2DAD0(this);
@@ -363,7 +365,7 @@ void func_80B2D07C(EnPoh* this, PlayState* play) {
void func_80B2D0E8(EnPoh* this) {
this->unk_197 = 0;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
Animation_PlayOnceSetSpeed(&this->skelAnime, &object_po_Anim_0011C4, 0.0f);
this->actionFunc = func_80B2D140;
}
@@ -372,24 +374,24 @@ void func_80B2D140(EnPoh* this, PlayState* play) {
if (SkelAnime_Update(&this->skelAnime)) {
this->unk_197 = 255;
this->unk_190 = Rand_S16Offset(700, 300);
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
func_80B2CB60(this);
} else if (this->skelAnime.curFrame > 10.0f) {
this->unk_197 = (this->skelAnime.curFrame - 10.0f) * 0.05f * 255.0f;
}
if ((this->skelAnime.playSpeed < 0.5f) && (this->actor.xzDistToPlayer < 280.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_APPEAR);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_APPEAR);
this->skelAnime.playSpeed = 1.0f;
}
}
void func_80B2D2C0(EnPoh* this) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->unk_18E = 0;
this->actor.hintId = TATL_HINT_ID_NONE;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actionFunc = func_80B2D300;
}
@@ -434,18 +436,18 @@ void func_80B2D300(EnPoh* this, PlayState* play) {
}
if (this->unk_18E < 18) {
- func_800B9010(&this->actor, NA_SE_EN_COMMON_EXTINCT_LEV - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_COMMON_EXTINCT_LEV - SFX_FLAG);
}
if (this->unk_18E == 18) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WIZ_DISAPPEAR);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WIZ_DISAPPEAR);
}
}
void func_80B2D5DC(EnPoh* this) {
Animation_PlayOnce(&this->skelAnime, &object_po_Anim_000A60);
this->actionFunc = func_80B2D628;
- this->actor.speedXZ = -5.0f;
+ this->actor.speed = -5.0f;
}
void func_80B2D628(EnPoh* this, PlayState* play) {
@@ -454,7 +456,7 @@ void func_80B2D628(EnPoh* this, PlayState* play) {
func_80B2CB60(this);
this->unk_18E = 23;
} else {
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f);
+ Math_StepToF(&this->actor.speed, 0.0f, 0.5f);
this->actor.shape.rot.y += 0x1000;
}
}
@@ -463,7 +465,7 @@ void func_80B2D694(EnPoh* this) {
Animation_PlayLoop(&this->skelAnime, &object_po_Anim_0015B0);
this->unk_192 = BINANG_ROT180(this->actor.world.rot.y);
this->actionFunc = func_80B2D6EC;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
void func_80B2D6EC(EnPoh* this, PlayState* play) {
@@ -482,10 +484,10 @@ void func_80B2D6EC(EnPoh* this, PlayState* play) {
void func_80B2D76C(EnPoh* this) {
this->unk_18C = 32;
this->unk_192 = 0x2000;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_DISAPPEAR);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_LAUGH);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_DISAPPEAR);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_LAUGH);
this->colliderCylinder.base.acFlags &= ~AC_ON;
this->actionFunc = func_80B2D7D4;
}
@@ -513,9 +515,9 @@ void func_80B2D7D4(EnPoh* this, PlayState* play) {
void func_80B2D924(EnPoh* this) {
this->unk_18C = 0;
this->unk_192 = 0x2000;
- this->actor.speedXZ = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_APPEAR);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_LAUGH);
+ this->actor.speed = 0.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_APPEAR);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_LAUGH);
this->colliderCylinder.base.acFlags &= ~AC_ON;
this->actionFunc = func_80B2D980;
}
@@ -539,7 +541,7 @@ void func_80B2D980(EnPoh* this, PlayState* play) {
void func_80B2DAD0(EnPoh* this) {
Animation_MorphToLoop(&this->skelAnime, &object_po_Anim_0006E0, -5.0f);
- this->actor.speedXZ = 5.0f;
+ this->actor.speed = 5.0f;
this->actor.world.rot.y = BINANG_ROT180(this->actor.shape.rot.y);
this->colliderCylinder.base.acFlags |= AC_ON;
this->unk_18E = 200;
@@ -560,7 +562,7 @@ void func_80B2DB44(EnPoh* this, PlayState* play) {
this->actor.world.rot.y = this->actor.shape.rot.y;
func_80B2CB60(this);
}
- func_800B9010(&this->actor, NA_SE_EN_PO_AWAY - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_PO_AWAY - SFX_FLAG);
}
void func_80B2DC50(EnPoh* this, PlayState* play) {
@@ -577,18 +579,18 @@ void func_80B2DC50(EnPoh* this, PlayState* play) {
this->actor.world.pos.y -= 15.0f;
this->actor.shape.rot.x = -0x8000;
func_800BC154(play, &play->actorCtx, &this->actor, 8);
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_4);
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY);
this->actionFunc = func_80B2DD2C;
}
void func_80B2DD2C(EnPoh* this, PlayState* play) {
- if ((this->actor.bgCheckFlags & 1) || (this->actor.floorHeight <= BGCHECK_Y_MIN)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (this->actor.floorHeight <= BGCHECK_Y_MIN)) {
EffectSsHahen_SpawnBurst(play, &this->actor.world.pos, 6.0f, 0, 1, 1, 15, OBJECT_PO, 10, object_po_DL_002D28);
func_80B2E0B0(this);
}
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) {
@@ -629,7 +631,7 @@ void func_80B2E0B0(EnPoh* this) {
this->actor.home.pos.y = this->actor.world.pos.y;
this->actor.scale.x = 0.0f;
this->actor.scale.y = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_METAL_BOX_BOUND);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_METAL_BOX_BOUND);
this->actionFunc = func_80B2E180;
}
@@ -646,7 +648,7 @@ void func_80B2E1D8(EnPoh* this) {
Actor_SetFocus(&this->actor, -10.0f);
this->unk_18E = 200;
this->unk_18D = 32;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actionFunc = func_80B2E230;
}
@@ -663,7 +665,7 @@ void func_80B2E230(EnPoh* this, PlayState* play) {
return;
}
- Actor_PickUp(&this->actor, play, GI_MAX, 35.0f, 60.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_MAX, 35.0f, 60.0f);
this->actor.world.pos.y = (Math_SinS(this->unk_18D * 0x800) * 5.0f) + this->actor.home.pos.y;
if (this->unk_18D) {
this->unk_18D--;
@@ -680,7 +682,7 @@ void func_80B2E230(EnPoh* this, PlayState* play) {
void func_80B2E3B0(EnPoh* this) {
AudioSfx_StopByPosAndId(&this->actor.projectedPos, NA_SE_EN_PO_BIG_CRY - SFX_FLAG);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_LAUGH);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_LAUGH);
this->actionFunc = func_80B2E3F8;
}
@@ -696,9 +698,9 @@ void func_80B2E438(EnPoh* this, PlayState* play) {
this->colliderCylinder.base.acFlags &= ~AC_HIT;
if (!Actor_ApplyDamage(&this->actor)) {
Enemy_StartFinishingBlow(play, &this->actor);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_DEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_DEAD);
} else if (this->actor.colChkInfo.damage != 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PO_DAMAGE);
}
if (this->actor.colChkInfo.damageEffect != 14) {
@@ -710,7 +712,8 @@ void func_80B2E438(EnPoh* this, PlayState* play) {
this->drawDmgEffScale = 0.45f;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->colliderCylinder.info.bumper.hitPos.x,
this->colliderCylinder.info.bumper.hitPos.y,
- this->colliderCylinder.info.bumper.hitPos.z, 0, 0, 0, CLEAR_TAG_LARGE_LIGHT_RAYS);
+ this->colliderCylinder.info.bumper.hitPos.z, 0, 0, 0,
+ CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
}
func_80B2CFF8(this);
}
@@ -726,7 +729,7 @@ void func_80B2E55C(EnPoh* this) {
}
if (this->unk_197 == 255) {
- if (this->actor.isTargeted) {
+ if (this->actor.isLockedOn) {
this->unk_18C++;
this->unk_18C = CLAMP_MAX(this->unk_18C, 20);
} else {
@@ -861,16 +864,38 @@ s32 EnPoh_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
return false;
}
+static s8 sLimbToBodyParts[OBJECT_PO_LIMB_MAX] = {
+ BODYPART_NONE, // OBJECT_PO_LIMB_NONE
+ BODYPART_NONE, // OBJECT_PO_LIMB_01
+ BODYPART_NONE, // OBJECT_PO_LIMB_02
+ BODYPART_NONE, // OBJECT_PO_LIMB_03
+ ENPOH_BODYPART_4, // OBJECT_PO_LIMB_04
+ ENPOH_BODYPART_5, // OBJECT_PO_LIMB_05
+ BODYPART_NONE, // OBJECT_PO_LIMB_06
+ BODYPART_NONE, // OBJECT_PO_LIMB_07
+ BODYPART_NONE, // OBJECT_PO_LIMB_08
+ ENPOH_BODYPART_0, // OBJECT_PO_LIMB_09
+ ENPOH_BODYPART_1, // OBJECT_PO_LIMB_0A
+ BODYPART_NONE, // OBJECT_PO_LIMB_0B
+ BODYPART_NONE, // OBJECT_PO_LIMB_0C
+ BODYPART_NONE, // OBJECT_PO_LIMB_0D
+ BODYPART_NONE, // OBJECT_PO_LIMB_0E
+ BODYPART_NONE, // OBJECT_PO_LIMB_0F
+ ENPOH_BODYPART_2, // OBJECT_PO_LIMB_10
+ BODYPART_NONE, // OBJECT_PO_LIMB_11
+ BODYPART_NONE, // OBJECT_PO_LIMB_12
+ ENPOH_BODYPART_3, // OBJECT_PO_LIMB_13
+ BODYPART_NONE, // OBJECT_PO_LIMB_14
+};
+
+static Vec3f D_80B2F734[] = {
+ { -600.0f, 500.0f, 1700.0f }, // ENPOH_BODYPART_7
+ { -600.0f, 500.0f, -1700.0f }, // ENPOH_BODYPART_8
+ { 1000.0f, 1700.0f, 0.0f }, // ENPOH_BODYPART_9
+};
+
void EnPoh_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx, Gfx** gfx) {
- static s8 D_80B2F71C[] = {
- -1, -1, -1, -1, 4, 5, -1, -1, -1, 0, 1, -1, -1, -1, -1, -1, 2, -1, -1, 3, -1,
- };
- static Vec3f D_80B2F734[] = {
- { -600.0f, 500.0f, 1700.0f },
- { -600.0f, 500.0f, -1700.0f },
- { 1000.0f, 1700.0f, 0.0f },
- };
- s32 temp_s3;
+ s32 bodyPartIndex;
Vec3f sp60;
EnPoh* this = THIS;
s32 pad;
@@ -894,21 +919,21 @@ void EnPoh_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
this->unk_199, this->unk_19A, this->unk_19B * (200.0f / 255.0f));
}
- temp_s3 = D_80B2F71C[limbIndex];
- if (temp_s3 != -1) {
- if (temp_s3 < 4) {
- Matrix_MultZero(&this->limbPos[temp_s3]);
- } else if (temp_s3 == 4) {
- Matrix_MultVecX(2000.0f, &this->limbPos[temp_s3]);
+ bodyPartIndex = sLimbToBodyParts[limbIndex];
+ if (bodyPartIndex != BODYPART_NONE) {
+ if (bodyPartIndex <= ENPOH_BODYPART_3) {
+ Matrix_MultZero(&this->bodyPartsPos[bodyPartIndex]);
+ } else if (bodyPartIndex == ENPOH_BODYPART_4) {
+ Matrix_MultVecX(2000.0f, &this->bodyPartsPos[bodyPartIndex]);
} else {
s32 i;
- Vec3f* vec = &this->limbPos[temp_s3 + 2];
+ Vec3f* vec = &this->bodyPartsPos[bodyPartIndex + 2];
Vec3f* vec2 = &D_80B2F734[0];
- Matrix_MultVecX(-2000.0f, &this->limbPos[temp_s3]);
- Matrix_MultVecY(-2000.0f, &this->limbPos[temp_s3 + 1]);
+ Matrix_MultVecX(-2000.0f, &this->bodyPartsPos[bodyPartIndex]); // ENPOH_BODYPART_5
+ Matrix_MultVecY(-2000.0f, &this->bodyPartsPos[bodyPartIndex + 1]); // ENPOH_BODYPART_6
- for (i = temp_s3 + 2; i < ARRAY_COUNT(this->limbPos); i++, vec++, vec2++) {
+ for (i = bodyPartIndex + 2; i < ENPOH_BODYPART_MAX; i++, vec++, vec2++) {
Matrix_MultVec3f(vec2, vec);
}
}
@@ -925,7 +950,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 +961,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 +969,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]);
@@ -956,7 +981,7 @@ void EnPoh_Draw(Actor* thisx, PlayState* play) {
gSPDisplayList(&gfx[3], object_po_DL_002D28);
POLY_OPA_DISP = &gfx[4];
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos),
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, ENPOH_BODYPART_MAX,
this->actor.scale.x * 100.0f * this->drawDmgEffScale, 0.0f, this->drawDmgEffAlpha,
ACTOR_DRAW_DMGEFF_LIGHT_ORBS);
@@ -985,7 +1010,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 +1022,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 +1030,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_Poh/z_en_poh.h b/src/overlays/actors/ovl_En_Poh/z_en_poh.h
index b07be6195..5f7439e4a 100644
--- a/src/overlays/actors/ovl_En_Poh/z_en_poh.h
+++ b/src/overlays/actors/ovl_En_Poh/z_en_poh.h
@@ -7,6 +7,20 @@ struct EnPoh;
typedef void (*EnPohActionFunc)(struct EnPoh*, PlayState*);
+typedef enum EnPohBodyPart {
+ /* 0 */ ENPOH_BODYPART_0,
+ /* 1 */ ENPOH_BODYPART_1,
+ /* 2 */ ENPOH_BODYPART_2,
+ /* 3 */ ENPOH_BODYPART_3,
+ /* 4 */ ENPOH_BODYPART_4,
+ /* 5 */ ENPOH_BODYPART_5,
+ /* 6 */ ENPOH_BODYPART_6,
+ /* 7 */ ENPOH_BODYPART_7,
+ /* 8 */ ENPOH_BODYPART_8,
+ /* 9 */ ENPOH_BODYPART_9,
+ /* 10 */ ENPOH_BODYPART_MAX
+} EnPohBodyPart;
+
typedef struct EnPoh {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
@@ -28,7 +42,7 @@ typedef struct EnPoh {
/* 0x21A */ Vec3s morphTable[21];
/* 0x298 */ f32 drawDmgEffAlpha;
/* 0x29C */ f32 drawDmgEffScale;
- /* 0x2A0 */ Vec3f limbPos[10];
+ /* 0x2A0 */ Vec3f bodyPartsPos[ENPOH_BODYPART_MAX];
/* 0x318 */ LightNode* lightNode;
/* 0x31C */ LightInfo lightInfo;
/* 0x32C */ ColliderCylinder colliderCylinder;
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 fad487e62..1c6774b1a 100644
--- a/src/overlays/actors/ovl_En_Pp/z_en_pp.c
+++ b/src/overlays/actors/ovl_En_Pp/z_en_pp.c
@@ -5,9 +5,10 @@
*/
#include "z_en_pp.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY)
#define THIS ((EnPp*)thisx)
@@ -39,7 +40,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 +57,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 +78,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 = {
@@ -234,7 +235,7 @@ void EnPp_Init(Actor* thisx, PlayState* play) {
EnPp* this = THIS;
EffectBlureInit1 blureInit;
- this->actor.targetMode = 4;
+ this->actor.targetMode = TARGET_MODE_4;
this->actor.colChkInfo.mass = 60;
this->actor.colChkInfo.health = 3;
this->actor.colChkInfo.damageTable = &sDamageTable;
@@ -296,10 +297,6 @@ void EnPp_Init(Actor* thisx, PlayState* play) {
this->bodyCollider.elements[0].dim.modelSphere.center.y = -400;
this->bodyColliderElements[0].info.bumperFlags |= BUMP_HOOKABLE;
this->maskCollider.elements[0].info.toucher.damage = 0x10;
- //! FAKE: Needed to fix some regs
- //! https://decomp.me/scratch/6Yd1B
- if (this->actor.world.rot.z) {}
- if (this->actor.world.rot.z) {}
}
Collider_InitQuad(play, &this->hornCollider);
@@ -397,17 +394,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));
@@ -446,27 +443,27 @@ void EnPp_PlaySfxForAnimation(EnPp* this) {
case EN_PP_ANIM_WALK:
case EN_PP_ANIM_TURN_TO_FACE_PLAYER:
if (Animation_OnFrame(&this->skelAnime, 0.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_HIPLOOP_FOOTSTEP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_HIPLOOP_FOOTSTEP);
}
break;
case EN_PP_ANIM_WIND_UP:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_HIPLOOP_FOOT - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_HIPLOOP_FOOT - SFX_FLAG);
break;
case EN_PP_ANIM_CHARGE:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_HIPLOOP_RUN - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_HIPLOOP_RUN - SFX_FLAG);
break;
case EN_PP_ANIM_ATTACK:
if (Animation_OnFrame(&this->skelAnime, 0.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_HIPLOOP_PAUSE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_HIPLOOP_PAUSE);
}
break;
case EN_PP_ANIM_ROAR:
if (Animation_OnFrame(&this->skelAnime, 6.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_HIPLOOP_PAUSE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_HIPLOOP_PAUSE);
}
break;
@@ -534,10 +531,10 @@ 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.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->animIndex != EN_PP_ANIM_IDLE) {
EnPp_ChangeAnim(this, EN_PP_ANIM_IDLE);
}
@@ -559,14 +556,14 @@ void EnPp_Idle(EnPp* this, PlayState* play) {
EnPp_ChangeAnim(this, EN_PP_ANIM_WALK);
}
- if ((this->maskBounceRotationalVelocity < 0x64) &&
+ if ((this->maskBounceAngularVelocity < 0x64) &&
(fabsf(this->actor.world.rot.y - this->targetRotY) < 100.0f)) {
- Math_ApproachF(&this->actor.speedXZ, 1.0f, 0.3f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 1.0f, 0.3f, 1.0f);
}
- Math_SmoothStepToS(&this->actor.world.rot.y, this->targetRotY, 1,
- (this->maskBounceRotationalVelocity + 0x258), 0);
- Math_SmoothStepToS(&this->maskBounceRotationalVelocity, 0, 1, 0x1F4, 0);
+ Math_SmoothStepToS(&this->actor.world.rot.y, this->targetRotY, 1, this->maskBounceAngularVelocity + 0x258,
+ 0);
+ Math_SmoothStepToS(&this->maskBounceAngularVelocity, 0, 1, 0x1F4, 0);
}
}
}
@@ -605,13 +602,12 @@ void EnPp_Charge(EnPp* this, PlayState* play) {
this->targetPos.z += distanceFromWorldPos.z;
}
- Math_SmoothStepToS(&this->actor.world.rot.y, this->targetRotY, 1, (this->maskBounceRotationalVelocity + 0x7D0),
- 0);
+ Math_SmoothStepToS(&this->actor.world.rot.y, this->targetRotY, 1, this->maskBounceAngularVelocity + 0x7D0, 0);
}
- Math_SmoothStepToS(&this->maskBounceRotationalVelocity, 0, 1, 0x1F4, 0);
+ Math_SmoothStepToS(&this->maskBounceAngularVelocity, 0, 1, 0x1F4, 0);
if (!this->actionVar.isCharging) {
- Math_ApproachZeroF(&this->actor.speedXZ, 0.5f, 1.0f);
+ Math_ApproachZeroF(&this->actor.speed, 0.5f, 1.0f);
if (fabsf(this->actor.world.rot.y - this->targetRotY) < 100.0f) {
if (this->chargesInStraightLines) {
this->actor.world.rot.y = this->targetRotY;
@@ -629,13 +625,13 @@ void EnPp_Charge(EnPp* this, PlayState* play) {
}
} else if (this->animIndex == EN_PP_ANIM_CHARGE) {
if (EnPp_CheckCollision(this, play) != EN_PP_COLLISION_RESULT_OK) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
EnPp_SetupRoar(this);
return;
}
if (!this->chargesInStraightLines) {
- Math_ApproachF(&this->actor.speedXZ, 10.0f, 0.3f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 10.0f, 0.3f, 1.0f);
} else {
Math_ApproachF(&this->actor.world.pos.x, this->targetPos.x, 0.5f,
fabsf(Math_SinS(this->targetRotY) * this->chargeAndBounceSpeed));
@@ -661,9 +657,9 @@ void EnPp_Charge(EnPp* this, PlayState* play) {
return;
} else {
if (EN_PP_GET_TYPE(&this->actor) != EN_PP_TYPE_MASKED) {
- this->actor.speedXZ *= -1.0f;
+ this->actor.speed *= -1.0f;
} else {
- this->actor.speedXZ *= -0.5f;
+ this->actor.speed *= -0.5f;
}
EnPp_SetupRoar(this);
@@ -682,7 +678,7 @@ void EnPp_SetupAttack(EnPp* this) {
EnPp_ChangeAnim(this, EN_PP_ANIM_ATTACK);
this->hornColliderOn = true;
this->action = EN_PP_ACTION_ATTACK;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = EnPp_Attack;
}
@@ -711,7 +707,7 @@ void EnPp_SetupBounced(EnPp* this) {
this->targetPos.x += distanceFromWorldPos.x;
this->targetPos.z += distanceFromWorldPos.z;
EnPp_ChangeAnim(this, EN_PP_ANIM_DAMAGE);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->action = EN_PP_ACTION_BOUNCED;
this->chargeAndBounceSpeed = 14.0f;
this->actionFunc = EnPp_Bounced;
@@ -751,7 +747,7 @@ void EnPp_Roar(EnPp* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (EnPp_CheckCollision(this, play) == EN_PP_COLLISION_RESULT_ABOUT_TO_RUN_OFF_LEDGE) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->chargeAndBounceSpeed = 0.0f;
}
@@ -771,8 +767,8 @@ void EnPp_Roar(EnPp* this, PlayState* play) {
}
}
- Math_ApproachZeroF(&this->actor.speedXZ, 0.5f, 1.0f);
- if ((this->actor.speedXZ > 0.3f) && (this->secondaryTimer == 0)) {
+ Math_ApproachZeroF(&this->actor.speed, 0.5f, 1.0f);
+ if ((this->actor.speed > 0.3f) && (this->secondaryTimer == 0)) {
EnPp_SpawnDust(this, play);
this->secondaryTimer = 3;
}
@@ -793,7 +789,7 @@ void EnPp_SetupJump(EnPp* this) {
this->secondaryTimer = 0;
this->actionVar.hasLandedFromJump = false;
this->timer = this->secondaryTimer;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.velocity.y = 20.0f;
this->actor.gravity = -3.0f;
EnPp_ChangeAnim(this, EN_PP_ANIM_JUMP);
@@ -836,7 +832,7 @@ void EnPp_Jump(EnPp* this, PlayState* play) {
Math_SmoothStepToS(&this->actor.world.rot.y, this->targetRotY, 1, 0x1388, 0);
if (!this->actionVar.hasLandedFromJump) {
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->actionVar.hasLandedFromJump = true;
EnPp_ChangeAnim(this, EN_PP_ANIM_LAND);
}
@@ -853,7 +849,7 @@ void EnPp_SetupStunnedOrFrozen(EnPp* this) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
}
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->action = EN_PP_ACTION_STUNNED_OR_FROZEN;
this->actionFunc = EnPp_StunnedOrFrozen;
}
@@ -872,8 +868,7 @@ void EnPp_StunnedOrFrozen(EnPp* this, PlayState* play) {
if ((this->secondaryTimer == 0) && (this->drawDmgEffTimer == 0)) {
if ((this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX) ||
(this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) {
- Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, ARRAY_COUNT(this->bodyPartsPos), 2, 0.7f,
- 0.4f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, EN_PP_BODYPART_MAX, 2, 0.7f, 0.4f);
this->drawDmgEffTimer = 0;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
}
@@ -909,12 +904,12 @@ void EnPp_SetupDamaged(EnPp* this, PlayState* play) {
if (((this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX) ||
(this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) &&
(this->drawDmgEffTimer != 0)) {
- Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, ARRAY_COUNT(this->bodyPartsPos), 2, 0.7f, 0.4f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, EN_PP_BODYPART_MAX, 2, 0.7f, 0.4f);
this->drawDmgEffTimer = 0;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
}
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
this->secondaryTimer = 0;
EnPp_ChangeAnim(this, EN_PP_ANIM_DAMAGE);
this->targetRotY = this->actor.yawTowardsPlayer + 0x8000;
@@ -922,10 +917,10 @@ void EnPp_SetupDamaged(EnPp* this, PlayState* play) {
if (EnPp_CheckCollision(this, play) == EN_PP_COLLISION_RESULT_ABOUT_TO_RUN_OFF_LEDGE) {
this->damagedVelocity.z = 0.0f;
this->damagedVelocity.x = 0.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_HIPLOOP_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_HIPLOOP_DAMAGE);
this->actionFunc = EnPp_Damaged;
}
@@ -957,7 +952,7 @@ void EnPp_Damaged(EnPp* this, PlayState* play) {
if (EnPp_CheckCollision(this, play) == EN_PP_COLLISION_RESULT_ABOUT_TO_RUN_OFF_LEDGE) {
this->damagedVelocity.z = 0.0f;
this->damagedVelocity.x = 0.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
if ((fabsf(this->actor.home.pos.y - this->actor.world.pos.y) > 100.0f) &&
@@ -989,7 +984,7 @@ void EnPp_SetupDead(EnPp* this, PlayState* play) {
this->targetPos.z += deadVelocity.z;
}
- this->maskBounceRotationalVelocity = this->actionVar.isCharging = 0;
+ this->maskBounceAngularVelocity = this->actionVar.isCharging = 0;
EnPp_ChangeAnim(this, EN_PP_ANIM_DAMAGE);
this->timer = 15;
if (((this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX) ||
@@ -998,11 +993,11 @@ void EnPp_SetupDead(EnPp* this, PlayState* play) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
}
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 25);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 25);
Enemy_StartFinishingBlow(play, &this->actor);
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 30, NA_SE_EN_HIPLOOP_DEAD);
- this->actor.flags |= ACTOR_FLAG_8000000;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->action = EN_PP_ACTION_DEAD;
this->actionFunc = EnPp_Dead;
}
@@ -1029,7 +1024,7 @@ void EnPp_Dead(EnPp* this, PlayState* play) {
return;
}
- Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, ARRAY_COUNT(this->bodyPartsPos), 2, 0.7f, 0.4f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, EN_PP_BODYPART_MAX, 2, 0.7f, 0.4f);
this->drawDmgEffTimer = 0;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
}
@@ -1046,8 +1041,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);
}
@@ -1096,8 +1091,8 @@ void EnPp_Mask_SetupDetach(EnPp* this, PlayState* play) {
}
this->actor.gravity = 0.0f;
- this->actor.flags |= ACTOR_FLAG_8000000;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actionVar.maskDetachState = EN_PP_MASK_DETACH_STATE_START;
EnPp_ChangeAnim(this, EN_PP_ANIM_IDLE);
SkelAnime_Update(&this->skelAnime);
@@ -1117,7 +1112,7 @@ void EnPp_Mask_Detach(EnPp* this, PlayState* play) {
this->maskAccelY = 50.0f;
this->maskVelocity.y = -230.0f;
this->maskVelocity.x = -150.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_HIPLOOP_MASC_OFF);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_HIPLOOP_MASC_OFF);
this->actionVar.maskDetachState = EN_PP_MASK_DETACH_STATE_FALL;
break;
@@ -1143,9 +1138,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);
}
@@ -1169,11 +1164,11 @@ void EnPp_BodyPart_SetupMove(EnPp* this) {
this->actor.velocity.y = Rand_ZeroFloat(5.0f) + 13.0f;
this->actor.gravity = -2.0f;
this->timer = Rand_S16Offset(30, 30);
- this->deadBodyPartRotationalVelocity.x = (this->deadBodyPartIndex * 0x2E) + 0xFF00;
- this->deadBodyPartRotationalVelocity.z = (this->deadBodyPartIndex * 0x2E) + 0xFF00;
+ this->deadBodyPartAngularVelocity.x = (this->deadBodyPartIndex * 0x2E) + 0xFF00;
+ this->deadBodyPartAngularVelocity.z = (this->deadBodyPartIndex * 0x2E) + 0xFF00;
if (EN_PP_GET_TYPE(&this->actor) != EN_PP_TYPE_BODY_PART_BODY) {
- this->actor.speedXZ = Rand_ZeroFloat(4.0f) + 4.0f;
- this->actor.world.rot.y = ((s32)randPlusMinusPoint5Scaled(223.0f) + 0x1999) * this->deadBodyPartIndex;
+ this->actor.speed = Rand_ZeroFloat(4.0f) + 4.0f;
+ this->actor.world.rot.y = ((s32)Rand_CenteredFloat(223.0f) + 0x1999) * this->deadBodyPartIndex;
}
this->action = EN_PP_ACTION_BODY_PART_MOVE;
@@ -1192,18 +1187,18 @@ void EnPp_BodyPart_Move(EnPp* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (EN_PP_GET_TYPE(&this->actor) == EN_PP_TYPE_BODY_PART_BODY) {
- this->deadBodyPartDrawDmgEffCount = 10;
- for (i = 0; i < ARRAY_COUNT(this->deadBodyPartDrawDmgEffPos); i++) {
- Math_Vec3f_Copy(&this->deadBodyPartDrawDmgEffPos[i], &this->deadBodyPartPos);
- this->deadBodyPartDrawDmgEffPos[i].x += Math_SinS(0xCCC * i) * 15.0f;
- this->deadBodyPartDrawDmgEffPos[i].y += -5.0f;
- this->deadBodyPartDrawDmgEffPos[i].z += Math_CosS(0xCCC * i) * 15.0f;
+ this->deadBodyPartCount = EN_PP_DEAD_BODYPART_MAX;
+ for (i = 0; i < EN_PP_DEAD_BODYPART_MAX; i++) {
+ Math_Vec3f_Copy(&this->deadBodyPartsPos[i], &this->deadBodyPartPos);
+ this->deadBodyPartsPos[i].x += Math_SinS(0xCCC * i) * 15.0f;
+ this->deadBodyPartsPos[i].y += -5.0f;
+ this->deadBodyPartsPos[i].z += Math_CosS(0xCCC * i) * 15.0f;
}
} else {
- Math_Vec3f_Copy(&this->deadBodyPartDrawDmgEffPos[0], &this->deadBodyPartPos);
- this->deadBodyPartDrawDmgEffCount = 1;
- this->actor.shape.rot.x += this->deadBodyPartRotationalVelocity.x;
- this->actor.shape.rot.z += this->deadBodyPartRotationalVelocity.z;
+ Math_Vec3f_Copy(&this->deadBodyPartsPos[0], &this->deadBodyPartPos);
+ this->deadBodyPartCount = 1;
+ this->actor.shape.rot.x += this->deadBodyPartAngularVelocity.x;
+ this->actor.shape.rot.z += this->deadBodyPartAngularVelocity.z;
}
if (WaterBox_GetSurface1(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z, &waterSurface,
@@ -1213,8 +1208,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 {
@@ -1224,7 +1219,7 @@ void EnPp_BodyPart_Move(EnPp* this, PlayState* play) {
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 50, NA_SE_EV_BOMB_DROP_WATER);
}
- if ((this->timer == 0) || (this->actor.bgCheckFlags & 1)) {
+ if ((this->timer == 0) || (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
Actor_Kill(&this->actor);
}
}
@@ -1276,8 +1271,9 @@ void EnPp_UpdateDamage(EnPp* this, PlayState* play) {
(this->drawDmgEffTimer == 0)) {
this->drawDmgEffTimer = 40;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_SMALL;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA,
+ 40);
EnPp_SetupStunnedOrFrozen(this);
}
return;
@@ -1285,8 +1281,9 @@ void EnPp_UpdateDamage(EnPp* this, PlayState* play) {
if (((this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_SFX) &&
(this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) ||
(this->drawDmgEffTimer == 0)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA,
+ 40);
this->secondaryTimer = 40;
EnPp_SetupStunnedOrFrozen(this);
}
@@ -1295,7 +1292,7 @@ void EnPp_UpdateDamage(EnPp* this, PlayState* play) {
(this->actor.colChkInfo.damageEffect != EN_PP_DMGEFF_JUMP)) {
attackDealsDamage = true;
this->hasBeenDamaged = true;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->actor.colChkInfo.damageEffect == EN_PP_DMGEFF_FIRE) {
this->drawDmgEffTimer = 40;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
@@ -1322,8 +1319,9 @@ void EnPp_UpdateDamage(EnPp* this, PlayState* play) {
(this->drawDmgEffTimer == 0))) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->actor.focus.pos.x,
this->actor.focus.pos.y, this->actor.focus.pos.z, 0, 0, 0,
- CLEAR_TAG_LARGE_LIGHT_RAYS);
- Actor_SetColorFilter(&this->actor, 0x8000, 255, 0, 25);
+ CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_GRAY, 255, COLORFILTER_BUFFLAG_OPA,
+ 25);
this->drawDmgEffTimer = 20;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_LIGHT_ORBS;
}
@@ -1349,17 +1347,17 @@ void EnPp_UpdateDamage(EnPp* this, PlayState* play) {
(this->action == EN_PP_ACTION_ROAR))) {
this->secondaryTimer = 0;
this->timer = 10;
- this->maskBounceRotationalVelocity = 0x20D0;
- this->actor.speedXZ = 0.0f;
+ this->maskBounceAngularVelocity = 0x20D0;
+ this->actor.speed = 0.0f;
if (this->action == EN_PP_ACTION_CHARGE) {
this->actionVar.isCharging = false;
EnPp_ChangeAnim(this, EN_PP_ANIM_TURN_TO_FACE_PLAYER);
- this->maskBounceRotationalVelocity = 0x1B58;
+ this->maskBounceAngularVelocity = 0x1B58;
}
this->targetRotY = this->actor.yawTowardsPlayer;
if (EN_PP_GET_TYPE(&this->actor) == EN_PP_TYPE_MASKED) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_SHIELD_BOUND);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_SHIELD_BOUND);
}
}
}
@@ -1413,7 +1411,7 @@ void EnPp_Update(Actor* thisx, PlayState* play) {
if (this->action != EN_PP_ACTION_BODY_PART_MOVE) {
EnPp_UpdateDamage(this, play);
Actor_SetFocus(&this->actor, 40.0f);
- if ((this->action == EN_PP_ACTION_DEAD) || (this->actor.bgCheckFlags & 1)) {
+ if ((this->action == EN_PP_ACTION_DEAD) || (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
this->actor.world.pos.x += this->damagedVelocity.x;
this->actor.world.pos.z += this->damagedVelocity.z;
Math_ApproachZeroF(&this->damagedVelocity.x, 1.0f, 2.0f);
@@ -1421,7 +1419,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;
}
@@ -1539,10 +1539,10 @@ void EnPp_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
(limbIndex == HIPLOOP_LIMB_CENTER_WING_BASE) || (limbIndex == HIPLOOP_LIMB_CENTER_WING_MIDDLE) ||
(limbIndex == HIPLOOP_LIMB_BACK_LEFT_LOWER_LEG) || (limbIndex == HIPLOOP_LIMB_RIGHT_EYE) ||
(limbIndex == HIPLOOP_LIMB_LEFT_EYE)) {
- Matrix_MultZero(&this->bodyPartsPos[this->bodyPartsPosIndex]);
- this->bodyPartsPosIndex++;
- if (this->bodyPartsPosIndex >= ARRAY_COUNT(this->bodyPartsPos)) {
- this->bodyPartsPosIndex = 0;
+ Matrix_MultZero(&this->bodyPartsPos[this->bodyPartIndex]);
+ this->bodyPartIndex++;
+ if (this->bodyPartIndex >= EN_PP_BODYPART_MAX) {
+ this->bodyPartIndex = 0;
}
if ((this->action == EN_PP_ACTION_SPAWN_BODY_PARTS) && (this->deadBodyPartsSpawnedCount < 6) &&
@@ -1568,19 +1568,19 @@ 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);
- if (this->deadBodyPartDrawDmgEffCount != 0) {
+ if (this->deadBodyPartCount != 0) {
scale = 0.4f;
if (EN_PP_GET_TYPE(&this->actor) == EN_PP_TYPE_BODY_PART_BODY) {
scale = 0.6f;
}
- Actor_DrawDamageEffects(play, &this->actor, this->deadBodyPartDrawDmgEffPos, this->deadBodyPartDrawDmgEffCount,
- scale, scale, 1.0f, ACTOR_DRAW_DMGEFF_BLUE_FIRE);
+ Actor_DrawDamageEffects(play, &this->actor, this->deadBodyPartsPos, this->deadBodyPartCount, scale, scale, 1.0f,
+ ACTOR_DRAW_DMGEFF_BLUE_FIRE);
}
if (this->drawDmgEffTimer != 0) {
@@ -1598,15 +1598,15 @@ void EnPp_Draw(Actor* thisx, PlayState* play) {
this->drawDmgEffFrozenSteamScale = 0.8f;
}
- Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, ARRAY_COUNT(this->bodyPartsPos),
- this->drawDmgEffScale, this->drawDmgEffFrozenSteamScale, alpha, this->drawDmgEffType);
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, EN_PP_BODYPART_MAX, this->drawDmgEffScale,
+ this->drawDmgEffFrozenSteamScale, alpha, this->drawDmgEffType);
}
if (this->floorPolyForCircleShadow != NULL) {
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..2f975a68c 100644
--- a/src/overlays/actors/ovl_En_Pp/z_en_pp.h
+++ b/src/overlays/actors/ovl_En_Pp/z_en_pp.h
@@ -22,9 +22,38 @@ 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 enum EnPpBodyPart {
+ /* 0 */ EN_PP_BODYPART_0,
+ /* 1 */ EN_PP_BODYPART_1,
+ /* 2 */ EN_PP_BODYPART_2,
+ /* 3 */ EN_PP_BODYPART_3,
+ /* 4 */ EN_PP_BODYPART_4,
+ /* 5 */ EN_PP_BODYPART_5,
+ /* 6 */ EN_PP_BODYPART_6,
+ /* 7 */ EN_PP_BODYPART_7,
+ /* 8 */ EN_PP_BODYPART_8,
+ /* 9 */ EN_PP_BODYPART_9,
+ /* 10 */ EN_PP_BODYPART_10,
+ /* 11 */ EN_PP_BODYPART_MAX
+} EnPpBodyPart;
+
+typedef enum EnPpDeadBodyPart {
+ /* 0 */ EN_PP_DEAD_BODYPART_0,
+ /* 1 */ EN_PP_DEAD_BODYPART_1,
+ /* 2 */ EN_PP_DEAD_BODYPART_2,
+ /* 3 */ EN_PP_DEAD_BODYPART_3,
+ /* 4 */ EN_PP_DEAD_BODYPART_4,
+ /* 5 */ EN_PP_DEAD_BODYPART_5,
+ /* 6 */ EN_PP_DEAD_BODYPART_6,
+ /* 7 */ EN_PP_DEAD_BODYPART_7,
+ /* 8 */ EN_PP_DEAD_BODYPART_8,
+ /* 9 */ EN_PP_DEAD_BODYPART_9,
+ /* 10 */ EN_PP_DEAD_BODYPART_MAX
+} EnPpDeadBodyPart;
+
typedef struct EnPp {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
@@ -44,7 +73,7 @@ typedef struct EnPp {
s16 hasLandedFromJump;
s16 maskDetachState;
} actionVar;
- /* 0x2D4 */ s16 maskBounceRotationalVelocity; // Controls the speed that the Hiploop rotates to face the player when an attack bounces off the mask.
+ /* 0x2D4 */ s16 maskBounceAngularVelocity; // Controls the speed that the Hiploop rotates to face the player when an attack bounces off the mask.
/* 0x2D6 */ s16 deadBodyPartsSpawnedCount;
/* 0x2D8 */ f32 endFrame;
/* 0x2DC */ f32 chargeAndBounceSpeed;
@@ -57,17 +86,17 @@ typedef struct EnPp {
/* 0x34C */ Vec3f maskVelocity;
/* 0x358 */ Vec3f targetPos;
/* 0x364 */ Vec3f deadBodyPartPos;
- /* 0x370 */ s32 deadBodyPartDrawDmgEffCount;
- /* 0x374 */ Vec3f deadBodyPartDrawDmgEffPos[10];
- /* 0x3EC */ Vec3s deadBodyPartRotationalVelocity;
+ /* 0x370 */ s32 deadBodyPartCount;
+ /* 0x374 */ Vec3f deadBodyPartsPos[EN_PP_DEAD_BODYPART_MAX];
+ /* 0x3EC */ Vec3s deadBodyPartAngularVelocity;
/* 0x3F2 */ s16 drawDmgEffTimer;
/* 0x3F4 */ s16 drawDmgEffType;
/* 0x3F8 */ f32 drawDmgEffScale;
/* 0x3FC */ f32 drawDmgEffFrozenSteamScale;
/* 0x400 */ f32 attackRange;
/* 0x404 */ s32 hasBeenDamaged;
- /* 0x408 */ Vec3f bodyPartsPos[11];
- /* 0x48C */ s16 bodyPartsPosIndex;
+ /* 0x408 */ Vec3f bodyPartsPos[EN_PP_BODYPART_MAX];
+ /* 0x48C */ s16 bodyPartIndex;
/* 0x490 */ f32 maskAccelY;
/* 0x494 */ ColliderJntSph maskCollider;
/* 0x4B4 */ ColliderJntSphElement maskColliderElements[1];
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 5068c96ee..74efc10ca 100644
--- a/src/overlays/actors/ovl_En_Pr/z_en_pr.c
+++ b/src/overlays/actors/ovl_En_Pr/z_en_pr.c
@@ -5,10 +5,11 @@
*/
#include "z_en_pr.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "overlays/actors/ovl_En_Prz/z_en_prz.h"
#include "objects/object_pr/object_pr.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnPr*)thisx)
@@ -66,7 +67,13 @@ static DamageTable sDamageTable = {
/* Powder Keg */ DMG_ENTRY(1, 0xF),
};
-f32 D_80A338C0[PLAYER_FORM_MAX] = { 30.0f, 30.0f, 30.0f, 15.0f, 15.0f };
+f32 D_80A338C0[PLAYER_FORM_MAX] = {
+ 30.0f, // PLAYER_FORM_FIERCE_DEITY
+ 30.0f, // PLAYER_FORM_GORON
+ 30.0f, // PLAYER_FORM_ZORA
+ 15.0f, // PLAYER_FORM_DEKU
+ 15.0f, // PLAYER_FORM_HUMAN
+};
ActorInit En_Pr_InitVars = {
ACTOR_EN_PR,
@@ -127,7 +134,7 @@ void EnPr_Init(Actor* thisx, PlayState* play2) {
Actor_SetScale(&this->actor, 0.01f);
- this->actor.targetMode = 3;
+ this->actor.targetMode = TARGET_MODE_3;
this->unk_2B8 = this->actor.world.pos.y;
this->actor.shape.yOffset = 1500.0f;
this->actor.colChkInfo.damageTable = &sDamageTable;
@@ -241,7 +248,7 @@ void func_80A326F0(EnPr* this) {
func_80A3242C(this, 0);
}
this->unk_206 = 0;
- this->actor.speedXZ = 1.0f;
+ this->actor.speed = 1.0f;
this->actionFunc = func_80A32740;
}
@@ -319,7 +326,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)) {
@@ -343,19 +350,19 @@ void func_80A32AF8(EnPr* this) {
void func_80A32B20(EnPr* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- this->actor.speedXZ = BREG(57) + 3.0f;
+ this->actor.speed = BREG(57) + 3.0f;
Math_SmoothStepToS(&this->unk_22C, this->actor.yawTowardsPlayer, BREG(49) + 1, BREG(50) + 1000, BREG(51));
this->unk_2B8 = D_80A338C0[GET_PLAYER_FORM] + player->actor.world.pos.y;
func_80A324E0(this, play);
if (!(player->stateFlags1 & PLAYER_STATE1_8000000)) {
this->skelAnime.playSpeed = 1.0f;
- this->actor.speedXZ = 1.0f;
+ this->actor.speed = 1.0f;
func_80A32854(this);
} else if (this->unk_2C8 < sqrtf(SQ(player->actor.world.pos.x - this->actor.home.pos.x) +
SQ(player->actor.world.pos.z - this->actor.home.pos.z))) {
this->skelAnime.playSpeed = 1.0f;
- this->actor.speedXZ = 1.0f;
+ this->actor.speed = 1.0f;
func_80A32854(this);
} else if (!func_80A325E4(this) && (this->actor.xzDistToPlayer < 200.0f) &&
(fabsf(player->actor.world.pos.y - this->actor.world.pos.y) < 80.0f)) {
@@ -377,7 +384,7 @@ void func_80A32D28(EnPr* this, PlayState* play) {
if (!(player->stateFlags1 & PLAYER_STATE1_8000000)) {
this->skelAnime.playSpeed = 1.0f;
- this->actor.speedXZ = 1.0f;
+ this->actor.speed = 1.0f;
func_80A32854(this);
} else {
Math_SmoothStepToS(&this->unk_22C, this->actor.yawTowardsPlayer, BREG(49) + 1, BREG(50) + 1000, BREG(51));
@@ -387,7 +394,7 @@ void func_80A32D28(EnPr* this, PlayState* play) {
if (this->unk_2C8 < sqrtf(SQ(player->actor.world.pos.x - this->actor.home.pos.x) +
SQ(player->actor.world.pos.z - this->actor.home.pos.z))) {
this->skelAnime.playSpeed = 1.0f;
- this->actor.speedXZ = 1.0f;
+ this->actor.speed = 1.0f;
func_80A32854(this);
}
}
@@ -396,7 +403,7 @@ void func_80A32D28(EnPr* this, PlayState* play) {
void func_80A32E60(EnPr* this) {
func_80A3242C(this, 4);
this->unk_206 = 6;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = func_80A32EA4;
}
@@ -407,10 +414,10 @@ void func_80A32EA4(EnPr* this, PlayState* play) {
if (this->actor.colChkInfo.health <= 0) {
this->unk_206 = 7;
this->unk_20A = 50;
- this->actor.flags |= ACTOR_FLAG_8000000;
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
this->unk_2C4 = 0.0f;
Enemy_StartFinishingBlow(play, &this->actor);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BUBLEWALK_DEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BUBLEWALK_DEAD);
this->unk_216 = 0;
this->actionFunc = func_80A32F48;
} else {
@@ -460,7 +467,7 @@ void func_80A33098(EnPr* this, PlayState* play) {
this->drawDmgEffAlpha = 40;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_LIGHT_ORBS;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->actor.focus.pos.x, this->actor.focus.pos.y,
- this->actor.focus.pos.z, 0, 0, 0, CLEAR_TAG_LARGE_LIGHT_RAYS);
+ this->actor.focus.pos.z, 0, 0, 0, CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
}
if ((player->stateFlags1 & PLAYER_STATE1_8000000) && (this->actor.colChkInfo.damageEffect == 5)) {
@@ -470,8 +477,8 @@ void func_80A33098(EnPr* this, PlayState* play) {
if ((this->unk_206 != 6) && (this->unk_206 != 7)) {
Actor_ApplyDamage(&this->actor);
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BUBLEWALK_DAMAGE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BUBLEWALK_DAMAGE);
func_80A32E60(this);
}
}
@@ -536,7 +543,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 +558,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);
@@ -580,10 +589,10 @@ void EnPr_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
if ((limbIndex == 0) || (limbIndex == 1) || (limbIndex == 2) || (limbIndex == 3) || (limbIndex == 4) ||
(limbIndex == 5) || (limbIndex == 6) || (limbIndex == 7) || (limbIndex == 8) || (limbIndex == 9)) {
- Matrix_MultZero(&this->limbPos[this->unk_228]);
- this->unk_228++;
- if (this->unk_228 >= ARRAY_COUNT(this->limbPos)) {
- this->unk_228 = 0;
+ Matrix_MultZero(&this->bodyPartsPos[this->bodyPartsCount]);
+ this->bodyPartsCount++;
+ if (this->bodyPartsCount >= ENPR_BODYPART_MAX) {
+ this->bodyPartsCount = 0;
}
}
}
@@ -593,8 +602,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++);
@@ -618,8 +627,8 @@ void EnPr_Draw(Actor* thisx, PlayState* play) {
this->unk_238 = 0.8f;
this->unk_234 = 0.8f;
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), 0.8f, 0.8f,
- drawDmgEffAlpha, this->drawDmgEffType);
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, ENPR_BODYPART_MAX, 0.8f, 0.8f, drawDmgEffAlpha,
+ this->drawDmgEffType);
}
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_En_Pr/z_en_pr.h b/src/overlays/actors/ovl_En_Pr/z_en_pr.h
index dfa3081ca..58d1e8be2 100644
--- a/src/overlays/actors/ovl_En_Pr/z_en_pr.h
+++ b/src/overlays/actors/ovl_En_Pr/z_en_pr.h
@@ -12,6 +12,20 @@ typedef void (*EnPrActionFunc)(struct EnPr*, PlayState*);
#define ENPR_FF00_MAX 20
#define ENPR_FF00_MIN 0
+typedef enum EnPrBodyPart {
+ /* 0 */ ENPR_BODYPART_0,
+ /* 1 */ ENPR_BODYPART_1,
+ /* 2 */ ENPR_BODYPART_2,
+ /* 3 */ ENPR_BODYPART_3,
+ /* 4 */ ENPR_BODYPART_4,
+ /* 5 */ ENPR_BODYPART_5,
+ /* 6 */ ENPR_BODYPART_6,
+ /* 7 */ ENPR_BODYPART_7,
+ /* 8 */ ENPR_BODYPART_8,
+ /* 9 */ ENPR_BODYPART_9,
+ /* 10 */ ENPR_BODYPART_MAX
+} EnPrBodyPart;
+
typedef struct EnPr {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
@@ -31,13 +45,13 @@ typedef struct EnPr {
/* 0x218 */ UNK_TYPE1 unk218[4];
/* 0x21C */ s32 unk_21C;
/* 0x220 */ UNK_TYPE1 unk220[0x8];
- /* 0x228 */ s32 unk_228;
+ /* 0x228 */ s32 bodyPartsCount;
/* 0x22C */ s16 unk_22C;
/* 0x22E */ s16 drawDmgEffAlpha;
/* 0x230 */ s16 drawDmgEffType;
/* 0x234 */ f32 unk_234;
/* 0x238 */ f32 unk_238;
- /* 0x23C */ Vec3f limbPos[10];
+ /* 0x23C */ Vec3f bodyPartsPos[ENPR_BODYPART_MAX];
/* 0x2B4 */ f32 unk_2B4;
/* 0x2B8 */ f32 unk_2B8;
/* 0x2BC */ f32 unk_2BC;
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 0cc6dc134..5ebdcd43f 100644
--- a/src/overlays/actors/ovl_En_Pr2/z_en_pr2.c
+++ b/src/overlays/actors/ovl_En_Pr2/z_en_pr2.c
@@ -8,7 +8,7 @@
#include "objects/object_pr/object_pr.h"
#include "overlays/actors/ovl_En_Encount1/z_en_encount1.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnPr2*)thisx)
@@ -108,14 +108,14 @@ s16 D_80A75C3C[] = {
void EnPr2_Init(Actor* thisx, PlayState* play) {
EnPr2* this = THIS;
- this->actor.targetMode = 3;
+ this->actor.targetMode = TARGET_MODE_3;
this->actor.hintId = TATL_HINT_ID_SKULLFISH;
this->unk_1EC = 255;
this->actor.colChkInfo.health = 1;
this->actor.colChkInfo.damageTable = &sDamageTable;
SkelAnime_InitFlex(play, &this->skelAnime, &object_pr_Skel_004188, &object_pr_Anim_004340, this->jointTable,
- this->morphtable, 5);
+ this->morphTable, 5);
this->unk_1E0 = ENPR2_GET_F(&this->actor);
this->actor.colChkInfo.mass = 10;
Math_Vec3f_Copy(&this->unk_228, &this->actor.home.pos);
@@ -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,9 +171,11 @@ 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 & 0x60)) {
+ 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--;
}
}
}
@@ -267,13 +269,13 @@ void func_80A745FC(EnPr2* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PIRANHA_EXIST - SFX_FLAG);
+ 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) {
- Math_ApproachF(&this->actor.speedXZ, 5.0f, 0.3f, 1.0f);
+ if (this->path->customValue < this->unk_1D0) {
+ Math_ApproachF(&this->actor.speed, 5.0f, 0.3f, 1.0f);
} else {
- Math_ApproachF(&this->actor.speedXZ, 10.0f, 0.3f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 10.0f, 0.3f, 1.0f);
}
if ((this->path != NULL) && !SubS_CopyPointFromPath(this->path, this->unk_1D0, &this->unk_21C)) {
@@ -326,7 +328,7 @@ void func_80A748E8(EnPr2* this, PlayState* play) {
Vec3f sp3C;
Math_ApproachF(&this->unk_204, 0.02f, 0.1f, 0.005f);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PIRANHA_EXIST - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PIRANHA_EXIST - SFX_FLAG);
if (fabsf(this->actor.world.rot.y - this->unk_1EE) < 200.0f) {
sp48 = true;
@@ -334,7 +336,7 @@ void func_80A748E8(EnPr2* this, PlayState* play) {
}
if (this->unk_1F4 != 255) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
Math_SmoothStepToS(&this->unk_1F4, 0, 1, 30, 100);
if (this->unk_1F4 < 2) {
Actor_Kill(&this->actor);
@@ -370,7 +372,7 @@ void func_80A748E8(EnPr2* this, PlayState* play) {
sp4C = true;
this->unk_1DC = 0;
Math_Vec3f_Copy(&this->unk_21C, &this->unk_228);
- Math_ApproachF(&this->actor.speedXZ, 3.0f, 0.3f, 0.2f);
+ Math_ApproachF(&this->actor.speed, 3.0f, 0.3f, 0.2f);
}
}
break;
@@ -383,22 +385,23 @@ void func_80A748E8(EnPr2* this, PlayState* play) {
this->unk_1D6 = true;
}
- Math_ApproachZeroF(&this->actor.speedXZ, 0.1f, 0.2f);
+ Math_ApproachZeroF(&this->actor.speed, 0.1f, 0.2f);
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 {
- Math_ApproachF(&this->actor.speedXZ, 2.0f, 0.3f, 0.2f);
+ Math_ApproachF(&this->actor.speed, 2.0f, 0.3f, 0.2f);
Math_Vec3f_Copy(&sp3C, &this->actor.world.pos);
sp3C.x += Math_SinS(this->actor.world.rot.y) * 20.0f;
sp3C.z += Math_CosS(this->actor.world.rot.y) * 20.0f;
if (fabsf(this->actor.world.rot.y - this->unk_1EE) < 100.0f) {
- if (BgCheck_SphVsFirstPoly(&play->colCtx, &sp3C, 20.0f) || (this->actor.bgCheckFlags & 8)) {
+ if (BgCheck_SphVsFirstPoly(&play->colCtx, &sp3C, 20.0f) ||
+ (this->actor.bgCheckFlags & BGCHECKFLAG_WALL)) {
this->unk_1DC = 0;
this->unk_1F2++;
Math_Vec3f_Copy(&this->unk_21C, &this->unk_228);
@@ -430,7 +433,7 @@ void func_80A74DEC(EnPr2* this, PlayState* play) {
this->unk_1F0 = 0;
func_80A74510(this, 1);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PIRANHA_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PIRANHA_ATTACK);
Math_Vec3f_Copy(&this->unk_21C, &player->actor.world.pos);
this->unk_1EE = Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_21C);
@@ -452,7 +455,7 @@ void func_80A74E90(EnPr2* this, PlayState* play) {
}
if (this->unk_1F4 != 255) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
Math_SmoothStepToS(&this->unk_1F4, 0, 1, 30, 100);
if (this->unk_1F4 < 2) {
Actor_Kill(&this->actor);
@@ -470,7 +473,7 @@ void func_80A74E90(EnPr2* this, PlayState* play) {
}
this->unk_21C.y = player->actor.world.pos.y + 30.0f + this->unk_20C;
- Math_ApproachF(&this->actor.speedXZ, 5.0f, 0.3f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 5.0f, 0.3f, 1.0f);
this->unk_1F0 = 0;
if (this->unk_1E0 == 2) {
@@ -514,8 +517,8 @@ void func_80A74E90(EnPr2* this, PlayState* play) {
void func_80A751B4(EnPr2* this) {
this->unk_1EC = 0;
- this->actor.flags |= ACTOR_FLAG_8000000;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
if (this->unk_1E0 < 10) {
func_80A74510(this, 2);
} else {
@@ -532,10 +535,10 @@ void func_80A751B4(EnPr2* this) {
this->actor.shape.rot.y = this->actor.world.rot.y;
this->actor.shape.rot.z = this->actor.world.rot.z;
this->unk_1D8 = 30;
- this->actor.speedXZ = Rand_ZeroFloat(0.5f);
- this->actor.world.rot.y = randPlusMinusPoint5Scaled(0x8000);
+ this->actor.speed = Rand_ZeroFloat(0.5f);
+ this->actor.world.rot.y = Rand_CenteredFloat(0x8000);
}
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 10);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 10);
this->unk_1D4 = 3;
this->actionFunc = func_80A75310;
}
@@ -593,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);
@@ -614,8 +617,8 @@ void func_80A755D8(EnPr2* this, PlayState* play) {
Actor_ApplyDamage(&this->actor);
if ((this->actor.colChkInfo.health <= 0) && (this->unk_1D4 != 3)) {
Enemy_StartFinishingBlow(play, &this->actor);
- this->actor.speedXZ = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PIRANHA_DEAD);
+ this->actor.speed = 0.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_PIRANHA_DEAD);
if (this->unk_218 >= 0) {
Item_DropCollectibleRandom(play, NULL, &this->actor.world.pos, D_80A75C3C[this->unk_218]);
@@ -627,7 +630,7 @@ void func_80A755D8(EnPr2* this, PlayState* play) {
}
if (this->collider.base.atFlags & AT_BOUNCED) {
- this->actor.speedXZ = -10.0f;
+ this->actor.speed = -10.0f;
}
}
@@ -660,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;
@@ -670,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;
@@ -736,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..7d462b639 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];
+ /* 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 dad8fc126..f314ebef0 100644
--- a/src/overlays/actors/ovl_En_Prz/z_en_prz.c
+++ b/src/overlays/actors/ovl_En_Prz/z_en_prz.c
@@ -8,7 +8,7 @@
#include "objects/object_pr/object_pr.h"
#include "overlays/actors/ovl_En_Pr/z_en_pr.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnPrz*)thisx)
@@ -60,7 +60,13 @@ static DamageTable sDamageTable = {
/* Powder Keg */ DMG_ENTRY(1, 0xF),
};
-f32 D_80A771E0[] = { 40.0f, 40.0f, 40.0f, 30.0f, 30.0f };
+f32 D_80A771E0[PLAYER_FORM_MAX] = {
+ 40.0f, // PLAYER_FORM_FIERCE_DEITY
+ 40.0f, // PLAYER_FORM_GORON
+ 40.0f, // PLAYER_FORM_ZORA
+ 30.0f, // PLAYER_FORM_DEKU
+ 30.0f, // PLAYER_FORM_HUMAN
+};
static ColliderCylinderInit sCylinderInit = {
{
@@ -108,7 +114,7 @@ void EnPrz_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 0.01f);
- this->actor.targetMode = 3;
+ this->actor.targetMode = TARGET_MODE_3;
this->unk_1E8 = 255;
this->actor.hintId = TATL_HINT_ID_SKULLFISH;
this->actor.colChkInfo.damageTable = &sDamageTable;
@@ -119,15 +125,15 @@ void EnPrz_Init(Actor* thisx, PlayState* play) {
this->unk_1E6 = ENPRZ_GET(&this->actor);
this->actor.shape.yOffset = 500.0f;
- this->actor.flags |= ACTOR_FLAG_8000000;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
Math_Vec3f_Copy(&this->unk_1D8, &this->actor.world.pos);
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 +182,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 +224,7 @@ s32 func_80A762C0(EnPrz* this, PlayState* play) {
}
void func_80A76388(EnPrz* this) {
- this->actor.speedXZ = 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 +257,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 +308,7 @@ void func_80A76634(EnPrz* this, PlayState* play) {
}
void func_80A76748(EnPrz* this) {
- this->actor.speedXZ = 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 +323,7 @@ void func_80A767A8(EnPrz* this, PlayState* play) {
if (func_80A762C0(this, play)) {
func_80A75F18(this, 0);
- this->actor.speedXZ = randPlusMinusPoint5Scaled(1.0f) + 4.0f;
+ this->actor.speed = Rand_CenteredFloat(1.0f) + 4.0f;
func_80A76604(this, play);
return;
}
@@ -353,17 +359,17 @@ 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);
}
void func_80A76A1C(EnPrz* this) {
this->unk_1E8 = 0;
- this->actor.flags |= ACTOR_FLAG_8000000;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BUBLEWALK_DEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BUBLEWALK_DEAD);
this->unk_1EE = Rand_S16Offset(100, 30);
this->unk_1FC = 0x4000;
@@ -373,10 +379,10 @@ void func_80A76A1C(EnPrz* this) {
}
this->unk_1FE = this->actor.world.rot.y;
- this->actor.speedXZ = Rand_ZeroFloat(0.5f);
- this->actor.world.rot.y = randPlusMinusPoint5Scaled(0x8000);
+ this->actor.speed = Rand_ZeroFloat(0.5f);
+ this->actor.world.rot.y = Rand_CenteredFloat(0x8000);
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 30);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 30);
this->unk_1EE = 50;
func_80A75F18(this, 0);
this->unk_1EA = 7;
@@ -409,9 +415,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 +447,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 +479,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 +512,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..c3a7d9a78 100644
--- a/src/overlays/actors/ovl_En_Pst/z_en_pst.c
+++ b/src/overlays/actors/ovl_En_Pst/z_en_pst.c
@@ -6,7 +6,7 @@
#include "z_en_pst.h"
-#define FLAGS (ACTOR_FLAG_1)
+#define FLAGS (ACTOR_FLAG_TARGETABLE)
#define THIS ((EnPst*)thisx)
@@ -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;
}
@@ -208,7 +208,7 @@ s32 EnPst_ChooseBehaviour(Actor* thisx, PlayState* play) {
itemAction = func_80123810(play);
scriptBranch = 0;
if ((itemAction == PLAYER_IA_LETTER_TO_KAFEI) || (itemAction == PLAYER_IA_LETTER_MAMA)) {
- this->exchangeItemId = itemAction;
+ this->exchangeItemAction = itemAction;
this->behaviour++;
scriptBranch = 1;
} else if (itemAction <= PLAYER_IA_MINUS1) {
@@ -223,7 +223,7 @@ s32 EnPst_ChooseBehaviour(Actor* thisx, PlayState* play) {
}
break;
case POSTBOX_BEHAVIOUR_TAKE_ITEM:
- if (this->exchangeItemId == PLAYER_IA_LETTER_TO_KAFEI) {
+ if (this->exchangeItemAction == PLAYER_IA_LETTER_TO_KAFEI) {
scriptBranch = 1;
}
break;
@@ -252,7 +252,7 @@ s32* EnPst_GetMsgEventScript(EnPst* this, PlayState* play) {
return NULL;
}
} else if (this->stateFlags & 0x20) {
- if (this->exchangeItemId == PLAYER_IA_LETTER_MAMA) {
+ if (this->exchangeItemAction == PLAYER_IA_LETTER_MAMA) {
return D_80B2C488;
} else {
return D_80B2C490;
@@ -280,32 +280,31 @@ s32 EnPst_CheckTalk(EnPst* this, PlayState* play) {
Player* player = GET_PLAYER(play);
s32 ret = false;
- if (this->stateFlags & 7) {
- if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- this->stateFlags &= ~0x30;
- if (player->exchangeItemId == PLAYER_IA_LETTER_TO_KAFEI) {
- this->stateFlags |= 0x10;
- this->exchangeItemId = player->exchangeItemId;
- } else if (player->exchangeItemId != PLAYER_IA_NONE) {
- this->stateFlags |= 0x20;
- this->exchangeItemId = player->exchangeItemId;
- }
- // If Letter to Kafei is deposited, value is set to 2
- this->isLetterToKafeiDeposited = EnPst_HandleLetterDay1(this);
- SubS_UpdateFlags(&this->stateFlags, 0, 7);
- this->behaviour = 0;
- this->msgEventCallback = NULL;
- this->stateFlags |= 0x40;
- this->msgEventScript = EnPst_GetMsgEventScript(this, play);
- this->actionFunc = EnPst_Talk;
- ret = true;
+ if (((this->stateFlags & SUBS_OFFER_MODE_MASK) != SUBS_OFFER_MODE_NONE) &&
+ Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ this->stateFlags &= ~0x30;
+ if (player->exchangeItemAction == PLAYER_IA_LETTER_TO_KAFEI) {
+ this->stateFlags |= 0x10;
+ this->exchangeItemAction = player->exchangeItemAction;
+ } else if (player->exchangeItemAction != PLAYER_IA_NONE) {
+ this->stateFlags |= 0x20;
+ this->exchangeItemAction = player->exchangeItemAction;
}
+ // If Letter to Kafei is deposited, value is set to 2
+ this->isLetterToKafeiDeposited = EnPst_HandleLetterDay1(this);
+ SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
+ this->behaviour = 0;
+ this->msgEventCallback = NULL;
+ this->stateFlags |= 0x40;
+ this->msgEventScript = EnPst_GetMsgEventScript(this, play);
+ this->actionFunc = EnPst_Talk;
+ ret = true;
}
return ret;
}
-s32 EnPst_UpdateFlagsSubs(EnPst* this, PlayState* play, ScheduleOutput* scheduleOutput) {
- SubS_UpdateFlags(&this->stateFlags, 3, 7);
+s32 EnPst_SetOfferItemModeOnScreen(EnPst* this, PlayState* play, ScheduleOutput* scheduleOutput) {
+ SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
return true;
}
@@ -316,8 +315,9 @@ s32 EnPst_ProcessScheduleOutput(EnPst* this, PlayState* play, ScheduleOutput* sc
switch (scheduleOutput->result) {
case POSTBOX_SCH_AVAILABLE:
- ret = EnPst_UpdateFlagsSubs(this, play, scheduleOutput);
+ ret = EnPst_SetOfferItemModeOnScreen(this, play, scheduleOutput);
break;
+
case POSTBOX_SCH_CHECKED_BY_POSTMAN:
ret = true;
break;
@@ -342,11 +342,11 @@ void EnPst_FollowSchedule(EnPst* this, PlayState* play) {
((this->scheduleResult != scheduleOutput.result) &&
!EnPst_ProcessScheduleOutput(this, play, &scheduleOutput))) {
this->actor.shape.shadowDraw = NULL;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
scheduleOutput.result = POSTBOX_SCH_NONE;
} else {
this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}
this->scheduleResult = scheduleOutput.result;
EnPst_HandleSchedule(this, play);
@@ -373,7 +373,7 @@ void EnPst_Talk(EnPst* this, PlayState* play) {
break;
}
}
- SubS_UpdateFlags(&this->stateFlags, 3, 7);
+ SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->msgEventArg4 = 0;
this->actionFunc = EnPst_FollowSchedule;
}
@@ -388,12 +388,12 @@ void EnPst_Init(Actor* thisx, PlayState* play) {
POSTBOX_LIMB_MAX);
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit);
- SubS_UpdateFlags(&this->stateFlags, 3, 7);
+ SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 0);
- this->actor.targetMode = 0;
+ this->actor.targetMode = TARGET_MODE_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) {
@@ -410,7 +410,7 @@ void EnPst_Update(Actor* thisx, PlayState* play) {
if (this->scheduleResult != POSTBOX_SCH_NONE) {
if (Actor_IsFacingPlayer(&this->actor, 0x1FFE)) {
this->unk214 = 0;
- func_8013C964(&this->actor, play, 60.0f, 20.0f, 0, this->stateFlags & 7);
+ SubS_Offer(&this->actor, play, 60.0f, 20.0f, PLAYER_IA_NONE, this->stateFlags & SUBS_OFFER_MODE_MASK);
}
Actor_SetFocus(&this->actor, 20.0f);
EnPst_UpdateCollision(this, 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..9a47181e8 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;
@@ -32,7 +32,7 @@ typedef struct EnPst {
/* 0x20E */ s16 behaviour;
/* 0x210 */ MsgEventFunc msgEventCallback;
/* 0x214 */ s32 unk214; // Set and not used
- /* 0x218 */ s32 exchangeItemId;
+ /* 0x218 */ s32 exchangeItemAction;
/* 0x21C */ s32 isLetterToKafeiDeposited;
} EnPst; // size = 0x220
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 0caa2f8ca..a1df0f8ad 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);
@@ -375,7 +374,7 @@ void EnRacedog_RaceStart(EnRacedog* this, PlayState* play) {
if (DECR(this->raceStartTimer) == 0) {
this->raceStartTimer = Rand_S16Offset(50, 50);
if (this->extraTimeBeforeRaceStart == 0) {
- play_sound(NA_SE_SY_START_SHOT);
+ Audio_PlaySfx(NA_SE_SY_START_SHOT);
}
EnRacedog_ChangeAnim(&this->skelAnime, sAnimationInfo, RACEDOG_ANIM_RUN);
@@ -393,7 +392,7 @@ void EnRacedog_Race(EnRacedog* this, PlayState* play) {
this->collider.dim.radius = 15;
if (this->path != NULL) {
yRotation = EnRacedog_GetYRotation(this->path, this->currentPoint, &this->actor.world.pos, &distSq);
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
yRotation = this->actor.wallYaw;
}
@@ -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;
}
}
}
@@ -515,16 +508,16 @@ void EnRacedog_UpdateSpeed(EnRacedog* this) {
this->actor.shape.rot.y = this->actor.world.rot.y;
}
- Math_ApproachF(&this->actor.speedXZ, this->targetSpeed, 0.5f, 3.0f);
+ Math_ApproachF(&this->actor.speed, this->targetSpeed, 0.5f, 3.0f);
// The dog that the player has selected has a slightly higher max speed than the other dogs.
if (this->index == this->selectedDogIndex) {
- if (this->actor.speedXZ > 7.5f) {
- this->actor.speedXZ = 7.5f;
+ if (this->actor.speed > 7.5f) {
+ this->actor.speed = 7.5f;
}
} else {
- if (this->actor.speedXZ > 7.0f) {
- this->actor.speedXZ = 7.0f;
+ if (this->actor.speed > 7.0f) {
+ this->actor.speed = 7.0f;
}
}
}
@@ -586,13 +579,13 @@ void EnRacedog_CheckForFinish(EnRacedog* this) {
this->raceStatus == RACEDOG_RACE_STATUS_AFTER_POINT_11) {
sNumberOfDogsFinished++;
if (sNumberOfDogsFinished == 1) {
- Audio_QueueSeqCmd(NA_BGM_HORSE_GOAL | 0x8000);
- play_sound(NA_SE_SY_START_SHOT);
+ SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_HORSE_GOAL | SEQ_FLAG_ASYNC);
+ Audio_PlaySfx(NA_SE_SY_START_SHOT);
}
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);
}
}
}
@@ -602,7 +595,7 @@ void EnRacedog_CheckForFinish(EnRacedog* this) {
* to normal speed otherwise.
*/
void EnRacedog_UpdateRunAnimationPlaySpeed(EnRacedog* this) {
- if (this->actor.speedXZ < 3.0f) {
+ if (this->actor.speed < 3.0f) {
sAnimationInfo[RACEDOG_ANIM_RUN].playSpeed = 0.9f;
} else {
sAnimationInfo[RACEDOG_ANIM_RUN].playSpeed = 1.0f;
@@ -635,13 +628,28 @@ s32 EnRacedog_IsOverFinishLine(EnRacedog* this, Vec2f* finishLineCoordinates) {
// frontPointsCrossProduct is positive if the dog is to the left of the line formed by the front points
// crossProductTemp is positive if the dog is above the line formed by the bottom points
+ // This is checking that the dog within the region defined by front and bottom lines like so:
+ // |
+ // X | Front
+ // |
+ // --------
+ // Bottom
frontPointsCrossProduct = ((xDistToTopFront * zDistToBottomFront) - (xDistToBottomFront * zDistToTopFront));
crossProductTemp = (((xDistToBottomFront * zDistToBottomBack) - (xDistToBottomBack * zDistToBottomFront)));
+ //! @bug If any dog is precisely (with floating-point precision) on top of the line formed by the front points,
+ //! then frontPointsCrossProduct will be zero. This will cause this multiplication (and all future multiplications)
+ //! to be zero, which will make this function think the dog has crossed the finish line. The line formed by the
+ //! front points extends throughout the entire racetrack, so a dog can trigger this when they're not even close to
+ //! the actual finish line, causing them to finish the race incredibly early.
if (frontPointsCrossProduct * crossProductTemp < 0.0f) {
return false;
}
// crossProductTemp is positive if the dog is to the right of the line formed by the back points
+ // This is checking that the dog within the region defined by front and back lines like so:
+ // | |
+ // Back | X | Front
+ // | |
frontPointsCrossProduct = ((xDistToTopFront * zDistToBottomFront) - (xDistToBottomFront * zDistToTopFront));
crossProductTemp = ((xDistToBottomBack * zDistToTopBack) - (xDistToTopBack * zDistToBottomBack));
if (frontPointsCrossProduct * crossProductTemp < 0.0f) {
@@ -649,6 +657,12 @@ s32 EnRacedog_IsOverFinishLine(EnRacedog* this, Vec2f* finishLineCoordinates) {
}
// crossProductTemp is positive if the dog is below the line formed by the top points
+ // This is checking that the dog within the region defined by front and top lines like so:
+ // Top
+ // --------
+ // |
+ // X | Front
+ // |
frontPointsCrossProduct = ((xDistToTopFront * zDistToBottomFront) - (xDistToBottomFront * zDistToTopFront));
crossProductTemp = ((xDistToTopBack * zDistToTopFront) - (xDistToTopFront * zDistToTopBack));
if (frontPointsCrossProduct * crossProductTemp < 0.0f) {
@@ -660,13 +674,13 @@ s32 EnRacedog_IsOverFinishLine(EnRacedog* this, Vec2f* finishLineCoordinates) {
void EnRacedog_SpawnFloorDustRing(EnRacedog* this, PlayState* play) {
s16 curFrame = this->skelAnime.curFrame;
- s16 mod = (this->actor.speedXZ > 6.0f) ? 2 : 3;
+ s16 mod = (this->actor.speed > 6.0f) ? 2 : 3;
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);
}
}
@@ -675,7 +689,7 @@ void EnRacedog_PlaySfxWalk(EnRacedog* this) {
s16 curFrame = this->skelAnime.curFrame;
if ((curFrame == 1) || (curFrame == 7)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_MONKEY_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_MONKEY_WALK);
}
}
@@ -701,7 +715,7 @@ void EnRacedog_Update(Actor* thisx, PlayState* play) {
}
}
- if (!(this->actor.bgCheckFlags & 1)) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
this->skelAnime.curFrame = 0.0f;
}
@@ -732,7 +746,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 +787,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 8421b20ac..1c6a669a2 100644
--- a/src/overlays/actors/ovl_En_Raf/z_en_raf.c
+++ b/src/overlays/actors/ovl_En_Raf/z_en_raf.c
@@ -5,8 +5,9 @@
*/
#include "z_en_raf.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
-#define FLAGS (ACTOR_FLAG_8000000)
+#define FLAGS (ACTOR_FLAG_CANT_LOCK_ON)
#define THIS ((EnRaf*)thisx)
@@ -40,7 +41,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 +52,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 {
@@ -209,7 +210,7 @@ void EnRaf_Init(Actor* thisx, PlayState* play) {
CollisionHeader_GetVirtual(&gCarnivorousLilyPadCol, &colHeader);
this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &this->dyna.actor, colHeader);
Collider_InitAndSetCylinder(play, &this->collider, &this->dyna.actor, &sCylinderInit);
- this->dyna.actor.targetMode = 3;
+ this->dyna.actor.targetMode = TARGET_MODE_3;
this->dyna.actor.colChkInfo.mass = MASS_IMMOVABLE;
SkelAnime_InitFlex(play, &this->skelAnime, &gCarnivorousLilyPadSkel, &gCarnivorousLilyPadSpitAnim, this->jointTable,
this->morphTable, CARNIVOROUS_LILY_PAD_LIMB_MAX);
@@ -310,7 +311,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;
@@ -318,7 +319,7 @@ void EnRaf_Idle(EnRaf* this, PlayState* play) {
if (player->transformation == PLAYER_FORM_GORON) {
this->grabTarget = EN_RAF_GRAB_TARGET_GORON_PLAYER;
} else {
- player->unk_AE8 = 50;
+ player->actionVar2 = 50;
}
this->playerRotYWhenGrabbed = player->actor.world.rot.y;
@@ -360,7 +361,7 @@ void EnRaf_Idle(EnRaf* this, PlayState* play) {
void EnRaf_SetupGrab(EnRaf* this) {
EnRaf_ChangeAnim(this, EN_RAF_ANIM_CLOSE);
this->petalScaleType = EN_RAF_PETAL_SCALE_TYPE_GRAB;
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EN_SUISEN_DRINK);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EN_SUISEN_DRINK);
this->action = EN_RAF_ACTION_GRAB;
this->actionFunc = EnRaf_Grab;
}
@@ -426,11 +427,15 @@ void EnRaf_Chew(EnRaf* this, PlayState* play) {
this->chewCount++;
}
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EN_SUISEN_EAT);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EN_SUISEN_EAT);
switch (this->grabTarget) {
case EN_RAF_GRAB_TARGET_PLAYER:
play->damagePlayer(play, -2);
- func_800B8E58((Player*)this, player->ageProperties->voiceSfxIdOffset + NA_SE_VO_LI_DAMAGE_S);
+
+ //! @bug: This function should only pass Player*: it uses *(this + 0x153), which is meant to be
+ //! player->currentMask, but in this case is padding in `DynaPolyActor`
+ Player_PlaySfx((Player*)&this->dyna.actor,
+ player->ageProperties->voiceSfxIdOffset + NA_SE_VO_LI_DAMAGE_S);
CollisionCheck_GreenBlood(play, NULL, &player->actor.world.pos);
if ((this->chewCount > (BREG(53) + 5)) || !(player->stateFlags2 & PLAYER_STATE2_80)) {
player->actor.freezeTimer = 10;
@@ -450,7 +455,7 @@ void EnRaf_Chew(EnRaf* this, PlayState* play) {
case EN_RAF_GRAB_TARGET_GORON_PLAYER:
if (this->chewCount > (BREG(54) + 4)) {
player->actor.parent = NULL;
- player->unk_AE8 = 1000;
+ player->actionVar2 = 1000;
EnRaf_Explode(this, play);
}
break;
@@ -478,7 +483,7 @@ void EnRaf_Throw(EnRaf* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, 10.0f)) {
player->actor.freezeTimer = 0;
player->actor.parent = NULL;
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EN_SUISEN_THROW);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EN_SUISEN_THROW);
func_800B8D50(play, &this->dyna.actor, BREG(55) + 3.0f, this->playerRotYWhenGrabbed + 0x8000, BREG(56) + 10.0f,
0);
} else if (curFrame < 10.0f) {
@@ -507,9 +512,9 @@ void EnRaf_Explode(EnRaf* this, PlayState* play) {
Math_Vec3f_Copy(&explosionPos, &this->dyna.actor.world.pos);
explosionPos.y += 10.0f;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, explosionPos.x, explosionPos.y, explosionPos.z, 0, 0, 0,
- CLEAR_TAG_SMALL_EXPLOSION);
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_IT_BOMB_EXPLOSION);
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EN_SUISEN_DEAD);
+ CLEAR_TAG_PARAMS(CLEAR_TAG_SMALL_EXPLOSION));
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_IT_BOMB_EXPLOSION);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EN_SUISEN_DEAD);
if (this->switchFlag >= 0) {
Flags_SetSwitch(play, this->switchFlag);
}
@@ -533,7 +538,7 @@ void EnRaf_Explode(EnRaf* this, PlayState* play) {
this->timer = 5;
if (this->grabTarget == EN_RAF_GRAB_TARGET_EXPLOSIVE) {
func_800BC154(play, &play->actorCtx, &this->dyna.actor, 5);
- this->dyna.actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_4);
+ this->dyna.actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY);
}
this->actionFunc = EnRaf_PostDetonation;
@@ -547,7 +552,7 @@ void EnRaf_PostDetonation(EnRaf* this, PlayState* play) {
this->collider.dim.radius = 50;
this->collider.dim.height = 10;
func_800BC154(play, &play->actorCtx, &this->dyna.actor, 6);
- this->dyna.actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_4);
+ this->dyna.actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY);
EnRaf_SetupDormant(this);
} else if (this->grabTarget == EN_RAF_GRAB_TARGET_EXPLOSIVE) {
this->collider.dim.radius = 80;
@@ -706,11 +711,11 @@ 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;
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EN_COMMON_WATER_MID);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EN_COMMON_WATER_MID);
}
} else {
this->isCurrentlyInRidingMovingState = false;
@@ -869,8 +874,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);
@@ -891,9 +896,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->rot.x = Rand_CenteredFloat(30000.0f);
+ effect->rot.y = Rand_CenteredFloat(30000.0f);
+ effect->rot.z = Rand_CenteredFloat(30000.0f);
return;
}
}
@@ -908,9 +913,9 @@ void EnRaf_UpdateEffects(EnRaf* this, PlayState* play) {
effect->pos.x += effect->velocity.x;
effect->pos.y += effect->velocity.y;
effect->pos.z += effect->velocity.z;
- effect->rotation.x += 0xBB8;
- effect->rotation.y += 0xBB8;
- effect->rotation.z += 0xBB8;
+ effect->rot.x += 0xBB8;
+ effect->rot.y += 0xBB8;
+ effect->rot.z += 0xBB8;
effect->velocity.x += effect->accel.x;
effect->velocity.y += effect->accel.y;
effect->velocity.z += effect->accel.z;
@@ -944,14 +949,14 @@ 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);
Matrix_Scale(effect->scale, effect->scale, effect->scale, MTXMODE_APPLY);
- Matrix_RotateXS(effect->rotation.x, MTXMODE_APPLY);
- Matrix_RotateYS(effect->rotation.y, MTXMODE_APPLY);
- Matrix_RotateZS(effect->rotation.z, MTXMODE_APPLY);
+ Matrix_RotateXS(effect->rot.x, MTXMODE_APPLY);
+ Matrix_RotateYS(effect->rot.y, MTXMODE_APPLY);
+ Matrix_RotateZS(effect->rot.z, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gCarnivorousLilyPadParticleDL);
diff --git a/src/overlays/actors/ovl_En_Raf/z_en_raf.h b/src/overlays/actors/ovl_En_Raf/z_en_raf.h
index f4659f48b..a025046ab 100644
--- a/src/overlays/actors/ovl_En_Raf/z_en_raf.h
+++ b/src/overlays/actors/ovl_En_Raf/z_en_raf.h
@@ -23,7 +23,7 @@ typedef struct {
/* 0x04 */ Vec3f pos;
/* 0x10 */ Vec3f velocity;
/* 0x1C */ Vec3f accel;
- /* 0x28 */ Vec3s rotation;
+ /* 0x28 */ Vec3s rot;
/* 0x30 */ f32 scale;
/* 0x34 */ s16 timer;
} EnRafEffect; // size = 0x38
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 073f2045a..b6bd9a2d2 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
@@ -8,7 +8,7 @@
#include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h"
#include "objects/object_skb/object_skb.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnRailSkb*)thisx)
@@ -247,7 +247,7 @@ void func_80B70D24(EnRailSkb* this, PlayState* play) {
while (actor != NULL) {
if ((actor->id == ACTOR_OBJ_HAKAISI) && func_80B70B04(this, actor->world.pos)) {
- if (Flags_GetSwitch(play, (actor->params & 0xFF00) >> 8)) {
+ if (Flags_GetSwitch(play, OBJHAKAISI_GET_SWITCH_FLAG(actor))) {
Actor_Kill(&this->actor);
return;
}
@@ -276,12 +276,12 @@ void EnRailSkb_Init(Actor* thisx, PlayState* play) {
Collider_SetJntSph(play, &this->collider, &this->actor, &sJntSphInit, this->colliderElements);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
- if (Flags_GetSwitch(play, ENRAILSKB_GET_FF(&this->actor))) {
+ if (Flags_GetSwitch(play, ENRAILSKB_GET_SWITCH_FLAG(&this->actor))) {
Actor_Kill(&this->actor);
}
Actor_ProcessInitChain(&this->actor, sInitChain);
- this->actor.speedXZ = 1.6f;
+ this->actor.speed = 1.6f;
this->actor.hintId = TATL_HINT_ID_STALCHILD;
this->unk_3F2 = 0;
this->unk_2E4 = -1;
@@ -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;
}
@@ -334,7 +334,7 @@ void func_80B70FF8(EnRailSkb* this, PlayState* play) {
}
void func_80B710AC(EnRailSkb* this) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
this->actionFunc = func_80B710E4;
}
@@ -345,7 +345,7 @@ void func_80B710E4(EnRailSkb* this, PlayState* play) {
}
void func_80B71114(EnRailSkb* this) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
this->actionFunc = func_80B7114C;
}
@@ -355,9 +355,9 @@ void func_80B7114C(EnRailSkb* this, PlayState* play) {
this->drawDmgEffScale = 0.0f;
this->drawDmgEffAlpha = 0.0f;
if (this->actor.colChkInfo.health != 0) {
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_DAMAGE);
this->unk_402 |= 1;
func_80B712FC(this);
} else {
@@ -379,9 +379,9 @@ void func_80B7123C(EnRailSkb* this, PlayState* play) {
this->drawDmgEffScale = 0.0f;
this->drawDmgEffAlpha = 0.0f;
if (this->actor.colChkInfo.health != 0) {
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_DAMAGE);
this->unk_402 |= 1;
func_80B712FC(this);
} else {
@@ -405,7 +405,7 @@ void func_80B71314(EnRailSkb* this, PlayState* play) {
}
void func_80B71354(EnRailSkb* this) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_ATTACK);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
this->actionFunc = func_80B713A4;
}
@@ -428,7 +428,7 @@ void func_80B713A4(EnRailSkb* this, PlayState* play) {
void func_80B71488(EnRailSkb* this) {
this->unk_402 |= 0x40;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
if (this->unk_2E0 != 0) {
this->unk_2E4 = this->unk_2E0 - 1;
} else {
@@ -451,8 +451,8 @@ void func_80B7151C(EnRailSkb* this) {
this->actor.shape.yOffset = -5000.0f;
this->actor.colChkInfo.health = 2;
this->unk_402 = 0;
- this->actor.flags |= ACTOR_FLAG_1;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_APPEAR);
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_APPEAR);
this->actor.draw = EnRailSkb_Draw;
this->actor.shape.shadowAlpha = 0;
this->actor.shape.rot.y = this->actor.world.rot.y;
@@ -499,7 +499,7 @@ void func_80B716A8(EnRailSkb* this, PlayState* play) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 12);
func_80B717C8(this);
} else if ((this->actor.xzDistToPlayer < 100.0f) && !(this->collider.base.acFlags & AC_HIT)) {
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.world.rot.y, 1, 0x71C, 0xB6);
}
@@ -575,7 +575,7 @@ void func_80B71954(EnRailSkb* this, PlayState* play) {
}
void func_80B71A08(EnRailSkb* this) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_ATTACK);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
this->actionFunc = func_80B71A58;
}
@@ -584,7 +584,7 @@ void func_80B71A58(EnRailSkb* this, PlayState* play) {
s16 sp36 = Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_22C->dyna.actor.world.pos);
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_ATTACK);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
if (this->unk_2E8 < this->unk_22C->dyna.actor.colChkInfo.health) {
this->unk_22C->dyna.actor.colChkInfo.health--;
@@ -625,7 +625,7 @@ void func_80B71BB8(EnRailSkb* this, PlayState* play) {
Math_SmoothStepToS(&this->actor.shape.rot.y,
Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_22C->dyna.actor.world.pos), 1, 0x71C, 0xB6);
- if ((this->actor.bgCheckFlags & 1) && (this->unk_22C->dyna.actor.colChkInfo.health == 0)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->unk_22C->dyna.actor.colChkInfo.health == 0)) {
Actor_MoveWithGravity(&this->actor);
} else {
this->actor.velocity.y += this->actor.gravity;
@@ -634,13 +634,13 @@ void func_80B71BB8(EnRailSkb* this, PlayState* play) {
Math_SmoothStepToF(&this->actor.world.pos.z, this->unk_22C->dyna.actor.world.pos.z, 0.6f, 1.6f, 0.1f);
}
- if (this->actor.bgCheckFlags & 2) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
Actor_Kill(&this->actor);
return;
}
- if ((sp34 < 50.0f) && (this->actor.bgCheckFlags & 1)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_ATTACK);
+ if ((sp34 < 50.0f) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_ATTACK);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 9);
this->actor.velocity.y = 10.0f;
@@ -666,7 +666,7 @@ void func_80B71DF0(EnRailSkb* this) {
this->actor.shape.yOffset = -5000.0f;
this->actor.colChkInfo.health = 2;
this->unk_402 = 0;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actor.draw = EnRailSkb_Draw;
this->actor.shape.shadowAlpha = 0;
this->actor.shape.rot.y = this->actor.world.rot.y;
@@ -732,7 +732,7 @@ void func_80B71F3C(EnRailSkb* this, PlayState* play) {
Message_StartTextbox(play, 0x13F4, &this->actor);
this->unk_400 = 0x13F4;
} else {
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_80B71D8C(this, play, func_80B71650);
}
break;
@@ -744,7 +744,7 @@ void func_80B71F3C(EnRailSkb* this, PlayState* play) {
break;
case 0x13F4:
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_80B71D8C(this, play, func_80B718B0);
break;
}
@@ -754,11 +754,11 @@ void func_80B71F3C(EnRailSkb* this, PlayState* play) {
void func_80B72100(EnRailSkb* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
if (play->msgCtx.choiceIndex == 0) {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
Message_StartTextbox(play, 0x13F1, &this->actor);
this->unk_400 = 0x13F1;
} else {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
Message_StartTextbox(play, 0x13F3, &this->actor);
this->unk_400 = 0x13F3;
}
@@ -773,7 +773,7 @@ void func_80B72190(EnRailSkb* this, PlayState* play) {
if ((this->actionFunc != func_80B714D8) &&
(Animation_OnFrame(&this->skelAnime, 8.0f) || Animation_OnFrame(&this->skelAnime, 15.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_WALK);
}
if (this->actor.parent == NULL) {
@@ -822,8 +822,8 @@ void func_80B72190(EnRailSkb* this, PlayState* play) {
}
void func_80B723F8(EnRailSkb* this) {
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_4);
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
this->actor.flags |= ACTOR_FLAG_100000;
this->actor.hintId = TATL_HINT_ID_NONE;
this->actor.textId = 0;
@@ -878,25 +878,25 @@ void func_80B726B4(EnRailSkb* this, PlayState* play) {
static Vec3f D_80B734B8 = { 0.0f, -1.0f, 0.0f };
Vec3f sp84;
s32 i;
- s32 end;
+ s32 bodyPartsCount;
s16 yaw;
if (this->unk_402 & 2) {
- end = ARRAY_COUNT(this->limbPos) - 1;
+ bodyPartsCount = ENRAILSKB_BODYPART_MAX - 1;
} else {
- end = ARRAY_COUNT(this->limbPos);
+ bodyPartsCount = ENRAILSKB_BODYPART_MAX;
}
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 30, NA_SE_EV_ICE_BROKEN);
- for (i = 0; i < end; i++) {
- yaw = Math_Vec3f_Yaw(&this->actor.world.pos, &this->limbPos[i]);
+ for (i = 0; i < bodyPartsCount; i++) {
+ yaw = Math_Vec3f_Yaw(&this->actor.world.pos, &this->bodyPartsPos[i]);
sp84.x = Math_SinS(yaw) * 3.0f;
sp84.z = Math_CosS(yaw) * 3.0f;
sp84.y = (Rand_ZeroOne() * 4.0f) + 4.0f;
- EffectSsEnIce_Spawn(play, &this->limbPos[i], 0.6f, &sp84, &D_80B734B8, &D_80B734B0, &D_80B734B4, 30);
+ EffectSsEnIce_Spawn(play, &this->bodyPartsPos[i], 0.6f, &sp84, &D_80B734B8, &D_80B734B0, &D_80B734B4, 30);
}
}
@@ -923,17 +923,17 @@ void func_80B72880(EnRailSkb* this, PlayState* play) {
if ((this->actionFunc == func_80B70FF8) || (this->actionFunc == func_80B716A8)) {
if (this->actionFunc != func_80B716A8) {
if (Player_GetMask(play) == PLAYER_MASK_CAPTAIN) {
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_4);
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
this->actor.flags |= ACTOR_FLAG_100000;
this->actor.hintId = TATL_HINT_ID_NONE;
this->actor.textId = 0;
func_80B71650(this);
}
} else if (Player_GetMask(play) != PLAYER_MASK_CAPTAIN) {
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
this->actor.flags &= ~ACTOR_FLAG_100000;
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_4);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY);
this->actor.hintId = TATL_HINT_ID_STALCHILD;
this->actor.textId = 0;
func_80B70FA0(this);
@@ -984,12 +984,12 @@ void func_80B72970(EnRailSkb* this, PlayState* play) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_SMALL;
this->drawDmgEffAlpha = 1.0f;
this->drawDmgEffScale = 0.0f;
- Actor_SetColorFilter(&this->actor, 0, 120, 0, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 120, COLORFILTER_BUFFLAG_OPA, 40);
func_80B710AC(this);
break;
case 1:
- Actor_SetColorFilter(&this->actor, 0, 120, 0, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 120, COLORFILTER_BUFFLAG_OPA, 40);
func_80B710AC(this);
break;
@@ -998,8 +998,8 @@ void func_80B72970(EnRailSkb* this, PlayState* play) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->drawDmgEffAlpha = 1.0f;
this->drawDmgEffScale = 0.0f;
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_DAMAGE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_DAMAGE);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
this->unk_402 |= 1;
func_80B712FC(this);
@@ -1007,7 +1007,7 @@ void func_80B72970(EnRailSkb* this, PlayState* play) {
case 3:
if (this->actor.colChkInfo.health != 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_DAMAGE);
this->drawDmgEffTimer = 80;
} else {
this->drawDmgEffTimer = 3;
@@ -1015,7 +1015,7 @@ void func_80B72970(EnRailSkb* this, PlayState* play) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FROZEN_SFX;
this->drawDmgEffAlpha = 1.0f;
this->drawDmgEffScale = 0.5f;
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
func_80B71114(this);
break;
@@ -1024,8 +1024,8 @@ void func_80B72970(EnRailSkb* this, PlayState* play) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_LIGHT_ORBS;
this->drawDmgEffAlpha = 1.0f;
this->drawDmgEffScale = 0.5f;
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_DAMAGE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_DAMAGE);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
func_80B71228(this);
break;
@@ -1043,8 +1043,8 @@ void func_80B72970(EnRailSkb* this, PlayState* play) {
}
case 13:
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_DAMAGE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_DAMAGE);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
func_80B712FC(this);
break;
@@ -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) &&
@@ -1129,11 +1129,11 @@ void EnRailSkb_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
if ((limbIndex == 2) || (limbIndex == 4) || (limbIndex == 5) || (limbIndex == 6) || (limbIndex == 7) ||
(limbIndex == 8) || (limbIndex == 9) || (limbIndex == 13) || (limbIndex == 14) || (limbIndex == 15) ||
(limbIndex == 16) || (limbIndex == 17) || (limbIndex == 18)) {
- Matrix_MultZero(&this->limbPos[this->limbCount]);
- this->limbCount++;
+ Matrix_MultZero(&this->bodyPartsPos[this->bodyPartsCount]);
+ this->bodyPartsCount++;
} else if ((limbIndex == 11) && !(this->unk_402 & 2)) {
- Matrix_MultVec3f(&D_80B734D0, &this->limbPos[this->limbCount]);
- this->limbCount++;
+ Matrix_MultVec3f(&D_80B734D0, &this->bodyPartsPos[this->bodyPartsCount]);
+ this->bodyPartsCount++;
}
}
}
@@ -1142,13 +1142,13 @@ void EnRailSkb_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
void EnRailSkb_Draw(Actor* thisx, PlayState* play) {
EnRailSkb* this = THIS;
- this->limbCount = 0;
- func_8012C28C(play->state.gfxCtx);
+ this->bodyPartsCount = 0;
+ 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) {
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, this->limbCount, this->drawDmgEffScale, 0.5f,
- this->drawDmgEffAlpha, this->drawDmgEffType);
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, this->bodyPartsCount, this->drawDmgEffScale,
+ 0.5f, this->drawDmgEffAlpha, this->drawDmgEffType);
}
if ((this->unk_402 & 0x40) && !(this->unk_402 & 0x80)) {
diff --git a/src/overlays/actors/ovl_En_Rail_Skb/z_en_rail_skb.h b/src/overlays/actors/ovl_En_Rail_Skb/z_en_rail_skb.h
index 10c2653c4..8feff7d5d 100644
--- a/src/overlays/actors/ovl_En_Rail_Skb/z_en_rail_skb.h
+++ b/src/overlays/actors/ovl_En_Rail_Skb/z_en_rail_skb.h
@@ -10,7 +10,25 @@ typedef void (*EnRailSkbActionFunc)(struct EnRailSkb*, PlayState*);
typedef void (*EnRailSkbUnkFunc)(struct EnRailSkb*);
#define ENRAILSKB_GET_FF00(thisx) (((thisx)->params >> 8) & 0xFF)
-#define ENRAILSKB_GET_FF(thisx) ((thisx)->params & 0xFF)
+#define ENRAILSKB_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0xFF)
+
+typedef enum EnRailSkbBodyPart {
+ /* 0 */ ENRAILSKB_BODYPART_0,
+ /* 1 */ ENRAILSKB_BODYPART_1,
+ /* 2 */ ENRAILSKB_BODYPART_2,
+ /* 3 */ ENRAILSKB_BODYPART_3,
+ /* 4 */ ENRAILSKB_BODYPART_4,
+ /* 5 */ ENRAILSKB_BODYPART_5,
+ /* 6 */ ENRAILSKB_BODYPART_6,
+ /* 7 */ ENRAILSKB_BODYPART_7,
+ /* 8 */ ENRAILSKB_BODYPART_8,
+ /* 9 */ ENRAILSKB_BODYPART_9,
+ /* 10 */ ENRAILSKB_BODYPART_10,
+ /* 11 */ ENRAILSKB_BODYPART_11,
+ /* 12 */ ENRAILSKB_BODYPART_12,
+ /* 13 */ ENRAILSKB_BODYPART_13,
+ /* 14 */ ENRAILSKB_BODYPART_MAX
+} EnRailSkbBodyPart;
typedef struct EnRailSkb {
/* 0x000 */ Actor actor;
@@ -20,8 +38,8 @@ typedef struct EnRailSkb {
/* 0x228 */ EnRailSkbActionFunc actionFunc;
/* 0x22C */ ObjHakaisi* unk_22C;
/* 0x230 */ Vec3s* unk_230;
- /* 0x234 */ Vec3f limbPos[14];
- /* 0x2DC */ s32 limbCount;
+ /* 0x234 */ Vec3f bodyPartsPos[ENRAILSKB_BODYPART_MAX];
+ /* 0x2DC */ s32 bodyPartsCount;
/* 0x2E0 */ s32 unk_2E0;
/* 0x2E4 */ s32 unk_2E4;
/* 0x2E8 */ s32 unk_2E8;
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 50a203c81..9aa218e2f 100644
--- a/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c
+++ b/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c
@@ -8,7 +8,7 @@
#include "z64rumble.h"
#include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_400)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_400)
#define THIS ((EnRailgibud*)thisx)
@@ -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;
@@ -246,7 +246,7 @@ void EnRailgibud_Init(Actor* thisx, PlayState* play) {
s32 pad;
Actor_ProcessInitChain(&this->actor, sInitChain);
- this->actor.targetMode = 0;
+ this->actor.targetMode = TARGET_MODE_0;
this->actor.hintId = TATL_HINT_ID_GIBDO;
this->actor.textId = 0;
if (ENRAILGIBUD_IS_CUTSCENE_TYPE(&this->actor)) {
@@ -286,7 +286,7 @@ void EnRailgibud_Destroy(Actor* thisx, PlayState* play) {
}
void EnRailgibud_SetupWalkInCircles(EnRailgibud* this) {
- this->actor.speedXZ = 0.6f;
+ this->actor.speed = 0.6f;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_WALK);
this->actionFunc = EnRailgibud_WalkInCircles;
}
@@ -350,7 +350,7 @@ void EnRailgibud_AttemptPlayerFreeze(EnRailgibud* this, PlayState* play) {
player->actor.freezeTimer = 60;
Rumble_Request(this->actor.xzDistToPlayer, 255, 20, 150);
func_80123E90(play, &this->actor);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_AIM);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_AIM);
EnRailgibud_SetupWalkToPlayer(this);
}
@@ -359,7 +359,7 @@ void EnRailgibud_AttemptPlayerFreeze(EnRailgibud* this, PlayState* play) {
void EnRailgibud_SetupWalkToPlayer(EnRailgibud* this) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_WALK);
- this->actor.speedXZ = 0.4f;
+ this->actor.speed = 0.4f;
if (this->actionFunc == EnRailgibud_AttemptPlayerFreeze) {
this->playerStunWaitTimer = 80;
@@ -382,8 +382,7 @@ void EnRailgibud_WalkToPlayer(EnRailgibud* this, PlayState* play) {
if (EnRailgibud_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 ((GET_PLAYER_FORM == PLAYER_FORM_GORON) || (GET_PLAYER_FORM == 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.
EnRailgibud_SetupGrabFail(this);
@@ -396,7 +395,7 @@ void EnRailgibud_WalkToPlayer(EnRailgibud* this, PlayState* play) {
this->playerStunWaitTimer = 60;
Rumble_Request(this->actor.xzDistToPlayer, 255, 20, 150);
func_80123E90(play, &this->actor);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_AIM);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_AIM);
} else {
this->playerStunWaitTimer--;
}
@@ -412,25 +411,24 @@ void EnRailgibud_WalkToPlayer(EnRailgibud* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, 10.0f) || Animation_OnFrame(&this->skelAnime, 22.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_RIZA_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_RIZA_WALK);
} else if (!(play->gameplayFrames & 95)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_CRY);
}
}
void EnRailgibud_SetupGrab(EnRailgibud* this) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_GRAB_START);
this->grabDamageTimer = 0;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->grabState = EN_RAILGIBUD_GRAB_START;
this->actionFunc = EnRailgibud_Grab;
}
void EnRailgibud_Grab(EnRailgibud* this, PlayState* play) {
- Player* player2 = GET_PLAYER(play);
- Player* player = player2;
+ Actor* playerActor = &GET_PLAYER(play)->actor;
+ Player* player = (Player*)playerActor;
s32 inPositionToAttack;
- u16 damageSfxId;
switch (this->grabState) {
case EN_RAILGIBUD_GRAB_START:
@@ -440,7 +438,7 @@ void EnRailgibud_Grab(EnRailgibud* this, PlayState* play) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_GRAB_ATTACK);
} else if (!(player->stateFlags2 & PLAYER_STATE2_80)) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_GRAB_END);
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->grabState = EN_RAILGIBUD_GRAB_RELEASE;
this->grabDamageTimer = 0;
}
@@ -448,11 +446,10 @@ void EnRailgibud_Grab(EnRailgibud* this, PlayState* play) {
case EN_RAILGIBUD_GRAB_ATTACK:
if (this->grabDamageTimer == 20) {
- s16 requiredScopeTemp;
+ u16 damageSfxId = player->ageProperties->voiceSfxIdOffset + NA_SE_VO_LI_DAMAGE_S;
- damageSfxId = player->ageProperties->voiceSfxIdOffset + NA_SE_VO_LI_DAMAGE_S;
play->damagePlayer(play, -8);
- func_800B8E58(player, damageSfxId);
+ Player_PlaySfx(player, damageSfxId);
Rumble_Request(this->actor.xzDistToPlayer, 240, 1, 12);
this->grabDamageTimer = 0;
} else {
@@ -460,17 +457,17 @@ void EnRailgibud_Grab(EnRailgibud* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, 0.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_ATTACK);
}
if (!(player->stateFlags2 & PLAYER_STATE2_80) || (player->unk_B62 != 0)) {
if ((player->unk_B62 != 0) && (player->stateFlags2 & PLAYER_STATE2_80)) {
player->stateFlags2 &= ~PLAYER_STATE2_80;
- player->unk_AE8 = 100;
+ player->actionVar2 = 100;
}
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_GRAB_END);
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->grabState = EN_RAILGIBUD_GRAB_RELEASE;
this->grabDamageTimer = 0;
}
@@ -490,14 +487,14 @@ void EnRailgibud_Grab(EnRailgibud* this, PlayState* play) {
void EnRailgibud_SetupGrabFail(EnRailgibud* this) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_DAMAGE);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_DAMAGE);
- this->actor.speedXZ = -2.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_DAMAGE);
+ this->actor.speed = -2.0f;
this->actionFunc = EnRailgibud_GrabFail;
}
void EnRailgibud_GrabFail(EnRailgibud* this, PlayState* play) {
- if (this->actor.speedXZ < 0.0f) {
- this->actor.speedXZ += 0.15f;
+ if (this->actor.speed < 0.0f) {
+ this->actor.speed += 0.15f;
}
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
@@ -530,18 +527,18 @@ void EnRailgibud_TurnAwayAndShakeHead(EnRailgibud* this, PlayState* play) {
void EnRailgibud_SetupWalkToHome(EnRailgibud* this) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_WALK);
- this->actor.speedXZ = 0.4f;
+ this->actor.speed = 0.4f;
this->actionFunc = EnRailgibud_WalkToHome;
}
void EnRailgibud_WalkToHome(EnRailgibud* this, PlayState* play) {
Math_SmoothStepToS(&this->headRotation.y, 0, 1, 100, 0);
Math_SmoothStepToS(&this->upperBodyRotation.y, 0, 1, 100, 0);
- if (Actor_XZDistanceToPoint(&this->actor, &this->actor.home.pos) < 5.0f) {
- if (this->actor.speedXZ > 0.2f) {
- this->actor.speedXZ -= 0.2f;
+ if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) < 5.0f) {
+ if (this->actor.speed > 0.2f) {
+ this->actor.speed -= 0.2f;
} else {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.home.rot.y, 1, 200, 10);
@@ -550,11 +547,12 @@ void EnRailgibud_WalkToHome(EnRailgibud* this, PlayState* play) {
EnRailgibud_SetupWalkInCircles(this);
}
} else {
- Math_ScaledStepToS(&this->actor.shape.rot.y, Actor_YawToPoint(&this->actor, &this->actor.home.pos), 450);
+ Math_ScaledStepToS(&this->actor.shape.rot.y, Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos),
+ 450);
this->actor.world.rot = this->actor.shape.rot;
}
if (EnRailgibud_PlayerInRangeWithCorrectState(this, play)) {
- if ((gSaveContext.save.playerForm != PLAYER_FORM_GORON) && (gSaveContext.save.playerForm != PLAYER_FORM_DEKU) &&
+ if ((GET_PLAYER_FORM != PLAYER_FORM_GORON) && (GET_PLAYER_FORM != PLAYER_FORM_DEKU) &&
Actor_IsFacingPlayer(&this->actor, 0x38E3)) {
EnRailgibud_SetupWalkToPlayer(this);
}
@@ -563,17 +561,17 @@ void EnRailgibud_WalkToHome(EnRailgibud* this, PlayState* play) {
void EnRailgibud_SetupDamage(EnRailgibud* this) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_DAMAGE);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_DAMAGE);
this->stunTimer = 0;
this->grabWaitTimer = 0;
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
- this->actor.speedXZ = -2.0f;
+ this->actor.speed = -2.0f;
this->actionFunc = EnRailgibud_Damage;
}
void EnRailgibud_Damage(EnRailgibud* this, PlayState* play) {
- if (this->actor.speedXZ < 0.0f) {
- this->actor.speedXZ += 0.15f;
+ if (this->actor.speed < 0.0f) {
+ this->actor.speed += 0.15f;
}
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
@@ -596,9 +594,9 @@ void EnRailgibud_SetupStunned(EnRailgibud* this) {
this->stunTimer = 10;
if (this->drawDmgEffTimer != 0) {
- Actor_SetColorFilter(&this->actor, 0, 0xC8, 0, 0x28);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 200, COLORFILTER_BUFFLAG_OPA, 40);
} else {
- Actor_SetColorFilter(&this->actor, 0, 0xC8, 0, 0x28);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 200, COLORFILTER_BUFFLAG_OPA, 40);
}
this->actionFunc = EnRailgibud_Stunned;
@@ -620,8 +618,8 @@ void EnRailgibud_Stunned(EnRailgibud* this, PlayState* play) {
void EnRailgibud_SetupDead(EnRailgibud* this) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_DEATH);
- this->actor.flags &= ~ACTOR_FLAG_1;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_DEAD);
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_DEAD);
this->deathTimer = 0;
this->actionFunc = EnRailgibud_Dead;
}
@@ -637,7 +635,7 @@ void EnRailgibud_Dead(EnRailgibud* this, PlayState* play) {
// stop drawing it, and make its Update function only check to see if
// the Gibdos should move forward.
this->actor.draw = NULL;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.update = EnRailgibud_MainGibdo_DeadUpdate;
}
} else {
@@ -750,7 +748,7 @@ s32 EnRailgibud_PlayerInRangeWithCorrectState(EnRailgibud* this, PlayState* play
return false;
}
- if (Actor_DistanceToPoint(&player->actor, &this->actor.home.pos) < 100.0f &&
+ if (Actor_WorldDistXYZToPoint(&player->actor, &this->actor.home.pos) < 100.0f &&
!(player->stateFlags1 & (PLAYER_STATE1_80 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000 | PLAYER_STATE1_40000 |
PLAYER_STATE1_80000 | PLAYER_STATE1_200000)) &&
!(player->stateFlags2 & (PLAYER_STATE2_80 | PLAYER_STATE2_4000))) {
@@ -768,7 +766,7 @@ s32 EnRailgibud_PlayerInRangeWithCorrectState(EnRailgibud* this, PlayState* play
s32 EnRailgibud_PlayerOutOfRange(EnRailgibud* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (Actor_DistanceToPoint(&player->actor, &this->actor.home.pos) >= 100.0f) {
+ if (Actor_WorldDistXYZToPoint(&player->actor, &this->actor.home.pos) >= 100.0f) {
return true;
}
@@ -787,7 +785,7 @@ void EnRailgibud_UpdateDamage(EnRailgibud* this, PlayState* play) {
switch (this->actor.colChkInfo.damageEffect) {
case EN_RAILGIBUD_DMGEFF_DAMAGE:
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
if (player->unk_ADC != 0) {
this->unk_405 = player->unk_ADD;
}
@@ -808,7 +806,7 @@ void EnRailgibud_UpdateDamage(EnRailgibud* this, PlayState* play) {
break;
case EN_RAILGIBUD_DMGEFF_FIRE_ARROW:
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
if (this->actor.colChkInfo.health == 0) {
EnRailgibud_SetupDead(this);
} else {
@@ -820,7 +818,7 @@ void EnRailgibud_UpdateDamage(EnRailgibud* this, PlayState* play) {
break;
case EN_RAILGIBUD_DMGEFF_LIGHT_ARROW:
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
if (this->actor.colChkInfo.health == 0) {
EnRailgibud_SetupDead(this);
} else {
@@ -868,7 +866,7 @@ s32 EnRailgibud_MoveToIdealGrabPositionAndRotation(EnRailgibud* this, PlayState*
distanceFromTargetPos = Math_Vec3f_StepTo(&this->actor.world.pos, &targetPos, 10.0f);
distanceFromTargetAngle = Math_SmoothStepToS(&this->actor.shape.rot.y, player->actor.shape.rot.y, 1, 0x1770, 0x64);
this->actor.world.rot.y = this->actor.shape.rot.y;
- if (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_HUMAN) {
distanceFromTargetYOffset = Math_SmoothStepToF(&this->actor.shape.yOffset, -1500.0f, 1.0f, 150.0f, 0.0f);
}
@@ -900,13 +898,15 @@ 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) &&
- (this->actor.bgCheckFlags & 8)) {
+ (this->actor.bgCheckFlags & BGCHECKFLAG_WALL)) {
targetPos = player->actor.world.pos;
targetPos.x += 10.0f * Math_SinS(this->actor.wallYaw);
targetPos.z += 10.0f * Math_CosS(this->actor.wallYaw);
@@ -931,10 +931,10 @@ void EnRailgibud_CheckForGibdoMask(EnRailgibud* this, PlayState* play) {
if ((this->actionFunc != EnRailgibud_Grab) && (this->actionFunc != EnRailgibud_Damage) &&
(this->actionFunc != EnRailgibud_GrabFail) && (this->actionFunc != EnRailgibud_TurnAwayAndShakeHead) &&
(this->actionFunc != EnRailgibud_Dead)) {
- if (CHECK_FLAG_ALL(this->actor.flags, (ACTOR_FLAG_1 | ACTOR_FLAG_4))) {
+ if (CHECK_FLAG_ALL(this->actor.flags, (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY))) {
if (Player_GetMask(play) == PLAYER_MASK_GIBDO) {
- this->actor.flags &= ~(ACTOR_FLAG_4 | ACTOR_FLAG_1);
- this->actor.flags |= (ACTOR_FLAG_8 | ACTOR_FLAG_1);
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY);
+ this->actor.flags |= (ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_TARGETABLE);
this->actor.hintId = TATL_HINT_ID_NONE;
this->actor.textId = 0;
if ((this->actionFunc != EnRailgibud_WalkInCircles) && (this->actionFunc != EnRailgibud_WalkToHome)) {
@@ -942,8 +942,8 @@ void EnRailgibud_CheckForGibdoMask(EnRailgibud* this, PlayState* play) {
}
}
} else if (Player_GetMask(play) != PLAYER_MASK_GIBDO) {
- this->actor.flags &= ~(ACTOR_FLAG_8 | ACTOR_FLAG_1);
- this->actor.flags |= (ACTOR_FLAG_4 | ACTOR_FLAG_1);
+ this->actor.flags &= ~(ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_TARGETABLE);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY);
if (this->type == EN_RAILGIBUD_TYPE_REDEAD) {
this->actor.hintId = TATL_HINT_ID_REDEAD;
} else {
@@ -962,11 +962,11 @@ void EnRailgibud_CheckIfTalkingToPlayer(EnRailgibud* this, PlayState* play) {
this->isInvincible = true;
Message_StartTextbox(play, 0x13B2, &this->actor);
this->textId = 0x13B2;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_AIM);
- this->actor.speedXZ = 0.0f;
- } else if (CHECK_FLAG_ALL(this->actor.flags, (ACTOR_FLAG_1 | ACTOR_FLAG_8)) &&
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_AIM);
+ this->actor.speed = 0.0f;
+ } else if (CHECK_FLAG_ALL(this->actor.flags, (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)) &&
!(this->collider.base.acFlags & AC_HIT)) {
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
} else {
switch (Message_GetState(&play->msgCtx)) {
@@ -981,7 +981,7 @@ void EnRailgibud_CheckIfTalkingToPlayer(EnRailgibud* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
this->textId = 0;
this->isInvincible = false;
- this->actor.speedXZ = 0.6f;
+ this->actor.speed = 0.6f;
}
break;
@@ -1061,8 +1061,8 @@ void EnRailgibud_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s
(limbIndex == GIBDO_LIMB_LEFT_FOREARM) || (limbIndex == GIBDO_LIMB_LEFT_HAND) ||
(limbIndex == GIBDO_LIMB_RIGHT_SHOULDER_AND_UPPER_ARM) || (limbIndex == GIBDO_LIMB_RIGHT_FOREARM) ||
(limbIndex == GIBDO_LIMB_RIGHT_HAND) || (limbIndex == GIBDO_LIMB_HEAD) || (limbIndex == GIBDO_LIMB_PELVIS))) {
- Matrix_MultZero(&this->limbPos[this->limbIndex]);
- this->limbIndex++;
+ Matrix_MultZero(&this->bodyPartsPos[this->bodyPartIndex]);
+ this->bodyPartIndex++;
}
}
@@ -1071,9 +1071,9 @@ void EnRailgibud_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- this->limbIndex = 0;
+ this->bodyPartIndex = 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);
@@ -1082,7 +1082,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);
@@ -1093,7 +1093,7 @@ void EnRailgibud_Draw(Actor* thisx, PlayState* play) {
}
if (this->drawDmgEffTimer > 0) {
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), this->drawDmgEffScale,
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, ENRAILGIBUD_BODYPART_MAX, this->drawDmgEffScale,
0.5f, this->drawDmgEffAlpha, this->drawDmgEffType);
}
@@ -1103,8 +1103,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;
@@ -1123,30 +1123,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;
}
}
@@ -1174,76 +1174,79 @@ 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;
+ this->csAnimIndex = EN_RAILGIBUD_ANIM_IDLE;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_IDLE);
break;
case 2:
- this->cutsceneAnimIndex = EN_RAILGIBUD_ANIM_SLUMP_START;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_WEAKENED2);
+ this->csAnimIndex = EN_RAILGIBUD_ANIM_SLUMP_START;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_WEAKENED2);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_SLUMP_START);
break;
case 3:
- this->cutsceneAnimIndex = EN_RAILGIBUD_ANIM_CONVULSION;
+ this->csAnimIndex = EN_RAILGIBUD_ANIM_CONVULSION;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_CONVULSION);
break;
case 4:
- this->cutsceneAnimIndex = EN_RAILGIBUD_ANIM_ARMS_UP_START;
+ this->csAnimIndex = EN_RAILGIBUD_ANIM_ARMS_UP_START;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_ARMS_UP_START);
break;
case 5:
- this->cutsceneAnimIndex = EN_RAILGIBUD_ANIM_WALK;
+ this->csAnimIndex = EN_RAILGIBUD_ANIM_WALK;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_WALK);
break;
+
+ default:
+ break;
}
} else if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- if (this->cutsceneAnimIndex == EN_RAILGIBUD_ANIM_SLUMP_START) {
- this->cutsceneAnimIndex = EN_RAILGIBUD_ANIM_SLUMP_LOOP;
+ if (this->csAnimIndex == EN_RAILGIBUD_ANIM_SLUMP_START) {
+ this->csAnimIndex = EN_RAILGIBUD_ANIM_SLUMP_LOOP;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_SLUMP_LOOP);
- } else if (this->cutsceneAnimIndex == EN_RAILGIBUD_ANIM_ARMS_UP_START) {
- this->cutsceneAnimIndex = EN_RAILGIBUD_ANIM_ARMS_UP_LOOP;
+ } else if (this->csAnimIndex == EN_RAILGIBUD_ANIM_ARMS_UP_START) {
+ this->csAnimIndex = EN_RAILGIBUD_ANIM_ARMS_UP_LOOP;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_ARMS_UP_LOOP);
EnRailgibud_SetupSinkIntoGround(this);
}
}
- switch (this->csAction) {
+ switch (this->cueId) {
case 3:
case 4:
if (this->actionFunc == EnRailgibud_SinkIntoGround) {
- func_800B9010(&this->actor, NA_SE_EN_REDEAD_WEAKENED_L2 - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_REDEAD_WEAKENED_L2 - SFX_FLAG);
} else {
- func_800B9010(&this->actor, NA_SE_EN_REDEAD_WEAKENED_L1 - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_REDEAD_WEAKENED_L1 - SFX_FLAG);
}
break;
case 5:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- if (play->csCtx.frames < 280) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_CRY);
+ if (play->csCtx.curFrame < 280) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_CRY);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_WEAKENED1);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_WEAKENED1);
}
}
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..c9536d235 100644
--- a/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.h
+++ b/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.h
@@ -10,15 +10,34 @@ 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 enum EnRailgibudBodyPart {
+ /* 0 */ ENRAILGIBUD_BODYPART_0,
+ /* 1 */ ENRAILGIBUD_BODYPART_1,
+ /* 2 */ ENRAILGIBUD_BODYPART_2,
+ /* 3 */ ENRAILGIBUD_BODYPART_3,
+ /* 4 */ ENRAILGIBUD_BODYPART_4,
+ /* 5 */ ENRAILGIBUD_BODYPART_5,
+ /* 6 */ ENRAILGIBUD_BODYPART_6,
+ /* 7 */ ENRAILGIBUD_BODYPART_7,
+ /* 8 */ ENRAILGIBUD_BODYPART_8,
+ /* 9 */ ENRAILGIBUD_BODYPART_9,
+ /* 10 */ ENRAILGIBUD_BODYPART_10,
+ /* 11 */ ENRAILGIBUD_BODYPART_11,
+ /* 12 */ ENRAILGIBUD_BODYPART_12,
+ /* 13 */ ENRAILGIBUD_BODYPART_13,
+ /* 14 */ ENRAILGIBUD_BODYPART_14,
+ /* 15 */ ENRAILGIBUD_BODYPART_MAX
+} EnRailgibudBodyPart;
typedef struct EnRailgibud {
/* 0x000 */ Actor actor;
/* 0x144 */ ColliderCylinder collider;
/* 0x190 */ SkelAnime skelAnime;
/* 0x1D4 */ EnRailgibudActionFunc actionFunc;
- /* 0x1D8 */ Vec3f limbPos[15];
- /* 0x28C */ s32 limbIndex;
+ /* 0x1D8 */ Vec3f bodyPartsPos[ENRAILGIBUD_BODYPART_MAX];
+ /* 0x28C */ s32 bodyPartIndex;
/* 0x290 */ UNK_TYPE1 unk290[0x4];
/* 0x294 */ Vec3s* points;
/* 0x298 */ s32 currentPoint;
@@ -33,7 +52,7 @@ typedef struct EnRailgibud {
/* 0x3EE */ s16 shouldWalkForwardNextFrame; // Only used by the "main" Gibdo
/* 0x3F0 */ union {
s16 grabState;
- s16 cutsceneAnimIndex;
+ s16 csAnimIndex;
};
/* 0x3F2 */ union {
s16 playerStunWaitTimer; // Cannot stun the player if this is non-zero
@@ -47,8 +66,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 da0b27e6d..1dea0c2ee 100644
--- a/src/overlays/actors/ovl_En_Rat/z_en_rat.c
+++ b/src/overlays/actors/ovl_En_Rat/z_en_rat.c
@@ -8,7 +8,7 @@
#include "objects/gameplay_keep/gameplay_keep.h"
#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_200)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_200)
#define THIS ((EnRat*)thisx)
@@ -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;
}
@@ -293,7 +293,7 @@ void EnRat_ChooseDirection(EnRat* this) {
angle -= 0x8000;
}
} else {
- if (Actor_DistanceToPoint(&this->actor, &this->actor.home.pos) > 50.0f) {
+ if (Actor_WorldDistXYZToPoint(&this->actor, &this->actor.home.pos) > 50.0f) {
Vec3f homeInHome;
Vec3f worldInHome;
Vec3f worldPlusForwardInHome;
@@ -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;
}
}
@@ -386,7 +387,7 @@ s32 EnRat_IsTouchingSurface(EnRat* this, PlayState* play) {
bgIdUpDown = bgIdSide = BGCHECK_SCENE;
- lineLength = 2.0f * this->actor.speedXZ;
+ lineLength = 2.0f * this->actor.speed;
posA.x = this->actor.world.pos.x + (this->axisUp.x * 5.0f);
posA.y = this->actor.world.pos.y + (this->axisUp.y * 5.0f);
@@ -409,7 +410,7 @@ s32 EnRat_IsTouchingSurface(EnRat* this, PlayState* play) {
this->shouldRotateOntoSurfaces |= EnRat_UpdateFloorPoly(this, polySide, play);
Math_Vec3f_Copy(&this->actor.world.pos, &posSide);
this->actor.floorBgId = bgIdSide;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
} else {
if (polyUpDown != this->actor.floorPoly) {
this->shouldRotateOntoSurfaces |= EnRat_UpdateFloorPoly(this, polyUpDown, play);
@@ -419,7 +420,7 @@ s32 EnRat_IsTouchingSurface(EnRat* this, PlayState* play) {
this->actor.floorBgId = bgIdUpDown;
}
} else {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
lineLength *= 3.0f;
Math_Vec3f_Copy(&posA, &posB);
@@ -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;
@@ -534,8 +535,8 @@ void EnRat_SetupRevive(EnRat* this) {
this->actor.shape.rot.z = this->actor.home.rot.z;
EnRat_InitializeAxes(this);
EnRat_UpdateRotation(this);
- this->actor.flags &= ~ACTOR_FLAG_1;
- this->actor.speedXZ = 0.0f;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ this->actor.speed = 0.0f;
Animation_PlayLoopSetSpeed(&this->skelAnime, &gRealBombchuSpotAnim, 0.0f);
this->revivePosY = 2666.6667f;
this->actor.draw = NULL;
@@ -551,7 +552,7 @@ void EnRat_Revive(EnRat* this, PlayState* play) {
if (this->timer > 0) {
this->timer--;
if (this->timer == 0) {
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actor.draw = EnRat_Draw;
this->skelAnime.playSpeed = 1.0f;
}
@@ -573,7 +574,7 @@ void EnRat_Revive(EnRat* this, PlayState* play) {
void EnRat_SetupIdle(EnRat* this) {
Animation_PlayLoop(&this->skelAnime, &gRealBombchuRunAnim);
this->animLoopCounter = 5;
- this->actor.speedXZ = 2.0f;
+ this->actor.speed = 2.0f;
this->actionFunc = EnRat_Idle;
}
@@ -583,16 +584,16 @@ void EnRat_SetupIdle(EnRat* this) {
void EnRat_Idle(EnRat* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- this->actor.speedXZ = 2.0f;
+ this->actor.speed = 2.0f;
if (Animation_OnFrame(&this->skelAnime, 0.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BOMCHU_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BOMCHU_WALK);
if (this->animLoopCounter != 0) {
this->animLoopCounter--;
}
}
if ((this->animLoopCounter == 0) && (Rand_ZeroOne() < 0.05f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BOMCHU_VOICE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BOMCHU_VOICE);
this->animLoopCounter = 5;
}
@@ -606,7 +607,7 @@ void EnRat_SetupSpottedPlayer(EnRat* this) {
this->actor.flags |= ACTOR_FLAG_10;
Animation_MorphToLoop(&this->skelAnime, &gRealBombchuSpotAnim, -5.0f);
this->animLoopCounter = 3;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = EnRat_SpottedPlayer;
}
@@ -615,7 +616,7 @@ void EnRat_SetupSpottedPlayer(EnRat* this) {
*/
void EnRat_SpottedPlayer(EnRat* this, PlayState* play) {
if ((this->animLoopCounter == 3) && Animation_OnFrame(&this->skelAnime, 5.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BOMCHU_AIM);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BOMCHU_AIM);
}
if (Animation_OnFrame(&this->skelAnime, 0.0f)) {
@@ -632,15 +633,15 @@ 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);
}
}
void EnRat_SetupChasePlayer(EnRat* this) {
Animation_MorphToLoop(&this->skelAnime, &gRealBombchuRunAnim, -5.0f);
- this->actor.speedXZ = 6.1f;
+ this->actor.speed = 6.1f;
EnRat_UpdateSparkOffsets(this);
this->actionFunc = EnRat_ChasePlayer;
}
@@ -659,7 +660,7 @@ void EnRat_ChasePlayer(EnRat* this, PlayState* play) {
Vec3f blureP1;
Vec3f blureP2;
- this->actor.speedXZ = 6.1f;
+ this->actor.speed = 6.1f;
if (this->hasLostTrackOfPlayer) {
if (!(player->stateFlags3 & PLAYER_STATE3_100) && (Player_GetMask(play) != PLAYER_MASK_STONE) &&
Actor_IsFacingPlayer(&this->actor, 0x3000)) {
@@ -674,7 +675,7 @@ void EnRat_ChasePlayer(EnRat* this, PlayState* play) {
this->animLoopCounter--;
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BOMCHU_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BOMCHU_WALK);
}
DECR(this->timer);
@@ -699,26 +700,26 @@ void EnRat_ChasePlayer(EnRat* this, PlayState* play) {
func_800B1210(play, &this->actor.world.pos, &sDustVelocity, &gZeroVec3f, 550, 50);
}
- if ((this->actor.floorPoly == NULL) && (Animation_OnFrame(&this->skelAnime, 0.0f))) {
+ if ((this->actor.floorPoly == NULL) && Animation_OnFrame(&this->skelAnime, 0.0f)) {
EnRat_SpawnWaterEffects(this, play);
}
if ((this->animLoopCounter == 0) && (Rand_ZeroOne() < 0.05f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BOMCHU_AIM);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BOMCHU_AIM);
this->animLoopCounter = 5;
}
- func_800B9010(&this->actor, NA_SE_EN_BOMCHU_RUN - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_BOMCHU_RUN - SFX_FLAG);
EnRat_UpdateSparkOffsets(this);
}
void EnRat_SetupBounced(EnRat* this) {
- this->actor.speedXZ = 5.0f;
+ this->actor.speed = 5.0f;
this->actor.velocity.y = 8.0f;
this->actor.world.rot.y = this->actor.yawTowardsPlayer + 0x8000;
this->actor.gravity = -1.0f;
EnRat_UpdateSparkOffsets(this);
- this->actor.bgCheckFlags &= ~(0x10 | 0x8 | 0x1);
+ this->actor.bgCheckFlags &= ~(BGCHECKFLAG_GROUND | BGCHECKFLAG_WALL | BGCHECKFLAG_CEILING);
this->actionFunc = EnRat_Bounced;
}
@@ -733,14 +734,15 @@ void EnRat_Bounced(EnRat* this, PlayState* play) {
this->timer = 30;
}
- if (this->actor.bgCheckFlags & (0x10 | 0x8 | 0x1)) {
+ if (this->actor.bgCheckFlags & (BGCHECKFLAG_GROUND | BGCHECKFLAG_WALL | BGCHECKFLAG_CEILING)) {
EnRat_Explode(this, 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, ENBOM_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, 0, BOMB_TYPE_BODY);
if (bomb != NULL) {
bomb->timer = 0;
@@ -750,7 +752,7 @@ void EnRat_Explode(EnRat* this, PlayState* play) {
Item_DropCollectibleRandom(play, &this->actor, &this->actor.world.pos, 0x100);
}
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = EnRat_PostDetonation;
}
@@ -790,10 +792,10 @@ void EnRat_Update(Actor* thisx, PlayState* play) {
if (this->actor.colChkInfo.damageEffect == EN_RAT_DMGEFF_HOOKSHOT) {
this->damageReaction.hookedState = EN_RAT_HOOK_STARTED;
} else if (this->actor.colChkInfo.damageEffect == EN_RAT_DMGEFF_STUN) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
- Actor_SetColorFilter(&this->actor, 0, 120, 0, 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 120, COLORFILTER_BUFFLAG_OPA, 40);
if (this->actionFunc == EnRat_Bounced) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->actor.velocity.y > 0.0f) {
this->actor.velocity.y = 0.0f;
}
@@ -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 3e46c9f04..276ff8db7 100644
--- a/src/overlays/actors/ovl_En_Rd/z_en_rd.c
+++ b/src/overlays/actors/ovl_En_Rd/z_en_rd.c
@@ -26,7 +26,7 @@
#include "z64rumble.h"
#include "objects/object_rd/object_rd.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_400)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_400)
#define THIS ((EnRd*)thisx)
@@ -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 = {
@@ -188,7 +188,7 @@ void EnRd_Init(Actor* thisx, PlayState* play) {
s32 pad;
Actor_ProcessInitChain(&this->actor, sInitChain);
- this->actor.targetMode = 0;
+ this->actor.targetMode = TARGET_MODE_0;
this->actor.colChkInfo.damageTable = &sDamageTable;
ActorShape_Init(&this->actor.shape, 0.0f, NULL, 0.0f);
this->upperBodyYRotation = this->headYRotation = 0;
@@ -266,7 +266,7 @@ void EnRd_Init(Actor* thisx, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (EN_RD_GET_TYPE(&this->actor) == EN_RD_TYPE_INVISIBLE) {
- this->actor.flags |= ACTOR_FLAG_80;
+ this->actor.flags |= ACTOR_FLAG_REACT_TO_LENS;
}
if (EN_RD_GET_TYPE(&this->actor) == EN_RD_TYPE_FROZEN) {
@@ -356,7 +356,7 @@ void EnRd_SetupIdle(EnRd* this) {
this->action = EN_RD_ACTION_IDLE;
this->animationJudderTimer = (Rand_ZeroOne() * 10.0f) + 5.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = EnRd_Idle;
}
@@ -410,7 +410,7 @@ void EnRd_Idle(EnRd* this, PlayState* play) {
}
if ((play->gameplayFrames & 0x5F) == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_CRY);
}
}
@@ -419,7 +419,7 @@ void EnRd_SetupSquattingDance(EnRd* this) {
this->action = EN_RD_ACTION_SQUATTING_DANCE;
this->animationJudderTimer = (Rand_ZeroOne() * 10.0f) + 5.0f;
this->danceEndTimer = 0;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = EnRd_SquattingDance;
}
@@ -454,7 +454,7 @@ void EnRd_SquattingDance(EnRd* this, PlayState* play) {
}
if ((play->gameplayFrames & 0x5F) == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_CRY);
}
}
@@ -463,7 +463,7 @@ void EnRd_SetupClappingDance(EnRd* this) {
this->action = EN_RD_ACTION_CLAPPING_DANCE;
this->animationJudderTimer = (Rand_ZeroOne() * 10.0f) + 5.0f;
this->danceEndTimer = 0;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = EnRd_ClappingDance;
}
@@ -498,14 +498,14 @@ void EnRd_ClappingDance(EnRd* this, PlayState* play) {
}
if ((play->gameplayFrames & 0x5F) == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_CRY);
}
}
void EnRd_EndClappingOrSquattingDanceWhenPlayerIsClose(EnRd* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if ((play->gameplayFrames & 0x5F) == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_CRY);
}
this->danceEndTimer++;
@@ -523,8 +523,8 @@ void EnRd_SetupPirouette(EnRd* this) {
Animation_MorphToLoop(&this->skelAnime, &gGibdoRedeadPirouetteAnim, -6.0f);
this->action = EN_RD_ACTION_PIROUETTE;
this->animationJudderTimer = (Rand_ZeroOne() * 10.0f) + 5.0f;
- this->pirouetteRotationalVelocity = 0x1112;
- this->actor.speedXZ = 0.0f;
+ this->pirouetteAngularVelocity = 0x1112;
+ this->actor.speed = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = EnRd_Pirouette;
}
@@ -558,32 +558,32 @@ void EnRd_Pirouette(EnRd* this, PlayState* play) {
}
if ((play->gameplayFrames & 0x5F) == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_CRY);
}
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- this->pirouetteRotationalVelocity = 0x1112;
+ this->pirouetteAngularVelocity = 0x1112;
} else if (Animation_OnFrame(&this->skelAnime, 15.0f)) {
- this->pirouetteRotationalVelocity = 0x199A;
+ this->pirouetteAngularVelocity = 0x199A;
}
- this->actor.world.rot.y -= this->pirouetteRotationalVelocity;
+ this->actor.world.rot.y -= this->pirouetteAngularVelocity;
this->actor.shape.rot.y = this->actor.world.rot.y;
}
void EnRd_EndPirouetteWhenPlayerIsClose(EnRd* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if ((play->gameplayFrames & 0x5F) == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_CRY);
}
- this->actor.world.rot.y -= this->pirouetteRotationalVelocity;
+ this->actor.world.rot.y -= this->pirouetteAngularVelocity;
this->actor.shape.rot.y = this->actor.world.rot.y;
- this->pirouetteRotationalVelocity -= 0x64;
- if ((this->pirouetteRotationalVelocity < 0x834) && (this->pirouetteRotationalVelocity >= 0x7D0)) {
+ this->pirouetteAngularVelocity -= 0x64;
+ if ((this->pirouetteAngularVelocity < 0x834) && (this->pirouetteAngularVelocity >= 0x7D0)) {
Animation_Change(&this->skelAnime, &gGibdoRedeadLookBackAnim, 0.0f, 0.0f, 19.0f, ANIMMODE_ONCE, -10.0f);
- } else if (this->pirouetteRotationalVelocity < 0x3E8) {
+ } else if (this->pirouetteAngularVelocity < 0x3E8) {
if ((EN_RD_GET_TYPE(&this->actor) != EN_RD_TYPE_CRYING) && (!this->isMourning)) {
EnRd_SetupAttemptPlayerFreeze(this);
} else {
@@ -600,7 +600,7 @@ void EnRd_SetupRiseFromCoffin(EnRd* this) {
this->actor.shape.rot.x = -0x4000;
this->actor.gravity = 0.0f;
this->actor.shape.yOffset = 0.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = EnRd_RiseFromCoffin;
}
@@ -613,14 +613,14 @@ void EnRd_RiseFromCoffin(EnRd* this, PlayState* play) {
}
} else {
if (this->actor.world.pos.y == this->actor.home.pos.y) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_CRY);
}
if (Math_SmoothStepToF(&this->actor.world.pos.y, this->actor.home.pos.y + 50.0f, 0.3f, 2.0f, 0.3f) == 0.0f) {
if (this->coffinRiseForwardAccelTimer != 0) {
this->coffinRiseForwardAccelTimer--;
- Math_SmoothStepToF(&this->actor.speedXZ, 6.0f, 0.3f, 1.0f, 0.3f);
- } else if (Math_SmoothStepToF(&this->actor.speedXZ, 0.0f, 0.3f, 1.0f, 0.3f) == 0.0f) {
+ Math_SmoothStepToF(&this->actor.speed, 6.0f, 0.3f, 1.0f, 0.3f);
+ } else if (Math_SmoothStepToF(&this->actor.speed, 0.0f, 0.3f, 1.0f, 0.3f) == 0.0f) {
Math_SmoothStepToS(&this->actor.shape.rot.x, 0, 1, 0x7D0, 0);
}
}
@@ -631,7 +631,7 @@ void EnRd_SetupWalkToPlayer(EnRd* this, PlayState* play) {
f32 frameCount = Animation_GetLastFrame(&gGibdoRedeadWalkAnim);
Animation_Change(&this->skelAnime, &gGibdoRedeadWalkAnim, 1.0f, 4.0f, frameCount, ANIMMODE_LOOP_INTERP, -4.0f);
- this->actor.speedXZ = 0.4f;
+ this->actor.speed = 0.4f;
this->action = EN_RD_ACTION_WALKING_TO_PLAYER_OR_RELEASING_GRAB;
this->actionFunc = EnRd_WalkToPlayer;
}
@@ -642,18 +642,18 @@ void EnRd_WalkToPlayer(EnRd* this, PlayState* play) {
s16 yaw =
((this->actor.yawTowardsPlayer - this->actor.shape.rot.y) - this->headYRotation) - this->upperBodyYRotation;
- this->skelAnime.playSpeed = this->actor.speedXZ;
+ this->skelAnime.playSpeed = this->actor.speed;
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 1, 250, 0);
Math_SmoothStepToS(&this->headYRotation, 0, 1, 100, 0);
Math_SmoothStepToS(&this->upperBodyYRotation, 0, 1, 100, 0);
this->actor.world.rot.y = this->actor.shape.rot.y;
SkelAnime_Update(&this->skelAnime);
- if (Actor_DistanceToPoint(&player->actor, &this->actor.home.pos) >= 150.0f) {
+ if (Actor_WorldDistXYZToPoint(&player->actor, &this->actor.home.pos) >= 150.0f) {
EnRd_SetupWalkToHome(this, play);
}
- if ((ABS_ALT(yaw) < 0x1554) && (Actor_DistanceBetweenActors(&this->actor, &player->actor) <= 150.0f)) {
+ if ((ABS_ALT(yaw) < 0x1554) && (Actor_WorldDistXYZToActor(&this->actor, &player->actor) <= 150.0f)) {
if (!(player->stateFlags1 & (PLAYER_STATE1_80 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000 | PLAYER_STATE1_40000 |
PLAYER_STATE1_80000 | PLAYER_STATE1_200000)) &&
!(player->stateFlags2 & (PLAYER_STATE2_80 | PLAYER_STATE2_4000))) {
@@ -665,7 +665,7 @@ void EnRd_WalkToPlayer(EnRd* this, PlayState* play) {
Rumble_Request(this->actor.xzDistToPlayer, 255, 20, 150);
}
this->playerStunWaitTimer = 60;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_AIM);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_AIM);
}
} else {
EnRd_SetupWalkToHome(this, play);
@@ -676,11 +676,11 @@ void EnRd_WalkToPlayer(EnRd* this, PlayState* play) {
this->grabWaitTimer--;
}
- if (!this->grabWaitTimer && (Actor_DistanceBetweenActors(&this->actor, &player->actor) <= 45.0f) &&
+ if (!this->grabWaitTimer && (Actor_WorldDistXYZToActor(&this->actor, &player->actor) <= 45.0f) &&
Actor_IsFacingPlayer(&this->actor, 0x38E3)) {
player->actor.freezeTimer = 0;
if ((player->transformation == PLAYER_FORM_GORON) || (player->transformation == PLAYER_FORM_DEKU)) {
- if (Actor_DistanceToPoint(&this->actor, &this->actor.home.pos) < 150.0f) {
+ if (Actor_WorldDistXYZToPoint(&this->actor, &this->actor.home.pos) < 150.0f) {
// 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.
EnRd_SetupGrabFail(this);
@@ -688,7 +688,7 @@ void EnRd_WalkToPlayer(EnRd* this, PlayState* play) {
EnRd_SetupWalkToHome(this, play);
}
} else if (play->grabPlayer(play, player)) {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
EnRd_SetupGrab(this);
}
} else if (EN_RD_GET_TYPE(&this->actor) > EN_RD_TYPE_DOES_NOT_MOURN_IF_WALKING) {
@@ -700,9 +700,9 @@ void EnRd_WalkToPlayer(EnRd* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, 10.0f) || Animation_OnFrame(&this->skelAnime, 22.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_RIZA_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_RIZA_WALK);
} else if ((play->gameplayFrames & 0x5F) == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_CRY);
}
}
@@ -716,12 +716,12 @@ void EnRd_SetupWalkToHome(EnRd* this, PlayState* play) {
void EnRd_WalkToHome(EnRd* this, PlayState* play) {
Player* player = GET_PLAYER(play);
s32 pad;
- s16 sp36 = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ s16 sp36 = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
- if (Actor_DistanceToPoint(&this->actor, &this->actor.home.pos) >= 5.0f) {
+ if (Actor_WorldDistXYZToPoint(&this->actor, &this->actor.home.pos) >= 5.0f) {
Math_SmoothStepToS(&this->actor.shape.rot.y, sp36, 1, 450, 0);
} else {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (!Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.home.rot.y, 1, 450, 0)) {
if (EN_RD_GET_TYPE(&this->actor) != EN_RD_TYPE_CRYING) {
EnRd_SetupIdle(this);
@@ -739,8 +739,8 @@ void EnRd_WalkToHome(EnRd* this, PlayState* play) {
if (!(player->stateFlags1 & (0x200000 | 0x80000 | 0x40000 | 0x4000 | 0x2000 | 0x80)) &&
!(player->stateFlags2 & (0x4000 | 0x80)) && (player->transformation != PLAYER_FORM_GORON) &&
(player->transformation != PLAYER_FORM_DEKU) &&
- (Actor_DistanceToPoint(&player->actor, &this->actor.home.pos) < 150.0f)) {
- this->actor.targetMode = 0;
+ (Actor_WorldDistXYZToPoint(&player->actor, &this->actor.home.pos) < 150.0f)) {
+ this->actor.targetMode = TARGET_MODE_0;
EnRd_SetupWalkToPlayer(this, play);
} else if (EN_RD_GET_TYPE(&this->actor) > EN_RD_TYPE_DOES_NOT_MOURN_IF_WALKING) {
if (this->actor.parent != NULL) {
@@ -751,9 +751,9 @@ void EnRd_WalkToHome(EnRd* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, 10.0f) || Animation_OnFrame(&this->skelAnime, 22.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_RIZA_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_RIZA_WALK);
} else if ((play->gameplayFrames & 0x5F) == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_CRY);
}
}
@@ -779,13 +779,13 @@ void EnRd_WalkToParent(EnRd* this, PlayState* play) {
if (this->actor.parent != NULL) {
parentPos = this->actor.parent->world.pos;
- yaw = Actor_YawToPoint(&this->actor, &parentPos);
+ yaw = Actor_WorldYawTowardPoint(&this->actor, &parentPos);
Math_SmoothStepToS(&this->actor.shape.rot.y, yaw, 1, 250, 0);
- if (Actor_DistanceToPoint(&this->actor, &parentPos) >= 45.0f) {
- this->actor.speedXZ = 0.4f;
+ if (Actor_WorldDistXYZToPoint(&this->actor, &parentPos) >= 45.0f) {
+ this->actor.speed = 0.4f;
} else {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (EN_RD_GET_TYPE(&this->actor) != EN_RD_TYPE_CRYING) {
EnRd_SetupIdle(this);
} else {
@@ -802,9 +802,9 @@ void EnRd_WalkToParent(EnRd* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (Animation_OnFrame(&this->skelAnime, 10.0f) || Animation_OnFrame(&this->skelAnime, 22.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_RIZA_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_RIZA_WALK);
} else if ((play->gameplayFrames & 0x5F) == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_CRY);
}
}
@@ -814,7 +814,7 @@ void EnRd_SetupGrab(EnRd* this) {
this->grabState = 0;
this->grabDamageTimer = 200;
this->action = EN_RD_ACTION_GRABBING;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = EnRd_Grab;
}
@@ -842,7 +842,7 @@ void EnRd_Grab(EnRd* this, PlayState* play) {
if (!(player->stateFlags2 & PLAYER_STATE2_80) || (player->unk_B62 != 0)) {
if ((player->unk_B62 != 0) && (player->stateFlags2 & PLAYER_STATE2_80)) {
player->stateFlags2 &= ~PLAYER_STATE2_80;
- player->unk_AE8 = 100;
+ player->actionVar2 = 100;
}
Animation_Change(&this->skelAnime, &gGibdoRedeadGrabEndAnim, 0.5f, 0.0f,
Animation_GetLastFrame(&gGibdoRedeadGrabEndAnim), ANIMMODE_ONCE_INTERP, 0.0f);
@@ -873,7 +873,7 @@ void EnRd_Grab(EnRd* this, PlayState* play) {
Math_SmoothStepToS(&this->actor.shape.rot.y, player->actor.shape.rot.y, 1, 6000, 0);
if (Animation_OnFrame(&this->skelAnime, 0.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_ATTACK);
}
this->grabDamageTimer--;
@@ -881,7 +881,7 @@ void EnRd_Grab(EnRd* this, PlayState* play) {
play->damagePlayer(play, -8);
Rumble_Request(this->actor.xzDistToPlayer, 240, 1, 12);
this->grabDamageTimer = 20;
- func_800B8E58(player, player->ageProperties->voiceSfxIdOffset + NA_SE_VO_LI_DAMAGE_S);
+ Player_PlaySfx(player, player->ageProperties->voiceSfxIdOffset + NA_SE_VO_LI_DAMAGE_S);
}
break;
@@ -895,8 +895,8 @@ void EnRd_Grab(EnRd* this, PlayState* play) {
if (player->transformation != PLAYER_FORM_FIERCE_DEITY) {
Math_SmoothStepToF(&this->actor.shape.yOffset, 0.0f, 1.0f, 400.0f, 0.0f);
}
- this->actor.targetMode = 0;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.targetMode = TARGET_MODE_0;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->playerStunWaitTimer = 10;
this->grabWaitTimer = 15;
EnRd_SetupWalkToPlayer(this, play);
@@ -922,7 +922,7 @@ void EnRd_AttemptPlayerFreeze(EnRd* this, PlayState* play) {
Rumble_Request(this->actor.xzDistToPlayer, 255, 20, 150);
func_80123E90(play, &this->actor);
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_AIM);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_AIM);
EnRd_SetupWalkToPlayer(this, play);
}
}
@@ -930,15 +930,15 @@ void EnRd_AttemptPlayerFreeze(EnRd* this, PlayState* play) {
void EnRd_SetupGrabFail(EnRd* this) {
this->action = EN_RD_ACTION_FAILING_GRAB;
Animation_MorphToPlayOnce(&this->skelAnime, &gGibdoRedeadDamageAnim, -6.0f);
- this->actor.speedXZ = -2.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_DAMAGE);
+ this->actor.speed = -2.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_DAMAGE);
this->action = EN_RD_ACTION_FAILING_GRAB;
this->actionFunc = EnRd_GrabFail;
}
void EnRd_GrabFail(EnRd* this, PlayState* play) {
- if (this->actor.speedXZ < 0.0f) {
- this->actor.speedXZ += 0.15f;
+ if (this->actor.speed < 0.0f) {
+ this->actor.speed += 0.15f;
}
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
@@ -1004,12 +1004,12 @@ void EnRd_Crouch(EnRd* this, PlayState* play) {
void EnRd_SetupDamage(EnRd* this) {
this->actor.shape.yOffset = 0.0f;
Animation_MorphToPlayOnce(&this->skelAnime, &gGibdoRedeadDamageAnim, -6.0f);
- if (this->actor.bgCheckFlags & 1) {
- this->actor.speedXZ = -2.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->actor.speed = -2.0f;
}
- this->actor.flags |= ACTOR_FLAG_1;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_DAMAGE);
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_DAMAGE);
this->action = EN_RD_ACTION_DAMAGE;
this->actionFunc = EnRd_Damage;
}
@@ -1017,8 +1017,8 @@ void EnRd_SetupDamage(EnRd* this) {
void EnRd_Damage(EnRd* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (this->actor.speedXZ < 0.0f) {
- this->actor.speedXZ += 0.15f;
+ if (this->actor.speed < 0.0f) {
+ this->actor.speed += 0.15f;
}
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
@@ -1029,7 +1029,7 @@ void EnRd_Damage(EnRd* this, PlayState* play) {
this->actor.world.rot.y = this->actor.shape.rot.y;
if (this->actor.parent != NULL) {
EnRd_SetupWalkToParent(this);
- } else if (Actor_DistanceToPoint(&player->actor, &this->actor.home.pos) >= 150.0f) {
+ } else if (Actor_WorldDistXYZToPoint(&player->actor, &this->actor.home.pos) >= 150.0f) {
EnRd_SetupWalkToHome(this, play);
} else {
EnRd_SetupWalkToPlayer(this, play);
@@ -1042,9 +1042,9 @@ void EnRd_SetupDead(EnRd* this) {
Animation_MorphToPlayOnce(&this->skelAnime, &gGibdoRedeadDeathAnim, -1.0f);
this->action = EN_RD_ACTION_DEAD;
this->deathTimer = 300;
- this->actor.flags &= ~ACTOR_FLAG_1;
- this->actor.speedXZ = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_DEAD);
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ this->actor.speed = 0.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_DEAD);
this->actionFunc = EnRd_Dead;
}
@@ -1075,24 +1075,25 @@ void EnRd_Dead(EnRd* this, PlayState* play) {
this->deathTimer--;
}
} else if (Animation_OnFrame(&this->skelAnime, 33.0f) || Animation_OnFrame(&this->skelAnime, 40.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GERUDOFT_DOWN);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GERUDOFT_DOWN);
}
}
void EnRd_SetupStunned(EnRd* this) {
this->action = EN_RD_ACTION_STUNNED;
this->stunTimer = 10;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
if (gSaveContext.sunsSongState != SUNSSONG_INACTIVE) {
this->stunnedBySunsSong = true;
this->sunsSongStunTimer = 600;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_LIGHT_ARROW_HIT);
- Actor_SetColorFilter(&this->actor, 0x8000, 0x80C8, 0, 255);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_LIGHT_ARROW_HIT);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_GRAY, COLORFILTER_INTENSITY_FLAG | 200,
+ COLORFILTER_BUFFLAG_OPA, 255);
} else if (this->damageEffect == EN_RD_DMGEFF_STUN) {
- Actor_SetColorFilter(&this->actor, 0, 0xC8, 0, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 200, COLORFILTER_BUFFLAG_OPA, 40);
} else if (this->damageEffect == EN_RD_DMGEFF_ZORA_MAGIC) {
- Actor_SetColorFilter(&this->actor, 0, 0xC8, 0, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 200, COLORFILTER_BUFFLAG_OPA, 40);
}
this->actionFunc = EnRd_Stunned;
}
@@ -1106,7 +1107,8 @@ void EnRd_Stunned(EnRd* this, PlayState* play) {
if (this->sunsSongStunTimer != 0) {
this->sunsSongStunTimer--;
if (this->sunsSongStunTimer >= 255) {
- Actor_SetColorFilter(&this->actor, 0x8000, 0x80C8, 0, 255);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_GRAY, COLORFILTER_INTENSITY_FLAG | 200,
+ COLORFILTER_BUFFLAG_OPA, 255);
}
if (this->sunsSongStunTimer == 0) {
@@ -1186,7 +1188,7 @@ void EnRd_UpdateDamage(EnRd* this, PlayState* play) {
return;
case EN_RD_DMGEFF_FIRE_ARROW:
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 40);
this->drawDmgEffTimer = 180;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->stunnedBySunsSong = false;
@@ -1195,7 +1197,7 @@ void EnRd_UpdateDamage(EnRd* this, PlayState* play) {
break;
case EN_RD_DMGEFF_LIGHT_ARROW:
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 40);
this->drawDmgEffTimer = 60;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_LIGHT_ORBS;
this->stunnedBySunsSong = false;
@@ -1204,13 +1206,13 @@ void EnRd_UpdateDamage(EnRd* this, PlayState* play) {
break;
case EN_RD_DMGEFF_DAMAGE:
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
this->stunnedBySunsSong = false;
this->sunsSongStunTimer = 0;
break;
case EN_RD_DMGEFF_LIGHT_RAY:
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
this->stunnedBySunsSong = false;
this->sunsSongStunTimer = 0;
this->actor.colChkInfo.health = 0;
@@ -1273,13 +1275,14 @@ void EnRd_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
- if ((this->action != EN_RD_ACTION_GRABBING) && (this->actor.speedXZ != 0.0f)) {
+ if ((this->action != EN_RD_ACTION_GRABBING) && (this->actor.speed != 0.0f)) {
Actor_MoveWithGravity(&this->actor);
}
- if ((this->actor.shape.rot.x == 0) && (this->action != EN_RD_ACTION_GRABBING) &&
- (this->actor.speedXZ != 0.0f)) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 20.0f, 35.0f, 0x1D);
+ 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,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
}
if (this->action == EN_RD_ACTION_ATTEMPTING_PLAYER_STUN) {
@@ -1319,23 +1322,23 @@ void EnRd_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
(limbIndex == REDEAD_LIMB_RIGHT_SHOULDER_AND_UPPER_ARM) || (limbIndex == REDEAD_LIMB_RIGHT_FOREARM) ||
(limbIndex == REDEAD_LIMB_RIGHT_HAND) || (limbIndex == REDEAD_LIMB_HEAD) ||
(limbIndex == REDEAD_LIMB_PELVIS))) {
- Matrix_MultZero(&this->limbPos[this->limbIndex]);
- this->limbIndex++;
+ Matrix_MultZero(&this->bodyPartsPos[this->bodyPartIndex]);
+ this->bodyPartIndex++;
}
}
void EnRd_Draw(Actor* thisx, PlayState* play) {
- static Vec3f D_808D7138 = { 0.25f, 0.25f, 0.25f };
+ static Vec3f sScale = { 0.25f, 0.25f, 0.25f };
s32 pad;
EnRd* this = THIS;
- Vec3f sp54 = this->actor.world.pos;
+ Vec3f pos = this->actor.world.pos;
OPEN_DISPS(play->state.gfxCtx);
- this->limbIndex = 0;
+ this->bodyPartIndex = 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);
@@ -1344,9 +1347,9 @@ void EnRd_Draw(Actor* thisx, PlayState* play) {
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnRd_OverrideLimbDraw, EnRd_PostLimbDraw, &this->actor, POLY_OPA_DISP);
- func_800BC620(&sp54, &D_808D7138, 255, 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);
@@ -1354,13 +1357,13 @@ void EnRd_Draw(Actor* thisx, PlayState* play) {
POLY_XLU_DISP =
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnRd_OverrideLimbDraw, NULL, &this->actor, POLY_XLU_DISP);
- func_800BC620(&sp54, &D_808D7138, this->alpha, play);
+ func_800BC620(&pos, &sScale, this->alpha, play);
}
CLOSE_DISPS(play->state.gfxCtx);
if (this->drawDmgEffTimer > 0) {
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), this->drawDmgEffScale,
- 0.5f, this->drawDmgEffAlpha, this->drawDmgEffType);
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, EN_RD_BODYPART_MAX, this->drawDmgEffScale, 0.5f,
+ this->drawDmgEffAlpha, this->drawDmgEffType);
}
}
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..578515a28 100644
--- a/src/overlays/actors/ovl_En_Rd/z_en_rd.h
+++ b/src/overlays/actors/ovl_En_Rd/z_en_rd.h
@@ -27,17 +27,36 @@ 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 enum EnRdBodyPart {
+ /* 0 */ EN_RD_BODYPART_0,
+ /* 1 */ EN_RD_BODYPART_1,
+ /* 2 */ EN_RD_BODYPART_2,
+ /* 3 */ EN_RD_BODYPART_3,
+ /* 4 */ EN_RD_BODYPART_4,
+ /* 5 */ EN_RD_BODYPART_5,
+ /* 6 */ EN_RD_BODYPART_6,
+ /* 7 */ EN_RD_BODYPART_7,
+ /* 8 */ EN_RD_BODYPART_8,
+ /* 9 */ EN_RD_BODYPART_9,
+ /* 10 */ EN_RD_BODYPART_10,
+ /* 11 */ EN_RD_BODYPART_11,
+ /* 12 */ EN_RD_BODYPART_12,
+ /* 13 */ EN_RD_BODYPART_13,
+ /* 14 */ EN_RD_BODYPART_14,
+ /* 15 */ EN_RD_BODYPART_MAX
+} EnRdBodyPart;
+
typedef struct EnRd {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ EnRdActionFunc actionFunc;
/* 0x18C */ EnRdSetupDanceFunc setupDanceFunc;
/* 0x190 */ ColliderCylinder collider;
- /* 0x1DC */ Vec3f limbPos[15];
- /* 0x290 */ s32 limbIndex;
+ /* 0x1DC */ Vec3f bodyPartsPos[EN_RD_BODYPART_MAX];
+ /* 0x290 */ s32 bodyPartIndex;
/* 0x294 */ f32 drawDmgEffAlpha;
/* 0x298 */ f32 drawDmgEffScale;
/* 0x29C */ Vec3s jointTable[REDEAD_LIMB_MAX];
@@ -57,7 +76,7 @@ typedef struct EnRd {
/* 0x3E2 */ UNK_TYPE1 unk3E2[0x2];
/* 0x3E4 */ union {
s16 danceEndTimer;
- s16 pirouetteRotationalVelocity;
+ s16 pirouetteAngularVelocity;
};
/* 0x3E6 */ s16 drawDmgEffTimer;
/* 0x3E8 */ u8 drawDmgEffType;
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 051cc8b33..b9ea1f142 100644
--- a/src/overlays/actors/ovl_En_Recepgirl/z_en_recepgirl.c
+++ b/src/overlays/actors/ovl_En_Recepgirl/z_en_recepgirl.c
@@ -7,7 +7,7 @@
#include "z_en_recepgirl.h"
#include "objects/object_bg/object_bg.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnRecepgirl*)thisx)
@@ -37,7 +37,7 @@ static TexturePtr sEyeTextures[] = { object_bg_Tex_00F8F0, object_bg_Tex_00FCF0,
object_bg_Tex_00FCF0 };
static InitChainEntry sInitChain[] = {
- ICHAIN_U8(targetMode, 6, ICHAIN_CONTINUE),
+ ICHAIN_U8(targetMode, TARGET_MODE_6, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 1000, ICHAIN_STOP),
};
@@ -61,7 +61,7 @@ void EnRecepgirl_Init(Actor* thisx, PlayState* play) {
this->eyeTexIndex = 2;
- if (Flags_GetSwitch(play, this->actor.params)) {
+ if (Flags_GetSwitch(play, ENRECEPGIRL_GET_SWITCH_FLAG(&this->actor))) {
this->actor.textId = 0x2ADC; // hear directions again?
} else {
this->actor.textId = 0x2AD9; // "Welcome..."
@@ -103,13 +103,13 @@ void EnRecepgirl_Wait(EnRecepgirl* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
EnRecepgirl_SetupTalk(this);
} else if (Actor_IsFacingPlayer(&this->actor, 0x2000)) {
- func_800B8614(&this->actor, play, 60.0f);
+ Actor_OfferTalk(&this->actor, play, 60.0f);
if (Player_GetMask(play) == PLAYER_MASK_KAFEIS_MASK) {
- this->actor.textId = 0x2367; // "... doesn't Kafei want to break off his engagement ... ?"
- } else if (Flags_GetSwitch(play, this->actor.params)) {
+ this->actor.textId = 0x2367;
+ } else if (Flags_GetSwitch(play, ENRECEPGIRL_GET_SWITCH_FLAG(&this->actor))) {
this->actor.textId = 0x2ADC; // hear directions again?
} else {
- this->actor.textId = 0x2AD9; // "Welcome..."
+ this->actor.textId = 0x2AD9;
}
}
}
@@ -145,8 +145,8 @@ void EnRecepgirl_Talk(EnRecepgirl* this, PlayState* play) {
this->actor.textId = 0x2ADC; // hear directions again?
EnRecepgirl_SetupWait(this);
} else if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- if (this->actor.textId == 0x2AD9) { // "Welcome..."
- Flags_SetSwitch(play, this->actor.params);
+ if (this->actor.textId == 0x2AD9) {
+ Flags_SetSwitch(play, ENRECEPGIRL_GET_SWITCH_FLAG(&this->actor));
Animation_MorphToPlayOnce(&this->skelAnime, &object_bg_Anim_00AD98, 10.0f);
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_63_80)) {
@@ -156,11 +156,11 @@ void EnRecepgirl_Talk(EnRecepgirl* this, PlayState* play) {
}
} else if (this->actor.textId == 0x2ADC) { // hear directions again?
Animation_MorphToPlayOnce(&this->skelAnime, &object_bg_Anim_00AD98, 10.0f);
- this->actor.textId = 0x2ADD; // "So..."
+ this->actor.textId = 0x2ADD;
} else {
Animation_MorphToPlayOnce(&this->skelAnime, &object_bg_Anim_000968, 10.0f);
- if (this->actor.textId == 0x2ADD) { // "So..."
+ if (this->actor.textId == 0x2ADD) {
this->actor.textId = 0x2ADE; // Mayor's office is on the left, drawing room on the right
} else if (this->actor.textId == 0x2ADA) { // Mayor's office is on the left (meeting ongoing)
this->actor.textId = 0x2ADB; // drawing room on the right
@@ -168,7 +168,7 @@ void EnRecepgirl_Talk(EnRecepgirl* this, PlayState* play) {
this->actor.textId = 0x2AE0; // drawing room on the right, don't go in without an appointment
}
}
- func_80151938(play, this->actor.textId);
+ Message_ContinueTextbox(play, this->actor.textId);
}
}
@@ -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_Recepgirl/z_en_recepgirl.h b/src/overlays/actors/ovl_En_Recepgirl/z_en_recepgirl.h
index a0fba9fdc..96ad7522a 100644
--- a/src/overlays/actors/ovl_En_Recepgirl/z_en_recepgirl.h
+++ b/src/overlays/actors/ovl_En_Recepgirl/z_en_recepgirl.h
@@ -7,6 +7,8 @@ struct EnRecepgirl;
typedef void (*EnRecepgirlActionFunc)(struct EnRecepgirl*, PlayState*);
+#define ENRECEPGIRL_GET_SWITCH_FLAG(thisx) ((thisx)->params)
+
typedef struct EnRecepgirl {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
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 7f6d39886..856070fba 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;
}
@@ -231,7 +231,7 @@ void func_80BF3DC4(EnRg* this, PlayState* play) {
this->collider2.dim.worldSphere.center.y = this->actor.world.pos.y + this->actor.shape.yOffset;
this->collider2.dim.worldSphere.center.z = this->actor.world.pos.z;
- if (this->actor.speedXZ >= 10.0f) {
+ if (this->actor.speed >= 10.0f) {
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider2.base);
}
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider2.base);
@@ -283,13 +283,13 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_CIRCLE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_CIRCLE);
}
if (Animation_OnFrame(&this->skelAnime, 22.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_SIT_IMT);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_SIT_IMT);
}
}
@@ -318,8 +318,8 @@ void func_80BF40F4(EnRg* this) {
}
s32 func_80BF416C(EnRg* this, PlayState* play) {
- if ((this->actor.bgCheckFlags & 1) && (this->actor.speedXZ >= 0.01f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_ROLLING - SFX_FLAG);
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->actor.speed >= 0.01f)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_ROLLING - SFX_FLAG);
func_800AE930(&play->colCtx, Effect_GetByIndex(this->unk_340), &this->actor.world.pos, 18.0f,
this->actor.shape.rot.y, this->actor.floorPoly, this->actor.floorBgId);
} else {
@@ -345,9 +345,9 @@ s32 func_80BF42BC(EnRg* this, f32 arg1) {
f32 sp2C;
s32 sp24;
- Math_ApproachF(&this->actor.speedXZ, arg1, 0.3f, 0.5f);
+ Math_ApproachF(&this->actor.speed, arg1, 0.3f, 0.5f);
- sp2C = this->actor.speedXZ * (1.0f / 26);
+ sp2C = this->actor.speed * (1.0f / 26);
if (sp2C > 1.0f) {
sp2C = 1.0f;
}
@@ -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;
}
@@ -410,7 +410,7 @@ s32 func_80BF45B4(EnRg* this) {
s16 temp_v0;
s16 temp_v1;
- if ((this->actor.bgCheckFlags & 8) && (this->actor.speedXZ >= 5.0f)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) && (this->actor.speed >= 5.0f)) {
temp_v1 = this->actor.world.rot.y;
temp_v0 = temp_v1 - BINANG_ROT180(this->actor.wallYaw);
@@ -419,27 +419,27 @@ s32 func_80BF45B4(EnRg* this) {
this->unk_322 = 0xA;
} else if (ABS_ALT(temp_v0) >= 0x1000) {
this->actor.world.rot.y = BINANG_ROT180(BINANG_ROT180(this->actor.wallYaw) - temp_v0);
- this->actor.speedXZ *= 0.75f;
+ this->actor.speed *= 0.75f;
this->unk_322 = 0xA;
} else {
this->actor.world.rot.y = BINANG_ROT180(temp_v1);
ret = 1;
- this->actor.speedXZ *= 0.25f;
+ this->actor.speed *= 0.25f;
}
sp24 = 1;
} else if (this->unk_310 & 0x40) {
- s16 yaw = Actor_YawBetweenActors(&this->actor, ((void)0, this->collider2.base.ac));
+ s16 yaw = Actor_WorldYawTowardActor(&this->actor, ((void)0, this->collider2.base.ac));
sp24 = 2;
if (this->actor.colorFilterTimer == 0) {
- this->actor.speedXZ *= 0.5f;
+ this->actor.speed *= 0.5f;
if ((s16)(yaw - this->actor.world.rot.y) > 0) {
this->actor.world.rot.y -= 0x2000;
} else {
this->actor.world.rot.y += 0x2000;
}
}
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 40);
this->unk_322 = 0xA;
}
@@ -501,7 +501,7 @@ s32 func_80BF47AC(EnRg* this, PlayState* play) {
void func_80BF4934(EnRg* this) {
if (this->unk_318 == 1) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_DASH);
}
}
@@ -533,7 +533,7 @@ void func_80BF4964(EnRg* this) {
}
if (!(this->unk_310 & 0x400) && !(this->unk_310 & 0x1000) && (this->unk_322 == 0) && (this->unk_324 == 0) &&
- (this->actor.bgCheckFlags & 1)) {
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
if (this->unk_18C == NULL) {
Math_Vec3s_ToVec3f(&sp30, &sp3C[this->unk_33C]);
} else {
@@ -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 {
@@ -625,8 +625,8 @@ s32 func_80BF4DA8(EnRg* this) {
s32 i;
for (i = 0; i < ARRAY_COUNT(D_80BF596C); i++) {
- temp_f20 = Actor_XZDistanceToPoint(&this->actor, &D_80BF596C[i]);
- temp_v1 = Actor_YawToPoint(&this->actor, &D_80BF596C[i]) - this->actor.world.rot.y;
+ temp_f20 = Actor_WorldDistXZToPoint(&this->actor, &D_80BF596C[i]);
+ temp_v1 = Actor_WorldYawTowardPoint(&this->actor, &D_80BF596C[i]) - this->actor.world.rot.y;
if ((temp_f20 < 100.0f) && (ABS_ALT(temp_v1) < 0xC00)) {
if (temp_v1 > 0) {
@@ -669,17 +669,17 @@ void func_80BF4EBC(EnRg* this, PlayState* play) {
this->unk_318 = Rand_S16Offset(0, 20);
}
}
- SubS_FillLimbRotTables(play, this->unk_32E, this->unk_328, ARRAY_COUNT(this->unk_328));
+ SubS_UpdateFidgetTables(play, this->fidgetTableY, this->fidgetTableZ, ENRG_FIDGET_TABLE_LEN);
}
void func_80BF4FC4(EnRg* this, PlayState* play) {
this->unk_344 = func_80BF4560(this, play);
if (!Play_InCsMode(play)) {
- if (this->actor.bgCheckFlags & 2) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
if (this->unk_310 & 0x400) {
this->unk_310 &= ~0x400;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
if (this->unk_344 != -1) {
@@ -688,7 +688,7 @@ void func_80BF4FC4(EnRg* this, PlayState* play) {
this->unk_33C++;
}
}
- } else if ((this->actor.bgCheckFlags & 1) && !(this->unk_310 & 0x1000) &&
+ } else if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && !(this->unk_310 & 0x1000) &&
func_80BF4D64(&this->actor.world.pos)) {
this->unk_310 |= 0x1000;
}
@@ -741,15 +741,19 @@ 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;
}
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->unk_310 = 8;
this->actor.gravity = -1.0f;
- SubS_UpdateFlags(&this->unk_310, 3, 7);
+
+ // This is the only usage of this function whose actor does not use `SubS_Offer`.
+ // Since these bits go unused, it seems like a copy paste that still used `SubSOfferMode`
+ SubS_SetOfferMode(&this->unk_310, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_12_02)) {
this->unk_318 = Rand_S16Offset(30, 30);
@@ -786,7 +790,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 +808,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);
@@ -820,29 +826,29 @@ void func_80BF547C(EnRg* this, PlayState* play) {
s32 func_80BF5588(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnRg* this = THIS;
- s32 phi_v0;
+ s32 fidgetIndex;
switch (limbIndex) {
case 10:
- phi_v0 = 0;
+ fidgetIndex = 0;
break;
case 11:
- phi_v0 = 1;
+ fidgetIndex = 1;
break;
case 14:
- phi_v0 = 2;
+ fidgetIndex = 2;
break;
default:
- phi_v0 = 9;
+ fidgetIndex = 9;
break;
}
- if (((this->unk_310 & 8) != 0) && (phi_v0 < 9)) {
- rot->y += (s16)(Math_SinS(this->unk_32E[phi_v0]) * 200.0f);
- rot->z += (s16)(Math_CosS(this->unk_328[phi_v0]) * 200.0f);
+ if ((this->unk_310 & 8) && (fidgetIndex < 9)) {
+ rot->y += (s16)(Math_SinS(this->fidgetTableY[fidgetIndex]) * 200.0f);
+ rot->z += (s16)(Math_CosS(this->fidgetTableZ[fidgetIndex]) * 200.0f);
}
return false;
@@ -854,7 +860,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..a29e0a5f7 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,11 @@ 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
+
+#define ENRG_FIDGET_TABLE_LEN 3
typedef struct {
/* 0x00 */ u8 unk_00;
@@ -41,8 +45,8 @@ typedef struct EnRg {
/* 0x322 */ s16 unk_322;
/* 0x324 */ s16 unk_324;
/* 0x326 */ s16 unk_326;
- /* 0x328 */ s16 unk_328[3];
- /* 0x32E */ s16 unk_32E[3];
+ /* 0x328 */ s16 fidgetTableZ[ENRG_FIDGET_TABLE_LEN];
+ /* 0x32E */ s16 fidgetTableY[ENRG_FIDGET_TABLE_LEN];
/* 0x334 */ s32 unk_334;
/* 0x338 */ UNK_TYPE1 unk338[4];
/* 0x33C */ s32 unk_33C;
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 0fd1007d0..cfb8f82ea 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;
}
@@ -86,8 +86,8 @@ void EnRiverSound_Draw(Actor* thisx, PlayState* play) {
s16 params = this->actor.params;
if (params < RS_RIVER_DEFAULT_LOW_FREQ) {
- Actor_PlaySfxAtPos(&this->actor, gAudioEnvironmentalSfx[params]);
+ Actor_PlaySfx(&this->actor, gAudioEnvironmentalSfx[params]);
} else {
- Audio_PlaySfxForRiver(&this->actor.projectedPos, freqScale[this->soundFreqIndex]);
+ Audio_PlaySfx_River(&this->actor.projectedPos, freqScale[this->soundFreqIndex]);
}
}
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 6c7ac273c..24fc306cf 100644
--- a/src/overlays/actors/ovl_En_Rr/z_en_rr.c
+++ b/src/overlays/actors/ovl_En_Rr/z_en_rr.c
@@ -6,9 +6,10 @@
#include "z_en_rr.h"
#include "z64rumble.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "objects/object_rr/object_rr.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_400)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_400)
#define THIS ((EnRr*)thisx)
@@ -119,7 +120,7 @@ static CollisionCheckInfoInit sColChkInfoInit = { 3, 45, 60, 250 };
static InitChainEntry sInitChain[] = {
ICHAIN_S8(hintId, TATL_HINT_ID_LIKE_LIKE, ICHAIN_CONTINUE),
- ICHAIN_U8(targetMode, 2, ICHAIN_CONTINUE),
+ ICHAIN_U8(targetMode, TARGET_MODE_2, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -400, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneForward, 2000, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 30, ICHAIN_STOP),
@@ -132,7 +133,7 @@ void EnRr_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->actor, sInitChain);
Collider_InitAndSetCylinder(play, &this->collider1, &this->actor, &sCylinderInit1);
Collider_InitAndSetCylinder(play, &this->collider2, &this->actor, &sCylinderInit2);
- if (this->actor.params != ENRR_3) {
+ if (this->actor.params != LIKE_LIKE_PARAM_3) {
this->actor.scale.y = 0.015f;
this->actor.scale.x = 0.019f;
this->actor.scale.z = 0.019f;
@@ -151,9 +152,9 @@ void EnRr_Init(Actor* thisx, PlayState* play) {
Actor_SetFocus(&this->actor, this->actor.scale.y * 2000.0f);
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
- if ((this->actor.params == ENRR_2) || (this->actor.params == ENRR_3)) {
+ if ((this->actor.params == LIKE_LIKE_PARAM_2) || (this->actor.params == LIKE_LIKE_PARAM_3)) {
this->actor.colChkInfo.health = 6;
- if (this->actor.params == ENRR_2) {
+ if (this->actor.params == LIKE_LIKE_PARAM_2) {
this->actor.colChkInfo.mass = MASS_HEAVY;
}
}
@@ -180,7 +181,7 @@ void func_808FA01C(EnRr* this, PlayState* play, ColliderCylinder* collider) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_LIGHT_ORBS;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, collider->info.bumper.hitPos.x,
collider->info.bumper.hitPos.y, collider->info.bumper.hitPos.z, 0, 0, 0,
- CLEAR_TAG_LARGE_LIGHT_RAYS);
+ CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
} else if (this->actor.colChkInfo.damageEffect == 5) {
this->drawDmgEffScale = 0.85f;
this->drawDmgEffAlpha = 4.0f;
@@ -194,10 +195,10 @@ void func_808FA11C(EnRr* this) {
this->collider1.info.elemType = ELEMTYPE_UNK0;
this->unk_1EE = 80;
this->drawDmgEffScale = 0.85f;
- this->drawDmgEffFrozenSteamScale = 1.2750001f;
+ this->drawDmgEffFrozenSteamScale = 1275.0f * 0.001f;
this->drawDmgEffAlpha = 1.0f;
this->actor.flags &= ~ACTOR_FLAG_400;
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 80);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 80);
}
void func_808FA19C(EnRr* this, PlayState* play) {
@@ -207,15 +208,15 @@ void func_808FA19C(EnRr* this, PlayState* play) {
this->collider1.base.colType = COLTYPE_HIT0;
this->collider1.info.elemType = ELEMTYPE_UNK1;
this->drawDmgEffAlpha = 0.0f;
- Actor_SpawnIceEffects(play, &this->actor, this->limbPos, 20, 2, this->actor.scale.y * 23.333334f,
- this->actor.scale.y * 20.000002f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, LIKE_LIKE_BODYPART_MAX, 2,
+ this->actor.scale.y * 23.333334f, this->actor.scale.y * 20.000002f);
this->actor.flags |= ACTOR_FLAG_400;
}
}
void func_808FA238(EnRr* this, f32 arg1) {
- this->actor.speedXZ = arg1;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_LIKE_WALK);
+ this->actor.speed = arg1;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_LIKE_WALK);
}
void func_808FA260(EnRr* this) {
@@ -236,7 +237,7 @@ void func_808FA260(EnRr* this) {
this->actionFunc = func_808FB088;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_LIKE_UNARI);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_LIKE_UNARI);
}
void func_808FA344(EnRr* this) {
@@ -268,10 +269,10 @@ void func_808FA3F8(EnRr* this, Player* player) {
this->unk_1EA = 100;
this->unk_1FC = 20;
this->collider1.base.ocFlags1 &= ~OC1_TYPE_PLAYER;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->unk_1F0 = 8;
this->unk_1E1 = 0;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->unk_218 = 0.0f;
this->unk_210 = 0.0f;
this->unk_204 = 0.15f;
@@ -286,7 +287,7 @@ void func_808FA3F8(EnRr* this, Player* player) {
}
this->actionFunc = func_808FB1C0;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_SUISEN_DRINK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_SUISEN_DRINK);
}
void func_808FA4F4(EnRr* this, PlayState* play) {
@@ -298,14 +299,14 @@ void func_808FA4F4(EnRr* this, PlayState* play) {
if (player->stateFlags2 & PLAYER_STATE2_80) {
player->actor.parent = NULL;
- player->unk_AE8 = 100;
- this->actor.flags |= ACTOR_FLAG_1;
+ player->actionVar2 = 100;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->unk_1F0 = 110;
this->unk_1F6 = 2500;
this->unk_210 = 0.0f;
this->unk_20C = 0x800;
- if (((this->unk_1E2 == 0) && (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN)) &&
+ if (((this->unk_1E2 == 0) && (GET_PLAYER_FORM == PLAYER_FORM_HUMAN)) &&
(GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) == EQUIP_VALUE_SHIELD_HERO)) {
sp34 = true;
this->unk_1E2 = Inventory_DeleteEquipment(play, EQUIP_VALUE_SHIELD_HERO);
@@ -317,7 +318,7 @@ void func_808FA4F4(EnRr* this, PlayState* play) {
Message_StartTextbox(play, 0xF6, NULL);
}
- if (this->actor.params == ENRR_0) {
+ if (this->actor.params == LIKE_LIKE_PARAM_0) {
sp38 = 8;
} else {
sp38 = 16;
@@ -331,7 +332,7 @@ void func_808FA4F4(EnRr* this, PlayState* play) {
player->actor.world.pos.z += sp30 * Math_CosS(this->actor.shape.rot.y);
func_800B8D50(play, &this->actor, sp30, this->actor.shape.rot.y, sp2C, sp38);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_SUISEN_THROW);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_SUISEN_THROW);
}
}
@@ -344,7 +345,7 @@ void func_808FA6B8(EnRr* this) {
} else {
this->unk_1EC = 40;
}
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, this->unk_1EC);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, this->unk_1EC);
this->unk_1E6 = 20;
this->unk_1F6 = 2500;
@@ -360,7 +361,7 @@ void func_808FA6B8(EnRr* this) {
}
this->actionFunc = func_808FB398;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_LIKE_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_LIKE_DAMAGE);
}
void func_808FA7AC(EnRr* this) {
@@ -405,7 +406,7 @@ void func_808FA910(EnRr* this) {
this->unk_1E4 = 0;
this->unk_214 = 0.0f;
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 40);
this->unk_210 = 0.0f;
for (i = 0; i < ARRAY_COUNT(this->unk_324); i++) {
@@ -415,8 +416,8 @@ void func_808FA910(EnRr* this) {
}
this->actionFunc = func_808FB42C;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_LIKE_DEAD);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_LIKE_DEAD);
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
void func_808FA9CC(EnRr* this) {
@@ -482,8 +483,8 @@ s32 func_808FAA94(EnRr* this, PlayState* play) {
func_808FA910(this);
}
} else if (this->actor.colChkInfo.damageEffect == 1) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 80);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 80);
this->unk_1EE = 80;
func_808FA9CC(this);
} else if (this->actor.colChkInfo.damageEffect == 3) {
@@ -575,7 +576,7 @@ void func_808FAF94(EnRr* this, PlayState* play) {
(Player_GetMask(play) != PLAYER_MASK_STONE) &&
(this->actor.xzDistToPlayer < (8421.053f * this->actor.scale.x))) {
func_808FA260(this);
- } else if ((this->actor.xzDistToPlayer < 400.0f) && (this->actor.speedXZ == 0.0f)) {
+ } else if ((this->actor.xzDistToPlayer < 400.0f) && (this->actor.speed == 0.0f)) {
func_808FA238(this, 2.0f);
}
}
@@ -632,10 +633,10 @@ void func_808FB1C0(EnRr* this, PlayState* play) {
Rumble_Request(this->actor.xyzDistToPlayerSq, 120, 2, 120);
if (!(this->unk_1E4 & 7)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EYEGOLE_DEMO_EYE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_DEMO_EYE);
}
- player->unk_AE8 = 0;
+ player->actionVar2 = 0;
this->unk_1F0 = 8;
this->unk_1EA--;
@@ -653,7 +654,7 @@ void func_808FB2C0(EnRr* this, PlayState* play) {
Player* player = GET_PLAYER(play);
this->unk_1E6--;
- player->unk_AE8 = 0;
+ player->actionVar2 = 0;
Math_StepToF(&player->actor.world.pos.x, this->unk_228.x, 30.0f);
Math_StepToF(&player->actor.world.pos.y, this->unk_228.y + this->unk_218, 30.0f);
Math_StepToF(&player->actor.world.pos.z, this->unk_228.z, 30.0f);
@@ -742,7 +743,7 @@ void func_808FB680(EnRr* this, PlayState* play) {
} else {
Math_SmoothStepToS(&this->actor.shape.rot.y, BINANG_ROT180(this->actor.yawTowardsPlayer), 10, 1000, 0);
this->actor.world.rot.y = this->actor.shape.rot.y;
- if (this->actor.speedXZ == 0.0f) {
+ if (this->actor.speed == 0.0f) {
func_808FA238(this, 2.0f);
}
}
@@ -800,14 +801,16 @@ void EnRr_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
- if (this->actor.params == ENRR_2) {
- this->actor.speedXZ = 0.0f;
+ if (this->actor.params == LIKE_LIKE_PARAM_2) {
+ this->actor.speed = 0.0f;
} else {
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.1f);
+ Math_StepToF(&this->actor.speed, 0.0f, 0.1f);
}
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) {
@@ -866,7 +869,7 @@ void EnRr_Update(Actor* thisx, PlayState* play) {
this->drawDmgEffScale = (this->drawDmgEffAlpha + 1.0f) * 0.425f;
this->drawDmgEffScale = CLAMP_MAX(this->drawDmgEffScale, 0.85f);
} else if (!Math_StepToF(&this->drawDmgEffFrozenSteamScale, 0.85f, 0.02125f)) {
- func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
}
}
@@ -875,7 +878,7 @@ void EnRr_Draw(Actor* thisx, PlayState* play2) {
PlayState* play = play2;
EnRr* this = THIS;
Mtx* mtx = GRAPH_ALLOC(play->state.gfxCtx, 4 * sizeof(Mtx));
- Vec3f* vecPtr;
+ Vec3f* bodyPartPos;
s32 i;
EnRrStruct* ptr;
Vec3f spA4;
@@ -883,7 +886,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,
@@ -894,14 +897,15 @@ void EnRr_Draw(Actor* thisx, PlayState* play2) {
Matrix_Scale((1.0f + this->unk_324[0].unk_10) * this->unk_324[0].unk_08, 1.0f,
(1.0f + this->unk_324[0].unk_10) * this->unk_324[0].unk_08, MTXMODE_APPLY);
- vecPtr = &this->limbPos[0];
+ bodyPartPos = &this->bodyPartsPos[0];
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- Matrix_MultVecZ(1842.1053f, vecPtr++);
- Matrix_MultVecZ(-1842.1053f, vecPtr++);
- Matrix_MultVecX(1842.1053f, vecPtr++);
- Matrix_MultVecX(-1842.1053f, vecPtr++);
+ // LIKE_LIKE_BODYPART_0 - LIKE_LIKE_BODYPART_3
+ Matrix_MultVecZ(1842.1053f, bodyPartPos++);
+ Matrix_MultVecZ(-1842.1053f, bodyPartPos++);
+ Matrix_MultVecX(1842.1053f, bodyPartPos++);
+ Matrix_MultVecX(-1842.1053f, bodyPartPos++);
Matrix_Pop();
for (i = 1; i < ARRAY_COUNT(this->unk_324); i++) {
@@ -918,10 +922,14 @@ void EnRr_Draw(Actor* thisx, PlayState* play2) {
Matrix_RotateYS(0x2000, MTXMODE_APPLY);
}
- Matrix_MultVecZ(1842.1053f, vecPtr++);
- Matrix_MultVecZ(-1842.1053f, vecPtr++);
- Matrix_MultVecX(1842.1053f, vecPtr++);
- Matrix_MultVecX(-1842.1053f, vecPtr++);
+ // LIKE_LIKE_BODYPART_4 - LIKE_LIKE_BODYPART_7
+ // LIKE_LIKE_BODYPART_8 - LIKE_LIKE_BODYPART_11
+ // LIKE_LIKE_BODYPART_12 - LIKE_LIKE_BODYPART_15
+ // LIKE_LIKE_BODYPART_16 - LIKE_LIKE_BODYPART_19
+ Matrix_MultVecZ(1842.1053f, bodyPartPos++);
+ Matrix_MultVecZ(-1842.1053f, bodyPartPos++);
+ Matrix_MultVecX(1842.1053f, bodyPartPos++);
+ Matrix_MultVecX(-1842.1053f, bodyPartPos++);
Matrix_Pop();
mtx++;
if (i == 3) {
@@ -934,9 +942,9 @@ void EnRr_Draw(Actor* thisx, PlayState* play2) {
this->collider2.dim.pos.y = ((this->unk_228.y - spA4.y) * 0.85f) + spA4.y;
this->collider2.dim.pos.z = ((this->unk_228.z - spA4.z) * 0.85f) + spA4.z;
- gSPDisplayList(POLY_OPA_DISP++, object_rr_DL_000470);
+ gSPDisplayList(POLY_OPA_DISP++, gLikeLikeDL);
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos),
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, LIKE_LIKE_BODYPART_MAX,
this->actor.scale.y * 66.66667f * this->drawDmgEffScale, this->drawDmgEffFrozenSteamScale,
this->drawDmgEffAlpha, this->drawDmgEffType);
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..3c2bc3964 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,36 @@ struct EnRr;
typedef void (*EnRrActionFunc)(struct EnRr*, PlayState*);
-enum {
- /* 0 */ ENRR_0,
- /* 1 */ ENRR_1,
- /* 2 */ ENRR_2,
- /* 3 */ ENRR_3,
-};
+typedef enum {
+ /* 0 */ LIKE_LIKE_PARAM_0,
+ /* 1 */ LIKE_LIKE_PARAM_1,
+ /* 2 */ LIKE_LIKE_PARAM_2,
+ /* 3 */ LIKE_LIKE_PARAM_3
+} LikeLikeParam;
+
+typedef enum LikeLikeBodyPart {
+ /* 0 */ LIKE_LIKE_BODYPART_0,
+ /* 1 */ LIKE_LIKE_BODYPART_1,
+ /* 2 */ LIKE_LIKE_BODYPART_2,
+ /* 3 */ LIKE_LIKE_BODYPART_3,
+ /* 4 */ LIKE_LIKE_BODYPART_4,
+ /* 5 */ LIKE_LIKE_BODYPART_5,
+ /* 6 */ LIKE_LIKE_BODYPART_6,
+ /* 7 */ LIKE_LIKE_BODYPART_7,
+ /* 8 */ LIKE_LIKE_BODYPART_8,
+ /* 9 */ LIKE_LIKE_BODYPART_9,
+ /* 10 */ LIKE_LIKE_BODYPART_10,
+ /* 11 */ LIKE_LIKE_BODYPART_11,
+ /* 12 */ LIKE_LIKE_BODYPART_12,
+ /* 13 */ LIKE_LIKE_BODYPART_13,
+ /* 14 */ LIKE_LIKE_BODYPART_14,
+ /* 15 */ LIKE_LIKE_BODYPART_15,
+ /* 16 */ LIKE_LIKE_BODYPART_16,
+ /* 17 */ LIKE_LIKE_BODYPART_17,
+ /* 18 */ LIKE_LIKE_BODYPART_18,
+ /* 19 */ LIKE_LIKE_BODYPART_19,
+ /* 20 */ LIKE_LIKE_BODYPART_MAX
+} LikeLikeBodyPart;
typedef struct {
/* 0x00 */ f32 unk_00;
@@ -58,7 +82,7 @@ typedef struct EnRr {
/* 0x220 */ f32 drawDmgEffScale;
/* 0x224 */ f32 drawDmgEffFrozenSteamScale;
/* 0x228 */ Vec3f unk_228;
- /* 0x234 */ Vec3f limbPos[20];
+ /* 0x234 */ Vec3f bodyPartsPos[LIKE_LIKE_BODYPART_MAX];
/* 0x324 */ EnRrStruct unk_324[5];
} EnRr; // size = 0x3C4
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..b1632ecc8 100644
--- a/src/overlays/actors/ovl_En_Rsn/z_en_rsn.c
+++ b/src/overlays/actors/ovl_En_Rsn/z_en_rsn.c
@@ -7,7 +7,7 @@
#include "z_en_rsn.h"
#include "objects/object_rs/object_rs.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
#define THIS ((EnRsn*)thisx)
@@ -45,7 +45,7 @@ void EnRsn_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 20.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &gBombShopkeeperSkel, &gBombShopkeeperWalkAnim, NULL, NULL, 0);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
func_80C25D40(this);
}
@@ -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 042f2e46f..66ee8f546 100644
--- a/src/overlays/actors/ovl_En_Ru/z_en_ru.c
+++ b/src/overlays/actors/ovl_En_Ru/z_en_ru.c
@@ -6,7 +6,7 @@
#include "z_en_ru.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnRu*)thisx)
@@ -97,17 +97,66 @@ static AnimationInfoS sAnimationInfo[] = {
{ &gAdultRutoSwimmingUpAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
};
-// in PostLimbdraw, converts limbIndex to bodyPartsPos index
-static s8 sBodyPartPosIndices[] = {
- -1, -1, 12, 13, 14, -1, 9, 10, 11, -1, 0, 6, -1, -1, 7, 8, 2, -1, -1, 3, 4, 2, 1,
+static s8 sLimbToBodyParts[RU2_LIMB_MAX] = {
+ BODYPART_NONE, // RU2_LIMB_NONE
+ BODYPART_NONE, // RU2_LIMB_ROOT
+ RU_BODYPART_12, // RU2_LIMB_LEFT_THIGH
+ RU_BODYPART_13, // RU2_LIMB_LEFT_LEG
+ RU_BODYPART_14, // RU2_LIMB_LEFT_FOOT
+ BODYPART_NONE, // RU2_LIMB_LEFT_TAIL
+ RU_BODYPART_9, // RU2_LIMB_RIGHT_THIGH
+ RU_BODYPART_10, // RU2_LIMB_RIGHT_LEG
+ RU_BODYPART_11, // RU2_LIMB_RIGHT_FOOT
+ BODYPART_NONE, // RU2_LIMB_RIGHT_TAIL
+ RU_BODYPART_0, // RU2_LIMB_TORSO
+ RU_BODYPART_6, // RU2_LIMB_LEFT_UPPER_ARM
+ BODYPART_NONE, // RU2_LIMB_LEFT_UPPER_WING
+ BODYPART_NONE, // RU2_LIMB_LEFT_LOWER_WING
+ RU_BODYPART_7, // RU2_LIMB_LEFT_FOREARM
+ RU_BODYPART_8, // RU2_LIMB_LEFT_HAND
+ RU_BODYPART_2, // RU2_LIMB_RIGHT_UPPER_ARM
+ BODYPART_NONE, // RU2_LIMB_RIGHT_UPPER_WING
+ BODYPART_NONE, // RU2_LIMB_RIGHT_LOWER_WING
+ RU_BODYPART_3, // RU2_LIMB_RIGHT_FOREARM
+ RU_BODYPART_4, // RU2_LIMB_RIGHT_HAND
+ RU_BODYPART_2, // RU2_LIMB_HEAD
+ RU_BODYPART_1, // RU2_LIMB_WAIST
};
-static s8 sRuBodyParts[RU_BODYPARTSPOS_COUNT] = {
- 0, 0, 0, 0, 3, 4, 0, 6, 7, 0, 9, 10, 0, 12, 13,
+static s8 sParentShadowBodyParts[RU_BODYPART_MAX] = {
+ RU_BODYPART_0, // RU_BODYPART_0
+ RU_BODYPART_0, // RU_BODYPART_1
+ RU_BODYPART_0, // RU_BODYPART_2
+ RU_BODYPART_0, // RU_BODYPART_3
+ RU_BODYPART_3, // RU_BODYPART_4
+ RU_BODYPART_4, // RU_BODYPART_5
+ RU_BODYPART_0, // RU_BODYPART_6
+ RU_BODYPART_6, // RU_BODYPART_7
+ RU_BODYPART_7, // RU_BODYPART_8
+ RU_BODYPART_0, // RU_BODYPART_9
+ RU_BODYPART_9, // RU_BODYPART_10
+ RU_BODYPART_10, // RU_BODYPART_11
+ RU_BODYPART_0, // RU_BODYPART_12
+ RU_BODYPART_12, // RU_BODYPART_13
+ RU_BODYPART_13, // RU_BODYPART_14
};
-static u8 sRuShadowSizes[] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+static u8 sShadowSizes[RU_BODYPART_MAX] = {
+ 0, // RU_BODYPART_0
+ 0, // RU_BODYPART_1
+ 0, // RU_BODYPART_2
+ 0, // RU_BODYPART_3
+ 0, // RU_BODYPART_4
+ 0, // RU_BODYPART_5
+ 0, // RU_BODYPART_6
+ 0, // RU_BODYPART_7
+ 0, // RU_BODYPART_8
+ 0, // RU_BODYPART_9
+ 0, // RU_BODYPART_10
+ 0, // RU_BODYPART_11
+ 0, // RU_BODYPART_12
+ 0, // RU_BODYPART_13
+ 0, // RU_BODYPART_14
};
static TrackOptionsSet sTrackOptions = {
@@ -138,35 +187,36 @@ 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;
leftWasGrounded = this->isLeftFootGrounded;
rightWasGrounded = this->isRightFootGrounded;
- if (this->actor.bgCheckFlags & 0x20) {
+ 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);
if (this->isLeftFootGrounded && !leftWasGrounded && isFootGrounded) {
- Actor_PlaySfxAtPos(&this->actor, sfxId);
+ Actor_PlaySfx(&this->actor, sfxId);
}
this->isRightFootGrounded = isFootGrounded = SubS_IsFloorAbove(play, &this->rightFootPos, -6.0f);
if (this->isRightFootGrounded && !rightWasGrounded && isFootGrounded) {
- Actor_PlaySfxAtPos(&this->actor, sfxId);
+ Actor_PlaySfx(&this->actor, sfxId);
}
return false;
@@ -201,7 +251,7 @@ void EnRu_UpdateModel(EnRu* this, PlayState* play) {
Vec3f playerPos;
playerPos.x = player->actor.world.pos.x;
- playerPos.y = player->bodyPartsPos[7].y + 3.0f;
+ playerPos.y = player->bodyPartsPos[PLAYER_BODYPART_HEAD].y + 3.0f;
playerPos.z = player->actor.world.pos.z;
SubS_TrackPoint(&playerPos, &this->actor.focus.pos, &this->actor.shape.rot, &this->trackTarget, &this->headRot,
&this->torsoRot, &sTrackOptions);
@@ -217,7 +267,7 @@ void EnRu_UpdateModel(EnRu* this, PlayState* play) {
EnRu_UpdateEyes(this, 3);
EnRu_PlayWalkingSound(this, play);
- SubS_FillLimbRotTables(play, this->limbRotTableY, this->limbRotTableZ, RU2_LIMB_MAX);
+ SubS_UpdateFidgetTables(play, this->fidgetTableY, this->fidgetTableZ, RU2_LIMB_MAX);
}
void EnRu_DoNothing(EnRu* this, PlayState* play) {
@@ -234,7 +284,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 +300,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);
}
@@ -273,8 +323,8 @@ s32 EnRu_OverrideLimbdraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po
if ((limbIndex == RU2_LIMB_TORSO) || (limbIndex == RU2_LIMB_LEFT_UPPER_ARM) ||
(limbIndex == RU2_LIMB_RIGHT_UPPER_ARM)) {
- rot->y += (s16)(Math_SinS(this->limbRotTableY[limbIndex]) * 200.0f);
- rot->z += (s16)(Math_CosS(this->limbRotTableZ[limbIndex]) * 200.0f);
+ rot->y += (s16)(Math_SinS(this->fidgetTableY[limbIndex]) * 200.0f);
+ rot->z += (s16)(Math_CosS(this->fidgetTableZ[limbIndex]) * 200.0f);
}
return false;
@@ -285,8 +335,8 @@ void EnRu_PostLimbdraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
Vec3f headFocus = { 800.0f, 0, 0 };
Vec3f bodyPartPos = { 0, 0, 0 };
- if (sBodyPartPosIndices[limbIndex] >= 0) {
- Matrix_MultVec3f(&bodyPartPos, &this->bodyPartsPos[sBodyPartPosIndices[limbIndex]]);
+ if (sLimbToBodyParts[limbIndex] > BODYPART_NONE) {
+ Matrix_MultVec3f(&bodyPartPos, &this->bodyPartsPos[sLimbToBodyParts[limbIndex]]);
}
if (limbIndex == RU2_LIMB_HEAD) {
Matrix_MultVec3f(&headFocus, &thisx->focus.pos);
@@ -319,7 +369,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++);
@@ -343,8 +393,8 @@ void EnRu_Draw(Actor* thisx, PlayState* play) {
}
for (i = 0; i < 5; i++) {
- SubS_GenShadowTex(&this->bodyPartsPos[0], &this->actor.world.pos, shadowTex, (i / 5.0f),
- (ARRAY_COUNT(sRuBodyParts)), sRuShadowSizes, sRuBodyParts);
+ SubS_GenShadowTex(this->bodyPartsPos, &this->actor.world.pos, shadowTex, i / 5.0f, RU_BODYPART_MAX,
+ sShadowSizes, sParentShadowBodyParts);
}
SubS_DrawShadowTex(&this->actor, &play->state, shadowTex);
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..83f7d8426 100644
--- a/src/overlays/actors/ovl_En_Ru/z_en_ru.h
+++ b/src/overlays/actors/ovl_En_Ru/z_en_ru.h
@@ -4,13 +4,32 @@
#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;
typedef void (*EnRuActionFunc)(struct EnRu*, PlayState*);
-#define RU_BODYPARTSPOS_COUNT 15
+typedef enum EnRuBodyPart {
+ /* 0 */ RU_BODYPART_0,
+ /* 1 */ RU_BODYPART_1,
+ /* 2 */ RU_BODYPART_2,
+ /* 3 */ RU_BODYPART_3,
+ /* 4 */ RU_BODYPART_4,
+ /* 5 */ RU_BODYPART_5,
+ /* 6 */ RU_BODYPART_6,
+ /* 7 */ RU_BODYPART_7,
+ /* 8 */ RU_BODYPART_8,
+ /* 9 */ RU_BODYPART_9,
+ /* 10 */ RU_BODYPART_10,
+ /* 11 */ RU_BODYPART_11,
+ /* 12 */ RU_BODYPART_12,
+ /* 13 */ RU_BODYPART_13,
+ /* 14 */ RU_BODYPART_14,
+ /* 15 */ RU_BODYPART_MAX
+} EnruBodyPart;
typedef struct EnRu {
/* 0x000 */ Actor actor;
@@ -30,9 +49,9 @@ typedef struct EnRu {
/* 0x318 */ Vec3s headRot;
/* 0x31E */ Vec3s torsoRot;
/* 0x324 */ UNK_TYPE1 pad324[0x12];
- /* 0x336 */ s16 limbRotTableY[RU2_LIMB_MAX];
- /* 0x364 */ s16 limbRotTableZ[RU2_LIMB_MAX];
- /* 0x394 */ Vec3f bodyPartsPos[RU_BODYPARTSPOS_COUNT];
+ /* 0x336 */ s16 fidgetTableY[RU2_LIMB_MAX];
+ /* 0x364 */ s16 fidgetTableZ[RU2_LIMB_MAX];
+ /* 0x394 */ Vec3f bodyPartsPos[RU_BODYPART_MAX];
/* 0x348 */ UNK_TYPE1 padUNK[6];
/* 0x44E */ s16 eyeState;
/* 0x450 */ s16 blinkTimer;
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 f77993e5d..27f95af01 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;
}
@@ -225,7 +222,7 @@ void EnRuppecrow_ShatterIce(EnRuppecrow* this, PlayState* play) {
if (this->currentEffect == ENRUPPECROW_EFFECT_ICE) {
this->currentEffect = ENRUPPECROW_EFFECT_NONE;
this->unk_2C8 = 0.0f;
- Actor_SpawnIceEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), 0x2, 0.2f, 0.2f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, ENRUPPECROW_BODYPART_MAX, 0x2, 0.2f, 0.2f);
}
}
@@ -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);
}
}
@@ -282,7 +283,7 @@ void EnRuppecrow_SpawnRupee(EnRuppecrow* this, PlayState* play) {
this->rupees[rupeeIndex] = rupee;
this->rupees[rupeeIndex]->actor.gravity = -5.0f;
this->rupees[rupeeIndex]->actor.velocity.y = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_RUPY_FALL);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_RUPY_FALL);
rupee = this->rupees[rupeeIndex];
rupee->unk152 = 60;
this->rupees[rupeeIndex]->actor.flags |= ACTOR_FLAG_10;
@@ -293,7 +294,7 @@ void EnRuppecrow_SpawnRupee(EnRuppecrow* this, PlayState* play) {
this->rupees[rupeeIndex] = rupee;
this->rupees[rupeeIndex]->actor.gravity = -5.0f;
this->rupees[rupeeIndex]->actor.velocity.y = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_RUPY_FALL);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_RUPY_FALL);
rupee = this->rupees[rupeeIndex];
rupee->unk152 = 60;
this->rupees[rupeeIndex]->actor.flags |= ACTOR_FLAG_10;
@@ -305,7 +306,7 @@ void EnRuppecrow_SpawnRupee(EnRuppecrow* this, PlayState* play) {
this->rupees[rupeeIndex] = rupee;
this->rupees[rupeeIndex]->actor.gravity = -5.0f;
this->rupees[rupeeIndex]->actor.velocity.y = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_RUPY_FALL);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_RUPY_FALL);
rupee = this->rupees[rupeeIndex];
rupee->unk152 = 60;
this->rupees[rupeeIndex]->actor.flags |= ACTOR_FLAG_10;
@@ -316,7 +317,7 @@ void EnRuppecrow_SpawnRupee(EnRuppecrow* this, PlayState* play) {
this->rupees[rupeeIndex] = rupee;
this->rupees[rupeeIndex]->actor.gravity = -5.0f;
this->rupees[rupeeIndex]->actor.velocity.y = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_RUPY_FALL);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_RUPY_FALL);
rupee = this->rupees[rupeeIndex];
rupee->unk152 = 60;
this->rupees[rupeeIndex]->actor.flags |= ACTOR_FLAG_10;
@@ -329,7 +330,7 @@ void EnRuppecrow_UpdatePosition(EnRuppecrow* this, PlayState* play) {
Vec3s nextPointDirection;
EnRuppecrow_GetPointDirection(this->path, this->currentPoint, &this->actor.world, &nextPointDirection);
- if (this->actor.bgCheckFlags & 0x8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
nextPointDirection.y = this->actor.wallYaw;
}
@@ -367,23 +368,26 @@ void EnRuppecrow_UpdatePosition(EnRuppecrow* this, PlayState* play) {
s32 EnRuppecrow_CheckPlayedMatchingSong(PlayState* play) {
Player* player = GET_PLAYER(play);
- if (play->msgCtx.ocarinaMode == 0x3) {
+ if (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) {
switch (player->transformation) {
case PLAYER_FORM_DEKU:
if (play->msgCtx.lastPlayedSong == OCARINA_SONG_SONATA) {
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;
@@ -438,18 +451,18 @@ void EnRuppecrow_UpdateSpeed(EnRuppecrow* this, PlayState* play) {
void EnRuppecrow_HandleDeath(EnRuppecrow* this) {
f32 scale;
- this->actor.speedXZ *= Math_CosS(this->actor.world.rot.x);
+ this->actor.speed *= Math_CosS(this->actor.world.rot.x);
this->actor.velocity.y = 0.0f;
Animation_Change(&this->skelAnime, &gGuayFlyAnim, 0.4f, 0.0f, 0.0f, ANIMMODE_LOOP_INTERP, -3.0f);
this->actor.shape.yOffset = 0.0f;
this->actor.targetArrowOffset = 0.0f;
- this->actor.bgCheckFlags &= ~0x1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
scale = this->actor.scale.x * 100.0f;
this->actor.world.pos.y += 20.0f * scale;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KAICHO_DEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KAICHO_DEAD);
this->unk_2CC = 0.5f;
if (this->actor.colChkInfo.damageEffect == 0x3) {
@@ -464,9 +477,9 @@ void EnRuppecrow_HandleDeath(EnRuppecrow* this) {
this->unk_2C8 = 5.0f;
}
- Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, 0x0, 0x28);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 40);
if (this->actor.flags & ACTOR_FLAG_8000) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
this->collider.base.acFlags &= ~AC_ON;
@@ -481,7 +494,7 @@ void EnRuppecrow_UpdateDamage(EnRuppecrow* this, PlayState* play) {
if (this->actor.colChkInfo.damageEffect != 0x1) {
this->actor.colChkInfo.health = 0;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
Enemy_StartFinishingBlow(play, &this->actor);
EnRuppecrow_HandleDeath(this);
}
@@ -492,7 +505,7 @@ void EnRuppecrow_HandleSong(EnRuppecrow* this, PlayState* play) {
Player* player = GET_PLAYER(play);
EnRuppecrow_UpdatePosition(this, play);
- if (this->actor.xzDistToPlayer < 1000.0f && EnRuppecrow_CheckPlayedMatchingSong(play)) {
+ if ((this->actor.xzDistToPlayer < 1000.0f) && EnRuppecrow_CheckPlayedMatchingSong(play)) {
// If Link is in front, the guay will turn around and go the other way
if (Actor_IsFacingPlayer(&this->actor, 0x4000)) {
this->isGoingCounterClockwise |= 1;
@@ -503,14 +516,14 @@ void EnRuppecrow_HandleSong(EnRuppecrow* this, PlayState* play) {
}
}
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
this->actionFunc = EnRuppecrow_HandleSongCutscene;
}
if (player->stateFlags2 & PLAYER_STATE2_8000000) {
- Math_ApproachF(&this->actor.speedXZ, 0.0f, 0.1f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 0.0f, 0.1f, 1.0f);
} else {
- Math_ApproachF(&this->actor.speedXZ, 6.0f, 0.1f, 0.1f);
+ Math_ApproachF(&this->actor.speed, 6.0f, 0.1f, 0.1f);
}
Actor_MoveWithoutGravity(&this->actor);
@@ -518,19 +531,19 @@ void EnRuppecrow_HandleSong(EnRuppecrow* this, PlayState* play) {
this->actor.shape.yOffset = Math_SinS(this->yOffset) * 500.0f;
if ((play->state.frames % 43) == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KAICHO_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KAICHO_CRY);
}
}
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);
@@ -546,16 +559,16 @@ void EnRuppecrow_FlyWhileDroppingRupees(EnRuppecrow* this, PlayState* play) {
//! @bug: Source of the "Termina Field Guay Glitch"; guay will no longer fall if killed after this point
this->actor.gravity = 0.0f;
- Math_ApproachF(&this->actor.speedXZ, 6.0f, 0.2f, 0.5f);
+ Math_ApproachF(&this->actor.speed, 6.0f, 0.2f, 0.5f);
Math_ApproachF(&this->actor.velocity.y, 3.0f, 0.2f, 0.5f);
this->actionFunc = EnRuppecrow_FlyToDespawn;
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.speedXZ, this->speedModifier, 0.2f, 0.5f);
+ Math_ApproachF(&this->actor.speed, this->speedModifier, 0.2f, 0.5f);
}
Actor_MoveWithoutGravity(&this->actor);
@@ -563,17 +576,17 @@ void EnRuppecrow_FlyWhileDroppingRupees(EnRuppecrow* this, PlayState* play) {
this->actor.shape.yOffset = Math_SinS(this->yOffset) * 500.0f;
if ((play->state.frames % 43) == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KAICHO_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KAICHO_CRY);
}
}
}
void EnRuppecrow_FlyToDespawn(EnRuppecrow* this, PlayState* play) {
- if (this->actor.bgCheckFlags & 0x8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->actor.world.rot.y *= -0x1;
}
- Math_ApproachF(&this->actor.speedXZ, this->speedModifier, 0.1f, 0.1f);
+ Math_ApproachF(&this->actor.speed, this->speedModifier, 0.1f, 0.1f);
Math_ApproachF(&this->actor.velocity.y, 3.0f, 0.2f, 0.5f);
if (this->actor.world.pos.y > 1000.0f || this->actor.xzDistToPlayer > 2000.0f) {
@@ -585,20 +598,20 @@ void EnRuppecrow_FlyToDespawn(EnRuppecrow* this, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
if ((play->state.frames % 43) == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KAICHO_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KAICHO_CRY);
}
}
}
void EnRuppecrow_FallToDespawn(EnRuppecrow* this, PlayState* play) {
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f);
+ Math_StepToF(&this->actor.speed, 0.0f, 0.5f);
if (this->currentEffect != ENRUPPECROW_EFFECT_ICE) {
Math_StepToF(&this->unk_2C8, 0.0f, 0.05f);
this->unk_2CC = (this->unk_2C8 + 1.0f) * 0.25f;
this->unk_2CC = CLAMP_MAX(this->unk_2CC, 0.5f);
} else if (!Math_StepToF(&this->iceSfxTimer, 0.5f, 0.0125f)) {
- func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
this->actor.colorFilterTimer = 40;
@@ -608,7 +621,7 @@ void EnRuppecrow_FallToDespawn(EnRuppecrow* this, PlayState* play) {
this->actor.shape.rot.z += 0x1780;
}
- if (this->actor.bgCheckFlags & 0x1 || this->actor.floorHeight == BGCHECK_Y_MIN) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (this->actor.floorHeight == BGCHECK_Y_MIN)) {
EnRuppecrow_ShatterIce(this, play);
func_800B3030(play, &this->actor.world.pos, &gZeroVec3f, &gZeroVec3f, (this->actor.scale.x * 10000.0f), 0x0,
0x0);
@@ -627,19 +640,19 @@ void EnRuppecrow_Init(Actor* thisx, PlayState* play2) {
EnRuppecrow* this = THIS;
Actor_ProcessInitChain(&this->actor, sInitChain);
- SkelAnime_InitFlex(play, &this->skelAnime, &gGuaySkel, &gGuayFlyAnim, this->joinTable, this->morphTable,
+ SkelAnime_InitFlex(play, &this->skelAnime, &gGuaySkel, &gGuayFlyAnim, this->jointTable, this->morphTable,
OBJECT_CROW_LIMB_MAX);
ActorShape_Init(&this->actor.shape, 2000.0f, ActorShadow_DrawCircle, 20.0f);
Collider_InitJntSph(play, &this->collider);
- Collider_InitAndSetJntSph(play, &this->collider, &this->actor, &sJntSphInit, &this->colliderElement);
+ Collider_InitAndSetJntSph(play, &this->collider, &this->actor, &sJntSphInit, this->colliderElements);
this->collider.elements->dim.worldSphere.radius = sJntSphInit.elements->dim.modelSphere.radius;
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
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..40eee8102 100644
--- a/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.h
+++ b/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.h
@@ -4,27 +4,36 @@
#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
struct EnRuppecrow;
typedef void (*EnRuppecrowActionFunc)(struct EnRuppecrow*, PlayState*);
+typedef enum EnRuppecrowBodyPart {
+ /* 0 */ ENRUPPECROW_BODYPART_0,
+ /* 1 */ ENRUPPECROW_BODYPART_1,
+ /* 2 */ ENRUPPECROW_BODYPART_2,
+ /* 3 */ ENRUPPECROW_BODYPART_3,
+ /* 4 */ ENRUPPECROW_BODYPART_MAX
+} EnRuppecrowBodyPart;
+
typedef struct EnRuppecrow {
/* 0x000 */ Actor actor;
/* 0x144 */ EnItem00* rupees[ENRUPPECROW_RUPEE_COUNT];
/* 0x194 */ SkelAnime skelAnime;
/* 0x1D8 */ EnRuppecrowActionFunc actionFunc;
/* 0x1DC */ UNK_TYPE4 unk_1DC; // unused
- /* 0x1E0 */ Vec3s joinTable[OBJECT_CROW_LIMB_MAX];
+ /* 0x1E0 */ Vec3s jointTable[OBJECT_CROW_LIMB_MAX];
/* 0x216 */ Vec3s morphTable[OBJECT_CROW_LIMB_MAX];
/* 0x24C */ Path* path;
/* 0x250 */ s32 currentPoint;
/* 0x254 */ ColliderJntSph collider;
- /* 0x274 */ ColliderJntSphElement colliderElement;
+ /* 0x274 */ ColliderJntSphElement colliderElements[1];
/* 0x2B4 */ u16 isGoingCounterClockwise;
/* 0x2B8 */ f32 speedModifier;
/* 0x2BC */ s16 rupeeIndex;
@@ -34,7 +43,7 @@ typedef struct EnRuppecrow {
/* 0x2C8 */ f32 unk_2C8; // set but not used
/* 0x2CC */ f32 unk_2CC; // set but not used
/* 0x2D0 */ f32 iceSfxTimer;
- /* 0x2D4 */ Vec3f limbPos[ENRUPPECROW_LIMB_POS_COUNT];
+ /* 0x2D4 */ Vec3f bodyPartsPos[ENRUPPECROW_BODYPART_MAX];
} EnRuppecrow; // size = 0x304
#endif // Z_EN_RUPPECROW_H
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 108d88023..a7bfd13f0 100644
--- a/src/overlays/actors/ovl_En_Rz/z_en_rz.c
+++ b/src/overlays/actors/ovl_En_Rz/z_en_rz.c
@@ -7,7 +7,7 @@
#include "z_en_rz.h"
#include "assets/objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnRz*)thisx)
@@ -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);
}
}
@@ -112,7 +112,7 @@ void EnRz_Init(Actor* thisx, PlayState* play) {
this->actionFunc = func_80BFC058;
EnRz_SetupPath(this, play);
this->animIndex = EN_RZ_ANIM_MAX;
- this->actor.targetMode = 0;
+ this->actor.targetMode = TARGET_MODE_0;
this->actor.terminalVelocity = -9.0f;
this->actor.gravity = -1.0f;
@@ -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);
+ Actor_PlaySfx_Flagged(&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;
}
@@ -423,12 +425,12 @@ void func_80BFC078(EnRz* this, PlayState* play) {
switch (play->msgCtx.currentTextId) {
case 0x2927:
case 0x2928:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
SET_WEEKEVENTREG(WEEKEVENTREG_77_04);
break;
default:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80BFC3F8;
if (this->animIndex != EN_RZ_ANIM_LINK_DANCE) {
func_80BFB9E4(play, this, EN_RZ_ANIM_DANCE);
@@ -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);
}
}
@@ -473,15 +475,15 @@ void func_80BFC270(EnRz* this, PlayState* play) {
this->actionFunc = func_80BFC214;
func_80BFBDFC(play);
} else {
- Actor_PickUp(&this->actor, play, GI_HEART_PIECE, 2000.0f, 1000.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_HEART_PIECE, 2000.0f, 1000.0f);
}
}
void func_80BFC2F4(EnRz* this, PlayState* play) {
EnRz_UpdateSkelAnime(this, play);
if (!func_80BFBE70(this, play)) {
- func_801477B4(play);
- Actor_PickUp(&this->actor, play, GI_HEART_PIECE, 2000.0f, 1000.0f);
+ Message_CloseTextbox(play);
+ Actor_OfferGetItem(&this->actor, play, GI_HEART_PIECE, 2000.0f, 1000.0f);
this->actionFunc = func_80BFC270;
}
}
@@ -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)) {
@@ -534,10 +536,10 @@ void func_80BFC3F8(EnRz* this, PlayState* play) {
} else if (EnRz_CanTalk(this, play)) {
if (func_80BFBCEC(this, play) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_77_04) && this->sister != NULL) {
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
} else {
this->actor.flags &= ~ACTOR_FLAG_10000;
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
}
}
@@ -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);
}
}
}
@@ -554,7 +556,7 @@ void func_80BFC608(EnRz* this, PlayState* play) {
EnRz_UpdateSkelAnime(this, play);
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80BFC674;
}
}
@@ -570,7 +572,7 @@ void func_80BFC674(EnRz* this, PlayState* play) {
Message_StartTextbox(play, 0x2924, &this->actor);
}
} else if (EnRz_CanTalk(this, play)) {
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
}
}
@@ -578,7 +580,7 @@ void func_80BFC728(EnRz* this, PlayState* play) {
EnRz_UpdateSkelAnime(this, play);
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80BFC7E0;
this->actor.textId++;
if (EN_RZ_GET_SISTER(&this->actor) == EN_RZ_JUDO) {
@@ -604,23 +606,23 @@ void func_80BFC7E0(EnRz* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actionFunc = func_80BFC728;
func_80BFB9E4(play, this, EN_RZ_ANIM_THINKING);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
func_80BFBDFC(play);
} else if (EnRz_CanTalk(this, play)) {
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
}
}
void EnRz_StopToThink(EnRz* this, PlayState* play) {
this->timer = 100;
this->actionFunc = func_80BFC7E0;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
func_80BFB9E4(play, this, EN_RZ_ANIM_THINKING);
}
void EnRz_Walk(EnRz* this, PlayState* play) {
EnRz_UpdateSkelAnime(this, play);
- this->actor.speedXZ = 1.5f;
+ this->actor.speed = 1.5f;
switch (EnRz_GetPathStatus(this)) {
case EN_RZ_PATHSTATUS_END:
@@ -639,10 +641,10 @@ void EnRz_Walk(EnRz* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actionFunc = func_80BFC728;
func_80BFB9E4(play, this, EN_RZ_ANIM_THINKING);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
func_80BFBDFC(play);
} else if (EnRz_CanTalk(this, play)) {
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.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 cc3cd2455..2f429b975 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
@@ -36,7 +36,7 @@ Week Event Flags:
#include "overlays/actors/ovl_En_Jg/z_en_jg.h" // Goron Elder
#include "objects/object_taisou/object_taisou.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnSGoro*)thisx)
#define EN_S_GORO_ROLLEDUP_YOFFSET 14.0f
@@ -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) {
@@ -264,7 +264,7 @@ u16 EnSGoro_ShrineGoron_NextTextId(EnSGoro* this, PlayState* play) {
}
} else {
// Scene flag - Checks whether the chandelier has been lit
- if (!Flags_GetSwitch(play, EN_S_GORO_SCENEFLAG_INDEX(&this->actor))) {
+ if (!Flags_GetSwitch(play, EN_S_GORO_GET_SWITCH_FLAG(&this->actor))) {
if (player->transformation == PLAYER_FORM_GORON) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_36_08)) {
if (this->textId == 0xD02) {
@@ -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) {
@@ -697,23 +697,23 @@ u16 EnSGoro_BombshopGoron_NextTextId(EnSGoro* this, PlayState* play) {
if (this->bombbuyFlags & EN_S_GORO_BOMBBUYFLAG_YESBUY) {
if (AMMO(ITEM_POWDER_KEG) != 0) {
this->actionFlags |= EN_S_GORO_ACTIONFLAG_LASTMESSAGE;
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
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);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
return 0x674;
}
if ((gSaveContext.save.day == 3) && gSaveContext.save.isNight) {
this->actionFlags |= EN_S_GORO_ACTIONFLAG_LASTMESSAGE;
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
return 0x676;
}
this->actionFlags |= EN_S_GORO_ACTIONFLAG_LASTMESSAGE;
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
return 0x675;
}
if ((gSaveContext.save.day == 3) && gSaveContext.save.isNight) {
@@ -765,13 +765,13 @@ void EnSGoro_UpdateSleeping(EnSGoro* this, PlayState* play) {
if (this->snorePhase == 0) {
if (this->actionFlags & EN_S_GORO_ACTIONFLAG_SNOREPHASE) {
this->actionFlags &= ~EN_S_GORO_ACTIONFLAG_SNOREPHASE;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_SNORE2);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_SNORE2);
} else {
this->actionFlags |= EN_S_GORO_ACTIONFLAG_SNOREPHASE;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_SNORE1);
+ 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;
}
@@ -786,18 +786,18 @@ void EnSGoro_UpdateSleeping(EnSGoro* this, PlayState* play) {
s32 EnSGoro_UpdateCheerAnimation(EnSGoro* this, PlayState* play) {
if (this->animInfoIndex == EN_S_GORO_ANIM_IDLE_STAND) {
if (((EnJg*)this->otherGoron)->flags & 1) {
- this->loadedObjIndex = Object_GetIndex(&play->objectCtx, OBJECT_TAISOU);
+ this->loadedObjIndex = Object_GetSlot(&play->objectCtx, OBJECT_TAISOU);
if (this->loadedObjIndex >= 0) {
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->loadedObjIndex].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->loadedObjIndex].segment);
this->animInfoIndex = EN_S_GORO_ANIM_TAISOU_CHEER;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animInfoIndex);
return true;
}
}
} else if ((this->animInfoIndex == EN_S_GORO_ANIM_TAISOU_CHEER) && !(((EnJg*)this->otherGoron)->flags & 1)) {
- this->loadedObjIndex = Object_GetIndex(&play->objectCtx, OBJECT_OF1D_MAP);
+ this->loadedObjIndex = Object_GetSlot(&play->objectCtx, OBJECT_OF1D_MAP);
if (this->loadedObjIndex >= 0) {
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->loadedObjIndex].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->loadedObjIndex].segment);
this->animInfoIndex = EN_S_GORO_ANIM_IDLE_STAND;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animInfoIndex);
this->skelAnime.curFrame = this->skelAnime.endFrame;
@@ -811,7 +811,7 @@ s32 EnSGoro_CheckLullaby(EnSGoro* this, PlayState* play) {
s32 actorType;
Player* player = GET_PLAYER(play);
- if ((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == 3)) {
+ if ((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT)) {
if (play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY) {
this->animInfoIndex = EN_S_GORO_ANIM_ROLLUP;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animInfoIndex);
@@ -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;
@@ -1048,7 +1048,7 @@ void EnSGoro_SetupAction(EnSGoro* this, PlayState* play) {
this->actor.gravity = -1.0f;
this->actor.flags |= ACTOR_FLAG_10;
this->actor.flags |= ACTOR_FLAG_2000000;
- this->actor.targetMode = 1;
+ this->actor.targetMode = TARGET_MODE_1;
switch (EN_S_GORO_GET_MAIN_TYPE(&this->actor)) {
case EN_S_GORO_TYPE_SHRINE_WINTER_A:
@@ -1113,8 +1113,8 @@ void EnSGoro_WinterShrineGoron_Idle(EnSGoro* this, PlayState* play) {
this->textId = EnSGoro_ShrineGoron_NextTextId(this, play);
Message_StartTextbox(play, this->textId, &this->actor);
this->actionFunc = EnSGoro_WinterShrineGoron_Talk;
- } else if ((this->actor.xzDistToPlayer < 250.0f) || this->actor.isTargeted) {
- func_800B863C(&this->actor, play);
+ } else if ((this->actor.xzDistToPlayer < 250.0f) || this->actor.isLockedOn) {
+ Actor_OfferTalkNearColChkInfoCylinder(&this->actor, play);
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.home.rot.y, 5, 0x1000, 0x100);
this->actor.world.rot.y = this->actor.shape.rot.y;
@@ -1144,8 +1144,8 @@ void EnSGoro_SpringShrineGoron_Idle(EnSGoro* this, PlayState* play) {
this->textId = EnSGoro_ShrineGoron_NextTextId(this, play);
Message_StartTextbox(play, this->textId, &this->actor);
this->actionFunc = EnSGoro_SpringShrineGoron_Talk;
- } else if ((this->actor.xzDistToPlayer < 250.0f) || (this->actor.isTargeted)) {
- func_800B863C(&this->actor, play);
+ } else if ((this->actor.xzDistToPlayer < 250.0f) || (this->actor.isLockedOn)) {
+ Actor_OfferTalkNearColChkInfoCylinder(&this->actor, play);
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.home.rot.y, 5, 0x1000, 0x100);
this->actor.world.rot.y = this->actor.shape.rot.y;
@@ -1157,7 +1157,7 @@ void EnSGoro_SpringShrineGoron_Talk(EnSGoro* this, PlayState* play) {
if (this->actionFlags & EN_S_GORO_ACTIONFLAG_LASTMESSAGE) {
this->actionFlags &= ~EN_S_GORO_ACTIONFLAG_LASTMESSAGE;
this->actionFlags &= ~EN_S_GORO_ACTIONFLAG_ENGAGED;
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->actionFunc = EnSGoro_SpringShrineGoron_Idle;
return;
@@ -1185,8 +1185,8 @@ void EnSGoro_ShopGoron_Idle(EnSGoro* this, PlayState* play) {
Message_StartTextbox(play, this->textId, &this->actor);
this->actionFunc = EnSGoro_ShopGoron_Talk;
}
- } else if ((this->actor.xzDistToPlayer < 250.0f) || this->actor.isTargeted) {
- func_800B863C(&this->actor, play);
+ } else if ((this->actor.xzDistToPlayer < 250.0f) || this->actor.isLockedOn) {
+ Actor_OfferTalkNearColChkInfoCylinder(&this->actor, play);
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.home.rot.y, 5, 0x1000, 0x100);
this->actor.world.rot.y = this->actor.shape.rot.y;
@@ -1236,16 +1236,16 @@ void EnSGoro_ShopGoron_Talk(EnSGoro* this, PlayState* play) {
this->bombbuyFlags |= EN_S_GORO_BOMBBUYFLAG_YESBUY;
break;
case 1:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
this->bombbuyFlags &= ~EN_S_GORO_BOMBBUYFLAG_YESBUY;
break;
}
this->textId = EnSGoro_BombshopGoron_NextTextId(this, play);
if ((this->textId == 0x675) || (this->textId == 0x676)) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
- Actor_PickUp(&this->actor, play, GI_POWDER_KEG, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_POWDER_KEG, 300.0f, 300.0f);
this->actionFunc = EnSGoro_ShopGoron_TakePayment;
} else {
Message_StartTextbox(play, this->textId, &this->actor);
@@ -1262,7 +1262,7 @@ void EnSGoro_ShopGoron_TakePayment(EnSGoro* this, PlayState* play) {
Rupees_ChangeBy(-this->powderKegPrice);
this->actionFunc = EnSGoro_ShopGoron_FinishTransaction;
} else {
- Actor_PickUp(&this->actor, play, GI_POWDER_KEG, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_POWDER_KEG, 300.0f, 300.0f);
}
}
@@ -1271,7 +1271,7 @@ void EnSGoro_ShopGoron_FinishTransaction(EnSGoro* this, PlayState* play) {
Message_StartTextbox(play, this->textId, &this->actor);
this->actionFunc = EnSGoro_ShopGoron_Talk;
} else {
- func_800B85E0(&this->actor, play, 400.0f, -1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
}
}
@@ -1279,8 +1279,8 @@ void EnSGoro_Sleep(EnSGoro* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
Message_StartTextbox(play, 0x23A, &this->actor);
this->actionFunc = EnSGoro_SleepTalk;
- } else if (this->actor.isTargeted) {
- func_800B863C(&this->actor, play);
+ } else if (this->actor.isLockedOn) {
+ Actor_OfferTalkNearColChkInfoCylinder(&this->actor, play);
}
EnSGoro_UpdateSleeping(this, play);
}
@@ -1288,7 +1288,7 @@ void EnSGoro_Sleep(EnSGoro* this, PlayState* play) {
void EnSGoro_SleepTalk(EnSGoro* this, PlayState* play) {
if (Message_GetState(&play->msgCtx) == TEXT_STATE_DONE) {
if (Message_ShouldAdvance(play)) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->actionFunc = EnSGoro_Sleep;
}
@@ -1307,7 +1307,7 @@ void EnSGoro_Init(Actor* thisx, PlayState* play) {
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
if (this->actor.update != NULL) {
- s32 objIndex = Object_GetIndex(&play->objectCtx, OBJECT_OF1D_MAP);
+ s32 objIndex = Object_GetSlot(&play->objectCtx, OBJECT_OF1D_MAP);
this->loadedObjIndex = objIndex;
if (objIndex < 0) {
@@ -1328,8 +1328,8 @@ 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);
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->loadedObjIndex].segment);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->loadedObjIndex].segment);
SkelAnime_Update(&this->skelAnime);
if (this->animInfoIndex != EN_S_GORO_ANIM_SLEEPY) {
EnSGoro_UpdateAttentionTarget(this, play);
@@ -1350,7 +1350,7 @@ s32 EnSGoro_UpdateLimb(s16 newRotZ, s16 newRotY, Vec3f* pos, Vec3s* rot, s32 ste
Matrix_MultVec3f(&zeroVec, &newPos);
Matrix_Get(&curState);
- Matrix_MtxFToYXZRot(&curState, &newRot, MTXMODE_NEW);
+ Matrix_MtxFToYXZRot(&curState, &newRot, false);
*pos = newPos;
@@ -1381,53 +1381,62 @@ void EnSGoro_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
s32 overrideRot;
EnSGoro* this = THIS;
- if (limbIndex != GORON_LIMB_BODY) {
- if ((limbIndex == GORON_LIMB_HEAD) && (this->animInfoIndex != EN_S_GORO_ANIM_SLEEPY)) {
- if (this->actionFlags & EN_S_GORO_ACTIONFLAG_FACEPLAYER) {
- overrideRot = true;
- } else {
- overrideRot = false;
+ switch (limbIndex) {
+ case GORON_LIMB_HEAD:
+ if (this->animInfoIndex != EN_S_GORO_ANIM_SLEEPY) {
+ if (this->actionFlags & EN_S_GORO_ACTIONFLAG_FACEPLAYER) {
+ overrideRot = true;
+ } else {
+ overrideRot = false;
+ }
+ if (this->loseAttentionTimer != 0) {
+ stepRot = true;
+ } else {
+ stepRot = false;
+ }
+
+ EnSGoro_UpdateLimb(this->headRotZ + this->bodyRotZ + 0x4000,
+ this->headRotY + this->bodyRotY + this->actor.shape.rot.y + 0x4000,
+ &this->headTranslate, &this->headRotate, stepRot, overrideRot);
+
+ Matrix_Pop();
+ Matrix_Translate(this->headTranslate.x, this->headTranslate.y, this->headTranslate.z, MTXMODE_NEW);
+ Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
+ Matrix_RotateYS(this->headRotate.y, MTXMODE_APPLY);
+ Matrix_RotateXS(this->headRotate.x, MTXMODE_APPLY);
+ Matrix_RotateZS(this->headRotate.z, MTXMODE_APPLY);
+ Matrix_Push();
}
- if (this->loseAttentionTimer != 0) {
- stepRot = true;
- } else {
- stepRot = false;
+ break;
+
+ case GORON_LIMB_BODY:
+ if (this->animInfoIndex != EN_S_GORO_ANIM_SLEEPY) {
+ if (this->actionFlags & EN_S_GORO_ACTIONFLAG_FACEPLAYER) {
+ overrideRot = true;
+ } else {
+ overrideRot = false;
+ }
+ if (this->loseAttentionTimer != 0) {
+ stepRot = true;
+ } else {
+ stepRot = false;
+ }
+
+ EnSGoro_UpdateLimb(this->bodyRotZ + 0x4000, this->bodyRotY + this->actor.shape.rot.y + 0x4000,
+ &this->bodyTranslate, &this->bodyRotate, stepRot, overrideRot);
+
+ Matrix_Pop();
+ Matrix_Translate(this->bodyTranslate.x, this->bodyTranslate.y, this->bodyTranslate.z, MTXMODE_NEW);
+ Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
+ Matrix_RotateYS(this->bodyRotate.y, MTXMODE_APPLY);
+ Matrix_RotateXS(this->bodyRotate.x, MTXMODE_APPLY);
+ Matrix_RotateZS(this->bodyRotate.z, MTXMODE_APPLY);
+ Matrix_Push();
}
+ break;
- EnSGoro_UpdateLimb(this->headRotZ + this->bodyRotZ + 0x4000,
- this->headRotY + this->bodyRotY + this->actor.shape.rot.y + 0x4000, &this->headTranslate,
- &this->headRotate, stepRot, overrideRot);
-
- Matrix_Pop();
- Matrix_Translate(this->headTranslate.x, this->headTranslate.y, this->headTranslate.z, MTXMODE_NEW);
- Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
- Matrix_RotateYS(this->headRotate.y, MTXMODE_APPLY);
- Matrix_RotateXS(this->headRotate.x, MTXMODE_APPLY);
- Matrix_RotateZS(this->headRotate.z, MTXMODE_APPLY);
- Matrix_Push();
- }
- } else if (this->animInfoIndex != EN_S_GORO_ANIM_SLEEPY) {
- if (this->actionFlags & EN_S_GORO_ACTIONFLAG_FACEPLAYER) {
- overrideRot = true;
- } else {
- overrideRot = false;
- }
- if (this->loseAttentionTimer != 0) {
- stepRot = true;
- } else {
- stepRot = false;
- }
-
- EnSGoro_UpdateLimb(this->bodyRotZ + 0x4000, this->bodyRotY + this->actor.shape.rot.y + 0x4000,
- &this->bodyTranslate, &this->bodyRotate, stepRot, overrideRot);
-
- Matrix_Pop();
- Matrix_Translate(this->bodyTranslate.x, this->bodyTranslate.y, this->bodyTranslate.z, MTXMODE_NEW);
- Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
- Matrix_RotateYS(this->bodyRotate.y, MTXMODE_APPLY);
- Matrix_RotateXS(this->bodyRotate.x, MTXMODE_APPLY);
- Matrix_RotateZS(this->bodyRotate.z, MTXMODE_APPLY);
- Matrix_Push();
+ default:
+ break;
}
}
@@ -1435,9 +1444,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 +1459,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_S_Goro/z_en_s_goro.h b/src/overlays/actors/ovl_En_S_Goro/z_en_s_goro.h
index 5777af17b..9e0cd7792 100644
--- a/src/overlays/actors/ovl_En_S_Goro/z_en_s_goro.h
+++ b/src/overlays/actors/ovl_En_S_Goro/z_en_s_goro.h
@@ -5,7 +5,7 @@
#include "objects/object_oF1d_map/object_oF1d_map.h"
#define EN_S_GORO_GET_MAIN_TYPE(thisx) ((thisx)->params & 0xF)
-#define EN_S_GORO_SCENEFLAG_INDEX(thisx) (((thisx)->params & 0x7F0) >> 4)
+#define EN_S_GORO_GET_SWITCH_FLAG(thisx) (((thisx)->params & 0x7F0) >> 4)
struct EnSGoro;
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 868b48923..08b1ad240 100644
--- a/src/overlays/actors/ovl_En_Sb/z_en_sb.c
+++ b/src/overlays/actors/ovl_En_Sb/z_en_sb.c
@@ -7,7 +7,7 @@
#include "z_en_sb.h"
#include "objects/object_sb/object_sb.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY)
#define THIS ((EnSb*)thisx)
@@ -93,7 +93,7 @@ static DamageTable sDamageTable = {
static InitChainEntry sInitChain[] = {
ICHAIN_S8(hintId, TATL_HINT_ID_SHELLBLADE, ICHAIN_CONTINUE),
- ICHAIN_U8(targetMode, 2, ICHAIN_CONTINUE),
+ ICHAIN_U8(targetMode, TARGET_MODE_2, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 30, ICHAIN_STOP),
};
@@ -118,7 +118,7 @@ void EnSb_Init(Actor* thisx, PlayState* play) {
this->isDead = false;
this->actor.colChkInfo.mass = 90;
this->actor.shape.rot.y = 0;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.gravity = -0.35f;
this->fireCount = 0;
this->unk_252 = 0;
@@ -155,7 +155,7 @@ void EnSb_SetupOpen(EnSb* this) {
ANIMMODE_ONCE, 0.0f);
this->state = SHELLBLADE_OPEN;
this->actionFunc = EnSb_Open;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KUSAMUSHI_VIBE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KUSAMUSHI_VIBE);
}
void EnSb_SetupWaitOpen(EnSb* this) {
@@ -172,7 +172,7 @@ void EnSb_SetupLunge(EnSb* this) {
Animation_Change(&this->skelAnime, &object_sb_Anim_000124, playbackSpeed, 0.0f, frameCount, ANIMMODE_ONCE, 0);
this->state = SHELLBLADE_LUNGE;
this->actionFunc = EnSb_Lunge;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KUSAMUSHI_VIBE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KUSAMUSHI_VIBE);
}
void EnSb_SetupBounce(EnSb* this) {
@@ -191,12 +191,12 @@ void EnSb_SetupIdle(EnSb* this, s32 changeSpeed) {
this->state = SHELLBLADE_WAIT_CLOSED;
if (changeSpeed) {
if (this->actor.depthInWater > 0.0f) {
- this->actor.speedXZ = -5.0f;
+ this->actor.speed = -5.0f;
if (this->actor.velocity.y < 0.0f) {
this->actor.velocity.y = 2.1f;
}
} else {
- this->actor.speedXZ = -6.0f;
+ this->actor.speed = -6.0f;
if (this->actor.velocity.y < 0.0f) {
this->actor.velocity.y = 1.4f;
}
@@ -253,11 +253,11 @@ void EnSb_TurnAround(EnSb* this, PlayState* play) {
this->actor.world.rot.y = this->yawAngle;
if (this->actor.depthInWater > 0.0f) {
this->actor.velocity.y = 3.0f;
- this->actor.speedXZ = 5.0f;
+ this->actor.speed = 5.0f;
this->actor.gravity = -0.35f;
} else {
this->actor.velocity.y = 2.0f;
- this->actor.speedXZ = 6.0f;
+ this->actor.speed = 6.0f;
this->actor.gravity = -2.0f;
}
EnSb_SpawnBubbles(play, this);
@@ -267,12 +267,12 @@ void EnSb_TurnAround(EnSb* this, PlayState* play) {
}
void EnSb_Lunge(EnSb* this, PlayState* play) {
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.2f);
- if (this->actor.velocity.y <= -0.1f || this->actor.bgCheckFlags & 2) {
+ Math_StepToF(&this->actor.speed, 0.0f, 0.2f);
+ if ((this->actor.velocity.y <= -0.1f) || (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH)) {
if (!(this->actor.depthInWater > 0.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EYEGOLE_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_ATTACK);
}
- this->actor.bgCheckFlags &= ~2;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND_TOUCH;
EnSb_SetupBounce(this);
}
}
@@ -282,25 +282,25 @@ void EnSb_Bounce(EnSb* this, PlayState* play) {
f32 currentFrame = currentFrame = this->skelAnime.curFrame;
f32 frameCount = frameCount = Animation_GetLastFrame(&object_sb_Anim_0000B4);
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.2f);
+ Math_StepToF(&this->actor.speed, 0.0f, 0.2f);
if (currentFrame == frameCount) {
if (this->bounceCounter != 0) {
this->bounceCounter--;
this->attackTimer = 1;
if (this->actor.depthInWater > 0.0f) {
this->actor.velocity.y = 3.0f;
- this->actor.speedXZ = 5.0f;
+ this->actor.speed = 5.0f;
this->actor.gravity = -0.35f;
} else {
this->actor.velocity.y = 2.0f;
- this->actor.speedXZ = 6.0f;
+ this->actor.speed = 6.0f;
this->actor.gravity = -2.0f;
}
EnSb_SpawnBubbles(play, this);
EnSb_SetupLunge(this);
- } else if (this->actor.bgCheckFlags & 1) {
- this->actor.bgCheckFlags &= ~2;
- this->actor.speedXZ = 0.0f;
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND_TOUCH;
+ this->actor.speed = 0.0f;
this->attackTimer = 1;
EnSb_SetupWaitClosed(this);
}
@@ -310,14 +310,14 @@ void EnSb_Bounce(EnSb* this, PlayState* play) {
void EnSb_ReturnToIdle(EnSb* this, PlayState* play) {
if (this->attackTimer != 0) {
this->attackTimer--;
- if (this->actor.bgCheckFlags & 1) {
- this->actor.bgCheckFlags &= ~1;
- this->actor.speedXZ = 0.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
+ this->actor.speed = 0.0f;
}
- } else if (this->actor.bgCheckFlags & 1) {
- this->actor.bgCheckFlags &= ~1;
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
this->actionFunc = EnSb_Idle;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
}
@@ -331,13 +331,13 @@ void EnSb_UpdateDamage(EnSb* this, PlayState* play) {
hitPlayer = 0;
if (this->vulnerableTimer != 0) {
Actor_ApplyDamage(&this->actor);
- Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, 0x2000, 80);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_XLU, 80);
hitPlayer = 1;
}
}
if (hitPlayer) {
this->unk_252 = 0;
- if ((this->actor.draw != NULL) && (this->isDrawn == false)) {
+ if ((this->actor.draw != NULL) && !this->isDrawn) {
this->isDrawn = true;
}
this->isDead = true;
@@ -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 fa017af87..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) {
@@ -116,7 +116,7 @@ void func_80BD6A8C(EnScRuppe* this, PlayState* play) {
if (this->collider.base.ocFlags1 & OC1_HIT) {
this->ruppeDisplayTime = 0;
this->actor.gravity = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_GET_RUPY);
+ Actor_PlaySfx(&this->actor, NA_SE_SY_GET_RUPY);
Rupees_ChangeBy(sRupeeInfo[this->ruppeIndex].amount);
this->actionFunc = func_80BD6B18;
}
@@ -156,7 +156,7 @@ void EnScRuppe_Init(Actor* thisx, PlayState* play) {
if ((this->ruppeIndex < RUPEE_GREEN) || (this->ruppeIndex >= RUPEE_UNUSED)) {
this->ruppeIndex = RUPEE_GREEN;
}
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = func_80BD6A8C;
this->actor.gravity = -0.5f;
this->actor.shape.yOffset = 700.0f;
@@ -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 b37190ee1..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.unk20, 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;
@@ -236,7 +236,7 @@ void func_80BCD640(EnScopecrow* this, PlayState* play) {
if (this->path != NULL) {
func_80BCD4D0(this->path, this->unk_1FC, &this->actor.world.pos, &sp30);
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
sp30.y = this->actor.wallYaw;
}
@@ -257,7 +257,7 @@ void func_80BCD640(EnScopecrow* this, PlayState* play) {
}
}
- Math_ApproachF(&this->actor.speedXZ, 6.0f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 6.0f, 0.2f, 1.0f);
Actor_MoveWithoutGravity(&this->actor);
this->unk_264 += 0x1000;
this->actor.shape.yOffset = Math_SinS(this->unk_264) * 500.0f;
@@ -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 4f8207046..a280a94c6 100644
--- a/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.c
+++ b/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.c
@@ -8,7 +8,7 @@
#include "objects/gameplay_keep/gameplay_keep.h"
#include "objects/object_dnt/object_dnt.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((EnScopenuts*)thisx)
@@ -65,29 +65,29 @@ static ColliderCylinderInitType1 sCylinderInit = {
};
static AnimationInfoS sAnimationInfo[] = {
- { &object_dnt_Anim_005488, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_00B0B4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_004AA0, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_004E38, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_0029E8, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_005CA8, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_0038CC, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_003CC0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_0012F4, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_004700, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_001BC8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_003438, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_001E2C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_000994, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_002268, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_002F08, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_00577C, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_dnt_Anim_0029E8, 1.0f, 8, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_0029E8, 1.0f, 4, -1, ANIMMODE_ONCE, -4 },
- { &object_dnt_Anim_0029E8, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_001BC8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_0012F4, -1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_002670, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gBusinessScrubStandingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gBusinessScrubWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gBusinessScrubRiseUpAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gBusinessScrubJumpAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gBusinessScrubBurrowAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gBusinessScrubExcitedStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gBusinessScrubExcitedLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gBusinessScrubExcitedEndAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gBusinessScrubTakeOffHatAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gBusinessScrubFlyStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gBusinessScrubFlyLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gBusinessScrubShockedStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gBusinessScrubShockedShakeHeadAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gBusinessScrubShockedPoundAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gBusinessScrubShockedEndAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gBusinessScrubThinkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gBusinessScrubBobAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
+ { &gBusinessScrubBurrowAnim, 1.0f, 8, -1, ANIMMODE_ONCE, 0 },
+ { &gBusinessScrubBurrowAnim, 1.0f, 4, -1, ANIMMODE_ONCE, -4 },
+ { &gBusinessScrubBurrowAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gBusinessScrubFlyLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gBusinessScrubTakeOffHatAnim, -1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gBusinessScrubFlyEndAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
};
Gfx* D_80BCCCDC[] = { gKakeraLeafMiddle, gKakeraLeafTip };
@@ -95,7 +95,7 @@ Gfx* D_80BCCCDC[] = { gKakeraLeafMiddle, gKakeraLeafTip };
Vec3f D_80BCCCE4 = { 0.0f, -0.5f, 0.0f };
static InitChainEntry sInitChain[] = {
- ICHAIN_U8(targetMode, 0, ICHAIN_CONTINUE),
+ ICHAIN_U8(targetMode, TARGET_MODE_0, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 30, ICHAIN_STOP),
};
@@ -126,19 +126,19 @@ void func_80BCAC40(EnScopenuts* this, PlayState* play) {
}
void func_80BCAD64(EnScopenuts* this, s16 arg1) {
- f32 sp24 = Math_CosS(this->actor.world.rot.x) * this->actor.speedXZ;
+ f32 sp24 = Math_CosS(this->actor.world.rot.x) * this->actor.speed;
switch (arg1) {
case 1:
- this->actor.velocity.y = this->actor.speedXZ;
+ this->actor.velocity.y = this->actor.speed;
this->actor.velocity.x = 0.0f;
this->actor.velocity.z = 0.0f;
break;
case 2:
- this->actor.velocity.x = Math_SinS(this->actor.world.rot.y) * this->actor.speedXZ;
+ this->actor.velocity.x = Math_SinS(this->actor.world.rot.y) * this->actor.speed;
this->actor.velocity.y = 0.0f;
- this->actor.velocity.z = Math_CosS(this->actor.world.rot.y) * this->actor.speedXZ;
+ this->actor.velocity.z = Math_CosS(this->actor.world.rot.y) * this->actor.speed;
break;
case 3:
@@ -149,7 +149,7 @@ void func_80BCAD64(EnScopenuts* this, s16 arg1) {
default:
this->actor.velocity.x = Math_SinS(this->actor.world.rot.y) * sp24;
- this->actor.velocity.y = Math_SinS(this->actor.world.rot.x) * this->actor.speedXZ;
+ this->actor.velocity.y = Math_SinS(this->actor.world.rot.x) * this->actor.speed;
this->actor.velocity.z = Math_CosS(this->actor.world.rot.y) * sp24;
break;
}
@@ -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);
}
}
@@ -208,7 +208,7 @@ void func_80BCB078(EnScopenuts* this, PlayState* play) {
if (this->path != NULL) {
func_80BCC448(this->path, this->unk_334, &this->actor.world.pos, &sp30);
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
sp30.y = this->actor.wallYaw;
}
Math_SmoothStepToS(&this->actor.world.rot.y, sp30.y, 10, 300, 0);
@@ -219,7 +219,7 @@ void func_80BCB078(EnScopenuts* this, PlayState* play) {
if (func_80BCC2AC(this, this->path, this->unk_334)) {
if (this->unk_334 >= (this->path->count - 1)) {
this->actionFunc = func_80BCB1C8;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.gravity = -1.0f;
return;
}
@@ -228,9 +228,9 @@ void func_80BCB078(EnScopenuts* this, PlayState* play) {
}
if (this->unk_334 >= (this->path->count - 2)) {
- Math_ApproachF(&this->actor.speedXZ, 1.5f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 1.5f, 0.2f, 1.0f);
} else {
- Math_ApproachF(&this->actor.speedXZ, 5.0f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 5.0f, 0.2f, 1.0f);
}
Actor_MoveWithoutGravity(&this->actor);
}
@@ -238,7 +238,7 @@ void func_80BCB078(EnScopenuts* this, PlayState* play) {
void func_80BCB1C8(EnScopenuts* this, PlayState* play) {
this->unk_350 *= 0.92f;
Actor_SetScale(&this->actor, this->unk_350);
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
SET_WEEKEVENTREG(WEEKEVENTREG_52_40);
Actor_Kill(&this->actor);
}
@@ -252,7 +252,7 @@ void func_80BCB230(EnScopenuts* this, PlayState* play) {
if ((((this->actor.playerHeightRel < 50.0f) && (this->actor.playerHeightRel > -50.0f)) ? true : false) &&
((this->actor.xzDistToPlayer < 200.0f) ? true : false)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
this->actionFunc = func_80BCB4DC;
this->unk_348 = 3;
this->collider.dim.height = 64;
@@ -262,12 +262,12 @@ void func_80BCB230(EnScopenuts* this, PlayState* play) {
if ((this->unk_348 == 4) || (this->unk_348 == 18)) {
this->unk_348 = 17;
this->collider.dim.height = 0;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_DOWN);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_DOWN);
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 17);
} else if (this->unk_348 == 2) {
this->unk_348 = 16;
this->collider.dim.height = 32;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_UP);
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 16);
} else if (this->unk_348 == 17) {
if (DECR(this->unk_34E) == 0) {
@@ -301,8 +301,8 @@ void func_80BCB52C(EnScopenuts* this, PlayState* play) {
this->actionFunc = func_80BCB6D0;
} else if (((this->actor.xzDistToPlayer < 100.0f) &&
(((this->actor.playerHeightRel < 50.0f) && (this->actor.playerHeightRel > -50.0f)) ? true : false)) ||
- this->actor.isTargeted) {
- func_800B8614(&this->actor, play, 100.0f);
+ this->actor.isLockedOn) {
+ Actor_OfferTalk(&this->actor, play, 100.0f);
} else if (!(((this->actor.playerHeightRel < 50.0f) && (this->actor.playerHeightRel > -50.0f)) ? true : false) ||
!((this->actor.xzDistToPlayer < 200.0f) ? true : false)) {
this->unk_348 = 4;
@@ -318,9 +318,9 @@ void func_80BCB6D0(EnScopenuts* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
if (this->unk_328 & 1) {
this->unk_328 &= ~1;
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->unk_328 &= ~4;
this->unk_348 = 8;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 8);
@@ -334,21 +334,21 @@ 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) {
- play_sound(NA_SE_SY_ERROR);
+ if (gSaveContext.save.saveInfo.playerData.rupees < this->unk_358) {
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_33C = 0x1636;
this->unk_328 |= 1;
Message_StartTextbox(play, this->unk_33C, &this->actor);
} else {
- func_8019F208();
- play->msgCtx.msgMode = 0x43;
+ Audio_PlaySfx_MessageDecide();
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
Rupees_ChangeBy(-this->unk_358);
this->actionFunc = func_80BCB90C;
}
break;
case 1:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
if (this->unk_358 == 150) {
this->unk_33C = 0x1633;
} else {
@@ -360,7 +360,7 @@ void func_80BCB6D0(EnScopenuts* this, PlayState* play) {
}
}
} else if (talkState == TEXT_STATE_DONE) {
- func_800B85E0(&this->actor, play, 400.0f, -1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
this->actionFunc = func_80BCB980;
}
}
@@ -371,7 +371,7 @@ void func_80BCB90C(EnScopenuts* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_53_02);
this->actionFunc = func_80BCB6D0;
} else {
- Actor_PickUp(&this->actor, play, GI_HEART_PIECE, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_HEART_PIECE, 300.0f, 300.0f);
}
}
@@ -382,7 +382,7 @@ void func_80BCB980(EnScopenuts* this, PlayState* play) {
Message_StartTextbox(play, this->unk_33C, &this->actor);
this->actionFunc = func_80BCB6D0;
} else {
- func_800B85E0(&this->actor, play, 400.0f, -1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
}
}
@@ -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;
}
}
@@ -464,7 +464,7 @@ void func_80BCBA00(EnScopenuts* this, PlayState* play) {
this->unk_35A = 3;
this->unk_348 = 19;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 19);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_DOWN);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_DOWN);
this->unk_328 &= ~2;
this->unk_34E = 50;
this->unk_328 |= 8;
@@ -528,7 +528,7 @@ void func_80BCBD28(EnScopenuts* this, PlayState* play) {
this->unk_368 = 0.3f;
this->unk_348 = 9;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 9);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
func_80BCAC40(this, play);
this->actionFunc = func_80BCBF0C;
}
@@ -564,7 +564,7 @@ void func_80BCBFFC(EnScopenuts* this, PlayState* play) {
if (this->path != NULL) {
sp34 = func_80BCC448(this->path, this->unk_334, &this->actor.world.pos, &sp38);
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
sp38.y = this->actor.wallYaw;
}
@@ -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,25 +601,25 @@ 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;
}
- Math_ApproachF(&this->actor.speedXZ, 1.0f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 1.0f, 0.2f, 1.0f);
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,13 +684,14 @@ 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_OF_TIME] == ITEM_NONE)) {
Actor_Kill(&this->actor);
return;
}
Actor_ProcessInitChain(&this->actor, sInitChain);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_dnt_Skel_00AC70, &object_dnt_Anim_005488, this->jointTable,
+ SkelAnime_InitFlex(play, &this->skelAnime, &gBusinessScrubSkel, &gBusinessScrubStandingAnim, this->jointTable,
this->morphTable, 28);
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinderType1(play, &this->collider, &this->actor, &sCylinderInit);
@@ -701,13 +702,14 @@ void EnScopenuts_Init(Actor* thisx, PlayState* play) {
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
this->unk_328 |= 2;
this->unk_328 |= 4;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (ENSCOPENUTS_GET_3E0(&this->actor) == ENSCOPENUTS_3E0_0) {
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;
@@ -754,7 +757,7 @@ void EnScopenuts_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
if (this->unk_328 & 8) {
- func_800B9010(&this->actor, NA_SE_EN_AKINDO_FLY - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_AKINDO_FLY - SFX_FLAG);
}
func_80BCAE78(this, play);
}
@@ -791,9 +794,9 @@ s32 EnScopenuts_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Ve
if (limbIndex == 26) {
if ((this->unk_33C == 0x162F) || (this->unk_33C == 0x1630)) {
- *dList = object_dnt_DL_001420;
+ *dList = gBusinessScrubEyesSquintDL;
} else {
- *dList = object_dnt_DL_008290;
+ *dList = gBusinessScrubEyesDL;
}
}
@@ -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..9334d2d29 100644
--- a/src/overlays/actors/ovl_En_Sda/z_en_sda.c
+++ b/src/overlays/actors/ovl_En_Sda/z_en_sda.c
@@ -68,7 +68,7 @@ Vec3f D_80947B10[] = {
{ -1.0f, -2.0f, -0.2f }, { 0.0f, -2.0f, -0.2f }, { 1.0f, -2.0f, -0.2f }, { 0.0f, -3.0f, -0.5f },
};
-static s32 sPad[2] = { 0, 0 };
+static s32 sPad = 0;
#include "overlays/ovl_En_Sda/ovl_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 88fab3298..92b88e462 100644
--- a/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.c
+++ b/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.c
@@ -11,7 +11,7 @@
#include "objects/object_sekihiz/object_sekihiz.h"
#include "objects/object_zog/object_zog.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnSekihi*)thisx)
@@ -39,38 +39,44 @@ ActorInit En_Sekihi_InitVars = {
static s16 sObjectIds[] = { OBJECT_SEKIHIL, OBJECT_SEKIHIG, OBJECT_SEKIHIN, OBJECT_SEKIHIZ, OBJECT_ZOG };
static Gfx* sOpaDLists[] = {
- gGraveTriforceSymbolDL, gGraveGoronSymbolDL, gGraveKokiriSymbolDL, gTombSongOfSoaringDL, gMikauGraveDL,
+ gSunsSongGraveTriforceDL, gSunsSongGraveGoronDL, gSunsSongGraveKokiriDL, gSongOfSoaringPedestalDL, gMikauGraveDL,
};
static Gfx* sXluDLists[] = {
- gSunSongTriforceSymbolDL, gSunSongGoronSymbolDL, gSunSongKokiriSymbolDL, gSekihizEmptyDL, gMikauGraveDirtDL,
+ gSunsSongGraveTriforceSymbolsDL,
+ gSunsSongGraveGoronSymbolsDL,
+ gSunsSongGraveKokiriSymbolsDL,
+ gSongOfSoaringPedestalEmptyDL,
+ gMikauGraveDirtDL,
};
static u16 sTextIds[] = { 0, 0, 0, 0, 0x1018 };
void EnSekihi_Init(Actor* thisx, PlayState* play) {
EnSekihi* this = THIS;
- s32 params = ENSIKIHI_GET_TYPE(thisx);
+ s32 type = ENSIKIHI_GET_TYPE(thisx);
s32 objectIndex;
s32 pad;
- if ((params < SEKIHI_TYPE_0 || params >= SEKIHI_TYPE_MAX) || sOpaDLists[params] == NULL) {
+ if (((type < SEKIHI_TYPE_0) || (type >= SEKIHI_TYPE_MAX)) || (sOpaDLists[type] == NULL)) {
Actor_Kill(&this->dyna.actor);
return;
}
- if ((params == SEKIHI_TYPE_4) && (((gSaveContext.save.skullTokenCount & 0xFFFF)) >= 30)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_13_20);
+ if ((type == 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);
}
- objectIndex = Object_GetIndex(&play->objectCtx, sObjectIds[params]);
+ objectIndex = Object_GetSlot(&play->objectCtx, sObjectIds[type]);
if (objectIndex >= 0) {
this->objectIndex = objectIndex;
}
this->actionFunc = func_80A44DE8;
- this->opaDList = sOpaDLists[params];
- this->xluDList = sXluDLists[params];
- this->dyna.actor.textId = sTextIds[params];
+ this->opaDList = sOpaDLists[type];
+ this->xluDList = sXluDLists[type];
+ this->dyna.actor.textId = sTextIds[type];
this->dyna.actor.focus.pos.y = this->dyna.actor.world.pos.y + 60.0f;
Actor_SetScale(&this->dyna.actor, 0.1f);
}
@@ -83,16 +89,17 @@ void EnSekihi_Destroy(Actor* thisx, PlayState* play) {
void func_80A44DE8(EnSekihi* this, PlayState* play) {
CollisionHeader* colHeader = NULL;
- s32 params;
+ s32 type;
CollisionHeader* colHeaders[] = {
- &gSekihilCol, &gSekihigCol, &gSekihinCol, &gSekihizCol, &gObjectZogCol,
+ &gSunsSongGraveTriforceCol, &gSunsSongGraveGoronCol, &gSunsSongGraveKokiriCol,
+ &gSongOfSoaringPedestalCol, &gMikauGraveCol,
};
- params = ENSIKIHI_GET_TYPE(&this->dyna.actor);
+ type = ENSIKIHI_GET_TYPE(&this->dyna.actor);
if (Object_IsLoaded(&play->objectCtx, this->objectIndex)) {
this->dyna.actor.objBankIndex = this->objectIndex;
this->dyna.actor.draw = EnSekihi_Draw;
- if (params == SEKIHI_TYPE_4) {
+ if (type == SEKIHI_TYPE_4) {
this->actionFunc = func_80A450B0;
} else {
this->actionFunc = EnSekihi_DoNothing;
@@ -100,12 +107,12 @@ void func_80A44DE8(EnSekihi* this, PlayState* play) {
Actor_SetObjectDependency(play, &this->dyna.actor);
DynaPolyActor_Init(&this->dyna, 0);
- if (colHeaders[params] != NULL) {
- CollisionHeader_GetVirtual(colHeaders[params], &colHeader);
+ if (colHeaders[type] != NULL) {
+ CollisionHeader_GetVirtual(colHeaders[type], &colHeader);
}
this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &this->dyna.actor, colHeader);
- if ((params == SEKIHI_TYPE_4) && (INV_CONTENT(ITEM_MASK_ZORA) != ITEM_MASK_ZORA)) {
+ if ((type == SEKIHI_TYPE_4) && (INV_CONTENT(ITEM_MASK_ZORA) != ITEM_MASK_ZORA)) {
Actor_Kill(&this->dyna.actor);
}
}
@@ -117,16 +124,16 @@ void func_80A44F40(EnSekihi* this, PlayState* play) {
if (Message_ShouldAdvance(play) && (play->msgCtx.currentTextId == 0x1019)) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
- func_80151938(play, 0x101A);
+ Audio_PlaySfx_MessageDecide();
+ Message_ContinueTextbox(play, 0x101A);
break;
case 1:
- func_8019F208();
- func_80151938(play, 0x101B);
+ Audio_PlaySfx_MessageDecide();
+ Message_ContinueTextbox(play, 0x101B);
break;
case 2:
- func_8019F230();
- func_801477B4(play);
+ Audio_PlaySfx_MessageCancel();
+ Message_CloseTextbox(play);
this->actionFunc = func_80A450B0;
break;
}
@@ -138,11 +145,11 @@ void func_80A44F40(EnSekihi* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
switch (play->msgCtx.currentTextId) {
case 0x1018:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x101A:
case 0x101B:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80A450B0;
break;
}
@@ -155,7 +162,7 @@ void func_80A450B0(EnSekihi* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->dyna.actor, &play->state)) {
this->actionFunc = func_80A44F40;
} else if ((this->dyna.actor.xzDistToPlayer < 100.0f) && (Player_IsFacingActor(&this->dyna.actor, 0x2600, play))) {
- func_800B8614(&this->dyna.actor, play, 120.0f);
+ Actor_OfferTalk(&this->dyna.actor, play, 120.0f);
}
}
@@ -175,12 +182,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_Sekihi/z_en_sekihi.h b/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.h
index fb4ad7e60..0c26dab71 100644
--- a/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.h
+++ b/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.h
@@ -2,6 +2,8 @@
#define Z_EN_SEKIHI_H
#include "global.h"
+#include "overlays/actors/ovl_En_Si/z_en_si.h"
+
#define ENSIKIHI_GET_TYPE(thisx) ((thisx)->params & 0xF)
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 b16153a53..597c2c392 100644
--- a/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.c
+++ b/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.c
@@ -7,7 +7,7 @@
#include "z_en_sellnuts.h"
#include "objects/object_dnt/object_dnt.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((EnSellnuts*)thisx)
@@ -81,33 +81,33 @@ static ColliderCylinderInitType1 sCylinderInit = {
};
static AnimationInfoS sAnimationInfo[] = {
- { &object_dnt_Anim_005488, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_00B0B4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_004AA0, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_004E38, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_0029E8, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_005CA8, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_0038CC, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_003CC0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_0012F4, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_004700, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_001BC8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_003438, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_001E2C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_000994, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_002268, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_002F08, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_00577C, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_dnt_Anim_0029E8, 1.0f, 8, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_0029E8, 1.0f, 4, -1, ANIMMODE_ONCE, -4 },
- { &object_dnt_Anim_0029E8, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_001BC8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_dnt_Anim_0012F4, -1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_dnt_Anim_002670, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gBusinessScrubStandingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gBusinessScrubWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gBusinessScrubRiseUpAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gBusinessScrubJumpAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gBusinessScrubBurrowAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gBusinessScrubExcitedStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gBusinessScrubExcitedLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gBusinessScrubExcitedEndAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gBusinessScrubTakeOffHatAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gBusinessScrubFlyStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gBusinessScrubFlyLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gBusinessScrubShockedStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gBusinessScrubShockedShakeHeadAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gBusinessScrubShockedPoundAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gBusinessScrubShockedEndAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gBusinessScrubThinkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gBusinessScrubBobAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
+ { &gBusinessScrubBurrowAnim, 1.0f, 8, -1, ANIMMODE_ONCE, 0 },
+ { &gBusinessScrubBurrowAnim, 1.0f, 4, -1, ANIMMODE_ONCE, -4 },
+ { &gBusinessScrubBurrowAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gBusinessScrubFlyLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gBusinessScrubTakeOffHatAnim, -1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gBusinessScrubFlyEndAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
};
static InitChainEntry sInitChain[] = {
- ICHAIN_U8(targetMode, 0, ICHAIN_CONTINUE),
+ ICHAIN_U8(targetMode, TARGET_MODE_0, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 30, ICHAIN_STOP),
};
@@ -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);
}
}
@@ -294,7 +294,7 @@ void func_80ADB254(EnSellnuts* this, PlayState* play) {
Math_ApproachS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 2, 0xE38);
if (((this->actor.playerHeightRel < 50.0f) && (this->actor.playerHeightRel > -50.0f) ? true : false) &&
((this->actor.xzDistToPlayer < 200.0f) ? true : false)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
this->actionFunc = func_80ADB4F4;
this->unk_34C = 3;
this->collider.dim.height = 64;
@@ -303,12 +303,12 @@ void func_80ADB254(EnSellnuts* this, PlayState* play) {
if ((this->unk_34C == 4) || (this->unk_34C == 18)) {
this->unk_34C = 17;
this->collider.dim.height = 0;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_DOWN);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_DOWN);
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 17);
} else if (this->unk_34C == 2) {
this->unk_34C = 16;
this->collider.dim.height = 32;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_UP);
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 16);
} else if (this->unk_34C == 17) {
if (DECR(this->unk_34E) == 0) {
@@ -341,7 +341,7 @@ void func_80ADB544(EnSellnuts* this, PlayState* play) {
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 3, 0x7D0, 0);
this->actor.world.rot.y = this->actor.shape.rot.y;
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- if (Player_GetExchangeItemId(play) == PLAYER_IA_MOON_TEAR) {
+ if (Player_GetExchangeItemAction(play) == PLAYER_IA_MOONS_TEAR) {
player->actor.textId = D_80ADD928[this->unk_33A];
this->unk_340 = player->actor.textId;
this->actionFunc = func_80ADBAB8;
@@ -381,8 +381,8 @@ void func_80ADB544(EnSellnuts* this, PlayState* play) {
}
} else if (((this->actor.xzDistToPlayer < 80.0f) &&
(((this->actor.playerHeightRel < 50.0f) && (this->actor.playerHeightRel > -50.0f)) ? true : false)) ||
- this->actor.isTargeted) {
- func_800B85E0(&this->actor, play, 80.0f, PLAYER_IA_MOON_TEAR);
+ this->actor.isLockedOn) {
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 80.0f, PLAYER_IA_MOONS_TEAR);
if (player->transformation == PLAYER_FORM_DEKU) {
if (gSaveContext.save.day == 3) {
this->unk_33A = 2;
@@ -423,30 +423,30 @@ void func_80ADB924(EnSellnuts* this, PlayState* play) {
itemAction = func_80123810(play);
if (itemAction > PLAYER_IA_NONE) {
- if (itemAction == PLAYER_IA_MOON_TEAR) {
+ if (itemAction == PLAYER_IA_MOONS_TEAR) {
player->actor.textId = D_80ADD928[this->unk_33A];
this->unk_340 = player->actor.textId;
- player->exchangeItemId = itemAction;
+ player->exchangeItemAction = itemAction;
this->actionFunc = func_80ADBAB8;
} else {
player->actor.textId = D_80ADD920[this->unk_33A];
this->unk_340 = player->actor.textId;
this->actionFunc = func_80ADB0D8;
}
- func_801477B4(play);
+ Message_CloseTextbox(play);
} else if (itemAction <= PLAYER_IA_MINUS1) {
this->unk_340 = D_80ADD920[this->unk_33A];
- func_80151938(play, this->unk_340);
+ Message_ContinueTextbox(play, this->unk_340);
this->actionFunc = func_80ADB0D8;
}
} else if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
if (this->unk_340 == D_80ADD910[this->unk_33A]) {
this->unk_340 = D_80ADD938[this->unk_33A];
- func_80151938(play, this->unk_340);
+ Message_ContinueTextbox(play, this->unk_340);
this->actionFunc = func_80ADB0D8;
} else {
this->unk_340 = 0xFF;
- func_80151938(play, this->unk_340);
+ Message_ContinueTextbox(play, this->unk_340);
this->actionFunc = func_80ADB0D8;
}
}
@@ -470,7 +470,7 @@ void func_80ADBAB8(EnSellnuts* this, PlayState* play) {
}
if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->actionFunc = func_80ADBBEC;
func_800B7298(play, NULL, PLAYER_CSMODE_19);
@@ -483,7 +483,7 @@ void func_80ADBBEC(EnSellnuts* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_17_80);
this->actionFunc = func_80ADBCE4;
} else {
- Actor_PickUp(&this->actor, play, GI_DEED_LAND, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_DEED_LAND, 300.0f, 300.0f);
}
}
@@ -492,14 +492,14 @@ void func_80ADBC60(EnSellnuts* this, PlayState* play) {
Message_StartTextbox(play, this->unk_340, &this->actor);
this->actionFunc = func_80ADB0D8;
} else {
- func_800B85E0(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
this->unk_340 = D_80ADD930[this->unk_33A];
}
}
void func_80ADBCE4(EnSellnuts* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(play)) {
- func_800B85E0(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
this->unk_340 = D_80ADD930[this->unk_33A];
this->actionFunc = func_80ADBC60;
}
@@ -516,10 +516,10 @@ void func_80ADBD64(EnSellnuts* this, PlayState* play) {
}
if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->unk_338 &= ~2;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->unk_34C = 8;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 8);
this->actionFunc = func_80ADBE80;
@@ -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;
}
}
@@ -548,7 +548,7 @@ void func_80ADBE80(EnSellnuts* this, PlayState* play) {
this->unk_350 = 4;
this->unk_34C = 19;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 19);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_DOWN);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_DOWN);
this->unk_338 &= ~1;
this->unk_338 |= 8;
this->unk_32C = this->actor.world.pos.y;
@@ -558,7 +558,7 @@ void func_80ADBE80(EnSellnuts* this, PlayState* play) {
void func_80ADBFA0(EnSellnuts* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
if (this->unk_34C == 0) {
this->actionFunc = func_80ADB544;
@@ -617,7 +617,7 @@ void func_80ADC118(EnSellnuts* this, PlayState* play) {
this->unk_34C = 9;
this->unk_360 = 0.3f;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 9);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
this->actionFunc = func_80ADC034;
}
}
@@ -649,7 +649,7 @@ void func_80ADC37C(EnSellnuts* this, PlayState* play) {
this->actor.gravity = 0.0f;
if (this->path != NULL) {
sp2C = func_80ADCFE8(this->path, this->unk_334, &this->actor.world.pos, &sp30);
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
sp30.y = this->actor.wallYaw;
}
Math_SmoothStepToS(&this->actor.world.rot.y, sp30.y, 0xA, 0x12C, 0);
@@ -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.speedXZ, 2.0f, 0.2f, 1.0f);
+ 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;
}
@@ -713,7 +713,7 @@ void func_80ADC5A4(EnSellnuts* this, PlayState* play) {
}
} else if (func_80ADB08C(play) < 80.0f) {
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8614(&this->actor, play, this->actor.xzDistToPlayer);
+ Actor_OfferTalk(&this->actor, play, this->actor.xzDistToPlayer);
}
}
@@ -721,7 +721,7 @@ void func_80ADC6D0(EnSellnuts* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
if (player->transformation == PLAYER_FORM_DEKU) {
if (gSaveContext.save.day == 3) {
@@ -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.msgMode = MSGMODE_TEXT_CLOSING;
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,21 +766,21 @@ 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;
}
}
if (this->path != NULL) {
func_80ADCFE8(this->path, this->unk_334, &this->actor.world.pos, &sp30);
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
sp30.y = this->actor.wallYaw;
}
Math_SmoothStepToS(&this->actor.world.rot.y, sp30.y, 0xA, 0x12C, 0);
@@ -793,7 +793,7 @@ void func_80ADC8C4(EnSellnuts* this, PlayState* play) {
this->unk_34C = 22;
this->actor.gravity = -1.0f;
this->actor.velocity.y = -1.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->unk_34C);
this->unk_338 &= ~1;
this->unk_338 &= ~2;
@@ -802,7 +802,7 @@ void func_80ADC8C4(EnSellnuts* this, PlayState* play) {
}
this->unk_334++;
}
- Math_ApproachF(&this->actor.speedXZ, 2.0f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 2.0f, 0.2f, 1.0f);
Actor_MoveWithoutGravity(&this->actor);
}
}
@@ -816,14 +816,14 @@ 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;
this->unk_34C = 19;
this->actor.velocity.y = 0.0f;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->unk_34C);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_DOWN);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_DOWN);
}
return;
}
@@ -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);
}
@@ -860,7 +860,7 @@ void func_80ADCC04(EnSellnuts* this, PlayState* play) {
if (currentFrame == 0) {
if (func_80ADB08C(play) < 9999.0f) {
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8614(&this->actor, play, 9999.0f);
+ Actor_OfferTalk(&this->actor, play, 9999.0f);
}
this->unk_340 = 0x626;
this->unk_34C = 0;
@@ -876,7 +876,7 @@ void func_80ADCD3C(EnSellnuts* this, PlayState* play) {
this->unk_338 |= 2;
this->unk_338 |= 1;
this->unk_340 = 0x626;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actor.gravity = -1.0f;
this->actor.draw = EnSellnuts_Draw;
this->unk_34A = 50;
@@ -884,7 +884,7 @@ void func_80ADCD3C(EnSellnuts* this, PlayState* play) {
this->collider.dim.height = 64;
this->unk_34C = 3;
this->unk_350 = 4;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->unk_34C);
this->actionFunc = func_80ADCC04;
} else if (D_80ADD940 != 0) {
@@ -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;
}
@@ -953,13 +953,13 @@ void EnSellnuts_Init(Actor* thisx, PlayState* play) {
}
Actor_ProcessInitChain(&this->actor, sInitChain);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_dnt_Skel_00AC70, &object_dnt_Anim_005488, this->jointTable,
+ SkelAnime_InitFlex(play, &this->skelAnime, &gBusinessScrubSkel, &gBusinessScrubStandingAnim, this->jointTable,
this->morphTable, 28);
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;
@@ -968,7 +968,7 @@ void EnSellnuts_Init(Actor* thisx, PlayState* play) {
this->unk_374 = 0.01f;
this->unk_370 = 0.01f;
this->unk_36C = 0.01f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.velocity.y = 0.0f;
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_73_04)) {
if (ENSELLNUTS_GET_1(&this->actor)) {
@@ -1003,7 +1003,7 @@ void EnSellnuts_Init(Actor* thisx, PlayState* play) {
this->actor.gravity = 0.0f;
this->actor.draw = NULL;
this->unk_34C = 20;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->unk_35C = 1.0f;
this->unk_358 = 1.0f;
this->unk_354 = 1.0f;
@@ -1013,7 +1013,7 @@ void EnSellnuts_Init(Actor* thisx, PlayState* play) {
} else {
this->unk_338 |= 2;
this->unk_338 &= ~1;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.gravity = 0.0f;
this->actor.draw = NULL;
this->unk_34C = 4;
@@ -1051,7 +1051,7 @@ void EnSellnuts_Update(Actor* thisx, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
this->actionFunc(this, play);
if (this->unk_338 & 8) {
- func_800B9010(&this->actor, NA_SE_EN_AKINDO_FLY - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_AKINDO_FLY - SFX_FLAG);
}
func_80ADADD0(this, play);
}
@@ -1106,9 +1106,9 @@ s32 EnSellnuts_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
if (limbIndex == 26) {
if ((this->unk_34C == 6) || (this->unk_34C == 5) || (this->unk_34C == 7)) {
- *dList = object_dnt_DL_001350;
+ *dList = gBusinessScrubEyesWideDL;
} else {
- *dList = object_dnt_DL_008290;
+ *dList = gBusinessScrubEyesDL;
}
}
@@ -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..158c80087 100644
--- a/src/overlays/actors/ovl_En_Shn/z_en_shn.c
+++ b/src/overlays/actors/ovl_En_Shn/z_en_shn.c
@@ -8,7 +8,7 @@
#include "z_en_shn.h"
#include "z64snap.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnShn*)thisx)
@@ -70,10 +70,10 @@ void func_80AE6130(EnShn* this) {
s32 func_80AE615C(EnShn* this, s32 animIndex) {
static AnimationInfoS sAnimationInfo[] = {
- { &gBurlyGuyHandsOnTableAnim, 1.0f, 0, -1, 0, 0 },
- { &gBurlyGuyHandsOnTableAnim, 1.0f, 0, -1, 0, -4 },
- { &gSwampGuideChinScratchAnim, 1.0f, 0, -1, 0, 0 },
- { &gSwampGuideChinScratchAnim, 1.0f, 0, -1, 0, -4 },
+ { &gBurlyGuyHandsOnTableAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gBurlyGuyHandsOnTableAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
+ { &gBurlyGuyChinScratchAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gBurlyGuyChinScratchAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
};
s32 phi_v0 = 0;
s32 phi_v1 = 0;
@@ -127,7 +127,7 @@ void func_80AE626C(EnShn* this) {
this->unk_2BC = CLAMP(this->unk_2BC, -0x1FFE, 0x1FFE);
Math_Vec3f_Copy(&shnPos, &this->actor.focus.pos);
if (this->shnPlayerRef->actor.id == ACTOR_PLAYER) {
- playerPos.y = this->shnPlayerRef->bodyPartsPos[7].y + 3.0f;
+ playerPos.y = this->shnPlayerRef->bodyPartsPos[PLAYER_BODYPART_HEAD].y + 3.0f;
} else {
Math_Vec3f_Copy(&playerPos, &this->shnPlayerRef->actor.focus.pos);
}
@@ -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;
@@ -290,25 +290,24 @@ s32 func_80AE68F0(EnShn* this, PlayState* play) {
Player* player = GET_PLAYER(play);
s32 ret = false;
- if (this->unk_1D8 & 7) {
- if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- this->unk_1D8 &= ~0x180;
- if (player->exchangeItemId == PLAYER_IA_PICTO_BOX) {
- this->unk_1D8 |= 0x80;
- this->unk_2E4 = player->exchangeItemId;
- } else if (player->exchangeItemId != PLAYER_IA_NONE) {
- this->unk_1D8 |= 0x100;
- this->unk_2E4 = player->exchangeItemId;
- }
- SubS_UpdateFlags(&this->unk_1D8, 0, 7);
- this->unk_1DC = func_80AE6880(this, play);
- this->unk_2C6 = 0;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_23_08)) {
- this->unk_1D8 |= 8;
- }
- this->actionFunc = func_80AE6A64;
- ret = true;
+ if (((this->unk_1D8 & SUBS_OFFER_MODE_MASK) != SUBS_OFFER_MODE_NONE) &&
+ Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ this->unk_1D8 &= ~0x180;
+ if (player->exchangeItemAction == PLAYER_IA_PICTOGRAPH_BOX) {
+ this->unk_1D8 |= 0x80;
+ this->unk_2E4 = player->exchangeItemAction;
+ } else if (player->exchangeItemAction != PLAYER_IA_NONE) {
+ this->unk_1D8 |= 0x100;
+ this->unk_2E4 = player->exchangeItemAction;
}
+ SubS_SetOfferMode(&this->unk_1D8, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
+ this->unk_1DC = func_80AE6880(this, play);
+ this->unk_2C6 = 0;
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_23_08)) {
+ this->unk_1D8 |= 8;
+ }
+ this->actionFunc = func_80AE6A64;
+ ret = true;
}
return ret;
}
@@ -328,7 +327,7 @@ void func_80AE6A64(EnShn* this, PlayState* play) {
Vec3f shnPos;
if (func_8010BF58(&this->actor, play, this->unk_1DC, this->unk_2D8, &this->unk_1E0)) {
- SubS_UpdateFlags(&this->unk_1D8, 3, 7);
+ SubS_SetOfferMode(&this->unk_1D8, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_1D8 &= ~8;
this->unk_1D8 |= 0x20;
this->unk_2CA = 20;
@@ -355,16 +354,16 @@ void EnShn_Init(Actor* thisx, PlayState* play) {
} else {
func_80AE615C(this, 2);
}
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
Actor_SetScale(&this->actor, 0.01f);
this->unk_2E0 = 0;
this->unk_2D8 = 0;
this->unk_1D8 = 0;
if (gSaveContext.save.entrance != ENTRANCE(TOURIST_INFORMATION, 2)) {
- SubS_UpdateFlags(&this->unk_1D8, 3, 7);
+ SubS_SetOfferMode(&this->unk_1D8, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_2BE = 0;
} else {
- SubS_UpdateFlags(&this->unk_1D8, 4, 7);
+ SubS_SetOfferMode(&this->unk_1D8, SUBS_OFFER_MODE_AUTO, SUBS_OFFER_MODE_MASK);
this->unk_2BE = 1;
}
this->actionFunc = func_80AE69E8;
@@ -382,7 +381,7 @@ void EnShn_Update(Actor* thisx, PlayState* play) {
func_80AE6130(this);
func_80AE63A8(this, play);
this->unk_2E0 = 0;
- func_8013C964(&this->actor, play, 120.0f, 40.0f, PLAYER_IA_NONE, this->unk_1D8 & 7);
+ SubS_Offer(&this->actor, play, 120.0f, 40.0f, PLAYER_IA_NONE, this->unk_1D8 & SUBS_OFFER_MODE_MASK);
}
s32 EnShn_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
@@ -436,7 +435,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_Si/z_en_si.c b/src/overlays/actors/ovl_En_Si/z_en_si.c
index 5f7e111a4..b75de6359 100644
--- a/src/overlays/actors/ovl_En_Si/z_en_si.c
+++ b/src/overlays/actors/ovl_En_Si/z_en_si.c
@@ -6,7 +6,7 @@
#include "z_en_si.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_200)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_200)
#define THIS ((EnSi*)thisx)
@@ -15,10 +15,8 @@ void EnSi_Destroy(Actor* thisx, PlayState* play);
void EnSi_Update(Actor* thisx, PlayState* play);
void EnSi_Draw(Actor* thisx, PlayState* play);
-void func_8098CB70(EnSi* this, PlayState* play);
-void func_8098CBDC(EnSi* this, PlayState* play);
+void EnSi_DraggedByHookshot(EnSi* this, PlayState* play);
-#if 0
ActorInit En_Si_InitVars = {
ACTOR_EN_SI,
ACTORCAT_ITEMACTION,
@@ -31,18 +29,29 @@ ActorInit En_Si_InitVars = {
(ActorFunc)EnSi_Draw,
};
-// static ColliderSphereInit sSphereInit = {
-static ColliderSphereInit D_8098CD80 = {
- { COLTYPE_NONE, AT_NONE, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_NO_PUSH | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_SPHERE, },
- { ELEMTYPE_UNK0, { 0xF7CFFFFF, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_NORMAL, BUMP_ON | BUMP_HOOKABLE, OCELEM_ON, },
+static ColliderSphereInit sSphereInit = {
+ {
+ COLTYPE_NONE,
+ AT_NONE,
+ AC_ON | AC_TYPE_PLAYER,
+ OC1_ON | OC1_NO_PUSH | OC1_TYPE_ALL,
+ OC2_TYPE_1,
+ COLSHAPE_SPHERE,
+ },
+ {
+ ELEMTYPE_UNK0,
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_ON | TOUCH_SFX_NORMAL,
+ BUMP_ON | BUMP_HOOKABLE,
+ OCELEM_ON,
+ },
{ 0, { { 0, 0, 0 }, 10 }, 100 },
};
-// sColChkInfoInit
-static CollisionCheckInfoInit2 D_8098CDAC = { 1, 0, 0, 0, MASS_IMMOVABLE };
+static CollisionCheckInfoInit2 sColChkInfoInit = { 1, 0, 0, 0, MASS_IMMOVABLE };
-// static DamageTable sDamageTable = {
-static DamageTable D_8098CDB8 = {
+static DamageTable sDamageTable = {
/* Deku Nut */ DMG_ENTRY(1, 0x0),
/* Deku Stick */ DMG_ENTRY(1, 0x0),
/* Horse trample */ DMG_ENTRY(1, 0x0),
@@ -77,24 +86,79 @@ static DamageTable D_8098CDB8 = {
/* Powder Keg */ DMG_ENTRY(1, 0x0),
};
-#endif
+void EnSi_UpdateCollision(EnSi* this, PlayState* play) {
+ this->collider.dim.worldSphere.center.x = this->actor.world.pos.x;
+ this->collider.dim.worldSphere.center.y = this->actor.world.pos.y;
+ this->collider.dim.worldSphere.center.z = this->actor.world.pos.z;
+ this->collider.dim.worldSphere.radius = this->collider.dim.modelSphere.radius * this->collider.dim.scale;
+ if (this->actor.colChkInfo.health > 0) {
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
+ }
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
+}
-extern ColliderSphereInit D_8098CD80;
-extern CollisionCheckInfoInit2 D_8098CDAC;
-extern DamageTable D_8098CDB8;
+void EnSi_GiveToken(EnSi* this, PlayState* play) {
+ s32 chestFlag = ENSI_GET_CHEST_FLAG(&this->actor);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Si/func_8098CA20.s")
+ if ((chestFlag < 0x20) && (chestFlag >= 0)) {
+ Flags_SetTreasure(play, chestFlag);
+ }
+ Item_Give(play, ITEM_SKULL_TOKEN);
+ if (Inventory_GetSkullTokenCount(play->sceneId) >= SPIDER_HOUSE_TOKENS_REQUIRED) {
+ Message_StartTextbox(play, 0xFC, NULL); // You collected all tokens, curse lifted
+ Audio_PlayFanfare(NA_BGM_GET_ITEM | 0x900);
+ } else {
+ Message_StartTextbox(play, 0x52, NULL); // You got one more gold token, your [count] one!
+ Audio_PlayFanfare(NA_BGM_GET_SMALL_ITEM);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Si/func_8098CAD0.s")
+void EnSi_Wait(EnSi* this, PlayState* play) {
+ if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_2000)) {
+ this->actionFunc = EnSi_DraggedByHookshot;
+ } else if (this->collider.base.ocFlags2 & OC2_HIT_PLAYER) {
+ EnSi_GiveToken(this, play);
+ Actor_Kill(&this->actor);
+ return;
+ }
+ this->actor.shape.rot.y += 0x38E;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Si/func_8098CB70.s")
+void EnSi_DraggedByHookshot(EnSi* this, PlayState* play) {
+ if (!CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_2000)) {
+ EnSi_GiveToken(this, play);
+ Actor_Kill(&this->actor);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Si/func_8098CBDC.s")
+void EnSi_Init(Actor* thisx, PlayState* play) {
+ EnSi* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Si/EnSi_Init.s")
+ Collider_InitSphere(play, &this->collider);
+ Collider_SetSphere(play, &this->collider, &this->actor, &sSphereInit);
+ CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
+ Actor_SetScale(&this->actor, 0.25f);
+ this->actionFunc = EnSi_Wait;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Si/EnSi_Destroy.s")
+void EnSi_Destroy(Actor* thisx, PlayState* play) {
+ EnSi* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Si/EnSi_Update.s")
+ Collider_DestroySphere(play, &this->collider);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Si/EnSi_Draw.s")
+void EnSi_Update(Actor* thisx, PlayState* play) {
+ EnSi* this = THIS;
+
+ this->actionFunc(this, play);
+ EnSi_UpdateCollision(this, play);
+ Actor_SetFocus(&this->actor, 0.0f);
+}
+
+void EnSi_Draw(Actor* thisx, PlayState* play) {
+ EnSi* this = THIS;
+
+ func_800B8118(&this->actor, play, 0);
+ func_800B8050(&this->actor, play, 0);
+ GetItem_Draw(play, GID_SKULL_TOKEN_2);
+}
diff --git a/src/overlays/actors/ovl_En_Si/z_en_si.h b/src/overlays/actors/ovl_En_Si/z_en_si.h
index b401e5e6a..f1b089ddd 100644
--- a/src/overlays/actors/ovl_En_Si/z_en_si.h
+++ b/src/overlays/actors/ovl_En_Si/z_en_si.h
@@ -3,6 +3,10 @@
#include "global.h"
+#define ENSI_GET_CHEST_FLAG(thisx) (((thisx)->params & 0xFC) >> 2)
+
+#define SPIDER_HOUSE_TOKENS_REQUIRED 30
+
struct EnSi;
typedef void (*EnSiActionFunc)(struct EnSi*, PlayState*);
@@ -10,7 +14,7 @@ typedef void (*EnSiActionFunc)(struct EnSi*, PlayState*);
typedef struct EnSi {
/* 0x000 */ Actor actor;
/* 0x144 */ EnSiActionFunc actionFunc;
- /* 0x148 */ char unk_148[0x58];
+ /* 0x148 */ ColliderSphere collider;
} EnSi; // size = 0x1A0
#endif // Z_EN_SI_H
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 bb1fb7e0b..9d57b9638 100644
--- a/src/overlays/actors/ovl_En_Skb/z_en_skb.c
+++ b/src/overlays/actors/ovl_En_Skb/z_en_skb.c
@@ -9,7 +9,7 @@
#include "overlays/actors/ovl_En_Encount4/z_en_encount4.h"
#include "objects/object_skb/object_skb.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY)
#define THIS ((EnSkb*)thisx)
@@ -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;
}
@@ -288,8 +288,8 @@ void func_80994DA8(EnSkb* this, PlayState* play) {
void func_80994E2C(EnSkb* this) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
- this->actor.flags &= ~ACTOR_FLAG_1;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_APPEAR);
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_APPEAR);
this->unk_3D0 = 0;
this->unk_3DE = 0;
this->actionFunc = func_80994E94;
@@ -300,7 +300,7 @@ void func_80994E94(EnSkb* this, PlayState* play) {
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
this->actor.shape.rot.y = this->actor.yawTowardsPlayer;
} else {
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}
Math_ApproachZeroF(&this->actor.shape.yOffset, 1.0f, 800.0f);
@@ -325,15 +325,15 @@ void func_80994F7C(EnSkb* this, PlayState* play) {
this->unk_3E0 = 1;
}
this->actionFunc = func_80995190;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
} else if (Actor_IsFacingPlayer(&this->actor, 0x2AAA) && !(this->collider.base.acFlags & AC_HIT)) {
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
}
void func_8099504C(EnSkb* this) {
this->actionFunc = func_80995068;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
void func_80995068(EnSkb* this, PlayState* play) {
@@ -349,15 +349,15 @@ void func_80995068(EnSkb* this, PlayState* play) {
this->unk_3E0 = 1;
}
this->actionFunc = func_80995190;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
} else if (Player_GetMask(play) != PLAYER_MASK_CAPTAIN) {
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_4);
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY);
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
this->actor.hintId = TATL_HINT_ID_STALCHILD;
this->actor.colChkInfo.mass = MASS_HEAVY;
func_80995A30(this);
} else if (!(this->collider.base.acFlags & AC_HIT)) {
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
}
@@ -388,8 +388,8 @@ void func_80995190(EnSkb* this, PlayState* play) {
}
void func_80995244(EnSkb* this, PlayState* play) {
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_4);
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY);
this->unk_3E2 = 0;
switch (this->unk_3DE) {
@@ -417,14 +417,14 @@ void func_809952D8(EnSkb* this) {
this->unk_3DE = 9;
this->actionFunc = func_8099533C;
this->actor.shape.shadowScale = 0.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.shape.yOffset = 0.0f;
}
void func_8099533C(EnSkb* this, PlayState* play) {
if (Player_GetMask(play) == PLAYER_MASK_CAPTAIN) {
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_4);
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
func_80994F7C(this, play);
} else if (Actor_IsFacingPlayer(&this->actor, 0x2AAA) && (this->actor.xzDistToPlayer < 200.0f)) {
this->actor.hintId = TATL_HINT_ID_STALCHILD;
@@ -439,14 +439,14 @@ void func_809953E8(EnSkb* this) {
this->unk_3DE = 10;
this->actionFunc = func_8099544C;
this->actor.shape.shadowScale = 0.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.shape.yOffset = 0.0f;
}
void func_8099544C(EnSkb* this, PlayState* play) {
if (Player_GetMask(play) == PLAYER_MASK_CAPTAIN) {
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_4);
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
func_80994F7C(this, play);
} else if (Actor_IsFacingPlayer(&this->actor, 0x2AAA) && (this->actor.xzDistToPlayer < 200.0f)) {
this->actor.hintId = TATL_HINT_ID_STALCHILD;
@@ -462,7 +462,7 @@ void func_809954F8(EnSkb* this) {
this->actionFunc = func_8099556C;
this->actor.gravity = 0.0f;
this->actor.shape.shadowScale = 0.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.shape.yOffset = 0.0f;
this->actor.targetArrowOffset = 4000.0f;
}
@@ -482,8 +482,8 @@ void func_8099556C(EnSkb* this, PlayState* play) {
this->actor.shape.rot.x = Math_SinS(this->unk_3D4 * sp26) * 20000.0f;
if (Player_GetMask(play) == PLAYER_MASK_CAPTAIN) {
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_4);
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
func_80994F7C(this, play);
} else if (Actor_IsFacingPlayer(&this->actor, 0x2AAA) && (this->actor.xzDistToPlayer < 200.0f) &&
(this->skelAnime.curFrame > 24.0f) && (this->skelAnime.curFrame < 28.0f)) {
@@ -495,19 +495,19 @@ void func_8099556C(EnSkb* this, PlayState* play) {
}
void func_8099571C(EnSkb* this) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_ATTACK);
this->unk_3DC = 0;
this->actor.shape.shadowScale = 0.0f;
if (this->unk_3DE == 9) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 8);
- this->actor.speedXZ = 2.4f;
+ this->actor.speed = 2.4f;
this->actor.gravity = -1.0f;
this->actor.velocity.y = 3.0f;
} else if (this->unk_3DE == 0xA) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 8);
} else if (this->unk_3DE == 0xB) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 9);
- this->actor.speedXZ = 3.2f;
+ this->actor.speed = 3.2f;
this->actor.gravity = -1.0f;
this->actor.velocity.y = 2.0f;
}
@@ -526,8 +526,8 @@ void func_80995818(EnSkb* this, PlayState* play) {
func_80995A30(this);
}
- if (this->actor.bgCheckFlags & 2) {
- this->actor.speedXZ = 0.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
+ this->actor.speed = 0.0f;
for (i = 0; i < 10; i++) {
func_809947B0(play, this, &this->actor.world.pos);
}
@@ -538,9 +538,9 @@ void func_809958F4(EnSkb* this) {
Animation_Change(&this->skelAnime, &object_skb_Anim_003584, -1.0f, Animation_GetLastFrame(&object_skb_Anim_003584),
0.0f, ANIMMODE_ONCE, -4.0f);
this->unk_3E4 = 0;
- this->actor.flags &= ~ACTOR_FLAG_1;
- this->actor.speedXZ = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ this->actor.speed = 0.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
this->unk_3DE = 1;
this->actionFunc = func_8099599C;
}
@@ -561,7 +561,7 @@ void func_8099599C(EnSkb* this, PlayState* play) {
void func_80995A30(EnSkb* this) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0);
- this->actor.speedXZ = 1.6f;
+ this->actor.speed = 1.6f;
this->unk_3DA = 0;
this->unk_3DE = 2;
this->actionFunc = func_80995A8C;
@@ -569,8 +569,8 @@ void func_80995A30(EnSkb* this) {
void func_80995A8C(EnSkb* this, PlayState* play) {
if (Player_GetMask(play) == PLAYER_MASK_CAPTAIN) {
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_4);
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
this->actor.hintId = TATL_HINT_ID_NONE;
this->actor.colChkInfo.mass = MASS_HEAVY;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 12);
@@ -579,13 +579,13 @@ 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);
this->actor.world.rot.y = this->actor.shape.rot.y;
if (Animation_OnFrame(&this->skelAnime, 8.0f) || Animation_OnFrame(&this->skelAnime, 15.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_WALK);
}
if ((this->actor.xzDistToPlayer > 800.0f) || func_80996594(this, play)) {
@@ -598,14 +598,14 @@ void func_80995A8C(EnSkb* this, PlayState* play) {
void func_80995C24(EnSkb* this) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
this->collider.base.atFlags &= ~AT_BOUNCED;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->unk_3DE = 3;
this->actionFunc = func_80995C84;
}
void func_80995C84(EnSkb* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, 3.0f) && (this->unk_3E4 == 0)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_ATTACK);
this->unk_3E4 = 1;
} else if (Animation_OnFrame(&this->skelAnime, 6.0f)) {
this->unk_3E4 = 0;
@@ -635,27 +635,27 @@ void func_80995DC4(EnSkb* this, PlayState* play) {
}
void func_80995E08(EnSkb* this) {
- if (this->actor.bgCheckFlags & 1) {
- this->actor.speedXZ = 0.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->actor.speed = 0.0f;
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
this->unk_3E4 = 0;
this->unk_3DE = 5;
this->actionFunc = func_80995E64;
}
void func_80995E64(EnSkb* this, PlayState* play) {
- if (this->actor.bgCheckFlags & 2) {
- this->actor.speedXZ = 0.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
+ this->actor.speed = 0.0f;
}
- if (this->actor.bgCheckFlags & 1) {
- if (this->actor.speedXZ < 0.0f) {
- this->actor.speedXZ += 0.05f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ if (this->actor.speed < 0.0f) {
+ this->actor.speed += 0.05f;
}
}
- if ((this->actor.colorFilterTimer == 0) && (this->actor.bgCheckFlags & 1)) {
+ if ((this->actor.colorFilterTimer == 0) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
if (this->unk_3DC == 0) {
if (this->actor.colChkInfo.health == 0) {
func_809961E4(this, play);
@@ -684,43 +684,44 @@ void func_80995F98(EnSkb* this) {
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 8);
this->actor.gravity = -1.0f;
- this->actor.speedXZ = 1.0f;
+ this->actor.speed = 1.0f;
} else if (this->unk_3DE == 0xB) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 9);
- this->actor.speedXZ = 3.2f;
+ this->actor.speed = 3.2f;
this->actor.velocity.y = 2.0f;
this->actor.gravity = -1.0f;
} else {
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
- if (this->actor.bgCheckFlags & 1) {
- this->actor.speedXZ = -4.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->actor.speed = -4.0f;
}
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_DAMAGE);
this->unk_3DE = 6;
this->actionFunc = func_809960AC;
}
void func_809960AC(EnSkb* this, PlayState* play) {
- if (this->actor.bgCheckFlags & 2) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
s32 i;
for (i = 0; i < 10; i++) {
func_809947B0(play, this, &this->actor.world.pos);
}
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
- if (this->actor.bgCheckFlags & 1) {
- if (this->actor.speedXZ < 0.0f) {
- this->actor.speedXZ += 0.05f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ if (this->actor.speed < 0.0f) {
+ this->actor.speed += 0.05f;
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 1, 0x9C4, 0);
}
Math_SmoothStepToS(&this->actor.shape.rot.x, 0, 0x10, 0x7D0, 0x64);
- if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame) && (this->actor.bgCheckFlags & 1)) {
+ if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame) &&
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
this->actor.shape.rot.x = 0;
this->actor.world.rot = this->actor.shape.rot;
func_80994DA8(this, play);
@@ -730,26 +731,26 @@ void func_809960AC(EnSkb* this, PlayState* play) {
void func_809961E4(EnSkb* this, PlayState* play) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 4);
this->unk_3D8 |= 0x40;
- if (this->actor.bgCheckFlags & 1) {
- this->actor.speedXZ = -6.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->actor.speed = -6.0f;
}
this->unk_3E4 = 0;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EN_STALKID_DEAD);
this->unk_3DE = 7;
this->actionFunc = func_80996284;
}
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) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
this->actionFunc = func_8099630C;
}
@@ -759,7 +760,7 @@ void func_8099630C(EnSkb* this, PlayState* play) {
this->drawDmgEffScale = 0.0f;
this->drawDmgEffAlpha = 0.0f;
if (this->actor.colChkInfo.health != 0) {
- Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, 0, 8);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
this->unk_3D8 |= 1;
func_80995F98(this);
@@ -781,7 +782,7 @@ void func_809963D8(EnSkb* this, PlayState* play) {
this->drawDmgEffScale = 0.0f;
this->drawDmgEffAlpha = 0.0f;
if (this->actor.colChkInfo.health != 0) {
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
this->unk_3D8 |= 1;
func_80995F98(this);
@@ -794,7 +795,7 @@ void func_809963D8(EnSkb* this, PlayState* play) {
void func_80996474(EnSkb* this) {
this->unk_3D0 = 0;
this->actor.draw = NULL;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actionFunc = func_809964A0;
}
@@ -873,7 +874,8 @@ void func_8099672C(EnSkb* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if ((this->unk_3DE != 6) && (this->unk_3DE != 7)) {
- if ((this->actor.bgCheckFlags & 0x60) && (this->actor.depthInWater >= 40.0f)) {
+ if ((this->actor.bgCheckFlags & (BGCHECKFLAG_WATER | BGCHECKFLAG_WATER_TOUCH)) &&
+ (this->actor.depthInWater >= 40.0f)) {
this->actor.colChkInfo.health = 0;
this->unk_3E4 = 0;
func_809961E4(this, play);
@@ -913,12 +915,12 @@ void func_8099672C(EnSkb* this, PlayState* play) {
this->drawDmgEffTimer = 40;
this->drawDmgEffAlpha = 1.0f;
this->drawDmgEffScale = 0.0f;
- Actor_SetColorFilter(&this->actor, 0, 0x78, 0, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 120, COLORFILTER_BUFFLAG_OPA, 40);
func_80995E08(this);
break;
case 1:
- Actor_SetColorFilter(&this->actor, 0, 0x78, 0, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 120, COLORFILTER_BUFFLAG_OPA, 40);
func_80995E08(this);
break;
@@ -927,14 +929,14 @@ void func_8099672C(EnSkb* this, PlayState* play) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->drawDmgEffAlpha = 1.0f;
this->drawDmgEffScale = 0.0f;
- Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, 0, 8);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
this->unk_3D8 |= 1;
func_80995F98(this);
break;
case 3:
if (this->actor.colChkInfo.health != 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_DAMAGE);
this->drawDmgEffTimer = 80;
} else {
this->drawDmgEffTimer = 3;
@@ -942,7 +944,7 @@ void func_8099672C(EnSkb* this, PlayState* play) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FROZEN_SFX;
this->drawDmgEffAlpha = 1.0f;
this->drawDmgEffScale = 0.5f;
- Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, 0, 8);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
func_809962D4(this);
break;
@@ -951,8 +953,8 @@ void func_8099672C(EnSkb* this, PlayState* play) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_LIGHT_ORBS;
this->drawDmgEffAlpha = 1.0f;
this->drawDmgEffScale = 0.5f;
- Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, 0, 8);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_DAMAGE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_DAMAGE);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
func_809963C4(this);
break;
@@ -970,7 +972,7 @@ void func_8099672C(EnSkb* this, PlayState* play) {
}
case 13:
- Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, 0, 8);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
func_80995F98(this);
break;
@@ -980,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);
}
}
@@ -1006,22 +1008,22 @@ void func_80996BEC(EnSkb* this, PlayState* play) {
Vec3f sp84;
s32 i;
s16 yaw;
- s32 end;
+ s32 bodyPartsCount;
if (this->unk_3D8 & 2) {
- end = 13;
+ bodyPartsCount = ENSKB_BODYPART_MAX - 1;
} else {
- end = 14;
+ bodyPartsCount = ENSKB_BODYPART_MAX;
}
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 30, NA_SE_EV_ICE_BROKEN);
- for (i = 0; i < end; i++) {
- yaw = Math_Vec3f_Yaw(&this->actor.world.pos, &this->limbPos[i]);
+ for (i = 0; i < bodyPartsCount; i++) {
+ yaw = Math_Vec3f_Yaw(&this->actor.world.pos, &this->bodyPartsPos[i]);
sp84.x = Math_SinS(yaw) * 3.0f;
sp84.z = Math_CosS(yaw) * 3.0f;
sp84.y = (Rand_ZeroOne() * 4.0f) + 4.0f;
- EffectSsEnIce_Spawn(play, &this->limbPos[i], 0.6f, &sp84, &D_80997558, &D_80997550, &D_80997554, 30);
+ EffectSsEnIce_Spawn(play, &this->bodyPartsPos[i], 0.6f, &sp84, &D_80997558, &D_80997550, &D_80997554, 30);
}
}
@@ -1060,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);
@@ -1114,11 +1118,11 @@ void EnSkb_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
if ((limbIndex == 2) || (limbIndex == 4) || (limbIndex == 5) || (limbIndex == 6) || (limbIndex == 7) ||
(limbIndex == 8) || (limbIndex == 9) || (limbIndex == 13) || (limbIndex == 14) || (limbIndex == 15) ||
(limbIndex == 16) || (limbIndex == 17) || (limbIndex == 18)) {
- Matrix_MultZero(&this->limbPos[this->limbCount]);
- this->limbCount++;
+ Matrix_MultZero(&this->bodyPartsPos[this->bodyPartsCount]);
+ this->bodyPartsCount++;
} else if ((limbIndex == 11) && !(this->unk_3D8 & 2)) {
- Matrix_MultVec3f(&D_80997564, &this->limbPos[this->limbCount]);
- this->limbCount++;
+ Matrix_MultVec3f(&D_80997564, &this->bodyPartsPos[this->bodyPartsCount]);
+ this->bodyPartsCount++;
}
}
}
@@ -1126,13 +1130,13 @@ void EnSkb_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
void EnSkb_Draw(Actor* thisx, PlayState* play) {
EnSkb* this = THIS;
- this->limbCount = 0;
- func_8012C28C(play->state.gfxCtx);
+ this->bodyPartsCount = 0;
+ 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) {
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, this->limbCount, this->drawDmgEffScale, 0.5f,
- this->drawDmgEffAlpha, this->drawDmgEffType);
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, this->bodyPartsCount, this->drawDmgEffScale,
+ 0.5f, this->drawDmgEffAlpha, this->drawDmgEffType);
}
if (this->unk_3D8 & 0x40) {
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..983e8cc5d 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,26 @@ 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 enum EnSkbBodyPart {
+ /* 0 */ ENSKB_BODYPART_0,
+ /* 1 */ ENSKB_BODYPART_1,
+ /* 2 */ ENSKB_BODYPART_2,
+ /* 3 */ ENSKB_BODYPART_3,
+ /* 4 */ ENSKB_BODYPART_4,
+ /* 5 */ ENSKB_BODYPART_5,
+ /* 6 */ ENSKB_BODYPART_6,
+ /* 7 */ ENSKB_BODYPART_7,
+ /* 8 */ ENSKB_BODYPART_8,
+ /* 9 */ ENSKB_BODYPART_9,
+ /* 10 */ ENSKB_BODYPART_10,
+ /* 11 */ ENSKB_BODYPART_11,
+ /* 12 */ ENSKB_BODYPART_12,
+ /* 13 */ ENSKB_BODYPART_13,
+ /* 14 */ ENSKB_BODYPART_MAX
+} EnSkbBodyPart;
typedef struct EnSkb {
/* 0x000 */ Actor actor;
@@ -21,8 +39,8 @@ typedef struct EnSkb {
/* 0x228 */ EnSkbActionFunc actionFunc;
/* 0x22C */ f32 drawDmgEffAlpha;
/* 0x230 */ f32 drawDmgEffScale;
- /* 0x234 */ Vec3f limbPos[14];
- /* 0x2DC */ s32 limbCount;
+ /* 0x234 */ Vec3f bodyPartsPos[ENSKB_BODYPART_MAX];
+ /* 0x2DC */ s32 bodyPartsCount;
/* 0x2E0 */ Vec3s jointTable[20];
/* 0x358 */ Vec3s morphTable[20];
/* 0x3D0 */ s16 unk_3D0;
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..79dfe2ced 100644
--- a/src/overlays/actors/ovl_En_Slime/z_en_slime.c
+++ b/src/overlays/actors/ovl_En_Slime/z_en_slime.c
@@ -5,35 +5,68 @@
*/
#include "z_en_slime.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_200)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_200)
#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 +78,1176 @@ 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 }, // EN_SLIME_TYPE_BLUE
+ { 255, 255, 0, 255 }, // EN_SLIME_TYPE_GREEN
+ { 255, 255, 200, 255 }, // EN_SLIME_TYPE_YELLOW
+ { 225, 200, 255, 255 }, // EN_SLIME_TYPE_RED
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/EnSlime_Init.s")
+static Color_RGBA8 sEnvColors[] = {
+ { 140, 255, 195, 255 }, // EN_SLIME_TYPE_BLUE
+ { 50, 255, 0, 255 }, // EN_SLIME_TYPE_GREEN
+ { 255, 180, 0, 255 }, // EN_SLIME_TYPE_YELLOW
+ { 255, 50, 155, 255 }, // EN_SLIME_TYPE_RED
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/EnSlime_Destroy.s")
+static Vec3f sBodyPartPosOffsets[EN_SLIME_BODYPART_MAX] = {
+ { 2000.0f, 2000.0f, 0.0f }, // EN_SLIME_BODYPART_0
+ { -1500.0f, 2500.0f, -500.0f }, // EN_SLIME_BODYPART_1
+ { -500.0f, 1000.0f, 2500.0f }, // EN_SLIME_BODYPART_2
+ { 0.0f, 4000.0f, 0.0f }, // EN_SLIME_BODYPART_3
+ { 0.0f, 2000.0f, -2000.0f }, // EN_SLIME_BODYPART_4
+};
-#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->bodyPartsPos, EN_SLIME_BODYPART_MAX, 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_JAR_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_TARGETABLE;
+ 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_TARGETABLE;
+ 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_TARGETABLE;
+ 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_TARGETABLE;
+ 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_TARGETABLE;
+ }
+
+ 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_PARAMS(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,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
+ }
+
+ 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)) {
+ Actor_PlaySfx_Flagged(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_BODYPART_MAX; i++) {
+ Matrix_MultVec3f(&sBodyPartPosOffsets[i], &this->bodyPartsPos[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->bodyPartsPos, EN_SLIME_BODYPART_MAX, 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..fbae533ea 100644
--- a/src/overlays/actors/ovl_En_Slime/z_en_slime.h
+++ b/src/overlays/actors/ovl_En_Slime/z_en_slime.h
@@ -2,15 +2,55 @@
#define Z_EN_SLIME_H
#include "global.h"
+#include "objects/object_slime/object_slime.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
struct EnSlime;
typedef void (*EnSlimeActionFunc)(struct EnSlime*, PlayState*);
+
+#define EN_SLIME_GET_TYPE(thisx) ((thisx)->params)
+#define EN_SLIME_GET_REVIVE_TIME(thisx) ((((thisx)->params) >> 8) & 0xFF)
+
+typedef enum EnSlimeType {
+ /* 0 */ EN_SLIME_TYPE_BLUE,
+ /* 1 */ EN_SLIME_TYPE_GREEN,
+ /* 2 */ EN_SLIME_TYPE_YELLOW,
+ /* 3 */ EN_SLIME_TYPE_RED
+} EnSlimeType;
+
+typedef enum EnSlimeBodyPart {
+ /* 0 */ EN_SLIME_BODYPART_0,
+ /* 1 */ EN_SLIME_BODYPART_1,
+ /* 2 */ EN_SLIME_BODYPART_2,
+ /* 3 */ EN_SLIME_BODYPART_3,
+ /* 4 */ EN_SLIME_BODYPART_4,
+ /* 5 */ EN_SLIME_BODYPART_MAX
+} EnSlimeBodyPart;
+
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 bodyPartsPos[EN_SLIME_BODYPART_MAX];
+ /* 0x1BC */ ColliderCylinder collider;
} EnSlime; // size = 0x208
#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 994115f89..f1be3d5f4 100644
--- a/src/overlays/actors/ovl_En_Snowman/z_en_snowman.c
+++ b/src/overlays/actors/ovl_En_Snowman/z_en_snowman.c
@@ -5,8 +5,9 @@
*/
#include "z_en_snowman.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY)
#define THIS ((EnSnowman*)thisx)
@@ -58,7 +59,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 +120,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 +209,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->unk20, 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);
@@ -240,21 +241,21 @@ void EnSnowman_Init(Actor* thisx, PlayState* play) {
} else {
Player* player = GET_PLAYER(play);
- thisx->flags &= ~ACTOR_FLAG_1;
+ thisx->flags &= ~ACTOR_FLAG_TARGETABLE;
Collider_InitAndSetCylinder(play, &this->collider, thisx, &sSnowballCylinderInit);
- thisx->world.rot.y = Actor_YawBetweenActors(thisx, &player->actor);
- thisx->velocity.y = (Actor_XZDistanceBetweenActors(thisx, &player->actor) * 0.035f) + -5.0f;
+ thisx->world.rot.y = Actor_WorldYawTowardActor(thisx, &player->actor);
+ thisx->velocity.y = (Actor_WorldDistXZToActor(thisx, &player->actor) * 0.035f) + -5.0f;
thisx->velocity.y = CLAMP_MAX(thisx->velocity.y, 3.5f);
if (EN_SNOWMAN_GET_TYPE(thisx) == EN_SNOWMAN_TYPE_SMALL_SNOWBALL) {
- thisx->speedXZ = 15.0f;
+ thisx->speed = 15.0f;
} else {
- thisx->speedXZ = 22.5f;
+ thisx->speed = 22.5f;
thisx->velocity.y *= 1.5f;
}
- thisx->world.pos.x += thisx->speedXZ * Math_SinS(thisx->world.rot.y);
+ thisx->world.pos.x += thisx->speed * Math_SinS(thisx->world.rot.y);
thisx->world.pos.y += thisx->velocity.y;
- thisx->world.pos.z += thisx->speedXZ * Math_CosS(thisx->world.rot.y);
+ thisx->world.pos.z += thisx->speed * Math_CosS(thisx->world.rot.y);
if (EN_SNOWMAN_GET_TYPE(thisx) == EN_SNOWMAN_TYPE_SMALL_SNOWBALL) {
this->collider.dim.radius = 8;
@@ -338,7 +339,7 @@ void EnSnowman_SpawnBigSnowballFragmentEffects(EnSnowman* this, PlayState* play)
void EnSnowman_SetupMoveSnowPile(EnSnowman* this) {
Animation_PlayLoop(&this->snowPileSkelAnime, &gEenoSnowPileMoveAnim);
this->actor.scale.y = this->actor.scale.x;
- this->actor.speedXZ = 2.0f;
+ this->actor.speed = 2.0f;
this->actor.draw = EnSnowman_DrawSnowPile;
this->work.timer = 40;
this->turningOnSteepSlope = false;
@@ -356,9 +357,9 @@ void EnSnowman_MoveSnowPile(EnSnowman* this, PlayState* play) {
SkelAnime_Update(&this->snowPileSkelAnime);
if (EN_SNOWMAN_GET_TYPE(&this->actor) == EN_SNOWMAN_TYPE_LARGE) {
- func_800B9010(&this->actor, NA_SE_EN_YMAJIN_MOVE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_YMAJIN_MOVE - SFX_FLAG);
} else {
- func_800B9010(&this->actor, NA_SE_EN_YMAJIN_MINI_MOVE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_YMAJIN_MINI_MOVE - SFX_FLAG);
}
if (this->work.timer > 0) {
@@ -403,10 +404,11 @@ void EnSnowman_MoveSnowPile(EnSnowman* this, PlayState* play) {
}
this->actor.world.rot.y = this->actor.shape.rot.y;
- } else if (this->actor.bgCheckFlags & 8) {
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->snowPileTargetRotY = this->actor.wallYaw;
- } else if (Actor_XZDistanceToPoint(&this->actor, &this->actor.home.pos) > 200.0f) {
- this->snowPileTargetRotY = Actor_YawToPoint(&this->actor, &this->actor.home.pos) + ((s32)Rand_Next() >> 0x14);
+ } else if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) > 200.0f) {
+ this->snowPileTargetRotY =
+ Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos) + ((s32)Rand_Next() >> 0x14);
} else if (Rand_ZeroOne() < 0.02f) {
this->snowPileTargetRotY += (s16)(((Rand_Next() >> 0x13) + 0x1000) * ((Rand_ZeroOne() < 0.5f) ? -1 : 1));
}
@@ -414,12 +416,12 @@ void EnSnowman_MoveSnowPile(EnSnowman* this, PlayState* play) {
void EnSnowman_SetupEmerge(EnSnowman* this, PlayState* play) {
Animation_PlayOnce(&this->skelAnime, &gEenoEmergeAnim);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_YMAJIN_SURFACE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_YMAJIN_SURFACE);
this->collider.dim.radius = this->eenoScale * 40.0f;
this->collider.dim.height = this->eenoScale * 25.0f;
this->actor.draw = EnSnowman_Draw;
this->actor.scale.y = this->actor.scale.x * 0.4f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.shape.rot.y = this->actor.yawTowardsPlayer;
EnSnowman_SpawnCircularDustEffect(this, play);
this->collider.base.acFlags &= ~AC_ON;
@@ -474,18 +476,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);
}
}
@@ -494,9 +496,9 @@ void EnSnowman_ReadySnowball(EnSnowman* this, PlayState* play) {
EnSnowman_SetupThrowSnowball(this);
} else if (Animation_OnFrame(&this->skelAnime, this->fwork.frameToStartHoldingSnowball)) {
if (EN_SNOWMAN_GET_TYPE(&this->actor) == EN_SNOWMAN_TYPE_LARGE) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_YMAJIN_HOLD_SNOW);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_YMAJIN_HOLD_SNOW);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_YMAJIN_MINI_HOLD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_YMAJIN_MINI_HOLD);
}
this->isHoldingSnowball = true;
@@ -539,10 +541,10 @@ void EnSnowman_ThrowSnowball(EnSnowman* this, PlayState* play) {
this->isHoldingSnowball = false;
if (EN_SNOWMAN_GET_TYPE(&this->actor) == EN_SNOWMAN_TYPE_LARGE) {
params = EN_SNOWMAN_TYPE_LARGE_SNOWBALL;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_YMAJIN_THROW);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_YMAJIN_THROW);
} else {
params = EN_SNOWMAN_TYPE_SMALL_SNOWBALL;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_YMAJIN_MINI_THROW);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_YMAJIN_MINI_THROW);
}
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_SNOWMAN, this->snowballPos.x, this->snowballPos.y,
@@ -572,7 +574,7 @@ void EnSnowman_SetupSubmerge(EnSnowman* this, PlayState* play) {
Animation_Change(&this->skelAnime, &gEenoEmergeAnim, -1.0f, Animation_GetLastFrame(&gEenoEmergeAnim), 0.0f,
ANIMMODE_ONCE, -3.0f);
EnSnowman_SpawnCircularDustEffect(this, play);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_YMAJIN_HIDE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_YMAJIN_HIDE);
this->actionFunc = EnSnowman_Submerge;
}
@@ -598,13 +600,13 @@ void EnSnowman_Submerge(EnSnowman* this, PlayState* play) {
}
void EnSnowman_SetupMelt(EnSnowman* this) {
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 50);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 50);
this->collider.base.acFlags &= ~AC_ON;
this->work.timer = 50;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.flags |= ACTOR_FLAG_10;
this->actor.scale.y = this->actor.scale.x;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = EnSnowman_Melt;
}
@@ -618,8 +620,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;
@@ -667,18 +669,18 @@ void EnSnowman_Stun(EnSnowman* this, PlayState* play) {
void EnSnowman_SetupDamaged(EnSnowman* this) {
Animation_PlayLoop(&this->skelAnime, &gEenoDamageAnim);
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 20);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 20);
this->collider.base.acFlags &= ~AC_ON;
this->work.timer = 20;
this->actor.draw = EnSnowman_Draw;
this->actor.scale.y = this->actor.scale.x;
- this->actor.speedXZ = 10.0f;
+ this->actor.speed = 10.0f;
func_800BE504(&this->actor, &this->collider);
if (EN_SNOWMAN_GET_TYPE(&this->actor) == EN_SNOWMAN_TYPE_LARGE) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_YMAJIN_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_YMAJIN_DAMAGE);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_YMAJIN_MINI_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_YMAJIN_MINI_DAMAGE);
}
this->actionFunc = EnSnowman_Damaged;
@@ -690,12 +692,12 @@ void EnSnowman_SetupDamaged(EnSnowman* this) {
* Otherwise, it will either submerge underground (if it has health remaining) or die.
*/
void EnSnowman_Damaged(EnSnowman* this, PlayState* play) {
- s32 rotationalVelocityScale;
+ s32 angularVelocityScale;
SkelAnime_Update(&this->skelAnime);
- rotationalVelocityScale = CLAMP_MAX(this->work.timer, 10);
- this->actor.shape.rot.y += rotationalVelocityScale * 0x300;
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f);
+ angularVelocityScale = CLAMP_MAX(this->work.timer, 10);
+ this->actor.shape.rot.y += angularVelocityScale * 0x300;
+ Math_StepToF(&this->actor.speed, 0.0f, 0.5f);
if (EN_SNOWMAN_GET_TYPE(&this->actor) == EN_SNOWMAN_TYPE_LARGE) {
Math_StepToF(&this->actor.scale.y, 1.3f * 0.01f, 0.7f * 0.001f);
@@ -706,7 +708,7 @@ void EnSnowman_Damaged(EnSnowman* this, PlayState* play) {
if (this->work.timer > 0) {
this->work.timer--;
} else if (EN_SNOWMAN_GET_TYPE(&this->actor) == EN_SNOWMAN_TYPE_LARGE) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_YMAJIN_SPLIT);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_YMAJIN_SPLIT);
EnSnowman_SpawnCircularDustEffect(this, play);
this->drawDmgEffAlpha = 0.0f;
EnSnowman_CreateSplitEeno((EnSnowman*)this->actor.parent, &this->actor.world.pos,
@@ -785,7 +787,7 @@ void EnSnowman_SetupSplitDoNothing(EnSnowman* this) {
this->combineState = EN_SNOWMAN_COMBINE_STATE_NO_ABSORPTION;
}
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_10);
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_10);
if ((this->actor.parent != NULL) && (((EnSnowman*)this->actor.parent)->actionFunc == EnSnowman_SplitDoNothing)) {
if ((this->actor.child != NULL) && (((EnSnowman*)this->actor.child)->actionFunc == EnSnowman_SplitDoNothing)) {
EnSnowman_SetupKill((EnSnowman*)this->actor.parent);
@@ -820,7 +822,7 @@ void EnSnowman_Kill(EnSnowman* this, PlayState* play) {
* Creates a small split Eeno with a certain Y-rotation and at a certain offset from basePos.
*/
void EnSnowman_CreateSplitEeno(EnSnowman* this, Vec3f* basePos, s32 yRot) {
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
Actor_SetScale(&this->actor, 0.01f);
this->actor.shape.rot.y = yRot;
this->actor.world.rot.y = this->actor.shape.rot.y;
@@ -844,7 +846,7 @@ void EnSnowman_CreateSplitEeno(EnSnowman* this, Vec3f* basePos, s32 yRot) {
* target scale increases.
*/
void EnSnowman_AbsorbEeno(EnSnowman* smallerEeno, EnSnowman* largerEeno) {
- Actor_PlaySfxAtPos(&largerEeno->actor, NA_SE_EN_YMAJIN_UNITE);
+ Actor_PlaySfx(&largerEeno->actor, NA_SE_EN_YMAJIN_UNITE);
largerEeno->fwork.targetScaleDuringCombine += 0.005f;
smallerEeno->combineState = EN_SNOWMAN_COMBINE_STATE_BEING_ABSORBED_OR_DONE;
smallerEeno->collider.base.ocFlags1 &= ~OC1_HIT;
@@ -877,11 +879,11 @@ void EnSnowman_SetupCombine(EnSnowman* this, PlayState* play, Vec3f* combinePos)
//! @bug: If an Eeno is in the middle of submerging, its draw function will still be EnSnowman_Draw.
//! It will call EnSnowman_SetupSubmerge again, resulting in the submerge animation playing twice.
if (this->actor.draw == EnSnowman_DrawSnowPile) {
- this->actor.speedXZ = 3.0f;
+ this->actor.speed = 3.0f;
this->actionFunc = EnSnowman_Combine;
} else {
this->isHoldingSnowball = false;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
// At this point, the combineState is EN_SNOWMAN_COMBINE_STATE_ACTIVE, and the actionFunc
// will be set to EnSnowman_Submerge. When the submerging animation is complete with this
@@ -902,7 +904,7 @@ void EnSnowman_Combine(EnSnowman* this, PlayState* play) {
SkelAnime_Update(&this->snowPileSkelAnime);
parent = (EnSnowman*)this->actor.parent;
child = (EnSnowman*)this->actor.child;
- Math_ScaledStepToS(&this->actor.shape.rot.y, Actor_YawToPoint(&this->actor, &this->combinePos), 0x1000);
+ Math_ScaledStepToS(&this->actor.shape.rot.y, Actor_WorldYawTowardPoint(&this->actor, &this->combinePos), 0x1000);
this->actor.world.rot.y = this->actor.shape.rot.y;
if (this->combineState == EN_SNOWMAN_COMBINE_STATE_ACTIVE) {
@@ -940,8 +942,8 @@ void EnSnowman_Combine(EnSnowman* this, PlayState* play) {
this->fwork.targetScaleDuringCombine = 0.0f;
}
- if (Actor_XZDistanceToPoint(&this->actor, &this->combinePos) < 20.0f) {
- this->actor.speedXZ = 0.0f;
+ if (Actor_WorldDistXZToPoint(&this->actor, &this->combinePos) < 20.0f) {
+ this->actor.speed = 0.0f;
}
if (Math_StepToF(&this->actor.scale.x, this->fwork.targetScaleDuringCombine, 0.0005f)) {
@@ -976,15 +978,15 @@ void EnSnowman_UpdateDamage(EnSnowman* this, PlayState* play) {
if ((this->actionFunc == EnSnowman_MoveSnowPile) || (this->actionFunc == EnSnowman_Combine)) {
EnSnowman_SetupEmerge(this, play);
} else if (this->actor.colChkInfo.damageEffect == EN_SNOWMAN_DMGEFF_STUN) {
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 40);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
EnSnowman_SetupStun(this);
} else if (this->actor.colChkInfo.damageEffect == EN_SNOWMAN_DMGEFF_ELECTRIC_STUN) {
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 40);
this->drawDmgEffScale = 0.55f;
this->drawDmgEffAlpha = 2.0f;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_LARGE;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
EnSnowman_SetupStun(this);
} else if (EN_SNOWMAN_GET_TYPE(&this->actor) == EN_SNOWMAN_TYPE_LARGE) {
if (this->isHoldingSnowball == true) {
@@ -1008,7 +1010,7 @@ void EnSnowman_UpdateDamage(EnSnowman* this, PlayState* play) {
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);
+ CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
}
}
}
@@ -1036,7 +1038,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) {
@@ -1080,9 +1084,9 @@ void EnSnowman_UpdateSnowball(Actor* thisx, PlayState* play) {
this->collider.base.ocFlags1 |= OC1_ON;
}
- if ((this->actor.bgCheckFlags & 8) || (this->actor.bgCheckFlags & 1) || (this->actor.bgCheckFlags & 0x10) ||
- (this->collider.base.atFlags & AT_HIT) || (this->collider.base.acFlags & AC_HIT) ||
- (this->collider.base.ocFlags1 & OC1_HIT)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) || (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
+ (this->actor.bgCheckFlags & BGCHECKFLAG_CEILING) || (this->collider.base.atFlags & AT_HIT) ||
+ (this->collider.base.acFlags & AC_HIT) || (this->collider.base.ocFlags1 & OC1_HIT)) {
if (EN_SNOWMAN_GET_TYPE(&this->actor) == EN_SNOWMAN_TYPE_SMALL_SNOWBALL) {
scale = 10;
for (i = 0; i < 3; i++) {
@@ -1110,7 +1114,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);
@@ -1119,11 +1125,21 @@ void EnSnowman_UpdateSnowball(Actor* thisx, PlayState* play) {
/**
* This maps a given limb based on its limbIndex to its appropriate index
- * in the bodyPartsPos array. An index of -1 indicates that the limb is
- * not part of the bodyPartsPos array.
+ * in the bodyPartsPos array.
*/
-static s8 sLimbIndexToBodyPartsPosIndex[] = {
- -1, -1, -1, -1, -1, -1, 0, 1, -1, 2, 3, 4,
+static s8 sLimbToBodyParts[EENO_LIMB_MAX] = {
+ BODYPART_NONE, // EENO_LIMB_NONE
+ BODYPART_NONE, // EENO_LIMB_ROOT
+ BODYPART_NONE, // EENO_LIMB_BODY_TOP
+ BODYPART_NONE, // EENO_LIMB_LEFT_EYE
+ BODYPART_NONE, // EENO_LIMB_RIGHT_EYE
+ BODYPART_NONE, // EENO_LIMB_LEFT_UPPER_ARM
+ EN_SNOWMAN_BODYPART_0, // EENO_LIMB_LEFT_FOREARM
+ EN_SNOWMAN_BODYPART_1, // EENO_LIMB_LEFT_HAND
+ BODYPART_NONE, // EENO_LIMB_RIGHT_UPPER_ARM
+ EN_SNOWMAN_BODYPART_2, // EENO_LIMB_RIGHT_FOREARM
+ EN_SNOWMAN_BODYPART_3, // EENO_LIMB_RIGHT_HAND
+ EN_SNOWMAN_BODYPART_4, // EENO_LIMB_BODY_BOTTOM
};
/**
@@ -1131,8 +1147,11 @@ static s8 sLimbIndexToBodyPartsPosIndex[] = {
* bottom limb, each offset by a certain certain amount.
*/
static Vec3f sBodyBottomBodyPartOffsets[] = {
- { 2000.0f, 3000.0f, 0.0f }, { 2000.0f, -2000.0f, 0.0f }, { 3000.0f, 0.0f, 0.0f },
- { 1000.0f, 0.0f, 3000.0f }, { 1000.0f, 0.0f, -3000.0f },
+ { 2000.0f, 3000.0f, 0.0f }, // EN_SNOWMAN_BODYPART_4
+ { 2000.0f, -2000.0f, 0.0f }, // EN_SNOWMAN_BODYPART_5
+ { 3000.0f, 0.0f, 0.0f }, // EN_SNOWMAN_BODYPART_6
+ { 1000.0f, 0.0f, 3000.0f }, // EN_SNOWMAN_BODYPART_7
+ { 1000.0f, 0.0f, -3000.0f }, // EN_SNOWMAN_BODYPART_8
};
void EnSnowman_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
@@ -1141,13 +1160,13 @@ void EnSnowman_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
Gfx* gfx;
s32 i;
- if (sLimbIndexToBodyPartsPosIndex[limbIndex] != -1) {
- if (sLimbIndexToBodyPartsPosIndex[limbIndex] == 4) {
- for (i = 0; i < 5; i++) {
- Matrix_MultVec3f(&sBodyBottomBodyPartOffsets[i], &this->bodyPartsPos[i + 4]);
+ if (sLimbToBodyParts[limbIndex] != BODYPART_NONE) {
+ if (sLimbToBodyParts[limbIndex] == EN_SNOWMAN_BODYPART_4) {
+ for (i = 0; i < ARRAY_COUNT(sBodyBottomBodyPartOffsets); i++) {
+ Matrix_MultVec3f(&sBodyBottomBodyPartOffsets[i], &this->bodyPartsPos[EN_SNOWMAN_BODYPART_4 + i]);
}
} else {
- Matrix_MultZero(&this->bodyPartsPos[sLimbIndexToBodyPartsPosIndex[limbIndex]]);
+ Matrix_MultZero(&this->bodyPartsPos[sLimbToBodyParts[limbIndex]]);
}
}
@@ -1177,17 +1196,17 @@ 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),
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, EN_SNOWMAN_BODYPART_MAX,
this->drawDmgEffScale * this->eenoScale, 0.0f, this->drawDmgEffAlpha, this->drawDmgEffType);
}
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..2533c2595 100644
--- a/src/overlays/actors/ovl_En_Snowman/z_en_snowman.h
+++ b/src/overlays/actors/ovl_En_Snowman/z_en_snowman.h
@@ -12,13 +12,26 @@ 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;
typedef void (*EnSnowmanActionFunc)(struct EnSnowman*, PlayState*);
+typedef enum EnSnowmanBodyPart {
+ /* 0 */ EN_SNOWMAN_BODYPART_0,
+ /* 1 */ EN_SNOWMAN_BODYPART_1,
+ /* 2 */ EN_SNOWMAN_BODYPART_2,
+ /* 3 */ EN_SNOWMAN_BODYPART_3,
+ /* 4 */ EN_SNOWMAN_BODYPART_4,
+ /* 5 */ EN_SNOWMAN_BODYPART_5,
+ /* 6 */ EN_SNOWMAN_BODYPART_6,
+ /* 7 */ EN_SNOWMAN_BODYPART_7,
+ /* 8 */ EN_SNOWMAN_BODYPART_8,
+ /* 9 */ EN_SNOWMAN_BODYPART_MAX
+} EnSnowmanBodyPart;
+
typedef struct EnSnowman {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
@@ -50,7 +63,7 @@ typedef struct EnSnowman {
/* 0x2A4 */ f32 drawDmgEffScale;
/* 0x2A8 */ Vec3f combinePos;
/* 0x2B4 */ Vec3f snowballPos;
- /* 0x2C0 */ Vec3f bodyPartsPos[9];
+ /* 0x2C0 */ Vec3f bodyPartsPos[EN_SNOWMAN_BODYPART_MAX];
/* 0x32C */ ColliderCylinder collider;
} EnSnowman; // size = 0x378
diff --git a/src/overlays/actors/ovl_En_Snowwd/z_en_snowwd.c b/src/overlays/actors/ovl_En_Snowwd/z_en_snowwd.c
index 48a1cfea0..b99673197 100644
--- a/src/overlays/actors/ovl_En_Snowwd/z_en_snowwd.c
+++ b/src/overlays/actors/ovl_En_Snowwd/z_en_snowwd.c
@@ -5,6 +5,7 @@
*/
#include "z_en_snowwd.h"
+#include "objects/object_snowwd/object_snowwd.h"
#define FLAGS 0x00000000
@@ -15,9 +16,8 @@ void EnSnowwd_Destroy(Actor* thisx, PlayState* play);
void EnSnowwd_Update(Actor* thisx, PlayState* play);
void EnSnowwd_Draw(Actor* thisx, PlayState* play);
-void func_80AF76F0(EnSnowwd* this, PlayState* play);
+void EnSnowwd_Idle(EnSnowwd* this, PlayState* play);
-#if 0
ActorInit En_Snowwd_InitVars = {
ACTOR_EN_SNOWWD,
ACTORCAT_PROP,
@@ -30,25 +30,105 @@ ActorInit En_Snowwd_InitVars = {
(ActorFunc)EnSnowwd_Draw,
};
-// static ColliderCylinderInit sCylinderInit = {
-static ColliderCylinderInit D_80AF7A90 = {
- { COLTYPE_TREE, AT_NONE, AC_ON | AC_HARD | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_CYLINDER, },
- { ELEMTYPE_UNK5, { 0x00000000, 0x00, 0x00 }, { 0x0100020A, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, },
+static ColliderCylinderInit sCylinderInit = {
+ {
+ COLTYPE_TREE,
+ AT_NONE,
+ AC_ON | AC_HARD | AC_TYPE_PLAYER,
+ OC1_ON | OC1_TYPE_ALL,
+ OC2_TYPE_1,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK5,
+ { 0x00000000, 0x00, 0x00 },
+ { 0x0100020A, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_ON,
+ },
{ 18, 60, 0, { 0, 0, 0 } },
};
-#endif
+void EnSnowwd_Init(Actor* thisx, PlayState* play) {
+ EnSnowwd* this = THIS;
-extern ColliderCylinderInit D_80AF7A90;
+ SNOWWD_DROPPED_COLLECTIBLE(thisx) = false;
+ this->actor.home.rot.y = 0;
+ this->timer = 0;
+ this->actor.uncullZoneForward = 4000.0f;
+ this->actor.uncullZoneScale = 2000.0f;
+ this->actor.uncullZoneDownward = 2400.0f;
+ Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
+ Actor_SetScale(&this->actor, 1.0f);
+ this->actionFunc = EnSnowwd_Idle;
+}
-extern UNK_TYPE D_06001AA0;
+void EnSnowwd_Destroy(Actor* thisx, PlayState* play) {
+ EnSnowwd* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Snowwd/EnSnowwd_Init.s")
+ Collider_DestroyCylinder(play, &this->collider);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Snowwd/EnSnowwd_Destroy.s")
+void EnSnowwd_Idle(EnSnowwd* this, PlayState* play) {
+ static Vec3f sAccel = { 0.0f, 0.0f, 0.0f };
+ static Vec3f sVelocity = { 0.0f, -4.0f, 0.0f };
+ static Color_RGBA8 sPrimColor = { 255, 255, 255, 255 };
+ static Color_RGBA8 sEnvColor = { 200, 200, 220, 0 };
+ s32 pad;
+ Actor* thisx = &this->actor;
+ f32 wobbleAmplitude;
+ Vec3f pos;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Snowwd/func_80AF76F0.s")
+ if (this->collider.base.acFlags & AC_HIT) {
+ this->collider.base.acFlags &= ~AC_HIT;
+ Actor_PlaySfx(thisx, NA_SE_IT_REFLECTION_WOOD);
+ }
+ if (thisx->home.rot.y != 0) {
+ this->timer = 21;
+ thisx->home.rot.y = 0;
+ if (!SNOWWD_DROPPED_COLLECTIBLE(&this->actor)) {
+ if (SNOWWD_GET_DROP_TABLE(&this->actor) < 16) {
+ pos = thisx->world.pos;
+ pos.y += 200.0f;
+ Item_DropCollectibleRandom(play, NULL, &pos, SNOWWD_GET_DROP_TABLE(&this->actor) * DROP_TABLE_SIZE);
+ }
+ SNOWWD_DROPPED_COLLECTIBLE(&this->actor) = true;
+ }
+ }
+ if (thisx->xzDistToPlayer < 600.0f) {
+ Collider_UpdateCylinder(thisx, &this->collider);
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Snowwd/EnSnowwd_Update.s")
+ // Wobble from impact and dust particles
+ if (this->timer > 0) {
+ this->timer--;
+ wobbleAmplitude = Math_SinS((this->timer ^ 0xFFFF) * 0x3332) * 250.0f;
+ thisx->shape.rot.x = Math_CosS(thisx->yawTowardsPlayer - thisx->shape.rot.y) * wobbleAmplitude;
+ thisx->shape.rot.z = Math_SinS(thisx->yawTowardsPlayer - thisx->shape.rot.y) * wobbleAmplitude;
+ pos = thisx->world.pos;
+ pos.x += Rand_CenteredFloat(80.0f);
+ pos.y += 100.0f + Rand_ZeroFloat(30.0f);
+ pos.z += Rand_CenteredFloat(80.0f);
+ func_800B0EB0(play, &pos, &sVelocity, &sAccel, &sPrimColor, &sEnvColor, 200, 10, 20);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Snowwd/EnSnowwd_Draw.s")
+void EnSnowwd_Update(Actor* thisx, PlayState* play) {
+ EnSnowwd* this = THIS;
+
+ this->actionFunc(this, play);
+}
+
+void EnSnowwd_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);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gSnowTreeSnowLeavesTex));
+ gSPDisplayList(POLY_OPA_DISP++, gSnowTreeDL);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_En_Snowwd/z_en_snowwd.h b/src/overlays/actors/ovl_En_Snowwd/z_en_snowwd.h
index a83e5d05a..8adb7fcda 100644
--- a/src/overlays/actors/ovl_En_Snowwd/z_en_snowwd.h
+++ b/src/overlays/actors/ovl_En_Snowwd/z_en_snowwd.h
@@ -3,13 +3,17 @@
#include "global.h"
+#define SNOWWD_GET_DROP_TABLE(thisx) (((thisx)->params & 0xF80) >> 7)
+#define SNOWWD_DROPPED_COLLECTIBLE(thisx) ((thisx)->home.rot.z)
+
struct EnSnowwd;
typedef void (*EnSnowwdActionFunc)(struct EnSnowwd*, PlayState*);
typedef struct EnSnowwd {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x50];
+ /* 0x144 */ ColliderCylinder collider;
+ /* 0x190 */ s16 timer;
/* 0x194 */ EnSnowwdActionFunc actionFunc;
} EnSnowwd; // size = 0x198
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 035bc2bfa..8a8be15c4 100644
--- a/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c
+++ b/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c
@@ -9,7 +9,7 @@
#include "objects/object_masterzoora/object_masterzoora.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnSob1*)thisx)
@@ -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->textboxEndType == TEXTBOX_ENDTYPE_10) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_11)) {
return CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A);
}
return CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A) ||
@@ -188,9 +188,9 @@ 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)) {
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_RECOVERED_STOLEN_BOMB_BAG)) {
return 0x649;
} else {
return 0x64A;
@@ -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;
}
@@ -267,34 +270,34 @@ u16 EnSob1_GetWelcome(EnSob1* this, PlayState* play) {
} else if (this->shopType == ZORA_SHOP) {
switch (player->transformation) {
case PLAYER_FORM_HUMAN:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_57_10)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_ZORA_SHOPKEEPER_AS_HUMAN)) {
return 0x12CF;
} else {
- SET_WEEKEVENTREG(WEEKEVENTREG_57_10);
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_ZORA_SHOPKEEPER_AS_HUMAN);
return 0x12CE;
}
case PLAYER_FORM_DEKU:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_57_20)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_ZORA_SHOPKEEPER_AS_DEKU)) {
return 0x12D1;
} else {
- SET_WEEKEVENTREG(WEEKEVENTREG_57_20);
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_ZORA_SHOPKEEPER_AS_DEKU);
return 0x12D0;
}
case PLAYER_FORM_GORON:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_57_40)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_ZORA_SHOPKEEPER_AS_GORON)) {
return 0x12D3;
} else {
- SET_WEEKEVENTREG(WEEKEVENTREG_57_40);
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_ZORA_SHOPKEEPER_AS_GORON);
return 0x12D2;
}
case PLAYER_FORM_ZORA:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_57_80)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_ZORA_SHOPKEEPER_AS_ZORA)) {
return 0x12D5;
} else {
- SET_WEEKEVENTREG(WEEKEVENTREG_57_80);
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_ZORA_SHOPKEEPER_AS_ZORA);
return 0x12D4;
}
@@ -303,33 +306,33 @@ u16 EnSob1_GetWelcome(EnSob1* this, PlayState* play) {
}
} else if (this->shopType == GORON_SHOP) {
if (player->transformation != PLAYER_FORM_GORON) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_58_04)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_GORON_SHOPKEEPER_AS_NON_GORON)) {
return 0xBB9;
} else {
- SET_WEEKEVENTREG(WEEKEVENTREG_58_04);
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_GORON_SHOPKEEPER_AS_NON_GORON);
return 0xBB8;
}
} else {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_58_08)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_GORON_SHOPKEEPER_AS_GORON)) {
return 0xBBB;
} else {
- SET_WEEKEVENTREG(WEEKEVENTREG_58_08);
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_GORON_SHOPKEEPER_AS_GORON);
return 0xBBA;
}
}
} else if (this->shopType == GORON_SHOP_SPRING) {
if (player->transformation != PLAYER_FORM_GORON) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_58_10)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_GORON_SHOPKEEPER_SPRING_AS_NON_GORON)) {
return 0xBBD;
} else {
- SET_WEEKEVENTREG(WEEKEVENTREG_58_10);
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_GORON_SHOPKEEPER_SPRING_AS_NON_GORON);
return 0xBBC;
}
} else {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_58_20)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_GORON_SHOPKEEPER_SPRING_AS_GORON)) {
return 0xBBF;
} else {
- SET_WEEKEVENTREG(WEEKEVENTREG_58_20);
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_GORON_SHOPKEEPER_SPRING_AS_GORON);
return 0xBBE;
}
}
@@ -378,7 +381,7 @@ void EnSob1_SpawnShopItems(EnSob1* this, PlayState* play, ShopItem* shopItem) {
s32 EnSob1_GetObjIndices(EnSob1* this, PlayState* play, s16* objIds) {
if (objIds[1] != OBJECT_ID_MAX) {
- this->unusedObjIndex = Object_GetIndex(&play->objectCtx, objIds[1]);
+ this->unusedObjIndex = Object_GetSlot(&play->objectCtx, objIds[1]);
if (this->unusedObjIndex < 0) {
return false;
}
@@ -386,7 +389,7 @@ s32 EnSob1_GetObjIndices(EnSob1* this, PlayState* play, s16* objIds) {
this->unusedObjIndex = -1;
}
if (objIds[2] != OBJECT_ID_MAX) {
- this->shopkeeperAnimObjIndex = Object_GetIndex(&play->objectCtx, objIds[2]);
+ this->shopkeeperAnimObjIndex = Object_GetSlot(&play->objectCtx, objIds[2]);
if (this->shopkeeperAnimObjIndex < 0) {
return false;
}
@@ -405,23 +408,26 @@ 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;
}
objIds = sObjectIds[this->shopType];
- this->mainObjIndex = Object_GetIndex(&play->objectCtx, objIds[0]);
+ this->mainObjIndex = Object_GetSlot(&play->objectCtx, objIds[0]);
if (this->mainObjIndex < 0) {
Actor_Kill(&this->actor);
return;
@@ -456,11 +462,11 @@ 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);
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
this->drawCursor = 0;
@@ -487,7 +493,7 @@ s32 EnSob1_TestEndInteraction(EnSob1* this, PlayState* play, Input* input) {
s32 EnSob1_TestCancelOption(EnSob1* this, PlayState* play, Input* input) {
if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
this->actionFunc = this->prevActionFunc;
- func_80151938(play, this->items[this->cursorIndex]->actor.textId);
+ Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
return true;
}
return false;
@@ -504,7 +510,7 @@ void EnSob1_SetupStartShopping(PlayState* play, EnSob1* this, u8 skipHello) {
void EnSob1_StartShopping(PlayState* play, EnSob1* this) {
EnSob1_SetupAction(this, EnSob1_FaceShopkeeper);
- func_80151938(play, sFacingShopkeeperTextIds[this->shopType]);
+ Message_ContinueTextbox(play, sFacingShopkeeperTextIds[this->shopType]);
func_8011552C(play, DO_ACTION_DECIDE);
this->stickLeftPrompt.isEnabled = false;
this->stickRightPrompt.isEnabled = true;
@@ -513,14 +519,14 @@ void EnSob1_StartShopping(PlayState* play, EnSob1* this) {
void EnSob1_TalkToShopkeeper(PlayState* play, EnSob1* this) {
EnSob1_SetupAction(this, EnSob1_TalkingToShopkeeper);
this->talkOptionTextId = EnSob1_GetTalkOption(this, play);
- func_80151938(play, this->talkOptionTextId);
+ Message_ContinueTextbox(play, this->talkOptionTextId);
func_8011552C(play, DO_ACTION_DECIDE);
this->stickLeftPrompt.isEnabled = false;
this->stickRightPrompt.isEnabled = false;
}
void EnSob1_SetupLookToShopkeeperFromShelf(PlayState* play, EnSob1* this) {
- play_sound(NA_SE_SY_CURSOR);
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
this->drawCursor = 0;
EnSob1_SetupAction(this, EnSob1_LookToShopkeeperFromShelf);
}
@@ -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;
@@ -565,7 +571,7 @@ void EnSob1_Idle(EnSob1* this, PlayState* play) {
player->actor.world.pos.x <= this->posXZRange.xMax) &&
(player->actor.world.pos.z >= this->posXZRange.zMin &&
player->actor.world.pos.z <= this->posXZRange.zMax)) {
- func_800B8614(&this->actor, play, 400.0f);
+ Actor_OfferTalk(&this->actor, play, 400.0f);
}
if (this->wasTalkedToWhileWalking == true) {
this->wasTalkedToWhileWalking = false;
@@ -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) &&
@@ -643,11 +649,12 @@ void EnSob1_Hello(EnSob1* this, PlayState* play) {
s32 EnSob1_FacingShopkeeperDialogResult(EnSob1* this, PlayState* play) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
EnSob1_TalkToShopkeeper(play, this);
return true;
+
case 1:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
if (this->shopType == BOMB_SHOP) {
EnSob1_BombShopkeeper_EndInteraction(this, play);
} else {
@@ -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) {
@@ -690,7 +697,7 @@ void EnSob1_FaceShopkeeper(EnSob1* this, PlayState* play) {
EnSob1_SetupAction(this, EnSob1_LookToShelf);
func_8011552C(play, DO_ACTION_DECIDE);
this->stickRightPrompt.isEnabled = false;
- play_sound(NA_SE_SY_CURSOR);
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
}
}
}
@@ -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);
}
}
}
@@ -738,9 +745,9 @@ void EnSob1_EndWalk(EnSob1* this, PlayState* play) {
EnSob1_GetDistSqAndOrient(this->path, this->waypoint - 1, &this->actor.world.pos, &distSq), 4,
1000, 1);
this->actor.shape.rot.y = this->actor.world.rot.y;
- Math_ApproachF(&this->actor.speedXZ, 0.5f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 0.5f, 0.2f, 1.0f);
if (distSq < 12.0f) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (animLastFrame == curFrame) {
EnSob1_ChangeAnim(&this->skelAnime, sAnimationInfoBombShopkeeper,
BOMB_SHOPKEEPER_ANIM_SIT_AT_COUNTER_START);
@@ -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) {
@@ -777,11 +784,11 @@ void EnSob1_Walk(EnSob1* this, PlayState* play) {
EnSob1_GetDistSqAndOrient(this->path, this->waypoint, &this->actor.world.pos, &distSq), 4,
1000, 1);
this->actor.shape.rot.y = this->actor.world.rot.y;
- this->actor.speedXZ = 2.0f;
+ this->actor.speed = 2.0f;
if (distSq < SQ(5.0f)) {
this->waypoint++;
if ((this->path->count - 1) < this->waypoint) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
EnSob1_SetupAction(this, EnSob1_EndWalk);
}
}
@@ -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;
@@ -819,7 +826,7 @@ void EnSob1_Walking(EnSob1* this, PlayState* play) {
player->actor.world.pos.x <= this->posXZRange.xMax) &&
(player->actor.world.pos.z >= this->posXZRange.zMin &&
player->actor.world.pos.z <= this->posXZRange.zMax)) {
- func_800B8614(&this->actor, play, 400.0f);
+ Actor_OfferTalk(&this->actor, play, 400.0f);
}
}
}
@@ -828,47 +835,47 @@ 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)) {
- func_80151938(play, 0x647);
+ Message_ContinueTextbox(play, 0x647);
} else {
- func_800B85E0(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
}
}
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);
- func_80151938(play, this->items[this->cursorIndex]->actor.textId);
+ Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
}
@@ -904,14 +911,14 @@ s32 EnSob1_HasPlayerSelectedItem(PlayState* play, EnSob1* this, Input* input) {
if (EnSob1_TestItemSelected(play)) {
if (!item->isOutOfStock) {
this->prevActionFunc = this->actionFunc;
- func_80151938(play, this->items[this->cursorIndex]->choiceTextId);
- play_sound(NA_SE_SY_DECIDE);
+ Message_ContinueTextbox(play, this->items[this->cursorIndex]->choiceTextId);
+ Audio_PlaySfx(NA_SE_SY_DECIDE);
this->stickLeftPrompt.isEnabled = false;
this->stickRightPrompt.isEnabled = false;
this->drawCursor = 0;
EnSob1_SetupAction(this, EnSob1_SelectItem);
} else {
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
}
return true;
}
@@ -938,8 +945,8 @@ void EnSob1_BrowseShelf(EnSob1* this, PlayState* play) {
EnSob1_CursorLeftRight(play, this);
cursorIndex = this->cursorIndex;
if (cursorIndex != prevCursorIndex) {
- func_80151938(play, this->items[cursorIndex]->actor.textId);
- play_sound(NA_SE_SY_CURSOR);
+ Message_ContinueTextbox(play, this->items[cursorIndex]->actor.textId);
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
}
}
}
@@ -949,8 +956,8 @@ void EnSob1_BrowseShelf(EnSob1* this, PlayState* play) {
void EnSob1_SetupBuyItemWithFanfare(PlayState* play, EnSob1* this) {
Player* player = GET_PLAYER(play);
- Actor_PickUp(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f);
- play->msgCtx.msgMode = 0x43;
+ Actor_OfferGetItem(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f);
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
player->stateFlags2 &= ~PLAYER_STATE2_20000000;
Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
@@ -959,12 +966,12 @@ void EnSob1_SetupBuyItemWithFanfare(PlayState* play, EnSob1* this) {
}
void EnSob1_SetupCannotBuy(PlayState* play, EnSob1* this, u16 textId) {
- func_80151938(play, textId);
+ Message_ContinueTextbox(play, textId);
EnSob1_SetupAction(this, EnSob1_CannotBuy);
}
void EnSob1_SetupCanBuy(PlayState* play, EnSob1* this, u16 textId) {
- func_80151938(play, textId);
+ Message_ContinueTextbox(play, textId);
EnSob1_SetupAction(this, EnSob1_CanBuy);
}
@@ -975,10 +982,10 @@ 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();
+ Audio_PlaySfx_MessageDecide();
item2 = this->items[this->cursorIndex];
item2->buyFanfareFunc(play, item2);
EnSob1_SetupBuyItemWithFanfare(play, this);
@@ -986,8 +993,9 @@ void EnSob1_HandleCanBuyItem(PlayState* play, EnSob1* this) {
this->shopItemSelectedTween = 0.0f;
item->boughtFunc(play, item);
break;
+
case CANBUY_RESULT_SUCCESS_2:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
item->buyFunc(play, item);
if ((this->shopType == GORON_SHOP) && (item->actor.params == SI_POTION_RED_5)) {
EnSob1_SetupCanBuy(play, this, 0xBD7);
@@ -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);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
EnSob1_SetupCannotBuy(play, this, sNoRoomTextIds[this->shopType]);
break;
+
case CANBUY_RESULT_NEED_EMPTY_BOTTLE:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
EnSob1_SetupCannotBuy(play, this, sNeedEmptyBottleTextIds[this->shopType]);
break;
+
case CANBUY_RESULT_NEED_RUPEES:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
EnSob1_SetupCannotBuy(play, this, sNeedRupeesTextIds[this->shopType]);
break;
+
case CANBUY_RESULT_CANNOT_GET_NOW:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(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);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
EnSob1_SetupCannotBuy(play, this, sCannotGetNow2TextIds[this->shopType]);
break;
+
case CANBUY_RESULT_NO_ROOM_2:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
EnSob1_SetupCannotBuy(play, this, sNoRoom2TextIds[this->shopType]);
break;
+
case CANBUY_RESULT_ALREADY_HAVE:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
EnSob1_SetupCannotBuy(play, this, 0x658);
break;
+
case CANBUY_RESULT_HAVE_BETTER:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
EnSob1_SetupCannotBuy(play, this, 0x659);
break;
+
+ default:
+ break;
}
}
@@ -1047,10 +1066,11 @@ void EnSob1_SelectItem(EnSob1* this, PlayState* play) {
case 0:
EnSob1_HandleCanBuyItem(play, this);
break;
+
case 1:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
this->actionFunc = this->prevActionFunc;
- func_80151938(play, this->items[this->cursorIndex]->actor.textId);
+ Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
break;
}
}
@@ -1061,7 +1081,7 @@ void EnSob1_CannotBuy(EnSob1* this, PlayState* play) {
if (Message_GetState(&play->msgCtx) == TEXT_STATE_5) {
if (Message_ShouldAdvance(play)) {
this->actionFunc = this->prevActionFunc;
- func_80151938(play, this->items[this->cursorIndex]->actor.textId);
+ Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
}
}
}
@@ -1075,7 +1095,7 @@ void EnSob1_CanBuy(EnSob1* this, PlayState* play) {
item = this->items[this->cursorIndex];
item->restockFunc(play, item);
this->actionFunc = this->prevActionFunc;
- func_80151938(play, this->items[this->cursorIndex]->actor.textId);
+ Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
}
}
@@ -1084,23 +1104,23 @@ void EnSob1_BuyItemWithFanfare(EnSob1* this, PlayState* play) {
this->actor.parent = NULL;
EnSob1_SetupAction(this, EnSob1_SetupItemPurchased);
} else {
- Actor_PickUp(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f);
}
}
void EnSob1_SetupItemPurchased(EnSob1* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(play)) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
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);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
}
}
@@ -1116,7 +1136,7 @@ void EnSob1_ContinueShopping(EnSob1* this, PlayState* play) {
player->stateFlags2 |= PLAYER_STATE2_20000000;
Message_StartTextbox(play, this->welcomeTextId, &this->actor);
EnSob1_SetupStartShopping(play, this, true);
- func_800B85E0(&this->actor, play, 200.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 200.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) {
@@ -1325,15 +1345,15 @@ void EnSob1_Blink(EnSob1* this) {
}
void EnSob1_ChangeObject(EnSob1* this, PlayState* play) {
- gSegments[0x06] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->shopkeeperAnimObjIndex].segment);
+ gSegments[0x06] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->shopkeeperAnimObjIndex].segment);
}
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;
@@ -1343,7 +1363,7 @@ s32 EnSob1_AreObjectsLoaded(EnSob1* this, PlayState* play) {
void EnSob1_ZoraShopkeeper_Init(EnSob1* this, PlayState* play) {
SkelAnime_InitFlex(play, &this->skelAnime, &gZoraSkel, NULL, this->jointTable, this->morphTable, ZORA_LIMB_MAX);
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->shopkeeperAnimObjIndex].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->shopkeeperAnimObjIndex].segment);
Animation_Change(&this->skelAnime, &gZoraShopkeeperAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gZoraShopkeeperAnim),
ANIMMODE_LOOP, 0.0f);
this->actor.draw = EnSob1_ZoraShopkeeper_Draw;
@@ -1352,7 +1372,7 @@ void EnSob1_ZoraShopkeeper_Init(EnSob1* this, PlayState* play) {
void EnSob1_GoronShopkeeper_Init(EnSob1* this, PlayState* play) {
SkelAnime_InitFlex(play, &this->skelAnime, &gGoronSkel, NULL, this->jointTable, this->morphTable, GORON_LIMB_MAX);
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->shopkeeperAnimObjIndex].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->shopkeeperAnimObjIndex].segment);
Animation_Change(&this->skelAnime, &gGoronShopkeeperAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gGoronShopkeeperAnim),
ANIMMODE_LOOP, 0.0f);
this->actor.draw = EnSob1_GoronShopkeeper_Draw;
@@ -1381,13 +1401,13 @@ void EnSob1_InitShop(EnSob1* this, PlayState* play) {
this->actor.world.pos.y += posOffset->y;
this->actor.world.pos.z += posOffset->z;
shopItems = sShops[this->shopType];
- if ((this->shopType == BOMB_SHOP) && CHECK_WEEKEVENTREG(WEEKEVENTREG_33_08)) {
+ if ((this->shopType == BOMB_SHOP) && CHECK_WEEKEVENTREG(WEEKEVENTREG_RECOVERED_STOLEN_BOMB_BAG)) {
sShops[this->shopType][0].shopItemId = SI_BOMB_BAG_30_2;
}
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);
@@ -1462,7 +1482,7 @@ void EnSob1_InitShop(EnSob1* this, PlayState* play) {
this->blinkTimer = 20;
this->eyeTexIndex = 0;
this->blinkFunc = EnSob1_WaitForBlink;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
}
@@ -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 233c6c811..c7006f087 100644
--- a/src/overlays/actors/ovl_En_Ssh/z_en_ssh.c
+++ b/src/overlays/actors/ovl_En_Ssh/z_en_ssh.c
@@ -6,8 +6,9 @@
#include "z_en_ssh.h"
#include "objects/object_ssh/object_ssh.h"
+#include "objects/object_st/object_st.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((EnSsh*)thisx)
@@ -228,7 +229,7 @@ void EnSsh_SetWaitAnimation(EnSsh* this) {
}
void EnSsh_SetReturnAnimation(EnSsh* this) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALTU_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALTU_UP);
EnSsh_ChangeAnim(this, SSH_ANIM_UP);
}
@@ -282,7 +283,7 @@ void EnSsh_SetColliderScale(EnSsh* this, f32 arg1, f32 arg2) {
s32 EnSsh_Damaged(EnSsh* this) {
if ((this->stunTimer == 120) && (this->stateFlags & SSH_STATE_STUNNED)) {
- Actor_SetColorFilter(&this->actor, 0, 200, 0, this->stunTimer);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 200, COLORFILTER_BUFFLAG_OPA, this->stunTimer);
}
if (DECR(this->stunTimer) != 0) {
@@ -297,8 +298,8 @@ s32 EnSsh_Damaged(EnSsh* this) {
this->spinTimer = 30;
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALTU_ROLL);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_VO_ST_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALTU_ROLL);
+ Actor_PlaySfx(&this->actor, NA_SE_VO_ST_ATTACK);
return true;
}
@@ -325,9 +326,9 @@ void EnSsh_Stunned(EnSsh* this, PlayState* play) {
if (this->stunTimer < 30) {
if (this->stunTimer & 1) {
- this->actor.shape.rot.y += 2000;
+ this->actor.shape.rot.y += 0x7D0;
} else {
- this->actor.shape.rot.y -= 2000;
+ this->actor.shape.rot.y -= 0x7D0;
}
}
}
@@ -419,7 +420,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 +429,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();
@@ -477,8 +478,8 @@ s32 EnSsh_CheckHitPlayer(EnSsh* this, PlayState* play) {
this->spinTimer = this->hitTimer;
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALTU_ROLL);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_VO_ST_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALTU_ROLL);
+ Actor_PlaySfx(&this->actor, NA_SE_VO_ST_ATTACK);
play->damagePlayer(play, -8);
@@ -532,8 +533,8 @@ s32 EnSsh_CheckHitBack(EnSsh* this, PlayState* play) {
}
if (this->stunTimer == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_VO_ST_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_PlaySfx(&this->actor, NA_SE_VO_ST_DAMAGE);
}
EnSsh_SetStunned(this);
@@ -553,8 +554,8 @@ s32 EnSsh_CollisionCheck(EnSsh* this, PlayState* play) {
if (play->actorCtx.unk2 != 0) {
this->invincibilityTimer = 8;
if (this->stunTimer == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_VO_ST_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_PlaySfx(&this->actor, NA_SE_VO_ST_DAMAGE);
}
EnSsh_SetStunned(this);
this->stateFlags |= SSH_STATE_STUNNED;
@@ -627,13 +628,15 @@ void EnSsh_SetColliders(EnSsh* this, PlayState* play) {
}
void EnSsh_Init(Actor* thisx, PlayState* play) {
- // @bug - this symbol no longer exists, reads from a random place in object_ssh_Tex_000190 instead
- f32 frameCount = Animation_GetLastFrame(&D_06000304);
+ //! @bug: object_st_Anim_000304 is similar if not idential to object_ssh_Anim_001494.
+ //! They also shared the same offset into their respective object files in OoT.
+ //! However since object_ssh is the one loaded, this ends up reading garbage data from within object_ssh_Tex_000190.
+ f32 frameCount = Animation_GetLastFrame(&object_st_Anim_000304);
s32 pad;
EnSsh* this = THIS;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 30.0f);
- SkelAnime_Init(play, &this->skelAnime, &object_ssh_Skel_006470, NULL, this->jointTable, this->morphtable, 30);
+ SkelAnime_Init(play, &this->skelAnime, &object_ssh_Skel_006470, NULL, this->jointTable, this->morphTable, 30);
Animation_Change(&this->skelAnime, &object_ssh_Anim_001494, 1.0f, 0.0f, frameCount, ANIMMODE_LOOP_INTERP, 0.0f);
this->blureIdx = EnSsh_CreateBlureEffect(play);
EnSsh_InitColliders(this, play);
@@ -654,7 +657,7 @@ void EnSsh_Init(Actor* thisx, PlayState* play) {
this->actor.gravity = 0.0f;
this->initialYaw = this->actor.world.rot.y;
EnSsh_SetupAction(this, EnSsh_Start);
- if (Inventory_GetSkullTokenCount(play->sceneId) >= 30) {
+ if (Inventory_GetSkullTokenCount(play->sceneId) >= SPIDER_HOUSE_TOKENS_REQUIRED) {
Actor_Kill(&this->actor);
}
}
@@ -686,19 +689,19 @@ void EnSsh_Talk(EnSsh* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
switch (play->msgCtx.currentTextId) {
- case 0x904:
- case 0x905:
- case 0x906:
- case 0x908:
- case 0x910:
- case 0x911:
- case 0x912:
- case 0x914:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ case 0x904: // (does not exist)
+ case 0x905: // (does not exist)
+ case 0x906: // (does not exist)
+ case 0x908: // (does not exist)
+ case 0x910: // Help me! I am not a monster, I was cursed this way
+ case 0x911: // Find all in here and defeat them
+ case 0x912: // Don't forget to collect their token
+ case 0x914: // In here, cursed spiders, defeat them to make me normal
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
- default:
- func_801477B4(play);
+ default: // intended case 0x915 from above (914+1)
+ Message_CloseTextbox(play);
this->actionFunc = EnSsh_Idle;
break;
}
@@ -706,15 +709,15 @@ void EnSsh_Talk(EnSsh* this, PlayState* play) {
}
void func_809756D0(EnSsh* this, PlayState* play) {
- u16 phi_a1;
+ u16 nextTextId;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_34_08)) {
- phi_a1 = 0x914;
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_SWAMP_SPIDER_HOUSE_MAN)) {
+ nextTextId = 0x914; // In here, cursed spiders, defeat them to make me normal
} else {
- phi_a1 = 0x910;
- SET_WEEKEVENTREG(WEEKEVENTREG_34_08);
+ nextTextId = 0x910; // Help me! I am not a monster, I was cursed this way
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_SWAMP_SPIDER_HOUSE_MAN);
}
- Message_StartTextbox(play, phi_a1, &this->actor);
+ Message_StartTextbox(play, nextTextId, &this->actor);
}
void EnSsh_Idle(EnSsh* this, PlayState* play) {
@@ -739,7 +742,7 @@ void EnSsh_Idle(EnSsh* this, PlayState* play) {
}
if (DECR(this->sfxTimer) == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALTU_LAUGH);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALTU_LAUGH);
this->sfxTimer = 64;
}
@@ -747,7 +750,7 @@ void EnSsh_Idle(EnSsh* this, PlayState* play) {
if ((this->unkTimer == 0) && (this->animTimer == 0) && (this->actor.xzDistToPlayer < 100.0f) &&
Player_IsFacingActor(&this->actor, 0x3000, play)) {
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
}
@@ -780,7 +783,7 @@ void EnSsh_Drop(EnSsh* this, PlayState* play) {
EnSsh_SetLandAnimation(this);
EnSsh_SetupAction(this, EnSsh_Land);
} else if (DECR(this->sfxTimer) == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALTU_DOWN);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALTU_DOWN);
this->sfxTimer = 3;
}
}
@@ -849,7 +852,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 +929,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_Ssh/z_en_ssh.h b/src/overlays/actors/ovl_En_Ssh/z_en_ssh.h
index 094c63f7e..8c95ea628 100644
--- a/src/overlays/actors/ovl_En_Ssh/z_en_ssh.h
+++ b/src/overlays/actors/ovl_En_Ssh/z_en_ssh.h
@@ -2,6 +2,8 @@
#define Z_EN_SSH_H
#include "global.h"
+#include "overlays/actors/ovl_En_Si/z_en_si.h"
+#include "overlays/actors/ovl_En_Sth/z_en_sth.h"
struct EnSsh;
@@ -29,7 +31,7 @@ typedef struct EnSsh {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ Vec3s jointTable[30];
- /* 0x23C */ Vec3s morphtable[30];
+ /* 0x23C */ Vec3s morphTable[30];
/* 0x2F0 */ EnSshActionFunc actionFunc;
/* 0x2F4 */ ColliderCylinder collider1[6];
/* 0x4BC */ ColliderJntSph collider2;
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 14e0c1cb5..2c2e20e6a 100644
--- a/src/overlays/actors/ovl_En_St/z_en_st.c
+++ b/src/overlays/actors/ovl_En_St/z_en_st.c
@@ -5,10 +5,13 @@
*/
#include "z_en_st.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "objects/object_st/object_st.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_4000 | ACTOR_FLAG_1000000)
+#define FLAGS \
+ (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_4000 | \
+ ACTOR_FLAG_1000000)
#define THIS ((EnSt*)thisx)
@@ -242,11 +245,11 @@ void func_808A54B0(EnSt* this, PlayState* play) {
if ((this->unk_18C & 1) && (this->actor.colChkInfo.health != 0)) {
OPEN_DISPS(play->state.gfxCtx);
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->unk_2C0].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[this->unk_2C0].segment);
- gSPSegment(POLY_XLU_DISP++, 0x06, play->objectCtx.status[this->unk_2C0].segment);
+ gSPSegment(POLY_XLU_DISP++, 0x06, play->objectCtx.slots[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);
@@ -271,7 +274,7 @@ s32 func_808A576C(EnSt* this) {
s32 i;
s16 phi_s2 = (s16)((s16)(Rand_ZeroOne() * 1000.0f) % 12) * 0x1555;
- for (i = 0; i < ARRAY_COUNT(this->unk_31C); i++, phi_s2 += 0x1555) {
+ for (i = 0; i < ENST_BODYPART_MAX; i++, phi_s2 += 0x1555) {
if (this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
this->unk_31C[i] = (Rand_ZeroOne() * 16.0f) + 8.0f;
} else {
@@ -281,46 +284,46 @@ s32 func_808A576C(EnSt* this) {
this->drawDmgEffFrozenSteamScales[i] = 0.90000004f;
if ((this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FIRE) || (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_BLUE_FIRE)) {
- this->unk_358[i].y = ((Rand_ZeroOne() - 0.5f) * 40.0f) - 10.0f;
+ this->bodyPartsPos[i].y = ((Rand_ZeroOne() - 0.5f) * 40.0f) - 10.0f;
} else {
- this->unk_358[i].y = ((Rand_ZeroOne() - 0.5f) * 30.0f) + 10.0f;
+ this->bodyPartsPos[i].y = ((Rand_ZeroOne() - 0.5f) * 30.0f) + 10.0f;
}
- this->unk_358[i].x = Math_SinS(phi_s2) * 18.0f;
- this->unk_358[i].z = Math_CosS(phi_s2) * 18.0f;
+ this->bodyPartsPos[i].x = Math_SinS(phi_s2) * 18.0f;
+ this->bodyPartsPos[i].z = Math_CosS(phi_s2) * 18.0f;
}
this->unk_31A = 1;
return false;
}
-s32 func_808A5988(EnSt* this, PlayState* play, s32 arg2) {
- s32 ret = false;
+s32 func_808A5988(EnSt* this, PlayState* play, s32 bodyPartIndex) {
+ s32 ret = 0;
u8 drawDmgEffType;
- Vec3f limbPos[1];
+ Vec3f bodyPartPos[1];
f32 drawDmgEffAlpha;
- if (arg2 < this->unk_31A) {
- if (this->unk_31C[arg2] != 0) {
- drawDmgEffAlpha = (f32)this->unk_31C[arg2] / this->unk_334[arg2];
+ if (bodyPartIndex < this->unk_31A) {
+ if (this->unk_31C[bodyPartIndex] != 0) {
+ drawDmgEffAlpha = (f32)this->unk_31C[bodyPartIndex] / this->unk_334[bodyPartIndex];
drawDmgEffType = this->drawDmgEffType;
- Math_ApproachF(&this->drawDmgEffFrozenSteamScales[arg2], 0.6f, 0.3f, 0.5f);
- Math_Vec3f_Copy(&limbPos[0], &this->actor.world.pos);
+ Math_ApproachF(&this->drawDmgEffFrozenSteamScales[bodyPartIndex], 0.6f, 0.3f, 0.5f);
+ Math_Vec3f_Copy(&bodyPartPos[0], &this->actor.world.pos);
- limbPos[0].x += this->unk_358[arg2].x;
- limbPos[0].y += this->unk_358[arg2].y;
- limbPos[0].z += this->unk_358[arg2].z;
+ bodyPartPos[0].x += this->bodyPartsPos[bodyPartIndex].x;
+ bodyPartPos[0].y += this->bodyPartsPos[bodyPartIndex].y;
+ bodyPartPos[0].z += this->bodyPartsPos[bodyPartIndex].z;
if (drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
- if ((this->unk_334[arg2] - this->unk_31C[arg2]) < 20) {
+ if ((this->unk_334[bodyPartIndex] - this->unk_31C[bodyPartIndex]) < 20) {
drawDmgEffType = ACTOR_DRAW_DMGEFF_FROZEN_SFX;
}
drawDmgEffAlpha = 1.0f;
}
- Actor_DrawDamageEffects(play, &this->actor, limbPos, ARRAY_COUNT(limbPos), 0.6f,
- this->drawDmgEffFrozenSteamScales[arg2], drawDmgEffAlpha, drawDmgEffType);
- ret = true;
+ Actor_DrawDamageEffects(play, &this->actor, bodyPartPos, ARRAY_COUNT(bodyPartPos), 0.6f,
+ this->drawDmgEffFrozenSteamScales[bodyPartIndex], drawDmgEffAlpha, drawDmgEffType);
+ ret = 1;
}
}
return ret;
@@ -330,14 +333,14 @@ void func_808A5AF8(EnSt* this, PlayState* play) {
Vec3f sp54;
s32 i;
- for (i = 0; i < ARRAY_COUNT(this->unk_358); i++) {
+ for (i = 0; i < ENST_BODYPART_MAX; i++) {
Math_Vec3f_Copy(&sp54, &this->actor.world.pos);
- sp54.x += this->unk_358[i].x;
- sp54.y += this->unk_358[i].y;
- sp54.z += this->unk_358[i].z;
- Math_Vec3f_Copy(&this->unk_358[i], &sp54);
+ sp54.x += this->bodyPartsPos[i].x;
+ sp54.y += this->bodyPartsPos[i].y;
+ sp54.z += this->bodyPartsPos[i].z;
+ Math_Vec3f_Copy(&this->bodyPartsPos[i], &sp54);
}
- Actor_SpawnIceEffects(play, &this->actor, this->unk_358, 12, 3, 0.1f, 0.3f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, ENST_BODYPART_MAX, 3, 0.1f, 0.3f);
}
s16 func_808A5BEC(EnSt* this) {
@@ -348,7 +351,7 @@ s16 func_808A5BEC(EnSt* this) {
} else {
ret = this->actor.yawTowardsPlayer;
if (DECR(this->unk_30E) == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALTU_ROLL);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALTU_ROLL);
this->unk_18C ^= 2;
this->unk_310 = 8;
if (this->unk_18C & 1) {
@@ -456,7 +459,7 @@ void func_808A60E0(EnSt* this) {
if (sp1C == 1.0f) {
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
- Actor_PlaySfxAtPos(&this->actor, sfxId);
+ Actor_PlaySfx(&this->actor, sfxId);
}
this->unk_2D4 = (1.0f - sp1C) * sp20 * this->unk_2C8;
@@ -546,7 +549,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;
@@ -557,7 +560,7 @@ s32 func_808A6580(EnSt* this, PlayState* play) {
if (this->collider3.base.acFlags & AC_HIT) {
if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
// clang-format off
- for (i = 0; i < ARRAY_COUNT(this->unk_31C); i++) { this->unk_31C[i] = 0; }
+ for (i = 0; i < ENST_BODYPART_MAX; i++) { this->unk_31C[i] = 0; }
// clang-format on
this->unk_318 = 0;
@@ -565,7 +568,7 @@ s32 func_808A6580(EnSt* this, PlayState* play) {
if (this->actor.colChkInfo.damageEffect == 4) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->actor.world.pos.x, this->actor.world.pos.y,
- this->actor.world.pos.z, 0, 0, 0, CLEAR_TAG_LARGE_LIGHT_RAYS);
+ this->actor.world.pos.z, 0, 0, 0, CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
}
this->collider3.base.acFlags &= ~AC_HIT;
}
@@ -575,35 +578,38 @@ s32 func_808A6580(EnSt* this, PlayState* play) {
this->collider4.base.acFlags &= ~AC_HIT;
if (this->actor.colChkInfo.damageEffect == 4) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->actor.world.pos.x, this->actor.world.pos.y,
- this->actor.world.pos.z, 0, 0, 0, CLEAR_TAG_LARGE_LIGHT_RAYS);
+ this->actor.world.pos.z, 0, 0, 0, CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
}
if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
// clang-format off
- for (i = 0; i < ARRAY_COUNT(this->unk_31C); i++) { this->unk_31C[i] = 0; }
+ for (i = 0; i < ENST_BODYPART_MAX; i++) { this->unk_31C[i] = 0; }
// clang-format on
this->unk_318 = 0;
} else if (func_808A61F4(this)) {
switch (this->actor.colChkInfo.damageEffect) {
case 1:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
this->unk_312 = 40;
- Actor_SetColorFilter(&this->actor, 0, 200, 0, this->unk_312);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 200, COLORFILTER_BUFFLAG_OPA,
+ this->unk_312);
break;
case 5:
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_SMALL;
this->unk_312 = 40;
func_808A576C(this);
- Actor_SetColorFilter(&this->actor, 0, 200, 0, this->unk_312);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 200, COLORFILTER_BUFFLAG_OPA,
+ this->unk_312);
break;
default:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALTU_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALTU_DAMAGE);
this->unk_314 = 20;
this->unk_312 = 0;
- Actor_SetColorFilter(&this->actor, 0x4000, 200, 0, this->unk_314);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 200, COLORFILTER_BUFFLAG_OPA,
+ this->unk_314);
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 1);
this->unk_18C |= 8;
this->actionFunc = func_808A6D84;
@@ -611,13 +617,13 @@ s32 func_808A6580(EnSt* this, PlayState* play) {
break;
}
} else {
- if (ENST_GET_3F(&this->actor) != ENST_3F_63) {
- Flags_SetSwitch(play, ENST_GET_3F(&this->actor));
+ if (ENST_GET_SWITCH_FLAG(&this->actor) != 0x3F) {
+ Flags_SetSwitch(play, ENST_GET_SWITCH_FLAG(&this->actor));
}
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EN_STALTU_DEAD);
Enemy_StartFinishingBlow(play, &this->actor);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
switch (this->actor.colChkInfo.damageEffect) {
case 4:
@@ -652,7 +658,7 @@ s32 func_808A6580(EnSt* this, PlayState* play) {
}
this->unk_314 = 20;
this->unk_312 = 0;
- Actor_SetColorFilter(&this->actor, 0x4000, 200, 0, this->unk_314);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 200, COLORFILTER_BUFFLAG_OPA, this->unk_314);
ret = true;
}
this->unk_310 = 0;
@@ -663,7 +669,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_PlaySfxAtPos(&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;
@@ -699,7 +705,7 @@ void func_808A6A78(EnSt* this, PlayState* play) {
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
if (ENST_GET_1C0(&this->actor) == ENST_1C0_1) {
- this->actor.flags |= ACTOR_FLAG_80;
+ this->actor.flags |= ACTOR_FLAG_REACT_TO_LENS;
}
Actor_SetScale(&this->actor, 0.04f);
@@ -753,16 +759,16 @@ void func_808A6D84(EnSt* this, PlayState* play) {
void func_808A6E24(EnSt* this, PlayState* play) {
s32 i;
- s32 count = 0;
+ s32 bodyPartsCount = 0;
if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
- for (i = 0; i < ARRAY_COUNT(this->unk_31C); i++) {
+ for (i = 0; i < ENST_BODYPART_MAX; i++) {
if (DECR(this->unk_31C[i]) == 0) {
- count++;
+ bodyPartsCount++;
}
}
- if (count == ARRAY_COUNT(this->unk_31C)) {
+ if (bodyPartsCount == ENST_BODYPART_MAX) {
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 7);
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_BLUE_FIRE;
this->unk_2CC = 0.0f;
@@ -776,15 +782,15 @@ void func_808A6E24(EnSt* this, PlayState* play) {
this->unk_2CC = 0.0f;
this->unk_2D4 = 0.0f;
} else {
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->actor.shape.yOffset = 400.0f;
this->actor.world.rot.x = 0x4000;
this->actor.shape.rot.x = this->actor.world.rot.x;
this->unk_2D0 = this->actor.velocity.y = fabsf(this->actor.velocity.y) * 0.6f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if ((s32)this->unk_2D0 != 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EYEGOLE_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_ATTACK);
} else {
this->actor.velocity.y = 0.0f;
this->actionFunc = func_808A701C;
@@ -807,20 +813,20 @@ void func_808A6E24(EnSt* this, PlayState* play) {
void func_808A701C(EnSt* this, PlayState* play) {
s32 i;
- s32 count = 0;
+ s32 bodyPartsCount = 0;
if (this->unk_18C & 0x40) {
if (DECR(this->unk_318) == 0) {
this->unk_18C |= 0x20;
}
- for (i = 0; i < ARRAY_COUNT(this->unk_31C); i++) {
+ for (i = 0; i < ENST_BODYPART_MAX; i++) {
if (DECR(this->unk_31C[i]) == 0) {
- count++;
+ bodyPartsCount++;
}
}
- if (count == ARRAY_COUNT(this->unk_31C)) {
+ if (bodyPartsCount == ENST_BODYPART_MAX) {
Item_DropCollectibleRandom(play, NULL, &this->actor.world.pos, 0);
Actor_Kill(&this->actor);
}
@@ -836,8 +842,8 @@ void func_808A701C(EnSt* this, PlayState* play) {
void EnSt_Init(Actor* thisx, PlayState* play) {
EnSt* this = THIS;
- this->unk_2C0 = Object_GetIndex(&play->objectCtx, GAMEPLAY_KEEP);
- if (((ENST_GET_3F(&this->actor) != ENST_3F_63) && Flags_GetSwitch(play, ENST_GET_3F(&this->actor))) ||
+ this->unk_2C0 = Object_GetSlot(&play->objectCtx, GAMEPLAY_KEEP);
+ if (((ENST_GET_SWITCH_FLAG(&this->actor) != 0x3F) && Flags_GetSwitch(play, ENST_GET_SWITCH_FLAG(&this->actor))) ||
(this->unk_2C0 < 0)) {
Actor_Kill(&this->actor);
return;
@@ -864,8 +870,8 @@ void EnSt_Update(Actor* thisx, PlayState* play) {
return;
}
- if (!(this->actor.flags & ACTOR_FLAG_80) && func_808A6A3C(this)) {
- this->actor.flags |= ACTOR_FLAG_80;
+ if (!(this->actor.flags & ACTOR_FLAG_REACT_TO_LENS) && func_808A6A3C(this)) {
+ this->actor.flags |= ACTOR_FLAG_REACT_TO_LENS;
}
if (func_808A6580(this, play)) {
@@ -875,7 +881,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;
@@ -888,7 +894,7 @@ void EnSt_Update(Actor* thisx, PlayState* play) {
s32 i;
// clang-format off
- for (i = 0; i < ARRAY_COUNT(this->unk_31C); i++) { this->unk_31C[i] = 0; }
+ for (i = 0; i < ENST_BODYPART_MAX; i++) { this->unk_31C[i] = 0; }
// clang-format on
}
}
@@ -914,18 +920,18 @@ s32 EnSt_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po
void func_808A7478(Actor* thisx, PlayState* play) {
EnSt* this = THIS;
- s32 i;
+ s32 bodyPartIndex;
s32 count;
if (!(this->unk_18C & 0x20)) {
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);
}
@@ -933,8 +939,8 @@ void func_808A7478(Actor* thisx, PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx);
}
- for (i = 0, count = 0; i < ARRAY_COUNT(this->unk_31C); i++) {
- count += func_808A5988(this, play, i);
+ for (bodyPartIndex = 0, count = 0; bodyPartIndex < ENST_BODYPART_MAX; bodyPartIndex++) {
+ count += func_808A5988(this, play, bodyPartIndex);
}
if (count != 0) {
diff --git a/src/overlays/actors/ovl_En_St/z_en_st.h b/src/overlays/actors/ovl_En_St/z_en_st.h
index 5c63a9664..aab1204aa 100644
--- a/src/overlays/actors/ovl_En_St/z_en_st.h
+++ b/src/overlays/actors/ovl_En_St/z_en_st.h
@@ -7,12 +7,27 @@ struct EnSt;
typedef void (*EnStActionFunc)(struct EnSt*, PlayState*);
-#define ENST_GET_3F(thisx) (((thisx)->params & 0x3F) & 0xFF)
+#define ENST_GET_SWITCH_FLAG(thisx) (((thisx)->params & 0x3F) & 0xFF)
#define ENST_GET_1C0(thisx) ((((thisx)->params & 0x1C0) >> 6) & 0xFF)
-#define ENST_3F_63 63
#define ENST_1C0_1 1
+typedef enum EnStBodyPart {
+ /* 0 */ ENST_BODYPART_0,
+ /* 1 */ ENST_BODYPART_1,
+ /* 2 */ ENST_BODYPART_2,
+ /* 3 */ ENST_BODYPART_3,
+ /* 4 */ ENST_BODYPART_4,
+ /* 5 */ ENST_BODYPART_5,
+ /* 6 */ ENST_BODYPART_6,
+ /* 7 */ ENST_BODYPART_7,
+ /* 8 */ ENST_BODYPART_8,
+ /* 9 */ ENST_BODYPART_9,
+ /* 10 */ ENST_BODYPART_10,
+ /* 11 */ ENST_BODYPART_11,
+ /* 12 */ ENST_BODYPART_MAX
+} EnStBodyPart;
+
typedef struct EnSt {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
@@ -39,11 +54,11 @@ typedef struct EnSt {
/* 0x316 */ s16 unk_316;
/* 0x318 */ s16 unk_318;
/* 0x31A */ s16 unk_31A;
- /* 0x31C */ s16 unk_31C[12];
- /* 0x334 */ s16 unk_334[12];
+ /* 0x31C */ s16 unk_31C[ENST_BODYPART_MAX];
+ /* 0x334 */ s16 unk_334[ENST_BODYPART_MAX];
/* 0x34C */ f32 unk_34C;
/* 0x350 */ UNK_TYPE1 unk_350[0x8];
- /* 0x358 */ Vec3f unk_358[12];
+ /* 0x358 */ Vec3f bodyPartsPos[ENST_BODYPART_MAX];
/* 0x3E8 */ Vec3s jointTable[30];
/* 0x49C */ Vec3s morphTable[30];
} EnSt; // size = 0x550
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 5d1bd1471..daf58065f 100644
--- a/src/overlays/actors/ovl_En_Sth/z_en_sth.c
+++ b/src/overlays/actors/ovl_En_Sth/z_en_sth.c
@@ -1,31 +1,31 @@
/*
* File: z_en_sth.c
* Overlay: ovl_En_Sth
- * Description: Guy looking at moon in South Clock Town
+ * Description: Guy looking at moon in South Clock Town,
+ * And the Cured Swamp Spider House man who gives you Mask of Truth
+ * (the cursed version is EnSsh)
+ * And the man who wants to buy Oceanside Spider House from you with rupees or Wallet
*/
#include "z_en_sth.h"
-#include "objects/object_sth/object_sth.h"
-#include "objects/object_ahg/object_ahg.h"
-#include "objects/object_mask_truth/object_mask_truth.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnSth*)thisx)
void EnSth_Init(Actor* thisx, PlayState* play);
void EnSth_Destroy(Actor* thisx, PlayState* play);
-void EnSth_Update(Actor* thisx, PlayState* play);
+void EnSth_UpdateWaitForObject(Actor* thisx, PlayState* play);
-void func_80B67208(EnSth* this, PlayState* play);
-void func_80B67540(EnSth* this, PlayState* play);
-void func_80B677BC(EnSth* this, PlayState* play);
-void func_80B678A8(EnSth* this, PlayState* play);
-void func_80B67958(EnSth* this, PlayState* play);
-void func_80B67C1C(EnSth* this, PlayState* play);
-void func_80B67DA0(EnSth* this, PlayState* play);
-void func_80B680A8(Actor* thisx, PlayState* play);
-void func_80B6849C(Actor* thisx, PlayState* play);
+void EnSth_PanicIdle(EnSth* this, PlayState* play);
+void EnSth_HandleOceansideSpiderHouseConversation(EnSth* this, PlayState* play);
+void EnSth_OceansideSpiderHouseIdle(EnSth* this, PlayState* play);
+void EnSth_MoonLookingIdle(EnSth* this, PlayState* play);
+void EnSth_DefaultIdle(EnSth* this, PlayState* play);
+void EnSth_HandleSwampSpiderHouseConversation(EnSth* this, PlayState* play);
+void EnSth_SwampSpiderHouseIdle(EnSth* this, PlayState* play);
+void EnSth_Update(Actor* thisx, PlayState* play);
+void EnSth_Draw(Actor* thisx, PlayState* play);
ActorInit En_Sth_InitVars = {
ACTOR_EN_STH,
@@ -35,7 +35,7 @@ ActorInit En_Sth_InitVars = {
sizeof(EnSth),
(ActorFunc)EnSth_Init,
(ActorFunc)EnSth_Destroy,
- (ActorFunc)EnSth_Update,
+ (ActorFunc)EnSth_UpdateWaitForObject,
(ActorFunc)NULL,
};
@@ -61,21 +61,48 @@ static ColliderCylinderInit sCylinderInit = {
{ 30, 40, 0, { 0, 0, 0 } },
};
-AnimationHeader* D_80B6D1C8[] = {
- &ovl_En_Sth_Anim_003F50, &ovl_En_Sth_Anim_0045B4, &ovl_En_Sth_Anim_004CC0, &ovl_En_Sth_Anim_00533C,
- &ovl_En_Sth_Anim_0059B8, &ovl_En_Sth_Anim_005E40, &ovl_En_Sth_Anim_006354, &ovl_En_Sth_Anim_00645C,
+typedef enum {
+ /* 0 */ STH_ANIM_SIGNALLING, // default, waving arms at you from telescope, OOT: cured happy animation
+ /* 1 */ STH_ANIM_BENDING_DOWN, // default anim of cured spider house, but never seen before wait overrides it
+ /* 2 */ STH_ANIM_TALK,
+ /* 3 */ STH_ANIM_WAIT,
+ /* 4 */ STH_ANIM_LOOK_UP, // South Clock Town, looking at moon
+ /* 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
+} EnSthAnimation;
+
+static AnimationHeader* sAnimationInfo[] = {
+ &gEnSthSignalAnim, &gEnSthBendDownAnim, &gEnSthTalkWithHandUpAnim, &gEnSthWaitAnim,
+ &gEnSthLookUpAnim, &gEnSthLookAroundAnim, &gEnSthPleadAnim, &gEnSthPanicAnim,
};
-u16 D_80B6D1E8[] = { 0x1144, 0x1145, 0x1146 };
+// three slightly different variants of "Only a little time left, oh goddess please save me"
+static u16 sSthOceanspiderhousePanicText[] = { 0x1144, 0x1145, 0x1146 };
-u16 D_80B6D1F0[] = { 0x1139, 0x113E, 0x1143 };
+static u16 sSthFirstOceansideSpiderHouseGreet2TextIds[] = {
+ 0x1139, // I thought I heard noises... I'm glad I found it early
+ 0x113E, // I had no idea this place was here, perhaps it can keep me safe
+ 0x1143 // There's no time we have to hide!
+};
-u16 D_80B6D1F8[] = { 0x1132, 0x113A, 0x113F };
+static u16 sSthFirstOceansideSpiderHouseGreet1TextIds[] = {
+ 0x1132, // I thought I heard some noise.. is this some sort of underground shelter?
+ 0x113A, // I had no idea there was a basement here..
+ 0x113F // I heard loud noises.. I never thought I'd find a place like this..
+};
-Vec3f D_80B6D200 = { 700.0f, 400.0f, 0.0f };
+static Vec3f sFocusOffset = { 700.0f, 400.0f, 0.0f };
-Color_RGB8 D_80B6D20C[] = {
- { 190, 110, 0 }, { 0, 180, 110 }, { 0, 255, 0x50 }, { 255, 160, 60 }, { 190, 230, 250 }, { 240, 230, 120 },
+// Sth is hardcoded to only use element [1].
+static Color_RGB8 sShirtColors[] = {
+ { 190, 110, 0 }, // darker orange
+ { 0, 180, 110 }, // green
+ { 0, 255, 80 }, // lime green
+ { 255, 160, 60 }, // brighter orange
+ { 190, 230, 250 }, // white
+ { 240, 230, 120 }, // pale yellow
};
void EnSth_Init(Actor* thisx, PlayState* play) {
@@ -83,82 +110,88 @@ void EnSth_Init(Actor* thisx, PlayState* play) {
EnSth* this = THIS;
s32 objectId;
- if (ENSTH_GET_100(&this->actor)) {
- objectId = Object_GetIndex(&play->objectCtx, OBJECT_AHG);
+ // this actor can draw two separate bodies that use different objects
+ if (STH_GET_SWAMP_BODY(&this->actor)) {
+ objectId = Object_GetSlot(&play->objectCtx, OBJECT_AHG);
} else {
- objectId = Object_GetIndex(&play->objectCtx, OBJECT_STH);
+ objectId = Object_GetSlot(&play->objectCtx, OBJECT_STH);
}
- this->unk_29E = objectId;
- this->unk_29F = Object_GetIndex(&play->objectCtx, OBJECT_MASK_TRUTH);
+ this->mainObjectId = objectId;
+ this->maskOfTruthObjectId = Object_GetSlot(&play->objectCtx, OBJECT_MASK_TRUTH);
Actor_SetScale(&this->actor, 0.01f);
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 36.0f);
- this->unk_29C = 0;
- this->unk_29A = 8;
+ this->sthFlags = 0; // clear
+ this->animIndex = STH_ANIM_START;
this->actor.terminalVelocity = -9.0f;
this->actor.gravity = -1.0f;
- switch (ENSTH_GET_F(&this->actor)) {
- case ENSTH_F_1:
+ switch (STH_GET_TYPE(&this->actor)) {
+ case STH_TYPE_UNUSED_1:
if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
this->actor.flags |= (ACTOR_FLAG_10 | ACTOR_FLAG_20);
- this->actionFunc = func_80B67958;
+ this->actionFunc = EnSth_DefaultIdle;
} else {
Actor_Kill(&this->actor);
return;
}
break;
- case ENSTH_F_2:
- if (Inventory_GetSkullTokenCount(play->sceneId) >= 30) {
- this->actionFunc = func_80B67DA0;
+ case STH_TYPE_SWAMP_SPIDER_HOUSE_CURED:
+ if (Inventory_GetSkullTokenCount(play->sceneId) >= SPIDER_HOUSE_TOKENS_REQUIRED) {
+ this->actionFunc = EnSth_SwampSpiderHouseIdle;
} else {
Actor_Kill(&this->actor);
}
this->actor.textId = 0;
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_34_40) || !CHECK_WEEKEVENTREG(WEEKEVENTREG_34_08)) {
- this->unk_29C |= 1;
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_MASK_OF_TRUTH) ||
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_SWAMP_SPIDER_HOUSE_MAN)) {
+ this->sthFlags |= STH_FLAG_DRAW_MASK_OF_TRUTH;
}
break;
- case ENSTH_F_3:
- if ((gSaveContext.save.skullTokenCount & 0xFFFF) >= 30) {
+ case STH_TYPE_MOON_LOOKING: // South Clock Town
+ if ((gSaveContext.save.saveInfo.skullTokenCount & 0xFFFF) >= SPIDER_HOUSE_TOKENS_REQUIRED) {
Actor_Kill(&this->actor);
return;
}
- this->actionFunc = func_80B678A8;
- this->unk_29C |= 8;
- this->actor.targetMode = 3;
+
+ this->actionFunc = EnSth_MoonLookingIdle;
+ this->sthFlags |= STH_FLAG_DISABLE_HEAD_TRACK;
+ this->actor.targetMode = TARGET_MODE_3;
this->actor.uncullZoneForward = 800.0f;
break;
- case ENSTH_F_4:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_13_20)) {
+ case STH_TYPE_OCEANSIDE_SPIDER_HOUSE_GREET:
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_OCEANSIDE_SPIDER_HOUSE_BUYER_MOVED_IN)) {
+ // The player has already exited the house after complete; EnSth has moved deeper into the house.
Actor_Kill(&this->actor);
return;
}
this->actor.textId = 0;
- this->actionFunc = func_80B677BC;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_13_80)) {
- this->unk_29C |= 2;
+ this->actionFunc = EnSth_OceansideSpiderHouseIdle;
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_OCEANSIDE_SPIDER_HOUSE_COLLECTED_REWARD)) {
+ this->sthFlags |= STH_FLAG_OCEANSIDE_SPIDER_HOUSE_GREET;
}
break;
- case ENSTH_F_5:
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_13_20) || (Inventory_GetSkullTokenCount(play->sceneId) < 30)) {
+ case STH_TYPE_OCEANSIDE_SPIDER_HOUSE_PANIC:
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_OCEANSIDE_SPIDER_HOUSE_BUYER_MOVED_IN) ||
+ (Inventory_GetSkullTokenCount(play->sceneId) < SPIDER_HOUSE_TOKENS_REQUIRED)) {
+ // Has not moved in, and has not completed the house; do NOT spawn yet.
Actor_Kill(&this->actor);
return;
}
- this->actionFunc = func_80B67208;
+ this->actionFunc = EnSth_PanicIdle;
this->actor.textId = 0;
- this->unk_29C |= 8;
+ this->sthFlags |= STH_FLAG_DISABLE_HEAD_TRACK;
break;
default:
- this->actionFunc = func_80B67958;
+ this->actionFunc = EnSth_DefaultIdle;
break;
}
}
@@ -169,142 +202,144 @@ void EnSth_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyCylinder(play, &this->collider);
}
-s32 func_80B6703C(EnSth* this, PlayState* play) {
+s32 EnSth_CanSpeakToPlayer(EnSth* this, PlayState* play) {
if ((this->actor.xzDistToPlayer < 100.0f) && Player_IsFacingActor(&this->actor, 0x3000, play) &&
Actor_IsFacingPlayer(&this->actor, 0x2000)) {
return true;
- }
- return false;
-}
-
-void func_80B670A4(EnSth* this, s16 arg1) {
- if ((arg1 >= 0) && (arg1 < ARRAY_COUNT(D_80B6D1C8)) && (arg1 != this->unk_29A)) {
- Animation_Change(&this->skelAnime, D_80B6D1C8[arg1], 1.0f, 0.0f, Animation_GetLastFrame(D_80B6D1C8[arg1]),
- ANIMMODE_LOOP, -5.0f);
- this->unk_29A = arg1;
+ } else {
+ return false;
}
}
-void func_80B67148(EnSth* this, PlayState* play) {
+void EnSth_ChangeAnim(EnSth* this, s16 animIndex) {
+ if ((animIndex >= 0) && (animIndex < ARRAY_COUNT(sAnimationInfo)) && (animIndex != this->animIndex)) {
+ Animation_Change(&this->skelAnime, sAnimationInfo[animIndex], 1.0f, 0.0f,
+ Animation_GetLastFrame(sAnimationInfo[animIndex]), ANIMMODE_LOOP, -5.0f);
+ this->animIndex = animIndex;
+ }
+}
+
+void EnSth_GetInitialPanicText(EnSth* this, PlayState* play) {
s32 day = CURRENT_DAY - 1;
- u16 val;
+ u16 nextTextId;
if (day < 0) {
day = 0;
}
- val = D_80B6D1E8[day];
+ nextTextId = sSthOceanspiderhousePanicText[day];
- Message_StartTextbox(play, val, &this->actor);
+ Message_StartTextbox(play, nextTextId, &this->actor);
}
-void func_80B671A0(EnSth* this, PlayState* play) {
+void EnSth_HandlePanicConversation(EnSth* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- this->actionFunc = func_80B67208;
- func_801477B4(play);
+ this->actionFunc = EnSth_PanicIdle;
+ Message_CloseTextbox(play);
}
}
-void func_80B67208(EnSth* this, PlayState* play) {
+void EnSth_PanicIdle(EnSth* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- func_80B67148(this, play);
- this->actionFunc = func_80B671A0;
+ EnSth_GetInitialPanicText(this, play);
+ this->actionFunc = EnSth_HandlePanicConversation;
} else if ((this->actor.xzDistToPlayer < 100.0f) && Player_IsFacingActor(&this->actor, 0x3000, play)) {
- func_800B8614(&this->actor, play, 110.0f);
+ Actor_OfferTalk(&this->actor, play, 110.0f);
}
}
-void func_80B672A4(EnSth* this, PlayState* play) {
- u16 sp1E;
+void EnSth_GetInitialOceansideSpiderHouseText(EnSth* this, PlayState* play) {
+ u16 nextTextId;
s32 day = CURRENT_DAY - 1;
if (day < 0) {
day = 0;
}
- if (this->unk_29C & 2) {
+ if (this->sthFlags & STH_FLAG_OCEANSIDE_SPIDER_HOUSE_GREET) {
s32 pad;
- sp1E = D_80B6D1F0[day];
+ nextTextId = sSthFirstOceansideSpiderHouseGreet2TextIds[day];
if (day == 2) {
- func_80B670A4(this, 5);
+ EnSth_ChangeAnim(this, STH_ANIM_LOOK_AROUND);
}
} else {
- sp1E = D_80B6D1F8[day];
+ nextTextId = sSthFirstOceansideSpiderHouseGreet1TextIds[day];
}
- Message_StartTextbox(play, sp1E, &this->actor);
+ Message_StartTextbox(play, nextTextId, &this->actor);
}
-void func_80B67348(EnSth* this, PlayState* play) {
- u16 phi_a1;
+void EnSth_PostOceanspiderhouseReward(EnSth* this, PlayState* play) {
+ u16 nextTextId;
SkelAnime_Update(&this->skelAnime);
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actor.flags &= ~ACTOR_FLAG_10000;
- this->actionFunc = func_80B67540;
+ this->actionFunc = EnSth_HandleOceansideSpiderHouseConversation;
- switch (this->actor.home.rot.z) {
- case 8:
- case 9:
- phi_a1 = 0x1137;
+ switch (STH_GI_ID(&this->actor)) {
+ case GI_WALLET_ADULT:
+ case GI_WALLET_GIANT:
+ nextTextId = 0x1137; // I'm just glad it was something you needed
break;
- case 6:
- phi_a1 = 0x1138;
+ case GI_RUPEE_SILVER:
+ // unused code, as he only gives wallet, purple and red, silver is never assigned to STH_GI_ID
+ nextTextId = 0x1138; // That's my life's fortune
break;
- case 5:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_13_40)) {
- phi_a1 = 0x113D;
+ case GI_RUPEE_PURPLE:
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_OCEANSIDE_WALLET_UPGRADE)) {
+ nextTextId = 0x113D; // That's my life's savings
} else {
- phi_a1 = 0x113C;
+ nextTextId = 0x113C; // That's my life's savings (2)
}
break;
default:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_13_40)) {
- phi_a1 = 0x1142;
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_OCEANSIDE_WALLET_UPGRADE)) {
+ nextTextId = 0x1142; // Well, thats all I have on me
} else {
- phi_a1 = 0x1141;
+ nextTextId = 0x1141; // Well, thats all I have on me
}
break;
}
- Message_StartTextbox(play, phi_a1, &this->actor);
+ Message_StartTextbox(play, nextTextId, &this->actor);
} else {
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
}
}
-void func_80B67458(EnSth* this, PlayState* play) {
+void EnSth_GiveOceansideSpiderHouseReward(EnSth* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (Actor_HasParent(&this->actor, play)) {
this->actor.parent = NULL;
- this->actionFunc = func_80B67348;
+ this->actionFunc = EnSth_PostOceanspiderhouseReward;
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
if (CURRENT_DAY == 3) {
- func_80B670A4(this, 6);
+ EnSth_ChangeAnim(this, STH_ANIM_PLEAD);
} else {
- func_80B670A4(this, 3);
+ EnSth_ChangeAnim(this, STH_ANIM_WAIT);
}
} else {
- Actor_PickUp(&this->actor, play, this->actor.home.rot.z, 10000.0f, 500.0f);
+ Actor_OfferGetItem(&this->actor, play, STH_GI_ID(&this->actor), 10000.0f, 500.0f);
}
}
-void func_80B67540(EnSth* this, PlayState* play) {
- s32 sp2C = CURRENT_DAY - 1;
+void EnSth_HandleOceansideSpiderHouseConversation(EnSth* this, PlayState* play) {
+ s32 day = CURRENT_DAY - 1;
- if (sp2C < 0) {
- sp2C = 0;
+ if (day < 0) {
+ day = 0;
}
- if (this->unk_29A == 6) {
+ if (this->animIndex == STH_ANIM_PLEAD) {
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 2, 0x1000, 0x200);
this->actor.world.rot.y = this->actor.shape.rot.y;
}
@@ -315,254 +350,323 @@ void func_80B67540(EnSth* this, PlayState* play) {
case TEXT_STATE_5:
if (Message_ShouldAdvance(play)) {
switch (play->msgCtx.currentTextId) {
- case 0x1134:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ case 0x1134: // (does not exist)
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
- case 0x1132:
- case 0x113A:
- case 0x113F:
- func_80151938(play, 0x1133);
+ case 0x1132: // Heard noise, came in to see
+ case 0x113A: // Had no idea there was a basement here
+ case 0x113F: // Heard noise... I never thought I'd find a place like this
+ Message_ContinueTextbox(play, 0x1133); // did you find this place?
break;
- case 0x1133:
- func_80151938(play, 0x1136);
- func_80B670A4(this, 6);
+ case 0x1133: // did you find this place?
+ Message_ContinueTextbox(play, 0x1136); // I want to buy this place from you
+ EnSth_ChangeAnim(this, STH_ANIM_PLEAD);
break;
- case 0x1136:
- SET_WEEKEVENTREG(WEEKEVENTREG_13_80);
+ case 0x1136: // I want to buy this house from you
+ // This flag prevents multiple rewards, switching to secondary dialogue after
+ SET_WEEKEVENTREG(WEEKEVENTREG_OCEANSIDE_SPIDER_HOUSE_COLLECTED_REWARD);
- switch (sp2C) {
- case 0:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_13_40)) {
- this->actor.home.rot.z = 6;
+ switch (day) {
+ case 0: // first day
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_OCEANSIDE_WALLET_UPGRADE)) {
+ STH_GI_ID(&this->actor) = GI_RUPEE_SILVER;
} else {
- SET_WEEKEVENTREG(WEEKEVENTREG_13_40);
+ // This flag prevents getting two wallets from the same place.
+ // Instead, getting silver rupee above.
+ SET_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_OCEANSIDE_WALLET_UPGRADE);
switch (CUR_UPG_VALUE(UPG_WALLET)) {
case 0:
- this->actor.home.rot.z = 8;
+ STH_GI_ID(&this->actor) = GI_WALLET_ADULT;
break;
case 1:
- this->actor.home.rot.z = 9;
+ STH_GI_ID(&this->actor) = GI_WALLET_GIANT;
break;
}
}
break;
- case 1:
- this->actor.home.rot.z = 5;
+ case 1: // second day
+ STH_GI_ID(&this->actor) = GI_RUPEE_PURPLE;
break;
- default:
- this->actor.home.rot.z = 4;
+ default: // final day
+ STH_GI_ID(&this->actor) = GI_RUPEE_RED;
break;
}
- func_801477B4(play);
- this->actionFunc = func_80B67458;
- func_80B67458(this, play);
+ Message_CloseTextbox(play);
+ this->actionFunc = EnSth_GiveOceansideSpiderHouseReward;
+ EnSth_GiveOceansideSpiderHouseReward(this, play);
break;
- case 0x113C:
- func_80151938(play, 0x113B);
+ case 0x113C: // (Second day) I am giving you my life savings
+ Message_ContinueTextbox(play, 0x113B); // If only I had gotten here yesterday...
break;
- case 0x1141:
- func_80151938(play, 0x1140);
- func_80B670A4(this, 3);
+ case 0x1141: // (Final day) This is all I have
+ Message_ContinueTextbox(play, 0x1140); // If only I had gotten here two days ago...
+ EnSth_ChangeAnim(this, STH_ANIM_WAIT);
break;
default:
- this->actionFunc = func_80B677BC;
- func_801477B4(play);
- this->unk_29C |= 2;
+ this->actionFunc = EnSth_OceansideSpiderHouseIdle;
+ Message_CloseTextbox(play);
+ this->sthFlags |= STH_FLAG_OCEANSIDE_SPIDER_HOUSE_GREET;
break;
}
}
break;
case TEXT_STATE_CLOSING:
- this->actionFunc = func_80B677BC;
- this->unk_29C |= 2;
+ this->actionFunc = EnSth_OceansideSpiderHouseIdle;
+ this->sthFlags |= STH_FLAG_OCEANSIDE_SPIDER_HOUSE_GREET;
break;
}
}
-void func_80B677BC(EnSth* this, PlayState* play) {
+void EnSth_OceansideSpiderHouseIdle(EnSth* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- func_80B672A4(this, play);
- this->actionFunc = func_80B67540;
- } else if (func_80B6703C(this, play)) {
- func_800B8614(&this->actor, play, 110.0f);
+ EnSth_GetInitialOceansideSpiderHouseText(this, play);
+ this->actionFunc = EnSth_HandleOceansideSpiderHouseConversation;
+ } else if (EnSth_CanSpeakToPlayer(this, play)) {
+ Actor_OfferTalk(&this->actor, play, 110.0f);
}
}
-void func_80B67838(EnSth* this, PlayState* play) {
+void EnSth_HandleMoonLookingConversation(EnSth* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- this->actionFunc = func_80B678A8;
- func_801477B4(play);
+ this->actionFunc = EnSth_MoonLookingIdle;
+ Message_CloseTextbox(play);
}
- this->unk_294.x = -0x1388;
+ this->headRot.x = -0x1388;
}
-void func_80B678A8(EnSth* this, PlayState* play) {
+void EnSth_MoonLookingIdle(EnSth* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- this->actionFunc = func_80B67838;
- } else if (func_80B6703C(this, play) || this->actor.isTargeted) {
+ this->actionFunc = EnSth_HandleMoonLookingConversation;
+ } else if (EnSth_CanSpeakToPlayer(this, play) || this->actor.isLockedOn) {
if ((gSaveContext.save.time >= CLOCK_TIME(6, 0)) && (gSaveContext.save.time <= CLOCK_TIME(18, 0))) {
- this->actor.textId = 0x1130;
+ this->actor.textId = 0x1130; // Huh? The Moon...
} else {
- this->actor.textId = 0x1131;
+ this->actor.textId = 0x1131; // (The Moon) gotten bigger again
}
- func_800B8614(&this->actor, play, 110.0f);
+ Actor_OfferTalk(&this->actor, play, 110.0f);
}
- this->unk_294.x = -0x1388;
+ this->headRot.x = -0x1388;
}
-void func_80B67958(EnSth* this, PlayState* play) {
+// used by type: STH_TYPE_UNUSED_1 and undefined types
+void EnSth_DefaultIdle(EnSth* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
}
-void func_80B67984(EnSth* this, PlayState* play) {
- u16 sp1E;
+void EnSth_GetInitialSwampSpiderHouseText(EnSth* this, PlayState* play) {
+ u16 nextTextId;
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_34_10)) {
- sp1E = 0x903;
- func_80B670A4(this, 2);
+ nextTextId = 0x903; // (does not exist)
+ EnSth_ChangeAnim(this, STH_ANIM_TALK);
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_34_20)) {
- sp1E = 0x90F;
- func_80B670A4(this, 2);
- } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_34_40)) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_34_08)) {
- sp1E = 0x91B;
+ nextTextId = 0x90F; // (does not exist)
+ EnSth_ChangeAnim(this, STH_ANIM_TALK);
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_MASK_OF_TRUTH)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_SWAMP_SPIDER_HOUSE_MAN)) {
+ nextTextId = 0x91B; // As soon as I calm down, getting rid of it
} else {
- sp1E = 0x918;
+ nextTextId = 0x918; // I've had enough of this, going home
}
- func_80B670A4(this, 2);
- } else if (Inventory_GetSkullTokenCount(play->sceneId) >= 30) {
+ EnSth_ChangeAnim(this, STH_ANIM_TALK);
+ } else if (Inventory_GetSkullTokenCount(play->sceneId) >= SPIDER_HOUSE_TOKENS_REQUIRED) {
if (INV_CONTENT(ITEM_MASK_TRUTH) == ITEM_MASK_TRUTH) {
- this->unk_29C |= 4;
- sp1E = 0x919;
+ this->sthFlags |= STH_FLAG_SWAMP_SPIDER_HOUSE_SAVED;
+ nextTextId = 0x919; // I've been saved!
} else {
- sp1E = 0x916;
+ nextTextId = 0x916; // I've been saved! (Duplicate)
}
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_34_02)) {
- sp1E = 0x8FF;
+ nextTextId = 0x8FF; // (does not exist)
} else {
- sp1E = 0x8FC;
+ nextTextId = 0x8FC; // (does not exist)
SET_WEEKEVENTREG(WEEKEVENTREG_34_02);
}
- Message_StartTextbox(play, sp1E, &this->actor);
+
+ Message_StartTextbox(play, nextTextId, &this->actor);
}
-void func_80B67AB4(EnSth* this, PlayState* play) {
+void EnSth_TalkAfterSwampSpiderHouseGiveMask(EnSth* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- this->actionFunc = func_80B67C1C;
- SET_WEEKEVENTREG(WEEKEVENTREG_34_40);
- Message_StartTextbox(play, 0x918, &this->actor);
+ this->actionFunc = EnSth_HandleSwampSpiderHouseConversation;
+ SET_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_MASK_OF_TRUTH);
+ Message_StartTextbox(play, 0x918, &this->actor); // I've had enough of this, going home
} else {
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
}
}
-void func_80B67B50(EnSth* this, PlayState* play) {
+void EnSth_SwampSpiderHouseGiveMask(EnSth* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (Actor_HasParent(&this->actor, play)) {
this->actor.parent = NULL;
- this->actionFunc = func_80B67AB4;
+ this->actionFunc = EnSth_TalkAfterSwampSpiderHouseGiveMask;
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
} else {
- this->unk_29C &= ~1;
- SET_WEEKEVENTREG(WEEKEVENTREG_34_08);
- Actor_PickUp(&this->actor, play, GI_MASK_TRUTH, 10000.0f, 50.0f);
+ 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_TALKED_SWAMP_SPIDER_HOUSE_MAN);
+ Actor_OfferGetItem(&this->actor, play, GI_MASK_TRUTH, 10000.0f, 50.0f);
}
}
-void func_80B67C1C(EnSth* this, PlayState* play) {
+void EnSth_HandleSwampSpiderHouseConversation(EnSth* this, PlayState* play) {
s32 pad;
SkelAnime_Update(&this->skelAnime);
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
switch (play->msgCtx.currentTextId) {
- case 0x90C:
- func_80B670A4(this, 2);
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ case 0x90C: // (does not exist)
+ EnSth_ChangeAnim(this, STH_ANIM_TALK);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
- case 0x916:
- case 0x919:
- func_80B670A4(this, 3);
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ case 0x916: // I have been saved! I thought I was doomed
+ case 0x919: // I have been saved! I thought I was doomed (duplicate)
+ EnSth_ChangeAnim(this, STH_ANIM_WAIT);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
- case 0x8FC:
- case 0x8FD:
- case 0x900:
- case 0x90A:
- case 0x90D:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ case 0x8FC: // (does not exist)
+ case 0x8FD: // (does not exist)
+ case 0x900: // (does not exist)
+ case 0x90A: // (does not exist)
+ case 0x90D: // (does not exist)
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
- case 0x901:
- case 0x90B:
- case 0x917:
- func_801477B4(play);
- this->actionFunc = func_80B67B50;
- func_80B67B50(this, play);
+ case 0x901: // (does not exist)
+ case 0x90B: // (does not exist)
+ case 0x917: // Someone gave me this mask and said it would make me rich, Take it
+ Message_CloseTextbox(play);
+ this->actionFunc = EnSth_SwampSpiderHouseGiveMask;
+ EnSth_SwampSpiderHouseGiveMask(this, play);
break;
- case 0x91A:
- SET_WEEKEVENTREG(WEEKEVENTREG_34_40);
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_34_08);
+ 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_TALKED_SWAMP_SPIDER_HOUSE_MAN);
- case 0x902:
- case 0x903:
- case 0x90E:
- case 0x90F:
- case 0x918:
- case 0x91B:
- func_80B670A4(this, 3);
+ case 0x902: // (does not exist)
+ case 0x903: // (does not exist)
+ case 0x90E: // (does not exist)
+ case 0x90F: // (does not exist)
+ case 0x918: // I have had enough, going home
+ case 0x91B: // As soon as I calm down, getting rid of it
+ EnSth_ChangeAnim(this, STH_ANIM_WAIT);
default:
this->actor.flags &= ~ACTOR_FLAG_10000;
- func_801477B4(play);
- this->actionFunc = func_80B67DA0;
+ Message_CloseTextbox(play);
+ this->actionFunc = EnSth_SwampSpiderHouseIdle;
break;
}
}
}
-void func_80B67DA0(EnSth* this, PlayState* play) {
+void EnSth_SwampSpiderHouseIdle(EnSth* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- func_80B67984(this, play);
- this->actionFunc = func_80B67C1C;
- } else if (func_80B6703C(this, play)) {
+ EnSth_GetInitialSwampSpiderHouseText(this, play);
+ this->actionFunc = EnSth_HandleSwampSpiderHouseConversation;
+ } else if (EnSth_CanSpeakToPlayer(this, play)) {
this->actor.textId = 0;
- func_800B8614(&this->actor, play, 110.0f);
+ Actor_OfferTalk(&this->actor, play, 110.0f);
}
}
-void func_80B67E20(Actor* thisx, PlayState* play) {
+/**
+ * Oceanside Spider House EnSth shows up after you collect all 30 tokens.
+ * Here we wait invisible until the player has finished.
+ */
+void EnSth_UpdateOceansideSpiderHouseWaitForTokens(Actor* thisx, PlayState* play) {
EnSth* this = THIS;
- if (Inventory_GetSkullTokenCount(play->sceneId) >= 30) {
- this->actor.update = func_80B680A8;
- this->actor.draw = func_80B6849C;
- this->actor.flags |= ACTOR_FLAG_1;
+ if (Inventory_GetSkullTokenCount(play->sceneId) >= SPIDER_HOUSE_TOKENS_REQUIRED) {
+ this->actor.update = EnSth_Update;
+ this->actor.draw = EnSth_Draw;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
+ }
+}
+
+/**
+ * Dual object actors have to wait for the object to finish loading.
+ * This dev chose to use a temporary update instead of temporary actionFunc.
+ */
+void EnSth_UpdateWaitForObject(Actor* thisx, PlayState* play) {
+ s32 pad;
+ EnSth* this = THIS;
+
+ if (Object_IsLoaded(&play->objectCtx, this->mainObjectId)) {
+ this->actor.objBankIndex = this->mainObjectId;
+ Actor_SetObjectDependency(play, &this->actor);
+
+ if (STH_GET_SWAMP_BODY(&this->actor)) {
+ SkelAnime_InitFlex(play, &this->skelAnime, &gAhgSkel, &gEnSthBendDownAnim, this->jointTable,
+ this->morphTable, AHG_LIMB_MAX);
+ Animation_PlayLoop(&this->skelAnime, &gEnSthBendDownAnim);
+ this->animIndex = STH_ANIM_BENDING_DOWN;
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_34_10) || CHECK_WEEKEVENTREG(WEEKEVENTREG_34_20) ||
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_MASK_OF_TRUTH) ||
+ (Inventory_GetSkullTokenCount(play->sceneId) >= SPIDER_HOUSE_TOKENS_REQUIRED)) {
+ EnSth_ChangeAnim(this, STH_ANIM_WAIT);
+ }
+ } else {
+ SkelAnime_InitFlex(play, &this->skelAnime, &gSthSkel, &gEnSthSignalAnim, this->jointTable, this->morphTable,
+ STH_LIMB_MAX);
+ Animation_PlayLoop(&this->skelAnime, &gEnSthSignalAnim);
+ }
+
+ this->actor.update = EnSth_Update;
+ this->actor.draw = EnSth_Draw;
+
+ switch (STH_GET_TYPE(&this->actor)) {
+ case STH_TYPE_MOON_LOOKING:
+ EnSth_ChangeAnim(this, STH_ANIM_LOOK_UP);
+ break;
+
+ case STH_TYPE_OCEANSIDE_SPIDER_HOUSE_GREET:
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_OCEANSIDE_SPIDER_HOUSE_COLLECTED_REWARD)) {
+ EnSth_ChangeAnim(this, STH_ANIM_LOOK_AROUND);
+ } else {
+ EnSth_ChangeAnim(this, STH_ANIM_LOOK_AROUND);
+ }
+ break;
+
+ case STH_TYPE_OCEANSIDE_SPIDER_HOUSE_PANIC:
+ EnSth_ChangeAnim(this, STH_ANIM_PANIC);
+ break;
+ }
+
+ // not ready to appear yet
+ if ((STH_GET_TYPE(&this->actor) == STH_TYPE_OCEANSIDE_SPIDER_HOUSE_GREET) &&
+ (Inventory_GetSkullTokenCount(play->sceneId) < SPIDER_HOUSE_TOKENS_REQUIRED)) {
+ this->actor.update = EnSth_UpdateOceansideSpiderHouseWaitForTokens;
+ this->actor.draw = NULL;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ }
}
}
@@ -570,119 +674,73 @@ void EnSth_Update(Actor* thisx, PlayState* play) {
s32 pad;
EnSth* this = THIS;
- if (Object_IsLoaded(&play->objectCtx, this->unk_29E)) {
- this->actor.objBankIndex = this->unk_29E;
- Actor_SetObjectDependency(play, &this->actor);
-
- if (ENSTH_GET_100(&this->actor)) {
- SkelAnime_InitFlex(play, &this->skelAnime, &object_ahg_Skel_005998, &ovl_En_Sth_Anim_0045B4,
- this->jointTable, this->morphTable, 16);
- Animation_PlayLoop(&this->skelAnime, &ovl_En_Sth_Anim_0045B4);
- this->unk_29A = 1;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_34_10) || CHECK_WEEKEVENTREG(WEEKEVENTREG_34_20) ||
- CHECK_WEEKEVENTREG(WEEKEVENTREG_34_40) || (Inventory_GetSkullTokenCount(play->sceneId) >= 30)) {
- func_80B670A4(this, 3);
- }
- } else {
- SkelAnime_InitFlex(play, &this->skelAnime, &object_sth_Skel_0031F8, &ovl_En_Sth_Anim_003F50,
- this->jointTable, this->morphTable, 16);
- Animation_PlayLoop(&this->skelAnime, &ovl_En_Sth_Anim_003F50);
- }
-
- this->actor.update = func_80B680A8;
- this->actor.draw = func_80B6849C;
-
- switch (ENSTH_GET_F(&this->actor)) {
- case ENSTH_F_3:
- func_80B670A4(this, 4);
- break;
-
- case ENSTH_F_4:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_13_80)) {
- func_80B670A4(this, 5);
- } else {
- func_80B670A4(this, 5);
- }
- break;
-
- case ENSTH_F_5:
- func_80B670A4(this, 7);
- break;
- }
-
- if ((ENSTH_GET_F(&this->actor) == ENSTH_F_4) && (Inventory_GetSkullTokenCount(play->sceneId) < 30)) {
- this->actor.update = func_80B67E20;
- this->actor.draw = NULL;
- this->actor.flags &= ~ACTOR_FLAG_1;
- }
- }
-}
-
-void func_80B680A8(Actor* thisx, PlayState* play) {
- s32 pad;
- EnSth* this = THIS;
- Vec3s sp38;
-
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);
- if (func_80B6703C(this, play) && !(this->unk_29C & 8) && (this->unk_29A != 5)) {
- sp38.x = sp38.y = sp38.z = 0;
+ if (EnSth_CanSpeakToPlayer(this, play) && !(this->sthFlags & STH_FLAG_DISABLE_HEAD_TRACK) &&
+ (this->animIndex != STH_ANIM_LOOK_AROUND)) {
+ Vec3s torsoRot;
- Actor_TrackPlayer(play, &this->actor, &this->unk_294, &sp38, this->actor.focus.pos);
+ torsoRot.x = torsoRot.y = torsoRot.z = 0; // this should block torso rot from working
+
+ Actor_TrackPlayer(play, &this->actor, &this->headRot, &torsoRot, this->actor.focus.pos);
} else {
- Math_SmoothStepToS(&this->unk_294.x, 0, 6, 6200, 100);
- Math_SmoothStepToS(&this->unk_294.y, 0, 6, 6200, 100);
+ Math_SmoothStepToS(&this->headRot.x, 0, 6, 6200, 100);
+ Math_SmoothStepToS(&this->headRot.y, 0, 6, 6200, 100);
}
}
-s32 func_80B681E8(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
+s32 EnSth_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
s32 pad;
EnSth* this = THIS;
- if (limbIndex == 15) {
- rot->x += this->unk_294.y;
- rot->z += this->unk_294.x;
- *dList = ovl_En_Sth_DL_0034A0;
+ if (limbIndex == STH_LIMB_HEAD) {
+ rot->x += this->headRot.y;
+ rot->z += this->headRot.x;
+
+ // object_sth body has no head by default, forced here from overlay data
+ *dList = gEnSthHeadDL;
}
- if ((limbIndex == 8) || (limbIndex == 10) || (limbIndex == 13)) {
+ if ((limbIndex == STH_LIMB_CHEST) || (limbIndex == STH_LIMB_LEFT_FOREARM) ||
+ (limbIndex == STH_LIMB_RIGHT_FOREARM)) {
rot->y += (s16)(Math_SinS(play->state.frames * ((limbIndex * 50) + 0x814)) * 200.0f);
rot->z += (s16)(Math_CosS(play->state.frames * ((limbIndex * 50) + 0x940)) * 200.0f);
}
+
return false;
}
-void func_80B68310(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
+void EnSth_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnSth* this = THIS;
- if (limbIndex == 15) {
+ if (limbIndex == STH_LIMB_HEAD) {
s32 pad;
- Matrix_MultVec3f(&D_80B6D200, &this->actor.focus.pos);
+ Matrix_MultVec3f(&sFocusOffset, &this->actor.focus.pos);
- if (!ENSTH_GET_100(&this->actor)) {
+ if (!STH_GET_SWAMP_BODY(&this->actor)) {
OPEN_DISPS(play->state.gfxCtx);
- gSPDisplayList(POLY_OPA_DISP++, ovl_En_Sth_DL_0037C0);
+ gSPDisplayList(POLY_OPA_DISP++, gEnSthExtraHairDL);
CLOSE_DISPS(play->state.gfxCtx);
} else {
OPEN_DISPS(play->state.gfxCtx);
- if (this->unk_29C & 1) {
- if (Object_IsLoaded(&play->objectCtx, this->unk_29F)) {
+ if (this->sthFlags & STH_FLAG_DRAW_MASK_OF_TRUTH) {
+ if (Object_IsLoaded(&play->objectCtx, this->maskOfTruthObjectId)) {
Matrix_Push();
Matrix_RotateZS(0x3A98, MTXMODE_APPLY);
Matrix_Translate(0.0f, 190.0f, 0.0f, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPSegment(POLY_OPA_DISP++, 0x0A, play->objectCtx.status[this->unk_29F].segment);
+ gSPSegment(POLY_OPA_DISP++, 0x0A, play->objectCtx.slots[this->maskOfTruthObjectId].segment);
gSPDisplayList(POLY_OPA_DISP++, object_mask_truth_DL_0001A0);
Matrix_Pop();
@@ -694,20 +752,20 @@ void func_80B68310(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Acto
}
}
-void func_80B6849C(Actor* thisx, PlayState* play) {
+void EnSth_Draw(Actor* thisx, PlayState* play) {
s32 pad;
EnSth* this = THIS;
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_80B6D20C[1].r, D_80B6D20C[1].g, D_80B6D20C[1].b, 255));
+ Gfx_EnvColor(play->state.gfxCtx, sShirtColors[1].r, sShirtColors[1].g, sShirtColors[1].b, 255));
gSPSegment(POLY_OPA_DISP++, 0x09, Gfx_EnvColor(play->state.gfxCtx, 90, 110, 130, 255));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
- func_80B681E8, func_80B68310, &this->actor);
+ EnSth_OverrideLimbDraw, EnSth_PostLimbDraw, &this->actor);
CLOSE_DISPS(play->state.gfxCtx);
}
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 857b92505..dbc459ce1 100644
--- a/src/overlays/actors/ovl_En_Sth/z_en_sth.h
+++ b/src/overlays/actors/ovl_En_Sth/z_en_sth.h
@@ -2,33 +2,48 @@
#define Z_EN_STH_H
#include "global.h"
+#include "overlays/actors/ovl_En_Si/z_en_si.h"
+#include "objects/object_sth/object_sth.h"
+#include "objects/object_ahg/object_ahg.h"
+#include "objects/object_mask_truth/object_mask_truth.h"
struct EnSth;
typedef void (*EnSthActionFunc)(struct EnSth*, PlayState*);
-#define ENSTH_GET_F(thisx) ((thisx)->params & 0xF)
-#define ENSTH_GET_100(thisx) ((thisx)->params & 0x100)
+typedef enum {
+ /* 1 */ STH_TYPE_UNUSED_1 = 1,
+ /* 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
+ // Other values: Actor will spawn and animate with arm waving, no further interaction.
+} EnSthType;
-enum {
- /* 1 */ ENSTH_F_1 = 1,
- /* 2 */ ENSTH_F_2,
- /* 3 */ ENSTH_F_3,
- /* 4 */ ENSTH_F_4,
- /* 5 */ ENSTH_F_5,
-};
+// 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)
+#define STH_GET_SWAMP_BODY(thisx) ((thisx)->params & 0x100)
+
+// The get item ID for the reward for Oceanside Spider House (wallet, or rupees) is set here
+#define STH_GI_ID(thisx) ((thisx)->home.rot.z)
+
+// This actor has its own flags system
+#define STH_FLAG_DRAW_MASK_OF_TRUTH (1 << 0)
+#define STH_FLAG_OCEANSIDE_SPIDER_HOUSE_GREET (1 << 1)
+#define STH_FLAG_SWAMP_SPIDER_HOUSE_SAVED (1 << 2) // set, but not read
+#define STH_FLAG_DISABLE_HEAD_TRACK (1 << 3)
typedef struct EnSth {
/* 0x000 */ Actor actor;
/* 0x144 */ ColliderCylinder collider;
/* 0x190 */ SkelAnime skelAnime;
- /* 0x1D4 */ Vec3s jointTable[16];
- /* 0x234 */ Vec3s morphTable[16];
- /* 0x294 */ Vec3s unk_294;
- /* 0x29A */ s16 unk_29A;
- /* 0x29C */ u16 unk_29C;
- /* 0x29E */ u8 unk_29E;
- /* 0x29F */ u8 unk_29F;
+ /* 0x1D4 */ Vec3s jointTable[STH_LIMB_MAX];
+ /* 0x234 */ Vec3s morphTable[STH_LIMB_MAX];
+ /* 0x294 */ Vec3s headRot;
+ /* 0x29A */ s16 animIndex;
+ /* 0x29C */ u16 sthFlags;
+ /* 0x29E */ u8 mainObjectId;
+ /* 0x29F */ u8 maskOfTruthObjectId;
/* 0x2A0 */ EnSthActionFunc actionFunc;
} EnSth; // size = 0x2A4
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 ac615a8dd..be0821580 100644
--- a/src/overlays/actors/ovl_En_Sth2/z_en_sth2.c
+++ b/src/overlays/actors/ovl_En_Sth2/z_en_sth2.c
@@ -6,7 +6,7 @@
#include "z_en_sth2.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnSth2*)thisx)
@@ -35,7 +35,7 @@ ActorInit En_Sth2_InitVars = {
void EnSth2_Init(Actor* thisx, PlayState* play) {
EnSth2* this = THIS;
- this->objIndex = Object_GetIndex(&play->objectCtx, OBJECT_STH);
+ this->objIndex = Object_GetSlot(&play->objectCtx, OBJECT_STH);
Actor_SetScale(&this->actor, 0.01f);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 36.0f);
this->unused = 0;
@@ -63,8 +63,8 @@ void EnSth2_Update(Actor* thisx, PlayState* play) {
if (Object_IsLoaded(&play->objectCtx, this->objIndex)) {
this->actor.objBankIndex = this->objIndex;
Actor_SetObjectDependency(play, &this->actor);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_sth_Skel_0031F8, &gEnSth2WavingHandAnim, this->jointTable,
- this->morphTable, OBJECT_STH_LIMB_MAX);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gSthSkel, &gEnSth2WavingHandAnim, this->jointTable,
+ this->morphTable, STH_LIMB_MAX);
Animation_PlayLoop(&this->skelAnime, &gEnSth2WavingHandAnim);
this->actor.update = EnSth2_UpdateActionFunc;
this->actor.draw = EnSth2_Draw;
@@ -80,10 +80,11 @@ void EnSth2_UpdateActionFunc(Actor* thisx, PlayState* play) {
s32 EnSth2_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
s32 pad;
- if (limbIndex == OBJECT_STH_LIMB_0F) {
+ if (limbIndex == STH_LIMB_HEAD) {
*dList = gEnSth2HeadDL;
}
- if ((limbIndex == OBJECT_STH_LIMB_08) || (limbIndex == OBJECT_STH_LIMB_0A) || (limbIndex == OBJECT_STH_LIMB_0D)) {
+ if ((limbIndex == STH_LIMB_CHEST) || (limbIndex == STH_LIMB_LEFT_FOREARM) ||
+ (limbIndex == STH_LIMB_RIGHT_FOREARM)) {
rot->y += (s16)(Math_SinS((play->state.frames * ((limbIndex * 50) + 0x814))) * 200.0f);
rot->z += (s16)(Math_CosS((play->state.frames * ((limbIndex * 50) + 0x940))) * 200.0f);
}
@@ -93,7 +94,7 @@ s32 EnSth2_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
void EnSth2_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
static Vec3f focusOffset = { 700.0f, 400.0f, 0.0f };
- if (limbIndex == OBJECT_STH_LIMB_0F) {
+ if (limbIndex == STH_LIMB_HEAD) {
Matrix_MultVec3f(&focusOffset, &thisx->focus.pos);
OPEN_DISPS(play->state.gfxCtx);
@@ -113,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_Sth2/z_en_sth2.h b/src/overlays/actors/ovl_En_Sth2/z_en_sth2.h
index 265332ffd..d8ecc9cdb 100644
--- a/src/overlays/actors/ovl_En_Sth2/z_en_sth2.h
+++ b/src/overlays/actors/ovl_En_Sth2/z_en_sth2.h
@@ -11,8 +11,8 @@ typedef void (*EnSth2ActionFunc)(struct EnSth2*, PlayState*);
typedef struct EnSth2 {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[OBJECT_STH_LIMB_MAX];
- /* 0x1E8 */ Vec3s morphTable[OBJECT_STH_LIMB_MAX];
+ /* 0x188 */ Vec3s jointTable[STH_LIMB_MAX];
+ /* 0x1E8 */ Vec3s morphTable[STH_LIMB_MAX];
/* 0x248 */ s16 unused;
/* 0x24A */ u8 objIndex;
/* 0x24C */ EnSth2ActionFunc actionFunc;
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 36dd9398e..c0d9e1197 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
@@ -6,7 +6,7 @@
#include "z_en_stone_heishi.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_80)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_REACT_TO_LENS)
#define THIS ((EnStoneheishi*)thisx)
@@ -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;
@@ -111,7 +111,7 @@ void EnStoneheishi_Init(Actor* thisx, PlayState* play) {
SOLDIER_LIMB_MAX);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
this->actor.gravity = -3.0f;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
@@ -164,7 +164,7 @@ void func_80BC94B0(EnStoneheishi* this) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_41_40)) { // After drinking bottle
EnStoneheishi_ChangeAnim(this, EN_STONE_HEISHI_ANIM_CHEER_WITH_SPEAR);
this->textIdIndex = 8;
- this->actor.flags &= ~ACTOR_FLAG_80;
+ this->actor.flags &= ~ACTOR_FLAG_REACT_TO_LENS;
} else { // Initial configuration
EnStoneheishi_ChangeAnim(this, EN_STONE_HEISHI_ANIM_WAVE);
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_41_80)) {
@@ -186,18 +186,18 @@ void func_80BC9560(EnStoneheishi* this, PlayState* play) {
}
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_41_40) && (play->actorCtx.lensMaskSize != 100)) {
- this->actor.flags |= ACTOR_FLAG_8000000;
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
return;
}
SkelAnime_Update(&this->skelAnime);
- this->actor.flags &= ~ACTOR_FLAG_8000000;
+ this->actor.flags &= ~ACTOR_FLAG_CANT_LOCK_ON;
yawDiff = ABS_ALT((s16)(this->actor.yawTowardsPlayer - this->actor.world.rot.y));
if ((yawDiff <= 0x18F0) && !(player->stateFlags1 & PLAYER_STATE1_800000)) {
- func_800B8614(&this->actor, play, 70.0f);
+ Actor_OfferTalk(&this->actor, play, 70.0f);
}
}
@@ -229,18 +229,18 @@ void func_80BC9680(EnStoneheishi* this, PlayState* play) {
this->textIdSet = true;
player->actor.textId = sEnStoneHeishiTextIds[this->textIdIndex];
- func_80151938(play, sEnStoneHeishiTextIds[this->textIdIndex]);
- func_80151BB4(play, 0x12);
+ Message_ContinueTextbox(play, sEnStoneHeishiTextIds[this->textIdIndex]);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_SHIRO);
}
}
SkelAnime_Update(&this->skelAnime);
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
if (this->textIdIndex == 2) {
- func_80151938(play, 0xFF);
+ Message_ContinueTextbox(play, 0xFF);
EnStoneheishi_SetupCheckGivenItem(this);
} else if (this->textIdIndex == 3) {
func_80BC94B0(this);
@@ -250,11 +250,11 @@ 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;
}
- func_80151938(play, sEnStoneHeishiTextIds[this->textIdIndex]);
+ Message_ContinueTextbox(play, sEnStoneHeishiTextIds[this->textIdIndex]);
}
}
}
@@ -274,7 +274,7 @@ void EnStoneheishi_CheckGivenItem(EnStoneheishi* this, PlayState* play) {
if (itemAction > PLAYER_IA_NONE) {
this->timer = 40;
- func_801477B4(play);
+ Message_CloseTextbox(play);
if ((itemAction == PLAYER_IA_BOTTLE_POTION_RED) || (itemAction == PLAYER_IA_BOTTLE_POTION_BLUE)) {
this->playerGivesBluePotion = false;
@@ -292,8 +292,8 @@ void EnStoneheishi_CheckGivenItem(EnStoneheishi* this, PlayState* play) {
this->actionFunc = func_80BC9680;
}
} else if (itemAction <= PLAYER_IA_MINUS1) {
- func_801477B4(play);
- func_80151BB4(play, 0x12);
+ Message_CloseTextbox(play);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_SHIRO);
func_80BC94B0(this);
}
}
@@ -314,7 +314,7 @@ void EnStoneheishi_DrinkBottleProcess(EnStoneheishi* this, PlayState* play) {
case EN_STONE_DRINK_BOTTLE_INITIAL:
if (this->timer == 0) {
this->textIdIndex = 4;
- func_80151938(play, sEnStoneHeishiTextIds[this->textIdIndex]);
+ Message_ContinueTextbox(play, sEnStoneHeishiTextIds[this->textIdIndex]);
player->actor.textId = sEnStoneHeishiTextIds[this->textIdIndex];
this->drinkBottleState++;
}
@@ -328,7 +328,7 @@ void EnStoneheishi_DrinkBottleProcess(EnStoneheishi* this, PlayState* play) {
play->msgCtx.msgLength = 0;
player->actor.textId = 0;
- player->exchangeItemId = PLAYER_IA_NONE;
+ player->exchangeItemAction = PLAYER_IA_NONE;
this->bottleDisplay = EN_STONE_BOTTLE_RED_POTION;
if (this->playerGivesBluePotion) {
@@ -346,8 +346,8 @@ void EnStoneheishi_DrinkBottleProcess(EnStoneheishi* this, PlayState* play) {
if (this->timer != 0) {
if ((this->timer < 10) && (this->bottleDisplay != EN_STONE_BOTTLE_EMPTY)) {
this->bottleDisplay = EN_STONE_BOTTLE_EMPTY;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_VO_NP_DRINK);
- Player_UpdateBottleHeld(play, GET_PLAYER(play), ITEM_BOTTLE, PLAYER_IA_BOTTLE);
+ Actor_PlaySfx(&this->actor, NA_SE_VO_NP_DRINK);
+ Player_UpdateBottleHeld(play, GET_PLAYER(play), ITEM_BOTTLE, PLAYER_IA_BOTTLE_EMPTY);
}
} else {
this->drinkBottleState++;
@@ -366,7 +366,7 @@ void EnStoneheishi_DrinkBottleProcess(EnStoneheishi* this, PlayState* play) {
case EN_STONE_DRINK_BOTTLE_STANDING:
if (this->endFrame <= currentFrame) {
this->textIdIndex = 5;
- func_80151938(play, sEnStoneHeishiTextIds[this->textIdIndex]);
+ Message_ContinueTextbox(play, sEnStoneHeishiTextIds[this->textIdIndex]);
player->actor.textId = sEnStoneHeishiTextIds[this->textIdIndex];
EnStoneheishi_ChangeAnim(this, EN_STONE_HEISHI_ANIM_STAND_HAND_ON_HIP);
this->action = EN_STONE_ACTION_1;
@@ -377,12 +377,12 @@ void EnStoneheishi_DrinkBottleProcess(EnStoneheishi* this, PlayState* play) {
}
void EnStoneheishi_GiveItemReward(EnStoneheishi* this, PlayState* play) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
if (INV_CONTENT(ITEM_MASK_STONE) == ITEM_MASK_STONE) {
- Actor_PickUp(&this->actor, play, GI_RUPEE_BLUE, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_RUPEE_BLUE, 300.0f, 300.0f);
} else {
- Actor_PickUp(&this->actor, play, GI_MASK_STONE, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_MASK_STONE, 300.0f, 300.0f);
}
this->action = EN_STONE_ACTION_4;
@@ -398,12 +398,12 @@ void func_80BC9D28(EnStoneheishi* this, PlayState* play) {
this->actor.textId = sEnStoneHeishiTextIds[this->textIdIndex];
SET_WEEKEVENTREG(WEEKEVENTREG_41_40);
Actor_ProcessTalkRequest(&this->actor, &play->state);
- func_800B8500(&this->actor, play, 400.0f, 400.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 400.0f, 400.0f, PLAYER_IA_MINUS1);
this->actionFunc = func_80BC9E50;
} else if (INV_CONTENT(ITEM_MASK_STONE) == ITEM_MASK_STONE) {
- Actor_PickUp(&this->actor, play, GI_RUPEE_BLUE, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_RUPEE_BLUE, 300.0f, 300.0f);
} else {
- Actor_PickUp(&this->actor, play, GI_MASK_STONE, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_MASK_STONE, 300.0f, 300.0f);
}
}
@@ -411,12 +411,12 @@ 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 {
- func_800B8500(&this->actor, play, 400.0f, 400.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 400.0f, 400.0f, PLAYER_IA_MINUS1);
}
}
@@ -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 c4d56b70a..8be9f715a 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
@@ -7,7 +7,7 @@
#include "z_en_stop_heishi.h"
#include "z64quake.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnStopheishi*)thisx)
@@ -18,8 +18,22 @@ void EnStopheishi_Draw(Actor* thisx, PlayState* play);
void func_80AE7F34(EnStopheishi* this, PlayState* play);
void func_80AE85C4(EnStopheishi* this, PlayState* play);
+void func_80AE7E9C(EnStopheishi* this);
+void func_80AE854C(EnStopheishi* this, PlayState* play);
+void func_80AE795C(EnStopheishi* this, PlayState* play);
+
+typedef enum {
+ /* 0 */ SOLDIER_ANIM_LOOK_DOWN,
+ /* 1 */ SOLDIER_ANIM_COME_UP_HERE,
+ /* 2 */ SOLDIER_ANIM_STAND_HAND_ON_HIP,
+ /* 3 */ SOLDIER_ANIM_STAND_LOOK_DOWN,
+ /* 4 */ SOLDIER_ANIM_4,
+ /* 5 */ SOLDIER_ANIM_5,
+ /* 6 */ SOLDIER_ANIM_6,
+ /* 7 */ SOLDIER_ANIM_STAND_HAND_ON_CHEST,
+ /* 8 */ SOLDIER_ANIM_MAX
+} SoldierAnimation;
-#if 0
ActorInit En_Stop_heishi_InitVars = {
ACTOR_EN_STOP_HEISHI,
ACTORCAT_NPC,
@@ -32,45 +46,540 @@ ActorInit En_Stop_heishi_InitVars = {
(ActorFunc)EnStopheishi_Draw,
};
-// static ColliderCylinderInit sCylinderInit = {
-static ColliderCylinderInit D_80AE88B0 = {
- { COLTYPE_NONE, AT_NONE, AC_NONE, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_2, COLSHAPE_CYLINDER, },
- { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_NONE, OCELEM_ON, },
+static ColliderCylinderInit sCylinderInit = {
+ {
+ COLTYPE_NONE,
+ AT_NONE,
+ AC_NONE,
+ OC1_ON | OC1_TYPE_ALL,
+ OC2_TYPE_2,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK0,
+ { 0x00000000, 0x00, 0x00 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_NONE,
+ OCELEM_ON,
+ },
{ 50, 260, 0, { 0, 0, 0 } },
};
-#endif
+static u16 sLeaveMessages[] = {
+ 0x0516, 0x0517, 0x051A, 0x0000, 0x051C, 0x0000, 0x051E, 0x0000, 0x0520, 0x0521, 0x0524, 0x0000, 0x0526, 0x0000,
+ 0x0528, 0x0000, 0x052A, 0x052B, 0x052E, 0x0000, 0x0530, 0x0000, 0x0532, 0x0000, 0x0534, 0x0535, 0x0538, 0x0000,
+ 0x053A, 0x0000, 0x053C, 0x0000, 0x0518, 0x0519, 0x051B, 0x0000, 0x051D, 0x0000, 0x051F, 0x0000, 0x0522, 0x0523,
+ 0x0525, 0x0000, 0x0527, 0x0000, 0x0529, 0x0000, 0x052C, 0x052D, 0x052F, 0x0000, 0x0531, 0x0000, 0x0533, 0x0000,
+ 0x0536, 0x0537, 0x0539, 0x0000, 0x053B, 0x0000, 0x053D, 0x0000, 0x0514, 0x0000, 0x0560, 0x0000, 0x0562, 0x0000,
+ 0x0564, 0x0000, 0x0515, 0x0000, 0x0561, 0x0000, 0x0563, 0x0000, 0x0565, 0x0000,
+};
-extern ColliderCylinderInit D_80AE88B0;
+static u16 sThirdDayLeaveMessages[] = {
+ 0x0540, 0x0541, 0x0542, 0x0000, 0x0543, 0x0000, 0x0543, 0x0000, 0x0547, 0x0548, 0x0549, 0x0000, 0x054A, 0x0000,
+ 0x054B, 0x0000, 0x054F, 0x0550, 0x0551, 0x0000, 0x0552, 0x0000, 0x0553, 0x0000, 0x0557, 0x0558, 0x0559, 0x0000,
+ 0x055A, 0x0000, 0x055A, 0x0000, 0x0544, 0x0545, 0x0546, 0x0000, 0x0546, 0x0000, 0x0546, 0x0000, 0x054C, 0x054D,
+ 0x054E, 0x0000, 0x054E, 0x0000, 0x054E, 0x0000, 0x0554, 0x0555, 0x0556, 0x0000, 0x0556, 0x0000, 0x0556, 0x0000,
+ 0x055B, 0x055C, 0x055D, 0x0000, 0x055D, 0x0000, 0x055D, 0x0000, 0x053E, 0x0000, 0x053E, 0x0000, 0x053E, 0x0000,
+ 0x053E, 0x0000, 0x053F, 0x0000, 0x053F, 0x0000, 0x053F, 0x0000, 0x053F, 0x0000,
+};
-extern UNK_TYPE D_06006C18;
+static AnimationHeader* sAnimations[SOLDIER_ANIM_MAX] = {
+ &gSoldierLookDown, // SOLDIER_ANIM_LOOK_DOWN
+ &gSoldierComeUpHere, // SOLDIER_ANIM_COME_UP_HERE
+ &gSoldierStandHandOnHip, // SOLDIER_ANIM_STAND_HAND_ON_HIP
+ &gSoldierStandAndLookDown, // SOLDIER_ANIM_STAND_LOOK_DOWN
+ &object_sdn_Anim_0057BC, // SOLDIER_ANIM_4
+ &object_sdn_Anim_005D28, // SOLDIER_ANIM_5
+ &object_sdn_Anim_0064C0, // SOLDIER_ANIM_6
+ &gSoldierStandWithHandOnChest, // SOLDIER_ANIM_STAND_HAND_ON_CHEST
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Stop_heishi/EnStopheishi_Init.s")
+void EnStopheishi_Init(Actor* thisx, PlayState* play) {
+ EnStopheishi* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Stop_heishi/EnStopheishi_Destroy.s")
+ ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 25.0f);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gSoldierSkel, &gSoldierStandHandOnHip, this->jointTable,
+ this->morphTable, SOLDIER_LIMB_MAX);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Stop_heishi/func_80AE750C.s")
+ this->actor.colChkInfo.mass = MASS_IMMOVABLE;
+ this->unk_276 = ENSTOPHEISHI_GET_F000(&this->actor);
+ this->switchFlag = ENSTOPHEISHI_GET_SWITCH_FLAG(&this->actor);
+ this->unk_288 = (this->actor.world.rot.z * 40.0f) + 50.0f;
+ this->actor.world.rot.z = 0;
+ if (this->switchFlag == 0x7F) {
+ this->switchFlag = -1;
+ }
+ if ((this->switchFlag >= 0) && Flags_GetSwitch(play, this->switchFlag)) {
+ Actor_Kill(&this->actor);
+ return;
+ }
+ this->actor.targetMode = TARGET_MODE_0;
+ this->actor.gravity = -3.0f;
+ Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
+ this->rotYTarget = this->actor.world.rot.y;
+ this->headTurnTimer2 = 6;
+ func_80AE7E9C(this);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Stop_heishi/func_80AE75C8.s")
+void EnStopheishi_Destroy(Actor* thisx, PlayState* play) {
+ EnStopheishi* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Stop_heishi/func_80AE7718.s")
+ Collider_DestroyCylinder(play, &this->collider);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Stop_heishi/func_80AE77D4.s")
+void EnStopHeishi_ChangeAnim(EnStopheishi* this, s32 animIndex) {
+ s32 mode;
+ f32 morphFrames;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Stop_heishi/func_80AE795C.s")
+ this->currentAnim = animIndex;
+ this->currentAnimFrameCount = Animation_GetLastFrame(sAnimations[animIndex]);
+ mode = ANIMMODE_ONCE;
+ morphFrames = -10.0f;
+ if ((animIndex >= SOLDIER_ANIM_STAND_HAND_ON_HIP) && (animIndex != SOLDIER_ANIM_4)) {
+ mode = ANIMMODE_LOOP;
+ }
+ if (animIndex == SOLDIER_ANIM_5) {
+ morphFrames = 0.0f;
+ }
+ Animation_Change(&this->skelAnime, sAnimations[animIndex], 1.0f, 0.0f, this->currentAnimFrameCount, mode,
+ morphFrames);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Stop_heishi/func_80AE7E9C.s")
+void EnStopheishi_UpdateHeadNormal(EnStopheishi* this, PlayState* play) {
+ s32 yawDiff;
+ Player* player;
+ Vec3f playerPos;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Stop_heishi/func_80AE7F34.s")
+ yawDiff = ABS_ALT(BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.world.rot.y));
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Stop_heishi/func_80AE854C.s")
+ this->headRotXTarget = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Stop_heishi/func_80AE85C4.s")
+ if (this->actor.xzDistToPlayer < 200.0f) {
+ player = GET_PLAYER(play);
+ if (yawDiff < 0x4E20) {
+ this->headRotXTarget = this->actor.yawTowardsPlayer - this->actor.world.rot.y;
+ if (this->headRotXTarget > 0x2710) {
+ this->headRotXTarget = 0x2710;
+ } else if (this->headRotXTarget < -0x2710) {
+ this->headRotXTarget = -0x2710;
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Stop_heishi/EnStopheishi_Update.s")
+ Math_Vec3f_Copy(&playerPos, &player->actor.world.pos);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Stop_heishi/func_80AE87A4.s")
+ if ((player->transformation == PLAYER_FORM_DEKU) || (player->transformation == PLAYER_FORM_HUMAN)) {
+ playerPos.y += 57.0f + BREG(34);
+ } else {
+ playerPos.y += 70.0f + BREG(35);
+ }
+ this->pitchToPlayer = Math_Vec3f_Pitch(&this->actor.focus.pos, &playerPos);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Stop_heishi/func_80AE87EC.s")
+void EnStopHeishi_UpdateHeadThirdDay(EnStopheishi* this) {
+ if (this->headTurnTimer1 != 0) {
+ this->headTurnTimer1--;
+ }
+ this->pitchToPlayer = -0xBB8;
+ this->headRotXTarget = 0;
+ if (this->headTurnTimer2 < 6) {
+ this->headRotXTarget = 0x1770;
+ if (((u32)this->headTurnTimer2 % 8) == 0) {
+ this->headRotXTarget = -0x1770;
+ }
+ if (this->headTurnTimer1 == 0) {
+ this->headTurnTimer2++;
+ this->headTurnTimer1 = 10;
+ if (this->headTurnTimer2 >= 6) {
+ this->headTurnTimer1 = 50;
+ }
+ }
+ } else if ((this->headTurnTimer1 == 0) && (Quake_GetNumActiveQuakes() != 0) && (this->headTurnTimer2 >= 6)) {
+ this->headTurnTimer2 = 0;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Stop_heishi/EnStopheishi_Draw.s")
+void func_80AE77D4(EnStopheishi* this) {
+ this->unk_274 = 0;
+ this->maxMoveStep = 0.0f;
+ this->rotYTarget = this->actor.home.rot.y;
+ if (this->timer == 1) {
+ this->pitchToPlayer = 0;
+ EnStopHeishi_ChangeAnim(this, SOLDIER_ANIM_5);
+ }
+ if ((this->timer == 0) && (this->unk_264 == 0)) {
+ if ((fabsf(this->actor.world.pos.x - this->actor.home.pos.x) > 3.0f) ||
+ (fabsf(this->actor.world.pos.z - this->actor.home.pos.z) > 3.0f)) {
+ this->skelAnime.playSpeed = 3.0f;
+ Math_ApproachF(&this->actor.world.pos.x, this->actor.home.pos.x, 0.3f, 5.0f);
+ Math_ApproachF(&this->actor.world.pos.z, this->actor.home.pos.z, 0.3f, 5.0f);
+ } else {
+ this->unk_264 = 1;
+ }
+ }
+ if ((this->currentAnim != SOLDIER_ANIM_STAND_HAND_ON_HIP) && (this->currentAnim != SOLDIER_ANIM_STAND_LOOK_DOWN) &&
+ (this->currentAnim != SOLDIER_ANIM_STAND_HAND_ON_CHEST) && (this->unk_264 != 0)) {
+ this->skelAnime.playSpeed = 1.0f;
+ EnStopHeishi_ChangeAnim(this, SOLDIER_ANIM_STAND_HAND_ON_HIP);
+ if ((gSaveContext.save.day != 3) && gSaveContext.save.isNight) {
+ EnStopHeishi_ChangeAnim(this, SOLDIER_ANIM_STAND_LOOK_DOWN);
+ }
+ if (gSaveContext.save.day == 3) {
+ EnStopHeishi_ChangeAnim(this, SOLDIER_ANIM_STAND_HAND_ON_CHEST);
+ }
+ }
+}
+
+void func_80AE795C(EnStopheishi* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+ f32 curFrame = this->skelAnime.curFrame;
+ Vec3f newPos;
+ f32 xDiff;
+ f32 zDiff;
+ f32 playSpeed;
+ s16 yaw;
+ s16 rotY;
+
+ if (ABS_ALT(BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.home.rot.y)) < 0x2000) {
+ this->rotYTarget = this->actor.yawTowardsPlayer;
+ }
+ playSpeed =
+ fabsf((f32)this->actor.yawTowardsPlayer - Math_Vec3f_Yaw(&this->actor.home.pos, &player->actor.world.pos)) *
+ 0.01f * 5.0f;
+ if (this->unk_274 != 4) {
+ this->skelAnime.playSpeed = CLAMP(playSpeed, 1.0f, 5.0f);
+ }
+ yaw = Math_Vec3f_Yaw(&this->actor.home.pos, &player->actor.world.pos);
+ xDiff = fabsf(this->actor.home.pos.x - player->actor.world.pos.x);
+ zDiff = fabsf(this->actor.home.pos.z - player->actor.world.pos.z);
+ Math_Vec3f_Copy(&newPos, &this->actor.home.pos);
+ rotY = this->actor.home.rot.y;
+
+ if (rotY == -0x8000) {
+ if (yaw > 0) {
+ xDiff = Math_SinS(this->actor.home.rot.y + 0xC000) * xDiff;
+ zDiff = Math_CosS(this->actor.home.rot.y + 0xC000) * zDiff;
+ } else {
+ xDiff = Math_SinS(this->actor.home.rot.y + 0x4000) * xDiff;
+ zDiff = Math_CosS(this->actor.home.rot.y + 0x4000) * zDiff;
+ }
+ } else if (yaw < rotY) {
+ xDiff = Math_SinS(this->actor.home.rot.y + 0xC000) * xDiff;
+ zDiff = Math_CosS(this->actor.home.rot.y + 0xC000) * zDiff;
+ } else {
+ xDiff = Math_SinS(this->actor.home.rot.y + 0x4000) * xDiff;
+ zDiff = Math_CosS(this->actor.home.rot.y + 0x4000) * zDiff;
+ }
+
+ if (this->unk_288 < xDiff) {
+ xDiff = this->unk_288;
+ } else if (xDiff < -this->unk_288) {
+ xDiff = -this->unk_288;
+ }
+ if (this->unk_288 < zDiff) {
+ zDiff = this->unk_288;
+ } else if (zDiff < -this->unk_288) {
+ zDiff = -this->unk_288;
+ }
+ newPos.x += xDiff;
+ newPos.z += zDiff;
+ Math_ApproachF(&this->actor.world.pos.x, newPos.x, 0.5f, this->maxMoveStep);
+ Math_ApproachF(&this->actor.world.pos.z, newPos.z, 0.5f, this->maxMoveStep);
+ Math_ApproachF(&this->maxMoveStep, 50.0f, 0.3f, 1.0f);
+
+ switch (this->unk_274) {
+ case 0:
+ if (gSaveContext.save.day != 3) {
+ EnStopHeishi_ChangeAnim(this, SOLDIER_ANIM_4);
+ this->unk_274 = 2;
+ } else {
+ EnStopHeishi_ChangeAnim(this, SOLDIER_ANIM_STAND_HAND_ON_HIP);
+ this->unk_274 = 1;
+ }
+ break;
+
+ case 1:
+ EnStopHeishi_ChangeAnim(this, SOLDIER_ANIM_4);
+ this->unk_274 = 2;
+ break;
+
+ case 2:
+ if (this->currentAnimFrameCount <= curFrame) {
+ EnStopHeishi_ChangeAnim(this, SOLDIER_ANIM_5);
+ this->unk_274 = 3;
+ }
+ break;
+
+ case 3:
+ if ((fabsf(this->actor.world.pos.x - newPos.x) < 2.0f) &&
+ (fabsf(this->actor.world.pos.z - newPos.z) < 2.0f)) {
+ this->skelAnime.playSpeed = 1.0f;
+ EnStopHeishi_ChangeAnim(this, SOLDIER_ANIM_6);
+ this->unk_274 = 4;
+ }
+ break;
+
+ case 4:
+ if ((fabsf(this->actor.world.pos.x - newPos.x) > 4.0f) ||
+ (fabsf(this->actor.world.pos.z - newPos.z) > 4.0f)) {
+ EnStopHeishi_ChangeAnim(this, SOLDIER_ANIM_5);
+ this->unk_274 = 3;
+ }
+ break;
+ }
+ this->unk_264 = 0;
+ this->timer = 20;
+ this->pitchToPlayer = 0;
+ if (this->unk_276 == 3) {
+ Math_Vec3f_Copy(&newPos, &player->actor.world.pos);
+ if ((player->transformation == PLAYER_FORM_DEKU) || (player->transformation == PLAYER_FORM_HUMAN)) {
+ newPos.y += 77.0f + BREG(37);
+ this->pitchToPlayer = Math_Vec3f_Pitch(&this->actor.focus.pos, &newPos);
+ }
+ }
+}
+
+void func_80AE7E9C(EnStopheishi* this) {
+ EnStopHeishi_ChangeAnim(this, SOLDIER_ANIM_STAND_HAND_ON_HIP);
+ if ((gSaveContext.save.day != 3) && gSaveContext.save.isNight) {
+ EnStopHeishi_ChangeAnim(this, SOLDIER_ANIM_STAND_LOOK_DOWN);
+ }
+ if (gSaveContext.save.day == 3) {
+ EnStopHeishi_ChangeAnim(this, SOLDIER_ANIM_STAND_HAND_ON_CHEST);
+ }
+ this->unk_274 = 0;
+ this->disableCollider = false;
+ this->actionFunc = func_80AE7F34;
+ this->actor.speed = 0.0f;
+}
+
+void func_80AE7F34(EnStopheishi* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+ s16 sp32;
+ s16 phi_a2;
+ s32 yawDiffAbs;
+ s16 yawDiff;
+ f32 xDiff;
+ f32 zDiff;
+
+ SkelAnime_Update(&this->skelAnime);
+ if ((this->currentAnim == SOLDIER_ANIM_5) && (((s16)this->skelAnime.curFrame % 2) != 0)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_SOLDIER_WALK);
+ }
+ if (gSaveContext.save.day != 3) {
+ EnStopheishi_UpdateHeadNormal(this, play);
+ } else {
+ EnStopHeishi_UpdateHeadThirdDay(this);
+ }
+ Math_SmoothStepToS(&this->actor.world.rot.y, this->rotYTarget, 1, 0x1388, 0);
+
+ sp32 = 0;
+ if (gSaveContext.save.isNight) {
+ sp32 = 0x20;
+ }
+
+ phi_a2 = 0;
+ switch (player->transformation) {
+ case PLAYER_FORM_HUMAN:
+ if ((STOLEN_ITEM_1 == SLOT_SWORD_GREAT_FAIRY) || (STOLEN_ITEM_1 == ITEM_SWORD_KOKIRI) ||
+ (STOLEN_ITEM_1 == ITEM_SWORD_RAZOR) || (STOLEN_ITEM_1 == ITEM_SWORD_GILDED) ||
+ (STOLEN_ITEM_2 == SLOT_SWORD_GREAT_FAIRY) || (STOLEN_ITEM_2 == ITEM_SWORD_KOKIRI) ||
+ (STOLEN_ITEM_2 == ITEM_SWORD_RAZOR) || (STOLEN_ITEM_2 == ITEM_SWORD_GILDED)) {
+ if (this->unk_265 != 0) {
+ phi_a2 = 1;
+ }
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_12_20)) {
+ phi_a2 = 1;
+ }
+ break;
+
+ case PLAYER_FORM_DEKU:
+ phi_a2 = 4;
+ break;
+
+ case PLAYER_FORM_ZORA:
+ phi_a2 = 3;
+ break;
+
+ case PLAYER_FORM_GORON:
+ phi_a2 = 2;
+ break;
+ }
+
+ if (((phi_a2 == 1) || (phi_a2 == 2) || (phi_a2 == 3)) &&
+ (((this->currentAnim == SOLDIER_ANIM_4)) || (this->currentAnim == SOLDIER_ANIM_5) ||
+ (this->currentAnim == SOLDIER_ANIM_6))) {
+ EnStopHeishi_ChangeAnim(this, SOLDIER_ANIM_STAND_HAND_ON_HIP);
+ if ((gSaveContext.save.day != 3) && gSaveContext.save.isNight) {
+ EnStopHeishi_ChangeAnim(this, SOLDIER_ANIM_STAND_LOOK_DOWN);
+ }
+ if (gSaveContext.save.day == 3) {
+ EnStopHeishi_ChangeAnim(this, SOLDIER_ANIM_STAND_HAND_ON_CHEST);
+ }
+ }
+
+ if ((phi_a2 == 0) || (phi_a2 == 4)) {
+ xDiff = this->actor.home.pos.x - player->actor.world.pos.x;
+ zDiff = this->actor.home.pos.z - player->actor.world.pos.z;
+ this->collider.dim.radius = 50;
+ this->collider.dim.height = 260;
+ if (sqrtf(SQ(xDiff) + SQ(zDiff)) < 240.0f) {
+ func_80AE795C(this, play);
+ } else {
+ func_80AE77D4(this);
+ }
+ } else {
+ this->collider.dim.radius = 15;
+ this->collider.dim.height = 60;
+ }
+ if (phi_a2 != 4) {
+ this->messageIndex = this->unk_276 * 8;
+ this->messageIndex += sp32;
+ this->messageIndex += phi_a2 * 2;
+ } else {
+ this->messageIndex = 64;
+ if (sp32 != 0) {
+ this->messageIndex = 72;
+ }
+ this->messageIndex += this->unk_276 * 2;
+ }
+ if (gSaveContext.save.day != 3) {
+ this->actor.textId = sLeaveMessages[this->messageIndex];
+ this->unk_27E = sLeaveMessages[this->messageIndex + 1];
+ } else {
+ this->actor.textId = sThirdDayLeaveMessages[this->messageIndex];
+ this->unk_27E = sThirdDayLeaveMessages[this->messageIndex + 1];
+ }
+ if (this->unk_27E != 0) {
+ if ((STOLEN_ITEM_1 == ITEM_SWORD_GREAT_FAIRY) || (STOLEN_ITEM_1 == ITEM_SWORD_KOKIRI) ||
+ (STOLEN_ITEM_1 == ITEM_SWORD_RAZOR) || (STOLEN_ITEM_1 == ITEM_SWORD_GILDED) ||
+ (STOLEN_ITEM_2 == ITEM_SWORD_GREAT_FAIRY) || (STOLEN_ITEM_2 == ITEM_SWORD_KOKIRI) ||
+ (STOLEN_ITEM_2 == ITEM_SWORD_RAZOR) || (STOLEN_ITEM_2 == ITEM_SWORD_GILDED)) {
+ if (this->actor.textId == 0x516) {
+ this->actor.textId = 0x56C;
+ } else if (this->actor.textId == 0x520) {
+ this->actor.textId = 0x56E;
+ } else if (this->actor.textId == 0x52A) {
+ this->actor.textId = 0x570;
+ } else if (this->actor.textId == 0x534) {
+ this->actor.textId = 0x572;
+ } else if (this->actor.textId == 0x518) {
+ this->actor.textId = 0x56D;
+ } else if (this->actor.textId == 0x522) {
+ this->actor.textId = 0x56F;
+ } else if (this->actor.textId == 0x52C) {
+ this->actor.textId = 0x571;
+ } else if (this->actor.textId == 0x536) {
+ this->actor.textId = 0x573;
+ }
+ } else if (GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == EQUIP_VALUE_SWORD_NONE) {
+ if (this->actor.textId == 0x516) {
+ this->actor.textId = 0x55E;
+ } else if (this->actor.textId == 0x520) {
+ this->actor.textId = 0x566;
+ } else if (this->actor.textId == 0x52A) {
+ this->actor.textId = 0x568;
+ } else if (this->actor.textId == 0x534) {
+ this->actor.textId = 0x56A;
+ } else if (this->actor.textId == 0x518) {
+ this->actor.textId = 0x55F;
+ } else if (this->actor.textId == 0x522) {
+ this->actor.textId = 0x567;
+ } else if (this->actor.textId == 0x52C) {
+ this->actor.textId = 0x569;
+ } else if (this->actor.textId == 0x536) {
+ this->actor.textId = 0x56B;
+ }
+ }
+ }
+ yawDiff = this->actor.yawTowardsPlayer - this->actor.world.rot.y;
+ yawDiffAbs = ABS_ALT(yawDiff);
+
+ if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ this->skelAnime.playSpeed = 1.0f;
+ func_80AE854C(this, play);
+ } else if (yawDiffAbs < 0x4BB9) {
+ Actor_OfferTalk(&this->actor, play, 70.0f);
+ }
+}
+
+void func_80AE854C(EnStopheishi* this, PlayState* play) {
+ if (((this->unk_265 != 0) || CHECK_WEEKEVENTREG(WEEKEVENTREG_12_20)) &&
+ (this->currentAnim != SOLDIER_ANIM_STAND_HAND_ON_HIP)) {
+ EnStopHeishi_ChangeAnim(this, SOLDIER_ANIM_STAND_HAND_ON_HIP);
+ }
+ this->pitchToPlayer = 0;
+ this->unk_274 = 0;
+ this->disableCollider = true;
+ this->actionFunc = func_80AE85C4;
+}
+
+void func_80AE85C4(EnStopheishi* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ EnStopheishi_UpdateHeadNormal(this, play);
+ if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
+ if (this->unk_27E != 0) {
+ this->actor.textId = this->unk_27E;
+ Message_ContinueTextbox(play, this->actor.textId);
+ EnStopHeishi_ChangeAnim(this, SOLDIER_ANIM_STAND_HAND_ON_HIP);
+ SET_WEEKEVENTREG(WEEKEVENTREG_12_20);
+ this->unk_265 = 1;
+ this->unk_27E = 0;
+ } else {
+ Message_CloseTextbox(play);
+ func_80AE7E9C(this);
+ }
+ }
+}
+
+void EnStopheishi_Update(Actor* thisx, PlayState* play) {
+ EnStopheishi* this = (EnStopheishi*)thisx;
+ s32 pad;
+
+ if (this->timer != 0) {
+ this->timer--;
+ }
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ Math_SmoothStepToS(&this->headRotX, this->headRotXTarget, 1, 0x7D0, 0);
+ 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,
+ 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);
+ Math_Vec3s_Copy(&this->actor.focus.rot, &this->actor.world.rot);
+ if (!this->disableCollider) {
+ Collider_UpdateCylinder(&this->actor, &this->collider);
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
+ }
+}
+
+s32 EnStopheishi_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
+ EnStopheishi* this = THIS;
+
+ if (limbIndex == SOLDIER_LIMB_HEAD) {
+ rot->x += this->headRotX;
+ rot->z += this->headRotZ;
+ }
+ return false;
+}
+
+void EnStopheishi_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
+ EnStopheishi* this = THIS;
+
+ if (limbIndex == SOLDIER_LIMB_HEAD) {
+ Matrix_MultVec3f(&gZeroVec3f, &this->headWorldPos);
+ }
+}
+
+void EnStopheishi_Draw(Actor* thisx, PlayState* play) {
+ EnStopheishi* this = THIS;
+
+ 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_Stop_heishi/z_en_stop_heishi.h b/src/overlays/actors/ovl_En_Stop_heishi/z_en_stop_heishi.h
index 8e27f1c36..651a66496 100644
--- a/src/overlays/actors/ovl_En_Stop_heishi/z_en_stop_heishi.h
+++ b/src/overlays/actors/ovl_En_Stop_heishi/z_en_stop_heishi.h
@@ -2,16 +2,46 @@
#define Z_EN_STOP_HEISHI_H
#include "global.h"
+#include "objects/object_sdn/object_sdn.h"
struct EnStopheishi;
typedef void (*EnStopheishiActionFunc)(struct EnStopheishi*, PlayState*);
+#define ENSTOPHEISHI_GET_SWITCH_FLAG(thisx) (((thisx)->params) & 0x3F)
+#define ENSTOPHEISHI_GET_F000(thisx) ((((thisx)->params) >> 0xC) & 0xF)
+
typedef struct EnStopheishi {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x110];
+ /* 0x144 */ SkelAnime skelAnime;
+ /* 0x188 */ Vec3s jointTable[SOLDIER_LIMB_MAX];
+ /* 0x1EE */ Vec3s morphTable[SOLDIER_LIMB_MAX];
/* 0x254 */ EnStopheishiActionFunc actionFunc;
- /* 0x258 */ char unk_258[0x90];
+ /* 0x258 */ s16 headRotZ;
+ /* 0x25A */ s16 headRotX;
+ /* ox25C */ UNK_TYPE1 unk_25C[2];
+ /* 0x25E */ s16 pitchToPlayer;
+ /* 0x260 */ s16 headRotXTarget;
+ /* 0x262 */ s16 unk_262; // Unused
+ /* 0x264 */ u8 unk_264; // Locking value at `0` prevents leaving the guard pose, however locking to 1 doesn't prevent guarding.
+ /* 0x265 */ u8 unk_265;
+ /* 0x266 */ s16 unk_266;
+ /* 0x268 */ s32 currentAnim;
+ /* 0x26C */ f32 currentAnimFrameCount;
+ /* 0x270 */ s16 timer;
+ /* 0x272 */ s16 headTurnTimer1;
+ /* 0x274 */ s16 unk_274;
+ /* 0x276 */ s16 unk_276;
+ /* 0x278 */ s16 disableCollider;
+ /* 0x27A */ s16 switchFlag;
+ /* 0x27C */ s16 messageIndex;
+ /* 0x27E */ s16 unk_27E;
+ /* 0x280 */ s16 rotYTarget;
+ /* 0x284 */ s32 headTurnTimer2;
+ /* 0x288 */ f32 unk_288;
+ /* 0x28C */ f32 maxMoveStep;
+ /* 0x28C */ Vec3f headWorldPos;
+ /* 0x29C */ ColliderCylinder collider;
} EnStopheishi; // size = 0x2E8
#endif // Z_EN_STOP_HEISHI_H
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..a5cb80095 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);
}
@@ -127,7 +127,7 @@ void EnStream_Update(Actor* thisx, PlayState* play) {
EnStream* this = THIS;
this->actionFunc(this, play);
- func_800B8FE8(&this->actor, NA_SE_EV_WHIRLPOOL - SFX_FLAG);
+ Actor_PlaySfx_FlaggedCentered3(&this->actor, NA_SE_EV_WHIRLPOOL - SFX_FLAG);
}
void EnStream_Draw(Actor* thisx, PlayState* play) {
@@ -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 93c93eef9..bc0099298 100644
--- a/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c
+++ b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c
@@ -5,12 +5,12 @@
*/
#include "z_en_suttari.h"
-#include "overlays/actors/ovl_En_Elf/z_en_elf.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "overlays/actors/ovl_En_Door/z_en_door.h"
+#include "overlays/actors/ovl_En_Elf/z_en_elf.h"
#include "overlays/effects/ovl_Effect_Ss_Solder_Srch_Ball/z_eff_ss_solder_srch_ball.h"
-#include "objects/object_boj/object_boj.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnSuttari*)thisx)
@@ -130,7 +130,7 @@ static TrackOptionsSet sTrackOptions = {
static u8 D_80BAE820[] = {
/* 0x00 */ SCHEDULE_CMD_CHECK_NOT_IN_DAY_S(2, 0x80 - 0x04),
- /* 0x04 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_33_08, 0x7F - 0x08),
+ /* 0x04 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_RECOVERED_STOLEN_BOMB_BAG, 0x7F - 0x08),
/* 0x08 */ SCHEDULE_CMD_CHECK_NOT_IN_SCENE_S(SCENE_ICHIBA, 0x3D - 0x0C),
/* 0x0C */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(0, 0, 0, 25, 0x37 - 0x12),
/* 0x12 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(0, 25, 0, 30, 0x31 - 0x18),
@@ -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);
@@ -450,9 +483,9 @@ void func_80BAAFDC(EnSuttari* this, PlayState* play) {
SOLDERSRCHBALL_INVISIBLE);
}
if (this->playerDetected == true) {
- play_sound(NA_SE_SY_FOUND);
+ Audio_PlaySfx(NA_SE_SY_FOUND);
this->playerDetected = false;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->unk1F4[0] != 0) {
this->unk1F4[0]--;
}
@@ -483,9 +516,9 @@ void func_80BAB1A0(EnSuttari* this, PlayState* play) {
SOLDERSRCHBALL_INVISIBLE);
}
if (this->playerDetected == true) {
- play_sound(NA_SE_SY_FOUND);
+ Audio_PlaySfx(NA_SE_SY_FOUND);
this->playerDetected = false;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->unk1F4[0] != 0) {
this->unk1F4[0]--;
}
@@ -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) {
@@ -544,7 +578,7 @@ void func_80BAB4F0(EnSuttari* this, PlayState* play) {
Math_SmoothStepToS(&this->torsoRot.y, 0, 4, 0x3E8, 1);
}
}
- SubS_FillLimbRotTables(play, this->unk2FA, this->unk31A, ARRAY_COUNT(this->unk2FA));
+ SubS_UpdateFidgetTables(play, this->fidgetTableY, this->fidgetTableZ, OBJECT_BOJ_LIMB_MAX);
}
s16 EnSuttari_GetDistSqAndOrient(Path* path, s32 index, Vec3f* pos, f32* distSq) {
@@ -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;
}
@@ -632,7 +666,7 @@ void func_80BABA90(EnSuttari* this, s32 arg1, u8 arg2) {
if (this->paths[arg1] != NULL) {
target = EnSuttari_GetDistSqAndOrient(this->paths[arg1], this->unk1F4[arg1], &this->actor.world.pos, &dist);
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
if (arg2 == 2) {
this->unk1F4[arg1] = -0x63;
} else {
@@ -661,7 +695,7 @@ void func_80BABB90(EnSuttari* this, s32 arg1) {
if (this->paths[arg1] != NULL) {
target = EnSuttari_GetDistSqAndOrient(this->paths[arg1], this->unk1F4[arg1], &this->actor.world.pos, &sp30);
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
target = this->actor.wallYaw;
}
Math_SmoothStepToS(&this->actor.world.rot.y, target, 1, 0xBB8, 0);
@@ -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 (!CHECK_WEEKEVENTREG(WEEKEVENTREG_RECOVERED_STOLEN_BOMB_BAG)) {
+ 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);
}
@@ -944,17 +993,18 @@ void func_80BAC6E8(EnSuttari* this, PlayState* play) {
SkelAnime_InitFlex(play, &this->skelAnime, &object_boj_Skel_00C240, &object_boj_Anim_00071C, this->jointTable,
this->morphTable, 16);
this->actor.draw = EnSuttari_Draw;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
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;
this->actionFunc = func_80BACA14;
return;
} else if ((gSaveContext.save.day == 3) && (gSaveContext.save.time <= CLOCK_TIME(19, 0)) &&
- !CHECK_WEEKEVENTREG(WEEKEVENTREG_61_08) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_33_08) &&
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_61_08) &&
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_RECOVERED_STOLEN_BOMB_BAG) &&
CHECK_WEEKEVENTREG(WEEKEVENTREG_51_08)) {
this->animIndex = 2;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
@@ -962,15 +1012,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;
@@ -978,7 +1028,7 @@ void func_80BAC6E8(EnSuttari* this, PlayState* play) {
this->actionFunc = func_80BAD004;
return;
} else if (play->sceneId == SCENE_ICHIBA) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_33_08)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_RECOVERED_STOLEN_BOMB_BAG)) {
Actor_Kill(&this->actor);
return;
}
@@ -988,14 +1038,14 @@ void func_80BAC6E8(EnSuttari* this, PlayState* play) {
this->actionFunc = func_80BAD5F8;
return;
} else if (play->sceneId == SCENE_AYASHIISHOP) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_33_08)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_RECOVERED_STOLEN_BOMB_BAG)) {
Actor_Kill(&this->actor);
return;
}
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 +1061,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;
}
@@ -1029,10 +1079,10 @@ void func_80BACA14(EnSuttari* this, PlayState* play) {
func_80BAAB78(this, play);
this->actionFunc = func_80BADA9C;
} else if (this->actor.xzDistToPlayer < 200.0f) {
- func_800B8614(&this->actor, play, 200.0f);
+ Actor_OfferTalk(&this->actor, play, 200.0f);
}
}
- Math_ApproachF(&this->actor.speedXZ, 5.0f, 0.2f, 0.1f);
+ Math_ApproachF(&this->actor.speed, 5.0f, 0.2f, 0.1f);
Actor_MoveWithGravity(&this->actor);
}
@@ -1041,11 +1091,11 @@ 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)) {
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
target = this->actor.wallYaw;
} else if (func_80BAA904(this, play)) {
target = -this->actor.world.rot.y;
@@ -1054,13 +1104,13 @@ void func_80BACBB0(EnSuttari* this, PlayState* play) {
}
Math_SmoothStepToS(&this->actor.world.rot.y, target, 4, 0x3E8, 1);
this->actor.shape.rot.y = this->actor.world.rot.y;
- Math_ApproachF(&this->actor.speedXZ, 5.0f, 0.2f, 0.1f);
+ Math_ApproachF(&this->actor.speed, 5.0f, 0.2f, 0.1f);
} else {
this->actionFunc = func_80BACD2C;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
Actor_MoveWithGravity(&this->actor);
- if (!(this->actor.bgCheckFlags & 1)) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
this->actor.world.pos = this->actor.prevPos;
this->actor.world.rot.y = -this->actor.world.rot.y;
this->actionFunc = func_80BACE4C;
@@ -1071,18 +1121,18 @@ 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)) {
this->actionFunc = func_80BACBB0;
- Math_ApproachF(&this->actor.speedXZ, 5.0f, 0.2f, 0.1f);
+ Math_ApproachF(&this->actor.speed, 5.0f, 0.2f, 0.1f);
} else {
Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 4, 0x3E8, 1);
this->actor.shape.rot.y = this->actor.world.rot.y;
}
Actor_MoveWithGravity(&this->actor);
- if (!(this->actor.bgCheckFlags & 1)) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
this->actor.world.pos = this->actor.prevPos;
this->actor.world.rot.y = -this->actor.world.rot.y;
this->actionFunc = func_80BACE4C;
@@ -1107,10 +1157,10 @@ void func_80BACEE0(EnSuttari* this, PlayState* play) {
this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset);
if (!Schedule_RunScript(play, D_80BAE820, &scheduleOutput) ||
((this->unk428 != scheduleOutput.result) && !func_80BABF64(this, play, &scheduleOutput))) {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
scheduleOutput.result = 0;
} else {
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}
this->unk428 = scheduleOutput.result;
func_80BAC2FC(this, play);
@@ -1118,7 +1168,7 @@ void func_80BACEE0(EnSuttari* this, PlayState* play) {
if (this->unk428 == 5) {
SET_WEEKEVENTREG(WEEKEVENTREG_58_80);
this->actionFunc = func_80BADDB4;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
} else if (Player_GetMask(play) != PLAYER_MASK_STONE) {
func_80BAB1A0(this, play);
}
@@ -1131,18 +1181,18 @@ void func_80BAD004(EnSuttari* this, PlayState* play) {
this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset);
if (!Schedule_RunScript(play, D_80BAE820, &scheduleOutput) ||
((this->unk428 != scheduleOutput.result) && !func_80BABF64(this, play, &scheduleOutput))) {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
scheduleOutput.result = 0;
} else {
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}
this->unk428 = scheduleOutput.result;
func_80BAC2FC(this, play);
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
Message_StartTextbox(play, 0x2A3A, &this->actor);
this->actionFunc = func_80BAD130;
- } else if ((this->actor.xzDistToPlayer < 200.0f) || this->actor.isTargeted) {
- func_800B863C(&this->actor, play);
+ } else if ((this->actor.xzDistToPlayer < 200.0f) || this->actor.isLockedOn) {
+ Actor_OfferTalkNearColChkInfoCylinder(&this->actor, play);
}
Actor_MoveWithGravity(&this->actor);
}
@@ -1151,7 +1201,7 @@ void func_80BAD130(EnSuttari* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
if (((talkState == TEXT_STATE_5) || (talkState == TEXT_STATE_DONE)) && Message_ShouldAdvance(play)) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
if (this->flags1 & 8) {
this->actionFunc = func_80BAD004;
@@ -1168,27 +1218,27 @@ 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;
- Audio_QueueSeqCmd(NA_BGM_CHASE | 0x8000);
+ 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]);
- play->msgCtx.msgMode = 0x43;
+ CutsceneManager_Stop(this->csIdList[1]);
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->flags1 |= 0x40;
this->actionFunc = func_80BAD380;
@@ -1203,7 +1253,7 @@ void func_80BAD380(EnSuttari* this, PlayState* play) {
if ((player->stateFlags1 & PLAYER_STATE1_40) && (play->msgCtx.currentTextId != 0x2A31)) {
this->flags1 |= 0x8000;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
} else {
this->flags1 &= ~0x8000;
func_80BABA90(this, 1, 1);
@@ -1211,8 +1261,8 @@ void func_80BAD380(EnSuttari* this, PlayState* play) {
this->flags2 &= ~0x10;
player->stateFlags1 &= ~PLAYER_STATE1_10000000;
this->flags1 &= ~0x4000;
- ActorCutscene_Stop(this->cutscenes[1]);
- play->msgCtx.msgMode = 0x43;
+ CutsceneManager_Stop(this->csIdList[1]);
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->flags1 |= 0x40;
}
@@ -1220,26 +1270,26 @@ void func_80BAD380(EnSuttari* this, PlayState* play) {
this->flags2 |= 8;
func_80BAAF1C(this);
} else if (this->flags1 & 0x200) {
- SET_WEEKEVENTREG(WEEKEVENTREG_79_40);
+ SET_WEEKEVENTREG(WEEKEVENTREG_SAKON_DEAD);
this->flags2 |= 4;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->actor.world.pos.x, this->actor.world.pos.y,
- this->actor.world.pos.z, 0, 0, 0, CLEAR_TAG_SMALL_EXPLOSION);
+ this->actor.world.pos.z, 0, 0, 0, CLEAR_TAG_PARAMS(CLEAR_TAG_SMALL_EXPLOSION));
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 30, NA_SE_IT_BOMB_EXPLOSION);
Actor_Kill(&this->actor);
return;
}
if (this->unk1F4[1] == -0x63) {
if (this->flags2 & 8) {
- SET_WEEKEVENTREG(WEEKEVENTREG_33_08);
+ SET_WEEKEVENTREG(WEEKEVENTREG_RECOVERED_STOLEN_BOMB_BAG);
}
- this->actor.speedXZ = 0.0f;
- Audio_QueueSeqCmd(0x101400FF);
+ this->actor.speed = 0.0f;
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 20);
this->flags2 |= 4;
EnSuttari_TriggerTransition(play, ENTRANCE(NORTH_CLOCK_TOWN, 7));
} else {
this->unk3F2 = this->headRot.y;
- Math_ApproachF(&this->actor.speedXZ, 4.0f, 0.2f, 0.5f);
+ Math_ApproachF(&this->actor.speed, 4.0f, 0.2f, 0.5f);
Actor_MoveWithGravity(&this->actor);
func_80BAB374(this, play);
}
@@ -1258,14 +1308,14 @@ void func_80BAD5F8(EnSuttari* this, PlayState* play) {
this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset);
if (!Schedule_RunScript(play, D_80BAE820, &scheduleOutput) ||
((this->unk428 != scheduleOutput.result) && !func_80BABF64(this, play, &scheduleOutput))) {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
scheduleOutput.result = 0;
} else {
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}
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;
}
@@ -1274,8 +1324,8 @@ void func_80BAD5F8(EnSuttari* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
Message_StartTextbox(play, 0x2A02, &this->actor);
this->actionFunc = func_80BAD130;
- } else if ((this->actor.xzDistToPlayer < 100.0f) || this->actor.isTargeted) {
- func_800B863C(&this->actor, play);
+ } else if ((this->actor.xzDistToPlayer < 100.0f) || this->actor.isLockedOn) {
+ Actor_OfferTalkNearColChkInfoCylinder(&this->actor, play);
}
}
Actor_MoveWithGravity(&this->actor);
@@ -1296,14 +1346,14 @@ void func_80BAD7F8(EnSuttari* this, PlayState* play) {
this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset);
if (!Schedule_RunScript(play, D_80BAE820, &scheduleOutput) ||
((this->unk428 != scheduleOutput.result) && !func_80BABF64(this, play, &scheduleOutput))) {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
scheduleOutput.result = 0;
} else {
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}
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;
}
@@ -1311,8 +1361,8 @@ void func_80BAD7F8(EnSuttari* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
Message_StartTextbox(play, 0x2A02, &this->actor);
this->actionFunc = func_80BAD130;
- } else if ((this->actor.xzDistToPlayer < 100.0f) || this->actor.isTargeted) {
- func_800B863C(&this->actor, play);
+ } else if ((this->actor.xzDistToPlayer < 100.0f) || this->actor.isLockedOn) {
+ Actor_OfferTalkNearColChkInfoCylinder(&this->actor, play);
}
}
Actor_MoveWithGravity(&this->actor);
@@ -1326,7 +1376,7 @@ void func_80BADA08(EnSuttari* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_81_04);
} else if (this->actor.xzDistToPlayer < 500.0f) {
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8614(&this->actor, play, 500.0f);
+ Actor_OfferTalk(&this->actor, play, 500.0f);
}
}
@@ -1346,14 +1396,14 @@ 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) {
((EnElf*)GET_PLAYER(play)->tatlActor)->unk_264 |= 0x10;
this->flags2 &= ~1;
}
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->textId = 0;
if (this->flags1 & 1) {
@@ -1368,14 +1418,18 @@ void func_80BADA9C(EnSuttari* this, PlayState* play) {
} else if ((talkstate == TEXT_STATE_CHOICE) && Message_ShouldAdvance(play)) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
this->flags1 |= 0x800;
func_80BAAB78(this, play);
break;
+
case 1:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
func_80BAAB78(this, play);
break;
+
+ default:
+ break;
}
}
if (!(this->flags1 & 4)) {
@@ -1385,16 +1439,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]);
}
}
@@ -1410,10 +1464,10 @@ void func_80BADDB4(EnSuttari* this, PlayState* play) {
void func_80BADE14(EnSuttari* this, PlayState* play) {
func_80BABA90(this, 1, 2);
if (this->unk1F4[1] == -0x63) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
} else {
this->unk3F2 = this->headRot.y;
- Math_ApproachF(&this->actor.speedXZ, 6.0f, 0.2f, 0.5f);
+ Math_ApproachF(&this->actor.speed, 6.0f, 0.2f, 0.5f);
}
Actor_MoveWithGravity(&this->actor);
}
@@ -1427,7 +1481,7 @@ void func_80BADE8C(EnSuttari* this, PlayState* play) {
this->actionFunc = func_80BAD130;
} else {
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8614(&this->actor, play, 500.0f);
+ Actor_OfferTalk(&this->actor, play, 500.0f);
}
}
@@ -1438,7 +1492,7 @@ void func_80BADF3C(EnSuttari* this, PlayState* play) {
}
this->unk3F2 = this->headRot.y;
if (DECR(this->unk3F6) == 0) {
- Math_ApproachF(&this->actor.speedXZ, 6.0f, 0.2f, 0.5f);
+ Math_ApproachF(&this->actor.speed, 6.0f, 0.2f, 0.5f);
}
Actor_MoveWithGravity(&this->actor);
}
@@ -1447,14 +1501,14 @@ void EnSuttari_Init(Actor* thisx, PlayState* play) {
EnSuttari* this = THIS;
s32 pad;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_79_40)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_SAKON_DEAD)) {
Actor_Kill(&this->actor);
return;
}
Collider_InitCylinder(play, &this->collider);
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit2);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
EnSuttari_GetPaths(this, play);
Actor_SetScale(&this->actor, 0.01f);
this->actionFunc = func_80BAC6E8;
@@ -1465,7 +1519,7 @@ void EnSuttari_Destroy(Actor* thisx, PlayState* play) {
EnSuttari* this = THIS;
if ((play->sceneId == SCENE_BACKTOWN) && !(this->flags2 & 4)) {
- Audio_QueueSeqCmd(0x101400FF);
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 20);
}
Collider_DestroyCylinder(play, &this->collider);
}
@@ -1483,16 +1537,16 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_EV_PAMERA_WALK);
+ 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_PlaySfxAtPos(&this->actor, NA_SE_EV_PAMERA_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_PAMERA_WALK);
}
}
}
@@ -1514,9 +1568,9 @@ 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) {
- rot->y += (s16)(Math_SinS(this->unk2FA[limbIndex]) * 200.0f);
- rot->z += (s16)(Math_CosS(this->unk31A[limbIndex]) * 200.0f);
+ if ((limbIndex == 8) || (limbIndex == 9) || (limbIndex == 0xC)) {
+ rot->y += (s16)(Math_SinS(this->fidgetTableY[limbIndex]) * 200.0f);
+ rot->z += (s16)(Math_CosS(this->fidgetTableZ[limbIndex]) * 200.0f);
}
return false;
}
@@ -1543,9 +1597,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);
}
}
@@ -1562,12 +1619,13 @@ void EnSuttari_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
void EnSuttari_Draw(Actor* thisx, PlayState* play) {
EnSuttari* this = THIS;
s32 pad;
- Vec3f sp5C;
- Vec3f sp50;
+ Vec3f pos;
+ Vec3f scale;
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++);
@@ -1575,13 +1633,14 @@ 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);
- sp5C = this->actor.world.pos;
- sp50.x = 0.2f;
- sp50.y = 0.2f;
- sp50.z = 0.2f;
- func_800BC620(&sp5C, &sp50, 0xFF, play);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ pos = this->actor.world.pos;
+ scale.x = 0.2f;
+ scale.y = 0.2f;
+ scale.z = 0.2f;
+ func_800BC620(&pos, &scale, 255, play);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
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..3ba38563f 100644
--- a/src/overlays/actors/ovl_En_Suttari/z_en_suttari.h
+++ b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.h
@@ -2,13 +2,16 @@
#define Z_EN_SUTTARI_H
#include "global.h"
+#include "objects/object_boj/object_boj.h"
#include "overlays/actors/ovl_En_Fsn/z_en_fsn.h"
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;
@@ -25,14 +28,14 @@ typedef struct EnSuttari {
/* 0x1EC */ Path* paths[2];
/* 0x1F4 */ s32 unk1F4[2];
/* 0x1FC */ UNK_TYPE1 unk_1FC[0x1A];
- /* 0x216 */ Vec3s jointTable[16];
- /* 0x276 */ Vec3s morphTable[16];
+ /* 0x216 */ Vec3s jointTable[OBJECT_BOJ_LIMB_MAX];
+ /* 0x276 */ Vec3s morphTable[OBJECT_BOJ_LIMB_MAX];
/* 0x2D6 */ Vec3s trackTarget;
/* 0x2DC */ Vec3s headRot;
/* 0x2E2 */ Vec3s torsoRot;
/* 0x2E8 */ UNK_TYPE1 unk_2E8[0x12];
- /* 0x2FA */ s16 unk2FA[16];
- /* 0x31A */ s16 unk31A[16];
+ /* 0x2FA */ s16 fidgetTableY[OBJECT_BOJ_LIMB_MAX];
+ /* 0x31A */ s16 fidgetTableZ[OBJECT_BOJ_LIMB_MAX];
/* 0x33A */ UNK_TYPE1 unk_33A[0xB6];
/* 0x3F0 */ s16 playerDetected;
/* 0x3F2 */ s16 unk3F2;
@@ -56,8 +59,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 bbc010a2a..8cab11988 100644
--- a/src/overlays/actors/ovl_En_Sw/z_en_sw.c
+++ b/src/overlays/actors/ovl_En_Sw/z_en_sw.c
@@ -5,9 +5,10 @@
*/
#include "z_en_sw.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "objects/object_st/object_st.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY)
#define THIS ((EnSw*)thisx)
@@ -172,10 +173,10 @@ void func_808D8940(EnSw* this, PlayState* play) {
}
s32 func_808D8B58(EnSw* this) {
- s16 phi_s2 = (s16)((s16)(Rand_ZeroOne() * 1000.0f) % ARRAY_COUNT(this->unk_464)) * 0x1555;
+ s16 phi_s2 = (s16)(TRUNCF_BINANG(Rand_ZeroOne() * 1000.0f) % ENSW_BODYPART_MAX) * 0x1555;
s32 i;
- for (i = 0; i < ARRAY_COUNT(this->unk_464); i++, phi_s2 += 0x1555) {
+ for (i = 0; i < ENSW_BODYPART_MAX; i++, phi_s2 += 0x1555) {
if (this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
this->unk_464[i] = (Rand_ZeroOne() * 16.0f) + 8.0f;
} else {
@@ -185,41 +186,41 @@ s32 func_808D8B58(EnSw* this) {
this->drawDmgEffFrozenSteamScales[i] = 0.45000002f;
if ((this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FIRE) || (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_BLUE_FIRE) ||
(this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) {
- this->unk_380[i].y = (Rand_ZeroOne() - 0.5f) * 20.0f;
+ this->bodyPartsPos[i].y = (Rand_ZeroOne() - 0.5f) * 20.0f;
} else {
- this->unk_380[i].y = ((Rand_ZeroOne() - 0.5f) * 20.0f) + 10.0f;
+ this->bodyPartsPos[i].y = ((Rand_ZeroOne() - 0.5f) * 20.0f) + 10.0f;
}
- this->unk_380[i].x = Math_SinS(phi_s2) * 10.0f;
- this->unk_380[i].z = Math_CosS(phi_s2) * 10.0f;
+ this->bodyPartsPos[i].x = Math_SinS(phi_s2) * 10.0f;
+ this->bodyPartsPos[i].z = Math_CosS(phi_s2) * 10.0f;
}
this->unk_462 = 1;
return 0;
}
-s32 func_808D8D60(EnSw* this, PlayState* play, s32 arg2) {
- s32 ret = false;
+s32 func_808D8D60(EnSw* this, PlayState* play, s32 bodyPartIndex) {
+ s32 ret = 0;
u8 drawDmgEffType;
- Vec3f limbPos[1];
+ Vec3f bodyPartsPos[1];
f32 drawDmgEffAlpha;
- if (arg2 < this->unk_462) {
- if (this->unk_464[arg2] != 0) {
- drawDmgEffAlpha = (f32)this->unk_464[arg2] / this->unk_47C[arg2];
+ if (bodyPartIndex < this->unk_462) {
+ if (this->unk_464[bodyPartIndex] != 0) {
+ drawDmgEffAlpha = (f32)this->unk_464[bodyPartIndex] / this->unk_47C[bodyPartIndex];
drawDmgEffType = this->drawDmgEffType;
- Math_ApproachF(&this->drawDmgEffFrozenSteamScales[arg2], 0.3f, 0.3f, 0.5f);
- Math_Vec3f_Copy(&limbPos[0], &this->actor.world.pos);
- limbPos[0].x += this->unk_380[arg2].x;
- limbPos[0].y += this->unk_380[arg2].y;
- limbPos[0].z += this->unk_380[arg2].z;
+ Math_ApproachF(&this->drawDmgEffFrozenSteamScales[bodyPartIndex], 0.3f, 0.3f, 0.5f);
+ Math_Vec3f_Copy(&bodyPartsPos[0], &this->actor.world.pos);
+ bodyPartsPos[0].x += this->bodyPartsPos[bodyPartIndex].x;
+ bodyPartsPos[0].y += this->bodyPartsPos[bodyPartIndex].y;
+ bodyPartsPos[0].z += this->bodyPartsPos[bodyPartIndex].z;
if (drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
- if ((this->unk_47C[arg2] - this->unk_464[arg2]) < 20) {
+ if ((this->unk_47C[bodyPartIndex] - this->unk_464[bodyPartIndex]) < 20) {
drawDmgEffType = ACTOR_DRAW_DMGEFF_FROZEN_SFX;
}
drawDmgEffAlpha = 1.0f;
}
- Actor_DrawDamageEffects(play, &this->actor, limbPos, ARRAY_COUNT(limbPos), 0.3f,
- this->drawDmgEffFrozenSteamScales[arg2], drawDmgEffAlpha, drawDmgEffType);
- ret = true;
+ Actor_DrawDamageEffects(play, &this->actor, bodyPartsPos, ARRAY_COUNT(bodyPartsPos), 0.3f,
+ this->drawDmgEffFrozenSteamScales[bodyPartIndex], drawDmgEffAlpha, drawDmgEffType);
+ ret = 1;
}
}
return ret;
@@ -229,14 +230,14 @@ void func_808D8ED0(EnSw* this, PlayState* play) {
Vec3f sp54;
s32 i;
- for (i = 0; i < ARRAY_COUNT(this->unk_380); i++) {
+ for (i = 0; i < ENSW_BODYPART_MAX; i++) {
Math_Vec3f_Copy(&sp54, &this->actor.world.pos);
- sp54.x += this->unk_380[i].x;
- sp54.y += this->unk_380[i].y;
- sp54.z += this->unk_380[i].z;
- Math_Vec3f_Copy(&this->unk_380[i], &sp54);
+ sp54.x += this->bodyPartsPos[i].x;
+ sp54.y += this->bodyPartsPos[i].y;
+ sp54.z += this->bodyPartsPos[i].z;
+ Math_Vec3f_Copy(&this->bodyPartsPos[i], &sp54);
}
- Actor_SpawnIceEffects(play, &this->actor, this->unk_380, ARRAY_COUNT(this->unk_380), 3, 0.1f, 0.3f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, ENSW_BODYPART_MAX, 3, 0.1f, 0.3f);
}
void func_808D8FC4(EnSw* this, PlayState* play) {
@@ -304,7 +305,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,13 +353,12 @@ 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;
}
-#ifdef NON_MATCHING
void func_808D94D0(EnSw* this, PlayState* play, s32 arg2, s32 arg3, s16 arg4) {
CollisionPoly* spA4;
CollisionPoly* spA0;
@@ -378,8 +378,8 @@ void func_808D94D0(EnSw* this, PlayState* play, s32 arg2, s32 arg3, s16 arg4) {
sp68 = BGCHECK_SCENE;
sp64 = BGCHECK_SCENE;
func_808D90F0(this, arg3, arg4);
- this->actor.speedXZ = this->unk_44C;
- temp_f20 = thisx->speedXZ * 2.0f;
+ this->actor.speed = this->unk_44C;
+ temp_f20 = thisx->speed * 2.0f;
sp90.x = this->actor.world.pos.x + (this->unk_368.x * 2.0f);
sp90.y = this->actor.world.pos.y + (this->unk_368.y * 2.0f);
@@ -397,7 +397,7 @@ void func_808D94D0(EnSw* this, PlayState* play, s32 arg2, s32 arg3, s16 arg4) {
func_808D91C4(this, spA4);
Math_Vec3f_Copy(&this->actor.world.pos, &sp78);
this->actor.floorBgId = sp64;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
} else {
if (spA0 != this->actor.floorPoly) {
func_808D91C4(this, spA0);
@@ -406,13 +406,12 @@ void func_808D94D0(EnSw* this, PlayState* play, s32 arg2, s32 arg3, s16 arg4) {
this->actor.floorBgId = sp68;
}
} else {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
temp_f20 *= 3.0f;
Math_Vec3f_Copy(&sp90, &sp84);
for (i = 0; i < 3; i++) {
if (i == 0) {
- if (this && this && this) {}
sp84.x = sp90.x - (this->unk_350.x * temp_f20);
sp84.y = sp90.y - (this->unk_350.y * temp_f20);
sp84.z = sp90.z - (this->unk_350.z * temp_f20);
@@ -433,6 +432,9 @@ void func_808D94D0(EnSw* this, PlayState* play, s32 arg2, s32 arg3, s16 arg4) {
break;
}
}
+
+ //! FAKE
+ if (i == 3) {}
}
func_808D93BC(this);
@@ -440,18 +442,14 @@ void func_808D94D0(EnSw* this, PlayState* play, s32 arg2, s32 arg3, s16 arg4) {
this->actor.shape.rot.y = this->actor.world.rot.y;
this->actor.shape.rot.z = this->actor.world.rot.z;
- if (this->actor.speedXZ != 0.0f) {
- this->unk_44C = this->actor.speedXZ;
+ if (this->actor.speed != 0.0f) {
+ this->unk_44C = this->actor.speed;
}
if (arg2 == 1) {
Actor_MoveWithoutGravity(&this->actor);
}
}
-#else
-void func_808D94D0(EnSw* this, PlayState* play, s32 arg2, s32 arg3, s16 arg4);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Sw/func_808D94D0.s")
-#endif
void func_808D9894(EnSw* this, Vec3f* vec) {
Vec3f sp5C;
@@ -504,8 +502,8 @@ s32 func_808D99C8(EnSw* this, PlayState* play) {
return false;
}
- if ((this->actor.xyzDistToPlayerSq < ((sREG(16) * 10) + 60000)) && (play->actorCtx.unk1F5 != 0) &&
- (play->actorCtx.unk1F4 == 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;
}
@@ -524,9 +522,9 @@ s32 func_808D9A70(EnSw* this, PlayState* play) {
} else {
if (this->unk_456 != 0) {
if (!ENSW_GET_3(&this->actor)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALWALL_ROLL);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALWALL_ROLL);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALGOLD_ROLL);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALGOLD_ROLL);
}
this->unk_456--;
this->skelAnime.curFrame = 0.0f;
@@ -555,15 +553,15 @@ s32 func_808D9C18(EnSw* this) {
f32 new_var;
if ((this->unk_498 == 0xF9) || (this->unk_498 == 0x82) || (this->unk_498 == 0xE4) || (this->unk_498 == 0xE5)) {
- this->actor.velocity.x = this->actor.speedXZ;
- this->actor.velocity.z = this->actor.speedXZ;
+ this->actor.velocity.x = this->actor.speed;
+ this->actor.velocity.z = this->actor.speed;
this->actor.velocity.x *= Math_SinS(this->actor.world.rot.y);
this->actor.velocity.z *= Math_CosS(this->actor.world.rot.y);
} else {
- new_var = this->actor.speedXZ * this->unk_350.x;
- this->actor.velocity.x = new_var + (this->actor.speedXZ * this->unk_368.x);
- new_var = this->actor.speedXZ * this->unk_350.z;
- this->actor.velocity.z = new_var + this->actor.speedXZ * this->unk_368.z;
+ new_var = this->actor.speed * this->unk_350.x;
+ this->actor.velocity.x = new_var + (this->actor.speed * this->unk_368.x);
+ new_var = this->actor.speed * this->unk_350.z;
+ this->actor.velocity.z = new_var + this->actor.speed * this->unk_368.z;
this->actor.velocity.y = 14.0f;
Math_Vec3f_Copy(&sp3C, &this->actor.world.pos);
Math_Vec3f_Copy(&sp30, &this->actor.world.pos);
@@ -575,7 +573,7 @@ s32 func_808D9C18(EnSw* this) {
this->actor.world.rot.y = Math_Vec3f_Yaw(&sp3C, &sp30);
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALTURA_APPEAR);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALTURA_APPEAR);
if (ENSW_GET_3(&this->actor) == 1) {
Actor_SetScale(&this->actor, 0.0f);
@@ -635,10 +633,10 @@ void func_808D9F78(EnSw* this, PlayState* play, s32 arg2) {
}
Actor_SetScale(&this->actor, 0.02f);
func_808D9DA0(this);
- this->actor.speedXZ = 10.0f;
+ this->actor.speed = 10.0f;
this->unk_44C = 10.0f;
func_808D94D0(this, play, 0, 0, 0);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->unk_44C = 0.0f;
this->unk_450 = 1.0f;
Math_Vec3f_Copy(&this->actor.home.pos, &this->actor.world.pos);
@@ -647,10 +645,10 @@ void func_808D9F78(EnSw* this, PlayState* play, s32 arg2) {
void func_808DA024(EnSw* this, PlayState* play) {
func_808D9DA0(this);
- this->actor.speedXZ = 10.0f;
+ this->actor.speed = 10.0f;
this->unk_44C = 10.0f;
func_808D94D0(this, play, 0, 0, 0);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->unk_44C = 0.0f;
this->unk_450 = 1.0f;
}
@@ -664,7 +662,7 @@ s32 func_808DA08C(EnSw* this, PlayState* play) {
if (this->actor.colChkInfo.damageEffect == 4) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->actor.world.pos.x, this->actor.world.pos.y,
- this->actor.world.pos.z, 0, 0, 0, CLEAR_TAG_LARGE_LIGHT_RAYS);
+ this->actor.world.pos.z, 0, 0, 0, CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
}
if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
@@ -676,7 +674,7 @@ s32 func_808DA08C(EnSw* this, PlayState* play) {
} else if (!func_808D90C4(this)) {
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EN_STALTU_DEAD);
Enemy_StartFinishingBlow(play, &this->actor);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
if (!ENSW_GET_3(&this->actor)) {
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 3);
}
@@ -717,19 +715,20 @@ s32 func_808DA08C(EnSw* this, PlayState* play) {
}
this->unk_458 = 20;
this->unk_45A = 0;
- Actor_SetColorFilter(&this->actor, 0x4000, 200, 0, this->unk_458);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 200, COLORFILTER_BUFFLAG_OPA, this->unk_458);
ret = true;
} else if (this->actor.colChkInfo.damageEffect == 1) {
if (this->unk_45A == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
this->unk_45A = 40;
- Actor_SetColorFilter(&this->actor, 0, 200, 0, this->unk_45A);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 200, COLORFILTER_BUFFLAG_OPA,
+ this->unk_45A);
}
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALTU_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALTU_DAMAGE);
this->unk_458 = 20;
this->unk_45A = 0;
- Actor_SetColorFilter(&this->actor, 0x4000, 200, 0, this->unk_458);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 200, COLORFILTER_BUFFLAG_OPA, this->unk_458);
}
}
return ret;
@@ -739,7 +738,7 @@ void func_808DA350(EnSw* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if ((player->stateFlags1 & PLAYER_STATE1_200000) && (this->actor.xyzDistToPlayerSq < 8000.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALWALL_LAUGH);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALWALL_LAUGH);
Math_Vec3f_Copy(&this->unk_374, &player->actor.world.pos);
this->unk_410 &= ~0x20;
this->unk_414 = 0.0f;
@@ -764,7 +763,7 @@ void func_808DA3F4(EnSw* this, PlayState* play) {
temp_v0 = Math_Atan2S_XY(sp38.z, sp38.x);
if (ABS_ALT(temp_v0) < temp_s1) {
this->skelAnime.curFrame = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALWALL_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALWALL_DASH);
this->unk_414 = 0.0f;
if (this->unk_410 & 0x20) {
this->actionFunc = func_808DA6FC;
@@ -775,7 +774,7 @@ void func_808DA3F4(EnSw* this, PlayState* play) {
}
temp_s1 *= (temp_v0 < 0) ? -1 : 1;
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALWALL_ROLL);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALWALL_ROLL);
this->skelAnime.curFrame = 0.0f;
}
func_808D94D0(this, play, 0, 0, temp_s1);
@@ -791,7 +790,7 @@ void func_808DA578(EnSw* this, PlayState* play) {
temp_f0 = this->skelAnime.endFrame - this->skelAnime.curFrame;
this->unk_44C = 0.3f * temp_f0;
func_808D94D0(this, play, 1, 0, 0);
- if ((this->actor.speedXZ == 0.0f) && (this->unk_44C != 0.0f)) {
+ if ((this->actor.speed == 0.0f) && (this->unk_44C != 0.0f)) {
Math_Vec3f_Copy(&sp30, &this->unk_374);
func_808D9894(this, &sp30);
temp2 = Math_Atan2S_XY(sp30.z, sp30.x);
@@ -801,7 +800,7 @@ void func_808DA578(EnSw* this, PlayState* play) {
Math_Vec3f_Copy(&this->unk_374, &this->actor.home.pos);
this->actionFunc = func_808DA3F4;
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALWALL_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALWALL_DASH);
this->skelAnime.curFrame = 0.0f;
}
@@ -822,14 +821,14 @@ void func_808DA6FC(EnSw* this, PlayState* play) {
temp_f0 = this->skelAnime.endFrame - this->skelAnime.curFrame;
this->unk_44C = 0.14f * temp_f0;
func_808D94D0(this, play, 1, 0, 0);
- if ((this->actor.speedXZ == 0.0f) && (this->unk_44C != 0.0f)) {
+ if ((this->actor.speed == 0.0f) && (this->unk_44C != 0.0f)) {
Math_Vec3f_Copy(&sp38, &this->unk_374);
func_808D9894(this, &sp38);
temp2 = Math_Atan2S_XY(sp38.z, sp38.x);
func_808D94D0(this, play, 0, 0, temp2);
}
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALWALL_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALWALL_DASH);
this->skelAnime.curFrame = 0.0f;
}
@@ -873,16 +872,16 @@ void func_808DA89C(EnSw* this, PlayState* play) {
} else if (ENSW_GET_3(&this->actor)) {
this->actionFunc = func_808DAEB4;
} else {
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
f32 temp_f2;
this->actor.shape.yOffset = 400.0f;
temp_f2 = fabsf(this->actor.velocity.y) * 0.6f;
this->actor.velocity.y = temp_f2;
this->unk_448 = temp_f2;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if ((s32)temp_f2 != 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALTURA_BOUND);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALTURA_BOUND);
} else {
this->actionFunc = func_808DAEB4;
this->actor.velocity.y = 0.0f;
@@ -895,18 +894,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) {
@@ -914,13 +913,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_PlaySfxAtPos(&this->actor, NA_SE_EN_STALWALL_DASH);
- Math_Vec3s_ToVec3f(&this->unk_374, &sp44[this->unk_4A0]);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALWALL_DASH);
+ Math_Vec3s_ToVec3f(&this->unk_374, &points[this->unk_4A0]);
this->actionFunc = func_808DACF4;
this->unk_414 = 0.0f;
sp40 = ABS_ALT(temp_v0);
@@ -929,7 +928,7 @@ void func_808DAA60(EnSw* this, PlayState* play) {
}
} else {
if (this->unk_456 != 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALGOLD_ROLL);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALGOLD_ROLL);
this->unk_456--;
this->skelAnime.curFrame = 0.0f;
} else {
@@ -963,7 +962,7 @@ void func_808DACF4(EnSw* this, PlayState* play) {
temp = this->skelAnime.endFrame - this->skelAnime.curFrame;
this->unk_44C = 0.1f * temp;
func_808D94D0(this, play, 1, 0, 0);
- if ((this->actor.speedXZ == 0.0f) && (this->unk_44C != 0.0f)) {
+ if ((this->actor.speed == 0.0f) && (this->unk_44C != 0.0f)) {
Math_Vec3f_Copy(&sp38, &this->unk_374);
func_808D9894(this, &sp38);
@@ -971,7 +970,7 @@ void func_808DACF4(EnSw* this, PlayState* play) {
func_808D94D0(this, play, 0, 0, temp_f6);
}
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALWALL_DASH);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALWALL_DASH);
this->skelAnime.curFrame = 0.0f;
}
@@ -980,7 +979,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;
}
@@ -1036,7 +1035,7 @@ void func_808DAEB4(EnSw* this, PlayState* play) {
sp5C.z += this->unk_368.z * 10.0f;
if (Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_SI, sp5C.x, sp5C.y, sp5C.z, 0, 0,
0, this->actor.params) != NULL) {
- play_sound(NA_SE_SY_KINSTA_MARK_APPEAR);
+ Audio_PlaySfx(NA_SE_SY_KINSTA_MARK_APPEAR);
}
Actor_Kill(&this->actor);
}
@@ -1075,9 +1074,9 @@ void func_808DB100(EnSw* this, PlayState* play) {
if ((DECR(this->unk_454) == 0) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
if (this->unk_456 != 0) {
if (!ENSW_GET_3(&this->actor)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALWALL_ROLL);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALWALL_ROLL);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALGOLD_ROLL);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALGOLD_ROLL);
}
this->unk_456--;
this->skelAnime.curFrame = 0.0f;
@@ -1089,21 +1088,21 @@ 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);
}
}
void func_808DB2E0(EnSw* this, PlayState* play) {
f32 temp_f2;
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
func_808D9F78(this, play, 0);
temp_f2 = fabsf(this->actor.velocity.y) * 0.6f;
this->actor.velocity.x *= 0.5f;
@@ -1112,7 +1111,7 @@ void func_808DB2E0(EnSw* this, PlayState* play) {
this->actor.velocity.z *= 0.5f;
if ((s32)temp_f2 != 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALTURA_BOUND);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALTURA_BOUND);
} else {
func_800BC154(play, &play->actorCtx, &this->actor, 5);
Math_Vec3f_Copy(&this->actor.velocity, &gZeroVec3f);
@@ -1129,7 +1128,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) {
@@ -1153,8 +1152,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;
}
@@ -1165,7 +1165,7 @@ void EnSw_Init(Actor* thisx, PlayState* play) {
break;
case 1:
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.flags |= ACTOR_FLAG_10;
if (this->actor.world.rot.z < 0) {
@@ -1186,7 +1186,7 @@ void EnSw_Init(Actor* thisx, PlayState* play) {
case 2:
case 3:
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.flags |= ACTOR_FLAG_10;
if (this->actor.world.rot.z < 0) {
@@ -1200,7 +1200,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;
@@ -1281,6 +1281,9 @@ s32 EnSw_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po
case 4:
*dList = object_st_DL_0043D8;
break;
+
+ default:
+ break;
}
}
return false;
@@ -1288,21 +1291,21 @@ s32 EnSw_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po
void EnSw_Draw(Actor* thisx, PlayState* play) {
EnSw* this = THIS;
- s32 i;
+ s32 bodyPartIndex;
s32 count;
if (this->unk_410 & 4) {
if (ENSW_GET_3(&this->actor)) {
- func_800B8050(&this->actor, play, MTXMODE_NEW);
+ func_800B8050(&this->actor, play, 0);
}
- 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);
}
- for (i = 0, count = 0; i < ARRAY_COUNT(this->unk_464); i++) {
- count += func_808D8D60(this, play, i);
+ for (bodyPartIndex = 0, count = 0; bodyPartIndex < ENSW_BODYPART_MAX; bodyPartIndex++) {
+ count += func_808D8D60(this, play, bodyPartIndex);
}
if (count != 0) {
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..9cb68a3fa 100644
--- a/src/overlays/actors/ovl_En_Sw/z_en_sw.h
+++ b/src/overlays/actors/ovl_En_Sw/z_en_sw.h
@@ -11,25 +11,43 @@ 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 enum EnSwBodyPart {
+ /* 0 */ ENSW_BODYPART_0,
+ /* 1 */ ENSW_BODYPART_1,
+ /* 2 */ ENSW_BODYPART_2,
+ /* 3 */ ENSW_BODYPART_3,
+ /* 4 */ ENSW_BODYPART_4,
+ /* 5 */ ENSW_BODYPART_5,
+ /* 6 */ ENSW_BODYPART_6,
+ /* 7 */ ENSW_BODYPART_7,
+ /* 8 */ ENSW_BODYPART_8,
+ /* 9 */ ENSW_BODYPART_9,
+ /* 10 */ ENSW_BODYPART_10,
+ /* 11 */ ENSW_BODYPART_11,
+ /* 12 */ ENSW_BODYPART_MAX
+} EnSwBodyPart;
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;
/* 0x35C */ Vec3f unk_35C;
/* 0x368 */ Vec3f unk_368;
/* 0x374 */ Vec3f unk_374;
- /* 0x380 */ Vec3f unk_380[12];
+ /* 0x380 */ Vec3f bodyPartsPos[ENSW_BODYPART_MAX];
/* 0x410 */ u16 unk_410;
/* 0x412 */ u8 drawDmgEffType;
/* 0x414 */ f32 unk_414;
- /* 0x418 */ f32 drawDmgEffFrozenSteamScales[12];
+ /* 0x418 */ f32 drawDmgEffFrozenSteamScales[ENSW_BODYPART_MAX];
/* 0x448 */ f32 unk_448;
/* 0x44C */ f32 unk_44C;
/* 0x450 */ f32 unk_450;
@@ -41,8 +59,8 @@ typedef struct EnSw {
/* 0x45E */ s16 unk_45E;
/* 0x460 */ s16 unk_460;
/* 0x462 */ s16 unk_462;
- /* 0x464 */ s16 unk_464[12];
- /* 0x47C */ s16 unk_47C[12];
+ /* 0x464 */ s16 unk_464[ENSW_BODYPART_MAX];
+ /* 0x47C */ s16 unk_47C[ENSW_BODYPART_MAX];
/* 0x494 */ s16 unk_494;
/* 0x496 */ s16 unk_496;
/* 0x498 */ s16 unk_498;
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 1a2f8b685..7e5cebb1c 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
@@ -7,7 +7,7 @@
#include "z_en_syateki_crow.h"
#include "overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.h"
-#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_8000000)
+#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_CANT_LOCK_ON)
#define THIS ((EnSyatekiCrow*)thisx)
@@ -16,8 +16,8 @@ void EnSyatekiCrow_Destroy(Actor* thisx, PlayState* play);
void EnSyatekiCrow_Update(Actor* thisx, PlayState* play);
void EnSyatekiCrow_Draw(Actor* thisx, PlayState* play);
-void EnSyatekiCrow_SetupWaitForSpawn(EnSyatekiCrow* this);
-void EnSyatekiCrow_WaitForSpawn(EnSyatekiCrow* this, PlayState* play);
+void EnSyatekiCrow_SetupWaitForSignal(EnSyatekiCrow* this);
+void EnSyatekiCrow_WaitForSignal(EnSyatekiCrow* this, PlayState* play);
void EnSyatekiCrow_SetupWaitToMove(EnSyatekiCrow* this);
void EnSyatekiCrow_WaitToMove(EnSyatekiCrow* this, PlayState* play);
void EnSyatekiCrow_Fly(EnSyatekiCrow* this, PlayState* play);
@@ -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_GUAY) {
+ path = &play->setupPathList[path->additionalPathIndex];
}
- for (i = 0; i < EN_SYATEKI_CROW_GET_INDEX(&this->actor); i++) {
- path = &play->setupPathList[path->unk1];
+ for (i = 0; i < SG_GUAY_GET_INDEX(&this->actor); i++) {
+ path = &play->setupPathList[path->additionalPathIndex];
}
Actor_ProcessInitChain(&this->actor, sInitChain);
@@ -95,7 +95,7 @@ void EnSyatekiCrow_Init(Actor* thisx, PlayState* play2) {
this->collider.elements[0].dim.worldSphere.radius = sJntSphInit.elements[0].dim.modelSphere.radius;
ActorShape_Init(&this->actor.shape, 2000.0f, ActorShadow_DrawCircle, 20.0f);
- if ((path == NULL) || (EN_SYATEKI_CROW_GET_INDEX(&this->actor) >= 0x80)) {
+ if ((path == NULL) || (SG_GUAY_GET_INDEX(&this->actor) >= 0x80)) {
Actor_Kill(&this->actor);
return;
}
@@ -105,7 +105,7 @@ void EnSyatekiCrow_Init(Actor* thisx, PlayState* play2) {
this->maxPointIndex = path->count;
this->deathTimer = 20;
this->waitTimer = 0;
- EnSyatekiCrow_SetupWaitForSpawn(this);
+ EnSyatekiCrow_SetupWaitForSignal(this);
}
void EnSyatekiCrow_Destroy(Actor* thisx, PlayState* play) {
@@ -114,26 +114,26 @@ void EnSyatekiCrow_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyJntSph(play, &this->collider);
}
-void EnSyatekiCrow_SetupWaitForSpawn(EnSyatekiCrow* this) {
+void EnSyatekiCrow_SetupWaitForSignal(EnSyatekiCrow* this) {
Actor_SetScale(&this->actor, 0.03f);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.gravity = 0.0f;
this->actor.world = this->actor.home;
this->actor.prevPos = this->actor.home.pos;
this->actor.shape.rot = this->actor.world.rot;
this->currentPointIndex = 1;
this->actor.draw = NULL;
- this->actionFunc = EnSyatekiCrow_WaitForSpawn;
+ this->actionFunc = EnSyatekiCrow_WaitForSignal;
}
/**
- * Waits until the shooting gallery man sets the appropriate Guay flag to spawn.
+ * Waits until the shooting gallery man sets the appropriate Guay flag.
*/
-void EnSyatekiCrow_WaitForSpawn(EnSyatekiCrow* this, PlayState* play) {
+void EnSyatekiCrow_WaitForSignal(EnSyatekiCrow* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
if ((syatekiMan->shootingGameState == SG_GAME_STATE_RUNNING) && (this->isActive == true) &&
- (syatekiMan->guayFlags & (1 << EN_SYATEKI_CROW_GET_INDEX(&this->actor)))) {
+ (syatekiMan->guayFlags & (1 << SG_GUAY_GET_INDEX(&this->actor)))) {
EnSyatekiCrow_SetupWaitToMove(this);
} else if (syatekiMan->shootingGameState != SG_GAME_STATE_RUNNING) {
this->isActive = true;
@@ -144,6 +144,10 @@ void EnSyatekiCrow_WaitForSpawn(EnSyatekiCrow* this, PlayState* play) {
}
}
+/**
+ * Positions the Guay at the start of its assigned path and rotates it to face the
+ * next point on the path, then sets it up to start waiting.
+ */
void EnSyatekiCrow_SetupWaitToMove(EnSyatekiCrow* this) {
Vec3f targetPos;
@@ -164,10 +168,10 @@ void EnSyatekiCrow_SetupWaitToMove(EnSyatekiCrow* this) {
* How long the Guay should wait is controlled by its params.
*/
void EnSyatekiCrow_WaitToMove(EnSyatekiCrow* this, PlayState* play) {
- if (((EN_SYATEKI_CROW_GET_WAIT_MOD(&this->actor) * 20) + 20) < this->waitTimer) {
- Actor_PlaySfxAtPos(this->actor.parent, NA_SE_EN_KAICHO_CRY);
+ if (((SG_GUAY_GET_WAIT_MOD(&this->actor) * 20) + 20) < this->waitTimer) {
+ Actor_PlaySfx(this->actor.parent, NA_SE_EN_KAICHO_CRY);
this->waitTimer = 0;
- this->actor.speedXZ = EN_SYATEKI_CROW_GET_SPEED_MOD(&this->actor) + 6.0f;
+ this->actor.speed = SG_GUAY_GET_SPEED_MOD(&this->actor) + 6.0f;
this->actor.gravity = -0.5f;
this->actionFunc = EnSyatekiCrow_Fly;
} else {
@@ -181,7 +185,7 @@ void EnSyatekiCrow_Fly(EnSyatekiCrow* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
if (syatekiMan->shootingGameState != SG_GAME_STATE_RUNNING) {
- EnSyatekiCrow_SetupWaitForSpawn(this);
+ EnSyatekiCrow_SetupWaitForSignal(this);
return;
}
@@ -202,35 +206,35 @@ void EnSyatekiCrow_Fly(EnSyatekiCrow* this, PlayState* play) {
this->currentPointIndex++;
} else {
this->isActive = false;
- syatekiMan->guayFlags &= ~(1 << EN_SYATEKI_CROW_GET_INDEX(&this->actor));
- EnSyatekiCrow_SetupWaitForSpawn(this);
+ syatekiMan->guayFlags &= ~(1 << SG_GUAY_GET_INDEX(&this->actor));
+ EnSyatekiCrow_SetupWaitForSignal(this);
}
SkelAnime_Update(&this->skelAnime);
this->actor.shape.yOffset = (fabsf(this->skelAnime.curFrame - 3.0f) * 150.0f) + 1700.0f;
- if ((syatekiMan->perGameVar1.guaySpawnTimer % 90) == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KAICHO_CRY);
+ if ((syatekiMan->guayAppearTimer % 90) == 0) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KAICHO_CRY);
}
}
void EnSyatekiCrow_SetupDead(EnSyatekiCrow* this) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
- syatekiMan->score += 60;
+ syatekiMan->score += SG_POINTS_GUAY;
this->isActive = false;
- this->actor.speedXZ *= Math_CosS(this->actor.world.rot.x);
+ this->actor.speed *= Math_CosS(this->actor.world.rot.x);
this->actor.velocity.y = 0.0f;
Animation_Change(&this->skelAnime, &gGuayFlyAnim, 0.4f, 0.0f, 0.0f, ANIMMODE_LOOP_INTERP, -3.0f);
- this->actor.bgCheckFlags &= ~1;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KAICHO_DEAD);
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 40);
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KAICHO_DEAD);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 40);
this->actionFunc = EnSyatekiCrow_Dead;
}
void EnSyatekiCrow_Dead(EnSyatekiCrow* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f);
+ Math_StepToF(&this->actor.speed, 0.0f, 0.5f);
this->actor.colorFilterTimer = 40;
if (this->actor.colorFilterParams & 0x4000) {
@@ -241,8 +245,8 @@ void EnSyatekiCrow_Dead(EnSyatekiCrow* this, PlayState* play) {
if (this->deathTimer > 20) {
func_800B3030(play, &this->actor.world.pos, &sZeroVec, &sZeroVec, this->actor.scale.x * 10000.0f, 0, 0);
syatekiMan->guayHitCounter++;
- syatekiMan->guayFlags &= ~(1 << EN_SYATEKI_CROW_GET_INDEX(&this->actor));
- EnSyatekiCrow_SetupWaitForSpawn(this);
+ syatekiMan->guayFlags &= ~(1 << SG_GUAY_GET_INDEX(&this->actor));
+ EnSyatekiCrow_SetupWaitForSignal(this);
}
this->deathTimer++;
@@ -255,10 +259,10 @@ static Vec3f sAccel = { 0.0f, 0.0f, 0.0f };
void EnSyatekiCrow_UpdateDamage(EnSyatekiCrow* this, PlayState* play) {
if (this->actionFunc == EnSyatekiCrow_Fly) {
if (this->collider.base.acFlags & AC_HIT) {
- play_sound(NA_SE_SY_TRE_BOX_APPEAR);
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
this->deathTimer = 0;
this->collider.base.acFlags &= ~AC_HIT;
- EffectSsExtra_Spawn(play, &this->actor.world.pos, &sVelocity, &sAccel, 5, 1);
+ EffectSsExtra_Spawn(play, &this->actor.world.pos, &sVelocity, &sAccel, 5, EXTRA_SCORE_INDEX_60);
EnSyatekiCrow_SetupDead(this);
} else {
this->collider.elements[0].dim.worldSphere.center.x = this->actor.world.pos.x;
@@ -288,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;
@@ -303,8 +307,8 @@ void EnSyatekiCrow_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
Vec3f* bodyPartPos;
if (limbIndex == OBJECT_CROW_LIMB_BODY) {
- Matrix_MultVec3f(&sBodyOffset, &this->bodyPartsPos[0]);
- this->bodyPartsPos[0].y -= 20.0f;
+ Matrix_MultVec3f(&sBodyOffset, &this->bodyPartsPos[SG_GUAY_BODYPART_BODY]);
+ this->bodyPartsPos[SG_GUAY_BODYPART_BODY].y -= 20.0f;
} else if ((limbIndex == OBJECT_CROW_LIMB_RIGHT_WING_TIP) || (limbIndex == OBJECT_CROW_LIMB_LEFT_WING_TIP) ||
(limbIndex == OBJECT_CROW_LIMB_TAIL)) {
bodyPartPos = &this->bodyPartsPos[(limbIndex >> 1) - 1];
@@ -316,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_Crow/z_en_syateki_crow.h b/src/overlays/actors/ovl_En_Syateki_Crow/z_en_syateki_crow.h
index f244b0b60..fd9a679d8 100644
--- a/src/overlays/actors/ovl_En_Syateki_Crow/z_en_syateki_crow.h
+++ b/src/overlays/actors/ovl_En_Syateki_Crow/z_en_syateki_crow.h
@@ -4,18 +4,26 @@
#include "global.h"
#include "objects/object_crow/object_crow.h"
-#define EN_SYATEKI_CROW_GET_WAIT_MOD(thisx) ((thisx)->params & 0xF)
-#define EN_SYATEKI_CROW_GET_SPEED_MOD(thisx) (((thisx)->params & 0xF0) >> 4)
-#define EN_SYATEKI_CROW_GET_INDEX(thisx) (((thisx)->params & 0xFF00) >> 8)
-#define EN_SYATEKI_CROW_PARAMS(index, speedMod, waitMod) (((index << 8) & 0xFF00) | ((speedMod << 4) & 0xF0) | (waitMod & 0xF))
+#define SG_GUAY_GET_WAIT_MOD(thisx) ((thisx)->params & 0xF)
+#define SG_GUAY_GET_SPEED_MOD(thisx) (((thisx)->params & 0xF0) >> 4)
+#define SG_GUAY_GET_INDEX(thisx) (((thisx)->params & 0xFF00) >> 8)
+#define SG_GUAY_PARAMS(index, speedMod, waitMod) (((index << 8) & 0xFF00) | ((speedMod << 4) & 0xF0) | (waitMod & 0xF))
struct EnSyatekiCrow;
typedef void (*EnSyatekiCrowActionFunc)(struct EnSyatekiCrow*, PlayState*);
+typedef enum EnSyatekiCrowBodyPart {
+ /* 0 */ SG_GUAY_BODYPART_BODY,
+ /* 1 */ SG_GUAY_BODYPART_RIGHT_WING_TIP,
+ /* 2 */ SG_GUAY_BODYPART_LEFT_WING_TIP,
+ /* 3 */ SG_GUAY_BODYPART_TAIL,
+ /* 4 */ SG_GUAY_BODYPART_MAX
+} EnSyatekiCrowBodyPart;
+
typedef struct EnSyatekiCrow {
/* 0x000 */ Actor actor;
- /* 0x144 */ Vec3f bodyPartsPos[4];
+ /* 0x144 */ Vec3f bodyPartsPos[SG_GUAY_BODYPART_MAX];
/* 0x174 */ SkelAnime skelAnime;
/* 0x1B8 */ EnSyatekiCrowActionFunc actionFunc;
/* 0x1BC */ s16 waitTimer;
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 601095cfd..c4d366718 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
@@ -8,7 +8,7 @@
#include "overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.h"
#include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h"
-#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_8000000)
+#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_CANT_LOCK_ON)
#define THIS ((EnSyatekiDekunuts*)thisx)
@@ -17,10 +17,10 @@ void EnSyatekiDekunuts_Destroy(Actor* thisx, PlayState* play);
void EnSyatekiDekunuts_Update(Actor* thisx, PlayState* play);
void EnSyatekiDekunuts_Draw(Actor* thisx, PlayState* play);
-void EnSyatekiDekunuts_SetupWaitForSpawn(EnSyatekiDekunuts* this);
-void EnSyatekiDekunuts_WaitForSpawn(EnSyatekiDekunuts* this, PlayState* play);
-void EnSyatekiDekunuts_SetupSpawn(EnSyatekiDekunuts* this);
-void EnSyatekiDekunuts_Spawn(EnSyatekiDekunuts* this, PlayState* play);
+void EnSyatekiDekunuts_SetupWaitForSignal(EnSyatekiDekunuts* this);
+void EnSyatekiDekunuts_WaitForSignal(EnSyatekiDekunuts* this, PlayState* play);
+void EnSyatekiDekunuts_SetupWaitToStart(EnSyatekiDekunuts* this);
+void EnSyatekiDekunuts_WaitToStart(EnSyatekiDekunuts* this, PlayState* play);
void EnSyatekiDekunuts_SetupWaitToEmerge(EnSyatekiDekunuts* this);
void EnSyatekiDekunuts_WaitToEmerge(EnSyatekiDekunuts* this, PlayState* play);
void EnSyatekiDekunuts_SetupEmerge(EnSyatekiDekunuts* this);
@@ -35,9 +35,9 @@ void EnSyatekiDekunuts_GameEnd(EnSyatekiDekunuts* this, PlayState* play);
void EnSyatekiDekunuts_Dead(EnSyatekiDekunuts* this, PlayState* play);
typedef enum {
- /* 0 */ EN_SYATEKI_DEKUNUTS_HEADDRESS_TYPE_NORMAL,
- /* 1 */ EN_SYATEKI_DEKUNUTS_HEADDRESS_TYPE_FLIPPED_UP,
-} EnSyatekiDekunutsHeaddressType;
+ /* 0 */ SG_DEKU_HEADDRESS_TYPE_NORMAL,
+ /* 1 */ SG_DEKU_HEADDRESS_TYPE_FLIPPED_UP
+} ShootingGalleryDekuScrubHeaddressType;
ActorInit En_Syateki_Dekunuts_InitVars = {
ACTOR_EN_SYATEKI_DEKUNUTS,
@@ -74,23 +74,23 @@ static ColliderCylinderInit sCylinderInit = {
static Cylinder16 sBonusDekuScrubColliderDimensions[] = { { 24, 40, 0, { 0, 0, 0 } } };
typedef enum {
- /* 0 */ EN_SYATEKI_DEKUNUTS_ANIM_UP,
- /* 1 */ EN_SYATEKI_DEKUNUTS_ANIM_BURROW,
- /* 2 */ EN_SYATEKI_DEKUNUTS_ANIM_IDLE, // unused
- /* 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
-} EnSyatekiDekunutsAnimation;
+ /* 0 */ SG_DEKU_ANIM_UP,
+ /* 1 */ SG_DEKU_ANIM_BURROW,
+ /* 2 */ SG_DEKU_ANIM_IDLE, // unused
+ /* 3 */ SG_DEKU_ANIM_LOOK_AROUND,
+ /* 4 */ SG_DEKU_ANIM_DAMAGE,
+ /* 5 */ SG_DEKU_ANIM_DIE,
+ /* 6 */ SG_DEKU_ANIM_UNBURROW // unused
+} ShootingGalleryDekuScrubAnimation;
static AnimationInfo sAnimationInfo[] = {
- { &gDekuScrubUpAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f },
- { &gDekuScrubBurrowAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f },
- { &gDekuScrubIdleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -1.0f },
- { &gDekuScrubLookAroundAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -1.0f },
- { &gDekuScrubDamageAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f },
- { &gDekuScrubDieAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f },
- { &gDekuScrubUnburrowAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f },
+ { &gDekuScrubUpAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f }, // SG_DEKU_ANIM_UP
+ { &gDekuScrubBurrowAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f }, // SG_DEKU_ANIM_BURROW
+ { &gDekuScrubIdleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -1.0f }, // SG_DEKU_ANIM_IDLE
+ { &gDekuScrubLookAroundAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -1.0f }, // SG_DEKU_ANIM_LOOK_AROUND
+ { &gDekuScrubDamageAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f }, // SG_DEKU_ANIM_DAMAGE
+ { &gDekuScrubDieAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f }, // SG_DEKU_ANIM_DIE
+ { &gDekuScrubUnburrowAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f }, // SG_DEKU_ANIM_UNBURROW
};
static InitChainEntry sInitChain[] = {
@@ -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;
@@ -112,21 +112,21 @@ void EnSyatekiDekunuts_Init(Actor* thisx, PlayState* play2) {
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
- if (EN_SYATEKI_DEKUNUTS_GET_TYPE(&this->actor) == EN_SYATEKI_DEKUNUTS_TYPE_BONUS) {
+ if (SG_DEKU_GET_TYPE(&this->actor) == SG_DEKU_TYPE_BONUS) {
Actor_SetScale(&this->actor, 0.01f);
this->collider.dim = sBonusDekuScrubColliderDimensions[0];
- unkPathComparison = 3;
+ pathType = SG_PATH_TYPE_DEKU_BONUS;
} else {
Actor_SetScale(&this->actor, 0.02f);
- unkPathComparison = 1;
+ pathType = SG_PATH_TYPE_DEKU_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];
+ for (i = 0; i < SG_DEKU_GET_ADDITIONAL_PATH_INDEX_LIMIT(&this->actor); i++) {
+ path = &play->setupPathList[path->additionalPathIndex];
}
if (sDrawFlowers == true) {
@@ -147,12 +147,12 @@ void EnSyatekiDekunuts_Init(Actor* thisx, PlayState* play2) {
}
this->flowerPos = Lib_SegmentedToVirtual(path->points);
- this->index = EN_SYATEKI_DEKUNUTS_GET_INDEX(&this->actor);
+ this->index = SG_DEKU_GET_INDEX(&this->actor);
this->flowerCount = path->count;
this->timer = 0;
this->unk_1DC = 0;
this->waitTimer = 0;
- EnSyatekiDekunuts_SetupWaitForSpawn(this);
+ EnSyatekiDekunuts_SetupWaitForSignal(this);
}
void EnSyatekiDekunuts_Destroy(Actor* thisx, PlayState* play) {
@@ -161,10 +161,10 @@ void EnSyatekiDekunuts_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyCylinder(play, &this->collider);
}
-void EnSyatekiDekunuts_SetupWaitForSpawn(EnSyatekiDekunuts* this) {
+void EnSyatekiDekunuts_SetupWaitForSignal(EnSyatekiDekunuts* this) {
Animation_PlayOnceSetSpeed(&this->skelAnime, &gDekuScrubUpAnim, 0.0f);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.world = this->actor.home;
this->actor.prevPos = this->actor.home.pos;
this->actor.shape.rot = this->actor.world.rot;
@@ -172,28 +172,28 @@ void EnSyatekiDekunuts_SetupWaitForSpawn(EnSyatekiDekunuts* this) {
this->timer = 0;
this->unk_1DC = 0;
- if (EN_SYATEKI_DEKUNUTS_GET_TYPE(&this->actor) != EN_SYATEKI_DEKUNUTS_TYPE_BONUS) {
+ if (SG_DEKU_GET_TYPE(&this->actor) != SG_DEKU_TYPE_BONUS) {
this->isAlive = true;
}
- this->actionFunc = EnSyatekiDekunuts_WaitForSpawn;
+ this->actionFunc = EnSyatekiDekunuts_WaitForSignal;
}
/**
- * Waits until the shooting gallery man sets the appropriate Deku Scrub flag to spawn.
+ * Waits until the shooting gallery man sets the appropriate Deku Scrub flag.
*/
-void EnSyatekiDekunuts_WaitForSpawn(EnSyatekiDekunuts* this, PlayState* play) {
+void EnSyatekiDekunuts_WaitForSignal(EnSyatekiDekunuts* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
if ((syatekiMan->shootingGameState == SG_GAME_STATE_RUNNING) && (this->isAlive == true) &&
(syatekiMan->dekuScrubFlags & (1 << this->index))) {
- EnSyatekiDekunuts_SetupSpawn(this);
+ EnSyatekiDekunuts_SetupWaitToStart(this);
} else if (syatekiMan->shootingGameState != SG_GAME_STATE_RUNNING) {
this->isAlive = true;
}
if (!syatekiMan->dekuScrubFlags && !syatekiMan->guayFlags &&
- (EN_SYATEKI_DEKUNUTS_GET_TYPE(&this->actor) != EN_SYATEKI_DEKUNUTS_TYPE_BONUS)) {
+ (SG_DEKU_GET_TYPE(&this->actor) != SG_DEKU_TYPE_BONUS)) {
this->isAlive = true;
}
}
@@ -201,7 +201,7 @@ void EnSyatekiDekunuts_WaitForSpawn(EnSyatekiDekunuts* this, PlayState* play) {
/**
* Positions the Deku Scrub to match up with its flower, then sets it up to start waiting.
*/
-void EnSyatekiDekunuts_SetupSpawn(EnSyatekiDekunuts* this) {
+void EnSyatekiDekunuts_SetupWaitToStart(EnSyatekiDekunuts* this) {
Vec3f pos;
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
@@ -215,24 +215,24 @@ void EnSyatekiDekunuts_SetupSpawn(EnSyatekiDekunuts* this) {
this->timeToBurrow = 140 - (syatekiMan->currentWave * 20);
if ((syatekiMan->currentWave % 2) != 0) {
- this->headdressType = EN_SYATEKI_DEKUNUTS_HEADDRESS_TYPE_FLIPPED_UP;
+ this->headdressType = SG_DEKU_HEADDRESS_TYPE_FLIPPED_UP;
this->headdressRotZ = 0;
} else {
- this->headdressType = EN_SYATEKI_DEKUNUTS_HEADDRESS_TYPE_NORMAL;
+ this->headdressType = SG_DEKU_HEADDRESS_TYPE_NORMAL;
}
- this->actionFunc = EnSyatekiDekunuts_Spawn;
+ this->actionFunc = EnSyatekiDekunuts_WaitToStart;
}
/**
* Waits 20 frames, then plays a sound and starts the process of making the Deku Scrubs emerge.
*/
-void EnSyatekiDekunuts_Spawn(EnSyatekiDekunuts* this, PlayState* play) {
+void EnSyatekiDekunuts_WaitToStart(EnSyatekiDekunuts* this, PlayState* play) {
EnSyatekiMan* syatekiMan;
if (this->waitTimer > 20) {
syatekiMan = (EnSyatekiMan*)this->actor.parent;
- Actor_PlaySfxAtPos(&syatekiMan->actor, NA_SE_EN_NUTS_DAMAGE);
+ Actor_PlaySfx(&syatekiMan->actor, NA_SE_EN_NUTS_DAMAGE);
this->waitTimer = 0;
EnSyatekiDekunuts_SetupWaitToEmerge(this);
} else {
@@ -258,8 +258,8 @@ void EnSyatekiDekunuts_WaitToEmerge(EnSyatekiDekunuts* this, PlayState* play) {
}
void EnSyatekiDekunuts_SetupEmerge(EnSyatekiDekunuts* this) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_UP);
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_SYATEKI_DEKUNUTS_ANIM_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_UP);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, SG_DEKU_ANIM_UP);
this->actor.shape.rot.y = this->actor.yawTowardsPlayer;
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
this->actionFunc = EnSyatekiDekunuts_Emerge;
@@ -275,7 +275,7 @@ void EnSyatekiDekunuts_Emerge(EnSyatekiDekunuts* this, PlayState* play) {
EnSyatekiDekunuts_SetupLookAround(this);
}
- if (this->headdressType == EN_SYATEKI_DEKUNUTS_HEADDRESS_TYPE_FLIPPED_UP) {
+ if (this->headdressType == SG_DEKU_HEADDRESS_TYPE_FLIPPED_UP) {
Math_SmoothStepToS(&this->headdressRotZ, -0x8000, 5, 0x1000, 0x100);
}
@@ -283,8 +283,8 @@ void EnSyatekiDekunuts_Emerge(EnSyatekiDekunuts* this, PlayState* play) {
}
void EnSyatekiDekunuts_SetupLookAround(EnSyatekiDekunuts* this) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_SYATEKI_DEKUNUTS_ANIM_LOOK_AROUND);
- if (EN_SYATEKI_DEKUNUTS_GET_TYPE(&this->actor) != EN_SYATEKI_DEKUNUTS_TYPE_BONUS) {
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, SG_DEKU_ANIM_LOOK_AROUND);
+ if (SG_DEKU_GET_TYPE(&this->actor) != SG_DEKU_TYPE_BONUS) {
this->actionFunc = EnSyatekiDekunuts_LookAround;
} else {
this->actionFunc = EnSyatekiDekunuts_BonusLookAround;
@@ -325,7 +325,7 @@ void EnSyatekiDekunuts_BonusLookAround(EnSyatekiDekunuts* this, PlayState* play)
}
void EnSyatekiDekunuts_SetupBurrow(EnSyatekiDekunuts* this) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_SYATEKI_DEKUNUTS_ANIM_BURROW);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, SG_DEKU_ANIM_BURROW);
this->actionFunc = EnSyatekiDekunuts_Burrow;
}
@@ -357,7 +357,7 @@ void EnSyatekiDekunuts_SetupGameEnd(EnSyatekiDekunuts* this) {
*/
void EnSyatekiDekunuts_GameEnd(EnSyatekiDekunuts* this, PlayState* play) {
if (this->waitTimer > 20) {
- EnSyatekiDekunuts_SetupWaitForSpawn(this);
+ EnSyatekiDekunuts_SetupWaitForSignal(this);
this->waitTimer = 0;
} else {
this->waitTimer++;
@@ -369,19 +369,19 @@ void EnSyatekiDekunuts_SetupDead(EnSyatekiDekunuts* this, PlayState* play) {
static Vec3f sAccel = { 0.0f, 0.0f, 0.0f };
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
- if (EN_SYATEKI_DEKUNUTS_GET_TYPE(&this->actor) == EN_SYATEKI_DEKUNUTS_TYPE_BONUS) {
- EffectSsExtra_Spawn(play, &this->actor.world.pos, &sVelocity, &sAccel, 5, 2);
- syatekiMan->score += 100;
- syatekiMan->perGameVar2.bonusDekuScrubHitCounter++;
+ if (SG_DEKU_GET_TYPE(&this->actor) == SG_DEKU_TYPE_BONUS) {
+ EffectSsExtra_Spawn(play, &this->actor.world.pos, &sVelocity, &sAccel, 5, EXTRA_SCORE_INDEX_100);
+ syatekiMan->score += SG_POINTS_DEKU_BONUS;
+ syatekiMan->bonusDekuScrubHitCounter++;
} else {
- EffectSsExtra_Spawn(play, &this->actor.world.pos, &sVelocity, &sAccel, 5, 0);
- syatekiMan->score += 30;
+ EffectSsExtra_Spawn(play, &this->actor.world.pos, &sVelocity, &sAccel, 5, EXTRA_SCORE_INDEX_30);
+ syatekiMan->score += SG_POINTS_DEKU_NORMAL;
syatekiMan->dekuScrubHitCounter++;
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_DAMAGE);
this->isAlive = false;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_SYATEKI_DEKUNUTS_ANIM_DAMAGE);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, SG_DEKU_ANIM_DAMAGE);
this->timer = 160;
this->actionFunc = EnSyatekiDekunuts_Dead;
}
@@ -393,8 +393,8 @@ void EnSyatekiDekunuts_Dead(EnSyatekiDekunuts* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
if (this->timer == 160) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_SYATEKI_DEKUNUTS_ANIM_DIE);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_DEAD);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, SG_DEKU_ANIM_DIE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_DEAD);
this->timer--;
} else if (this->timer < 160) {
Vec3f pos;
@@ -407,11 +407,11 @@ void EnSyatekiDekunuts_Dead(EnSyatekiDekunuts* this, PlayState* play) {
pos.y = this->actor.world.pos.y + 10.0f;
EffectSsHahen_SpawnBurst(play, &pos, 3.0f, 0, 12, 3, 15, HAHEN_OBJECT_DEFAULT, 10, NULL);
- if (EN_SYATEKI_DEKUNUTS_GET_TYPE(&this->actor) != EN_SYATEKI_DEKUNUTS_TYPE_BONUS) {
+ if (SG_DEKU_GET_TYPE(&this->actor) != SG_DEKU_TYPE_BONUS) {
syatekiMan->dekuScrubFlags &= ~(1 << this->index);
}
- EnSyatekiDekunuts_SetupWaitForSpawn(this);
+ EnSyatekiDekunuts_SetupWaitForSignal(this);
}
} else if (this->timer < 160) {
this->timer--;
@@ -424,13 +424,13 @@ void EnSyatekiDekunuts_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
- if ((this->actionFunc != EnSyatekiDekunuts_WaitForSpawn) && (this->timer < this->timeToBurrow) &&
+ if ((this->actionFunc != EnSyatekiDekunuts_WaitForSignal) && (this->timer < this->timeToBurrow) &&
(this->timer > 10)) {
if ((this->collider.base.acFlags & AC_HIT) && (this->isAlive == true)) {
- if (EN_SYATEKI_DEKUNUTS_GET_TYPE(&this->actor) == EN_SYATEKI_DEKUNUTS_TYPE_BONUS) {
+ if (SG_DEKU_GET_TYPE(&this->actor) == SG_DEKU_TYPE_BONUS) {
Audio_PlayFanfare(NA_BGM_GET_ITEM | 0x900);
} else {
- play_sound(NA_SE_SY_TRE_BOX_APPEAR);
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
}
this->collider.base.acFlags &= ~AC_HIT;
@@ -450,8 +450,7 @@ s32 EnSyatekiDekunuts_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dLi
Actor* thisx) {
EnSyatekiDekunuts* this = THIS;
- if ((limbIndex == DEKU_SCRUB_LIMB_HEADDRESS) &&
- (this->headdressType == EN_SYATEKI_DEKUNUTS_HEADDRESS_TYPE_FLIPPED_UP)) {
+ if ((limbIndex == DEKU_SCRUB_LIMB_HEADDRESS) && (this->headdressType == SG_DEKU_HEADDRESS_TYPE_FLIPPED_UP)) {
rot->z += this->headdressRotZ;
}
@@ -463,7 +462,7 @@ void EnSyatekiDekunuts_Draw(Actor* thisx, PlayState* play) {
Vec3f flowerPos;
s32 i;
- if (this->actionFunc != EnSyatekiDekunuts_WaitForSpawn) {
+ if (this->actionFunc != EnSyatekiDekunuts_WaitForSignal) {
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
EnSyatekiDekunuts_OverrideLimbDraw, NULL, &this->actor);
}
@@ -476,7 +475,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..2a103aa98 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
@@ -4,15 +4,15 @@
#include "global.h"
#include "objects/object_dekunuts/object_dekunuts.h"
-#define EN_SYATEKI_DEKUNUTS_GET_TYPE(thisx) ((thisx)->params & 0xF)
-#define EN_SYATEKI_DEKUNUTS_GET_INDEX(thisx) (((thisx)->params & 0xF0) >> 4)
-#define EN_SYATEKI_DEKUNUTS_GET_PARAM_FF00(thisx) (((thisx)->params & 0xFF00) >> 8)
-#define EN_SYATEKI_DEKUNUTS_PARAMS(unkFF00, index, type) (((unkFF00 << 8) & 0xFF00) | ((index << 4) & 0xF0) | (type & 0xF))
+#define SG_DEKU_GET_TYPE(thisx) ((thisx)->params & 0xF)
+#define SG_DEKU_GET_INDEX(thisx) (((thisx)->params & 0xF0) >> 4)
+#define SG_DEKU_GET_ADDITIONAL_PATH_INDEX_LIMIT(thisx) (((thisx)->params & 0xFF00) >> 8)
+#define SG_DEKU_PARAMS(additionalPathIndexLimit, index, type) (((additionalPathIndexLimit << 8) & 0xFF00) | ((index << 4) & 0xF0) | (type & 0xF))
typedef enum {
- /* 0 */ EN_SYATEKI_DEKUNUTS_TYPE_NORMAL, // Worth 30 points
- /* 1 */ EN_SYATEKI_DEKUNUTS_TYPE_BONUS, // Worth 100 points
-} EnSyatekiDekunutsType;
+ /* 0 */ SG_DEKU_TYPE_NORMAL, // Worth 30 points
+ /* 1 */ SG_DEKU_TYPE_BONUS // Worth 100 points
+} ShootingGalleryDekuScrubType;
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 759e97206..28eeafc09 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
@@ -10,9 +10,10 @@
#include "z_en_syateki_man.h"
#include "overlays/actors/ovl_En_Syateki_Crow/z_en_syateki_crow.h"
#include "overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.h"
+#include "overlays/actors/ovl_En_Syateki_Okuta/z_en_syateki_okuta.h"
#include "overlays/actors/ovl_En_Syateki_Wf/z_en_syateki_wf.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_8000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_CANT_LOCK_ON)
#define THIS ((EnSyatekiMan*)thisx)
@@ -49,15 +50,41 @@ void EnSyatekiMan_Town_EndGame(EnSyatekiMan* this, PlayState* play);
#define TALK_FLAG_SWAMP_HAS_SPOKEN_WITH_HUMAN (1 << 0)
#define TALK_FLAG_SWAMP_HAS_EXPLAINED_THE_RULES (1 << 1)
-#define OCTOROK_FLAG(color, row, column) (1 << ((row * 6) + (column * 2) + color))
-#define COLOR_RED 0
-#define COLOR_BLUE 1
-#define ROW_BACK 0
-#define ROW_CENTER 1
-#define ROW_FRONT 2
-#define COLUMN_LEFT 0
-#define COLUMN_CENTER 1
-#define COLUMN_RIGHT 2
+// This defines the configuration of a single wave of Octoroks in the Town Shooting Gallery. These are
+// arranged in the same columns and rows that appear in-game; the player stands in the center column, and
+// the Octorok with an index of 7 appears directly in front of them like so:
+// 0 1 2
+// 3 4 5
+// 6 7 8
+// Player
+#define OCTO_FLAGS(type0, type1, type2, type3, type4, type5, type6, type7, type8) \
+ (SG_OCTO_SET_FLAG(type0, 0) | SG_OCTO_SET_FLAG(type1, 1) | SG_OCTO_SET_FLAG(type2, 2) | \
+ SG_OCTO_SET_FLAG(type3, 3) | SG_OCTO_SET_FLAG(type4, 4) | SG_OCTO_SET_FLAG(type5, 5) | \
+ SG_OCTO_SET_FLAG(type6, 6) | SG_OCTO_SET_FLAG(type7, 7) | SG_OCTO_SET_FLAG(type8, 8))
+
+// These defines assume that sNormalSwampTargetActorList is used to spawn actors and that the logic of
+// EnSyatekiMan_Swamp_RunGame is not modified; in other words, it assumes that each wave consists of five
+// Deku Scrubs that the player must shoot and three Guays that the player can either shoot or let escape.
+// Once all Deku Scrubs and Guays have been shot or escape, the next wave starts.
+#define SG_SWAMP_WAVE_COUNT 4
+#define SG_SWAMP_DEKUS_PER_WAVE 5
+#define SG_SWAMP_GUAYS_PER_WAVE 3
+#define SG_SWAMP_BONUS_DEKU_COUNT 2
+
+// This is the score the player will receive if they hit every single Deku Scrub (both normal and bonus), Guay, and
+// Wolfos. There are two conditions for a Wolfos to appear, hence why their point value appears twice; one Wolfos
+// will appear after shooting two waves of Deku Scrubs, and one Wolfos will appear after shooting one wave of Guays.
+// Assuming the point values, actor list, and shooting game logic are unmodified, this should total to 2120 points.
+#define SG_SWAMP_PERFECT_SCORE_WITHOUT_BONUS \
+ (SG_POINTS_DEKU_NORMAL * (SG_SWAMP_DEKUS_PER_WAVE * SG_SWAMP_WAVE_COUNT) + \
+ SG_POINTS_GUAY * (SG_SWAMP_GUAYS_PER_WAVE * SG_SWAMP_WAVE_COUNT) + \
+ SG_POINTS_DEKU_BONUS * SG_SWAMP_BONUS_DEKU_COUNT + SG_POINTS_WOLFOS * SG_SWAMP_WAVE_COUNT + \
+ SG_POINTS_WOLFOS * (SG_SWAMP_WAVE_COUNT / 2))
+
+// To obtain the Heart Piece from the Swamp Shooting Gallery, the player not only needs to achieve a perfect score,
+// but they must also have at least six seconds remaining on the minigame timer. If the player has already obtained
+// the Heart Piece, then this score will be used instead to determine if the player should get a Purple Rupee.
+#define SG_SWAMP_HEART_PIECE_SCORE (SG_SWAMP_PERFECT_SCORE_WITHOUT_BONUS + (6 * SG_BONUS_POINTS_PER_SECOND))
ActorInit En_Syateki_Man_InitVars = {
ACTOR_EN_SYATEKI_MAN,
@@ -72,22 +99,23 @@ 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,
-} EnSyatekiManAnimation;
+ /* 0 */ SG_MAN_ANIM_HANDS_ON_TABLE,
+ /* 1 */ SG_MAN_ANIM_HEAD_SCRATCH_LOOP,
+ /* 2 */ SG_MAN_ANIM_HEAD_SCRATCH_END
+} ShootingGalleryManAnimation;
static AnimationInfo sAnimationInfo[] = {
- { &gBurlyGuyHandsOnTableAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
- { &gSwampShootingGalleryManHeadScratchLoopAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
- { &gSwampShootingGalleryManHeadScratchEndAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f },
+ { &gBurlyGuyHandsOnTableAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // SG_MAN_ANIM_HANDS_ON_TABLE
+ { &gBurlyGuyHeadScratchLoopAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // SG_MAN_ANIM_HEAD_SCRATCH_LOOP
+ { &gBurlyGuyHeadScratchEndAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f }, // SG_MAN_ANIM_HEAD_SCRATCH_END
};
/**
* In the Swamp Shooting Gallery, there are four waves of Guays.
* For each wave, these flags are used to control which Guays appear.
+ * The number of flags per wave should be exactly SG_SWAMP_GUAYS_PER_WAVE for all waves.
*/
-static s16 sGuayFlagsPerWave[] = {
+static s16 sGuayFlagsPerWave[SG_SWAMP_WAVE_COUNT] = {
(1 << 7) | (1 << 6) | (1 << 0),
(1 << 9) | (1 << 8) | (1 << 1),
(1 << 4) | (1 << 3) | (1 << 0),
@@ -101,32 +129,25 @@ typedef struct {
} SwampTargetActorEntry; // size = 0x14
static SwampTargetActorEntry sNormalSwampTargetActorList[] = {
- { ACTOR_EN_SYATEKI_WF, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_WF_PARAMS(1, 3, 0) },
- { ACTOR_EN_SYATEKI_WF, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_WF_PARAMS(0, 2, 0) },
- { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f,
- EN_SYATEKI_DEKUNUTS_PARAMS(0, 0, EN_SYATEKI_DEKUNUTS_TYPE_NORMAL) },
- { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f,
- EN_SYATEKI_DEKUNUTS_PARAMS(0, 1, EN_SYATEKI_DEKUNUTS_TYPE_NORMAL) },
- { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f,
- EN_SYATEKI_DEKUNUTS_PARAMS(0, 2, EN_SYATEKI_DEKUNUTS_TYPE_NORMAL) },
- { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f,
- EN_SYATEKI_DEKUNUTS_PARAMS(0, 3, EN_SYATEKI_DEKUNUTS_TYPE_NORMAL) },
- { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f,
- EN_SYATEKI_DEKUNUTS_PARAMS(0, 4, EN_SYATEKI_DEKUNUTS_TYPE_NORMAL) },
- { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f,
- EN_SYATEKI_DEKUNUTS_PARAMS(0, 0, EN_SYATEKI_DEKUNUTS_TYPE_BONUS) },
- { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f,
- EN_SYATEKI_DEKUNUTS_PARAMS(0, 1, EN_SYATEKI_DEKUNUTS_TYPE_BONUS) },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(0, 0, 0) },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(1, 0, 0) },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(2, 0, 0) },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(3, 0, 0) },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(4, 2, 0) },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(5, 2, 0) },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(6, 0, 1) },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(7, 0, 2) },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(8, 0, 1) },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(9, 0, 2) },
+ { ACTOR_EN_SYATEKI_WF, -1000.0f, 200.0f, -700.0f, SG_WOLFOS_PARAMS(1, 3, 0) },
+ { ACTOR_EN_SYATEKI_WF, -1000.0f, 200.0f, -700.0f, SG_WOLFOS_PARAMS(0, 2, 0) },
+ { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, SG_DEKU_PARAMS(0, 0, SG_DEKU_TYPE_NORMAL) },
+ { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, SG_DEKU_PARAMS(0, 1, SG_DEKU_TYPE_NORMAL) },
+ { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, SG_DEKU_PARAMS(0, 2, SG_DEKU_TYPE_NORMAL) },
+ { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, SG_DEKU_PARAMS(0, 3, SG_DEKU_TYPE_NORMAL) },
+ { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, SG_DEKU_PARAMS(0, 4, SG_DEKU_TYPE_NORMAL) },
+ { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, SG_DEKU_PARAMS(0, 0, SG_DEKU_TYPE_BONUS) },
+ { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, SG_DEKU_PARAMS(0, 1, SG_DEKU_TYPE_BONUS) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, SG_GUAY_PARAMS(0, 0, 0) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, SG_GUAY_PARAMS(1, 0, 0) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, SG_GUAY_PARAMS(2, 0, 0) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, SG_GUAY_PARAMS(3, 0, 0) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, SG_GUAY_PARAMS(4, 2, 0) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, SG_GUAY_PARAMS(5, 2, 0) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, SG_GUAY_PARAMS(6, 0, 1) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, SG_GUAY_PARAMS(7, 0, 2) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, SG_GUAY_PARAMS(8, 0, 1) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, SG_GUAY_PARAMS(9, 0, 2) },
};
/**
@@ -134,22 +155,20 @@ static SwampTargetActorEntry sNormalSwampTargetActorList[] = {
* Without any "normal" Deku Scrubs, the game will not progress beyond the first wave.
*/
static SwampTargetActorEntry sUnusedSwampTargetActorList[] = {
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(0, 0, 0) },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(1, 0, 0) },
- { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f,
- EN_SYATEKI_DEKUNUTS_PARAMS(0, 0, EN_SYATEKI_DEKUNUTS_TYPE_BONUS) },
- { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f,
- EN_SYATEKI_DEKUNUTS_PARAMS(0, 1, EN_SYATEKI_DEKUNUTS_TYPE_BONUS) },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(2, 0, 2) },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(3, 0, 2) },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(0, 0, 3) },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(1, 0, 3) },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(4, 2, 3) },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(2, 0, 4) },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(3, 0, 4) },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(4, 2, 4) },
- { ACTOR_EN_SYATEKI_WF, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_WF_PARAMS(0, 2, 5) },
- { ACTOR_EN_SYATEKI_WF, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_WF_PARAMS(1, 3, 6) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, SG_GUAY_PARAMS(0, 0, 0) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, SG_GUAY_PARAMS(1, 0, 0) },
+ { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, SG_DEKU_PARAMS(0, 0, SG_DEKU_TYPE_BONUS) },
+ { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, SG_DEKU_PARAMS(0, 1, SG_DEKU_TYPE_BONUS) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, SG_GUAY_PARAMS(2, 0, 2) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, SG_GUAY_PARAMS(3, 0, 2) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, SG_GUAY_PARAMS(0, 0, 3) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, SG_GUAY_PARAMS(1, 0, 3) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, SG_GUAY_PARAMS(4, 2, 3) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, SG_GUAY_PARAMS(2, 0, 4) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, SG_GUAY_PARAMS(3, 0, 4) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, SG_GUAY_PARAMS(4, 2, 4) },
+ { ACTOR_EN_SYATEKI_WF, -1000.0f, 200.0f, -700.0f, SG_WOLFOS_PARAMS(0, 2, 5) },
+ { ACTOR_EN_SYATEKI_WF, -1000.0f, 200.0f, -700.0f, SG_WOLFOS_PARAMS(1, 3, 6) },
};
static SwampTargetActorEntry* sSwampTargetActorLists[] = {
@@ -183,14 +202,14 @@ 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[SG_MAN_GET_PATH_INDEX(&this->actor)];
s32 actorListLength = sSwampTargetActorListLengths[this->swampTargetActorListIndex];
- this->actor.targetMode = 1;
+ this->actor.targetMode = TARGET_MODE_1;
Actor_SetScale(&this->actor, 0.01f);
if (play->sceneId == SCENE_SYATEKI_MORI) {
- SkelAnime_InitFlex(play, &this->skelAnime, &gBurlyGuySkel, &gSwampShootingGalleryManHeadScratchLoopAnim,
- this->jointTable, this->morphTable, BURLY_GUY_LIMB_MAX);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gBurlyGuySkel, &gBurlyGuyHeadScratchLoopAnim, this->jointTable,
+ this->morphTable, BURLY_GUY_LIMB_MAX);
} else {
SkelAnime_InitFlex(play, &this->skelAnime, &gBurlyGuySkel, &gBurlyGuyHandsOnTableAnim, this->jointTable,
this->morphTable, BURLY_GUY_LIMB_MAX);
@@ -201,7 +220,7 @@ void EnSyatekiMan_Init(Actor* thisx, PlayState* play) {
this->shootingGameState = SG_GAME_STATE_NONE;
this->talkWaitTimer = 15;
this->flagsIndex = 0;
- this->perGameVar2.octorokHitType = SG_OCTO_HIT_TYPE_NONE;
+ this->lastHitOctorokType = SG_OCTO_TYPE_NONE;
this->octorokFlags = 0;
this->dekuScrubFlags = 0;
this->guayFlags = 0;
@@ -222,7 +241,7 @@ void EnSyatekiMan_Init(Actor* thisx, PlayState* play) {
}
void EnSyatekiMan_Destroy(Actor* thisx, PlayState* play) {
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_01);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
}
/**
@@ -269,8 +288,8 @@ void EnSyatekiMan_Swamp_Idle(EnSyatekiMan* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
u16 faceReactionTextId;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_SYATEKI_MAN_ANIM_SWAMP_HEAD_SCRATCH_END);
- faceReactionTextId = Text_GetFaceReaction(play, 0x31);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, SG_MAN_ANIM_HEAD_SCRATCH_END);
+ faceReactionTextId = Text_GetFaceReaction(play, FACE_REACTION_SET_SWAMP_SHOOTING_GALLERY_MAN);
if (faceReactionTextId != 0) {
Message_StartTextbox(play, faceReactionTextId, &this->actor);
this->prevTextId = faceReactionTextId;
@@ -308,7 +327,7 @@ void EnSyatekiMan_Swamp_Idle(EnSyatekiMan* this, PlayState* play) {
}
this->actionFunc = EnSyatekiMan_Swamp_Talk;
} else {
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
}
if (player->actor.world.pos.z < 135.0f) {
@@ -322,13 +341,13 @@ void EnSyatekiMan_Swamp_HandleChoice(EnSyatekiMan* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
if (play->msgCtx.choiceIndex == 0) {
if (CUR_UPG_VALUE(UPG_QUIVER) == 0) {
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
// You don't have a bow!
Message_StartTextbox(play, 0xA30, &this->actor);
this->prevTextId = 0xA30;
- } else if (gSaveContext.save.playerData.rupees < 20) {
- play_sound(NA_SE_SY_ERROR);
+ } else if (gSaveContext.save.saveInfo.playerData.rupees < 20) {
+ Audio_PlaySfx(NA_SE_SY_ERROR);
// You don't have enough rupees!
Message_StartTextbox(play, 0xA31, &this->actor);
@@ -339,18 +358,18 @@ void EnSyatekiMan_Swamp_HandleChoice(EnSyatekiMan* this, PlayState* play) {
this->shootingGameState = SG_GAME_STATE_NOT_PLAYING;
} else {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
Rupees_ChangeBy(-20);
- SET_WEEKEVENTREG(WEEKEVENTREG_63_01);
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_02);
- play->msgCtx.msgMode = 0x43;
+ SET_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED);
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->shootingGameState = SG_GAME_STATE_MOVING_PLAYER;
player->stateFlags1 |= PLAYER_STATE1_20;
this->actionFunc = EnSyatekiMan_Swamp_MovePlayerAndExplainRules;
}
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
switch (CURRENT_DAY) {
case 1:
@@ -396,7 +415,7 @@ void EnSyatekiMan_Swamp_HandleNormalMessage(EnSyatekiMan* this, PlayState* play)
case 0xA2B: // The rules of the game are a piece of cake!
case 0xA2C: // I keep saying - you have to aim with [Control Stick]!
case 0xA35: // You almost had it! Well...just this once...here you go!
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
player->actor.freezeTimer = 0;
Interface_InitMinigame(play);
@@ -404,15 +423,15 @@ void EnSyatekiMan_Swamp_HandleNormalMessage(EnSyatekiMan* this, PlayState* play)
func_80123F2C(play, 80);
this->shootingGameState = SG_GAME_STATE_RUNNING;
this->actionFunc = EnSyatekiMan_Swamp_StartGame;
- func_801A2BB8(NA_BGM_TIMED_MINI_GAME);
+ Audio_PlaySubBgm(NA_BGM_TIMED_MINI_GAME);
break;
case 0xA32: // You have to try harder!
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_63_02)) {
- func_801477B4(play);
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED)) {
+ Message_CloseTextbox(play);
player->stateFlags1 &= ~PLAYER_STATE1_20;
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_01);
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_02);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED);
this->actionFunc = EnSyatekiMan_Swamp_Idle;
gSaveContext.minigameStatus = MINIGAME_STATUS_END;
this->shootingGameState = SG_GAME_STATE_NONE;
@@ -431,7 +450,7 @@ void EnSyatekiMan_Swamp_HandleNormalMessage(EnSyatekiMan* this, PlayState* play)
break;
case 0xA34: // Perfect! Take this!
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
player->actor.freezeTimer = 0;
gSaveContext.minigameStatus = MINIGAME_STATUS_END;
@@ -466,11 +485,11 @@ void EnSyatekiMan_Swamp_Talk(EnSyatekiMan* this, PlayState* play) {
case TEXT_STATE_DONE:
if (Message_ShouldAdvance(play)) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
player->stateFlags1 &= ~PLAYER_STATE1_20;
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_01);
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_02);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED);
this->actionFunc = EnSyatekiMan_Swamp_Idle;
this->shootingGameState = SG_GAME_STATE_NONE;
}
@@ -486,15 +505,15 @@ void EnSyatekiMan_Swamp_Talk(EnSyatekiMan* this, PlayState* play) {
break;
}
- if (this->skelAnime.animation == &gSwampShootingGalleryManHeadScratchEndAnim) {
+ if (this->skelAnime.animation == &gBurlyGuyHeadScratchEndAnim) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_SYATEKI_MAN_ANIM_HANDS_ON_TABLE);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, SG_MAN_ANIM_HANDS_ON_TABLE);
}
}
}
void EnSyatekiMan_Town_StartIntroTextbox(EnSyatekiMan* this, PlayState* play) {
- switch (gSaveContext.save.playerForm) {
+ switch (GET_PLAYER_FORM) {
case PLAYER_FORM_HUMAN:
Flags_SetAllTreasure(play, Flags_GetAllTreasure(play) + 1);
if (CURRENT_DAY != 3) {
@@ -591,12 +610,15 @@ void EnSyatekiMan_Town_StartIntroTextbox(EnSyatekiMan* this, PlayState* play) {
this->prevTextId = 0x3F5;
}
break;
+
+ default:
+ break;
}
}
void EnSyatekiMan_Town_Idle(EnSyatekiMan* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- u16 faceReactionTextId = Text_GetFaceReaction(play, 0x30);
+ u16 faceReactionTextId = Text_GetFaceReaction(play, FACE_REACTION_SET_TOWN_SHOOTING_GALLERY_MAN);
if (faceReactionTextId != 0) {
Message_StartTextbox(play, faceReactionTextId, &this->actor);
@@ -607,7 +629,7 @@ void EnSyatekiMan_Town_Idle(EnSyatekiMan* this, PlayState* play) {
this->actionFunc = EnSyatekiMan_Town_Talk;
} else {
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
}
}
@@ -617,7 +639,7 @@ void EnSyatekiMan_Town_HandleChoice(EnSyatekiMan* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
if (play->msgCtx.choiceIndex == 0) {
if (CUR_UPG_VALUE(UPG_QUIVER) == 0) {
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
if (CURRENT_DAY != 3) {
// You don't have a bow? Then you can't play.
Message_StartTextbox(play, 0x3F9, &this->actor);
@@ -627,8 +649,8 @@ void EnSyatekiMan_Town_HandleChoice(EnSyatekiMan* this, PlayState* play) {
Message_StartTextbox(play, 0x3FA, &this->actor);
this->prevTextId = 0x3FA;
}
- } else if (gSaveContext.save.playerData.rupees < 20) {
- play_sound(NA_SE_SY_ERROR);
+ } else if (gSaveContext.save.saveInfo.playerData.rupees < 20) {
+ Audio_PlaySfx(NA_SE_SY_ERROR);
if (CURRENT_DAY != 3) {
// You don't have a enough rupees!
Message_StartTextbox(play, 0x3FB, &this->actor);
@@ -646,7 +668,7 @@ void EnSyatekiMan_Town_HandleChoice(EnSyatekiMan* this, PlayState* play) {
this->shootingGameState = SG_GAME_STATE_NOT_PLAYING;
} else {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
Rupees_ChangeBy(-20);
this->shootingGameState = SG_GAME_STATE_EXPLAINING_RULES;
if (!(this->talkFlags & TALK_FLAG_TOWN_HAS_EXPLAINED_THE_RULES)) {
@@ -660,11 +682,11 @@ void EnSyatekiMan_Town_HandleChoice(EnSyatekiMan* this, PlayState* play) {
this->prevTextId = 0x3FF;
}
- SET_WEEKEVENTREG(WEEKEVENTREG_63_01);
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_02);
+ SET_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED);
}
} else {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
if (CURRENT_DAY != 3) {
// Well, be that way!
Message_StartTextbox(play, 0x3F7, &this->actor);
@@ -742,35 +764,35 @@ void EnSyatekiMan_Town_HandleNormalMessage(EnSyatekiMan* this, PlayState* play)
this->prevTextId = 0x400;
}
} else {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
player->actor.freezeTimer = 0;
this->shootingGameState = SG_GAME_STATE_MOVING_PLAYER;
player->stateFlags1 |= PLAYER_STATE1_20;
- SET_WEEKEVENTREG(WEEKEVENTREG_63_01);
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_02);
+ SET_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED);
this->actionFunc = EnSyatekiMan_Town_MovePlayerAndSayHighScore;
}
break;
case 0x3FE: // Our highest score is [score]. If you break the record, you'll win a prize!
case 0x400: // Our highest score is [score]. Good luck!
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
player->actor.freezeTimer = 0;
this->flagsIndex = 0;
Interface_InitMinigame(play);
func_80123F2C(play, 0x63);
this->shootingGameState = SG_GAME_STATE_RUNNING;
- func_801A2BB8(NA_BGM_TIMED_MINI_GAME);
+ Audio_PlaySubBgm(NA_BGM_TIMED_MINI_GAME);
this->actionFunc = EnSyatekiMan_Town_StartGame;
break;
case 0x401: // You got [score]? Oh, that's too bad...
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_63_02)) {
- func_801477B4(play);
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_01);
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_02);
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED)) {
+ Message_CloseTextbox(play);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED);
this->shootingGameState = SG_GAME_STATE_NONE;
this->actionFunc = EnSyatekiMan_Town_Idle;
} else {
@@ -781,10 +803,10 @@ void EnSyatekiMan_Town_HandleNormalMessage(EnSyatekiMan* this, PlayState* play)
break;
case 0x403: // You got [score]? Too bad...
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_63_02)) {
- func_801477B4(play);
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_01);
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_02);
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED)) {
+ Message_CloseTextbox(play);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED);
this->shootingGameState = SG_GAME_STATE_NONE;
this->actionFunc = EnSyatekiMan_Town_Idle;
} else {
@@ -805,7 +827,7 @@ void EnSyatekiMan_Town_HandleNormalMessage(EnSyatekiMan* this, PlayState* play)
case 0x405: // No way! That was perfect!
case 0x406: // That was perfect!
case 0x407: // You got a new record!
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
player->actor.freezeTimer = 0;
gSaveContext.minigameStatus = MINIGAME_STATUS_END;
@@ -839,8 +861,8 @@ void EnSyatekiMan_Town_Talk(EnSyatekiMan* this, PlayState* play) {
case TEXT_STATE_DONE:
if (Message_ShouldAdvance(play)) {
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_01);
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_02);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED);
player->stateFlags1 &= ~PLAYER_STATE1_20;
this->actionFunc = EnSyatekiMan_Town_Idle;
this->shootingGameState = SG_GAME_STATE_NONE;
@@ -862,23 +884,25 @@ void EnSyatekiMan_Swamp_SetupGiveReward(EnSyatekiMan* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (Actor_HasParent(&this->actor, play)) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_59_10)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_59_10);
- } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_32_02) && (this->score >= 2180)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_32_02);
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_SWAMP_SHOOTING_GALLERY_QUIVER_UPGRADE)) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_SWAMP_SHOOTING_GALLERY_QUIVER_UPGRADE);
+ } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_SWAMP_SHOOTING_GALLERY_HEART_PIECE) &&
+ (this->score >= SG_SWAMP_HEART_PIECE_SCORE)) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_SWAMP_SHOOTING_GALLERY_HEART_PIECE);
}
this->actor.parent = NULL;
this->actionFunc = EnSyatekiMan_Swamp_GiveReward;
} else {
- if ((CUR_UPG_VALUE(UPG_QUIVER) < 3) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_59_10)) {
- Actor_PickUp(&this->actor, play, GI_QUIVER_30 + CUR_UPG_VALUE(UPG_QUIVER), 500.0f, 100.0f);
- } else if (this->score < 2180) {
- Actor_PickUp(&this->actor, play, GI_RUPEE_RED, 500.0f, 100.0f);
- } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_32_02)) {
- Actor_PickUp(&this->actor, play, GI_HEART_PIECE, 500.0f, 100.0f);
+ if ((CUR_UPG_VALUE(UPG_QUIVER) < 3) &&
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_SWAMP_SHOOTING_GALLERY_QUIVER_UPGRADE)) {
+ Actor_OfferGetItem(&this->actor, play, GI_QUIVER_30 + CUR_UPG_VALUE(UPG_QUIVER), 500.0f, 100.0f);
+ } else if (this->score < SG_SWAMP_HEART_PIECE_SCORE) {
+ Actor_OfferGetItem(&this->actor, play, GI_RUPEE_RED, 500.0f, 100.0f);
+ } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_SWAMP_SHOOTING_GALLERY_HEART_PIECE)) {
+ Actor_OfferGetItem(&this->actor, play, GI_HEART_PIECE, 500.0f, 100.0f);
} else {
- Actor_PickUp(&this->actor, play, GI_RUPEE_PURPLE, 500.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_RUPEE_PURPLE, 500.0f, 100.0f);
}
player->actor.shape.rot.y = -0x8000;
@@ -908,7 +932,7 @@ void EnSyatekiMan_Swamp_GiveReward(EnSyatekiMan* this, PlayState* play) {
this->shootingGameState = SG_GAME_STATE_NONE;
this->actionFunc = EnSyatekiMan_Swamp_Talk;
} else {
- func_800B85E0(&this->actor, play, 500.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 500.0f, PLAYER_IA_MINUS1);
}
}
@@ -917,14 +941,14 @@ void EnSyatekiMan_Town_SetupGiveReward(EnSyatekiMan* this, PlayState* play) {
if (Actor_HasParent(&this->actor, play)) {
if (this->prevTextId == 0x407) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_59_20)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_59_20);
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_TOWN_SHOOTING_GALLERY_QUIVER_UPGRADE)) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_TOWN_SHOOTING_GALLERY_QUIVER_UPGRADE);
}
}
if ((this->prevTextId == 0x405) || (this->prevTextId == 0x406)) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_32_04)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_32_04);
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_TOWN_SHOOTING_GALLERY_HEART_PIECE)) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_TOWN_SHOOTING_GALLERY_HEART_PIECE);
}
}
@@ -932,15 +956,16 @@ void EnSyatekiMan_Town_SetupGiveReward(EnSyatekiMan* this, PlayState* play) {
this->actionFunc = EnSyatekiMan_Town_GiveReward;
} else {
if (this->prevTextId == 0x407) {
- if ((CUR_UPG_VALUE(UPG_QUIVER) < 3) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_59_20)) {
- Actor_PickUp(&this->actor, play, GI_QUIVER_30 + CUR_UPG_VALUE(UPG_QUIVER), 500.0f, 100.0f);
+ if ((CUR_UPG_VALUE(UPG_QUIVER) < 3) &&
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_TOWN_SHOOTING_GALLERY_QUIVER_UPGRADE)) {
+ Actor_OfferGetItem(&this->actor, play, GI_QUIVER_30 + CUR_UPG_VALUE(UPG_QUIVER), 500.0f, 100.0f);
} else {
- Actor_PickUp(&this->actor, play, GI_RUPEE_PURPLE, 500.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_RUPEE_PURPLE, 500.0f, 100.0f);
}
- } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_32_04)) {
- Actor_PickUp(&this->actor, play, GI_HEART_PIECE, 500.0f, 100.0f);
+ } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_TOWN_SHOOTING_GALLERY_HEART_PIECE)) {
+ Actor_OfferGetItem(&this->actor, play, GI_HEART_PIECE, 500.0f, 100.0f);
} else {
- Actor_PickUp(&this->actor, play, GI_RUPEE_HUGE, 500.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_RUPEE_HUGE, 500.0f, 100.0f);
}
player->actor.shape.rot.y = -0x8000;
@@ -958,8 +983,8 @@ void EnSyatekiMan_Town_GiveReward(EnSyatekiMan* this, PlayState* play) {
player->stateFlags1 &= ~PLAYER_STATE1_20;
this->score = 0;
this->shootingGameState = SG_GAME_STATE_NONE;
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_01);
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_02);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED);
this->actionFunc = EnSyatekiMan_SetupIdle;
}
} else if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
@@ -972,7 +997,7 @@ void EnSyatekiMan_Town_GiveReward(EnSyatekiMan* this, PlayState* play) {
this->shootingGameState = SG_GAME_STATE_NONE;
this->actionFunc = EnSyatekiMan_Town_Talk;
} else {
- func_800B85E0(&this->actor, play, 500.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 500.0f, PLAYER_IA_MINUS1);
}
}
@@ -1012,15 +1037,15 @@ void EnSyatekiMan_Swamp_StartGame(EnSyatekiMan* this, PlayState* play) {
this->flagsIndex = 0;
this->score = 0;
player->stateFlags1 &= ~PLAYER_STATE1_20;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_FOUND);
+ Actor_PlaySfx(&this->actor, NA_SE_SY_FOUND);
this->dekuScrubFlags = (1 << 4) | (1 << 3) | (1 << 2) | (1 << 1) | (1 << 0);
this->guayFlags = 0;
this->wolfosFlags = 0;
- this->perGameVar1.guaySpawnTimer = 0;
+ this->guayAppearTimer = 0;
this->dekuScrubHitCounter = 0;
this->guayHitCounter = 0;
this->currentWave = 0;
- this->perGameVar2.bonusDekuScrubHitCounter = 0;
+ this->bonusDekuScrubHitCounter = 0;
Interface_StartTimer(TIMER_ID_MINIGAME_1, 100);
this->actor.draw = NULL;
this->actionFunc = EnSyatekiMan_Swamp_RunGame;
@@ -1028,72 +1053,80 @@ void EnSyatekiMan_Swamp_StartGame(EnSyatekiMan* this, PlayState* play) {
}
void EnSyatekiMan_Swamp_RunGame(EnSyatekiMan* this, PlayState* play) {
- static s16 sHasSpawnedGuaysForThisWave = false;
+ static s16 sHasSignaledGuaysForThisWave = false;
Player* player = GET_PLAYER(play);
- if (((this->dekuScrubFlags == 0) || (this->perGameVar1.guaySpawnTimer > 140)) && !sHasSpawnedGuaysForThisWave &&
- (this->currentWave < 4)) {
- // Spawn three guays after the player has killed all Deku Scrubs, or after 140 frames.
- sHasSpawnedGuaysForThisWave = true;
- this->perGameVar1.guaySpawnTimer = 0;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_FOUND);
+ if (((this->dekuScrubFlags == 0) || (this->guayAppearTimer > 140)) && !sHasSignaledGuaysForThisWave &&
+ (this->currentWave < SG_SWAMP_WAVE_COUNT)) {
+ // Make three Guays appear after the player has killed all Deku Scrubs, or after 140 frames.
+ sHasSignaledGuaysForThisWave = true;
+ this->guayAppearTimer = 0;
+ Actor_PlaySfx(&this->actor, NA_SE_SY_FOUND);
this->guayFlags = sGuayFlagsPerWave[this->flagsIndex];
- if (this->flagsIndex == 3) {
+ if (this->flagsIndex == ARRAY_COUNT(sGuayFlagsPerWave) - 1) {
this->flagsIndex = 0;
} else {
this->flagsIndex++;
}
- } else if ((this->guayFlags == 0) && (this->dekuScrubFlags == 0) && (sHasSpawnedGuaysForThisWave == true) &&
- (this->currentWave < 4)) {
+ } else if ((this->guayFlags == 0) && (this->dekuScrubFlags == 0) && (sHasSignaledGuaysForThisWave == true) &&
+ (this->currentWave < SG_SWAMP_WAVE_COUNT)) {
// Once all Deku Scrubs and Guays in this wave have either disappeared or died, move on to the next wave.
- if (this->guayHitCounter < 3) {
+ if (this->guayHitCounter < SG_SWAMP_GUAYS_PER_WAVE) {
this->guayHitCounter = 0;
}
- this->perGameVar1.guaySpawnTimer = 0;
- sHasSpawnedGuaysForThisWave = false;
+ this->guayAppearTimer = 0;
+ sHasSignaledGuaysForThisWave = false;
this->currentWave++;
- if (this->currentWave < 4) {
+ if (this->currentWave < SG_SWAMP_WAVE_COUNT) {
this->dekuScrubFlags = (1 << 4) | (1 << 3) | (1 << 2) | (1 << 1) | (1 << 0);
}
}
- if (this->guayHitCounter == 3) {
+ // Makes a Wolfos appear after the player has shot all the Guays in the current wave.
+ if (this->guayHitCounter == SG_SWAMP_GUAYS_PER_WAVE) {
this->guayHitCounter = 0;
this->wolfosFlags |= 1;
}
- if (this->dekuScrubHitCounter == 10) {
+ // Makes a Wolfos appear after the player has shot two waves of Deku Scrubs.
+ if (this->dekuScrubHitCounter == SG_SWAMP_DEKUS_PER_WAVE * 2) {
this->dekuScrubHitCounter = 0;
this->wolfosFlags |= 2;
}
- this->perGameVar1.guaySpawnTimer++;
+ this->guayAppearTimer++;
if (gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_1] == SECONDS_TO_TIMER(0)) {
+ // End the game because the timer ran out.
gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_1] = SECONDS_TO_TIMER(0);
gSaveContext.timerStates[TIMER_ID_MINIGAME_1] = TIMER_STATE_STOP;
this->actor.draw = EnSyatekiMan_Draw;
this->flagsIndex = 0;
this->currentWave = 0;
player->stateFlags1 |= PLAYER_STATE1_20;
- sHasSpawnedGuaysForThisWave = false;
- func_801A2C20();
+ sHasSignaledGuaysForThisWave = false;
+ Audio_StopSubBgm();
this->actionFunc = EnSyatekiMan_Swamp_EndGame;
- } else if ((this->currentWave == 4) && (this->wolfosFlags == 0) &&
- (this->perGameVar2.bonusDekuScrubHitCounter == 2)) {
+ } else if ((this->currentWave == SG_SWAMP_WAVE_COUNT) && (this->wolfosFlags == 0) &&
+ (this->bonusDekuScrubHitCounter == SG_SWAMP_BONUS_DEKU_COUNT)) {
+ // End the game because the player has nothing left to shoot. This doesn't mean the
+ // player actually hit everything, since Guays and Wolfos can escape.
this->actor.draw = EnSyatekiMan_Draw;
this->flagsIndex = 0;
this->currentWave = 0;
player->stateFlags1 |= PLAYER_STATE1_20;
- sHasSpawnedGuaysForThisWave = false;
- func_801A2C20();
+ sHasSignaledGuaysForThisWave = false;
+ Audio_StopSubBgm();
this->shootingGameState = SG_GAME_STATE_GIVING_BONUS;
- if (this->score == 2120) {
+
+ if (this->score == SG_SWAMP_PERFECT_SCORE_WITHOUT_BONUS) {
Interface_SetPerfectLetters(play, PERFECT_LETTERS_TYPE_2);
gSaveContext.timerStates[TIMER_ID_MINIGAME_1] = TIMER_STATE_6;
this->actionFunc = EnSyatekiMan_Swamp_AddBonusPoints;
} else {
+ // If the player ran out of things to shoot but did *not* get a perfect score, then
+ // they must have missed a Guay or Wolfos at some point; don't award any bonus points.
gSaveContext.timerStates[TIMER_ID_MINIGAME_1] = TIMER_STATE_STOP;
this->actionFunc = EnSyatekiMan_Swamp_EndGame;
}
@@ -1107,20 +1140,20 @@ void EnSyatekiMan_Swamp_EndGame(EnSyatekiMan* this, PlayState* play) {
this->guayFlags = 0;
this->wolfosFlags = 0;
if (this->talkWaitTimer <= 0) {
- if (GET_SWAMP_SHOOTING_GALLERY_HIGH_SCORE() < this->score) {
- SET_SWAMP_SHOOTING_GALLERY_HIGH_SCORE(this->score);
+ if (HS_GET_SWAMP_SHOOTING_GALLERY_HIGH_SCORE() < this->score) {
+ HS_SET_SWAMP_SHOOTING_GALLERY_HIGH_SCORE(this->score);
}
this->talkWaitTimer = 15;
- if (this->score >= 2120) {
+ if (this->score >= SG_SWAMP_PERFECT_SCORE_WITHOUT_BONUS) {
// Perfect! Take this!
Message_StartTextbox(play, 0xA34, &this->actor);
this->prevTextId = 0xA34;
this->shootingGameState = SG_GAME_STATE_ENDED;
} else if (this->score >= 2000) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_63_02)) {
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_01);
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_02);
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED)) {
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED);
this->shootingGameState = SG_GAME_STATE_NONE;
gSaveContext.minigameStatus = MINIGAME_STATUS_END;
this->actionFunc = EnSyatekiMan_Swamp_Idle;
@@ -1166,9 +1199,9 @@ void EnSyatekiMan_Swamp_AddBonusPoints(EnSyatekiMan* this, PlayState* play) {
sBonusTimer = 0;
} else if (sBonusTimer > 10) {
gSaveContext.timerStopTimes[TIMER_ID_MINIGAME_1] += SECONDS_TO_TIMER(1);
- play->interfaceCtx.minigamePoints += 10;
- this->score += 10;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
+ play->interfaceCtx.minigamePoints += SG_BONUS_POINTS_PER_SECOND;
+ this->score += SG_BONUS_POINTS_PER_SECOND;
+ Actor_PlaySfx(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
sBonusTimer = 0;
} else {
sBonusTimer++;
@@ -1179,7 +1212,7 @@ void EnSyatekiMan_Swamp_AddBonusPoints(EnSyatekiMan* this, PlayState* play) {
void EnSyatekiMan_Town_MovePlayerAndSayHighScore(EnSyatekiMan* this, PlayState* play) {
Vec3f targetPlayerPos;
- if (gSaveContext.save.playerForm == PLAYER_FORM_FIERCE_DEITY) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_FIERCE_DEITY) {
targetPlayerPos = sTownFierceDeityPlayerPos;
} else {
targetPlayerPos = sTownPlayerPos;
@@ -1226,8 +1259,8 @@ void EnSyatekiMan_Town_StartGame(EnSyatekiMan* this, PlayState* play) {
player->stateFlags1 &= ~PLAYER_STATE1_20;
this->score = 0;
this->flagsIndex = 0;
- this->perGameVar1.octorokState = SG_OCTO_STATE_INITIAL;
- this->perGameVar2.octorokHitType = SG_OCTO_HIT_TYPE_NONE;
+ this->octorokState = SG_OCTO_STATE_INITIAL;
+ this->lastHitOctorokType = SG_OCTO_TYPE_NONE;
sGameStartTimer = 30;
Interface_StartTimer(TIMER_ID_MINIGAME_1, 75);
this->actor.draw = NULL;
@@ -1240,62 +1273,67 @@ void EnSyatekiMan_Town_StartGame(EnSyatekiMan* this, PlayState* play) {
* For each wave, these flags are used to control which Octoroks appear.
*/
static const s32 sOctorokFlagsPerWave[] = {
- OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_CENTER) | OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_RIGHT) |
- OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_LEFT),
+ // clang-format off
+ OCTO_FLAGS(SG_OCTO_TYPE_RED, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_RED,
+ SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_RED, SG_OCTO_TYPE_NONE,
+ SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_NONE),
- OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_BLUE, ROW_CENTER, COLUMN_CENTER) |
- OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_LEFT) | OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_RIGHT),
+ OCTO_FLAGS(SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_RED,
+ SG_OCTO_TYPE_RED, SG_OCTO_TYPE_BLUE, SG_OCTO_TYPE_RED,
+ SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_NONE),
- OCTOROK_FLAG(COLOR_RED, ROW_FRONT, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_BLUE, ROW_BACK, COLUMN_RIGHT) |
- OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_CENTER) | OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_LEFT),
+ OCTO_FLAGS(SG_OCTO_TYPE_RED, SG_OCTO_TYPE_RED, SG_OCTO_TYPE_BLUE,
+ SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_NONE,
+ SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_RED),
- OCTOROK_FLAG(COLOR_RED, ROW_FRONT, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_RED, ROW_FRONT, COLUMN_LEFT) |
- OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_LEFT),
+ OCTO_FLAGS(SG_OCTO_TYPE_RED, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_RED,
+ SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_NONE,
+ SG_OCTO_TYPE_RED, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_RED),
- OCTOROK_FLAG(COLOR_BLUE, ROW_CENTER, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_CENTER) |
- OCTOROK_FLAG(COLOR_BLUE, ROW_CENTER, COLUMN_LEFT) | OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_CENTER),
+ OCTO_FLAGS(SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_RED, SG_OCTO_TYPE_NONE,
+ SG_OCTO_TYPE_BLUE, SG_OCTO_TYPE_RED, SG_OCTO_TYPE_BLUE,
+ SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_NONE),
- OCTOROK_FLAG(COLOR_RED, ROW_FRONT, COLUMN_CENTER) | OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_LEFT) |
- OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_RIGHT),
+ OCTO_FLAGS(SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_RED,
+ SG_OCTO_TYPE_RED, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_NONE,
+ SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_RED, SG_OCTO_TYPE_NONE),
- OCTOROK_FLAG(COLOR_RED, ROW_FRONT, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_BLUE, ROW_CENTER, COLUMN_CENTER) |
- OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_LEFT),
+ OCTO_FLAGS(SG_OCTO_TYPE_RED, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_RED,
+ SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_BLUE, SG_OCTO_TYPE_NONE,
+ SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_RED),
- OCTOROK_FLAG(COLOR_BLUE, ROW_FRONT, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_BLUE, ROW_FRONT, COLUMN_LEFT) |
- OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_CENTER) |
- OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_LEFT),
+ OCTO_FLAGS(SG_OCTO_TYPE_RED, SG_OCTO_TYPE_RED, SG_OCTO_TYPE_RED,
+ SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_NONE,
+ SG_OCTO_TYPE_BLUE, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_BLUE),
- OCTOROK_FLAG(COLOR_BLUE, ROW_FRONT, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_RED, ROW_FRONT, COLUMN_CENTER) |
- OCTOROK_FLAG(COLOR_BLUE, ROW_FRONT, COLUMN_LEFT) | OCTOROK_FLAG(COLOR_BLUE, ROW_CENTER, COLUMN_RIGHT) |
- OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_CENTER) | OCTOROK_FLAG(COLOR_BLUE, ROW_CENTER, COLUMN_LEFT) |
- OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_CENTER),
+ OCTO_FLAGS(SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_RED, SG_OCTO_TYPE_NONE,
+ SG_OCTO_TYPE_BLUE, SG_OCTO_TYPE_RED, SG_OCTO_TYPE_BLUE,
+ SG_OCTO_TYPE_BLUE, SG_OCTO_TYPE_RED, SG_OCTO_TYPE_BLUE),
- OCTOROK_FLAG(COLOR_RED, ROW_FRONT, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_BLUE, ROW_FRONT, COLUMN_LEFT) |
- OCTOROK_FLAG(COLOR_BLUE, ROW_CENTER, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_LEFT) |
- OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_BLUE, ROW_BACK, COLUMN_LEFT),
+ OCTO_FLAGS(SG_OCTO_TYPE_BLUE, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_RED,
+ SG_OCTO_TYPE_RED, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_BLUE,
+ SG_OCTO_TYPE_BLUE, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_RED),
- OCTOROK_FLAG(COLOR_RED, ROW_FRONT, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_RED, ROW_FRONT, COLUMN_LEFT) |
- OCTOROK_FLAG(COLOR_BLUE, ROW_CENTER, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_CENTER) |
- OCTOROK_FLAG(COLOR_BLUE, ROW_CENTER, COLUMN_LEFT) | OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_RIGHT) |
- OCTOROK_FLAG(COLOR_BLUE, ROW_BACK, COLUMN_CENTER) | OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_LEFT),
+ OCTO_FLAGS(SG_OCTO_TYPE_RED, SG_OCTO_TYPE_BLUE, SG_OCTO_TYPE_RED,
+ SG_OCTO_TYPE_BLUE, SG_OCTO_TYPE_RED, SG_OCTO_TYPE_BLUE,
+ SG_OCTO_TYPE_RED, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_RED),
- OCTOROK_FLAG(COLOR_BLUE, ROW_FRONT, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_BLUE, ROW_FRONT, COLUMN_LEFT) |
- OCTOROK_FLAG(COLOR_BLUE, ROW_CENTER, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_BLUE, ROW_CENTER, COLUMN_LEFT) |
- OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_CENTER) |
- OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_LEFT),
+ OCTO_FLAGS(SG_OCTO_TYPE_RED, SG_OCTO_TYPE_RED, SG_OCTO_TYPE_RED,
+ SG_OCTO_TYPE_BLUE, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_BLUE,
+ SG_OCTO_TYPE_BLUE, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_BLUE),
- OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_CENTER) |
- OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_LEFT) | OCTOROK_FLAG(COLOR_BLUE, ROW_BACK, COLUMN_RIGHT) |
- OCTOROK_FLAG(COLOR_BLUE, ROW_BACK, COLUMN_CENTER) | OCTOROK_FLAG(COLOR_BLUE, ROW_BACK, COLUMN_LEFT),
+ OCTO_FLAGS(SG_OCTO_TYPE_BLUE, SG_OCTO_TYPE_BLUE, SG_OCTO_TYPE_BLUE,
+ SG_OCTO_TYPE_RED, SG_OCTO_TYPE_RED, SG_OCTO_TYPE_RED,
+ SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_NONE),
- OCTOROK_FLAG(COLOR_BLUE, ROW_FRONT, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_BLUE, ROW_FRONT, COLUMN_CENTER) |
- OCTOROK_FLAG(COLOR_BLUE, ROW_FRONT, COLUMN_LEFT) | OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_RIGHT) |
- OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_LEFT) | OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_RIGHT) |
- OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_LEFT),
+ OCTO_FLAGS(SG_OCTO_TYPE_RED, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_RED,
+ SG_OCTO_TYPE_RED, SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_RED,
+ SG_OCTO_TYPE_BLUE, SG_OCTO_TYPE_BLUE, SG_OCTO_TYPE_BLUE),
- OCTOROK_FLAG(COLOR_RED, ROW_FRONT, COLUMN_CENTER) | OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_CENTER) |
- OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_CENTER) |
- OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_LEFT),
+ OCTO_FLAGS(SG_OCTO_TYPE_RED, SG_OCTO_TYPE_RED, SG_OCTO_TYPE_RED,
+ SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_RED, SG_OCTO_TYPE_NONE,
+ SG_OCTO_TYPE_NONE, SG_OCTO_TYPE_RED, SG_OCTO_TYPE_NONE),
+ // clang-format on
};
void EnSyatekiMan_Town_RunGame(EnSyatekiMan* this, PlayState* play) {
@@ -1320,42 +1358,42 @@ void EnSyatekiMan_Town_RunGame(EnSyatekiMan* this, PlayState* play) {
// Octoroks begin hiding four seconds after a wave begins.
if (waveTimer < 100) {
- this->perGameVar1.octorokState = SG_OCTO_STATE_HIDING;
+ this->octorokState = SG_OCTO_STATE_HIDING;
}
- if (this->perGameVar2.octorokHitType != SG_OCTO_HIT_TYPE_NONE) {
- if (this->perGameVar2.octorokHitType == SG_OCTO_HIT_TYPE_BLUE) {
+ if (this->lastHitOctorokType != SG_OCTO_TYPE_NONE) {
+ if (this->lastHitOctorokType == SG_OCTO_TYPE_BLUE) {
gSaveContext.timerTimeLimits[TIMER_ID_MINIGAME_1] -= SECONDS_TO_TIMER_PRECISE(2, 50);
sModFromLosingTime = (sModFromLosingTime + 25) % 50;
}
- this->perGameVar2.octorokHitType = SG_OCTO_HIT_TYPE_NONE;
+ this->lastHitOctorokType = SG_OCTO_TYPE_NONE;
}
- if (this->perGameVar1.octorokState == SG_OCTO_STATE_SPAWNING) {
- this->perGameVar1.octorokState++;
+ if (this->octorokState == SG_OCTO_STATE_APPEARING) {
+ this->octorokState++;
}
// A new wave of Octoroks should appear every five seconds. However, we need to take into account
// that the player might have lost time from hitting Blue Octoroks, so we do something similar to
// what was done with waveTimer above.
- if ((sModFromLosingTime == (timer % 50)) && (this->perGameVar1.octorokState >= SG_OCTO_STATE_INITIAL)) {
- if (this->flagsIndex < 15) {
+ if ((sModFromLosingTime == (timer % 50)) && (this->octorokState >= SG_OCTO_STATE_INITIAL)) {
+ if (this->flagsIndex < ARRAY_COUNT(sOctorokFlagsPerWave)) {
this->octorokFlags = sOctorokFlagsPerWave[this->flagsIndex++];
- Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_FOUND);
- this->perGameVar1.octorokState = SG_OCTO_STATE_SPAWNING;
+ Actor_PlaySfx(&this->actor, NA_SE_SY_FOUND);
+ this->octorokState = SG_OCTO_STATE_APPEARING;
}
}
if (gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_1] == SECONDS_TO_TIMER(0)) {
this->flagsIndex = 0;
- this->perGameVar1.octorokState = SG_OCTO_STATE_HIDING;
+ this->octorokState = SG_OCTO_STATE_HIDING;
gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_1] = SECONDS_TO_TIMER(0);
gSaveContext.timerStates[TIMER_ID_MINIGAME_1] = TIMER_STATE_STOP;
player->stateFlags1 |= PLAYER_STATE1_20;
sModFromLosingTime = 0;
this->actor.draw = EnSyatekiMan_Draw;
- func_801A2C20();
+ Audio_StopSubBgm();
this->actionFunc = EnSyatekiMan_Town_EndGame;
if (this->score == 50) {
Audio_PlayFanfare(NA_BGM_GET_ITEM | 0x900);
@@ -1371,9 +1409,9 @@ void EnSyatekiMan_Town_EndGame(EnSyatekiMan* this, PlayState* play) {
if ((this->talkWaitTimer <= 0) && !play->interfaceCtx.perfectLettersOn) {
Flags_SetAllTreasure(play, this->score);
this->talkWaitTimer = 15;
- if ((GET_TOWN_SHOOTING_GALLERY_HIGH_SCORE() < this->score) || (this->score == 50)) {
- if (GET_TOWN_SHOOTING_GALLERY_HIGH_SCORE() < this->score) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_59_20)) {
+ if ((HS_GET_TOWN_SHOOTING_GALLERY_HIGH_SCORE() < this->score) || (this->score == 50)) {
+ if (HS_GET_TOWN_SHOOTING_GALLERY_HIGH_SCORE() < this->score) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_TOWN_SHOOTING_GALLERY_QUIVER_UPGRADE)) {
// You got a new record!
Message_StartTextbox(play, 0x407, &this->actor);
this->prevTextId = 0x407;
@@ -1392,7 +1430,7 @@ void EnSyatekiMan_Town_EndGame(EnSyatekiMan* this, PlayState* play) {
this->prevTextId = 0x406;
}
- SET_TOWN_SHOOTING_GALLERY_HIGH_SCORE(this->score);
+ HS_SET_TOWN_SHOOTING_GALLERY_HIGH_SCORE(this->score);
this->shootingGameState = SG_GAME_STATE_ENDED;
} else {
if (CURRENT_DAY != 3) {
@@ -1502,7 +1540,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..2f6fe13f5 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
@@ -3,12 +3,29 @@
#include "global.h"
#include "objects/object_shn/object_shn.h"
+#include "overlays/effects/ovl_Effect_Ss_Extra/z_eff_ss_extra.h"
struct EnSyatekiMan;
typedef void (*EnSyatekiManActionFunc)(struct EnSyatekiMan*, PlayState*);
-#define EN_SYATEKI_MAN_GET_PATH(thisx) (((thisx)->params & 0xFF00) >> 8)
+#define SG_MAN_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFF00) >> 8)
+
+// These values are used to modify the shooting gallery man's internal score. They are
+// defined in terms of the scores used by EffectSsExtra because EffectSsExtra_Update
+// updates the score displayed to the player, and defining them like this will prevent
+// these two different scores from becoming desynchronized. If you intend to modify these
+// values, then you'll also need to make sure that EffectSsExtra_Spawn in the appropriate
+// actor is called with the correct parameter for the index; failing to do this will
+// cause the two different score variables to fall out of sync.
+#define SG_POINTS_DEKU_NORMAL EXTRA_SCORE_30
+#define SG_POINTS_DEKU_BONUS EXTRA_SCORE_100
+#define SG_POINTS_GUAY EXTRA_SCORE_60
+#define SG_POINTS_WOLFOS EXTRA_SCORE_100
+
+// After getting a perfect score in the Swamp Shooting Gallery, the player is rewarded
+// additional points for every second remaining on the minigame timer.
+#define SG_BONUS_POINTS_PER_SECOND 10
typedef enum {
/* 0 */ SG_GAME_STATE_NONE, // None of the states below apply.
@@ -18,21 +35,22 @@ 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,
+ /* 0 */ SG_OCTO_STATE_APPEARING, // The Octoroks will begin to appear on the next frame.
+ /* 1 */ SG_OCTO_STATE_APPEARED, // The Octoroks are appearing from underwater or have already appeared and are floating.
+ /* 70 */ SG_OCTO_STATE_INITIAL = 70, // The initial state of the game. The Octoroks have not appeared yet.
+ /* 80 */ SG_OCTO_STATE_HIDING = 80 // The Octoroks are in the process of hiding underwater.
} ShootingGalleryOctorokState;
typedef enum {
- /* 0 */ SG_OCTO_HIT_TYPE_NONE,
- /* 1 */ SG_OCTO_HIT_TYPE_RED,
- /* 2 */ SG_OCTO_HIT_TYPE_BLUE,
-} ShootingGalleryoctorokHitType;
+ /* 0 */ SG_PATH_TYPE_GUAY,
+ /* 1 */ SG_PATH_TYPE_DEKU_NORMAL,
+ /* 2 */ SG_PATH_TYPE_WOLFOS,
+ /* 3 */ SG_PATH_TYPE_DEKU_BONUS
+} ShootingGalleryPathType;
typedef struct EnSyatekiMan {
/* 0x000 */ Actor actor;
@@ -40,7 +58,7 @@ typedef struct EnSyatekiMan {
/* 0x188 */ EnSyatekiManActionFunc actionFunc;
/* 0x18C */ Path* path;
/* 0x190 */ s32 octorokFlags;
- /* 0x194 */ s32 swampTargetActorListIndex; // used but never initialized, so the value is implicitly always 0
+ /* 0x194 */ s32 swampTargetActorListIndex;
/* 0x198 */ Vec3s jointTable[BURLY_GUY_LIMB_MAX];
/* 0x1F8 */ Vec3s morphTable[BURLY_GUY_LIMB_MAX];
/* 0x258 */ Vec3s headRot;
@@ -50,13 +68,13 @@ typedef struct EnSyatekiMan {
/* 0x268 */ UNK_TYPE1 unk268[0x2];
/* 0x26A */ s16 shootingGameState;
/* 0x26C */ union {
- s16 guaySpawnTimer;
+ s16 guayAppearTimer;
s16 octorokState;
- } perGameVar1;
+ };
/* 0x26E */ union {
s16 bonusDekuScrubHitCounter;
- s16 octorokHitType;
- } perGameVar2;
+ s16 lastHitOctorokType;
+ };
/* 0x270 */ s16 talkWaitTimer;
/* 0x272 */ s16 dekuScrubFlags;
/* 0x274 */ s16 guayFlags;
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 162a6d718..114a5fe22 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
@@ -7,7 +7,7 @@
#include "z_en_syateki_okuta.h"
#include "overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.h"
-#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_8000000)
+#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_CANT_LOCK_ON)
#define THIS ((EnSyatekiOkuta*)thisx)
@@ -16,17 +16,17 @@ void EnSyatekiOkuta_Destroy(Actor* thisx, PlayState* play);
void EnSyatekiOkuta_Update(Actor* thisx, PlayState* play);
void EnSyatekiOkuta_Draw(Actor* thisx, PlayState* play);
-void func_80A36260(EnSyatekiOkuta* this);
-void func_80A362A8(EnSyatekiOkuta* this, PlayState* play);
-void func_80A362F8(EnSyatekiOkuta* this);
-void func_80A36350(EnSyatekiOkuta* this, PlayState* play);
-void func_80A363B4(EnSyatekiOkuta* this, PlayState* play);
-void func_80A36444(EnSyatekiOkuta* this);
-void func_80A36488(EnSyatekiOkuta* this, PlayState* play);
-void func_80A364C0(EnSyatekiOkuta* this);
-void func_80A36504(EnSyatekiOkuta* this, PlayState* play);
-void func_80A365EC(EnSyatekiOkuta* this, PlayState* play);
-void func_80A36CB0(EnSyatekiOkuta* this);
+void EnSyatekiOkuta_SetupAttachToShootingGalleryMan(EnSyatekiOkuta* this);
+void EnSyatekiOkuta_AttachToShootingGalleryMan(EnSyatekiOkuta* this, PlayState* play);
+void EnSyatekiOkuta_SetupDoNothing(EnSyatekiOkuta* this);
+void EnSyatekiOkuta_DoNothing(EnSyatekiOkuta* this, PlayState* play);
+void EnSyatekiOkuta_Appear(EnSyatekiOkuta* this, PlayState* play);
+void EnSyatekiOkuta_SetupFloat(EnSyatekiOkuta* this);
+void EnSyatekiOkuta_Float(EnSyatekiOkuta* this, PlayState* play);
+void EnSyatekiOkuta_SetupHide(EnSyatekiOkuta* this);
+void EnSyatekiOkuta_Hide(EnSyatekiOkuta* this, PlayState* play);
+void EnSyatekiOkuta_Die(EnSyatekiOkuta* this, PlayState* play);
+void EnSyatekiOkuta_UpdateHeadScale(EnSyatekiOkuta* this);
ActorInit En_Syateki_Okuta_InitVars = {
ACTOR_EN_SYATEKI_OKUTA,
@@ -60,13 +60,23 @@ static ColliderCylinderInit sCylinderInit = {
{ 20, 40, -30, { 0, 0, 0 } },
};
+typedef enum {
+ /* 0 */ SG_OCTO_ANIM_SHOOT, // unused
+ /* 1 */ SG_OCTO_ANIM_DIE,
+ /* 2 */ SG_OCTO_ANIM_HIDE,
+ /* 3 */ SG_OCTO_ANIM_FLOAT,
+ /* 4 */ SG_OCTO_ANIM_APPEAR,
+ /* 5 */ SG_OCTO_ANIM_HIT, // unused
+ /* 6 */ SG_OCTO_ANIM_MAX
+} ShootingGalleryOctorokAnimation;
+
static AnimationInfo sAnimationInfo[] = {
- { &gOctorokShootAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f },
- { &gOctorokDieAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f },
- { &gOctorokHideAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f },
- { &gOctorokFloatAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -1.0f },
- { &gOctorokAppearAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f },
- { &gOctorokHitAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f },
+ { &gOctorokShootAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f }, // SG_OCTO_ANIM_SHOOT
+ { &gOctorokDieAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f }, // SG_OCTO_ANIM_DIE
+ { &gOctorokHideAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f }, // SG_OCTO_ANIM_HIDE
+ { &gOctorokFloatAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -1.0f }, // SG_OCTO_ANIM_FLOAT
+ { &gOctorokAppearAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f }, // SG_OCTO_ANIM_APPEAR
+ { &gOctorokHitAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f }, // SG_OCTO_ANIM_HIT
};
#include "assets/overlays/ovl_En_Syateki_Okuta/ovl_En_Syateki_Okuta.c"
@@ -76,16 +86,6 @@ static InitChainEntry sInitChain[] = {
ICHAIN_F32(targetArrowOffset, 6500, ICHAIN_STOP),
};
-Color_RGBA8 D_80A37B90 = { 255, 255, 255, 255 };
-
-Color_RGBA8 D_80A37B94 = { 150, 150, 150, 255 };
-
-Vec3f D_80A37B98 = { 0.0f, -0.5, 0.0f };
-
-Color_RGBA8 D_80A37BA4 = { 255, 255, 255, 255 };
-
-Color_RGBA8 D_80A37BA8 = { 150, 150, 150, 0 };
-
void EnSyatekiOkuta_Init(Actor* thisx, PlayState* play) {
s32 pad;
EnSyatekiOkuta* this = THIS;
@@ -110,9 +110,9 @@ void EnSyatekiOkuta_Init(Actor* thisx, PlayState* play) {
this->actor.world.pos.y = this->actor.home.pos.y = ySurface;
}
- this->unk_2A4 = 0;
- this->unk_2AA = 0;
- func_80A36260(this);
+ this->deathTimer = 0;
+ this->hitResultAlpha = 0;
+ EnSyatekiOkuta_SetupAttachToShootingGalleryMan(this);
}
void EnSyatekiOkuta_Destroy(Actor* thisx, PlayState* play) {
@@ -121,30 +121,45 @@ void EnSyatekiOkuta_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyCylinder(play, &this->collider);
}
-void func_80A36148(Vec3f* pos, Vec3f* velocity, s16 scaleStep, PlayState* play) {
- func_800B0DE0(play, pos, velocity, &gZeroVec3f, &D_80A37B90, &D_80A37B94, 400, scaleStep);
+/**
+ * Spawns the puff of smoke that appears when the Octorok disappears when it dies.
+ */
+void EnSyatekiOkuta_SpawnDust(Vec3f* pos, Vec3f* velocity, s16 scaleStep, PlayState* play) {
+ static Color_RGBA8 sDustPrimColor = { 255, 255, 255, 255 };
+ static Color_RGBA8 sDustEnvColor = { 150, 150, 150, 255 };
+
+ func_800B0DE0(play, pos, velocity, &gZeroVec3f, &sDustPrimColor, &sDustEnvColor, 400, scaleStep);
}
-void func_80A361B0(EnSyatekiOkuta* this, PlayState* play) {
+/**
+ * Spawns the splash that appears when the Octorok appears from underwater, hides underwater, or dies.
+ */
+void EnSyatekiOkuta_SpawnSplash(EnSyatekiOkuta* this, PlayState* play) {
EffectSsGSplash_Spawn(play, &this->actor.home.pos, NULL, NULL, 0, 800);
}
-s32 func_80A361F4(EnSyatekiOkuta* this) {
- s32 temp_a0;
- s32 temp_a1;
- s32 temp_v1;
+/*
+ * Returns true if this Octorok is hidden (in other words, if it's in the center
+ * column and has another Octorok in front of it), false otherwise.
+ */
+s32 EnSyatekiOkuta_IsHiddenByAnotherOctorok(EnSyatekiOkuta* this) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
+ s32 index = SG_OCTO_GET_INDEX(&this->actor);
- temp_v1 = EN_SYATEKI_OKUTA_GET_F(&this->actor);
- if ((temp_v1 == 1) || (temp_v1 == 4)) {
- temp_a0 = syatekiMan->octorokFlags;
- temp_a1 = (temp_v1 * 2) + 6;
-
- if ((temp_a0 >> temp_a1) & 3) {
+ // Only the Octoroks in the center column can be obscured by another Octorok. The Octoroks in the
+ // left and right columns are always visible, since the player looks at them from an angle.
+ // Additionally, the Octorok in the front row is always visible, even if it's in the center column.
+ if ((index == SG_OCTO_INDEX_FOR_POS(SG_OCTO_ROW_BACK, SG_OCTO_COL_CENTER)) ||
+ (index == SG_OCTO_INDEX_FOR_POS(SG_OCTO_ROW_CENTER, SG_OCTO_COL_CENTER))) {
+ // Checks to see if this Octorok is hidden by an Octorok immediately in front of it.
+ if (SG_OCTO_GET_TYPE(syatekiMan->octorokFlags, SG_OCTO_INDEX_DIRECTLY_IN_FRONT(index)) != SG_OCTO_TYPE_NONE) {
return true;
}
- if ((temp_a1 == 8) && ((temp_a0 >> 0xE) & 3)) {
+ // If this Octorok is in the back row, it can also be hidden by an Octorok in the front row.
+ if ((index == SG_OCTO_INDEX_FOR_POS(SG_OCTO_ROW_BACK, SG_OCTO_COL_CENTER)) &&
+ (SG_OCTO_GET_TYPE(syatekiMan->octorokFlags, SG_OCTO_INDEX_FOR_POS(SG_OCTO_ROW_FRONT, SG_OCTO_COL_CENTER)) !=
+ SG_OCTO_TYPE_NONE)) {
return true;
}
}
@@ -152,143 +167,177 @@ s32 func_80A361F4(EnSyatekiOkuta* this) {
return false;
}
-void func_80A36260(EnSyatekiOkuta* this) {
+void EnSyatekiOkuta_SetupAttachToShootingGalleryMan(EnSyatekiOkuta* this) {
Animation_PlayOnceSetSpeed(&this->skelAnime, &gOctorokAppearAnim, 0.0f);
this->actor.draw = NULL;
- this->actionFunc = func_80A362A8;
+ this->actionFunc = EnSyatekiOkuta_AttachToShootingGalleryMan;
}
-void func_80A362A8(EnSyatekiOkuta* this, PlayState* play) {
+/**
+ * Checks every NPC actor in the scene to find the Shooting Gallery Man. Once it finds him, this will
+ * make him the parent to the Octorok. This is required because the Octoroks are normally spawned as
+ * part of the Town Shooting Gallery scene, so they don't have anything that links them to the Shooting
+ * Gallery Man, and the Octoroks need a pointer to him in order to access his Octorok flags. If this
+ * actor is spawned in a scene *without* the Shooting Gallery Man, its action function will never change
+ * from this function, and the Octorok will effectively do nothing.
+ */
+void EnSyatekiOkuta_AttachToShootingGalleryMan(EnSyatekiOkuta* this, PlayState* play) {
Actor* actorIt = play->actorCtx.actorLists[ACTORCAT_NPC].first;
while (actorIt != NULL) {
if (actorIt->id == ACTOR_EN_SYATEKI_MAN) {
this->actor.parent = actorIt;
- func_80A362F8(this);
+ EnSyatekiOkuta_SetupDoNothing(this);
break;
- } else {
- actorIt = actorIt->next;
}
+
+ actorIt = actorIt->next;
}
}
-void func_80A362F8(EnSyatekiOkuta* this) {
+/**
+ * Stops the Octorok's animation, prevents it from drawing, and sets its action function to do nothing.
+ * The intention here is to stay in this action function doing nothing until the Shooting Gallery Man
+ * tells it to appear in EnSyatekiOkuta_CheckForSignal, at which point the action function will be changed.
+ */
+void EnSyatekiOkuta_SetupDoNothing(EnSyatekiOkuta* this) {
Animation_PlayOnceSetSpeed(&this->skelAnime, &gOctorokAppearAnim, 0.0f);
this->actor.draw = NULL;
Actor_SetScale(&this->actor, 0.01f);
- this->actionFunc = func_80A36350;
+ this->actionFunc = EnSyatekiOkuta_DoNothing;
}
-void func_80A36350(EnSyatekiOkuta* this, PlayState* play) {
+void EnSyatekiOkuta_DoNothing(EnSyatekiOkuta* this, PlayState* play) {
}
-void func_80A36360(EnSyatekiOkuta* this) {
+void EnSyatekiOkuta_SetupAppear(EnSyatekiOkuta* this) {
this->actor.draw = EnSyatekiOkuta_Draw;
- this->unk_2AA = 0;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 4);
- this->actionFunc = func_80A363B4;
+ this->hitResultAlpha = 0;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, SG_OCTO_ANIM_APPEAR);
+ this->actionFunc = EnSyatekiOkuta_Appear;
}
-void func_80A363B4(EnSyatekiOkuta* this, PlayState* play) {
- if ((Animation_OnFrame(&this->skelAnime, 2.0f)) || (Animation_OnFrame(&this->skelAnime, 15.0f))) {
- if (func_80A361F4(this)) {
+/**
+ * Jumps out of the water and starts floating.
+ */
+void EnSyatekiOkuta_Appear(EnSyatekiOkuta* this, PlayState* play) {
+ if (Animation_OnFrame(&this->skelAnime, 2.0f) || Animation_OnFrame(&this->skelAnime, 15.0f)) {
+ if (EnSyatekiOkuta_IsHiddenByAnotherOctorok(this)) {
return;
- } else {
- func_80A361B0(this, play);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_OCTAROCK_JUMP);
}
+
+ EnSyatekiOkuta_SpawnSplash(this, play);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_OCTAROCK_JUMP);
}
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- func_80A36444(this);
+ EnSyatekiOkuta_SetupFloat(this);
}
}
-void func_80A36444(EnSyatekiOkuta* this) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
- this->actionFunc = func_80A36488;
+void EnSyatekiOkuta_SetupFloat(EnSyatekiOkuta* this) {
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, SG_OCTO_ANIM_FLOAT);
+ this->actionFunc = EnSyatekiOkuta_Float;
}
-void func_80A36488(EnSyatekiOkuta* this, PlayState* play) {
+/**
+ * Floats in place until the Shooting Gallery Man tells it to hide.
+ */
+void EnSyatekiOkuta_Float(EnSyatekiOkuta* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
- if (syatekiMan->perGameVar1.octorokState >= SG_OCTO_STATE_INITIAL) {
- func_80A364C0(this);
+ // In practice, if the Octorok is floating, then the octorokState is either SG_OCTO_STATE_APPEARED or
+ // SG_OCTO_STATE_HIDING. Only the latter state is greater than SG_OCTO_STATE_INITIAL, so that's what
+ // this check is looking for.
+ if (syatekiMan->octorokState >= SG_OCTO_STATE_INITIAL) {
+ EnSyatekiOkuta_SetupHide(this);
}
}
-void func_80A364C0(EnSyatekiOkuta* this) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
- this->actionFunc = func_80A36504;
+void EnSyatekiOkuta_SetupHide(EnSyatekiOkuta* this) {
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, SG_OCTO_ANIM_HIDE);
+ this->actionFunc = EnSyatekiOkuta_Hide;
}
-void func_80A36504(EnSyatekiOkuta* this, PlayState* play) {
+/**
+ * Retreats underwater, then makes the Octorok do nothing until the Shooting Gallery Man tells it to appear again.
+ */
+void EnSyatekiOkuta_Hide(EnSyatekiOkuta* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, 4.0f)) {
- func_80A361B0(this, play);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DAIOCTA_LAND);
+ EnSyatekiOkuta_SpawnSplash(this, play);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DAIOCTA_LAND);
} else if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- func_80A362F8(this);
+ EnSyatekiOkuta_SetupDoNothing(this);
}
}
-void func_80A3657C(EnSyatekiOkuta* this) {
- this->unk_2A4 = 0;
- this->unk_2AA = 300;
- if (this->unk_2A6 == 1) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_OCTAROCK_DEAD1);
+void EnSyatekiOkuta_SetupDie(EnSyatekiOkuta* this) {
+ this->deathTimer = 0;
+ this->hitResultAlpha = 300;
+ if (this->type == SG_OCTO_TYPE_RED) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_OCTAROCK_DEAD1);
}
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
- this->actionFunc = func_80A365EC;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, SG_OCTO_ANIM_DIE);
+ this->actionFunc = EnSyatekiOkuta_Die;
}
-void func_80A365EC(EnSyatekiOkuta* this, PlayState* play) {
- Vec3f sp84;
- Vec3f sp78;
+/**
+ * Plays the death animation and slowly shrinks the Octorok. Also spawns various bubble and dust
+ * effects as it dies. Once the Octorok is finished with its death animation, this function will
+ * make it do nothing until the Shooting Gallery Man tells it to appear again.
+ */
+void EnSyatekiOkuta_Die(EnSyatekiOkuta* this, PlayState* play) {
+ static Vec3f sBubbleAccel = { 0.0f, -0.5, 0.0f };
+ static Color_RGBA8 sBubblePrimColor = { 255, 255, 255, 255 };
+ static Color_RGBA8 sBubbleEnvColor = { 150, 150, 150, 0 };
+ Vec3f velocity;
+ Vec3f pos;
s32 pad;
s32 i;
- if (this->unk_2AA > 0) {
- this->unk_2AA -= 15;
+ if (this->hitResultAlpha > 0) {
+ this->hitResultAlpha -= 15;
}
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- if (this->unk_2A4 == 0) {
- sp78.x = this->actor.world.pos.x;
- sp78.y = this->actor.world.pos.y + 40.0f;
- sp78.z = this->actor.world.pos.z;
- sp84.x = 0.0f;
- sp84.y = -0.5f;
- sp84.z = 0.0f;
- func_80A36148(&sp78, &sp84, -20, play);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_OCTAROCK_DEAD2);
+ if (this->deathTimer == 0) {
+ pos.x = this->actor.world.pos.x;
+ pos.y = this->actor.world.pos.y + 40.0f;
+ pos.z = this->actor.world.pos.z;
+ velocity.x = 0.0f;
+ velocity.y = -0.5f;
+ velocity.z = 0.0f;
+ EnSyatekiOkuta_SpawnDust(&pos, &velocity, -20, play);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_OCTAROCK_DEAD2);
}
- this->unk_2A4++;
+ this->deathTimer++;
}
if (Animation_OnFrame(&this->skelAnime, 15.0f)) {
- func_80A361B0(this, play);
+ EnSyatekiOkuta_SpawnSplash(this, play);
}
- if (this->unk_2A4 < 3) {
- Actor_SetScale(&this->actor, ((this->unk_2A4 * 0.25f) + 1.0f) * 0.01f);
- } else if (this->unk_2A4 < 6) {
- Actor_SetScale(&this->actor, (1.5f - ((this->unk_2A4 - 2) * 0.2333f)) * 0.01f);
- } else if (this->unk_2A4 < 11) {
- Actor_SetScale(&this->actor, (((this->unk_2A4 - 5) * 0.04f) + 0.8f) * 0.01f);
+ if (this->deathTimer < 3) {
+ Actor_SetScale(&this->actor, ((this->deathTimer * 0.25f) + 1.0f) * 0.01f);
+ } else if (this->deathTimer < 6) {
+ Actor_SetScale(&this->actor, (1.5f - ((this->deathTimer - 2) * 0.2333f)) * 0.01f);
+ } else if (this->deathTimer < 11) {
+ Actor_SetScale(&this->actor, (((this->deathTimer - 5) * 0.04f) + 0.8f) * 0.01f);
} else {
if (Math_StepToF(&this->actor.scale.x, 0.0f, 0.002f)) {
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 30, NA_SE_EN_COMMON_WATER_MID);
for (i = 0; i < 10; i++) {
- sp84.x = (Rand_ZeroOne() - 0.5f) * 7.0f;
- sp84.y = Rand_ZeroOne() * 7.0f;
- sp84.z = (Rand_ZeroOne() - 0.5f) * 7.0f;
- EffectSsDtBubble_SpawnCustomColor(play, &this->actor.world.pos, &sp84, &D_80A37B98, &D_80A37BA4,
- &D_80A37BA8, Rand_S16Offset(100, 50), 25, false);
+ velocity.x = (Rand_ZeroOne() - 0.5f) * 7.0f;
+ velocity.y = Rand_ZeroOne() * 7.0f;
+ velocity.z = (Rand_ZeroOne() - 0.5f) * 7.0f;
+ EffectSsDtBubble_SpawnCustomColor(play, &this->actor.world.pos, &velocity, &sBubbleAccel,
+ &sBubblePrimColor, &sBubbleEnvColor, Rand_S16Offset(100, 50), 25,
+ false);
}
- func_80A362F8(this);
+ EnSyatekiOkuta_SetupDoNothing(this);
}
this->actor.scale.y = this->actor.scale.x;
@@ -296,13 +345,17 @@ void func_80A365EC(EnSyatekiOkuta* this, PlayState* play) {
}
}
-void func_80A368E0(EnSyatekiOkuta* this, PlayState* play) {
+/**
+ * Adjusts the collider's dimensions and position based on a few different factors, like the Octorok's
+ * type, current scale and head scale, and current action.
+ */
+void EnSyatekiOkuta_UpdateCollision(EnSyatekiOkuta* this, PlayState* play) {
this->collider.dim.height =
- (sCylinderInit.dim.height - this->collider.dim.yShift) * this->unk_1D8.y * this->actor.scale.y * 100.0f;
+ (sCylinderInit.dim.height - this->collider.dim.yShift) * this->headScale.y * this->actor.scale.y * 100.0f;
this->collider.dim.radius = sCylinderInit.dim.radius * this->actor.scale.x * 100.0f;
- if (this->actionFunc == func_80A363B4) {
- if ((this->unk_2A6 == 2) && func_80A361F4(this)) {
+ if (this->actionFunc == EnSyatekiOkuta_Appear) {
+ if ((this->type == SG_OCTO_TYPE_BLUE) && EnSyatekiOkuta_IsHiddenByAnotherOctorok(this)) {
return;
}
@@ -311,7 +364,7 @@ void func_80A368E0(EnSyatekiOkuta* this, PlayState* play) {
}
}
- if (this->unk_2A6 == 1) {
+ if (this->type == SG_OCTO_TYPE_RED) {
this->collider.dim.radius += 10;
this->collider.dim.height += 15;
}
@@ -323,8 +376,11 @@ void func_80A368E0(EnSyatekiOkuta* this, PlayState* play) {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
}
-s32 func_80A36A90(EnSyatekiOkuta* this, PlayState* play) {
- if ((this->actionFunc == func_80A365EC) || (this->actionFunc == func_80A36350)) {
+/**
+ * Returns true if the Octorok has been hit, false otherwise.
+ */
+s32 EnSyatekiOkuta_CheckCollision(EnSyatekiOkuta* this, PlayState* play) {
+ if ((this->actionFunc == EnSyatekiOkuta_Die) || (this->actionFunc == EnSyatekiOkuta_DoNothing)) {
return false;
}
@@ -333,22 +389,28 @@ s32 func_80A36A90(EnSyatekiOkuta* this, PlayState* play) {
return true;
}
- func_80A368E0(this, play);
+ EnSyatekiOkuta_UpdateCollision(this, play);
return false;
}
-void func_80A36AF8(EnSyatekiOkuta* this, PlayState* play) {
+/**
+ * Checks to see if both the archery game and this Octorok are in the appropriate state to consider
+ * appearing. If the conditions are right, then the Shooting Gallery Man's Octorok flags determine
+ * what type this Octorok should be for the current wave; if the type is *not* SG_OCTO_TYPE_NONE,
+ * then this Octorok will set itself to the appropriate type and get ready to jump out of the water.
+ */
+void EnSyatekiOkuta_CheckForSignal(EnSyatekiOkuta* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
- s16 temp_v1_2;
+ s16 type;
- if ((this->actionFunc != func_80A36488) && (this->actionFunc != func_80A363B4) &&
+ if ((this->actionFunc != EnSyatekiOkuta_Float) && (this->actionFunc != EnSyatekiOkuta_Appear) &&
(syatekiMan->shootingGameState == SG_GAME_STATE_RUNNING) &&
- (syatekiMan->perGameVar1.octorokState == SG_OCTO_STATE_SPAWNING)) {
- temp_v1_2 = (syatekiMan->octorokFlags >> (EN_SYATEKI_OKUTA_GET_F(&this->actor) * 2)) & 3;
- if (temp_v1_2 > 0) {
+ (syatekiMan->octorokState == SG_OCTO_STATE_APPEARING)) {
+ type = SG_OCTO_GET_TYPE(syatekiMan->octorokFlags, SG_OCTO_GET_INDEX(&this->actor));
+ if (type > SG_OCTO_TYPE_NONE) {
Actor_SetScale(&this->actor, 0.01f);
- this->unk_2A6 = temp_v1_2;
- func_80A36360(this);
+ this->type = type;
+ EnSyatekiOkuta_SetupAppear(this);
}
}
}
@@ -360,101 +422,108 @@ void EnSyatekiOkuta_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
- if (this->actionFunc != func_80A36350) {
+ if (this->actionFunc != EnSyatekiOkuta_DoNothing) {
SkelAnime_Update(&this->skelAnime);
}
- func_80A36AF8(this, play);
+ EnSyatekiOkuta_CheckForSignal(this, play);
- if (func_80A36A90(this, play)) {
+ if (EnSyatekiOkuta_CheckCollision(this, play)) {
syatekiMan = (EnSyatekiMan*)this->actor.parent;
- if (this->unk_2A6 == 1) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
+ if (this->type == SG_OCTO_TYPE_RED) {
+ Actor_PlaySfx(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
play->interfaceCtx.minigamePoints++;
syatekiMan->score++;
- syatekiMan->perGameVar2.octorokHitType = SG_OCTO_HIT_TYPE_RED;
+ syatekiMan->lastHitOctorokType = SG_OCTO_TYPE_RED;
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_ERROR);
- syatekiMan->perGameVar2.octorokHitType = SG_OCTO_HIT_TYPE_BLUE;
+ Actor_PlaySfx(&this->actor, NA_SE_SY_ERROR);
+ syatekiMan->lastHitOctorokType = SG_OCTO_TYPE_BLUE;
}
- func_80A3657C(this);
+ EnSyatekiOkuta_SetupDie(this);
} else {
this->collider.base.acFlags &= ~AC_HIT;
}
- func_80A36CB0(this);
+ EnSyatekiOkuta_UpdateHeadScale(this);
}
-void func_80A36CB0(EnSyatekiOkuta* this) {
+/**
+ * Adjusts the scale of the Octorok's head based on their current action and their current animation frame.
+ */
+void EnSyatekiOkuta_UpdateHeadScale(EnSyatekiOkuta* this) {
f32 curFrame = this->skelAnime.curFrame;
- if (this->actionFunc == func_80A363B4) {
+ if (this->actionFunc == EnSyatekiOkuta_Appear) {
if (curFrame < 8.0f) {
- this->unk_1D8.x = this->unk_1D8.y = this->unk_1D8.z = 1.0f;
+ this->headScale.x = this->headScale.y = this->headScale.z = 1.0f;
} else if (curFrame < 10.0f) {
- this->unk_1D8.x = this->unk_1D8.z = 1.0f;
- this->unk_1D8.y = ((curFrame - 7.0f) * 0.4f) + 1.0f;
+ this->headScale.x = this->headScale.z = 1.0f;
+ this->headScale.y = ((curFrame - 7.0f) * 0.4f) + 1.0f;
} else if (curFrame < 14.0f) {
- this->unk_1D8.x = this->unk_1D8.z = ((curFrame - 9.0f) * 0.075f) + 1.0f;
- this->unk_1D8.y = 1.8f - ((curFrame - 9.0f) * 0.25f);
+ this->headScale.x = this->headScale.z = ((curFrame - 9.0f) * 0.075f) + 1.0f;
+ this->headScale.y = 1.8f - ((curFrame - 9.0f) * 0.25f);
} else {
- this->unk_1D8.x = this->unk_1D8.z = 1.3f - ((curFrame - 13.0f) * 0.05f);
- this->unk_1D8.y = ((curFrame - 13.0f) * 0.0333f) + 0.8f;
+ this->headScale.x = this->headScale.z = 1.3f - ((curFrame - 13.0f) * 0.05f);
+ this->headScale.y = ((curFrame - 13.0f) * 0.0333f) + 0.8f;
}
- } 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;
- } else if (this->actionFunc == func_80A36504) {
+ } else if (this->actionFunc == EnSyatekiOkuta_Float) {
+ this->headScale.x = this->headScale.z = 1.0f;
+ this->headScale.y = (Math_SinF((M_PI / 16) * curFrame) * 0.2f) + 1.0f;
+ } else if (this->actionFunc == EnSyatekiOkuta_Hide) {
if (curFrame < 3.0f) {
- this->unk_1D8.y = 1.0f;
+ this->headScale.y = 1.0f;
} else if (curFrame < 4.0f) {
- this->unk_1D8.y = (curFrame - 2.0f) + 1.0f;
+ this->headScale.y = (curFrame - 2.0f) + 1.0f;
} else {
- this->unk_1D8.y = 2.0f - ((curFrame - 3.0f) * 0.333f);
+ this->headScale.y = 2.0f - ((curFrame - 3.0f) * 0.333f);
}
- this->unk_1D8.x = this->unk_1D8.z = 1.0f;
- } else if (this->actionFunc == func_80A365EC) {
- curFrame += this->unk_2A4;
+ this->headScale.x = this->headScale.z = 1.0f;
+ } else if (this->actionFunc == EnSyatekiOkuta_Die) {
+ curFrame += this->deathTimer;
if (curFrame >= 35.0f) {
- this->unk_1D8.x = this->unk_1D8.y = this->unk_1D8.z = 1.0f;
+ this->headScale.x = this->headScale.y = this->headScale.z = 1.0f;
} else if (curFrame < 4.0f) {
- this->unk_1D8.x = this->unk_1D8.z = 1.0f - (curFrame * 0.0666f);
- this->unk_1D8.y = (curFrame * 0.1666f) + 1.0f;
+ this->headScale.x = this->headScale.z = 1.0f - (curFrame * 0.0666f);
+ this->headScale.y = (curFrame * 0.1666f) + 1.0f;
} else if (curFrame < 25.0f) {
- this->unk_1D8.x = this->unk_1D8.z = ((curFrame - 4.0f) * 0.01f) + 0.8f;
- this->unk_1D8.y = 1.5f - ((curFrame - 4.0f) * 0.025f);
+ this->headScale.x = this->headScale.z = ((curFrame - 4.0f) * 0.01f) + 0.8f;
+ this->headScale.y = 1.5f - ((curFrame - 4.0f) * 0.025f);
} else if (curFrame < 27.0f) {
- this->unk_1D8.x = this->unk_1D8.y = this->unk_1D8.z = ((curFrame - 24.0f) * 0.25f) + 1.0f;
+ this->headScale.x = this->headScale.y = this->headScale.z = ((curFrame - 24.0f) * 0.25f) + 1.0f;
} else if (curFrame < 30.0f) {
- this->unk_1D8.x = this->unk_1D8.y = this->unk_1D8.z = 1.5f - ((curFrame - 26.0f) * 0.233f);
+ this->headScale.x = this->headScale.y = this->headScale.z = 1.5f - ((curFrame - 26.0f) * 0.233f);
} else {
- this->unk_1D8.x = this->unk_1D8.y = this->unk_1D8.z = ((curFrame - 29.0f) * 0.04f) + 0.8f;
+ this->headScale.x = this->headScale.y = this->headScale.z = ((curFrame - 29.0f) * 0.04f) + 0.8f;
}
} else {
- this->unk_1D8.x = this->unk_1D8.y = this->unk_1D8.z = 1.0f;
+ this->headScale.x = this->headScale.y = this->headScale.z = 1.0f;
}
}
-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;
- } else if (this->actionFunc == func_80A365EC) {
- if ((arg1 >= 35.0f) || (arg1 < 25.0f)) {
+/**
+ * Returns true if the snout scale should be updated, false otherwise. The snout scale is returned via the scale
+ * parameter.
+ */
+s32 EnSyatekiOkuta_GetSnoutScale(EnSyatekiOkuta* this, f32 curFrame, Vec3f* scale) {
+ if (this->actionFunc == EnSyatekiOkuta_Appear) {
+ scale->y = 1.0f;
+ scale->z = 1.0f;
+ scale->x = (Math_SinF((M_PI / 16) * curFrame) * 0.4f) + 1.0f;
+ } else if (this->actionFunc == EnSyatekiOkuta_Die) {
+ if ((curFrame >= 35.0f) || (curFrame < 25.0f)) {
return false;
}
- if (arg1 < 27.0f) {
- arg2->z = 1.0f;
- arg2->x = arg2->y = ((arg1 - 24.0f) * 0.5f) + 1.0f;
- } else if (arg1 < 30.0f) {
- arg2->z = (arg1 - 26.0f) * 0.333f + 1.0f;
- arg2->x = arg2->y = 2.0f - (arg1 - 26.0f) * 0.333f;
+ if (curFrame < 27.0f) {
+ scale->z = 1.0f;
+ scale->x = scale->y = ((curFrame - 24.0f) * 0.5f) + 1.0f;
+ } else if (curFrame < 30.0f) {
+ scale->z = (curFrame - 26.0f) * 0.333f + 1.0f;
+ scale->x = scale->y = 2.0f - (curFrame - 26.0f) * 0.333f;
} else {
- arg2->z = 2.0f - ((arg1 - 29.0f) * 0.2f);
- arg2->x = arg2->y = 1.0f;
+ scale->z = 2.0f - ((curFrame - 29.0f) * 0.2f);
+ scale->x = scale->y = 1.0f;
}
} else {
return false;
@@ -465,20 +534,20 @@ s32 func_80A370EC(EnSyatekiOkuta* this, f32 arg1, Vec3f* arg2) {
s32 EnSyatekiOkuta_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
s32 pad;
- Vec3f sp20;
+ Vec3f scale;
f32 curFrame;
EnSyatekiOkuta* this = THIS;
curFrame = this->skelAnime.curFrame;
- if (this->actionFunc == func_80A365EC) {
- curFrame += this->unk_2A4;
+ if (this->actionFunc == EnSyatekiOkuta_Die) {
+ curFrame += this->deathTimer;
}
if (limbIndex == OCTOROK_LIMB_HEAD) {
- sp20 = this->unk_1D8;
- Matrix_Scale(sp20.x, sp20.y, sp20.z, MTXMODE_APPLY);
- } else if ((limbIndex == OCTOROK_LIMB_SNOUT) && (func_80A370EC(this, curFrame, &sp20))) {
- Matrix_Scale(sp20.x, sp20.y, sp20.z, MTXMODE_APPLY);
+ scale = this->headScale;
+ Matrix_Scale(scale.x, scale.y, scale.z, MTXMODE_APPLY);
+ } else if ((limbIndex == OCTOROK_LIMB_SNOUT) && (EnSyatekiOkuta_GetSnoutScale(this, curFrame, &scale))) {
+ Matrix_Scale(scale.x, scale.y, scale.z, MTXMODE_APPLY);
}
return false;
@@ -489,8 +558,8 @@ void EnSyatekiOkuta_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- if (this->unk_2A6 == 1) {
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ if (this->type == SG_OCTO_TYPE_RED) {
gSPSegment(POLY_OPA_DISP++, 0x08, D_801AEFA0);
} else {
gSPSegment(POLY_OPA_DISP++, 0x08, gShootingGalleryOctorokBlueMaterialDL);
@@ -498,20 +567,22 @@ 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);
- if (this->actionFunc == func_80A365EC) {
+
+ // Draw the circle or cross that appears when the player hits an Octorok
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ if (this->actionFunc == EnSyatekiOkuta_Die) {
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y + 30.0f, this->actor.world.pos.z + 20.0f,
MTXMODE_NEW);
- if (this->unk_2AA >= 256) {
+ if (this->hitResultAlpha > 255) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 210, 64, 32, 255);
} else {
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 210, 64, 32, this->unk_2AA);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 210, 64, 32, this->hitResultAlpha);
}
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- if (this->unk_2A6 == 2) {
+ if (this->type == SG_OCTO_TYPE_BLUE) {
gSPDisplayList(POLY_XLU_DISP++, gShootingGalleryOctorokCrossDL);
} else {
gSPDisplayList(POLY_XLU_DISP++, gShootingGalleryOctorokCircleDL);
diff --git a/src/overlays/actors/ovl_En_Syateki_Okuta/z_en_syateki_okuta.h b/src/overlays/actors/ovl_En_Syateki_Okuta/z_en_syateki_okuta.h
index 0527354d0..72be15406 100644
--- a/src/overlays/actors/ovl_En_Syateki_Okuta/z_en_syateki_okuta.h
+++ b/src/overlays/actors/ovl_En_Syateki_Okuta/z_en_syateki_okuta.h
@@ -4,7 +4,39 @@
#include "global.h"
#include "objects/object_okuta/object_okuta.h"
-#define EN_SYATEKI_OKUTA_GET_F(thisx) ((thisx)->params & 0xF)
+typedef enum {
+ /* 0 */ SG_OCTO_TYPE_NONE,
+ /* 1 */ SG_OCTO_TYPE_RED,
+ /* 2 */ SG_OCTO_TYPE_BLUE,
+ /* 3 */ SG_OCTO_TYPE_MAX
+} ShootingGalleryOctorokType;
+
+typedef enum {
+ /* 0 */ SG_OCTO_ROW_BACK,
+ /* 1 */ SG_OCTO_ROW_CENTER,
+ /* 2 */ SG_OCTO_ROW_FRONT,
+ /* 3 */ SG_OCTO_ROW_MAX
+} ShootingGalleryOctorokRow;
+
+typedef enum {
+ /* 0 */ SG_OCTO_COL_LEFT,
+ /* 1 */ SG_OCTO_COL_CENTER,
+ /* 2 */ SG_OCTO_COL_RIGHT,
+ /* 3 */ SG_OCTO_COL_MAX
+} ShootingGalleryOctorokColumn;
+
+#define SG_OCTO_GET_INDEX(thisx) ((thisx)->params & 0xF)
+#define SG_OCTO_INDEX_FOR_POS(row, column) (((row) * SG_OCTO_COL_MAX) + (column))
+
+// This returns the index of the Octorok directly in front of the Octorok at the given index. In other words, it
+// returns the index of the Octorok in the same column as the one with the given index, but one row ahead. It's
+// assumed that this will only be used for Octoroks in the back or center row; it returns an invalid index for
+// Octoroks in the front row.
+#define SG_OCTO_INDEX_DIRECTLY_IN_FRONT(index) ((index) + SG_OCTO_COL_MAX)
+
+// Both of these macros assume that the Octorok types can fit in two bits, hence why the index is multiplied by 2.
+#define SG_OCTO_GET_TYPE(octorokFlags, index) (((octorokFlags) >> ((index) * 2)) & SG_OCTO_TYPE_MAX)
+#define SG_OCTO_SET_FLAG(type, index) ((type & SG_OCTO_TYPE_MAX) << ((index) * 2))
struct EnSyatekiOkuta;
@@ -15,13 +47,13 @@ typedef struct EnSyatekiOkuta {
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ EnSyatekiOkutaActionFunc actionFunc;
/* 0x18C */ ColliderCylinder collider;
- /* 0x1DC */ Vec3f unk_1D8;
+ /* 0x1DC */ Vec3f headScale;
/* 0x1E4 */ Vec3s jointTable[OCTOROK_LIMB_MAX];
/* 0x244 */ Vec3s morphTable[OCTOROK_LIMB_MAX];
- /* 0x2A4 */ s16 unk_2A4;
- /* 0x2A6 */ s16 unk_2A6;
+ /* 0x2A4 */ s16 deathTimer;
+ /* 0x2A6 */ s16 type;
/* 0x2A8 */ UNK_TYPE1 unk_2A8[0x2];
- /* 0x2AA */ s16 unk_2AA;
+ /* 0x2AA */ s16 hitResultAlpha;
} EnSyatekiOkuta; // size = 0x2AC
#endif // Z_EN_SYATEKI_OKUTA_H
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 20871efb2..7f1f3cd4a 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
@@ -7,7 +7,7 @@
#include "z_en_syateki_wf.h"
#include "overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.h"
-#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_8000000)
+#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_CANT_LOCK_ON)
#define THIS ((EnSyatekiWf*)thisx)
@@ -16,19 +16,19 @@ void EnSyatekiWf_Destroy(Actor* thisx, PlayState* play);
void EnSyatekiWf_Update(Actor* thisx, PlayState* play2);
void EnSyatekiWf_Draw(Actor* thisx, PlayState* play);
-void func_80A201CC(EnSyatekiWf* this);
-void func_80A20284(EnSyatekiWf* this, PlayState* play);
-void func_80A2030C(EnSyatekiWf* this);
-void func_80A20320(EnSyatekiWf* this, PlayState* play);
-void func_80A20378(EnSyatekiWf* this);
-void func_80A203DC(EnSyatekiWf* this, PlayState* play);
-void func_80A20670(EnSyatekiWf* this);
-void func_80A206DC(EnSyatekiWf* this, PlayState* play);
-void func_80A20710(EnSyatekiWf* this);
-void func_80A2075C(EnSyatekiWf* this, PlayState* play);
-void func_80A2079C(EnSyatekiWf* this);
-void func_80A20800(EnSyatekiWf* this, PlayState* play);
-void func_80A208F8(EnSyatekiWf* this, PlayState* play);
+void EnSyatekiWf_SetupWaitForSignal(EnSyatekiWf* this);
+void EnSyatekiWf_WaitForSignal(EnSyatekiWf* this, PlayState* play);
+void EnSyatekiWf_SetupWaitToMove(EnSyatekiWf* this);
+void EnSyatekiWf_WaitToMove(EnSyatekiWf* this, PlayState* play);
+void EnSyatekiWf_SetupRun(EnSyatekiWf* this);
+void EnSyatekiWf_Run(EnSyatekiWf* this, PlayState* play);
+void EnSyatekiWf_SetupJump(EnSyatekiWf* this);
+void EnSyatekiWf_Jump(EnSyatekiWf* this, PlayState* play);
+void EnSyatekiWf_SetupLand(EnSyatekiWf* this);
+void EnSyatekiWf_Land(EnSyatekiWf* this, PlayState* play);
+void EnSyatekiWf_SetupHowl(EnSyatekiWf* this);
+void EnSyatekiWf_Howl(EnSyatekiWf* this, PlayState* play);
+void EnSyatekiWf_Dead(EnSyatekiWf* this, PlayState* play);
static ColliderJntSphElementInit sJntSphElementsInit[1] = {
{
@@ -40,11 +40,11 @@ static ColliderJntSphElementInit sJntSphElementsInit[1] = {
BUMP_ON,
OCELEM_ON,
},
- { 17, { { 800, 0, 0 }, 25 }, 100 },
+ { WOLFOS_NORMAL_LIMB_HEAD, { { 800, 0, 0 }, 25 }, 100 },
},
};
-static ColliderCylinderInit sCylinderInit1 = {
+static ColliderCylinderInit sBodyCylinderInit = {
{
COLTYPE_HIT5,
AT_NONE,
@@ -77,7 +77,7 @@ static ColliderJntSphInit sJntSphInit = {
sJntSphElementsInit,
};
-static ColliderCylinderInit sCylinderInit2 = {
+static ColliderCylinderInit sTailCylinderInit = {
{
COLTYPE_HIT5,
AT_NONE,
@@ -97,9 +97,9 @@ static ColliderCylinderInit sCylinderInit2 = {
{ 15, 20, -15, { 0, 0, 0 } },
};
-static Vec3f D_80A20EDC = { 0.0f, 20.0f, 0.0f };
+static Vec3f sVelocity = { 0.0f, 20.0f, 0.0f };
-static Vec3f D_80A20EE8 = { 0.0f, 0.0f, 0.0f };
+static Vec3f sAccel = { 0.0f, 0.0f, 0.0f };
ActorInit En_Syateki_Wf_InitVars = {
ACTOR_EN_SYATEKI_WF,
@@ -113,14 +113,24 @@ ActorInit En_Syateki_Wf_InitVars = {
(ActorFunc)EnSyatekiWf_Draw,
};
+typedef enum {
+ /* 0 */ SG_WOLFOS_ANIM_WAIT, // unused
+ /* 1 */ SG_WOLFOS_ANIM_RUN,
+ /* 2 */ SG_WOLFOS_ANIM_JUMP,
+ /* 3 */ SG_WOLFOS_ANIM_LAND,
+ /* 4 */ SG_WOLFOS_ANIM_BACKFLIP, // unused
+ /* 5 */ SG_WOLFOS_ANIM_DAMAGED,
+ /* 6 */ SG_WOLFOS_ANIM_REAR_UP_FALL_OVER
+} ShootingGalleryWolfosAnimation;
+
static AnimationInfo sAnimationInfo[] = {
- { &gWolfosWaitingAnim, 2.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -1.0f },
- { &gWolfosRunningAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
- { &gWolfosRunningAnim, 1.0f, 0.0f, 4.0f, ANIMMODE_ONCE, 1.0f },
- { &gWolfosRunningAnim, 1.0f, 4.0f, 8.0f, ANIMMODE_ONCE, 1.0f },
- { &gWolfosBackflippingAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f },
- { &gWolfosDamagedAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 8.0f },
- { &gWolfosRearingUpFallingOverAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f },
+ { &gWolfosWaitAnim, 2.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -1.0f }, // SG_WOLFOS_ANIM_WAIT
+ { &gWolfosRunAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // SG_WOLFOS_ANIM_RUN
+ { &gWolfosRunAnim, 1.0f, 0.0f, 4.0f, ANIMMODE_ONCE, 1.0f }, // SG_WOLFOS_ANIM_JUMP
+ { &gWolfosRunAnim, 1.0f, 4.0f, 8.0f, ANIMMODE_ONCE, 1.0f }, // SG_WOLFOS_ANIM_LAND
+ { &gWolfosBackflipAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f }, // SG_WOLFOS_ANIM_BACKFLIP
+ { &gWolfosDamagedAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 8.0f }, // SG_WOLFOS_ANIM_DAMAGED
+ { &gWolfosRearUpFallOverAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f }, // SG_WOLFOS_ANIM_REAR_UP_FALL_OVER
};
static InitChainEntry sInitChain[] = {
@@ -128,17 +138,6 @@ static InitChainEntry sInitChain[] = {
ICHAIN_F32_DIV1000(gravity, -2000, ICHAIN_STOP),
};
-static Vec3f D_80A20FC4 = { 0.0f, 0.5f, 0.0f };
-
-static Vec3f D_80A20FD0 = { 1200.0f, 0.0f, 0.0f };
-
-static TexturePtr sEyeTextures[] = {
- gWolfosNormalEyeOpenTex,
- gWolfosNormalEyeHalfTex,
- gWolfosNormalEyeNarrowTex,
- gWolfosNormalEyeHalfTex,
-};
-
void EnSyatekiWf_Init(Actor* thisx, PlayState* play) {
s32 pad;
EnSyatekiWf* this = THIS;
@@ -147,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];
+ for (i = 0; i < SG_WOLFOS_GET_INDEX(&this->actor); i++) {
+ path = &play->setupPathList[path->additionalPathIndex];
}
if (path == NULL) {
@@ -160,12 +159,12 @@ void EnSyatekiWf_Init(Actor* thisx, PlayState* play) {
return;
}
- this->unk_2A0 = Lib_SegmentedToVirtual(path->points);
- this->unk_2A4 = 1;
- this->unk_2A6 = path->count;
+ this->pathPoints = Lib_SegmentedToVirtual(path->points);
+ this->currentPointIndex = 1;
+ this->maxPointIndex = path->count;
Actor_ProcessInitChain(&this->actor, sInitChain);
- this->unk_29C = 0;
+ this->waitTimer = 0;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 0.0f);
this->actor.focus.pos = this->actor.world.pos;
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
@@ -175,146 +174,159 @@ void EnSyatekiWf_Init(Actor* thisx, PlayState* play) {
this->eyeIndex = 0;
this->unk_2AC = 10.0f;
- Collider_InitCylinder(play, &this->unk_2B4);
- Collider_SetCylinder(play, &this->unk_2B4, &this->actor, &sCylinderInit1);
- Collider_InitCylinder(play, &this->unk_300);
- Collider_SetCylinder(play, &this->unk_300, &this->actor, &sCylinderInit2);
- Collider_InitJntSph(play, &this->unk_34C);
- Collider_SetJntSph(play, &this->unk_34C, &this->actor, &sJntSphInit, this->unk_36C);
- this->unk_34C.elements->dim.worldSphere.radius = sJntSphInit.elements[0].dim.modelSphere.radius;
+ Collider_InitCylinder(play, &this->bodyCollider);
+ Collider_SetCylinder(play, &this->bodyCollider, &this->actor, &sBodyCylinderInit);
+ Collider_InitCylinder(play, &this->tailCollider);
+ Collider_SetCylinder(play, &this->tailCollider, &this->actor, &sTailCylinderInit);
+ Collider_InitJntSph(play, &this->headCollider);
+ Collider_SetJntSph(play, &this->headCollider, &this->actor, &sJntSphInit, this->headColliderElements);
+ this->headCollider.elements->dim.worldSphere.radius = sJntSphInit.elements[0].dim.modelSphere.radius;
- SkelAnime_InitFlex(play, &this->skelAnime, &gWolfosNormalSkel, &gWolfosWaitingAnim, this->jointTable,
- this->morphTable, WOLFOS_NORMAL_LIMB_MAX);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gWolfosNormalSkel, &gWolfosWaitAnim, this->jointTable, this->morphTable,
+ WOLFOS_NORMAL_LIMB_MAX);
Actor_SetScale(&this->actor, 0.01f);
this->actor.hintId = TATL_HINT_ID_WOLFOS;
- func_80A201CC(this);
+ EnSyatekiWf_SetupWaitForSignal(this);
}
void EnSyatekiWf_Destroy(Actor* thisx, PlayState* play) {
EnSyatekiWf* this = THIS;
- Collider_DestroyCylinder(play, &this->unk_2B4);
- Collider_DestroyCylinder(play, &this->unk_300);
+ Collider_DestroyCylinder(play, &this->bodyCollider);
+ Collider_DestroyCylinder(play, &this->tailCollider);
}
-void func_80A200E0(EnSyatekiWf* this) {
- Vec3f sp24;
- s16 temp;
+/**
+ * Positions the Wolfos at the start of its assigned path and rotates it to face
+ * the next point on the path.
+ */
+void EnSyatekiWf_InitPathStart(EnSyatekiWf* this) {
+ Vec3f targetPos;
- this->actor.world.pos.x = this->unk_2A0[0].x;
- this->actor.world.pos.y = this->unk_2A0[0].y;
- this->actor.world.pos.z = this->unk_2A0[0].z;
- sp24.x = this->unk_2A0[this->unk_2A4].x;
- sp24.y = this->unk_2A0[this->unk_2A4].y;
- sp24.z = this->unk_2A0[this->unk_2A4].z;
- temp = Math_Vec3f_Yaw(&this->actor.world.pos, &sp24);
- this->actor.shape.rot.y = temp;
- this->actor.world.rot.y = temp;
+ this->actor.world.pos.x = this->pathPoints[0].x;
+ this->actor.world.pos.y = this->pathPoints[0].y;
+ this->actor.world.pos.z = this->pathPoints[0].z;
+ targetPos.x = this->pathPoints[this->currentPointIndex].x;
+ targetPos.y = this->pathPoints[this->currentPointIndex].y;
+ targetPos.z = this->pathPoints[this->currentPointIndex].z;
+ this->actor.world.rot.y = this->actor.shape.rot.y = Math_Vec3f_Yaw(&this->actor.world.pos, &targetPos);
}
-void func_80A201CC(EnSyatekiWf* this) {
+void EnSyatekiWf_SetupWaitForSignal(EnSyatekiWf* this) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.world = this->actor.home;
this->actor.prevPos = this->actor.home.pos;
this->actor.shape.rot = this->actor.world.rot;
this->actor.colChkInfo.health = 2;
this->actor.draw = NULL;
- this->unk_2A4 = 1;
- this->unk_298 = 0;
- syatekiMan->wolfosFlags &= ~(1 << EN_SYATEKI_WF_GET_INDEX(&this->actor));
- this->actionFunc = func_80A20284;
+ this->currentPointIndex = 1;
+ this->isActive = false;
+ syatekiMan->wolfosFlags &= ~(1 << SG_WOLFOS_GET_INDEX(&this->actor));
+ this->actionFunc = EnSyatekiWf_WaitForSignal;
}
-void func_80A20284(EnSyatekiWf* this, PlayState* play) {
+/**
+ * Waits until the shooting gallery man sets the appropriate Wolfos flag.
+ */
+void EnSyatekiWf_WaitForSignal(EnSyatekiWf* this, PlayState* play) {
EnSyatekiMan* syatekiMan;
if (this->actor.parent != NULL) {
syatekiMan = (EnSyatekiMan*)this->actor.parent;
- if ((syatekiMan->shootingGameState == SG_GAME_STATE_RUNNING) && (this->unk_298 == 1)) {
- func_80A200E0(this);
- func_80A2030C(this);
- } else if (syatekiMan->wolfosFlags & (1 << EN_SYATEKI_WF_GET_INDEX(&this->actor))) {
- this->unk_298 = 1;
+ if ((syatekiMan->shootingGameState == SG_GAME_STATE_RUNNING) && (this->isActive == true)) {
+ EnSyatekiWf_InitPathStart(this);
+ EnSyatekiWf_SetupWaitToMove(this);
+ } else if (syatekiMan->wolfosFlags & (1 << SG_WOLFOS_GET_INDEX(&this->actor))) {
+ this->isActive = true;
}
}
}
-void func_80A2030C(EnSyatekiWf* this) {
- this->actionFunc = func_80A20320;
+void EnSyatekiWf_SetupWaitToMove(EnSyatekiWf* this) {
+ this->actionFunc = EnSyatekiWf_WaitToMove;
}
-void func_80A20320(EnSyatekiWf* this, PlayState* play) {
- if (this->unk_29C >= 11) {
- Actor_PlaySfxAtPos(this->actor.parent, NA_SE_EN_WOLFOS_APPEAR);
- this->unk_29C = 0;
- func_80A20378(this);
+/**
+ * Waits 11 frames, then makes the Wolfos start running forward.
+ */
+void EnSyatekiWf_WaitToMove(EnSyatekiWf* this, PlayState* play) {
+ if (this->waitTimer >= 11) {
+ Actor_PlaySfx(this->actor.parent, NA_SE_EN_WOLFOS_APPEAR);
+ this->waitTimer = 0;
+ EnSyatekiWf_SetupRun(this);
} else {
- this->unk_29C++;
+ this->waitTimer++;
}
}
-void func_80A20378(EnSyatekiWf* this) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
- this->actor.speedXZ = 10.0f;
+void EnSyatekiWf_SetupRun(EnSyatekiWf* this) {
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, SG_WOLFOS_ANIM_RUN);
+ this->actor.speed = 10.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actor.draw = EnSyatekiWf_Draw;
- this->actionFunc = func_80A203DC;
+ this->actionFunc = EnSyatekiWf_Run;
}
-void func_80A203DC(EnSyatekiWf* this, PlayState* play) {
- Vec3f sp54;
- f32 sp50;
- s16 temp_v0;
+/**
+ * Runs forward along its assigned path. If the Wolfos encounters a wall directly
+ * in front of it, this function will make it jump. If the Wolfos reaches a certain
+ * point along the path (which is specified via its params), this function will make
+ * it stop running and howl in place.
+ */
+void EnSyatekiWf_Run(EnSyatekiWf* this, PlayState* play) {
+ Vec3f targetPoint;
+ f32 distToTarget;
+ s16 wallYawDiff;
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
if (syatekiMan->shootingGameState != SG_GAME_STATE_RUNNING) {
- func_80A201CC(this);
+ EnSyatekiWf_SetupWaitForSignal(this);
}
- sp54.x = this->unk_2A0[this->unk_2A4].x;
- sp54.y = this->unk_2A0[this->unk_2A4].y;
- sp54.z = this->unk_2A0[this->unk_2A4].z;
- temp_v0 = (this->actor.wallYaw - this->actor.world.rot.y) + 0x8000;
+ targetPoint.x = this->pathPoints[this->currentPointIndex].x;
+ targetPoint.y = this->pathPoints[this->currentPointIndex].y;
+ targetPoint.z = this->pathPoints[this->currentPointIndex].z;
+ wallYawDiff = (this->actor.wallYaw - this->actor.world.rot.y) + 0x8000;
- if (this->actor.bgCheckFlags & 1) {
- if (this->actor.bgCheckFlags & 8) {
- if ((ABS(temp_v0) < 0x1555) && (this->actor.wallPoly != this->actor.floorPoly)) {
- func_80A20670(this);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
+ if ((ABS(wallYawDiff) < 0x1555) && (this->actor.wallPoly != this->actor.floorPoly)) {
+ EnSyatekiWf_SetupJump(this);
return;
}
}
- if (this->actor.bgCheckFlags & 4) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_LEAVE) {
this->actor.velocity.y = 2.0f;
}
- sp50 = Math_Vec3f_DistXZ(&this->actor.world.pos, &sp54);
- this->unk_2A8 = Math_Vec3f_Yaw(&this->actor.world.pos, &sp54);
+ distToTarget = Math_Vec3f_DistXZ(&this->actor.world.pos, &targetPoint);
+ this->yawTarget = Math_Vec3f_Yaw(&this->actor.world.pos, &targetPoint);
- if (sp50 > 15.0f) {
- Math_SmoothStepToS(&this->actor.world.rot.y, this->unk_2A8, 5, 0x3000, 0x100);
+ if (distToTarget > 15.0f) {
+ Math_SmoothStepToS(&this->actor.world.rot.y, this->yawTarget, 5, 0x3000, 0x100);
this->actor.shape.rot.y = this->actor.world.rot.y;
- if (sp50 < 50.0f) {
- if (this->actor.speedXZ > 3.0f) {
- this->actor.speedXZ = this->actor.speedXZ - 0.5f;
+ if (distToTarget < 50.0f) {
+ if (this->actor.speed > 3.0f) {
+ this->actor.speed = this->actor.speed - 0.5f;
} else {
- this->actor.speedXZ = this->actor.speedXZ;
+ this->actor.speed = this->actor.speed;
}
}
} else {
- if (this->unk_2A4 < (this->unk_2A6 - 1)) {
- if (this->unk_2A4 == EN_SYATEKI_WF_GET_PARAM_F0(&this->actor)) {
- func_80A2079C(this);
+ if (this->currentPointIndex < (this->maxPointIndex - 1)) {
+ if (this->currentPointIndex == SG_WOLFOS_GET_POINT_TO_HOWL(&this->actor)) {
+ EnSyatekiWf_SetupHowl(this);
}
- this->unk_2A4++;
+ this->currentPointIndex++;
} else {
- this->unk_298 = 0;
- this->unk_2A4 = 1;
- func_80A201CC(this);
+ this->isActive = false;
+ this->currentPointIndex = 1;
+ EnSyatekiWf_SetupWaitForSignal(this);
}
}
@@ -324,76 +336,82 @@ void func_80A203DC(EnSyatekiWf* this, PlayState* play) {
}
}
-void func_80A20670(EnSyatekiWf* this) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_TEKU_JUMP);
+void EnSyatekiWf_SetupJump(EnSyatekiWf* this) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_TEKU_JUMP);
this->actor.velocity.y = 20.0f;
- this->actor.speedXZ = 5.0f;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
- this->actionFunc = func_80A206DC;
+ this->actor.speed = 5.0f;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, SG_WOLFOS_ANIM_JUMP);
+ this->actionFunc = EnSyatekiWf_Jump;
}
-void func_80A206DC(EnSyatekiWf* this, PlayState* play) {
- if (this->actor.bgCheckFlags & 2) {
- func_80A20710(this);
+void EnSyatekiWf_Jump(EnSyatekiWf* this, PlayState* play) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
+ EnSyatekiWf_SetupLand(this);
}
}
-void func_80A20710(EnSyatekiWf* this) {
- this->actor.speedXZ = 0.0f;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
- this->actionFunc = func_80A2075C;
+void EnSyatekiWf_SetupLand(EnSyatekiWf* this) {
+ this->actor.speed = 0.0f;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, SG_WOLFOS_ANIM_LAND);
+ this->actionFunc = EnSyatekiWf_Land;
}
-void func_80A2075C(EnSyatekiWf* this, PlayState* play) {
+/**
+ * Freezes the Wolfos in place until its landing animation is complete, then makes it start running.
+ */
+void EnSyatekiWf_Land(EnSyatekiWf* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- func_80A20378(this);
+ EnSyatekiWf_SetupRun(this);
}
}
-void func_80A2079C(EnSyatekiWf* this) {
- this->unk_29A = 40;
- this->actor.speedXZ = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WOLFOS_APPEAR);
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 5);
- this->actionFunc = func_80A20800;
+void EnSyatekiWf_SetupHowl(EnSyatekiWf* this) {
+ this->timer = 40;
+ this->actor.speed = 0.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WOLFOS_APPEAR);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, SG_WOLFOS_ANIM_DAMAGED);
+ this->actionFunc = EnSyatekiWf_Howl;
}
-void func_80A20800(EnSyatekiWf* this, PlayState* play) {
+/**
+ * Makes the Wolfos stand completely still until 40 frames after its damaged animation is complete.
+ */
+void EnSyatekiWf_Howl(EnSyatekiWf* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- this->unk_29A--;
- if (this->unk_29A == 0) {
- func_80A20378(this);
+ this->timer--;
+ if (this->timer == 0) {
+ EnSyatekiWf_SetupRun(this);
}
}
}
-void func_80A20858(EnSyatekiWf* this, PlayState* play) {
+void EnSyatekiWf_SetupDead(EnSyatekiWf* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
- this->unk_298 = 0;
- this->actor.speedXZ = 0.0f;
- EffectSsExtra_Spawn(play, &this->actor.world.pos, &D_80A20EDC, &D_80A20EE8, 5, 2);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WOLFOS_DEAD);
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 6);
- syatekiMan->score += 100;
- this->actionFunc = func_80A208F8;
+ this->isActive = false;
+ this->actor.speed = 0.0f;
+ EffectSsExtra_Spawn(play, &this->actor.world.pos, &sVelocity, &sAccel, 5, EXTRA_SCORE_INDEX_100);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WOLFOS_DEAD);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, SG_WOLFOS_ANIM_REAR_UP_FALL_OVER);
+ syatekiMan->score += SG_POINTS_WOLFOS;
+ this->actionFunc = EnSyatekiWf_Dead;
}
-void func_80A208F8(EnSyatekiWf* this, PlayState* play) {
+void EnSyatekiWf_Dead(EnSyatekiWf* this, PlayState* play) {
s32 pad;
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- func_80A201CC(this);
+ EnSyatekiWf_SetupWaitForSignal(this);
} else {
- Vec3f sp68;
- Vec3f sp5C = D_80A20FC4;
+ Vec3f firePos;
+ Vec3f sFireVelocityAndAccel = { 0.0f, 0.5f, 0.0f };
s32 i;
for (i = (s32)this->skelAnime.animLength - (s32)this->skelAnime.curFrame; i >= 0; i--) {
- 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);
- func_800B3030(play, &sp68, &sp5C, &sp5C, 0x64, 0, 2);
+ 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);
}
}
}
@@ -402,41 +420,49 @@ void EnSyatekiWf_Update(Actor* thisx, PlayState* play2) {
PlayState* play = play2;
EnSyatekiWf* this = THIS;
- if (this->actionFunc != func_80A20284) {
+ if (this->actionFunc != EnSyatekiWf_WaitForSignal) {
SkelAnime_Update(&this->skelAnime);
}
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 & 3) {
+ if (this->actor.bgCheckFlags & (BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH)) {
func_800BE3D0(&this->actor, this->actor.shape.rot.y, &this->actor.shape.rot);
} else {
Math_SmoothStepToS(&this->actor.shape.rot.x, 0, 1, 0x3E8, 0);
Math_SmoothStepToS(&this->actor.shape.rot.z, 0, 1, 0x3E8, 0);
}
- if ((this->unk_2B4.base.acFlags & AC_HIT) || (this->unk_300.base.acFlags & AC_HIT) ||
- (this->unk_34C.base.acFlags & AC_HIT)) {
- this->unk_2B4.base.acFlags &= ~AC_HIT;
- this->unk_300.base.acFlags &= ~AC_HIT;
- this->unk_34C.base.acFlags &= ~AC_HIT;
+ if ((this->bodyCollider.base.acFlags & AC_HIT) || (this->tailCollider.base.acFlags & AC_HIT) ||
+ (this->headCollider.base.acFlags & AC_HIT)) {
+ this->bodyCollider.base.acFlags &= ~AC_HIT;
+ this->tailCollider.base.acFlags &= ~AC_HIT;
+ this->headCollider.base.acFlags &= ~AC_HIT;
+
+ //! @bug: The Wolfos always starts with 2 health, so the subtraction below is guaranteed to kill it;
+ //! the else-block is never reached in practice. If you *could* damage the Wolfos without killing
+ //! it, then the number "30" would appear every time you hit it, and the player's displayed score
+ //! would increase by 30. However, the else-block doesn't increase the shooting gallery man's
+ //! "score" variable, so it would become desynchronized from the displayed score. This could cause
+ //! weird behavior, like not getting a free replay after finishing a game with 2000 or more points.
this->actor.colChkInfo.health -= 2;
if (this->actor.colChkInfo.health == 0) {
Audio_PlayFanfare(NA_BGM_GET_ITEM | 0x900);
- func_80A20858(this, play);
+ EnSyatekiWf_SetupDead(this, play);
} else {
- play_sound(NA_SE_SY_TRE_BOX_APPEAR);
- EffectSsExtra_Spawn(play, &this->actor.world.pos, &D_80A20EDC, &D_80A20EE8, 3, 0);
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
+ EffectSsExtra_Spawn(play, &this->actor.world.pos, &sVelocity, &sAccel, 3, EXTRA_SCORE_INDEX_30);
}
}
- Collider_UpdateCylinder(&this->actor, &this->unk_2B4);
- if ((this->actionFunc != func_80A20284) && (this->actionFunc != func_80A208F8) && (this->actor.draw != NULL)) {
- CollisionCheck_SetAC(play, &play->colChkCtx, &this->unk_300.base);
- CollisionCheck_SetAC(play, &play->colChkCtx, &this->unk_2B4.base);
- CollisionCheck_SetAC(play, &play->colChkCtx, &this->unk_34C.base);
+ Collider_UpdateCylinder(&this->actor, &this->bodyCollider);
+ if ((this->actionFunc != EnSyatekiWf_WaitForSignal) && (this->actionFunc != EnSyatekiWf_Dead) &&
+ (this->actor.draw != NULL)) {
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->tailCollider.base);
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->bodyCollider.base);
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->headCollider.base);
this->actor.focus.pos = this->actor.world.pos;
this->actor.focus.pos.y += 25.0f;
}
@@ -455,24 +481,31 @@ s32 EnSyatekiWf_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Ve
}
void EnSyatekiWf_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
+ static Vec3f sTailColliderOffset = { 1200.0f, 0.0f, 0.0f };
EnSyatekiWf* this = THIS;
- Vec3f sp18;
+ Vec3f tailColliderPos;
- Collider_UpdateSpheres(limbIndex, &this->unk_34C);
+ Collider_UpdateSpheres(limbIndex, &this->headCollider);
if (limbIndex == WOLFOS_NORMAL_LIMB_TAIL) {
- Matrix_MultVec3f(&D_80A20FD0, &sp18);
- this->unk_300.dim.pos.x = sp18.x;
- this->unk_300.dim.pos.y = sp18.y;
- this->unk_300.dim.pos.z = sp18.z;
+ Matrix_MultVec3f(&sTailColliderOffset, &tailColliderPos);
+ this->tailCollider.dim.pos.x = tailColliderPos.x;
+ this->tailCollider.dim.pos.y = tailColliderPos.y;
+ this->tailCollider.dim.pos.z = tailColliderPos.z;
}
}
void EnSyatekiWf_Draw(Actor* thisx, PlayState* play) {
+ static TexturePtr sEyeTextures[] = {
+ gWolfosNormalEyeOpenTex,
+ gWolfosNormalEyeHalfTex,
+ gWolfosNormalEyeNarrowTex,
+ gWolfosNormalEyeHalfTex,
+ };
EnSyatekiWf* 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,
EnSyatekiWf_OverrideLimbDraw, EnSyatekiWf_PostLimbDraw, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Syateki_Wf/z_en_syateki_wf.h b/src/overlays/actors/ovl_En_Syateki_Wf/z_en_syateki_wf.h
index 56770952f..06057d6b4 100644
--- a/src/overlays/actors/ovl_En_Syateki_Wf/z_en_syateki_wf.h
+++ b/src/overlays/actors/ovl_En_Syateki_Wf/z_en_syateki_wf.h
@@ -4,9 +4,9 @@
#include "global.h"
#include "objects/object_wf/object_wf.h"
-#define EN_SYATEKI_WF_GET_PARAM_F0(thisx) (((thisx)->params & 0xF0) >> 4)
-#define EN_SYATEKI_WF_GET_INDEX(thisx) (((thisx)->params & 0xFF00) >> 8)
-#define EN_SYATEKI_WF_PARAMS(index, unkF0, unused) (((index << 8) & 0xFF00) | ((unkF0 << 4) & 0xF0) | (unused & 0xF))
+#define SG_WOLFOS_GET_POINT_TO_HOWL(thisx) (((thisx)->params & 0xF0) >> 4)
+#define SG_WOLFOS_GET_INDEX(thisx) (((thisx)->params & 0xFF00) >> 8)
+#define SG_WOLFOS_PARAMS(index, pointToHowl, unused) (((index << 8) & 0xFF00) | ((pointToHowl << 4) & 0xF0) | (unused & 0xF))
struct EnSyatekiWf;
@@ -19,19 +19,19 @@ typedef struct EnSyatekiWf {
/* 0x20C */ Vec3s morphTable[WOLFOS_NORMAL_LIMB_MAX];
/* 0x290 */ UNK_TYPE1 unk_290[0x4];
/* 0x294 */ EnSyatekiWfActionFunc actionFunc;
- /* 0x298 */ s16 unk_298;
- /* 0x29A */ s16 unk_29A;
- /* 0x29C */ s16 unk_29C;
- /* 0x2A0 */ Vec3s* unk_2A0;
- /* 0x2A4 */ s16 unk_2A4;
- /* 0x2A6 */ s16 unk_2A6;
- /* 0x2A8 */ s16 unk_2A8;
- /* 0x2AC */ f32 unk_2AC;
+ /* 0x298 */ s16 isActive;
+ /* 0x29A */ s16 timer;
+ /* 0x29C */ s16 waitTimer;
+ /* 0x2A0 */ Vec3s* pathPoints;
+ /* 0x2A4 */ s16 currentPointIndex;
+ /* 0x2A6 */ s16 maxPointIndex;
+ /* 0x2A8 */ s16 yawTarget;
+ /* 0x2AC */ f32 unk_2AC; // set to 10.0f, but never used
/* 0x2B0 */ u8 eyeIndex;
- /* 0x2B4 */ ColliderCylinder unk_2B4;
- /* 0x300 */ ColliderCylinder unk_300;
- /* 0x34C */ ColliderJntSph unk_34C;
- /* 0x36C */ ColliderJntSphElement unk_36C[1];
+ /* 0x2B4 */ ColliderCylinder bodyCollider;
+ /* 0x300 */ ColliderCylinder tailCollider;
+ /* 0x34C */ ColliderJntSph headCollider;
+ /* 0x36C */ ColliderJntSphElement headColliderElements[1];
/* 0x3AC */ UNK_TYPE1 unk_3AC[0x20];
} EnSyatekiWf; // size = 0x3CC
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..364d8874b 100644
--- a/src/overlays/actors/ovl_En_Tab/z_en_tab.c
+++ b/src/overlays/actors/ovl_En_Tab/z_en_tab.c
@@ -8,7 +8,7 @@
#include "objects/gameplay_keep/gameplay_keep.h"
#include "objects/object_tab/object_tab.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((EnTab*)thisx)
@@ -184,16 +184,14 @@ void func_80BE0664(EnTab* this) {
s32 func_80BE06DC(EnTab* this, PlayState* play) {
s32 ret = false;
- if (this->unk_2FC & 7) {
- if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- SubS_UpdateFlags(&this->unk_2FC, 0, 7);
- ret = true;
- this->unk_320 = 0;
- this->unk_328 = NULL;
- this->actor.child = &GET_PLAYER(play)->actor;
- this->unk_2FC |= 8;
- this->actionFunc = func_80BE1348;
- }
+ if (((this->unk_2FC & 7) != SUBS_OFFER_MODE_NONE) && Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ SubS_SetOfferMode(&this->unk_2FC, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
+ ret = true;
+ this->unk_320 = 0;
+ this->unk_328 = NULL;
+ this->actor.child = &GET_PLAYER(play)->actor;
+ this->unk_2FC |= 8;
+ this->actionFunc = func_80BE1348;
}
return ret;
}
@@ -227,7 +225,7 @@ void func_80BE07A0(EnTab* this) {
Math_Vec3f_Copy(&sp34, &this->actor.focus.pos);
if (this->unk_1E0->id == ACTOR_PLAYER) {
- sp40.y = ((Player*)this->unk_1E0)->bodyPartsPos[7].y + 3.0f;
+ sp40.y = ((Player*)this->unk_1E0)->bodyPartsPos[PLAYER_BODYPART_HEAD].y + 3.0f;
} else {
Math_Vec3f_Copy(&sp40, &this->unk_1E0->focus.pos);
}
@@ -323,9 +321,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;
}
@@ -374,8 +372,8 @@ s32 func_80BE0F04(EnTab* this, PlayState* play, ScheduleOutput* scheduleOutput)
Math_Vec3f_Copy(&this->actor.world.pos, &D_80BE1AF0);
Math_Vec3s_Copy(&this->actor.world.rot, &D_80BE1AFC);
Math_Vec3s_Copy(&this->actor.shape.rot, &this->actor.world.rot);
- this->actor.targetMode = 0;
- SubS_UpdateFlags(&this->unk_2FC, 3, 7);
+ this->actor.targetMode = TARGET_MODE_0;
+ SubS_SetOfferMode(&this->unk_2FC, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_2FC |= (0x40 | 0x20);
this->unk_30C = 30;
this->unk_1E4 = sp28;
@@ -391,8 +389,8 @@ s32 func_80BE0FC4(EnTab* this, PlayState* play, ScheduleOutput* scheduleOutput)
Math_Vec3f_Copy(&this->actor.world.pos, &D_80BE1B04);
Math_Vec3s_Copy(&this->actor.world.rot, &D_80BE1B10);
Math_Vec3s_Copy(&this->actor.shape.rot, &this->actor.world.rot);
- this->actor.targetMode = 6;
- SubS_UpdateFlags(&this->unk_2FC, 3, 7);
+ this->actor.targetMode = TARGET_MODE_6;
+ SubS_SetOfferMode(&this->unk_2FC, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_2FC |= (0x40 | 0x20);
this->unk_30C = 0x50;
func_80BE05BC(this, 1);
@@ -478,11 +476,11 @@ void func_80BE127C(EnTab* this, PlayState* play) {
if (!Schedule_RunScript(play, D_80BE18D0, &sp18) ||
((this->unk_1D8 != sp18.result) && !func_80BE1060(this, play, &sp18))) {
this->actor.shape.shadowDraw = NULL;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
sp18.result = 0;
} else {
this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}
this->unk_1D8 = sp18.result;
func_80BE1224(this, play);
@@ -494,7 +492,7 @@ void func_80BE1348(EnTab* this, PlayState* play) {
Vec3f sp34;
if (func_8010BF58(&this->actor, play, func_80BE0E04(this, play), this->unk_328, &this->unk_1DC)) {
- SubS_UpdateFlags(&this->unk_2FC, 3, 7);
+ SubS_SetOfferMode(&this->unk_2FC, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
this->unk_2FC &= ~8;
this->unk_2FC |= 0x40;
this->unk_324 = 20;
@@ -551,9 +549,9 @@ void EnTab_Update(Actor* thisx, PlayState* play) {
radius = this->collider.dim.radius + this->unk_30C;
height = this->collider.dim.height + 10;
- func_8013C964(&this->actor, play, radius, height, PLAYER_IA_NONE, this->unk_2FC & 7);
+ SubS_Offer(&this->actor, play, radius, height, PLAYER_IA_NONE, this->unk_2FC & SUBS_OFFER_MODE_MASK);
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 +615,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_Tag_Obj/z_en_tag_obj.c b/src/overlays/actors/ovl_En_Tag_Obj/z_en_tag_obj.c
index 2cc547e9a..9a4b0f2d7 100644
--- a/src/overlays/actors/ovl_En_Tag_Obj/z_en_tag_obj.c
+++ b/src/overlays/actors/ovl_En_Tag_Obj/z_en_tag_obj.c
@@ -5,6 +5,7 @@
*/
#include "z_en_tag_obj.h"
+#include "overlays/actors/ovl_En_Ot/z_en_ot.h"
#define FLAGS 0x00000000
@@ -60,7 +61,7 @@ void EnTagObj_Update(Actor* thisx, PlayState* play) {
if (!this->hasSpawnedSeahorse) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_OT, this->actor.world.pos.x, this->actor.world.pos.y,
- this->actor.world.pos.z, 0, 0, 0, 0);
+ this->actor.world.pos.z, 0, 0, 0, SEAHORSE_PARAMS(SEAHORSE_TYPE_0, 0, 0));
this->hasSpawnedSeahorse = true;
}
}
diff --git a/src/overlays/actors/ovl_En_Takaraya/z_en_takaraya.c b/src/overlays/actors/ovl_En_Takaraya/z_en_takaraya.c
index 9bc0cd1b9..a2c39f16b 100644
--- a/src/overlays/actors/ovl_En_Takaraya/z_en_takaraya.c
+++ b/src/overlays/actors/ovl_En_Takaraya/z_en_takaraya.c
@@ -6,7 +6,7 @@
#include "z_en_takaraya.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((EnTakaraya*)thisx)
@@ -30,7 +30,7 @@ ActorInit En_Takaraya_InitVars = {
// static InitChainEntry sInitChain[] = {
static InitChainEntry D_80ADFB20[] = {
- ICHAIN_U8(targetMode, 6, ICHAIN_CONTINUE),
+ ICHAIN_U8(targetMode, TARGET_MODE_6, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 1000, ICHAIN_STOP),
};
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..832a1313e 100644
--- a/src/overlays/actors/ovl_En_Talk/z_en_talk.c
+++ b/src/overlays/actors/ovl_En_Talk/z_en_talk.c
@@ -6,7 +6,7 @@
#include "z_en_talk.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnTalk*)thisx)
@@ -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 >= TARGET_MODE_0) && (targetMode < TARGET_MODE_7)) {
this->actor.targetMode = targetMode;
}
@@ -56,9 +56,9 @@ void func_80BDE090(EnTalk* this, PlayState* play) {
return;
}
- if ((this->actor.xzDistToPlayer < 40.0f && Player_IsFacingActor(&this->actor, 0x3000, play)) ||
- this->actor.isTargeted) {
- func_800B8614(&this->actor, play, 120.0f);
+ if (((this->actor.xzDistToPlayer < 40.0f) && Player_IsFacingActor(&this->actor, 0x3000, play)) ||
+ this->actor.isLockedOn) {
+ Actor_OfferTalk(&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 a84059634..34ebe1d80 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
@@ -7,7 +7,7 @@
#include "z_en_talk_gibud.h"
#include "z64rumble.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_400)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_400)
#define THIS ((EnTalkGibud*)thisx)
@@ -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 = {
@@ -205,7 +205,7 @@ static EnTalkGibudRequestedItem sRequestedItemTable[] = {
{ PLAYER_IA_BOTTLE_SPRING_WATER, ITEM_SPRING_WATER, 1, true },
{ PLAYER_IA_BOTTLE_FISH, ITEM_FISH, 1, true },
{ PLAYER_IA_BOTTLE_BUG, ITEM_BUG, 1, true },
- { PLAYER_IA_NUT, ITEM_NUT, 10, false },
+ { PLAYER_IA_DEKU_NUT, ITEM_DEKU_NUT, 10, false },
{ PLAYER_IA_BOMB, ITEM_BOMB, 10, false },
{ PLAYER_IA_BOTTLE_HOT_SPRING_WATER, ITEM_HOT_SPRING_WATER, 1, true },
{ PLAYER_IA_BOTTLE_BIG_POE, ITEM_BIG_POE, 1, true },
@@ -228,7 +228,7 @@ void EnTalkGibud_Init(Actor* thisx, PlayState* play) {
s32 i;
Actor_ProcessInitChain(&this->actor, sInitChain);
- this->actor.targetMode = 0;
+ this->actor.targetMode = TARGET_MODE_0;
this->actor.hintId = TATL_HINT_ID_GIBDO;
this->actor.textId = 0;
@@ -248,12 +248,12 @@ void EnTalkGibud_Init(Actor* thisx, PlayState* play) {
this->isTalking = false;
this->type = EN_TALK_GIBUD_TYPE_GIBDO;
this->requestedItemIndex = EN_TALK_GIBUD_REQUESTED_ITEM_INDEX(thisx);
- this->switchFlag = EN_TALK_GIBUD_SWITCH_FLAG(thisx);
+ this->switchFlag = EN_TALK_GIBUD_GET_SWITCH_FLAG(thisx);
this->drawDmgEffAlpha = 0.0f;
this->drawDmgEffScale = 0.0f;
- for (i = 0; i < ARRAY_COUNT(this->limbPos); i++) {
- this->limbPos[i] = gZeroVec3f;
+ for (i = 0; i < EN_TALK_GIBUD_BODYPART_MAX; i++) {
+ this->bodyPartsPos[i] = gZeroVec3f;
}
if (this->requestedItemIndex < EN_TALK_GIBUD_REQUESTED_ITEM_INDEX_BLUE_POTION) {
@@ -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);
}
@@ -313,7 +313,7 @@ void EnTalkGibud_AttemptPlayerFreeze(EnTalkGibud* this, PlayState* play) {
player->actor.freezeTimer = 60;
Rumble_Request(this->actor.xzDistToPlayer, 255, 20, 150);
func_80123E90(play, &this->actor);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_AIM);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_AIM);
EnTalkGibud_SetupWalkToPlayer(this);
}
@@ -322,7 +322,7 @@ void EnTalkGibud_AttemptPlayerFreeze(EnTalkGibud* this, PlayState* play) {
void EnTalkGibud_SetupWalkToPlayer(EnTalkGibud* this) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_TALK_GIBUD_ANIM_WALK);
- this->actor.speedXZ = 0.4f;
+ this->actor.speed = 0.4f;
if (this->actionFunc == EnTalkGibud_AttemptPlayerFreeze) {
this->playerStunWaitTimer = 80;
@@ -345,7 +345,7 @@ 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 ((GET_PLAYER_FORM == PLAYER_FORM_GORON) || (GET_PLAYER_FORM == 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);
@@ -358,7 +358,7 @@ void EnTalkGibud_WalkToPlayer(EnTalkGibud* this, PlayState* play) {
this->playerStunWaitTimer = 60;
Rumble_Request(this->actor.xzDistToPlayer, 255, 20, 150);
func_80123E90(play, &this->actor);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_AIM);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_AIM);
} else {
this->playerStunWaitTimer--;
}
@@ -374,25 +374,24 @@ void EnTalkGibud_WalkToPlayer(EnTalkGibud* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, 10.0f) || Animation_OnFrame(&this->skelAnime, 22.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_RIZA_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_RIZA_WALK);
} else if (!(play->gameplayFrames & 95)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_CRY);
}
}
void EnTalkGibud_SetupGrab(EnTalkGibud* this) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_TALK_GIBUD_ANIM_GRAB_START);
this->grabDamageTimer = 0;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->grabState = EN_TALK_GIBUD_GRAB_START;
this->actionFunc = EnTalkGibud_Grab;
}
void EnTalkGibud_Grab(EnTalkGibud* this, PlayState* play) {
- Player* player2 = GET_PLAYER(play);
- Player* player = player2;
+ Actor* playerActor = &GET_PLAYER(play)->actor;
+ Player* player = (Player*)playerActor;
s32 inPositionToAttack;
- u16 damageSfxId;
switch (this->grabState) {
case EN_TALK_GIBUD_GRAB_START:
@@ -405,11 +404,10 @@ void EnTalkGibud_Grab(EnTalkGibud* this, PlayState* play) {
case EN_TALK_GIBUD_GRAB_ATTACK:
if (this->grabDamageTimer == 20) {
- s16 requiredScopeTemp;
+ u16 damageSfxId = player->ageProperties->voiceSfxIdOffset + NA_SE_VO_LI_DAMAGE_S;
- damageSfxId = player->ageProperties->voiceSfxIdOffset + NA_SE_VO_LI_DAMAGE_S;
play->damagePlayer(play, -8);
- func_800B8E58(player, damageSfxId);
+ Player_PlaySfx(player, damageSfxId);
Rumble_Request(this->actor.xzDistToPlayer, 240, 1, 12);
this->grabDamageTimer = 0;
} else {
@@ -417,17 +415,17 @@ void EnTalkGibud_Grab(EnTalkGibud* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, 0.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_ATTACK);
}
if (!(player->stateFlags2 & PLAYER_STATE2_80) || (player->unk_B62 != 0)) {
if ((player->unk_B62 != 0) && (player->stateFlags2 & PLAYER_STATE2_80)) {
player->stateFlags2 &= ~PLAYER_STATE2_80;
- player->unk_AE8 = 100;
+ player->actionVar2 = 100;
}
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_TALK_GIBUD_ANIM_GRAB_END);
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->grabState = EN_TALK_GIBUD_GRAB_RELEASE;
this->grabDamageTimer = 0;
}
@@ -442,19 +440,22 @@ void EnTalkGibud_Grab(EnTalkGibud* this, PlayState* play) {
Math_SmoothStepToF(&this->actor.shape.yOffset, 0.0f, 1.0f, 400.0f, 0.0f);
}
break;
+
+ default:
+ break;
}
}
void EnTalkGibud_SetupGrabFail(EnTalkGibud* this) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_TALK_GIBUD_ANIM_DAMAGE);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_DAMAGE);
- this->actor.speedXZ = -2.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_DAMAGE);
+ this->actor.speed = -2.0f;
this->actionFunc = EnTalkGibud_GrabFail;
}
void EnTalkGibud_GrabFail(EnTalkGibud* this, PlayState* play) {
- if (this->actor.speedXZ < 0.0f) {
- this->actor.speedXZ += 0.15f;
+ if (this->actor.speed < 0.0f) {
+ this->actor.speed += 0.15f;
}
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
@@ -487,18 +488,18 @@ void EnTalkGibud_TurnAwayAndShakeHead(EnTalkGibud* this, PlayState* play) {
void EnTalkGibud_SetupWalkToHome(EnTalkGibud* this) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_TALK_GIBUD_ANIM_WALK);
- this->actor.speedXZ = 0.4f;
+ this->actor.speed = 0.4f;
this->actionFunc = EnTalkGibud_WalkToHome;
}
void EnTalkGibud_WalkToHome(EnTalkGibud* this, PlayState* play) {
Math_SmoothStepToS(&this->headRotation.y, 0, 1, 100, 0);
Math_SmoothStepToS(&this->upperBodyRotation.y, 0, 1, 100, 0);
- if (Actor_XZDistanceToPoint(&this->actor, &this->actor.home.pos) < 5.0f) {
- if (this->actor.speedXZ > 0.2f) {
- this->actor.speedXZ -= 0.2f;
+ if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) < 5.0f) {
+ if (this->actor.speed > 0.2f) {
+ this->actor.speed -= 0.2f;
} else {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.home.rot.y, 1, 200, 10);
@@ -507,11 +508,12 @@ void EnTalkGibud_WalkToHome(EnTalkGibud* this, PlayState* play) {
EnTalkGibud_SetupIdle(this);
}
} else {
- Math_ScaledStepToS(&this->actor.shape.rot.y, Actor_YawToPoint(&this->actor, &this->actor.home.pos), 450);
+ Math_ScaledStepToS(&this->actor.shape.rot.y, Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos),
+ 450);
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 ((GET_PLAYER_FORM != PLAYER_FORM_GORON) && (GET_PLAYER_FORM != PLAYER_FORM_DEKU) &&
Actor_IsFacingPlayer(&this->actor, 0x38E3)) {
EnTalkGibud_SetupWalkToPlayer(this);
}
@@ -520,13 +522,13 @@ void EnTalkGibud_WalkToHome(EnTalkGibud* this, PlayState* play) {
void EnTalkGibud_SetupStunned(EnTalkGibud* this) {
this->stunTimer = 10;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
if (this->drawDmgEffTimer != 0) {
- Actor_SetColorFilter(&this->actor, 0, 0xC8, 0, 0x28);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 200, COLORFILTER_BUFFLAG_OPA, 40);
} else {
- Actor_SetColorFilter(&this->actor, 0, 0xC8, 0, 0x28);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 200, COLORFILTER_BUFFLAG_OPA, 40);
}
this->actionFunc = EnTalkGibud_Stunned;
@@ -548,17 +550,17 @@ void EnTalkGibud_Stunned(EnTalkGibud* this, PlayState* play) {
void EnTalkGibud_SetupDamage(EnTalkGibud* this) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_TALK_GIBUD_ANIM_DAMAGE);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_DAMAGE);
this->stunTimer = 0;
this->grabWaitTimer = 0;
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
- this->actor.speedXZ = -2.0f;
+ this->actor.speed = -2.0f;
this->actionFunc = EnTalkGibud_Damage;
}
void EnTalkGibud_Damage(EnTalkGibud* this, PlayState* play) {
- if (this->actor.speedXZ < 0.0f) {
- this->actor.speedXZ += 0.15f;
+ if (this->actor.speed < 0.0f) {
+ this->actor.speed += 0.15f;
}
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
@@ -567,8 +569,8 @@ void EnTalkGibud_Damage(EnTalkGibud* this, PlayState* play) {
if ((this->drawDmgEffTimer > 0) && (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FIRE) &&
(this->type == EN_TALK_GIBUD_TYPE_GIBDO)) {
this->actor.hintId = TATL_HINT_ID_REDEAD;
- this->actor.flags &= ~(ACTOR_FLAG_8 | ACTOR_FLAG_1);
- this->actor.flags |= (ACTOR_FLAG_4 | ACTOR_FLAG_1);
+ this->actor.flags &= ~(ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_TARGETABLE);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY);
SkelAnime_InitFlex(play, &this->skelAnime, &gRedeadSkel, NULL, this->jointTable, this->morphTable,
GIBDO_LIMB_MAX);
this->type = EN_TALK_GIBUD_TYPE_REDEAD;
@@ -584,8 +586,8 @@ void EnTalkGibud_Damage(EnTalkGibud* this, PlayState* play) {
void EnTalkGibud_SetupDead(EnTalkGibud* this) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_TALK_GIBUD_ANIM_DEATH);
- this->actor.flags &= ~ACTOR_FLAG_1;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_DEAD);
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_DEAD);
this->deathTimer = 0;
this->actionFunc = EnTalkGibud_Dead;
}
@@ -610,8 +612,8 @@ void EnTalkGibud_Dead(EnTalkGibud* this, PlayState* play) {
void EnTalkGibud_SetupRevive(EnTalkGibud* this) {
Animation_Change(&this->skelAnime, &gGibdoRedeadDeathAnim, -1.0f, Animation_GetLastFrame(&gGibdoRedeadDeathAnim),
0.0f, ANIMMODE_ONCE, -8.0f);
- this->actor.flags |= ACTOR_FLAG_1;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_REVERSE);
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_REVERSE);
this->deathTimer = 0;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = EnTalkGibud_Revive;
@@ -675,6 +677,9 @@ void EnTalkGibud_GetTextIdForRequestedItem(EnTalkGibud* this, PlayState* play) {
Message_StartTextbox(play, 0x1395, &this->actor);
this->textId = 0x1395;
break;
+
+ default:
+ break;
}
}
@@ -699,6 +704,9 @@ void EnTalkGibud_GetNextTextBoxId(EnTalkGibud* this, PlayState* play) {
Message_StartTextbox(play, 0xFF, &this->actor);
this->textId = 0xFF;
break;
+
+ default:
+ break;
}
}
}
@@ -751,7 +759,7 @@ void EnTalkGibud_CheckPresentedItem(EnTalkGibud* this, PlayState* play) {
default:
break;
}
- func_801477B4(play);
+ Message_CloseTextbox(play);
} else if (this->itemAction <= PLAYER_IA_MINUS1) {
Message_StartTextbox(play, 0x1389, &this->actor);
this->textId = 0x1389;
@@ -776,11 +784,11 @@ void EnTalkGibud_PassiveIdle(EnTalkGibud* this, PlayState* play) {
this->isTalking = true;
Message_StartTextbox(play, 0x1388, &this->actor);
this->textId = 0x1388;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_REDEAD_AIM);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_AIM);
EnTalkGibud_SetupTalk(this);
} else if (this->actor.xzDistToPlayer < 100.0f && !(this->collider.base.acFlags & AC_HIT)) {
Actor_TrackPlayer(play, &this->actor, &this->headRotation, &this->upperBodyRotation, this->actor.focus.pos);
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
} else {
Math_SmoothStepToS(&this->headRotation.y, 0, 1, 100, 0);
Math_SmoothStepToS(&this->upperBodyRotation.y, 0, 1, 100, 0);
@@ -823,7 +831,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;
@@ -844,7 +852,7 @@ void EnTalkGibud_Talk(EnTalkGibud* this, PlayState* play) {
void EnTalkGibud_SetupDisappear(EnTalkGibud* this) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_TALK_GIBUD_ANIM_IDLE);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->disappearanceTimer = 40;
this->actionFunc = EnTalkGibud_Disappear;
}
@@ -868,7 +876,7 @@ void EnTalkGibud_Disappear(EnTalkGibud* this, PlayState* play) {
velocity.z += Rand_Centered() * 1.5f;
func_800B3030(play, &pos, &velocity, &accel, 100, 0, 1);
}
- func_800B9010(&this->actor, NA_SE_EN_COMMON_EXTINCT_LEV - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_COMMON_EXTINCT_LEV - SFX_FLAG);
player->stateFlags1 |= PLAYER_STATE1_20000000;
this->disappearanceTimer--;
} else {
@@ -895,7 +903,7 @@ void EnTalkGibud_FacePlayerWhenTalking(EnTalkGibud* this, PlayState* play) {
s32 EnTalkGibud_PlayerInRangeWithCorrectState(EnTalkGibud* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if ((Actor_DistanceToPoint(&player->actor, &this->actor.home.pos) < 150.0f) &&
+ if ((Actor_WorldDistXYZToPoint(&player->actor, &this->actor.home.pos) < 150.0f) &&
!(player->stateFlags1 & (PLAYER_STATE1_80 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000 | PLAYER_STATE1_40000 |
PLAYER_STATE1_80000 | PLAYER_STATE1_200000)) &&
!(player->stateFlags2 & (PLAYER_STATE2_80 | PLAYER_STATE2_4000))) {
@@ -913,7 +921,7 @@ s32 EnTalkGibud_PlayerInRangeWithCorrectState(EnTalkGibud* this, PlayState* play
s32 EnTalkGibud_PlayerOutOfRange(EnTalkGibud* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (Actor_DistanceToPoint(&player->actor, &this->actor.home.pos) >= 150.0f) {
+ if (Actor_WorldDistXYZToPoint(&player->actor, &this->actor.home.pos) >= 150.0f) {
return true;
}
@@ -926,15 +934,15 @@ void EnTalkGibud_CheckForGibdoMask(EnTalkGibud* this, PlayState* play) {
(this->actionFunc != EnTalkGibud_Damage) && (this->actionFunc != EnTalkGibud_Talk)) {
if (this->actionFunc != EnTalkGibud_PassiveIdle) {
if (Player_GetMask(play) == PLAYER_MASK_GIBDO) {
- this->actor.flags &= ~(ACTOR_FLAG_4 | ACTOR_FLAG_1);
- this->actor.flags |= (ACTOR_FLAG_8 | ACTOR_FLAG_1);
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY);
+ this->actor.flags |= (ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_TARGETABLE);
this->actor.hintId = TATL_HINT_ID_NONE;
this->actor.textId = 0;
EnTalkGibud_SetupPassiveIdle(this);
}
} else if (Player_GetMask(play) != PLAYER_MASK_GIBDO) {
- this->actor.flags &= ~(ACTOR_FLAG_8 | ACTOR_FLAG_1);
- this->actor.flags |= (ACTOR_FLAG_4 | ACTOR_FLAG_1);
+ this->actor.flags &= ~(ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_TARGETABLE);
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY);
if (this->type == EN_TALK_GIBUD_TYPE_REDEAD) {
this->actor.hintId = TATL_HINT_ID_REDEAD;
} else {
@@ -983,7 +991,7 @@ s32 EnTalkGibud_MoveToIdealGrabPositionAndRotation(EnTalkGibud* this, PlayState*
distanceFromTargetPos = Math_Vec3f_StepTo(&this->actor.world.pos, &targetPos, 10.0f);
distanceFromTargetAngle = Math_SmoothStepToS(&this->actor.shape.rot.y, player->actor.shape.rot.y, 1, 0x1770, 0x64);
this->actor.world.rot.y = this->actor.shape.rot.y;
- if (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_HUMAN) {
distanceFromTargetYOffset = Math_SmoothStepToF(&this->actor.shape.yOffset, -1500.0f, 1.0f, 150.0f, 0.0f);
}
@@ -1017,7 +1025,7 @@ void EnTalkGibud_UpdateDamage(EnTalkGibud* this, PlayState* play) {
switch (this->actor.colChkInfo.damageEffect) {
case EN_TALK_GIBUD_DMGEFF_DAMAGE:
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
if (player->unk_ADC != 0) {
this->unk_3F7 = player->unk_ADD;
}
@@ -1038,7 +1046,7 @@ void EnTalkGibud_UpdateDamage(EnTalkGibud* this, PlayState* play) {
break;
case EN_TALK_GIBUD_DMGEFF_FIRE_ARROW:
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
if (this->actor.colChkInfo.health == 0) {
EnTalkGibud_SetupDead(this);
} else {
@@ -1050,7 +1058,7 @@ void EnTalkGibud_UpdateDamage(EnTalkGibud* this, PlayState* play) {
break;
case EN_TALK_GIBUD_DMGEFF_LIGHT_ARROW:
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
if (this->actor.colChkInfo.health == 0) {
EnTalkGibud_SetupDead(this);
} else {
@@ -1062,8 +1070,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;
@@ -1072,10 +1080,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;
}
}
}
@@ -1110,9 +1121,11 @@ 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 &&
- (this->actor.bgCheckFlags & 8)) {
+ 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);
targetPos.z += 10.0f * Math_CosS(this->actor.wallYaw);
@@ -1175,8 +1188,8 @@ void EnTalkGibud_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s
(limbIndex == GIBDO_LIMB_LEFT_FOREARM) || (limbIndex == GIBDO_LIMB_LEFT_HAND) ||
(limbIndex == GIBDO_LIMB_RIGHT_SHOULDER_AND_UPPER_ARM) || (limbIndex == GIBDO_LIMB_RIGHT_FOREARM) ||
(limbIndex == GIBDO_LIMB_RIGHT_HAND) || (limbIndex == GIBDO_LIMB_HEAD) || (limbIndex == GIBDO_LIMB_PELVIS))) {
- Matrix_MultZero(&this->limbPos[this->limbIndex]);
- this->limbIndex++;
+ Matrix_MultZero(&this->bodyPartsPos[this->bodyPartIndex]);
+ this->bodyPartIndex++;
}
}
@@ -1185,9 +1198,9 @@ void EnTalkGibud_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- this->limbIndex = 0;
+ this->bodyPartIndex = 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);
@@ -1196,7 +1209,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);
@@ -1207,8 +1220,8 @@ void EnTalkGibud_Draw(Actor* thisx, PlayState* play) {
}
if (this->drawDmgEffTimer > 0) {
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), this->drawDmgEffScale,
- 0.5f, this->drawDmgEffAlpha, this->drawDmgEffType);
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, EN_TALK_GIBUD_BODYPART_MAX,
+ this->drawDmgEffScale, 0.5f, this->drawDmgEffAlpha, this->drawDmgEffType);
}
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_En_Talk_Gibud/z_en_talk_gibud.h b/src/overlays/actors/ovl_En_Talk_Gibud/z_en_talk_gibud.h
index d887b1c0d..06ccd3914 100644
--- a/src/overlays/actors/ovl_En_Talk_Gibud/z_en_talk_gibud.h
+++ b/src/overlays/actors/ovl_En_Talk_Gibud/z_en_talk_gibud.h
@@ -5,19 +5,38 @@
#include "objects/object_rd/object_rd.h"
#define EN_TALK_GIBUD_REQUESTED_ITEM_INDEX(thisx) ((thisx)->params & 0xF)
-#define EN_TALK_GIBUD_SWITCH_FLAG(thisx) (((thisx)->params & 0xFF0) >> 4)
+#define EN_TALK_GIBUD_GET_SWITCH_FLAG(thisx) (((thisx)->params & 0xFF0) >> 4)
struct EnTalkGibud;
typedef void (*EnTalkGibudActionFunc)(struct EnTalkGibud*, PlayState*);
+typedef enum EnTalkGibudBodyPart {
+ /* 0 */ EN_TALK_GIBUD_BODYPART_0,
+ /* 1 */ EN_TALK_GIBUD_BODYPART_1,
+ /* 2 */ EN_TALK_GIBUD_BODYPART_2,
+ /* 3 */ EN_TALK_GIBUD_BODYPART_3,
+ /* 4 */ EN_TALK_GIBUD_BODYPART_4,
+ /* 5 */ EN_TALK_GIBUD_BODYPART_5,
+ /* 6 */ EN_TALK_GIBUD_BODYPART_6,
+ /* 7 */ EN_TALK_GIBUD_BODYPART_7,
+ /* 8 */ EN_TALK_GIBUD_BODYPART_8,
+ /* 9 */ EN_TALK_GIBUD_BODYPART_9,
+ /* 10 */ EN_TALK_GIBUD_BODYPART_10,
+ /* 11 */ EN_TALK_GIBUD_BODYPART_11,
+ /* 12 */ EN_TALK_GIBUD_BODYPART_12,
+ /* 13 */ EN_TALK_GIBUD_BODYPART_13,
+ /* 14 */ EN_TALK_GIBUD_BODYPART_14,
+ /* 15 */ EN_TALK_GIBUD_BODYPART_MAX
+} EnTalkGibudBodyPart;
+
typedef struct EnTalkGibud {
/* 0x000 */ Actor actor;
/* 0x144 */ ColliderCylinder collider;
/* 0x190 */ SkelAnime skelAnime;
/* 0x1D4 */ EnTalkGibudActionFunc actionFunc;
- /* 0x1D8 */ Vec3f limbPos[15];
- /* 0x28C */ s32 limbIndex;
+ /* 0x1D8 */ Vec3f bodyPartsPos[EN_TALK_GIBUD_BODYPART_MAX];
+ /* 0x28C */ s32 bodyPartIndex;
/* 0x290 */ s32 requestedItemIndex;
/* 0x294 */ PlayerItemAction itemAction;
/* 0x298 */ s32 switchFlag;
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..876b433d4 100644
--- a/src/overlays/actors/ovl_En_Tanron1/z_en_tanron1.c
+++ b/src/overlays/actors/ovl_En_Tanron1/z_en_tanron1.c
@@ -6,7 +6,7 @@
#include "z_en_tanron1.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((EnTanron1*)thisx)
@@ -30,14 +30,14 @@ ActorInit En_Tanron1_InitVars = {
(ActorFunc)EnTanron1_Draw,
};
-static u64 sPad = { 0 };
+static s32 sPad = 0;
#include "overlays/ovl_En_Tanron1/ovl_En_Tanron1.c"
void EnTanron1_Init(Actor* thisx, PlayState* play) {
EnTanron1* this = THIS;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
if (!ENTANRON1_GET_100(&this->actor)) {
this->unk_144 = 0;
} else {
@@ -149,7 +149,7 @@ void EnTanron1_Update(Actor* thisx, PlayState* play) {
break;
}
- if ((player->heldItemAction == PLAYER_IA_STICK) && (player->unk_B28 != 0)) {
+ if ((player->heldItemAction == PLAYER_IA_DEKU_STICK) && (player->unk_B28 != 0)) {
this->unk_14C.x = player->meleeWeaponInfo[0].tip.x;
this->unk_14C.y = player->meleeWeaponInfo[0].tip.y;
this->unk_14C.z = player->meleeWeaponInfo[0].tip.z;
@@ -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;
@@ -354,9 +354,9 @@ void func_80BB5318(EnTanron1* this, PlayState* play) {
if (spB4 != NULL) {
SkinMatrix_Vec3fMtxFMultXYZW(&play->viewProjectionMtxF, spB4, &this->unk_3360, &spB0);
if (spB8 >= (s16)(KREG(39) + 20)) {
- Audio_PlaySfxAtPos(&this->unk_3360, NA_SE_EN_MB_MOTH_DEAD);
+ Audio_PlaySfx_AtPos(&this->unk_3360, NA_SE_EN_MB_MOTH_DEAD);
} else if (spBA >= 20) {
- Audio_PlaySfxAtPos(&this->unk_3360, NA_SE_EN_MB_MOTH_FLY - SFX_FLAG);
+ Audio_PlaySfx_AtPos(&this->unk_3360, NA_SE_EN_MB_MOTH_FLY - SFX_FLAG);
}
}
}
@@ -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 332560403..a539e82f5 100644
--- a/src/overlays/actors/ovl_En_Tanron2/z_en_tanron2.c
+++ b/src/overlays/actors/ovl_En_Tanron2/z_en_tanron2.c
@@ -9,7 +9,7 @@
#include "objects/gameplay_keep/gameplay_keep.h"
#include "objects/object_boss04/object_boss04.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((EnTanron2*)thisx)
@@ -124,7 +124,7 @@ void EnTanron2_Init(Actor* thisx, PlayState* play) {
EnTanron2* this = THIS;
D_80BB8450 = (Boss04*)this->actor.parent;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
if (this->actor.params == 100) {
this->actor.update = func_80BB7B90;
@@ -138,7 +138,7 @@ void EnTanron2_Init(Actor* thisx, PlayState* play) {
this->actor.draw = NULL;
this->actor.colChkInfo.health = 1;
this->actor.colChkInfo.damageTable = &sDamageTable;
- this->actor.targetMode = 5;
+ this->actor.targetMode = TARGET_MODE_5;
Collider_InitAndSetCylinder(play, &this->collider1, &this->actor, &sCylinderInit1);
Collider_InitAndSetCylinder(play, &this->collider2, &this->actor, &sCylinderInit2);
@@ -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);
}
@@ -188,7 +188,7 @@ void func_80BB69FC(EnTanron2* this, PlayState* play) {
if ((this->unk_158 == 0) && ((sp34 + sp30 + sp2C) < 2.0f)) {
this->unk_158 = 1;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_B_SLIME_EAT);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_B_SLIME_EAT);
}
Math_ApproachF(&this->unk_15C, 1.0f, 1.0f, 0.02f);
@@ -201,13 +201,13 @@ void func_80BB69FC(EnTanron2* this, PlayState* play) {
void func_80BB6B80(EnTanron2* this) {
this->actionFunc = func_80BB6BD8;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.velocity.z = 0.0f;
this->actor.velocity.y = 0.0f;
this->actor.velocity.x = 0.0f;
this->unk_158 = 0;
this->unk_159 = 1;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->collider1.dim.radius = 30;
this->collider1.dim.height = 50;
this->collider1.dim.yShift = -25;
@@ -228,7 +228,7 @@ void func_80BB6BD8(EnTanron2* this, PlayState* play) {
if (this->actor.world.pos.y <= this->actor.floorHeight) {
this->actor.world.pos.y = this->actor.floorHeight;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_IKURA_JUMP2);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_IKURA_JUMP2);
sp2C = D_80BB8450->unk_6BC.x - this->actor.world.pos.x;
sp28 = D_80BB8450->unk_6BC.z - this->actor.world.pos.z;
@@ -236,18 +236,18 @@ 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);
}
- this->actor.speedXZ = Rand_ZeroFloat(5.0f) + 5.0f;
+ this->actor.speed = Rand_ZeroFloat(5.0f) + 5.0f;
break;
case 1:
sp32 = Math_Atan2S(sp2C, sp28);
- this->actor.speedXZ += 2.0f;
- if (this->actor.speedXZ > 10.0f) {
- this->actor.speedXZ = 10.0f;
+ this->actor.speed += 2.0f;
+ if (this->actor.speed > 10.0f) {
+ this->actor.speed = 10.0f;
}
break;
@@ -255,14 +255,14 @@ void func_80BB6BD8(EnTanron2* this, PlayState* play) {
sp32 = Math_Atan2S(player->actor.world.pos.x - this->actor.world.pos.x,
player->actor.world.pos.z - this->actor.world.pos.z) +
(s16)Rand_ZeroFloat(20000.0f);
- this->actor.speedXZ = Rand_ZeroFloat(7.0f) + 7.0f;
+ this->actor.speed = Rand_ZeroFloat(7.0f) + 7.0f;
if ((this->unk_152 == 0) && (D_80BB8450->unk_1F6 == 0)) {
this->unk_158 = 1;
}
break;
}
Matrix_RotateYS(sp32, MTXMODE_NEW);
- Matrix_MultVecZ(this->actor.speedXZ, &this->actor.velocity);
+ Matrix_MultVecZ(this->actor.speed, &this->actor.velocity);
this->actor.velocity.y = Rand_ZeroFloat(5.0f) + 12.0f;
this->unk_14E = 5;
}
@@ -285,7 +285,7 @@ void func_80BB6BD8(EnTanron2* this, PlayState* play) {
func_80BB69C0(this);
} else {
this->unk_150 = 10;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_IKURA_JUMP1);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_IKURA_JUMP1);
}
}
}
@@ -318,9 +318,9 @@ void func_80BB6F78(EnTanron2* this, PlayState* play) {
if (this->actor.world.pos.y <= this->actor.floorHeight) {
this->actor.world.pos.y = this->actor.floorHeight;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_IKURA_JUMP2);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_IKURA_JUMP2);
if (D_80BB8450->unk_6F8 > 0.1f) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_OUT_OF_WATER_L);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_OUT_OF_WATER_L);
}
this->actor.velocity.y = Rand_ZeroFloat(5.0f) + 12.0f;
this->unk_14E = 5;
@@ -344,7 +344,7 @@ void func_80BB6F78(EnTanron2* this, PlayState* play) {
this->unk_159 = 0;
} else {
this->unk_150 = 0xA;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_IKURA_JUMP1);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_IKURA_JUMP1);
}
}
}
@@ -381,7 +381,7 @@ void func_80BB7398(EnTanron2* this, PlayState* play) {
Enemy_StartFinishingBlow(play, &this->actor);
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 30, NA_SE_EN_IKURA_DEAD);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_IKURA_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_IKURA_DAMAGE);
}
}
@@ -427,11 +427,11 @@ void func_80BB7578(EnTanron2* this, PlayState* play) {
if (acHitInfo->toucher.dmgFlags & 0x80) {
func_80BB6B80(this);
this->unk_158 = 1;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_IKURA_DAMAGE);
- if ((player->targetedActor != NULL) && (&this->actor != player->targetedActor)) {
- player->targetedActor = &this->actor;
- play->actorCtx.targetContext.arrowPointedActor = &this->actor;
- play->actorCtx.targetContext.targetedActor = &this->actor;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_IKURA_DAMAGE);
+ if ((player->lockOnActor != NULL) && (&this->actor != player->lockOnActor)) {
+ player->lockOnActor = &this->actor;
+ play->actorCtx.targetCtx.fairyActor = &this->actor;
+ play->actorCtx.targetCtx.lockOnActor = &this->actor;
}
} else {
this->unk_154 = 15;
@@ -448,7 +448,7 @@ void func_80BB7578(EnTanron2* this, PlayState* play) {
func_80BB7398(this, play);
}
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_IKURA_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_IKURA_DAMAGE);
goto block_18;
}
}
@@ -550,10 +550,10 @@ void EnTanron2_Update(Actor* thisx, PlayState* play) {
if (ABS_ALT(BINANG_SUB(D_80BB8450->actor.yawTowardsPlayer, atan)) > 0x3000) {
this->unk_159 = 0;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
} else {
this->unk_159 = 1;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}
}
}
@@ -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 0e7be15f3..2c7a9fd55 100644
--- a/src/overlays/actors/ovl_En_Tanron3/z_en_tanron3.c
+++ b/src/overlays/actors/ovl_En_Tanron3/z_en_tanron3.c
@@ -8,7 +8,7 @@
#include "overlays/actors/ovl_Boss_03/z_boss_03.h"
#include "objects/object_boss03/object_boss03.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((EnTanron3*)thisx)
@@ -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;
}
}
@@ -117,7 +117,7 @@ void EnTanron3_Init(Actor* thisx, PlayState* play) {
this->morphTable, GYORG_SMALL_FISH_LIMB_MAX);
Actor_SetScale(&this->actor, 0.02f);
EnTanron3_SetupLive(this, play);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->currentRotationAngle = Rand_ZeroFloat(500000.0f);
this->waterSurfaceYPos = 430.0f;
sGyorg = (Boss03*)this->actor.parent;
@@ -153,11 +153,11 @@ void EnTanron3_SetupLive(EnTanron3* this, PlayState* play) {
this->rotationStep = 0;
this->rotationScale = 5;
this->workTimer[WORK_TIMER_PICK_NEW_DEVIATION] = 50;
- this->actor.speedXZ = 5.0f;
+ 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 & 1) && 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,22 +204,23 @@ 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) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PIRANHA_ATTACK);
+ 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.speedXZ = 6.0f;
+ this->actor.speed = 6.0f;
} else {
this->nextRotationAngle = 0x1F40;
}
@@ -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.speedXZ > 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;
}
@@ -265,7 +266,7 @@ void EnTanron3_Live(EnTanron3* this, PlayState* play) {
Math_SmoothStepToS(&this->actor.world.rot.y, atanTemp, this->rotationScale, this->rotationStep, 0);
Math_ApproachS(&this->rotationStep, this->targetRotationStep, 1, 0x100);
- Math_ApproachF(&this->actor.speedXZ, this->targetSpeedXZ, 1.0f, this->speedMaxStep);
+ Math_ApproachF(&this->actor.speed, this->targetSpeedXZ, 1.0f, this->speedMaxStep);
Actor_MoveWithoutGravityReverse(&this->actor);
} else {
switch (this->isBeached) {
@@ -275,37 +276,38 @@ void EnTanron3_Live(EnTanron3* this, PlayState* play) {
this->targetPosWithDeviation.y = this->waterSurfaceYPos - 50.0f;
this->workTimer[WORK_TIMER_OUT_OF_WATER] = 25;
Math_ApproachS(&this->actor.world.rot.x, 0x3000, 5, 0xBD0);
- if (this->actor.bgCheckFlags & 8) {
- this->actor.speedXZ = 0.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
+ this->actor.speed = 0.0f;
if (this->actor.velocity.y > 0.0f) {
this->actor.velocity.y = -1.0f;
}
}
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
// Fish has touched land
this->isBeached = true;
}
break;
+
case true:
this->nextRotationAngle = 0x3A98;
this->actor.gravity = -1.5f;
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
// Fish is still touching land, so it's still beached. Randomly flop around
this->actor.velocity.y = Rand_ZeroFloat(5.0f) + 5.0f;
- this->actor.speedXZ = Rand_ZeroFloat(2.0f) + 2.0f;
+ 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;
@@ -346,8 +348,8 @@ void EnTanron3_SetupDie(EnTanron3* this, PlayState* play) {
this->actor.world.rot.x = Math_Atan2S_XY(sqrtf(SQ(xDistance) + SQ(zDistance)), -yDistance);
this->actor.world.rot.y = Math_Atan2S_XY(zDistance, xDistance);
this->workTimer[WORK_TIMER_DIE] = 6;
- this->actor.speedXZ = 10.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KONB_MINI_DEAD);
+ this->actor.speed = 10.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KONB_MINI_DEAD);
}
void EnTanron3_Die(EnTanron3* this, PlayState* play) {
@@ -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)) ||
@@ -413,7 +415,7 @@ void EnTanron3_Update(Actor* thisx, PlayState* play) {
splashPos.y = this->waterSurfaceYPos + 10.0f;
splashPos.z = this->actor.world.pos.z;
EffectSsGSplash_Spawn(play, &splashPos, NULL, NULL, 1, 500);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_OUT_OF_WATER);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_OUT_OF_WATER);
}
}
@@ -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 b53343931..ab190b38c 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,
@@ -48,10 +48,10 @@ void EnTanron4_Init(Actor* thisx, PlayState* play2) {
EnTanron4* this = THIS;
SkelAnime_InitFlex(play, &this->skelAnime, &gSeagullSkel, &gSeagullFlapAnim, this->jointTable, this->morphTable,
- OBJECT_TANRON4_LIMB_MAX);
+ SEAGULL_LIMB_RIGHT_WING_MAX);
- thisx->flags &= ~ACTOR_FLAG_1;
- thisx->speedXZ = 3.0f + KREG(48);
+ thisx->flags &= ~ACTOR_FLAG_TARGETABLE;
+ thisx->speed = 3.0f + KREG(48);
thisx->uncullZoneForward = 10000.0f + KREG(70);
this->randRollTimer = Rand_ZeroFloat(10.0f);
@@ -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;
@@ -139,8 +138,7 @@ void EnTanron4_FlyNearHome(EnTanron4* this, PlayState* play) {
switch (this->flyState) {
case SEAGULL_FLY_FLAP:
- if ((this->timers[SEAGULL_TIMER_FLY_STATE] == 0) &&
- (Animation_OnFrame(&this->skelAnime, 2.0f + KREG(42)))) {
+ if ((this->timers[SEAGULL_TIMER_FLY_STATE] == 0) && Animation_OnFrame(&this->skelAnime, 2.0f + KREG(42))) {
this->flyState = SEAGULL_FLY_GLIDE;
this->timers[SEAGULL_TIMER_FLY_STATE] = Rand_ZeroFloat(50.0f) + 50.0f;
Animation_MorphToLoop(&this->skelAnime, &gSeagullFlapAnim, -15.0f + KREG(43));
@@ -151,7 +149,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 +190,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;
@@ -218,8 +216,7 @@ void EnTanron4_FlyNearActor(EnTanron4* this, PlayState* play) {
switch (this->flyState) {
case SEAGULL_FLY_FLAP:
- if ((this->timers[SEAGULL_TIMER_FLY_STATE] == 0) &&
- (Animation_OnFrame(&this->skelAnime, 2.0f + KREG(42)))) {
+ if ((this->timers[SEAGULL_TIMER_FLY_STATE] == 0) && Animation_OnFrame(&this->skelAnime, 2.0f + KREG(42))) {
this->flyState = SEAGULL_FLY_GLIDE;
this->timers[SEAGULL_TIMER_FLY_STATE] = Rand_ZeroFloat(50.0f) + 50.0f;
Animation_MorphToLoop(&this->skelAnime, &gSeagullFlapAnim, -15.0f + KREG(43));
@@ -230,7 +227,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_Tanron4/z_en_tanron4.h b/src/overlays/actors/ovl_En_Tanron4/z_en_tanron4.h
index 36a48c91a..93183dda9 100644
--- a/src/overlays/actors/ovl_En_Tanron4/z_en_tanron4.h
+++ b/src/overlays/actors/ovl_En_Tanron4/z_en_tanron4.h
@@ -19,8 +19,8 @@ typedef struct EnTanron4 {
/* 0x15C */ s16 rollTarget;
/* 0x160 */ f32 timeInfluence;
/* 0x164 */ SkelAnime skelAnime;
- /* 0x1A8 */ Vec3s jointTable[OBJECT_TANRON4_LIMB_MAX];
- /* 0x1EA */ Vec3s morphTable[OBJECT_TANRON4_LIMB_MAX];
+ /* 0x1A8 */ Vec3s jointTable[SEAGULL_LIMB_RIGHT_WING_MAX];
+ /* 0x1EA */ Vec3s morphTable[SEAGULL_LIMB_RIGHT_WING_MAX];
/* 0x022C */ EnTanron4ActionFunc actionFunc;
} EnTanron4; // size = 0x230
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 c052c3309..3f8442dad 100644
--- a/src/overlays/actors/ovl_En_Tanron5/z_en_tanron5.c
+++ b/src/overlays/actors/ovl_En_Tanron5/z_en_tanron5.c
@@ -1,7 +1,23 @@
/*
* File: z_en_tanron5.c
* Overlay: ovl_En_Tanron5
- * Description: Destructible props in Twinmold's arena
+ * Description: Destructible ruins, fragments, and item drops in Twinmold's arena.
+ *
+ * This actor is responsible for three different interactive props in Twinmold's arena, all of which can be further
+ * divided into more categories. The main thing this actor handles are the destructible ruins placed around the arena,
+ * of which there are two kinds. There are pillars with Majora's Mask on them, and there are ruins in a roughly
+ * pyramidal shape. While both types of ruin behave in roughly the same way, how they implement this behavior can
+ * sometimes be quite different.
+ *
+ * When Twinmold or the player wearing the Giant's Mask hits one of these destructible ruins, various fragments
+ * of the ruin fly off from the point of impact. These fragments are handled by this actor as well. The fragments
+ * can be large or small, and the two sizes behave almost identically outside of two small differences. Large
+ * fragments can damage the player and sink into the sand once they hit the ground, whereas small fragments
+ * deal no damage and despawn upon touching the ground.
+ *
+ * Sometimes, item drops can also appear when a destructible ruin is hit; this actor is responsible for handling
+ * these drops too. There are drops that give the player 10 arrows, and drops that give the player a big magic
+ * jar, and these drops behave identically outside of what item they give when collected by the player.
*/
#include "z_en_tanron5.h"
@@ -18,10 +34,15 @@ void EnTanron5_Destroy(Actor* thisx, PlayState* play);
void EnTanron5_Update(Actor* thisx, PlayState* play2);
void EnTanron5_Draw(Actor* thisx, PlayState* play);
-void func_80BE5818(Actor* thisx, PlayState* play2);
-void func_80BE5C10(Actor* thisx, PlayState* play);
+void EnTanron5_RuinFragmentItemDrop_Update(Actor* thisx, PlayState* play2);
+void EnTanron5_ItemDrop_Draw(Actor* thisx, PlayState* play);
-s32 D_80BE5D80 = 0;
+typedef enum {
+ /* 0 */ TWINMOLD_PROP_ITEM_DROP_TYPE_10_ARROWS,
+ /* 1 */ TWINMOLD_PROP_ITEM_DROP_TYPE_MAGIC_JAR_BIG
+} TwinmoldPropItemDropType;
+
+s32 sFragmentAndItemDropCount = 0;
ActorInit En_Tanron5_InitVars = {
ACTOR_EN_TANRON5,
@@ -55,90 +76,136 @@ static ColliderCylinderInit sCylinderInit = {
{ 70, 450, 0, { 0, 0, 0 } },
};
-f32 D_80BE5DD0 = 1.0f;
+/**
+ * Multiplies the scale differently depending on whether the player is wearing the Giant's Mask or not.
+ * When the player is wearing the Giant's Mask, this value is smaller to make the player seem larger.
+ */
+static f32 sGiantModeScaleFactor = 1.0f;
-Vec2s D_80BE5DD4[] = {
- { 0x4B0, 0x9C4 }, { -0x4B0, 0x9C4 }, { 0x4B0, -0x9C4 }, { -0x4B0, -0x9C4 }, { 0x9C4, 0x4B0 },
- { -0x9C4, 0x4B0 }, { 0x9C4, -0x4B0 }, { -0x9C4, -0x4B0 }, { 0x3E8, 0x3E8 }, { -0x3E8, 0x3E8 },
- { 0x3E8, -0x3E8 }, { -0x3E8, -0x3E8 }, { 0x000, -0x3E8 }, { 0x000, 0x3E8 }, { 0x3E8, 0x000 },
- { -0x3E8, 0x000 }, { 0x000, -0x7D0 }, { 0x000, 0x7D0 }, { 0x7D0, 0x000 }, { -0x7D0, 0x000 },
+/**
+ * Stores the X and Z spawn positions for all of the ruins. Their Y spawn position is determined by the
+ * height of the floor, so there's no need to store it.
+ */
+static Vec2s sSpawnPosList[] = {
+ { 1200, 2500 }, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_1
+ { -1200, 2500 }, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_2
+ { 1200, -2500 }, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_3
+ { -1200, -2500 }, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_4
+ { 2500, 1200 }, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_5
+ { -2500, 1200 }, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_6
+ { 2500, -1200 }, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_7
+ { -2500, -1200 }, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_8
+ { 1000, 1000 }, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_9
+ { -1000, 1000 }, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_10
+ { 1000, -1000 }, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_11
+ { -1000, -1000 }, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_12
+ { 0, -1000 }, // TWINMOLD_PROP_TYPE_RUIN_PYRAMID_1
+ { 0, 1000 }, // TWINMOLD_PROP_TYPE_RUIN_PYRAMID_2
+ { 1000, 0 }, // TWINMOLD_PROP_TYPE_RUIN_PYRAMID_3
+ { -1000, 0 }, // TWINMOLD_PROP_TYPE_RUIN_PYRAMID_4
+ { 0, -2000 }, // TWINMOLD_PROP_TYPE_RUIN_PYRAMID_5
+ { 0, 2000 }, // TWINMOLD_PROP_TYPE_RUIN_PYRAMID_6
+ { 2000, 0 }, // TWINMOLD_PROP_TYPE_RUIN_PYRAMID_7
+ { -2000, 0 }, // TWINMOLD_PROP_TYPE_RUIN_PYRAMID_8
};
-Gfx* D_80BE5E24[] = {
- gTwinmoldMajoraPillarDL, gTwinmoldMajoraPillarDL, gTwinmoldMajoraPillarDL, gTwinmoldMajoraPillarDL,
- gTwinmoldMajoraPillarDL, gTwinmoldMajoraPillarDL, gTwinmoldMajoraPillarDL, gTwinmoldMajoraPillarDL,
- gTwinmoldMajoraPillarDL, gTwinmoldMajoraPillarDL, gTwinmoldMajoraPillarDL, gTwinmoldMajoraPillarDL,
- gTwinmoldPyramidRuinDL, gTwinmoldPyramidRuinDL, gTwinmoldPyramidRuinDL, gTwinmoldPyramidRuinDL,
- gTwinmoldPyramidRuinDL, gTwinmoldPyramidRuinDL, gTwinmoldPyramidRuinDL, gTwinmoldPyramidRuinDL,
+/**
+ * Display lists for all ruins.
+ */
+static Gfx* sDLists[] = {
+ gTwinmoldRuinPillarDL, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_1
+ gTwinmoldRuinPillarDL, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_2
+ gTwinmoldRuinPillarDL, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_3
+ gTwinmoldRuinPillarDL, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_4
+ gTwinmoldRuinPillarDL, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_5
+ gTwinmoldRuinPillarDL, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_6
+ gTwinmoldRuinPillarDL, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_7
+ gTwinmoldRuinPillarDL, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_8
+ gTwinmoldRuinPillarDL, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_9
+ gTwinmoldRuinPillarDL, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_10
+ gTwinmoldRuinPillarDL, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_11
+ gTwinmoldRuinPillarDL, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_12
+ gTwinmoldRuinPyramidDL, // TWINMOLD_PROP_TYPE_RUIN_PYRAMID_1
+ gTwinmoldRuinPyramidDL, // TWINMOLD_PROP_TYPE_RUIN_PYRAMID_2
+ gTwinmoldRuinPyramidDL, // TWINMOLD_PROP_TYPE_RUIN_PYRAMID_3
+ gTwinmoldRuinPyramidDL, // TWINMOLD_PROP_TYPE_RUIN_PYRAMID_4
+ gTwinmoldRuinPyramidDL, // TWINMOLD_PROP_TYPE_RUIN_PYRAMID_5
+ gTwinmoldRuinPyramidDL, // TWINMOLD_PROP_TYPE_RUIN_PYRAMID_6
+ gTwinmoldRuinPyramidDL, // TWINMOLD_PROP_TYPE_RUIN_PYRAMID_7
+ gTwinmoldRuinPyramidDL, // TWINMOLD_PROP_TYPE_RUIN_PYRAMID_8
};
-f32 D_80BE5E74[] = {
- 0.09f, 0.09f, 0.09f, 0.09f, 0.09f, 0.09f, 0.09f, 0.09f, 0.09f, 0.09f,
- 0.09f, 0.09f, 0.09f, 0.09f, 0.09f, 0.09f, 0.09f, 0.09f, 0.09f, 0.09f,
+/**
+ * The initial base scale for all ruins. In the final game, this array isn't very useful,
+ * since they're all the same value, but this could be used to make some ruins larger or
+ * smaller than the others.
+ */
+static f32 sBaseScales[] = {
+ 0.09f, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_1
+ 0.09f, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_2
+ 0.09f, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_3
+ 0.09f, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_4
+ 0.09f, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_5
+ 0.09f, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_6
+ 0.09f, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_7
+ 0.09f, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_8
+ 0.09f, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_9
+ 0.09f, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_10
+ 0.09f, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_11
+ 0.09f, // TWINMOLD_PROP_TYPE_RUIN_PILLAR_12
+ 0.09f, // TWINMOLD_PROP_TYPE_RUIN_PYRAMID_1
+ 0.09f, // TWINMOLD_PROP_TYPE_RUIN_PYRAMID_2
+ 0.09f, // TWINMOLD_PROP_TYPE_RUIN_PYRAMID_3
+ 0.09f, // TWINMOLD_PROP_TYPE_RUIN_PYRAMID_4
+ 0.09f, // TWINMOLD_PROP_TYPE_RUIN_PYRAMID_5
+ 0.09f, // TWINMOLD_PROP_TYPE_RUIN_PYRAMID_6
+ 0.09f, // TWINMOLD_PROP_TYPE_RUIN_PYRAMID_7
+ 0.09f, // TWINMOLD_PROP_TYPE_RUIN_PYRAMID_8
};
-typedef struct {
- /* 0x00 */ Vec3f unk_00;
- /* 0x0C */ f32 unk_0C;
- /* 0x10 */ f32 unk_10;
- /* 0x14 */ f32 unk_14;
- /* 0x18 */ Vec3f unk_18;
- /* 0x24 */ u8 unk_24;
- /* 0x26 */ s16 unk_26;
- /* 0x28 */ UNK_TYPE1 unk28[0x4];
- /* 0x2C */ s16 unk_2C;
- /* 0x2E */ UNK_TYPE1 unk2E[0x6];
- /* 0x34 */ f32 unk_34;
- /* 0x38 */ f32 unk_38;
-} EnTanron5Effect; // size = 0x3C
-
-void func_80BE4930(EnTanron5Effect* effect, Vec3f* arg1, f32 arg2) {
+/**
+ * Spawns the sand effect that appears when a ruin fragment hits the ground.
+ */
+void EnTanron5_SpawnEffectSand(TwinmoldEffect* effect, Vec3f* pos, f32 scale) {
s16 i;
- for (i = 0; i < 150; i++, effect++) {
- if (effect->unk_24 == 0) {
- effect->unk_24 = 1;
-
- effect->unk_00 = *arg1;
-
- effect->unk_0C = randPlusMinusPoint5Scaled(10.0f);
- effect->unk_10 = Rand_ZeroFloat(2.0f) + 3.0f;
- effect->unk_14 = randPlusMinusPoint5Scaled(10.0f);
-
- effect->unk_18.y = -0.15f;
- effect->unk_18.x = 0.0f;
- effect->unk_18.z = 0.0f;
-
- effect->unk_2C = Rand_ZeroFloat(100.0f) + 200.0f;
- effect->unk_26 = 0;
- effect->unk_34 = arg2;
- effect->unk_38 = 2.0f * arg2;
+ for (i = 0; i < TWINMOLD_EFFECT_COUNT; i++, effect++) {
+ if (effect->type == TWINMOLD_EFFECT_NONE) {
+ effect->type = TWINMOLD_EFFECT_SAND;
+ effect->pos = *pos;
+ effect->velocity.x = Rand_CenteredFloat(10.0f);
+ effect->velocity.y = Rand_ZeroFloat(2.0f) + 3.0f;
+ effect->velocity.z = Rand_CenteredFloat(10.0f);
+ effect->accel.y = -0.15f;
+ effect->accel.x = effect->accel.z = 0.0f;
+ effect->alpha = Rand_ZeroFloat(100.0f) + 200.0f;
+ effect->timer = 0;
+ effect->scale = scale;
+ effect->targetScale = 2.0f * scale;
break;
}
}
}
-void func_80BE4A2C(EnTanron5Effect* effect, Vec3f* arg1, f32 arg2) {
+/**
+ * Spawns the black dust that appears whenever part of a ruin is destroyed.
+ */
+void EnTanron5_SpawnEffectBlackDust(TwinmoldEffect* effect, Vec3f* pos, f32 scale) {
s16 i;
- for (i = 0; i < 150; i++, effect++) {
- if (effect->unk_24 == 0) {
- effect->unk_24 = 2;
-
- effect->unk_00 = *arg1;
-
- effect->unk_0C = randPlusMinusPoint5Scaled(30.0f);
- effect->unk_10 = Rand_ZeroFloat(7.0f);
- effect->unk_14 = randPlusMinusPoint5Scaled(30.0f);
-
- effect->unk_18.y = -0.3f;
- effect->unk_18.x = 0.0f;
- effect->unk_18.z = 0.0f;
-
- effect->unk_2C = Rand_ZeroFloat(70.0f) + 150.0f;
- effect->unk_26 = 0;
- effect->unk_34 = arg2;
- effect->unk_38 = 2.0f * arg2;
+ for (i = 0; i < TWINMOLD_EFFECT_COUNT; i++, effect++) {
+ if (effect->type == TWINMOLD_EFFECT_NONE) {
+ effect->type = TWINMOLD_EFFECT_BLACK_DUST;
+ effect->pos = *pos;
+ effect->velocity.x = Rand_CenteredFloat(30.0f);
+ effect->velocity.y = Rand_ZeroFloat(7.0f);
+ effect->velocity.z = Rand_CenteredFloat(30.0f);
+ effect->accel.y = -0.3f;
+ effect->accel.x = effect->accel.z = 0.0f;
+ effect->alpha = Rand_ZeroFloat(70.0f) + 150.0f;
+ effect->timer = 0;
+ effect->scale = scale;
+ effect->targetScale = 2.0f * scale;
break;
}
}
@@ -147,54 +214,60 @@ void func_80BE4A2C(EnTanron5Effect* effect, Vec3f* arg1, f32 arg2) {
void EnTanron5_Init(Actor* thisx, PlayState* play) {
EnTanron5* this = THIS;
- if (ENTANRON5_GET(&this->actor) >= ENTANRON5_100) {
- D_80BE5D80++;
- if (D_80BE5D80 > 60) {
+ if (TWINMOLD_PROP_GET_TYPE(&this->actor) >= TWINMOLD_PROP_TYPE_FRAGMENT_LARGE_1) {
+ // This is a ruin fragment or item drop; if there are more than 60 fragments or drops
+ // already spawned, immediately kill this one. Otherwise, set up the fragment or drop
+ // to fly off while spinning randomly.
+ sFragmentAndItemDropCount++;
+ if (sFragmentAndItemDropCount > 60) {
Actor_Kill(&this->actor);
return;
}
- this->unk_198 = randPlusMinusPoint5Scaled(0x2000);
- this->unk_19A = randPlusMinusPoint5Scaled(0x2000);
+ // fragmentAngularVelocityX is in a union with itemDropRotZ, so for item drops, this code
+ // will initialize its z-rotation to a random value.
+ this->fragmentAngularVelocityX = Rand_CenteredFloat(0x2000);
+ this->fragmentAngularVelocityY = Rand_CenteredFloat(0x2000);
- if (ENTANRON5_GET(&this->actor) < ENTANRON5_107) {
- Actor_SetScale(&this->actor, (Rand_ZeroFloat(0.025f) + 0.085f) * D_80BE5DD0);
+ if (TWINMOLD_PROP_GET_TYPE(&this->actor) <= TWINMOLD_PROP_TYPE_FRAGMENT_LARGE_7) {
+ Actor_SetScale(&this->actor, (Rand_ZeroFloat(0.025f) + 0.085f) * sGiantModeScaleFactor);
} else {
- Actor_SetScale(&this->actor, (Rand_ZeroFloat(0.015f) + 0.01f) * D_80BE5DD0);
+ Actor_SetScale(&this->actor, (Rand_ZeroFloat(0.015f) + 0.01f) * sGiantModeScaleFactor);
}
- this->actor.speedXZ = (Rand_ZeroFloat(10.0f) + 10.0f) * D_80BE5DD0;
- this->actor.velocity.y = (Rand_ZeroFloat(10.0f) + 15.0f) * D_80BE5DD0;
- this->actor.gravity = -2.5f * D_80BE5DD0;
- this->actor.terminalVelocity = -1000.0f * D_80BE5DD0;
- this->actor.update = func_80BE5818;
+ this->actor.speed = (Rand_ZeroFloat(10.0f) + 10.0f) * sGiantModeScaleFactor;
+ this->actor.velocity.y = (Rand_ZeroFloat(10.0f) + 15.0f) * sGiantModeScaleFactor;
+ this->actor.gravity = -2.5f * sGiantModeScaleFactor;
+ this->actor.terminalVelocity = -1000.0f * sGiantModeScaleFactor;
+ this->actor.update = EnTanron5_RuinFragmentItemDrop_Update;
- if (ENTANRON5_GET(&this->actor) >= ENTANRON5_110) {
- this->actor.draw = func_80BE5C10;
- this->unk_1A0 = Rand_ZeroFloat(1.999f);
- Actor_SetScale(&this->actor, D_80BE5DD0 * 0.03f);
- this->unk_144 = 250;
+ if (TWINMOLD_PROP_GET_TYPE(&this->actor) >= TWINMOLD_PROP_TYPE_ITEM_DROP_1) {
+ this->actor.draw = EnTanron5_ItemDrop_Draw;
+ this->itemDropType = Rand_ZeroFloat(1.999f);
+ Actor_SetScale(&this->actor, sGiantModeScaleFactor * 0.03f);
+ this->timer = 250;
this->actor.shape.rot.x = this->actor.shape.rot.y = this->actor.shape.rot.z = 0;
} else {
- this->unk_148 = gRuinFragmentDL;
- this->unk_144 = 150;
+ this->dList = gRuinFragmentDL;
+ this->timer = 150;
}
- } else if (ENTANRON5_GET(&this->actor) == ENTANRON5_0) {
+ } else if (TWINMOLD_PROP_GET_TYPE(&this->actor) == TWINMOLD_PROP_TYPE_STATIC) {
EnTanron5* child;
s32 i;
- for (i = 0; i < ARRAY_COUNT(D_80BE5E74); i++) {
- child =
- (EnTanron5*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_TANRON5, D_80BE5DD4[i].x,
- this->actor.world.pos.y, D_80BE5DD4[i].z, 0, Rand_ZeroFloat(0x10000), 0, i + 1);
+ // Spawns all of the ruins in the right places. Gets killed after everything is spawned.
+ for (i = 0; i < ARRAY_COUNT(sSpawnPosList); i++) {
+ child = (EnTanron5*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_TANRON5, sSpawnPosList[i].x,
+ this->actor.world.pos.y, sSpawnPosList[i].z, 0, Rand_ZeroFloat(0x10000), 0,
+ TWINMOLD_PROP_PARAMS(TWINMOLD_PROP_TYPE_RUIN_PILLAR_1 + i));
child->actor.parent = this->actor.parent;
- child->unk_19C = D_80BE5E74[i];
+ child->baseScale = sBaseScales[i];
- Actor_SetScale(&child->actor, child->unk_19C);
+ Actor_SetScale(&child->actor, child->baseScale);
- child->unk_148 = D_80BE5E24[i];
- if (child->unk_148 == gTwinmoldPyramidRuinDL) {
+ child->dList = sDLists[i];
+ if (child->dList == gTwinmoldRuinPyramidDL) {
child->actor.shape.rot.y = 0;
}
@@ -203,7 +276,9 @@ void EnTanron5_Init(Actor* thisx, PlayState* play) {
Actor_Kill(&this->actor);
} else {
- Actor_UpdateBgCheckInfo(play, &this->actor, 50.0f, 150.0f, 100.0f, 4);
+ // This is a ruin; update its y-position to be just below the floor, so it looks like it's
+ // buried in the sand.
+ Actor_UpdateBgCheckInfo(play, &this->actor, 50.0f, 150.0f, 100.0f, UPDBGCHECKINFO_FLAG_4);
this->actor.world.pos.y = this->actor.floorHeight + -20.0f;
}
}
@@ -211,25 +286,31 @@ void EnTanron5_Init(Actor* thisx, PlayState* play) {
void EnTanron5_Destroy(Actor* thisx, PlayState* play) {
EnTanron5* this = THIS;
- if (ENTANRON5_GET(&this->actor) >= ENTANRON5_100) {
- D_80BE5D80--;
+ if (TWINMOLD_PROP_GET_TYPE(&this->actor) >= TWINMOLD_PROP_TYPE_FRAGMENT_LARGE_1) {
+ sFragmentAndItemDropCount--;
}
}
+/**
+ * This is the update function for the destructible ruins (both the pillar and pyarmid ruins).
+ */
void EnTanron5_Update(Actor* thisx, PlayState* play2) {
PlayState* play = play2;
EnTanron5* this = THIS;
Boss02* boss02 = (Boss02*)this->actor.parent;
Player* player = GET_PLAYER(play2);
s32 i;
- s32 phi_v0;
- s32 spC4;
- Vec3f spB8;
+ s32 yawDiff;
+ s32 fragmentAndItemCount;
+ Vec3f pos;
- if (this->unk_1A0 >= 3) {
- this->unk_1A0++;
+ // When a ruin is destroyed (i.e., it is hit three times), it will reduce its scale to 0.0f (making
+ // it effectively invisible and intangible), then wait an additional 37 frames before actually
+ // calling Actor_Kill to despawn. The reason for this extra waiting period is unknown.
+ if (this->hitCount >= 3) {
+ this->hitCount++;
Actor_SetScale(&this->actor, 0.0f);
- if (this->unk_1A0 >= 40) {
+ if (this->hitCount >= 40) {
Actor_Kill(&this->actor);
}
return;
@@ -237,154 +318,184 @@ void EnTanron5_Update(Actor* thisx, PlayState* play2) {
// required
}
- if (this->unk_144 != 0) {
- this->unk_144--;
- }
+ DECR(this->timer);
+ //! @bug This code will keep sGiantModeScaleFactor up-to-date so long as at least one ruin is still active.
+ //! However, once the last ruin is destroyed, this code will no longer run, so sGiantModeScaleFactor will
+ //! get "stuck" at whatever its current value is. This is a problem, because other instances of EnTanron5,
+ //! like the item drops, rely on this variable being updated to function properly. Getting in this "stuck"
+ //! state can result in odd behavior for these other instances, like item drops not being obtainable when
+ //! the player is normal-sized.
+ //!
+ //! The strange waiting period before despawning seen above may be an attempt to mitigate this, but it
+ //! doesn't work. It doesn't update sGiantModeScaleFactor, and even if it did, waiting 37 frames before
+ //! despawning is far too short of a time to wait, since item drops take 250 frames to despawn.
if (boss02->actor.update != NULL) {
- D_80BE5DD0 = boss02->unk_01AC;
+ sGiantModeScaleFactor = boss02->giantModeScaleFactor;
} else {
- D_80BE5DD0 = 1.0f;
+ sGiantModeScaleFactor = 1.0f;
}
- Actor_SetScale(&this->actor, this->unk_19C * D_80BE5DD0);
+ Actor_SetScale(&this->actor, this->baseScale * sGiantModeScaleFactor);
- if (this->unk_148 == gTwinmoldMajoraPillarDL) {
- this->collider.dim.radius = 65.0f * D_80BE5DD0;
- this->collider.dim.height = 380.0f * D_80BE5DD0;
- } else if (this->unk_1A0 == 0) {
- this->collider.dim.radius = 85.0f * D_80BE5DD0;
- this->collider.dim.height = 200.0f * D_80BE5DD0;
- } else if (this->unk_1A0 == 1) {
- this->collider.dim.radius = 95.0f * D_80BE5DD0;
- this->collider.dim.height = 100.0f * D_80BE5DD0;
- } else if (this->unk_1A0 == 2) {
- this->collider.dim.radius = 95.0f * D_80BE5DD0;
- this->collider.dim.height = 30.0f * D_80BE5DD0;
+ if (this->dList == gTwinmoldRuinPillarDL) {
+ this->collider.dim.radius = 65.0f * sGiantModeScaleFactor;
+ this->collider.dim.height = 380.0f * sGiantModeScaleFactor;
+ } else if (this->hitCount == 0) {
+ this->collider.dim.radius = 85.0f * sGiantModeScaleFactor;
+ this->collider.dim.height = 200.0f * sGiantModeScaleFactor;
+ } else if (this->hitCount == 1) {
+ this->collider.dim.radius = 95.0f * sGiantModeScaleFactor;
+ this->collider.dim.height = 100.0f * sGiantModeScaleFactor;
+ } else if (this->hitCount == 2) {
+ this->collider.dim.radius = 95.0f * sGiantModeScaleFactor;
+ this->collider.dim.height = 30.0f * sGiantModeScaleFactor;
}
- if (this->unk_144 == 0) {
+ if (this->timer == 0) {
if (this->collider.base.acFlags & AC_HIT) {
ColliderInfo* acHitInfo = this->collider.info.acHitInfo;
Actor* ac = this->collider.base.ac;
this->collider.base.acFlags &= ~AC_HIT;
- spC4 = 10;
+ fragmentAndItemCount = 10;
if (Play_InCsMode(play)) {
- this->unk_144 = 1;
+ // In Twinmold's opening cutscene, it emerges from the sand beneath a ruin and destroys it.
+ // Setting the timer to 1 here allows Twinmold to hit the ruin every single frame during the
+ // cutscene, allowing it to destory the ruin in only 3 frames.
+ this->timer = 1;
} else {
- this->unk_144 = 5;
- spC4 = (s32)Rand_ZeroFloat(2.99f) + 10;
+ this->timer = 5;
+ fragmentAndItemCount = (s32)Rand_ZeroFloat(2.99f) + 10;
}
- if ((KREG(19) != 0) || ((acHitInfo->toucher.dmgFlags & 0x05000202) && (D_80BE5DD0 < 0.5f)) ||
+ if ((KREG(19) != 0) || ((acHitInfo->toucher.dmgFlags & 0x05000202) && (sGiantModeScaleFactor < 0.5f)) ||
(ac->id == ACTOR_BOSS_02)) {
- if (this->unk_148 == gTwinmoldMajoraPillarDL) {
- Math_Vec3f_Copy(&spB8, &this->actor.world.pos);
- spB8.y += D_80BE5DD0 * 300.0f;
+ if (this->dList == gTwinmoldRuinPillarDL) {
+ // To create the appearance of the pillar shrinking after being hit, push it further into the floor,
+ // spawn some ruin fragments, and also spawn some black dust effects.
+ Math_Vec3f_Copy(&pos, &this->actor.world.pos);
+ pos.y += sGiantModeScaleFactor * 300.0f;
- for (i = 3; i < spC4; i++) {
- Actor_Spawn(&play->actorCtx, play, ACTOR_EN_TANRON5, spB8.x, spB8.y, spB8.z,
- Rand_ZeroFloat(0x10000), Rand_ZeroFloat(0x10000), 0, i + 100);
+ // This will spawn four normal-sized ruin fragments, three small ruin fragments, and
+ // zero, one, or two item drops, depending on the result of Rand_ZeroFloat above.
+ for (i = 3; i < fragmentAndItemCount; i++) {
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_TANRON5, pos.x, pos.y, pos.z,
+ Rand_ZeroFloat(0x10000), Rand_ZeroFloat(0x10000), 0,
+ TWINMOLD_PROP_PARAMS(TWINMOLD_PROP_TYPE_FRAGMENT_LARGE_1 + i));
}
for (i = 0; i < 6; i++) {
- func_80BE4A2C(play->specialEffects, &spB8, Rand_ZeroFloat(3.0f) + 6.0f);
+ EnTanron5_SpawnEffectBlackDust(play->specialEffects, &pos, Rand_ZeroFloat(3.0f) + 6.0f);
}
- this->actor.world.pos.y -= D_80BE5DD0 * 130.0f;
+ this->actor.world.pos.y -= sGiantModeScaleFactor * 130.0f;
} else {
- f32 spAC;
- f32 spA8;
- Vec3f sp9C;
+ f32 yFactor;
+ f32 xzFactor;
+ Vec3f fragmentAndDustPos;
- if (this->unk_1A0 == 0) {
- spAC = 180.0f;
- this->unk_19C *= 1.4f;
- } else if (this->unk_1A0 == 1) {
- spAC = 230.0f;
- this->unk_19C *= 1.37f;
- } else if (this->unk_1A0 == 2) {
- spAC = 780.0f;
- this->unk_19C *= 1.5f;
+ // Check the number of times this pyramid ruin has been hit to scale it accordingly.
+ if (this->hitCount == 0) {
+ yFactor = 180.0f;
+ this->baseScale *= 1.4f;
+ } else if (this->hitCount == 1) {
+ yFactor = 230.0f;
+ this->baseScale *= 1.37f;
+ } else if (this->hitCount == 2) {
+ yFactor = 780.0f;
+ this->baseScale *= 1.5f;
}
- // TODO: determine if unk_1A0 ever has a different value from these 3, which will cause UB from spAC
- // being uninitialised
- this->actor.world.pos.y -= D_80BE5DD0 * spAC;
- Actor_SetScale(&this->actor, this->unk_19C * D_80BE5DD0);
- Math_Vec3f_Copy(&spB8, &this->actor.world.pos);
- for (i = 0; i < spC4; i++) {
- if (this->unk_1A0 == 0) {
- spA8 = 100.0f;
- spAC = 180.0f;
- } else if (this->unk_1A0 == 1) {
- spA8 = 200.0f;
- spAC = 100.0f;
- } else if (this->unk_1A0 == 2) {
- spA8 = 250.0f;
- spAC = 50.0f;
+ this->actor.world.pos.y -= sGiantModeScaleFactor * yFactor;
+ Actor_SetScale(&this->actor, this->baseScale * sGiantModeScaleFactor);
+ Math_Vec3f_Copy(&pos, &this->actor.world.pos);
+
+ for (i = 0; i < fragmentAndItemCount; i++) {
+ if (this->hitCount == 0) {
+ xzFactor = 100.0f;
+ yFactor = 180.0f;
+ } else if (this->hitCount == 1) {
+ xzFactor = 200.0f;
+ yFactor = 100.0f;
+ } else if (this->hitCount == 2) {
+ xzFactor = 250.0f;
+ yFactor = 50.0f;
}
- sp9C.x = (randPlusMinusPoint5Scaled(spA8) * D_80BE5DD0) + spB8.x;
- sp9C.z = (randPlusMinusPoint5Scaled(spA8) * D_80BE5DD0) + spB8.z;
- sp9C.y = this->actor.floorHeight + (spAC * D_80BE5DD0);
+ fragmentAndDustPos.x = pos.x + (Rand_CenteredFloat(xzFactor) * sGiantModeScaleFactor);
+ fragmentAndDustPos.z = pos.z + (Rand_CenteredFloat(xzFactor) * sGiantModeScaleFactor);
+ fragmentAndDustPos.y = this->actor.floorHeight + (yFactor * sGiantModeScaleFactor);
- Actor_Spawn(&play->actorCtx, play, ACTOR_EN_TANRON5, sp9C.x, sp9C.y, sp9C.z,
- Rand_ZeroFloat(0x10000), Rand_ZeroFloat(0x10000), 0, i + 100);
+ // This will spawn seven normal-sized ruin fragments, three small ruin fragments, and
+ // zero, one, or two item drops, depending on the result of Rand_ZeroFloat above.
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_TANRON5, fragmentAndDustPos.x, fragmentAndDustPos.y,
+ fragmentAndDustPos.z, Rand_ZeroFloat(0x10000), Rand_ZeroFloat(0x10000), 0,
+ TWINMOLD_PROP_PARAMS(TWINMOLD_PROP_TYPE_FRAGMENT_LARGE_1 + i));
if (i < 8) {
- func_80BE4A2C(play->specialEffects, &sp9C, Rand_ZeroFloat(3.0f) + 6.0f);
+ EnTanron5_SpawnEffectBlackDust(play->specialEffects, &fragmentAndDustPos,
+ Rand_ZeroFloat(3.0f) + 6.0f);
}
}
}
+ // To better sell the illusion of the ruin being partially destroyed when it's hit
+ // rather than just being pushed into the ground (which is what actually happens),
+ // this code will rotate the ruin in a somewhat-random way.
if (Rand_ZeroOne() < 0.333f) {
- phi_v0 = 0x4000;
+ yawDiff = 0x4000;
} else if (Rand_ZeroOne() < 0.5f) {
- phi_v0 = -0x8000;
+ yawDiff = -0x8000;
} else {
- phi_v0 = -0x4000;
+ yawDiff = -0x4000;
}
- this->actor.shape.rot.y += phi_v0;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_BIG_BOMB_EXPLOSION);
- func_800BC848(&this->actor, play, 4, 4);
- this->unk_1A0++;
+ this->actor.shape.rot.y += yawDiff;
+ Actor_PlaySfx(&this->actor, NA_SE_IT_BIG_BOMB_EXPLOSION);
+ Actor_RequestQuakeAndRumble(&this->actor, play, 4, 4);
+ this->hitCount++;
} else {
- Vec3f sp90;
+ // Something hit the ruin, but it wasn't Twinmold, and it wasn't the player while in giant
+ // mode. Play the reflect sound effect and spawn some sparks instead of breaking.
+ Vec3f hitPos;
ColliderInfo* info = this->collider.info.acHitInfo;
- sp90.x = info->bumper.hitPos.x;
- sp90.y = info->bumper.hitPos.y;
- sp90.z = info->bumper.hitPos.z;
+ hitPos.x = info->bumper.hitPos.x;
+ hitPos.y = info->bumper.hitPos.y;
+ hitPos.z = info->bumper.hitPos.z;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_SHIELD_REFLECT_SW);
- CollisionCheck_SpawnShieldParticlesMetal(play, &sp90);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_SHIELD_REFLECT_SW);
+ CollisionCheck_SpawnShieldParticlesMetal(play, &hitPos);
}
}
}
Collider_UpdateCylinder(&this->actor, &this->collider);
- if (this->unk_148 == gTwinmoldPyramidRuinDL) {
+ if (this->dList == gTwinmoldRuinPyramidDL) {
this->collider.dim.pos.y = this->actor.floorHeight;
}
- if ((this->unk_148 == gTwinmoldMajoraPillarDL) || (D_80BE5DD0 < 0.5f)) {
+ if ((this->dList == gTwinmoldRuinPillarDL) || (sGiantModeScaleFactor < 0.5f)) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
} else {
+ // The collider cylinder used for the pyramid ruin is smaller than the ruin's visual appearance. When
+ // the player is wearing the Giant's Mask, it works fine, but when the player is normal-sized, they can
+ // walk through the sides of the ruin and wander around inside it without the collider pushing them out.
+ // The below code prevents this from happening by manually updating the player's position if they get
+ // close enough to the ruin, effectively creating a collision "box" around it that pushes players out.
f32 xDiff = player->actor.world.pos.x - this->actor.world.pos.x;
- f32 yDiff = player->actor.world.pos.z - this->actor.world.pos.z;
+ f32 zDiff = player->actor.world.pos.z - this->actor.world.pos.z;
- if ((fabsf(xDiff) < 120.0f) && (fabsf(yDiff) < 120.0f)) {
- if (fabsf(yDiff) < fabsf(xDiff)) {
+ if ((fabsf(xDiff) < 120.0f) && (fabsf(zDiff) < 120.0f)) {
+ if (fabsf(zDiff) < fabsf(xDiff)) {
if (xDiff > 0.0f) {
player->actor.prevPos.x = player->actor.world.pos.x = this->actor.world.pos.x + 120.0f;
} else {
player->actor.prevPos.x = player->actor.world.pos.x = this->actor.world.pos.x - 120.0f;
}
- } else if (yDiff > 0.0f) {
+ } else if (zDiff > 0.0f) {
player->actor.prevPos.z = player->actor.world.pos.z = this->actor.world.pos.z + 120.0f;
} else {
player->actor.prevPos.z = player->actor.world.pos.z = this->actor.world.pos.z - 120.0f;
@@ -395,130 +506,144 @@ void EnTanron5_Update(Actor* thisx, PlayState* play2) {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
}
-void func_80BE5818(Actor* thisx, PlayState* play2) {
- f32 sp6C;
+/**
+ * This is the update function for the fragments and the item drops that fly off from a destructible ruin.
+ */
+void EnTanron5_RuinFragmentItemDrop_Update(Actor* thisx, PlayState* play2) {
+ f32 interactionDistSq;
s32 i;
- Vec3f sp5C;
+ Vec3f pos;
EnTanron5* this = THIS;
PlayState* play = play2;
- if ((ENTANRON5_GET(&this->actor) < ENTANRON5_110) && (this->unk_1A0 != 0)) {
- this->unk_1A0++;
- this->actor.world.pos.y -= 2.0f * D_80BE5DD0;
- if (this->unk_1A0 == 40) {
+ // When a ruin fragment hits the floor, it will slowly sink into the sand. After sinking for 38 frames,
+ // the ruin fragment will despawn.
+ if ((TWINMOLD_PROP_GET_TYPE(&this->actor) < TWINMOLD_PROP_TYPE_ITEM_DROP_1) && (this->sinkTimer != 0)) {
+ this->sinkTimer++;
+ this->actor.world.pos.y -= 2.0f * sGiantModeScaleFactor;
+ if (this->sinkTimer == 40) {
Actor_Kill(&this->actor);
}
+
return;
}
- if (DECR(this->unk_144) == 0) {
+ if (DECR(this->timer) == 0) {
Actor_Kill(&this->actor);
}
- if (this->actor.speedXZ > 0.02f) {
+ 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) {
- this->actor.shape.rot.x += this->unk_198;
- this->actor.shape.rot.y += this->unk_19A;
- sp6C = 1225.0f;
+ if (TWINMOLD_PROP_GET_TYPE(&this->actor) < TWINMOLD_PROP_TYPE_ITEM_DROP_1) {
+ this->actor.shape.rot.x += this->fragmentAngularVelocityX;
+ this->actor.shape.rot.y += this->fragmentAngularVelocityY;
+ interactionDistSq = SQ(35.0f);
- if (this->actor.bgCheckFlags & 1) {
- if (ENTANRON5_GET(&this->actor) < ENTANRON5_108) {
- Math_Vec3f_Copy(&sp5C, &this->actor.world.pos);
- sp5C.y = this->actor.floorHeight;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ if (TWINMOLD_PROP_GET_TYPE(&this->actor) <= TWINMOLD_PROP_TYPE_FRAGMENT_SMALL_1) {
+ Math_Vec3f_Copy(&pos, &this->actor.world.pos);
+ pos.y = this->actor.floorHeight;
for (i = 0; i < 4; i++) {
- func_80BE4930(play->specialEffects, &sp5C, Rand_ZeroFloat(1.0f) + 2.0f);
+ EnTanron5_SpawnEffectSand(play->specialEffects, &pos, Rand_ZeroFloat(1.0f) + 2.0f);
}
- this->unk_1A0++;
+
+ // Set the sinkTimer to a non-zero value so that this fragment will start sinking on the next update.
+ this->sinkTimer++;
} else {
+ // Small ruin fragments don't sink into the sand; they just immediately despawn.
Actor_Kill(&this->actor);
}
}
} else {
- sp6C = 400.0f;
- this->unk_198 += 0x2000;
- if (this->actor.bgCheckFlags & 1) {
- this->unk_198 = 0;
- this->actor.speedXZ = 0.0f;
+ interactionDistSq = SQ(20.0f);
+ this->itemDropRotZ += 0x2000;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->itemDropRotZ = 0;
+ this->actor.speed = 0.0f;
}
}
- if (this->unk_1A1 == 0) {
- if ((D_80BE5DD0 > 0.5f) &&
- ((ENTANRON5_GET(&this->actor) < ENTANRON5_108) || (ENTANRON5_GET(&this->actor) >= ENTANRON5_110))) {
+ if (this->hitTimer == 0) {
+ if ((sGiantModeScaleFactor > 0.5f) &&
+ ((TWINMOLD_PROP_GET_TYPE(&this->actor) <= TWINMOLD_PROP_TYPE_FRAGMENT_SMALL_1) ||
+ (TWINMOLD_PROP_GET_TYPE(&this->actor) >= TWINMOLD_PROP_TYPE_ITEM_DROP_1))) {
Player* player = GET_PLAYER(play);
- Vec3f temp;
+ Vec3f pos;
- temp.x = player->actor.world.pos.x - this->actor.world.pos.x;
- temp.y = (player->actor.world.pos.y + 10.0f) - this->actor.world.pos.y;
- temp.z = player->actor.world.pos.z - this->actor.world.pos.z;
+ pos.x = player->actor.world.pos.x - this->actor.world.pos.x;
+ pos.y = (player->actor.world.pos.y + 10.0f) - this->actor.world.pos.y;
+ pos.z = player->actor.world.pos.z - this->actor.world.pos.z;
- if (SQXYZ(temp) < sp6C) {
- if (ENTANRON5_GET(&this->actor) >= ENTANRON5_110) {
- if (this->unk_1A0 == 0) {
+ if (SQXYZ(pos) < interactionDistSq) {
+ if (TWINMOLD_PROP_GET_TYPE(&this->actor) >= TWINMOLD_PROP_TYPE_ITEM_DROP_1) {
+ if (this->itemDropType == TWINMOLD_PROP_ITEM_DROP_TYPE_10_ARROWS) {
Item_Give(play, ITEM_ARROWS_10);
} else {
- Item_Give(play, ITEM_MAGIC_LARGE);
+ Item_Give(play, ITEM_MAGIC_JAR_BIG);
}
+
Actor_Kill(&this->actor);
- play_sound(NA_SE_SY_GET_ITEM);
+ Audio_PlaySfx(NA_SE_SY_GET_ITEM);
} else {
- this->unk_1A1 = 20;
+ // Damages the player and knocks them back. Starts a 20-frame timer to prevent
+ // this same ruin fragment from damaging the player again too quickly.
+ this->hitTimer = 20;
func_800B8D50(play, NULL, 5.0f, this->actor.world.rot.y, 0.0f, 8);
}
}
}
} else {
- this->unk_1A1--;
+ this->hitTimer--;
}
}
void EnTanron5_Draw(Actor* thisx, PlayState* play) {
EnTanron5* this = THIS;
- if ((-500.0f * D_80BE5DD0) < this->actor.projectedPos.z) {
+ if ((-500.0f * sGiantModeScaleFactor) < 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);
+ gSPDisplayList(POLY_OPA_DISP++, this->dList);
CLOSE_DISPS(play->state.gfxCtx);
}
}
-void func_80BE5C10(Actor* thisx, PlayState* play) {
+void EnTanron5_ItemDrop_Draw(Actor* thisx, PlayState* play) {
EnTanron5* this = THIS;
TexturePtr texture;
- s32 phi_v0;
+ s32 shouldDraw;
- if ((this->unk_144 > 50) || (this->unk_144 & 1)) {
- phi_v0 = true;
+ // This makes the item drop flicker when it's close to despawning.
+ if ((this->timer > 50) || (this->timer & 1)) {
+ shouldDraw = true;
} else {
- phi_v0 = false;
+ shouldDraw = false;
}
- if (((-500.0f * D_80BE5DD0) < this->actor.projectedPos.z) && phi_v0) {
+ if (((-500.0f * sGiantModeScaleFactor) < this->actor.projectedPos.z) && shouldDraw) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- if (this->unk_1A0 == 0) {
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ if (this->itemDropType == TWINMOLD_PROP_ITEM_DROP_TYPE_10_ARROWS) {
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));
Matrix_Translate(0.0f, 200.0f, 0.0f, MTXMODE_APPLY);
- Matrix_RotateZS(this->unk_198, MTXMODE_APPLY);
+ Matrix_RotateZS(this->itemDropRotZ, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gItemDropDL);
diff --git a/src/overlays/actors/ovl_En_Tanron5/z_en_tanron5.h b/src/overlays/actors/ovl_En_Tanron5/z_en_tanron5.h
index d40938bf8..dddc205e7 100644
--- a/src/overlays/actors/ovl_En_Tanron5/z_en_tanron5.h
+++ b/src/overlays/actors/ovl_En_Tanron5/z_en_tanron5.h
@@ -5,24 +5,62 @@
struct EnTanron5;
-#define ENTANRON5_GET(thisx) ((thisx)->params)
+#define TWINMOLD_PROP_GET_TYPE(thisx) ((thisx)->params)
+#define TWINMOLD_PROP_PARAMS(type) (type)
-#define ENTANRON5_0 0
-#define ENTANRON5_100 100
-#define ENTANRON5_107 107
-#define ENTANRON5_108 108
-#define ENTANRON5_110 110
+typedef enum {
+ /* 0 */ TWINMOLD_PROP_TYPE_STATIC,
+ /* 1 */ TWINMOLD_PROP_TYPE_RUIN_PILLAR_1,
+ /* 2 */ TWINMOLD_PROP_TYPE_RUIN_PILLAR_2,
+ /* 3 */ TWINMOLD_PROP_TYPE_RUIN_PILLAR_3,
+ /* 4 */ TWINMOLD_PROP_TYPE_RUIN_PILLAR_4,
+ /* 5 */ TWINMOLD_PROP_TYPE_RUIN_PILLAR_5,
+ /* 6 */ TWINMOLD_PROP_TYPE_RUIN_PILLAR_6,
+ /* 7 */ TWINMOLD_PROP_TYPE_RUIN_PILLAR_7,
+ /* 8 */ TWINMOLD_PROP_TYPE_RUIN_PILLAR_8,
+ /* 9 */ TWINMOLD_PROP_TYPE_RUIN_PILLAR_9,
+ /* 10 */ TWINMOLD_PROP_TYPE_RUIN_PILLAR_10,
+ /* 11 */ TWINMOLD_PROP_TYPE_RUIN_PILLAR_11,
+ /* 12 */ TWINMOLD_PROP_TYPE_RUIN_PILLAR_12,
+ /* 13 */ TWINMOLD_PROP_TYPE_RUIN_PYRAMID_1,
+ /* 14 */ TWINMOLD_PROP_TYPE_RUIN_PYRAMID_2,
+ /* 15 */ TWINMOLD_PROP_TYPE_RUIN_PYRAMID_3,
+ /* 16 */ TWINMOLD_PROP_TYPE_RUIN_PYRAMID_4,
+ /* 17 */ TWINMOLD_PROP_TYPE_RUIN_PYRAMID_5,
+ /* 18 */ TWINMOLD_PROP_TYPE_RUIN_PYRAMID_6,
+ /* 19 */ TWINMOLD_PROP_TYPE_RUIN_PYRAMID_7,
+ /* 20 */ TWINMOLD_PROP_TYPE_RUIN_PYRAMID_8,
+ /* 100 */ TWINMOLD_PROP_TYPE_FRAGMENT_LARGE_1 = 100,
+ /* 101 */ TWINMOLD_PROP_TYPE_FRAGMENT_LARGE_2,
+ /* 102 */ TWINMOLD_PROP_TYPE_FRAGMENT_LARGE_3,
+ /* 103 */ TWINMOLD_PROP_TYPE_FRAGMENT_LARGE_4,
+ /* 104 */ TWINMOLD_PROP_TYPE_FRAGMENT_LARGE_5,
+ /* 105 */ TWINMOLD_PROP_TYPE_FRAGMENT_LARGE_6,
+ /* 106 */ TWINMOLD_PROP_TYPE_FRAGMENT_LARGE_7,
+ /* 107 */ TWINMOLD_PROP_TYPE_FRAGMENT_SMALL_1,
+ /* 108 */ TWINMOLD_PROP_TYPE_FRAGMENT_SMALL_2,
+ /* 109 */ TWINMOLD_PROP_TYPE_FRAGMENT_SMALL_3,
+ /* 110 */ TWINMOLD_PROP_TYPE_ITEM_DROP_1,
+ /* 111 */ TWINMOLD_PROP_TYPE_ITEM_DROP_2
+} TwinmoldPropType;
typedef struct EnTanron5 {
/* 0x000 */ Actor actor;
- /* 0x144 */ s16 unk_144;
- /* 0x148 */ Gfx* unk_148;
+ /* 0x144 */ s16 timer;
+ /* 0x148 */ Gfx* dList;
/* 0x14C */ ColliderCylinder collider;
- /* 0x198 */ s16 unk_198;
- /* 0x19A */ s16 unk_19A;
- /* 0x19C */ f32 unk_19C;
- /* 0x1A0 */ u8 unk_1A0;
- /* 0x1A1 */ u8 unk_1A1;
+ /* 0x198 */ union {
+ s16 fragmentAngularVelocityX;
+ s16 itemDropRotZ;
+ };
+ /* 0x19A */ s16 fragmentAngularVelocityY;
+ /* 0x19C */ f32 baseScale;
+ /* 0x1A0 */ union {
+ u8 hitCount; // used by destructible ruins
+ u8 sinkTimer; // used by ruin fragments
+ u8 itemDropType; // used by item drops
+ };
+ /* 0x1A1 */ u8 hitTimer;
} EnTanron5; // size = 0x1A4
#endif // Z_EN_TANRON5_H
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..8ed4c36f3 100644
--- a/src/overlays/actors/ovl_En_Tanron6/z_en_tanron6.c
+++ b/src/overlays/actors/ovl_En_Tanron6/z_en_tanron6.c
@@ -6,7 +6,7 @@
#include "z_en_tanron6.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY)
#define THIS ((EnTanron6*)thisx)
@@ -72,7 +72,7 @@ void EnTanron6_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0, ActorShadow_DrawCircle, 19.0f);
this->actor.colChkInfo.health = 1;
this->actor.colChkInfo.damageTable = &sDamageTable;
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
EnTanron6_DoNothing(this);
}
@@ -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 257aea283..d909826bb 100644
--- a/src/overlays/actors/ovl_En_Test2/z_en_test2.c
+++ b/src/overlays/actors/ovl_En_Test2/z_en_test2.c
@@ -12,7 +12,7 @@
#include "objects/object_meganeana_obj/object_meganeana_obj.h"
#include "objects/object_haka_obj/object_haka_obj.h"
-#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_80)
+#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_REACT_TO_LENS)
#define THIS ((EnTest2*)thisx)
@@ -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;
}
}
@@ -83,7 +83,7 @@ void EnTest2_Update(Actor* thisx, PlayState* play) {
EnTest2ModelInfo* modelInfo;
EnTest2* this = THIS;
- objectIndex = Object_GetIndex(&play->objectCtx, sObjectIds[this->actor.params]);
+ objectIndex = Object_GetSlot(&play->objectCtx, sObjectIds[this->actor.params]);
if (objectIndex < 0) {
Actor_Kill(&this->actor);
return;
@@ -96,7 +96,7 @@ void EnTest2_Update(Actor* thisx, PlayState* play) {
Actor_SetObjectDependency(play, &this->actor);
this->animMat = Lib_SegmentedToVirtual(modelInfo->animMat);
}
- if (play->roomCtx.curRoom.unk5) {
+ if (play->roomCtx.curRoom.lensMode != LENS_MODE_HIDE_ACTORS) {
this->actor.update = EnTest2_UpdateForLens;
} else {
this->actor.update = Actor_Noop;
@@ -108,9 +108,9 @@ void EnTest2_UpdateForLens(Actor* thisx, PlayState* play) {
EnTest2* this = THIS;
if (play->actorCtx.lensMaskSize == LENS_MASK_ACTIVE_SIZE) {
- this->actor.flags |= ACTOR_FLAG_80;
+ this->actor.flags |= ACTOR_FLAG_REACT_TO_LENS;
} else {
- this->actor.flags &= ~ACTOR_FLAG_80;
+ this->actor.flags &= ~ACTOR_FLAG_REACT_TO_LENS;
}
}
@@ -122,10 +122,10 @@ void EnTest2_Draw(Actor* thisx, PlayState* play) {
if (this->animMat != NULL) {
AnimatedMat_Draw(play, this->animMat);
}
- if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_80)) {
+ 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 22883d53d..90ea18d05 100644
--- a/src/overlays/actors/ovl_En_Test3/z_en_test3.c
+++ b/src/overlays/actors/ovl_En_Test3/z_en_test3.c
@@ -4,14 +4,13 @@
* 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)
@@ -122,11 +121,11 @@ static u8 sScheduleScript[] = {
/* 0x094 */ SCHEDULE_CMD_RET_TIME(15, 55, 16, 10, 12),
/* 0x09A */ SCHEDULE_CMD_RET_NONE(),
/* 0x09B */ SCHEDULE_CMD_CHECK_NOT_IN_DAY_L(3, 0x138 - 0x0A0),
- /* 0x0A0 */ SCHEDULE_CMD_CHECK_FLAG_L(WEEKEVENTREG_33_08, 0x12C - 0x0A5),
- /* 0x0A5 */ SCHEDULE_CMD_CHECK_FLAG_L(WEEKEVENTREG_79_40, 0x12C - 0x0AA),
+ /* 0x0A0 */ SCHEDULE_CMD_CHECK_FLAG_L(WEEKEVENTREG_RECOVERED_STOLEN_BOMB_BAG, 0x12C - 0x0A5),
+ /* 0x0A5 */ SCHEDULE_CMD_CHECK_FLAG_L(WEEKEVENTREG_SAKON_DEAD, 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),
@@ -150,7 +149,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(),
@@ -313,15 +312,15 @@ 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) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
} else if (textId) { // != 0
- func_80151938(play, textId);
+ 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;
}
@@ -340,11 +339,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;
}
}
@@ -354,13 +353,13 @@ s32 func_80A3EA30(EnTest3* this, PlayState* play) {
Actor* hideoutDoor = SubS_FindActor(play, NULL, ACTORCAT_BG, ACTOR_BG_IKNV_OBJ);
if (hideoutDoor != NULL) {
- this->player.targetedActor = hideoutDoor;
+ this->player.lockOnActor = hideoutDoor;
}
}
if (this->unk_D78->unk_1 != 0) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->unk_D8D);
- play->msgCtx.msgMode = 0x44;
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csId);
+ play->msgCtx.msgMode = MSGMODE_PAUSED;
}
return false;
}
@@ -375,10 +374,10 @@ 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);
- this->player.targetedActor = &GET_PLAYER(play)->actor;
+ CutsceneManager_Stop(this->csId);
+ this->csId = CS_ID_GLOBAL_TALK;
+ CutsceneManager_Queue(this->csId);
+ this->player.lockOnActor = &GET_PLAYER(play)->actor;
}
return 1;
}
@@ -390,9 +389,9 @@ s32 func_80A3EB8C(EnTest3* this, PlayState* play) {
Actor* hideoutObject = SubS_FindActor(play, NULL, ACTORCAT_ITEMACTION, ACTOR_OBJ_NOZOKI);
if (hideoutObject != NULL) {
- this->player.targetedActor = hideoutObject;
+ this->player.lockOnActor = hideoutObject;
}
- play->msgCtx.msgMode = 0x44;
+ play->msgCtx.msgMode = MSGMODE_PAUSED;
return 1;
}
return 0;
@@ -412,9 +411,9 @@ s32 func_80A3EC30(EnTest3* this, PlayState* play) {
s32 func_80A3EC44(EnTest3* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE) && Message_ShouldAdvance(play)) {
if (play->msgCtx.choiceIndex != 0) {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
} else {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
}
if (play->msgCtx.choiceIndex != 0) {
return 1;
@@ -453,11 +452,11 @@ 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;
- this->player.heldItemId = ITEM_OCARINA;
+ this->player.heldItemId = ITEM_OCARINA_OF_TIME;
Player_SetModelGroup(&this->player, 3);
play->playerInit(&this->player, play, &object_test3_Skel_00F7EC);
@@ -471,7 +470,8 @@ void EnTest3_Init(Actor* thisx, PlayState* play2) {
this->unk_D90 = GET_PLAYER(play);
this->player.giObjectSegment = this->unk_D90->giObjectSegment;
this->player.tatlActor = this->unk_D90->tatlActor;
- if ((CURRENT_DAY != 3) || CHECK_WEEKEVENTREG(WEEKEVENTREG_33_08) || !CHECK_WEEKEVENTREG(WEEKEVENTREG_51_08)) {
+ if ((CURRENT_DAY != 3) || CHECK_WEEKEVENTREG(WEEKEVENTREG_RECOVERED_STOLEN_BOMB_BAG) ||
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_51_08)) {
this->player.currentMask = PLAYER_MASK_KEATON;
}
this->player.prevMask = this->player.currentMask;
@@ -479,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);
}
@@ -527,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_NONE) {
+ 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) {
@@ -576,7 +576,7 @@ Actor* func_80A3F2BC(PlayState* play, EnTest3* this, s32 actorId, s32 category,
if (actorId == actor->id) {
f32 dy = this->player.actor.world.pos.y - actor->world.pos.y;
- if ((fabsf(dy) < arg5) && (Actor_XZDistanceBetweenActors(&this->player.actor, actor) < arg4)) {
+ if ((fabsf(dy) < arg5) && (Actor_WorldDistXZToActor(&this->player.actor, actor) < arg4)) {
return actor;
}
}
@@ -590,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;
@@ -617,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) {
@@ -629,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) {
@@ -654,11 +654,11 @@ s32 func_80A3F62C(EnTest3* this, PlayState* play, struct_80A41828* arg2, Schedul
s32 func_80A3F73C(EnTest3* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->player.actor, &play->state)) {
func_80A3E7E0(this, func_80A4084C);
- this->player.targetedActor = &GET_PLAYER(play)->actor;
+ this->player.lockOnActor = &GET_PLAYER(play)->actor;
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) {
@@ -667,17 +667,17 @@ 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);
+ Actor_OfferTalkNearColChkInfoCylinder(&this->player.actor, play);
if (this->unk_D88 == 3) {
func_80A3F534(this, play);
} else if (this->unk_D88 == 5) {
func_80A3F5A4(this, play);
}
this->player.actor.textId = this->unk_D78->textId;
- this->player.actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->player.actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
}
return false;
}
@@ -688,9 +688,9 @@ s32 func_80A3F8D4(EnTest3* this, PlayState* play, struct_80A41828* arg2, Schedul
func_80A3F15C(this, play, arg2);
if (((postActor = func_80A3F2BC(play, this, ACTOR_EN_PST, ACTORCAT_PROP, 100.0f, 20.0f)) != NULL) ||
((postActor = func_80A3F2BC(play, this, ACTOR_EN_PM, ACTORCAT_NPC, 100.0f, 20.0f)) != NULL)) {
- this->player.actor.home.rot.y = Actor_YawBetweenActors(&this->player.actor, postActor);
+ 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;
}
@@ -737,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++;
@@ -758,34 +758,34 @@ 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);
}
- Audio_QueueSeqCmd(NA_BGM_STOP | 0x10000);
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 1);
D_80A41D20 = 2;
} else {
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))));
+ Environment_SetTimeJump(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;
@@ -794,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;
}
@@ -814,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;
}
@@ -836,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;
}
@@ -857,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;
}
@@ -868,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 {
@@ -950,7 +950,7 @@ s32 func_80A40230(EnTest3* this, PlayState* play) {
dx = this->player.actor.world.pos.x - this->player.actor.prevPos.x;
dy = this->player.actor.world.pos.z - this->player.actor.prevPos.z;
this->player.linearVelocity = sqrtf(SQ(dx) + SQ(dy));
- this->player.linearVelocity *= 1.0f + (1.05f * fabsf(Math_SinS(this->player.unk_B6C)));
+ this->player.linearVelocity *= 1.0f + (1.05f * fabsf(Math_SinS(this->player.floorPitch)));
D_80A41D40 = (this->player.linearVelocity * 10.0f) + 20.0f;
D_80A41D40 = CLAMP_MAX(D_80A41D40, 60.0f);
D_80A41D44 = this->player.actor.world.rot.y;
@@ -1007,7 +1007,7 @@ void func_80A4084C(EnTest3* this, PlayState* play) {
} else {
func_80A3E7E0(this, func_80A40678);
}
- this->player.targetedActor = NULL;
+ this->player.lockOnActor = NULL;
}
} else if (func_80A3ED24(this, play)) {
func_80A3E7E0(this, func_80A40908);
@@ -1017,15 +1017,15 @@ void func_80A4084C(EnTest3* this, PlayState* play) {
void func_80A40908(EnTest3* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->player.actor, &play->state)) {
func_80A3E7E0(this, func_80A4084C);
- this->player.targetedActor = &GET_PLAYER(play)->actor;
+ this->player.lockOnActor = &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);
+ Actor_OfferTalkExchange(&this->player.actor, play, 9999.9f, 9999.9f, PLAYER_IA_MINUS1);
this->unk_D78 = &D_80A41854[6];
this->player.actor.textId = this->unk_D78->textId;
- this->player.actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->player.actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
}
}
@@ -1033,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,17 +1055,17 @@ void EnTest3_Update(Actor* thisx, PlayState* play2) {
play->actorCtx.flags &= ~ACTORCTX_FLAG_7;
this->player.actor.draw = EnTest3_Draw;
D_80A41D48 = false;
- this->player.actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
- if (Cutscene_CheckActorAction(play, 0x1FA) &&
+ this->player.actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
+ 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_NONE)) {
if (this->unk_D88 >= 7) {
Vec3f worldPos;
@@ -1104,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;
@@ -1124,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;
@@ -1134,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);
@@ -1164,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);
}
}
@@ -1177,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);
}
@@ -1186,12 +1188,15 @@ void EnTest3_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList1, Gfx** dL
Actor* leftHandActor = this->player.heldActor;
if (leftHandActor != NULL) {
- leftHandActor->world.pos.x = (this->player.bodyPartsPos[15].x + this->player.leftHandWorld.pos.x) / 2.0f;
- leftHandActor->world.pos.y = (this->player.bodyPartsPos[15].y + this->player.leftHandWorld.pos.y) / 2.0f;
- leftHandActor->world.pos.z = (this->player.bodyPartsPos[15].z + this->player.leftHandWorld.pos.z) / 2.0f;
+ leftHandActor->world.pos.x =
+ (this->player.bodyPartsPos[PLAYER_BODYPART_RIGHT_HAND].x + this->player.leftHandWorld.pos.x) / 2.0f;
+ leftHandActor->world.pos.y =
+ (this->player.bodyPartsPos[PLAYER_BODYPART_RIGHT_HAND].y + this->player.leftHandWorld.pos.y) / 2.0f;
+ leftHandActor->world.pos.z =
+ (this->player.bodyPartsPos[PLAYER_BODYPART_RIGHT_HAND].z + this->player.leftHandWorld.pos.z) / 2.0f;
}
} else if (limbIndex == OBJECT_TEST3_LIMB_0B) {
- Actor* actor730 = this->player.targetedActor;
+ Actor* actor730 = this->player.lockOnActor;
if ((*dList1 != NULL) && this->player.currentMask && !(this->player.stateFlags2 & PLAYER_STATE2_1000000)) {
// this->player.currentMask != PLAYER_MASK_NONE
@@ -1200,7 +1205,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);
}
}
@@ -1213,17 +1220,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);
}
}
@@ -1258,7 +1267,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.
@@ -1296,7 +1305,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 5a6c4573f..8816ceb64 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,46 +43,46 @@ 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) {
- func_80151A68(play, sNightMessages1[CURRENT_DAY - 1]);
- } else if ((sCutscenes[this->unk_144] < 0) || (play->actorCtx.flags & ACTORCTX_FLAG_1)) {
+ if (this->csIdIndex != 0) {
+ Message_DisplaySceneTitleCard(play, sNightMessages1[CURRENT_DAY - 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]);
+ Message_DisplaySceneTitleCard(play, sDayMessages1[CURRENT_DAY - 1]);
} else {
- this->unk_144 = 0;
+ this->csIdIndex = 0;
this->unk_146 = gSaveContext.save.time += CLOCK_TIME_MINUTE;
}
Interface_NewDay(play, CURRENT_DAY);
- D_801BDBC8 = 0xFE;
- func_800FB758(play);
+ gSceneSeqState = SCENESEQ_MORNING;
+ Environment_PlaySceneSequence(play);
func_800FEAF4(&play->envCtx);
this->actionFunc = func_80A42AB8;
}
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) {
- play_sound(NA_SE_EV_CHICKEN_CRY_M);
+ } else if (this->csIdIndex == 0) {
+ Audio_PlaySfx(NA_SE_EV_CHICKEN_CRY_M);
} else {
- func_8019F128(NA_SE_EV_DOG_CRY_EVENING);
+ Audio_PlaySfx_2(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,36 +90,36 @@ void func_80A41D70(EnTest4* this, PlayState* play) {
}
void func_80A41FA4(EnTest4* this, PlayState* play) {
- if (this->unk_144 != 0) {
- func_80151A68(play, sNightMessages2[CURRENT_DAY - 1]);
- } else if ((sCutscenes[this->unk_144] < 0) || (play->actorCtx.flags & ACTORCTX_FLAG_1)) {
+ if (this->csIdIndex != 0) {
+ Message_DisplaySceneTitleCard(play, sNightMessages2[CURRENT_DAY - 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);
- func_80151A68(play, sDayMessages2[CURRENT_DAY - 1]);
- D_801BDBC8 = 0xFE;
- func_800FB758(play);
+ Message_DisplaySceneTitleCard(play, sDayMessages2[CURRENT_DAY - 1]);
+ gSceneSeqState = SCENESEQ_MORNING;
+ Environment_PlaySceneSequence(play);
func_800FEAF4(&play->envCtx);
this->actionFunc = func_80A42AB8;
}
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) {
- play_sound(NA_SE_EV_CHICKEN_CRY_M);
+ } else if (this->csIdIndex == 0) {
+ Audio_PlaySfx(NA_SE_EV_CHICKEN_CRY_M);
} else {
- func_8019F128(NA_SE_EV_DOG_CRY_EVENING);
+ Audio_PlaySfx_2(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,20 +292,20 @@ 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* csEntry = CutsceneManager_GetCutsceneEntry(sCsIdList[0]);
SET_EVENTINF(EVENTINF_52);
- sCutscenes[1] = temp_v0_2->additionalCutscene;
+ sCsIdList[1] = csEntry->additionalCsId;
} else {
CLEAR_EVENTINF(EVENTINF_52);
- sCutscenes[1] = sCutscenes[0];
+ sCsIdList[1] = sCsIdList[0];
}
- if (sIsLoaded || (CHECK_EVENTINF(EVENTINF_27))) {
+ if (sIsLoaded || CHECK_EVENTINF(EVENTINF_TRIGGER_DAYTELOP)) {
Actor_Kill(&this->actor);
} else {
sIsLoaded = true;
@@ -315,32 +315,32 @@ void EnTest4_Init(Actor* thisx, PlayState* play) {
if (CURRENT_DAY == 0) {
if (gSaveContext.save.time < CLOCK_TIME(6, 1)) {
gSaveContext.save.time = CLOCK_TIME(6, 0);
- gSaveContext.gameMode = 0;
+ 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;
+ gSaveContext.save.eventDayCount = dayTemp;
+ 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;
}
@@ -367,9 +367,9 @@ void func_80A42AB8(EnTest4* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if ((play->transitionMode == TRANS_MODE_OFF) && !Play_InCsMode(play) && (play->numSetupActors <= 0) &&
- (play->roomCtx.unk31 == 0) && !Play_IsDebugCamEnabled()) {
+ (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,38 +405,38 @@ 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;
}
}
}
gSaveContext.respawnFlag = -4;
- SET_EVENTINF(EVENTINF_27);
+ SET_EVENTINF(EVENTINF_TRIGGER_DAYTELOP);
Actor_Kill(&this->actor);
}
}
- 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;
}
} else if ((new_var * bellDiff) <= 0) {
- func_801A0124(&this->actor.projectedPos, (this->actor.params >> 5) & 0xF);
+ Audio_PlaySfx_BigBells(&this->actor.projectedPos, (this->actor.params >> 5) & 0xF);
this->lastBellTime = gSaveContext.save.time;
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,10 +483,10 @@ void func_80A42F20(EnTest4* this, PlayState* play) {
} else if (this->transitionCsTimer < 60) {
this->transitionCsTimer++;
if (this->transitionCsTimer == 10) {
- if (this->unk_144 == 0) {
- play_sound(NA_SE_EV_CHICKEN_CRY_M);
+ if (this->csIdIndex == 0) {
+ Audio_PlaySfx(NA_SE_EV_CHICKEN_CRY_M);
} else {
- func_8019F128(NA_SE_EV_DOG_CRY_EVENING);
+ Audio_PlaySfx_2(NA_SE_EV_DOG_CRY_EVENING);
}
}
if (this->transitionCsTimer == 60) {
@@ -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;
@@ -517,38 +517,38 @@ void func_80A42F20(EnTest4* this, PlayState* play) {
void func_80A430C8(EnTest4* this, PlayState* play) {
if ((CURRENT_DAY == 2) && (gSaveContext.save.time >= CLOCK_TIME(7, 0)) &&
- (gSaveContext.save.time < CLOCK_TIME(17, 30)) && (play->envCtx.unk_F2[2] == 0)) {
+ (gSaveContext.save.time < CLOCK_TIME(17, 30)) && (play->envCtx.precipitation[PRECIP_SNOW_CUR] == 0)) {
// rain?
- gWeatherMode = 1;
- func_800FD78C(play);
- play->envCtx.unk_E3 = 1;
- play->envCtx.unk_F2[0] = 0x3C;
+ gWeatherMode = WEATHER_MODE_1;
+ Environment_PlayStormNatureAmbience(play);
+ play->envCtx.lightningState = LIGHTNING_ON;
+ play->envCtx.precipitation[PRECIP_RAIN_MAX] = 60;
} else {
- if (play->envCtx.unk_F2[0] != 0) {
+ if (play->envCtx.precipitation[PRECIP_RAIN_MAX] != 0) {
if ((play->state.frames % 4) == 0) {
- play->envCtx.unk_F2[0]--;
- if ((play->envCtx.unk_F2[0]) == 8) {
- func_800FD858(play);
+ play->envCtx.precipitation[PRECIP_RAIN_MAX]--;
+ if ((play->envCtx.precipitation[PRECIP_RAIN_MAX]) == 8) {
+ Environment_StopStormNatureAmbience(play);
}
}
}
}
- if (gWeatherMode == 1) {
+ if (gWeatherMode == WEATHER_MODE_1) {
this->state = TEST4_STATE_1;
}
}
void func_80A431C8(EnTest4* this, PlayState* play) {
if (((gSaveContext.save.time >= CLOCK_TIME(17, 30)) && (gSaveContext.save.time < CLOCK_TIME(23, 0)) &&
- (play->envCtx.unk_F2[0] != 0)) ||
- (play->envCtx.unk_F2[2] != 0)) {
- gWeatherMode = 0;
- play->envCtx.unk_E3 = 2;
+ (play->envCtx.precipitation[PRECIP_RAIN_MAX] != 0)) ||
+ (play->envCtx.precipitation[PRECIP_SNOW_CUR] != 0)) {
+ gWeatherMode = WEATHER_MODE_CLEAR;
+ play->envCtx.lightningState = LIGHTNING_LAST;
}
- if (gWeatherMode == 0) {
+ if (gWeatherMode == WEATHER_MODE_CLEAR) {
this->state = TEST4_STATE_0;
}
}
@@ -557,7 +557,7 @@ void func_80A4323C(EnTest4* this, PlayState* play) {
s32 temp_v0 = (this->actor.params >> 0xA) * 0x64;
if (temp_v0 > 0) {
- D_801F4E7A = temp_v0;
+ gSkyboxNumStars = temp_v0;
}
}
@@ -568,7 +568,7 @@ void EnTest4_Update(Actor* thisx, PlayState* play) {
if (!(player->stateFlags1 & PLAYER_STATE1_2)) {
this->actionFunc(this, play);
- if (func_800FE4B8(play) != 0) {
+ if (Environment_GetStormState(play) != STORM_STATE_OFF) {
switch (this->state) {
case TEST4_STATE_0:
func_80A430C8(this, play);
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 83451fa02..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,14 +66,15 @@ 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) {
- Actor_PickUp(&this->actor, play, GI_MAX, this->actor.xzDistToPlayer, fabsf(this->actor.playerHeightRel));
+ 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));
}
}
}
@@ -88,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;
@@ -101,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_Test5/z_en_test5.h b/src/overlays/actors/ovl_En_Test5/z_en_test5.h
index 8d0c47784..7a4b656b5 100644
--- a/src/overlays/actors/ovl_En_Test5/z_en_test5.h
+++ b/src/overlays/actors/ovl_En_Test5/z_en_test5.h
@@ -5,6 +5,8 @@
#define ENTEST5_IS_HOT_SPRING(thisx) ((thisx)->params != 0)
+#define ENTEST5_PARAMS(isHotSpringWater) (isHotSpringWater)
+
struct EnTest5; // SpringWaterModifier
typedef void (*EnTest5ActionFunc)(struct EnTest5*, PlayState*);
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 6f1c5ac54..9657f1b1e 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)
@@ -17,30 +18,38 @@ void EnTest6_Destroy(Actor* thisx, PlayState* play2);
void EnTest6_Update(Actor* thisx, PlayState* play);
void EnTest6_Draw(Actor* thisx, PlayState* play);
-struct EnTest6Struct;
+struct SoTCsAmmoDrops;
-typedef void (*EnTest6StructFunc)(EnTest6*, PlayState*, struct EnTest6Struct*);
+typedef void (*SoTCsAmmoDropDrawFunc)(EnTest6*, PlayState*, struct SoTCsAmmoDrops*);
-typedef struct EnTest6Struct {
- /* 0x00 */ s32 unk_00;
- /* 0x04 */ f32 unk_04;
- /* 0x08 */ f32 unk_08;
- /* 0x0C */ f32 unk_0C;
- /* 0x10 */ f32 unk_10;
- /* 0x14 */ EnTest6StructFunc unk_14;
-} EnTest6Struct; // size = 0x18
+typedef enum SoTCsAmmoDropType {
+ /* 0 */ SOTCS_AMMO_DROP_NONE,
+ /* 1 */ SOTCS_AMMO_DROP_ARROWS,
+ /* 2 */ SOTCS_AMMO_DROP_BOMB,
+ /* 3 */ SOTCS_AMMO_DROP_DEKU_NUT,
+ /* 4 */ SOTCS_AMMO_DROP_DEKU_STICK,
+ /* 5 */ SOTCS_AMMO_DROP_RUPEE_GREEN,
+ /* 6 */ SOTCS_AMMO_DROP_RUPEE_BLUE
+} SoTCsAmmoDropType;
-void func_80A90D34(EnTest6* this, PlayState* play, EnTest6Struct* ptr);
-void func_80A90FC0(EnTest6* this, PlayState* play, EnTest6Struct* ptr);
+typedef struct SoTCsAmmoDrops {
+ /* 0x00 */ SoTCsAmmoDropType type;
+ /* 0x04 */ f32 scale;
+ /* 0x08 */ Vec3f pos;
+ /* 0x14 */ SoTCsAmmoDropDrawFunc draw;
+} SoTCsAmmoDrops; // size = 0x18
+
+void EnTest6_DrawAmmoDropDefault(EnTest6* this, PlayState* play, SoTCsAmmoDrops* ammoDrop);
+void EnTest6_DrawAmmoDropRupee(EnTest6* this, PlayState* play, SoTCsAmmoDrops* ammoDrop);
void EnTest6_SetupAction(EnTest6* this, EnTest6ActionFunc actionFunc);
-void func_80A9156C(EnTest6* this, PlayState* play);
-void func_80A91690(EnTest6* this, PlayState* play);
-void func_80A91760(EnTest6* this, PlayState* play);
-void func_80A920C8(EnTest6* this, PlayState* play);
-void func_80A92188(EnTest6* this, PlayState* play);
-void func_80A92950(EnTest6* this, PlayState* play);
+void EnTest6_StartCutscene(EnTest6* this, PlayState* play);
+void EnTest6_SetupInvertedSoTCutscene(EnTest6* this, PlayState* play);
+void EnTest6_InvertedSoTCutscene(EnTest6* this, PlayState* play);
+void EnTest6_SetupDoubleSoTCutscene(EnTest6* this, PlayState* play);
+void EnTest6_DoubleSoTCutscene(EnTest6* this, PlayState* play);
+void EnTest6_SharedSoTCutscene(EnTest6* this, PlayState* play);
-EnTest6Struct D_80A94910[12];
+SoTCsAmmoDrops sSoTCsAmmoDrops[12];
ActorInit En_Test6_InitVars = {
ACTOR_EN_TEST6,
@@ -54,132 +63,167 @@ 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 sDoubleSoTCsCamData[] = {
+ // 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[] = {
- NULL, gDropArrows2Tex, gDropBombTex, gDropDekuNutTex, gDropDekuStickTex, gRupeeGreenTex, gRupeeBlueTex,
+TexturePtr sSoTCsAmmoDropTextures[] = {
+ NULL, // SOTCS_AMMO_DROP_NONE
+ gDropArrows2Tex, // SOTCS_AMMO_DROP_ARROWS
+ gDropBombTex, // SOTCS_AMMO_DROP_BOMB
+ gDropDekuNutTex, // SOTCS_AMMO_DROP_DEKU_NUT
+ gDropDekuStickTex, // SOTCS_AMMO_DROP_DEKU_STICK
+ gRupeeGreenTex, // SOTCS_AMMO_DROP_RUPEE_GREEN
+ gRupeeBlueTex, // SOTCS_AMMO_DROP_RUPEE_BLUE
};
-Color_RGB8 D_80A94048 = { 230, 230, 220 };
-Color_RGB8 D_80A9404C = { 120, 120, 100 };
-Color_RGB8 D_80A94050 = { 0, 0, 0 };
+typedef enum SoTCsDrawType {
+ /* 0 */ SOTCS_DRAW_DOUBLE_SOT,
+ /* 1 */ SOTCS_DRAW_RESET_CYCLE_SOT,
+ /* 2 */ SOTCS_DRAW_INVERTED_SOT,
+ /* 99 */ SOTCS_DRAW_TYPE_NONE = 99
+} SoTCsDrawType;
-s16 D_80A94054 = 500;
-s16 D_80A94058 = 1500;
+#define SOTCS_AMMO_FLAG_RUPEE (1 << 0)
+#define SOTCS_AMMO_FLAG_BOMB (1 << 1)
+#define SOTCS_AMMO_FLAG_NUT (1 << 2)
+#define SOTCS_AMMO_FLAG_ARROW (1 << 4)
-static Vec3f sSubCamUp = { 0.0f, 1.0f, 0.0f };
-
-Color_RGB8 D_80A94068 = { 225, 230, 225 };
-Color_RGB8 D_80A9406C = { 120, 120, 100 };
-Color_RGB8 D_80A94070 = { 0, 0, 0 };
-
-s16 D_80A94074 = 940;
-s16 D_80A94078 = 2000;
-
-void func_80A90730(EnTest6* this, PlayState* play) {
+void EnTest6_SetupCutscene(EnTest6* this, PlayState* play) {
s32 i;
Player* player = GET_PLAYER(play);
- s32 phi_s0;
- f32 phi_f24;
+ s32 ammoFlags;
+ f32 yOffset;
this->actor.home.pos = player->actor.world.pos;
this->actor.home.rot = player->actor.shape.rot;
- switch (ENTEST6_GET(&this->actor)) {
- case ENTEST6_24:
- case ENTEST6_25:
- func_80A91690(this, play);
- ActorCutscene_SetIntentToPlay(play->playerActorCsIds[8]);
- return;
+ switch (SOTCS_GET_OCARINA_MODE(&this->actor)) {
+ case OCARINA_MODE_APPLY_INV_SOT_FAST:
+ case OCARINA_MODE_APPLY_INV_SOT_SLOW:
+ EnTest6_SetupInvertedSoTCutscene(this, play);
+ CutsceneManager_Queue(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]);
+ break;
- case ENTEST6_26:
- func_80A920C8(this, play);
- ActorCutscene_SetIntentToPlay(play->playerActorCsIds[8]);
- return;
- }
+ case OCARINA_MODE_APPLY_DOUBLE_SOT:
+ EnTest6_SetupDoubleSoTCutscene(this, play);
+ CutsceneManager_Queue(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]);
+ break;
- phi_s0 = 0;
- phi_f24 = -900.0f;
+ default: // Setup "return to first day cutscene"
+ ammoFlags = 0;
+ yOffset = -900.0f;
- if (CHECK_EVENTINF(EVENTINF_70)) {
- for (i = 0; i < 6; i++) {
- D_80A94910[(s32)(Rand_ZeroOne() * ARRAY_COUNT(D_80A94910))].unk_00 = 5;
- }
- D_80A94910[(s32)(Rand_ZeroOne() * ARRAY_COUNT(D_80A94910))].unk_00 = 5;
- D_80A94910[(s32)(Rand_ZeroOne() * ARRAY_COUNT(D_80A94910))].unk_00 = 6;
- phi_s0 |= 1;
- }
+ if (CHECK_EVENTINF(EVENTINF_THREEDAYRESET_LOST_RUPEES)) {
+ for (i = 0; i < 6; i++) {
+ sSoTCsAmmoDrops[(s32)(Rand_ZeroOne() * ARRAY_COUNT(sSoTCsAmmoDrops))].type =
+ SOTCS_AMMO_DROP_RUPEE_GREEN;
+ }
+ sSoTCsAmmoDrops[(s32)(Rand_ZeroOne() * ARRAY_COUNT(sSoTCsAmmoDrops))].type =
+ SOTCS_AMMO_DROP_RUPEE_GREEN;
+ sSoTCsAmmoDrops[(s32)(Rand_ZeroOne() * ARRAY_COUNT(sSoTCsAmmoDrops))].type = SOTCS_AMMO_DROP_RUPEE_BLUE;
+ ammoFlags |= SOTCS_AMMO_FLAG_RUPEE;
+ }
- if (CHECK_EVENTINF(EVENTINF_74)) {
- D_80A94910[(s32)(Rand_ZeroOne() * ARRAY_COUNT(D_80A94910))].unk_00 = 1;
- D_80A94910[(s32)(Rand_ZeroOne() * ARRAY_COUNT(D_80A94910))].unk_00 = 1;
- if (!(phi_s0 & 1)) {
- D_80A94910[(s32)(Rand_ZeroOne() * ARRAY_COUNT(D_80A94910))].unk_00 = 1;
- D_80A94910[(s32)(Rand_ZeroOne() * ARRAY_COUNT(D_80A94910))].unk_00 = 1;
- }
- phi_s0 |= 0x10;
- }
+ if (CHECK_EVENTINF(EVENTINF_THREEDAYRESET_LOST_ARROW_AMMO)) {
+ sSoTCsAmmoDrops[(s32)(Rand_ZeroOne() * ARRAY_COUNT(sSoTCsAmmoDrops))].type = SOTCS_AMMO_DROP_ARROWS;
+ sSoTCsAmmoDrops[(s32)(Rand_ZeroOne() * ARRAY_COUNT(sSoTCsAmmoDrops))].type = SOTCS_AMMO_DROP_ARROWS;
+ if (!(ammoFlags & SOTCS_AMMO_FLAG_RUPEE)) {
+ sSoTCsAmmoDrops[(s32)(Rand_ZeroOne() * ARRAY_COUNT(sSoTCsAmmoDrops))].type = SOTCS_AMMO_DROP_ARROWS;
+ sSoTCsAmmoDrops[(s32)(Rand_ZeroOne() * ARRAY_COUNT(sSoTCsAmmoDrops))].type = SOTCS_AMMO_DROP_ARROWS;
+ }
+ ammoFlags |= SOTCS_AMMO_FLAG_ARROW;
+ }
- if (CHECK_EVENTINF(EVENTINF_71)) {
- D_80A94910[(s32)(Rand_ZeroOne() * ARRAY_COUNT(D_80A94910))].unk_00 = 2;
- D_80A94910[(s32)(Rand_ZeroOne() * ARRAY_COUNT(D_80A94910))].unk_00 = 2;
- if (!(phi_s0 & 1)) {
- D_80A94910[(s32)(Rand_ZeroOne() * ARRAY_COUNT(D_80A94910))].unk_00 = 2;
- D_80A94910[(s32)(Rand_ZeroOne() * ARRAY_COUNT(D_80A94910))].unk_00 = 2;
- }
- phi_s0 |= 2;
- }
+ if (CHECK_EVENTINF(EVENTINF_THREEDAYRESET_LOST_BOMB_AMMO)) {
+ sSoTCsAmmoDrops[(s32)(Rand_ZeroOne() * ARRAY_COUNT(sSoTCsAmmoDrops))].type = SOTCS_AMMO_DROP_BOMB;
+ sSoTCsAmmoDrops[(s32)(Rand_ZeroOne() * ARRAY_COUNT(sSoTCsAmmoDrops))].type = SOTCS_AMMO_DROP_BOMB;
+ if (!(ammoFlags & SOTCS_AMMO_FLAG_RUPEE)) {
+ sSoTCsAmmoDrops[(s32)(Rand_ZeroOne() * ARRAY_COUNT(sSoTCsAmmoDrops))].type = SOTCS_AMMO_DROP_BOMB;
+ sSoTCsAmmoDrops[(s32)(Rand_ZeroOne() * ARRAY_COUNT(sSoTCsAmmoDrops))].type = SOTCS_AMMO_DROP_BOMB;
+ }
+ ammoFlags |= SOTCS_AMMO_FLAG_BOMB;
+ }
- if (CHECK_EVENTINF(EVENTINF_72)) {
- D_80A94910[(s32)(Rand_ZeroOne() * ARRAY_COUNT(D_80A94910))].unk_00 = 3;
- if (!(phi_s0 & (0x10 | 0x2 | 0x1))) {
- D_80A94910[(s32)(Rand_ZeroOne() * ARRAY_COUNT(D_80A94910))].unk_00 = 3;
- }
- phi_s0 |= 4;
- }
+ if (CHECK_EVENTINF(EVENTINF_THREEDAYRESET_LOST_NUT_AMMO)) {
+ sSoTCsAmmoDrops[(s32)(Rand_ZeroOne() * ARRAY_COUNT(sSoTCsAmmoDrops))].type = SOTCS_AMMO_DROP_DEKU_NUT;
+ if (!(ammoFlags & (SOTCS_AMMO_FLAG_ARROW | SOTCS_AMMO_FLAG_BOMB | SOTCS_AMMO_FLAG_RUPEE))) {
+ sSoTCsAmmoDrops[(s32)(Rand_ZeroOne() * ARRAY_COUNT(sSoTCsAmmoDrops))].type =
+ SOTCS_AMMO_DROP_DEKU_NUT;
+ }
+ ammoFlags |= SOTCS_AMMO_FLAG_NUT;
+ }
- if (CHECK_EVENTINF(EVENTINF_73)) {
- D_80A94910[(s32)(Rand_ZeroOne() * ARRAY_COUNT(D_80A94910))].unk_00 = 4;
- if (!(phi_s0 & (0x10 | 0x2 | 0x1))) {
- D_80A94910[(s32)(Rand_ZeroOne() * ARRAY_COUNT(D_80A94910))].unk_00 = 4;
- }
- }
+ if (CHECK_EVENTINF(EVENTINF_THREEDAYRESET_LOST_STICK_AMMO)) {
+ sSoTCsAmmoDrops[(s32)(Rand_ZeroOne() * ARRAY_COUNT(sSoTCsAmmoDrops))].type = SOTCS_AMMO_DROP_DEKU_STICK;
+ if (!(ammoFlags & (SOTCS_AMMO_FLAG_ARROW | SOTCS_AMMO_FLAG_BOMB | SOTCS_AMMO_FLAG_RUPEE))) {
+ sSoTCsAmmoDrops[(s32)(Rand_ZeroOne() * ARRAY_COUNT(sSoTCsAmmoDrops))].type =
+ SOTCS_AMMO_DROP_DEKU_STICK;
+ }
+ }
- for (i = 0; i < ARRAY_COUNT(D_80A94910); i++) {
- D_80A94910[i].unk_08 = ((2.0f * Rand_ZeroOne()) - 1.0f) * 80.0f;
- D_80A94910[i].unk_10 = ((2.0f * Rand_ZeroOne()) - 1.0f) * 80.0f;
- D_80A94910[i].unk_0C = (((2.0f * Rand_ZeroOne()) - 1.0f) * 40.0f) + phi_f24;
- D_80A94910[i].unk_04 = -10.0f;
- if (D_80A94910[i].unk_00 < 5) {
- D_80A94910[i].unk_14 = func_80A90D34;
- } else {
- D_80A94910[i].unk_14 = func_80A90FC0;
- }
- phi_f24 += 50.0f;
+ for (i = 0; i < ARRAY_COUNT(sSoTCsAmmoDrops); i++) {
+ sSoTCsAmmoDrops[i].pos.x = ((2.0f * Rand_ZeroOne()) - 1.0f) * 80.0f;
+ sSoTCsAmmoDrops[i].pos.z = ((2.0f * Rand_ZeroOne()) - 1.0f) * 80.0f;
+ sSoTCsAmmoDrops[i].pos.y = (((2.0f * Rand_ZeroOne()) - 1.0f) * 40.0f) + yOffset;
+ sSoTCsAmmoDrops[i].scale = -10.0f;
+ if (sSoTCsAmmoDrops[i].type <= SOTCS_AMMO_DROP_DEKU_STICK) {
+ sSoTCsAmmoDrops[i].draw = EnTest6_DrawAmmoDropDefault;
+ } else {
+ sSoTCsAmmoDrops[i].draw = EnTest6_DrawAmmoDropRupee;
+ }
+ yOffset += 50.0f;
+ }
+ break;
}
}
@@ -191,43 +235,45 @@ void EnTest6_DisableMotionBlur(void) {
Play_DisableMotionBlur();
}
-void func_80A90C54(PlayState* play, f32 arg1) {
+void EnTest6_EnableWhiteFillScreen(PlayState* play, f32 alphaRatio) {
play->envCtx.fillScreen = true;
play->envCtx.screenFillColor[0] = 250;
play->envCtx.screenFillColor[1] = 250;
play->envCtx.screenFillColor[2] = 250;
- play->envCtx.screenFillColor[3] = 255.0f * arg1;
+ play->envCtx.screenFillColor[3] = 255.0f * alphaRatio;
}
-void func_80A90D20(PlayState* play) {
+void EnTest6_DisableWhiteFillScreen(PlayState* play) {
play->envCtx.fillScreen = false;
}
-void func_80A90D34(EnTest6* this, PlayState* play, EnTest6Struct* ptr) {
+void EnTest6_DrawAmmoDropDefault(EnTest6* this, PlayState* play, SoTCsAmmoDrops* ammoDrop) {
s32 pad;
OPEN_DISPS(play->state.gfxCtx);
- if (ptr->unk_00 != 0) {
- 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);
+ if (ammoDrop->type != SOTCS_AMMO_DROP_NONE) {
+ Matrix_Translate(ammoDrop->pos.x * ammoDrop->scale, ammoDrop->pos.y, ammoDrop->pos.z * ammoDrop->scale,
+ MTXMODE_NEW);
+ Matrix_Scale(ammoDrop->scale * 0.02f, ammoDrop->scale * 0.02f, ammoDrop->scale * 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]));
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sSoTCsAmmoDropTextures[ammoDrop->type]));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gItemDropDL);
}
- Matrix_Translate(ptr->unk_08 * ptr->unk_04, ptr->unk_0C, ptr->unk_10 * ptr->unk_04, MTXMODE_NEW);
- Matrix_Scale(2.0f * ptr->unk_04, 2.0f * ptr->unk_04, 2.0f * ptr->unk_04, MTXMODE_APPLY);
+ Matrix_Translate(ammoDrop->pos.x * ammoDrop->scale, ammoDrop->pos.y, ammoDrop->pos.z * ammoDrop->scale,
+ MTXMODE_NEW);
+ Matrix_Scale(2.0f * ammoDrop->scale, 2.0f * ammoDrop->scale, 2.0f * ammoDrop->scale, MTXMODE_APPLY);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
Matrix_RotateZS(play->state.frames * 512, MTXMODE_APPLY);
Matrix_Translate(0.0f, 0.0f, 2.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);
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 210, 210, 230, 128);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 0);
@@ -238,48 +284,50 @@ void func_80A90D34(EnTest6* this, PlayState* play, EnTest6Struct* ptr) {
CLOSE_DISPS(play->state.gfxCtx);
}
-void func_80A90FC0(EnTest6* this, PlayState* play, EnTest6Struct* ptr) {
+void EnTest6_DrawAmmoDropRupee(EnTest6* this, PlayState* play, SoTCsAmmoDrops* ammoDrop) {
s32 pad;
Gfx* gfxHead = GRAPH_ALLOC(play->state.gfxCtx, 2 * sizeof(Gfx));
Gfx* gfx = gfxHead;
- Hilite* sp70;
- Vec3f sp64;
+ Hilite* hilite;
+ Vec3f ammoDropPos;
- sp64.x = ptr->unk_08 * ptr->unk_04;
- sp64.y = ptr->unk_0C;
- sp64.z = ptr->unk_10 * ptr->unk_04;
+ ammoDropPos.x = ammoDrop->pos.x * ammoDrop->scale;
+ ammoDropPos.y = ammoDrop->pos.y;
+ ammoDropPos.z = ammoDrop->pos.z * ammoDrop->scale;
- sp70 = func_800BCBF4(&sp64, play);
+ hilite = func_800BCBF4(&ammoDropPos, play);
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);
+ //! FAKE: & 0xFFFF
+ gDPSetTileSize(gfx++, 1, hilite->h.x1 & 0xFFFF, hilite->h.y1 & 0xFFFF, (hilite->h.x1 + 60) & 0xFFFF,
+ (hilite->h.y1 + 60) & 0xFFFF);
gSPEndDisplayList(gfx++);
gSPSegment(POLY_OPA_DISP++, 0x07, gfxHead);
- Matrix_Translate(sp64.x, sp64.y, sp64.z, MTXMODE_NEW);
- Matrix_Scale(ptr->unk_04 * 0.018f, ptr->unk_04 * 0.018f, ptr->unk_04 * 0.018f, MTXMODE_APPLY);
+ Matrix_Translate(ammoDropPos.x, ammoDropPos.y, ammoDropPos.z, MTXMODE_NEW);
+ Matrix_Scale(ammoDrop->scale * 0.018f, ammoDrop->scale * 0.018f, ammoDrop->scale * 0.018f, MTXMODE_APPLY);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
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(D_80A9402C[ptr->unk_00]));
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sSoTCsAmmoDropTextures[ammoDrop->type]));
gSPDisplayList(POLY_OPA_DISP++, gRupeeDL);
}
- Matrix_Translate(ptr->unk_08 * ptr->unk_04, ptr->unk_0C, ptr->unk_10 * ptr->unk_04, MTXMODE_NEW);
- Matrix_Scale(ptr->unk_04 * 2.5f, ptr->unk_04 * 2.5f, ptr->unk_04 * 2.5f, MTXMODE_APPLY);
+ Matrix_Translate(ammoDrop->pos.x * ammoDrop->scale, ammoDrop->pos.y, ammoDrop->pos.z * ammoDrop->scale,
+ MTXMODE_NEW);
+ Matrix_Scale(ammoDrop->scale * 2.5f, ammoDrop->scale * 2.5f, ammoDrop->scale * 2.5f, MTXMODE_APPLY);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
Matrix_RotateZS(play->state.frames * 256, MTXMODE_APPLY);
Matrix_Translate(0.0f, 0.0f, 4.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);
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 220, 220, 230, 192);
gDPSetEnvColor(POLY_XLU_DISP++, 128, 128, 128, 0);
@@ -299,9 +347,10 @@ void EnTest6_Init(Actor* thisx, PlayState* play2) {
EnTest6* this = THIS;
s32 i;
- if (((ENTEST6_GET(&this->actor) == ENTEST6_24) || (ENTEST6_GET(&this->actor) == ENTEST6_25) ||
- (ENTEST6_GET(&this->actor) == ENTEST6_26)) &&
- (play->playerActorCsIds[8] == -1)) {
+ if (((SOTCS_GET_OCARINA_MODE(&this->actor) == OCARINA_MODE_APPLY_INV_SOT_FAST) ||
+ (SOTCS_GET_OCARINA_MODE(&this->actor) == OCARINA_MODE_APPLY_INV_SOT_SLOW) ||
+ (SOTCS_GET_OCARINA_MODE(&this->actor) == OCARINA_MODE_APPLY_DOUBLE_SOT)) &&
+ (play->playerCsIds[PLAYER_CS_ID_SONG_WARP] == CS_ID_NONE)) {
Actor_Kill(&this->actor);
return;
}
@@ -312,12 +361,13 @@ void EnTest6_Init(Actor* thisx, PlayState* play2) {
this->lights[i].node = LightContext_InsertLight(play, &play->lightCtx, &this->lights[i].info);
}
- this->unk_286 = 0;
- this->unk_274 = 0;
- this->unk_278 = 0;
- this->unk_276 = 99;
- func_80A90730(this, play);
- EnTest6_SetupAction(this, func_80A9156C);
+ this->screenFillAlpha = 0;
+ this->cueId = SOTCS_CUEID_NONE;
+ this->invSoTClockYaw = 0;
+ this->drawType = SOTCS_DRAW_TYPE_NONE;
+
+ EnTest6_SetupCutscene(this, play);
+ EnTest6_SetupAction(this, EnTest6_StartCutscene);
}
void EnTest6_Destroy(Actor* thisx, PlayState* play2) {
@@ -325,20 +375,25 @@ void EnTest6_Destroy(Actor* thisx, PlayState* play2) {
EnTest6* this = THIS;
s32 i;
- play->envCtx.lightSettings.ambientColor[0] = 0;
- play->envCtx.lightSettings.ambientColor[1] = 0;
- play->envCtx.lightSettings.ambientColor[2] = 0;
- play->envCtx.lightSettings.diffuseColor1[0] = 0;
- play->envCtx.lightSettings.diffuseColor1[1] = 0;
- play->envCtx.lightSettings.diffuseColor1[2] = 0;
- play->envCtx.lightSettings.diffuseColor2[0] = 0;
- play->envCtx.lightSettings.diffuseColor2[1] = 0;
- play->envCtx.lightSettings.diffuseColor2[2] = 0;
- play->envCtx.lightSettings.fogColor[0] = 0;
- play->envCtx.lightSettings.fogColor[1] = 0;
- play->envCtx.lightSettings.fogColor[2] = 0;
- play->envCtx.lightSettings.fogNear = 0;
- play->envCtx.lightSettings.zFar = 0;
+ play->envCtx.adjLightSettings.ambientColor[0] = 0;
+ play->envCtx.adjLightSettings.ambientColor[1] = 0;
+ play->envCtx.adjLightSettings.ambientColor[2] = 0;
+
+ play->envCtx.adjLightSettings.light1Color[0] = 0;
+ play->envCtx.adjLightSettings.light1Color[1] = 0;
+ play->envCtx.adjLightSettings.light1Color[2] = 0;
+
+ play->envCtx.adjLightSettings.light2Color[0] = 0;
+ play->envCtx.adjLightSettings.light2Color[1] = 0;
+ play->envCtx.adjLightSettings.light2Color[2] = 0;
+
+ play->envCtx.adjLightSettings.fogColor[0] = 0;
+ play->envCtx.adjLightSettings.fogColor[1] = 0;
+ play->envCtx.adjLightSettings.fogColor[2] = 0;
+
+ play->envCtx.adjLightSettings.fogNear = 0;
+ play->envCtx.adjLightSettings.zFar = 0;
+
play->envCtx.fillScreen = false;
for (i = 0; i < ARRAY_COUNT(this->lights); i++) {
@@ -346,283 +401,325 @@ void EnTest6_Destroy(Actor* thisx, PlayState* play2) {
}
}
-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]);
+void EnTest6_StartCutscene(EnTest6* this, PlayState* play) {
+ switch (SOTCS_GET_OCARINA_MODE(&this->actor)) {
+ case OCARINA_MODE_APPLY_INV_SOT_FAST:
+ case OCARINA_MODE_APPLY_INV_SOT_SLOW:
+ 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]);
- EnTest6_SetupAction(this, func_80A91760);
+ CutsceneManager_Start(play->playerCsIds[PLAYER_CS_ID_SONG_WARP], NULL);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]);
+ EnTest6_SetupAction(this, EnTest6_InvertedSoTCutscene);
}
break;
- case ENTEST6_26:
- if (!ActorCutscene_GetCanPlayNext(play->playerActorCsIds[8])) {
- ActorCutscene_SetIntentToPlay(play->playerActorCsIds[8]);
+ case OCARINA_MODE_APPLY_DOUBLE_SOT:
+ 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]);
- EnTest6_SetupAction(this, func_80A92188);
+ CutsceneManager_Start(play->playerCsIds[PLAYER_CS_ID_SONG_WARP], NULL);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]);
+ EnTest6_SetupAction(this, EnTest6_DoubleSoTCutscene);
}
break;
default:
- gSaveContext.save.daysElapsed = 0;
- gSaveContext.save.day = false;
+ gSaveContext.save.eventDayCount = 0;
+ gSaveContext.save.day = 0;
gSaveContext.save.time = CLOCK_TIME(6, 0) - 1;
- EnTest6_SetupAction(this, func_80A92950);
+ EnTest6_SetupAction(this, EnTest6_SharedSoTCutscene);
break;
}
}
-void func_80A91690(EnTest6* this, PlayState* play) {
- this->unk_274 = 90;
- this->unk_27A = 100;
- this->unk_286 = 0;
- if (ENTEST6_GET(&this->actor) == ENTEST6_25) {
- play_sound(NA_SE_SY_TIME_CONTROL_SLOW);
- } else if (ENTEST6_GET(&this->actor) == ENTEST6_24) {
- play_sound(NA_SE_SY_TIME_CONTROL_NORMAL);
+void EnTest6_SetupInvertedSoTCutscene(EnTest6* this, PlayState* play) {
+ this->cueId = SOTCS_CUEID_INV_INIT;
+ this->timer = 100;
+ this->screenFillAlpha = 0;
+
+ if (SOTCS_GET_OCARINA_MODE(&this->actor) == OCARINA_MODE_APPLY_INV_SOT_SLOW) {
+ Audio_PlaySfx(NA_SE_SY_TIME_CONTROL_SLOW);
+ } else if (SOTCS_GET_OCARINA_MODE(&this->actor) == OCARINA_MODE_APPLY_INV_SOT_FAST) {
+ Audio_PlaySfx(NA_SE_SY_TIME_CONTROL_NORMAL);
}
}
-void func_80A916F0(EnTest6* this, PlayState* play) {
+void EnTest6_StopInvertedSoTCutscene(EnTest6* this, PlayState* play) {
Player* player = GET_PLAYER(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);
}
-void func_80A91760(EnTest6* this, PlayState* play) {
+Color_RGB8 sInvSoTCsFogColor = { 230, 230, 220 };
+Color_RGB8 sInvSoTCsAmbientColor = { 120, 120, 100 };
+Color_RGB8 sInvSoTCsDiffuseColor = { 0, 0, 0 };
+s16 sInvSoTCsFogNear = 500;
+s16 sInvSoTCsZFar = 1500;
+
+void EnTest6_InvertedSoTCutscene(EnTest6* this, PlayState* play) {
Input* input = CONTROLLER1(&play->state);
- s16 temp_s0;
+ s16 clockYaw;
Player* player = GET_PLAYER(play);
Camera* mainCam;
Vec3f subCamAt;
Vec3f subCamEye;
- Vec3f sp54;
+ Vec3f eyeNext;
s32 i;
- f32 sp4C;
- Camera* subCam = Play_GetCamera(play, this->subCamId);
+ f32 temp;
+ Camera* subCam;
+ subCam = Play_GetCamera(play, this->subCamId);
mainCam = Play_GetCamera(play, CAM_ID_MAIN);
- switch (this->unk_274) {
- 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;
+ // Update cutscene effects
+ switch (this->cueId) {
+ case SOTCS_CUEID_INV_INIT:
+ this->drawType = SOTCS_DRAW_INVERTED_SOT;
+ this->invSoTEnvLerp = 0.0f;
+ this->speed = 0.1f;
+ this->alpha = 0;
+ this->invSoTClockYaw = 0;
+ this->cueId = SOTCS_CUEID_INV_SETUP_CLOCKS;
break;
- case 91:
- this->unk_15C += this->unk_14C;
- func_800FD59C(play, &D_80A9404C, this->unk_15C);
- func_800FD5E0(play, &D_80A94050, this->unk_15C);
- func_800FD654(play, &D_80A94048, this->unk_15C);
- func_800FD698(play, D_80A94054, D_80A94058, this->unk_15C);
+ case SOTCS_CUEID_INV_SETUP_CLOCKS:
+ this->invSoTEnvLerp += this->speed;
+ Environment_LerpAmbientColor(play, &sInvSoTCsAmbientColor, this->invSoTEnvLerp);
+ Environment_LerpDiffuseColor(play, &sInvSoTCsDiffuseColor, this->invSoTEnvLerp);
+ Environment_LerpFogColor(play, &sInvSoTCsFogColor, this->invSoTEnvLerp);
+ Environment_LerpFog(play, sInvSoTCsFogNear, sInvSoTCsZFar, this->invSoTEnvLerp);
- if (this->unk_27A == 90) {
- this->unk_282 = 0;
- if (ENTEST6_GET(&this->actor) == ENTEST6_24) {
- this->unk_27C = 0x200;
- this->unk_150 = 0.0f;
- sp4C = -100.0f;
+ if (this->timer == 90) {
+ this->alpha = 0;
+ if (SOTCS_GET_OCARINA_MODE(&this->actor) == OCARINA_MODE_APPLY_INV_SOT_FAST) {
+ this->clockAngle = 0x200;
+ this->clockDist = 0.0f;
+ temp = -100.0f;
} else {
- this->unk_27C = 0x570;
- this->unk_150 = 110.0f;
- sp4C = 100.0f;
+ this->clockAngle = 0x570;
+ this->clockDist = 110.0f;
+ temp = 100.0f;
}
- this->unk_14C = 1.0f;
+ this->speed = 1.0f;
- for (i = 0; i < ARRAY_COUNT(this->unk_20C); i++) {
- this->unk_20C[i].x = player->actor.world.pos.x;
- this->unk_20C[i].y = player->actor.world.pos.y;
- this->unk_20C[i].z = player->actor.world.pos.z;
+ for (i = 0; i < SOTCS_INV_NUM_CLOCKS; i++) {
+ this->invSoTClockPos[i].x = player->actor.world.pos.x;
+ this->invSoTClockPos[i].y = player->actor.world.pos.y;
+ this->invSoTClockPos[i].z = player->actor.world.pos.z;
}
- this->unk_254 = ZeldaArena_Malloc(sizeof(Vec3f) * 64);
- if (this->unk_254 != NULL) {
- for (i = 0; i < ARRAY_COUNT(this->unk_254[0]); i++) {
- (*this->unk_254)[i].x = (((2.0f * Rand_ZeroOne()) - 1.0f) * 40.0f) + subCam->eye.x +
- ((subCam->at.x - subCam->eye.x) * 0.2f);
- (*this->unk_254)[i].y = (((2.0f * Rand_ZeroOne()) - 1.0f) * 120.0f) + subCam->eye.y +
- ((subCam->at.y - subCam->eye.y) * 0.2f) + sp4C;
- (*this->unk_254)[i].z = (((2.0f * Rand_ZeroOne()) - 1.0f) * 40.0f) + subCam->eye.z +
- ((subCam->at.z - subCam->eye.z) * 0.2f);
+ this->invSoTParticles = ZeldaArena_Malloc(sizeof(Vec3f) * SOTCS_NUM_PARTICLES);
+ if (this->invSoTParticles != NULL) {
+ for (i = 0; i < ARRAY_COUNT(this->invSoTParticles[0]); i++) {
+ (*this->invSoTParticles)[i].x = (((2.0f * Rand_ZeroOne()) - 1.0f) * 40.0f) + subCam->eye.x +
+ ((subCam->at.x - subCam->eye.x) * 0.2f);
+ (*this->invSoTParticles)[i].y = (((2.0f * Rand_ZeroOne()) - 1.0f) * 120.0f) + subCam->eye.y +
+ ((subCam->at.y - subCam->eye.y) * 0.2f) + temp;
+ (*this->invSoTParticles)[i].z = (((2.0f * Rand_ZeroOne()) - 1.0f) * 40.0f) + subCam->eye.z +
+ ((subCam->at.z - subCam->eye.z) * 0.2f);
}
}
+
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 = SOTCS_CUEID_INV_CLOCKS;
}
break;
- case 95:
- if (this->unk_27A > 80) {
- this->unk_282 += 25;
+ case SOTCS_CUEID_INV_CLOCKS:
+ if (this->timer > 80) {
+ this->alpha += 25;
}
- if (this->unk_27A < 20) {
- this->unk_282 -= 25;
+ if (this->timer < 20) {
+ this->alpha -= 25;
}
- func_800FD59C(play, &D_80A9404C, this->unk_15C);
- func_800FD5E0(play, &D_80A94050, this->unk_15C);
- func_800FD654(play, &D_80A94048, this->unk_15C);
- func_800FD698(play, D_80A94054 + this->unk_282, D_80A94058 + this->unk_282, this->unk_15C);
+ Environment_LerpAmbientColor(play, &sInvSoTCsAmbientColor, this->invSoTEnvLerp);
+ Environment_LerpDiffuseColor(play, &sInvSoTCsDiffuseColor, this->invSoTEnvLerp);
+ Environment_LerpFogColor(play, &sInvSoTCsFogColor, this->invSoTEnvLerp);
+ Environment_LerpFog(play, sInvSoTCsFogNear + this->alpha, sInvSoTCsZFar + this->alpha, this->invSoTEnvLerp);
- this->unk_278 -= this->unk_27C;
- temp_s0 = this->unk_278;
- if (ENTEST6_GET(&this->actor) == ENTEST6_24) {
- this->unk_27C += 8;
- this->unk_150 += this->unk_14C;
+ this->invSoTClockYaw -= this->clockAngle;
+ clockYaw = this->invSoTClockYaw;
+
+ if (SOTCS_GET_OCARINA_MODE(&this->actor) == OCARINA_MODE_APPLY_INV_SOT_FAST) {
+ this->clockAngle += 8;
+ this->clockDist += this->speed;
} else {
- this->unk_27C -= 8;
- this->unk_150 -= this->unk_14C;
+ this->clockAngle -= 8;
+ this->clockDist -= this->speed;
}
- for (i = 0; i < ARRAY_COUNT(this->unk_20C); i++) {
- temp_s0 += 0x10000 / ARRAY_COUNT(this->unk_20C);
- if (player) {}
- this->unk_20C[i].x = (Math_SinS(temp_s0) * this->unk_150) + player->actor.world.pos.x;
- this->unk_20C[i].y = player->actor.world.pos.y;
- this->unk_20C[i].z = (Math_CosS(temp_s0) * this->unk_150) + player->actor.world.pos.z;
+ for (i = 0; i < SOTCS_INV_NUM_CLOCKS; i++) {
+ //! FAKE:
+ if (player != NULL) {}
+
+ clockYaw += 0x10000 / SOTCS_INV_NUM_CLOCKS;
+ this->invSoTClockPos[i].x = player->actor.world.pos.x + (Math_SinS(clockYaw) * this->clockDist);
+ this->invSoTClockPos[i].y = player->actor.world.pos.y;
+ this->invSoTClockPos[i].z = player->actor.world.pos.z + (Math_CosS(clockYaw) * this->clockDist);
}
- if (this->unk_254 != NULL) {
- for (i = 0; i < ARRAY_COUNT(this->unk_254[0]); i++) {
- (*this->unk_254)[i].x += 2.0f * ((2.0f * Rand_ZeroOne()) - 1.0f);
- if (ENTEST6_GET(&this->actor) == ENTEST6_24) {
- (*this->unk_254)[i].y += 1.0f;
+ if (this->invSoTParticles != NULL) {
+ for (i = 0; i < ARRAY_COUNT(this->invSoTParticles[0]); i++) {
+ // Wiggle in the x-direction
+ (*this->invSoTParticles)[i].x += 2.0f * ((2.0f * Rand_ZeroOne()) - 1.0f);
+
+ // Fall or rise depending on slow-down or speed-up
+ if (SOTCS_GET_OCARINA_MODE(&this->actor) == OCARINA_MODE_APPLY_INV_SOT_FAST) {
+ // Rise up
+ (*this->invSoTParticles)[i].y += 1.0f;
} else {
- if (1) {}
- (*this->unk_254)[i].y -= 1.0f;
+ // Fall down
+ (*this->invSoTParticles)[i].y -= 1.0f;
}
- (*this->unk_254)[i].z += 2.0f * ((2.0f * Rand_ZeroOne()) - 1.0f);
+ // Wiggle in the z-direction
+ (*this->invSoTParticles)[i].z += 2.0f * ((2.0f * Rand_ZeroOne()) - 1.0f);
}
}
- if (this->unk_27A == 10) {
- this->unk_14C = 0.1f;
+ if (this->timer == 10) {
+ this->speed = 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);
+ if (this->invSoTParticles != NULL) {
+ ZeldaArena_Free(this->invSoTParticles);
}
- this->unk_274 = 99;
+ this->cueId = SOTCS_CUEID_INV_END;
}
break;
- case 99:
- this->unk_15C -= this->unk_14C;
- func_800FD59C(play, &D_80A9404C, this->unk_15C);
- func_800FD5E0(play, &D_80A94050, this->unk_15C);
- func_800FD654(play, &D_80A94048, this->unk_15C);
- func_800FD698(play, D_80A94054, D_80A94058, this->unk_15C);
+ case SOTCS_CUEID_INV_END:
+ this->invSoTEnvLerp -= this->speed;
+ Environment_LerpAmbientColor(play, &sInvSoTCsAmbientColor, this->invSoTEnvLerp);
+ Environment_LerpDiffuseColor(play, &sInvSoTCsDiffuseColor, this->invSoTEnvLerp);
+ Environment_LerpFogColor(play, &sInvSoTCsFogColor, this->invSoTEnvLerp);
+ Environment_LerpFog(play, sInvSoTCsFogNear, sInvSoTCsZFar, this->invSoTEnvLerp);
+ break;
+
+ default:
break;
}
- if (this->unk_286 != 0) {
- func_800B7298(play, NULL, PLAYER_CSMODE_7);
+ // Update Player Cutscene Animation
+ if (this->screenFillAlpha != 0) {
+ func_800B7298(play, NULL, PLAYER_CSMODE_WAIT);
} else {
- if (this->unk_27A == 90) {
+ if (this->timer == 90) {
+ // Look side-to-side but downwards, with chin down
+ // gPlayerAnim_al_elf_tobidasi
func_800B7298(play, NULL, PLAYER_CSMODE_66);
}
- if (this->unk_27A == 70) {
+ if (this->timer == 70) {
+ // close eyes and sway body in circles
+ // gPlayerAnim_alink_yurayura
func_800B7298(play, NULL, PLAYER_CSMODE_82);
}
- if (this->unk_27A == 30) {
+ if (this->timer == 30) {
+ // Look side-to-side but upwards, with chin up
+ // gPlayerAnim_alink_kyoro
func_800B7298(play, NULL, PLAYER_CSMODE_81);
}
- if (this->unk_27A == 5) {
+ if (this->timer == 5) {
+ // Give a big nod of approval
+ // gPlayerAnim_al_yes
func_800B7298(play, NULL, PLAYER_CSMODE_74);
}
}
- if (this->unk_27A > 80) {
- subCam->fov += (90.0f - subCam->fov) / (this->unk_27A - 80);
- } else if (this->unk_27A > 60) {
- sp4C = 1.0f / (this->unk_27A - 60);
+ // Update camera
+ if (this->timer > 80) {
+ subCam->fov += (90.0f - subCam->fov) / (this->timer - 80);
+ } else if (this->timer > 60) {
+ temp = 1.0f / (this->timer - 60);
- subCamAt.x = subCam->at.x + ((player->actor.world.pos.x - subCam->at.x) * sp4C);
- subCamAt.y = subCam->at.y + (((player->actor.focus.pos.y - subCam->at.y) - 20.0f) * sp4C);
- subCamAt.z = subCam->at.z + ((player->actor.world.pos.z - subCam->at.z) * sp4C);
+ subCamAt.x = subCam->at.x + ((player->actor.world.pos.x - subCam->at.x) * temp);
+ subCamAt.y = subCam->at.y + (((player->actor.focus.pos.y - subCam->at.y) - 20.0f) * temp);
+ subCamAt.z = subCam->at.z + ((player->actor.world.pos.z - subCam->at.z) * temp);
- sp54.x = (Math_SinS(player->actor.world.rot.y) * 80.0f) + subCamAt.x;
- sp54.y = subCamAt.y + 20.0f;
- sp54.z = (Math_CosS(player->actor.world.rot.y) * 80.0f) + subCamAt.z;
- sp4C *= 0.75f;
+ eyeNext.x = subCamAt.x + (Math_SinS(player->actor.world.rot.y) * 80.0f);
+ eyeNext.y = subCamAt.y + 20.0f;
+ eyeNext.z = subCamAt.z + (Math_CosS(player->actor.world.rot.y) * 80.0f);
+ temp *= 0.75f;
- VEC3F_LERPIMPDST(&subCamEye, &subCam->eye, &sp54, sp4C);
+ VEC3F_LERPIMPDST(&subCamEye, &subCam->eye, &eyeNext, temp);
Play_SetCameraAtEye(play, this->subCamId, &subCamAt, &subCamEye);
- } else if ((this->unk_27A < 11) && (this->unk_27A > 0)) {
- subCam->fov += (mainCam->fov - subCam->fov) / this->unk_27A;
+ } else if ((this->timer < 11) && (this->timer > 0)) {
+ subCam->fov += (mainCam->fov - subCam->fov) / this->timer;
}
- if (this->unk_286 != 0) {
- func_80A90C54(play, this->unk_286 * 0.05f);
+ // Update white screen
+ if (this->screenFillAlpha != 0) {
+ EnTest6_EnableWhiteFillScreen(play, this->screenFillAlpha * 0.05f);
subCam->fov += (mainCam->fov - subCam->fov) * 0.05f;
- this->unk_286++;
- if (this->unk_286 >= 20) {
- this->unk_27A = 1;
+ this->screenFillAlpha++;
+ if (this->screenFillAlpha >= 20) {
+ this->timer = 1;
}
- } else if ((this->unk_27A <= 60) && (this->unk_27A > 40) &&
+ } else if ((this->timer <= 60) && (this->timer > 40) &&
(CHECK_BTN_ALL(input->press.button, BTN_A) || CHECK_BTN_ALL(input->press.button, BTN_B))) {
- this->unk_286 = 1;
- if (ENTEST6_GET(&this->actor) == ENTEST6_25) {
+ this->screenFillAlpha = 1;
+
+ if (SOTCS_GET_OCARINA_MODE(&this->actor) == OCARINA_MODE_APPLY_INV_SOT_SLOW) {
AudioSfx_StopById(NA_SE_SY_TIME_CONTROL_SLOW);
- } else if (ENTEST6_GET(&this->actor) == ENTEST6_24) {
+ } else if (SOTCS_GET_OCARINA_MODE(&this->actor) == OCARINA_MODE_APPLY_INV_SOT_FAST) {
AudioSfx_StopById(NA_SE_SY_TIME_CONTROL_NORMAL);
}
}
- if (DECR(this->unk_27A) == 0) {
- func_80A916F0(this, play);
- play->msgCtx.ocarinaMode = 4;
+ if (DECR(this->timer) == 0) {
+ EnTest6_StopInvertedSoTCutscene(this, play);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
}
}
-void func_80A920C8(EnTest6* this, PlayState* play) {
+void EnTest6_SetupDoubleSoTCutscene(EnTest6* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- this->unk_27A = 120;
- this->unk_286 = 0;
- this->unk_160 = 0.0f;
+ this->timer = 120;
+ this->screenFillAlpha = 0;
+ this->doubleSoTEnvLerp = 0.0f;
this->actor.home.pos = player->actor.world.pos;
this->actor.home.rot = player->actor.shape.rot;
}
-void func_80A92118(EnTest6* this, PlayState* play) {
+void EnTest6_StopDoubleSoTCutscene(EnTest6* this, PlayState* play) {
Player* player = GET_PLAYER(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);
}
-void func_80A92188(EnTest6* this, PlayState* play) {
+static Vec3f sSubCamUp = { 0.0f, 1.0f, 0.0f };
+
+Color_RGB8 sDoubleSoTCsFogColor = { 225, 230, 225 };
+Color_RGB8 sDoubleSoTCsAmbientColor = { 120, 120, 100 };
+Color_RGB8 sDoubleSoTCsDiffuseColor = { 0, 0, 0 };
+s16 sDoubleSoTCsFogNear = 940;
+s16 sDoubleSoTCsZFar = 2000;
+
+void EnTest6_DoubleSoTCutscene(EnTest6* this, PlayState* play) {
Input* input = CONTROLLER1(&play->state);
Player* player = GET_PLAYER(play);
Camera* subCam;
@@ -630,64 +727,64 @@ void func_80A92188(EnTest6* this, PlayState* play) {
s16 subCamId;
s16 pad2;
- if (this->unk_27A > 115) {
- this->unk_160 += 0.2f;
- func_80A90C54(play, this->unk_160);
- } else if (this->unk_27A > 90) {
- this->unk_160 -= 0.05f;
- func_80A90C54(play, this->unk_160);
- } else if (this->unk_27A == 90) {
- this->unk_160 = 0.0f;
- func_80A90D20(play);
+ if (this->timer > 115) {
+ this->doubleSoTEnvLerp += 0.2f;
+ EnTest6_EnableWhiteFillScreen(play, this->doubleSoTEnvLerp);
+ } else if (this->timer > 90) {
+ this->doubleSoTEnvLerp -= 0.05f;
+ EnTest6_EnableWhiteFillScreen(play, this->doubleSoTEnvLerp);
+ } else if (this->timer == 90) {
+ this->doubleSoTEnvLerp = 0.0f;
+ EnTest6_DisableWhiteFillScreen(play);
}
- if (this->unk_27A == 1) {
- this->unk_160 = 0.0f;
- func_80A90D20(play);
- } else if (this->unk_27A < 17) {
- this->unk_160 -= 0.06666666f;
- func_80A90C54(play, this->unk_160);
- } else if (this->unk_27A < 22) {
- this->unk_160 += 0.2f;
- func_80A90C54(play, this->unk_160);
+ if (this->timer == 1) {
+ this->doubleSoTEnvLerp = 0.0f;
+ EnTest6_DisableWhiteFillScreen(play);
+ } else if (this->timer < 17) {
+ this->doubleSoTEnvLerp -= 0.06666666f;
+ EnTest6_EnableWhiteFillScreen(play, this->doubleSoTEnvLerp);
+ } else if (this->timer < 22) {
+ this->doubleSoTEnvLerp += 0.2f;
+ EnTest6_EnableWhiteFillScreen(play, this->doubleSoTEnvLerp);
}
- if (this->unk_27A == 115) {
- func_800FD59C(play, &D_80A9406C, 1.0f);
- func_800FD5E0(play, &D_80A94070, 1.0f);
- func_800FD654(play, &D_80A94068, 1.0f);
- func_800FD698(play, D_80A94074, D_80A94078, 1.0f);
+ if (this->timer == 115) {
+ Environment_LerpAmbientColor(play, &sDoubleSoTCsAmbientColor, 1.0f);
+ Environment_LerpDiffuseColor(play, &sDoubleSoTCsDiffuseColor, 1.0f);
+ Environment_LerpFogColor(play, &sDoubleSoTCsFogColor, 1.0f);
+ Environment_LerpFog(play, sDoubleSoTCsFogNear, sDoubleSoTCsZFar, 1.0f);
play->unk_18844 = true;
}
- if (this->unk_27A == 15) {
- func_800FD59C(play, &D_80A9406C, 0.0f);
- func_800FD5E0(play, &D_80A94070, 0.0f);
- func_800FD654(play, &D_80A94068, 0.0f);
- func_800FD698(play, D_80A94074, D_80A94078, 0.0f);
+ if (this->timer == 15) {
+ Environment_LerpAmbientColor(play, &sDoubleSoTCsAmbientColor, 0.0f);
+ Environment_LerpDiffuseColor(play, &sDoubleSoTCsDiffuseColor, 0.0f);
+ Environment_LerpFogColor(play, &sDoubleSoTCsFogColor, 0.0f);
+ Environment_LerpFog(play, sDoubleSoTCsFogNear, sDoubleSoTCsZFar, 0.0f);
play->unk_18844 = false;
}
- if (this->unk_286 >= 20) {
- func_800FD59C(play, &D_80A9406C, this->unk_160);
- func_800FD5E0(play, &D_80A94070, this->unk_160);
- func_800FD654(play, &D_80A94068, this->unk_160);
- func_800FD698(play, D_80A94074, D_80A94078, this->unk_160);
+ if (this->screenFillAlpha >= 20) {
+ Environment_LerpAmbientColor(play, &sDoubleSoTCsAmbientColor, this->doubleSoTEnvLerp);
+ Environment_LerpDiffuseColor(play, &sDoubleSoTCsDiffuseColor, this->doubleSoTEnvLerp);
+ Environment_LerpFogColor(play, &sDoubleSoTCsFogColor, this->doubleSoTEnvLerp);
+ Environment_LerpFog(play, sDoubleSoTCsFogNear, sDoubleSoTCsZFar, this->doubleSoTEnvLerp);
play->unk_18844 = false;
}
- func_800B8F98(&player->actor, NA_SE_PL_FLYING_AIR - SFX_FLAG);
+ Actor_PlaySfx_FlaggedCentered1(&player->actor, NA_SE_PL_FLYING_AIR - SFX_FLAG);
- switch (this->unk_27A) {
+ switch (this->timer) {
case 119:
EnTest6_EnableMotionBlur(50);
break;
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 = SOTCS_CUEID_DOUBLE_INIT;
break;
case 110:
@@ -696,61 +793,64 @@ void func_80A92188(EnTest6* this, PlayState* play) {
case 38:
case 114:
- this->unk_274 = 1;
+ this->cueId = SOTCS_CUEID_DOUBLE_WAIT;
break;
case 76:
- this->unk_274 = 3;
+ this->cueId = SOTCS_CUEID_DOUBLE_CLOCKS_INWARD;
break;
case 61:
EnTest6_EnableMotionBlur(150);
- this->unk_274 = 4;
+ this->cueId = SOTCS_CUEID_DOUBLE_CLOCKS_SPIN;
break;
case 51:
EnTest6_EnableMotionBlur(180);
- this->unk_274 = 5;
+ this->cueId = SOTCS_CUEID_DOUBLE_CLOCKS_OUTWARD;
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 = SOTCS_CUEID_NONE;
break;
case 1:
EnTest6_DisableMotionBlur();
if (CHECK_EVENTINF(EVENTINF_52)) {
- this->unk_274 = 9;
+ this->cueId = SOTCS_CUEID_DOUBLE_END;
}
break;
+
+ default:
+ break;
}
- func_80A92950(this, play);
+ EnTest6_SharedSoTCutscene(this, play);
- if (this->unk_27A == 115) {
- subCamId = ActorCutscene_GetCurrentSubCamId(play->playerActorCsIds[8]);
+ if (this->timer == 115) {
+ 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->csCamInfo);
}
- if ((this->unk_27A <= 115) && (this->unk_27A >= 16)) {
- func_80161998(D_80A93E80, &this->unk_18C);
- } else if (this->unk_27A < 16) {
- subCamId = ActorCutscene_GetCurrentSubCamId(play->playerActorCsIds[8]);
+ if ((this->timer <= 115) && (this->timer >= 16)) {
+ CutsceneCamera_UpdateSplines((u8*)sDoubleSoTCsCamData, &this->csCamInfo);
+ } else if (this->timer < 16) {
+ 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);
Play_SetCameraRoll(play, subCamId, 0);
}
- switch (this->unk_27A) {
+ switch (this->timer) {
case 116:
player->actor.freezeTimer = 2;
player->actor.shape.rot.x = 0;
@@ -780,7 +880,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:
@@ -793,24 +893,27 @@ void func_80A92188(EnTest6* this, PlayState* play) {
player->unk_AC0 = 0.0f;
player->actor.shape.yOffset = 0.0f;
break;
+
+ default:
+ break;
}
- if ((this->unk_286 > 0) && (this->unk_286 < 20)) {
- func_80A90C54(play, this->unk_286 * 0.05f);
- this->unk_286++;
- if (this->unk_286 >= 20) {
- this->unk_27A = 15;
- this->unk_160 = 0.9333333f;
+ if ((this->screenFillAlpha > 0) && (this->screenFillAlpha < 20)) {
+ EnTest6_EnableWhiteFillScreen(play, this->screenFillAlpha * 0.05f);
+ this->screenFillAlpha++;
+ if (this->screenFillAlpha >= 20) {
+ this->timer = 15;
+ this->doubleSoTEnvLerp = 0.9333333f;
}
- } else if ((this->unk_27A < 96) && (this->unk_27A > 50) &&
+ } else if ((this->timer < 96) && (this->timer > 50) &&
(CHECK_BTN_ALL(input->press.button, BTN_A) || CHECK_BTN_ALL(input->press.button, BTN_B))) {
- this->unk_286 = 1;
- this->unk_27A = 39;
- Audio_QueueSeqCmd(0x111400FF);
+ this->screenFillAlpha = 1;
+ this->timer = 39;
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 20);
}
- if (DECR(this->unk_27A) == 0) {
- func_80A92118(this, play);
+ if (DECR(this->timer) == 0) {
+ EnTest6_StopDoubleSoTCutscene(this, play);
}
}
@@ -820,474 +923,497 @@ void EnTest6_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
}
-void func_80A92950(EnTest6* this, PlayState* play) {
+/**
+ * Processes two different cutscenes:
+ * return to "Dawn of the First Day" Cs, and Song of Double Time Cs
+ */
+void EnTest6_SharedSoTCutscene(EnTest6* this, PlayState* play) {
s32 pad[2];
Player* player = GET_PLAYER(play);
- f32 temp_f0;
+ f32 yDiff;
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_SOTCS)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_SOTCS);
+ this->cueId = play->csCtx.actorCues[cueChannel]->id;
- switch (this->unk_274) {
- case 1:
+ switch (this->cueId) {
+ case SOTCS_CUEID_DOUBLE_WAIT:
break;
- case 2:
- this->unk_276 = 0;
- this->unk_278 = 0;
- this->unk_27C = 0;
+ case SOTCS_CUEID_DOUBLE_INIT:
+ this->drawType = SOTCS_DRAW_DOUBLE_SOT;
+ this->counter = 0;
+ this->clockAngle = 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->clockSpeed = (u32)play->csCtx.actorCues[cueChannel]->startPos.x;
} else {
- this->unk_154 = 150.0f;
+ this->clockSpeed = 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->clockColorGray = play->csCtx.actorCues[cueChannel]->startPos.y;
} else {
- this->unk_280 = 38;
+ this->clockColorGray = 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->clockDist = (u32)play->csCtx.actorCues[cueChannel]->startPos.z;
} else {
- this->unk_150 = 480.0f;
+ this->clockDist = 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;
+ case SOTCS_CUEID_DOUBLE_CLOCKS_INWARD:
+ if (play->csCtx.actorCues[cueChannel]->startPos.x != 0) {
+ this->clockSpeed += (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->clockColorGray += (s16)play->csCtx.actorCues[cueChannel]->startPos.y;
} else {
- this->unk_280 += 6;
+ this->clockColorGray += 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->clockRadialSpeed = (u32)play->csCtx.actorCues[cueChannel]->startPos.z;
} else {
- this->unk_158 = -32.0f;
+ this->clockRadialSpeed = -32.0f;
}
- this->unk_150 += this->unk_158;
+ this->clockDist += this->clockRadialSpeed;
break;
- case 4:
- if (play->csCtx.actorActions[temp_v0]->startPos.x != 0) {
- this->unk_154 += (u32)play->csCtx.actorActions[temp_v0]->startPos.x;
+ case SOTCS_CUEID_DOUBLE_CLOCKS_SPIN:
+ if (play->csCtx.actorCues[cueChannel]->startPos.x != 0) {
+ this->clockSpeed += (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->clockColorGray += (s16)play->csCtx.actorCues[cueChannel]->startPos.y;
} else {
- this->unk_280 -= 4;
+ this->clockColorGray -= 4;
}
break;
- case 5:
- if (play->csCtx.actorActions[temp_v0]->startPos.x != 0) {
- this->unk_154 += (u32)play->csCtx.actorActions[temp_v0]->startPos.x;
+ case SOTCS_CUEID_DOUBLE_CLOCKS_OUTWARD:
+ if (play->csCtx.actorCues[cueChannel]->startPos.x != 0) {
+ this->clockSpeed += (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->clockColorGray += (s16)play->csCtx.actorCues[cueChannel]->startPos.y;
} else {
- this->unk_280 -= 8;
+ this->clockColorGray -= 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->clockRadialSpeed += (u32)play->csCtx.actorCues[cueChannel]->startPos.z;
} else {
- this->unk_158 += 20.0f;
+ this->clockRadialSpeed += 20.0f;
}
- this->unk_150 += this->unk_158;
- if (this->unk_150 > 3500.0f) {
- this->unk_150 = 3500.0f;
- this->unk_274 = 0;
+ this->clockDist += this->clockRadialSpeed;
+ if (this->clockDist > 3500.0f) {
+ this->clockDist = 3500.0f;
+ this->cueId = SOTCS_CUEID_NONE;
}
break;
- case 6:
- this->unk_276 = 1;
- this->unk_278 = 0;
- this->unk_27C = 0;
+ case SOTCS_CUEID_RESET_INIT:
+ this->drawType = SOTCS_DRAW_RESET_CYCLE_SOT;
+ this->counter = 0;
+ this->clockAngle = 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->clockSpeed = (u32)play->csCtx.actorCues[cueChannel]->startPos.x;
} else {
- this->unk_154 = 100.0f;
+ this->clockSpeed = 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->speed = (u32)play->csCtx.actorCues[cueChannel]->startPos.y;
} else {
- this->unk_14C = 20.0f;
+ this->speed = 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->clockDist = (u32)play->csCtx.actorCues[cueChannel]->startPos.z;
} else {
- this->unk_150 = 300.0f;
+ this->clockDist = 300.0f;
}
- this->unk_158 = 0.0f;
+ this->clockAccel = 0.0f;
break;
- case 7:
- if (play->csCtx.actorActions[temp_v0]->startPos.x != 0) {
- this->unk_158 = (u32)play->csCtx.actorActions[temp_v0]->startPos.x;
+ case SOTCS_CUEID_RESET_CLOCKS_SLOW_DOWN:
+ if (play->csCtx.actorCues[cueChannel]->startPos.x != 0) {
+ this->clockAccel = (u32)play->csCtx.actorCues[cueChannel]->startPos.x;
} else {
- this->unk_158 = -5.0f;
+ this->clockAccel = -5.0f;
}
- this->unk_154 += this->unk_158;
+ this->clockSpeed += this->clockAccel;
break;
- case 8:
- if (play->csCtx.actorActions[temp_v0]->startPos.x != 0) {
- this->unk_158 += (u32)play->csCtx.actorActions[temp_v0]->startPos.x;
+ case SOTCS_CUEID_RESET_CLOCKS_SPEED_UP:
+ if (play->csCtx.actorCues[cueChannel]->startPos.x != 0) {
+ this->clockAccel += (u32)play->csCtx.actorCues[cueChannel]->startPos.x;
} else {
- this->unk_158 += 2.0f;
+ this->clockAccel += 2.0f;
}
- this->unk_154 += this->unk_158;
- if (this->unk_154 > 10000.0f) {
- this->unk_154 = 10000.0f;
- this->unk_274 = 0;
+ this->clockSpeed += this->clockAccel;
+ if (this->clockSpeed > 10000.0f) {
+ this->clockSpeed = 10000.0f;
+ this->cueId = SOTCS_CUEID_NONE;
}
break;
- case 0:
+ case SOTCS_CUEID_NONE:
default:
- this->unk_276 = 99;
+ this->drawType = SOTCS_DRAW_TYPE_NONE;
return;
- case 9:
- Play_SetRespawnData(&play->state, 1, ((void)0, gSaveContext.save.entrance & 0xFFFF), player->unk_3CE,
- PLAYER_PARAMS(0xFF, PLAYER_INITMODE_B), &player->unk_3C0, player->unk_3CC);
- this->unk_276 = 99;
+ case SOTCS_CUEID_DOUBLE_END:
+ Play_SetRespawnData(&play->state, RESPAWN_MODE_RETURN, ((void)0, gSaveContext.save.entrance),
+ player->unk_3CE, PLAYER_PARAMS(0xFF, PLAYER_INITMODE_B), &player->unk_3C0,
+ player->unk_3CC);
+ this->drawType = SOTCS_DRAW_TYPE_NONE;
play->transitionTrigger = TRANS_TRIGGER_START;
play->nextEntrance = gSaveContext.respawn[RESPAWN_MODE_RETURN].entrance;
play->transitionType = TRANS_TYPE_FADE_BLACK;
if ((gSaveContext.save.time > CLOCK_TIME(18, 0)) || (gSaveContext.save.time < CLOCK_TIME(6, 0))) {
gSaveContext.respawnFlag = -0x63;
- SET_EVENTINF(EVENTINF_27);
+ SET_EVENTINF(EVENTINF_TRIGGER_DAYTELOP);
} else {
gSaveContext.respawnFlag = 2;
}
- play->msgCtx.ocarinaMode = 4;
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
return;
}
} else {
- switch (this->unk_274) {
- case 2:
- this->unk_276 = 0;
- this->unk_278 = 0;
- this->unk_27C = 0;
+ switch (this->cueId) {
+ case SOTCS_CUEID_DOUBLE_INIT:
+ this->drawType = SOTCS_DRAW_DOUBLE_SOT;
+ this->counter = 0;
+ this->clockAngle = 0;
player->actor.shape.shadowDraw = NULL;
- this->unk_280 = 38;
- this->unk_154 = 150.0f;
- this->unk_150 = 480.0f;
+ this->clockColorGray = 38;
+ this->clockSpeed = 150.0f;
+ this->clockDist = 480.0f;
- case 1:
+ case SOTCS_CUEID_DOUBLE_WAIT:
break;
- case 3:
- this->unk_158 = -32.0f;
- this->unk_280 += 6;
- this->unk_150 += -32.0f;
+ case SOTCS_CUEID_DOUBLE_CLOCKS_INWARD:
+ this->clockRadialSpeed = -32.0f;
+ this->clockColorGray += 6;
+ this->clockDist += -32.0f;
break;
- case 4:
- this->unk_280 -= 4;
+ case SOTCS_CUEID_DOUBLE_CLOCKS_SPIN:
+ this->clockColorGray -= 4;
break;
- case 5:
- this->unk_280 -= 8;
- this->unk_158 += 20.0f;
- this->unk_150 += this->unk_158;
- if (this->unk_150 > 3500.0f) {
- this->unk_150 = 3500.0f;
- this->unk_274 = 0;
+ case SOTCS_CUEID_DOUBLE_CLOCKS_OUTWARD:
+ this->clockColorGray -= 8;
+ this->clockRadialSpeed += 20.0f;
+ this->clockDist += this->clockRadialSpeed;
+ if (this->clockDist > 3500.0f) {
+ this->clockDist = 3500.0f;
+ this->cueId = SOTCS_CUEID_NONE;
}
break;
- case 6:
- this->unk_276 = 1;
- this->unk_278 = 0;
- this->unk_27C = 0;
+ case SOTCS_CUEID_RESET_INIT:
+ this->drawType = SOTCS_DRAW_RESET_CYCLE_SOT;
+ this->counter = 0;
+ this->clockAngle = 0;
player->actor.shape.shadowDraw = NULL;
- this->unk_154 = 100.0f;
- this->unk_14C = 20.0f;
- this->unk_150 = 300.0f;
- this->unk_158 = 0.0f;
+ this->clockSpeed = 100.0f;
+ this->speed = 20.0f;
+ this->clockDist = 300.0f;
+ this->clockAccel = 0.0f;
break;
- case 7:
- this->unk_158 = -5.0f;
- this->unk_154 += -5.0f;
+ case SOTCS_CUEID_RESET_CLOCKS_SLOW_DOWN:
+ this->clockAccel = -5.0f;
+ this->clockSpeed += -5.0f;
break;
- case 8:
- this->unk_158 += 2.0f;
- this->unk_154 += this->unk_158;
- if (this->unk_154 > 10000.0f) {
- this->unk_154 = 10000.0f;
- this->unk_274 = 0;
+ case SOTCS_CUEID_RESET_CLOCKS_SPEED_UP:
+ this->clockAccel += 2.0f;
+ this->clockSpeed += this->clockAccel;
+ if (this->clockSpeed > 10000.0f) {
+ this->clockSpeed = 10000.0f;
+ this->cueId = SOTCS_CUEID_NONE;
}
break;
- case 0:
+ case SOTCS_CUEID_NONE:
default:
- this->unk_276 = 99;
+ this->drawType = SOTCS_DRAW_TYPE_NONE;
return;
- case 9:
+ case SOTCS_CUEID_DOUBLE_END:
if (gSaveContext.save.time > CLOCK_TIME(12, 0)) {
- Play_SetRespawnData(&play->state, 1, ((void)0, gSaveContext.save.entrance & 0xFFFF),
+ Play_SetRespawnData(&play->state, RESPAWN_MODE_RETURN, ((void)0, gSaveContext.save.entrance),
player->unk_3CE, PLAYER_PARAMS(0xFF, PLAYER_INITMODE_B), &player->unk_3C0,
player->unk_3CC);
- this->unk_276 = 99;
+ this->drawType = SOTCS_DRAW_TYPE_NONE;
play->transitionTrigger = TRANS_TRIGGER_START;
play->nextEntrance = gSaveContext.respawn[RESPAWN_MODE_RETURN].entrance;
play->transitionType = TRANS_TYPE_FADE_BLACK;
gSaveContext.respawnFlag = 2;
- play->msgCtx.ocarinaMode = 4;
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
}
return;
}
}
- if (this->unk_276 == 1) {
- for (i = 0; i < ARRAY_COUNT(D_80A94910); i++) {
- D_80A94910[i].unk_08 += 2.0f * ((2.0f * Rand_ZeroOne()) - 1.0f);
- D_80A94910[i].unk_10 += 2.0f * ((2.0f * Rand_ZeroOne()) - 1.0f);
- D_80A94910[i].unk_0C += 3.0f;
+ if (this->drawType == SOTCS_DRAW_RESET_CYCLE_SOT) {
+ for (i = 0; i < ARRAY_COUNT(sSoTCsAmmoDrops); i++) {
+ sSoTCsAmmoDrops[i].pos.x += 2.0f * ((2.0f * Rand_ZeroOne()) - 1.0f);
+ sSoTCsAmmoDrops[i].pos.z += 2.0f * ((2.0f * Rand_ZeroOne()) - 1.0f);
+ sSoTCsAmmoDrops[i].pos.y += 3.0f;
- if (player->actor.world.pos.y < D_80A94910[i].unk_0C) {
- temp_f0 = D_80A94910[i].unk_0C - player->actor.world.pos.y;
- if (temp_f0 > 550.0f) {
- temp_f0 = 1.0f;
+ if (player->actor.world.pos.y < sSoTCsAmmoDrops[i].pos.y) {
+ yDiff = sSoTCsAmmoDrops[i].pos.y - player->actor.world.pos.y;
+ if (yDiff > 550.0f) {
+ yDiff = 1.0f;
} else {
- temp_f0 = temp_f0 / 550.0f;
+ yDiff /= 550.0f;
}
- D_80A94910[i].unk_04 = SQ(temp_f0);
+ sSoTCsAmmoDrops[i].scale = SQ(yDiff);
} else {
- D_80A94910[i].unk_04 = -10.0f;
+ sSoTCsAmmoDrops[i].scale = -10.0f;
}
}
}
- this->unk_278++;
+ this->counter++;
}
-void func_80A93298(EnTest6* this, PlayState* play) {
- s16 temp_s3;
- s16 temp_s4;
- f32 phi_f24;
- s16 phi_s2;
+/**
+ * Draws clocks in a double spiral above and below player
+ */
+void EnTest6_DrawThreeDayResetSoTCutscene(EnTest6* this, PlayState* play) {
+ s16 clock1Yaw;
+ s16 clock2Yaw;
+ s16 angle;
s32 i;
- f32 cos;
- f32 sin;
+ Vec3f clockPos;
OPEN_DISPS(play->state.gfxCtx);
- this->unk_148 = POLY_OPA_DISP;
- phi_f24 = 0.0f;
+ this->gfx = POLY_OPA_DISP;
+ clockPos.y = 0.0f;
- temp_s3 = this->unk_27C;
- temp_s4 = (s32)(Math_SinS(play->state.frames) * 12000.0f) + temp_s3 + 0x4E20;
- phi_s2 = (play->state.frames & 0x3C) * 1024;
- phi_s2 *= (this->unk_154 / 200.0f);
- this->unk_27C += (s16)this->unk_154;
- this->unk_27E = (s16)((this->unk_154 / 200.0f) * 256.0f);
+ clock1Yaw = this->clockAngle;
+ clock2Yaw = clock1Yaw + 0x4E20 + (s32)(0x2EE0 * Math_SinS(play->state.frames));
+ // The `& 0x3C` ensures the angle only updates once every 4 frames
+ angle = (play->state.frames & 0x3C) * 1024;
+ angle *= this->clockSpeed / 200.0f;
+ this->clockAngle += (s16)this->clockSpeed;
+ this->clockRingRotZ = (s16)((this->clockSpeed / 200.0f) * 256.0f);
- for (i = 0; i < ARRAY_COUNT(this->unk_254[0]); i++) {
- temp_s3 += 0x1000;
- cos = Math_CosS(temp_s3) * this->unk_150;
- sin = Math_SinS(temp_s3) * this->unk_150;
- Matrix_Translate(cos, phi_f24, sin, MTXMODE_NEW);
+ // Draw 2 clocks per loop
+ for (i = 0; i < (SOTCS_RESET_NUM_CLOCKS / 2); i++) {
+ // Clock 1
+ clock1Yaw += 0x1000;
+ clockPos.x = Math_CosS(clock1Yaw) * this->clockDist;
+ clockPos.z = Math_SinS(clock1Yaw) * this->clockDist;
+ Matrix_Translate(clockPos.x, clockPos.y, clockPos.z, MTXMODE_NEW);
Matrix_RotateXS(0x4000, MTXMODE_APPLY);
Matrix_Scale(0.8f, 0.8f, 0.8f, MTXMODE_APPLY);
- Matrix_RotateZS(phi_s2, MTXMODE_APPLY);
+ Matrix_RotateZS(angle, MTXMODE_APPLY);
- gSPMatrix(this->unk_148++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gDPSetPrimColor(this->unk_148++, 0, 0xFF, 28, 28, 28, 255);
- gDPSetEnvColor(this->unk_148++, 255, 255, 255, 255);
- gDPSetRenderMode(this->unk_148++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2);
- gSPDisplayList(this->unk_148++, gSongOfTimeClockDL);
+ gSPMatrix(this->gfx++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gDPSetPrimColor(this->gfx++, 0, 0xFF, 28, 28, 28, 255);
+ gDPSetEnvColor(this->gfx++, 255, 255, 255, 255);
+ gDPSetRenderMode(this->gfx++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2);
+ gSPDisplayList(this->gfx++, gSongOfTimeClockDL);
- temp_s4 += 0x1000;
- cos = Math_CosS(temp_s4) * this->unk_150;
- sin = Math_SinS(temp_s4) * this->unk_150;
- Matrix_Translate(cos, phi_f24, sin, MTXMODE_NEW);
+ // Clock 2
+ clock2Yaw += 0x1000;
+ clockPos.x = Math_CosS(clock2Yaw) * this->clockDist;
+ clockPos.z = Math_SinS(clock2Yaw) * this->clockDist;
+ Matrix_Translate(clockPos.x, clockPos.y, clockPos.z, MTXMODE_NEW);
Matrix_RotateXS(0x4000, MTXMODE_APPLY);
Matrix_Scale(0.8f, 0.8f, 0.8f, MTXMODE_APPLY);
- Matrix_RotateZS(-phi_s2, MTXMODE_APPLY);
+ Matrix_RotateZS(-angle, MTXMODE_APPLY);
- gSPMatrix(this->unk_148++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gDPSetPrimColor(this->unk_148++, 0, 0xFF, 28, 28, 28, 255);
- gDPSetEnvColor(this->unk_148++, 255, 255, 255, 255);
- gDPSetRenderMode(this->unk_148++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2);
- gSPDisplayList(this->unk_148++, gSongOfTimeClockDL);
+ gSPMatrix(this->gfx++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gDPSetPrimColor(this->gfx++, 0, 0xFF, 28, 28, 28, 255);
+ gDPSetEnvColor(this->gfx++, 255, 255, 255, 255);
+ gDPSetRenderMode(this->gfx++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2);
+ gSPDisplayList(this->gfx++, gSongOfTimeClockDL);
- phi_f24 -= this->unk_14C;
- phi_s2 += this->unk_27E;
+ clockPos.y -= this->speed;
+ angle += this->clockRingRotZ;
}
- POLY_OPA_DISP = this->unk_148;
+ POLY_OPA_DISP = this->gfx;
- for (i = 0; i < ARRAY_COUNT(D_80A94910); i++) {
- if (D_80A94910[i].unk_04 > 0.0f) {
- D_80A94910[i].unk_14(this, play, &D_80A94910[i]);
+ for (i = 0; i < ARRAY_COUNT(sSoTCsAmmoDrops); i++) {
+ if (sSoTCsAmmoDrops[i].scale > 0.0f) {
+ sSoTCsAmmoDrops[i].draw(this, play, &sSoTCsAmmoDrops[i]);
}
}
CLOSE_DISPS(play->state.gfxCtx);
}
-void func_80A9369C(Actor* thisx, PlayState* play2) {
- EnTest6* this = THIS;
- PlayState* play = play2;
- f32 temp_f20;
- f32 temp_f22;
- f32 phi_f26;
- s16 phi_s2;
- s16 sp78;
+/**
+ * Draws clocks in a ring that spins around player
+ */
+void EnTest6_DrawDoubleSoTCutscene(EnTest6* this, PlayState* play) {
+ s32 pad1[2];
+ Vec3f clockPos;
+ s16 clockRotX;
+ s16 clockNormalAngle;
s32 i;
Player* player = GET_PLAYER(play);
- s32 pad;
+ s32 pad2;
- if (this) {}
OPEN_DISPS(play->state.gfxCtx);
- this->unk_148 = POLY_OPA_DISP;
- this->unk_27C += (s16)this->unk_154;
- this->unk_27E = this->unk_27C * 2;
- sp78 = (play->state.frames & 0x3C) * 1024;
- phi_s2 = this->unk_27C + 0x4000;
+ this->gfx = POLY_OPA_DISP;
+ this->clockAngle += (s16)this->clockSpeed;
+ this->clockRingRotZ = this->clockAngle * 2;
+ // The `& 0x3C` ensures the clock only turns once every 4 frames.
+ // Each turn rotates the clock 22.5 degrees (0x10000 / 64 * 4)
+ // clockNormalAngle = (play->state.frames & 0x3C) * ((0x10000 / 64 * 4) / 4);
+ clockNormalAngle = (play->state.frames & 0x3C) * (DEG_TO_BINANG(22.5f) / 4);
+ clockRotX = this->clockAngle + 0x4000;
+
+ // All cases have the exact same code
switch (player->transformation) {
- default:
- phi_f26 = player->actor.world.pos.y + 40.0f;
- break;
-
case PLAYER_FORM_DEKU:
- phi_f26 = player->actor.world.pos.y + 40.0f;
+ clockPos.x = player->actor.world.pos.y + 40.0f;
break;
case PLAYER_FORM_GORON:
- phi_f26 = player->actor.world.pos.y + 40.0f;
+ clockPos.x = player->actor.world.pos.y + 40.0f;
break;
case PLAYER_FORM_ZORA:
- phi_f26 = player->actor.world.pos.y + 40.0f;
+ clockPos.x = player->actor.world.pos.y + 40.0f;
break;
case PLAYER_FORM_FIERCE_DEITY:
- phi_f26 = player->actor.world.pos.y + 40.0f;
+ clockPos.x = player->actor.world.pos.y + 40.0f;
+ break;
+
+ default:
+ clockPos.x = player->actor.world.pos.y + 40.0f;
break;
}
- for (i = 0; i < 51; i++) {
- temp_f20 = Math_CosS(phi_s2) * this->unk_150;
- temp_f22 = Math_SinS(phi_s2) * this->unk_150;
- Matrix_RotateZS(this->unk_27E, MTXMODE_NEW);
- Matrix_Translate(phi_f26, temp_f20, temp_f22, MTXMODE_APPLY);
+ // Draw clocks
+ for (i = 0; i < SOTCS_DOUBLE_NUM_CLOCKS; i++) {
+ clockPos.y = Math_CosS(clockRotX) * this->clockDist;
+ clockPos.z = Math_SinS(clockRotX) * this->clockDist;
+ // Rotate the entire clock ring
+ Matrix_RotateZS(this->clockRingRotZ, MTXMODE_NEW);
+
+ Matrix_Translate(clockPos.x, clockPos.y, clockPos.z, MTXMODE_APPLY);
Matrix_Scale(0.85f, 0.85f, 0.85f, MTXMODE_APPLY);
- Matrix_RotateXS(phi_s2, MTXMODE_APPLY);
- Matrix_RotateZS(sp78, MTXMODE_APPLY);
+ // Orient the clock so the plane it's drawn on also passes through player
+ Matrix_RotateXS(clockRotX, MTXMODE_APPLY);
+ // Rotate around the normal of the plane, so the clock plane does not change,
+ // the drawn shape is spun internally
+ Matrix_RotateZS(clockNormalAngle, MTXMODE_APPLY);
- gSPMatrix(this->unk_148++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gDPSetPrimColor(this->unk_148++, 0, 0xFF, this->unk_280, this->unk_280, this->unk_280, 255);
- gDPSetEnvColor(this->unk_148++, 235, 238, 235, 255);
- gDPSetRenderMode(this->unk_148++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2);
- gSPDisplayList(this->unk_148++, gSongOfTimeClockDL);
+ gSPMatrix(this->gfx++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gDPSetPrimColor(this->gfx++, 0, 0xFF, this->clockColorGray, this->clockColorGray, this->clockColorGray, 255);
+ gDPSetEnvColor(this->gfx++, 235, 238, 235, 255);
+ gDPSetRenderMode(this->gfx++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2);
+ gSPDisplayList(this->gfx++, gSongOfTimeClockDL);
- phi_s2 += 0x505;
+ clockRotX += 0x10000 / SOTCS_DOUBLE_NUM_CLOCKS;
}
Lights_PointSetPosition(&this->lights[0].info, player->actor.world.pos.x, player->actor.world.pos.y - 10.0f,
player->actor.world.pos.z);
Lights_PointSetColorAndRadius(&this->lights[0].info, 100, 250, 100, 200);
- POLY_OPA_DISP = this->unk_148;
+ POLY_OPA_DISP = this->gfx;
CLOSE_DISPS(play->state.gfxCtx);
}
-void func_80A939E8(EnTest6* this, PlayState* play2) {
+/**
+ * Draws clocks flat on the ground.
+ * Also draws black particles that raise or fall to indicate if time is speeding up or slowing down
+ */
+void EnTest6_DrawInvertedSoTCutscene(EnTest6* this, PlayState* play2) {
PlayState* play = play2;
Player* player = GET_PLAYER(play);
- f32 temp_f20;
+ f32 flashScale;
s32 i;
OPEN_DISPS(play->state.gfxCtx);
- switch (this->unk_274) {
- case 91:
- case 93:
+ switch (this->cueId) {
+ case SOTCS_CUEID_INV_SETUP_CLOCKS:
+ case SOTCS_CUEID_INV_UNUSED:
Lights_PointSetPosition(&this->lights[0].info, player->actor.world.pos.x, player->actor.world.pos.y - 10.0f,
player->actor.world.pos.z);
- Lights_PointSetColorAndRadius(&this->lights[0].info, 245, 245, 200, this->unk_282);
+ Lights_PointSetColorAndRadius(&this->lights[0].info, 245, 245, 200, this->alpha);
break;
- case 95:
- this->unk_148 = POLY_XLU_DISP;
+ case SOTCS_CUEID_INV_CLOCKS:
+ this->gfx = POLY_XLU_DISP;
- for (i = 0; i < ARRAY_COUNT(this->unk_20C); i++) {
- Matrix_Translate(this->unk_20C[i].x, this->unk_20C[i].y, this->unk_20C[i].z, MTXMODE_NEW);
+ // Draw clocks
+ for (i = 0; i < ARRAY_COUNT(this->invSoTClockPos); i++) {
+ Matrix_Translate(this->invSoTClockPos[i].x, this->invSoTClockPos[i].y, this->invSoTClockPos[i].z,
+ MTXMODE_NEW);
Matrix_Scale(0.3f, 0.3f, 0.3f, MTXMODE_APPLY);
Matrix_RotateXS(-0x4000, MTXMODE_APPLY);
- Matrix_RotateZS(this->unk_278, MTXMODE_APPLY);
+ Matrix_RotateZS(this->invSoTClockYaw, MTXMODE_APPLY);
- gSPMatrix(this->unk_148++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gDPSetPrimColor(this->unk_148++, 0, 0xFF, 28, 28, 28, 255);
- gDPSetEnvColor(this->unk_148++, 245, 245, 200, this->unk_282);
- gDPSetRenderMode(this->unk_148++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_XLU_SURF2);
- gSPDisplayList(this->unk_148++, gSongOfTimeClockDL);
+ gSPMatrix(this->gfx++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gDPSetPrimColor(this->gfx++, 0, 0xFF, 28, 28, 28, 255);
+ gDPSetEnvColor(this->gfx++, 245, 245, 200, this->alpha);
+ gDPSetRenderMode(this->gfx++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_XLU_SURF2);
+ gSPDisplayList(this->gfx++, gSongOfTimeClockDL);
- POLY_XLU_DISP = this->unk_148;
+ POLY_XLU_DISP = this->gfx;
}
- if (this->unk_254 != NULL) {
- for (i = 0; i < ARRAY_COUNT(this->unk_254[0]); i++) {
- temp_f20 = Rand_ZeroOne() * 0.0025f;
- Matrix_Translate((*this->unk_254)[i].x, (*this->unk_254)[i].y, (*this->unk_254)[i].z, MTXMODE_NEW);
- Matrix_Scale(temp_f20, temp_f20, temp_f20, MTXMODE_APPLY);
+ // Draw black particles
+ if (this->invSoTParticles != NULL) {
+ for (i = 0; i < SOTCS_NUM_PARTICLES; i++) {
+ flashScale = Rand_ZeroOne() * 0.0025f;
+ Matrix_Translate((*this->invSoTParticles)[i].x, (*this->invSoTParticles)[i].y,
+ (*this->invSoTParticles)[i].z, MTXMODE_NEW);
+ Matrix_Scale(flashScale, flashScale, flashScale, MTXMODE_APPLY);
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 128, 128, 128, this->unk_282 >> 1);
- gDPSetEnvColor(POLY_XLU_DISP++, 230, 230, 180, this->unk_282);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 128, 128, 128, this->alpha >> 1);
+ gDPSetEnvColor(POLY_XLU_DISP++, 230, 230, 180, this->alpha);
- 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);
+ Matrix_RotateZS(this->invSoTClockYaw + (i << 2), 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);
}
}
+
Lights_PointSetPosition(&this->lights[0].info, player->actor.world.pos.x, player->actor.world.pos.y - 10.0f,
player->actor.world.pos.z);
- Lights_PointSetColorAndRadius(&this->lights[0].info, 250, 250, 100, this->unk_282);
+ Lights_PointSetColorAndRadius(&this->lights[0].info, 250, 250, 100, this->alpha);
break;
- case 90:
- case 92:
- case 94:
- case 96:
- case 97:
- case 98:
- case 99:
+ case SOTCS_CUEID_INV_INIT:
+ case SOTCS_CUEID_INV_END:
break;
}
@@ -1297,18 +1423,21 @@ void func_80A939E8(EnTest6* this, PlayState* play2) {
void EnTest6_Draw(Actor* thisx, PlayState* play) {
EnTest6* this = THIS;
- if (this->unk_274 != 0) {
- switch (this->unk_276) {
- case 1:
- func_80A93298(this, play);
+ if (this->cueId != SOTCS_CUEID_NONE) {
+ switch (this->drawType) {
+ case SOTCS_DRAW_RESET_CYCLE_SOT:
+ EnTest6_DrawThreeDayResetSoTCutscene(this, play);
break;
- case 0:
- func_80A9369C(thisx, play);
+ case SOTCS_DRAW_DOUBLE_SOT:
+ EnTest6_DrawDoubleSoTCutscene(this, play);
break;
- case 2:
- func_80A939E8(this, play);
+ case SOTCS_DRAW_INVERTED_SOT:
+ EnTest6_DrawInvertedSoTCutscene(this, play);
+ break;
+
+ default:
break;
}
}
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..726e23dc5 100644
--- a/src/overlays/actors/ovl_En_Test6/z_en_test6.h
+++ b/src/overlays/actors/ovl_En_Test6/z_en_test6.h
@@ -7,46 +7,71 @@ struct EnTest6;
typedef void (*EnTest6ActionFunc)(struct EnTest6*, PlayState*);
-#define ENTEST6_GET(thisx) ((thisx)->params)
+#define SOTCS_GET_OCARINA_MODE(thisx) ((thisx)->params)
-enum {
- /* 24 */ ENTEST6_24 = 24,
- /* 25 */ ENTEST6_25,
- /* 26 */ ENTEST6_26,
-};
+// CueIds are a mix of cues from external cutscenes and internal states
+
+typedef enum SoTCsCueId {
+ /* 0x00 */ SOTCS_CUEID_NONE,
+ /* 0x01 */ SOTCS_CUEID_DOUBLE_WAIT,
+ /* 0x02 */ SOTCS_CUEID_DOUBLE_INIT,
+ /* 0x03 */ SOTCS_CUEID_DOUBLE_CLOCKS_INWARD,
+ /* 0x04 */ SOTCS_CUEID_DOUBLE_CLOCKS_SPIN,
+ /* 0x05 */ SOTCS_CUEID_DOUBLE_CLOCKS_OUTWARD,
+ /* 0x06 */ SOTCS_CUEID_RESET_INIT,
+ /* 0x07 */ SOTCS_CUEID_RESET_CLOCKS_SLOW_DOWN,
+ /* 0x08 */ SOTCS_CUEID_RESET_CLOCKS_SPEED_UP,
+ /* 0x09 */ SOTCS_CUEID_DOUBLE_END,
+ /* 0x5A */ SOTCS_CUEID_INV_INIT = 90,
+ /* 0x5B */ SOTCS_CUEID_INV_SETUP_CLOCKS,
+ /* 0x5D */ SOTCS_CUEID_INV_UNUSED = 93,
+ /* 0x5F */ SOTCS_CUEID_INV_CLOCKS = 95,
+ /* 0x63 */ SOTCS_CUEID_INV_END = 99
+} SoTCsCueId;
typedef struct {
- /* 0x00 */ LightNode* node;
- /* 0x04 */ LightInfo info;
-} EnTest6Light; // size = 0x14
+ /* 0x0 */ LightNode* node;
+ /* 0x4 */ LightInfo info;
+} SoTCsLight; // size = 0x14
+
+#define SOTCS_INV_NUM_CLOCKS 6
+#define SOTCS_DOUBLE_NUM_CLOCKS 51
+#define SOTCS_RESET_NUM_CLOCKS 128
+#define SOTCS_NUM_PARTICLES 64
typedef struct EnTest6 {
/* 0x000 */ Actor actor;
/* 0x144 */ EnTest6ActionFunc actionFunc;
- /* 0x148 */ Gfx* unk_148;
- /* 0x14C */ f32 unk_14C;
- /* 0x150 */ f32 unk_150;
- /* 0x154 */ f32 unk_154;
- /* 0x158 */ f32 unk_158;
- /* 0x15C */ f32 unk_15C;
- /* 0x160 */ f32 unk_160;
- /* 0x164 */ EnTest6Light lights[2];
- /* 0x18C */ DbCameraUnkStruct unk_18C;
- /* 0x20C */ Vec3f unk_20C[6];
- /* 0x254 */ Vec3f (*unk_254)[64];
+ /* 0x148 */ Gfx* gfx;
+ /* 0x14C */ f32 speed; // Used for clock distance and lights
+ /* 0x150 */ f32 clockDist; // Radius from player
+ /* 0x154 */ f32 clockSpeed;
+ /* 0x158 */ union {
+ f32 clockRadialSpeed; // For double SoT cutscene
+ f32 clockAccel; // For reset SoT cutscene
+ };
+ /* 0x15C */ f32 invSoTEnvLerp;
+ /* 0x160 */ f32 doubleSoTEnvLerp;
+ /* 0x164 */ SoTCsLight lights[2];
+ /* 0x18C */ CutsceneCamera csCamInfo;
+ /* 0x20C */ Vec3f invSoTClockPos[SOTCS_INV_NUM_CLOCKS];
+ /* 0x254 */ Vec3f (*invSoTParticles)[SOTCS_NUM_PARTICLES];
/* 0x258 */ Vec3f subCamAt;
/* 0x264 */ Vec3f subCamEye;
/* 0x270 */ f32 subCamFov;
- /* 0x274 */ s16 unk_274;
- /* 0x276 */ s16 unk_276;
- /* 0x278 */ s16 unk_278;
- /* 0x27A */ s16 unk_27A;
- /* 0x27C */ s16 unk_27C;
- /* 0x27E */ s16 unk_27E;
- /* 0x280 */ s16 unk_280;
- /* 0x282 */ s16 unk_282;
+ /* 0x274 */ s16 cueId;
+ /* 0x276 */ s16 drawType;
+ /* 0x278 */ union {
+ s16 invSoTClockYaw; // For inverted SoT cutscene.
+ s16 counter; // For double/reset SoT cutscenes. Increments every frame, unused.
+ };
+ /* 0x27A */ s16 timer;
+ /* 0x27C */ s16 clockAngle;
+ /* 0x27E */ s16 clockRingRotZ; // For double/reset SoT cutscenes
+ /* 0x280 */ s16 clockColorGray; // For double SoT cutscene
+ /* 0x282 */ s16 alpha;
/* 0x284 */ s16 subCamId;
- /* 0x286 */ s16 unk_286;
+ /* 0x286 */ s16 screenFillAlpha; // As a ratio, 20 is an alpha of 255
} EnTest6; // size = 0x288
#endif // Z_EN_TEST6_H
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 bf0dc785b..417176d96 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();
@@ -363,14 +364,13 @@ void func_80AF14FC(PlayState* play2, EnTest7Struct2* arg1) {
}
temp_v0 = Matrix_NewMtx(play->state.gfxCtx);
- if (temp_v0 != NULL) {
- gSPMatrix(POLY_OPA_DISP++, temp_v0, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, gameplay_keep_DL_081628);
+ if (temp_v0 == NULL) {
+ continue;
}
+ gSPMatrix(POLY_OPA_DISP++, temp_v0, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gameplay_keep_DL_081628);
}
- if (ptr) {}
-
Matrix_Pop();
CLOSE_DISPS(play->state.gfxCtx);
@@ -412,12 +412,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,31 +428,32 @@ 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;
}
}
void func_80AF1A2C(EnTest7* this, PlayState* play) {
- Color_RGB8 sp34 = { 64, 0, 0 };
- Color_RGB8 sp30 = { 220, 220, 255 };
- f32 sp2C = this->unk_1E54 / 10.0f;
+ Color_RGB8 fogColor = { 64, 0, 0 };
+ Color_RGB8 ambientColor = { 220, 220, 255 };
+ f32 envLerp = this->unk_1E54 / 10.0f;
- func_800FD59C(play, &sp30, sp2C);
- func_800FD654(play, &sp34, sp2C);
- func_800FD698(play, 2000, 4000, sp2C);
+ Environment_LerpAmbientColor(play, &ambientColor, envLerp);
+ Environment_LerpFogColor(play, &fogColor, envLerp);
+ Environment_LerpFog(play, 2000, 4000, envLerp);
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;
@@ -460,7 +461,7 @@ void func_80AF1A2C(EnTest7* this, PlayState* play) {
func_80AF082C(this, func_80AF1CA0);
this->unk_144 |= 0x20;
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_PL_WARP_WING_OPEN);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_PL_WARP_WING_OPEN);
Play_EnableMotionBlur(120);
}
}
@@ -504,17 +505,18 @@ void func_80AF1CA0(EnTest7* this, PlayState* play) {
if ((this->unk_18CC.frameCtrl.unk_10 > 20.0f) && !(this->unk_144 & 0x40)) {
this->unk_144 |= 0x40;
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_PL_WARP_WING_CLOSE);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_PL_WARP_WING_CLOSE);
}
if (this->unk_18CC.frameCtrl.unk_10 > 42.0f) {
if (!(this->unk_144 & 0x80)) {
this->unk_144 |= 0x80;
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_PL_WARP_WING_ROLL);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_PL_WARP_WING_ROLL);
}
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 +539,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 +587,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;
@@ -608,12 +610,12 @@ void func_80AF2030(EnTest7* this, PlayState* play) {
void func_80AF21E8(EnTest7* this, PlayState* play) {
s32 sp2C = this->unk_1E54 - 100;
- f32 sp1C;
- Color_RGB8 sp24 = { 64, 0, 0 };
- Color_RGB8 sp20 = { 220, 220, 255 };
+ f32 envLerp;
+ Color_RGB8 fogColor = { 64, 0, 0 };
+ Color_RGB8 ambientColor = { 220, 220, 255 };
if (R_PLAY_FILL_SCREEN_ON) {
- Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_PL_WARP_WING_VANISH);
+ Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_PL_WARP_WING_VANISH);
R_PLAY_FILL_SCREEN_ON = false;
R_PLAY_FILL_SCREEN_R = 0;
R_PLAY_FILL_SCREEN_G = 0;
@@ -621,10 +623,10 @@ void func_80AF21E8(EnTest7* this, PlayState* play) {
R_PLAY_FILL_SCREEN_ALPHA = 0;
}
- sp1C = 1.0f - (sp2C / 10.0f);
- func_800FD59C(play, &sp20, sp1C);
- func_800FD654(play, &sp24, sp1C);
- func_800FD698(play, 2000, 4000, sp1C);
+ envLerp = 1.0f - (sp2C / 10.0f);
+ Environment_LerpAmbientColor(play, &ambientColor, envLerp);
+ Environment_LerpFogColor(play, &fogColor, envLerp);
+ Environment_LerpFog(play, 2000, 4000, envLerp);
if (this->unk_1E54 >= 110) {
func_80AF082C(this, func_80AF2318);
@@ -667,10 +669,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 +688,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 +712,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;
@@ -762,7 +766,7 @@ void func_80AF2938(EnTest7* this, PlayState* play) {
player->stateFlags2 |= PLAYER_STATE2_20000000;
this->unk_144 |= 2;
this->unk_148.unk_04 = 30.0f;
- if (play->roomCtx.curRoom.unk3 != 1) {
+ if (play->roomCtx.curRoom.behaviorType1 != ROOM_BEHAVIOR_TYPE1_1) {
func_80AF082C(this, func_80AF2AE8);
} else {
func_80AF082C(this, func_80AF2EC8);
@@ -777,7 +781,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 +796,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 +815,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,14 +842,14 @@ 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;
subCam->at.y = this->actor.world.pos.y + 40.0f;
subCam->at.z = this->actor.world.pos.z;
- func_800B9010(&this->actor, NA_SE_PL_WARP_WING_ROLL_2 - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_PL_WARP_WING_ROLL_2 - SFX_FLAG);
if (this->unk_1E54 >= 40) {
this->unk_144 &= ~4;
func_80AF082C(this, func_80AF2F98);
@@ -855,7 +861,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 +875,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;
@@ -889,7 +895,7 @@ void func_80AF2F98(EnTest7* this, PlayState* play) {
Player* player2 = GET_PLAYER(play);
Vec3f sp2C;
- func_800B9010(&this->actor, NA_SE_PL_WARP_WING_ROLL_2 - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_PL_WARP_WING_ROLL_2 - SFX_FLAG);
sp2C = this->actor.world.pos;
@@ -981,6 +987,7 @@ void EnTest7_Draw(Actor* thisx, PlayState* play) {
func_80AF14FC(play, this->unk_15C);
if (this->unk_144 & 4) {
- func_800F9824(play, &play->envCtx, &play->view, play->state.gfxCtx, this->actor.world.pos, 70.0f, 5.0f, 0, 0);
+ Environment_DrawLensFlare(play, &play->envCtx, &play->view, play->state.gfxCtx, this->actor.world.pos, 70.0f,
+ 5.0f, 0, 0);
}
}
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..efdc48713 100644
--- a/src/overlays/actors/ovl_En_Tg/z_en_tg.c
+++ b/src/overlays/actors/ovl_En_Tg/z_en_tg.c
@@ -7,7 +7,7 @@
#include "z_en_tg.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnTg*)thisx)
@@ -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 58f44d468..3671693c7 100644
--- a/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.c
+++ b/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.c
@@ -6,8 +6,10 @@
#include "prevent_bss_reordering.h"
#include "z_en_thiefbird.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_200 | ACTOR_FLAG_1000 | ACTOR_FLAG_80000000)
+#define FLAGS \
+ (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_200 | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_80000000)
#define THIS ((EnThiefbird*)thisx)
@@ -193,12 +195,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,15 +225,15 @@ 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;
}
}
- if (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_HUMAN) {
phi_a3 = GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD);
if (INV_CONTENT(ITEM_SWORD_GREAT_FAIRY) == ITEM_SWORD_GREAT_FAIRY) {
phi_a3 += 4;
@@ -265,7 +267,7 @@ s32 func_80C10B0C(EnThiefbird* this, PlayState* play) {
itemId1 = phi_a3 + (ITEM_SWORD_KOKIRI - 1);
if (phi_a3 == 4) {
Inventory_DeleteItem(ITEM_SWORD_GREAT_FAIRY, SLOT_SWORD_GREAT_FAIRY);
- this->unk_3E8 = gTakkuriStolenGreatFairySwordDL;
+ this->unk_3E8 = gTakkuriStolenGreatFairysSwordDL;
itemId1 = ITEM_SWORD_GREAT_FAIRY;
} else {
CUR_FORM_EQUIP(EQUIP_SLOT_B) = ITEM_NONE;
@@ -343,7 +345,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;
@@ -403,7 +405,7 @@ s32 func_80C10E98(PlayState* play) {
if (temp_s1_5 != NULL) {
temp_s1_5->velocity.y = Rand_ZeroFloat(3.0f) + 6.0f;
- temp_s1_5->speedXZ = Rand_ZeroFloat(3.0f) + 3.0f;
+ temp_s1_5->speed = Rand_ZeroFloat(3.0f) + 3.0f;
temp_s1_5->world.rot.y = phi_s3;
}
phi_s3 += (s16)(0x10000 / (spB0 + spAC + phi_s0_2 + spA0 + phi_s2 + spA8));
@@ -430,7 +432,7 @@ void func_80C11338(EnThiefbird* this, PlayState* play) {
item = (EnItem00*)SubS_FindActor(play, &item->actor, ACTORCAT_MISC, ACTOR_EN_ITEM00);
if (item != NULL) {
if (item->unk152 > 0) {
- if (Actor_XZDistanceBetweenActors(&player->actor, &item->actor) > 10.0f) {
+ if (Actor_WorldDistXZToActor(&player->actor, &item->actor) > 10.0f) {
for (i = 0; i < ARRAY_COUNT(D_80C13664); i++) {
if (item->actor.params == D_80C13664[i]) {
break;
@@ -438,7 +440,7 @@ void func_80C11338(EnThiefbird* this, PlayState* play) {
}
if (i != ARRAY_COUNT(D_80C13664)) {
- temp_f0 = Actor_DistanceBetweenActors(&this->actor, &item->actor);
+ temp_f0 = Actor_WorldDistXYZToActor(&this->actor, &item->actor);
if (temp_f0 < phi_f20) {
this->unk_3EC = item;
phi_f20 = temp_f0;
@@ -457,14 +459,14 @@ void func_80C11454(EnThiefbird* this) {
this->drawDmgEffFrozenSteamScale = 0.75f;
this->drawDmgEffAlpha = 1.0f;
this->actor.flags &= ~ACTOR_FLAG_200;
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 80);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 80);
}
void func_80C114C0(EnThiefbird* this, PlayState* play) {
if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->drawDmgEffAlpha = 0.0f;
- Actor_SpawnIceEffects(play, &this->actor, this->limbPos, 11, 2, 0.2f, 0.2f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, EN_THIEFBIRD_BODYPART_MAX, 2, 0.2f, 0.2f);
this->actor.flags |= ACTOR_FLAG_200;
}
}
@@ -478,33 +480,33 @@ void func_80C11538(EnThiefbird* this) {
void func_80C11590(EnThiefbird* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- s32 sp38;
+ s32 onAnimFirstFrame;
SkelAnime_Update(&this->skelAnime);
- sp38 = Animation_OnFrame(&this->skelAnime, 0.0f);
- this->actor.speedXZ = (Rand_ZeroOne() * 1.5f) + 3.0f;
+ onAnimFirstFrame = Animation_OnFrame(&this->skelAnime, 0.0f);
+ this->actor.speed = (Rand_ZeroOne() * 1.5f) + 3.0f;
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->unk_192 = this->actor.wallYaw;
} else {
- if (Actor_XZDistanceToPoint(&this->actor, &this->actor.home.pos) > 300.0f) {
- this->unk_192 = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) > 300.0f) {
+ this->unk_192 = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
}
}
- if (!Math_SmoothStepToS(&this->actor.shape.rot.y, this->unk_192, 5, 0x300, 0x10) && (sp38 != 0) &&
+ if (!Math_SmoothStepToS(&this->actor.shape.rot.y, this->unk_192, 5, 0x300, 0x10) && onAnimFirstFrame &&
(Rand_ZeroOne() < 0.1f)) {
- s16 yaw = Actor_YawToPoint(&this->actor, &this->actor.home.pos) - this->actor.shape.rot.y;
+ s16 yaw = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos) - this->actor.shape.rot.y;
if (yaw > 0) {
this->unk_192 += Rand_S16Offset(4096, 4096);
} else {
this->unk_192 -= Rand_S16Offset(4096, 4096);
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_THIEFBIRD_VOICE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_THIEFBIRD_VOICE);
}
- if ((this->actor.depthInWater > -40.0f) || (this->actor.bgCheckFlags & 1)) {
+ if ((this->actor.depthInWater > -40.0f) || (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
this->unk_190 = -4096;
} else if (this->actor.world.pos.y < (this->actor.home.pos.y - 75.0f)) {
this->unk_190 = -Rand_S16Offset(2048, 2048);
@@ -512,7 +514,7 @@ void func_80C11590(EnThiefbird* this, PlayState* play) {
this->unk_190 = Rand_S16Offset(2048, 2048);
}
- if (!Math_SmoothStepToS(&this->actor.shape.rot.x, this->unk_190, 10, 0x100, 8) && (sp38 != 0) &&
+ if (!Math_SmoothStepToS(&this->actor.shape.rot.x, this->unk_190, 10, 0x100, 8) && onAnimFirstFrame &&
(Rand_ZeroOne() < 0.1f)) {
if (this->actor.home.pos.y < this->actor.world.pos.y) {
this->unk_190 -= Rand_S16Offset(0x400, 0x400);
@@ -538,7 +540,7 @@ void func_80C118E4(EnThiefbird* this) {
Animation_MorphToLoop(&this->skelAnime, &gTakkuriAttackAnim, -10.0f);
this->unk_18E = 300;
this->actionFunc = func_80C1193C;
- this->actor.speedXZ = 5.0f;
+ this->actor.speed = 5.0f;
}
void func_80C1193C(EnThiefbird* this, PlayState* play) {
@@ -547,17 +549,17 @@ void func_80C1193C(EnThiefbird* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (Animation_OnFrame(&this->skelAnime, 1.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KAICHO_FLUTTER);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KAICHO_FLUTTER);
}
if (this->unk_18E != 0) {
this->unk_18E--;
}
- pitch = Actor_PitchBetweenActors(&this->actor, &player->actor);
+ pitch = Actor_WorldPitchTowardActor(&this->actor, &player->actor);
pitch = CLAMP(pitch, -0x2800, 0x2800);
Math_SmoothStepToS(&this->actor.shape.rot.x, pitch, 4, 0x800, 0x80);
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.wallYaw, 6, 0x1000, 0x100);
} else if (Actor_IsFacingPlayer(&this->actor, 0x3C00) || (this->actor.xzDistToPlayer > 120.0f)) {
s16 rot = BINANG_ROT180(this->actor.yawTowardsPlayer - player->actor.shape.rot.y);
@@ -574,10 +576,10 @@ void func_80C1193C(EnThiefbird* this, PlayState* play) {
if ((this->unk_18E == 0) || (player->stateFlags1 & PLAYER_STATE1_800000) ||
(Player_GetMask(play) == PLAYER_MASK_STONE) || (this->collider.base.atFlags & AT_HIT) ||
- (this->actor.bgCheckFlags & 1) || (this->actor.depthInWater > -40.0f)) {
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (this->actor.depthInWater > -40.0f)) {
if (this->collider.base.atFlags & AT_HIT) {
this->collider.base.atFlags &= ~AT_HIT;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_THIEFBIRD_VOICE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_THIEFBIRD_VOICE);
if (!(this->collider.base.atFlags & AT_BOUNCED)) {
if ((D_80C1392C != 0) && CUR_UPG_VALUE(UPG_QUIVER) &&
((STOLEN_ITEM_1 == STOLEN_ITEM_NONE) || (STOLEN_ITEM_2 == STOLEN_ITEM_NONE)) &&
@@ -599,15 +601,15 @@ void func_80C1193C(EnThiefbird* this, PlayState* play) {
}
void func_80C11C60(EnThiefbird* this) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.velocity.y = 0.0f;
Animation_PlayOnce(&this->skelAnime, &gTakkuriDeathAnim);
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
this->actor.shape.rot.x = 0;
this->unk_18E = 40;
this->actor.velocity.y = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_THIEFBIRD_DEAD);
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_THIEFBIRD_DEAD);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 40);
this->collider.base.acFlags &= ~AC_ON;
this->actor.flags |= ACTOR_FLAG_10;
this->unk_192 = 0x1C00;
@@ -623,7 +625,7 @@ void func_80C11D14(EnThiefbird* this, PlayState* play) {
if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
if (this->unk_18E < 38) {
func_80C114C0(this, play);
- this->actor.speedXZ = 4.0f;
+ this->actor.speed = 4.0f;
} else {
return;
}
@@ -640,7 +642,7 @@ void func_80C11D14(EnThiefbird* this, PlayState* play) {
}
void func_80C11DC0(EnThiefbird* this) {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actionFunc = func_80C11DF0;
this->actor.gravity = -0.5f;
}
@@ -654,9 +656,9 @@ void func_80C11DF0(EnThiefbird* this, PlayState* play) {
this->actor.shape.rot.y += this->unk_192;
}
- if ((this->actor.bgCheckFlags & 1) || (this->actor.floorHeight == BGCHECK_Y_MIN)) {
- for (i = 0; i < ARRAY_COUNT(this->limbPos); i++) {
- func_800B3030(play, &this->limbPos[i], &gZeroVec3f, &gZeroVec3f, 0x8C, 0, 0);
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (this->actor.floorHeight == BGCHECK_Y_MIN)) {
+ for (i = 0; i < EN_THIEFBIRD_BODYPART_MAX; i++) {
+ func_800B3030(play, &this->bodyPartsPos[i], &gZeroVec3f, &gZeroVec3f, 0x8C, 0, 0);
}
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 11, NA_SE_EN_EXTINCT);
@@ -676,20 +678,20 @@ void func_80C11F6C(EnThiefbird* this, PlayState* play) {
Animation_MorphToLoop(&this->skelAnime, &gTakkuriFlyWithItemAnim, -4.0f);
func_80C10984(this, 15);
if (this->actor.colChkInfo.damageEffect != 3) {
- this->actor.speedXZ = 4.0f;
+ this->actor.speed = 4.0f;
} else {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
if (this->actor.colChkInfo.damageEffect == 5) {
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 40);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
} else if (this->actor.colChkInfo.damageEffect == 1) {
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 40);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
} else {
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 40);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_THIEFBIRD_DAMAGE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_THIEFBIRD_DAMAGE);
}
this->collider.base.acFlags &= ~AC_ON;
@@ -697,7 +699,7 @@ void func_80C11F6C(EnThiefbird* this, PlayState* play) {
this->unk_190 = -0x1000;
this->unk_192 = BINANG_ROT180(this->actor.yawTowardsPlayer);
} else {
- this->unk_190 = Actor_PitchToPoint(&this->actor, &D_80C13920);
+ this->unk_190 = Actor_WorldPitchTowardPoint(&this->actor, &D_80C13920);
}
this->unk_18E = 40;
@@ -725,20 +727,20 @@ void func_80C1215C(EnThiefbird* this, PlayState* play) {
if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
if (this->unk_18E < 38) {
func_80C114C0(this, play);
- this->actor.speedXZ = 4.0f;
+ this->actor.speed = 4.0f;
} else {
return;
}
}
SkelAnime_Update(&this->skelAnime);
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->unk_192 = this->actor.wallYaw;
} else if (this->unk_3E8 == 0) {
this->unk_192 = BINANG_ROT180(this->actor.yawTowardsPlayer);
} else {
- this->unk_192 = Actor_YawToPoint(&this->actor, &D_80C13920);
- this->unk_190 = Actor_PitchToPoint(&this->actor, &D_80C13920);
+ this->unk_192 = Actor_WorldYawTowardPoint(&this->actor, &D_80C13920);
+ this->unk_190 = Actor_WorldPitchTowardPoint(&this->actor, &D_80C13920);
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->unk_192, 6, 0x1000, 0x100);
@@ -771,7 +773,7 @@ void func_80C12378(EnThiefbird* this, PlayState* play) {
}
SkelAnime_Update(&this->skelAnime);
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->unk_192 = this->actor.wallYaw;
} else {
this->unk_192 = BINANG_ROT180(this->actor.yawTowardsPlayer);
@@ -790,7 +792,7 @@ void func_80C1242C(EnThiefbird* this) {
this->actor.flags |= ACTOR_FLAG_10;
this->collider.base.acFlags |= AC_ON;
this->actionFunc = func_80C124B0;
- this->actor.speedXZ = 12.0f;
+ this->actor.speed = 12.0f;
}
void func_80C124B0(EnThiefbird* this, PlayState* play) {
@@ -798,17 +800,18 @@ void func_80C124B0(EnThiefbird* this, PlayState* play) {
s16 temp_v1;
SkelAnime_Update(&this->skelAnime);
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->unk_192 = this->actor.wallYaw;
} else {
- this->unk_192 = Actor_YawToPoint(&this->actor, &D_80C13920);
+ this->unk_192 = Actor_WorldYawTowardPoint(&this->actor, &D_80C13920);
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->unk_192, 6, 0x1000, 0x100);
- Math_SmoothStepToS(&this->actor.shape.rot.x, Actor_PitchToPoint(&this->actor, &D_80C13920), 6, 0x1000, 0x100);
+ Math_SmoothStepToS(&this->actor.shape.rot.x, Actor_WorldPitchTowardPoint(&this->actor, &D_80C13920), 6, 0x1000,
+ 0x100);
temp_v0 = func_800BC270(play, &this->actor, 80.0f, 0x138B0);
if (temp_v0 != NULL) {
- temp_v1 = temp_v0->world.rot.x - Actor_PitchToPoint(temp_v0, &this->actor.focus.pos);
+ temp_v1 = temp_v0->world.rot.x - Actor_WorldPitchTowardPoint(temp_v0, &this->actor.focus.pos);
if (ABS_ALT(temp_v1) < 0x1800) {
if (temp_v1 > 0) {
this->unk_3E0 = 25.0f;
@@ -826,13 +829,13 @@ void func_80C124B0(EnThiefbird* this, PlayState* play) {
this->unk_3E0 * Math_SinS(this->actor.shape.rot.x) * Math_CosS(this->actor.shape.rot.y);
}
- if (Actor_DistanceToPoint(&this->actor, &D_80C13920) < 1000.0f) {
+ if (Actor_WorldDistXYZToPoint(&this->actor, &D_80C13920) < 1000.0f) {
func_80C126A8(this);
}
}
void func_80C126A8(EnThiefbird* this) {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->collider.base.acFlags &= ~AC_ON;
this->actionFunc = func_80C126D8;
}
@@ -852,7 +855,7 @@ void func_80C12744(EnThiefbird* this) {
this->collider.base.acFlags |= AC_ON;
this->actor.flags |= ACTOR_FLAG_10;
this->actionFunc = func_80C127F4;
- this->actor.speedXZ = 4.0f;
+ this->actor.speed = 4.0f;
this->skelAnime.playSpeed = 3.0f;
}
@@ -863,7 +866,7 @@ void func_80C127F4(EnThiefbird* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if ((this->unk_3EC != NULL) && ((this->unk_3EC->actor.update == NULL) || (this->unk_3EC->unk152 == 0) ||
- (Actor_XZDistanceBetweenActors(&player->actor, &this->unk_3EC->actor) <= 10.0f))) {
+ (Actor_WorldDistXZToActor(&player->actor, &this->unk_3EC->actor) <= 10.0f))) {
this->unk_3EC = NULL;
}
@@ -880,19 +883,19 @@ void func_80C127F4(EnThiefbird* this, PlayState* play) {
}
if (this->unk_3EC != NULL) {
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.wallYaw, 3, 0x2000, 0x100);
} else {
- Math_SmoothStepToS(&this->actor.shape.rot.y, Actor_YawBetweenActors(&this->actor, &this->unk_3EC->actor), 3,
- 0x2000, 0x100);
+ Math_SmoothStepToS(&this->actor.shape.rot.y, Actor_WorldYawTowardActor(&this->actor, &this->unk_3EC->actor),
+ 3, 0x2000, 0x100);
}
- temp_v0 = Math_Vec3f_Pitch(&this->limbPos[9], &this->unk_3EC->actor.world.pos);
+ temp_v0 = Math_Vec3f_Pitch(&this->bodyPartsPos[EN_THIEFBIRD_BODYPART_9], &this->unk_3EC->actor.world.pos);
temp_v0 = CLAMP(temp_v0, -0x3000, 0x3000);
Math_SmoothStepToS(&this->actor.shape.rot.x, temp_v0, 4, 0x800, 0x80);
- temp_f0 = Actor_DistanceToPoint(&this->unk_3EC->actor, &this->limbPos[9]);
- this->actor.speedXZ = (0.02f * temp_f0) + 2.0f;
- this->actor.speedXZ = CLAMP_MAX(this->actor.speedXZ, 4.0f);
- if ((this->unk_3EC->actor.speedXZ <= 0.0f) && (temp_f0 < 40.0f)) {
+ temp_f0 = Actor_WorldDistXYZToPoint(&this->unk_3EC->actor, &this->bodyPartsPos[EN_THIEFBIRD_BODYPART_9]);
+ this->actor.speed = (0.02f * temp_f0) + 2.0f;
+ this->actor.speed = CLAMP_MAX(this->actor.speed, 4.0f);
+ if ((this->unk_3EC->actor.speed <= 0.0f) && (temp_f0 < 40.0f)) {
s32 i;
this->unk_3EC->unk152 = 0;
@@ -907,8 +910,8 @@ void func_80C127F4(EnThiefbird* this, PlayState* play) {
this->unk_190 = -0x3800;
}
} else {
- this->actor.speedXZ = 4.0f;
- if (this->actor.bgCheckFlags & 8) {
+ this->actor.speed = 4.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.wallYaw, 6, 0x1000, 0x100);
} else {
Math_SmoothStepToS(&this->actor.shape.rot.y, BINANG_ROT180(this->actor.yawTowardsPlayer), 6, 0x1000, 0x100);
@@ -948,7 +951,8 @@ void func_80C12B1C(EnThiefbird* this, PlayState* play) {
if (i != ARRAY_COUNT(this->colliderElements)) {
sph = &this->collider.elements[i];
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, sph->info.bumper.hitPos.x,
- sph->info.bumper.hitPos.y, sph->info.bumper.hitPos.z, 0, 0, 0, CLEAR_TAG_LARGE_LIGHT_RAYS);
+ sph->info.bumper.hitPos.y, sph->info.bumper.hitPos.z, 0, 0, 0,
+ CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
}
} else if (this->actor.colChkInfo.damageEffect == 2) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
@@ -1019,7 +1023,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);
}
@@ -1035,14 +1040,14 @@ void EnThiefbird_Update(Actor* thisx, PlayState* play2) {
this->drawDmgEffScale = (this->drawDmgEffAlpha + 1.0f) * 0.25f;
this->drawDmgEffScale = CLAMP_MAX(this->drawDmgEffScale, 0.5f);
} else if (!Math_StepToF(&this->drawDmgEffFrozenSteamScale, 0.5f, 0.0125f)) {
- func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
}
func_80C12D00(this);
if (((this->skelAnime.animation == &gTakkuriFlyAnim) && Animation_OnFrame(&this->skelAnime, 13.0f)) ||
((this->skelAnime.animation == &gTakkuriFlyWithItemAnim) && Animation_OnFrame(&this->skelAnime, 1.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KAICHO_FLUTTER);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KAICHO_FLUTTER);
}
}
@@ -1061,14 +1066,31 @@ s32 EnThiefbird_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Ve
return false;
}
+static s8 sLimbToBodyParts[TAKKURI_LIMB_MAX] = {
+ BODYPART_NONE, // TAKKURI_LIMB_NONE
+ EN_THIEFBIRD_BODYPART_0, // TAKKURI_LIMB_BODY
+ BODYPART_NONE, // TAKKURI_LIMB_LEFT_WING_BASE
+ EN_THIEFBIRD_BODYPART_1, // TAKKURI_LIMB_LEFT_WING_MIDDLE
+ EN_THIEFBIRD_BODYPART_3, // TAKKURI_LIMB_LEFT_WING_TIP
+ BODYPART_NONE, // TAKKURI_LIMB_RIGHT_WING_BASE
+ EN_THIEFBIRD_BODYPART_2, // TAKKURI_LIMB_RIGHT_WING_MIDDLE
+ EN_THIEFBIRD_BODYPART_5, // TAKKURI_LIMB_RIGHT_WING_TIP
+ BODYPART_NONE, // TAKKURI_LIMB_NECK
+ BODYPART_NONE, // TAKKURI_LIMB_HEAD
+ EN_THIEFBIRD_BODYPART_7, // TAKKURI_LIMB_RIGHT_EAR
+ EN_THIEFBIRD_BODYPART_8, // TAKKURI_LIMB_LEFT_EAR
+ EN_THIEFBIRD_BODYPART_9, // TAKKURI_LIMB_LOWER_BEAK
+ BODYPART_NONE, // TAKKURI_LIMB_EYES
+ BODYPART_NONE, // TAKKURI_LIMB_LEGS
+ EN_THIEFBIRD_BODYPART_10, // TAKKURI_LIMB_FEET
+ BODYPART_NONE, // TAKKURI_LIMB_STOLEN_ITEM
+};
+
void EnThiefbird_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
- static s8 D_80C13698[] = {
- -1, 0, -1, 1, 3, -1, 2, 5, -1, -1, 7, 8, 9, -1, -1, 10, -1,
- };
EnThiefbird* this = THIS;
s32 pad;
Gfx* gfx;
- s8 idx;
+ s8 bodyPartIndex;
Collider_UpdateSpheres(limbIndex, &this->collider);
if ((limbIndex == TAKKURI_LIMB_RIGHT_EAR) || (limbIndex == TAKKURI_LIMB_LEFT_EAR)) {
@@ -1104,14 +1126,14 @@ void EnThiefbird_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s
}
}
- idx = D_80C13698[limbIndex];
- if (idx != -1) {
- if (idx == 9) {
- Matrix_MultVecX(1000.0f, &this->limbPos[idx]);
+ bodyPartIndex = sLimbToBodyParts[limbIndex];
+ if (bodyPartIndex != BODYPART_NONE) {
+ if (bodyPartIndex == EN_THIEFBIRD_BODYPART_9) {
+ Matrix_MultVecX(1000.0f, &this->bodyPartsPos[bodyPartIndex]);
} else {
- Matrix_MultZero(&this->limbPos[idx]);
- if ((idx == 3) || (idx == 5)) {
- Matrix_MultVecX(2000.0f, &this->limbPos[idx + 1]);
+ Matrix_MultZero(&this->bodyPartsPos[bodyPartIndex]);
+ if ((bodyPartIndex == EN_THIEFBIRD_BODYPART_3) || (bodyPartIndex == EN_THIEFBIRD_BODYPART_5)) {
+ Matrix_MultVecX(2000.0f, &this->bodyPartsPos[bodyPartIndex + 1]);
}
}
}
@@ -1126,7 +1148,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];
@@ -1152,14 +1174,14 @@ 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) {
func_800AE5A0(play);
}
func_80C13354(this, play);
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), this->drawDmgEffScale,
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, EN_THIEFBIRD_BODYPART_MAX, this->drawDmgEffScale,
this->drawDmgEffFrozenSteamScale, this->drawDmgEffAlpha, this->drawDmgEffType);
Math_Vec3s_ToVec3f(&this->actor.focus.pos, &this->collider.elements[1].dim.worldSphere.center);
}
diff --git a/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.h b/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.h
index c40555299..bbe354848 100644
--- a/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.h
+++ b/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.h
@@ -18,6 +18,21 @@ typedef struct {
/* 0x22 */ s16 unk_22;
} EnThiefbirdUnkStruct; // size = 0x24
+typedef enum EnThiefbirdBodyPart {
+ /* 0 */ EN_THIEFBIRD_BODYPART_0,
+ /* 1 */ EN_THIEFBIRD_BODYPART_1,
+ /* 2 */ EN_THIEFBIRD_BODYPART_2,
+ /* 3 */ EN_THIEFBIRD_BODYPART_3,
+ /* 4 */ EN_THIEFBIRD_BODYPART_4,
+ /* 5 */ EN_THIEFBIRD_BODYPART_5,
+ /* 6 */ EN_THIEFBIRD_BODYPART_6,
+ /* 7 */ EN_THIEFBIRD_BODYPART_7,
+ /* 8 */ EN_THIEFBIRD_BODYPART_8,
+ /* 9 */ EN_THIEFBIRD_BODYPART_9,
+ /* 10 */ EN_THIEFBIRD_BODYPART_10,
+ /* 11 */ EN_THIEFBIRD_BODYPART_MAX
+} EnThiefbirdBodyPart;
+
typedef struct EnThiefbird {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
@@ -32,7 +47,7 @@ typedef struct EnThiefbird {
/* 0x208 */ Vec3s morphTable[TAKKURI_LIMB_MAX];
/* 0x270 */ ColliderJntSph collider;
/* 0x290 */ ColliderJntSphElement colliderElements[3];
- /* 0x350 */ Vec3f limbPos[11];
+ /* 0x350 */ Vec3f bodyPartsPos[EN_THIEFBIRD_BODYPART_MAX];
/* 0x3D4 */ f32 drawDmgEffAlpha;
/* 0x3D8 */ f32 drawDmgEffScale;
/* 0x3DC */ f32 drawDmgEffFrozenSteamScale;
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 4e09f01a9..d99ee0bce 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
@@ -1,7 +1,11 @@
/*
* File: z_en_time_tag.c
* Overlay: ovl_En_Time_Tag
- * Description:
+ * Description: Various text-, time- and event-based triggers. There are 4 variations of this actor.
+ * - Song of Soaring engraving
+ * - Clocktown Rooftop Oath to Order event
+ * - Mikau's and Lulu's diary
+ * - Kick out of scene event after a certain time
*/
#include "z_en_time_tag.h"
@@ -15,20 +19,23 @@ void EnTimeTag_Init(Actor* thisx, PlayState* play);
void EnTimeTag_Destroy(Actor* thisx, PlayState* play);
void EnTimeTag_Update(Actor* thisx, PlayState* play);
-void func_80AC9FD4(EnTimeTag* this, PlayState* play);
-void func_80AC9FE4(EnTimeTag* this, PlayState* play);
-void func_80ACA0A8(EnTimeTag* this, PlayState* play);
-void func_80ACA12C(EnTimeTag* this, PlayState* play);
-void func_80ACA184(EnTimeTag* this, PlayState* play);
-void func_80ACA268(EnTimeTag* this, PlayState* play);
-void func_80ACA348(EnTimeTag* this, PlayState* play);
-void func_80ACA3C0(EnTimeTag* this, PlayState* play);
-void func_80ACA418(EnTimeTag* this, PlayState* play);
-void func_80ACA5F8(EnTimeTag* this, PlayState* play);
-void func_80ACA714(EnTimeTag* this, PlayState* play);
-void func_80ACA724(EnTimeTag* this, PlayState* play);
-void func_80ACA7C4(EnTimeTag* this, PlayState* play);
-void func_80ACA840(EnTimeTag* this, PlayState* play);
+void EnTimeTag_RooftopOath_DoNothing(EnTimeTag* this, PlayState* play);
+void EnTimeTag_RooftopOath_Cutscene(EnTimeTag* this, PlayState* play);
+void EnTimeTag_RooftopOath_Wait(EnTimeTag* this, PlayState* play);
+
+void EnTimeTag_SoaringEngraving_GetSong(EnTimeTag* this, PlayState* play);
+void EnTimeTag_SoaringEngraving_StartCutscene(EnTimeTag* this, PlayState* play);
+void EnTimeTag_SoaringEngraving_Wait(EnTimeTag* this, PlayState* play);
+
+void EnTimeTag_Diary_AfterOcarina(EnTimeTag* this, PlayState* play);
+void EnTimeTag_Diary_TeachEvanSongSnippets(EnTimeTag* this, PlayState* play);
+void EnTimeTag_Diary_Cutscene(EnTimeTag* this, PlayState* play);
+void EnTimeTag_Diary_Wait(EnTimeTag* this, PlayState* play);
+
+void EnTimeTag_KickOut_DoNothing(EnTimeTag* this, PlayState* play);
+void EnTimeTag_KickOut_Transition(EnTimeTag* this, PlayState* play);
+void EnTimeTag_KickOut_WaitForTrigger(EnTimeTag* this, PlayState* play);
+void EnTimeTag_KickOut_WaitForTime(EnTimeTag* this, PlayState* play);
ActorInit En_Time_Tag_InitVars = {
ACTOR_EN_TIME_TAG,
@@ -45,37 +52,41 @@ ActorInit En_Time_Tag_InitVars = {
void EnTimeTag_Init(Actor* thisx, PlayState* play) {
EnTimeTag* this = THIS;
- this->actionFunc = func_80ACA840;
+ this->actionFunc = EnTimeTag_KickOut_WaitForTime;
- switch (ENTIMETAG_GET_E000(&this->actor)) {
- case 4:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_08_40) || (CURRENT_DAY != 3)) {
+ switch (TIMETAG_GET_TYPE(&this->actor)) {
+ case TIMETAG_KICKOUT_FINAL_HOURS:
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLOCK_TOWER_OPENED) || (CURRENT_DAY != 3)) {
Actor_Kill(&this->actor);
return;
}
- this->actor.home.rot.x = 0;
- this->actor.home.rot.y = 0;
+ // Overwrite kickout time to midnight
+ TIMETAG_KICKOUT_HOUR(&this->actor) = 0;
+ TIMETAG_KICKOUT_MINUTE(&this->actor) = 0;
break;
- case 2:
- this->actionFunc = func_80ACA0A8;
+ case TIMETAG_ROOFTOP_OATH:
+ this->actionFunc = EnTimeTag_RooftopOath_Wait;
this->actor.flags |= ACTOR_FLAG_2000000;
break;
- case 1:
- this->actionFunc = func_80ACA268;
+ case TIMETAG_SOARING_ENGRAVING:
+ this->actionFunc = EnTimeTag_SoaringEngraving_Wait;
this->actor.flags |= ACTOR_FLAG_2000000;
if (CHECK_QUEST_ITEM(QUEST_SONG_SOARING)) {
this->actor.textId = 0xC02;
- return;
+ } else {
+ this->actor.textId = 0;
}
- this->actor.textId = 0;
break;
- case 3:
- this->actionFunc = func_80ACA5F8;
+ case TIMETAG_DIARY:
+ this->actionFunc = EnTimeTag_Diary_Wait;
this->actor.textId = 0;
- this->actor.home.rot.x = 0;
+ TIMETAG_DIARY_TIMER(&this->actor) = 0;
+ break;
+
+ default:
break;
}
}
@@ -83,222 +94,249 @@ void EnTimeTag_Init(Actor* thisx, PlayState* play) {
void EnTimeTag_Destroy(Actor* thisx, PlayState* play) {
}
-void func_80AC9FD4(EnTimeTag* this, PlayState* play) {
+void EnTimeTag_RooftopOath_DoNothing(EnTimeTag* this, PlayState* play) {
}
-void func_80AC9FE4(EnTimeTag* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
- this->actionFunc = func_80AC9FD4;
+void EnTimeTag_RooftopOath_Cutscene(EnTimeTag* this, PlayState* play) {
+ 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;
+
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)) {
SET_WEEKEVENTREG(WEEKEVENTREG_25_02);
}
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
-void func_80ACA0A8(EnTimeTag* this, PlayState* play) {
- EnTimeTag* this2 = this;
+void EnTimeTag_RooftopOath_Wait(EnTimeTag* this, PlayState* play) {
+ Actor* thisx = &this->actor;
- if ((play->msgCtx.ocarinaMode == 3) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_OATH)) {
- if (this->actor.cutscene != -1) {
- this->actionFunc = func_80AC9FE4;
- ActorCutscene_SetIntentToPlay(this2->actor.cutscene);
+ if ((play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_OATH)) {
+ if (this->actor.csId != CS_ID_NONE) {
+ this->actionFunc = EnTimeTag_RooftopOath_Cutscene;
+ CutsceneManager_Queue(thisx->csId);
gSaveContext.timerStates[TIMER_ID_MOON_CRASH] = TIMER_STATE_OFF;
}
- play->msgCtx.ocarinaMode = 4;
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
}
}
-void func_80ACA12C(EnTimeTag* this, PlayState* play) {
- if (ActorCutscene_GetCurrentIndex() != this->actor.cutscene) {
- this->actionFunc = func_80ACA268;
+void EnTimeTag_SoaringEngraving_GetSong(EnTimeTag* this, PlayState* play) {
+ if (CutsceneManager_GetCurrentCsId() != this->actor.csId) {
+ this->actionFunc = EnTimeTag_SoaringEngraving_Wait;
this->actor.textId = 0xC02;
Item_Give(play, ITEM_SONG_SOARING);
}
}
-void func_80ACA184(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);
- this->actionFunc = func_80ACA12C;
+void EnTimeTag_SoaringEngraving_StartCutscene(EnTimeTag* this, PlayState* play) {
+ 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);
}
}
-void func_80ACA208(EnTimeTag* this, PlayState* play) {
+void EnTimeTag_SoaringEngraving_SubsequentInteraction(EnTimeTag* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
- this->actionFunc = func_80ACA268;
+ Message_CloseTextbox(play);
+ this->actionFunc = EnTimeTag_SoaringEngraving_Wait;
}
}
-void func_80ACA268(EnTimeTag* this, PlayState* play) {
+void EnTimeTag_SoaringEngraving_Wait(EnTimeTag* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
if (this->actor.textId == 0) {
- this->actionFunc = func_80ACA184;
+ this->actionFunc = EnTimeTag_SoaringEngraving_StartCutscene;
} else {
- this->actionFunc = func_80ACA208;
+ this->actionFunc = EnTimeTag_SoaringEngraving_SubsequentInteraction;
}
} else if ((this->actor.xzDistToPlayer < 100.0f) && Player_IsFacingActor(&this->actor, 0x3000, play) &&
- (Flags_GetSwitch(play, ENTIMETAG_GET_SWITCHFLAG(&this->actor)) ||
+ (Flags_GetSwitch(play, TIMETAG_SOARING_GET_SWITCH_FLAG(&this->actor)) ||
CHECK_QUEST_ITEM(QUEST_SONG_SOARING))) {
- this->actor.flags |= ACTOR_FLAG_1;
- func_800B8614(&this->actor, play, 110.0f);
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
+ Actor_OfferTalk(&this->actor, play, 110.0f);
}
}
-void func_80ACA348(EnTimeTag* this, PlayState* play) {
- if (this->actor.home.rot.x > 0) {
- this->actor.home.rot.x--;
+void EnTimeTag_Diary_AfterOcarina(EnTimeTag* this, PlayState* play) {
+ if (TIMETAG_DIARY_TIMER(&this->actor) > 0) {
+ TIMETAG_DIARY_TIMER(&this->actor)--;
return;
}
- if (this->actor.home.rot.z != 0) {
- func_80151938(play, 0x1230);
+ if (TIMETAG_DIARY_SONG(&this->actor) != TIMETAG_DIARY_SONG_EVAN_PART1) {
+ // TIMETAG_DIARY_SONG_EVAN_PART2
+ Message_ContinueTextbox(play, 0x1230);
} else {
- func_80151938(play, 0x122D);
+ // TIMETAG_DIARY_SONG_EVAN_PART1
+ Message_ContinueTextbox(play, 0x122D);
}
- this->actionFunc = func_80ACA418;
+ this->actionFunc = EnTimeTag_Diary_Cutscene;
}
-void func_80ACA3C0(EnTimeTag* this, PlayState* play) {
- if ((play->msgCtx.unk11F00->state == 0) && (play->msgCtx.msgMode == 0x1B)) {
- this->actor.home.rot.x = 5;
- this->actionFunc = func_80ACA348;
+void EnTimeTag_Diary_TeachEvanSongSnippets(EnTimeTag* this, PlayState* play) {
+ if ((play->msgCtx.ocarinaStaff->state == 0) && (play->msgCtx.msgMode == MSGMODE_SONG_DEMONSTRATION_DONE)) {
+ TIMETAG_DIARY_TIMER(&this->actor) = 5;
+ this->actionFunc = EnTimeTag_Diary_AfterOcarina;
play->msgCtx.msgLength = 0;
- play->msgCtx.msgMode = 0;
+ play->msgCtx.msgMode = MSGMODE_NONE;
}
}
-void func_80ACA418(EnTimeTag* this, PlayState* play) {
+void EnTimeTag_Diary_Cutscene(EnTimeTag* this, PlayState* play) {
switch (Message_GetState(&play->msgCtx)) {
case TEXT_STATE_5:
if (Message_ShouldAdvance(play)) {
switch (play->msgCtx.currentTextId) {
- case 0x101C:
- case 0x101D:
- case 0x101E:
- case 0x122D:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ case 0x101C: // Lulu diary part 1
+ case 0x101D: // Lulu diary part 2
+ case 0x101E: // Lulu diary part 3
+ case 0x122D: // Mikau diary part 2
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
- case 0x101F:
- case 0x122A:
- case 0x1230:
- func_801477B4(play);
- this->actionFunc = func_80ACA5F8;
- if (ActorCutscene_GetCurrentIndex() == this->actor.cutscene) {
- ActorCutscene_Stop(this->actor.cutscene);
+ case 0x101F: // Lulu diary part 4
+ case 0x122A: // Can not read Zora script
+ case 0x1230: // Mikau diary part 4
+ Message_CloseTextbox(play);
+ this->actionFunc = EnTimeTag_Diary_Wait;
+ if (CutsceneManager_GetCurrentCsId() == this->actor.csId) {
+ CutsceneManager_Stop(this->actor.csId);
}
break;
- case 0x122B:
- func_80152434(play, 0x3F);
- this->actionFunc = func_80ACA3C0;
- this->actor.home.rot.z = 0;
+ case 0x122B: // Mikau diary part 1
+ Message_DisplayOcarinaStaff(play, OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_SECOND_HALF);
+ this->actionFunc = EnTimeTag_Diary_TeachEvanSongSnippets;
+ TIMETAG_DIARY_SONG(&this->actor) = TIMETAG_DIARY_SONG_EVAN_PART1;
break;
- case 0x122E:
- func_80152434(play, 0x40);
- this->actionFunc = func_80ACA3C0;
- this->actor.home.rot.z = 1;
+ case 0x122E: // Mikau diary part 3
+ Message_DisplayOcarinaStaff(play, OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_SECOND_HALF);
+ this->actionFunc = EnTimeTag_Diary_TeachEvanSongSnippets;
+ TIMETAG_DIARY_SONG(&this->actor) = TIMETAG_DIARY_SONG_EVAN_PART2;
+ break;
+
+ default:
break;
}
}
break;
case TEXT_STATE_CLOSING:
- this->actionFunc = func_80ACA5F8;
+ this->actionFunc = EnTimeTag_Diary_Wait;
break;
}
- if (this->actor.home.rot.x != 0) {
- if (this->actor.cutscene == -1) {
- this->actor.home.rot.x = 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);
- this->actor.home.rot.x = 0;
+ if (TIMETAG_DIARY_TIMER(&this->actor) != 0) {
+ if (this->actor.csId == CS_ID_NONE) {
+ TIMETAG_DIARY_TIMER(&this->actor) = 0;
+ } 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);
}
}
}
-void func_80ACA5F8(EnTimeTag* this, PlayState* play) {
+void EnTimeTag_Diary_Wait(EnTimeTag* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
- if (ENTIMETAG_GET_SWITCHFLAG(&this->actor) == 1) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
+ if (TIMETAG_DIARY_GET_TYPE(&this->actor) == TIMETAG_DIARY_LULU) {
Message_StartTextbox(play, 0x101C, &this->actor);
} else {
+ // TIMETAG_DIARY_MIKAU
Message_StartTextbox(play, 0x122B, &this->actor);
}
- this->actor.home.rot.x = 1;
+ TIMETAG_DIARY_TIMER(&this->actor) = 1;
} else {
+ // unable to read Zora script
Message_StartTextbox(play, 0x122A, &this->actor);
+
+ //! FAKE: https://decomp.me/scratch/AHRNe
if (0) {}
+
((EnElf*)GET_PLAYER(play)->tatlActor)->unk_264 |= 4;
Actor_ChangeFocus(&this->actor, play, GET_PLAYER(play)->tatlActor);
- this->actor.home.rot.x = 0;
+ TIMETAG_DIARY_TIMER(&this->actor) = 0;
}
- this->actionFunc = func_80ACA418;
+ this->actionFunc = EnTimeTag_Diary_Cutscene;
} else if ((this->actor.xzDistToPlayer < 100.0f) && Player_IsFacingActor(&this->actor, 0x3000, play)) {
- func_800B8614(&this->actor, play, 110.0f);
+ Actor_OfferTalk(&this->actor, play, 110.0f);
}
}
-void func_80ACA714(EnTimeTag* this, PlayState* play) {
+void EnTimeTag_KickOut_DoNothing(EnTimeTag* this, PlayState* play) {
}
-void func_80ACA724(EnTimeTag* this, PlayState* play) {
+void EnTimeTag_KickOut_Transition(EnTimeTag* this, PlayState* play) {
if (Message_GetState(&play->msgCtx) == TEXT_STATE_5) {
- play->nextEntrance = play->setupExitList[ENTIMETAG_GET_1F(&this->actor)];
+ play->nextEntrance = play->setupExitList[TIMETAG_KICKOUT_GET_EXIT_INDEX(&this->actor)];
play->transitionTrigger = TRANS_TRIGGER_START;
- if (!ENTIMETAG_GET_E000(&this->actor)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_OC_DOOR_OPEN);
+ if (TIMETAG_GET_TYPE(&this->actor) == TIMETAG_KICKOUT_DOOR) {
+ Actor_PlaySfx(&this->actor, NA_SE_OC_DOOR_OPEN);
}
- this->actionFunc = func_80ACA714;
+ this->actionFunc = EnTimeTag_KickOut_DoNothing;
}
}
-void func_80ACA7C4(EnTimeTag* this, PlayState* play) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_63_01) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_63_02)) {
- func_800B7298(play, &this->actor, PLAYER_CSMODE_7);
- Message_StartTextbox(play, ENTIMETAG_GET_1FE0(&this->actor) + 0x1883, NULL);
- this->actionFunc = func_80ACA724;
+/**
+ * Setup a request to kickout, but wait for an external system to unset
+ * both `WEEKEVENTREG_KICKOUT_WAIT` and `WEEKEVENTREG_KICKOUT_TIME_PASSED`
+ */
+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_WAIT);
+ Message_StartTextbox(play, 0x1883 + TIMETAG_KICKOUT_GET_TEXT(&this->actor), NULL);
+ this->actionFunc = EnTimeTag_KickOut_Transition;
}
}
-void func_80ACA840(EnTimeTag* this, PlayState* play) {
- s16 temp_ft4;
- s16 temp_hi;
+/**
+ * Wait for a certain time to pass, then trigger the kickout event.
+ * If an external system sets `WEEKEVENTREG_KICKOUT_WAIT`, then instead of triggering the kickout event now,
+ * store the kickout by going to `EnTimeTag_KickOut_WaitForTrigger`.
+ * If the time has passed but the kickout is being stored, then `WEEKEVENTREG_KICKOUT_TIME_PASSED` is set here
+ * to indicate to external systems that the time has passed and is waiting for a trigger.
+ */
+void EnTimeTag_KickOut_WaitForTime(EnTimeTag* this, PlayState* play) {
+ s16 hour;
+ s16 minute;
- if ((play->sceneId != SCENE_YADOYA) || (INV_CONTENT(ITEM_ROOM_KEY) != ITEM_ROOM_KEY)) {
- temp_ft4 = gSaveContext.save.time * (24.0f / 0x10000); // TIME_TO_HOURS_F
- temp_hi = (s32)TIME_TO_MINUTES_F(gSaveContext.save.time) % 60;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_63_01)) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_63_02)) {
- this->actionFunc = func_80ACA7C4;
- } else if ((temp_ft4 == this->actor.home.rot.x) && (temp_hi == this->actor.home.rot.y)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_63_02);
- }
- } else if ((temp_ft4 == this->actor.home.rot.x) && (temp_hi == this->actor.home.rot.y) &&
- !Play_InCsMode(play)) {
- func_800B7298(play, &this->actor, PLAYER_CSMODE_7);
- Message_StartTextbox(play, ENTIMETAG_GET_1FE0(&this->actor) + 0x1883, NULL);
- this->actionFunc = func_80ACA724;
+ if ((play->sceneId == SCENE_YADOYA) && (INV_CONTENT(ITEM_ROOM_KEY) == ITEM_ROOM_KEY)) {
+ // Having the room key allows you to stay in Stock Pot Inn
+ return;
+ }
+
+ hour = TIME_TO_HOURS_F(gSaveContext.save.time);
+ minute = (s32)TIME_TO_MINUTES_F(gSaveContext.save.time) % 60;
+
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED)) {
+ this->actionFunc = EnTimeTag_KickOut_WaitForTrigger;
+ } else if ((hour == TIMETAG_KICKOUT_HOUR(&this->actor)) && (minute == TIMETAG_KICKOUT_MINUTE(&this->actor))) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED);
}
+ } else if ((hour == TIMETAG_KICKOUT_HOUR(&this->actor)) && (minute == TIMETAG_KICKOUT_MINUTE(&this->actor)) &&
+ !Play_InCsMode(play)) {
+ 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 ed6b611e4..33f6d414e 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
@@ -7,10 +7,57 @@ struct EnTimeTag;
typedef void (*EnTimeTagActionFunc)(struct EnTimeTag*, PlayState*);
-#define ENTIMETAG_GET_1F(thisx) ((thisx)->params & 0x1F)
-#define ENTIMETAG_GET_SWITCHFLAG(thisx) ((thisx)->params & 0x7F)
-#define ENTIMETAG_GET_1FE0(thisx) (((thisx)->params & 0x1FE0) >> 0x5)
-#define ENTIMETAG_GET_E000(thisx) (((thisx)->params & 0xE000) >> 0xD)
+#define TIMETAG_GET_TYPE(thisx) (((thisx)->params & 0xE000) >> 0xD)
+
+#define TIMETAG_KICKOUT_GET_TEXT(thisx) (((thisx)->params & 0x1FE0) >> 0x5)
+#define TIMETAG_KICKOUT_GET_EXIT_INDEX(thisx) ((thisx)->params & 0x1F)
+#define TIMETAG_KICKOUT_HOUR(thisx) ((thisx)->home.rot.x)
+#define TIMETAG_KICKOUT_MINUTE(thisx) ((thisx)->home.rot.y)
+
+#define TIMETAG_SOARING_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
+
+#define TIMETAG_DIARY_GET_TYPE(thisx) ((thisx)->params & 0x7F)
+#define TIMETAG_DIARY_TIMER(thisx) ((thisx)->home.rot.x)
+#define TIMETAG_DIARY_SONG(thisx) ((thisx)->home.rot.z)
+
+typedef enum {
+ /* 0 */ TIMETAG_KICKOUT_DOOR,
+ /* 1 */ TIMETAG_SOARING_ENGRAVING,
+ /* 2 */ TIMETAG_ROOFTOP_OATH,
+ /* 3 */ TIMETAG_DIARY,
+ /* 4 */ TIMETAG_KICKOUT_FINAL_HOURS,
+ /* 5 */ TIMETAG_KICKOUT_NO_DOOR
+} TimeTagType;
+
+typedef enum {
+ /* 0 */ TIMETAG_DIARY_MIKAU,
+ /* 1 */ TIMETAG_DIARY_LULU
+} TimeTagDiaryType;
+
+typedef enum {
+ /* 0 */ TIMETAG_DIARY_SONG_EVAN_PART1,
+ /* 1 */ TIMETAG_DIARY_SONG_EVAN_PART2
+} TimeTagDiarySong;
+
+typedef enum {
+ /* 0 */ TIMETAG_KICKOUT_TEXT_0, // I am closing the shop
+ /* 1 */ TIMETAG_KICKOUT_TEXT_SWAMP_SHOOTING_GALLERY, // time to close shop
+ /* 2 */ TIMETAG_KICKOUT_TEXT_STOCK_POT_INN, // Stock Pot Inn locking the door
+ /* 3 */ TIMETAG_KICKOUT_TEXT_HONEY_AND_DARLING, // need some alone time
+ /* 4 */ TIMETAG_KICKOUT_TEXT_LOTTERY, // business is finished
+ /* 5 */ TIMETAG_KICKOUT_TEXT_BARN_DAY, // the lady needs a break
+ /* 6 */ TIMETAG_KICKOUT_TEXT_GENERIC, // (Many scenes) place is about to close
+ /* 7 */ TIMETAG_KICKOUT_TEXT_BARN_NIGHT, // they came
+ /* 8 */ TIMETAG_KICKOUT_TEXT_TRADING_POST, // we have to close shop
+ /* 9 */ TIMETAG_KICKOUT_TEXT_MILK_BAR, // I have to get ready for business
+ /* 10 */ TIMETAG_KICKOUT_TEXT_CURIOSITY_SHOP_BACK_1, // shop is opening, you need to go
+ /* 11 */ TIMETAG_KICKOUT_TEXT_CURIOSITY_SHOP_BACK_2, // shop is opening, we're in the way
+ /* 12 */ TIMETAG_KICKOUT_TEXT_TOWN_SHOOTING_GALLERY_1, // it's time to close
+ /* 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
+} TimeTagKickOutText;
typedef struct EnTimeTag {
/* 0x000 */ Actor actor;
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 eb005b224..bf861c2da 100644
--- a/src/overlays/actors/ovl_En_Tite/z_en_tite.c
+++ b/src/overlays/actors/ovl_En_Tite/z_en_tite.c
@@ -5,9 +5,10 @@
*/
#include "z_en_tite.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "objects/object_tite/object_tite.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_200)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_200)
#define THIS ((EnTite*)thisx)
@@ -147,7 +148,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++) {
@@ -161,7 +163,7 @@ void EnTite_Init(Actor* thisx, PlayState* play) {
if (this->actor.params == ENTITE_MINUS_3) {
this->actor.params = ENTITE_MINUS_2;
this->unk_2BE = 240;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.shape.yOffset = -3000.0f;
this->actor.shape.shadowDraw = NULL;
func_80895A10(this);
@@ -178,7 +180,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;
}
}
@@ -195,8 +197,8 @@ void func_80893A18(EnTite* this) {
}
s32 func_80893A34(EnTite* this, PlayState* play) {
- if ((this->actor.params == ENTITE_MINUS_2) && (this->actor.bgCheckFlags & 1) &&
- (func_800C99D4(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId) == 5)) {
+ if ((this->actor.params == ENTITE_MINUS_2) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
+ (SurfaceType_GetFloorType(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId) == FLOOR_TYPE_5)) {
return true;
}
return false;
@@ -211,7 +213,7 @@ void func_80893A9C(EnTite* this, PlayState* play) {
}
s32 func_80893ADC(EnTite* this) {
- if ((this->actor.params == ENTITE_MINUS_2) && (this->actor.bgCheckFlags & 0x20)) {
+ if ((this->actor.params == ENTITE_MINUS_2) && (this->actor.bgCheckFlags & BGCHECKFLAG_WATER)) {
return true;
}
return false;
@@ -224,7 +226,7 @@ s32 func_80893B10(EnTite* this) {
void func_80893B70(EnTite* this) {
if (this->actor.params == ENTITE_MINUS_2) {
- if (this->actor.bgCheckFlags & 0x20) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER) {
this->actor.gravity = 0.0f;
func_80893B10(this);
} else {
@@ -238,28 +240,29 @@ void func_80893BCC(EnTite* this, PlayState* play) {
s32 i;
s32 j;
- if (this->actor.bgCheckFlags & 2) {
- u32 surface = func_800C9BB8(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
+ SurfaceMaterial surfaceMaterial =
+ SurfaceType_GetMaterial(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
- if ((surface == COLPOLY_SURFACE_GROUND) || (surface == COLPOLY_SURFACE_SAND)) {
- for (i = 5; i < ARRAY_COUNT(this->limbPos); i++) {
- func_800BBFB0(play, &this->limbPos[i], 1.0f, 2, 80, 15, 1);
+ if ((surfaceMaterial == SURFACE_MATERIAL_DIRT) || (surfaceMaterial == SURFACE_MATERIAL_SAND)) {
+ for (i = ENTITE_BODYPART_5; i < ENTITE_BODYPART_MAX; i++) {
+ func_800BBFB0(play, &this->bodyPartsPos[i], 1.0f, 2, 80, 15, 1);
}
- } else if (surface == COLPOLY_SURFACE_SNOW) {
- Vec3f* ptr;
+ } else if (surfaceMaterial == SURFACE_MATERIAL_SNOW) {
+ Vec3f* bodyPartPos;
- for (i = 5; i < ARRAY_COUNT(this->limbPos); i++) {
+ for (i = ENTITE_BODYPART_5; i < ENTITE_BODYPART_MAX; 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);
+ bodyPartPos = &this->bodyPartsPos[i];
+ sp7C.x = bodyPartPos->x + Rand_CenteredFloat(1.0f);
+ sp7C.y = bodyPartPos->y + Rand_CenteredFloat(1.0f);
+ sp7C.z = bodyPartPos->z + Rand_CenteredFloat(1.0f);
func_800B0DE0(play, &sp7C, &gZeroVec3f, &D_80896B64, &D_80896B3C, &D_80896B40,
(s32)Rand_ZeroFloat(16.0f) + 80, 15);
}
}
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EYEGOLE_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_ATTACK);
}
}
@@ -270,7 +273,7 @@ void func_80893DD4(EnTite* this) {
this->drawDmgEffScale = 0.5f;
this->drawDmgEffFrozenSteamScale = 0.75f;
this->drawDmgEffAlpha = 1.0f;
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 80);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 80);
this->actor.flags &= ~ACTOR_FLAG_200;
}
@@ -279,7 +282,7 @@ void func_80893E54(EnTite* this, PlayState* play) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->collider.base.colType = COLTYPE_HIT6;
this->drawDmgEffAlpha = 0.0f;
- Actor_SpawnIceEffects(play, &this->actor, this->limbPos, 9, 2, 0.2f, 0.2f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, ENTITE_BODYPART_MAX, 2, 0.2f, 0.2f);
this->actor.flags |= ACTOR_FLAG_200;
}
}
@@ -287,7 +290,7 @@ void func_80893E54(EnTite* this, PlayState* play) {
void func_80893ED4(EnTite* this) {
Animation_MorphToLoop(&this->skelAnime, &object_tite_Anim_0012E4, 4.0f);
this->unk_2BC = Rand_S16Offset(15, 30);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = func_80893F30;
}
@@ -305,7 +308,7 @@ void func_80893F30(EnTite* this, PlayState* play) {
void func_80893FD0(EnTite* this) {
Animation_PlayOnce(&this->skelAnime, &object_tite_Anim_00083C);
this->actor.velocity.y = 0.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = func_80894024;
}
@@ -323,10 +326,10 @@ void func_80894024(EnTite* this, PlayState* play) {
void func_8089408C(EnTite* this, PlayState* play) {
Animation_PlayOnce(&this->skelAnime, &object_tite_Anim_0004F8);
if (!func_80893ADC(this)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_TEKU_JUMP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_TEKU_JUMP);
} else {
this->actor.world.pos.y += this->actor.depthInWater;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_TEKU_JUMP_WATER);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_TEKU_JUMP_WATER);
}
if (this->actor.shape.yOffset < 0.0f) {
@@ -350,23 +353,25 @@ void func_8089408C(EnTite* this, PlayState* play) {
this->actor.shape.rot.y = this->actor.yawTowardsPlayer;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actor.velocity.y = 10.0f;
} else {
this->actor.velocity.y = 8.0f;
}
- this->actor.bgCheckFlags &= ~(0x40 | 0x20 | 0x2 | 0x1);
+ this->actor.bgCheckFlags &=
+ ~(BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH | BGCHECKFLAG_WATER | BGCHECKFLAG_WATER_TOUCH);
this->actor.gravity = -1.0f;
- this->actor.speedXZ = 4.0f;
+ this->actor.speed = 4.0f;
this->actionFunc = func_808942B4;
}
void func_808942B4(EnTite* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
- if (((this->actor.bgCheckFlags & 1) || (func_80893ADC(this) && (this->actor.depthInWater > 0.0f))) &&
+ if (((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
+ (func_80893ADC(this) && (this->actor.depthInWater > 0.0f))) &&
(this->actor.velocity.y <= 0.0f)) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->collider.base.atFlags &= ~AT_HIT;
if (!func_80893ADC(this)) {
func_80893BCC(this, play);
@@ -377,7 +382,7 @@ void func_808942B4(EnTite* this, PlayState* play) {
func_8089452C(this, play);
} else {
this->actor.velocity.y = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_TEKU_LAND_WATER2);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_TEKU_LAND_WATER2);
func_80894414(this);
}
}
@@ -418,7 +423,7 @@ void func_8089452C(EnTite* this, PlayState* play) {
sp2C.y += this->actor.depthInWater;
this->actor.velocity.y *= 0.75f;
EffectSsGRipple_Spawn(play, &sp2C, 0, 500, 0);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_TEKU_LAND_WATER);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_TEKU_LAND_WATER);
this->actionFunc = func_808945B4;
}
@@ -430,7 +435,7 @@ void func_808945B4(EnTite* this, PlayState* play) {
void func_808945EC(EnTite* this) {
Animation_PlayLoop(&this->skelAnime, &object_tite_Anim_000A14);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.velocity.y = 0.0f;
this->actionFunc = func_80894638;
}
@@ -454,16 +459,17 @@ void func_80894638(EnTite* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, 7.0f)) {
if (func_80893ADC(this)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_TEKU_WALK_WATER);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_TEKU_WALK_WATER);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_TEKU_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_TEKU_WALK);
}
}
if ((Player_GetMask(play) == PLAYER_MASK_STONE) || (this->actor.xzDistToPlayer > 450.0f) ||
(this->actor.playerHeightRel > 80.0f)) {
func_80893ED4(this);
- } else if (((this->actor.bgCheckFlags & 1) || (func_80893ADC(this) && (this->actor.depthInWater < 10.0f))) &&
+ } else if (((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
+ (func_80893ADC(this) && (this->actor.depthInWater < 10.0f))) &&
Actor_IsFacingPlayer(&this->actor, 0xE38)) {
if ((this->actor.xzDistToPlayer <= 180.0f) && (this->actor.playerHeightRel <= 80.0f)) {
func_80893A9C(this, play);
@@ -480,12 +486,12 @@ void func_8089484C(EnTite* this) {
}
this->actor.velocity.y = 9.5f;
this->actor.gravity = -1.0f;
- this->actor.speedXZ = 4.0f;
+ this->actor.speed = 4.0f;
if (func_80893ADC(this)) {
this->actor.world.pos.y += this->actor.depthInWater;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_TEKU_JUMP_WATER);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_TEKU_JUMP_WATER);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_TEKU_JUMP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_TEKU_JUMP);
}
this->actionFunc = func_80894910;
}
@@ -493,10 +499,10 @@ void func_8089484C(EnTite* this) {
void func_80894910(EnTite* this, PlayState* play) {
Vec3f sp34;
- Math_SmoothStepToF(&this->actor.speedXZ, 0.0f, 0.1f, 1.0f, 0.0f);
+ Math_SmoothStepToF(&this->actor.speed, 0.0f, 0.1f, 1.0f, 0.0f);
SkelAnime_Update(&this->skelAnime);
- if (this->actor.bgCheckFlags & 0x40) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_TEKU_LAND_WATER);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_TEKU_LAND_WATER);
if (func_80893ADC(this)) {
Math_Vec3f_Copy(&sp34, &this->actor.world.pos);
@@ -508,9 +514,10 @@ void func_80894910(EnTite* this, PlayState* play) {
func_80893BCC(this, play);
}
- if (((this->actor.bgCheckFlags & 1) || (func_80893ADC(this) && (this->actor.depthInWater > 0.0f))) &&
+ if (((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
+ (func_80893ADC(this) && (this->actor.depthInWater > 0.0f))) &&
(this->actor.velocity.y <= 0.0f)) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 4000);
this->actor.world.rot.y = this->actor.shape.rot.y;
@@ -536,7 +543,7 @@ void func_80894910(EnTite* this, PlayState* play) {
void func_80894B2C(EnTite* this) {
Animation_MorphToLoop(&this->skelAnime, &object_tite_Anim_0012E4, 4.0f);
- this->actor.speedXZ = -6.0f;
+ this->actor.speed = -6.0f;
this->actor.gravity = -1.0f;
if (this->collider.base.ac != NULL) {
func_800BE568(&this->actor, &this->collider);
@@ -548,7 +555,7 @@ void func_80894B2C(EnTite* this) {
}
void func_80894BC8(EnTite* this, PlayState* play) {
- Math_SmoothStepToF(&this->actor.speedXZ, 0.0f, 1.0f, 0.5f, 0.0f);
+ Math_SmoothStepToF(&this->actor.speed, 0.0f, 1.0f, 0.5f, 0.0f);
SkelAnime_Update(&this->skelAnime);
if (func_80893ADC(this) && (this->actor.velocity.y <= 0.0f)) {
this->actor.gravity = 0.0f;
@@ -556,13 +563,13 @@ void func_80894BC8(EnTite* this, PlayState* play) {
this->actor.world.pos.y += this->actor.depthInWater - 1.0f;
}
- if (this->actor.bgCheckFlags & 0x40) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_TEKU_LAND_WATER2);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_TEKU_LAND_WATER2);
} else {
func_80893BCC(this, play);
}
- if ((this->actor.speedXZ == 0.0f) && ((this->actor.bgCheckFlags & 1) || func_80893ADC(this))) {
+ if ((this->actor.speed == 0.0f) && ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || func_80893ADC(this))) {
this->actor.world.rot.y = this->actor.shape.rot.y;
this->collider.base.acFlags |= AC_ON;
if ((Player_GetMask(play) == PLAYER_MASK_STONE) ||
@@ -579,7 +586,7 @@ void func_80894BC8(EnTite* this, PlayState* play) {
}
void func_80894DD0(EnTite* this) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->actor.velocity.y > 0.0f) {
this->actor.velocity.y = 0.0f;
}
@@ -598,8 +605,8 @@ void func_80894E0C(EnTite* this, PlayState* play) {
this->actor.world.pos.y += this->actor.depthInWater;
}
- if (this->actor.bgCheckFlags & 0x40) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_TEKU_LAND_WATER2);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_TEKU_LAND_WATER2);
} else {
func_80893BCC(this, play);
}
@@ -629,22 +636,22 @@ void func_80895020(EnTite* this, PlayState* play) {
f32 temp_f0;
Vec3f* ptr;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->collider.base.acFlags &= ~AC_ON;
this->actor.colorFilterTimer = 0;
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EN_TEKU_DEAD);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.flags |= ACTOR_FLAG_10;
this->unk_2BA = 1;
Item_DropCollectibleRandom(play, &this->actor, &this->actor.world.pos, this->unk_2BE);
this->unk_2BC = 25;
this->actor.gravity = -0.58f;
this->actor.velocity.y = 0.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
ptr = &this->unk_33C[0];
- for (i = 0; i < ARRAY_COUNT(this->limbPos); i++, ptr++) {
- Math_Vec3f_Diff(&this->limbPos[i], &this->actor.world.pos, &sp74);
+ for (i = 0; i < ENTITE_BODYPART_MAX; i++, ptr++) {
+ Math_Vec3f_Diff(&this->bodyPartsPos[i], &this->actor.world.pos, &sp74);
temp_f0 = Math3D_Vec3fMagnitude(&sp74);
if (temp_f0 > 1.0f) {
temp_f0 = 1.2f / temp_f0;
@@ -664,31 +671,31 @@ void func_808951B8(EnTite* this, PlayState* play) {
Math_SmoothStepToS(&this->actor.world.rot.z, 0x4000, 4, 0x1000, 0x400);
if (this->unk_2BC == 0) {
- for (i = 0; i < ARRAY_COUNT(this->limbPos); i++) {
- func_800B3030(play, &this->limbPos[i], &gZeroVec3f, &gZeroVec3f, 40, 7, 1);
- SoundSource_PlaySfxAtFixedWorldPos(play, &this->limbPos[i], 11, NA_SE_EN_EXTINCT);
+ for (i = 0; i < ENTITE_BODYPART_MAX; i++) {
+ func_800B3030(play, &this->bodyPartsPos[i], &gZeroVec3f, &gZeroVec3f, 40, 7, 1);
+ SoundSource_PlaySfxAtFixedWorldPos(play, &this->bodyPartsPos[i], 11, NA_SE_EN_EXTINCT);
}
Actor_Kill(&this->actor);
return;
}
- for (i = 0; i < ARRAY_COUNT(this->unk_33C); i++) {
- Math_Vec3f_Sum(&this->limbPos[i], &this->unk_33C[i], &this->limbPos[i]);
+ for (i = 0; i < ENTITE_BODYPART_MAX; i++) {
+ Math_Vec3f_Sum(&this->bodyPartsPos[i], &this->unk_33C[i], &this->bodyPartsPos[i]);
this->unk_33C[i].y += this->actor.gravity;
}
}
void func_808952EC(EnTite* this) {
Animation_PlayLoopSetSpeed(&this->skelAnime, &object_tite_Anim_000A14, 1.5f);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_LAST1_GROW_HEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_LAST1_GROW_HEAD);
this->collider.base.acFlags &= ~AC_ON;
func_80893A18(this);
this->unk_2B9 = 1;
this->unk_2BC = 400;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.gravity = -1.0f;
this->unk_2B8 = Rand_ZeroOne() * 50.0f;
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
this->actor.velocity.y = 11.0f;
this->actionFunc = func_80895424;
}
@@ -704,11 +711,11 @@ void func_80895424(EnTite* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->collider.base.acFlags |= AC_ON;
- if (this->actor.bgCheckFlags & 2) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
Actor_SpawnFloorDustRing(play, &this->actor, &this->actor.world.pos, 20.0f, 11, 4.0f, 0, 0, 0);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EYEGOLE_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_ATTACK);
}
if (this->unk_2BC == 0) {
@@ -724,8 +731,8 @@ void func_80895424(EnTite* this, PlayState* play) {
void func_808955E4(EnTite* this) {
this->unk_2B9 = 0;
this->actor.velocity.y = 13.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_LAST1_GROW_HEAD);
- this->actor.bgCheckFlags &= ~1;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_LAST1_GROW_HEAD);
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
this->collider.base.acFlags &= ~AC_ON;
this->actionFunc = func_80895640;
}
@@ -733,7 +740,7 @@ void func_808955E4(EnTite* this) {
void func_80895640(EnTite* this, PlayState* play) {
Math_ScaledStepToS(&this->actor.shape.rot.z, 0, 4000);
SkelAnime_Update(&this->skelAnime);
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->collider.base.acFlags |= AC_ON;
this->actor.shape.yOffset = 0.0f;
func_80893BCC(this, play);
@@ -752,7 +759,7 @@ void func_808956B8(EnTite* this) {
void func_808956FC(EnTite* this) {
this->unk_2BC = -1;
- this->actor.bgCheckFlags &= ~1;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
this->actor.velocity.y = 7.5f;
func_80893A18(this);
}
@@ -765,26 +772,26 @@ void func_80895738(EnTite* this, PlayState* play) {
if (this->collider.base.atFlags & AT_BOUNCED) {
func_808956FC(this);
}
- } else if (this->actor.bgCheckFlags & 8) {
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->actor.world.rot.y = BINANG_SUB((this->actor.wallYaw * 2) - this->actor.world.rot.y, 0x8000);
}
if (this->unk_2BC == -1) {
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.3f);
- if (this->actor.bgCheckFlags & 1) {
+ Math_StepToF(&this->actor.speed, 0.0f, 0.3f);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->actor.world.rot.y = this->actor.shape.rot.y;
func_80893ED4(this);
this->unk_2BC = 100;
}
} else if (this->unk_2BC > 0) {
this->unk_2BC--;
- Math_StepToF(&this->actor.speedXZ, 10.0f, 0.3f);
+ Math_StepToF(&this->actor.speed, 10.0f, 0.3f);
this->actor.flags |= ACTOR_FLAG_1000000;
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
if (!func_80893A34(this, play)) {
this->unk_2BC = 0;
}
- } else if ((this->unk_2BC == 0) && Math_StepToF(&this->actor.speedXZ, 0.0f, 0.3f)) {
+ } else if ((this->unk_2BC == 0) && Math_StepToF(&this->actor.speed, 0.0f, 0.3f)) {
this->actor.world.rot.y = this->actor.shape.rot.y;
func_80893A18(this);
if ((Player_GetMask(play) == PLAYER_MASK_STONE) || (this->actor.xzDistToPlayer > 450.0f) ||
@@ -796,15 +803,15 @@ void func_80895738(EnTite* this, PlayState* play) {
func_80893A9C(this, play);
}
}
- this->actor.shape.rot.y += (s16)(this->actor.speedXZ * 768.0f);
+ this->actor.shape.rot.y += (s16)(this->actor.speed * 768.0f);
}
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);
}
@@ -813,7 +820,7 @@ void func_80895A10(EnTite* this) {
s16 rand;
Animation_Change(&this->skelAnime, &object_tite_Anim_000A14, 2.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 4.0f);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
rand = Rand_S16Offset(20, 20);
this->unk_2BC = ((Rand_ZeroOne() < 0.5f) ? -1 : 1) * rand;
this->actionFunc = func_80895AC0;
@@ -828,18 +835,18 @@ void func_80895AC0(EnTite* this, PlayState* play) {
if (Rand_ZeroOne() < 0.25f) {
func_8089595C(this, play);
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_TEKU_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_TEKU_WALK);
}
if ((this->unk_2BC == 1) || (this->unk_2BC == -1)) {
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
temp_v1 = this->actor.shape.rot.y - this->actor.wallYaw;
temp_v0 = ABS_ALT(temp_v1);
if (temp_v0 > 0x3000) {
this->unk_2BC = (temp_v0 >> 9) * this->unk_2BC;
}
- } else if (Actor_XZDistanceToPoint(&this->actor, &this->actor.home.pos) < 200.0f) {
- temp_v1 = this->actor.shape.rot.y - Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ } else if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) < 200.0f) {
+ temp_v1 = this->actor.shape.rot.y - Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
temp_v0 = ABS_ALT(temp_v1);
if (temp_v0 > 0x2000) {
this->unk_2BC = (temp_v0 >> 9) * this->unk_2BC;
@@ -862,7 +869,7 @@ void func_80895AC0(EnTite* this, PlayState* play) {
void func_80895CB0(EnTite* this) {
this->skelAnime.playSpeed = 1.0f;
- this->actor.speedXZ = 1.0f;
+ this->actor.speed = 1.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->unk_2BC = Rand_S16Offset(20, 20);
this->actionFunc = func_80895D08;
@@ -874,7 +881,7 @@ void func_80895D08(EnTite* this, PlayState* play) {
if (Rand_ZeroOne() < 0.5f) {
func_8089595C(this, play);
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_TEKU_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_TEKU_WALK);
}
if ((this->actor.xzDistToPlayer < 240.0f) && (Player_GetMask(play) != PLAYER_MASK_STONE)) {
func_8089408C(this, play);
@@ -890,7 +897,7 @@ void func_80895DE8(EnTite* this) {
this->collider.base.acFlags &= ~AC_ON;
this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
this->skelAnime.playSpeed = 1.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = func_80895E28;
}
@@ -922,7 +929,7 @@ void func_80895E28(EnTite* this, PlayState* play) {
func_800B0DE0(play, &sp44, &sp38, &D_80896B44, &D_80896B3C, &D_80896B40, 500, 50);
if (Math_StepToF(&this->actor.shape.yOffset, 0.0f, 200.0f)) {
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->collider.base.acFlags |= AC_ON;
func_808945EC(this);
@@ -956,8 +963,8 @@ void func_80895FF8(EnTite* this, PlayState* play) {
if (this->actor.colChkInfo.damageEffect != 0xF) {
if (this->actor.colChkInfo.damageEffect == 5) {
this->unk_2BC = 40;
- Actor_SetColorFilter(&this->actor, 0, 200, 0, 40);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 200, COLORFILTER_BUFFLAG_OPA, 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_LARGE;
this->drawDmgEffScale = 0.5f;
this->drawDmgEffAlpha = 2.0f;
@@ -967,8 +974,8 @@ void func_80895FF8(EnTite* this, PlayState* play) {
if (this->actor.colChkInfo.damageEffect == 1) {
this->unk_2BC = 40;
- Actor_SetColorFilter(&this->actor, 0, 200, 0, 40);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 200, COLORFILTER_BUFFLAG_OPA, 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
func_80894DD0(this);
return;
}
@@ -993,15 +1000,15 @@ void func_80895FF8(EnTite* this, PlayState* play) {
this->drawDmgEffScale = 0.5f;
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);
+ CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
}
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
if (this->actor.colChkInfo.health == 0) {
func_80895020(this, play);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_TEKU_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_TEKU_DAMAGE);
if (this->unk_2B9 == 0) {
func_80894B2C(this);
@@ -1012,10 +1019,10 @@ void func_80895FF8(EnTite* this, PlayState* play) {
}
}
}
- } else if ((this->actor.bgCheckFlags & 1) && (this->collider.base.acFlags & AC_ON) &&
+ } else if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->collider.base.acFlags & AC_ON) &&
(this->actor.colChkInfo.health != 0) && (play->actorCtx.unk2 != 0) &&
(this->actor.xyzDistToPlayerSq < SQ(200.0f))) {
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
if (this->actor.shape.yOffset < 0.0f) {
this->actor.shape.yOffset = 0.0f;
this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
@@ -1032,17 +1039,17 @@ void func_808963B4(EnTite* this, PlayState* play) {
s32 i;
Vec3f sp48;
- if (this->actor.bgCheckFlags & 0x40) {
- for (i = 5; i < ARRAY_COUNT(this->limbPos); i++) {
- Math_Vec3f_Copy(&sp48, &this->limbPos[i]);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) {
+ for (i = ENTITE_BODYPART_5; i < ENTITE_BODYPART_MAX; i++) {
+ Math_Vec3f_Copy(&sp48, &this->bodyPartsPos[i]);
sp48.y = this->actor.world.pos.y + this->actor.depthInWater;
EffectSsGRipple_Spawn(play, &sp48, 0, 220, 0);
}
- } else if (this->actor.bgCheckFlags & 0x20) {
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER) {
s32 temp = play->gameplayFrames & 7;
if (!(temp & 1) && (this->actor.depthInWater < 10.0f)) {
- Math_Vec3f_Copy(&sp48, &this->limbPos[5 + (temp >> 1)]);
+ Math_Vec3f_Copy(&sp48, &this->bodyPartsPos[ENTITE_BODYPART_5 + (temp >> 1)]);
sp48.y = this->actor.world.pos.y + this->actor.depthInWater;
EffectSsGRipple_Spawn(play, &sp48, 0, 220, 0);
}
@@ -1058,9 +1065,9 @@ 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 & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
func_800BE3D0(&this->actor, this->actor.shape.rot.y, &this->actor.shape.rot);
if (this->unk_2B9 != 0) {
this->actor.shape.rot.z = BINANG_ROT180(this->actor.shape.rot.z);
@@ -1091,7 +1098,7 @@ void EnTite_Update(Actor* thisx, PlayState* play) {
this->drawDmgEffScale = (this->drawDmgEffAlpha + 1.0f) * 0.25f;
this->drawDmgEffScale = CLAMP_MAX(this->drawDmgEffScale, 0.5f);
} else if (!Math_StepToF(&this->drawDmgEffFrozenSteamScale, 0.5f, 0.0125f)) {
- func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
}
}
@@ -1107,40 +1114,90 @@ s32 EnTite_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
return false;
}
+static s8 sLimbToBodyParts1[OBJECT_TITE_LIMB_MAX] = {
+ BODYPART_NONE, // OBJECT_TITE_LIMB_NONE
+ BODYPART_NONE, // OBJECT_TITE_LIMB_01
+ BODYPART_NONE, // OBJECT_TITE_LIMB_02
+ BODYPART_NONE, // OBJECT_TITE_LIMB_03
+ ENTITE_BODYPART_0, // OBJECT_TITE_LIMB_04
+ BODYPART_NONE, // OBJECT_TITE_LIMB_05
+ BODYPART_NONE, // OBJECT_TITE_LIMB_06
+ BODYPART_NONE, // OBJECT_TITE_LIMB_07
+ ENTITE_BODYPART_1, // OBJECT_TITE_LIMB_08
+ BODYPART_NONE, // OBJECT_TITE_LIMB_09
+ BODYPART_NONE, // OBJECT_TITE_LIMB_0A
+ BODYPART_NONE, // OBJECT_TITE_LIMB_0B
+ BODYPART_NONE, // OBJECT_TITE_LIMB_0C
+ ENTITE_BODYPART_2, // OBJECT_TITE_LIMB_0D
+ BODYPART_NONE, // OBJECT_TITE_LIMB_0E
+ BODYPART_NONE, // OBJECT_TITE_LIMB_0F
+ BODYPART_NONE, // OBJECT_TITE_LIMB_10
+ BODYPART_NONE, // OBJECT_TITE_LIMB_11
+ ENTITE_BODYPART_3, // OBJECT_TITE_LIMB_12
+ BODYPART_NONE, // OBJECT_TITE_LIMB_13
+ BODYPART_NONE, // OBJECT_TITE_LIMB_14
+ BODYPART_NONE, // OBJECT_TITE_LIMB_15
+ BODYPART_NONE, // OBJECT_TITE_LIMB_16
+ ENTITE_BODYPART_4, // OBJECT_TITE_LIMB_17
+ BODYPART_NONE, // OBJECT_TITE_LIMB_18
+};
+
+static s8 sLimbToBodyParts2[OBJECT_TITE_LIMB_MAX] = {
+ BODYPART_NONE, // OBJECT_TITE_LIMB_NONE
+ BODYPART_NONE, // OBJECT_TITE_LIMB_01
+ BODYPART_NONE, // OBJECT_TITE_LIMB_02
+ BODYPART_NONE, // OBJECT_TITE_LIMB_03
+ ENTITE_BODYPART_0, // OBJECT_TITE_LIMB_04
+ BODYPART_NONE, // OBJECT_TITE_LIMB_05
+ BODYPART_NONE, // OBJECT_TITE_LIMB_06
+ BODYPART_NONE, // OBJECT_TITE_LIMB_07
+ ENTITE_BODYPART_1, // OBJECT_TITE_LIMB_08
+ ENTITE_BODYPART_5, // OBJECT_TITE_LIMB_09
+ BODYPART_NONE, // OBJECT_TITE_LIMB_0A
+ BODYPART_NONE, // OBJECT_TITE_LIMB_0B
+ BODYPART_NONE, // OBJECT_TITE_LIMB_0C
+ ENTITE_BODYPART_2, // OBJECT_TITE_LIMB_0D
+ ENTITE_BODYPART_6, // OBJECT_TITE_LIMB_0E
+ BODYPART_NONE, // OBJECT_TITE_LIMB_0F
+ BODYPART_NONE, // OBJECT_TITE_LIMB_10
+ BODYPART_NONE, // OBJECT_TITE_LIMB_11
+ ENTITE_BODYPART_3, // OBJECT_TITE_LIMB_12
+ ENTITE_BODYPART_7, // OBJECT_TITE_LIMB_13
+ BODYPART_NONE, // OBJECT_TITE_LIMB_14
+ BODYPART_NONE, // OBJECT_TITE_LIMB_15
+ BODYPART_NONE, // OBJECT_TITE_LIMB_16
+ ENTITE_BODYPART_4, // OBJECT_TITE_LIMB_17
+ ENTITE_BODYPART_8, // OBJECT_TITE_LIMB_18
+};
+
void EnTite_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
- static s8 D_80896B70[] = {
- -1, -1, -1, -1, 0, -1, -1, -1, 1, -1, -1, -1, -1, 2, -1, -1, -1, -1, 3, -1, -1, -1, -1, 4, -1,
- };
- static s8 D_80896B8C[] = {
- -1, -1, -1, -1, 0, -1, -1, -1, 1, 5, -1, -1, -1, 2, 6, -1, -1, -1, 3, 7, -1, -1, -1, 4, 8,
- };
EnTite* this = THIS;
MtxF* matrix;
- s8 idx;
+ s8 bodyPart1Index;
if (this->unk_2BA == 0) {
- idx = D_80896B70[limbIndex];
- if (idx != -1) {
- Matrix_MultZero(&this->limbPos[idx]);
- if (idx >= 1) {
- Matrix_MultVecX(2500.0f, &this->limbPos[idx + 4]);
+ bodyPart1Index = sLimbToBodyParts1[limbIndex];
+ if (bodyPart1Index != BODYPART_NONE) {
+ Matrix_MultZero(&this->bodyPartsPos[bodyPart1Index]);
+ if (bodyPart1Index >= ENTITE_BODYPART_1) {
+ Matrix_MultVecX(2500.0f, &this->bodyPartsPos[ENTITE_BODYPART_4 + bodyPart1Index]);
}
}
} else if (this->unk_2BA > 0) {
- if (D_80896B8C[limbIndex] != -1) {
- Matrix_MultZero(&this->limbPos[D_80896B8C[limbIndex]]);
+ if (sLimbToBodyParts2[limbIndex] != BODYPART_NONE) {
+ Matrix_MultZero(&this->bodyPartsPos[sLimbToBodyParts2[limbIndex]]);
}
if (limbIndex == 24) {
this->unk_2BA = -1;
}
- } else if (D_80896B8C[limbIndex] != -1) {
+ } else if (sLimbToBodyParts2[limbIndex] != BODYPART_NONE) {
OPEN_DISPS(play->state.gfxCtx);
matrix = Matrix_GetCurrent();
- matrix->xw = this->limbPos[D_80896B8C[limbIndex]].x;
- matrix->yw = this->limbPos[D_80896B8C[limbIndex]].y;
- matrix->zw = this->limbPos[D_80896B8C[limbIndex]].z;
+ matrix->xw = this->bodyPartsPos[sLimbToBodyParts2[limbIndex]].x;
+ matrix->yw = this->bodyPartsPos[sLimbToBodyParts2[limbIndex]].y;
+ matrix->zw = this->bodyPartsPos[sLimbToBodyParts2[limbIndex]].z;
Matrix_RotateZS(this->actor.world.rot.z, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -1155,9 +1212,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]);
@@ -1173,7 +1231,7 @@ void EnTite_Draw(Actor* thisx, PlayState* play) {
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnTite_OverrideLimbDraw,
EnTite_PostLimbDraw, &this->actor);
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), this->drawDmgEffScale,
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, ENTITE_BODYPART_MAX, this->drawDmgEffScale,
this->drawDmgEffFrozenSteamScale, this->drawDmgEffAlpha, this->drawDmgEffType);
CLOSE_DISPS(play->state.gfxCtx);
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..66fec66b3 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,26 @@ 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 enum EnTiteBodyPart {
+ /* 0 */ ENTITE_BODYPART_0,
+ /* 1 */ ENTITE_BODYPART_1,
+ /* 2 */ ENTITE_BODYPART_2,
+ /* 3 */ ENTITE_BODYPART_3,
+ /* 4 */ ENTITE_BODYPART_4,
+ /* 5 */ ENTITE_BODYPART_5,
+ /* 6 */ ENTITE_BODYPART_6,
+ /* 7 */ ENTITE_BODYPART_7,
+ /* 8 */ ENTITE_BODYPART_8,
+ /* 9 */ ENTITE_BODYPART_MAX
+} EnTiteBodyPart;
typedef struct EnTite {
/* 0x000 */ Actor actor;
@@ -27,12 +40,12 @@ 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;
- /* 0x2D0 */ Vec3f limbPos[9];
- /* 0x33C */ Vec3f unk_33C[9];
+ /* 0x2D0 */ Vec3f bodyPartsPos[ENTITE_BODYPART_MAX];
+ /* 0x33C */ Vec3f unk_33C[ENTITE_BODYPART_MAX];
/* 0x3A8 */ Gfx* unk_3A8;
/* 0x3AC */ ColliderSphere collider;
} EnTite; // size = 0x404
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 1bdc92b4a..7b88159f1 100644
--- a/src/overlays/actors/ovl_En_Tk/z_en_tk.c
+++ b/src/overlays/actors/ovl_En_Tk/z_en_tk.c
@@ -9,7 +9,7 @@
#include "overlays/actors/ovl_En_Door/z_en_door.h"
#include "objects/object_tk/object_tk.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnTk*)thisx)
@@ -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) {
@@ -204,10 +204,10 @@ void EnTk_Init(Actor* thisx, PlayState* play) {
EnTk* this = THIS;
this->unk_2B0 = ENTK_GET_F(&this->actor);
- this->unk_2B1 = ENTK_GET_7F0(&this->actor);
+ this->switchFlag = ENTK_GET_SWITCH_FLAG(&this->actor);
Collider_InitCylinder(play, &this->collider);
- if (Flags_GetSwitch(play, this->unk_2B1)) {
+ if (Flags_GetSwitch(play, this->switchFlag)) {
if (this->unk_2B0 == 0) {
Actor_Kill(&this->actor);
return;
@@ -218,7 +218,7 @@ void EnTk_Init(Actor* thisx, PlayState* play) {
}
if ((this->unk_2B0 == 1) || (this->unk_2B0 == 3)) {
- this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
this->actor.update = func_80AEF2C8;
this->actor.draw = NULL;
return;
@@ -231,7 +231,7 @@ void EnTk_Init(Actor* thisx, PlayState* play) {
this->unk_318 = 0;
this->unk_2D4 = -1;
Actor_SetScale(&this->actor, 0.01f);
- this->actor.targetMode = 1;
+ this->actor.targetMode = TARGET_MODE_1;
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
if (this->unk_2B0 == 2) {
@@ -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:
@@ -290,16 +290,16 @@ void func_80AECA3C(EnTk* this, PlayState* play) {
void func_80AECA90(EnTk* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- play->msgCtx.msgMode = 0;
+ play->msgCtx.msgMode = MSGMODE_NONE;
play->msgCtx.msgLength = 0;
func_80AEDE10(this, play);
} else if (this->actor.xzDistToPlayer < 100.0f) {
- func_800B8614(&this->actor, play, 100.0f);
+ Actor_OfferTalk(&this->actor, play, 100.0f);
}
}
void func_80AECB0C(EnTk* this, PlayState* play) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->unk_3CC = 0xFF;
this->unk_2DC = 0.0f;
SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, D_80AEF868, 0, &this->unk_2D4);
@@ -317,14 +317,14 @@ void func_80AECB6C(EnTk* this, PlayState* play) {
this->actor.textId = 0;
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- play->msgCtx.msgMode = 0;
+ play->msgCtx.msgMode = MSGMODE_NONE;
play->msgCtx.msgLength = 0;
func_80AED4F8(this, play);
return;
}
if (R_TIME_SPEED != 0.0f) {
- this->skelAnime.playSpeed = (f32)func_800FE620(play) / R_TIME_SPEED;
+ this->skelAnime.playSpeed = (f32)Environment_GetTimeSpeed(play) / R_TIME_SPEED;
} else {
this->skelAnime.playSpeed = 0.0f;
}
@@ -358,9 +358,9 @@ void func_80AECB6C(EnTk* this, PlayState* play) {
if (!temp4 && (this->unk_3CC != 0)) {
this->actor.draw = NULL;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
} else if (temp4 && (this->unk_3CC == 0)) {
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actor.draw = EnTk_Draw;
}
@@ -368,7 +368,7 @@ void func_80AECB6C(EnTk* this, PlayState* play) {
func_80AECE0C(this, play);
if (this->unk_3CE & 8) {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.draw = NULL;
}
}
@@ -442,8 +442,8 @@ s32 func_80AECE60(EnTk* this, PlayState* play) {
do {
doorIter = SubS_FindActor(play, doorIter, ACTORCAT_DOOR, ACTOR_EN_DOOR);
if (doorIter != NULL) {
- if (Actor_XZDistanceBetweenActors(&this->actor, doorIter) <= 120.0f) {
- if (ABS(BINANG_SUB(Actor_YawToPoint(&this->actor, &doorIter->world.pos),
+ if (Actor_WorldDistXZToActor(&this->actor, doorIter) <= 120.0f) {
+ if (ABS(BINANG_SUB(Actor_WorldYawTowardPoint(&this->actor, &doorIter->world.pos),
this->actor.shape.rot.y)) <= 0x2000) {
this->unk_2CA |= 0x400;
door = (EnDoor*)doorIter;
@@ -459,7 +459,7 @@ s32 func_80AECE60(EnTk* this, PlayState* play) {
do {
doorIter = SubS_FindActor(play, doorIter, ACTORCAT_DOOR, ACTOR_EN_DOOR);
if (doorIter != NULL) {
- if (Actor_XZDistanceBetweenActors(&this->actor, doorIter) <= 160.0f) {
+ if (Actor_WorldDistXZToActor(&this->actor, doorIter) <= 160.0f) {
door = (EnDoor*)doorIter;
break;
}
@@ -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;
@@ -486,7 +486,7 @@ s32 func_80AECE60(EnTk* this, PlayState* play) {
}
if (!(this->unk_3CE & 8) && !(this->unk_2CA & 0x10) && (this->actor.xzDistToPlayer < 100.0f)) {
- func_8013E8F8(&this->actor, play, 100.0f, 100.0f, PLAYER_IA_NONE, 0x4000, 0x4000);
+ SubS_OfferTalkExchangeFacing(&this->actor, play, 100.0f, 100.0f, PLAYER_IA_NONE, 0x4000, 0x4000);
}
return false;
@@ -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;
}
@@ -562,7 +562,7 @@ void func_80AED610(EnTk* this, PlayState* play) {
Message_StartTextbox(play, 0x13FD, &this->actor);
} else if (CURRENT_DAY != 2) {
func_80AED544(this, play);
- } else if (!Flags_GetSwitch(play, ENTK_GET_7F0(&this->actor))) {
+ } else if (!Flags_GetSwitch(play, ENTK_GET_SWITCH_FLAG(&this->actor))) {
Message_StartTextbox(play, 0x1403, &this->actor);
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_60_02)) {
func_80AED544(this, play);
@@ -590,13 +590,13 @@ void func_80AED610(EnTk* this, PlayState* play) {
break;
case 0x13FE:
- func_80151938(play, 0x13FF);
+ Message_ContinueTextbox(play, 0x13FF);
break;
case 0x1413:
Rupees_ChangeBy(30);
SET_WEEKEVENTREG(WEEKEVENTREG_60_02);
- func_80151938(play, 0x13FF);
+ Message_ContinueTextbox(play, 0x13FF);
break;
case 0x13FF:
@@ -631,7 +631,7 @@ void func_80AED610(EnTk* this, PlayState* play) {
void func_80AED898(EnTk* this, PlayState* play) {
this->unk_316 = 0;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->unk_2CA & 0x1000) {
if ((this->unk_2D4 == 4) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, D_80AEF868, 7, &this->unk_2D4);
@@ -691,37 +691,38 @@ void func_80AED940(EnTk* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->unk_2CA &= ~0x80;
this->actor.flags &= ~ACTOR_FLAG_10000;
- play->msgCtx.msgMode = 0;
+ play->msgCtx.msgMode = MSGMODE_NONE;
play->msgCtx.msgLength = 0;
func_80AEDE10(this, play);
} else if (!(this->unk_2CA & 0x80)) {
if (this->actor.xzDistToPlayer < 100.0f) {
- func_8013E8F8(&this->actor, play, 100.0f, 100.0f, PLAYER_IA_NONE, 0x4000, 0x4000);
+ SubS_OfferTalkExchangeFacing(&this->actor, play, 100.0f, 100.0f, PLAYER_IA_NONE, 0x4000, 0x4000);
}
} else {
- func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel, PLAYER_IA_NONE);
+ Actor_OfferTalkExchange(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel,
+ PLAYER_IA_NONE);
}
}
void func_80AEDBEC(EnTk* this, PlayState* play) {
this->actor.params = -1;
- this->unk_2E8 = 0;
- this->actor.speedXZ = 0.0f;
+ 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]);
- func_80151938(play, 0x1411);
+ 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);
}
}
void func_80AEDCBC(EnTk* this, PlayState* play) {
- this->actor.speedXZ = 10.0f;
+ this->actor.speed = 10.0f;
SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, D_80AEF868, 5, &this->unk_2D4);
Math_Vec3f_Copy(&this->actor.world.pos, &this->unk_2EC);
Math_Vec3f_Copy(&this->actor.prevPos, &this->unk_2EC);
@@ -731,16 +732,16 @@ 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]);
- func_801477B4(play);
+ this->csLength--;
+ if (this->csLength <= 0) {
+ CutsceneManager_Stop(this->csIdList[1]);
+ Message_CloseTextbox(play);
Actor_Kill(&this->actor);
}
}
void func_80AEDDA0(EnTk* this, PlayState* play) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, D_80AEF868, 2, &this->unk_2D4);
this->actor.flags |= ACTOR_FLAG_10000;
this->unk_2CA |= 0x80;
@@ -837,29 +838,29 @@ void func_80AEDF5C(EnTk* this, PlayState* play) {
break;
case 0x1405:
- func_80151938(play, 0x1406);
+ Message_ContinueTextbox(play, 0x1406);
break;
case 0x1406:
- func_80151938(play, 0x1407);
+ Message_ContinueTextbox(play, 0x1407);
break;
case 0x1407:
if (play->msgCtx.choiceIndex == 0) {
- func_8019F208();
- func_80151938(play, 0x1409);
+ Audio_PlaySfx_MessageDecide();
+ Message_ContinueTextbox(play, 0x1409);
} else {
- func_8019F230();
- func_80151938(play, 0x1408);
+ Audio_PlaySfx_MessageCancel();
+ Message_ContinueTextbox(play, 0x1408);
}
break;
case 0x1408:
- func_80151938(play, 0x1407);
+ Message_ContinueTextbox(play, 0x1407);
break;
case 0x1409:
- func_80151938(play, 0x140A);
+ Message_ContinueTextbox(play, 0x140A);
break;
case 0x140A:
@@ -872,12 +873,12 @@ void func_80AEDF5C(EnTk* this, PlayState* play) {
case 0x140D:
this->unk_2CA |= 2;
if (play->msgCtx.choiceIndex == 0) {
- func_8019F208();
- play->msgCtx.msgMode = 0x44;
+ Audio_PlaySfx_MessageDecide();
+ play->msgCtx.msgMode = MSGMODE_PAUSED;
func_80AEE2A8(this, play);
} else {
- func_8019F230();
- func_80151938(play, 0x140E);
+ Audio_PlaySfx_MessageCancel();
+ Message_ContinueTextbox(play, 0x140E);
}
break;
@@ -901,7 +902,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);
}
}
@@ -911,7 +912,7 @@ s32 func_80AEE300(PlayState* play, Actor* arg1, Actor* arg2, void* _arg3) {
f32 temp_f0;
if ((arg2 != arg1) && (ENTK_GET_F(arg2) == 3)) {
- temp_f0 = Actor_DistanceBetweenActors(arg1, arg2);
+ temp_f0 = Actor_WorldDistXYZToActor(arg1, arg2);
if (temp_f0 < arg3->unk_04) {
arg3->unk_00 = arg2;
arg3->unk_04 = temp_f0;
@@ -932,7 +933,7 @@ void func_80AEE374(EnTk* this, PlayState* play) {
return;
}
- this->unk_2CC = Actor_YawToPoint(&this->actor, &sp30.unk_00->world.pos);
+ this->unk_2CC = Actor_WorldYawTowardPoint(&this->actor, &sp30.unk_00->world.pos);
this->actionFunc = func_80AEE414;
}
@@ -958,7 +959,7 @@ void func_80AEE4D0(EnTk* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, 33.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_DIG_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_DIG_UP);
}
if (!(this->unk_2CA & 0x20)) {
@@ -968,7 +969,7 @@ void func_80AEE4D0(EnTk* this, PlayState* play) {
bigPoe = SubS_FindActor(play, bigPoe, ACTORCAT_PROP, ACTOR_EN_BIGPO);
if (bigPoe != NULL) {
- if ((bigPoe->params == 3) && (Actor_DistanceBetweenActors(&this->actor, bigPoe) < 80.0f)) {
+ if ((bigPoe->params == 3) && (Actor_WorldDistXYZToActor(&this->actor, bigPoe) < 80.0f)) {
bigPoe->params = 4;
this->unk_2CA |= 0x20;
this->unk_2E4++;
@@ -995,15 +996,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]);
- func_801477B4(play);
+ 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 +1036,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)) &&
@@ -1073,7 +1074,7 @@ s32 func_80AEEA4C(EnTk* this, PlayState* play) {
ret = 3;
} else if (this->actor.xyzDistToPlayerSq < SQ(60.0f)) {
ret = 0;
- } else if (this->actor.isTargeted || (play->actorCtx.targetContext.unk_94 == &this->actor) ||
+ } else if (this->actor.isLockedOn || (play->actorCtx.targetCtx.arrowPointedActor == &this->actor) ||
(this->actor.xyzDistToPlayerSq < SQ(80.0f))) {
ret = 1;
} else {
@@ -1183,10 +1184,10 @@ void func_80AEED38(EnTk* this, PlayState* play) {
SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, D_80AEF868, 2, &this->unk_2D4);
} else {
SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, D_80AEF868, 1, &this->unk_2D4);
- func_80AEC658(&this->skelAnime, this->unk_320, 1.0f, &this->actor.speedXZ, &sp64);
+ func_80AEC658(&this->skelAnime, this->unk_320, 1.0f, &this->actor.speed, &sp64);
}
- if (this->actor.speedXZ > 0.5f) {
+ if (this->actor.speed > 0.5f) {
Math_SmoothStepToS(&this->actor.world.rot.y, this->unk_2CC, 2, 0xAAA, 1);
this->actor.shape.rot.y = this->actor.world.rot.y;
}
@@ -1210,17 +1211,17 @@ void func_80AEF094(EnTk* this, PlayState* play) {
SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, D_80AEF868, 2, &this->unk_2D4);
} else {
SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, D_80AEF868, 1, &this->unk_2D4);
- func_80AEC658(&this->skelAnime, this->unk_320, 1.0f, &this->actor.speedXZ, &sp2C);
+ func_80AEC658(&this->skelAnime, this->unk_320, 1.0f, &this->actor.speed, &sp2C);
}
- if (this->actor.speedXZ >= 0.5f) {
+ if (this->actor.speed >= 0.5f) {
Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 2, 0x38E, 1);
this->actor.shape.rot.y = this->actor.world.rot.y;
}
}
void func_80AEF15C(EnTk* this, PlayState* play) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, D_80AEF868, 2, &this->unk_2D4);
this->unk_30C = func_80AEF1B4;
}
@@ -1237,7 +1238,7 @@ void func_80AEF210(EnTk* this, PlayState* play) {
}
void func_80AEF220(EnTk* this, PlayState* play) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, D_80AEF868, 2, &this->unk_2D4);
this->unk_30C = func_80AEF278;
}
@@ -1264,13 +1265,13 @@ void func_80AEF2D8(Actor* thisx, PlayState* play) {
if ((this->actor.draw != NULL) && ((this->unk_2D4 == 0) || (this->unk_2D4 == 1)) &&
(Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 24.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_WALK);
}
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);
}
@@ -1286,7 +1287,7 @@ void EnTk_Update(Actor* thisx, PlayState* play) {
if (((this->unk_2D4 == 0) || (this->unk_2D4 == 1)) &&
(Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 24.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GOLON_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_WALK);
}
this->unk_2CA &= ~1;
@@ -1310,9 +1311,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;
@@ -1321,10 +1323,10 @@ void EnTk_Update(Actor* thisx, PlayState* play) {
}
if (!(this->unk_2CA & 0x200)) {
- if (!(this->actor.bgCheckFlags & 1)) {
- func_800B9010(&this->actor, NA_SE_EV_HONEYCOMB_FALL - SFX_FLAG);
- } else if (this->actor.bgCheckFlags & 2) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_HUMAN_BOUND);
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_HONEYCOMB_FALL - SFX_FLAG);
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_HUMAN_BOUND);
}
}
}
@@ -1365,6 +1367,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 +1384,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..46e9b0b96 100644
--- a/src/overlays/actors/ovl_En_Tk/z_en_tk.h
+++ b/src/overlays/actors/ovl_En_Tk/z_en_tk.h
@@ -9,8 +9,8 @@ typedef void (*EnTkActionFunc)(struct EnTk*, PlayState*);
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_SWITCH_FLAG(thisx) (((thisx)->params >> 4) & 0x7F)
+#define ENTK_GET_PATH_INDEX(thisx) (((thisx)->params >> 0xB) & 0x1F)
typedef struct EnTk {
/* 0x000 */ Actor actor;
@@ -20,7 +20,7 @@ typedef struct EnTk {
/* 0x1D8 */ Vec3s jointTable[18];
/* 0x244 */ Vec3s morphTable[18];
/* 0x2B0 */ s8 unk_2B0;
- /* 0x2B1 */ s8 unk_2B1;
+ /* 0x2B1 */ s8 switchFlag;
/* 0x2B4 */ Vec3f unk_2B4;
/* 0x2C0 */ s16 unk_2C0;
/* 0x2C2 */ s16 unk_2C2;
@@ -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 aefa6383f..12aaa808f 100644
--- a/src/overlays/actors/ovl_En_Toto/z_en_toto.c
+++ b/src/overlays/actors/ovl_En_Toto/z_en_toto.c
@@ -7,7 +7,7 @@
#include "z_en_toto.h"
#include "objects/object_zm/object_zm.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnToto*)thisx)
@@ -89,7 +89,7 @@ static EnTotoActionFunc D_80BA501C[] = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_U8(targetMode, 1, ICHAIN_STOP),
+ ICHAIN_U8(targetMode, TARGET_MODE_1, ICHAIN_STOP),
};
static EnTotoText D_80BA502C[] = {
@@ -151,7 +151,12 @@ static Vec3s D_80BA510C[] = {
{ 0xFF64, 0x0016, 0xFE7E },
};
-static u16 D_80BA5120[] = { 67, 68, 69, 70 };
+static u16 sOcarinaActionWindFishPrompts[] = {
+ OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN,
+ OCARINA_ACTION_PROMPT_WIND_FISH_GORON,
+ OCARINA_ACTION_PROMPT_WIND_FISH_ZORA,
+ OCARINA_ACTION_PROMPT_WIND_FISH_DEKU,
+};
static u8 D_80BA5128[] = { 8, 4, 2, 1 };
@@ -190,7 +195,7 @@ void EnToto_Init(Actor* thisx, PlayState* play) {
return;
}
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 30.0f);
- this->actor.bgCheckFlags |= 0x400;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_PLAYER_400;
SkelAnime_InitFlex(play, &this->skelAnime, &object_zm_Skel_00A978,
((play->sceneId == SCENE_SONCHONOIE) ? &object_zm_Anim_003AA8 : &object_zm_Anim_00C880),
this->jointTable, this->morphTable, 18);
@@ -205,16 +210,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) {
@@ -243,28 +248,27 @@ void func_80BA39C8(EnToto* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
func_80BA36C0(this, play, 1);
if (play->sceneId != SCENE_SONCHONOIE) {
- Flags_SetSwitch(play, this->actor.params & 0x7F);
+ Flags_SetSwitch(play, ENTOTO_GET_SWITCH_FLAG_1(&this->actor));
} else if (player->transformation == PLAYER_FORM_DEKU) {
- Flags_SetSwitch(play, this->actor.home.rot.x);
+ Flags_SetSwitch(play, ENTOTO_GET_SWITCH_FLAG_3(&this->actor));
}
this->unk2B6 = 0;
return;
}
- //! @TODO: 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;
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, 9999.9f, 9999.9f, PLAYER_IA_NONE);
+ Actor_OfferTalkExchange(&this->actor, play, 9999.9f, 9999.9f, PLAYER_IA_NONE);
} else {
this->actor.flags &= ~ACTOR_FLAG_10000;
- func_800B8614(&this->actor, play, 50.0f);
+ Actor_OfferTalk(&this->actor, play, 50.0f);
if (play->sceneId == SCENE_SONCHONOIE) {
if (player->transformation == PLAYER_FORM_DEKU) {
- if (!Flags_GetSwitch(play, this->actor.home.rot.x)) {
+ if (!Flags_GetSwitch(play, ENTOTO_GET_SWITCH_FLAG_3(&this->actor))) {
this->text = D_80BA5068;
} else {
this->text = D_80BA5074;
@@ -274,7 +278,7 @@ void func_80BA39C8(EnToto* this, PlayState* play) {
}
} else if (ENTOTO_WEEK_EVENT_FLAGS) {
this->text = D_80BA502C;
- } else if (!Flags_GetSwitch(play, this->actor.params & 0x7F)) {
+ } else if (!Flags_GetSwitch(play, ENTOTO_GET_SWITCH_FLAG_1(&this->actor))) {
this->text = D_80BA5034;
} else {
this->text = D_80BA5038;
@@ -291,7 +295,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 +316,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 +331,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);
+ if ((player->stateFlags1 & PLAYER_STATE1_400) && (player->actionVar1 != 0)) {
+ 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,20 +361,20 @@ 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;
}
s32 func_80BA3F2C(EnToto* this, PlayState* play) {
if (this->text->textId != 0) {
- func_80151938(play, this->text->textId);
+ Message_ContinueTextbox(play, this->text->textId);
} else {
- func_801477B4(play);
+ Message_CloseTextbox(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 +393,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;
}
@@ -424,11 +428,11 @@ s32 func_80BA4128(EnToto* this, PlayState* play) {
s32 func_80BA415C(EnToto* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE) && Message_ShouldAdvance(play)) {
if (play->msgCtx.choiceIndex != 0) {
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
} else {
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
}
- 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 +456,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 +484,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;
}
@@ -515,7 +519,7 @@ s32 func_80BA4530(EnToto* this, PlayState* play) {
this->unk2B6 = 1;
return this->text->unk1;
}
- if (player->actor.bgCheckFlags & 1) {
+ if (player->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
temp_s0 = &D_80BA50DC[gSaveContext.save.playerForm - 1];
if (func_80BA44D4(temp_s0, player)) {
Math_Vec3s_ToVec3f(&player->actor.world.pos, &temp_s0->unk6);
@@ -543,22 +547,22 @@ s32 func_80BA4530(EnToto* this, PlayState* play) {
s32 func_80BA46D8(EnToto* this, PlayState* play) {
func_800B7298(play, NULL, PLAYER_CSMODE_68);
- func_80152434(play, D_80BA5120[CUR_FORM]);
+ Message_DisplayOcarinaStaff(play, sOcarinaActionWindFishPrompts[CUR_FORM]);
return 0;
}
s32 func_80BA4740(EnToto* this, PlayState* play) {
- if (play->msgCtx.ocarinaMode == 4) {
- if (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) {
+ if (play->msgCtx.ocarinaMode == OCARINA_MODE_END) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_HUMAN) {
SET_WEEKEVENTREG(WEEKEVENTREG_56_10);
}
- if (gSaveContext.save.playerForm == PLAYER_FORM_DEKU) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_DEKU) {
SET_WEEKEVENTREG(WEEKEVENTREG_56_20);
}
- if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
SET_WEEKEVENTREG(WEEKEVENTREG_56_40);
}
- if (gSaveContext.save.playerForm == PLAYER_FORM_GORON) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_GORON) {
SET_WEEKEVENTREG(WEEKEVENTREG_56_80);
}
return 1;
@@ -584,8 +588,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 ((GET_PLAYER_FORM != (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);
}
@@ -641,15 +646,15 @@ s32 func_80BA4B24(EnToto* this, PlayState* play) {
player = GET_PLAYER(play);
Animation_MorphToPlayOnce(&this->skelAnime, &object_zm_Anim_0028B8, -4.0f);
if (player->transformation == PLAYER_FORM_ZORA) {
- if (!Flags_GetSwitch(play, this->actor.params & 0x7F)) {
- Flags_SetSwitch(play, this->actor.params & 0x7F);
+ if (!Flags_GetSwitch(play, ENTOTO_GET_SWITCH_FLAG_1(&this->actor))) {
+ Flags_SetSwitch(play, ENTOTO_GET_SWITCH_FLAG_1(&this->actor));
return 1;
} else {
return 3;
}
} else {
- if (!Flags_GetSwitch(play, (this->actor.params >> 7) & 0x7F)) {
- Flags_SetSwitch(play, (this->actor.params >> 7) & 0x7F);
+ if (!Flags_GetSwitch(play, ENTOTO_GET_SWITCH_FLAG_2(&this->actor))) {
+ Flags_SetSwitch(play, ENTOTO_GET_SWITCH_FLAG_2(&this->actor));
return 4;
} else {
return 7;
@@ -675,31 +680,31 @@ 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)) {
- Actor_PickUp(&this->actor, play, GI_MASK_CIRCUS_LEADER, 9999.9f, 9999.9f);
+ if ((this->cueId == 4) && !Actor_HasParent(&this->actor, play)) {
+ Actor_OfferGetItem(&this->actor, play, GI_MASK_CIRCUS_LEADER, 9999.9f, 9999.9f);
}
}
@@ -707,7 +712,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 +732,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..7a742d84a 100644
--- a/src/overlays/actors/ovl_En_Toto/z_en_toto.h
+++ b/src/overlays/actors/ovl_En_Toto/z_en_toto.h
@@ -8,6 +8,10 @@ struct EnToto;
typedef void (*EnTotoActionFunc)(struct EnToto*, PlayState*);
typedef s32 (*EnTotoUnkFunc)(struct EnToto*, PlayState*);
+#define ENTOTO_GET_SWITCH_FLAG_1(thisx) ((thisx)->params & 0x7F)
+#define ENTOTO_GET_SWITCH_FLAG_2(thisx) (((thisx)->params >> 7) & 0x7F)
+#define ENTOTO_GET_SWITCH_FLAG_3(thisx) ((thisx)->home.rot.x)
+
typedef struct EnTotoText {
/* 0x0 */ u8 unk0;
/* 0x1 */ u8 unk1;
@@ -26,14 +30,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 caceb62bd..499a3a748 100644
--- a/src/overlays/actors/ovl_En_Trt/z_en_trt.c
+++ b/src/overlays/actors/ovl_En_Trt/z_en_trt.c
@@ -8,13 +8,13 @@
#include "objects/object_trt/object_trt.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnTrt*)thisx)
#define ENTRT_FULLY_AWAKE (1 << 0)
#define ENTRT_GIVEN_MUSHROOM (1 << 1)
-#define ENTRT_MET (1 << 2)
+#define ENTRT_TALKED (1 << 2)
void EnTrt_Init(Actor* thisx, PlayState* play);
void EnTrt_Destroy(Actor* thisx, PlayState* play);
@@ -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->textboxEndType == TEXTBOX_ENDTYPE_10) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_11)) {
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);
}
}
}
@@ -202,7 +202,7 @@ u16 EnTrt_GetItemTextId(EnTrt* this) {
u16 EnTrt_GetItemChoiceTextId(EnTrt* this) {
EnGirlA* item = this->items[this->cursorIndex];
- if ((item->actor.params == SI_POTION_BLUE) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_53_10)) {
+ if ((item->actor.params == SI_POTION_BLUE) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_FREE_BLUE_POTION)) {
this->textId = 0x881;
return 0x881;
}
@@ -213,11 +213,11 @@ 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);
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
this->drawCursor = 0;
@@ -246,7 +246,7 @@ s32 EnTrt_TestEndInteraction(EnTrt* this, PlayState* play, Input* input) {
s32 EnTrt_TestCancelOption(EnTrt* this, PlayState* play, Input* input) {
if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
this->actionFunc = this->prevActionFunc;
- func_80151938(play, EnTrt_GetItemTextId(this));
+ Message_ContinueTextbox(play, EnTrt_GetItemTextId(this));
return true;
}
return false;
@@ -262,7 +262,7 @@ void EnTrt_SetupStartShopping(PlayState* play, EnTrt* this, u8 skipHello) {
}
void EnTrt_StartShopping(PlayState* play, EnTrt* this) {
- func_80151938(play, 0x83E);
+ Message_ContinueTextbox(play, 0x83E);
func_8011552C(play, DO_ACTION_DECIDE);
this->stickLeftPrompt.isEnabled = false;
this->stickRightPrompt.isEnabled = true;
@@ -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,15 +318,15 @@ 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)) {
- play_sound(NA_SE_SY_MESSAGE_PASS);
+ Audio_PlaySfx(NA_SE_SY_MESSAGE_PASS);
if (!EnTrt_TestEndInteraction(this, play, CONTROLLER1(&play->state))) {
EnTrt_StartShopping(play, this);
}
@@ -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) {
@@ -348,22 +348,25 @@ void EnTrt_GetMushroom(EnTrt* this, PlayState* play) {
case 0x883:
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);
+ SET_WEEKEVENTREG(WEEKEVENTREG_GAVE_KOTAKE_MUSHROOM);
+ 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.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->actionFunc = EnTrt_PayForMushroom;
break;
+
default:
this->cutsceneState = ENTRT_CUTSCENESTATE_PLAYING;
EnTrt_EndInteraction(play, this);
@@ -375,10 +378,10 @@ 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_PickUp(&this->actor, play, GI_RUPEE_RED, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_RUPEE_RED, 300.0f, 300.0f);
}
}
@@ -387,12 +390,16 @@ void EnTrt_Goodbye(EnTrt* this, PlayState* play) {
switch (this->textId) {
case 0x886:
this->textId = 0x887;
- func_80151938(play, this->textId);
+ Message_ContinueTextbox(play, this->textId);
break;
+
case 0x887:
case 0x88B:
EnTrt_EndInteraction(play, this);
break;
+
+ default:
+ break;
}
}
}
@@ -400,39 +407,39 @@ void EnTrt_Goodbye(EnTrt* this, PlayState* play) {
void EnTrt_StartRedPotionConversation(EnTrt* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
if (this->textId == 0x88F) {
- if (Inventory_HasEmptyBottle() || !CHECK_WEEKEVENTREG(WEEKEVENTREG_12_10)) {
+ if (Inventory_HasEmptyBottle() || !CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_KOTAKE_BOTTLE)) {
if (this->cutsceneState == ENTRT_CUTSCENESTATE_PLAYING) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->cutsceneState = ENTRT_CUTSCENESTATE_STOPPED;
}
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->actionFunc = EnTrt_GiveRedPotionForKoume;
} else {
this->prevTextId = this->textId;
this->textId = 0x88E;
- SET_WEEKEVENTREG(WEEKEVENTREG_85_08);
+ SET_WEEKEVENTREG(WEEKEVENTREG_FAILED_RECEIVED_RED_POTION_FOR_KOUME_SHOP);
Message_StartTextbox(play, this->textId, &this->actor);
this->actionFunc = EnTrt_EndConversation;
}
} else {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_12_08)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_SAVED_KOUME)) {
this->textId = 0x83D;
EnTrt_SetupStartShopping(play, this, 0);
- } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_84_40)) {
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_RED_POTION_FOR_KOUME)) {
this->textId = 0x83B;
if (Inventory_HasItemInBottle(ITEM_POTION_RED)) {
EnTrt_SetupStartShopping(play, this, false);
} else {
this->actionFunc = EnTrt_TryToGiveRedPotion;
}
- } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_16_10)) {
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_KOUME_INJURED)) {
this->timer = 30;
this->textId = 0x838;
this->cutsceneState = ENTRT_CUTSCENESTATE_PLAYING_SPECIAL;
this->actionFunc = EnTrt_Surprised;
return;
- } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_17_01)) {
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_KOUME_KIOSK_EMPTY)) {
this->textId = 0x835;
EnTrt_SetupStartShopping(play, this, false);
}
@@ -446,16 +453,16 @@ void EnTrt_GiveRedPotionForKoume(EnTrt* this, PlayState* play) {
if (Actor_HasParent(&this->actor, play)) {
this->actor.parent = NULL;
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_12_10)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_12_10);
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_KOTAKE_BOTTLE)) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_KOTAKE_BOTTLE);
}
- SET_WEEKEVENTREG(WEEKEVENTREG_84_40);
+ SET_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_RED_POTION_FOR_KOUME);
player->stateFlags2 &= ~PLAYER_STATE2_20000000;
this->actionFunc = EnTrt_GivenRedPotionForKoume;
- } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_12_10)) {
- Actor_PickUp(&this->actor, play, GI_POTION_RED, 300.0f, 300.0f);
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_KOTAKE_BOTTLE)) {
+ Actor_OfferGetItem(&this->actor, play, GI_POTION_RED, 300.0f, 300.0f);
} else {
- Actor_PickUp(&this->actor, play, GI_POTION_RED_BOTTLE, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_POTION_RED_BOTTLE, 300.0f, 300.0f);
}
}
@@ -465,21 +472,21 @@ 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);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
this->actionFunc = EnTrt_ItemGiven;
}
}
@@ -501,15 +508,18 @@ void EnTrt_EndConversation(EnTrt* this, PlayState* play) {
s32 EnTrt_FacingShopkeeperDialogResult(EnTrt* this, PlayState* play) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
EnTrt_SetupTalkToShopkeeper(play, this);
return true;
+
case 1:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
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);
@@ -542,7 +552,7 @@ void EnTrt_FaceShopkeeper(EnTrt* this, PlayState* play) {
this->actionFunc = EnTrt_LookToShelf;
func_8011552C(play, DO_ACTION_DECIDE);
this->stickRightPrompt.isEnabled = false;
- play_sound(NA_SE_SY_CURSOR);
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
}
}
}
@@ -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;
- func_80151938(play, EnTrt_GetItemTextId(this));
+ Message_ContinueTextbox(play, EnTrt_GetItemTextId(this));
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
}
@@ -603,16 +613,16 @@ 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;
- func_80151938(play, EnTrt_GetItemChoiceTextId(this));
- play_sound(NA_SE_SY_DECIDE);
+ Message_ContinueTextbox(play, EnTrt_GetItemChoiceTextId(this));
+ Audio_PlaySfx(NA_SE_SY_DECIDE);
this->stickLeftPrompt.isEnabled = false;
this->stickRightPrompt.isEnabled = false;
this->drawCursor = 0;
this->actionFunc = EnTrt_SelectItem;
} else {
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
}
return true;
}
@@ -638,8 +648,8 @@ void EnTrt_BrowseShelf(EnTrt* this, PlayState* play) {
if (!EnTrt_HasPlayerSelectedItem(play, this, CONTROLLER1(&play->state))) {
EnTrt_CursorLeftRight(play, this);
if (this->cursorIndex != prevCursorIdx) {
- func_80151938(play, EnTrt_GetItemTextId(this));
- play_sound(NA_SE_SY_CURSOR);
+ Message_ContinueTextbox(play, EnTrt_GetItemTextId(this));
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
}
}
}
@@ -649,8 +659,8 @@ void EnTrt_BrowseShelf(EnTrt* this, PlayState* play) {
void EnTrt_SetupBuyItemWithFanfare(PlayState* play, EnTrt* this) {
Player* player = GET_PLAYER(play);
- Actor_PickUp(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f);
- play->msgCtx.msgMode = 0x43;
+ Actor_OfferGetItem(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f);
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
player->stateFlags2 &= ~PLAYER_STATE2_20000000;
Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
@@ -659,12 +669,12 @@ void EnTrt_SetupBuyItemWithFanfare(PlayState* play, EnTrt* this) {
}
void EnTrt_SetupCannotBuy(PlayState* play, EnTrt* this, u16 textId) {
- func_80151938(play, textId);
+ Message_ContinueTextbox(play, textId);
this->actionFunc = EnTrt_CannotBuy;
}
void EnTrt_SetupCanBuy(PlayState* play, EnTrt* this, u16 textId) {
- func_80151938(play, textId);
+ Message_ContinueTextbox(play, textId);
this->actionFunc = EnTrt_CanBuy;
}
@@ -675,10 +685,10 @@ 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();
+ Audio_PlaySfx_MessageDecide();
item2 = this->items[this->cursorIndex];
item2->buyFanfareFunc(play, item2);
EnTrt_SetupBuyItemWithFanfare(play, this);
@@ -688,7 +698,7 @@ void EnTrt_HandleCanBuyItem(PlayState* play, EnTrt* this) {
break;
case CANBUY_RESULT_SUCCESS_2:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
item->buyFunc(play, item);
EnTrt_SetupCanBuy(play, this, 0x848);
this->drawCursor = 0;
@@ -697,22 +707,22 @@ void EnTrt_HandleCanBuyItem(PlayState* play, EnTrt* this) {
break;
case CANBUY_RESULT_NO_ROOM:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
EnTrt_SetupCannotBuy(play, this, 0x641);
break;
case CANBUY_RESULT_NEED_EMPTY_BOTTLE:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
EnTrt_SetupCannotBuy(play, this, 0x846);
break;
case CANBUY_RESULT_NEED_RUPEES:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
EnTrt_SetupCannotBuy(play, this, 0x847);
break;
case CANBUY_RESULT_CANNOT_GET_NOW:
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
EnTrt_SetupCannotBuy(play, this, 0x643);
break;
@@ -733,27 +743,31 @@ void EnTrt_SelectItem(EnTrt* this, PlayState* play) {
case 0:
EnTrt_HandleCanBuyItem(play, this);
break;
+
case 1:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
this->actionFunc = this->prevActionFunc;
- func_80151938(play, EnTrt_GetItemTextId(this));
+ Message_ContinueTextbox(play, EnTrt_GetItemTextId(this));
+ break;
+
+ default:
break;
}
}
} else if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
if (!Inventory_HasEmptyBottle()) {
- play_sound(NA_SE_SY_ERROR);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
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);
this->drawCursor = 0;
this->shopItemSelectedTween = 0.0f;
item->boughtFunc(play, item);
- SET_WEEKEVENTREG(WEEKEVENTREG_53_10);
+ SET_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_FREE_BLUE_POTION);
}
}
}
@@ -762,14 +776,15 @@ void EnTrt_SelectItem(EnTrt* this, PlayState* play) {
void EnTrt_IdleSleeping(EnTrt* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_85_08) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_84_40)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_FAILED_RECEIVED_RED_POTION_FOR_KOUME_SHOP) &&
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_RED_POTION_FOR_KOUME)) {
this->textId = 0x88F;
- } else if (!(this->flags & ENTRT_MET)) {
+ } else if (!(this->flags & ENTRT_TALKED)) {
this->textId = 0x834;
} else {
this->textId = 0x83E;
}
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_53_08)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_GAVE_KOTAKE_MUSHROOM)) {
this->talkOptionTextId = 0x845;
} else if (this->flags & ENTRT_GIVEN_MUSHROOM) {
this->talkOptionTextId = 0x882;
@@ -787,14 +802,14 @@ void EnTrt_IdleSleeping(EnTrt* this, PlayState* play) {
}
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
if (player->transformation == PLAYER_FORM_HUMAN) {
- this->flags |= ENTRT_MET;
+ this->flags |= ENTRT_TALKED;
}
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;
@@ -802,7 +817,7 @@ void EnTrt_IdleSleeping(EnTrt* this, PlayState* play) {
this->actionFunc = EnTrt_BeginInteraction;
} else if (((player->actor.world.pos.x >= -50.0f) && (player->actor.world.pos.x <= -25.0f)) &&
((player->actor.world.pos.z >= -19.0f) && (player->actor.world.pos.z <= 30.0f))) {
- func_800B8614(&this->actor, play, 200.0f);
+ Actor_OfferTalk(&this->actor, play, 200.0f);
}
if (DECR(this->timer) == 0) {
this->timer = 40;
@@ -812,7 +827,7 @@ void EnTrt_IdleSleeping(EnTrt* this, PlayState* play) {
this->blinkFunc = EnTrt_OpenThenCloseEyes;
}
if (DECR(this->sleepSoundTimer) == 0) {
- func_800B9010(&this->actor, NA_SE_EN_KOTAKE_SLEEP - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_KOTAKE_SLEEP - SFX_FLAG);
}
}
@@ -831,16 +846,16 @@ 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;
if (player->transformation == PLAYER_FORM_HUMAN) {
- this->flags |= ENTRT_MET;
+ this->flags |= ENTRT_TALKED;
}
EnTrt_ChangeAnim(&this->skelAnime, sAnimationInfo, TRT_ANIM_SLEEPING);
this->blinkFunc = EnTrt_EyesClosed;
@@ -848,7 +863,7 @@ void EnTrt_IdleAwake(EnTrt* this, PlayState* play) {
this->actionFunc = EnTrt_BeginInteraction;
} else if ((player->actor.world.pos.x >= -50.0f && player->actor.world.pos.x <= -25.0f) &&
(player->actor.world.pos.z >= -19.0f && player->actor.world.pos.z <= 30.0f)) {
- func_800B8614(&this->actor, play, 200.0f);
+ Actor_OfferTalk(&this->actor, play, 200.0f);
}
if (DECR(this->timer) == 0) {
this->timer = Rand_S16Offset(150, 100);
@@ -866,11 +881,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) {
@@ -880,7 +895,7 @@ void EnTrt_BeginInteraction(EnTrt* this, PlayState* play) {
this->blinkFunc = EnTrt_OpenEyesThenSetToBlink;
this->timer = 10;
this->cutsceneState = ENTRT_CUTSCENESTATE_PLAYING;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KOTAKE_SURPRISED2);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KOTAKE_SURPRISED2);
}
} else {
this->blinkFunc = EnTrt_OpenEyesThenSetToBlink;
@@ -894,8 +909,10 @@ void EnTrt_BeginInteraction(EnTrt* this, PlayState* play) {
this->animIndex = TRT_ANIM_HANDS_ON_COUNTER;
switch (this->textId) {
case 0x834:
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_12_08) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_84_40) &&
- !CHECK_WEEKEVENTREG(WEEKEVENTREG_16_10) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_17_01)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_SAVED_KOUME) &&
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_RED_POTION_FOR_KOUME) &&
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_KOUME_INJURED) &&
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_KOUME_KIOSK_EMPTY)) {
func_8011552C(play, DO_ACTION_DECIDE);
this->stickLeftPrompt.isEnabled = false;
this->stickRightPrompt.isEnabled = true;
@@ -904,37 +921,43 @@ 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) {
EnTrt_ChangeAnim(&this->skelAnime, sAnimationInfo, TRT_ANIM_SURPRISED);
this->animIndex = TRT_ANIM_SURPRISED;
this->blinkFunc = EnTrt_OpenEyes2;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KOTAKE_SURPRISED);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KOTAKE_SURPRISED);
this->timer = 30;
this->cutsceneState = ENTRT_CUTSCENESTATE_PLAYING;
}
@@ -952,16 +975,16 @@ void EnTrt_TryToGiveRedPotionAfterSurprised(EnTrt* this, PlayState* play) {
this->blinkFunc = EnTrt_Blink;
if ((talkState == TEXT_STATE_DONE) && Message_ShouldAdvance(play)) {
- if (Inventory_HasEmptyBottle() || !CHECK_WEEKEVENTREG(WEEKEVENTREG_12_10)) {
+ if (Inventory_HasEmptyBottle() || !CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_KOTAKE_BOTTLE)) {
if (this->cutsceneState == ENTRT_CUTSCENESTATE_PLAYING) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->cutsceneState = ENTRT_CUTSCENESTATE_STOPPED;
}
this->actionFunc = EnTrt_GiveRedPotionForKoume;
} else {
this->prevTextId = this->textId;
this->textId = 0x88E;
- SET_WEEKEVENTREG(WEEKEVENTREG_85_08);
+ SET_WEEKEVENTREG(WEEKEVENTREG_FAILED_RECEIVED_RED_POTION_FOR_KOUME_SHOP);
Message_StartTextbox(play, this->textId, &this->actor);
this->actionFunc = EnTrt_EndConversation;
}
@@ -973,16 +996,16 @@ 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;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->actionFunc = EnTrt_GiveRedPotionForKoume;
} else {
this->prevTextId = this->textId;
this->textId = 0x88E;
- SET_WEEKEVENTREG(WEEKEVENTREG_85_08);
+ SET_WEEKEVENTREG(WEEKEVENTREG_FAILED_RECEIVED_RED_POTION_FOR_KOUME_SHOP);
Message_StartTextbox(play, this->textId, &this->actor);
this->actionFunc = EnTrt_EndConversation;
}
@@ -997,17 +1020,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,23 +1038,27 @@ 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;
}
- func_80151938(play, this->textId);
+ Message_ContinueTextbox(play, this->textId);
} else {
- func_800B85E0(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
}
}
@@ -1048,13 +1075,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)) {
- func_800B8614(&this->actor, play, 200.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)) {
+ Actor_OfferTalk(&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);
@@ -1068,7 +1095,7 @@ void EnTrt_ShopkeeperGone(EnTrt* this, PlayState* play) {
void EnTrt_CannotBuy(EnTrt* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
this->actionFunc = this->prevActionFunc;
- func_80151938(play, EnTrt_GetItemTextId(this));
+ Message_ContinueTextbox(play, EnTrt_GetItemTextId(this));
}
}
@@ -1081,7 +1108,7 @@ void EnTrt_CanBuy(EnTrt* this, PlayState* play) {
item = this->items[this->cursorIndex];
item->restockFunc(play, item);
this->actionFunc = this->prevActionFunc;
- func_80151938(play, EnTrt_GetItemTextId(this));
+ Message_ContinueTextbox(play, EnTrt_GetItemTextId(this));
}
}
@@ -1090,7 +1117,7 @@ void EnTrt_BuyItemWithFanfare(EnTrt* this, PlayState* play) {
this->actor.parent = NULL;
this->actionFunc = EnTrt_SetupItemGiven;
} else {
- Actor_PickUp(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f);
}
}
@@ -1098,13 +1125,13 @@ 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);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
}
}
@@ -1122,16 +1149,17 @@ void EnTrt_ContinueShopping(EnTrt* this, PlayState* play) {
if (!EnTrt_TestEndInteraction(this, play, CONTROLLER1(&play->state))) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
player->actor.shape.rot.y = BINANG_ROT180(player->actor.shape.rot.y);
player->stateFlags2 |= PLAYER_STATE2_20000000;
Message_StartTextbox(play, this->textId, &this->actor);
EnTrt_SetupStartShopping(play, this, true);
- func_800B85E0(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
break;
+
case 1:
default:
- func_8019F230();
+ Audio_PlaySfx_MessageCancel();
EnTrt_EndInteraction(play, this);
break;
}
@@ -1385,7 +1413,7 @@ void EnTrt_TalkToShopkeeper(EnTrt* this, PlayState* play) {
if (talkState == TEXT_STATE_5) {
if (Message_ShouldAdvance(play)) {
if ((this->talkOptionTextId == 0x845) || (this->talkOptionTextId == 0x882)) {
- func_80151938(play, 0xFF);
+ Message_ContinueTextbox(play, 0xFF);
} else {
EnTrt_StartShopping(play, this);
}
@@ -1394,13 +1422,13 @@ void EnTrt_TalkToShopkeeper(EnTrt* this, PlayState* play) {
itemAction = func_80123810(play);
if (itemAction > PLAYER_IA_NONE) {
if (itemAction == PLAYER_IA_BOTTLE_MUSHROOM) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_53_08)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_GAVE_KOTAKE_MUSHROOM)) {
player->actor.textId = 0x888;
} else {
player->actor.textId = 0x883;
}
this->textId = player->actor.textId;
- player->exchangeItemId = itemAction;
+ player->exchangeItemAction = itemAction;
this->actionFunc = EnTrt_GetMushroom;
} else {
if (this->flags & ENTRT_GIVEN_MUSHROOM) {
@@ -1411,7 +1439,7 @@ void EnTrt_TalkToShopkeeper(EnTrt* this, PlayState* play) {
this->textId = player->actor.textId;
this->actionFunc = EnTrt_Goodbye;
}
- func_801477B4(play);
+ Message_CloseTextbox(play);
} else if (itemAction <= PLAYER_IA_MINUS1) {
if (this->flags & ENTRT_GIVEN_MUSHROOM) {
this->textId = 0x88B;
@@ -1426,45 +1454,45 @@ void EnTrt_TalkToShopkeeper(EnTrt* this, PlayState* play) {
void EnTrt_SetupTalkToShopkeeper(PlayState* play, EnTrt* this) {
this->actionFunc = EnTrt_TalkToShopkeeper;
- func_80151938(play, this->talkOptionTextId);
+ Message_ContinueTextbox(play, this->talkOptionTextId);
func_8011552C(play, DO_ACTION_DECIDE);
this->stickLeftPrompt.isEnabled = false;
this->stickRightPrompt.isEnabled = false;
}
void EnTrt_SetupLookToShopkeeperFromShelf(PlayState* play, EnTrt* this) {
- play_sound(NA_SE_SY_CURSOR);
+ Audio_PlaySfx(NA_SE_SY_CURSOR);
this->drawCursor = 0;
this->actionFunc = EnTrt_LookToShopkeeperFromShelf;
}
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);
}
}
}
void EnTrt_InitShopkeeper(EnTrt* this, PlayState* play) {
SkelAnime_InitFlex(play, &this->skelAnime, &gKotakeSkel, &gKotakeSleepingAnim, NULL, NULL, 0);
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_12_08) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_84_40) &&
- (gSaveContext.save.day >= 2)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_SAVED_KOUME) &&
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_RED_POTION_FOR_KOUME) && (gSaveContext.save.day >= 2)) {
this->actor.draw = NULL;
} else {
this->actor.draw = EnTrt_Draw;
@@ -1473,14 +1501,14 @@ 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;
this->actor.colChkInfo.cylRadius = 50;
this->timer = Rand_S16Offset(40, 20);
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_12_08) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_84_40) &&
- gSaveContext.save.day >= 2) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_SAVED_KOUME) &&
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_RED_POTION_FOR_KOUME) && gSaveContext.save.day >= 2) {
this->textId = 0x84A;
this->actionFunc = EnTrt_ShopkeeperGone;
} else {
@@ -1545,18 +1573,18 @@ void EnTrt_InitShop(EnTrt* this, PlayState* play) {
this->blinkTimer = 20;
this->eyeTexIndex = 0;
this->blinkFunc = EnTrt_EyesClosed;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_53_08)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_GAVE_KOTAKE_MUSHROOM)) {
this->flags |= ENTRT_GIVEN_MUSHROOM;
}
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
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 +1599,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 +1660,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 +1821,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 4018a5021..8bc8e2541 100644
--- a/src/overlays/actors/ovl_En_Trt2/z_en_trt2.c
+++ b/src/overlays/actors/ovl_En_Trt2/z_en_trt2.c
@@ -7,7 +7,7 @@
#include "z_en_trt2.h"
#include "objects/object_trt/object_trt.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnTrt2*)thisx)
@@ -144,13 +144,14 @@ void func_80AD341C(EnTrt2* this, PlayState* play) {
}
void func_80AD349C(EnTrt2* this) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_85_10) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_84_40)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_FAILED_RECEIVED_RED_POTION_FOR_KOUME_WOODS) &&
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_RED_POTION_FOR_KOUME)) {
this->unk_3A8 = 0x88F;
} else if (this->unk_3A8 == 0) {
this->unk_3A8 = 0x84B;
- } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_16_10)) {
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_KOUME_INJURED)) {
this->unk_3A8 = 0x838;
- } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_17_01)) {
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_KOUME_KIOSK_EMPTY)) {
this->unk_3A8 = 0x84D;
} else {
this->unk_3A8 = 0x849;
@@ -164,7 +165,7 @@ void func_80AD3530(EnTrt2* this, PlayState* play) {
func_80AD46F8(this);
if (this->path != NULL) {
phi_a1 = func_80AD48F8(this->path, this->unk_1E4, &this->actor.world.pos, &sp30);
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
phi_a1 = this->actor.wallYaw;
}
Math_SmoothStepToS(&this->actor.world.rot.y, phi_a1, 4, 1000, 1);
@@ -176,7 +177,7 @@ void func_80AD3530(EnTrt2* this, PlayState* play) {
this->unk_1E4++;
}
}
- Math_ApproachF(&this->actor.speedXZ, 1.5f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 1.5f, 0.2f, 1.0f);
}
Actor_MoveWithGravity(&this->actor);
@@ -189,18 +190,18 @@ 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);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_KOTAKE_FLY - SFX_FLAG);
}
void func_80AD36EC(EnTrt2* this, PlayState* play) {
@@ -216,10 +217,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++;
@@ -227,9 +228,9 @@ void func_80AD36EC(EnTrt2* this, PlayState* play) {
}
}
Actor_MoveWithGravity(&this->actor);
- func_800B9010(&this->actor, NA_SE_EN_KOTAKE_FLY - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_KOTAKE_FLY - SFX_FLAG);
if ((this->actor.shape.rot.y >= 0x2800) && (this->actor.shape.rot.y < 0x3800)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KOTAKE_ROLL);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KOTAKE_ROLL);
}
}
@@ -239,7 +240,7 @@ void func_80AD381C(EnTrt2* this, PlayState* play) {
this->actor.world.pos.y -= 50.0f;
this->unk_3D9 = 0;
this->unk_3B2 = 0;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.flags |= ACTOR_FLAG_10;
}
} else {
@@ -262,32 +263,32 @@ 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++;
}
}
- if (this->actor.bgCheckFlags & 8) {
+ 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;
}
}
- Math_ApproachF(&this->actor.speedXZ, 5.0f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 5.0f, 0.2f, 1.0f);
}
Actor_MoveWithoutGravity(&this->actor);
- func_800B9010(&this->actor, NA_SE_EN_KOTAKE_FLY - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_KOTAKE_FLY - SFX_FLAG);
}
void func_80AD3A24(EnTrt2* this, PlayState* play) {
func_80AD46F8(this);
- if (this->actor.speedXZ > 0.05f) {
- Math_ApproachF(&this->actor.speedXZ, 0.0f, 0.2f, 1.0f);
+ if (this->actor.speed > 0.05f) {
+ Math_ApproachF(&this->actor.speed, 0.0f, 0.2f, 1.0f);
} else if (DECR(this->unk_3AE) == 0) {
this->unk_3AE = Rand_S16Offset(100, 50);
EnTrt2_ChangeAnim(&this->skelAnime, sAnimationInfo, TRT2_ANIM_HOVER);
@@ -332,7 +333,7 @@ void func_80AD3BE4(EnTrt2* this, PlayState* play) {
void func_80AD3C94(EnTrt2* this, PlayState* play) {
if (this->actor.world.pos.y < 5.0f) {
func_80AD4A78(this, play);
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->unk_3B2 = 0xF;
}
}
@@ -346,7 +347,7 @@ void func_80AD3CEC(EnTrt2* this, PlayState* play) {
Message_StartTextbox(play, this->unk_3A8, &this->actor);
this->unk_3D8 = false;
} else if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
EnTrt2_ChangeAnim(&this->skelAnime, sAnimationInfo, TRT2_ANIM_HOVER);
this->unk_3B2 = 4;
@@ -374,11 +375,11 @@ void func_80AD3DA4(EnTrt2* this, PlayState* play) {
void func_80AD3E34(EnTrt2* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
if (Inventory_HasEmptyBottle()) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->unk_3B2 = 12;
} else {
- SET_WEEKEVENTREG(WEEKEVENTREG_85_10);
+ SET_WEEKEVENTREG(WEEKEVENTREG_FAILED_RECEIVED_RED_POTION_FOR_KOUME_WOODS);
this->unk_3A8 = 0x88E;
Message_StartTextbox(play, this->unk_3A8, &this->actor);
this->unk_3B2 = 10;
@@ -391,18 +392,18 @@ void func_80AD3EF0(EnTrt2* this, PlayState* play) {
if (talkState == TEXT_STATE_DONE) {
if (Message_ShouldAdvance(play)) {
- if ((Inventory_HasEmptyBottle() && !CHECK_WEEKEVENTREG(WEEKEVENTREG_84_40)) ||
- !CHECK_WEEKEVENTREG(WEEKEVENTREG_12_10)) {
+ if ((Inventory_HasEmptyBottle() && !CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_RED_POTION_FOR_KOUME)) ||
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_KOTAKE_BOTTLE)) {
this->unk_3B2 = 12;
} else {
- SET_WEEKEVENTREG(WEEKEVENTREG_85_10);
+ SET_WEEKEVENTREG(WEEKEVENTREG_FAILED_RECEIVED_RED_POTION_FOR_KOUME_WOODS);
this->unk_3A8 = 0x88E;
Message_StartTextbox(play, this->unk_3A8, &this->actor);
this->unk_3B2 = 10;
}
}
} else if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
this->unk_3B2 = 12;
}
@@ -410,22 +411,22 @@ void func_80AD3EF0(EnTrt2* this, PlayState* play) {
void func_80AD3FF4(EnTrt2* this, PlayState* play) {
if (Actor_HasParent(&this->actor, play)) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_12_10)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_12_10);
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_KOTAKE_BOTTLE)) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_KOTAKE_BOTTLE);
}
- SET_WEEKEVENTREG(WEEKEVENTREG_84_40);
+ SET_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_RED_POTION_FOR_KOUME);
this->actor.parent = NULL;
this->unk_3B2 = 14;
- } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_12_10)) {
- Actor_PickUp(&this->actor, play, GI_POTION_RED, 300.0f, 300.0f);
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_KOTAKE_BOTTLE)) {
+ Actor_OfferGetItem(&this->actor, play, GI_POTION_RED, 300.0f, 300.0f);
} else {
- Actor_PickUp(&this->actor, play, GI_POTION_RED_BOTTLE, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_POTION_RED_BOTTLE, 300.0f, 300.0f);
}
}
void func_80AD40AC(EnTrt2* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(play)) {
- func_800B85E0(&this->actor, play, 400.0f, -1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
this->unk_3B2 = 13;
}
}
@@ -433,10 +434,10 @@ void func_80AD40AC(EnTrt2* this, PlayState* play) {
void func_80AD4110(EnTrt2* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->unk_3A8 = 0x84C;
- func_80151938(play, this->unk_3A8);
+ Message_ContinueTextbox(play, this->unk_3A8);
this->unk_3B2 = 10;
} else {
- func_800B85E0(&this->actor, play, 400.0f, -1);
+ Actor_OfferTalkExchangeEquiCylinder(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
}
}
@@ -446,11 +447,11 @@ void func_80AD417C(EnTrt2* this, PlayState* play) {
func_80AD349C(this);
func_80AD3DA4(this, play);
} else {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
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 +467,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,20 +493,20 @@ 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);
}
- func_800B9010(&this->actor, NA_SE_EN_COMMON_EXTINCT_LEV - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_COMMON_EXTINCT_LEV - SFX_FLAG);
}
} else if (this->actor.world.pos.y < 5.0f) {
func_80AD4A78(this, play);
@@ -514,7 +515,7 @@ void func_80AD434C(EnTrt2* this, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
if ((this->actor.shape.rot.y >= 0x2800) && (this->actor.shape.rot.y < 0x3800)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KOTAKE_ROLL);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KOTAKE_ROLL);
}
}
@@ -528,7 +529,7 @@ void func_80AD4550(EnTrt2* this, PlayState* play) {
}
if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
}
}
@@ -592,7 +593,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 +616,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 +640,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);
}
@@ -663,10 +664,10 @@ s32 func_80AD4B4C(EnTrt2* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
sp24 = true;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
func_80AD349C(this);
this->unk_3B4 = this->unk_3B2;
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
if ((player->transformation != PLAYER_FORM_HUMAN) && (player->transformation != PLAYER_FORM_FIERCE_DEITY)) {
this->unk_3A8 = 0x84F;
}
@@ -686,7 +687,7 @@ s32 func_80AD4B4C(EnTrt2* this, PlayState* play) {
}
s32 func_80AD4C4C(EnTrt2* this) {
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
if (this->actor.xzDistToPlayer < 100.0f) {
return true;
}
@@ -700,16 +701,17 @@ s32 func_80AD4CCC(EnTrt2* this, PlayState* play) {
s16 sp1E = this->actor.yawTowardsPlayer - this->actor.shape.rot.y;
Player* player = GET_PLAYER(play);
- if (((this->unk_3B2 == 4) || (this->unk_3B2 == 5)) && this->actor.isTargeted && !(this->actor.bgCheckFlags & 1) &&
+ if (((this->unk_3B2 == 4) || (this->unk_3B2 == 5)) && this->actor.isLockedOn &&
+ !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
((player->transformation == PLAYER_FORM_HUMAN) || (player->transformation == PLAYER_FORM_FIERCE_DEITY))) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.velocity.y = 1.5f;
this->unk_3B2 = 16;
return true;
}
- if (func_80AD4C4C(this) && this->actor.isTargeted && (sp1E < 0x4000) && (sp1E > -0x4000)) {
- func_800B863C(&this->actor, play);
+ if (func_80AD4C4C(this) && this->actor.isLockedOn && (sp1E < 0x4000) && (sp1E > -0x4000)) {
+ Actor_OfferTalkNearColChkInfoCylinder(&this->actor, play);
}
return true;
@@ -721,7 +723,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;
@@ -737,17 +739,17 @@ 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;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_12_08)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_SAVED_KOUME)) {
Actor_Kill(&this->actor);
return;
}
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_84_40)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_RED_POTION_FOR_KOUME)) {
Actor_Kill(&this->actor);
return;
}
@@ -791,7 +793,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);
@@ -799,7 +801,7 @@ void func_80AD4FE4(EnTrt2* this, PlayState* play) {
}
static InitChainEntry sInitChain[] = {
- ICHAIN_U8(targetMode, 3, ICHAIN_CONTINUE),
+ ICHAIN_U8(targetMode, TARGET_MODE_3, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 500, ICHAIN_STOP),
};
@@ -940,7 +942,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 733ea0c57..a5938d4cf 100644
--- a/src/overlays/actors/ovl_En_Tru/z_en_tru.c
+++ b/src/overlays/actors/ovl_En_Tru/z_en_tru.c
@@ -7,7 +7,7 @@
#include "z_en_tru.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((EnTru*)thisx)
@@ -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);
@@ -671,11 +670,11 @@ UNK_TYPE* func_80A871E0(EnTru* this, PlayState* play) {
return D_80A88924;
}
- if (!(this->unk_34E & 0x40) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_16_10)) {
+ if (!(this->unk_34E & 0x40) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_KOUME_INJURED)) {
return D_80A88918;
}
- if ((this->unk_34E & 0x1000) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_16_10)) {
+ if ((this->unk_34E & 0x1000) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_KOUME_INJURED)) {
return D_80A88910;
}
@@ -686,28 +685,28 @@ s32 func_80A872AC(EnTru* this, PlayState* play) {
Player* player = GET_PLAYER(play);
s32 ret = false;
- if (this->unk_34E & 7) {
- if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- if (player->transformation == PLAYER_FORM_HUMAN) {
- this->unk_34E &= ~0x80;
- }
- this->unk_34E &= ~(0x4000 | 0x2000);
-
- if ((player->exchangeItemId == 35) || (player->exchangeItemId == 36)) {
- this->unk_34E |= 0x2000;
- this->unk_38C = player->exchangeItemId;
- } else if (player->exchangeItemId != 0) {
- this->unk_34E |= 0x4000;
- }
-
- this->unk_378 = func_80A875AC;
- this->unk_390 = 0;
- this->unk_364 = 0;
- this->unk_354 = func_80A871E0(this, play);
- SubS_UpdateFlags(&this->unk_34E, 0, 7);
- this->actionFunc = func_80A881E0;
- ret = true;
+ if (((this->unk_34E & SUBS_OFFER_MODE_MASK) != SUBS_OFFER_MODE_NONE) &&
+ Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ if (player->transformation == PLAYER_FORM_HUMAN) {
+ this->unk_34E &= ~0x80;
}
+ this->unk_34E &= ~(0x4000 | 0x2000);
+
+ if ((player->exchangeItemAction == PLAYER_IA_BOTTLE_POTION_RED) ||
+ (player->exchangeItemAction == PLAYER_IA_BOTTLE_POTION_BLUE)) {
+ this->unk_34E |= 0x2000;
+ this->unk_38C = player->exchangeItemAction;
+ } else if (player->exchangeItemAction != PLAYER_IA_NONE) {
+ this->unk_34E |= 0x4000;
+ }
+
+ this->unk_378 = func_80A875AC;
+ this->unk_390 = 0;
+ this->unk_364 = 0;
+ this->unk_354 = func_80A871E0(this, play);
+ SubS_SetOfferMode(&this->unk_34E, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
+ this->actionFunc = func_80A881E0;
+ ret = true;
}
return ret;
@@ -736,7 +735,7 @@ s32 func_80A87400(EnTru* this, PlayState* play) {
this->unk_360 = CLAMP(this->unk_360 + 2000, 0, 0x4000);
Math_ApproachF(&this->unk_35C, 30.0f, 0.08f, 1000.0f);
- Math_ApproachF(&this->actor.speedXZ, 30.0f, 0.2f, 1000.0f);
+ Math_ApproachF(&this->actor.speed, 30.0f, 0.2f, 1000.0f);
if (this->path != NULL) {
sp4C = Lib_SegmentedToVirtual(this->path->points);
@@ -770,8 +769,8 @@ 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;
+ if ((this->unk_34E & 0x40) || CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_KOUME_INJURED)) {
+ this->csId = this->actor.csId;
this->unk_364++;
} else {
this->unk_364++;
@@ -780,14 +779,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 +866,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,11 +912,11 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_EN_KOUME_DRINK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KOUME_DRINK);
} else if (Animation_OnFrame(&this->skelAnime, 90.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KOUME_REGAIN);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KOUME_REGAIN);
}
if ((this->skelAnime.curFrame > 90.0f) && (this->skelAnime.curFrame < 95.0f)) {
@@ -961,7 +960,7 @@ s32 func_80A87B48(Actor* thisx, PlayState* play) {
this->unk_372 = 10;
this->unk_364++;
} else if (Animation_OnFrame(&this->skelAnime, 22.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KOUME_MAGIC);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KOUME_MAGIC);
func_80A85AA4(this->unk_394, &this->unk_1F8, 1.0f, 0.1f, 40.0f);
}
break;
@@ -973,8 +972,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->exchangeItemAction != PLAYER_IA_NONE) {
+ player->exchangeItemAction = PLAYER_IA_NONE;
}
EnTru_ChangeAnim(this, KOUME_ANIM_HOVER1);
}
@@ -999,26 +998,26 @@ 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;
case 2:
AudioSfx_StopById(NA_SE_EN_KOUME_MAGIC);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KOUME_AWAY);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KOUME_LAUGH);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KOUME_AWAY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KOUME_LAUGH);
EnTru_ChangeAnim(this, KOUME_ANIM_TAKE_OFF);
this->skelAnime.baseTransl.y = 0;
this->skelAnime.moveFlags = 2;
@@ -1041,13 +1040,13 @@ s32 func_80A87DC0(Actor* thisx, PlayState* play) {
case 4:
if (func_80A87400(this, play) || (DECR(this->unk_362) == 0)) {
ret = true;
- SET_WEEKEVENTREG(WEEKEVENTREG_12_08);
+ SET_WEEKEVENTREG(WEEKEVENTREG_SAVED_KOUME);
}
break;
}
if (ret == true) {
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.draw = NULL;
this->unk_378 = NULL;
this->unk_34E = 0;
@@ -1058,17 +1057,17 @@ s32 func_80A87DC0(Actor* thisx, PlayState* play) {
void func_80A87FD0(EnTru* this, PlayState* play) {
if (this->actor.draw != NULL) {
- if ((this->unk_34E & 0x80) || CHECK_WEEKEVENTREG(WEEKEVENTREG_16_10)) {
+ if ((this->unk_34E & 0x80) || CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_KOUME_INJURED)) {
if (func_80A873B8(this)) {
- SubS_UpdateFlags(&this->unk_34E, 3, 7);
+ SubS_SetOfferMode(&this->unk_34E, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
} else {
- SubS_UpdateFlags(&this->unk_34E, 0, 7);
+ SubS_SetOfferMode(&this->unk_34E, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
}
} else if (this->unk_34E & 0x40) {
if (func_80A873B8(this)) {
- SubS_UpdateFlags(&this->unk_34E, 3, 7);
+ SubS_SetOfferMode(&this->unk_34E, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
} else {
- SubS_UpdateFlags(&this->unk_34E, 0, 7);
+ SubS_SetOfferMode(&this->unk_34E, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
}
if ((this->animIndex == KOUME_ANIM_TRY_GET_UP) &&
@@ -1081,15 +1080,15 @@ void func_80A87FD0(EnTru* this, PlayState* play) {
EnTru_ChangeAnim(this, KOUME_ANIM_TRY_GET_UP);
}
}
- } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_16_10) && (fabsf(this->actor.playerHeightRel) < 10.0f) &&
- (this->actor.xzDistToPlayer < 140.0f)) {
- SubS_UpdateFlags(&this->unk_34E, 4, 7);
+ } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_KOUME_INJURED) &&
+ (fabsf(this->actor.playerHeightRel) < 10.0f) && (this->actor.xzDistToPlayer < 140.0f)) {
+ SubS_SetOfferMode(&this->unk_34E, SUBS_OFFER_MODE_AUTO, SUBS_OFFER_MODE_MASK);
this->unk_34E |= 0x1040;
this->unk_362 = Rand_S16Offset(40, 20);
} else if (func_80A873B8(this)) {
- SubS_UpdateFlags(&this->unk_34E, 3, 7);
+ SubS_SetOfferMode(&this->unk_34E, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK);
} else {
- SubS_UpdateFlags(&this->unk_34E, 0, 7);
+ SubS_SetOfferMode(&this->unk_34E, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
}
}
}
@@ -1102,24 +1101,24 @@ 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)) {
+ if (!(this->unk_34E & 0x40) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_KOUME_INJURED)) {
EnTru_ChangeAnim(this, KOUME_ANIM_INJURED_LYING_DOWN);
} else if (this->unk_34E & 0x80) {
EnTru_ChangeAnim(this, KOUME_ANIM_INJURED_LYING_DOWN);
func_80A86460(this);
- } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_16_10)) {
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_KOUME_INJURED)) {
EnTru_ChangeAnim(this, KOUME_ANIM_INJURED_HEAD_UP_MORPH);
}
- SubS_UpdateFlags(&this->unk_34E, 0, 7);
+ SubS_SetOfferMode(&this->unk_34E, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK);
this->unk_34E &= ~(0x1000 | 0x8);
this->unk_34E |= 0x10;
this->actor.shape.rot.y = this->actor.world.rot.y;
- this->actor.flags &= ~ACTOR_FLAG_100;
+ this->actor.flags &= ~ACTOR_FLAG_TALK_REQUESTED;
this->unk_1E8 = 0;
this->actionFunc = func_80A87FD0;
}
@@ -1128,7 +1127,7 @@ void func_80A881E0(EnTru* this, PlayState* play) {
void EnTru_Init(Actor* thisx, PlayState* play) {
EnTru* this = THIS;
- if ((gSaveContext.save.entrance != ENTRANCE(WOODS_OF_MYSTERY, 0)) || CHECK_WEEKEVENTREG(WEEKEVENTREG_12_08)) {
+ if ((gSaveContext.save.entrance != ENTRANCE(WOODS_OF_MYSTERY, 0)) || CHECK_WEEKEVENTREG(WEEKEVENTREG_SAVED_KOUME)) {
Actor_Kill(&this->actor);
return;
}
@@ -1139,23 +1138,24 @@ 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;
}
- this->actor.targetMode = 0;
+ this->actor.targetMode = TARGET_MODE_0;
Actor_SetScale(&this->actor, 0.008f);
this->unk_34E = 0;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_16_10)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_KOUME_INJURED)) {
EnTru_ChangeAnim(this, KOUME_ANIM_INJURED_HEAD_UP);
} else {
this->unk_388 = PLAYER_IA_NONE;
}
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) {
@@ -1179,7 +1179,7 @@ void EnTru_Update(Actor* thisx, PlayState* play) {
radius = this->collider.dim.worldSphere.radius + 30;
this->unk_388 = !(this->unk_34E & 0x80) ? PLAYER_IA_NONE : PLAYER_IA_NONE;
- func_8013C964(&this->actor, play, radius, 20.0f, this->unk_388, this->unk_34E & 7);
+ SubS_Offer(&this->actor, play, radius, 20.0f, this->unk_388, this->unk_34E & SUBS_OFFER_MODE_MASK);
func_80A8697C(this, play);
func_80A86384(this->unk_394, &this->unk_1F8);
}
@@ -1266,7 +1266,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 e5ff4350f..8ca8857db 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
@@ -7,7 +7,7 @@
#include "z_en_tru_mt.h"
#include "overlays/actors/ovl_En_Jc_Mato/z_en_jc_mato.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((EnTruMt*)thisx)
@@ -180,13 +180,13 @@ s32 func_80B761FC(EnTruMt* this, PlayState* play) {
this->collider.base.acFlags &= ~AC_HIT;
if (this->unk_3A4 == 0) {
this->unk_3A4 = 1;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KOUME_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KOUME_DAMAGE);
} else {
this->unk_3A4 = 0;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KOUME_DAMAGE2);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_KOUME_DAMAGE2);
}
play->interfaceCtx.minigameHiddenPoints = 1;
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 25);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 25);
return true;
}
}
@@ -247,13 +247,13 @@ void func_80B76440(EnTruMt* this, PlayState* play) {
s16 temp_v1 = this->unk_394 - Math_Vec3f_Yaw(&this->unk_398, &this->actor.world.pos);
if ((temp_v1 <= -0x2000) || (temp_v1 >= 0x2000)) {
- Math_ApproachF(&this->actor.speedXZ, 7.0f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 7.0f, 0.2f, 1.0f);
} else if (this->actor.xzDistToPlayer < 300.0f) {
- Math_ApproachF(&this->actor.speedXZ, 7.0f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 7.0f, 0.2f, 1.0f);
} else if (this->actor.xzDistToPlayer > 500.0f) {
- Math_ApproachF(&this->actor.speedXZ, 2.5f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 2.5f, 0.2f, 1.0f);
} else {
- Math_ApproachF(&this->actor.speedXZ, 4.0f, 0.2f, 1.0f);
+ Math_ApproachF(&this->actor.speed, 4.0f, 0.2f, 1.0f);
}
}
}
@@ -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;
}
@@ -335,7 +335,7 @@ s32 func_80B768F0(EnTruMt* this, PlayState* play) {
}
void func_80B76924(EnTruMt* this) {
- this->unk_38E.z = Math_SinS(this->unk_388) * 30.0f * (0x10000 / 360.0f);
+ this->unk_38E.z = DEG_TO_BINANG(Math_SinS(this->unk_388) * 30.0f);
this->unk_388 += 0x400;
}
@@ -347,14 +347,11 @@ void func_80B76980(EnTruMt* this, PlayState* play) {
SET_EVENTINF(EVENTINF_36);
SET_EVENTINF(EVENTINF_40);
player->stateFlags3 &= ~PLAYER_STATE3_400;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = func_80B76BB8;
} 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 (((void)0, gSaveContext.minigameScore) > HS_GET_BOAT_ARCHERY_HIGH_SCORE()) {
+ HS_SET_BOAT_ARCHERY_HIGH_SCORE((u32)((void)0, gSaveContext.minigameScore));
SET_EVENTINF(EVENTINF_37);
}
}
@@ -381,7 +378,7 @@ void func_80B76A64(EnTruMt* this, PlayState* play) {
if (func_80B76600(this, this->path, this->unk_36C)) {
if (this->unk_36C >= (this->path->count - 1)) {
this->actionFunc = func_80B76C38;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
return;
}
this->unk_36C++;
@@ -431,15 +428,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->actor.targetMode = 0;
+ this->path = SubS_GetPathByIndex(play, ENTRUMT_GET_FF(&this->actor), ENTRUMT_PATH_INDEX_NONE);
+ this->actor.targetMode = TARGET_MODE_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 +524,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 +580,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 5b6f7b978..f95b1a8e8 100644
--- a/src/overlays/actors/ovl_En_Tsn/z_en_tsn.c
+++ b/src/overlays/actors/ovl_En_Tsn/z_en_tsn.c
@@ -8,7 +8,7 @@
#include "z64snap.h"
#include "objects/object_tsn/object_tsn.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
#define THIS ((EnTsn*)thisx)
@@ -83,7 +83,7 @@ void func_80ADFCEC(EnTsn* this, PlayState* play) {
this->actor.update = func_80AE0F84;
this->actor.destroy = NULL;
this->actor.draw = NULL;
- this->actor.targetMode = 7;
+ this->actor.targetMode = TARGET_MODE_7;
switch (ENTSN_GET_F(&this->actor)) {
case ENTSN_F_0:
@@ -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);
}
}
@@ -160,7 +160,7 @@ void func_80ADFF84(EnTsn* this, PlayState* play) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_26_08)) {
textId = 0x107E;
- } else if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ } else if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_25_80)) {
textId = 0x1083;
} else {
@@ -198,43 +198,43 @@ void func_80AE0010(EnTsn* this, PlayState* play) {
switch (play->msgCtx.currentTextId) {
case 0x107F:
case 0x1081:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x1080:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
Animation_MorphToLoop(&this->skelAnime, &object_tsn_Anim_001198, -10.0f);
break;
case 0x1082:
Animation_MorphToLoop(&this->skelAnime, &object_tsn_Anim_0092FC, -10.0f);
SET_WEEKEVENTREG(WEEKEVENTREG_25_80);
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80AE0304;
this->actor.textId = 0;
break;
case 0x1083:
SET_WEEKEVENTREG(WEEKEVENTREG_25_80);
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80AE0304;
this->actor.textId = 0;
break;
case 0x1084:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
Animation_MorphToLoop(&this->skelAnime, &object_tsn_Anim_000964, -10.0f);
break;
case 0x1085:
case 0x1086:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x1089:
case 0x1093:
SET_WEEKEVENTREG(WEEKEVENTREG_26_01);
- func_801477B4(play);
+ Message_CloseTextbox(play);
Animation_MorphToLoop(&this->skelAnime, &object_tsn_Anim_0092FC, -10.0f);
this->actionFunc = func_80AE0304;
this->actor.textId = 0;
@@ -242,24 +242,24 @@ void func_80AE0010(EnTsn* this, PlayState* play) {
case 0x1087:
Animation_MorphToLoop(&this->skelAnime, &object_tsn_Anim_001198, -10.0f);
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x1088:
SET_WEEKEVENTREG(WEEKEVENTREG_26_01);
if (INV_CONTENT(ITEM_MASK_ZORA) == ITEM_MASK_ZORA) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
Animation_MorphToLoop(&this->skelAnime, &object_tsn_Anim_0092FC, -10.0f);
this->actionFunc = func_80AE0304;
this->actor.textId = 0;
} else {
- func_80151938(play, 0x1093);
+ Message_ContinueTextbox(play, 0x1093);
Animation_MorphToLoop(&this->skelAnime, &object_tsn_Anim_0092FC, -10.0f);
}
break;
case 0x107E:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80AE0304;
this->actor.textId = 0;
break;
@@ -275,7 +275,7 @@ void func_80AE0304(EnTsn* this, PlayState* play) {
func_80ADFF84(this, play);
}
} else if ((this->actor.xzDistToPlayer < 150.0f) && Player_IsFacingActor(&this->actor, 0x3000, play)) {
- func_800B8614(&this->actor, play, 160.0f);
+ Actor_OfferTalk(&this->actor, play, 160.0f);
this->unk_220 |= 1;
} else {
this->unk_220 &= ~1;
@@ -300,7 +300,7 @@ void func_80AE0460(EnTsn* this, PlayState* play) {
ENTSN_SET_Z(&this->unk_1D8->actor, false);
this->actionFunc = func_80AE0418;
} else {
- Actor_PickUp(&this->actor, play, GI_SEAHORSE_CAUGHT, 2000.0f, 1000.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_SEAHORSE_CAUGHT, 2000.0f, 1000.0f);
}
}
@@ -322,9 +322,9 @@ void func_80AE04FC(EnTsn* this, PlayState* play) {
}
if (itemAction > PLAYER_IA_NONE) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80AE0704;
- if (itemAction == PLAYER_IA_PICTO_BOX) {
+ if (itemAction == PLAYER_IA_PICTOGRAPH_BOX) {
if (CHECK_QUEST_ITEM(QUEST_PICTOGRAPH)) {
if (Snap_CheckFlag(PICTO_VALID_PIRATE_GOOD)) {
player->actor.textId = 0x107B;
@@ -357,7 +357,7 @@ void func_80AE04FC(EnTsn* this, PlayState* play) {
}
if (itemAction <= PLAYER_IA_MINUS1) {
- func_80151938(play, 0x1078);
+ Message_ContinueTextbox(play, 0x1078);
Animation_MorphToLoop(&this->unk_1D8->skelAnime, &object_tsn_Anim_001198, -10.0f);
this->actionFunc = func_80AE0704;
}
@@ -365,11 +365,11 @@ void func_80AE04FC(EnTsn* this, PlayState* play) {
}
void func_80AE0698(EnTsn* this, PlayState* play) {
- func_801477B4(play);
+ Message_CloseTextbox(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);
}
@@ -391,9 +391,9 @@ void func_80AE0704(EnTsn* this, PlayState* play) {
switch (play->msgCtx.currentTextId) {
case 0x106E:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_25_40)) {
- func_80151938(play, 0x1074);
+ Message_ContinueTextbox(play, 0x1074);
} else {
- func_80151938(play, 0x106F);
+ Message_ContinueTextbox(play, 0x106F);
}
this->unk_220 |= 2;
SET_WEEKEVENTREG(WEEKEVENTREG_25_40);
@@ -405,51 +405,51 @@ void func_80AE0704(EnTsn* this, PlayState* play) {
case 0x1070:
case 0x1071:
case 0x1072:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x1076:
case 0x1079:
Animation_MorphToLoop(&this->unk_1D8->skelAnime, &object_tsn_Anim_000964, -10.0f);
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x107A:
- func_80151938(play, 0x10A6);
+ Message_ContinueTextbox(play, 0x10A6);
break;
case 0x1075:
case 0x1078:
- player->exchangeItemId = 0;
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ player->exchangeItemAction = PLAYER_IA_NONE;
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
Animation_MorphToLoop(&this->unk_1D8->skelAnime, &object_tsn_Anim_0092FC, -10.0f);
break;
case 0x107C:
if (Inventory_HasEmptyBottle()) {
SET_WEEKEVENTREG(WEEKEVENTREG_26_08);
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80AE0460;
func_80AE0460(this, play);
this->unk_220 &= ~2;
this->actor.focus.pos = this->actor.world.pos;
- ActorCutscene_Stop(this->actor.cutscene);
- this->actor.flags &= ~ACTOR_FLAG_100;
+ CutsceneManager_Stop(this->actor.csId);
+ this->actor.flags &= ~ACTOR_FLAG_TALK_REQUESTED;
REMOVE_QUEST_ITEM(QUEST_PICTOGRAPH);
} else {
- func_80151938(play, 0x10A8);
+ Message_ContinueTextbox(play, 0x10A8);
}
break;
case 0x1073:
case 0x1074:
- func_80151938(play, 0xFF);
+ Message_ContinueTextbox(play, 0xFF);
this->actionFunc = func_80AE04FC;
break;
case 0x107B:
- player->exchangeItemId = 0;
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ player->exchangeItemAction = PLAYER_IA_NONE;
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
Animation_MorphToLoop(&this->unk_1D8->skelAnime, &object_tsn_Anim_0092FC, -10.0f);
break;
@@ -458,14 +458,14 @@ void func_80AE0704(EnTsn* this, PlayState* play) {
case 0x10A8:
Animation_MorphToLoop(&this->unk_1D8->skelAnime, &object_tsn_Anim_0092FC, -10.0f);
func_80AE0698(this, play);
- this->actor.flags &= ~ACTOR_FLAG_100;
+ this->actor.flags &= ~ACTOR_FLAG_TALK_REQUESTED;
this->actionFunc = func_80AE04C4;
break;
case 0x108A:
case 0x1091:
SET_WEEKEVENTREG(WEEKEVENTREG_26_04);
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
this->unk_220 |= 2;
this->actor.textId = 0x1091;
break;
@@ -475,14 +475,14 @@ void func_80AE0704(EnTsn* this, PlayState* play) {
case 0x108D:
case 0x108E:
case 0x108F:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x1092:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_26_08)) {
func_80AE0698(this, play);
} else {
- func_80151938(play, 0x10A7);
+ Message_ContinueTextbox(play, 0x10A7);
Animation_MorphToLoop(&this->unk_1D8->skelAnime, &object_tsn_Anim_000964, -10.0f);
}
break;
@@ -498,7 +498,7 @@ void func_80AE0704(EnTsn* this, PlayState* play) {
case 0x10A9:
func_80AE0698(this, play);
- this->actor.flags &= ~ACTOR_FLAG_100;
+ this->actor.flags &= ~ACTOR_FLAG_TALK_REQUESTED;
this->actionFunc = func_80AE04C4;
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);
}
}
}
@@ -536,16 +536,16 @@ void func_80AE0C88(EnTsn* this, PlayState* play) {
this->unk_220 |= 4;
ENTSN_SET_Z(&this->unk_1D8->actor, true);
}
- } else if (this->actor.isTargeted) {
- func_800B8614(&this->actor, play, 1000.0f);
+ } else if (this->actor.isLockedOn) {
+ Actor_OfferTalk(&this->actor, play, 1000.0f);
}
}
void func_80AE0D10(EnTsn* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80AE0D78;
- ActorCutscene_Stop(this->actor.cutscene);
+ CutsceneManager_Stop(this->actor.csId);
}
}
@@ -553,8 +553,8 @@ void func_80AE0D78(EnTsn* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actionFunc = func_80AE0D10;
this->unk_220 |= 4;
- } else if (this->actor.isTargeted) {
- func_800B8614(&this->actor, play, 1000.0f);
+ } else if (this->actor.isLockedOn) {
+ Actor_OfferTalk(&this->actor, play, 1000.0f);
}
}
@@ -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 4f7b8b720..cc1df3cdb 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
@@ -173,7 +173,7 @@ void EnTuboTrap_HandleImpact(EnTuboTrap* this, PlayState* play) {
Player* player = GET_PLAYER(play);
Player* player2 = GET_PLAYER(play);
- if ((this->actor.bgCheckFlags & 0x20) && (this->actor.depthInWater > 15.0f)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WATER) && (this->actor.depthInWater > 15.0f)) {
EnTuboTrap_SpawnEffectsInWater(this, play);
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EV_BOMB_DROP_WATER);
EnTuboTrap_DropCollectible(this, play);
@@ -214,7 +214,7 @@ void EnTuboTrap_HandleImpact(EnTuboTrap* this, PlayState* play) {
}
}
- if ((this->actor.bgCheckFlags & 8) || (this->actor.bgCheckFlags & 1)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) || (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
EnTuboTrap_SpawnEffectsOnLand(this, play);
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EV_POT_BROKEN);
EnTuboTrap_DropCollectible(this, play);
@@ -236,7 +236,7 @@ void EnTuboTrap_Idle(EnTuboTrap* this, PlayState* play) {
if ((startingRotation == 0) || (this->actor.playerHeightRel <= (startingRotation * 10.0f))) {
func_800BC154(play, &play->actorCtx, &this->actor, ACTORCAT_ENEMY);
currentHeight = this->actor.world.pos.y;
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_10); // always update and can target
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_10); // always update and can target
transformationHeight = sTransformationHeight[player->transformation];
@@ -246,18 +246,18 @@ void EnTuboTrap_Idle(EnTuboTrap* this, PlayState* play) {
this->targetHeight += transformationHeight;
}
this->originPos = this->actor.world.pos;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_POT_MOVE_START);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_POT_MOVE_START);
this->actionFunc = EnTuboTrap_Levitate;
}
}
}
void EnTuboTrap_Levitate(EnTuboTrap* this, PlayState* play) {
- this->actor.shape.rot.y += 5000;
+ this->actor.shape.rot.y += 0x1388;
Math_ApproachF(&this->actor.world.pos.y, this->targetHeight, 0.8f, 3.0f);
if (fabsf(this->actor.world.pos.y - this->targetHeight) < 10.0f) {
- this->actor.speedXZ = 10.0f;
+ this->actor.speed = 10.0f;
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
this->actionFunc = EnTuboTrap_FlyAtPlayer;
}
@@ -273,13 +273,13 @@ void EnTuboTrap_FlyAtPlayer(EnTuboTrap* this, PlayState* play) {
// But in MM, certain sfxIds got reordered and devs forgot to update:
// In MM, NA_SE_EN_MIZUBABA2_ATTACK is the old value 0x3837
// In MM, NA_SE_EN_TUBOOCK_FLY is the new value 0x3AE0
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_MIZUBABA2_ATTACK - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MIZUBABA2_ATTACK - SFX_FLAG);
if ((SQ(dX) + SQ(dY) + SQ(dZ) > SQ(240.0f))) {
Math_ApproachF(&this->actor.gravity, -3.0f, 0.2f, 0.5f);
}
- this->actor.shape.rot.y += 5000;
+ this->actor.shape.rot.y += 0x1388;
EnTuboTrap_HandleImpact(this, play);
}
@@ -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 5843357ee..93c494489 100644
--- a/src/overlays/actors/ovl_En_Twig/z_en_twig.c
+++ b/src/overlays/actors/ovl_En_Twig/z_en_twig.c
@@ -3,7 +3,6 @@
* Overlay: ovl_En_Twig
* Description: Beaver Race Ring
*/
-
#include "z_en_twig.h"
#include "objects/object_twig/object_twig.h"
@@ -37,9 +36,9 @@ ActorInit En_Twig_InitVars = {
(ActorFunc)EnTwig_Draw,
};
-static s32 sCurrentRing;
-static s16 sRingCount;
-static s16 sRingNotCollected[25];
+s32 sCurrentRing;
+s16 sRingCount;
+s16 sRingNotCollected[25];
static CollisionHeader* sColHeaders[] = {
NULL,
@@ -63,15 +62,16 @@ 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]);
}
- this->dyna.actor.bgCheckFlags |= 0x400;
+ this->dyna.actor.bgCheckFlags |= BGCHECKFLAG_PLAYER_400;
switch (this->unk_160) {
case 0:
Actor_Kill(&this->dyna.actor);
break;
+
case 1:
if (!sRingsHaveSpawned) {
sRingCount = CHECK_WEEKEVENTREG(WEEKEVENTREG_24_04) ? 25 : 20;
@@ -91,14 +91,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;
}
}
@@ -119,7 +123,7 @@ void func_80AC0A6C(EnTwig* this, PlayState* play) {
void func_80AC0A7C(EnTwig* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- Math_Vec3f_Copy(&this->unk_180, &player->bodyPartsPos[0]);
+ Math_Vec3f_Copy(&this->unk_180, &player->bodyPartsPos[PLAYER_BODYPART_WAIST]);
this->unk_178 = 0;
this->unk_17A = 0;
this->actionFunc = func_80AC0AC8;
@@ -142,30 +146,30 @@ void func_80AC0AC8(EnTwig* this, PlayState* play) {
SubS_ConstructPlane(&this->dyna.actor.world.pos, &D_80AC10D0, &this->dyna.actor.shape.rot, &sp4C);
if ((sCurrentRing == RACERING_GET_PARAM_FE0(&this->dyna.actor)) &&
Math3D_LineSegVsPlane(sp4C.normal.x, sp4C.normal.y, sp4C.normal.z, sp4C.originDist, &this->unk_180,
- &player->bodyPartsPos[0], &sp40, 0)) {
+ &player->bodyPartsPos[PLAYER_BODYPART_WAIST], &sp40, 0)) {
if (Math3D_Vec3fDistSq(&this->dyna.actor.world.pos, &sp40) <= SQ(this->dyna.actor.scale.x * 0.345f * 40.0f)) {
func_80AC0CC4(this, play);
return;
}
} else {
if (this->dyna.actor.xyzDistToPlayerSq <= SQ((this->dyna.actor.scale.x * 40.0f) + 40)) {
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ 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;
this->dyna.actor.world.rot.y = this->dyna.actor.yawTowardsPlayer;
}
}
- Math_Vec3f_Copy(&this->unk_180, &player->bodyPartsPos[0]);
+ Math_Vec3f_Copy(&this->unk_180, &player->bodyPartsPos[PLAYER_BODYPART_WAIST]);
}
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;
}
@@ -176,9 +180,12 @@ void func_80AC0D2C(EnTwig* this, PlayState* play) {
static Color_RGBA8 sColorYellow = { 255, 255, 0, 0 };
Player* player = GET_PLAYER(play);
- Math_SmoothStepToF(&this->dyna.actor.world.pos.x, player->bodyPartsPos[0].x, 0.5f, 100.0f, 0.01f);
- Math_SmoothStepToF(&this->dyna.actor.world.pos.y, player->bodyPartsPos[0].y, 0.5f, 100.0f, 0.01f);
- Math_SmoothStepToF(&this->dyna.actor.world.pos.z, player->bodyPartsPos[0].z, 0.5f, 100.0f, 0.01f);
+ Math_SmoothStepToF(&this->dyna.actor.world.pos.x, player->bodyPartsPos[PLAYER_BODYPART_WAIST].x, 0.5f, 100.0f,
+ 0.01f);
+ Math_SmoothStepToF(&this->dyna.actor.world.pos.y, player->bodyPartsPos[PLAYER_BODYPART_WAIST].y, 0.5f, 100.0f,
+ 0.01f);
+ Math_SmoothStepToF(&this->dyna.actor.world.pos.z, player->bodyPartsPos[PLAYER_BODYPART_WAIST].z, 0.5f, 100.0f,
+ 0.01f);
this->dyna.actor.shape.rot.z += (s16)this->unk_170;
this->dyna.actor.scale.x -= this->unk_174;
if (this->dyna.actor.scale.x < 0.0f) {
@@ -197,7 +204,7 @@ void func_80AC0D2C(EnTwig* this, PlayState* play) {
EffectSsKirakira_SpawnDispersed(play, &sp6C, &sKiraVel, &sKiraAccel, &sColorWhite, &sColorYellow, 1000,
(s32)(Rand_ZeroOne() * 10.0f) + 20);
}
- play_sound(NA_SE_SY_GET_ITEM);
+ Audio_PlaySfx(NA_SE_SY_GET_ITEM);
play->interfaceCtx.minigamePoints--;
sRingNotCollected[RACERING_GET_PARAM_FE0(&this->dyna.actor)] = true;
if (sCurrentRing == RACERING_GET_PARAM_FE0(&this->dyna.actor)) {
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..3221878e3 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);
@@ -77,9 +77,9 @@ void func_8089F014(EnViewer* this, PlayState* play, f32 arg2) {
arg2 = 0.0f;
}
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.lightBlendOverride = LIGHT_BLEND_OVERRIDE_FULL_CONTROL;
+ play->envCtx.lightSetting = this->actor.world.rot.x;
+ play->envCtx.prevLightSetting = this->actor.world.rot.z;
play->envCtx.lightBlend = arg2;
}
@@ -87,14 +87,14 @@ void func_8089F0A0(EnViewer* this, PlayState* play) {
Player* player = GET_PLAYER(play);
D_8089F3E4++;
- if ((D_8089F3E4 == D_8089F3E0) && (play->envCtx.lightSettingOverride != 255)) {
- play->envCtx.lightSettingOverride = 255;
- play->envCtx.unk_E0 = 0;
+ if ((D_8089F3E4 == D_8089F3E0) && (play->envCtx.lightSettingOverride != LIGHT_SETTING_OVERRIDE_NONE)) {
+ play->envCtx.lightSettingOverride = LIGHT_SETTING_OVERRIDE_NONE;
+ play->envCtx.lightBlendOverride = LIGHT_BLEND_OVERRIDE_NONE;
play->envCtx.lightBlend = 1.0f;
- func_800FAAB4(
+ Environment_ChangeLightSetting(
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 50109f887..1866a2381 100644
--- a/src/overlays/actors/ovl_En_Vm/z_en_vm.c
+++ b/src/overlays/actors/ovl_En_Vm/z_en_vm.c
@@ -9,7 +9,7 @@
#include "objects/gameplay_keep/gameplay_keep.h"
#include "objects/object_vm/object_vm.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_400)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_400)
#define THIS ((EnVm*)thisx)
@@ -167,8 +167,7 @@ void EnVm_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->actor, sInitChain);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 35.0f);
- SkelAnime_Init(play, &this->skelAnime, &object_vm_Skel_003F60, &object_vm_Anim_000068, this->jointTable,
- this->morphTable, 11);
+ SkelAnime_Init(play, &this->skelAnime, &gBeamosSkel, &gBeamosAnim, this->jointTable, this->morphTable, 11);
Collider_InitAndSetTris(play, &this->colliderTris, &this->actor, &sTrisInit, this->colliderTrisElements);
Collider_InitAndSetJntSph(play, &this->colliderJntSph, &this->actor, &sJntSphInit, this->colliderJntSphElements);
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
@@ -180,7 +179,7 @@ void EnVm_Init(Actor* thisx, PlayState* play) {
this->unk_21C = params * 40.0f;
thisx->params &= 0xFF;
- this->actor.bgCheckFlags |= 0x400;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_PLAYER_400;
if (!D_808CD5B8) {
for (i = 0; i < ARRAY_COUNT(D_808CD58C); i++) {
@@ -199,9 +198,9 @@ void EnVm_Destroy(Actor* thisx, PlayState* play) {
}
void func_808CC420(EnVm* this) {
- f32 lastFrame = Animation_GetLastFrame(&object_vm_Anim_000068);
+ f32 lastFrame = Animation_GetLastFrame(&gBeamosAnim);
- Animation_Change(&this->skelAnime, &object_vm_Anim_000068, 1.0f, lastFrame, lastFrame, ANIMMODE_ONCE, 0.0f);
+ Animation_Change(&this->skelAnime, &gBeamosAnim, 1.0f, lastFrame, lastFrame, ANIMMODE_ONCE, 0.0f);
this->actionFunc = func_808CC490;
}
@@ -212,7 +211,7 @@ void func_808CC490(EnVm* this, PlayState* play) {
Math_ApproachS(&this->unk_216, 0, 0xA, 0x5DC);
this->unk_218 -= 0x1F4;
- func_800B9010(&this->actor, NA_SE_EN_BIMOS_ROLL_HEAD - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_BIMOS_ROLL_HEAD - SFX_FLAG);
if (this->actor.xzDistToPlayer <= this->unk_21C) {
if ((this->actor.playerHeightRel <= 80.0f) && (this->actor.playerHeightRel >= -160.0f)) {
@@ -231,7 +230,7 @@ void func_808CC490(EnVm* this, PlayState* play) {
}
void func_808CC5C4(EnVm* this) {
- Animation_PlayLoopSetSpeed(&this->skelAnime, &object_vm_Anim_000068, 2.0f);
+ Animation_PlayLoopSetSpeed(&this->skelAnime, &gBeamosAnim, 2.0f);
this->unk_214 = 10;
this->actionFunc = func_808CC610;
}
@@ -265,8 +264,8 @@ void func_808CC610(EnVm* this, PlayState* play) {
}
void func_808CC788(EnVm* this) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BIMOS_AIM);
- Animation_Change(&this->skelAnime, &object_vm_Anim_000068, 3.0f, 3.0f, 7.0f, ANIMMODE_ONCE, 0.0f);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BIMOS_AIM);
+ Animation_Change(&this->skelAnime, &gBeamosAnim, 3.0f, 3.0f, 7.0f, ANIMMODE_ONCE, 0.0f);
this->unk_214 = 305;
this->unk_220 = 0.06f;
this->colliderTris.base.atFlags &= ~AT_HIT;
@@ -322,13 +321,13 @@ void func_808CC820(EnVm* this, PlayState* play) {
}
void func_808CCA10(EnVm* this) {
- Animation_Change(&this->skelAnime, &object_vm_Anim_000068, -1.0f, Animation_GetLastFrame(&object_vm_Anim_000068),
- 0.0f, ANIMMODE_ONCE, 0.0f);
+ Animation_Change(&this->skelAnime, &gBeamosAnim, -1.0f, Animation_GetLastFrame(&gBeamosAnim), 0.0f, ANIMMODE_ONCE,
+ 0.0f);
this->unk_214 = 100;
this->unk_210 = 0;
this->unk_224 = 0.0f;
this->unk_220 = 0.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
this->actionFunc = func_808CCAA4;
}
@@ -343,7 +342,7 @@ void func_808CCAA4(EnVm* this, PlayState* play) {
}
void func_808CCB08(EnVm* this) {
- Animation_PlayOnce(&this->skelAnime, &object_vm_Anim_000068);
+ Animation_PlayOnce(&this->skelAnime, &gBeamosAnim);
this->unk_214 = -1;
this->actionFunc = func_808CCB50;
}
@@ -365,10 +364,10 @@ void func_808CCB50(EnVm* this, PlayState* play) {
}
void func_808CCBE4(EnVm* this, PlayState* play) {
- Animation_Change(&this->skelAnime, &object_vm_Anim_000068, -1.0f, Animation_GetLastFrame(&object_vm_Anim_000068),
- 0.0f, ANIMMODE_ONCE, 0.0f);
+ Animation_Change(&this->skelAnime, &gBeamosAnim, -1.0f, Animation_GetLastFrame(&gBeamosAnim), 0.0f, ANIMMODE_ONCE,
+ 0.0f);
Enemy_StartFinishingBlow(play, &this->actor);
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 33);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 33);
this->unk_214 = 33;
this->unk_220 = 0.0f;
this->unk_224 = 0.0f;
@@ -376,7 +375,7 @@ void func_808CCBE4(EnVm* this, PlayState* play) {
this->actor.world.pos.y = this->actor.focus.pos.y;
this->actor.velocity.y = 8.0f;
this->actor.gravity = -0.5f;
- this->actor.speedXZ = Rand_ZeroOne() + 1.0f;
+ this->actor.speed = Rand_ZeroOne() + 1.0f;
this->unk_210 = 0;
this->actor.flags |= ACTOR_FLAG_10;
this->actionFunc = func_808CCCF0;
@@ -386,12 +385,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;
@@ -440,11 +441,11 @@ void EnVm_Update(Actor* thisx, PlayState* play) {
if ((play->gameplayFrames % 2) != 0) {
func_800BBFB0(play, &this->unk_234, 6.0f, 1, 120, 20, 1);
}
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BIMOS_LAZER_GND - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_BIMOS_LAZER_GND - SFX_FLAG);
}
if (this->unk_224 > 0.0f) {
- func_800B9010(&this->actor, NA_SE_EN_BIMOS_LAZER - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_BIMOS_LAZER - SFX_FLAG);
}
this->actionFunc(this, play);
@@ -460,10 +461,10 @@ void EnVm_Update(Actor* thisx, PlayState* play) {
s32 EnVm_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnVm* this = THIS;
- if (limbIndex == OBJECT_VM_LIMB_02) {
+ if (limbIndex == BEAMOS_LIMB_HEAD_ROOT) {
rot->x += this->unk_216;
rot->y += this->unk_218;
- } else if ((limbIndex == OBJECT_VM_LIMB_0A) && (this->actionFunc == func_808CCCF0)) {
+ } else if ((limbIndex == BEAMOS_LIMB_BODY) && (this->actionFunc == func_808CCCF0)) {
*dList = NULL;
}
return false;
@@ -479,7 +480,7 @@ void EnVm_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
Collider_UpdateSpheres(limbIndex, &this->colliderJntSph);
- if (limbIndex == OBJECT_VM_LIMB_02) {
+ if (limbIndex == BEAMOS_LIMB_HEAD_ROOT) {
sp4C = NULL;
Matrix_MultZero(&this->actor.focus.pos);
@@ -512,7 +513,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 +523,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);
@@ -547,7 +548,7 @@ void EnVm_Draw(Actor* thisx, PlayState* play) {
Matrix_Scale(this->unk_220, this->unk_220, this->unk_224 * 0.0015f, MTXMODE_APPLY);
gSPMatrix(&gfx[1], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(&gfx[2], object_vm_DL_002728);
+ gSPDisplayList(&gfx[2], gBeamosLaserDL);
POLY_OPA_DISP = &gfx[3];
}
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 74bd4fec6..ca614643f 100644
--- a/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c
+++ b/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c
@@ -5,10 +5,11 @@
*/
#include "z_en_wallmas.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "overlays/actors/ovl_En_Encount1/z_en_encount1.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_400)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_400)
#define THIS ((EnWallmas*)thisx)
@@ -128,15 +129,12 @@ static InitChainEntry sInitChain[] = {
ICHAIN_F32_DIV1000(gravity, -1500, ICHAIN_STOP),
};
-static f32 sYOffsetPerForm[] = { 50.0f, 55.0f, 50.0f, 20.0f, 30.0f };
-
-/**
- * This maps a given limb based on its limbIndex to its appropriate index
- * in the limbPos array. An index of -1 indicates that the limb is not part
- * of the limbPos array.
- */
-static s8 sLimbIndexToLimbPosIndex[] = {
- -1, -1, -1, -1, 0, -1, -1, 1, -1, 2, -1, -1, 3, -1, 4, -1, -1, 5, -1, -1, -1, 6, 7, -1, 8,
+static f32 sYOffsetPerForm[PLAYER_FORM_MAX] = {
+ 50.0f, // PLAYER_FORM_FIERCE_DEITY
+ 55.0f, // PLAYER_FORM_GORON
+ 50.0f, // PLAYER_FORM_ZORA
+ 20.0f, // PLAYER_FORM_DEKU
+ 30.0f, // PLAYER_FORM_HUMAN
};
void EnWallmas_Init(Actor* thisx, PlayState* play) {
@@ -191,8 +189,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--;
}
}
}
@@ -200,12 +198,12 @@ void EnWallmas_Destroy(Actor* thisx, PlayState* play) {
void EnWallmas_Freeze(EnWallmas* this) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX;
this->drawDmgEffScale = 0.55f;
- this->drawDmgEffFrozenSteamScale = 0.82500005f;
+ this->drawDmgEffFrozenSteamScale = 825.0f * 0.001f;
this->drawDmgEffAlpha = 1.0f;
this->collider.base.colType = 3;
this->timer = 80;
this->actor.flags &= ~ACTOR_FLAG_400;
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 80);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 80);
}
void EnWallmas_ThawIfFrozen(EnWallmas* this, PlayState* play) {
@@ -213,7 +211,7 @@ void EnWallmas_ThawIfFrozen(EnWallmas* this, PlayState* play) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->collider.base.colType = 0;
this->drawDmgEffAlpha = 0.0f;
- Actor_SpawnIceEffects(play, &this->actor, this->limbPos, 11, 2, 0.3f, 0.2f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, WALLMASTER_BODYPART_MAX, 2, 0.3f, 0.2f);
this->actor.flags |= ACTOR_FLAG_400;
}
}
@@ -221,7 +219,7 @@ void EnWallmas_ThawIfFrozen(EnWallmas* this, PlayState* play) {
void EnWallmas_TimerInit(EnWallmas* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actor.flags |= ACTOR_FLAG_20;
this->timer = 130;
this->actor.velocity.y = 0.0f;
@@ -245,7 +243,7 @@ void EnWallmas_WaitToDrop(EnWallmas* this, PlayState* play) {
if ((player->stateFlags1 & (PLAYER_STATE1_100000 | PLAYER_STATE1_8000000)) ||
(player->stateFlags2 & PLAYER_STATE2_80) || (player->unk_B5E > 0) || (player->actor.freezeTimer > 0) ||
- !(player->actor.bgCheckFlags & 1) ||
+ !(player->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
((WALLMASTER_GET_TYPE(&this->actor) == WALLMASTER_TYPE_PROXIMITY) &&
(Math_Vec3f_DistXZ(&this->actor.home.pos, playerPos) > (120.f + this->detectionRadius)))) {
AudioSfx_StopById(NA_SE_EN_FALL_AIM);
@@ -253,7 +251,7 @@ void EnWallmas_WaitToDrop(EnWallmas* this, PlayState* play) {
}
if (this->timer == 80) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FALL_AIM);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FALL_AIM);
}
if (this->timer == 0) {
@@ -272,7 +270,7 @@ void EnWallmas_SetupDrop(EnWallmas* this, PlayState* play) {
this->actor.shape.rot.y = player->actor.shape.rot.y + 0x8000;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actor.floorHeight = player->actor.floorHeight;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actor.flags &= ~ACTOR_FLAG_20;
this->actionFunc = EnWallmas_Drop;
}
@@ -298,7 +296,7 @@ void EnWallmas_SetupLand(EnWallmas* this, PlayState* play) {
ANIMMODE_ONCE, -3.0f);
Actor_SpawnFloorDustRing(play, &this->actor, &this->actor.world.pos, 15.0f, 6, 20.0f, 300, 100, true);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FALL_LAND);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FALL_LAND);
this->actionFunc = EnWallmas_Land;
}
@@ -324,7 +322,7 @@ void EnWallmas_Stand(EnWallmas* this, PlayState* play) {
void EnWallmas_SetupWalk(EnWallmas* this) {
Animation_PlayOnceSetSpeed(&this->skelAnime, &gWallmasterWalkAnim, 3.0f);
- this->actor.speedXZ = 3.0f;
+ this->actor.speed = 3.0f;
this->actionFunc = EnWallmas_Walk;
}
@@ -337,13 +335,13 @@ void EnWallmas_Walk(EnWallmas* this, PlayState* play) {
this->actor.world.rot.y = this->actor.shape.rot.y;
if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 12.0f) ||
Animation_OnFrame(&this->skelAnime, 24.0f) || Animation_OnFrame(&this->skelAnime, 36.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FALL_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FALL_WALK);
}
}
void EnWallmas_SetupJumpToCeiling(EnWallmas* this) {
Animation_PlayOnce(&this->skelAnime, &gWallmasterStopWalkAnim);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = EnWallmas_JumpToCeiling;
}
@@ -355,7 +353,7 @@ void EnWallmas_JumpToCeiling(EnWallmas* this, PlayState* play) {
void EnWallmas_SetupReturnToCeiling(EnWallmas* this) {
this->timer = 0;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
Animation_Change(&this->skelAnime, &gWallmasterJumpAnim, 3.0f, 0.0f, Animation_GetLastFrame(&gWallmasterJumpAnim),
ANIMMODE_ONCE, -3.0f);
this->actionFunc = EnWallmas_ReturnToCeiling;
@@ -372,7 +370,7 @@ void EnWallmas_ReturnToCeiling(EnWallmas* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, 20.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FALL_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FALL_UP);
}
if (this->actor.playerHeightRel < -900.0f) {
@@ -397,8 +395,8 @@ void EnWallmas_SetupDamage(EnWallmas* this, s32 arg1) {
func_800BE504(&this->actor, &this->collider);
}
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 20);
- this->actor.speedXZ = 5.0f;
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 20);
+ this->actor.speed = 5.0f;
this->actor.velocity.y = 10.0f;
this->actionFunc = EnWallmas_Damage;
}
@@ -413,15 +411,15 @@ void EnWallmas_Damage(EnWallmas* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, 13.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EYEGOLE_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_ATTACK);
}
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.2f);
+ Math_StepToF(&this->actor.speed, 0.0f, 0.2f);
}
void EnWallmas_SetupCooldown(EnWallmas* this) {
Animation_PlayOnce(&this->skelAnime, &gWallmasterRecoverFromDamageAnim);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.velocity.y = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = EnWallmas_Cooldown;
@@ -434,7 +432,7 @@ void EnWallmas_Cooldown(EnWallmas* this, PlayState* play) {
}
void EnWallmas_SetupDie(EnWallmas* this, PlayState* play) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.velocity.y = 0.0f;
func_800B3030(play, &this->actor.world.pos, &gZeroVec3f, &gZeroVec3f, 250, -10, 2);
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 11, NA_SE_EN_EXTINCT);
@@ -456,7 +454,7 @@ void EnWallmas_SetupTakePlayer(EnWallmas* this, PlayState* play) {
Animation_MorphToPlayOnce(&this->skelAnime, &gWallmasterHoverAnim, -5.0f);
this->timer = -30;
this->actionFunc = EnWallmas_TakePlayer;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.velocity.y = 0.0f;
this->yTarget = this->actor.playerHeightRel;
func_800B724C(play, &this->actor, PLAYER_CSMODE_18);
@@ -466,8 +464,8 @@ void EnWallmas_TakePlayer(EnWallmas* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (Animation_OnFrame(&this->skelAnime, 1.0f)) {
- func_800B8E58(player, player->ageProperties->voiceSfxIdOffset + NA_SE_VO_LI_DAMAGE_S);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FALL_CATCH);
+ Player_PlaySfx(player, player->ageProperties->voiceSfxIdOffset + NA_SE_VO_LI_DAMAGE_S);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FALL_CATCH);
}
if (SkelAnime_Update(&this->skelAnime)) {
@@ -482,11 +480,11 @@ void EnWallmas_TakePlayer(EnWallmas* this, PlayState* play) {
player->actor.world.pos.y = this->actor.world.pos.y - sYOffsetPerForm[GET_PLAYER_FORM];
if (this->timer == -30) {
- func_800B8E58(player, player->ageProperties->voiceSfxIdOffset + NA_SE_VO_LI_TAKEN_AWAY);
+ Player_PlaySfx(player, player->ageProperties->voiceSfxIdOffset + NA_SE_VO_LI_TAKEN_AWAY);
}
if (this->timer == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FALL_UP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FALL_UP);
}
this->timer += 2;
@@ -498,7 +496,7 @@ void EnWallmas_TakePlayer(EnWallmas* this, PlayState* play) {
Math_StepToF(&this->actor.world.pos.z, player->actor.world.pos.z, 3.0f);
if (this->timer == 30) {
- play_sound(NA_SE_OC_ABYSS);
+ Audio_PlaySfx(NA_SE_OC_ABYSS);
func_80169FDC(&play->state);
}
}
@@ -506,7 +504,7 @@ void EnWallmas_TakePlayer(EnWallmas* this, PlayState* play) {
void EnWallmas_ProximityOrSwitchInit(EnWallmas* this) {
this->timer = 0;
this->actor.draw = NULL;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
if (WALLMASTER_GET_TYPE(&this->actor) == WALLMASTER_TYPE_PROXIMITY) {
this->actionFunc = EnWallmas_WaitForProximity;
} else {
@@ -530,7 +528,7 @@ void EnWallmas_WaitForSwitchFlag(EnWallmas* this, PlayState* play) {
}
void EnWallmas_SetupStun(EnWallmas* this) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->actor.velocity.y > 0.0f) {
this->actor.velocity.y = 0.0f;
}
@@ -564,10 +562,10 @@ void EnWallmas_UpdateDamage(EnWallmas* this, PlayState* play) {
(!(this->collider.info.acHitInfo->toucher.dmgFlags & 0xDB0B3))) {
if (Actor_ApplyDamage(&this->actor) == 0) {
Enemy_StartFinishingBlow(play, &this->actor);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DAIOCTA_REVERSE);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_DAIOCTA_REVERSE);
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
} else if (this->actor.colChkInfo.damage != 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FALL_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_FALL_DAMAGE);
}
EnWallmas_ThawIfFrozen(this, play);
@@ -583,13 +581,13 @@ void EnWallmas_UpdateDamage(EnWallmas* this, PlayState* play) {
EnWallmas_SetupStun(this);
} else if (this->actor.colChkInfo.damageEffect == WALLMASTER_DMGEFF_STUN) {
this->timer = 40;
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 40);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
EnWallmas_SetupStun(this);
} else if (this->actor.colChkInfo.damageEffect == WALLMASTER_DMGEFF_ZORA_MAGIC) {
this->timer = 40;
- Actor_SetColorFilter(&this->actor, 0, 255, 0, 40);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
this->drawDmgEffScale = 0.55f;
this->drawDmgEffAlpha = 2.0f;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_MEDIUM;
@@ -605,7 +603,7 @@ void EnWallmas_UpdateDamage(EnWallmas* this, PlayState* play) {
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);
+ CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
}
EnWallmas_SetupDamage(this, true);
@@ -629,13 +627,15 @@ 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)) {
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- if ((this->actionFunc != EnWallmas_Damage) && (this->actor.bgCheckFlags & 1) &&
+ if ((this->actionFunc != EnWallmas_Damage) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
(this->actor.freezeTimer == 0)) {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
}
@@ -648,8 +648,8 @@ void EnWallmas_Update(Actor* thisx, PlayState* play) {
Math_StepToF(&this->drawDmgEffAlpha, 0.0f, 0.05f);
this->drawDmgEffScale = (this->drawDmgEffAlpha + 1.0f) * 0.275f;
this->drawDmgEffScale = CLAMP_MAX(this->drawDmgEffScale, 0.55f);
- } else if (Math_StepToF(&this->drawDmgEffFrozenSteamScale, 0.55f, 0.01375f) == 0) {
- func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ } else if (!Math_StepToF(&this->drawDmgEffFrozenSteamScale, 0.55f, 0.01375f)) {
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
}
}
@@ -666,7 +666,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);
@@ -703,17 +703,49 @@ s32 EnWallmas_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3
return false;
}
+/**
+ * This maps a given limb based on its limbIndex to its appropriate index
+ * in the bodyPartsPos array.
+ */
+static s8 sLimbToBodyParts[WALLMASTER_LIMB_MAX] = {
+ BODYPART_NONE, // WALLMASTER_LIMB_NONE
+ BODYPART_NONE, // WALLMASTER_LIMB_ROOT
+ BODYPART_NONE, // WALLMASTER_LIMB_HAND
+ BODYPART_NONE, // WALLMASTER_LIMB_INDEX_FINGER_ROOT
+ WALLMASTER_BODYPART_0, // WALLMASTER_LIMB_INDEX_FINGER_PROXIMAL
+ BODYPART_NONE, // WALLMASTER_LIMB_INDEX_FINGER_DISTAL_ROOT
+ BODYPART_NONE, // WALLMASTER_LIMB_INDEX_FINGER_MIDDLE
+ WALLMASTER_BODYPART_1, // WALLMASTER_LIMB_INDEX_FINGER_DISTAL
+ BODYPART_NONE, // WALLMASTER_LIMB_RING_FINGER_ROOT
+ WALLMASTER_BODYPART_2, // WALLMASTER_LIMB_RING_FINGER_PROXIMAL
+ BODYPART_NONE, // WALLMASTER_LIMB_RING_FINGER_DISTAL_ROOT
+ BODYPART_NONE, // WALLMASTER_LIMB_RING_FINGER_MIDDLE
+ WALLMASTER_BODYPART_3, // WALLMASTER_LIMB_RING_FINGER_DISTAL
+ BODYPART_NONE, // WALLMASTER_LIMB_MIDDLE_FINGER_ROOT
+ WALLMASTER_BODYPART_4, // WALLMASTER_LIMB_MIDDLE_FINGER_PROXIMAL
+ BODYPART_NONE, // WALLMASTER_LIMB_MIDDLE_FINGER_DISTAL_ROOT
+ BODYPART_NONE, // WALLMASTER_LIMB_MIDDLE_FINGER_MIDDLE
+ WALLMASTER_BODYPART_5, // WALLMASTER_LIMB_MIDDLE_FINGER_DISTAL
+ BODYPART_NONE, // WALLMASTER_LIMB_WRIST_ROOT
+ BODYPART_NONE, // WALLMASTER_LIMB_WRIST
+ BODYPART_NONE, // WALLMASTER_LIMB_THUMB_ROOT
+ WALLMASTER_BODYPART_6, // WALLMASTER_LIMB_THUMB_PROXIMAL
+ WALLMASTER_BODYPART_7, // WALLMASTER_LIMB_THUMB_DISTAL_ROOT
+ BODYPART_NONE, // WALLMASTER_LIMB_THUMB_MIDDLE
+ WALLMASTER_BODYPART_8, // WALLMASTER_LIMB_THUMB_DISTAL
+};
+
void EnWallmas_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnWallmas* this = THIS;
Gfx* gfx;
- if (sLimbIndexToLimbPosIndex[limbIndex] != -1) {
- Matrix_MultZero(&this->limbPos[sLimbIndexToLimbPosIndex[limbIndex]]);
+ if (sLimbToBodyParts[limbIndex] != BODYPART_NONE) {
+ Matrix_MultZero(&this->bodyPartsPos[sLimbToBodyParts[limbIndex]]);
}
if (limbIndex == WALLMASTER_LIMB_WRIST) {
- Matrix_MultVecX(1000.0f, &this->limbPos[9]);
- Matrix_MultVecX(-1000.0f, &this->limbPos[10]);
+ Matrix_MultVecX(1000.0f, &this->bodyPartsPos[WALLMASTER_BODYPART_9]);
+ Matrix_MultVecX(-1000.0f, &this->bodyPartsPos[WALLMASTER_BODYPART_10]);
} else if (limbIndex == WALLMASTER_LIMB_HAND) {
OPEN_DISPS(play->state.gfxCtx);
@@ -740,10 +772,10 @@ 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,
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, WALLMASTER_BODYPART_MAX, this->drawDmgEffScale,
this->drawDmgEffFrozenSteamScale, this->drawDmgEffAlpha, this->drawDmgEffType);
}
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..383d6d4ca 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,15 +27,30 @@
* 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;
typedef void (*EnWallmasActionFunc)(struct EnWallmas*, PlayState*);
+typedef enum WallmasterBodyPart {
+ /* 0 */ WALLMASTER_BODYPART_0,
+ /* 1 */ WALLMASTER_BODYPART_1,
+ /* 2 */ WALLMASTER_BODYPART_2,
+ /* 3 */ WALLMASTER_BODYPART_3,
+ /* 4 */ WALLMASTER_BODYPART_4,
+ /* 5 */ WALLMASTER_BODYPART_5,
+ /* 6 */ WALLMASTER_BODYPART_6,
+ /* 7 */ WALLMASTER_BODYPART_7,
+ /* 8 */ WALLMASTER_BODYPART_8,
+ /* 9 */ WALLMASTER_BODYPART_9,
+ /* 10 */ WALLMASTER_BODYPART_10,
+ /* 11 */ WALLMASTER_BODYPART_MAX
+} WallmasterBodyPart;
+
typedef struct EnWallmas {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
@@ -48,7 +65,7 @@ typedef struct EnWallmas {
/* 0x2C8 */ f32 drawDmgEffAlpha;
/* 0x2CC */ f32 drawDmgEffScale;
/* 0x2D0 */ f32 drawDmgEffFrozenSteamScale;
- /* 0x2D4 */ Vec3f limbPos[11];
+ /* 0x2D4 */ Vec3f bodyPartsPos[WALLMASTER_BODYPART_MAX];
/* 0x358 */ ColliderCylinder collider;
} EnWallmas; // size = 0x3A4
diff --git a/src/overlays/actors/ovl_En_Warp_Uzu/z_en_warp_uzu.c b/src/overlays/actors/ovl_En_Warp_Uzu/z_en_warp_uzu.c
index 32038c411..b5603e613 100644
--- a/src/overlays/actors/ovl_En_Warp_Uzu/z_en_warp_uzu.c
+++ b/src/overlays/actors/ovl_En_Warp_Uzu/z_en_warp_uzu.c
@@ -7,7 +7,7 @@
#include "z_en_warp_uzu.h"
#include "objects/object_warp_uzu/object_warp_uzu.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnWarpUzu*)thisx)
@@ -65,7 +65,7 @@ void EnWarpUzu_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->actor, sInitChain);
Collider_InitAndSetCylinder(play, &this->collider, thisx, &sCylinderInit);
- thisx->targetMode = 0;
+ thisx->targetMode = TARGET_MODE_0;
func_80A66208(this, play);
}
@@ -98,12 +98,12 @@ void func_80A66278(EnWarpUzu* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
func_80A66384(this, play);
} else {
- phi_a0 = ABS((s16)(Actor_YawBetweenActors(&this->actor, &player->actor) - this->actor.shape.rot.y));
+ phi_a0 = ABS((s16)(Actor_WorldYawTowardActor(&this->actor, &player->actor) - this->actor.shape.rot.y));
temp_v0 = player->actor.shape.rot.y - this->actor.shape.rot.y;
phi_v1 = ABS(temp_v0);
if (phi_a0 >= 0x2AAB) {
if (phi_v1 < 0x238E) {
- func_800B8614(&this->actor, play, 70.0f);
+ Actor_OfferTalk(&this->actor, play, 70.0f);
}
}
}
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 ef1ae15bc..4ae591302 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
@@ -8,7 +8,7 @@
#include "z_en_warp_tag.h"
#include "objects/gameplay_dangeon_keep/gameplay_dangeon_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_10 | ACTOR_FLAG_2000000 | ACTOR_FLAG_8000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_10 | ACTOR_FLAG_2000000 | ACTOR_FLAG_CANT_LOCK_ON)
#define THIS ((EnWarptag*)thisx)
@@ -37,8 +37,10 @@ ActorInit En_Warp_tag_InitVars = {
};
// this appears to be unused, as the code never accesses it in known vanilla cases
-// these unknown values get passed to a unknown z_message function
-u8 D_809C1000[] = { 0x28, 0x29, 0x2A, 0x2B, 0x2D, 0x2C, 0, 0 };
+u8 D_809C1000[] = {
+ OCARINA_ACTION_CHECK_TIME, OCARINA_ACTION_CHECK_HEALING, OCARINA_ACTION_CHECK_EPONAS,
+ OCARINA_ACTION_CHECK_SOARING, OCARINA_ACTION_CHECK_SUNS, OCARINA_ACTION_CHECK_STORMS,
+};
static InitChainEntry sInitChain[] = {
ICHAIN_VEC3F(scale, 1, ICHAIN_CONTINUE),
@@ -52,13 +54,13 @@ void EnWarptag_Init(Actor* thisx, PlayState* play) {
Actor_SetFocus(&this->dyna.actor, 0.0f);
if (WARPTAG_GET_3C0_MAX(thisx) == WARPTAG_3C0_MAX) {
- this->dyna.actor.flags &= ~ACTOR_FLAG_1;
+ this->dyna.actor.flags &= ~ACTOR_FLAG_TARGETABLE;
if (WARPTAG_GET_INVISIBLE(&this->dyna.actor)) {
this->actionFunc = EnWarpTag_WaitForPlayer;
} else {
- if ((this->dangeonKeepObject = Object_GetIndex(&play->objectCtx, GAMEPLAY_DANGEON_KEEP)) < 0) {
+ if ((this->dangeonKeepObject = Object_GetSlot(&play->objectCtx, GAMEPLAY_DANGEON_KEEP)) < 0) {
Actor_Kill(&this->dyna.actor);
}
@@ -113,7 +115,7 @@ void EnWarpTag_Unused809C09A0(EnWarptag* this, PlayState* play) {
// and I doubt its set externally by another actor, so I believe this is unused
// might be a bug, they might have meant to set actor flag (0x2000 0000) up above but mistyped (0x200 0000)
// also WARPTAG_GET_3C0 should always return 2C0 -> 0xF for all known in-game uses, which is OOB
- func_80152434(play, D_809C1000[WARPTAG_GET_3C0(&this->dyna.actor)]); // unk message function
+ Message_DisplayOcarinaStaff(play, D_809C1000[WARPTAG_GET_3C0(&this->dyna.actor)]);
this->actionFunc = EnWarpTag_Unused809C0A20;
} else {
@@ -125,13 +127,13 @@ void EnWarpTag_Unused809C09A0(EnWarptag* this, PlayState* play) {
* Unused ActionFunc: assigned by EnWarpTag_Unused809C09A0, no known variants use.
*/
void EnWarpTag_Unused809C0A20(EnWarptag* this, PlayState* play) {
- if (play->msgCtx.ocarinaMode == 9) {
- func_800B7298(play, NULL, PLAYER_CSMODE_7);
+ if (play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_STORMS) {
+ 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;
+ } else if (play->msgCtx.ocarinaMode >= OCARINA_MODE_WARP) {
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
this->actionFunc = EnWarpTag_Unused809C09A0;
}
}
@@ -141,7 +143,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,14 +151,14 @@ 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);
- func_800B8E58(player, NA_SE_PL_WARP_PLATE);
+ 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 +210,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, RESPAWN_MODE_DOWN, 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 +233,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);
}
}
@@ -244,9 +245,8 @@ void EnWarpTag_GrottoReturn(EnWarptag* this, PlayState* play) {
play->nextEntrance = play->setupExitList[WARPTAG_GET_EXIT_INDEX(&this->dyna.actor)];
Scene_SetExitFade(play);
play->transitionTrigger = TRANS_TRIGGER_START;
- func_8019F128(NA_SE_OC_SECRET_HOLE_OUT);
+ Audio_PlaySfx_2(NA_SE_OC_SECRET_HOLE_OUT);
func_801A4058(5);
- if (1) {}
gSaveContext.seqId = (u8)NA_BGM_DISABLED;
gSaveContext.ambienceId = AMBIENCE_ID_DISABLED;
}
@@ -263,7 +263,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 983104001..bc960b96b 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
@@ -13,10 +13,11 @@
*/
#include "z_en_water_effect.h"
+#include "overlays/actors/ovl_Bg_Ikana_Rotaryroom/z_bg_ikana_rotaryroom.h"
#include "objects/object_water_effect/object_water_effect.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((EnWaterEffect*)thisx)
@@ -90,7 +91,7 @@ void EnWaterEffect_Init(Actor* thisx, PlayState* play) {
s32 pad;
EnWaterEffect* this = THIS;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->unk_DC4 = Rand_ZeroFloat(100.0f);
if (this->actor.params == ENWATEREFFECT_TYPE_FALLING_ROCK_SPAWNER) {
@@ -158,10 +159,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 +290,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 +327,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 +368,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;
@@ -414,16 +415,16 @@ void func_80A59C04(Actor* thisx, PlayState* play2) {
this->unk_DC6--;
}
- if ((rotaryRoom != NULL) && Flags_GetSwitch(play, (rotaryRoom->params >> 1) & 0x7F)) {
+ if ((rotaryRoom != NULL) && Flags_GetSwitch(play, BGIKANAROTARYROOM_GET_SWITCH_FLAG_1(rotaryRoom))) {
this->unk_DC6 = Rand_ZeroFloat(150.0f) + 100.0f;
} else if (!Play_InCsMode(play)) {
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);
}
}
@@ -482,7 +483,7 @@ void func_80A59C04(Actor* thisx, PlayState* play2) {
player->flameTimers[j] = Rand_S16Offset(0, 200);
}
player->isBurning = true;
- func_800B8E58(player, player->ageProperties->voiceSfxIdOffset + NA_SE_VO_LI_DEMO_DAMAGE);
+ Player_PlaySfx(player, player->ageProperties->voiceSfxIdOffset + NA_SE_VO_LI_DEMO_DAMAGE);
}
}
@@ -524,8 +525,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 +624,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 +635,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 +647,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 +662,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 +675,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 +685,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_Wdhand/z_en_wdhand.c b/src/overlays/actors/ovl_En_Wdhand/z_en_wdhand.c
index 83cf47291..221ff557c 100644
--- a/src/overlays/actors/ovl_En_Wdhand/z_en_wdhand.c
+++ b/src/overlays/actors/ovl_En_Wdhand/z_en_wdhand.c
@@ -6,7 +6,7 @@
#include "z_en_wdhand.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY)
#define THIS ((EnWdhand*)thisx)
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 7ddd539e7..3aa4360f9 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
@@ -47,12 +47,6 @@ ActorInit En_Weather_Tag_InitVars = {
(ActorFunc)EnWeatherTag_Draw,
};
-extern f32 D_801F4E74;
-extern u8 D_801BDBB8;
-extern u8 D_801BDBB4;
-extern u8 D_801F4E30;
-extern s16 D_801F4E7A;
-
void EnWeatherTag_SetupAction(EnWeatherTag* this, EnWeatherTagActionFunc func) {
this->actionFunc = func;
}
@@ -67,7 +61,7 @@ void EnWeatherTag_Init(Actor* thisx, PlayState* play) {
s32 pathID;
// flag: is targetable. Should do nothing as not set by default above
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
switch (WEATHER_TAG_TYPE(&this->actor)) {
case WEATHERTAG_TYPE_UNK0:
@@ -76,30 +70,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:
- if (0) {} // this can move to diff locations and still match
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 = 3;
- play->envCtx.unk_1F = 5;
- play->envCtx.unk_20 = 5;
+ play->skyboxId = SKYBOX_3;
+ 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];
@@ -107,32 +106,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_XZDistanceBetweenActors(&player->actor, &this->actor)) {
- if (play->envCtx.unk_1F == play->envCtx.unk_20) {
- D_801BDBB8 = 1;
- if (!(play->envCtx.unk_1E == 0) || ((play->envCtx.unk_1F != 1) && (play->envCtx.unk_21 == 0))) {
+ if (WEATHER_TAG_RANGE100(&this->actor) > Actor_WorldDistXZToActor(&player->actor, &this->actor)) {
+ if (play->envCtx.lightConfig == play->envCtx.changeLightNextConfig) {
+ gInterruptSongOfStorms = true;
+ if (!(play->envCtx.lightMode == LIGHT_MODE_TIME) ||
+ ((play->envCtx.lightConfig != 1) && !play->envCtx.changeLightEnabled)) {
- D_801BDBB8 = 0;
+ gInterruptSongOfStorms = false;
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;
+ gLightConfigAfterUnderwater = changeLightNextConfig;
+ play->envCtx.changeDuration = changeDuration;
+ play->envCtx.changeLightTimer = play->envCtx.changeDuration;
}
returnVal = 1;
}
@@ -143,23 +148,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_XZDistanceBetweenActors(&player->actor, &this->actor)) {
- if (play->envCtx.unk_1F == play->envCtx.unk_20) {
- D_801BDBB8 = 1;
- if (!(play->envCtx.unk_1E == 0) || ((play->envCtx.unk_1F != 1) && (play->envCtx.unk_21 == 0))) {
+ if (WEATHER_TAG_RANGE100(&this->actor) < Actor_WorldDistXZToActor(&player->actor, &this->actor)) {
+ if (play->envCtx.lightConfig == play->envCtx.changeLightNextConfig) {
+ gInterruptSongOfStorms = true;
+ if (!(play->envCtx.lightMode == LIGHT_MODE_TIME) ||
+ ((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;
+ gInterruptSongOfStorms = false;
+ gWeatherMode = WEATHER_MODE_CLEAR;
+ play->envCtx.changeLightEnabled = true;
+ play->envCtx.lightConfig = lightConfig;
+ play->envCtx.changeLightNextConfig = changeLightNextConfig;
+ gLightConfigAfterUnderwater = changeLightNextConfig;
+ play->envCtx.changeDuration = changeDuration;
+ play->envCtx.changeLightTimer = play->envCtx.changeDuration;
returnVal = 1;
}
}
@@ -173,7 +180,7 @@ void func_8096689C(EnWeatherTag* this, PlayState* play) {
f32 distance;
f32 partialResult;
- distance = Actor_XZDistanceBetweenActors(&player->actor, &this->actor);
+ distance = Actor_WorldDistXZToActor(&player->actor, &this->actor);
if (this->fadeDistance < distance) {
distance = this->fadeDistance;
}
@@ -188,11 +195,11 @@ void func_8096689C(EnWeatherTag* this, PlayState* play) {
play->envCtx.windSpeed = (this->actor.world.rot.z * partialResult) + 30.0f;
if (partialResult > 0.01f) {
- play->envCtx.sandstormState = 8;
+ play->envCtx.sandstormState = SANDSTORM_8;
D_801F4E30 = 0x9B;
- } else if (play->envCtx.sandstormState == 8) {
+ } else if (play->envCtx.sandstormState == SANDSTORM_8) {
D_801F4E30 = 0;
- play->envCtx.sandstormState = 9;
+ play->envCtx.sandstormState = SANDSTORM_9;
}
}
@@ -230,11 +237,11 @@ 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)) {
- play->skyboxId = 3;
+ if (func_80966608(this, play, 0, 0, play->envCtx.lightConfig, 5, 100, 2) || (gWeatherMode == WEATHER_MODE_2)) {
+ play->skyboxId = SKYBOX_3;
EnWeatherTag_SetupAction(this, func_80966D20);
} else if (D_801F4E74 <= 0.01f) {
- play->skyboxId = 1;
+ play->skyboxId = SKYBOX_NORMAL_SKY;
} else {
Math_SmoothStepToF(&D_801F4E74, 0.0f, 0.2f, 0.02f, 0.001f);
}
@@ -243,33 +250,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;
}
}
}
@@ -285,9 +294,11 @@ void func_80966D20(EnWeatherTag* this, PlayState* play) {
default:
newUnk20 = 0;
break;
+
case 2:
newUnk20 = 3;
break;
+
case 3:
newUnk20 = 4;
break;
@@ -298,7 +309,7 @@ void func_80966D20(EnWeatherTag* this, PlayState* play) {
EnWeatherTag_SetupAction(this, func_80966B08);
}
- if (gWeatherMode != 2) {
+ if (gWeatherMode != WEATHER_MODE_2) {
EnWeatherTag_SetupAction(this, func_80966B08);
}
}
@@ -308,7 +319,7 @@ void func_80966D20(EnWeatherTag* this, PlayState* play) {
// path to goron village winter, winter mountain village
void func_80966E0C(EnWeatherTag* this, PlayState* play) {
if (func_80966608(this, play, 0, 1, 0, 2, 60, 3)) {
- play->envCtx.unk_F2[3] = 0x80;
+ play->envCtx.precipitation[PRECIP_SNOW_MAX] = 128;
EnWeatherTag_SetupAction(this, func_80966E84);
}
}
@@ -316,7 +327,7 @@ void func_80966E0C(EnWeatherTag* this, PlayState* play) {
// WEATHERTAG_TYPE_WINTERFOG 2
void func_80966E84(EnWeatherTag* this, PlayState* play) {
if (func_80966758(this, play, 1, 0, 2, 0, 60)) {
- play->envCtx.unk_F2[3] = 0;
+ play->envCtx.precipitation[PRECIP_SNOW_MAX] = 0;
EnWeatherTag_SetupAction(this, func_80966E0C);
}
}
@@ -326,8 +337,8 @@ void func_80966E84(EnWeatherTag* this, PlayState* play) {
// wait if you enter the scene through a room instead of fog you get a flash rain shower
void func_80966EF0(EnWeatherTag* this, PlayState* play) {
if (func_80966608(this, play, 0, 1, 0, 2, 100, 4)) {
- func_800FD78C(play);
- play->envCtx.unk_F2[0] = 60;
+ Environment_PlayStormNatureAmbience(play);
+ play->envCtx.precipitation[PRECIP_RAIN_MAX] = 60;
EnWeatherTag_SetupAction(this, func_80966F74);
}
}
@@ -335,8 +346,8 @@ void func_80966EF0(EnWeatherTag* this, PlayState* play) {
// WEATHERTAG_TYPE_UNK3 2
void func_80966F74(EnWeatherTag* this, PlayState* play) {
if (func_80966758(this, play, 1, 0, 2, 0, 100)) {
- func_800FD858(play);
- play->envCtx.unk_F2[0] = 0;
+ Environment_StopStormNatureAmbience(play);
+ play->envCtx.precipitation[PRECIP_RAIN_MAX] = 0;
EnWeatherTag_SetupAction(this, func_80966EF0);
}
}
@@ -348,7 +359,7 @@ void func_80966FEC(EnWeatherTag* this, PlayState* play) {
// weirdly, not the same as the other param lookup used in the rest of the file, which is float
s32 distance = WEATHER_TAG_RANGE100INT(&this->actor);
if (distance > 0) {
- D_801F4E7A = distance;
+ gSkyboxNumStars = distance;
}
if ((play->sceneId == SCENE_KAIZOKU) && (play->actorCtx.flags & ACTORCTX_FLAG_1)) {
@@ -377,14 +388,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);
}
}
@@ -394,9 +404,9 @@ void EnWeatherTag_DoNothing(EnWeatherTag* this, PlayState* play) {
// these two are isolated, they call themselves but nothing calls them?
void EnWeatherTag_Unused_809671B8(EnWeatherTag* this, PlayState* play) {
if (func_80966608(this, play, 0, 1, 0, 4, 100, 5)) {
- func_800FD78C(play);
- play->envCtx.unk_E3 = 1;
- play->envCtx.unk_F2[0] = 60;
+ Environment_PlayStormNatureAmbience(play);
+ play->envCtx.lightningState = LIGHTNING_ON;
+ play->envCtx.precipitation[PRECIP_RAIN_MAX] = 60;
EnWeatherTag_SetupAction(this, EnWeatherTag_Unused_80967250);
}
}
@@ -404,9 +414,9 @@ void EnWeatherTag_Unused_809671B8(EnWeatherTag* this, PlayState* play) {
// these two are isolated, they call themselves but nothing calls them
void EnWeatherTag_Unused_80967250(EnWeatherTag* this, PlayState* play) {
if (func_80966758(this, play, 1, 0, 4, 0, 100)) {
- func_800FD858(play);
- play->envCtx.unk_E3 = 2;
- play->envCtx.unk_F2[0] = 0;
+ Environment_StopStormNatureAmbience(play);
+ play->envCtx.lightningState = LIGHTNING_LAST;
+ play->envCtx.precipitation[PRECIP_RAIN_MAX] = 0;
EnWeatherTag_SetupAction(this, EnWeatherTag_Unused_809671B8);
}
}
@@ -422,24 +432,24 @@ void func_809672DC(EnWeatherTag* this, PlayState* play) {
Actor_GetClosestPosOnPath(this->pathPoints, this->pathCount, &GET_PLAYER(play)->actor.world.pos,
&this->actor.world.pos, false);
- distance = Actor_XZDistanceBetweenActors(&player->actor, &this->actor);
+ distance = Actor_WorldDistXZToActor(&player->actor, &this->actor);
range = WEATHER_TAG_RANGE100(&this->actor);
if (distance < range) {
- play->envCtx.sandstormState = 6;
+ play->envCtx.sandstormState = SANDSTORM_6;
strength = 1.0f - (distance / range);
if (0.8f < strength) {
strength = 1.0f;
}
D_801F4E30 = (200.0f * strength);
} else {
- if (play->envCtx.sandstormState == 6) {
+ if (play->envCtx.sandstormState == SANDSTORM_6) {
D_801F4E30 = 0;
- play->envCtx.sandstormState = 7;
+ play->envCtx.sandstormState = SANDSTORM_7;
}
}
- Math_SmoothStepToS(&play->envCtx.lightSettings.fogNear, (s16)(-40.0f * strength), 1, 1, 1);
+ Math_SmoothStepToS(&play->envCtx.adjLightSettings.fogNear, -40.0f * strength, 1, 1, 1);
}
// WEATHERTAG_TYPE_LOCALDAY2RAIN: rain proximity as approaching rainy scene
@@ -447,22 +457,22 @@ void func_809672DC(EnWeatherTag* this, PlayState* play) {
void func_809674C8(EnWeatherTag* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (Actor_XZDistanceBetweenActors(&player->actor, &this->actor) < WEATHER_TAG_RANGE100(&this->actor)) {
+ if (Actor_WorldDistXZToActor(&player->actor, &this->actor) < WEATHER_TAG_RANGE100(&this->actor)) {
if (CURRENT_DAY == 2) {
if ((gSaveContext.save.time >= CLOCK_TIME(7, 0)) && (gSaveContext.save.time < CLOCK_TIME(17, 30)) &&
- (play->envCtx.unk_F2[2] == 0)) {
+ (play->envCtx.precipitation[PRECIP_SNOW_CUR] == 0)) {
- gWeatherMode = 1;
- func_800FD78C(play);
- play->envCtx.unk_F2[4] = 0x20;
+ gWeatherMode = WEATHER_MODE_1;
+ Environment_PlayStormNatureAmbience(play);
+ play->envCtx.precipitation[PRECIP_SOS_MAX] = 32;
EnWeatherTag_SetupAction(this, func_80967608);
}
}
} else {
- if ((play->envCtx.unk_F2[4] != 0) && !(play->state.frames & 3)) {
- play->envCtx.unk_F2[4]--;
- if ((play->envCtx.unk_F2[4]) == 8) {
- func_800FD858(play);
+ if ((play->envCtx.precipitation[PRECIP_SOS_MAX] != 0) && !(play->state.frames & 3)) {
+ play->envCtx.precipitation[PRECIP_SOS_MAX]--;
+ if ((play->envCtx.precipitation[PRECIP_SOS_MAX]) == 8) {
+ Environment_StopStormNatureAmbience(play);
}
}
}
@@ -471,8 +481,8 @@ void func_809674C8(EnWeatherTag* this, PlayState* play) {
// WEATHERTAG_TYPE_LOCALDAY2RAIN 2
void func_80967608(EnWeatherTag* this, PlayState* play) {
if ((WEATHER_TAG_RANGE100(&this->actor) + 10.0f) <
- Actor_XZDistanceBetweenActors(&GET_PLAYER(play)->actor, &this->actor)) {
- gWeatherMode = 0;
+ Actor_WorldDistXZToActor(&GET_PLAYER(play)->actor, &this->actor)) {
+ gWeatherMode = WEATHER_MODE_CLEAR;
EnWeatherTag_SetupAction(this, func_809674C8);
}
}
@@ -481,10 +491,10 @@ void EnWeatherTag_Update(Actor* thisx, PlayState* play) {
EnWeatherTag* this = THIS;
this->actionFunc(this, play);
- if ((play->actorCtx.flags & ACTORCTX_FLAG_1) && (play->msgCtx.msgMode != 0) &&
+ if ((play->actorCtx.flags & ACTORCTX_FLAG_1) && (play->msgCtx.msgMode != MSGMODE_NONE) &&
(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 bc505ee53..b1332885e 100644
--- a/src/overlays/actors/ovl_En_Wf/z_en_wf.c
+++ b/src/overlays/actors/ovl_En_Wf/z_en_wf.c
@@ -6,9 +6,10 @@
#include "z_en_wf.h"
#include "overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h"
#include "overlays/actors/ovl_Obj_Ice_Poly/z_obj_ice_poly.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_400)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_400)
#define THIS ((EnWf*)thisx)
@@ -299,10 +300,10 @@ void EnWf_Init(Actor* thisx, PlayState* play) {
if (this->actor.child != NULL) {
Player* player = GET_PLAYER(play);
- this->actor.child->xzDistToPlayer = Actor_XZDistanceBetweenActors(&this->actor, &player->actor);
+ this->actor.child->xzDistToPlayer = Actor_WorldDistXZToActor(&this->actor, &player->actor);
this->unk_2A4 = (temp_s0 * 0.5f) + 45.0f;
this->unk_29C = 0x32000 / this->unk_2A4;
- this->actor.shape.rot.y = Actor_YawBetweenActors(&this->actor, &player->actor);
+ this->actor.shape.rot.y = Actor_WorldYawTowardActor(&this->actor, &player->actor);
this->actor.world.pos.x -= this->unk_2A4 * Math_SinS(this->actor.shape.rot.y);
this->actor.world.pos.z -= this->unk_2A4 * Math_CosS(this->actor.shape.rot.y);
}
@@ -317,7 +318,7 @@ void EnWf_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 0.0075f);
if (this->actor.params == 0) {
- SkelAnime_InitFlex(play, &this->skelAnime, &gWolfosNormalSkel, &gWolfosWaitingAnim, this->jointTable,
+ SkelAnime_InitFlex(play, &this->skelAnime, &gWolfosNormalSkel, &gWolfosWaitAnim, this->jointTable,
this->morphTable, WOLFOS_NORMAL_LIMB_MAX);
this->actor.hintId = TATL_HINT_ID_WOLFOS;
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable2, &sColChkInfoInit);
@@ -325,7 +326,7 @@ void EnWf_Init(Actor* thisx, PlayState* play) {
this->collider1.elements[1].info.toucher.damage = 8;
this->actor.colChkInfo.health = 6;
} else {
- SkelAnime_InitFlex(play, &this->skelAnime, &gWolfosWhiteSkel, &gWolfosWaitingAnim, this->jointTable,
+ SkelAnime_InitFlex(play, &this->skelAnime, &gWolfosWhiteSkel, &gWolfosWaitAnim, this->jointTable,
this->morphTable, WOLFOS_WHITE_LIMB_MAX);
this->actor.hintId = TATL_HINT_ID_WHITE_WOLFOS;
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable1, &sColChkInfoInit);
@@ -367,7 +368,7 @@ void func_809907D4(EnWf* this) {
this->collider3.base.colType = COLTYPE_HIT3;
this->unk_2A0 = 80;
this->actor.flags &= ~ACTOR_FLAG_400;
- Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, 0, 80);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 80);
}
void func_80990854(EnWf* this, PlayState* play) {
@@ -376,7 +377,7 @@ void func_80990854(EnWf* this, PlayState* play) {
this->collider2.base.colType = COLTYPE_HIT5;
this->collider3.base.colType = COLTYPE_HIT5;
this->drawDmgEffAlpha = 0.0f;
- Actor_SpawnIceEffects(play, &this->actor, this->limbPos, 10, 2, 0.3f, 0.2f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, WOLFOS_BODYPART_MAX, 2, 0.3f, 0.2f);
this->actor.flags |= ACTOR_FLAG_400;
}
}
@@ -405,7 +406,7 @@ s32 func_80990948(PlayState* play, EnWf* this, s16 arg2) {
if (((this->unk_295 == 0) ||
((this->unk_295 == 1) && (this->actor.child != NULL) && (this->actor.child->update != NULL))) &&
(this->actor.xzDistToPlayer > 160.0f) &&
- (this->unk_2A8 < Actor_XZDistanceToPoint(&this->actor, &this->actor.home.pos))) {
+ (this->unk_2A8 < Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos))) {
func_80993524(this);
return true;
}
@@ -419,7 +420,7 @@ s32 func_80990948(PlayState* play, EnWf* this, s16 arg2) {
if (func_800BE184(play, &this->actor, 100.0f, 24000, 0x2AA8, this->actor.shape.rot.y)) {
this->actor.shape.rot.y = this->actor.yawTowardsPlayer;
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
- if ((this->actor.bgCheckFlags & 8) && (sp38 < 12000)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) && (sp38 < 12000)) {
func_809926D0(this);
return true;
}
@@ -471,14 +472,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 +490,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);
}
@@ -499,9 +501,9 @@ void func_80990C6C(EnWf* this, PlayState* play, s32 arg2) {
}
void func_80990E4C(EnWf* this, PlayState* play) {
- if (Animation_OnFrame(&this->skelAnime, 1.0f) && (this->actor.bgCheckFlags & 1)) {
+ if (Animation_OnFrame(&this->skelAnime, 1.0f) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
func_80990C6C(this, play, 2);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WOLFOS_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WOLFOS_WALK);
}
}
@@ -517,7 +519,7 @@ s32 func_80990EAC(EnWf* this) {
void func_80990ED4(EnWf* this) {
this->actor.child = NULL;
this->actor.shape.rot.y = this->actor.yawTowardsPlayer;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WOLFOS_APPEAR);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WOLFOS_APPEAR);
func_80991438(this);
}
@@ -525,7 +527,7 @@ void func_80990F0C(EnWf* this) {
this->collider2.base.acFlags &= ~AC_ON;
this->actor.shape.shadowScale = 0.0f;
this->actor.scale.y = 0.0f;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->unk_2A0 = 60;
this->actionFunc = func_80990F50;
}
@@ -549,9 +551,9 @@ void func_80990F50(EnWf* this, PlayState* play) {
}
void func_80990FC8(EnWf* this) {
- Animation_Change(&this->skelAnime, &gWolfosRearingUpFallingOverAnim, 0.5f, 0.0f, 7.0f, ANIMMODE_ONCE_INTERP, 0.0f);
+ Animation_Change(&this->skelAnime, &gWolfosRearUpFallOverAnim, 0.5f, 0.0f, 7.0f, ANIMMODE_ONCE_INTERP, 0.0f);
this->unk_2A0 = 5;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actionFunc = func_80991040;
}
@@ -561,7 +563,7 @@ void func_80991040(EnWf* this, PlayState* play) {
Math_StepToF(&this->actor.shape.shadowScale, 70.0f, 14.0f);
this->unk_2A0--;
if (this->unk_2A0 == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WOLFOS_APPEAR);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WOLFOS_APPEAR);
}
} else if (SkelAnime_Update(&this->skelAnime)) {
this->actor.scale.y = this->actor.scale.x;
@@ -571,8 +573,8 @@ void func_80991040(EnWf* this, PlayState* play) {
void func_809910F0(EnWf* this) {
this->collider2.base.acFlags &= ~AC_ON;
- this->actor.speedXZ = 0.0f;
- Animation_Change(&this->skelAnime, &gWolfosRearingUpFallingOverAnim, 0.5f, 0.0f, 7.0f, ANIMMODE_ONCE_INTERP, -5.0f);
+ this->actor.speed = 0.0f;
+ Animation_Change(&this->skelAnime, &gWolfosRearUpFallOverAnim, 0.5f, 0.0f, 7.0f, ANIMMODE_ONCE_INTERP, -5.0f);
this->unk_2A0 = 5;
this->actionFunc = func_80991174;
}
@@ -591,11 +593,11 @@ void func_80991174(EnWf* this, PlayState* play) {
void func_80991200(EnWf* this) {
this->collider2.base.acFlags |= AC_ON;
- Animation_MorphToLoop(&this->skelAnime, &gWolfosWaitingAnim, -4.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gWolfosWaitAnim, -4.0f);
this->unk_2A0 = (s32)Rand_ZeroFloat(10.0f) + 2;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = func_80991280;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
void func_80991280(EnWf* this, PlayState* play) {
@@ -615,7 +617,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);
@@ -633,7 +636,7 @@ void func_80991280(EnWf* this, PlayState* play) {
}
if (this->unk_2A2 == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WOLFOS_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WOLFOS_CRY);
}
}
}
@@ -642,9 +645,9 @@ void func_80991280(EnWf* this, PlayState* play) {
void func_80991438(EnWf* this) {
this->collider2.base.acFlags |= AC_ON;
- Animation_MorphToLoop(&this->skelAnime, &gWolfosRunningAnim, -4.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gWolfosRunAnim, -4.0f);
this->actor.world.rot.y = this->actor.shape.rot.y;
- this->actor.speedXZ = 8.0f;
+ this->actor.speed = 8.0f;
this->actionFunc = func_8099149C;
}
@@ -665,7 +668,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) {
@@ -694,7 +698,7 @@ void func_8099149C(EnWf* this, PlayState* play) {
}
if (this->unk_2A2 == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WOLFOS_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WOLFOS_CRY);
}
func_80990E4C(this, play);
@@ -703,7 +707,7 @@ void func_8099149C(EnWf* this, PlayState* play) {
}
void func_80991738(EnWf* this) {
- Animation_MorphToLoop(&this->skelAnime, &gWolfosSidesteppingAnim, -4.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gWolfosSidestepAnim, -4.0f);
this->actionFunc = func_8099177C;
}
@@ -748,20 +752,20 @@ void func_8099177C(EnWf* this, PlayState* play) {
}
}
if (this->unk_2A2 == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WOLFOS_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WOLFOS_CRY);
}
}
}
void func_80991948(EnWf* this) {
this->collider2.base.acFlags |= AC_ON;
- Animation_MorphToLoop(&this->skelAnime, &gWolfosRunningAnim, -4.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gWolfosRunAnim, -4.0f);
if (Rand_ZeroOne() > 0.5f) {
this->unk_29A = 16000;
} else {
this->unk_29A = -16000;
}
- this->actor.speedXZ = 6.0f;
+ this->actor.speed = 6.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->unk_2A0 = (s32)Rand_ZeroFloat(30.0f) + 30;
this->actionFunc = func_809919F4;
@@ -776,7 +780,7 @@ void func_809919F4(EnWf* this, PlayState* play) {
if (!func_8099408C(play, this) && !func_80990948(play, this, 0)) {
this->actor.world.rot.y = this->actor.shape.rot.y;
sp26 = BINANG_ROT180(player->actor.shape.rot.y + this->unk_29A);
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
temp_v0 = (this->actor.wallYaw - this->actor.yawTowardsPlayer) - this->unk_29A;
if (ABS_ALT(temp_v0) > 0x2EE0) {
this->unk_29A = -this->unk_29A;
@@ -787,7 +791,7 @@ void func_809919F4(EnWf* this, PlayState* play) {
func_80990E4C(this, play);
if (this->unk_2A2 == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WOLFOS_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WOLFOS_CRY);
}
if ((Math_CosS(sp26 - this->actor.shape.rot.y) < -0.85f) && !Actor_OtherIsTargeted(play, &this->actor) &&
@@ -809,12 +813,12 @@ void func_809919F4(EnWf* this, PlayState* play) {
void func_80991C04(EnWf* this) {
this->collider2.base.acFlags |= AC_ON;
- Animation_PlayOnce(&this->skelAnime, &gWolfosSlashingAnim);
+ Animation_PlayOnce(&this->skelAnime, &gWolfosSlashAnim);
this->collider1.base.atFlags &= ~AT_BOUNCED;
this->actor.shape.rot.y = this->actor.yawTowardsPlayer;
this->unk_2A0 = 7;
this->skelAnime.endFrame = 20.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = func_80991C80;
}
@@ -827,11 +831,11 @@ void func_80991C80(EnWf* this, PlayState* play) {
sp2A = BINANG_SUB(player->actor.shape.rot.y, this->actor.shape.rot.y);
sp30 = ABS_ALT(BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y));
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (((this->skelAnime.curFrame >= 9.0f) && (this->skelAnime.curFrame < 13.0f)) ||
((this->skelAnime.curFrame >= 17.0f) && (this->skelAnime.curFrame < 20.0f))) {
if (!(this->collider1.base.atFlags & AT_ON)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WOLFOS_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WOLFOS_ATTACK);
}
this->collider1.base.atFlags |= AT_ON;
} else {
@@ -879,7 +883,7 @@ void func_80991FD8(EnWf* this) {
if (this->skelAnime.curFrame > 15.0f) {
phi_f0 = 15.0f;
}
- Animation_Change(&this->skelAnime, &gWolfosSlashingAnim, -0.5f, this->skelAnime.curFrame - 1.0f, phi_f0,
+ Animation_Change(&this->skelAnime, &gWolfosSlashAnim, -0.5f, this->skelAnime.curFrame - 1.0f, phi_f0,
ANIMMODE_ONCE_INTERP, 0.0f);
this->collider1.base.atFlags &= ~AT_ON;
this->actionFunc = func_80992068;
@@ -923,12 +927,12 @@ void func_80992068(EnWf* this, PlayState* play) {
void func_8099223C(EnWf* this) {
this->collider2.base.acFlags &= ~AC_ON;
- Animation_MorphToPlayOnce(&this->skelAnime, &gWolfosBackflippingAnim, -3.0f);
+ Animation_MorphToPlayOnce(&this->skelAnime, &gWolfosBackflipAnim, -3.0f);
this->unk_2A0 = 0;
- this->actor.speedXZ = -6.0f;
+ this->actor.speed = -6.0f;
this->actor.shape.rot.y = this->actor.yawTowardsPlayer;
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_TEKU_JUMP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_TEKU_JUMP);
this->actionFunc = func_809922B4;
}
@@ -944,12 +948,12 @@ void func_809922B4(EnWf* this, PlayState* play) {
}
}
if (this->unk_2A2 == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WOLFOS_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WOLFOS_CRY);
}
}
void func_809923B0(EnWf* this) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->actor.velocity.y > 0.0f) {
this->actor.velocity.y = 0.0f;
}
@@ -974,24 +978,24 @@ void func_809923E4(EnWf* this, PlayState* play) {
void func_8099245C(EnWf* this) {
this->collider2.base.acFlags &= ~AC_ON;
Animation_MorphToPlayOnce(&this->skelAnime, &gWolfosDamagedAnim, -4.0f);
- if (this->actor.bgCheckFlags & 1) {
- this->actor.speedXZ = -4.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->actor.speed = -4.0f;
}
this->unk_298 = 0;
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WOLFOS_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WOLFOS_DAMAGE);
this->actionFunc = func_809924EC;
}
void func_809924EC(EnWf* this, PlayState* play) {
s16 sp26;
- if (this->actor.bgCheckFlags & 2) {
- this->actor.speedXZ = 0.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
+ this->actor.speed = 0.0f;
}
- if ((this->actor.bgCheckFlags & 1) && (this->actor.speedXZ < 0.0f)) {
- this->actor.speedXZ += 0.05f;
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->actor.speed < 0.0f)) {
+ this->actor.speed += 0.05f;
}
Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 3000);
@@ -1002,7 +1006,8 @@ void func_809924EC(EnWf* this, PlayState* play) {
return;
}
- if ((this->actor.bgCheckFlags & 8) && (ABS_ALT(sp26) < 0x2EE0) && (this->actor.xzDistToPlayer < 120.0f)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) && (ABS_ALT(sp26) < 0x2EE0) &&
+ (this->actor.xzDistToPlayer < 120.0f)) {
func_809926D0(this);
} else if (!func_8099408C(play, this)) {
if ((this->actor.xzDistToPlayer <= 80.0f) && !Actor_OtherIsTargeted(play, &this->actor) &&
@@ -1021,24 +1026,25 @@ void func_809924EC(EnWf* this, PlayState* play) {
void func_809926D0(EnWf* this) {
this->collider2.base.acFlags &= ~AC_ON;
- Animation_Change(&this->skelAnime, &gWolfosBackflippingAnim, -1.0f,
- Animation_GetLastFrame(&gWolfosBackflippingAnim.common), 0.0f, ANIMMODE_ONCE, -3.0f);
+ Animation_Change(&this->skelAnime, &gWolfosBackflipAnim, -1.0f, Animation_GetLastFrame(&gWolfosBackflipAnim.common),
+ 0.0f, ANIMMODE_ONCE, -3.0f);
this->unk_2A0 = 0;
- this->actor.speedXZ = 6.5f;
+ this->actor.speed = 6.5f;
this->actor.velocity.y = 15.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_TEKU_JUMP);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_TEKU_JUMP);
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = func_80992784;
}
void func_80992784(EnWf* this, PlayState* play) {
Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 2500);
- if (SkelAnime_Update(&this->skelAnime) && (this->actor.bgCheckFlags & (2 | 1))) {
+ if (SkelAnime_Update(&this->skelAnime) &&
+ (this->actor.bgCheckFlags & (BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH))) {
this->actor.shape.rot.x = 0;
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
this->actor.shape.rot.y = this->actor.yawTowardsPlayer;
this->actor.velocity.y = 0.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actor.world.pos.y = this->actor.floorHeight;
if (!Actor_OtherIsTargeted(play, &this->actor)) {
func_80991C04(this);
@@ -1052,9 +1058,9 @@ void func_8099282C(EnWf* this) {
this->collider2.base.acFlags |= AC_ON;
this->collider1.base.atFlags &= ~AT_ON;
this->unk_2A0 = 10;
- this->actor.speedXZ = 0.0f;
- Animation_Change(&this->skelAnime, &gWolfosBlockingAnim, -1.0f, Animation_GetLastFrame(&gWolfosBlockingAnim.common),
- 0.0f, ANIMMODE_ONCE, -2.0f);
+ this->actor.speed = 0.0f;
+ Animation_Change(&this->skelAnime, &gWolfosBlockAnim, -1.0f, Animation_GetLastFrame(&gWolfosBlockAnim.common), 0.0f,
+ ANIMMODE_ONCE, -2.0f);
this->actionFunc = func_809928CC;
}
@@ -1091,7 +1097,7 @@ void func_80992A74(EnWf* this, PlayState* play) {
f32 temp_f0;
this->collider2.base.acFlags |= AC_ON;
- Animation_MorphToLoop(&this->skelAnime, &gWolfosRunningAnim, -4.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gWolfosRunAnim, -4.0f);
player = GET_PLAYER(play);
temp_f0 = Math_SinS((player->actor.shape.rot.y + this->unk_29A) - this->actor.yawTowardsPlayer);
if (temp_f0 > 0.0f) {
@@ -1103,7 +1109,7 @@ void func_80992A74(EnWf* this, PlayState* play) {
} else {
this->unk_29A = -16000;
}
- this->actor.speedXZ = 6.0f;
+ this->actor.speed = 6.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->unk_2A0 = (s32)Rand_ZeroFloat(10.0f) + 5;
this->actionFunc = func_80992B8C;
@@ -1115,7 +1121,7 @@ void func_80992B8C(EnWf* this, PlayState* play) {
Player* player = GET_PLAYER(play);
Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer + this->unk_29A, 2000);
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
sp2C = BINANG_SUB((this->actor.wallYaw - this->actor.yawTowardsPlayer), this->unk_29A);
if (ABS_ALT(sp2C) > 0x2EE0) {
this->unk_29A = -this->unk_29A;
@@ -1146,33 +1152,33 @@ void func_80992B8C(EnWf* this, PlayState* play) {
func_80990E4C(this, play);
if (this->unk_2A2 == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WOLFOS_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WOLFOS_CRY);
}
}
}
void func_80992D6C(EnWf* this) {
this->collider2.base.acFlags &= ~AC_ON;
- Animation_MorphToPlayOnce(&this->skelAnime, &gWolfosRearingUpFallingOverAnim, -4.0f);
+ Animation_MorphToPlayOnce(&this->skelAnime, &gWolfosRearUpFallOverAnim, -4.0f);
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
- if (this->actor.bgCheckFlags & 1) {
- this->actor.speedXZ = -6.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->actor.speed = -6.0f;
}
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->unk_2A0 = 25;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WOLFOS_DEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WOLFOS_DEAD);
this->actionFunc = func_80992E0C;
}
void func_80992E0C(EnWf* this, PlayState* play) {
static Vec3f D_809942F0 = { 0.0f, 0.5f, 0.0f };
- if (this->actor.bgCheckFlags & 2) {
- this->actor.speedXZ = 0.0f;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
+ this->actor.speed = 0.0f;
}
- if (this->actor.bgCheckFlags & 1) {
- Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ Math_StepToF(&this->actor.speed, 0.0f, 0.5f);
}
if (SkelAnime_Update(&this->skelAnime)) {
@@ -1194,18 +1200,18 @@ 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);
}
- func_800B9010(&this->actor, NA_SE_EN_COMMON_EXTINCT_LEV - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_COMMON_EXTINCT_LEV - SFX_FLAG);
}
}
void func_80992FD4(EnWf* this) {
- Animation_MorphToLoop(&this->skelAnime, &gWolfosWaitingAnim, -4.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gWolfosWaitAnim, -4.0f);
this->actionFunc = func_80993018;
}
@@ -1217,7 +1223,7 @@ void func_80993018(EnWf* this, PlayState* play) {
} else if (this->actor.child->xzDistToPlayer < (80.0f + this->unk_2A4)) {
func_80993350(this);
} else {
- s16 temp_v0 = Actor_YawBetweenActors(this->actor.child, &this->actor);
+ s16 temp_v0 = Actor_WorldYawTowardActor(this->actor.child, &this->actor);
s16 temp_v1 = BINANG_SUB(temp_v0 - this->actor.child->yawTowardsPlayer, 0x8000);
if (ABS_ALT(temp_v1) > 0x800) {
@@ -1232,8 +1238,8 @@ void func_80993018(EnWf* this, PlayState* play) {
}
void func_80993148(EnWf* this) {
- Animation_MorphToLoop(&this->skelAnime, &gWolfosRunningAnim, -4.0f);
- this->actor.speedXZ = 0.0f;
+ Animation_MorphToLoop(&this->skelAnime, &gWolfosRunAnim, -4.0f);
+ this->actor.speed = 0.0f;
this->actionFunc = func_80993194;
}
@@ -1251,7 +1257,7 @@ void func_80993194(EnWf* this, PlayState* play) {
if (this->actor.child->xzDistToPlayer < (80.0f + this->unk_2A4)) {
func_80993350(this);
} else {
- sp36 = Actor_YawBetweenActors(this->actor.child, &this->actor);
+ sp36 = Actor_WorldYawTowardActor(this->actor.child, &this->actor);
sp34 = Math_SmoothStepToS(&sp36, BINANG_ROT180(this->actor.child->yawTowardsPlayer), 10, this->unk_29C,
16);
this->actor.world.pos.x = (Math_SinS(sp36) * this->unk_2A4) + this->actor.child->world.pos.x;
@@ -1272,13 +1278,13 @@ void func_80993194(EnWf* this, PlayState* play) {
}
if (this->unk_2A2 == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WOLFOS_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WOLFOS_CRY);
}
}
void func_80993350(EnWf* this) {
- Animation_MorphToLoop(&this->skelAnime, &gWolfosRunningAnim, -4.0f);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WOLFOS_APPEAR);
+ Animation_MorphToLoop(&this->skelAnime, &gWolfosRunAnim, -4.0f);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WOLFOS_APPEAR);
this->actionFunc = func_809933A0;
}
@@ -1293,7 +1299,7 @@ void func_809933A0(EnWf* this, PlayState* play) {
if (func_80990EAC(this)) {
func_80990ED4(this);
} else {
- sp2E = Actor_YawBetweenActors(this->actor.child, &this->actor);
+ sp2E = Actor_WorldYawTowardActor(this->actor.child, &this->actor);
Math_ScaledStepToS(&sp2E, this->actor.child->yawTowardsPlayer, this->unk_29C >> 2);
sp2C = sp2E - this->actor.child->yawTowardsPlayer;
this->actor.world.pos.x = (Math_SinS(sp2E) * this->unk_2A4) + this->actor.child->world.pos.x;
@@ -1312,13 +1318,13 @@ void func_809933A0(EnWf* this, PlayState* play) {
func_80990ED4(this);
}
if (this->unk_2A2 == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WOLFOS_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WOLFOS_CRY);
}
}
void func_80993524(EnWf* this) {
- Animation_MorphToLoop(&this->skelAnime, &gWolfosRunningAnim, -4.0f);
- this->actor.speedXZ = 6.0f;
+ Animation_MorphToLoop(&this->skelAnime, &gWolfosRunAnim, -4.0f);
+ this->actor.speed = 6.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = func_8099357C;
}
@@ -1330,14 +1336,14 @@ void func_8099357C(EnWf* this, PlayState* play) {
func_80990E4C(this, play);
if (this->unk_295 != 0) {
if ((this->actor.child != NULL) && (this->actor.child->update != NULL)) {
- sp2E = Actor_YawBetweenActors(&this->actor, this->actor.child);
+ sp2E = Actor_WorldYawTowardActor(&this->actor, this->actor.child);
if (func_80990EAC(this)) {
this->actor.child = NULL;
func_80991738(this);
return;
}
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
if (BINANG_SUB(sp2E, this->actor.wallYaw) > 0) {
sp2E = this->actor.wallYaw - 0x4000;
} else {
@@ -1348,7 +1354,7 @@ void func_8099357C(EnWf* this, PlayState* play) {
Math_SmoothStepToS(&this->actor.shape.rot.y, sp2E, 10, 0x800, 16);
this->actor.world.rot.y = this->actor.shape.rot.y;
- if (Actor_XZDistanceBetweenActors(&this->actor, this->actor.child) < (this->unk_2A4 + 10.0f)) {
+ if (Actor_WorldDistXZToActor(&this->actor, this->actor.child) < (this->unk_2A4 + 10.0f)) {
func_80993148(this);
}
} else {
@@ -1356,16 +1362,16 @@ void func_8099357C(EnWf* this, PlayState* play) {
func_80991738(this);
}
} else {
- Math_SmoothStepToS(&this->actor.shape.rot.y, Actor_YawToPoint(&this->actor, &this->actor.home.pos), 10, 0x800,
- 16);
+ Math_SmoothStepToS(&this->actor.shape.rot.y, Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos), 10,
+ 0x800, 16);
this->actor.world.rot.y = this->actor.shape.rot.y;
- if (Actor_XZDistanceToPoint(&this->actor, &this->actor.home.pos) < 40.0f) {
+ if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) < 40.0f) {
func_809910F0(this);
}
}
if (this->unk_2A2 == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WOLFOS_CRY);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WOLFOS_CRY);
}
}
@@ -1422,16 +1428,16 @@ void func_8099386C(EnWf* this, PlayState* play) {
if (this->actor.colChkInfo.damageEffect == 1) {
this->unk_2A0 = 40;
- Actor_SetColorFilter(&this->actor, 0, 0x78, 0, 40);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 120, COLORFILTER_BUFFLAG_OPA, 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
func_809923B0(this);
} else if (this->actor.colChkInfo.damageEffect == 5) {
this->unk_2A0 = 40;
- Actor_SetColorFilter(&this->actor, 0, 0xFF, 0, 40);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 40);
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_SMALL;
this->drawDmgEffScale = 0.75f;
this->drawDmgEffAlpha = 2.0f;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
func_809923B0(this);
} else if (this->actor.colChkInfo.damageEffect == 3) {
func_809907D4(this);
@@ -1451,10 +1457,10 @@ void func_8099386C(EnWf* this, PlayState* play) {
this->drawDmgEffAlpha = 4.0f;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, collider->info.bumper.hitPos.x,
collider->info.bumper.hitPos.y, collider->info.bumper.hitPos.z, 0, 0, 0,
- CLEAR_TAG_LARGE_LIGHT_RAYS);
+ CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
}
- Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, 0, 8);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
if (this->actor.colChkInfo.health == 0) {
func_80992D6C(this);
} else {
@@ -1483,10 +1489,12 @@ 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 & (2 | 1)) {
+ if (this->actor.bgCheckFlags & (BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH)) {
func_800BE3D0(&this->actor, this->actor.shape.rot.y, &this->actor.shape.rot);
} else {
Math_ScaledStepToS(&this->actor.shape.rot.x, 0, 600);
@@ -1527,7 +1535,7 @@ void EnWf_Update(Actor* thisx, PlayState* play) {
this->drawDmgEffScale = this->drawDmgEffScale;
}
} else if (!Math_StepToF(&this->drawDmgEffFrozenSteamScale, 0.75f, 0.01875f)) {
- func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
}
}
@@ -1541,17 +1549,39 @@ s32 EnWf_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po
return false;
}
+static s8 sLimbToBodyParts[WOLFOS_NORMAL_LIMB_MAX] = {
+ BODYPART_NONE, // WOLFOS_NORMAL_LIMB_NONE
+ BODYPART_NONE, // WOLFOS_NORMAL_LIMB_ROOT
+ BODYPART_NONE, // WOLFOS_NORMAL_LIMB_BACK_LEFT_THIGH
+ BODYPART_NONE, // WOLFOS_NORMAL_LIMB_BACK_LEFT_SHIN
+ BODYPART_NONE, // WOLFOS_NORMAL_LIMB_BACK_LEFT_PASTERN
+ WOLFOS_BODYPART_BACK_LEFT_PAW, // WOLFOS_NORMAL_LIMB_BACK_LEFT_PAW
+ WOLFOS_BODYPART_TAIL, // WOLFOS_NORMAL_LIMB_TAIL
+ BODYPART_NONE, // WOLFOS_NORMAL_LIMB_ABDOMEN
+ BODYPART_NONE, // WOLFOS_NORMAL_LIMB_BACK_RIGHT_THIGH
+ BODYPART_NONE, // WOLFOS_NORMAL_LIMB_BACK_RIGHT_SHIN
+ BODYPART_NONE, // WOLFOS_NORMAL_LIMB_BACK_RIGHT_PASTERN
+ WOLFOS_BODYPART_BACK_RIGHT_PAW, // WOLFOS_NORMAL_LIMB_BACK_RIGHT_PAW
+ BODYPART_NONE, // WOLFOS_NORMAL_LIMB_THORAX
+ WOLFOS_BODYPART_FRONT_RIGHT_UPPER_LEG, // WOLFOS_NORMAL_LIMB_FRONT_RIGHT_UPPER_LEG
+ WOLFOS_BODYPART_FRONT_RIGHT_LOWER_LEG, // WOLFOS_NORMAL_LIMB_FRONT_RIGHT_LOWER_LEG
+ WOLFOS_BODYPART_FRONT_RIGHT_CLAW, // WOLFOS_NORMAL_LIMB_FRONT_RIGHT_CLAW
+ WOLFOS_BODYPART_HEAD_ROOT, // WOLFOS_NORMAL_LIMB_HEAD_ROOT
+ BODYPART_NONE, // WOLFOS_NORMAL_LIMB_HEAD
+ BODYPART_NONE, // WOLFOS_NORMAL_LIMB_EYES
+ WOLFOS_BODYPART_FRONT_LEFT_UPPER_LEG, // WOLFOS_NORMAL_LIMB_FRONT_LEFT_UPPER_LEG
+ WOLFOS_BODYPART_FRONT_LEFT_LOWER_LEG, // WOLFOS_NORMAL_LIMB_FRONT_LEFT_LOWER_LEG
+ WOLFOS_BODYPART_FRONT_LEFT_CLAW, // WOLFOS_NORMAL_LIMB_FRONT_LEFT_CLAW
+};
+
void EnWf_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
- static s8 D_809942FC[] = {
- -1, -1, -1, -1, -1, 0, 1, -1, -1, -1, -1, 2, -1, 3, 4, 5, 6, -1, -1, 7, 8, 9,
- };
EnWf* this = THIS;
Vec3f sp20;
Collider_UpdateSpheres(limbIndex, &this->collider1);
- if (D_809942FC[limbIndex] != -1) {
- Matrix_MultZero(&this->limbPos[D_809942FC[limbIndex]]);
+ if (sLimbToBodyParts[limbIndex] != BODYPART_NONE) {
+ Matrix_MultZero(&this->bodyPartsPos[sLimbToBodyParts[limbIndex]]);
}
if (limbIndex == WOLFOS_NORMAL_LIMB_TAIL) {
@@ -1568,7 +1598,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]);
@@ -1580,7 +1610,7 @@ void EnWf_Draw(Actor* thisx, PlayState* play) {
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnWf_OverrideLimbDraw, EnWf_PostLimbDraw, &this->actor);
- Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), this->drawDmgEffScale,
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, WOLFOS_BODYPART_MAX, this->drawDmgEffScale,
this->drawDmgEffFrozenSteamScale, this->drawDmgEffAlpha, this->drawDmgEffType);
}
}
@@ -1590,7 +1620,7 @@ s32 func_8099408C(PlayState* play, EnWf* this) {
s16 temp_v1;
if (temp_v0 != NULL) {
- temp_v1 = (Actor_YawBetweenActors(&this->actor, temp_v0) - this->actor.shape.rot.y) - this->unk_29E;
+ temp_v1 = (Actor_WorldYawTowardActor(&this->actor, temp_v0) - this->actor.shape.rot.y) - this->unk_29E;
if (ABS_ALT(temp_v1) < 0x3000) {
if (Rand_ZeroOne() < 0.5f) {
func_8099223C(this);
diff --git a/src/overlays/actors/ovl_En_Wf/z_en_wf.h b/src/overlays/actors/ovl_En_Wf/z_en_wf.h
index c8a0c7af8..6e9db0be1 100644
--- a/src/overlays/actors/ovl_En_Wf/z_en_wf.h
+++ b/src/overlays/actors/ovl_En_Wf/z_en_wf.h
@@ -10,6 +10,20 @@ typedef void (*EnWfActionFunc)(struct EnWf*, PlayState*);
#define ENWF_GET_80(thisx) ((thisx)->params & 0x80)
+typedef enum WolfosBodyPart {
+ /* 0 */ WOLFOS_BODYPART_BACK_LEFT_PAW,
+ /* 1 */ WOLFOS_BODYPART_TAIL,
+ /* 2 */ WOLFOS_BODYPART_BACK_RIGHT_PAW,
+ /* 3 */ WOLFOS_BODYPART_FRONT_RIGHT_UPPER_LEG,
+ /* 4 */ WOLFOS_BODYPART_FRONT_RIGHT_LOWER_LEG,
+ /* 5 */ WOLFOS_BODYPART_FRONT_RIGHT_CLAW,
+ /* 6 */ WOLFOS_BODYPART_HEAD_ROOT,
+ /* 7 */ WOLFOS_BODYPART_FRONT_LEFT_UPPER_LEG,
+ /* 8 */ WOLFOS_BODYPART_FRONT_LEFT_LOWER_LEG,
+ /* 9 */ WOLFOS_BODYPART_FRONT_LEFT_CLAW,
+ /* 10 */ WOLFOS_BODYPART_MAX
+} WolfosBodyPart;
+
typedef struct EnWf {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
@@ -30,7 +44,7 @@ typedef struct EnWf {
/* 0x2AC */ f32 drawDmgEffAlpha;
/* 0x2B0 */ f32 drawDmgEffScale;
/* 0x2B4 */ f32 drawDmgEffFrozenSteamScale;
- /* 0x2B8 */ Vec3f limbPos[10];
+ /* 0x2B8 */ Vec3f bodyPartsPos[WOLFOS_BODYPART_MAX];
/* 0x330 */ ColliderJntSph collider1;
/* 0x350 */ ColliderJntSphElement collider1Elements[4];
/* 0x450 */ ColliderCylinder collider2;
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 ee2f3d158..8ae7b0de4 100644
--- a/src/overlays/actors/ovl_En_Wiz/z_en_wiz.c
+++ b/src/overlays/actors/ovl_En_Wiz/z_en_wiz.c
@@ -6,11 +6,12 @@
#include "z_en_wiz.h"
#include "objects/gameplay_keep/gameplay_keep.h"
+#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.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 | \
- ACTOR_FLAG_8000000 | ACTOR_FLAG_80000000)
+#define FLAGS \
+ (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | 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 +38,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 +51,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 +69,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 +78,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 +240,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 = {
@@ -329,13 +330,13 @@ void EnWiz_Init(Actor* thisx, PlayState* play) {
this->platformLightAlpha = 0;
this->alpha = 255;
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
- this->actor.targetMode = 3;
+ this->actor.targetMode = TARGET_MODE_3;
this->unk_450 = 1.0f;
this->actor.shape.yOffset = 700.0f;
Collider_InitAndSetJntSph(play, &this->ghostColliders, &this->actor, &sJntSphInit, this->ghostColliderElements);
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
this->staffFlameScroll = Rand_S16Offset(0, 7);
- this->switchFlag = EN_WIZ_GET_SWITCHFLAG(&this->actor);
+ this->switchFlag = EN_WIZ_GET_SWITCH_FLAG(&this->actor);
this->type = EN_WIZ_GET_TYPE(&this->actor);
if (this->switchFlag == 0x7F) {
@@ -456,9 +457,9 @@ void EnWiz_HandleIntroCutscene(EnWiz* this, PlayState* play) {
this->targetPlatformLightAlpha = 255;
Math_Vec3f_Copy(&this->platformLightPos, &this->actor.world.pos);
if (this->fightState == EN_WIZ_FIGHT_STATE_FIRST_PHASE) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WIZ_UNARI);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WIZ_UNARI);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WIZ_VOICE - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WIZ_VOICE - SFX_FLAG);
}
this->introCutsceneTimer = 40;
@@ -497,20 +498,20 @@ void EnWiz_HandleIntroCutscene(EnWiz* this, PlayState* play) {
case EN_WIZ_INTRO_CS_WAIT_BEFORE_RUN:
if (this->introCutsceneTimer == 0) {
EnWiz_ChangeAnim(this, EN_WIZ_ANIM_RUN, false);
- this->rotationalVelocity = 0;
+ this->angularVelocity = 0;
this->introCutsceneTimer = 34;
this->introCutsceneState++;
}
break;
case EN_WIZ_INTRO_CS_RUN_IN_CIRCLES:
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WIZ_RUN - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WIZ_RUN - SFX_FLAG);
if (this->introCutsceneTimer == 0) {
this->animLoopCounter = this->introCutsceneCameraAngle = 0;
this->introCutsceneState = EN_WIZ_INTRO_CS_DISAPPEAR;
} else {
- Math_SmoothStepToS(&this->rotationalVelocity, 0x1388, 0x64, 0x3E8, 0x3E8);
- this->actor.world.rot.y += this->rotationalVelocity;
+ Math_SmoothStepToS(&this->angularVelocity, 0x1388, 0x64, 0x3E8, 0x3E8);
+ this->actor.world.rot.y += this->angularVelocity;
}
Math_Vec3f_Copy(&eyeNext, &this->actor.world.pos);
@@ -601,6 +602,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);
@@ -663,18 +667,18 @@ void EnWiz_MoveGhosts(EnWiz* this) {
}
if (playSfx) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WIZ_RUN - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WIZ_RUN - SFX_FLAG);
}
}
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);
}
}
@@ -702,9 +706,9 @@ void EnWiz_SetupAppear(EnWiz* this, PlayState* play) {
Math_Vec3f_Copy(&this->platformLightPos, &this->actor.world.pos);
if (this->fightState == EN_WIZ_FIGHT_STATE_FIRST_PHASE) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WIZ_UNARI);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WIZ_UNARI);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WIZ_VOICE - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WIZ_VOICE - SFX_FLAG);
}
}
@@ -744,7 +748,7 @@ void EnWiz_Appear(EnWiz* this, PlayState* play) {
this->shouldStartTimer = true;
}
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WIZ_VOICE - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WIZ_VOICE - SFX_FLAG);
}
if (this->timer == 0) {
@@ -756,7 +760,7 @@ void EnWiz_Appear(EnWiz* this, PlayState* play) {
return;
} else {
this->action = EN_WIZ_ACTION_RUN_IN_CIRCLES;
- this->actor.flags &= ~ACTOR_FLAG_8000000;
+ this->actor.flags &= ~ACTOR_FLAG_CANT_LOCK_ON;
this->ghostColliders.elements[0].info.bumper.dmgFlags = 0x1013A22;
Math_Vec3f_Copy(&this->staffTargetFlameScale, &staffTargetFlameScale);
this->targetPlatformLightAlpha = 0;
@@ -780,7 +784,7 @@ void EnWiz_Appear(EnWiz* this, PlayState* play) {
void EnWiz_SetupDance(EnWiz* this) {
EnWiz_ChangeAnim(this, EN_WIZ_ANIM_DANCE, false);
Math_ApproachF(&this->scale, 0.015f, 0.05f, 0.001f);
- this->rotationalVelocity = 0;
+ this->angularVelocity = 0;
this->animLoopCounter = 0;
this->action = EN_WIZ_ACTION_DANCE;
if (this->fightState >= EN_WIZ_FIGHT_STATE_SECOND_PHASE_GHOSTS_COPY_WIZROBE) {
@@ -803,17 +807,17 @@ void EnWiz_Dance(EnWiz* this, PlayState* play) {
Math_SmoothStepToS(&this->alpha, 255, 1, 5, 0);
Math_ApproachF(&this->scale, 0.015f, 0.05f, 0.001f);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WIZ_RUN - SFX_FLAG);
- this->actor.world.rot.y += this->rotationalVelocity;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WIZ_RUN - SFX_FLAG);
+ this->actor.world.rot.y += this->angularVelocity;
if (this->fightState >= EN_WIZ_FIGHT_STATE_SECOND_PHASE_GHOSTS_RUN_AROUND) {
EnWiz_MoveGhosts(this);
} else {
for (i = 0; i < this->platformCount; i++) {
- this->ghostRot[i].y += this->rotationalVelocity;
+ this->ghostRot[i].y += this->angularVelocity;
}
}
- Math_SmoothStepToS(&this->rotationalVelocity, 0x1388, 0x64, 0x3E8, 0x3E8);
+ Math_SmoothStepToS(&this->angularVelocity, 0x1388, 0x64, 0x3E8, 0x3E8);
Math_SmoothStepToS(&this->platformLightAlpha, this->targetPlatformLightAlpha, 20, 50, 10);
if (this->endFrame <= curFrame) {
if (this->animLoopCounter < 10) {
@@ -821,20 +825,20 @@ void EnWiz_Dance(EnWiz* this, PlayState* play) {
}
}
- if ((this->animLoopCounter >= 3) && (!this->hasActiveProjectile)) {
+ if ((this->animLoopCounter >= 3) && !this->hasActiveProjectile) {
this->targetPlatformLightAlpha = 0;
EnWiz_SetupWindUp(this);
}
}
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;
@@ -856,7 +860,7 @@ void EnWiz_SecondPhaseCutscene(EnWiz* this, PlayState* play) {
Math_SmoothStepToS(&this->alpha, 255, 1, 5, 0);
subCam = Play_GetCamera(play, this->subCamId);
Math_Vec3f_Copy(&subCam->at, &this->actor.focus.pos);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WIZ_RUN - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WIZ_RUN - SFX_FLAG);
if (this->platforms[this->nextPlatformIndex] != NULL) {
f32 diffX = this->actor.world.pos.x - this->platforms[this->nextPlatformIndex]->world.pos.x;
f32 diffZ = this->actor.world.pos.z - this->platforms[this->nextPlatformIndex]->world.pos.z;
@@ -875,7 +879,7 @@ void EnWiz_SecondPhaseCutscene(EnWiz* this, PlayState* play) {
s32 pad;
s32 i;
- this->actor.flags |= ACTOR_FLAG_8000000;
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
if (sqrtf(SQ(diffX) + SQ(diffZ)) < 20.0f) {
for (i = 0; i < this->platformCount; i++) {
Math_Vec3f_Copy(&this->ghostPos[i], &gZeroVec3f);
@@ -885,7 +889,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;
@@ -959,7 +963,7 @@ void EnWiz_Attack(EnWiz* this, PlayState* play) {
}
if (this->timer == 0) {
- if ((Animation_OnFrame(&this->skelAnime, 6.0f)) && (!this->hasActiveProjectile)) {
+ if (Animation_OnFrame(&this->skelAnime, 6.0f) && !this->hasActiveProjectile) {
Player* player = GET_PLAYER(play);
Vec3f pos;
s32 type = this->type;
@@ -976,8 +980,8 @@ void EnWiz_Attack(EnWiz* this, PlayState* play) {
Math_Vec3f_Pitch(&pos, &player->actor.world.pos),
Math_Vec3f_Yaw(&pos, &player->actor.world.pos), 0, type * 4);
this->hasActiveProjectile = true;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WIZ_ATTACK);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_PL_MAGIC_FIRE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WIZ_ATTACK);
+ Actor_PlaySfx(&this->actor, NA_SE_PL_MAGIC_FIRE);
}
if ((curFrame >= 8.0f) && !this->shouldStartTimer) {
@@ -993,21 +997,21 @@ void EnWiz_Attack(EnWiz* this, PlayState* play) {
void EnWiz_SetupDisappear(EnWiz* this) {
if (this->action != EN_WIZ_ACTION_DAMAGED) {
- this->rotationalVelocity = 0x2710;
+ this->angularVelocity = 0x2710;
this->timer = 0;
EnWiz_ChangeAnim(this, EN_WIZ_ANIM_IDLE, false);
this->action = EN_WIZ_ACTION_DISAPPEAR;
} else {
- this->rotationalVelocity = 0x2710;
- this->actor.world.rot.y += this->rotationalVelocity;
+ this->angularVelocity = 0x2710;
+ this->actor.world.rot.y += this->angularVelocity;
}
this->targetPlatformLightAlpha = 0;
- this->actor.flags |= ACTOR_FLAG_8000000;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WIZ_DISAPPEAR);
- Math_SmoothStepToS(&this->rotationalVelocity, 0x1388, 0x64, 0x3E8, 0x3E8);
- this->actor.world.rot.y += this->rotationalVelocity;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WIZ_DISAPPEAR);
+ Math_SmoothStepToS(&this->angularVelocity, 0x1388, 0x64, 0x3E8, 0x3E8);
+ this->actor.world.rot.y += this->angularVelocity;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->actionFunc = EnWiz_Disappear;
}
@@ -1018,8 +1022,8 @@ void EnWiz_SetupDisappear(EnWiz* this) {
void EnWiz_Disappear(EnWiz* this, PlayState* play) {
s32 i;
- Math_SmoothStepToS(&this->rotationalVelocity, 0, 0xA, 0xBB8, 0x14);
- this->actor.world.rot.y += this->rotationalVelocity;
+ Math_SmoothStepToS(&this->angularVelocity, 0, 0xA, 0xBB8, 0x14);
+ this->actor.world.rot.y += this->angularVelocity;
if ((this->fightState == EN_WIZ_FIGHT_STATE_FIRST_PHASE) || (this->action == EN_WIZ_ACTION_DAMAGED)) {
Math_ApproachZeroF(&this->scale, 0.3f, 0.01f);
Math_SmoothStepToS(&this->platformLightAlpha, this->targetPlatformLightAlpha, 5, 50, 0);
@@ -1027,7 +1031,7 @@ void EnWiz_Disappear(EnWiz* this, PlayState* play) {
Math_ApproachZeroF(&this->scale, 0.3f, 0.001f);
Math_SmoothStepToS(&this->platformLightAlpha, this->targetPlatformLightAlpha, 10, 50, 0);
for (i = 0; i < this->platformCount; i++) {
- this->ghostRot[i].y += this->rotationalVelocity;
+ this->ghostRot[i].y += this->angularVelocity;
}
}
@@ -1037,7 +1041,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;
}
@@ -1047,7 +1051,7 @@ void EnWiz_Disappear(EnWiz* this, PlayState* play) {
this->ghostColliders.elements[0].info.bumper.dmgFlags = 0x1000202;
}
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actionFunc = EnWiz_SetupAppear;
}
}
@@ -1055,16 +1059,16 @@ void EnWiz_Disappear(EnWiz* this, PlayState* play) {
void EnWiz_SetupDamaged(EnWiz* this, PlayState* play) {
EnWiz_ChangeAnim(this, EN_WIZ_ANIM_DAMAGE, false);
- Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8);
this->timer = 20;
if ((this->fightState != EN_WIZ_FIGHT_STATE_FIRST_PHASE) && (this->actor.colChkInfo.health <= 0)) {
Enemy_StartFinishingBlow(play, &this->actor);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WIZ_DEAD);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WIZ_DEAD);
this->timer = 0;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WIZ_DAMAGE);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WIZ_DAMAGE);
}
this->scale = 0.015f;
@@ -1075,9 +1079,9 @@ void EnWiz_SetupDamaged(EnWiz* this, PlayState* play) {
this->timer = 0;
}
- this->rotationalVelocity = 0x4E20;
+ this->angularVelocity = 0x4E20;
if ((this->drawDmgEffTimer != 0) && (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX)) {
- this->rotationalVelocity = 0;
+ this->angularVelocity = 0;
this->timer = 0;
}
@@ -1093,10 +1097,10 @@ void EnWiz_Damaged(EnWiz* this, PlayState* play) {
s32 i;
if ((this->drawDmgEffTimer < 50) && (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX)) {
- Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, ARRAY_COUNT(this->bodyPartsPos), 2, 1.0f, 0.7f);
+ Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, EN_WIZ_BODYPART_MAX, 2, 1.0f, 0.7f);
this->drawDmgEffTimer = 0;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
- this->rotationalVelocity = 0x4E20;
+ this->angularVelocity = 0x4E20;
this->actor.velocity.y = 30.0f;
this->actor.gravity = -3.0f;
}
@@ -1114,12 +1118,23 @@ void EnWiz_Damaged(EnWiz* this, PlayState* play) {
this->isDead = true;
}
- this->actor.world.rot.y += this->rotationalVelocity;
- Math_SmoothStepToS(&this->rotationalVelocity, 0, 0xA, 0xBB8, 0x14);
+ this->actor.world.rot.y += this->angularVelocity;
+ Math_SmoothStepToS(&this->angularVelocity, 0, 0xA, 0xBB8, 0x14);
for (i = 0; i < this->platformCount; i++) {
- this->ghostRot[i].y += this->rotationalVelocity;
+ this->ghostRot[i].y += this->angularVelocity;
}
+ //! @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)))) {
@@ -1146,17 +1161,19 @@ void EnWiz_Damaged(EnWiz* this, PlayState* play) {
EnWiz_SetupDisappear(this);
}
- this->actor.flags |= ACTOR_FLAG_8000000;
+ this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
}
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) {
EnWiz_ChangeAnim(this, EN_WIZ_ANIM_DAMAGE, false);
- this->rotationalVelocity = 0x2710;
+ this->angularVelocity = 0x2710;
this->action = EN_WIZ_ACTION_DEAD;
this->timer = 0;
this->actionFunc = EnWiz_Dead;
@@ -1169,9 +1186,9 @@ void EnWiz_SetupDead(EnWiz* this) {
void EnWiz_Dead(EnWiz* this, PlayState* play) {
s32 i;
- this->actor.world.rot.y += this->rotationalVelocity;
- Math_SmoothStepToS(&this->rotationalVelocity, 0, 0xA, 0xBB8, 0x14);
- if (this->rotationalVelocity < 0x1E) {
+ this->actor.world.rot.y += this->angularVelocity;
+ Math_SmoothStepToS(&this->angularVelocity, 0, 0xA, 0xBB8, 0x14);
+ if (this->angularVelocity < 0x1E) {
Math_SmoothStepToS(&this->alpha, 0, 10, 30, 20);
for (i = 0; i < this->platformCount; i++) {
Math_SmoothStepToS(&this->ghostAlpha[i], 0, 10, 30, 20);
@@ -1234,7 +1251,8 @@ void EnWiz_UpdateDamage(EnWiz* this, PlayState* play) {
(this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) ||
(this->drawDmgEffTimer == 0)) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->actor.focus.pos.x,
- this->actor.focus.pos.y, this->actor.focus.pos.z, 0, 0, 0, CLEAR_TAG_LARGE_LIGHT_RAYS);
+ this->actor.focus.pos.y, this->actor.focus.pos.z, 0, 0, 0,
+ CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
this->drawDmgEffTimer = 40;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_LIGHT_ORBS;
attackDealsDamage = true;
@@ -1261,15 +1279,16 @@ void EnWiz_UpdateDamage(EnWiz* this, PlayState* play) {
// If the player throws a Deku Nut or hits a ghost's collider (something that is impossible
// in the final game, since EnWiz_Init effectively disables them), then the below code will
// "destroy" the ghost by turning into a cloud of smoke.
- if ((iREG(50) != 0) || (this->ghostColliders.elements[i + 1].info.bumperFlags & BUMP_HIT)) {
+ if ((R_TRANS_FADE_FLASH_ALPHA_STEP != 0) ||
+ (this->ghostColliders.elements[i + 1].info.bumperFlags & BUMP_HIT)) {
//! @bug: If a single ghost is destroyed, then changing the fight state here will cause
//! strange behavior; the ghosts will stand still and pretend to attack the player like
//! the real Wizrobe. Since Deku Nuts destroy all ghosts at once, and since the ghost
//! colliders are effectively disabled, this doesn't cause any problems in the final
//! game, but it becomes an issue if the ghost colliders are enabled.
this->fightState = EN_WIZ_FIGHT_STATE_SECOND_PHASE_GHOSTS_COPY_WIZROBE;
- this->ghostColliders.base.acFlags &= ~BUMP_HIT;
- if (this->ghostPos[i].x != .0f || this->ghostPos[i].z != .0f) {
+ this->ghostColliders.base.acFlags &= ~AC_HIT;
+ if ((this->ghostPos[i].x != .0f) || (this->ghostPos[i].z != .0f)) {
for (j = 0; j < 9; j++) {
accel.x = 0.0f;
accel.y = 1.0f;
@@ -1280,7 +1299,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);
@@ -1371,10 +1390,10 @@ void EnWiz_PostLimbDrawOpa(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* r
(limbIndex == WIZROBE_LIMB_NECK) || (limbIndex == WIZROBE_LIMB_HEAD) || (limbIndex == WIZROBE_LIMB_JAW) ||
(limbIndex == WIZROBE_LIMB_LEFT_SHIN) || (limbIndex == WIZROBE_LIMB_RIGHT_SHIN) ||
(limbIndex == WIZROBE_LIMB_LOINCLOTH)) {
- Matrix_MultZero(&this->bodyPartsPos[this->bodyPartsPosIndex]);
- this->bodyPartsPosIndex++;
- if (this->bodyPartsPosIndex >= ARRAY_COUNT(this->bodyPartsPos)) {
- this->bodyPartsPosIndex = 0;
+ Matrix_MultZero(&this->bodyPartsPos[this->bodyPartIndex]);
+ this->bodyPartIndex++;
+ if (this->bodyPartIndex >= EN_WIZ_BODYPART_MAX) {
+ this->bodyPartIndex = 0;
}
}
}
@@ -1402,9 +1421,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);
}
@@ -1420,10 +1439,10 @@ void EnWiz_PostLimbDrawXlu(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* r
(limbIndex == WIZROBE_LIMB_NECK) || (limbIndex == WIZROBE_LIMB_HEAD) || (limbIndex == WIZROBE_LIMB_JAW) ||
(limbIndex == WIZROBE_LIMB_LEFT_SHIN) || (limbIndex == WIZROBE_LIMB_RIGHT_SHIN) ||
(limbIndex == WIZROBE_LIMB_LOINCLOTH)) {
- Matrix_MultZero(&this->bodyPartsPos[this->bodyPartsPosIndex]);
- this->bodyPartsPosIndex++;
- if (this->bodyPartsPosIndex >= ARRAY_COUNT(this->bodyPartsPos)) {
- this->bodyPartsPosIndex = 0;
+ Matrix_MultZero(&this->bodyPartsPos[this->bodyPartIndex]);
+ this->bodyPartIndex++;
+ if (this->bodyPartIndex >= EN_WIZ_BODYPART_MAX) {
+ this->bodyPartIndex = 0;
}
}
}
@@ -1434,8 +1453,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);
@@ -1468,9 +1487,8 @@ void EnWiz_Draw(Actor* thisx, PlayState* play) {
this->drawDmgEffFrozenSteamScale = 0.8f;
}
- Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, ARRAY_COUNT(this->bodyPartsPos),
- this->drawDmgEffScale, this->drawDmgEffFrozenSteamScale, drawDmgEffAlpha,
- this->drawDmgEffType);
+ Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, EN_WIZ_BODYPART_MAX, this->drawDmgEffScale,
+ this->drawDmgEffFrozenSteamScale, drawDmgEffAlpha, this->drawDmgEffType);
}
if (this->platformCount > 0) {
@@ -1485,8 +1503,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);
@@ -1512,8 +1530,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..fa7156fc5 100644
--- a/src/overlays/actors/ovl_En_Wiz/z_en_wiz.h
+++ b/src/overlays/actors/ovl_En_Wiz/z_en_wiz.h
@@ -4,19 +4,35 @@
#include "global.h"
#include "objects/object_wiz/object_wiz.h"
-#define EN_WIZ_GET_SWITCHFLAG(thisx) ((thisx)->params & 0x7F)
+#define EN_WIZ_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
#define EN_WIZ_GET_TYPE(thisx) (((thisx)->params >> 8) & 0xFF)
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;
typedef void (*EnWizActionFunc)(struct EnWiz*, PlayState*);
+typedef enum EnWizBodyPart {
+ /* 0 */ EN_WIZ_BODYPART_0,
+ /* 1 */ EN_WIZ_BODYPART_1,
+ /* 2 */ EN_WIZ_BODYPART_2,
+ /* 3 */ EN_WIZ_BODYPART_3,
+ /* 4 */ EN_WIZ_BODYPART_4,
+ /* 5 */ EN_WIZ_BODYPART_5,
+ /* 6 */ EN_WIZ_BODYPART_6,
+ /* 7 */ EN_WIZ_BODYPART_7,
+ /* 8 */ EN_WIZ_BODYPART_8,
+ /* 9 */ EN_WIZ_BODYPART_9,
+ /* 10 */ EN_WIZ_BODYPART_10,
+ /* 11 */ EN_WIZ_BODYPART_11,
+ /* 12 */ EN_WIZ_BODYPART_MAX
+} EnWizBodyPart;
+
typedef struct EnWiz {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
@@ -34,7 +50,7 @@ typedef struct EnWiz {
/* 0x3BA */ s16 hasActiveProjectile;
/* 0x3BC */ s16 hasRunToEveryPlatform; // used for the second phase cutscene to make sure the Wizrobe visits every platform
/* 0x3BE */ s16 unk_3BE; // unused, inferred from surrounding members
- /* 0x3C0 */ s16 rotationalVelocity;
+ /* 0x3C0 */ s16 angularVelocity;
/* 0x3C2 */ s16 alpha;
/* 0x3C4 */ s16 platformLightAlpha;
/* 0x3C6 */ s16 targetPlatformLightAlpha;
@@ -68,8 +84,8 @@ typedef struct EnWiz {
/* 0x754 */ s16 drawDmgEffType;
/* 0x758 */ f32 drawDmgEffScale;
/* 0x75C */ f32 drawDmgEffFrozenSteamScale;
- /* 0x760 */ Vec3f bodyPartsPos[12];
- /* 0x7F0 */ s16 bodyPartsPosIndex;
+ /* 0x760 */ Vec3f bodyPartsPos[EN_WIZ_BODYPART_MAX];
+ /* 0x7F0 */ s16 bodyPartIndex;
/* 0x7F2 */ s16 ghostAlpha[10];
/* 0x806 */ s16 ghostNextPlatformIndex[10];
/* 0x81C */ Vec3f ghostPos[10];
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 f2d88759e..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
@@ -7,7 +7,7 @@
#include "z_en_wiz_brock.h"
#include "objects/object_wiz/object_wiz.h"
-#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_8000000)
+#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_CANT_LOCK_ON)
#define THIS ((EnWizBrock*)thisx)
@@ -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 4ed3333fd..a3df9a7a2 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
@@ -8,7 +8,7 @@
#include "overlays/actors/ovl_En_Wiz/z_en_wiz.h"
#include "objects/object_wiz/object_wiz.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_8000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_CANT_LOCK_ON)
#define THIS ((EnWizFire*)thisx)
@@ -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;
@@ -74,10 +74,10 @@ void EnWizFire_Init(Actor* thisx, PlayState* play) {
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
this->type = EN_WIZ_FIRE_GET_TYPE(&this->actor);
- this->actor.targetMode = 3;
+ this->actor.targetMode = TARGET_MODE_3;
this->wallCheckTimer = 10;
this->alpha = 255.0f;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
if (!Player_HasMirrorShieldEquipped(play)) {
this->collider.info.toucher.dmgFlags = 0x20000000;
@@ -119,19 +119,19 @@ void EnWizFire_Destroy(Actor* thisx, PlayState* play) {
EnWizFire* this = THIS;
if (this->type == EN_WIZ_FIRE_TYPE_MAGIC_PROJECTILE) {
- play->envCtx.lightSettings.fogColor[2] = 0;
- play->envCtx.lightSettings.fogColor[1] = play->envCtx.lightSettings.fogColor[2];
- play->envCtx.lightSettings.fogColor[0] = play->envCtx.lightSettings.fogColor[2];
- play->envCtx.lightSettings.diffuseColor2[2] = play->envCtx.lightSettings.fogColor[2];
- play->envCtx.lightSettings.diffuseColor2[1] = play->envCtx.lightSettings.fogColor[2];
- play->envCtx.lightSettings.diffuseColor2[0] = play->envCtx.lightSettings.fogColor[2];
- play->envCtx.lightSettings.diffuseColor1[2] = play->envCtx.lightSettings.fogColor[2];
- play->envCtx.lightSettings.diffuseColor1[1] = play->envCtx.lightSettings.fogColor[2];
- play->envCtx.lightSettings.diffuseColor1[0] = play->envCtx.lightSettings.fogColor[2];
- play->envCtx.lightSettings.ambientColor[2] = play->envCtx.lightSettings.fogColor[2];
- play->envCtx.lightSettings.ambientColor[1] = play->envCtx.lightSettings.fogColor[2];
- play->envCtx.lightSettings.ambientColor[0] = play->envCtx.lightSettings.fogColor[2];
- play->envCtx.lightSettings.fogNear = play->envCtx.lightSettings.fogColor[2];
+ play->envCtx.adjLightSettings.fogColor[2] = 0;
+ play->envCtx.adjLightSettings.fogColor[1] = play->envCtx.adjLightSettings.fogColor[2];
+ play->envCtx.adjLightSettings.fogColor[0] = play->envCtx.adjLightSettings.fogColor[2];
+ play->envCtx.adjLightSettings.light2Color[2] = play->envCtx.adjLightSettings.fogColor[2];
+ play->envCtx.adjLightSettings.light2Color[1] = play->envCtx.adjLightSettings.fogColor[2];
+ play->envCtx.adjLightSettings.light2Color[0] = play->envCtx.adjLightSettings.fogColor[2];
+ play->envCtx.adjLightSettings.light1Color[2] = play->envCtx.adjLightSettings.fogColor[2];
+ play->envCtx.adjLightSettings.light1Color[1] = play->envCtx.adjLightSettings.fogColor[2];
+ play->envCtx.adjLightSettings.light1Color[0] = play->envCtx.adjLightSettings.fogColor[2];
+ play->envCtx.adjLightSettings.ambientColor[2] = play->envCtx.adjLightSettings.fogColor[2];
+ play->envCtx.adjLightSettings.ambientColor[1] = play->envCtx.adjLightSettings.fogColor[2];
+ play->envCtx.adjLightSettings.ambientColor[0] = play->envCtx.adjLightSettings.fogColor[2];
+ play->envCtx.adjLightSettings.fogNear = play->envCtx.adjLightSettings.fogColor[2];
}
Collider_DestroyCylinder(play, &this->collider);
@@ -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;
}
@@ -206,15 +206,15 @@ void EnWiz_MoveMagicProjectile(EnWizFire* this, PlayState* play) {
Math_ApproachF(&this->scale, this->targetScale, 0.2f, 0.01f);
if (this->wallCheckTimer == 0) {
- if ((this->actor.bgCheckFlags & 8) && (this->type == EN_WIZ_FIRE_TYPE_MAGIC_PROJECTILE) && (this->timer != 0) &&
- (this->actor.bgCheckFlags & 8)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) && (this->type == EN_WIZ_FIRE_TYPE_MAGIC_PROJECTILE) &&
+ (this->timer != 0) && (this->actor.bgCheckFlags & BGCHECKFLAG_WALL)) {
sPoolHitByIceArrow = false;
this->timer = 0;
this->targetScale = 0.0f;
}
}
- if ((this->actor.bgCheckFlags & 1) && (this->poolTimer == 0)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->poolTimer == 0)) {
s32 i;
s16 arcingProjectileRotY;
s32 pad;
@@ -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,16 +257,16 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_IT_BOMB_EXPLOSION);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_BOMB_EXPLOSION);
this->poolTimer = Rand_S16Offset(70, 30);
if (this->poolTimer != 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WIZ_EXP - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WIZ_EXP - SFX_FLAG);
}
} else if (this->poolTimer != 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
Math_Vec3f_Copy(&this->actor.velocity, &gZeroVec3f);
@@ -291,7 +291,7 @@ void EnWiz_MoveMagicProjectile(EnWizFire* this, PlayState* play) {
}
if (Player_HasMirrorShieldEquipped(play) && (this->collider.base.atFlags & AT_BOUNCED)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_SHIELD_REFLECT_MG);
+ Actor_PlaySfx(&this->actor, NA_SE_IT_SHIELD_REFLECT_MG);
this->collider.base.atFlags &= ~(AT_TYPE_ENEMY | AT_BOUNCED | AT_HIT);
this->collider.base.atFlags |= AT_TYPE_PLAYER;
this->collider.info.toucher.dmgFlags = 0x20;
@@ -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;
}
@@ -351,7 +351,7 @@ void EnWiz_SmallFlame(EnWizFire* this, PlayState* play) {
}
if (this->timer != 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BURN_OUT - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BURN_OUT - SFX_FLAG);
}
}
@@ -379,20 +379,20 @@ 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;
this->collider.dim.height = 30;
this->collider.dim.yShift = 15;
EnWizFire_InitializeEffect(this, &pos, &accel);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
return;
}
@@ -426,7 +426,7 @@ void EnWiz_Pool(EnWizFire* this, PlayState* play) {
if (this->isIceType == true) {
Math_ApproachZeroF(&this->poolScale, 0.046f, 0.001f);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
if (!this->shouldPoolFadeOut) {
if ((this->actor.parent != NULL) && (this->actor.parent->id == ACTOR_EN_WIZ) && (this->poolScale < 0.05f)) {
@@ -518,38 +518,39 @@ void EnWizFire_Update(Actor* thisx, PlayState* play2) {
fogNear = 968.0f;
}
- play->envCtx.lightSettings.fogNear = (fogNear - (s16)play->envCtx.unk_C4.fogNear) * this->blendScaleFrac;
+ play->envCtx.adjLightSettings.fogNear =
+ (fogNear - (s16)play->envCtx.lightSettings.fogNear) * this->blendScaleFrac;
- play->envCtx.lightSettings.ambientColor[0] =
- ((f32)lightSettingsColors[index].r - play->envCtx.unk_C4.ambientColor[0]) * this->blendScaleFrac;
- play->envCtx.lightSettings.ambientColor[1] =
- ((f32)lightSettingsColors[index].g - play->envCtx.unk_C4.ambientColor[1]) * this->blendScaleFrac;
- play->envCtx.lightSettings.ambientColor[2] =
- ((f32)lightSettingsColors[index].b - play->envCtx.unk_C4.ambientColor[2]) * this->blendScaleFrac;
+ play->envCtx.adjLightSettings.ambientColor[0] =
+ ((f32)lightSettingsColors[index].r - play->envCtx.lightSettings.ambientColor[0]) * this->blendScaleFrac;
+ play->envCtx.adjLightSettings.ambientColor[1] =
+ ((f32)lightSettingsColors[index].g - play->envCtx.lightSettings.ambientColor[1]) * this->blendScaleFrac;
+ play->envCtx.adjLightSettings.ambientColor[2] =
+ ((f32)lightSettingsColors[index].b - play->envCtx.lightSettings.ambientColor[2]) * this->blendScaleFrac;
index++;
- play->envCtx.lightSettings.diffuseColor1[0] =
- ((f32)lightSettingsColors[index].r - play->envCtx.unk_C4.diffuseColor1[0]) * this->blendScaleFrac;
- play->envCtx.lightSettings.diffuseColor1[1] =
- ((f32)lightSettingsColors[index].g - play->envCtx.unk_C4.diffuseColor1[1]) * this->blendScaleFrac;
- play->envCtx.lightSettings.diffuseColor1[2] =
- ((f32)lightSettingsColors[index].b - play->envCtx.unk_C4.diffuseColor1[2]) * this->blendScaleFrac;
+ play->envCtx.adjLightSettings.light1Color[0] =
+ ((f32)lightSettingsColors[index].r - play->envCtx.lightSettings.light1Color[0]) * this->blendScaleFrac;
+ play->envCtx.adjLightSettings.light1Color[1] =
+ ((f32)lightSettingsColors[index].g - play->envCtx.lightSettings.light1Color[1]) * this->blendScaleFrac;
+ play->envCtx.adjLightSettings.light1Color[2] =
+ ((f32)lightSettingsColors[index].b - play->envCtx.lightSettings.light1Color[2]) * this->blendScaleFrac;
index++;
- play->envCtx.lightSettings.diffuseColor2[0] =
- ((f32)lightSettingsColors[index].r - play->envCtx.unk_C4.diffuseColor[0]) * this->blendScaleFrac;
- play->envCtx.lightSettings.diffuseColor2[1] =
- ((f32)lightSettingsColors[index].g - play->envCtx.unk_C4.diffuseColor[1]) * this->blendScaleFrac;
- play->envCtx.lightSettings.diffuseColor2[2] =
- ((f32)lightSettingsColors[index].b - play->envCtx.unk_C4.diffuseColor[2]) * this->blendScaleFrac;
+ play->envCtx.adjLightSettings.light2Color[0] =
+ ((f32)lightSettingsColors[index].r - play->envCtx.lightSettings.light2Color[0]) * this->blendScaleFrac;
+ play->envCtx.adjLightSettings.light2Color[1] =
+ ((f32)lightSettingsColors[index].g - play->envCtx.lightSettings.light2Color[1]) * this->blendScaleFrac;
+ play->envCtx.adjLightSettings.light2Color[2] =
+ ((f32)lightSettingsColors[index].b - play->envCtx.lightSettings.light2Color[2]) * this->blendScaleFrac;
index++;
- play->envCtx.lightSettings.fogColor[0] =
- ((f32)lightSettingsColors[index].r - play->envCtx.unk_C4.fogColor[0]) * this->blendScaleFrac;
- play->envCtx.lightSettings.fogColor[1] =
- ((f32)lightSettingsColors[index].g - play->envCtx.unk_C4.fogColor[1]) * this->blendScaleFrac;
- play->envCtx.lightSettings.fogColor[2] =
- ((f32)lightSettingsColors[index].b - play->envCtx.unk_C4.fogColor[2]) * this->blendScaleFrac;
+ play->envCtx.adjLightSettings.fogColor[0] =
+ ((f32)lightSettingsColors[index].r - play->envCtx.lightSettings.fogColor[0]) * this->blendScaleFrac;
+ play->envCtx.adjLightSettings.fogColor[1] =
+ ((f32)lightSettingsColors[index].g - play->envCtx.lightSettings.fogColor[1]) * this->blendScaleFrac;
+ play->envCtx.adjLightSettings.fogColor[2] =
+ ((f32)lightSettingsColors[index].b - play->envCtx.lightSettings.fogColor[2]) * this->blendScaleFrac;
}
}
@@ -573,7 +574,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.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
if ((this->hitByIceArrow || sPoolHitByIceArrow) && (this->steamSpawnTimer == 0)) {
Vec3f accel;
@@ -625,7 +628,7 @@ void EnWizFire_Update(Actor* thisx, PlayState* play2) {
if (this->collider.base.atFlags & AT_HIT) {
this->collider.base.atFlags &= ~AT_HIT;
if (this->type == EN_WIZ_FIRE_TYPE_MAGIC_PROJECTILE) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WIZ_LAUGH2);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_WIZ_LAUGH2);
if (player->invincibilityTimer > 0) {
player->invincibilityTimer += 40;
if (this->isIceType) {
@@ -636,8 +639,8 @@ void EnWizFire_Update(Actor* thisx, PlayState* play2) {
}
}
- if ((player->stateFlags2 & PLAYER_STATE2_4000) && (player->unk_AE8 < 90)) {
- player->unk_AE8 = 90;
+ if ((player->stateFlags2 & PLAYER_STATE2_4000) && (player->actionVar2 < 90)) {
+ player->actionVar2 = 90;
}
if (!this->hitByIceArrow && !sPoolHitByIceArrow &&
@@ -656,8 +659,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 +692,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 +755,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 +876,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 ba63b3021..8611c1c30 100644
--- a/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c
+++ b/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c
@@ -35,8 +35,8 @@ typedef enum {
/* 5 */ WOOD_DRAW_LEAF_YELLOW
} WoodDrawType;
-static f32 sSpawnCos;
-static f32 sSpawnSin;
+f32 sWood02SpawnCos;
+f32 sWood02SpawnSin;
ActorInit En_Wood02_InitVars = {
ACTOR_EN_WOOD02,
@@ -70,9 +70,9 @@ static ColliderCylinderInit sCylinderInit = {
{ 18, 60, 0, { 0, 0, 0 } },
};
-static f32 sSpawnDistance[] = { 707.0f, 525.0f, 510.0f, 500.0f, 566.0f, 141.0f };
+f32 sWood02SpawnDistance[] = { 707.0f, 525.0f, 510.0f, 500.0f, 566.0f, 141.0f };
-static s16 sSpawnAngle[] = { 0x1FFF, 0x4C9E, 0x77F5, 0xA5C9, -0x293D, 0xA000 };
+s16 sWood02SpawnAngle[] = { 0x1FFF, 0x4C9E, 0x77F5, 0xA5C9, -0x293D, 0xA000 };
static InitChainEntry sInitChain[] = {
ICHAIN_F32(targetArrowOffset, 5600, ICHAIN_STOP),
@@ -136,12 +136,12 @@ void EnWood02_SpawnOffspring(EnWood02* this, PlayState* play) {
extraRot = 0x4000;
}
- sSpawnCos = Math_CosS(sSpawnAngle[i] + this->actor.world.rot.y + extraRot);
- sSpawnSin = Math_SinS(sSpawnAngle[i] + this->actor.world.rot.y + extraRot);
+ sWood02SpawnCos = Math_CosS(sWood02SpawnAngle[i] + this->actor.world.rot.y + extraRot);
+ sWood02SpawnSin = Math_SinS(sWood02SpawnAngle[i] + this->actor.world.rot.y + extraRot);
- childPos.x = (sSpawnDistance[i] * sSpawnSin) + this->actor.home.pos.x;
+ childPos.x = (sWood02SpawnDistance[i] * sWood02SpawnSin) + this->actor.home.pos.x;
childPos.y = this->actor.home.pos.y;
- childPos.z = (sSpawnDistance[i] * sSpawnCos) + this->actor.home.pos.z;
+ childPos.z = (sWood02SpawnDistance[i] * sWood02SpawnCos) + this->actor.home.pos.z;
if (EnWood02_SpawnZoneCheck(this, play, &childPos)) {
if (this->unk_14A[i] & 0x80) {
@@ -152,8 +152,8 @@ void EnWood02_SpawnOffspring(EnWood02* this, PlayState* play) {
childParams = ((this->unk_144 << 8) & 0xFF00) | (this->actor.params + 1);
child = (EnWood02*)Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_WOOD02, childPos.x,
- childPos.y, childPos.z, this->actor.world.rot.x, sSpawnAngle[i],
- unk, childParams);
+ childPos.y, childPos.z, this->actor.world.rot.x,
+ sWood02SpawnAngle[i], unk, childParams);
if (child != NULL) {
child->unk_14A[0] = i;
this->unk_14A[i] |= 1;
@@ -201,7 +201,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 {
@@ -263,8 +263,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;
}
@@ -296,10 +296,10 @@ void EnWood02_Init(Actor* thisx, PlayState* play) {
if (spawnType == WOOD_SPAWN_SPAWNER) {
EnWood02_SpawnOffspring(this, play);
- sSpawnCos = Math_CosS(sSpawnAngle[5] + this->actor.world.rot.y + extraRot);
- sSpawnSin = Math_SinS(sSpawnAngle[5] + this->actor.world.rot.y + extraRot);
- this->actor.world.pos.x += sSpawnSin * sSpawnDistance[5];
- this->actor.world.pos.z += sSpawnCos * sSpawnDistance[5];
+ sWood02SpawnCos = Math_CosS(sWood02SpawnAngle[5] + this->actor.world.rot.y + extraRot);
+ sWood02SpawnSin = Math_SinS(sWood02SpawnAngle[5] + this->actor.world.rot.y + extraRot);
+ this->actor.world.pos.x += sWood02SpawnSin * sWood02SpawnDistance[5];
+ this->actor.world.pos.z += sWood02SpawnCos * sWood02SpawnDistance[5];
} else {
this->actor.flags |= ACTOR_FLAG_10;
this->unk_151 = 2;
@@ -385,7 +385,7 @@ void EnWood02_Update(Actor* thisx, PlayState* play2) {
if ((thisx->params < WOOD_BUSH_GREEN_SMALL) || (thisx->params == WOOD_TREE_SPECIAL)) {
if (this->collider.base.acFlags & AC_HIT) {
this->collider.base.acFlags &= ~AC_HIT;
- Actor_PlaySfxAtPos(thisx, NA_SE_IT_REFLECTION_WOOD);
+ Actor_PlaySfx(thisx, NA_SE_IT_REFLECTION_WOOD);
}
if (thisx->home.rot.y != 0) {
@@ -404,11 +404,11 @@ void EnWood02_Update(Actor* thisx, PlayState* play2) {
(thisx->params == WOOD_TREE_OVAL_YELLOW_SPAWNED)) {
leavesParams = WOOD_LEAF_YELLOW;
}
- Actor_PlaySfxAtPos(thisx, NA_SE_EV_TREE_SWING);
+ Actor_PlaySfx(thisx, NA_SE_EV_TREE_SWING);
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);
}
}
@@ -436,10 +436,10 @@ void EnWood02_Update(Actor* thisx, PlayState* play2) {
if ((this->unk_146 >= -1) && (((player->rideActor == NULL) && (sqrtf(thisx->xyzDistToPlayerSq) < 20.0f) &&
(player->linearVelocity != 0.0f)) ||
((player->rideActor != NULL) && (sqrtf(thisx->xyzDistToPlayerSq) < 60.0f) &&
- (player->rideActor->speedXZ != 0.0f)))) {
+ (player->rideActor->speed != 0.0f)))) {
func_808C4458(this, play, &thisx->world.pos, 1);
this->unk_146 = -0x15;
- Actor_PlaySfxAtPos(thisx, NA_SE_EV_TREE_SWING);
+ Actor_PlaySfx(thisx, NA_SE_EV_TREE_SWING);
}
} else { // Leaves
this->unk_146++;
@@ -485,10 +485,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);
@@ -500,7 +500,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 2310a2eef..b39a77408 100644
--- a/src/overlays/actors/ovl_En_Yb/z_en_yb.c
+++ b/src/overlays/actors/ovl_En_Yb/z_en_yb.c
@@ -7,7 +7,7 @@
#include "z_en_yb.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
#define THIS ((EnYb*)thisx)
@@ -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,14 +81,14 @@ 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);
ActorShape_Init(&this->actor.shape, 0.0f, EnYb_ActorShadowFunc, 20.0f);
// @bug this alignment is because of player animations, but should be using ALIGN16
- SkelAnime_InitFlex(play, &this->skelAnime, &gYbSkeleton, &object_yb_Anim_000200, (uintptr_t)this->jointTable & ~0xF,
+ SkelAnime_InitFlex(play, &this->skelAnime, &gYbSkel, &object_yb_Anim_000200, (uintptr_t)this->jointTable & ~0xF,
(uintptr_t)this->morphTable & ~0xF, YB_LIMB_MAX);
Animation_PlayLoop(&this->skelAnime, &object_yb_Anim_000200);
@@ -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)) {
@@ -117,7 +120,7 @@ void EnYb_Init(Actor* thisx, PlayState* play) {
} else { // else (night 6pm to midnight): wait to appear
this->alpha = 0;
this->actionFunc = EnYb_WaitForMidnight;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_82_04)) {
@@ -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,35 +170,37 @@ 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) {
- if (animMode == ANIMMODE_LOOP) {
- LinkAnimation_Change(play, &this->skelAnime, gLinkAnimations[animIndex - 1], 1.0f, 0.0f,
- Animation_GetLastFrame(gLinkAnimations[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);
- }
- } else {
- // unused case, (only called once with animIndex = 2)
- AnimationHeader* animationPtr = gYbUnusedAnimations[animIndex];
+ s32 pad;
- if (1) {}
-
- Animation_Change(&this->skelAnime, gYbUnusedAnimations[animIndex], 1.0f, 0.0f,
- Animation_GetLastFrame(animationPtr), animMode, morphFrames);
- }
- this->animIndex = animIndex;
- }
+ if ((animIndex < 0) || (animIndex > 2)) {
+ return;
}
+
+ if ((animIndex == this->animIndex) && (animMode == ANIMMODE_LOOP)) {
+ return;
+ }
+
+ if (animIndex > 0) {
+ if (animMode == ANIMMODE_LOOP) {
+ 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)
+ 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)
+ Animation_Change(&this->skelAnime, gYbUnusedAnimations[animIndex], 1.0f, 0.0f,
+ Animation_GetLastFrame(gYbUnusedAnimations[animIndex]), animMode, morphFrames);
+ }
+ this->animIndex = animIndex;
}
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,29 +212,29 @@ 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;
}
/**
* Sets a flag that enables the Kamaro dancing proximity music at night.
*/
void EnYb_EnableProximityMusic(EnYb* this) {
- func_800B9084(&this->actor);
+ Actor_PlaySeq_FlaggedKamaroDance(&this->actor);
}
void EnYb_Disappear(EnYb* this, PlayState* play) {
@@ -239,9 +244,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);
}
@@ -262,7 +267,7 @@ void EnYb_SetupLeaving(EnYb* this, PlayState* play) {
Message_StartTextbox(play, 0x147D, &this->actor);
func_80BFA2FC(play);
} else {
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
}
EnYb_EnableProximityMusic(this);
}
@@ -274,9 +279,9 @@ void EnYb_ReceiveMask(EnYb* this, PlayState* play) {
this->actor.parent = NULL;
this->actionFunc = EnYb_SetupLeaving;
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
} else {
- Actor_PickUp(&this->actor, play, GI_MASK_KAMARO, 10000.0f, 100.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_MASK_KAMARO, 10000.0f, 100.0f);
}
EnYb_EnableProximityMusic(this);
}
@@ -289,27 +294,29 @@ void EnYb_Talk(EnYb* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
switch (play->msgCtx.currentTextId) {
case 0x147D: // I am counting on you
- func_801477B4(play);
+ Message_CloseTextbox(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) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = EnYb_Idle;
} else if (INV_CONTENT(ITEM_MASK_KAMARO) == ITEM_MASK_KAMARO) {
- func_80151938(play, 0x147D); // I am counting on you
+ Message_ContinueTextbox(play, 0x147D); // I am counting on you
func_80BFA2FC(play);
} else {
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = EnYb_ReceiveMask;
EnYb_ReceiveMask(this, play);
}
break;
+
default:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = EnYb_Idle;
break;
}
@@ -325,7 +332,7 @@ void EnYb_TeachingDanceFinish(EnYb* this, PlayState* play) {
Message_StartTextbox(play, 0x147C, &this->actor);
this->actor.flags &= ~ACTOR_FLAG_10000;
} else {
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
}
EnYb_EnableProximityMusic(this);
}
@@ -340,7 +347,7 @@ void EnYb_TeachingDance(EnYb* this, PlayState* play) {
EnYb_FinishTeachingCutscene(this);
this->actionFunc = EnYb_TeachingDanceFinish;
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
}
EnYb_EnableProximityMusic(this);
}
@@ -350,9 +357,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 == OCARINA_MODE_EVENT) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING) &&
+ (GET_PLAYER_FORM == PLAYER_FORM_HUMAN)) {
this->actionFunc = EnYb_TeachingDance;
this->teachingCutsceneTimer = 200;
EnYb_ChangeCutscene(this, 0);
@@ -367,17 +374,17 @@ void EnYb_Idle(EnYb* this, PlayState* play) {
Message_StartTextbox(play, 0x147B, &this->actor);
}
} else if (EnYb_CanTalk(this, play)) {
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
}
if (this->playerOcarinaOut & 1) {
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_PlaySfxAtPos(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
+ Actor_PlaySfx(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
}
EnYb_EnableProximityMusic(this);
@@ -389,7 +396,7 @@ void EnYb_WaitForMidnight(EnYb* this, PlayState* play) {
this->alpha += 5;
if (this->alpha > 250) {
this->alpha = 255;
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actionFunc = EnYb_Idle;
}
EnYb_EnableProximityMusic(this);
@@ -400,27 +407,27 @@ void EnYb_Update(Actor* thisx, PlayState* play) {
s32 pad;
EnYb* this = THIS;
- if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_1)) {
+ if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_TARGETABLE)) {
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
}
- if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_1)) {
+ if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_TARGETABLE)) {
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 +462,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_Zl1/z_en_zl1.c b/src/overlays/actors/ovl_En_Zl1/z_en_zl1.c
index e77aace23..1e813813e 100644
--- a/src/overlays/actors/ovl_En_Zl1/z_en_zl1.c
+++ b/src/overlays/actors/ovl_En_Zl1/z_en_zl1.c
@@ -6,7 +6,7 @@
#include "z_en_zl1.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnZl1*)thisx)
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 a16b828f9..95e8f2ceb 100644
--- a/src/overlays/actors/ovl_En_Zo/z_en_zo.c
+++ b/src/overlays/actors/ovl_En_Zo/z_en_zo.c
@@ -6,7 +6,7 @@
#include "z_en_zo.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnZo*)thisx)
@@ -98,9 +98,64 @@ static AnimationInfoS sAnimationInfo[] = {
{ &gZoraWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
};
-s8 sBodyParts[] = { -1, 1, 12, 13, 14, 9, 10, 11, 0, 6, 7, 8, 3, 4, 5, 2, -1, -1, -1, -1 };
-s8 sParentBodyParts[] = { 0, 0, 0, 0, 3, 4, 0, 6, 7, 0, 9, 10, 0, 12, 13 };
-u8 sShadowSizes[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+static s8 sLimbToBodyParts[ZORA_LIMB_MAX] = {
+ BODYPART_NONE, // ZORA_LIMB_NONE
+ ZORA_BODYPART_1, // ZORA_LIMB_PELVIS
+ ZORA_BODYPART_12, // ZORA_LIMB_LEFT_THIGH
+ ZORA_BODYPART_13, // ZORA_LIMB_LEFT_SHIN
+ ZORA_BODYPART_14, // ZORA_LIMB_LEFT_FOOT
+ ZORA_BODYPART_9, // ZORA_LIMB_RIGHT_THIGH
+ ZORA_BODYPART_10, // ZORA_LIMB_RIGHT_SHIN
+ ZORA_BODYPART_11, // ZORA_LIMB_RIGHT_FOOT
+ ZORA_BODYPART_0, // ZORA_LIMB_TORSO
+ ZORA_BODYPART_6, // ZORA_LIMB_LEFT_UPPER_ARM
+ ZORA_BODYPART_7, // ZORA_LIMB_LEFT_FOREARM
+ ZORA_BODYPART_8, // ZORA_LIMB_LEFT_HAND
+ ZORA_BODYPART_3, // ZORA_LIMB_RIGHT_UPPER_ARM
+ ZORA_BODYPART_4, // ZORA_LIMB_RIGHT_FOREARM
+ ZORA_BODYPART_5, // ZORA_LIMB_RIGHT_HAND
+ ZORA_BODYPART_2, // ZORA_LIMB_HEAD
+ BODYPART_NONE, // ZORA_LIMB_HEAD_TAIL_1
+ BODYPART_NONE, // ZORA_LIMB_HEAD_TAIL_2
+ BODYPART_NONE, // ZORA_LIMB_HEAD_TAIL_3
+ BODYPART_NONE, // ZORA_LIMB_HEAD_TAIL_FIN
+};
+
+static s8 sParentShadowBodyParts[ZORA_BODYPART_MAX] = {
+ ZORA_BODYPART_0, // ZORA_BODYPART_0
+ ZORA_BODYPART_0, // ZORA_BODYPART_1
+ ZORA_BODYPART_0, // ZORA_BODYPART_2
+ ZORA_BODYPART_0, // ZORA_BODYPART_3
+ ZORA_BODYPART_3, // ZORA_BODYPART_4
+ ZORA_BODYPART_4, // ZORA_BODYPART_5
+ ZORA_BODYPART_0, // ZORA_BODYPART_6
+ ZORA_BODYPART_6, // ZORA_BODYPART_7
+ ZORA_BODYPART_7, // ZORA_BODYPART_8
+ ZORA_BODYPART_0, // ZORA_BODYPART_9
+ ZORA_BODYPART_9, // ZORA_BODYPART_10
+ ZORA_BODYPART_10, // ZORA_BODYPART_11
+ ZORA_BODYPART_0, // ZORA_BODYPART_12
+ ZORA_BODYPART_12, // ZORA_BODYPART_13
+ ZORA_BODYPART_13, // ZORA_BODYPART_14
+};
+
+static u8 sShadowSizes[ZORA_BODYPART_MAX] = {
+ 0, // ZORA_BODYPART_0
+ 0, // ZORA_BODYPART_1
+ 0, // ZORA_BODYPART_2
+ 0, // ZORA_BODYPART_3
+ 0, // ZORA_BODYPART_4
+ 0, // ZORA_BODYPART_5
+ 0, // ZORA_BODYPART_6
+ 0, // ZORA_BODYPART_7
+ 0, // ZORA_BODYPART_8
+ 0, // ZORA_BODYPART_9
+ 0, // ZORA_BODYPART_10
+ 0, // ZORA_BODYPART_11
+ 0, // ZORA_BODYPART_12
+ 0, // ZORA_BODYPART_13
+ 0, // ZORA_BODYPART_14
+};
s32 EnZo_ChangeAnim(SkelAnime* skelAnime, s16 animIndex) {
s16 frameCount;
@@ -122,32 +177,33 @@ 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;
leftWasGrounded = this->isLeftFootGrounded;
rightWasGrounded = this->isRightFootGrounded;
- if (this->actor.bgCheckFlags & 0x20) {
+ 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);
- if ((this->isLeftFootGrounded) && (!leftWasGrounded) && (isFootGrounded)) {
- Actor_PlaySfxAtPos(&this->actor, sfxId);
+ if (this->isLeftFootGrounded && !leftWasGrounded && isFootGrounded) {
+ Actor_PlaySfx(&this->actor, sfxId);
}
this->isRightFootGrounded = isFootGrounded = SubS_IsFloorAbove(play, &this->rightFootPos, -6.0f);
- if ((this->isRightFootGrounded) && (!rightWasGrounded) && (isFootGrounded)) {
- Actor_PlaySfxAtPos(&this->actor, sfxId);
+ if (this->isRightFootGrounded && !rightWasGrounded && isFootGrounded) {
+ Actor_PlaySfx(&this->actor, sfxId);
}
return 0;
@@ -172,13 +228,14 @@ void EnZo_UpdateCollider(EnZo* this, PlayState* play) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
}
+static TrackOptionsSet sTrackOptions = {
+ { 0xFA0, 4, 1, 3 },
+ { 0x1770, 4, 1, 6 },
+ { 0xFA0, 4, 1, 3 },
+ { 0x1770, 4, 1, 6 },
+};
+
void EnZo_LookAtPlayer(EnZo* this, PlayState* play) {
- static TrackOptionsSet sTrackOptions = {
- { 0xFA0, 4, 1, 3 },
- { 0x1770, 4, 1, 6 },
- { 0xFA0, 4, 1, 3 },
- { 0x1770, 4, 1, 6 },
- };
Player* player = GET_PLAYER(play);
Vec3f point;
@@ -201,15 +258,15 @@ void EnZo_LookAtPlayer(EnZo* this, PlayState* play) {
}
EnZo_Blink(this, 3);
- SubS_FillLimbRotTables(play, this->limbRotY, this->limbRotZ, 20);
+ SubS_UpdateFidgetTables(play, this->fidgetTableY, this->fidgetTableZ, ZORA_LIMB_MAX);
}
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;
@@ -220,8 +277,8 @@ void EnZo_FollowPath(EnZo* this, PlayState* play) {
s16 speed;
Vec3f pos;
- Math_SmoothStepToF(&this->actor.speedXZ, 1.0f, 0.4f, 1000.0f, 0.0f);
- speed = this->actor.speedXZ * 400.0f;
+ Math_SmoothStepToF(&this->actor.speed, 1.0f, 0.4f, 1000.0f, 0.0f);
+ speed = this->actor.speed * 400.0f;
if (SubS_CopyPointFromPath(this->path, this->waypoint, &pos) && SubS_MoveActorToPoint(&this->actor, &pos, speed)) {
this->waypoint++;
if (this->waypoint >= this->path->count) {
@@ -233,7 +290,7 @@ void EnZo_FollowPath(EnZo* this, PlayState* play) {
EnZo_ChangeAnim(&this->skelAnime, 1);
this->actionFunc = EnZo_TreadWater;
this->actor.gravity = 0.0f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
}
@@ -263,7 +320,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 +337,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);
@@ -304,8 +361,8 @@ s32 EnZo_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po
if ((limbIndex == ZORA_LIMB_TORSO) || (limbIndex == ZORA_LIMB_LEFT_UPPER_ARM) ||
(limbIndex == ZORA_LIMB_RIGHT_UPPER_ARM)) {
- rot->y += (s16)(Math_SinS(this->limbRotY[limbIndex]) * 200.0f);
- rot->z += (s16)(Math_CosS(this->limbRotZ[limbIndex]) * 200.0f);
+ rot->y += (s16)(Math_SinS(this->fidgetTableY[limbIndex]) * 200.0f);
+ rot->z += (s16)(Math_CosS(this->fidgetTableZ[limbIndex]) * 200.0f);
}
return false;
}
@@ -315,15 +372,18 @@ void EnZo_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
Vec3f sp30 = { 400.0f, 0.0f, 0.0f };
Vec3f zeroVec = { 0.0f, 0.0f, 0.0f };
- if (sBodyParts[limbIndex] >= 0) {
- Matrix_MultVec3f(&zeroVec, &this->bodyPartsPos[sBodyParts[limbIndex]]);
+ if (sLimbToBodyParts[limbIndex] > BODYPART_NONE) {
+ Matrix_MultVec3f(&zeroVec, &this->bodyPartsPos[sLimbToBodyParts[limbIndex]]);
}
+
if (limbIndex == ZORA_LIMB_HEAD) {
Matrix_MultVec3f(&sp30, &this->actor.focus.pos);
}
+
if (limbIndex == ZORA_LIMB_LEFT_FOOT) {
Matrix_MultVec3f(&zeroVec, &this->leftFootPos);
}
+
if (limbIndex == ZORA_LIMB_RIGHT_FOOT) {
Matrix_MultVec3f(&zeroVec, &this->rightFootPos);
}
@@ -346,7 +406,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);
@@ -364,10 +425,11 @@ void EnZo_Draw(Actor* thisx, PlayState* play) {
shadowTexIter++;
}
for (i = 0; i < 5; i++) {
- SubS_GenShadowTex(this->bodyPartsPos, &this->actor.world.pos, shadowTex, i / 5.0f,
- ARRAY_COUNT(this->bodyPartsPos), sShadowSizes, sParentBodyParts);
+ SubS_GenShadowTex(this->bodyPartsPos, &this->actor.world.pos, shadowTex, i / 5.0f, ZORA_BODYPART_MAX,
+ sShadowSizes, sParentShadowBodyParts);
}
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..db620def0 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,28 @@ 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 enum EnZoBodyPart {
+ /* 0 */ ZORA_BODYPART_0,
+ /* 1 */ ZORA_BODYPART_1,
+ /* 2 */ ZORA_BODYPART_2,
+ /* 3 */ ZORA_BODYPART_3,
+ /* 4 */ ZORA_BODYPART_4,
+ /* 5 */ ZORA_BODYPART_5,
+ /* 6 */ ZORA_BODYPART_6,
+ /* 7 */ ZORA_BODYPART_7,
+ /* 8 */ ZORA_BODYPART_8,
+ /* 9 */ ZORA_BODYPART_9,
+ /* 10 */ ZORA_BODYPART_10,
+ /* 11 */ ZORA_BODYPART_11,
+ /* 12 */ ZORA_BODYPART_12,
+ /* 13 */ ZORA_BODYPART_13,
+ /* 14 */ ZORA_BODYPART_14,
+ /* 15 */ ZORA_BODYPART_MAX
+} EnZoBodyPart;
typedef struct EnZo {
/* 0x000 */ Actor actor;
@@ -28,9 +49,9 @@ typedef struct EnZo {
/* 0x2F4 */ Vec3s headRot;
/* 0x2FA */ Vec3s upperBodyRot;
/* 0x300 */ UNK_TYPE1 unk_300[0x12];
- /* 0x312 */ s16 limbRotY[20];
- /* 0x33A */ s16 limbRotZ[20];
- /* 0x364 */ Vec3f bodyPartsPos[15];
+ /* 0x312 */ s16 fidgetTableY[ZORA_LIMB_MAX];
+ /* 0x33A */ s16 fidgetTableZ[ZORA_LIMB_MAX];
+ /* 0x364 */ Vec3f bodyPartsPos[ZORA_BODYPART_MAX];
/* 0x41A */ UNK_TYPE1 unk_41A[0x6];
/* 0x41E */ s16 eyeIndex;
/* 0x420 */ s16 blinkTimer;
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 fdc6e4789..9e6310a71 100644
--- a/src/overlays/actors/ovl_En_Zob/z_en_zob.c
+++ b/src/overlays/actors/ovl_En_Zob/z_en_zob.c
@@ -7,7 +7,7 @@
#include "z_en_zob.h"
#include "objects/object_zob/object_zob.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnZob*)thisx)
@@ -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;
@@ -210,7 +210,7 @@ void func_80B9FA3C(EnZob* this, PlayState* play) {
this->unk_2F4 |= 1;
- if (gSaveContext.save.playerForm != PLAYER_FORM_ZORA) {
+ if (GET_PLAYER_FORM != PLAYER_FORM_ZORA) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_30_02)) {
textId = 0x11F9;
} else {
@@ -253,22 +253,22 @@ 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) {
- func_801477B4(play);
- play->msgCtx.ocarinaMode = 4;
+ Message_CloseTextbox(play);
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
func_80B9FC0C(this);
this->unk_2F4 &= ~1;
this->actionFunc = func_80BA0728;
@@ -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;
@@ -315,7 +315,7 @@ void func_80B9FE1C(EnZob* this, PlayState* play) {
void func_80B9FE5C(EnZob* this, PlayState* play) {
func_80B9F86C(this);
- if (play->msgCtx.ocarinaMode == 3) {
+ if (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) {
play->msgCtx.msgLength = 0;
this->actionFunc = func_80B9FDDC;
func_80B9FC70(this, 0);
@@ -331,7 +331,7 @@ void func_80B9FE5C(EnZob* this, PlayState* play) {
void func_80B9FF20(EnZob* this, PlayState* play) {
func_80B9F86C(this);
if (Message_GetState(&play->msgCtx) == TEXT_STATE_7) {
- func_80152434(play, 0x42);
+ Message_DisplayOcarinaStaff(play, OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF);
this->actionFunc = func_80B9FE5C;
func_80B9FC70(this, 2);
}
@@ -339,11 +339,11 @@ void func_80B9FF20(EnZob* this, PlayState* play) {
void func_80B9FF80(EnZob* this, PlayState* play) {
func_80B9F86C(this);
- if (play->msgCtx.ocarinaMode == 3) {
+ if (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) {
this->actionFunc = func_80B9FF20;
this->unk_304 = 6;
func_80B9F7E4(this, 1, ANIMMODE_LOOP);
- func_80152434(play, 0x3E);
+ Message_DisplayOcarinaStaff(play, OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_FIRST_HALF);
func_80B9FC70(this, 1);
} else if (Message_GetState(&play->msgCtx) == TEXT_STATE_11) {
play->msgCtx.msgLength = 0;
@@ -357,7 +357,7 @@ void func_80B9FF80(EnZob* this, PlayState* play) {
void func_80BA005C(EnZob* this, PlayState* play) {
func_80B9F86C(this);
if (Message_GetState(&play->msgCtx) == TEXT_STATE_7) {
- func_80152434(play, 0x41);
+ Message_DisplayOcarinaStaff(play, OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF);
this->actionFunc = func_80B9FF80;
func_80B9FC70(this, 2);
}
@@ -371,15 +371,15 @@ void func_80BA00BC(EnZob* this, PlayState* play) {
if (Message_ShouldAdvance(play) && (play->msgCtx.currentTextId == 0x1212)) {
switch (play->msgCtx.choiceIndex) {
case 1:
- func_8019F208();
- func_80151938(play, 0x1209);
+ Audio_PlaySfx_MessageDecide();
+ Message_ContinueTextbox(play, 0x1209);
this->unk_304 = 1;
func_80B9F7E4(this, 2, ANIMMODE_ONCE);
break;
case 0:
- func_8019F230();
- func_80151938(play, 0x1213);
+ Audio_PlaySfx_MessageCancel();
+ Message_ContinueTextbox(play, 0x1213);
break;
}
}
@@ -391,7 +391,7 @@ void func_80BA00BC(EnZob* this, PlayState* play) {
case 0x1208:
case 0x120E:
case 0x1216:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x120C:
@@ -405,7 +405,7 @@ void func_80BA00BC(EnZob* this, PlayState* play) {
case 0x1211:
case 0x1213:
case 0x1217:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
this->unk_304 = 3;
func_80B9F7E4(this, 4, ANIMMODE_ONCE);
break;
@@ -426,7 +426,7 @@ void func_80BA00BC(EnZob* this, PlayState* play) {
break;
case 0x1209:
- func_80152434(play, 0x3D);
+ Message_DisplayOcarinaStaff(play, OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_FIRST_HALF);
this->unk_304 = 4;
func_80B9F7E4(this, 0, ANIMMODE_LOOP);
this->actionFunc = func_80BA005C;
@@ -439,7 +439,7 @@ void func_80BA00BC(EnZob* this, PlayState* play) {
}
void func_80BA0318(EnZob* this, PlayState* play) {
- func_80152434(play, 0x3D);
+ Message_DisplayOcarinaStaff(play, OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_FIRST_HALF);
this->unk_304 = 4;
func_80B9F7E4(this, 0, ANIMMODE_LOOP);
this->actionFunc = func_80BA005C;
@@ -456,14 +456,14 @@ void func_80BA0374(EnZob* this, PlayState* play) {
if (Message_ShouldAdvance(play) && (play->msgCtx.currentTextId == 0x1205)) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
- func_80151938(play, 0x1207);
+ Audio_PlaySfx_MessageDecide();
+ Message_ContinueTextbox(play, 0x1207);
func_80B9F7E4(this, 2, ANIMMODE_ONCE);
break;
case 1:
- func_8019F230();
- func_80151938(play, 0x1206);
+ Audio_PlaySfx_MessageCancel();
+ Message_ContinueTextbox(play, 0x1206);
break;
}
}
@@ -474,11 +474,11 @@ void func_80BA0374(EnZob* this, PlayState* play) {
switch (play->msgCtx.currentTextId) {
case 0x11F8:
SET_WEEKEVENTREG(WEEKEVENTREG_30_02);
- func_80151938(play, 0x11F9);
+ Message_ContinueTextbox(play, 0x11F9);
break;
case 0x11F9:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80BA0728;
this->unk_304 = 0;
func_80B9F7E4(this, 6, ANIMMODE_ONCE);
@@ -490,19 +490,19 @@ void func_80BA0374(EnZob* this, PlayState* play) {
case 0x11FF:
case 0x1201:
case 0x1203:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x11FD:
this->unk_304 = 3;
func_80B9F7E4(this, 4, ANIMMODE_ONCE);
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x11FE:
this->unk_304 = 1;
func_80B9F7E4(this, 3, ANIMMODE_LOOP);
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x11FA:
@@ -513,7 +513,7 @@ void func_80BA0374(EnZob* this, PlayState* play) {
case 0x120F:
case 0x1210:
case 0x1215:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80BA0728;
this->unk_304 = 0;
func_80B9F7E4(this, 6, ANIMMODE_ONCE);
@@ -522,7 +522,7 @@ void func_80BA0374(EnZob* this, PlayState* play) {
break;
case 0x1207:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80BA0318;
player->unk_A90 = &this->actor;
player->stateFlags3 |= PLAYER_STATE3_20;
@@ -543,13 +543,13 @@ void func_80BA0610(EnZob* this, PlayState* play) {
func_80B9FC70(this, 0);
this->actionFunc = func_80BA00BC;
} else {
- func_800B8614(&this->actor, play, 500.0f);
+ Actor_OfferTalk(&this->actor, play, 500.0f);
}
}
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);
@@ -563,7 +563,7 @@ void func_80BA0728(EnZob* this, PlayState* play) {
func_80B9F86C(this);
if (func_800B8718(&this->actor, &play->state)) {
- if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
Message_StartTextbox(play, 0x1208, NULL);
SET_WEEKEVENTREG(WEEKEVENTREG_30_08);
} else {
@@ -572,29 +572,29 @@ 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)) {
- func_800B8614(&this->actor, play, 150.0f);
+ Actor_OfferTalk(&this->actor, play, 150.0f);
func_800B874C(&this->actor, play, 200.0f, 150.0f);
}
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) {
s32 textId;
- if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_79_01)) {
textId = 0x1257;
this->unk_304 = 3;
@@ -630,7 +630,7 @@ void func_80BA0A04(EnZob* this, PlayState* play) {
switch (Message_GetState(&play->msgCtx)) {
case TEXT_STATE_5:
if (Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80BA0AD8;
this->unk_304 = 0;
func_80B9F7E4(this, 6, ANIMMODE_ONCE);
@@ -658,7 +658,7 @@ void func_80BA0AD8(EnZob* this, PlayState* play) {
func_80BA08E8(this, play);
} else if ((this->actor.xzDistToPlayer < 120.0f) && Player_IsFacingActor(&this->actor, 0x3000, play) &&
Actor_IsFacingPlayer(&this->actor, 0x3000)) {
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
}
}
@@ -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 8d8065ff6..5d352e734 100644
--- a/src/overlays/actors/ovl_En_Zod/z_en_zod.c
+++ b/src/overlays/actors/ovl_En_Zod/z_en_zod.c
@@ -6,7 +6,7 @@
#include "z_en_zod.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnZod*)thisx)
@@ -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;
@@ -154,21 +154,21 @@ void EnZod_Destroy(Actor* thisx, PlayState* play) {
void EnZod_HandleRoomConversation(EnZod* this, PlayState* play) {
u16 textId;
- if (gSaveContext.save.playerForm != PLAYER_FORM_ZORA) {
+ if (GET_PLAYER_FORM != 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;
}
@@ -315,13 +315,13 @@ void func_80BAF7CC(EnZod* this, PlayState* play) {
if (Message_ShouldAdvance(play) && (play->msgCtx.currentTextId == 0x121F)) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
- func_80151938(play, 0x1220);
+ Audio_PlaySfx_MessageDecide();
+ Message_ContinueTextbox(play, 0x1220);
break;
case 1:
- func_8019F230();
- func_80151938(play, 0x1223);
+ Audio_PlaySfx_MessageCancel();
+ Message_ContinueTextbox(play, 0x1223);
break;
}
}
@@ -336,32 +336,32 @@ void func_80BAF7CC(EnZod* this, PlayState* play) {
case 0x1220:
case 0x1221:
case 0x1227:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x1219:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
this->nextAnimIndex = ENZOD_ANIM_ARMS_FOLDED;
break;
case 0x121D:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
this->nextAnimIndex = ENZOD_ANIM_READY_TO_PLAY;
break;
case 0x1223:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
this->nextAnimIndex = ENZOD_ANIM_PLAYING_VIVACE;
break;
case 0x121E:
case 0x1226:
- func_80151938(play, 0x121F);
+ Message_ContinueTextbox(play, 0x121F);
this->nextAnimIndex = ENZOD_ANIM_READY_TO_PLAY;
break;
default:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = EnZod_PlayDrumsSequence;
EnZod_ChangeAnim(this, ENZOD_ANIM_PLAYING_LENTO, ANIMMODE_ONCE);
break;
@@ -380,28 +380,28 @@ void EnZod_PlayDrumsSequence(EnZod* this, PlayState* play) {
EnZod_HandleRoomConversation(this, play);
this->actionFunc = func_80BAF7CC;
} else if (EnZod_PlayerIsFacingTijo(this, play)) {
- func_800B8614(&this->actor, play, 210.0f);
+ Actor_OfferTalk(&this->actor, play, 210.0f);
}
seqPos.x = this->actor.projectedPos.x;
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 (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
+ 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 {
@@ -419,7 +419,7 @@ void func_80BAFADC(EnZod* this, PlayState* play) {
talkState = Message_GetState(&play->msgCtx);
if (talkState != TEXT_STATE_CLOSING) {
if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80BAFB84;
EnZod_ChangeAnim(this, ENZOD_ANIM_PLAYING_LENTO, ANIMMODE_ONCE);
}
@@ -436,7 +436,7 @@ void func_80BAFB84(EnZod* this, PlayState* play) {
func_80BAFA44(this, play);
this->actionFunc = func_80BAFADC;
} else if (EnZod_PlayerIsFacingTijo(this, play)) {
- func_800B8614(&this->actor, play, 210.0f);
+ Actor_OfferTalk(&this->actor, play, 210.0f);
}
}
@@ -445,46 +445,46 @@ 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);
}
}
void EnZod_SetupRehearse(EnZod* this, PlayState* play) {
EnZod_UpdateAnimation(this);
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(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;
- Audio_QueueSeqCmd(NA_BGM_INDIGO_GO_SESSION | 0x8000);
+ 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);
- func_800B7298(play, NULL, 0x44);
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_Start(this->actor.csId, &this->actor);
+ func_800B7298(play, NULL, PLAYER_CSMODE_68);
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 a165d91fe..92fa313a6 100644
--- a/src/overlays/actors/ovl_En_Zog/z_en_zog.c
+++ b/src/overlays/actors/ovl_En_Zog/z_en_zog.c
@@ -7,7 +7,7 @@
#include "z_en_zog.h"
#include "objects/object_zog/object_zog.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnZog*)thisx)
@@ -173,7 +173,7 @@ void func_80B93468(EnZog* this, PlayState* play) {
this->actor.world.pos.x = points[-1].x;
this->actor.world.pos.z = points[-1].z;
this->actor.world.rot.y = Math_Atan2S(points->x - this->actor.world.pos.x, points->z - this->actor.world.pos.z);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
}
}
@@ -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,14 +458,14 @@ 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) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_JUMP_SAND);
+ 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;
}
}
@@ -606,14 +606,14 @@ void func_80B943EC(EnZog* this, PlayState* play) {
}
} else if ((player->stateFlags2 & PLAYER_STATE2_8000000) && (this->actor.xzDistToPlayer < 120.0f)) {
this->unk_30A |= 0x10;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
+ Actor_PlaySfx(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
}
}
void func_80B94470(EnZog* this, PlayState* play) {
if (Message_GetState(&play->msgCtx) == TEXT_STATE_5) {
if (Message_ShouldAdvance(play) && (play->msgCtx.currentTextId == 0x103C)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80B9451C;
this->unk_300 = this->unk_302 = 0;
this->unk_31C = 2;
@@ -627,15 +627,14 @@ void func_80B9451C(EnZog* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->unk_300 = 2;
this->actionFunc = func_80B94470;
- } else if ((play->msgCtx.ocarinaMode == 3) && (this->actor.xzDistToPlayer < 120.0f)) {
- if ((play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING) &&
- (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN)) {
+ } else if ((play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) && (this->actor.xzDistToPlayer < 120.0f)) {
+ if ((play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING) && (GET_PLAYER_FORM == PLAYER_FORM_HUMAN)) {
func_80B93BA8(this, 2);
this->actionFunc = func_80B943C0;
this->actor.shape.shadowDraw = NULL;
}
} else if (this->actor.xzDistToPlayer < 120.0f) {
- func_800B8614(&this->actor, play, 150.0f);
+ Actor_OfferTalk(&this->actor, play, 150.0f);
}
func_80B943EC(this, play);
}
@@ -657,7 +656,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;
}
}
@@ -667,15 +666,15 @@ void func_80B946FC(EnZog* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
play->msgCtx.msgLength = 0;
this->actionFunc = func_80B946B4;
func_80B93BA8(this, 1);
break;
case 1:
- func_8019F230();
- func_80151938(play, 0x1014);
+ Audio_PlaySfx_MessageCancel();
+ Message_ContinueTextbox(play, 0x1014);
break;
}
}
@@ -685,20 +684,20 @@ void func_80B946FC(EnZog* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
switch (play->msgCtx.currentTextId) {
case 0x1008:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x1009:
this->unk_300 = 4;
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x1014:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x1015:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80B948A8;
this->unk_300 = this->unk_302 = 0;
this->unk_31C = 2;
@@ -716,9 +715,8 @@ void func_80B948A8(EnZog* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->unk_300 = 2;
this->actionFunc = func_80B946FC;
- } else if ((play->msgCtx.ocarinaMode == 3) && (this->actor.xzDistToPlayer < 120.0f)) {
- if ((play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING) &&
- (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN)) {
+ } else if ((play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) && (this->actor.xzDistToPlayer < 120.0f)) {
+ if ((play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING) && (GET_PLAYER_FORM == PLAYER_FORM_HUMAN)) {
func_80B93BA8(this, 2);
this->actionFunc = func_80B943C0;
this->actor.shape.shadowDraw = NULL;
@@ -734,7 +732,7 @@ void func_80B948A8(EnZog* this, PlayState* play) {
}
if ((this->unk_302 == 0) && (this->actor.xzDistToPlayer < 120.0f)) {
- func_800B8614(&this->actor, play, 150.0f);
+ Actor_OfferTalk(&this->actor, play, 150.0f);
}
}
func_80B93A48(this, play);
@@ -762,9 +760,9 @@ void func_80B94A00(EnZog* this, PlayState* play) {
if ((this->skelAnime.curFrame >= 35.0f) ||
((this->skelAnime.curFrame >= 10.0f) && (this->skelAnime.curFrame <= 24.0f))) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
} else {
- this->actor.speedXZ = 1.5f;
+ this->actor.speed = 1.5f;
}
if ((this->actor.depthInWater > 0.0f) && ((play->gameplayFrames % 8) == 0)) {
@@ -781,21 +779,21 @@ 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_PlaySfxAtPos(&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_PlaySfxAtPos(&this->actor, NA_SE_PL_WALK_WATER0);
+ Actor_PlaySfx(&this->actor, NA_SE_PL_WALK_GROUND + SURFACE_SFX_OFFSET_WATER_SHALLOW);
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_PL_WALK_SAND);
+ Actor_PlaySfx(&this->actor, NA_SE_PL_WALK_GROUND + SURFACE_SFX_OFFSET_SAND);
}
}
}
void func_80B94C5C(EnZog* this, PlayState* play) {
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->unk_304 != 0) {
if (this->actor.shape.yOffset > 0.0f) {
this->actor.shape.yOffset -= 20.0f;
@@ -818,7 +816,7 @@ void func_80B94C5C(EnZog* this, PlayState* play) {
void func_80B94D0C(EnZog* this, PlayState* play) {
func_80B93D2C(this, play);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
if (this->unk_320 > 0) {
this->unk_320--;
this->unk_31C = 1;
@@ -834,11 +832,11 @@ void func_80B94D0C(EnZog* this, PlayState* play) {
case 0x1004:
case 0x1005:
case 0x1006:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x1007:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80B94E34;
this->unk_300 = 5;
this->unk_320 = 0;
@@ -857,33 +855,33 @@ void func_80B94E34(EnZog* this, PlayState* play) {
func_80B93D2C(this, play);
func_80B93BE0(this, play);
- if (this->actor.speedXZ < 0.1f) {
- this->actor.speedXZ = 0.0f;
+ if (this->actor.speed < 0.1f) {
+ this->actor.speed = 0.0f;
} else {
- if (this->actor.speedXZ > 0.1f) {
+ if (this->actor.speed > 0.1f) {
WaterBox* sp44;
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,
- Rand_ZeroFloat(this->actor.speedXZ * 40.0f) + (this->actor.speedXZ * 60.0f));
+ Rand_ZeroFloat(this->actor.speed * 40.0f) + (this->actor.speed * 60.0f));
}
- if ((player->actor.speedXZ > 3.0f) && (this->unk_324 == 0)) {
+ if ((player->actor.speed > 3.0f) && (this->unk_324 == 0)) {
this->unk_324 = 25;
- func_800B8E58(player, player->ageProperties->voiceSfxIdOffset + NA_SE_VO_LI_PUSH);
+ Player_PlaySfx(player, player->ageProperties->voiceSfxIdOffset + NA_SE_VO_LI_PUSH);
}
}
- this->actor.speedXZ *= 0.3f;
+ this->actor.speed *= 0.3f;
}
if (ABS_ALT(this->actor.yawTowardsPlayer - this->actor.world.rot.y) > 0x5000) {
- Actor_PickUp(&this->actor, play, GI_NONE, 60.0f, 40.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_NONE, 60.0f, 40.0f);
}
if (this->unk_324 > 0) {
@@ -892,12 +890,12 @@ void func_80B94E34(EnZog* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actionFunc = func_80B94D0C;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->unk_300 = 2;
- } else if (this->actor.bgCheckFlags & 1) {
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->actor.home.rot.z = 1;
this->actionFunc = func_80B94C5C;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->unk_2FE = 1;
this->actor.velocity.y = 0.0f;
this->actor.terminalVelocity = 0.0f;
@@ -908,7 +906,7 @@ void func_80B94E34(EnZog* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_88_10);
} else if ((this->actor.yawTowardsPlayer > 16000) && (this->actor.yawTowardsPlayer < 32000) &&
(this->unk_302 == 0)) {
- func_800B8614(&this->actor, play, 150.0f);
+ Actor_OfferTalk(&this->actor, play, 150.0f);
}
this->actor.shape.rot.y = this->actor.world.rot.y;
@@ -922,7 +920,7 @@ void func_80B95128(EnZog* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actionFunc = func_80B94D0C;
this->unk_300 = 2;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
switch (CURRENT_DAY) {
case 1:
@@ -941,7 +939,7 @@ void func_80B95128(EnZog* this, PlayState* play) {
this->actor.flags &= ~ACTOR_FLAG_10000;
SET_WEEKEVENTREG(WEEKEVENTREG_91_01);
} else {
- func_800B8614(&this->actor, play, 150.0f);
+ Actor_OfferTalk(&this->actor, play, 150.0f);
}
this->actor.shape.rot.y = this->actor.world.rot.y;
func_80B93A48(this, play);
@@ -956,8 +954,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;
}
@@ -966,7 +964,7 @@ void EnZog_Update(Actor* thisx, PlayState* play) {
if (((this->unk_304 == 6) && Animation_OnFrame(&this->skelAnime, 43.0f)) ||
((this->unk_304 == 17) && Animation_OnFrame(&this->skelAnime, 14.0f))) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_LAND_SAND);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_LAND_SAND);
}
if (this->unk_30A & 1) {
@@ -982,18 +980,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 +1047,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 +1066,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 2f6f0e791..6440493cf 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,
@@ -95,15 +98,15 @@ void EnZoraegg_Init(Actor* thisx, PlayState* play) {
this->actor.terminalVelocity = -10.0f;
this->actor.gravity = -5.0f;
- switch (ENZORAEGG_GET_1F(&this->actor)) {
- case ENZORAEGG_1F_00:
- if (Flags_GetSwitch(play, ENZORAEGG_GET_FE00(&this->actor))) {
+ switch (ZORA_EGG_GET_TYPE(&this->actor)) {
+ case ZORA_EGG_TYPE_00:
+ if (Flags_GetSwitch(play, ZORA_EGG_GET_SWITCH_FLAG(&this->actor))) {
Actor_Kill(&this->actor);
return;
}
break;
- case ENZORAEGG_1F_11:
+ case ZORA_EGG_TYPE_11:
if (func_80B319A8(play) >= 7) {
Actor_Kill(&this->actor);
this->actor.home.rot.z = 1;
@@ -111,26 +114,26 @@ void EnZoraegg_Init(Actor* thisx, PlayState* play) {
}
break;
- case ENZORAEGG_1F_03:
- case ENZORAEGG_1F_04:
- case ENZORAEGG_1F_05:
- case ENZORAEGG_1F_06:
- case ENZORAEGG_1F_07:
- case ENZORAEGG_1F_08:
- case ENZORAEGG_1F_09:
+ case ZORA_EGG_TYPE_03:
+ case ZORA_EGG_TYPE_04:
+ case ZORA_EGG_TYPE_05:
+ case ZORA_EGG_TYPE_06:
+ case ZORA_EGG_TYPE_07:
+ case ZORA_EGG_TYPE_08:
+ case ZORA_EGG_TYPE_09:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_19_40)) {
Actor_Kill(&this->actor);
return;
}
break;
- case ENZORAEGG_1F_0A:
- case ENZORAEGG_1F_0B:
- case ENZORAEGG_1F_0C:
- case ENZORAEGG_1F_0D:
- case ENZORAEGG_1F_0E:
- case ENZORAEGG_1F_0F:
- case ENZORAEGG_1F_10:
+ case ZORA_EGG_TYPE_0A:
+ case ZORA_EGG_TYPE_0B:
+ case ZORA_EGG_TYPE_0C:
+ case ZORA_EGG_TYPE_0D:
+ case ZORA_EGG_TYPE_0E:
+ case ZORA_EGG_TYPE_0F:
+ case ZORA_EGG_TYPE_10:
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_19_40)) {
Actor_Kill(&this->actor);
return;
@@ -138,50 +141,50 @@ void EnZoraegg_Init(Actor* thisx, PlayState* play) {
break;
}
- switch (ENZORAEGG_GET_1F(&this->actor)) {
- case ENZORAEGG_1F_00:
+ switch (ZORA_EGG_GET_TYPE(&this->actor)) {
+ case ZORA_EGG_TYPE_00:
this->actionFunc = func_80B320E0;
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
- this->actor.targetMode = 3;
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
+ this->actor.targetMode = TARGET_MODE_3;
break;
- case ENZORAEGG_1F_01:
+ case ZORA_EGG_TYPE_01:
this->actionFunc = func_80B322BC;
func_80B31590(this);
break;
- case ENZORAEGG_1F_02:
+ case ZORA_EGG_TYPE_02:
this->actionFunc = func_80B32390;
func_80B31590(this);
break;
- case ENZORAEGG_1F_03:
- case ENZORAEGG_1F_04:
- case ENZORAEGG_1F_05:
- case ENZORAEGG_1F_06:
- case ENZORAEGG_1F_07:
- case ENZORAEGG_1F_08:
- case ENZORAEGG_1F_09:
- this->actorActionCmd = sp40[(ENZORAEGG_GET_1F(&this->actor)) - ENZORAEGG_1F_03];
+ case ZORA_EGG_TYPE_03:
+ case ZORA_EGG_TYPE_04:
+ case ZORA_EGG_TYPE_05:
+ case ZORA_EGG_TYPE_06:
+ case ZORA_EGG_TYPE_07:
+ case ZORA_EGG_TYPE_08:
+ case ZORA_EGG_TYPE_09:
+ this->cueType = cueTypes[ZORA_EGG_GET_TYPE(&this->actor) - ZORA_EGG_TYPE_03];
Animation_PlayOnce(&this->skelAnime, &object_zoraegg_Anim_001E08);
this->unk_1EC = 1;
this->unk_1EE = 0;
this->unk_1EF = 0;
this->actionFunc = func_80B32B10;
- if (((ENZORAEGG_GET_1F(&this->actor)) - ENZORAEGG_1F_03) >= func_80B319A8(play)) {
+ if ((ZORA_EGG_GET_TYPE(&this->actor) - ZORA_EGG_TYPE_03) >= func_80B319A8(play)) {
this->actionFunc = func_80B32B3C;
this->actor.draw = NULL;
}
break;
- case ENZORAEGG_1F_0A:
- case ENZORAEGG_1F_0B:
- case ENZORAEGG_1F_0C:
- case ENZORAEGG_1F_0D:
- case ENZORAEGG_1F_0E:
- case ENZORAEGG_1F_0F:
- case ENZORAEGG_1F_10:
- this->actorActionCmd = sp40[(ENZORAEGG_GET_1F(&this->actor)) - ENZORAEGG_1F_0A];
+ case ZORA_EGG_TYPE_0A:
+ case ZORA_EGG_TYPE_0B:
+ case ZORA_EGG_TYPE_0C:
+ case ZORA_EGG_TYPE_0D:
+ case ZORA_EGG_TYPE_0E:
+ case ZORA_EGG_TYPE_0F:
+ case ZORA_EGG_TYPE_10:
+ this->cueType = cueTypes[ZORA_EGG_GET_TYPE(&this->actor) - ZORA_EGG_TYPE_0A];
this->unk_1EC = 2;
this->actionFunc = func_80B324B0;
Animation_PlayLoop(&this->skelAnime, &object_zoraegg_Anim_004FE4);
@@ -190,7 +193,7 @@ void EnZoraegg_Init(Actor* thisx, PlayState* play) {
this->unk_1EA |= 3;
break;
- case ENZORAEGG_1F_11:
+ case ZORA_EGG_TYPE_11:
Actor_SetScale(&this->actor, 0.0006f);
this->actionFunc = func_80B32D08;
this->actor.world.pos.y -= this->actor.shape.yOffset * this->actor.scale.y;
@@ -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,14 +247,14 @@ 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) {
Actor* actor = play->actorCtx.actorLists[ACTORCAT_ITEMACTION].first;
while (actor != NULL) {
- if ((actor->id == ACTOR_EN_ZORAEGG) && (ENZORAEGG_GET_1F(actor) == ENZORAEGG_1F_11) &&
+ if ((actor->id == ACTOR_EN_ZORAEGG) && (ZORA_EGG_GET_TYPE(actor) == ZORA_EGG_TYPE_11) &&
(actor->home.rot.z == 0)) {
actor->home.rot.z = 1;
return actor;
@@ -265,7 +268,7 @@ Actor* func_80B31D14(PlayState* play) {
Actor* actor = play->actorCtx.actorLists[ACTORCAT_ITEMACTION].first;
while (actor != NULL) {
- if ((actor->id == ACTOR_EN_ZORAEGG) && (ENZORAEGG_GET_1F(actor) == ENZORAEGG_1F_03)) {
+ if ((actor->id == ACTOR_EN_ZORAEGG) && (ZORA_EGG_GET_TYPE(actor) == ZORA_EGG_TYPE_03)) {
return actor;
}
actor = actor->next;
@@ -318,7 +321,7 @@ void func_80B31E00(EnZoraegg* this) {
}
if ((this->unk_1E8 == 111) || (this->unk_1E8 == 32)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_ZORA_KIDS_BORN);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_ZORA_KIDS_BORN);
}
}
@@ -334,25 +337,25 @@ void func_80B32094(EnZoraegg* this, PlayState* play) {
void func_80B320E0(EnZoraegg* this, PlayState* play) {
if (Actor_HasParent(&this->actor, play)) {
- Flags_SetSwitch(play, ENZORAEGG_GET_FE00(&this->actor));
+ Flags_SetSwitch(play, ZORA_EGG_GET_SWITCH_FLAG(&this->actor));
Actor_Kill(&this->actor);
} else if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actionFunc = func_80B32094;
Message_StartTextbox(play, 0x24B, &this->actor);
} else {
- Actor_PickUp(&this->actor, play, GI_MAX, 80.0f, 60.0f);
- if (this->actor.isTargeted) {
- func_800B8614(&this->actor, play, 110.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_MAX, 80.0f, 60.0f);
+ if (this->actor.isLockedOn) {
+ Actor_OfferTalk(&this->actor, play, 110.0f);
}
}
- this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
- this->actor.targetMode = 3;
+ this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY);
+ this->actor.targetMode = TARGET_MODE_3;
func_80B31C40(this, 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,32 +415,32 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_EV_ZORA_KIDS_SWIM_1);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_ZORA_KIDS_SWIM_1);
this->unk_1E4 = Rand_ZeroFloat(5.0f);
}
} else if (this->unk_1EA & 4) {
@@ -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;
@@ -478,13 +481,13 @@ void func_80B326F4(EnZoraegg* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_19_40);
this->unk_1EC = 2;
this->unk_1EE = 100;
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_ZORA_KIDS_SWIM_2);
+ 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_PlaySfxAtPos(&this->actor, NA_SE_EV_ZORA_KIDS_SWIM_1);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_ZORA_KIDS_SWIM_1);
}
}
@@ -504,10 +507,10 @@ 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_PlaySfxAtPos(&this->actor, NA_SE_EV_ZORA_KIDS_SWIM_0);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_ZORA_KIDS_SWIM_0);
}
}
@@ -538,17 +541,17 @@ 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)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_ZORA_KIDS_SWIM_1);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_ZORA_KIDS_SWIM_1);
}
}
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);
}
}
@@ -579,11 +582,11 @@ void func_80B32BB8(EnZoraegg* this, PlayState* play) {
func_80B31C40(this, play);
func_80B31D64(this, play, 13, 0.0f);
- if (this->actor.bgCheckFlags & 0x1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->actionFunc = func_80B32B70;
}
- if (Cutscene_CheckActorAction(play, 0x1C9)) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_457)) {
Actor_Kill(&this->actor);
}
}
@@ -627,7 +630,7 @@ void func_80B32D08(EnZoraegg* this, PlayState* play) {
EffectSsGRipple_Spawn(play, &sp34, 150, 500, 0);
EffectSsGSplash_Spawn(play, &sp34, NULL, NULL, 0, 200);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_DIVE_INTO_WATER_L);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_DIVE_INTO_WATER_L);
this->actionFunc = func_80B32C34;
this->actor.velocity.y = -1.0f;
@@ -694,10 +697,11 @@ 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);
- gSPSetOtherMode(gfx++, G_SETOTHERMODE_H, 4, 4, 0x00000080);
+ gfx = POLY_XLU_DISP;
+ gfx = Gfx_SetupDL20_NoCD(gfx);
+
+ gDPSetDither(gfx++, G_CD_NOISE);
gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0);
gSPDisplayList(gfx++, gameplay_keep_DL_029CB0);
@@ -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..84fce59df 100644
--- a/src/overlays/actors/ovl_En_Zoraegg/z_en_zoraegg.h
+++ b/src/overlays/actors/ovl_En_Zoraegg/z_en_zoraegg.h
@@ -7,37 +7,39 @@ struct EnZoraegg;
typedef void (*EnZoraeggActionFunc)(struct EnZoraegg*, PlayState*);
-#define ENZORAEGG_GET_1F(thisx) ((thisx)->params & 0x1F)
-#define ENZORAEGG_GET_FE00(thisx) (((thisx)->params & 0xFE00) >> 9)
+#define ZORA_EGG_GET_TYPE(thisx) ((thisx)->params & 0x1F)
+#define ZORA_EGG_GET_SWITCH_FLAG(thisx) (((thisx)->params & 0xFE00) >> 9)
-enum {
- /* 0x00 */ ENZORAEGG_1F_00,
- /* 0x01 */ ENZORAEGG_1F_01,
- /* 0x02 */ ENZORAEGG_1F_02,
- /* 0x03 */ ENZORAEGG_1F_03,
- /* 0x04 */ ENZORAEGG_1F_04,
- /* 0x05 */ ENZORAEGG_1F_05,
- /* 0x06 */ ENZORAEGG_1F_06,
- /* 0x07 */ ENZORAEGG_1F_07,
- /* 0x08 */ ENZORAEGG_1F_08,
- /* 0x09 */ ENZORAEGG_1F_09,
- /* 0x0A */ ENZORAEGG_1F_0A,
- /* 0x0B */ ENZORAEGG_1F_0B,
- /* 0x0C */ ENZORAEGG_1F_0C,
- /* 0x0D */ ENZORAEGG_1F_0D,
- /* 0x0E */ ENZORAEGG_1F_0E,
- /* 0x0F */ ENZORAEGG_1F_0F,
- /* 0x10 */ ENZORAEGG_1F_10,
- /* 0x11 */ ENZORAEGG_1F_11,
- /* 0x12 */ ENZORAEGG_1F_12,
- /* 0x13 */ ENZORAEGG_1F_13,
- /* 0x14 */ ENZORAEGG_1F_14,
- /* 0x15 */ ENZORAEGG_1F_15,
- /* 0x16 */ ENZORAEGG_1F_16,
- /* 0x17 */ ENZORAEGG_1F_17,
- /* 0x18 */ ENZORAEGG_1F_18,
- /* 0x19 */ ENZORAEGG_1F_19,
-};
+#define ZORA_EGG_PARAMS(type, switchFlag) (((type) & 0x1F) | (((switchFlag) & 0x7F) << 9))
+
+typedef enum {
+ /* 0x00 */ ZORA_EGG_TYPE_00,
+ /* 0x01 */ ZORA_EGG_TYPE_01,
+ /* 0x02 */ ZORA_EGG_TYPE_02,
+ /* 0x03 */ ZORA_EGG_TYPE_03,
+ /* 0x04 */ ZORA_EGG_TYPE_04,
+ /* 0x05 */ ZORA_EGG_TYPE_05,
+ /* 0x06 */ ZORA_EGG_TYPE_06,
+ /* 0x07 */ ZORA_EGG_TYPE_07,
+ /* 0x08 */ ZORA_EGG_TYPE_08,
+ /* 0x09 */ ZORA_EGG_TYPE_09,
+ /* 0x0A */ ZORA_EGG_TYPE_0A,
+ /* 0x0B */ ZORA_EGG_TYPE_0B,
+ /* 0x0C */ ZORA_EGG_TYPE_0C,
+ /* 0x0D */ ZORA_EGG_TYPE_0D,
+ /* 0x0E */ ZORA_EGG_TYPE_0E,
+ /* 0x0F */ ZORA_EGG_TYPE_0F,
+ /* 0x10 */ ZORA_EGG_TYPE_10,
+ /* 0x11 */ ZORA_EGG_TYPE_11,
+ /* 0x12 */ ZORA_EGG_TYPE_12,
+ /* 0x13 */ ZORA_EGG_TYPE_13,
+ /* 0x14 */ ZORA_EGG_TYPE_14,
+ /* 0x15 */ ZORA_EGG_TYPE_15,
+ /* 0x16 */ ZORA_EGG_TYPE_16,
+ /* 0x17 */ ZORA_EGG_TYPE_17,
+ /* 0x18 */ ZORA_EGG_TYPE_18,
+ /* 0x19 */ ZORA_EGG_TYPE_19
+} ZoraEggType;
typedef struct EnZoraegg {
/* 0x000 */ Actor actor;
@@ -53,7 +55,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 72de2024f..8a942ce17 100644
--- a/src/overlays/actors/ovl_En_Zos/z_en_zos.c
+++ b/src/overlays/actors/ovl_En_Zos/z_en_zos.c
@@ -6,7 +6,7 @@
#include "z_en_zos.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_2000000)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_2000000)
#define THIS ((EnZos*)thisx)
@@ -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;
@@ -138,7 +138,7 @@ static AnimationHeader* sAnimations[] = {
&gEvanLeanOnKeyboardAnim, // EN_ZOS_ANIM_LEAN_ON_KEYBOARD
&gEvanLeanOnKeyboardAndSighAnim, // EN_ZOS_ANIM_LEAN_ON_KEYBOARD_AND_SIGH
&gEvanHandsOnHipsAnim, // EN_ZOS_ANIM_HANDS_ON_HIPS
- &gEeanTalkFootTapAnim, // EN_ZOS_ANIM_TALK_FOOT_TAP
+ &gEvanTalkFootTapAnim, // EN_ZOS_ANIM_TALK_FOOT_TAP
&gEvanTalkLookDownAnim, // EN_ZOS_ANIM_TALK_LOOK_DOWN
&gEvanTalkArmsOutAnim, // EN_ZOS_ANIM_TALK_ARMS_OUT
&gEvanTalkHandsOnHipsAnim, // EN_ZOS_ANIM_TALK_HANDS_ON_HIPS
@@ -214,7 +214,7 @@ void func_80BBB0D4(EnZos* this, PlayState* play) {
void func_80BBB15C(EnZos* this, PlayState* play) {
s32 textId;
- if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
if (this->unk_2B6 & 8) {
textId = 0x1235;
EnZos_ChangeAnim(this, EN_ZOS_ANIM_TALK_HANDS_ON_HIPS, ANIMMODE_LOOP);
@@ -254,7 +254,7 @@ void func_80BBB2C4(EnZos* this, PlayState* play) {
this->actionFunc = func_80BBB8AC;
this->actor.flags &= ~ACTOR_FLAG_10000;
} else {
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
}
}
@@ -266,27 +266,27 @@ void func_80BBB354(EnZos* this, PlayState* play) {
this->actionFunc = func_80BBB2C4;
SET_WEEKEVENTREG(WEEKEVENTREG_39_20);
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
} else {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_39_20)) {
getItemId = GI_RUPEE_PURPLE;
} else {
getItemId = GI_HEART_PIECE;
}
- Actor_PickUp(&this->actor, play, getItemId, 10000.0f, 50.0f);
+ Actor_OfferGetItem(&this->actor, play, getItemId, 10000.0f, 50.0f);
}
}
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);
}
}
}
@@ -324,7 +324,7 @@ void func_80BBB574(EnZos* this, PlayState* play) {
if (func_80BBAFFC(this, play)) {
if (this->unk_2B6 & 0x20) {
this->unk_2B6 &= ~0x20;
- func_80151938(play, 0x124C);
+ Message_ContinueTextbox(play, 0x124C);
}
}
@@ -335,7 +335,7 @@ void func_80BBB574(EnZos* this, PlayState* play) {
play->msgCtx.msgLength = 0;
this->unk_2B6 |= 0x20;
} else {
- func_80151938(play, 0x124C);
+ Message_ContinueTextbox(play, 0x124C);
}
break;
@@ -348,11 +348,11 @@ void func_80BBB574(EnZos* this, PlayState* play) {
case 0x124D:
this->unk_2B6 &= ~0x10;
EnZos_ChangeAnim(this, EN_ZOS_ANIM_TALK_HANDS_ON_HIPS, ANIMMODE_LOOP);
- func_80151938(play, 0x124E);
+ Message_ContinueTextbox(play, 0x124E);
break;
case 0x124E:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80BBB354;
func_80BBB354(this, play);
break;
@@ -370,7 +370,7 @@ void func_80BBB718(EnZos* this, PlayState* play) {
itemAction = func_80123810(play);
if (itemAction > PLAYER_IA_NONE) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
if (itemAction == PLAYER_IA_BOTTLE_ZORA_EGG) {
player->actor.textId = 0x1232;
@@ -388,9 +388,9 @@ void func_80BBB718(EnZos* this, PlayState* play) {
this->actionFunc = func_80BBB8AC;
} else if (itemAction <= PLAYER_IA_MINUS1) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_39_08)) {
- func_80151938(play, 0x1241);
+ Message_ContinueTextbox(play, 0x1241);
} else {
- func_80151938(play, 0x1237);
+ Message_ContinueTextbox(play, 0x1237);
SET_WEEKEVENTREG(WEEKEVENTREG_39_08);
EnZos_ChangeAnim(this, EN_ZOS_ANIM_TALK_LOOK_DOWN, ANIMMODE_LOOP);
this->unk_2B6 |= 4;
@@ -414,91 +414,92 @@ 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;
+ if ((Message_GetState(&play->msgCtx) != TEXT_STATE_5) || !Message_ShouldAdvance(play)) {
+ return;
+ }
- case 0x1238:
- case 0x123A:
- case 0x123B:
- case 0x123C:
- case 0x123E:
- case 0x123F:
- func_80151938(play, play->msgCtx.currentTextId + 1);
- break;
+ switch (play->msgCtx.currentTextId) {
+ case 0x1237:
+ player->exchangeItemAction = PLAYER_IA_NONE;
+ // fallthrough
+ case 0x1238:
+ case 0x123A:
+ case 0x123B:
+ case 0x123C:
+ case 0x123E:
+ case 0x123F:
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
+ break;
- case 0x1244:
- this->unk_2B6 &= ~0x10;
- EnZos_ChangeAnim(this, EN_ZOS_ANIM_TALK_HANDS_ON_HIPS, ANIMMODE_LOOP);
- func_80151938(play, play->msgCtx.currentTextId + 1);
- break;
+ case 0x1244:
+ this->unk_2B6 &= ~0x10;
+ EnZos_ChangeAnim(this, EN_ZOS_ANIM_TALK_HANDS_ON_HIPS, ANIMMODE_LOOP);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
+ break;
- case 0x1232:
- case 0x1241:
- player->exchangeItemId = 0;
+ case 0x1232:
+ case 0x1241:
+ player->exchangeItemAction = PLAYER_IA_NONE;
+ // fallthrough
+ case 0x1239:
+ case 0x1246:
+ EnZos_ChangeAnim(this, EN_ZOS_ANIM_TALK_HANDS_ON_HIPS, ANIMMODE_LOOP);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
+ break;
- case 0x1239:
- case 0x1246:
- EnZos_ChangeAnim(this, EN_ZOS_ANIM_TALK_HANDS_ON_HIPS, ANIMMODE_LOOP);
- func_80151938(play, play->msgCtx.currentTextId + 1);
- break;
+ case 0x1233:
+ EnZos_ChangeAnim(this, EN_ZOS_ANIM_TALK_ARMS_OUT, ANIMMODE_LOOP);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
+ break;
- case 0x1233:
- EnZos_ChangeAnim(this, EN_ZOS_ANIM_TALK_ARMS_OUT, ANIMMODE_LOOP);
- func_80151938(play, play->msgCtx.currentTextId + 1);
- break;
+ case 0x1245:
+ case 0x1248:
+ EnZos_ChangeAnim(this, EN_ZOS_ANIM_TALK_FOOT_TAP, ANIMMODE_LOOP);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
+ break;
- case 0x1245:
- case 0x1248:
- EnZos_ChangeAnim(this, EN_ZOS_ANIM_TALK_FOOT_TAP, ANIMMODE_LOOP);
- func_80151938(play, play->msgCtx.currentTextId + 1);
- break;
+ case 0x1231:
+ Message_ContinueTextbox(play, 0xFF);
+ this->actionFunc = func_80BBB718;
+ break;
- case 0x1231:
- func_80151938(play, 0xFF);
- this->actionFunc = func_80BBB718;
- break;
+ case 0x1243:
+ case 0x1249:
+ EnZos_ChangeAnim(this, EN_ZOS_ANIM_HANDS_ON_HIPS, ANIMMODE_LOOP);
+ Message_CloseTextbox(play);
+ this->actionFunc = func_80BBBDE0;
+ this->unk_2B6 |= 1;
+ break;
- case 0x1243:
- case 0x1249:
- EnZos_ChangeAnim(this, EN_ZOS_ANIM_HANDS_ON_HIPS, ANIMMODE_LOOP);
- func_801477B4(play);
- this->actionFunc = func_80BBBDE0;
- this->unk_2B6 |= 1;
- break;
+ case 0x1234:
+ case 0x123D:
+ case 0x1242:
+ EnZos_ChangeAnim(this, EN_ZOS_ANIM_HANDS_ON_HIPS, ANIMMODE_LOOP);
+ Actor_ProcessTalkRequest(&this->actor, &play->state);
+ Message_CloseTextbox(play);
+ this->actionFunc = func_80BBBDE0;
+ this->unk_2B6 |= 1;
+ break;
- case 0x1234:
- case 0x123D:
- case 0x1242:
- EnZos_ChangeAnim(this, EN_ZOS_ANIM_HANDS_ON_HIPS, ANIMMODE_LOOP);
- Actor_ProcessTalkRequest(&this->actor, &play->state);
- func_801477B4(play);
- this->actionFunc = func_80BBBDE0;
- this->unk_2B6 |= 1;
- break;
+ case 0x1236:
+ EnZos_ChangeAnim(this, EN_ZOS_ANIM_HANDS_ON_HIPS, ANIMMODE_LOOP);
+ Message_CloseTextbox(play);
+ this->actionFunc = func_80BBBDE0;
+ this->unk_2B6 |= 1;
+ break;
- case 0x1236:
- EnZos_ChangeAnim(this, EN_ZOS_ANIM_HANDS_ON_HIPS, ANIMMODE_LOOP);
- func_801477B4(play);
- this->actionFunc = func_80BBBDE0;
- this->unk_2B6 |= 1;
- break;
-
- default:
- if (0) {}
- func_801477B4(play);
- this->actionFunc = func_80BBBDE0;
- this->unk_2B6 |= 1;
- break;
- }
+ default:
+ Message_CloseTextbox(play);
+ this->actionFunc = func_80BBBDE0;
+ this->unk_2B6 |= 1;
+ break;
}
}
void func_80BBBB84(EnZos* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actor.flags &= ~ACTOR_FLAG_10000;
- if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
Message_StartTextbox(play, 0x1248, &this->actor);
this->actionFunc = func_80BBB8AC;
EnZos_ChangeAnim(this, EN_ZOS_ANIM_TALK_HANDS_ON_HIPS, ANIMMODE_LOOP);
@@ -515,7 +516,7 @@ void func_80BBBB84(EnZos* this, PlayState* play) {
this->unk_2B6 |= 0x10;
}
} else {
- func_800B8614(&this->actor, play, 300.0f);
+ Actor_OfferTalk(&this->actor, play, 300.0f);
}
}
@@ -526,16 +527,16 @@ void func_80BBBCBC(EnZos* this, PlayState* play) {
Message_StartTextbox(play, 0x124D, &this->actor);
this->actionFunc = func_80BBB574;
} else {
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
}
}
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);
+ Actor_OfferTalkExchange(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
}
}
@@ -554,21 +555,21 @@ void func_80BBBDE0(EnZos* this, PlayState* play) {
func_80BBB0D4(this, play);
- if (play->msgCtx.ocarinaMode == 0x2A) {
- play->msgCtx.ocarinaMode = 4;
+ if (play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_FULL_EVAN_SONG) {
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
this->actionFunc = func_80BBBB84;
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
return;
}
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);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
}
if (!Actor_IsFacingPlayer(&this->actor, 0x4000) && (this->actor.xzDistToPlayer < 100.0f)) {
@@ -580,13 +581,13 @@ 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) {
u16 textId;
- if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_79_01)) {
textId = 0x125B;
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_78_80)) {
@@ -612,7 +613,7 @@ void func_80BBC070(EnZos* this, PlayState* play) {
case TEXT_STATE_5:
if (Message_ShouldAdvance(play)) {
EnZos_ChangeAnim(this, EN_ZOS_ANIM_HANDS_ON_HIPS, ANIMMODE_LOOP);
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80BBC14C;
this->unk_2B6 |= 1;
}
@@ -644,7 +645,7 @@ void func_80BBC14C(EnZos* this, PlayState* play) {
this->actionFunc = func_80BBC070;
func_80BBBFBC(this, play);
} else if (func_80BBAF5C(this, play)) {
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
}
}
@@ -673,8 +674,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;
}
@@ -686,8 +687,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;
}
}
@@ -699,7 +700,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);
@@ -736,7 +737,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 331a153df..57689ebd8 100644
--- a/src/overlays/actors/ovl_En_Zot/z_en_zot.c
+++ b/src/overlays/actors/ovl_En_Zot/z_en_zot.c
@@ -8,7 +8,7 @@
#include "z64snap.h"
#include "objects/object_zo/object_zo.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnZot*)thisx)
@@ -96,7 +96,7 @@ void EnZot_Init(Actor* thisx, PlayState* play2) {
this->unk_2F4 = 0;
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
this->actor.world.rot.z = this->actor.shape.rot.z = 0;
- this->actor.targetMode = 6;
+ this->actor.targetMode = TARGET_MODE_6;
this->actor.terminalVelocity = -4.0f;
this->actor.gravity = -4.0f;
@@ -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);
}
}
@@ -299,7 +300,7 @@ s32 func_80B96E5C(EnZot* this) {
temp_f14 = points->z - this->actor.world.pos.z;
this->actor.world.rot.y = Math_Atan2S(temp_f12, temp_f14);
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.world.rot.y, 2, 2000, 200);
- phi_f2 = SQ(this->actor.speedXZ) * SQ(3.0f);
+ phi_f2 = SQ(this->actor.speed) * SQ(3.0f);
if (this->unk_2D4 == 0) {
phi_f2 = SQ(20.0f);
@@ -360,7 +361,7 @@ void func_80B97100(EnZot* this, PlayState* play) {
void func_80B97110(EnZot* this, PlayState* play) {
u16 textId;
- if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
textId = 0x125F;
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_28_80)) {
textId = 0x1261;
@@ -383,14 +384,14 @@ void func_80B97194(EnZot* this, PlayState* play) {
switch (play->msgCtx.currentTextId) {
case 0x125C:
case 0x125F:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x125D:
case 0x125E:
case 0x1260:
case 0x1261:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80B97240;
break;
}
@@ -403,7 +404,7 @@ void func_80B97240(EnZot* this, PlayState* play) {
func_80B97110(this, play);
} else if ((this->actor.xzDistToPlayer < 100.0f) && Player_IsFacingActor(&this->actor, 0x3000, play) &&
Actor_IsFacingPlayer(&this->actor, 0x3000)) {
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
}
}
@@ -411,7 +412,7 @@ void func_80B972E8(EnZot* this, PlayState* play) {
u16 textId;
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_29_10)) {
- if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
textId = 0x126A;
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_29_01)) {
textId = 0x126D;
@@ -426,7 +427,7 @@ void func_80B972E8(EnZot* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_29_02);
}
}
- } else if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ } else if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
textId = 0x1265;
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_29_04)) {
textId = 0x1266;
@@ -454,42 +455,42 @@ void func_80B973BC(EnZot* this, PlayState* play) {
case 0x1270:
case 0x1273:
case 0x1274:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x1272:
- func_80151938(play, 0x126F);
+ Message_ContinueTextbox(play, 0x126F);
break;
case 0x126F:
Rupees_ChangeBy(90);
- func_80151938(play, 0x1270);
+ Message_ContinueTextbox(play, 0x1270);
break;
case 0x1275:
- if (gSaveContext.save.playerData.rupees < 10) {
- func_80151938(play, 0x1277);
+ if (gSaveContext.save.saveInfo.playerData.rupees < 10) {
+ Message_ContinueTextbox(play, 0x1277);
} else {
- func_80151938(play, 0x1278);
+ Message_ContinueTextbox(play, 0x1278);
Rupees_ChangeBy(-10);
}
break;
case 0x1276:
- func_80151938(play, 0x1275);
+ Message_ContinueTextbox(play, 0x1275);
break;
case 0x1271:
case 0x1277:
case 0x1278:
case 0x1279:
- func_801477B4(play);
+ Message_CloseTextbox(play);
func_80B965D0(this, 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);
}
}
}
@@ -516,7 +517,7 @@ void func_80B975F8(EnZot* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actionFunc = func_80B973BC;
} else {
- func_800B8500(&this->actor, play, 10000.0f, 1000.0f, PLAYER_IA_NONE);
+ Actor_OfferTalkExchange(&this->actor, play, 10000.0f, 1000.0f, PLAYER_IA_NONE);
}
}
@@ -530,10 +531,11 @@ void func_80B9765C(EnZot* this, PlayState* play) {
case 0x1267:
case 0x126A:
case 0x126B:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
+
default:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80B97708;
break;
}
@@ -563,12 +565,12 @@ void func_80B97708(EnZot* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_29_10);
this->actor.flags |= ACTOR_FLAG_10000;
if (phi_v1 == 5) {
- if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
this->actor.textId = 0x126E;
} else {
this->actor.textId = 0x1272;
}
- } else if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ } else if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
this->actor.textId = 0x1273;
} else {
this->actor.textId = 0x1276;
@@ -577,7 +579,7 @@ void func_80B97708(EnZot* this, PlayState* play) {
func_80B975F8(this, play);
this->actionFunc = func_80B975F8;
} else if (func_80B96DF0(this, play)) {
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
}
}
@@ -585,7 +587,7 @@ void func_80B9787C(EnZot* this, PlayState* play) {
u16 textId;
if (this->actor.textId == 0) {
- if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
switch (ENZOT_GET_1F(&this->actor)) {
case 2:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_37_40)) {
@@ -652,9 +654,9 @@ void func_80B979DC(EnZot* this, PlayState* play) {
if (func_80B96E5C(this)) {
this->actionFunc = func_80B97B5C;
func_80B96BEC(this, 0, ANIMMODE_LOOP);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
} else {
- this->actor.speedXZ = 1.5f;
+ this->actor.speed = 1.5f;
}
}
@@ -667,7 +669,7 @@ void func_80B97A44(EnZot* this, PlayState* play) {
case 0x1282:
case 0x1285:
case 0x1288:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x127D:
@@ -676,7 +678,7 @@ void func_80B97A44(EnZot* this, PlayState* play) {
case 0x1284:
case 0x1289:
case 0x128A:
- func_801477B4(play);
+ Message_CloseTextbox(play);
if (!(this->unk_2F2 & 2)) {
this->unk_2F2 |= 2;
this->actionFunc = func_80B979DC;
@@ -687,7 +689,7 @@ void func_80B97A44(EnZot* this, PlayState* play) {
break;
default:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80B97B5C;
break;
}
@@ -701,14 +703,14 @@ void func_80B97B5C(EnZot* this, PlayState* play) {
this->actionFunc = func_80B97A44;
func_80B9787C(this, play);
} else if (func_80B96DF0(this, play)) {
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
}
}
void func_80B97BF8(EnZot* this, PlayState* play) {
u16 textId;
- if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
textId = 0x128C;
} else {
textId = 0x128B;
@@ -720,7 +722,7 @@ void func_80B97C40(EnZot* this, PlayState* play) {
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 2, 0x800, 0x100);
this->actor.world.rot.y = this->actor.shape.rot.y;
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80B97CC8;
}
}
@@ -730,21 +732,21 @@ void func_80B97CC8(EnZot* this, PlayState* play) {
this->actionFunc = func_80B97C40;
Message_StartTextbox(play, 0x128B, &this->actor);
} else if (Player_IsFacingActor(&this->actor, 0x3000, play) && (this->actor.xzDistToPlayer < 100.0f)) {
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
}
}
void func_80B97D6C(EnZot* this, PlayState* play) {
if (func_80B96E5C(this)) {
this->actionFunc = func_80B97CC8;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
func_80B96BEC(this, 0, ANIMMODE_LOOP);
} else {
- this->actor.speedXZ = 8.0f;
+ this->actor.speed = 8.0f;
}
if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 5.0f)) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_ZORA_WALK);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_ZORA_WALK);
}
}
@@ -756,8 +758,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 +767,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);
- func_80151938(play, play->msgCtx.currentTextId + 1);
- break;
+ if ((Message_GetState(&play->msgCtx) != TEXT_STATE_5) || !Message_ShouldAdvance(play)) {
+ return;
+ }
- case 0x128D:
- case 0x128E:
- case 0x128F:
- func_80151938(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:
- func_801477B4(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:
- func_801477B4(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;
}
}
@@ -804,13 +809,13 @@ void func_80B97FD0(EnZot* this, PlayState* play) {
this->actionFunc = func_80B97E4C;
func_80B97BF8(this, play);
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_38_08)) {
- if ((this->actor.xzDistToPlayer < 120.0f) && (gSaveContext.save.playerForm == PLAYER_FORM_ZORA)) {
+ if ((this->actor.xzDistToPlayer < 120.0f) && (GET_PLAYER_FORM == PLAYER_FORM_ZORA)) {
this->unk_2F2 |= 4;
this->actionFunc = func_80B97E0C;
func_80B96BEC(this, 6, ANIMMODE_ONCE);
}
} else if (Player_IsFacingActor(&this->actor, 0x3000, play) && (this->actor.xzDistToPlayer < 100.0f)) {
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
}
}
@@ -819,9 +824,9 @@ void func_80B980FC(EnZot* this, PlayState* play) {
this->actor.home.rot.x--;
} else if (func_80B96E5C(this)) {
this->actionFunc = func_80B97100;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
} else {
- this->actor.speedXZ = 8.0f;
+ this->actor.speed = 8.0f;
if (this->unk_2F0 != 3) {
func_80B96BEC(this, 3, ANIMMODE_LOOP);
}
@@ -834,7 +839,7 @@ void func_80B98178(EnZot* this, PlayState* play) {
switch (ENZOT_GET_1F(&this->actor)) {
case 6:
- if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
if (CURRENT_DAY == 3) {
textId = 0x129D;
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_39_01)) {
@@ -852,14 +857,14 @@ void func_80B98178(EnZot* this, PlayState* play) {
break;
case 7:
- if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_39_04)) {
textId = 0x12AA;
} else {
textId = 0x12A6;
SET_WEEKEVENTREG(WEEKEVENTREG_39_04);
}
- } else if (Flags_GetSwitch(play, this->actor.home.rot.z & 0x7F)) {
+ } else if (Flags_GetSwitch(play, ENZOT_GET_SWITCH_FLAG(&this->actor))) {
textId = 0x12A0;
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_39_02)) {
textId = 0x12A5;
@@ -881,14 +886,14 @@ void func_80B98178(EnZot* this, PlayState* play) {
phi_v0 += 2;
}
- if (gSaveContext.save.playerForm != PLAYER_FORM_ZORA) {
+ if (GET_PLAYER_FORM != PLAYER_FORM_ZORA) {
phi_v0++;
}
textId = phi_v0 + 0x1302;
break;
default:
- if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
textId = 0x129F;
} else {
textId = 0x1295;
@@ -931,7 +936,7 @@ void func_80B9849C(EnZot* this, PlayState* play) {
}
this->actionFunc = func_80B98728;
} else {
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
}
}
@@ -941,9 +946,9 @@ void func_80B9854C(EnZot* this, PlayState* play) {
this->actor.parent = NULL;
this->actionFunc = func_80B9849C;
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
+ Actor_OfferTalkExchange(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
} else {
- Actor_PickUp(&this->actor, play, this->unk_2D4, 10000.0f, 50.0f);
+ Actor_OfferGetItem(&this->actor, play, this->unk_2D4, 10000.0f, 50.0f);
}
}
@@ -956,8 +961,8 @@ void func_80B985EC(EnZot* this, PlayState* play) {
itemAction = func_80123810(play);
if (itemAction > PLAYER_IA_NONE) {
- func_801477B4(play);
- if ((itemAction == PLAYER_IA_PICTO_BOX) && CHECK_QUEST_ITEM(QUEST_PICTOGRAPH) &&
+ Message_CloseTextbox(play);
+ if ((itemAction == PLAYER_IA_PICTOGRAPH_BOX) && CHECK_QUEST_ITEM(QUEST_PICTOGRAPH) &&
Snap_CheckFlag(PICTO_VALID_LULU_HEAD)) {
if (Snap_CheckFlag(PICTO_VALID_LULU_RIGHT_ARM) && Snap_CheckFlag(PICTO_VALID_LULU_LEFT_ARM)) {
player->actor.textId = 0x12AE;
@@ -970,7 +975,7 @@ void func_80B985EC(EnZot* this, PlayState* play) {
}
this->actionFunc = func_80B98728;
} else if (itemAction <= PLAYER_IA_MINUS1) {
- func_80151938(play, 0x12AB);
+ Message_ContinueTextbox(play, 0x12AB);
this->actionFunc = func_80B98728;
}
}
@@ -984,13 +989,13 @@ void func_80B98728(EnZot* this, PlayState* play) {
if (Message_ShouldAdvance(play) && (play->msgCtx.currentTextId == 0x1293)) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
- func_80151938(play, 0x1294);
+ Audio_PlaySfx_MessageDecide();
+ Message_ContinueTextbox(play, 0x1294);
break;
case 1:
- func_8019F230();
- func_80151938(play, 0x1298);
+ Audio_PlaySfx_MessageCancel();
+ Message_ContinueTextbox(play, 0x1298);
break;
}
}
@@ -1015,44 +1020,44 @@ void func_80B98728(EnZot* this, PlayState* play) {
case 0x12A7:
case 0x12A8:
case 0x12AE:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x12A9:
case 0x12AA:
- func_80151938(play, 0xFF);
+ Message_ContinueTextbox(play, 0xFF);
this->actionFunc = func_80B985EC;
break;
case 0x1294:
if (CURRENT_DAY == 3) {
- func_80151938(play, 0x1296);
+ Message_ContinueTextbox(play, 0x1296);
} else {
- func_80151938(play, 0x1295);
+ Message_ContinueTextbox(play, 0x1295);
}
break;
case 0x12AB:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80B98998;
break;
case 0x12AC:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->unk_2D4 = 2;
this->actionFunc = func_80B9854C;
func_80B9854C(this, play);
break;
case 0x12AF:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->unk_2D4 = 4;
this->actionFunc = func_80B9854C;
func_80B9854C(this, play);
break;
default:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80B98998;
this->actor.flags &= ~ACTOR_FLAG_10000;
break;
@@ -1069,14 +1074,14 @@ void func_80B98998(EnZot* this, PlayState* play) {
func_80B98178(this, play);
} else if ((this->actor.xzDistToPlayer < 100.0f) && Player_IsFacingActor(&this->actor, 0x3000, play) &&
Actor_IsFacingPlayer(&this->actor, 0x7000)) {
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
}
}
void func_80B98A4C(EnZot* this, PlayState* play) {
u16 textId;
- if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_39_80)) {
textId = 0x12B6;
} else {
@@ -1099,25 +1104,25 @@ void func_80B98AD0(EnZot* this, PlayState* play) {
case 0x12B4:
case 0x12B7:
case 0x12B9:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x12B8:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80B98CA8;
CLEAR_WEEKEVENTREG(WEEKEVENTREG_41_20);
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
break;
case 0x12BA:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80B98CA8;
SET_WEEKEVENTREG(WEEKEVENTREG_41_20);
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
break;
default:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80B98CA8;
break;
}
@@ -1135,26 +1140,26 @@ void func_80B98BF4(EnZot* this, PlayState* play) {
this->actionFunc = func_80B98AD0;
}
} else {
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
}
}
void func_80B98CA8(EnZot* this, PlayState* play) {
if (func_800B8718(&this->actor, &play->state)) {
- play->msgCtx.ocarinaMode = 4;
+ play->msgCtx.ocarinaMode = OCARINA_MODE_END;
AudioOcarina_StartDefault(0xFFFF);
this->actionFunc = func_80B98BF4;
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
} else if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actionFunc = func_80B98AD0;
func_80B98A4C(this, play);
} else {
if ((this->actor.xzDistToPlayer < 100.0f) && Player_IsFacingActor(&this->actor, 0x3000, play)) {
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
}
- if ((gSaveContext.save.playerForm == PLAYER_FORM_ZORA) || (this->actor.xzDistToPlayer < 100.0f)) {
+ if ((GET_PLAYER_FORM == PLAYER_FORM_ZORA) || (this->actor.xzDistToPlayer < 100.0f)) {
func_800B874C(&this->actor, play, 120.0, 100.0f);
}
}
@@ -1167,8 +1172,8 @@ void func_80B98CA8(EnZot* this, PlayState* play) {
void func_80B98E10(EnZot* this, PlayState* play) {
u16 textId;
- if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
- if (Flags_GetSwitch(play, this->actor.home.rot.z & 0x7F)) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
+ if (Flags_GetSwitch(play, ENZOT_GET_SWITCH_FLAG(&this->actor))) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_40_04)) {
textId = 0x12C5;
} else {
@@ -1182,7 +1187,7 @@ void func_80B98E10(EnZot* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_40_02);
}
} else {
- if (Flags_GetSwitch(play, this->actor.home.rot.z & 0x7F)) {
+ if (Flags_GetSwitch(play, ENZOT_GET_SWITCH_FLAG(&this->actor))) {
if (this->unk_2F2 & 0x10) {
textId = 0x12BF;
} else {
@@ -1205,7 +1210,7 @@ void func_80B98F30(EnZot* this, PlayState* play) {
this->actor.parent = NULL;
this->actionFunc = func_80B990A4;
} else {
- Actor_PickUp(&this->actor, play, GI_RUPEE_BLUE, 10000.0f, 50.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_RUPEE_BLUE, 10000.0f, 50.0f);
}
}
@@ -1223,17 +1228,17 @@ void func_80B98F94(EnZot* this, PlayState* play) {
case 0x12BC:
case 0x12C0:
case 0x12C3:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x12BE:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80B98F30;
func_80B98F30(this, play);
break;
default:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80B990A4;
break;
}
@@ -1247,14 +1252,14 @@ void func_80B990A4(EnZot* this, PlayState* play) {
this->actionFunc = func_80B98F94;
func_80B98E10(this, play);
} else if (Player_IsFacingActor(&this->actor, 0x3000, play) && (this->actor.xzDistToPlayer < 100.0f)) {
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
}
}
void func_80B99160(EnZot* this, PlayState* play) {
u16 textId;
- if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_40_10)) {
textId = 0x12CD;
} else {
@@ -1271,8 +1276,7 @@ void func_80B99160(EnZot* this, PlayState* play) {
}
void func_80B991E4(EnZot* this, PlayState* play) {
- if (1) {
- do { } while (0); }
+ if (1) {}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 2, 0x800, 0x100);
this->actor.world.rot.y = this->actor.shape.rot.y;
@@ -1282,9 +1286,9 @@ void func_80B991E4(EnZot* this, PlayState* play) {
if ((temp == 0x12C6) || (temp == 0x12C7) || (temp == 0x12CA) || (temp == 0x12CB)) {
temp2 = temp;
- func_80151938(play, temp2 + 1);
+ Message_ContinueTextbox(play, temp2 + 1);
} else {
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80B992C0;
func_80B96BEC(this, 1, ANIMMODE_LOOP);
}
@@ -1295,13 +1299,13 @@ void func_80B992C0(EnZot* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actionFunc = func_80B991E4;
func_80B99160(this, play);
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
func_80B96BEC(this, 0, ANIMMODE_LOOP);
} else {
if (Player_IsFacingActor(&this->actor, 0x3000, play) && (this->actor.xzDistToPlayer < 100.0f)) {
- func_800B8614(&this->actor, play, 120.0f);
+ Actor_OfferTalk(&this->actor, play, 120.0f);
}
- this->actor.speedXZ = 1.5f;
+ this->actor.speed = 1.5f;
func_80B96FB0(this);
}
}
@@ -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..b6b67abb4 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,10 @@ 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_GET_SWITCH_FLAG(thisx) (((thisx)->home.rot.z) & 0x7F)
+
+#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 27d4e04b1..8e85f4675 100644
--- a/src/overlays/actors/ovl_En_Zov/z_en_zov.c
+++ b/src/overlays/actors/ovl_En_Zov/z_en_zov.c
@@ -5,10 +5,9 @@
*/
#include "z_en_zov.h"
-#include "objects/object_zov/object_zov.h"
#include "overlays/actors/ovl_En_Elf/z_en_elf.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((EnZov*)thisx)
@@ -60,20 +59,20 @@ static ColliderCylinderInit sCylinderInit = {
{ 20, 40, 0, { 0, 0, 0 } },
};
-static AnimationHeader* D_80BD270C[] = {
- &object_zov_Anim_00D3EC, &object_zov_Anim_008120, &object_zov_Anim_00B4CC, &object_zov_Anim_00A888,
- &object_zov_Anim_00C510, &object_zov_Anim_00CAA8, &object_zov_Anim_008120, &object_zov_Anim_00A888,
- &object_zov_Anim_002B5C, &object_zov_Anim_00418C, &object_zov_Anim_005A6C, &object_zov_Anim_0066A4,
- &object_zov_Anim_0017D4, &object_zov_Anim_0023F4,
+static AnimationHeader* sAnimations[] = {
+ &gLuluLookDownAnim, &gLuluPutHandsDownAnim, &gLuluLookForwardAndDownAnim, &gLuluLookAroundAnim,
+ &gLuluAngleHeadAnim, &gLuluNodAnim, &gLuluPutHandsDownAnim, &gLuluLookAroundAnim,
+ &gLuluSingStartAnim, &gLuluSingLoopAnim, &gLuluLookForwardAndLeftAnim, &gLuluLookLeftLoopAnim,
+ &gLuluTurnAndWalkAnim, &gLuluWalkLoopAnim,
};
static Vec3f D_80BD2744 = { 400.0f, 600.0f, 0.0f };
static Vec3f D_80BD2750 = { 400.0f, 600.0f, 0.0f };
-static TexturePtr D_80BD275C[] = { object_zov_Tex_013C38, object_zov_Tex_015138, object_zov_Tex_014138 };
+static TexturePtr sEyeTextures[] = { gLuluEyeOpenTex, gLuluEyeHalfTex, gLuluEyeClosedTex };
-static TexturePtr D_80BD2768[] = { object_zov_Tex_0135F8, object_zov_Tex_014538 };
+static TexturePtr sMouthTextures[] = { gLuluMouthClosedTex, gLuluMouthOpenTex };
static s8 D_80BD2770[] = {
1, 2, 1, 0, 0, 1, 2, 1,
@@ -86,15 +85,15 @@ void EnZov_Init(Actor* thisx, PlayState* play) {
this->picto.actor.colChkInfo.mass = MASS_IMMOVABLE;
Actor_SetScale(&this->picto.actor, 0.01f);
Collider_InitAndSetCylinder(play, &this->collider, &this->picto.actor, &sCylinderInit);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_zov_Skel_016258, &object_zov_Anim_00D3EC, this->jontTable,
- this->morphTable, 23);
- Animation_PlayLoop(&this->skelAnime, &object_zov_Anim_00D3EC);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gLuluSkel, &gLuluLookDownAnim, this->jointTable, this->morphTable,
+ LULU_LIMB_MAX);
+ Animation_PlayLoop(&this->skelAnime, &gLuluLookDownAnim);
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 +106,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 +119,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,23 +133,23 @@ 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) {
+void func_80BD1470(EnZov* this, s16 index, u8 mode, f32 morphFrames) {
f32 frame;
- if (((index != this->unk_322) || (mode != ANIMMODE_LOOP)) && (index >= 0) && (index < ARRAY_COUNT(D_80BD270C))) {
+ if (((index != this->unk_322) || (mode != ANIMMODE_LOOP)) && (index >= 0) && (index < ARRAY_COUNT(sAnimations))) {
switch (index) {
case 6:
frame = 30.0f;
@@ -164,8 +163,8 @@ void func_80BD1470(EnZov* this, s16 index, u8 mode, f32 transitionRate) {
frame = 0.0f;
break;
}
- Animation_Change(&this->skelAnime, D_80BD270C[index], 1.0f, frame, Animation_GetLastFrame(D_80BD270C[index]),
- mode, transitionRate);
+ Animation_Change(&this->skelAnime, sAnimations[index], 1.0f, frame, Animation_GetLastFrame(sAnimations[index]),
+ mode, morphFrames);
this->unk_322 = index;
}
}
@@ -187,7 +186,7 @@ void func_80BD160C(EnZov* this, PlayState* play) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_53_20)) {
this->unk_320 &= ~2;
- if (gSaveContext.save.playerForm != PLAYER_FORM_ZORA) {
+ if (GET_PLAYER_FORM != PLAYER_FORM_ZORA) {
textId = 0x1024;
if ((this->unk_322 == 0) || (this->unk_322 == 4)) {
func_80BD1570(this, 4, ANIMMODE_ONCE);
@@ -201,7 +200,7 @@ void func_80BD160C(EnZov* this, PlayState* play) {
this->unk_320 |= 4;
func_80BD1570(this, 3, ANIMMODE_ONCE);
}
- } else if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ } else if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
func_80BD1570(this, 2, ANIMMODE_ONCE);
this->actionFunc = func_80BD19FC;
this->unk_324 = 10;
@@ -264,14 +263,14 @@ void func_80BD187C(EnZov* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
switch (play->msgCtx.currentTextId) {
case 0x1022:
- func_80151938(play, 0x1023);
+ Message_ContinueTextbox(play, 0x1023);
break;
case 0x1023:
if ((this->unk_322 != 6) && (this->unk_322 != 1)) {
func_80BD1570(this, 1, ANIMMODE_ONCE);
}
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80BD1C84;
break;
@@ -279,14 +278,14 @@ void func_80BD187C(EnZov* this, PlayState* play) {
if (this->unk_322 != 6) {
func_80BD1570(this, 0, ANIMMODE_LOOP);
}
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80BD1C84;
break;
default:
this->unk_320 &= ~1;
func_80BD1570(this, 0, ANIMMODE_LOOP);
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80BD1C84;
break;
}
@@ -294,7 +293,7 @@ void func_80BD187C(EnZov* this, PlayState* play) {
break;
case TEXT_STATE_CLOSING:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80BD1C84;
this->unk_320 &= ~1;
func_80BD1570(this, 0, ANIMMODE_LOOP);
@@ -328,12 +327,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 +366,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));
}
}
@@ -378,10 +377,10 @@ void func_80BD1C84(EnZov* this, PlayState* play) {
this->actionFunc = func_80BD187C;
func_80BD160C(this, play);
} else if (func_80BD15A4(this, play)) {
- func_800B8614(&this->picto.actor, play, 120.0f);
+ Actor_OfferTalk(&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);
}
@@ -390,7 +389,7 @@ void func_80BD1C84(EnZov* this, PlayState* play) {
void func_80BD1D30(EnZov* this, PlayState* play) {
u16 textId;
- if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_79_01)) {
textId = 0x1032;
} else {
@@ -419,7 +418,7 @@ void func_80BD1DB8(EnZov* this, PlayState* play) {
case 0x1036:
case 0x1037:
case 0x1038:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
case 0x1039:
@@ -429,11 +428,11 @@ void func_80BD1DB8(EnZov* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_78_01);
this->actionFunc = func_80BD1D94;
play->msgCtx.msgLength = 0;
- Audio_QueueSeqCmd(0x101400FF);
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 20);
break;
default:
- func_801477B4(play);
+ Message_CloseTextbox(play);
this->actionFunc = func_80BD1F1C;
break;
}
@@ -452,7 +451,7 @@ void func_80BD1F1C(EnZov* this, PlayState* play) {
this->actionFunc = func_80BD1DB8;
func_80BD1D30(this, play);
} else if (func_80BD15A4(this, play)) {
- func_800B8614(&this->picto.actor, play, 120.0f);
+ Actor_OfferTalk(&this->picto.actor, play, 120.0f);
}
}
@@ -476,11 +475,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 +505,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]);
}
}
}
@@ -521,14 +520,14 @@ void EnZov_Update(Actor* thisx, PlayState* play) {
s32 EnZov_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnZov* this = THIS;
- if (limbIndex == 12) {
+ if (limbIndex == LULU_LIMB_HEAD) {
rot->x += this->unk_2F0.y;
if ((this->unk_320 & 0x10) && (this->unk_322 == 0)) {
rot->z += this->unk_2F0.x;
}
}
- if (limbIndex == 11) {
+ if (limbIndex == LULU_LIMB_TORSO) {
rot->x += this->unk_2F6.y;
}
return false;
@@ -537,17 +536,17 @@ s32 EnZov_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
void EnZov_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnZov* this = THIS;
- if (limbIndex == 12) {
+ if (limbIndex == LULU_LIMB_HEAD) {
Matrix_MultVec3f(&D_80BD2744, &this->picto.actor.focus.pos);
Math_Vec3f_Copy(&this->unk_2FC, &this->picto.actor.focus.pos);
this->unk_2FC.y += 10.0f;
}
- if (limbIndex == 18) {
+ if (limbIndex == LULU_LIMB_RIGHT_UPPER_ARM) {
Matrix_MultVec3f(&D_80BD2750, &this->unk_308);
}
- if (limbIndex == 13) {
+ if (limbIndex == LULU_LIMB_LEFT_UPPER_ARM) {
Matrix_MultVec3f(&D_80BD2750, &this->unk_314);
}
}
@@ -563,7 +562,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;
@@ -625,8 +624,8 @@ void EnZov_Draw(Actor* thisx, PlayState* play) {
}
gfx = POLY_OPA_DISP;
- gSPSegment(&gfx[0], 0x09, Lib_SegmentedToVirtual(D_80BD275C[phi_v1]));
- gSPSegment(&gfx[1], 0x08, Lib_SegmentedToVirtual(D_80BD2768[phi_a1]));
+ gSPSegment(&gfx[0], 0x09, Lib_SegmentedToVirtual(sEyeTextures[phi_v1]));
+ gSPSegment(&gfx[1], 0x08, Lib_SegmentedToVirtual(sMouthTextures[phi_a1]));
POLY_OPA_DISP = &gfx[2];
CLOSE_DISPS(play->state.gfxCtx);
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..7637bb53e 100644
--- a/src/overlays/actors/ovl_En_Zov/z_en_zov.h
+++ b/src/overlays/actors/ovl_En_Zov/z_en_zov.h
@@ -3,6 +3,7 @@
#include "global.h"
#include "z64snap.h"
+#include "objects/object_zov/object_zov.h"
struct EnZov;
@@ -16,8 +17,8 @@ typedef void (*EnZovActionFunc)(struct EnZov*, PlayState*);
typedef struct EnZov {
/* 0x000 */ PictoActor picto;
- /* 0x148 */ Vec3s jontTable[23];
- /* 0x1D2 */ Vec3s morphTable[23];
+ /* 0x148 */ Vec3s jointTable[LULU_LIMB_MAX];
+ /* 0x1D2 */ Vec3s morphTable[LULU_LIMB_MAX];
/* 0x25C */ SkelAnime skelAnime;
/* 0x2A0 */ ColliderCylinder collider;
/* 0x2EC */ s16 unk_2EC;
@@ -30,9 +31,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 7e3709162..dfcf7225e 100644
--- a/src/overlays/actors/ovl_En_Zow/z_en_zow.c
+++ b/src/overlays/actors/ovl_En_Zow/z_en_zow.c
@@ -7,7 +7,7 @@
#include "z_en_zow.h"
#include "objects/object_zo/object_zo.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10)
#define THIS ((EnZow*)thisx)
@@ -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);
@@ -321,7 +324,7 @@ void EnZow_Init(Actor* thisx, PlayState* play) {
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
this->actor.textId = 0;
this->actor.world.rot.z = this->actor.shape.rot.z;
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
}
void EnZow_Destroy(Actor* thisx, PlayState* play) {
@@ -357,8 +360,8 @@ 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 (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_78_04)) {
phi_a1 = 0x12FD;
} else {
@@ -371,7 +374,7 @@ void func_80BDD1E0(EnZow* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_78_10);
phi_a1 = 0x12FF;
}
- } else if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ } else if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_78_08)) {
phi_a1 = 0x12F8;
} else {
@@ -384,13 +387,13 @@ void func_80BDD1E0(EnZow* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_78_10);
phi_a1 = 0x12FF;
}
- } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
- if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
+ if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
phi_a1 = 0x12EC;
} else {
phi_a1 = 0x12F1;
}
- } else if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
+ } else if (GET_PLAYER_FORM == PLAYER_FORM_ZORA) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_78_02)) {
phi_a1 = 0x12EB;
} else {
@@ -405,9 +408,9 @@ void func_80BDD1E0(EnZow* this, PlayState* play) {
void func_80BDD350(EnZow* this, PlayState* play) {
if (this->unk_2CA & 2) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_DIVE_WATER);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_DIVE_WATER);
func_80BDCDA8(this, this->unk_2D0);
- this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
this->skelAnime.playSpeed = 0.0f;
this->actor.velocity.y = -4.0f;
}
@@ -420,7 +423,7 @@ void func_80BDD350(EnZow* this, PlayState* play) {
}
}
- if ((this->actor.bgCheckFlags & 1) || (this->actor.depthInWater > 180.0f)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (this->actor.depthInWater > 180.0f)) {
this->actor.velocity.y = 0.0f;
this->actionFunc = func_80BDD79C;
}
@@ -477,11 +480,11 @@ void func_80BDD570(EnZow* this, PlayState* play) {
case 0x12FB:
case 0x12FD:
case 0x12FF:
- func_80151938(play, play->msgCtx.currentTextId + 1);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
break;
default:
- func_801477B4(play);
+ Message_CloseTextbox(play);
break;
}
}
@@ -499,7 +502,7 @@ void func_80BDD634(EnZow* this, PlayState* play) {
this->actionFunc = func_80BDD570;
func_80BDD1E0(this, play);
} else if (func_80BDD154(this, play)) {
- func_800B8614(&this->actor, play, 180.0f);
+ Actor_OfferTalk(&this->actor, play, 180.0f);
}
}
@@ -511,10 +514,10 @@ void func_80BDD6BC(EnZow* this, PlayState* play) {
}
if (this->actor.depthInWater < 54.0f) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_OUT_OF_WATER);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_OUT_OF_WATER);
func_80BDCDA8(this, this->unk_2D0);
func_80BDD04C(this, 1, ANIMMODE_ONCE);
- this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actor.velocity.y = 0.0f;
this->actionFunc = func_80BDD634;
} else if (this->actor.depthInWater < 80.0f) {
@@ -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 c4d72a8f1..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
@@ -16,9 +16,9 @@ void ItemBHeart_Destroy(Actor* thisx, PlayState* play);
void ItemBHeart_Update(Actor* thisx, PlayState* play);
void ItemBHeart_Draw(Actor* thisx, PlayState* play);
-void func_808BCF54(ItemBHeart* this, PlayState* play);
+void ItemBHeart_UpdateModel(ItemBHeart* this, PlayState* play);
-ActorInit Item_B_Heart_InitVars = {
+const ActorInit Item_B_Heart_InitVars = {
ACTOR_ITEM_B_HEART,
ACTORCAT_BOSS,
FLAGS,
@@ -44,71 +44,76 @@ void ItemBHeart_Init(Actor* thisx, PlayState* play) {
Actor_Kill(&this->actor);
return;
}
-
Actor_ProcessInitChain(&this->actor, sInitChain);
ActorShape_Init(&this->actor.shape, 0.0f, NULL, 0.8f);
-
- if (this->actor.params == 0x23) {
- this->unk_168 = 0.1f;
+ if (this->actor.params == BHEART_PARAM_SMALL) {
+ this->baseScale = BHEART_SCALE_SMALL;
} else {
- this->unk_168 = 1.0f;
+ this->baseScale = BHEART_SCALE_NORMAL;
}
-
- this->actor.world.pos.y += (20.0f * this->unk_168);
+ this->actor.world.pos.y += 20.0f * this->baseScale;
}
void ItemBHeart_Destroy(Actor* thisx, PlayState* play) {
}
+/**
+ * Adjusts size and handles collection (if of proper baseScale)
+ */
void ItemBHeart_Update(Actor* thisx, PlayState* play) {
ItemBHeart* this = THIS;
- func_808BCF54(this, play);
+ ItemBHeart_UpdateModel(this, play);
- if (!(this->unk_168 < 0.5f)) {
+ if (!(this->baseScale < BHEART_SCALE_MIN_COLLECTIBLE)) {
if (Actor_HasParent(&this->actor, play)) {
Flags_SetCollectible(play, 0x1F);
Actor_Kill(&this->actor);
return;
}
-
- Actor_PickUp(&this->actor, play, GI_HEART_CONTAINER, 30.0f, 80.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_HEART_CONTAINER, 30.0f, 80.0f);
}
}
-void func_808BCF54(ItemBHeart* this, PlayState* play) {
+/**
+ * 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->unk_164, 0.4f, 0.1f, 0.01f);
- Actor_SetScale(&this->actor, this->unk_164 * this->unk_168);
+ 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* blueWarpActor;
- u8 flag = false;
+ Actor* actorIt;
+ u8 drawTranslucent = false;
OPEN_DISPS(play->state.gfxCtx);
- blueWarpActor = play->actorCtx.actorLists[ACTORCAT_ITEMACTION].first;
+ actorIt = play->actorCtx.actorLists[ACTORCAT_ITEMACTION].first;
- while (blueWarpActor != NULL) {
- if ((blueWarpActor->id == ACTOR_DOOR_WARP1) && (blueWarpActor->projectedPos.z > this->actor.projectedPos.z)) {
- flag = true;
+ while (actorIt != NULL) {
+ if ((actorIt->id == ACTOR_DOOR_WARP1) && (actorIt->projectedPos.z > this->actor.projectedPos.z)) {
+ drawTranslucent = true;
break;
}
- blueWarpActor = blueWarpActor->next;
+ actorIt = actorIt->next;
}
- if (flag || thisx->world.rot.y != 0) {
- func_8012C2DC(play->state.gfxCtx);
+ 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);
+ gSPDisplayList(POLY_XLU_DISP++, &gGiHeartBorderDL);
+ gSPDisplayList(POLY_XLU_DISP++, &gGiHeartContainerDL);
} else {
- 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++, gGiHeartBorderDL);
- gSPDisplayList(POLY_OPA_DISP++, gGiHeartContainerDL);
+ 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 f7ff62fa9..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,13 +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[0x20];
- /* 0x164 */ f32 unk_164;
- /* 0x168 */ f32 unk_168;
+ /* 0x164 */ f32 variableScale;
+ /* 0x168 */ f32 baseScale;
} ItemBHeart; // size = 0x16C
#endif // Z_ITEM_B_HEART_H
diff --git a/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c b/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c
index e327dc3f4..ba4507b71 100644
--- a/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c
+++ b/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c
@@ -55,7 +55,7 @@ void ItemEtcetera_Init(Actor* thisx, PlayState* play) {
s32 pad;
ItemEtcetera* this = THIS;
s32 type = ITEMETCETERA_GET_FF(&this->actor);
- s32 objBankIndex = Object_GetIndex(&play->objectCtx, sObjectIds[type]);
+ s32 objBankIndex = Object_GetSlot(&play->objectCtx, sObjectIds[type]);
if (objBankIndex < 0) {
// assert on debug
@@ -106,7 +106,7 @@ void func_8092009C(ItemEtcetera* this, PlayState* play) {
return;
}
- Actor_PickUp(&this->actor, play, this->getItemId, 30.0f, 50.0f);
+ Actor_OfferGetItem(&this->actor, play, this->getItemId, 30.0f, 50.0f);
}
void func_809200F8(ItemEtcetera* this, PlayState* play) {
diff --git a/src/overlays/actors/ovl_Item_Inbox/z_item_inbox.c b/src/overlays/actors/ovl_Item_Inbox/z_item_inbox.c
index 0599e117d..0b554f665 100644
--- a/src/overlays/actors/ovl_Item_Inbox/z_item_inbox.c
+++ b/src/overlays/actors/ovl_Item_Inbox/z_item_inbox.c
@@ -6,7 +6,7 @@
#include "z_item_inbox.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define THIS ((ItemInbox*)thisx)
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..412687b7f 100644
--- a/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.c
+++ b/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.c
@@ -383,7 +383,7 @@ void MirRay_Update(Actor* thisx, PlayState* play) {
MirRay_MakeShieldLight(this, play);
if (this->reflectIntensity > 0.0f) {
- func_800B8F98(&player->actor, NA_SE_IT_SHIELD_BEAM - SFX_FLAG);
+ Actor_PlaySfx_FlaggedCentered1(&player->actor, NA_SE_IT_SHIELD_BEAM - SFX_FLAG);
}
}
}
@@ -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..d475a263e 100644
--- a/src/overlays/actors/ovl_Mir_Ray2/z_mir_ray2.c
+++ b/src/overlays/actors/ovl_Mir_Ray2/z_mir_ray2.c
@@ -92,7 +92,7 @@ void MirRay2_Init(Actor* thisx, PlayState* play) {
this->actor.shape.rot.x = 0;
this->actor.world.rot.x = this->actor.shape.rot.x;
if (MIRRAY2_GET_F(thisx) != 1) {
- if ((MIRRAY2_GET_SWITCH_FLAGS(thisx) != 0x7F) && !Flags_GetSwitch(play, MIRRAY2_GET_SWITCH_FLAGS(thisx))) {
+ if ((MIRRAY2_GET_SWITCH_FLAG(thisx) != 0x7F) && !Flags_GetSwitch(play, MIRRAY2_GET_SWITCH_FLAG(thisx))) {
this->unk1A4 |= 1;
}
}
@@ -109,13 +109,13 @@ void MirRay2_Update(Actor* thisx, PlayState* play) {
MirRay2* this = THIS;
if (this->unk1A4 & 1) {
- if (Flags_GetSwitch(play, MIRRAY2_GET_SWITCH_FLAGS(thisx))) {
+ if (Flags_GetSwitch(play, MIRRAY2_GET_SWITCH_FLAG(thisx))) {
this->unk1A4 &= ~1;
}
} 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_Ray2/z_mir_ray2.h b/src/overlays/actors/ovl_Mir_Ray2/z_mir_ray2.h
index 4bb40d40d..7325ba2cf 100644
--- a/src/overlays/actors/ovl_Mir_Ray2/z_mir_ray2.h
+++ b/src/overlays/actors/ovl_Mir_Ray2/z_mir_ray2.h
@@ -6,7 +6,7 @@
struct MirRay2;
#define MIRRAY2_GET_F(thisx) ((thisx)->params & 0xF)
-#define MIRRAY2_GET_SWITCH_FLAGS(thisx) (((thisx)->params & 0xFE00) >> 9)
+#define MIRRAY2_GET_SWITCH_FLAG(thisx) (((thisx)->params & 0xFE00) >> 9)
typedef struct MirRay2 {
/* 0x000 */ Actor actor;
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..520684fb7 100644
--- a/src/overlays/actors/ovl_Mir_Ray3/z_mir_ray3.c
+++ b/src/overlays/actors/ovl_Mir_Ray3/z_mir_ray3.c
@@ -139,7 +139,7 @@ void MirRay3_Update(Actor* thisx, PlayState* play) {
}
if (this->unk_214 > 0.1f) {
- func_800B8F98(&player->actor, NA_SE_IT_SHIELD_BEAM - SFX_FLAG);
+ Actor_PlaySfx_FlaggedCentered1(&player->actor, NA_SE_IT_SHIELD_BEAM - SFX_FLAG);
}
Math_ApproachZeroF(&this->unk_214, 1.0f, 0.1f);
@@ -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 acea3daf1..7324448a4 100644
--- a/src/overlays/actors/ovl_Obj_Aqua/z_obj_aqua.c
+++ b/src/overlays/actors/ovl_Obj_Aqua/z_obj_aqua.c
@@ -151,7 +151,10 @@ void ObjAqua_Init(Actor* thisx, PlayState* play) {
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 60.0f);
- if (1) {};
+
+ //! FAKE:
+ if (1) {}
+
this->actor.shape.shadowAlpha = 140;
this->alpha = 255;
if (func_80ACBA60(this, play)) {
@@ -175,11 +178,11 @@ void func_80ACBC70(ObjAqua* this) {
}
void func_80ACBC8C(ObjAqua* this, PlayState* play) {
- if (this->actor.bgCheckFlags & 0x21) {
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & (BGCHECKFLAG_GROUND | BGCHECKFLAG_WATER)) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
func_80ACB7F4(this, play);
func_80ACBA10(this);
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOTTLE_WATERING);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BOTTLE_WATERING);
func_80ACBD34(this);
} else {
func_80ACB6A0(this, play);
@@ -196,7 +199,7 @@ void func_80ACBD34(ObjAqua* this) {
}
void func_80ACBD48(ObjAqua* this, PlayState* play) {
- if ((AQUA_HOT(&this->actor) == 1) && (this->alpha > 90)) {
+ if ((AQUA_GET_TYPE(&this->actor) == AQUA_TYPE_HOT) && (this->alpha > 90)) {
func_80ACB940(this, play);
}
if (this->alpha > 5) {
@@ -225,7 +228,7 @@ void func_80ACBDFC(ObjAqua* this, PlayState* play) {
this->alpha = (s32)(temp * 3.25f) + 10;
this->actor.shape.shadowAlpha = this->alpha;
this->unk_198 += 1000;
- if (AQUA_HOT(&this->actor) == 1) {
+ if (AQUA_GET_TYPE(&this->actor) == AQUA_TYPE_HOT) {
f32 temp_f2 = this->actor.scale.x * 10000.0f;
EffectSsBubble_Spawn(play, &this->actor.world.pos, temp_f2 * -0.5f, temp_f2, temp_f2,
@@ -254,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;
@@ -271,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_Aqua/z_obj_aqua.h b/src/overlays/actors/ovl_Obj_Aqua/z_obj_aqua.h
index a47ea661a..12dcedc1c 100644
--- a/src/overlays/actors/ovl_Obj_Aqua/z_obj_aqua.h
+++ b/src/overlays/actors/ovl_Obj_Aqua/z_obj_aqua.h
@@ -3,8 +3,14 @@
#include "global.h"
-#define AQUA_HOT(thisx) ((thisx)->params & 1)
-#define OBJAQUA_1 1
+#define AQUA_GET_TYPE(thisx) ((thisx)->params & 1)
+
+#define AQUA_PARAMS(type) ((type) & 1)
+
+typedef enum {
+ /* 0 */ AQUA_TYPE_COLD,
+ /* 1 */ AQUA_TYPE_HOT
+} AquaType;
struct ObjAqua;
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 565c99504..d713c9d04 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;
@@ -198,7 +198,7 @@ void ObjArmos_Init(Actor* thisx, PlayState* play) {
if (sp40 == 0) {
func_809A57D8(this);
- } else if (Flags_GetSwitch(play, OBJARMOS_GET_7F(&this->dyna.actor))) {
+ } else if (Flags_GetSwitch(play, OBJARMOS_GET_SWITCH_FLAG(&this->dyna.actor))) {
if (sp44 == OBJARMOS_ROT_7_0) {
this->dyna.actor.world.pos.x = this->dyna.actor.home.pos.x + (sp40 * 60);
func_809A57D8(this);
@@ -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) {
@@ -277,15 +277,15 @@ void func_809A562C(ObjArmos* this, PlayState* play) {
if ((temp == OBJARMOS_ROT_7_4) || (temp == OBJARMOS_ROT_7_5) || (temp == OBJARMOS_ROT_7_6)) {
if (!func_809A500C(this, this->unk_264) || func_809A4E00(this, play, 0x5A)) {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_BLOCK_BOUND);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_BLOCK_BOUND);
}
} else if (func_809A500C(this, this->unk_264)) {
if (func_809A4E00(this, play, 0x5A)) {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_BLOCK_BOUND);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_BLOCK_BOUND);
}
} else {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_BLOCK_BOUND);
- Flags_SetSwitch(play, OBJARMOS_GET_7F(&this->dyna.actor));
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_BLOCK_BOUND);
+ Flags_SetSwitch(play, OBJARMOS_GET_SWITCH_FLAG(&this->dyna.actor));
sp20 = true;
}
@@ -298,13 +298,13 @@ void func_809A562C(ObjArmos* this, PlayState* play) {
func_809A57D8(this);
}
} else {
- func_800B9010(&this->dyna.actor, NA_SE_EV_ROCK_SLIDE - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_ROCK_SLIDE - SFX_FLAG);
}
}
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 & 1) &&
+ 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..af3b31338 100644
--- a/src/overlays/actors/ovl_Obj_Armos/z_obj_armos.h
+++ b/src/overlays/actors/ovl_Obj_Armos/z_obj_armos.h
@@ -8,19 +8,19 @@ struct ObjArmos;
typedef void (*ObjArmosActionFunc)(struct ObjArmos*, PlayState*);
-#define OBJARMOS_GET_7F(thisx) ((thisx)->params & 0x7F)
+#define OBJARMOS_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
#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 35f37d5d8..9e6531ef1 100644
--- a/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c
+++ b/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c
@@ -235,15 +235,15 @@ void func_809372D0(ObjBean* this) {
sp34 = Math3D_Vec3fMagnitude(&actor->velocity);
temp_f2 = D_80938FF8[this->unk_1DE].x;
temp_f12 = D_80938FF8[this->unk_1DE].z;
- if (sp34 < (actor->speedXZ * 8.0f)) {
+ if (sp34 < (actor->speed * 8.0f)) {
temp_f2 = ((temp_f2 - 2.0f) * 0.1f) + 2.0f;
temp_f12 *= 0.4f;
}
- Math_StepToF(&actor->speedXZ, temp_f2, temp_f12);
+ Math_StepToF(&actor->speed, temp_f2, temp_f12);
- if ((actor->speedXZ + 0.05f) < sp34) {
- Math_Vec3f_Scale(&actor->velocity, actor->speedXZ / sp34);
+ if ((actor->speed + 0.05f) < sp34) {
+ Math_Vec3f_Scale(&actor->velocity, actor->speed / sp34);
this->unk_1BC.x += actor->velocity.x;
this->unk_1BC.y += actor->velocity.y;
this->unk_1BC.z += actor->velocity.z;
@@ -255,7 +255,7 @@ void func_809372D0(ObjBean* this) {
} else {
this->unk_1DC++;
}
- actor->speedXZ *= 0.5f;
+ actor->speed *= 0.5f;
}
}
@@ -275,14 +275,14 @@ s32 func_80937468(ObjBean* this, PlayState* play) {
ObjBean* func_809374F8(ObjBean* this, PlayState* play) {
Actor* bgActor = play->actorCtx.actorLists[ACTORCAT_BG].first;
- s32 params = OBJBEAN_GET_3F80(&this->dyna.actor, 0);
+ s32 switchFlag = OBJBEAN_GET_SWITCH_FLAG_2(&this->dyna.actor, 0);
while (bgActor != NULL) {
if (bgActor->id == ACTOR_OBJ_BEAN) {
s32 params2 = OBJBEAN_GET_C000(bgActor);
if (!params2 && (bgActor->room == this->dyna.actor.room) && !OBJBEAN_GET_80(bgActor) &&
- (params == OBJBEAN_GET_7F(bgActor, 0)) &&
+ (switchFlag == OBJBEAN_GET_SWITCH_FLAG_1(bgActor, 0)) &&
(Math3D_Vec3fDistSq(&bgActor->world.pos, &this->dyna.actor.world.pos) < SQ(10.0f))) {
break;
}
@@ -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)) {
@@ -406,15 +406,17 @@ void ObjBean_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->dyna.actor.shape, 0.0f, ActorShadow_DrawCircle, 8.8f);
func_80936CF0(this, play);
- if (!OBJBEAN_GET_80(&this->dyna.actor) && Flags_GetSwitch(play, OBJBEAN_GET_7F(&this->dyna.actor, 0)) &&
- !Flags_GetSwitch(play, OBJBEAN_GET_7F(&this->dyna.actor, 1)) && func_800FE9B4(play)) {
- Flags_SetSwitch(play, OBJBEAN_GET_7F(&this->dyna.actor, 1));
+ if (!OBJBEAN_GET_80(&this->dyna.actor) &&
+ Flags_GetSwitch(play, OBJBEAN_GET_SWITCH_FLAG_1(&this->dyna.actor, 0)) &&
+ !Flags_GetSwitch(play, OBJBEAN_GET_SWITCH_FLAG_1(&this->dyna.actor, 1)) && func_800FE9B4(play)) {
+ Flags_SetSwitch(play, OBJBEAN_GET_SWITCH_FLAG_1(&this->dyna.actor, 1));
}
- if (OBJBEAN_GET_80(&this->dyna.actor) || Flags_GetSwitch(play, OBJBEAN_GET_7F(&this->dyna.actor, 1))) {
+ if (OBJBEAN_GET_80(&this->dyna.actor) ||
+ Flags_GetSwitch(play, OBJBEAN_GET_SWITCH_FLAG_1(&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);
}
}
@@ -504,12 +506,12 @@ void func_80937DEC(ObjBean* this, PlayState* play) {
this->unk_1FF = false;
}
- if (this->unk_1FF && !Flags_GetSwitch(play, OBJBEAN_GET_3F80(&this->dyna.actor, 1)) &&
- Flags_GetSwitch(play, OBJBEAN_GET_3F80(&this->dyna.actor, 0)) && func_800FE9B4(play)) {
- Flags_SetSwitch(play, OBJBEAN_GET_3F80(&this->dyna.actor, 1));
+ if (this->unk_1FF && !Flags_GetSwitch(play, OBJBEAN_GET_SWITCH_FLAG_2(&this->dyna.actor, 1)) &&
+ Flags_GetSwitch(play, OBJBEAN_GET_SWITCH_FLAG_2(&this->dyna.actor, 0)) && func_800FE9B4(play)) {
+ Flags_SetSwitch(play, OBJBEAN_GET_SWITCH_FLAG_2(&this->dyna.actor, 1));
}
- if (this->unk_1FF && Flags_GetSwitch(play, OBJBEAN_GET_3F80(&this->dyna.actor, 1))) {
+ if (this->unk_1FF && Flags_GetSwitch(play, OBJBEAN_GET_SWITCH_FLAG_2(&this->dyna.actor, 1))) {
Actor_Kill(&this->dyna.actor);
return;
}
@@ -520,7 +522,7 @@ void func_80937DEC(ObjBean* this, PlayState* play) {
this->dyna.actor.draw = func_80938E00;
}
- if (this->unk_1FF && Flags_GetSwitch(play, OBJBEAN_GET_3F80(&this->dyna.actor, 0))) {
+ if (this->unk_1FF && Flags_GetSwitch(play, OBJBEAN_GET_SWITCH_FLAG_2(&this->dyna.actor, 0))) {
this->unk_1FE |= 5;
func_80937C30(this);
} else {
@@ -528,7 +530,7 @@ void func_80937DEC(ObjBean* this, PlayState* play) {
func_80937C10(this);
}
- if (Flags_GetSwitch(play, OBJBEAN_GET_7F(&this->dyna.actor, 0))) {
+ if (Flags_GetSwitch(play, OBJBEAN_GET_SWITCH_FLAG_1(&this->dyna.actor, 0))) {
this->unk_1E4 = 5;
} else {
this->unk_1E4 = 0;
@@ -546,12 +548,12 @@ void func_80937FC8(ObjBean* this, PlayState* play) {
this->unk_1E8(this);
if (Actor_ProcessTalkRequest(&this->dyna.actor, &play->state)) {
- if (Player_GetExchangeItemId(play) == PLAYER_IA_MAGIC_BEANS) {
+ if (Player_GetExchangeItemAction(play) == PLAYER_IA_MAGIC_BEANS) {
func_809383B4(this);
- Flags_SetSwitch(play, OBJBEAN_GET_3F80(&this->dyna.actor, 0));
+ Flags_SetSwitch(play, OBJBEAN_GET_SWITCH_FLAG_2(&this->dyna.actor, 0));
}
- if (Flags_GetSwitch(play, OBJBEAN_GET_7F(&this->dyna.actor, 0))) {
+ if (Flags_GetSwitch(play, OBJBEAN_GET_SWITCH_FLAG_1(&this->dyna.actor, 0))) {
this->unk_1E4 = 5;
} else {
s32 pad;
@@ -566,7 +568,7 @@ void func_80937FC8(ObjBean* this, PlayState* play) {
((this->unk_1FF != 0) && (this->unk_1FE & 4) && (this->dyna.actor.xzDistToPlayer < 300.0f) &&
func_800FE9B4(play))) {
func_809375C8(this, play);
- Flags_SetSwitch(play, OBJBEAN_GET_3F80(&this->dyna.actor, 1));
+ Flags_SetSwitch(play, OBJBEAN_GET_SWITCH_FLAG_2(&this->dyna.actor, 1));
this->unk_1E4 = 6;
func_80938670(this);
} else if (this->unk_1FF != 0) {
@@ -576,7 +578,7 @@ void func_80937FC8(ObjBean* this, PlayState* play) {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
}
} else {
- func_800B85E0(&this->dyna.actor, play, 28.0f, 0x2E);
+ Actor_OfferTalkExchangeEquiCylinder(&this->dyna.actor, play, 28.0f, PLAYER_IA_MAGIC_BEANS);
}
}
}
@@ -588,20 +590,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);
- play_sound(NA_SE_SY_ERROR);
+ CutsceneManager_Stop(this->dyna.actor.csId);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_1E4 = 0;
func_80937FB0(this);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -614,12 +616,12 @@ void func_80938298(ObjBean* this, PlayState* play) {
if (this->unk_1E0 >= 3) {
this->unk_1E4 = 3;
- Flags_SetSwitch(play, OBJBEAN_GET_7F(&this->dyna.actor, 0));
+ Flags_SetSwitch(play, OBJBEAN_GET_SWITCH_FLAG_1(&this->dyna.actor, 0));
this->unk_1E4 = 5;
func_8093833C(this);
} else if (this->unk_1E4 == 4) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
- play_sound(NA_SE_SY_ERROR);
+ CutsceneManager_Stop(this->dyna.actor.csId);
+ Audio_PlaySfx(NA_SE_SY_ERROR);
this->unk_1E4 = 0;
func_80937FB0(this);
}
@@ -634,7 +636,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);
}
}
@@ -670,7 +672,7 @@ void func_80938444(ObjBean* this, PlayState* play) {
} else {
this->unk_1B2 = 1;
}
- func_800B9010(&this->dyna.actor, NA_SE_PL_PLANT_GROW_UP - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_PL_PLANT_GROW_UP - SFX_FLAG);
}
void func_809384E8(ObjBean* this) {
@@ -735,7 +737,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 +747,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 +767,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);
@@ -775,7 +777,7 @@ void func_80938874(ObjBean* this) {
this->actionFunc = func_809388A8;
this->dyna.actor.draw = func_80938E00;
this->dyna.actor.flags |= ACTOR_FLAG_10;
- this->dyna.actor.speedXZ = 0.0f;
+ this->dyna.actor.speed = 0.0f;
}
void func_809388A8(ObjBean* this, PlayState* play) {
@@ -784,8 +786,8 @@ void func_809388A8(ObjBean* this, PlayState* play) {
func_80937268(this, play);
func_809372A8(this);
func_8093892C(this);
- } else if (DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
- func_800B9010(&this->dyna.actor, NA_SE_PL_PLANT_MOVE - SFX_FLAG);
+ } else if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_PL_PLANT_MOVE - SFX_FLAG);
}
func_80936F24(this);
}
@@ -797,7 +799,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 +812,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);
@@ -847,13 +849,13 @@ void func_80938AD8(ObjBean* this, PlayState* play) {
func_80937160(this);
if (this->unk_1B2 == 25) {
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_PL_PLANT_GROW_BIG);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_PL_PLANT_GROW_BIG);
}
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) {
@@ -889,7 +891,7 @@ void func_80938C1C(Actor* thisx, PlayState* play) {
if (this->unk_1DF > 0) {
this->unk_1DF--;
if (this->unk_1DF == 0) {
- play_sound(NA_SE_SY_TRE_BOX_APPEAR);
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
}
}
@@ -909,7 +911,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 +927,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 +941,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..f21610891 100644
--- a/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.h
+++ b/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.h
@@ -8,19 +8,19 @@ struct ObjBean;
typedef void (*ObjBeanActionFunc)(struct ObjBean*, PlayState*);
typedef void (*ObjBeanUnkFunc)(struct ObjBean*);
-#define OBJBEAN_GET_7F(thisx, x) (((thisx)->params + (x)) & 0x7F)
+#define OBJBEAN_GET_SWITCH_FLAG_1(thisx, offset) (((thisx)->params + (offset)) & 0x7F)
#define OBJBEAN_GET_80(thisx) (((thisx)->params >> 7) & 1)
#define OBJBEAN_GET_3F00(thisx) (((thisx)->params >> 8) & 0x3F)
-#define OBJBEAN_GET_3F80(thisx, x) ((((thisx)->params >> 7) + (x)) & 0x7F)
+#define OBJBEAN_GET_SWITCH_FLAG_2(thisx, offset) ((((thisx)->params >> 7) + (offset)) & 0x7F)
#define OBJBEAN_GET_C000(thisx) (((thisx)->params >> 0xE) & 3)
#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 f8534afea..0a50c85c5 100644
--- a/src/overlays/actors/ovl_Obj_Bell/z_obj_bell.c
+++ b/src/overlays/actors/ovl_Obj_Bell/z_obj_bell.c
@@ -188,11 +188,11 @@ s32 func_80A357A8(ObjBell* this, PlayState* play) {
this->unk_20E = 10;
switch (this->dyna.actor.colChkInfo.damageEffect) {
case 15:
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_BIGBELL);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_BIGBELL);
func_80A35510(this, 1);
break;
case 14:
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_BIGBELL);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_BIGBELL);
func_80A35510(this, 2);
break;
default:
@@ -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 4b7e9f471..afcf7aaa0 100644
--- a/src/overlays/actors/ovl_Obj_Bigicicle/z_obj_bigicicle.c
+++ b/src/overlays/actors/ovl_Obj_Bigicicle/z_obj_bigicicle.c
@@ -111,7 +111,7 @@ void ObjBigicicle_Init(Actor* thisx, PlayState* play) {
}
Actor_SetScale(&this->actor, sp28 * 0.001f);
- this->actor.params &= 0xFF;
+ this->actor.params = OBJBIGICLE_GET_SWITCH_FLAG_MASK(&this->actor);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
sp30 = sp28 * (1.0f / 60.0f);
@@ -125,7 +125,7 @@ void ObjBigicicle_Init(Actor* thisx, PlayState* play) {
this->collider2.dim.height = this->collider2.dim.height * sp30;
this->collider2.dim.yShift = this->collider2.dim.yShift * sp30;
- if (Flags_GetSwitch(play, this->actor.params)) {
+ if (Flags_GetSwitch(play, OBJBIGICLE_GET_SWITCH_FLAG(&this->actor))) {
Actor_Kill(&this->actor);
return;
}
@@ -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;
@@ -247,8 +247,8 @@ void func_80AE9258(ObjBigicicle* this, PlayState* play) {
icePoly = (ObjIcePoly*)itemAction;
temp_f0 = this->actor.world.pos.y - icePoly->actor.world.pos.y;
if ((temp_f0 < icePoly->colliders1[0].dim.height) && (temp_f0 > 0.0f) &&
- (Actor_XZDistanceBetweenActors(&this->actor, &icePoly->actor) < icePoly->colliders1[0].dim.radius)) {
- Flags_SetSwitch(play, this->actor.params);
+ (Actor_WorldDistXZToActor(&this->actor, &icePoly->actor) < icePoly->colliders1[0].dim.radius)) {
+ Flags_SetSwitch(play, OBJBIGICLE_GET_SWITCH_FLAG(&this->actor));
this->actionFunc = func_80AE939C;
return;
}
@@ -256,7 +256,7 @@ void func_80AE9258(ObjBigicicle* this, PlayState* play) {
itemAction = itemAction->next;
}
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->actionFunc = func_80AE939C;
} else {
Collider_UpdateCylinder(&this->actor, &this->collider1);
@@ -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_Bigicicle/z_obj_bigicicle.h b/src/overlays/actors/ovl_Obj_Bigicicle/z_obj_bigicicle.h
index 2eb5a00bd..fc506e62b 100644
--- a/src/overlays/actors/ovl_Obj_Bigicicle/z_obj_bigicicle.h
+++ b/src/overlays/actors/ovl_Obj_Bigicicle/z_obj_bigicicle.h
@@ -7,6 +7,8 @@ struct ObjBigicicle;
typedef void (*ObjBigicicleActionFunc)(struct ObjBigicicle*, PlayState*);
+#define OBJBIGICLE_GET_SWITCH_FLAG_MASK(thisx) ((thisx)->params & 0xFF)
+#define OBJBIGICLE_GET_SWITCH_FLAG(thisx) ((thisx)->params)
#define OBJBIGICLE_GET_FF00(thisx) (((thisx)->params >> 8) & 0xFF)
typedef struct ObjBigicicle {
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..f21ebff2b 100644
--- a/src/overlays/actors/ovl_Obj_Blockstop/z_obj_blockstop.c
+++ b/src/overlays/actors/ovl_Obj_Blockstop/z_obj_blockstop.c
@@ -32,7 +32,7 @@ ActorInit Obj_Blockstop_InitVars = {
void ObjBlockstop_Init(Actor* thisx, PlayState* play) {
ObjBlockstop* this = THIS;
- if (Flags_GetSwitch(play, this->actor.params)) {
+ if (Flags_GetSwitch(play, OBJBLOCKSTOP_GET_SWITCH_FLAG(&this->actor))) {
Actor_Kill(&this->actor);
}
this->actionFunc = ObjBlockstop_CheckForBlock;
@@ -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)) {
- Flags_SetSwitch(play, this->actor.params);
- if (ActorCutscene_GetLength(this->actor.cutscene) != -1) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ Flags_SetSwitch(play, OBJBLOCKSTOP_GET_SWITCH_FLAG(&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_Blockstop/z_obj_blockstop.h b/src/overlays/actors/ovl_Obj_Blockstop/z_obj_blockstop.h
index 15d45a90b..e6ad9f696 100644
--- a/src/overlays/actors/ovl_Obj_Blockstop/z_obj_blockstop.h
+++ b/src/overlays/actors/ovl_Obj_Blockstop/z_obj_blockstop.h
@@ -7,6 +7,8 @@ struct ObjBlockstop;
typedef void (*ObjBlockstopActionFunc)(struct ObjBlockstop*, PlayState*);
+#define OBJBLOCKSTOP_GET_SWITCH_FLAG(thisx) ((thisx)->params)
+
typedef struct ObjBlockstop {
/* 0x000 */ Actor actor;
/* 0x144 */ ObjBlockstopActionFunc actionFunc;
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 c48ff332c..cf2ef3ded 100644
--- a/src/overlays/actors/ovl_Obj_Boat/z_obj_boat.c
+++ b/src/overlays/actors/ovl_Obj_Boat/z_obj_boat.c
@@ -16,7 +16,7 @@ void ObjBoat_Destroy(Actor* thisx, PlayState* play);
void ObjBoat_Update(Actor* thisx, PlayState* play);
void ObjBoat_Draw(Actor* thisx, PlayState* play);
-void func_80B9B428(Actor* thisx, PlayState* play2);
+void ObjBoat_UpdateCutscene(Actor* thisx, PlayState* play2);
ActorInit Obj_Boat_InitVars = {
ACTOR_OBJ_BOAT,
@@ -37,14 +37,21 @@ static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneDownward, 1000, ICHAIN_STOP),
};
-s16 func_80B9AF50(ObjBoat* this, Vec3f* arg0) {
+/**
+ * Get the next point on the path and the yaw to use to get there.
+ *
+ * @param this
+ * @param nextPoint Position of next point on path
+ * @return yaw to use (or opposite of yaw if reversing)
+ */
+s16 ObjBoat_GetNextPoint(ObjBoat* this, Vec3f* nextPoint) {
s16 yaw;
- Vec3s* temp = &this->unk_164[(s32)this->unk_15C];
+ Vec3s* curPoint = &this->points[(s32)this->curPointIndex];
- Math_Vec3s_ToVec3f(arg0, &temp[this->unk_15D]);
- yaw = Math_Vec3f_Yaw(&this->dyna.actor.world.pos, arg0);
+ Math_Vec3s_ToVec3f(nextPoint, &curPoint[this->direction]);
+ yaw = Math_Vec3f_Yaw(&this->dyna.actor.world.pos, nextPoint);
- return ((this->unk_15D > 0) ? yaw : (yaw + 0x8000));
+ return ((this->direction > 0) ? yaw : yaw + 0x8000);
}
void ObjBoat_Init(Actor* thisx, PlayState* play) {
@@ -54,20 +61,20 @@ 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 = func_80B9B428;
+ this->dyna.actor.update = ObjBoat_UpdateCutscene;
} else {
- path = &play->setupPathList[OBJBOAT_GET_PATH(thisx)];
- this->unk_163 = path->count - 1;
- this->unk_164 = Lib_SegmentedToVirtual(path->points);
- this->unk_15D = 1;
- this->dyna.actor.world.pos.x = this->unk_164[this->unk_15C].x;
- this->dyna.actor.world.pos.z = this->unk_164[this->unk_15C].z;
- this->dyna.actor.shape.rot.y = func_80B9AF50(this, &sp24);
+ path = &play->setupPathList[OBJBOAT_GET_PATH_INDEX(thisx)];
+ this->maxPointIndex = path->count - 1;
+ this->points = Lib_SegmentedToVirtual(path->points);
+ this->direction = 1;
+ this->dyna.actor.world.pos.x = this->points[this->curPointIndex].x;
+ this->dyna.actor.world.pos.z = this->points[this->curPointIndex].z;
+ this->dyna.actor.shape.rot.y = ObjBoat_GetNextPoint(this, &sp24);
this->dyna.actor.world.rot.y = this->dyna.actor.shape.rot.y;
- this->unk_15D = -this->unk_15D;
+ this->direction = -this->direction;
}
}
@@ -77,105 +84,114 @@ void ObjBoat_Destroy(Actor* thisx, PlayState* play) {
DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
}
-void func_80B9B124(ObjBoat* this) {
- this->unk_160 += 1000;
- this->dyna.actor.world.pos.y = Math_SinS(this->unk_160) + this->dyna.actor.home.pos.y;
- this->dyna.actor.shape.rot.x = Math_SinS(this->unk_160) * 100.0f;
- this->dyna.actor.shape.rot.z = Math_SinS(this->unk_160 * 2) * 50.0f;
+void ObjBoat_SetRotations(ObjBoat* this) {
+ this->angle += 0x3E8;
+ this->dyna.actor.world.pos.y = Math_SinS(this->angle) + this->dyna.actor.home.pos.y;
+ this->dyna.actor.shape.rot.x = Math_SinS(this->angle) * 100.0f;
+ this->dyna.actor.shape.rot.z = Math_SinS(this->angle * 2) * 50.0f;
}
void ObjBoat_Update(Actor* thisx, PlayState* play) {
s32 pad;
ObjBoat* this = THIS;
Player* player = GET_PLAYER(play);
- s32 temp = DynaPolyActor_IsInRidingMovingState(&this->dyna);
- f32 sp3C = 0.0f;
- s16 sp3A = this->dyna.actor.shape.rot.y;
- Vec3f sp2C;
+ s32 isPlayerOnTop = DynaPolyActor_IsPlayerOnTop(&this->dyna);
+ f32 speedTarget = 0.0f;
+ s16 yawTarget = this->dyna.actor.shape.rot.y;
+ Vec3f nextPoint;
- if ((temp != 0) || ((DynaPolyActor_IsInRidingFallingState(&this->dyna)))) {
- if ((this->unk_15F == 0) && (OBJBOAT_GET_4000(thisx) || ((temp != 0) && (this->unk_15C == this->unk_15E)))) {
- this->unk_15D = -this->unk_15D;
- if (this->unk_15D > 0) {
- this->unk_15E = this->unk_163;
+ if (isPlayerOnTop || DynaPolyActor_IsActorOnTop(&this->dyna)) {
+ if ((this->timer == 0) &&
+ (OBJBOAT_GET_4000(thisx) || (isPlayerOnTop && (this->curPointIndex == this->lastPointIndex)))) {
+ this->direction = -this->direction;
+ if (this->direction > 0) {
+ this->lastPointIndex = this->maxPointIndex;
} else {
- this->unk_15E = 0;
+ this->lastPointIndex = 0;
}
- this->unk_15F = 60;
+ this->timer = 60;
}
- } else if (this->dyna.actor.speedXZ == 0.0f) {
- if (this->unk_15F != 0) {
- this->unk_15F--;
+ } else if (this->dyna.actor.speed == 0.0f) {
+ if (this->timer != 0) {
+ this->timer--;
}
}
- if (this->unk_15C != this->unk_15E) {
- sp3A = func_80B9AF50(this, &sp2C);
- if (Math_Vec3f_DistXZ(&this->dyna.actor.world.pos, &sp2C) < 200.0f) {
- this->unk_15C += this->unk_15D;
- if (this->unk_15C == this->unk_15E) {
+
+ if (this->curPointIndex != this->lastPointIndex) {
+ yawTarget = ObjBoat_GetNextPoint(this, &nextPoint);
+ if (Math_Vec3f_DistXZ(&this->dyna.actor.world.pos, &nextPoint) < 200.0f) {
+ this->curPointIndex += this->direction;
+ if (this->curPointIndex == this->lastPointIndex) {
if (OBJBOAT_GET_4000(thisx)) {
- this->unk_15C = 0;
- } else if (this->dyna.actor.speedXZ == 0.0f) {
- this->unk_15C = 0;
- this->unk_15D = -1;
+ this->curPointIndex = 0;
+ } else if (this->dyna.actor.speed == 0.0f) {
+ this->curPointIndex = 0;
+ this->direction = -1;
}
}
} else {
- sp3C = this->unk_15D * (OBJBOAT_GET_4000(thisx) ? 5.0f : 3.0f);
+ speedTarget = this->direction * (OBJBOAT_GET_4000(thisx) ? 5.0f : 3.0f);
}
}
+
if (player->csMode != PLAYER_CSMODE_26) {
- Math_ScaledStepToS(&this->dyna.actor.shape.rot.y, sp3A, (s16)(s32)(fabsf(this->dyna.actor.speedXZ) * 40.0f));
+ Math_ScaledStepToS(&this->dyna.actor.shape.rot.y, yawTarget, (s32)(fabsf(this->dyna.actor.speed) * 40.0f));
this->dyna.actor.world.rot.y = this->dyna.actor.shape.rot.y;
- Math_StepToF(&this->dyna.actor.speedXZ, sp3C, 0.05f);
+ Math_StepToF(&this->dyna.actor.speed, speedTarget, 0.05f);
Actor_MoveWithGravity(&this->dyna.actor);
- if (this->dyna.actor.speedXZ != 0.0f) {
- func_800B9010(&this->dyna.actor, NA_SE_EV_PIRATE_SHIP - SFX_FLAG);
+ if (this->dyna.actor.speed != 0.0f) {
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_PIRATE_SHIP - SFX_FLAG);
}
}
- func_80B9B124(this);
+ ObjBoat_SetRotations(this);
}
-void func_80B9B428(Actor* thisx, PlayState* play2) {
+// Update used in cutscenes
+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->unk_15F != actionIndex->action) {
- this->dyna.actor.shape.rot.x = actionIndex->urot.x;
- if (actionIndex->action != 1) {
- Path* path = &play->setupPathList[OBJBOAT_GET_PATH(&this->dyna.actor)];
+ 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 == 3) {
- path = &play->setupPathList[path->unk1];
+ 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 (cue->id == 3) {
+ path = &play->setupPathList[path->additionalPathIndex];
}
- this->unk_163 = path->count;
- this->unk_164 = Lib_SegmentedToVirtual(path->points);
- Math_Vec3s_ToVec3f(&this->dyna.actor.world.pos, this->unk_164);
- this->dyna.actor.speedXZ = actionIndex->urot.z * (45.0f / 0x2000);
- this->unk_164++;
- this->unk_15C = 1;
+
+ this->maxPointIndex = path->count;
+ this->points = Lib_SegmentedToVirtual(path->points);
+ Math_Vec3s_ToVec3f(&this->dyna.actor.world.pos, this->points);
+ this->dyna.actor.speed = cue->rot.z * (45.0f / 0x2000);
+ this->points++;
+ this->curPointIndex = 1;
}
- this->unk_15F = actionIndex->action;
+
+ this->cueId = cue->id;
} else {
- if (actionIndex->action != 1) {
- Vec3f vec;
- f32 step;
+ if (cue->id != 1) {
+ Vec3f posTarget;
+ f32 distRemaining;
- Math_Vec3s_ToVec3f(&vec, this->unk_164);
- step = Math_Vec3f_StepTo(&this->dyna.actor.world.pos, &vec, this->dyna.actor.speedXZ);
- if ((this->unk_15C < this->unk_163) && (step < this->dyna.actor.speedXZ)) {
- this->unk_164++;
- this->unk_15C++;
+ Math_Vec3s_ToVec3f(&posTarget, this->points);
+ distRemaining = Math_Vec3f_StepTo(&this->dyna.actor.world.pos, &posTarget, this->dyna.actor.speed);
+ if ((this->curPointIndex < this->maxPointIndex) && (distRemaining < this->dyna.actor.speed)) {
+ this->points++;
+ this->curPointIndex++;
}
}
- if (actionIndex->action != 3) {
- func_80B9B124(this);
- if (actionIndex->action == 2) {
- func_800B9010(&this->dyna.actor, NA_SE_EV_PIRATE_SHIP - SFX_FLAG);
+
+ if (cue->id != 3) {
+ ObjBoat_SetRotations(this);
+ if (cue->id == 2) {
+ Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_PIRATE_SHIP - SFX_FLAG);
}
} else {
+ // Tumble in the air
this->dyna.actor.shape.rot.y += 0x7D0;
this->dyna.actor.shape.rot.x += 0x3E8;
this->dyna.actor.shape.rot.z += 0x1F4;
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 795c50689..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,21 +3,24 @@
#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;
typedef struct ObjBoat {
/* 0x000 */ DynaPolyActor dyna;
- /* 0x15C */ u8 unk_15C;
- /* 0x15D */ s8 unk_15D;
- /* 0x15E */ u8 unk_15E;
- /* 0x15F */ u8 unk_15F;
- /* 0x160 */ s16 unk_160;
+ /* 0x15C */ u8 curPointIndex;
+ /* 0x15D */ s8 direction; // To follow the path
+ /* 0x15E */ u8 lastPointIndex; // max point if direction is negative, first point if forwards
+ /* 0x15F */ union {
+ u8 timer;
+ u8 cueId;
+ };
+ /* 0x160 */ s16 angle; // Angle used to set rotations
/* 0x162 */ UNK_TYPE1 pad_162;
- /* 0x163 */ u8 unk_163;
- /* 0x164 */ Vec3s* unk_164;
+ /* 0x163 */ u8 maxPointIndex; // point at the other end from 0
+ /* 0x164 */ Vec3s* points;
} ObjBoat; // size = 0x168
#endif // Z_OBJ_BOAT_H
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..95ff47db2 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 },
@@ -182,7 +182,7 @@ void ObjBombiwa_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->actor, sInitChain);
Collider_InitCylinder(play, &this->collider);
- if (Flags_GetSwitch(play, OBJBOMBIWA_GET_7F(&this->actor))) {
+ if (Flags_GetSwitch(play, OBJBOMBIWA_GET_SWITCH_FLAG(&this->actor))) {
Actor_Kill(&this->actor);
return;
}
@@ -342,10 +342,10 @@ void func_80939EF4(ObjBombiwa* this, PlayState* play) {
}
if (sp28->unk_0C(&this->actor)) {
- Flags_SetSwitch(play, OBJBOMBIWA_GET_7F(&this->actor));
+ Flags_SetSwitch(play, OBJBOMBIWA_GET_SWITCH_FLAG(&this->actor));
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 80, NA_SE_EV_WALL_BROKEN);
if (OBJBOMBIWA_GET_8000(&this->actor)) {
- play_sound(NA_SE_SY_CORRECT_CHIME);
+ Audio_PlaySfx(NA_SE_SY_CORRECT_CHIME);
}
if (params == OBJBOMBIWA_100_0) {
@@ -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_Bombiwa/z_obj_bombiwa.h b/src/overlays/actors/ovl_Obj_Bombiwa/z_obj_bombiwa.h
index b49a89323..911d804fc 100644
--- a/src/overlays/actors/ovl_Obj_Bombiwa/z_obj_bombiwa.h
+++ b/src/overlays/actors/ovl_Obj_Bombiwa/z_obj_bombiwa.h
@@ -7,7 +7,7 @@ struct ObjBombiwa;
typedef void (*ObjBombiwaActionFunc)(struct ObjBombiwa*, PlayState*);
-#define OBJBOMBIWA_GET_7F(thisx) ((thisx)->params & 0x7F)
+#define OBJBOMBIWA_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
#define OBJBOMBIWA_GET_100(thisx) (((thisx)->params >> 8) & 1)
#define OBJBOMBIWA_GET_8000(thisx) (((thisx)->params >> 0xF) & 1)
diff --git a/src/overlays/actors/ovl_Obj_Boyo/z_obj_boyo.c b/src/overlays/actors/ovl_Obj_Boyo/z_obj_boyo.c
index cfecbdad0..e5e53000a 100644
--- a/src/overlays/actors/ovl_Obj_Boyo/z_obj_boyo.c
+++ b/src/overlays/actors/ovl_Obj_Boyo/z_obj_boyo.c
@@ -1,13 +1,4 @@
-/*
- * File: z_obj_boyo.c
- * Overlay: ovl_Obj_Boyo
- * Description: Unused Bumper
- */
-
#include "z_obj_boyo.h"
-#include "overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.h"
-#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
-#include "objects/object_boyo/object_boyo.h"
#define FLAGS (ACTOR_FLAG_10)
@@ -18,7 +9,8 @@ void ObjBoyo_Destroy(Actor* thisx, PlayState* play2);
void ObjBoyo_Update(Actor* thisx, PlayState* play2);
void ObjBoyo_Draw(Actor* thisx, PlayState* play);
-ActorInit Obj_Boyo_InitVars = {
+/*
+const ActorInit Obj_Boyo_InitVars = {
ACTOR_OBJ_BOYO,
ACTORCAT_PROP,
FLAGS,
@@ -27,158 +19,22 @@ ActorInit Obj_Boyo_InitVars = {
(ActorFunc)ObjBoyo_Init,
(ActorFunc)ObjBoyo_Destroy,
(ActorFunc)ObjBoyo_Update,
- (ActorFunc)ObjBoyo_Draw,
+ (ActorFunc)ObjBoyo_Draw
};
+*/
-static ColliderCylinderInit sCylinderInit = {
- {
- COLTYPE_NONE,
- AT_NONE,
- AC_ON | AC_HARD | AC_TYPE_PLAYER,
- OC1_ON | OC1_TYPE_ALL,
- OC2_TYPE_2,
- COLSHAPE_CYLINDER,
- },
- {
- ELEMTYPE_UNK0,
- { 0x00000000, 0x00, 0x00 },
- { 0x01CBFFBE, 0x00, 0x00 },
- TOUCH_NONE | TOUCH_SFX_NORMAL,
- BUMP_ON,
- OCELEM_ON,
- },
- { 60, 140, 0, { 0, 0, 0 } },
-};
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Boyo/ObjBoyo_Init.s")
-static InitChainEntry sInitChain[] = {
- ICHAIN_F32(uncullZoneForward, 4000, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneScale, 300, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneDownward, 300, ICHAIN_CONTINUE),
- ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_STOP),
-};
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Boyo/ObjBoyo_Destroy.s")
-void ObjBoyo_Init(Actor* thisx, PlayState* play) {
- ObjBoyo* this = THIS;
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Boyo/func_809A5DC0.s")
- Actor_ProcessInitChain(&this->actor, sInitChain);
- Collider_InitCylinder(play, &this->collider);
- Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
- Collider_UpdateCylinder(&this->actor, &this->collider);
- this->actor.colChkInfo.mass = MASS_IMMOVABLE;
- this->unk_190 = Lib_SegmentedToVirtual(object_boyo_Matanimheader_000E88);
-}
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Boyo/func_809A5DE0.s")
-void ObjBoyo_Destroy(Actor* thisx, PlayState* play2) {
- PlayState* play = play2;
- ObjBoyo* this = THIS;
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Boyo/func_809A5E14.s")
- Collider_DestroyCylinder(play, &this->collider);
-}
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Boyo/func_809A5E24.s")
-void ObjBoyo_UpdatePlayerBumpValues(ObjBoyo* this, Player* target) {
- target->unk_B80 = 30.0f;
- target->unk_B84 = this->actor.yawTowardsPlayer;
-}
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Boyo/ObjBoyo_Update.s")
-void ObjBoyo_UpdatePirateBumpValues(ObjBoyo* src, EnKaizoku* target) {
- target->unk_2F0 = 30.0f;
- target->unk_2F4 = Actor_YawBetweenActors(&src->actor, &target->picto.actor);
-}
-
-void ObjBoyo_UpdateBombBumpValues(ObjBoyo* src, EnBom* target) {
- target->timer = 0;
-}
-
-BumperCollideInfo sBumperCollideInfo[] = {
- { ACTOR_PLAYER, (BumperCollideActorFunc)ObjBoyo_UpdatePlayerBumpValues },
- { ACTOR_EN_KAIZOKU, (BumperCollideActorFunc)ObjBoyo_UpdatePirateBumpValues },
- { ACTOR_EN_BOM, (BumperCollideActorFunc)ObjBoyo_UpdateBombBumpValues },
-};
-
-Actor* ObjBoyo_GetCollidedActor(ObjBoyo* this, PlayState* play, s32* num) {
- Actor* collideActor;
- BumperCollideInfo* collideInfo;
- s32 i;
-
- if (this->collider.base.ocFlags2 & OC2_HIT_PLAYER) {
- *num = 0;
- return &GET_PLAYER(play)->actor;
- }
-
- if (this->collider.base.ocFlags1 & OC2_UNK1) {
- for (collideActor = this->collider.base.oc, collideInfo = &sBumperCollideInfo[1], i = 1; i < 3;
- collideInfo++, i++) {
- if (collideInfo->id == collideActor->id) {
- *num = i;
- return collideActor;
- }
- }
- }
-
- return NULL;
-}
-
-void ObjBoyo_Update(Actor* thisx, PlayState* play2) {
- PlayState* play = play2;
- ObjBoyo* this = THIS;
- Actor* target;
- s32 num;
-
- target = ObjBoyo_GetCollidedActor(this, play, &num);
-
- if (target != NULL) {
- sBumperCollideInfo[num].actorCollideFunc(this, (void*)target);
- this->unk_194 = 100;
- this->unk_196 = 3;
- this->unk_198 = 0.01f;
- this->unk_19C = this->unk_1A0 = 0.03f;
- this->unk_1A4 = 0x3F40;
- this->unk_1A6 = 2000;
- this->unk_1A8 = 0;
- this->unk_1AA = 0x2DF7;
- this->unk_1AC = 600;
- }
-
- if (this->unk_194 > 0) {
- this->unk_194 -= this->unk_196;
- this->unk_1AA += this->unk_1AC;
- this->unk_1A8 += this->unk_1AA;
-
- this->actor.scale.x = this->actor.scale.z =
- (Math_CosS(this->unk_1A8 + this->unk_1A4) * this->unk_194 * this->unk_19C * this->unk_198) + 0.1f;
- this->actor.scale.y =
- (Math_CosS(this->unk_1A8 + this->unk_1A6) * this->unk_194 * this->unk_1A0 * this->unk_198) + 0.1f;
- } else {
- Actor_SetScale(&this->actor, 0.1f);
-
- if (this->collider.base.acFlags & AC_HIT) {
- this->unk_194 = 30;
- this->unk_196 = 2;
- this->unk_198 = 0.033333335f;
- this->unk_19C = 0.012f;
- this->unk_1A0 = 0.006f;
- this->unk_1A4 = 0x3F40;
- this->unk_1A6 = 2000;
- this->unk_1A8 = 0;
- this->unk_1AA = 15000;
- this->unk_1AC = 1600;
- }
- }
-
- this->collider.base.acFlags &= ~AC_HIT;
- this->collider.base.ocFlags1 &= ~OC1_HIT;
- this->collider.base.ocFlags2 &= ~OC2_HIT_PLAYER;
-
- CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
-
- if (thisx->xzDistToPlayer < 2000.0f) {
- CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
- }
-}
-
-void ObjBoyo_Draw(Actor* thisx, PlayState* play) {
- ObjBoyo* this = THIS;
-
- AnimatedMat_Draw(play, this->unk_190);
- Gfx_DrawDListOpa(play, object_boyo_DL_000300);
-}
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Boyo/ObjBoyo_Draw.s")
diff --git a/src/overlays/actors/ovl_Obj_Boyo/z_obj_boyo.h b/src/overlays/actors/ovl_Obj_Boyo/z_obj_boyo.h
index dcff2a893..feb95dcd1 100644
--- a/src/overlays/actors/ovl_Obj_Boyo/z_obj_boyo.h
+++ b/src/overlays/actors/ovl_Obj_Boyo/z_obj_boyo.h
@@ -5,27 +5,9 @@
struct ObjBoyo;
-typedef void (*BumperCollideActorFunc)(struct ObjBoyo*, void*);
-
-typedef struct {
- /* 0x0 */ s16 id;
- /* 0x4 */ BumperCollideActorFunc actorCollideFunc;
-} BumperCollideInfo; // size = 0x8
-
typedef struct ObjBoyo {
/* 0x000 */ Actor actor;
- /* 0x144 */ ColliderCylinder collider;
- /* 0x190 */ AnimatedMaterial* unk_190;
- /* 0x194 */ s16 unk_194;
- /* 0x196 */ s16 unk_196;
- /* 0x198 */ f32 unk_198;
- /* 0x19C */ f32 unk_19C;
- /* 0x1A0 */ f32 unk_1A0;
- /* 0x1A4 */ s16 unk_1A4;
- /* 0x1A6 */ s16 unk_1A6;
- /* 0x1A8 */ s16 unk_1A8;
- /* 0x1AA */ s16 unk_1AA;
- /* 0x1AC */ s16 unk_1AC;
+ /* 0x144 */ char unk_144[0x6C];
} ObjBoyo; // size = 0x1B0
#endif // Z_OBJ_BOYO_H
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 27f5cc273..8f326af48 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,45 +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(
+ 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, (this->actor.params & 0xFFF) | 0x1000, this->actor.cutscene, this->actor.unk20, &this->actor);
- if (temp_v0 != NULL) {
- this->pots[i] = temp_v0;
- temp_v0->myPotIndex = i;
- temp_v0->actor.cutscene = this->actor.cutscene;
+ 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, OBJCHAN_GET_SWITCH_FLAG(thisx))) {
this->stateFlags |= OBJCHAN_STATE_FIRE_DELAY;
this->stateFlags |= OBJCHAN_STATE_ON_FIRE;
@@ -209,10 +212,10 @@ void ObjChan_InitChandelier(ObjChan* this2, PlayState* play) {
this->actionFunc = ObjChan_ChandelierAction;
}
-//! @TODO: More descriptive name than Action?
-void ObjChan_ChandelierAction(ObjChan* this2, PlayState* play) {
- ObjChan* this = this2;
- ObjChan* temp;
+//! TODO: More descriptive name than Action?
+void ObjChan_ChandelierAction(ObjChan* this, PlayState* play) {
+ Actor* thisx = &this->actor;
+ ObjChan* pot;
s32 i;
Vec3f sp60;
Vec3s sp58;
@@ -229,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, OBJCHAN_GET_SWITCH_FLAG(thisx));
}
- if (Flags_GetSwitch(play, this->actor.params & 0x7F)) {
+ if (Flags_GetSwitch(play, OBJCHAN_GET_SWITCH_FLAG(thisx))) {
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;
@@ -279,7 +282,7 @@ void ObjChan_ChandelierAction(ObjChan* this2, PlayState* play) {
Math_StepToF(&this->flameSize, 1.0f, 0.05f);
this->rotation += this->rotationSpeed;
Math_StepToS(&this->rotationSpeed, OBJCHAN_ROTATION_SPEED, 5);
- func_800B9010(&this->actor, NA_SE_EV_CHANDELIER_ROLL - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_CHANDELIER_ROLL - SFX_FLAG);
}
}
}
@@ -314,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.unk20, NULL);
+ this->actor.csId, this->actor.halfDaysBits, NULL);
}
}
Actor_Kill(&this->actor);
@@ -337,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;
@@ -353,7 +357,7 @@ void ObjChan_CreateSmashEffects(ObjChan* this, PlayState* play) {
}
new_var2 = spA4 * Rand_ZeroOne();
EffectSsKakera_Spawn(play, &spDC, &spD0, &this->actor.world.pos, -260, phi_s0, 20, 0, 0, spA8 + new_var2, 0, 0,
- 50, -1, OBJECT_TSUBO, object_tsubo_DL_001960);
+ 50, -1, OBJECT_TSUBO, gPotShardDL);
}
func_800BBFB0(play, &this->actor.world.pos, 30.0f, 2, 20, 50, true);
func_800BBFB0(play, &this->actor.world.pos, 30.0f, 2, 10, 80, true);
@@ -373,16 +377,17 @@ 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);
+ gSPDisplayList(&opa[1], gChandelierCenterDL);
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);
+ gSPDisplayList(&xlu[1], gChandelierPotHolderDL);
POLY_XLU_DISP = &xlu[2];
CLOSE_DISPS(play->state.gfxCtx);
@@ -400,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);
+ gSPDisplayList(&dl[1], gChandelierPotDL);
POLY_OPA_DISP = &dl[2];
+
CLOSE_DISPS(play->state.gfxCtx);
if (this->stateFlags & OBJCHAN_STATE_ON_FIRE) {
@@ -414,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;
@@ -424,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..f97ecccda 100644
--- a/src/overlays/actors/ovl_Obj_Chan/z_obj_chan.h
+++ b/src/overlays/actors/ovl_Obj_Chan/z_obj_chan.h
@@ -5,6 +5,8 @@
struct ObjChan;
+#define OBJCHAN_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
+
#define OBJCHAN_SUBTYPE(thisx) (((thisx)->params >> 12) & 0xF)
#define OBJCHAN_SUBTYPE_CHANDELIER 0
#define OBJCHAN_SUBTYPE_POT 1
@@ -54,7 +56,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 b03344708..be3d243e0 100644
--- a/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c
+++ b/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c
@@ -303,13 +303,13 @@ void func_8098D99C(ObjComb* this, PlayState* play) {
temp_v0->parent = &this->actor;
if (this->actionFunc == func_8098DC60) {
temp_v0->velocity.y = 8.0f;
- temp_v0->speedXZ = 2.0f;
+ temp_v0->speed = 2.0f;
} else {
temp_v0->velocity.y = 10.0f;
- temp_v0->speedXZ = 2.0f;
+ temp_v0->speed = 2.0f;
}
this->unk_1B6 = 1;
- play_sound(NA_SE_SY_TRE_BOX_APPEAR);
+ Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
}
}
}
@@ -339,7 +339,7 @@ void ObjComb_Init(Actor* thisx, PlayState* play) {
return;
}
- Collider_SetJntSph(play, &this->collider, &this->actor, &sJntSphInit, &this->colliderElement);
+ Collider_SetJntSph(play, &this->collider, &this->actor, &sJntSphInit, this->colliderElements);
if ((sp2C == 0) && Item_CanDropBigFairy(play, OBJCOMB_GET_3F(&this->actor), OBJCOMB_GET_7F00(&this->actor))) {
this->unk_1B7 = 1;
@@ -406,7 +406,7 @@ void func_8098DC60(ObjComb* this, PlayState* play) {
} else {
if (this->unk_1B8 >= 0) {
if (this->unk_1B8 == 0) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALGOLD_ROLL);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_STALGOLD_ROLL);
if (Rand_ZeroOne() < 0.1f) {
this->unk_1B8 = Rand_S16Offset(40, 80);
} else {
@@ -431,15 +431,15 @@ void func_8098DE58(ObjComb* this) {
this->unk_1B4 = 100;
this->actor.terminalVelocity = -20.0f;
this->actor.gravity = -1.5f;
- this->actor.speedXZ = 0.0f;
+ this->actor.speed = 0.0f;
this->actionFunc = func_8098DEA0;
}
void func_8098DEA0(ObjComb* this, PlayState* play) {
this->unk_1B4--;
- if ((this->actor.bgCheckFlags & 1) || (this->unk_1B4 <= 0)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (this->unk_1B4 <= 0)) {
func_8098DA74(this, play);
- if ((this->actor.bgCheckFlags & 0x20) && (this->actor.depthInWater > 30.0f)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WATER) && (this->actor.depthInWater > 30.0f)) {
func_8098D47C(this, play);
} else {
func_8098D19C(this, play);
@@ -447,11 +447,11 @@ void func_8098DEA0(ObjComb* this, PlayState* play) {
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EV_HONEYCOMB_BROKEN);
func_8098E098(this);
} else {
- if (this->actor.bgCheckFlags & 0x40) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) {
func_8098D6E0(this, play);
}
- if (this->actor.bgCheckFlags & 0x20) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER) {
this->actor.gravity = -0.5f;
this->actor.velocity.y *= 0.8f;
this->unk_1AE >>= 1;
@@ -469,13 +469,13 @@ void func_8098DEA0(ObjComb* this, PlayState* play) {
if (this->unk_1B0 > 0x258) {
this->unk_1B0 = 0x258;
}
- func_800B9010(&this->actor, NA_SE_EV_HONEYCOMB_FALL - SFX_FLAG);
+ Actor_PlaySfx_Flagged(&this->actor, NA_SE_EV_HONEYCOMB_FALL - SFX_FLAG);
}
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_Comb/z_obj_comb.h b/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.h
index 0ee61baaf..0b1873bb3 100644
--- a/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.h
+++ b/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.h
@@ -19,7 +19,7 @@ typedef struct ObjComb {
/* 0x000 */ Actor actor;
/* 0x144 */ ObjCombActionFunc actionFunc;
/* 0x148 */ ColliderJntSph collider;
- /* 0x168 */ ColliderJntSphElement colliderElement;
+ /* 0x168 */ ColliderJntSphElement colliderElements[1];
/* 0x1A8 */ s16 unk_1A8;
/* 0x1AA */ s16 unk_1AA;
/* 0x1AC */ s16 unk_1AC;
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 9daa20bad..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;
@@ -107,15 +107,15 @@ void ObjDanpeilift_Move(ObjDanpeilift* this, PlayState* play) {
step = this->speed * 0.16f;
}
- Math_StepToF(&thisx->speedXZ, target, step);
- if ((thisx->speedXZ + 0.05f) < speed) {
- Math_Vec3f_Scale(&thisx->velocity, thisx->speedXZ / speed);
+ Math_StepToF(&thisx->speed, target, step);
+ if ((thisx->speed + 0.05f) < speed) {
+ Math_Vec3f_Scale(&thisx->velocity, thisx->speed / speed);
thisx->world.pos.x += thisx->velocity.x;
thisx->world.pos.y += thisx->velocity.y;
thisx->world.pos.z += thisx->velocity.z;
} else {
this->curPoint += this->direction;
- thisx->speedXZ *= 0.4f;
+ thisx->speed *= 0.4f;
isTeleporting = OBJDANPEILIFT_SHOULD_TELEPORT(thisx);
isPosUpdated = true;
if (((this->curPoint >= this->endPoint) && (this->direction > 0)) ||
@@ -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;
}
}
@@ -154,7 +154,7 @@ void ObjDanpeilift_Wait(ObjDanpeilift* this, PlayState* play) {
this->waitTimer--;
if (this->waitTimer <= 0) {
this->actionFunc = ObjDanpeilift_Move;
- this->dyna.actor.speedXZ = 0.0f;
+ this->dyna.actor.speed = 0.0f;
}
}
@@ -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 060e793ca..a809da57a 100644
--- a/src/overlays/actors/ovl_Obj_Demo/z_obj_demo.c
+++ b/src/overlays/actors/ovl_Obj_Demo/z_obj_demo.c
@@ -1,7 +1,7 @@
/*
* File: z_obj_demo.c
* Overlay: ovl_Obj_Demo
- * Description:
+ * Description: Cutscene triggers when player is in range
*/
#include "z_obj_demo.h"
@@ -32,8 +32,8 @@ ActorInit Obj_Demo_InitVars = {
void ObjDemo_Init(Actor* thisx, PlayState* play) {
ObjDemo* this = THIS;
- thisx->params = OBJDEMO_GET_FF(thisx);
- if ((thisx->params != OBJDEMO_FF_FF) && (Flags_GetSwitch(play, thisx->params))) {
+ thisx->params = OBJDEMO_GET_SWITCH_FLAG_MASK(thisx);
+ if ((OBJDEMO_GET_SWITCH_FLAG(thisx) != 0xFF) && (Flags_GetSwitch(play, OBJDEMO_GET_SWITCH_FLAG(thisx)))) {
Actor_Kill(&this->actor);
return;
}
@@ -60,8 +60,8 @@ void ObjDemo_Init(Actor* thisx, PlayState* play) {
}
void func_80983634(PlayState* play) {
- if ((play->sceneId == SCENE_CASTLE) && (Audio_GetActiveSequence(SEQ_PLAYER_BGM_MAIN) == NA_BGM_IKANA_CASTLE)) {
- Audio_QueueSeqCmd(0x100100FF);
+ if ((play->sceneId == SCENE_CASTLE) && (AudioSeq_GetActiveSeqId(SEQ_PLAYER_BGM_MAIN) == NA_BGM_IKANA_CASTLE)) {
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 1);
}
}
@@ -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) {
- Audio_QueueSeqCmd(NA_BGM_IKANA_CASTLE | 0x8000);
+ 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) {
- if (this->actor.params != 0xFF) {
- Flags_SetSwitch(play, this->actor.params);
+ this->actor.csId = CutsceneManager_GetAdditionalCsId(this->actor.csId);
+ if (this->actor.csId == CS_ID_NONE) {
+ if (OBJDEMO_GET_SWITCH_FLAG(&this->actor) != 0xFF) {
+ Flags_SetSwitch(play, OBJDEMO_GET_SWITCH_FLAG(&this->actor));
}
Actor_Kill(&this->actor);
}
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
func_80983634(play);
}
}
@@ -108,7 +108,8 @@ void func_80983704(ObjDemo* this, PlayState* play) {
void ObjDemo_Update(Actor* thisx, PlayState* play) {
ObjDemo* this = THIS;
- if ((this->actor.params != 0xFF) && Flags_GetSwitch(play, this->actor.params)) {
+ if ((OBJDEMO_GET_SWITCH_FLAG(&this->actor) != 0xFF) &&
+ Flags_GetSwitch(play, OBJDEMO_GET_SWITCH_FLAG(&this->actor))) {
Actor_Kill(&this->actor);
return;
}
diff --git a/src/overlays/actors/ovl_Obj_Demo/z_obj_demo.h b/src/overlays/actors/ovl_Obj_Demo/z_obj_demo.h
index 065a21fe9..6b9d39db3 100644
--- a/src/overlays/actors/ovl_Obj_Demo/z_obj_demo.h
+++ b/src/overlays/actors/ovl_Obj_Demo/z_obj_demo.h
@@ -3,12 +3,13 @@
#include "global.h"
-#define OBJDEMO_GET_FF(thisx) ((thisx)->params & 0xFF)
-#define OBJDEMO_FF_FF 0xFF
struct ObjDemo;
typedef void (*ObjDemoActionFunc)(struct ObjDemo*, PlayState*);
+#define OBJDEMO_GET_SWITCH_FLAG_MASK(thisx) ((thisx)->params & 0xFF)
+#define OBJDEMO_GET_SWITCH_FLAG(thisx) ((thisx)->params)
+
typedef struct ObjDemo {
/* 0x000 */ Actor actor;
/* 0x144 */ ObjDemoActionFunc actionFunc;
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 fce6d99ec..ac31cbc64 100644
--- a/src/overlays/actors/ovl_Obj_Dhouse/z_obj_dhouse.c
+++ b/src/overlays/actors/ovl_Obj_Dhouse/z_obj_dhouse.c
@@ -131,7 +131,7 @@ void ObjDhouse_Init(Actor* thisx, PlayState* play) {
DynaPolyActor_Init(&this->dyna, 0);
- if (Flags_GetSwitch(play, OBJDHOUSE_GET_7F(&this->dyna.actor))) {
+ if (Flags_GetSwitch(play, OBJDHOUSE_GET_SWITCH_FLAG(&this->dyna.actor))) {
this->dyna.actor.draw = func_80B13E40;
func_80B13908(this);
} else {
@@ -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;
}
@@ -434,14 +434,14 @@ void func_80B13940(ObjDhouse* this, PlayState* play2) {
PlayState* play = play2;
s32 sp20 = false;
- if (Flags_GetSwitch(play, OBJDHOUSE_GET_7F(&this->dyna.actor))) {
+ if (Flags_GetSwitch(play, OBJDHOUSE_GET_SWITCH_FLAG(&this->dyna.actor))) {
sp20 = true;
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_EXPLSION_LONG);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_EXPLSION_LONG);
}
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_Dhouse/z_obj_dhouse.h b/src/overlays/actors/ovl_Obj_Dhouse/z_obj_dhouse.h
index c03dbed7d..46f1af83b 100644
--- a/src/overlays/actors/ovl_Obj_Dhouse/z_obj_dhouse.h
+++ b/src/overlays/actors/ovl_Obj_Dhouse/z_obj_dhouse.h
@@ -7,7 +7,7 @@ struct ObjDhouse;
typedef void (*ObjDhouseActionFunc)(struct ObjDhouse*, PlayState*);
-#define OBJDHOUSE_GET_7F(thisx) ((thisx)->params & 0x7F)
+#define OBJDHOUSE_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
typedef struct {
/* 0x00 */ Vec3f unk_00;
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 9b6c81266..8a11c507b 100644
--- a/src/overlays/actors/ovl_Obj_Dora/z_obj_dora.c
+++ b/src/overlays/actors/ovl_Obj_Dora/z_obj_dora.c
@@ -274,21 +274,21 @@ void ObjDora_UpdateCollision(ObjDora* this, PlayState* play) {
case DORA_DMGEFF_STRONG:
case DORA_DMGEFF_LIGHT:
if (this->actor.colChkInfo.damageEffect == DORA_DMGEFF_LIGHT) {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_DORA_S);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_DORA_S);
this->lastGongHitType = DORA_HIT_LIGHT;
} else {
- Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_DORA_L);
+ Actor_PlaySfx(&this->actor, NA_SE_EV_DORA_L);
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_PlaySfxAtPos(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
+ 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;
@@ -332,20 +333,20 @@ void ObjDora_Draw(Actor* thisx, PlayState* play) {
Matrix_Push();
Matrix_RotateXS(this->gongRotation.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++, &gDoraGongDL);
+ gSPDisplayList(POLY_OPA_DISP++, &gDoraChainDL);
Matrix_Translate(position.x, position.y + gongForceX, position.z + gongForceX, MTXMODE_APPLY);
Matrix_RotateXS(this->gongRotation.z - this->gongRotation.x, MTXMODE_APPLY);
Matrix_Translate(-position.x, -position.y, -position.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++, &gDoraChainDL);
+ gSPDisplayList(POLY_OPA_DISP++, &gDoraGongDL);
Matrix_Pop();
} else {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, &gDoraChainDL);
gSPDisplayList(POLY_OPA_DISP++, &gDoraGongDL);
+ gSPDisplayList(POLY_OPA_DISP++, &gDoraChainDL);
}
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_Obj_Dowsing/z_obj_dowsing.c b/src/overlays/actors/ovl_Obj_Dowsing/z_obj_dowsing.c
index 01675c173..f1dc17968 100644
--- a/src/overlays/actors/ovl_Obj_Dowsing/z_obj_dowsing.c
+++ b/src/overlays/actors/ovl_Obj_Dowsing/z_obj_dowsing.c
@@ -65,6 +65,6 @@ void ObjDowsing_Update(Actor* thisx, PlayState* play) {
ObjDowsing* this = THIS;
if (!ObjDowsing_CheckValidSpawn(this, play)) {
- func_800B8C50(thisx, play);
+ Actor_SetClosestSecretDistance(thisx, play);
}
}
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 f0eaaf25a..13a88568b 100644
--- a/src/overlays/actors/ovl_Obj_Driftice/z_obj_driftice.c
+++ b/src/overlays/actors/ovl_Obj_Driftice/z_obj_driftice.c
@@ -163,19 +163,19 @@ void func_80A66930(ObjDrifticeStruct2* arg0, ObjDriftice* this, s16* arg2, s16*
temp_f20 = 0.01f;
}
- Math_StepToS(&arg0->unk_00[1], 1200.0f * temp_f20, 0x64);
+ Math_StepToS(&arg0->unk_02, 1200.0f * temp_f20, 0x64);
phi_s0 = 2500.0f * temp_f20;
- Math_StepToS(&arg0->unk_00[3], Math_CosS(arg0->unk_00[2] * 6.5536f) * (120.0f * temp_f20), 0x28);
+ Math_StepToS(&arg0->unk_06, Math_CosS(arg0->unk_04 * 6.5536f) * (120.0f * temp_f20), 0x28);
Math_StepToF(&arg0->unk_08, 1.0f, 0.02f);
} else {
- Math_StepToS(&arg0->unk_00[1], 0, 0x96);
+ Math_StepToS(&arg0->unk_02, 0, 0x96);
phi_s0 = 0;
- Math_StepToS(&arg0->unk_00[3], 20, 7);
+ Math_StepToS(&arg0->unk_06, 20, 7);
Math_StepToF(&arg0->unk_08, 0.0f, 0.02f);
}
- Math_ScaledStepToS(arg0->unk_00, this->dyna.actor.yawTowardsPlayer, arg0->unk_00[1]);
- *arg3 = arg0->unk_00[0];
- Math_ScaledStepToS(&arg0->unk_00[2], phi_s0, arg0->unk_00[3]);
+ Math_ScaledStepToS(&arg0->unk_00, this->dyna.actor.yawTowardsPlayer, arg0->unk_02);
+ *arg3 = arg0->unk_00;
+ Math_ScaledStepToS(&arg0->unk_04, phi_s0, arg0->unk_06);
for (i = 0; i < 2; i++) {
temp_s0 = &arg0->unk_0C[i];
@@ -195,8 +195,7 @@ void func_80A66930(ObjDrifticeStruct2* arg0, ObjDriftice* this, s16* arg2, s16*
temp_f22 *= arg0->unk_08;
- //! FAKE:
- *arg2 = arg0->unk_00[2] + (s32)((void)0, temp_f22);
+ *arg2 = (s32)temp_f22 + arg0->unk_04;
}
void func_80A66C4C(ObjDrifticeStruct4* arg0, ObjDriftice* this, s16* arg2, s16* arg3) {
@@ -358,10 +357,10 @@ void func_80A671E0(ObjDriftice* this, PlayState* play) {
phi_f12 = this->unk_23C * 0.13f;
}
- Math_StepToF(&this->dyna.actor.speedXZ, phi_f0, phi_f12);
+ Math_StepToF(&this->dyna.actor.speed, phi_f0, phi_f12);
- if ((this->dyna.actor.speedXZ + 0.05f) < sp3C) {
- Math_Vec3f_Scale(&this->dyna.actor.velocity, this->dyna.actor.speedXZ / sp3C);
+ if ((this->dyna.actor.speed + 0.05f) < sp3C) {
+ Math_Vec3f_Scale(&this->dyna.actor.velocity, this->dyna.actor.speed / sp3C);
this->dyna.actor.world.pos.x += this->dyna.actor.velocity.x;
this->dyna.actor.world.pos.y += this->dyna.actor.velocity.y;
this->dyna.actor.world.pos.z += this->dyna.actor.velocity.z;
@@ -371,7 +370,7 @@ void func_80A671E0(ObjDriftice* this, PlayState* play) {
if (1) {}
- this->dyna.actor.speedXZ *= 0.5f;
+ this->dyna.actor.speed *= 0.5f;
if (((this->unk_164 >= this->unk_160) && (this->unk_168 > 0)) ||
((this->unk_164 <= 0) && (this->unk_168 < 0))) {
if (!OBJDRIFTICE_GET_1000(&this->dyna.actor)) {
@@ -389,7 +388,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 +407,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);
}
}
@@ -421,7 +420,7 @@ void func_80A674A8(ObjDriftice* this) {
void func_80A674C4(ObjDriftice* this, PlayState* play) {
this->unk_24C--;
if (this->unk_24C <= 0) {
- this->dyna.actor.speedXZ = 0.0f;
+ this->dyna.actor.speed = 0.0f;
func_80A671CC(this);
}
}
@@ -429,7 +428,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_Driftice/z_obj_driftice.h b/src/overlays/actors/ovl_Obj_Driftice/z_obj_driftice.h
index 21e0f8f27..f77e95eff 100644
--- a/src/overlays/actors/ovl_Obj_Driftice/z_obj_driftice.h
+++ b/src/overlays/actors/ovl_Obj_Driftice/z_obj_driftice.h
@@ -23,8 +23,10 @@ typedef struct {
} ObjDrifticeStruct3; // size = 0x14
typedef struct {
- /* 0x00 */ s16 unk_00[2];
- /* 0x04 */ f32 unk_04;
+ /* 0x00 */ s16 unk_00;
+ /* 0x02 */ s16 unk_02;
+ /* 0x04 */ s16 unk_04;
+ /* 0x06 */ s16 unk_06;
/* 0x08 */ f32 unk_08;
/* 0x0C */ ObjDrifticeStruct3 unk_0C[2];
} ObjDrifticeStruct2; // size = 0x34
@@ -56,6 +58,4 @@ typedef struct ObjDriftice {
/* 0x24C */ s32 unk_24C;
} ObjDriftice; // size = 0x250
-extern ActorInit Obj_Driftice_InitVars;
-
#endif // Z_OBJ_DRIFTICE_H
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 ceedeb6c4..069c4b89b 100644
--- a/src/overlays/actors/ovl_Obj_Etcetera/z_obj_etcetera.c
+++ b/src/overlays/actors/ovl_Obj_Etcetera/z_obj_etcetera.c
@@ -80,7 +80,7 @@ void ObjEtcetera_Init(Actor* thisx, PlayState* play) {
type = DEKU_FLOWER_TYPE_PINK;
}
- objectIndex = Object_GetIndex(&play->objectCtx, objectIds[type]);
+ objectIndex = Object_GetSlot(&play->objectCtx, objectIds[type]);
if (objectIndex >= 0) {
this->objIndex = objectIndex;
}
@@ -154,12 +154,12 @@ 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;
ObjEtcetera_StartRustleAnimation(this);
- } else if ((player->actor.speedXZ > 0.1f) ||
+ } else if ((player->actor.speed > 0.1f) ||
((player->unk_ABC < 0.0f) && !(player->stateFlags3 & PLAYER_STATE3_100))) {
// Player is walking on top of the Deku Flower, is at the very start of burrowing, or is at the very
// start of launching
@@ -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);
@@ -295,7 +298,7 @@ void ObjEtcetera_Setup(ObjEtcetera* this, PlayState* play) {
Actor_SetScale(&this->dyna.actor, 0.01f);
this->dyna.actor.scale.y = 0.02f;
this->dyna.actor.focus.pos.y = this->dyna.actor.home.pos.y + 10.0f;
- this->dyna.actor.targetMode = 3;
+ this->dyna.actor.targetMode = TARGET_MODE_3;
break;
case DEKU_FLOWER_TYPE_PINK_WITH_INITIAL_BOUNCE:
@@ -308,7 +311,10 @@ void ObjEtcetera_Setup(ObjEtcetera* this, PlayState* play) {
this->oscillationTimer = 30;
this->bounceOscillationScale = 0.0f;
this->dyna.actor.focus.pos.y = this->dyna.actor.home.pos.y + 10.0f;
- this->dyna.actor.targetMode = 3;
+ this->dyna.actor.targetMode = TARGET_MODE_3;
+ break;
+
+ default:
break;
}
}
@@ -321,8 +327,8 @@ void ObjEtcetera_Update(Actor* thisx, PlayState* play) {
if (floorBgId == BGCHECK_SCENE) {
floorPoly = this->dyna.actor.floorPoly;
- if (floorPoly != NULL && this->burrowFlag & 1) {
- func_800FAAB4(play, SurfaceType_GetLightSettingIndex(&play->colCtx, floorPoly, floorBgId));
+ if ((floorPoly != NULL) && (this->burrowFlag & 1)) {
+ Environment_ChangeLightSetting(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..9933b36f2 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,23 +87,23 @@ void func_80A4CA90(ObjFireshield* this) {
void func_80A4CABC(ObjFireshield* this) {
s32 pad;
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- s32 sp18 = OBJFIRESHIELD_GET_7F(&this->actor);
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ s32 sp18 = OBJFIRESHIELD_GET_FLAGS(&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);
}
}
void func_80A4CB7C(ObjFireshield* this) {
s32 pad;
- s32 sp18 = OBJFIRESHIELD_GET_7F(&this->actor);
+ s32 sp18 = OBJFIRESHIELD_GET_FLAGS(&this->actor);
if (this->unk_194 > 0) {
if (this->unk_194 == 20) {
@@ -113,13 +113,13 @@ 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));
}
void func_80A4CC54(ObjFireshield* this) {
- s32 temp_v0 = OBJFIRESHIELD_GET_7F(&this->actor);
+ s32 temp_v0 = OBJFIRESHIELD_GET_FLAGS(&this->actor);
s32 temp_v1 = 1 << (temp_v0 & 0x1F);
this->actionFunc = func_80A4CCBC;
@@ -128,7 +128,7 @@ void func_80A4CC54(ObjFireshield* this) {
}
void func_80A4CCBC(ObjFireshield* this) {
- s32 temp_v0 = OBJFIRESHIELD_GET_7F(&this->actor);
+ s32 temp_v0 = OBJFIRESHIELD_GET_FLAGS(&this->actor);
this->actionFunc = func_80A4CD28;
D_80A4D884[(temp_v0 & ~0x1F) >> 5] &= ~(1 << (temp_v0 & 0x1F));
@@ -141,7 +141,7 @@ void func_80A4CD28(ObjFireshield* this) {
void func_80A4CD34(Actor* thisx, PlayState* play) {
s32 pad;
ObjFireshield* this = THIS;
- s32 sp24 = Flags_GetSwitch(play, OBJFIRESHIELD_GET_7F(&this->actor));
+ s32 isSwitchFlagSet = Flags_GetSwitch(play, OBJFIRESHIELD_GET_FLAGS(&this->actor));
s32 phi_v1;
s32 phi_a0;
@@ -154,13 +154,13 @@ void func_80A4CD34(Actor* thisx, PlayState* play) {
phi_a0 = false;
}
} else {
- phi_a0 = Flags_GetSwitch(play, OBJFIRESHIELD_GET_3F80(&this->actor));
+ phi_a0 = Flags_GetSwitch(play, OBJFIRESHIELD_GET_SWITCH_FLAG(&this->actor));
phi_v1 = false;
}
if (phi_v1 || phi_a0) {
this->unk_19C = 0;
- } else if (sp24) {
+ } else if (isSwitchFlagSet) {
this->unk_19C = 0;
} else {
this->unk_19C = 1;
@@ -175,7 +175,7 @@ void func_80A4CD34(Actor* thisx, PlayState* play) {
void func_80A4CE28(ObjFireshield* this, PlayState* play) {
s32 pad;
- s32 sp30 = OBJFIRESHIELD_GET_7F(&this->actor);
+ s32 sp30 = OBJFIRESHIELD_GET_FLAGS(&this->actor);
s32 pad2[2];
s32 sp24;
s32 sp20;
@@ -189,7 +189,7 @@ void func_80A4CE28(ObjFireshield* this, PlayState* play) {
sp20 = false;
}
} else {
- sp20 = Flags_GetSwitch(play, OBJFIRESHIELD_GET_3F80(&this->actor));
+ sp20 = Flags_GetSwitch(play, OBJFIRESHIELD_GET_SWITCH_FLAG(&this->actor));
sp24 = false;
}
@@ -251,7 +251,7 @@ void func_80A4CE28(ObjFireshield* this, PlayState* play) {
}
void func_80A4D174(ObjFireshield* this) {
- s32 temp_v0 = OBJFIRESHIELD_GET_7F(&this->actor);
+ s32 temp_v0 = OBJFIRESHIELD_GET_FLAGS(&this->actor);
s32 temp_v1 = 1 << (temp_v0 & 0x1F);
if (!(D_80A4D864[(temp_v0 & ~0x1F) >> 5] & temp_v1)) {
@@ -315,10 +315,10 @@ 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 sp40 = OBJFIRESHIELD_GET_FLAGS(&this->actor);
s32 temp_a0;
s32 temp_v1;
@@ -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);
+ Actor_PlaySfx_Flagged(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_Fireshield/z_obj_fireshield.h b/src/overlays/actors/ovl_Obj_Fireshield/z_obj_fireshield.h
index ffe1d7a35..772f839bb 100644
--- a/src/overlays/actors/ovl_Obj_Fireshield/z_obj_fireshield.h
+++ b/src/overlays/actors/ovl_Obj_Fireshield/z_obj_fireshield.h
@@ -7,10 +7,10 @@ struct ObjFireshield;
typedef void (*ObjFireshieldActionFunc)(struct ObjFireshield*);
-#define OBJFIRESHIELD_GET_7F(thisx) ((thisx)->params & 0x7F)
+#define OBJFIRESHIELD_GET_FLAGS(thisx) ((thisx)->params & 0x7F)
#define OBJFIRESHIELD_GET_1F00(thisx) (((thisx)->params >> 8) & 0x1F)
#define OBJFIRESHIELD_GET_2000(thisx) (((thisx)->params >> 0xD) & 1)
-#define OBJFIRESHIELD_GET_3F80(thisx) (((thisx)->params >> 7) & 0x7F)
+#define OBJFIRESHIELD_GET_SWITCH_FLAG(thisx) (((thisx)->params >> 7) & 0x7F)
#define OBJFIRESHIELD_GET_C000(thisx) (((thisx)->params >> 0xE) & 3)
#define OBJFIRESHIELD_GET_ROTX(thisx) ((thisx)->home.rot.x & 1)
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 49e8ac934..cd8632659 100644
--- a/src/overlays/actors/ovl_Obj_Flowerpot/z_obj_flowerpot.c
+++ b/src/overlays/actors/ovl_Obj_Flowerpot/z_obj_flowerpot.c
@@ -4,6 +4,7 @@
* Description: Breakable Pot With Grass
*/
+#include "prevent_bss_reordering.h"
#include "z_obj_flowerpot.h"
#include "objects/object_flowerpot/object_flowerpot.h"
@@ -21,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];
@@ -254,7 +255,7 @@ void func_80A1BA44(ObjFlowerpot* this, PlayState* play) {
}
EffectSsKakera_Spawn(play, &spC4, &spB8, &spC4, -600, phi_s0, 30, 0, 0, (Rand_ZeroOne() * 12.0f) + 16.6f,
- phi_s1, 0, 35, -1, ACTOR_DEMO_GETITEM, object_flowerpot_DL_0015B0);
+ phi_s1, 0, 35, -1, OBJECT_FLOWERPOT, object_flowerpot_DL_0015B0);
}
spD0.y += 20.0f;
@@ -297,7 +298,7 @@ void func_80A1BD80(ObjFlowerpot* this, PlayState* play) {
}
EffectSsKakera_Spawn(play, &spBC, &spB0, &spBC, -240, phi_s0, 40, 0, 0, (Rand_ZeroOne() * 20.0f) + 10.6f, 0, 0,
- 42, -1, ACTOR_DEMO_GETITEM, object_flowerpot_DL_0015B0);
+ 42, -1, OBJECT_FLOWERPOT, object_flowerpot_DL_0015B0);
}
spBC.y = this->actor.world.pos.y + this->actor.depthInWater;
@@ -337,7 +338,7 @@ void func_80A1C0FC(ObjFlowerpot* this, PlayState* play) {
Math_Vec3f_Sum(&spB8, &spC4, &spB8);
EffectSsKakera_Spawn(play, &spB8, &spAC, &spB8, -100, 64, 40, 0, 0, (Rand_ZeroOne() * 16.0f) + 14.0f, 0, 0, 80,
- -1, ACTOR_DEMO_GETITEM, object_flowerpot_DL_0014F0);
+ -1, OBJECT_FLOWERPOT, object_flowerpot_DL_0014F0);
}
}
@@ -364,7 +365,7 @@ void func_80A1C328(ObjFlowerpot* this, PlayState* play) {
Math_Vec3f_Sum(&spB8, &spC4, &spB8);
EffectSsKakera_Spawn(play, &spB8, &spAC, &spB8, -80, 64, 44, 0, 0, (Rand_ZeroOne() * 16.0f) + 14.0f, 0, 0, 80,
- -1, ACTOR_DEMO_GETITEM, object_flowerpot_DL_0014F0);
+ -1, OBJECT_FLOWERPOT, object_flowerpot_DL_0014F0);
}
}
@@ -383,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) {
@@ -454,8 +456,8 @@ void func_80A1C838(ObjFlowerpot* this, PlayState* play) {
//! @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 collider
- func_800B8E58((Player*)this, NA_SE_PL_PULL_UP_POT);
- } else if ((this->actor.bgCheckFlags & 0x20) && (this->actor.depthInWater > 19.0f)) {
+ Player_PlaySfx((Player*)&this->actor, NA_SE_PL_PULL_UP_POT);
+ } else if ((this->actor.bgCheckFlags & BGCHECKFLAG_WATER) && (this->actor.depthInWater > 19.0f)) {
if (!(this->unk_1EA & 2)) {
func_80A1B914(this, play);
func_80A1C328(this, play);
@@ -490,7 +492,7 @@ void func_80A1C838(ObjFlowerpot* this, PlayState* play) {
if (this->unk_1EA & 1) {
Actor_MoveWithGravity(&this->actor);
func_80A1C5E8(this, play);
- if (this->actor.bgCheckFlags & 1) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
if (this->actor.colChkInfo.mass == MASS_IMMOVABLE) {
if (DynaPoly_GetActor(&play->colCtx, this->actor.floorBgId) == NULL) {
this->actor.flags &= ~ACTOR_FLAG_10;
@@ -518,7 +520,7 @@ void func_80A1C838(ObjFlowerpot* this, PlayState* play) {
s16 temp_v0_3 = this->actor.yawTowardsPlayer - GET_PLAYER(play)->actor.world.rot.y;
if (ABS_ALT(temp_v0_3) >= 0x5556) {
- Actor_PickUp(&this->actor, play, GI_NONE, 36.0f, 30.0f);
+ Actor_OfferGetItem(&this->actor, play, GI_NONE, 36.0f, 30.0f);
}
}
}
@@ -537,9 +539,9 @@ void func_80A1CC0C(ObjFlowerpot* this, PlayState* play) {
if (Actor_HasNoParent(&this->actor, play)) {
this->actor.room = play->roomCtx.curRoom.num;
- if (fabsf(this->actor.speedXZ) < 0.1f) {
+ if (fabsf(this->actor.speed) < 0.1f) {
func_80A1C818(this);
- func_800B8E58(GET_PLAYER(play), NA_SE_PL_PUT_DOWN_POT);
+ Player_PlaySfx(GET_PLAYER(play), NA_SE_PL_PUT_DOWN_POT);
this->collider.base.ocFlags1 &= ~OC1_TYPE_PLAYER;
} else {
Actor_MoveWithGravity(&this->actor);
@@ -587,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) {
@@ -601,7 +603,8 @@ void func_80A1CEF4(ObjFlowerpot* this2, PlayState* play) {
func_80A1C62C(this, play);
- if ((this->actor.bgCheckFlags & (0x8 | 0x2 | 0x1)) || sp28 || (this->unk_1E8 <= 0)) {
+ if ((thisx->bgCheckFlags & (BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH | BGCHECKFLAG_WALL)) || sp28 ||
+ (this->unk_1E8 <= 0)) {
if (!(this->unk_1EA & 2)) {
func_80A1B914(this, play);
func_80A1C0FC(this, play);
@@ -610,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 & 0x40) {
+ if (thisx->bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) {
if (!(this->unk_1EA & 2)) {
func_80A1B914(this, play);
func_80A1C328(this, play);
@@ -623,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);
@@ -653,7 +656,7 @@ void ObjFlowerpot_Update(Actor* thisx, PlayState* play2) {
func_80A1C554(this);
- if ((D_80A1D830 != play->gameplayFrames) && (play->roomCtx.curRoom.unk3 == 0)) {
+ if ((D_80A1D830 != play->gameplayFrames) && (play->roomCtx.curRoom.behaviorType1 == ROOM_BEHAVIOR_TYPE1_0)) {
func_80A1B3D0();
D_80A1D830 = play->gameplayFrames;
}
@@ -665,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);
@@ -678,7 +681,7 @@ void ObjFlowerpot_Draw(Actor* thisx, PlayState* play) {
}
if (!(this->unk_1EA & 2)) {
- if ((play->roomCtx.curRoom.unk3 == 0) && (this->actionFunc == func_80A1C838)) {
+ if ((play->roomCtx.curRoom.behaviorType1 == ROOM_BEHAVIOR_TYPE1_0) && (this->actionFunc == func_80A1C838)) {
if ((this->actor.projectedPos.z > -150.0f) && (this->actor.projectedPos.z < 400.0f)) {
func_80A1B840(&D_80A1D838[this->unk_1EB]);
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..a75a43cda 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);
@@ -43,6 +43,6 @@ void ObjFunen_Draw(Actor* thisx, PlayState* play) {
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, temp, 0x20, 0x20, 1, 0, temp, 0x20, 0x20));
- gSPDisplayList(POLY_XLU_DISP++, object_funen_DL_0000D0);
+ gSPDisplayList(POLY_XLU_DISP++, gStoneTowerSmokeDL);
CLOSE_DISPS(play->state.gfxCtx);
}
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 0581706d5..92479cc4a 100644
--- a/src/overlays/actors/ovl_Obj_Ghaka/z_obj_ghaka.c
+++ b/src/overlays/actors/ovl_Obj_Ghaka/z_obj_ghaka.c
@@ -7,7 +7,7 @@
#include "z_obj_ghaka.h"
#include "objects/object_ghaka/object_ghaka.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_20)
#define THIS ((ObjGhaka*)thisx)
@@ -39,7 +39,7 @@ ActorInit Obj_Ghaka_InitVars = {
static Vec3f D_80B3C960 = { 0.0f, 0.0f, 0.0f };
static InitChainEntry D_80B3C96C[] = {
- ICHAIN_U8(targetMode, 0, ICHAIN_CONTINUE),
+ ICHAIN_U8(targetMode, TARGET_MODE_0, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 30, ICHAIN_STOP),
};
@@ -61,22 +61,22 @@ 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.unk20, 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.unk20, 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);
}
}
void func_80B3C39C(ObjGhaka* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- s16 distDiff = this->dyna.actor.yawTowardsPlayer - this->dyna.actor.shape.rot.y;
+ s16 yaw = this->dyna.actor.yawTowardsPlayer - this->dyna.actor.shape.rot.y;
if (Actor_ProcessTalkRequest(&this->dyna.actor, &play->state)) {
func_80B3C29C(this);
- } else if (this->dyna.actor.xzDistToPlayer < 100.0f || this->dyna.actor.isTargeted) {
- if (distDiff <= -0x5556 || distDiff >= 0x5556) {
- func_800B863C(&this->dyna.actor, play);
+ } else if ((this->dyna.actor.xzDistToPlayer < 100.0f) || this->dyna.actor.isLockedOn) {
+ if ((yaw <= -0x5556) || (yaw >= 0x5556)) {
+ Actor_OfferTalkNearColChkInfoCylinder(&this->dyna.actor, play);
if (player->transformation == PLAYER_FORM_GORON) {
this->dyna.actor.textId = 0xCF3;
} else {
@@ -85,8 +85,8 @@ void func_80B3C39C(ObjGhaka* this, PlayState* play) {
}
}
- if (this->dyna.pushForce < 0.0f && !CHECK_WEEKEVENTREG(WEEKEVENTREG_20_20) &&
- player->transformation == PLAYER_FORM_GORON) {
+ if ((this->dyna.pushForce < 0.0f) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_20_20) &&
+ (player->transformation == PLAYER_FORM_GORON)) {
func_80B3C2B0(this);
} else {
player->stateFlags2 &= ~PLAYER_STATE2_10;
@@ -99,7 +99,7 @@ void func_80B3C4E0(ObjGhaka* this, PlayState* play) {
if (talkState == TEXT_STATE_5) {
if (Message_ShouldAdvance(play)) {
- play->msgCtx.msgMode = 0x43;
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
func_80B3C260(this);
}
@@ -107,20 +107,20 @@ void func_80B3C4E0(ObjGhaka* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
switch (play->msgCtx.choiceIndex) {
case 0:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
this->dyna.actor.textId = 0xCF5;
Message_StartTextbox(play, this->dyna.actor.textId, &this->dyna.actor);
break;
case 1:
- func_8019F208();
+ Audio_PlaySfx_MessageDecide();
this->dyna.actor.textId = 0xCF7;
Message_StartTextbox(play, this->dyna.actor.textId, &this->dyna.actor);
break;
case 2:
- func_8019F230();
- play->msgCtx.msgMode = 0x43;
+ Audio_PlaySfx_MessageCancel();
+ play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING;
play->msgCtx.stateTimer = 4;
func_80B3C260(this);
break;
@@ -141,9 +141,9 @@ void func_80B3C624(ObjGhaka* this, PlayState* play) {
func_80B3C2C4(this, play);
SET_WEEKEVENTREG(WEEKEVENTREG_20_20);
func_80B3C260(this);
- Audio_PlaySfxAtPos(&D_80B3C960, NA_SE_EV_BLOCK_BOUND);
+ Audio_PlaySfx_AtPos(&D_80B3C960, NA_SE_EV_BLOCK_BOUND);
} else {
- Audio_PlaySfxAtPos(&D_80B3C960, NA_SE_EV_ROCK_SLIDE - SFX_FLAG);
+ Audio_PlaySfx_AtPos(&D_80B3C960, NA_SE_EV_ROCK_SLIDE - SFX_FLAG);
}
}
@@ -154,11 +154,11 @@ 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);
- if (this->dyna.actor.floorPoly == 0) {
+ 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);
}
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_20_20)) {
@@ -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 501fb2ee4..a17f853df 100644
--- a/src/overlays/actors/ovl_Obj_Grass/z_obj_grass.c
+++ b/src/overlays/actors/ovl_Obj_Grass/z_obj_grass.c
@@ -8,7 +8,6 @@
#include "z_obj_grass.h"
#include "overlays/actors/ovl_Obj_Grass_Carry/z_obj_grass_carry.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#include "prevent_bss_reordering.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20)
@@ -441,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);
@@ -486,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 9872fb0b7..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,32 +208,32 @@ 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_XZDistanceBetweenActors(&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_YawBetweenActors(&this->actor, &player->actor);
- Actor_LiftActor(&this->actor, play);
+ 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);
}
}
@@ -246,8 +248,8 @@ void func_809AB610(ObjGrassCarry* this, PlayState* play) {
if (Actor_HasNoParent(&this->actor, play)) {
func_809AB6FC(this);
- this->actor.velocity.x = Math_SinS(this->actor.world.rot.y) * this->actor.speedXZ;
- this->actor.velocity.z = Math_CosS(this->actor.world.rot.y) * this->actor.speedXZ;
+ this->actor.velocity.x = Math_SinS(this->actor.world.rot.y) * this->actor.speed;
+ this->actor.velocity.z = Math_CosS(this->actor.world.rot.y) * this->actor.speed;
this->actor.gravity = -0.1f;
this->actor.terminalVelocity = -17.0f;
func_809AAF18(this);
@@ -283,7 +285,8 @@ void func_809AB77C(ObjGrassCarry* this, PlayState* play) {
this->unk_19A--;
- if ((this->actor.bgCheckFlags & (1 | 2 | 8)) || temp_v0 || (this->unk_19A <= 0)) {
+ if ((this->actor.bgCheckFlags & (BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH | BGCHECKFLAG_WALL)) || temp_v0 ||
+ (this->unk_19A <= 0)) {
func_809AAFE8(&this->actor.world.pos, play);
func_809AAF9C(&this->actor.world.pos, this->unk_198, play);
@@ -294,14 +297,14 @@ void func_809AB77C(ObjGrassCarry* this, PlayState* play) {
this->actor.room = this->unk_190->actor.room;
}
- if (!(this->actor.bgCheckFlags & 0x20)) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_WATER)) {
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 20, NA_SE_EV_PLANT_BROKEN);
}
func_809AB428(this);
return;
}
- if (this->actor.bgCheckFlags & 0x40) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) {
sp5C.y = this->actor.world.pos.y + this->actor.depthInWater;
for (phi_s0 = 0, i = 0; i < 4; i++, phi_s0 += 0x4000) {
@@ -326,7 +329,7 @@ void func_809AB77C(ObjGrassCarry* this, PlayState* play) {
D_809ABBFC = D_809ABBFC >> 1;
D_809ABC08 = D_809ABC08 >> 1;
D_809ABC04 = D_809ABC04 >> 1;
- this->actor.bgCheckFlags &= ~0x40;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_WATER_TOUCH;
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EV_DIVE_INTO_WATER_L);
}
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 9c38849c9..8802a257d 100644
--- a/src/overlays/actors/ovl_Obj_Hakaisi/z_obj_hakaisi.c
+++ b/src/overlays/actors/ovl_Obj_Hakaisi/z_obj_hakaisi.c
@@ -7,7 +7,7 @@
#include "z_obj_hakaisi.h"
#include "objects/object_hakaisi/object_hakaisi.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_20)
+#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_20)
#define THIS ((ObjHakaisi*)thisx)
@@ -98,7 +98,7 @@ void ObjHakaisi_Init(Actor* thisx, PlayState* play) {
}
Actor_SetScale(&this->dyna.actor, 1.0f);
- this->dyna.actor.targetMode = 0;
+ this->dyna.actor.targetMode = TARGET_MODE_0;
this->dyna.actor.colChkInfo.health = 30;
if (OBJHAKAISI_GET_FF(&this->dyna.actor) == 3) {
this->dyna.actor.draw = NULL;
@@ -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->switchFlag = OBJHAKAISI_GET_SWITCH_FLAG(thisx);
+ 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);
@@ -168,7 +168,7 @@ void func_80B14460(ObjHakaisi* this, PlayState* play) {
func_80B14510(this);
} else if (this->dyna.actor.textId != 0) {
if (ABS_ALT(sp26) < 0x2000) {
- func_800B8614(&this->dyna.actor, play, 100.0f);
+ Actor_OfferTalk(&this->dyna.actor, play, 100.0f);
}
}
@@ -192,24 +192,24 @@ 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);
}
}
void func_80B145F4(ObjHakaisi* this) {
this->unk_19A = 0;
- this->dyna.actor.flags |= ACTOR_FLAG_8000000;
- this->dyna.actor.flags &= ~ACTOR_FLAG_1;
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_WALL_BROKEN);
+ this->dyna.actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
+ this->dyna.actor.flags &= ~ACTOR_FLAG_TARGETABLE;
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_WALL_BROKEN);
this->actionFunc = func_80B14648;
}
@@ -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);
}
}
@@ -281,7 +281,7 @@ void func_80B14B6C(ObjHakaisi* this, PlayState* play, Vec3f vec, s16 arg3) {
s16 temp_s1;
Vec3f sp6C;
- Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_WALL_BROKEN);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_WALL_BROKEN);
for (i = 0; i < 5; i++) {
temp_s1 = Rand_Next();
@@ -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);
@@ -375,7 +375,7 @@ void func_80B151E0(ObjHakaisi* this, PlayState* play) {
this->dyna.actor.destroy = func_80B15254;
Actor_SetScale(&this->dyna.actor, 0.1f);
this->dyna.actor.shape.yOffset = 100.0f;
- this->dyna.actor.flags &= ~ACTOR_FLAG_1;
+ this->dyna.actor.flags &= ~ACTOR_FLAG_TARGETABLE;
func_80B15264(this);
}
@@ -403,7 +403,7 @@ void func_80B15330(ObjHakaisi* this, PlayState* play) {
this->dyna.actor.velocity.y += this->dyna.actor.gravity;
Actor_UpdatePos(&this->dyna.actor);
- if (this->dyna.actor.bgCheckFlags & 2) {
+ if (this->dyna.actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
func_80B14B6C(this, play, this->dyna.actor.world.pos, 40);
func_80B14CF8(play, this->dyna.actor.world.pos, 100, 30, 10);
Actor_Kill(&this->dyna.actor);
@@ -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..7ee84768a 100644
--- a/src/overlays/actors/ovl_Obj_Hakaisi/z_obj_hakaisi.h
+++ b/src/overlays/actors/ovl_Obj_Hakaisi/z_obj_hakaisi.h
@@ -8,7 +8,7 @@ struct ObjHakaisi;
typedef void (*ObjHakaisiActionFunc)(struct ObjHakaisi*, PlayState*);
#define OBJHAKAISI_GET_FF(thisx) ((thisx)->params & 0xFF)
-#define OBJHAKAISI_GET_SWITCHFLAG(thisx) (((thisx)->params & 0xFF00) >> 8)
+#define OBJHAKAISI_GET_SWITCH_FLAG(thisx) (((thisx)->params & 0xFF00) >> 8)
typedef struct ObjHakaisi {
/* 0x000 */ DynaPolyActor dyna;
@@ -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..5ccbf3d50 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;
}
@@ -180,7 +180,7 @@ void ObjHamishi_Init(Actor* thisx, PlayState* play) {
func_809A13A0(this, play);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 2.3f);
- if (Flags_GetSwitch(play, OBJHAMISHI_GET_SWITCHFLAG(&this->actor))) {
+ if (Flags_GetSwitch(play, OBJHAMISHI_GET_SWITCH_FLAG(&this->actor))) {
Actor_Kill(&this->actor);
return;
}
@@ -232,7 +232,7 @@ void ObjHamishi_Update(Actor* thisx, PlayState* play) {
} else {
func_809A10F4(this, play);
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EV_WALL_BROKEN);
- Flags_SetSwitch(play, OBJHAMISHI_GET_SWITCHFLAG(&this->actor));
+ Flags_SetSwitch(play, OBJHAMISHI_GET_SWITCH_FLAG(&this->actor));
Actor_Kill(&this->actor);
}
}
@@ -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_Hamishi/z_obj_hamishi.h b/src/overlays/actors/ovl_Obj_Hamishi/z_obj_hamishi.h
index 962a59612..48ea889d5 100644
--- a/src/overlays/actors/ovl_Obj_Hamishi/z_obj_hamishi.h
+++ b/src/overlays/actors/ovl_Obj_Hamishi/z_obj_hamishi.h
@@ -5,7 +5,7 @@
struct ObjHamishi;
-#define OBJHAMISHI_GET_SWITCHFLAG(thisx) ((thisx)->params & 0x7F)
+#define OBJHAMISHI_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
typedef struct ObjHamishi {
/* 0x000 */ Actor actor;
diff --git a/src/overlays/actors/ovl_Obj_Hana/z_obj_hana.c b/src/overlays/actors/ovl_Obj_Hana/z_obj_hana.c
index 97fbbec3d..fbc581aec 100644
--- a/src/overlays/actors/ovl_Obj_Hana/z_obj_hana.c
+++ b/src/overlays/actors/ovl_Obj_Hana/z_obj_hana.c
@@ -48,5 +48,5 @@ void ObjHana_Update(Actor* thisx, PlayState* play) {
}
void ObjHana_Draw(Actor* thisx, PlayState* play) {
- Gfx_DrawDListOpa(play, object_hana_DL_000500);
+ Gfx_DrawDListOpa(play, gGraveyardFlowersDL);
}
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 e3972be18..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,33 +108,33 @@ 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_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_WOOD_DOOR_OPEN_SPEEDY);
+ 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)) {
this->dyna.actor.parent->colChkInfo.health = 1;
}
@@ -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..3dde506b9 100644
--- a/src/overlays/actors/ovl_Obj_HsStump/z_obj_hsstump.c
+++ b/src/overlays/actors/ovl_Obj_HsStump/z_obj_hsstump.c
@@ -44,8 +44,8 @@ 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);
+ this->switchFlag = OBJHSSTUMP_GET_SWITCH_FLAG(thisx);
+ 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;
}
}
@@ -66,7 +71,7 @@ void ObjHsStump_SetupIdle(ObjHsStump* this, PlayState* play) {
}
void ObjHsStump_Idle(ObjHsStump* this, PlayState* play) {
- if (this->isHidden == true && Flags_GetSwitch(play, this->switchFlag)) {
+ if ((this->isHidden == true) && Flags_GetSwitch(play, this->switchFlag)) {
ObjHsStump_SetupAppear(this, play);
}
}
@@ -76,7 +81,7 @@ void ObjHsStump_SetupAppear(ObjHsStump* this, PlayState* play) {
this->framesAppeared = 0;
this->rotAngle = 0;
this->rotFactor = 3640.0f;
- func_8019F128(NA_SE_EN_NPC_APPEAR);
+ Audio_PlaySfx_2(NA_SE_EN_NPC_APPEAR);
this->actionFunc = ObjHsStump_Appear;
}
@@ -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_HsStump/z_obj_hsstump.h b/src/overlays/actors/ovl_Obj_HsStump/z_obj_hsstump.h
index 0f06fdfaf..479e17207 100644
--- a/src/overlays/actors/ovl_Obj_HsStump/z_obj_hsstump.h
+++ b/src/overlays/actors/ovl_Obj_HsStump/z_obj_hsstump.h
@@ -3,7 +3,7 @@
#include "global.h"
-#define OBJHSSTUMP_GET_SWITCHFLAG(thisx) ((thisx)->params & 0x7F)
+#define OBJHSSTUMP_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
#define OBJHSSTUMP_GET_ISHIDDEN(thisx) (((thisx)->params >> 12) & 0xF)
struct ObjHsStump;
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..5cced7f48 100644
--- a/src/overlays/actors/ovl_Obj_Hsblock/z_obj_hsblock.c
+++ b/src/overlays/actors/ovl_Obj_Hsblock/z_obj_hsblock.c
@@ -78,7 +78,7 @@ void ObjHsblock_Init(Actor* thisx, PlayState* play) {
func_8093E03C(this);
break;
case 1:
- if (Flags_GetSwitch(play, OBJHSBLOCK_GET_SWITCH(thisx))) {
+ if (Flags_GetSwitch(play, OBJHSBLOCK_GET_SWITCH_FLAG(thisx))) {
func_8093E03C(this);
} else {
func_8093E05C(this);
@@ -106,7 +106,7 @@ void func_8093E05C(ObjHsblock* this) {
}
void func_8093E0A0(ObjHsblock* this, PlayState* play) {
- if (Flags_GetSwitch(play, OBJHSBLOCK_GET_SWITCH(&this->dyna.actor))) {
+ if (Flags_GetSwitch(play, OBJHSBLOCK_GET_SWITCH_FLAG(&this-