Starsector API
Loading...
Searching...
No Matches
LuddicPathBaseBarEvent.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.intel.bar.events;
2
3import java.awt.Color;
4import java.util.Map;
5
6import com.fs.starfarer.api.Global;
7import com.fs.starfarer.api.campaign.CampaignFleetAPI;
8import com.fs.starfarer.api.campaign.CargoAPI;
9import com.fs.starfarer.api.campaign.FactionAPI;
10import com.fs.starfarer.api.campaign.InteractionDialogAPI;
11import com.fs.starfarer.api.campaign.OptionPanelAPI;
12import com.fs.starfarer.api.campaign.TextPanelAPI;
13import com.fs.starfarer.api.campaign.econ.MarketAPI;
14import com.fs.starfarer.api.campaign.rules.MemoryAPI;
15import com.fs.starfarer.api.characters.FullName.Gender;
16import com.fs.starfarer.api.characters.MutableCharacterStatsAPI;
17import com.fs.starfarer.api.characters.PersonAPI;
18import com.fs.starfarer.api.characters.SkillSpecAPI;
19import com.fs.starfarer.api.impl.campaign.events.OfficerManagerEvent;
20import com.fs.starfarer.api.impl.campaign.events.OfficerManagerEvent.SkillPickPreference;
21import com.fs.starfarer.api.impl.campaign.ids.Factions;
22import com.fs.starfarer.api.impl.campaign.ids.Ranks;
23import com.fs.starfarer.api.impl.campaign.ids.Sounds;
24import com.fs.starfarer.api.impl.campaign.intel.bar.PortsideBarData;
25import com.fs.starfarer.api.impl.campaign.intel.bases.LuddicPathBaseIntel;
26import com.fs.starfarer.api.impl.campaign.intel.bases.LuddicPathCellsIntel;
27import com.fs.starfarer.api.impl.campaign.intel.bases.PirateBaseIntel;
28import com.fs.starfarer.api.impl.campaign.rulecmd.AddRemoveCommodity;
29import com.fs.starfarer.api.impl.campaign.rulecmd.SetStoryOption;
30import com.fs.starfarer.api.impl.campaign.rulecmd.SetStoryOption.BaseOptionStoryPointActionDelegate;
31import com.fs.starfarer.api.impl.campaign.rulecmd.SetStoryOption.StoryOptionParams;
32import com.fs.starfarer.api.ui.LabelAPI;
33import com.fs.starfarer.api.ui.TooltipMakerAPI;
34import com.fs.starfarer.api.util.Misc;
35
37
38 public static enum OptionId {
39 INIT,
40 AGREE,
41 HIRE,
42 HIRE_CONTINUE,
43 REJECT,
44 LEAVE,
45
46 }
47
48 public static int COST = 10000;
49
50 protected LuddicPathBaseIntel intel;
51
52 public boolean isAlwaysShow() {
53 return true;
54 }
55
56 public LuddicPathBaseBarEvent(LuddicPathBaseIntel intel) {
57 this.intel = intel;
58 }
59
60 public boolean shouldShowAtMarket(MarketAPI market) {
61 for (LuddicPathCellsIntel cell : LuddicPathCellsIntel.getCellsForBase(intel, true)) {
62 if (cell.isSleeper()) continue;
63 if (cell.getSleeperTimeout() > 0) continue;
64 if (cell.getMarket() == market) return true;
65 }
66 return false;
67 }
68
69 @Override
70 public boolean shouldRemoveEvent() {
71 return intel.isEnding() || intel.isEnded() || intel.isPlayerVisible();
72 }
73
74 @Override
75 protected void regen(MarketAPI market) {
76 if (this.market == market) return;
77 super.regen(market);
78// random = new Random(seed + market.getId().hashCode());
79// person = createPerson();
80 }
81
82 @Override
83 protected PersonAPI createPerson() {
84 FactionAPI faction = Global.getSector().getFaction(Factions.LUDDIC_PATH);
85 int level = 1;
86 PersonAPI person = OfficerManagerEvent.createOfficer(faction, level, SkillPickPreference.NO_ENERGY_YES_BALLISTIC_YES_MISSILE_YES_DEFENSE,
87 true, null, true, false, 0, random);
88 return person;
89 }
90
91 @Override
92 public void addPromptAndOption(InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap) {
93 super.addPromptAndOption(dialog, memoryMap);
94
95 regen(dialog.getInteractionTarget().getMarket());
96
97 TextPanelAPI text = dialog.getTextPanel();
98 text.addPara("A " + getManOrWoman() + " with Pather tattoos is staring at you from across the bar " +
99 "with a desperate gleam in " + getHisOrHer() + " eyes.");
100
101 dialog.getOptionPanel().addOption("Make eye contact with the Pather and walk out into the back alley", this, null);
102 }
103
104 @Override
105 public void init(InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap) {
106 super.init(dialog, memoryMap);
107
108 done = false;
109 dialog.getVisualPanel().showPersonInfo(person, true);
110
111 optionSelected(null, OptionId.INIT);
112 }
113
114 @Override
115 public void optionSelected(String optionText, Object optionData) {
116 if (!(optionData instanceof OptionId)) {
117 return;
118 }
119 OptionId option = (OptionId) optionData;
120
121 OptionPanelAPI options = dialog.getOptionPanel();
122 TextPanelAPI text = dialog.getTextPanel();
123 options.clearOptions();
124
125 CargoAPI cargo = Global.getSector().getPlayerFleet().getCargo();
126 int credits = (int) cargo.getCredits().get();
127
128 Color h = Misc.getHighlightColor();
129 Color n = Misc.getNegativeHighlightColor();
130 //COST = 10000;
131
132 switch (option) {
133 case INIT:
134 text.addPara("After a minute or two of waiting in the alley, the door opens and the Pather " +
135 "walks out.");
136 text.addPara("\"I know who you are\", " + getHeOrShe() + " says. \"I need your help. If they find " +
137 "out what I've done... well, let's just say my future with the Path is likely to be a short one. " +
138 "So, how about this: you arrange a new identity for me, and I tell you where " +
139 "the base supplying the Pather cells at this colony is located.\"");
140
141 boolean canAccept = COST <= credits;
142 LabelAPI label = text.addPara("You estimate that doing as " + getHeOrShe() +
143 " asks will run you about %s. You have %s available.",
144 h,
145 Misc.getDGSCredits(COST),
146 Misc.getDGSCredits(credits));
147 label.setHighlightColors(canAccept ? h : n, h);
148 label.setHighlight(Misc.getDGSCredits(COST), Misc.getDGSCredits(credits));
149
150 options.addOption("Agree to " + getHisOrHer() + " terms", OptionId.AGREE);
151 if (!canAccept) {
152 options.setEnabled(OptionId.AGREE, false);
153 options.setTooltip(OptionId.AGREE, "Not enough credits.");
154 }
156 options.addOption("Suggest that " + getHeOrShe() + " handle " + getHisOrHer() + " own problems", OptionId.REJECT);
157 break;
158 case AGREE:
159 text.addPara("You agree to the " + getManOrWoman() + "'s terms and make the necessary arrangements.");
160
161 cargo.getCredits().subtract(COST);
162 AddRemoveCommodity.addCreditsLossText(COST, dialog.getTextPanel());
163
164 done = true;
165 intel.makeKnown();
166 intel.sendUpdate(PirateBaseIntel.DISCOVERED_PARAM, text);
167
169 options.addOption("Continue", OptionId.LEAVE);
170 break;
171 case REJECT:
172 text.addPara("You leave the back alley and return to the bar.");
173
174 options.addOption("Continue", OptionId.LEAVE);
175 break;
176 case LEAVE:
177 noContinue = true;
178 done = true;
179 break;
180 }
181 }
182
183 protected void addStoryOption() {
184 String id = "join_id";
185 options.addOption("Offer for " + getHimOrHer() + " to join your fleet instead", id);
186
187 final CampaignFleetAPI playerFleet = Global.getSector().getPlayerFleet();
188
189 int num = Misc.getNumNonMercOfficers(playerFleet);
190 int max = Misc.getMaxOfficers(playerFleet);
191
192 if (num >= max) {
193 options.setEnabled(id, false);
194 options.setTooltip(id, "Maximum number of officers reached.");
195 }
196
197 StoryOptionParams params = new StoryOptionParams(id, 1, "patherJoinFleet", Sounds.STORY_POINT_SPEND_LEADERSHIP,
198 "Allowed " + person.getNameString() + ", a Luddic Path defector, to join your fleet");
199
200 SetStoryOption.set(dialog, params,
201 new BaseOptionStoryPointActionDelegate(dialog, params) {
202
203 @Override
204 public void confirm() {
205 super.confirm();
206
207 text.addPara(Misc.ucFirst(getHeOrShe()) + " is mistrustful at first, but that turns to surprise and " +
208 "gratitude when " + getHeOrShe() + " realizes you're serious.");
209
210 CampaignFleetAPI playerFleet = Global.getSector().getPlayerFleet();
211 playerFleet.getFleetData().addOfficer(getPerson());
212 getPerson().setPostId(Ranks.POST_OFFICER);
213 AddRemoveCommodity.addOfficerGainText(getPerson(), dialog.getTextPanel());
214
215 done = true;
216 intel.makeKnown();
217 intel.sendUpdate(PirateBaseIntel.DISCOVERED_PARAM, text);
218
220 options.addOption("Continue", OptionId.LEAVE);
221
222 OptionPanelAPI options = dialog.getOptionPanel();
223 options.clearOptions();
224 options.addOption("Continue", OptionId.LEAVE);
225 }
226
227 @Override
228 public String getTitle() {
229 //return "Taking on a new officer";
230 return "Taking in Luddic Path defector";
231 //return null;
232 }
233
234 @Override
235 public void createDescription(TooltipMakerAPI info) {
236 float opad = 10f;
237
238 info.addSpacer(-opad);
239
240 MutableCharacterStatsAPI stats = person.getStats();
241 //TextPanelAPI text = dialog.getTextPanel();
242 TooltipMakerAPI text = info;
243
244 //text.setFontSmallInsignia();
245
246 Color hl = Misc.getHighlightColor();
247 Color red = Misc.getNegativeHighlightColor();
248
249// text.addPara("You consider letting the Pather join your fleet. It's taking a risk, but " +
250// "something makes you feel that " + getHeOrShe() + " would be " +
251// "trustworthy if given a second chance.", opad);
252
253 text.addPara("You consider letting the Luddic Path defector, " + person.getNameString() + ", join your fleet.", opad);
254
255 //text.addPara("----------------------------------------------------------------------------------", opad);
256
257 text.addPara("Level: %s", opad, hl, "" + (int) stats.getLevel());
258 //text.highlightInLastPara(hl, "" + (int) stats.getLevel());
259
260 for (String skillId : Global.getSettings().getSortedSkillIds()) {
261 int level = (int) stats.getSkillLevel(skillId);
262 if (level > 0) {
263 SkillSpecAPI spec = Global.getSettings().getSkillSpec(skillId);
264 String skillName = spec.getName();
265 if (spec.isAptitudeEffect()) {
266 skillName += " Aptitude";
267 }
268
269 if (level <= 1) {
270 text.addPara(skillName, opad);
271 } else {
272 text.addPara(skillName + " (Elite)", opad);
273 }
274 //text.highlightInLastPara(hl, "" + level);
275 }
276 }
277
278 String personality = Misc.lcFirst(person.getPersonalityAPI().getDisplayName());
279 text.addPara("Personality: %s", opad, Misc.getHighlightColor(), personality);
280 text.addPara(person.getPersonalityAPI().getDescription(), opad);
281
282 //text.addPara("----------------------------------------------------------------------------------", opad);
283
284 info.addSpacer(opad * 2f);
285 addActionCostSection(info);
286 }
287
288 });
289 }
290
291 @Override
292 protected String getPersonFaction() {
293 return Factions.LUDDIC_PATH;
294 }
295
296 @Override
297 protected String getPersonRank() {
298 return Ranks.CITIZEN;
299 }
300
301 @Override
302 protected String getPersonPost() {
303 return Ranks.CITIZEN;
304 }
305
306 @Override
307 protected String getPersonPortrait() {
308 return null;
309 }
310
311 @Override
312 protected Gender getPersonGender() {
313 return Gender.ANY;
314 }
315
316
317}
318
319
320
static SettingsAPI getSettings()
Definition Global.java:51
static SectorAPI getSector()
Definition Global.java:59
void addPromptAndOption(InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap)
void init(InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap)
SkillSpecAPI getSkillSpec(String skillId)
List< String > getSortedSkillIds()