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}