Starsector API
Loading...
Searching...
No Matches
PerseanLeagueBlockade.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.intel.group;
2
3import java.util.Random;
4
5import org.lwjgl.util.vector.Vector2f;
6
7import com.fs.starfarer.api.Global;
8import com.fs.starfarer.api.campaign.CampaignFleetAPI;
9import com.fs.starfarer.api.campaign.FleetAssignment;
10import com.fs.starfarer.api.campaign.SectorEntityToken;
11import com.fs.starfarer.api.characters.PersonAPI;
12import com.fs.starfarer.api.combat.MutableStatWithTempMods;
13import com.fs.starfarer.api.impl.campaign.NPCHassler;
14import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
15import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
16import com.fs.starfarer.api.impl.campaign.ids.People;
17import com.fs.starfarer.api.impl.campaign.ids.Ranks;
18import com.fs.starfarer.api.impl.campaign.ids.Skills;
19import com.fs.starfarer.api.impl.campaign.intel.events.HostileActivityEventIntel;
20import com.fs.starfarer.api.impl.campaign.intel.events.PerseanLeagueHostileActivityFactor;
21import com.fs.starfarer.api.impl.campaign.intel.group.FGBlockadeAction.FGBlockadeParams;
22import com.fs.starfarer.api.impl.campaign.missions.FleetCreatorMission;
23import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.FleetQuality;
24import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.FleetSize;
25import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.OfficerNum;
26import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.OfficerQuality;
27import com.fs.starfarer.api.ui.TooltipMakerAPI;
28import com.fs.starfarer.api.util.Misc;
29
30
31
32public class PerseanLeagueBlockade extends BlockadeFGI {
33
34 public static float NUM_OTHER_FLEETS_MULT = 0.25f;
35
36 public static final String ARMADA = "$PLB_armada";
37 public static final String SUPPLY = "$PLB_supply";
38 public static final String GENERIC = "$PLB_generic";
39
40 //public static final String ABORTED_OR_ENDING = "$PLB_abortedOrEnding";
41 public static final String BLOCKADING = "$PLB_isBlockading";
42
43 public static String KEY = "$plBlockade_ref";
44 public static PerseanLeagueBlockade get() {
45 return (PerseanLeagueBlockade) Global.getSector().getMemoryWithoutUpdate().get(KEY);
46 }
47
48
49 public PerseanLeagueBlockade(GenericRaidParams params, FGBlockadeParams blockadeParams) {
50 super(params, blockadeParams);
51
52 Global.getSector().getMemoryWithoutUpdate().set(KEY, this);
53
54 PersonAPI reynard = People.getPerson(People.REYNARD_HANNAN);
55 if (reynard != null) {
56 Misc.makeImportant(reynard, "PLB");
57 }
58 }
59
60 @Override
61 protected void notifyEnding() {
62 super.notifyEnding();
63
64 Global.getSector().getMemoryWithoutUpdate().unset(KEY);
65
66 PersonAPI reynard = People.getPerson(People.REYNARD_HANNAN);
67 if (reynard != null) {
68 Misc.makeUnimportant(reynard, "PLB");
69 }
70 }
71
72 @Override
73 protected void notifyEnded() {
74 super.notifyEnded();
75 }
76
77
78
79
80
81 protected boolean createdArmada = false;
82 protected int supplyFleets = 0;
83
84 @Override
85 protected CampaignFleetAPI createFleet(int size, float damage) {
86
87 Random r = getRandom();
88
89 Vector2f loc = origin.getLocationInHyperspace();
90
91 FleetCreatorMission m = new FleetCreatorMission(r);
92 m.beginFleet();
93
94 boolean armada = size == 10 && !createdArmada;
95 boolean supplyFleet = size == 1 && supplyFleets < 2;
96
97 if (armada) {
98 createdArmada = true;
99
100 m.triggerCreateFleet(FleetSize.MAXIMUM, FleetQuality.SMOD_2, params.factionId, FleetTypes.LEAGUE_ARMADA, loc);
101 m.triggerSetFleetOfficers(OfficerNum.MORE, OfficerQuality.HIGHER);
102 m.triggerSetFleetFlag(ARMADA);
103
104 m.triggerSetFleetType(FleetTypes.LEAGUE_ARMADA);
105 m.triggerSetFleetDoctrineQuality(5, 5, 5);
106 m.triggerSetFleetDoctrineOther(5, 0);
107 m.triggerSetFleetComposition(0f, 0f, 0f, 0f, 0f);
108 m.triggerFleetMakeFaster(true, 1, false);
109
110 m.triggerFleetAddCommanderSkill(Skills.CREW_TRAINING, 1);
111 m.triggerFleetAddCommanderSkill(Skills.COORDINATED_MANEUVERS, 1);
112 m.triggerFleetAddCommanderSkill(Skills.TACTICAL_DRILLS, 1);
113 m.triggerFleetAddCommanderSkill(Skills.CARRIER_GROUP, 1);
114 } else if (supplyFleet) {
115 supplyFleets++;
116
117 int total = 0;
118 for (Integer i : params.fleetSizes) total += i;
119
120 FleetSize supplyFleetSize = FleetSize.MEDIUM;
121 if (total < 50) {
122 supplyFleetSize = FleetSize.SMALL;
123 } else if (total >= 80) {
124 supplyFleetSize = FleetSize.LARGE;
125 }
126
127 m.triggerCreateFleet(supplyFleetSize, FleetQuality.DEFAULT, params.factionId, FleetTypes.SUPPLY_FLEET, loc);
128 m.triggerSetFleetOfficers(OfficerNum.DEFAULT, OfficerQuality.DEFAULT);
129 m.triggerSetFleetFlag(SUPPLY);
130
131 m.triggerSetFleetType(FleetTypes.SUPPLY_FLEET);
132 m.triggerFleetMakeFaster(true, 0, false);
133
134 m.triggerSetFleetComposition(0.5f, 0.5f, 0.1f, 0f, 0.1f);
135 } else {
136 m.createFleet(params.style, size, params.factionId, loc);
137 m.triggerSetFleetFlag(GENERIC);
138 }
139
140 m.setFleetSource(params.source);
141 m.setFleetDamageTaken(damage);
142
143 m.triggerSetPatrol();
144 m.triggerMakeLowRepImpact();
145 m.triggerMakeAlwaysSpreadTOffHostility();
146
147
148 CampaignFleetAPI fleet = m.createFleet();
149
150 if (fleet != null && !armada && !supplyFleet) {
151 fleet.addScript(new NPCHassler(fleet, getTargetSystem()));
152 }
153
154 if (fleet != null && armada) {
155 fleet.getCommander().setRankId(Ranks.SPACE_ADMIRAL);
156 setNeverStraggler(fleet);
157 }
158
159 return fleet;
160 }
161
162// @Override
163// public void abort() {
164// if (!isAborted()) {
165// for (CampaignFleetAPI curr : getFleets()) {
166// curr.getMemoryWithoutUpdate().set(ABORTED_OR_ENDING, true);
167// }
168// }
169// super.abort();
170// }
171
172
173
174 @Override
175 public void advance(float amount) {
176 super.advance(amount);
177
178 if (isSpawnedFleets()) {
179 if (isEnded() || isEnding() || isAborted() || isCurrent(RETURN_ACTION)) {
180 for (CampaignFleetAPI curr : getFleets()) {
181 //curr.getMemoryWithoutUpdate().set(ABORTED_OR_ENDING, true);
182 curr.getMemoryWithoutUpdate().set(BLOCKADING, false);
183 }
184 return;
185 }
186
188 for (CampaignFleetAPI curr : getFleets()) {
189 curr.getMemoryWithoutUpdate().set(BLOCKADING, true);
190// curr.getMemoryWithoutUpdate().set(ARMADA, true);
191// curr.getMemoryWithoutUpdate().set(SUPPLY, true);
192 }
193 }
194 }
195 }
196
197 @Override
198 protected void periodicUpdate() {
199 super.periodicUpdate();
200
201 if (HostileActivityEventIntel.get() == null) { // ???
202 abort();
203 return;
204 }
205
206 FGAction action = getCurrentAction();
207 if (action instanceof FGBlockadeAction) {
208 MutableStatWithTempMods stat = HostileActivityEventIntel.get().getNumFleetsStat(getTargetSystem());
209 stat.addTemporaryModMult(1f, "PLBlockade", null, NUM_OTHER_FLEETS_MULT);
210 }
211
212 if (!isSpawnedFleets() || isSpawning()) return;
213
214 int armada = 0;
215 int supply = 0;
216 for (CampaignFleetAPI curr : getFleets()) {
217 if (curr.getMemoryWithoutUpdate().getBoolean(ARMADA)) {
218 armada++;
219 }
220 if (curr.getMemoryWithoutUpdate().getBoolean(SUPPLY)) {
221 supply++;
222 }
223 }
224
225 if (armada <= 0 || supply <= 0) {
226 abort();
227 return;
228 }
229
230 if (action instanceof FGBlockadeAction) {
231 FGBlockadeAction blockade = (FGBlockadeAction) action;
232 if (blockade.getPrimary() != null) {
233 int supplyIndex = 0;
234 for (CampaignFleetAPI curr : getFleets()) {
235 if (blockade.getPrimary().getContainingLocation() != curr.getContainingLocation()) {
236 continue;
237 }
238 if (curr.getMemoryWithoutUpdate().getBoolean(SUPPLY)) {
239 Misc.setFlagWithReason(curr.getMemoryWithoutUpdate(), MemFlags.FLEET_BUSY, curr.getId(), true, -1f);
240
241 curr.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_FLEET_DO_NOT_GET_SIDETRACKED, true, 0.4f);
242 curr.clearAssignments();
243
244 SectorEntityToken resupplyLoc = blockade.getPrimary();
245 if (supplyIndex == 1) {
246 for (SectorEntityToken jp : blockade.getBlockadePoints()) {
247 if (jp != resupplyLoc) {
248 resupplyLoc = jp;
249 break;
250 }
251 }
252 }
253 curr.addAssignment(FleetAssignment.ORBIT_PASSIVE, resupplyLoc, 3f,
254 "standing by to provide resupply");
255 supplyIndex++;
256 } else if (curr.getMemoryWithoutUpdate().getBoolean(ARMADA)) {
257
258 } else {
259 curr.getMemoryWithoutUpdate().set(MemFlags.WILL_HASSLE_PLAYER, true, 2f);
260 curr.getMemoryWithoutUpdate().set(MemFlags.HASSLE_TYPE, PerseanLeagueHostileActivityFactor.HASSLE_REASON, 2f);
261 }
262 }
263 }
264 }
265 }
266
267
268
269 @Override
270 protected void addPostAssessmentSection(TooltipMakerAPI info, float width, float height, float opad) {
271
272 info.addPara("The blockading forces are led by a Grand Armada and "
273 + "supported by a pair of supply fleets.", opad);
274// bullet(info);
275// info.addPara("Forcing the Grand Armada to withdraw will defeat the blockade", opad);
276// info.addPara("Forcing both supply fleets to withdraw will defeat the blockade", 0f);
277// unindent(info);
278 }
279
280
281
282
283}
284
285
286
287
static SectorAPI getSector()
Definition Global.java:59
PerseanLeagueBlockade(GenericRaidParams params, FGBlockadeParams blockadeParams)
void addPostAssessmentSection(TooltipMakerAPI info, float width, float height, float opad)