Starsector API
Loading...
Searching...
No Matches
FragmentVolleySystemScript.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.combat.threat;
2
3import java.awt.Color;
4
5import com.fs.starfarer.api.combat.MutableShipStatsAPI;
6import com.fs.starfarer.api.combat.ShipAPI;
7import com.fs.starfarer.api.combat.ShipwideAIFlags.AIFlags;
8import com.fs.starfarer.api.combat.WeaponAPI;
9import com.fs.starfarer.api.combat.WeaponAPI.AIHints;
10import com.fs.starfarer.api.combat.WeaponGroupAPI;
11import com.fs.starfarer.api.combat.listeners.WeaponRangeModifier;
12import com.fs.starfarer.api.impl.campaign.ids.Stats;
13import com.fs.starfarer.api.impl.campaign.ids.Tags;
14import com.fs.starfarer.api.util.Misc;
15
17
18 //public static float FRAGMENT_RANGE_PERCENT = 100;
19 public static float FRAGMENT_RANGE_MULT = 2;
20 public static float MAX_VOLLEY_RANGE = 3000f;
21
22 public static float FRAGMENT_REGEN_RATE_MULT = 10f;
23
24 public void applyImpl(ShipAPI ship, MutableShipStatsAPI stats, String id, State state, float effectLevel) {
25 if (effectLevel <= 0f) {
27 return;
28 }
29
31 1f + (FRAGMENT_REGEN_RATE_MULT - 1f) * effectLevel);
32
34 for (WeaponGroupAPI g : ship.getWeaponGroupsCopy()) {
35 for (WeaponAPI w : g.getWeaponsCopy()) {
36 if (w.hasAIHint(AIHints.PD)) continue;
37 if (w.hasAIHint(AIHints.NO_MANUAL_FIRE)) continue;
38
39 if (w.getSpec().hasTag(Tags.FRAGMENT)) {
40 w.setGlowAmount(effectLevel, glowColor);
41 }
42 }
43 }
44
45 setStandardJitter(ship, state, effectLevel);
46
47 if (state == State.OUT) {
49 return;
50 }
51 if (state != State.ACTIVE) {
52 return;
53 }
54
56 ship.addListener(this);
57 }
58
59 for (WeaponGroupAPI g : ship.getWeaponGroupsCopy()) {
60 for (WeaponAPI w : g.getWeaponsCopy()) {
61 if (w.hasAIHint(AIHints.NO_MANUAL_FIRE)) continue;
62
63 if (!w.hasAIHint(AIHints.PD) && w.getSpec().hasTag(Tags.FRAGMENT)) {
64 if (w.getCooldownRemaining() > 1f) {
65 w.setRemainingCooldownTo(1f);
66 }
67 if (w.usesAmmo()) {
68 w.setAmmo(w.getMaxAmmo());
69 }
70 w.setForceFireOneFrame(true);
71 } else {
72 w.setForceNoFireOneFrame(true);
73 }
74 }
75 }
76
77 Object test = ship.getAIFlags().getCustom(AIFlags.MANEUVER_TARGET);
78 if (test instanceof ShipAPI) {
79 ShipAPI target = (ShipAPI) test;
80 ship.setShipTarget(target);
81 }
82 }
83
84
85 public StatusData getStatusData(int index, State state, float effectLevel) {
86 if (effectLevel <= 0f) return null;
87 if (index == 0) {
88 return new StatusData("firing fragments", false);
89 } else if (index == 1) {
90 return new StatusData("" + (int)FRAGMENT_RANGE_MULT + "x fragment range", false);
91 }
92 return null;
93 }
94
95 @Override
96 public float getCurrentUsefulnessLevel(ShipAPI overseer, ShipAPI ship) {
97 if (ship.getSystem().isActive() || ship.getSystem().isChargedown() ||
98 ship.getSystem().isChargeup() || ship.getSystem().isCoolingDown()) {
99 return 0f;
100 }
101
102 Object test = ship.getAIFlags().getCustom(AIFlags.MANEUVER_TARGET);
103 if (test instanceof ShipAPI) {
104 ShipAPI target = (ShipAPI) test;
105
106 float dist = Misc.getDistance(ship.getLocation(), target.getLocation());
107 dist -= ship.getCollisionRadius() + target.getCollisionRadius();
108
110 if (dist < range * 0.8f && dist < MAX_VOLLEY_RANGE) {
111 float distToOverseer = Misc.getDistance(ship.getLocation(), overseer.getLocation());
112 distToOverseer -= ship.getCollisionRadius() + overseer.getCollisionRadius();
113 float overseerDistFactor = 0f;
114 if (distToOverseer < 1000f) {
115 float min = 500f;
116 overseerDistFactor = (1f - Math.max(0f, distToOverseer - min) / (1000f - min)) * 0.25f;
117 }
118 return Math.min(1f, 0.5f + Math.min(0.5f, ship.getFluxLevel() * 1f) + overseerDistFactor);
119 }
120 }
121
122 return 0f;
123 }
124
125
126 public static float getMinFragmentWeaponRange(ShipAPI ship) {
127 float min = Float.MAX_VALUE;
128 boolean found = false;
129 for (WeaponAPI w : ship.getAllWeapons()) {
130 if (w.isDecorative()) continue;
131 if (!w.hasAIHint(AIHints.PD) &&
132 !w.hasAIHint(AIHints.NO_MANUAL_FIRE) &&
133 w.getSpec().hasTag(Tags.FRAGMENT)) {
134 min = Math.min(min, w.getRange());
135 found = true;
136 }
137 }
138 if (!found) min = 0;
139
140 return min;
141 }
142
143 @Override
144 public float getWeaponRangePercentMod(ShipAPI ship, WeaponAPI weapon) {
145 return 0;
146 }
147
148 @Override
149 public float getWeaponRangeMultMod(ShipAPI ship, WeaponAPI weapon) {
150 if (!weapon.hasAIHint(AIHints.PD) &&
151 !weapon.hasAIHint(AIHints.NO_MANUAL_FIRE) &&
152 weapon.getSpec().hasTag(Tags.FRAGMENT)) {
153 return FRAGMENT_RANGE_MULT;
154 }
155 return 1f;
156 }
157
158 @Override
159 public float getWeaponRangeFlatMod(ShipAPI ship, WeaponAPI weapon) {
160 return 0;
161 }
162
163}
164
165
166
167
168
169
170
171
void modifyMult(String source, float value)
static final String FRAGMENT_SWARM_RESPAWN_RATE_MULT
Definition Stats.java:151
void applyImpl(ShipAPI ship, MutableShipStatsAPI stats, String id, State state, float effectLevel)
StatusData getStatusData(int index, State state, float effectLevel)
static Color setAlpha(Color color, int alpha)
Definition Misc.java:1316
static float getDistance(SectorEntityToken from, SectorEntityToken to)
Definition Misc.java:599
void removeListenerOfClass(Class<?> c)
void addListener(Object listener)
boolean hasListenerOfClass(Class<?> c)
List< WeaponAPI > getAllWeapons()
List< WeaponGroupAPI > getWeaponGroupsCopy()