From 8646b50ae53db3a689f98af38b33b0ff7f47f29b Mon Sep 17 00:00:00 2001 From: MysterD Date: Tue, 5 Apr 2022 00:22:09 -0700 Subject: [PATCH] Fixed how DynOS writes lua variables into level scripts, added all level geos --- data/dynos.cpp.h | 11 +- data/dynos_bin_actor.cpp | 28 ++- data/dynos_bin_gfx.cpp | 69 +++--- data/dynos_bin_lvl.cpp | 63 ++---- data/dynos_bin_pointer.cpp | 46 ++-- data/dynos_bin_read.cpp | 23 -- data/dynos_bin_utils.cpp | 34 ++- data/dynos_misc.cpp | 436 ++++++++++++++++++++++++++++++++++++- 8 files changed, 581 insertions(+), 129 deletions(-) diff --git a/data/dynos.cpp.h b/data/dynos.cpp.h index 4752fe7a..49cfff09 100644 --- a/data/dynos.cpp.h +++ b/data/dynos.cpp.h @@ -450,6 +450,7 @@ struct GfxData : NoCopy { // Generate Array *> mGenerateGeoLayouts; + Array *> mGenerateLevelScripts; // Current u64 mLoadIndex = 0; @@ -458,7 +459,8 @@ struct GfxData : NoCopy { s32 mModIndex = 0; SysPath mPackFolder; Array mPointerList; - Array mPointerTokenList; + Array mLuaPointerList; + Array mLuaTokenList; GfxContext mGfxContext; Array mGeoNodeStack; }; @@ -744,8 +746,11 @@ Collision* DynOS_Col_Get(const char* collisionName); // Bin // +typedef s64 (*RDConstantFunc)(const String& _Arg, bool* found); + +u32 DynOS_Lua_RememberVariable(GfxData* aGfxData, void* aPtr, String& token); void DynOS_Gfx_GeneratePacks(const char* directory); -s64 DynOS_RecursiveDescent_Parse(const char* expr, bool* success); +s64 DynOS_RecursiveDescent_Parse(const char* expr, bool* success, RDConstantFunc func); void DynOS_Read_Source(GfxData *aGfxData, const SysPath &aFilename); char *DynOS_Read_Buffer(FILE* aFile, GfxData* aGfxData); @@ -768,6 +773,7 @@ void DynOS_Geo_Load(FILE *aFile, GfxData *aGfxData); DataNode* DynOS_Gfx_Parse(GfxData* aGfxData, DataNode* aNode); void DynOS_Gfx_Write(FILE *aFile, GfxData *aGfxData, DataNode *aNode); void DynOS_Gfx_Load(FILE *aFile, GfxData *aGfxData); +s64 DynOS_Gfx_ParseGfxConstants(const String& _Arg, bool* found); DataNode* DynOS_Lights_Parse(GfxData* aGfxData, DataNode* aNode); void DynOS_Lights_Write(FILE* aFile, GfxData* aGfxData, DataNode *aNode); @@ -810,6 +816,7 @@ DataNode* DynOS_Vtx_Parse(GfxData* aGfxData, DataNode* aNode); void DynOS_Vtx_Write(FILE* aFile, GfxData* aGfxData, DataNode *aNode); void DynOS_Vtx_Load(FILE *aFile, GfxData *aGfxData); +void DynOS_Pointer_Lua_Write(FILE* aFile, u32 index, GfxData* aGfxData); void DynOS_Pointer_Write(FILE* aFile, const void* aPtr, GfxData* aGfxData); void *DynOS_Pointer_Load(FILE *aFile, GfxData *aGfxData, u32 aValue, bool isLvl); diff --git a/data/dynos_bin_actor.cpp b/data/dynos_bin_actor.cpp index 34c285e8..ea6784c5 100644 --- a/data/dynos_bin_actor.cpp +++ b/data/dynos_bin_actor.cpp @@ -154,7 +154,8 @@ static void DynOS_Actor_Generate(const SysPath &aPackFolder, ArraymModelIdentifier = _GeoNode->mModelIdentifier; _GfxData->mPackFolder = aPackFolder; _GfxData->mPointerList = { NULL }; // The NULL pointer is needed, so we add it here - _GfxData->mPointerTokenList = { }; + _GfxData->mLuaPointerList = { }; + _GfxData->mLuaTokenList = { }; _GfxData->mGfxContext.mCurrentTexture = NULL; _GfxData->mGfxContext.mCurrentPalette = NULL; _GfxData->mGeoNodeStack.Clear(); @@ -228,9 +229,34 @@ void DynOS_Actor_GeneratePack(const SysPath &aPackFolder) { SysPath _Folder = fstring("%s/%s", aPackFolder.c_str(), _PackEnt->d_name); if (fs_sys_dir_exists(_Folder.c_str())) { _GfxData->mModelIdentifier = 0; + + // Remember the geo layout count + s32 prevGeoLayoutCount = _GfxData->mGeoLayouts.Count(); + DynOS_Read_Source(_GfxData, fstring("%s/model.inc.c", _Folder.c_str())); DynOS_Read_Source(_GfxData, fstring("%s/geo.inc.c", _Folder.c_str())); DynOS_Read_Source(_GfxData, fstring("%s/collision.inc.c", _Folder.c_str())); + + // Figure out which geo layouts to generate + s32 geoLayoutCount = _GfxData->mGeoLayouts.Count(); + if (geoLayoutCount > prevGeoLayoutCount) { + // find actors to generate + bool foundActor = false; + for (s32 i = prevGeoLayoutCount; i < geoLayoutCount; i++) { + String _GeoRootName = _GfxData->mGeoLayouts[i]->mName; + const void* actor = DynOS_Geo_GetActorLayoutFromName(_GeoRootName.begin()); + if (actor != NULL) { + foundActor = true; + _GfxData->mGenerateGeoLayouts.Add(_GfxData->mGeoLayouts[i]); + } + } + + // if we haven't found an actor, just add the last geo layout found + if (!foundActor) { + _GfxData->mGenerateGeoLayouts.Add(_GfxData->mGeoLayouts[geoLayoutCount - 1]); + } + } + if (_GfxData->mModelIdentifier != 0) { _ActorsFolders.Add({ _GfxData->mModelIdentifier, String(_PackEnt->d_name) }); } diff --git a/data/dynos_bin_gfx.cpp b/data/dynos_bin_gfx.cpp index 37da1b25..5bcc3c06 100644 --- a/data/dynos_bin_gfx.cpp +++ b/data/dynos_bin_gfx.cpp @@ -15,18 +15,9 @@ extern "C" { ///////////// #define gfx_constant(x) if (_Arg == #x) { return (s64) (x); } -static s64 ParseGfxSymbolArg(GfxData* aGfxData, DataNode* aNode, u64* pTokenIndex, const char *aPrefix) { - assert(aPrefix != NULL); - String _Token = (pTokenIndex != NULL ? aNode->mTokens[(*pTokenIndex)++] : ""); - String _Arg("%s%s", aPrefix, _Token.begin()); - // Offset - s32 _Offset = 0; - s32 _Plus = _Arg.Find('+'); - if (_Plus != -1) { - _Offset = _Arg.SubString(_Plus + 1).ParseInt(); - _Arg = _Arg.SubString(0, _Plus); - } +s64 DynOS_Gfx_ParseGfxConstants(const String& _Arg, bool* found) { + *found = true; // Constants gfx_constant(NULL); @@ -123,10 +114,6 @@ static s64 ParseGfxSymbolArg(GfxData* aGfxData, DataNode* aNode, u64* pToke gfx_constant(G_TX_CLAMP); gfx_constant(G_TX_NOMASK); gfx_constant(G_TX_NOLOD); - gfx_constant(G_TX_WRAP|G_TX_NOMIRROR); - gfx_constant(G_TX_WRAP|G_TX_MIRROR); - gfx_constant(G_TX_CLAMP|G_TX_NOMIRROR); - gfx_constant(G_TX_CLAMP|G_TX_MIRROR); // Render modes gfx_constant(G_RM_AA_ZB_OPA_SURF); @@ -239,14 +226,6 @@ static s64 ParseGfxSymbolArg(GfxData* aGfxData, DataNode* aNode, u64* pToke gfx_constant(G_TEXTURE_GEN_LINEAR); gfx_constant(G_LOD); gfx_constant(G_CLIPPING); - gfx_constant(G_FOG|G_TEXTURE_GEN); - gfx_constant(G_LIGHTING|G_CULL_BACK); - gfx_constant(G_LIGHTING|G_SHADING_SMOOTH); - gfx_constant(G_CULL_BACK|G_SHADING_SMOOTH); - gfx_constant(G_LIGHTING|G_CULL_BACK|G_SHADING_SMOOTH); - gfx_constant(G_TEXTURE_GEN|G_SHADING_SMOOTH); - gfx_constant(G_TEXTURE_GEN|G_LIGHTING|G_CULL_BACK); - gfx_constant(G_TEXTURE_GEN|G_CULL_BACK|G_SHADING_SMOOTH); // Alpha modes gfx_constant(G_AC_NONE); @@ -318,14 +297,13 @@ static s64 ParseGfxSymbolArg(GfxData* aGfxData, DataNode* aNode, u64* pToke gfx_constant(G_MW_FOG); gfx_constant(G_MW_LIGHTCOL); + // Texture/scale/rotate constants + gfx_constant(G_TEXTURE_IMAGE_FRAC); + gfx_constant(G_TEXTURE_SCALE_FRAC); + gfx_constant(G_SCALE_FRAC); + gfx_constant(G_ROTATE_FRAC); + // Common values - gfx_constant((4-1)<* aNode, u64* pToke gfx_constant(CALC_DXT(64,G_IM_SIZ_32b_BYTES)); gfx_constant(CALC_DXT(128,G_IM_SIZ_32b_BYTES)); gfx_constant(CALC_DXT(256,G_IM_SIZ_32b_BYTES)); - gfx_constant(G_CULL_BACK|G_LIGHTING); + + *found = false; + return 0; +} + +static s64 ParseGfxSymbolArg(GfxData* aGfxData, DataNode* aNode, u64* pTokenIndex, const char *aPrefix) { + assert(aPrefix != NULL); + String _Token = (pTokenIndex != NULL ? aNode->mTokens[(*pTokenIndex)++] : ""); + String _Arg("%s%s", aPrefix, _Token.begin()); + + bool constantFound = false; + s64 constantValue = DynOS_Gfx_ParseGfxConstants(_Arg, &constantFound); + if (constantFound) { + return constantValue; + } + + // Offset + s32 _Offset = 0; + s32 _Plus = _Arg.Find('+'); + if (_Plus != -1) { + _Offset = _Arg.SubString(_Plus + 1).ParseInt(); + _Arg = _Arg.SubString(0, _Plus); + } // Lights for (auto& _Node : aGfxData->mLights) { @@ -447,6 +447,13 @@ static s64 ParseGfxSymbolArg(GfxData* aGfxData, DataNode* aNode, u64* pToke return (s64) x; } + // Recursive descent parsing + bool rdSuccess = false; + s64 rdValue = DynOS_RecursiveDescent_Parse(_Arg.begin(), &rdSuccess, DynOS_Gfx_ParseGfxConstants); + if (rdSuccess) { + return (LevelScript)rdValue; + } + // Unknown PrintError(" ERROR: Unknown gfx arg: %s", _Arg.begin()); return 0; diff --git a/data/dynos_bin_lvl.cpp b/data/dynos_bin_lvl.cpp index d69ceb57..1eb97d77 100644 --- a/data/dynos_bin_lvl.cpp +++ b/data/dynos_bin_lvl.cpp @@ -65,8 +65,6 @@ void *DynOS_Lvl_GetFunctionPointerFromIndex(s32 aIndex) { #define lvl_constant(x) if (_Arg == #x) { return (LevelScript) (x); } -// TODO: this was made so that recursive descent can parse the constants... -// but RD should really use any function pointer passed to it s64 DynOS_Lvl_ParseLevelScriptConstants(const String& _Arg, bool* found) { *found = true; @@ -1391,6 +1389,10 @@ s64 DynOS_Lvl_ParseLevelScriptConstants(const String& _Arg, bool* found) { lvl_constant(WARP_TRANSITION_FADE_FROM_BOWSER); lvl_constant(WARP_TRANSITION_FADE_INTO_BOWSER); + // Other constants + lvl_constant(NULL); + lvl_constant(FALSE); + // vanilla actors s32 actorCount = DynOS_Geo_GetActorCount(); for (s32 i = 0; i < actorCount; i++) { @@ -1427,10 +1429,6 @@ static LevelScript ParseLevelScriptSymbolArgInternal(GfxData* aGfxData, DataNode return (LevelScript) constantValue; } - // Other constants - lvl_constant(NULL); - lvl_constant(FALSE); - // Level Scripts for (auto& _Node : aGfxData->mLevelScripts) { if (_Arg == _Node->mName) { @@ -1495,7 +1493,7 @@ static LevelScript ParseLevelScriptSymbolArgInternal(GfxData* aGfxData, DataNode // Recursive descent parsing bool rdSuccess = false; - s64 rdValue = DynOS_RecursiveDescent_Parse(_Arg.begin(), &rdSuccess); + s64 rdValue = DynOS_RecursiveDescent_Parse(_Arg.begin(), &rdSuccess, DynOS_Lvl_ParseLevelScriptConstants); if (rdSuccess) { return (LevelScript)rdValue; } @@ -1726,20 +1724,9 @@ static void ParseLevelScriptSymbol(GfxData* aGfxData, DataNode* aNo memcpy(aHead, _Ls, sizeof(_Ls)); aHead += (sizeof(_Ls) / sizeof(_Ls[0])); } else { - // remember model/beh as pointer - aGfxData->mPointerList.Add(aHead + 5); - aGfxData->mPointerList.Add(aHead + 6); - - // add model/beh tokens - u32 tokenListIndex = aGfxData->mPointerTokenList.Count(); - aGfxData->mPointerTokenList.Add(aNode->mTokens[topTokenIndex + 0]); - aGfxData->mPointerTokenList.Add(aNode->mTokens[topTokenIndex + 8]); - - // get model/beh tokens - String& modelToken = aGfxData->mPointerTokenList[tokenListIndex + 0]; - String& behToken = aGfxData->mPointerTokenList[tokenListIndex + 1]; - - LevelScript _Ls[] = { OBJECT_EXT(modelToken.begin(), posX, posY, posZ, angleX, angleY, angleZ, behParam, behToken.begin()) }; + u32 modelIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 5, aNode->mTokens[topTokenIndex + 0]); + u32 behIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 6, aNode->mTokens[topTokenIndex + 8]); + LevelScript _Ls[] = { OBJECT_EXT(modelIndex, posX, posY, posZ, angleX, angleY, angleZ, behParam, behIndex) }; memcpy(aHead, _Ls, sizeof(_Ls)); aHead += (sizeof(_Ls) / sizeof(_Ls[0])); } @@ -1761,7 +1748,7 @@ static void ParseLevelScriptSymbol(GfxData* aGfxData, DataNode* aNo LevelScript angleZ = ParseLevelScriptSymbolArg(aGfxData, aNode, aTokenIndex); LevelScript behParam = ParseLevelScriptSymbolArg(aGfxData, aNode, aTokenIndex); LevelScript beh = ParseLevelScriptSymbolArgInternal(aGfxData, aNode, aTokenIndex, &foundBeh); - LevelScript acts = ParseLevelScriptSymbolArg(aGfxData, aNode, aTokenIndex); + LevelScript acts = ParseLevelScriptSymbolArg(aGfxData, aNode, aTokenIndex); if (foundModel && foundBeh) { aGfxData->mPointerList.Add(aHead + 5); @@ -1769,20 +1756,9 @@ static void ParseLevelScriptSymbol(GfxData* aGfxData, DataNode* aNo memcpy(aHead, _Ls, sizeof(_Ls)); aHead += (sizeof(_Ls) / sizeof(_Ls[0])); } else { - // remember model/beh as pointer - aGfxData->mPointerList.Add(aHead + 5); - aGfxData->mPointerList.Add(aHead + 6); - - // add model/beh tokens - u32 tokenListIndex = aGfxData->mPointerTokenList.Count(); - aGfxData->mPointerTokenList.Add(aNode->mTokens[topTokenIndex + 0]); - aGfxData->mPointerTokenList.Add(aNode->mTokens[topTokenIndex + 8]); - - // get model/beh tokens - String& modelToken = aGfxData->mPointerTokenList[tokenListIndex + 0]; - String& behToken = aGfxData->mPointerTokenList[tokenListIndex + 1]; - - LevelScript _Ls[] = { OBJECT_WITH_ACTS_EXT(modelToken.begin(), posX, posY, posZ, angleX, angleY, angleZ, behParam, behToken.begin(), acts) }; + u32 modelIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 5, aNode->mTokens[topTokenIndex + 0]); + u32 behIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 6, aNode->mTokens[topTokenIndex + 8]); + LevelScript _Ls[] = { OBJECT_WITH_ACTS_EXT(modelIndex, posX, posY, posZ, angleX, angleY, angleZ, behParam, behIndex, acts) }; memcpy(aHead, _Ls, sizeof(_Ls)); aHead += (sizeof(_Ls) / sizeof(_Ls[0])); } @@ -1836,6 +1812,8 @@ static void DynOS_Lvl_Write(FILE* aFile, GfxData* aGfxData, DataNodemData[i]; if (aGfxData->mPointerList.Find((void *) _Head) != -1) { DynOS_Pointer_Write(aFile, (const void *) (*_Head), aGfxData); + } else if (aGfxData->mLuaPointerList.Find((void *) _Head) != -1) { + DynOS_Pointer_Lua_Write(aFile, *(u32 *)_Head, aGfxData); } else { WriteBytes(aFile, *((u32 *) _Head)); } @@ -2012,9 +1990,16 @@ static bool DynOS_Lvl_GeneratePack_Internal(const SysPath &aPackFolder, ArraymErrorCount = 0; - _GfxData->mLoadIndex = 0; - _GfxData->mPackFolder = aPackFolder; + _GfxData->mLoadIndex = 0; + _GfxData->mErrorCount = 0; + _GfxData->mModelIdentifier = _LvlRoot->mModelIdentifier; + _GfxData->mPackFolder = aPackFolder; + _GfxData->mPointerList = { NULL }; // The NULL pointer is needed, so we add it here + _GfxData->mLuaPointerList = { }; + _GfxData->mLuaTokenList = { }; + _GfxData->mGfxContext.mCurrentTexture = NULL; + _GfxData->mGfxContext.mCurrentPalette = NULL; + _GfxData->mGeoNodeStack.Clear(); // Parse data PrintNoNewLine("%s.lvl: Model identifier: %X - Processing... ", _LvlRootName.begin(), _GfxData->mModelIdentifier); diff --git a/data/dynos_bin_pointer.cpp b/data/dynos_bin_pointer.cpp index e3c789e3..bc9ac46c 100644 --- a/data/dynos_bin_pointer.cpp +++ b/data/dynos_bin_pointer.cpp @@ -183,6 +183,12 @@ static PointerData GetDataFromPointer(const void* aPtr, GfxData* aGfxData) { return { _VtxArrayName, (u32)((const Vtx*)aPtr - (const Vtx*)_VtxArrayStart) }; } +void DynOS_Pointer_Lua_Write(FILE* aFile, u32 index, GfxData* aGfxData) { + String& token = aGfxData->mLuaTokenList[index]; + WriteBytes(aFile, LUA_VAR_CODE); + token.Write(aFile); +} + void DynOS_Pointer_Write(FILE* aFile, const void* aPtr, GfxData* aGfxData) { // NULL @@ -191,6 +197,17 @@ void DynOS_Pointer_Write(FILE* aFile, const void* aPtr, GfxData* aGfxData) { return; } + // Lua variable + for (s32 i = 0; i < aGfxData->mLuaPointerList.Count(); i++) { + if (aPtr == aGfxData->mLuaPointerList[i]) { + u32 index = *((u32*)aPtr); + String& token = aGfxData->mLuaTokenList[index]; + WriteBytes(aFile, LUA_VAR_CODE); + token.Write(aFile); + return; + } + } + // Geo function s32 _GeoFunctionIndex = DynOS_Geo_GetFunctionIndex(aPtr); if (_GeoFunctionIndex != -1) { @@ -207,21 +224,8 @@ void DynOS_Pointer_Write(FILE* aFile, const void* aPtr, GfxData* aGfxData) { return; } - // Lua variable - for (s32 i = 0; i < aGfxData->mPointerTokenList.Count(); i++) { - if (aPtr == aGfxData->mPointerTokenList[i].begin()) { - String& token = aGfxData->mPointerTokenList[i]; - WriteBytes(aFile, LUA_VAR_CODE); - token.Write(aFile); - return; - } - } - // Pointer PointerData _PtrData = GetDataFromPointer(aPtr, aGfxData); - if (strlen(_PtrData.first.begin()) == 0) { - _PtrData = _PtrData; // DO NOT COMMIT - } WriteBytes(aFile, POINTER_CODE); _PtrData.first.Write(aFile); WriteBytes(aFile, _PtrData.second); @@ -390,6 +394,14 @@ static void *GetPointerFromData(GfxData *aGfxData, const String &aPtrName, u32 a void *DynOS_Pointer_Load(FILE *aFile, GfxData *aGfxData, u32 aValue, bool isLvl) { + // LUAV + if (aValue == LUA_VAR_CODE) { + String token; token.Read(aFile); + u32 index = aGfxData->mLuaTokenList.Count(); + aGfxData->mLuaTokenList.Add(token); + return aGfxData->mLuaTokenList[index].begin(); + } + // FUNC if (aValue == FUNCTION_CODE) { s32 _FunctionIndex = ReadBytes(aFile); @@ -398,14 +410,6 @@ void *DynOS_Pointer_Load(FILE *aFile, GfxData *aGfxData, u32 aValue, bool isLvl) : DynOS_Geo_GetFunctionPointerFromIndex(_FunctionIndex); } - // LUAV - if (aValue == LUA_VAR_CODE) { - String token; token.Read(aFile); - u32 index = aGfxData->mPointerTokenList.Count(); - aGfxData->mPointerTokenList.Add(token); - return aGfxData->mPointerTokenList[index].begin(); - } - // PNTR if (aValue == POINTER_CODE) { String _PtrName; _PtrName.Read(aFile); diff --git a/data/dynos_bin_read.cpp b/data/dynos_bin_read.cpp index 4fe9f3ae..c0b65ee9 100644 --- a/data/dynos_bin_read.cpp +++ b/data/dynos_bin_read.cpp @@ -121,9 +121,6 @@ void DynOS_Read_Source(GfxData *aGfxData, const SysPath &aFilename) { FILE *_File = fopen(aFilename.c_str(), "rb"); if (!_File) return; - // Remember the geo layout count - s32 prevGeoLayoutCount = aGfxData->mGeoLayouts.Count(); - // Load file into a buffer while removing all comments char *_FileBuffer = DynOS_Read_Buffer(_File, aGfxData); fclose(_File); @@ -281,26 +278,6 @@ void DynOS_Read_Source(GfxData *aGfxData, const SysPath &aFilename) { } } - // Figure out which geo layouts to generate - s32 geoLayoutCount = aGfxData->mGeoLayouts.Count(); - if (geoLayoutCount > prevGeoLayoutCount) { - // find actors to generate - bool foundActor = false; - for (s32 i = prevGeoLayoutCount; i < geoLayoutCount; i++) { - String _GeoRootName = aGfxData->mGeoLayouts[i]->mName; - const void* actor = DynOS_Geo_GetActorLayoutFromName(_GeoRootName.begin()); - if (actor != NULL) { - foundActor = true; - aGfxData->mGenerateGeoLayouts.Add(aGfxData->mGeoLayouts[i]); - } - } - - // if we haven't found an actor, just add the last geo layout found - if (!foundActor) { - aGfxData->mGenerateGeoLayouts.Add(aGfxData->mGeoLayouts[geoLayoutCount - 1]); - } - } - Delete(_FileBuffer); Print("Data read from file \"%s\"", aFilename.c_str()); } diff --git a/data/dynos_bin_utils.cpp b/data/dynos_bin_utils.cpp index cd77f00e..f27086ad 100644 --- a/data/dynos_bin_utils.cpp +++ b/data/dynos_bin_utils.cpp @@ -70,12 +70,29 @@ void DynOS_Gfx_Free(GfxData* aGfxData) { } } +u32 DynOS_Lua_RememberVariable(GfxData* aGfxData, void* aPtr, String& token) { + // remember as lua pointer + aGfxData->mLuaPointerList.Add(aPtr); + + // find existing token + for (u32 i = 0; i < aGfxData->mLuaTokenList.Count(); i++) { + if (aGfxData->mLuaTokenList[i] == token) { + return i; + } + } + + // add token + aGfxData->mLuaTokenList.Add(token); + return aGfxData->mLuaTokenList.Count() - 1; +} + /////////////////////// // Recursive Descent // /////////////////////// static char* sRdString = NULL; static bool sRdError = false; +static RDConstantFunc sRdConstantFunc = NULL; static s64 ParseExpression(); @@ -176,13 +193,13 @@ static s64 ParseFactor() { cTmp++; } - // TODO: this was made so that recursive descent can parse the constants... - // but RD should really use any function pointer passed to it - bool constantFound = false; - s64 constantValue = DynOS_Lvl_ParseLevelScriptConstants(identifier, &constantFound); - if (constantFound) { - sRdString = cTmp; - return constantValue; + if (sRdConstantFunc != NULL) { + bool constantFound = false; + s64 constantValue = sRdConstantFunc(identifier, &constantFound); + if (constantFound) { + sRdString = cTmp; + return constantValue; + } } } @@ -262,9 +279,10 @@ static s64 ParseExpression() { return ParseBitOrExpression(); } -s64 DynOS_RecursiveDescent_Parse(const char* expr, bool* success) { +s64 DynOS_RecursiveDescent_Parse(const char* expr, bool* success, RDConstantFunc func) { sRdString = (char*)expr; sRdError = false; + sRdConstantFunc = func; s64 value = ParseExpression(); sRdString = NULL; *success = !sRdError; diff --git a/data/dynos_misc.cpp b/data/dynos_misc.cpp index fea1c39f..2456fa70 100644 --- a/data/dynos_misc.cpp +++ b/data/dynos_misc.cpp @@ -36,7 +36,27 @@ extern "C" { #include "actors/group17.h" #include "actors/custom0.h" #include "actors/zcustom0.h" +#include "levels/bbh/header.h" +#include "levels/bitdw/header.h" +#include "levels/bitfs/header.h" +#include "levels/bits/header.h" #include "levels/bob/header.h" +#include "levels/bowser_2/header.h" +#include "levels/bowser_3/header.h" +#include "levels/castle_grounds/header.h" +#include "levels/castle_inside/header.h" +#include "levels/ccm/header.h" +#include "levels/ddd/header.h" +#include "levels/hmc/header.h" +#include "levels/jrb/header.h" +#include "levels/lll/header.h" +#include "levels/rr/header.h" +#include "levels/sl/header.h" +#include "levels/ssl/header.h" +#include "levels/thi/header.h" +#include "levels/ttc/header.h" +#include "levels/ttm/header.h" +#include "levels/wdw/header.h" #include "levels/wf/header.h" } @@ -609,6 +629,417 @@ Collision* DynOS_Col_Get(const char* collisionName) { #define define_lvl_geo(geo) (const void *) #geo, (const void *) geo static const void *sDynosLevelGeos[] = { + define_lvl_geo(geo_bbh_0005B0), + define_lvl_geo(geo_bbh_0005C8), + define_lvl_geo(geo_bbh_0005E0), + define_lvl_geo(geo_bbh_0005F8), + define_lvl_geo(geo_bbh_000610), + define_lvl_geo(geo_bbh_000628), + define_lvl_geo(geo_bbh_000640), + define_lvl_geo(geo_bbh_000658), + define_lvl_geo(geo_bbh_000670), + define_lvl_geo(geo_bbh_0006B0), + define_lvl_geo(geo_bbh_0006E8), + define_lvl_geo(geo_bbh_000730), + define_lvl_geo(geo_bbh_000750), + define_lvl_geo(geo_bbh_000768), + define_lvl_geo(geo_bbh_0007B0), + define_lvl_geo(geo_bbh_0007D0), + define_lvl_geo(geo_bbh_000800), + define_lvl_geo(geo_bbh_000828), + define_lvl_geo(geo_bbh_000860), + define_lvl_geo(geo_bbh_000888), + define_lvl_geo(geo_bbh_0008B0), + define_lvl_geo(geo_bbh_0008E8), + define_lvl_geo(geo_bbh_000950), + define_lvl_geo(geo_bbh_0009C8), + define_lvl_geo(geo_bbh_000A18), + define_lvl_geo(geo_bbh_000A60), + define_lvl_geo(geo_bbh_000AD8), + define_lvl_geo(geo_bbh_000B28), + define_lvl_geo(geo_bbh_000B88), + define_lvl_geo(geo_bbh_000BF0), + define_lvl_geo(geo_bbh_000C38), + define_lvl_geo(geo_bbh_000C88), + define_lvl_geo(geo_bbh_000CE8), + define_lvl_geo(geo_bbh_000D20), + define_lvl_geo(geo_bbh_000D68), + define_lvl_geo(geo_bbh_000DB0), + define_lvl_geo(geo_bbh_000DF0), + define_lvl_geo(geo_bbh_000E40), + define_lvl_geo(geo_bbh_000E80), + define_lvl_geo(geo_bbh_000EB0), + define_lvl_geo(geo_bbh_000F00), + define_lvl_geo(geo_bitdw_0003C0), + define_lvl_geo(geo_bitdw_0003D8), + define_lvl_geo(geo_bitdw_0003F0), + define_lvl_geo(geo_bitdw_000408), + define_lvl_geo(geo_bitdw_000420), + define_lvl_geo(geo_bitdw_000438), + define_lvl_geo(geo_bitdw_000450), + define_lvl_geo(geo_bitdw_000468), + define_lvl_geo(geo_bitdw_000480), + define_lvl_geo(geo_bitdw_000498), + define_lvl_geo(geo_bitdw_0004B0), + define_lvl_geo(geo_bitdw_0004C8), + define_lvl_geo(geo_bitdw_0004E0), + define_lvl_geo(geo_bitdw_0004F8), + define_lvl_geo(geo_bitdw_000510), + define_lvl_geo(geo_bitdw_000528), + define_lvl_geo(geo_bitdw_000540), + define_lvl_geo(geo_bitdw_000558), + define_lvl_geo(geo_bitdw_000570), + define_lvl_geo(geo_bitdw_000588), + define_lvl_geo(geo_bitdw_0005A0), + define_lvl_geo(geo_bitdw_0005B8), + define_lvl_geo(geo_bitdw_0005D0), + define_lvl_geo(geo_bitdw_0005E8), + define_lvl_geo(geo_bitdw_000600), + define_lvl_geo(geo_bitdw_000618), + define_lvl_geo(bitfs_geo_0004B0), + define_lvl_geo(bitfs_geo_0004C8), + define_lvl_geo(bitfs_geo_0004E0), + define_lvl_geo(bitfs_geo_0004F8), + define_lvl_geo(bitfs_geo_000510), + define_lvl_geo(bitfs_geo_000528), + define_lvl_geo(bitfs_geo_000540), + define_lvl_geo(bitfs_geo_000558), + define_lvl_geo(bitfs_geo_000570), + define_lvl_geo(bitfs_geo_000588), + define_lvl_geo(bitfs_geo_0005A0), + define_lvl_geo(bitfs_geo_0005B8), + define_lvl_geo(bitfs_geo_0005D0), + define_lvl_geo(bitfs_geo_0005E8), + define_lvl_geo(bitfs_geo_000600), + define_lvl_geo(bitfs_geo_000618), + define_lvl_geo(bitfs_geo_000630), + define_lvl_geo(bitfs_geo_000648), + define_lvl_geo(bitfs_geo_000660), + define_lvl_geo(bitfs_geo_000678), + define_lvl_geo(bitfs_geo_000690), + define_lvl_geo(bitfs_geo_0006A8), + define_lvl_geo(bitfs_geo_0006C0), + define_lvl_geo(bitfs_geo_0006D8), + define_lvl_geo(bitfs_geo_0006F0), + define_lvl_geo(bitfs_geo_000708), + define_lvl_geo(bitfs_geo_000728), + define_lvl_geo(bitfs_geo_000740), + define_lvl_geo(bitfs_geo_000758), + define_lvl_geo(bitfs_geo_000770), + define_lvl_geo(bitfs_geo_000788), + define_lvl_geo(bitfs_geo_0007A0), + define_lvl_geo(bits_geo_000430), + define_lvl_geo(bits_geo_000448), + define_lvl_geo(bits_geo_000460), + define_lvl_geo(bits_geo_000478), + define_lvl_geo(bits_geo_000490), + define_lvl_geo(bits_geo_0004A8), + define_lvl_geo(bits_geo_0004C0), + define_lvl_geo(bits_geo_0004D8), + define_lvl_geo(bits_geo_0004F0), + define_lvl_geo(bits_geo_000508), + define_lvl_geo(bits_geo_000520), + define_lvl_geo(bits_geo_000538), + define_lvl_geo(bits_geo_000550), + define_lvl_geo(bits_geo_000568), + define_lvl_geo(bits_geo_000580), + define_lvl_geo(bits_geo_000598), + define_lvl_geo(bits_geo_0005B0), + define_lvl_geo(bits_geo_0005C8), + define_lvl_geo(bits_geo_0005E0), + define_lvl_geo(bits_geo_0005F8), + define_lvl_geo(bits_geo_000610), + define_lvl_geo(bits_geo_000628), + define_lvl_geo(bits_geo_000640), + define_lvl_geo(bits_geo_000658), + define_lvl_geo(bits_geo_000670), + define_lvl_geo(bits_geo_000688), + define_lvl_geo(bits_geo_0006A0), + define_lvl_geo(bits_geo_0006B8), + define_lvl_geo(bits_geo_0006D0), + define_lvl_geo(bits_geo_0006E8), + define_lvl_geo(bits_geo_000700), + define_lvl_geo(bits_geo_000718), + define_lvl_geo(bob_geo_000440), + define_lvl_geo(bob_geo_000458), + define_lvl_geo(bob_geo_000470), + define_lvl_geo(bob_geo_000488), + define_lvl_geo(bowser_2_geo_000170), + define_lvl_geo(bowser_2_geo_000188), + define_lvl_geo(bowser_3_geo_000290), + define_lvl_geo(bowser_3_geo_0002A8), + define_lvl_geo(bowser_3_geo_0002C0), + define_lvl_geo(bowser_3_geo_0002D8), + define_lvl_geo(bowser_3_geo_0002F0), + define_lvl_geo(bowser_3_geo_000308), + define_lvl_geo(bowser_3_geo_000320), + define_lvl_geo(bowser_3_geo_000338), + define_lvl_geo(bowser_3_geo_000350), + define_lvl_geo(bowser_3_geo_000368), + define_lvl_geo(bowser_3_geo_000380), + define_lvl_geo(bowser_3_geo_000398), + define_lvl_geo(castle_grounds_geo_000660), + define_lvl_geo(castle_grounds_geo_0006F4), + define_lvl_geo(castle_grounds_geo_00070C), + define_lvl_geo(castle_grounds_geo_000724), + define_lvl_geo(castle_grounds_geo_00073C), + define_lvl_geo(castle_geo_000F00), + define_lvl_geo(castle_geo_000F18), + define_lvl_geo(castle_geo_000F30), + define_lvl_geo(castle_geo_000F70), + define_lvl_geo(castle_geo_000F88), + define_lvl_geo(castle_geo_000FA8), + define_lvl_geo(castle_geo_000FD0), + define_lvl_geo(castle_geo_001000), + define_lvl_geo(castle_geo_001038), + define_lvl_geo(castle_geo_001088), + define_lvl_geo(castle_geo_0010C8), + define_lvl_geo(castle_geo_001110), + define_lvl_geo(castle_geo_001158), + define_lvl_geo(castle_geo_0011A8), + define_lvl_geo(castle_geo_001200), + define_lvl_geo(castle_geo_001260), + define_lvl_geo(castle_geo_0012C8), + define_lvl_geo(castle_geo_001348), + define_lvl_geo(castle_geo_0013B8), + define_lvl_geo(castle_geo_001400), + define_lvl_geo(castle_geo_001518), + define_lvl_geo(castle_geo_001530), + define_lvl_geo(castle_geo_001548), + define_lvl_geo(castle_geo_001560), + define_lvl_geo(castle_geo_001578), + define_lvl_geo(castle_geo_0015B8), + define_lvl_geo(castle_geo_0015F8), + define_lvl_geo(castle_geo_001628), + define_lvl_geo(castle_geo_001668), + define_lvl_geo(castle_geo_001690), + define_lvl_geo(castle_geo_0016D8), + define_lvl_geo(castle_geo_001740), + define_lvl_geo(castle_geo_001798), + define_lvl_geo(castle_geo_001800), + define_lvl_geo(castle_geo_001858), + define_lvl_geo(castle_geo_001940), + define_lvl_geo(castle_geo_001958), + define_lvl_geo(castle_geo_001980), + define_lvl_geo(castle_geo_0019C8), + define_lvl_geo(castle_geo_0019F8), + define_lvl_geo(castle_geo_001A30), + define_lvl_geo(castle_geo_001A58), + define_lvl_geo(castle_geo_001AB8), + define_lvl_geo(castle_geo_001AF8), + define_lvl_geo(castle_geo_001B48), + define_lvl_geo(castle_geo_001BB0), + define_lvl_geo(castle_geo_001C10), + define_lvl_geo(ccm_geo_0003D0), + define_lvl_geo(ccm_geo_0003F0), + define_lvl_geo(ccm_geo_00040C), + define_lvl_geo(ccm_geo_00042C), + define_lvl_geo(ccm_geo_00045C), + define_lvl_geo(ccm_geo_000494), + define_lvl_geo(ccm_geo_0004BC), + define_lvl_geo(ccm_geo_0004E4), + define_lvl_geo(ccm_geo_00051C), + define_lvl_geo(ccm_geo_0005E8), + define_lvl_geo(ddd_geo_000450), + define_lvl_geo(ddd_geo_000478), + define_lvl_geo(ddd_geo_0004A0), + define_lvl_geo(ddd_geo_0004C0), + define_lvl_geo(ddd_geo_000570), + define_lvl_geo(hmc_geo_000530), + define_lvl_geo(hmc_geo_000548), + define_lvl_geo(hmc_geo_000570), + define_lvl_geo(hmc_geo_000588), + define_lvl_geo(hmc_geo_0005A0), + define_lvl_geo(hmc_geo_0005B8), + define_lvl_geo(hmc_geo_0005D0), + define_lvl_geo(hmc_geo_0005E8), + define_lvl_geo(hmc_geo_000618), + define_lvl_geo(hmc_geo_000658), + define_lvl_geo(hmc_geo_0006A8), + define_lvl_geo(hmc_geo_0006E0), + define_lvl_geo(hmc_geo_000700), + define_lvl_geo(hmc_geo_000748), + define_lvl_geo(hmc_geo_000770), + define_lvl_geo(hmc_geo_000798), + define_lvl_geo(hmc_geo_0007F8), + define_lvl_geo(hmc_geo_000850), + define_lvl_geo(hmc_geo_0008D0), + define_lvl_geo(hmc_geo_000938), + define_lvl_geo(hmc_geo_000998), + define_lvl_geo(hmc_geo_000A18), + define_lvl_geo(hmc_geo_000A88), + define_lvl_geo(hmc_geo_000AE8), + define_lvl_geo(hmc_geo_000B48), + define_lvl_geo(hmc_geo_000B90), + define_lvl_geo(jrb_geo_000900), + define_lvl_geo(jrb_geo_000918), + define_lvl_geo(jrb_geo_000930), + define_lvl_geo(jrb_geo_000948), + define_lvl_geo(jrb_geo_000960), + define_lvl_geo(jrb_geo_000978), + define_lvl_geo(jrb_geo_000990), + define_lvl_geo(jrb_geo_0009B0), + define_lvl_geo(jrb_geo_0009C8), + define_lvl_geo(jrb_geo_0009E8), + define_lvl_geo(jrb_geo_000A00), + define_lvl_geo(jrb_geo_000A18), + define_lvl_geo(jrb_geo_000AFC), + define_lvl_geo(lll_geo_0009E0), + define_lvl_geo(lll_geo_0009F8), + define_lvl_geo(lll_geo_000A10), + define_lvl_geo(lll_geo_000A28), + define_lvl_geo(lll_geo_000A40), + define_lvl_geo(lll_geo_000A60), + define_lvl_geo(lll_geo_000A78), + define_lvl_geo(lll_geo_000A90), + define_lvl_geo(lll_geo_000AA8), + define_lvl_geo(lll_geo_000AC0), + define_lvl_geo(lll_geo_000AD8), + define_lvl_geo(lll_geo_000AF0), + define_lvl_geo(lll_geo_000B08), + define_lvl_geo(lll_geo_000B20), + define_lvl_geo(lll_geo_000B38), + define_lvl_geo(lll_geo_000B50), + define_lvl_geo(lll_geo_000B68), + define_lvl_geo(lll_geo_000B80), + define_lvl_geo(lll_geo_000B98), + define_lvl_geo(lll_geo_000BB0), + define_lvl_geo(lll_geo_000BC8), + define_lvl_geo(lll_geo_000BE0), + define_lvl_geo(lll_geo_000BF8), + define_lvl_geo(lll_geo_000C10), + define_lvl_geo(lll_geo_000C30), + define_lvl_geo(lll_geo_000C50), + define_lvl_geo(lll_geo_000C70), + define_lvl_geo(lll_geo_000C90), + define_lvl_geo(lll_geo_000CB0), + define_lvl_geo(lll_geo_000CD0), + define_lvl_geo(lll_geo_000CF0), + define_lvl_geo(lll_geo_000D10), + define_lvl_geo(lll_geo_000D30), + define_lvl_geo(lll_geo_000D50), + define_lvl_geo(lll_geo_000D70), + define_lvl_geo(lll_geo_000D90), + define_lvl_geo(lll_geo_000DB0), + define_lvl_geo(lll_geo_000DD0), + define_lvl_geo(lll_geo_000DE8), + define_lvl_geo(lll_geo_000E00), + define_lvl_geo(lll_geo_000EA8), + define_lvl_geo(lll_geo_000EC0), + define_lvl_geo(rr_geo_000660), + define_lvl_geo(rr_geo_000678), + define_lvl_geo(rr_geo_000690), + define_lvl_geo(rr_geo_0006A8), + define_lvl_geo(rr_geo_0006C0), + define_lvl_geo(rr_geo_0006D8), + define_lvl_geo(rr_geo_0006F0), + define_lvl_geo(rr_geo_000708), + define_lvl_geo(rr_geo_000720), + define_lvl_geo(rr_geo_000738), + define_lvl_geo(rr_geo_000758), + define_lvl_geo(rr_geo_000770), + define_lvl_geo(rr_geo_000788), + define_lvl_geo(rr_geo_0007A0), + define_lvl_geo(rr_geo_0007B8), + define_lvl_geo(rr_geo_0007D0), + define_lvl_geo(rr_geo_0007E8), + define_lvl_geo(rr_geo_000800), + define_lvl_geo(rr_geo_000818), + define_lvl_geo(rr_geo_000830), + define_lvl_geo(rr_geo_000848), + define_lvl_geo(rr_geo_000860), + define_lvl_geo(rr_geo_000878), + define_lvl_geo(rr_geo_000890), + define_lvl_geo(rr_geo_0008A8), + define_lvl_geo(rr_geo_0008C0), + define_lvl_geo(rr_geo_0008D8), + define_lvl_geo(rr_geo_0008F0), + define_lvl_geo(rr_geo_000908), + define_lvl_geo(rr_geo_000920), + define_lvl_geo(rr_geo_000940), + define_lvl_geo(rr_geo_000958), + define_lvl_geo(rr_geo_000970), + define_lvl_geo(rr_geo_000988), + define_lvl_geo(rr_geo_0009A0), + define_lvl_geo(rr_geo_0009B8), + define_lvl_geo(rr_geo_0009D0), + define_lvl_geo(sl_geo_000360), + define_lvl_geo(sl_geo_000378), + define_lvl_geo(sl_geo_000390), + define_lvl_geo(sl_geo_0003A8), + define_lvl_geo(sl_geo_000484), + define_lvl_geo(ssl_geo_0005C0), + define_lvl_geo(ssl_geo_0005D8), + define_lvl_geo(ssl_geo_000618), + define_lvl_geo(ssl_geo_000630), + define_lvl_geo(ssl_geo_000648), + define_lvl_geo(ssl_geo_000734), + define_lvl_geo(ssl_geo_000764), + define_lvl_geo(ssl_geo_000794), + define_lvl_geo(ssl_geo_0007AC), + define_lvl_geo(ssl_geo_0007CC), + define_lvl_geo(ssl_geo_00088C), + define_lvl_geo(thi_geo_0005B0), + define_lvl_geo(thi_geo_0005C8), + define_lvl_geo(thi_geo_0005F0), + define_lvl_geo(thi_geo_000608), + define_lvl_geo(thi_geo_0006D4), + define_lvl_geo(thi_geo_00079C), + define_lvl_geo(ttc_geo_000240), + define_lvl_geo(ttc_geo_000258), + define_lvl_geo(ttc_geo_000270), + define_lvl_geo(ttc_geo_000288), + define_lvl_geo(ttc_geo_0002A8), + define_lvl_geo(ttc_geo_0002C8), + define_lvl_geo(ttc_geo_0002E0), + define_lvl_geo(ttc_geo_0002F8), + define_lvl_geo(ttc_geo_000310), + define_lvl_geo(ttc_geo_000328), + define_lvl_geo(ttc_geo_000340), + define_lvl_geo(ttc_geo_000358), + define_lvl_geo(ttc_geo_000370), + define_lvl_geo(ttc_geo_000388), + define_lvl_geo(ttc_geo_0003A0), + define_lvl_geo(ttc_geo_0003B8), + define_lvl_geo(ttm_geo_000710), + define_lvl_geo(ttm_geo_000730), + define_lvl_geo(ttm_geo_000748), + define_lvl_geo(ttm_geo_000778), + define_lvl_geo(ttm_geo_0007A8), + define_lvl_geo(ttm_geo_0007D8), + define_lvl_geo(ttm_geo_000808), + define_lvl_geo(ttm_geo_000830), + define_lvl_geo(ttm_geo_000858), + define_lvl_geo(ttm_geo_000880), + define_lvl_geo(ttm_geo_0008A8), + define_lvl_geo(ttm_geo_0008D0), + define_lvl_geo(ttm_geo_0008F8), + define_lvl_geo(ttm_geo_000920), + define_lvl_geo(ttm_geo_000948), + define_lvl_geo(ttm_geo_000970), + define_lvl_geo(ttm_geo_000990), + define_lvl_geo(ttm_geo_0009C0), + define_lvl_geo(ttm_geo_0009F0), + define_lvl_geo(ttm_geo_000A18), + define_lvl_geo(ttm_geo_000A40), + define_lvl_geo(ttm_geo_000A70), + define_lvl_geo(ttm_geo_000B5C), + define_lvl_geo(ttm_geo_000BEC), + define_lvl_geo(ttm_geo_000C84), + define_lvl_geo(ttm_geo_000D14), + define_lvl_geo(ttm_geo_000D4C), + define_lvl_geo(ttm_geo_000D84), + define_lvl_geo(ttm_geo_000DBC), + define_lvl_geo(ttm_geo_000DF4), + define_lvl_geo(wdw_geo_000580), + define_lvl_geo(wdw_geo_000598), + define_lvl_geo(wdw_geo_0005C0), + define_lvl_geo(wdw_geo_0005E8), + define_lvl_geo(wdw_geo_000610), + define_lvl_geo(wdw_geo_000628), + define_lvl_geo(wdw_geo_000640), + define_lvl_geo(wdw_geo_000658), + define_lvl_geo(wdw_geo_000724), define_lvl_geo(wf_geo_0007E0), define_lvl_geo(wf_geo_000820), define_lvl_geo(wf_geo_000860), @@ -640,10 +1071,6 @@ static const void *sDynosLevelGeos[] = { define_lvl_geo(wf_geo_000BC8), define_lvl_geo(wf_geo_000BE0), define_lvl_geo(wf_geo_000BF8), - define_lvl_geo(bob_geo_000440), - define_lvl_geo(bob_geo_000458), - define_lvl_geo(bob_geo_000470), - define_lvl_geo(bob_geo_000488), }; s32 DynOS_Lvl_GetGeoCount() { @@ -707,6 +1134,7 @@ LevelScript* DynOS_Lvl_Get(const char* levelName) { static u32 index = 0; // DO NOT COMMIT index = (index + 1) % sDynosCustomLevelScripts.Count(); // DO NOT COMMIT auto& scripts = sDynosCustomLevelScripts[index].second->mLevelScripts; // DO NOT COMMIT + Print("Going to level: %s\n", scripts[scripts.Count() - 1]->mName); // DO NOT COMMIT return scripts[scripts.Count() - 1]->mData; // DO NOT COMMIT for (s32 i = 0; i < sDynosCustomLevelScripts.Count(); ++i) {