001package com.fs.starfarer.api.impl.campaign.intel.bar.events; 002 003import java.awt.Color; 004import java.util.Map; 005 006import com.fs.starfarer.api.Global; 007import com.fs.starfarer.api.campaign.CampaignFleetAPI; 008import com.fs.starfarer.api.campaign.CargoAPI; 009import com.fs.starfarer.api.campaign.FactionAPI; 010import com.fs.starfarer.api.campaign.InteractionDialogAPI; 011import com.fs.starfarer.api.campaign.OptionPanelAPI; 012import com.fs.starfarer.api.campaign.TextPanelAPI; 013import com.fs.starfarer.api.campaign.econ.MarketAPI; 014import com.fs.starfarer.api.campaign.rules.MemoryAPI; 015import com.fs.starfarer.api.characters.FullName.Gender; 016import com.fs.starfarer.api.characters.MutableCharacterStatsAPI; 017import com.fs.starfarer.api.characters.PersonAPI; 018import com.fs.starfarer.api.characters.SkillSpecAPI; 019import com.fs.starfarer.api.impl.campaign.events.OfficerManagerEvent; 020import com.fs.starfarer.api.impl.campaign.events.OfficerManagerEvent.SkillPickPreference; 021import com.fs.starfarer.api.impl.campaign.ids.Factions; 022import com.fs.starfarer.api.impl.campaign.ids.Ranks; 023import com.fs.starfarer.api.impl.campaign.ids.Sounds; 024import com.fs.starfarer.api.impl.campaign.intel.bar.PortsideBarData; 025import com.fs.starfarer.api.impl.campaign.intel.bases.LuddicPathBaseIntel; 026import com.fs.starfarer.api.impl.campaign.intel.bases.LuddicPathCellsIntel; 027import com.fs.starfarer.api.impl.campaign.intel.bases.PirateBaseIntel; 028import com.fs.starfarer.api.impl.campaign.rulecmd.AddRemoveCommodity; 029import com.fs.starfarer.api.impl.campaign.rulecmd.SetStoryOption; 030import com.fs.starfarer.api.impl.campaign.rulecmd.SetStoryOption.BaseOptionStoryPointActionDelegate; 031import com.fs.starfarer.api.impl.campaign.rulecmd.SetStoryOption.StoryOptionParams; 032import com.fs.starfarer.api.ui.LabelAPI; 033import com.fs.starfarer.api.ui.TooltipMakerAPI; 034import com.fs.starfarer.api.util.Misc; 035 036public class LuddicPathBaseBarEvent extends BaseBarEventWithPerson { 037 038 public static enum OptionId { 039 INIT, 040 AGREE, 041 HIRE, 042 HIRE_CONTINUE, 043 REJECT, 044 LEAVE, 045 046 } 047 048 public static int COST = 10000; 049 050 protected LuddicPathBaseIntel intel; 051 052 public boolean isAlwaysShow() { 053 return true; 054 } 055 056 public LuddicPathBaseBarEvent(LuddicPathBaseIntel intel) { 057 this.intel = intel; 058 } 059 060 public boolean shouldShowAtMarket(MarketAPI market) { 061 for (LuddicPathCellsIntel cell : LuddicPathCellsIntel.getCellsForBase(intel, true)) { 062 if (cell.isSleeper()) continue; 063 if (cell.getSleeperTimeout() > 0) continue; 064 if (cell.getMarket() == market) return true; 065 } 066 return false; 067 } 068 069 @Override 070 public boolean shouldRemoveEvent() { 071 return intel.isEnding() || intel.isEnded() || intel.isPlayerVisible(); 072 } 073 074 @Override 075 protected void regen(MarketAPI market) { 076 if (this.market == market) return; 077 super.regen(market); 078// random = new Random(seed + market.getId().hashCode()); 079// person = createPerson(); 080 } 081 082 @Override 083 protected PersonAPI createPerson() { 084 FactionAPI faction = Global.getSector().getFaction(Factions.LUDDIC_PATH); 085 int level = 1; 086 PersonAPI person = OfficerManagerEvent.createOfficer(faction, level, SkillPickPreference.NO_ENERGY_YES_BALLISTIC_YES_MISSILE_YES_DEFENSE, 087 true, null, true, false, 0, random); 088 return person; 089 } 090 091 @Override 092 public void addPromptAndOption(InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap) { 093 super.addPromptAndOption(dialog, memoryMap); 094 095 regen(dialog.getInteractionTarget().getMarket()); 096 097 TextPanelAPI text = dialog.getTextPanel(); 098 text.addPara("A " + getManOrWoman() + " with Pather tattoos is staring at you from across the bar " + 099 "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 } 155 addStoryOption(); 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 168 PortsideBarData.getInstance().removeEvent(this); 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 219 PortsideBarData.getInstance().removeEvent(LuddicPathBaseBarEvent.this); 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