diff options
| author | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
|---|---|---|
| committer | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
| commit | b691c43c44ff180d10e7d4a9afc83b98551ff586 (patch) | |
| tree | 3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.World/VillagePieces.h | |
| parent | def8cb415354ac390b7e89052a50605285f1aca9 (diff) | |
Initial commit
Diffstat (limited to 'Minecraft.World/VillagePieces.h')
| -rw-r--r-- | Minecraft.World/VillagePieces.h | 353 |
1 files changed, 353 insertions, 0 deletions
diff --git a/Minecraft.World/VillagePieces.h b/Minecraft.World/VillagePieces.h new file mode 100644 index 00000000..a80dfcf7 --- /dev/null +++ b/Minecraft.World/VillagePieces.h @@ -0,0 +1,353 @@ +#pragma once +#include "StructurePiece.h" + +class BiomeSource; + +class VillagePieces +{ + +private: + static const int MAX_DEPTH = 50; + static const int BASE_ROAD_DEPTH = 3; + // the dungeon starts at 64 and traverses downwards to this point + static const int LOWEST_Y_POSITION = 10; + +public: + static const int SIZE_SMALL = 0; + static const int SIZE_BIG = 1; + static const int SIZE_BIGGEST = 2; + + // 4J - added to replace use of Class<? extends VillagePiece> within this class + enum EPieceClass + { + EPieceClass_SimpleHouse, + EPieceClass_SmallTemple, + EPieceClass_BookHouse, + EPieceClass_SmallHut, + EPieceClass_PigHouse, + EPieceClass_DoubleFarmland, + EPieceClass_Farmland, + EPieceClass_Smithy, + EPieceClass_TwoRoomHouse + }; + + class PieceWeight { + public: + EPieceClass pieceClass; // 4J - EPieceClass was Class<? extends VillagePiece> + const int weight; + int placeCount; + int maxPlaceCount; + + PieceWeight(EPieceClass pieceClass, int weight, int maxPlaceCount); // 4J - EPieceClass was Class<? extends VillagePiece> + bool doPlace(int depth); + bool isValid(); + }; + + static list<PieceWeight *> *createPieceSet(Random *random, int villageSize); // 4J - was ArrayList + + class StartPiece; +private: + class VillagePiece; + static int updatePieceWeight(list<PieceWeight *> *currentPieces); // 4J = was array list + static VillagePiece *findAndCreatePieceFactory(StartPiece *startPiece, PieceWeight *piece, list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int depth); + static VillagePiece *generatePieceFromSmallDoor(StartPiece *startPiece, list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int depth); + static StructurePiece *generateAndAddPiece(StartPiece *startPiece, list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int depth); + static StructurePiece *generateAndAddRoadPiece(StartPiece *startPiece, list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int depth); + + + /** + * + * + */ +private: + class VillagePiece : public StructurePiece + { + private: + int spawnedVillagerCount; + protected: + StartPiece *startPiece; + + VillagePiece(StartPiece *startPiece, int genDepth); + StructurePiece *generateHouseNorthernLeft(StartPiece *startPiece, list<StructurePiece *> *pieces, Random *random, int yOff, int zOff); + StructurePiece *generateHouseNorthernRight(StartPiece *startPiece, list<StructurePiece *> *pieces, Random *random, int yOff, int zOff); + int getAverageGroundHeight(Level *level, BoundingBox *chunkBB); + static bool isOkBox(BoundingBox *box, StartPiece *startRoom); // 4J added startRoom param + void spawnVillagers(Level *level, BoundingBox *chunkBB, int x, int y, int z, int count); + virtual int getVillagerProfession(int villagerNumber); + virtual int biomeBlock(int tile, int data); + virtual int biomeData(int tile, int data); + virtual void placeBlock(Level *level, int block, int data, int x, int y, int z, BoundingBox *chunkBB); + virtual void generateBox(Level *level, BoundingBox *chunkBB, int x0, int y0, int z0, int x1, int y1, int z1, int edgeTile, int fillTile, bool skipAir); + virtual void fillColumnDown(Level *level, int block, int data, int x, int startY, int z, BoundingBox *chunkBB); + }; + + /** + * + * + */ +public: + class Well : public VillagePiece + { + private: + static const int width = 6; + static const int height = 15; + static const int depth = 6; + + const bool isSource; + int heightPosition; + + public: + Well(StartPiece *startPiece, int genDepth, Random *random, int west, int north); + + Well(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); + virtual void addChildren(StructurePiece *startPiece, list<StructurePiece *> *pieces, Random *random); + //static Well *createPiece(list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; + +public: + class StartPiece : public Well + { + public: + BiomeSource *biomeSource; + bool isDesertVillage; + + int villageSize; + bool isLibraryAdded; + PieceWeight *previousPiece; + list<PieceWeight *> *pieceSet; // 4J - was ArrayList + Level *m_level; + + // these queues are used so that the addChildren calls are + // called in a random order + vector<StructurePiece *> pendingHouses; // 4J - was ArrayList + vector<StructurePiece *> pendingRoads; // 4J - was ArrayList + + StartPiece(BiomeSource *biomeSource, int genDepth, Random *random, int west, int north, list<PieceWeight *> *pieceSet, int villageSize, Level *level); // 4J Added level param + virtual ~StartPiece(); + + BiomeSource *getBiomeSource(); + + }; + +public: + class VillageRoadPiece : public VillagePiece + { + protected : + VillageRoadPiece(StartPiece *startPiece, int genDepth) : VillagePiece(startPiece, genDepth) {} + }; + + /** + * + * + */ +public: + class StraightRoad : public VillageRoadPiece + { + + private: + static const int width = 3; + int length; + public: + StraightRoad(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); + virtual void addChildren(StructurePiece *startPiece, list<StructurePiece *> *pieces, Random *random); + static BoundingBox *findPieceBox(StartPiece *startPiece, list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; + + /** + * + * + */ +public: + class SimpleHouse : public VillagePiece + { + private: + static const int width = 5; + static const int height = 6; + static const int depth = 5; + + private: + int heightPosition; + const bool hasTerrace; + + public: + SimpleHouse(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); + public: + static SimpleHouse *createPiece(StartPiece *startPiece, list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; + +public: + class SmallTemple : public VillagePiece + { + private: + static const int width = 5; + static const int height = 12; + static const int depth = 9; + + int heightPosition; + + public: + SmallTemple(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); + + static SmallTemple *createPiece(StartPiece *startPiece, list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + virtual int getVillagerProfession(int villagerNumber); + }; + +public: + class BookHouse : public VillagePiece + { + private: + static const int width = 9; + static const int height = 9; + static const int depth = 6; + + int heightPosition; + + public: + BookHouse(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); + + static BookHouse *createPiece(StartPiece *startPiece, list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + virtual int getVillagerProfession(int villagerNumber); + }; + + public: + class SmallHut : public VillagePiece + { + + private: + static const int width = 4; + static const int height = 6; + static const int depth = 5; + + int heightPosition; + const bool lowCeiling; + const int tablePlacement; + + public: + SmallHut(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); + static SmallHut *createPiece(StartPiece *startPiece, list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; + +public: + class PigHouse : public VillagePiece + { + + private: + static const int width = 9; + static const int height = 7; + static const int depth = 11; + + int heightPosition; + + public: + PigHouse(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); + static PigHouse *createPiece(StartPiece *startPiece, list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + virtual int getVillagerProfession(int villagerNumber); + }; + +public: + class TwoRoomHouse : public VillagePiece + { + private: + static const int width = 9; + static const int height = 7; + static const int depth = 12; + + int heightPosition; + + public: + TwoRoomHouse(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); + static TwoRoomHouse *createPiece(StartPiece *startPiece, list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; + +public: + class Smithy : public VillagePiece + { + + private: + static const int width = 10; + static const int height = 6; + static const int depth = 7; + + int heightPosition; + bool hasPlacedChest; + + static WeighedTreasureArray treasureItems; + + public: + static void staticCtor(); + + Smithy(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); + static Smithy *createPiece(StartPiece *startPiece, list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + virtual int getVillagerProfession(int villagerNumber); + }; + +public: + class Farmland : public VillagePiece + { + + private: + static const int width = 7; + static const int height = 4; + static const int depth = 9; + + int heightPosition; + + int cropsA; + int cropsB; + + int selectCrops(Random *random); + + public: + Farmland(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); + static Farmland *createPiece(StartPiece *startPiece, list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; + +public: + class DoubleFarmland : public VillagePiece + { + private: + static const int width = 13; + static const int height = 4; + static const int depth = 9; + + int heightPosition; + + int cropsA; + int cropsB; + int cropsC; + int cropsD; + + int selectCrops(Random *random); + + public: + DoubleFarmland(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); + static DoubleFarmland *createPiece(StartPiece *startPiece, list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; + +public: + class LightPost : public VillagePiece + { + private: + static const int width = 3; + static const int height = 4; + static const int depth = 2; + + int heightPosition; + + public: + LightPost(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *box, int direction); + static BoundingBox *findPieceBox(StartPiece *startPiece, list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; +}; |
