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