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