Starsector API
Loading...
Searching...
No Matches
GenericRaidFGI.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.intel.group;
2
3import java.awt.Color;
4import java.util.ArrayList;
5import java.util.List;
6import java.util.Random;
7import java.util.Set;
8
9import org.lwjgl.util.vector.Vector2f;
10
11import com.fs.starfarer.api.Global;
12import com.fs.starfarer.api.campaign.CampaignFleetAPI;
13import com.fs.starfarer.api.campaign.FactionAPI;
14import com.fs.starfarer.api.campaign.SectorEntityToken;
15import com.fs.starfarer.api.campaign.StarSystemAPI;
16import com.fs.starfarer.api.campaign.econ.MarketAPI;
17import com.fs.starfarer.api.impl.campaign.ids.Factions;
18import com.fs.starfarer.api.impl.campaign.intel.group.FGRaidAction.FGRaidParams;
19import com.fs.starfarer.api.impl.campaign.missions.FleetCreatorMission;
20import com.fs.starfarer.api.impl.campaign.missions.FleetCreatorMission.FleetStyle;
21import com.fs.starfarer.api.impl.campaign.missions.hub.BaseHubMission;
22import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.ComplicationRepImpact;
23import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.MarketCMD.BombardType;
24import com.fs.starfarer.api.ui.Alignment;
25import com.fs.starfarer.api.ui.LabelAPI;
26import com.fs.starfarer.api.ui.SectorMapAPI;
27import com.fs.starfarer.api.ui.TooltipMakerAPI;
28import com.fs.starfarer.api.util.Misc;
29import com.fs.starfarer.api.util.WeightedRandomPicker;
30
31public class GenericRaidFGI extends FleetGroupIntel {
32
33 public static String PREPARE_ACTION = "prepare_action";
34 public static String TRAVEL_ACTION = "travel_action";
35 public static String PAYLOAD_ACTION = "payload_action";
36 public static String RETURN_ACTION = "return_action";
37
38
39 public static interface GenericPayloadAction extends FGAction {
40 Color getSystemNameHighlightColor();
41 float getSuccessFraction();
42 StarSystemAPI getWhere();
43
44 }
45
46 public static class GenericRaidParams {
47 public Random random = new Random();
48 public boolean playerTargeted;
49 public boolean remnant = false;
50 public MarketAPI source;
51 public String factionId;
52 public List<Integer> fleetSizes = new ArrayList<Integer>();
53 public FleetStyle style = FleetStyle.STANDARD;
54 public FGRaidParams raidParams = new FGRaidParams();
55 public float prepDays = 5f;
56 public float payloadDays = 30f;
57 public boolean makeFleetsHostile = true;
58 public ComplicationRepImpact repImpact = ComplicationRepImpact.LOW;
59 public String noun;
60 public String forcesNoun;
61 public Object custom;
62 public String memoryKey = null;
63
64 public GenericRaidParams(Random random, boolean playerTargeted) {
65 this.random = random;
66 this.playerTargeted = playerTargeted;
67 //makeFleetsHostile = playerTargeted; // now supported: making fleets hostile to arbitrary factions
68 }
69
70 }
71
72 protected GenericRaidParams params;
73 protected SectorEntityToken origin;
74 protected GenericPayloadAction raidAction;
78
79 public static GenericRaidFGI get(String key) {
80 return (GenericRaidFGI) Global.getSector().getMemoryWithoutUpdate().get(key);
81 }
82
83 public GenericRaidFGI(GenericRaidParams params) {
84 if (params != null) {
85 this.params = params;
86 setRandom(params.random);
88
89 if (params.memoryKey != null) {
90 Global.getSector().getMemoryWithoutUpdate().set(params.memoryKey, this);
91 }
92 }
93 }
94
95 @Override
96 protected void notifyEnding() {
97 super.notifyEnding();
98 if (params != null && params.memoryKey != null) {
99 Global.getSector().getMemoryWithoutUpdate().unset(params.memoryKey);
100 }
101 }
102
103 protected void initActions() {
104 setFaction(params.factionId);
105 waitAction = new FGWaitAction(params.source.getPrimaryEntity(), params.prepDays,
106 "preparing for departure");
108
110
111 travelAction = new FGTravelAction(params.source.getPrimaryEntity(),
112 raidAction.getWhere().getCenter());
113
116
117 SectorEntityToken returnWhere = params.source.getPrimaryEntity();
118 if (returnWhere.getStarSystem() != null) {
119 returnWhere = returnWhere.getStarSystem().getCenter();
120 }
121 returnAction = new FGTravelAction(raidAction.getWhere().getCenter(),
122 params.source.getPrimaryEntity());
123 returnAction.setTravelText("returning to " + params.source.getPrimaryEntity().getName());
125
126 origin = params.source.getPrimaryEntity();
127
128 int total = 0;
129 for (Integer i : params.fleetSizes) total += i;
130 createRoute(params.factionId, total, params.fleetSizes.size(), null);
131 }
132
133 protected GenericPayloadAction createPayloadAction() {
134 return new FGRaidAction(params.raidParams, params.payloadDays);
135 }
136
137 protected void spawnFleets() {
138
139 Float damage = null;
140 if (route != null && route.getExtra() != null) {
141 damage = route.getExtra().damage;
142 }
143 if (damage == null) damage = 0f;
144
145 WeightedRandomPicker<Integer> picker = new WeightedRandomPicker<Integer>(getRandom());
146 picker.addAll(params.fleetSizes);
147
148 int total = 0;
149 for (Integer i : params.fleetSizes) total += i;
150
151 float spawnsToSkip = total * damage * 0.5f;
152 float skipped = 0f;
153
154 //FactionAPI faction = Global.getSector().getFaction(params.factionId);
155
156// picker.add(1);
157// picker.add(1);
158
159 while (!picker.isEmpty()) {
160 Integer size = picker.pickAndRemove();
161 if (skipped < spawnsToSkip && getRandom().nextFloat() < damage) {
162 skipped += size;
163 continue;
164 }
165
166 CampaignFleetAPI fleet = createFleet(size, damage);
167
168 if (fleet != null && route != null) {
169 setLocationAndCoordinates(fleet, route.getCurrent());
170 fleets.add(fleet);
171 }
172 }
173 }
174
175 protected CampaignFleetAPI createFleet(int size, float damage) {
176 Vector2f loc = origin.getLocationInHyperspace();
177 boolean pirate = faction.getCustomBoolean(Factions.CUSTOM_PIRATE_BEHAVIOR);
178
179 FleetCreatorMission m = new FleetCreatorMission(getRandom());
180
181 preConfigureFleet(size, m);
182
183 m.beginFleet();
184
185 String factionId = getFleetCreationFactionOverride(size);
186 if (factionId == null) factionId = params.factionId;
187
188 m.createFleet(params.style, size, factionId, loc);
189 m.triggerSetFleetFaction(params.factionId);
190
191 m.setFleetSource(params.source);
192 m.setFleetDamageTaken(damage);
193 if (pirate) {
194 m.triggerSetPirateFleet();
195 } else {
196 m.triggerSetWarFleet();
197 }
198
199 if (params.remnant) {
200 m.triggerSetRemnantConfigActive();
201 }
202
203 if (params.makeFleetsHostile) {
204 for (MarketAPI market : params.raidParams.allowedTargets) {
205 m.triggerMakeHostileToFaction(market.getFactionId());
206 }
207 m.triggerMakeHostile();
208 if (Factions.LUDDIC_PATH.equals(faction.getId())) {
209 m.triggerFleetPatherNoDefaultTithe();
210 }
211 }
212
213 if (params.repImpact == ComplicationRepImpact.LOW || params.repImpact == null) {
214 m.triggerMakeLowRepImpact();
215 } else if (params.repImpact == ComplicationRepImpact.NONE) {
216 m.triggerMakeNoRepImpact();
217 }
218
219 if (params.repImpact != ComplicationRepImpact.FULL) {
220 m.triggerMakeAlwaysSpreadTOffHostility();
221 }
222
223 configureFleet(size, m);
224
225 CampaignFleetAPI fleet = m.createFleet();
226 if (fleet != null) {
227 configureFleet(size, fleet);
228 }
229
230 return fleet;
231 }
232
233 protected String getFleetCreationFactionOverride(int size) {
234 return null;
235 }
236
237 protected void preConfigureFleet(int size, FleetCreatorMission m) {
238
239 }
240 protected void configureFleet(int size, FleetCreatorMission m) {
241
242 }
243
244 protected void configureFleet(int size, CampaignFleetAPI fleet) {
245
246 }
247
248 protected void addTargetingBulletPoint(TooltipMakerAPI info, Color tc, Object param, ListInfoMode mode, float initPad) {
249 StarSystemAPI system = raidAction.getWhere();
250 Color s = raidAction.getSystemNameHighlightColor();
251 LabelAPI label = info.addPara("Targeting the " + system.getNameWithLowercaseTypeShort(), tc, initPad);
252 label.setHighlightColors(s);
253 label.setHighlight(system.getNameWithNoType());
254 }
255
256 protected void addNonUpdateBulletPoints(TooltipMakerAPI info, Color tc, Object param, ListInfoMode mode, float initPad) {
257 Color h = Misc.getHighlightColor();
258 Color s = raidAction.getSystemNameHighlightColor();
259 FGAction curr = getCurrentAction();
260 StarSystemAPI system = raidAction.getWhere();
261 String forces = getForcesNoun();
262
263 float untilDeployment = getETAUntil(PREPARE_ACTION);
264 float untilDeparture = getETAUntil(TRAVEL_ACTION);
265 float untilRaid = getETAUntil(PAYLOAD_ACTION);
266 float untilReturn = getETAUntil(RETURN_ACTION, true);
267 if (!isEnding()) {
268 if (mode == ListInfoMode.MESSAGES || getElapsed() <= 0f) { // initial notification only, not updates
269 addTargetingBulletPoint(info, tc, param, mode, initPad);
270 initPad = 0f;
271 }
272 if (untilDeployment > 0) {
273 addETABulletPoints(null, null, false, untilDeployment, ETAType.DEPLOYMENT, info, tc, initPad);
274 initPad = 0f;
275 } else if (untilDeparture > 0) {
276 addETABulletPoints(null, null, false, untilDeparture, ETAType.DEPARTURE, info, tc, initPad);
277 initPad = 0f;
278 }
279 if (untilRaid > 0 && getSource().getContainingLocation() != system) {
280 addETABulletPoints(system.getNameWithLowercaseTypeShort(), s, false, untilRaid, ETAType.ARRIVING,
281 info, tc, initPad);
282 initPad = 0f;
283 }
284 if (untilReturn > 0 && RETURN_ACTION.equals(curr.getId()) && getSource().getContainingLocation() != system &&
285 mode != ListInfoMode.INTEL) {
286 StarSystemAPI from = getSource().getStarSystem();
287
288 addETABulletPoints(from.getNameWithLowercaseTypeShort(), null, false, untilReturn, ETAType.RETURNING,
289 info, tc, initPad);
290 initPad = 0f;
291 }
292 if ((mode == ListInfoMode.INTEL || mode == ListInfoMode.MAP_TOOLTIP)
293 && curr != null && curr.getId().equals(PAYLOAD_ACTION)) {
294 LabelAPI label = info.addPara("Operating in the " + system.getNameWithLowercaseTypeShort(), tc, initPad);
295 label.setHighlightColors(s);
296 label.setHighlight(system.getNameWithNoType());
297 initPad = 0f;
298 }
299 }
300
301 if (mode != ListInfoMode.IN_DESC && isEnding()) {
302 if (!isSucceeded()) {
303 if (!isAborted() && !isFailed()) {
304 info.addPara("The " + forces + " have failed to achieve their objective", tc, initPad);
305 } else {
307 info.addPara("The " + forces + " have failed to achieve their objective", tc, initPad);
308 } else {
309 info.addPara("The " + forces + " have been defeated and scatter", tc, initPad);
310 }
311 }
312 }
313 }
314 }
315
316 protected void addUpdateBulletPoints(TooltipMakerAPI info, Color tc, Object param, ListInfoMode mode, float initPad) {
317 StarSystemAPI system = raidAction.getWhere();
318 String forces = getForcesNoun();
319 String noun = getNoun();
320 Color s = raidAction.getSystemNameHighlightColor();
321 //Color h = Misc.getHighlightColor();
322 if (ABORT_UPDATE.equals(param)) {
323 if (isInPreLaunchDelay()) {
324 info.addPara("The " + noun + " was aborted in the planning stages", tc, initPad);
325 } else {
326 info.addPara("The " + forces + " have been defeated and scatter", tc, initPad);
327 }
328 } else if (FLEET_LAUNCH_UPDATE.equals(param)) {
329 float untilDeparture = getETAUntil(TRAVEL_ACTION);
330 float untilRaid = getETAUntil(PAYLOAD_ACTION);
331 info.addPara("Fleet deployment in progress", tc, initPad);
332 initPad = 0f;
333 if (untilDeparture > 0) {
334 addETABulletPoints(null, null, false, untilDeparture, ETAType.DEPARTURE, info, tc, initPad);
335 }
336 if (untilRaid > 0 && getSource().getContainingLocation() != system) {
337 addETABulletPoints(system.getNameWithLowercaseTypeShort(), s, false, untilRaid, ETAType.ARRIVING,
338 info, tc, initPad);
339 }
340 } else if (PREPARE_ACTION.equals(param)) {
341 float untilRaid = getETAUntil(PAYLOAD_ACTION);
342 addETABulletPoints(system.getNameWithLowercaseTypeShort(), s, true, untilRaid, ETAType.ARRIVING,
343 info, tc, initPad);
344 } else if (TRAVEL_ACTION.equals(param)) {
345 addArrivedBulletPoint(system.getNameWithLowercaseTypeShort(), s, info, tc, initPad);
346 } else if (PAYLOAD_ACTION.equals(param)) {
347 if (isSucceeded()) {
348 info.addPara("The " + forces + " are withdrawing", tc, initPad);
349 } else {
350 if (isAborted()) {
351 info.addPara("The " + forces + " have been defeated and scatter", tc, initPad);
352 } else {
353 info.addPara("The " + forces + " have failed to achieve their objective", tc, initPad);
354 }
355 }
356 }
357 }
358
359 @Override
361 if (RETURN_ACTION.equals(action.getId())) return false;
362 if (PAYLOAD_ACTION.equals(action.getId())) {
363 // if it was aborted, will send an update on abort() instead
364 return isSucceeded() || (isFailed() && !isAborted());
365 }
366 if (TRAVEL_ACTION.equals(action.getId())) {
367 if (action instanceof FGTravelAction && (isAborted() || isFailed())) {
368 return false; // already sent a notification on abort/fail
369 }
370 // no update for "arriving" when traveling from one planet in-system to another
371 return getSource().getContainingLocation() != raidAction.getWhere();
372 }
373
374 return super.shouldSendIntelUpdateWhenActionFinished(action);
375 }
376
377 protected void addBasicDescription(TooltipMakerAPI info, float width, float height, float opad) {
378 info.addImage(getFaction().getLogo(), width, 128, opad);
379
380 StarSystemAPI system = raidAction.getWhere();
381
382 String noun = getNoun();
383
384 //String aOrAn = Misc.getAOrAnFor(noun);
385 //info.addPara(Misc.ucFirst(aOrAn) + " %s " + noun + " against "
386 info.addPara(Misc.ucFirst(faction.getPersonNamePrefixAOrAn()) + " %s " + noun + " against "
387 + "the " + system.getNameWithLowercaseTypeShort() + ".", opad,
388 faction.getBaseUIColor(), faction.getPersonNamePrefix());
389
390
391 }
392
393 protected void addAssessmentSection(TooltipMakerAPI info, float width, float height, float opad) {
394 Color h = Misc.getHighlightColor();
395
396 FactionAPI faction = getFaction();
397
398 List<MarketAPI> targets = params.raidParams.allowedTargets;
399
400 String noun = getNoun();
401 if (!isEnding() && !isSucceeded() && !isFailed()) {
402 info.addSectionHeading("Assessment",
403 faction.getBaseUIColor(), faction.getDarkUIColor(), Alignment.MID, opad);
404 if (targets.isEmpty()) {
405 info.addPara("There are no colonies for the " + noun + " to target in the system.", opad);
406 } else {
407 StarSystemAPI system = raidAction.getWhere();
408
409 String forces = getForcesNoun();
410
411 boolean potentialDanger = addStrengthDesc(info, opad, system, forces,
412 "the " + noun + " is unlikely to find success",
413 "the outcome of the " + noun + " is uncertain",
414 "the " + noun + " is likely to find success");
415
416 if (potentialDanger) {
417 String safe = "should be safe from the " + noun;
418 String risk = "are at risk of being raided and losing stability:";
419 String highlight = "losing stability:";
420 if (params.raidParams.bombardment == BombardType.SATURATION) {
421 risk = "are at risk of suffering a saturation bombardment resulting in catastrophic damage:";
422 highlight = "catastrophic damage";
423 } else if (params.raidParams.bombardment == BombardType.TACTICAL) {
424 risk = "are at risk of suffering a tactical bombardment and having their military infrastructure disrupted:";
425 highlight = "military infrastructure disrupted";
426 } else if (!params.raidParams.disrupt.isEmpty()) {
427 risk = "are at risk of being raided and having their operations severely disrupted";
428 highlight = "operations severely disrupted";
429 }
430 if (getAssessmentRiskStringOverride() != null) {
432 }
435 }
436 showMarketsInDanger(info, opad, width, system, targets,
437 safe, risk, highlight);
438 }
439 }
440 addPostAssessmentSection(info, width, height, opad);
441 }
442 }
443
444 protected void addPostAssessmentSection(TooltipMakerAPI info, float width, float height, float opad) {
445
446 }
447
449 return null;
450 }
452 return null;
453 }
454
455
456 protected void addPayloadActionStatus(TooltipMakerAPI info, float width, float height, float opad) {
457 StarSystemAPI to = raidAction.getWhere();
458 info.addPara("Conducting operations in the " +
459 to.getNameWithLowercaseTypeShort() + ".", opad);
460
461 }
462
463 protected void addStatusSection(TooltipMakerAPI info, float width, float height, float opad) {
464 FGAction curr = getCurrentAction();
465
466 boolean showStatus = curr != null || isEnding() || isSucceeded();
467
468 if (showStatus) {
469 String noun = getNoun();
470 String forces = getForcesNoun();
471 info.addSectionHeading("Status",
472 faction.getBaseUIColor(), faction.getDarkUIColor(), Alignment.MID, opad);
473 if (isEnding() && !isSucceeded()) {
474 if (isFailed() || isAborted()) {
476 info.addPara("The " + forces + " are withdrawing.", opad);
477 } else {
478 info.addPara("The " + forces + " have been defeated and any "
479 + "remaining ships are retreating in disarray.", opad);
480 }
481 } else {
482 info.addPara("The " + forces + " are withdrawing.", opad);
483 }
484 } else if (isEnding() || isSucceeded()) {
485 info.addPara("The " + noun + " was successful and the " + forces + " are withdrawing.", opad);
486 } else if (curr != null) {
487 StarSystemAPI to = raidAction.getWhere();
488 if (isInPreLaunchDelay()) {
489 if (getSource().getMarket() != null) {
490 BaseHubMission.addStandardMarketDesc("The " + noun + " is in the planning stages on",
491 getSource().getMarket(), info, opad);
492 boolean mil = isSourceFunctionalMilitaryMarket();
493 if (mil) {
494 info.addPara("Disrupting the military facilities " + getSource().getMarket().getOnOrAt() +
495 " " + getSource().getMarket().getName() + " will abort the " + noun + ".", opad);
496 }
497 }
498 } else if (PREPARE_ACTION.equals(curr.getId())) {
499 if (getSource().getMarket() != null) {
500 BaseHubMission.addStandardMarketDesc("Making preparations in orbit around",
501 getSource().getMarket(), info, opad);
502 } else {
503 info.addPara("Making preparations in orbit around " + getSource().getName() + ".", opad);
504 }
505 } else if (TRAVEL_ACTION.equals(curr.getId())) {
506 if (getSource().getMarket() == null) {
507 info.addPara("Traveling to the " +
508 to.getNameWithLowercaseTypeShort() + ".", opad);
509 } else {
510 info.addPara("Traveling from " + getSource().getMarket().getName() + " to the " +
511 to.getNameWithLowercaseTypeShort() + ".", opad);
512 }
513 } else if (RETURN_ACTION.equals(curr.getId())) {
514 if (getSource().getMarket() == null) {
515 info.addPara("Returning to their port of origin.", opad);
516 } else {
517 info.addPara("Returning to " + getSource().getMarket().getName() + " in the " +
518 origin.getContainingLocation().getNameWithLowercaseTypeShort() + ".", opad);
519 }
520 } else if (PAYLOAD_ACTION.equals(curr.getId())) {
521 addPayloadActionStatus(info, width, height, opad);
522 }
523 }
524 }
525 }
526
527 public String getNoun() {
528 if (params.noun != null) return params.noun;
529
530 String noun = "raid";
531 if (params.raidParams.bombardment != null) {
532 noun = "attack";
533 }
534 return noun;
535 }
536
537 public String getForcesNoun() {
538 if (params.forcesNoun != null) return params.forcesNoun;
539
540 String forces = "raiding forces";
541 if (!getNoun().equals("raid")) {
542 forces = "attacking forces";
543 }
544 return forces;
545 }
546
547
548 public String getBaseName() {
549 return Misc.ucFirst(getFaction().getPersonNamePrefix()) + " " + Misc.ucFirst(getNoun());
550 }
551
552 public boolean isSucceeded() {
553 return raidAction.getSuccessFraction() > 0f && raidAction.isActionFinished() && !isAborted();
554 }
555
556 public boolean isFailed() {
557 return isAborted() || (raidAction.getSuccessFraction() <= 0f && raidAction.isActionFinished());
558 }
559
560 protected SectorEntityToken getSource() {
561 return origin;
562 }
563
564 protected SectorEntityToken getDestination() {
565 return raidAction.getWhere().getHyperspaceAnchor();
566 }
567
568 protected StarSystemAPI getTargetSystem() {
569 return raidAction.getWhere();
570 }
571
572 public GenericPayloadAction getRaidAction() {
573 return raidAction;
574 }
575
577 return travelAction;
578 }
579
581 return returnAction;
582 }
583
585 return waitAction;
586 }
587
588 @Override
589 public String getCommMessageSound() {
590 if (isSendingUpdate()) {
591 return getSoundStandardUpdate();
592 }
593 if (params.playerTargeted) {
594 return getSoundColonyThreat();
595 }
596 return super.getCommMessageSound();
597 }
598
599 public boolean isPlayerTargeted() {
600 return params.playerTargeted;
601 }
602
603
604 @Override
605 public Set<String> getIntelTags(SectorMapAPI map) {
606 return super.getIntelTags(map);
607 }
608
609 @Override
610 public List<ArrowData> getArrowData(SectorMapAPI map) {
611 if (isAborted() || isFailed() || isSucceeded() || isEnded() || isEnding()) {
612 return null;
613 }
614 return super.getArrowData(map);
615 }
616
617 public GenericRaidParams getParams() {
618 return params;
619 }
620
621 public void setOrigin(SectorEntityToken origin) {
622 this.origin = origin;
623 }
624
625 @Override
626 public SectorEntityToken getMapLocation(SectorMapAPI map) {
627 if (getCurrentAction() != null && GenericRaidFGI.PREPARE_ACTION.equals(getCurrentAction().getId()) ||
628 getDelayRemaining() > 0) {
629 return getSource();
630 }
631 return getDestination();
632 }
633
634 public boolean hasCustomRaidAction() {
635 return false;
636 }
637
638 public void doCustomRaidAction(CampaignFleetAPI fleet, MarketAPI market, float raidStr) {
639
640 }
641}
642
643
644
645
static SectorAPI getSector()
Definition Global.java:59
void addArrivedBulletPoint(String destName, Color destHL, TooltipMakerAPI info, Color tc, float initPad)
void createRoute(String factionId, int approximateTotalDifficultyPoints, int approximateNumberOfFleets, Object custom)
void addETABulletPoints(String destName, Color destHL, boolean withDepartedText, float eta, ETAType type, TooltipMakerAPI info, Color tc, float initPad)
void showMarketsInDanger(TooltipMakerAPI info, float opad, float width, StarSystemAPI system, List< MarketAPI > targets, String safeStr, String riskStr, String riskStrHighlight)
boolean addStrengthDesc(TooltipMakerAPI info, float opad, StarSystemAPI system, String forces, String outcomeFailure, String outcomeUncertain, String outcomeSuccess)
static void setLocationAndCoordinates(CampaignFleetAPI fleet, RouteSegment current)
void addPayloadActionStatus(TooltipMakerAPI info, float width, float height, float opad)
void addNonUpdateBulletPoints(TooltipMakerAPI info, Color tc, Object param, ListInfoMode mode, float initPad)
void addStatusSection(TooltipMakerAPI info, float width, float height, float opad)
void addPostAssessmentSection(TooltipMakerAPI info, float width, float height, float opad)
void addBasicDescription(TooltipMakerAPI info, float width, float height, float opad)
void addTargetingBulletPoint(TooltipMakerAPI info, Color tc, Object param, ListInfoMode mode, float initPad)
void doCustomRaidAction(CampaignFleetAPI fleet, MarketAPI market, float raidStr)
void addAssessmentSection(TooltipMakerAPI info, float width, float height, float opad)
void addUpdateBulletPoints(TooltipMakerAPI info, Color tc, Object param, ListInfoMode mode, float initPad)