Starsector API
Loading...
Searching...
No Matches
TacticallyBombardColony.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.missions;
2
3import java.awt.Color;
4import java.util.ArrayList;
5import java.util.List;
6import java.util.Map;
7
8import org.lwjgl.util.vector.Vector2f;
9
10import com.fs.starfarer.api.Global;
11import com.fs.starfarer.api.campaign.CargoAPI;
12import com.fs.starfarer.api.campaign.InteractionDialogAPI;
13import com.fs.starfarer.api.campaign.econ.Industry;
14import com.fs.starfarer.api.campaign.econ.MarketAPI;
15import com.fs.starfarer.api.campaign.listeners.ColonyPlayerHostileActListener;
16import com.fs.starfarer.api.campaign.rules.MemoryAPI;
17import com.fs.starfarer.api.characters.PersonAPI;
18import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
19import com.fs.starfarer.api.impl.campaign.ids.Ranks;
20import com.fs.starfarer.api.impl.campaign.ids.Tags;
21import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent;
22import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.MarketCMD.TempData;
23import com.fs.starfarer.api.ui.TooltipMakerAPI;
24import com.fs.starfarer.api.util.Misc;
25
26public class TacticallyBombardColony extends HubMissionWithBarEvent implements ColonyPlayerHostileActListener {
27
28 public static float PROB_PATROL_ENCOUNTER_AFTER = 0.5f;
29 public static float MISSION_DAYS = 120f;
30
31 public static enum Stage {
32 BOMBARD,
33 COMPLETED,
34 FAILED,
35 FAILED_NO_PENALTY,
36 }
37
38
39
40 protected void createBarGiver(MarketAPI createdAt) {
41 List<String> posts = new ArrayList<String>();
42 posts.add(Ranks.POST_AGENT);
43 if (createdAt.getSize() >= 6) {
44 posts.add(Ranks.POST_ADMINISTRATOR);
45 }
46 if (Misc.isMilitary(createdAt)) {
47 posts.add(Ranks.POST_BASE_COMMANDER);
48 }
49 if (Misc.hasOrbitalStation(createdAt)) {
50 posts.add(Ranks.POST_STATION_COMMANDER);
51 }
52 String post = pickOne(posts);
53 if (post == null) return;
54
55 // rank used only when it's an agent, since the other posts mean the person already exists
56 // and doesn't need to be created
57 setGiverRank(pickOne(Ranks.GROUND_CAPTAIN, Ranks.GROUND_COLONEL, Ranks.GROUND_MAJOR,
58 Ranks.SPACE_COMMANDER, Ranks.SPACE_CAPTAIN, Ranks.SPACE_ADMIRAL));
59 setGiverTags(Tags.CONTACT_MILITARY);
60 setGiverPost(post);
61 setGiverImportance(pickHighImportance());
62 findOrCreateGiver(createdAt, false, false);
63 }
64
65
66 protected MarketAPI market;
67
68 @Override
69 protected boolean create(MarketAPI createdAt, boolean barEvent) {
70 //genRandom = Misc.random;
71
72 if (barEvent) {
73 createBarGiver(createdAt);
74 }
75
76 if (!Misc.isMilitary(createdAt)) return false;
77
78 PersonAPI person = getPerson();
79 if (person == null) return false;
80
81 if (!setPersonMissionRef(person, "$tabo_ref")) {
82 return false;
83 }
84
85 if (barEvent) {
86 setGiverIsPotentialContactOnSuccess();
87 }
88
89 requireMarketIsNot(createdAt);
90 requireMarketFactionNotPlayer();
91 requireMarketFactionHostileTo(createdAt.getFactionId());
92 requireMarketTacticallyBombardable();
93 requireMarketNotHidden();
94 requireMarketNotInHyperspace();
95
96 float q = getQuality();
97 if (q <= 0) {
98 preferMarketSizeAtMost(4);
99 } else if (q <= 0.25) {
100 preferMarketSizeAtMost(5);
101 } else if (q <= 0.5) {
102 preferMarketSizeAtMost(6);
103 } else if (q <= 0.75) {
104 preferMarketSizeAtMost(7);
105 }
106
107 market = pickMarket();
108 if (market == null) return false;
109
110 if (!setMarketMissionRef(market, "$tabo_ref")) {
111 return false;
112 }
113 makeImportant(market, "$tabo_target", Stage.BOMBARD);
114
115 setStartingStage(Stage.BOMBARD);
116 setSuccessStage(Stage.COMPLETED);
117 setFailureStage(Stage.FAILED);
118
119 setStageOnMemoryFlag(Stage.COMPLETED, market, "$tabo_completed");
120 setTimeLimit(Stage.FAILED, MISSION_DAYS, null);
121
122 addNoPenaltyFailureStages(Stage.FAILED_NO_PENALTY);
123 connectWithMarketDecivilized(Stage.BOMBARD, Stage.FAILED_NO_PENALTY, market);
124 setStageOnMarketDecivilized(Stage.FAILED_NO_PENALTY, createdAt);
125 connectWithHostilitiesEnded(Stage.BOMBARD, Stage.FAILED_NO_PENALTY, person, market);
126 setStageOnHostilitiesEnded(Stage.FAILED_NO_PENALTY, person, market);
127
128 //setCreditReward(80000, 100000);
129 setCreditReward(CreditReward.VERY_HIGH, market.getSize());
130
131 if (market.getSize() <= 4) {
132 triggerCreateLargePatrolAroundMarket(market, Stage.BOMBARD, 0f);
133 triggerCreateSmallPatrolAroundMarket(market, Stage.BOMBARD, 0f);
134 } else if (market.getSize() <= 6) {
135 triggerCreateLargePatrolAroundMarket(market, Stage.BOMBARD, 0f);
136 triggerCreateMediumPatrolAroundMarket(market, Stage.BOMBARD, 0f);
137 triggerCreateSmallPatrolAroundMarket(market, Stage.BOMBARD, 0f);
138 } else {
139 triggerCreateLargePatrolAroundMarket(market, Stage.BOMBARD, 0f);
140 triggerCreateLargePatrolAroundMarket(market, Stage.BOMBARD, 0f);
141 triggerCreateMediumPatrolAroundMarket(market, Stage.BOMBARD, 0f);
142 triggerCreateSmallPatrolAroundMarket(market, Stage.BOMBARD, 0f);
143 }
144
145 return true;
146 }
147
148 protected void updateInteractionDataImpl() {
149 set("$tabo_barEvent", isBarEvent());
150 set("$tabo_manOrWoman", getPerson().getManOrWoman());
151 set("$tabo_reward", Misc.getWithDGS(getCreditsReward()));
152
153 set("$tabo_personName", getPerson().getNameString());
154 set("$tabo_systemName", market.getStarSystem().getNameWithLowercaseTypeShort());
155 set("$tabo_marketName", market.getName());
156 set("$tabo_marketOnOrAt", market.getOnOrAt());
157 set("$tabo_dist", getDistanceLY(market));
158
159 int fuel = getBombardmentFuel(market);
160 set("$tabo_fuel", Misc.getWithDGS(fuel));
161 }
162
163 @Override
164 public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) {
165 float opad = 10f;
166 Color h = Misc.getHighlightColor();
167 if (currentStage == Stage.BOMBARD) {
168 addStandardMarketDesc("Perform a tactical bombardment of", market, info, opad);
169 addBombardmentInfo(market, info, opad);
170 }
171 }
172
173 @Override
174 public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) {
175 Color h = Misc.getHighlightColor();
176 if (currentStage == Stage.BOMBARD) {
177 info.addPara("Tactically bombard " + market.getName() +
178 " in the " + market.getStarSystem().getNameWithLowercaseTypeShort(), tc, pad);
179 return true;
180 }
181 return false;
182 }
183
184 @Override
185 public String getBaseName() {
186 return "Bombard " + market.getName();
187 }
188
189
190 @Override
191 public void acceptImpl(InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap) {
192 super.acceptImpl(dialog, memoryMap);
193 Global.getSector().getListenerManager().addListener(this);
194 }
195
196 @Override
197 protected void notifyEnding() {
198 super.notifyEnding();
199 Global.getSector().getListenerManager().removeListener(this);
200 }
201
202 public void reportRaidToDisruptFinished(InteractionDialogAPI dialog,
203 MarketAPI market, TempData actionData, Industry industry) {
204 // TODO Auto-generated method stub
205 }
206
207
208
209 public void reportRaidForValuablesFinishedBeforeCargoShown(InteractionDialogAPI dialog,
210 MarketAPI market, TempData actionData,
211 CargoAPI cargo) {
212 // TODO Auto-generated method stub
213 }
214
215
217 InteractionDialogAPI dialog, MarketAPI market, TempData actionData) {
218 // TODO Auto-generated method stub
219
220 }
221
222 public void reportTacticalBombardmentFinished(InteractionDialogAPI dialog,
223 MarketAPI market, TempData actionData) {
224 if (this.market == market) {
225 if (!isEnded() || isEnding()) {
226 if (rollProbability(PROB_PATROL_ENCOUNTER_AFTER)) {
227 DelayedFleetEncounter e = new DelayedFleetEncounter(genRandom, getMissionId());
228 e.setDelayMedium();
229 e.setLocationCoreOnly(true, market.getFactionId());
230 e.beginCreate();
231 e.triggerCreateFleet(FleetSize.VERY_LARGE, FleetQuality.HIGHER, market.getFactionId(), FleetTypes.PATROL_LARGE, new Vector2f());
232 e.triggerSetFleetOfficers(OfficerNum.MORE, OfficerQuality.HIGHER);
233 e.triggerSetAdjustStrengthBasedOnQuality(true, getQuality());
234 e.triggerSetPatrol();
236 e.triggerSetFleetMemoryValue("$tabo_marketName", market.getName());
237 e.triggerSetFleetGenericHailPermanent("TABOPatrolHail");
238 e.endCreate();
239 }
240 }
241
242 Global.getSector().getListenerManager().removeListener(this);
243 // need to set non-zero expiration since bombardment code advances the market with 0/very small elapsed time
244 // a few times, so if set to 0 the value would be removed from memory
245 market.getMemoryWithoutUpdate().set("$tabo_bombardedColony", true, 1f);
246 }
247 }
248
249}
250
251
252
253
254
static SectorAPI getSector()
Definition Global.java:59
void triggerCreateFleet(FleetSize size, FleetQuality quality, String factionId, String type, SectorEntityToken roughlyWhere)
void setLocationCoreOnly(boolean allowInsidePopulatedSystems, String requireLargestMarketNotHostileToFaction)
void reportRaidForValuablesFinishedBeforeCargoShown(InteractionDialogAPI dialog, MarketAPI market, TempData actionData, CargoAPI cargo)
void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height)
void reportTacticalBombardmentFinished(InteractionDialogAPI dialog, MarketAPI market, TempData actionData)
boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad)
void acceptImpl(InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap)
void reportSaturationBombardmentFinished(InteractionDialogAPI dialog, MarketAPI market, TempData actionData)
void reportRaidToDisruptFinished(InteractionDialogAPI dialog, MarketAPI market, TempData actionData, Industry industry)