Refresh 16

This commit is contained in:
n64
2023-08-17 08:56:02 -04:00
parent 66018e9f3c
commit ae770e0df5
1326 changed files with 73566 additions and 26397 deletions

26
CHANGES
View File

@@ -1,3 +1,29 @@
Refresh 16 (Two years later...)
1.) remove capstone from readme, slight update (#1212)
2.) Update ido static recomp (#1211)
3.) Fix misleading pointer (#1209)
4.) update outdated link (#1208)
5.) Match iQue (#1207)
6.) iQue matching except BSS (#1124)
7.) Create LICENSE.md
8.) Reorganize and apply licenses to some of the tools/ programs per discussions with their author(s). (#1203)
9.) Fix rumble_init libultra includes and checks (#1195)
10.) Stacksize moved to defines (#1199)
11.) Renamings we were too lazy to make a PR for for 3 years (#1198)
12.) Fix spelling error in sound.h comment (#1197)
13.) Update instrument sample names (#1196)
14.) Object Labeling, Behavior Params, and Cleanup (#1193)
15.) Significantly more Libultra Cleanup (#1192)
16.) Typedefs for area Terrain Data and Rooms (#1178)
17.) Allow spaces in filename for vadpcm_enc (#1175)
18.) Label all warp nodes (#1191)
19.) Remove hardware.h (#1190)
20.) Document __osSetHWintrRoutine (#1186)
21.) Change 3 space indent to 4 space indent and cleanup (#1189)
22.) Libultra cleanup and labelling (#1188)
23.) in-game menu renaming (#1187)
24.) AVOID_UB fixes and cleanup (#1185)
Refresh 15 (mostly a hotfix for RSP microcode selection)
1.) Renamed frame_buffer funcs and _ZBUFFER (#1184)

View File

@@ -3,9 +3,8 @@ FROM ubuntu:18.04 as build
RUN apt-get update && \
apt-get install -y \
binutils-mips-linux-gnu \
bsdmainutils \
build-essential \
libcapstone-dev \
git \
pkgconf \
python3

16
Jenkinsfile vendored
View File

@@ -12,32 +12,38 @@ pipeline {
sh 'ln -s "$ROMS_DIR/Super Mario 64 (U) [!].z64" baserom.us.z64'
sh 'ln -s "$ROMS_DIR/Super Mario 64 (E) (M3) [!].z64" baserom.eu.z64'
sh 'ln -s "$ROMS_DIR/Super Mario 64 - Shindou Edition (J) [!].z64" baserom.sh.z64'
sh 'ln -s "$ROMS_DIR/Super Mario 64 - iQue (Ch).z64" baserom.cn.z64'
// verify no assets were committed to repo
sh '[ -z "$(find {actors,levels,textures}/ -name \'*.png\')" ]'
sh '[ -z "$(find assets/ -name \'*.m64\' -or \'*.bin\')" ]'
sh './extract_assets.py jp us eu sh'
sh './extract_assets.py jp us eu sh cn'
}
}
stage('Build U Source') {
stage('Build US Source') {
steps {
sh 'make -j4 VERSION=us VERBOSE=1 COLOR=0'
}
}
stage('Build S Source') {
stage('Build SH Source') {
steps {
sh 'make -j4 VERSION=sh VERBOSE=1 COLOR=0'
}
}
stage('Build E Source') {
stage('Build EU Source') {
steps {
sh 'make -j4 VERSION=eu VERBOSE=1 COLOR=0'
}
}
stage('Build J Source') {
stage('Build JP Source') {
steps {
sh 'make -j4 VERSION=jp VERBOSE=1 COLOR=0'
}
}
stage('Build CN Source') {
steps {
sh 'make -j4 VERSION=cn VERBOSE=1 COLOR=0 COMPARE=0'
}
}
stage('Test Enhancements') {
steps {
sh '''

271
Makefile
View File

@@ -32,29 +32,40 @@ $(eval $(call validate-option,COMPILER,ido gcc))
# us - builds the 1996 North American version
# eu - builds the 1997 PAL version
# sh - builds the 1997 Japanese Shindou version, with rumble pak support
# cn - builds the 2003 Chinese iQue version
VERSION ?= us
$(eval $(call validate-option,VERSION,jp us eu sh))
$(eval $(call validate-option,VERSION,jp us eu sh cn))
ifeq ($(VERSION),jp)
DEFINES += VERSION_JP=1
OPT_FLAGS := -g
GRUCODE ?= f3d_old
VERSION_JP_US ?= true
VERSION_SH_CN ?= false
else ifeq ($(VERSION),us)
DEFINES += VERSION_US=1
OPT_FLAGS := -g
GRUCODE ?= f3d_old
VERSION_JP_US ?= true
VERSION_SH_CN ?= false
else ifeq ($(VERSION),eu)
DEFINES += VERSION_EU=1
OPT_FLAGS := -O2
GRUCODE ?= f3d_new
VERSION_JP_US ?= false
VERSION_SH_CN ?= false
else ifeq ($(VERSION),sh)
DEFINES += VERSION_SH=1
OPT_FLAGS := -O2
GRUCODE ?= f3d_new
VERSION_JP_US ?= false
VERSION_SH_CN ?= true
else ifeq ($(VERSION),cn)
DEFINES += VERSION_CN=1
OPT_FLAGS := -O2
GRUCODE ?= f3d_new
VERSION_JP_US ?= false
VERSION_SH_CN ?= true
endif
TARGET := sm64.$(VERSION)
@@ -129,7 +140,7 @@ $(eval $(call validate-option,COMPARE,0 1))
TARGET_STRING := sm64.$(VERSION).$(GRUCODE)
# If non-default settings were chosen, disable COMPARE
ifeq ($(filter $(TARGET_STRING), sm64.jp.f3d_old sm64.us.f3d_old sm64.eu.f3d_new sm64.sh.f3d_new),)
ifeq ($(filter $(TARGET_STRING), sm64.jp.f3d_old sm64.us.f3d_old sm64.eu.f3d_new sm64.sh.f3d_new sm64.cn.f3d_new),)
COMPARE := 0
endif
@@ -161,6 +172,7 @@ ifeq ($(filter clean distclean,$(MAKECMDGOALS)),)
$(info =======================)
endif
DEFINES += _FINALROM=1
#==============================================================================#
# Universal Dependencies #
@@ -186,11 +198,16 @@ ifeq ($(filter clean distclean print-%,$(MAKECMDGOALS)),)
endif
# Make tools if out of date
$(info Building tools...)
$(info Building general tools...)
DUMMY != $(MAKE) -s -C $(TOOLS_DIR) $(if $(filter-out ido0,$(COMPILER)$(USE_QEMU_IRIX)),all-except-recomp,) >&2 || echo FAIL
ifeq ($(DUMMY),FAIL)
$(error Failed to build tools)
endif
$(info Building sm64tools...)
DUMMY != $(MAKE) -s -C $(TOOLS_DIR)/sm64tools $(if $(filter-out ido0,$(COMPILER)$(USE_QEMU_IRIX)),) >&2 || echo FAIL
ifeq ($(DUMMY),FAIL)
$(error Failed to build tools)
endif
$(info Building ROM...)
endif
@@ -207,6 +224,8 @@ ROM := $(BUILD_DIR)/$(TARGET).z64
ELF := $(BUILD_DIR)/$(TARGET).elf
LIBULTRA := $(BUILD_DIR)/libultra.a
LD_SCRIPT := sm64.ld
CHARMAP := charmap.txt
CHARMAP_DEBUG := charmap.debug.txt
MIO0_DIR := $(BUILD_DIR)/bin
SOUND_BIN_DIR := $(BUILD_DIR)/sound
TEXTURE_DIR := textures
@@ -217,6 +236,10 @@ LEVEL_DIRS := $(patsubst levels/%,%,$(dir $(wildcard levels/*/header.h)))
SRC_DIRS := src src/engine src/game src/audio src/menu src/buffers actors levels bin data assets asm lib sound
BIN_DIRS := bin bin/$(VERSION)
ifeq ($(VERSION),cn)
LIBGCC_SRC_DIRS += lib/src/libgcc
endif
ULTRA_SRC_DIRS := lib/src lib/src/math lib/asm lib/data
ULTRA_BIN_DIRS := lib/bin
@@ -232,6 +255,7 @@ S_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.s))
ULTRA_C_FILES := $(foreach dir,$(ULTRA_SRC_DIRS),$(wildcard $(dir)/*.c))
GODDARD_C_FILES := $(foreach dir,$(GODDARD_SRC_DIRS),$(wildcard $(dir)/*.c))
ULTRA_S_FILES := $(foreach dir,$(ULTRA_SRC_DIRS),$(wildcard $(dir)/*.s))
LIBGCC_C_FILES := $(foreach dir,$(LIBGCC_SRC_DIRS),$(wildcard $(dir)/*.c))
GENERATED_C_FILES := $(BUILD_DIR)/assets/mario_anim_data.c $(BUILD_DIR)/assets/demo_data.c
# Sound files
@@ -240,7 +264,11 @@ SOUND_SAMPLE_DIRS := $(wildcard sound/samples/*)
SOUND_SAMPLE_AIFFS := $(foreach dir,$(SOUND_SAMPLE_DIRS),$(wildcard $(dir)/*.aiff))
SOUND_SAMPLE_TABLES := $(foreach file,$(SOUND_SAMPLE_AIFFS),$(BUILD_DIR)/$(file:.aiff=.table))
SOUND_SAMPLE_AIFCS := $(foreach file,$(SOUND_SAMPLE_AIFFS),$(BUILD_DIR)/$(file:.aiff=.aifc))
SOUND_SEQUENCE_DIRS := sound/sequences sound/sequences/$(VERSION)
ifeq ($(VERSION),cn)
SOUND_SEQUENCE_DIRS := sound/sequences sound/sequences/sh
else
SOUND_SEQUENCE_DIRS := sound/sequences sound/sequences/$(VERSION)
endif
# all .m64 files in SOUND_SEQUENCE_DIRS, plus all .m64 files that are generated from .s files in SOUND_SEQUENCE_DIRS
SOUND_SEQUENCE_FILES := \
$(foreach dir,$(SOUND_SEQUENCE_DIRS),\
@@ -258,16 +286,14 @@ ULTRA_O_FILES := $(foreach file,$(ULTRA_S_FILES),$(BUILD_DIR)/$(file:.s=.o)) \
GODDARD_O_FILES := $(foreach file,$(GODDARD_C_FILES),$(BUILD_DIR)/$(file:.c=.o))
LIBGCC_O_FILES := $(foreach file,$(LIBGCC_C_FILES),$(BUILD_DIR)/$(file:.c=.o))
# Automatic dependency files
DEP_FILES := $(O_FILES:.o=.d) $(ULTRA_O_FILES:.o=.d) $(GODDARD_O_FILES:.o=.d) $(BUILD_DIR)/$(LD_SCRIPT).d
DEP_FILES := $(O_FILES:.o=.d) $(ULTRA_O_FILES:.o=.d) $(GODDARD_O_FILES:.o=.d) $(LIBGCC_O_FILES:.o=.d) $(BUILD_DIR)/$(LD_SCRIPT).d
# Files with GLOBAL_ASM blocks
ifeq ($(NON_MATCHING),0)
ifeq ($(VERSION),sh)
GLOBAL_ASM_C_FILES != grep -rl 'GLOBAL_ASM(' $(wildcard src/**/*.c) $(wildcard lib/src/*.c)
else
GLOBAL_ASM_C_FILES != grep -rl 'GLOBAL_ASM(' $(wildcard src/**/*.c)
endif
GLOBAL_ASM_C_FILES != grep -rl 'GLOBAL_ASM(' $(wildcard src/**/*.c)
GLOBAL_ASM_O_FILES = $(foreach file,$(GLOBAL_ASM_C_FILES),$(BUILD_DIR)/$(file:.c=.o))
GLOBAL_ASM_DEP = $(BUILD_DIR)/src/audio/non_matching_dep
endif
@@ -277,6 +303,9 @@ endif
# Compiler Options #
#==============================================================================#
IQUE_EGCS_PATH := $(TOOLS_DIR)/ique_egcs
IQUE_LD_PATH := $(TOOLS_DIR)/ique_ld
# detect prefix for MIPS toolchain
ifneq ($(call find-command,mips-linux-gnu-ld),)
CROSS := mips-linux-gnu-
@@ -288,26 +317,30 @@ else
$(error Unable to detect a suitable MIPS toolchain installed)
endif
AS := $(CROSS)as
AS := $(CROSS)as
ifeq ($(COMPILER),gcc)
CC := $(CROSS)gcc
CC := $(CROSS)gcc
else
ifeq ($(USE_QEMU_IRIX),1)
IRIX_ROOT := $(TOOLS_DIR)/ido5.3_compiler
CC := $(QEMU_IRIX) -silent -L $(IRIX_ROOT) $(IRIX_ROOT)/usr/bin/cc
ACPP := $(QEMU_IRIX) -silent -L $(IRIX_ROOT) $(IRIX_ROOT)/usr/lib/acpp
COPT := $(QEMU_IRIX) -silent -L $(IRIX_ROOT) $(IRIX_ROOT)/usr/lib/copt
CC := $(QEMU_IRIX) -silent -L $(IRIX_ROOT) $(IRIX_ROOT)/usr/bin/cc
ACPP := $(QEMU_IRIX) -silent -L $(IRIX_ROOT) $(IRIX_ROOT)/usr/lib/acpp
COPT := $(QEMU_IRIX) -silent -L $(IRIX_ROOT) $(IRIX_ROOT)/usr/lib/copt
else
IDO_ROOT := $(TOOLS_DIR)/ido5.3_recomp
CC := $(IDO_ROOT)/cc
ACPP := $(IDO_ROOT)/acpp
COPT := $(IDO_ROOT)/copt
IDO_ROOT := $(TOOLS_DIR)/ido-static-recomp/build/out
CC := $(IDO_ROOT)/cc
ACPP := $(IDO_ROOT)/acpp
COPT := $(IDO_ROOT)/copt
endif
endif
LD := $(CROSS)ld
AR := $(CROSS)ar
OBJDUMP := $(CROSS)objdump
OBJCOPY := $(CROSS)objcopy
ifeq ($(VERSION),cn)
LD := LD_LIBRARY_PATH=$(IQUE_LD_PATH) $(IQUE_LD_PATH)/mips64-elf-ld
else
LD := $(CROSS)ld
endif
AR := $(CROSS)ar
OBJDUMP := $(CROSS)objdump
OBJCOPY := $(CROSS)objcopy
ifeq ($(TARGET_N64),1)
TARGET_CFLAGS := -nostdinc -DTARGET_N64 -D_LANGUAGE_C
@@ -322,13 +355,41 @@ endif
C_DEFINES := $(foreach d,$(DEFINES),-D$(d))
DEF_INC_CFLAGS := $(foreach i,$(INCLUDE_DIRS),-I$(i)) $(C_DEFINES)
IQUE_AS := $(IQUE_EGCS_PATH)/as
IQUE_ASFLAGS = -mcpu=r4300 -mabi=32 $(MIPSISET) $(foreach i,$(INCLUDE_DIRS),-I$(i)) $(foreach d,$(DEFINES),--defsym $(d))
ifeq ($(VERSION),cn)
IQUE_REASSEMBLED_ASM_FILES := $(wildcard asm/*.s) $(wildcard lib/asm/*.s)
IQUE_REASSEMBLED_ASM_FILES := $(filter-out asm/ipl3_font.s,$(IQUE_REASSEMBLED_ASM_FILES))
IQUE_REASSEMBLED := $(foreach file,$(IQUE_REASSEMBLED_ASM_FILES),$(BUILD_DIR)/$(file:.s=.o))
$(IQUE_REASSEMBLED): AS := $(IQUE_AS)
$(IQUE_REASSEMBLED): MIPSISET :=
$(IQUE_REASSEMBLED): ASFLAGS = $(IQUE_ASFLAGS)
endif
IQUE_CC := COMPILER_PATH=$(IQUE_EGCS_PATH) $(IQUE_EGCS_PATH)/gcc
IQUE_CFLAGS = -G 0 $(TARGET_CFLAGS) $(OPT_FLAGS) -D__sgi -DBBPLAYER -mcpu=r4300 -mgp32 -fno-pic -Wa,--strip-local-absolute $(MIPSISET) $(DEF_INC_CFLAGS)
# iQue recompiled some files with a different compiler
ifeq ($(VERSION),cn)
IQUE_RECOMPILED_SRC_GAME := $(addprefix $(BUILD_DIR)/src/game/,rumble_init.o level_update.o memory.o area.o print.o ingame_menu.o hud.o cn_common_syms_1.o cn_common_syms_2.o) $(addprefix $(BUILD_DIR)/src/menu/,title_screen.o intro_geo.o file_select.o star_select.o)
IQUE_RECOMPILED_LIB_SRC := $(ULTRA_O_FILES)
# osDriveRomInit is weird
IQUE_RECOMPILED_LIB_SRC := $(filter-out $(addprefix $(BUILD_DIR)/lib/src/,osDriveRomInit.o),$(IQUE_RECOMPILED_LIB_SRC))
IQUE_RECOMPILED_LIBGCC_SRC := $(LIBGCC_O_FILES)
IQUE_RECOMPILED = $(IQUE_RECOMPILED_SRC_GAME) $(IQUE_RECOMPILED_LIB_SRC) $(IQUE_RECOMPILED_LIBGCC_SRC)
$(IQUE_RECOMPILED): CC := $(IQUE_CC)
$(IQUE_RECOMPILED): MIPSISET :=
$(IQUE_RECOMPILED): CFLAGS = $(IQUE_CFLAGS)
endif
# Prefer clang as C preprocessor if installed on the system
ifneq (,$(call find-command,clang))
CPP := clang
CPPFLAGS := -E -P -x c -Wno-trigraphs $(DEF_INC_CFLAGS)
CPPFLAGS := -E -P -x c -Wno-trigraphs -D_LANGUAGE_ASSEMBLY $(DEF_INC_CFLAGS)
else
CPP := cpp
CPPFLAGS := -P -Wno-trigraphs $(DEF_INC_CFLAGS)
CPPFLAGS := -P -Wno-trigraphs -D_LANGUAGE_ASSEMBLY $(DEF_INC_CFLAGS)
endif
# Check code syntax with host compiler
@@ -343,7 +404,7 @@ else
CFLAGS += -non_shared -Wab,-r4300_mul -Xcpluscomm -Xfullwarn -signed -32
endif
ASFLAGS := -march=vr4300 -mabi=32 $(foreach i,$(INCLUDE_DIRS),-I$(i)) $(foreach d,$(DEFINES),--defsym $(d))
ASFLAGS := -march=vr4300 -mabi=32 $(foreach i,$(INCLUDE_DIRS),-I$(i)) $(foreach d,$(DEFINES),--defsym $(d))
RSPASMFLAGS := $(foreach d,$(DEFINES),-definelabel $(subst =, ,$(d)))
ifeq ($(shell getconf LONG_BIT), 32)
@@ -362,10 +423,10 @@ export LANG := C
#==============================================================================#
# N64 tools
MIO0TOOL := $(TOOLS_DIR)/mio0
N64CKSUM := $(TOOLS_DIR)/n64cksum
N64GRAPHICS := $(TOOLS_DIR)/n64graphics
N64GRAPHICS_CI := $(TOOLS_DIR)/n64graphics_ci
MIO0TOOL := $(TOOLS_DIR)/sm64tools/mio0
N64CKSUM := $(TOOLS_DIR)/sm64tools/n64cksum
N64GRAPHICS := $(TOOLS_DIR)/sm64tools/n64graphics
N64GRAPHICS_CI := $(TOOLS_DIR)/sm64tools/n64graphics_ci
TEXTCONV := $(TOOLS_DIR)/textconv
AIFF_EXTRACT_CODEBOOK := $(TOOLS_DIR)/aiff_extract_codebook
VADPCM_ENC := $(TOOLS_DIR)/vadpcm_enc
@@ -394,10 +455,13 @@ YELLOW := \033[0;33m
BLINK := \033[33;5m
endif
# Use Objcopy instead of extract_data_for_mio
# Use objcopy instead of extract_data_for_mio to get 16-byte aligned padding
ifeq ($(COMPILER),gcc)
EXTRACT_DATA_FOR_MIO := $(OBJCOPY) -O binary --only-section=.data
endif
ifeq ($(VERSION),cn)
EXTRACT_DATA_FOR_MIO := $(OBJCOPY) -O binary --only-section=.data
endif
# Common build print status function
define print
@@ -420,6 +484,7 @@ clean:
distclean: clean
$(PYTHON) extract_assets.py --clean
$(MAKE) -C $(TOOLS_DIR) clean
$(MAKE) -C $(TOOLS_DIR)/sm64tools clean
test: $(ROM)
$(EMULATOR) $(EMU_FLAGS) $<
@@ -430,13 +495,13 @@ load: $(ROM)
libultra: $(BUILD_DIR)/libultra.a
# Extra object file dependencies
$(BUILD_DIR)/asm/boot.o: $(IPL3_RAW_FILES)
$(BUILD_DIR)/asm/ipl3_font.o: $(IPL3_RAW_FILES)
$(BUILD_DIR)/src/game/crash_screen.o: $(CRASH_TEXTURE_C_FILES)
$(BUILD_DIR)/lib/rsp.o: $(BUILD_DIR)/rsp/rspboot.bin $(BUILD_DIR)/rsp/fast3d.bin $(BUILD_DIR)/rsp/audio.bin
$(SOUND_BIN_DIR)/sound_data.o: $(SOUND_BIN_DIR)/sound_data.ctl.inc.c $(SOUND_BIN_DIR)/sound_data.tbl.inc.c $(SOUND_BIN_DIR)/sequences.bin.inc.c $(SOUND_BIN_DIR)/bank_sets.inc.c
$(BUILD_DIR)/levels/scripts.o: $(BUILD_DIR)/include/level_headers.h
ifeq ($(VERSION),sh)
ifeq ($(VERSION_SH_CN),true)
$(BUILD_DIR)/src/audio/load_sh.o: $(SOUND_BIN_DIR)/bank_sets.inc.c $(SOUND_BIN_DIR)/sequences_header.inc.c $(SOUND_BIN_DIR)/ctl_header.inc.c $(SOUND_BIN_DIR)/tbl_header.inc.c
endif
@@ -468,8 +533,9 @@ else
$(BUILD_DIR)/bin/segment2.o: $(BUILD_DIR)/text/$(VERSION)/define_text.inc.c
endif
endif
$(BUILD_DIR)/bin/segment2.o: $(BUILD_DIR)/text/debug_text.raw.inc.c
ALL_DIRS := $(BUILD_DIR) $(addprefix $(BUILD_DIR)/,$(SRC_DIRS) $(GODDARD_SRC_DIRS) $(ULTRA_SRC_DIRS) $(ULTRA_BIN_DIRS) $(BIN_DIRS) $(TEXTURE_DIRS) $(TEXT_DIRS) $(SOUND_SAMPLE_DIRS) $(addprefix levels/,$(LEVEL_DIRS)) rsp include) $(MIO0_DIR) $(addprefix $(MIO0_DIR)/,$(VERSION)) $(SOUND_BIN_DIR) $(SOUND_BIN_DIR)/sequences/$(VERSION)
ALL_DIRS := $(BUILD_DIR) $(addprefix $(BUILD_DIR)/,$(SRC_DIRS) $(GODDARD_SRC_DIRS) $(ULTRA_SRC_DIRS) $(ULTRA_BIN_DIRS) $(LIBGCC_SRC_DIRS) $(BIN_DIRS) $(TEXTURE_DIRS) $(TEXT_DIRS) $(SOUND_SAMPLE_DIRS) $(addprefix levels/,$(LEVEL_DIRS)) rsp include) $(MIO0_DIR) $(addprefix $(MIO0_DIR)/,$(VERSION)) $(SOUND_BIN_DIR) $(SOUND_BIN_DIR)/sequences/$(VERSION)
# Make sure build directory exists before compiling anything
DUMMY != mkdir -p $(ALL_DIRS)
@@ -608,18 +674,27 @@ $(BUILD_DIR)/assets/demo_data.c: assets/demo_data.json $(wildcard assets/demos/*
$(V)$(PYTHON) $(TOOLS_DIR)/demo_data_converter.py assets/demo_data.json $(DEF_INC_CFLAGS) > $@
# Encode in-game text strings
$(BUILD_DIR)/include/text_strings.h: include/text_strings.h.in
$(BUILD_DIR)/$(CHARMAP): $(CHARMAP)
$(call print,Preprocessing charmap:,$<,$@)
$(V)$(CPP) $(CPPFLAGS) -DBUILD_DIR=$(BUILD_DIR) -MMD -MP -MT $@ -MF $@.d -o $@ $<
$(BUILD_DIR)/$(CHARMAP_DEBUG): $(CHARMAP)
$(call print,Preprocessing charmap:,$<,$@)
$(V)$(CPP) $(CPPFLAGS) -DCHARMAP_DEBUG -DBUILD_DIR=$(BUILD_DIR) -MMD -MP -MT $@ -MF $@.d -o $@ $<
$(BUILD_DIR)/include/text_strings.h: include/text_strings.h.in $(BUILD_DIR)/$(CHARMAP)
$(call print,Encoding:,$<,$@)
$(V)$(TEXTCONV) charmap.txt $< $@
$(V)$(TEXTCONV) $(BUILD_DIR)/$(CHARMAP) $< $@
$(BUILD_DIR)/include/text_menu_strings.h: include/text_menu_strings.h.in
$(call print,Encoding:,$<,$@)
$(V)$(TEXTCONV) charmap_menu.txt $< $@
$(BUILD_DIR)/text/%/define_courses.inc.c: text/define_courses.inc.c text/%/courses.h
@$(PRINT) "$(GREEN)Preprocessing: $(BLUE)$@ $(NO_COL)\n"
$(V)$(CPP) $(CPPFLAGS) $< -o - -I text/$*/ | $(TEXTCONV) charmap.txt - $@
$(V)$(CPP) $(CPPFLAGS) $< -o - -I text/$*/ | $(TEXTCONV) $(BUILD_DIR)/$(CHARMAP) - $@
$(BUILD_DIR)/text/%/define_text.inc.c: text/define_text.inc.c text/%/courses.h text/%/dialogs.h
@$(PRINT) "$(GREEN)Preprocessing: $(BLUE)$@ $(NO_COL)\n"
$(V)$(CPP) $(CPPFLAGS) $< -o - -I text/$*/ | $(TEXTCONV) charmap.txt - $@
$(V)$(CPP) $(CPPFLAGS) $< -o - -I text/$*/ | $(TEXTCONV) $(BUILD_DIR)/$(CHARMAP) - $@
$(BUILD_DIR)/text/debug_text.raw.inc.c: text/debug_text.inc.c $(BUILD_DIR)/$(CHARMAP_DEBUG)
@$(PRINT) "$(GREEN)Preprocessing: $(BLUE)$@ $(NO_COL)\n"
$(V)$(CPP) $(CPPFLAGS) $< -o - -I text/$*/ | $(TEXTCONV) $(BUILD_DIR)/$(CHARMAP_DEBUG) - $@
# Level headers
$(BUILD_DIR)/include/level_headers.h: levels/level_headers.h.in
@@ -645,12 +720,18 @@ $(GLOBAL_ASM_DEP).$(NON_MATCHING):
# Compile C code
$(BUILD_DIR)/%.o: %.c
$(call print,Compiling:,$<,$@)
@$(CC_CHECK) $(CC_CHECK_CFLAGS) -MMD -MP -MT $@ -MF $(BUILD_DIR)/$*.d $<
$(V)$(CC_CHECK) $(CC_CHECK_CFLAGS) -MMD -MP -MT $@ -MF $(BUILD_DIR)/$*.d $<
$(V)$(CC) -c $(CFLAGS) -o $@ $<
ifeq ($(VERSION),cn)
$(V)$(TOOLS_DIR)/patch_elf_32bit $@
endif
$(BUILD_DIR)/%.o: $(BUILD_DIR)/%.c
$(call print,Compiling:,$<,$@)
@$(CC_CHECK) $(CC_CHECK_CFLAGS) -MMD -MP -MT $@ -MF $(BUILD_DIR)/$*.d $<
$(V)$(CC_CHECK) $(CC_CHECK_CFLAGS) -MMD -MP -MT $@ -MF $(BUILD_DIR)/$*.d $<
$(V)$(CC) -c $(CFLAGS) -o $@ $<
ifeq ($(VERSION),cn)
$(V)$(TOOLS_DIR)/patch_elf_32bit $@
endif
# Alternate compiler flags needed for matching
ifeq ($(COMPILER),ido)
@@ -659,6 +740,8 @@ ifeq ($(COMPILER),ido)
$(BUILD_DIR)/bin/%.o: OPT_FLAGS := -g
$(BUILD_DIR)/src/goddard/%.o: OPT_FLAGS := -g
$(BUILD_DIR)/src/goddard/%.o: MIPSISET := -mips1
$(BUILD_DIR)/lib/asm/__osDisableInt.o: MIPSISET := -mips2
$(BUILD_DIR)/lib/asm/bcopy.o: MIPSISET := -mips2
$(BUILD_DIR)/lib/src/%.o: OPT_FLAGS :=
$(BUILD_DIR)/lib/src/math/%.o: OPT_FLAGS := -O2
$(BUILD_DIR)/lib/src/math/ll%.o: OPT_FLAGS :=
@@ -667,14 +750,97 @@ ifeq ($(COMPILER),ido)
$(BUILD_DIR)/lib/src/string.o: OPT_FLAGS := -O2
$(BUILD_DIR)/lib/src/gu%.o: OPT_FLAGS := -O3
$(BUILD_DIR)/lib/src/al%.o: OPT_FLAGS := -O3
ifeq ($(VERSION),sh)
ifeq ($(VERSION_SH_CN),true)
$(BUILD_DIR)/lib/src/_Ldtob.o: OPT_FLAGS := -O3
$(BUILD_DIR)/lib/src/_Litob.o: OPT_FLAGS := -O3
$(BUILD_DIR)/lib/src/_Printf.o: OPT_FLAGS := -O3
$(BUILD_DIR)/lib/src/sprintf.o: OPT_FLAGS := -O3
$(BUILD_DIR)/lib/src/osDriveRomInit.o: OPT_FLAGS := -g
endif
ifeq ($(VERSION),cn)
$(BUILD_DIR)/lib/src/osAiSetFrequency.o: MIPSISET := -mips2
$(BUILD_DIR)/lib/src/osVirtualToPhysical.o: OPT_FLAGS := -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osInitializeIQueWrapper.o: OPT_FLAGS := -O2
$(BUILD_DIR)/lib/src/osAiGetLength.o: OPT_FLAGS := -O2
$(BUILD_DIR)/lib/src/osAiSetFrequency.o: OPT_FLAGS := -O2
$(BUILD_DIR)/lib/src/math/cosf.o: OPT_FLAGS := -O2 -mips2
$(BUILD_DIR)/lib/src/guOrthoF.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/guPerspectiveF.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osAiSetNextBuffer.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osContStartReadData.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osContInit.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/math/sinf.o: OPT_FLAGS := -O2 -mips2
$(BUILD_DIR)/lib/src/math/ll%.o: OPT_FLAGS := -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/string.o: OPT_FLAGS := -O2 -mips2
$(BUILD_DIR)/lib/src/sprintf.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osSyncPrintf.o: OPT_FLAGS := -O2
$(BUILD_DIR)/lib/src/_Printf.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osCreateMesgQueue.o: OPT_FLAGS := -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osRecvMesg.o: OPT_FLAGS := -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osSendMesg.o: OPT_FLAGS := -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osSetEventMesg.o: OPT_FLAGS := -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osSpTaskLoadGo.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osSpTaskYield.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osSpTaskYielded.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/__osSiRawStartDma.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/__osSiCreateAccessQueue.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osCreateThread.o: OPT_FLAGS := -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osSetThreadPri.o: OPT_FLAGS := -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osStartThread.o: OPT_FLAGS := -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/__osDequeueThread.o: OPT_FLAGS := -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/__osGetCurrFaultedThread.o: OPT_FLAGS := -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osGetTime.o: OPT_FLAGS := -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osSetTime.o: OPT_FLAGS := -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osSetTimer.o: OPT_FLAGS := -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osTimer.o: OPT_FLAGS := -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osCreateViManager.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osViSetEvent.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osViSetMode.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osViSetSpecialFeatures.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osViSwapBuffer.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/__osViSwapContext.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osViBlack.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/guRotateF.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osEepromProbe.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osEepromLongWrite.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osEepromLongRead.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osCreatePiManager.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osEPiRawStartDma.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/epidma.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osCartRomInit.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/__osDevMgrMain.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/__osPiCreateAccessQueue.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osPiStartDma.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/motor.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osInitialize.o: OPT_FLAGS := -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/__osAiDeviceBusy.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/_Litob.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/_Ldtob.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osJamMesg.o: OPT_FLAGS := -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/__osSpDeviceBusy.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/__osSpGetStatus.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/__osSpSetStatus.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/__osSpSetPc.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/__osSpRawStartDma.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/__osSiRawReadIo.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/__osSiRawWriteIo.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osDestroyThread.o: OPT_FLAGS := -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osGetThreadPri.o: OPT_FLAGS := -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osYieldThread.o: OPT_FLAGS := -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/__osViInit.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/__osViGetCurrentContext.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osEepromRead.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osEepromWrite.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/__osSetGlobalIntMask.o: OPT_FLAGS := -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/__osResetGlobalIntMask.o: OPT_FLAGS := -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osPiRawStartDma.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osPiGetCmdQueue.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osEPiRawReadIo.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/osEPiRawWriteIo.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/ldiv.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/__osSiDeviceBusy.o: OPT_FLAGS := -O2 -mno-abicalls -mips2
$(BUILD_DIR)/lib/src/libgcc/%.o: OPT_FLAGS := -O2 -g -mips2
endif
ifeq ($(VERSION),eu)
$(BUILD_DIR)/lib/src/_Ldtob.o: OPT_FLAGS := -O3
$(BUILD_DIR)/lib/src/_Litob.o: OPT_FLAGS := -O3
@@ -733,16 +899,31 @@ $(BUILD_DIR)/libgoddard.a: $(GODDARD_O_FILES)
@$(PRINT) "$(GREEN)Linking libgoddard: $(BLUE)$@ $(NO_COL)\n"
$(V)$(AR) rcs -o $@ $(GODDARD_O_FILES)
# Link libgcc
$(BUILD_DIR)/libgcc.a: $(LIBGCC_O_FILES)
@$(PRINT) "$(GREEN)Linking libgcc: $(BLUE)$@ $(NO_COL)\n"
$(V)$(AR) rcs -o $@ $(LIBGCC_O_FILES)
# Link SM64 ELF file
$(ELF): $(O_FILES) $(MIO0_OBJ_FILES) $(SEG_FILES) $(BUILD_DIR)/$(LD_SCRIPT) undefined_syms.txt $(BUILD_DIR)/libultra.a $(BUILD_DIR)/libgoddard.a
$(ELF): $(O_FILES) $(MIO0_OBJ_FILES) $(SEG_FILES) $(BUILD_DIR)/$(LD_SCRIPT) undefined_syms.txt $(BUILD_DIR)/libultra.a $(BUILD_DIR)/libgoddard.a $(BUILD_DIR)/libgcc.a
@$(PRINT) "$(GREEN)Linking ELF file: $(BLUE)$@ $(NO_COL)\n"
$(V)$(LD) -L $(BUILD_DIR) -T undefined_syms.txt -T $(BUILD_DIR)/$(LD_SCRIPT) -Map $(BUILD_DIR)/sm64.$(VERSION).map --no-check-sections $(addprefix -R ,$(SEG_FILES)) -o $@ $(O_FILES) -lultra -lgoddard
$(V)$(LD) -L $(BUILD_DIR) -T undefined_syms.txt -T $(BUILD_DIR)/$(LD_SCRIPT) -Map $(BUILD_DIR)/sm64.$(VERSION).map --no-check-sections $(addprefix -R ,$(SEG_FILES)) -o $@ $(O_FILES) -lultra -lgoddard -lgcc
# Build ROM
ifeq ($(VERSION),cn)
PAD_TO_GAP_FILL := --pad-to=0x7B0000 --gap-fill=0x00
else
PAD_TO_GAP_FILL := --pad-to=0x800000 --gap-fill=0xFF
endif
$(ROM): $(ELF)
$(call print,Building ROM:,$<,$@)
$(V)$(OBJCOPY) --pad-to=0x800000 --gap-fill=0xFF $< $(@:.z64=.bin) -O binary
ifeq ($(VERSION),cn) # cn has no checksums
$(V)$(OBJCOPY) $(PAD_TO_GAP_FILL) $< $(@) -O binary
else
$(V)$(OBJCOPY) $(PAD_TO_GAP_FILL) $< $(@:.z64=.bin) -O binary
$(V)$(N64CKSUM) $(@:.z64=.bin) $@
endif
$(BUILD_DIR)/$(TARGET).objdump: $(ELF)
$(OBJDUMP) -D $< > $@

View File

@@ -178,6 +178,9 @@ $(eval $(call level_rules,menu,generic)) # Menu (File Select)
# --------------------------------------
# Ending cake textures are generated in a special way
$(BUILD_DIR)/levels/ending/cake_cn.inc.c: levels/ending/cake_cn.png
$(call print,Splitting:,$<,$@)
$(V)$(SKYCONV) --type cake-cn --split $^ $(BUILD_DIR)/levels/ending
$(BUILD_DIR)/levels/ending/cake_eu.inc.c: levels/ending/cake_eu.png
$(call print,Splitting:,$<,$@)
$(V)$(SKYCONV) --type cake-eu --split $^ $(BUILD_DIR)/levels/ending

View File

@@ -1,6 +1,6 @@
# Super Mario 64
- This repo contains a full decompilation of Super Mario 64 (J), (U), (E), and (SH).
- This repo contains a full decompilation of Super Mario 64 of the following releases: Japan (jp), North America (us), Europe (eu), Shindou (sh) and iQue Player (cn).
- Naming and documentation of the source code and data structures are in progress.
It builds the following ROMs:
@@ -9,16 +9,17 @@ It builds the following ROMs:
* sm64.us.z64 `sha1: 9bef1128717f958171a4afac3ed78ee2bb4e86ce`
* sm64.eu.z64 `sha1: 4ac5721683d0e0b6bbb561b58a71740845dceea9`
* sm64.sh.z64 `sha1: 3f319ae697533a255a1003d09202379d78d5a2e0`
* sm64.cn.z64 `sha1: 2e1db2780985a1f068077dc0444b685f39cd90ec`
This repo does not include all assets necessary for compiling the ROMs.
A prior copy of the game is required to extract the assets.
## Quick Start (for Ubuntu)
1. Install prerequisites: `sudo apt install -y build-essential git binutils-mips-linux-gnu python3`
1. Install prerequisites: `sudo apt install -y binutils-mips-linux-gnu build-essential git pkgconf python3`
2. Clone the repo from within Linux: `git clone https://github.com/n64decomp/sm64.git`
3. Place a Super Mario 64 ROM called `baserom.<VERSION>.z64` into the project folder for asset extraction, where `VERSION` can be `us`, `jp`, `eu`, or `sh`.
4. Run `make` to build. Qualify the version through `make VERSION=<VERSION>`. Add `-j4` to improve build speed (hardware dependent).
3. Place a Super Mario 64 ROM called `baserom.<VERSION>.z64` into the project folder for asset extraction, where `VERSION` can be `jp`, `us`, `eu`, `sh`, or `cn`.
4. Run `make` to build. Specify the version through `make VERSION=<VERSION>`. Add `-j4` to improve build speed (hardware dependent).
Ensure the repo path length does not exceed 255 characters. Long path names result in build errors.
@@ -44,7 +45,6 @@ There are 3 steps to set up a working build.
The build system has the following package requirements:
* binutils-mips
* capstone
* pkgconf
* python3 >= 3.6
@@ -53,18 +53,17 @@ Dependency installation instructions for common Linux distros are provided below
##### Debian / Ubuntu
To install build dependencies:
```
sudo apt install -y binutils-mips-linux-gnu build-essential git libcapstone-dev pkgconf python3
sudo apt install -y binutils-mips-linux-gnu build-essential git pkgconf python3
```
##### Arch Linux
To install build dependencies:
```
sudo pacman -S base-devel capstone python
sudo pacman -S base-devel python
```
Install the following AUR packages:
* [mips64-elf-binutils](https://aur.archlinux.org/packages/mips64-elf-binutils) (AUR)
##### Other Linux distributions
Most modern Linux distributions should have equivalent packages to the other two listed above.
@@ -79,7 +78,7 @@ You may also use [Docker](#docker-installation) to handle installing an image wi
#### Step 2: Copy baserom(s) for asset extraction
For each version (jp/us/eu/sh) for which you want to build a ROM, put an existing ROM at
For each version (jp/us/eu/sh/cn) for which you want to build a ROM, put an existing ROM at
`./baserom.<VERSION>.z64` for asset extraction.
##### Step 3: Build the ROM
@@ -95,10 +94,10 @@ Resulting artifacts can be found in the `build` directory.
The full list of configurable variables are listed below, with the default being the first listed:
* ``VERSION``: ``us``, ``jp``, ``eu``, ``sh``
* ``VERSION``: ``jp``, ``us``, ``eu``, ``sh``, ``cn``
* ``GRUCODE``: ``f3d_old``, ``f3d_new``, ``f3dex``, ``f3dex2``, ``f3dzex``
* ``COMPARE``: ``1`` (compare ROM hash), ``0`` (do not compare ROM hash)
* ``NON_MATCHING``: Use functionally equivalent C implementations for non-matchings (Currently there aren't any non-matchings, but this will apply to iQue). Also will avoid instances of undefined behavior.
* ``NON_MATCHING``: Use functionally equivalent C implementations for non-matchings. Also will avoid instances of undefined behavior.
* ``CROSS``: Cross-compiler tool prefix (Example: ``mips64-elf-``).
### macOS
@@ -111,12 +110,12 @@ With macOS, you may either use Homebrew or [Docker](#docker-installation).
Install [Homebrew](https://brew.sh) and the following dependencies:
```
brew update
brew install capstone coreutils make pkg-config tehzz/n64-dev/mips64-elf-binutils
brew install coreutils make pkg-config tehzz/n64-dev/mips64-elf-binutils
```
#### Step 2: Copy baserom(s) for asset extraction
For each version (jp/us/eu/sh) for which you want to build a ROM, put an existing ROM at
For each version (jp/us/eu/sh/cn) for which you want to build a ROM, put an existing ROM at
`./baserom.<VERSION>.z64` for asset extraction.
##### Step 3: Build the ROM
@@ -154,7 +153,7 @@ docker run --rm --mount type=bind,source="$(pwd)",destination=/sm64 --user $UID:
Resulting artifacts can be found in the `build` directory.
## Project Structure
sm64
├── actors: object behaviors, geo layout, and display lists
├── asm: handwritten assembly code, rom header

View File

@@ -1,55 +1,55 @@
const GeoLayout dAmpGeo[] = {
GEO_SHADOW(SHADOW_CIRCLE_4_VERTS, 0xC8, 100),
GEO_OPEN_NODE(),
GEO_SCALE(0x00, 16384),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_ALPHA, 0, 0, 0, dAmpEyeDl),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_SWITCH_CASE(2, geo_switch_anim_state),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_ANIMATED_PART(LAYER_ALPHA, 0, 0, 0, dAmpElectricityDl),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_SWITCH_CASE(2, geo_switch_anim_state),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_ANIMATED_PART(LAYER_ALPHA, 0, 0, 0, dAmpElectricityDl),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_SWITCH_CASE(2, geo_switch_anim_state),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_ANIMATED_PART(LAYER_ALPHA, 0, 0, 0, dAmpElectricityDl),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_SWITCH_CASE(2, geo_switch_anim_state),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_ANIMATED_PART(LAYER_ALPHA, 0, 0, 0, dAmpElectricityDl),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_ALPHA, 0, 0, 0, dAmpMouthDl),
GEO_SHADOW(SHADOW_CIRCLE_4_VERTS, 0xC8, 100),
GEO_OPEN_NODE(),
GEO_SCALE(0x00, 16384),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_BILLBOARD(),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_ALPHA, dAmpBodyDl),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_ALPHA, 0, 0, 0, dAmpEyeDl),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_SWITCH_CASE(2, geo_switch_anim_state),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_ANIMATED_PART(LAYER_ALPHA, 0, 0, 0, dAmpElectricityDl),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_SWITCH_CASE(2, geo_switch_anim_state),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_ANIMATED_PART(LAYER_ALPHA, 0, 0, 0, dAmpElectricityDl),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_SWITCH_CASE(2, geo_switch_anim_state),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_ANIMATED_PART(LAYER_ALPHA, 0, 0, 0, dAmpElectricityDl),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_SWITCH_CASE(2, geo_switch_anim_state),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_ANIMATED_PART(LAYER_ALPHA, 0, 0, 0, dAmpElectricityDl),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_ALPHA, 0, 0, 0, dAmpMouthDl),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_BILLBOARD(),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_ALPHA, dAmpBodyDl),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),
};

View File

@@ -1,25 +1,25 @@
// 0x0C000000
const GeoLayout birds_geo[] = {
GEO_SHADOW(SHADOW_CIRCLE_4_VERTS, 0x96, 100),
GEO_OPEN_NODE(),
GEO_SCALE(0x00, 16384),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, birds_seg5_dl_05000670),
GEO_SHADOW(SHADOW_CIRCLE_4_VERTS, 0x96, 100),
GEO_OPEN_NODE(),
GEO_SCALE(0x00, 16384),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 1, -12, 37, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, birds_seg5_dl_05000528),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 1, -12, -37, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, birds_seg5_dl_05000600),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, birds_seg5_dl_05000670),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 1, -12, 37, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, birds_seg5_dl_05000528),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 1, -12, -37, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, birds_seg5_dl_05000600),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, birds_seg5_dl_05000598),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, birds_seg5_dl_05000598),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),
};

View File

@@ -1,20 +1,20 @@
// 0x0C000240
const GeoLayout blargg_geo[] = {
GEO_SCALE(0x00, 16384),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, blargg_seg5_dl_05005D00),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 306, 0, 0, blargg_seg5_dl_05005A60),
GEO_SCALE(0x00, 16384),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, blargg_seg5_dl_05005D00),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 6, 3, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, blargg_seg5_dl_050058D0),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 306, 0, 0, blargg_seg5_dl_05005A60),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 6, 3, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, blargg_seg5_dl_050058D0),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),
};

View File

@@ -1,10 +1,10 @@
// 0x0F000000
const GeoLayout blue_coin_switch_geo[] = {
GEO_CULLING_RADIUS(300),
GEO_OPEN_NODE(),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_OPAQUE, blue_coin_switch_seg8_dl_08000E08),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),
GEO_CULLING_RADIUS(300),
GEO_OPEN_NODE(),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_OPAQUE, blue_coin_switch_seg8_dl_08000E08),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),
};

View File

@@ -1,32 +1,32 @@
// 0x16000BEC
const GeoLayout fish_shadow_geo[] = {
GEO_SHADOW(SHADOW_CIRCLE_4_VERTS, 0x9B, 50),
GEO_OPEN_NODE(),
GEO_SCALE(0x00, 16384),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, -16, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, blue_fish_seg3_dl_0301BFB8),
GEO_SHADOW(SHADOW_CIRCLE_4_VERTS, 0x9B, 50),
GEO_OPEN_NODE(),
GEO_SCALE(0x00, 16384),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, -16, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 97, 0, 0, blue_fish_seg3_dl_0301C150),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, blue_fish_seg3_dl_0301BFB8),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 97, 0, 0, blue_fish_seg3_dl_0301C150),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),
};
// 0x16000C44
const GeoLayout fish_geo[] = {
GEO_SCALE(0x00, 16384),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, -16, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, blue_fish_seg3_dl_0301BFB8),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 97, 0, 0, blue_fish_seg3_dl_0301C150),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),
GEO_SCALE(0x00, 16384),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, -16, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, blue_fish_seg3_dl_0301BFB8),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 97, 0, 0, blue_fish_seg3_dl_0301C150),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),
};

View File

@@ -1,99 +1,99 @@
// 0x0F0007B8
const GeoLayout black_bobomb_geo[] = {
GEO_SHADOW(SHADOW_CIRCLE_4_VERTS, 0xC8, 70),
GEO_OPEN_NODE(),
GEO_SCALE(0x00, 24576),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_SHADOW(SHADOW_CIRCLE_4_VERTS, 0xC8, 70),
GEO_OPEN_NODE(),
GEO_SCALE(0x00, 24576),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_BILLBOARD(),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_ALPHA, bobomb_seg8_dl_08022D08),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 57, -60, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 91, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, bobomb_seg8_dl_08023270),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 55, 62, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 91, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, bobomb_seg8_dl_08023378),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, bobomb_seg8_dl_08023480),
GEO_SWITCH_CASE(2, geo_switch_anim_state),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_ALPHA, 0, 0, 0, bobomb_seg8_dl_08022B58),
GEO_ANIMATED_PART(LAYER_ALPHA, 0, 0, 0, bobomb_seg8_dl_08022B88),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_BILLBOARD(),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_ALPHA, bobomb_seg8_dl_08022D08),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 57, -60, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 91, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, bobomb_seg8_dl_08023270),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 55, 62, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 91, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, bobomb_seg8_dl_08023378),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, bobomb_seg8_dl_08023480),
GEO_SWITCH_CASE(2, geo_switch_anim_state),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_ALPHA, 0, 0, 0, bobomb_seg8_dl_08022B58),
GEO_ANIMATED_PART(LAYER_ALPHA, 0, 0, 0, bobomb_seg8_dl_08022B88),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),
};
// 0x0F0008F4
const GeoLayout bobomb_buddy_geo[] = {
GEO_SHADOW(SHADOW_CIRCLE_4_VERTS, 0xC8, 70),
GEO_OPEN_NODE(),
GEO_SCALE(0x00, 24576),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_SHADOW(SHADOW_CIRCLE_4_VERTS, 0xC8, 70),
GEO_OPEN_NODE(),
GEO_SCALE(0x00, 24576),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_BILLBOARD(),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_ALPHA, bobomb_seg8_dl_08022D78),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 57, -60, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 91, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, bobomb_seg8_dl_08023270),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 55, 62, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 91, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, bobomb_seg8_dl_08023378),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, bobomb_seg8_dl_08023480),
GEO_SWITCH_CASE(2, geo_switch_anim_state),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_ALPHA, 0, 0, 0, bobomb_seg8_dl_08022B58),
GEO_ANIMATED_PART(LAYER_ALPHA, 0, 0, 0, bobomb_seg8_dl_08022B88),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_BILLBOARD(),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_ALPHA, bobomb_seg8_dl_08022D78),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 57, -60, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 91, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, bobomb_seg8_dl_08023270),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 55, 62, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 91, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, bobomb_seg8_dl_08023378),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, bobomb_seg8_dl_08023480),
GEO_SWITCH_CASE(2, geo_switch_anim_state),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_ALPHA, 0, 0, 0, bobomb_seg8_dl_08022B58),
GEO_ANIMATED_PART(LAYER_ALPHA, 0, 0, 0, bobomb_seg8_dl_08022B88),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),
};

View File

@@ -1,15 +1,15 @@
// 0x0D000B78 / 0BBC
const GeoLayout bowser_bomb_geo[] = {
GEO_CULLING_RADIUS(1000),
GEO_OPEN_NODE(),
GEO_SCALE(0x00, 196608),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_OPAQUE, bomb_seg6_dl_0605A9C0),
GEO_BILLBOARD(),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_ALPHA, bomb_seg6_dl_0605A830),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),
GEO_CULLING_RADIUS(1000),
GEO_OPEN_NODE(),
GEO_SCALE(0x00, 196608),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_OPAQUE, bomb_seg6_dl_0605A9C0),
GEO_BILLBOARD(),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_ALPHA, bomb_seg6_dl_0605A830),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),
};

View File

@@ -1,17 +1,17 @@
// 0x0C000224
const GeoLayout boo_geo[] = {
GEO_SHADOW(SHADOW_CIRCLE_4_VERTS, 0x96, 70),
GEO_OPEN_NODE(),
GEO_SCALE(0x00, 26214),
GEO_OPEN_NODE(),
GEO_ASM(0, geo_update_layer_transparency),
GEO_SWITCH_CASE(2, geo_switch_anim_state),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_OPAQUE, boo_seg5_dl_0500C1B0),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, boo_seg5_dl_0500C1B0),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(), //! more close than open nodes
GEO_END(),
GEO_SHADOW(SHADOW_CIRCLE_4_VERTS, 0x96, 70),
GEO_OPEN_NODE(),
GEO_SCALE(0x00, 26214),
GEO_OPEN_NODE(),
GEO_ASM(0, geo_update_layer_transparency),
GEO_SWITCH_CASE(2, geo_switch_anim_state),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_OPAQUE, boo_seg5_dl_0500C1B0),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, boo_seg5_dl_0500C1B0),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(), //! more close than open nodes
GEO_END(),
};

View File

@@ -1,17 +1,17 @@
// 0x0D0005B0
const GeoLayout boo_castle_geo[] = {
GEO_SHADOW(SHADOW_CIRCLE_4_VERTS, 0x96, 70),
GEO_OPEN_NODE(),
GEO_SCALE(0x00, 26214),
GEO_OPEN_NODE(),
GEO_ASM(0, geo_update_layer_transparency),
GEO_SWITCH_CASE(2, geo_switch_anim_state),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_OPAQUE, boo_castle_seg6_dl_06017CE0),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, boo_castle_seg6_dl_06017CE0),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(), //! more close than open nodes
GEO_END(),
GEO_SHADOW(SHADOW_CIRCLE_4_VERTS, 0x96, 70),
GEO_OPEN_NODE(),
GEO_SCALE(0x00, 26214),
GEO_OPEN_NODE(),
GEO_ASM(0, geo_update_layer_transparency),
GEO_SWITCH_CASE(2, geo_switch_anim_state),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_OPAQUE, boo_castle_seg6_dl_06017CE0),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, boo_castle_seg6_dl_06017CE0),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(), //! more close than open nodes
GEO_END(),
};

View File

@@ -1,8 +1,8 @@
// 0x0C0000C0
const GeoLayout bookend_geo[] = {
GEO_CULLING_RADIUS(300),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_OPAQUE, book_seg5_dl_05002FB0),
GEO_CLOSE_NODE(),
GEO_END(),
GEO_CULLING_RADIUS(300),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_OPAQUE, book_seg5_dl_05002FB0),
GEO_CLOSE_NODE(),
GEO_END(),
};

View File

@@ -1,29 +1,29 @@
// 0x0C000000
const GeoLayout bookend_part_geo[] = {
GEO_SHADOW(SHADOW_CIRCLE_4_VERTS, 0x96, 100),
GEO_OPEN_NODE(),
GEO_SCALE(0x00, 16384),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_SHADOW(SHADOW_CIRCLE_4_VERTS, 0x96, 100),
GEO_OPEN_NODE(),
GEO_SCALE(0x00, 16384),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, bookend_seg5_dl_05001F98),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, bookend_seg5_dl_05001B20),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, bookend_seg5_dl_05002140),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, bookend_seg5_dl_05001F98),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, bookend_seg5_dl_05001B20),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, bookend_seg5_dl_05002140),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, bookend_seg5_dl_05001D68),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, bookend_seg5_dl_05001978),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, bookend_seg5_dl_050022E0),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, bookend_seg5_dl_05001D68),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, bookend_seg5_dl_05001978),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, bookend_seg5_dl_050022E0),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(), //! more close than open nodes
GEO_END(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(), //! more close than open nodes
GEO_END(),
};

View File

@@ -4,24 +4,24 @@
// 0x0F000640
const GeoLayout bowling_ball_geo[] = {
GEO_SHADOW(SHADOW_CIRCLE_4_VERTS, 0xC8, 280),
GEO_OPEN_NODE(),
GEO_SCALE(0x00, 170393),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_ALPHA, bobomb_seg8_dl_08022D08),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),
GEO_SHADOW(SHADOW_CIRCLE_4_VERTS, 0xC8, 280),
GEO_OPEN_NODE(),
GEO_SCALE(0x00, 170393),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_ALPHA, bobomb_seg8_dl_08022D08),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),
};
// 0x0F00066C
const GeoLayout bowling_ball_track_geo[] = {
GEO_NODE_START(),
GEO_OPEN_NODE(),
GEO_SCALE(0x00, 170393),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_ALPHA, bobomb_seg8_dl_08022D08),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),
GEO_NODE_START(),
GEO_OPEN_NODE(),
GEO_SCALE(0x00, 170393),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_ALPHA, bobomb_seg8_dl_08022D08),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),
};

View File

@@ -2,97 +2,97 @@
const s16 dBowserFlamesOrientationValues[] = {
// posX, posY, posZ, rotY, rotX
0, 280, 80, 0x00E9, 0x1A96,
0, 278, 83, 0x00EC, 0x1C7F,
0, 273, 92, 0x00F9, 0x20BF,
0, 268, 102, 0x010F, 0x2519,
0, 263, 109, 0x011D, 0x2751,
0, 263, 110, 0x011C, 0x2714,
0, 265, 106, 0x0112, 0x2601,
0, 268, 102, 0x0109, 0x24C0,
0, 271, 96, 0x00FF, 0x2358,
0, 274, 90, 0x00F7, 0x21CB,
0, 277, 84, 0x00EE, 0x201C,
0, 280, 78, 0x00E7, 0x1E4E,
0, 284, 71, 0x00DF, 0x1C64,
0, 288, 63, 0x00D9, 0x1A61,
0, 291, 56, 0x00D3, 0x184B,
0, 295, 48, 0x00CF, 0x1622,
0, 298, 40, 0x00CA, 0x13E9,
0, 301, 32, 0x00C7, 0x11A5,
0, 304, 23, 0x00C4, 0x0F59,
0, 308, 15, 0x00C1, 0x0D08,
0, 311, 7, 0x00C0, 0x0AB5,
0, 313, 0, 0x00C0, 0x0863,
0, 315, -8, 0x00BF, 0x0615,
0, 317, -15, 0x00CE, 0x03A3,
0, 319, -22, 0x00F8, 0x00ED,
0, 320, -29, 0x0131, 0xFFFF,
0, 322, -36, 0x0172, 0xFFFF,
0, 322, -40, 0x01B5, 0xFFFF,
0, 323, -45, 0x01ED, 0xFFFF,
0, 323, -48, 0x0213, 0xFFFF,
0, 323, -51, 0x0219, 0xFFFF,
0, 323, -52, 0x01F2, 0xFFFF,
0, 323, -51, 0x018F, 0xFFFF,
0, 323, -49, 0x00E5, 0xFFFF,
0, 322, -45, 0xFFFF, 0xFFFF,
0, 320, -35, 0xFFFF, 0xFFFF,
0, 317, -23, 0xFFFF, 0xFFFF,
0, 312, -7, 0xFFFF, 0xFFFF,
0, 306, 11, 0xFFFF, 0xFFFF,
0, 299, 31, 0xFFFF, 0xFFFF,
0, 288, 51, 0xFFFF, 0xFFFF,
0, 278, 70, 0xFFFF, 0xFFFF,
0, 267, 89, 0xFFFF, 0xFFFF,
0, 256, 106, 0xFFFF, 0x023A,
0, 244, 120, 0xFFFF, 0x04AA,
0, 236, 132, 0xFFFF, 0x069F,
0, 229, 139, 0xFFFF, 0x0803,
0, 224, 144, 0xFFFF, 0x08C0,
0, 222, 147, 0xFFFF, 0x0928,
0, 221, 148, 0xFFFF, 0x099D,
0, 221, 149, 0xFFFF, 0x0A16,
0, 221, 150, 0xFFFF, 0x0A8D,
0, 221, 150, 0xFFFF, 0x0AF6,
0, 222, 150, 0xFFFF, 0x0B4A,
0, 222, 150, 0xFFFF, 0x0B84,
0, 222, 149, 0x020A, 0x0BA0,
0, 223, 149, 0x0524, 0x0B9E,
0, 225, 148, 0x07EC, 0x0B84,
0, 226, 147, 0x0A3F, 0x0B57,
0, 227, 145, 0x0BFB, 0x0B1F,
0, 228, 144, 0x0D00, 0x0AE5,
0, 230, 142, 0x0D6F, 0x0AA0,
0, 232, 140, 0x0D8B, 0x0A48,
0, 233, 138, 0x0D5D, 0x09DE,
0, 236, 136, 0x0CED, 0x096A,
0, 238, 134, 0x0C49, 0x08EA,
0, 239, 132, 0x0B76, 0x0863,
0, 241, 130, 0x0A80, 0x07D9,
0, 244, 128, 0x0970, 0x074E,
0, 246, 125, 0x084E, 0x06C7,
0, 248, 122, 0x0723, 0x0649,
0, 251, 120, 0x05F8, 0x05D7,
0, 253, 117, 0x04D6, 0x0579,
0, 254, 114, 0x03C3, 0x0532,
0, 256, 111, 0x02C9, 0x0509,
0, 259, 108, 0x01F0, 0x0504,
0, 261, 105, 0x0141, 0x0525,
0, 262, 103, 0x00C3, 0x0572,
0, 264, 100, 0x006E, 0x0619,
0, 267, 97, 0x0032, 0x0734,
0, 268, 95, 0x000C, 0x08AF,
0, 269, 93, 0xFFFF, 0x0A74,
0, 272, 90, 0xFFFF, 0x0C70,
0, 273, 88, 0xFFFF, 0x0E8E,
0, 274, 86, 0x0014, 0x10B6,
0, 275, 84, 0x0032, 0x12DA,
0, 277, 82, 0x0056, 0x14E1,
0, 277, 82, 0x007E, 0x16B9,
0, 278, 80, 0x00A4, 0x184B,
0, 278, 80, 0x00C6, 0x1983,
0, 279, 80, 0x00DF, 0x1A4D,
0, 280, 80, 0x00E9, 0x1A96,
0, 280, 80, 0x00E9, 0x1A96,
0, 278, 83, 0x00EC, 0x1C7F,
0, 273, 92, 0x00F9, 0x20BF,
0, 268, 102, 0x010F, 0x2519,
0, 263, 109, 0x011D, 0x2751,
0, 263, 110, 0x011C, 0x2714,
0, 265, 106, 0x0112, 0x2601,
0, 268, 102, 0x0109, 0x24C0,
0, 271, 96, 0x00FF, 0x2358,
0, 274, 90, 0x00F7, 0x21CB,
0, 277, 84, 0x00EE, 0x201C,
0, 280, 78, 0x00E7, 0x1E4E,
0, 284, 71, 0x00DF, 0x1C64,
0, 288, 63, 0x00D9, 0x1A61,
0, 291, 56, 0x00D3, 0x184B,
0, 295, 48, 0x00CF, 0x1622,
0, 298, 40, 0x00CA, 0x13E9,
0, 301, 32, 0x00C7, 0x11A5,
0, 304, 23, 0x00C4, 0x0F59,
0, 308, 15, 0x00C1, 0x0D08,
0, 311, 7, 0x00C0, 0x0AB5,
0, 313, 0, 0x00C0, 0x0863,
0, 315, -8, 0x00BF, 0x0615,
0, 317, -15, 0x00CE, 0x03A3,
0, 319, -22, 0x00F8, 0x00ED,
0, 320, -29, 0x0131, 0xFFFF,
0, 322, -36, 0x0172, 0xFFFF,
0, 322, -40, 0x01B5, 0xFFFF,
0, 323, -45, 0x01ED, 0xFFFF,
0, 323, -48, 0x0213, 0xFFFF,
0, 323, -51, 0x0219, 0xFFFF,
0, 323, -52, 0x01F2, 0xFFFF,
0, 323, -51, 0x018F, 0xFFFF,
0, 323, -49, 0x00E5, 0xFFFF,
0, 322, -45, 0xFFFF, 0xFFFF,
0, 320, -35, 0xFFFF, 0xFFFF,
0, 317, -23, 0xFFFF, 0xFFFF,
0, 312, -7, 0xFFFF, 0xFFFF,
0, 306, 11, 0xFFFF, 0xFFFF,
0, 299, 31, 0xFFFF, 0xFFFF,
0, 288, 51, 0xFFFF, 0xFFFF,
0, 278, 70, 0xFFFF, 0xFFFF,
0, 267, 89, 0xFFFF, 0xFFFF,
0, 256, 106, 0xFFFF, 0x023A,
0, 244, 120, 0xFFFF, 0x04AA,
0, 236, 132, 0xFFFF, 0x069F,
0, 229, 139, 0xFFFF, 0x0803,
0, 224, 144, 0xFFFF, 0x08C0,
0, 222, 147, 0xFFFF, 0x0928,
0, 221, 148, 0xFFFF, 0x099D,
0, 221, 149, 0xFFFF, 0x0A16,
0, 221, 150, 0xFFFF, 0x0A8D,
0, 221, 150, 0xFFFF, 0x0AF6,
0, 222, 150, 0xFFFF, 0x0B4A,
0, 222, 150, 0xFFFF, 0x0B84,
0, 222, 149, 0x020A, 0x0BA0,
0, 223, 149, 0x0524, 0x0B9E,
0, 225, 148, 0x07EC, 0x0B84,
0, 226, 147, 0x0A3F, 0x0B57,
0, 227, 145, 0x0BFB, 0x0B1F,
0, 228, 144, 0x0D00, 0x0AE5,
0, 230, 142, 0x0D6F, 0x0AA0,
0, 232, 140, 0x0D8B, 0x0A48,
0, 233, 138, 0x0D5D, 0x09DE,
0, 236, 136, 0x0CED, 0x096A,
0, 238, 134, 0x0C49, 0x08EA,
0, 239, 132, 0x0B76, 0x0863,
0, 241, 130, 0x0A80, 0x07D9,
0, 244, 128, 0x0970, 0x074E,
0, 246, 125, 0x084E, 0x06C7,
0, 248, 122, 0x0723, 0x0649,
0, 251, 120, 0x05F8, 0x05D7,
0, 253, 117, 0x04D6, 0x0579,
0, 254, 114, 0x03C3, 0x0532,
0, 256, 111, 0x02C9, 0x0509,
0, 259, 108, 0x01F0, 0x0504,
0, 261, 105, 0x0141, 0x0525,
0, 262, 103, 0x00C3, 0x0572,
0, 264, 100, 0x006E, 0x0619,
0, 267, 97, 0x0032, 0x0734,
0, 268, 95, 0x000C, 0x08AF,
0, 269, 93, 0xFFFF, 0x0A74,
0, 272, 90, 0xFFFF, 0x0C70,
0, 273, 88, 0xFFFF, 0x0E8E,
0, 274, 86, 0x0014, 0x10B6,
0, 275, 84, 0x0032, 0x12DA,
0, 277, 82, 0x0056, 0x14E1,
0, 277, 82, 0x007E, 0x16B9,
0, 278, 80, 0x00A4, 0x184B,
0, 278, 80, 0x00C6, 0x1983,
0, 279, 80, 0x00DF, 0x1A4D,
0, 280, 80, 0x00E9, 0x1A96,
0, 0, 0, 0x0000, 0x0000,
};

File diff suppressed because it is too large Load Diff

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