1package com.fs.starfarer.api.impl.campaign;
5import com.fs.starfarer.api.EveryFrameScript;
6import com.fs.starfarer.api.Global;
7import com.fs.starfarer.api.campaign.CampaignFleetAPI;
8import com.fs.starfarer.api.campaign.FactionAPI;
9import com.fs.starfarer.api.campaign.FleetAssignment;
10import com.fs.starfarer.api.campaign.SectorEntityToken;
11import com.fs.starfarer.api.campaign.ai.CampaignFleetAIAPI.ActionType;
12import com.fs.starfarer.api.campaign.ai.FleetAssignmentDataAPI;
13import com.fs.starfarer.api.campaign.ai.ModularFleetAIAPI;
14import com.fs.starfarer.api.campaign.rules.MemoryAPI;
15import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
16import com.fs.starfarer.api.util.IntervalUtil;
17import com.fs.starfarer.api.util.Misc;
23 public static class MilitaryResponseParams {
24 public ActionType type;
25 public String responseReason;
26 public FactionAPI faction;
28 public SectorEntityToken actor;
29 public SectorEntityToken target;
30 public float responseFraction;
31 public float responseDuration;
32 public String travelText;
33 public String actionText;
35 public MilitaryResponseParams(ActionType type, String responseReason,
36 FactionAPI faction, SectorEntityToken target,
37 float responseFraction,
float responseDuration) {
39 this.responseReason = responseReason;
40 this.faction = faction;
42 this.responseFraction = responseFraction;
43 this.responseDuration = responseDuration;
50 protected IntervalUtil
tracker =
new IntervalUtil(0.05f, 0.15f);
51 protected MilitaryResponseParams
params;
73 if (
tracker.intervalElapsed()) {
80 if (
params.target.getContainingLocation() ==
null)
return;
84 List<CampaignFleetAPI> fleets =
params.target.getContainingLocation().getFleets();
85 for (CampaignFleetAPI fleet : fleets) {
91 if (fleet.getBattle() !=
null)
return true;
93 if (fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.FLEET_BUSY))
return true;
94 FleetAssignmentDataAPI curr = fleet.getCurrentAssignment();
95 if (curr !=
null && curr.getAssignment() == FleetAssignment.STANDING_DOWN)
return true;
97 MemoryAPI memory = fleet.getMemoryWithoutUpdate();
98 if (memory.getBoolean(MemFlags.FLEET_MILITARY_RESPONSE))
return true;
112 List<CampaignFleetAPI> fleets =
params.target.getContainingLocation().getFleets();
113 float potentialFP = 0;
114 float respondingFP = 0f;
116 float closestDist = Float.MAX_VALUE;
117 CampaignFleetAPI closestNonResponder =
null;
119 for (CampaignFleetAPI other : fleets) {
122 float fp = other.getFleetPoints();
133 float distOther = Misc.getDistance(
params.target, other);
134 if (distOther < closestDist) {
135 closestDist = distOther;
136 closestNonResponder = other;
144 if (potentialFP > 0 &&
145 respondingFP / potentialFP < fraction &&
146 closestNonResponder == fleet) {
152 protected void respond(CampaignFleetAPI fleet) {
159 Misc.setFlagWithReason(fleet.getMemoryWithoutUpdate(),
160 MemFlags.FLEET_MILITARY_RESPONSE,
params.responseReason,
true, (1.5f + (
float) Math.random()) * 0.2f);
162 fleet.addAssignmentAtStart(FleetAssignment.PATROL_SYSTEM,
params.target, 3f,
params.actionText,
null);
163 FleetAssignmentDataAPI curr = fleet.getCurrentAssignment();
168 float dist = Misc.getDistance(
params.target, fleet);
170 fleet.addAssignmentAtStart(FleetAssignment.GO_TO_LOCATION,
params.target, 3f,
params.travelText,
null);
172 curr = fleet.getCurrentAssignment();
182 Misc.setFlagWithReason(fleet.getMemoryWithoutUpdate(),
183 MemFlags.FLEET_MILITARY_RESPONSE,
params.responseReason,
false, 0f);
184 boolean firstOrbitPassive =
true;
185 for (FleetAssignmentDataAPI curr : fleet.getAI().getAssignmentsCopy()) {
187 fleet.getAI().removeAssignment(curr);
188 }
else if (curr.getAssignment() == FleetAssignment.ORBIT_PASSIVE && firstOrbitPassive) {
191 fleet.getAI().removeAssignment(curr);
192 firstOrbitPassive =
false;
198 return Misc.flagHasReason(fleet.getMemoryWithoutUpdate(), MemFlags.FLEET_MILITARY_RESPONSE,
params.responseReason);
202 if (fleet.getFaction() !=
params.faction)
return false;
203 if (fleet.getAI() ==
null)
return false;
204 if (fleet.isPlayerFleet())
return false;
205 if (fleet.isStationMode())
return false;
210 if (fleet.getAI() instanceof ModularFleetAIAPI) {
211 ModularFleetAIAPI ai = (ModularFleetAIAPI) fleet.getAI();
212 if (ai.getAssignmentModule().areAssignmentsFrozen())
return false;
215 if (fleet.getCurrentAssignment() !=
null &&
216 fleet.getCurrentAssignment().getAssignment() == FleetAssignment.GO_TO_LOCATION_AND_DESPAWN) {
220 MemoryAPI memory = fleet.getMemoryWithoutUpdate();
222 boolean patrol = memory.getBoolean(MemFlags.MEMORY_KEY_PATROL_FLEET);
223 boolean warFleet = memory.getBoolean(MemFlags.MEMORY_KEY_WAR_FLEET);
224 boolean pirate = memory.getBoolean(MemFlags.MEMORY_KEY_PIRATE);
225 boolean noMilitary = memory.getBoolean(MemFlags.FLEET_NO_MILITARY_RESPONSE);
226 if (!(patrol || warFleet || pirate) || noMilitary)
return false;
232 return "$mrs_" +
params.responseReason;
236 MemoryAPI memory =
params.faction.getMemoryWithoutUpdate();
239 float curr = memory.getFloat(key);
240 memory.set(key, curr +
params.responseFraction, 60f);
244 MemoryAPI memory =
params.faction.getMemoryWithoutUpdate();
247 float curr = memory.getFloat(key);
248 if (curr >
params.responseFraction) {
249 memory.set(key, Math.max(0, curr -
params.responseFraction), 60f);
256 MemoryAPI memory =
params.faction.getMemoryWithoutUpdate();
259 float curr = memory.getFloat(key);
260 if (curr <
params.responseFraction) curr =
params.responseFraction;
261 if (curr < 1) curr = 1;
static SectorAPI getSector()
void advance(float amount)
boolean isTemporarilyNotResponding(CampaignFleetAPI fleet)
MilitaryResponseParams getParams()
static String RESPONSE_ASSIGNMENT
boolean isResponding(CampaignFleetAPI fleet)
String getResponseTotalKey()
void setElapsed(float elapsed)
void addToResponseTotal()
MilitaryResponseParams params
void respond(CampaignFleetAPI fleet)
void removeFromResponseTotal()
void unrespond(CampaignFleetAPI fleet)
boolean couldRespond(CampaignFleetAPI fleet)
MilitaryResponseScript(MilitaryResponseParams params)
void seeIfFleetShouldRespond(CampaignFleetAPI fleet)