1package com.fs.starfarer.api.impl.campaign.rulecmd.missions;
3import java.util.ArrayList;
4import java.util.Collections;
5import java.util.Comparator;
8import java.util.Random;
10import org.lwjgl.input.Keyboard;
12import com.fs.starfarer.api.EveryFrameScript;
13import com.fs.starfarer.api.Global;
14import com.fs.starfarer.api.campaign.InteractionDialogAPI;
15import com.fs.starfarer.api.campaign.InteractionDialogPlugin;
16import com.fs.starfarer.api.campaign.SectorEntityToken;
17import com.fs.starfarer.api.campaign.comm.IntelInfoPlugin;
18import com.fs.starfarer.api.campaign.econ.MarketAPI;
19import com.fs.starfarer.api.campaign.rules.MemKeys;
20import com.fs.starfarer.api.campaign.rules.MemoryAPI;
21import com.fs.starfarer.api.characters.ImportantPeopleAPI;
22import com.fs.starfarer.api.characters.PersonAPI;
23import com.fs.starfarer.api.combat.EngagementResultAPI;
24import com.fs.starfarer.api.impl.campaign.DebugFlags;
25import com.fs.starfarer.api.impl.campaign.DevMenuOptions;
26import com.fs.starfarer.api.impl.campaign.RuleBasedInteractionDialogPluginImpl;
27import com.fs.starfarer.api.impl.campaign.intel.bar.BarEventDialogPlugin;
28import com.fs.starfarer.api.impl.campaign.intel.bar.PortsideBarData;
29import com.fs.starfarer.api.impl.campaign.intel.bar.PortsideBarEvent;
30import com.fs.starfarer.api.impl.campaign.intel.bar.events.BarEventManager;
31import com.fs.starfarer.api.impl.campaign.intel.contacts.ContactIntel;
32import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionBarEventWrapper;
33import com.fs.starfarer.api.impl.campaign.rulecmd.BaseCommandPlugin;
34import com.fs.starfarer.api.impl.campaign.rulecmd.DumpMemory;
35import com.fs.starfarer.api.impl.campaign.rulecmd.FireAll;
36import com.fs.starfarer.api.impl.campaign.rulecmd.FireBest;
37import com.fs.starfarer.api.impl.campaign.rulecmd.ShowDefaultVisual;
38import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.AddBarEvent;
39import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.AddBarEvent.BarEventData;
40import com.fs.starfarer.api.impl.campaign.tutorial.TutorialMissionIntel;
41import com.fs.starfarer.api.util.FaderUtil;
42import com.fs.starfarer.api.util.Misc;
43import com.fs.starfarer.api.util.Misc.Token;
44import com.fs.starfarer.api.util.WeightedRandomPicker;
56 protected InteractionDialogAPI
dialog;
60 public MarketAPI market;
61 public String soundId =
"bar_ambience";
62 public float pitch = 1f;
63 public float volume = 1f;
64 public float musicSuppression = 0.95f;
65 public boolean done =
false;
67 public FaderUtil fader =
new FaderUtil(0f, 0.5f);
68 public BarAmbiencePlayer(MarketAPI market) {
70 if (market.getFaction() !=
null) {
71 soundId = market.getFaction().getBarSound();
75 public void advance(
float amount) {
76 fader.advance(amount);
77 Global.
getSector().getCampaignUI().suppressMusic(fader.getBrightness() * musicSuppression);
83 public boolean isDone() {
86 public boolean runWhilePaused() {
94 public boolean execute(String ruleId, InteractionDialogAPI
dialog, List<Token> params,
final Map<String, MemoryAPI>
memoryMap) {
97 if (
dialog ==
null)
return false;
99 String command = params.get(0).getString(
memoryMap);
100 if (command ==
null)
return false;
103 if (command.equals(
"returnFromEvent")) {
106 mem.unset(
"$BarCMD");
112 dialog.getInteractionTarget().setActivePerson(
null);
118 boolean withContinue = params.size() > 1 && params.get(1).getBoolean(
memoryMap);
122 }
else if (command.equals(
"accept")) {
126 String missionId = params.get(1).getString(
memoryMap);
128 if (w !=
null && w.getMission() !=
null) {
129 BarEventManager.getInstance().notifyWasInteractedWith(w);
133 }
else if (command.equals(
"leaveBar")) {
136 }
else if (command.equals(
"playAmbience")) {
153 if (command.equals(
"showOptions")) {
164 dialog.getVisualPanel().restoreSavedVisual();
165 dialog.getVisualPanel().saveCurrentVisual();
167 PortsideBarData data = PortsideBarData.getInstance();
169 MarketAPI market =
entity.getMarket();
171 dialog.getOptionPanel().clearOptions();
173 Random random =
new Random(BarEventManager.getInstance().getSeed(
entity,
null,
null));
180 WeightedRandomPicker<Integer> numPicker =
new WeightedRandomPicker<Integer>(random);
182 for (
int i = min; i <= max; i++) {
186 int num = numPicker.pick();
196 List<PortsideBarEvent> events =
new ArrayList<PortsideBarEvent>();
197 String key =
"$BarCMD_shownEvents";
198 MemoryAPI mem = market.getMemoryWithoutUpdate();
199 boolean needToSaveShown =
false;
200 if (mem.contains(key)) {
201 List<String> eventIds = (List<String>) mem.get(key);
202 for (String
id : eventIds) {
203 OUTER:
for (PortsideBarEvent event : data.getEvents()) {
209 if (
id.equals(event.getBarEventId())) {
214 num = Math.max(eventIds.size(), num);
216 events.addAll(data.getEvents());
217 Collections.shuffle(events, random);
218 needToSaveShown =
true;
221 boolean addedSomething =
false;
223 AddBarEvent.clearTempEvents(market);
226 List<BarEventData> temp =
new ArrayList<BarEventData>(AddBarEvent.getTempEvents(market).events.values());
227 for (
int i = 0; i < max && i < temp.size(); i++) {
228 BarEventData b = temp.get(i);
229 if (!b.blurb.isEmpty()) {
230 dialog.getTextPanel().addPara(b.blurb);
232 dialog.getOptionPanel().addOption(b.option, b.optionId);
233 if (b.optionColor !=
null) {
234 dialog.setOptionColor(b.optionId, b.optionColor);
236 addedSomething =
true;
239 List<String> shown =
new ArrayList<String>();
244 ip.resetExcludeFromGetPerson();
248 for (IntelInfoPlugin intel :
Global.
getSector().getIntelManager().getIntel(ContactIntel.class)) {
249 ip.excludeFromGetPerson(((ContactIntel)intel).getPerson());
255 Collections.sort(events,
new Comparator<PortsideBarEvent>() {
256 public int compare(PortsideBarEvent o1, PortsideBarEvent o2) {
257 boolean p1 = o1.isAlwaysShow();
258 boolean p2 = o2.isAlwaysShow();
259 if (p1 && !p2)
return -1;
260 if (p2 && !p1)
return 1;
267 for (PortsideBarEvent event : events) {
268 if (TutorialMissionIntel.isTutorialInProgress())
continue;
269 if (curr + temp.size() >= max)
break;
276 if (event.shouldRemoveEvent())
continue;
277 if (!event.shouldShowAtMarket(market))
continue;
280 if (event instanceof HubMissionBarEventWrapper) {
281 HubMissionBarEventWrapper w = (HubMissionBarEventWrapper) event;
282 if (w.getMission() ==
null) {
286 event.wasShownAtMarket(market);
288 if (event.getBarEventId() !=
null) {
289 shown.add(event.getBarEventId());
292 addedSomething =
true;
294 if (!event.isAlwaysShow()) {
297 if (curr >= num)
break;
301 ip.resetExcludeFromGetPerson();
303 if (needToSaveShown) {
306 mem.set(key, shown, time);
310 if (!addedSomething) {
311 dialog.getTextPanel().addPara(
"Nothing of note is going on at the bar.");
313 dialog.getTextPanel().addPara(
"You unobtrusively watch the patrons of the bar for " +
314 "a few minutes before deciding what to do next.");
318 dialog.getOptionPanel().addOption(
"Leave the bar",
"barLeave");
319 dialog.getOptionPanel().setShortcut(
"barLeave", Keyboard.KEY_ESCAPE,
false,
false,
false,
true);
331 if (optionText !=
null) {
333 dialog.addOptionSelectedText(optionData);
344 String optionId =
null;
345 if (optionData instanceof String) {
346 optionId = (String) optionData;
351 if (optionData instanceof PortsideBarEvent) {
352 PortsideBarEvent
event = (PortsideBarEvent) optionData;
353 BarEventDialogPlugin plugin =
new BarEventDialogPlugin(
this,
this, event,
memoryMap);
357 }
else if (
"barLeave".equals(optionData)) {
359 }
else if (
"barContinue".equals(optionData)) {
361 }
else if (optionData instanceof String) {
371 eMem.set(
"$BarCMD",
this, 0f);
374 if (w !=
null && w.getMission() !=
null) {
375 PersonAPI person = w.getMission().getPerson();
376 if (person !=
null) {
377 dialog.getInteractionTarget().setActivePerson(person);
381 dialog.getVisualPanel().showPersonInfo(person,
true);
385 MemoryAPI mem =
memoryMap.get(MemKeys.LOCAL);
387 mem.set(
"$option", (String) optionData, 0f);
398 dialog.getOptionPanel().clearOptions();
399 dialog.getOptionPanel().addOption(
"Continue",
"barContinue");
406 PortsideBarData data = PortsideBarData.getInstance();
407 for (PortsideBarEvent event : data.getEvents()) {
408 if (event instanceof HubMissionBarEventWrapper) {
409 HubMissionBarEventWrapper w = (HubMissionBarEventWrapper) event;
410 if (w.getMission() ==
null)
continue;
411 if (optionId !=
null && optionId.startsWith(w.getMission().getTriggerPrefix())) {
419 PortsideBarData data = PortsideBarData.getInstance();
420 for (PortsideBarEvent event : data.getEvents()) {
421 if (event instanceof HubMissionBarEventWrapper) {
422 HubMissionBarEventWrapper w = (HubMissionBarEventWrapper) event;
423 if (w.getMission() ==
null)
continue;
424 if (optionId ==
null || !optionId.startsWith(w.getMission().getTriggerPrefix())) {
434 if (script instanceof BarAmbiencePlayer) {
435 return (BarAmbiencePlayer) script;
444 if (player !=
null) {
static SettingsAPI getSettings()
static SoundPlayerAPI getSoundPlayer()
static SectorAPI getSector()
static MemoryAPI getEntityMemory(Map< String, MemoryAPI > memoryMap)
boolean execute(String ruleId, InteractionDialogAPI dialog, List< Token > params, Map< String, MemoryAPI > memoryMap)
static final String OPTION_ID
static boolean fire(String ruleId, InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap, String params)
static boolean fire(String ruleId, InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap, String params)
boolean execute(String ruleId, InteractionDialogAPI dialog, List< Token > params, Map< String, MemoryAPI > memoryMap)
void returningFromEvent(boolean withContinue)
void abortMissions(String optionId)
void optionSelected(String optionText, Object optionData)
void showOptions(boolean returningFromEvent)
void backFromEngagement(EngagementResultAPI battleResult)
static float BAR_EVENT_MIN_TIME_BEFORE_CHANGING
Map< String, MemoryAPI > memoryMap
static BarAmbiencePlayer getAmbiencePlayer()
Map< String, MemoryAPI > getMemoryMap()
HubMissionBarEventWrapper getWrapperFor(String optionId)
void returningFromEvent(PortsideBarEvent event)
InteractionDialogPlugin originalPlugin
void advance(float amount)
static float BAR_EVENT_MAX_TIME_BEFORE_CHANGING
boolean execute(String ruleId, InteractionDialogAPI dialog, List< Token > params, final Map< String, MemoryAPI > memoryMap)
void init(InteractionDialogAPI dialog)
void optionMousedOver(String optionText, Object optionData)
InteractionDialogAPI dialog
float getFloat(String key)
void playUILoop(String id, float pitch, float volume)