summaryrefslogtreecommitdiffstats
path: root/src/Generating/PieceStructuresGen.h
blob: c8e2f2b0c035e16d0ce0999c74a41056cce0a8c0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91

// PieceStructuresGen.h

// Declares the cPieceStructuresGen class representing the PieceStructures finisher generator

/*
This generator loads various pieces from "piecepool" files, and each such piecepool is then used in a separate
cPieceGenerator instance.
*/





#pragma once

#include "ComposableGenerator.h"
#include "PrefabPiecePool.h"
#include "GridStructGen.h"





class cPieceStructuresGen :
	public cFinishGen
{
	typedef cFinishGen Super;

public:
	cPieceStructuresGen(int a_Seed);

	/** Initializes the generator based on the specified prefab sets.
	a_Prefabs contains the list of prefab sets that should be activated, "|"-separated.
	All problems are logged to the console and the generator skips over them.
	Returns true if at least one prefab set is valid (the generator should be kept). */
	bool Initialize(const AString & a_Prefabs, int a_SeaLevel, cBiomeGenPtr a_BiomeGen, cTerrainHeightGenPtr a_HeightGen);

	// cFinishGen override:
	virtual void GenFinish(cChunkDesc & a_ChunkDesc) override;

protected:
	class cGen:
		public cGridStructGen
	{
		typedef cGridStructGen Super;
	public:
		cGen(int a_Seed, cBiomeGenPtr a_BiomeGen, cTerrainHeightGenPtr a_HeightGen, int a_SeaLevel, const AString & a_Name);

		/** Loads the piecepool from a file.
		Returns true on success, logs warning and returns false on failure. */
		bool LoadFromFile(const AString & a_FileName);

		// cGridStructGen overrides:
		virtual cStructurePtr CreateStructure(int a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ) override;

	protected:

		/** The underlying biome generator that defines whether the structure is created or not */
		cBiomeGenPtr m_BiomeGen;

		/** The underlying height generator, used to position the prefabs crossing chunk borders if they are set to FitGround. */
		cTerrainHeightGenPtr m_HeightGen;

		/** The world's sea level, if available. Used for some cVerticalStrategy descendants. */
		int m_SeaLevel;

		/** The name that is used for reporting. */
		AString m_Name;

		/** All available prefabs. */
		cPrefabPiecePool m_Pool;

		/** Maximum depth of the generated piece tree. */
		int m_MaxDepth;
	};

	typedef SharedPtr<cGen> cGenPtr;
	typedef std::vector<cGenPtr> cGenPtrs;


	/** The individual structure generators, one per piecepool. */
	cGenPtrs m_Gens;

	/** The seed for the random number generator */
	int m_Seed;
};