Starsector API
Loading...
Searching...
No Matches
MagneticFieldTerrainPlugin.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.terrain;
2
3import java.awt.Color;
4import java.util.ArrayList;
5import java.util.EnumSet;
6import java.util.List;
7
8import org.lwjgl.util.vector.Vector2f;
9
10import com.fs.starfarer.api.Global;
11import com.fs.starfarer.api.campaign.CampaignEngineLayers;
12import com.fs.starfarer.api.campaign.CampaignFleetAPI;
13import com.fs.starfarer.api.campaign.SectorEntityToken;
14import com.fs.starfarer.api.campaign.TerrainAIFlags;
15import com.fs.starfarer.api.combat.ViewportAPI;
16import com.fs.starfarer.api.graphics.SpriteAPI;
17import com.fs.starfarer.api.impl.campaign.ids.Stats;
18import com.fs.starfarer.api.impl.campaign.terrain.AuroraRenderer.AuroraRendererDelegate;
19import com.fs.starfarer.api.impl.campaign.terrain.FlareManager.Flare;
20import com.fs.starfarer.api.impl.campaign.terrain.FlareManager.FlareManagerDelegate;
21import com.fs.starfarer.api.loading.Description.Type;
22import com.fs.starfarer.api.ui.Alignment;
23import com.fs.starfarer.api.ui.TooltipMakerAPI;
24import com.fs.starfarer.api.util.Misc;
25
26public class MagneticFieldTerrainPlugin extends BaseRingTerrain implements AuroraRendererDelegate, FlareManagerDelegate {
27
28 public static class MagneticFieldParams extends RingParams {
29 public Color baseColor;
30 transient public List<Color> auroraColorRange = new ArrayList<Color>();
31 public String c = null;
32
33 public float auroraFrequency;
34
35 public float innerRadius;
36 public float outerRadius;
37
38 public MagneticFieldParams(float bandWidthInEngine, float middleRadius, SectorEntityToken relatedEntity,
39 float innerRadius,
40 float outerRadius,
41 Color baseColor,
42 float auroraFrequency) {
43 this(bandWidthInEngine, middleRadius, relatedEntity, innerRadius, outerRadius,
44 baseColor, auroraFrequency,
45 Color.red, Color.orange, Color.yellow, Color.green, Color.blue,
46 new Color(75, 0, 130), new Color(127, 0, 255));
47 }
48 public MagneticFieldParams(float bandWidthInEngine, float middleRadius, SectorEntityToken relatedEntity,
49 float innerRadius,
50 float outerRadius,
51 Color baseColor,
52 float auroraFrequency,
53 Color ... auroraColors) {
54 super(bandWidthInEngine, middleRadius, relatedEntity);
55 this.auroraFrequency = auroraFrequency;
56 this.baseColor = baseColor;
57 this.innerRadius = innerRadius;
58 this.outerRadius = outerRadius;
59 if (auroraColors != null) {
60 for (Color curr : auroraColors) {
61 this.auroraColorRange.add(curr);
62 }
63 }
64 }
65
66 Object readResolve() {
67 if (c != null) {
68 auroraColorRange = Misc.colorsFromString(c);
69 } else {
70 auroraColorRange = new ArrayList<Color>();
71 }
72 return this;
73 }
74
75 Object writeReplace() {
76 c = Misc.colorsToString(auroraColorRange);
77 return this;
78 }
79 }
80
81 //public static final float VISIBLITY_MULT = 0.5f;
82
83 //public static final float SENSOR_MULT = 0.5f;
84 public static final float SENSOR_MULT_AURORA = 0.1f;
85 public static final float DETECTED_MULT_AURORA = 0f;
86 public static final float DETECTED_MULT = .25f;
87
88// public static float BURN_MULT = 0.5f;
89// public static float BURN_MULT_AURORA = 0.25f;
90
91
92 transient protected SpriteAPI texture = null;
93 transient protected Color color;
95
96 protected MagneticFieldParams params;
98
99 public MagneticFieldParams getParams() {
100 return params;
101 }
102
103 public void init(String terrainId, SectorEntityToken entity, Object param) {
104 super.init(terrainId, entity, param);
105 this.params = (MagneticFieldParams) param;
106 name = params.name;
107 if (name == null) {
108 name = "Magnetic Field";
109 }
110 }
111
112 public String getNameForTooltip() {
113 return "Magnetic Field";
114 }
115
116 @Override
117 protected Object readResolve() {
118 super.readResolve();
119 texture = Global.getSettings().getSprite("terrain", "aurora");
120 layers = EnumSet.of(CampaignEngineLayers.TERRAIN_7);
121 if (renderer == null) {
122 renderer = new AuroraRenderer(this);
123 }
124 if (flareManager == null) {
125 flareManager = new FlareManager(this);
126 }
127 return this;
128 }
129
130 Object writeReplace() {
131 return this;
132 }
133
134 transient private EnumSet<CampaignEngineLayers> layers = EnumSet.of(CampaignEngineLayers.TERRAIN_7);
135 public EnumSet<CampaignEngineLayers> getActiveLayers() {
136 return layers;
137 }
138
139
140 public void advance(float amount) {
141 super.advance(amount);
142 renderer.advance(amount);
143 flareManager.advance(amount);
144 }
145
146 public void render(CampaignEngineLayers layer, ViewportAPI viewport) {
147 renderer.render(viewport.getAlphaMult());
148 }
149
150 @Override
151 public float getRenderRange() {
152 Flare curr = flareManager.getActiveFlare();
153 if (curr != null) {
154 float outerRadiusWithFlare = computeRadiusWithFlare(flareManager.getActiveFlare());
155 return outerRadiusWithFlare + 200f;
156 }
157 return super.getRenderRange();
158 }
159
160 @Override
161 protected boolean shouldPlayLoopOne() {
162 return super.shouldPlayLoopOne() && !flareManager.isInActiveFlareArc(Global.getSector().getPlayerFleet());
163 }
164
165 @Override
166 protected boolean shouldPlayLoopTwo() {
167 return super.shouldPlayLoopTwo() && flareManager.isInActiveFlareArc(Global.getSector().getPlayerFleet());
168 }
169
170
171 @Override
172 public void applyEffect(SectorEntityToken entity, float days) {
173 if (entity instanceof CampaignFleetAPI) {
175
176// fleet.getStats().addTemporaryModMult(0.1f, getModId() + "_1",
177// "Inside strong magnetic field", VISIBLITY_MULT,
178// fleet.getStats().getDetectedRangeMod());
179
180 if (flareManager.isInActiveFlareArc(fleet)) {
181// fleet.getStats().removeTemporaryMod(getModId() + "_3");
182// fleet.getStats().addTemporaryModMult(0.1f, getModId() + "_1",
183// "Inside magnetic storm", getAdjustedMult(fleet, BURN_MULT_AURORA),
184// fleet.getStats().getFleetwideMaxBurnMod());
185// fleet.getStats().addTemporaryModPercent(0.1f, getModId() + "_1",
186// "Inside magnetic storm", -100f * (1f - getAdjustedMult(fleet, BURN_MULT_AURORA)),
187// fleet.getStats().getFleetwideMaxBurnMod());
188
189 //fleet.getStats().removeTemporaryMod(getModId() + "_4");
190 fleet.getStats().addTemporaryModMult(0.1f, getModId() + "_2",
191 "Inside magnetic storm", SENSOR_MULT_AURORA,
192 fleet.getStats().getSensorRangeMod());
193
194 fleet.getStats().removeTemporaryMod(getModId() + "_6");
195 fleet.getStats().addTemporaryModMult(0.1f, getModId() + "_5",
196 "Inside magnetic storm", DETECTED_MULT_AURORA,
197 fleet.getStats().getDetectedRangeMod());
198 } else {
199// fleet.getStats().removeTemporaryMod(getModId() + "_1");
200// fleet.getStats().addTemporaryModMult(0.1f, getModId() + "_3",
201// "Inside strong magnetic field", getAdjustedMult(fleet, BURN_MULT),
202// fleet.getStats().getFleetwideMaxBurnMod());
203// fleet.getStats().addTemporaryModPercent(0.1f, getModId() + "_3",
204// "Inside strong magnetic field", -100f * (1f - getAdjustedMult(fleet, BURN_MULT)),
205// fleet.getStats().getFleetwideMaxBurnMod());
206
207 fleet.getStats().removeTemporaryMod(getModId() + "_5");
208 fleet.getStats().addTemporaryModMult(0.1f, getModId() + "_6",
209 "Inside strong magnetic field", DETECTED_MULT,
210 fleet.getStats().getDetectedRangeMod());
211// fleet.getStats().addTemporaryModMult(0.1f, getModId() + "_4",
212// "Inside strong magnetic field", SENSOR_MULT,
213// fleet.getStats().getSensorRangeMod());
214
215 }
216 }
217 }
218
219 protected float getAdjustedMult(CampaignFleetAPI fleet, float baseMult) {
221 float penalty = 1f - baseMult;
222 penalty *= skillMod;
223 return 1f - penalty;
224 }
225
226
227 @Override
228 public boolean containsPoint(Vector2f point, float radius) {
229 if (flareManager.isInActiveFlareArc(point)) {
230 float outerRadiusWithFlare = computeRadiusWithFlare(flareManager.getActiveFlare());
231 float dist = Misc.getDistance(this.entity.getLocation(), point);
232 if (dist > outerRadiusWithFlare + radius) return false;
233 if (dist + radius < params.middleRadius - params.bandWidthInEngine / 2f) return false;
234 return true;
235 }
236 return super.containsPoint(point, radius);
237 }
238
239 private float computeRadiusWithFlare(Flare flare) {
240 //params.relatedEntity.getRadius() + 50f;
241 //params.middleRadius + params.bandWidthInEngine * 0.75f;
242 float inner = getAuroraInnerRadius();
243 float outer = params.middleRadius + params.bandWidthInEngine * 0.5f;
244 float thickness = outer - inner;
245
246 thickness *= flare.extraLengthMult;
247 thickness += flare.extraLengthFlat;
248
249 return inner + thickness;
250 }
251
252 @Override
253 public Color getNameColor() {
254 Color bad = Misc.getNegativeHighlightColor();
255 Color base = super.getNameColor();
256 //bad = Color.red;
257 //return Misc.interpolateColor(base, bad, Global.getSector().getCampaignUI().getSharedFader().getBrightness() * 1f);
258 return super.getNameColor();
259 }
260
261 public boolean hasTooltip() {
262 return true;
263 }
264
265 public void createTooltip(TooltipMakerAPI tooltip, boolean expanded) {
266 float pad = 10f;
267 float small = 5f;
268 Color gray = Misc.getGrayColor();
269 Color highlight = Misc.getHighlightColor();
270 Color fuel = Global.getSettings().getColor("progressBarFuelColor");
271 Color bad = Misc.getNegativeHighlightColor();
272
273 tooltip.addTitle("Magnetic Field");
274 tooltip.addPara(Global.getSettings().getDescription(getTerrainId(), Type.TERRAIN).getText1(), pad);
275
277
278// float sensorMult = SENSOR_MULT;
279// float burnMult = getAdjustedMult(player, BURN_MULT);
280// String extraText = "";
281// if (flareManager.isInActiveFlareArc(Global.getSector().getPlayerFleet())) {
282// sensorMult = SENSOR_MULT_AURORA;
283// burnMult = getAdjustedMult(player, BURN_MULT_AURORA);
284// //extraText = " The sensor penalty is currently increased due to being inside a magnetic storm.";
285// extraText = " The sensor and travel speed penalties are currently increased due to being inside a magnetic storm.";
286// }
287
288 float nextPad = pad;
289 if (expanded) {
290 tooltip.addSectionHeading("Travel", Alignment.MID, pad);
291 nextPad = small;
292 }
293
294 float detectedMult = DETECTED_MULT;
296 detectedMult = DETECTED_MULT_AURORA;
297 }
298 tooltip.addPara("Reduces the range at which fleets inside can be detected by %s.", nextPad,
299 highlight,
300 "" + (int) ((1f - detectedMult) * 100) + "%"
301 );
302
304 tooltip.addPara("The magnetic storm also blinds the sensors of a fleet within," +
305 " reducing their range by %s.", pad,
306 highlight,
307 "" + (int) ((1f - SENSOR_MULT_AURORA) * 100) + "%"
308 );
309 }
310
311// String sensorMultStr = Misc.getRoundedValue(1f - sensorMult);
312// String burnMultStr = Misc.getRoundedValue(1f - burnMult);
313// tooltip.addPara("Your fleet's sensor range is reduced by %s. Your fleet's speed is reduced by %s." + extraText, pad,
314// highlight,
315// "" + (int) ((1f - sensorMult) * 100) + "%",
316// "" + (int) ((1f - burnMult) * 100) + "%"
317// );
318
319// tooltip.addPara("Reduces the range at which fleets inside it can be detected by %s. Also reduces fleet sensor range by %s." + extraText, nextPad,
320// highlight,
321// "" + (int) ((1f - VISIBLITY_MULT) * 100) + "%",
322// "" + (int) ((1f - sensorMult) * 100) + "%"
323// );
324
325 if (expanded) {
326 tooltip.addSectionHeading("Combat", Alignment.MID, pad);
327 tooltip.addPara("No combat effects.", nextPad);
328 }
329 }
330
331 public boolean isTooltipExpandable() {
332 return true;
333 }
334
335 public float getTooltipWidth() {
336 return 350f;
337 }
338
339 public String getTerrainName() {
341 return "Magnetic Storm";
342 }
343 return super.getTerrainName();
344 }
345
346 public String getEffectCategory() {
347 return "magnetic_field-like";
348 }
349
350 public float getAuroraAlphaMultForAngle(float angle) {
351 return 1f;
352 }
353
355 return 256f;
356 //return 512f;
357 }
358
359 public Vector2f getAuroraCenterLoc() {
360 return params.relatedEntity.getLocation();
361 }
362
363 public Color getAuroraColorForAngle(float angle) {
364 if (flareManager.isInActiveFlareArc(angle)) {
365 return flareManager.getColorForAngle(params.baseColor, angle);
366 }
367 return params.baseColor;
368 }
369
370 public float getAuroraInnerRadius() {
371 return params.innerRadius;
372 }
373
374 public float getAuroraOuterRadius() {
375 return params.outerRadius;
376 }
377
378 public float getAuroraShortenMult(float angle) {
379 return 0f + flareManager.getShortenMod(angle);
380 //return 0.3f + flareManager.getShortenMod(angle);
381 }
382
383 public float getAuroraInnerOffsetMult(float angle) {
384 return flareManager.getInnerOffsetMult(angle);
385 }
386
388 return 1f;
389 }
390
392 return texture;
393 }
394
395 public float getAuroraThicknessFlat(float angle) {
396 if (flareManager.isInActiveFlareArc(angle)) {
397 return flareManager.getExtraLengthFlat(angle);
398 }
399 return 0f;
400 }
401
402 public float getAuroraThicknessMult(float angle) {
403 if (flareManager.isInActiveFlareArc(angle)) {
404 return flareManager.getExtraLengthMult(angle);
405 }
406 return 1f;
407 }
408
409
410 public float getFlareArcMax() {
411 return 80;
412 }
413
414 public float getFlareArcMin() {
415 return 30;
416 }
417
418 public List<Color> getFlareColorRange() {
419 return params.auroraColorRange;
420 }
421
423 return 0;
424 }
425
427 return 0;
428 }
429
431 return 1;
432 }
433
435 return 1;
436 }
437
438 public float getFlareFadeInMax() {
439 return 2f;
440 }
441
442 public float getFlareFadeInMin() {
443 return 1f;
444 }
445
446 public float getFlareFadeOutMax() {
447 return 5f;
448 }
449
450 public float getFlareFadeOutMin() {
451 return 2f;
452 }
453
454 public float getFlareOccurrenceAngle() {
455 return 0;
456 }
457
458 public float getFlareOccurrenceArc() {
459 return 360f;
460 }
461
462 public float getFlareProbability() {
463 return params.auroraFrequency;
464 }
465
466 public float getFlareSmallArcMax() {
467 return 20;
468 }
469
470 public float getFlareSmallArcMin() {
471 return 10;
472 }
473
475 return 0;
476 }
477
479 return 0;
480 }
481
483 return 1;
484 }
485
487 return 1;
488 }
489
490 public float getFlareSmallFadeInMax() {
491 return 1f;
492 }
493
494 public float getFlareSmallFadeInMin() {
495 return 0.5f;
496 }
497
498 public float getFlareSmallFadeOutMax() {
499 return 1f;
500 }
501
502 public float getFlareSmallFadeOutMin() {
503 return 0.5f;
504 }
505
507 return 0.8f;
508 }
509
511 return 0.8f;
512 }
513
515 return 0.8f;
516 }
517
519 return 0.8f;
520 }
521
523 return 2;
524 }
525
527 return 7;
528 }
529
531 return 0f;
532 }
533
535 return this.entity;
536 }
537
538 public boolean hasAIFlag(Object flag) {
539 return flag == TerrainAIFlags.REDUCES_DETECTABILITY || flag == TerrainAIFlags.REDUCES_SENSOR_RANGE;
540 }
541
542 public boolean canPlayerHoldStationIn() {
543 return true;
544 }
545
547 return null;
548 }
549
551 return renderer;
552 }
553
555 return flareManager;
556 }
557}
558
559
560
static SettingsAPI getSettings()
Definition Global.java:57
static SectorAPI getSector()
Definition Global.java:65
static final String NAVIGATION_PENALTY_MULT
Definition Stats.java:77
Color getColorForAngle(Color baseColor, float angle)
void init(String terrainId, SectorEntityToken entity, Object param)
static Color getNegativeHighlightColor()
Definition Misc.java:802
static Color getGrayColor()
Definition Misc.java:826
static String colorsToString(List< Color > colors)
Definition Misc.java:3507
static List< Color > colorsFromString(String in)
Definition Misc.java:3518
static float getDistance(SectorEntityToken from, SectorEntityToken to)
Definition Misc.java:599
static Color getHighlightColor()
Definition Misc.java:792
Description getDescription(String id, Type type)
SpriteAPI getSprite(String filename)
MutableCharacterStatsAPI getCommanderStats()
void addTemporaryModMult(float durInDays, String source, String desc, float value, StatBonus stat)
LabelAPI addPara(String format, float pad, Color hl, String... highlights)
LabelAPI addSectionHeading(String str, Alignment align, float pad)