001package com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special;
002
003import java.util.Map;
004import java.util.Random;
005
006import com.fs.starfarer.api.Global;
007import com.fs.starfarer.api.campaign.CampaignFleetAPI;
008import com.fs.starfarer.api.campaign.CargoAPI;
009import com.fs.starfarer.api.campaign.InteractionDialogAPI;
010import com.fs.starfarer.api.campaign.OptionPanelAPI;
011import com.fs.starfarer.api.campaign.SectorEntityToken;
012import com.fs.starfarer.api.campaign.TextPanelAPI;
013import com.fs.starfarer.api.campaign.VisualPanelAPI;
014import com.fs.starfarer.api.campaign.rules.MemoryAPI;
015import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
016import com.fs.starfarer.api.impl.campaign.rulecmd.BaseCommandPlugin;
017import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.SalvageSpecialInteraction.SalvageSpecialPlugin;
018import com.fs.starfarer.api.util.Misc;
019
020public class BaseSalvageSpecial implements SalvageSpecialPlugin {
021
022        public static final String EXTRA_SALVAGE = "$extraSpecialSalvage";
023        public static final String TEMP_EXTRA_SALVAGE = "$tempExtraSpecialSalvage";
024        public static class ExtraSalvage {
025                public CargoAPI cargo;
026                public ExtraSalvage(CargoAPI cargo) {
027                        this.cargo = cargo;
028                }
029        }
030        
031        protected boolean done = false;
032        protected boolean endWithContinue = true;
033        protected InteractionDialogAPI dialog;
034        protected Random random;
035        protected SectorEntityToken entity;
036        
037        protected TextPanelAPI text;
038        protected OptionPanelAPI options;
039        protected VisualPanelAPI visual;
040        protected Map<String, MemoryAPI> memoryMap;
041        
042        protected CampaignFleetAPI playerFleet;
043        
044        protected void addTempExtraSalvage(CargoAPI cargo) {
045                ExtraSalvage extra = getTempExtraSalvage(memoryMap);
046                if (extra == null) {
047                        extra = new ExtraSalvage(cargo);
048                } else {
049                        extra.cargo.addAll(cargo);
050                }
051                MemoryAPI memory = BaseCommandPlugin.getEntityMemory(dialog.getPlugin().getMemoryMap());
052                memory.set(TEMP_EXTRA_SALVAGE, extra, 0f);
053        }
054        
055        public static void addExtraSalvage(SectorEntityToken entity, CargoAPI cargo) {
056                addExtraSalvage(cargo, entity.getMemoryWithoutUpdate(), -1);
057        }
058        public static void addExtraSalvage(CargoAPI cargo, MemoryAPI memory, float expire) {
059                ExtraSalvage extra = getExtraSalvage(memory);
060                if (extra == null) {
061                        extra = new ExtraSalvage(cargo);
062                } else {
063                        extra.cargo.addAll(cargo);
064                }
065                memory.set(EXTRA_SALVAGE, extra, expire);
066        }
067
068        public static CargoAPI getCombinedExtraSalvage(Map<String, MemoryAPI> memoryMap) {
069                ExtraSalvage extra = getExtraSalvage(memoryMap);
070                ExtraSalvage temp = getTempExtraSalvage(memoryMap);
071                CargoAPI cargo = Global.getFactory().createCargo(true);
072                if (extra != null && extra.cargo != null) cargo.addAll(extra.cargo);
073                if (temp != null && temp.cargo != null) cargo.addAll(temp.cargo);
074                return cargo;
075        }
076        public static CargoAPI getCombinedExtraSalvage(SectorEntityToken entity) {
077                ExtraSalvage extra = getExtraSalvage(entity);
078                ExtraSalvage temp = getTempExtraSalvage(entity);
079                CargoAPI cargo = Global.getFactory().createCargo(true);
080                if (extra != null && extra.cargo != null) cargo.addAll(extra.cargo);
081                if (temp != null && temp.cargo != null) cargo.addAll(temp.cargo);
082                return cargo;
083        }
084        public static ExtraSalvage getTempExtraSalvage(SectorEntityToken entity) {
085                return getTempExtraSalvage(entity.getMemoryWithoutUpdate());
086        }
087        public static ExtraSalvage getExtraSalvage(SectorEntityToken entity) {
088                return getExtraSalvage(entity.getMemoryWithoutUpdate());
089        }
090        public static ExtraSalvage getExtraSalvage(MemoryAPI memory) {
091                if (memory.contains(EXTRA_SALVAGE)) {
092                        return (ExtraSalvage) memory.get(EXTRA_SALVAGE);
093                }
094                return null;
095        }
096        public static ExtraSalvage getTempExtraSalvage(MemoryAPI memory) {
097                if (memory.contains(TEMP_EXTRA_SALVAGE)) {
098                        return (ExtraSalvage) memory.get(TEMP_EXTRA_SALVAGE);
099                }
100                return null;
101        }
102        public static ExtraSalvage getTempExtraSalvage(Map<String, MemoryAPI> memoryMap) {
103                MemoryAPI memory = BaseCommandPlugin.getEntityMemory(memoryMap);
104                return getTempExtraSalvage(memory);
105        }
106        public static ExtraSalvage getExtraSalvage(Map<String, MemoryAPI> memoryMap) {
107                MemoryAPI memory = BaseCommandPlugin.getEntityMemory(memoryMap);
108                return getExtraSalvage(memory);
109        }
110        public static void clearExtraSalvage(Map<String, MemoryAPI> memoryMap) {
111                MemoryAPI memory = BaseCommandPlugin.getEntityMemory(memoryMap);
112                clearExtraSalvage(memory);
113        }
114        public static void clearExtraSalvage(MemoryAPI memory) {
115                memory.unset(EXTRA_SALVAGE);
116                memory.unset(TEMP_EXTRA_SALVAGE);
117        }
118        public static void clearExtraSalvage(SectorEntityToken entity) {
119                clearExtraSalvage(entity.getMemoryWithoutUpdate());
120        }
121        
122        public void init(InteractionDialogAPI dialog, Object specialData) {
123                this.dialog = dialog;
124                
125                playerFleet = Global.getSector().getPlayerFleet();
126                
127                text = dialog.getTextPanel();
128                options = dialog.getOptionPanel();
129                visual = dialog.getVisualPanel();
130                memoryMap = dialog.getPlugin().getMemoryMap();
131                
132                entity = dialog.getInteractionTarget();
133                
134                MemoryAPI memory = BaseCommandPlugin.getEntityMemory(dialog.getPlugin().getMemoryMap());
135                long seed = memory.getLong(MemFlags.SALVAGE_SEED);
136                if (seed == 0) {
137                        random = new Random();
138                } else {
139                        random = Misc.getRandom(seed, 50);
140                }
141        }
142
143        public void optionSelected(String optionText, Object optionData) {
144                
145        }
146        
147        public void initNothing() {
148                setDone(true);
149                setEndWithContinue(false);
150                setShowAgain(false);
151        }
152        
153        public boolean isDone() {
154                return done;
155        }
156        
157        public void setDone(boolean done) {
158                this.done = done;
159        }
160
161        public boolean endWithContinue() {
162                return endWithContinue;
163        }
164
165        public void setEndWithContinue(boolean endWithContinue) {
166                this.endWithContinue = endWithContinue;
167        }
168
169        public String getString(String format) {
170                return Misc.getStringWithTokenReplacement(format, entity, memoryMap);
171        }
172        
173        public void addText(String format) {
174                text.addParagraph(getString(format));
175        }
176
177        private boolean showAgain = false;
178        public boolean shouldShowAgain() {
179                return showAgain;
180        }
181
182        public void setShowAgain(boolean showAgain) {
183                this.showAgain = showAgain;
184        }
185
186        private boolean shouldAbortSalvageAndRemoveEntity;
187        public boolean shouldAbortSalvageAndRemoveEntity() {
188                return shouldAbortSalvageAndRemoveEntity;
189        }
190
191        public void setShouldAbortSalvageAndRemoveEntity(boolean shouldAbortSalvageAndRemoveEntity) {
192                this.shouldAbortSalvageAndRemoveEntity = shouldAbortSalvageAndRemoveEntity;
193        }
194        
195        
196}
197
198
199