1package com.fs.starfarer.api.impl.campaign.intel.punitive;
4import java.util.Random;
7import org.lwjgl.input.Keyboard;
8import org.lwjgl.util.vector.Vector2f;
10import com.fs.starfarer.api.Global;
11import com.fs.starfarer.api.campaign.CampaignFleetAPI;
12import com.fs.starfarer.api.campaign.FactionAPI;
13import com.fs.starfarer.api.campaign.ReputationActionResponsePlugin.ReputationAdjustmentResult;
14import com.fs.starfarer.api.campaign.SectorEntityToken;
15import com.fs.starfarer.api.campaign.econ.CommoditySpecAPI;
16import com.fs.starfarer.api.campaign.econ.Industry;
17import com.fs.starfarer.api.campaign.econ.MarketAPI;
18import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin;
19import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.CustomRepImpact;
20import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActionEnvelope;
21import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActions;
22import com.fs.starfarer.api.impl.campaign.DebugFlags;
23import com.fs.starfarer.api.impl.campaign.fleets.FleetFactoryV3;
24import com.fs.starfarer.api.impl.campaign.fleets.FleetParamsV3;
25import com.fs.starfarer.api.impl.campaign.fleets.RouteLocationCalculator;
26import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.OptionalFleetData;
27import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteData;
28import com.fs.starfarer.api.impl.campaign.ids.Factions;
29import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
30import com.fs.starfarer.api.impl.campaign.ids.Ranks;
31import com.fs.starfarer.api.impl.campaign.ids.Tags;
32import com.fs.starfarer.api.impl.campaign.intel.punitive.PunitiveExpeditionManager.PunExData;
33import com.fs.starfarer.api.impl.campaign.intel.punitive.PunitiveExpeditionManager.PunExGoal;
34import com.fs.starfarer.api.impl.campaign.intel.punitive.PunitiveExpeditionManager.PunExReason;
35import com.fs.starfarer.api.impl.campaign.intel.punitive.PunitiveExpeditionManager.PunExType;
36import com.fs.starfarer.api.impl.campaign.intel.raid.RaidAssignmentAI;
37import com.fs.starfarer.api.impl.campaign.intel.raid.RaidIntel;
38import com.fs.starfarer.api.impl.campaign.intel.raid.RaidIntel.RaidDelegate;
39import com.fs.starfarer.api.impl.campaign.procgen.themes.RouteFleetAssignmentAI;
40import com.fs.starfarer.api.ui.Alignment;
41import com.fs.starfarer.api.ui.ButtonAPI;
42import com.fs.starfarer.api.ui.IntelUIAPI;
43import com.fs.starfarer.api.ui.LabelAPI;
44import com.fs.starfarer.api.ui.SectorMapAPI;
45import com.fs.starfarer.api.ui.TooltipMakerAPI;
46import com.fs.starfarer.api.util.Misc;
53 public static enum PunExOutcome {
55 COLONY_NO_LONGER_EXISTS,
71 protected Random
random =
new Random();
78 float expeditionFP,
float organizeDuration,
92 if (gather ==
null || raidJump ==
null) {
98 float orgDur = organizeDuration;
103 float successMult = 0.5f;
107 assemble.
setAbortFP(expeditionFP * successMult);
112 travel.
setAbortFP(expeditionFP * successMult);
129 protected transient ReputationAdjustmentResult
repResult =
null;
131 CustomRepImpact impact =
new CustomRepImpact();
134 new RepActionEnvelope(RepActions.CUSTOM,
135 impact,
null,
null,
false,
false),
165 super.advanceImpl(amount);
186 if (
outcome == PunExOutcome.AVERTED) {
187 return base +
" - Averted";
190 return base +
" - Failed";
193 return base +
" - Successful";
195 if (
outcome == PunExOutcome.RAID_FAIL ||
196 outcome == PunExOutcome.BOMBARD_FAIL ||
197 outcome == PunExOutcome.COLONY_NO_LONGER_EXISTS ||
198 outcome == PunExOutcome.TASK_FORCE_DEFEATED) {
199 return base +
" - Failed";
216 if (mode == ListInfoMode.IN_DESC) initPad = opad;
234 info.
addPara(
"Target: %s", initPad, tc,
237 info.
addPara(
"Arrived in-system", tc, initPad);
243 null,
null, info, tc, isUpdate, initPad);
251 if (
outcome == PunExOutcome.TASK_FORCE_DEFEATED) {
252 info.
addPara(
"Expeditionary force defeated", tc, initPad);
253 }
else if (
outcome == PunExOutcome.COLONY_NO_LONGER_EXISTS) {
254 info.
addPara(
"Expedition aborted", tc, initPad);
255 }
else if (
outcome == PunExOutcome.AVERTED) {
257 }
else if (
outcome == PunExOutcome.BOMBARD_FAIL) {
259 }
else if (
outcome == PunExOutcome.RAID_FAIL) {
261 }
else if (
outcome == PunExOutcome.SUCCESS) {
262 if (
goal == PunExGoal.BOMBARD) {
277 null,
null, info, tc, isUpdate, initPad);
283 info.
addPara(
"Target: %s", initPad, tc,
287 if (
goal == PunExGoal.BOMBARD) {
288 String goalStr =
"saturation bombardment";
295 info.
addPara(
"Estimated %s " + days +
" until arrival",
296 initPad, tc, h,
"" + (
int)Math.round(eta));
299 info.
addPara(
"Currently in-system", tc, initPad);
306 null,
null, info, tc, isUpdate, initPad);
313 for (RaidStage stage :
stages) {
324 super.createIntelInfo(info, mode);
335 String goalDesc =
"";
339 case RAID_PRODUCTION:
346 goalDesc =
"a saturation bombardment of the colony";
347 goalHL =
"saturation bombardment of the colony";
354 String fleets =
"fleets";
355 if (numFleets == 1) fleets =
"fleet";
359 " targeting %s with a " + strDesc +
" expeditionary force, projected to be comprised of " +
360 numFleets +
" " + fleets +
". " +
361 "Its likely goal is " + goalDesc +
".",
367 " targeting %s with an expeditionary force. " +
368 "Its likely goal is " + goalDesc +
".",
395 info.
addPara(
"The primary reason for the expedition is the colony's market share " +
396 "in the exports of " + spec.
getName() +
".", opad);
397 }
else if (
bestReason.type == PunExType.ANTI_FREE_PORT) {
398 info.
addPara(
"The primary reason for the expedition is the colony's \"free port\" " +
399 "status, and the concomitant export of illegal goods alongside it being a haven for " +
400 "various undesirables.", opad);
401 }
else if (
bestReason.type == PunExType.TERRITORIAL) {
402 info.
addPara(
"The primary reason for the expedition is the colony being established in " +
408 "expedition",
"expedition's");
414 for (RaidStage stage :
stages) {
415 stage.showStageInfo(info);
423 (
int)(width), 20f, opad * 2f);
440 "without an open declaration of war. Defeating the " +
463 super.sendUpdateIfPlayerHasIntel(
listInfoParam, onlyIfImportant, sendIfHidden);
470 Set<String> tags = super.getIntelTags(map);
481 outcome = PunExOutcome.COLONY_NO_LONGER_EXISTS;
483 outcome = PunExOutcome.TASK_FORCE_DEFEATED;
489 if (
outcome == PunExOutcome.SUCCESS) {
519 Random
random = route.getRandom();
524 if (fleet ==
null || fleet.
isEmpty())
return null;
529 fleet.
setFacing((
float) Math.random() * 360f);
541 OptionalFleetData extra = route.getExtra();
543 float combat = extra.fp;
544 float tanker = extra.fp * (0.1f +
random.nextFloat() * 0.05f);
545 float transport = extra.fp * (0.1f +
random.nextFloat() * 0.05f);
546 float freighter = 0f;
548 if (
goal == PunExGoal.BOMBARD) {
551 transport += tanker / 2f;
563 route ==
null ?
null : route.getQualityOverride(),
576 params.timestamp = route.getTimestamp();
581 if (fleet ==
null || fleet.
isEmpty())
return null;
614 return bestReason !=
null && bestReason.type == PunExType.TERRITORIAL;
622 return super.getMapLocation(map);
static SettingsAPI getSettings()
static SectorAPI getSector()
static void addAdjustmentMessage(float delta, FactionAPI faction, PersonAPI person, TextPanelAPI panel, TooltipMakerAPI info, Color tc, boolean withCurrent, float pad)
static boolean PUNITIVE_EXPEDITION_DEBUG
static boolean FAST_RAIDS
static CampaignFleetAPI createFleet(FleetParamsV3 params)
static JumpPointAPI findJumpPointToUse(CampaignFleetAPI fleet, SectorEntityToken from)
static final String CUSTOM_PIRATE_BEHAVIOR
static final String MEMORY_KEY_WAR_FLEET
static final String MEMORY_KEY_PIRATE
static final String MEMORY_KEY_RAIDER
static String POST_PATROL_COMMANDER
static String SPACE_COMMANDER
boolean isSendingUpdate()
void unindent(TooltipMakerAPI info)
transient Object listInfoParam
Object getListInfoParam()
Color getBulletColorForMode(ListInfoMode mode)
void setImportant(Boolean important)
static String getDaysString(float days)
void bullet(TooltipMakerAPI info)
void buttonPressConfirmed(Object buttonId, IntelUIAPI ui)
PunitiveExpeditionIntel(FactionAPI faction, MarketAPI from, MarketAPI target, float expeditionFP, float organizeDuration, PunExGoal goal, Industry targetIndustry, PunExReason bestReason)
void createIntelInfo(TooltipMakerAPI info, ListInfoMode mode)
SectorEntityToken getMapLocation(SectorMapAPI map)
static final String BUTTON_AVERT
void addInitialDescSection(TooltipMakerAPI info, float initPad)
CampaignFleetAPI createFleet(String factionId, RouteData route, MarketAPI market, Vector2f locInHyper, Random random)
PunExReason getBestReason()
Industry getTargetIndustry()
transient String targetOwner
void addBulletPoints(TooltipMakerAPI info, ListInfoMode mode)
void sendEnteredSystemUpdate()
Set< String > getIntelTags(SectorMapAPI map)
static final Object OUTCOME_UPDATE
RouteFleetAssignmentAI createAssignmentAI(CampaignFleetAPI fleet, RouteData route)
static final Object ENTERED_SYSTEM_UPDATE
void sendUpdateIfPlayerHasIntel(Object listInfoParam, boolean onlyIfImportant, boolean sendIfHidden)
void advanceImpl(float amount)
transient ReputationAdjustmentResult repResult
CampaignFleetAPI spawnFleet(RouteData route)
void createSmallDescription(TooltipMakerAPI info, float width, float height)
void setOutcome(PunExOutcome outcome)
PEActionStage getActionStage()
void notifyRaidEnded(RaidIntel raid, RaidStageStatus status)
FactionAPI getTargetFaction()
PunExOutcome getOutcome()
PunExData getDataFor(FactionAPI faction)
static PunitiveExpeditionManager getInstance()
void setSpawnFP(float spawnFP)
void addSource(MarketAPI source)
void setAbortFP(float abortFP)
static Object UPDATE_RETURNING
void addStage(RaidStage stage)
void addStandardStrengthComparisons(TooltipMakerAPI info, MarketAPI target, FactionAPI targetFaction, boolean withGround, boolean withBombard, String raid, String raids)
static Object UPDATE_FAILED
void forceFail(boolean withUpdate)
FactionAPI getFactionForUIColors()
int getStageIndex(RaidStage stage)
static Color getTextColor()
static String ucFirst(String str)
static Color getNegativeHighlightColor()
static Color getGrayColor()
static Color getHighlightColor()
static void makeHostile(CampaignFleetAPI fleet)
static void makeNoRepImpact(CampaignFleetAPI fleet, String reason)
CommoditySpecAPI getCommoditySpec(String commodityId)
void setLocation(float x, float y)
String getDisplayNameHasOrHave()
String getDisplayNameWithArticleWithoutArticle()
String getDisplayNameWithArticle()
boolean getCustomBoolean(String key)
String getPersonNamePrefix()
boolean isHostileTo(FactionAPI other)
String getDisplayNameIsOrAre()
void addEntity(SectorEntityToken entity)
ReputationAdjustmentResult adjustPlayerReputation(Object action, String factionId)
FactionAPI getPlayerFaction()
IntelManagerAPI getIntelManager()
void addScript(EveryFrameScript script)
void setFacing(float facing)
MemoryAPI getMemoryWithoutUpdate()
void addIntel(IntelInfoPlugin plugin)
LocationAPI getContainingLocation()
StarSystemAPI getStarSystem()
SectorEntityToken getPrimaryEntity()
void set(String key, Object value)
void setRankId(String rank)
void setPostId(String postId)
void showDialog(SectorEntityToken target, String trigger)
void setHighlight(int start, int end)
void setHighlightColors(Color ... colors)