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) {
85
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();
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
114 indicator.getContainingLocation().removeEntity(indicator);
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
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:49
static FactoryAPI getFactory()
Definition Global.java:41
static SectorAPI getSector()
Definition Global.java:65
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)
List< CampaignFleetAPI > getSnapshotSideFor(CampaignFleetAPI participantOrCombined)
void setInteractionTarget(SectorEntityToken target)
boolean showInteractionDialog(InteractionDialogPlugin plugin, SectorEntityToken interactionTarget)
void addEntity(SectorEntityToken entity)
void removeEntity(SectorEntityToken entity)
void addScript(EveryFrameScript script)
void removeScript(EveryFrameScript script)
void expire(String key, float days)
void set(String key, Object value)