summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoremilybrooks <emilybrooksemilybrooks@gmail.com>2024-01-08 13:00:03 -0700
committerGitHub <noreply@github.com>2024-01-08 13:00:03 -0700
commit93fa8a0e9eab5c519113ee0f23ce1961c278195f (patch)
tree42e5e8981b04384ac829fa96c78d8156b5544e5c
parent093b8b7b9b20150a2eb6d2a8ab887f9387298fee (diff)
Implement asset extraction (#131)
* got stuff to extract properly * je and bs extensions done * got symbols named correctly * extensions done, symbol naming done * fixed some errors * fixed more of them * stuff * started editing make file * makefile works * ci4 and palette extensions done * cleaned up ckf_je extension * fixed vertex problem * cleaned up asset yaml * cleaned up extensions * added tol_cracker_1 * builds properly * finished obj_s_yamishop and obj_w_yamishop * updated to work with latest splat * fixes * makefile asset dir * remove old codes from af_ci4.py
-rw-r--r--Makefile36
-rw-r--r--include/c_keyframe.h16
-rw-r--r--include/tables/dmatables/dmadata_table_jp.h4
-rw-r--r--include/tables/object_table.h4
-rw-r--r--linker_scripts/jp/ignored_addresses.txt7
-rw-r--r--linker_scripts/jp/symbol_addrs_assets.txt139
-rw-r--r--src/objects/object_00D5B000/object_00D5B000.c19
-rw-r--r--src/objects/object_00D5E000/object_00D5E000.c87
-rw-r--r--src/objects/tol_cracker_1/tol_cracker_1.c6
-rw-r--r--src/objects/tol_cracker_1/tol_cracker_1.h11
-rw-r--r--src/objects/tol_utiwa_1/tol_utiwa_1.c7
-rw-r--r--src/objects/tol_utiwa_1/tol_utiwa_1.h12
-rw-r--r--src/overlays/actors/ovl_T_Hanabi/ac_t_hanabi.c5
-rw-r--r--src/overlays/actors/ovl_Tools/ac_tools.c13
-rw-r--r--tools/.gitignore1
-rw-r--r--tools/Makefile22
-rw-r--r--tools/bin_inc_c.py17
-rw-r--r--tools/splat_ext/af_ci4.py25
-rw-r--r--tools/splat_ext/af_i4.py22
-rw-r--r--tools/splat_ext/af_i8.py22
-rw-r--r--tools/splat_ext/af_palette.py40
-rw-r--r--tools/splat_ext/ckf_ba.py62
-rw-r--r--tools/splat_ext/ckf_bs.py42
-rw-r--r--tools/splat_ext/ckf_c.py42
-rw-r--r--tools/splat_ext/ckf_ckcb.py42
-rw-r--r--tools/splat_ext/ckf_ds.py44
-rw-r--r--tools/splat_ext/ckf_je.py49
-rw-r--r--tools/splat_ext/ckf_kn.py44
-rw-r--r--yamls/jp/assets.yaml199
-rw-r--r--yamls/jp/header.yaml3
30 files changed, 995 insertions, 47 deletions
diff --git a/Makefile b/Makefile
index f24d501..442c85d 100644
--- a/Makefile
+++ b/Makefile
@@ -111,9 +111,10 @@ ASM_PROC_FLAGS := --input-enc=utf-8 --output-enc=euc-jp --convert-statics=globa
SPLAT ?= python3 -m splat split
SPLAT_YAML ?= $(TARGET).$(VERSION).yaml
+PIGMENT ?=tools/pigment64/pigment64
-IINC := -Iinclude -Isrc -Ibin/$(VERSION) -I.
+IINC := -Iinclude -Isrc -Iassets/$(VERSION) -I. -I$(BUILD_DIR)
IINC += -Ilib/ultralib/include -Ilib/ultralib/include/PR -Ilib/ultralib/include/ido
ifeq ($(KEEP_MDEBUG),0)
@@ -181,19 +182,23 @@ endif
#### Files ####
-$(shell mkdir -p asm/$(VERSION) bin linker_scripts/$(VERSION)/auto)
+$(shell mkdir -p asm/$(VERSION) assets/$(VERSION) linker_scripts/$(VERSION)/auto)
SRC_DIRS := $(shell find src -type d)
ASM_DIRS := $(shell find asm/$(VERSION) -type d -not -path "asm/$(VERSION)/nonmatchings/*" -not -path "asm/$(VERSION)/lib/*")
-BIN_DIRS := $(shell find bin -type d)
+ASSET_DIRS := $(shell find assets/$(VERSION) -type d)
C_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c))
S_FILES := $(foreach dir,$(ASM_DIRS) $(SRC_DIRS),$(wildcard $(dir)/*.s))
-BIN_FILES := $(foreach dir,$(BIN_DIRS),$(wildcard $(dir)/*.bin))
+BIN_FILES := $(foreach dir,$(ASSET_DIRS),$(wildcard $(dir)/*.bin))
O_FILES := $(foreach f,$(C_FILES:.c=.o),$(BUILD_DIR)/$f) \
$(foreach f,$(S_FILES:.s=.o),$(BUILD_DIR)/$f) \
$(foreach f,$(BIN_FILES:.bin=.o),$(BUILD_DIR)/$f)
+ASSET_PNGS := $(foreach dir,$(ASSET_DIRS),$(wildcard $(dir)/*.png))
+ASSET_BINS := $(foreach f,$(ASSET_PNGS:.png=.bin),$(BUILD_DIR)/$f)
+ASSET_INC_C := $(foreach f,$(ASSET_PNGS:.png=.inc.c),$(BUILD_DIR)/$f)
+
LIBULTRA_DIRS := $(shell find lib/ultralib/src -type d \
-not -path "lib/ultralib/src/audio" \
-not -path "lib/ultralib/src/error" \
@@ -217,7 +222,7 @@ DEP_FILES := $(O_FILES:.o=.d) \
$(O_FILES:.o=.asmproc.d)
# create build directories
-$(shell mkdir -p $(BUILD_DIR)/linker_scripts/$(VERSION) $(BUILD_DIR)/linker_scripts/$(VERSION)/auto $(foreach dir,$(SRC_DIRS) $(ASM_DIRS) $(BIN_DIRS),$(BUILD_DIR)/$(dir)))
+$(shell mkdir -p $(BUILD_DIR)/linker_scripts/$(VERSION) $(BUILD_DIR)/linker_scripts/$(VERSION)/auto $(foreach dir,$(SRC_DIRS) $(ASM_DIRS) $(ASSET_DIRS),$(BUILD_DIR)/$(dir)))
# directory flags
@@ -253,13 +258,13 @@ ifneq ($(COMPARE),0)
endif
clean:
- $(RM) -r $(BUILD_DIR)/asm $(BUILD_DIR)/bin $(BUILD_DIR)/src $(ROM) $(ROMC) $(ELF)
+ $(RM) -r $(BUILD_DIR)/asm $(BUILD_DIR)/assets $(BUILD_DIR)/src $(ROM) $(ROMC) $(ELF)
libclean:
$(MAKE) -C lib clean
distclean: clean
- $(RM) -r $(BUILD_DIR) asm/ bin/ .splat/
+ $(RM) -r $(BUILD_DIR) asm/ assets/ .splat/
$(RM) -r linker_scripts/$(VERSION)/auto $(LD_SCRIPT)
$(MAKE) -C tools distclean
$(MAKE) -C lib distclean
@@ -269,7 +274,7 @@ setup:
python3 tools/decompress_baserom.py
extract:
- $(RM) -r asm/$(VERSION) bin/$(VERSION)
+ $(RM) -r asm/$(VERSION) assets/$(VERSION)
$(CAT) yamls/$(VERSION)/header.yaml yamls/$(VERSION)/makerom.yaml yamls/$(VERSION)/boot.yaml yamls/$(VERSION)/code.yaml yamls/$(VERSION)/overlays.yaml yamls/$(VERSION)/assets.yaml > $(SPLAT_YAML)
$(SPLAT) $(SPLAT_FLAGS) $(SPLAT_YAML)
@@ -332,6 +337,21 @@ ifneq ($(PERMUTER), 1)
$(error Library files has not been built, please run `$(MAKE) lib` first)
endif
+# Build C files from assets
+$(BUILD_DIR)/%.bin: %.png
+# file names are formatted as <file name>.<image format>.png
+# The <image format> part is passed into pigment's format argument
+ $(PIGMENT) to-bin -f $(subst .,,$(suffix $*)) -o $@ $<
+
+%.inc.c: %.bin
+# The C name argument uses just the <file name> part, with .<image format>.bin removed
+ python3 tools/bin_inc_c.py $< $@ $(basename $(basename $(notdir $<)))
+
+# Add these as a dependency for .o files
+asset_files: $(ASSET_INC_C)
+$(O_FILES): | asset_files
+.PHONY: asset_files
+
-include $(DEP_FILES)
# Print target for debugging
diff --git a/include/c_keyframe.h b/include/c_keyframe.h
index 7226579..de8c792 100644
--- a/include/c_keyframe.h
+++ b/include/c_keyframe.h
@@ -12,7 +12,7 @@ typedef enum AnimationMode {
/* 1 */ ANIMATION_REPEAT
} AnimationMode;
-typedef struct {
+typedef struct FrameControl {
/* 0x00 */ f32 start;
/* 0x04 */ f32 end;
/* 0x08 */ f32 duration;
@@ -21,27 +21,27 @@ typedef struct {
/* 0x14 */ AnimationMode mode;
} FrameControl; // size = 0x18
-typedef struct {
+typedef struct JointElemR {
/* 0x0 */ Gfx* shape;
/* 0x4 */ u8 numberOfChildren;
/* 0x5 */ u8 displayBufferFlag;
/* 0x6 */ s_xyz translation;
} JointElemR; // size = 0xC
-typedef struct {
+typedef struct BaseSkeletonR {
/* 0x00 */ u8 numberOfJoints;
/* 0x01 */ u8 unk01;
/* 0x04 */ JointElemR* jointElemTable;
} BaseSkeletonR; // size = 0x8
// original name unknown
-typedef struct {
+typedef struct Keyframe {
/* 0x00 */ s16 frame;
/* 0x02 */ s16 value;
/* 0x04 */ s16 velocity;
} Keyframe; // size = 0x06
-typedef struct {
+typedef struct BaseAnimationR {
/* 0x00 */ u8* constKeyCheckBitTable;
/* 0x04 */ Keyframe* dataSource;
/* 0x08 */ s16* keyframeNumber;
@@ -50,7 +50,7 @@ typedef struct {
/* 0x12 */ s16 duration;
} BaseAnimationR; // size = 0x14
-typedef struct {
+typedef struct AnimationMove {
/* 0x00 */ s32 transformationFlag;
/* 0x04 */ xyz_t baseWorldPosition;
/* 0x10 */ s16 baseAngleY;
@@ -62,7 +62,7 @@ typedef struct {
/* 0x3C */ s16 shapeAngleCorrection;
} AnimationMove; // size = 0x40
-typedef struct {
+typedef struct SkeletonInfoR {
/* 0x00 */ FrameControl frameControl;
/* 0x18 */ BaseSkeletonR* skeleton;
/* 0x1C */ BaseAnimationR* animation;
@@ -73,7 +73,7 @@ typedef struct {
/* 0x30 */ AnimationMove animationMove;
} SkeletonInfoR; // size = 0x70
-typedef struct {
+typedef struct SkeletonInfoRCombineWork {
/* 0x00 */ SkeletonInfoR* skeletonInfo;
/* 0x04 */ u8* constKeyCheckBitTable;
/* 0x08 */ s16* constValueTable;
diff --git a/include/tables/dmatables/dmadata_table_jp.h b/include/tables/dmatables/dmadata_table_jp.h
index 76aa51a..9982902 100644
--- a/include/tables/dmatables/dmadata_table_jp.h
+++ b/include/tables/dmatables/dmadata_table_jp.h
@@ -2269,13 +2269,13 @@ DEFINE_DMA_ENTRY(object_01124000, "object_01124000")
DEFINE_DMA_ENTRY(object_01125000, "object_01125000")
DEFINE_DMA_ENTRY(object_01126000, "object_01126000")
DEFINE_DMA_ENTRY(object_01127000, "object_01127000")
-DEFINE_DMA_ENTRY(object_01128000, "object_01128000")
+DEFINE_DMA_ENTRY(tol_utiwa_1, "tol_utiwa_1")
DEFINE_DMA_ENTRY(object_01129000, "object_01129000")
DEFINE_DMA_ENTRY(object_0112A000, "object_0112A000")
DEFINE_DMA_ENTRY(object_0112B000, "object_0112B000")
DEFINE_DMA_ENTRY(object_0112C000, "object_0112C000")
DEFINE_DMA_ENTRY(object_0112D000, "object_0112D000")
-DEFINE_DMA_ENTRY(object_0112F000, "object_0112F000")
+DEFINE_DMA_ENTRY(tol_cracker_1, "tol_cracker_1")
DEFINE_DMA_ENTRY(object_01130000, "object_01130000")
DEFINE_DMA_ENTRY(object_01131000, "object_01131000")
DEFINE_DMA_ENTRY(object_01134000, "object_01134000")
diff --git a/include/tables/object_table.h b/include/tables/object_table.h
index fbb3764..ba183da 100644
--- a/include/tables/object_table.h
+++ b/include/tables/object_table.h
@@ -63,7 +63,7 @@
/* 0x032 */ DEFINE_OBJECT(object_0100B000, OBJECT_50)
/* 0x033 */ DEFINE_OBJECT(object_00D29000, OBJECT_51)
/* 0x034 */ DEFINE_OBJECT(object_00B8F000, OBJECT_52)
-/* 0x035 */ DEFINE_OBJECT(object_01128000, OBJECT_53)
+/* 0x035 */ DEFINE_OBJECT(tol_utiwa_1, OBJECT_TOL_UTIWA_1)
/* 0x036 */ DEFINE_OBJECT(object_01888000, OBJECT_54)
/* 0x037 */ DEFINE_OBJECT(object_01116000, OBJECT_55)
/* 0x038 */ DEFINE_OBJECT(object_01117000, OBJECT_56)
@@ -405,7 +405,7 @@
/* 0x188 */ DEFINE_OBJECT(object_011F4000, OBJECT_392)
/* 0x189 */ DEFINE_OBJECT_UNSET(OBJECT_UNSET_393)
/* 0x18A */ DEFINE_OBJECT(object_01106000, OBJECT_394)
-/* 0x18B */ DEFINE_OBJECT(object_0112F000, OBJECT_395)
+/* 0x18B */ DEFINE_OBJECT(tol_cracker_1, OBJECT_TOL_CRACKER_1)
/* 0x18C */ DEFINE_OBJECT(object_00F45000, OBJECT_396)
/* 0x18D */ DEFINE_OBJECT(object_00F48000, OBJECT_397)
/* 0x18E */ DEFINE_OBJECT(object_00FD6000, OBJECT_398)
diff --git a/linker_scripts/jp/ignored_addresses.txt b/linker_scripts/jp/ignored_addresses.txt
index 50e6352..dd8280f 100644
--- a/linker_scripts/jp/ignored_addresses.txt
+++ b/linker_scripts/jp/ignored_addresses.txt
@@ -31,3 +31,10 @@ D_E4D10 = 0xE4D10; // ignore:true
D_13D9A0 = 0x13D9A0; // ignore:true
D_675720 = 0x675720; // ignore:true
D_73F4D0 = 0x73F4D0; // ignore:true
+
+__osBbIsBb = 0x80000388; // ignore:true
+
+D_6000000 = 0x06000000; // ignore:true
+D_6000040 = 0x06000040; // ignore:true
+D_60003E8 = 0x060003E8; // ignore:true
+D_6001B68 = 0x06001B68; // ignore:true
diff --git a/linker_scripts/jp/symbol_addrs_assets.txt b/linker_scripts/jp/symbol_addrs_assets.txt
new file mode 100644
index 0000000..b275dce
--- /dev/null
+++ b/linker_scripts/jp/symbol_addrs_assets.txt
@@ -0,0 +1,139 @@
+obj_s_house1_a_pal = 0x06000008; // segment:object_00D5B000 rom:0xD5B008
+obj_s_house1_b_pal = 0x06000028; // segment:object_00D5B000 rom:0xD5B028
+obj_s_yamishop_pal = 0x06000A48; // segment:object_00D5B000 rom:0xD5BA48
+obj_w_yamishop_pal = 0x06000A68; // segment:object_00D5B000 rom:0xD5BA68
+obj_s_windmill_a_pal = 0x060011E8; // segment:object_00D5B000 rom:0xD5C1E8
+obj_s_windmill_b_pal = 0x06001208; // segment:object_00D5B000 rom:0xD5C208
+obj_s_windmill_c_pal = 0x06001228; // segment:object_00D5B000 rom:0xD5C228
+obj_s_windmill_d_pal = 0x06001248; // segment:object_00D5B000 rom:0xD5C248
+obj_s_windmill_e_pal = 0x06001268; // segment:object_00D5B000 rom:0xD5C268
+obj_w_windmill_a_pal = 0x06001288; // segment:object_00D5B000 rom:0xD5C288
+obj_w_windmill_b_pal = 0x060012A8; // segment:object_00D5B000 rom:0xD5C2A8
+obj_w_windmill_c_pal = 0x060012C8; // segment:object_00D5B000 rom:0xD5C2C8
+obj_w_windmill_d_pal = 0x060012E8; // segment:object_00D5B000 rom:0xD5C2E8
+obj_w_windmill_e_pal = 0x06001308; // segment:object_00D5B000 rom:0xD5C308
+obj_s_toudai_pal = 0x060013A8; // segment:object_00D5B000 rom:0xD5C3A8
+obj_w_toudai_pal = 0x060013C8; // segment:object_00D5B000 rom:0xD5C3C8
+
+obj_s_yamishop_v = 0x06000008; // segment:object_00D5E000 rom:0xD5E008 size:0x420
+obj_s_yamishop_window_model = 0x06000428; // segment:object_00D5E000 rom:0xD5E428
+obj_s_yamishop_t1_model = 0x060004B8; // segment:object_00D5E000 rom:0xD5E4B8
+obj_s_yamishop_light_model = 0x060005D0; // segment:object_00D5E000 rom:0xD5E5D0
+obj_s_yamishop_door1_model = 0x06000690; // segment:object_00D5E000 rom:0xD5E690
+obj_s_yamishop_door2_model = 0x060007D8; // segment:object_00D5E000 rom:0xD5E7D8
+obj_s_yamishop_t2_tex_txt = 0x060008C8; // segment:object_00D5E000 rom:0xD5E8C8
+obj_s_yamishop_t1_tex_txt = 0x060010C8; // segment:object_00D5E000 rom:0xD5F0C8
+obj_s_yamishop_window_tex_txt = 0x060018C8; // segment:object_00D5E000 rom:0xD5F8C8
+cKF_je_r_obj_s_yamishop_tbl = 0x06001948; // segment:object_00D5E000 rom:0xD5F948
+cKF_bs_r_obj_s_yamishop = 0x06001990; // segment:object_00D5E000 rom:0xD5F990
+cKF_ckcb_r_obj_s_yamishop_tbl = 0x06001998; // segment:object_00D5E000 rom:0xD5F998
+cKF_kn_obj_s_yamishop_tbl = 0x060019A0; // segment:object_00D5E000 rom:0xD5F9A0
+cKF_c_obj_s_yamishop_tbl = 0x060019A4; // segment:object_00D5E000 rom:0xD5F9A4
+cKF_ds_obj_s_yamishop_tbl = 0x060019CC; // segment:object_00D5E000 rom:0xD5F9CC
+cKF_ba_r_obj_s_yamishop = 0x06001A04; // segment:object_00D5E000 rom:0xD5FA04
+
+obj_w_yamishop_v = 0x06001A28; // segment:object_00D5E000 rom:0xD5E008 size:0x420
+obj_w_yamishop_window_model = 0x06001E48; // segment:object_00D5E000 rom:0xD5FE48
+obj_w_yamishop_t1_model = 0x06001ED8; // segment:object_00D5E000 rom:0xD5FED8
+obj_w_yamishop_light_model = 0x06001FF0; // segment:object_00D5E000 rom:0xD5FFF0
+obj_w_yamishop_door1_model = 0x060020B0; // segment:object_00D5E000 rom:0xD600B0
+obj_w_yamishop_door2_model = 0x060021F8; // segment:object_00D5E000 rom:0xD601F8
+obj_w_yamishop_t2_tex_txt = 0x060022E8; // segment:object_00D5E000 rom:0xD602E8
+obj_w_yamishop_t1_tex_txt = 0x06002AE8; // segment:object_00D5E000 rom:0xD60AE8
+obj_w_yamishop_window_tex_txt = 0x060032E8; // segment:object_00D5E000 rom:0xD612E8
+cKF_je_r_obj_w_yamishop_tbl = 0x06003368; // segment:object_00D5E000 rom:0xD61368
+cKF_bs_r_obj_w_yamishop = 0x060033B0; // segment:object_00D5E000 rom:0xD613B0
+cKF_ckcb_r_obj_w_yamishop_tbl = 0x060033B8; // segment:object_00D5E000 rom:0xD613B8
+cKF_kn_obj_w_yamishop_tbl = 0x060033C0; // segment:object_00D5E000 rom:0xD613C0
+cKF_c_obj_w_yamishop_tbl = 0x060033C4; // segment:object_00D5E000 rom:0xD613C4
+cKF_ds_obj_w_yamishop_tbl = 0x060033EC; // segment:object_00D5E000 rom:0xD613EC
+cKF_ba_r_obj_w_yamishop = 0x06003424; // segment:object_00D5E000 rom:0xD61424
+
+obj_s_toudai_v = 0x0607D248; // segment:object_00D5E000 rom:0xDDB248 size:0x990
+obj_s_toudai_mirror_model = 0x0607DBD8; // segment:object_00D5E000 rom:0xDDBBD8
+obj_s_toudai_glass_model = 0x0607DCA0; // segment:object_00D5E000 rom:0xDDBCA0
+obj_s_toudai_body_model = 0x0607DD70; // segment:object_00D5E000 rom:0xDDBD70
+obj_s_toudai_light_model = 0x0607E188; // segment:object_00D5E000 rom:0xDDC188
+obj_s_toudai_lenz_model = 0x0607E258; // segment:object_00D5E000 rom:0xDDC258
+obj_s_toudai_arm_model = 0x0607E320; // segment:object_00D5E000 rom:0xDDC320
+obj_s_toudai_light_tex_txt = 0x0607E3A8; // segment:object_00D5E000 rom:0xDDC3A8
+obj_s_toudai_arm_tex_txt = 0x0607E4A8; // segment:object_00D5E000 rom:0xDDC4A8
+obj_s_toudai_dai_tex_txt = 0x0607E528; // segment:object_00D5E000 rom:0xDDC528
+obj_s_toudai_dou_tex_txt = 0x0607E728; // segment:object_00D5E000 rom:0xDDC728
+obj_s_toudai_plate_tex_txt = 0x0607EB28; // segment:object_00D5E000 rom:0xDDCB28
+obj_s_toudai_side_tex_txt = 0x0607EBA8; // segment:object_00D5E000 rom:0xDDCBA8
+obj_s_toudai_tesuri_tex_txt = 0x0607EC28; // segment:object_00D5E000 rom:0xDDCC28
+obj_s_toudai_yane_tex_txt = 0x0607ECA8; // segment:object_00D5E000 rom:0xDDCCA8
+obj_s_toudai_glass_tex_pic_ci4_pal = 0x0607ED28; // segment:object_00D5E000 rom:0xDDCD28
+obj_s_toudai_glass_tex_pic_ci4 = 0x0607ED48; // segment:object_00D5E000 rom:0xDDCD48
+cKF_je_r_obj_s_toudai_tbl = 0x0607EDC8; // segment:object_00D5E000 rom:0xDDCDC8
+cKF_bs_r_obj_s_toudai = 0x0607EE1C; // segment:object_00D5E000 rom:0xDDCE1C
+cKF_ckcb_r_obj_s_toudai_tbl = 0x0607EE24; // segment:object_00D5E000 rom:0xDDCE24
+cKF_kn_obj_s_toudai_tbl = 0x0607EE2C; // segment:object_00D5E000 rom:0xDDCE2C
+cKF_c_obj_s_toudai_tbl = 0x0607EE30; // segment:object_00D5E000 rom:0xDDCE30
+cKF_ds_obj_s_toudai_tbl = 0x0607EE60; // segment:object_00D5E000 rom:0xDDCE60
+cKF_ba_r_obj_s_toudai = 0x0607EE6C; // segment:object_00D5E000 rom:0xDDCE6C
+
+obj_w_toudai_v = 0x0607EE90; // segment:object_00D5E000 rom:0xDDCE90 size:0x990
+obj_w_toudai_mirror_model = 0x0607F7E0; // segment:object_00D5E000 rom:0xDDD7E0
+obj_w_toudai_glass_model = 0x0607F8A8; // segment:object_00D5E000 rom:0xDDD8A8
+obj_w_toudai_body_model = 0x0607F978; // segment:object_00D5E000 rom:0xDDD978
+obj_w_toudai_light_model = 0x0607FD90; // segment:object_00D5E000 rom:0xDDDD90
+obj_w_toudai_lenz_model = 0x0607FE60; // segment:object_00D5E000 rom:0xDDDE60
+obj_w_toudai_arm_model = 0x0607FF28; // segment:object_00D5E000 rom:0xDDDF28
+obj_w_toudai_light_tex_txt = 0x0607FFB0; // segment:object_00D5E000 rom:0xDDDFB0
+obj_w_toudai_arm_tex_txt = 0x060800B0; // segment:object_00D5E000 rom:0xDDE0B0
+obj_w_toudai_dai_tex_txt = 0x06080130; // segment:object_00D5E000 rom:0xDDE130
+obj_w_toudai_dou_tex_txt = 0x06080330; // segment:object_00D5E000 rom:0xDDE330
+obj_w_toudai_plate_tex_txt = 0x06080730; // segment:object_00D5E000 rom:0xDDE730
+obj_w_toudai_side_tex_txt = 0x060807B0; // segment:object_00D5E000 rom:0xDDE7B0
+obj_w_toudai_tesuri_tex_txt = 0x06080830; // segment:object_00D5E000 rom:0xDDE830
+obj_w_toudai_yane_tex_txt = 0x060808B0; // segment:object_00D5E000 rom:0xDDE8B0
+obj_w_toudai_glass_tex_pic_ci4_pal = 0x06080930; // segment:object_00D5E000 rom:0xDDE930
+obj_w_toudai_glass_tex_pic_ci4 = 0x06080950; // segment:object_00D5E000 rom:0xDDE950
+cKF_je_r_obj_w_toudai_tbl = 0x060809D0; // segment:object_00D5E000 rom:0xDDE9D0
+cKF_bs_r_obj_w_toudai = 0x06080A24; // segment:object_00D5E000 rom:0xDDEA24
+cKF_ckcb_r_obj_w_toudai_tbl = 0x06080A2C; // segment:object_00D5E000 rom:0xDDEA2C
+cKF_kn_obj_w_toudai_tbl = 0x06080A34; // segment:object_00D5E000 rom:0xDDEA34
+cKF_c_obj_w_toudai_tbl = 0x06080A38; // segment:object_00D5E000 rom:0xDDEA38
+cKF_ds_obj_w_toudai_tbl = 0x06080A68; // segment:object_00D5E000 rom:0xDDEA68
+cKF_ba_r_obj_w_toudai = 0x06080A74; // segment:object_00D5E000 rom:0xDDEA74
+
+obj_s_windmill_v = 0x0608E838; // segment:object_00D5E000 rom:0xDEC838 size:0x560
+obj_s_windmill_unk_model_1 = 0x0608ED98; // segment:object_00D5E000 rom:0xDECD98
+obj_s_windmill_unk_model_2 = 0x0608EE60; // segment:object_00D5E000 rom:0xDECE60
+obj_s_windmill_unk_model_3 = 0x0608EF10; // segment:object_00D5E000 rom:0xDECF10
+obj_s_windmill_unk_model_4 = 0x0608EFE8; // segment:object_00D5E000 rom:0xDECFE8
+obj_s_windmill_unk_tex_1 = 0x0608F0D8; // segment:object_00D5E000 rom:0xDED0D8
+obj_s_windmill_unk_tex_2 = 0x0608F8D8; // segment:object_00D5E000 rom:0xDED8D8
+obj_s_windmill_unk_tex_3 = 0x060900D8; // segment:object_00D5E000 rom:0xDEE0D8
+cKF_ckcb_r_obj_s_windmill_tbl = 0x060908D8; // segment:object_00D5E000 rom:0xDEE8D8
+cKF_c_obj_s_windmill_tbl = 0x060908E0; // segment:object_00D5E000 rom:0xDEE8E0
+cKF_ba_r_obj_s_windmill = 0x06090904; // segment:object_00D5E000 rom:0xDEE904
+cKF_je_r_obj_s_windmill = 0x06090918; // segment:object_00D5E000 rom:0xDEE918
+cKF_bs_r_obj_s_windmill = 0x06090954; // segment:object_00D5E000 rom:0xDEE954
+
+obj_w_windmill_v = 0x06090970; // segment:object_00D5E000 rom:0xDEE970 size:0x550
+obj_w_windmill_unk_model_1 = 0x06090EC0; // segment:object_00D5E000 rom:0xDEEEC0
+obj_w_windmill_unk_model_2 = 0x06090F88; // segment:object_00D5E000 rom:0xDEEF88
+obj_w_windmill_unk_model_3 = 0x06091038; // segment:object_00D5E000 rom:0xDEF038
+obj_w_windmill_unk_model_4 = 0x06091110; // segment:object_00D5E000 rom:0xDEF110
+obj_w_windmill_unk_tex_1 = 0x060911F8; // segment:object_00D5E000 rom:0xDEF1F8
+obj_w_windmill_unk_tex_2 = 0x060919F8; // segment:object_00D5E000 rom:0xDEF9F8
+obj_w_windmill_unk_tex_3 = 0x060921F8; // segment:object_00D5E000 rom:0xDF01F8
+cKF_ckcb_r_obj_w_windmill_tbl = 0x060929F8; // segment:object_00D5E000 rom:0xDF09F8
+cKF_c_obj_w_windmill_tbl = 0x06092A00; // segment:object_00D5E000 rom:0xDF0A00
+cKF_ba_r_obj_w_windmill = 0x06092A24; // segment:object_00D5E000 rom:0xDF0A24
+cKF_je_r_obj_w_windmill = 0x06092A38; // segment:object_00D5E000 rom:0xDF0A38
+cKF_bs_r_obj_w_windmill = 0x06092A74; // segment:object_00D5E000 rom:0xDF0A74
+
+tol_utiwa_1_v = 0x6000000; // segment:tol_utiwa_1 rom:0x1128000 size:0x80
+main_utiwa1_model = 0x6000080; // segment:tol_utiwa_1 rom:0x1128080
+tol_utiwa1_pal = 0x6000188; // segment:tol_utiwa_1 rom:0x1128188
+tol_utiwa_1_main1_tex_txt = 0x60001A8; // segment:tol_utiwa_1 rom:0x11281A8
+tol_utiwa_1_main2_tex_txt = 0x60003A8; // segment:tol_utiwa_1 rom:0x11283A8
+
+tol_cracker_1_v = 0x6000000; // segment:tol_cracker_1 rom:0x112F000 size:0x1C0
+tol_cracker_1T_model = 0x60001C0; // segment:tol_cracker_1 rom:0x112F1C0
+tol_cracker_1_pal = 0x6000280; // segment:tol_cracker_1 rom:0x112F280
+tol_cracker_1_tex = 0x60002A0; // segment:tol_cracker_1 rom:0x112F2A0
diff --git a/src/objects/object_00D5B000/object_00D5B000.c b/src/objects/object_00D5B000/object_00D5B000.c
new file mode 100644
index 0000000..2851ca1
--- /dev/null
+++ b/src/objects/object_00D5B000/object_00D5B000.c
@@ -0,0 +1,19 @@
+// #include "assets/jp/objects/object_00D5B000/obj_s_house1_a_pal.palette.inc.c"
+// #include "assets/jp/objects/object_00D5B000/obj_s_house1_b_pal.palette.inc.c"
+
+// #include "assets/jp/objects/object_00D5B000/obj_s_yamishop_pal.palette.inc.c"
+// #include "assets/jp/objects/object_00D5B000/obj_w_yamishop_pal.palette.inc.c"
+
+// #include "assets/jp/objects/object_00D5B000/obj_s_windmill_a_pal.palette.inc.c"
+// #include "assets/jp/objects/object_00D5B000/obj_s_windmill_b_pal.palette.inc.c"
+// #include "assets/jp/objects/object_00D5B000/obj_s_windmill_c_pal.palette.inc.c"
+// #include "assets/jp/objects/object_00D5B000/obj_s_windmill_d_pal.palette.inc.c"
+// #include "assets/jp/objects/object_00D5B000/obj_s_windmill_e_pal.palette.inc.c"
+// #include "assets/jp/objects/object_00D5B000/obj_w_windmill_a_pal.palette.inc.c"
+// #include "assets/jp/objects/object_00D5B000/obj_w_windmill_b_pal.palette.inc.c"
+// #include "assets/jp/objects/object_00D5B000/obj_w_windmill_c_pal.palette.inc.c"
+// #include "assets/jp/objects/object_00D5B000/obj_w_windmill_d_pal.palette.inc.c"
+// #include "assets/jp/objects/object_00D5B000/obj_w_windmill_e_pal.palette.inc.c"
+
+// #include "assets/jp/objects/object_00D5B000/obj_s_toudai_pal.palette.inc.c"
+// #include "assets/jp/objects/object_00D5B000/obj_w_toudai_pal.palette.inc.c"
diff --git a/src/objects/object_00D5E000/object_00D5E000.c b/src/objects/object_00D5E000/object_00D5E000.c
new file mode 100644
index 0000000..7db807f
--- /dev/null
+++ b/src/objects/object_00D5E000/object_00D5E000.c
@@ -0,0 +1,87 @@
+// // obj_s_yamishop
+// #include "assets/jp/objects/object_00D5E000/obj_s_yamishop/obj_s_yamishop_v.vtx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_yamishop/obj_s_yamishop_window_model.gfx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_yamishop/obj_s_yamishop_t1_model.gfx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_yamishop/obj_s_yamishop_light_model.gfx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_yamishop/obj_s_yamishop_door1_model.gfx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_yamishop/obj_s_yamishop_door2_model.gfx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_yamishop/obj_s_yamishop_t2_tex_txt.ci4.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_yamishop/obj_s_yamishop_t1_tex_txt.ci4.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_yamishop/obj_s_yamishop_window_tex_txt.i4.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_yamishop/cKF_je_r_obj_s_yamishop_tbl.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_yamishop/cKF_bs_r_obj_s_yamishop.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_yamishop/cKF_ckcb_r_obj_s_yamishop_tbl.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_yamishop/cKF_kn_obj_s_yamishop_tbl.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_yamishop/cKF_c_obj_s_yamishop_tbl.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_yamishop/cKF_ds_obj_s_yamishop_tbl.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_yamishop/cKF_ba_r_obj_s_yamishop.inc.c"
+
+// // obj_w_yamishop
+// #include "assets/jp/objects/object_00D5E000/obj_w_yamishop/obj_w_yamishop_v.vtx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_yamishop/obj_w_yamishop_window_model.gfx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_yamishop/obj_w_yamishop_t1_model.gfx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_yamishop/obj_w_yamishop_light_model.gfx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_yamishop/obj_w_yamishop_door1_model.gfx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_yamishop/obj_w_yamishop_door2_model.gfx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_yamishop/obj_w_yamishop_t2_tex_txt.ci4.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_yamishop/obj_w_yamishop_t1_tex_txt.ci4.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_yamishop/obj_w_yamishop_window_tex_txt.i4.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_yamishop/cKF_je_r_obj_w_yamishop_tbl.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_yamishop/cKF_bs_r_obj_w_yamishop.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_yamishop/cKF_ckcb_r_obj_w_yamishop_tbl.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_yamishop/cKF_kn_obj_w_yamishop_tbl.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_yamishop/cKF_c_obj_w_yamishop_tbl.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_yamishop/cKF_ds_obj_w_yamishop_tbl.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_yamishop/cKF_ba_r_obj_w_yamishop.inc.c"
+
+// obj_s_toudai
+// #include "assets/jp/objects/object_00D5E000/obj_s_toudai/obj_s_toudai_v.vtx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_toudai/obj_s_toudai_mirror_model.gfx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_toudai/obj_s_toudai_glass_model.gfx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_toudai/obj_s_toudai_body_model.gfx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_toudai/obj_s_toudai_light_model.gfx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_toudai/obj_s_toudai_lenz_model.gfx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_toudai/obj_s_toudai_arm_model.gfx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_toudai/obj_s_toudai_light_tex_txt.i8.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_toudai/obj_s_toudai_arm_tex_txt.ci4.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_toudai/obj_s_toudai_dai_tex_txt.ci4.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_toudai/obj_s_toudai_dou_tex_txt.ci4.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_toudai/obj_s_toudai_plate_tex_txt.ci4.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_toudai/obj_s_toudai_side_tex_txt.ci4.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_toudai/obj_s_toudai_tesuri_tex_txt.ci4.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_toudai/obj_s_toudai_yane_tex_txt.ci4.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_toudai/obj_s_toudai_glass_tex_pic_ci4_pal.palette.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_toudai/obj_s_toudai_glass_tex_pic_ci4.ci4.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_toudai/cKF_je_r_obj_s_toudai_tbl.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_toudai/cKF_bs_r_obj_s_toudai.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_toudai/cKF_ckcb_r_obj_s_toudai_tbl.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_toudai/cKF_kn_obj_s_toudai_tbl.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_toudai/cKF_c_obj_s_toudai_tbl.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_toudai/cKF_ds_obj_s_toudai_tbl.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_s_toudai/cKF_ba_r_obj_s_toudai.inc.c"
+
+// obj_w_toudai
+// #include "assets/jp/objects/object_00D5E000/obj_w_toudai/obj_w_toudai_v.vtx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_toudai/obj_w_toudai_mirror_model.gfx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_toudai/obj_w_toudai_glass_model.gfx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_toudai/obj_w_toudai_body_model.gfx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_toudai/obj_w_toudai_light_model.gfx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_toudai/obj_w_toudai_lenz_model.gfx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_toudai/obj_w_toudai_arm_model.gfx.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_toudai/obj_w_toudai_light_tex_txt.i8.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_toudai/obj_w_toudai_arm_tex_txt.ci4.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_toudai/obj_w_toudai_dai_tex_txt.ci4.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_toudai/obj_w_toudai_dou_tex_txt.ci4.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_toudai/obj_w_toudai_plate_tex_txt.ci4.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_toudai/obj_w_toudai_side_tex_txt.ci4.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_toudai/obj_w_toudai_tesuri_tex_txt.ci4.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_toudai/obj_w_toudai_yane_tex_txt.ci4.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_toudai/obj_w_toudai_glass_tex_pic_ci4_pal.palette.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_toudai/obj_w_toudai_glass_tex_pic_ci4.ci4.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_toudai/cKF_je_r_obj_w_toudai_tbl.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_toudai/cKF_bs_r_obj_w_toudai.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_toudai/cKF_ckcb_r_obj_w_toudai_tbl.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_toudai/cKF_kn_obj_w_toudai_tbl.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_toudai/cKF_c_obj_w_toudai_tbl.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_toudai/cKF_ds_obj_w_toudai_tbl.inc.c"
+// #include "assets/jp/objects/object_00D5E000/obj_w_toudai/cKF_ba_r_obj_w_toudai.inc.c"
diff --git a/src/objects/tol_cracker_1/tol_cracker_1.c b/src/objects/tol_cracker_1/tol_cracker_1.c
new file mode 100644
index 0000000..d37af15
--- /dev/null
+++ b/src/objects/tol_cracker_1/tol_cracker_1.c
@@ -0,0 +1,6 @@
+#include "tol_cracker_1.h"
+
+#include "assets/jp/objects/tol_cracker_1/tol_cracker_1_v.vtx.inc.c"
+#include "assets/jp/objects/tol_cracker_1/tol_cracker_1T_model.gfx.inc.c"
+#include "assets/jp/objects/tol_cracker_1/tol_cracker_1_pal.palette.inc.c"
+#include "assets/jp/objects/tol_cracker_1/tol_cracker_1_tex.ci4.inc.c"
diff --git a/src/objects/tol_cracker_1/tol_cracker_1.h b/src/objects/tol_cracker_1/tol_cracker_1.h
new file mode 100644
index 0000000..2b86462
--- /dev/null
+++ b/src/objects/tol_cracker_1/tol_cracker_1.h
@@ -0,0 +1,11 @@
+#ifndef OBJECT_TOL_CRACKER_1_H
+#define OBJECT_TOL_CRACKER_1_H
+
+#include "gbi.h"
+
+extern Vtx tol_cracker_1_v[];
+extern Gfx tol_cracker_1T_model[];
+extern unsigned short tol_cracker_1_pal[];
+extern unsigned char tol_cracker_1_tex[];
+
+#endif
diff --git a/src/objects/tol_utiwa_1/tol_utiwa_1.c b/src/objects/tol_utiwa_1/tol_utiwa_1.c
new file mode 100644
index 0000000..04c44ff
--- /dev/null
+++ b/src/objects/tol_utiwa_1/tol_utiwa_1.c
@@ -0,0 +1,7 @@
+#include "tol_utiwa_1.h"
+
+#include "assets/jp/objects/tol_utiwa_1/tol_utiwa_1_v.vtx.inc.c"
+#include "assets/jp/objects/tol_utiwa_1/main_utiwa1_model.gfx.inc.c"
+#include "assets/jp/objects/tol_utiwa_1/tol_utiwa1_pal.palette.inc.c"
+#include "assets/jp/objects/tol_utiwa_1/tol_utiwa_1_main1_tex_txt.ci4.inc.c"
+#include "assets/jp/objects/tol_utiwa_1/tol_utiwa_1_main2_tex_txt.ci4.inc.c"
diff --git a/src/objects/tol_utiwa_1/tol_utiwa_1.h b/src/objects/tol_utiwa_1/tol_utiwa_1.h
new file mode 100644
index 0000000..3116154
--- /dev/null
+++ b/src/objects/tol_utiwa_1/tol_utiwa_1.h
@@ -0,0 +1,12 @@
+#ifndef OBJECT_TOL_UTIWA_1_H
+#define OBJECT_TOL_UTIWA_1_H
+
+#include "gbi.h"
+
+extern Vtx tol_utiwa_1_v[];
+extern Gfx main_utiwa1_model[];
+extern unsigned short tol_utiwa1_pal[];
+extern unsigned char tol_utiwa_1_main1_tex_txt[];
+extern unsigned char tol_utiwa_1_main2_tex_txt[];
+
+#endif
diff --git a/src/overlays/actors/ovl_T_Hanabi/ac_t_hanabi.c b/src/overlays/actors/ovl_T_Hanabi/ac_t_hanabi.c
index 5fc6cbe..746462e 100644
--- a/src/overlays/actors/ovl_T_Hanabi/ac_t_hanabi.c
+++ b/src/overlays/actors/ovl_T_Hanabi/ac_t_hanabi.c
@@ -3,6 +3,7 @@
#include "m_object.h"
#include "overlays/gamestates/ovl_play/m_play.h"
#include "m_rcp.h"
+#include "objects/tol_utiwa_1/tol_utiwa_1.h"
#define THIS ((T_Hanabi*)thisx)
@@ -17,7 +18,7 @@ ActorProfile T_Hanabi_Profile = {
/* */ ACTOR_PART_4,
/* */ ACTOR_FLAG_10 | ACTOR_FLAG_20,
/* */ 0x0000,
- /* */ OBJECT_53,
+ /* */ OBJECT_TOL_UTIWA_1,
/* */ sizeof(T_Hanabi),
/* */ aTHB_actor_ct,
/* */ aTHB_actor_dt,
@@ -94,8 +95,6 @@ void aTHB_actor_move(Actor* thisx, Game_Play* game_play UNUSED) {
} \
while (0)
-extern Gfx main_utiwa1_model[];
-
void aTHB_actor_draw(Actor* thisx, Game_Play* game_play) {
static xyz_t D_80A200A4_jp = { 0.0f, 0.0f, 0.0f };
T_Hanabi* this = THIS;
diff --git a/src/overlays/actors/ovl_Tools/ac_tools.c b/src/overlays/actors/ovl_Tools/ac_tools.c
index cd27584..31aec88 100644
--- a/src/overlays/actors/ovl_Tools/ac_tools.c
+++ b/src/overlays/actors/ovl_Tools/ac_tools.c
@@ -95,11 +95,14 @@ ToolActor* aTOL_birth_proc(ToolName toolName, s32 arg1, ToolActor* toolActor, Ga
ACTOR_T_TAMA, ACTOR_T_TAMA,
};
static s16 objectTable[] = {
- OBJECT_28, OBJECT_85, OBJECT_72, OBJECT_73, OBJECT_74, OBJECT_75, OBJECT_76, OBJECT_77, OBJECT_78,
- OBJECT_79, OBJECT_80, OBJECT_81, OBJECT_82, OBJECT_83, OBJECT_84, OBJECT_55, OBJECT_56, OBJECT_57,
- OBJECT_58, OBJECT_59, OBJECT_60, OBJECT_61, OBJECT_62, OBJECT_63, OBJECT_64, OBJECT_65, OBJECT_66,
- OBJECT_67, OBJECT_68, OBJECT_69, OBJECT_70, OBJECT_71, OBJECT_45, OBJECT_53, OBJECT_53, OBJECT_395,
- OBJECT_16, OBJECT_6, OBJECT_371, OBJECT_370, OBJECT_391, OBJECT_391, OBJECT_391, OBJECT_391,
+ OBJECT_28, OBJECT_85, OBJECT_72, OBJECT_73, OBJECT_74, OBJECT_75,
+ OBJECT_76, OBJECT_77, OBJECT_78, OBJECT_79, OBJECT_80, OBJECT_81,
+ OBJECT_82, OBJECT_83, OBJECT_84, OBJECT_55, OBJECT_56, OBJECT_57,
+ OBJECT_58, OBJECT_59, OBJECT_60, OBJECT_61, OBJECT_62, OBJECT_63,
+ OBJECT_64, OBJECT_65, OBJECT_66, OBJECT_67, OBJECT_68, OBJECT_69,
+ OBJECT_70, OBJECT_71, OBJECT_45, OBJECT_TOL_UTIWA_1, OBJECT_TOL_UTIWA_1, OBJECT_TOL_CRACKER_1,
+ OBJECT_16, OBJECT_6, OBJECT_371, OBJECT_370, OBJECT_391, OBJECT_391,
+ OBJECT_391, OBJECT_391,
};
s32 pad[3] UNUSED;
ToolActor* ret = NULL;
diff --git a/tools/.gitignore b/tools/.gitignore
index 9f68842..66cbd68 100644
--- a/tools/.gitignore
+++ b/tools/.gitignore
@@ -1,2 +1,3 @@
ido/
*.tar.gz
+pigment64/
diff --git a/tools/Makefile b/tools/Makefile
index 156a306..10f6b30 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -2,11 +2,14 @@ WARNINGS_CHECK ?= 0
UNAME_S := $(shell uname -s)
ifeq ($(OS),Windows_NT)
- DETECTED_OS := windows
+ DETECTED_OS := windows
+ PIGMENT64_OS := x86_64-pc-windows-gnu
else ifeq ($(UNAME_S),Linux)
- DETECTED_OS := linux
+ DETECTED_OS := linux
+ PIGMENT64_OS := x86_64-unknown-linux-musl
else ifeq ($(UNAME_S),Darwin)
- DETECTED_OS := macos
+ DETECTED_OS := macos
+ PIGMENT64_OS := x86_64-apple-darwin
endif
@@ -23,7 +26,10 @@ IDO_5_3 := $(IDO_5_3_DIR)/cc
IDO_7_1_DIR := ido/$(DETECTED_OS)/7.1
IDO_7_1 := $(IDO_7_1_DIR)/cc
-all: $(IDO_5_3) $(IDO_7_1)
+PIGMENT64_DIR := pigment64
+PIGMENT64 := $(PIGMENT64_DIR)/pigment64
+
+all: $(IDO_5_3) $(IDO_7_1) $(PIGMENT64)
$(MAKE) -C fado
$(MAKE) -C z64compress
@@ -46,10 +52,18 @@ $(IDO_7_1): | $(IDO_7_1_DIR)
tar xf ido-7.1-recomp-$(DETECTED_OS).tar.gz -C $(IDO_7_1_DIR)
$(RM) ido-7.1-recomp-$(DETECTED_OS).tar.gz
+$(PIGMENT64): | $(PIGMENT64_DIR)
+ wget $(WGET_FLAGS) https://github.com/decompals/pigment64/releases/download/0.3.0/pigment64_0.3.0_$(PIGMENT64_OS).tar.gz
+ tar xf pigment64_0.3.0_$(PIGMENT64_OS).tar.gz -C $(PIGMENT64_DIR)
+ $(RM) pigment64_0.3.0_$(PIGMENT64_OS).tar.gz
+
$(IDO_5_3_DIR):
mkdir -p $@
$(IDO_7_1_DIR):
mkdir -p $@
+$(PIGMENT64_DIR):
+ mkdir -p $@
+
distclean: clean
diff --git a/tools/bin_inc_c.py b/tools/bin_inc_c.py
new file mode 100644
index 0000000..9a78c30
--- /dev/null
+++ b/tools/bin_inc_c.py
@@ -0,0 +1,17 @@
+#!/usr/bin/env python3
+
+from pathlib import Path
+from sys import argv
+import re
+
+if __name__ == "__main__":
+ infile, outfile, cname = argv[1:]
+
+ with open(outfile, "w") as f:
+ f.write(f"unsigned char {cname}[] = {{ ")
+
+ with open(infile, "rb") as i:
+ for char in i.read():
+ f.write(f"0x{char:02X}, ")
+
+ f.write(f"}};\n")
diff --git a/tools/splat_ext/af_ci4.py b/tools/splat_ext/af_ci4.py
new file mode 100644
index 0000000..c5e9765
--- /dev/null
+++ b/tools/splat_ext/af_ci4.py
@@ -0,0 +1,25 @@
+from n64img.image import Image, CI4
+from splat.util import log, options
+from splat.segtypes.n64.segment import N64Segment
+
+class N64SegAf_ci4(N64Segment):
+ def __init__(self, rom_start, rom_end, type, name, vram_start, args, yaml):
+ super().__init__(rom_start, rom_end, type, name, vram_start, args=args, yaml=yaml),
+
+ self.width = args[0]
+ self.height = args[1]
+ self.palette_start = args[2]
+ self.palette_size = args[3]
+
+ def scan(self, rom_bytes: bytes):
+ self.n64img: Image = CI4(b"", 0, 0)
+ self.n64img.width = self.width
+ self.n64img.height = self.height
+ self.n64img.data = rom_bytes[self.rom_start : self.rom_end]
+ self.n64img.set_palette(rom_bytes[self.palette_start : self.palette_start + self.palette_size])
+
+ def split(self, rom_bytes: bytes):
+ path = options.opts.asset_path / self.dir / f"{self.name}.ci4.png"
+ path.parent.mkdir(parents=True, exist_ok=True)
+
+ self.n64img.write(path)
diff --git a/tools/splat_ext/af_i4.py b/tools/splat_ext/af_i4.py
new file mode 100644
index 0000000..54bd7b1
--- /dev/null
+++ b/tools/splat_ext/af_i4.py
@@ -0,0 +1,22 @@
+from n64img.image import Image, I4
+from splat.util import log, options
+from splat.segtypes.n64.segment import N64Segment
+
+class N64SegAf_i4(N64Segment):
+ def __init__(self, rom_start, rom_end, type, name, vram_start, args, yaml):
+ super().__init__(rom_start, rom_end, type, name, vram_start, args=args, yaml=yaml),
+
+ self.width = args[0]
+ self.height = args[1]
+
+ def scan(self, rom_bytes: bytes):
+ self.n64img: Image = I4(b"", 0, 0)
+ self.n64img.width = self.width
+ self.n64img.height = self.height
+ self.n64img.data = rom_bytes[self.rom_start : self.rom_end]
+
+ def split(self, rom_bytes: bytes):
+ path = options.opts.asset_path / self.dir / f"{self.name}.i4.png"
+ path.parent.mkdir(parents=True, exist_ok=True)
+
+ self.n64img.write(path)
diff --git a/tools/splat_ext/af_i8.py b/tools/splat_ext/af_i8.py
new file mode 100644
index 0000000..9b167f7
--- /dev/null
+++ b/tools/splat_ext/af_i8.py
@@ -0,0 +1,22 @@
+from n64img.image import Image, I8
+from splat.util import log, options
+from splat.segtypes.n64.segment import N64Segment
+
+class N64SegAf_i8(N64Segment):
+ def __init__(self, rom_start, rom_end, type, name, vram_start, args, yaml):
+ super().__init__(rom_start, rom_end, type, name, vram_start, args=args, yaml=yaml),
+
+ self.width = args[0]
+ self.height = args[1]
+
+ def scan(self, rom_bytes: bytes):
+ self.n64img: Image = I8(b"", 0, 0)
+ self.n64img.width = self.width
+ self.n64img.height = self.height
+ self.n64img.data = rom_bytes[self.rom_start : self.rom_end]
+
+ def split(self, rom_bytes: bytes):
+ path = options.opts.asset_path / self.dir / f"{self.name}.i8.png"
+ path.parent.mkdir(parents=True, exist_ok=True)
+
+ self.n64img.write(path)
diff --git a/tools/splat_ext/af_palette.py b/tools/splat_ext/af_palette.py
new file mode 100644
index 0000000..837e56f
--- /dev/null
+++ b/tools/splat_ext/af_palette.py
@@ -0,0 +1,40 @@
+import struct
+from splat.util import options, log
+from splat.segtypes.common.codesubsegment import CommonSegCodeSubsegment
+
+VALID_SIZES = [0x20, 0x40, 0x80, 0x100, 0x200]
+
+class N64SegAf_palette(CommonSegCodeSubsegment):
+ def __init__(self, rom_start, rom_end, type, name, vram_start, args, yaml):
+ super().__init__(rom_start, rom_end, type, name, vram_start, args=args, yaml=yaml),
+
+ self.data_only = isinstance(yaml, dict) and yaml.get("data_only", False)
+
+ def scan(self, rom_bytes: bytes):
+ data = rom_bytes[self.rom_start : self.rom_end]
+ lines = []
+
+ if len(data) not in VALID_SIZES:
+ log.error(f"Error: {self.name} (0x{len(data):X} bytes) is not a valid palette size ({', '.join(hex(s) for s in VALID_SIZES)})")
+
+ if not self.data_only:
+ lines.append(options.opts.generated_c_preamble)
+ lines.append("")
+ lines.append(f"unsigned short {self.name}[] = {{")
+
+ for short in struct.iter_unpack(">H", data):
+ lines.append(f" 0x{short[0]:04X},")
+
+ if not self.data_only:
+ lines.append("};")
+
+ lines.append("")
+ self.file_text = "\n".join(lines)
+
+ def split(self, rom_bytes: bytes):
+ path = options.opts.asset_path / self.dir / f"{self.name}.palette.inc.c"
+
+ if self.file_text and path:
+ path.parent.mkdir(parents=True, exist_ok=True)
+ with open(path, "w", newline="\n") as f:
+ f.write(self.file_text)
diff --git a/tools/splat_ext/ckf_ba.py b/tools/splat_ext/ckf_ba.py
new file mode 100644
index 0000000..2ac069f
--- /dev/null
+++ b/tools/splat_ext/ckf_ba.py
@@ -0,0 +1,62 @@
+import struct
+from typing import Optional
+from splat.util import options, log
+from splat.segtypes.common.codesubsegment import CommonSegCodeSubsegment
+
+class N64SegCkf_ba(CommonSegCodeSubsegment):
+ def __init__(self, rom_start, rom_end, type, name, vram_start, args, yaml):
+ super().__init__(rom_start, rom_end, type, name, vram_start, args=args, yaml=yaml),
+
+ self.file_text: Optional[str] = None
+ self.data_only = isinstance(yaml, dict) and yaml.get("data_only", False)
+
+ def scan(self, rom_bytes: bytes):
+ data = rom_bytes[self.rom_start : self.rom_end]
+ symbol = self.create_symbol(addr=self.vram_start, in_segment=True, type="data", define=True)
+ lines = []
+
+ if (len(data)) != 20:
+ log.error(f"Error: ckf_ba segment {self.name} length ({len(data)}) is not 20 bytes!")
+
+ if not self.data_only:
+ lines.append(options.opts.generated_c_preamble)
+ lines.append("\n")
+ lines.append(f"BaseAnimationR {symbol.name} = ")
+
+ ckcb, ds, kn, constval, unk10, duration = struct.unpack(">IIIIhh", data)
+
+ if ckcb:
+ ckcb_symbol = self.get_symbol(addr=ckcb).name
+ else:
+ ckcb_symbol = "NULL"
+
+ if ds:
+ ds_symbol = self.get_symbol(addr=ds).name
+ else:
+ ds_symbol = "NULL"
+
+ if kn:
+ kn_symbol = self.get_symbol(addr=kn).name
+ else:
+ kn_symbol = "NULL"
+
+ if constval:
+ constval_symbol = self.get_symbol(addr=constval).name
+ else:
+ constval_symbol = "NULL"
+
+ lines.append(f"{{ {ckcb_symbol}, {ds_symbol}, {kn_symbol}, {constval_symbol}, {unk10}, {duration} }}")
+
+ if not self.data_only:
+ lines.append(";")
+
+ lines.append("\n")
+ self.file_text = "".join(lines)
+
+ def split(self, rom_bytes: bytes):
+ path = options.opts.asset_path / self.dir / f"{self.name}.inc.c"
+
+ if self.file_text and path:
+ path.parent.mkdir(parents=True, exist_ok=True)
+ with open(path, "w", newline="\n") as f:
+ f.write(self.file_text)
diff --git a/tools/splat_ext/ckf_bs.py b/tools/splat_ext/ckf_bs.py
new file mode 100644
index 0000000..eef56b7
--- /dev/null
+++ b/tools/splat_ext/ckf_bs.py
@@ -0,0 +1,42 @@
+import struct
+from typing import Optional
+from splat.util import options, log
+from splat.segtypes.common.codesubsegment import CommonSegCodeSubsegment
+
+class N64SegCkf_bs(CommonSegCodeSubsegment):
+ def __init__(self, rom_start, rom_end, type, name, vram_start, args, yaml):
+ super().__init__(rom_start, rom_end, type, name, vram_start, args=args, yaml=yaml),
+
+ self.file_text: Optional[str] = None
+ self.data_only = isinstance(yaml, dict) and yaml.get("data_only", False)
+
+ def scan(self, rom_bytes: bytes):
+ data = rom_bytes[self.rom_start : self.rom_end]
+ symbol = self.create_symbol(addr=self.vram_start, in_segment=True, type="data", define=True)
+ lines = []
+
+ if (len(data)) != 8:
+ log.error(f"Error: ckf_bs segment {self.name} length ({len(data)}) is not 8 bytes!")
+
+ if not self.data_only:
+ lines.append(options.opts.generated_c_preamble)
+ lines.append("\n")
+ lines.append(f"BaseSkeletonR {symbol.name} = ")
+
+ numberOfJoints, numberOfDisplayLists, jointElemTable = struct.unpack(">BBxxI", data)
+ jointelemtable_symbol = self.get_symbol(addr=jointElemTable).name
+ lines.append(f"{{ {numberOfJoints}, {numberOfDisplayLists}, {jointelemtable_symbol} }}")
+
+ if not self.data_only:
+ lines.append(";")
+
+ lines.append("\n")
+ self.file_text = "".join(lines)
+
+ def split(self, rom_bytes: bytes):
+ path = options.opts.asset_path / self.dir / f"{self.name}.inc.c"
+
+ if self.file_text and path:
+ path.parent.mkdir(parents=True, exist_ok=True)
+ with open(path, "w", newline="\n") as f:
+ f.write(self.file_text)
diff --git a/tools/splat_ext/ckf_c.py b/tools/splat_ext/ckf_c.py
new file mode 100644
index 0000000..379a000
--- /dev/null
+++ b/tools/splat_ext/ckf_c.py
@@ -0,0 +1,42 @@
+import struct
+from typing import Optional
+from splat.util import options, log
+from splat.segtypes.common.codesubsegment import CommonSegCodeSubsegment
+
+class N64SegCkf_c(CommonSegCodeSubsegment):
+ def __init__(self, rom_start, rom_end, type, name, vram_start, args, yaml):
+ super().__init__(rom_start, rom_end, type, name, vram_start, args=args, yaml=yaml),
+
+ self.file_text: Optional[str] = None
+ self.data_only = isinstance(yaml, dict) and yaml.get("data_only", False)
+
+ def scan(self, rom_bytes: bytes):
+ data = rom_bytes[self.rom_start : self.rom_end]
+ symbol = self.create_symbol(addr=self.vram_start, in_segment=True, type="data", define=True)
+ count = len(data) // 2
+ lines = []
+
+ if (len(data)) % 2 != 0:
+ log.error(f"Error: ckf_c segment {self.name} length ({len(data)}) is not a multiple of 2!")
+
+ if not self.data_only:
+ lines.append(options.opts.generated_c_preamble)
+ lines.append("")
+ lines.append(f"s16 {symbol.name}[{count}] = {{")
+
+ for byte in struct.iter_unpack(">h", data):
+ lines.append(f" {byte[0]},")
+
+ if not self.data_only:
+ lines.append("};")
+
+ lines.append("")
+ self.file_text = "\n".join(lines)
+
+ def split(self, rom_bytes: bytes):
+ path = options.opts.asset_path / self.dir / f"{self.name}.inc.c"
+
+ if self.file_text and path:
+ path.parent.mkdir(parents=True, exist_ok=True)
+ with open(path, "w", newline="\n") as f:
+ f.write(self.file_text)
diff --git a/tools/splat_ext/ckf_ckcb.py b/tools/splat_ext/ckf_ckcb.py
new file mode 100644
index 0000000..f91121e
--- /dev/null
+++ b/tools/splat_ext/ckf_ckcb.py
@@ -0,0 +1,42 @@
+import struct
+from typing import Optional
+from splat.util import options, log
+from splat.segtypes.common.codesubsegment import CommonSegCodeSubsegment
+
+class N64SegCkf_ckcb(CommonSegCodeSubsegment):
+ def __init__(self, rom_start, rom_end, type, name, vram_start, args, yaml):
+ super().__init__(rom_start, rom_end, type, name, vram_start, args=args, yaml=yaml),
+
+ self.file_text: Optional[str] = None
+ self.data_only = isinstance(yaml, dict) and yaml.get("data_only", False)
+
+ def get_linker_section(self) -> str:
+ return ".data"
+
+ def scan(self, rom_bytes: bytes):
+ data = rom_bytes[self.rom_start : self.rom_end]
+ symbol = self.create_symbol(addr=self.vram_start, in_segment=True, type="data", define=True)
+ count = len(data)
+ lines = []
+
+ if not self.data_only:
+ lines.append(options.opts.generated_c_preamble)
+ lines.append("")
+ lines.append(f"u8 {symbol.name}[{count}] = {{")
+
+ for byte in struct.iter_unpack(">B", data):
+ lines.append(f" 0x{byte[0]:02X},")
+
+ if not self.data_only:
+ lines.append("};")
+
+ lines.append("")
+ self.file_text = "\n".join(lines)
+
+ def split(self, rom_bytes: bytes):
+ path = options.opts.asset_path / self.dir / f"{self.name}.inc.c"
+
+ if self.file_text and path:
+ path.parent.mkdir(parents=True, exist_ok=True)
+ with open(path, "w", newline="\n") as f:
+ f.write(self.file_text)
diff --git a/tools/splat_ext/ckf_ds.py b/tools/splat_ext/ckf_ds.py
new file mode 100644
index 0000000..76c9321
--- /dev/null
+++ b/tools/splat_ext/ckf_ds.py
@@ -0,0 +1,44 @@
+import struct
+from typing import Optional
+from splat.util import options, log
+from splat.segtypes.common.codesubsegment import CommonSegCodeSubsegment
+
+
+class N64SegCkf_ds(CommonSegCodeSubsegment):
+ def __init__(self, rom_start, rom_end, type, name, vram_start, args, yaml):
+ super().__init__(rom_start, rom_end, type, name, vram_start, args=args, yaml=yaml),
+
+ self.file_text: Optional[str] = None
+ self.data_only = isinstance(yaml, dict) and yaml.get("data_only", False)
+
+ def scan(self, rom_bytes: bytes):
+ data = rom_bytes[self.rom_start : self.rom_end]
+ symbol = self.create_symbol(addr=self.vram_start, in_segment=True, type="data", define=True)
+ count = len(data) // 6
+ lines = []
+
+ if (len(data)) % 6 != 0:
+ log.error(f"Error: ckf_ds segment {self.name} length ({len(data)}) is not a multiple of 6!")
+
+ if not self.data_only:
+ lines.append(options.opts.generated_c_preamble)
+ lines.append("")
+ lines.append(f"Keyframe {symbol.name}[{count}] = {{")
+
+ for keyframe in struct.iter_unpack(">hhh", data):
+ frame, value, velocity = keyframe
+ lines.append(f" {{ {frame:5}, {value:5}, {velocity:5} }},")
+
+ if not self.data_only:
+ lines.append("};")
+
+ lines.append("")
+ self.file_text = "\n".join(lines)
+
+ def split(self, rom_bytes: bytes):
+ path = options.opts.asset_path / self.dir / f"{self.name}.inc.c"
+
+ if self.file_text and path:
+ path.parent.mkdir(parents=True, exist_ok=True)
+ with open(path, "w", newline="\n") as f:
+ f.write(self.file_text)
diff --git a/tools/splat_ext/ckf_je.py b/tools/splat_ext/ckf_je.py
new file mode 100644
index 0000000..c48600c
--- /dev/null
+++ b/tools/splat_ext/ckf_je.py
@@ -0,0 +1,49 @@
+import struct
+from typing import Optional
+from splat.util import options, log
+from splat.segtypes.common.codesubsegment import CommonSegCodeSubsegment
+
+class N64SegCkf_je(CommonSegCodeSubsegment):
+ def __init__(self, rom_start, rom_end, type, name, vram_start, args, yaml):
+ super().__init__(rom_start, rom_end, type, name, vram_start, args=args, yaml=yaml),
+
+ self.file_text: Optional[str] = None
+ self.data_only = isinstance(yaml, dict) and yaml.get("data_only", False)
+
+ def scan(self, rom_bytes: bytes):
+ data = rom_bytes[self.rom_start : self.rom_end]
+ symbol = self.create_symbol(addr=self.vram_start, in_segment=True, type="data", define=True)
+ count = len(data) // 12
+ lines = []
+
+ if (len(data)) % 12 != 0:
+ log.error(f"Error: ckf_je segment {self.name} length ({len(data)}) is not a multiple of 12 bytes!")
+
+ if not self.data_only:
+ lines.append(options.opts.generated_c_preamble)
+ lines.append("")
+ lines.append(f"JointElemR {symbol.name}[{count}] = {{")
+
+ for jointelem in struct.iter_unpack(">IBBhhh", data):
+ shape, numberOfChildren, displayBufferFlag, x, y, z = jointelem
+
+ if shape == 0:
+ shape_symbol = "NULL"
+ else:
+ shape_symbol = self.get_symbol(addr=shape).name
+
+ lines.append(f" {{ {shape_symbol}, {numberOfChildren}, {displayBufferFlag}, {{{x}, {y}, {z}}} }},")
+
+ if not self.data_only:
+ lines.append("};")
+
+ lines.append("")
+ self.file_text = "\n".join(lines)
+
+ def split(self, rom_bytes: bytes):
+ path = options.opts.asset_path / self.dir / f"{self.name}.inc.c"
+
+ if self.file_text and path:
+ path.parent.mkdir(parents=True, exist_ok=True)
+ with open(path, "w", newline="\n") as f:
+ f.write(self.file_text)
diff --git a/tools/splat_ext/ckf_kn.py b/tools/splat_ext/ckf_kn.py
new file mode 100644
index 0000000..4efa957
--- /dev/null
+++ b/tools/splat_ext/ckf_kn.py
@@ -0,0 +1,44 @@
+import struct
+from typing import Optional
+from splat.util import options, log
+from splat.segtypes.common.codesubsegment import CommonSegCodeSubsegment
+
+class N64SegCkf_kn(CommonSegCodeSubsegment):
+ def __init__(self, rom_start, rom_end, type, name, vram_start, args, yaml):
+ super().__init__(rom_start, rom_end, type, name, vram_start, args=args, yaml=yaml),
+
+ self.file_text: Optional[str] = None
+ self.data_only = isinstance(yaml, dict) and yaml.get("data_only", False)
+ def get_linker_section(self) -> str:
+ return ".data"
+
+ def scan(self, rom_bytes: bytes):
+ data = rom_bytes[self.rom_start : self.rom_end]
+ symbol = self.create_symbol(addr=self.vram_start, in_segment=True, type="data", define=True)
+ count = len(data) // 2
+ lines = []
+
+ if (len(data)) % 2 != 0:
+ log.error(f"Error: ckf_kn segment {self.name} length ({len(data)}) is not a multiple of 2!")
+
+ if not self.data_only:
+ lines.append(options.opts.generated_c_preamble)
+ lines.append("")
+ lines.append(f"s16 {symbol.name}[{count}] = {{")
+
+ for byte in struct.iter_unpack(">h", data):
+ lines.append(f" {byte[0]},")
+
+ if not self.data_only:
+ lines.append("};")
+
+ lines.append("")
+ self.file_text = "\n".join(lines)
+
+ def split(self, rom_bytes: bytes):
+ path = options.opts.asset_path / self.dir / f"{self.name}.inc.c"
+
+ if self.file_text and path:
+ path.parent.mkdir(parents=True, exist_ok=True)
+ with open(path, "w", newline="\n") as f:
+ f.write(self.file_text)
diff --git a/yamls/jp/assets.yaml b/yamls/jp/assets.yaml
index 92e3a40..59c0ca1 100644
--- a/yamls/jp/assets.yaml
+++ b/yamls/jp/assets.yaml
@@ -547,14 +547,41 @@
- [0xD5A1D0]
- name: object_00D5B000
- type: bin # code
+ dir: objects/object_00D5B000
+ type: code
start: 0xD5B000
vram: 0x06000000
exclusive_ram_id: segment_06
compress: False
align: 0x1000
- # subsegments:
- # - [0xD5B000, data, assets/objects/object_00D5B000/object_00D5B000]
+ symbol_name_format: $VRAM_$ROM
+ subsegments:
+ - [auto, c, object_00D5B000]
+ - start: 0xD5B000
+ type: data
+ name: object_00D5B000
+ subsegments:
+ - [0xD5B000]
+ - [0xD5B008, af_palette, obj_s_house1_a_pal]
+ - [0xD5B028, af_palette, obj_s_house1_b_pal]
+ - [0xD5B048]
+ - [0xD5BA48, af_palette, obj_s_yamishop_pal]
+ - [0xD5BA68, af_palette, obj_w_yamishop_pal]
+ - [0xD5BA88]
+ - [0xD5C1E8, af_palette, obj_s_windmill_a_pal]
+ - [0xD5C208, af_palette, obj_s_windmill_b_pal]
+ - [0xD5C228, af_palette, obj_s_windmill_c_pal]
+ - [0xD5C248, af_palette, obj_s_windmill_d_pal]
+ - [0xD5C268, af_palette, obj_s_windmill_e_pal]
+ - [0xD5C288, af_palette, obj_w_windmill_a_pal]
+ - [0xD5C2A8, af_palette, obj_w_windmill_b_pal]
+ - [0xD5C2C8, af_palette, obj_w_windmill_c_pal]
+ - [0xD5C2E8, af_palette, obj_w_windmill_d_pal]
+ - [0xD5C308, af_palette, obj_w_windmill_e_pal]
+ - [0xD5C328]
+ - [0xD5C3A8, af_palette, obj_s_toudai_pal]
+ - [0xD5C3C8, af_palette, obj_w_toudai_pal]
+ - [0xD5C3E8]
- [0xD5C3F0]
- name: object_00D5D000
@@ -569,14 +596,137 @@
- [0xD5D2E0]
- name: object_00D5E000
- type: bin # code
+ dir: objects/object_00D5E000
+ type: code
start: 0xD5E000
vram: 0x06000000
exclusive_ram_id: segment_06
compress: False
align: 0x1000
- # subsegments:
- # - [0xD5E000, data, assets/objects/object_00D5E000/object_00D5E000]
+ symbol_name_format: $VRAM_$ROM
+ subsegments:
+ - [auto, c, object_00D5E000]
+ - start: 0xD5E000
+ type: data
+ name: object_00D5E000
+ subsegments:
+ - [0xD5E000] # padding
+ - [0xD5E008, vtx, obj_s_yamishop/obj_s_yamishop_v]
+ - [0xD5E428, gfx, obj_s_yamishop/obj_s_yamishop_window_model]
+ - [0xD5E4B8, gfx, obj_s_yamishop/obj_s_yamishop_t1_model]
+ - [0xD5E5D0, gfx, obj_s_yamishop/obj_s_yamishop_light_model]
+ - [0xD5E690, gfx, obj_s_yamishop/obj_s_yamishop_door1_model]
+ - [0xD5E7D8, gfx, obj_s_yamishop/obj_s_yamishop_door2_model]
+ - [0xD5E8C8, af_ci4, obj_s_yamishop/obj_s_yamishop_t2_tex_txt, 128, 32, 0xD5BA48, 0x20]
+ - [0xD5F0C8, af_ci4, obj_s_yamishop/obj_s_yamishop_t1_tex_txt, 128, 32, 0xD5BA48, 0x20]
+ - [0xD5F8C8, af_i4, obj_s_yamishop/obj_s_yamishop_window_tex_txt, 16, 16]
+ - [0xD5F948, ckf_je, obj_s_yamishop/cKF_je_r_obj_s_yamishop_tbl]
+ - [0xD5F990, ckf_bs, obj_s_yamishop/cKF_bs_r_obj_s_yamishop]
+ - [0xD5F998, ckf_ckcb, obj_s_yamishop/cKF_ckcb_r_obj_s_yamishop_tbl]
+ - [0xD5F9A0, ckf_kn, obj_s_yamishop/cKF_kn_obj_s_yamishop_tbl]
+ - [0xD5F9A4, ckf_c, obj_s_yamishop/cKF_c_obj_s_yamishop_tbl]
+ - [0xD5F9CC, ckf_ds, obj_s_yamishop/cKF_ds_obj_s_yamishop_tbl]
+ - [0xD5FA02] # padding
+ - [0xD5FA04, ckf_ba, obj_s_yamishop/cKF_ba_r_obj_s_yamishop]
+ - [0xD5FA18] # padding
+ - [0xD5FA28, vtx, obj_w_yamishop/obj_w_yamishop_v]
+ - [0xD5FE48, gfx, obj_w_yamishop/obj_w_yamishop_window_model]
+ - [0xD5FED8, gfx, obj_w_yamishop/obj_w_yamishop_t1_model]
+ - [0xD5FFF0, gfx, obj_w_yamishop/obj_w_yamishop_light_model]
+ - [0xD600B0, gfx, obj_w_yamishop/obj_w_yamishop_door1_model]
+ - [0xD601F8, gfx, obj_w_yamishop/obj_w_yamishop_door2_model]
+ - [0xD602E8, af_ci4, obj_w_yamishop/obj_w_yamishop_t2_tex_txt, 128, 32, 0xD5BA68, 0x20]
+ - [0xD60AE8, af_ci4, obj_w_yamishop/obj_w_yamishop_t1_tex_txt, 128, 32, 0xD5BA68, 0x20]
+ - [0xD612E8, af_i4, obj_w_yamishop/obj_w_yamishop_window_tex_txt, 16, 16]
+ - [0xD61368, ckf_je, obj_w_yamishop/cKF_je_r_obj_w_yamishop_tbl]
+ - [0xD613B0, ckf_bs, obj_w_yamishop/cKF_bs_r_obj_w_yamishop]
+ - [0xD613B8, ckf_ckcb, obj_w_yamishop/cKF_ckcb_r_obj_w_yamishop_tbl]
+ - [0xD613C0, ckf_kn, obj_w_yamishop/cKF_kn_obj_w_yamishop_tbl]
+ - [0xD613C4, ckf_c, obj_w_yamishop/cKF_c_obj_w_yamishop_tbl]
+ - [0xD613EC, ckf_ds, obj_w_yamishop/cKF_ds_obj_w_yamishop_tbl]
+ - [0xD61422] # padding
+ - [0xD61424, ckf_ba, obj_w_yamishop/cKF_ba_r_obj_w_yamishop]
+ - [0xD61438] # padding
+ - [0xD61448]
+ - [0xDDB248, vtx, obj_s_toudai/obj_s_toudai_v]
+ - [0xDDBBD8, gfx, obj_s_toudai/obj_s_toudai_mirror_model]
+ - [0xDDBCA0, gfx, obj_s_toudai/obj_s_toudai_glass_model]
+ - [0xDDBD70, gfx, obj_s_toudai/obj_s_toudai_body_model]
+ - [0xDDC188, gfx, obj_s_toudai/obj_s_toudai_light_model]
+ - [0xDDC258, gfx, obj_s_toudai/obj_s_toudai_lenz_model]
+ - [0xDDC320, gfx, obj_s_toudai/obj_s_toudai_arm_model]
+ - [0xDDC3A8, af_i8, obj_s_toudai/obj_s_toudai_light_tex_txt, 16, 16]
+ - [0xDDC4A8, af_ci4, obj_s_toudai/obj_s_toudai_arm_tex_txt, 16, 16, 0xD5C3A8, 0x20]
+ - [0xDDC528, af_ci4, obj_s_toudai/obj_s_toudai_dai_tex_txt, 32, 32, 0xD5C3A8, 0x20]
+ - [0xDDC728, af_ci4, obj_s_toudai/obj_s_toudai_dou_tex_txt, 32, 64, 0xD5C3A8, 0x20]
+ - [0xDDCB28, af_ci4, obj_s_toudai/obj_s_toudai_plate_tex_txt, 16, 16, 0xD5C3A8, 0x20]
+ - [0xDDCBA8, af_ci4, obj_s_toudai/obj_s_toudai_side_tex_txt, 16, 16, 0xD5C3A8, 0x20]
+ - [0xDDCC28, af_ci4, obj_s_toudai/obj_s_toudai_tesuri_tex_txt, 16, 16, 0xD5C3A8, 0x20]
+ - [0xDDCCA8, af_ci4, obj_s_toudai/obj_s_toudai_yane_tex_txt, 16, 16, 0xD5C3A8, 0x20]
+ - [0xDDCD28, af_palette, obj_s_toudai/obj_s_toudai_glass_tex_pic_ci4_pal]
+ - [0xDDCD48, af_ci4, obj_s_toudai/obj_s_toudai_glass_tex_pic_ci4, 16, 16, 0xDDCD28, 0x20]
+ - [0xDDCDC8, ckf_je, obj_s_toudai/cKF_je_r_obj_s_toudai_tbl]
+ - [0xDDCE1C, ckf_bs, obj_s_toudai/cKF_bs_r_obj_s_toudai]
+ - [0xDDCE24, ckf_ckcb, obj_s_toudai/cKF_ckcb_r_obj_s_toudai_tbl]
+ - [0xDDCE2C, ckf_kn, obj_s_toudai/cKF_kn_obj_s_toudai_tbl]
+ - [0xDDCE30, ckf_c, obj_s_toudai/cKF_c_obj_s_toudai_tbl]
+ - [0xDDCE60, ckf_ds, obj_s_toudai/cKF_ds_obj_s_toudai_tbl]
+ - [0xDDCE6C, ckf_ba, obj_s_toudai/cKF_ba_r_obj_s_toudai]
+ - [0xDDCE80] # padding
+ - [0xDDCE90, vtx, obj_w_toudai/obj_w_toudai_v]
+ - [0xDDD7E0, gfx, obj_w_toudai/obj_w_toudai_mirror_model]
+ - [0xDDD8A8, gfx, obj_w_toudai/obj_w_toudai_glass_model]
+ - [0xDDD978, gfx, obj_w_toudai/obj_w_toudai_body_model]
+ - [0xDDDD90, gfx, obj_w_toudai/obj_w_toudai_light_model]
+ - [0xDDDE60, gfx, obj_w_toudai/obj_w_toudai_lenz_model]
+ - [0xDDDF28, gfx, obj_w_toudai/obj_w_toudai_arm_model]
+ - [0xDDDFB0, af_i8, obj_w_toudai/obj_w_toudai_light_tex_txt, 16, 16]
+ - [0xDDE0B0, af_ci4, obj_w_toudai/obj_w_toudai_arm_tex_txt, 16, 16, 0xD5C3C8, 0x20]
+ - [0xDDE130, af_ci4, obj_w_toudai/obj_w_toudai_dai_tex_txt, 32, 32, 0xD5C3C8, 0x20]
+ - [0xDDE330, af_ci4, obj_w_toudai/obj_w_toudai_dou_tex_txt, 32, 64, 0xD5C3C8, 0x20]
+ - [0xDDE730, af_ci4, obj_w_toudai/obj_w_toudai_plate_tex_txt, 16, 16, 0xD5C3C8, 0x20]
+ - [0xDDE7B0, af_ci4, obj_w_toudai/obj_w_toudai_side_tex_txt, 16, 16, 0xD5C3C8, 0x20]
+ - [0xDDE830, af_ci4, obj_w_toudai/obj_w_toudai_tesuri_tex_txt, 16, 16, 0xD5C3C8, 0x20]
+ - [0xDDE8B0, af_ci4, obj_w_toudai/obj_w_toudai_yane_tex_txt, 16, 16, 0xD5C3C8, 0x20]
+ - [0xDDE930, af_palette, obj_w_toudai/obj_w_toudai_glass_tex_pic_ci4_pal]
+ - [0xDDE950, af_ci4, obj_w_toudai/obj_w_toudai_glass_tex_pic_ci4, 16, 16, 0xDDE930, 0x20]
+ - [0xDDE9D0, ckf_je, obj_w_toudai/cKF_je_r_obj_w_toudai_tbl]
+ - [0xDDEA24, ckf_bs, obj_w_toudai/cKF_bs_r_obj_w_toudai]
+ - [0xDDEA2C, ckf_ckcb, obj_w_toudai/cKF_ckcb_r_obj_w_toudai_tbl]
+ - [0xDDEA34, ckf_kn, obj_w_toudai/cKF_kn_obj_w_toudai_tbl]
+ - [0xDDEA38, ckf_c, obj_w_toudai/cKF_c_obj_w_toudai_tbl]
+ - [0xDDEA68, ckf_ds, obj_w_toudai/cKF_ds_obj_w_toudai_tbl]
+ - [0xDDEA74, ckf_ba, obj_w_toudai/cKF_ba_r_obj_w_toudai]
+ - [0xDDEA88] # padding
+ - [0xDDEA98]
+ - [0xDEC838, vtx, obj_s_windmill/obj_s_windmill_v]
+ - [0xDECD98, gfx, obj_s_windmill/obj_s_windmill_unk_model_1]
+ - [0xDECE60, gfx, obj_s_windmill/obj_s_windmill_unk_model_2]
+ - [0xDECF10, gfx, obj_s_windmill/obj_s_windmill_unk_model_3]
+ - [0xDECFE8, gfx, obj_s_windmill/obj_s_windmill_unk_model_4]
+ - [0xDED0D8, af_ci4, obj_s_windmill/obj_s_windmill_unk_tex_1, 128, 32, 0xD5C1E8, 0x20]
+ - [0xDED8D8, af_ci4, obj_s_windmill/obj_s_windmill_unk_tex_2, 128, 32, 0xD5C1E8, 0x20]
+ - [0xDEE0D8, af_ci4, obj_s_windmill/obj_s_windmill_unk_tex_3, 128, 32, 0xD5C1E8, 0x20]
+ - [0xDEE8D8, ckf_ckcb, obj_s_windmill/cKF_ckcb_r_obj_s_windmill_tbl]
+ - [0xDEE8E0, ckf_c, obj_s_windmill/cKF_c_obj_s_windmill_tbl]
+ - [0xDEE904, ckf_ba, obj_s_windmill/cKF_ba_r_obj_s_windmill]
+ - [0xDEE918, ckf_je, obj_s_windmill/cKF_je_r_obj_s_windmill]
+ - [0xDEE954, ckf_bs, obj_s_windmill/cKF_bs_r_obj_s_windmill]
+ - [0xDEE95C] # padding
+ - [0xDEE970, vtx, obj_w_windmill/obj_w_windmill_v]
+ - [0xDEEEC0, gfx, obj_w_windmill/obj_w_windmill_unk_model_1]
+ - [0xDEEF88, gfx, obj_w_windmill/obj_w_windmill_unk_model_2]
+ - [0xDEF038, gfx, obj_w_windmill/obj_w_windmill_unk_model_3]
+ - [0xDEF110, gfx, obj_w_windmill/obj_w_windmill_unk_model_4]
+ - [0xDEF1F8, af_ci4, obj_w_windmill/obj_w_windmill_unk_tex_1, 128, 32, 0xD5C288, 0x20]
+ - [0xDEF9F8, af_ci4, obj_w_windmill/obj_w_windmill_unk_tex_2, 128, 32, 0xD5C288, 0x20]
+ - [0xDF01F8, af_ci4, obj_w_windmill/obj_w_windmill_unk_tex_3, 128, 32, 0xD5C288, 0x20]
+ - [0xDF09F8, ckf_ckcb, obj_w_windmill/cKF_ckcb_r_obj_w_windmill_tbl]
+ - [0xDF0A00, ckf_c, obj_w_windmill/cKF_c_obj_w_windmill_tbl]
+ - [0xDF0A24, ckf_ba, obj_w_windmill/cKF_ba_r_obj_w_windmill]
+ - [0xDF0A38, ckf_je, obj_w_windmill/cKF_je_r_obj_w_windmill]
+ - [0xDF0A74, ckf_bs, obj_w_windmill/cKF_bs_r_obj_w_windmill]
+ - [0xDF0A7C] # padding
- [0xDF3480]
- name: object_00DF4000
@@ -4468,15 +4618,26 @@
# - [0x1127000, data, assets/objects/object_01127000/object_01127000]
- [0x1127A40]
- - name: object_01128000
- type: bin # code
+ - name: tol_utiwa_1
+ dir: objects/tol_utiwa_1
+ type: code
start: 0x1128000
vram: 0x06000000
exclusive_ram_id: segment_06
compress: True
align: 0x1000
- # subsegments:
- # - [0x1128000, data, assets/objects/object_01128000/object_01128000]
+ symbol_name_format: $VRAM_$ROM
+ subsegments:
+ - [auto, c, tol_utiwa_1]
+ - start: 0x1128000
+ type: .data
+ name: tol_utiwa_1
+ subsegments:
+ - [0x1128000, vtx, tol_utiwa_1_v]
+ - [0x1128080, gfx, main_utiwa1_model]
+ - [0x1128188, af_palette, tol_utiwa1_pal]
+ - [0x11281A8, af_ci4, tol_utiwa_1_main1_tex_txt, 32, 32, 0x1128188, 0x20]
+ - [0x11283A8, af_ci4, tol_utiwa_1_main2_tex_txt, 32, 32, 0x1128188, 0x20]
- [0x11285B0]
- name: object_01129000
@@ -4534,15 +4695,25 @@
# - [0x112D000, data, assets/objects/object_0112D000/object_0112D000]
- [0x112E1E0]
- - name: object_0112F000
- type: bin # code
+ - name: tol_cracker_1
+ dir: objects/tol_cracker_1
+ type: code
start: 0x112F000
vram: 0x06000000
exclusive_ram_id: segment_06
compress: True
align: 0x1000
- # subsegments:
- # - [0x112F000, data, assets/objects/object_0112F000/object_0112F000]
+ symbol_name_format: $VRAM_$ROM
+ subsegments:
+ - [auto, c, tol_cracker_1]
+ - start: 0x112F000
+ type: .data
+ name: tol_cracker_1
+ subsegments:
+ - [0x112F000, vtx, tol_cracker_1_v]
+ - [0x112F1C0, gfx, tol_cracker_1T_model]
+ - [0x112F280, af_palette, tol_cracker_1_pal]
+ - [0x112F2A0, af_ci4, tol_cracker_1_tex, 64, 16, 0x112F280, 0x20]
- [0x112F4A0]
- name: object_01130000
diff --git a/yamls/jp/header.yaml b/yamls/jp/header.yaml
index 5e370dd..b78766d 100644
--- a/yamls/jp/header.yaml
+++ b/yamls/jp/header.yaml
@@ -19,13 +19,14 @@ options:
- linker_scripts/jp/symbol_addrs_code.txt
- linker_scripts/jp/symbol_addrs_buffers.txt
- linker_scripts/jp/symbol_addrs_overlays.txt
+ - linker_scripts/jp/symbol_addrs_assets.txt
- linker_scripts/jp/ignored_addresses.txt
reloc_addrs_path:
- relocs/reloc_addrs.jp.txt
asm_path: asm/jp
src_path: src
- asset_path: bin/jp
+ asset_path: assets/jp
build_path: build