diff options
| author | KiritoDv <kiritodev01@gmail.com> | 2023-08-24 23:13:48 -0600 |
|---|---|---|
| committer | KiritoDv <kiritodev01@gmail.com> | 2023-08-24 23:13:48 -0600 |
| commit | 64eddebf4d45b4775f6e9f248cbfaa1cb3ab55f2 (patch) | |
| tree | c0fc5b1aedb1021544bf50454d6b44ef20f2bffb | |
| parent | 15a0cf5498b60fa1442d049dbe5bb856022b5641 (diff) | |
Added animation factory and some random tools
| -rw-r--r-- | .gitignore | 3 | ||||
| -rw-r--r-- | assets.json | 215 | ||||
| -rw-r--r-- | src/Companion.cpp | 6 | ||||
| -rw-r--r-- | src/factories/AnimFactory.cpp | 67 | ||||
| -rw-r--r-- | src/factories/AnimFactory.h | 9 | ||||
| -rw-r--r-- | src/factories/BlobFactory.cpp | 6 | ||||
| -rw-r--r-- | src/factories/BlobFactory.h | 3 | ||||
| -rw-r--r-- | src/factories/RawFactory.cpp | 4 | ||||
| -rw-r--r-- | src/factories/RawFactory.h | 5 | ||||
| -rw-r--r-- | src/factories/ResourceType.h | 1 | ||||
| -rw-r--r-- | src/factories/TextureFactory.cpp | 1 | ||||
| -rw-r--r-- | tools/anim_offsets.js | 63 | ||||
| -rwxr-xr-x | tools/gen_anim_offsets.py | 51 | ||||
| -rw-r--r-- | tools/text_offsets.js | 47 |
14 files changed, 470 insertions, 11 deletions
@@ -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 |
