summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKiritoDv <kiritodev01@gmail.com>2023-08-24 23:13:48 -0600
committerKiritoDv <kiritodev01@gmail.com>2023-08-24 23:13:48 -0600
commit64eddebf4d45b4775f6e9f248cbfaa1cb3ab55f2 (patch)
treec0fc5b1aedb1021544bf50454d6b44ef20f2bffb
parent15a0cf5498b60fa1442d049dbe5bb856022b5641 (diff)
Added animation factory and some random tools
-rw-r--r--.gitignore3
-rw-r--r--assets.json215
-rw-r--r--src/Companion.cpp6
-rw-r--r--src/factories/AnimFactory.cpp67
-rw-r--r--src/factories/AnimFactory.h9
-rw-r--r--src/factories/BlobFactory.cpp6
-rw-r--r--src/factories/BlobFactory.h3
-rw-r--r--src/factories/RawFactory.cpp4
-rw-r--r--src/factories/RawFactory.h5
-rw-r--r--src/factories/ResourceType.h1
-rw-r--r--src/factories/TextureFactory.cpp1
-rw-r--r--tools/anim_offsets.js63
-rwxr-xr-xtools/gen_anim_offsets.py51
-rw-r--r--tools/text_offsets.js47
14 files changed, 470 insertions, 11 deletions
diff --git a/.gitignore b/.gitignore
index 3eaed48..e038c5e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,4 +6,5 @@ cmake-build-*/
.DS_Store
debug/
*.z64
-*.n64 \ No newline at end of file
+*.n64
+assets/ \ No newline at end of file
diff --git a/assets.json b/assets.json
index c796eea..2db3c3b 100644
--- a/assets.json
+++ b/assets.json
@@ -525,8 +525,8 @@
"actors/yoshi_egg/yoshi_egg_5_unused.rgba16.png": [32,32,2048,{"jp":[1215456,32696],"us":[1222624,32696],"eu":[1094592,32696],"sh":[1071104,32696]}],
"actors/yoshi_egg/yoshi_egg_6_unused.rgba16.png": [32,32,2048,{"jp":[1215456,34744],"us":[1222624,34744],"eu":[1094592,34744],"sh":[1071104,34744]}],
"actors/yoshi_egg/yoshi_egg_7_unused.rgba16.png": [32,32,2048,{"jp":[1215456,36792],"us":[1222624,36792],"eu":[1094592,36792],"sh":[1071104,36792]}],
-"sound/sequences.bin": [114432, { "us": [8063072] }],
-"sound/bank_sets.bin": [159, { "us": [8177185] }],
+"sound/sequences.aud": [114432, { "us": [8063072] }],
+"sound/bank_sets.aud": [159, { "us": [8177185] }],
"assets/demos/bbh.bin": [988,{"jp":[5733368],"us":[5741664],"eu":[5620584],"sh":[5589632]}],
"assets/demos/bitdw.bin": [1412,{"us":[5747100],"sh":[5595068]}],
"assets/demos/ccm.bin": [1320,{"jp":[5734356],"us":[5742652],"eu":[5621572],"sh":[5590620]}],
@@ -2085,5 +2085,214 @@
"sound/samples/sfx_terrain/07_step_sand.aiff": [0,{"jp":["@sound",13],"us":["@sound",13],"eu":["@sound",13],"sh":["@sound",13]}],
"sound/samples/sfx_water/00_plunge.aiff": [0,{"jp":["@sound",14],"us":["@sound",14],"eu":["@sound",14],"sh":["@sound",14]}],
"sound/samples/sfx_water/01_splash.aiff": [0,{"jp":["@sound",15],"us":["@sound",15],"eu":["@sound",15],"sh":["@sound",15]}],
-"sound/samples/sfx_water/02_swim.aiff": [0,{"jp":["@sound",16],"us":["@sound",16],"eu":["@sound",16],"sh":["@sound",16]}]
+"sound/samples/sfx_water/02_swim.aiff": [0,{"jp":["@sound",16],"us":["@sound",16],"eu":["@sound",16],"sh":["@sound",16]}],
+"assets/anims/anim_00.anim": {"header":[5162640,24],"values":[5162916,2604],"indices":[5162664,252]},
+"assets/anims/anim_01.anim": {"header":[5165520,24],"values":[5165820,6576],"indices":[5165568,252]},
+"assets/anims/anim_02.anim": {"header":[5165544,24],"values":[5165820,6576],"indices":[5165568,252]},
+"assets/anims/anim_03.anim": {"header":[5172396,24],"values":[5172672,4372],"indices":[5172420,252]},
+"assets/anims/anim_04.anim": {"header":[5177044,24],"values":[5177320,2264],"indices":[5177068,252]},
+"assets/anims/anim_05.anim": {"header":[5179584,24],"values":[5179860,5796],"indices":[5179608,252]},
+"assets/anims/anim_06.anim": {"header":[5185656,24],"values":[5185932,892],"indices":[5185680,252]},
+"assets/anims/anim_07.anim": {"header":[5165544,24],"values":[5187124,1468],"indices":[5186872,252]},
+"assets/anims/anim_08.anim": {"header":[5186848,24],"values":[5187124,1468],"indices":[5186872,252]},
+"assets/anims/anim_09.anim": {"header":[5188592,24],"values":[5188868,3052],"indices":[5188616,252]},
+"assets/anims/anim_0A.anim": {"header":[5191920,24],"values":[5192196,2544],"indices":[5191944,252]},
+"assets/anims/anim_0B.anim": {"header":[5194740,24],"values":[5195040,1348],"indices":[5194788,252]},
+"assets/anims/anim_0C.anim": {"header":[5194764,24],"values":[5195040,1348],"indices":[5194788,252]},
+"assets/anims/anim_0D.anim": {"header":[5196388,24],"values":[5196664,770],"indices":[5196412,252]},
+"assets/anims/anim_0E.anim": {"header":[5165544,24],"values":[5197712,80],"indices":[5197460,252]},
+"assets/anims/anim_0F.anim": {"header":[5165544,24],"values":[5198092,1502],"indices":[5197840,252]},
+"assets/anims/anim_10.anim": {"header":[5197816,24],"values":[5198092,1502],"indices":[5197840,252]},
+"assets/anims/anim_11.anim": {"header":[5199596,24],"values":[5199872,1174],"indices":[5199620,252]},
+"assets/anims/anim_12.anim": {"header":[5201048,24],"values":[5201324,1318],"indices":[5201072,252]},
+"assets/anims/anim_13.anim": {"header":[5202644,24],"values":[5202920,1678],"indices":[5202668,252]},
+"assets/anims/anim_14.anim": {"header":[5204600,24],"values":[5204876,1102],"indices":[5204624,252]},
+"assets/anims/anim_15.anim": {"header":[5205980,24],"values":[5206256,930],"indices":[5206004,252]},
+"assets/anims/anim_16.anim": {"header":[5207188,24],"values":[5207464,4452],"indices":[5207212,252]},
+"assets/anims/anim_17.anim": {"header":[5211916,24],"values":[5212192,2942],"indices":[5211940,252]},
+"assets/anims/anim_18.anim": {"header":[5215136,24],"values":[5215412,4452],"indices":[5207212,252]},
+"assets/anims/anim_19.anim": {"header":[5219864,24],"values":[5220140,5354],"indices":[5219888,252]},
+"assets/anims/anim_1A.anim": {"header":[5225496,24],"values":[5225772,1146],"indices":[5225520,252]},
+"assets/anims/anim_1B.anim": {"header":[5226920,24],"values":[5227196,2858],"indices":[5226944,252]},
+"assets/anims/anim_1C.anim": {"header":[5230056,24],"values":[5230332,780],"indices":[5230080,252]},
+"assets/anims/anim_1D.anim": {"header":[5231112,24],"values":[5231388,1380],"indices":[5231136,252]},
+"assets/anims/anim_1E.anim": {"header":[5232768,24],"values":[5233044,1530],"indices":[5232792,252]},
+"assets/anims/anim_1F.anim": {"header":[5234576,24],"values":[5234852,846],"indices":[5234600,252]},
+"assets/anims/anim_20.anim": {"header":[5235700,24],"values":[5235976,7124],"indices":[5235724,252]},
+"assets/anims/anim_21.anim": {"header":[5243100,24],"values":[5243376,2610],"indices":[5243124,252]},
+"assets/anims/anim_22.anim": {"header":[5245988,24],"values":[5246264,1750],"indices":[5246012,252]},
+"assets/anims/anim_23.anim": {"header":[5248016,24],"values":[5248292,8216],"indices":[5248040,252]},
+"assets/anims/anim_24.anim": {"header":[5256508,24],"values":[5256784,9376],"indices":[5256532,252]},
+"assets/anims/anim_25.anim": {"header":[5266160,24],"values":[5266436,8018],"indices":[5266184,252]},
+"assets/anims/anim_26.anim": {"header":[5274456,24],"values":[5274732,7352],"indices":[5274480,252]},
+"assets/anims/anim_27.anim": {"header":[5282084,24],"values":[5282360,8980],"indices":[5282108,252]},
+"assets/anims/anim_28.anim": {"header":[5204600,24],"values":[5291616,1010],"indices":[5291364,252]},
+"assets/anims/anim_29.anim": {"header":[5292628,24],"values":[5292904,582],"indices":[5292652,252]},
+"assets/anims/anim_2A.anim": {"header":[5293488,24],"values":[5293764,1252],"indices":[5293512,252]},
+"assets/anims/anim_2B.anim": {"header":[5293488,24],"values":[5295292,1582],"indices":[5295040,252]},
+"assets/anims/anim_2C.anim": {"header":[5165520,24],"values":[5297176,5620],"indices":[5296924,252]},
+"assets/anims/anim_2D.anim": {"header":[5165544,24],"values":[5297176,5620],"indices":[5296924,252]},
+"assets/anims/anim_2E.anim": {"header":[5302796,24],"values":[5303072,3028],"indices":[5302820,252]},
+"assets/anims/anim_2F.anim": {"header":[5248016,24],"values":[5306376,7420],"indices":[5306124,252]},
+"assets/anims/anim_30.anim": {"header":[5179584,24],"values":[5314072,5428],"indices":[5313820,252]},
+"assets/anims/anim_31.anim": {"header":[5319500,24],"values":[5319776,10660],"indices":[5319524,252]},
+"assets/anims/anim_32.anim": {"header":[5235700,24],"values":[5330712,7890],"indices":[5330460,252]},
+"assets/anims/anim_33.anim": {"header":[5338604,24],"values":[5338880,2840],"indices":[5338628,252]},
+"assets/anims/anim_34.anim": {"header":[5199596,24],"values":[5341996,1300],"indices":[5341744,252]},
+"assets/anims/anim_35.anim": {"header":[5343296,24],"values":[5343572,3704],"indices":[5343320,252]},
+"assets/anims/anim_36.anim": {"header":[5347276,24],"values":[5347552,3700],"indices":[5347300,252]},
+"assets/anims/anim_37.anim": {"header":[5248016,24],"values":[5351528,6828],"indices":[5351276,252]},
+"assets/anims/anim_38.anim": {"header":[5185656,24],"values":[5358632,844],"indices":[5358380,252]},
+"assets/anims/anim_39.anim": {"header":[5359476,24],"values":[5359752,12418],"indices":[5359500,252]},
+"assets/anims/anim_3A.anim": {"header":[5372172,24],"values":[5372448,374],"indices":[5372196,252]},
+"assets/anims/anim_3B.anim": {"header":[5199596,24],"values":[5373100,1204],"indices":[5372848,252]},
+"assets/anims/anim_3C.anim": {"header":[5374304,24],"values":[5374604,774],"indices":[5374352,252]},
+"assets/anims/anim_3D.anim": {"header":[5374328,24],"values":[5374604,774],"indices":[5374352,252]},
+"assets/anims/anim_3E.anim": {"header":[5359476,24],"values":[5375656,11490],"indices":[5375404,252]},
+"assets/anims/anim_3F.anim": {"header":[5387148,24],"values":[5387424,3094],"indices":[5387172,252]},
+"assets/anims/anim_40.anim": {"header":[5390520,24],"values":[5390796,1094],"indices":[5390544,252]},
+"assets/anims/anim_41.anim": {"header":[5230056,24],"values":[5392168,536],"indices":[5391916,252]},
+"assets/anims/anim_42.anim": {"header":[5392704,24],"values":[5392980,956],"indices":[5392728,252]},
+"assets/anims/anim_43.anim": {"header":[5393936,24],"values":[5394212,84],"indices":[5393960,252]},
+"assets/anims/anim_44.anim": {"header":[5204600,24],"values":[5394572,650],"indices":[5394320,252]},
+"assets/anims/anim_45.anim": {"header":[5165544,24],"values":[5395524,1190],"indices":[5395272,252]},
+"assets/anims/anim_46.anim": {"header":[5395248,24],"values":[5395524,1190],"indices":[5395272,252]},
+"assets/anims/anim_47.anim": {"header":[5374304,24],"values":[5396992,838],"indices":[5396740,252]},
+"assets/anims/anim_48.anim": {"header":[5397832,24],"values":[5398108,5098],"indices":[5397856,252]},
+"assets/anims/anim_49.anim": {"header":[5199596,24],"values":[5403484,1298],"indices":[5403232,252]},
+"assets/anims/anim_4A.anim": {"header":[5404784,24],"values":[5405060,616],"indices":[5404808,252]},
+"assets/anims/anim_4B.anim": {"header":[5201048,24],"values":[5405952,1386],"indices":[5405700,252]},
+"assets/anims/anim_4C.anim": {"header":[5407340,24],"values":[5407616,670],"indices":[5407364,252]},
+"assets/anims/anim_4D.anim": {"header":[5185656,24],"values":[5408588,2456],"indices":[5408336,252]},
+"assets/anims/anim_4E.anim": {"header":[5408312,24],"values":[5408588,2456],"indices":[5408336,252]},
+"assets/anims/anim_4F.anim": {"header":[5234576,24],"values":[5411320,1578],"indices":[5411068,252]},
+"assets/anims/anim_50.anim": {"header":[5372172,24],"values":[5413176,420],"indices":[5412924,252]},
+"assets/anims/anim_51.anim": {"header":[5413596,24],"values":[5413872,1002],"indices":[5413620,252]},
+"assets/anims/anim_52.anim": {"header":[5374304,24],"values":[5415152,878],"indices":[5414900,252]},
+"assets/anims/anim_53.anim": {"header":[5416032,24],"values":[5416308,1970],"indices":[5416056,252]},
+"assets/anims/anim_54.anim": {"header":[5418280,24],"values":[5418556,1314],"indices":[5418304,252]},
+"assets/anims/anim_55.anim": {"header":[5419872,24],"values":[5420148,11268],"indices":[5419896,252]},
+"assets/anims/anim_56.anim": {"header":[5165544,24],"values":[5431716,1560],"indices":[5431464,252]},
+"assets/anims/anim_57.anim": {"header":[5431440,24],"values":[5431716,1560],"indices":[5431464,252]},
+"assets/anims/anim_58.anim": {"header":[5433276,24],"values":[5433552,1082],"indices":[5433300,252]},
+"assets/anims/anim_59.anim": {"header":[5434636,24],"values":[5434912,3052],"indices":[5434660,252]},
+"assets/anims/anim_5A.anim": {"header":[5437964,24],"values":[5438240,3278],"indices":[5437988,252]},
+"assets/anims/anim_5B.anim": {"header":[5230056,24],"values":[5441796,720],"indices":[5441544,252]},
+"assets/anims/anim_5C.anim": {"header":[5442516,24],"values":[5442792,1258],"indices":[5442540,252]},
+"assets/anims/anim_5D.anim": {"header":[5390520,24],"values":[5444328,1142],"indices":[5444076,252]},
+"assets/anims/anim_5E.anim": {"header":[5359476,24],"values":[5445748,12110],"indices":[5445496,252]},
+"assets/anims/anim_5F.anim": {"header":[5457860,24],"values":[5458136,5058],"indices":[5457884,252]},
+"assets/anims/anim_60.anim": {"header":[5463196,24],"values":[5463472,4020],"indices":[5463220,252]},
+"assets/anims/anim_61.anim": {"header":[5467492,24],"values":[5467768,12660],"indices":[5467516,252]},
+"assets/anims/anim_62.anim": {"header":[5230056,24],"values":[5480704,742],"indices":[5480452,252]},
+"assets/anims/anim_63.anim": {"header":[5481448,24],"values":[5481724,1626],"indices":[5481472,252]},
+"assets/anims/anim_64.anim": {"header":[5483352,24],"values":[5483628,1246],"indices":[5483376,252]},
+"assets/anims/anim_65.anim": {"header":[5234576,24],"values":[5485152,1700],"indices":[5484900,252]},
+"assets/anims/anim_66.anim": {"header":[5486852,24],"values":[5487128,1948],"indices":[5486876,252]},
+"assets/anims/anim_67.anim": {"header":[5489076,24],"values":[5489352,386],"indices":[5489100,252]},
+"assets/anims/anim_68.anim": {"header":[5489740,24],"values":[5490016,340],"indices":[5489764,252]},
+"assets/anims/anim_69.anim": {"header":[5230056,24],"values":[5490632,764],"indices":[5490380,252]},
+"assets/anims/anim_6A.anim": {"header":[5491396,24],"values":[5491672,1060],"indices":[5491420,252]},
+"assets/anims/anim_6B.anim": {"header":[5374304,24],"values":[5493008,940],"indices":[5492756,252]},
+"assets/anims/anim_6C.anim": {"header":[5493948,24],"values":[5494224,1284],"indices":[5493972,252]},
+"assets/anims/anim_6D.anim": {"header":[5201048,24],"values":[5495784,1286],"indices":[5495532,252]},
+"assets/anims/anim_6E.anim": {"header":[5199596,24],"values":[5497348,1136],"indices":[5497096,252]},
+"assets/anims/anim_6F.anim": {"header":[5292628,24],"values":[5498784,98],"indices":[5498532,252]},
+"assets/anims/anim_70.anim": {"header":[5498508,24],"values":[5498784,98],"indices":[5498532,252]},
+"assets/anims/anim_71.anim": {"header":[5498884,24],"values":[5499160,2078],"indices":[5498908,252]},
+"assets/anims/anim_72.anim": {"header":[5501240,24],"values":[5501540,4342],"indices":[5501288,252]},
+"assets/anims/anim_73.anim": {"header":[5501240,24],"values":[5501540,4342],"indices":[5501288,252]},
+"assets/anims/anim_74.anim": {"header":[5498884,24],"values":[5506160,1844],"indices":[5505908,252]},
+"assets/anims/anim_75.anim": {"header":[5498884,24],"values":[5508280,1892],"indices":[5508028,252]},
+"assets/anims/anim_76.anim": {"header":[5248016,24],"values":[5510448,4648],"indices":[5510196,252]},
+"assets/anims/anim_77.anim": {"header":[5207188,24],"values":[5515372,2464],"indices":[5515120,252]},
+"assets/anims/anim_78.anim": {"header":[5517836,24],"values":[5518112,10454],"indices":[5517860,252]},
+"assets/anims/anim_79.anim": {"header":[5528568,24],"values":[5528844,3634],"indices":[5528592,252]},
+"assets/anims/anim_7A.anim": {"header":[5532480,24],"values":[5532756,402],"indices":[5532504,252]},
+"assets/anims/anim_7B.anim": {"header":[5418280,24],"values":[5533436,2360],"indices":[5533184,252]},
+"assets/anims/anim_7C.anim": {"header":[5418280,24],"values":[5536072,2300],"indices":[5535820,252]},
+"assets/anims/anim_7D.anim": {"header":[5293488,24],"values":[5538648,1114],"indices":[5538396,252]},
+"assets/anims/anim_7E.anim": {"header":[5179584,24],"values":[5540040,4538],"indices":[5539788,252]},
+"assets/anims/anim_7F.anim": {"header":[5226920,24],"values":[5544856,3622],"indices":[5544604,252]},
+"assets/anims/anim_80.anim": {"header":[5226920,24],"values":[5548756,4248],"indices":[5548504,252]},
+"assets/anims/anim_81.anim": {"header":[5553004,24],"values":[5553280,4308],"indices":[5553028,252]},
+"assets/anims/anim_82.anim": {"header":[5557588,24],"values":[5557864,5770],"indices":[5557612,252]},
+"assets/anims/anim_83.anim": {"header":[5563636,24],"values":[5563912,4734],"indices":[5563660,252]},
+"assets/anims/anim_84.anim": {"header":[5172396,24],"values":[5568924,4756],"indices":[5568672,252]},
+"assets/anims/anim_85.anim": {"header":[5293488,24],"values":[5573956,324],"indices":[5573704,252]},
+"assets/anims/anim_86.anim": {"header":[5574280,24],"values":[5574556,2902],"indices":[5574304,252]},
+"assets/anims/anim_87.anim": {"header":[5338604,24],"values":[5577736,1564],"indices":[5577484,252]},
+"assets/anims/anim_88.anim": {"header":[5442516,24],"values":[5579600,1260],"indices":[5579348,252]},
+"assets/anims/anim_89.anim": {"header":[5579324,24],"values":[5579600,1260],"indices":[5579348,252]},
+"assets/anims/anim_8A.anim": {"header":[5574280,24],"values":[5581136,2980],"indices":[5580884,252]},
+"assets/anims/anim_8B.anim": {"header":[5434636,24],"values":[5584392,2970],"indices":[5584140,252]},
+"assets/anims/anim_8C.anim": {"header":[5404784,24],"values":[5587640,646],"indices":[5587388,252]},
+"assets/anims/anim_8D.anim": {"header":[5413596,24],"values":[5588564,1086],"indices":[5588312,252]},
+"assets/anims/anim_8E.anim": {"header":[5165544,24],"values":[5589952,1618],"indices":[5589700,252]},
+"assets/anims/anim_8F.anim": {"header":[5186848,24],"values":[5589952,1618],"indices":[5589700,252]},
+"assets/anims/anim_90.anim": {"header":[5204600,24],"values":[5591848,1012],"indices":[5591596,252]},
+"assets/anims/anim_91.anim": {"header":[5592860,24],"values":[5593136,266],"indices":[5592884,252]},
+"assets/anims/anim_92.anim": {"header":[5593404,24],"values":[5593680,5600],"indices":[5593428,252]},
+"assets/anims/anim_93.anim": {"header":[5230056,24],"values":[5599556,602],"indices":[5599304,252]},
+"assets/anims/anim_94.anim": {"header":[5165544,24],"values":[5600436,80],"indices":[5197460,252]},
+"assets/anims/anim_95.anim": {"header":[5489076,24],"values":[5600792,280],"indices":[5600540,252]},
+"assets/anims/anim_96.anim": {"header":[5230056,24],"values":[5601348,680],"indices":[5601096,252]},
+"assets/anims/anim_97.anim": {"header":[5372172,24],"values":[5602304,416],"indices":[5602052,252]},
+"assets/anims/anim_98.anim": {"header":[5179584,24],"values":[5602996,2758],"indices":[5602744,252]},
+"assets/anims/anim_99.anim": {"header":[5605756,24],"values":[5606032,7014],"indices":[5605780,252]},
+"assets/anims/anim_9A.anim": {"header":[5404784,24],"values":[5613324,644],"indices":[5613072,252]},
+"assets/anims/anim_9B.anim": {"header":[5404784,24],"values":[5614244,630],"indices":[5613992,252]},
+"assets/anims/anim_9C.anim": {"header":[5614876,24],"values":[5615152,4884],"indices":[5614900,252]},
+"assets/anims/anim_9D.anim": {"header":[5620036,24],"values":[5620312,1944],"indices":[5620060,252]},
+"assets/anims/anim_9E.anim": {"header":[5553004,24],"values":[5622532,4008],"indices":[5622280,252]},
+"assets/anims/anim_9F.anim": {"header":[5199596,24],"values":[5626816,774],"indices":[5626564,252]},
+"assets/anims/anim_A0.anim": {"header":[5230056,24],"values":[5627868,390],"indices":[5627616,252]},
+"assets/anims/anim_A1.anim": {"header":[5628260,24],"values":[5628536,920],"indices":[5628284,252]},
+"assets/anims/anim_A2.anim": {"header":[5202644,24],"values":[5629732,1448],"indices":[5629480,252]},
+"assets/anims/anim_A3.anim": {"header":[5418280,24],"values":[5631456,2590],"indices":[5631204,252]},
+"assets/anims/anim_A4.anim": {"header":[5232768,24],"values":[5634324,1650],"indices":[5634072,252]},
+"assets/anims/anim_A5.anim": {"header":[5165520,24],"values":[5636252,5148],"indices":[5636000,252]},
+"assets/anims/anim_A6.anim": {"header":[5641400,24],"values":[5641676,4646],"indices":[5641424,252]},
+"assets/anims/anim_A7.anim": {"header":[5574280,24],"values":[5646600,3060],"indices":[5646348,252]},
+"assets/anims/anim_A8.anim": {"header":[5553004,24],"values":[5649936,3910],"indices":[5649684,252]},
+"assets/anims/anim_A9.anim": {"header":[5442516,24],"values":[5654124,1728],"indices":[5653872,252]},
+"assets/anims/anim_AA.anim": {"header":[5491396,24],"values":[5656128,972],"indices":[5655876,252]},
+"assets/anims/anim_AB.anim": {"header":[5230056,24],"values":[5657376,750],"indices":[5657124,252]},
+"assets/anims/anim_AC.anim": {"header":[5658128,24],"values":[5658404,1706],"indices":[5658152,252]},
+"assets/anims/anim_AD.anim": {"header":[5416032,24],"values":[5660388,1860],"indices":[5660136,252]},
+"assets/anims/anim_AE.anim": {"header":[5374304,24],"values":[5662524,956],"indices":[5662272,252]},
+"assets/anims/anim_AF.anim": {"header":[5416032,24],"values":[5663756,2160],"indices":[5663504,252]},
+"assets/anims/anim_B0.anim": {"header":[5489076,24],"values":[5666192,440],"indices":[5665940,252]},
+"assets/anims/anim_B1.anim": {"header":[5666632,24],"values":[5666908,2418],"indices":[5666656,252]},
+"assets/anims/anim_B2.anim": {"header":[5232768,24],"values":[5669604,1824],"indices":[5669352,252]},
+"assets/anims/anim_B3.anim": {"header":[5671428,24],"values":[5671704,6494],"indices":[5671452,252]},
+"assets/anims/anim_B4.anim": {"header":[5498884,24],"values":[5678476,1846],"indices":[5678224,252]},
+"assets/anims/anim_B5.anim": {"header":[5442516,24],"values":[5680624,1382],"indices":[5680372,252]},
+"assets/anims/anim_B6.anim": {"header":[5680348,24],"values":[5680624,1382],"indices":[5680372,252]},
+"assets/anims/anim_B7.anim": {"header":[5574280,24],"values":[5682284,2980],"indices":[5682032,252]},
+"assets/anims/anim_B8.anim": {"header":[5338604,24],"values":[5685540,776],"indices":[5685288,252]},
+"assets/anims/anim_B9.anim": {"header":[5416032,24],"values":[5686592,2068],"indices":[5686340,252]},
+"assets/anims/anim_BA.anim": {"header":[5433276,24],"values":[5688936,986],"indices":[5688684,252]},
+"assets/anims/anim_BB.anim": {"header":[5689924,24],"values":[5690200,4132],"indices":[5689948,252]},
+"assets/anims/anim_BC.anim": {"header":[5165544,24],"values":[5694632,1528],"indices":[5694380,252]},
+"assets/anims/anim_BD.anim": {"header":[5197816,24],"values":[5694632,1528],"indices":[5694380,252]},
+"assets/anims/anim_BE.anim": {"header":[5230056,24],"values":[5696436,760],"indices":[5696184,252]},
+"assets/anims/anim_BF.anim": {"header":[5498884,24],"values":[5697472,1936],"indices":[5697220,252]},
+"assets/anims/anim_C0.anim": {"header":[5699408,24],"values":[5699684,2452],"indices":[5699432,252]},
+"assets/anims/anim_C1.anim": {"header":[5191920,24],"values":[5702412,2468],"indices":[5702160,252]},
+"assets/anims/anim_C2.anim": {"header":[5179584,24],"values":[5705156,5422],"indices":[5704904,252]},
+"assets/anims/anim_C3.anim": {"header":[5418280,24],"values":[5710856,1942],"indices":[5710604,252]},
+"assets/anims/anim_C4.anim": {"header":[5418280,24],"values":[5713076,1942],"indices":[5710604,252]},
+"assets/anims/anim_C5.anim": {"header":[5418280,24],"values":[5715296,1942],"indices":[5710604,252]},
+"assets/anims/anim_C6.anim": {"header":[5338604,24],"values":[5717516,1666],"indices":[5717264,252]},
+"assets/anims/anim_C7.anim": {"header":[5338604,24],"values":[5719460,2844],"indices":[5719208,252]},
+"assets/anims/anim_C8.anim": {"header":[5722304,24],"values":[5722580,1648],"indices":[5722328,252]},
+"assets/anims/anim_C9.anim": {"header":[5234576,24],"values":[5724504,1940],"indices":[5724252,252]},
+"assets/anims/anim_CA.anim": {"header":[5726444,24],"values":[5726720,1998],"indices":[5726468,252]},
+"assets/anims/anim_CB.anim": {"header":[5225496,24],"values":[5729020,1382],"indices":[5728768,252]},
+"assets/anims/anim_CC.anim": {"header":[5165544,24],"values":[5729020,1382],"indices":[5728768,252]},
+"assets/anims/anim_CD.anim": {"header":[5730404,24],"values":[5730680,5184],"indices":[5730428,252]},
+"assets/anims/anim_CE.anim": {"header":[5201048,24],"values":[5736140,1460],"indices":[5735888,252]},
+"assets/anims/anim_CF.anim": {"header":[5737600,24],"values":[5737876,2708],"indices":[5737624,252]},
+"assets/anims/anim_D0.anim": {"header":[5413596,24],"values":[5740860,730],"indices":[5740608,252]}
}
diff --git a/src/Companion.cpp b/src/Companion.cpp
index 9b38118..16d6c11 100644
--- a/src/Companion.cpp
+++ b/src/Companion.cpp
@@ -5,6 +5,7 @@
#include "factories/RawFactory.h"
#include "factories/BlobFactory.h"
#include "factories/TextureFactory.h"
+#include "factories/AnimFactory.h"
#include <fstream>
#include <iostream>
@@ -16,8 +17,10 @@ namespace fs = std::filesystem;
static const std::unordered_map<std::string, RawFactory*> gFactories = {
{ ".png", new TextureFactory() },
+ { ".anim", new AnimFactory() },
{ ".bin", new BlobFactory(LUS::ResourceType::Blob) },
{ ".sbox", new BlobFactory(LUS::ResourceType::Blob, true) },
+ { ".aud", new BlobFactory(LUS::ResourceType::Blob, false) },
};
void Companion::Start() {
@@ -58,7 +61,6 @@ void Companion::ProcessAssets() {
continue;
}
- std::cout << "Processed " << path << std::endl;
bool isTexture = typeid(*factory) == typeid(TextureFactory);
auto buffer = write.ToVector();
@@ -74,6 +76,8 @@ void Companion::ProcessAssets() {
output.close();
}
+ std::cout << "Processed " << path << std::endl;
+
write.Close();
}
diff --git a/src/factories/AnimFactory.cpp b/src/factories/AnimFactory.cpp
new file mode 100644
index 0000000..3ba83fe
--- /dev/null
+++ b/src/factories/AnimFactory.cpp
@@ -0,0 +1,67 @@
+#include "AnimFactory.h"
+
+#include <iostream>
+#include <filesystem>
+#include "Companion.h"
+#include "utils/MIODecoder.h"
+#include "binarytools/BinaryReader.h"
+
+namespace fs = std::filesystem;
+
+void WriteAnimationHeader(LUS::BinaryWriter* writer, nlohmann::json& offsets, std::vector<uint8_t>& buffer) {
+ LUS::BinaryReader reader((char*) buffer.data() + offsets[0], offsets[1]);
+ reader.SetEndianness(LUS::Endianness::Big);
+
+ auto flags = reader.ReadInt16();
+ auto animYTransDivisor = reader.ReadInt16();
+ auto startFrame = reader.ReadInt16();
+ auto loopStart = reader.ReadInt16();
+ auto loopEnd = reader.ReadInt16();
+ auto unusedBoneCount = reader.ReadInt16();
+ reader.ReadUInt32();
+ reader.ReadUInt32();
+ auto length = reader.ReadUInt32();
+
+ WRITE_I16(flags);
+ WRITE_I16(animYTransDivisor);
+ WRITE_I16(startFrame);
+ WRITE_I16(loopStart);
+ WRITE_I16(loopEnd);
+ WRITE_I16(unusedBoneCount);
+ WRITE_U64(length);
+ reader.Close();
+}
+
+void WriteAnimationIndex(LUS::BinaryWriter* writer, nlohmann::json& offsets, std::vector<uint8_t>& buffer) {
+ LUS::BinaryReader reader((char*) buffer.data() + offsets[0], offsets[1]);
+ reader.SetEndianness(LUS::Endianness::Big);
+ size_t entries = ((size_t) offsets[1]);
+ WRITE_U32(entries);
+ for(size_t id = 0; id < entries; id++) {
+ WRITE_I16(reader.ReadInt16());
+ }
+ reader.Close();
+}
+
+void WriteAnimationValues(LUS::BinaryWriter* writer, nlohmann::json& offsets, std::vector<uint8_t>& buffer) {
+ LUS::BinaryReader reader((char*) buffer.data() + offsets[0], offsets[1]);
+ reader.SetEndianness(LUS::Endianness::Big);
+ size_t entries = ((size_t) offsets[1]);
+ WRITE_U32(entries);
+ for(size_t id = 0; id < entries; id++) {
+ WRITE_U16(reader.ReadUInt16());
+ }
+ reader.Close();
+}
+
+bool AnimFactory::process(LUS::BinaryWriter* writer, nlohmann::json& data, std::vector<uint8_t>& buffer) {
+ auto metadata = data["offsets"];
+
+ WRITE_HEADER(LUS::ResourceType::Anim, 0);
+
+ WriteAnimationHeader(writer, metadata["header"], buffer);
+ WriteAnimationIndex( writer, metadata["indices"], buffer);
+ WriteAnimationValues(writer, metadata["values"], buffer);
+
+ return true;
+} \ No newline at end of file
diff --git a/src/factories/AnimFactory.h b/src/factories/AnimFactory.h
new file mode 100644
index 0000000..7641099
--- /dev/null
+++ b/src/factories/AnimFactory.h
@@ -0,0 +1,9 @@
+#pragma once
+
+#include "RawFactory.h"
+
+class AnimFactory : public RawFactory {
+public:
+ AnimFactory() = default;
+ bool process(LUS::BinaryWriter* write, nlohmann::json& data, std::vector<uint8_t>& buffer) override;
+}; \ No newline at end of file
diff --git a/src/factories/BlobFactory.cpp b/src/factories/BlobFactory.cpp
index c9e52a9..b70c4e7 100644
--- a/src/factories/BlobFactory.cpp
+++ b/src/factories/BlobFactory.cpp
@@ -13,7 +13,11 @@ bool BlobFactory::process(LUS::BinaryWriter* writer, nlohmann::json& data, std::
return false;
}
- WRITE_HEADER(this->type, 0);
+ if(this->bigEndian){
+ WRITE_BHEADER(this->type, 0);
+ } else {
+ WRITE_HEADER(this->type, 0);
+ }
size_t size = metadata[0];
auto offsets = metadata[1]["us"];
diff --git a/src/factories/BlobFactory.h b/src/factories/BlobFactory.h
index 0f80c1d..73cb80b 100644
--- a/src/factories/BlobFactory.h
+++ b/src/factories/BlobFactory.h
@@ -4,9 +4,10 @@
class BlobFactory : public RawFactory {
public:
- BlobFactory(LUS::ResourceType type, bool isMIOChunk = false) : type(type), isMIOChunk(isMIOChunk) {}
+ BlobFactory(LUS::ResourceType type, bool isMIOChunk = false, bool bigEndian = false) : type(type), isMIOChunk(isMIOChunk), bigEndian(bigEndian) {}
bool process(LUS::BinaryWriter* write, nlohmann::json& data, std::vector<uint8_t>& buffer) override;
private:
bool isMIOChunk = false;
+ bool bigEndian = false;
LUS::ResourceType type = LUS::ResourceType::Blob;
}; \ No newline at end of file
diff --git a/src/factories/RawFactory.cpp b/src/factories/RawFactory.cpp
index 708d91b..f997238 100644
--- a/src/factories/RawFactory.cpp
+++ b/src/factories/RawFactory.cpp
@@ -1,7 +1,7 @@
#include "RawFactory.h"
-void RawFactory::WriteHeader(LUS::BinaryWriter* writer, LUS::ResourceType resType, int32_t version){
- writer->Write((uint8_t)LUS::Endianness::Little); // 0x00
+void RawFactory::WriteHeader(LUS::BinaryWriter* writer, LUS::ResourceType resType, int32_t version, bool bigEndian) {
+ writer->Write((uint8_t)(bigEndian ? LUS::Endianness::Big : LUS::Endianness::Little)); // 0x00
writer->Write((uint8_t)0); // 0x01
writer->Write((uint8_t)0); // 0x02
writer->Write((uint8_t)0); // 0x03
diff --git a/src/factories/RawFactory.h b/src/factories/RawFactory.h
index 05909fb..7057740 100644
--- a/src/factories/RawFactory.h
+++ b/src/factories/RawFactory.h
@@ -7,8 +7,11 @@
#include <nlohmann/json.hpp>
#define WRITE_HEADER(type, version) this->WriteHeader(writer, type, version)
+#define WRITE_BHEADER(type, version) this->WriteHeader(writer, type, version, true)
+#define WRITE_U16(value) writer->Write((uint16_t) value)
#define WRITE_U32(value) writer->Write((uint32_t) value)
#define WRITE_U64(value) writer->Write((uint64_t) value)
+#define WRITE_I16(value) writer->Write((int16_t) value)
#define WRITE_DATA(vec) writer->Write((char*) vec.data(), data.size())
#define WRITE_ARRAY(data, size) writer->Write((char*) data, size)
@@ -16,5 +19,5 @@ class RawFactory {
public:
RawFactory() = default;
virtual bool process(LUS::BinaryWriter* write, nlohmann::json& data, std::vector<uint8_t>& buffer) = 0;
- void WriteHeader(LUS::BinaryWriter* write, LUS::ResourceType resType, int32_t version);
+ void WriteHeader(LUS::BinaryWriter* write, LUS::ResourceType resType, int32_t version, bool bigEndian = false);
}; \ No newline at end of file
diff --git a/src/factories/ResourceType.h b/src/factories/ResourceType.h
index 202e732..3d4013b 100644
--- a/src/factories/ResourceType.h
+++ b/src/factories/ResourceType.h
@@ -18,5 +18,6 @@ enum class ResourceType {
// CubeOS
Demo = 0x44454D4F, // DEMO
Skybox = 0x534B5942, // SKYB
+ Anim = 0x414E494D, // ANIM
};
} // namespace LUS
diff --git a/src/factories/TextureFactory.cpp b/src/factories/TextureFactory.cpp
index 8bacc2f..9fd431a 100644
--- a/src/factories/TextureFactory.cpp
+++ b/src/factories/TextureFactory.cpp
@@ -73,6 +73,5 @@ bool TextureFactory::process(LUS::BinaryWriter* writer, nlohmann::json& data, st
WRITE_ARRAY(texture, size); // Texture Data
delete[] texture;
- std::cout << "Processed " << path << '\n';
return true;
} \ No newline at end of file
diff --git a/tools/anim_offsets.js b/tools/anim_offsets.js
new file mode 100644
index 0000000..3f641b8
--- /dev/null
+++ b/tools/anim_offsets.js
@@ -0,0 +1,63 @@
+const fs = require('fs');
+const path = require('path');
+
+let _parent = 'assets/reordered';
+let bytes = Buffer.alloc(0);
+
+function toHex(value) {
+ let hex = value.toString(16);
+ if ((hex.length % 2) > 0) {
+ hex = "0" + hex;
+ }
+ return `0x${hex.toUpperCase()}`;
+}
+
+function toBEU16(num){
+ let d = new Uint16Array(1);
+ d[0] = num;
+ return Buffer.from(d.buffer).swap16()
+}
+
+async function parseAnim(file){
+ let fimport = `./${file.replace('.js', '')}`
+ let data = require(fimport)
+ for(let id of fimport.split('_').slice(1)){
+ let anim = data['anim_'+id];
+ let hOffset = bytes.indexOf(Buffer.concat(anim.slice(0, 6).map(toBEU16)));
+
+ let bswValues = Buffer.concat(anim[6].map(toBEU16));
+ let vsOffset = bytes.indexOf(bswValues);
+ let bswIndices = Buffer.concat(anim[7].map(toBEU16));
+ let idxOffset = bytes.indexOf(bswIndices);
+ console.log(`"assets/anims/anim_${id}.anim": ${JSON.stringify({
+ header: [hOffset, 0x18],
+ values: [vsOffset, bswValues.length],
+ indices: [idxOffset, bswIndices.length],
+ })},`);
+ }
+}
+
+async function main(){
+ bytes = fs.readFileSync('./baserom.us.z64');
+ for(let file of fs.readdirSync(_parent)){
+ let pdir = path.join(_parent, file);
+ let lines = fs.readFileSync(pdir, 'utf8').split('\n').map((line) =>
+ line.replace('const u16', 'let')
+ .replace('const s16', 'let')
+ .replace('#include "animation_table.h"', '')
+ .replace('const struct Animation', 'let')
+ .replace('[] = {', ' = [')
+ .replace('};', ']')
+ );
+ let func = "function ANIMINDEX_NUMPARTS(animindex) {\n return Math.floor(animindex.length / 6) - 1;\n}".split('\n');
+ let output = path.join('assets/js', file).replace('.inc.c', '.js');
+ fs.writeFileSync(output, [
+ ...func,
+ ...lines,
+ `module.exports = { ${output.replace('.js', '').split('_').slice(1).map(m => `anim_${m}`).join(', ')} };`,
+ ].join('\n'));
+ await parseAnim(output);
+ }
+}
+
+main(); \ No newline at end of file
diff --git a/tools/gen_anim_offsets.py b/tools/gen_anim_offsets.py
new file mode 100755
index 0000000..d64396e
--- /dev/null
+++ b/tools/gen_anim_offsets.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python3
+import os
+
+# This script generates the offsets for the animation files.
+
+OFFSET = 0x4EC690
+HEADER_SIZE = 0x18
+ANIMS_SIZE = 3
+
+# struct Animation {
+# /*0x00*/ s16 flags;
+# /*0x02*/ s16 animYTransDivisor;
+# /*0x04*/ s16 startFrame;
+# /*0x06*/ s16 loopStart;
+# /*0x08*/ s16 loopEnd;
+# /*0x0A*/ s16 unusedBoneCount;
+# /*0x0C*/ const s16 *values;
+# /*0x10*/ const u16 *index;
+# /*0x14*/ u32 length; // only used with Mario animations to determine how much to load. 0 otherwise.
+# };
+
+# ./anim_01_02.inc.c./anim_07_08.inc.c./anim_0B_0C.inc.c./anim_0F_10.inc.c./anim_2C_2D.inc.c./anim_3C_3D.inc.c./anim_45_46.inc.c./anim_4D_4E.inc.c./anim_56_57.inc.c./anim_6F_70.inc.c./anim_72_73.inc.c./anim_88_89.inc.c./anim_8E_8F.inc.c./anim_B5_B6.inc.c./anim_BC_BD.inc.c./anim_CB_CC.inc.c%
+
+multi = [0x01, 0x07, 0x0B, 0x0F, 0x2C, 0x3C, 0x45, 0x4D, 0x56, 0x6F, 0x72, 0x88, 0x8E, 0xB5, 0xBC, 0xCB]
+
+if __name__ == "__main__":
+ with open("baserom.us.z64", "rb") as f:
+ f.seek(OFFSET)
+ for i in range(ANIMS_SIZE):
+ for j in range(2 if i in multi else 1):
+ flags = int.from_bytes(f.read(2), byteorder="big")
+ animYTransDivisor = int.from_bytes(f.read(2), byteorder="big")
+ startFrame = int.from_bytes(f.read(2), byteorder="big")
+ loopStart = int.from_bytes(f.read(2), byteorder="big")
+ loopEnd = int.from_bytes(f.read(2), byteorder="big")
+ unusedBoneCount = int.from_bytes(f.read(2), byteorder="big")
+ values = int.from_bytes(f.read(4), byteorder="little")
+ index = int.from_bytes(f.read(4), byteorder="little")
+ length = int.from_bytes(f.read(2), byteorder="big")
+ print(f"0x{OFFSET + i * HEADER_SIZE:08X}")
+ print(f" flags: {flags}")
+ print(f" animYTransDivisor: {animYTransDivisor}")
+ print(f" startFrame: {startFrame}")
+ print(f" loopStart: {loopStart}")
+ print(f" loopEnd: {loopEnd}")
+ print(f" unusedBoneCount: {unusedBoneCount}")
+ print(f" values: 0x{values:08X}")
+ print(f" index: 0x{index:08X}")
+ print(f" length: {length}")
+ f.seek(HEADER_SIZE, os.SEEK_CUR)
+ f.seek(0x18, os.SEEK_CUR) \ No newline at end of file
diff --git a/tools/text_offsets.js b/tools/text_offsets.js
new file mode 100644
index 0000000..699078c
--- /dev/null
+++ b/tools/text_offsets.js
@@ -0,0 +1,47 @@
+const fs = require('fs');
+const path = require('path');
+
+let _parent = 'assets/reordered';
+let bytes = Buffer.alloc(0);
+
+function toHex(value) {
+ let hex = value.toString(16);
+ if ((hex.length % 2) > 0) {
+ hex = "0" + hex;
+ }
+ return `0x${hex.toUpperCase()}`;
+}
+
+function toBEU16(num){
+ let d = new Uint16Array(1);
+ d[0] = num;
+ return Buffer.from(d.buffer).swap16()
+}
+
+async function parseAnim(file){
+ let fimport = `./${file.replace('.js', '')}`
+ let data = require(fimport)
+ for(let id of fimport.split('_').slice(1)){
+ let anim = data['anim_'+id];
+ let hOffset = bytes.indexOf(Buffer.concat(anim.slice(0, 6).map(toBEU16)));
+
+ let bswValues = Buffer.concat(anim[6].map(toBEU16));
+ let vsOffset = bytes.indexOf(bswValues);
+ let bswIndices = Buffer.concat(anim[7].map(toBEU16));
+ let idxOffset = bytes.indexOf(bswIndices);
+ console.log(`"assets/anims/anim_${id}.anim": ${JSON.stringify({
+ header: [hOffset, 0x18],
+ values: [vsOffset, bswValues.length],
+ indices: [idxOffset, bswIndices.length],
+ })},`);
+ }
+}
+
+async function main(){
+ bytes = fs.readFileSync('./baserom.us.z64');
+ let tst = [0x46,0x00,0x52,0x00,0x54,0x00,0x56,0x00,0x58,0x00,0x5a,0x00,0x5c,0x00,0x5e,0x00,0x60,0x00,0x62,0x00,0x64,0x00,0x67,0x00,0x69,0x00,0x6b,0x00,0x6d,0x00,0x6f,0x00,0x71,0x00,0x73,0x00,0x75,0x00,0x77,0x00,0x79,0x00,0x7b,0x00,0x7d,0x00,0x7f,0x00,0x81,0x00,0x83,0x00,0x85,0x00,0x87,0x00,0x89,0x00,0x8b,0x00,0x8d,0x00,0x8f,0x00,0x91,0x00,0x93,0x00,0x95,0x00,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00,0x01,0x22,0x01,0x11,0x01,0x22,0x01,0x0e,0x01,0x13,0x01,0x0f,0x01,0x12,0x01,0x0b,0x01,0x0d,0x02,0x21,0x10,0x01,0x14,0x01,0x15,0x01,0x16,0x01,0x17,0x01,0x18,0x01,0x12,0x01,0x19,0x01,0x1f,0x01,0x21,0x01,0x1a,0x01,0x0e,0x01,0x1b,0x01,0x1a,0x01,0x1c,0x01,0x1d,0x01,0x25,0x01,0x14,0x01,0x20,0x01,0x1e,0x01,0x1b,0x01,0x1a,0x01,0x23,0x01,0x24,0x01,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00];
+ let text = Buffer.from(tst)
+ console.log(bytes.indexOf(text))
+}
+
+main(); \ No newline at end of file