Starsector API
Loading...
Searching...
No Matches
DistressCallNormalAssignmentAI.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.events.nearby;
2
3import java.util.ArrayList;
4import java.util.List;
5
6import com.fs.starfarer.api.Global;
7import com.fs.starfarer.api.campaign.CampaignFleetAPI;
8import com.fs.starfarer.api.campaign.CustomCampaignEntityAPI;
9import com.fs.starfarer.api.campaign.FleetAssignment;
10import com.fs.starfarer.api.campaign.SectorEntityToken;
11import com.fs.starfarer.api.campaign.StarSystemAPI;
12import com.fs.starfarer.api.campaign.SectorEntityToken.VisibilityLevel;
13import com.fs.starfarer.api.campaign.rules.MemoryAPI;
14import com.fs.starfarer.api.fleet.FleetMemberAPI;
15import com.fs.starfarer.api.impl.campaign.CargoPodsEntityPlugin;
16import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
17import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseAssignmentAI;
18import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.CargoPods;
19import com.fs.starfarer.api.util.Misc;
20
21public class DistressCallNormalAssignmentAI extends BaseAssignmentAI {
22
23 protected StarSystemAPI system;
24 protected SectorEntityToken jumpPoint;
25
26 protected float elapsed = 0f;
27 protected float dur = 30f + (float) Math.random() * 20f;
28 protected boolean contactedPlayer = false;
29
30 public DistressCallNormalAssignmentAI(CampaignFleetAPI fleet, StarSystemAPI system, SectorEntityToken jumpPoint) {
31 super();
32 this.fleet = fleet;
33 this.system = system;
34 this.jumpPoint = jumpPoint;
35
37 }
38
39 @Override
40 protected void giveInitialAssignments() {
41 fleet.addAssignment(FleetAssignment.ORBIT_AGGRESSIVE, jumpPoint, 30f);
42 }
43
44 @Override
45 protected void pickNext() {
46 fleet.addAssignment(FleetAssignment.ORBIT_AGGRESSIVE, jumpPoint, 30f);
47 }
48
49 @Override
50 public void advance(float amount) {
51 super.advance(amount);
52
53 if (!fleet.getMemoryWithoutUpdate().contains("$distress")) {
54 //fleet.getMemoryWithoutUpdate().unset(MemFlags.ENTITY_MISSION_IMPORTANT);
55
56 Misc.giveStandardReturnToSourceAssignments(fleet);
57 fleet.removeScript(this);
58 return;
59 }
60
61 float days = Global.getSector().getClock().convertToDays(amount);
62 boolean playerNearby = Misc.getDistanceToPlayerLY(fleet) <= 3f;
63
64 elapsed += days;
65
66// if (!playerNearby && elapsed >= dur && fleet.getBattle() == null) {
67// fleet.despawn(FleetDespawnReason.OTHER, null);
68// }
69// if (fleet.isDespawning()) return;
70
71
72 if (elapsed >= dur - 10f) {
73 boolean seesPlayer = false;
74 if (playerNearby) {
75 VisibilityLevel level = fleet.getVisibilityLevelOfPlayerFleet();
76 seesPlayer |= level == VisibilityLevel.COMPOSITION_DETAILS;
77 seesPlayer |= level == VisibilityLevel.COMPOSITION_AND_FACTION_DETAILS;
78 }
79 if (!seesPlayer) {
80 undistress(fleet);
81 int crewToLeave = (int) (fleet.getFleetData().getMinCrew() * 0.5f);
82 scuttleShips(fleet, crewToLeave);
83 leaveCrewInPods(fleet, crewToLeave);
84 }
85 }
86
87 if (fleet.isInCurrentLocation() && !contactedPlayer) {
88 VisibilityLevel level = fleet.getVisibilityLevelOfPlayerFleet();
89 if (level != VisibilityLevel.NONE &&
90 level != VisibilityLevel.SENSOR_CONTACT) {
91 contactedPlayer = true;
92 fleet.clearAssignments();
93 fleet.addAssignment(FleetAssignment.INTERCEPT, Global.getSector().getPlayerFleet(), 30f, "approaching your fleet");
94 }
95 }
96 }
97
98 public static void leaveCrewInPods(CampaignFleetAPI fleet, int crew) {
99 CustomCampaignEntityAPI pods = Misc.addCargoPods(fleet.getContainingLocation(), fleet.getLocation());
100 CargoPodsEntityPlugin plugin = (CargoPodsEntityPlugin)pods.getCustomPlugin();
101 plugin.setExtraDays(100f);
102 pods.getCargo().addCrew(crew);
103 CargoPods.stabilizeOrbit(pods, false);
104
105 //int machinery = crew / 10;
106 //pods.setDiscoverable(true);
107 }
108
109
110 public static void undistress(SectorEntityToken fleet) {
111 MemoryAPI memory = fleet.getMemoryWithoutUpdate();
112 memory.unset("$distress");
113 memory.unset(MemFlags.MEMORY_KEY_NO_JUMP);
114
115 //memory.unset(MemFlags.ENTITY_MISSION_IMPORTANT);
116 Misc.setFlagWithReason(fleet.getMemoryWithoutUpdate(), MemFlags.ENTITY_MISSION_IMPORTANT,
117 "distress", false, 1000f);
118 }
119
120 public static void scuttleShips(CampaignFleetAPI fleet, int crewFreed) {
121 List<FleetMemberAPI> members = new ArrayList<FleetMemberAPI>(fleet.getFleetData().getMembersListCopy());
122 float scuttledCrewRoom = 0;
123 for (int i = members.size() - 1; i >= 0 && scuttledCrewRoom < crewFreed; i--) {
124 FleetMemberAPI member = members.get(i);
125 fleet.removeFleetMemberWithDestructionFlash(member);
126 scuttledCrewRoom += member.getMinCrew();
127 }
128 }
129
130}
131
132
133
134
135
136
137
138
139
140
141
142
static SectorAPI getSector()
Definition Global.java:59
DistressCallNormalAssignmentAI(CampaignFleetAPI fleet, StarSystemAPI system, SectorEntityToken jumpPoint)