#ifndef DYNOS_CPP_H #define DYNOS_CPP_H #ifdef __cplusplus #include "dynos.h" #include extern "C" { #include "engine/behavior_script.h" #include "engine/math_util.h" #include "game/moving_texture.h" #include "pc/djui/djui_console.h" #include "pc/fs/fmem.h" } #define FUNCTION_CODE (u32) 0x434E5546 #define POINTER_CODE (u32) 0x52544E50 #define LUA_VAR_CODE (u32) 0x5641554C #define TEX_REF_CODE (u32) 0x52584554 #define FUNCTION_GEO 1 #define FUNCTION_BHV 2 #define FUNCTION_LVL 3 #define MOD_PACK_INDEX -1 // the pack index for actors loaded from mods #define PACK_MOD_INDEX -1 // the mod index for actors loaded from packs // // Enums // enum { DATA_TYPE_NONE = 0, DATA_TYPE_LIGHT, DATA_TYPE_TEXTURE, DATA_TYPE_VERTEX, DATA_TYPE_DISPLAY_LIST, DATA_TYPE_GEO_LAYOUT, DATA_TYPE_ANIMATION_VALUE, DATA_TYPE_ANIMATION_INDEX, DATA_TYPE_ANIMATION, DATA_TYPE_ANIMATION_TABLE, DATA_TYPE_GFXDYNCMD, DATA_TYPE_COLLISION, DATA_TYPE_LEVEL_SCRIPT, DATA_TYPE_MACRO_OBJECT, DATA_TYPE_TRAJECTORY, DATA_TYPE_MOVTEX, DATA_TYPE_MOVTEXQC, DATA_TYPE_ROOMS, DATA_TYPE_LIGHT_T, DATA_TYPE_AMBIENT_T, DATA_TYPE_TEXTURE_LIST, DATA_TYPE_TEXTURE_RAW, DATA_TYPE_BEHAVIOR_SCRIPT, DATA_TYPE_UNUSED, DATA_TYPE_LIGHT_0, }; enum { DOPT_NONE = 0, DOPT_TOGGLE, DOPT_CHOICE, DOPT_SCROLL, DOPT_BIND, DOPT_BUTTON, DOPT_SUBMENU, // These ones are used by the Warp to Level built-in submenu DOPT_CHOICELEVEL, DOPT_CHOICEAREA, DOPT_CHOICESTAR, DOPT_CHOICEPARAM, }; // // DynOS Binary file struct // class BinFile { private: void Grow(s32 newSize) { if (newSize >= mCapacity) { mCapacity = MAX(newSize, MAX(256, mCapacity * 2)); u8 *newBuffer = (u8 *) calloc(mCapacity, 1); if (mData) { memcpy(newBuffer, mData, mSize); free(mData); } mData = newBuffer; } mSize = MAX(mSize, newSize); } public: inline s32 Size() const { return mSize; } inline s32 Offset() const { return mOffset; } inline bool EoF() const { return mOffset >= mSize; } inline void SetOffset(s32 aOffset) const { mOffset = aOffset; } inline const char *GetFilename() const { return mFilename; } public: static BinFile *OpenR(const char *aFilename) { FILE *f = f_open_r(aFilename); if (f) { f_seek(f, 0, SEEK_END); BinFile *_BinFile = (BinFile *) calloc(1, sizeof(BinFile)); _BinFile->mFilename = (const char *) memcpy(calloc(strlen(aFilename) + 1, 1), aFilename, strlen(aFilename)); _BinFile->mReadOnly = true; _BinFile->Grow(f_tell(f)); f_rewind(f); f_read(_BinFile->mData, 1, _BinFile->mSize, f); f_close(f); return _BinFile; } return NULL; } static BinFile *OpenW(const char *aFilename) { BinFile *_BinFile = (BinFile *) calloc(1, sizeof(BinFile)); _BinFile->mFilename = (const char *) memcpy(calloc(strlen(aFilename) + 1, 1), aFilename, strlen(aFilename)); _BinFile->mReadOnly = false; return _BinFile; } static BinFile *OpenB(const u8 *aBuffer, s32 aSize) { BinFile *_BinFile = (BinFile *) calloc(1, sizeof(BinFile)); _BinFile->mReadOnly = true; _BinFile->Grow(aSize); memcpy(_BinFile->mData, aBuffer, aSize); return _BinFile; } static void Close(BinFile *&aBinFile) { if (aBinFile) { if (!aBinFile->mReadOnly && aBinFile->mFilename && aBinFile->mData && aBinFile->mSize) { FILE *f = fopen(aBinFile->mFilename, "wb"); if (f) { fwrite(aBinFile->mData, 1, aBinFile->mSize, f); fclose(f); } } if (aBinFile->mFilename) free((void *) aBinFile->mFilename); if (aBinFile->mData) free(aBinFile->mData); free(aBinFile); } } public: template T Read() const { T _Item = { 0 }; if (mOffset + sizeof(T) <= mSize) { memcpy(&_Item, mData + mOffset, sizeof(T)); mOffset += sizeof(T); } return _Item; } template T *Read(T *aBuffer, s32 aCount) const { if (aCount <= 0 || aBuffer == NULL) { return aBuffer; } if (mOffset + aCount * sizeof(T) <= mSize) { memcpy(aBuffer, mData + mOffset, aCount * sizeof(T)); mOffset += aCount * sizeof(T); } return aBuffer; } template void Write(const T& aItem) { if (!mReadOnly) { Grow(mOffset + sizeof(T)); memcpy(mData + mOffset, &aItem, sizeof(T)); mOffset += sizeof(T); } } template void Write(const T *aBuffer, s32 aCount) { if (aCount <= 0 || aBuffer == NULL) { return; } if (!mReadOnly) { Grow(mOffset + aCount * sizeof(T)); memcpy(mData + mOffset, aBuffer, aCount * sizeof(T)); mOffset += aCount * sizeof(T); } } void Skip(s32 aAmount) const { mOffset += aAmount; } private: const char *mFilename; u8 *mData; s32 mSize; s32 mCapacity; mutable s32 mOffset; bool mReadOnly; }; // // DynOS Array // A vector-like array, implemented to be processed really fast, but cannot handle C++ complex classes like std::string // template class Array { static_assert( std::is_trivially_destructible_v, "DynOS Array can only be used with types that have trivial destructors." ); public: inline Array() : mBuffer(NULL), mCount(0), mCapacity(0) { } inline Array(const std::initializer_list &aList) : mBuffer(NULL), mCount(0), mCapacity(0) { Resize(aList.size()); memcpy(mBuffer, aList.begin(), mCount * sizeof(T)); } inline Array(const T *aBegin, const T *aEnd) : mBuffer(NULL), mCount(0), mCapacity(0) { Resize(aEnd - aBegin); memcpy(mBuffer, aBegin, mCount * sizeof(T)); } inline Array(const Array &aOther) : mBuffer(NULL), mCount(0), mCapacity(0) { Resize(aOther.mCount); memcpy(mBuffer, aOther.mBuffer, mCount * sizeof(T)); } inline void operator=(const Array &aOther) { Resize(aOther.mCount); memcpy(mBuffer, aOther.mBuffer, mCount * sizeof(T)); } inline ~Array() { Clear(); } public: void Resize(s32 aCount) { if (aCount > mCapacity) { mCapacity = MAX(aCount, MAX(16, mCapacity * 2)); T *_Buffer = (T *) calloc(mCapacity, sizeof(T)); if (mBuffer) { memcpy(_Buffer, mBuffer, mCount * sizeof(T)); free(mBuffer); } mBuffer = _Buffer; } mCount = aCount; } void Add(const T& aItem) { Resize(mCount + 1); mBuffer[mCount - 1] = aItem; } void Remove(s32 aIndex) { memmove(mBuffer + aIndex, mBuffer + aIndex + 1, (mCount - aIndex - 1) * sizeof(T)); mCount--; } void Pop() { mCount--; } void RemoveAll() { mCount = 0; } void Clear() { if (mBuffer) free(mBuffer); mBuffer = NULL; mCount = 0; mCapacity = 0; } s32 Find(const T& aItem) const { for (s32 i = 0; i != mCount; ++i) { if (mBuffer[i] == aItem) { return i; } } return -1; } template s32 FindIf(Predicate aPredicate) const { for (s32 i = 0; i != mCount; ++i) { if (aPredicate(mBuffer[i])) { return i; } } return -1; } public: inline const T *begin() const { return mBuffer; } inline const T *end() const { return mBuffer + mCount; } inline T *begin() { return mBuffer; } inline T *end() { return mBuffer + mCount; } inline const T &operator[](s32 aIndex) const { return mBuffer[aIndex]; } inline T &operator[](s32 aIndex) { return mBuffer[aIndex]; } inline s32 Count() const { return mCount; } inline bool Empty() const { return mCount == 0; } public: void Read(BinFile *aFile) { s32 _Length = aFile->Read(); if (_Length <= 0) { Resize(0); return; } Resize(_Length); aFile->Read(mBuffer, _Length); } void Write(BinFile *aFile) const { aFile->Write(mCount); aFile->Write(mBuffer, mCount); } private: T *mBuffer; s32 mCount; s32 mCapacity; }; // // DynOS String // A fixed-size string that doesn't require heap memory allocation // #define STRING_SIZE 255 class String { public: inline String() : mCount(0) { mBuffer[0] = 0; } inline String(const char *aString) : mCount(0) { if (aString) { u64 _Length = strlen(aString); mCount = MIN(_Length, STRING_SIZE - 1); memcpy(mBuffer, aString, _Length); } mBuffer[mCount] = 0; } template inline String(const char *aFmt, Args... aArgs) : mCount(0) { snprintf(mBuffer, STRING_SIZE, aFmt, aArgs...); mCount = (u8) strlen(mBuffer); mBuffer[mCount] = 0; } inline String(const String &aOther) : mCount(0) { mCount = aOther.mCount; memcpy(mBuffer, aOther.mBuffer, mCount); mBuffer[mCount] = 0; } inline void operator=(const String &aOther) { mCount = aOther.mCount; memcpy(mBuffer, aOther.mBuffer, mCount); mBuffer[mCount] = 0; } public: void Add(char aChar) { if (mCount == STRING_SIZE - 1) return; mBuffer[mCount++] = aChar; mBuffer[mCount] = 0; } void Remove(s32 aIndex) { memmove(mBuffer + aIndex, mBuffer + aIndex + 1, (mCount-- - aIndex - 1)); mBuffer[mCount] = 0; } void RemoveAll() { mCount = 0; mBuffer[0] = 0; } void Clear() { mCount = 0; mBuffer[0] = 0; } s32 Find(char aChar, s32 aStart = 0) const { for (u8 i = (u8) aStart; i < mCount; ++i) { if (mBuffer[i] == aChar) { return (s32) i; } } return -1; } s32 Find(const char *aString, s32 aStart = 0) const { const char *_Ptr = strstr(mBuffer + aStart, aString); if (_Ptr) return (s32) (_Ptr - mBuffer); return -1; } s32 FindLast(char aChar) const { for (u8 i = mCount; i != 0; --i) { if (mBuffer[i - 1] == aChar) { return (s32) (i - 1); } } return -1; } String SubString(s32 aStart, s32 aCount = STRING_SIZE - 1) const { if (aStart >= mCount) return String(); if (aCount < 0) aCount = STRING_SIZE - 1; aCount = MIN(aCount, mCount - aStart); String _String; _String.mCount = aCount; memcpy(_String.mBuffer, mBuffer + aStart, aCount); _String.mBuffer[aCount] = 0; return _String; } public: inline const char *begin() const { return mBuffer; } inline const char *end() const { return mBuffer + mCount; } inline char *begin() { return mBuffer; } inline char *end() { return mBuffer + mCount; } inline const char &operator[](s32 aIndex) const { return mBuffer[aIndex]; } inline char &operator[](s32 aIndex) { return mBuffer[aIndex]; } inline s32 Length() const { return (s32) mCount; } inline bool Empty() const { return mCount == 0; } public: bool OPTIMIZE_O3 operator==(const char *aString) const { return !strcmp(mBuffer, aString); } bool OPTIMIZE_O3 operator==(const String &aOther) const { return !strcmp(mBuffer, aOther.mBuffer); } bool OPTIMIZE_O3 operator!=(const char *aString) const { return strcmp(mBuffer, aString); } bool OPTIMIZE_O3 operator!=(const String &aOther) const { return strcmp(mBuffer, aOther.mBuffer); } public: void Read(BinFile *aFile) { mCount = aFile->Read(); aFile->Read(mBuffer, mCount); mBuffer[mCount] = 0; } void Write(BinFile *aFile) const { aFile->Write(mCount); aFile->Write(mBuffer, mCount); } s32 ParseInt() const { s32 i = 0; if (mBuffer[1] == 'x') { sscanf(mBuffer + 2, "%x", &i); } else { sscanf(mBuffer, "%d", &i); } return i; } f32 ParseFloat() const { f32 f = 0.f; sscanf(mBuffer, "%f", &f); return f; } private: char mBuffer[STRING_SIZE]; u8 mCount; }; static_assert(sizeof(String) == (STRING_SIZE + 1), "sizeof(String) must be (STRING_SIZE + 1)"); // // Types // template using Pair = std::pair; typedef std::string SysPath; typedef struct MovtexQuadCollection MovtexQC; class NoCopy { protected: NoCopy() {} ~NoCopy() {} private: NoCopy(const NoCopy &) = delete; void operator=(const NoCopy &) = delete; }; struct TexData : NoCopy { Array mPngData; Array mRawData; s32 mRawWidth = -1; s32 mRawHeight = -1; s32 mRawFormat = -1; s32 mRawSize = -1; bool mUploaded = false; }; struct AnimData : NoCopy { s16 mFlags = 0; s16 mUnk02 = 0; s16 mUnk04 = 0; s16 mUnk06 = 0; s16 mUnk08 = 0; Pair mUnk0A; Pair> mValues; Pair> mIndex; u32 mLength = 0; }; template struct DataNode : NoCopy { String mName; T* mData = NULL; u32 mSize = 0; Array mTokens; u64 mDataIdentifier = 0; u64 mLoadIndex = 0; u8 mFlags = 0; }; template class DataNodes : public Array*> { public: // Find a node given a name. // Return the first node found, ignoring the data identifier. DataNode *Find(const String &aName) { for (auto &node : *this) { if (aName == node->mName) { return node; } } return NULL; } // Find a node given a name and a data identifier. // If a node with the same name and data identifier is not found, // return the last loaded node with the same name. DataNode *Find(const String &aName, u64 aDataIdentifier) { DataNode *best = NULL; for (auto &node : *this) { if (aName == node->mName) { if (aDataIdentifier == node->mDataIdentifier) { return node; } best = node; } } return best; } // Find a node given a name and a data identifier. DataNode *FindExact(const String &aName, u64 aDataIdentifier) { for (auto &node : *this) { if (aName == node->mName && aDataIdentifier == node->mDataIdentifier) { return node; } } return NULL; } }; struct GfxContext { DataNode* mCurrentTexture = NULL; DataNode* mCurrentPalette = NULL; }; template using AnimBuffer = Pair>; struct GfxData : NoCopy { // Model data DataNodes mLights; DataNodes mLight0s; DataNodes mLightTs; DataNodes mAmbientTs; DataNodes mTextures; DataNodes mTextureLists; DataNodes mVertices; DataNodes mDisplayLists; DataNodes mGeoLayouts; DataNodes mCollisions; DataNodes mBehaviorScripts; DataNodes mLevelScripts; DataNodes mMacroObjects; DataNodes mTrajectories; DataNodes mMovtexs; DataNodes mMovtexQCs; DataNodes mRooms; DataNodes mRawPointers; // Animation data Array *> mAnimValues; Array *> mAnimIndices; DataNodes mAnimations; Array> mAnimationTable; // Skip bin output of children Array *> mChildGeoLayouts; // Current u64 mLoadIndex = 0; s32 mErrorCount = 0; u64 mDataIdentifier = 0; s32 mModIndex = 0; s32 mModFileIndex = 0; SysPath mPackFolder; Array mPointerList; Array> mPointerOffsetList; Array mLuaPointerList; Array mLuaTokenList; GfxContext mGfxContext; Array mGeoNodeStack; }; struct ActorGfx { GfxData *mGfxData = NULL; GraphNode *mGraphNode = NULL; s32 mPackIndex = 0; }; struct PackData { s32 mIndex; bool mEnabled; SysPath mPath; String mDisplayName; std::vector> mGfxData; std::vector*> mTextures; bool mLoaded; }; struct LvlCmd { u8 mType; u8 mSize; }; // // Utils // template T* New(u64 aCount = 1llu) { T *_Ptr = (T *) calloc(aCount, sizeof(T)); for (u64 i = 0; i != aCount; ++i) { new (_Ptr + i) T(); // Calls the constructor of type T at address (_Ptr + i) } return _Ptr; } template void Delete(T *& aPtr) { if (aPtr) { aPtr->~T(); free(aPtr); } aPtr = NULL; } template Array Split(const char *aBuffer, const String &aDelimiters, const String &aEndCharacters = {}, bool aHandleDoubleQuotedStrings = false) { Array _Tokens; String _Token; bool _TreatSpaceAsChar = false; u64 _Length = strlen(aBuffer); for (u64 i = 0; i <= _Length; ++i) { if (i == _Length || aDelimiters.Find(aBuffer[i]) != -1) { if (aBuffer[i] == ' ' && _TreatSpaceAsChar) { _Token.Add(aBuffer[i]); } else { if (!_Token.Empty()) { _Tokens.Add(_Token); _Token.Clear(); } if (aEndCharacters.Find(aBuffer[i]) != -1) { break; } } } else { if (aBuffer[i] == '\"' && aHandleDoubleQuotedStrings) { _TreatSpaceAsChar = !_TreatSpaceAsChar; } else { _Token.Add(aBuffer[i]); } } } return _Tokens; } template T *CopyBytes(const T *aPtr, u64 aSize) { T *_Ptr = (T *) calloc(1, aSize); memcpy(_Ptr, aPtr, aSize); return _Ptr; } template void PrintNoNewLine(const char *aFmt, Args... aArgs) { printf(aFmt, aArgs...); fflush(stdout); } template void Print(const char *aFmt, Args... aArgs) { printf(aFmt, aArgs...); printf("\r\n"); fflush(stdout); } template void PrintConsole(enum ConsoleMessageLevel level, const char *aFmt, Args... aArgs) { snprintf(gDjuiConsoleTmpBuffer, CONSOLE_MAX_TMP_BUFFER, aFmt, aArgs...); sys_swap_backslashes(gDjuiConsoleTmpBuffer); djui_console_message_create(gDjuiConsoleTmpBuffer, level); } template void PrintError(const char *aFmt, Args... aArgs) { printf(aFmt, aArgs...); printf("\r\n"); fflush(stdout); PrintConsole(CONSOLE_MESSAGE_ERROR, aFmt, aArgs...); } #define PrintDataError(...) { \ if (aGfxData->mErrorCount == 0) Print(" ERROR!"); \ Print(__VA_ARGS__); \ PrintConsole(CONSOLE_MESSAGE_ERROR, __VA_ARGS__); \ aGfxData->mErrorCount++; \ } #if DEBUG #define PrintDebug(...) { Print(__VA_ARGS__); } #define PrintDebugNoNewLine(...) { PrintNoNewLine(__VA_ARGS__); } #else #define PrintDebug(...) #define PrintDebugNoNewLine(...) #endif template SysPath fstring(const char *aFmt, Args... aArgs) { char buffer[1024]; snprintf(buffer, 1024, aFmt, aArgs...); return SysPath(buffer); } // Wraps the static into a function, to call the constructor on first use #define STATIC_STORAGE(type, name) \ static type &__##name() { \ static type s##name; \ return s##name; \ } // // Main // void *DynOS_SwapCmd(void *aCmd); void *DynOS_UpdateCmd(void *aCmd); void DynOS_UpdateGfx(); bool DynOS_IsTransitionActive(); void DynOS_Mod_Update(); void DynOS_Mod_Shutdown(); // // Gfx // void DynOS_Gfx_Init(); void DynOS_Gfx_Free(GfxData *aGfxData); // // String // u8 *DynOS_String_Convert(const char *aString, bool aHeapAlloc); u8 *DynOS_String_Decapitalize(u8 *aStr64); s32 DynOS_String_Length(const u8 *aStr64); s32 DynOS_String_WidthChar64(u8 aChar64); s32 DynOS_String_Width(const u8 *aStr64); // // Geo // // // Levels // void DynOS_Level_Init(); s8 DynOS_Level_GetCourse(s32 aLevel); void DynOS_Level_Override(void* originalScript, void* newScript, s32 modIndex); void DynOS_Level_Unoverride(); const void *DynOS_Level_GetScript(s32 aLevel); s32 DynOS_Level_GetModIndex(s32 aLevel); bool DynOS_Level_IsVanillaLevel(s32 aLevel); Collision *DynOS_Level_GetCollision(u32 aLevel, u16 aArea); s16 *DynOS_Level_GetWarp(s32 aLevel, s32 aArea, s8 aWarpId); s16 *DynOS_Level_GetWarpEntry(s32 aLevel, s32 aArea); s16 *DynOS_Level_GetWarpDeath(s32 aLevel, s32 aArea); u64 DynOS_Level_CmdGet(void *aCmd, u64 aOffset); LvlCmd *DynOS_Level_CmdNext(LvlCmd *aCmd); void DynOS_Level_ParseScript(const void *aScript, s32 (*aPreprocessFunction)(u8, void *)); // // Warps // void *DynOS_Warp_Update(void *aCmd, bool aIsLevelInitDone); bool DynOS_Warp_ToWarpNode(s32 aLevel, s32 aArea, s32 aAct, s32 aWarpId); bool DynOS_Warp_ToLevel(s32 aLevel, s32 aArea, s32 aAct); bool DynOS_Warp_RestartLevel(); bool DynOS_Warp_ExitLevel(s32 aDelay); bool DynOS_Warp_ToCastle(s32 aLevel); // // Builtin // const void* DynOS_Builtin_ScriptPtr_GetFromName(const char* aDataName); const char* DynOS_Builtin_ScriptPtr_GetFromData(const void* aData); const GeoLayout* DynOS_Builtin_Actor_GetFromName(const char* aDataName); const char* DynOS_Builtin_Actor_GetFromData(const GeoLayout* aData); const GeoLayout* DynOS_Builtin_Actor_GetFromIndex(s32 aIndex); const char* DynOS_Builtin_Actor_GetNameFromIndex(s32 aIndex); s32 DynOS_Builtin_Actor_GetCount(); const MacroObject* DynOS_Builtin_LvlMacro_GetFromName(const char* aDataName); const char* DynOS_Builtin_LvlMacro_GetFromData(const MacroObject* aData); const GeoLayout* DynOS_Builtin_LvlGeo_GetFromName(const char* aDataName); const char* DynOS_Builtin_LvlGeo_GetFromData(const GeoLayout* aData); const Collision* DynOS_Builtin_Col_GetFromName(const char* aDataName); const char* DynOS_Builtin_Col_GetFromData(const Collision* aData); const Animation *DynOS_Builtin_Anim_GetFromName(const char *aDataName); const char * DynOS_Builtin_Anim_GetFromData(const Animation *aData); const Texture* DynOS_Builtin_Tex_GetFromName(const char* aDataName); const char* DynOS_Builtin_Tex_GetFromData(const Texture* aData); const char* DynOS_Builtin_Tex_GetNameFromFileName(const char* aDataName); const struct TextureInfo* DynOS_Builtin_Tex_GetInfoFromName(const char* aDataName); const struct TextureInfo* DynOS_Builtin_Tex_GetInfoFromData(const Texture* aData); const void* DynOS_Builtin_Func_GetFromName(const char* aDataName, u8 aFuncType); const void* DynOS_Builtin_Func_GetFromIndex(s32 aIndex, u8 aFuncType); const char * DynOS_Builtin_Func_GetNameFromIndex(s32 aIndex, u8 aFuncType); s32 DynOS_Builtin_Func_GetIndexFromData(const void* aData, u8 aFuncType); String DynOS_Builtin_Func_CheckMisuse(s32 aIndex, u8 aFuncType); String DynOS_Builtin_Func_CheckMisuse(const char* aDataName, u8 aFuncType); String DynOS_Builtin_Func_CheckMisuse(const void* aData, u8 aFuncType); const Gfx * DynOS_Builtin_Gfx_GetFromName(const char *aDataName); const char * DynOS_Builtin_Gfx_GetFromData(const Gfx *aData); // // Pack Manager // s32 DynOS_Pack_GetCount(); void DynOS_Pack_SetEnabled(PackData* aPack, bool aEnabled); PackData* DynOS_Pack_GetFromIndex(s32 aIndex); PackData* DynOS_Pack_GetFromPath(const SysPath& aPath); PackData* DynOS_Pack_Add(const SysPath& aPath); std::pair* DynOS_Pack_GetActor(PackData* aPackData, const char* aActorName); void DynOS_Pack_AddActor(PackData* aPackData, const char* aActorName, GfxData* aGfxData); DataNode* DynOS_Pack_GetTex(PackData* aPackData, const char* aTexName); void DynOS_Pack_AddTex(PackData* aPackData, DataNode* aTexData); // // Actor Manager // std::map &DynOS_Actor_GetValidActors(); bool DynOS_Actor_AddCustom(s32 aModIndex, s32 aModFileIndex, const SysPath &aFilename, const char *aActorName); const void *DynOS_Actor_GetLayoutFromName(const char *aActorName); bool DynOS_Actor_GetModIndexAndToken(const GraphNode *aGraphNode, u32 aTokenIndex, s32 *outModIndex, s32 *outModFileIndex, const char **outToken); ActorGfx* DynOS_Actor_GetActorGfx(const GraphNode* aGraphNode); void DynOS_Actor_Valid(const void* aGeoref, ActorGfx& aActorGfx); void DynOS_Actor_Invalid(const void* aGeoref, s32 aPackIndex); void DynOS_Actor_Override(struct Object* obj, void** aSharedChild); void DynOS_Actor_Override_All(void); void DynOS_Actor_RegisterModifiedGraphNode(GraphNode *aNode); void DynOS_Actor_ModShutdown(); // // Anim Manager // void DynOS_Anim_Swap(void *aPtr); // // Tex Manager // void DynOS_Tex_Valid(GfxData* aGfxData); void DynOS_Tex_Invalid(GfxData* aGfxData); void DynOS_Tex_Update(); u8 *DynOS_Tex_ConvertToRGBA32(const u8 *aData, u64 aLength, s32 aFormat, s32 aSize, const u8 *aPalette); bool DynOS_Tex_Import(void **aOutput, void *aPtr, s32 aTile, void *aGfxRApi, void **aHashMap, void *aPool, u32 *aPoolPos, u32 aPoolSize); void DynOS_Tex_Activate(DataNode* aNode, bool aCustomTexture); void DynOS_Tex_Deactivate(DataNode* aNode); bool DynOS_Tex_AddCustom(const SysPath &aFilename, const char *aTexName); bool DynOS_Tex_Get(const char* aTexName, struct TextureInfo* aOutTexInfo); bool DynOS_Tex_GetFromData(const Texture *aTex, struct TextureInfo* aOutTexInfo); void DynOS_Tex_Override_Set(const char* textureName, struct TextureInfo* aOverrideTexInfo); void DynOS_Tex_Override_Reset(const char* textureName); void DynOS_Tex_ModShutdown(); // // Lvl Manager // std::vector> &DynOS_Lvl_GetArray(); LevelScript* DynOS_Lvl_GetScript(const char* aScriptEntryName); void DynOS_Lvl_Activate(s32 modIndex, const SysPath &aFilePath, const char *aLevelName); GfxData* DynOS_Lvl_GetActiveGfx(void); const char* DynOS_Lvl_GetToken(u32 index); DataNode* DynOS_Lvl_GetMovtexQuadCollection(s32 index); Trajectory* DynOS_Lvl_GetTrajectory(const char* aName); void DynOS_Lvl_LoadBackground(void *aPtr); void* DynOS_Lvl_Override(void *aCmd); void DynOS_Lvl_ModShutdown(); // // Bhv Manager // std::vector> &DynOS_Bhv_GetArray(); void DynOS_Bhv_Activate(s32 modIndex, const SysPath &aFilename, const char *aBehaviorName); GfxData *DynOS_Bhv_GetActiveGfx(BehaviorScript *bhvScript); bool DynOS_Bhv_GetActiveModIndex(BehaviorScript *bhvScript, s32 *modIndex, s32 *modFileIndex); const char *DynOS_Bhv_GetToken(BehaviorScript *bhvScript, u32 index); void DynOS_Bhv_HookAllCustomBehaviors(); void DynOS_Bhv_ModShutdown(); // // Col Manager // bool DynOS_Col_Activate(const SysPath &aFilePath, const char *aCollisionName); Collision* DynOS_Col_Get(const char* collisionName); void DynOS_Col_ModShutdown(); // // Movtexqc Manager // void DynOS_MovtexQC_Register(const char* name, s16 level, s16 area, s16 type); DataNode* DynOS_MovtexQC_GetFromId(u32 id); DataNode* DynOS_MovtexQC_GetFromIndex(s32 index); void DynOS_MovtexQC_ModShutdown(); // // Model Manager // struct GraphNode* DynOS_Model_LoadGeo(u32* aId, enum ModelPool aModelPool, void* aAsset, bool aDeDuplicate); struct GraphNode* DynOS_Model_LoadDl(u32* aId, enum ModelPool aModelPool, u8 aLayer, void* aAsset); struct GraphNode* DynOS_Model_StoreGeo(u32* aId, enum ModelPool aModelPool, void* aAsset, struct GraphNode* aGraphNode); struct GraphNode* DynOS_Model_GetGeo(u32 aId); u32 DynOS_Model_GetIdFromAsset(void* asset); u32 DynOS_Model_GetIdFromGraphNode(struct GraphNode* aNode); enum ModelPool DynOS_Model_GetModelPoolFromGraphNode(struct GraphNode* aNode); void DynOS_Model_OverwriteSlot(u32 srcSlot, u32 dstSlot); void DynOS_Model_ClearPool(enum ModelPool aModelPool); // // Gfx Manager // Gfx *DynOS_Gfx_GetWritableDisplayList(Gfx *aGfx); Gfx *DynOS_Gfx_Get(const char *aName, u32 *outLength); const char *DynOS_Gfx_GetName(Gfx *aGfx); Gfx *DynOS_Gfx_Create(const char *aName, u32 aLength); bool DynOS_Gfx_Resize(Gfx *aGfx, u32 aNewLength); bool DynOS_Gfx_Delete(Gfx *aGfx); void DynOS_Gfx_DeleteAll(); Vtx *DynOS_Vtx_Get(const char *aName, u32 *outCount); const char *DynOS_Vtx_GetName(Vtx *aVtx); Vtx *DynOS_Vtx_Create(const char *aName, u32 aCount); bool DynOS_Vtx_Resize(Vtx *aVtx, u32 aNewCount); bool DynOS_Vtx_Delete(Vtx *aVtx); void DynOS_Vtx_DeleteAll(); void DynOS_Gfx_ModShutdown(); // // Mod Data Manager // #include "dynos_mgr_moddata.hpp" // // Bin // typedef s64 (*RDConstantFunc)(const String& _Arg, bool* found); u32 DynOS_Lua_RememberVariable(GfxData* aGfxData, void* aPtr, const String& token); void DynOS_Gfx_GenerateModPacks(char* modPath); void DynOS_Gfx_GeneratePacks(const char* directory); s64 DynOS_RecursiveDescent_Parse(const char* expr, bool* success, RDConstantFunc func); u64 DynOS_NewDataIdentifier(); void DynOS_Read_Source(GfxData *aGfxData, const SysPath &aFilename); char *DynOS_Read_Buffer(FILE* aFile, GfxData* aGfxData); bool DynOS_ShouldGeneratePack(const SysPath &aPackFolder, std::initializer_list aExtensions); bool DynOS_ShouldGeneratePack2Ext(const SysPath &aPackFolder, const char *aGenExtension, const char *aSrcExtension); bool DynOS_GenFileExistsAndIsNewerThanFile(const SysPath &aGenFile, const SysPath &aSrcFile); bool DynOS_GenFileExistsAndIsNewerThanFolder(const SysPath &aGenFile, const SysPath &aSrcFolder); String DynOS_GetActorFolder(const Array> &aActorsFolders, u64 aModelIdentifier); s64 DynOS_Misc_ParseInteger(const String& _Arg, bool* found); void DynOS_Anim_ScanFolder(GfxData *aGfxData, const SysPath &aAnimsFolder); void DynOS_Anim_Table_Write(BinFile* aFile, GfxData* aGfxData); void DynOS_Anim_Write(BinFile* aFile, GfxData* aGfxData); void DynOS_Anim_Load(BinFile *aFile, GfxData *aGfxData); void DynOS_Anim_Table_Load(BinFile *aFile, GfxData *aGfxData); DataNode* DynOS_Col_Parse(GfxData* aGfxData, DataNode* aNode, bool aDisplayPercent); void DynOS_Col_Write(BinFile* aFile, GfxData* aGfxData, DataNode *aNode); DataNode* DynOS_Col_Load(BinFile *aFile, GfxData *aGfxData); DataNode* DynOS_Col_LoadFromBinary(const SysPath &aFilename, const char *aCollisionName); void DynOS_Col_Generate(const SysPath &aPackFolder, Array> _ActorsFolders, GfxData *_GfxData); DataNode* DynOS_Geo_Parse(GfxData* aGfxData, DataNode* aNode, bool aDisplayPercent); void DynOS_Geo_Write(BinFile *aFile, GfxData *aGfxData, DataNode *aNode); void DynOS_Geo_Load(BinFile *aFile, GfxData *aGfxData); DataNode* DynOS_Gfx_Parse(GfxData* aGfxData, DataNode* aNode); void DynOS_Gfx_Write(BinFile *aFile, GfxData *aGfxData, DataNode *aNode); void DynOS_Gfx_Load(BinFile *aFile, GfxData *aGfxData); s64 DynOS_Gfx_ParseGfxConstants(const String& _Arg, bool* found); DataNode* DynOS_Lights_Parse(GfxData* aGfxData, DataNode* aNode); void DynOS_Lights_Write(BinFile* aFile, GfxData* aGfxData, DataNode *aNode); void DynOS_Lights_Load(BinFile *aFile, GfxData *aGfxData); DataNode* DynOS_Light0_Parse(GfxData* aGfxData, DataNode* aNode); void DynOS_Light0_Write(BinFile* aFile, GfxData* aGfxData, DataNode *aNode); void DynOS_Light0_Load(BinFile *aFile, GfxData *aGfxData); DataNode* DynOS_LightT_Parse(GfxData* aGfxData, DataNode* aNode); void DynOS_LightT_Write(BinFile* aFile, GfxData* aGfxData, DataNode *aNode); void DynOS_LightT_Load(BinFile *aFile, GfxData *aGfxData); DataNode* DynOS_AmbientT_Parse(GfxData* aGfxData, DataNode* aNode); void DynOS_AmbientT_Write(BinFile* aFile, GfxData* aGfxData, DataNode *aNode); void DynOS_AmbientT_Load(BinFile *aFile, GfxData *aGfxData); DataNode* DynOS_MacroObject_Parse(GfxData* aGfxData, DataNode* aNode, bool aDisplayPercent); void DynOS_MacroObject_Write(BinFile* aFile, GfxData* aGfxData, DataNode *aNode); DataNode* DynOS_MacroObject_Load(BinFile *aFile, GfxData *aGfxData); DataNode* DynOS_Trajectory_Parse(GfxData* aGfxData, DataNode* aNode, bool aDisplayPercent); void DynOS_Trajectory_Write(BinFile* aFile, GfxData* aGfxData, DataNode *aNode); DataNode* DynOS_Trajectory_Load(BinFile *aFile, GfxData *aGfxData); DataNode* DynOS_Movtex_Parse(GfxData* aGfxData, DataNode* aNode, bool aDisplayPercent); void DynOS_Movtex_Write(BinFile* aFile, GfxData* aGfxData, DataNode *aNode); DataNode* DynOS_Movtex_Load(BinFile *aFile, GfxData *aGfxData); DataNode* DynOS_MovtexQC_Parse(GfxData* aGfxData, DataNode* aNode); void DynOS_MovtexQC_Write(BinFile* aFile, GfxData* aGfxData, DataNode *aNode); DataNode* DynOS_MovtexQC_Load(BinFile *aFile, GfxData *aGfxData); DataNode* DynOS_Rooms_Parse(GfxData* aGfxData, DataNode* aNode); void DynOS_Rooms_Write(BinFile* aFile, GfxData* aGfxData, DataNode *aNode); DataNode* DynOS_Rooms_Load(BinFile *aFile, GfxData *aGfxData); DataNode* DynOS_Tex_Parse(GfxData* aGfxData, DataNode* aNode); void DynOS_Tex_Write(BinFile* aFile, GfxData* aGfxData, DataNode *aNode); DataNode* DynOS_Tex_Load(BinFile *aFile, GfxData *aGfxData); DataNode* DynOS_Tex_LoadFromBinary(const SysPath &aPackFolder, const SysPath &aFilename, const char *aTexName, bool aAddToPack); void DynOS_Tex_ConvertTextureDataToPng(GfxData *aGfxData, TexData* aTexture); void DynOS_Tex_GeneratePack(const SysPath &aPackFolder, SysPath &aOutputFolder, bool aAllowCustomTextures); DataNode* DynOS_TexList_Parse(GfxData* aGfxData, DataNode* aNode); void DynOS_TexList_Write(BinFile* aFile, GfxData* aGfxData, DataNode *aNode); DataNode* DynOS_TexList_Load(BinFile *aFile, GfxData *aGfxData); DataNode* DynOS_Vtx_Parse(GfxData* aGfxData, DataNode* aNode); void DynOS_Vtx_Write(BinFile* aFile, GfxData* aGfxData, DataNode *aNode); void DynOS_Vtx_Load(BinFile *aFile, GfxData *aGfxData); void DynOS_Pointer_Lua_Write(BinFile* aFile, u32 index, GfxData* aGfxData); void DynOS_Pointer_Write(BinFile* aFile, const void* aPtr, GfxData* aGfxData, u8 aFuncType); void *DynOS_Pointer_Load(BinFile *aFile, GfxData *aGfxData, u32 aValue, u8 aFuncType, u8* outFlags); void DynOS_GfxDynCmd_Load(BinFile *aFile, GfxData *aGfxData); GfxData *DynOS_Actor_LoadFromBinary(const SysPath &aPackFolder, const char *aActorName, const SysPath &aFilename, bool aAddToPack); void DynOS_Actor_GeneratePack(const SysPath &aPackFolder); DataNode* DynOS_Lvl_Parse(GfxData* aGfxData, DataNode* aNode, bool aDisplayPercent); GfxData *DynOS_Lvl_LoadFromBinary(const SysPath &aFilename, const char *aLevelName); void DynOS_Lvl_GeneratePack(const SysPath &aPackFolder); s64 DynOS_Lvl_ParseLevelScriptConstants(const String& _Arg, bool* found); void DynOS_Lvl_Validate_Begin(); bool DynOS_Lvl_Validate_RequirePointer(u32 value); DataNode *DynOS_Bhv_Parse(GfxData *aGfxData, DataNode *aNode, bool aDisplayPercent); GfxData *DynOS_Bhv_LoadFromBinary(const SysPath &aFilename, const char *aBehaviorName); void DynOS_Bhv_GeneratePack(const SysPath &aPackFolder); s64 DynOS_Bhv_ParseBehaviorScriptConstants(const String &_Arg, bool *found); s64 DynOS_Bhv_ParseBehaviorIntegerScriptConstants(const String &_Arg, bool *found); s64 DynOS_Common_ParseBhvConstants(const String &_Arg, bool *found); s64 DynOS_Common_ParseModelConstants(const String &_Arg, bool *found); bool DynOS_Bin_IsCompressed(const SysPath &aFilename); bool DynOS_Bin_Compress(const SysPath &aFilename); BinFile *DynOS_Bin_Decompress(const SysPath &aFilename); void DynOS_Add_Scroll_Target(u32 index, const char *name, u32 offset, u32 size); #endif #endif