1package com.fs.starfarer.api.impl.campaign.intel.raid;
4import java.util.ArrayList;
5import java.util.HashSet;
9import com.fs.starfarer.api.campaign.CampaignFleetAPI;
10import com.fs.starfarer.api.campaign.FactionAPI;
11import com.fs.starfarer.api.campaign.SectorEntityToken;
12import com.fs.starfarer.api.campaign.StarSystemAPI;
13import com.fs.starfarer.api.campaign.ai.CampaignFleetAIAPI.ActionType;
14import com.fs.starfarer.api.campaign.econ.Industry;
15import com.fs.starfarer.api.campaign.econ.MarketAPI;
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.BaseIntelPlugin;
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.ui.TooltipMakerAPI;
29import com.fs.starfarer.api.util.Misc;
30import com.fs.starfarer.api.util.Pair;
31import com.fs.starfarer.api.util.WeightedRandomPicker;
35 public static class RaidActionSubStage {
36 public List<Pair<SectorEntityToken, Float>> targets =
new ArrayList<Pair<SectorEntityToken,Float>>();
37 public float duration = 30f;
43 protected List<MilitaryResponseScript>
scripts =
new ArrayList<MilitaryResponseScript>();
44 protected List<RaidActionSubStage>
steps =
new ArrayList<RaidActionSubStage>();
45 protected List<MarketAPI>
targets =
new ArrayList<MarketAPI>();
54 if (target.isPlayerOwned()) {
62 super.advance(amount);
70 RaidActionSubStage step =
steps.remove(0);
75 float duration = 100f;
78 MilitaryResponseParams params =
new MilitaryResponseParams(ActionType.HOSTILE,
79 "raid_" + curr.
one.getId(),
85 curr.
one.getContainingLocation().addScript(script);
88 MilitaryResponseParams defParams =
new MilitaryResponseParams(ActionType.HOSTILE,
89 "defRaid_" + curr.
one.getId(),
90 curr.
one.getFaction(),
95 curr.
one.getContainingLocation().addScript(defScript);
117 if (
status != RaidStageStatus.ONGOING)
return;
120 status = RaidStageStatus.FAILURE;
126 if (
steps.isEmpty()) {
133 boolean someUnraided =
false;
134 boolean someRaided =
false;
152 status = RaidStageStatus.SUCCESS;
158 status = RaidStageStatus.FAILURE;
168 List<MarketAPI>
targets =
new ArrayList<MarketAPI>();
189 for (RouteData route : routes) {
198 picker.
add(target, target.getSize() * target.getSize());
203 Set<String> seen =
new HashSet<String>();
205 if (seen.contains(market.getFactionId()))
continue;
206 seen.add(market.getFactionId());
209 if (str < 1) str = 1;
210 if (enemyStr < 1) enemyStr = 1;
212 boolean concurrent =
false;
214 if (str > enemyStr * 2 && (
float) Math.random() > 0.5f) {
217 if (str > enemyStr * 4) {
223 for (
int i = 0; i < numRaids && !picker.
isEmpty(); numRaids++) {
227 if (defensiveStr > str) {
231 RaidActionSubStage step =
new RaidActionSubStage();
232 step.duration = 20f + 10f * (float) Math.random();
237 step.duration += 10f + (float) Math.random() * 5f;
245 this.targets.add(target);
249 for (RaidActionSubStage step :
steps) {
253 RaidActionSubStage step =
new RaidActionSubStage();
254 boolean stationPresent =
false;
255 for (
int i = 0; i < numRaids && !picker.
isEmpty(); numRaids++) {
259 if (defensiveStr > str) {
266 stationPresent =
true;
273 this.targets.add(target);
278 step.duration = 20f + 10f * (float) Math.random();
279 if (stationPresent) {
280 step.duration += 10f + (float) Math.random() * 5f;
286 if (this.targets.isEmpty()) {
304 if (
status == RaidStageStatus.FAILURE) {
305 info.
addPara(
"The raiding forces have been defeated by the defenders of the " +
307 }
else if (
status == RaidStageStatus.SUCCESS) {
308 List<MarketAPI> raided =
new ArrayList<MarketAPI>();
318 if (!raided.isEmpty()) {
319 info.
addPara(
"The raiding forces have been successful in raiding the following colonies:", opad);
320 float initPad = opad;
326 }
else if (curr == index) {
327 info.
addPara(
"The raiding forces are currently operating in the " +
345 status = RaidStageStatus.FAILURE;
350 if (defensiveStr >= str) {
355 if (station !=
null) {
363 str -= defensiveStr * 0.5f;
364 status = RaidStageStatus.SUCCESS;
371 return "raiding " + market.
getName();
375 return "moving in to raid " + market.
getName();
385 float maxPenalty = 3f;
411 return "preparing for raid";
static float getFactionStrength(String factionId, StarSystemAPI system)
static float getStationStrength(FactionAPI faction, StarSystemAPI system, SectorEntityToken from)
static float getEnemyStrength(String factionId, StarSystemAPI system)
static void disrupt(Industry station)
static boolean isPlayerInSpawnRange(SectorEntityToken from)
List< RouteData > getRoutesForSource(String source)
static RouteManager getInstance()
static final String RECENTLY_RAIDED
static void addMarketToList(TooltipMakerAPI info, MarketAPI market, float pad)
void giveReturnOrdersToStragglers(List< RouteData > stragglers)
List< RouteData > getRoutes()
void abortIfNeededBasedOnFP(boolean giveReturnOrders)
PirateRaidActionStage(RaidIntel raid, StarSystemAPI system)
List< MilitaryResponseScript > scripts
String getRaidInSystemText(CampaignFleetAPI fleet)
String getRaidDefaultText(CampaignFleetAPI fleet)
void showStageInfo(TooltipMakerAPI info)
void performRaid(CampaignFleetAPI fleet, MarketAPI market)
List< RaidActionSubStage > steps
String getRaidActionText(CampaignFleetAPI fleet, MarketAPI market)
boolean canRaid(CampaignFleetAPI fleet, MarketAPI market)
List< MarketAPI > targets
void advance(float amount)
List< MarketAPI > getTargets()
boolean isPlayerTargeted()
String getRaidApproachText(CampaignFleetAPI fleet, MarketAPI market)
String getRaidPrepText(CampaignFleetAPI fleet, SectorEntityToken from)
String getRouteSourceId()
int getStageIndex(RaidStage stage)
StarSystemAPI getSystem()
float getRaidFPAdjusted()
void sendEnteredSystemUpdate()
void doGenericRaid(FactionAPI faction, float attackerStr)
static float getRaidStr(CampaignFleetAPI fleet)
static Color getTextColor()
static float FP_TO_GROUND_RAID_STR_APPROX_MULT
static List< MarketAPI > getMarketsInLocation(LocationAPI location, String factionId)
static Color getGrayColor()
static float getDays(float amount)
static boolean flagHasReason(MemoryAPI memory, String flagKey, String reason)
static Color getHighlightColor()
static Industry getStationIndustry(MarketAPI market)
boolean isHostileTo(FactionAPI other)
String getNameWithLowercaseType()
SectorEntityToken getCenter()
MemoryAPI getMemoryWithoutUpdate()
SectorEntityToken getPrimaryEntity()