Starsector API
Loading...
Searching...
No Matches
HubMissionWithTriggers.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.missions.hub;
2
3import java.util.ArrayList;
4import java.util.Arrays;
5import java.util.EnumSet;
6import java.util.List;
7import java.util.Random;
8
9import org.lwjgl.util.vector.Vector2f;
10
11import com.fs.starfarer.api.EveryFrameScript;
12import com.fs.starfarer.api.Global;
13import com.fs.starfarer.api.Script;
14import com.fs.starfarer.api.campaign.CampaignFleetAPI;
15import com.fs.starfarer.api.campaign.CargoAPI;
16import com.fs.starfarer.api.campaign.FactionAPI;
17import com.fs.starfarer.api.campaign.FactionAPI.ShipPickMode;
18import com.fs.starfarer.api.campaign.FactionAPI.ShipPickParams;
19import com.fs.starfarer.api.campaign.FactionDoctrineAPI;
20import com.fs.starfarer.api.campaign.FleetInflater;
21import com.fs.starfarer.api.campaign.LocationAPI;
22import com.fs.starfarer.api.campaign.PlanetAPI;
23import com.fs.starfarer.api.campaign.SectorEntityToken;
24import com.fs.starfarer.api.campaign.SpecialItemData;
25import com.fs.starfarer.api.campaign.StarSystemAPI;
26import com.fs.starfarer.api.campaign.econ.CommoditySpecAPI;
27import com.fs.starfarer.api.campaign.econ.MarketAPI;
28import com.fs.starfarer.api.campaign.rules.HasMemory;
29import com.fs.starfarer.api.campaign.rules.MemoryAPI;
30import com.fs.starfarer.api.characters.AbilityPlugin;
31import com.fs.starfarer.api.characters.PersonAPI;
32import com.fs.starfarer.api.combat.ShipVariantAPI;
33import com.fs.starfarer.api.fleet.FleetMemberAPI;
34import com.fs.starfarer.api.fleet.ShipRolePick;
35import com.fs.starfarer.api.impl.campaign.DerelictShipEntityPlugin.DerelictShipData;
36import com.fs.starfarer.api.impl.campaign.DerelictShipEntityPlugin.DerelictType;
37import com.fs.starfarer.api.impl.campaign.fleets.DefaultFleetInflater;
38import com.fs.starfarer.api.impl.campaign.fleets.DefaultFleetInflaterParams;
39import com.fs.starfarer.api.impl.campaign.fleets.FleetFactoryV3;
40import com.fs.starfarer.api.impl.campaign.fleets.FleetParamsV3;
41import com.fs.starfarer.api.impl.campaign.ids.Abilities;
42import com.fs.starfarer.api.impl.campaign.ids.Conditions;
43import com.fs.starfarer.api.impl.campaign.ids.Factions;
44import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
45import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
46import com.fs.starfarer.api.impl.campaign.ids.ShipRoles;
47import com.fs.starfarer.api.impl.campaign.ids.Skills;
48import com.fs.starfarer.api.impl.campaign.missions.hub.MissionTrigger.TriggerAction;
49import com.fs.starfarer.api.impl.campaign.missions.hub.MissionTrigger.TriggerActionContext;
50import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator;
51import com.fs.starfarer.api.impl.campaign.procgen.themes.RemnantSeededFleetManager;
52import com.fs.starfarer.api.impl.campaign.procgen.themes.SalvageSpecialAssigner;
53import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.BaseSalvageSpecial;
54import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.TransmitterTrapSpecial;
55import com.fs.starfarer.api.impl.campaign.skills.OfficerTraining;
56import com.fs.starfarer.api.impl.campaign.terrain.StarCoronaTerrainPlugin;
57import com.fs.starfarer.api.util.Misc;
58import com.fs.starfarer.api.util.WeightedRandomPicker;
59
68public abstract class HubMissionWithTriggers extends BaseHubMission {
69
70 public static enum FleetSize {
71 TINY(0.06f),
72 VERY_SMALL(0.1f),
73 SMALL(0.2f),
74 MEDIUM(0.35f),
75 LARGE(0.5f),
76 LARGER(0.6f),
77 VERY_LARGE(0.7f),
78 HUGE(0.9f),
79 MAXIMUM(1.1f);
80
81 public float maxFPFraction;
82 private FleetSize(float maxFPFraction) {
83 this.maxFPFraction = maxFPFraction;
84 }
85
86 private static FleetSize [] vals = values();
87 public FleetSize next() {
88 int index = this.ordinal() + 1;
89 if (index >= vals.length) index = vals.length - 1;
90 return vals[index];
91 }
92 public FleetSize prev() {
93 int index = this.ordinal() - 1;
94 if (index < 0) index = 0;
95 return vals[index];
96 }
97 }
98
99 public static enum FleetQuality {
100 VERY_LOW(-1f, 0),
101 LOWER(-0.5f, 0),
102 DEFAULT(0f, 0),
103 HIGHER(0.5f, 0),
104 VERY_HIGH(1f, 0),
105 SMOD_1(1.5f, 1),
106 SMOD_2(1.5f, 2),
107 SMOD_3(1.5f, 3);
108
109
110 public float qualityMod;
111 public int numSMods;
112 private FleetQuality(float qualityMod, int numSMods) {
113 this.qualityMod = qualityMod;
114 this.numSMods = numSMods;
115 }
116
117 private static FleetQuality [] vals = values();
118 public FleetQuality next() {
119 int index = this.ordinal() + 1;
120 if (index >= vals.length) index = vals.length - 1;
121 return vals[index];
122 }
123 public FleetQuality prev() {
124 int index = this.ordinal() - 1;
125 if (index < 0) index = 0;
126 return vals[index];
127 }
128 }
129
130 public static enum OfficerNum {
131 NONE,
132 FC_ONLY,
133 FEWER,
134 DEFAULT,
135 MORE,
136 ALL_SHIPS;
137
138 private static OfficerNum [] vals = values();
139 public OfficerNum next() {
140 int index = this.ordinal() + 1;
141 if (index >= vals.length) index = vals.length - 1;
142 return vals[index];
143 }
144 public OfficerNum prev() {
145 int index = this.ordinal() - 1;
146 if (index < 0) index = 0;
147 return vals[index];
148 }
149 }
150
151 public static enum OfficerQuality {
152 LOWER,
153 DEFAULT,
154 HIGHER,
155 UNUSUALLY_HIGH,
156 AI_GAMMA,
157 AI_BETA,
158 AI_BETA_OR_GAMMA,
159 AI_ALPHA,
160 AI_OMEGA,
161 AI_MIXED;
162
163 private static OfficerQuality [] vals = values();
164 public OfficerQuality next() {
165 int index = this.ordinal() + 1;
166 if (index >= vals.length) index = vals.length - 1;
167 return vals[index];
168 }
169 public OfficerQuality prev() {
170 int index = this.ordinal() - 1;
171 if (index < 0) index = 0;
172 return vals[index];
173 }
174 }
175
176 public static class FleetAddTugs implements TriggerAction {
177 int numTugs = 0;
178 public FleetAddTugs(int numTugs) {
179 this.numTugs = numTugs;
180 }
181 public void doAction(TriggerActionContext context) {
182 if (context.fleet != null) {
183 addTugsToFleet(context.fleet, numTugs, ((BaseHubMission)context.mission).genRandom);
184 }
185 }
186 }
187
188 public static class UnhideCommListing implements TriggerAction {
189 protected PersonAPI person;
190 public UnhideCommListing(PersonAPI person) {
191 this.person = person;
192 }
193
194 public void doAction(TriggerActionContext context) {
195 if (person.getMarket() != null) {
196 MarketAPI market = person.getMarket();
197 if (market.getCommDirectory().getEntryForPerson(person) == null) {
198 market.getCommDirectory().addPerson(person);
199 }
200 if (market.getCommDirectory().getEntryForPerson(person) != null) {
201 market.getCommDirectory().getEntryForPerson(person).setHidden(false);
202 }
203 }
204 }
205 }
206
210 public static class HideCommListing implements TriggerAction {
211 protected PersonAPI person;
212 public HideCommListing(PersonAPI person) {
213 this.person = person;
214 }
215
216 public void doAction(TriggerActionContext context) {
217 if (person.getMarket() != null) {
218 MarketAPI market = person.getMarket();
219 if (market.getCommDirectory().getEntryForPerson(person) == null) {
220 market.getCommDirectory().addPerson(person);
221 }
222 if (market.getCommDirectory().getEntryForPerson(person) != null) {
223 market.getCommDirectory().getEntryForPerson(person).setHidden(true);
224 }
225 }
226 }
227 }
228
229 public static class MovePersonToMarket implements TriggerAction {
230 protected PersonAPI person;
231 protected MarketAPI market;
232 protected boolean alwaysAddToComms;
233
234 public MovePersonToMarket(PersonAPI person, MarketAPI market, boolean alwaysAddToComms) {
235 super();
236 this.person = person;
237 this.market = market;
238 this.alwaysAddToComms = alwaysAddToComms;
239 }
240
241
242 public void doAction(TriggerActionContext context) {
243 Misc.moveToMarket(person, market, alwaysAddToComms);
244 }
245 }
246
247
248 public static class DespawnEntityAction implements TriggerAction {
249 protected SectorEntityToken entity;
250 public DespawnEntityAction(SectorEntityToken entity) {
251 this.entity = entity;
252 }
253
254 public void doAction(TriggerActionContext context) {
255 Misc.fadeAndExpire(entity);
256 }
257 }
258
259 public static class MakeDiscoverableAction implements TriggerAction {
260 protected float range;
261 protected float xp;
262 public MakeDiscoverableAction(float range, float xp) {
263 this.range = range;
264 this.xp = xp;
265 }
266
267 public void doAction(TriggerActionContext context) {
268 ((BaseHubMission)context.mission).makeDiscoverable(context.entity, range, xp);
269
270 }
271 }
272
273 //public void spawnShipGraveyard(String factionId, int minShips, int maxShips, LocData data) {
274 public static class SpawnShipGraveyardAction implements TriggerAction {
275 protected String factionId;
276 protected int minShips;
277 protected int maxShips;
278 protected LocData data;
279 public SpawnShipGraveyardAction(String factionId, int minShips, int maxShips, LocData data) {
280 this.factionId = factionId;
281 this.minShips = minShips;
282 this.maxShips = maxShips;
283 this.data = data;
284 }
285
286 public void doAction(TriggerActionContext context) {
287 ((BaseHubMission)context.mission).spawnShipGraveyard(factionId, minShips, maxShips, data);
288 }
289
290 }
291 public static class SpawnDebrisFieldAction implements TriggerAction {
292 protected float radius;
293 protected float density;
294 protected LocData data;
295
296 public SpawnDebrisFieldAction(float radius, float density, LocData data) {
297 this.radius = radius;
298 this.density = density;
299 this.data = data;
300 }
301
302 public void doAction(TriggerActionContext context) {
303 SectorEntityToken entity = ((BaseHubMission)context.mission).spawnDebrisField(radius, density, data);
304 context.entity = entity;
305 }
306 }
307
308
309 public static class SpawnEntityAction implements TriggerAction {
310 protected String entityId;
311 protected LocData data;
312
313 public SpawnEntityAction(String entityId, LocData data) {
314 this.entityId = entityId;
315 this.data = data;
316 }
317
318 public void doAction(TriggerActionContext context) {
319 SectorEntityToken entity = ((BaseHubMission)context.mission).spawnEntity(entityId, data);
320 context.entity = entity;
321 }
322 }
323
324 public static class SpawnDerelictAction implements TriggerAction {
325 protected String hullId;
326 protected String factionId;
327 protected DerelictType type;
328 protected DerelictShipData shipData;
329 protected LocData data;
330
335 public SpawnDerelictAction(String hullId, String factionId, DerelictType type, LocData data) {
336 this.hullId = hullId;
337 this.factionId = factionId;
338 this.data = data;
339 this.type = type;
340 }
341
342 public SpawnDerelictAction(DerelictType type, LocData data) {
343 this.data = data;
344 this.type = type;
345 }
346 public SpawnDerelictAction(DerelictShipData shipData, LocData data) {
347 this.shipData = shipData;
348 this.data = data;
349 }
350
351 public void doAction(TriggerActionContext context) {
352 SectorEntityToken entity = null;
353 if (hullId != null) {
354 entity = ((BaseHubMission)context.mission).spawnDerelictHull(hullId, data);
355 } else if (factionId != null) {
356 entity = ((BaseHubMission)context.mission).spawnDerelict(factionId, type, data);
357 } else if (shipData != null) {
358 entity = ((BaseHubMission)context.mission).spawnDerelict(shipData, data);
359 } else {
360 entity = ((BaseHubMission)context.mission).spawnDerelictOfType(type, data);
361 }
362 context.entity = entity;
363 }
364 }
365
366
367
368 public static class SpawnFleetNearAction implements TriggerAction {
369 protected SectorEntityToken entity;
370 protected float range;
371
372 public SpawnFleetNearAction(SectorEntityToken entity, float range) {
373 this.entity = entity;
374 this.range = range;
375 }
376
377 public void doAction(TriggerActionContext context) {
378 entity.getContainingLocation().addEntity(context.fleet);
379 Vector2f loc = Misc.getPointWithinRadius(entity.getLocation(), range);
380 context.fleet.setLocation(loc.x, loc.y);
381 }
382 }
383 public static class SetFleetFactionAction implements TriggerAction {
384 protected String factionId;
385
386 public SetFleetFactionAction(String factionId) {
387 this.factionId = factionId;
388 }
389
390 public void doAction(TriggerActionContext context) {
391 context.fleet.setFaction(factionId, true);
392 }
393 }
394
395 public static class SetEntityToPickedJumpPoint implements TriggerAction {
396 public SetEntityToPickedJumpPoint() {
397 }
398
399 public void doAction(TriggerActionContext context) {
400 context.entity = context.jumpPoint;
401 }
402 }
403
404 public static class FleetMakeImportantAction implements TriggerAction {
405 protected String flag;
406 protected Enum[] stages;
407 public FleetMakeImportantAction(String flag, Enum ... stages) {
408 this.flag = flag;
409 this.stages = stages;
410 }
411 public void doAction(TriggerActionContext context) {
412 BaseHubMission bhm = (BaseHubMission) context.mission;
413 bhm.makeImportant(context.fleet, flag, stages);
414
415 if (stages != null && Arrays.asList(stages).contains(bhm.getCurrentStage())) {
416 Misc.makeImportant(context.fleet.getMemoryWithoutUpdate(), bhm.getReason());
417 bhm.changes.add(new MadeImportant(context.fleet.getMemoryWithoutUpdate(), bhm.getReason()));
418
419 if (flag != null) {
420 context.fleet.getMemoryWithoutUpdate().set(flag, true);
421 bhm.changes.add(new VariableSet(context.fleet.getMemoryWithoutUpdate(), flag, true));
422 }
423 }
424// else if (stages == null) {
425// Misc.makeImportant(context.fleet.getMemoryWithoutUpdate(), bhm.getReason());
426// }
427
428// if (context.mission instanceof BaseHubMission) {
429// Misc.makeImportant(context.fleet.getMemoryWithoutUpdate(), reason);
430// BaseHubMission bhm = (BaseHubMission) context.mission;
431// bhm.changes.add(new MadeImportant(context.fleet.getMemoryWithoutUpdate(), reason));
432// }
433 }
434 }
435
436 public static class EntityMakeImportantAction implements TriggerAction {
437 protected String flag;
438 protected Enum[] stages;
439 public EntityMakeImportantAction(String flag, Enum ... stages) {
440 this.flag = flag;
441 this.stages = stages;
442 }
443 public void doAction(TriggerActionContext context) {
444 BaseHubMission bhm = (BaseHubMission) context.mission;
445 bhm.makeImportant(context.entity, flag, stages);
446
447 if (Arrays.asList(stages).contains(bhm.getCurrentStage())) {
448 Misc.makeImportant(context.entity.getMemoryWithoutUpdate(), bhm.getReason());
449 bhm.changes.add(new MadeImportant(context.entity.getMemoryWithoutUpdate(), bhm.getReason()));
450
451 if (flag != null) {
452 context.entity.getMemoryWithoutUpdate().set(flag, true);
453 bhm.changes.add(new VariableSet(context.entity.getMemoryWithoutUpdate(), flag, true));
454 }
455 }
456
457// if (context.mission instanceof BaseHubMission) {
458// Misc.makeImportant(context.entity.getMemoryWithoutUpdate(), reason);
459// BaseHubMission bhm = (BaseHubMission) context.mission;
460// bhm.changes.add(new MadeImportant(context.entity.getMemoryWithoutUpdate(), reason));
461// }
462 }
463 }
464
465 public static class SetFleetFlagsWithReasonAction implements TriggerAction {
466 protected String[] flags;
467 protected String reason;
468 protected boolean permanent;
469
470 public SetFleetFlagsWithReasonAction(String reason, boolean permanent, String ... flags) {
471 this.permanent = permanent;
472 this.flags = flags;
473 this.reason = reason;
474 }
475
476 public void doAction(TriggerActionContext context) {
477 BaseHubMission bhm = (BaseHubMission) context.mission;
478 for (String flag : flags) {
480 flag, reason, true, -1f);
481
482 if (context.makeAllFleetFlagsPermanent) {
483 permanent = true;
484 }
485
486 if (!permanent && bhm != null) {
487 String requiredKey = flag + "_" + reason;
488 bhm.changes.add(new VariableSet(context.fleet.getMemoryWithoutUpdate(), requiredKey, true));
489 }
490 }
491 }
492 }
493
494 public static class UnsetFleetFlagsWithReasonAction implements
495 TriggerAction {
496 protected String[] flags;
497 protected String reason;
498
499 public UnsetFleetFlagsWithReasonAction(String reason, String ... flags) {
500 this.reason = reason;
501 this.flags = flags;
502 }
503
504 public void doAction(TriggerActionContext context) {
505 for (String flag : flags) {
507 flag, reason, false, -1f);
508 }
509 }
510 }
511
512
513 public static class SetPersonMissionRefAction implements TriggerAction {
514 protected String key;
515
516 public SetPersonMissionRefAction(String key) {
517 this.key = key;
518 }
519
520 public void doAction(TriggerActionContext context) {
521 context.person.getMemoryWithoutUpdate().set(key, context.mission);
522 }
523 }
524
525
526 public static class SetFleetMissionRefAction implements TriggerAction {
527 protected String key;
528
529 public SetFleetMissionRefAction(String key) {
530 this.key = key;
531 }
532
533 public void doAction(TriggerActionContext context) {
534 context.fleet.getMemoryWithoutUpdate().set(key, context.mission);
535 }
536 }
537
538
539 public static class SetMemoryValueAction implements TriggerAction {
540 protected String key;
541 protected Object value;
542 protected MemoryAPI memory;
543 protected boolean removeOnMissionOver;
544
545 public SetMemoryValueAction(MemoryAPI memory, String key, Object value, boolean removeOnMissionOver) {
546 this.memory = memory;
547 this.key = key;
548 this.value = value;
549 this.removeOnMissionOver = removeOnMissionOver;
550 }
551
552 public void doAction(TriggerActionContext context) {
553 memory.set(key, value);
554 BaseHubMission bhm = (BaseHubMission) context.mission;
555 bhm.changes.add(new VariableSet(memory, key, removeOnMissionOver));
556 }
557 }
558
559 public static class SetMemoryValueAfterDelay implements TriggerAction, EveryFrameScript {
560 protected String key;
561 protected Object value;
562 protected MemoryAPI memory;
563 protected float delay;
564
565 public SetMemoryValueAfterDelay(float delay, MemoryAPI memory, String key, Object value) {
566 this.memory = memory;
567 this.key = key;
568 this.value = value;
569 this.delay = delay;
570 }
571
572 public void doAction(TriggerActionContext context) {
573 if (delay <= 0) {
574 memory.set(key, value);
575 } else {
576 Global.getSector().addScript(this);
577 }
578 }
579
580 public boolean isDone() {
581 return delay < 0;
582 }
583
584 public boolean runWhilePaused() {
585 return false;
586 }
587
588 public void advance(float amount) {
589 if (delay < 0) return;
590 float days = Global.getSector().getClock().convertToDays(amount);
591 delay -= days;
592 if (delay < 0) {
593 memory.set(key, value);
594 }
595 }
596 }
597
598 public static class AddTagAfterDelay implements TriggerAction, EveryFrameScript {
599 protected String tag;
600 protected float delay;
601 protected StarSystemAPI system;
602
603 public AddTagAfterDelay(float delay, StarSystemAPI system, String tag) {
604 this.delay = delay;
605 this.system = system;
606 this.tag = tag;
607 }
608
609 public void doAction(TriggerActionContext context) {
610 Global.getSector().addScript(this);
611 }
612
613 public boolean isDone() {
614 return delay < 0;
615 }
616
617 public boolean runWhilePaused() {
618 return false;
619 }
620
621 public void advance(float amount) {
622 if (delay < 0) return;
623 float days = Global.getSector().getClock().convertToDays(amount);
624 delay -= days;
625 if (delay < 0) {
626 system.addTag(tag);
627 }
628 }
629 }
630
631 public static class RunScriptAfterDelay implements TriggerAction, EveryFrameScript {
632 protected float delay;
633 protected Script script;
634
635 public RunScriptAfterDelay(float delay, Script script) {
636 this.script = script;
637 this.delay = delay;
638 }
639
640 public void doAction(TriggerActionContext context) {
641 Global.getSector().addScript(this);
642 }
643
644 public boolean isDone() {
645 return delay < 0;
646 }
647
648 public boolean runWhilePaused() {
649 return false;
650 }
651
652 public void advance(float amount) {
653 if (delay < 0) return;
654 float days = Global.getSector().getClock().convertToDays(amount);
655 delay -= days;
656 if (delay < 0 && script != null) {
657 script.run();
658 script = null;
659 }
660 }
661 }
662
663 public static class IncreaseMarketHostileTimeout implements TriggerAction {
664 protected MarketAPI market;
665 protected float days;
666
667 public IncreaseMarketHostileTimeout(MarketAPI market, float days) {
668 this.market = market;
669 this.days = days;
670 }
671
672 public void doAction(TriggerActionContext context) {
674 }
675 }
676
677 public static class SetFleetMemoryValueAction implements TriggerAction {
678 protected String key;
679 protected Object value;
680
681 public SetFleetMemoryValueAction(String key, Object value) {
682 this.key = key;
683 this.value = value;
684 }
685
686 public void doAction(TriggerActionContext context) {
687 context.fleet.getMemoryWithoutUpdate().set(key, value);
688 }
689 }
690
691 public static class AddFleetDefeatTriggerAction implements TriggerAction {
692 protected String trigger;
693 protected boolean permanent;
694 public AddFleetDefeatTriggerAction(String trigger, boolean permanent) {
695 this.trigger = trigger;
696 this.permanent = permanent;
697 }
698 public void doAction(TriggerActionContext context) {
699 ((BaseHubMission)context.mission).addFleetDefeatTrigger(context.fleet, trigger, permanent);
700 }
701 }
702
703 public static class MakeFleetFlagsPermanentAction implements TriggerAction {
704 protected boolean permanent;
705 public MakeFleetFlagsPermanentAction(boolean permanent) {
706 this.permanent = permanent;
707 }
708 public void doAction(TriggerActionContext context) {
709 context.makeAllFleetFlagsPermanent = permanent;
710 }
711 }
712
713
714 public static class AddTagsAction implements TriggerAction {
715 protected String [] tags;
716
717 public AddTagsAction(String ... tags) {
718 this.tags = tags;
719 }
720
721 public void doAction(TriggerActionContext context) {
722 for (String tag : tags) {
723 context.fleet.addTag(tag);
724 }
725 }
726 }
727
728 public static class AddCommanderSkillAction implements TriggerAction {
729 protected String skill;
730 protected int level;
731
732 public AddCommanderSkillAction(String skill, int level) {
733 this.skill = skill;
734 this.level = level;
735 }
736
737 public void doAction(TriggerActionContext context) {
738 context.fleet.getCommanderStats().setSkillLevel(skill, level);
739 }
740 }
741
742 public static class SetFleetFlagAction implements TriggerAction {
743 protected String flag;
744 protected Object[] stages;
745 protected boolean permanent;
746
747 public SetFleetFlagAction(String flag, boolean permanent, Object ... stages) {
748 this.flag = flag;
749 this.permanent = permanent;
750 this.stages = stages;
751 }
752
753 public void doAction(TriggerActionContext context) {
754 if (context.makeAllFleetFlagsPermanent) {
755 permanent = true;
756 }
757 ((BaseHubMission)context.mission).setFlag(context.fleet, flag, permanent, stages);
758 }
759 }
760
761 public static class SetEntityFlagAction implements TriggerAction {
762 protected String flag;
763 protected Object[] stages;
764 protected boolean permanent;
765
766 public SetEntityFlagAction(String flag, boolean permanent, Object ... stages) {
767 this.flag = flag;
768 this.permanent = permanent;
769 this.stages = stages;
770 }
771
772 public void doAction(TriggerActionContext context) {
773 ((BaseHubMission)context.mission).setFlag(context.entity, flag, permanent, stages);
774 }
775 }
776
777
778 public static class UnsetFleetFlagsAction implements TriggerAction {
779 protected String[] flags;
780
781 public UnsetFleetFlagsAction(String ... flags) {
782 this.flags = flags;
783 }
784
785 public void doAction(TriggerActionContext context) {
786 for (String flag : flags) {
787 context.fleet.getMemoryWithoutUpdate().unset(flag);
788 }
789 }
790 }
791
792 public static class UnsetEntityFlagsAction implements TriggerAction {
793 protected String[] flags;
794
795 public UnsetEntityFlagsAction(String ... flags) {
796 this.flags = flags;
797 }
798
799 public void doAction(TriggerActionContext context) {
800 for (String flag : flags) {
801 context.entity.getMemoryWithoutUpdate().unset(flag);
802 }
803 }
804 }
805
806
807 public static class SaveEntityReferenceAction implements TriggerAction {
808 protected MemoryAPI memory;
809 protected String key;
810 public SaveEntityReferenceAction(MemoryAPI memory, String key) {
811 this.memory = memory;
812 this.key = key;
813 }
814
815 public void doAction(TriggerActionContext context) {
816 memory.set(key, context.entity);
817 ((BaseHubMission) context.mission).changes.add(new VariableSet(memory, key, true));
818 }
819 }
820
821 public static class SaveFleetReferenceAction implements TriggerAction {
822 protected MemoryAPI memory;
823 protected String key;
824 public SaveFleetReferenceAction(MemoryAPI memory, String key) {
825 this.memory = memory;
826 this.key = key;
827 }
828
829 public void doAction(TriggerActionContext context) {
830 memory.set(key, context.fleet);
831 ((BaseHubMission) context.mission).changes.add(new VariableSet(memory, key, true));
832 }
833 }
834
835 public static class RemoveAbilitiesAction implements TriggerAction {
836 protected String[] abilities;
837
838 public RemoveAbilitiesAction(String ... abilities) {
839 this.abilities = abilities;
840 }
841
842 public void doAction(TriggerActionContext context) {
843 for (String ability : abilities) {
844 context.fleet.removeAbility(ability);
845 }
846 }
847 }
848
849
850 public static class AddAbilitiesAction implements TriggerAction {
851 protected String[] abilities;
852
853 public AddAbilitiesAction(String ... abilities) {
854 this.abilities = abilities;
855 }
856
857 public void doAction(TriggerActionContext context) {
858 for (String ability : abilities) {
859 context.fleet.addAbility(ability);
860 }
861 }
862 }
863
864 public static class GenericAddTagsAction implements TriggerAction {
865 protected String [] tags;
866 protected SectorEntityToken entity;
867
868 public GenericAddTagsAction(SectorEntityToken entity, String ... tags) {
869 this.tags = tags;
870 this.entity = entity;
871 }
872
873 public void doAction(TriggerActionContext context) {
874 for (String tag : tags) {
875 entity.addTag(tag);
876 }
877 }
878 }
879
880 public static class GenericRemoveTagsAction implements TriggerAction {
881 protected String [] tags;
882 protected SectorEntityToken entity;
883
884 public GenericRemoveTagsAction(SectorEntityToken entity, String ... tags) {
885 this.tags = tags;
886 this.entity = entity;
887 }
888
889 public void doAction(TriggerActionContext context) {
890 for (String tag : tags) {
891 entity.removeTag(tag);
892 }
893 }
894 }
895
896 public static class MakeNonStoryCriticalAction implements TriggerAction {
897 protected MemoryAPI [] memoryArray;
898
899 public MakeNonStoryCriticalAction(MemoryAPI ... memoryArray) {
900 this.memoryArray = memoryArray;
901 }
902 public void doAction(TriggerActionContext context) {
903 BaseHubMission bhm = (BaseHubMission) context.mission;
904 for (MemoryAPI memory : memoryArray) {
905 Misc.makeNonStoryCritical(memory, bhm.getReason());
906 }
907 }
908 }
909
910
911 public static class SetInflaterAction implements TriggerAction {
912 protected FleetInflater inflater;
913
914 public SetInflaterAction(FleetInflater inflater) {
915 this.inflater = inflater;
916 }
917
918 public void doAction(TriggerActionContext context) {
919 context.fleet.setInflater(inflater);
920 }
921 }
922
923
924 public static class SetRemnantConfigAction implements TriggerAction {
925 protected boolean dormant;
926 protected long seed;
927
928 public SetRemnantConfigAction(boolean dormant, long seed) {
929 this.dormant = dormant;
930 this.seed = seed;
931 }
932
933 public void doAction(TriggerActionContext context) {
934 Random random = new Random(seed);
935 RemnantSeededFleetManager.initRemnantFleetProperties(random, context.fleet, dormant);
936 }
937 }
938
939
940 public static class AddCustomDropAction implements TriggerAction {
941 protected CargoAPI cargo;
942
943 public AddCustomDropAction(CargoAPI cargo) {
944 this.cargo = cargo;
945 }
946
947 public void doAction(TriggerActionContext context) {
948 BaseSalvageSpecial.addExtraSalvage(context.fleet, cargo);
949 }
950 }
951
952
953 public static class AddCommodityDropAction implements TriggerAction {
954 protected int quantity;
955 protected String commodityId;
956 protected boolean dropQuantityBasedOnShipsDestroyed;
957
958 public AddCommodityDropAction(int quantity, String commodityId, boolean dropQuantityBasedOnShipsDestroyed) {
959 this.quantity = quantity;
960 this.commodityId = commodityId;
961 this.dropQuantityBasedOnShipsDestroyed = dropQuantityBasedOnShipsDestroyed;
962 }
963
964 public void doAction(TriggerActionContext context) {
965 if (dropQuantityBasedOnShipsDestroyed) {
966 context.fleet.getCargo().addCommodity(commodityId, quantity);
967 } else {
968 CargoAPI cargo = Global.getFactory().createCargo(true);
969 cargo.addCommodity(commodityId, quantity);
970 BaseSalvageSpecial.addExtraSalvage(context.fleet, cargo);
971 }
972 }
973 }
974
975 public static class AddCommodityFractionDropAction implements TriggerAction {
976 protected float fraction;
977 protected String commodityId;
978 protected boolean dropQuantityBasedOnShipsDestroyed;
979
980 public AddCommodityFractionDropAction(float fraction, String commodityId) {
981 this.fraction = fraction;
982 this.commodityId = commodityId;
983 }
984
985 public void doAction(TriggerActionContext context) {
987 float capacity = context.fleet.getCargo().getMaxCapacity();
988 if (spec.isFuel()) {
989 capacity = context.fleet.getCargo().getMaxFuel();
990 } else if (spec.isPersonnel()) {
991 capacity = context.fleet.getCargo().getMaxPersonnel();
992 }
993 int quantity = (int) Math.round(fraction * capacity);
994 if (quantity > 0) {
995 context.fleet.getCargo().addCommodity(commodityId, quantity);
996 }
997 }
998 }
999
1000
1001 public static class AddWeaponDropAction implements TriggerAction {
1002 protected int quantity;
1003 protected String weaponId;
1004
1005 public AddWeaponDropAction(int quantity, String weaponId) {
1006 this.quantity = quantity;
1007 this.weaponId = weaponId;
1008 }
1009
1010 public void doAction(TriggerActionContext context) {
1011 CargoAPI cargo = Global.getFactory().createCargo(true);
1012 cargo.addWeapons(weaponId, quantity);
1013 BaseSalvageSpecial.addExtraSalvage(context.fleet, cargo);
1014 }
1015 }
1016
1017
1018 public static class AddFighterLPCDropAction implements TriggerAction {
1019 protected String wingId;
1020 protected int quantity;
1021
1022 public AddFighterLPCDropAction(String wingId, int quantity) {
1023 this.wingId = wingId;
1024 this.quantity = quantity;
1025 }
1026
1027 public void doAction(TriggerActionContext context) {
1028 CargoAPI cargo = Global.getFactory().createCargo(true);
1029 cargo.addFighters(wingId, quantity);
1030 BaseSalvageSpecial.addExtraSalvage(context.fleet, cargo);
1031 }
1032 }
1033
1034
1035 public static class AddHullmodDropAction implements TriggerAction {
1036 protected String hullmodId;
1037
1038 public AddHullmodDropAction(String hullmodId) {
1039 this.hullmodId = hullmodId;
1040 }
1041
1042 public void doAction(TriggerActionContext context) {
1043 CargoAPI cargo = Global.getFactory().createCargo(true);
1044 cargo.addHullmods(hullmodId, 1);
1045 BaseSalvageSpecial.addExtraSalvage(context.fleet, cargo);
1046 }
1047 }
1048
1049
1050 public static class AddSpecialItemDropAction implements TriggerAction {
1051 protected String data;
1052 protected String itemId;
1053
1054 public AddSpecialItemDropAction(String data, String itemId) {
1055 this.data = data;
1056 this.itemId = itemId;
1057 }
1058
1059 public void doAction(TriggerActionContext context) {
1060 CargoAPI cargo = Global.getFactory().createCargo(true);
1061 cargo.addSpecial(new SpecialItemData(itemId, data), 1);
1062 BaseSalvageSpecial.addExtraSalvage(context.fleet, cargo);
1063 }
1064 }
1065
1066
1067 public static class SpawnFleetAtPickedLocationAction implements
1068 TriggerAction {
1069 protected float range;
1070
1071 public SpawnFleetAtPickedLocationAction(float range) {
1072 this.range = range;
1073 }
1074
1075 public void doAction(TriggerActionContext context) {
1076 context.containingLocation.addEntity(context.fleet);
1077 Vector2f loc = Misc.getPointWithinRadius(context.coordinates, range);
1078 context.fleet.setLocation(loc.x, loc.y);
1079 }
1080 }
1081
1082
1083 public static class PickSetLocationAction implements TriggerAction {
1084 protected Vector2f coordinates;
1085 protected LocationAPI location;
1086
1087 public PickSetLocationAction(Vector2f coordinates, LocationAPI location) {
1088 this.coordinates = coordinates;
1089 this.location = location;
1090 }
1091
1092 public void doAction(TriggerActionContext context) {
1093 context.coordinates = coordinates;
1094 context.containingLocation = location;
1095 }
1096 }
1097
1098
1099 public static class PickLocationInHyperspaceAction implements TriggerAction {
1100 protected StarSystemAPI system;
1101
1102 public PickLocationInHyperspaceAction(StarSystemAPI system) {
1103 this.system = system;
1104 }
1105
1106 public void doAction(TriggerActionContext context) {
1107 //CampaignFleetAPI playerFleet = Global.getSector().getPlayerFleet();
1108 Vector2f pick = pickLocationWithinArc(((BaseHubMission)context.mission).genRandom, system.getHyperspaceAnchor(), 0, 360f, 2000f, 0f, 1000f);
1109
1110 context.coordinates = pick;
1111 //context.containingLocation = playerFleet.getContainingLocation();
1112 context.containingLocation = Global.getSector().getHyperspace();
1113 }
1114 }
1115
1116
1117 public static class PickLocationTowardsPlayerAction implements TriggerAction {
1118 protected SectorEntityToken entity;
1119 protected float arc;
1120 protected float minDist;
1121 protected float maxDist;
1122 protected float minDistFromPlayer;
1123
1124 public PickLocationTowardsPlayerAction(SectorEntityToken entity,
1125 float arc, float minDist, float maxDist, float minDistFromPlayer) {
1126 this.entity = entity;
1127 this.arc = arc;
1128 this.minDist = minDist;
1129 this.maxDist = maxDist;
1130 this.minDistFromPlayer = minDistFromPlayer;
1131 }
1132
1133 public void doAction(TriggerActionContext context) {
1134 if (entity == null) entity = context.entity;
1135 if (entity == null) entity = context.jumpPoint;
1136
1138 float dir = Misc.getAngleInDegrees(playerFleet.getLocation(), entity.getLocation());
1139 dir += 180f;
1140 if (playerFleet.getContainingLocation() != entity.getContainingLocation()) {
1141 dir = ((BaseHubMission)context.mission).genRandom.nextFloat() * 360f;
1142 }
1143
1144 Vector2f pick = pickLocationWithinArc(((BaseHubMission)context.mission).genRandom, entity, dir, arc, minDistFromPlayer, minDist, maxDist);
1145
1146 context.coordinates = pick;
1147 //context.containingLocation = playerFleet.getContainingLocation();
1148 context.containingLocation = entity.getContainingLocation();
1149 }
1150 }
1151 public static class PickLocationTowardsEntityAction implements TriggerAction {
1152 protected SectorEntityToken entity;
1153 protected float arc;
1154 protected float minDist;
1155 protected float maxDist;
1156 protected float minDistFromPlayer;
1157
1158 public PickLocationTowardsEntityAction(SectorEntityToken entity,
1159 float arc, float minDist, float maxDist, float minDistFromPlayer) {
1160 this.entity = entity;
1161 this.arc = arc;
1162 this.minDist = minDist;
1163 this.maxDist = maxDist;
1164 this.minDistFromPlayer = minDistFromPlayer;
1165 }
1166
1167 public void doAction(TriggerActionContext context) {
1168 if (entity == null) entity = context.entity;
1169 if (entity == null) entity = context.jumpPoint;
1170
1172 float dir = Misc.getAngleInDegrees(playerFleet.getLocation(), entity.getLocation());
1173 //dir += 180f;
1174 if (playerFleet.getContainingLocation() != entity.getContainingLocation()) {
1175 dir = ((BaseHubMission)context.mission).genRandom.nextFloat() * 360f;
1176 }
1177
1178 Vector2f pick = pickLocationWithinArc(((BaseHubMission)context.mission).genRandom, playerFleet, dir, arc, minDistFromPlayer, minDist, maxDist);
1179
1180 context.coordinates = pick;
1181 //context.containingLocation = playerFleet.getContainingLocation();
1182 context.containingLocation = entity.getContainingLocation();
1183 }
1184 }
1185
1186
1187 public static class PickLocationAwayFromPlayerAction implements
1188 TriggerAction {
1189 protected float minDist;
1190 protected SectorEntityToken entity;
1191 protected float maxDist;
1192 protected float arc;
1193 protected float minDistFromPlayer;
1194
1195 public PickLocationAwayFromPlayerAction(float minDist,
1196 SectorEntityToken entity, float maxDist, float arc,
1197 float minDistFromPlayer) {
1198 this.minDist = minDist;
1199 this.entity = entity;
1200 this.maxDist = maxDist;
1201 this.arc = arc;
1202 this.minDistFromPlayer = minDistFromPlayer;
1203 }
1204
1205 public void doAction(TriggerActionContext context) {
1206 if (entity == null) entity = context.entity;
1207 if (entity == null) entity = context.jumpPoint;
1208
1210 float dir = Misc.getAngleInDegrees(playerFleet.getLocation(), entity.getLocation());
1211 if (playerFleet.getContainingLocation() != entity.getContainingLocation()) {
1212 dir = ((BaseHubMission)context.mission).genRandom.nextFloat() * 360f;
1213 }
1214
1215 Vector2f pick = pickLocationWithinArc(((BaseHubMission)context.mission).genRandom, entity, dir, arc, minDistFromPlayer, minDist, maxDist);
1216
1217 context.coordinates = pick;
1218 //context.containingLocation = playerFleet.getContainingLocation();
1219 context.containingLocation = entity.getContainingLocation();
1220 }
1221 }
1222
1223
1224 public static class PickLocationAroundPlayerAction implements TriggerAction {
1225 protected float maxDist;
1226 protected float minDist;
1227
1228 public PickLocationAroundPlayerAction(float maxDist, float minDist) {
1229 this.maxDist = maxDist;
1230 this.minDist = minDist;
1231 }
1232
1233 public void doAction(TriggerActionContext context) {
1235 Vector2f pick = pickLocationWithinArc(((BaseHubMission)context.mission).genRandom, playerFleet, 0, 360f, minDist, minDist, maxDist);
1236
1237 context.coordinates = pick;
1238 context.containingLocation = playerFleet.getContainingLocation();
1239 }
1240 }
1241
1242
1243 public static class PickLocationAroundEntityAction implements TriggerAction {
1244 protected float minDist;
1245 protected SectorEntityToken entity;
1246 protected float maxDist;
1247 protected float minDistFromPlayer;
1248
1249 public PickLocationAroundEntityAction(float minDist,
1250 SectorEntityToken entity, float maxDist, float minDistFromPlayer) {
1251 this.minDist = minDist;
1252 this.entity = entity;
1253 this.maxDist = maxDist;
1254 this.minDistFromPlayer = minDistFromPlayer;
1255 }
1256
1257 public void doAction(TriggerActionContext context) {
1258 if (entity == null) entity = context.entity;
1259 if (entity == null) entity = context.jumpPoint;
1260 Vector2f pick = pickLocationWithinArc(((BaseHubMission)context.mission).genRandom, entity, 0, 360f, minDistFromPlayer, minDist, maxDist);
1261
1262 context.coordinates = pick;
1263 context.containingLocation = entity.getContainingLocation();
1264 }
1265 }
1266
1267
1268 public static class PickLocationWithinArcAction implements TriggerAction {
1269 protected float arc;
1270 protected SectorEntityToken entity;
1271 protected float maxDist;
1272 protected float minDist;
1273 protected float minDistFromPlayer;
1274 protected float dir;
1275
1276 public PickLocationWithinArcAction(float arc, SectorEntityToken entity,
1277 float maxDist, float minDist, float minDistFromPlayer, float dir) {
1278 this.arc = arc;
1279 this.entity = entity;
1280 this.maxDist = maxDist;
1281 this.minDist = minDist;
1282 this.minDistFromPlayer = minDistFromPlayer;
1283 this.dir = dir;
1284 }
1285
1286 public void doAction(TriggerActionContext context) {
1287 if (entity == null) entity = context.entity;
1288 if (entity == null) entity = context.jumpPoint;
1289
1290 Vector2f pick = pickLocationWithinArc(((BaseHubMission)context.mission).genRandom, entity, dir, arc, minDistFromPlayer, minDist, maxDist);
1291
1292 context.coordinates = pick;
1293 context.containingLocation = entity.getContainingLocation();
1294 }
1295 }
1296
1297
1298 public static class FleetSetPatrolActionText implements TriggerAction {
1299 protected String text;
1300 public FleetSetPatrolActionText(String text) {
1301 this.text = text;
1302 }
1303
1304 public void doAction(TriggerActionContext context) {
1305 context.patrolText = text;
1306 }
1307 }
1308
1309 public static class FleetSetTravelActionText implements TriggerAction {
1310 protected String text;
1311 public FleetSetTravelActionText(String text) {
1312 this.text = text;
1313 }
1314
1315 public void doAction(TriggerActionContext context) {
1316 context.travelText = text;
1317 }
1318 }
1319
1320 public static class OrderFleetPatrolSystemAction implements TriggerAction {
1321 protected StarSystemAPI system;
1322
1323 public OrderFleetPatrolSystemAction(StarSystemAPI system) {
1324 this.system = system;
1325 }
1326
1327 public void doAction(TriggerActionContext context) {
1328 context.fleet.addScript(new TriggerFleetAssignmentAI(context.travelText, context.patrolText, context.mission, system, false,
1329 context.fleet, (SectorEntityToken[])null));
1330 }
1331 }
1332
1333
1334 public static class OrderFleetPatrolPointsAction implements TriggerAction {
1335 protected List<SectorEntityToken> patrolPoints;
1336 protected boolean randomizeLocation;
1337 protected StarSystemAPI system;
1338
1339 public OrderFleetPatrolPointsAction(SectorEntityToken[] patrolPoints,
1340 boolean randomizeLocation, StarSystemAPI system) {
1341 this.patrolPoints = new ArrayList<SectorEntityToken>();
1342 for (SectorEntityToken curr : patrolPoints) {
1343 this.patrolPoints.add(curr);
1344 }
1345 this.randomizeLocation = randomizeLocation;
1346 this.system = system;
1347 }
1348
1349 public void doAction(TriggerActionContext context) {
1350 context.fleet.addScript(new TriggerFleetAssignmentAI(context.travelText, context.patrolText,
1351 context.mission, system, randomizeLocation, context.fleet, patrolPoints.toArray(new SectorEntityToken[0])));
1352 }
1353 }
1354
1355 public static class OrderFleetPatrolSpawnedEntity implements TriggerAction {
1356 protected boolean moveToNearEntity;
1357
1358 public OrderFleetPatrolSpawnedEntity(boolean moveToNearEntity) {
1359 this.moveToNearEntity = moveToNearEntity;
1360 }
1361
1362 public void doAction(TriggerActionContext context) {
1363 SectorEntityToken entity = context.entity;
1364 if (entity == null) entity = context.jumpPoint;
1365 if (entity == null) entity = context.token;
1366 if (entity == null) entity = context.planet;
1367 context.fleet.addScript(
1368 new TriggerFleetAssignmentAI(context.travelText, context.patrolText, context.mission,
1369 context.entity.getContainingLocation(), moveToNearEntity, context.fleet, entity));
1370 }
1371 }
1372
1373
1374 public static class OrderFleetPatrolTagsAction implements TriggerAction {
1375 protected List<SectorEntityToken> added;
1376 protected StarSystemAPI system;
1377 protected boolean randomizeLocation;
1378 protected String[] tags;
1379
1380 public OrderFleetPatrolTagsAction(StarSystemAPI system,
1381 boolean randomizeLocation, String ... tags) {
1382 this.system = system;
1383 this.randomizeLocation = randomizeLocation;
1384 this.tags = tags;
1385 }
1386
1387 public void doAction(TriggerActionContext context) {
1388 List<SectorEntityToken> points = new ArrayList<SectorEntityToken>();
1389 for (SectorEntityToken entity : system.getAllEntities()) {
1390 for (String tag : tags) {
1391 if (entity.hasTag(tag)) {
1392 points.add(entity);
1393 break;
1394 }
1395 }
1396 }
1397 if (added != null) points.addAll(added);
1398 context.fleet.addScript(new TriggerFleetAssignmentAI(context.travelText, context.patrolText, context.mission, system, randomizeLocation, context.fleet,
1399 points.toArray(new SectorEntityToken[0])));
1400 }
1401 }
1402
1403 public static class OrderFleetStopPursuingPlayerUnlessInStage implements TriggerAction {
1404 protected List<Object> stages;
1405 protected BaseHubMission mission;
1406 public OrderFleetStopPursuingPlayerUnlessInStage(BaseHubMission mission, Object...stages) {
1407 this.mission = mission;
1408 this.stages = Arrays.asList(stages);
1409 }
1410
1411 public void doAction(TriggerActionContext context) {
1412 context.fleet.addScript(new MissionFleetStopPursuingPlayer(context.fleet, mission, stages));
1413 }
1414 }
1415
1416 public static class OrderFleetInterceptNearbyPlayerInStage implements TriggerAction {
1417 protected List<Object> stages;
1418 protected BaseHubMission mission;
1419 protected float maxRange;
1420 protected boolean repeatable;
1421 protected boolean mustBeStrongEnoughToFight;
1422 protected float repeatDelay;
1423 public OrderFleetInterceptNearbyPlayerInStage(BaseHubMission mission,
1424 boolean mustBeStrongEnoughToFight,
1425 float maxRange,
1426 boolean repeatable, float repeatDelay, Object...stages) {
1427 this.mission = mission;
1428 this.mustBeStrongEnoughToFight = mustBeStrongEnoughToFight;
1429 this.maxRange = maxRange;
1430 this.repeatable = repeatable;
1431 this.repeatDelay = repeatDelay;
1432 this.stages = Arrays.asList(stages);
1433 }
1434
1435 public void doAction(TriggerActionContext context) {
1436 context.fleet.addScript(new MissionFleetInterceptPlayerIfNearby(context.fleet, mission,
1437 mustBeStrongEnoughToFight, maxRange, repeatable, repeatDelay, stages));
1438 }
1439 }
1440
1441
1442 public static class OrderFleetInterceptPlayerAction implements TriggerAction {
1443 protected boolean makeHostile;
1444 public OrderFleetInterceptPlayerAction(boolean makeHostile) {
1445 this.makeHostile = makeHostile;
1446 }
1447
1448 public void doAction(TriggerActionContext context) {
1449 TransmitterTrapSpecial.makeFleetInterceptPlayer(context.fleet, false, false, makeHostile, 1000f);
1450 if (!context.fleet.hasScriptOfClass(MissionFleetAutoDespawn.class)) {
1451 context.fleet.addScript(new MissionFleetAutoDespawn(context.mission, context.fleet));
1452 }
1453 }
1454 }
1455
1456 public static class OrderFleetEBurn implements TriggerAction {
1457 public OrderFleetEBurn() {
1458 }
1459
1460 public void doAction(TriggerActionContext context) {
1462 if (eb != null && eb.isUsable()) eb.activate();
1463 }
1464 }
1465
1466
1467 public static class FleetNoAutoDespawnAction implements TriggerAction {
1468 public void doAction(TriggerActionContext context) {
1469 context.fleet.removeScriptsOfClass(MissionFleetAutoDespawn.class);
1470 }
1471 }
1472
1473
1474 public static class PickLocationAtInSystemJumpPointAction implements TriggerAction {
1475 protected StarSystemAPI system;
1476 protected float minDistFromPlayer;
1477
1478 public PickLocationAtInSystemJumpPointAction(StarSystemAPI system,
1479 float minDistFromPlayer) {
1480 this.system = system;
1481 this.minDistFromPlayer = minDistFromPlayer;
1482 }
1483
1484 public void doAction(TriggerActionContext context) {
1486 picker.addAll(system.getJumpPoints());
1487
1488 SectorEntityToken pick = picker.pick();
1489 Vector2f loc = pickLocationWithinArc(((BaseHubMission)context.mission).genRandom, pick, 0, 360f, minDistFromPlayer, 0f, 0f);
1490
1491 context.jumpPoint = pick;
1492 context.coordinates = loc;
1493 context.containingLocation = system;
1494 }
1495 }
1496
1497 public static class PickLocationAtClosestToPlayerJumpPointAction implements TriggerAction {
1498 protected StarSystemAPI system;
1499 protected float minDistFromPlayer;
1500
1501 public PickLocationAtClosestToPlayerJumpPointAction(StarSystemAPI system, float minDistFromPlayer) {
1502 this.system = system;
1503 this.minDistFromPlayer = minDistFromPlayer;
1504 }
1505
1506 public void doAction(TriggerActionContext context) {
1508
1509 SectorEntityToken closest = null;
1510 float minDist = Float.MAX_VALUE;
1511 for (SectorEntityToken jp : system.getJumpPoints()) {
1512 if (system.isCurrentLocation()) {
1513 float dist = Misc.getDistance(jp, Global.getSector().getPlayerFleet());
1514 if (dist < minDist) {
1515 closest = jp;
1516 minDist = dist;
1517 }
1518 } else {
1519 picker.add(jp);
1520 }
1521 }
1522 if (closest != null) {
1523 picker.add(closest);
1524 }
1525
1526 SectorEntityToken pick = picker.pick();
1527 Vector2f loc = pickLocationWithinArc(((BaseHubMission)context.mission).genRandom, pick, 0, 360f, minDistFromPlayer, 0f, 0f);
1528
1529 context.jumpPoint = pick;
1530 context.coordinates = loc;
1531 context.containingLocation = system;
1532 }
1533 }
1534
1541 public static class PickLocationAtClosestToEntityJumpPointAction implements TriggerAction {
1542 protected StarSystemAPI system;
1543 protected float minDistFromEntity;
1544 protected SectorEntityToken entity;
1545
1546 public PickLocationAtClosestToEntityJumpPointAction(StarSystemAPI system, SectorEntityToken entity, float minDistFromEntity) {
1547 this.system = system;
1548 this.entity = entity;
1549 this.minDistFromEntity = minDistFromEntity;
1550 }
1551
1552 public void doAction(TriggerActionContext context) {
1554
1555 SectorEntityToken closest = null;
1556 float minDist = Float.MAX_VALUE;
1557 for (SectorEntityToken jp : system.getJumpPoints()) {
1558 if (system.isCurrentLocation()) {
1559 float dist = Misc.getDistance(jp, entity);
1560 if (dist < minDist) {
1561 closest = jp;
1562 minDist = dist;
1563 }
1564 } else {
1565 picker.add(jp);
1566 }
1567 }
1568 if (closest != null) {
1569 picker.add(closest);
1570 }
1571
1572 SectorEntityToken pick = picker.pick();
1573 Vector2f loc = pickLocationWithinArc(((BaseHubMission)context.mission).genRandom, pick, 0, 360f, minDistFromEntity, 0f, 0f);
1574
1575 context.jumpPoint = pick;
1576 context.coordinates = loc;
1577 context.containingLocation = system;
1578 }
1579 }
1580
1581 public static class CreateFleetAction implements TriggerAction {
1582 public long seed;
1583
1584 public FleetParamsV3 params;
1585 public FleetSize fSize;
1586 public Float fSizeOverride;
1587 public Float combatFleetPointsOverride;
1588 public FleetQuality fQuality;
1589 public Float fQualityMod;
1590 public Integer fQualitySMods;
1591 public OfficerNum oNum;
1592 public OfficerQuality oQuality;
1593 public Boolean doNotIntegrateAICores;
1594 public String faction = null;
1595
1596 public Float freighterMult = null;
1597 public Float tankerMult = null;
1598 public Float linerMult = null;
1599 public Float transportMult = null;
1600 public Float utilityMult = null;
1601 public Float qualityMod = null;
1602 public Float qualityOverride = null;
1603
1604 public Float damage = null;
1605
1606 public Boolean allWeapons;
1607 public ShipPickMode shipPickMode;
1608 public Boolean removeInflater;
1609
1610 public String nameOverride = null;
1611 public Boolean noFactionInName = null;
1612
1613 public CreateFleetAction(String type, Vector2f locInHyper,
1614 FleetSize fSize, FleetQuality fQuality, String factionId) {
1615 seed = Misc.genRandomSeed();
1616 params = new FleetParamsV3(locInHyper, factionId, null, type, 0f, 0f, 0f, 0f, 0f, 0f, 0f);
1617 params.ignoreMarketFleetSizeMult = true;
1618
1619 this.fSize = fSize;
1620 this.fQuality = fQuality;
1621
1622 freighterMult = 0.1f;
1623 tankerMult = 0.1f;
1624 }
1625
1626 public void doAction(TriggerActionContext context) {
1627 //Random random = new Random(seed);
1628 Random random = null;
1629 if (context.mission != null) {
1630 random = ((BaseHubMission)context.mission).genRandom;
1631 } else {
1632 random = Misc.random;
1633 }
1634 FactionAPI faction = Global.getSector().getFaction(params.factionId);
1635 float maxPoints = faction.getApproximateMaxFPPerFleet(ShipPickMode.PRIORITY_THEN_ALL);
1636
1637 //strength = FleetStrength.MAXIMUM;
1638
1639 //float fraction = fSize.maxFPFraction * (0.9f + random.nextFloat() * 0.2f);
1640 float min = fSize.maxFPFraction - (fSize.maxFPFraction - fSize.prev().maxFPFraction) / 2f;
1641 float max = fSize.maxFPFraction + (fSize.next().maxFPFraction - fSize.maxFPFraction) / 2f;
1642 float fraction = min + (max - min) * random.nextFloat();
1643
1644 float excess = 0;
1645
1646 if (fSizeOverride != null) {
1647 fraction = fSizeOverride * (0.95f + random.nextFloat() * 0.1f);
1648 }
1649 else {
1650 int numShipsDoctrine = 1;
1651 if (params.doctrineOverride != null) numShipsDoctrine = params.doctrineOverride.getNumShips();
1652 else if (faction != null) numShipsDoctrine = faction.getDoctrine().getNumShips();
1653 float doctrineMult = FleetFactoryV3.getDoctrineNumShipsMult(numShipsDoctrine);
1654 fraction *= 0.75f * doctrineMult;
1655 if (fraction > FleetSize.MAXIMUM.maxFPFraction) {
1656 excess = fraction - FleetSize.MAXIMUM.maxFPFraction;
1657 fraction = FleetSize.MAXIMUM.maxFPFraction;
1658 }
1659 }
1660
1661 //fraction = 1f;
1662
1663 float combatPoints = fraction * maxPoints;
1664 if (combatFleetPointsOverride != null) {
1665 combatPoints = combatFleetPointsOverride;
1666 }
1667
1668 FactionDoctrineAPI doctrine = params.doctrineOverride;
1669 if (excess > 0) {
1670 if (doctrine == null) {
1671 doctrine = faction.getDoctrine().clone();
1672 }
1673 int added = (int)Math.round(excess / 0.1f);
1674 if (added > 0) {
1675 doctrine.setOfficerQuality(Math.min(5, doctrine.getOfficerQuality() + added));
1676 doctrine.setShipQuality(doctrine.getShipQuality() + added);
1677 }
1678 }
1679// if (fraction > 0.5f && false) {
1680// if (doctrine == null) {
1681// doctrine = faction.getDoctrine().clone();
1682// }
1683// int added = (int)Math.round((fraction - 0.5f) / 0.1f);
1684// if (added > 0) {
1685// doctrine.setNumShips(Math.max(1, doctrine.getNumShips() - added));
1686// doctrine.setOfficerQuality(Math.min(5, doctrine.getOfficerQuality() + added));
1687// doctrine.setShipQuality(doctrine.getShipQuality() + added);
1688// }
1689// }
1690
1691 if (freighterMult == null) freighterMult = 0f;
1692 if (tankerMult == null) tankerMult = 0f;
1693 if (linerMult == null) linerMult = 0f;
1694 if (transportMult == null) transportMult = 0f;
1695 if (utilityMult == null) utilityMult = 0f;
1696 if (qualityMod == null) qualityMod = 0f;
1697
1698 params.combatPts = combatPoints;
1699 params.freighterPts = combatPoints * freighterMult;
1700 params.tankerPts = combatPoints * tankerMult;
1701 params.transportPts = combatPoints * transportMult;
1702 params.linerPts = combatPoints * linerMult;
1703 params.utilityPts = combatPoints * utilityMult;
1704 params.qualityMod = qualityMod;
1705
1706// if (damage != null && damage > 0) {
1707// if (damage > 1) damage = 1f;
1708// float mult1 = 1f - damage;
1709// float mult2 = 1f - damage * 0.5f;
1710// params.combatPts *= mult1;
1711// params.freighterPts *= mult2;
1712// params.tankerPts *= mult2;
1713// params.transportPts *= mult2;
1714// params.linerPts *= mult2;
1715// params.utilityPts *= mult2;
1716// }
1717
1718 //params.modeOverride = ShipPickMode.PRIORITY_THEN_ALL;
1719 params.doctrineOverride = doctrine;
1720 params.random = random;
1721
1722
1723 if (fQuality != null) {
1724 switch (fQuality) {
1725 case VERY_LOW:
1726 if (fQualityMod != null) {
1727 params.qualityMod += fQuality.qualityMod;
1728 } else {
1729 params.qualityOverride = 0f;
1730 }
1731 break;
1732 case LOWER:
1733 params.qualityMod += fQuality.qualityMod;
1734 break;
1735 case DEFAULT:
1736 params.qualityMod += fQuality.qualityMod;
1737 break;
1738 case HIGHER:
1739 params.qualityMod += fQuality.qualityMod;
1740 break;
1741 case VERY_HIGH:
1742 if (fQualityMod != null) {
1743 params.qualityMod += fQuality.qualityMod;
1744 } else {
1745 params.qualityMod += fQuality.qualityMod;
1746 //params.qualityOverride = 1f;
1747 }
1748 break;
1749 case SMOD_1:
1750 params.qualityMod += fQuality.qualityMod;
1751 params.averageSMods = fQuality.numSMods;
1752 break;
1753 case SMOD_2:
1754 params.qualityMod += fQuality.qualityMod;
1755 params.averageSMods = fQuality.numSMods;
1756 break;
1757 case SMOD_3:
1758 params.qualityMod += fQuality.qualityMod;
1759 params.averageSMods = fQuality.numSMods;
1760 break;
1761 }
1762 }
1763 if (fQualityMod != null) {
1764 params.qualityMod += fQualityMod;
1765 }
1766 if (fQualitySMods != null) {
1767 params.averageSMods = fQualitySMods;
1768 }
1769
1770 if (oNum != null) {
1771 switch (oNum) {
1772 case NONE:
1773 params.withOfficers = false;
1774 break;
1775 case FC_ONLY:
1776 params.officerNumberMult = 0f;
1777 break;
1778 case FEWER:
1779 params.officerNumberMult = 0.5f;
1780 break;
1781 case DEFAULT:
1782 break;
1783 case MORE:
1784 params.officerNumberMult = 1.5f;
1785 break;
1786 case ALL_SHIPS:
1787 params.officerNumberBonus = Global.getSettings().getInt("maxShipsInAIFleet");
1788 break;
1789 }
1790 }
1791
1792 if (oQuality != null) {
1793 switch (oQuality) {
1794 case LOWER:
1795 params.officerLevelBonus = -3;
1796 params.officerLevelLimit = Global.getSettings().getInt("officerMaxLevel") - 1;
1797 params.commanderLevelLimit = Global.getSettings().getInt("maxAIFleetCommanderLevel") - 2;
1798 if (params.commanderLevelLimit < params.officerLevelLimit) {
1799 params.commanderLevelLimit = params.officerLevelLimit;
1800 }
1801 break;
1802 case DEFAULT:
1803 break;
1804 case HIGHER:
1805 params.officerLevelBonus = 2;
1806 params.officerLevelLimit = Global.getSettings().getInt("officerMaxLevel") + (int) OfficerTraining.MAX_LEVEL_BONUS;
1807 break;
1808 case UNUSUALLY_HIGH:
1809 params.officerLevelBonus = 4;
1810 params.officerLevelLimit = SalvageSpecialAssigner.EXCEPTIONAL_PODS_OFFICER_LEVEL;
1811 break;
1812 case AI_GAMMA:
1813 case AI_BETA:
1814 case AI_BETA_OR_GAMMA:
1815 case AI_ALPHA:
1816 case AI_MIXED:
1817 case AI_OMEGA:
1818 params.aiCores = oQuality;
1819 break;
1820 }
1821 if (doNotIntegrateAICores != null) {
1822 params.doNotIntegrateAICores = doNotIntegrateAICores;
1823 }
1824 }
1825
1826 if (shipPickMode != null) {
1827 params.modeOverride = shipPickMode;
1828 }
1829
1831 if (qualityOverride != null) {
1832 params.qualityOverride = qualityOverride + params.qualityMod;;
1833 }
1834 context.fleet = FleetFactoryV3.createFleet(params);
1835 context.fleet.setFacing(random.nextFloat() * 360f);
1836
1837 if (this.faction != null) {
1838 context.fleet.setFaction(this.faction, true);
1839 }
1840
1841 if (this.nameOverride != null) {
1842 context.fleet.setName(this.nameOverride);
1843 }
1844 if (this.noFactionInName != null && this.noFactionInName) {
1845 context.fleet.setNoFactionInName(noFactionInName);
1846 }
1847
1848 if (removeInflater != null && removeInflater) {
1849 context.fleet.setInflater(null);
1850 } else {
1851 if (context.fleet.getInflater() instanceof DefaultFleetInflater) {
1852 DefaultFleetInflater inflater = (DefaultFleetInflater) context.fleet.getInflater();
1853 if (inflater.getParams() instanceof DefaultFleetInflaterParams) {
1855 if (allWeapons != null) {
1856 p.allWeapons = allWeapons;
1857 }
1858 if (shipPickMode != null) {
1859 p.mode = shipPickMode;
1860 }
1861 }
1862 }
1863 }
1864
1865 context.fleet.getMemoryWithoutUpdate().set(MemFlags.FLEET_BUSY, true);
1866 //context.fleet.getMemoryWithoutUpdate().set("$LP_titheAskedFor", true);
1867
1868 context.allFleets.add(context.fleet);
1869
1870 if (!context.fleet.hasScriptOfClass(MissionFleetAutoDespawn.class)) {
1871 context.fleet.addScript(new MissionFleetAutoDespawn(context.mission, context.fleet));
1872 }
1873
1874 if (damage != null) {
1875 FleetFactoryV3.applyDamageToFleet(context.fleet, damage, false, random);
1876 }
1877
1878// if (Factions.PIRATES.equals(params.factionId)) {
1879//
1880// }
1881 }
1882 }
1883
1884
1885// public TriggerAction getPreviousAction() {
1886// if (currTrigger.getActions().isEmpty()) return null;
1887// return currTrigger.getActions().get(currTrigger.getActions().size() - 1);
1888// }
1889 public CreateFleetAction getPreviousCreateFleetAction() {
1890 for (int i = currTrigger.getActions().size() - 1; i >= 0; i--) {
1891 TriggerAction action = currTrigger.getActions().get(i);
1892 if (action instanceof CreateFleetAction) {
1893 return (CreateFleetAction) action;
1894 }
1895 }
1896 return null;
1897 }
1898
1899 public void triggerMovePersonToMarket(PersonAPI person, MarketAPI market, boolean alwaysAddToComms) {
1900 triggerCustomAction(new MovePersonToMarket(person, market, alwaysAddToComms));
1901 }
1902 public void triggerIncreaseMarketHostileTimeout(MarketAPI market, float days) {
1903 triggerCustomAction(new IncreaseMarketHostileTimeout(market, days));
1904 }
1905 public void triggerRunScriptAfterDelay(float delay, Script script) {
1906 triggerCustomAction(new RunScriptAfterDelay(delay, script));
1907 }
1908 public void triggerAddTagAfterDelay(float delay, StarSystemAPI system, String tag) {
1909 triggerCustomAction(new AddTagAfterDelay(delay, system, tag));
1910 }
1911 public void triggerSetMemoryValueAfterDelay(float delay, HasMemory hasMemory, String key, Object value) {
1912 triggerSetMemoryValueAfterDelay(delay, hasMemory.getMemory(), key, value);
1913 }
1914 public void triggerSetMemoryValueAfterDelay(float delay, MemoryAPI memory, String key, Object value) {
1915 triggerCustomAction(new SetMemoryValueAfterDelay(delay, memory, key, value));
1916 }
1917 public void triggerSetGlobalMemoryValueAfterDelay(float delay, String key, Object value) {
1918 triggerCustomAction(new SetMemoryValueAfterDelay(delay, Global.getSector().getMemory(), key, value));
1919 }
1920 public float genDelay(float base) {
1921 return base * StarSystemGenerator.getNormalRandom(genRandom, 0.75f, 1.25f);
1922 }
1923
1925 triggerCustomAction(new UnhideCommListing(person));
1926 }
1927 public void triggerHideCommListing(PersonAPI person) {
1928 triggerCustomAction(new HideCommListing(person));
1929 }
1933 public void triggerSaveEntityRef(MemoryAPI memory, String key) {
1934 triggerCustomAction(new SaveEntityReferenceAction(memory, key));
1935 }
1939 public void triggerSaveFleetRef(MemoryAPI memory, String key) {
1940 triggerCustomAction(new SaveFleetReferenceAction(memory, key));
1941 }
1942
1946
1947 public void triggerCreateFleet(FleetSize size, FleetQuality quality, String factionId, String type, StarSystemAPI roughlyWhere) {
1948 triggerCustomAction(new CreateFleetAction(type, roughlyWhere.getLocation(), size, quality, factionId));
1949 }
1950 public void triggerCreateFleet(FleetSize size, FleetQuality quality, String factionId, String type, SectorEntityToken roughlyWhere) {
1951 triggerCustomAction(new CreateFleetAction(type, roughlyWhere.getLocationInHyperspace(), size, quality, factionId));
1952 }
1953 public void triggerCreateFleet(FleetSize size, FleetQuality quality, String factionId, String type, Vector2f locInHyper) {
1954 triggerCustomAction(new CreateFleetAction(type, locInHyper, size, quality, factionId));
1955 }
1956
1957 public void triggerAutoAdjustFleetSize(FleetSize min, FleetSize max) {
1958 float f = getQualityFraction();
1959 CreateFleetAction cfa = getPreviousCreateFleetAction();
1960 cfa.fSizeOverride = min.maxFPFraction + (max.maxFPFraction - min.maxFPFraction) * f;
1961
1963 }
1964
1965 public void triggerSetFleetSizeFraction(float fractionOfMax) {
1966 CreateFleetAction cfa = getPreviousCreateFleetAction();
1967 cfa.fSizeOverride = fractionOfMax;
1968 }
1969 public void triggerSetFleetCombatFleetPoints(float combatFleetPointsOverride) {
1970 CreateFleetAction cfa = getPreviousCreateFleetAction();
1971 cfa.combatFleetPointsOverride = combatFleetPointsOverride;
1972 }
1973 public void triggerAutoAdjustFleetQuality(FleetQuality min, FleetQuality max) {
1974 float f = getQualityFraction();
1975 CreateFleetAction cfa = getPreviousCreateFleetAction();
1976 cfa.fQualityMod = min.qualityMod + (max.qualityMod - min.qualityMod) * f;
1977 cfa.fQualitySMods = (int) Math.round(min.numSMods + (max.numSMods - min.numSMods) * f);
1978 if (cfa.fQualitySMods <= 0) {
1979 cfa.fQualitySMods = null;
1980 }
1981 }
1982
1983 public void triggerAutoAdjustOfficerNum(OfficerNum min, OfficerNum max) {
1984 float f = getQualityFraction();
1985 CreateFleetAction cfa = getPreviousCreateFleetAction();
1986 cfa.oNum = (OfficerNum) pickEnum(f, getEnums(min, max));
1987 }
1988 public void triggerAutoAdjustOfficerQuality(OfficerQuality min, OfficerQuality max) {
1989 float f = getQualityFraction();
1990 CreateFleetAction cfa = getPreviousCreateFleetAction();
1991 cfa.oQuality = (OfficerQuality) pickEnum(f, getEnums(min, max));
1992 }
1993
1994 public void triggerSetFleetQuality(FleetQuality quality) {
1995 CreateFleetAction cfa = getPreviousCreateFleetAction();
1996 if (cfa != null) {
1997 cfa.fQuality = quality;
1998 }
1999 }
2000 public void triggerSetFleetSize(FleetSize size) {
2001 CreateFleetAction cfa = getPreviousCreateFleetAction();
2002 if (cfa != null) {
2003 cfa.fSize= size;
2004 }
2005 }
2006
2008 CreateFleetAction cfa = getPreviousCreateFleetAction();
2009 FleetSize size = cfa.fSize;
2010 if (size == null) size = FleetSize.MEDIUM;
2011
2012 float min = size.maxFPFraction - (size.maxFPFraction - size.prev().maxFPFraction) / 2f;
2013 float max = size.maxFPFraction + (size.next().maxFPFraction - size.maxFPFraction) / 2f;
2014 cfa.fSizeOverride = min + (max - min) * genRandom.nextFloat();
2015 //triggerAutoAdjustFleetSize(size.prev(), size.next());
2016
2017 FleetQuality fq = cfa.fQuality;
2018 if (fq == null) fq = FleetQuality.DEFAULT;
2019 min = fq.qualityMod - (fq.qualityMod - fq.prev().qualityMod) / 2f;
2020 max = fq.qualityMod + (fq.next().qualityMod - fq.qualityMod) / 2f;
2021 cfa.fQualityMod = min + (max - min) * genRandom.nextFloat();
2022 //triggerAutoAdjustFleetQuality(fq.prev(), fq.next());
2023 }
2024
2026 CreateFleetAction cfa = getPreviousCreateFleetAction();
2027 FleetSize size = cfa.fSize;
2028 if (size == null) size = FleetSize.MEDIUM;
2029
2030 triggerAutoAdjustFleetSize(size.prev(), size.next());
2031
2032 FleetQuality fq = cfa.fQuality;
2033 if (fq == null) fq = FleetQuality.DEFAULT;
2034 FleetQuality limit = FleetQuality.VERY_HIGH;
2035 FleetQuality next = fq;
2036 int steps = 1;
2037 while (next.next().ordinal() <= limit.ordinal() && steps > 0) {
2038 next = next.next();
2039 steps--;
2040 }
2041 limit = FleetQuality.LOWER;
2042 FleetQuality prev = fq;
2043 steps = 1;
2044 while (prev.prev().ordinal() >= limit.ordinal() && steps > 0) {
2045 prev = prev.prev();
2046 steps--;
2047 }
2049
2050
2051 OfficerNum oNum = cfa.oNum;
2052 if (oNum == null) oNum = OfficerNum.DEFAULT;
2053 if (oNum == OfficerNum.FEWER || oNum == OfficerNum.DEFAULT) {
2054 switch (oNum) {
2055 case FEWER:
2056 triggerAutoAdjustOfficerNum(OfficerNum.FEWER, OfficerNum.DEFAULT);
2057 break;
2058 case DEFAULT:
2059 triggerAutoAdjustOfficerNum(OfficerNum.DEFAULT, OfficerNum.MORE);
2060 break;
2061 }
2062 }
2063
2064 OfficerQuality oQuality = cfa.oQuality;
2065 if (oQuality == null) oQuality = OfficerQuality.DEFAULT;
2066 if (oQuality == OfficerQuality.LOWER || oQuality == OfficerQuality.DEFAULT) {
2067 switch (oQuality) {
2068 case LOWER:
2069 triggerAutoAdjustOfficerQuality(OfficerQuality.LOWER, OfficerQuality.DEFAULT);
2070 break;
2071 case DEFAULT:
2072 triggerAutoAdjustOfficerQuality(OfficerQuality.DEFAULT, OfficerQuality.HIGHER);
2073 break;
2074 }
2075 }
2076 }
2077
2079 CreateFleetAction cfa = getPreviousCreateFleetAction();
2080 FleetSize size = cfa.fSize;
2081 if (size == null) size = FleetSize.MEDIUM;
2082
2083 triggerAutoAdjustFleetSize(size.prev().prev(), size.next().next());
2084
2085 FleetQuality fq = cfa.fQuality;
2086 if (fq == null) fq = FleetQuality.DEFAULT;
2087 FleetQuality limit = FleetQuality.VERY_HIGH;
2088 FleetQuality next = fq;
2089 int steps = 2;
2090 while (next.next().ordinal() <= limit.ordinal() && steps > 0) {
2091 next = next.next();
2092 steps--;
2093 }
2094 limit = FleetQuality.LOWER;
2095 FleetQuality prev = fq;
2096 steps = 2;
2097 while (prev.prev().ordinal() >= limit.ordinal() && steps > 0) {
2098 prev = prev.prev();
2099 steps--;
2100 }
2102
2103
2104 OfficerNum oNum = cfa.oNum;
2105 if (oNum == null) oNum = OfficerNum.DEFAULT;
2106 if (oNum == OfficerNum.FEWER || oNum == OfficerNum.DEFAULT) {
2107 switch (oNum) {
2108 case FEWER:
2109 triggerAutoAdjustOfficerNum(OfficerNum.FEWER, OfficerNum.DEFAULT);
2110 break;
2111 case DEFAULT:
2112 triggerAutoAdjustOfficerNum(OfficerNum.DEFAULT, OfficerNum.MORE);
2113 break;
2114 }
2115 }
2116
2117 OfficerQuality oQuality = cfa.oQuality;
2118 if (oQuality == null) oQuality = OfficerQuality.DEFAULT;
2119 if (oQuality == OfficerQuality.LOWER || oQuality == OfficerQuality.DEFAULT) {
2120 switch (oQuality) {
2121 case LOWER:
2122 triggerAutoAdjustOfficerQuality(OfficerQuality.LOWER, OfficerQuality.DEFAULT);
2123 break;
2124 case DEFAULT:
2125 triggerAutoAdjustOfficerQuality(OfficerQuality.DEFAULT, OfficerQuality.HIGHER);
2126 break;
2127 }
2128 }
2129 }
2130
2132 CreateFleetAction cfa = getPreviousCreateFleetAction();
2133 FleetSize size = cfa.fSize;
2134 if (size == null) size = FleetSize.MEDIUM;
2135
2136 triggerAutoAdjustFleetSize(size.prev().prev(), size.next().next().next());
2137
2138 FleetQuality fq = cfa.fQuality;
2139 if (fq == null) fq = FleetQuality.DEFAULT;
2140 FleetQuality limit = FleetQuality.SMOD_1;
2141 FleetQuality next = fq;
2142 int steps = 3;
2143 while (next.next().ordinal() <= limit.ordinal() && steps > 0) {
2144 next = next.next();
2145 steps--;
2146 }
2147 limit = FleetQuality.LOWER;
2148 FleetQuality prev = fq;
2149 steps = 2;
2150 while (prev.prev().ordinal() >= limit.ordinal() && steps > 0) {
2151 prev = prev.prev();
2152 steps--;
2153 }
2155
2156
2157 OfficerNum oNum = cfa.oNum;
2158 if (oNum == null) oNum = OfficerNum.DEFAULT;
2159 if (oNum == OfficerNum.FEWER || oNum == OfficerNum.DEFAULT || oNum == OfficerNum.MORE) {
2160 switch (oNum) {
2161 case FEWER:
2162 triggerAutoAdjustOfficerNum(OfficerNum.FEWER, OfficerNum.MORE);
2163 break;
2164 case DEFAULT:
2165 triggerAutoAdjustOfficerNum(OfficerNum.FEWER, OfficerNum.ALL_SHIPS);
2166 break;
2167 case MORE:
2168 triggerAutoAdjustOfficerNum(OfficerNum.DEFAULT, OfficerNum.ALL_SHIPS);
2169 break;
2170 }
2171 }
2172
2173 OfficerQuality oQuality = cfa.oQuality;
2174 if (oQuality == null) oQuality = OfficerQuality.DEFAULT;
2175 if (oQuality == OfficerQuality.LOWER || oQuality == OfficerQuality.DEFAULT) {
2176 switch (oQuality) {
2177 case LOWER:
2178 triggerAutoAdjustOfficerQuality(OfficerQuality.LOWER, OfficerQuality.DEFAULT);
2179 break;
2180 case DEFAULT:
2181 triggerAutoAdjustOfficerQuality(OfficerQuality.DEFAULT, OfficerQuality.HIGHER);
2182 break;
2183 }
2184 }
2185 }
2186
2187
2188 protected transient boolean useQualityInsteadOfQualityFraction = false;
2195 public void setUseQualityInsteadOfQualityFraction(boolean temporarilyUseQualityInsteadOfQualityFraction) {
2196 this.useQualityInsteadOfQualityFraction = temporarilyUseQualityInsteadOfQualityFraction;
2197 }
2198
2203 protected float getQualityFraction() {
2204 float quality = getQuality();
2206 return quality;
2207 }
2208
2209 float minQuality = getMinQuality();
2210 float maxQuality = getMaxQuality();
2211 float base = getBaseQuality();
2212
2213 float f;
2214 if (quality < base) {
2215 float range = base - minQuality;
2216 f = 0f;
2217 if (range > 0) {
2218 f = (quality - minQuality) / range;
2219 }
2220 if (f < 0) f = 0;
2221 if (f > 1) f = 1;
2222 f = f * 0.5f;
2223 } else {
2224 float range = maxQuality - base;
2225 f = 1f;
2226 if (range > 0) {
2227 f = (quality - base) / range;
2228 }
2229 if (f < 0) f = 0;
2230 if (f > 1) f = 1;
2231 f = 0.5f + f * 0.5f;
2232 }
2233 return f;
2234 }
2235
2236 @SuppressWarnings("unchecked")
2237 protected Object [] getEnums(Enum from, Enum to) {
2238 return EnumSet.range(from, to).toArray();
2239 }
2240
2241 protected Object pickEnum(float f, Object ... enums) {
2242 float num = enums.length;
2243 f *= (num - 1f);
2244
2245 float rem = (float)(f - (int) f);
2246 if (rem < 0.2f) rem = 0f;
2247 if (rem > 0.8f) rem = 1f;
2248
2249 int index = (int) f;
2250 if (genRandom.nextFloat() < rem) {
2251 index++;
2252 }
2253 if (index > enums.length - 1) index = enums.length - 1;
2254 if (index < 0) index = 0;
2255 return enums[index];
2256 }
2257
2258// defaults to this
2259// public void triggerSetFleetCompositionStandardSupportShips() {
2260// triggerSetFleetComposition(0.1f, 0.1f, 0f, 0f, 0f, 0f);
2261// }
2262
2264 triggerSetFleetComposition(0f, 0f, 0f, 0f, 0f);
2265 }
2266
2267 public void triggerSetFleetComposition(float freighterMult, float tankerMult,
2268 float transportMult, float linerMult,
2269 float utilityMult) {
2270 CreateFleetAction cfa = getPreviousCreateFleetAction();
2271 if (freighterMult > 0) cfa.freighterMult = freighterMult;
2272 else cfa.freighterMult = null;
2273
2274 if (tankerMult > 0) cfa.tankerMult = tankerMult;
2275 else cfa.tankerMult = null;
2276
2277 if (transportMult > 0) cfa.transportMult = transportMult;
2278 else cfa.transportMult = null;
2279
2280 if (linerMult > 0) cfa.linerMult = linerMult;
2281 else cfa.linerMult = null;
2282
2283 if (utilityMult > 0) cfa.utilityMult = utilityMult;
2284 else cfa.utilityMult = null;
2285 }
2286
2287 public void triggerSetFleetDoctrineComp(int warships, int carriers, int phaseShips) {
2288 CreateFleetAction cfa = getPreviousCreateFleetAction();
2289
2290 if (cfa.params.doctrineOverride == null) {
2291 FactionAPI faction = Global.getSector().getFaction(cfa.params.factionId);
2292 cfa.params.doctrineOverride = faction.getDoctrine().clone();
2293 }
2294
2295 cfa.params.doctrineOverride.setWarships(warships);
2296 cfa.params.doctrineOverride.setCarriers(carriers);
2297 cfa.params.doctrineOverride.setPhaseShips(phaseShips);
2298 }
2299
2300 public void triggerAddShips(String ...variants) {
2301 CreateFleetAction cfa = getPreviousCreateFleetAction();
2302 if (cfa.params.addShips == null) {
2303 cfa.params.addShips = new ArrayList<String>();
2304 }
2305 for (String id : variants) {
2306 cfa.params.addShips.add(id);
2307 }
2308 }
2309
2311 CreateFleetAction cfa = getPreviousCreateFleetAction();
2312 if (cfa.params.doctrineOverride == null) {
2313 FactionAPI faction = Global.getSector().getFaction(cfa.params.factionId);
2314 cfa.params.doctrineOverride = faction.getDoctrine().clone();
2315 }
2316
2318 }
2319
2320 public void triggerSetFleetDoctrineQuality(int officerQuality, int shipQuality, int numShips) {
2321 CreateFleetAction cfa = getPreviousCreateFleetAction();
2322
2323 if (cfa.params.doctrineOverride == null) {
2324 FactionAPI faction = Global.getSector().getFaction(cfa.params.factionId);
2325 cfa.params.doctrineOverride = faction.getDoctrine().clone();
2326 }
2327
2328 if (officerQuality >= 0) {
2329 cfa.params.doctrineOverride.setOfficerQuality(officerQuality);
2330 }
2331
2332 if (shipQuality >= 0) {
2333 cfa.params.doctrineOverride.setShipQuality(shipQuality);
2334 }
2335
2336 if (numShips >= 0) {
2337 cfa.params.doctrineOverride.setNumShips(numShips);
2338 }
2339 }
2340
2341 public void triggerSetFleetDoctrineOther(int shipSize, int aggression) {
2342 CreateFleetAction cfa = getPreviousCreateFleetAction();
2343
2344 if (cfa.params.doctrineOverride == null) {
2345 FactionAPI faction = Global.getSector().getFaction(cfa.params.factionId);
2346 cfa.params.doctrineOverride = faction.getDoctrine().clone();
2347 }
2348
2349 if (shipSize >= 0) {
2350 cfa.params.doctrineOverride.setShipSize(shipSize);
2351 }
2352 if (aggression >= 0) {
2353 cfa.params.doctrineOverride.setAggression(aggression);
2354 }
2355 }
2356
2357 public void triggerSetFleetDoctrineRandomize(float randomizeProb) {
2358 CreateFleetAction cfa = getPreviousCreateFleetAction();
2359
2360 if (cfa.params.doctrineOverride == null) {
2361 FactionAPI faction = Global.getSector().getFaction(cfa.params.factionId);
2362 cfa.params.doctrineOverride = faction.getDoctrine().clone();
2363 }
2364
2365 cfa.params.doctrineOverride.setAutofitRandomizeProbability(randomizeProb);
2366 }
2367
2368 public void triggerSetFleetSizeAndQuality(FleetSize size, FleetQuality quality, String fleetType) {
2369 CreateFleetAction cfa = getPreviousCreateFleetAction();
2370 cfa.fSize = size;
2371 cfa.fQuality = quality;
2372 cfa.params.fleetType = fleetType;
2373 cfa.fSizeOverride = null;
2374 }
2375 public void triggerSetFleetType(String fleetType) {
2376 CreateFleetAction cfa = getPreviousCreateFleetAction();
2377 cfa.params.fleetType = fleetType;
2378 }
2379
2380 public void triggerSetFleetOfficers(OfficerNum num, OfficerQuality quality) {
2381 CreateFleetAction cfa = getPreviousCreateFleetAction();
2382 cfa.oNum = num;
2383 cfa.oQuality = quality;
2384 }
2385
2386 public void triggerFleetSetCommander(PersonAPI commander) {
2387 CreateFleetAction cfa = getPreviousCreateFleetAction();
2388 cfa.params.commander = commander;
2389 }
2390
2392 CreateFleetAction cfa = getPreviousCreateFleetAction();
2393 cfa.params.noCommanderSkills = true;
2394 }
2395
2396 public void triggerSetFleetMaxShipSize(int max) {
2397 CreateFleetAction cfa = getPreviousCreateFleetAction();
2398 cfa.params.maxShipSize = max;
2399 }
2400 public void triggerSetFleetMinShipSize(int min) {
2401 CreateFleetAction cfa = getPreviousCreateFleetAction();
2402 cfa.params.minShipSize = min;
2403 }
2404 public void triggerSetFleetMaxNumShips(int num) {
2405 CreateFleetAction cfa = getPreviousCreateFleetAction();
2406 cfa.params.maxNumShips = num;
2407 }
2408
2410 CreateFleetAction cfa = getPreviousCreateFleetAction();
2411 cfa.params.onlyRetainFlagship = true;
2412 }
2413 public void triggerFleetSetFlagship(String variantId) {
2414 CreateFleetAction cfa = getPreviousCreateFleetAction();
2415 cfa.params.flagshipVariantId = variantId;
2416 }
2417
2419 CreateFleetAction cfa = getPreviousCreateFleetAction();
2420 cfa.params.flagshipVariant = variant;
2421 }
2422
2424 CreateFleetAction cfa = getPreviousCreateFleetAction();
2425 cfa.removeInflater = true;
2426 }
2427
2428 public void triggerFleetSetShipPickMode(ShipPickMode mode) {
2429 CreateFleetAction cfa = getPreviousCreateFleetAction();
2430 cfa.shipPickMode = mode;
2431 }
2432
2434 CreateFleetAction cfa = getPreviousCreateFleetAction();
2435 cfa.allWeapons = true;
2436 }
2437
2438// public void triggerFleetSetFaction(String factionId) {
2439// CreateFleetAction cfa = getPreviousCreateFleetAction();
2440// cfa.faction = factionId;
2441// }
2442 public void triggerSetFleetFaction(final String factionId) {
2443// triggerCustomAction(new SetFleetFactionAction(factionId));
2444 CreateFleetAction cfa = getPreviousCreateFleetAction();
2445 cfa.faction = factionId;
2446 }
2447
2448 public void triggerFleetSetName(String name) {
2449 CreateFleetAction cfa = getPreviousCreateFleetAction();
2450 cfa.nameOverride = name;
2451 }
2453 CreateFleetAction cfa = getPreviousCreateFleetAction();
2454 cfa.noFactionInName = true;
2455 }
2457 CreateFleetAction cfa = getPreviousCreateFleetAction();
2458 cfa.doNotIntegrateAICores = true;
2459 }
2460
2462 CreateFleetAction cfa = getPreviousCreateFleetAction();
2463 return cfa.params;
2464 }
2465
2466
2467 public void triggerSetFleetCommander(final PersonAPI commander) {
2468 CreateFleetAction cfa = getPreviousCreateFleetAction();
2469 if (cfa != null && cfa.params != null) {
2470 cfa.params.commander = commander;
2471 } else {
2472 triggerCustomAction(new TriggerAction() {
2473 public void doAction(TriggerActionContext context) {
2474 context.fleet.setCommander(commander);
2475 context.fleet.getFleetData().ensureHasFlagship();
2476 }
2477 });
2478 }
2479 }
2480// commander will get overriden by default inflater so uh
2481// will it? doesn't seem like it would, looking at DFI
2482// public void triggerSetFleetCommanderFlags(final String ... flags) {
2483// triggerCustomAction(new TriggerAction() {
2484// public void doAction(TriggerActionContext context) {
2485// for (String flag : flags) {
2486// context.fleet.getCommander().getMemoryWithoutUpdate().set(flag, true);
2487// }
2488// }
2489// });
2490// }
2491
2492 public void triggerFleetMakeImportantPermanent(String flag) {
2493 triggerCustomAction(new FleetMakeImportantAction(flag, (Enum[]) null));
2494 }
2495 public void triggerFleetMakeImportant(String flag, Enum ... stages) {
2496 triggerCustomAction(new FleetMakeImportantAction(flag, stages));
2497 }
2498 public void triggerEntityMakeImportant(String flag, Enum ... stages) {
2499 triggerCustomAction(new EntityMakeImportantAction(flag, stages));
2500 }
2501
2502 public void triggerSetFleetFlagsWithReasonPermanent(final String ... flags) {
2503 triggerCustomAction(new SetFleetFlagsWithReasonAction(getReason(), true, flags));
2504 }
2505 public void triggerSetFleetFlagsWithReason(final String ... flags) {
2506 triggerCustomAction(new SetFleetFlagsWithReasonAction(getReason(), false, flags));
2507 }
2508
2509// public void setFleetFlagsWithReason(final String ... flags) {
2510// new SetFleetFlagsWithReasonAction(getReason(), false, flags).doAction(null);
2511// }
2512//
2513// public void setFleetFlag(String flag) {
2514// new SetFleetFlagAction(flag, false, (Object[])null).doAction(null);;
2515// }
2516
2517 public void triggerUnsetFleetFlagsWithReason(final String ... flags) {
2518 triggerCustomAction(new UnsetFleetFlagsWithReasonAction(getReason(), flags));
2519 }
2520 public void triggerSetPersonMissionRef(final String key) {
2521 triggerCustomAction(new SetPersonMissionRefAction(key));
2522 }
2523 public void triggerSetFleetMissionRef(final String key) {
2524 triggerCustomAction(new SetFleetMissionRefAction(key));
2525 }
2526
2527 public void triggerSetFleetMemoryValue(final String key, final Object value) {
2528 triggerCustomAction(new SetFleetMemoryValueAction(key, value));
2529 }
2530
2531 public void triggerSetMemoryValue(HasMemory withMemory, String key, Object value) {
2532 triggerCustomAction(new SetMemoryValueAction(withMemory.getMemoryWithoutUpdate(), key, value, true));
2533 }
2534 public void triggerSetMemoryValuePermanent(HasMemory withMemory, String key, Object value) {
2535 triggerCustomAction(new SetMemoryValueAction(withMemory.getMemoryWithoutUpdate(), key, value, false));
2536 }
2537
2538 public void triggerSetGlobalMemoryValue(final String key, final Object value) {
2539 triggerCustomAction(new SetMemoryValueAction(Global.getSector().getMemoryWithoutUpdate(), key, value, true));
2540 }
2541 public void triggerSetGlobalMemoryValuePermanent(final String key, final Object value) {
2542 triggerCustomAction(new SetMemoryValueAction(Global.getSector().getMemoryWithoutUpdate(), key, value, false));
2543 }
2544
2545 public void triggerSetFleetFlagPermanent(String flag) {
2546 triggerCustomAction(new SetFleetFlagAction(flag, true, (Object[])null));
2547 }
2548 public void triggerSetFleetGenericHailPermanent(String commsTrigger) {
2549 triggerSetFleetGenericHail(commsTrigger, (Object[])null);
2550 }
2551 public void triggerSetFleetGenericHail(String commsTrigger, Object ...stages) {
2552 if (stages == null || stages.length <= 0) {
2553 triggerSetFleetFlagPermanent("$genericHail");
2554 } else {
2555 triggerSetFleetFlag("$genericHail", stages);
2556 }
2557 triggerSetFleetMemoryValue("$genericHail_openComms", commsTrigger);
2558 }
2559 public void triggerSetFleetGenericHailIfNonHostilePermanent(String commsTrigger) {
2560 triggerSetFleetGenericHail(commsTrigger, (Object[])null);
2561 }
2562 public void triggerSetFleetGenericHailIfNonHostile(String commsTrigger, Object ...stages) {
2563 if (stages == null || stages.length <= 0) {
2564 triggerSetFleetFlagPermanent("$genericHail_nonHostile");
2565 } else {
2566 triggerSetFleetFlag("$genericHail_nonHostile", stages);
2567 }
2568 triggerSetFleetMemoryValue("$genericHail_openComms", commsTrigger);
2569 }
2570 public void triggerSetFleetFlag(String flag) {
2571 triggerCustomAction(new SetFleetFlagAction(flag, false, (Object[])null));
2572 }
2573 public void triggerSetEntityFlagPermanent(String flag) {
2574 triggerCustomAction(new SetEntityFlagAction(flag, true, (Object[])null));
2575 }
2576 public void triggerSetEntityFlag(String flag) {
2577 triggerCustomAction(new SetEntityFlagAction(flag, false, (Object[])null));
2578 }
2579 public void triggerSetFleetFlagPermanent(String flag, Object ... stages) {
2580 triggerCustomAction(new SetFleetFlagAction(flag, true, stages));
2581 }
2582 public void triggerSetFleetFlag(String flag, Object ... stages) {
2583 triggerCustomAction(new SetFleetFlagAction(flag, false, stages));
2584 }
2585 public void triggerUnsetFleetFlag(String flag) {
2586 triggerCustomAction(new UnsetFleetFlagsAction(flag));
2587 }
2588 public void triggerSetEntityFlagPermanent(String flag, Object ... stages) {
2589 triggerCustomAction(new SetEntityFlagAction(flag, true, stages));
2590 }
2591 public void triggerSetEntityFlag(String flag, Object ... stages) {
2592 triggerCustomAction(new SetEntityFlagAction(flag, false, stages));
2593 }
2594 public void triggerUnsetEntityFlag(String flag) {
2595 triggerCustomAction(new UnsetEntityFlagsAction(flag));
2596 }
2597// public void triggerMakeHostileAndAggressiveNotPermanent(Object ... stages) {
2598// triggerSetFleetFlagsWithReason(MemFlags.MEMORY_KEY_MAKE_HOSTILE,
2599// MemFlags.MEMORY_KEY_MAKE_AGGRESSIVE);
2600// triggerSetFleetFlag(MemFlags.MEMORY_KEY_MAKE_AGGRESSIVE_ONE_BATTLE_ONLY);
2601// }
2608
2625
2626 public void makeHostileAndAggressive(CampaignFleetAPI fleet, boolean permanent) {
2630 }
2631
2645// triggerSetFleetFlagsWithReason(MemFlags.MEMORY_KEY_MAKE_HOSTILE,
2646// MemFlags.MEMORY_KEY_MAKE_HOSTILE_WHILE_TOFF);
2648 }
2655// public void triggerMakeNoOneJoinBattleToHelp() {
2656// triggerSetFleetFlagsWithReason(MemFlags.MEMORY_KEY_NO_ONE_JOINTS_BATTLE_TO_HELP);
2657// }
2671
2675
2679
2686
2693
2701 public void triggerSetFleetExtraSmugglingSuspicion(float extraSuspicion) {
2703 }
2704 public void triggerMakeNonHostileToFaction(String factionId) {
2705 String flag = MemFlags.MEMORY_KEY_MAKE_NON_HOSTILE + "_" + factionId;
2706 triggerSetFleetFlag(flag);
2707 }
2708 public void triggerMakeHostileToFaction(String factionId) {
2709 String flag = MemFlags.MEMORY_KEY_MAKE_HOSTILE + "_" + factionId;
2710 triggerSetFleetFlag(flag);
2711 }
2728 triggerUnsetFleetFlag("$LP_titheAskedFor");
2729 }
2731 triggerSetFleetFlagPermanent("$LP_titheAskedFor");
2732 }
2733// public void triggerFleetAllowLongPursuitNotPermanent() {
2734// triggerSetFleetFlag(MemFlags.MEMORY_KEY_ALLOW_LONG_PURSUIT);
2735// }
2745
2749// public void triggerSetFleetAlwaysPursueNotPermanent() {
2750// triggerSetFleetFlag(MemFlags.MEMORY_KEY_MAKE_ALWAYS_PURSUE);
2751// }
2755
2774 public void triggerRemoveAbilities(final String ... abilities) {
2775 triggerCustomAction(new RemoveAbilitiesAction(abilities));
2776 }
2777 public void triggerAddAbilities(final String ... abilities) {
2778 triggerCustomAction(new AddAbilitiesAction(abilities));
2779 }
2780 public void triggerSetInflater(final FleetInflater inflater) {
2781 triggerCustomAction(new SetInflaterAction(inflater));
2782 }
2785 }
2789 public void triggerSetRemnantConfig(boolean dormant) {
2790 //final long seed = Misc.genRandomSeed();
2791 long seed = Misc.seedUniquifier() ^ genRandom.nextLong();
2792 triggerCustomAction(new SetRemnantConfigAction(dormant, seed));
2793 }
2794
2802
2803 public void triggerAddCustomDrop(final CargoAPI cargo) {
2804 triggerCustomAction(new AddCustomDropAction(cargo));
2805 }
2806 public void triggerAddCommodityDrop(String commodityId, int quantity, boolean dropQuantityBasedOnShipsDestroyed) {
2807 triggerCustomAction(new AddCommodityDropAction(quantity, commodityId, dropQuantityBasedOnShipsDestroyed));
2808 }
2809 public void triggerAddCommodityFractionDrop(String commodityId, float fraction) {
2810 triggerCustomAction(new AddCommodityFractionDropAction(fraction, commodityId));
2811 }
2812 public void triggerAddWeaponDrop(final String weaponId, final int quantity) {
2813 triggerCustomAction(new AddWeaponDropAction(quantity, weaponId));
2814 }
2815 public void triggerAddFighterLPCDrop(final String wingId, final int quantity) {
2816 triggerCustomAction(new AddFighterLPCDropAction(wingId, quantity));
2817 }
2818 public void triggerAddHullmodDrop(final String hullmodId) {
2819 triggerCustomAction(new AddHullmodDropAction(hullmodId));
2820 }
2821 public void triggerAddSpecialItemDrop(final String itemId, final String data) {
2822 triggerCustomAction(new AddSpecialItemDropAction(data, itemId));
2823 }
2824
2825
2834 public void triggerSpawnFleetAtPickedLocation(final String flag, final String refKey) {
2835 triggerSpawnFleetAtPickedLocation(200f, flag, refKey);
2836 }
2837 public void triggerSpawnFleetAtPickedLocation(final float range, final String flag, final String refKey) {
2838 triggerCustomAction(new SpawnFleetAtPickedLocationAction(range));
2839 if (flag != null) {
2840 triggerSetFleetFlag(flag);
2841 }
2842 if (refKey != null) {
2844 }
2845 }
2846 public void triggerSpawnFleetNear(final SectorEntityToken entity, final String flag, final String refKey) {
2847 triggerSpawnFleetNear(entity, 200f, flag, refKey);
2848 }
2849 public void triggerSpawnFleetNear(final SectorEntityToken entity, final float range, final String flag, final String refKey) {
2850 triggerCustomAction(new SpawnFleetNearAction(entity, range));
2851 if (flag != null) {
2852 triggerSetFleetFlag(flag);
2853 }
2854 if (refKey != null) {
2856 }
2857 }
2858
2859 public void triggerPickSetLocation(final LocationAPI location, final Vector2f coordinates) {
2860 triggerCustomAction(new PickSetLocationAction(coordinates, location));
2861 }
2863 triggerCustomAction(new PickLocationInHyperspaceAction(system));
2864 }
2865
2866 public void triggerPickLocationFromEntityTowardsPlayer(final float arc, final float dist) {
2868 }
2869 public void triggerPickLocationTowardsPlayer(final SectorEntityToken entity, final float arc, final float dist) {
2871 }
2873 final float minDist, final float maxDist) {
2875 }
2876 public void triggerPickLocationTowardsPlayer(final SectorEntityToken entity, final float arc,
2877 final float minDist, final float maxDist) {
2879 }
2881 final float minDistFromPlayer, final float minDist, final float maxDist) {
2882 triggerCustomAction(new PickLocationTowardsPlayerAction(null, arc, minDist, maxDist, minDistFromPlayer));
2883 }
2884 public void triggerPickLocationTowardsPlayer(final SectorEntityToken entity, final float arc,
2885 final float minDistFromPlayer, final float minDist, final float maxDist) {
2886 triggerCustomAction(new PickLocationTowardsPlayerAction(entity, arc, minDist, maxDist, minDistFromPlayer));
2887 }
2888
2889 public void triggerPickLocationTowardsEntity(SectorEntityToken entity, float arc, float dist) {
2891 }
2892 public void triggerPickLocationTowardsEntity(final SectorEntityToken entity, final float arc,
2893 final float minDistFromPlayer, final float minDist, final float maxDist) {
2894 triggerCustomAction(new PickLocationTowardsEntityAction(entity, arc, minDist, maxDist, minDistFromPlayer));
2895 }
2896
2897
2898 public void triggerPickLocationFromEntityAwayFromPlayer(final float arc, final float dist) {
2900 }
2902 final float minDist, final float maxDist) {
2904 }
2906 final float minDistFromPlayer, final float minDist, final float maxDist) {
2907 triggerCustomAction(new PickLocationAwayFromPlayerAction(minDist, null, maxDist, arc, minDistFromPlayer));
2908 }
2909 public void triggerPickLocationAwayFromPlayer(final SectorEntityToken entity, final float arc, final float dist) {
2911 }
2912 public void triggerPickLocationAwayFromPlayer(final SectorEntityToken entity, final float arc,
2913 final float minDist, final float maxDist) {
2915 }
2916 public void triggerPickLocationAwayFromPlayer(final SectorEntityToken entity, final float arc,
2917 final float minDistFromPlayer, final float minDist, final float maxDist) {
2918 triggerCustomAction(new PickLocationAwayFromPlayerAction(minDist, entity, maxDist, arc, minDistFromPlayer));
2919 }
2920
2921 public void triggerPickLocationAroundPlayer(final float dist) {
2923 }
2924 public void triggerPickLocationAroundPlayer(final float minDist, final float maxDist) {
2925 triggerCustomAction(new PickLocationAroundPlayerAction(maxDist, minDist));
2926 }
2927
2928 public static float DEFAULT_MIN_DIST_FROM_PLAYER = 3000f;
2929 public void triggerPickLocationAroundEntity(final float dist) {
2931 }
2932 public void triggerPickLocationAroundEntity(final SectorEntityToken entity, final float dist) {
2934 }
2935 public void triggerPickLocationAroundEntity(final SectorEntityToken entity, final float minDist, final float maxDist) {
2937 }
2938 public void triggerPickLocationAroundEntity(final SectorEntityToken entity, final float minDistFromPlayer, final float minDist, final float maxDist) {
2939 triggerCustomAction(new PickLocationAroundEntityAction(minDist, entity, maxDist, minDistFromPlayer));
2940 }
2941
2945 public void triggerPickLocationAtInSystemJumpPoint(final StarSystemAPI system, final float minDistFromPlayer) {
2946 triggerCustomAction(new PickLocationAtInSystemJumpPointAction(system, minDistFromPlayer));
2947 }
2948
2952 public void triggerPickLocationAtClosestToPlayerJumpPoint(final StarSystemAPI system, final float minDistFromPlayer) {
2953 triggerCustomAction(new PickLocationAtClosestToPlayerJumpPointAction(system, minDistFromPlayer));
2954 }
2955
2957 triggerCustomAction(new PickLocationAtClosestToEntityJumpPointAction(system, entity, 0f));
2958 }
2959 public void triggerPickLocationAtClosestToEntityJumpPoint(StarSystemAPI system, SectorEntityToken entity, float minDistFromEntity) {
2960 triggerCustomAction(new PickLocationAtClosestToEntityJumpPointAction(system, entity, minDistFromEntity));
2961 }
2962
2963 public void triggerPickLocationWithinArc(final float dir, final float arc,
2964 final float minDistFromPlayer, final float minDist, final float maxDist) {
2965 triggerPickLocationWithinArc(null, dir, arc, minDistFromPlayer, minDist, maxDist);
2966 }
2967 public void triggerPickLocationWithinArc(final SectorEntityToken entity, final float dir, final float arc,
2968 final float minDistFromPlayer, final float minDist, final float maxDist) {
2969 triggerCustomAction(new PickLocationWithinArcAction(arc, entity, maxDist, minDist, minDistFromPlayer, dir));
2970 }
2971
2973 triggerCustomAction(new SetEntityToPickedJumpPoint());
2974 }
2975 public void triggerFleetSetPatrolActionText(String patrolText) {
2976 triggerCustomAction(new FleetSetPatrolActionText(patrolText));
2977 }
2978
2982 public void triggerFleetSetTravelActionText(String travelText) {
2983 triggerCustomAction(new FleetSetTravelActionText(travelText));
2984 }
2985
2986 public void triggerOrderFleetPatrol(final StarSystemAPI system) {
2987 triggerCustomAction(new OrderFleetPatrolSystemAction(system));
2988 }
2989 public void triggerOrderFleetPatrol(final SectorEntityToken ... patrolPoints) {
2990 triggerOrderFleetPatrol(null, false, patrolPoints);
2991 }
2992 public void triggerOrderFleetPatrol(final boolean randomizeLocation, final SectorEntityToken ... patrolPoints) {
2993 triggerOrderFleetPatrol(null, randomizeLocation, patrolPoints);
2994 }
2995 public void triggerOrderFleetPatrol(final StarSystemAPI system, final boolean randomizeLocation,
2996 final SectorEntityToken ... patrolPoints) {
2997 triggerCustomAction(new OrderFleetPatrolPointsAction(patrolPoints, randomizeLocation, system));
2998 }
2999 public void triggerOrderFleetPatrol(final StarSystemAPI system, final boolean randomizeLocation, final String ... tags) {
3000 triggerCustomAction(new OrderFleetPatrolTagsAction(system, randomizeLocation, tags));
3001 }
3003 for (int i = currTrigger.getActions().size() - 1; i >= 0; i--) {
3004 TriggerAction action = currTrigger.getActions().get(i);
3005 if (action instanceof OrderFleetPatrolTagsAction) {
3006 OrderFleetPatrolTagsAction a = (OrderFleetPatrolTagsAction) action;
3007 if (a.added == null) a.added = new ArrayList<SectorEntityToken>();
3008 for (SectorEntityToken curr : points) {
3009 if (curr != null) {
3010 a.added.add(curr);
3011 }
3012 }
3013 return;
3014 }
3015 if (action instanceof OrderFleetPatrolPointsAction) {
3016 OrderFleetPatrolPointsAction a = (OrderFleetPatrolPointsAction) action;
3017 for (SectorEntityToken curr : points) {
3018 if (curr != null) {
3019 a.patrolPoints.add(curr);
3020 }
3021 }
3022 return;
3023 }
3024 }
3025 }
3026
3027 public void triggerOrderFleetPatrolEntity(boolean moveToNearEntity) {
3028 triggerCustomAction(new OrderFleetPatrolSpawnedEntity(moveToNearEntity));
3029 }
3030
3032 triggerOrderFleetPatrol(system, false, system.getHyperspaceAnchor());
3033 }
3034
3035 public void triggerFleetAddDefeatTrigger(String trigger) {
3036 triggerCustomAction(new AddFleetDefeatTriggerAction(trigger, false));
3037 }
3038
3039 public void triggerFleetAddDefeatTriggerPermanent(String trigger) {
3040 triggerCustomAction(new AddFleetDefeatTriggerAction(trigger, true));
3041 }
3042
3044 triggerCustomAction(new AddFleetDefeatTriggerAction("GoAwayAfterDefeatTrigger", true));
3045 }
3046
3050 public void triggerOrderFleetInterceptPlayer(boolean makeHostile, boolean allowLongPursuit) {
3051 triggerCustomAction(new OrderFleetInterceptPlayerAction(makeHostile));
3052 if (allowLongPursuit) {
3054 }
3055 }
3056
3059 }
3060 public void triggerOrderFleetEBurn(float probabilityToEBurn) {
3061 if (genRandom.nextFloat() < probabilityToEBurn) {
3062 triggerCustomAction(new OrderFleetEBurn());
3063 }
3064 }
3065
3067 triggerOrderFleetPatrol(null, false, entity);
3068 }
3069
3071 triggerCustomAction(new FleetNoAutoDespawnAction());
3072 }
3073
3075 triggerCustomAction(new OrderFleetStopPursuingPlayerUnlessInStage(this, stages));
3076 }
3077
3078 public void triggerFleetInterceptPlayerWithinRange(boolean mustBeStrongEnoughToFight, float maxRange,
3079 boolean repeatable, float repeatDelay, Object ... stages) {
3081 new OrderFleetInterceptNearbyPlayerInStage(this, mustBeStrongEnoughToFight, maxRange, repeatable, repeatDelay, stages));
3083 }
3084
3085 public void triggerFleetInterceptPlayerNearby(boolean mustBeStrongEnoughToFight, Object ... stages) {
3086 triggerFleetInterceptPlayerWithinRange(mustBeStrongEnoughToFight, 500f, true, 5f, stages);
3087 }
3088
3089 public void triggerFleetInterceptPlayerOnSight(boolean mustBeStrongEnoughToFight,Object ... stages) {
3090 triggerFleetInterceptPlayerWithinRange(mustBeStrongEnoughToFight, 10000f, true, 5f, stages);
3091 }
3092
3093
3094 public static Vector2f pickLocationWithinArc(Random random, final SectorEntityToken entity, final float dir, final float arc,
3095 final float minDistToPlayer, final float minDist, final float maxDist) {
3096 float angleIncr = 10f;
3097 float distIncr = (maxDist - minDist) / 5f;
3098 if (distIncr < 1000f) {
3099 distIncr = (maxDist - minDist) / 2f;
3100 }
3101 if (distIncr < 1) distIncr = 1;
3102
3103
3105 for (float currAngle = dir - arc / 2f; currAngle < dir + arc / 2f; currAngle += angleIncr) {
3106 for (float dist = minDist; dist <= maxDist; dist += distIncr) {
3107 Vector2f loc = Misc.getUnitVectorAtDegreeAngle(currAngle);
3108 loc.scale(dist);
3109 Vector2f.add(entity.getLocation(), loc, loc);
3110 picker.add(loc);
3111 }
3112 }
3113
3115 copy.addAll(picker);
3116
3117
3118 StarSystemAPI system = entity.getStarSystem();
3120 Vector2f pick = null;
3121 LocationAPI containingLocation = entity.getContainingLocation();
3122
3123 while (!picker.isEmpty()) {
3124 Vector2f loc = picker.pickAndRemove();
3125 if (isNearCorona(system, loc)) continue;
3126
3127 float distToPlayer = Float.MAX_VALUE;
3128 if (playerFleet != null && playerFleet.getContainingLocation() == containingLocation) {
3129 distToPlayer = Misc.getDistance(playerFleet.getLocation(), loc);
3130 if (distToPlayer < minDistToPlayer) {
3131 continue;
3132 }
3133 }
3134 pick = loc;
3135 }
3136
3137 if (pick == null) {
3138 pick = copy.pick();
3139 }
3140
3141 float distToPlayer = Float.MAX_VALUE;
3142 if (playerFleet != null && playerFleet.getContainingLocation() == containingLocation) {
3143 distToPlayer = Misc.getDistance(playerFleet.getLocation(), pick);
3144 if (distToPlayer < minDistToPlayer) {
3145 Vector2f away = Misc.getUnitVectorAtDegreeAngle(
3146 Misc.getAngleInDegrees(playerFleet.getLocation(), pick));
3147 away.scale(minDistToPlayer);
3148 Vector2f.add(playerFleet.getLocation(), away, away);
3149 pick = away;
3150 }
3151 }
3152
3153 return pick;
3154 }
3155
3156 public static boolean isNearCorona(StarSystemAPI system, Vector2f loc) {
3157 if (system == null) return false;
3158 for (PlanetAPI planet : system.getPlanets()) {
3159 if (!planet.isStar()) continue;
3160 StarCoronaTerrainPlugin corona = Misc.getCoronaFor(planet);
3161 if (corona == null) continue;
3162 float dist = Misc.getDistance(planet.getLocation(), loc);
3163 float radius = corona.getParams().middleRadius + corona.getParams().bandWidthInEngine * 0.5f;
3164 if (dist < radius + 500f) {
3165 return true;
3166 }
3167 }
3168 return false;
3169 }
3170
3171
3172 public void triggerCustomAction(TriggerAction action) {
3173 currTrigger.getActions().add(action);
3174 }
3175
3176
3177
3178
3179
3180
3181 protected transient MissionTrigger currTrigger = null;
3182 public void beginGlobalFlagTrigger(String flag, Object ... stages) {
3183 beginCustomTrigger(new GlobalBooleanChecker(flag), stages);
3184 }
3185 public void beginDaysElapsedTrigger(float days, Object ... stages) {
3186 beginCustomTrigger(new DaysElapsedChecker(days, this), stages);
3187 }
3188 public void beginDaysElapsedTrigger(float days, Object stage, Object ... stages) {
3189 beginCustomTrigger(new DaysElapsedChecker(days, getData(stage)), stages);
3190 }
3191 public void beginInCommRelayRangeTrigger(Object ... stages) {
3192 beginCustomTrigger(new InCommRelayRangeChecker(), stages);
3193 }
3194 public void beginEnteredLocationTrigger(LocationAPI location, Object ... stages) {
3195 beginCustomTrigger(new EnteredLocationChecker(location), stages);
3196 }
3197 public void beginInRangeOfEntityTrigger(SectorEntityToken entity, float range, Object ... stages) {
3198 beginCustomTrigger(new InRangeOfEntityChecker(entity, range), stages);
3199 }
3200// public void beginWithinHyperspaceRangeTrigger(SectorEntityToken entity, float rangeLY, Object ... stages) {
3201// beginWithinHyperspaceRangeTrigger(entity, rangeLY, false, stages);
3202// }
3203 public void beginWithinHyperspaceRangeTrigger(SectorEntityToken entity, float rangeLY, boolean requirePlayerInHyperspace,
3204 Object ... stages) {
3205 beginCustomTrigger(new InHyperRangeOfEntityChecker(entity, rangeLY, requirePlayerInHyperspace), stages);
3206 }
3207
3208 public void beginWithinHyperspaceRangeTrigger(StarSystemAPI system, float rangeLY, boolean requirePlayerInHyperspace,
3209 Object ... stages) {
3210 beginWithinHyperspaceRangeTrigger(system.getCenter(), rangeLY, requirePlayerInHyperspace, stages);
3211 }
3212
3213// public void beginWithinHyperspaceRangeTrigger(MarketAPI market, float rangeLY, Object ... stages) {
3214// beginWithinHyperspaceRangeTrigger(market, rangeLY, false, stages);
3215// }
3216 public void beginWithinHyperspaceRangeTrigger(MarketAPI market, float rangeLY, boolean requirePlayerInHyperspace,
3217 Object ... stages) {
3218 beginCustomTrigger(new InHyperRangeOfEntityChecker(market.getPrimaryEntity(), rangeLY, requirePlayerInHyperspace), stages);
3219 }
3220
3221 public void beginStageTrigger(Object ... stages) {
3222 beginCustomTrigger(new AlwaysTrueChecker(), stages);
3223 }
3224 public void beginCustomTrigger(ConditionChecker condition, Object ... stages) {
3226
3228 currTrigger.setCondition(condition);
3229 if (stages != null) {
3230 for (Object stage : stages) {
3231 currTrigger.getStages().add(stage);
3232 }
3233 }
3234 }
3235
3236
3237 public void endTrigger() {
3238 if (currTrigger == null) {
3239 throw new RuntimeException("endTrigger() called without a corresponding beginTrigger()");
3240 }
3241 triggers.add(currTrigger);
3242 currTrigger = null;
3243 }
3244 protected void checkExistingTrigger() {
3245 if (currTrigger != null) throw new RuntimeException("Already began a trigger, call endTrigger() to finish it");
3246 }
3247
3249 return currTrigger;
3250 }
3252 this.currTrigger = currTrigger;
3253 }
3254
3255
3256 public void triggerSpawnEntity(final String entityId, LocData data) {
3257 triggerCustomAction(new SpawnEntityAction(entityId, data));
3258 }
3259
3260 public void triggerSpawnDebrisField(float radius, float density, LocData data) {
3261 triggerCustomAction(new SpawnDebrisFieldAction(radius, density, data));
3262 }
3263
3265 triggerCustomAction(new DespawnEntityAction(entity));
3266 }
3267
3268
3269 public void triggerSpawnDerelictHull(String hullId, LocData data) {
3270 triggerCustomAction(new SpawnDerelictAction(hullId, null, null, data));
3271 }
3272
3273 public void triggerSpawnDerelict(String factionId, DerelictType type, LocData data) {
3274 triggerCustomAction(new SpawnDerelictAction(null, factionId, type, data));
3275 }
3276 public void triggerSpawnDerelict(DerelictType type, LocData data) {
3277 triggerCustomAction(new SpawnDerelictAction(type, data));
3278 }
3279
3280 public void triggerSpawnDerelict(DerelictShipData shipData, LocData data) {
3281 triggerCustomAction(new SpawnDerelictAction(shipData, data));
3282 }
3283
3284 public void triggerSpawnShipGraveyard(String factionId, int minShips, int maxShips, LocData data) {
3285 triggerCustomAction(new SpawnShipGraveyardAction(factionId, minShips, maxShips, data));
3286 }
3287
3289 triggerCustomAction(new MakeDiscoverableAction(1000f, 200f));
3290 }
3291 public void triggerMakeDiscoverable(float range, float xp) {
3292 triggerCustomAction(new MakeDiscoverableAction(range, xp));
3293 }
3294
3295 public void triggerFleetAddTags(String ... tags) {
3296 triggerCustomAction(new AddTagsAction(tags));
3297 }
3298
3299 public void triggerAddTags(SectorEntityToken entity, String ... tags) {
3300 triggerCustomAction(new GenericAddTagsAction(entity, tags));
3301 }
3302 public void triggerRemoveTags(SectorEntityToken entity, String ... tags) {
3303 triggerCustomAction(new GenericRemoveTagsAction(entity, tags));
3304 }
3305 public void triggerMakeNonStoryCritical(MemoryAPI ... memoryArray) {
3306 triggerCustomAction(new MakeNonStoryCriticalAction(memoryArray));
3307 }
3308 public void triggerMakeNonStoryCritical(String ... markets) {
3309 for (String id : markets) {
3311 if (market != null) {
3312 triggerCustomAction(new MakeNonStoryCriticalAction(market.getMemory()));
3313 }
3314 }
3315 }
3316 public void triggerMakeNonStoryCritical(MarketAPI ... markets) {
3317 for (MarketAPI market : markets) {
3318 triggerCustomAction(new MakeNonStoryCriticalAction(market.getMemory()));
3319 }
3320 }
3321
3322 public void triggerFleetAddCommanderSkill(String skill, int level) {
3323 CreateFleetAction cfa = getPreviousCreateFleetAction();
3324 if (cfa != null && cfa.params != null && cfa.params.commander != null) {
3325 cfa.params.commander.getStats().setSkillLevel(skill, level);
3326 } else {
3327 triggerCustomAction(new AddCommanderSkillAction(skill, level));
3328 }
3329 }
3330
3337 triggerCustomAction(new MakeFleetFlagsPermanentAction(true));
3338 }
3340 triggerCustomAction(new MakeFleetFlagsPermanentAction(false));
3341 }
3342
3343
3344 public static CampaignFleetAPI createFleet(FleetSize size, FleetQuality quality,
3345 OfficerNum oNum, OfficerQuality oQuality, String factionId, String fleetFactionId, String type, Vector2f locInHyper) {
3346 CreateFleetAction action = new CreateFleetAction(type, locInHyper, size, quality, factionId);
3347 action.oNum = oNum;
3348 action.oQuality = oQuality;
3349 action.faction = fleetFactionId;
3350 TriggerActionContext context = new TriggerActionContext(null);
3351 action.doAction(context);
3352 return context.fleet;
3353 }
3354
3355
3356 public void triggerCreateSmallPatrolAroundMarket(MarketAPI market, Object stage, float extraSuspicion) {
3357 triggerCreatePatrolAroundMarket(market, null, stage, FleetSize.VERY_SMALL, FleetTypes.PATROL_MEDIUM, extraSuspicion);
3358 }
3359 public void triggerCreateMediumPatrolAroundMarket(MarketAPI market, Object stage, float extraSuspicion) {
3360 triggerCreatePatrolAroundMarket(market, null, stage, FleetSize.MEDIUM, FleetTypes.PATROL_MEDIUM, extraSuspicion);
3361 }
3362 public void triggerCreateLargePatrolAroundMarket(MarketAPI market, Object stage, float extraSuspicion) {
3363 triggerCreatePatrolAroundMarket(market, null, stage, FleetSize.LARGE, FleetTypes.PATROL_LARGE, extraSuspicion);
3364 }
3365 public void triggerCreateSmallPatrol(MarketAPI from, String factionId, SectorEntityToken entityToPatrol, Object stage, float extraSuspicion) {
3366 triggerCreatePatrolAroundMarket(from, factionId, entityToPatrol, stage, FleetSize.VERY_SMALL, FleetTypes.PATROL_MEDIUM, extraSuspicion);
3367 }
3368 public void triggerCreateMediumPatrol(MarketAPI from, String factionId, SectorEntityToken entityToPatrol, Object stage, float extraSuspicion) {
3369 triggerCreatePatrolAroundMarket(from, factionId, entityToPatrol, stage, FleetSize.MEDIUM, FleetTypes.PATROL_MEDIUM, extraSuspicion);
3370 }
3371 public void triggerCreateLargePatrol(MarketAPI from, String factionId, SectorEntityToken entityToPatrol, Object stage, float extraSuspicion) {
3372 triggerCreatePatrolAroundMarket(from, factionId, entityToPatrol, stage, FleetSize.LARGE, FleetTypes.PATROL_LARGE, extraSuspicion);
3373 }
3375 Object stage, FleetSize size, String fleetType,
3376 float extraSuspicion) {
3377 triggerCreatePatrolAroundMarket(market, null, entityToPatrol, stage, size, fleetType, extraSuspicion);
3378 }
3379 public void triggerCreatePatrolAroundMarket(MarketAPI market, String factionId, SectorEntityToken entityToPatrol,
3380 Object stage, FleetSize size, String fleetType,
3381 float extraSuspicion) {
3382 if (entityToPatrol == null) entityToPatrol = market.getPrimaryEntity();
3383 if (factionId == null) factionId = market.getFactionId();
3384
3385 beginWithinHyperspaceRangeTrigger(entityToPatrol, 1f, false, stage);
3386 triggerCreateFleet(size, FleetQuality.DEFAULT, factionId, fleetType, entityToPatrol);
3389 FactionAPI faction = Global.getSector().getFaction(factionId);
3392 } else {
3394 }
3395 triggerPickLocationAroundEntity(entityToPatrol, 100f);
3397 triggerOrderFleetPatrol(entityToPatrol);
3399 triggerSetFleetNotBusy(); // so that it can be distracted and in general acts like a normal patrol
3400 if (market != null) {
3402 }
3403 endTrigger();
3404 }
3405
3406
3407 public static enum ComplicationSpawn {
3408 APPROACHING_OR_ENTERING,
3409 APPROACHING_SYSTEM,
3410 ENTERING_SYSTEM,
3411 EXITING_SYSTEM,
3412 }
3413 public static enum ComplicationRepImpact{
3414 NONE,
3415 LOW,
3416 FULL,
3417 }
3418
3419 public ComplicationSpawn pickComplicationSpawnType() {
3421 picker.add(ComplicationSpawn.APPROACHING_SYSTEM);
3422 picker.add(ComplicationSpawn.ENTERING_SYSTEM);
3423 picker.add(ComplicationSpawn.EXITING_SYSTEM);
3424 return picker.pick();
3425 }
3426
3428 CreateFleetAction cfa = getPreviousCreateFleetAction();
3429
3430 if (genRandom.nextFloat() < 0.33f && cfa.fSize != FleetSize.TINY && getQuality() > 0.25f) {
3431 // less ships, better quality and more officers
3432 cfa.fSize = cfa.fSize.prev();
3433 if (cfa.fQuality == null) cfa.fQuality = FleetQuality.DEFAULT;
3434 cfa.fQuality = cfa.fQuality.next();
3435
3436 if (cfa.oNum == null) cfa.oNum = OfficerNum.DEFAULT;
3437 cfa.oNum = cfa.oNum.next();
3438 } else if (genRandom.nextFloat() < 0.5f && cfa.fSize != FleetSize.MAXIMUM) {
3439 // more ships, lower quality, same officers
3440 cfa.fSize = cfa.fSize.next();
3441 if (cfa.fQuality == null) cfa.fQuality = FleetQuality.DEFAULT;
3442 cfa.fQuality = cfa.fQuality.prev();
3443 }
3444
3445 }
3446
3447 @SuppressWarnings("rawtypes")
3448 public void triggerComplicationBegin(Object stage, ComplicationSpawn spawnType, StarSystemAPI system,
3449 String factionId,
3450 String thing,
3451 String thingItOrThey,
3452 String thingDesc,
3453 int paymentOffered,
3454 boolean aggressiveIfDeclined,
3455 ComplicationRepImpact repImpact,
3456 String failTrigger) {
3457 if (spawnType == ComplicationSpawn.APPROACHING_OR_ENTERING) spawnType = pickComplicationSpawnType();
3458
3459 if ("them".equals(thingItOrThey)) thingItOrThey = "they";
3460
3461 if (spawnType == ComplicationSpawn.APPROACHING_SYSTEM) {
3462 beginWithinHyperspaceRangeTrigger(system.getCenter(), 3f, true, stage);
3463 } else if (spawnType == ComplicationSpawn.ENTERING_SYSTEM) {
3464 beginEnteredLocationTrigger(system, stage);
3465 } else if (spawnType == ComplicationSpawn.EXITING_SYSTEM) {
3466 //beginEnteredLocationTrigger(Global.getSector().getHyperspace(), stage);
3467 // so that it doesn't trigger if the player exits the system through alternate means and is far away
3468 beginWithinHyperspaceRangeTrigger(system, 1f, true, stage);
3469 }
3470
3471 triggerCreateFleet(FleetSize.LARGE, FleetQuality.DEFAULT, factionId, FleetTypes.PATROL_MEDIUM, system);
3472
3473 triggerSetFleetMissionRef("$" + getMissionId() + "_ref");
3474 triggerSetFleetMissionRef("$fwt_ref");
3475
3476 FactionAPI faction = Global.getSector().getFaction(factionId);
3477 if (aggressiveIfDeclined) {
3480 }
3481
3482 if (repImpact == ComplicationRepImpact.LOW) {
3484 } else if (repImpact == ComplicationRepImpact.NONE) {
3486 }
3487
3490
3493 triggerSetFleetMemoryValue("$fwt_originalFaction", factionId);
3494 }
3495
3496
3497 if (spawnType == ComplicationSpawn.APPROACHING_SYSTEM) {
3498 triggerPickLocationTowardsPlayer(system.getHyperspaceAnchor(), 90f, getUnits(1.5f));
3499 } else if (spawnType == ComplicationSpawn.ENTERING_SYSTEM) {
3500 triggerPickLocationTowardsPlayer(system.getCenter(), 90, 2000);
3501 } else if (spawnType == ComplicationSpawn.EXITING_SYSTEM) {
3503 }
3504
3507
3508 triggerSpawnFleetAtPickedLocation("$fwt_wantsThing", null);
3509 triggerSetFleetMemoryValue("$fwt_aggressive", aggressiveIfDeclined);
3510 triggerSetFleetMemoryValue("$fwt_thing", getWithoutArticle(thing));
3512 triggerSetFleetMemoryValue("$fwt_theThing", thing);
3513 triggerSetFleetMemoryValue("$fwt_TheThing", Misc.ucFirst(thing));
3514 triggerSetFleetMemoryValue("$fwt_payment", Misc.getWithDGS(paymentOffered));
3515 triggerSetFleetMemoryValue("$fwt_itOrThey", thingItOrThey);
3516 triggerSetFleetMemoryValue("$fwt_ItOrThey", Misc.ucFirst(thingItOrThey));
3517
3518 String thingItOrThem = "them";
3519 if ("it".equals(thingItOrThey)) thingItOrThem = "it";
3520 triggerSetFleetMemoryValue("$fwt_itOrThem", thingItOrThem);
3521 triggerSetFleetMemoryValue("$fwt_ItOrThem", Misc.ucFirst(thingItOrThem));
3522
3523 triggerSetFleetMemoryValue("$fwt_thingDesc", thingDesc);
3524 triggerSetFleetMemoryValue("$fwt_ThingDesc", Misc.ucFirst(thingDesc));
3525
3526 if (failTrigger == null) {
3527 failTrigger = "FWTDefaultFailTrigger";
3528 }
3529 triggerSetFleetMemoryValue("$fwt_missionFailTrigger", failTrigger);
3530
3531 triggerFleetMakeImportant(null, (Enum) stage);
3532
3533 //endTrigger();
3534 }
3535
3536 public void triggerComplicationEnd(boolean randomizeAndAdjustFleetSize) {
3537 if (randomizeAndAdjustFleetSize) {
3539
3543 }
3545
3546 endTrigger();
3547 }
3548
3550 CreateFleetAction cfa = getPreviousCreateFleetAction();
3551 if (cfa.params.fleetType != null && cfa.fSizeOverride != null &&
3552 (cfa.params.fleetType.equals(FleetTypes.PATROL_SMALL) ||
3553 cfa.params.fleetType.equals(FleetTypes.PATROL_MEDIUM) ||
3554 cfa.params.fleetType.equals(FleetTypes.PATROL_LARGE))) {
3555 if (cfa.fSizeOverride <= 0.2f) {
3556 cfa.params.fleetType = FleetTypes.PATROL_SMALL;
3557 } else if (cfa.fSizeOverride < 0.7f) {
3558 cfa.params.fleetType = FleetTypes.PATROL_MEDIUM;
3559 } else {
3560 cfa.params.fleetType = FleetTypes.PATROL_LARGE;
3561 }
3562 } else if (cfa.params.fleetType != null && cfa.fSizeOverride != null &&
3563 (cfa.params.fleetType.equals(FleetTypes.SCAVENGER_SMALL) ||
3564 cfa.params.fleetType.equals(FleetTypes.SCAVENGER_MEDIUM) ||
3565 cfa.params.fleetType.equals(FleetTypes.SCAVENGER_LARGE))) {
3566 if (cfa.fSizeOverride <= 0.2f) {
3567 cfa.params.fleetType = FleetTypes.SCAVENGER_SMALL;
3568 } else if (cfa.fSizeOverride < 0.7f) {
3569 cfa.params.fleetType = FleetTypes.SCAVENGER_MEDIUM;
3570 } else {
3571 cfa.params.fleetType = FleetTypes.SCAVENGER_LARGE;
3572 }
3573 }
3574 }
3575
3576
3577 public void triggerFleetSetWarnAttack(String warnCommsTrigger, String attackCommsTrigger, Object ... stages) {
3578 triggerSetFleetFlag("$warnAttack", stages);
3579 triggerSetFleetMemoryValue("$warnAttack_warningComms", warnCommsTrigger);
3580 triggerSetFleetMemoryValue("$warnAttack_attackComms", attackCommsTrigger);
3582
3583 CreateFleetAction cfa = getPreviousCreateFleetAction();
3584 if (cfa != null && cfa.params != null && cfa.params.factionId != null) {
3585 triggerSetFleetMemoryValue("$warnAttack_factionId", cfa.params.factionId);
3586 }
3587 }
3588
3589 public void triggerFleetAddTugsFlag(int tugs) {
3590 triggerCustomAction(new FleetAddTugs(tugs));
3591 }
3592
3593 public void triggerFleetMakeFaster(boolean navigationSkill, int numTugs, boolean allowLongPursuit) {
3594 if (navigationSkill) {
3596 }
3597 if (numTugs > 0) {
3598 triggerFleetAddTugsFlag(numTugs);
3599 }
3600 if (allowLongPursuit) {
3602 }
3603 }
3604
3605 public static void addTugsToFleet(CampaignFleetAPI fleet, int tugs, Random random) {
3606 //if (true) return;
3607
3608 int max = Global.getSettings().getInt("maxShipsInAIFleet");
3609 if (fleet.getNumMembersFast() + tugs > max) {
3610 FleetFactoryV3.pruneFleet(max - tugs, 0, fleet, 100000, random);
3611 }
3612
3613 FactionAPI faction = fleet.getFaction();
3614 for (int i = 0; i < tugs; i++) {
3615 ShipPickParams params = new ShipPickParams(ShipPickMode.ALL);
3616 List<ShipRolePick> picks = faction.pickShip(ShipRoles.TUG, params, null, random);
3617 for (ShipRolePick pick : picks) {
3618 FleetMemberAPI member = fleet.getFleetData().addFleetMember(pick.variantId);
3619 member.updateStats();
3620 member.getRepairTracker().setCR(member.getRepairTracker().getMaxCR());
3621 break;
3622 }
3623 }
3624 }
3625
3626 public void setFleetDamageTaken(float damage) {
3627 getPreviousCreateFleetAction().damage = damage;
3628 }
3629
3630
3631 public void setFleetSource(MarketAPI... preferred) {
3632 if (preferred == null) return;
3633
3634 for (MarketAPI market : preferred) {
3635 if (!market.hasCondition(Conditions.DECIVILIZED)) {
3636 getPreviousCreateFleetAction().params.setSource(market, true);
3637 break;
3638 }
3639 }
3640 }
3641
3642 public void setFleetSource(String ... preferred) {
3643 if (preferred == null) return;
3644
3645 for (String id : preferred) {
3647 if (market != null && !market.hasCondition(Conditions.DECIVILIZED)) {
3648 getPreviousCreateFleetAction().params.setSource(market, true);
3649 break;
3650 }
3651 }
3652 }
3653}
3654
3655
3656
3657
3658
3659
static SettingsAPI getSettings()
Definition Global.java:57
static FactoryAPI getFactory()
Definition Global.java:41
static SectorAPI getSector()
Definition Global.java:65
static void pruneFleet(int maxShips, int doctrineSize, CampaignFleetAPI fleet, float targetFP, Random random)
static float getDoctrineNumShipsMult(int doctrineNumShips)
static CampaignFleetAPI createFleet(FleetParamsV3 params)
static void applyDamageToFleet(CampaignFleetAPI fleet, float damage, boolean damageRemainingShips, Random random)
void setSource(MarketAPI source, boolean updateQuality)
static final String MEMORY_KEY_EVERYONE_JOINS_BATTLE_AGAINST
static final String MEMORY_KEY_MAKE_HOSTILE_TO_PLAYER_TRADE_FLEETS
static final String CAN_ONLY_BE_ENGAGED_WHEN_VISIBLE_TO_PLAYER
Definition MemFlags.java:79
static final String MEMORY_KEY_FORCE_AUTOFIT_ON_NO_AUTOFIT_SHIPS
static final String MEMORY_KEY_MAKE_HOSTILE_TO_ALL_TRADE_FLEETS
static final String MEMORY_KEY_MAKE_AGGRESSIVE_ONE_BATTLE_ONLY
void makeDiscoverable(SectorEntityToken entity, float range, float xp)
SectorEntityToken spawnDerelictHull(String hullId, LocData data)
SectorEntityToken spawnDebrisField(float radius, float density, LocData data)
SectorEntityToken spawnDerelict(String factionId, DerelictType type, LocData data)
SectorEntityToken spawnDerelictOfType(DerelictType type, LocData data)
SectorEntityToken spawnEntity(String entityId, LocData data)
void makeImportant(PersonAPI person, String flag, Enum ... stages)
void setFlagWithReason(SectorEntityToken entity, String flag, boolean permanent)
void addFleetDefeatTrigger(CampaignFleetAPI fleet, String trigger, boolean permanent)
void spawnShipGraveyard(String factionId, int minShips, int maxShips, LocData data)
void setFlag(SectorEntityToken entity, String flag, boolean permanent)
void triggerPickLocationFromEntityTowardsPlayer(final float arc, final float minDistFromPlayer, final float minDist, final float maxDist)
void triggerCreateMediumPatrolAroundMarket(MarketAPI market, Object stage, float extraSuspicion)
void triggerSetFleetComposition(float freighterMult, float tankerMult, float transportMult, float linerMult, float utilityMult)
void triggerCreatePatrolAroundMarket(MarketAPI market, SectorEntityToken entityToPatrol, Object stage, FleetSize size, String fleetType, float extraSuspicion)
void triggerCreateFleet(FleetSize size, FleetQuality quality, String factionId, String type, Vector2f locInHyper)
void triggerPickLocationFromEntityAwayFromPlayer(final float arc, final float minDist, final float maxDist)
void triggerPickLocationTowardsPlayer(final SectorEntityToken entity, final float arc, final float dist)
void triggerSetMemoryValueAfterDelay(float delay, HasMemory hasMemory, String key, Object value)
void triggerFleetMakeFaster(boolean navigationSkill, int numTugs, boolean allowLongPursuit)
void beginWithinHyperspaceRangeTrigger(StarSystemAPI system, float rangeLY, boolean requirePlayerInHyperspace, Object ... stages)
void triggerOrderFleetPatrol(final boolean randomizeLocation, final SectorEntityToken ... patrolPoints)
void triggerSetFleetSizeAndQuality(FleetSize size, FleetQuality quality, String fleetType)
void triggerAddTagAfterDelay(float delay, StarSystemAPI system, String tag)
void triggerSpawnDerelict(String factionId, DerelictType type, LocData data)
void triggerCreateLargePatrol(MarketAPI from, String factionId, SectorEntityToken entityToPatrol, Object stage, float extraSuspicion)
void setUseQualityInsteadOfQualityFraction(boolean temporarilyUseQualityInsteadOfQualityFraction)
void triggerPickLocationAroundEntity(final SectorEntityToken entity, final float minDistFromPlayer, final float minDist, final float maxDist)
void triggerCreateSmallPatrolAroundMarket(MarketAPI market, Object stage, float extraSuspicion)
static void addTugsToFleet(CampaignFleetAPI fleet, int tugs, Random random)
void triggerCreateMediumPatrol(MarketAPI from, String factionId, SectorEntityToken entityToPatrol, Object stage, float extraSuspicion)
void triggerPickLocationWithinArc(final SectorEntityToken entity, final float dir, final float arc, final float minDistFromPlayer, final float minDist, final float maxDist)
void triggerSetFleetDoctrineComp(int warships, int carriers, int phaseShips)
void triggerFleetInterceptPlayerWithinRange(boolean mustBeStrongEnoughToFight, float maxRange, boolean repeatable, float repeatDelay, Object ... stages)
void triggerPickLocationAroundEntity(final SectorEntityToken entity, final float minDist, final float maxDist)
void triggerOrderFleetInterceptPlayer(boolean makeHostile, boolean allowLongPursuit)
void beginWithinHyperspaceRangeTrigger(SectorEntityToken entity, float rangeLY, boolean requirePlayerInHyperspace, Object ... stages)
void triggerSetMemoryValue(HasMemory withMemory, String key, Object value)
static Vector2f pickLocationWithinArc(Random random, final SectorEntityToken entity, final float dir, final float arc, final float minDistToPlayer, final float minDist, final float maxDist)
void triggerPickLocationAtClosestToEntityJumpPoint(StarSystemAPI system, SectorEntityToken entity, float minDistFromEntity)
static CampaignFleetAPI createFleet(FleetSize size, FleetQuality quality, OfficerNum oNum, OfficerQuality oQuality, String factionId, String fleetFactionId, String type, Vector2f locInHyper)
void triggerComplicationBegin(Object stage, ComplicationSpawn spawnType, StarSystemAPI system, String factionId, String thing, String thingItOrThey, String thingDesc, int paymentOffered, boolean aggressiveIfDeclined, ComplicationRepImpact repImpact, String failTrigger)
void triggerPickLocationAwayFromPlayer(final SectorEntityToken entity, final float arc, final float minDist, final float maxDist)
void triggerOrderFleetPatrol(final StarSystemAPI system, final boolean randomizeLocation, final SectorEntityToken ... patrolPoints)
void triggerPickLocationTowardsPlayer(final SectorEntityToken entity, final float arc, final float minDistFromPlayer, final float minDist, final float maxDist)
void beginWithinHyperspaceRangeTrigger(MarketAPI market, float rangeLY, boolean requirePlayerInHyperspace, Object ... stages)
void triggerMovePersonToMarket(PersonAPI person, MarketAPI market, boolean alwaysAddToComms)
void triggerSetMemoryValueAfterDelay(float delay, MemoryAPI memory, String key, Object value)
void triggerOrderFleetPatrol(final StarSystemAPI system, final boolean randomizeLocation, final String ... tags)
void triggerPickSetLocation(final LocationAPI location, final Vector2f coordinates)
void triggerCreateLargePatrolAroundMarket(MarketAPI market, Object stage, float extraSuspicion)
void triggerPickLocationTowardsEntity(final SectorEntityToken entity, final float arc, final float minDistFromPlayer, final float minDist, final float maxDist)
void triggerPickLocationAwayFromPlayer(final SectorEntityToken entity, final float arc, final float dist)
void triggerFleetInterceptPlayerOnSight(boolean mustBeStrongEnoughToFight, Object ... stages)
void triggerPickLocationFromEntityTowardsPlayer(final float arc, final float minDist, final float maxDist)
void triggerSpawnFleetNear(final SectorEntityToken entity, final String flag, final String refKey)
void triggerPickLocationAwayFromPlayer(final SectorEntityToken entity, final float arc, final float minDistFromPlayer, final float minDist, final float maxDist)
void triggerSpawnShipGraveyard(String factionId, int minShips, int maxShips, LocData data)
void triggerPickLocationAtClosestToEntityJumpPoint(StarSystemAPI system, SectorEntityToken entity)
void triggerPickLocationTowardsEntity(SectorEntityToken entity, float arc, float dist)
void triggerSetFleetDoctrineQuality(int officerQuality, int shipQuality, int numShips)
void triggerPickLocationFromEntityAwayFromPlayer(final float arc, final float minDistFromPlayer, final float minDist, final float maxDist)
void triggerPickLocationAroundEntity(final SectorEntityToken entity, final float dist)
void beginCustomTrigger(ConditionChecker condition, Object ... stages)
void triggerPickLocationAtClosestToPlayerJumpPoint(final StarSystemAPI system, final float minDistFromPlayer)
void triggerSpawnFleetAtPickedLocation(final float range, final String flag, final String refKey)
void triggerPickLocationTowardsPlayer(final SectorEntityToken entity, final float arc, final float minDist, final float maxDist)
void triggerCreatePatrolAroundMarket(MarketAPI market, String factionId, SectorEntityToken entityToPatrol, Object stage, FleetSize size, String fleetType, float extraSuspicion)
void triggerCreateSmallPatrol(MarketAPI from, String factionId, SectorEntityToken entityToPatrol, Object stage, float extraSuspicion)
void triggerCreateFleet(FleetSize size, FleetQuality quality, String factionId, String type, SectorEntityToken roughlyWhere)
void beginInRangeOfEntityTrigger(SectorEntityToken entity, float range, Object ... stages)
void triggerPickLocationAtInSystemJumpPoint(final StarSystemAPI system, final float minDistFromPlayer)
void triggerCreateFleet(FleetSize size, FleetQuality quality, String factionId, String type, StarSystemAPI roughlyWhere)
void triggerFleetInterceptPlayerNearby(boolean mustBeStrongEnoughToFight, Object ... stages)
void triggerAddCommodityDrop(String commodityId, int quantity, boolean dropQuantityBasedOnShipsDestroyed)
void triggerFleetSetWarnAttack(String warnCommsTrigger, String attackCommsTrigger, Object ... stages)
void triggerSpawnFleetNear(final SectorEntityToken entity, final float range, final String flag, final String refKey)
void beginDaysElapsedTrigger(float days, Object stage, Object ... stages)
void triggerSetMemoryValuePermanent(HasMemory withMemory, String key, Object value)
void triggerPickLocationWithinArc(final float dir, final float arc, final float minDistFromPlayer, final float minDist, final float maxDist)
static void initRemnantFleetProperties(Random random, CampaignFleetAPI fleet, boolean dormant)
static void addExtraSalvage(SectorEntityToken entity, CargoAPI cargo)
static void makeFleetInterceptPlayer(CampaignFleetAPI fleet, boolean makeAggressive, boolean makeLowRepImpact, float interceptDays)
static String getWithDGS(float num)
Definition Misc.java:1381
static Vector2f getUnitVectorAtDegreeAngle(float degrees)
Definition Misc.java:1196
static String ucFirst(String str)
Definition Misc.java:559
static void moveToMarket(PersonAPI person, MarketAPI destination, boolean alwaysAddToCommDirectory)
Definition Misc.java:6205
static void makeImportant(SectorEntityToken entity, String reason)
Definition Misc.java:4051
static void increaseMarketHostileTimeout(MarketAPI market, float days)
Definition Misc.java:4911
static void fadeAndExpire(SectorEntityToken entity)
Definition Misc.java:3133
static float getDistance(SectorEntityToken from, SectorEntityToken to)
Definition Misc.java:599
static void makeNonStoryCritical(MarketAPI market, String reason)
Definition Misc.java:6252
static boolean setFlagWithReason(MemoryAPI memory, String flagKey, String reason, boolean value, float expire)
Definition Misc.java:1439
static Vector2f getPointWithinRadius(Vector2f from, float r)
Definition Misc.java:711
static StarCoronaTerrainPlugin getCoronaFor(PlanetAPI star)
Definition Misc.java:2377
static float getAngleInDegrees(Vector2f v)
Definition Misc.java:1126
CargoAPI createCargo(boolean unlimitedStacks)
CommoditySpecAPI getCommoditySpec(String commodityId)
void setFaction(String factionId, boolean includeCaptains)
void setInflater(FleetInflater inflater)
void setNoFactionInName(boolean noFactionInName)
MutableCharacterStatsAPI getCommanderStats()
void addHullmods(String id, int count)
void addWeapons(String id, int count)
void addSpecial(SpecialItemData data, float quantity)
void addCommodity(String commodityId, float quantity)
void addFighters(String id, int count)
CommDirectoryEntryAPI getEntryForPerson(PersonAPI person)
List< ShipRolePick > pickShip(String role, ShipPickParams params)
float getApproximateMaxFPPerFleet(ShipPickMode mode)
void setAutofitRandomizeProbability(float autofitRandomizeProbability)
void setCombatFreighterProbability(float combatFreighterProbability)
void addFleetMember(FleetMemberAPI member)
List< SectorEntityToken > getAllEntities()
List< SectorEntityToken > getJumpPoints()
void addEntity(SectorEntityToken entity)
void addScript(EveryFrameScript script)
FactionAPI getFaction(String factionId)
void addScript(EveryFrameScript script)
SectorEntityToken getEntity(String key)
void set(String key, Object value)
MutableCharacterStatsAPI getStats()