001package com.fs.starfarer.api.impl.campaign.shared;
002
003import java.util.ArrayList;
004import java.util.HashMap;
005import java.util.LinkedHashMap;
006import java.util.List;
007import java.util.Map;
008
009import com.fs.starfarer.api.Global;
010import com.fs.starfarer.api.campaign.CampaignFleetAPI;
011import com.fs.starfarer.api.campaign.econ.MarketAPI;
012import com.fs.starfarer.api.campaign.econ.SubmarketAPI;
013
014public class PlayerActivityTracker {
015
016        public static class FleetStatsSnapshot implements Cloneable {
017                private float fleetPoints;
018                private float cargoOnBoard;
019                private float cargoCapacity;
020                private float fuelOnBoard;
021                private float fuelCapacity;
022                private float numShips;
023                private float fleetSizeNum;
024                
025                public void update() {
026                        CampaignFleetAPI pf = Global.getSector().getPlayerFleet();
027                        fleetPoints = pf.getFleetPoints();
028                        cargoOnBoard = pf.getCargo().getSpaceUsed();
029                        cargoCapacity = pf.getCargo().getMaxCapacity();
030                        fuelOnBoard = pf.getCargo().getFuel();
031                        fuelCapacity = pf.getCargo().getMaxFuel();
032                        numShips = pf.getFleetData().getMembersListCopy().size();
033                        fleetSizeNum = pf.getFleetSizeCount();
034                }
035                @Override
036                public FleetStatsSnapshot clone() {
037                        try {
038                                return (FleetStatsSnapshot) super.clone();
039                        } catch (CloneNotSupportedException e) {
040                                throw new RuntimeException(e);
041                        }
042                }
043                
044                public float getFleetPoints() {
045                        return fleetPoints;
046                }
047                public void setFleetPoints(float fleetPoints) {
048                        this.fleetPoints = fleetPoints;
049                }
050                public float getCargoOnBoard() {
051                        return cargoOnBoard;
052                }
053                public void setCargoOnBoard(float cargoOnBoard) {
054                        this.cargoOnBoard = cargoOnBoard;
055                }
056                public float getCargoCapacity() {
057                        return cargoCapacity;
058                }
059                public void setCargoCapacity(float cargoCapacity) {
060                        this.cargoCapacity = cargoCapacity;
061                }
062                public float getFuelOnBoard() {
063                        return fuelOnBoard;
064                }
065                public void setFuelOnBoard(float fuelOnBoard) {
066                        this.fuelOnBoard = fuelOnBoard;
067                }
068                public float getFuelCapacity() {
069                        return fuelCapacity;
070                }
071                public void setFuelCapacity(float fuelCapacity) {
072                        this.fuelCapacity = fuelCapacity;
073                }
074                public float getNumShips() {
075                        return numShips;
076                }
077                public void setNumShips(float numShips) {
078                        this.numShips = numShips;
079                }
080                public float getFleetSizeNum() {
081                        return fleetSizeNum;
082                }
083                public void setFleetSizeNum(float fleetSizeNum) {
084                        this.fleetSizeNum = fleetSizeNum;
085                }
086        }
087        
088        
089        private Map<MarketAPI, Long> lastVisit = new HashMap<MarketAPI, Long>();
090        private Map<SubmarketAPI, PlayerTradeDataForSubmarket> submarketTradeData = new LinkedHashMap<SubmarketAPI, PlayerTradeDataForSubmarket>();
091        private PlayerTradeProfitabilityData profitabilityData = new PlayerTradeProfitabilityData();
092        private ReputationChangeTracker repChangeTracker = new ReputationChangeTracker();
093        private FleetStatsSnapshot playerFleetStats = new FleetStatsSnapshot();
094        
095        protected Object readResolve() {
096                if (profitabilityData == null) {
097                        profitabilityData = new PlayerTradeProfitabilityData();
098                }
099                if (repChangeTracker == null) {
100                        repChangeTracker = new ReputationChangeTracker();
101                }
102                if (playerFleetStats == null) {
103                        playerFleetStats = new FleetStatsSnapshot();
104                }
105                return this;
106        }
107        
108        public void advance(float days) {
109                //submarketTradeData.clear();
110                List<SubmarketAPI> remove = new ArrayList<SubmarketAPI>();
111                for (PlayerTradeDataForSubmarket data : submarketTradeData.values()) {
112                        data.advance(days);
113                        
114                        MarketAPI market = Global.getSector().getEconomy().getMarket(data.getMarket().getId());
115                        if (market == null || market.getSubmarket(data.getSubmarket().getSpecId()) == null ||
116                                        market.getSubmarket(data.getSubmarket().getSpecId()) != data.getSubmarket()) {
117                                remove.add(data.getSubmarket());
118                        }
119                }
120                
121                for (SubmarketAPI sub : remove) {
122                        submarketTradeData.remove(sub);
123                }
124                
125                List<MarketAPI> remove2 = new ArrayList<MarketAPI>();
126                for (MarketAPI curr : lastVisit.keySet()) {
127                        if (curr.getPrimaryEntity() == null || !curr.getPrimaryEntity().isAlive()) {
128                                remove2.add(curr);
129                        }
130                }
131                for (MarketAPI curr : remove2) {
132                        lastVisit.remove(curr);
133                }
134                
135                profitabilityData.advance(days);
136                
137                repChangeTracker.advance(days);
138                
139                playerFleetStats.update();
140        }
141        
142        public ReputationChangeTracker getRepChangeTracker() {
143                return repChangeTracker;
144        }
145
146
147        public PlayerTradeProfitabilityData getProfitabilityData() {
148                return profitabilityData;
149        }
150
151        public void updateLastVisit(MarketAPI market) {
152                Long timestamp = Global.getSector().getClock().getTimestamp();
153                lastVisit.put(market, timestamp);
154        }
155        
156        public float getDaysSinceLastVisitTo(MarketAPI market) {
157                Long timestamp = lastVisit.get(market);
158                if (timestamp == null) return 10000f;
159                return Global.getSector().getClock().getElapsedDaysSince(timestamp);
160        }
161        
162        
163        public PlayerTradeDataForSubmarket getPlayerTradeData(SubmarketAPI submarket) {
164                PlayerTradeDataForSubmarket data = submarketTradeData.get(submarket);
165                if (data == null) {
166                        data = new PlayerTradeDataForSubmarket(submarket);
167                        submarketTradeData.put(submarket, data);
168                }
169                return data;
170        }
171        
172
173        public FleetStatsSnapshot getPlayerFleetStats() {
174                return playerFleetStats;
175        }
176
177        public Map<SubmarketAPI, PlayerTradeDataForSubmarket> getSubmarketTradeData() {
178                return submarketTradeData;
179        }
180        
181        
182}