diff --git a/Makefile b/Makefile
index 5103d58691..cfaf3d3449 100644
--- a/Makefile
+++ b/Makefile
@@ -362,7 +362,7 @@ ifeq ($(DEBUG_FEATURES),1)
GBI_DEFINES += -DGBI_DEBUG
endif
-CPPFLAGS += -P -xc -fno-dollars-in-identifiers $(CPP_DEFINES)
+CPPFLAGS += -P -xc -fno-dollars-in-identifiers $(CPP_DEFINES) $(GBI_DEFINES)
ASFLAGS += -march=vr4300 -32 -no-pad-sections -Iinclude -I$(EXTRACTED_DIR)
ifeq ($(COMPILER),gcc)
@@ -499,7 +499,6 @@ O_FILES := $(filter-out %_reloc.o,$(SPEC_O_FILES))
OVL_RELOC_FILES := $(filter %_reloc.o,$(SPEC_O_FILES))
# Automatic dependency files
-# (Only asm_processor dependencies and reloc dependencies are handled for now)
DEP_FILES := $(O_FILES:.o=.d) $(O_FILES:.o=.asmproc.d) $(OVL_RELOC_FILES:.o=.d) $(BUILD_DIR)/spec.d
TEXTURE_FILES_PNG_EXTRACTED := $(foreach dir,$(ASSET_BIN_DIRS_EXTRACTED),$(wildcard $(dir)/*.png))
@@ -732,7 +731,7 @@ $(BUILD_DIR)/src/makerom/%.o: CCASFLAGS := $(EGCS_CCASFLAGS)
$(BUILD_DIR)/src/makerom/%.o: ASOPTFLAGS := $(EGCS_ASOPTFLAGS)
endif
-ifeq ($(PERMUTER),) # permuter + preprocess.py misbehaves, permuter doesn't care about rodata diffs or bss ordering so just don't use it in that case
+ifeq ($(PERMUTER),) # permuter + preprocess.sh misbehaves, permuter doesn't care about rodata diffs or bss ordering so just don't use it in that case
# Handle encoding (UTF-8 -> EUC-JP) and custom pragmas
$(BUILD_DIR)/src/%.o: PREPROCESS := ./tools/preprocess.sh -v $(VERSION) -i $(ICONV) --
endif
diff --git a/assets/objects/gameplay_keep/link_textures.c b/assets/objects/gameplay_keep/link_textures.c
index 3564006310..2ce9e69688 100644
--- a/assets/objects/gameplay_keep/link_textures.c
+++ b/assets/objects/gameplay_keep/link_textures.c
@@ -4,8 +4,8 @@ u64 gHylianShieldDesignTex[TEX_LEN(u64, gHylianShieldDesignTex_WIDTH, gHylianShi
#include "assets/objects/gameplay_keep/gHylianShieldDesignTex.rgba16.inc.c"
};
-u64 gOcarinaofTimeDesignTex[TEX_LEN(u64, gOcarinaofTimeDesignTex_WIDTH, gOcarinaofTimeDesignTex_HEIGHT, 16)] = {
-#include "assets/objects/gameplay_keep/gOcarinaofTimeDesignTex.rgba16.inc.c"
+u64 gOcarinaOfTimeDesignTex[TEX_LEN(u64, gOcarinaOfTimeDesignTex_WIDTH, gOcarinaOfTimeDesignTex_HEIGHT, 16)] = {
+#include "assets/objects/gameplay_keep/gOcarinaOfTimeDesignTex.rgba16.inc.c"
};
u64 gBottleGlassTex[TEX_LEN(u64, gBottleGlassTex_WIDTH, gBottleGlassTex_HEIGHT, 16)] = {
diff --git a/assets/objects/gameplay_keep/link_textures.h b/assets/objects/gameplay_keep/link_textures.h
index 1b69ed135c..eea7c7fee8 100644
--- a/assets/objects/gameplay_keep/link_textures.h
+++ b/assets/objects/gameplay_keep/link_textures.h
@@ -7,9 +7,9 @@
#define gHylianShieldDesignTex_WIDTH 32
#define gHylianShieldDesignTex_HEIGHT 64
extern u64 gHylianShieldDesignTex[TEX_LEN(u64, gHylianShieldDesignTex_WIDTH, gHylianShieldDesignTex_HEIGHT, 16)];
-#define gOcarinaofTimeDesignTex_WIDTH 32
-#define gOcarinaofTimeDesignTex_HEIGHT 16
-extern u64 gOcarinaofTimeDesignTex[TEX_LEN(u64, gOcarinaofTimeDesignTex_WIDTH, gOcarinaofTimeDesignTex_HEIGHT, 16)];
+#define gOcarinaOfTimeDesignTex_WIDTH 32
+#define gOcarinaOfTimeDesignTex_HEIGHT 16
+extern u64 gOcarinaOfTimeDesignTex[TEX_LEN(u64, gOcarinaOfTimeDesignTex_WIDTH, gOcarinaOfTimeDesignTex_HEIGHT, 16)];
#define gBottleGlassTex_WIDTH 16
#define gBottleGlassTex_HEIGHT 16
extern u64 gBottleGlassTex[TEX_LEN(u64, gBottleGlassTex_WIDTH, gBottleGlassTex_HEIGHT, 16)];
diff --git a/assets/objects/object_link_boy/object_link_boy.c b/assets/objects/object_link_boy/object_link_boy.c
index ea6fe8c9f2..5f5065aadb 100644
--- a/assets/objects/object_link_boy/object_link_boy.c
+++ b/assets/objects/object_link_boy/object_link_boy.c
@@ -15,8 +15,8 @@ u64 gLinkAdultEyesHalfTex[TEX_LEN(u64, LINK_ADULT_EYES_TEX_WIDTH, LINK_ADULT_EYE
#include "assets/objects/object_link_boy/gLinkAdultEyesHalfTex.ci8.tlut_gLinkAdultHeadTLUT.inc.c"
};
-u64 gLinkAdultEyesClosedfTex[TEX_LEN(u64, LINK_ADULT_EYES_TEX_WIDTH, LINK_ADULT_EYES_TEX_HEIGHT, 8)] = {
-#include "assets/objects/object_link_boy/gLinkAdultEyesClosedfTex.ci8.tlut_gLinkAdultHeadTLUT.inc.c"
+u64 gLinkAdultEyesClosedTex[TEX_LEN(u64, LINK_ADULT_EYES_TEX_WIDTH, LINK_ADULT_EYES_TEX_HEIGHT, 8)] = {
+#include "assets/objects/object_link_boy/gLinkAdultEyesClosedTex.ci8.tlut_gLinkAdultHeadTLUT.inc.c"
};
u64 gLinkAdultEyesRightTex[TEX_LEN(u64, LINK_ADULT_EYES_TEX_WIDTH, LINK_ADULT_EYES_TEX_HEIGHT, 8)] = {
diff --git a/assets/objects/object_link_boy/object_link_boy.h b/assets/objects/object_link_boy/object_link_boy.h
index 349c36adeb..334e62b63f 100644
--- a/assets/objects/object_link_boy/object_link_boy.h
+++ b/assets/objects/object_link_boy/object_link_boy.h
@@ -9,7 +9,7 @@
#define LINK_ADULT_EYES_TEX_HEIGHT 32
extern u64 gLinkAdultEyesOpenTex[TEX_LEN(u64, LINK_ADULT_EYES_TEX_WIDTH, LINK_ADULT_EYES_TEX_HEIGHT, 8)];
extern u64 gLinkAdultEyesHalfTex[TEX_LEN(u64, LINK_ADULT_EYES_TEX_WIDTH, LINK_ADULT_EYES_TEX_HEIGHT, 8)];
-extern u64 gLinkAdultEyesClosedfTex[TEX_LEN(u64, LINK_ADULT_EYES_TEX_WIDTH, LINK_ADULT_EYES_TEX_HEIGHT, 8)];
+extern u64 gLinkAdultEyesClosedTex[TEX_LEN(u64, LINK_ADULT_EYES_TEX_WIDTH, LINK_ADULT_EYES_TEX_HEIGHT, 8)];
extern u64 gLinkAdultEyesRightTex[TEX_LEN(u64, LINK_ADULT_EYES_TEX_WIDTH, LINK_ADULT_EYES_TEX_HEIGHT, 8)];
extern u64 gLinkAdultEyesLeftTex[TEX_LEN(u64, LINK_ADULT_EYES_TEX_WIDTH, LINK_ADULT_EYES_TEX_HEIGHT, 8)];
extern u64 gLinkAdultEyesWideTex[TEX_LEN(u64, LINK_ADULT_EYES_TEX_WIDTH, LINK_ADULT_EYES_TEX_HEIGHT, 8)];
diff --git a/assets/objects/object_link_child/object_link_child.c b/assets/objects/object_link_child/object_link_child.c
index 30411ab0b4..a7062de659 100644
--- a/assets/objects/object_link_child/object_link_child.c
+++ b/assets/objects/object_link_child/object_link_child.c
@@ -15,8 +15,8 @@ u64 gLinkChildEyesHalfTex[TEX_LEN(u64, LINK_CHILD_EYES_TEX_WIDTH, LINK_CHILD_EYE
#include "assets/objects/object_link_child/gLinkChildEyesHalfTex.ci8.tlut_gLinkChildSkinTLUT.inc.c"
};
-u64 gLinkChildEyesClosedfTex[TEX_LEN(u64, LINK_CHILD_EYES_TEX_WIDTH, LINK_CHILD_EYES_TEX_HEIGHT, 8)] = {
-#include "assets/objects/object_link_child/gLinkChildEyesClosedfTex.ci8.tlut_gLinkChildSkinTLUT.inc.c"
+u64 gLinkChildEyesClosedTex[TEX_LEN(u64, LINK_CHILD_EYES_TEX_WIDTH, LINK_CHILD_EYES_TEX_HEIGHT, 8)] = {
+#include "assets/objects/object_link_child/gLinkChildEyesClosedTex.ci8.tlut_gLinkChildSkinTLUT.inc.c"
};
u64 gLinkChildEyesLeftTex[TEX_LEN(u64, LINK_CHILD_EYES_TEX_WIDTH, LINK_CHILD_EYES_TEX_HEIGHT, 8)] = {
diff --git a/assets/objects/object_link_child/object_link_child.h b/assets/objects/object_link_child/object_link_child.h
index 0641714080..8da3bfc6b6 100644
--- a/assets/objects/object_link_child/object_link_child.h
+++ b/assets/objects/object_link_child/object_link_child.h
@@ -9,7 +9,7 @@
#define LINK_CHILD_EYES_TEX_HEIGHT 32
extern u64 gLinkChildEyesOpenTex[TEX_LEN(u64, LINK_CHILD_EYES_TEX_WIDTH, LINK_CHILD_EYES_TEX_HEIGHT, 8)];
extern u64 gLinkChildEyesHalfTex[TEX_LEN(u64, LINK_CHILD_EYES_TEX_WIDTH, LINK_CHILD_EYES_TEX_HEIGHT, 8)];
-extern u64 gLinkChildEyesClosedfTex[TEX_LEN(u64, LINK_CHILD_EYES_TEX_WIDTH, LINK_CHILD_EYES_TEX_HEIGHT, 8)];
+extern u64 gLinkChildEyesClosedTex[TEX_LEN(u64, LINK_CHILD_EYES_TEX_WIDTH, LINK_CHILD_EYES_TEX_HEIGHT, 8)];
extern u64 gLinkChildEyesLeftTex[TEX_LEN(u64, LINK_CHILD_EYES_TEX_WIDTH, LINK_CHILD_EYES_TEX_HEIGHT, 8)];
extern u64 gLinkChildEyesRightTex[TEX_LEN(u64, LINK_CHILD_EYES_TEX_WIDTH, LINK_CHILD_EYES_TEX_HEIGHT, 8)];
extern u64 gLinkChildEyesWideTex[TEX_LEN(u64, LINK_CHILD_EYES_TEX_WIDTH, LINK_CHILD_EYES_TEX_HEIGHT, 8)];
diff --git a/assets/xml/objects/gameplay_dangeon_keep.xml b/assets/xml/objects/gameplay_dangeon_keep.xml
index 015e400e41..debafa33e7 100644
--- a/assets/xml/objects/gameplay_dangeon_keep.xml
+++ b/assets/xml/objects/gameplay_dangeon_keep.xml
@@ -135,8 +135,8 @@
-
-
+
+
diff --git a/assets/xml/objects/gameplay_keep.xml b/assets/xml/objects/gameplay_keep.xml
index b8e20ab429..973d4c3ced 100644
--- a/assets/xml/objects/gameplay_keep.xml
+++ b/assets/xml/objects/gameplay_keep.xml
@@ -4,7 +4,7 @@
-
+
diff --git a/assets/xml/objects/gameplay_keep_pal.xml b/assets/xml/objects/gameplay_keep_pal.xml
index 04387392fb..d09be36fd6 100644
--- a/assets/xml/objects/gameplay_keep_pal.xml
+++ b/assets/xml/objects/gameplay_keep_pal.xml
@@ -4,7 +4,7 @@
-
+
diff --git a/assets/xml/objects/object_haka_objects.xml b/assets/xml/objects/object_haka_objects.xml
index 7e0195e148..dfac5ebb62 100644
--- a/assets/xml/objects/object_haka_objects.xml
+++ b/assets/xml/objects/object_haka_objects.xml
@@ -1,10 +1,10 @@
-
+
-
-
+
+
@@ -51,11 +51,11 @@
-
+
-
-
+
+
@@ -88,21 +88,21 @@
-
+
-
-
+
+
-
+
-
-
+
+
diff --git a/assets/xml/objects/object_link_boy.xml b/assets/xml/objects/object_link_boy.xml
index 21a1d407c2..eab6ae3ab9 100644
--- a/assets/xml/objects/object_link_boy.xml
+++ b/assets/xml/objects/object_link_boy.xml
@@ -526,7 +526,7 @@
-
+
diff --git a/assets/xml/objects/object_link_child.xml b/assets/xml/objects/object_link_child.xml
index 25ad178c3c..99492de108 100644
--- a/assets/xml/objects/object_link_child.xml
+++ b/assets/xml/objects/object_link_child.xml
@@ -436,7 +436,7 @@
-
+
diff --git a/baseroms/ntsc-1.0/config.yml b/baseroms/ntsc-1.0/config.yml
index 948bbd179a..e164590c39 100644
--- a/baseroms/ntsc-1.0/config.yml
+++ b/baseroms/ntsc-1.0/config.yml
@@ -16,7 +16,7 @@ incbins:
segment: code
vram: 0x800E2FC0
size: 0xFB0
- - name: gspF3DZEX2_NoN_PosLight_fifoText
+ - name: gspF3DZEX2_NoN_fifoText
segment: code
vram: 0x800E3F70
size: 0x1390
@@ -32,7 +32,7 @@ incbins:
segment: code
vram: 0x801142E0
size: 0x2E0
- - name: gspF3DZEX2_NoN_PosLight_fifoData
+ - name: gspF3DZEX2_NoN_fifoData
segment: code
vram: 0x801145C0
size: 0x420
diff --git a/baseroms/ntsc-1.1/config.yml b/baseroms/ntsc-1.1/config.yml
index 2317ae2dac..ee27b55df9 100644
--- a/baseroms/ntsc-1.1/config.yml
+++ b/baseroms/ntsc-1.1/config.yml
@@ -16,7 +16,7 @@ incbins:
segment: code
vram: 0x800E3180
size: 0xFB0
- - name: gspF3DZEX2_NoN_PosLight_fifoText
+ - name: gspF3DZEX2_NoN_fifoText
segment: code
vram: 0x800E4130
size: 0x1390
@@ -32,7 +32,7 @@ incbins:
segment: code
vram: 0x801144A0
size: 0x2E0
- - name: gspF3DZEX2_NoN_PosLight_fifoData
+ - name: gspF3DZEX2_NoN_fifoData
segment: code
vram: 0x80114780
size: 0x420
diff --git a/baseroms/ntsc-1.2/config.yml b/baseroms/ntsc-1.2/config.yml
index 6fc7896db0..b0c8b18bee 100644
--- a/baseroms/ntsc-1.2/config.yml
+++ b/baseroms/ntsc-1.2/config.yml
@@ -16,7 +16,7 @@ incbins:
segment: code
vram: 0x800E3600
size: 0xFB0
- - name: gspF3DZEX2_NoN_PosLight_fifoText
+ - name: gspF3DZEX2_NoN_fifoText
segment: code
vram: 0x800E45B0
size: 0x1390
@@ -32,7 +32,7 @@ incbins:
segment: code
vram: 0x80114990
size: 0x2E0
- - name: gspF3DZEX2_NoN_PosLight_fifoData
+ - name: gspF3DZEX2_NoN_fifoData
segment: code
vram: 0x80114C70
size: 0x420
diff --git a/baseroms/pal-1.0/config.yml b/baseroms/pal-1.0/config.yml
index 37ffb7500b..d9bfda781c 100644
--- a/baseroms/pal-1.0/config.yml
+++ b/baseroms/pal-1.0/config.yml
@@ -13,7 +13,7 @@ incbins:
segment: code
vram: 0x800E0F10
size: 0xFB0
- - name: gspF3DZEX2_NoN_PosLight_fifoText
+ - name: gspF3DZEX2_NoN_fifoText
segment: code
vram: 0x800E1EC0
size: 0x1390
@@ -37,7 +37,7 @@ incbins:
segment: code
vram: 0x801120E0
size: 0x2E0
- - name: gspF3DZEX2_NoN_PosLight_fifoData
+ - name: gspF3DZEX2_NoN_fifoData
segment: code
vram: 0x801123C0
size: 0x420
diff --git a/baseroms/pal-1.1/config.yml b/baseroms/pal-1.1/config.yml
index 45bf82b877..6de560bcca 100644
--- a/baseroms/pal-1.1/config.yml
+++ b/baseroms/pal-1.1/config.yml
@@ -13,7 +13,7 @@ incbins:
segment: code
vram: 0x800E0F50
size: 0xFB0
- - name: gspF3DZEX2_NoN_PosLight_fifoText
+ - name: gspF3DZEX2_NoN_fifoText
segment: code
vram: 0x800E1F00
size: 0x1390
@@ -37,7 +37,7 @@ incbins:
segment: code
vram: 0x80112120
size: 0x2E0
- - name: gspF3DZEX2_NoN_PosLight_fifoData
+ - name: gspF3DZEX2_NoN_fifoData
segment: code
vram: 0x80112400
size: 0x420
diff --git a/data/rsp.rodata.s b/data/rsp.rodata.s
index 6688f7c627..e60c522133 100644
--- a/data/rsp.rodata.s
+++ b/data/rsp.rodata.s
@@ -13,15 +13,19 @@ glabel aspMainDataStart
.incbin "incbin/aspMainData"
glabel aspMainDataEnd
-#if !PLATFORM_N64
+#ifndef F3DEX_GBI_PL
+glabel gspF3DZEX2_NoN_fifoDataStart
+ .incbin "incbin/gspF3DZEX2_NoN_fifoData"
+glabel gspF3DZEX2_NoN_fifoDataEnd
+#else
glabel gspF3DZEX2_NoN_PosLight_fifoTextStart
.incbin "incbin/gspF3DZEX2_NoN_PosLight_fifoText"
glabel gspF3DZEX2_NoN_PosLight_fifoTextEnd
-#endif
glabel gspF3DZEX2_NoN_PosLight_fifoDataStart
.incbin "incbin/gspF3DZEX2_NoN_PosLight_fifoData"
glabel gspF3DZEX2_NoN_PosLight_fifoDataEnd
+#endif
glabel gspS2DEX2d_fifoDataStart
.incbin "incbin/gspS2DEX2d_fifoData"
diff --git a/data/rsp.text.s b/data/rsp.text.s
index a40252853a..34033443b8 100644
--- a/data/rsp.text.s
+++ b/data/rsp.text.s
@@ -13,10 +13,10 @@ glabel aspMainTextStart
.incbin "incbin/aspMainText"
glabel aspMainTextEnd
-#if PLATFORM_N64
-glabel gspF3DZEX2_NoN_PosLight_fifoTextStart
- .incbin "incbin/gspF3DZEX2_NoN_PosLight_fifoText"
-glabel gspF3DZEX2_NoN_PosLight_fifoTextEnd
+#ifndef F3DEX_GBI_PL
+glabel gspF3DZEX2_NoN_fifoTextStart
+ .incbin "incbin/gspF3DZEX2_NoN_fifoText"
+glabel gspF3DZEX2_NoN_fifoTextEnd
#endif
glabel gspS2DEX2d_fifoTextStart
diff --git a/include/fault.h b/include/fault.h
index af895927d0..015da7d1c8 100644
--- a/include/fault.h
+++ b/include/fault.h
@@ -81,10 +81,6 @@ void Fault_DrawText(s32 x, s32 y, const char* fmt, ...);
void func_800AE1F8(void);
-// Not implemented. Silently noop-ing is fine, these are not essential for functionality.
-#define Fault_SetFontColor(color) (void)0
-#define Fault_SetCharPad(padW, padH) (void)0
-
#else
void Fault_InitDrawer(void);
diff --git a/include/sfx.h b/include/sfx.h
index 2a9b543c3b..6d61c3cf1f 100644
--- a/include/sfx.h
+++ b/include/sfx.h
@@ -184,10 +184,6 @@ void func_800F8F88(void);
u8 Audio_IsSfxPlaying(u32 sfxId);
void Audio_ResetSfx(void);
-extern Vec3f gSfxDefaultPos;
-extern f32 gSfxDefaultFreqAndVolScale;
-extern s8 gSfxDefaultReverb;
-
extern SfxParams* gSfxParams[7];
extern char D_80133390[];
extern char D_80133398[];
diff --git a/include/ultra64/ucode.h b/include/ultra64/ucode.h
index 9265c882b6..dfd0e08e2e 100644
--- a/include/ultra64/ucode.h
+++ b/include/ultra64/ucode.h
@@ -17,8 +17,13 @@ extern u64 cic6105TextStart[], cic6105TextEnd[];
extern u64 aspMainTextStart[], aspMainTextEnd[];
extern u64 aspMainDataStart[], aspMainDataEnd[];
+#ifndef F3DEX_GBI_PL
+extern u64 gspF3DZEX2_NoN_fifoTextStart[], gspF3DZEX2_NoN_fifoTextEnd[];
+extern u64 gspF3DZEX2_NoN_fifoDataStart[], gspF3DZEX2_NoN_fifoDataEnd[];
+#else
extern u64 gspF3DZEX2_NoN_PosLight_fifoTextStart[], gspF3DZEX2_NoN_PosLight_fifoTextEnd[];
extern u64 gspF3DZEX2_NoN_PosLight_fifoDataStart[], gspF3DZEX2_NoN_PosLight_fifoDataEnd[];
+#endif
extern u64 gspS2DEX2d_fifoTextStart[], gspS2DEX2d_fifoTextEnd[];
extern u64 gspS2DEX2d_fifoDataStart[], gspS2DEX2d_fifoDataEnd[];
diff --git a/src/code/graph.c b/src/code/graph.c
index c6b5f3cb61..826dd71c08 100644
--- a/src/code/graph.c
+++ b/src/code/graph.c
@@ -50,13 +50,21 @@ OSTime sGraphPrevTaskTimeStart;
FaultClient sGraphFaultClient;
UCodeInfo D_8012D230[3] = {
+#ifndef F3DEX_GBI_PL
+ { UCODE_TYPE_F3DZEX, gspF3DZEX2_NoN_fifoTextStart },
+#else
{ UCODE_TYPE_F3DZEX, gspF3DZEX2_NoN_PosLight_fifoTextStart },
+#endif
{ UCODE_TYPE_UNK, NULL },
{ UCODE_TYPE_S2DEX, gspS2DEX2d_fifoTextStart },
};
UCodeInfo D_8012D248[3] = {
+#ifndef F3DEX_GBI_PL
+ { UCODE_TYPE_F3DZEX, gspF3DZEX2_NoN_fifoTextStart },
+#else
{ UCODE_TYPE_F3DZEX, gspF3DZEX2_NoN_PosLight_fifoTextStart },
+#endif
{ UCODE_TYPE_UNK, NULL },
{ UCODE_TYPE_S2DEX, gspS2DEX2d_fifoTextStart },
};
@@ -81,7 +89,11 @@ void Graph_DisassembleUCode(Gfx* workBuf) {
disassembler.enableLog = R_UCODE_DISAS_LOG_LEVEL;
UCodeDisas_RegisterUCode(&disassembler, ARRAY_COUNT(D_8012D230), D_8012D230);
+#ifndef F3DEX_GBI_PL
+ UCodeDisas_SetCurUCode(&disassembler, gspF3DZEX2_NoN_fifoTextStart);
+#else
UCodeDisas_SetCurUCode(&disassembler, gspF3DZEX2_NoN_PosLight_fifoTextStart);
+#endif
UCodeDisas_Disassemble(&disassembler, workBuf);
@@ -120,7 +132,11 @@ void Graph_UCodeFaultClient(Gfx* workBuf) {
UCodeDisas_Init(&disassembler);
disassembler.enableLog = true;
UCodeDisas_RegisterUCode(&disassembler, ARRAY_COUNT(D_8012D248), D_8012D248);
+#ifndef F3DEX_GBI_PL
+ UCodeDisas_SetCurUCode(&disassembler, gspF3DZEX2_NoN_fifoTextStart);
+#else
UCodeDisas_SetCurUCode(&disassembler, gspF3DZEX2_NoN_PosLight_fifoTextStart);
+#endif
UCodeDisas_Disassemble(&disassembler, workBuf);
UCodeDisas_Destroy(&disassembler);
}
diff --git a/src/code/sys_ucode.c b/src/code/sys_ucode.c
index 71ae003909..d1e6098026 100644
--- a/src/code/sys_ucode.c
+++ b/src/code/sys_ucode.c
@@ -1,8 +1,13 @@
#include "ultra64.h"
#include "sys_ucode.h"
+#ifndef F3DEX_GBI_PL
+u64* sDefaultGSPUCodeText = gspF3DZEX2_NoN_fifoTextStart;
+u64* sDefaultGSPUCodeData = gspF3DZEX2_NoN_fifoDataStart;
+#else
u64* sDefaultGSPUCodeText = gspF3DZEX2_NoN_PosLight_fifoTextStart;
u64* sDefaultGSPUCodeData = gspF3DZEX2_NoN_PosLight_fifoDataStart;
+#endif
u64* SysUcode_GetUCodeBoot(void) {
return rspbootTextStart;
diff --git a/src/code/z_actor.c b/src/code/z_actor.c
index 4a86cf25c5..ddb8a9e0be 100644
--- a/src/code/z_actor.c
+++ b/src/code/z_actor.c
@@ -4511,9 +4511,7 @@ Gfx* func_80034B54(GraphicsContext* gfxCtx) {
displayList = displayListHead = GRAPH_ALLOC(gfxCtx, 2 * sizeof(Gfx));
- gDPSetRenderMode(displayListHead++, G_RM_FOG_SHADE_A,
- AA_EN | Z_CMP | Z_UPD | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | ZMODE_XLU | FORCE_BL |
- GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA));
+ gDPSetRenderMode(displayListHead++, G_RM_FOG_SHADE_A, Z_UPD | G_RM_AA_ZB_XLU_SURF2);
gSPEndDisplayList(displayListHead++);
@@ -4565,10 +4563,10 @@ s16 Actor_UpdateAlphaByDistance(Actor* actor, PlayState* play, s16 alpha, f32 ra
if (radius < distance) {
actor->flags &= ~ACTOR_FLAG_ATTENTION_ENABLED;
- Math_SmoothStepToS(&alpha, 0, 6, 0x14, 1);
+ Math_SmoothStepToS(&alpha, 0, 6, 20, 1);
} else {
actor->flags |= ACTOR_FLAG_ATTENTION_ENABLED;
- Math_SmoothStepToS(&alpha, 0xFF, 6, 0x14, 1);
+ Math_SmoothStepToS(&alpha, 255, 6, 20, 1);
}
return alpha;
diff --git a/src/code/z_camera.c b/src/code/z_camera.c
index 803a89400f..3baaf6579f 100644
--- a/src/code/z_camera.c
+++ b/src/code/z_camera.c
@@ -6333,8 +6333,8 @@ s32 Camera_Demo5(Camera* camera) {
camera->timer += D_8011D79C[2].timerInit + D_8011D79C[3].timerInit;
}
} else if (eyeTargetDist < 300.0f && eyePlayerGeo.r < 30.0f) {
- // distance from the camera's current positon and the target is less than 300 units
- // and the distance fromthe camera's current position to the player is less than 30 units
+ // distance from the camera's current position and the target is less than 300 units
+ // and the distance from the camera's current position to the player is less than 30 units
static OnePointCsFull D_8011D83C[] = {
{
ONEPOINT_CS_ACTION(ONEPOINT_CS_ACTION_ID_3, false, true),
@@ -7237,7 +7237,7 @@ s32 Camera_Special6(Camera* camera) {
sCameraInterfaceField = roData->interfaceField;
if (eyeNext->x != bgCamPos.x || eyeNext->y != bgCamPos.y || eyeNext->z != bgCamPos.z || camera->animState == 0) {
- // A change in the current scene's camera positon has been detected,
+ // A change in the current scene's camera position has been detected,
// Change "screens"
camera->player->actor.freezeTimer = 12;
// Overwrite hud visibility to CAM_HUD_VISIBILITY_HEARTS_FORCE
diff --git a/src/code/z_player_lib.c b/src/code/z_player_lib.c
index 69d7b76d9e..49948f8562 100644
--- a/src/code/z_player_lib.c
+++ b/src/code/z_player_lib.c
@@ -1007,7 +1007,7 @@ PlayerFaceIndices sPlayerFaces[PLAYER_FACE_MAX] = {
void* sEyeTextures[PLAYER_EYES_MAX] = {
gLinkAdultEyesOpenTex, // PLAYER_EYES_OPEN
gLinkAdultEyesHalfTex, // PLAYER_EYES_HALF
- gLinkAdultEyesClosedfTex, // PLAYER_EYES_CLOSED
+ gLinkAdultEyesClosedTex, // PLAYER_EYES_CLOSED
gLinkAdultEyesRightTex, // PLAYER_EYES_RIGHT
gLinkAdultEyesLeftTex, // PLAYER_EYES_LEFT
gLinkAdultEyesWideTex, // PLAYER_EYES_WIDE
@@ -1027,7 +1027,7 @@ void* sEyeTextures[][PLAYER_EYES_MAX] = {
{
gLinkAdultEyesOpenTex, // PLAYER_EYES_OPEN
gLinkAdultEyesHalfTex, // PLAYER_EYES_HALF
- gLinkAdultEyesClosedfTex, // PLAYER_EYES_CLOSED
+ gLinkAdultEyesClosedTex, // PLAYER_EYES_CLOSED
gLinkAdultEyesRightTex, // PLAYER_EYES_RIGHT
gLinkAdultEyesLeftTex, // PLAYER_EYES_LEFT
gLinkAdultEyesWideTex, // PLAYER_EYES_WIDE
@@ -1035,9 +1035,9 @@ void* sEyeTextures[][PLAYER_EYES_MAX] = {
gLinkAdultEyesWincingTex, // PLAYER_EYES_WINCING
},
{
- gLinkChildEyesOpenTex, // PLAYER_EYES_OPEN
- gLinkChildEyesHalfTex, // PLAYER_EYES_HALF
- gLinkChildEyesClosedfTex, // PLAYER_EYES_CLOSED
+ gLinkChildEyesOpenTex, // PLAYER_EYES_OPEN
+ gLinkChildEyesHalfTex, // PLAYER_EYES_HALF
+ gLinkChildEyesClosedTex, // PLAYER_EYES_CLOSED
/*
Note `PLAYER_EYES_RIGHT` corresponds to the "left" eyes texture, and vice-versa with the "right" eyes textures.
This is because on the textures Link appears to look left/right as if facing outwards the screen,
diff --git a/src/overlays/actors/ovl_Bg_Haka_MeganeBG/z_bg_haka_meganebg.c b/src/overlays/actors/ovl_Bg_Haka_MeganeBG/z_bg_haka_meganebg.c
index 061cdaf5d5..d1004f66e7 100644
--- a/src/overlays/actors/ovl_Bg_Haka_MeganeBG/z_bg_haka_meganebg.c
+++ b/src/overlays/actors/ovl_Bg_Haka_MeganeBG/z_bg_haka_meganebg.c
@@ -1,7 +1,23 @@
/*
* File: z_bg_haka_meganebg.c
* Overlay: ovl_Bg_Haka_MeganeBG
- * Description:
+ * Description: Misc. Shadow Temple themed objects
+ *
+ * BGHAKAMEGANEBG_TYPE_HIDDEN_MOVING_PLATFORM:
+ * An invisible square moving platform, viewable with Lens of Truth. Travels -320 x units from home and back.
+ * Setting rotY when spawning will rotate the shape, but not affect the movement path.
+ * world.rot.y is used like a flag, tracking the direction of movement for the platform.
+ * If world.rot.y == initial rotation, the platform is travelling from home towards the secondary position.
+ * If world.rot.y != initial rotation, the platform is travelling from the secondary position towards home.
+ *
+ * BGHAKAMEGANEBG_TYPE_CHAINED_ELEVATOR_PLATFORM:
+ * A square platform with chains on four corners. Drops 640 units before pulling itself up back to the home position.
+ *
+ * BGHAKAMEGANEBG_TYPE_ROTATING_PLATFORM:
+ * A simple spinning hexacon shaped black platform with a column in the center.
+ *
+ * BGHAKAMEGANEBG_TYPE_METAL_GATE:
+ * A metal gate that rises 100 units on switchFlag on.
*/
#include "z_bg_haka_meganebg.h"
@@ -21,14 +37,14 @@ void BgHakaMeganeBG_Destroy(Actor* thisx, PlayState* play);
void BgHakaMeganeBG_Update(Actor* thisx, PlayState* play);
void BgHakaMeganeBG_Draw(Actor* thisx, PlayState* play);
-void func_8087DFF8(BgHakaMeganeBG* this, PlayState* play);
-void func_8087E040(BgHakaMeganeBG* this, PlayState* play);
-void func_8087E10C(BgHakaMeganeBG* this, PlayState* play);
-void func_8087E1E0(BgHakaMeganeBG* this, PlayState* play);
-void func_8087E258(BgHakaMeganeBG* this, PlayState* play);
-void func_8087E288(BgHakaMeganeBG* this, PlayState* play);
-void func_8087E2D8(BgHakaMeganeBG* this, PlayState* play);
-void func_8087E34C(BgHakaMeganeBG* this, PlayState* play);
+void BgHakaMeganeBG_HiddenMovingPlatform_Idle(BgHakaMeganeBG* this, PlayState* play);
+void BgHakaMeganeBG_HiddenMovingPlatform_Move(BgHakaMeganeBG* this, PlayState* play);
+void BgHakaMeganeBG_ElevatorPlatform_Drop(BgHakaMeganeBG* this, PlayState* play);
+void BgHakaMeganeBG_ElevatorPlatform_Raise(BgHakaMeganeBG* this, PlayState* play);
+void BgHakaMeganeBG_RotatingPlatform_Spin(BgHakaMeganeBG* this, PlayState* play);
+void BgHakaMeganeBG_Gate_WaitForSwitchFlag(BgHakaMeganeBG* this, PlayState* play);
+void BgHakaMeganeBG_Gate_Open(BgHakaMeganeBG* this, PlayState* play);
+void BgHakaMeganeBG_DoNothing(BgHakaMeganeBG* this, PlayState* play);
ActorProfile Bg_Haka_MeganeBG_Profile = {
/**/ ACTOR_BG_HAKA_MEGANEBG,
@@ -53,50 +69,45 @@ static u32 D_8087E3FC[] = {
0x00000000, 0x00000000, 0x00000000, 0xC8C800FF, 0xFF0000FF,
};
-static Gfx* D_8087E410[] = {
- object_haka_objects_DL_008EB0,
- object_haka_objects_DL_00A1A0,
- object_haka_objects_DL_005000,
- object_haka_objects_DL_000040,
-};
-
void BgHakaMeganeBG_Init(Actor* thisx, PlayState* play) {
s32 pad;
BgHakaMeganeBG* this = (BgHakaMeganeBG*)thisx;
CollisionHeader* colHeader = NULL;
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
- this->unk_168 = PARAMS_GET_U(thisx->params, 8, 8);
+ this->switchFlag = PARAMS_GET_U(thisx->params, 8, 8);
thisx->params &= 0xFF;
- if (thisx->params == 2) {
+ if (thisx->params == BGHAKAMEGANEBG_TYPE_ROTATING_PLATFORM) {
DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS | DYNA_TRANSFORM_ROT_Y);
thisx->flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED;
- CollisionHeader_GetVirtual(&object_haka_objects_Col_005334, &colHeader);
- this->actionFunc = func_8087E258;
+ CollisionHeader_GetVirtual(&gShadowTempleBlackPlatformWithScrewColumnCol, &colHeader);
+ this->actionFunc = BgHakaMeganeBG_RotatingPlatform_Spin;
} else {
DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
- if (thisx->params == 0) {
- CollisionHeader_GetVirtual(&object_haka_objects_Col_009168, &colHeader);
+ if (thisx->params == BGHAKAMEGANEBG_TYPE_HIDDEN_MOVING_PLATFORM) {
+ CollisionHeader_GetVirtual(&gShadowTempleHiddenBlockPlatformCol, &colHeader);
thisx->flags |= ACTOR_FLAG_REACT_TO_LENS;
- this->unk_16A = 20;
- this->actionFunc = func_8087DFF8;
- } else if (thisx->params == 3) {
- CollisionHeader_GetVirtual(&object_haka_objects_Col_000118, &colHeader);
+ this->timer = 20;
+ this->actionFunc = BgHakaMeganeBG_HiddenMovingPlatform_Idle;
+ } else if (thisx->params == BGHAKAMEGANEBG_TYPE_METAL_GATE) {
+ CollisionHeader_GetVirtual(&gShadowTempleMetalGateCol, &colHeader);
thisx->home.pos.y += 100.0f;
- if (Flags_GetSwitch(play, this->unk_168)) {
- this->actionFunc = func_8087E34C;
+ if (Flags_GetSwitch(play, this->switchFlag)) {
+ // Gate open
+ this->actionFunc = BgHakaMeganeBG_DoNothing;
thisx->world.pos.y = thisx->home.pos.y;
} else {
+ // Gate closed
thisx->flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED;
- this->actionFunc = func_8087E288;
+ this->actionFunc = BgHakaMeganeBG_Gate_WaitForSwitchFlag;
}
- } else {
- CollisionHeader_GetVirtual(&object_haka_objects_Col_00A7F4, &colHeader);
- this->unk_16A = 80;
- this->actionFunc = func_8087E10C;
+ } else /* BGHAKAMEGANEBG_TYPE_CHAINED_ELEVATOR_PLATFORM */ {
+ CollisionHeader_GetVirtual(&gShadowTempleChainedElevatorPlatformCol, &colHeader);
+ this->timer = 80;
+ this->actionFunc = BgHakaMeganeBG_ElevatorPlatform_Drop;
thisx->cullingVolumeScale = 3000.0f;
thisx->cullingVolumeDownward = 3000.0f;
}
@@ -111,45 +122,64 @@ void BgHakaMeganeBG_Destroy(Actor* thisx, PlayState* play) {
DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
}
-void func_8087DFF8(BgHakaMeganeBG* this, PlayState* play) {
- if (this->unk_16A != 0) {
- this->unk_16A--;
+void BgHakaMeganeBG_HiddenMovingPlatform_Idle(BgHakaMeganeBG* this, PlayState* play) {
+ if (this->timer != 0) {
+ this->timer--;
}
- if (this->unk_16A == 0) {
- this->unk_16A = 40;
+ if (this->timer == 0) {
+ this->timer = 40;
+
+ // world.rot.y is used like a binary flag here, where rotating by exactly 180 degrees will toggle the direction
+ // of movement. Arbitrary rotation values won't function correctly here.
+ //! @bug On the first run of the actor, this line will toggle the direction of movement before the actor has
+ //! moved to the secondary position, causing it to teleport. In practice it is hard to observe in normal
+ //! gameplay because the platform is invisible without lens of truth, and the teleport happens after a second of
+ //! spawning into the room.
+ //!
+ //! One possible fix would be to move this line into BgHakaMeganeBG_HiddenMovingPlatform_Move so it's always
+ //! flipping direction after it reached its destination.
this->dyna.actor.world.rot.y += 0x8000;
- this->actionFunc = func_8087E040;
+
+ this->actionFunc = BgHakaMeganeBG_HiddenMovingPlatform_Move;
}
}
-void func_8087E040(BgHakaMeganeBG* this, PlayState* play) {
+void BgHakaMeganeBG_HiddenMovingPlatform_Move(BgHakaMeganeBG* this, PlayState* play) {
f32 xSub;
- if (this->unk_16A != 0) {
- this->unk_16A--;
+ if (this->timer != 0) {
+ this->timer--;
}
- xSub = (sinf(((this->unk_16A * 0.025f) + 0.5f) * M_PI) + 1.0f) * 160.0f;
+ // The sine function is used to create an easing effect when the platform reaches its two target destinations. It
+ // works like this:
+ //
+ // The timer state, ranging from 39 to 0, is converted into an angle between 270 to 90 degrees, and in turn the sine
+ // function returns a value between -1.0 to 1.0. This is incremented by +1 to get 0.0 to 2.0, and finally multiplied
+ // by half of the travel distance to get the current platform's delta position.
+ xSub = (sinf(((this->timer * (1.0f / 40.0f)) + 0.5f) * M_PI) + 1.0f) * (320.0f / 2);
+ // The result is then inverted if the platform should travel the opposite direction.
if (this->dyna.actor.world.rot.y != this->dyna.actor.shape.rot.y) {
xSub = 320.0f - xSub;
}
this->dyna.actor.world.pos.x = this->dyna.actor.home.pos.x - xSub;
- if (this->unk_16A == 0) {
- this->unk_16A = 20;
- this->actionFunc = func_8087DFF8;
+ if (this->timer == 0) {
+ this->timer = 20;
+ this->actionFunc = BgHakaMeganeBG_HiddenMovingPlatform_Idle;
}
}
-void func_8087E10C(BgHakaMeganeBG* this, PlayState* play) {
+void BgHakaMeganeBG_ElevatorPlatform_Drop(BgHakaMeganeBG* this, PlayState* play) {
+ // Here velocity.y is storing absolute velocity instead of directional velocity
this->dyna.actor.velocity.y += 1.0f;
this->dyna.actor.velocity.y = CLAMP_MAX(this->dyna.actor.velocity.y, 20.0f);
- if (this->unk_16A != 0) {
- this->unk_16A--;
+ if (this->timer != 0) {
+ this->timer--;
}
if (!Math_StepToF(&this->dyna.actor.world.pos.y, this->dyna.actor.home.pos.y - 640.0f,
@@ -157,51 +187,51 @@ void func_8087E10C(BgHakaMeganeBG* this, PlayState* play) {
Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_CHINETRAP_DOWN - SFX_FLAG);
}
- if (this->unk_16A == 0) {
- this->unk_16A = 120;
- this->actionFunc = func_8087E1E0;
+ if (this->timer == 0) {
+ this->timer = 120;
+ this->actionFunc = BgHakaMeganeBG_ElevatorPlatform_Raise;
this->dyna.actor.velocity.y = 0.0f;
}
}
-void func_8087E1E0(BgHakaMeganeBG* this, PlayState* play) {
+void BgHakaMeganeBG_ElevatorPlatform_Raise(BgHakaMeganeBG* this, PlayState* play) {
Math_StepToF(&this->dyna.actor.world.pos.y, this->dyna.actor.home.pos.y, 16.0f / 3.0f);
Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_BRIDGE_CLOSE - SFX_FLAG);
- if (this->unk_16A != 0) {
- this->unk_16A--;
+ if (this->timer != 0) {
+ this->timer--;
}
- if (this->unk_16A == 0) {
- this->unk_16A = 80;
- this->actionFunc = func_8087E10C;
+ if (this->timer == 0) {
+ this->timer = 80;
+ this->actionFunc = BgHakaMeganeBG_ElevatorPlatform_Drop;
}
}
-void func_8087E258(BgHakaMeganeBG* this, PlayState* play) {
+void BgHakaMeganeBG_RotatingPlatform_Spin(BgHakaMeganeBG* this, PlayState* play) {
this->dyna.actor.shape.rot.y += 0x180;
Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_ELEVATOR_MOVE - SFX_FLAG);
}
-void func_8087E288(BgHakaMeganeBG* this, PlayState* play) {
- if (Flags_GetSwitch(play, this->unk_168)) {
+void BgHakaMeganeBG_Gate_WaitForSwitchFlag(BgHakaMeganeBG* this, PlayState* play) {
+ if (Flags_GetSwitch(play, this->switchFlag)) {
OnePointCutscene_Attention(play, &this->dyna.actor);
- this->actionFunc = func_8087E2D8;
+ this->actionFunc = BgHakaMeganeBG_Gate_Open;
}
}
-void func_8087E2D8(BgHakaMeganeBG* this, PlayState* play) {
+void BgHakaMeganeBG_Gate_Open(BgHakaMeganeBG* this, PlayState* play) {
Math_StepToF(&this->dyna.actor.speed, 30.0f, 2.0f);
if (Math_StepToF(&this->dyna.actor.world.pos.y, this->dyna.actor.home.pos.y, this->dyna.actor.speed)) {
Actor_SetFocus(&this->dyna.actor, 50.0f);
- this->actionFunc = func_8087E34C;
+ this->actionFunc = BgHakaMeganeBG_DoNothing;
} else {
Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_METALDOOR_OPEN);
}
}
-void func_8087E34C(BgHakaMeganeBG* this, PlayState* play) {
+void BgHakaMeganeBG_DoNothing(BgHakaMeganeBG* this, PlayState* play) {
}
void BgHakaMeganeBG_Update(Actor* thisx, PlayState* play) {
@@ -211,12 +241,19 @@ void BgHakaMeganeBG_Update(Actor* thisx, PlayState* play) {
}
void BgHakaMeganeBG_Draw(Actor* thisx, PlayState* play) {
+ static Gfx* sDLists[] = {
+ gShadowTempleHiddenBlockPlatformDL,
+ gShadowTempleChainedElevatorPlatformDL,
+ gShadowTempleBlackPlatformWithScrewColumnDL,
+ gShadowTempleMetalGateDL,
+ };
+
BgHakaMeganeBG* this = (BgHakaMeganeBG*)thisx;
s16 params = this->dyna.actor.params;
- if (params == 0) {
- Gfx_DrawDListXlu(play, object_haka_objects_DL_008EB0);
+ if (params == BGHAKAMEGANEBG_TYPE_HIDDEN_MOVING_PLATFORM) {
+ Gfx_DrawDListXlu(play, gShadowTempleHiddenBlockPlatformDL);
} else {
- Gfx_DrawDListOpa(play, D_8087E410[params]);
+ Gfx_DrawDListOpa(play, sDLists[params]);
}
}
diff --git a/src/overlays/actors/ovl_Bg_Haka_MeganeBG/z_bg_haka_meganebg.h b/src/overlays/actors/ovl_Bg_Haka_MeganeBG/z_bg_haka_meganebg.h
index 47342beb78..0c3b7cde9e 100644
--- a/src/overlays/actors/ovl_Bg_Haka_MeganeBG/z_bg_haka_meganebg.h
+++ b/src/overlays/actors/ovl_Bg_Haka_MeganeBG/z_bg_haka_meganebg.h
@@ -4,6 +4,13 @@
#include "ultra64.h"
#include "actor.h"
+typedef enum BgHakaMeganeBGType {
+ /* 0 */ BGHAKAMEGANEBG_TYPE_HIDDEN_MOVING_PLATFORM,
+ /* 1 */ BGHAKAMEGANEBG_TYPE_CHAINED_ELEVATOR_PLATFORM,
+ /* 2 */ BGHAKAMEGANEBG_TYPE_ROTATING_PLATFORM,
+ /* 3 */ BGHAKAMEGANEBG_TYPE_METAL_GATE
+} BgHakaMeganeBGType;
+
struct BgHakaMeganeBG;
typedef void (*BgHakaMeganeBGActionFunc)(struct BgHakaMeganeBG*, struct PlayState*);
@@ -11,8 +18,8 @@ typedef void (*BgHakaMeganeBGActionFunc)(struct BgHakaMeganeBG*, struct PlayStat
typedef struct BgHakaMeganeBG {
/* 0x0000 */ DynaPolyActor dyna;
/* 0x0164 */ BgHakaMeganeBGActionFunc actionFunc;
- /* 0x0168 */ u8 unk_168;
- /* 0x016A */ s16 unk_16A;
+ /* 0x0168 */ u8 switchFlag;
+ /* 0x016A */ s16 timer;
} BgHakaMeganeBG; // size = 0x016C
#endif
diff --git a/src/overlays/actors/ovl_Bg_Ydan_Maruta/z_bg_ydan_maruta.c b/src/overlays/actors/ovl_Bg_Ydan_Maruta/z_bg_ydan_maruta.c
index 10c23e5187..71aa22cd03 100644
--- a/src/overlays/actors/ovl_Bg_Ydan_Maruta/z_bg_ydan_maruta.c
+++ b/src/overlays/actors/ovl_Bg_Ydan_Maruta/z_bg_ydan_maruta.c
@@ -96,7 +96,7 @@ void BgYdanMaruta_Init(Actor* thisx, PlayState* play) {
Collider_InitTris(play, &this->collider);
Collider_SetTris(play, &this->collider, &this->dyna.actor, &sTrisInit, this->colliderElements);
- this->switchFlag = PARAMS_GET_U(this->dyna.actor.params, 0, 16);
+ this->switchFlag = PARAMS_GET_U(this->dyna.actor.params, 0, 8);
thisx->params = PARAMS_GET_U(thisx->params, 8, 8); // thisx is required to match here
if (this->dyna.actor.params == 0) {
diff --git a/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c b/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c
index e3de734e45..5401b389d2 100644
--- a/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c
+++ b/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c
@@ -26,8 +26,8 @@
#include "assets/objects/gameplay_keep/shadow_circle.h"
#include "assets/objects/object_tw/object_tw.h"
-#pragma increment_block_number "gc-eu:0 gc-eu-mq:0 gc-jp:0 gc-jp-ce:0 gc-jp-mq:0 gc-us:0 gc-us-mq:0" \
- "ique-cn:0 ntsc-1.0:0 ntsc-1.1:0 ntsc-1.2:0 pal-1.0:0 pal-1.1:0"
+#pragma increment_block_number "gc-eu:0 gc-eu-mq:0 gc-jp:0 gc-jp-ce:0 gc-jp-mq:0 gc-us:0 gc-us-mq:0 ique-cn:128" \
+ "ntsc-1.0:0 ntsc-1.1:0 ntsc-1.2:0 pal-1.0:0 pal-1.1:0"
#define FLAGS \
(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | \
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 60ed932eac..c02cd8eca1 100644
--- a/src/overlays/actors/ovl_En_Door/z_en_door.h
+++ b/src/overlays/actors/ovl_En_Door/z_en_door.h
@@ -33,6 +33,12 @@
#define ENDOOR_GET_CHECKABLE_TEXT_ID(thisx) PARAMS_GET_U((thisx)->params, 0, 6)
+#define ENDOOR_PARAMS(type, isDoubleDoor, data) (((type) << 7) | (((isDoubleDoor) ? 1 : 0) << 6) | (data))
+#define ENDOOR_PARAMS_NODATA(type, isDoubleDoor) (ENDOOR_PARAMS(type, isDoubleDoor, 0x3F))
+#define ENDOOR_PARAMS_LOCKED(isDoubleDoor, switchFlag) (ENDOOR_PARAMS(DOOR_LOCKED, isDoubleDoor, switchFlag))
+#define ENDOOR_PARAMS_CHECKABLE(isDoubleDoor, textIdMinus0x0200) (ENDOOR_PARAMS(DOOR_CHECKABLE, isDoubleDoor, textIdMinus0x0200))
+#define ENDOOR_PARAMS_EVENING(isDoubleDoor, textIdMinus0x0200) (ENDOOR_PARAMS(DOOR_EVENING, isDoubleDoor, textIdMinus0x0200))
+
typedef enum EnDoorType {
/* 0x00 */ DOOR_ROOMLOAD, // loads rooms
/* 0x01 */ DOOR_LOCKED, // small key locked door
diff --git a/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c b/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c
index dbe4193bef..328e6ea205 100644
--- a/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c
+++ b/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c
@@ -622,7 +622,7 @@ void ObjSwitch_CrystalOffInit(ObjSwitch* this) {
this->crystalColor.r = 0;
this->crystalColor.g = 0;
this->crystalColor.b = 0;
- this->crystalSubtype1texture = gCrstalSwitchRedTex;
+ this->crystalSubtype1texture = gCrystalSwitchRedTex;
this->actionFunc = ObjSwitch_CrystalOff;
}
@@ -677,7 +677,7 @@ void ObjSwitch_CrystalOnInit(ObjSwitch* this) {
this->crystalColor.r = 255;
this->crystalColor.g = 255;
this->crystalColor.b = 255;
- this->crystalSubtype1texture = gCrstalSwitchBlueTex;
+ this->crystalSubtype1texture = gCrystalSwitchBlueTex;
this->actionFunc = ObjSwitch_CrystalOn;
}
diff --git a/tools/assets/extract/extase_oot64/actor_params.py b/tools/assets/extract/extase_oot64/actor_params.py
new file mode 100644
index 0000000000..9d3df572f4
--- /dev/null
+++ b/tools/assets/extract/extase_oot64/actor_params.py
@@ -0,0 +1,50 @@
+def bits(p: int, s: int, n: int):
+ return (p >> s) & ((1 << n) - 1)
+
+
+def cbool(b: bool):
+ return "true" if b else "false"
+
+
+def params_en_door(params: int):
+ unused_mask = 0b1111_1100_0011_1111
+ type = bits(params, 7, 3)
+ type_name = [
+ "DOOR_ROOMLOAD",
+ "DOOR_LOCKED",
+ "DOOR_ROOMLOAD2",
+ "DOOR_SCENEEXIT",
+ "DOOR_AJAR",
+ "DOOR_CHECKABLE",
+ "DOOR_EVENING",
+ "DOOR_ROOMLOAD7",
+ ][type]
+ isDoubleDoor = bits(params, 6, 1) != 0
+ if type_name == "DOOR_LOCKED":
+ unused_mask &= ~0b0011_1111
+ switchFlag = bits(params, 0, 6)
+ params_str = f"ENDOOR_PARAMS_LOCKED({cbool(isDoubleDoor)}, {switchFlag})"
+ elif type_name == "DOOR_CHECKABLE":
+ unused_mask &= ~0b0011_1111
+ textIdMinux0x0200 = bits(params, 0, 6)
+ params_str = f"ENDOOR_PARAMS_CHECKABLE({cbool(isDoubleDoor)}, {textIdMinux0x0200})"
+ elif type_name == "DOOR_EVENING":
+ unused_mask &= ~0b0011_1111
+ textIdMinux0x0200 = bits(params, 0, 6)
+ params_str = f"ENDOOR_PARAMS_EVENING({cbool(isDoubleDoor)}, {textIdMinux0x0200})"
+ else:
+ unused_mask &= ~0b0011_1111
+ data = bits(params, 0, 6)
+ assert data == 0x3F
+ params_str = f"ENDOOR_PARAMS_NODATA({type_name}, {cbool(isDoubleDoor)})"
+ assert (params & unused_mask) == 0, (f"{params:#06X}", params_str)
+ return params_str
+
+
+PARAMS_FMT = {
+ "ACTOR_EN_DOOR": params_en_door,
+}
+
+INCLUDES = {
+ "ACTOR_EN_DOOR": ["src/overlays/actors/ovl_En_Door/z_en_door.h"],
+}
diff --git a/tools/assets/extract/extase_oot64/scene_rooms_resources.py b/tools/assets/extract/extase_oot64/scene_rooms_resources.py
index 3b632604cd..4c65ad8af4 100644
--- a/tools/assets/extract/extase_oot64/scene_rooms_resources.py
+++ b/tools/assets/extract/extase_oot64/scene_rooms_resources.py
@@ -24,6 +24,7 @@ from ..extase.cdata_resources import (
)
from .. import oot64_data
+from . import actor_params
VERBOSE_SPAWN_LIST_LENGTH_GUESSING = False
@@ -37,7 +38,8 @@ class ActorEntryListResource(CDataArrayNamedLengthResource):
f.write("{\n")
f.write(wctx.line_prefix + INDENT)
- f.write(oot64_data.get_actor_id_name(v["id"]))
+ actor_id_name = oot64_data.get_actor_id_name(v["id"])
+ f.write(actor_id_name)
f.write(",\n")
f.write(wctx.line_prefix + INDENT)
@@ -52,9 +54,16 @@ class ActorEntryListResource(CDataArrayNamedLengthResource):
f.write(wctx.line_prefix + INDENT)
params = v["params"]
- f.write(fmt_hex_s(params, 4))
if params < 0:
params_u16 = params + 0x1_0000
+ else:
+ params_u16 = params
+ fmt_params = actor_params.PARAMS_FMT.get(actor_id_name)
+ if fmt_params is None:
+ f.write(fmt_hex_s(params, 4))
+ else:
+ f.write(fmt_params(params_u16))
+ if params < 0 or fmt_params is not None:
f.write(f" /* 0x{params_u16:04X} */")
f.write(", // params\n")
@@ -76,7 +85,14 @@ class ActorEntryListResource(CDataArrayNamedLengthResource):
return f"ActorEntry {self.symbol_name}[{self.length_name}]"
def get_c_includes(self):
- return ("actor.h",)
+ includes = ["actor.h"]
+ for elem in self.cdata_unpacked:
+ actor_id = elem["id"]
+ actor_id_name = oot64_data.get_actor_id_name(actor_id)
+ actor_params_includes = actor_params.INCLUDES.get(actor_id_name)
+ if actor_params_includes is not None:
+ includes.extend(actor_params_includes)
+ return includes
def get_h_includes(self):
return ("scene.h",)
@@ -344,7 +360,8 @@ class TransitionActorEntryListResource(CDataArrayNamedLengthResource):
f.write("}, // sides\n")
f.write(wctx.line_prefix + INDENT)
- f.write(oot64_data.get_actor_id_name(v["id"]))
+ actor_id_name = oot64_data.get_actor_id_name(v["id"])
+ f.write(actor_id_name)
f.write(",\n")
f.write(wctx.line_prefix + INDENT)
@@ -358,9 +375,16 @@ class TransitionActorEntryListResource(CDataArrayNamedLengthResource):
f.write(wctx.line_prefix + INDENT)
params = v["params"]
- f.write(fmt_hex_s(params, 4))
if params < 0:
params_u16 = params + 0x1_0000
+ else:
+ params_u16 = params
+ fmt_params = actor_params.PARAMS_FMT.get(actor_id_name)
+ if fmt_params is None:
+ f.write(fmt_hex_s(params, 4))
+ else:
+ f.write(fmt_params(params_u16))
+ if params < 0 or fmt_params is not None:
f.write(f" /* 0x{params_u16:04X} */")
f.write(", // params\n")
@@ -394,7 +418,14 @@ class TransitionActorEntryListResource(CDataArrayNamedLengthResource):
return f"TransitionActorEntry {self.symbol_name}[{self.length_name}]"
def get_c_includes(self):
- return ("actor.h",)
+ includes = ["actor.h"]
+ for elem in self.cdata_unpacked:
+ actor_id = elem["id"]
+ actor_id_name = oot64_data.get_actor_id_name(actor_id)
+ actor_params_includes = actor_params.INCLUDES.get(actor_id_name)
+ if actor_params_includes is not None:
+ includes.extend(actor_params_includes)
+ return includes
def get_h_includes(self):
return ("scene.h",)
diff --git a/tools/fix_bss.py b/tools/fix_bss.py
index 743085cd17..6d13a794e5 100755
--- a/tools/fix_bss.py
+++ b/tools/fix_bss.py
@@ -349,7 +349,7 @@ class BssSymbol:
INCREMENT_BLOCK_NUMBER_RE = re.compile(r"increment_block_number_(\d+)_(\d+)")
-# Find increment_block_number pragmas by parsing the symbol names generated by preprocess.py.
+# Find increment_block_number pragmas by parsing the symbol names generated by preprocess.sh.
# This is pretty ugly but it seems more reliable than trying to determine the line numbers of
# BSS variables in the C file.
def find_pragmas(symbol_table: list[SymbolTableEntry]) -> list[Pragma]:
diff --git a/tools/ido_block_numbers.py b/tools/ido_block_numbers.py
index 188cf8f36d..dc7cc99548 100755
--- a/tools/ido_block_numbers.py
+++ b/tools/ido_block_numbers.py
@@ -497,7 +497,7 @@ def run_cfe(
command_line: list[str], keep_files: bool
) -> Tuple[list[SymbolTableEntry], list[UcodeOp]]:
# Assume command line is of the form:
- # python3 tools/preprocess.py [COMPILER] [COMPILER_ARGS] [INPUT_FILE]
+ # python3 tools/preprocess.sh [COMPILER] [COMPILER_ARGS] [INPUT_FILE]
input_file = Path(command_line[-1])
rest = command_line[:-1]
diff --git a/undefined_syms.txt b/undefined_syms.txt
index deba8affd0..c40597854c 100644
--- a/undefined_syms.txt
+++ b/undefined_syms.txt
@@ -1,7 +1,7 @@
// z_kankyo, z_demo_kankyo, z_en_viewer, z_object_kankyo, z_eff_ss_dead_dd
D_01000000 = 0x01000000;
-// code_800AD920
+// z_viszbuf
D_0E000000 = 0x0E000000;
// z_vismono