001package com.fs.starfarer.api.impl.campaign.intel; 002 003import java.util.Set; 004 005import java.awt.Color; 006 007import org.lwjgl.input.Keyboard; 008 009import com.fs.starfarer.api.Global; 010import com.fs.starfarer.api.campaign.CampaignFleetAPI; 011import com.fs.starfarer.api.campaign.StoryPointActionDelegate; 012import com.fs.starfarer.api.campaign.TextPanelAPI; 013import com.fs.starfarer.api.characters.MutableCharacterStatsAPI; 014import com.fs.starfarer.api.characters.PersonAPI; 015import com.fs.starfarer.api.characters.SkillSpecAPI; 016import com.fs.starfarer.api.impl.campaign.events.OfficerManagerEvent; 017import com.fs.starfarer.api.impl.campaign.events.OfficerManagerEvent.SkillPickPreference; 018import com.fs.starfarer.api.impl.campaign.ids.Factions; 019import com.fs.starfarer.api.impl.campaign.ids.Ranks; 020import com.fs.starfarer.api.impl.campaign.ids.Sounds; 021import com.fs.starfarer.api.impl.campaign.ids.Tags; 022import com.fs.starfarer.api.impl.campaign.rulecmd.SetStoryOption.BaseOptionStoryPointActionDelegate; 023import com.fs.starfarer.api.impl.campaign.rulecmd.SetStoryOption.StoryOptionParams; 024import com.fs.starfarer.api.ui.ButtonAPI; 025import com.fs.starfarer.api.ui.IntelUIAPI; 026import com.fs.starfarer.api.ui.LabelAPI; 027import com.fs.starfarer.api.ui.SectorMapAPI; 028import com.fs.starfarer.api.ui.TooltipMakerAPI; 029import com.fs.starfarer.api.util.Misc; 030 031public class PromoteOfficerIntel extends BaseIntelPlugin { 032 033 public static String BUTTON_PROMOTE = "button_promote"; 034 public static String BUTTON_DELETE = "button_delete"; 035 public static float DURATION = 180f; 036 037 protected PersonAPI person; 038 039 public PromoteOfficerIntel(TextPanelAPI text) { 040 041 if (Global.getSector().getPlayerFleet().getCargo().getCrew() <= 0) { 042 endImmediately(); 043 return; 044 } 045 046 person = OfficerManagerEvent.createOfficer(Global.getSector().getFaction(Factions.PLAYER), 1, 047 SkillPickPreference.ANY, true, null, false, false, -1, null); 048 person.setPortraitSprite(OfficerManagerEvent.pickPortraitPreferNonDuplicate(person.getFaction(), person.getGender())); 049 if (text != null) { 050 text.addPara(getDescText()); 051 } 052 053 setImportant(true); 054 } 055 056 public boolean shouldRemoveIntel() { 057 if (Global.getSector().getPlayerFleet().getCargo().getCrew() <= 0) { 058 return true; 059 } 060 061 float days = getDaysSincePlayerVisible(); 062 return isEnded() || days >= DURATION; 063 } 064 065 public String getName() { 066 return "Officer Promotion Candidate"; 067 } 068 069 public String getSmallDescriptionTitle() { 070 return getName(); 071 } 072 073 @Override 074 public void createIntelInfo(TooltipMakerAPI info, ListInfoMode mode) { 075 Color c = getTitleColor(mode); 076 info.addPara(getName(), c, 0f); 077 addBulletPoints(info, mode); 078 } 079 080 protected void addBulletPoints(TooltipMakerAPI info, ListInfoMode mode) { 081 Color h = Misc.getHighlightColor(); 082 Color g = Misc.getGrayColor(); 083 Color tc = getBulletColorForMode(mode); 084 085 float pad = 3f; 086 float opad = 10f; 087 088 float initPad = pad; 089 if (mode == ListInfoMode.IN_DESC) initPad = opad; 090 091 String pName = Misc.lcFirst(Misc.getPersonalityName(person)); 092 093 bullet(info); 094 MutableCharacterStatsAPI stats = person.getStats(); 095 for (String skillId : Global.getSettings().getSortedSkillIds()) { 096 int level = (int) stats.getSkillLevel(skillId); 097 if (level > 0) { 098 SkillSpecAPI spec = Global.getSettings().getSkillSpec(skillId); 099 String skillName = spec.getName(); 100 if (level > 1) { 101 skillName += " (Elite)"; 102 } 103 info.addPara("Skill: " + skillName, initPad, tc, h, skillName); 104 initPad = 0f; 105 } 106 } 107 info.addPara("Personality: %s", initPad, tc, h, pName); 108 unindent(info); 109 } 110 111 public String getDescText() { 112 String themselves = "himself"; 113 if (person.isFemale()) themselves = "herself"; 114 return "A junior officer, " + person.getNameString() + ", has distinguished " + themselves + 115 " recently and is worthy of consideration for " + 116 "the command of a ship."; 117 } 118 119 @Override 120 public void createSmallDescription(TooltipMakerAPI info, float width, float height) { 121 String pName = Misc.getPersonalityName(person); 122 123 Color h = Misc.getHighlightColor(); 124 Color g = Misc.getGrayColor(); 125 Color tc = Misc.getTextColor(); 126 float pad = 3f; 127 float opad = 10f; 128 129 info.addImage(person.getPortraitSprite(), width, 128, opad); 130 131 info.addPara(getDescText(), tc, opad); 132 133 addBulletPoints(info, ListInfoMode.IN_DESC); 134 info.addPara(person.getPersonalityAPI().getDescription(), opad); 135 136 137 int max = Misc.getMaxOfficers(Global.getSector().getPlayerFleet()); 138 int curr = Misc.getNumNonMercOfficers(Global.getSector().getPlayerFleet()); 139 140 float days = DURATION - getDaysSincePlayerVisible(); 141 info.addPara("This opportunity will be available for %s more " + getDaysString(days) + ".", 142 opad, tc, h, getDays(days)); 143 addLogTimestamp(info, tc, opad); 144 145 146 Color hNum = h; 147 if (curr >= max) hNum = Misc.getNegativeHighlightColor(); 148 LabelAPI label = info.addPara("Officers already under your command: %s %s %s", opad, tc, h, 149 "" + curr, "/", "" + max); 150 label.setHighlightColors(hNum, h, h); 151 152 153 154 Color color = Misc.getStoryOptionColor(); 155 Color dark = Misc.getStoryDarkColor(); 156 157 ButtonAPI button = addGenericButton(info, width, color, dark, "Promote to ship command", BUTTON_PROMOTE); 158 button.setShortcut(Keyboard.KEY_T, true); 159 160 info.addSpacer(-10f); 161 addDeleteButton(info, width, "Disregard"); 162// ButtonAPI delete = addGenericButton(info, width, "Disregard", BUTTON_DELETE); 163// delete.setShortcut(Keyboard.KEY_G, true); 164 165 if (curr >= max) { 166 button.setEnabled(false); 167 //info.addPara("Maximum number of officers reached.", tc, opad); 168 } 169 170 } 171 172 @Override 173 protected void createDeleteConfirmationPrompt(TooltipMakerAPI prompt) { 174 prompt.addPara("Are you sure? This action can not be undone.", Misc.getTextColor(), 0f); 175 } 176 177// @Override 178// public void buttonPressConfirmed(Object buttonId, IntelUIAPI ui) { 179// if (buttonId == BUTTON_DELETE) { 180// endImmediately(); 181// ui.recreateIntelUI(); 182// } 183// } 184 185 public void storyActionConfirmed(Object buttonId, IntelUIAPI ui) { 186 if (buttonId == BUTTON_PROMOTE) { 187 endImmediately(); 188 ui.recreateIntelUI(); 189 } 190 } 191 192// @Override 193// public void createConfirmationPrompt(Object buttonId, TooltipMakerAPI prompt) { 194// prompt.setParaInsigniaLarge(); 195// if (buttonId == BUTTON_DELETE) { 196// prompt.addPara("Are you sure? Disregarding this promotion opportunity is permanent.", 0f); 197// } else if (buttonId == BUTTON_DEVELOP) { 198// prompt.addPara("Develop a relationship with this contact?", 0f); 199// return; 200// } 201// super.createConfirmationPrompt(buttonId, prompt); 202// return; 203// } 204// 205// @Override 206// public boolean doesButtonHaveConfirmDialog(Object buttonId) { 207// if (buttonId == BUTTON_DELETE) return true; 208// if (buttonId == BUTTON_DEVELOP) return true; 209// return super.doesButtonHaveConfirmDialog(buttonId); 210// } 211 212 213 public StoryPointActionDelegate getButtonStoryPointActionDelegate(Object buttonId) { 214 if (buttonId == BUTTON_PROMOTE) { 215 StoryOptionParams params = new StoryOptionParams(null, 1, "promoteCrewMember", 216 Sounds.STORY_POINT_SPEND_LEADERSHIP, 217 "Promoted promising junior officer to ship command"); 218 return new BaseOptionStoryPointActionDelegate(null, params) { 219 @Override 220 public void confirm() { 221 CampaignFleetAPI playerFleet = Global.getSector().getPlayerFleet(); 222 playerFleet.getCargo().removeCrew(1); 223 224 playerFleet.getFleetData().addOfficer(person); 225 person.setPostId(Ranks.POST_OFFICER); 226 } 227 228 @Override 229 public String getTitle() { 230 //return "Promoting junior officer to ship command"; 231 return null; 232 } 233 234 @Override 235 public void createDescription(TooltipMakerAPI info) { 236 info.setParaInsigniaLarge(); 237 super.createDescription(info); 238 } 239 }; 240 } 241 return null; 242 } 243 244 245 @Override 246 public String getIcon() { 247 return person.getPortraitSprite(); 248 } 249 250 @Override 251 public Set<String> getIntelTags(SectorMapAPI map) { 252 Set<String> tags = super.getIntelTags(map); 253 tags.add(Tags.INTEL_FLEET_LOG); 254 return tags; 255 } 256 257 @Override 258 public String getSortString() { 259 return getSortStringNewestFirst(); 260 } 261 262 @Override 263 public String getCommMessageSound() { 264 return super.getCommMessageSound(); 265 //return getSoundMajorPosting(); 266 } 267 268 269} 270 271 272