1package com.fs.starfarer.api.impl.campaign.missions;
3import java.util.ArrayList;
4import java.util.Arrays;
7import java.util.Random;
9import org.lwjgl.util.vector.Vector2f;
11import com.fs.starfarer.api.Global;
12import com.fs.starfarer.api.campaign.CampaignFleetAPI;
13import com.fs.starfarer.api.campaign.FactionAPI;
14import com.fs.starfarer.api.campaign.FactionAPI.ShipPickMode;
15import com.fs.starfarer.api.campaign.InteractionDialogAPI;
16import com.fs.starfarer.api.campaign.JumpPointAPI;
17import com.fs.starfarer.api.campaign.JumpPointAPI.JumpDestination;
18import com.fs.starfarer.api.campaign.LocationAPI;
19import com.fs.starfarer.api.campaign.PlanetAPI;
20import com.fs.starfarer.api.campaign.SectorEntityToken;
21import com.fs.starfarer.api.campaign.StarSystemAPI;
22import com.fs.starfarer.api.campaign.ai.FleetAIFlags;
23import com.fs.starfarer.api.campaign.econ.MarketAPI;
24import com.fs.starfarer.api.campaign.listeners.GateTransitListener;
25import com.fs.starfarer.api.campaign.rules.MemoryAPI;
26import com.fs.starfarer.api.characters.PersonAPI;
27import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.CustomRepImpact;
28import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActionEnvelope;
29import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActions;
30import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepRewards;
31import com.fs.starfarer.api.impl.campaign.ids.Factions;
32import com.fs.starfarer.api.impl.campaign.ids.Tags;
33import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithSearch;
34import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithSearch.RequiredSystemTags;
35import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers;
36import com.fs.starfarer.api.impl.campaign.missions.hub.MissionTrigger.TriggerAction;
37import com.fs.starfarer.api.impl.campaign.missions.hub.MissionTrigger.TriggerActionContext;
38import com.fs.starfarer.api.impl.campaign.missions.hub.ReqMode;
39import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator;
40import com.fs.starfarer.api.util.Misc;
41import com.fs.starfarer.api.util.Misc.Token;
42import com.fs.starfarer.api.util.WeightedRandomPicker;
50 public static enum EncounterType {
54 FROM_SOMEWHERE_IN_SYSTEM,
57 public static enum EncounterLocation {
144 boolean onlyCheckInSystem =
true;
147 onlyCheckInSystem =
false;
152 if (
allowedTypes.contains(EncounterType.IN_HYPER_EN_ROUTE) && !onlyCheckInSystem) {
156 float currSpeed = playerFleet.
getVelocity().length();
157 if (currSpeed >= maxSpeed * 0.9f) {
161 dir += 75f - 150f *
genRandom.nextFloat();
172 if (
allowedTypes.contains(EncounterType.OUTSIDE_SYSTEM)) {
182 if (
allowedTypes.contains(EncounterType.FROM_SOMEWHERE_IN_SYSTEM)) {
186 typePicked = EncounterType.FROM_SOMEWHERE_IN_SYSTEM;
190 if (
allowedTypes.contains(EncounterType.JUMP_IN_NEAR_PLAYER)) {
199 if (entity !=
null) {
207 if (entity !=
null) {
237 typePicked = EncounterType.JUMP_IN_NEAR_PLAYER;
263 int maxHostileSize = 0;
265 if (market.getSize() > maxSize) {
270 if (market.getSize() > maxHostileSize) {
271 largestHostile = market;
272 maxHostileSize = market.
getSize();
276 if (largestHostile !=
null && maxHostileSize > maxSize) {
281 boolean found =
false;
294 Vector2f coreCenter =
new Vector2f();
296 float fringeRange = 46000;
298 float nearMarketRange = 5000f;
299 boolean nearCoreMarket =
false;
300 boolean nearAnyMarket =
false;
302 float minDist = Float.MAX_VALUE;
306 if (market.isHidden())
continue;
308 Vector2f.add(coreCenter, market.getLocationInHyperspace(), coreCenter);
311 if (!nearCoreMarket) {
313 nearCoreMarket = dist < nearMarketRange;
314 if (dist < minDist) {
319 }
else if (!nearAnyMarket) {
321 nearAnyMarket = dist < nearMarketRange;
322 if (dist < minDist) {
338 coreCenter.scale(1f / count);
341 if (nearCoreMarket &&
allowedLocations.contains(EncounterLocation.NEAR_CORE)) {
344 if (nearAnyMarket &&
allowedLocations.contains(EncounterLocation.POPULATED_SYSTEM)) {
349 if (
location == EncounterLocation.NEAR_CORE)
continue;
350 if (
location == EncounterLocation.POPULATED_SYSTEM)
continue;
356 if (
location == EncounterLocation.MIDRANGE) {
357 if (distFromCore > fringeRange || nearCoreMarket) {
362 if (
location == EncounterLocation.FRINGE) {
363 if (distFromCore < fringeRange || nearCoreMarket) {
378 public void doAction(TriggerActionContext context) {
394 if (curr.getFaction() == context.fleet.
getFaction()) {
395 w = curr.getSize() * 10000f;
396 }
else if (!curr.getFaction().isHostileTo(context.fleet.
getFaction())) {
404 if (market !=
null) {
407 dir, 30f, 3000f, 3000f, 3000f);
435 float radius = 2000f * (0.5f + 0.5f *
genRandom.nextFloat());
447 protected List<EncounterType>
allowedTypes =
new ArrayList<EncounterType>();
467 setTypes(EncounterType.OUTSIDE_SYSTEM, EncounterType.JUMP_IN_NEAR_PLAYER, EncounterType.IN_HYPER_EN_ROUTE);
499 super.notifyEnding();
510 if (factions ==
null || factions.length <= 0) {
525 RequiredSystemTags req =
new RequiredSystemTags(mode, tags);
530 setTypes(EncounterType.OUTSIDE_SYSTEM, EncounterType.IN_HYPER_EN_ROUTE);
533 setTypes(EncounterType.OUTSIDE_SYSTEM);
536 setTypes(EncounterType.JUMP_IN_NEAR_PLAYER);
539 setTypes(EncounterType.FROM_SOMEWHERE_IN_SYSTEM);
542 setTypes(EncounterType.IN_HYPER_EN_ROUTE);
550 EncounterLocation ... locations) {
557 public void setDelay(
float minDays,
float maxDays) {
558 this.minDelay = minDays;
559 this.maxDelay = maxDays;
563 this.minDelay = base * 0.5f;
564 this.maxDelay = base * 1.5f;
569 EncounterLocation.POPULATED_SYSTEM);
574 EncounterLocation.NEAR_CORE);
579 EncounterLocation.FRINGE, EncounterLocation.MIDRANGE);
584 EncounterLocation.ANYWHERE);
589 EncounterLocation.FRINGE);
594 EncounterLocation.NEAR_CORE, EncounterLocation.MIDRANGE);
629 super.advanceImpl(amount);
650 checker.daysBeforeInHyper = (0.5f + (0.5f +
genRandom.nextFloat())) * 2f;
651 checker.daysBeforeInSystem = (0.5f + (0.5f +
genRandom.nextFloat())) * 3f;
662 public boolean conditionsMet() {
711 String thingItOrThey,
714 boolean aggressiveIfDeclined,
715 ComplicationRepImpact repImpact,
724 if (aggressiveIfDeclined) {
729 if (repImpact == ComplicationRepImpact.LOW) {
731 }
else if (repImpact == ComplicationRepImpact.NONE) {
754 String thingItOrThem =
"them";
755 if (
"it".equals(thingItOrThey)) thingItOrThem =
"it";
762 if (failTrigger ==
null) {
763 failTrigger =
"FWTDefaultFailTrigger";
795 super.triggerSetFleetFaction(factionId);
802 super.triggerCreateFleet(size,
quality, factionId, type, roughlyWhere);
808 super.triggerCreateFleet(size,
quality, factionId, type, roughlyWhere);
814 super.triggerCreateFleet(size,
quality, factionId, type, locInHyper);
834 float repLossPerson = 0f;
835 float repLossFaction = 0f;
836 if (
"repLossMinor".equals(action)) {
837 repLossPerson = -RepRewards.SMALL;
838 repLossFaction = -RepRewards.TINY;
839 }
else if (
"repLossMedium".equals(action)) {
840 repLossPerson = -RepRewards.HIGH;
841 repLossFaction = -RepRewards.SMALL;
842 }
else if (
"repLossHigh".equals(action)) {
843 repLossPerson = -RepRewards.EXTREME;
844 repLossFaction = -RepRewards.HIGH;
848 CustomRepImpact impact =
new CustomRepImpact();
849 impact.delta = repLossPerson;
851 new RepActionEnvelope(RepActions.CUSTOM, impact,
854 impact.delta = repLossFaction;
856 new RepActionEnvelope(RepActions.CUSTOM, impact,
861 return super.callAction(action, ruleId, dialog, params, memoryMap);
static SectorAPI getSector()
static final String PLACE_TO_LOOK_FOR_TARGET
static final String CUSTOM_SPAWNS_AS_INDEPENDENT
static final String INDEPENDENT
StarSystemAPI lastSystemPlayerWasIn
void advance(float amount)
SectorEntityToken foundEntity
boolean isPlayerInRightRangeBand(LocationAPI system)
void doAction(TriggerActionContext context)
float estimatedFleetPoints
static float RADIUS_FROM_CORE
static String TIMEOUT_KEY
void setFleetWantsThing(String originalFactionId, String thing, String thingItOrThey, String thingDesc, int paymentOffered, boolean aggressiveIfDeclined, ComplicationRepImpact repImpact, String failTrigger, PersonAPI personForRepLoss)
void setLocationAnywhere(boolean allowInsidePopulatedSystems, String requireLargestMarketNotHostileToFaction)
void setRequireLargestMarketNotHostileToFaction(String requireLargestMarketNotHostileToFaction)
void setEncounterOutsideSystem()
void setLocationAnyPopulated(boolean allowInsidePopulatedSystems, String requireLargestMarketNotHostileToFaction)
void setEncounterInSystemFromJumpPoint()
boolean canBeAvoidedByGateTransit
void setAllowInsidePopulatedSystems(boolean allowInsidePopulatedSystems)
void setLocations(boolean allowInsidePopulatedSystems, String requireLargestMarketNotHostileToFaction, EncounterLocation ... locations)
void setCanNotBeAvoidedByGateTransit()
void triggerCreateFleet(FleetSize size, FleetQuality quality, String factionId, String type, SectorEntityToken roughlyWhere)
static float BASE_ONLY_CHECK_IN_SYSTEM_DAYS
static float BASE_DELAY_SHORT
void triggerSetStandardAggroInterceptFlags()
List< EncounterLocation > allowedLocations
boolean create(MarketAPI createdAt, boolean barEvent)
List< RequiredSystemTags > requiredTags
static String TRIGGER_REP_LOSS_MINOR
static String TRIGGER_REP_LOSS_HIGH
CanSpawnFleetConditionChecker checker
boolean callAction(String action, String ruleId, InteractionDialogAPI dialog, List< Token > params, Map< String, MemoryAPI > memoryMap)
void reportFleetTransitingGate(CampaignFleetAPI fleet, SectorEntityToken gateFrom, SectorEntityToken gateTo)
void setDelay(float base)
void setTypes(EncounterType ... types)
PersonAPI personForRepLoss
static float BASE_DELAY_MEDIUM
void triggerCreateFleet(FleetSize size, FleetQuality quality, String factionId, String type, Vector2f locInHyper)
void setDoNotAbortWhenPlayerFleetTooStrong()
void requireDFESystemTags(ReqMode mode, String ... tags)
void setLocationOuterSector(boolean allowInsidePopulatedSystems, String requireLargestMarketNotHostileToFaction)
void advanceImpl(float amount)
static float BASE_DAYS_IN_SYSTEM_BEFORE_IN_SYSTEM_ATTACK
float onlyCheckForSpawnInSystemDays
static float BASE_DELAY_VERY_SHORT
void setDelay(float minDays, float maxDays)
void setRequireFactionPresence(String ... factions)
static boolean isInTimeout()
void setLocationFringeOnly(boolean allowInsidePopulatedSystems, String requireLargestMarketNotHostileToFaction)
void triggerCreateFleet(FleetSize size, FleetQuality quality, String factionId, String type, StarSystemAPI roughlyWhere)
float playerFleetSizeAbortMult
String requireLargestMarketNotHostileToFaction
void setLocationCoreOnly(boolean allowInsidePopulatedSystems, String requireLargestMarketNotHostileToFaction)
static String TRIGGER_REP_LOSS_MEDIUM
List< EncounterType > allowedTypes
void clearDFESystemTagRequirements()
static float getRandomValue(float base)
void setPlayerFleetSizeAbortMult(float playerFleetSizeAbortMult)
void triggerSetAdjustStrengthBasedOnQuality(boolean randomize, float quality)
boolean allowInsidePopulatedSystems
static float BASE_DAYS_IN_SYSTEM_BEFORE_AMBUSH_IN_HYPER
void triggerFleetSetFaction(String factionId)
static float BASE_DELAY_LONG
void setEncounterFromSomewhereInSystem()
void setLocationInnerSector(boolean allowInsidePopulatedSystems, String requireLargestMarketNotHostileToFaction)
List< String > requiredFactionPresence
void setEncounterInHyperEnRoute()
static float BASE_TIMEOUT
LocationAPI initialTransitFrom
void computeThresholdPoints(String factionId)
void setEncounterInHyper()
DelayedFleetEncounter(Random random, String missionId)
void setStageOnCustomCondition(Object to, ConditionChecker custom)
void setMissionId(String missionId)
void setSuccessStage(Object id)
void setStageOnGlobalFlag(Object to, String flag)
float getElapsedInCurrentStage()
StageData getData(Object id)
String getWithoutArticle(String item)
void accept(InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap)
void setStartingStage(Object startingStage)
void setQuality(float quality)
void setGenRandom(Random random)
void connectWithDaysElapsed(Object from, Object to, float days)
void triggerFleetAllowLongPursuit()
void triggerAutoAdjustFleetStrengthMajor()
void triggerMakeAllFleetFlagsPermanent()
void setUseQualityInsteadOfQualityFraction(boolean temporarilyUseQualityInsteadOfQualityFraction)
void triggerMakeLowRepImpact()
void triggerMakeHostileAndAggressive()
void triggerMakeNoRepImpact()
void triggerSetGlobalMemoryValue(final String key, final Object value)
void triggerSetFleetAlwaysPursue()
static Vector2f pickLocationWithinArc(Random random, final SectorEntityToken entity, final float dir, final float arc, final float minDistToPlayer, final float minDist, final float maxDist)
void triggerOrderFleetInterceptPlayer()
void triggerCustomAction(TriggerAction action)
void beginCustomTrigger(ConditionChecker condition, Object ... stages)
void triggerOrderFleetMaybeEBurn()
void triggerSetFleetMissionRef(final String key)
void triggerSetPirateFleet()
void triggerSetFleetMemoryValue(final String key, final Object value)
void triggerSetFleetFaction(final String factionId)
void triggerRandomizeFleetProperties()
static float getNormalRandom(float min, float max)
static String getWithDGS(float num)
static float getDistanceLY(SectorEntityToken from, SectorEntityToken to)
static Vector2f getUnitVectorAtDegreeAngle(float degrees)
static List< MarketAPI > getMarketsInLocation(LocationAPI location, String factionId)
static String ucFirst(String str)
static SectorEntityToken findNearestPlanetTo(SectorEntityToken entity, boolean requireGasGiant, boolean allowStars)
static float getDistance(SectorEntityToken from, SectorEntityToken to)
static long genRandomSeed()
static Vector2f getPointAtRadius(Vector2f from, float r)
static float getSpeedForBurnLevel(float burnLevel)
static JumpPointAPI findNearestJumpPointTo(SectorEntityToken entity)
static float getAngleInDegrees(Vector2f v)
float convertToDays(float realSeconds)
LocationAPI getContainingLocation()
FleetDataAPI getFleetData()
void setLocation(float x, float y)
float getApproximateMaxFPPerFleet(ShipPickMode mode)
boolean getCustomBoolean(String key)
TextPanelAPI getTextPanel()
void addEntity(SectorEntityToken entity)
void removeEntity(SectorEntityToken entity)
CampaignFleetAPI getPlayerFleet()
ReputationAdjustmentResult adjustPlayerReputation(Object action, String factionId)
CampaignClockAPI getClock()
void doHyperspaceTransition(CampaignFleetAPI fleet, SectorEntityToken jumpLocation, JumpDestination dest)
FactionAPI getFaction(String factionId)
MemoryAPI getMemoryWithoutUpdate()
LocationAPI getHyperspace()
ListenerManagerAPI getListenerManager()
LocationAPI getContainingLocation()
StarSystemAPI getStarSystem()
Vector2f getLocationInHyperspace()
MemoryAPI getMemoryWithoutUpdate()
List< MarketAPI > getMarketsCopy()
List< MarketAPI > getMarkets(LocationAPI loc)
StarSystemAPI getStarSystem()
SectorEntityToken getPrimaryEntity()
void addListener(Object listener)
void removeListener(Object listener)
void set(String key, Object value)
boolean getBoolean(String key)