001package com.fs.starfarer.api.impl.campaign.rulecmd;
002
003import java.util.ArrayList;
004import java.util.Collections;
005import java.util.Comparator;
006import java.util.List;
007import java.util.Map;
008
009import com.fs.starfarer.api.Global;
010import com.fs.starfarer.api.campaign.InteractionDialogAPI;
011import com.fs.starfarer.api.campaign.rules.ExpressionAPI;
012import com.fs.starfarer.api.campaign.rules.MemoryAPI;
013import com.fs.starfarer.api.campaign.rules.Option;
014import com.fs.starfarer.api.campaign.rules.RuleAPI;
015import com.fs.starfarer.api.campaign.rules.RulesAPI;
016import com.fs.starfarer.api.impl.campaign.DevMenuOptions;
017import com.fs.starfarer.api.impl.campaign.rulecmd.FireAll.OptionAdder;
018import com.fs.starfarer.api.util.Misc;
019import com.fs.starfarer.api.util.Misc.Token;
020import com.fs.starfarer.api.util.Misc.VarAndMemory;
021
022public class FireBest extends BaseCommandPlugin {
023
024
025        protected InteractionDialogAPI dialog;
026        protected Map<String, MemoryAPI> memoryMap;
027        protected List<Token> params;
028        protected String ruleId;
029        protected boolean keepOptions = false;
030
031        public boolean execute(String ruleId, InteractionDialogAPI dialog, List<Token> params, Map<String, MemoryAPI> memoryMap) {
032                
033                this.ruleId = ruleId;
034                this.dialog = dialog;
035                this.params = params;
036                this.memoryMap = memoryMap;
037                String trigger = params.get(0).string;
038                if (params.get(0).isVariable()) {
039                        VarAndMemory var = params.get(0).getVarNameAndMemory(memoryMap);
040                        trigger = var.memory.getString(var.name);
041                }
042                if (params.size() > 1) {
043                        keepOptions = params.get(1).getBoolean(memoryMap);
044                }
045                
046                RulesAPI rules = Global.getSector().getRules();
047                RuleAPI rule = rules.getBestMatching(ruleId, trigger, dialog, memoryMap);
048                
049                if (rule == null) return false;
050                
051                applyRule(rule);
052                
053                return true;
054        }
055        
056        public static boolean fire(String ruleId, InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap, String params) {
057                return new FireBest().execute(ruleId, dialog, Misc.tokenize(params), memoryMap);
058        }
059        
060        private void applyRule(RuleAPI rule) {
061//              if (!rule.getOptions().isEmpty()) {
062//                      dialog.getOptionPanel().clearOptions();
063//                      for (Option option : rule.getOptions()) {
064//                              dialog.getOptionPanel().addOption(option.text, option.id, null);
065//                      }
066//                      if (Global.getSettings().isDevMode()) {
067//                              DumpMemory.addOption(dialog);
068//                      }
069//              }
070                
071                List<OptionAdder> options = new ArrayList<OptionAdder>();
072                for (Option option : rule.getOptions()) {
073                        if (option.id.startsWith("(dev)") && !Global.getSettings().isDevMode()) continue;
074                        options.add(new OptionAdder(option));
075                }
076                for (ExpressionAPI e : rule.getScriptCopy()) {
077                        if (e.doesCommandAddOptions()) {
078                                options.add(new OptionAdder(e));
079                        }
080                }
081                
082                if (!options.isEmpty()) {
083                        Collections.sort(options, new Comparator<OptionAdder>() {
084                                public int compare(OptionAdder o1, OptionAdder o2) {
085                                        float diff = o1.getOrder(memoryMap) - o2.getOrder(memoryMap);
086                                        if (diff < 0) return -1;
087                                        if (diff > 0) return 1;
088                                        return 0;
089                                }
090                        });
091                        
092                        if (!keepOptions) {
093                                dialog.getOptionPanel().clearOptions();
094                        }
095                        for (OptionAdder option : options) {
096                                option.add(ruleId, dialog, params, memoryMap);
097                        }
098                        if (!keepOptions) {
099                                if (Global.getSettings().isDevMode()) {
100                                        DevMenuOptions.addOptions(dialog);
101                                }
102                        }
103                }               
104                
105                addText(rule.getId(), rule.pickText());
106                rule.runScript(dialog, memoryMap);
107        }
108        
109        private void addText(String ruleId, String text) {
110                if (text == null || text.isEmpty()) return;
111
112                
113                text = Global.getSector().getRules().performTokenReplacement(ruleId, text, dialog.getInteractionTarget(), memoryMap);
114//              Map<String, String> tokens = Global.getSector().getRules().getTokenReplacements(ruleId, dialog.getInteractionTarget(), memoryMap);
115//              for (String token : tokens.keySet()) {
116//                      String value = tokens.get(token);
117//                      text = text.replaceAll("(?s)\\" + token, value);
118//              }
119//              
120//              text = Misc.replaceTokensFromMemory(text, memoryMap);
121                
122                dialog.getTextPanel().addParagraph(text);
123        }
124}
125
126
127
128