Starsector API
Loading...
Searching...
No Matches
DarkenedGazeSystemScript.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.combat.dweller;
2
3import java.util.ArrayList;
4import java.util.Collections;
5import java.util.List;
6
7import org.lwjgl.util.vector.Vector2f;
8
9import com.fs.starfarer.api.Global;
10import com.fs.starfarer.api.combat.CollisionClass;
11import com.fs.starfarer.api.combat.MutableShipStatsAPI;
12import com.fs.starfarer.api.combat.ShieldAPI;
13import com.fs.starfarer.api.combat.ShipAPI;
14import com.fs.starfarer.api.combat.ShipCommand;
15import com.fs.starfarer.api.combat.ShipSystemAPI;
16import com.fs.starfarer.api.combat.ShipwideAIFlags.AIFlags;
17import com.fs.starfarer.api.combat.WeaponAPI;
18import com.fs.starfarer.api.impl.combat.BaseShipSystemScript;
19import com.fs.starfarer.api.impl.combat.dweller.DwellerShroud.ShroudNegativeParticleFilter;
20import com.fs.starfarer.api.impl.combat.threat.RoilingSwarmEffect.SwarmMember;
21import com.fs.starfarer.api.loading.BeamWeaponSpecAPI;
22import com.fs.starfarer.api.util.Misc;
23
24public class DarkenedGazeSystemScript extends BaseShipSystemScript implements ShroudNegativeParticleFilter {
25
26 public static float SHIELD_OPENING = 90f;
27 public static float TURN_RATE_REDUCTION = 0.85f;
28
29 public static float DAMAGE_TAKEN_MULT = 2f;
30
31 public static String DARKENED_GAZE_SYSTEM_TAG = "darkened_gaze_system_tag";
32 public static String DARKENED_GAZE_PRIMARY_WEAPON_TAG = "darkened_gaze_system_tag";
33
34
35 protected List<WeaponAPI> weapons = null;
36 protected float elapsedActive = 0f;
37
38
39 protected void findWeapons(ShipAPI ship) {
40 if (weapons != null) return;
41
43
44 weapons = new ArrayList<>();
45 int index = 0;
46 for (WeaponAPI w : ship.getAllWeapons()) {
47 if (w.getSlot().isDecorative()) {
48// if (index == 0 || index == 1 || index == 2 || index == 3) {
49// index++;
50// continue;
51// }
52 //if (index == 8) weapons.clear();
53 weapons.add(w);
54 //if (index == 8) break;
55 //break;
56 }
57 index++;
58 }
59
60 float min = 10000000f;
61 WeaponAPI primary = null;
62 //middle-most weapon is "primary"
63 for (WeaponAPI w : weapons) {
64 float test = w.getSlot().getLocation().y;
65 if (test < min) {
66 min = test;
67 primary = w;
68 }
69 }
70 if (primary != null) {
72 }
73
74 Collections.sort(weapons, (w1, w2) -> {
75 return (int) Math.signum(Math.abs(w1.getSlot().getLocation().y) - Math.abs(w2.getSlot().getLocation().y));
76 });
77
78 // hardcoded to assume 9 beams
79 float incr = 0.15f;
80 float [] offsets = new float []
81 {0f, incr, -incr, 2f * incr, -2f * incr, 3f * incr, -3f * incr, 4f * incr, -4f * incr};
82 for (int i = 0; i < weapons.size(); i++) {
83 WeaponAPI w = weapons.get(i);
86 w.getSpec().getHardpointAngleOffsets().add(offsets[i]);
87 w.getSpec().getTurretAngleOffsets().clear();
88 w.getSpec().getTurretAngleOffsets().add(offsets[i]);
89 // so that there's no FF
90 ((BeamWeaponSpecAPI)w.getSpec()).setCollisionClass(CollisionClass.RAY_FIGHTER);
91 }
92 }
93
94 public boolean isFFAConcern() {
95 if (weapons.size() == 0) return false;
96 return ((BeamWeaponSpecAPI)weapons.get(0).getSpec()).getCollisionClass() == CollisionClass.RAY;
97 }
98
99 public float getRange() {
100 if (weapons == null || weapons.isEmpty()) return 0f;
101 return weapons.get(0).getRange();
102 }
103
104 public void apply(MutableShipStatsAPI stats, String id, State state, float effectLevel) {
105 ShipAPI ship = null;
106 if (stats.getEntity() instanceof ShipAPI) {
107 ship = (ShipAPI) stats.getEntity();
108 } else {
109 return;
110 }
111
112 findWeapons(ship);
113
114 ShieldAPI shield = ship.getShield();
115 if (shield != null) {
116 shield.forceFacing(ship.getFacing() + 180f);
118 shield.toggleOn();
119 }
121 }
122
124
125 if (state == State.IN) {
126 if (shield != null) {
127 float currOpening = effectLevel * SHIELD_OPENING;
128 shield.setArc(360f - currOpening);
129 }
130// if (shroud != null && effectLevel < 0.5f) {
131// SwarmMember added = shroud.addMember();
132// //added.flash();
133// float arc = 360f - SHIELD_OPENING;
134// float angle = ship.getFacing() + 180f + arc/2f - arc * (float) Math.random();
135// added.offset = Misc.getUnitVectorAtDegreeAngle(angle);
136// added.offset.scale(shroud.getParams().maxOffset * 0.7f);
137// Vector2f offset = Misc.getUnitVectorAtDegreeAngle(angle);
138// offset.scale(shroud.getParams().maxOffset + 200f + (float) Math.random() * 100f);
139// Vector2f.add(ship.getLocation(), offset, added.loc);
140// }
141
142 } else if (state == State.ACTIVE) {
143 for (WeaponAPI w : weapons) {
144 //if ((float) Math.random() > 0.97f) {
145 w.setForceFireOneFrame(true);
146 //}
147 }
148 } else if (state == State.OUT) {
149 if (shield != null) {
150 float currOpening = effectLevel * SHIELD_OPENING;
151 shield.setArc(360f - currOpening);
152 }
153 }
154
155 if (state == State.IN || state == State.ACTIVE) {
156 if (shroud != null) {
157 shroud.getShroudParams().negativeParticleClearCenterAreaRadius = 150f;
158 shroud.getShroudParams().negativeParticleGenRate = 0.5f;
159 //shroud.getShroudParams().negativeParticleColorOverride = new Color(0,0,0,255);
160 shroud.getShroudParams().negativeParticleFilter = this;
161 }
162
163
164 Vector2f dir = Misc.getUnitVectorAtDegreeAngle(ship.getFacing() + 180f);
166
167
168 float accel = ConvulsiveLungeSystemScript.PARTICLE_WINDUP_ACCEL * amount * effectLevel;
169 if (shroud != null) {
170 for (SwarmMember p : shroud.getMembers()) {
171 float currAngle = Misc.getAngleInDegrees(ship.getLocation(), p.loc);
172 float angleDiff = Misc.getAngleDiff(currAngle, ship.getFacing());
173 float accelMult = 1f;
174 if (angleDiff > SHIELD_OPENING * 0.5f) {
175 //accelMult = SHIELD_OPENING * 0.5f / angleDiff;
176 accelMult = 0f;
177 }
178
179 p.vel.x += dir.x * accel * accelMult;
180 p.vel.y += dir.y * accel * accelMult;
181 }
182 }
183 if (state == State.ACTIVE) {
184 elapsedActive += amount;
185 float f = Math.min(elapsedActive, 1f) * 1f;
186 f = 1f - f;
187 //float beamSpeedMult = 1f + (float) Math.sqrt(f) * 2f;
188// float beamSpeedMult = 1f + f * f * 2f;
189// ship.getMutableStats().getBeamSpeedMod().modifyMult(id, beamSpeedMult);
190 }
191
192 ship.getMutableStats().getMaxTurnRate().modifyMult(id, 1f - TURN_RATE_REDUCTION * effectLevel);
193 ship.getMutableStats().getHullDamageTakenMult().modifyMult(id, 1f + (DAMAGE_TAKEN_MULT - 1f) * effectLevel);
194 } else {
195 if (shroud != null) {
196 shroud.getShroudParams().negativeParticleClearCenterAreaRadius = 50f;
197 shroud.getShroudParams().negativeParticleGenRate = 1f;
198 //shroud.getShroudParams().negativeParticleColorOverride = null;
199 shroud.getShroudParams().negativeParticleFilter = null;
200 }
201 elapsedActive = 0f;
204 //ship.getMutableStats().getBeamSpeedMod().unmodifyMult(id);
205 }
206
207 ship.getAIFlags().setFlag(AIFlags.BACK_OFF_MIN_RANGE, 1f, getRange() - 300f);
208
209 if (state == State.IDLE) {
210 shield.setArc(360f);
211 }
212
213 }
214
215 public void unapply(MutableShipStatsAPI stats, String id) {
216 }
217
218 public StatusData getStatusData(int index, State state, float effectLevel) {
219 return null;
220 }
221
222 @Override
223 public String getInfoText(ShipSystemAPI system, ShipAPI ship) {
224 return super.getInfoText(system, ship);
225 }
226
227 @Override
228 public boolean isParticleOk(DwellerShroud shroud, Vector2f loc) {
229 // only filtering when in/active, not idle/out/cooldown, so don't worry about those cases
230 if (shroud == null || shroud.getAttachedTo() == null) return true;
231 float angle = Misc.getAngleInDegrees(shroud.getAttachedTo().getLocation(), loc);
232 return !Misc.isInArc(shroud.getAttachedTo().getFacing(), SHIELD_OPENING, angle);
233 }
234
235
236}
237
238
239
240
241
242
243
244
static CombatEngineAPI getCombatEngine()
Definition Global.java:69
void modifyMult(String source, float value)
StatusData getStatusData(int index, State state, float effectLevel)
void apply(MutableShipStatsAPI stats, String id, State state, float effectLevel)
static DwellerShroud getShroudFor(CombatEntityAPI entity)
static Vector2f getUnitVectorAtDegreeAngle(float degrees)
Definition Misc.java:1196
static float getAngleDiff(float from, float to)
Definition Misc.java:1716
static boolean isInArc(float direction, float arc, Vector2f from, Vector2f to)
Definition Misc.java:1722
static float getAngleInDegrees(Vector2f v)
Definition Misc.java:1126
MutableShipStatsAPI getMutableStats()
List< WeaponAPI > getAllWeapons()
void blockCommandForOneFrame(ShipCommand command)