Starsector API
Loading...
Searching...
No Matches
Wait.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.rulecmd;
2
3import java.util.List;
4import java.util.Map;
5
6import org.lwjgl.util.vector.Vector2f;
7
8import com.fs.starfarer.api.EveryFrameScript;
9import com.fs.starfarer.api.Global;
10import com.fs.starfarer.api.Script;
11import com.fs.starfarer.api.campaign.BaseCampaignEventListenerAndScript;
12import com.fs.starfarer.api.campaign.BattleAPI;
13import com.fs.starfarer.api.campaign.CampaignClockAPI;
14import com.fs.starfarer.api.campaign.CampaignFleetAPI;
15import com.fs.starfarer.api.campaign.CampaignProgressIndicatorAPI;
16import com.fs.starfarer.api.campaign.InteractionDialogAPI;
17import com.fs.starfarer.api.campaign.SectorEntityToken;
18import com.fs.starfarer.api.campaign.rules.MemoryAPI;
19import com.fs.starfarer.api.impl.campaign.LeashScript;
20import com.fs.starfarer.api.util.RuleException;
21import com.fs.starfarer.api.util.Misc.Token;
22import com.fs.starfarer.api.util.Misc.VarAndMemory;
23
24
25public class Wait extends BaseCommandPlugin {
26 private EveryFrameScript waitScript;
27 private LeashScript leash;
28 private CampaignProgressIndicatorAPI indicator;
29 private VarAndMemory handle;
30 private VarAndMemory finished;
31 private VarAndMemory interrupted;
32 private VarAndMemory inProgress;
33
34 //Wait $handle duration $finished $interrupted $inProgress $text
35 public boolean execute(String ruleId, InteractionDialogAPI dialog, List<Token> params, Map<String, MemoryAPI> memoryMap) {
36 if (params.size() != 6) {
37 throw new RuleException("Wait usage: Wait $handle duration $finished $interrupted $inProgress <text>");
38 }
39
40 handle = params.get(0).getVarNameAndMemory(memoryMap);
41 final float durationDays = Float.parseFloat(params.get(1).string);
42 finished = params.get(2).getVarNameAndMemory(memoryMap);
43 interrupted = params.get(3).getVarNameAndMemory(memoryMap);
44 inProgress = params.get(4).getVarNameAndMemory(memoryMap);
45
46 String text = "Waiting";
47 if (params.size() >= 5) {
48 text = params.get(5).getString(memoryMap);
49 }
50
51 //Global.getSoundPlayer().playUISound("ui_wait_start", 1, 1);
52
53 final SectorEntityToken target = dialog.getInteractionTarget();
54
55 final CampaignFleetAPI playerFleet = Global.getSector().getPlayerFleet();
56 playerFleet.setInteractionTarget(null);
57 Vector2f offset = Vector2f.sub(playerFleet.getLocation(), target.getLocation(), new Vector2f());
58// float dir = Misc.getAngleInDegrees(offset);
59// offset = Misc.getUnitVectorAtDegreeAngle(dir)
60 float len = offset.length();
61 float radSum = playerFleet.getRadius() + target.getRadius() - 1f;
62 if (len > 0) {
63 offset.scale(radSum / len);
64 } else {
65 offset.set(radSum, 0);
66 }
67
68 indicator = Global.getFactory().createProgressIndicator(text, target, durationDays);
69 target.getContainingLocation().addEntity(indicator);
70
71
72 waitScript = new BaseCampaignEventListenerAndScript(durationDays + 0.1f) {
73 private float elapsedDays = 0f;
74 private boolean done = false;
75 private boolean battleOccured = false;
76 private boolean interactedWithSomethingElse = false;
77 public boolean runWhilePaused() {
78 return false;
79 }
80 public boolean isDone() {
81 return done;
82 }
83 public void advance(float amount) {
84 CampaignClockAPI clock = Global.getSector().getClock();
85
86 Global.getSector().getCampaignUI().setDisallowPlayerInteractionsForOneFrame();
87
88 float days = clock.convertToDays(amount);
89 elapsedDays += days;
90
91 inProgress.memory.set(inProgress.name, true);
92 inProgress.memory.expire(inProgress.name, 0.1f);
93
94// float sinceLastBattle = clock.getElapsedDaysSince(Global.getSector().getLastPlayerBattleTimestamp());
95// if (sinceLastBattle <= elapsedDays) {
96 if (battleOccured || interactedWithSomethingElse) {
97 done = true;
98 interrupted.memory.set(interrupted.name, true);
99 interrupted.memory.expire(interrupted.name, 2f);
100 handle.memory.unset(handle.name);
101 indicator.interrupt();
102 Global.getSector().removeScript(leash);
103
104 Global.getSoundPlayer().playUISound("ui_wait_interrupt", 1, 1);
105 } else if (elapsedDays >= durationDays && !Global.getSector().getCampaignUI().isShowingDialog()) {
106 done = true;
107 finished.memory.set(finished.name, true);
108 finished.memory.expire(finished.name, 0f);
109
110 inProgress.memory.unset(inProgress.name);
111 handle.memory.unset(handle.name);
112
113 Global.getSector().removeScript(leash);
114 indicator.getContainingLocation().removeEntity(indicator);
115 Global.getSector().getCampaignUI().showInteractionDialog(target);
116 Global.getSoundPlayer().playUISound("ui_wait_finish", 1, 1);
117 }
118 }
119 @Override
120 public void reportBattleOccurred(CampaignFleetAPI primaryWinner, BattleAPI battle) {
121 if (battle.getSnapshotSideFor(playerFleet) != null ||
122 (target instanceof CampaignFleetAPI && battle.getSnapshotSideFor((CampaignFleetAPI)target) != null)) {
123 battleOccured = true;
124 }
125 }
126 @Override
127 public void reportShownInteractionDialog(InteractionDialogAPI dialog) {
128 interactedWithSomethingElse |= dialog.getInteractionTarget() != target;
129 }
130 @Override
131 public void reportFleetDespawned(CampaignFleetAPI fleet, FleetDespawnReason reason, Object param) {
132 if (fleet == playerFleet || fleet == target) {
133 battleOccured = true;
134 }
135 }
136
137 };
138
139 leash = new LeashScript(playerFleet, 50, target, offset, new Script() {
140 public void run() {
141 interrupted.memory.set(interrupted.name, true);
142 interrupted.memory.expire(interrupted.name, 2f);
143// memory.set(keyInterrupted, true);
144// memory.expire(keyInterrupted, 2f);
145 //indicator.getContainingLocation().removeEntity(indicator);
146 handle.memory.unset(handle.name);
147 indicator.interrupt();
148 Global.getSector().removeScript(waitScript);
149 Global.getSoundPlayer().playUISound("ui_wait_interrupt", 1, 1);
150 }
151 });
152 Global.getSector().addScript(leash);
153
154 handle.memory.set(handle.name, this);
155
156 Global.getSector().addScript(waitScript);
157
158 Global.getSector().setPaused(false);
159 dialog.dismiss();
160
161 return true;
162 }
163
165 return waitScript;
166 }
167
169 return leash;
170 }
171
172 public CampaignProgressIndicatorAPI getIndicator() {
173 return indicator;
174 }
175
176 public VarAndMemory getHandle() {
177 return handle;
178 }
179
180 public VarAndMemory getFinished() {
181 return finished;
182 }
183
184 public VarAndMemory getInProgress() {
185 return inProgress;
186 }
187
188 public VarAndMemory getInterrupted() {
189 return interrupted;
190 }
191
192}
193
194
195
196
static SoundPlayerAPI getSoundPlayer()
Definition Global.java:43
static FactoryAPI getFactory()
Definition Global.java:35
static SectorAPI getSector()
Definition Global.java:59
CampaignProgressIndicatorAPI getIndicator()
Definition Wait.java:172
boolean execute(String ruleId, InteractionDialogAPI dialog, List< Token > params, Map< String, MemoryAPI > memoryMap)
Definition Wait.java:35
CampaignProgressIndicatorAPI createProgressIndicator(String text, SectorEntityToken target, float durationDays)
SoundAPI playUISound(String id, float pitch, float volume)