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 RulesAPI rules = Global.getSector().getRules();
73 List<RuleAPI> matches = rules.getAllMatching(ruleId, trigger, dialog, memoryMap);
74 if (matches.isEmpty()) return false;
75
76 List<OptionAdder> options = new ArrayList<OptionAdder>();
77 for (RuleAPI rule : matches) {
78 //options.addAll(rule.getOptions());
79 for (Option option : rule.getOptions()) {
80 if (option.id.startsWith("(dev)") && !Global.getSettings().isDevMode()) continue;
81 options.add(new OptionAdder(option));
82 }
83
84 // this actually doesn't work I think? since rule gets applied regardless
85 // and so the expression gets executed twice
86 for (ExpressionAPI e : rule.getScriptCopy()) {
87 if (e.doesCommandAddOptions()) {
88 options.add(new OptionAdder(e));
89 }
90 }
91 }
92
93 if (!options.isEmpty()) {
94 Collections.sort(options, new Comparator<OptionAdder>() {
95 public int compare(OptionAdder o1, OptionAdder o2) {
96 float diff = o1.getOrder(memoryMap) - o2.getOrder(memoryMap);
97 if (diff < 0) return -1;
98 if (diff > 0) return 1;
99 return 0;
100 }
101 });
102
103 dialog.getOptionPanel().clearOptions();
104 for (OptionAdder option : options) {
105 //dialog.getOptionPanel().addOption(option.text, option.id, null);
106 option.add(ruleId, dialog, params, memoryMap);
107 }
108 if (Global.getSettings().isDevMode()) {
110 }
111 }
112
113 for (RuleAPI rule : matches) {
114 applyRule(rule);
115 }
116
117 return true;
118 }
119
120 private void applyRule(RuleAPI rule) {
121 addText(rule.getId(), rule.pickText());
122 rule.runScript(dialog, memoryMap);
123 }
124
125 private void addText(String ruleId, String text) {
126 if (text == null || text.isEmpty()) return;
127
128 text = Global.getSector().getRules().performTokenReplacement(ruleId, text, dialog.getInteractionTarget(), memoryMap);
129// Map<String, String> tokens = Global.getSector().getRules().getTokenReplacements(ruleId, dialog.getInteractionTarget(), memoryMap);
130// for (String token : tokens.keySet()) {
131// String value = tokens.get(token);
132// text = text.replaceAll("(?s)\\" + token, value);
133// }
134//
135// text = Misc.replaceTokensFromMemory(text, memoryMap);
136
137 dialog.getTextPanel().addParagraph(text);
138 }
139
140
141
142
143
144
145}
static SettingsAPI getSettings()
Definition Global.java:51
static SectorAPI getSector()
Definition Global.java:59
static void addOptions(InteractionDialogAPI dialog)
int getOptionOrder(List< Token > params, 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