1package com.fs.starfarer.api.impl.campaign.intel.inspection;
4import java.util.ArrayList;
7import com.fs.starfarer.api.Global;
8import com.fs.starfarer.api.campaign.CampaignFleetAPI;
9import com.fs.starfarer.api.campaign.CargoAPI;
10import com.fs.starfarer.api.campaign.SectorEntityToken;
11import com.fs.starfarer.api.campaign.ai.CampaignFleetAIAPI.ActionType;
12import com.fs.starfarer.api.campaign.econ.CommoditySpecAPI;
13import com.fs.starfarer.api.campaign.econ.Industry;
14import com.fs.starfarer.api.campaign.econ.MarketAPI;
15import com.fs.starfarer.api.characters.PersonAPI;
16import com.fs.starfarer.api.impl.campaign.MilitaryResponseScript;
17import com.fs.starfarer.api.impl.campaign.MilitaryResponseScript.MilitaryResponseParams;
18import com.fs.starfarer.api.impl.campaign.command.WarSimScript;
19import com.fs.starfarer.api.impl.campaign.econ.impl.OrbitalStation;
20import com.fs.starfarer.api.impl.campaign.fleets.RouteManager;
21import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteData;
22import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteSegment;
23import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
24import com.fs.starfarer.api.impl.campaign.intel.inspection.HegemonyInspectionIntel.AntiInspectionOrders;
25import com.fs.starfarer.api.impl.campaign.intel.inspection.HegemonyInspectionIntel.HegemonyInspectionOutcome;
26import com.fs.starfarer.api.impl.campaign.intel.raid.ActionStage;
27import com.fs.starfarer.api.impl.campaign.intel.raid.RaidIntel.RaidStageStatus;
28import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseAssignmentAI.FleetActionDelegate;
29import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.MarketCMD;
30import com.fs.starfarer.api.ui.TooltipMakerAPI;
31import com.fs.starfarer.api.util.Misc;
33public class HIActionStage extends ActionStage implements FleetActionDelegate {
40 protected List<MilitaryResponseScript>
scripts =
new ArrayList<MilitaryResponseScript>();
50 if (intel.
getOrders() == AntiInspectionOrders.RESIST) {
60 super.advance(amount);
62 float days = Misc.getDays(amount);
73 float duration = 100f;
75 MilitaryResponseParams params =
new MilitaryResponseParams(ActionType.HOSTILE,
82 target.getContainingLocation().addScript(script);
85 MilitaryResponseParams defParams =
new MilitaryResponseParams(ActionType.HOSTILE,
92 target.getContainingLocation().addScript(defScript);
112 abortIfNeededBasedOnFP(
true);
113 if (status != RaidStageStatus.ONGOING)
return;
115 boolean inSpawnRange = RouteManager.isPlayerInSpawnRange(
target.getPrimaryEntity());
122 status = RaidStageStatus.FAILURE;
124 giveReturnOrdersToStragglers(getRoutes());
131 return "performing inspection of " + market.getName();
135 return "moving to inspect " + market.getName();
138 public void performRaid(CampaignFleetAPI fleet, MarketAPI market) {
141 if (market ==
null) {
147 status = RaidStageStatus.SUCCESS;
148 boolean hostile = market.getFaction().isHostileTo(intel.getFaction());
149 AntiInspectionOrders orders = intel.
getOrders();
151 if (hostile || orders == AntiInspectionOrders.RESIST) {
154 float str = intel.getAssembleStage().getOrigSpawnFP() * 3f;
155 if (fleet !=
null) str = MarketCMD.getRaidStr(fleet);
157 float re = MarketCMD.getRaidEffectiveness(market, str);
158 MarketCMD.applyRaidStabiltyPenalty(market,
159 Misc.ucFirst(intel.getFaction().getPersonNamePrefix()) +
" inspection", re);
160 Misc.setFlagWithReason(market.getMemoryWithoutUpdate(), MemFlags.RECENTLY_RAIDED,
161 intel.getFaction().getId(),
true, 30f);
162 Misc.setRaidedTimestamp(market);
164 }
else if (orders == AntiInspectionOrders.BRIBE) {
165 intel.
setOutcome(HegemonyInspectionOutcome.BRIBED);
166 }
else if (orders == AntiInspectionOrders.COMPLY) {
179 if (status == RaidStageStatus.SUCCESS) {
183 giveReturnOrdersToStragglers(getRoutes());
191 AntiInspectionOrders orders = intel.
getOrders();
193 boolean resist = orders == AntiInspectionOrders.RESIST;
204 for (String
id : found) {
206 valFound += spec.getBasePrice();
209 fleet.getCargo().addCommodity(
id, 1);
212 for (String
id : expected) {
214 valExpected += spec.getBasePrice();
217 if (valExpected < 30000) {
222 if (!resist && valExpected > valFound * 1.25f) {
223 intel.
setOutcome(HegemonyInspectionOutcome.FOUND_EVIDENCE_NO_CORES);
224 for (Industry curr :
target.getIndustries()) {
225 curr.setDisrupted((intel.
getRandom().nextFloat() * 45f) + 15f);
229 intel.
setOutcome(HegemonyInspectionOutcome.CONFISCATE_CORES);
238 protected List<String>
removeCores(CampaignFleetAPI inspector,
boolean resist) {
243 float str = intel.getRaidFPAdjusted() / intel.getNumFleets() * Misc.FP_TO_GROUND_RAID_STR_APPROX_MULT;
244 if (inspector !=
null) str = MarketCMD.getRaidStr(inspector);
248 float re = MarketCMD.getRaidEffectiveness(
target, str);
250 List<String> result =
new ArrayList<String>();
251 for (Industry curr :
target.getIndustries()) {
252 String
id = curr.getAICoreId();
254 if (resist && intel.
getRandom().nextFloat() > re)
continue;
256 curr.setAICoreId(
null);
259 PersonAPI admin =
target.getAdmin();
260 if (admin.isAICore()) {
261 if (!resist || intel.
getRandom().nextFloat() < re) {
262 result.add(admin.getAICoreId());
266 target.reapplyIndustries();
269 for (String
id : result) {
273 CargoAPI cargo = Misc.getStorageCargo(
target);
275 for (String
id :
new ArrayList<String>(missing)) {
276 float qty = cargo.getCommodityQuantity(
id);
278 if (resist && intel.
getRandom().nextFloat() > re)
continue;
279 cargo.removeCommodity(
id, 1);
286 cargo = Misc.getLocalResourcesCargo(
target);
288 for (String
id :
new ArrayList<String>(missing)) {
289 float qty = cargo.getCommodityQuantity(
id);
291 if (resist && intel.
getRandom().nextFloat() > re)
continue;
292 cargo.removeCommodity(
id, 1);
304 float str = WarSimScript.getFactionStrength(intel.getFaction(),
target.getStarSystem());
306 float enemyStr = WarSimScript.getEnemyStrength(intel.getFaction(),
target.getStarSystem(),
true);
309 boolean hostile =
target.getFaction().isHostileTo(intel.getFaction());
314 float defensiveStr = enemyStr + WarSimScript.getStationStrength(
target.getFaction(),
316 if (hostile && defensiveStr >= str) {
317 status = RaidStageStatus.FAILURE;
319 giveReturnOrdersToStragglers(getRoutes());
325 Industry station = Misc.getStationIndustry(
target);
326 if (station !=
null) {
327 OrbitalStation.disrupt(station);
339 boolean hostile =
target.getFaction().isHostileTo(intel.getFaction());
343 if (!hostile && orders == AntiInspectionOrders.RESIST) {
354 List<RouteData> routes = RouteManager.getInstance().getRoutesForSource(intel.getRouteSourceId());
356 for (RouteData route : routes) {
357 if (
target.getStarSystem() !=
null) {
360 route.addSegment(
new RouteSegment(1000f,
target.getPrimaryEntity()));
366 int curr = intel.getCurrentStage();
367 int index = intel.getStageIndex(
this);
369 Color h = Misc.getHighlightColor();
370 Color g = Misc.getGrayColor();
371 Color tc = Misc.getTextColor();
376 AntiInspectionOrders orders = intel.
getOrders();
377 boolean resist = orders == AntiInspectionOrders.RESIST;
379 if (status == RaidStageStatus.FAILURE) {
380 if (intel.
getOutcome() == HegemonyInspectionOutcome.COLONY_NO_LONGER_EXISTS) {
381 info.addPara(
"The inspection has been aborted.", opad);
383 info.addPara(
"The inspection task force has been defeated by the defenders of " +
384 target.getName() +
". The inspection is now over.", opad);
386 }
else if (status == RaidStageStatus.SUCCESS) {
389 cores.addCommodity(
id, 1);
395 info.addPara(
"The funds you've allocated have been used to resolve the inspection to the " +
396 "satisfaction of all parties.", opad);
398 case CONFISCATE_CORES:
399 if (!cores.isEmpty()) {
400 info.addPara(
"The inspectors have confiscated the following AI cores:", opad);
401 info.showCargo(cores, 10,
true, opad);
404 info.addPara(
"The inspectors have not been able to confiscate any AI cores.", opad);
406 info.addPara(
"The inspectors have not found any AI cores.", opad);
410 case FOUND_EVIDENCE_NO_CORES:
411 if (!cores.isEmpty()) {
412 info.addPara(
"The inspectors have confiscated the following AI cores:", opad);
413 info.showCargo(cores, 10,
true, opad);
415 info.addPara(
"The inspectors have not found any AI cores.", opad);
417 info.addPara(
"There was ample evidence of AI core use, spurring the inspectors to great zeal " +
418 "in trying to find them. Local operations have been significantly disrupted.", opad);
421 }
else if (curr == index) {
422 info.addPara(
"The inspection of " +
target.getName() +
" is currently under way.", opad);
427 public boolean canRaid(CampaignFleetAPI fleet, MarketAPI market) {
434 return "orbiting " + from.getName();
static SettingsAPI getSettings()
static FactoryAPI getFactory()
String getRaidApproachText(CampaignFleetAPI fleet, MarketAPI market)
void removeCoresAndApplyResult(CampaignFleetAPI fleet)
String getRaidDefaultText(CampaignFleetAPI fleet)
void showStageInfo(TooltipMakerAPI info)
static float REP_PENALTY_HID_STUFF
boolean isPlayerTargeted()
boolean canRaid(CampaignFleetAPI fleet, MarketAPI market)
List< String > removeCores(CampaignFleetAPI inspector, boolean resist)
HIActionStage(HegemonyInspectionIntel raid, MarketAPI target)
List< MilitaryResponseScript > scripts
void advance(float amount)
List< String > getCoresRemoved()
void performRaid(CampaignFleetAPI fleet, MarketAPI market)
String getRaidInSystemText(CampaignFleetAPI fleet)
String getRaidPrepText(CampaignFleetAPI fleet, SectorEntityToken from)
static float REP_PENALTY_NORMAL
String getRaidActionText(CampaignFleetAPI fleet, MarketAPI market)
List< String > coresRemoved
void applyRepPenalty(float delta)
AntiInspectionOrders getOrders()
HegemonyInspectionOutcome getOutcome()
void setOutcome(HegemonyInspectionOutcome outcome)
List< String > getExpectedCores()
CargoAPI createCargo(boolean unlimitedStacks)
CommoditySpecAPI getCommoditySpec(String commodityId)