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}