Starsector API
Loading...
Searching...
No Matches
DamagingExplosionSpec.java
Go to the documentation of this file.
1package com.fs.starfarer.api.loading;
2
3import java.awt.Color;
4
5import org.json.JSONException;
6import org.json.JSONObject;
7
8import com.fs.starfarer.api.combat.CollisionClass;
9import com.fs.starfarer.api.combat.DamageType;
10import com.fs.starfarer.api.combat.MutableStat;
11import com.fs.starfarer.api.combat.OnHitEffectPlugin;
12import com.fs.starfarer.api.combat.ShipAPI;
13import com.fs.starfarer.api.impl.campaign.ids.Stats;
14import com.fs.starfarer.api.util.Misc;
15
16public class DamagingExplosionSpec implements Cloneable {
17
18 private float duration;
19 private float radius;
20 private float coreRadius;
21 private float maxDamage;
22 private float minDamage;
23
24 private float particleSpawnRadius = -1f;
25
26 private CollisionClass collisionClass;
27 private CollisionClass collisionClassByFighter;
28
29
30 private float particleSizeMin = 10f;
31 private float particleSizeRange = 10f;
32 private float particleDuration = 0.5f;
33 private int particleCount = 10;
34
35 private Color particleColor = new Color(255,255,255,255);
36 private Color explosionColor = new Color(255,255,255,255);
37
38 private DamageType damageType = DamageType.ENERGY;
39 private String soundSetId;
40
41 private boolean showGraphic = true;
42 private boolean useDetailedExplosion = true;
43
44 private float detailedExplosionRadius = -1f;
45 private float detailedExplosionFlashRadius = -1f;
46 private Color detailedExplosionFlashColorFringe = null;
47 private Color detailedExplosionFlashColorCore = null;
48 private float detailedExplosionFlashDuration = -1f;
49
50 private OnHitEffectPlugin effect;
51
52 private MutableStat modifier = new MutableStat(1f);
53
54 public static float getShipExplosionRadius(ShipAPI ship) {
55 float mult = ship.getMutableStats().getDynamic().getValue(Stats.EXPLOSION_RADIUS_MULT);
56 //float mult = 1f;
57// if (ship.isStationModule()) {
58// mult = 0.5f;
59// }
60 float radius = ship.getCollisionRadius() + Math.min(200f, ship.getCollisionRadius()) * mult;
61 return radius;
62 }
63
64 public static DamagingExplosionSpec explosionSpecForShip(ShipAPI ship) {
65 float radius = getShipExplosionRadius(ship);
66 float coreRadius = ship.getCollisionRadius();
67
68 float maxDamage = ship.getMaxFlux() * (0.5f + 0.5f * (float) Math.random());
69 float minDamage = 0f;
70
71 float mult = ship.getMutableStats().getDynamic().getValue(Stats.EXPLOSION_DAMAGE_MULT);
72 maxDamage *= mult;
73
75 radius,
76 coreRadius,
77 maxDamage,
78 minDamage,
79 CollisionClass.HITS_SHIPS_AND_ASTEROIDS,
80 CollisionClass.HITS_SHIPS_AND_ASTEROIDS, // irrelevant - no explosion for fighters
81 10f,
82 10f,
83 1f,
84 0,
85 Color.white, Color.white);
86 spec.setShowGraphic(false);
87 spec.setDamageType(DamageType.HIGH_EXPLOSIVE);
88 return spec;
89 }
90
91 public OnHitEffectPlugin getEffect() {
92 return effect;
93 }
94
95 public void setEffect(OnHitEffectPlugin effect) {
96 this.effect = effect;
97 }
98
99 public String getSoundSetId() {
100 return soundSetId;
101 }
102 public void setSoundSetId(String soundSetId) {
103 this.soundSetId = soundSetId;
104 }
105
106 public static DamagingExplosionSpec loadFromJSON(JSONObject explosionSpecJson) throws JSONException {
107 if (explosionSpecJson != null) {
109 (float) explosionSpecJson.getDouble("duration"),
110 (float) explosionSpecJson.getDouble("radius"),
111 (float) explosionSpecJson.getDouble("coreRadius"),
112 (float) explosionSpecJson.optDouble("maxDamage", 0),
113 (float) explosionSpecJson.optDouble("minDamage", 0),
114 Misc.mapToEnum(explosionSpecJson, "collisionClass", CollisionClass.class, null),
115 Misc.mapToEnum(explosionSpecJson, "collisionClassByFighter", CollisionClass.class, null),
116 (float) explosionSpecJson.optDouble("particleSizeMin", 0),
117 (float) explosionSpecJson.optDouble("particleSizeRange", 0),
118 (float) explosionSpecJson.optDouble("particleDuration", 0),
119 explosionSpecJson.optInt("particleCount", 0),
120 Misc.getColor(explosionSpecJson, "particleColor"),
121 Misc.optColor(explosionSpecJson, "explosionColor", null)
122 );
123
124 spec.useDetailedExplosion = explosionSpecJson.optBoolean("useDetailedExplosion", false);
125
126 spec.detailedExplosionRadius = (float) explosionSpecJson.optDouble("detailedExplosionRadius", -1f);
127 spec.detailedExplosionFlashRadius = (float) explosionSpecJson.optDouble("detailedExplosionFlashRadius", -1f);
128 spec.detailedExplosionFlashDuration = (float) explosionSpecJson.optDouble("detailedExplosionFlashDuration", -1f);
129 spec.detailedExplosionFlashColorFringe = Misc.optColor(explosionSpecJson, "detailedExplosionFlashColorFringe", null);
130 spec.detailedExplosionFlashColorCore = Misc.optColor(explosionSpecJson, "detailedExplosionFlashColorCore", null);
131
132 spec.particleSpawnRadius = (float) explosionSpecJson.optDouble("particleSpawnRadius", -1f);
133
134
135 if (spec.getParticleCount() == 0) {
136 spec.setShowGraphic(false);
137 }
138 spec.setSoundSetId(explosionSpecJson.optString("sound", null));
139 return spec;
140 }
141 return null;
142 }
143
144 public DamagingExplosionSpec(float duration, float radius, float coreRadius,
145 float maxDamage, float minDamage, CollisionClass collisionClass,
146 CollisionClass collisionClassByFighter,
147 float particleSizeMin, float particleSizeRange,
148 float particleDuration, int particleCount, Color particleColor, Color explosionColor) {
149 this.duration = duration;
150 this.radius = radius;
151 this.coreRadius = coreRadius;
152 this.maxDamage = maxDamage;
153 this.minDamage = minDamage;
154 this.collisionClass = collisionClass;
155 this.collisionClassByFighter = collisionClassByFighter;
156 this.particleSizeMin = particleSizeMin;
157 this.particleSizeRange = particleSizeRange;
158 this.particleDuration = particleDuration;
159 this.particleCount = particleCount;
160 this.particleColor = particleColor;
161 if (explosionColor != null) {
162 this.explosionColor = explosionColor;
163 } else {
164 this.explosionColor = particleColor;
165 }
166 }
167
168 public float getParticleSpawnRadius() {
169 return particleSpawnRadius;
170 }
171
172 public void setParticleSpawnRadius(float particleSpawnRadius) {
173 this.particleSpawnRadius = particleSpawnRadius;
174 }
175
176 public Color getExplosionColor() {
177 return explosionColor;
178 }
179
180 public void setExplosionColor(Color explosionColor) {
181 this.explosionColor = explosionColor;
182 }
183
184 public DamageType getDamageType() {
185 return damageType;
186 }
187
188 public void setDamageType(DamageType damageType) {
189 this.damageType = damageType;
190 }
191
192 public float getDuration() {
193 return duration;
194 }
195
196 public void setDuration(float duration) {
197 this.duration = duration;
198 }
199
200 public float getRadius() {
201 return radius;
202 }
203
204 public void setRadius(float radius) {
205 this.radius = radius;
206 }
207
208 public float getMaxDamage() {
209 return maxDamage;
210 }
211
212 public void setMaxDamage(float maxDamage) {
213 this.maxDamage = maxDamage;
214 }
215
216 public float getMinDamage() {
217 return minDamage;
218 }
219
220 public void setMinDamage(float minDamage) {
221 this.minDamage = minDamage;
222 }
223
224 public CollisionClass getCollisionClass() {
225 return collisionClass;
226 }
227
228 public void setCollisionClass(CollisionClass collisionClass) {
229 this.collisionClass = collisionClass;
230 }
231
232 public CollisionClass getCollisionClassIfByFighter() {
233 return collisionClassByFighter;
234 }
235
236 public void setCollisionClassByFighter(CollisionClass collisionClassByFighter) {
237 this.collisionClassByFighter = collisionClassByFighter;
238 }
239
240 public float getParticleSizeMin() {
241 return particleSizeMin;
242 }
243
244 public void setParticleSizeMin(float particleSizeMin) {
245 this.particleSizeMin = particleSizeMin;
246 }
247
248 public float getParticleSizeRange() {
249 return particleSizeRange;
250 }
251
252 public void setParticleSizeRange(float particleSizeRange) {
253 this.particleSizeRange = particleSizeRange;
254 }
255
256 public float getParticleDuration() {
257 return particleDuration;
258 }
259
260 public void setParticleDuration(float particleDuration) {
261 this.particleDuration = particleDuration;
262 }
263
264 public int getParticleCount() {
265 return particleCount;
266 }
267
268 public void setParticleCount(int particleCount) {
269 this.particleCount = particleCount;
270 }
271
272 public Color getParticleColor() {
273 return particleColor;
274 }
275
276 public void setParticleColor(Color particleColor) {
277 this.particleColor = particleColor;
278 }
279
280 public float getCoreRadius() {
281 return coreRadius;
282 }
283
284 public void setCoreRadius(float coreRadius) {
285 this.coreRadius = coreRadius;
286 }
287
288
289 public boolean isShowGraphic() {
290 return showGraphic;
291 }
292
293
294 public void setShowGraphic(boolean showGraphic) {
295 this.showGraphic = showGraphic;
296 }
297
298 @Override
300 try {
301 return (DamagingExplosionSpec) super.clone();
302 } catch (CloneNotSupportedException e) {
303 return null; // can't happen
304 }
305 }
306
307 public boolean isUseDetailedExplosion() {
308 return useDetailedExplosion;
309 }
310
311 public void setUseDetailedExplosion(boolean useDetailedExplosion) {
312 this.useDetailedExplosion = useDetailedExplosion;
313 }
314
315 public CollisionClass getCollisionClassByFighter() {
316 return collisionClassByFighter;
317 }
318
319 public MutableStat getModifier() {
320 return modifier;
321 }
322
323 public void setModifier(MutableStat modifier) {
324 this.modifier = modifier;
325 }
326
328 return detailedExplosionRadius;
329 }
330
331 public void setDetailedExplosionRadius(float detailedExplosionRadius) {
332 this.detailedExplosionRadius = detailedExplosionRadius;
333 }
334
336 return detailedExplosionFlashRadius;
337 }
338
339 public void setDetailedExplosionFlashRadius(float detailedExplosionFlashRadius) {
340 this.detailedExplosionFlashRadius = detailedExplosionFlashRadius;
341 }
342
344 return detailedExplosionFlashColorFringe;
345 }
346
347 public void setDetailedExplosionFlashColorFringe(Color detailedExplosionFlashColorFringe) {
348 this.detailedExplosionFlashColorFringe = detailedExplosionFlashColorFringe;
349 }
350
352 return detailedExplosionFlashColorCore;
353 }
354
355 public void setDetailedExplosionFlashColorCore(Color detailedExplosionFlashColorCore) {
356 this.detailedExplosionFlashColorCore = detailedExplosionFlashColorCore;
357 }
358
360 return detailedExplosionFlashDuration;
361 }
362
363 public void setDetailedExplosionFlashDuration(float detailedExplosionFlashDuration) {
364 this.detailedExplosionFlashDuration = detailedExplosionFlashDuration;
365 }
366
367
368}
void setDetailedExplosionFlashColorCore(Color detailedExplosionFlashColorCore)
void setDetailedExplosionFlashRadius(float detailedExplosionFlashRadius)
void setDetailedExplosionFlashColorFringe(Color detailedExplosionFlashColorFringe)
void setDetailedExplosionRadius(float detailedExplosionRadius)
static DamagingExplosionSpec explosionSpecForShip(ShipAPI ship)
void setDetailedExplosionFlashDuration(float detailedExplosionFlashDuration)
DamagingExplosionSpec(float duration, float radius, float coreRadius, float maxDamage, float minDamage, CollisionClass collisionClass, CollisionClass collisionClassByFighter, float particleSizeMin, float particleSizeRange, float particleDuration, int particleCount, Color particleColor, Color explosionColor)
void setCollisionClassByFighter(CollisionClass collisionClassByFighter)
static DamagingExplosionSpec loadFromJSON(JSONObject explosionSpecJson)