1package com.fs.starfarer.api.impl.campaign.command;
3import java.util.ArrayList;
4import java.util.HashSet;
5import java.util.LinkedHashSet;
9import com.fs.starfarer.api.EveryFrameScript;
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.SectorEntityToken;
14import com.fs.starfarer.api.campaign.StarSystemAPI;
15import com.fs.starfarer.api.campaign.ai.CampaignFleetAIAPI.ActionType;
16import com.fs.starfarer.api.campaign.econ.MarketAPI;
17import com.fs.starfarer.api.campaign.listeners.ObjectiveEventListener;
18import com.fs.starfarer.api.impl.campaign.MilitaryResponseScript;
19import com.fs.starfarer.api.impl.campaign.MilitaryResponseScript.MilitaryResponseParams;
20import com.fs.starfarer.api.impl.campaign.fleets.EconomyFleetRouteManager;
21import com.fs.starfarer.api.impl.campaign.fleets.RouteManager;
22import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.OptionalFleetData;
23import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteData;
24import com.fs.starfarer.api.impl.campaign.ids.Factions;
25import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
26import com.fs.starfarer.api.impl.campaign.ids.Tags;
27import com.fs.starfarer.api.impl.campaign.intel.events.HostileActivityEventIntel;
28import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.Objectives;
29import com.fs.starfarer.api.impl.campaign.tutorial.TutorialMissionIntel;
30import com.fs.starfarer.api.plugins.BuildObjectiveTypePicker;
31import com.fs.starfarer.api.plugins.BuildObjectiveTypePicker.BuildObjectiveParams;
32import com.fs.starfarer.api.util.CountingMap;
33import com.fs.starfarer.api.util.Misc;
34import com.fs.starfarer.api.util.TimeoutTracker;
35import com.fs.starfarer.api.util.WeightedRandomPicker;
39 public static enum LocationDanger {
48 public static LocationDanger [] vals = values();
50 public float enemyStrengthFraction;
51 private LocationDanger(
float enemyStrengthFraction) {
52 this.enemyStrengthFraction = enemyStrengthFraction;
55 public LocationDanger next() {
56 int index = this.ordinal() + 1;
57 if (index >= vals.length) index = vals.length - 1;
60 public LocationDanger prev() {
61 int index = this.ordinal() - 1;
62 if (index < 0) index = 0;
72 public static final String
KEY =
"$core_warSimScript";
85 protected List<StarSystemAPI>
queue =
new ArrayList<StarSystemAPI>();
93 timeouts.add(sid, 2f + (
float) Math.random() * 3f);
115 if (
queue.isEmpty()) {
119 if (!
queue.isEmpty()) {
128 timeouts.add(sid, 2f + (
float) Math.random() * 3f);
134 List<FactionAPI> factions =
new ArrayList<FactionAPI>(str.keySet());
145 List<FactionAPI> contenders =
new ArrayList<FactionAPI>();
150 contenders.add(faction);
155 }
else if (faction == obj.getFaction()) {
156 contenders.add(faction);
162 if (
timeouts.contains(
id))
continue;
164 timeouts.add(
id, 10f + (
float) Math.random() * 30f);
174 if (max <= 0)
continue;
178 float w = (curr / max) - 0.5f;
179 picker.
add(faction, w);
183 if (winner !=
null && winner != obj.getFaction()) {
196 if (
timeouts.contains(
id))
continue;
198 timeouts.add(
id, 20f + (
float) Math.random() * 20f);
208 if (max <= 0)
continue;
212 float w = (curr / max) - 0.5f;
213 picker.
add(faction, w);
217 if (winner !=
null && winner != sLoc.getFaction()) {
218 BuildObjectiveParams params =
new BuildObjectiveParams();
219 params.faction = winner;
221 params.stableLoc = sLoc;
258 boolean ownerHasColonyInSystem =
false;
262 ownerHasColonyInSystem =
true;
266 if (ownerHasColonyInSystem)
return false;
270 float minDist = Float.MAX_VALUE;
272 boolean haveInSystemMarkets =
false;
275 if (dist < minDist) {
279 if (faction == market.getFaction()) {
280 haveInSystemMarkets =
true;
284 if (closest !=
null && closest.
getFaction() == faction) {
290 if (minDist > 8000) {
309 return strongest == faction;
321 timeouts.add(
id, 40f + (
float) Math.random() * 20f, 100f);
328 String
id =
"starsystem_" + system.
getId();
333 String
id =
"sim_build_" + objective.
getId();
338 String
id =
"sim_changedhands_" + objective.
getId();
343 String
id = faction.
getId() +
"_" + objective.
getId();
352 if (enemy !=
null && !faction.
isHostileTo(enemy))
return;
361 MilitaryResponseParams params =
new MilitaryResponseParams(ActionType.HOSTILE,
366 20f + (
float) Math.random() * 20f);
370 timeouts.add(
id, params.responseDuration * 2f);
390 Set<FactionAPI> factions =
new LinkedHashSet<FactionAPI>();
398 factions.add(fleet.getFaction());
402 String
id = route.getFactionId();
403 if (
id ==
null)
continue;
405 factions.add(faction);
413 result.
add(faction, strength);
424 float f = enemyStrength / Math.max(1f, factionStrength + enemyStrength);
431 float f = factionStrength / Math.max(1f, factionStrength + enemyStrength);
446 Set<String> seen =
new HashSet<String>();
453 if (!(assumeHostileToPlayer && target.getFaction().isPlayerFaction())) {
454 if (!target.getFaction().isHostileTo(faction))
continue;
457 if (seen.contains(target.getFactionId()))
continue;
458 seen.add(target.getFactionId());
483 Set<CampaignFleetAPI> seenFleets =
new HashSet<CampaignFleetAPI>();
485 if (fleet.getFaction() != faction)
continue;
486 if (fleet.isStationMode())
continue;
490 if (fleet.isPlayerFleet())
continue;
497 strength += fleet.getEffectiveStrength();
499 seenFleets.add(fleet);
503 if (route.getActiveFleet() !=
null && seenFleets.contains(route.getActiveFleet()))
continue;
505 OptionalFleetData data = route.getExtra();
506 if (data ==
null)
continue;
507 if (route.getFactionId() ==
null)
continue;
508 if (!faction.
getId().equals(route.getFactionId()))
continue;
515 strength += data.getStrengthModifiedByDamage();
526 if (!fleet.isStationMode())
continue;
527 if (fleet.getFaction() != faction)
continue;
532 if (dist < maxDist) {
533 strength += fleet.getEffectiveStrength();
587 if (system ==
null)
return LocationDanger.NONE;
591 if (system ==
null)
return LocationDanger.NONE;
594 public static LocationDanger
getDangerFor(
float factionStrength,
float enemyStrength) {
595 if (enemyStrength < 100)
return LocationDanger.NONE;
597 float f = enemyStrength / Math.max(1f, factionStrength + enemyStrength);
598 for (LocationDanger level : LocationDanger.vals) {
599 float test = level.enemyStrengthFraction + (level.next().enemyStrengthFraction - level.enemyStrengthFraction) * 0.5f;
600 if (level == LocationDanger.NONE) test = LocationDanger.NONE.enemyStrengthFraction;
605 return LocationDanger.EXTREME;
static SectorAPI getSector()
MilitaryResponseParams getParams()
static LocationDanger getDangerFor(FactionAPI faction, StarSystemAPI system)
static float getFactionStrength(String factionId, StarSystemAPI system)
static float getRelativeFactionStrength(String factionId, StarSystemAPI system)
String getControlSimTimeoutId(SectorEntityToken objective)
TimeoutTracker< String > getTimeouts()
void advance(float amount)
static float getEnemyStrength(FactionAPI faction, StarSystemAPI system)
static float getStationStrength(FactionAPI faction, StarSystemAPI system, SectorEntityToken from)
static float getFactionStrength(FactionAPI faction, StarSystemAPI system)
String getControlTimeoutId(SectorEntityToken objective, FactionAPI faction)
void addObjectiveActionResponse(SectorEntityToken objective, FactionAPI faction, FactionAPI enemy)
List< StarSystemAPI > queue
void reportObjectiveChangedHands(SectorEntityToken objective, FactionAPI from, FactionAPI to)
static void removeNoFightingTimeoutForObjective(SectorEntityToken objective, FactionAPI faction)
static float getEnemyStrength(String factionId, StarSystemAPI system, boolean assumeHostileToPlayer)
static float getEnemyStrength(FactionAPI faction, StarSystemAPI system, boolean assumeHostileToPlayer)
String getStarSystemTimeoutId(StarSystemAPI system)
void processStarSystem(StarSystemAPI system)
static CountingMap< FactionAPI > getFactionStrengths(StarSystemAPI system)
static WarSimScript getInstance()
static void setNoFightingForObjective(SectorEntityToken objective, FactionAPI faction, float timeout)
TimeoutTracker< String > timeouts
static LocationDanger getDangerFor(float factionStrength, float enemyStrength)
static float getRelativeEnemyStrength(String factionId, StarSystemAPI system)
static void removeFightOrdersFor(SectorEntityToken target, FactionAPI faction)
static boolean isAlreadyFightingFor(SectorEntityToken objective, FactionAPI faction)
static final float CHECK_PROB
void reportObjectiveDestroyed(SectorEntityToken objective, SectorEntityToken stableLocation, FactionAPI enemy)
static final float CHECK_DAYS
static LocationDanger getDangerFor(String factionId, StarSystemAPI system)
boolean wantsToOwnObjective(FactionAPI faction, CountingMap< FactionAPI > str, SectorEntityToken o)
String getBuildSimTimeoutId(SectorEntityToken objective)
static float getEnemyStrength(String factionId, StarSystemAPI system)
static boolean ENEMY_STRENGTH_CHECK_EXCLUDE_PIRATES
static boolean isPlayerInSpawnRange(SectorEntityToken from)
List< RouteData > getRoutesInLocation(LocationAPI location)
static RouteManager getInstance()
static final String CUSTOM_NO_WAR_SIM
static final String PIRATES
static final String CUSTOM_PIRATE_BEHAVIOR
static final String MEMORY_KEY_SMUGGLER
static final String MEMORY_KEY_TRADE_FLEET
float getVeryApproximateFPStrength(StarSystemAPI system)
static HostileActivityEventIntel get()
void build(String type, String factionId)
void control(String factionId)
static boolean isTutorialInProgress()
void add(K key, int quantity)
static List< MarketAPI > getMarketsInLocation(LocationAPI location, String factionId)
static float getDistance(SectorEntityToken from, SectorEntityToken to)
static float getDays(float amount)
static float getBattleJoinRange()
boolean getCustomBoolean(String key)
boolean isHostileTo(FactionAPI other)
boolean isNeutralFaction()
boolean isPlayerFaction()
< T > T pickPlugin(Class< T > c, Object params)
List< SectorEntityToken > getEntitiesWithTag(String tag)
void addScript(EveryFrameScript script)
List< EveryFrameScript > getScripts()
List< CampaignFleetAPI > getFleets()
GenericPluginManagerAPI getGenericPlugins()
FactionAPI getFaction(String factionId)
MemoryAPI getMemoryWithoutUpdate()
ListenerManagerAPI getListenerManager()
LocationAPI getContainingLocation()
SectorEntityToken getCenter()
List< StarSystemAPI > getStarSystemsWithMarkets()
void addListener(Object listener)
void set(String key, Object value)
String pickObjectiveToBuild(BuildObjectiveParams params)