summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoremilybrooks <emilybrooksemilybrooks@gmail.com>2024-01-26 16:19:49 -0700
committerGitHub <noreply@github.com>2024-01-26 16:19:49 -0700
commit1d9c5c49c5d5ee1fa0e9d53d02bfd732d9d863fd (patch)
treee2068628ed4f9309c9623a09717751249e573784
parentcc4355f6adae67c2f90b78659dc6bcf13910cc86 (diff)
Second half of tool objects (#136)
* tol_keitai_1 * kenjyu * evw_anime data extraction works * forgot to remove this * added comments for objects * fixes * scroll colprim colenv now extract as arrays * forgot commas
-rw-r--r--include/evw_anime.h50
-rw-r--r--include/tables/dmatables/dmadata_table_jp.h12
-rw-r--r--include/tables/object_table.h12
-rw-r--r--linker_scripts/jp/ignored_addresses.txt2
-rw-r--r--linker_scripts/jp/symbol_addrs_assets.txt64
-rw-r--r--linker_scripts/jp/undefined_syms.ld53
-rw-r--r--src/objects/tol_cracker_1/tol_cracker_1.h5
-rw-r--r--src/objects/tol_hata_01/tol_hata_01.c8
-rw-r--r--src/objects/tol_hata_01/tol_hata_01.h24
-rw-r--r--src/objects/tol_hata_01/tol_hata_01_evw_anime.c7
-rw-r--r--src/objects/tol_kamicup/tol_kamicup.c6
-rw-r--r--src/objects/tol_kamicup/tol_kamicup.h16
-rw-r--r--src/objects/tol_keitai_1/keitai_off1.c7
-rw-r--r--src/objects/tol_keitai_1/keitai_on1.c7
-rw-r--r--src/objects/tol_keitai_1/tol_keitai_1.c12
-rw-r--r--src/objects/tol_keitai_1/tol_keitai_1.h37
-rw-r--r--src/objects/tol_kenjyu_1/tol_kenjyu_1.c6
-rw-r--r--src/objects/tol_kenjyu_1/tol_kenjyu_1.h16
-rw-r--r--src/objects/tol_npcsao_1/tol_npcsao_1.c7
-rw-r--r--src/objects/tol_npcsao_1/tol_npcsao_1.h18
-rw-r--r--src/objects/tol_tamaire/ef_tamaire01.c7
-rw-r--r--src/objects/tol_tamaire/tol_tamaire.c11
-rw-r--r--src/objects/tol_tamaire/tol_tamaire.h26
-rw-r--r--src/objects/tol_utiwa_1/tol_utiwa_1.h5
-rw-r--r--src/overlays/actors/ovl_Tools/ac_tools.c18
-rw-r--r--src/overlays/actors/ovl_Train_Window/ac_train_window.c2
-rw-r--r--tools/splat_ext/af_gfx.py281
-rw-r--r--tools/splat_ext/af_ia8.py22
-rw-r--r--tools/splat_ext/ckf_c.py4
-rw-r--r--tools/splat_ext/ckf_kn.py4
-rw-r--r--tools/splat_ext/evw_animeptn.py38
-rw-r--r--tools/splat_ext/evw_colenv.py43
-rw-r--r--tools/splat_ext/evw_colprim.py43
-rw-r--r--tools/splat_ext/evw_colreg.py57
-rw-r--r--tools/splat_ext/evw_data.py49
-rw-r--r--tools/splat_ext/evw_scroll.py43
-rw-r--r--tools/splat_ext/evw_texanime.py57
-rw-r--r--tools/splat_ext/evw_textable.py47
-rw-r--r--yamls/jp/assets.yaml358
39 files changed, 1278 insertions, 206 deletions
diff --git a/include/evw_anime.h b/include/evw_anime.h
index 14a2273..e4c83f1 100644
--- a/include/evw_anime.h
+++ b/include/evw_anime.h
@@ -5,11 +5,49 @@
struct Game;
-typedef struct EvwAnimeUnk {
- s8 unk_0;
- s16 unk1;
- void* unk_4;
-} EvwAnimeUnk;
+typedef struct EvwAnimeScroll {
+ /* 0x0 */ s8 x; /* x (s) texture position */
+ /* 0x1 */ s8 y; /* y (t) texture position */
+ /* 0x2 */ u8 width; /* texture width */
+ /* 0x3 */ u8 height; /* texture height */
+} EvwAnimeScroll; // size = 0x4
+
+typedef struct EvwAnimeColPrim {
+ /* 0x0 */ u8 r;
+ /* 0x1 */ u8 g;
+ /* 0x2 */ u8 b;
+ /* 0x3 */ u8 a;
+ /* 0x4 */ u8 l;
+} EvwAnimeColPrim; // size = 0x5
+
+typedef struct EvwAnimeColEnv {
+ /* 0x0 */ u8 r;
+ /* 0x1 */ u8 g;
+ /* 0x2 */ u8 b;
+ /* 0x3 */ u8 a;
+} EvwAnimeColEnv; // size = 0x4
+
+typedef struct EvwAnimeColReg {
+ /* 0x0 */ u16 frameCount;
+ /* 0x2 */ u16 keyframeCount;
+ /* 0x4 */ EvwAnimeColPrim* prim;
+ /* 0x8 */ EvwAnimeColEnv* env;
+ /* 0xC */ u16* keyframes;
+} EvwAnimeColReg; // size = 0x10
+
+typedef struct EvwAnimeTexAnime {
+ /* 0x0 */ u16 frameCount; /* total frames in the animation */
+ /* 0x2 */ u16 keyframeCount; /* number of animation keyframes */
+ /* 0x4 */ void** textureTable; /* list of each texture */
+ /* 0x8 */ u8* animationPattern; /* list of which texture to use per keyframe (runs at 30 FPS) */
+ /* 0xC */ u16* keyframes; /* list of keyframe frame indices */
+} EvwAnimeTexAnime; // size = 0x10
+
+typedef struct EvwAnimeData {
+ /* 0x0 */ s8 segment; /* Negative segments signal the end of the animation data array */
+ /* 0x2 */ s16 type;
+ /* 0x4 */ void* dataPtr;
+} EvwAnimeData; // size = 0x8
// void func_800549C0_jp();
// void func_80054A28_jp();
@@ -23,6 +61,6 @@ typedef struct EvwAnimeUnk {
// void func_80055214_jp();
// void func_80055248_jp();
// void func_800554D8_jp();
-void Evw_Anime_Set(struct Game*,EvwAnimeUnk*);
+void Evw_Anime_Set(struct Game*,EvwAnimeData*);
#endif
diff --git a/include/tables/dmatables/dmadata_table_jp.h b/include/tables/dmatables/dmadata_table_jp.h
index c714c66..21afbce 100644
--- a/include/tables/dmatables/dmadata_table_jp.h
+++ b/include/tables/dmatables/dmadata_table_jp.h
@@ -2268,15 +2268,15 @@ DEFINE_DMA_ENTRY(tol_umb_29, "tol_umb_29")
DEFINE_DMA_ENTRY(tol_umb_30, "tol_umb_30")
DEFINE_DMA_ENTRY(tol_umb_31, "tol_umb_31")
DEFINE_DMA_ENTRY(tol_umb_32, "tol_umb_32")
-DEFINE_DMA_ENTRY(object_01127000, "object_01127000")
+DEFINE_DMA_ENTRY(tol_keitai_1, "tol_keitai_1")
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(tol_npcsao_1, "tol_npcsao_1")
+DEFINE_DMA_ENTRY(tol_kamicup, "tol_kamicup")
+DEFINE_DMA_ENTRY(tol_kenjyu_1, "tol_kenjyu_1")
+DEFINE_DMA_ENTRY(tol_tamaire, "tol_tamaire")
DEFINE_DMA_ENTRY(tol_cracker_1, "tol_cracker_1")
-DEFINE_DMA_ENTRY(object_01130000, "object_01130000")
+DEFINE_DMA_ENTRY(tol_hata_01, "tol_hata_01")
DEFINE_DMA_ENTRY(object_01131000, "object_01131000")
DEFINE_DMA_ENTRY(object_01134000, "object_01134000")
DEFINE_DMA_ENTRY(object_01135000, "object_01135000")
diff --git a/include/tables/object_table.h b/include/tables/object_table.h
index ada136d..ee4f5fb 100644
--- a/include/tables/object_table.h
+++ b/include/tables/object_table.h
@@ -16,7 +16,7 @@
/* 0x003 */ DEFINE_OBJECT(gameplay_keep, GAMEPLAY_KEEP)
/* 0x004 */ DEFINE_OBJECT(object_00D2D000, OBJECT_4)
/* 0x005 */ DEFINE_OBJECT(object_013A4000, OBJECT_5)
-/* 0x006 */ DEFINE_OBJECT(object_01130000, OBJECT_6)
+/* 0x006 */ DEFINE_OBJECT(tol_hata_01, OBJECT_TOL_HATA_01)
/* 0x007 */ DEFINE_OBJECT(object_0113C000, OBJECT_7)
/* 0x008 */ DEFINE_OBJECT(object_00D25000, OBJECT_8)
/* 0x009 */ DEFINE_OBJECT(object_00B36000, OBJECT_9)
@@ -26,7 +26,7 @@
/* 0x00D */ DEFINE_OBJECT(object_013AB000, OBJECT_13)
/* 0x00E */ DEFINE_OBJECT(object_00B68000, OBJECT_14)
/* 0x00F */ DEFINE_OBJECT(object_00B88000, OBJECT_15)
-/* 0x010 */ DEFINE_OBJECT(object_0112C000, OBJECT_16)
+/* 0x010 */ DEFINE_OBJECT(tol_kenjyu_1, OBJECT_TOL_KENJYU_1)
/* 0x011 */ DEFINE_OBJECT(object_0179F000, OBJECT_17)
/* 0x012 */ DEFINE_OBJECT(object_017A1000, OBJECT_18)
/* 0x013 */ DEFINE_OBJECT(object_0182A000, OBJECT_19)
@@ -55,7 +55,7 @@
/* 0x02A */ DEFINE_OBJECT(object_01871000, OBJECT_42)
/* 0x02B */ DEFINE_OBJECT(object_013A5000, OBJECT_43)
/* 0x02C */ DEFINE_OBJECT(object_013A6000, OBJECT_44)
-/* 0x02D */ DEFINE_OBJECT(object_01127000, OBJECT_45)
+/* 0x02D */ DEFINE_OBJECT(tol_keitai_1, OBJECT_TOL_KEITAI_1)
/* 0x02E */ DEFINE_OBJECT(object_01880000, OBJECT_46)
/* 0x02F */ DEFINE_OBJECT(object_01884000, OBJECT_47)
/* 0x030 */ DEFINE_OBJECT(object_01135000, OBJECT_48)
@@ -380,8 +380,8 @@
/* 0x16F */ DEFINE_OBJECT(object_01011000, OBJECT_367)
/* 0x170 */ DEFINE_OBJECT(object_01014000, OBJECT_368)
/* 0x171 */ DEFINE_OBJECT(object_01147000, OBJECT_369)
-/* 0x172 */ DEFINE_OBJECT(object_0112A000, OBJECT_370)
-/* 0x173 */ DEFINE_OBJECT(object_0112B000, OBJECT_371)
+/* 0x172 */ DEFINE_OBJECT(tol_npcsao_1, OBJECT_TOL_NPCSAO_1)
+/* 0x173 */ DEFINE_OBJECT(tol_kamicup, OBJECT_TOL_KAMICUP)
/* 0x174 */ DEFINE_OBJECT(object_00F41000, OBJECT_372)
/* 0x175 */ DEFINE_OBJECT(object_00F43000, OBJECT_373)
/* 0x176 */ DEFINE_OBJECT(object_00FBF000, OBJECT_374)
@@ -401,7 +401,7 @@
/* 0x184 */ DEFINE_OBJECT(object_010A8000, OBJECT_388)
/* 0x185 */ DEFINE_OBJECT(object_010AA000, OBJECT_389)
/* 0x186 */ DEFINE_OBJECT(object_010AC000, OBJECT_390)
-/* 0x187 */ DEFINE_OBJECT(object_0112D000, OBJECT_391)
+/* 0x187 */ DEFINE_OBJECT(tol_tamaire, OBJECT_TOL_TAMAIRE)
/* 0x188 */ DEFINE_OBJECT(object_011F4000, OBJECT_392)
/* 0x189 */ DEFINE_OBJECT_UNSET(OBJECT_UNSET_393)
/* 0x18A */ DEFINE_OBJECT(object_01106000, OBJECT_394)
diff --git a/linker_scripts/jp/ignored_addresses.txt b/linker_scripts/jp/ignored_addresses.txt
index 848e5c4..f6d2388 100644
--- a/linker_scripts/jp/ignored_addresses.txt
+++ b/linker_scripts/jp/ignored_addresses.txt
@@ -43,4 +43,4 @@ D_6000140 = 0x06000140; // ignore:true
D_6000180 = 0x06000180; // ignore:true
D_6000220 = 0x06000220; // ignore:true
D_60003E8 = 0x060003E8; // ignore:true
-D_6001B68 = 0x06001B68; // ignore:true \ No newline at end of file
+D_6001B68 = 0x06001B68; // ignore:true
diff --git a/linker_scripts/jp/symbol_addrs_assets.txt b/linker_scripts/jp/symbol_addrs_assets.txt
index 1d74df1..4514704 100644
--- a/linker_scripts/jp/symbol_addrs_assets.txt
+++ b/linker_scripts/jp/symbol_addrs_assets.txt
@@ -368,13 +368,77 @@ obj_shop_umb_32_pal = 0x6000508; // segment:tol_umb_32 rom:0x1126508
obj_shop_umb_32_kasa1_tex_txt = 0x6000528; // segment:tol_umb_32 rom:0x1126528
obj_shop_umb_32_tuka1_tex_txt = 0x6000728; // segment:tol_umb_32 rom:0x1126728
+cKF_ckcb_r_tol_keitai_1_keitai_off1_tbl = 0x6000000; // segment:tol_keitai_1 rom:0x1127000
+cKF_kn_tol_keitai_1_keitai_off1_tbl = 0x6000004; // segment:tol_keitai_1 rom:0x1127004
+cKF_c_tol_keitai_1_keitai_off1_tbl = 0x6000018; // segment:tol_keitai_1 rom:0x1127018
+cKF_ds_tol_keitai_1_keitai_off1_tbl = 0x6000020; // segment:tol_keitai_1 rom:0x1127020
+cKF_ba_r_tol_keitai_1_keitai_off1 = 0x60000A4; // segment:tol_keitai_1 rom:0x11270A4
+cKF_ckcb_r_tol_keitai_1_keitai_on1_tbl = 0x60000C0; // segment:tol_keitai_1 rom:0x11270C0
+cKF_kn_tol_keitai_1_keitai_on1_tbl = 0x60000C4; // segment:tol_keitai_1 rom:0x11270C4
+cKF_c_tol_keitai_1_keitai_on1_tbl = 0x60000C8; // segment:tol_keitai_1 rom:0x11270C8
+cKF_ds_tol_keitai_1_keitai_on1_tbl = 0x60000E0; // segment:tol_keitai_1 rom:0x11270E0
+cKF_ba_r_tol_keitai_1_keitai_on1 = 0x6000134; // segment:tol_keitai_1 rom:0x1127134
+tol_keitai_1_v = 0x6000150; // segment:tol_keitai_1 rom:0x1127150 size:0x1D0
+main1_keitai1_model = 0x6000320; // segment:tol_keitai_1 rom:0x1127320
+main2_keitai1_model = 0x6000480; // segment:tol_keitai_1 rom:0x1127480
+tol_keitai_1_pal = 0x60005E8; // segment:tol_keitai_1 rom:0x11275E8
+tol_keitai_1_ueura1_tex_txt = 0x6000608; // segment:tol_keitai_1 rom:0x1127608
+tol_keitai_1_ueomote1_tex_txt = 0x6000708; // segment:tol_keitai_1 rom:0x1127708
+tol_keitai_1_shitaura1_tex_txt = 0x6000808; // segment:tol_keitai_1 rom:0x1127808
+tol_keitai_1_shitaomote1_tex_txt = 0x6000908; // segment:tol_keitai_1 rom:0x1127908
+cKF_je_r_tol_keitai_1_tbl = 0x6000A08; // segment:tol_keitai_1 rom:0x1127A08
+cKF_bs_r_tol_keitai_1 = 0x6000A2C; // segment:tol_keitai_1 rom:0x1127A2C
+
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_npcsao_1_v = 0x6000000; // segment:tol_npcsao_1 rom:0x112A000 size:0x470
+tol_npcsao_1_sao_model = 0x6000470; // segment:tol_npcsao_1 rom:0x112A470
+tol_npcsao_1_uki_model = 0x6000548; // segment:tol_npcsao_1 rom:0x112A548
+tol_npcsao_1_pal = 0x60005D8; // segment:tol_npcsao_1 rom:0x112A5D8
+tol_npcsao_1_tex = 0x60005F8; // segment:tol_npcsao_1 rom:0x112A5F8
+
+tol_kamicup_1_v = 0x6000000; // segment:tol_kamicup rom:0x112B000 size:0x330
+tol_kamicup_1T_model = 0x6000330; // segment:tol_kamicup rom:0x112B330
+tol_kamicup_pal = 0x6000450; // segment:tol_kamicup rom:0x112B450
+tol_kamicup_tex = 0x6000470; // segment:tol_kamicup rom:0x112B470
+
+tol_kenjyu_1_v = 0x6000000; // segment:tol_kenjyu_1 rom:0x112C000 size:0x410
+tol_kenjyu_1T_model = 0x6000410; // segment:tol_kenjyu_1 rom:0x112C410
+tol_kenjyu_1_pal = 0x6000528; // segment:tol_kenjyu_1 rom:0x112C528
+tol_kenjyu_1_tex = 0x6000548; // segment:tol_kenjyu_1 rom:0x112C548
+
+ef_tamaire01_r_v = 0x6000000; // segment:tol_tamaire rom:0x112D000 size:0x40
+tama01_model = 0x6000040; // segment:tol_tamaire rom:0x112D040
+ef_tamaire01_r_pal = 0x60000C8; // segment:tol_tamaire rom:0x112D0C8
+tama01_r_tex = 0x60000E8; // segment:tol_tamaire rom:0x112D0E8
+tama01_w_tex = 0x60002E8; // segment:tol_tamaire rom:0x112D2E8
+tol_tamaire_v = 0x60004F0; // segment:tol_tamaire rom:0x112D4F0 size:0x40
+tol_tamaire_model = 0x6000530; // segment:tol_tamaire rom:0x112D530
+tol_tamaire_pal = 0x60005B8; // segment:tol_tamaire rom:0x112D5B8
+tol_tamaire_r1_tex = 0x60005D8; // segment:tol_tamaire rom:0x112D5D8
+tol_tamaire_r2_tex = 0x60007D8; // segment:tol_tamaire rom:0x112D7D8
+tol_tamaire_r3_tex = 0x60009D8; // segment:tol_tamaire rom:0x112D9D8
+tol_tamaire_w1_tex = 0x6000BD8; // segment:tol_tamaire rom:0x112DBD8
+tol_tamaire_w2_tex = 0x6000DD8; // segment:tol_tamaire rom:0x112DDD8
+tol_tamaire_w3_tex = 0x6000FD8; // segment:tol_tamaire rom:0x112DFD8
+
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
+
+tol_hata_01_v = 0x6000000; // segment:tol_hata_01 rom:0x1130000 size:0xF0
+tol_hata_e_model = 0x60000F0; // segment:tol_hata_01 rom:0x11300F0
+tol_hata_hataT_model = 0x60001A0; // segment:tol_hata_01 rom:0x11301A0
+tol_hata_e_pal = 0x6000228; // segment:tol_hata_01 rom:0x1130228
+tol_hata_e_tex = 0x6000248; // segment:tol_hata_01 rom:0x1130248
+tol_hata_hata_tex_inta_ia8 = 0x60002C8; // segment:tol_hata_01 rom:0x11302C8
+tol_hata_01_evw_anime_1_tex_table = 0x60003D0; // segment:tol_hata_01 rom:0x11303D0
+tol_hata_01_evw_anime_1_anime_ptn = 0x60003D4; // segment:tol_hata_01 rom:0x11303D4
+tol_hata_01_evw_anime_1 = 0x60003D8; // segment:tol_hata_01 rom:0x11303D8
+tol_hata_01_evw_anime_2 = 0x60003E8; // segment:tol_hata_01 rom:0x11303E8
+tol_hata_01_evw_anime = 0x60003F0; // segment:tol_hata_01 rom:0x11303F0
diff --git a/linker_scripts/jp/undefined_syms.ld b/linker_scripts/jp/undefined_syms.ld
index b28eeb2..aa342de 100644
--- a/linker_scripts/jp/undefined_syms.ld
+++ b/linker_scripts/jp/undefined_syms.ld
@@ -1249,55 +1249,6 @@ D_6001628 = 0x06001628;
D_60030A0 = 0x060030A0;
D_60036C0 = 0x060036C0;
-// ovl_T_Umbrella
-
-D_6000390 = 0x06000390;
-D_60003C0 = 0x060003C0;
-D_6000470 = 0x06000470;
-D_6000508 = 0x06000508;
-D_6000580 = 0x06000580;
-
-// ovl_T_Keitai
-
-D_6000A2C = 0x06000A2C;
-
-// ovl_T_Utiwa
-
-D_6000080 = 0x06000080;
-
-// ovl_T_Hanabi
-
-D_6000080 = 0x06000080;
-
-// ovl_T_Cracker
-
-D_60001C0 = 0x060001C0;
-
-// ovl_T_Pistol
-
-D_6000410 = 0x06000410;
-
-// ovl_T_Flag
-
-D_6000000 = 0x06000000;
-D_60000F0 = 0x060000F0;
-D_60001A0 = 0x060001A0;
-D_60003F0 = 0x060003F0;
-
-// ovl_T_Tumbler
-
-D_6000330 = 0x06000330;
-
-// ovl_T_NpcSao
-
-D_6000470 = 0x06000470;
-D_6000548 = 0x06000548;
-
-// ovl_T_Tama
-
-D_6000040 = 0x06000040;
-D_6000DD8 = 0x06000DD8;
-
// ovl__008ED290
D_600F5C8 = 0x0600F5C8;
@@ -5718,10 +5669,6 @@ cKF_ba_r_obj_w_toudai = 0x06080A74;
obj_s_toudai_light_model = 0x0607E188;
obj_w_toudai_light_model = 0x0607FD90;
-// ac_t_hanabi
-
-main_utiwa1_model = 0x06000080;
-
// Buffers
D_801524C0_jp = 0x801524C0; //
diff --git a/src/objects/tol_cracker_1/tol_cracker_1.h b/src/objects/tol_cracker_1/tol_cracker_1.h
index 2b86462..50c1c26 100644
--- a/src/objects/tol_cracker_1/tol_cracker_1.h
+++ b/src/objects/tol_cracker_1/tol_cracker_1.h
@@ -3,6 +3,11 @@
#include "gbi.h"
+/**
+ * @file tol_cracker_1
+ * クラッカー Party Popper
+ */
+
extern Vtx tol_cracker_1_v[];
extern Gfx tol_cracker_1T_model[];
extern unsigned short tol_cracker_1_pal[];
diff --git a/src/objects/tol_hata_01/tol_hata_01.c b/src/objects/tol_hata_01/tol_hata_01.c
new file mode 100644
index 0000000..bb07458
--- /dev/null
+++ b/src/objects/tol_hata_01/tol_hata_01.c
@@ -0,0 +1,8 @@
+#include "tol_hata_01.h"
+
+#include "assets/jp/objects/tol_hata_01/tol_hata_01_v.vtx.inc.c"
+#include "assets/jp/objects/tol_hata_01/tol_hata_e_model.gfx.inc.c"
+#include "assets/jp/objects/tol_hata_01/tol_hata_hataT_model.gfx.inc.c"
+#include "assets/jp/objects/tol_hata_01/tol_hata_e_pal.palette.inc.c"
+#include "assets/jp/objects/tol_hata_01/tol_hata_e_tex.ci4.inc.c"
+#include "assets/jp/objects/tol_hata_01/tol_hata_hata_tex_inta_ia8.ia8.inc.c"
diff --git a/src/objects/tol_hata_01/tol_hata_01.h b/src/objects/tol_hata_01/tol_hata_01.h
new file mode 100644
index 0000000..c17ca49
--- /dev/null
+++ b/src/objects/tol_hata_01/tol_hata_01.h
@@ -0,0 +1,24 @@
+#ifndef OBJECT_TOL_HATA_01_H
+#define OBJECT_TOL_HATA_01_H
+
+#include "gbi.h"
+#include "evw_anime.h"
+
+/**
+ * @file tol_hata_01
+ * 旗 Flag used in the Sports Fair
+ */
+
+extern Vtx tol_hata_01_v[];
+extern Gfx tol_hata_e_model[];
+extern Gfx tol_hata_hataT_model[];
+extern unsigned short tol_hata_e_pal[];
+extern unsigned char tol_hata_e_tex[];
+extern unsigned char tol_hata_hata_tex_inta_ia8[];
+extern void* tol_hata_01_evw_anime_1_tex_table;
+extern u8 tol_hata_01_evw_anime_1_anime_ptn[];
+extern EvwAnimeTexAnime tol_hata_01_evw_anime_1;
+extern EvwAnimeScroll tol_hata_01_evw_anime_2[];
+extern EvwAnimeData tol_hata_01_evw_anime[];
+
+#endif
diff --git a/src/objects/tol_hata_01/tol_hata_01_evw_anime.c b/src/objects/tol_hata_01/tol_hata_01_evw_anime.c
new file mode 100644
index 0000000..b792b54
--- /dev/null
+++ b/src/objects/tol_hata_01/tol_hata_01_evw_anime.c
@@ -0,0 +1,7 @@
+#include "tol_hata_01.h"
+
+#include "assets/jp/objects/tol_hata_01/tol_hata_01_evw_anime_1_tex_table.inc.c"
+#include "assets/jp/objects/tol_hata_01/tol_hata_01_evw_anime_1_anime_ptn.inc.c"
+#include "assets/jp/objects/tol_hata_01/tol_hata_01_evw_anime_1.inc.c"
+#include "assets/jp/objects/tol_hata_01/tol_hata_01_evw_anime_2.inc.c"
+#include "assets/jp/objects/tol_hata_01/tol_hata_01_evw_anime.inc.c"
diff --git a/src/objects/tol_kamicup/tol_kamicup.c b/src/objects/tol_kamicup/tol_kamicup.c
new file mode 100644
index 0000000..dc239cf
--- /dev/null
+++ b/src/objects/tol_kamicup/tol_kamicup.c
@@ -0,0 +1,6 @@
+#include "tol_kamicup.h"
+
+#include "assets/jp/objects/tol_kamicup/tol_kamicup_1_v.vtx.inc.c"
+#include "assets/jp/objects/tol_kamicup/tol_kamicup_1T_model.gfx.inc.c"
+#include "assets/jp/objects/tol_kamicup/tol_kamicup_pal.palette.inc.c"
+#include "assets/jp/objects/tol_kamicup/tol_kamicup_tex.ci4.inc.c"
diff --git a/src/objects/tol_kamicup/tol_kamicup.h b/src/objects/tol_kamicup/tol_kamicup.h
new file mode 100644
index 0000000..752b763
--- /dev/null
+++ b/src/objects/tol_kamicup/tol_kamicup.h
@@ -0,0 +1,16 @@
+#ifndef OBJECT_TOL_KAMICUP_H
+#define OBJECT_TOL_KAMICUP_H
+
+#include "gbi.h"
+
+/**
+ * @file tol_kamicup
+ * 紙コップ Paper Cup
+ */
+
+extern Vtx tol_kamicup_1_v[];
+extern Gfx tol_kamicup_1T_model[];
+extern unsigned short tol_kamicup_pal[];
+extern unsigned char tol_kamicup_tex[];
+
+#endif
diff --git a/src/objects/tol_keitai_1/keitai_off1.c b/src/objects/tol_keitai_1/keitai_off1.c
new file mode 100644
index 0000000..f0ab81d
--- /dev/null
+++ b/src/objects/tol_keitai_1/keitai_off1.c
@@ -0,0 +1,7 @@
+#include "tol_keitai_1.h"
+
+#include "assets/jp/objects/tol_keitai_1/cKF_ckcb_r_tol_keitai_1_keitai_off1_tbl.inc.c"
+#include "assets/jp/objects/tol_keitai_1/cKF_kn_tol_keitai_1_keitai_off1_tbl.inc.c"
+#include "assets/jp/objects/tol_keitai_1/cKF_c_tol_keitai_1_keitai_off1_tbl.inc.c"
+#include "assets/jp/objects/tol_keitai_1/cKF_ds_tol_keitai_1_keitai_off1_tbl.inc.c"
+#include "assets/jp/objects/tol_keitai_1/cKF_ba_r_tol_keitai_1_keitai_off1.inc.c"
diff --git a/src/objects/tol_keitai_1/keitai_on1.c b/src/objects/tol_keitai_1/keitai_on1.c
new file mode 100644
index 0000000..25e1f92
--- /dev/null
+++ b/src/objects/tol_keitai_1/keitai_on1.c
@@ -0,0 +1,7 @@
+#include "tol_keitai_1.h"
+
+#include "assets/jp/objects/tol_keitai_1/cKF_ckcb_r_tol_keitai_1_keitai_on1_tbl.inc.c"
+#include "assets/jp/objects/tol_keitai_1/cKF_kn_tol_keitai_1_keitai_on1_tbl.inc.c"
+#include "assets/jp/objects/tol_keitai_1/cKF_c_tol_keitai_1_keitai_on1_tbl.inc.c"
+#include "assets/jp/objects/tol_keitai_1/cKF_ds_tol_keitai_1_keitai_on1_tbl.inc.c"
+#include "assets/jp/objects/tol_keitai_1/cKF_ba_r_tol_keitai_1_keitai_on1.inc.c"
diff --git a/src/objects/tol_keitai_1/tol_keitai_1.c b/src/objects/tol_keitai_1/tol_keitai_1.c
new file mode 100644
index 0000000..e5e6637
--- /dev/null
+++ b/src/objects/tol_keitai_1/tol_keitai_1.c
@@ -0,0 +1,12 @@
+#include "tol_keitai_1.h"
+
+#include "assets/jp/objects/tol_keitai_1/tol_keitai_1_v.vtx.inc.c"
+#include "assets/jp/objects/tol_keitai_1/main1_keitai1_model.gfx.inc.c"
+#include "assets/jp/objects/tol_keitai_1/main2_keitai1_model.gfx.inc.c"
+#include "assets/jp/objects/tol_keitai_1/tol_keitai_1_pal.palette.inc.c"
+#include "assets/jp/objects/tol_keitai_1/tol_keitai_1_ueura1_tex_txt.ci4.inc.c"
+#include "assets/jp/objects/tol_keitai_1/tol_keitai_1_ueomote1_tex_txt.ci4.inc.c"
+#include "assets/jp/objects/tol_keitai_1/tol_keitai_1_shitaura1_tex_txt.ci4.inc.c"
+#include "assets/jp/objects/tol_keitai_1/tol_keitai_1_shitaomote1_tex_txt.ci4.inc.c"
+#include "assets/jp/objects/tol_keitai_1/cKF_je_r_tol_keitai_1_tbl.inc.c"
+#include "assets/jp/objects/tol_keitai_1/cKF_bs_r_tol_keitai_1.inc.c"
diff --git a/src/objects/tol_keitai_1/tol_keitai_1.h b/src/objects/tol_keitai_1/tol_keitai_1.h
new file mode 100644
index 0000000..00aa025
--- /dev/null
+++ b/src/objects/tol_keitai_1/tol_keitai_1.h
@@ -0,0 +1,37 @@
+#ifndef OBJECT_TOL_KEITAI_1_H
+#define OBJECT_TOL_KEITAI_1_H
+
+#include "gbi.h"
+#include "c_keyframe.h"
+
+/**
+ * @file tol_keitai_1
+ * 携帯 Cell Phone
+ */
+
+extern u8 cKF_ckcb_r_tol_keitai_1_keitai_off1_tbl[];
+extern s16 cKF_kn_tol_keitai_1_keitai_off1_tbl[];
+extern s16 cKF_c_tol_keitai_1_keitai_off1_tbl[];
+extern Keyframe cKF_ds_tol_keitai_1_keitai_off1_tbl[];
+extern BaseAnimationR cKF_ba_r_tol_keitai_1_keitai_off1;
+extern u8 cKF_ckcb_r_tol_keitai_1_keitai_on1_tbl[];
+extern s16 cKF_kn_tol_keitai_1_keitai_on1_tbl[];
+extern s16 cKF_c_tol_keitai_1_keitai_on1_tbl[];
+extern Keyframe cKF_ds_tol_keitai_1_keitai_on1_tbl[];
+extern BaseAnimationR cKF_ba_r_tol_keitai_1_keitai_on1;
+extern Vtx tol_keitai_1_v[];
+extern Gfx main1_keitai1_model[];
+extern Gfx main2_keitai1_model[];
+extern unsigned short tol_keitai_1_pal[];
+// 上裏 Top half back side
+extern unsigned char tol_keitai_1_ueura1_tex_txt[];
+// 上面 Top half front side
+extern unsigned char tol_keitai_1_ueomote1_tex_txt[];
+// 下裏 Bottom half back side
+extern unsigned char tol_keitai_1_shitaura1_tex_txt[];
+// 下面 Bottom half front side
+extern unsigned char tol_keitai_1_shitaomote1_tex_txt[];
+extern JointElemR cKF_je_r_tol_keitai_1_tbl[];
+extern BaseSkeletonR cKF_bs_r_tol_keitai_1;
+
+#endif
diff --git a/src/objects/tol_kenjyu_1/tol_kenjyu_1.c b/src/objects/tol_kenjyu_1/tol_kenjyu_1.c
new file mode 100644
index 0000000..a4f6a17
--- /dev/null
+++ b/src/objects/tol_kenjyu_1/tol_kenjyu_1.c
@@ -0,0 +1,6 @@
+#include "tol_kenjyu_1.h"
+
+#include "assets/jp/objects/tol_kenjyu_1/tol_kenjyu_1_v.vtx.inc.c"
+#include "assets/jp/objects/tol_kenjyu_1/tol_kenjyu_1T_model.gfx.inc.c"
+#include "assets/jp/objects/tol_kenjyu_1/tol_kenjyu_1_pal.palette.inc.c"
+#include "assets/jp/objects/tol_kenjyu_1/tol_kenjyu_1_tex.ci4.inc.c"
diff --git a/src/objects/tol_kenjyu_1/tol_kenjyu_1.h b/src/objects/tol_kenjyu_1/tol_kenjyu_1.h
new file mode 100644
index 0000000..da805f3
--- /dev/null
+++ b/src/objects/tol_kenjyu_1/tol_kenjyu_1.h
@@ -0,0 +1,16 @@
+#ifndef OBJECT_TOL_KENJYU_1_H
+#define OBJECT_TOL_KENJYU_1_H
+
+#include "gbi.h"
+
+/**
+ * @file tol_kenjyu_1
+ * 拳銃 Starting Pistol for the Sports Fair Foot Race
+ */
+
+extern Vtx tol_kenjyu_1_v[];
+extern Gfx tol_kenjyu_1T_model[];
+extern unsigned short tol_kenjyu_1_pal[];
+extern unsigned char tol_kenjyu_1_tex[];
+
+#endif
diff --git a/src/objects/tol_npcsao_1/tol_npcsao_1.c b/src/objects/tol_npcsao_1/tol_npcsao_1.c
new file mode 100644
index 0000000..b340f14
--- /dev/null
+++ b/src/objects/tol_npcsao_1/tol_npcsao_1.c
@@ -0,0 +1,7 @@
+#include "tol_npcsao_1.h"
+
+#include "assets/jp/objects/tol_npcsao_1/tol_npcsao_1_v.vtx.inc.c"
+#include "assets/jp/objects/tol_npcsao_1/tol_npcsao_1_sao_model.gfx.inc.c"
+#include "assets/jp/objects/tol_npcsao_1/tol_npcsao_1_uki_model.gfx.inc.c"
+#include "assets/jp/objects/tol_npcsao_1/tol_npcsao_1_pal.palette.inc.c"
+#include "assets/jp/objects/tol_npcsao_1/tol_npcsao_1_tex.ci4.inc.c"
diff --git a/src/objects/tol_npcsao_1/tol_npcsao_1.h b/src/objects/tol_npcsao_1/tol_npcsao_1.h
new file mode 100644
index 0000000..deb8b10
--- /dev/null
+++ b/src/objects/tol_npcsao_1/tol_npcsao_1.h
@@ -0,0 +1,18 @@
+#ifndef OBJECT_TOL_NPCSAO_1_H
+#define OBJECT_TOL_NPCSAO_1_H
+
+#include "gbi.h"
+
+/**
+ * @file tol_npcsao_1
+ * NPC竿 NPC Fishing Rod
+ */
+
+extern Vtx tol_npcsao_1_v[];
+extern Gfx tol_npcsao_1_sao_model[];
+// 浮き Fishing Bobber
+extern Gfx tol_npcsao_1_uki_model[];
+extern unsigned short tol_npcsao_1_pal[];
+extern unsigned char tol_npcsao_1_tex[];
+
+#endif
diff --git a/src/objects/tol_tamaire/ef_tamaire01.c b/src/objects/tol_tamaire/ef_tamaire01.c
new file mode 100644
index 0000000..6843a6c
--- /dev/null
+++ b/src/objects/tol_tamaire/ef_tamaire01.c
@@ -0,0 +1,7 @@
+#include "tol_tamaire.h"
+
+#include "assets/jp/objects/tol_tamaire/ef_tamaire01_r_v.vtx.inc.c"
+#include "assets/jp/objects/tol_tamaire/tama01_model.gfx.inc.c"
+#include "assets/jp/objects/tol_tamaire/ef_tamaire01_r_pal.palette.inc.c"
+#include "assets/jp/objects/tol_tamaire/tama01_r_tex.ci4.inc.c"
+#include "assets/jp/objects/tol_tamaire/tama01_w_tex.ci4.inc.c"
diff --git a/src/objects/tol_tamaire/tol_tamaire.c b/src/objects/tol_tamaire/tol_tamaire.c
new file mode 100644
index 0000000..713e17c
--- /dev/null
+++ b/src/objects/tol_tamaire/tol_tamaire.c
@@ -0,0 +1,11 @@
+#include "tol_tamaire.h"
+
+#include "assets/jp/objects/tol_tamaire/tol_tamaire_v.vtx.inc.c"
+#include "assets/jp/objects/tol_tamaire/tol_tamaire_model.gfx.inc.c"
+#include "assets/jp/objects/tol_tamaire/tol_tamaire_pal.palette.inc.c"
+#include "assets/jp/objects/tol_tamaire/tol_tamaire_r1_tex.ci4.inc.c"
+#include "assets/jp/objects/tol_tamaire/tol_tamaire_r2_tex.ci4.inc.c"
+#include "assets/jp/objects/tol_tamaire/tol_tamaire_r3_tex.ci4.inc.c"
+#include "assets/jp/objects/tol_tamaire/tol_tamaire_w1_tex.ci4.inc.c"
+#include "assets/jp/objects/tol_tamaire/tol_tamaire_w2_tex.ci4.inc.c"
+#include "assets/jp/objects/tol_tamaire/tol_tamaire_w3_tex.ci4.inc.c"
diff --git a/src/objects/tol_tamaire/tol_tamaire.h b/src/objects/tol_tamaire/tol_tamaire.h
new file mode 100644
index 0000000..f617e84
--- /dev/null
+++ b/src/objects/tol_tamaire/tol_tamaire.h
@@ -0,0 +1,26 @@
+#ifndef OBJECT_TOL_TAMAIRE_H
+#define OBJECT_TOL_TAMAIRE_H
+
+#include "gbi.h"
+
+/**
+ * @file tol_tamaire
+ * 玉入れ Balls for the Sports Fair Ball Toss
+ */
+
+extern Vtx ef_tamaire01_r_v[];
+extern Gfx tama01_model[];
+extern unsigned short ef_tamaire01_r_pal[];
+extern unsigned char tama01_r_tex[];
+extern unsigned char tama01_w_tex[];
+extern Vtx tol_tamaire_v[];
+extern Gfx tol_tamaire_model[];
+extern unsigned short tol_tamaire_pal[];
+extern unsigned char tol_tamaire_r1_tex[];
+extern unsigned char tol_tamaire_r2_tex[];
+extern unsigned char tol_tamaire_r3_tex[];
+extern unsigned char tol_tamaire_w1_tex[];
+extern unsigned char tol_tamaire_w2_tex[];
+extern unsigned char tol_tamaire_w3_tex[];
+
+#endif
diff --git a/src/objects/tol_utiwa_1/tol_utiwa_1.h b/src/objects/tol_utiwa_1/tol_utiwa_1.h
index 3116154..15e8df5 100644
--- a/src/objects/tol_utiwa_1/tol_utiwa_1.h
+++ b/src/objects/tol_utiwa_1/tol_utiwa_1.h
@@ -3,6 +3,11 @@
#include "gbi.h"
+/**
+ * @file tol_utiwa_1
+ * 団扇 Firework Festival Blue Uchiwa Fan
+ */
+
extern Vtx tol_utiwa_1_v[];
extern Gfx main_utiwa1_model[];
extern unsigned short tol_utiwa1_pal[];
diff --git a/src/overlays/actors/ovl_Tools/ac_tools.c b/src/overlays/actors/ovl_Tools/ac_tools.c
index 1bfaaf4..0a639a8 100644
--- a/src/overlays/actors/ovl_Tools/ac_tools.c
+++ b/src/overlays/actors/ovl_Tools/ac_tools.c
@@ -95,15 +95,15 @@ ToolActor* aTOL_birth_proc(ToolName toolName, s32 arg1, ToolActor* toolActor, Ga
ACTOR_T_TAMA, ACTOR_T_TAMA,
};
static s16 objectTable[] = {
- OBJECT_TOL_UMB_01, OBJECT_TOL_UMB_02, OBJECT_TOL_UMB_03, OBJECT_TOL_UMB_04, OBJECT_TOL_UMB_05,
- OBJECT_TOL_UMB_06, OBJECT_TOL_UMB_07, OBJECT_TOL_UMB_08, OBJECT_TOL_UMB_09, OBJECT_TOL_UMB_10,
- OBJECT_TOL_UMB_11, OBJECT_TOL_UMB_12, OBJECT_TOL_UMB_13, OBJECT_TOL_UMB_14, OBJECT_TOL_UMB_15,
- OBJECT_TOL_UMB_16, OBJECT_TOL_UMB_17, OBJECT_TOL_UMB_18, OBJECT_TOL_UMB_19, OBJECT_TOL_UMB_20,
- OBJECT_TOL_UMB_21, OBJECT_TOL_UMB_22, OBJECT_TOL_UMB_23, OBJECT_TOL_UMB_24, OBJECT_TOL_UMB_25,
- OBJECT_TOL_UMB_26, OBJECT_TOL_UMB_27, OBJECT_TOL_UMB_28, OBJECT_TOL_UMB_29, OBJECT_TOL_UMB_30,
- OBJECT_TOL_UMB_31, OBJECT_TOL_UMB_32, 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,
+ OBJECT_TOL_UMB_01, OBJECT_TOL_UMB_02, OBJECT_TOL_UMB_03, OBJECT_TOL_UMB_04, OBJECT_TOL_UMB_05,
+ OBJECT_TOL_UMB_06, OBJECT_TOL_UMB_07, OBJECT_TOL_UMB_08, OBJECT_TOL_UMB_09, OBJECT_TOL_UMB_10,
+ OBJECT_TOL_UMB_11, OBJECT_TOL_UMB_12, OBJECT_TOL_UMB_13, OBJECT_TOL_UMB_14, OBJECT_TOL_UMB_15,
+ OBJECT_TOL_UMB_16, OBJECT_TOL_UMB_17, OBJECT_TOL_UMB_18, OBJECT_TOL_UMB_19, OBJECT_TOL_UMB_20,
+ OBJECT_TOL_UMB_21, OBJECT_TOL_UMB_22, OBJECT_TOL_UMB_23, OBJECT_TOL_UMB_24, OBJECT_TOL_UMB_25,
+ OBJECT_TOL_UMB_26, OBJECT_TOL_UMB_27, OBJECT_TOL_UMB_28, OBJECT_TOL_UMB_29, OBJECT_TOL_UMB_30,
+ OBJECT_TOL_UMB_31, OBJECT_TOL_UMB_32, OBJECT_TOL_KEITAI_1, OBJECT_TOL_UTIWA_1, OBJECT_TOL_UTIWA_1,
+ OBJECT_TOL_CRACKER_1, OBJECT_TOL_KENJYU_1, OBJECT_TOL_HATA_01, OBJECT_TOL_KAMICUP, OBJECT_TOL_NPCSAO_1,
+ OBJECT_TOL_TAMAIRE, OBJECT_TOL_TAMAIRE, OBJECT_TOL_TAMAIRE, OBJECT_TOL_TAMAIRE,
};
s32 pad[3] UNUSED;
ToolActor* ret = NULL;
diff --git a/src/overlays/actors/ovl_Train_Window/ac_train_window.c b/src/overlays/actors/ovl_Train_Window/ac_train_window.c
index 299198f..9b89edf 100644
--- a/src/overlays/actors/ovl_Train_Window/ac_train_window.c
+++ b/src/overlays/actors/ovl_Train_Window/ac_train_window.c
@@ -35,7 +35,7 @@ extern Gfx rom_train_out_shineglass_modelT[];
extern u8 till_data[15][2];
extern u16 aTrainWindow_tree_pal_table[15][16];
-extern EvwAnimeUnk aTrainWindow_evw_anime_data;
+extern EvwAnimeData aTrainWindow_evw_anime_data;
s32 aTrainWindow_NoDraw(Actor* thisx, Game* game);
s32 aTrainWindow_DrawGoneOutTunnel(Actor* thisx, Game* game);
diff --git a/tools/splat_ext/af_gfx.py b/tools/splat_ext/af_gfx.py
new file mode 100644
index 0000000..30112db
--- /dev/null
+++ b/tools/splat_ext/af_gfx.py
@@ -0,0 +1,281 @@
+"""
+N64 f3dex display list splitter
+Dumps out Gfx[] as a .inc.c file.
+"""
+
+import re
+from typing import Optional
+
+from pathlib import Path
+
+from pygfxd import (
+ gfxd_buffer_to_string,
+ gfxd_cimg_callback,
+ gfxd_dl_callback,
+ gfxd_endian,
+ gfxd_execute,
+ gfxd_input_buffer,
+ gfxd_light_callback,
+ gfxd_lookat_callback,
+ gfxd_macro_dflt,
+ gfxd_macro_fn,
+ gfxd_mtx_callback,
+ gfxd_output_buffer,
+ gfxd_printf,
+ gfxd_puts,
+ gfxd_target,
+ gfxd_timg_callback,
+ gfxd_tlut_callback,
+ gfxd_vp_callback,
+ gfxd_vtx_callback,
+ gfxd_zimg_callback,
+ GfxdEndian,
+ gfxd_f3d,
+ gfxd_f3db,
+ gfxd_f3dex,
+ gfxd_f3dexb,
+ gfxd_f3dex2,
+)
+from ..segment import Segment
+
+from ...util import log, options
+from ...util.log import error
+
+from ..common.codesubsegment import CommonSegCodeSubsegment
+
+from ...util import symbols
+
+LIGHTS_RE = re.compile(r"\*\(Lightsn \*\)0x[0-9A-F]{8}")
+
+
+class N64SegAf_gfx(CommonSegCodeSubsegment):
+ def __init__(
+ self,
+ rom_start: Optional[int],
+ rom_end: Optional[int],
+ type: str,
+ name: str,
+ vram_start: Optional[int],
+ args: list,
+ yaml,
+ ):
+ super().__init__(
+ rom_start,
+ rom_end,
+ type,
+ name,
+ vram_start,
+ args=args,
+ yaml=yaml,
+ )
+ self.file_text = None
+ self.data_only = isinstance(yaml, dict) and yaml.get("data_only", False)
+ self.in_segment = not isinstance(yaml, dict) or yaml.get("in_segment", True)
+
+ def format_sym_name(self, sym) -> str:
+ return sym.name
+
+ def get_linker_section(self) -> str:
+ return ".data"
+
+ def out_path(self) -> Path:
+ return options.opts.asset_path / self.dir / f"{self.name}.gfx.inc.c"
+
+ def scan(self, rom_bytes: bytes):
+ self.file_text = self.disassemble_data(rom_bytes)
+
+ def get_gfxd_target(self):
+ opt = options.opts.gfx_ucode
+
+ if opt == "f3d":
+ return gfxd_f3d
+ elif opt == "f3db":
+ return gfxd_f3db
+ elif opt == "f3dex":
+ return gfxd_f3dex
+ elif opt == "f3dexb":
+ return gfxd_f3dexb
+ elif opt == "f3dex2":
+ return gfxd_f3dex2
+ else:
+ log.error(f"Unknown target {opt}")
+
+ def tlut_handler(self, addr, idx, count):
+ sym = self.get_symbol(addr=addr)
+ if sym:
+ gfxd_printf(self.format_sym_name(sym))
+ else:
+ gfxd_printf(f"0x{addr:08X}")
+ return 1
+
+ def timg_handler(self, addr, fmt, size, width, height, pal):
+ sym = self.get_symbol(addr=addr)
+ if sym:
+ gfxd_printf(self.format_sym_name(sym))
+ else:
+ gfxd_printf(f"0x{addr:08X}")
+ return 1
+
+ def cimg_handler(self, addr, fmt, size, width):
+ sym = self.get_symbol(addr=addr)
+ if sym:
+ gfxd_printf(self.format_sym_name(sym))
+ else:
+ gfxd_printf(f"0x{addr:08X}")
+ return 1
+
+ def zimg_handler(self, addr):
+ sym = self.get_symbol(addr=addr)
+ if sym:
+ gfxd_printf(self.format_sym_name(sym))
+ else:
+ gfxd_printf(f"0x{addr:08X}")
+ return 1
+
+ def dl_handler(self, addr):
+ sym = self.get_symbol(addr=addr)
+ if sym:
+ gfxd_printf(self.format_sym_name(sym))
+ else:
+ gfxd_printf(f"0x{addr:08X}")
+ return 1
+
+ def mtx_handler(self, addr):
+ sym = self.get_symbol(addr=addr)
+ if sym:
+ gfxd_printf(f"&{self.format_sym_name(sym)}")
+ else:
+ gfxd_printf(f"0x{addr:08X}")
+ return 1
+
+ def lookat_handler(self, addr, count):
+ sym = self.get_symbol(addr=addr)
+ if sym:
+ gfxd_printf(self.format_sym_name(sym))
+ else:
+ gfxd_printf(f"0x{addr:08X}")
+ return 1
+
+ def light_handler(self, addr, count):
+ sym = self.get_symbol(addr=addr)
+ if sym:
+ gfxd_printf(self.format_sym_name(sym))
+ else:
+ gfxd_printf(f"0x{addr:08X}")
+ return 1
+
+ def vtx_handler(self, addr, count):
+ # this will grab the symbol for addresses between the start address and end address of the vtx array
+ sym = self.get_symbol(
+ addr=addr,
+ in_segment=self.in_segment,
+ type="Vtx",
+ reference=True,
+ search_ranges=True,
+ )
+ if sym:
+ index = int((addr - sym.vram_start) / 0x10)
+ gfxd_printf(f"&{self.format_sym_name(sym)}[{index}]")
+ else:
+ gfxd_printf(f"0x{addr:08X}")
+ return 1
+
+ def vp_handler(self, addr):
+ sym = self.get_symbol(addr=addr)
+ if sym:
+ gfxd_printf(f"&{self.format_sym_name(sym)}")
+ else:
+ gfxd_printf(f"0x{addr:08X}")
+ return 1
+
+ def macro_fn(self):
+ gfxd_puts(" ")
+ gfxd_macro_dflt()
+ gfxd_puts(",\n")
+ return 0
+
+ def disassemble_data(self, rom_bytes):
+ assert isinstance(self.rom_start, int)
+ assert isinstance(self.rom_end, int)
+ assert isinstance(self.vram_start, int)
+
+ gfx_data = rom_bytes[self.rom_start : self.rom_end]
+ segment_length = len(gfx_data)
+ if (segment_length) % 8 != 0:
+ error(
+ f"Error: gfx segment {self.name} length ({segment_length}) is not a multiple of 8!"
+ )
+
+ out_str = "" if self.data_only else options.opts.generated_c_preamble + "\n\n"
+
+ sym = self.create_symbol(
+ addr=self.vram_start, in_segment=True, type="data", define=True
+ )
+
+ gfxd_input_buffer(gfx_data)
+
+ # TODO terrible guess at the size we'll need - improve this
+ outb = bytes([0] * segment_length * 100)
+ outbuf = gfxd_output_buffer(outb, len(outb))
+
+ gfxd_target(self.get_gfxd_target())
+ gfxd_endian(
+ GfxdEndian.big if options.opts.endianness == "big" else GfxdEndian.little, 4
+ )
+
+ # Callbacks
+ gfxd_macro_fn(self.macro_fn)
+
+ gfxd_tlut_callback(self.tlut_handler)
+ gfxd_timg_callback(self.timg_handler)
+ gfxd_cimg_callback(self.cimg_handler)
+ gfxd_zimg_callback(self.zimg_handler)
+ gfxd_dl_callback(self.dl_handler)
+ gfxd_mtx_callback(self.mtx_handler)
+ gfxd_lookat_callback(self.lookat_handler)
+ gfxd_light_callback(self.light_handler)
+ # gfxd_seg_callback ?
+ gfxd_vtx_callback(self.vtx_handler)
+ gfxd_vp_callback(self.vp_handler)
+ # gfxd_uctext_callback ?
+ # gfxd_ucdata_callback ?
+ # gfxd_dram_callback ?
+
+ gfxd_execute()
+
+ if self.data_only:
+ out_str += gfxd_buffer_to_string(outbuf)
+ else:
+ out_str += "Gfx " + self.format_sym_name(sym) + "[] = {\n"
+ out_str += gfxd_buffer_to_string(outbuf)
+ out_str += "};\n"
+
+ # Poor man's light fix until we get my libgfxd PR merged
+ def light_sub_func(match):
+ light = match.group(0)
+ addr = int(light[12:], 0)
+ sym = self.create_symbol(
+ addr=addr, in_segment=self.in_segment, type="data", reference=True
+ )
+ return self.format_sym_name(sym)
+
+ out_str = re.sub(LIGHTS_RE, light_sub_func, out_str)
+
+ return out_str
+
+ def split(self, rom_bytes: bytes):
+ if self.file_text and self.out_path():
+ self.out_path().parent.mkdir(parents=True, exist_ok=True)
+
+ with open(self.out_path(), "w", newline="\n") as f:
+ f.write(self.file_text)
+
+ def should_scan(self) -> bool:
+ return (
+ options.opts.is_mode_active("gfx")
+ and self.rom_start is not None
+ and self.rom_end is not None
+ )
+
+ def should_split(self) -> bool:
+ return self.extract and options.opts.is_mode_active("gfx")
diff --git a/tools/splat_ext/af_ia8.py b/tools/splat_ext/af_ia8.py
new file mode 100644
index 0000000..ce5ffe5
--- /dev/null
+++ b/tools/splat_ext/af_ia8.py
@@ -0,0 +1,22 @@
+from n64img.image import Image, IA8
+from splat.util import log, options
+from splat.segtypes.n64.segment import N64Segment
+
+class N64SegAf_ia8(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 = IA8(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}.ia8.png"
+ path.parent.mkdir(parents=True, exist_ok=True)
+
+ self.n64img.write(path)
diff --git a/tools/splat_ext/ckf_c.py b/tools/splat_ext/ckf_c.py
index 379a000..32ac409 100644
--- a/tools/splat_ext/ckf_c.py
+++ b/tools/splat_ext/ckf_c.py
@@ -24,8 +24,8 @@ class N64SegCkf_c(CommonSegCodeSubsegment):
lines.append("")
lines.append(f"s16 {symbol.name}[{count}] = {{")
- for byte in struct.iter_unpack(">h", data):
- lines.append(f" {byte[0]},")
+ for short in struct.iter_unpack(">h", data):
+ lines.append(f" {short[0]},")
if not self.data_only:
lines.append("};")
diff --git a/tools/splat_ext/ckf_kn.py b/tools/splat_ext/ckf_kn.py
index 4efa957..ecbf207 100644
--- a/tools/splat_ext/ckf_kn.py
+++ b/tools/splat_ext/ckf_kn.py
@@ -26,8 +26,8 @@ class N64SegCkf_kn(CommonSegCodeSubsegment):
lines.append("")
lines.append(f"s16 {symbol.name}[{count}] = {{")
- for byte in struct.iter_unpack(">h", data):
- lines.append(f" {byte[0]},")
+ for short in struct.iter_unpack(">h", data):
+ lines.append(f" {short[0]},")
if not self.data_only:
lines.append("};")
diff --git a/tools/splat_ext/evw_animeptn.py b/tools/splat_ext/evw_animeptn.py
new file mode 100644
index 0000000..e9e0727
--- /dev/null
+++ b/tools/splat_ext/evw_animeptn.py
@@ -0,0 +1,38 @@
+import struct
+from typing import Optional
+from splat.util import options, log
+from splat.segtypes.common.codesubsegment import CommonSegCodeSubsegment
+
+class N64SegEvw_animeptn(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 not self.data_only:
+ lines.append(options.opts.generated_c_preamble)
+ lines.append("")
+ lines.append(f"u8 {symbol.name}[{len(data)}] = {{")
+
+ for byte in struct.iter_unpack(">B", 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/evw_colenv.py b/tools/splat_ext/evw_colenv.py
new file mode 100644
index 0000000..3d0c345
--- /dev/null
+++ b/tools/splat_ext/evw_colenv.py
@@ -0,0 +1,43 @@
+import struct
+from typing import Optional
+from splat.util import options, log
+from splat.segtypes.common.codesubsegment import CommonSegCodeSubsegment
+
+class N64SegEvw_colenv(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) // 4
+ lines = []
+
+ if (len(data)) % 4 != 0:
+ log.error(f"Error: evw_colenv segment {self.name} length ({len(data)}) is not a multiple of 4!")
+
+ if not self.data_only:
+ lines.append(options.opts.generated_c_preamble)
+ lines.append("")
+ lines.append(f"EvwAnimeColEnv {symbol.name}[{count}] = {{")
+
+ for EvwAnimeColEnv in struct.iter_unpack(">bbbb", data):
+ r, g, b, a = EvwAnimeColEnv
+ lines.append(f" {{ {r}, {g}, {b}, {a} }},")
+
+ 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/evw_colprim.py b/tools/splat_ext/evw_colprim.py
new file mode 100644
index 0000000..a8c2112
--- /dev/null
+++ b/tools/splat_ext/evw_colprim.py
@@ -0,0 +1,43 @@
+import struct
+from typing import Optional
+from splat.util import options, log
+from splat.segtypes.common.codesubsegment import CommonSegCodeSubsegment
+
+class N64SegEvw_colprim(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) // 5
+ lines = []
+
+ if (len(data)) % 5 != 0:
+ log.error(f"Error: evw_colprim segment {self.name} length ({len(data)}) is not a multiple of 5!")
+
+ if not self.data_only:
+ lines.append(options.opts.generated_c_preamble)
+ lines.append("")
+ lines.append(f"EvwAnimeColPrim {symbol.name}[{count}] = {{")
+
+ for EvwAnimeColPrim in struct.iter_unpack(">bbbbb", data):
+ r, g, b, a, l = EvwAnimeColPrim
+ lines.append(f" {{ {r}, {g}, {b}, {a}, {l} }},")
+
+ 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/evw_colreg.py b/tools/splat_ext/evw_colreg.py
new file mode 100644
index 0000000..2352bc6
--- /dev/null
+++ b/tools/splat_ext/evw_colreg.py
@@ -0,0 +1,57 @@
+import struct
+from typing import Optional
+from splat.util import options, log
+from splat.segtypes.common.codesubsegment import CommonSegCodeSubsegment
+
+class N64SegEvw_colreg(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)) != 16:
+ log.error(f"Error: evw_colreg segment {self.name} length ({len(data)}) is not 16 bytes!")
+
+ if not self.data_only:
+ lines.append(options.opts.generated_c_preamble)
+ lines.append("\n")
+ lines.append(f"EvwAnimeColReg {symbol.name} = ")
+
+ frameCount, keyframeCount, prim, env, keyframes = struct.unpack(">HHIII", data)
+
+ if prim:
+ prim_symbol = self.get_symbol(addr=prim).name
+ else:
+ prim_symbol = "NULL"
+
+ if env:
+ env_symbol = self.get_symbol(addr=env).name
+ else:
+ env_symbol = "NULL"
+
+ if keyframes:
+ keyframes_symbol = self.get_symbol(addr=keyframes).name
+ else:
+ keyframes_symbol = "NULL"
+
+ lines.append(f"{{ {frameCount}, {keyframeCount}, {prim_symbol}, {env_symbol}, {keyframes_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/evw_data.py b/tools/splat_ext/evw_data.py
new file mode 100644
index 0000000..f8f7642
--- /dev/null
+++ b/tools/splat_ext/evw_data.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 N64SegEvw_data(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) // 8
+ lines = []
+
+ if (len(data)) % 8 != 0:
+ log.error(f"Error: evw_data segment {self.name} length ({len(data)}) is not a multiple of 8!")
+
+ if not self.data_only:
+ lines.append(options.opts.generated_c_preamble)
+ lines.append("")
+ lines.append(f"EvwAnimeData {symbol.name}[{count}] = {{")
+
+ for evwAnimeData in struct.iter_unpack(">bxhI", data):
+ segment, type, dataPtr = evwAnimeData
+
+ if dataPtr:
+ data_ptr_symbol = self.get_symbol(addr=dataPtr).name
+ else:
+ data_ptr_symbol = "NULL"
+
+ lines.append(f" {{ {segment}, {type}, &{data_ptr_symbol} }},")
+
+ 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/evw_scroll.py b/tools/splat_ext/evw_scroll.py
new file mode 100644
index 0000000..a92bc27
--- /dev/null
+++ b/tools/splat_ext/evw_scroll.py
@@ -0,0 +1,43 @@
+import struct
+from typing import Optional
+from splat.util import options, log
+from splat.segtypes.common.codesubsegment import CommonSegCodeSubsegment
+
+class N64SegEvw_scroll(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) // 4
+ lines = []
+
+ if (len(data)) % 4 != 0:
+ log.error(f"Error: evw_scroll segment {self.name} length ({len(data)}) is not a multiple of 4!")
+
+ if not self.data_only:
+ lines.append(options.opts.generated_c_preamble)
+ lines.append("")
+ lines.append(f"EvwAnimeScroll {symbol.name}[{count}] = {{")
+
+ for EvwAnimeScroll in struct.iter_unpack(">bbBB", data):
+ x, y, width, height = EvwAnimeScroll
+ lines.append(f" {{ {x}, {y}, {width}, {height} }},")
+
+ 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/evw_texanime.py b/tools/splat_ext/evw_texanime.py
new file mode 100644
index 0000000..8782475
--- /dev/null
+++ b/tools/splat_ext/evw_texanime.py
@@ -0,0 +1,57 @@
+import struct
+from typing import Optional
+from splat.util import options, log
+from splat.segtypes.common.codesubsegment import CommonSegCodeSubsegment
+
+class N64SegEvw_texanime(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)) != 16:
+ log.error(f"Error: evw_texanime segment {self.name} length ({len(data)}) is not 16 bytes!")
+
+ if not self.data_only:
+ lines.append(options.opts.generated_c_preamble)
+ lines.append("\n")
+ lines.append(f"EvwAnimeTexAnime {symbol.name} = ")
+
+ frameCount, keyframeCount, textureTable, animationPattern, keyframes = struct.unpack(">HHIII", data)
+
+ if textureTable:
+ texture_table_symbol = self.get_symbol(addr=textureTable).name
+ else:
+ texture_table_symbol = "NULL"
+
+ if animationPattern:
+ animation_pattern_symbol = self.get_symbol(addr=animationPattern).name
+ else:
+ animation_pattern_symbol = "NULL"
+
+ if keyframes:
+ keyframes_symbol = self.get_symbol(addr=keyframes).name
+ else:
+ keyframes_symbol = "NULL"
+
+ lines.append(f"{{ {frameCount}, {keyframeCount}, &{texture_table_symbol}, {animation_pattern_symbol}, {keyframes_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/evw_textable.py b/tools/splat_ext/evw_textable.py
new file mode 100644
index 0000000..4ceb0d0
--- /dev/null
+++ b/tools/splat_ext/evw_textable.py
@@ -0,0 +1,47 @@
+import struct
+from typing import Optional
+from splat.util import options, log
+from splat.segtypes.common.codesubsegment import CommonSegCodeSubsegment
+
+class N64SegEvw_textable(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)) != 4:
+ log.error(f"Error: evw_textable segment {self.name} length ({len(data)}) is not 4 bytes!")
+
+ if not self.data_only:
+ lines.append(options.opts.generated_c_preamble)
+ lines.append("\n")
+ lines.append(f"void* {symbol.name} = ")
+
+ textureTable = struct.unpack(">I", data)
+
+ if textureTable:
+ texture_table_symbol = self.get_symbol(addr=textureTable[0]).name
+ else:
+ texture_table_symbol = "NULL"
+
+ lines.append(f"{texture_table_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/yamls/jp/assets.yaml b/yamls/jp/assets.yaml
index bdc2fe9..b993e7e 100644
--- a/yamls/jp/assets.yaml
+++ b/yamls/jp/assets.yaml
@@ -612,11 +612,11 @@
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]
+ - [0xD5E428, af_gfx, obj_s_yamishop/obj_s_yamishop_window_model]
+ - [0xD5E4B8, af_gfx, obj_s_yamishop/obj_s_yamishop_t1_model]
+ - [0xD5E5D0, af_gfx, obj_s_yamishop/obj_s_yamishop_light_model]
+ - [0xD5E690, af_gfx, obj_s_yamishop/obj_s_yamishop_door1_model]
+ - [0xD5E7D8, af_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]
@@ -630,11 +630,11 @@
- [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]
+ - [0xD5FE48, af_gfx, obj_w_yamishop/obj_w_yamishop_window_model]
+ - [0xD5FED8, af_gfx, obj_w_yamishop/obj_w_yamishop_t1_model]
+ - [0xD5FFF0, af_gfx, obj_w_yamishop/obj_w_yamishop_light_model]
+ - [0xD600B0, af_gfx, obj_w_yamishop/obj_w_yamishop_door1_model]
+ - [0xD601F8, af_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]
@@ -649,12 +649,12 @@
- [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]
+ - [0xDDBBD8, af_gfx, obj_s_toudai/obj_s_toudai_mirror_model]
+ - [0xDDBCA0, af_gfx, obj_s_toudai/obj_s_toudai_glass_model]
+ - [0xDDBD70, af_gfx, obj_s_toudai/obj_s_toudai_body_model]
+ - [0xDDC188, af_gfx, obj_s_toudai/obj_s_toudai_light_model]
+ - [0xDDC258, af_gfx, obj_s_toudai/obj_s_toudai_lenz_model]
+ - [0xDDC320, af_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]
@@ -674,12 +674,12 @@
- [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]
+ - [0xDDD7E0, af_gfx, obj_w_toudai/obj_w_toudai_mirror_model]
+ - [0xDDD8A8, af_gfx, obj_w_toudai/obj_w_toudai_glass_model]
+ - [0xDDD978, af_gfx, obj_w_toudai/obj_w_toudai_body_model]
+ - [0xDDDD90, af_gfx, obj_w_toudai/obj_w_toudai_light_model]
+ - [0xDDDE60, af_gfx, obj_w_toudai/obj_w_toudai_lenz_model]
+ - [0xDDDF28, af_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]
@@ -700,10 +700,10 @@
- [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]
+ - [0xDECD98, af_gfx, obj_s_windmill/obj_s_windmill_unk_model_1]
+ - [0xDECE60, af_gfx, obj_s_windmill/obj_s_windmill_unk_model_2]
+ - [0xDECF10, af_gfx, obj_s_windmill/obj_s_windmill_unk_model_3]
+ - [0xDECFE8, af_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]
@@ -714,10 +714,10 @@
- [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]
+ - [0xDEEEC0, af_gfx, obj_w_windmill/obj_w_windmill_unk_model_1]
+ - [0xDEEF88, af_gfx, obj_w_windmill/obj_w_windmill_unk_model_2]
+ - [0xDEF038, af_gfx, obj_w_windmill/obj_w_windmill_unk_model_3]
+ - [0xDEF110, af_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]
@@ -4271,8 +4271,8 @@
name: tol_umb_01
subsegments:
- [0x1107000, vtx, tol_umb_01_v]
- - [0x1107380, gfx, kasa_umb01_model]
- - [0x1107448, gfx, e_umb01_model]
+ - [0x1107380, af_gfx, kasa_umb01_model]
+ - [0x1107448, af_gfx, e_umb01_model]
- [0x1107508, af_palette, tol_umb_01_pal]
- [0x1107528, af_ci4, tol_umb_01_kasa_tex_txt, 32, 32, 0x1107508, 0x20]
- [0x1107728, af_ci4, tol_umb_01_tuka_tex_txt, 32, 32, 0x1107508, 0x20]
@@ -4294,8 +4294,8 @@
name: tol_umb_02
subsegments:
- [0x1108000, vtx, tol_umb_02_v]
- - [0x11083E0, gfx, kasa_umb02_model]
- - [0x1108508, gfx, e_umb02_model]
+ - [0x11083E0, af_gfx, kasa_umb02_model]
+ - [0x1108508, af_gfx, e_umb02_model]
- [0x11085C8, af_palette, tol_umb02_pal]
- [0x11085E8, af_ci4, tol_umb02_kasa2_tex_txt, 16, 64, 0x11085C8, 0x20]
- [0x11087E8, af_ci4, tol_umb02_kasa1_tex_txt, 16, 64, 0x11085C8, 0x20]
@@ -4318,8 +4318,8 @@
name: tol_umb_03
subsegments:
- [0x1109000, vtx, tol_umb_03_v]
- - [0x1109380, gfx, kasa_umb03_model]
- - [0x1109450, gfx, e_umb03_model]
+ - [0x1109380, af_gfx, kasa_umb03_model]
+ - [0x1109450, af_gfx, e_umb03_model]
- [0x1109510, af_palette, tol_umb_03_pal]
- [0x1109530, af_ci4, tol_umb_03_kasa1_tex_txt, 32, 64, 0x1109510, 0x20]
- [0x1109930, af_ci4, tol_umb_03_tuka_tex_txt, 32, 32, 0x1109510, 0x20]
@@ -4341,8 +4341,8 @@
name: tol_umb_04
subsegments:
- [0x110A000, vtx, tol_umb_04_v]
- - [0x110A380, gfx, kasa_umb04_model]
- - [0x110A4C0, gfx, e_umb04_model]
+ - [0x110A380, af_gfx, kasa_umb04_model]
+ - [0x110A4C0, af_gfx, e_umb04_model]
- [0x110A580, af_palette, tol_umb_04_pal]
- [0x110A5A0, af_ci4, tol_umb_04_kasa1_tex_txt, 16, 32, 0x110A580, 0x20]
- [0x110A6A0, af_ci4, tol_umb_04_kasa2_tex_txt, 16, 32, 0x110A580, 0x20]
@@ -4365,8 +4365,8 @@
name: tol_umb_05
subsegments:
- [0x110B000, vtx, tol_umb_05_v]
- - [0x110B380, gfx, kasa_umb05_model]
- - [0x110B448, gfx, e_umb05_model]
+ - [0x110B380, af_gfx, kasa_umb05_model]
+ - [0x110B448, af_gfx, e_umb05_model]
- [0x110B508, af_palette, tol_umb_05_pal]
- [0x110B528, af_ci4, tol_umb_05_kasa_tex_txt, 32, 32, 0x110B508, 0x20]
- [0x110B728, af_ci4, tol_umb_05_tuka_tex_txt, 32, 32, 0x110B508, 0x20]
@@ -4388,8 +4388,8 @@
name: tol_umb_06
subsegments:
- [0x110C000, vtx, tol_umb_06_v]
- - [0x110C5E0, gfx, kasa_umb06_model]
- - [0x110C6D0, gfx, e_umb06_model]
+ - [0x110C5E0, af_gfx, kasa_umb06_model]
+ - [0x110C6D0, af_gfx, e_umb06_model]
- [0x110C790, af_palette, tol_umb_06_pal]
- [0x110C7B0, af_ci4, tol_umb_06_kasa1_tex_txt, 32, 32, 0x110C790, 0x20]
- [0x110C9B0, af_ci4, tol_umb_06_tuka_tex_txt, 32, 32, 0x110C790, 0x20]
@@ -4411,8 +4411,8 @@
name: tol_umb_07
subsegments:
- [0x110D000, vtx, tol_umb_07_v]
- - [0x110D260, gfx, kasa_umb07_model]
- - [0x110D380, gfx, e_umb07_model]
+ - [0x110D260, af_gfx, kasa_umb07_model]
+ - [0x110D380, af_gfx, e_umb07_model]
- [0x110D440, af_palette, tol_umb07_pal]
- [0x110D460, af_ci4, tol_umb07_kasa2_tex_txt, 16, 32, 0x110D440, 0x20]
- [0x110D560, af_ci4, tol_umb07_kasa1_tex_txt, 32, 64, 0x110D440, 0x20]
@@ -4435,8 +4435,8 @@
name: tol_umb_08
subsegments:
- [0x110E000, vtx, tol_umb_08_v]
- - [0x110E390, gfx, kasa_umb08_model]
- - [0x110E458, gfx, e_umb08_model]
+ - [0x110E390, af_gfx, kasa_umb08_model]
+ - [0x110E458, af_gfx, e_umb08_model]
- [0x110E570, af_palette, tol_umb08_pal]
- [0x110E590, af_ci4, tol_umb08_kasa1_tex_txt, 32, 32, 0x110E570, 0x20]
- [0x110E790, af_ci4, tol_umb08_kasa2_tex_txt, 8, 16, 0x110E570, 0x20]
@@ -4460,8 +4460,8 @@
name: tol_umb_09
subsegments:
- [0x110F000, vtx, tol_umb_09_v]
- - [0x110F390, gfx, kasa_umb09_model]
- - [0x110F458, gfx, e_umb09_model]
+ - [0x110F390, af_gfx, kasa_umb09_model]
+ - [0x110F458, af_gfx, e_umb09_model]
- [0x110F570, af_palette, tol_umb09_pal]
- [0x110F590, af_ci4, tol_umb09_kasa1_tex_txt, 32, 32, 0x110F570, 0x20]
- [0x110F790, af_ci4, tol_umb09_kasa2_tex_txt, 8, 16, 0x110F570, 0x20]
@@ -4484,8 +4484,8 @@
name: tol_umb_10
subsegments:
- [0x1110000, vtx, tol_umb_10_v]
- - [0x1110390, gfx, kasa_umb10_model]
- - [0x1110458, gfx, e_umb10_model]
+ - [0x1110390, af_gfx, kasa_umb10_model]
+ - [0x1110458, af_gfx, e_umb10_model]
- [0x1110570, af_palette, tol_umb10_pal]
- [0x1110590, af_ci4, tol_umb10_kasa1_tex_txt, 16, 64, 0x1110570, 0x20]
- [0x1110790, af_ci4, tol_umb10_kasa2_tex_txt, 8, 16, 0x1110570, 0x20]
@@ -4508,8 +4508,8 @@
name: tol_umb_11
subsegments:
- [0x1111000, vtx, tol_umb_11_v]
- - [0x1111390, gfx, kasa_umb11_model]
- - [0x1111458, gfx, e_umb11_model]
+ - [0x1111390, af_gfx, kasa_umb11_model]
+ - [0x1111458, af_gfx, e_umb11_model]
- [0x1111570, af_palette, tol_umb11_pal]
- [0x1111590, af_ci4, tol_umb11_kasa1_tex_txt, 16, 64, 0x1111570, 0x20]
- [0x1111790, af_ci4, tol_umb11_kasa2_tex_txt, 8, 16, 0x1111570, 0x20]
@@ -4532,8 +4532,8 @@
name: tol_umb_12
subsegments:
- [0x1112000, vtx, tol_umb_12_v]
- - [0x1112390, gfx, kasa_umb12_model]
- - [0x1112458, gfx, e_umb12_model]
+ - [0x1112390, af_gfx, kasa_umb12_model]
+ - [0x1112458, af_gfx, e_umb12_model]
- [0x1112570, af_palette, tol_umb12_pal]
- [0x1112590, af_ci4, tol_umb12_kasa1_tex_txt, 32, 64, 0x1112570, 0x20]
- [0x1112990, af_ci4, tol_umb12_kasa2_tex_txt, 8, 16, 0x1112570, 0x20]
@@ -4556,8 +4556,8 @@
name: tol_umb_13
subsegments:
- [0x1113000, vtx, tol_umb_13_v]
- - [0x1113390, gfx, kasa_umb13_model]
- - [0x1113458, gfx, e_umb13_model]
+ - [0x1113390, af_gfx, kasa_umb13_model]
+ - [0x1113458, af_gfx, e_umb13_model]
- [0x1113570, af_palette, tol_umb13_pal]
- [0x1113590, af_ci4, tol_umb13_kasa1_tex_txt, 32, 32, 0x1113570, 0x20]
- [0x1113790, af_ci4, tol_umb13_kasa2_tex_txt, 8, 16, 0x1113570, 0x20]
@@ -4580,8 +4580,8 @@
name: tol_umb_14
subsegments:
- [0x1114000, vtx, tol_umb_14_v]
- - [0x1114380, gfx, kasa_umb14_model]
- - [0x1114448, gfx, e_umb14_model]
+ - [0x1114380, af_gfx, kasa_umb14_model]
+ - [0x1114448, af_gfx, e_umb14_model]
- [0x1114508, af_palette, tol_umb_14_pal]
- [0x1114528, af_ci4, tol_umb_14_kasa_tex_txt, 32, 32, 0x1114508, 0x20]
- [0x1114728, af_ci4, tol_umb_14_tuka_tex_txt, 32, 32, 0x1114508, 0x20]
@@ -4603,8 +4603,8 @@
name: tol_umb_15
subsegments:
- [0x1115000, vtx, tol_umb_15_v]
- - [0x11153C0, gfx, kasa_umb15_model]
- - [0x11154D8, gfx, e_umb15_model]
+ - [0x11153C0, af_gfx, kasa_umb15_model]
+ - [0x11154D8, af_gfx, e_umb15_model]
- [0x1115598, af_palette, tol_umb_15_pal]
- [0x11155B8, af_ci4, tol_umb_15_kasa1_tex_txt, 16, 32, 0x1115598, 0x20]
- [0x11156B8, af_ci4, tol_umb_15_kasa2_tex_txt, 32, 32, 0x1115598, 0x20]
@@ -4627,8 +4627,8 @@
name: tol_umb_16
subsegments:
- [0x1116000, vtx, tol_umb_16_v]
- - [0x1116380, gfx, kasa_umb16_model]
- - [0x1116448, gfx, e_umb16_model]
+ - [0x1116380, af_gfx, kasa_umb16_model]
+ - [0x1116448, af_gfx, e_umb16_model]
- [0x1116508, af_palette, tol_umb_16_pal]
- [0x1116528, af_ci4, tol_umb_16_kasa1_tex_txt, 32, 32, 0x1116508, 0x20]
- [0x1116728, af_ci4, tol_umb_16_tuka_tex_txt, 32, 32, 0x1116508, 0x20]
@@ -4650,8 +4650,8 @@
name: tol_umb_17
subsegments:
- [0x1117000, vtx, tol_umb_17_v]
- - [0x11174D0, gfx, kasa_umb17_model]
- - [0x11175D8, gfx, e_umb17_model]
+ - [0x11174D0, af_gfx, kasa_umb17_model]
+ - [0x11175D8, af_gfx, e_umb17_model]
- [0x1117680, af_palette, tol_umb_17_pal]
- [0x11176A0, af_ci4, tol_umb_17_kasa_tex_txt, 32, 32, 0x1117680, 0x20]
- [0x11178A0, af_ci4, tol_umb_17_tuka_tex_txt, 32, 32, 0x1117680, 0x20]
@@ -4673,8 +4673,8 @@
name: tol_umb_18
subsegments:
- [0x1118000, vtx, tol_umb_18_v]
- - [0x1118280, gfx, kasa_umb18_model]
- - [0x1118348, gfx, e_umb18_model]
+ - [0x1118280, af_gfx, kasa_umb18_model]
+ - [0x1118348, af_gfx, e_umb18_model]
- [0x1118460, af_palette, tol_umb18_pal]
- [0x1118480, af_ci4, tol_umb18_kasa1_tex_txt, 16, 32, 0x1118460, 0x20]
- [0x1118580, af_ci4, tol_umb18_kasa2_tex_txt, 16, 16, 0x1118460, 0x20]
@@ -4697,8 +4697,8 @@
name: tol_umb_19
subsegments:
- [0x1119000, vtx, tol_umb_19_v]
- - [0x1119400, gfx, kasa_umb19_model]
- - [0x11194E0, gfx, e_umb19_model]
+ - [0x1119400, af_gfx, kasa_umb19_model]
+ - [0x11194E0, af_gfx, e_umb19_model]
- [0x1119610, af_palette, tol_umb_19_pal]
- [0x1119630, af_ci4, tol_umb_19_kasa_tex_txt, 32, 32, 0x1119610, 0x20]
- [0x1119830, af_ci4, tol_umb_19_tuka_tex_txt, 32, 32, 0x1119610, 0x20]
@@ -4721,8 +4721,8 @@
name: tol_umb_20
subsegments:
- [0x111A000, vtx, tol_umb_20_v]
- - [0x111A280, gfx, kasa_umb20_model]
- - [0x111A338, gfx, e_umb20_model]
+ - [0x111A280, af_gfx, kasa_umb20_model]
+ - [0x111A338, af_gfx, e_umb20_model]
- [0x111A408, af_palette, tol_umb_20_pal]
- [0x111A428, af_ci4, tol_umb_20_kasa_tex_txt, 32, 64, 0x111A408, 0x20]
- [0x111A828, af_ci4, tol_umb_20_e_tex_txt, 16, 16, 0x111A408, 0x20]
@@ -4744,8 +4744,8 @@
name: tol_umb_21
subsegments:
- [0x111B000, vtx, tol_umb_21_v]
- - [0x111B380, gfx, kasa_umb21_model]
- - [0x111B468, gfx, e_umb21_model]
+ - [0x111B380, af_gfx, kasa_umb21_model]
+ - [0x111B468, af_gfx, e_umb21_model]
- [0x111B520, af_palette, tol_umb_21_pal]
- [0x111B540, af_ci4, tol_umb_21_kasa_tex_txt, 64, 32, 0x111B520, 0x20]
- [0x111B940, af_ci4, tol_umb_21_tuka_tex_txt, 32, 32, 0x111B520, 0x20]
@@ -4767,8 +4767,8 @@
name: tol_umb_22
subsegments:
- [0x111C000, vtx, tol_umb_22_v]
- - [0x111C480, gfx, kasa_umb22_model]
- - [0x111C580, gfx, e_umb22_model]
+ - [0x111C480, af_gfx, kasa_umb22_model]
+ - [0x111C580, af_gfx, e_umb22_model]
- [0x111C620, af_palette, tol_umb_22_pal]
- [0x111C640, af_ci4, tol_umb_22_kasa_tex_txt, 32, 32, 0x111C620, 0x20]
- [0x111C840, af_ci4, tol_umb_22_e_tex_txt, 16, 32, 0x111C620, 0x20]
@@ -4790,8 +4790,8 @@
name: tol_umb_23
subsegments:
- [0x111D000, vtx, tol_umb_23_v]
- - [0x111D360, gfx, kasa_umb23_model]
- - [0x111D428, gfx, e_umb23_model]
+ - [0x111D360, af_gfx, kasa_umb23_model]
+ - [0x111D428, af_gfx, e_umb23_model]
- [0x111D528, af_palette, tol_umb_23_pal]
- [0x111D548, af_ci4, tol_umb_23_kasa_tex_txt, 32, 64, 0x111D528, 0x20]
- [0x111D948, af_ci4, tol_umb_23_tuka_tex_txt, 32, 32, 0x111D528, 0x20]
@@ -4814,8 +4814,8 @@
name: tol_umb_24
subsegments:
- [0x111E000, vtx, tol_umb_24_v]
- - [0x111E3C0, gfx, kasa_umb24_model]
- - [0x111E4D8, gfx, e_umb24_model]
+ - [0x111E3C0, af_gfx, kasa_umb24_model]
+ - [0x111E4D8, af_gfx, e_umb24_model]
- [0x111E598, af_palette, tol_umb_24_pal]
- [0x111E5B8, af_ci4, tol_umb_24_kasa1_tex_txt, 16, 32, 0x111E598, 0x20]
- [0x111E6B8, af_ci4, tol_umb_24_kasa2_tex_txt, 16, 32, 0x111E598, 0x20]
@@ -4838,8 +4838,8 @@
name: tol_umb_25
subsegments:
- [0x111F000, vtx, tol_umb_25_v]
- - [0x111F350, gfx, kasa_umb25_model]
- - [0x111F470, gfx, e_umb25_model]
+ - [0x111F350, af_gfx, kasa_umb25_model]
+ - [0x111F470, af_gfx, e_umb25_model]
- [0x111F510, af_palette, tol_umb_25_pal]
- [0x111F530, af_ci4, tol_umb_25_kasa_tex_txt, 32, 32, 0x111F510, 0x20]
- [0x111F730, af_ci4, tol_umb_25_ya_tex_txt, 16, 64, 0x111F510, 0x20]
@@ -4861,8 +4861,8 @@
name: tol_umb_26
subsegments:
- [0x1120000, vtx, tol_umb_26_v]
- - [0x11203C0, gfx, kasa_umb26_model]
- - [0x11204D0, gfx, e_umb26_model]
+ - [0x11203C0, af_gfx, kasa_umb26_model]
+ - [0x11204D0, af_gfx, e_umb26_model]
- [0x1120590, af_palette, tol_umb_26_pal]
- [0x11205B0, af_ci4, tol_umb_26_kasa1_tex_txt, 16, 32, 0x1120590, 0x20]
- [0x11206B0, af_ci4, tol_umb_26_kasa2_tex_txt, 16, 32, 0x1120590, 0x20]
@@ -4885,8 +4885,8 @@
name: tol_umb_27
subsegments:
- [0x1121000, vtx, tol_umb_27_v]
- - [0x11214B0, gfx, kasa_umb27_model]
- - [0x11215F8, gfx, e_umb27_model]
+ - [0x11214B0, af_gfx, kasa_umb27_model]
+ - [0x11215F8, af_gfx, e_umb27_model]
- [0x1121698, af_palette, tol_umb_27_pal]
- [0x11216B8, af_ci4, tol_umb_27_kasa1_tex_txt, 32, 32, 0x1121698, 0x20]
- [0x11218B8, af_ci4, tol_umb_27_kasa2_tex_txt, 32, 32, 0x1121698, 0x20]
@@ -4909,8 +4909,8 @@
name: tol_umb_28
subsegments:
- [0x1122000, vtx, tol_umb_28_v]
- - [0x1122360, gfx, kasa_umb28_model]
- - [0x1122428, gfx, e_umb28_model]
+ - [0x1122360, af_gfx, kasa_umb28_model]
+ - [0x1122428, af_gfx, e_umb28_model]
- [0x11224E0, af_palette, tol_umb_28_pal]
- [0x1122500, af_ci4, tol_umb_28_kasa_tex_txt, 32, 32, 0x11224E0, 0x20]
- [0x1122700, af_ci4, tol_umb_28_tuka_tex_txt, 32, 32, 0x11224E0, 0x20]
@@ -4932,8 +4932,8 @@
name: tol_umb_29
subsegments:
- [0x1123000, vtx, tol_umb_29_v]
- - [0x1123380, gfx, kasa_umb29_model]
- - [0x1123448, gfx, e_umb29_model]
+ - [0x1123380, af_gfx, kasa_umb29_model]
+ - [0x1123448, af_gfx, e_umb29_model]
- [0x1123508, af_palette, tol_umb_29_pal]
- [0x1123528, af_ci4, tol_umb_29_kasa1_tex_txt, 32, 32, 0x1123508, 0x20]
- [0x1123728, af_ci4, tol_umb_29_tuka_tex_txt, 32, 32, 0x1123508, 0x20]
@@ -4955,8 +4955,8 @@
name: tol_umb_30
subsegments:
- [0x1124000, vtx, tol_umb_30_v]
- - [0x1124380, gfx, kasa_umb30_model]
- - [0x1124450, gfx, e_umb30_model]
+ - [0x1124380, af_gfx, kasa_umb30_model]
+ - [0x1124450, af_gfx, e_umb30_model]
- [0x1124510, af_palette, obj_shop_umb_30_pal]
- [0x1124530, af_ci4, tol_umb_30_kasa1_tex_txt, 32, 32, 0x1124510, 0x20]
- [0x1124730, af_ci4, tol_umb_30_tuka_tex_txt, 32, 32, 0x1124510, 0x20]
@@ -4978,8 +4978,8 @@
name: tol_umb_31
subsegments:
- [0x1125000, vtx, tol_umb_31_v]
- - [0x1125360, gfx, kasa_umb31_model]
- - [0x1125428, gfx, e_umb31_model]
+ - [0x1125360, af_gfx, kasa_umb31_model]
+ - [0x1125428, af_gfx, e_umb31_model]
- [0x1125528, af_palette, tol_umb_31_pal]
- [0x1125548, af_ci4, tol_umb_31_kasa_tex_txt, 32, 32, 0x1125528, 0x20]
- [0x1125748, af_ci4, tol_umb_31_tuka_tex_txt, 32, 32, 0x1125528, 0x20]
@@ -5002,22 +5002,61 @@
name: tol_umb_32
subsegments:
- [0x1126000, vtx, tol_umb_32_v]
- - [0x1126380, gfx, kasa_umb32_model]
- - [0x1126448, gfx, e_umb32_model]
+ - [0x1126380, af_gfx, kasa_umb32_model]
+ - [0x1126448, af_gfx, e_umb32_model]
- [0x1126508, af_palette, obj_shop_umb_32_pal]
- [0x1126528, af_ci4, obj_shop_umb_32_kasa1_tex_txt, 32, 32, 0x1126508, 0x20]
- [0x1126728, af_ci4, obj_shop_umb_32_tuka1_tex_txt, 32, 32, 0x1126508, 0x20]
- [0x1126930]
- - name: object_01127000
- type: bin # code
+ - name: tol_keitai_1
+ dir: objects/tol_keitai_1
+ type: code
start: 0x1127000
vram: 0x06000000
exclusive_ram_id: segment_06
compress: True
align: 0x1000
- # subsegments:
- # - [0x1127000, data, assets/objects/object_01127000/object_01127000]
+ symbol_name_format: $VRAM_$ROM
+ subsegments:
+ - [auto, c, keitai_off1]
+ - start: 0x1127000
+ type: .data
+ name: keitai_off1
+ subsegments:
+ - [0x1127000, ckf_ckcb, cKF_ckcb_r_tol_keitai_1_keitai_off1_tbl]
+ - [0x1127004, ckf_kn, cKF_kn_tol_keitai_1_keitai_off1_tbl]
+ - [0x1127018, ckf_c, cKF_c_tol_keitai_1_keitai_off1_tbl]
+ - [0x1127020, ckf_ds, cKF_ds_tol_keitai_1_keitai_off1_tbl]
+ - [0x11270A4, ckf_ba, cKF_ba_r_tol_keitai_1_keitai_off1]
+ - [0x11270B8]
+ - [auto, c, keitai_on1]
+ - start: 0x11270C0
+ type: .data
+ name: keitai_on1
+ subsegments:
+ - [0x11270C0, ckf_ckcb, cKF_ckcb_r_tol_keitai_1_keitai_on1_tbl]
+ - [0x11270C4, ckf_kn, cKF_kn_tol_keitai_1_keitai_on1_tbl]
+ - [0x11270C8, ckf_c, cKF_c_tol_keitai_1_keitai_on1_tbl]
+ - [0x11270E0, ckf_ds, cKF_ds_tol_keitai_1_keitai_on1_tbl]
+ - [0x1127134, ckf_ba, cKF_ba_r_tol_keitai_1_keitai_on1]
+ - [0x1127148]
+ - [auto, c, tol_keitai_1]
+ - start: 0x1127150
+ type: .data
+ name: tol_keitai_1
+ subsegments:
+ - [0x1127150, vtx, tol_keitai_1_v]
+ - [0x1127320, af_gfx, main1_keitai1_model]
+ - [0x1127480, af_gfx, main2_keitai1_model]
+ - [0x11275E8, af_palette, tol_keitai_1_pal]
+ - [0x1127608, af_ci4, tol_keitai_1_ueura1_tex_txt, 16, 32, 0x11275E8, 0x20]
+ - [0x1127708, af_ci4, tol_keitai_1_ueomote1_tex_txt, 16, 32, 0x11275E8, 0x20]
+ - [0x1127808, af_ci4, tol_keitai_1_shitaura1_tex_txt, 16, 32, 0x11275E8, 0x20]
+ - [0x1127908, af_ci4, tol_keitai_1_shitaomote1_tex_txt, 16, 32, 0x11275E8, 0x20]
+ - [0x1127A08, ckf_je, cKF_je_r_tol_keitai_1_tbl]
+ - [0x1127A2C, ckf_bs, cKF_bs_r_tol_keitai_1]
+ - [0x1127A34]
- [0x1127A40]
- name: tol_utiwa_1
@@ -5036,7 +5075,7 @@
name: tol_utiwa_1
subsegments:
- [0x1128000, vtx, tol_utiwa_1_v]
- - [0x1128080, gfx, main_utiwa1_model]
+ - [0x1128080, af_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]
@@ -5053,48 +5092,104 @@
# - [0x1129000, data, assets/objects/object_01129000/object_01129000]
- [0x1129A80]
- - name: object_0112A000
- type: bin # code
+ - name: tol_npcsao_1
+ dir: objects/tol_npcsao_1
+ type: code
start: 0x112A000
vram: 0x06000000
exclusive_ram_id: segment_06
compress: True
align: 0x1000
- # subsegments:
- # - [0x112A000, data, assets/objects/object_0112A000/object_0112A000]
+ symbol_name_format: $VRAM_$ROM
+ subsegments:
+ - [auto, c, tol_npcsao_1]
+ - start: 0x112A000
+ type: .data
+ name: tol_npcsao_1
+ subsegments:
+ - [0x112A000, vtx, tol_npcsao_1_v]
+ - [0x112A470, af_gfx, tol_npcsao_1_sao_model]
+ - [0x112A548, af_gfx, tol_npcsao_1_uki_model]
+ - [0x112A5D8, af_palette, tol_npcsao_1_pal]
+ - [0x112A5F8, af_ci4, tol_npcsao_1_tex, 64, 16, 0x112A5D8, 0x20]
- [0x112A800]
- - name: object_0112B000
- type: bin # code
+ - name: tol_kamicup
+ dir: objects/tol_kamicup
+ type: code
start: 0x112B000
vram: 0x06000000
exclusive_ram_id: segment_06
compress: True
align: 0x1000
- # subsegments:
- # - [0x112B000, data, assets/objects/object_0112B000/object_0112B000]
+ symbol_name_format: $VRAM_$ROM
+ subsegments:
+ - [auto, c, tol_kamicup]
+ - start: 0x112B000
+ type: .data
+ name: tol_kamicup
+ subsegments:
+ - [0x112B000, vtx, tol_kamicup_1_v]
+ - [0x112B330, af_gfx, tol_kamicup_1T_model]
+ - [0x112B450, af_palette, tol_kamicup_pal]
+ - [0x112B470, af_ci4, tol_kamicup_tex, 32, 32, 0x112B450, 0x20]
- [0x112B670]
- - name: object_0112C000
- type: bin # code
+ - name: tol_kenjyu_1
+ dir: objects/tol_kenjyu_1
+ type: code
start: 0x112C000
vram: 0x06000000
exclusive_ram_id: segment_06
compress: True
align: 0x1000
- # subsegments:
- # - [0x112C000, data, assets/objects/object_0112C000/object_0112C000]
+ symbol_name_format: $VRAM_$ROM
+ subsegments:
+ - [auto, c, tol_kenjyu_1]
+ - start: 0x112C000
+ type: .data
+ name: tol_kenjyu_1
+ subsegments:
+ - [0x112C000, vtx, tol_kenjyu_1_v]
+ - [0x112C410, af_gfx, tol_kenjyu_1T_model]
+ - [0x112C528, af_palette, tol_kenjyu_1_pal]
+ - [0x112C548, af_ci4, tol_kenjyu_1_tex, 32, 32, 0x112C528, 0x20]
- [0x112C750]
- - name: object_0112D000
- type: bin # code
+ - name: tol_tamaire
+ dir: objects/tol_tamaire
+ type: code
start: 0x112D000
vram: 0x06000000
exclusive_ram_id: segment_06
compress: True
align: 0x1000
- # subsegments:
- # - [0x112D000, data, assets/objects/object_0112D000/object_0112D000]
+ symbol_name_format: $VRAM_$ROM
+ subsegments:
+ - [auto, c, ef_tamaire01]
+ - start: 0x112D000
+ type: .data
+ name: ef_tamaire01
+ subsegments:
+ - [0x112D000, vtx, ef_tamaire01_r_v]
+ - [0x112D040, af_gfx, tama01_model]
+ - [0x112D0C8, af_palette, ef_tamaire01_r_pal]
+ - [0x112D0E8, af_ci4, tama01_r_tex, 32, 32, 0x112D0C8, 0x20]
+ - [0x112D2E8, af_ci4, tama01_w_tex, 32, 32, 0x112D0C8, 0x20]
+ - [auto, c, tol_tamaire]
+ - start: 0x112D4F0
+ type: .data
+ name: tol_tamaire
+ subsegments:
+ - [0x112D4F0, vtx, tol_tamaire_v]
+ - [0x112D530, af_gfx, tol_tamaire_model]
+ - [0x112D5B8, af_palette, tol_tamaire_pal]
+ - [0x112D5D8, af_ci4, tol_tamaire_r1_tex, 32, 32, 0x112D5B8, 0x20]
+ - [0x112D7D8, af_ci4, tol_tamaire_r2_tex, 32, 32, 0x112D5B8, 0x20]
+ - [0x112D9D8, af_ci4, tol_tamaire_r3_tex, 32, 32, 0x112D5B8, 0x20]
+ - [0x112DBD8, af_ci4, tol_tamaire_w1_tex, 32, 32, 0x112D5B8, 0x20]
+ - [0x112DDD8, af_ci4, tol_tamaire_w2_tex, 32, 32, 0x112D5B8, 0x20]
+ - [0x112DFD8, af_ci4, tol_tamaire_w3_tex, 32, 32, 0x112D5B8, 0x20]
- [0x112E1E0]
- name: tol_cracker_1
@@ -5113,20 +5208,43 @@
name: tol_cracker_1
subsegments:
- [0x112F000, vtx, tol_cracker_1_v]
- - [0x112F1C0, gfx, tol_cracker_1T_model]
+ - [0x112F1C0, af_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
- type: bin # code
+ - name: tol_hata_01
+ dir: objects/tol_hata_01
+ type: code
start: 0x1130000
vram: 0x06000000
exclusive_ram_id: segment_06
compress: True
align: 0x1000
- # subsegments:
- # - [0x1130000, data, assets/objects/object_01130000/object_01130000]
+ symbol_name_format: $VRAM_$ROM
+ subsegments:
+ - [auto, c, tol_hata_01]
+ - start: 0x1130000
+ type: .data
+ name: tol_hata_01
+ subsegments:
+ - [0x1130000, vtx, tol_hata_01_v]
+ - [0x11300F0, af_gfx, tol_hata_e_model]
+ - [0x11301A0, af_gfx, tol_hata_hataT_model]
+ - [0x1130228, af_palette, tol_hata_e_pal]
+ - [0x1130248, af_ci4, tol_hata_e_tex, 16, 16, 0x1130228, 0x20]
+ - [0x11302C8, af_ia8, tol_hata_hata_tex_inta_ia8, 16, 16]
+ - [0x11303C8]
+ - [auto, c, tol_hata_01_evw_anime]
+ - start: 0x11303C8
+ type: .data
+ name: tol_hata_01_evw_anime
+ subsegments:
+ - [0x11303D0, evw_textable, tol_hata_01_evw_anime_1_tex_table]
+ - [0x11303D4, evw_animeptn, tol_hata_01_evw_anime_1_anime_ptn]
+ - [0x11303D8, evw_texanime, tol_hata_01_evw_anime_1]
+ - [0x11303E8, evw_scroll, tol_hata_01_evw_anime_2]
+ - [0x11303F0, evw_data, tol_hata_01_evw_anime]
- [0x1130400]
- name: object_01131000