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