001package com.fs.starfarer.api.impl.campaign.shared; 002 003import java.util.ArrayList; 004import java.util.LinkedHashMap; 005import java.util.Map; 006 007import org.apache.log4j.Logger; 008 009import com.fs.starfarer.api.Global; 010import com.fs.starfarer.api.util.IntervalUtil; 011import com.fs.starfarer.api.util.Misc; 012 013public class PlayerTradeProfitabilityData { 014 public static Logger log = Global.getLogger(PlayerTradeProfitabilityData.class); 015 016 public static class CommodityData { 017 private String commodityId; 018 private float totalPrice; 019 private float quantity; 020 021 public float getQuantity() { 022 return quantity; 023 } 024 public void setQuantity(float quantity) { 025 this.quantity = quantity; 026 } 027 public CommodityData(String commodityId) { 028 this.commodityId = commodityId; 029 } 030 public String getCommodityId() { 031 return commodityId; 032 } 033 public void setCommodityId(String commodityId) { 034 this.commodityId = commodityId; 035 } 036 public float getTotalPrice() { 037 return totalPrice; 038 } 039 public void setTotalPrice(float totalPrice) { 040 this.totalPrice = totalPrice; 041 } 042 } 043 044 private Map<String, CommodityData> dataBought = new LinkedHashMap<String, CommodityData>(); 045 private IntervalUtil tracker; 046 047 private long accruedXP = 0; 048 049 public PlayerTradeProfitabilityData() { 050 tracker = Misc.createEconIntervalTracker(); 051 } 052 053 public void reportNetBought(String commodityId, float quantity, float totalPrice) { 054 CommodityData data = getBoughtDataFor(commodityId); 055 data.setQuantity(data.getQuantity() + quantity); 056 data.setTotalPrice(data.getTotalPrice() + totalPrice); 057 } 058 059 public void reportNetSold(String commodityId, float quantity, float totalPrice) { 060 CommodityData data = getBoughtDataFor(commodityId); 061 if (data.getQuantity() < 1 || quantity < 1) return; 062 float avgBuyPrice = data.getTotalPrice() / data.getQuantity(); 063 064 float net = quantity; 065 if (quantity > data.getQuantity()) net = data.getQuantity(); 066 data.setQuantity(data.getQuantity() - net); 067 068 if (net < 1) return; 069 070 float paidForNet = avgBuyPrice * net; 071 data.setTotalPrice(Math.max(0, data.getTotalPrice() - paidForNet)); 072 073 float receivedForNet = net * totalPrice / quantity; 074 075 float profit = receivedForNet - paidForNet; 076 if (profit <= 0) return; 077 078 float xpPerCredit = Global.getSettings().getFloat("economyPlayerXPPerCreditOfProfit"); 079 080 long xp = (long) (profit * xpPerCredit); 081 082 accruedXP += xp; 083 084 log.info("Player accrued " + xp + " xp for selling " + commodityId + " (profit per unit: " + (int) (profit / net) + ")"); 085 } 086 087 088 089 public void advance(float days) { 090 tracker.advance(days); 091 if (tracker.intervalElapsed()) { 092 float factor = Misc.getGenericRollingAverageFactor(); 093 for (CommodityData cd : new ArrayList<CommodityData>(dataBought.values())) { 094 cd.setQuantity(cd.getQuantity() * factor); 095 cd.setTotalPrice(cd.getTotalPrice() * factor); 096 if (cd.getQuantity() < 1) dataBought.remove(cd.getCommodityId()); 097 } 098 } 099 } 100 101 public CommodityData getBoughtDataFor(String commodityId) { 102 CommodityData cd = dataBought.get(commodityId); 103 if (cd == null) { 104 cd = new CommodityData(commodityId); 105 dataBought.put(commodityId, cd); 106 } 107 return cd; 108 } 109 110 public long getAccruedXP() { 111 return accruedXP; 112 } 113 114 public void setAccruedXP(long accruedXP) { 115 this.accruedXP = accruedXP; 116 } 117} 118 119 120 121 122 123 124 125 126 127 128