Files
2026-05-14 19:16:33 -04:00

178 lines
3.6 KiB
C++

#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<int> cropAges;
vector<int> v25;
vector<int> v26;
vector<int> 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<int> professions;
};
struct StructurePiece
{
wstring name;
int width;
int height;
int depth;
vector<StructureData> structures;
vector<TreasureData> treasure;
vector<ObjectData> objects;
vector<EntityData> entities;
int v8;
vector<int> v11;
vector<int> cropTiles;
};
struct StructureFeature
{
wstring name;
vector<int> options;
unordered_map<int, int> 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<wstring, eMinecraftStructureFeature> s_structureFeatureNamesMap;
static unordered_map<wstring, eMinecraftStructurePiece> s_structurePieceNamesMap;
static unordered_map<wstring, eGenerateObject> s_generateObjectNamesMap;
static unordered_map<wstring, eGenerateEntity> s_generateEntityNamesMap;
static unordered_map<wstring, eGenerateStructure> 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<int>& container);
};