1package com.fs.starfarer.api.impl.campaign.intel.events;
4import java.util.LinkedHashSet;
6import java.util.Random;
9import org.lwjgl.util.vector.Vector2f;
11import com.fs.starfarer.api.Global;
12import com.fs.starfarer.api.campaign.BattleAPI;
13import com.fs.starfarer.api.campaign.CampaignEventListener.FleetDespawnReason;
14import com.fs.starfarer.api.campaign.CampaignFleetAPI;
15import com.fs.starfarer.api.campaign.CargoAPI;
16import com.fs.starfarer.api.campaign.InteractionDialogAPI;
17import com.fs.starfarer.api.campaign.StarSystemAPI;
18import com.fs.starfarer.api.campaign.comm.IntelInfoPlugin.ListInfoMode;
19import com.fs.starfarer.api.campaign.econ.Industry;
20import com.fs.starfarer.api.campaign.econ.MarketAPI;
21import com.fs.starfarer.api.campaign.listeners.ColonyPlayerHostileActListener;
22import com.fs.starfarer.api.campaign.listeners.FleetEventListener;
23import com.fs.starfarer.api.fleet.FleetMemberAPI;
24import com.fs.starfarer.api.impl.campaign.fleets.EconomyFleetAssignmentAI.EconomyRouteData;
25import com.fs.starfarer.api.impl.campaign.fleets.EconomyFleetRouteManager;
26import com.fs.starfarer.api.impl.campaign.fleets.RouteManager;
27import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteData;
28import com.fs.starfarer.api.impl.campaign.ids.Conditions;
29import com.fs.starfarer.api.impl.campaign.ids.Factions;
30import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
31import com.fs.starfarer.api.impl.campaign.ids.Industries;
32import com.fs.starfarer.api.impl.campaign.ids.Skills;
33import com.fs.starfarer.api.impl.campaign.ids.Strings;
34import com.fs.starfarer.api.impl.campaign.intel.events.BaseEventIntel.EventStageData;
35import com.fs.starfarer.api.impl.campaign.intel.events.HostileActivityEventIntel.HAERandomEventData;
36import com.fs.starfarer.api.impl.campaign.intel.events.HostileActivityEventIntel.Stage;
37import com.fs.starfarer.api.impl.campaign.intel.events.TriTachyonStandardActivityCause.CompetitorData;
38import com.fs.starfarer.api.impl.campaign.intel.events.ttcr.TTCRCommerceRaidersDestroyedFactor;
39import com.fs.starfarer.api.impl.campaign.intel.events.ttcr.TTCRIndustryDisruptedFactor;
40import com.fs.starfarer.api.impl.campaign.intel.events.ttcr.TTCRMercenariesDefeatedFactor;
41import com.fs.starfarer.api.impl.campaign.intel.events.ttcr.TTCRPoints;
42import com.fs.starfarer.api.impl.campaign.intel.events.ttcr.TTCRTradeFleetsDestroyedFactor;
43import com.fs.starfarer.api.impl.campaign.intel.events.ttcr.TriTachyonCommerceRaiding;
44import com.fs.starfarer.api.impl.campaign.intel.group.FGRaidAction.FGRaidType;
45import com.fs.starfarer.api.impl.campaign.intel.group.FleetGroupIntel;
46import com.fs.starfarer.api.impl.campaign.intel.group.FleetGroupIntel.FGIEventListener;
47import com.fs.starfarer.api.impl.campaign.intel.group.GenericRaidFGI.GenericRaidParams;
48import com.fs.starfarer.api.impl.campaign.intel.group.TTMercenaryAttack;
49import com.fs.starfarer.api.impl.campaign.missions.FleetCreatorMission;
50import com.fs.starfarer.api.impl.campaign.missions.FleetCreatorMission.FleetStyle;
51import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.ComplicationRepImpact;
52import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.FleetQuality;
53import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.MarketCMD.TempData;
54import com.fs.starfarer.api.ui.TooltipMakerAPI;
55import com.fs.starfarer.api.ui.TooltipMakerAPI.TooltipCreator;
56import com.fs.starfarer.api.util.CountingMap;
57import com.fs.starfarer.api.util.Misc;
58import com.fs.starfarer.api.util.TimeoutTracker;
61 implements FGIEventListener, FleetEventListener, ColonyPlayerHostileActListener {
126 return super.getProgress(
intel);
130 return "Tri-Tachyon Corporation";
134 return "Tri-Tachyon";
140 return Misc.getGrayColor();
142 return Global.
getSector().getFaction(Factions.TRITACHYON).getBaseUIColor();
147 public void createTooltip(TooltipMakerAPI tooltip,
boolean expanded, Object tooltipParam) {
149 tooltip.addPara(
"Your independent polity has become enough of a presence in the Sector to "
150 +
"start cutting into the profit margins of the Tri-Tachyon Corporation.", 0f);
152 tooltip.addPara(
"Independent-flagged commerce raiders - little more than sanctioned pirates - "
153 +
"have been sighted in your space, "
154 +
"attacking trade fleets regardless of their factional allegiance.", opad);
163 tooltip.addPara(
"You've dealt with the mercenary attack sent against you, and " +
164 "this has considerably cooled the enthusiasm for continued aggression. " +
165 "Commerce-raiding continues, but the event progress value is reduced by %s, "
166 +
"and no further large-scale attacks are likely to be mounted.", opad,
178 return Misc.getGrayColor();
180 return Global.
getSector().getFaction(Factions.TRITACHYON).getBaseUIColor();
189 public CampaignFleetAPI
createFleet(StarSystemAPI system, Random random) {
197 int difficulty = 4 + (int) Math.round(f * 4f);
199 FleetCreatorMission m =
new FleetCreatorMission(random);
202 Vector2f loc = system.getLocation();
203 String factionId = Factions.TRITACHYON;
204 if (random.nextFloat() < 0.5f) {
205 factionId = Factions.MERCENARY;
208 m.createQualityFleet(difficulty, factionId, loc);
210 if (difficulty <= 5) {
211 m.triggerSetFleetQuality(FleetQuality.SMOD_1);
212 }
else if (difficulty <= 7) {
213 m.triggerSetFleetQuality(FleetQuality.SMOD_2);
215 m.triggerSetFleetQuality(FleetQuality.SMOD_3);
218 m.triggerSetFleetFaction(Factions.INDEPENDENT);
219 m.triggerSetFleetType(FleetTypes.COMMERCE_RAIDERS);
221 m.triggerSetPirateFleet();
223 m.triggerMakeNonHostileToFaction(Factions.TRITACHYON);
224 m.triggerMakeHostileToAllTradeFleets();
225 m.triggerMakeEveryoneJoinBattleAgainst();
227 m.triggerMakeNonHostileToFaction(Factions.PIRATES);
228 m.triggerMakeNoRepImpact();
229 m.triggerFleetAllowLongPursuit();
231 m.triggerFleetAddCommanderSkill(Skills.COORDINATED_MANEUVERS, 1);
232 m.triggerFleetAddCommanderSkill(Skills.ELECTRONIC_WARFARE, 1);
240 if (Factions.MERCENARY.equals(factionId)) {
241 tugs = random.nextInt(3);
244 m.triggerFleetMakeFaster(
true, tugs,
true);
245 m.triggerSetFleetMaxShipSize(3);
248 CampaignFleetAPI fleet = m.createFleet();
257 ListInfoMode mode,
boolean isUpdate, Color tc,
float initPad) {
258 Color c =
Global.
getSector().getFaction(Factions.TRITACHYON).getBaseUIColor();
259 info.addPara(
"Impending Tri-Tachyon mercenary attack", initPad, tc, c,
"Tri-Tachyon");
263 ListInfoMode mode,
boolean isUpdate, Color tc,
float initPad) {
264 info.addPara(
"Tri-Tachyon mercenary attack averted", tc, initPad);
273 Color c =
Global.
getSector().getFaction(Factions.TRITACHYON).getBaseUIColor();
275 Color h = Misc.getHighlightColor();
276 info.addPara(
"You've received intel that the Tri-Tachyon Corporation is allocating funds to hire and "
277 +
"equip a mercenary company to raid and disrupt your industrial base.",
278 small, Misc.getNegativeHighlightColor(),
"raid and disrupt your industrial base");
280 info.addPara(
"If the mercenary attack is defeated, it will go a long way towards convincing "
281 +
"the Tri-Tachyon Corporation to abandon its anti-competitive efforts.",
283 opad, h,
"abandon its anti-competitive efforts");
285 stage.beginResetReqList(info,
true,
"crisis", opad);
286 info.addPara(
"The %s is convinced that its efforts are unprofitable", 0f, c,
"Tri-Tachyon Corporation");
287 stage.endResetReqList(info,
false,
"crisis", -1, -1);
298 if (stage.id == Stage.HA_EVENT) {
306 if (stage.id == Stage.HA_EVENT) {
318 if (target !=
null && source !=
null) {
327 HAERandomEventData data =
new HAERandomEventData(
this, stage);
328 stage.rollData = data;
336 if (source ==
null || target ==
null) {
340 stage.rollData =
null;
347 CountingMap<StarSystemAPI> counts =
new CountingMap<StarSystemAPI>();
349 for (CompetitorData curr : data) {
350 for (MarketAPI market : curr.competitorProducers) {
351 StarSystemAPI system = market.getStarSystem();
352 if (system ==
null)
continue;
353 int weight = market.getCommodityData(curr.commodityId).getMaxSupply();
354 counts.add(system, weight);
358 return counts.getLargest();
365 CountingMap<MarketAPI> scores =
new CountingMap<MarketAPI>();
366 for (MarketAPI market : Misc.getFactionMarkets(Factions.TRITACHYON)) {
367 int size = market.getSize();
369 if (!Misc.isMilitary(market)) weight += size * 10;
370 if (market.hasIndustry(Industries.ORBITALWORKS)) weight += size;
371 if (market.hasIndustry(Industries.HEAVYINDUSTRY)) weight += size;
373 scores.add(market, weight);
376 return scores.getLargest();
380 MarketAPI nortia =
Global.
getSector().getEconomy().getMarket(
"nortia");
381 if (nortia ==
null || nortia.hasCondition(Conditions.DECIVILIZED)) {
392 TriTachyonCommerceRaiding.addFactorCreateIfNecessary(
new TTCRMercenariesDefeatedFactor(),
null);
409 super.advance(amount);
411 float days = Misc.getDays(amount);
428 if (stage !=
null && stage.rollData instanceof HAERandomEventData &&
429 ((HAERandomEventData)stage.rollData).factor ==
this) {
435 TTMercenaryAttack.get().finish(
false);
441 CountingMap<StarSystemAPI> counts =
new CountingMap<StarSystemAPI>();
442 for (MarketAPI market :
Global.
getSector().getEconomy().getMarketsCopy()) {
443 if (!Factions.TRITACHYON.equals(market.getFactionId()))
continue;
444 StarSystemAPI system = market.getStarSystem();
445 if (system ==
null)
continue;
446 int size = market.getSize();
448 if (Misc.isMilitary(market)) weight += size;
449 if (market.hasIndustry(Industries.ORBITALWORKS)) weight += size;
450 if (market.hasIndustry(Industries.HEAVYINDUSTRY)) weight += size;
452 counts.add(system, weight);
454 return counts.getLargest();
461 if (source ==
null || target ==
null)
return false;
463 GenericRaidParams params =
new GenericRaidParams(
new Random(random.nextLong()),
true);
464 params.makeFleetsHostile =
false;
465 params.source = source;
467 params.prepDays = 21f + random.nextFloat() * 7f;
468 params.payloadDays = 27f + 7f * random.nextFloat();
470 params.raidParams.where = target;
471 params.raidParams.type = FGRaidType.SEQUENTIAL;
473 Set<String> disrupt =
new LinkedHashSet<String>();
474 for (MarketAPI market : Misc.getMarketsInLocation(target, Factions.PLAYER)) {
475 params.raidParams.allowedTargets.add(market);
476 params.raidParams.allowNonHostileTargets =
true;
477 for (Industry ind : market.getIndustries()) {
478 if (ind.getSpec().hasTag(Industries.TAG_UNRAIDABLE))
continue;
479 disrupt.add(ind.getId());
484 params.raidParams.disrupt.addAll(disrupt);
485 params.raidParams.raidsPerColony = Math.min(disrupt.size(), 4);
486 if (disrupt.isEmpty()) {
487 params.raidParams.raidsPerColony = 2;
490 if (params.raidParams.allowedTargets.isEmpty()) {
494 params.factionId = Factions.INDEPENDENT;
495 params.style = FleetStyle.QUALITY;
496 params.repImpact = ComplicationRepImpact.NONE;
499 float fleetSizeMult = 1f;
503 float totalDifficulty = fleetSizeMult * 50f * (0.5f + 0.5f * f);
505 totalDifficulty -= 10;
506 params.fleetSizes.add(10);
508 while (totalDifficulty > 0) {
513 int diff = min + random.nextInt(max - min + 1);
515 params.fleetSizes.add(diff);
516 totalDifficulty -= diff;
519 TTMercenaryAttack attack =
new TTMercenaryAttack(params);
520 attack.setListener(
this);
536 if (!battle.isPlayerInvolved())
return;
538 if (
getProgress(
null) <= 0 && TriTachyonCommerceRaiding.get() ==
null)
return;
542 for (CampaignFleetAPI otherFleet : battle.getNonPlayerSideSnapshot()) {
547 if (!trader && !raider)
continue;
550 if (trader) mult = TTCRPoints.TRADE_FLEET_FP_MULT;
552 for (FleetMemberAPI loss : Misc.getSnapshotMembersLost(otherFleet)) {
553 int fp = loss.getFleetPointCost() * mult;
565 TTCRTradeFleetsDestroyedFactor factor =
new TTCRTradeFleetsDestroyedFactor(points);
566 TriTachyonCommerceRaiding.addFactorCreateIfNecessary(factor,
null);
572 TTCRCommerceRaidersDestroyedFactor factor =
new TTCRCommerceRaidersDestroyedFactor(points);
573 TriTachyonCommerceRaiding.addFactorCreateIfNecessary(factor,
null);
582 boolean trader = Misc.isTrader(fleet);
583 boolean smuggler = Misc.isSmuggler(fleet);
585 if (!trader && !smuggler)
return false;
587 RouteData route = RouteManager.getInstance().getRoute(EconomyFleetRouteManager.SOURCE_ID, fleet);
588 if (route ==
null)
return false;
590 EconomyRouteData data = (EconomyRouteData) route.getCustom();
591 if (data ==
null)
return false;
593 if (data.from !=
null && Factions.TRITACHYON.equals(data.from.getFactionId())) {
596 if (data.to !=
null && Factions.TRITACHYON.equals(data.to.getFactionId())) {
604 if (fleetPointsDestroyed <= 0)
return 0;
606 int points = Math.round(fleetPointsDestroyed / (
float) TTCRPoints.FP_PER_POINT);
607 if (points < 1) points = 1;
612 float base = ind.getSpec().getDisruptDanger().disruptionDays;
613 float per = TTCRPoints.BASE_POINTS_FOR_INDUSTRY_DISRUPT;
615 float days = ind.getDisruptedDays();
617 int points = (int) Math.round(days / base * per);
618 if (points > TTCRPoints.MAX_POINTS_FOR_INDUSTRY_DISRUPT) {
619 points = TTCRPoints.MAX_POINTS_FOR_INDUSTRY_DISRUPT;
625 TempData actionData, CargoAPI cargo) {
631 if (
getProgress(
null) <= 0 && TriTachyonCommerceRaiding.get() ==
null)
return;
633 if (market !=
null && Factions.TRITACHYON.equals(market.getFactionId())) {
639 if (
getProgress(
null) <= 0 && TriTachyonCommerceRaiding.get() ==
null)
return;
641 if (market !=
null && Factions.TRITACHYON.equals(market.getFactionId())) {
646 TempData actionData) {
648 if (
getProgress(
null) <= 0 && TriTachyonCommerceRaiding.get() ==
null)
return;
650 if (market !=
null && Factions.TRITACHYON.equals(market.getFactionId())) {
657 if (
getProgress(
null) <= 0 && TriTachyonCommerceRaiding.get() ==
null)
return;
660 for (Industry industry : market.getIndustries()) {
662 if (industry.getSpec().hasTag(Industries.TAG_UNRAIDABLE))
continue;
672 TTCRIndustryDisruptedFactor factor =
new TTCRIndustryDisruptedFactor(
673 "Disrupted industries " + market.getOnOrAt() +
" " + market.getName(), points);
674 TriTachyonCommerceRaiding.addFactorCreateIfNecessary(factor, dialog);
679 if (
getProgress(
null) <= 0 && TriTachyonCommerceRaiding.get() ==
null)
return;
682 if (industry.getSpec().hasTag(Industries.TAG_UNRAIDABLE))
return;
683 MarketAPI market = industry.getMarket();
684 if (market ==
null)
return;
688 TTCRIndustryDisruptedFactor factor =
new TTCRIndustryDisruptedFactor(
689 industry.getCurrentName() +
" " + market.getOnOrAt() +
" " + market.getName() +
690 " disrupted", points);
691 TriTachyonCommerceRaiding.addFactorCreateIfNecessary(factor, dialog);
698 return super.getNameColorForThreatList();
static SettingsAPI getSettings()
static SectorAPI getSector()
void sendUpdateIfPlayerHasIntel(Object listInfoParam, TextPanelAPI textPanel)
void addBorder(TooltipMakerAPI info, Color c)
EventStageData getDataFor(Object stageId)
static boolean checkFactionExists(String factionId, boolean requireMilitary)
Random getRandomizedStageRandom()
TooltipCreator getDefaultEventTooltip(final String title, final HostileActivityEventIntel intel, final EventStageData stage)
HostileActivityEventIntel intel
float getMarketPresenceFactor(StarSystemAPI system)
void reportFleetDespawnedToListener(CampaignFleetAPI fleet, FleetDespawnReason reason, Object param)
static String DEFEATED_MERC_ATTACK
boolean fireEvent(HostileActivityEventIntel intel, EventStageData stage)
static boolean isCommerceRaider(CampaignFleetAPI fleet)
void reportTacticalBombardmentFinished(InteractionDialogAPI dialog, MarketAPI market, TempData actionData)
Color getNameColor(float mag)
int getProgress(BaseEventIntel intel)
static boolean isTraderServingATTColony(CampaignFleetAPI fleet)
void reportBattleOccurred(CampaignFleetAPI fleet, CampaignFleetAPI primaryWinner, BattleAPI battle)
static int computeTTCRProgressPoints(float fleetPointsDestroyed)
static void setPlayerDefeatedMercAttack()
static boolean isDealtWithMercAttack()
void applyMassIndustryDisruptionToTTCR(MarketAPI market, InteractionDialogAPI dialog)
TooltipCreator getMainRowTooltip(BaseEventIntel intel)
static MarketAPI getNortia()
static StarSystemAPI getPrimaryTriTachyonSystem()
static boolean isPlayerBribedMercAttack()
TriTachyonHostileActivityFactor(HostileActivityEventIntel intel)
static String BRIBED_MERC_ATTACK
void reportRaidToDisruptFinished(InteractionDialogAPI dialog, MarketAPI market, TempData actionData, Industry industry)
Color getNameColorForThreatList()
void advance(float amount)
void addStageDescriptionForEvent(HostileActivityEventIntel intel, EventStageData stage, TooltipMakerAPI info)
static float DEALT_WITH_MERC_PROGRESS_MULT
static void addDealtSectionToTooltip(TooltipMakerAPI tooltip, float opad)
void reportRaidForValuablesFinishedBeforeCargoShown(InteractionDialogAPI dialog, MarketAPI market, TempData actionData, CargoAPI cargo)
Color getDescColor(BaseEventIntel intel)
int getMaxNumFleets(StarSystemAPI system)
void reportSaturationBombardmentFinished(InteractionDialogAPI dialog, MarketAPI market, TempData actionData)
boolean shouldShow(BaseEventIntel intel)
static boolean isPlayerDefeatedMercAttack()
TimeoutTracker< Industry > recentlyDisrupted
String getProgressStr(BaseEventIntel intel)
String getNameForThreatList(boolean first)
static boolean isPlayerCounterRaidedTriTach()
static void setPlayerBribedMercAttack()
void rollEvent(HostileActivityEventIntel intel, EventStageData stage)
void addBulletPointForEventReset(HostileActivityEventIntel intel, EventStageData stage, TooltipMakerAPI info, ListInfoMode mode, boolean isUpdate, Color tc, float initPad)
TooltipCreator getStageTooltipImpl(final HostileActivityEventIntel intel, final EventStageData stage)
static StarSystemAPI findExpeditionTarget(HostileActivityEventIntel intel, EventStageData stage)
static String COMMERCE_RAIDER_FLEET
static int computeIndustryDisruptPoints(Industry ind)
static MarketAPI findExpeditionSource(HostileActivityEventIntel intel, EventStageData stage, StarSystemAPI target)
static void setPlayerCounterRaidedTriTach()
static String COUNTER_RAIDED_TRITACH
void reportFGIAborted(FleetGroupIntel intel)
void notifyFactorRemoved()
String getDesc(BaseEventIntel intel)
void addBulletPointForEvent(HostileActivityEventIntel intel, EventStageData stage, TooltipMakerAPI info, ListInfoMode mode, boolean isUpdate, Color tc, float initPad)
boolean startMercenaryAttack(MarketAPI source, StarSystemAPI target, EventStageData stage, HostileActivityEventIntel intel, Random random)
void applyIndustryDisruptionToTTCR(Industry industry, InteractionDialogAPI dialog)
float getEventFrequency(HostileActivityEventIntel intel, EventStageData stage)
String getEventStageIcon(HostileActivityEventIntel intel, EventStageData stage)
CampaignFleetAPI createFleet(StarSystemAPI system, Random random)
static List< CompetitorData > computePlayerCompetitionData()