diff --git a/data/dynos_bin_lvl.cpp b/data/dynos_bin_lvl.cpp index d55e4db9..c9e837a2 100644 --- a/data/dynos_bin_lvl.cpp +++ b/data/dynos_bin_lvl.cpp @@ -6,11 +6,11 @@ extern "C" { #include "include/surface_terrains.h" #include "include/seq_ids.h" #include "level_commands.h" -#include "src/game/level_update.h" +#include "game/level_update.h" #include "include/dialog_ids.h" #include "levels/scripts.h" #include "levels/menu/header.h" -#include "src/game/area.h" +#include "game/area.h" } // Free data pointers, but keep nodes and tokens intact @@ -687,8 +687,6 @@ static void ParseLevelScriptSymbol(GfxData* aGfxData, DataNode* aNo lvl_symbol_3(MARIO, 2, 0, 0); // warps - lvl_symbol_5(WARP_NODE, 0, 0, 0); - lvl_symbol_5(PAINTING_WARP_NODE, 0, 0, 0); lvl_symbol_5(INSTANT_WARP, 0, 0, 0); // misc @@ -816,16 +814,64 @@ static void ParseLevelScriptSymbol(GfxData* aGfxData, DataNode* aNo // JUMP_AREA if (_Symbol == "JUMP_AREA") { - LevelScript _Arg0 = ParseLevelScriptSymbolArg(aGfxData, aNode, aTokenIndex); - LevelScript _Arg1 = ParseLevelScriptSymbolArg(aGfxData, aNode, aTokenIndex); - LevelScript _Arg2 = ParseLevelScriptSymbolArg(aGfxData, aNode, aTokenIndex); + LevelScript op = ParseLevelScriptSymbolArg(aGfxData, aNode, aTokenIndex); + LevelScript arg = ParseLevelScriptSymbolArg(aGfxData, aNode, aTokenIndex); + LevelScript target = ParseLevelScriptSymbolArg(aGfxData, aNode, aTokenIndex); aGfxData->mPointerList.Add(aHead + 2); - LevelScript _Ls[] = { JUMP_AREA_EXT(_Arg0, _Arg1, _Arg2) }; + LevelScript _Ls[] = { JUMP_AREA_EXT(op, arg, target) }; memcpy(aHead, _Ls, sizeof(_Ls)); aHead += (sizeof(_Ls) / sizeof(_Ls[0])); return; } + // WARP_NODE + if (_Symbol == "WARP_NODE") { + u64 topTokenIndex = aTokenIndex; + + bool foundLevel = true; + LevelScript id = ParseLevelScriptSymbolArg(aGfxData, aNode, aTokenIndex); + LevelScript destLevel = ParseLevelScriptSymbolArgInternal(aGfxData, aNode, aTokenIndex, &foundLevel); + LevelScript destArea = ParseLevelScriptSymbolArg(aGfxData, aNode, aTokenIndex); + LevelScript destNode = ParseLevelScriptSymbolArg(aGfxData, aNode, aTokenIndex); + LevelScript flags = ParseLevelScriptSymbolArg(aGfxData, aNode, aTokenIndex); + + if (foundLevel) { + LevelScript _Ls[] = { WARP_NODE(id, destLevel, destArea, destNode, flags) }; + memcpy(aHead, _Ls, sizeof(_Ls)); + aHead += (sizeof(_Ls) / sizeof(_Ls[0])); + } else { + s16 destLevelIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 1, aNode->mTokens[topTokenIndex + 1]); + LevelScript _Ls[] = { WARP_NODE(id, destLevelIndex, destArea, destNode, flags) }; + memcpy(aHead, _Ls, sizeof(_Ls)); + aHead += (sizeof(_Ls) / sizeof(_Ls[0])); + } + return; + } + + // PAINTING_WARP_NODE + if (_Symbol == "PAINTING_WARP_NODE") { + u64 topTokenIndex = aTokenIndex; + + bool foundLevel = true; + LevelScript id = ParseLevelScriptSymbolArg(aGfxData, aNode, aTokenIndex); + LevelScript destLevel = ParseLevelScriptSymbolArgInternal(aGfxData, aNode, aTokenIndex, &foundLevel); + LevelScript destArea = ParseLevelScriptSymbolArg(aGfxData, aNode, aTokenIndex); + LevelScript destNode = ParseLevelScriptSymbolArg(aGfxData, aNode, aTokenIndex); + LevelScript flags = ParseLevelScriptSymbolArg(aGfxData, aNode, aTokenIndex); + + if (foundLevel) { + LevelScript _Ls[] = { PAINTING_WARP_NODE(id, destLevel, destArea, destNode, flags) }; + memcpy(aHead, _Ls, sizeof(_Ls)); + aHead += (sizeof(_Ls) / sizeof(_Ls[0])); + } else { + s16 destLevelIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 1, aNode->mTokens[topTokenIndex + 1]); + LevelScript _Ls[] = { PAINTING_WARP_NODE(id, destLevelIndex, destArea, destNode, flags) }; + memcpy(aHead, _Ls, sizeof(_Ls)); + aHead += (sizeof(_Ls) / sizeof(_Ls[0])); + } + return; + } + // Unknown PrintDataError(" ERROR: Unknown lvl symbol: %s", _Symbol.begin()); }