001package com.fs.starfarer.api.impl.campaign.rulecmd;
002
003import java.util.List;
004import java.util.Map;
005
006import com.fs.starfarer.api.Global;
007import com.fs.starfarer.api.campaign.BaseStoryPointActionDelegate;
008import com.fs.starfarer.api.campaign.InteractionDialogAPI;
009import com.fs.starfarer.api.campaign.OptionPanelAPI.OptionTooltipCreator;
010import com.fs.starfarer.api.campaign.StoryPointActionDelegate;
011import com.fs.starfarer.api.campaign.TextPanelAPI;
012import com.fs.starfarer.api.campaign.rules.MemoryAPI;
013import com.fs.starfarer.api.ui.TooltipMakerAPI;
014import com.fs.starfarer.api.util.Misc;
015import com.fs.starfarer.api.util.Misc.Token;
016
017/**
018 * SetStoryColor <option id> <story points> <bonus XP fraction key> <optional: story point spent sound id> <optional: playthrough log text>
019 */
020public class SetStoryOption extends BaseCommandPlugin {
021
022//      public static boolean set(InteractionDialogAPI dialog, int points, 
023//                                                      String optionId, String bonusXPKey, String soundId) {
024//              return set(null, dialog, null, optionId + " " + points + " " + bonusXPKey + " " + soundId);
025//              
026//      }
027        
028        public static class StoryOptionParams {
029                public Object optionId;
030                public int numPoints;
031                public String bonusXPID;
032                public String soundId;
033                public String logText;
034                public StoryOptionParams(Object optionId, int numPoints, String bonusXPID, String soundId, String logText) {
035                        this.optionId = optionId;
036                        this.numPoints = numPoints;
037                        this.bonusXPID = bonusXPID;
038                        this.soundId = soundId;
039                        this.logText = logText;
040                }
041                
042        }
043        
044        public static class BaseOptionStoryPointActionDelegate extends BaseStoryPointActionDelegate {
045                protected Object optionId;
046                protected float bonusXPFraction;
047                protected InteractionDialogAPI dialog;
048                protected int numPoints;
049                protected String soundId;
050                protected String logText;
051                
052                public BaseOptionStoryPointActionDelegate(InteractionDialogAPI dialog, StoryOptionParams params) {
053                        this.optionId = params.optionId;
054                        this.bonusXPFraction = Global.getSettings().getBonusXP(params.bonusXPID);
055                        this.dialog = dialog;
056                        this.numPoints = params.numPoints;
057                        this.soundId = params.soundId;
058                        this.logText = params.logText;
059                }
060                @Override
061                public void preConfirm() {
062                        if (dialog != null) dialog.addOptionSelectedText(optionId, true);
063                }
064                @Override
065                public void confirm() {
066                }
067                @Override
068                public void createDescription(TooltipMakerAPI info) {
069                        //info.setParaSmallInsignia();
070                        info.setParaInsigniaLarge();
071                        
072                        addActionCostSection(info);
073                        
074                        info.addSpacer(20f);
075                }
076                
077                protected void addActionCostSection(TooltipMakerAPI info) {
078                        
079                        int sp = Global.getSector().getPlayerStats().getStoryPoints();
080                        float pad = -10f;
081                        float opad = 10f;
082                        int percent = Math.round(bonusXPFraction * 100f);
083                        
084                        if (numPoints == 1) {
085                                if (percent <= 0) {
086                                        info.addPara("This action requires a %s and does not grant any bonus experience.", 
087                                                        pad, Misc.getStoryOptionColor(), "" + Misc.STORY + " point");
088                                } else {
089                                        info.addPara("This action requires a %s and grants %s bonus experience.", 
090                                                        pad, Misc.getStoryOptionColor(), "" + Misc.STORY + " point", "" + percent + "%");
091                                }
092                        } else {
093                                if (percent <= 0) {
094                                        info.addPara("This action requires %s and does not grant any bonus experience.", 
095                                                        pad, Misc.getStoryOptionColor(), "" + numPoints + " " + Misc.STORY + " points");
096                                } else {
097                                        info.addPara("This action requires %s and grants %s bonus experience for each point.", 
098                                                        pad, Misc.getStoryOptionColor(), "" + numPoints + " " + Misc.STORY + " points", "" + percent + "%");
099                                }
100                        }
101                        
102                        if (sp <= 0) {
103                                info.addPara("No " + Misc.STORY + " points available", Misc.getNegativeHighlightColor(), opad);
104                        } else if (sp < numPoints) {
105                                String points = "points";
106                                if (sp == 1) points = "point";
107                                info.addPara("Only %s " + Misc.STORY + " " + points + " available", opad, Misc.getNegativeHighlightColor(), 
108                                                Misc.getNegativeHighlightColor(), "" + sp);
109                        }
110                        //info.addSpacer(opad);
111                }
112                
113                @Override
114                public float getBonusXPFraction() {
115                        return bonusXPFraction;
116                }
117                @Override
118                public String getConfirmSoundId() {
119                        String soundId = this.soundId;
120                        if ("leadership".equals(soundId)) soundId = "ui_char_spent_story_point_leadership";
121                        if ("combat".equals(soundId)) soundId = "ui_char_spent_story_point_combat";
122                        if ("industry".equals(soundId)) soundId = "ui_char_spent_story_point_industry";
123                        if ("technology".equals(soundId)) soundId = "ui_char_spent_story_point_technology";
124                        if ("general".equals(soundId)) soundId = "ui_char_spent_story_point_combat";
125                        if ("generic".equals(soundId)) soundId = "ui_char_spent_story_point_combat";
126                        return soundId;
127                }
128                @Override
129                public int getRequiredStoryPoints() {
130                        return numPoints;
131                }
132                //@Override
133                public String getLogText() {
134                        return logText;
135                }
136                @Override
137                public TextPanelAPI getTextPanel() {
138                        if (dialog == null) return null;
139                        return dialog.getTextPanel();
140                }
141                @Override
142                public String getTitle() {
143                        return null;
144                        //return "Confirm use of story points";
145                }
146                @Override
147                public boolean withSPInfo() {
148                        return false;
149                }
150        }
151        
152        public static boolean set(String ruleId, InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap, String params) {
153                return new SetStoryOption().execute(ruleId, dialog, Misc.tokenize(params), memoryMap);
154        }
155        
156        public boolean execute(String ruleId, final InteractionDialogAPI dialog, List<Token> params, Map<String, MemoryAPI> memoryMap) {
157                if (dialog == null) return false;
158                
159                //SetStoryOption gaData_getAvoidCombat 1 gaData_avoidCombat general "Created a distraction"
160                //SetStoryOption gaData_getAvoidCombat general "Created a distraction"
161
162                String optionId = "";
163                String bonusXPID = "";
164                String soundId = "";
165                String logText = null;
166                int numPoints = 1;
167                if (params.size() == 3) {
168                        optionId = params.get(0).string;
169                        numPoints = 1;
170                        bonusXPID = optionId;
171                        soundId = params.get(1).string;
172                        logText = params.get(2).getStringWithTokenReplacement(params.get(2).getString(memoryMap), dialog, memoryMap);
173                } else {
174                        optionId = params.get(0).string;
175                        numPoints = (int) params.get(1).getFloat(memoryMap);
176                        bonusXPID = params.get(2).getString(memoryMap);
177                        //final float bonusXPFraction = params.get(2).getFloat(memoryMap);
178                        
179                        soundId = params.size() >= 4 ? params.get(3).string : null;
180        //              if ("leadership".equals(soundId)) soundId = "ui_char_spent_story_point_leadership";
181        //              if ("combat".equals(soundId)) soundId = "ui_char_spent_story_point_combat";
182        //              if ("industry".equals(soundId)) soundId = "ui_char_spent_story_point_industry";
183        //              if ("technology".equals(soundId)) soundId = "ui_char_spent_story_point_technology";
184        //              if ("general".equals(soundId)) soundId = "ui_char_spent_story_point_combat";
185                        
186                        if (params.size() >= 5) {
187                                //logText = params.get(4).getString(memoryMap);
188                                logText = params.get(4).getStringWithTokenReplacement(params.get(4).getString(memoryMap), dialog, memoryMap);
189                        }
190                }
191                
192                return set(dialog, numPoints, optionId, bonusXPID, soundId, logText);
193        }
194        
195                
196        public static boolean set(final InteractionDialogAPI dialog, final int numPoints, 
197                        final Object optionId, String bonusXPID, final String soundId, String logText) {
198                //final float bonusXPFraction = Global.getSettings().getBonusXP(bonusXPID);
199                StoryOptionParams params = new StoryOptionParams(optionId, numPoints, bonusXPID, soundId, logText);
200                return set(dialog, params, new BaseOptionStoryPointActionDelegate(dialog, params));
201        }
202        public static boolean set(final InteractionDialogAPI dialog, final StoryOptionParams params,
203                                StoryPointActionDelegate delegate) {
204                                
205                final float bonusXPFraction = Global.getSettings().getBonusXP(params.bonusXPID);
206                dialog.makeStoryOption(params.optionId, params.numPoints, bonusXPFraction, params.soundId);
207                
208                if (params.numPoints > Global.getSector().getPlayerStats().getStoryPoints()) {
209                        dialog.getOptionPanel().setEnabled(params.optionId, false);
210                }
211                
212                dialog.getOptionPanel().addOptionTooltipAppender(params.optionId, new OptionTooltipCreator() {
213                        public void createTooltip(TooltipMakerAPI tooltip, boolean hadOtherText) {
214                                float opad = 10f;
215                                float initPad = 0f;
216                                if (hadOtherText) initPad = opad;
217                                tooltip.addStoryPointUseInfo(initPad, params.numPoints, bonusXPFraction, true);
218                                int sp = Global.getSector().getPlayerStats().getStoryPoints();
219                                String points = "points";
220                                if (sp == 1) points = "point";
221                                tooltip.addPara("You have %s " + Misc.STORY + " " + points + ".", opad, 
222                                                Misc.getStoryOptionColor(), "" + sp);
223                        }
224                });
225                
226                dialog.getOptionPanel().addOptionConfirmation(params.optionId, delegate);
227                
228                dialog.getOptionPanel().setStoryOptionParams(params.optionId, params, delegate);
229                
230                return true;
231        }
232
233}