From f6410370acfa1bba1d44f6d9f26bbe3335f08d28 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Tue, 16 Aug 2016 13:58:45 +0200 Subject: [PATCH] Stringtable tests --- deps/mongoose | 2 +- deps/protobuf | 2 +- src/Components/Modules/AssetHandler.cpp | 1 + src/Components/Modules/AssetHandler.hpp | 1 + .../Modules/AssetInterfaces/IMapEnts.cpp | 1 - .../Modules/AssetInterfaces/IStringTable.cpp | 51 +++++++++++++++++++ .../Modules/AssetInterfaces/IStringTable.hpp | 13 +++++ src/Components/Modules/Console.cpp | 5 +- src/Components/Modules/StringTable.cpp | 6 ++- 9 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 src/Components/Modules/AssetInterfaces/IStringTable.cpp create mode 100644 src/Components/Modules/AssetInterfaces/IStringTable.hpp diff --git a/deps/mongoose b/deps/mongoose index 2efc8598..8cdd19bc 160000 --- a/deps/mongoose +++ b/deps/mongoose @@ -1 +1 @@ -Subproject commit 2efc8598297de21d54ab52e383ed8adbb3325d3d +Subproject commit 8cdd19bcaed7f503de7902804d0d96ce51e95a34 diff --git a/deps/protobuf b/deps/protobuf index d9ccf4d0..4763e64e 160000 --- a/deps/protobuf +++ b/deps/protobuf @@ -1 +1 @@ -Subproject commit d9ccf4d0b1fdfb55bdc41f49d42f37a6c4b5302a +Subproject commit 4763e64eb1e72e628ab75a9872f4146fdd2cf765 diff --git a/src/Components/Modules/AssetHandler.cpp b/src/Components/Modules/AssetHandler.cpp index 753560a2..95cf3e8e 100644 --- a/src/Components/Modules/AssetHandler.cpp +++ b/src/Components/Modules/AssetHandler.cpp @@ -265,6 +265,7 @@ namespace Components AssetHandler::RegisterInterface(new Assets::IPhysPreset()); AssetHandler::RegisterInterface(new Assets::IXAnimParts()); AssetHandler::RegisterInterface(new Assets::IPhysCollmap()); + AssetHandler::RegisterInterface(new Assets::IStringTable()); //AssetHandler::RegisterInterface(new Assets::IXModelSurfs()); AssetHandler::RegisterInterface(new Assets::ILocalizedEntry()); AssetHandler::RegisterInterface(new Assets::IMaterialPixelShader()); diff --git a/src/Components/Modules/AssetHandler.hpp b/src/Components/Modules/AssetHandler.hpp index ed8637e8..33d30fa2 100644 --- a/src/Components/Modules/AssetHandler.hpp +++ b/src/Components/Modules/AssetHandler.hpp @@ -68,6 +68,7 @@ namespace Components #include "AssetInterfaces\IPhysPreset.hpp" #include "AssetInterfaces\IXAnimParts.hpp" #include "AssetInterfaces\IPhysCollmap.hpp" +#include "AssetInterfaces\IStringTable.hpp" #include "AssetInterfaces\IXModelSurfs.hpp" #include "AssetInterfaces\ILocalizedEntry.hpp" #include "AssetInterfaces\IMaterialPixelShader.hpp" diff --git a/src/Components/Modules/AssetInterfaces/IMapEnts.cpp b/src/Components/Modules/AssetInterfaces/IMapEnts.cpp index 70218d21..21ae1def 100644 --- a/src/Components/Modules/AssetInterfaces/IMapEnts.cpp +++ b/src/Components/Modules/AssetInterfaces/IMapEnts.cpp @@ -94,7 +94,6 @@ namespace Assets Game::Stage* stage = &asset->stages[i]; buffer->SaveString(stage->stageName); - Utils::Stream::ClearPointer(&destStage->stageName); } diff --git a/src/Components/Modules/AssetInterfaces/IStringTable.cpp b/src/Components/Modules/AssetInterfaces/IStringTable.cpp new file mode 100644 index 00000000..95829221 --- /dev/null +++ b/src/Components/Modules/AssetInterfaces/IStringTable.cpp @@ -0,0 +1,51 @@ +#include + +namespace Assets +{ + void IStringTable::Save_StringTableCellArray(Components::ZoneBuilder::Zone* builder, Game::StringTableCell* values, int count) + { + Assert_Size(Game::StringTableCell, 8); + + Utils::Stream* buffer = builder->GetBuffer(); + + Game::StringTableCell* destValues = buffer->Dest(); + buffer->SaveArray(destValues, count); + + for (int i = 0; i < count; ++i) + { + Game::StringTableCell* destValue = &destValues[i]; + Game::StringTableCell* value = &values[i]; + + buffer->SaveString(value->string); + Utils::Stream::ClearPointer(&destValue->string); + } + } + + void IStringTable::Save(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder) + { + Assert_Size(Game::StringTable, 16); + + Utils::Stream* buffer = builder->GetBuffer(); + Game::StringTable* asset = header.stringTable; + Game::StringTable* dest = buffer->Dest(); + buffer->Save(asset, sizeof(Game::StringTable)); + + buffer->PushBlock(Game::XFILE_BLOCK_VIRTUAL); + + if (asset->name) + { + buffer->SaveString(builder->GetAssetName(this->GetType(), asset->name)); + Utils::Stream::ClearPointer(&dest->name); + } + + if (asset->values) + { + buffer->Align(Utils::Stream::ALIGN_4); + + IStringTable::Save_StringTableCellArray(builder, asset->values, asset->columnCount * asset->rowCount); + Utils::Stream::ClearPointer(&dest->values); + } + + buffer->PopBlock(); + } +} diff --git a/src/Components/Modules/AssetInterfaces/IStringTable.hpp b/src/Components/Modules/AssetInterfaces/IStringTable.hpp new file mode 100644 index 00000000..b2c74516 --- /dev/null +++ b/src/Components/Modules/AssetInterfaces/IStringTable.hpp @@ -0,0 +1,13 @@ +namespace Assets +{ + class IStringTable : public Components::AssetHandler::IAsset + { + public: + virtual Game::XAssetType GetType() override { return Game::XAssetType::ASSET_TYPE_STRINGTABLE; }; + + virtual void Save(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder) override; + + private: + void Save_StringTableCellArray(Components::ZoneBuilder::Zone* builder, Game::StringTableCell* values, int count); + }; +} diff --git a/src/Components/Modules/Console.cpp b/src/Components/Modules/Console.cpp index c215d985..5b0da036 100644 --- a/src/Components/Modules/Console.cpp +++ b/src/Components/Modules/Console.cpp @@ -506,7 +506,10 @@ namespace Components // Don't resize the console Utils::Hook(0x64DC6B, 0x64DCC2, HOOK_JUMP).Install()->Quick(); - Dedicated::OnFrame(Console::RefreshStatus); + if (Dedicated::IsEnabled() && !ZoneBuilder::IsEnabled()) + { + Dedicated::OnFrame(Console::RefreshStatus); + } // Code below is not necessary when performing unit tests! if (Loader::PerformingUnitTests()) return; diff --git a/src/Components/Modules/StringTable.cpp b/src/Components/Modules/StringTable.cpp index 6a5cbd99..7bf4f0b4 100644 --- a/src/Components/Modules/StringTable.cpp +++ b/src/Components/Modules/StringTable.cpp @@ -47,9 +47,11 @@ namespace Components { for (int j = 0; j < table->columnCount; ++j) { + std::string value = parsedTable.GetElementAt(i, j); + Game::StringTableCell* cell = &table->values[i * table->columnCount + j]; - cell->hash = StringTable::Hash(parsedTable.GetElementAt(i, j).data()); - cell->string = StringTable::MemAllocator.DuplicateString(parsedTable.GetElementAt(i, j)); + cell->hash = StringTable::Hash(value.data()); + cell->string = StringTable::MemAllocator.DuplicateString(value); //if (!cell->string) cell->string = ""; // We have to assume it allocated successfully } }