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