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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
#pragma once
#include "StarJson.hpp"
#include "StarThread.hpp"
#include "StarTileDamage.hpp"
namespace Star {
STAR_CLASS(Plant);
STAR_CLASS(PlantDatabase);
STAR_EXCEPTION(PlantDatabaseException, StarException);
// Configuration for a specific tree variant
struct TreeVariant {
TreeVariant();
TreeVariant(Json const& json);
Json toJson() const;
String stemName;
String foliageName;
String stemDirectory;
Json stemSettings;
float stemHueShift;
String foliageDirectory;
Json foliageSettings;
float foliageHueShift;
Json descriptions;
bool ceiling;
bool ephemeral;
Json stemDropConfig;
Json foliageDropConfig;
TileDamageParameters tileDamageParameters;
};
// Configuration for a specific grass variant
struct GrassVariant {
GrassVariant();
GrassVariant(Json const& json);
Json toJson() const;
String name;
String directory;
StringList images;
float hueShift;
Json descriptions;
bool ceiling;
bool ephemeral;
TileDamageParameters tileDamageParameters;
};
// Configuration for a specific bush variant
struct BushVariant {
struct BushShape {
String image;
StringList mods;
};
BushVariant();
BushVariant(Json const& json);
Json toJson() const;
String bushName;
String modName;
String directory;
List<BushShape> shapes;
float baseHueShift;
float modHueShift;
Json descriptions;
bool ceiling;
bool ephemeral;
TileDamageParameters tileDamageParameters;
};
class PlantDatabase {
public:
PlantDatabase();
StringList treeStemNames(bool ceiling = false) const;
StringList treeFoliageNames() const;
// Each stem / foliage set has its own patterns of shapes that must match up
String treeStemShape(String const& stemName) const;
String treeFoliageShape(String const& foliageName) const;
Maybe<String> treeStemDirectory(String const& stemName) const;
Maybe<String> treeFoliageDirectory(String const& foliageName) const;
// Throws an exception if stem shape and foliage shape do not match
TreeVariant buildTreeVariant(String const& stemName, float stemHueShift, String const& foliageName, float foliageHueShift) const;
// Build a foliage-less tree
TreeVariant buildTreeVariant(String const& stemName, float stemHueShift) const;
StringList grassNames(bool ceiling = false) const;
GrassVariant buildGrassVariant(String const& grassName, float hueShift) const;
StringList bushNames(bool ceiling = false) const;
StringList bushMods(String const& bushName) const;
BushVariant buildBushVariant(String const& bushName, float baseHueShift, String const& modName, float modHueShift) const;
PlantPtr createPlant(TreeVariant const& treeVariant, uint64_t seed) const;
PlantPtr createPlant(GrassVariant const& grassVariant, uint64_t seed) const;
PlantPtr createPlant(BushVariant const& bushVariant, uint64_t seed) const;
private:
struct Config {
String directory;
Json settings;
};
StringMap<Config> m_treeStemConfigs;
StringMap<Config> m_treeFoliageConfigs;
StringMap<Config> m_grassConfigs;
StringMap<Config> m_bushConfigs;
};
}
|