1package com.fs.starfarer.api.impl.campaign.rulecmd.salvage;
6import com.fs.starfarer.api.Global;
7import com.fs.starfarer.api.campaign.CampaignFleetAPI;
8import com.fs.starfarer.api.campaign.CargoAPI;
9import com.fs.starfarer.api.campaign.CargoAPI.CargoItemType;
10import com.fs.starfarer.api.campaign.CargoPickerListener;
11import com.fs.starfarer.api.campaign.CargoStackAPI;
12import com.fs.starfarer.api.campaign.CoreInteractionListener;
13import com.fs.starfarer.api.campaign.CustomCampaignEntityPlugin;
14import com.fs.starfarer.api.campaign.CustomEntitySpecAPI;
15import com.fs.starfarer.api.campaign.FactionAPI;
16import com.fs.starfarer.api.campaign.InteractionDialogAPI;
17import com.fs.starfarer.api.campaign.LocationAPI;
18import com.fs.starfarer.api.campaign.OptionPanelAPI;
19import com.fs.starfarer.api.campaign.RuleBasedDialog;
20import com.fs.starfarer.api.campaign.SectorEntityToken;
21import com.fs.starfarer.api.campaign.TextPanelAPI;
22import com.fs.starfarer.api.campaign.econ.MarketAPI;
23import com.fs.starfarer.api.campaign.listeners.ListenerUtil;
24import com.fs.starfarer.api.campaign.rules.MemoryAPI;
25import com.fs.starfarer.api.impl.campaign.CampaignObjective;
26import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActionEnvelope;
27import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActions;
28import com.fs.starfarer.api.impl.campaign.DebugFlags;
29import com.fs.starfarer.api.impl.campaign.ids.Commodities;
30import com.fs.starfarer.api.impl.campaign.ids.Entities;
31import com.fs.starfarer.api.impl.campaign.ids.Factions;
32import com.fs.starfarer.api.impl.campaign.ids.Items;
33import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
34import com.fs.starfarer.api.impl.campaign.ids.Tags;
35import com.fs.starfarer.api.impl.campaign.intel.events.ht.HTNeutrinoBurstFactor;
36import com.fs.starfarer.api.impl.campaign.intel.events.ht.HTPoints;
37import com.fs.starfarer.api.impl.campaign.intel.events.ht.HyperspaceTopographyEventIntel;
38import com.fs.starfarer.api.impl.campaign.intel.misc.CommSnifferIntel;
39import com.fs.starfarer.api.impl.campaign.rulecmd.AddRemoveCommodity;
40import com.fs.starfarer.api.impl.campaign.rulecmd.BaseCommandPlugin;
41import com.fs.starfarer.api.impl.campaign.rulecmd.FireBest;
42import com.fs.starfarer.api.impl.campaign.shared.WormholeManager;
43import com.fs.starfarer.api.impl.campaign.velfield.SlipstreamVisibilityManager;
44import com.fs.starfarer.api.loading.Description;
45import com.fs.starfarer.api.loading.Description.Type;
46import com.fs.starfarer.api.ui.LabelAPI;
47import com.fs.starfarer.api.ui.TooltipMakerAPI;
48import com.fs.starfarer.api.util.Misc;
49import com.fs.starfarer.api.util.Misc.Token;
73 protected TextPanelAPI
text;
77 protected InteractionDialogAPI
dialog;
100 if (
entity.hasTag(Tags.MAKESHIFT)) {
110 public boolean execute(String ruleId, InteractionDialogAPI
dialog, List<Token> params, Map<String, MemoryAPI>
memoryMap) {
115 String command = params.get(0).getString(
memoryMap);
116 if (command ==
null)
return false;
126 if (command.equals(
"printCost")) {
127 String type = params.get(1).getString(
memoryMap);
129 }
else if (command.equals(
"showSalvage")) {
131 }
else if (command.equals(
"selectWormholeAnchor")) {
133 }
else if (command.equals(
"hasWormholeAnchor")) {
135 }
else if (command.equals(
"hasRepImpact")) {
137 }
else if (command.equals(
"showRepairCost")) {
139 }
else if (command.equals(
"showBurstCost")) {
140 boolean hasRecent = HyperspaceTopographyEventIntel.hasRecentReadingsNearPlayer();
142 }
else if (command.equals(
"showRepairCostNoPrompt")) {
144 }
else if (command.equals(
"printHackDesc")) {
146 }
else if (command.equals(
"canBuild")) {
147 String type = params.get(1).getString(
memoryMap);
149 }
else if (command.equals(
"canActivate")) {
151 }
else if (command.equals(
"canBurst")) {
153 }
else if (command.equals(
"build")) {
154 String type = params.get(1).getString(
memoryMap);
155 build(type, Factions.PLAYER);
156 }
else if (command.equals(
"printDescription")) {
158 String type =
entity.getCustomEntityType();
160 }
else if (command.equals(
"isHacked")) {
162 }
else if (command.equals(
"doAction")) {
163 String action = params.get(1).getString(
memoryMap);
164 if (action.equals(
"hack")) {
166 }
else if (action.equals(
"reset")) {
168 }
else if (action.equals(
"unhack")) {
170 }
else if (action.equals(
"control")) {
172 }
else if (action.equals(
"salvage")) {
174 }
else if (action.equals(
"burst")) {
185 for (
int i = 0; i < res.length; i++) {
186 String commodityId = res[i];
187 int quantity = quantities[i];
188 cargo.removeCommodity(commodityId, quantity);
193 SlipstreamVisibilityManager.updateSlipstreamVisibility(
entity.getLocationInHyperspace(), range);
196 if (
entity.hasTag(Tags.MAKESHIFT)) {
197 points = HTPoints.NEUTRINO_BURST_MAKESHIFT;
199 points = HTPoints.NEUTRINO_BURST_DOMAIN;
203 boolean hasRecent = HyperspaceTopographyEventIntel.hasRecentReadingsNearPlayer();
204 if (!hasRecent && points > 0) {
205 HyperspaceTopographyEventIntel.addFactorCreateIfNecessary(
new HTNeutrinoBurstFactor(points),
dialog);
206 if (HyperspaceTopographyEventIntel.get() !=
null) {
207 HyperspaceTopographyEventIntel.get().addRecentReadings(
entity.getLocationInHyperspace());
214 if (curr.getFaction() ==
entity.getFaction() &&
215 !curr.getFaction().isNeutralFaction() &&
216 !curr.getFaction().isPlayerFaction()) {
229 for (
int i = 0; i < r.length; i++) {
230 salvage.addCommodity(r[i], q[i]);
233 dialog.getVisualPanel().showLoot(
"Salvaged", salvage,
false,
true,
true,
new CoreInteractionListener() {
234 public void coreUIDismissed() {
239 LocationAPI loc =
entity.getContainingLocation();
240 SectorEntityToken built = loc.addCustomEntity(
null,
242 Entities.STABLE_LOCATION,
244 if (
entity.getOrbit() !=
null) {
245 built.setOrbit(
entity.getOrbit().makeCopy());
250 built.getMemoryWithoutUpdate().set(MemFlags.RECENTLY_SALVAGED,
true, 30f);
252 if (Factions.PLAYER.equals(factionId) &&
hasRepImpact() &&
253 !
entity.getFaction().isPlayerFaction() &&
254 !
entity.getFaction().isNeutralFaction()) {
255 RepActions action = RepActions.COMBAT_AGGRESSIVE;
256 if (
entity.hasTag(Tags.MAKESHIFT)) {
257 action = RepActions.COMBAT_AGGRESSIVE_TOFF;
260 new RepActionEnvelope(action,
null,
null,
null,
false,
true,
"Change caused by destruction of " +
entity.getCustomEntitySpec().getDefaultName().toLowerCase()),
273 if (loc ==
null)
return;
274 for (SectorEntityToken other : loc.getAllEntities()) {
275 if (other == prev)
continue;
276 if (other.getOrbit() ==
null)
continue;
277 if (other.getOrbitFocus() == prev) {
278 other.setOrbitFocus(built);
284 return entity.getMemoryWithoutUpdate().getBoolean(MemFlags.OBJECTIVE_NON_FUNCTIONAL);
292 if (Factions.PLAYER.equals(factionId) &&
hasRepImpact() &&
293 !
entity.getFaction().isPlayerFaction() && !
entity.getFaction().isNeutralFaction()) {
294 RepActions action = RepActions.COMBAT_AGGRESSIVE;
297 new RepActionEnvelope(action,
null,
null,
text,
false,
true),
301 FactionAPI prev =
entity.getFaction();
302 entity.setFaction(factionId);
305 if (!
entity.hasTag(Tags.COMM_RELAY) &&
faction.isPlayerFaction()) {
309 entity.getMemoryWithoutUpdate().unset(MemFlags.OBJECTIVE_NON_FUNCTIONAL);
319 ListenerUtil.reportObjectiveChangedHands(
entity, prev,
faction);
323 CommSnifferIntel intel = CommSnifferIntel.getExistingSnifferIntelForRelay(
entity);
328 CustomCampaignEntityPlugin plugin =
entity.getCustomPlugin();
338 CustomCampaignEntityPlugin plugin =
entity.getCustomPlugin();
347 CustomCampaignEntityPlugin plugin =
entity.getCustomPlugin();
353 Global.
getSector().getPlayerFleet().getMemoryWithoutUpdate().set(MemFlags.FLEET_NOT_CHASING_GHOST,
true,
354 0.5f + Misc.random.nextFloat() * 1f);
359 CustomCampaignEntityPlugin plugin =
entity.getCustomPlugin();
367 public void build(String type, String factionId) {
368 if (
entity.hasTag(Tags.NON_CLICKABLE))
return;
369 if (
entity.hasTag(Tags.FADING_OUT_AND_EXPIRING))
return;
371 LocationAPI loc =
entity.getContainingLocation();
372 SectorEntityToken built = loc.addCustomEntity(
null,
376 if (
entity.getOrbit() !=
null) {
377 built.setOrbit(
entity.getOrbit().makeCopy());
379 built.setLocation(
entity.getLocation().x,
entity.getLocation().y);
384 built.getMemoryWithoutUpdate().set(
"$originalStableLocation",
entity);
408 for (
int i = 0; i < res.length; i++) {
409 String commodityId = res[i];
410 int quantity = quantities[i];
411 if (quantity > cargo.getQuantity(CargoItemType.RESOURCES, commodityId)) {
426 for (
int i = 0; i < res.length; i++) {
427 String commodityId = res[i];
428 int quantity = quantities[i];
429 cargo.removeCommodity(commodityId, quantity);
441 for (
int i = 0; i < res.length; i++) {
442 String commodityId = res[i];
443 int quantity = quantities[i];
444 cargo.removeCommodity(commodityId, quantity);
457 for (
int i = 0; i < res.length; i++) {
458 String commodityId = res[i];
459 int quantity = quantities[i];
460 if (quantity > cargo.getQuantity(CargoItemType.RESOURCES, commodityId)) {
475 for (
int i = 0; i < res.length; i++) {
476 String commodityId = res[i];
477 int quantity = quantities[i];
478 if (quantity > cargo.getQuantity(CargoItemType.RESOURCES, commodityId)) {
494 text.addParagraph(desc.getText1());
498 CustomCampaignEntityPlugin plugin = spec.getPlugin();
499 SectorEntityToken temp =
entity.getContainingLocation().createToken(0, 0);
500 for (String tag : spec.getTags()) {
503 plugin.init(temp,
null);
505 boolean objective =
entity.hasTag(Tags.OBJECTIVE);
507 plugin =
entity.getCustomPlugin();
515 TooltipMakerAPI info =
text.beginTooltip();
524 for (SectorEntityToken curr :
entity.getContainingLocation().getEntitiesWithTag(Tags.OBJECTIVE)) {
525 if (curr.hasTag(Tags.OBJECTIVE)) {
526 if (curr.getFaction() ==
null || !curr.getFaction().isPlayerFaction() ||
527 curr.getCustomEntitySpec() ==
null) {
531 CustomCampaignEntityPlugin ccep = curr.getCustomPlugin();
534 if (c == o.getClass()) {
536 text.addPara(
"Another one in this star system would have no effect " +
537 "beyond providing redundancy in case this one is lost.");
539 text.addPara(
"There's already " +
540 curr.getCustomEntitySpec().getAOrAn() +
" " +
541 curr.getCustomEntitySpec().getNameInText() +
" under your control " +
542 "in this star system. Another one would have no effect " +
543 "beyond providing redundancy if one is lost.");
554 boolean objective =
entity.hasTag(Tags.OBJECTIVE);
556 if (!
faction.isNeutralFaction()) {
557 if (
entity.getFaction().isPlayerFaction() && !Misc.isPlayerFactionSetUp()) {
558 text.addPara(
"This " +
entity.getCustomEntitySpec().getShortName() +
" is under your control.",
559 entity.getFaction().getBaseUIColor(),
"your");
561 text.addPara(
"This " +
entity.getCustomEntitySpec().getShortName() +
" is under %s control.",
562 entity.getFaction().getBaseUIColor(),
entity.getFaction().getPersonNamePrefix());
565 text.addPara(
"This " +
entity.getCustomEntitySpec().getShortName() +
" is not claimed by any faction.");
586 text.addPara(
"Proceed with reactivation?");
592 boolean hasRecent = HyperspaceTopographyEventIntel.hasRecentReadingsNearPlayer();
594 LabelAPI label =
text.addPara(
"You've recently acquired topographic data within %s light-years of your current location,"
595 +
" and a neutrino burst here "
596 +
"will not meaningfully contribute to your understanding of "
597 +
"hyperspace topology. It will, however, still "
598 +
"reveal all nearby slipstreams.", Misc.getHighlightColor(),
599 "" + (
int)HyperspaceTopographyEventIntel.RECENT_READINGS_RANGE_LY);
600 label.setHighlightColors(Misc.getHighlightColor(), Misc.getNegativeHighlightColor(), Misc.getNegativeHighlightColor());
601 label.setHighlight(
"" + (
int)HyperspaceTopographyEventIntel.RECENT_READINGS_RANGE_LY,
602 "will not meaningfully contribute",
"hyperspace topology");
606 text.addPara(
"Proceed with neutrino burst?");
613 text.addPara(
"Proceed with salvage operation?");
626 text.addPara(
"Proceed with construction?");
628 text.addPara(
"You do not have the necessary resources to build this structure.");
633 return new String[] {Commodities.FUEL};
641 if (
entity.hasTag(Tags.MAKESHIFT) ||
entity.hasTag(Tags.STABLE_LOCATION)) {
642 return new String[] {Commodities.HEAVY_MACHINERY, Commodities.METALS, Commodities.RARE_METALS};
644 return new String[] {Commodities.HEAVY_MACHINERY, Commodities.METALS, Commodities.RARE_METALS, Commodities.VOLATILES};
650 int [] result =
new int [q.length];
652 for (
int i = 0; i < result.length; i++) {
658 if (
entity.hasTag(Tags.MAKESHIFT) ||
entity.hasTag(Tags.STABLE_LOCATION)) {
659 return new int[] {15, 30, 5};
661 return new int[] {50, 200, 20, 20};
665 return new String[] {Commodities.HEAVY_MACHINERY };
670 return new int[] {5};
675 return new int[] {HTPoints.NEUTRINO_BURST_VOLATILES_COST};
679 return new String[] {Commodities.VOLATILES};
687 for (CargoStackAPI stack :
playerCargo.getStacksCopy()) {
688 if (stack.isSpecialStack() && Items.WORMHOLE_ANCHOR.equals(stack.getSpecialDataIfSpecial().getId())) {
689 copy.addFromStack(stack);
699 final float width = 310f;
700 dialog.showCargoPickerDialog(
"Select wormhole anchor to deploy",
"Deploy",
"Cancel",
true, width, copy,
701 new CargoPickerListener() {
702 public void pickedCargo(CargoAPI cargo) {
703 if (cargo.isEmpty()) {
704 cancelledCargoSelection();
709 for (CargoStackAPI stack : cargo.getStacksCopy()) {
710 if (stack.isSpecialStack()) {
711 WormholeManager.get().addWormhole(stack.getSpecialDataIfSpecial(),
entity,
dialog);
723 public void cancelledCargoSelection() {
725 public void recreateTextPanel(TooltipMakerAPI panel, CargoAPI cargo, CargoStackAPI pickedUp,
boolean pickedUpFromSource, CargoAPI combined) {
726 panel.addPara(
"Deploying and activating a wormhole anchor, turning it into an active terminus, "
727 +
"will consume %s fuel. Your fleet is carrying %s fuel.",
728 0f, Misc.getHighlightColor(),
732 boolean makeUnstable = WormholeManager.willWormholeBecomeUnstable(
entity);
734 panel.addPara(
"Once the operation is completed, the wormhole will take about a cycle to stablize,"
735 +
"before it can be used.", 10f, Misc.getHighlightColor(),
"cycle");
737 panel.addPara(
"Usually, the wormhole will take about a cycle to stablize, but you have "
738 +
"calibration data that will allow it to be used immediately.", 10f);
static SettingsAPI getSettings()
static SoundPlayerAPI getSoundPlayer()
static FactoryAPI getFactory()
static SectorAPI getSector()
static boolean OBJECTIVES_DEBUG
static void addCommodityLossText(String commodityId, int quantity, TextPanelAPI text)
static MemoryAPI getEntityMemory(Map< String, MemoryAPI > memoryMap)
static boolean fire(String ruleId, InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap, String params)
CampaignFleetAPI playerFleet
void salvage(final String factionId)
void removeRepairCosts(TextPanelAPI text)
Objectives(SectorEntityToken entity)
static float BURST_RANGE_MAKESHIFT
void build(String type, String factionId)
boolean execute(String ruleId, InteractionDialogAPI dialog, List< Token > params, Map< String, MemoryAPI > memoryMap)
boolean canBuild(String type)
CargoAPI getWormholeAnchors()
void printCost(String type)
int[] getBurstQuantities()
static float BURST_RANGE_SCAVENGER_MAX
void updateOrbitingEntities(LocationAPI loc, SectorEntityToken prev, SectorEntityToken built)
void selectWormholeAnchor()
Map< String, MemoryAPI > memoryMap
void printDescription(String type)
void init(SectorEntityToken entity)
static float BURST_RANGE_DOMAIN
void printBurstCost(boolean withPrompt)
static String BURST_RANGE
int[] getRepairQuantities()
int[] getSalvageQuantities()
void printRepairCost(boolean withPrompt)
String[] getBurstResources()
String[] getWormholeResources()
void control(String factionId)
String[] getRepairResources()
static float BURST_RANGE_SCAVENGER_MIN
boolean hasWormholeAnchor()
static String WORMHOLE_TYPE_STR
boolean isNonFunctional()
boolean canActivate(String type)
int[] getWormholeQuantities()
InteractionDialogAPI dialog
static float SALVAGE_FRACTION
CargoAPI createCargo(boolean unlimitedStacks)
Description getDescription(String id, Type type)
CustomEntitySpecAPI getCustomEntitySpec(String id)
SoundAPI playUISound(String id, float pitch, float volume)
void setReset(boolean reset)
void setHacked(boolean hacked)
void printNonFunctionalAndHackDescription(TextPanelAPI text)
void printEffect(TooltipMakerAPI text, float pad)