27 public static final String
BONUS_ID =
"coord_maneuvers_bonus";
29 private CombatEngineAPI engine;
30 public void init(CombatEngineAPI engine) {
34 private ShipAPI prevPlayerShip =
null;
35 private int skipFrames = 0;
36 private Set<CombatFleetManagerAPI> needsCleanup =
new HashSet<CombatFleetManagerAPI>();
37 public void advance(
float amount, List<InputEventAPI> events) {
38 if (engine ==
null)
return;
39 if (engine.isPaused())
return;
44 ShipAPI playerShip = engine.getPlayerShip();
45 if (playerShip != prevPlayerShip) {
46 prevPlayerShip = playerShip;
55 updateForSide(engine.getFleetManager(0));
56 updateForSide(engine.getFleetManager(1));
70 ShipAPI from = engine.getShipPlayerIsTransferringCommandFrom();
71 String
id = SupportDoctrine.SUPPORT_DOCTRINE_DP_REDUCTION_ID +
"_reverse";
74 if (bonus !=
null && bonus.value != 0) {
76 from.getMutableStats().getDynamic().getMod(Stats.DEPLOYMENT_POINTS_MOD).modifyFlat(
id, -bonus.value);
77 if (from.getFleetMember() !=
null) {
78 from.getFleetMember().getStats().getDynamic().getMod(Stats.DEPLOYMENT_POINTS_MOD).modifyFlat(
id, -bonus.value);
82 undoDPMod.getMutableStats().getDynamic().getMod(Stats.DEPLOYMENT_POINTS_MOD).unmodifyFlat(
id);
84 undoDPMod.getFleetMember().getStats().getDynamic().getMod(Stats.DEPLOYMENT_POINTS_MOD).unmodifyFlat(
id);
92 private void updateForSide(CombatFleetManagerAPI manager) {
102 for (PersonAPI commander : manager.getAllFleetCommanders()) {
103 max = Math.max(max,
BASE_MAXIMUM + commander.getStats().getDynamic().getValue(Stats.COORDINATED_MANEUVERS_MAX, 0f));
111 boolean buoysOnly =
true;
113 List<DeployedFleetMemberAPI> deployed = manager.getDeployedCopyDFM();
114 for (DeployedFleetMemberAPI member : deployed) {
115 if (member.isFighterWing())
continue;
116 if (member.isStationModule())
continue;
118 float curr = member.getShip().getMutableStats().getDynamic().getValue(Stats.COORDINATED_MANEUVERS_FLAT, 0f);
122 if (total > 0) buoysOnly =
false;
125 for (BattleObjectiveAPI obj : engine.getObjectives()) {
126 if (obj.getOwner() == manager.getOwner() && BattleObjectives.NAV_BUOY.equals(obj.getType())) {
140 boolean includeSelf =
false;
142 for (DeployedFleetMemberAPI member : deployed) {
143 if (member.isFighterWing())
continue;
144 if (member.getShip() ==
null)
continue;
146 float curr = member.getShip().getMutableStats().getDynamic().getValue(Stats.COORDINATED_MANEUVERS_FLAT, 0f);
147 if (includeSelf) curr = 0f;
149 float bonus = Math.min(max, Math.max(0f, total - curr));
150 member.getShip().getMutableStats().getMaxSpeed().modifyPercent(
BONUS_ID, bonus);
153 needsCleanup.add(manager);
156 if (manager.getOwner() == engine.getPlayerShip().getOwner()) {
159 float curr = engine.getPlayerShip().getMutableStats().getDynamic().getValue(Stats.COORDINATED_MANEUVERS_FLAT, 0f);
160 if (includeSelf) curr = 0f;
162 float bonus = Math.min(max, Math.max(0f, total - curr));
164 String title =
"Coordinated Maneuvers:" +
" " + (int) Math.min(max, total) +
"%";
166 String data =
"+" + (int)bonus +
"% top speed";
171 title +=
" (" + numBuoys +
")";
173 data =
"+" + (int)bonus +
"% top speed";
175 String icon = Global.getSettings().getSpriteName(
"ui",
"icon_tactical_coordinated_maneuvers");
176 engine.maintainStatusForPlayerShip(
KEY_STATUS, icon,
183 if (needsCleanup.contains(manager)) {
184 needsCleanup.remove(manager);
185 List<DeployedFleetMemberAPI> deployed = manager.getDeployedCopyDFM();
186 for (DeployedFleetMemberAPI member : deployed) {
187 if (member.isFighterWing())
continue;
188 if (member.getShip() ==
null)
continue;
189 member.getShip().getMutableStats().getMaxSpeed().unmodify(
BONUS_ID);
197 List<DeployedFleetMemberAPI> deployed = manager.getDeployedCopyDFM();
198 for (DeployedFleetMemberAPI member : deployed) {
199 if (member.isFighterWing())
continue;
200 if (member.isStationModule())
continue;
201 if (member.getMember() ==
null)
continue;
204 PersonAPI fc = member.getMember().getFleetCommander();
205 if (fc ==
null) fc = member.getMember().getFleetCommanderForStats();
206 ShipAPI ship = member.getShip();
208 if (ship ==
null)
continue;
209 if (fc ==
null)
continue;
212 boolean hasFC =
false;
214 String
id =
"fc_zf_bonus";
216 boolean hasZF = ship.isEngineBoostActive();
217 if (ship.areAnyEnemiesInRange()) {
223 boolean applyAccelAndTurnModifiers = !ship.areAnyEnemiesInRange() && hasZF;
224 if (applyAccelAndTurnModifiers) {
230 ship.getMutableStats().getAcceleration().unmodifyFlat(
id);
231 ship.getMutableStats().getDeceleration().unmodifyFlat(
id);
232 ship.getMutableStats().getMaxTurnRate().unmodifyFlat(
id);
233 ship.getMutableStats().getTurnAcceleration().unmodifyFlat(
id);