1package com.fs.starfarer.api.impl.campaign.intel.misc;
4import java.util.ArrayList;
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.CampaignTerrainAPI;
13import com.fs.starfarer.api.campaign.FactionAPI;
14import com.fs.starfarer.api.campaign.PlanetAPI;
15import com.fs.starfarer.api.campaign.SectorEntityToken;
16import com.fs.starfarer.api.campaign.StarSystemAPI;
17import com.fs.starfarer.api.campaign.comm.IntelInfoPlugin;
18import com.fs.starfarer.api.campaign.rules.MemoryAPI;
19import com.fs.starfarer.api.impl.campaign.entities.GateHaulerEntityPlugin;
20import com.fs.starfarer.api.impl.campaign.ids.Drops;
21import com.fs.starfarer.api.impl.campaign.ids.Entities;
22import com.fs.starfarer.api.impl.campaign.ids.Factions;
23import com.fs.starfarer.api.impl.campaign.ids.Tags;
24import com.fs.starfarer.api.impl.campaign.intel.BaseIntelPlugin;
25import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseThemeGenerator;
26import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseThemeGenerator.AddedEntity;
27import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseThemeGenerator.EntityLocation;
28import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseThemeGenerator.OrbitGap;
29import com.fs.starfarer.api.impl.campaign.rulecmd.missions.GateHaulerCMD;
30import com.fs.starfarer.api.impl.campaign.terrain.DebrisFieldTerrainPlugin.DebrisFieldParams;
31import com.fs.starfarer.api.impl.campaign.terrain.DebrisFieldTerrainPlugin.DebrisFieldSource;
32import com.fs.starfarer.api.loading.Description;
33import com.fs.starfarer.api.loading.Description.Type;
34import com.fs.starfarer.api.ui.Alignment;
35import com.fs.starfarer.api.ui.SectorMapAPI;
36import com.fs.starfarer.api.ui.TooltipMakerAPI;
37import com.fs.starfarer.api.util.Misc;
47 public static enum GateHaulerAction {
73 protected GateHaulerAction
action =
null;
121 getPlugin().getMovement().setFaceInOppositeDirection(
false);
122 getPlugin().getMovement().setTurnThenAccelerate(
true);
125 gateHauler.getMemoryWithoutUpdate().set(
"$deploying",
true);
153 getPlugin().getMovement().setFaceInOppositeDirection(
false);
154 getPlugin().getMovement().setTurnThenAccelerate(
true);
157 gateHauler.getMemoryWithoutUpdate().set(
"$inTransit",
true);
167 float brakeTime = GateHaulerEntityPlugin.MAX_SPEED / GateHaulerEntityPlugin.ACCELERATION;
168 float brakeDist = GateHaulerEntityPlugin.MAX_SPEED * 0.5f * brakeTime;
170 Vector2f spawnLoc = Misc.getUnitVectorAtDegreeAngle(
departureAngle + 180f);
171 Vector2f spawnVel =
new Vector2f(spawnLoc);
173 spawnVel.scale(GateHaulerEntityPlugin.MAX_SPEED);
175 spawnLoc.scale(brakeDist * 1f + 4000f);
176 Vector2f.add(spawnLoc,
parkingOrbit.getLocation(), spawnLoc);
180 gateHauler.removeTag(Tags.FADING_OUT_AND_EXPIRING);
181 gateHauler.setAlwaysUseSensorFaderBrightness(
null);
189 getPlugin().getMovement().setLocation(spawnLoc);
190 getPlugin().getMovement().setVelocity(spawnVel);
194 getPlugin().getMovement().setTurnThenAccelerate(
true);
195 getPlugin().getMovement().setFaceInOppositeDirection(
true);
200 float minDist = 4000f;
201 float maxDist = 8000f;
203 SectorEntityToken found =
null;
204 for (SectorEntityToken curr :
destination.getEntitiesWithTag(Tags.STABLE_LOCATION)) {
205 float dist = curr.getLocation().length();
206 if (dist >= minDist && dist <= 8000f) {
213 if (curr.isMoon())
continue;
214 float dist = curr.getLocation().length();
215 if (dist >= minDist && dist <= 8000f) {
223 Vector2f loc = Misc.getPointAtRadius(found.getLocation(), found.getRadius() + 400f);
225 float orbitRadius = found.getRadius() + 250f;
226 float orbitDays = orbitRadius / (20f + Misc.random.nextFloat() * 5f);
227 parkingOrbit.setCircularOrbit(found, Misc.random.nextFloat() * 360f, orbitRadius, orbitDays);
229 List<OrbitGap> gaps = BaseThemeGenerator.findGaps(
231 if (!gaps.isEmpty()) {
232 OrbitGap gap = gaps.get(0);
233 float orbitRadius = (gap.start + gap.end) * 0.5f;
234 Vector2f loc = Misc.getPointAtRadius(
destination.getCenter().getLocation(), orbitRadius);
238 float orbitDays = orbitRadius / (20f + Misc.random.nextFloat() * 5f);
239 parkingOrbit.setCircularOrbit(
destination.getCenter(), Misc.random.nextFloat() * 360f, orbitRadius, orbitDays);
245 float orbitRadius = minDist + (maxDist - minDist) * Misc.random.nextFloat();
246 Vector2f loc = Misc.getPointAtRadius(
destination.getCenter().getLocation(), orbitRadius);
250 float orbitDays = orbitRadius / (20f + Misc.random.nextFloat() * 5f);
251 parkingOrbit.setCircularOrbit(
destination.getCenter(), Misc.random.nextFloat() * 360f, orbitRadius, orbitDays);
264 return (GateHaulerEntityPlugin)
gateHauler.getCustomPlugin();
269 super.advance(amount);
272 float days = Misc.getDays(amount);
284 if (
action == GateHaulerAction.OUTBOUND) {
285 float speed =
gateHauler.getVelocity().length();
286 float dist =
gateHauler.getLocation().length();
288 boolean nearPlayer = pf !=
null &&
gateHauler.isInCurrentLocation() &&
291 speed >= GateHaulerEntityPlugin.MAX_SPEED * 0.95f && dist > 40000f) {
293 setAction(GateHaulerAction.DEEP_SPACE_TRANSIT);
298 if (
action == GateHaulerAction.DEEP_SPACE_TRANSIT) {
305 if (
action == GateHaulerAction.INBOUND) {
307 float speed =
gateHauler.getVelocity().length();
310 boolean overshot = Misc.isInArc(
gateHauler.getFacing(), 270f,
312 if (overshot || dist < 700f) {
313 getPlugin().getMovement().setTurnThenAccelerate(
false);
314 getPlugin().getMovement().setFaceInOppositeDirection(
false);
324 getPlugin().getMovement().setFaceInOppositeDirection(
false);
327 float orbitDays = 1000000f;
331 for (
int i = 0; i < 10; i++) {
332 getPlugin().getEngineGlow().showIdling();
336 gateHauler.getMemoryWithoutUpdate().unset(
"$inTransit");
339 String key =
"$witnessedGateHaulerArrival";
341 if (!mem.getBoolean(key)) {
343 if (distToPlayer < 2000f) {
354 if (
action == GateHaulerAction.DEPLOYING) {
361 float speed =
gateHauler.getVelocity().length();
365 getPlugin().getMovement().setTurnThenAccelerate(
false);
368 if (!
gateHauler.isInCurrentLocation()) test = 400f;
376 float orbitDays = 1000000f;
386 EntityLocation loc =
new EntityLocation();
392 AddedEntity added = BaseThemeGenerator.addNonSalvageEntity(
393 stableLocation.getStarSystem(), loc, Entities.INACTIVE_GATE, Factions.NEUTRAL);
395 gateHauler.getMemoryWithoutUpdate().unset(
"$deploying");
401 if (added.entity !=
null) {
402 Misc.fadeIn(added.entity, 3f);
413 DebrisFieldParams params =
new DebrisFieldParams(
418 params.source = DebrisFieldSource.MIXED;
420 params.baseSalvageXP = (long) 500;
422 SectorEntityToken debris = (CampaignTerrainAPI) Misc.addDebrisField(
425 debris.setDiscoverable(
null);
426 debris.setDiscoveryXP(
null);
428 debris.addDropValue(Drops.EXTENDED, 100000);
440 Color h = Misc.getHighlightColor();
441 Color g = Misc.getGrayColor();
446 Color base = faction.getBaseUIColor();
447 Color dark = faction.getDarkUIColor();
450 if (mode == ListInfoMode.IN_DESC) initPad = opad;
459 info.addPara(
"Entered open space", tc, initPad);
460 String dStr =
"days";
462 info.addPara(
"Estimated %s " + dStr +
" to complete transit", initPad, tc,
467 info.addPara(
"Arrived at " +
destination.getNameWithLowercaseType(), tc, initPad);
471 info.addPara(
"Witnessed the arrival of a Gate Hauler to a star system", tc, initPad);
476 if (mode == ListInfoMode.INTEL) {
477 String locStr =
gateHauler.getContainingLocation().getNameWithLowercaseTypeShort();
478 if (
gateHauler.getContainingLocation() !=
null &&
gateHauler.getContainingLocation().isDeepSpace()) {
479 locStr =
"deep space";
480 }
else if (
gateHauler.getContainingLocation() !=
null) {
481 locStr =
gateHauler.getContainingLocation().getNameWithLowercaseTypeShort();
483 if (
getPlugin().isInTransit() &&
action == GateHaulerAction.DEEP_SPACE_TRANSIT) {
484 locStr =
"transiting deep space";
487 info.addPara(
"Location: " + locStr, tc, initPad);
490 GateHaulerEntityPlugin plugin =
getPlugin();
491 if (!plugin.isActivated()) {
492 info.addPara(
"Status: dormant", tc, initPad);
493 }
else if (plugin.isActivating()) {
494 info.addPara(
"Status: activating", tc, initPad);
495 }
else if (
action ==
null) {
496 info.addPara(
"Status: operational", tc, initPad);
497 }
else if (
action == GateHaulerAction.OUTBOUND) {
498 info.addPara(
"Departing current location", tc, initPad);
500 String dStr =
"days";
502 info.addPara(
"Estimated %s " + dStr +
" for transit", initPad, tc,
504 }
else if (
action == GateHaulerAction.DEEP_SPACE_TRANSIT) {
505 String dStr =
"days";
507 if (daysRemaining < 1) daysRemaining = 1;
508 if (daysRemaining == 1) dStr =
"day";
509 info.addPara(
"Estimated %s " + dStr +
" to complete transit", initPad, tc,
510 h,
"" + daysRemaining);
511 }
else if (
action == GateHaulerAction.INBOUND) {
512 info.addPara(
"Arriving at " +
destination.getNameWithLowercaseType(), tc, initPad);
534 info.addPara(pre +
getName() + post, c, 0f);
540 Color h = Misc.getHighlightColor();
541 Color g = Misc.getGrayColor();
542 Color tc = Misc.getTextColor();
546 if (
gateHauler.getCustomInteractionDialogImageVisual() !=
null) {
547 info.addImage(
gateHauler.getCustomInteractionDialogImageVisual().getSpriteName(), width, opad);
551 info.addPara(desc.getText1(), opad);
554 Color base = faction.getBaseUIColor();
555 Color dark = faction.getDarkUIColor();
557 info.addSectionHeading(
"Status", base, dark, Alignment.MID, opad);
559 GateHaulerEntityPlugin plugin =
getPlugin();
560 if (!plugin.isActivated()) {
561 GateHaulerCMD cmd =
new GateHaulerCMD();
562 info.addPara(
"The gate hauler is dormant, its systems shut down to conserve power.", opad);
563 info.showCost(
"Resources required to activate:",
false, base, dark, opad, cmd.getResources(), cmd.getQuantities());
564 }
else if (plugin.isActivating()) {
565 info.addPara(
"The gate hauler is in the process of reactivating its systems and should be operational "
566 +
"within a day.", opad);
567 }
else if (
action ==
null) {
568 info.addPara(
"The gate hauler is operational and ready to travel to another star system or "
569 +
"deploy its gate at a stable location.", opad);
570 }
else if (
action == GateHaulerAction.OUTBOUND) {
571 info.addPara(
"The gate hauler is outbound from its current location, "
572 +
"heading for open space and accelerating.", opad);
574 String dStr =
"days";
576 info.addPara(
"Once it's in open space, it's estimated that it will take %s " + dStr +
" until it arrives "
577 +
"to its destination, the " +
destination.getNameWithLowercaseTypeShort() +
". On arrival, "
578 +
"it will take some time to decelerate and attain a parking orbit.", opad,
580 }
else if (
action == GateHaulerAction.DEEP_SPACE_TRANSIT) {
581 String dStr =
"days";
583 if (daysRemaining < 1) daysRemaining = 1;
584 if (daysRemaining == 1) dStr =
"day";
585 info.addPara(
"The gate hauler is in transit, in deep space. It's estimated that it will take %s " + dStr +
" until it arrives "
586 +
"to its destination, the " +
destination.getNameWithLowercaseTypeShort() +
". On arrival, "
587 +
"it will take some time to decelerate and attain a parking orbit.", opad,
588 h,
"" + daysRemaining);
589 }
else if (
action == GateHaulerAction.INBOUND) {
590 info.addPara(
"The gate hauler has arrived to the " +
destination.getNameWithLowercaseTypeShort() +
" "
591 +
"and is decelerating in order to attain a parking orbit.", opad);
592 }
else if (
action == GateHaulerAction.DEPLOYING) {
593 info.addPara(
"The gate hauler has been given an order to deploy its gate.", opad);
608 Set<String> tags = super.getIntelTags(map);
609 tags.add(Tags.INTEL_GATES);
610 tags.add(Tags.INTEL_EXPLORATION);
615 return super.getSortString();
620 return "Gate Hauler";
644 return "ui_discovered_entity";
657 boolean showArrow =
action == GateHaulerAction.OUTBOUND ||
action == GateHaulerAction.DEEP_SPACE_TRANSIT;
658 if (!showArrow)
return null;
664 List<ArrowData> result =
new ArrayList<ArrowData>();
static SettingsAPI getSettings()
static SectorAPI getSector()
void unindent(TooltipMakerAPI info)
void sendUpdateIfPlayerHasIntel(Object listInfoParam, TextPanelAPI textPanel)
Object getListInfoParam()
Color getBulletColorForMode(ListInfoMode mode)
void bullet(TooltipMakerAPI info)
Color getTitleColor(ListInfoMode mode)
void createIntelInfo(TooltipMakerAPI info, ListInfoMode mode)
GateHaulerIntel(SectorEntityToken gateHauler)
SectorEntityToken stableLocation
String getCommMessageSound()
FactionAPI getFactionForUIColors()
GateHaulerEntityPlugin getPlugin()
static float TRANSIT_DAYS_BASE
int computeTransitDays(StarSystemAPI destination)
List< ArrowData > getArrowData(SectorMapAPI map)
void createSmallDescription(TooltipMakerAPI info, float width, float height)
static float TRANSIT_SPEED_LY_PER_CYCLE
void advance(float amount)
StarSystemAPI destination
String getSmallDescriptionTitle()
void setAction(GateHaulerAction action)
Set< String > getIntelTags(SectorMapAPI map)
SectorEntityToken gateHauler
static Object UPDATE_WITNESSED_ARRIVAL
void initiateDeployment(SectorEntityToken stableLocation)
void initiateDeparture(StarSystemAPI destination)
SectorEntityToken getMapLocation(SectorMapAPI map)
SectorEntityToken parkingOrbit
void addBulletPoints(TooltipMakerAPI info, ListInfoMode mode)
float elapsedDaysInAction
SectorEntityToken getGateHauler()
Description getDescription(String id, Type type)
String getSpriteName(String category, String id)