Starsector API
Loading...
Searching...
No Matches
ScavengeAbility.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.abilities;
2
3import java.awt.Color;
4
5import com.fs.starfarer.api.Global;
6import com.fs.starfarer.api.campaign.CampaignFleetAPI;
7import com.fs.starfarer.api.campaign.CampaignTerrainAPI;
8import com.fs.starfarer.api.campaign.SectorEntityToken;
9import com.fs.starfarer.api.campaign.rules.MemoryAPI;
10import com.fs.starfarer.api.impl.campaign.RuleBasedInteractionDialogPluginImpl;
11import com.fs.starfarer.api.impl.campaign.ids.Entities;
12import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
13import com.fs.starfarer.api.impl.campaign.procgen.SalvageEntityGenDataSpec;
14import com.fs.starfarer.api.impl.campaign.procgen.themes.SalvageEntityGeneratorOld;
15import com.fs.starfarer.api.impl.campaign.terrain.DebrisFieldTerrainPlugin;
16import com.fs.starfarer.api.ui.TooltipMakerAPI;
17import com.fs.starfarer.api.util.IntervalUtil;
18import com.fs.starfarer.api.util.Misc;
19
21
22 private IntervalUtil interval = null;
23
24 @Override
25 protected String getActivationText() {
26 return "Scavenging";
27 }
28
29 @Override
30 protected void activateImpl() {
31 if (entity.isPlayerFleet()) {
32 CampaignFleetAPI fleet = getFleet();
33 DebrisFieldTerrainPlugin debris = getDebrisField();
34 if (debris != null) {
35 SectorEntityToken target = debris.getEntity().getContainingLocation().addCustomEntity(
36 null, null, Entities.DEBRIS_FIELD_SHARED, debris.getEntity().getFaction().getId());
37 debris.getEntity().getContainingLocation().removeEntity(target);
38
39 //target.getDropRandom()
40 target.getLocation().set(debris.getEntity().getLocation());
41
42 MemoryAPI debrisMemory = debris.getEntity().getMemory();
43 debrisMemory.set(MemFlags.SALVAGE_DEBRIS_FIELD, debris, 0);
44 target.setMemory(debrisMemory);
45
46// if (debrisMemory.contains(MemFlags.SALVAGE_SEED)) {
47// target.getMemoryWithoutUpdate().set(MemFlags.SALVAGE_SEED, debrisMemory.getLong(MemFlags.SALVAGE_SEED));
48// }
49//
50// if (debrisMemory.contains(MemFlags.SALVAGE_SPECIAL_DATA)) {
51// target.getMemoryWithoutUpdate().set(MemFlags.SALVAGE_SPECIAL_DATA, debrisMemory.get(MemFlags.SALVAGE_SPECIAL_DATA));
52// }
53
54 // the debris field spec is shared between all debris fields and all the relevant values in it
55 // are set here, before it's actually used for any given instance of a debris field
56 SalvageEntityGenDataSpec spec = SalvageEntityGeneratorOld.getSalvageSpec(target.getCustomEntityType());
57
58 spec.getDropValue().clear();
59 spec.getDropRandom().clear();
60
61 spec.getDropValue().addAll(debris.getEntity().getDropValue());
62 spec.getDropRandom().addAll(debris.getEntity().getDropRandom());
63
64 spec.setProbDefenders(debris.getParams().defenderProb * debris.getParams().density);
65 spec.setMinStr(debris.getParams().minStr * debris.getParams().density);
66 spec.setMaxStr(debris.getParams().maxStr * debris.getParams().density);
67 spec.setMaxDefenderSize(debris.getParams().maxDefenderSize);
68 spec.setDefFaction(debris.getParams().defFaction);
69
70 float xp = debris.getParams().baseSalvageXP * debris.getParams().density;
71 spec.setXpSalvage(xp);
72
73// DropData data = new DropData();
74// data.group = Drops.AI_CORES3;
75// data.value = 10000000;
76// spec.getDropValue().add(data);
77
78 Global.getSector().getCampaignUI().showInteractionDialog(
80 target);
81 }
82 }
83// if (entity.isInCurrentLocation()) {
84// VisibilityLevel level = entity.getVisibilityLevelToPlayerFleet();
85// if (level != VisibilityLevel.NONE) {
86// Global.getSector().addPing(entity, Pings.SENSOR_BURST);
87// }
88// }
89 }
90
91 @Override
92 public void advance(float amount) {
93 super.advance(amount);
94
95// if (level > 0) {
96//
97// }
98
99 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 tooltip.addTitle(spec.getName());
210
211 float pad = 10f;
212 tooltip.addPara("Pick through a debris field looking for anything of value.", pad);
213
214 DebrisFieldTerrainPlugin debris = getDebrisField();
215 if (debris == null) {
216 tooltip.addPara("Your fleet is not currently inside a debris field.", Misc.getNegativeHighlightColor(), pad);
217 } else if (debris.isScavenged()) {
218 tooltip.addPara("Your fleet is inside a debris field, but it contains nothing of value.", Misc.getNegativeHighlightColor(), pad);
219 } else {
220 tooltip.addPara("Your fleet is inside a debris field and can begin scavenging.", Misc.getPositiveHighlightColor(), pad);
221 }
222// tooltip.addPara("Increases sensor range by %s* units and" +
223// " increases the range at which the fleet can be detected by %s* units." +
224// " Also brings the fleet to a near-stop.",
225// pad, highlight,
226// "" + (int)SENSOR_RANGE_BONUS,
227// "" + (int)DETECTABILITY_RANGE_BONUS
228// );
229 //tooltip.addPara("Disables \"Go Dark\" when activated.", pad);
230 addIncompatibleToTooltip(tooltip, expanded);
231
232// tooltip.addPara("*2000 units = 1 map grid cell", gray, pad);
233 }
234
235 public boolean hasTooltip() {
236 return true;
237 }
238}
239
240
241
242
243
static SectorAPI getSector()
Definition Global.java:59
void addIncompatibleToTooltip(TooltipMakerAPI tooltip, boolean expanded)
void createTooltip(TooltipMakerAPI tooltip, boolean expanded)