117 lines
2.7 KiB
C++
117 lines
2.7 KiB
C++
|
|
||
|
// VillageGen.cpp
|
||
|
|
||
|
// Implements the cVillageGen class representing the village generator
|
||
|
|
||
|
#include "Globals.h"
|
||
|
#include "VillageGen.h"
|
||
|
#include "Prefabs/PlainsVillagePrefabs.h"
|
||
|
#include "Prefabs/SandVillagePrefabs.h"
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
class cVillageGen::cVillage :
|
||
|
public cGridStructGen::cStructure
|
||
|
{
|
||
|
typedef cGridStructGen::cStructure super;
|
||
|
|
||
|
public:
|
||
|
cVillage(int a_Seed, int a_OriginX, int a_OriginZ, cPrefabPiecePool & a_Prefabs) :
|
||
|
super(a_OriginX, a_OriginZ),
|
||
|
m_Seed(a_Seed),
|
||
|
m_Prefabs(a_Prefabs)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
protected:
|
||
|
/** Seed for the random functions */
|
||
|
int m_Seed;
|
||
|
|
||
|
/** Prefabs to use for buildings */
|
||
|
cPrefabPiecePool & m_Prefabs;
|
||
|
|
||
|
// cGrdStructGen::cStructure overrides:
|
||
|
virtual void DrawIntoChunk(cChunkDesc & a_Chunk) override
|
||
|
{
|
||
|
// TODO
|
||
|
}
|
||
|
} ;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
// cVillageGen:
|
||
|
|
||
|
cPrefabPiecePool cVillageGen::m_SandVillage (g_SandVillagePrefabs, g_SandVillagePrefabsCount, g_SandVillageStartingPrefabs, g_SandVillageStartingPrefabsCount);
|
||
|
cPrefabPiecePool cVillageGen::m_PlainsVillage(g_PlainsVillagePrefabs, g_PlainsVillagePrefabsCount, g_PlainsVillageStartingPrefabs, g_PlainsVillageStartingPrefabsCount);
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
cVillageGen::cVillageGen(int a_Seed, int a_GridSize, cBiomeGen & a_BiomeGen, cTerrainHeightGen & a_HeightGen) :
|
||
|
super(a_Seed, a_GridSize, a_GridSize, 128, 128, 100),
|
||
|
m_BiomeGen(a_BiomeGen),
|
||
|
m_HeightGen(a_HeightGen)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
cGridStructGen::cStructurePtr cVillageGen::CreateStructure(int a_OriginX, int a_OriginZ)
|
||
|
{
|
||
|
// Generate the biomes for the chunk surrounding the origin:
|
||
|
int ChunkX, ChunkZ;
|
||
|
cChunkDef::BlockToChunk(a_OriginX, a_OriginZ, ChunkX, ChunkZ);
|
||
|
cChunkDef::BiomeMap Biomes;
|
||
|
m_BiomeGen.GenBiomes(ChunkX, ChunkZ, Biomes);
|
||
|
|
||
|
// Check if all the biomes are village-friendly:
|
||
|
// If just one is not, no village is created, because it's likely that an unfriendly biome is too close
|
||
|
cPrefabPiecePool * VillagePrefabs = NULL;
|
||
|
for (size_t i = 0; i < ARRAYCOUNT(Biomes); i++)
|
||
|
{
|
||
|
switch (Biomes[i])
|
||
|
{
|
||
|
case biDesert:
|
||
|
case biDesertM:
|
||
|
{
|
||
|
// These biomes allow sand villages
|
||
|
VillagePrefabs = &m_SandVillage;
|
||
|
break;
|
||
|
}
|
||
|
case biPlains:
|
||
|
case biSavanna:
|
||
|
case biSavannaM:
|
||
|
case biSunflowerPlains:
|
||
|
{
|
||
|
// These biomes allow plains-style villages
|
||
|
VillagePrefabs = &m_PlainsVillage;
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
// Village-unfriendly biome, bail out with zero structure:
|
||
|
return cStructurePtr();
|
||
|
}
|
||
|
} // switch (Biomes[i])
|
||
|
} // for i - Biomes[]
|
||
|
|
||
|
// Create a village based on the chosen prefabs:
|
||
|
if (VillagePrefabs == NULL)
|
||
|
{
|
||
|
return cStructurePtr();
|
||
|
}
|
||
|
return cStructurePtr(new cVillage(m_Seed, a_OriginX, a_OriginZ, *VillagePrefabs));
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|