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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
#pragma once
#include "StarJson.hpp"
#include "StarVector.hpp"
#include "StarNetElementSystem.hpp"
#include "StarBiMap.hpp"
namespace Star {
STAR_CLASS(TileDamageParameters);
STAR_CLASS(TileDamageStatus);
STAR_CLASS(EntityTileDamageStatus);
STAR_EXCEPTION(TileDamageException, StarException);
List<Vec2I> tileAreaBrush(float range, Vec2F const& centerOffset, bool diameterMode);
enum class TileDamageType : uint8_t {
// Damage done that will not actually kill the target
Protected,
// Best at chopping down trees, things made of wood, etc.
Plantish,
// For digging / drilling through materials
Blockish,
// Gravity gun etc
Beamish,
// Penetrating damage done passivly by explosions.
Explosive,
// Can melt certain block types
Fire,
// Can "till" certain materials into others
Tilling
};
extern EnumMap<TileDamageType> const TileDamageTypeNames;
bool tileDamageIsPenetrating(TileDamageType damageType);
struct TileDamage {
TileDamage();
TileDamage(TileDamageType type, float amount, unsigned harvestLevel = 1);
TileDamageType type;
float amount;
unsigned harvestLevel;
};
DataStream& operator>>(DataStream& ds, TileDamage& tileDamage);
DataStream& operator<<(DataStream& ds, TileDamage const& tileDamage);
class TileDamageParameters {
public:
TileDamageParameters();
// If 'config' is a string type, it is assumed to be a descriptor file,
// otherwise it should contain map configuration data.
explicit TileDamageParameters(Json config, Maybe<float> healthOverride = {}, Maybe<unsigned> requiredHarvestLevelOverride = {});
float damageDone(TileDamage const& damage) const;
float recoveryPerSecond() const;
unsigned requiredHarvestLevel() const;
float maximumEffectTime() const;
float totalHealth() const;
TileDamageParameters sum(TileDamageParameters const& other) const;
Json toJson() const;
friend DataStream& operator>>(DataStream& ds, TileDamageParameters& tileDamage);
friend DataStream& operator<<(DataStream& ds, TileDamageParameters const& tileDamage);
private:
Map<TileDamageType, float> m_damages;
float m_damageRecoveryPerSecond;
float m_maximumEffectTime;
float m_totalHealth;
unsigned m_requiredHarvestLevel;
};
class TileDamageStatus {
public:
TileDamageStatus();
float damagePercentage() const;
float damageEffectPercentage() const;
Vec2F sourcePosition() const;
TileDamageType damageType() const;
void reset();
void damage(TileDamageParameters const& damageParameters, Vec2F const& sourcePosition, TileDamage const& damage);
void recover(TileDamageParameters const& damageParameters, float dt);
bool healthy() const;
bool damaged() const;
bool damageProtected() const;
bool dead() const;
bool harvested() const;
friend DataStream& operator>>(DataStream& ds, TileDamageStatus& tileDamageStatus);
friend DataStream& operator<<(DataStream& ds, TileDamageStatus const& tileDamageStatus);
private:
void updateDamageEffectPercentage();
float m_damagePercentage;
float m_damageEffectTimeFactor;
bool m_harvested;
Vec2F m_damageSourcePosition;
TileDamageType m_damageType;
float m_damageEffectPercentage;
};
class EntityTileDamageStatus : public NetElementGroup {
public:
EntityTileDamageStatus();
float damagePercentage() const;
float damageEffectPercentage() const;
TileDamageType damageType() const;
void reset();
void damage(TileDamageParameters const& damageParameters, TileDamage const& damage);
void recover(TileDamageParameters const& damageParameters, float dt);
bool healthy() const;
bool damaged() const;
bool damageProtected() const;
bool dead() const;
bool harvested() const;
private:
NetElementFloat m_damagePercentage;
NetElementFloat m_damageEffectTimeFactor;
NetElementBool m_damageHarvested;
NetElementEnum<TileDamageType> m_damageType;
};
inline float TileDamageStatus::damagePercentage() const {
return m_damagePercentage;
}
inline float TileDamageStatus::damageEffectPercentage() const {
return m_damageEffectPercentage;
}
inline Vec2F TileDamageStatus::sourcePosition() const {
return m_damageSourcePosition;
}
inline TileDamageType TileDamageStatus::damageType() const {
return m_damageType;
}
}
|