001package com.fs.starfarer.api.impl.campaign.abilities;
002
003import java.awt.Color;
004
005import com.fs.starfarer.api.Global;
006import com.fs.starfarer.api.campaign.CampaignFleetAPI;
007import com.fs.starfarer.api.campaign.CampaignTerrainAPI;
008import com.fs.starfarer.api.campaign.SectorEntityToken;
009import com.fs.starfarer.api.campaign.rules.MemoryAPI;
010import com.fs.starfarer.api.impl.campaign.RuleBasedInteractionDialogPluginImpl;
011import com.fs.starfarer.api.impl.campaign.ids.Entities;
012import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
013import com.fs.starfarer.api.impl.campaign.procgen.SalvageEntityGenDataSpec;
014import com.fs.starfarer.api.impl.campaign.procgen.themes.SalvageEntityGeneratorOld;
015import com.fs.starfarer.api.impl.campaign.terrain.DebrisFieldTerrainPlugin;
016import com.fs.starfarer.api.ui.TooltipMakerAPI;
017import com.fs.starfarer.api.util.IntervalUtil;
018import com.fs.starfarer.api.util.Misc;
019
020public class ScavengeAbility extends BaseDurationAbility {
021
022        private IntervalUtil interval = null;
023        
024        @Override
025        protected String getActivationText() {
026                return "Scavenging";
027        }
028
029        @Override
030        protected void activateImpl() {
031                if (entity.isPlayerFleet()) {
032                        CampaignFleetAPI fleet = getFleet();
033                        DebrisFieldTerrainPlugin debris = getDebrisField();
034                        if (debris != null) {
035                                SectorEntityToken target = debris.getEntity().getContainingLocation().addCustomEntity(
036                                                                        null, null, Entities.DEBRIS_FIELD_SHARED, debris.getEntity().getFaction().getId());
037                                debris.getEntity().getContainingLocation().removeEntity(target);
038                                
039                                //target.getDropRandom()
040                                target.getLocation().set(debris.getEntity().getLocation());
041                                
042                                MemoryAPI debrisMemory = debris.getEntity().getMemory();
043                                debrisMemory.set(MemFlags.SALVAGE_DEBRIS_FIELD, debris, 0);
044                                target.setMemory(debrisMemory);
045                                
046//                              if (debrisMemory.contains(MemFlags.SALVAGE_SEED)) {
047//                                      target.getMemoryWithoutUpdate().set(MemFlags.SALVAGE_SEED, debrisMemory.getLong(MemFlags.SALVAGE_SEED));
048//                              }
049//                              
050//                              if (debrisMemory.contains(MemFlags.SALVAGE_SPECIAL_DATA)) {
051//                                      target.getMemoryWithoutUpdate().set(MemFlags.SALVAGE_SPECIAL_DATA, debrisMemory.get(MemFlags.SALVAGE_SPECIAL_DATA));
052//                              }
053                                
054                                // the debris field spec is shared between all debris fields and all the relevant values in it
055                                // are set here, before it's actually used for any given instance of a debris field
056                                SalvageEntityGenDataSpec spec = SalvageEntityGeneratorOld.getSalvageSpec(target.getCustomEntityType());
057                                
058                                spec.getDropValue().clear();
059                                spec.getDropRandom().clear();
060                                
061                                spec.getDropValue().addAll(debris.getEntity().getDropValue());
062                                spec.getDropRandom().addAll(debris.getEntity().getDropRandom());
063                                
064                                spec.setProbDefenders(debris.getParams().defenderProb * debris.getParams().density);
065                                spec.setMinStr(debris.getParams().minStr * debris.getParams().density);
066                                spec.setMaxStr(debris.getParams().maxStr * debris.getParams().density);
067                                spec.setMaxDefenderSize(debris.getParams().maxDefenderSize);
068                                spec.setDefFaction(debris.getParams().defFaction);
069                                
070                                float xp = debris.getParams().baseSalvageXP * debris.getParams().density;
071                                spec.setXpSalvage(xp);
072                                
073//                              DropData data = new DropData();
074//                              data.group = Drops.AI_CORES3;
075//                              data.value = 10000000;
076//                              spec.getDropValue().add(data);
077                                
078                                Global.getSector().getCampaignUI().showInteractionDialog(
079                                                                                                new RuleBasedInteractionDialogPluginImpl(),
080                                                                                                target);
081                        }
082                }
083//              if (entity.isInCurrentLocation()) {
084//                      VisibilityLevel level = entity.getVisibilityLevelToPlayerFleet();
085//                      if (level != VisibilityLevel.NONE) {
086//                              Global.getSector().addPing(entity, Pings.SENSOR_BURST);
087//                      }
088//              }
089        }
090
091        @Override
092        public void advance(float amount) {
093                super.advance(amount);
094                
095//              if (level > 0) {
096//                      
097//              }
098                
099                if (interval != null && getFleet() != null && getFleet().isPlayerFleet()) {
100                        float days = Global.getSector().getClock().convertToDays(amount);
101                        interval.advance(days);
102                        if (interval.intervalElapsed()) {
103//                              WeightedRandomPicker<String> picker = new WeightedRandomPicker<String>();
104//                              
105//                              picker.add(Commodities.CREW, 1);
106//                              picker.add(Commodities.CREW, 1);
107                                
108//                              Color color = Misc.setAlpha(entity.getIndicatorColor(), 255);
109//                              
110//                              CargoAPI cargo = getFleet().getCargo();
111//                              float r = (float) Math.random();
112//                              if (r > 0.9f) {
113//                                      cargo.addCommodity(Commodities.BETA_CORE, 1);
114//                                      entity.addFloatingText("Found beta core", color, 0.5f);
115//                                      Global.getSoundPlayer().playUISound("ui_cargo_metals_drop", 1f, 1f);
116//                              } else if (r > 0.5f) {
117//                                      int qty = (int) (5f + 5f * (float) Math.random());
118//                                      cargo.addCommodity(Commodities.METALS, qty);
119//                                      entity.addFloatingText("Found " + qty + " metal", color, 0.5f);
120//                                      Global.getSoundPlayer().playUISound("ui_cargo_metals_drop", 1f, 1f);
121//                              } else if (r > 0.25f) {
122//                                      int qty = (int) (1f + 3f * (float) Math.random());
123//                                      cargo.removeCommodity(Commodities.CREW, qty);
124//                                      entity.addFloatingText("Lost " + qty + " crew", color, 0.5f);
125//                                      Global.getSoundPlayer().playUISound("ui_cargo_crew_drop", 1f, 1f);
126//                              } else if (r >= 0) {
127//                                      int qty = (int) (1f + 2f * (float) Math.random());
128//                                      cargo.removeCommodity(Commodities.HEAVY_MACHINERY, qty);
129//                                      entity.addFloatingText("Lost " + qty + " heavy machinery", color, 0.5f);
130//                                      Global.getSoundPlayer().playUISound("ui_cargo_machinery_drop", 1f, 1f);
131//                              }
132                                
133                        }
134                }
135                
136        }
137
138        @Override
139        protected void applyEffect(float amount, float level) {
140                CampaignFleetAPI fleet = getFleet();
141                if (fleet == null) return;
142                
143//              if (interval == null && level > 0) {
144//                      interval = new IntervalUtil(0.1f, 0.15f);
145//              } else if (level <= 0) {
146//                      if (interval != null) {
147//                              entity.addFloatingText("Finished", Misc.setAlpha(entity.getIndicatorColor(), 255), 0.5f);
148//                      }
149//                      interval = null;
150//              }
151                
152//              fleet.getStats().getSensorRangeMod().modifyFlat(getModId(), SENSOR_RANGE_BONUS * level, "Active sensor burst");
153//              fleet.getStats().getDetectedRangeMod().modifyFlat(getModId(), DETECTABILITY_RANGE_BONUS * level, "Active sensor burst");
154//              fleet.getStats().getFleetwideMaxBurnMod().modifyMult(getModId(), 0, "Active sensor burst");
155//              fleet.getStats().getAccelerationMult().modifyMult(getModId(), 1f + (ACCELERATION_MULT - 1f) * level);
156        }
157
158        @Override
159        protected void deactivateImpl() {
160                cleanupImpl();
161        }
162        
163        @Override
164        protected void cleanupImpl() {
165                CampaignFleetAPI fleet = getFleet();
166                if (fleet == null) return;
167                
168//              fleet.getStats().getSensorRangeMod().unmodify(getModId());
169//              fleet.getStats().getDetectedRangeMod().unmodify(getModId());
170//              fleet.getStats().getFleetwideMaxBurnMod().unmodify(getModId());
171//              fleet.getStats().getAccelerationMult().unmodify(getModId());
172        }
173        
174        @Override
175        public boolean isUsable() {
176                DebrisFieldTerrainPlugin debris = getDebrisField();
177                if (debris == null || debris.isScavenged()) return false;
178                return super.isUsable();
179        }
180        
181        protected DebrisFieldTerrainPlugin getDebrisField() {
182                CampaignFleetAPI fleet = getFleet();
183                if (fleet == null) return null;
184                
185                DebrisFieldTerrainPlugin scavenged = null; 
186                DebrisFieldTerrainPlugin usable = null; 
187                for (CampaignTerrainAPI curr : fleet.getContainingLocation().getTerrainCopy()) {
188                        if (curr.getPlugin() instanceof DebrisFieldTerrainPlugin) {
189                                DebrisFieldTerrainPlugin debris = (DebrisFieldTerrainPlugin) curr.getPlugin();
190                                if (debris.containsEntity(fleet)) {
191                                        if (debris.isScavenged()) {
192                                                scavenged = debris;
193                                        } else {
194                                                usable = debris;
195                                        }
196                                        //return debris;
197                                }
198                        }
199                }
200                if (usable != null) return usable;
201                return scavenged;
202        }
203
204        @Override
205        public void createTooltip(TooltipMakerAPI tooltip, boolean expanded) {
206                Color gray = Misc.getGrayColor();
207                Color highlight = Misc.getHighlightColor();
208                
209                if (!Global.CODEX_TOOLTIP_MODE) {
210                        tooltip.addTitle(spec.getName());
211                } else {
212                        tooltip.addSpacer(-10f);
213                }
214
215                float pad = 10f;
216                tooltip.addPara("Pick through a debris field looking for anything of value.", pad);
217                
218                if (!Global.CODEX_TOOLTIP_MODE) {
219                        DebrisFieldTerrainPlugin debris = getDebrisField();
220                        if (debris == null) {
221                                tooltip.addPara("Your fleet is not currently inside a debris field.", Misc.getNegativeHighlightColor(), pad);
222                        } else if (debris.isScavenged()) {
223                                tooltip.addPara("Your fleet is inside a debris field, but it contains nothing of value.", Misc.getNegativeHighlightColor(), pad);
224                        } else {
225                                tooltip.addPara("Your fleet is inside a debris field and can begin scavenging.", Misc.getPositiveHighlightColor(), pad);
226                        }
227                }
228//              tooltip.addPara("Increases sensor range by %s* units and" +
229//                              " increases the range at which the fleet can be detected by %s* units." +
230//                              " Also brings the fleet to a near-stop.",
231//                              pad, highlight,
232//                              "" + (int)SENSOR_RANGE_BONUS,
233//                              "" + (int)DETECTABILITY_RANGE_BONUS
234//              );
235                //tooltip.addPara("Disables \"Go Dark\" when activated.", pad);
236                addIncompatibleToTooltip(tooltip, expanded);
237                
238//              tooltip.addPara("*2000 units = 1 map grid cell", gray, pad);
239        }
240
241        public boolean hasTooltip() {
242                return true;
243        }
244}
245
246
247
248
249