001package com.fs.starfarer.api.impl.campaign;
002
003import java.util.Map;
004
005import com.fs.starfarer.api.Global;
006import com.fs.starfarer.api.campaign.CampaignFleetAPI;
007import com.fs.starfarer.api.campaign.InteractionDialogAPI;
008import com.fs.starfarer.api.campaign.InteractionDialogPlugin;
009import com.fs.starfarer.api.campaign.OptionPanelAPI;
010import com.fs.starfarer.api.campaign.TextPanelAPI;
011import com.fs.starfarer.api.campaign.VisualPanelAPI;
012import com.fs.starfarer.api.campaign.rules.MemoryAPI;
013import com.fs.starfarer.api.characters.OfficerDataAPI;
014import com.fs.starfarer.api.combat.EngagementResultAPI;
015import com.fs.starfarer.api.fleet.FleetMemberAPI;
016import com.fs.starfarer.api.impl.campaign.fleets.FleetFactoryV3;
017import com.fs.starfarer.api.impl.campaign.ids.Abilities;
018import com.fs.starfarer.api.impl.campaign.ids.Factions;
019import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
020import com.fs.starfarer.api.impl.campaign.shared.PersonBountyEventData;
021import com.fs.starfarer.api.impl.campaign.shared.SharedData;
022import com.fs.starfarer.api.util.Misc;
023
024public class StandardRespawnDialogPluginImpl implements InteractionDialogPlugin {
025
026        public static enum OptionId {
027                INIT,
028                RESPAWN,
029                ;
030        }
031        
032        protected InteractionDialogAPI dialog;
033        protected TextPanelAPI textPanel;
034        protected OptionPanelAPI options;
035        protected VisualPanelAPI visual;
036        
037        protected CampaignFleetAPI playerFleet;
038        
039        public void init(InteractionDialogAPI dialog) {
040                this.dialog = dialog;
041                textPanel = dialog.getTextPanel();
042                options = dialog.getOptionPanel();
043                visual = dialog.getVisualPanel();
044
045                playerFleet = Global.getSector().getPlayerFleet();
046                
047                visual.showImagePortion("illustrations", "space_wreckage", 640, 400, 0, 0, 480, 300);
048                
049                optionSelected(null, OptionId.INIT);
050        }
051        
052        public Map<String, MemoryAPI> getMemoryMap() {
053                return null;
054        }
055        
056        public void backFromEngagement(EngagementResultAPI result) {
057                // no combat here, so this won't get called
058        }
059        
060        public void optionSelected(String text, Object optionData) {
061                if (optionData == null) return;
062                
063                OptionId option = (OptionId) optionData;
064                
065                if (text != null) {
066                        //textPanel.addParagraph(text, Global.getSettings().getColor("buttonText"));
067                        dialog.addOptionSelectedText(option);
068                }
069                
070                switch (option) {
071                case INIT:
072                        textPanel.addParagraph("Your fleet has been defeated!");
073                        
074                        textPanel.addParagraph("Normally, if this happens you and your remaining crew will " +
075                                        "spend some time \"behind the scenes\" assembling a smaller fleet of recovered " +
076                                        "ships.");
077        
078                        textPanel.addParagraph("During the course of this tutorial, the only available option is to reload the last save.");
079                        
080                        options.clearOptions();
081                        options.addOption("Continue", OptionId.RESPAWN, null);
082                        break;
083                case RESPAWN:
084                        
085                        createPlayerFleet();
086                        
087                        dialog.dismiss();
088                        Global.getSector().getCampaignUI().quickLoad();
089                        break;
090                }
091        }
092        
093
094        protected void createPlayerFleet() {
095
096                float fp = 10;
097                float crew = 50;
098                
099                float daysSince = Global.getSector().getClock().getElapsedDaysSince(SharedData.getData().getPlayerLosingBattleTimestamp());
100                if (daysSince < 2) {
101                        fp = SharedData.getData().getPlayerPreLosingBattleFP();
102                        crew = SharedData.getData().getPlayerPreLosingBattleCrew();
103                }
104                
105                CampaignFleetAPI playerFleet = Global.getSector().getPlayerFleet();
106                
107                
108                
109                for (CampaignFleetAPI other : Global.getSector().getCurrentLocation().getFleets()) {
110                        MemoryAPI mem = other.getMemoryWithoutUpdate();
111                        if (mem.getBoolean(MemFlags.MEMORY_KEY_MAKE_HOSTILE_WHILE_TOFF)) {
112                                mem.removeAllRequired(MemFlags.MEMORY_KEY_MAKE_HOSTILE_WHILE_TOFF);
113                                //System.out.println("Hostile: " + mem.getBoolean(MemFlags.MEMORY_KEY_MAKE_HOSTILE_WHILE_TOFF));
114                        }
115                        mem.unset(MemFlags.MEMORY_KEY_SAW_PLAYER_WITH_TRANSPONDER_OFF);
116                        
117                        if (!Misc.isPermaKnowsWhoPlayerIs(other)) {
118                                mem.unset(MemFlags.MEMORY_KEY_SAW_PLAYER_WITH_TRANSPONDER_ON);
119                        }
120                }
121                
122                CampaignFleetAPI fleet = FleetFactoryV3.createEmptyFleet(Factions.PLAYER, null, null);
123                fleet.setName("Fleet");
124
125                Global.getSector().setCurrentLocation(Global.getSector().getHyperspace());
126                fleet.setLocation(1000000000f, 1000000000f);
127                
128                for (OfficerDataAPI officer : playerFleet.getFleetData().getOfficersCopy()) {
129                        fleet.getFleetData().addOfficer(officer);
130                }
131
132                Global.getSector().setPlayerFleet(fleet);
133                Global.getSector().setLastPlayerBattleTimestamp(Long.MIN_VALUE);
134                Global.getSector().setLastPlayerBattleWon(false);
135                
136                
137                fleet.getFleetData().setSyncNeeded();
138                fleet.getFleetData().syncIfNeeded();
139                
140                for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
141                        float max = member.getRepairTracker().getMaxCR();
142                        member.getRepairTracker().setCR(max);
143                }
144
145                
146                for (String id : Global.getSector().getCharacterData().getAbilities()) {
147                        fleet.addAbility(id);
148                }
149                
150                if (fleet.getAbility(Abilities.TRANSPONDER) != null) {
151                        fleet.getAbility(Abilities.TRANSPONDER).activate();
152                }
153                
154                Global.getSector().setPaused(true);
155                
156//              float minCredits = 2000;
157//              float newCredits = Math.max(credits * 0.8f, minCredits);
158//              float change = credits - newCredits;
159//
160//              fleet.getCargo().getCredits().add(newCredits);
161//              if (change > 0) {
162//                      addMessage("Lost " + (int)(change) + " credits");
163//              } else if (change < 0) {
164//                      addMessage("Gained " + (int)(-change) + " credits");
165//              }
166                
167                Global.getSector().getCampaignUI().resetViewOffset();
168                
169                Misc.clearAreaAroundPlayer(2000f);
170                
171                PersonBountyEventData data = SharedData.getData().getPersonBountyEventData();
172                data.setLevel(Math.max(0, data.getLevel() - 1));
173                data.setSuccessesThisLevel(0);
174        }
175        
176        
177        
178        
179        
180        public void optionMousedOver(String optionText, Object optionData) {
181
182        }
183        
184        public void advance(float amount) {
185                
186        }
187        
188        public Object getContext() {
189                return null;
190        }
191}
192
193
194