Starsector API
Loading...
Searching...
No Matches
TTMercenaryAttack.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.intel.group;
2
3import com.fs.starfarer.api.Global;
4import com.fs.starfarer.api.campaign.CampaignFleetAPI;
5import com.fs.starfarer.api.campaign.StarSystemAPI;
6import com.fs.starfarer.api.fleet.FleetMemberAPI;
7import com.fs.starfarer.api.impl.campaign.ids.Factions;
8import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
9import com.fs.starfarer.api.impl.campaign.ids.Ranks;
10import com.fs.starfarer.api.impl.campaign.ids.Skills;
11import com.fs.starfarer.api.impl.campaign.intel.events.TriTachyonHostileActivityFactor;
12import com.fs.starfarer.api.impl.campaign.missions.FleetCreatorMission;
13import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.FleetQuality;
14import com.fs.starfarer.api.ui.TooltipMakerAPI;
15import com.fs.starfarer.api.util.IntervalUtil;
16import com.fs.starfarer.api.util.Misc;
17
18
19
20public class TTMercenaryAttack extends GenericRaidFGI {
21
22 public static final String TTMA_FLEET = "$TTMA_fleet";
23 public static final String TTMA_COMMAND = "$TTMA_command";
24
25 public static String KEY = "$TTMA_ref";
26 public static TTMercenaryAttack get() {
27 return (TTMercenaryAttack) Global.getSector().getMemoryWithoutUpdate().get(KEY);
28 }
29
30
31 protected IntervalUtil interval = new IntervalUtil(0.1f, 0.3f);
32
33
34 public TTMercenaryAttack(GenericRaidParams params) {
35 super(params);
36
37 Global.getSector().getMemoryWithoutUpdate().set(KEY, this);
38 }
39
40 @Override
41 protected void notifyEnding() {
42 super.notifyEnding();
43
44 Global.getSector().getMemoryWithoutUpdate().unset(KEY);
45 }
46
47 @Override
48 protected void notifyEnded() {
49 super.notifyEnded();
50 }
51
52
53 @Override
54 public String getNoun() {
55 return "mercenary attack";
56 }
57
58 @Override
59 public String getForcesNoun() {
60 return super.getForcesNoun();
61 }
62
63
64 @Override
65 public String getBaseName() {
66 return "Tri-Tachyon Mercenary Attack";
67 }
68
69
70 transient protected boolean merc = false;
71 @Override
72 protected String getFleetCreationFactionOverride(int size) {
73 if (getRandom().nextFloat() < 0.5f || size == 10) {
74 merc = true;
75 return Factions.MERCENARY;
76 }
77 merc = false;
78 return Factions.TRITACHYON;
79 }
80
81 @Override
82 protected void configureFleet(int size, FleetCreatorMission m) {
83
84 // so that the merc source is not a TriTach market, if that's where they spawned
85 // doesn't work (since based on spawn faction anyway) and gets weird w/ mercs going back to different markets -am
86 //m.getPreviousCreateFleetAction().params.setSource(null, false);
87
88 m.triggerSetFleetFlag(TTMA_FLEET);
89
90 if (size == 10) {
91 m.triggerSetFleetQuality(FleetQuality.SMOD_3);
92 m.triggerSetFleetFlag(TTMA_COMMAND);
93 } else if (getRandom().nextFloat() < 0.5f) {
94 m.triggerSetFleetQuality(FleetQuality.SMOD_1);
95 } else {
96 m.triggerSetFleetQuality(FleetQuality.SMOD_2);
97 }
98
99 // don't want to be shooting it out with the employer, who's normally hostile to independents
100 m.triggerMakeNonHostileToFaction(Factions.TRITACHYON);
101
102
103 // likely spawning from Nortia, try not to get sidetracked
104 m.triggerMakeNonHostileToFaction(Factions.DIKTAT);
105 m.triggerMakeNonHostileToFaction(Factions.PIRATES);
106
107
108 if (merc) {
109 m.triggerFleetAddCommanderSkill(Skills.COORDINATED_MANEUVERS, 1);
110 m.triggerFleetAddCommanderSkill(Skills.TACTICAL_DRILLS, 1);
111 } else {
112 m.triggerFleetAddCommanderSkill(Skills.PHASE_CORPS, 1);
113 m.triggerFleetAddCommanderSkill(Skills.FLUX_REGULATION, 1);
114 }
115
116 if (size == 10) {
117 m.triggerFleetAddCommanderSkill(Skills.ELECTRONIC_WARFARE, 1);
118 m.triggerFleetAddCommanderSkill(Skills.SUPPORT_DOCTRINE, 1);
119 }
120
121 int tugs = 0;
122 if (size == 10) {
123 tugs = 2;
124 } else if (merc) {
125 tugs = getRandom().nextInt(3);
126 }
127
128 boolean lightDetachment = size <= 5;
129 if (lightDetachment) {
130 m.triggerSetFleetMaxShipSize(3);
131 }
132
133 m.triggerFleetMakeFaster(true, tugs, true);
134 }
135
136 @Override
137 protected void configureFleet(int size, CampaignFleetAPI fleet) {
138 boolean hasCombatCapital = false;
139 boolean hasCivCapital = false;
140 for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
141 if (member.isCapital()) {
142 hasCombatCapital |= !member.isCivilian();
143 hasCivCapital |= member.isCivilian();
144 }
145 }
146
147 if (size == 10) {
148 fleet.setName("Tactistar Operations Command");
149 fleet.getCommander().setRankId(Ranks.SPACE_ADMIRAL);
150 setNeverStraggler(fleet);
151 } else if (hasCombatCapital) {
152 fleet.setName("Tactistar Assault Detachment");
153 fleet.getCommander().setRankId(Ranks.SPACE_CAPTAIN);
154 } else if (hasCivCapital) {
155 fleet.setName("Tactistar Support Detachment");
156 fleet.getCommander().setRankId(Ranks.SPACE_CAPTAIN);
157 } else {
158 fleet.setName("Tactistar Light Detachment");
159 fleet.getCommander().setRankId(Ranks.SPACE_COMMANDER);
160 }
161 }
162
163
164 @Override
165 public void abort() {
166 if (!isAborted()) {
167 for (CampaignFleetAPI curr : getFleets()) {
168 curr.getMemoryWithoutUpdate().unset(TTMA_FLEET);
169 }
170 }
171 super.abort();
172 }
173
174
175
176 @Override
177 public void advance(float amount) {
178 super.advance(amount);
179
180 float days = Misc.getDays(amount);
181 interval.advance(days);
182
183 // only hostile while in the target system and on the job, so to speak
184 // unless the player is baseline hostile to independents
185 if (interval.intervalElapsed()) {
187 String reason = "TTMA";
188 for (CampaignFleetAPI curr : getFleets()) {
189 Misc.setFlagWithReason(curr.getMemoryWithoutUpdate(), MemFlags.MEMORY_KEY_MAKE_HOSTILE,
190 reason, true, 1f);
191 }
192
193 }
194 }
195 }
196
197 @Override
198 protected void addPostAssessmentSection(TooltipMakerAPI info, float width, float height, float opad) {
200 StarSystemAPI target = TriTachyonHostileActivityFactor.getPrimaryTriTachyonSystem();
201 boolean reversible = attack != null && !attack.isSpawning() && !attack.isFailed() &&
202 !attack.isSucceeded() && !attack.isAborted() && !attack.isEnding() && !attack.isEnded() &&
203 target != null;
204 if (reversible) {
205 info.addPara("Mercenary companies are notoriously flexible in their allegiances.", opad,
206 Misc.getHighlightColor(), "notoriously flexible");
207 }
208 }
209}
210
211
212
213
static SectorAPI getSector()
Definition Global.java:59
void addPostAssessmentSection(TooltipMakerAPI info, float width, float height, float opad)