1package com.fs.starfarer.api.impl.campaign.abilities;
3import java.util.Random;
7import org.lwjgl.util.vector.Vector2f;
9import com.fs.starfarer.api.Global;
10import com.fs.starfarer.api.campaign.CampaignFleetAPI;
11import com.fs.starfarer.api.campaign.JumpPointAPI;
12import com.fs.starfarer.api.campaign.SectorEntityToken;
13import com.fs.starfarer.api.campaign.SectorEntityToken.VisibilityLevel;
14import com.fs.starfarer.api.campaign.StarSystemAPI;
15import com.fs.starfarer.api.characters.FullName;
16import com.fs.starfarer.api.impl.campaign.econ.impl.MilitaryBase;
17import com.fs.starfarer.api.impl.campaign.fleets.FleetFactory.PatrolType;
18import com.fs.starfarer.api.impl.campaign.fleets.PirateFleetManager;
19import com.fs.starfarer.api.impl.campaign.fleets.RouteManager;
20import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.OptionalFleetData;
21import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteData;
22import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteFleetSpawner;
23import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteSegment;
24import com.fs.starfarer.api.impl.campaign.ids.Factions;
25import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
26import com.fs.starfarer.api.impl.campaign.ids.Pings;
27import com.fs.starfarer.api.impl.campaign.ids.Tags;
28import com.fs.starfarer.api.impl.campaign.procgen.themes.RuinsFleetRouteManager;
29import com.fs.starfarer.api.impl.campaign.procgen.themes.SalvageSpecialAssigner;
30import com.fs.starfarer.api.ui.LabelAPI;
31import com.fs.starfarer.api.ui.TooltipMakerAPI;
32import com.fs.starfarer.api.util.DelayedActionScript;
33import com.fs.starfarer.api.util.Misc;
34import com.fs.starfarer.api.util.TimeoutTracker;
35import com.fs.starfarer.api.util.WeightedRandomPicker;
44 public static enum DistressCallOutcome {
50 public static class DistressResponseData {
51 public DistressCallOutcome outcome;
57 public static class AbilityUseData {
58 public long timestamp;
59 public Vector2f location;
60 public AbilityUseData(
long timestamp, Vector2f location) {
61 this.timestamp = timestamp;
62 this.location = location;
85 if (
level != VisibilityLevel.NONE) {
97 if (fleet ==
null)
return;
106 picker.
add(DistressCallOutcome.HELP, 10f);
109 float pirates = 10f +
uses * 2f;
110 picker.
add(DistressCallOutcome.PIRATES, pirates);
112 float nothing = 10f +
uses * 2f;
113 picker.
add(DistressCallOutcome.NOTHING, nothing);
116 DistressCallOutcome outcome = picker.
pick();
119 if (outcome != DistressCallOutcome.NOTHING) {
120 float delay = 10f + 10f * (float) Math.random();
122 delay = 1f + 2f * (float) Math.random();
137 public boolean wasUsedNearby(
float withinDays, Vector2f locInHyper,
float withinRangeLY) {
138 for (AbilityUseData data :
uses.getItems()) {
140 if (daysSinceUse <= withinDays) {
142 if (range <= withinRangeLY)
return true;
151 super.advance(amount);
162 return uses.getItems().size();
167 if (player ==
null)
return;
173 if (inner ==
null)
return;
183 if (outer ==
null)
return;
186 if (outcome == DistressCallOutcome.HELP) {
188 }
else if (outcome == DistressCallOutcome.PIRATES) {
200 public void doAction() {
202 if (player ==
null)
return;
204 int numPirates =
new Random().nextInt(3) + 1;
205 for (
int i = 0; i < numPirates; i++) {
206 DistressResponseData data =
new DistressResponseData();
207 data.outcome = DistressCallOutcome.PIRATES;
211 OptionalFleetData extra =
new OptionalFleetData();
216 float waitDays = 15f + (float) Math.random() * 10f;
217 route.addSegment(
new RouteSegment(waitDays, inner));
229 public void doAction() {
230 DistressResponseData data =
new DistressResponseData();
231 data.outcome = DistressCallOutcome.HELP;
237 float waitDays = 15f + (float) Math.random() * 10f;
238 route.addSegment(
new RouteSegment(waitDays, inner));
247 if (!super.isUsable())
return false;
248 if (
getFleet() ==
null)
return false;
269 if (fleet ==
null)
return;
277 if (fleet ==
null)
return;
291 tooltip.
addPara(
"May be used by a stranded fleet to punch a distress signal through to hyperspace, " +
292 "asking nearby fleets to bring aid in the form of fuel and supplies. " +
293 "Help may take many days to arrive, if it arrives at all, and taking advantage " +
294 "of it will result in a progressively higher reduction in standing with the responders.", pad);
296 tooltip.
addPara(
"By long-standing convention, the fleet in distress is expected to meet any responders at the " +
297 "innermost jump-point inside a star system.", pad, highlight,
298 "innermost jump-point");
300 tooltip.
addPara(
"The signal is non-directional and carries no data, and is therefore not useful for " +
301 "calling for help in a tactical situation.", pad);
305 tooltip.
addPara(
"Can not be used in hyperspace.", bad, pad);
308 tooltip.
addPara(
"Can not be used in star systems deep within abyssal hyperspace.", bad, pad);
323 DistressResponseData data = (DistressResponseData) route.getCustom();
326 if (player ==
null)
return null;
328 if (data.outcome == DistressCallOutcome.HELP) {
333 String faction = factions.
pick();
336 if (faction ==
null)
return null;
348 String type = typePicker.
pick();
352 route,
null,
false,
null);
357 picker.
add(PatrolType.HEAVY, 5f);
358 PatrolType type = picker.
pick();
363 if (fleet ==
null)
return null;
386 float dir = (float) Math.random() * 360f;
389 dir += (float) Math.random() * 120f - 60f;
392 loc.scale(3000f + 1000f * (
float) Math.random());
398 data.inner, data.outer));
401 }
else if (data.outcome == DistressCallOutcome.PIRATES) {
402 int points = 5 +
new Random().nextInt(15);
405 if (fleet ==
null)
return null;
417 float dir = (float) Math.random() * 360f;
420 dir += (float) Math.random() * 120f - 60f;
423 loc.scale(3000f + 1000f * (
float) Math.random());
static boolean CODEX_TOOLTIP_MODE
static SectorAPI getSector()
transient AbilitySpecAPI spec
CampaignFleetAPI getFleet()
void addIncompatibleToTooltip(TooltipMakerAPI tooltip, boolean expanded)
boolean shouldCancelRouteAfterDelayCheck(RouteData route)
void addHelpScript(float delayDays, final StarSystemAPI system, final JumpPointAPI inner, final JumpPointAPI outer)
int getNumUsesInLastPeriod()
TimeoutTracker< AbilityUseData > getUses()
void advance(float amount)
void addResponseScript(float delayDays, DistressCallOutcome outcome)
TimeoutTracker< AbilityUseData > uses
void applyEffect(float amount, float level)
static final float DAYS_TO_TRACK_USAGE
void createTooltip(TooltipMakerAPI tooltip, boolean expanded)
boolean shouldRepeat(RouteData route)
static final float NEARBY_USE_TIMEOUT_DAYS
void addPiratesScript(float delayDays, final StarSystemAPI system, final JumpPointAPI inner, final JumpPointAPI outer)
boolean wasUsedNearby(float withinDays, Vector2f locInHyper, float withinRangeLY)
void reportAboutToBeDespawnedByRouteManager(RouteData route)
static final float NEARBY_USE_RADIUS_LY
CampaignFleetAPI spawnFleet(RouteData route)
static CampaignFleetAPI createPatrol(PatrolType type, String factionId, RouteData route, MarketAPI market, Vector2f locInHyper, Random random)
static CampaignFleetAPI createPirateFleet(int combatPoints, RouteData route, Vector2f locInHyper)
RouteData addRoute(String source, MarketAPI market, Long seed, OptionalFleetData extra, RouteFleetSpawner spawner)
static RouteManager getInstance()
static final String PIRATES
static final String INDEPENDENT
static final String SCAVENGER_MEDIUM
static final String SCAVENGER_LARGE
static final String DISTRESS_CALL
static CampaignFleetAPI createScavenger(String type, Vector2f locInHyper, MarketAPI source, boolean pirate, Random random)
static WeightedRandomPicker< String > getNearbyFactions(Random random, SectorEntityToken entity)
static MarketAPI getSourceMarket(CampaignFleetAPI fleet)
static float getDistanceLY(SectorEntityToken from, SectorEntityToken to)
static Vector2f getUnitVectorAtDegreeAngle(float degrees)
static Color getNegativeHighlightColor()
static void makeImportant(SectorEntityToken entity, String reason)
static JumpPointAPI getDistressJumpPoint(StarSystemAPI system)
static Color getGrayColor()
static long genRandomSeed()
static Color getHighlightColor()
static float getAngleInDegrees(Vector2f v)
float getElapsedDaysSince(long timestamp)
float convertToDays(float realSeconds)
LocationAPI getContainingLocation()
FleetMemberAPI getFlagship()
void setLocation(float x, float y)
boolean isInHyperspaceTransition()
List< JumpDestination > getDestinations()
boolean hasTag(String tag)
float getDaysSinceLastPlayerVisit()
void addEntity(SectorEntityToken entity)
CampaignFleetAPI getPlayerFleet()
void addScript(EveryFrameScript script)
CampaignClockAPI getClock()
EveryFrameScript addPing(SectorEntityToken entity, String pingType)
LocationAPI getHyperspace()
boolean isInCurrentLocation()
void addScript(EveryFrameScript script)
VisibilityLevel getVisibilityLevelToPlayerFleet()
StarSystemAPI getStarSystem()
Vector2f getLocationInHyperspace()
MemoryAPI getMemoryWithoutUpdate()
void set(String key, Object value)
void setName(FullName name)
void setShipName(String name)