sm64ex-coop/data/dynos_bin_macro_object.cpp

517 lines
22 KiB
C++
Raw Normal View History

2022-04-02 02:19:26 +02:00
#include "dynos.cpp.h"
extern "C" {
#include "include/level_misc_macros.h"
#include "include/macro_preset_names.h"
}
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wnarrowing"
/////////////
// Parsing //
/////////////
#define MACRO_OBJECT_SIZE_PER_TOKEN 4
#define macro_object_constant(x) if (_Arg == #x) { return (s64) (x); }
static s64 ParseMacroObjectSymbolArg(GfxData* aGfxData, DataNode<MacroObject>* aNode, u64& aTokenIndex) {
const String& _Arg = aNode->mTokens[aTokenIndex++];
// Surface constants
macro_object_constant(macro_yellow_coin);
macro_object_constant(macro_yellow_coin_2);
macro_object_constant(macro_moving_blue_coin);
macro_object_constant(macro_sliding_blue_coin);
macro_object_constant(macro_red_coin);
macro_object_constant(macro_empty_5);
macro_object_constant(macro_coin_line_horizontal);
macro_object_constant(macro_coin_ring_horizontal);
macro_object_constant(macro_coin_arrow);
macro_object_constant(macro_coin_line_horizontal_flying);
macro_object_constant(macro_coin_line_vertical);
macro_object_constant(macro_coin_ring_horizontal_flying);
macro_object_constant(macro_coin_ring_vertical);
macro_object_constant(macro_coin_arrow_flying);
macro_object_constant(macro_hidden_star_trigger);
macro_object_constant(macro_empty_15);
macro_object_constant(macro_empty_16);
macro_object_constant(macro_empty_17);
macro_object_constant(macro_empty_18);
macro_object_constant(macro_empty_19);
macro_object_constant(macro_fake_star);
macro_object_constant(macro_wooden_signpost);
macro_object_constant(macro_cannon_closed);
macro_object_constant(macro_bobomb_buddy_opens_cannon);
macro_object_constant(macro_butterfly);
macro_object_constant(macro_bouncing_fireball_copy);
macro_object_constant(macro_fish_group_3);
macro_object_constant(macro_fish_group);
macro_object_constant(macro_unknown_28);
macro_object_constant(macro_hidden_1up_in_pole);
macro_object_constant(macro_huge_goomba);
macro_object_constant(macro_tiny_goomba);
macro_object_constant(macro_goomba_triplet_spawner);
macro_object_constant(macro_goomba_quintuplet_spawner);
macro_object_constant(macro_sign_on_wall);
macro_object_constant(macro_chuckya);
macro_object_constant(macro_cannon_open);
macro_object_constant(macro_goomba);
macro_object_constant(macro_homing_amp);
macro_object_constant(macro_circling_amp);
macro_object_constant(macro_unknown_40);
macro_object_constant(macro_unknown_41);
macro_object_constant(macro_free_bowling_ball);
macro_object_constant(macro_snufit);
macro_object_constant(macro_recovery_heart);
macro_object_constant(macro_1up_sliding);
macro_object_constant(macro_1up);
macro_object_constant(macro_1up_jump_on_approach);
macro_object_constant(macro_hidden_1up);
macro_object_constant(macro_hidden_1up_trigger);
macro_object_constant(macro_1up_2);
macro_object_constant(macro_1up_3);
macro_object_constant(macro_empty_52);
macro_object_constant(macro_blue_coin_switch);
macro_object_constant(macro_hidden_blue_coin);
macro_object_constant(macro_wing_cap_switch);
macro_object_constant(macro_metal_cap_switch);
macro_object_constant(macro_vanish_cap_switch);
macro_object_constant(macro_yellow_cap_switch);
macro_object_constant(macro_unknown_59);
macro_object_constant(macro_box_wing_cap);
macro_object_constant(macro_box_metal_cap);
macro_object_constant(macro_box_vanish_cap);
macro_object_constant(macro_box_koopa_shell);
macro_object_constant(macro_box_one_coin);
macro_object_constant(macro_box_three_coins);
macro_object_constant(macro_box_ten_coins);
macro_object_constant(macro_box_1up);
macro_object_constant(macro_box_star_1);
macro_object_constant(macro_breakable_box_no_coins);
macro_object_constant(macro_breakable_box_three_coins);
macro_object_constant(macro_pushable_metal_box);
macro_object_constant(macro_breakable_box_small);
macro_object_constant(macro_floor_switch_hidden_objects);
macro_object_constant(macro_hidden_box);
macro_object_constant(macro_hidden_object_2);
macro_object_constant(macro_hidden_object_3);
macro_object_constant(macro_breakable_box_giant);
macro_object_constant(macro_koopa_shell_underwater);
macro_object_constant(macro_box_1up_running_away);
macro_object_constant(macro_empty_80);
macro_object_constant(macro_bullet_bill_cannon);
macro_object_constant(macro_heave_ho);
macro_object_constant(macro_empty_83);
macro_object_constant(macro_thwomp);
macro_object_constant(macro_fire_spitter);
macro_object_constant(macro_fire_fly_guy);
macro_object_constant(macro_jumping_box);
macro_object_constant(macro_butterfly_triplet);
macro_object_constant(macro_butterfly_triplet_2);
macro_object_constant(macro_empty_90);
macro_object_constant(macro_empty_91);
macro_object_constant(macro_empty_92);
macro_object_constant(macro_bully);
macro_object_constant(macro_bully_2);
macro_object_constant(macro_empty_95);
macro_object_constant(macro_unknown_96);
macro_object_constant(macro_bouncing_fireball);
macro_object_constant(macro_flamethrower);
macro_object_constant(macro_empty_99);
macro_object_constant(macro_empty_100);
macro_object_constant(macro_empty_101);
macro_object_constant(macro_empty_102);
macro_object_constant(macro_empty_103);
macro_object_constant(macro_empty_104);
macro_object_constant(macro_empty_105);
macro_object_constant(macro_wooden_post);
macro_object_constant(macro_water_bomb_spawner);
macro_object_constant(macro_enemy_lakitu);
macro_object_constant(macro_bob_koopa_the_quick);
macro_object_constant(macro_koopa_race_endpoint);
macro_object_constant(macro_bobomb);
macro_object_constant(macro_water_bomb_cannon_copy);
macro_object_constant(macro_bobomb_buddy_opens_cannon_copy);
macro_object_constant(macro_water_bomb_cannon);
macro_object_constant(macro_bobomb_still);
macro_object_constant(macro_empty_116);
macro_object_constant(macro_empty_117);
macro_object_constant(macro_empty_118);
macro_object_constant(macro_empty_119);
macro_object_constant(macro_empty_120);
macro_object_constant(macro_empty_121);
macro_object_constant(macro_empty_122);
macro_object_constant(macro_unknown_123);
macro_object_constant(macro_empty_124);
macro_object_constant(macro_unagi);
macro_object_constant(macro_sushi);
macro_object_constant(macro_empty_127);
macro_object_constant(macro_empty_128);
macro_object_constant(macro_empty_129);
macro_object_constant(macro_empty_130);
macro_object_constant(macro_empty_131);
macro_object_constant(macro_empty_132);
macro_object_constant(macro_empty_133);
macro_object_constant(macro_empty_134);
macro_object_constant(macro_empty_135);
macro_object_constant(macro_empty_136);
macro_object_constant(macro_unknown_137);
macro_object_constant(macro_tornado);
macro_object_constant(macro_pokey);
macro_object_constant(macro_pokey_copy);
macro_object_constant(macro_tox_box);
macro_object_constant(macro_empty_142);
macro_object_constant(macro_empty_143);
macro_object_constant(macro_empty_144);
macro_object_constant(macro_empty_145);
macro_object_constant(macro_empty_146);
macro_object_constant(macro_empty_147);
macro_object_constant(macro_empty_148);
macro_object_constant(macro_empty_149);
macro_object_constant(macro_empty_150);
macro_object_constant(macro_monty_mole_2);
macro_object_constant(macro_monty_mole);
macro_object_constant(macro_monty_mole_hole);
macro_object_constant(macro_fly_guy);
macro_object_constant(macro_empty_155);
macro_object_constant(macro_wiggler);
macro_object_constant(macro_empty_157);
macro_object_constant(macro_empty_158);
macro_object_constant(macro_empty_159);
macro_object_constant(macro_empty_160);
macro_object_constant(macro_empty_161);
macro_object_constant(macro_empty_162);
macro_object_constant(macro_empty_163);
macro_object_constant(macro_empty_164);
macro_object_constant(macro_spindrift);
macro_object_constant(macro_mr_blizzard);
macro_object_constant(macro_mr_blizzard_copy);
macro_object_constant(macro_empty_168);
macro_object_constant(macro_small_penguin);
macro_object_constant(macro_tuxies_mother);
macro_object_constant(macro_tuxies_mother_copy);
macro_object_constant(macro_mr_blizzard_2);
macro_object_constant(macro_empty_173);
macro_object_constant(macro_empty_174);
macro_object_constant(macro_empty_175);
macro_object_constant(macro_empty_176);
macro_object_constant(macro_empty_177);
macro_object_constant(macro_empty_178);
macro_object_constant(macro_empty_179);
macro_object_constant(macro_empty_180);
macro_object_constant(macro_empty_181);
macro_object_constant(macro_empty_182);
macro_object_constant(macro_empty_183);
macro_object_constant(macro_empty_184);
macro_object_constant(macro_empty_185);
macro_object_constant(macro_empty_186);
macro_object_constant(macro_empty_187);
macro_object_constant(macro_empty_188);
macro_object_constant(macro_haunted_chair_copy);
macro_object_constant(macro_haunted_chair);
macro_object_constant(macro_haunted_chair_copy2);
macro_object_constant(macro_boo);
macro_object_constant(macro_boo_copy);
macro_object_constant(macro_boo_group);
macro_object_constant(macro_boo_with_cage);
macro_object_constant(macro_beta_key);
macro_object_constant(macro_empty_197);
macro_object_constant(macro_empty_198);
macro_object_constant(macro_empty_199);
macro_object_constant(macro_empty_200);
macro_object_constant(macro_empty_201);
macro_object_constant(macro_empty_202);
macro_object_constant(macro_empty_203);
macro_object_constant(macro_empty_204);
macro_object_constant(macro_empty_205);
macro_object_constant(macro_empty_206);
macro_object_constant(macro_empty_207);
macro_object_constant(macro_empty_208);
macro_object_constant(macro_empty_209);
macro_object_constant(macro_empty_210);
macro_object_constant(macro_empty_211);
macro_object_constant(macro_empty_212);
macro_object_constant(macro_empty_213);
macro_object_constant(macro_empty_214);
macro_object_constant(macro_empty_215);
macro_object_constant(macro_empty_216);
macro_object_constant(macro_empty_217);
macro_object_constant(macro_empty_218);
macro_object_constant(macro_empty_219);
macro_object_constant(macro_empty_220);
macro_object_constant(macro_empty_221);
macro_object_constant(macro_empty_222);
macro_object_constant(macro_empty_223);
macro_object_constant(macro_empty_224);
macro_object_constant(macro_empty_225);
macro_object_constant(macro_empty_226);
macro_object_constant(macro_empty_227);
macro_object_constant(macro_empty_228);
macro_object_constant(macro_empty_229);
macro_object_constant(macro_empty_230);
macro_object_constant(macro_empty_231);
macro_object_constant(macro_empty_232);
macro_object_constant(macro_empty_233);
macro_object_constant(macro_chirp_chirp);
macro_object_constant(macro_seaweed_bundle);
macro_object_constant(macro_beta_chest);
macro_object_constant(macro_water_mine);
macro_object_constant(macro_fish_group_4);
macro_object_constant(macro_fish_group_2);
macro_object_constant(macro_jet_stream_ring_spawner);
macro_object_constant(macro_jet_stream_ring_spawner_copy);
macro_object_constant(macro_skeeter);
macro_object_constant(macro_clam_shell);
macro_object_constant(macro_empty_244);
macro_object_constant(macro_empty_245);
macro_object_constant(macro_empty_246);
macro_object_constant(macro_empty_247);
macro_object_constant(macro_empty_248);
macro_object_constant(macro_empty_249);
macro_object_constant(macro_empty_250);
macro_object_constant(macro_ukiki);
macro_object_constant(macro_ukiki_2);
macro_object_constant(macro_piranha_plant);
macro_object_constant(macro_empty_254);
macro_object_constant(macro_whomp);
macro_object_constant(macro_chain_chomp);
macro_object_constant(macro_empty_257);
macro_object_constant(macro_koopa);
macro_object_constant(macro_koopa_shellless);
macro_object_constant(macro_wooden_post_copy);
macro_object_constant(macro_fire_piranha_plant);
macro_object_constant(macro_fire_piranha_plant_2);
macro_object_constant(macro_thi_koopa_the_quick);
macro_object_constant(macro_empty_264);
macro_object_constant(macro_empty_265);
macro_object_constant(macro_empty_266);
macro_object_constant(macro_empty_267);
macro_object_constant(macro_empty_268);
macro_object_constant(macro_empty_269);
macro_object_constant(macro_empty_270);
macro_object_constant(macro_empty_271);
macro_object_constant(macro_empty_272);
macro_object_constant(macro_empty_273);
macro_object_constant(macro_empty_274);
macro_object_constant(macro_empty_275);
macro_object_constant(macro_empty_276);
macro_object_constant(macro_empty_277);
macro_object_constant(macro_empty_278);
macro_object_constant(macro_empty_279);
macro_object_constant(macro_empty_280);
macro_object_constant(macro_moneybag);
macro_object_constant(macro_empty_282);
macro_object_constant(macro_empty_283);
macro_object_constant(macro_empty_284);
macro_object_constant(macro_empty_285);
macro_object_constant(macro_empty_286);
macro_object_constant(macro_empty_287);
macro_object_constant(macro_empty_288);
macro_object_constant(macro_swoop);
macro_object_constant(macro_swoop_2);
macro_object_constant(macro_mr_i);
macro_object_constant(macro_scuttlebug_spawner);
macro_object_constant(macro_scuttlebug);
macro_object_constant(macro_empty_294);
macro_object_constant(macro_empty_295);
macro_object_constant(macro_empty_296);
macro_object_constant(macro_empty_297);
macro_object_constant(macro_empty_298);
macro_object_constant(macro_empty_299);
macro_object_constant(macro_empty_300);
macro_object_constant(macro_empty_301);
macro_object_constant(macro_empty_302);
macro_object_constant(macro_unknown_303);
macro_object_constant(macro_empty_304);
macro_object_constant(macro_empty_305);
macro_object_constant(macro_empty_306);
macro_object_constant(macro_empty_307);
macro_object_constant(macro_empty_308);
macro_object_constant(macro_empty_309);
macro_object_constant(macro_empty_310);
macro_object_constant(macro_empty_311);
macro_object_constant(macro_empty_312);
macro_object_constant(macro_ttc_rotating_cube);
macro_object_constant(macro_ttc_rotating_prism);
macro_object_constant(macro_ttc_pendulum);
macro_object_constant(macro_ttc_large_treadmill);
macro_object_constant(macro_ttc_small_treadmill);
macro_object_constant(macro_ttc_push_block);
macro_object_constant(macro_ttc_rotating_hexagon);
macro_object_constant(macro_ttc_rotating_triangle);
macro_object_constant(macro_ttc_pit_block);
macro_object_constant(macro_ttc_pit_block_2);
macro_object_constant(macro_ttc_elevator_platform);
macro_object_constant(macro_ttc_clock_hand);
macro_object_constant(macro_ttc_spinner);
macro_object_constant(macro_ttc_small_gear);
macro_object_constant(macro_ttc_large_gear);
macro_object_constant(macro_ttc_large_treadmill_2);
macro_object_constant(macro_ttc_small_treadmill_2);
macro_object_constant(macro_empty_330);
macro_object_constant(macro_empty_331);
macro_object_constant(macro_empty_332);
macro_object_constant(macro_empty_333);
macro_object_constant(macro_empty_334);
macro_object_constant(macro_empty_335);
macro_object_constant(macro_empty_336);
macro_object_constant(macro_empty_337);
macro_object_constant(macro_empty_338);
macro_object_constant(macro_box_star_2);
macro_object_constant(macro_box_star_3);
macro_object_constant(macro_box_star_4);
macro_object_constant(macro_box_star_5);
macro_object_constant(macro_box_star_6);
macro_object_constant(macro_empty_344);
macro_object_constant(macro_empty_345);
macro_object_constant(macro_empty_346);
macro_object_constant(macro_empty_347);
macro_object_constant(macro_empty_348);
macro_object_constant(macro_empty_349);
macro_object_constant(macro_bits_sliding_platform);
macro_object_constant(macro_bits_twin_sliding_platforms);
macro_object_constant(macro_bits_unknown_352);
macro_object_constant(macro_bits_octagonal_platform);
macro_object_constant(macro_bits_staircase);
macro_object_constant(macro_empty_355);
macro_object_constant(macro_empty_356);
macro_object_constant(macro_bits_ferris_wheel_axle);
macro_object_constant(macro_bits_arrow_platform);
macro_object_constant(macro_bits_seesaw_platform);
macro_object_constant(macro_bits_tilting_w_platform);
macro_object_constant(macro_empty_361);
macro_object_constant(macro_empty_362);
macro_object_constant(macro_empty_363);
macro_object_constant(macro_empty_364);
macro_object_constant(macro_empty_365);
// Other constants
macro_object_constant(NULL);
// Integers
s32 x;
if ((_Arg[1] == 'x' && sscanf(_Arg.begin(), "%x", &x) == 1) || (sscanf(_Arg.begin(), "%d", &x) == 1)) {
return (s64) x;
}
// Check level constants
bool constantFound = false;
s64 constantValue = DynOS_Lvl_ParseLevelScriptConstants(_Arg, &constantFound);
if (constantFound) {
return (LevelScript) constantValue;
}
2022-04-02 02:19:26 +02:00
// Unknown
PrintError(" ERROR: Unknown macro object arg: %s", _Arg.begin());
return 0;
}
#define macro_object_symbol_0(symb) \
if (_Symbol == #symb) { \
MacroObject _Mo[] = { symb() }; \
memcpy(aHead, _Mo, sizeof(_Mo)); \
aHead += (sizeof(_Mo) / sizeof(_Mo[0])); \
return; \
}
#define macro_object_symbol_5(symb) \
if (_Symbol == #symb) { \
s64 _Arg0 = ParseMacroObjectSymbolArg(aGfxData, aNode, aTokenIndex); \
s64 _Arg1 = ParseMacroObjectSymbolArg(aGfxData, aNode, aTokenIndex); \
s64 _Arg2 = ParseMacroObjectSymbolArg(aGfxData, aNode, aTokenIndex); \
s64 _Arg3 = ParseMacroObjectSymbolArg(aGfxData, aNode, aTokenIndex); \
s64 _Arg4 = ParseMacroObjectSymbolArg(aGfxData, aNode, aTokenIndex); \
MacroObject _Mo[] = { symb(_Arg0, _Arg1, _Arg2, _Arg3, _Arg4) }; \
memcpy(aHead, _Mo, sizeof(_Mo)); \
aHead += (sizeof(_Mo) / sizeof(_Mo[0])); \
return; \
}
#define macro_object_symbol_6(symb) \
if (_Symbol == #symb) { \
s64 _Arg0 = ParseMacroObjectSymbolArg(aGfxData, aNode, aTokenIndex); \
s64 _Arg1 = ParseMacroObjectSymbolArg(aGfxData, aNode, aTokenIndex); \
s64 _Arg2 = ParseMacroObjectSymbolArg(aGfxData, aNode, aTokenIndex); \
s64 _Arg3 = ParseMacroObjectSymbolArg(aGfxData, aNode, aTokenIndex); \
s64 _Arg4 = ParseMacroObjectSymbolArg(aGfxData, aNode, aTokenIndex); \
s64 _Arg5 = ParseMacroObjectSymbolArg(aGfxData, aNode, aTokenIndex); \
MacroObject _Mo[] = { symb(_Arg0, _Arg1, _Arg2, _Arg3, _Arg4, _Arg5) }; \
memcpy(aHead, _Mo, sizeof(_Mo)); \
aHead += (sizeof(_Mo) / sizeof(_Mo[0])); \
return; \
}
static void ParseMacroObjectSymbol(GfxData* aGfxData, DataNode<MacroObject>* aNode, MacroObject*& aHead, u64& aTokenIndex, Array<u64>& aSwitchNodes) {
const String& _Symbol = aNode->mTokens[aTokenIndex++];
macro_object_symbol_5(MACRO_OBJECT);
macro_object_symbol_6(MACRO_OBJECT_WITH_BEH_PARAM);
macro_object_symbol_0(MACRO_OBJECT_END);
// Unknown
PrintError(" ERROR: Unknown macro object symbol: %s", _Symbol.begin());
}
DataNode<MacroObject>* DynOS_MacroObject_Parse(GfxData* aGfxData, DataNode<MacroObject>* aNode, bool aDisplayPercent) {
if (aNode->mData) return aNode;
// MacroObject data
aNode->mData = New<MacroObject>(aNode->mTokens.Count() * MACRO_OBJECT_SIZE_PER_TOKEN);
MacroObject* _Head = aNode->mData;
Array<u64> _SwitchNodes;
for (u64 _TokenIndex = 0; _TokenIndex < aNode->mTokens.Count();) { // Don't increment _TokenIndex here!
ParseMacroObjectSymbol(aGfxData, aNode, _Head, _TokenIndex, _SwitchNodes);
if (aDisplayPercent && aGfxData->mErrorCount == 0) { PrintNoNewLine("%3d%%\b\b\b\b", (s32) (_TokenIndex * 100) / aNode->mTokens.Count()); }
}
if (aDisplayPercent && aGfxData->mErrorCount == 0) { Print("100%%"); }
aNode->mSize = (u32)(_Head - aNode->mData);
aNode->mLoadIndex = aGfxData->mLoadIndex++;
return aNode;
}
#pragma GCC diagnostic pop
/////////////
// Writing //
/////////////
void DynOS_MacroObject_Write(FILE* aFile, GfxData* aGfxData, DataNode<MacroObject> *aNode) {
if (!aNode->mData) return;
// Name
WriteBytes<u8>(aFile, DATA_TYPE_MACRO_OBJECT);
aNode->mName.Write(aFile);
// Data
WriteBytes<u32>(aFile, aNode->mSize);
for (u32 i = 0; i != aNode->mSize; ++i) {
WriteBytes<MacroObject>(aFile, aNode->mData[i]);
}
}
/////////////
// Reading //
/////////////
DataNode<MacroObject>* DynOS_MacroObject_Load(FILE *aFile, GfxData *aGfxData) {
DataNode<MacroObject> *_Node = New<DataNode<MacroObject>>();
// Name
_Node->mName.Read(aFile);
// Data
_Node->mSize = ReadBytes<u32>(aFile);
_Node->mData = New<MacroObject>(_Node->mSize);
for (u32 i = 0; i != _Node->mSize; ++i) {
_Node->mData[i] = ReadBytes<MacroObject>(aFile);
}
// Add it
if (aGfxData != NULL) {
aGfxData->mMacroObjects.Add(_Node);
}
return _Node;
}