Starsector API
Loading...
Searching...
No Matches
ConvulsiveLungeSystemScript.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.combat.dweller;
2
3import org.lwjgl.util.vector.Vector2f;
4
5import com.fs.starfarer.api.Global;
6import com.fs.starfarer.api.combat.MutableShipStatsAPI;
7import com.fs.starfarer.api.combat.ShipAPI;
8import com.fs.starfarer.api.combat.ShipCommand;
9import com.fs.starfarer.api.combat.ShipwideAIFlags.AIFlags;
10import com.fs.starfarer.api.impl.combat.BaseShipSystemScript;
11import com.fs.starfarer.api.impl.combat.threat.RoilingSwarmEffect.SwarmMember;
12import com.fs.starfarer.api.util.Misc;
13
15
16 public static float PULL_DIST = 1000f;
17 public static float PARTICLE_WINDUP_ACCEL = 1500f;
18 public static float SPRING_CONSTANT = 4f;
19 public static float FRICTION = 1000f;
20
21 public static float MAW_WINDUP_MULT = 3f;
22
23 protected Vector2f dest;
24 protected boolean fadedFlash = false;
25
26 protected void init(ShipAPI ship) {
27 }
28
29
30// public static boolean isMaw(ShipAPI ship) {
31// boolean isMaw = ship != null && ship.isCapital();
32// return isMaw;
33// }
34
35 @Override
36 public void apply(MutableShipStatsAPI stats, String id, State state, float effectLevel) {
37 ShipAPI ship = null;
38 if (stats.getEntity() instanceof ShipAPI) {
39 ship = (ShipAPI) stats.getEntity();
40 } else {
41 return;
42 }
43
45 if (state == State.IN) {
46 boolean destWasNull = dest == null;
47 if (dest == null) {
48 dest = new Vector2f(ship.getMouseTarget());
49 if (ship.getShipAI() != null && ship.getAIFlags().hasFlag(AIFlags.SYSTEM_TARGET_COORDS)){
50 dest = (Vector2f) ship.getAIFlags().getCustom(AIFlags.SYSTEM_TARGET_COORDS);
51 }
52 }
53 if (dest == null) {
55 dest.scale(PULL_DIST);
56 Vector2f.add(dest, ship.getLocation(), dest);
57 }
58
59// float dist = Misc.getDistance(ship.getLocation(), dest);
60// if (dist < PULL_DIST) {
61 if (destWasNull) {
63 dest = dir;
64 dest.scale(PULL_DIST);
65 Vector2f.add(dest, ship.getLocation(), dest);
66 }
67 }
68
69 if (dest != null) {
72
73 if (state == State.IN) {
74 boolean isMaw = DwellerCombatStrategyAI.isMaw(ship);
75 float accel = PARTICLE_WINDUP_ACCEL * amount * effectLevel;
76 if (isMaw) {
77 accel *= MAW_WINDUP_MULT;
78 }
79 if (shroud != null) {
80 boolean affect = true;
81 for (SwarmMember p : shroud.getMembers()) {
82 if (affect) {
83 p.vel.x += dir.x * accel;
84 p.vel.y += dir.y * accel;
85 }
86 affect = !affect;
87 }
88 //shroud.getParams().baseMembersToMaintain = 150;
89 }
90 }
91
92 if (state == State.ACTIVE) {
93 if (!fadedFlash) {
94 //shroud.getParams().baseMembersToMaintain = 100;
95 if (shroud != null) {
96 for (SwarmMember p : shroud.getMembers()) {
97 if (p.flash != null) {
98 p.flash.fadeOut();
99 }
100 }
101 }
102 fadedFlash = true;
103 }
104
105 Vector2f loc = ship.getLocation();
106 float dist = Misc.getDistance(loc, dest);
107
108 //Vector2f perp = new Vector2f(-dir.y, dir.x);
109
110 float friction = FRICTION;
111 float k = SPRING_CONSTANT;
112 float freeLength = 0f;
113 float stretch = dist - freeLength;
114
115 float forceMag = k * Math.abs(stretch);
116
117 float forceMagReduction = Math.min(Math.abs(forceMag), friction);
118 forceMag -= forceMagReduction;
119 friction -= forceMagReduction;
120
121 Vector2f force = new Vector2f(dir);
122 force.scale(forceMag * Math.signum(stretch));
123
124 Vector2f acc = new Vector2f(force);
125 acc.scale(amount);
126 Vector2f.add(ship.getVelocity(), acc, ship.getVelocity());
127 }
128
129 }
130
131 if (state == State.OUT) {
132 dest = null;
133 fadedFlash = false;
134 } else if (state == State.ACTIVE) {
135 }
136
137 if (effectLevel > 0.85f && state != State.OUT) {
138 if (ship.getShield() != null) {
139 if (ship.getShield().isOn()) {
140 ship.getShield().toggleOff();
141 }
143 }
144 }
145
146
147 if (effectLevel > 0f) {
148 //if (state == State.OUT) {
151 ship.giveCommand(ShipCommand.DECELERATE, null, 0);
152 }
153
154 //stats.getMaxSpeed().modifyFlat(id, SPEED_BONUS * effectLevel);
155
156
157 //ship.getAIFlags().setFlag(AIFlags.DO_NOT_BACK_OFF, 1f);
158 //ship.getAIFlags().setFlag(AIFlags.DO_NOT_VENT, 1f);
159 //ship.getAIFlags().setFlag(AIFlags.IGNORES_ORDERS, 1f);
160 }
161
162
163 public StatusData getStatusData(int index, State state, float effectLevel) {
164 return null;
165 }
166
167}
168
169
170
171
172
173
174
175
static CombatEngineAPI getCombatEngine()
Definition Global.java:69
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 getDistance(SectorEntityToken from, SectorEntityToken to)
Definition Misc.java:599
static float getAngleInDegrees(Vector2f v)
Definition Misc.java:1126
void blockCommandForOneFrame(ShipCommand command)
void giveCommand(ShipCommand command, Object param, int groupNumber)