From d15ebf29d3482b8661999512e4942a7ab0e251f1 Mon Sep 17 00:00:00 2001 From: Agent X <44549182+Agent-11@users.noreply.github.com> Date: Wed, 17 Apr 2024 17:40:53 -0400 Subject: [PATCH] Make WARP_NODE commands able to read custom Lua registered levels --- data/dynos_bin_lvl.cpp | 62 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 8 deletions(-) diff --git a/data/dynos_bin_lvl.cpp b/data/dynos_bin_lvl.cpp index d55e4db93..c9e837a21 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()); }