#pragma once using namespace std; enum eGenerateStructure { eGenerateStructure_Block = 0, eGenerateStructure_maybeGenerateBlock, eGenerateStructure_AirBox, eGenerateStructure_Box, eGenerateStructure_MaybeBox, eGenerateStructure_UpperHalfSphere, eGenerateStructure_FullSphere, eGenerateStructure_AirColumnUp, eGenerateStructure_fillColumnDown, eGenerateStructure_fillBoxDown, eGenerateStructure_generateAirBoxUp, eGenerateStructure_Crops, eGenerateStructure_CreateDoor, eGenerateStructure_CheckBlock, eGenerateStructure_Count }; enum eGenerateObject { eGenerateObject_Chest = 0, eGenerateObject_Dispenser, eGenerateObject_Count }; enum eGenerateEntity { eGenerateEntity_Villager = 0, eGenerateEntity_Witch, eGenerateEntity_Count }; class StructureTable { public: enum eBlockDataType { eBlockDataType_Default = 0, eBlockDataType_Orientation, eBlockDataType_Inverted }; public: struct StructureData { int id; wstring name; int tileId; int data; int dataType; int secondTileId; int secondData; int secondDataType; int x0; int y0; int z0; int x1; int y1; int z1; int startRemap0; int startRemap1; int startRemap2; int endRemap0; int endRemap1; int endRemap2; vector cropAges; vector v25; vector v26; vector v27; }; struct TreasureData { int itemId; int auxValue; int minCount; int maxCount; int weight; }; struct ObjectData { int id; wstring name; int x; int y; int z; int minEnchantedBooks; int maxEnchantedBooks; int enchantedBookWeight; int rollCount; bool canGenEnchantedBooks; int rollWeight; int dispenserDir; }; struct EntityData { int id; int x; int y; int z; int count; vector professions; }; struct StructurePiece { wstring name; int width; int height; int depth; vector structures; vector treasure; vector objects; vector entities; int v8; vector v11; vector cropTiles; }; struct StructureFeature { wstring name; vector options; unordered_map tiles; // @3UR: this maps one tile id to another }; private: StructurePiece m_structurePieces[eMinecraftStructurePiece_Count]; StructureFeature m_structureFeatures[eMinecraftStructureFeature_Count]; static const wchar_t *StructureFeatureElements[eMinecraftStructureFeature_Count]; static const wchar_t *StructurePieceElements[eMinecraftStructurePiece_Count]; static const wchar_t *GenerateObjectElements[eGenerateObject_Count]; static const wchar_t *GenerateEntityElements[eGenerateEntity_Count]; static const wchar_t *GenerateStructureElements[eGenerateStructure_Count]; static unordered_map s_structureFeatureNamesMap; static unordered_map s_structurePieceNamesMap; static unordered_map s_generateObjectNamesMap; static unordered_map s_generateEntityNamesMap; static unordered_map s_generateStructureNamesMap; public: static void staticCtor(); StructureTable(PBYTE pbData, DWORD dwLength); StructurePiece *getStructurePiece(eMinecraftStructurePiece piece); StructureFeature *getStructureFeature(eMinecraftStructureFeature feature); void loadStructuresFromData(PBYTE pbData, DWORD dwLength); void setStructurePiece(const wstring& name, const StructurePiece& piece); // @Patoke: seems to be inlined in Wii U, functionality is 1:1 with StructurePiece::readIntSaveData inline void readIntSaveData(DataInputStream& dis, vector& container); };