#include "dynos.cpp.h" extern "C" { #include "engine/level_script.h" #include "game/skybox.h" } static Array> sDynosCustomLevelScripts; Array> &DynOS_Lvl_GetArray() { return sDynosCustomLevelScripts; } void DynOS_Lvl_Activate(s32 modIndex, const SysPath &aPackFolder, const char *aLevelName) { // check for duplicates for (s32 i = 0; i < sDynosCustomLevelScripts.Count(); ++i) { if (!strcmp(sDynosCustomLevelScripts[i].first, aLevelName)) { return; } } u16 levelLen = strlen(aLevelName); char* levelName = (char*)calloc(1, sizeof(char) * (levelLen + 1)); strcpy(levelName, aLevelName); GfxData* _Node = DynOS_Lvl_LoadFromBinary(aPackFolder, levelName); if (!_Node) { free(levelName); return; } // remember index _Node->mModIndex = modIndex; // Add to levels sDynosCustomLevelScripts.Add({ levelName, _Node }); } LevelScript* DynOS_Lvl_GetScript(const char* levelName) { if (strlen(levelName) == 0) { static u32 index = 0; // DO NOT COMMIT s32 levelScriptCount = sDynosCustomLevelScripts.Count(); // DO NOT COMMIT if (levelScriptCount < 1) { return NULL; } // DO NOT COMMIT index = (index + 1) % levelScriptCount; // 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) { if (!strcmp(sDynosCustomLevelScripts[i].first, levelName)) { auto& scripts = sDynosCustomLevelScripts[i].second->mLevelScripts; return scripts[scripts.Count() - 1]->mData; } } return NULL; } s32 DynOS_Lvl_GetModIndex(void* levelScript) { for (s32 i = 0; i < sDynosCustomLevelScripts.Count(); ++i) { auto& scripts = sDynosCustomLevelScripts[i].second->mLevelScripts; if (levelScript == scripts[scripts.Count() - 1]->mData) { return sDynosCustomLevelScripts[i].second->mModIndex; } } return -1; } DataNode *DynOS_Lvl_GetTexture(void *aPtr) { for (s32 i = 0; i < sDynosCustomLevelScripts.Count(); ++i) { auto &mTextures = sDynosCustomLevelScripts[i].second->mTextures; for (s32 j = 0; j < mTextures.Count(); j++) { auto &texture = mTextures[j]; if (texture == aPtr) { return texture; } } } return NULL; } static GfxData* DynOS_Lvl_GetActiveGfx(void) { for (s32 i = 0; i < sDynosCustomLevelScripts.Count(); ++i) { auto& gfxData = sDynosCustomLevelScripts[i].second; auto& scripts = gfxData->mLevelScripts; if (gLevelScriptActive == scripts[scripts.Count() - 1]->mData) { return gfxData; } } return NULL; } const char* DynOS_Lvl_GetToken(u32 index) { GfxData* gfxData = DynOS_Lvl_GetActiveGfx(); if (gfxData == NULL) { return NULL; } // have to 1-index due to to pointer read code index = index - 1; if (index >= gfxData->mLuaTokenList.Count()) { return NULL; } return gfxData->mLuaTokenList[index].begin(); } DataNode *DynOS_Lvl_GetMovtexQuadCollection(s32 index) { GfxData* gfxData = DynOS_Lvl_GetActiveGfx(); if (gfxData == NULL) { return NULL; } auto &mMovtexQCs = gfxData->mMovtexQCs; // Sanity check the index we passed. if (index < 0 || index >= mMovtexQCs.Count()) { return NULL; } return mMovtexQCs[index]; } void DynOS_Lvl_LoadBackground(void *aPtr) { // ensure this texture list exists GfxData* foundGfxData = NULL; DataNode* foundList = NULL; for (auto& script : sDynosCustomLevelScripts) { auto &textureLists = script.second->mTextureLists; for (auto& textureList : textureLists) { if (textureList == aPtr) { foundGfxData = script.second; foundList = textureList; goto double_break; } } } double_break: if (foundList == NULL) { Print("Could not find custom background"); return; } // Load up custom background for (s32 i = 0; i < 80; i++) { // find texture for (auto& tex : foundGfxData->mTextures) { if (tex->mData == foundList->mData[i]) { gCustomSkyboxPtrList[i] = (Texture*)tex; break; } } } }