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