29 public static class PhaseAnchorScript
implements AdvanceableListener, HullDamageAboutToBeTakenListener {
31 public boolean emergencyDive =
false;
32 public float diveProgress = 0f;
33 public FaderUtil diveFader =
new FaderUtil(1f, 1f);
34 public PhaseAnchorScript(ShipAPI ship) {
38 public boolean notifyAboutToTakeHullDamage(Object param, ShipAPI ship, Vector2f point,
float damageAmount) {
42 String key =
"phaseAnchor_canDive";
45 if (ship.getFleetMember() !=
null) {
46 depCost = ship.getFleetMember().getDeployCost();
49 canDive &= ship.getCurrentCR() >= crLoss;
51 float hull = ship.getHitpoints();
52 if (damageAmount >= hull && canDive) {
53 ship.setHitpoints(1f);
56 if (ship.getFleetMember() !=
null) {
57 ship.getFleetMember().getRepairTracker().applyCREvent(-crLoss,
"Emergency phase dive");
63 if (!ship.isPhased()) {
76 public void advance(
float amount) {
77 String
id =
"phase_anchor_modifier";
79 Color c = ship.getPhaseCloak().getSpecAPI().getEffectColor2();
80 c = Misc.setAlpha(c, 255);
81 c = Misc.interpolateColor(c, Color.white, 0.5f);
83 if (diveProgress == 0f) {
84 if (ship.getFluxTracker().showFloaty()) {
85 float timeMult = ship.getMutableStats().getTimeMult().getModifiedValue();
88 NeuralLinkScript.getFloatySize(ship), c, ship, 16f * timeMult, 3.2f/timeMult, 1f/timeMult, 0f, 0f,
93 diveFader.advance(amount);
94 ship.setRetreating(
true,
false);
96 ship.blockCommandForOneFrame(ShipCommand.USE_SYSTEM);
97 diveProgress += amount * ship.getPhaseCloak().getChargeUpDur();
98 float curr = ship.getExtraAlphaMult();
99 ship.getPhaseCloak().forceState(SystemState.IN, Math.min(1f, Math.max(curr, diveProgress)));
100 ship.getMutableStats().getHullDamageTakenMult().modifyMult(
id, 0f);
102 if (diveProgress >= 1f) {
103 if (diveFader.isIdle()) {
107 diveFader.advance(amount);
108 float b = diveFader.getBrightness();
109 ship.setExtraAlphaMult2(b);
111 float r = ship.getCollisionRadius() * 5f;
112 ship.setJitter(
this, c, b, 20, r * (1f - b));
114 if (diveFader.isFadedOut()) {
115 ship.getLocation().set(0, -1000000f);
121 boolean phased = ship.isPhased();
122 if (ship.getPhaseCloak() !=
null && ship.getPhaseCloak().isChargedown()) {
126 MutableShipStatsAPI stats = ship.getMutableStats();
140 stats.getFluxDissipation().unmodifyMult(
id);
141 stats.getBallisticRoFMult().unmodifyMult(
id);
142 stats.getEnergyRoFMult().unmodifyMult(
id);
143 stats.getMissileRoFMult().unmodifyMult(
id);
144 stats.getBallisticAmmoRegenMult().unmodifyMult(
id);
145 stats.getEnergyAmmoRegenMult().unmodifyMult(
id);
146 stats.getMissileAmmoRegenMult().unmodifyMult(
id);
155 ship.addListener(
new PhaseAnchorScript(ship));
159 stats.getPhaseCloakActivationCostBonus().modifyMult(
id, 0f);
163 if (index == 0)
return "zero";
184 if (ship.getVariant().hasHullMod(HullMods.ADAPTIVE_COILS))
return false;
185 return ship.getHullSpec().isPhase();
190 if (ship.getVariant().hasHullMod(HullMods.ADAPTIVE_COILS)) {
191 return "Incompatible with Adaptive Phase Coils";
193 if (!ship.getHullSpec().isPhase()) {
194 return "Can only be installed on phase ships";
196 return super.getUnapplicableReason(ship);