blob: dbd72990d3199253e72f20848e64227c9e5ebd1e (
plain)
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
|
#pragma once
#include "StarSet.hpp"
#include "StarThread.hpp"
#include "StarEntityRenderingTypes.hpp"
#include "StarProjectile.hpp"
namespace Star {
STAR_STRUCT(ProjectileConfig);
STAR_CLASS(ProjectileDatabase);
STAR_EXCEPTION(ProjectileDatabaseException, StarException);
struct ProjectileConfig {
Json config;
String typeName;
String directory;
String description;
RectF boundBox;
Json movementSettings;
float timeToLive = 0.0f;
float initialSpeed = 0.0f;
float acceleration = 0.0f;
float power = 0.0f;
PolyF damagePoly;
bool piercing = false;
bool falldown = false;
bool rayCheckToSource = false;
float knockback = 0.0f;
bool knockbackDirectional = false;
// Negative value means infinite bounces.
int bounces = 0;
// Happens each time the projectile collides with a solid material
JsonArray actionOnCollide;
// Happens when projectile dies in any fashion
JsonArray actionOnReap;
// Happens when projectile dies after having collided
JsonArray actionOnHit;
// Happens when projectile dies without having collided
JsonArray actionOnTimeout;
// Time, repeat flag, and action config
List<tuple<float, bool, Json>> periodicActions;
String image;
unsigned frameNumber = 0;
float animationCycle = 0.0f;
bool animationLoops = false;
unsigned windupFrames = 0;
bool intangibleWindup = false;
unsigned winddownFrames = 0;
bool intangibleWinddown = false;
bool flippable = false;
bool orientationLocked = false;
bool fullbright = false;
EntityRenderLayer renderLayer;
Color lightColor;
Vec2F lightPosition;
LightType lightType = LightType::Spread;
String persistentAudio;
String damageKindImage;
String damageKind;
String damageType;
Json damageTeam;
Maybe<String> damageRepeatGroup;
Maybe<float> damageRepeatTimeout;
List<EphemeralStatusEffect> statusEffects;
StringSet emitters;
bool hydrophobic = false;
bool onlyHitTerrain = false;
ClientEntityMode clientEntityMode = ClientEntityMode::ClientMasterAllowed;
bool masterOnly = false;
StringList scripts;
List<PersistentStatusEffect> persistentStatusEffects;
PolyF statusEffectArea;
Json physicsForces;
Json physicsCollisions;
};
class ProjectileDatabase {
public:
ProjectileDatabase();
StringList allProjectileTypes() const;
bool isProjectile(String const& typeName) const;
Json projectileConfig(String const& type) const;
String damageKindImage(String const& type) const;
float gravityMultiplier(String const& type) const;
ProjectilePtr createProjectile(String const& type, Json const& parameters = JsonObject()) const;
ProjectilePtr netLoadProjectile(ByteArray const& netStore, NetCompatibilityRules rules = {}) const;
private:
ProjectileConfigPtr readConfig(String const& path);
StringMap<ProjectileConfigPtr> m_configs;
};
}
|