diff --git a/src/ScriptResolving/AngelScript/AngelScriptResolver.cpp b/src/ScriptResolving/AngelScript/AngelScriptResolver.cpp index c2b2499..cbd9fb9 100644 --- a/src/ScriptResolving/AngelScript/AngelScriptResolver.cpp +++ b/src/ScriptResolving/AngelScript/AngelScriptResolver.cpp @@ -292,7 +292,7 @@ void AngelScriptResolver::WriteByteCodeToFile(const char* file, bool stripDebugI // We grab the current position of the written file. This is the position the types will be written on. So we need // to know this. uint64_t bytecodeSize = (uint64_t)ftell(wFile); - stream->WriteTypes(_typeDatabase); + stream->WriteTypes(_typeDatabase, _itemUseTypes); // Go back to the start of the file fsetpos(wFile, &startPos); @@ -334,7 +334,7 @@ uint8_t* AngelScriptResolver::WriteByteCodeToMemory(size_t& size, bool stripDebu auto result = _mainModule->SaveByteCode(stream, stripDebugInfo); Ensure(result == asSUCCESS); byteCodeSize[0] = (uint64_t)stream->GetWrittenSize(); - stream->WriteTypes(_typeDatabase); + stream->WriteTypes(_typeDatabase, _itemUseTypes); stream->WriteToPosition(byteCodeSize, sizeof(uint64_t), 0); auto arr = stream->GetOut(); size = stream->GetWrittenSize(); @@ -369,13 +369,21 @@ void AngelScriptResolver::InitializeByteCode( } ArbUt::Dictionary> typeDatabase; for (const auto& innerDb : types) { - ArbUt::Dictionary newInnerDb; - for (const auto& val : innerDb.second) { - auto decl = val.second; - auto type = objectTypes[decl]; - newInnerDb.Set(val.first, new AngelScriptTypeInfo(val.first, type)); + if (innerDb.first != (ScriptCategory)-1) { + ArbUt::Dictionary newInnerDb; + for (const auto& val : innerDb.second) { + auto decl = val.second; + auto type = objectTypes[decl]; + newInnerDb.Set(val.first, new AngelScriptTypeInfo(val.first, type)); + } + typeDatabase.Set(innerDb.first, newInnerDb); + } else { + for (const auto& val : innerDb.second) { + auto decl = val.second; + auto type = objectTypes[decl]; + _itemUseTypes[val.first] = type; + } } - typeDatabase.Set(innerDb.first, newInnerDb); } _typeDatabase = typeDatabase; } \ No newline at end of file diff --git a/src/ScriptResolving/AngelScript/ByteCodeHandling/IPkmnBinaryStream.hpp b/src/ScriptResolving/AngelScript/ByteCodeHandling/IPkmnBinaryStream.hpp index 7eb5cc8..5f743cd 100644 --- a/src/ScriptResolving/AngelScript/ByteCodeHandling/IPkmnBinaryStream.hpp +++ b/src/ScriptResolving/AngelScript/ByteCodeHandling/IPkmnBinaryStream.hpp @@ -14,7 +14,8 @@ protected: public: virtual void WriteTypes( - const ArbUt::Dictionary>& types) { + const ArbUt::Dictionary>& types, + const ArbUt::Dictionary itemUseTypes) { // We serialize our types in the format // "[category(byte)][name(str)]\2[decl(str)]\2[name(str)]\2[decl(str)]\1[category(byte)]...." @@ -37,6 +38,22 @@ public: // Write the divider between categories. Write("\1", sizeof(char)); } + + categoryArr[0] = (ScriptCategory)-1; + Write(categoryArr, sizeof(ScriptCategory)); + for (const auto& inner : itemUseTypes) { + // Write the script name + Write(inner.first.c_str(), sizeof(char) * inner.first.Length()); + // Write the divider + Write("\2", sizeof(char)); + // Write the declaration of the script + auto decl = inner.second->GetName(); + Write(decl, sizeof(char) * strlen(decl)); + // Write another divider. + Write("\2", sizeof(char)); + } + // Write the divider between categories. + Write("\1", sizeof(char)); } virtual ArbUt::Dictionary> ReadTypes() { _angelScriptBound = SIZE_MAX;