1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-05-11 03:23:46 +00:00

Merge remote-tracking branch 'origin/main' into save_flags_redo

This commit is contained in:
mzxrules 2024-12-22 12:53:05 -05:00
commit af127d31c8
149 changed files with 4202 additions and 870 deletions

View file

@ -1,5 +1,7 @@
FROM ubuntu:22.04 as build
FROM ubuntu:24.04 AS build
ENV TZ=UTC
ENV LANG=C.UTF-8
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \
apt-get update && \
@ -19,15 +21,8 @@ RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone &
apt-get clean && \
rm -rf /var/lib/apt/lists/*
RUN python3 -m pip install --user colorama ansiwrap attrs watchdog python-Levenshtein "mapfile-parser>=1.2.1,<2.0.0" "rabbitizer>=1.0.0,<2.0.0"
RUN python3 -m pip install --upgrade attrs pycparser
ENV LANG C.UTF-8
RUN mkdir /oot
WORKDIR /oot
RUN git config --global --add safe.directory /oot
CMD ["/bin/sh", "-c", \
"echo 'usage:\n docker run --rm --mount type=bind,source=\"$(pwd)\",destination=/oot oot make -j$(nproc) setup\n docker run --rm --mount type=bind,source=\"$(pwd)\",destination=/oot oot make -j$(nproc)'"]
CMD make -j $(nproc) setup && make -j $(nproc) && tail -f /dev/null

View file

@ -66,6 +66,7 @@ ifeq ($(VERSION),ntsc-1.0)
REGION ?= JP
PLATFORM := N64
DEBUG_FEATURES ?= 0
BUILD_CREATOR := zelda@srd44
BUILD_DATE := 98-10-21
BUILD_TIME := 04:56:31
REVISION := 0
@ -74,6 +75,7 @@ else ifeq ($(VERSION),ntsc-1.1)
REGION ?= JP
PLATFORM := N64
DEBUG_FEATURES ?= 0
BUILD_CREATOR := zelda@srd44
BUILD_DATE := 98-10-26
BUILD_TIME := 10:58:45
REVISION := 1
@ -81,6 +83,7 @@ else ifeq ($(VERSION),pal-1.0)
REGION ?= EU
PLATFORM := N64
DEBUG_FEATURES ?= 0
BUILD_CREATOR := zelda@srd44
BUILD_DATE := 98-11-10
BUILD_TIME := 14:34:22
REVISION := 0
@ -89,6 +92,7 @@ else ifeq ($(VERSION),ntsc-1.2)
REGION ?= JP
PLATFORM := N64
DEBUG_FEATURES ?= 0
BUILD_CREATOR := zelda@srd44
BUILD_DATE := 98-11-12
BUILD_TIME := 18:17:03
REVISION := 2
@ -96,6 +100,7 @@ else ifeq ($(VERSION),pal-1.1)
REGION ?= EU
PLATFORM := N64
DEBUG_FEATURES ?= 0
BUILD_CREATOR := zelda@srd44
BUILD_DATE := 98-11-18
BUILD_TIME := 17:36:49
REVISION := 1
@ -103,6 +108,7 @@ else ifeq ($(VERSION),gc-jp)
REGION ?= JP
PLATFORM := GC
DEBUG_FEATURES ?= 0
BUILD_CREATOR := zelda@srd022j
BUILD_DATE := 02-10-29
BUILD_TIME := 23:49:53
REVISION := 15
@ -110,6 +116,7 @@ else ifeq ($(VERSION),gc-jp-mq)
REGION ?= JP
PLATFORM := GC
DEBUG_FEATURES ?= 0
BUILD_CREATOR := zelda@srd022j
BUILD_DATE := 02-10-30
BUILD_TIME := 00:15:15
REVISION := 15
@ -117,6 +124,7 @@ else ifeq ($(VERSION),gc-us)
REGION ?= US
PLATFORM := GC
DEBUG_FEATURES ?= 0
BUILD_CREATOR := zelda@srd022j
BUILD_DATE := 02-12-19
BUILD_TIME := 13:28:09
REVISION := 15
@ -124,6 +132,7 @@ else ifeq ($(VERSION),gc-us-mq)
REGION ?= US
PLATFORM := GC
DEBUG_FEATURES ?= 0
BUILD_CREATOR := zelda@srd022j
BUILD_DATE := 02-12-19
BUILD_TIME := 14:05:42
REVISION := 15
@ -131,6 +140,7 @@ else ifeq ($(VERSION),gc-eu-mq-dbg)
REGION ?= EU
PLATFORM := GC
DEBUG_FEATURES ?= 1
BUILD_CREATOR := zelda@srd022j
BUILD_DATE := 03-02-21
BUILD_TIME := 00:16:31
REVISION := 15
@ -138,6 +148,7 @@ else ifeq ($(VERSION),gc-eu)
REGION ?= EU
PLATFORM := GC
DEBUG_FEATURES ?= 0
BUILD_CREATOR := zelda@srd022j
BUILD_DATE := 03-02-21
BUILD_TIME := 20:12:23
REVISION := 15
@ -145,6 +156,7 @@ else ifeq ($(VERSION),gc-eu-mq)
REGION ?= EU
PLATFORM := GC
DEBUG_FEATURES ?= 0
BUILD_CREATOR := zelda@srd022j
BUILD_DATE := 03-02-21
BUILD_TIME := 20:37:19
REVISION := 15
@ -152,23 +164,23 @@ else ifeq ($(VERSION),gc-jp-ce)
REGION ?= JP
PLATFORM := GC
DEBUG_FEATURES ?= 0
BUILD_CREATOR := zelda@srd022j
BUILD_DATE := 03-10-08
BUILD_TIME := 21:53:00
REVISION := 15
else ifeq ($(VERSION),ique-cn)
COMPARE := 0
REGION ?= US
PLATFORM := IQUE
DEBUG_FEATURES ?= 0
BUILD_CREATOR := build@toad.routefree.com
BUILD_DATE := 03-10-22
BUILD_TIME := 16:23:19
REVISION := 0
else
$(error Unsupported version $(VERSION))
endif
ifeq ($(PLATFORM),N64)
BUILD_CREATOR := zelda@srd44
LIBULTRA_VERSION := I
LIBULTRA_PATCH := 1
else
BUILD_CREATOR := zelda@srd022j
LIBULTRA_VERSION := L
LIBULTRA_PATCH := 0
endif
# ORIG_COMPILER cannot be combined with a non-IDO compiler. Check for this case and error out if found.
ifneq ($(COMPILER),ido)
ifeq ($(ORIG_COMPILER),1)
@ -196,6 +208,22 @@ VENV := .venv
MAKE = make
CPPFLAGS += -P -xc -fno-dollars-in-identifiers
ifeq ($(PLATFORM),N64)
CPP_DEFINES += -DPLATFORM_N64=1 -DPLATFORM_GC=0 -DPLATFORM_IQUE=0
LIBULTRA_VERSION := I
LIBULTRA_PATCH := 1
else ifeq ($(PLATFORM),GC)
CPP_DEFINES += -DPLATFORM_N64=0 -DPLATFORM_GC=1 -DPLATFORM_IQUE=0
LIBULTRA_VERSION := L
LIBULTRA_PATCH := 0
else ifeq ($(PLATFORM),IQUE)
CPP_DEFINES += -DPLATFORM_N64=0 -DPLATFORM_GC=0 -DPLATFORM_IQUE=1
LIBULTRA_VERSION := L
LIBULTRA_PATCH := 0
else
$(error Unsupported platform $(PLATFORM))
endif
# Converts e.g. ntsc-1.0 to NTSC_1_0
VERSION_MACRO := $(shell echo $(VERSION) | tr a-z-. A-Z__)
CPP_DEFINES += -DOOT_VERSION=$(VERSION_MACRO) -DOOT_REVISION=$(REVISION)
@ -204,14 +232,6 @@ CPP_DEFINES += -DBUILD_CREATOR="\"$(BUILD_CREATOR)\"" -DBUILD_DATE="\"$(BUILD_DA
CPP_DEFINES += -DLIBULTRA_VERSION=LIBULTRA_VERSION_$(LIBULTRA_VERSION)
CPP_DEFINES += -DLIBULTRA_PATCH=$(LIBULTRA_PATCH)
ifeq ($(PLATFORM),N64)
CPP_DEFINES += -DPLATFORM_N64=1 -DPLATFORM_GC=0
else ifeq ($(PLATFORM),GC)
CPP_DEFINES += -DPLATFORM_N64=0 -DPLATFORM_GC=1
else
$(error Unsupported platform $(PLATFORM))
endif
ifeq ($(DEBUG_FEATURES),1)
CPP_DEFINES += -DDEBUG_FEATURES=1
OPTFLAGS := -O2
@ -266,6 +286,13 @@ OBJCOPY := $(MIPS_BINUTILS_PREFIX)objcopy
OBJDUMP := $(MIPS_BINUTILS_PREFIX)objdump
NM := $(MIPS_BINUTILS_PREFIX)nm
# The default iconv on macOS has some differences from GNU iconv, so we use the Homebrew version instead
ifeq ($(UNAME_S),Darwin)
ICONV := $(shell brew --prefix)/opt/libiconv/bin/iconv
else
ICONV := iconv
endif
INC := -Iinclude -Iinclude/libc -Isrc -I$(BUILD_DIR) -I. -I$(EXTRACTED_DIR)
# Check code syntax with host compiler
@ -598,7 +625,7 @@ $(BUILD_DIR)/assets/misc/z_select_static/%.o: GBI_DEFINES := -DF3DEX_GBI
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
# Handle encoding (UTF-8 -> EUC-JP) and custom pragmas
$(BUILD_DIR)/src/%.o: CC := ./tools/preprocess.sh -v $(VERSION) -- $(CC)
$(BUILD_DIR)/src/%.o: CC := ./tools/preprocess.sh -v $(VERSION) -i $(ICONV) -- $(CC)
endif
else
@ -781,6 +808,14 @@ endif
$(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $<
@$(OBJDUMP) $(OBJDUMP_FLAGS) $@ > $(@:.o=.s)
$(BUILD_DIR)/src/audio/session_init.o: src/audio/session_init.c $(BUILD_DIR)/assets/audio/soundfont_sizes.h $(BUILD_DIR)/assets/audio/sequence_sizes.h
ifneq ($(RUN_CC_CHECK),0)
$(CC_CHECK) $<
endif
$(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $(@:.o=.tmp) $<
$(LD) -r -T linker_scripts/data_with_rodata.ld -o $@ $(@:.o=.tmp)
@$(OBJDUMP) $(OBJDUMP_FLAGS) $@ > $(@:.o=.s)
$(BUILD_DIR)/src/libultra/libc/ll.o: src/libultra/libc/ll.c
ifneq ($(RUN_CC_CHECK),0)
$(CC_CHECK) $<
@ -898,7 +933,7 @@ $(BUILD_DIR)/assets/audio/soundfonts/%.o: $(BUILD_DIR)/assets/audio/soundfonts/%
$(SFPATCH) $(@:.o=.tmp2) $(@:.o=.tmp2)
# write start and size symbols afterwards, filename != symbolic name so source symbolic name from the .name file written by sfc
# also write a .note.name section containing the symbolic name of the soundfont
$(OBJCOPY) --add-symbol $$(cat $(<:.c=.name) | head -c -1)_Start=.rodata:0,global --redefine-sym __LEN__=$$(cat $(<:.c=.name) | head -c -1)_Size --add-section .note.name=$(<:.c=.name) $(@:.o=.tmp2) $@
$(OBJCOPY) --add-symbol $$(cat $(<:.c=.name) | tr -d '\0')_Start=.rodata:0,global --redefine-sym __LEN__=$$(cat $(<:.c=.name) | tr -d '\0')_Size --add-section .note.name=$(<:.c=.name) $(@:.o=.tmp2) $@
# cleanup temp files
@$(RM) $(@:.o=.tmp) $(@:.o=.tmp2)
ifeq ($(AUDIO_BUILD_DEBUG),1)
@ -960,8 +995,6 @@ $(BUILD_DIR)/assets/audio/sequence_font_table.o: $(BUILD_DIR)/assets/audio/seque
# make headers with file sizes and amounts
$(BUILD_DIR)/src/audio/session_config.o: $(BUILD_DIR)/assets/audio/soundfont_sizes.h $(BUILD_DIR)/assets/audio/sequence_sizes.h
$(BUILD_DIR)/assets/audio/soundfont_sizes.h: $(SOUNDFONT_O_FILES)
$(AFILE_SIZES) $@ NUM_SOUNDFONTS SOUNDFONT_SIZES .rodata $^

View file

@ -23,7 +23,6 @@
# Possibly from a SHIFT-JIS extension, python doesn't have builtin support
'┯' : (None, 0x86D3),
'‾' : (0x7F, None),
'À' : (0x80, None),
'î' : (0x81, None),
'Â' : (0x82, None),

View file

@ -0,0 +1,21 @@
<Root>
<File Name="object_mag" Segment="6">
<Texture Name="gTitleZeldaShieldLogoTex" OutName="title_zelda_shield_logo" Format="rgba32" Width="160" Height="160" Offset="0x0"/>
<Texture Name="gTitleCopyright19982003Tex" OutName="title_copyright_19982003" Format="ia8" Width="128" Height="16" Offset="0x19000"/>
<Texture Name="gTitleCopyright2003iQueTex" OutName="title_copyright_2003_ique" Format="ia8" Width="128" Height="16" Offset="0x19800"/>
<Texture Name="gTitleDiskTex" OutName="title_disk" Format="ia8" Width="48" Height="16" Offset="0x1A000"/>
<Texture Name="gTitleEffectMask00Tex" OutName="title_effect_mask_0_0" Format="i4" Width="64" Height="64" Offset="0x1A300"/>
<Texture Name="gTitleEffectMask01Tex" OutName="title_effect_mask_0_1" Format="i4" Width="64" Height="64" Offset="0x1AB00"/>
<Texture Name="gTitleEffectMask02Tex" OutName="title_effect_mask_0_2" Format="i4" Width="64" Height="64" Offset="0x1B300"/>
<Texture Name="gTitleEffectMask10Tex" OutName="title_effect_mask_1_0" Format="i4" Width="64" Height="64" Offset="0x1BB00"/>
<Texture Name="gTitleEffectMask11Tex" OutName="title_effect_mask_1_1" Format="i4" Width="64" Height="64" Offset="0x1C300"/>
<Texture Name="gTitleEffectMask12Tex" OutName="title_effect_mask_1_2" Format="i4" Width="64" Height="64" Offset="0x1CB00"/>
<Texture Name="gTitleEffectMask20Tex" OutName="title_effect_mask_2_0" Format="i4" Width="64" Height="64" Offset="0x1D300"/>
<Texture Name="gTitleEffectMask21Tex" OutName="title_effect_mask_2_1" Format="i4" Width="64" Height="64" Offset="0x1DB00"/>
<Texture Name="gTitleEffectMask22Tex" OutName="title_effect_mask_2_2" Format="i4" Width="64" Height="64" Offset="0x1E300"/>
<Texture Name="gTitleFlameEffectTex" OutName="title_flame_effect" Format="i8" Width="32" Height="32" Offset="0x1EB00"/>
<Texture Name="gTitleTheLegendOfTextTex" OutName="title_the_legend_of_text" Format="i8" Width="72" Height="8" Offset="0x1EF00"/>
<Texture Name="gTitleOcarinaOfTimeTMTextTex" OutName="title_ocarina_of_time_tm_text" Format="i8" Width="96" Height="8" Offset="0x1F140"/>
<Texture Name="gTitleTitleCNTex" OutName="title_title_cn" Format="i8" Width="128" Height="16" Offset="0x1F440"/>
</File>
</Root>

View file

@ -0,0 +1,26 @@
<Root>
<File Name="ovl_End_Title">
<DList Name="sEmptyDL1" Offset="0x0"/>
<Texture Name="sIQueTop" OutName="ique_top" Format="ia8" Width="128" Height="24" Offset="0x8"/>
<Texture Name="sIQueBottom" OutName="ique_bottom" Format="ia8" Width="128" Height="24" Offset="0xC08"/>
<DList Name="sEmptyDL2" Offset="0x1808"/>
<Texture Name="sNintendoLeftTex" OutName="nintendo_left" Format="ia8" Width="64" Height="48" Offset="0x1810"/>
<DList Name="sEmptyDL3" Offset="0x2410"/>
<Texture Name="sNintendoRightTex" OutName="nintendo_right" Format="ia8" Width="64" Height="48" Offset="0x2418"/>
<DList Name="sEmptyDL4" Offset="0x3018"/>
<Texture Name="sPresentedByTex" OutName="presented_by" Format="ia8" Width="96" Height="16" Offset="0x3020"/>
<DList Name="sEmptyDL5" Offset="0x3620"/>
<Texture Name="sTheEndTex" OutName="the_end" Format="ia8" Width="80" Height="24" Offset="0x3628"/>
<DList Name="sEmptyDL6" Offset="0x3DA8"/>
<Texture Name="sTheLegendOfZeldaTex" OutName="the_legend_of_zelda" Format="ia8" Width="120" Height="24" Offset="0x3DB0"/>
<DList Name="sEmptyDL7" Offset="0x48F0"/>
<Texture Name="sOcarinaOfTimeTex" OutName="ocarina_of_time" Format="ia8" Width="112" Height="16" Offset="0x48F8"/>
<Array Name="sTriforceVtx" Count="6" Offset="0x4FF8">
<Vtx/>
</Array>
<DList Name="sTriforceDL" Offset="0x5058"/>
<DList Name="sPresentedByNintendoDL" Offset="0x50B8"/>
</File>
</Root>

View file

@ -1,7 +1,7 @@
<Root>
<File Name="bdan_scene" Segment="2">
<Cutscene Name="gJabuIntroCs" Offset="0x155E0"/>
<Cutscene Name="gJabuSapphireRetrieveUnusedCs" Offset="0x13080"/>
<Cutscene Name="gJabuRutoObtainingSapphireUnusedCs" Offset="0x13080"/>
<Scene Name="bdan_scene" Offset="0x0"/>
</File>
<File Name="bdan_room_0" Segment="3">

View file

@ -1,7 +1,7 @@
<Root>
<File Name="bdan_scene" Segment="2">
<Cutscene Name="gJabuIntroCs" Offset="0x15600"/>
<Cutscene Name="gJabuSapphireRetrieveUnusedCs" Offset="0x130A0"/>
<Cutscene Name="gJabuRutoObtainingSapphireUnusedCs" Offset="0x130A0"/>
<Scene Name="bdan_scene" Offset="0x0"/>
</File>
<File Name="bdan_room_0" Segment="3">

View file

@ -1,6 +1,9 @@
<Root>
<File Name="kenjyanoma_scene" Segment="2">
<Scene Name="kenjyanoma_scene" Offset="0x0"/>
<Cutscene Name="gChamberOfSagesRauruFinalMsgCs" Offset="0x12A0"/>
<Cutscene Name="gChamberOfSagesLightMedallionCs" Offset="0x0120"/>
<Cutscene Name="gChamberOfSagesSealOpeningCs" Offset="0x1690"/>
</File>
<File Name="kenjyanoma_room_0" Segment="3">
<Room Name="kenjyanoma_room_0" Offset="0x0"/>

View file

@ -1,6 +1,8 @@
<Root>
<File Name="link_home_scene" Segment="2">
<Scene Name="link_home_scene" Offset="0x0"/>
<Cutscene Name="gLinkHouseIntroWakeUpCs" Offset="0x1040"/>
<Cutscene Name="gLinkHouseIntroSleepCs" Offset="0x15D0"/>
</File>
<File Name="link_home_room_0" Segment="3">
<Room Name="link_home_room_0" Offset="0x0"/>

View file

@ -4,6 +4,8 @@
<Cutscene Name="gZeldasCourtyardWindowCs" Offset="0x444"/>
<Cutscene Name="gZeldasCourtyardMeetCs" Offset="0x3994"/>
<Cutscene Name="gZeldasCourtyardLullabyCs" Offset="0x2524"/>
<Cutscene Name="gZeldasCourtyardTheEndCs" Offset="0x1C04"/>
<Cutscene Name="gZeldasCourtyardLullabyUnusedCs" Offset="0x34B0"/>
<Scene Name="nakaniwa_scene" Offset="0x0"/>
</File>

View file

@ -1,6 +1,9 @@
<Root>
<File Name="syatekijyou_scene" Segment="2">
<Scene Name="syatekijyou_scene" Offset="0x0"/>
<Cutscene Name="gShootingGalleryCameraRoll1UnusedCs" Offset="0x1450"/>
<Cutscene Name="gShootingGalleryCameraRoll2UnusedCs" Offset="0x1640"/>
<Cutscene Name="gShootingGalleryCameraRoll3UnusedCs" Offset="0x1830"/>
</File>
<File Name="syatekijyou_room_0" Segment="3">
<Room Name="syatekijyou_room_0" Offset="0x0"/>

View file

@ -1,8 +1,18 @@
<Root>
<File Name="tokinoma_scene" Segment="2">
<Cutscene Name="gTempleOfTimeFirstAdultCs" Offset="0x46F0"/>
<Cutscene Name="gTempleOfTimePreludeCs" Offset="0x6D20"/>
<Cutscene Name="gTempleOfTimeFirstAdultCs" Offset="0x46F0"/>
<Cutscene Name="gTempleOfTimePreludeCs" Offset="0x6D20"/>
<Cutscene Name="gTempleOfTimeIntroCs" Offset="0xCE00"/>
<Cutscene Name="gTempleOfTimeSapphireRestoredUnusedCs" Offset="0xBE90"/>
<Cutscene Name="gTempleOfTimeCreditsCs" Offset="0x3BB0"/>
<Cutscene Name="gTempleOfTimeSheikRevealCs" Offset="0x8BC0"/>
<Cutscene Name="gTempleOfTimeLightArrowsAndZeldaCapturedCs" Offset="0x9F70"/>
<Cutscene Name="gTempleOfTimeRubyRestoredUnusedCs" Offset="0x35D0"/>
<Cutscene Name="gTempleOfTimeEmeraldRestoredUnusedCs" Offset="0x38C0"/>
<Cutscene Name="gTempleOfTimeSongOfTimeCs" Offset="0x61C0"/>
<Cutscene Name="gTempleOfTimeSheikRevealStartCs" Offset="0x84E0"/>
<Cutscene Name="gTempleOfTimeDoorOpeningUnusedCs" Offset="0x3330"/>
<Scene Name="tokinoma_scene" Offset="0x0"/>
</File>
<File Name="tokinoma_room_0" Segment="3">

View file

@ -1,8 +1,17 @@
<Root>
<File Name="tokinoma_scene" Segment="2">
<Cutscene Name="gTempleOfTimeFirstAdultCs" Offset="0x4700"/>
<Cutscene Name="gTempleOfTimePreludeCs" Offset="0x6D34"/>
<Cutscene Name="gTempleOfTimeFirstAdultCs" Offset="0x4700"/>
<Cutscene Name="gTempleOfTimePreludeCs" Offset="0x6D34"/>
<Cutscene Name="gTempleOfTimeIntroCs" Offset="0xCE20"/>
<Cutscene Name="gTempleOfTimeSapphireRestoredUnusedCs" Offset="0xBEB0"/>
<Cutscene Name="gTempleOfTimeCreditsCs" Offset="0x3BB4"/>
<Cutscene Name="gTempleOfTimeSheikRevealsCs" Offset="0x8BE0"/>
<Cutscene Name="gTempleOfTimeLightArrowsAndZeldaCapturedCs" Offset="0x9F90"/>
<Cutscene Name="gTempleOfTimeRubyRestoredUnusedCs" Offset="0x35D0"/>
<Cutscene Name="gTempleOfTimeEmeraldRestoredUnusedCs" Offset="0x38C0"/>
<Cutscene Name="gTempleOfTimeSongOfTimeCs" Offset="0x61D0"/>
<Cutscene Name="gTempleOfTimeSheikRevealsStartCs" Offset="0x8500"/>
<Cutscene Name="gTempleOfTimeDoorOpeningUnusedCs" Offset="0x3330"/>
<Scene Name="tokinoma_scene" Offset="0x0"/>
</File>
<File Name="tokinoma_room_0" Segment="3">

View file

@ -2,9 +2,9 @@
<File Name="spot02_scene" Segment="2">
<Scene Name="spot02_scene" Offset="0x0"/>
<Cutscene Name="spot02_scene_Cs_003C80" Offset="0x3C80"/>
<Cutscene Name="spot02_scene_Cs_005020" Offset="0x5020"/>
<Cutscene Name="gGraveyardTombOpeningAdultCs" Offset="0x3C80"/>
<Cutscene Name="gGraveyardTombOpeningChildCs" Offset="0x5020"/>
<Cutscene Name="gGraveyardSunsSongPart2Cs" Offset="0x4E90"/>
<Cutscene Name="gGraveyardIntroCs" Offset="0x70C0"/>
</File>
<File Name="spot02_room_0" Segment="3">

View file

@ -1,8 +1,7 @@
<Root>
<File Name="spot05_scene" Segment="2">
<Cutscene Name="gMinuetCs" Offset="0x3F80"/>
<Cutscene Name="spot05_scene_Cs_005730" Offset="0x5730"/>
<Cutscene Name="gMeadowMinuetCs" Offset="0x3F80"/>
<Cutscene Name="gMeadowSariasSongCs" Offset="0x5730"/>
<Path Name="spot05_scenePathList_0069D8" Offset="0x69D8" NumPaths="5"/>

View file

@ -1,8 +1,7 @@
<Root>
<File Name="spot05_scene" Segment="2">
<Cutscene Name="gMinuetCs" Offset="0x3F84"/>
<Cutscene Name="spot05_scene_Cs_005730" Offset="0x5740"/>
<Cutscene Name="gMeadowMinuetCs" Offset="0x3F84"/>
<Cutscene Name="gMeadowSariasSongCs" Offset="0x5740"/>
<Path Name="spot05_scenePathList_0069D8" Offset="0x69E8" NumPaths="5"/>

View file

@ -2,8 +2,11 @@
<File Name="spot06_scene" Segment="2">
<Cutscene Name="gLakeHyliaFireArrowsCS" Offset="0x7020"/>
<Cutscene Name="gLakeHyliaOwlCs" Offset="0x1B0C0"/>
<Path Name="spot06_scenePathList_007764" Offset="0x7764" NumPaths="2"/>
<Cutscene Name="gLakeHyliaIntroCs" Offset="0x7A30"/>
<Cutscene Name="gLakeHyliaCreditsCs" Offset="0x6E90"/>
<Cutscene Name="gLakeHyliaRestoredCs" Offset="0x55E0"/>
<Path Name="spot06_scenePathList_007764" Offset="0x7764" NumPaths="2"/>
<Scene Name="spot06_scene" Offset="0x0"/>
</File>
<File Name="spot06_room_0" Segment="3">

View file

@ -2,8 +2,11 @@
<File Name="spot06_scene" Segment="2">
<Cutscene Name="gLakeHyliaFireArrowsCS" Offset="0x7030"/>
<Cutscene Name="gLakeHyliaOwlCs" Offset="0x1B0D0"/>
<Path Name="spot06_scenePathList_007764" Offset="0x7774" NumPaths="2"/>
<Cutscene Name="gLakeHyliaIntroCs" Offset="0x7A40"/>
<Cutscene Name="gLakeHyliaCreditsCs" Offset="0x6E94"/>
<Cutscene Name="gLakeHyliaRestoredCs" Offset="0x55E0"/>
<Path Name="spot06_scenePathList_007764" Offset="0x7774" NumPaths="2"/>
<Scene Name="spot06_scene" Offset="0x0"/>
</File>
<File Name="spot06_room_0" Segment="3">

View file

@ -2,6 +2,11 @@
<File Name="spot16_scene" Segment="2">
<Cutscene Name="gDMTOwlCs" Offset="0x1E6A0"/>
<Cutscene Name="gDMTIntroCs" Offset="0x7EA0"/>
<Cutscene Name="gDMTKokiriEmeraldPart6Cs" Offset="0x3D40"/>
<Cutscene Name="gDMTGoronRubyCs" Offset="0x40B0"/>
<Cutscene Name="gDMTUnusedCs" Offset="0x63D0"/>
<Cutscene Name="gDMTCreditsSixSagesCs" Offset="0x66E0"/>
<Cutscene Name="gDMTCreditsShowGoronCityCs" Offset="0x6550"/>
<Path Name="spot16_scenePathList_000254" Offset="0x254" NumPaths="2"/>
<Path Name="spot16_scenePathList_007884" Offset="0x7884" NumPaths="3"/>
<Scene Name="spot16_scene" Offset="0x0"/>

View file

@ -2,6 +2,11 @@
<File Name="spot16_scene" Segment="2">
<Cutscene Name="gDMTOwlCs" Offset="0x1E6D0"/>
<Cutscene Name="gDMTIntroCs" Offset="0x7ED0"/>
<Cutscene Name="gDMTKokiriEmeraldPart6Cs" Offset="0x3D44"/>
<Cutscene Name="gDMTGoronRubyCs" Offset="0x40C0"/>
<Cutscene Name="gDMTUnusedCs" Offset="0x63E0"/>
<Cutscene Name="gDMTCreditsSixSagesCs" Offset="0x6704"/>
<Cutscene Name="gDMTCreditsShowGoronCityCs" Offset="0x6564"/>
<Path Name="spot16_scenePathList_000254" Offset="0x254" NumPaths="2"/>
<Path Name="spot16_scenePathList_007884" Offset="0x78B4" NumPaths="3"/>
<Scene Name="spot16_scene" Offset="0x0"/>

View file

@ -2,6 +2,11 @@
<File Name="spot16_scene" Segment="2">
<Cutscene Name="gDMTOwlCs" Offset="0x1E6A0"/>
<Cutscene Name="gDMTIntroCs" Offset="0x7EA0"/>
<Cutscene Name="gDMTKokiriEmeraldPart6Cs" Offset="0x3D40"/>
<Cutscene Name="gDMTGoronRubyCs" Offset="0x40B0"/>
<Cutscene Name="gDMTUnusedCs" Offset="0x63D0"/>
<Cutscene Name="gDMTCreditsSixSagesCs" Offset="0x66E0"/>
<Cutscene Name="gDMTCreditsShowGoronCityCs" Offset="0x6550"/>
<Path Name="spot16_scenePathList_000254" Offset="0x254" NumPaths="2"/>
<Path Name="spot16_scenePathList_007884" Offset="0x7884" NumPaths="3"/>
<Scene Name="spot16_scene" Offset="0x0"/>

View file

@ -0,0 +1,145 @@
<Root>
<File Name="nes_font_static" Segment="10">
<!-- The two-digit number after the prefix is the character's codepoint: the hexadecimal byte it corresponds to in the text data -->
<Texture Name="gMsgChar20SpaceTex" OutName="msg_char_20_space" Format="i4" Width="16" Height="16" Offset="0x0"/>
<Texture Name="gMsgChar21ExclamationMarkTex" OutName="msg_char_21_exclamation_mark" Format="i4" Width="16" Height="16" Offset="0x80"/>
<Texture Name="gMsgChar22QuotationMarkTex" OutName="msg_char_22_quotation_mark" Format="i4" Width="16" Height="16" Offset="0x100"/>
<Texture Name="gMsgChar23NumberSignTex" OutName="msg_char_23_number_sign" Format="i4" Width="16" Height="16" Offset="0x180"/>
<Texture Name="gMsgChar24DollarSignTex" OutName="msg_char_24_dollar_sign" Format="i4" Width="16" Height="16" Offset="0x200"/>
<Texture Name="gMsgChar25PercentSignTex" OutName="msg_char_25_percent_sign" Format="i4" Width="16" Height="16" Offset="0x280"/>
<Texture Name="gMsgChar26AmpersandTex" OutName="msg_char_26_ampersand" Format="i4" Width="16" Height="16" Offset="0x300"/>
<Texture Name="gMsgChar27ApostropheTex" OutName="msg_char_27_apostrophe" Format="i4" Width="16" Height="16" Offset="0x380"/>
<Texture Name="gMsgChar28LeftParenthesesTex" OutName="msg_char_28_left_parentheses" Format="i4" Width="16" Height="16" Offset="0x400"/>
<Texture Name="gMsgChar29RightParenthesesTex" OutName="msg_char_29_right_parentheses" Format="i4" Width="16" Height="16" Offset="0x480"/>
<Texture Name="gMsgChar2AAsteriskTex" OutName="msg_char_2a_asterisk" Format="i4" Width="16" Height="16" Offset="0x500"/>
<Texture Name="gMsgChar2BPlusSignTex" OutName="msg_char_2b_plus_sign" Format="i4" Width="16" Height="16" Offset="0x580"/>
<Texture Name="gMsgChar2CCommaTex" OutName="msg_char_2c_comma" Format="i4" Width="16" Height="16" Offset="0x600"/>
<Texture Name="gMsgChar2DHyphenMinusTex" OutName="msg_char_2d_hyphen_minus" Format="i4" Width="16" Height="16" Offset="0x680"/>
<Texture Name="gMsgChar2EFullStopTex" OutName="msg_char_2e_full_stop" Format="i4" Width="16" Height="16" Offset="0x700"/>
<Texture Name="gMsgChar2FSolidusTex" OutName="msg_char_2f_solidus" Format="i4" Width="16" Height="16" Offset="0x780"/>
<Texture Name="gMsgChar30Digit0Tex" OutName="msg_char_30_digit_0" Format="i4" Width="16" Height="16" Offset="0x800"/>
<Texture Name="gMsgChar31Digit1Tex" OutName="msg_char_31_digit_1" Format="i4" Width="16" Height="16" Offset="0x880"/>
<Texture Name="gMsgChar32Digit2Tex" OutName="msg_char_32_digit_2" Format="i4" Width="16" Height="16" Offset="0x900"/>
<Texture Name="gMsgChar33Digit3Tex" OutName="msg_char_33_digit_3" Format="i4" Width="16" Height="16" Offset="0x980"/>
<Texture Name="gMsgChar34Digit4Tex" OutName="msg_char_34_digit_4" Format="i4" Width="16" Height="16" Offset="0xA00"/>
<Texture Name="gMsgChar35Digit5Tex" OutName="msg_char_35_digit_5" Format="i4" Width="16" Height="16" Offset="0xA80"/>
<Texture Name="gMsgChar36Digit6Tex" OutName="msg_char_36_digit_6" Format="i4" Width="16" Height="16" Offset="0xB00"/>
<Texture Name="gMsgChar37Digit7Tex" OutName="msg_char_37_digit_7" Format="i4" Width="16" Height="16" Offset="0xB80"/>
<Texture Name="gMsgChar38Digit8Tex" OutName="msg_char_38_digit_8" Format="i4" Width="16" Height="16" Offset="0xC00"/>
<Texture Name="gMsgChar39Digit9Tex" OutName="msg_char_39_digit_9" Format="i4" Width="16" Height="16" Offset="0xC80"/>
<Texture Name="gMsgChar3AColonTex" OutName="msg_char_3a_colon" Format="i4" Width="16" Height="16" Offset="0xD00"/>
<Texture Name="gMsgChar3BSemicolonTex" OutName="msg_char_3b_semicolon" Format="i4" Width="16" Height="16" Offset="0xD80"/>
<Texture Name="gMsgChar3CLessThanSignTex" OutName="msg_char_3c_less_than_sign" Format="i4" Width="16" Height="16" Offset="0xE00"/>
<Texture Name="gMsgChar3DEqualsSignTex" OutName="msg_char_3d_equals_sign" Format="i4" Width="16" Height="16" Offset="0xE80"/>
<Texture Name="gMsgChar3EGreaterThanSignTex" OutName="msg_char_3e_greater_than_sign" Format="i4" Width="16" Height="16" Offset="0xF00"/>
<Texture Name="gMsgChar3FQuestionMarkTex" OutName="msg_char_3f_question_mark" Format="i4" Width="16" Height="16" Offset="0xF80"/>
<Texture Name="gMsgChar40CommercialAtTex" OutName="msg_char_40_commercial_at" Format="i4" Width="16" Height="16" Offset="0x1000"/>
<Texture Name="gMsgChar41LatinCapitalLetterATex" OutName="msg_char_41_latin_capital_letter_a" Format="i4" Width="16" Height="16" Offset="0x1080"/>
<Texture Name="gMsgChar42LatinCapitalLetterBTex" OutName="msg_char_42_latin_capital_letter_b" Format="i4" Width="16" Height="16" Offset="0x1100"/>
<Texture Name="gMsgChar43LatinCapitalLetterCTex" OutName="msg_char_43_latin_capital_letter_c" Format="i4" Width="16" Height="16" Offset="0x1180"/>
<Texture Name="gMsgChar44LatinCapitalLetterDTex" OutName="msg_char_44_latin_capital_letter_d" Format="i4" Width="16" Height="16" Offset="0x1200"/>
<Texture Name="gMsgChar45LatinCapitalLetterETex" OutName="msg_char_45_latin_capital_letter_e" Format="i4" Width="16" Height="16" Offset="0x1280"/>
<Texture Name="gMsgChar46LatinCapitalLetterFTex" OutName="msg_char_46_latin_capital_letter_f" Format="i4" Width="16" Height="16" Offset="0x1300"/>
<Texture Name="gMsgChar47LatinCapitalLetterGTex" OutName="msg_char_47_latin_capital_letter_g" Format="i4" Width="16" Height="16" Offset="0x1380"/>
<Texture Name="gMsgChar48LatinCapitalLetterHTex" OutName="msg_char_48_latin_capital_letter_h" Format="i4" Width="16" Height="16" Offset="0x1400"/>
<Texture Name="gMsgChar49LatinCapitalLetterITex" OutName="msg_char_49_latin_capital_letter_i" Format="i4" Width="16" Height="16" Offset="0x1480"/>
<Texture Name="gMsgChar4ALatinCapitalLetterJTex" OutName="msg_char_4a_latin_capital_letter_j" Format="i4" Width="16" Height="16" Offset="0x1500"/>
<Texture Name="gMsgChar4BLatinCapitalLetterKTex" OutName="msg_char_4b_latin_capital_letter_k" Format="i4" Width="16" Height="16" Offset="0x1580"/>
<Texture Name="gMsgChar4CLatinCapitalLetterLTex" OutName="msg_char_4c_latin_capital_letter_l" Format="i4" Width="16" Height="16" Offset="0x1600"/>
<Texture Name="gMsgChar4DLatinCapitalLetterMTex" OutName="msg_char_4d_latin_capital_letter_m" Format="i4" Width="16" Height="16" Offset="0x1680"/>
<Texture Name="gMsgChar4ELatinCapitalLetterNTex" OutName="msg_char_4e_latin_capital_letter_n" Format="i4" Width="16" Height="16" Offset="0x1700"/>
<Texture Name="gMsgChar4FLatinCapitalLetterOTex" OutName="msg_char_4f_latin_capital_letter_o" Format="i4" Width="16" Height="16" Offset="0x1780"/>
<Texture Name="gMsgChar50LatinCapitalLetterPTex" OutName="msg_char_50_latin_capital_letter_p" Format="i4" Width="16" Height="16" Offset="0x1800"/>
<Texture Name="gMsgChar51LatinCapitalLetterQTex" OutName="msg_char_51_latin_capital_letter_q" Format="i4" Width="16" Height="16" Offset="0x1880"/>
<Texture Name="gMsgChar52LatinCapitalLetterRTex" OutName="msg_char_52_latin_capital_letter_r" Format="i4" Width="16" Height="16" Offset="0x1900"/>
<Texture Name="gMsgChar53LatinCapitalLetterSTex" OutName="msg_char_53_latin_capital_letter_s" Format="i4" Width="16" Height="16" Offset="0x1980"/>
<Texture Name="gMsgChar54LatinCapitalLetterTTex" OutName="msg_char_54_latin_capital_letter_t" Format="i4" Width="16" Height="16" Offset="0x1A00"/>
<Texture Name="gMsgChar55LatinCapitalLetterUTex" OutName="msg_char_55_latin_capital_letter_u" Format="i4" Width="16" Height="16" Offset="0x1A80"/>
<Texture Name="gMsgChar56LatinCapitalLetterVTex" OutName="msg_char_56_latin_capital_letter_v" Format="i4" Width="16" Height="16" Offset="0x1B00"/>
<Texture Name="gMsgChar57LatinCapitalLetterWTex" OutName="msg_char_57_latin_capital_letter_w" Format="i4" Width="16" Height="16" Offset="0x1B80"/>
<Texture Name="gMsgChar58LatinCapitalLetterXTex" OutName="msg_char_58_latin_capital_letter_x" Format="i4" Width="16" Height="16" Offset="0x1C00"/>
<Texture Name="gMsgChar59LatinCapitalLetterYTex" OutName="msg_char_59_latin_capital_letter_y" Format="i4" Width="16" Height="16" Offset="0x1C80"/>
<Texture Name="gMsgChar5ALatinCapitalLetterZTex" OutName="msg_char_5a_latin_capital_letter_z" Format="i4" Width="16" Height="16" Offset="0x1D00"/>
<Texture Name="gMsgChar5BLeftSquareBracketTex" OutName="msg_char_5b_left_square_bracket" Format="i4" Width="16" Height="16" Offset="0x1D80"/>
<Texture Name="gMsgChar5CYenSignTex" OutName="msg_char_5c_yen_sign" Format="i4" Width="16" Height="16" Offset="0x1E00"/>
<Texture Name="gMsgChar5DRightSquareBracketTex" OutName="msg_char_5d_right_square_bracket" Format="i4" Width="16" Height="16" Offset="0x1E80"/>
<Texture Name="gMsgChar5ECircumflexAccentTex" OutName="msg_char_5e_circumflex_accent" Format="i4" Width="16" Height="16" Offset="0x1F00"/>
<Texture Name="gMsgChar5FLowLineTex" OutName="msg_char_5f_low_line" Format="i4" Width="16" Height="16" Offset="0x1F80"/>
<Texture Name="gMsgChar60GraveAccentTex" OutName="msg_char_60_grave_accent" Format="i4" Width="16" Height="16" Offset="0x2000"/>
<Texture Name="gMsgChar61LatinSmallLetterATex" OutName="msg_char_61_latin_small_letter_a" Format="i4" Width="16" Height="16" Offset="0x2080"/>
<Texture Name="gMsgChar62LatinSmallLetterBTex" OutName="msg_char_62_latin_small_letter_b" Format="i4" Width="16" Height="16" Offset="0x2100"/>
<Texture Name="gMsgChar63LatinSmallLetterCTex" OutName="msg_char_63_latin_small_letter_c" Format="i4" Width="16" Height="16" Offset="0x2180"/>
<Texture Name="gMsgChar64LatinSmallLetterDTex" OutName="msg_char_64_latin_small_letter_d" Format="i4" Width="16" Height="16" Offset="0x2200"/>
<Texture Name="gMsgChar65LatinSmallLetterETex" OutName="msg_char_65_latin_small_letter_e" Format="i4" Width="16" Height="16" Offset="0x2280"/>
<Texture Name="gMsgChar66LatinSmallLetterFTex" OutName="msg_char_66_latin_small_letter_f" Format="i4" Width="16" Height="16" Offset="0x2300"/>
<Texture Name="gMsgChar67LatinSmallLetterGTex" OutName="msg_char_67_latin_small_letter_g" Format="i4" Width="16" Height="16" Offset="0x2380"/>
<Texture Name="gMsgChar68LatinSmallLetterHTex" OutName="msg_char_68_latin_small_letter_h" Format="i4" Width="16" Height="16" Offset="0x2400"/>
<Texture Name="gMsgChar69LatinSmallLetterITex" OutName="msg_char_69_latin_small_letter_i" Format="i4" Width="16" Height="16" Offset="0x2480"/>
<Texture Name="gMsgChar6ALatinSmallLetterJTex" OutName="msg_char_6a_latin_small_letter_j" Format="i4" Width="16" Height="16" Offset="0x2500"/>
<Texture Name="gMsgChar6BLatinSmallLetterKTex" OutName="msg_char_6b_latin_small_letter_k" Format="i4" Width="16" Height="16" Offset="0x2580"/>
<Texture Name="gMsgChar6CLatinSmallLetterLTex" OutName="msg_char_6c_latin_small_letter_l" Format="i4" Width="16" Height="16" Offset="0x2600"/>
<Texture Name="gMsgChar6DLatinSmallLetterMTex" OutName="msg_char_6d_latin_small_letter_m" Format="i4" Width="16" Height="16" Offset="0x2680"/>
<Texture Name="gMsgChar6ELatinSmallLetterNTex" OutName="msg_char_6e_latin_small_letter_n" Format="i4" Width="16" Height="16" Offset="0x2700"/>
<Texture Name="gMsgChar6FLatinSmallLetterOTex" OutName="msg_char_6f_latin_small_letter_o" Format="i4" Width="16" Height="16" Offset="0x2780"/>
<Texture Name="gMsgChar70LatinSmallLetterPTex" OutName="msg_char_70_latin_small_letter_p" Format="i4" Width="16" Height="16" Offset="0x2800"/>
<Texture Name="gMsgChar71LatinSmallLetterQTex" OutName="msg_char_71_latin_small_letter_q" Format="i4" Width="16" Height="16" Offset="0x2880"/>
<Texture Name="gMsgChar72LatinSmallLetterRTex" OutName="msg_char_72_latin_small_letter_r" Format="i4" Width="16" Height="16" Offset="0x2900"/>
<Texture Name="gMsgChar73LatinSmallLetterSTex" OutName="msg_char_73_latin_small_letter_s" Format="i4" Width="16" Height="16" Offset="0x2980"/>
<Texture Name="gMsgChar74LatinSmallLetterTTex" OutName="msg_char_74_latin_small_letter_t" Format="i4" Width="16" Height="16" Offset="0x2A00"/>
<Texture Name="gMsgChar75LatinSmallLetterUTex" OutName="msg_char_75_latin_small_letter_u" Format="i4" Width="16" Height="16" Offset="0x2A80"/>
<Texture Name="gMsgChar76LatinSmallLetterVTex" OutName="msg_char_76_latin_small_letter_v" Format="i4" Width="16" Height="16" Offset="0x2B00"/>
<Texture Name="gMsgChar77LatinSmallLetterWTex" OutName="msg_char_77_latin_small_letter_w" Format="i4" Width="16" Height="16" Offset="0x2B80"/>
<Texture Name="gMsgChar78LatinSmallLetterXTex" OutName="msg_char_78_latin_small_letter_x" Format="i4" Width="16" Height="16" Offset="0x2C00"/>
<Texture Name="gMsgChar79LatinSmallLetterYTex" OutName="msg_char_79_latin_small_letter_y" Format="i4" Width="16" Height="16" Offset="0x2C80"/>
<Texture Name="gMsgChar7ALatinSmallLetterZTex" OutName="msg_char_7a_latin_small_letter_z" Format="i4" Width="16" Height="16" Offset="0x2D00"/>
<Texture Name="gMsgChar7BLeftCurlyBracketTex" OutName="msg_char_7b_left_curly_bracket" Format="i4" Width="16" Height="16" Offset="0x2D80"/>
<Texture Name="gMsgChar7CVerticalLineTex" OutName="msg_char_7c_vertical_line" Format="i4" Width="16" Height="16" Offset="0x2E00"/>
<Texture Name="gMsgChar7DRightCurlyBracketTex" OutName="msg_char_7d_right_curly_bracket" Format="i4" Width="16" Height="16" Offset="0x2E80"/>
<Texture Name="gMsgChar7ETildeTex" OutName="msg_char_7e_tilde" Format="i4" Width="16" Height="16" Offset="0x2F00"/>
<Texture Name="gMsgChar7FBlankTex" OutName="msg_char_7f_blank" Format="i4" Width="16" Height="16" Offset="0x2F80"/>
<Texture Name="gMsgChar80LatinCapitalLetterAWithGraveTex" OutName="msg_char_80_latin_capital_letter_a_with_grave" Format="i4" Width="16" Height="16" Offset="0x3000"/>
<Texture Name="gMsgChar81LatinCapitalLetterIWithCircumflexTex" OutName="msg_char_81_latin_capital_letter_i_with_circumflex" Format="i4" Width="16" Height="16" Offset="0x3080"/>
<Texture Name="gMsgChar82LatinCapitalLetterAWithCircumflexTex" OutName="msg_char_82_latin_capital_letter_a_with_circumflex" Format="i4" Width="16" Height="16" Offset="0x3100"/>
<Texture Name="gMsgChar83LatinCapitalLetterAWithDiaeresisTex" OutName="msg_char_83_latin_capital_letter_a_with_diaeresis" Format="i4" Width="16" Height="16" Offset="0x3180"/>
<Texture Name="gMsgChar84LatinCapitalLetterCWithCedillaTex" OutName="msg_char_84_latin_capital_letter_c_with_cedilla" Format="i4" Width="16" Height="16" Offset="0x3200"/>
<Texture Name="gMsgChar85LatinCapitalLetterEWithGraveTex" OutName="msg_char_85_latin_capital_letter_e_with_grave" Format="i4" Width="16" Height="16" Offset="0x3280"/>
<Texture Name="gMsgChar86LatinCapitalLetterEWithAcuteTex" OutName="msg_char_86_latin_capital_letter_e_with_acute" Format="i4" Width="16" Height="16" Offset="0x3300"/>
<Texture Name="gMsgChar87LatinCapitalLetterEWithCircumflexTex" OutName="msg_char_87_latin_capital_letter_e_with_circumflex" Format="i4" Width="16" Height="16" Offset="0x3380"/>
<Texture Name="gMsgChar88LatinCapitalLetterEWithDiaeresisTex" OutName="msg_char_88_latin_capital_letter_e_with_diaeresis" Format="i4" Width="16" Height="16" Offset="0x3400"/>
<Texture Name="gMsgChar89LatinCapitalLetterIWithDiaeresisTex" OutName="msg_char_89_latin_capital_letter_i_with_diaeresis" Format="i4" Width="16" Height="16" Offset="0x3480"/>
<Texture Name="gMsgChar8ALatinCapitalLetterOWithCircumflexTex" OutName="msg_char_8a_latin_capital_letter_o_with_circumflex" Format="i4" Width="16" Height="16" Offset="0x3500"/>
<Texture Name="gMsgChar8BLatinCapitalLetterOWithDiaeresisTex" OutName="msg_char_8b_latin_capital_letter_o_with_diaeresis" Format="i4" Width="16" Height="16" Offset="0x3580"/>
<Texture Name="gMsgChar8CLatinCapitalLetterUWithGraveTex" OutName="msg_char_8c_latin_capital_letter_u_with_grave" Format="i4" Width="16" Height="16" Offset="0x3600"/>
<Texture Name="gMsgChar8DLatinCapitalLetterUWithCircumflexTex" OutName="msg_char_8d_latin_capital_letter_u_with_circumflex" Format="i4" Width="16" Height="16" Offset="0x3680"/>
<Texture Name="gMsgChar8ELatinCapitalLetterUWithDiaeresisTex" OutName="msg_char_8e_latin_capital_letter_u_with_diaeresis" Format="i4" Width="16" Height="16" Offset="0x3700"/>
<Texture Name="gMsgChar8FLatinSmallLetterSharpSTex" OutName="msg_char_8f_latin_small_letter_sharp_s" Format="i4" Width="16" Height="16" Offset="0x3780"/>
<Texture Name="gMsgChar90LatinSmallLetterAWithGraveTex" OutName="msg_char_90_latin_small_letter_a_with_grave" Format="i4" Width="16" Height="16" Offset="0x3800"/>
<Texture Name="gMsgChar91LatinSmallLetterAWithAcuteTex" OutName="msg_char_91_latin_small_letter_a_with_acute" Format="i4" Width="16" Height="16" Offset="0x3880"/>
<Texture Name="gMsgChar92LatinSmallLetterAWithCircumflexTex" OutName="msg_char_92_latin_small_letter_a_with_circumflex" Format="i4" Width="16" Height="16" Offset="0x3900"/>
<Texture Name="gMsgChar93LatinSmallLetterAWithDiaeresisTex" OutName="msg_char_93_latin_small_letter_a_with_diaeresis" Format="i4" Width="16" Height="16" Offset="0x3980"/>
<Texture Name="gMsgChar94LatinSmallLetterCWithCedillaTex" OutName="msg_char_94_latin_small_letter_c_with_cedilla" Format="i4" Width="16" Height="16" Offset="0x3A00"/>
<Texture Name="gMsgChar95LatinSmallLetterEWithGraveTex" OutName="msg_char_95_latin_small_letter_e_with_grave" Format="i4" Width="16" Height="16" Offset="0x3A80"/>
<Texture Name="gMsgChar96LatinSmallLetterEWithAcuteTex" OutName="msg_char_96_latin_small_letter_e_with_acute" Format="i4" Width="16" Height="16" Offset="0x3B00"/>
<Texture Name="gMsgChar97LatinSmallLetterEWithCircumflexTex" OutName="msg_char_97_latin_small_letter_e_with_circumflex" Format="i4" Width="16" Height="16" Offset="0x3B80"/>
<Texture Name="gMsgChar98LatinSmallLetterEWithDiaeresisTex" OutName="msg_char_98_latin_small_letter_e_with_diaeresis" Format="i4" Width="16" Height="16" Offset="0x3C00"/>
<Texture Name="gMsgChar99LatinSmallLetterIWithDiaeresisTex" OutName="msg_char_99_latin_small_letter_i_with_diaeresis" Format="i4" Width="16" Height="16" Offset="0x3C80"/>
<Texture Name="gMsgChar9ALatinSmallLetterOWithCircumflexTex" OutName="msg_char_9a_latin_small_letter_o_with_circumflex" Format="i4" Width="16" Height="16" Offset="0x3D00"/>
<Texture Name="gMsgChar9BLatinSmallLetterOWithDiaeresisTex" OutName="msg_char_9b_latin_small_letter_o_with_diaeresis" Format="i4" Width="16" Height="16" Offset="0x3D80"/>
<Texture Name="gMsgChar9CLatinSmallLetterUWithGraveTex" OutName="msg_char_9c_latin_small_letter_u_with_grave" Format="i4" Width="16" Height="16" Offset="0x3E00"/>
<Texture Name="gMsgChar9DLatinSmallLetterUWithCircumflexTex" OutName="msg_char_9d_latin_small_letter_u_with_circumflex" Format="i4" Width="16" Height="16" Offset="0x3E80"/>
<Texture Name="gMsgChar9ELatinSmallLetterUWithDiaeresisTex" OutName="msg_char_9e_latin_small_letter_u_with_diaeresis" Format="i4" Width="16" Height="16" Offset="0x3F00"/>
<Texture Name="gMsgChar9FButtonATex" OutName="msg_char_9f_button_a" Format="i4" Width="16" Height="16" Offset="0x3F80"/>
<Texture Name="gMsgCharA0ButtonBTex" OutName="msg_char_a0_button_b" Format="i4" Width="16" Height="16" Offset="0x4000"/>
<Texture Name="gMsgCharA1ButtonCTex" OutName="msg_char_a1_button_c" Format="i4" Width="16" Height="16" Offset="0x4080"/>
<Texture Name="gMsgCharA2ButtonLTex" OutName="msg_char_a2_button_l" Format="i4" Width="16" Height="16" Offset="0x4100"/>
<Texture Name="gMsgCharA3ButtonRTex" OutName="msg_char_a3_button_r" Format="i4" Width="16" Height="16" Offset="0x4180"/>
<Texture Name="gMsgCharA4ButtonZTex" OutName="msg_char_a4_button_z" Format="i4" Width="16" Height="16" Offset="0x4200"/>
<Texture Name="gMsgCharA5ButtonCUpTex" OutName="msg_char_a5_button_c_up" Format="i4" Width="16" Height="16" Offset="0x4280"/>
<Texture Name="gMsgCharA6ButtonCDownTex" OutName="msg_char_a6_button_c_down" Format="i4" Width="16" Height="16" Offset="0x4300"/>
<Texture Name="gMsgCharA7ButtonCLeftTex" OutName="msg_char_a7_button_c_left" Format="i4" Width="16" Height="16" Offset="0x4380"/>
<Texture Name="gMsgCharA8ButtonCRightTex" OutName="msg_char_a8_button_c_right" Format="i4" Width="16" Height="16" Offset="0x4400"/>
<Texture Name="gMsgCharA9ZTargetSignTex" OutName="msg_char_a9_z_target_sign" Format="i4" Width="16" Height="16" Offset="0x4480"/>
<Texture Name="gMsgCharAAControlStickTex" OutName="msg_char_aa_control_stick" Format="i4" Width="16" Height="16" Offset="0x4500"/>
<!-- TODO: Chinese characters -->
</File>
</Root>

View file

@ -1,5 +1,5 @@
dmadata_start: 0x12F70
text_lang_pal: true
text_lang: PAL
incbins:
- name: ipl3
segment: makerom

View file

@ -1,5 +1,5 @@
dmadata_start: 0x7170
text_lang_pal: true
text_lang: PAL
incbins:
- name: ipl3
segment: makerom

View file

@ -1,5 +1,5 @@
dmadata_start: 0x7170
text_lang_pal: true
text_lang: PAL
incbins:
- name: ipl3
segment: makerom

View file

@ -1,5 +1,5 @@
dmadata_start: 0x7170
text_lang_pal: false
text_lang: NTSC
incbins:
- name: ipl3
segment: makerom

View file

@ -1,5 +1,5 @@
dmadata_start: 0x7170
text_lang_pal: false
text_lang: NTSC
incbins:
- name: ipl3
segment: makerom

View file

@ -1,5 +1,5 @@
dmadata_start: 0x7170
text_lang_pal: false
text_lang: NTSC
incbins:
- name: ipl3
segment: makerom

View file

@ -1,5 +1,5 @@
dmadata_start: 0x7170
text_lang_pal: false
text_lang: NTSC
incbins:
- name: ipl3
segment: makerom

View file

@ -1,5 +1,5 @@
dmadata_start: 0x7170
text_lang_pal: false
text_lang: NTSC
incbins:
- name: ipl3
segment: makerom

View file

@ -0,0 +1 @@
0ab48b2d44a74b3bb2d384f6170c2742 build/ique-cn/oot-ique-cn-compressed.z64

View file

@ -0,0 +1 @@
17a9f30d722c29e6912bd4b66713d2b0 build/ique-cn/oot-ique-cn.z64

1212
baseroms/ique-cn/config.yml Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -2,7 +2,7 @@ checksums:
- checksum-JP
- checksum-US
dmadata_start: 0x7430
text_lang_pal: false
text_lang: NTSC
incbins:
- name: ipl3
segment: makerom

View file

@ -2,7 +2,7 @@ checksums:
- checksum-JP
- checksum-US
dmadata_start: 0x7430
text_lang_pal: false
text_lang: NTSC
incbins:
- name: ipl3
segment: makerom

View file

@ -2,7 +2,7 @@ checksums:
- checksum-JP
- checksum-US
dmadata_start: 0x7960
text_lang_pal: false
text_lang: NTSC
incbins:
- name: ipl3
segment: makerom

View file

@ -1,5 +1,5 @@
dmadata_start: 0x7950
text_lang_pal: true
text_lang: PAL
incbins:
- name: ipl3
segment: makerom

View file

@ -1,5 +1,5 @@
dmadata_start: 0x7950
text_lang_pal: true
text_lang: PAL
incbins:
- name: ipl3
segment: makerom

View file

@ -1,11 +1,8 @@
version: "3"
services:
oot:
build:
dockerfile: Dockerfile
volumes:
- oot-sync:/oot:nocopy
image: "oot:latest"
- ./:/oot
tty: true
volumes:
oot-sync:
external: true
stdin_open: true

View file

@ -6,22 +6,20 @@ To use Docker, you'll need either Docker Desktop or Docker Toolbox installed and
You'll also need to prepare a local version of the project with a copied base ROM (see steps [2](../README.md#2-clone-the-repository) and [3](../README.md#3-prepare-a-base-rom) of the Linux instructions).
## 2. Create the Docker image
## 2. Create and start the Docker image build
From inside your local project, run the following command:
From the root of your local project, run the following command:
```bash
docker build . -t oot
docker-compose up --build
```
## 3. Start the container
This should immediately begin steps [4](../README.md#4-setup-the-rom-and-build-process) and [5](../README.md#5-build-the-rom) within the Docker container.
To start the container, you can mount your local filesystem into the Docker container and run an interactive bash session.
## 3. Shell into the 'oot' container
To exec into the oot Docker image at any time, run the following command either during or after the build:
```bash
docker run -it --rm --mount type=bind,source="$(pwd)",destination=/oot oot /bin/bash
docker-compose exec oot bash
```
## 4. Setup and Build the ROM
Once inside the container, you can follow steps [4](../README.md#4-setup-the-rom-and-build-process) and [5](../README.md#5-build-the-rom) of the Linux instructions to setup and build the ROM, or run any other command you need.

View file

@ -14,12 +14,13 @@ For macOS, use Homebrew to install the following dependencies:
* bash
* clang-format
* libxml2
* libiconv
You can install them with the following commands:
```bash
brew update
brew install coreutils make python3 libpng bash clang-format libxml2
brew install coreutils make python3 libpng bash clang-format libxml2 libiconv
```
(The repository expects Homebrew-installed programs to be either linked correctly in `$PATH` etc. or in their default locations.)
@ -64,9 +65,9 @@ make -j
sudo make install
```
Edit your `~/.bash_profile`/`~/.zsh_profile` (or whichever shell you use) to add the new binutils binaries to the system PATH
Edit your `~/.bash_profile`/`~/.zprofile` (or whichever shell you use) to add the new binutils binaries to the system PATH
```bash
echo "export PATH=$PATH:/opt/cross/bin" >> ~/.bash_profile
echo 'export PATH="$PATH:/opt/cross/bin"' >> ~/.bash_profile
```
Reload `~/.bash_profile` (or just launch a new terminal tab)

View file

@ -5,7 +5,7 @@
#include "attributes.h"
#include "padmgr.h"
#if PLATFORM_GC
#if !PLATFORM_N64
// These are the same as the 3-bit ansi color codes
#define FAULT_COLOR_BLACK 0
#define FAULT_COLOR_RED 1
@ -33,7 +33,7 @@ typedef struct FaultClient {
/* 0x0C */ void* arg1;
} FaultClient; // size = 0x10
#if PLATFORM_GC
#if !PLATFORM_N64
typedef struct FaultAddrConvClient {
/* 0x00 */ struct FaultAddrConvClient* next;
/* 0x04 */ void* callback;
@ -78,7 +78,7 @@ void func_800AE1F8(void);
#define Fault_SetFontColor(color) (void)0
#define Fault_SetCharPad(padW, padH) (void)0
#elif PLATFORM_GC
#else
void Fault_InitDrawer(void);
void Fault_SetForeColor(u16 color);
@ -98,7 +98,7 @@ extern volatile OSThread* gFaultFaultedThread;
#define FAULT_MSG_ID gFaultMsgId
#elif PLATFORM_GC
#else
typedef struct FaultMgr {
/* 0x000 */ OSThread thread;

View file

@ -71,13 +71,6 @@ void CutsceneFlags_UnsetAll(PlayState* play);
void CutsceneFlags_Set(PlayState* play, s16 flag);
void CutsceneFlags_Unset(PlayState* play, s16 flag);
s32 CutsceneFlags_Get(PlayState* play, s16 flag);
s32 func_8006CFC0(s32 sceneId);
void func_8006D074(PlayState* play);
void func_8006D0AC(PlayState* play);
void func_8006D0EC(PlayState* play, Player* player);
void func_8006D684(PlayState* play, Player* player);
void func_8006DC68(PlayState* play, Player* player);
void func_8006DD9C(Actor* actor, Vec3f* arg1, s16 arg2);
s32 Kanji_OffsetFromShiftJIS(s32 character);
void Font_LoadCharWide(Font* font, u16 character, u16 codePointIndex);

View file

@ -11,7 +11,7 @@ typedef struct Arena {
#if PLATFORM_N64
/* 0x08 */ u32 size;
/* 0x0C */ u8 allocFailures;
#elif PLATFORM_GC
#else
/* 0x08 */ OSMesgQueue lockQueue;
/* 0x20 */ u8 allocFailures; // only used in non-debug builds
/* 0x21 */ u8 isInit;

67
include/line_numbers.h Normal file
View file

@ -0,0 +1,67 @@
#ifndef LINE_NUMBERS_H
#define LINE_NUMBERS_H
// The macros in this file serve to reduce clutter from version differences that are only due to line numbers being different.
// The "LN" macros defined here are not meant to be used directly. See the wrapper macros below.
#if OOT_VERSION == NTSC_1_0
#define LN(ntsc_1_0, ntsc_1_1, pal_1_0, ntsc_1_2, pal_1_1, gc_jp, gc_jp_mq, gc_us, gc_us_mq, gc_eu_mq_dbg, gc_eu, gc_eu_mq, gc_jp_ce, ique_cn) (ntsc_1_0)
#elif OOT_VERSION == NTSC_1_1
#define LN(ntsc_1_0, ntsc_1_1, pal_1_0, ntsc_1_2, pal_1_1, gc_jp, gc_jp_mq, gc_us, gc_us_mq, gc_eu_mq_dbg, gc_eu, gc_eu_mq, gc_jp_ce, ique_cn) (ntsc_1_1)
#elif OOT_VERSION == PAL_1_0
#define LN(ntsc_1_0, ntsc_1_1, pal_1_0, ntsc_1_2, pal_1_1, gc_jp, gc_jp_mq, gc_us, gc_us_mq, gc_eu_mq_dbg, gc_eu, gc_eu_mq, gc_jp_ce, ique_cn) (pal_1_0)
#elif OOT_VERSION == NTSC_1_2
#define LN(ntsc_1_0, ntsc_1_1, pal_1_0, ntsc_1_2, pal_1_1, gc_jp, gc_jp_mq, gc_us, gc_us_mq, gc_eu_mq_dbg, gc_eu, gc_eu_mq, gc_jp_ce, ique_cn) (ntsc_1_2)
#elif OOT_VERSION == PAL_1_1
#define LN(ntsc_1_0, ntsc_1_1, pal_1_0, ntsc_1_2, pal_1_1, gc_jp, gc_jp_mq, gc_us, gc_us_mq, gc_eu_mq_dbg, gc_eu, gc_eu_mq, gc_jp_ce, ique_cn) (pal_1_1)
#elif OOT_VERSION == GC_JP
#define LN(ntsc_1_0, ntsc_1_1, pal_1_0, ntsc_1_2, pal_1_1, gc_jp, gc_jp_mq, gc_us, gc_us_mq, gc_eu_mq_dbg, gc_eu, gc_eu_mq, gc_jp_ce, ique_cn) (gc_jp)
#elif OOT_VERSION == GC_JP_MQ
#define LN(ntsc_1_0, ntsc_1_1, pal_1_0, ntsc_1_2, pal_1_1, gc_jp, gc_jp_mq, gc_us, gc_us_mq, gc_eu_mq_dbg, gc_eu, gc_eu_mq, gc_jp_ce, ique_cn) (gc_jp_mq)
#elif OOT_VERSION == GC_US
#define LN(ntsc_1_0, ntsc_1_1, pal_1_0, ntsc_1_2, pal_1_1, gc_jp, gc_jp_mq, gc_us, gc_us_mq, gc_eu_mq_dbg, gc_eu, gc_eu_mq, gc_jp_ce, ique_cn) (gc_us)
#elif OOT_VERSION == GC_US_MQ
#define LN(ntsc_1_0, ntsc_1_1, pal_1_0, ntsc_1_2, pal_1_1, gc_jp, gc_jp_mq, gc_us, gc_us_mq, gc_eu_mq_dbg, gc_eu, gc_eu_mq, gc_jp_ce, ique_cn) (gc_us_mq)
#elif OOT_VERSION == GC_EU_MQ_DBG
#define LN(ntsc_1_0, ntsc_1_1, pal_1_0, ntsc_1_2, pal_1_1, gc_jp, gc_jp_mq, gc_us, gc_us_mq, gc_eu_mq_dbg, gc_eu, gc_eu_mq, gc_jp_ce, ique_cn) (gc_eu_mq_dbg)
#elif OOT_VERSION == GC_EU
#define LN(ntsc_1_0, ntsc_1_1, pal_1_0, ntsc_1_2, pal_1_1, gc_jp, gc_jp_mq, gc_us, gc_us_mq, gc_eu_mq_dbg, gc_eu, gc_eu_mq, gc_jp_ce, ique_cn) (gc_eu)
#elif OOT_VERSION == GC_EU_MQ
#define LN(ntsc_1_0, ntsc_1_1, pal_1_0, ntsc_1_2, pal_1_1, gc_jp, gc_jp_mq, gc_us, gc_us_mq, gc_eu_mq_dbg, gc_eu, gc_eu_mq, gc_jp_ce, ique_cn) (gc_eu_mq)
#elif OOT_VERSION == GC_JP_CE
#define LN(ntsc_1_0, ntsc_1_1, pal_1_0, ntsc_1_2, pal_1_1, gc_jp, gc_jp_mq, gc_us, gc_us_mq, gc_eu_mq_dbg, gc_eu, gc_eu_mq, gc_jp_ce, ique_cn) (gc_jp_ce)
#elif OOT_VERSION == IQUE_CN
#define LN(ntsc_1_0, ntsc_1_1, pal_1_0, ntsc_1_2, pal_1_1, gc_jp, gc_jp_mq, gc_us, gc_us_mq, gc_eu_mq_dbg, gc_eu, gc_eu_mq, gc_jp_ce, ique_cn) (ique_cn)
#else
#error "Unsupported OOT version"
#endif
/**
* These wrappers exist to remove duplication of line numbers being passed to LN.
* The wrappers have ambiguous names purposefully so they are short and don't add clutter.
*
* The groupings of different line numbers are difficult to name, as the exact grouping
* depends on which versions happen to have changes in a given file.
*/
// NTSC 1.0 and all the other versions
#define LN1(ntsc_1_0, other) \
LN(ntsc_1_0, other, other, other, other, other, other, other, other, other, other, other, other, other)
// NTSC 1.0, NTSC 1.1, and all the other versions
#define LN2(ntsc_1_0, ntsc_1_1, other) \
LN(ntsc_1_0, ntsc_1_1, other, other, other, other, other, other, other, other, other, other, other, other)
// NTSC 1.0, Gamecube, and all the other versions
#define LN3(ntsc_1_0, other, gc) \
LN(ntsc_1_0, other, other, other, other, gc, gc, gc, gc, gc, gc, gc, gc, gc)
// NTSC 1.0, NTSC 1.1, Gamecube, and all the other versions
#define LN4(ntsc_1_0, ntsc_1_1, other, gc) \
LN(ntsc_1_0, ntsc_1_1, other, other, other, gc, gc, gc, gc, gc, gc, gc, gc, gc)
// NTSC 1.0, NTSC 1.1, NTSC 1.2/PAL 1.0, Gamecube US/JP, Gamecube EU, and Gamecube CE
#define LN5(ntsc_1_0, ntsc_1_1, other, pal_1_1, gc_ntsc, gc_eu, gc_jp_ce) \
LN(ntsc_1_0, ntsc_1_1, other, other, pal_1_1, gc_ntsc, gc_ntsc, gc_ntsc, gc_ntsc, gc_eu, gc_eu, gc_eu, gc_jp_ce, gc_jp_ce)
#endif

View file

@ -118,6 +118,8 @@
#define R_MESSAGE_DEBUGGER_TEXTID YREG(79)
#define R_C_UP_ICON_X YREG(88)
#define R_C_UP_ICON_Y YREG(89)
#define R_EXITED_SCENE_RIDING_HORSE AREG(6) // Used to spawn the player on top of Epona in the next scene
#define R_DEBUG_FORCE_EPONA_OBTAINED DREG(1) // If set, overrides EVENTCHKINF_EPONA_OBTAINED state giving Epona
#define R_EPONAS_SONG_PLAYED DREG(53)
#define R_MAGIC_FILL_COLOR(i) ZREG(0 + (i))
#define R_PAUSE_PAGE_SWITCH_FRAME_ADVANCE_ON ZREG(13)

View file

@ -133,8 +133,8 @@ extern s32 gSystemArenaLogSeverity;
extern u8 __osPfsInodeCacheBank;
extern s32 __osPfsLastChannel;
extern const TempoData gTempoData;
extern const AudioHeapInitSizes gAudioHeapInitSizes;
extern TempoData gTempoData;
extern AudioHeapInitSizes gAudioHeapInitSizes;
extern s16 gOcarinaSongItemMap[];
extern AudioTable gSoundFontTable;
extern u8 gSequenceFontTable[];

View file

@ -15,6 +15,7 @@
#define GC_EU 11
#define GC_EU_MQ 12
#define GC_JP_CE 13
#define IQUE_CN 14
// NTSC/PAL
#if OOT_VERSION == PAL_1_0 || OOT_VERSION == PAL_1_1 || OOT_VERSION == GC_EU || OOT_VERSION == GC_EU_MQ || OOT_VERSION == GC_EU_MQ_DBG

View file

@ -838,10 +838,10 @@ int func_8002DD78(struct Player* player);
s32 func_8002DDE4(struct PlayState* play);
s32 func_8002DDF4(struct PlayState* play);
void Actor_SwapHookshotAttachment(struct PlayState* play, Actor* srcActor, Actor* destActor);
void func_8002DE74(struct PlayState* play, struct Player* player);
void Actor_RequestHorseCameraSetting(struct PlayState* play, struct Player* player);
void Actor_MountHorse(struct PlayState* play, struct Player* player, Actor* horse);
int func_8002DEEC(struct Player* player);
void func_8002DF18(struct PlayState* play, struct Player* player);
void Actor_InitPlayerHorse(struct PlayState* play, struct Player* player);
s32 Player_SetCsAction(struct PlayState* play, Actor* csActor, u8 csAction);
s32 Player_SetCsActionWithHaltedActors(struct PlayState* play, Actor* csActor, u8 csAction);
void func_8002DF90(DynaPolyActor* dynaActor);
@ -868,7 +868,7 @@ s32 Actor_OfferTalkExchangeEquiCylinder(Actor* actor, struct PlayState* play, f3
s32 Actor_OfferTalk(Actor* actor, struct PlayState* play, f32 radius);
s32 Actor_OfferTalkNearColChkInfoCylinder(Actor* actor, struct PlayState* play);
u32 Actor_TextboxIsClosing(Actor* actor, struct PlayState* play);
s8 func_8002F368(struct PlayState* play);
s8 Actor_GetPlayerExchangeItemId(struct PlayState* play);
void Actor_GetScreenPos(struct PlayState* play, Actor* actor, s16* x, s16* y);
u32 Actor_HasParent(Actor* actor, struct PlayState* play);
s32 Actor_OfferGetItem(Actor* actor, struct PlayState* play, s32 getItemId, f32 xzRange, f32 yRange);

16
include/z64horse.h Normal file
View file

@ -0,0 +1,16 @@
#ifndef Z64HORSE_H
#define Z64HORSE_H
#include "ultra64.h"
#include "z64math.h"
struct PlayState;
struct Actor;
struct Player;
void Horse_ResetHorseData(struct PlayState* play);
void Horse_FixLakeHyliaPosition(struct PlayState* play);
void Horse_InitPlayerHorse(struct PlayState* play, struct Player* player);
void Horse_RotateToPoint(struct Actor* actor, Vec3f* pos, s16 turnAmount);
#endif

View file

@ -470,14 +470,18 @@ typedef enum LinkAge {
* When this is the case, an EVENTCHKINF_INDEX_* constant is defined for accessing a specific eventChkInf variable.
*/
#define GET_EVENTCHKINF(flag) (gSaveContext.save.info.eventChkInf[(flag) >> 4] & (1 << ((flag) & 0xF)))
#define SET_EVENTCHKINF(flag) (gSaveContext.save.info.eventChkInf[(flag) >> 4] |= (1 << ((flag) & 0xF)))
#define CLEAR_EVENTCHKINF(flag) (gSaveContext.save.info.eventChkInf[(flag) >> 4] &= ~(1 << ((flag) & 0xF)))
#define EVENTCHKINF_INDEX(flag) ((flag) >> 4)
#define EVENTCHKINF_MASK(flag) (1 << ((flag) & 0xF))
#define GET_EVENTCHKINF_VAR(flag) (gSaveContext.save.info.eventChkInf[(flag) >> 4])
#define GET_EVENTCHKINF_MASK(flag) (1 << ((flag) & 0xF))
#define GET_EVENTCHKINF(flag) (gSaveContext.save.info.eventChkInf[EVENTCHKINF_INDEX(flag)] & EVENTCHKINF_MASK(flag))
#define SET_EVENTCHKINF(flag) (gSaveContext.save.info.eventChkInf[EVENTCHKINF_INDEX(flag)] |= EVENTCHKINF_MASK(flag))
#define CLEAR_EVENTCHKINF(flag) (gSaveContext.save.info.eventChkInf[EVENTCHKINF_INDEX(flag)] &= ~EVENTCHKINF_MASK(flag))
#define GET_EVENTCHKINF_VAR(flag) (gSaveContext.save.info.eventChkInf[EVENTCHKINF_INDEX(flag)])
#define EVENTCHKINF_MASK(flag) (1 << ((flag) & 0xF))
// EVENTCHKINF 0x00-0x0F
#define EVENTCHKINF_INDEX_0 0
#define EVENTCHKINF_00_UNUSED 0x00 // flag is set in the debug save, but has no functionality
#define EVENTCHKINF_01_UNUSED 0x01 // flag is set in the debug save, but has no functionality
#define EVENTCHKINF_MIDO_DENIED_DEKU_TREE_ACCESS 0x02
@ -524,7 +528,7 @@ typedef enum LinkAge {
#define EVENTCHKINF_DEFEATED_NABOORU_KNUCKLE 0x3C
// EVENTCHKINF 0x40
#define EVENTCHKINF_INDEX_40 (EVENTCHKINF_40 >> 4)
#define EVENTCHKINF_INDEX_40 EVENTCHKINF_INDEX(EVENTCHKINF_40)
#define EVENTCHKINF_40 0x40
#define EVENTCHKINF_41 0x41
@ -538,7 +542,7 @@ typedef enum LinkAge {
#define EVENTCHKINF_4C 0x4C
#define EVENTCHKINF_CREATED_RAINBOW_BRIDGE 0x4D
#define EVENTCHKINF_CAUGHT_BY_CASTLE_GUARDS 0x4E // set but unused
#define EVENTCHKINF_WATCHED_SHEIK_AFTER_MASTER_SWORD_CS 0x4F // Cutscene in Temple of Time as adult after pulling the Master Sword for the first time
#define EVENTCHKINF_REVEALED_MASTER_SWORD 0x4F // Cutscene in Temple of Time when entering the Master Sword chamber for the first time
#define EVENTCHKINF_50 0x50
#define EVENTCHKINF_51 0x51
#define EVENTCHKINF_52 0x52
@ -555,22 +559,23 @@ typedef enum LinkAge {
#define EVENTCHKINF_TALON_WOKEN_IN_KAKARIKO 0x6A
// EVENTCHKINF 0x6B
#define EVENTCHKINF_INDEX_TALON_RETURNED_FROM_KAKARIKO EVENTCHKINF_INDEX(EVENTCHKINF_TALON_RETURNED_FROM_KAKARIKO)
#define EVENTCHKINF_TALON_RETURNED_FROM_KAKARIKO 0x6B
#define ENHY_GET_COPY_EVENTCHKINF(flag) GET_EVENTCHKINF_VAR(flag)
#define ENHY_CHECK_COPY_EVENTCHKINF(v, flag) ((v) & GET_EVENTCHKINF_MASK((flag)))
#define ENHY_CHECK_COPY_EVENTCHKINF(v, flag) ((v) & EVENTCHKINF_MASK((flag)))
#define EVENTCHKINF_6E 0x6E
#define EVENTCHKINF_6F 0x6F
#define EVENTCHKINF_70 0x70
#define EVENTCHKINF_71 0x71
#define EVENTCHKINF_72 0x72
#define EVENTCHKINF_73 0x73
#define EVENTCHKINF_74 0x74
#define EVENTCHKINF_75 0x75
#define EVENTCHKINF_76 0x76
#define EVENTCHKINF_77 0x77
#define EVENTCHKINF_78 0x78
#define EVENTCHKINF_BEGAN_GOHMA_BATTLE 0x70
#define EVENTCHKINF_BEGAN_KING_DODONGO_BATTLE 0x71
#define EVENTCHKINF_BEGAN_PHANTOM_GANON_BATTLE 0x72
#define EVENTCHKINF_BEGAN_VOLVAGIA_BATTLE 0x73
#define EVENTCHKINF_BEGAN_MORPHA_BATTLE 0x74
#define EVENTCHKINF_BEGAN_TWINROVA_BATTLE 0x75
#define EVENTCHKINF_BEGAN_BARINADE_BATTLE 0x76
#define EVENTCHKINF_BEGAN_BONGO_BONGO_BATTLE 0x77
#define EVENTCHKINF_BEGAN_GANONDORF_BATTLE 0x78
#define EVENTCHKINF_80 0x80
#define EVENTCHKINF_82 0x82
#define EVENTCHKINF_PAID_BACK_KEATON_MASK 0x8C
@ -587,10 +592,10 @@ typedef enum LinkAge {
#define EVENTCHKINF_CARPENTER_3_FREED 0x93
#define EVENTCHKINF_CARPENTERS_FREE_MASK_ALL \
( GET_EVENTCHKINF_MASK(EVENTCHKINF_CARPENTER_0_FREED) \
| GET_EVENTCHKINF_MASK(EVENTCHKINF_CARPENTER_1_FREED) \
| GET_EVENTCHKINF_MASK(EVENTCHKINF_CARPENTER_2_FREED) \
| GET_EVENTCHKINF_MASK(EVENTCHKINF_CARPENTER_3_FREED))
( EVENTCHKINF_MASK(EVENTCHKINF_CARPENTER_0_FREED) \
| EVENTCHKINF_MASK(EVENTCHKINF_CARPENTER_1_FREED) \
| EVENTCHKINF_MASK(EVENTCHKINF_CARPENTER_2_FREED) \
| EVENTCHKINF_MASK(EVENTCHKINF_CARPENTER_3_FREED))
#define GET_EVENTCHKINF_CARPENTERS_FREE_ALL() \
CHECK_FLAG_ALL(gSaveContext.save.info.eventChkInf[EVENTCHKINF_INDEX_CARPENTERS_FREED], \
@ -657,7 +662,7 @@ typedef enum LinkAge {
#define EVENTCHKINF_C9 0xC9
// EVENTCHKINF 0xD0-0xD6
#define EVENTCHKINF_INDEX_SONGS_FOR_FROGS (EVENTCHKINF_SONGS_FOR_FROGS_CHOIR >> 4)
#define EVENTCHKINF_INDEX_SONGS_FOR_FROGS EVENTCHKINF_INDEX(EVENTCHKINF_SONGS_FOR_FROGS_CHOIR)
#define EVENTCHKINF_SONGS_FOR_FROGS_CHOIR 0xD0
#define EVENTCHKINF_SONGS_FOR_FROGS_ZL 0xD1
#define EVENTCHKINF_SONGS_FOR_FROGS_EPONA 0xD2
@ -667,7 +672,7 @@ typedef enum LinkAge {
#define EVENTCHKINF_SONGS_FOR_FROGS_STORMS 0xD6
// EVENTCHKINF 0xDA-0xDE
#define EVENTCHKINF_INDEX_SKULLTULA_REWARD (EVENTCHKINF_SKULLTULA_REWARD_10 >> 4)
#define EVENTCHKINF_INDEX_SKULLTULA_REWARD EVENTCHKINF_INDEX(EVENTCHKINF_SKULLTULA_REWARD_10)
#define EVENTCHKINF_SKULLTULA_REWARD_10 0xDA
#define EVENTCHKINF_SKULLTULA_REWARD_20 0xDB
#define EVENTCHKINF_SKULLTULA_REWARD_30 0xDC
@ -687,10 +692,11 @@ typedef enum LinkAge {
* When this is the case, an ITEMGETINF_INDEX_* constant is defined for accessing a specific itemGetInf variable.
*/
#define GET_ITEMGETINF(flag) (gSaveContext.save.info.itemGetInf[(flag) >> 4] & (1 << ((flag) & 0xF)))
#define SET_ITEMGETINF(flag) (gSaveContext.save.info.itemGetInf[(flag) >> 4] |= (1 << ((flag) & 0xF)))
#define ITEMGETINF_INDEX(flag) ((flag) >> 4)
#define ITEMGETINF_MASK(flag) (1 << ((flag) & 0xF))
#define GET_ITEMGETINF_MASK(flag) (1 << ((flag) & 0xF))
#define GET_ITEMGETINF(flag) (gSaveContext.save.info.itemGetInf[ITEMGETINF_INDEX(flag)] & ITEMGETINF_MASK(flag))
#define SET_ITEMGETINF(flag) (gSaveContext.save.info.itemGetInf[ITEMGETINF_INDEX(flag)] |= ITEMGETINF_MASK(flag))
#define ITEMGETINF_TALON_BOTTLE 0x02
#define ITEMGETINF_03 0x03
@ -715,7 +721,7 @@ typedef enum LinkAge {
#define ITEMGETINF_17 0x17
// ITEMGETINF 0x18-0x1A
#define ITEMGETINF_INDEX_GREAT_FAIRY_ITEM (ITEMGETINF_FARORES_WIND >> 4)
#define ITEMGETINF_INDEX_GREAT_FAIRY_ITEM 1
#define ITEMGETINF_FARORES_WIND 0x18
#define ITEMGETINF_DINS_FIRE 0x19
#define ITEMGETINF_NAYRUS_LOVE 0x1A
@ -755,12 +761,15 @@ typedef enum LinkAge {
* When this is the case, an INFTABLE_INDEX_* constant is defined for accessing a specific infTable variable.
*/
#define GET_INFTABLE(flag) (gSaveContext.save.info.infTable[(flag) >> 4] & (1 << ((flag) & 0xF)))
#define SET_INFTABLE(flag) (gSaveContext.save.info.infTable[(flag) >> 4] |= (1 << ((flag) & 0xF)))
#define CLEAR_INFTABLE(flag) (gSaveContext.save.info.infTable[(flag) >> 4] &= ~(1 << ((flag) & 0xF)))
#define INFTABLE_INDEX(flag) ((flag) >> 4)
#define INFTABLE_MASK(flag) (1 << ((flag) & 0xF))
#define GET_INFTABLE_MASK(flag) (1 << ((flag) & 0xF))
#define GET_INFTABLE(flag) (gSaveContext.save.info.infTable[INFTABLE_INDEX(flag)] & INFTABLE_MASK(flag))
#define SET_INFTABLE(flag) (gSaveContext.save.info.infTable[INFTABLE_INDEX(flag)] |= INFTABLE_MASK(flag))
#define CLEAR_INFTABLE(flag) (gSaveContext.save.info.infTable[INFTABLE_INDEX(flag)] &= ~INFTABLE_MASK(flag))
// INFTABLE 0x0-0xF
#define INFTABLE_INDEX_0 0
#define INFTABLE_00 0x00
#define INFTABLE_01 0x01
#define INFTABLE_03 0x03
@ -900,13 +909,13 @@ typedef enum LinkAge {
#define INFTABLE_RESET_KAKARIKO_CUCCOS() \
gSaveContext.save.info.infTable[INFTABLE_INDEX_KAKARIKO_CUCCO] &= \
(u16) ~(GET_INFTABLE_MASK(INFTABLE_199) | GET_INFTABLE_MASK(INFTABLE_19A) | GET_INFTABLE_MASK(INFTABLE_19B) | \
GET_INFTABLE_MASK(INFTABLE_19C) | GET_INFTABLE_MASK(INFTABLE_19D) | GET_INFTABLE_MASK(INFTABLE_19E) | \
GET_INFTABLE_MASK(INFTABLE_19F));
(u16) ~(INFTABLE_MASK(INFTABLE_199) | INFTABLE_MASK(INFTABLE_19A) | INFTABLE_MASK(INFTABLE_19B) | \
INFTABLE_MASK(INFTABLE_19C) | INFTABLE_MASK(INFTABLE_19D) | INFTABLE_MASK(INFTABLE_19E) | \
INFTABLE_MASK(INFTABLE_19F));
// INFTABLE 0x1A0-0x1AF
#define INFTABLE_INDEX_OVERWORLD_ENTRANCE_ICON (INFTABLE_1A0 >> 4)
#define INFTABLE_INDEX_OVERWORLD_ENTRANCE_ICON INFTABLE_INDEX(INFTABLE_1A0)
#define INFTABLE_1A0 0x1A0
#define INFTABLE_1A1 0x1A1
#define INFTABLE_1A2 0x1A2
@ -935,7 +944,7 @@ typedef enum LinkAge {
#define MINIMAP_INFTABLE_TO_OW_ENTRANCE_FLAG(flag) ((flag) - INFTABLE_1A0)
// 0x1D0-0x1DF
#define INFTABLE_INDEX_1DX (0x1D0 >> 4)
#define INFTABLE_INDEX_1DX INFTABLE_INDEX(INFTABLE_1D0)
#define INFTABLE_1D0 0x1D0
@ -950,9 +959,12 @@ typedef enum LinkAge {
* When this is the case, an EVENTINF_INDEX_* constant is defined for accessing a specific eventInf variable.
*/
#define GET_EVENTINF(flag) (gSaveContext.eventInf[(flag) >> 4] & (1 << ((flag) & 0xF)))
#define SET_EVENTINF(flag) (gSaveContext.eventInf[(flag) >> 4] |= (1 << ((flag) & 0xF)))
#define CLEAR_EVENTINF(flag) (gSaveContext.eventInf[(flag) >> 4] &= ~(1 << ((flag) & 0xF)))
#define EVENTINF_INDEX(flag) ((flag) >> 4)
#define EVENTINF_MASK(flag) (1 << ((flag) & 0xF))
#define GET_EVENTINF(flag) (gSaveContext.eventInf[EVENTINF_INDEX(flag)] & EVENTINF_MASK(flag))
#define SET_EVENTINF(flag) (gSaveContext.eventInf[EVENTINF_INDEX(flag)] |= EVENTINF_MASK(flag))
#define CLEAR_EVENTINF(flag) (gSaveContext.eventInf[EVENTINF_INDEX(flag)] &= ~EVENTINF_MASK(flag))
#define RESET_EVENTINF() \
gSaveContext.eventInf[0] = 0; \
gSaveContext.eventInf[1] = 0; \
@ -961,29 +973,27 @@ typedef enum LinkAge {
#define RESET_EVENTINF2() \
gSaveContext.eventInf[0] = gSaveContext.eventInf[1] = gSaveContext.eventInf[2] = gSaveContext.eventInf[3] = 0;
#define GET_EVENTINF_MASK(flag) (1 << ((flag) & 0xF))
// EVENTINF 0x00-0x0F
// Ingo Race, Lon Lon Ranch minigames, and Horseback Archery minigame flags
#define EVENTINF_INDEX_INGORACE (0x00 >> 4)
#define EVENTINF_INDEX_INGO_RACE 0
// EVENTINF 0x00-0x03 reserved for IngoRaceState
#define EVENTINF_INGORACE_STATE_MASK \
(GET_EVENTINF_MASK(0x00) | GET_EVENTINF_MASK(0x01) | GET_EVENTINF_MASK(0x02) | GET_EVENTINF_MASK(0x03))
#define EVENTINF_INGO_RACE_STATE_MASK \
(EVENTINF_MASK(0x00) | EVENTINF_MASK(0x01) | EVENTINF_MASK(0x02) | EVENTINF_MASK(0x03))
typedef enum IngoRaceState {
/* 0 */ INGORACE_STATE_OFFER_RENTAL,
/* 1 */ INGORACE_STATE_HORSE_RENTAL_PERIOD,
/* 2 */ INGORACE_STATE_RACING,
/* 3 */ INGORACE_STATE_PLAYER_LOSE,
/* 4 */ INGORACE_STATE_FIRST_WIN,
/* 5 */ INGORACE_STATE_TRAPPED_WIN_UNUSED,
/* 6 */ INGORACE_STATE_TRAPPED_WIN_EPONA, // Ingo Traps you in Lon Lon
/* 7 */ INGORACE_STATE_REMATCH
/* 0 */ INGO_RACE_STATE_OFFER_RENTAL,
/* 1 */ INGO_RACE_STATE_HORSE_RENTAL_PERIOD,
/* 2 */ INGO_RACE_STATE_RACING,
/* 3 */ INGO_RACE_STATE_PLAYER_LOSE,
/* 4 */ INGO_RACE_STATE_FIRST_WIN,
/* 5 */ INGO_RACE_STATE_TRAPPED_WIN_UNUSED,
/* 6 */ INGO_RACE_STATE_TRAPPED_WIN_EPONA, // Ingo Traps you in Lon Lon
/* 7 */ INGO_RACE_STATE_REMATCH
} IngoRaceState;
#define EVENTINF_INGORACE_HORSETYPE 0x04
#define EVENTINF_INGORACE_LOST_ONCE 0x05
#define EVENTINF_INGORACE_SECOND_RACE 0x06
#define EVENTINF_INGO_RACE_HORSETYPE 0x04
#define EVENTINF_INGO_RACE_LOST_ONCE 0x05
#define EVENTINF_INGO_RACE_SECOND_RACE 0x06
// Used in z_en_ta (Talon) to store Cucco game winning status
// and in z_en_ge1 (Gerudo) to store archery in-progress status
#define EVENTINF_HORSES_08 0x08
@ -991,37 +1001,37 @@ typedef enum IngoRaceState {
// Used in z_en_ta (Talon) and z_en_ma3 (Malon) to store minigame finishing status
#define EVENTINF_HORSES_0A 0x0A
#define EVENTINF_CUCCO_GAME_FINISHED EVENTINF_HORSES_0A
#define EVENTINF_INGORACE_0F 0x0F // unused?
#define EVENTINF_INGO_RACE_0F 0x0F // unused?
// "InRaceSeq"
#define GET_EVENTINF_INGORACE_STATE() (gSaveContext.eventInf[EVENTINF_INDEX_INGORACE] & EVENTINF_INGORACE_STATE_MASK)
#define GET_EVENTINF_INGO_RACE_STATE() (gSaveContext.eventInf[EVENTINF_INDEX_INGO_RACE] & EVENTINF_INGO_RACE_STATE_MASK)
#define SET_EVENTINF_INGORACE_STATE(v) \
gSaveContext.eventInf[EVENTINF_INDEX_INGORACE] = \
(gSaveContext.eventInf[EVENTINF_INDEX_INGORACE] & ~EVENTINF_INGORACE_STATE_MASK) | (v)
#define SET_EVENTINF_INGO_RACE_STATE(v) \
gSaveContext.eventInf[EVENTINF_INDEX_INGO_RACE] = \
(gSaveContext.eventInf[EVENTINF_INDEX_INGO_RACE] & ~EVENTINF_INGO_RACE_STATE_MASK) | (v)
#define SET_EVENTINF_INGORACE_FLAG(flag) \
gSaveContext.eventInf[EVENTINF_INDEX_INGORACE] = \
(gSaveContext.eventInf[EVENTINF_INDEX_INGORACE] & 0xFFFF) | (1 << ((flag) & 0xF))
#define SET_EVENTINF_INGO_RACE_FLAG(flag) \
gSaveContext.eventInf[EVENTINF_INDEX_INGO_RACE] = \
(gSaveContext.eventInf[EVENTINF_INDEX_INGO_RACE] & 0xFFFF) | (1 << ((flag) & 0xF))
#define WRITE_EVENTINF_INGORACE_FLAG(flag, v) \
gSaveContext.eventInf[EVENTINF_INDEX_INGORACE] = \
(gSaveContext.eventInf[EVENTINF_INDEX_INGORACE] & ~(1 << ((flag)&0xF))) | ((v) << ((flag) & 0xF))
#define WRITE_EVENTINF_INGO_RACE_FLAG(flag, v) \
gSaveContext.eventInf[EVENTINF_INDEX_INGO_RACE] = \
(gSaveContext.eventInf[EVENTINF_INDEX_INGO_RACE] & ~(1 << ((flag)&0xF))) | ((v) << ((flag) & 0xF))
#define RESET_EVENTINF_INGORACE() \
gSaveContext.eventInf[EVENTINF_INDEX_INGORACE] &= \
(u16) ~(EVENTINF_INGORACE_STATE_MASK | GET_EVENTINF_MASK(EVENTINF_INGORACE_HORSETYPE) | \
GET_EVENTINF_MASK(EVENTINF_INGORACE_LOST_ONCE) | GET_EVENTINF_MASK(EVENTINF_INGORACE_SECOND_RACE) | \
GET_EVENTINF_MASK(EVENTINF_INGORACE_0F))
#define RESET_EVENTINF_INGO_RACE() \
gSaveContext.eventInf[EVENTINF_INDEX_INGO_RACE] &= \
(u16) ~(EVENTINF_INGO_RACE_STATE_MASK | EVENTINF_MASK(EVENTINF_INGO_RACE_HORSETYPE) | \
EVENTINF_MASK(EVENTINF_INGO_RACE_LOST_ONCE) | EVENTINF_MASK(EVENTINF_INGO_RACE_SECOND_RACE) | \
EVENTINF_MASK(EVENTINF_INGO_RACE_0F))
#define RESET_EVENTINF_INGORACE2() \
gSaveContext.eventInf[EVENTINF_INDEX_INGORACE] = 0;
#define RESET_EVENTINF_INGO_RACE2() \
gSaveContext.eventInf[EVENTINF_INDEX_INGO_RACE] = 0;
#define GET_EVENTINF_INGORACE_HORSETYPE() \
(GET_EVENTINF(EVENTINF_INGORACE_HORSETYPE) >> (EVENTINF_INGORACE_HORSETYPE & 0xF))
#define WRITE_EVENTINF_INGORACE_HORSETYPE(v) WRITE_EVENTINF_INGORACE_FLAG(EVENTINF_INGORACE_HORSETYPE, v)
#define GET_EVENTINF_INGO_RACE_HORSETYPE() \
(GET_EVENTINF(EVENTINF_INGO_RACE_HORSETYPE) >> (EVENTINF_INGO_RACE_HORSETYPE & 0xF))
#define WRITE_EVENTINF_INGO_RACE_HORSETYPE(v) WRITE_EVENTINF_INGO_RACE_FLAG(EVENTINF_INGO_RACE_HORSETYPE, v)
#define WRITE_EVENTINF_INGORACE_0F(v) WRITE_EVENTINF_INGORACE_FLAG(EVENTINF_INGORACE_0F, v)
#define WRITE_EVENTINF_INGO_RACE_0F(v) WRITE_EVENTINF_INGO_RACE_FLAG(EVENTINF_INGO_RACE_0F, v)
// Is the running man race active
#define EVENTINF_MARATHON_ACTIVE 0x10
@ -1035,8 +1045,8 @@ typedef enum IngoRaceState {
#define EVENTINF_24 0x24
#define EVENTINF_HAGGLING_TOWNSFOLK_MASK \
(GET_EVENTINF_MASK(EVENTINF_20) | GET_EVENTINF_MASK(EVENTINF_21) | GET_EVENTINF_MASK(EVENTINF_22) | \
GET_EVENTINF_MASK(EVENTINF_23) | GET_EVENTINF_MASK(EVENTINF_24))
(EVENTINF_MASK(EVENTINF_20) | EVENTINF_MASK(EVENTINF_21) | EVENTINF_MASK(EVENTINF_22) | \
EVENTINF_MASK(EVENTINF_23) | EVENTINF_MASK(EVENTINF_24))
#define ENMU_GET_TALK_FLAGS() \
gSaveContext.eventInf[EVENTINF_INDEX_HAGGLING_TOWNSFOLK] & EVENTINF_HAGGLING_TOWNSFOLK_MASK

3
spec
View file

@ -740,6 +740,7 @@ beginseg
include "$(BUILD_DIR)/src/audio/sequence.o"
include "$(BUILD_DIR)/src/audio/data.o"
include "$(BUILD_DIR)/src/audio/session_config.o"
include "$(BUILD_DIR)/src/audio/session_init.o"
#if PLATFORM_N64
include "$(BUILD_DIR)/src/libu64/gfxprint.o"
include "$(BUILD_DIR)/src/libu64/rcp_utils.o"
@ -889,7 +890,7 @@ beginseg
include "$(BUILD_DIR)/src/libultra/mgu/translate.o"
#endif
include "$(BUILD_DIR)/src/libultra/io/contramwrite.o"
#if OOT_VERSION == NTSC_1_2 || (PLATFORM_GC && !DEBUG_FEATURES)
#if OOT_VERSION >= PAL_1_0 && !(OOT_PAL_N64 || DEBUG_FEATURES)
include "$(BUILD_DIR)/src/libultra/io/vimodefpallan1.o"
#endif
#if !DEBUG_FEATURES

View file

@ -1250,8 +1250,7 @@ void AudioLoad_Init(void* heap, u32 heapSize) {
ramAddr = AudioHeap_Alloc(&gAudioCtx.initPool, gAudioHeapInitSizes.permanentPoolSize);
if (ramAddr == NULL) {
// cast away const from gAudioHeapInitSizes
*((u32*)&gAudioHeapInitSizes.permanentPoolSize) = 0;
gAudioHeapInitSizes.permanentPoolSize = 0;
}
AudioHeap_InitPool(&gAudioCtx.permanentPool, ramAddr, gAudioHeapInitSizes.permanentPoolSize);

View file

@ -1,33 +1,9 @@
#include "global.h"
#include "assets/audio/sequence_sizes.h"
#include "assets/audio/soundfont_sizes.h"
#define SFX_SEQ_SIZE Sequence_0_SIZE
#define SFX_SOUNDFONTS_SIZE (Soundfont_0_SIZE + Soundfont_1_SIZE)
AudioContext gAudioCtx;
AudioCustomUpdateFunction gAudioCustomUpdateFunction;
s32 D_801755D8[3]; // unused
const TempoData gTempoData = {
0x1C00, // unk_00
SEQTICKS_PER_BEAT, // seqTicksPerBeat
};
// Sizes of everything on the init pool
#define AI_BUFFERS_SIZE (AIBUF_SIZE * ARRAY_COUNT(gAudioCtx.aiBuffers))
#define SOUNDFONT_LIST_SIZE (NUM_SOUNDFONTS * sizeof(SoundFont))
#if OOT_VERSION < PAL_1_0 || PLATFORM_GC
#define PERMANENT_POOL_SIZE (SFX_SEQ_SIZE + SFX_SOUNDFONTS_SIZE)
#else
#define PERMANENT_POOL_SIZE (SFX_SEQ_SIZE + SFX_SOUNDFONTS_SIZE + 0x10)
#endif
const AudioHeapInitSizes gAudioHeapInitSizes = {
ALIGN16(sizeof(gAudioHeap) - 0x100), // audio heap size
ALIGN16(PERMANENT_POOL_SIZE + AI_BUFFERS_SIZE + SOUNDFONT_LIST_SIZE), // init pool size
ALIGN16(PERMANENT_POOL_SIZE), // permanent pool size
};
#define DEFAULT_REVERB_SETTINGS \
{ 1, 0x30, 0x3000, 0, 0, 0x7FFF, 0x0000, 0x0000, 0xFF, 0x3000, 0x0, 0x0 }

26
src/audio/session_init.c Normal file
View file

@ -0,0 +1,26 @@
#include "global.h"
#include "assets/audio/sequence_sizes.h"
#include "assets/audio/soundfont_sizes.h"
#define SFX_SEQ_SIZE Sequence_0_SIZE
#define SFX_SOUNDFONTS_SIZE (Soundfont_0_SIZE + Soundfont_1_SIZE)
TempoData gTempoData = {
0x1C00, // unk_00
SEQTICKS_PER_BEAT, // seqTicksPerBeat
};
// Sizes of everything on the init pool
#define AI_BUFFERS_SIZE (AIBUF_SIZE * ARRAY_COUNT(gAudioCtx.aiBuffers))
#define SOUNDFONT_LIST_SIZE (NUM_SOUNDFONTS * sizeof(SoundFont))
#if OOT_VERSION < PAL_1_0 || PLATFORM_GC
#define PERMANENT_POOL_SIZE (SFX_SEQ_SIZE + SFX_SOUNDFONTS_SIZE)
#else
#define PERMANENT_POOL_SIZE (SFX_SEQ_SIZE + SFX_SOUNDFONTS_SIZE + 0x10)
#endif
AudioHeapInitSizes gAudioHeapInitSizes = {
ALIGN16(sizeof(gAudioHeap) - 0x100), // audio heap size
ALIGN16(PERMANENT_POOL_SIZE + AI_BUFFERS_SIZE + SOUNDFONT_LIST_SIZE), // init pool size
ALIGN16(PERMANENT_POOL_SIZE), // permanent pool size
};

View file

@ -2,6 +2,7 @@
#include "region.h"
#include "terminal.h"
#include "versions.h"
#include "line_numbers.h"
s32 gCurrentRegion = 0;
@ -39,15 +40,7 @@ void Locale_Init(void) {
PRINTF(VT_COL(RED, WHITE));
PRINTF(T("z_locale_init: 日本用かアメリカ用か判別できません\n",
"z_locale_init: Can't tell if it's for Japan or America\n"));
#if OOT_VERSION < NTSC_1_1
LogUtils_HungupThread("../z_locale.c", 86);
#elif OOT_VERSION < PAL_1_0
LogUtils_HungupThread("../z_locale.c", 92);
#elif OOT_VERSION < GC_JP
LogUtils_HungupThread("../z_locale.c", 101);
#else
LogUtils_HungupThread("../z_locale.c", 118);
#endif
LogUtils_HungupThread("../z_locale.c", LN4(86, 92, 101, 118));
PRINTF(VT_RST);
break;
}

View file

@ -22,6 +22,7 @@
#include "fault.h"
#include "stack.h"
#include "terminal.h"
#include "line_numbers.h"
#if PLATFORM_N64
#include "n64dd.h"
#endif
@ -296,14 +297,9 @@ NORETURN void DmaMgr_Error(DmaRequest* req, const char* filename, const char* er
Fault_AddHungupAndCrashImpl(buff1, buff2);
}
#define DMA_ERROR(req, filename, errorName, errorDesc, file, line1, line2, line3) \
DmaMgr_Error(req, filename, errorName, errorDesc)
#elif OOT_VERSION < NTSC_1_1
#define DMA_ERROR(req, filename, errorName, errorDesc, file, line1, line2, line3) Fault_AddHungupAndCrash(file, line1)
#elif OOT_VERSION < GC_JP
#define DMA_ERROR(req, filename, errorName, errorDesc, file, line1, line2, line3) Fault_AddHungupAndCrash(file, line2)
#define DMA_ERROR(req, filename, errorName, errorDesc, file, line) DmaMgr_Error(req, filename, errorName, errorDesc)
#else
#define DMA_ERROR(req, filename, errorName, errorDesc, file, line1, line2, line3) Fault_AddHungupAndCrash(file, line3)
#define DMA_ERROR(req, filename, errorName, errorDesc, file, line) Fault_AddHungupAndCrash(file, line)
#endif
#if PLATFORM_GC
@ -409,7 +405,7 @@ void DmaMgr_ProcessRequest(DmaRequest* req) {
DMA_ERROR(req, filename, "Segment Alignment Error",
T("セグメント境界をまたがってDMA転送することはできません",
"DMA transfers cannot cross segment boundaries"),
"../z_std_dma.c", 575, 578, 726);
"../z_std_dma.c", LN3(575, 578, 726));
}
DmaMgr_DmaRomToRam(iter->romStart + (vrom - iter->file.vromStart), ram, size);
@ -430,7 +426,7 @@ void DmaMgr_ProcessRequest(DmaRequest* req) {
DMA_ERROR(req, filename, "Can't Transfer Segment",
T("圧縮されたセグメントの途中からはDMA転送することはできません",
"DMA transfer cannot be performed from the middle of a compressed segment"),
"../z_std_dma.c", 595, 598, 746);
"../z_std_dma.c", LN3(595, 598, 746));
}
if (size != iter->file.vromEnd - iter->file.vromStart) {
@ -439,7 +435,7 @@ void DmaMgr_ProcessRequest(DmaRequest* req) {
DMA_ERROR(req, filename, "Can't Transfer Segment",
T("圧縮されたセグメントの一部だけをDMA転送することはできません",
"It is not possible to DMA only part of a compressed segment"),
"../z_std_dma.c", 601, 604, 752);
"../z_std_dma.c", LN3(601, 604, 752));
}
// Reduce the thread priority and decompress the file, the decompression routine handles the DMA
@ -472,8 +468,8 @@ void DmaMgr_ProcessRequest(DmaRequest* req) {
// Error, rom is compressed so DMA may only be requested within the filesystem bounds
DMA_ERROR(req, NULL, "DATA DON'T EXIST",
T("該当するデータが存在しません", "Corresponding data does not exist"), "../z_std_dma.c", 621,
624, 771);
T("該当するデータが存在しません", "Corresponding data does not exist"), "../z_std_dma.c",
LN3(621, 624, 771));
return;
} else {
// ROM is uncompressed, allow arbitrary DMA even if the region is not marked in the filesystem
@ -543,7 +539,7 @@ s32 DmaMgr_RequestAsync(DmaRequest* req, void* ram, uintptr_t vrom, size_t size,
(size == 0) || (size & 1)) {
//! @bug `req` is passed to `DMA_ERROR` without rom, ram and size being set
DMA_ERROR(req, NULL, "ILLIGAL DMA-FUNCTION CALL", T("パラメータ異常です", "Parameter error"), "../z_std_dma.c",
UNK_LINE, UNK_LINE, UNK_LINE);
UNK_LINE);
}
#endif
@ -645,13 +641,7 @@ void DmaMgr_Init(void) {
PRINTF("_bootSegmentRomStart(%08x) != dma_rom_ad[0].rom_b(%08x)\n", _bootSegmentRomStart,
gDmaDataTable[0].file.vromEnd);
//! @bug The main code file where fault.c resides is not yet loaded
#if OOT_VERSION < NTSC_1_1
Fault_AddHungupAndCrash("../z_std_dma.c", 837);
#elif OOT_VERSION < GC_JP
Fault_AddHungupAndCrash("../z_std_dma.c", 840);
#else
Fault_AddHungupAndCrash("../z_std_dma.c", 1055);
#endif
Fault_AddHungupAndCrash("../z_std_dma.c", LN3(837, 840, 1055));
}
// Start the DMA manager

View file

@ -522,11 +522,11 @@ void PreRender_CopyImageRegion(PreRender* this, Gfx** gfxP) {
* This filter performs a linear interpolation on partially covered pixels between the current pixel color (called
* foreground color) and a "background" pixel color obtained by sampling fully covered pixels at the six highlighted
* points in the following 5x3 neighborhood:
* _ _ _ _ _
* - - - - -
* | o o |
* | o X o |
* | o o |
*
* - - - - -
* Whether a pixel is partially covered is determined by reading the coverage values associated with the image.
* Coverage is a measure of how many subpixels the last drawn primitive covered. A fully covered pixel is one with a
* full coverage value, the entire pixel was covered by the primitive.

View file

@ -40,7 +40,7 @@
* DPad-Up may be pressed to enable sending fault pages over osSyncPrintf as well as displaying them on-screen.
* DPad-Down disables sending fault pages over osSyncPrintf.
*/
#if PLATFORM_GC
#if !PLATFORM_N64
#pragma increment_block_number "gc-eu:160 gc-eu-mq:160 gc-eu-mq-dbg:160 gc-jp:176 gc-jp-ce:176 gc-jp-mq:176 gc-us:176" \
"gc-us-mq:176"

View file

@ -9,7 +9,7 @@
#include "terminal.h"
#pragma increment_block_number "gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128"
#if PLATFORM_GC
#if !PLATFORM_N64
typedef struct FaultDrawer {
/* 0x00 */ u16* fb;

View file

@ -3,6 +3,7 @@
#include "libc64/os_malloc.h"
#include "terminal.h"
#include "versions.h"
#include "line_numbers.h"
#if PLATFORM_N64
#include "n64dd.h"
#endif
@ -390,15 +391,7 @@ void GameState_InitArena(GameState* gameState, size_t size) {
} else {
THA_Init(&gameState->tha, NULL, 0);
PRINTF(T("ハイラル確保失敗\n", "Failure to secure Hyrule\n"));
#if OOT_VERSION < NTSC_1_1
HUNGUP_AND_CRASH("../game.c", 895);
#elif OOT_VERSION < PAL_1_0
HUNGUP_AND_CRASH("../game.c", 898);
#elif OOT_VERSION < GC_JP
HUNGUP_AND_CRASH("../game.c", 985);
#else
HUNGUP_AND_CRASH("../game.c", 999);
#endif
HUNGUP_AND_CRASH("../game.c", LN4(895, 898, 985, 999));
}
}
@ -439,15 +432,7 @@ void GameState_Realloc(GameState* gameState, size_t size) {
SystemArena_Display();
#endif
#if OOT_VERSION < NTSC_1_1
HUNGUP_AND_CRASH("../game.c", 940);
#elif OOT_VERSION < PAL_1_0
HUNGUP_AND_CRASH("../game.c", 943);
#elif OOT_VERSION < GC_JP
HUNGUP_AND_CRASH("../game.c", 1030);
#else
HUNGUP_AND_CRASH("../game.c", 1044);
#endif
HUNGUP_AND_CRASH("../game.c", LN4(940, 943, 1030, 1044));
}
}

View file

@ -3,6 +3,7 @@
#include "terminal.h"
#include "ucode_disas.h"
#include "versions.h"
#include "line_numbers.h"
#define GFXPOOL_HEAD_MAGIC 0x1234
#define GFXPOOL_TAIL_MAGIC 0x5678
@ -379,30 +380,15 @@ void Graph_Update(GraphicsContext* gfxCtx, GameState* gameState) {
PRINTF("%c", BEL);
PRINTF(VT_COL(RED, WHITE) T("ダイナミック領域先頭が破壊されています\n", "Dynamic area head is destroyed\n")
VT_RST);
#if OOT_VERSION < NTSC_1_1
Fault_AddHungupAndCrash("../graph.c", 937);
#elif OOT_VERSION < PAL_1_0
Fault_AddHungupAndCrash("../graph.c", 940);
#elif OOT_VERSION < GC_JP
Fault_AddHungupAndCrash("../graph.c", 951);
#else
Fault_AddHungupAndCrash("../graph.c", 1070);
#endif
Fault_AddHungupAndCrash("../graph.c", LN4(937, 940, 951, 1070));
}
if (pool->tailMagic != GFXPOOL_TAIL_MAGIC) {
problem = true;
PRINTF("%c", BEL);
PRINTF(VT_COL(RED, WHITE)
T("ダイナミック領域末尾が破壊されています\n", "Dynamic region tail is destroyed\n") VT_RST);
#if OOT_VERSION < NTSC_1_1
Fault_AddHungupAndCrash("../graph.c", 943);
#elif OOT_VERSION < PAL_1_0
Fault_AddHungupAndCrash("../graph.c", 946);
#elif OOT_VERSION < GC_JP
Fault_AddHungupAndCrash("../graph.c", 957);
#else
Fault_AddHungupAndCrash("../graph.c", 1076);
#endif
Fault_AddHungupAndCrash("../graph.c", LN4(943, 946, 957, 1076));
}
}
@ -494,14 +480,8 @@ void Graph_ThreadEntry(void* arg0) {
sprintf(faultMsg, "CLASS SIZE= %d bytes", size);
Fault_AddHungupAndCrashImpl("GAME CLASS MALLOC FAILED", faultMsg);
#elif OOT_VERSION < NTSC_1_1
Fault_AddHungupAndCrash("../graph.c", 1067);
#elif OOT_VERSION < PAL_1_0
Fault_AddHungupAndCrash("../graph.c", 1070);
#elif OOT_VERSION < GC_JP
Fault_AddHungupAndCrash("../graph.c", 1081);
#else
Fault_AddHungupAndCrash("../graph.c", 1200);
Fault_AddHungupAndCrash("../graph.c", LN4(1067, 1070, 1081, 1200));
#endif
}

View file

@ -31,6 +31,7 @@
#include "global.h"
#include "fault.h"
#include "terminal.h"
#include "line_numbers.h"
#define PADMGR_LOG(controllerNum, msg) \
if (DEBUG_FEATURES) { \
@ -326,13 +327,7 @@ void PadMgr_UpdateInputs(PadMgr* padMgr) {
default:
// Unknown error response
LOG_HEX("padnow1->errno", pad->errno, "../padmgr.c", 396);
#if OOT_VERSION < NTSC_1_1
Fault_AddHungupAndCrash("../padmgr.c", 379);
#elif OOT_VERSION < GC_JP
Fault_AddHungupAndCrash("../padmgr.c", 382);
#else
Fault_AddHungupAndCrash("../padmgr.c", 397);
#endif
Fault_AddHungupAndCrash("../padmgr.c", LN3(379, 382, 397));
break;
}

View file

@ -1,4 +1,5 @@
#include "global.h"
#include "line_numbers.h"
#pragma increment_block_number "gc-eu:128 gc-eu-mq:128 gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128" \
"pal-1.1:128"
@ -33,15 +34,7 @@ void SysCfb_Init(s32 n64dd) {
PRINTF("RAM4M mode\n");
sSysCfbEnd = 0x80400000;
} else {
#if OOT_VERSION < NTSC_1_1
LogUtils_HungupThread("../sys_cfb.c", 305);
#elif OOT_VERSION < PAL_1_0
LogUtils_HungupThread("../sys_cfb.c", 308);
#elif OOT_VERSION < GC_JP
LogUtils_HungupThread("../sys_cfb.c", 322);
#else
LogUtils_HungupThread("../sys_cfb.c", 354);
#endif
LogUtils_HungupThread("../sys_cfb.c", LN4(305, 308, 322, 354));
}
screenSize = SCREEN_WIDTH * SCREEN_HEIGHT;

View file

@ -4,6 +4,7 @@
#include "rand.h"
#include "terminal.h"
#include "versions.h"
#include "z64horse.h"
#include "overlays/actors/ovl_Arms_Hook/z_arms_hook.h"
#include "overlays/actors/ovl_En_Part/z_en_part.h"
@ -1139,7 +1140,7 @@ void Actor_SwapHookshotAttachment(PlayState* play, Actor* srcActor, Actor* destA
srcActor->flags &= ~ACTOR_FLAG_HOOKSHOT_ATTACHED;
}
void func_8002DE74(PlayState* play, Player* player) {
void Actor_RequestHorseCameraSetting(PlayState* play, Player* player) {
if ((play->roomCtx.curRoom.type != ROOM_TYPE_4) && Play_CamIsNotFixed(play)) {
Camera_RequestSetting(Play_GetCamera(play, CAM_ID_MAIN), CAM_SET_HORSE);
}
@ -1156,8 +1157,8 @@ int func_8002DEEC(Player* player) {
(player->csAction != PLAYER_CSACTION_NONE);
}
void func_8002DF18(PlayState* play, Player* player) {
func_8006DC68(play, player);
void Actor_InitPlayerHorse(PlayState* play, Player* player) {
Horse_InitPlayerHorse(play, player);
}
/**
@ -1768,7 +1769,7 @@ u32 Actor_TextboxIsClosing(Actor* actor, PlayState* play) {
}
}
s8 func_8002F368(PlayState* play) {
s8 Actor_GetPlayerExchangeItemId(PlayState* play) {
Player* player = GET_PLAYER(play);
return player->exchangeItemId;

View file

@ -1,5 +1,6 @@
#include "global.h"
#include "terminal.h"
#include "line_numbers.h"
#pragma increment_block_number "ntsc-1.0:128 ntsc-1.1:128 ntsc-1.2:128"
@ -1610,13 +1611,11 @@ void BgCheck_Allocate(CollisionContext* colCtx, PlayState* play, CollisionHeader
colCtx->subdivAmount.x * sizeof(StaticLookup) * colCtx->subdivAmount.y *
colCtx->subdivAmount.z,
ALIGNOF_MASK(StaticLookup));
if (colCtx->lookupTbl == NULL) {
#if OOT_VERSION < NTSC_1_1
LogUtils_HungupThread("../z_bgcheck.c", 4173);
#else
LogUtils_HungupThread("../z_bgcheck.c", 4176);
#endif
LogUtils_HungupThread("../z_bgcheck.c", LN1(4173, 4176));
}
colCtx->minBounds.x = colCtx->colHeader->minBounds.x;
colCtx->minBounds.y = colCtx->colHeader->minBounds.y;
colCtx->minBounds.z = colCtx->colHeader->minBounds.z;
@ -1633,17 +1632,14 @@ void BgCheck_Allocate(CollisionContext* colCtx, PlayState* play, CollisionHeader
colCtx->colHeader->numPolygons * sizeof(u8) + colCtx->dyna.polyNodesMax * sizeof(SSNode) +
colCtx->dyna.polyListMax * sizeof(CollisionPoly) + colCtx->dyna.vtxListMax * sizeof(Vec3s) +
sizeof(CollisionContext);
if (customNodeListMax > 0) {
// tblMax is set without checking if customNodeListMax will result in a memory overflow
// this is a non-issue as long as sceneSubdivisionList.nodeListMax is -1
tblMax = customNodeListMax;
} else {
if (colCtx->memSize < memSize) {
#if OOT_VERSION < NTSC_1_1
LogUtils_HungupThread("../z_bgcheck.c", 4227);
#else
LogUtils_HungupThread("../z_bgcheck.c", 4230);
#endif
LogUtils_HungupThread("../z_bgcheck.c", LN1(4227, 4230));
}
tblMax = (colCtx->memSize - memSize) / sizeof(SSNode);
}

View file

@ -5,7 +5,7 @@
#include "overlays/actors/ovl_En_Horse/z_en_horse.h"
#pragma increment_block_number "gc-eu:192 gc-eu-mq:192 gc-jp:192 gc-jp-ce:192 gc-jp-mq:192 gc-us:192 gc-us-mq:192" \
"ntsc-1.0:192 ntsc-1.1:192 ntsc-1.2:192 pal-1.0:192 pal-1.1:192"
"ntsc-1.0:128 ntsc-1.1:128 ntsc-1.2:128 pal-1.0:128 pal-1.1:128"
s16 Camera_RequestSettingImpl(Camera* camera, s16 requestedSetting, s16 flags);
s32 Camera_RequestModeImpl(Camera* camera, s16 requestedMode, u8 forceModeChange);
@ -3639,7 +3639,7 @@ s32 Camera_KeepOn3(Camera* camera) {
}
#pragma increment_block_number "gc-eu:128 gc-eu-mq:128 gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128" \
"ntsc-1.0:83 ntsc-1.1:83 ntsc-1.2:83 pal-1.0:81 pal-1.1:81"
"ntsc-1.0:144 ntsc-1.1:144 ntsc-1.2:144 pal-1.0:142 pal-1.1:142"
s32 Camera_KeepOn4(Camera* camera) {
static Vec3f D_8015BD50;

View file

@ -734,7 +734,7 @@ void CutsceneCmd_Destination(PlayState* play, CutsceneContext* csCtx, CsCmdDesti
case CS_DEST_TEMPLE_OF_TIME_AFTER_LIGHT_MEDALLION:
#if DEBUG_FEATURES
SET_EVENTCHKINF(EVENTCHKINF_WATCHED_SHEIK_AFTER_MASTER_SWORD_CS);
SET_EVENTCHKINF(EVENTCHKINF_REVEALED_MASTER_SWORD);
#endif
play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_4;
play->transitionTrigger = TRANS_TRIGGER_START;
@ -905,7 +905,7 @@ void CutsceneCmd_Destination(PlayState* play, CutsceneContext* csCtx, CsCmdDesti
case CS_DEST_TEMPLE_OF_TIME_AFTER_LIGHT_MEDALLION_ALT:
#if DEBUG_FEATURES
SET_EVENTCHKINF(EVENTCHKINF_WATCHED_SHEIK_AFTER_MASTER_SWORD_CS);
SET_EVENTCHKINF(EVENTCHKINF_REVEALED_MASTER_SWORD);
#endif
play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_4;
play->transitionTrigger = TRANS_TRIGGER_START;

View file

@ -75,64 +75,293 @@ static void* sItemDropTex[] = {
};
static u8 sItemDropIds[] = {
ITEM00_RUPEE_GREEN, ITEM00_RUPEE_BLUE, ITEM00_NONE, ITEM00_NONE, ITEM00_RUPEE_BLUE,
ITEM00_RUPEE_GREEN, ITEM00_MAGIC_SMALL, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_NONE,
ITEM00_MAGIC_SMALL, ITEM00_FLEXIBLE, ITEM00_SEEDS, ITEM00_SEEDS, ITEM00_NONE,
ITEM00_RUPEE_BLUE, ITEM00_RUPEE_GREEN, ITEM00_MAGIC_SMALL, ITEM00_RUPEE_GREEN, ITEM00_RUPEE_BLUE,
ITEM00_RECOVERY_HEART, ITEM00_NONE, ITEM00_RECOVERY_HEART, ITEM00_NONE, ITEM00_FLEXIBLE,
ITEM00_NONE, ITEM00_BOMBS_A, ITEM00_NONE, ITEM00_SEEDS, ITEM00_NONE,
ITEM00_NONE, ITEM00_MAGIC_SMALL, ITEM00_RUPEE_GREEN, ITEM00_RUPEE_GREEN, ITEM00_MAGIC_SMALL,
ITEM00_NONE, ITEM00_RECOVERY_HEART, ITEM00_NONE, ITEM00_NONE, ITEM00_RECOVERY_HEART,
ITEM00_NONE, ITEM00_SEEDS, ITEM00_SEEDS, ITEM00_NONE, ITEM00_BOMBS_A,
ITEM00_NONE, ITEM00_FLEXIBLE, ITEM00_MAGIC_SMALL, ITEM00_RUPEE_GREEN, ITEM00_RUPEE_GREEN,
ITEM00_NUTS, ITEM00_NONE, ITEM00_SEEDS, ITEM00_SEEDS, ITEM00_NUTS,
ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_SEEDS, ITEM00_NONE, ITEM00_FLEXIBLE,
ITEM00_NONE, ITEM00_NONE, ITEM00_NONE, ITEM00_NONE, ITEM00_RUPEE_GREEN,
ITEM00_RUPEE_GREEN, ITEM00_SEEDS, ITEM00_BOMBS_A, ITEM00_MAGIC_SMALL, ITEM00_BOMBS_A,
ITEM00_NONE, ITEM00_NONE, ITEM00_RECOVERY_HEART, ITEM00_NONE, ITEM00_NONE,
ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_NONE, ITEM00_NONE, ITEM00_MAGIC_SMALL,
ITEM00_RUPEE_GREEN, ITEM00_MAGIC_SMALL, ITEM00_RUPEE_GREEN, ITEM00_NONE, ITEM00_RUPEE_BLUE,
ITEM00_NONE, ITEM00_NONE, ITEM00_RECOVERY_HEART, ITEM00_NONE, ITEM00_NONE,
ITEM00_RECOVERY_HEART, ITEM00_FLEXIBLE, ITEM00_SEEDS, ITEM00_SEEDS, ITEM00_NONE,
ITEM00_MAGIC_SMALL, ITEM00_RUPEE_GREEN, ITEM00_RUPEE_BLUE, ITEM00_NONE, ITEM00_RUPEE_GREEN,
ITEM00_NONE, ITEM00_RECOVERY_HEART, ITEM00_NONE, ITEM00_NONE, ITEM00_BOMBS_A,
ITEM00_ARROWS_SMALL, ITEM00_NONE, ITEM00_ARROWS_MEDIUM, ITEM00_MAGIC_SMALL, ITEM00_FLEXIBLE,
ITEM00_NONE, ITEM00_MAGIC_LARGE, ITEM00_RUPEE_GREEN, ITEM00_NONE, ITEM00_RUPEE_BLUE,
ITEM00_NONE, ITEM00_RUPEE_GREEN, ITEM00_RECOVERY_HEART, ITEM00_FLEXIBLE, ITEM00_BOMBS_A,
ITEM00_ARROWS_SMALL, ITEM00_NONE, ITEM00_NONE, ITEM00_NONE, ITEM00_MAGIC_SMALL,
ITEM00_NONE, ITEM00_NONE, ITEM00_MAGIC_LARGE, ITEM00_ARROWS_LARGE, ITEM00_ARROWS_MEDIUM,
ITEM00_ARROWS_MEDIUM, ITEM00_ARROWS_SMALL, ITEM00_ARROWS_SMALL, ITEM00_FLEXIBLE, ITEM00_ARROWS_SMALL,
ITEM00_ARROWS_SMALL, ITEM00_ARROWS_SMALL, ITEM00_ARROWS_MEDIUM, ITEM00_ARROWS_SMALL, ITEM00_ARROWS_SMALL,
ITEM00_ARROWS_SMALL, ITEM00_ARROWS_MEDIUM, ITEM00_ARROWS_LARGE, ITEM00_ARROWS_LARGE, ITEM00_MAGIC_LARGE,
ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_LARGE,
ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_SMALL,
ITEM00_MAGIC_LARGE, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_LARGE,
ITEM00_BOMBS_A, ITEM00_NONE, ITEM00_BOMBS_A, ITEM00_NONE, ITEM00_BOMBS_A,
ITEM00_FLEXIBLE, ITEM00_BOMBS_A, ITEM00_BOMBS_A, ITEM00_BOMBS_A, ITEM00_NONE,
ITEM00_NONE, ITEM00_NONE, ITEM00_NONE, ITEM00_BOMBS_A, ITEM00_NONE,
ITEM00_BOMBS_A, 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_RED, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE,
ITEM00_RUPEE_RED, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_RED,
ITEM00_RUPEE_RED, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_RED, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_RED,
ITEM00_RUPEE_RED, ITEM00_RUPEE_RED, ITEM00_RUPEE_RED, ITEM00_SEEDS, ITEM00_NONE,
ITEM00_NUTS, ITEM00_NONE, ITEM00_STICK, ITEM00_NONE, ITEM00_NONE,
ITEM00_SEEDS, ITEM00_NONE, ITEM00_NONE, ITEM00_NONE, ITEM00_NUTS,
ITEM00_NONE, ITEM00_NUTS, ITEM00_RECOVERY_HEART, ITEM00_SEEDS, ITEM00_RECOVERY_HEART,
ITEM00_NONE, ITEM00_SEEDS, ITEM00_NONE, ITEM00_RECOVERY_HEART, ITEM00_NONE,
ITEM00_NONE, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_NONE, ITEM00_NONE,
ITEM00_RECOVERY_HEART, ITEM00_NONE, ITEM00_RECOVERY_HEART, ITEM00_SEEDS, ITEM00_FLEXIBLE,
// 0
ITEM00_RUPEE_GREEN,
ITEM00_RUPEE_BLUE,
ITEM00_NONE,
ITEM00_NONE,
ITEM00_RUPEE_BLUE,
ITEM00_RUPEE_GREEN,
ITEM00_MAGIC_SMALL,
ITEM00_RECOVERY_HEART,
ITEM00_RECOVERY_HEART,
ITEM00_NONE,
ITEM00_MAGIC_SMALL,
ITEM00_FLEXIBLE,
ITEM00_SEEDS,
ITEM00_SEEDS,
ITEM00_NONE,
ITEM00_RUPEE_BLUE,
// 1
ITEM00_RUPEE_GREEN,
ITEM00_MAGIC_SMALL,
ITEM00_RUPEE_GREEN,
ITEM00_RUPEE_BLUE,
ITEM00_RECOVERY_HEART,
ITEM00_NONE,
ITEM00_RECOVERY_HEART,
ITEM00_NONE,
ITEM00_FLEXIBLE,
ITEM00_NONE,
ITEM00_BOMBS_A,
ITEM00_NONE,
ITEM00_SEEDS,
ITEM00_NONE,
ITEM00_NONE,
ITEM00_MAGIC_SMALL,
// 2
ITEM00_RUPEE_GREEN,
ITEM00_RUPEE_GREEN,
ITEM00_MAGIC_SMALL,
ITEM00_NONE,
ITEM00_RECOVERY_HEART,
ITEM00_NONE,
ITEM00_NONE,
ITEM00_RECOVERY_HEART,
ITEM00_NONE,
ITEM00_SEEDS,
ITEM00_SEEDS,
ITEM00_NONE,
ITEM00_BOMBS_A,
ITEM00_NONE,
ITEM00_FLEXIBLE,
ITEM00_MAGIC_SMALL,
// 3
ITEM00_RUPEE_GREEN,
ITEM00_RUPEE_GREEN,
ITEM00_NUTS,
ITEM00_NONE,
ITEM00_SEEDS,
ITEM00_SEEDS,
ITEM00_NUTS,
ITEM00_RECOVERY_HEART,
ITEM00_RECOVERY_HEART,
ITEM00_SEEDS,
ITEM00_NONE,
ITEM00_FLEXIBLE,
ITEM00_NONE,
ITEM00_NONE,
ITEM00_NONE,
ITEM00_NONE,
// 4
ITEM00_RUPEE_GREEN,
ITEM00_RUPEE_GREEN,
ITEM00_SEEDS,
ITEM00_BOMBS_A,
ITEM00_MAGIC_SMALL,
ITEM00_BOMBS_A,
ITEM00_NONE,
ITEM00_NONE,
ITEM00_RECOVERY_HEART,
ITEM00_NONE,
ITEM00_NONE,
ITEM00_RECOVERY_HEART,
ITEM00_RECOVERY_HEART,
ITEM00_NONE,
ITEM00_NONE,
ITEM00_MAGIC_SMALL,
// 5
ITEM00_RUPEE_GREEN,
ITEM00_MAGIC_SMALL,
ITEM00_RUPEE_GREEN,
ITEM00_NONE,
ITEM00_RUPEE_BLUE,
ITEM00_NONE,
ITEM00_NONE,
ITEM00_RECOVERY_HEART,
ITEM00_NONE,
ITEM00_NONE,
ITEM00_RECOVERY_HEART,
ITEM00_FLEXIBLE,
ITEM00_SEEDS,
ITEM00_SEEDS,
ITEM00_NONE,
ITEM00_MAGIC_SMALL,
// 6
ITEM00_RUPEE_GREEN,
ITEM00_RUPEE_BLUE,
ITEM00_NONE,
ITEM00_RUPEE_GREEN,
ITEM00_NONE,
ITEM00_RECOVERY_HEART,
ITEM00_NONE,
ITEM00_NONE,
ITEM00_BOMBS_A,
ITEM00_ARROWS_SMALL,
ITEM00_NONE,
ITEM00_ARROWS_MEDIUM,
ITEM00_MAGIC_SMALL,
ITEM00_FLEXIBLE,
ITEM00_NONE,
ITEM00_MAGIC_LARGE,
// 7
ITEM00_RUPEE_GREEN,
ITEM00_NONE,
ITEM00_RUPEE_BLUE,
ITEM00_NONE,
ITEM00_RUPEE_GREEN,
ITEM00_RECOVERY_HEART,
ITEM00_FLEXIBLE,
ITEM00_BOMBS_A,
ITEM00_ARROWS_SMALL,
ITEM00_NONE,
ITEM00_NONE,
ITEM00_NONE,
ITEM00_MAGIC_SMALL,
ITEM00_NONE,
ITEM00_NONE,
ITEM00_MAGIC_LARGE,
// 8
ITEM00_ARROWS_LARGE,
ITEM00_ARROWS_MEDIUM,
ITEM00_ARROWS_MEDIUM,
ITEM00_ARROWS_SMALL,
ITEM00_ARROWS_SMALL,
ITEM00_FLEXIBLE,
ITEM00_ARROWS_SMALL,
ITEM00_ARROWS_SMALL,
ITEM00_ARROWS_SMALL,
ITEM00_ARROWS_MEDIUM,
ITEM00_ARROWS_SMALL,
ITEM00_ARROWS_SMALL,
ITEM00_ARROWS_SMALL,
ITEM00_ARROWS_MEDIUM,
ITEM00_ARROWS_LARGE,
ITEM00_ARROWS_LARGE,
// 9
ITEM00_MAGIC_LARGE,
ITEM00_MAGIC_SMALL,
ITEM00_MAGIC_SMALL,
ITEM00_MAGIC_SMALL,
ITEM00_MAGIC_SMALL,
ITEM00_MAGIC_LARGE,
ITEM00_MAGIC_SMALL,
ITEM00_MAGIC_SMALL,
ITEM00_MAGIC_SMALL,
ITEM00_MAGIC_LARGE,
ITEM00_MAGIC_SMALL,
ITEM00_MAGIC_LARGE,
ITEM00_MAGIC_SMALL,
ITEM00_MAGIC_SMALL,
ITEM00_MAGIC_SMALL,
ITEM00_MAGIC_LARGE,
// 10
ITEM00_BOMBS_A,
ITEM00_NONE,
ITEM00_BOMBS_A,
ITEM00_NONE,
ITEM00_BOMBS_A,
ITEM00_FLEXIBLE,
ITEM00_BOMBS_A,
ITEM00_BOMBS_A,
ITEM00_BOMBS_A,
ITEM00_NONE,
ITEM00_NONE,
ITEM00_NONE,
ITEM00_NONE,
ITEM00_BOMBS_A,
ITEM00_NONE,
ITEM00_BOMBS_A,
// 11
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,
// 12
ITEM00_RUPEE_RED,
ITEM00_RUPEE_BLUE,
ITEM00_RUPEE_BLUE,
ITEM00_RUPEE_RED,
ITEM00_RUPEE_BLUE,
ITEM00_RUPEE_BLUE,
ITEM00_RUPEE_BLUE,
ITEM00_RUPEE_RED,
ITEM00_RUPEE_RED,
ITEM00_RUPEE_BLUE,
ITEM00_RUPEE_RED,
ITEM00_RUPEE_BLUE,
ITEM00_RUPEE_RED,
ITEM00_RUPEE_RED,
ITEM00_RUPEE_RED,
ITEM00_RUPEE_RED,
// 13
ITEM00_SEEDS,
ITEM00_NONE,
ITEM00_NUTS,
ITEM00_NONE,
ITEM00_STICK,
ITEM00_NONE,
ITEM00_NONE,
ITEM00_SEEDS,
ITEM00_NONE,
ITEM00_NONE,
ITEM00_NONE,
ITEM00_NUTS,
ITEM00_NONE,
ITEM00_NUTS,
ITEM00_RECOVERY_HEART,
ITEM00_SEEDS,
// 14
ITEM00_RECOVERY_HEART,
ITEM00_NONE,
ITEM00_SEEDS,
ITEM00_NONE,
ITEM00_RECOVERY_HEART,
ITEM00_NONE,
ITEM00_NONE,
ITEM00_RECOVERY_HEART,
ITEM00_RECOVERY_HEART,
ITEM00_NONE,
ITEM00_NONE,
ITEM00_RECOVERY_HEART,
ITEM00_NONE,
ITEM00_RECOVERY_HEART,
ITEM00_SEEDS,
ITEM00_FLEXIBLE,
};
static u8 sDropQuantities[] = {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 1, 1, 3, 1, 3, 1, 1, 1, 3, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, // 3
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, // 4
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, // 5
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, // 10
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 11
3, 3, 3, 1, 3, 3, 3, 1, 1, 3, 1, 3, 1, 1, 1, 3, // 12
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 13
3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, // 14
};
void EnItem00_SetupAction(EnItem00* this, EnItem00ActionFunc actionFunc) {

View file

@ -1,30 +1,47 @@
#include "global.h"
#include "terminal.h"
#include "z_lib.h"
#include "regs.h"
#include "z64horse.h"
#include "z64play.h"
#include "z64player.h"
#include "src/overlays/actors/ovl_En_Horse/z_en_horse.h"
s32 func_8006CFC0(s32 sceneId) {
/**
* Tests if the player horse can be spawned
*
* @param sceneId the checked scene
* @return true if the player horse can appear in the scene, else false
*/
s32 Horse_CanSpawn(s32 sceneId) {
s32 validSceneIds[] = { SCENE_HYRULE_FIELD, SCENE_LAKE_HYLIA, SCENE_GERUDO_VALLEY, SCENE_GERUDOS_FORTRESS,
SCENE_LON_LON_RANCH };
s32 i;
for (i = 0; i < ARRAY_COUNT(validSceneIds); i++) {
if (sceneId == validSceneIds[i]) {
return 1;
return true;
}
}
return 0;
return false;
}
void func_8006D074(PlayState* play) {
/**
* Sets horseData to a neutral spawn in Hyrule Field
*/
void Horse_ResetHorseData(PlayState* play) {
gSaveContext.save.info.horseData.sceneId = SCENE_HYRULE_FIELD;
gSaveContext.save.info.horseData.pos.x = -1840;
gSaveContext.save.info.horseData.pos.y = 72;
gSaveContext.save.info.horseData.pos.z = 5497;
gSaveContext.save.info.horseData.angle = -27353;
gSaveContext.save.info.horseData.angle = -0x6AD9;
}
void func_8006D0AC(PlayState* play) {
/**
* Forces the player horse to spawn in a safe spot if the current spawn is in Lake Hylia
* This prevents the horse from spawning underwater after obtaining the Water Medallion
*/
void Horse_FixLakeHyliaPosition(PlayState* play) {
if (gSaveContext.save.info.horseData.sceneId == SCENE_LAKE_HYLIA) {
gSaveContext.save.info.horseData.sceneId = SCENE_LAKE_HYLIA;
gSaveContext.save.info.horseData.pos.x = -2065;
@ -41,49 +58,59 @@ typedef struct HorseSpawn {
/* 0x0A */ s16 type;
} HorseSpawn;
void func_8006D0EC(PlayState* play, Player* player) {
void Horse_SetupInGameplay(PlayState* play, Player* player) {
s32 i;
HorseSpawn horseSpawns[] = {
{ SCENE_HYRULE_FIELD, -460, 100, 6640, 0, 2 }, { SCENE_LAKE_HYLIA, -1929, -1025, 768, 0, 2 },
{ SCENE_GERUDO_VALLEY, 2566, -259, 767, 0, 2 }, { SCENE_GERUDOS_FORTRESS, -328, 10, 953, 0, 2 },
{ SCENE_LON_LON_RANCH, 928, 0, -2280, 0, 2 },
{ SCENE_HYRULE_FIELD, -460, 100, 6640, 0, HORSE_PTYPE_INACTIVE },
{ SCENE_LAKE_HYLIA, -1929, -1025, 768, 0, HORSE_PTYPE_INACTIVE },
{ SCENE_GERUDO_VALLEY, 2566, -259, 767, 0, HORSE_PTYPE_INACTIVE },
{ SCENE_GERUDOS_FORTRESS, -328, 10, 953, 0, HORSE_PTYPE_INACTIVE },
{ SCENE_LON_LON_RANCH, 928, 0, -2280, 0, HORSE_PTYPE_INACTIVE },
};
if ((AREG(6) != 0) && (Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED) || (DREG(1) != 0))) {
player->rideActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, player->actor.world.pos.x,
player->actor.world.pos.y, player->actor.world.pos.z, player->actor.shape.rot.x,
player->actor.shape.rot.y, player->actor.shape.rot.z, 9);
if (R_EXITED_SCENE_RIDING_HORSE &&
(Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED) || R_DEBUG_FORCE_EPONA_OBTAINED)) {
// Player entering scene on top of horse
player->rideActor =
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, player->actor.world.pos.x, player->actor.world.pos.y,
player->actor.world.pos.z, player->actor.shape.rot.x, player->actor.shape.rot.y,
player->actor.shape.rot.z, HORSE_PTYPE_PLAYER_SPAWNED_RIDING);
ASSERT(player->rideActor != NULL, "player->ride.actor != NULL", "../z_horse.c", 343);
Actor_MountHorse(play, player, player->rideActor);
func_8002DE74(play, player);
Actor_RequestHorseCameraSetting(play, player);
gSaveContext.save.info.horseData.sceneId = play->sceneId;
if (play->sceneId == SCENE_GERUDOS_FORTRESS) {
player->rideActor->room = -1;
}
} else if ((play->sceneId == SCENE_GERUDOS_FORTRESS) && (gSaveContext.minigameState == 3)) {
// Completed Horseback Archery Minigame
Actor* horseActor;
gSaveContext.minigameState = 0;
horseActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, 3586.0f, 1413.0f, -402.0f, 0, 0x4000, 0, 1);
horseActor =
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, 3586.0f, 1413.0f, -402.0f, 0, 0x4000, 0, HORSE_PTYPE_1);
horseActor->room = -1;
} else if ((gSaveContext.save.entranceIndex == ENTR_LON_LON_RANCH_7) &&
GET_EVENTCHKINF(EVENTCHKINF_EPONA_OBTAINED)) {
// Completed Horse Race
Actor* horseActor =
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, -25.0f, 0.0f, -1600.0f, 0, -0x4000, 0, 1);
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, -25.0f, 0.0f, -1600.0f, 0, -0x4000, 0, HORSE_PTYPE_1);
ASSERT(horseActor != NULL, "horse_actor != NULL", "../z_horse.c", 389);
} else if ((play->sceneId == gSaveContext.save.info.horseData.sceneId) &&
(Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED) || DREG(1) != 0)) {
(Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED) || R_DEBUG_FORCE_EPONA_OBTAINED)) {
// Player enters a scene where the horse was left previously
PRINTF(T("馬存在によるセット %d %d %d\n", "Set by existence of horse %d %d %d\n"),
gSaveContext.save.info.horseData.sceneId, Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED), DREG(1));
gSaveContext.save.info.horseData.sceneId, Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED),
R_DEBUG_FORCE_EPONA_OBTAINED);
if (func_8006CFC0(gSaveContext.save.info.horseData.sceneId)) {
if (Horse_CanSpawn(gSaveContext.save.info.horseData.sceneId)) {
Actor* horseActor =
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, gSaveContext.save.info.horseData.pos.x,
gSaveContext.save.info.horseData.pos.y, gSaveContext.save.info.horseData.pos.z, 0,
gSaveContext.save.info.horseData.angle, 0, 1);
gSaveContext.save.info.horseData.angle, 0, HORSE_PTYPE_1);
ASSERT(horseActor != NULL, "horse_actor != NULL", "../z_horse.c", 414);
if (play->sceneId == SCENE_GERUDOS_FORTRESS) {
horseActor->room = -1;
}
@ -93,13 +120,16 @@ void func_8006D0EC(PlayState* play, Player* player) {
T("Horse_SetNormal():%d セットスポットまずいです。\n", "Horse_SetNormal():%d set spot is no good.\n"),
gSaveContext.save.info.horseData.sceneId);
PRINTF(VT_RST);
func_8006D074(play);
Horse_ResetHorseData(play);
}
} else if ((play->sceneId == SCENE_LON_LON_RANCH) && !Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED) &&
(DREG(1) == 0)) {
Actor* horseActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, 0.0f, 0.0f, -500.0f, 0, 0, 0, 1);
} else if ((play->sceneId == SCENE_LON_LON_RANCH) &&
!(Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED) || R_DEBUG_FORCE_EPONA_OBTAINED)) {
// Player spawns in Lon-Lon Ranch without owning Epona
Actor* horseActor =
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, 0.0f, 0.0f, -500.0f, 0, 0, 0, HORSE_PTYPE_1);
ASSERT(horseActor != NULL, "horse_actor != NULL", "../z_horse.c", 443);
} else if (Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED) || (DREG(1) != 0)) {
} else if (Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED) || R_DEBUG_FORCE_EPONA_OBTAINED) {
// Player owns Epona, but isn't riding her and the current scene is not the same as the horse's last location.
for (i = 0; i < ARRAY_COUNT(horseSpawns); i++) {
HorseSpawn* horseSpawn = &horseSpawns[i];
if (horseSpawn->sceneId == play->sceneId) {
@ -107,135 +137,145 @@ void func_8006D0EC(PlayState* play, Player* player) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, horseSpawn->pos.x, horseSpawn->pos.y,
horseSpawn->pos.z, 0, horseSpawn->angle, 0, horseSpawn->type);
ASSERT(horseActor != NULL, "horse_actor != NULL", "../z_horse.c", 466);
if (play->sceneId == SCENE_GERUDOS_FORTRESS) {
horseActor->room = -1;
}
break;
}
}
} else if (!Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED)) {
if ((DREG(1) == 0) && (play->sceneId == SCENE_LON_LON_BUILDINGS) && !IS_DAY) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, 0.0f, 0.0f, -60.0f, 0, 0x7360, 0, 1);
}
} else if (!(Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED) || R_DEBUG_FORCE_EPONA_OBTAINED) &&
(play->sceneId == SCENE_LON_LON_BUILDINGS) && !IS_DAY) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, 0.0f, 0.0f, -60.0f, 0, 0x7360, 0, HORSE_PTYPE_1);
}
}
typedef struct struct_8011F9B8 {
typedef struct HorseCutsceneSpawn {
/* 0x00 */ s16 sceneId;
/* 0x04 */ s32 cutsceneIndex;
/* 0x08 */ Vec3s pos;
/* 0x0E */ s16 angle;
/* 0x10 */ s16 type;
} struct_8011F9B8;
} HorseCutsceneSpawn;
void func_8006D684(PlayState* play, Player* player) {
static struct_8011F9B8 D_8011F9B8[] = {
{ SCENE_GERUDOS_FORTRESS, 0xFFF0, { 3600, 1413, 360 }, 0x8001, 8 },
{ SCENE_LON_LON_RANCH, 0xFFF0, { -250, 1, -1580 }, 0x4000, 6 },
{ SCENE_LON_LON_RANCH, 0xFFF1, { 0, 0, 0 }, 0x0000, 5 },
{ SCENE_LON_LON_RANCH, 0xFFF5, { 0, 0, 0 }, 0x0000, 7 },
{ SCENE_HYRULE_FIELD, 0xFFF3, { -2961, 313, 7700 }, 0x0000, 7 },
{ SCENE_HYRULE_FIELD, 0xFFF4, { -1900, 313, 7015 }, 0x0000, 7 },
{ SCENE_HYRULE_FIELD, 0xFFF5, { -4043, 313, 6933 }, 0x0000, 7 },
{ SCENE_HYRULE_FIELD, 0xFFF6, { -4043, 313, 6933 }, 0x0000, 7 },
void Horse_SetupInCutscene(PlayState* play, Player* player) {
static HorseCutsceneSpawn horseSpawns[] = {
{ SCENE_GERUDOS_FORTRESS, 0xFFF0, { 3600, 1413, 360 }, 0x8001, HORSE_PTYPE_HORSEBACK_ARCHERY },
{ SCENE_LON_LON_RANCH, 0xFFF0, { -250, 1, -1580 }, 0x4000, HORSE_PTYPE_6 }, // Horse Race
{ SCENE_LON_LON_RANCH, 0xFFF1, { 0, 0, 0 }, 0x0000, HORSE_PTYPE_5 }, // Learned Epona's Song
{ SCENE_LON_LON_RANCH, 0xFFF5, { 0, 0, 0 }, 0x0000, HORSE_PTYPE_7 }, // Credits
{ SCENE_HYRULE_FIELD, 0xFFF3, { -2961, 313, 7700 }, 0x0000, HORSE_PTYPE_7 }, // Title Screen
{ SCENE_HYRULE_FIELD, 0xFFF4, { -1900, 313, 7015 }, 0x0000, HORSE_PTYPE_7 },
{ SCENE_HYRULE_FIELD, 0xFFF5, { -4043, 313, 6933 }, 0x0000, HORSE_PTYPE_7 }, // Credits
{ SCENE_HYRULE_FIELD, 0xFFF6, { -4043, 313, 6933 }, 0x0000, HORSE_PTYPE_7 }, // Unused. Hopping Lon Lon
// Ranch North Gate
};
s32 pad;
s32 i;
Vec3s spawnPos;
if ((gSaveContext.save.entranceIndex == ENTR_HYRULE_FIELD_11 ||
gSaveContext.save.entranceIndex == ENTR_HYRULE_FIELD_12 ||
gSaveContext.save.entranceIndex == ENTR_HYRULE_FIELD_13 ||
gSaveContext.save.entranceIndex == ENTR_HYRULE_FIELD_15) &&
(gSaveContext.respawnFlag == 0)) {
// Epona hopping over one of the Lon Lon Ranch fences
Vec3s spawnPos;
Vec3s spawnPositions[] = {
{ -2961, 313, 7700 },
{ -1900, 313, 7015 },
{ -4043, 313, 6933 },
{ -2313, 313, 5990 },
// Note: The east and west positions are paired with the wrong entranceIndex. However, the subsequent
// cutscene repositions the horse will override these coordinates while the horse is still obstructed, so no
// visual glitch occurs.
{ -2961, 313, 7700 }, // South
{ -1900, 313, 7015 }, // East
{ -4043, 313, 6933 }, // West
{ -2313, 313, 5990 }, // North-East
};
// South of Lon Lon player spawn
if (gSaveContext.save.entranceIndex == ENTR_HYRULE_FIELD_11) {
spawnPos = spawnPositions[0];
// West of Lon Lon player spawn
} else if (gSaveContext.save.entranceIndex == ENTR_HYRULE_FIELD_12) {
spawnPos = spawnPositions[1];
// East of Lon Lon player spawn
} else if (gSaveContext.save.entranceIndex == ENTR_HYRULE_FIELD_13) {
spawnPos = spawnPositions[2];
// Lon Lon exit player spawn
} else {
spawnPos = spawnPositions[3];
}
player->rideActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, spawnPos.x, spawnPos.y, spawnPos.z, 0,
player->actor.world.rot.y, 0, 7);
player->actor.world.rot.y, 0, HORSE_PTYPE_7);
ASSERT(player->rideActor != NULL, "player->ride.actor != NULL", "../z_horse.c", 561);
Actor_MountHorse(play, player, player->rideActor);
func_8002DE74(play, player);
Actor_RequestHorseCameraSetting(play, player);
gSaveContext.save.info.horseData.sceneId = play->sceneId;
} else if ((play->sceneId == SCENE_LON_LON_RANCH) &&
(GET_EVENTINF_INGORACE_STATE() == INGORACE_STATE_TRAPPED_WIN_EPONA) &&
!Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED) && (DREG(1) == 0)) {
(GET_EVENTINF_INGO_RACE_STATE() == INGO_RACE_STATE_TRAPPED_WIN_EPONA) &&
!(Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED) || R_DEBUG_FORCE_EPONA_OBTAINED)) {
player->rideActor =
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, 894.0f, 0.0f, -2084.0f, 0, -0x7FFF, 0, 5);
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, 894.0f, 0.0f, -2084.0f, 0, -0x7FFF, 0, HORSE_PTYPE_5);
ASSERT(player->rideActor != NULL, "player->ride.actor != NULL", "../z_horse.c", 582);
Actor_MountHorse(play, player, player->rideActor);
func_8002DE74(play, player);
Actor_RequestHorseCameraSetting(play, player);
gSaveContext.save.info.horseData.sceneId = play->sceneId;
if (play->sceneId == SCENE_GERUDOS_FORTRESS) {
player->rideActor->room = -1;
}
} else {
for (i = 0; i < ARRAY_COUNT(D_8011F9B8); i++) {
if ((play->sceneId == D_8011F9B8[i].sceneId) &&
(((void)0, gSaveContext.save.cutsceneIndex) == D_8011F9B8[i].cutsceneIndex)) {
if (D_8011F9B8[i].type == 7) {
for (i = 0; i < ARRAY_COUNT(horseSpawns); i++) {
if ((play->sceneId == horseSpawns[i].sceneId) &&
(((void)0, gSaveContext.save.cutsceneIndex) == horseSpawns[i].cutsceneIndex)) {
if (horseSpawns[i].type == HORSE_PTYPE_7) {
if ((play->sceneId == SCENE_LON_LON_RANCH) &&
(((void)0, gSaveContext.save.cutsceneIndex) == 0xFFF1)) {
D_8011F9B8[i].pos.x = player->actor.world.pos.x;
D_8011F9B8[i].pos.y = player->actor.world.pos.y;
D_8011F9B8[i].pos.z = player->actor.world.pos.z;
horseSpawns[i].pos.x = player->actor.world.pos.x;
horseSpawns[i].pos.y = player->actor.world.pos.y;
horseSpawns[i].pos.z = player->actor.world.pos.z;
}
player->rideActor =
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, D_8011F9B8[i].pos.x, D_8011F9B8[i].pos.y,
D_8011F9B8[i].pos.z, 0, player->actor.world.rot.y, 0, D_8011F9B8[i].type);
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, horseSpawns[i].pos.x, horseSpawns[i].pos.y,
horseSpawns[i].pos.z, 0, player->actor.world.rot.y, 0, horseSpawns[i].type);
ASSERT(player->rideActor != NULL, "player->ride.actor != NULL", "../z_horse.c", 628);
Actor_MountHorse(play, player, player->rideActor);
func_8002DE74(play, player);
} else if ((D_8011F9B8[i].type == 5) || (D_8011F9B8[i].type == 6) || (D_8011F9B8[i].type == 8)) {
Vec3f sp54;
s32 temp = 0;
Actor_RequestHorseCameraSetting(play, player);
} else if ((horseSpawns[i].type == HORSE_PTYPE_5) || (horseSpawns[i].type == HORSE_PTYPE_6) ||
(horseSpawns[i].type == HORSE_PTYPE_HORSEBACK_ARCHERY)) {
Vec3f eye;
s32 paramFlag = 0;
if (GET_EVENTINF_INGORACE_HORSETYPE() != HORSE_EPONA && D_8011F9B8[i].type == 6) {
temp = 0x8000;
if (GET_EVENTINF_INGO_RACE_HORSETYPE() != HORSE_EPONA && horseSpawns[i].type == HORSE_PTYPE_6) {
// HORSE_HNI
paramFlag = 0x8000;
}
player->rideActor =
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, D_8011F9B8[i].pos.x, D_8011F9B8[i].pos.y,
D_8011F9B8[i].pos.z, 0, D_8011F9B8[i].angle, 0, D_8011F9B8[i].type | temp);
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, horseSpawns[i].pos.x, horseSpawns[i].pos.y,
horseSpawns[i].pos.z, 0, horseSpawns[i].angle, 0, horseSpawns[i].type | paramFlag);
ASSERT(player->rideActor != NULL, "player->ride.actor != NULL", "../z_horse.c", 667);
player->actor.world.pos.x = D_8011F9B8[i].pos.x;
player->actor.world.pos.y = D_8011F9B8[i].pos.y;
player->actor.world.pos.z = D_8011F9B8[i].pos.z;
player->actor.world.pos.x = horseSpawns[i].pos.x;
player->actor.world.pos.y = horseSpawns[i].pos.y;
player->actor.world.pos.z = horseSpawns[i].pos.z;
player->actor.shape.rot.x = player->actor.shape.rot.z = 0;
player->actor.shape.rot.y = D_8011F9B8[i].angle;
player->actor.shape.rot.y = horseSpawns[i].angle;
Actor_MountHorse(play, player, player->rideActor);
func_8002DE74(play, player);
Actor_RequestHorseCameraSetting(play, player);
sp54.x = player->actor.world.pos.x - 200.0f;
sp54.y = player->actor.world.pos.y + 100.0f;
sp54.z = player->actor.world.pos.z;
eye.x = player->actor.world.pos.x - 200.0f;
eye.y = player->actor.world.pos.y + 100.0f;
eye.z = player->actor.world.pos.z;
Play_SetCameraAtEye(play, play->activeCamId, &player->actor.world.pos, &sp54);
Play_SetCameraAtEye(play, play->activeCamId, &player->actor.world.pos, &eye);
} else {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, D_8011F9B8[i].pos.x, D_8011F9B8[i].pos.y,
D_8011F9B8[i].pos.z, 0, D_8011F9B8[i].angle, 0, D_8011F9B8[i].type);
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, horseSpawns[i].pos.x, horseSpawns[i].pos.y,
horseSpawns[i].pos.z, 0, horseSpawns[i].angle, 0, horseSpawns[i].type);
}
break;
}
@ -243,42 +283,49 @@ void func_8006D684(PlayState* play, Player* player) {
}
}
void func_8006DC68(PlayState* play, Player* player) {
/**
* Initializes the player's horse, but only if required.
*
* This function should be called during `Play_Init`.
*/
void Horse_InitPlayerHorse(PlayState* play, Player* player) {
if (LINK_IS_ADULT) {
if (!func_8006CFC0(gSaveContext.save.info.horseData.sceneId)) {
if (!Horse_CanSpawn(gSaveContext.save.info.horseData.sceneId)) {
PRINTF(VT_COL(RED, WHITE));
PRINTF(
T("Horse_Set_Check():%d セットスポットまずいです。\n", "Horse_Set_Check():%d set spot is no good.\n"),
gSaveContext.save.info.horseData.sceneId);
PRINTF(VT_RST);
func_8006D074(play);
Horse_ResetHorseData(play);
}
if (func_8006CFC0(play->sceneId)) {
if (Horse_CanSpawn(play->sceneId)) {
if (IS_CUTSCENE_LAYER ||
// has hopped over one of the Lon-Lon Ranch fences
((gSaveContext.save.entranceIndex == ENTR_HYRULE_FIELD_11 ||
gSaveContext.save.entranceIndex == ENTR_HYRULE_FIELD_12 ||
gSaveContext.save.entranceIndex == ENTR_HYRULE_FIELD_13 ||
gSaveContext.save.entranceIndex == ENTR_HYRULE_FIELD_15) &&
(gSaveContext.respawnFlag == 0)) ||
// trapped in Lon Lon Ranch
((play->sceneId == SCENE_LON_LON_RANCH) &&
(GET_EVENTINF_INGORACE_STATE() == INGORACE_STATE_TRAPPED_WIN_EPONA) &&
!Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED) && (DREG(1) == 0))) {
func_8006D684(play, player);
(GET_EVENTINF_INGO_RACE_STATE() == INGO_RACE_STATE_TRAPPED_WIN_EPONA) &&
!(Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED) || R_DEBUG_FORCE_EPONA_OBTAINED))) {
Horse_SetupInCutscene(play, player);
} else {
func_8006D0EC(play, player);
Horse_SetupInGameplay(play, player);
}
}
}
}
void func_8006DD9C(Actor* actor, Vec3f* arg1, s16 arg2) {
s16 x = Math_Vec3f_Yaw(&actor->world.pos, arg1) - actor->world.rot.y;
void Horse_RotateToPoint(Actor* actor, Vec3f* pos, s16 turnAmount) {
s16 x = Math_Vec3f_Yaw(&actor->world.pos, pos) - actor->world.rot.y;
if (x > arg2) {
actor->world.rot.y += arg2;
} else if (x < -arg2) {
actor->world.rot.y -= arg2;
if (x > turnAmount) {
actor->world.rot.y += turnAmount;
} else if (x < -turnAmount) {
actor->world.rot.y -= turnAmount;
} else {
actor->world.rot.y += x;
}

View file

@ -905,7 +905,7 @@ f32 sFontWidths[144] = {
5.0f, // '|'
7.0f, // '}'
10.0f, // '~'
10.0f, // ''
10.0f, // ' '
12.0f, // 'À'
#if OOT_NTSC
12.0f, // 'î'
@ -3444,7 +3444,7 @@ void Message_DrawMain(PlayState* play, Gfx** p) {
if (msgCtx->disableWarpSongs || interfaceCtx->restrictions.warpSongs == 3) {
Message_StartTextbox(play, 0x88C, NULL); // "You can't warp here!"
play->msgCtx.ocarinaMode = OCARINA_MODE_04;
} else if (GET_EVENTINF_INGORACE_STATE() != INGORACE_STATE_HORSE_RENTAL_PERIOD) {
} else if (GET_EVENTINF_INGO_RACE_STATE() != INGO_RACE_STATE_HORSE_RENTAL_PERIOD) {
Message_StartTextbox(play, msgCtx->lastPlayedSong + 0x88D,
NULL); // "Warp to [place name]?"
play->msgCtx.ocarinaMode = OCARINA_MODE_01;
@ -4247,7 +4247,7 @@ void Message_Update(PlayState* play) {
if (Message_ShouldAdvance(play)) {
PRINTF("OCARINA_MODE=%d -> ", play->msgCtx.ocarinaMode);
play->msgCtx.ocarinaMode = (msgCtx->choiceIndex == 0) ? OCARINA_MODE_02 : OCARINA_MODE_04;
PRINTF("InRaceSeq=%d(%d) OCARINA_MODE=%d --> ", GET_EVENTINF_INGORACE_STATE(), 1,
PRINTF("InRaceSeq=%d(%d) OCARINA_MODE=%d --> ", GET_EVENTINF_INGO_RACE_STATE(), 1,
play->msgCtx.ocarinaMode);
Message_CloseTextbox(play);
PRINTF("OCARINA_MODE=%d\n", play->msgCtx.ocarinaMode);

View file

@ -1,6 +1,7 @@
#include "global.h"
#include "terminal.h"
#include "versions.h"
#include "z64horse.h"
#include "assets/textures/parameter_static/parameter_static.h"
#include "assets/textures/do_action_static/do_action_static.h"
#include "assets/textures/icon_item_static/icon_item_static.h"
@ -790,7 +791,7 @@ void func_80083108(PlayState* play) {
gSaveContext.hudVisibilityMode = HUD_VISIBILITY_NO_CHANGE;
Interface_ChangeHudVisibilityMode(HUD_VISIBILITY_ALL);
}
} else if (GET_EVENTINF_INGORACE_STATE() == INGORACE_STATE_HORSE_RENTAL_PERIOD) {
} else if (GET_EVENTINF_INGO_RACE_STATE() == INGO_RACE_STATE_HORSE_RENTAL_PERIOD) {
if (player->stateFlags1 & PLAYER_STATE1_23) {
if ((gSaveContext.save.info.equips.buttonItems[0] != ITEM_NONE) &&
(gSaveContext.save.info.equips.buttonItems[0] != ITEM_BOW)) {
@ -1387,7 +1388,7 @@ u8 Item_Give(PlayState* play, u8 item) {
PRINTF(VT_RST);
if (item == ITEM_MEDALLION_WATER) {
func_8006D0AC(play);
Horse_FixLakeHyliaPosition(play);
}
return ITEM_NONE;
@ -3544,8 +3545,8 @@ void Interface_Draw(PlayState* play) {
for (svar1 = 0; svar1 < ARRAY_COUNT(gSpoilingItems); svar1++) {
if (INV_CONTENT(ITEM_TRADE_ADULT) == gSpoilingItems[svar1]) {
#if OOT_VERSION >= NTSC_1_1
RESET_EVENTINF_INGORACE();
PRINTF("EVENT_INF=%x\n", gSaveContext.eventInf[EVENTINF_INDEX_INGORACE]);
RESET_EVENTINF_INGO_RACE();
PRINTF("EVENT_INF=%x\n", gSaveContext.eventInf[EVENTINF_INDEX_INGO_RACE]);
#endif
play->nextEntranceIndex = spoilingItemEntrances[svar1];
INV_CONTENT(gSpoilingItemReverts[svar1]) = gSpoilingItemReverts[svar1];

View file

@ -4,6 +4,7 @@
#include "quake.h"
#include "terminal.h"
#include "versions.h"
#include "line_numbers.h"
#if PLATFORM_N64
#include "n64dd.h"
#endif
@ -176,21 +177,7 @@ void Play_SetupTransition(PlayState* this, s32 transitionType) {
break;
default:
#if OOT_VERSION < NTSC_1_1
HUNGUP_AND_CRASH("../z_play.c", 2263);
#elif OOT_VERSION < PAL_1_0
HUNGUP_AND_CRASH("../z_play.c", 2266);
#elif OOT_VERSION < PAL_1_1
HUNGUP_AND_CRASH("../z_play.c", 2269);
#elif OOT_VERSION < GC_JP
HUNGUP_AND_CRASH("../z_play.c", 2272);
#elif OOT_VERSION < GC_EU_MQ_DBG
HUNGUP_AND_CRASH("../z_play.c", 2287);
#elif OOT_VERSION < GC_JP_CE
HUNGUP_AND_CRASH("../z_play.c", 2290);
#else
HUNGUP_AND_CRASH("../z_play.c", 2293);
#endif
HUNGUP_AND_CRASH("../z_play.c", LN5(2263, 2266, 2269, 2272, 2287, 2290, 2293));
break;
}
}
@ -502,7 +489,7 @@ void Play_Init(GameState* thisx) {
Environment_PlaySceneSequence(this);
gSaveContext.seqId = this->sceneSequences.seqId;
gSaveContext.natureAmbienceId = this->sceneSequences.natureAmbienceId;
func_8002DF18(this, GET_PLAYER(this));
Actor_InitPlayerHorse(this, GET_PLAYER(this));
AnimTaskQueue_Update(this, &this->animTaskQueue);
gSaveContext.respawnFlag = 0;
@ -1892,6 +1879,7 @@ void Play_LoadToLastEntrance(PlayState* this) {
(gSaveContext.save.entranceIndex == ENTR_HYRULE_FIELD_12) ||
(gSaveContext.save.entranceIndex == ENTR_HYRULE_FIELD_13) ||
(gSaveContext.save.entranceIndex == ENTR_HYRULE_FIELD_15)) {
// Avoid re-triggering the hop over Lon Lon fence cutscenes
this->nextEntranceIndex = ENTR_HYRULE_FIELD_6;
#endif
} else {

View file

@ -2,6 +2,7 @@
#include "fault.h"
#include "terminal.h"
#include "versions.h"
#include "line_numbers.h"
#if PLATFORM_N64
#include "n64dd.h"
#endif
@ -456,14 +457,11 @@ RoomShapeImageMultiBgEntry* Room_GetImageMultiBgEntry(RoomShapeImageMulti* roomS
PRINTF(VT_COL(RED, WHITE) T("z_room.c:カメラIDに一致するデータが存在しません camid=%d\n",
"z_room.c: Data consistent with camera id does not exist camid=%d\n") VT_RST,
bgCamIndex);
#if OOT_VERSION < NTSC_1_1
Fault_AddHungupAndCrash("../z_room.c", 724);
#elif OOT_VERSION < PAL_1_0
Fault_AddHungupAndCrash("../z_room.c", 727);
#elif OOT_VERSION < GC_JP
Fault_AddHungupAndCrash("../z_room.c", 721);
#else
#if PLATFORM_GC
LogUtils_HungupThread("../z_room.c", 726);
#else
Fault_AddHungupAndCrash("../z_room.c", LN2(724, 727, 721));
#endif
return NULL;
@ -547,14 +545,10 @@ void Room_DrawImage(PlayState* play, Room* room, u32 flags) {
} else if (roomShape->amountType == ROOM_SHAPE_IMAGE_AMOUNT_MULTI) {
Room_DrawImageMulti(play, room, flags);
} else {
#if OOT_VERSION < NTSC_1_1
Fault_AddHungupAndCrash("../z_room.c", 849);
#elif OOT_VERSION < PAL_1_0
Fault_AddHungupAndCrash("../z_room.c", 852);
#elif OOT_VERSION < GC_JP
Fault_AddHungupAndCrash("../z_room.c", 836);
#else
#if PLATFORM_GC
LogUtils_HungupThread("../z_room.c", 841);
#else
Fault_AddHungupAndCrash("../z_room.c", LN2(849, 852, 836));
#endif
}
}

View file

@ -325,14 +325,14 @@ void Sram_InitDebugSave(void) {
gSaveContext.save.info.horseData.pos.y = 72;
gSaveContext.save.info.horseData.pos.z = 5497;
gSaveContext.save.info.horseData.angle = -0x6AD9;
gSaveContext.save.info.infTable[0] |= GET_INFTABLE_MASK(INFTABLE_00) | GET_INFTABLE_MASK(INFTABLE_03) |
GET_INFTABLE_MASK(INFTABLE_0C) | GET_INFTABLE_MASK(INFTABLE_0E);
gSaveContext.save.info.infTable[INFTABLE_INDEX_0] |= INFTABLE_MASK(INFTABLE_00) | INFTABLE_MASK(INFTABLE_03) |
INFTABLE_MASK(INFTABLE_0C) | INFTABLE_MASK(INFTABLE_0E);
gSaveContext.save.info.eventChkInf[0] |=
GET_EVENTCHKINF_MASK(EVENTCHKINF_00_UNUSED) | GET_EVENTCHKINF_MASK(EVENTCHKINF_01_UNUSED) |
GET_EVENTCHKINF_MASK(EVENTCHKINF_MIDO_DENIED_DEKU_TREE_ACCESS) | GET_EVENTCHKINF_MASK(EVENTCHKINF_03) |
GET_EVENTCHKINF_MASK(EVENTCHKINF_04) | GET_EVENTCHKINF_MASK(EVENTCHKINF_05) |
GET_EVENTCHKINF_MASK(EVENTCHKINF_09) | GET_EVENTCHKINF_MASK(EVENTCHKINF_0C);
gSaveContext.save.info.eventChkInf[EVENTCHKINF_INDEX_0] |=
EVENTCHKINF_MASK(EVENTCHKINF_00_UNUSED) | EVENTCHKINF_MASK(EVENTCHKINF_01_UNUSED) |
EVENTCHKINF_MASK(EVENTCHKINF_MIDO_DENIED_DEKU_TREE_ACCESS) | EVENTCHKINF_MASK(EVENTCHKINF_03) |
EVENTCHKINF_MASK(EVENTCHKINF_04) | EVENTCHKINF_MASK(EVENTCHKINF_05) | EVENTCHKINF_MASK(EVENTCHKINF_09) |
EVENTCHKINF_MASK(EVENTCHKINF_0C);
SET_EVENTCHKINF(EVENTCHKINF_80);
SET_EVENTCHKINF(EVENTCHKINF_C4);
@ -505,7 +505,7 @@ void Sram_OpenSave(SramContext* sramCtx) {
// if zelda cutscene has been watched but lullaby was not obtained, restore cutscene and take away letter
if (GET_EVENTCHKINF(EVENTCHKINF_40) && !CHECK_QUEST_ITEM(QUEST_SONG_LULLABY)) {
i = gSaveContext.save.info.eventChkInf[EVENTCHKINF_INDEX_40] & ~GET_EVENTCHKINF_MASK(EVENTCHKINF_40);
i = gSaveContext.save.info.eventChkInf[EVENTCHKINF_INDEX_40] & ~EVENTCHKINF_MASK(EVENTCHKINF_40);
gSaveContext.save.info.eventChkInf[EVENTCHKINF_INDEX_40] = i;
INV_CONTENT(ITEM_ZELDAS_LETTER) = ITEM_CHICKEN;

View file

@ -3,7 +3,7 @@
#include "libc64/os_malloc.h"
#include "terminal.h"
#if PLATFORM_GC
#if !PLATFORM_N64
#define FILL_ALLOC_BLOCK_FLAG (1 << 0)
#define FILL_FREE_BLOCK_FLAG (1 << 1)

View file

@ -5,6 +5,7 @@
#include "n64dd.h"
#include "stack.h"
#include "versions.h"
#include "line_numbers.h"
#pragma increment_block_number "ntsc-1.0:128 ntsc-1.1:128 ntsc-1.2:128 pal-1.0:128 pal-1.1:128"
@ -112,14 +113,9 @@ void func_801C6FD8(void) {
// Adds a HungupAndCrash
void func_801C7018(void) {
if (D_80121213 != 0) {
#if OOT_VERSION < NTSC_1_1
Fault_AddHungupAndCrash("../z_n64dd.c", 503);
#elif OOT_VERSION < PAL_1_0
Fault_AddHungupAndCrash("../z_n64dd.c", 551);
#else
Fault_AddHungupAndCrash("../z_n64dd.c", 573);
#endif
Fault_AddHungupAndCrash("../z_n64dd.c", LN2(503, 551, 573));
}
D_80121213 = 1;
}

View file

@ -699,9 +699,8 @@ static s16 sExItemTypes[] = { EXITEM_MAGIC_WIND, EXITEM_MAGIC_FIRE, EXITEM_MAGIC
#define GREAT_FAIRY_SET_MAGIC_SPELL_OBTAINED(exItemIndex) \
gSaveContext.save.info.itemGetInf[ITEMGETINF_INDEX_GREAT_FAIRY_ITEM] |= sItemGetFlagMasks[exItemIndex];
static s16 sItemGetFlagMasks[] = { GET_ITEMGETINF_MASK(ITEMGETINF_FARORES_WIND),
GET_ITEMGETINF_MASK(ITEMGETINF_DINS_FIRE),
GET_ITEMGETINF_MASK(ITEMGETINF_NAYRUS_LOVE) };
static s16 sItemGetFlagMasks[] = { ITEMGETINF_MASK(ITEMGETINF_FARORES_WIND), ITEMGETINF_MASK(ITEMGETINF_DINS_FIRE),
ITEMGETINF_MASK(ITEMGETINF_NAYRUS_LOVE) };
static u8 sItemIds[] = { ITEM_FARORES_WIND, ITEM_DINS_FIRE, ITEM_NAYRUS_LOVE };

View file

@ -84,7 +84,7 @@ void BgGndIceblock_Destroy(Actor* thisx, PlayState* play) {
* | 3 h8 15 19 |
* | 4 9 11 XX *20*|
* |*5* XX 12 *21*|
*
* ----------------------
* XX are rocks
* ** are pits
* h is the hole.

View file

@ -52,7 +52,7 @@ void BgInGate_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->dyna.actor, 0.1f);
if ((PARAMS_GET_U(this->dyna.actor.params, 0, 1) != 0) &&
(GET_EVENTINF_INGORACE_STATE() == INGORACE_STATE_TRAPPED_WIN_EPONA)) {
(GET_EVENTINF_INGO_RACE_STATE() == INGO_RACE_STATE_TRAPPED_WIN_EPONA)) {
play->csCtx.curFrame = 0;
BgInGate_SetupAction(this, func_80892890);
} else {

View file

@ -18,9 +18,9 @@ void func_808BAF40(BgTokiSwd* this, PlayState* play);
void func_808BB0AC(BgTokiSwd* this, PlayState* play);
void func_808BB128(BgTokiSwd* this, PlayState* play);
extern CutsceneData D_808BB2F0[];
extern CutsceneData D_808BB7A0[];
extern CutsceneData D_808BBD90[];
extern CutsceneData gPullMasterSwordCs[];
extern CutsceneData gPlaceMasterSwordCs[];
extern CutsceneData gRevealMasterSwordCs[];
ActorProfile Bg_Toki_Swd_Profile = {
/**/ ACTOR_BG_TOKI_SWD,
@ -93,19 +93,19 @@ void BgTokiSwd_Destroy(Actor* thisx, PlayState* play) {
}
void func_808BAF40(BgTokiSwd* this, PlayState* play) {
if (!GET_EVENTCHKINF(EVENTCHKINF_WATCHED_SHEIK_AFTER_MASTER_SWORD_CS) && !IS_CUTSCENE_LAYER &&
if (!GET_EVENTCHKINF(EVENTCHKINF_REVEALED_MASTER_SWORD) && !IS_CUTSCENE_LAYER &&
Actor_IsFacingAndNearPlayer(&this->actor, 800.0f, 0x7530) && !Play_InCsMode(play)) {
SET_EVENTCHKINF(EVENTCHKINF_WATCHED_SHEIK_AFTER_MASTER_SWORD_CS);
play->csCtx.script = D_808BBD90;
SET_EVENTCHKINF(EVENTCHKINF_REVEALED_MASTER_SWORD);
play->csCtx.script = gRevealMasterSwordCs;
gSaveContext.cutsceneTrigger = 1;
}
if (!LINK_IS_ADULT || GET_EVENTCHKINF(EVENTCHKINF_55)) {
if (Actor_HasParent(&this->actor, play)) {
if (!LINK_IS_ADULT) {
Item_Give(play, ITEM_SWORD_MASTER);
play->csCtx.script = D_808BB2F0;
play->csCtx.script = gPullMasterSwordCs;
} else {
play->csCtx.script = D_808BB7A0;
play->csCtx.script = gPlaceMasterSwordCs;
}
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0);
SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, 0, NA_BGM_MASTER_SWORD);

View file

@ -2,7 +2,7 @@
#include "z64cutscene_commands.h"
// clang-format off
CutsceneData D_808BB2F0[] = {
CutsceneData gPullMasterSwordCs[] = {
CS_HEADER(9, 425),
CS_PLAYER_CUE_LIST(1),
CS_PLAYER_CUE(PLAYER_CUEID_12, 0, 256, 0x0000, 0x0000, 0x0000, 0, 54, 52, 0, 54, 52, CS_FLOAT(0x0, 0.0f), CS_FLOAT(0x0, 0.0f), CS_FLOAT(0x0, 0.0f)),

View file

@ -2,7 +2,7 @@
#include "z64cutscene_commands.h"
// clang-format off
CutsceneData D_808BB7A0[] = {
CutsceneData gPlaceMasterSwordCs[] = {
CS_HEADER(9, 368),
CS_CAM_EYE_SPLINE(0, 126),
CS_CAM_POINT(CS_CAM_CONTINUE, 0x00, 0, CS_FLOAT(0x42700000, 60.0f), -1, 101, -110, 0x616D),

View file

@ -2,7 +2,7 @@
#include "z64cutscene_commands.h"
// clang-format off
CutsceneData D_808BBD90[] = {
CutsceneData gRevealMasterSwordCs[] = {
CS_HEADER(11, 3000),
CS_UNK_DATA_LIST(0x00000021, 1),
CS_UNK_DATA(0x00010000, 0x0BB80000, 0x00000000, 0x00000000, 0xFFFFFFF8, 0xFFFFFFFF, 0x00000000, 0xFFFFFFF8, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000),
@ -18,11 +18,11 @@ CutsceneData D_808BBD90[] = {
CS_MISC(CS_MISC_STOP_CUTSCENE, 340, 341, 0x0000, 0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFD, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFD, 0x00000000, 0x00000000, 0x00000000),
CS_TEXT_LIST(6),
CS_TEXT_NONE(0, 50),
CS_TEXT(0x70E6, 50, 60, 0x0000, 0x0000, 0x0000),
CS_TEXT(0x70E6, 50, 60, CS_TEXT_NORMAL, 0x0000, 0x0000),
CS_TEXT_NONE(60, 250),
CS_TEXT(0x70E7, 250, 260, 0x0000, 0x0000, 0x0000),
CS_TEXT(0x70E7, 250, 260, CS_TEXT_NORMAL, 0x0000, 0x0000),
CS_TEXT_NONE(260, 290),
CS_TEXT(0x70E8, 290, 320, 0x0000, 0x0000, 0x0000),
CS_TEXT(0x70E8, 290, 320, CS_TEXT_NORMAL, 0x0000, 0x0000),
CS_CAM_EYE_SPLINE(0, 251),
CS_CAM_POINT(CS_CAM_CONTINUE, 0x00, 0, CS_FLOAT(0x42700000, 60.0f), -59, 12, 690, 0x0222),
CS_CAM_POINT(CS_CAM_CONTINUE, 0x00, 0, CS_FLOAT(0x42700000, 60.0f), -59, 12, 690, 0x00FA),

View file

@ -25,10 +25,10 @@ void func_808BC8B8(BgTreemouth* this, PlayState* play);
void func_808BC9EC(BgTreemouth* this, PlayState* play);
void func_808BCAF0(BgTreemouth* this, PlayState* play);
extern CutsceneData D_808BCE20[];
extern CutsceneData D_808BD2A0[];
extern CutsceneData D_808BD520[];
extern CutsceneData D_808BD790[];
extern CutsceneData gDekuTreeMeetingCs[];
extern CutsceneData gDekuTreeChoiceCs[];
extern CutsceneData gDekuTreeMouthOpeningCs[];
extern CutsceneData gDekuTreeAskAgainCs[];
ActorProfile Bg_Treemouth_Profile = {
/**/ ACTOR_BG_TREEMOUTH,
@ -146,14 +146,14 @@ void func_808BC8B8(BgTreemouth* this, PlayState* play) {
this->dyna.actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED;
if (this->dyna.actor.isLockedOn) {
this->dyna.actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED;
play->csCtx.script = D_808BD2A0;
play->csCtx.script = gDekuTreeChoiceCs;
gSaveContext.cutsceneTrigger = 1;
BgTreemouth_SetupAction(this, func_808BC9EC);
}
}
} else if (Actor_IsFacingAndNearPlayer(&this->dyna.actor, 1658.0f, 0x4E20)) {
Flags_SetEventChkInf(EVENTCHKINF_0C);
play->csCtx.script = D_808BCE20;
play->csCtx.script = gDekuTreeMeetingCs;
gSaveContext.cutsceneTrigger = 1;
BgTreemouth_SetupAction(this, func_808BC9EC);
}
@ -186,11 +186,11 @@ void func_808BC9EC(BgTreemouth* this, PlayState* play) {
play->csCtx.state = CS_STATE_RUN;
if (play->msgCtx.choiceIndex == 0) {
play->csCtx.script = D_808BD520;
play->csCtx.script = gDekuTreeMouthOpeningCs;
Flags_SetEventChkInf(EVENTCHKINF_05);
BgTreemouth_SetupAction(this, func_808BCAF0);
} else {
play->csCtx.script = D_808BD790;
play->csCtx.script = gDekuTreeAskAgainCs;
play->csCtx.curFrame = 0;
BgTreemouth_SetupAction(this, func_808BC8B8);
}

View file

@ -2,7 +2,7 @@
#include "z64cutscene_commands.h"
// clang-format off
CutsceneData D_808BCE20[] = {
CutsceneData gDekuTreeMeetingCs[] = {
CS_HEADER(12, 3000),
CS_UNK_DATA_LIST(0x00000015, 1),
CS_UNK_DATA(0x00010000, 0x0BB80000, 0x00000000, 0x00000000, 0x0000000F, 0xFFFFFFDE, 0x00000000, 0x0000000F, 0xFFFFFFDE, 0x00000000, 0x00000000, 0x00000000),
@ -43,9 +43,9 @@ CutsceneData D_808BCE20[] = {
CS_CAM_POINT(CS_CAM_STOP, 0x00, 30, CS_FLOAT(0x423CCCC1, 47.199955f), 2673, 127, -267, 0x7805),
CS_TEXT_LIST(4),
CS_TEXT_NONE(0, 40),
CS_TEXT(0x107D, 40, 60, 0x0000, 0xFFFF, 0xFFFF),
CS_TEXT(0x107D, 40, 60, CS_TEXT_NORMAL, 0xFFFF, 0xFFFF),
CS_TEXT_NONE(60, 160),
CS_TEXT(0x1015, 160, 170, 0x0000, 0xFFFF, 0xFFFF),
CS_TEXT(0x1015, 160, 170, CS_TEXT_NORMAL, 0xFFFF, 0xFFFF),
CS_MISC_LIST(1),
CS_MISC(CS_MISC_STOP_CUTSCENE, 180, 200, 0x0000, 0x00000000, 0x00000000, 0xFFFFFFF7, 0xFFFFFFDB, 0x00000000, 0xFFFFFFF7, 0xFFFFFFDB, 0x00000000, 0x00000000, 0x00000000),
CS_ACTOR_CUE_LIST(CS_CMD_ACTOR_CUE_0_6, 1),
@ -62,7 +62,7 @@ CutsceneData D_808BCE20[] = {
CS_END_OF_SCRIPT(),
};
CutsceneData D_808BD2A0[] = {
CutsceneData gDekuTreeChoiceCs[] = {
CS_HEADER(9, 3000),
CS_UNK_DATA_LIST(0x00000015, 1),
CS_UNK_DATA(0x00010000, 0x0BB80000, 0x00000000, 0x00000000, 0x0000000F, 0xFFFFFFDE, 0x00000000, 0x0000000F, 0xFFFFFFDE, 0x00000000, 0x00000000, 0x00000000),
@ -96,13 +96,13 @@ CutsceneData D_808BD2A0[] = {
CS_CAM_POINT(CS_CAM_STOP, 0x00, 30, CS_FLOAT(0x42700000, 60.0f), 1, 35, -36, 0x9D94),
CS_TEXT_LIST(2),
CS_TEXT_NONE(0, 20),
CS_TEXT(0x1016, 20, 80, 0x0000, 0xFFFF, 0xFFFF),
CS_TEXT(0x1016, 20, 80, CS_TEXT_NORMAL, 0xFFFF, 0xFFFF),
CS_START_SEQ_LIST(1),
CS_START_SEQ(NA_BGM_DEKU_TREE_CS, 0, 1, 0x0000, 0x00000000, 0x00000000, 0xFFFFFFAC, 0x0000007E, 0x00000000, 0xFFFFFFAC, 0x0000007E),
CS_END_OF_SCRIPT(),
};
CutsceneData D_808BD520[] = {
CutsceneData gDekuTreeMouthOpeningCs[] = {
CS_HEADER(8, 3000),
CS_UNK_DATA_LIST(0x00000015, 1),
CS_UNK_DATA(0x00010000, 0x0BB80000, 0x00000000, 0x00000000, 0x0000000F, 0xFFFFFFDE, 0x00000000, 0x0000000F, 0xFFFFFFDE, 0x00000000, 0x00000000, 0x00000000),
@ -127,7 +127,7 @@ CutsceneData D_808BD520[] = {
CS_CAM_POINT(CS_CAM_STOP, 0x00, 30, CS_FLOAT(0x4223FFED, 40.999928f), 3765, -118, -617, 0x01BC),
CS_TEXT_LIST(2),
CS_TEXT_NONE(0, 20),
CS_TEXT(0x1017, 20, 60, 0x0000, 0xFFFF, 0xFFFF),
CS_TEXT(0x1017, 20, 60, CS_TEXT_NORMAL, 0xFFFF, 0xFFFF),
CS_MISC_LIST(1),
CS_MISC(CS_MISC_STOP_CUTSCENE, 100, 150, 0x0000, 0x00000000, 0x00000000, 0xFFFFFFF5, 0x00000010, 0x00000000, 0xFFFFFFF5, 0x00000010, 0x00000000, 0x00000000, 0x00000000),
CS_STOP_SEQ_LIST(1),
@ -137,7 +137,7 @@ CutsceneData D_808BD520[] = {
CS_END_OF_SCRIPT(),
};
CutsceneData D_808BD790[] = {
CutsceneData gDekuTreeAskAgainCs[] = {
CS_HEADER(8, 3000),
CS_UNK_DATA_LIST(0x00000015, 1),
CS_UNK_DATA(0x00010000, 0x0BB80000, 0x00000000, 0x00000000, 0x0000000F, 0xFFFFFFDE, 0x00000000, 0x0000000F, 0xFFFFFFDE, 0x00000000, 0x00000000, 0x00000000),
@ -157,7 +157,7 @@ CutsceneData D_808BD790[] = {
CS_CAM_POINT(CS_CAM_STOP, 0x00, 30, CS_FLOAT(0x4297331E, 75.59984f), 3769, 718, -1186, 0x56AC),
CS_TEXT_LIST(2),
CS_TEXT_NONE(0, 20),
CS_TEXT(0x1018, 20, 60, 0x0000, 0xFFFF, 0xFFFF),
CS_TEXT(0x1018, 20, 60, CS_TEXT_NORMAL, 0xFFFF, 0xFFFF),
CS_MISC_LIST(1),
CS_MISC(CS_MISC_STOP_CUTSCENE, 80, 110, 0x0000, 0x00000000, 0x00000000, 0xFFFFFFEA, 0x00000006, 0x00000000, 0xFFFFFFEA, 0x00000006, 0x00000000, 0x00000000, 0x00000000),
CS_STOP_SEQ_LIST(1),

View file

@ -41,7 +41,7 @@ void BgUmaJump_Init(Actor* thisx, PlayState* play) {
this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &this->dyna.actor, colHeader);
if (this->dyna.actor.params == 1) {
if (!Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED) && (DREG(1) == 0)) {
if (!(Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED) || R_DEBUG_FORCE_EPONA_OBTAINED)) {
Actor_Kill(&this->dyna.actor);
return;
}

View file

@ -335,7 +335,7 @@ void BossDodongo_IntroCutscene(BossDodongo* this, PlayState* play) {
this->subCamAt.z = player->actor.world.pos.z;
}
if (GET_EVENTCHKINF(EVENTCHKINF_71)) {
if (GET_EVENTCHKINF(EVENTCHKINF_BEGAN_KING_DODONGO_BATTLE)) {
if (this->unk_198 == 100) {
this->actor.world.pos.x = -1114.0f;
this->actor.world.pos.z = -2804.0f;
@ -376,7 +376,7 @@ void BossDodongo_IntroCutscene(BossDodongo* this, PlayState* play) {
case 4:
Math_SmoothStepToF(&this->unk_20C, 0.0f, 1.0f, 0.01f, 0.0f);
if (GET_EVENTCHKINF(EVENTCHKINF_71)) {
if (GET_EVENTCHKINF(EVENTCHKINF_BEGAN_KING_DODONGO_BATTLE)) {
phi_f0 = -50.0f;
} else {
phi_f0 = 0.0f;
@ -404,7 +404,7 @@ void BossDodongo_IntroCutscene(BossDodongo* this, PlayState* play) {
}
if (this->unk_198 == 0x5A) {
if (!GET_EVENTCHKINF(EVENTCHKINF_71)) {
if (!GET_EVENTCHKINF(EVENTCHKINF_BEGAN_KING_DODONGO_BATTLE)) {
TitleCard_InitBossName(play, &play->actorCtx.titleCtx,
SEGMENTED_TO_VIRTUAL(gKingDodongoTitleCardTex), 160, 180, 128, 40);
}
@ -423,7 +423,7 @@ void BossDodongo_IntroCutscene(BossDodongo* this, PlayState* play) {
this->unk_1DA = 50;
this->unk_1BC = 0;
player->actor.shape.rot.y = -0x4002;
SET_EVENTCHKINF(EVENTCHKINF_71);
SET_EVENTCHKINF(EVENTCHKINF_BEGAN_KING_DODONGO_BATTLE);
}
break;
}

View file

@ -339,7 +339,7 @@ void BossFd_Fly(BossFd* this, PlayState* play) {
this->timers[0] = 0;
this->subCamVelFactor = 0.0f;
this->subCamAccel = 0.0f;
if (GET_EVENTCHKINF(EVENTCHKINF_73)) {
if (GET_EVENTCHKINF(EVENTCHKINF_BEGAN_VOLVAGIA_BATTLE)) {
this->introState = BFD_CS_EMERGE;
this->subCamEyeNext.x = player2->actor.world.pos.x + 100.0f + 300.0f - 600.0f;
this->subCamEyeNext.y = player2->actor.world.pos.y + 100.0f - 50.0f;
@ -461,7 +461,7 @@ void BossFd_Fly(BossFd* this, PlayState* play) {
PRINTF("WAY_SPD X = %f\n", this->subCamAtVel.x);
PRINTF("WAY_SPD Y = %f\n", this->subCamAtVel.y);
PRINTF("WAY_SPD Z = %f\n", this->subCamAtVel.z);
if ((this->timers[3] > 190) && !GET_EVENTCHKINF(EVENTCHKINF_73)) {
if ((this->timers[3] > 190) && !GET_EVENTCHKINF(EVENTCHKINF_BEGAN_VOLVAGIA_BATTLE)) {
Audio_PlaySfxGeneral(NA_SE_EN_DODO_K_ROLL - SFX_FLAG, &this->actor.projectedPos, 4,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
}
@ -488,7 +488,7 @@ void BossFd_Fly(BossFd* this, PlayState* play) {
if (this->timers[3] == 160) {
SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, 0, NA_BGM_FIRE_BOSS);
}
if ((this->timers[3] == 130) && !GET_EVENTCHKINF(EVENTCHKINF_73)) {
if ((this->timers[3] == 130) && !GET_EVENTCHKINF(EVENTCHKINF_BEGAN_VOLVAGIA_BATTLE)) {
TitleCard_InitBossName(play, &play->actorCtx.titleCtx, SEGMENTED_TO_VIRTUAL(gVolvagiaTitleCardTex),
160, 180, 128, 40);
}
@ -541,7 +541,7 @@ void BossFd_Fly(BossFd* this, PlayState* play) {
Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_7);
this->actionFunc = BossFd_Wait;
this->handoffSignal = FD2_SIGNAL_GROUND;
SET_EVENTCHKINF(EVENTCHKINF_73);
SET_EVENTCHKINF(EVENTCHKINF_BEGAN_VOLVAGIA_BATTLE);
}
break;
}

View file

@ -580,7 +580,7 @@ void BossGanon_IntroCutscene(BossGanon* this, PlayState* play) {
Play_ChangeCameraStatus(play, this->csCamIndex, CAM_STAT_ACTIVE);
this->csCamFov = 60.0f;
if (GET_EVENTCHKINF(EVENTCHKINF_78)) {
if (GET_EVENTCHKINF(EVENTCHKINF_BEGAN_GANONDORF_BATTLE)) {
// watched cutscene already, skip most of it
this->csState = 17;
this->csTimer = 0;
@ -1098,12 +1098,12 @@ void BossGanon_IntroCutscene(BossGanon* this, PlayState* play) {
gSegments[6] =
VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[Object_GetSlot(&play->objectCtx, OBJECT_GANON)].segment);
if (!GET_EVENTCHKINF(EVENTCHKINF_78)) {
if (!GET_EVENTCHKINF(EVENTCHKINF_BEGAN_GANONDORF_BATTLE)) {
TitleCard_InitBossName(play, &play->actorCtx.titleCtx, SEGMENTED_TO_VIRTUAL(gGanondorfTitleCardTex),
160, 180, 128, 40);
}
SET_EVENTCHKINF(EVENTCHKINF_78);
SET_EVENTCHKINF(EVENTCHKINF_BEGAN_GANONDORF_BATTLE);
}
if (this->csTimer >= 20) {

View file

@ -684,7 +684,7 @@ void BossGoma_Encounter(BossGoma* this, PlayState* play) {
// entrance of the boss room
if (fabsf(player->actor.world.pos.x - 150.0f) < 60.0f &&
fabsf(player->actor.world.pos.z - 350.0f) < 60.0f) {
if (GET_EVENTCHKINF(EVENTCHKINF_70)) {
if (GET_EVENTCHKINF(EVENTCHKINF_BEGAN_GOHMA_BATTLE)) {
BossGoma_SetupEncounterState4(this, play);
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_DOOR_SHUTTER, 164.72f, -480.0f,
397.68002f, 0, -0x705C, 0, DOORSHUTTER_PARAMS(SHUTTER_GOHMA_BLOCK, 0));
@ -922,13 +922,13 @@ void BossGoma_Encounter(BossGoma* this, PlayState* play) {
if (Animation_OnFrame(&this->skelanime, 40.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EN_GOMA_CRY1);
if (!GET_EVENTCHKINF(EVENTCHKINF_70)) {
if (!GET_EVENTCHKINF(EVENTCHKINF_BEGAN_GOHMA_BATTLE)) {
TitleCard_InitBossName(play, &play->actorCtx.titleCtx, SEGMENTED_TO_VIRTUAL(gGohmaTitleCardTex),
160, 180, 128, 40);
}
SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, 0, NA_BGM_BOSS);
SET_EVENTCHKINF(EVENTCHKINF_70);
SET_EVENTCHKINF(EVENTCHKINF_BEGAN_GOHMA_BATTLE);
}
if (Animation_OnFrame(&this->skelanime, this->currentAnimFrameCount)) {

View file

@ -364,7 +364,7 @@ void BossMo_Init(Actor* thisx, PlayState* play2) {
MO_WATER_LEVEL(play) = -500;
return;
}
if (GET_EVENTCHKINF(EVENTCHKINF_74)) {
if (GET_EVENTCHKINF(EVENTCHKINF_BEGAN_MORPHA_BATTLE)) {
SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, 0, NA_BGM_BOSS);
this->tentMaxAngle = 5.0f;
this->timers[0] = 50;
@ -1434,7 +1434,7 @@ void BossMo_IntroCs(BossMo* this, PlayState* play) {
if (this->timers[2] == 130) {
TitleCard_InitBossName(play, &play->actorCtx.titleCtx, SEGMENTED_TO_VIRTUAL(gMorphaTitleCardTex), 160,
180, 128, 40);
SET_EVENTCHKINF(EVENTCHKINF_74);
SET_EVENTCHKINF(EVENTCHKINF_BEGAN_MORPHA_BATTLE);
}
break;
case MO_INTRO_FINISH:

View file

@ -383,7 +383,7 @@ void BossSst_HeadSetupIntro(BossSst* this, PlayState* play) {
Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STAT_WAIT);
Play_ChangeCameraStatus(play, sSubCamId, CAM_STAT_ACTIVE);
Math_Vec3f_Copy(&sSubCamAt, &player->actor.world.pos);
if (GET_EVENTCHKINF(EVENTCHKINF_77)) {
if (GET_EVENTCHKINF(EVENTCHKINF_BEGAN_BONGO_BONGO_BATTLE)) {
sSubCamEye.z = ROOM_CENTER_Z - 100.0f;
}
@ -419,7 +419,7 @@ void BossSst_HeadIntro(BossSst* this, PlayState* play) {
Play_ChangeCameraStatus(play, sSubCamId, CAM_STAT_WAIT);
Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STAT_ACTIVE);
Play_ClearCamera(play, sSubCamId);
SET_EVENTCHKINF(EVENTCHKINF_77);
SET_EVENTCHKINF(EVENTCHKINF_BEGAN_BONGO_BONGO_BATTLE);
BossSst_HeadSetupNeutral(this);
this->colliderJntSph.base.ocFlags1 |= OC1_ON;
sHands[LEFT]->colliderJntSph.base.ocFlags1 |= OC1_ON;
@ -442,7 +442,7 @@ void BossSst_HeadIntro(BossSst* this, PlayState* play) {
this->ready = true;
Rumble_Request(this->actor.xyzDistToPlayerSq, 255, 20, 150);
Actor_PlaySfx(&sFloor->dyna.actor, NA_SE_EN_SHADEST_TAIKO_HIGH);
} else if (GET_EVENTCHKINF(EVENTCHKINF_77)) {
} else if (GET_EVENTCHKINF(EVENTCHKINF_BEGAN_BONGO_BONGO_BATTLE)) {
//! @bug This condition assumes that the second bounce on the ground will occur before frame 545 on the
//! timer. However, it is possible to delay Player's descent to the ground by, for example, jumpslashing
//! on the last possible frame before the cutscene takes control. This delays Player's fall to the
@ -575,7 +575,7 @@ void BossSst_HeadIntro(BossSst* this, PlayState* play) {
}
if (this->timer <= 198) {
revealStateTimer = 198 - this->timer;
if (GET_EVENTCHKINF(EVENTCHKINF_77) && (revealStateTimer <= 44)) {
if (GET_EVENTCHKINF(EVENTCHKINF_BEGAN_BONGO_BONGO_BATTLE) && (revealStateTimer <= 44)) {
sSubCamAt.x += 492.0f * 0.01f;
sSubCamAt.y += 200.0f * 0.01f;
sSubCamEye.x -= 80.0f * 0.01f;
@ -604,7 +604,7 @@ void BossSst_HeadIntro(BossSst* this, PlayState* play) {
sSubCamEye.y += 125.0f * 0.01f;
sSubCamEye.z -= 350.0f * 0.01f;
} else if (revealStateTimer == 85) {
if (!GET_EVENTCHKINF(EVENTCHKINF_77)) {
if (!GET_EVENTCHKINF(EVENTCHKINF_BEGAN_BONGO_BONGO_BATTLE)) {
TitleCard_InitBossName(play, &play->actorCtx.titleCtx, SEGMENTED_TO_VIRTUAL(gBongoTitleCardTex),
160, 180, 128, 40);
}

View file

@ -515,7 +515,7 @@ void BossTw_Init(Actor* thisx, PlayState* play2) {
this->actor.naviEnemyId = NAVI_ENEMY_TWINROVA_KOTAKE;
SkelAnime_InitFlex(play, &this->skelAnime, &gTwinrovaKotakeSkel, &gTwinrovaKotakeKoumeFlyAnim, NULL, NULL, 0);
if (GET_EVENTCHKINF(EVENTCHKINF_75)) {
if (GET_EVENTCHKINF(EVENTCHKINF_BEGAN_TWINROVA_BATTLE)) {
// began twinrova battle
BossTw_SetupFlyTo(this, play);
this->actor.world.pos.x = -600.0f;
@ -533,7 +533,7 @@ void BossTw_Init(Actor* thisx, PlayState* play2) {
this->actor.naviEnemyId = NAVI_ENEMY_TWINROVA_KOUME;
SkelAnime_InitFlex(play, &this->skelAnime, &gTwinrovaKoumeSkel, &gTwinrovaKotakeKoumeFlyAnim, NULL, NULL, 0);
if (GET_EVENTCHKINF(EVENTCHKINF_75)) {
if (GET_EVENTCHKINF(EVENTCHKINF_BEGAN_TWINROVA_BATTLE)) {
// began twinrova battle
BossTw_SetupFlyTo(this, play);
this->actor.world.pos.x = 600.0f;
@ -555,7 +555,7 @@ void BossTw_Init(Actor* thisx, PlayState* play2) {
SkelAnime_InitFlex(play, &this->skelAnime, &gTwinrovaSkel, &gTwinrovaTPoseAnim, NULL, NULL, 0);
Animation_MorphToLoop(&this->skelAnime, &gTwinrovaTPoseAnim, -3.0f);
if (GET_EVENTCHKINF(EVENTCHKINF_75)) {
if (GET_EVENTCHKINF(EVENTCHKINF_BEGAN_TWINROVA_BATTLE)) {
// began twinrova battle
BossTw_SetupWait(this, play);
} else {
@ -2219,7 +2219,7 @@ void BossTw_TwinrovaIntroCS(BossTw* this, PlayState* play) {
play->envCtx.lightBlend = 0.0f;
TitleCard_InitBossName(play, &play->actorCtx.titleCtx, SEGMENTED_TO_VIRTUAL(gTwinrovaTitleCardTex), 160,
180, 128, 40);
SET_EVENTCHKINF(EVENTCHKINF_75);
SET_EVENTCHKINF(EVENTCHKINF_BEGAN_TWINROVA_BATTLE);
SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, 0, NA_BGM_BOSS);
}

View file

@ -642,7 +642,7 @@ void BossVa_Init(Actor* thisx, PlayState* play2) {
} else {
this->actor.colChkInfo.damageTable = sDamageTable;
sPhase2Timer = 0xFFFF;
if (GET_EVENTCHKINF(EVENTCHKINF_76)) {
if (GET_EVENTCHKINF(EVENTCHKINF_BEGAN_BARINADE_BATTLE)) {
sCsState = INTRO_CALL_BARI;
sDoorState = 100;
Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_1);
@ -977,7 +977,7 @@ void BossVa_BodyIntro(BossVa* this, PlayState* play) {
sSubCamAtNext.y = 140.0f;
sSubCamAtNext.z = -200.0f;
if (!GET_EVENTCHKINF(EVENTCHKINF_76)) {
if (!GET_EVENTCHKINF(EVENTCHKINF_BEGAN_BARINADE_BATTLE)) {
TitleCard_InitBossName(play, &play->actorCtx.titleCtx, SEGMENTED_TO_VIRTUAL(gBarinadeTitleCardTex),
160, 180, 128, 40);
}
@ -1019,7 +1019,7 @@ void BossVa_BodyIntro(BossVa* this, PlayState* play) {
Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STAT_ACTIVE);
Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_7);
sCsState++;
SET_EVENTCHKINF(EVENTCHKINF_76);
SET_EVENTCHKINF(EVENTCHKINF_BEGAN_BARINADE_BATTLE);
player->actor.shape.rot.y = player->actor.world.rot.y = this->actor.yawTowardsPlayer + 0x8000;
}
break;

View file

@ -39,15 +39,15 @@ static CutsceneData gFireMedallionCs[] = {
CS_FADE_OUT_SEQ(CS_FADE_OUT_BGM_MAIN, 500, 550, 0x0000, 0x00000000, 0x00000000, 0xFFFFFFC3, 0x0000006E, 0x00000000, 0xFFFFFFC3, 0x0000006E),
CS_TEXT_LIST(10),
CS_TEXT_NONE(0, 310),
CS_TEXT(0x303C, 310, 323, 0x0000, 0x0000, 0x0000),
CS_TEXT(0x303C, 310, 323, CS_TEXT_NORMAL, 0x0000, 0x0000),
CS_TEXT_NONE(323, 344),
CS_TEXT(0x3045, 344, 394, 0x0000, 0x0000, 0x0000),
CS_TEXT(0x3045, 344, 394, CS_TEXT_NORMAL, 0x0000, 0x0000),
CS_TEXT_NONE(394, 415),
CS_TEXT(0x3046, 415, 465, 0x0000, 0x0000, 0x0000),
CS_TEXT(0x3046, 415, 465, CS_TEXT_NORMAL, 0x0000, 0x0000),
CS_TEXT_NONE(465, 800),
CS_TEXT(0x003C, 800, 805, 0x0000, 0x0000, 0x0000),
CS_TEXT(0x003C, 800, 805, CS_TEXT_NORMAL, 0x0000, 0x0000),
CS_TEXT_NONE(805, 865),
CS_TEXT(0x303D, 865, 875, 0x0000, 0x0000, 0x0000),
CS_TEXT(0x303D, 865, 875, CS_TEXT_NORMAL, 0x0000, 0x0000),
CS_CAM_EYE_SPLINE(0, 1361),
CS_CAM_POINT(CS_CAM_CONTINUE, 0x00, 0, CS_FLOAT(0x4271999A, 60.4f), -85, 3211, 795, 0x00C6),
CS_CAM_POINT(CS_CAM_CONTINUE, 0x00, 0, CS_FLOAT(0x4271999A, 60.4f), -85, 3211, 795, 0x00C8),

View file

@ -35,19 +35,19 @@ static CutsceneData gShadowMedallionCs[] = {
CS_START_SEQ(NA_BGM_MEDALLION_GET, 770, 771, 0x0000, 0x00000000, 0x00000000, 0xFFFFFFC9, 0x0000005C, 0x00000000, 0xFFFFFFC9, 0x0000005C),
CS_TEXT_LIST(14),
CS_TEXT_NONE(0, 340),
CS_TEXT(0x5022, 340, 353, 0x0000, 0x0000, 0x0000),
CS_TEXT(0x5022, 340, 353, CS_TEXT_NORMAL, 0x0000, 0x0000),
CS_TEXT_NONE(353, 374),
CS_TEXT(0x5025, 374, 404, 0x0000, 0x0000, 0x0000),
CS_TEXT(0x5025, 374, 404, CS_TEXT_NORMAL, 0x0000, 0x0000),
CS_TEXT_NONE(404, 424),
CS_TEXT(0x502B, 424, 474, 0x0000, 0x0000, 0x0000),
CS_TEXT(0x502B, 424, 474, CS_TEXT_NORMAL, 0x0000, 0x0000),
CS_TEXT_NONE(474, 494),
CS_TEXT(0x502C, 494, 543, 0x0000, 0x0000, 0x0000),
CS_TEXT(0x502C, 494, 543, CS_TEXT_NORMAL, 0x0000, 0x0000),
CS_TEXT_NONE(543, 564),
CS_TEXT(0x5026, 564, 613, 0x0000, 0x0000, 0x0000),
CS_TEXT(0x5026, 564, 613, CS_TEXT_NORMAL, 0x0000, 0x0000),
CS_TEXT_NONE(613, 955),
CS_TEXT(0x0041, 955, 959, 0x0000, 0x0000, 0x0000),
CS_TEXT(0x0041, 955, 959, CS_TEXT_NORMAL, 0x0000, 0x0000),
CS_TEXT_NONE(959, 1020),
CS_TEXT(0x5023, 1020, 1029, 0x0000, 0x0000, 0x0000),
CS_TEXT(0x5023, 1020, 1029, CS_TEXT_NORMAL, 0x0000, 0x0000),
CS_DESTINATION(CS_DEST_GRAVEYARD_FROM_CHAMBER_OF_SAGES, 1060, 1061),
CS_FADE_OUT_SEQ_LIST(1),
CS_FADE_OUT_SEQ(CS_FADE_OUT_BGM_MAIN, 673, 723, 0x0000, 0x00000000, 0x00000000, 0xFFFFFFC1, 0x00000058, 0x00000000, 0xFFFFFFC1, 0x00000058),

View file

@ -30,15 +30,15 @@ static CutsceneData gForestMedallionCs[] = {
CS_DESTINATION(CS_DEST_KOKIRI_FOREST_FROM_CHAMBER_OF_SAGES, 974, 1050),
CS_TEXT_LIST(10),
CS_TEXT_NONE(0, 303),
CS_TEXT(0x106A, 303, 323, 0x0000, 0x0000, 0x0000),
CS_TEXT(0x106A, 303, 323, CS_TEXT_NORMAL, 0x0000, 0x0000),
CS_TEXT_NONE(323, 344),
CS_TEXT(0x108F, 344, 394, 0x0000, 0x0000, 0x0000),
CS_TEXT(0x108F, 344, 394, CS_TEXT_NORMAL, 0x0000, 0x0000),
CS_TEXT_NONE(394, 415),
CS_TEXT(0x1090, 415, 465, 0x0000, 0x0000, 0x0000),
CS_TEXT(0x1090, 415, 465, CS_TEXT_NORMAL, 0x0000, 0x0000),
CS_TEXT_NONE(465, 871),
CS_TEXT(0x003E, 871, 875, 0x0000, 0x0000, 0x0000),
CS_TEXT(0x003E, 871, 875, CS_TEXT_NORMAL, 0x0000, 0x0000),
CS_TEXT_NONE(875, 936),
CS_TEXT(0x106B, 936, 946, 0x0000, 0x0000, 0x0000),
CS_TEXT(0x106B, 936, 946, CS_TEXT_NORMAL, 0x0000, 0x0000),
CS_START_SEQ_LIST(1),
CS_START_SEQ(NA_BGM_MEDALLION_GET, 686, 687, 0x0000, 0x00000000, 0x00000000, 0xFFFFFFC5, 0x00000057, 0x00000000, 0xFFFFFFC5, 0x00000057),
CS_FADE_OUT_SEQ_LIST(1),

View file

@ -879,7 +879,7 @@ void DoorShutter_GohmaBlockFall(DoorShutter* this, PlayState* play) {
Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_2);
if (this->dyna.actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
DoorShutter_SetupAction(this, DoorShutter_GohmaBlockBounce);
if (!GET_EVENTCHKINF(EVENTCHKINF_70)) {
if (!GET_EVENTCHKINF(EVENTCHKINF_BEGAN_GOHMA_BATTLE)) {
BossGoma* parent = (BossGoma*)this->dyna.actor.parent;
this->isActive = 10;

Some files were not shown because too many files have changed in this diff Show more