001package com.fs.starfarer.api.impl.campaign.rulecmd; 002 003import java.util.List; 004import java.util.Map; 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.StarSystemAPI; 013import com.fs.starfarer.api.campaign.TextPanelAPI; 014import com.fs.starfarer.api.campaign.rules.MemKeys; 015import com.fs.starfarer.api.campaign.rules.MemoryAPI; 016import com.fs.starfarer.api.impl.campaign.intel.events.ht.HTPoints; 017import com.fs.starfarer.api.impl.campaign.intel.events.ht.HTScavengerDataFactor; 018import com.fs.starfarer.api.impl.campaign.intel.events.ht.HyperspaceTopographyEventIntel; 019import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.Objectives; 020import com.fs.starfarer.api.impl.campaign.velfield.SlipstreamVisibilityManager; 021import com.fs.starfarer.api.util.Misc; 022import com.fs.starfarer.api.util.Misc.Token; 023 024/** 025 * For Hyperspace Topography ("HT") related tasks. 026 * 027 * HT_CMD <action> <parameters> 028 */ 029public class HT_CMD extends BaseCommandPlugin { 030 031 public static int CREDITS_PER_TD_POINT = 200; 032 033 public static float MIN_SCAVENGER_FP = 50; 034 public static float MAX_SCAVENGER_FP = 150; 035 036 037 public boolean execute(String ruleId, InteractionDialogAPI dialog, List<Token> params, Map<String, MemoryAPI> memoryMap) { 038 if (dialog == null) return false; 039 040 OptionPanelAPI options = dialog.getOptionPanel(); 041 TextPanelAPI text = dialog.getTextPanel(); 042 CampaignFleetAPI pf = Global.getSector().getPlayerFleet(); 043 CargoAPI cargo = pf.getCargo(); 044 045 SectorEntityToken entity = dialog.getInteractionTarget(); 046 if (entity == null) return false; 047 048 String action = params.get(0).getString(memoryMap); 049 050 MemoryAPI memory = memoryMap.get(MemKeys.LOCAL); 051 if (memory == null) return false; // should not be possible unless there are other big problems already 052 053 054 //MarketAPI market = dialog.getInteractionTarget().getMarket(); 055 StarSystemAPI system = null; 056 if (dialog.getInteractionTarget().getContainingLocation() instanceof StarSystemAPI) { 057 system = (StarSystemAPI) dialog.getInteractionTarget().getContainingLocation(); 058 } 059 060 //HyperspaceTopographyEventIntel intel = HyperspaceTopographyEventIntel.get(); 061 //if (intel == null) return false; 062 063 if ("hasRecentReadingsNearby".equals(action)) { 064 return HyperspaceTopographyEventIntel.hasRecentReadingsNearPlayer(); 065 } else if ("computeDataStats".equals(action)) { 066 if (entity instanceof CampaignFleetAPI) { 067 CampaignFleetAPI fleet = (CampaignFleetAPI) entity; 068 float fp = fleet.getFleetPoints(); 069 int cost = getDataCost(fp); 070 float range = getRevealRange(fp); 071 memory.set("$ht_dataCost", Misc.getWithDGS(cost)); 072 memory.set("$ht_dataRange", "" + (int) range); 073 return true; 074 } 075 return false; 076 } else if ("getScavengerData".equals(action)) { 077 if (entity instanceof CampaignFleetAPI) { 078 CampaignFleetAPI fleet = (CampaignFleetAPI) entity; 079 float fp = fleet.getFleetPoints(); 080 float range = getRevealRange(fp); 081 082 SlipstreamVisibilityManager.updateSlipstreamVisibility(entity.getLocationInHyperspace(), range); 083 084 int points = getDataPoints(fp); 085 boolean hasRecent = HyperspaceTopographyEventIntel.hasRecentReadingsNearPlayer(); 086 if (!hasRecent && points > 0) { 087 HyperspaceTopographyEventIntel.addFactorCreateIfNecessary(new HTScavengerDataFactor(points), dialog); 088 if (HyperspaceTopographyEventIntel.get() != null) { 089 HyperspaceTopographyEventIntel.get().addRecentReadings(entity.getLocationInHyperspace()); 090 } 091 } 092 return true; 093 } 094 return false; 095 } 096 097 return false; 098 } 099 100 101 102 public static int getDataCost(float fp) { 103 return getDataPoints(fp) * CREDITS_PER_TD_POINT; 104 } 105 106 public static int getRevealRange(float fp) { 107 float min = Objectives.BURST_RANGE_SCAVENGER_MIN; 108 float max = Objectives.BURST_RANGE_SCAVENGER_MAX; 109 110 float f = Math.max(fp - MIN_SCAVENGER_FP, 0) / (MAX_SCAVENGER_FP - MIN_SCAVENGER_FP); 111 if (f > 1f) f = 1f; 112 if (f < 0f) f = 0f; 113 114 int result = Math.round(min + (max - min) * f); 115 return result; 116 } 117 public static int getDataPoints(float fp) { 118 float min = HTPoints.SCAVENGER_MIN; 119 float max = HTPoints.SCAVENGER_MAX; 120 121 float f = Math.max(fp - MIN_SCAVENGER_FP, 0) / (MAX_SCAVENGER_FP - MIN_SCAVENGER_FP); 122 if (f > 1f) f = 1f; 123 if (f < 0f) f = 0f; 124 125 int result = Math.round(min + (max - min) * f); 126 return result; 127 } 128 129 130 131}