1package com.fs.starfarer.api.impl.campaign.intel.punitive;
4import java.util.ArrayList;
7import com.fs.starfarer.api.Global;
8import com.fs.starfarer.api.campaign.CampaignFleetAPI;
9import com.fs.starfarer.api.campaign.SectorEntityToken;
10import com.fs.starfarer.api.campaign.ai.CampaignFleetAIAPI.ActionType;
11import com.fs.starfarer.api.campaign.econ.Industry;
12import com.fs.starfarer.api.campaign.econ.MarketAPI;
13import com.fs.starfarer.api.impl.campaign.DebugFlags;
14import com.fs.starfarer.api.impl.campaign.MilitaryResponseScript;
15import com.fs.starfarer.api.impl.campaign.MilitaryResponseScript.MilitaryResponseParams;
16import com.fs.starfarer.api.impl.campaign.command.WarSimScript;
17import com.fs.starfarer.api.impl.campaign.econ.impl.OrbitalStation;
18import com.fs.starfarer.api.impl.campaign.fleets.RouteManager;
19import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteData;
20import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteSegment;
21import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
22import com.fs.starfarer.api.impl.campaign.intel.punitive.PunitiveExpeditionIntel.PunExOutcome;
23import com.fs.starfarer.api.impl.campaign.intel.punitive.PunitiveExpeditionManager.PunExGoal;
24import com.fs.starfarer.api.impl.campaign.intel.raid.ActionStage;
25import com.fs.starfarer.api.impl.campaign.intel.raid.RaidIntel.RaidStageStatus;
26import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseAssignmentAI.FleetActionDelegate;
27import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.MarketCMD;
28import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.MarketCMD.BombardType;
29import com.fs.starfarer.api.ui.TooltipMakerAPI;
30import com.fs.starfarer.api.util.Misc;
32public class PEActionStage extends ActionStage implements FleetActionDelegate {
36 protected List<MilitaryResponseScript>
scripts =
new ArrayList<MilitaryResponseScript>();
51 super.advance(amount);
53 float days = Misc.getDays(amount);
67 float duration = 100f;
69 MilitaryResponseParams params =
new MilitaryResponseParams(ActionType.HOSTILE,
70 "PE_" + Misc.genUID() +
target.getId(),
76 target.getContainingLocation().addScript(script);
79 MilitaryResponseParams defParams =
new MilitaryResponseParams(ActionType.HOSTILE,
80 "defPE_" + Misc.genUID() +
target.getId(),
86 target.getContainingLocation().addScript(defScript);
106 abortIfNeededBasedOnFP(
true);
107 if (status != RaidStageStatus.ONGOING)
return;
109 boolean inSpawnRange = RouteManager.isPlayerInSpawnRange(
target.getPrimaryEntity());
116 status = RaidStageStatus.FAILURE;
118 giveReturnOrdersToStragglers(getRoutes());
126 PunExGoal goal = intel.
getGoal();
127 if (goal == PunExGoal.BOMBARD) {
128 return "bombarding " + market.getName();
130 return "raiding " + market.getName();
135 PunExGoal goal = intel.
getGoal();
136 if (goal == PunExGoal.BOMBARD) {
137 return "moving in to bombard " + market.getName();
139 return "moving in to raid " + market.getName();
142 public void performRaid(CampaignFleetAPI fleet, MarketAPI market) {
146 PunExGoal goal = intel.
getGoal();
148 status = RaidStageStatus.SUCCESS;
150 if (goal == PunExGoal.BOMBARD) {
151 float cost = MarketCMD.getBombardmentCost(market, fleet);
153 float maxCost = intel.getRaidFP() / intel.getNumFleets() * Misc.FP_TO_BOMBARD_COST_APPROX_MULT;
155 maxCost = fleet.getCargo().getMaxFuel() * 0.25f;
158 if (cost <= maxCost) {
159 new MarketCMD(market.getPrimaryEntity()).doBombardment(intel.getFaction(), BombardType.SATURATION);
163 status = RaidStageStatus.FAILURE;
165 Misc.setFlagWithReason(market.getMemoryWithoutUpdate(), MemFlags.RECENTLY_BOMBARDED,
166 intel.getFaction().getId(),
true, 30f);
170 float str = intel.getRaidFPAdjusted() / intel.getNumFleets() * Misc.FP_TO_GROUND_RAID_STR_APPROX_MULT;
172 if (fleet !=
null) str = MarketCMD.getRaidStr(fleet);
178 boolean raidSuccess =
new MarketCMD(market.getPrimaryEntity()).doIndustryRaid(intel.getFaction(), str, intel.
targetIndustry, durMult);
184 status = RaidStageStatus.FAILURE;
186 Misc.setFlagWithReason(market.getMemoryWithoutUpdate(), MemFlags.RECENTLY_RAIDED,
187 intel.getFaction().getId(),
true, 30f);
188 Misc.setRaidedTimestamp(market);
199 if (status == RaidStageStatus.SUCCESS) {
203 giveReturnOrdersToStragglers(getRoutes());
210 float str = WarSimScript.getFactionStrength(intel.getFaction(),
target.getStarSystem());
211 float enemyStr = WarSimScript.getFactionStrength(
target.getFaction(),
target.getStarSystem());
213 float defensiveStr = enemyStr + WarSimScript.getStationStrength(
target.getFaction(),
215 if (defensiveStr >= str) {
216 status = RaidStageStatus.FAILURE;
218 giveReturnOrdersToStragglers(getRoutes());
223 intel.
setOutcome(PunExOutcome.TASK_FORCE_DEFEATED);
227 Industry station = Misc.getStationIndustry(
target);
228 if (station !=
null) {
229 OrbitalStation.disrupt(station);
243 List<RouteData> routes = RouteManager.getInstance().getRoutesForSource(intel.getRouteSourceId());
244 for (RouteData route : routes) {
245 if (
target.getStarSystem() !=
null) {
248 route.addSegment(
new RouteSegment(1000f,
target.getPrimaryEntity()));
254 int curr = intel.getCurrentStage();
255 int index = intel.getStageIndex(
this);
257 Color h = Misc.getHighlightColor();
258 Color g = Misc.getGrayColor();
259 Color tc = Misc.getTextColor();
263 if (curr < index)
return;
265 if (status == RaidStageStatus.ONGOING && curr == index) {
266 info.addPara(
"The expedition forces are currently in-system.", opad);
274 info.addPara(
"The ground defenses of " +
target.getName() +
" were sufficient to prevent bombardment.", opad);
277 info.addPara(
"The raiding forces have been repelled by the ground defenses of " +
target.getName() +
".", opad);
280 if (intel.
goal == PunExGoal.BOMBARD) {
281 if (!
target.isInEconomy()) {
282 info.addPara(
"The expeditionary force has successfully bombarded " +
target.getName() +
", destroying the colony outright.", opad);
284 info.addPara(
"The expeditionary force has successfully bombarded " +
target.getName() +
".", opad);
287 info.addPara(
"The expeditionary force has disrupted " +
292 case TASK_FORCE_DEFEATED:
293 info.addPara(
"The expeditionary force has been defeated by the defenders of " +
294 target.getName() +
".", opad);
296 case COLONY_NO_LONGER_EXISTS:
297 info.addPara(
"The expedition has been aborted.", opad);
301 }
else if (status == RaidStageStatus.SUCCESS) {
302 info.addPara(
"The expeditionary force has succeeded.", opad);
304 info.addPara(
"The expeditionary force has failed.", opad);
308 public boolean canRaid(CampaignFleetAPI fleet, MarketAPI market) {
315 return "orbiting " + from.getName();
static SettingsAPI getSettings()
static boolean PUNITIVE_EXPEDITION_DEBUG
static boolean FAST_RAIDS
boolean isPlayerTargeted()
void advance(float amount)
String getRaidApproachText(CampaignFleetAPI fleet, MarketAPI market)
String getRaidPrepText(CampaignFleetAPI fleet, SectorEntityToken from)
String getRaidDefaultText(CampaignFleetAPI fleet)
void showStageInfo(TooltipMakerAPI info)
List< MilitaryResponseScript > scripts
void performRaid(CampaignFleetAPI fleet, MarketAPI market)
PEActionStage(PunitiveExpeditionIntel raid, MarketAPI target)
String getRaidActionText(CampaignFleetAPI fleet, MarketAPI market)
boolean canRaid(CampaignFleetAPI fleet, MarketAPI market)
String getRaidInSystemText(CampaignFleetAPI fleet)
Industry getTargetIndustry()
void setOutcome(PunExOutcome outcome)
PunExOutcome getOutcome()
float getFloat(String key)