1package com.fs.starfarer.api.impl.combat;
6import com.fs.starfarer.api.Global;
7import com.fs.starfarer.api.combat.BaseEveryFrameCombatPlugin;
8import com.fs.starfarer.api.combat.MutableShipStatsAPI;
9import com.fs.starfarer.api.combat.ShipAPI;
10import com.fs.starfarer.api.combat.ShipAPI.HullSize;
11import com.fs.starfarer.api.combat.ShipSystemAPI;
12import com.fs.starfarer.api.combat.ShipSystemAPI.SystemState;
13import com.fs.starfarer.api.combat.ShipwideAIFlags.AIFlags;
14import com.fs.starfarer.api.combat.WeaponAPI;
15import com.fs.starfarer.api.combat.WeaponAPI.WeaponType;
16import com.fs.starfarer.api.input.InputEventAPI;
17import com.fs.starfarer.api.util.Misc;
28 public static final Color
JITTER_COLOR =
new Color(255,155,255,75);
32 public void apply(MutableShipStatsAPI stats, String
id, State state,
float effectLevel) {
35 if (stats.getEntity() instanceof ShipAPI) {
36 ship = (ShipAPI) stats.getEntity();
45 float jitterLevel = effectLevel;
46 if (state == State.OUT) {
47 jitterLevel *= jitterLevel;
49 float maxRangeBonus = 50f;
51 float jitterRangeBonus = jitterLevel * maxRangeBonus;
52 if (state == State.OUT) {
56 ship.setJitterUnder(
this,
JITTER_UNDER_COLOR, jitterLevel, 21, 0f, 3f + jitterRangeBonus);
58 ship.setJitter(
this,
JITTER_COLOR, jitterLevel, 4, 0f, 0 + jitterRangeBonus);
60 String targetKey = ship.getId() +
"_acausal_target";
62 if (state == State.IN) {
63 if (foundTarget ==
null) {
69 }
else if (effectLevel >= 1) {
70 if (foundTarget instanceof ShipAPI) {
71 ShipAPI target = (ShipAPI) foundTarget;
72 if (target.getFluxTracker().isOverloadedOrVenting()) target = ship;
75 }
else if (state == State.OUT && foundTarget !=
null) {
81 public void unapply(MutableShipStatsAPI stats, String
id) {
82 stats.getEnergyWeaponDamageMult().unmodify(
id);
88 ShipAPI target = ship.getShipTarget();
89 if (ship.getShipAI() !=
null && ship.getAIFlags().hasFlag(AIFlags.TARGET_FOR_SHIP_SYSTEM)){
90 target = (ShipAPI) ship.getAIFlags().getCustom(AIFlags.TARGET_FOR_SHIP_SYSTEM);
94 float dist = Misc.getDistance(ship.getLocation(), target.getLocation());
95 float radSum = ship.getCollisionRadius() + target.getCollisionRadius();
96 if (dist > range + radSum) target =
null;
98 if (target ==
null || target.getOwner() == ship.getOwner()) {
100 target = Misc.findClosestShipEnemyOf(ship, ship.getMouseTarget(), HullSize.FIGHTER, range,
true);
102 Object test = ship.getAIFlags().getCustom(AIFlags.MANEUVER_TARGET);
103 if (test instanceof ShipAPI) {
104 target = (ShipAPI) test;
105 float dist = Misc.getDistance(ship.getLocation(), target.getLocation());
106 float radSum = ship.getCollisionRadius() + target.getCollisionRadius();
107 if (dist > range + radSum) target =
null;
111 if (target ==
null) {
112 target = Misc.findClosestShipEnemyOf(ship, ship.getLocation(), HullSize.FIGHTER, range,
true);
115 if (target ==
null || target.getFluxTracker().isOverloadedOrVenting()) target = ship;
129 for (WeaponAPI w : ship.getAllWeapons()) {
130 if (w.getType() == WeaponType.BALLISTIC || w.getType() == WeaponType.ENERGY) {
131 float curr = w.getRange();
132 if (curr > range) range = curr;
141 if (target.getFluxTracker().isOverloadedOrVenting()) {
144 if (target == ship)
return;
147 target.getFluxTracker().beginOverloadWithTotalBaseDuration(
DISRUPTION_DUR);
150 if (target.getFluxTracker().showFloaty() ||
153 target.getFluxTracker().playOverloadSound();
154 target.getFluxTracker().showOverloadFloatyIfNeeded(
"System Disruption!",
OVERLOAD_COLOR, 4f,
true);
159 public void advance(
float amount, List<InputEventAPI> events) {
160 if (!target.getFluxTracker().isOverloadedOrVenting()) {
161 target.resetOverloadColor();
168 public StatusData
getStatusData(
int index, State state,
float effectLevel) {
171 if (index == 0 && percent > 0) {
172 return new StatusData((
int)percent +
"% less energy damage",
false);
180 if (system.isOutOfAmmo())
return null;
181 if (system.getState() != SystemState.IDLE)
return null;
184 if (target !=
null && target != ship) {
187 if ((target ==
null || target == ship) && ship.getShipTarget() !=
null) {
188 return "OUT OF RANGE";
196 public boolean isUsable(ShipSystemAPI system, ShipAPI ship) {
198 return target !=
null && target != ship;
static CombatEngineAPI getCombatEngine()
boolean isUsable(ShipSystemAPI system, ShipAPI ship)
StatusData getStatusData(int index, State state, float effectLevel)
void applyEffectToTarget(final ShipAPI ship, final ShipAPI target)
void unapply(MutableShipStatsAPI stats, String id)
static final Color JITTER_COLOR
static float getMaxRange(ShipAPI ship)
void apply(MutableShipStatsAPI stats, String id, State state, float effectLevel)
static float DISRUPTION_DUR
static final Color OVERLOAD_COLOR
static float ENERGY_DAM_PENALTY_MULT
static final Color JITTER_UNDER_COLOR
String getInfoText(ShipSystemAPI system, ShipAPI ship)
ShipAPI findTarget(ShipAPI ship)
static float MIN_DISRUPTION_RANGE