diff --git a/Minecraft.World/Biome.cpp b/Minecraft.World/Biome.cpp index 781607ea..1496f3e3 100644 --- a/Minecraft.World/Biome.cpp +++ b/Minecraft.World/Biome.cpp @@ -13,8 +13,6 @@ Biome *Biome::biomes[256]; - - Biome *Biome::ocean = nullptr; Biome *Biome::plains = nullptr; Biome *Biome::desert = nullptr; @@ -38,31 +36,55 @@ Biome *Biome::taigaHills = nullptr; Biome *Biome::smallerExtremeHills = nullptr; Biome *Biome::jungle = nullptr; Biome *Biome::jungleHills = nullptr; -Biome *Biome::savanna = nullptr; -Biome *Biome::roofedForest = nullptr; -Biome *Biome::flowerForest = nullptr; +Biome *Biome::jungleEdge = nullptr; +Biome *Biome::deepOcean = nullptr; +Biome *Biome::stoneBeach = nullptr; +Biome *Biome::coldBeach = nullptr; Biome *Biome::birchForest = nullptr; Biome *Biome::birchForestHills = nullptr; -Biome *Biome::birchForestHillsM = nullptr; -Biome *Biome::birchForestM = nullptr; -Biome *Biome::deepOcean = nullptr; -Biome *Biome::roofedForestM = nullptr; +Biome *Biome::roofedForest = nullptr; +Biome *Biome::coldTaiga = nullptr; +Biome *Biome::coldTaigaHills = nullptr; +Biome *Biome::megaTaiga = nullptr; +Biome *Biome::megaTaigaHills = nullptr; +Biome *Biome::extremeHills_plus = nullptr; +Biome *Biome::savanna = nullptr; +Biome *Biome::savannaPlateau = nullptr; +Biome *Biome::mesa = nullptr; +Biome *Biome::mesaPlateauF = nullptr; +Biome *Biome::mesaPlateau = nullptr; +Biome *Biome::theVoid = nullptr; Biome *Biome::sunflowersPlains = nullptr; +Biome *Biome::desertM = nullptr; +Biome *Biome::extremeHillsM = nullptr; +Biome *Biome::flowerForest = nullptr; +Biome *Biome::taigaM = nullptr; +Biome *Biome::swamplandM = nullptr; Biome *Biome::iceSpikes = nullptr; +Biome *Biome::jungleM = nullptr; +Biome *Biome::jungleEdgeM = nullptr; +Biome *Biome::birchForestM = nullptr; +Biome *Biome::birchForestHillsM = nullptr; +Biome *Biome::roofedForestM = nullptr; +Biome *Biome::coldTaigaM = nullptr; +Biome *Biome::redwoodTaiga = nullptr; +Biome *Biome::redwoodTaigaHills = nullptr; +Biome *Biome::extremeHills_plusM = nullptr; +Biome *Biome::savannaM = nullptr; +Biome *Biome::savannaPlateauM = nullptr; +Biome *Biome::mesaBryce = nullptr; +Biome *Biome::mesaPlateauFM = nullptr; +Biome *Biome::mesaPlateauM = nullptr;//167 void Biome::staticCtor() { - Biome::ocean = (new OceanBiome(0))->setColor(0x000070)->setName(L"Ocean")->setDepthAndScale(-1, 0.4f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Ocean, eMinecraftColour_Foliage_Ocean, eMinecraftColour_Water_Ocean,eMinecraftColour_Sky_Ocean); + Biome::ocean = (new OceanBiome(0))->setColor(0x000070)->setName(L"Ocean")->setDepthAndScale(-1, 0.4f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Ocean, eMinecraftColour_Foliage_Ocean, eMinecraftColour_Water_Ocean,eMinecraftColour_Sky_Ocean); Biome::plains = (new PlainsBiome(1,false))->setColor(0x8db360)->setName(L"Plains")->setTemperatureAndDownfall(0.8f, 0.4f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Plains, eMinecraftColour_Foliage_Plains, eMinecraftColour_Water_Plains,eMinecraftColour_Sky_Plains); - Biome::sunflowersPlains = (new PlainsBiome(129,true))->setColor(0x8db360)->setName(L"Sunflowers Plains")->setTemperatureAndDownfall(0.8f, 0.4f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Plains, eMinecraftColour_Foliage_Plains, eMinecraftColour_Water_Plains,eMinecraftColour_Sky_Plains); Biome::desert = (new DesertBiome(2))->setColor(0xFA9418)->setName(L"Desert")->setNoRain()->setTemperatureAndDownfall(2, 0)->setDepthAndScale(0.1f, 0.2f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Desert, eMinecraftColour_Foliage_Desert, eMinecraftColour_Water_Desert,eMinecraftColour_Sky_Desert); Biome::extremeHills = (new ExtremeHillsBiome(3))->setColor(0x606060)->setName(L"Extreme Hills")->setDepthAndScale(0.3f, 1.5f)->setTemperatureAndDownfall(0.2f, 0.3f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_ExtremeHills, eMinecraftColour_Foliage_ExtremeHills, eMinecraftColour_Water_ExtremeHills,eMinecraftColour_Sky_ExtremeHills); - - // Foreste Base Biome::forest = (new ForestBiome(4,0))->setColor(0x056621)->setName(L"Forest")->setLeafColor(0x4EBA31)->setTemperatureAndDownfall(0.7f, 0.8f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Forest, eMinecraftColour_Foliage_Forest, eMinecraftColour_Water_Forest,eMinecraftColour_Sky_Forest); - Biome::forestHills = (new ForestBiome(18,0))->setColor(0x22551c)->setName(L"Forest Hills")->setLeafColor(0x4EBA31)->setTemperatureAndDownfall(0.7f, 0.8f)->setDepthAndScale(0.3f, 0.7f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_ForestHills, eMinecraftColour_Foliage_ForestHills, eMinecraftColour_Water_ForestHills,eMinecraftColour_Sky_ForestHills); - - Biome::taiga = (new TaigaBiome(5))->setColor(0x0b6659)->setName(L"Taiga")->setLeafColor(0x4EBA31)->setSnowCovered()->setTemperatureAndDownfall(0.05f, 0.8f)->setDepthAndScale(0.1f, 0.4f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Taiga, eMinecraftColour_Foliage_Taiga, eMinecraftColour_Water_Taiga,eMinecraftColour_Sky_Taiga); + Biome::taiga = (new TaigaBiome(5))->setColor(0x0b6659)->setName(L"Taiga")->setLeafColor(0x4EBA31)->setTemperatureAndDownfall(0.25f, 0.8f)->setDepthAndScale(0.1f, 0.4f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Taiga, eMinecraftColour_Foliage_Taiga, eMinecraftColour_Water_Taiga,eMinecraftColour_Sky_Taiga); + Biome::coldTaiga = (new TaigaBiome(30))->setColor(0x0b6659)->setName(L"Cold Taiga")->setLeafColor(0x4EBA31)->setSnowCovered()->setTemperatureAndDownfall(-0.5f, 0.4f)->setDepthAndScale(0.1f, 0.4f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Taiga, eMinecraftColour_Foliage_Taiga, eMinecraftColour_Water_Taiga,eMinecraftColour_Sky_Taiga); Biome::swampland = (new SwampBiome(6))->setColor(0x07F9B2)->setName(L"Swampland")->setLeafColor(0x8BAF48)->setDepthAndScale(-0.2f, 0.1f)->setTemperatureAndDownfall(0.8f, 0.9f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Swampland, eMinecraftColour_Foliage_Swampland, eMinecraftColour_Water_Swampland,eMinecraftColour_Sky_Swampland); Biome::river = (new RiverBiome(7))->setColor(0x0000ff)->setName(L"River")->setDepthAndScale(-0.5f, 0)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_River, eMinecraftColour_Foliage_River, eMinecraftColour_Water_River,eMinecraftColour_Sky_River); Biome::hell = (new HellBiome(8))->setColor(0xff0000)->setName(L"Hell")->setNoRain()->setTemperatureAndDownfall(2, 0)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Hell, eMinecraftColour_Foliage_Hell, eMinecraftColour_Water_Hell,eMinecraftColour_Sky_Hell); @@ -70,30 +92,39 @@ void Biome::staticCtor() Biome::frozenOcean = (new OceanBiome(10))->setColor(0x9090a0)->setName(L"Frozen Ocean")->setSnowCovered()->setDepthAndScale(-1, 0.5f)->setTemperatureAndDownfall(0, 0.5f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_FrozenOcean, eMinecraftColour_Foliage_FrozenOcean, eMinecraftColour_Water_FrozenOcean,eMinecraftColour_Sky_FrozenOcean); Biome::frozenRiver = (new RiverBiome(11))->setColor(0xa0a0ff)->setName(L"Frozen River")->setSnowCovered()->setDepthAndScale(-0.5f, 0)->setTemperatureAndDownfall(0, 0.5f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_FrozenRiver, eMinecraftColour_Foliage_FrozenRiver, eMinecraftColour_Water_FrozenRiver,eMinecraftColour_Sky_FrozenRiver); Biome::iceFlats = (new IceBiome(12))->setColor(0xffffff)->setName(L"Ice Plains")->setSnowCovered()->setTemperatureAndDownfall(0, 0.5f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_IcePlains, eMinecraftColour_Foliage_IcePlains, eMinecraftColour_Water_IcePlains,eMinecraftColour_Sky_IcePlains); - Biome::iceSpikes = (new IceBiome(12,true))->setColor(0xffffff)->setName(L"Ice Spikes")->setSnowCovered()->setTemperatureAndDownfall(0, 0.5f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_IcePlains, eMinecraftColour_Foliage_IcePlains, eMinecraftColour_Water_IcePlains,eMinecraftColour_Sky_IcePlains); Biome::iceMountains = (new IceBiome(13))->setColor(0xa0a0a0)->setName(L"Ice Mountains")->setSnowCovered()->setDepthAndScale(0.3f, 1.3f)->setTemperatureAndDownfall(0, 0.5f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_IceMountains, eMinecraftColour_Foliage_IceMountains, eMinecraftColour_Water_IceMountains,eMinecraftColour_Sky_IceMountains); Biome::mushroomIsland = (new MushroomIslandBiome(14))->setColor(0xff00ff)->setName(L"Mushroom Island")->setTemperatureAndDownfall(0.9f, 1.0f)->setDepthAndScale(0.2f, 1.0f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_MushroomIsland, eMinecraftColour_Foliage_MushroomIsland, eMinecraftColour_Water_MushroomIsland,eMinecraftColour_Sky_MushroomIsland); Biome::mushroomIslandShore = (new MushroomIslandBiome(15))->setColor(0xa000ff)->setName(L"Mushroom Island Shore")->setTemperatureAndDownfall(0.9f, 1.0f)->setDepthAndScale(-1, 0.1f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_MushroomIslandShore, eMinecraftColour_Foliage_MushroomIslandShore, eMinecraftColour_Water_MushroomIslandShore,eMinecraftColour_Sky_MushroomIslandShore); Biome::beaches = (new BeachBiome(16))->setColor(0xfade55)->setName(L"Beach")->setTemperatureAndDownfall(0.8f, 0.4f)->setDepthAndScale(0.0f, 0.1f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Beach, eMinecraftColour_Foliage_Beach, eMinecraftColour_Water_Beach,eMinecraftColour_Sky_Beach); Biome::desertHills = (new DesertBiome(17))->setColor(0xd25f12)->setName(L"Desert Hills")->setNoRain()->setTemperatureAndDownfall(2, 0)->setDepthAndScale(0.3f, 0.8f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_DesertHills, eMinecraftColour_Foliage_DesertHills, eMinecraftColour_Water_DesertHills,eMinecraftColour_Sky_DesertHills); - Biome::taigaHills = (new TaigaBiome(19))->setColor(0x163933)->setName(L"Taiga Hills")->setSnowCovered()->setLeafColor(0x4EBA31)->setTemperatureAndDownfall(0.05f, 0.8f)->setDepthAndScale(0.3f, 0.8f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_TaigaHills, eMinecraftColour_Foliage_TaigaHills, eMinecraftColour_Water_TaigaHills,eMinecraftColour_Sky_TaigaHills); + Biome::forestHills = (new ForestBiome(18,0))->setColor(0x22551c)->setName(L"Forest Hills")->setLeafColor(0x4EBA31)->setTemperatureAndDownfall(0.7f, 0.8f)->setDepthAndScale(0.3f, 0.7f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_ForestHills, eMinecraftColour_Foliage_ForestHills, eMinecraftColour_Water_ForestHills,eMinecraftColour_Sky_ForestHills); + Biome::taigaHills = (new TaigaBiome(19))->setColor(0x163933)->setName(L"Taiga Hills")->setLeafColor(0x4EBA31)->setTemperatureAndDownfall(0.25f, 0.8f)->setDepthAndScale(0.3f, 0.8f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_TaigaHills, eMinecraftColour_Foliage_TaigaHills, eMinecraftColour_Water_TaigaHills,eMinecraftColour_Sky_TaigaHills); + Biome::smallerExtremeHills = (new ExtremeHillsBiome(20))->setColor(0x72789a)->setName(L"Extreme Hills Edge")->setDepthAndScale(0.2f, 0.8f)->setTemperatureAndDownfall(0.2f, 0.3f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_ExtremeHillsEdge, eMinecraftColour_Foliage_ExtremeHillsEdge, eMinecraftColour_Water_ExtremeHillsEdge,eMinecraftColour_Sky_ExtremeHillsEdge); Biome::jungle = (new JungleBiome(21, false))->setColor(0x537b09)->setName(L"Jungle")->setLeafColor(0x537b09)->setTemperatureAndDownfall(1.2f, 0.9f)->setDepthAndScale(0.2f, 0.4f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Jungle, eMinecraftColour_Foliage_Jungle, eMinecraftColour_Water_Jungle,eMinecraftColour_Sky_Jungle); Biome::jungleHills = (new JungleBiome(22, false))->setColor(0x2c4205)->setName(L"Jungle Hills")->setLeafColor(0x537b09)->setTemperatureAndDownfall(1.2f, 0.9f)->setDepthAndScale(1.8f, 0.5f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_JungleHills, eMinecraftColour_Foliage_JungleHills, eMinecraftColour_Water_JungleHills,eMinecraftColour_Sky_JungleHills); - Biome::savanna = (new SavannaBiome(35))->setColor(0xbda235)->setName(L"Savanna")->setNoRain()->setTemperatureAndDownfall(1.2f, 0.0f) ->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Savanna, eMinecraftColour_Foliage_Savanna, eMinecraftColour_Sky_Desert, eMinecraftColour_Sky_Desert); - Biome::deepOcean= (new OceanBiome(24))->setName(L"Deep Ocean")->setDepthAndScale(-1.8,0.1f)->setColor(0x000070)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Ocean, eMinecraftColour_Foliage_Ocean, eMinecraftColour_Water_Ocean,eMinecraftColour_Sky_Ocean);; - // Foreste Avanzate e Speciali - Biome::roofedForest = (new ForestBiome(29, 3))->setColor(0x056621)->setName(L"Roofed Forest")->setTemperatureAndDownfall(0.7f, 0.8f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_RoofedForest, eMinecraftColour_Foliage_RoofedForest, eMinecraftColour_Water_Forest, eMinecraftColour_Sky_Forest); - Biome::flowerForest = (new ForestBiome(132, 1))->setColor(0x056621)->setName(L"Flower Forest")->setTemperatureAndDownfall(0.7f, 0.8f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Forest, eMinecraftColour_Foliage_Forest, eMinecraftColour_Water_Forest, eMinecraftColour_Sky_Forest); - - // Nuovi Biomi Betulla + //23 + Biome::deepOcean= (new OceanBiome(24))->setName(L"Deep Ocean")->setDepthAndScale(-1.8,0.1f)->setColor(0x000070)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Ocean, eMinecraftColour_Foliage_Ocean, eMinecraftColour_Water_Ocean,eMinecraftColour_Sky_Ocean);; + //25 + //26 Biome::birchForest=(new ForestBiome(27, 2))->setColor(0x307444)->setName(L"Birch Forest")->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Forest, eMinecraftColour_Foliage_Birch, eMinecraftColour_Water_Forest, eMinecraftColour_Sky_Forest); - Biome::birchForestHills=(new ForestBiome(28, 2))->setColor(0x1f5f32)->setName(L"Birch Forest Hills")->setDepthAndScale(0.45f, 0.3f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_ForestHills, eMinecraftColour_Foliage_Birch, eMinecraftColour_Water_Forest, eMinecraftColour_Sky_ForestHills); - - // Varianti Mutate (M) - Biome::birchForestM=(new ForestBiome::MutatedBirchForestBiome(155, biomes[27]))->setColor(0x47875a)->setName(L"Birch Forest M")->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Forest, eMinecraftColour_Foliage_Birch, eMinecraftColour_Water_Forest, eMinecraftColour_Sky_Forest); + Biome::birchForestHills=(new ForestBiome(28, 2))->setColor(0x1f5f32)->setName(L"Birch Forest Hills")->setDepthAndScale(0.45f, 0.3f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_ForestHills, eMinecraftColour_Foliage_Birch, eMinecraftColour_Water_Forest, eMinecraftColour_Sky_ForestHills); + Biome::roofedForest = (new ForestBiome(29, 3))->setColor(0x056621)->setName(L"Roofed Forest")->setTemperatureAndDownfall(0.7f, 0.8f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_RoofedForest, eMinecraftColour_Foliage_RoofedForest, eMinecraftColour_Water_Forest, eMinecraftColour_Sky_Forest); + //30 + //31 + Biome::coldTaigaHills = (new TaigaBiome(31))->setColor(0x163933)->setName(L"Cold Taiga Hills")->setLeafColor(0x4EBA31)->setSnowCovered()->setTemperatureAndDownfall(-0.5f, 0.4f)->setDepthAndScale(0.3f, 0.8f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_TaigaHills, eMinecraftColour_Foliage_TaigaHills, eMinecraftColour_Water_TaigaHills,eMinecraftColour_Sky_TaigaHills); + Biome::megaTaiga = (new TaigaBiome(32,1))->setColor(0x0b6659)->setName(L"Mega Taiga")->setLeafColor(0x4EBA31)->setTemperatureAndDownfall(0.3f, 0.8f)->setDepthAndScale(0.1f, 0.4f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Taiga, eMinecraftColour_Foliage_Taiga, eMinecraftColour_Water_Taiga,eMinecraftColour_Sky_Taiga); + Biome::megaTaigaHills = (new TaigaBiome(33,2))->setColor(0x0b6659)->setName(L"Mega Taiga Hills")->setLeafColor(0x4EBA31)->setTemperatureAndDownfall(0.3f, 0.8f)->setDepthAndScale(0.3f, 0.8f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_TaigaHills, eMinecraftColour_Foliage_TaigaHills, eMinecraftColour_Water_TaigaHills,eMinecraftColour_Sky_TaigaHills); + Biome::savanna = (new SavannaBiome(35))->setColor(0xbda235)->setName(L"Savanna")->setNoRain()->setTemperatureAndDownfall(1.2f, 0.0f) ->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Savanna, eMinecraftColour_Foliage_Savanna, eMinecraftColour_Sky_Desert, eMinecraftColour_Sky_Desert); + + Biome::sunflowersPlains = (new PlainsBiome(129,true))->setColor(0x8db360)->setName(L"Sunflowers Plains")->setTemperatureAndDownfall(0.8f, 0.4f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Plains, eMinecraftColour_Foliage_Plains, eMinecraftColour_Water_Plains,eMinecraftColour_Sky_Plains); + Biome::flowerForest = (new ForestBiome(132, 1))->setColor(0x056621)->setName(L"Flower Forest")->setTemperatureAndDownfall(0.7f, 0.8f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Forest, eMinecraftColour_Foliage_Forest, eMinecraftColour_Water_Forest, eMinecraftColour_Sky_Forest); + Biome::iceSpikes = (new IceBiome(140,true))->setColor(0xffffff)->setName(L"Ice Spikes")->setSnowCovered()->setTemperatureAndDownfall(0, 0.5f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_IcePlains, eMinecraftColour_Foliage_IcePlains, eMinecraftColour_Water_IcePlains,eMinecraftColour_Sky_IcePlains); + Biome::birchForestM=(new ForestBiome::MutatedBirchForestBiome(155, biomes[27]))->setColor(0x47875a)->setName(L"Birch Forest M")->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Forest, eMinecraftColour_Foliage_Birch, eMinecraftColour_Water_Forest, eMinecraftColour_Sky_Forest); Biome::birchForestHillsM=(new ForestBiome::MutatedBirchForestBiome(156, biomes[28]))->setColor(0x47875a)->setName(L"Birch Forest Hills M")->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_ForestHills, eMinecraftColour_Foliage_Birch, eMinecraftColour_Water_Forest, eMinecraftColour_Sky_ForestHills); Biome::roofedForestM=(new ForestBiome::MutatedForestBiome(157, biomes[29]))->setColor(0x177a35)->setName(L"Roofed Forest M")->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_RoofedForest, eMinecraftColour_Foliage_RoofedForest, eMinecraftColour_Water_Forest, eMinecraftColour_Sky_Forest); + + } Biome::Biome(int id) : id(id) { diff --git a/Minecraft.World/Biome.h b/Minecraft.World/Biome.h index 591ec253..c3f94e31 100644 --- a/Minecraft.World/Biome.h +++ b/Minecraft.World/Biome.h @@ -52,22 +52,48 @@ public: static Biome *smallerExtremeHills; static Biome *jungle; static Biome *jungleHills; - static Biome *savanna; + static Biome *jungleEdge; + static Biome *deepOcean; + static Biome *stoneBeach; + static Biome *coldBeach; + static Biome *birchForest; + static Biome *birchForestHills ; static Biome *roofedForest; - + static Biome *coldTaiga; + static Biome *coldTaigaHills; + static Biome *megaTaiga; + static Biome *megaTaigaHills; + static Biome *extremeHills_plus; + static Biome *savanna; + static Biome *savannaPlateau; + static Biome *mesa; + static Biome *mesaPlateauF; + static Biome *mesaPlateau; + static Biome *theVoid; + static Biome *sunflowersPlains; + static Biome *desertM; + static Biome *extremeHillsM; static Biome *flowerForest; - static Biome *Biome::birchForest; - - static Biome *Biome::birchForestHills ; - - static Biome *Biome::birchForestM ; - - static Biome *Biome::birchForestHillsM; - - static Biome *Biome::roofedForestM; - static Biome *Biome::deepOcean; - static Biome *Biome::sunflowersPlains; - static Biome *Biome::iceSpikes; + static Biome *taigaM; + static Biome *swamplandM; + static Biome *iceSpikes; + static Biome *jungleM; + static Biome *jungleEdgeM; + static Biome *birchForestM ; + static Biome *birchForestHillsM; + static Biome *roofedForestM; + static Biome *coldTaigaM; + static Biome *redwoodTaiga; + static Biome *redwoodTaigaHills; + static Biome *extremeHills_plusM; + static Biome *savannaM; + static Biome *savannaPlateauM; + static Biome *mesaBryce; + static Biome *mesaPlateauFM; + static Biome *mesaPlateauM; + + + static const int BIOME_COUNT = 256 ; diff --git a/Minecraft.World/BiomeInitLayer.cpp b/Minecraft.World/BiomeInitLayer.cpp index a08b72b8..6cf0a853 100644 --- a/Minecraft.World/BiomeInitLayer.cpp +++ b/Minecraft.World/BiomeInitLayer.cpp @@ -8,7 +8,6 @@ BiomeInitLayer::BiomeInitLayer(int64_t seed, shared_ptrparent, LevelType { this->parent = parent; - if(levelType == LevelType::lvl_normal_1_1) { startBiomes = BiomeArray(6); @@ -21,25 +20,24 @@ BiomeInitLayer::BiomeInitLayer(int64_t seed, shared_ptrparent, LevelType } else { - startBiomes = BiomeArray(18); - startBiomes[0] = Biome::desert; - startBiomes[1] = Biome::forest; - startBiomes[2] = Biome::extremeHills; - startBiomes[3] = Biome::swampland; - startBiomes[4] = Biome::plains; - startBiomes[5] = Biome::taiga; - startBiomes[6] = Biome::jungle; - startBiomes[7] = Biome::savanna; - startBiomes[8] = Biome::roofedForest; - startBiomes[9] = Biome::flowerForest; + // Only use biomes that are actually initialized in Biome::staticCtor() + // to avoid null pointer crashes during world generation. + startBiomes = BiomeArray(15); + startBiomes[0] = Biome::desert; + startBiomes[1] = Biome::forest; + startBiomes[2] = Biome::extremeHills; + startBiomes[3] = Biome::swampland; + startBiomes[4] = Biome::plains; + startBiomes[5] = Biome::taiga; + startBiomes[6] = Biome::jungle; + startBiomes[7] = Biome::savanna; + startBiomes[8] = Biome::roofedForest; + startBiomes[9] = Biome::flowerForest; startBiomes[10] = Biome::birchForest; - startBiomes[11] = Biome::birchForestHills; - startBiomes[12] = Biome::birchForestM; - startBiomes[13] = Biome::birchForestHillsM; - startBiomes[14] = Biome::roofedForestM; - startBiomes[15] = Biome::deepOcean; - startBiomes[16] = Biome::sunflowersPlains; - startBiomes[17] = Biome::iceSpikes; + startBiomes[11] = Biome::sunflowersPlains; + startBiomes[12] = Biome::coldTaiga; + startBiomes[13] = Biome::megaTaiga; + startBiomes[14] = Biome::iceSpikes; } } @@ -58,25 +56,27 @@ intArray BiomeInitLayer::getArea(int xo, int yo, int w, int h) for (int x = 0; x < w; x++) { initRandom(x + xo, y + yo); - int old = b[x + y * w]; - if (old == 0) + int old = b[x + y * w]; + if (old == 0) { - result[x + y * w] = 0; - } + result[x + y * w] = 0; + } else if (old == Biome::mushroomIsland->id) { - result[x + y * w] = old; - } - else if (old == 1) + result[x + y * w] = old; + } + else if (old == 1) // Normal land { - result[x + y * w] = startBiomes[nextRandom(startBiomes.length)]->id; - } - else + result[x + y * w] = startBiomes[nextRandom(startBiomes.length)]->id; + } + else // Snowy/Cold areas { - int isTaiga = startBiomes[nextRandom(startBiomes.length)]->id; - if (isTaiga == Biome::taiga->id) + int picked = startBiomes[nextRandom(startBiomes.length)]->id; + // Only let cold biomes remain in snowy areas, everything else becomes ice plains + if (picked == Biome::taiga->id || picked == Biome::coldTaiga->id || + picked == Biome::megaTaiga->id || picked == Biome::iceSpikes->id) { - result[x + y * w] = isTaiga; + result[x + y * w] = picked; } else { diff --git a/Minecraft.World/MegaPineTreeFeature.cpp b/Minecraft.World/MegaPineTreeFeature.cpp new file mode 100644 index 00000000..59c026cd --- /dev/null +++ b/Minecraft.World/MegaPineTreeFeature.cpp @@ -0,0 +1,217 @@ +#include "stdafx.h" +#include "MegaPineTreeFeature.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "Random.h" +#include "Level.h" + +MegaPineTreeFeature::MegaPineTreeFeature(bool doUpdate, bool useBaseHeight) : Feature(doUpdate), useBaseHeight(useBaseHeight) +{ +} + +// Port of WorldGenHugeTrees.func_175925_a +// Places a layer of leaves centered on the 2x2 trunk at (x,z),(x+1,z),(x,z+1),(x+1,z+1) +// Equivalent to: keep block if it's within `radius` of at least one of the 4 trunk corners. +void MegaPineTreeFeature::placeLeavesLayer(Level *level, int x, int z, int y, int radius, Random *random) +{ + int rSq = radius * radius; + // Loop from x-radius to x+radius+1 (extra +1 for 2x2 trunk width) + for (int xx = x - radius; xx <= x + radius + 1; xx++) + { + for (int zz = z - radius; zz <= z + radius + 1; zz++) + { + // Distance from each of the 4 trunk corner columns + int j0 = xx - x, k0 = zz - z; + int j1 = xx - (x+1), k1 = zz - z; + int j2 = xx - x, k2 = zz - (z+1); + int j3 = xx - (x+1), k3 = zz - (z+1); + // Place leaf if within radius of ANY trunk corner + if (j0*j0 + k0*k0 > rSq && + j1*j1 + k1*k1 > rSq && + j2*j2 + k2*k2 > rSq && + j3*j3 + k3*k3 > rSq) + { + continue; + } + // Java: only place on air or leaf blocks (isAirLeaves equivalent) + int t = level->getTile(xx, y, zz); + if (t == 0 || t == Tile::leaves_Id || t == Tile::leaves2_Id) + { + placeBlock(level, xx, y, zz, Tile::leaves_Id, LeafTile::EVERGREEN_LEAF); + } + } + } +} + +// Port of WorldGenMegaPineTree.func_150541_c +// Generates conical leaf crown from the top of the tree downward. +// p_150541_5_ is always 0 in the original call (base radius offset) +void MegaPineTreeFeature::placeCrown(Level *level, int x, int z, int treeTop, Random *random) +{ + // Crown span = rand.nextInt(5) + (useBaseHeight ? baseHeight=13 : 3) + int crownHeight = random->nextInt(5) + (this->useBaseHeight ? 13 : 3); + int prevRadius = 0; + + // k goes from (treeTop - crownHeight) to treeTop + for (int k = treeTop - crownHeight; k <= treeTop; k++) + { + int l = treeTop - k; // l = distance from top: goes from crownHeight down to 0 + int i1 = (int)floorf((float)l / (float)crownHeight * 3.5f); // base radius at layer + // Stagger: if same radius as layer below and even Y, expand by 1 + int layerRadius = i1 + (l > 0 && i1 == prevRadius && (k & 1) == 0 ? 1 : 0); + placeLeavesLayer(level, x, z, k, layerRadius, random); + prevRadius = i1; + } +} + +// Port of WorldGenMegaPineTree.func_175934_c +// Searches downward from y+2 to y-3 and replaces first grass/dirt with Podzol +void MegaPineTreeFeature::func_175934_c(Level *level, int x, int z, int y) +{ + for (int i = 2; i >= -3; --i) + { + int targetY = y + i; + int tile = level->getTile(x, targetY, z); + // canSustainPlant equivalent: grass or dirt + if (tile == Tile::grass_Id || tile == Tile::dirt_Id) + { + placeBlock(level, x, targetY, z, Tile::dirt_Id, DirtTile::PODZOL); + break; + } + if (tile != 0 && i < 0) break; + } +} + +// Port of WorldGenMegaPineTree.func_175933_b +// Spreads Podzol in a 5x5 (minus corners) pattern centered at (x,z) +void MegaPineTreeFeature::func_175933_b(Level *level, int x, int z, int y) +{ + for (int i = -2; i <= 2; ++i) + { + for (int j = -2; j <= 2; ++j) + { + if (abs(i) != 2 || abs(j) != 2) // skip the 4 far corners + { + func_175934_c(level, x + i, z + j, y); + } + } + } +} + +// Port of WorldGenMegaPineTree.func_180711_a +// Places Podzol patches at the 4 corners + 5 random border positions +void MegaPineTreeFeature::placeBase(Level *level, Random *random, int x, int z, int y) +{ + // 4 fixed corners (relative to 2x2 trunk) + func_175933_b(level, x - 1, z - 1, y); // west().north() + func_175933_b(level, x + 2, z - 1, y); // east(2).north() + func_175933_b(level, x - 1, z + 2, y); // west().south(2) + func_175933_b(level, x + 2, z + 2, y); // east(2).south(2) + + // 5 random border positions (8x8 grid, only border cells) + for (int i = 0; i < 5; ++i) + { + int j = random->nextInt(64); + int k = j % 8; + int l = j / 8; + if (k == 0 || k == 7 || l == 0 || l == 7) + { + func_175933_b(level, x - 3 + k, z - 3 + l, y); + } + } +} + +// Port of WorldGenHugeTrees.func_175929_a (space check) +// Returns true if the tree can grow: checks all blocks from y to y+height+1 +bool MegaPineTreeFeature::canPlace(Level *level, Random *random, int x, int y, int z, int height) +{ + if (y < 1 || y + height + 1 > Level::maxBuildHeight) return false; + + for (int l = 0; l <= height + 1; l++) + { + int r = (l == 0) ? 1 : 2; // bottom layer: radius 1; rest: radius 2 + int yy = y + l; + for (int xx = x - r; xx <= x + r + 1; xx++) + { + for (int zz = z - r; zz <= z + r + 1; zz++) + { + if (yy < 0 || yy >= Level::maxBuildHeight) return false; + int t = level->getTile(xx, yy, zz); + if (!isReplaceable(t)) return false; + } + } + } + + // Ground check: all 4 blocks below the 2x2 trunk must be grass or dirt + auto isGround = [&](int bx, int bz) { + int t = level->getTile(bx, y - 1, bz); + return t == Tile::grass_Id || t == Tile::dirt_Id; + }; + return isGround(x, z) && isGround(x+1, z) && isGround(x, z+1) && isGround(x+1, z+1); +} + +bool MegaPineTreeFeature::isAirLeaves(Level *level, int x, int y, int z) +{ + int t = level->getTile(x, y, z); + return t == 0 || t == Tile::leaves_Id || t == Tile::leaves2_Id; +} + +// Equivalent to Java's canGrowInto: blocks the tree can grow through +bool MegaPineTreeFeature::isReplaceable(int tileId) +{ + return tileId == 0 + || tileId == Tile::leaves_Id + || tileId == Tile::leaves2_Id + || tileId == Tile::grass_Id + || tileId == Tile::dirt_Id + || tileId == Tile::treeTrunk_Id + || tileId == Tile::sapling_Id + || tileId == Tile::deadBush_Id + || tileId == Tile::tallgrass_Id + || tileId == Tile::snow_Id; +} + +bool MegaPineTreeFeature::place(Level *level, Random *random, int x, int y, int z) +{ + // func_150533_a: rand.nextInt(maxVariation - baseHeight) + baseHeight + // = rand.nextInt(15 - 13) + 13 = rand.nextInt(2) + 13 + int height = random->nextInt(2) + 13; + + // func_175929_a: space check + if (!canPlace(level, random, x, y, z, height)) + { + return false; + } + + // func_150541_c: generate conical leaf crown first + placeCrown(level, x, z, y + height, random); + + // Trunk: 2x2 column of spruce logs + for (int j = 0; j < height; j++) + { + if (isAirLeaves(level, x, y + j, z)) + { + placeBlock(level, x, y + j, z, Tile::treeTrunk_Id, TreeTile::SPRUCE_TRUNK); + } + if (j < height - 1) // 3 extra columns stop 1 short of the top + { + if (isAirLeaves(level, x + 1, y + j, z)) + { + placeBlock(level, x + 1, y + j, z, Tile::treeTrunk_Id, TreeTile::SPRUCE_TRUNK); + } + if (isAirLeaves(level, x + 1, y + j, z + 1)) + { + placeBlock(level, x + 1, y + j, z + 1, Tile::treeTrunk_Id, TreeTile::SPRUCE_TRUNK); + } + if (isAirLeaves(level, x, y + j, z + 1)) + { + placeBlock(level, x, y + j, z + 1, Tile::treeTrunk_Id, TreeTile::SPRUCE_TRUNK); + } + } + } + + // func_180711_a: generate Podzol base patches + placeBase(level, random, x, z, y); + + return true; +} diff --git a/Minecraft.World/MegaPineTreeFeature.h b/Minecraft.World/MegaPineTreeFeature.h new file mode 100644 index 00000000..89b45ad5 --- /dev/null +++ b/Minecraft.World/MegaPineTreeFeature.h @@ -0,0 +1,22 @@ +#pragma once +#include "Feature.h" + +class MegaPineTreeFeature : public Feature +{ +private: + bool useBaseHeight; + +public: + MegaPineTreeFeature(bool doUpdate, bool useBaseHeight); + virtual bool place(Level *level, Random *random, int x, int y, int z) override; + +private: + void placeLeavesLayer(Level *level, int x, int z, int y, int radius, Random *random); + void placeCrown(Level *level, int x, int z, int treeTop, Random *random); + void placeBase(Level *level, Random *random, int x, int z, int y); + void func_175933_b(Level *level, int x, int z, int y); + void func_175934_c(Level *level, int x, int z, int y); + bool canPlace(Level *level, Random *random, int x, int y, int z, int height); + bool isAirLeaves(Level *level, int x, int y, int z); + bool isReplaceable(int tileId); +}; diff --git a/Minecraft.World/RegionHillsLayer.cpp b/Minecraft.World/RegionHillsLayer.cpp index a1e17524..7e3a9e83 100644 --- a/Minecraft.World/RegionHillsLayer.cpp +++ b/Minecraft.World/RegionHillsLayer.cpp @@ -34,6 +34,14 @@ intArray RegionHillsLayer::getArea(int xo, int yo, int w, int h) { next = Biome::taigaHills->id; } + else if (old == Biome::coldTaiga->id) + { + next = Biome::coldTaigaHills->id; + } + else if (old == Biome::megaTaiga->id) + { + next = Biome::megaTaigaHills->id; + } else if (old == Biome::plains->id) { next = Biome::forest->id; @@ -42,11 +50,19 @@ intArray RegionHillsLayer::getArea(int xo, int yo, int w, int h) { next = Biome::iceMountains->id; } + else if (old == Biome::iceFlats->id) + { + next = Biome::iceSpikes->id; + } else if (old == Biome::jungle->id) { next = Biome::jungleHills->id; } + /*else if (old == Biome::savanna->id) + { + next = Biome::savannaPlateau->id; + }*/ if (next == old) { result[x + y * w] = old; diff --git a/Minecraft.World/Sapling.cpp b/Minecraft.World/Sapling.cpp index 3fd2fcc4..526ee2f2 100644 --- a/Minecraft.World/Sapling.cpp +++ b/Minecraft.World/Sapling.cpp @@ -7,6 +7,7 @@ #include "Sapling.h" #include "SavannaTreeFeature.h" #include "RoofTreeFeature.h" +#include "MegaPineTreeFeature.h" int Sapling::SAPLING_NAMES[SAPLING_NAMES_SIZE] = { IDS_TILE_SAPLING_OAK, @@ -85,7 +86,27 @@ void Sapling::growTree(Level *level, int x, int y, int z, Random *random) if (data == TYPE_EVERGREEN) { - f = new SpruceFeature(true); + for (ox = 0; ox >= -1; ox--) + { + for (oz = 0; oz >= -1; oz--) + { + if (isSapling(level, x + ox, y, z + oz, TYPE_EVERGREEN) && + isSapling(level, x + ox + 1, y, z + oz, TYPE_EVERGREEN) && + isSapling(level, x + ox, y, z + oz + 1, TYPE_EVERGREEN) && + isSapling(level, x + ox + 1, y, z + oz + 1, TYPE_EVERGREEN)) + { + f = new MegaPineTreeFeature(true, random->nextBoolean()); + multiblock = true; + break; + } + } + if (f != nullptr) break; + } + if (f == nullptr) + { + ox = oz = 0; + f = new SpruceFeature(true); + } } else if (data == TYPE_BIRCH) { diff --git a/Minecraft.World/TaigaBiome.cpp b/Minecraft.World/TaigaBiome.cpp index 8c940ab7..23de618f 100644 --- a/Minecraft.World/TaigaBiome.cpp +++ b/Minecraft.World/TaigaBiome.cpp @@ -9,6 +9,7 @@ #include "TallGrass2.h" #include "Level.h" #include "Random.h" +#include "MegaPineTreeFeature.h" TaigaBiome::TaigaBiome(int id, int type) : Biome(id) { @@ -33,9 +34,12 @@ TaigaBiome::TaigaBiome(int id, int type) : Biome(id) Feature *TaigaBiome::getTreeFeature(Random *random) { - if ((type == 1 || type == 2) && random->nextInt(3) == 0) + if (type == 1 || type == 2) { - return new MegaTreeFeature(false, 10 + random->nextInt(20), TreeTile::SPRUCE_TRUNK, LeafTile::EVERGREEN_LEAF); + if (random->nextInt(3) == 0) + { + return new MegaPineTreeFeature(false, random->nextBoolean()); + } } if (random->nextInt(3) == 0) { diff --git a/Minecraft.World/cmake/sources/Common.cmake b/Minecraft.World/cmake/sources/Common.cmake index 366a2bee..64780b69 100644 --- a/Minecraft.World/cmake/sources/Common.cmake +++ b/Minecraft.World/cmake/sources/Common.cmake @@ -1474,6 +1474,8 @@ set(_MINECRAFT_WORLD_COMMON_NET_MINECRAFT_WORLD_LEVEL_LEVELGEN_FEATURE "${CMAKE_CURRENT_SOURCE_DIR}/LightGemFeature.h" "${CMAKE_CURRENT_SOURCE_DIR}/MegaTreeFeature.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/MegaTreeFeature.h" + "${CMAKE_CURRENT_SOURCE_DIR}/MegaPineTreeFeature.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/MegaPineTreeFeature.h" "${CMAKE_CURRENT_SOURCE_DIR}/MonsterRoomFeature.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/MonsterRoomFeature.h" "${CMAKE_CURRENT_SOURCE_DIR}/OreFeature.cpp"