Starsector API
Loading...
Searching...
No Matches
HyperStormBoost.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.terrain;
2
3import java.awt.Color;
4
5import org.lwjgl.util.vector.Vector2f;
6
7import com.fs.starfarer.api.EveryFrameScript;
8import com.fs.starfarer.api.Global;
9import com.fs.starfarer.api.campaign.CampaignFleetAPI;
10import com.fs.starfarer.api.fleet.FleetMemberViewAPI;
11import com.fs.starfarer.api.impl.campaign.terrain.HyperspaceTerrainPlugin.CellStateTracker;
12import com.fs.starfarer.api.util.Misc;
13
14public class HyperStormBoost implements EveryFrameScript {
15
16 public static float MAX_BURN = Global.getSettings().getFloat("maxStormStrikeBurn");
18 public static float DURATION_SECONDS = 1f;
19
20 protected CampaignFleetAPI fleet;
21 protected float elapsed;
22 protected float angle;
23 protected CellStateTracker cell;
24
25 public HyperStormBoost(CellStateTracker cell, CampaignFleetAPI fleet) {
26 this.cell = cell;
27 this.fleet = fleet;
28
29 DURATION_SECONDS = 1.25f;
31
32// DURATION_SECONDS = 2f;
33// STORM_SPEED_BURST = Global.getSettings().getSpeedPerBurnLevel() * 50f;
34
35 if (Misc.getHyperspaceTerrain().getPlugin() instanceof HyperspaceTerrainPlugin) {
36 HyperspaceTerrainPlugin hyper = (HyperspaceTerrainPlugin) Misc.getHyperspaceTerrain().getPlugin();
37
38 float x = hyper.getEntity().getLocation().x;
39 float y = hyper.getEntity().getLocation().y;
40 float size = hyper.getTileSize();
41
42 float w = hyper.getTiles().length * size;
43 float h = hyper.getTiles()[0].length * size;
44
45 x -= w/2f;
46 y -= h/2f;
47
48 float tx = x + cell.i * size + size/2f;
49 float ty = y + cell.j * size + size/2f;
50
51 angle = Misc.getAngleInDegrees(new Vector2f(tx, ty), fleet.getLocation());
52
53 Vector2f v = fleet.getVelocity();
54 float angle2 = Misc.getAngleInDegrees(v);
55 float speed = v.length();
56 if (speed < 10) angle2 = fleet.getFacing();
57
59 float mult = 0.5f + 0.4f * speed / bestAngleAt;
60 if (mult < 0.5f) mult = 0.5f;
61 if (mult > 0.9f) mult = 0.9f;
62
63 angle += Misc.getClosestTurnDirection(angle, angle2) * Misc.getAngleDiff(angle, angle2) * mult;
64 }
65 }
66
67 public void advance(float amount) {
68 elapsed += amount;
69
70 Vector2f boost = Misc.getUnitVectorAtDegreeAngle(angle);
71
72 float mult = 1f;
73 mult = 1f - elapsed / DURATION_SECONDS;
74 mult *= Math.pow(Math.min(1f, elapsed / 0.25f), 2f);
75 if (mult < 0) mult = 0;
76 if (mult > 1) mult = 1;
77 boost.scale(STORM_SPEED_BURST * amount * mult);
78
79 Vector2f v = fleet.getVelocity();
80
81 if (fleet.getCurrBurnLevel() < MAX_BURN) {
82 fleet.setVelocity(v.x + boost.x, v.y + boost.y);
83 }
84
85 float angleHeading = Misc.getAngleInDegrees(v);
86 if (v.length() < 10) angleHeading = fleet.getFacing();
87
88 boost = Misc.getUnitVectorAtDegreeAngle(angleHeading);
89 //boost.negate();
90 if (boost.length() >= 1) {
91 float durIn = 1f;
92 float durOut = 3f;
93 float intensity = 1f;
94 float sizeNormal = 5f + 20f * intensity;
95 String modId = "boost " + cell.i + cell.j * 100;
96 Color glowColor = new Color(100, 100, 255, 75);
97 for (FleetMemberViewAPI view : fleet.getViews()) {
98 view.getWindEffectDirX().shift(modId, boost.x * sizeNormal, durIn, durOut, 1f);
99 view.getWindEffectDirY().shift(modId, boost.y * sizeNormal, durIn, durOut, 1f);
100 view.getWindEffectColor().shift(modId, glowColor, durIn, durOut, intensity);
101 }
102 }
103 }
104
105 public boolean isDone() {
106 return elapsed >= DURATION_SECONDS || !fleet.isInHyperspace();
107 }
108
109 public boolean runWhilePaused() {
110 // TODO Auto-generated method stub
111 return false;
112 }
113
114}
static SettingsAPI getSettings()
Definition Global.java:51
HyperStormBoost(CellStateTracker cell, CampaignFleetAPI fleet)