001package com.fs.starfarer.api.impl.campaign.rulecmd.salvage;
002
003import java.util.List;
004import java.util.Map;
005
006import com.fs.starfarer.api.Global;
007import com.fs.starfarer.api.campaign.InteractionDialogAPI;
008import com.fs.starfarer.api.campaign.InteractionDialogPlugin;
009import com.fs.starfarer.api.campaign.SectorEntityToken;
010import com.fs.starfarer.api.campaign.rules.MemoryAPI;
011import com.fs.starfarer.api.combat.EngagementResultAPI;
012import com.fs.starfarer.api.impl.campaign.DevMenuOptions;
013import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
014import com.fs.starfarer.api.impl.campaign.rulecmd.BaseCommandPlugin;
015import com.fs.starfarer.api.impl.campaign.rulecmd.DumpMemory;
016import com.fs.starfarer.api.impl.campaign.rulecmd.FireBest;
017import com.fs.starfarer.api.util.Misc;
018import com.fs.starfarer.api.util.Misc.Token;
019
020/**
021 *      SalvageSpecialInteraction
022 */
023public class SalvageSpecialInteraction extends BaseCommandPlugin {
024
025        public static interface SalvageSpecialData {
026                SalvageSpecialPlugin createSpecialPlugin();
027        }
028        
029        
030        public static interface SalvageSpecialPlugin {
031                void init(InteractionDialogAPI dialog, Object specialData);
032                void optionSelected(String optionText, Object optionData);
033                boolean isDone();
034                boolean endWithContinue();
035                boolean shouldShowAgain();
036                boolean shouldAbortSalvageAndRemoveEntity();
037        }
038        
039        
040        public static class SalvageSpecialDialogPlugin implements InteractionDialogPlugin {
041                private InteractionDialogAPI dialog;
042                private InteractionDialogPlugin originalPlugin;
043                private Map<String, MemoryAPI> memoryMap;
044                private final SalvageSpecialPlugin special;
045                private final Object specialData;
046
047                public SalvageSpecialDialogPlugin(InteractionDialogPlugin originalPlugin, SalvageSpecialPlugin special, Object specialData, Map<String, MemoryAPI> memoryMap) {
048                        this.originalPlugin = originalPlugin;
049                        this.special = special;
050                        this.specialData = specialData;
051                        this.memoryMap = memoryMap;
052                }
053
054                public void init(InteractionDialogAPI dialog) {
055                        this.dialog = dialog;
056                        
057                        special.init(dialog, specialData);
058                        if (special.isDone()) {
059                                endSpecial(special.endWithContinue(), special.shouldAbortSalvageAndRemoveEntity());
060                        } else {
061                                if (Global.getSettings().isDevMode()) {
062                                        DevMenuOptions.addOptions(dialog);
063                                }
064                        }
065                }
066                public void optionSelected(String optionText, Object optionData) {
067                        if (optionText != null) {
068                                dialog.getTextPanel().addParagraph(optionText, Global.getSettings().getColor("buttonText"));
069                        }
070                        if (optionData == DumpMemory.OPTION_ID) {
071                                new DumpMemory().execute(null, dialog, null, getMemoryMap());
072                                return;
073                        } else if (DevMenuOptions.isDevOption(optionData)) {
074                                DevMenuOptions.execute(dialog, (String) optionData);
075                                return;
076                        }
077                        
078                        
079                        special.optionSelected(optionText, optionData);
080                        if (special.isDone()) {
081                                endSpecial(special.endWithContinue(), special.shouldAbortSalvageAndRemoveEntity());
082                        } else {
083                                if (Global.getSettings().isDevMode()) {
084                                        DevMenuOptions.addOptions(dialog);
085                                }
086                        }
087                }
088                
089                public void endSpecial(boolean withContinue, boolean withAbort) {
090                        if (!special.shouldShowAgain()) {
091                                BaseCommandPlugin.getEntityMemory(memoryMap).unset(MemFlags.SALVAGE_SPECIAL_DATA);
092                        }
093                        
094                        
095                        dialog.setPlugin(originalPlugin);
096                        if (withAbort) {
097                                Misc.fadeAndExpire(dialog.getInteractionTarget(), 1f);
098                                dialog.dismiss();
099                        } else {
100                                if (withContinue) {
101                                        FireBest.fire(null, dialog, memoryMap, "SalvageSpecialFinished");
102                                } else {
103                                        FireBest.fire(null, dialog, memoryMap, "SalvageSpecialFinishedNoContinue");
104                                }
105                        }
106                }
107                
108                public void advance(float amount) {
109                }
110                public void backFromEngagement(EngagementResultAPI battleResult) {
111                }
112                public Object getContext() {
113                        return null;
114                }
115                public Map<String, MemoryAPI> getMemoryMap() {
116                        return memoryMap;
117                }
118                public void optionMousedOver(String optionText, Object optionData) {
119                }
120        }
121        
122        
123        public boolean execute(String ruleId, InteractionDialogAPI dialog, List<Token> params, final Map<String, MemoryAPI> memoryMap) {
124                if (dialog == null) return false;
125                
126                SectorEntityToken entity = dialog.getInteractionTarget();
127                //SalvageEntityGenDataSpec spec = SalvageEntityGeneratorOld.getSalvageSpec(entity.getCustomEntityType());
128                
129                MemoryAPI memory = getEntityMemory(memoryMap);
130//              long seed = memory.getLong(MemFlags.MEMORY_KEY_SALVAGE_SEED);
131//              Random random = Misc.getRandom(seed, 50);
132                
133                //dialog.getTextPanel().addParagraph("Test special interactions");
134
135                
136                final InteractionDialogPlugin originalPlugin = dialog.getPlugin();
137                
138                
139                Object specialData = memory.get(MemFlags.SALVAGE_SPECIAL_DATA);
140                
141//              Class specialClass = dataToSpecialPlugin.get(specialData.getClass());
142//              if (specialClass == null) {
143//                      FireBest.fire(null, dialog, memoryMap, "SalvageSpecialFinishedNoContinue");
144//                      return true;
145//              }
146                SalvageSpecialPlugin special = null;
147                if (specialData instanceof SalvageSpecialData) {
148                        special = ((SalvageSpecialData) specialData).createSpecialPlugin();
149                }
150                
151                if (special == null) {
152                        FireBest.fire(null, dialog, memoryMap, "SalvageSpecialFinishedNoContinue");
153                        return true;
154                }
155
156                
157                //SalvageSpecialPlugin special = new BaseSalvageSpecial();
158                //SalvageSpecialPlugin special = new DomainSurveyDerelictSpecial();
159                //try {
160                        //SalvageSpecialPlugin special = (SalvageSpecialPlugin) specialClass.newInstance();
161                        
162                        //SalvageSpecialDialogPlugin plugin = new SalvageSpecialDialogPlugin(originalPlugin, special, specialData, memoryMap);
163                        SalvageSpecialDialogPlugin plugin = new SalvageSpecialDialogPlugin(originalPlugin, special, specialData, memoryMap);
164                        dialog.setPlugin(plugin);
165                        plugin.init(dialog);
166//              } catch (IllegalAccessException e) {
167//                      throw new RuntimeException(e);
168//              } catch (InstantiationException e) {
169//                      throw new RuntimeException(e);
170//              }
171        
172                return true;
173        }
174
175        
176        
177        
178        
179        
180        
181        
182        
183        
184        
185}
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203