001package com.fs.starfarer.api.impl.campaign.missions;
002
003import java.awt.Color;
004import java.util.List;
005import java.util.Map;
006
007import com.fs.starfarer.api.EveryFrameScript;
008import com.fs.starfarer.api.Global;
009import com.fs.starfarer.api.campaign.InteractionDialogAPI;
010import com.fs.starfarer.api.campaign.TextPanelAPI;
011import com.fs.starfarer.api.campaign.econ.MarketAPI;
012import com.fs.starfarer.api.campaign.rules.MemoryAPI;
013import com.fs.starfarer.api.characters.PersonAPI;
014import com.fs.starfarer.api.impl.campaign.eventide.DuelDialogDelegate;
015import com.fs.starfarer.api.impl.campaign.eventide.DuelPanel;
016import com.fs.starfarer.api.impl.campaign.ids.People;
017import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithSearch;
018import com.fs.starfarer.api.ui.TooltipMakerAPI;
019import com.fs.starfarer.api.util.Misc;
020import com.fs.starfarer.api.util.Misc.Token;
021
022public class SwordOfEventide extends HubMissionWithSearch {
023
024//      public void init(CustomPanelAPI panel, DialogCallbacks callbacks) {
025//              this.callbacks = callbacks;
026//              callbacks.getPanelFader().setDurationOut(2f);
027//              duelPanel.init(panel, callbacks, dialog);
028//              if (musicId != null && !musicId.isEmpty()) {
029//                      Global.getSoundPlayer().setSuspendDefaultMusicPlayback(true);
030//                      Global.getSoundPlayer().playCustomMusic(1, 1, musicId);
031//              } else {
032//                      Global.getSoundPlayer().pauseMusic();
033//                      Global.getSoundPlayer().setSuspendDefaultMusicPlayback(true);
034//              }
035//      }
036//      public void reportDismissed(int option) {
037//              Global.getSoundPlayer().setSuspendDefaultMusicPlayback(false);
038//              Global.getSoundPlayer().restartCurrentMusic();
039                
040        public static String SOE_MUSIC_STATE = "$soe_musicState";
041        public static String SOE_STATE_PARTY = "party";
042        public static String SOE_STATE_PRE_DUEL = "pre_duel";
043        public static String SOE_STATE_DUEL = "duel";
044        public static String SOE_STATE_POST_DUEL = "post_duel";
045        
046        public static String PARTY_CHATTER = "soe_party_chatter";
047        public static String PARTY_MUSIC = "music_soe_party";
048        public static String DUEL_MUSIC = "music_soe_fight";
049        
050        public static class SOEMusicPlayer implements EveryFrameScript {
051                public boolean done = false;
052                public String currState = null;
053                
054                public SOEMusicPlayer() {
055                }
056                public void advance(float amount) {
057                        String state = Global.getSector().getMemoryWithoutUpdate().getString(SOE_MUSIC_STATE);
058                        if (state != null && !state.equals(currState)) {
059                                if (SOE_STATE_PARTY.equals(state)) {
060                                        Global.getSoundPlayer().setSuspendDefaultMusicPlayback(true);
061                                        Global.getSoundPlayer().playCustomMusic(1, 1, PARTY_MUSIC, true);
062                                } else if (SOE_STATE_PRE_DUEL.equals(state)) {
063                                        Global.getSoundPlayer().setSuspendDefaultMusicPlayback(true);
064                                        Global.getSoundPlayer().pauseCustomMusic();
065                                } else if (SOE_STATE_DUEL.equals(state)) {
066                                        Global.getSoundPlayer().setSuspendDefaultMusicPlayback(true);
067                                        Global.getSoundPlayer().playCustomMusic(1, 1, DUEL_MUSIC, true);
068                                } else if (SOE_STATE_POST_DUEL.equals(state)) {
069                                        Global.getSoundPlayer().setSuspendDefaultMusicPlayback(true);
070                                        Global.getSoundPlayer().pauseCustomMusic();
071                                }
072                                currState = state;
073                        }
074                        
075                        if (SOE_STATE_PARTY.equals(state)) {
076                                Global.getSoundPlayer().playUILoop(PARTY_CHATTER, 1f, 1f);
077                        } else if (SOE_STATE_PRE_DUEL.equals(state)) {
078                                Global.getSoundPlayer().playUILoop(PARTY_CHATTER, 1f, 0.5f);
079                        }
080                        
081                        if (!Global.getSector().isPaused()) {
082                                stop();
083                        }
084                }
085                public boolean isDone() {
086                        return done;
087                }
088                public boolean runWhilePaused() {
089                        return true;
090                }
091                public void stop() {
092                        done = true;
093                        Global.getSoundPlayer().setSuspendDefaultMusicPlayback(false);
094                        Global.getSoundPlayer().restartCurrentMusic();
095                }
096        }
097        
098        
099        public static enum Stage {
100                GO_TO_EVENTIDE,
101                COMPLETED,
102        }
103        
104        protected PersonAPI neriene_rao; // neriene rao
105        protected PersonAPI caspian_sang; // caspian sang
106        protected PersonAPI orcus_rao; // orcus rao
107        
108        protected MarketAPI eventide;
109        //protected MarketAPI chicomoztoc;
110        
111        public static float MISSION_DAYS = 120f;
112        
113        @Override
114        protected boolean create(MarketAPI createdAt, boolean barEvent) {
115                // if already accepted by the player, abort
116                if (!setGlobalReference("$soe_ref","$soe_inProgress")) {
117                        return false;
118                }
119                
120                neriene_rao = getImportantPerson(People.NERIENE_RAO);
121                if (neriene_rao == null) return false;
122                caspian_sang = getImportantPerson(People.CASPIAN);
123                if (caspian_sang == null) return false;
124                orcus_rao = getImportantPerson(People.RAO);
125                if (orcus_rao == null) return false;
126                
127                eventide = Global.getSector().getEconomy().getMarket("eventide");
128                if (eventide == null) return false;
129                
130                setStartingStage(Stage.GO_TO_EVENTIDE);
131                addSuccessStages(Stage.COMPLETED);
132                
133                setStoryMission();
134                
135                makeImportant(eventide, "$soe_invitedToBall", Stage.GO_TO_EVENTIDE);
136                //setStageOnMemoryFlag(Stage.COMPLETED, baird.getMarket(), "$gaTTB_completed");
137                
138                setStageOnGlobalFlag(Stage.COMPLETED, "$soe_completed");
139                
140                setRepFactionChangesNone();
141                setRepPersonChangesNone();
142                
143                beginStageTrigger(Stage.GO_TO_EVENTIDE);
144                triggerSetGlobalMemoryValuePermanent("$didEventideRaoBall", true);
145                endTrigger();
146                
147                return true;
148        }
149        
150        protected void updateInteractionDataImpl() {
151        
152        }
153
154        protected SOEMusicPlayer player = null;
155        @Override
156        protected boolean callAction(String action, String ruleId, final InteractionDialogAPI dialog,
157                                                                 List<Token> params, final Map<String, MemoryAPI> memoryMap) {
158                if ("THEDUEL".equals(action)) {
159                        TextPanelAPI text = dialog.getTextPanel();
160//                      text.setFontOrbitronUnnecessarilyLarge();
161//                      Color color = Misc.getBasePlayerColor();
162//                      color = Global.getSector().getFaction(Factions.HEGEMONY).getBaseUIColor();
163//                      text.addPara("THE DUEL", color);
164//                      text.setFontInsignia();
165                        text.addImage("misc", "THEDUEL");
166                        return true;
167                } else if ("addMusicPlayer".equals(action)) {
168                        if (!Global.getSector().hasTransientScript(SOEMusicPlayer.class)) {
169                                player = new SOEMusicPlayer();
170                                Global.getSector().addTransientScript(player);
171                                Global.getSector().getMemoryWithoutUpdate().set(SOE_MUSIC_STATE, SOE_STATE_PARTY);
172                        }
173                        return true;
174                } else if ("cleanUpMusicPlayer".equals(action)) {
175                        if (player != null) {
176                                player.stop();;
177                        }
178                        return true;
179                } else if ("crowdGasp".equals(action)) {
180                        Global.getSoundPlayer().playUISound("soe_crowd_gasp", 1f, 1f);
181                        Global.getSector().getMemoryWithoutUpdate().set(SOE_MUSIC_STATE, SOE_STATE_PRE_DUEL);
182                        return true;
183                } else if ("postDuel".equals(action)) {
184                        Global.getSector().getMemoryWithoutUpdate().set(SOE_MUSIC_STATE, SOE_STATE_POST_DUEL);
185                        return true;
186                } else if ("beginDuel".equals(action)) {
187                        Global.getSector().getMemoryWithoutUpdate().set(SOE_MUSIC_STATE, SOE_STATE_DUEL);
188                        
189                        boolean playerSkilled = false;
190                        if (params.size() >= 2) {
191                                playerSkilled = params.get(1).getBoolean(memoryMap);
192                        }
193                        final DuelPanel duelPanel = DuelPanel.createDefault(playerSkilled, true, "soe_ambience");
194                        dialog.showCustomVisualDialog(1024, 700, new DuelDialogDelegate(null, duelPanel, dialog, memoryMap, false));
195                        return true;
196                } else if ("beginTutorial".equals(action)) {
197                        boolean playerSkilled = false;
198                        if (params.size() >= 2) {
199                                playerSkilled = params.get(1).getBoolean(memoryMap);
200                        }
201                        final DuelPanel duelPanel = DuelPanel.createTutorial(playerSkilled, "soe_ambience");
202                        dialog.showCustomVisualDialog(1024, 700, new DuelDialogDelegate(null, duelPanel, dialog, memoryMap, true));
203                        return true;
204                }
205                return super.callAction(action, ruleId, dialog, params, memoryMap);
206        }
207
208        @Override
209        public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) {
210                float opad = 10f;
211                Color h = Misc.getHighlightColor();
212                if (currentStage == Stage.GO_TO_EVENTIDE) {
213                        info.addPara("Go to Eventide in the Samarra system.", opad);
214                }
215        }
216
217        @Override
218        public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) {
219                Color h = Misc.getHighlightColor();
220                if (currentStage == Stage.GO_TO_EVENTIDE) {
221                        info.addPara("Go to Eventide in the Samarra system", tc, pad);
222                        return true;
223                }
224                return false;
225        }
226
227        @Override
228        public String getBaseName() {
229                return "Princess of Persea";
230        }
231
232        @Override
233        public String getPostfixForState() {
234                if (startingStage != null) {
235                        return "";
236                }
237                return super.getPostfixForState();
238        }
239}
240
241
242
243
244