Starsector API
Loading...
Searching...
No Matches
MilitaryBase.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.econ.impl;
2
3import java.util.Random;
4
5import java.awt.Color;
6
7import org.lwjgl.util.vector.Vector2f;
8
9import com.fs.starfarer.api.Global;
10import com.fs.starfarer.api.campaign.BattleAPI;
11import com.fs.starfarer.api.campaign.CampaignEventListener.FleetDespawnReason;
12import com.fs.starfarer.api.campaign.CampaignFleetAPI;
13import com.fs.starfarer.api.campaign.PlanetAPI;
14import com.fs.starfarer.api.campaign.econ.CommodityOnMarketAPI;
15import com.fs.starfarer.api.campaign.econ.CommoditySpecAPI;
16import com.fs.starfarer.api.campaign.econ.Industry;
17import com.fs.starfarer.api.campaign.econ.MarketAPI;
18import com.fs.starfarer.api.campaign.listeners.FleetEventListener;
19import com.fs.starfarer.api.campaign.rules.MemoryAPI;
20import com.fs.starfarer.api.impl.campaign.DebugFlags;
21import com.fs.starfarer.api.impl.campaign.fleets.FleetFactory.PatrolType;
22import com.fs.starfarer.api.impl.campaign.fleets.FleetFactoryV3;
23import com.fs.starfarer.api.impl.campaign.fleets.FleetParamsV3;
24import com.fs.starfarer.api.impl.campaign.fleets.PatrolAssignmentAIV4;
25import com.fs.starfarer.api.impl.campaign.fleets.RouteManager;
26import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.OptionalFleetData;
27import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteData;
28import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteFleetSpawner;
29import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteSegment;
30import com.fs.starfarer.api.impl.campaign.ids.Commodities;
31import com.fs.starfarer.api.impl.campaign.ids.Factions;
32import com.fs.starfarer.api.impl.campaign.ids.Industries;
33import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
34import com.fs.starfarer.api.impl.campaign.ids.Ranks;
35import com.fs.starfarer.api.impl.campaign.ids.Stats;
36import com.fs.starfarer.api.impl.campaign.ids.Strings;
37import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.MarketCMD.RaidDangerLevel;
38import com.fs.starfarer.api.ui.TooltipMakerAPI;
39import com.fs.starfarer.api.util.IntervalUtil;
40import com.fs.starfarer.api.util.Misc;
41import com.fs.starfarer.api.util.Pair;
42import com.fs.starfarer.api.util.WeightedRandomPicker;
43
44
45
46public class MilitaryBase extends BaseIndustry implements RouteFleetSpawner, FleetEventListener {
47
48 public static float OFFICER_PROB_MOD_PATROL_HQ = 0.1f;
49 public static float OFFICER_PROB_MOD_MILITARY_BASE = 0.2f;
50 public static float OFFICER_PROB_MOD_HIGH_COMMAND = 0.3f;
51
52
53 public static float DEFENSE_BONUS_PATROL = 0.1f;
54 public static float DEFENSE_BONUS_MILITARY = 0.2f;
55 public static float DEFENSE_BONUS_COMMAND = 0.3f;
56
57 public static int IMPROVE_NUM_PATROLS_BONUS = 1;
58
59 public void apply() {
60
61 int size = market.getSize();
62
63 boolean patrol = getSpec().hasTag(Industries.TAG_PATROL);
64 boolean militaryBase = getSpec().hasTag(Industries.TAG_MILITARY);
65 boolean command = getSpec().hasTag(Industries.TAG_COMMAND);
66
67 super.apply(!patrol);
68 if (patrol) {
70 }
71
72 int extraDemand = 0;
73
74 int light = 1;
75 int medium = 0;
76 int heavy = 0;
77
78 if (patrol) {
79 extraDemand = 0;
80 } else if (militaryBase) {
81 extraDemand = 2;
82 } else if (command) {
83 extraDemand = 3;
84 }
85
86 if (patrol) {
87 light = 2;
88 medium = 0;
89 heavy = 0;
90 } else {
91 if (size <= 3) {
92 light = 2;
93 medium = 0;
94 heavy = 0;
95 } else if (size == 4) {
96 light = 2;
97 medium = 0;
98 heavy = 0;
99 } else if (size == 5) {
100 light = 2;
101 medium = 1;
102 heavy = 0;
103 } else if (size == 6) {
104 light = 3;
105 medium = 1;
106 heavy = 0;
107 } else if (size == 7) {
108 light = 3;
109 medium = 2;
110 heavy = 0;
111 } else if (size == 8) {
112 light = 3;
113 medium = 3;
114 heavy = 0;
115 } else if (size >= 9) {
116 light = 4;
117 medium = 3;
118 heavy = 0;
119 }
120 }
121
122 if (militaryBase || command) {
123 //light++;
124 medium = Math.max(medium + 1, size / 2 - 1);
125 heavy = Math.max(heavy, medium - 1);
126 }
127
128 if (command) {
129 medium++;
130 heavy++;
131 }
132
133// if (market.getId().equals("jangala")) {
134// System.out.println("wefwefwe");
135// }
136
137// light += 5;
138// medium += 3;
139// heavy += 2;
140
141// float spawnRateMultStability = getStabilitySpawnRateMult();
142// if (spawnRateMultStability != 1) {
143// market.getStats().getDynamic().getStat(Stats.COMBAT_FLEET_SPAWN_RATE_MULT).modifyMult(getModId(), spawnRateMultStability);
144// }
145
146
150
151
152 demand(Commodities.SUPPLIES, size - 1 + extraDemand);
153 demand(Commodities.FUEL, size - 1 + extraDemand);
154 demand(Commodities.SHIPS, size - 1 + extraDemand);
155
156 supply(Commodities.CREW, size);
157
158 if (!patrol) {
159 //demand(Commodities.HAND_WEAPONS, size);
161
162// Pair<String, Integer> deficit = getMaxDeficit(Commodities.HAND_WEAPONS);
163// applyDeficitToProduction(1, deficit, Commodities.MARINES);
164 }
165
166
168
169 float mult = getDeficitMult(Commodities.SUPPLIES);
170 String extra = "";
171 if (mult != 1) {
172 String com = getMaxDeficit(Commodities.SUPPLIES).one;
173 extra = " (" + getDeficitText(com).toLowerCase() + ")";
174 }
175 float bonus = DEFENSE_BONUS_MILITARY;
176 if (patrol) bonus = DEFENSE_BONUS_PATROL;
177 else if (command) bonus = DEFENSE_BONUS_COMMAND;
179 .modifyMult(getModId(), 1f + bonus * mult, getNameForModifier() + extra);
180
181
184
185 if (militaryBase || command) {
187 }
188
189 float officerProb = OFFICER_PROB_MOD_PATROL_HQ;
190 if (militaryBase) officerProb = OFFICER_PROB_MOD_MILITARY_BASE;
191 else if (command) officerProb = OFFICER_PROB_MOD_HIGH_COMMAND;
193
194
195 if (!isFunctional()) {
196 supply.clear();
197 unapply();
198 }
199
200 }
201
202 @Override
203 public void unapply() {
204 super.unapply();
205
209
211
212 //market.getStats().getDynamic().getStat(Stats.COMBAT_FLEET_SPAWN_RATE_MULT).unmodifyMult(getModId());
213 //market.getStats().getDynamic().getMod(Stats.GROUND_DEFENSES_MULT).unmodifyFlat(getModId());
214
218
220
222 }
223
224 protected boolean hasPostDemandSection(boolean hasDemand, IndustryTooltipMode mode) {
225 return mode != IndustryTooltipMode.NORMAL || isFunctional();
226 }
227
228 @Override
229 protected void addPostDemandSection(TooltipMakerAPI tooltip, boolean hasDemand, IndustryTooltipMode mode) {
230 if (mode != IndustryTooltipMode.NORMAL || isFunctional()) {
231 addStabilityPostDemandSection(tooltip, hasDemand, mode);
232
233 boolean patrol = getSpec().hasTag(Industries.TAG_PATROL);
234 boolean command = getSpec().hasTag(Industries.TAG_COMMAND);
235 float bonus = DEFENSE_BONUS_MILITARY;
236 if (patrol) bonus = DEFENSE_BONUS_PATROL;
237 if (command) bonus = DEFENSE_BONUS_COMMAND;
239 }
240 }
241
242 @Override
243 protected int getBaseStabilityMod() {
244 boolean patrol = getSpec().hasTag(Industries.TAG_PATROL);
245 boolean militaryBase = getSpec().hasTag(Industries.TAG_MILITARY);
246 boolean command = getSpec().hasTag(Industries.TAG_COMMAND);
247 int stabilityMod = 1;
248 if (patrol) {
249 stabilityMod = 1;
250 } else if (militaryBase) {
251 stabilityMod = 2;
252 } else if (command) {
253 stabilityMod = 2;
254 }
255 return stabilityMod;
256 }
257
258 public String getNameForModifier() {
259// boolean patrol = Industries.PATROLHQ.equals(getId());
260// if (patrol) return getSpec().getName();
261 if (getSpec().getName().contains("HQ")) {
262 return getSpec().getName();
263 }
264
265 return Misc.ucFirst(getSpec().getName().toLowerCase());
266 }
267
268
269// protected float getStabilitySpawnRateMult() {
270// return Math.max(0.2f, market.getStabilityValue() / 10f);
271// }
272
273 @Override
275 boolean patrol = getSpec().hasTag(Industries.TAG_PATROL);
276 if (patrol) {
278 }
279 //return getMaxDeficit(Commodities.SUPPLIES, Commodities.FUEL, Commodities.SHIPS, Commodities.HAND_WEAPONS);
281 }
282
283
284 @Override
285 public String getCurrentImage() {
286 boolean military = Industries.MILITARYBASE.equals(getId());
287 if (military) {
289 if (planet == null || planet.isGasGiant()) {
290 return Global.getSettings().getSpriteName("industry", "military_base_orbital");
291 }
292 }
293 return super.getCurrentImage();
294 }
295
296
298 return true;
299 }
300
302 return true;
303 }
304
305 public boolean isAvailableToBuild() {
306 boolean canBuild = false;
307 for (Industry ind : market.getIndustries()) {
308 if (ind == this) continue;
309 if (!ind.isFunctional()) continue;
310 if (ind.getSpec().hasTag(Industries.TAG_SPACEPORT)) {
311 canBuild = true;
312 break;
313 }
314 }
315 return canBuild;
316 }
317
318 public String getUnavailableReason() {
319 return "Requires a functional spaceport";
320 }
321
322
323 //protected IntervalUtil tracker = new IntervalUtil(5f, 9f);
324 protected IntervalUtil tracker = new IntervalUtil(Global.getSettings().getFloat("averagePatrolSpawnInterval") * 0.7f,
325 Global.getSettings().getFloat("averagePatrolSpawnInterval") * 1.3f);
326
327 protected float returningPatrolValue = 0f;
328
329 @Override
330 protected void buildingFinished() {
331 super.buildingFinished();
332
334 }
335
336 @Override
337 protected void upgradeFinished(Industry previous) {
338 super.upgradeFinished(previous);
339
341 }
342
343 @Override
344 public void advance(float amount) {
345 super.advance(amount);
346
347 if (Global.getSector().getEconomy().isSimMode()) return;
348
349 if (!isFunctional()) return;
350
351 float days = Global.getSector().getClock().convertToDays(amount);
352
353// float stability = market.getPrevStability();
354// float spawnRate = 1f + (stability - 5) * 0.2f;
355// if (spawnRate < 0.5f) spawnRate = 0.5f;
356
357 float spawnRate = 1f;
359 spawnRate *= rateMult;
360
362 spawnRate *= 3f;
363 }
364
365 float extraTime = 0f;
366 if (returningPatrolValue > 0) {
367 // apply "returned patrols" to spawn rate, at a maximum rate of 1 interval per day
368 float interval = tracker.getIntervalDuration();
369 extraTime = interval * days;
370 returningPatrolValue -= days;
372 }
373 tracker.advance(days * spawnRate + extraTime);
374
375 //DebugFlags.FAST_PATROL_SPAWN = true;
377 tracker.advance(days * spawnRate * 100f);
378 }
379
380 if (tracker.intervalElapsed()) {
381// if (market.isPlayerOwned()) {
382// System.out.println("ewfwefew");
383// }
384// if (market.getName().equals("Jangala")) {
385// System.out.println("wefwefe");
386// }
387 String sid = getRouteSourceId();
388
389 int light = getCount(PatrolType.FAST);
390 int medium = getCount(PatrolType.COMBAT);
391 int heavy = getCount(PatrolType.HEAVY);
392
393 int maxLight = getMaxPatrols(PatrolType.FAST);
394 int maxMedium = getMaxPatrols(PatrolType.COMBAT);
395 int maxHeavy = getMaxPatrols(PatrolType.HEAVY);
396
398 picker.add(PatrolType.HEAVY, maxHeavy - heavy);
399 picker.add(PatrolType.COMBAT, maxMedium - medium);
400 picker.add(PatrolType.FAST, maxLight - light);
401
402 if (picker.isEmpty()) return;
403
404 PatrolType type = picker.pick();
405 PatrolFleetData custom = new PatrolFleetData(type);
406
407 OptionalFleetData extra = new OptionalFleetData(market);
408 extra.fleetType = type.getFleetType();
409
410 RouteData route = RouteManager.getInstance().addRoute(sid, market, Misc.genRandomSeed(), extra, this, custom);
411 extra.strength = (float) getPatrolCombatFP(type, route.getRandom());
412 extra.strength = Misc.getAdjustedStrength(extra.strength, market);
413
414
415 float patrolDays = 35f + (float) Math.random() * 10f;
416 route.addSegment(new RouteSegment(patrolDays, market.getPrimaryEntity()));
417 }
418 }
419
420 public static class PatrolFleetData {
421 public PatrolType type;
422 public int spawnFP;
423 //public int despawnFP;
424 public PatrolFleetData(PatrolType type) {
425 this.type = type;
426 }
427 }
428
429 public void reportAboutToBeDespawnedByRouteManager(RouteData route) {
430// if (route.getActiveFleet() == null) return;
431// PatrolFleetData custom = (PatrolFleetData) route.getCustom();
432// custom.despawnFP = route.getActiveFleet().getFleetPoints();
433 }
434
435 public boolean shouldRepeat(RouteData route) {
436// PatrolFleetData custom = (PatrolFleetData) route.getCustom();
439// return route.getActiveFleet() != null && route.getActiveFleet().getFleetPoints() >= custom.spawnFP * 0.6f;
440 return false;
441 }
442
443 public int getCount(PatrolType ... types) {
444 int count = 0;
445 for (RouteData data : RouteManager.getInstance().getRoutesForSource(getRouteSourceId())) {
446 if (data.getCustom() instanceof PatrolFleetData) {
447 PatrolFleetData custom = (PatrolFleetData) data.getCustom();
448 for (PatrolType type : types) {
449 if (type == custom.type) {
450 count++;
451 break;
452 }
453 }
454 }
455 }
456 return count;
457 }
458
459 public int getMaxPatrols(PatrolType type) {
460 if (type == PatrolType.FAST) {
462 }
463 if (type == PatrolType.COMBAT) {
465 }
466 if (type == PatrolType.HEAVY) {
468 }
469 return 0;
470 }
471
472 public String getRouteSourceId() {
473 return getMarket().getId() + "_" + "military";
474 }
475
476 public boolean shouldCancelRouteAfterDelayCheck(RouteData route) {
477 return false;
478 }
479
480
481 public void reportBattleOccurred(CampaignFleetAPI fleet, CampaignFleetAPI primaryWinner, BattleAPI battle) {
482
483 }
484
485 public void reportFleetDespawnedToListener(CampaignFleetAPI fleet, FleetDespawnReason reason, Object param) {
486 if (!isFunctional()) return;
487
488 if (reason == FleetDespawnReason.REACHED_DESTINATION) {
489 RouteData route = RouteManager.getInstance().getRoute(getRouteSourceId(), fleet);
490 if (route.getCustom() instanceof PatrolFleetData) {
491 PatrolFleetData custom = (PatrolFleetData) route.getCustom();
492 if (custom.spawnFP > 0) {
493 float fraction = fleet.getFleetPoints() / custom.spawnFP;
494 returningPatrolValue += fraction;
495 }
496 }
497 }
498 }
499
500 public static int getPatrolCombatFP(PatrolType type, Random random) {
501 float combat = 0;
502 switch (type) {
503 case FAST:
504 combat = Math.round(3f + (float) random.nextFloat() * 2f) * 5f;
505 break;
506 case COMBAT:
507 combat = Math.round(6f + (float) random.nextFloat() * 3f) * 5f;
508 break;
509 case HEAVY:
510 combat = Math.round(10f + (float) random.nextFloat() * 5f) * 5f;
511 break;
512 }
513 return (int) Math.round(combat);
514 }
515
516 public CampaignFleetAPI spawnFleet(RouteData route) {
517
518 PatrolFleetData custom = (PatrolFleetData) route.getCustom();
519 PatrolType type = custom.type;
520
521 Random random = route.getRandom();
522
523 CampaignFleetAPI fleet = createPatrol(type, market.getFactionId(), route, market, null, random);
524
525 if (fleet == null || fleet.isEmpty()) return null;
526
527 fleet.addEventListener(this);
528
530 fleet.setFacing((float) Math.random() * 360f);
531 // this will get overridden by the patrol assignment AI, depending on route-time elapsed etc
533
534 fleet.addScript(new PatrolAssignmentAIV4(fleet, route));
535
537
538 //market.getContainingLocation().addEntity(fleet);
539 //fleet.setLocation(market.getPrimaryEntity().getLocation().x, market.getPrimaryEntity().getLocation().y);
540
541 if (custom.spawnFP <= 0) {
542 custom.spawnFP = fleet.getFleetPoints();
543 }
544
545 return fleet;
546 }
547
548 public static CampaignFleetAPI createPatrol(PatrolType type, String factionId, RouteData route, MarketAPI market, Vector2f locInHyper, Random random) {
549 return createPatrol(type, 0f, factionId, route, market, locInHyper, random);
550 }
551 public static CampaignFleetAPI createPatrol(PatrolType type, float extraTankerPts, String factionId, RouteData route, MarketAPI market, Vector2f locInHyper, Random random) {
552 if (random == null) random = new Random();
553
554
555 float combat = getPatrolCombatFP(type, random);
556 float tanker = 0f;
557 float freighter = 0f;
558 String fleetType = type.getFleetType();
559 switch (type) {
560 case FAST:
561 break;
562 case COMBAT:
563 tanker = Math.round((float) random.nextFloat() * 5f);
564 break;
565 case HEAVY:
566 tanker = Math.round((float) random.nextFloat() * 10f);
567 freighter = Math.round((float) random.nextFloat() * 10f);
568 break;
569 }
570
571 tanker += extraTankerPts;
572
573 FleetParamsV3 params = new FleetParamsV3(
574 market,
575 locInHyper,
576 factionId,
577 route == null ? null : route.getQualityOverride(),
578 fleetType,
579 combat, // combatPts
580 freighter, // freighterPts
581 tanker, // tankerPts
582 0f, // transportPts
583 0f, // linerPts
584 0f, // utilityPts
585 0f // qualityMod
586 );
587 if (route != null) {
588 params.timestamp = route.getTimestamp();
589 }
590 params.random = random;
592
593 if (fleet == null || fleet.isEmpty()) return null;
594
597 if (type == PatrolType.FAST || type == PatrolType.COMBAT) {
599 }
602
603 // hidden pather and pirate bases
604 // make them raid so there's some consequence to just having a colony in a system with one of those
605 if (market != null && market.isHidden()) {
607 }
608 }
609
610 String postId = Ranks.POST_PATROL_COMMANDER;
611 String rankId = Ranks.SPACE_COMMANDER;
612 switch (type) {
613 case FAST:
614 rankId = Ranks.SPACE_LIEUTENANT;
615 break;
616 case COMBAT:
617 rankId = Ranks.SPACE_COMMANDER;
618 break;
619 case HEAVY:
620 rankId = Ranks.SPACE_CAPTAIN;
621 break;
622 }
623
624 fleet.getCommander().setPostId(postId);
625 fleet.getCommander().setRankId(rankId);
626
627 return fleet;
628 }
629
630
631
632 public static float ALPHA_CORE_BONUS = 0.25f;
633 @Override
638
639 @Override
643
644 @Override
648
649 protected void addAlphaCoreDescription(TooltipMakerAPI tooltip, AICoreDescriptionMode mode) {
650 float opad = 10f;
651 Color highlight = Misc.getHighlightColor();
652
653 String pre = "Alpha-level AI core currently assigned. ";
654 if (mode == AICoreDescriptionMode.MANAGE_CORE_DIALOG_LIST || mode == AICoreDescriptionMode.INDUSTRY_TOOLTIP) {
655 pre = "Alpha-level AI core. ";
656 }
657 float a = ALPHA_CORE_BONUS;
658 //String str = "" + (int)Math.round(a * 100f) + "%";
659 String str = Strings.X + (1f + a);
660
661 if (mode == AICoreDescriptionMode.INDUSTRY_TOOLTIP) {
663 TooltipMakerAPI text = tooltip.beginImageWithText(coreSpec.getIconName(), 48);
664 text.addPara(pre + "Reduces upkeep cost by %s. Reduces demand by %s unit. " +
665 "Increases fleet size by %s.", 0f, highlight,
666 "" + (int)((1f - UPKEEP_MULT) * 100f) + "%", "" + DEMAND_REDUCTION,
667 str);
668 tooltip.addImageWithText(opad);
669 return;
670 }
671
672 tooltip.addPara(pre + "Reduces upkeep cost by %s. Reduces demand by %s unit. " +
673 "Increases fleet size by %s.", opad, highlight,
674 "" + (int)((1f - UPKEEP_MULT) * 100f) + "%", "" + DEMAND_REDUCTION,
675 str);
676
677 }
678
679
680 @Override
681 public boolean canImprove() {
682 return true;
683 }
684
685 protected void applyImproveModifiers() {
686
687 String key = "mil_base_improve";
688 if (isImproved()) {
689 boolean patrol = getSpec().hasTag(Industries.TAG_PATROL);
690// boolean militaryBase = getSpec().hasTag(Industries.TAG_MILITARY);
691// boolean command = getSpec().hasTag(Industries.TAG_COMMAND);
692
693 if (patrol) {
695 } else {
697 }
698 } else {
701 }
702 }
703
704 public void addImproveDesc(TooltipMakerAPI info, ImprovementDescriptionMode mode) {
705 float opad = 10f;
706 Color highlight = Misc.getHighlightColor();
707
708 String str = "" + (int) IMPROVE_NUM_PATROLS_BONUS;
709
710 boolean patrol = getSpec().hasTag(Industries.TAG_PATROL);
711 String type = "medium patrols";
712 if (!patrol) type = "heavy patrols";
713
714 if (mode == ImprovementDescriptionMode.INDUSTRY_TOOLTIP) {
715 info.addPara("Number of " + type + " launched increased by %s.", 0f, highlight, str);
716 } else {
717 info.addPara("Increases the number of " + type + " launched by %s.", 0f, highlight, str);
718 }
719
720 info.addSpacer(opad);
721 super.addImproveDesc(info, mode);
722 }
723
724
725 @Override
726 public RaidDangerLevel adjustCommodityDangerLevel(String commodityId, RaidDangerLevel level) {
727 return level.next();
728 }
729
730 @Override
731 public RaidDangerLevel adjustItemDangerLevel(String itemId, String data, RaidDangerLevel level) {
732 return level.next();
733 }
734
735
736}
737
738
739
740
static SettingsAPI getSettings()
Definition Global.java:57
static SectorAPI getSector()
Definition Global.java:65
void modifyFlat(String source, float value)
void modifyMult(String source, float value)
void modifyFlat(String source, float value)
float computeEffective(float baseValue)
Map< String, MutableCommodityQuantity > supply
void addStabilityPostDemandSection(TooltipMakerAPI tooltip, boolean hasDemand, IndustryTooltipMode mode)
void addGroundDefensesImpactSection(TooltipMakerAPI tooltip, float bonus, String ...commodities)
Map< String, MutableCommodityQuantity > demand
Pair< String, Integer > getMaxDeficit(String ... commodityIds)
void addImproveDesc(TooltipMakerAPI info, ImprovementDescriptionMode mode)
static CampaignFleetAPI createPatrol(PatrolType type, String factionId, RouteData route, MarketAPI market, Vector2f locInHyper, Random random)
void reportBattleOccurred(CampaignFleetAPI fleet, CampaignFleetAPI primaryWinner, BattleAPI battle)
void reportFleetDespawnedToListener(CampaignFleetAPI fleet, FleetDespawnReason reason, Object param)
static CampaignFleetAPI createPatrol(PatrolType type, float extraTankerPts, String factionId, RouteData route, MarketAPI market, Vector2f locInHyper, Random random)
RaidDangerLevel adjustCommodityDangerLevel(String commodityId, RaidDangerLevel level)
RaidDangerLevel adjustItemDangerLevel(String itemId, String data, RaidDangerLevel level)
boolean hasPostDemandSection(boolean hasDemand, IndustryTooltipMode mode)
void addPostDemandSection(TooltipMakerAPI tooltip, boolean hasDemand, IndustryTooltipMode mode)
void addAlphaCoreDescription(TooltipMakerAPI tooltip, AICoreDescriptionMode mode)
static int getPatrolCombatFP(PatrolType type, Random random)
static CampaignFleetAPI createFleet(FleetParamsV3 params)
RouteData addRoute(String source, MarketAPI market, Long seed, OptionalFleetData extra, RouteFleetSpawner spawner)
RouteData getRoute(String source, CampaignFleetAPI fleet)
static final String CUSTOM_PATROLS_HAVE_NO_PATROL_MEMORY_KEY
Definition Factions.java:53
static final String COMBAT_FLEET_SPAWN_RATE_MULT
Definition Stats.java:45
static String ucFirst(String str)
Definition Misc.java:559
static Color getHighlightColor()
Definition Misc.java:792
static boolean setFlagWithReason(MemoryAPI memory, String flagKey, String reason, boolean value, float expire)
Definition Misc.java:1439
static float getAdjustedStrength(float fp, MarketAPI market)
Definition Misc.java:4483
String getSpriteName(String category, String id)
CommoditySpecAPI getCommoditySpec(String commodityId)
void addEventListener(FleetEventListener listener)
void addEntity(SectorEntityToken entity)
void addScript(EveryFrameScript script)
void set(String key, Object value)
LabelAPI addPara(String format, float pad, Color hl, String... highlights)
UIComponentAPI addSpacer(float height)
TooltipMakerAPI beginImageWithText(String spriteName, float imageHeight)
UIPanelAPI addImageWithText(float pad)