Starsector API
Loading...
Searching...
No Matches
FireAll.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.rulecmd;
2
3import java.util.ArrayList;
4import java.util.Collections;
5import java.util.Comparator;
6import java.util.List;
7import java.util.Map;
8
9import com.fs.starfarer.api.Global;
10import com.fs.starfarer.api.campaign.InteractionDialogAPI;
11import com.fs.starfarer.api.campaign.rules.ExpressionAPI;
12import com.fs.starfarer.api.campaign.rules.MemoryAPI;
13import com.fs.starfarer.api.campaign.rules.Option;
14import com.fs.starfarer.api.campaign.rules.RuleAPI;
15import com.fs.starfarer.api.campaign.rules.RulesAPI;
16import com.fs.starfarer.api.impl.campaign.DevMenuOptions;
17import com.fs.starfarer.api.util.Misc;
18import com.fs.starfarer.api.util.Misc.Token;
19import com.fs.starfarer.api.util.Misc.VarAndMemory;
20
21public class FireAll extends BaseCommandPlugin {
22
23 public static class OptionAdder {
24 private Option option;
25 private ExpressionAPI expression;
26 public OptionAdder(ExpressionAPI expression) {
27 this.expression = expression;
28 }
29 public OptionAdder(Option option) {
30 this.option = option;
31 }
32
33 public int getOrder(Map<String, MemoryAPI> memoryMap) {
34 if (option != null) {
35 return (int) option.order;
36 }
37 if (expression != null) {
38 return expression.getOptionOrder(memoryMap);
39 }
40 return 0;
41 }
42
43 public void add(String ruleId, InteractionDialogAPI dialog, List<Token> params, Map<String, MemoryAPI> memoryMap) {
44 if (option != null) {
45 //String text = Misc.replaceTokensFromMemory(option.text, memoryMap);
46 String text = Global.getSector().getRules().performTokenReplacement(ruleId, option.text, dialog.getInteractionTarget(), memoryMap);
47
48 dialog.getOptionPanel().addOption(text, option.id, null);
49 } else if (expression != null) {
50 expression.execute(ruleId, dialog, memoryMap);
51 }
52 }
53 }
54
55 public static boolean fire(String ruleId, InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap, String params) {
56 return new FireAll().execute(ruleId, dialog, Misc.tokenize(params), memoryMap);
57 }
58
59 private InteractionDialogAPI dialog;
60 private Map<String, MemoryAPI> memoryMap;
61
62 public boolean execute(String ruleId, InteractionDialogAPI dialog, List<Token> params, final Map<String, MemoryAPI> memoryMap) {
63
64 this.dialog = dialog;
65 this.memoryMap = memoryMap;
66 String trigger = params.get(0).string;
67 if (params.get(0).isVariable()) {
68 VarAndMemory var = params.get(0).getVarNameAndMemory(memoryMap);
69 trigger = var.memory.getString(var.name);
70 }
71
72
73 MemoryAPI mem = getEntityMemory(memoryMap);
74 mem.set("$fireAllTrigger", trigger, 0);
75 boolean intercepted = FireBest.fire(null, dialog, memoryMap, "FireAllIntercept");
76 if (intercepted) {
77 return true; // we did *something*, so: return true
78 }
79
80
82 List<RuleAPI> matches = rules.getAllMatching(ruleId, trigger, dialog, memoryMap);
83 if (matches.isEmpty()) return false;
84
85 List<OptionAdder> options = new ArrayList<OptionAdder>();
86 for (RuleAPI rule : matches) {
87 //options.addAll(rule.getOptions());
88 for (Option option : rule.getOptions()) {
89 if (option.id.startsWith("(dev)") && !Global.getSettings().isDevMode()) continue;
90 options.add(new OptionAdder(option));
91 }
92
93 // this actually doesn't work I think? since rule gets applied regardless
94 // and so the expression gets executed twice
95 for (ExpressionAPI e : rule.getScriptCopy()) {
96 if (e.doesCommandAddOptions()) {
97 options.add(new OptionAdder(e));
98 }
99 }
100 }
101
102 if (!options.isEmpty()) {
103 Collections.sort(options, new Comparator<OptionAdder>() {
104 public int compare(OptionAdder o1, OptionAdder o2) {
105 float diff = o1.getOrder(memoryMap) - o2.getOrder(memoryMap);
106 if (diff < 0) return -1;
107 if (diff > 0) return 1;
108 return 0;
109 }
110 });
111
112 dialog.getOptionPanel().clearOptions();
113 for (OptionAdder option : options) {
114 //dialog.getOptionPanel().addOption(option.text, option.id, null);
115 option.add(ruleId, dialog, params, memoryMap);
116 }
117 if (Global.getSettings().isDevMode()) {
119 }
120 }
121
122 for (RuleAPI rule : matches) {
123 applyRule(rule);
124 }
125
126 return true;
127 }
128
129 private void applyRule(RuleAPI rule) {
130 addText(rule.getId(), rule.pickText());
131 rule.runScript(dialog, memoryMap);
132 }
133
134 private void addText(String ruleId, String text) {
135 if (text == null || text.isEmpty()) return;
136
137 text = Global.getSector().getRules().performTokenReplacement(ruleId, text, dialog.getInteractionTarget(), memoryMap);
138// Map<String, String> tokens = Global.getSector().getRules().getTokenReplacements(ruleId, dialog.getInteractionTarget(), memoryMap);
139// for (String token : tokens.keySet()) {
140// String value = tokens.get(token);
141// text = text.replaceAll("(?s)\\" + token, value);
142// }
143//
144// text = Misc.replaceTokensFromMemory(text, memoryMap);
145
146 dialog.getTextPanel().addParagraph(text);
147 }
148
149
150
151
152
153
154}
static SettingsAPI getSettings()
Definition Global.java:57
static SectorAPI getSector()
Definition Global.java:65
static void addOptions(InteractionDialogAPI dialog)
static MemoryAPI getEntityMemory(Map< String, MemoryAPI > memoryMap)
static boolean fire(String ruleId, InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap, String params)
Definition FireAll.java:55
boolean execute(String ruleId, InteractionDialogAPI dialog, List< Token > params, final Map< String, MemoryAPI > memoryMap)
Definition FireAll.java:62
static boolean fire(String ruleId, InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap, String params)
Definition FireBest.java:56
static List< Token > tokenize(String string)
Definition Misc.java:425
void addOption(String text, Object data)
int getOptionOrder(Map< String, MemoryAPI > memoryMap)
Object execute(String ruleId, InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap)
void set(String key, Object value)
void runScript(InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap)
String performTokenReplacement(String ruleId, String text, SectorEntityToken entity, Map< String, MemoryAPI > memoryMap)
List< RuleAPI > getAllMatching(String currentRule, String trigger, InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap)