001package com.fs.starfarer.api.impl.campaign.shared;
002
003import org.apache.log4j.Logger;
004
005import com.fs.starfarer.api.Global;
006import com.fs.starfarer.api.campaign.BaseCampaignEventListener;
007import com.fs.starfarer.api.campaign.BattleAPI;
008import com.fs.starfarer.api.campaign.CampaignFleetAPI;
009import com.fs.starfarer.api.campaign.StarSystemAPI;
010import com.fs.starfarer.api.util.IntervalUtil;
011import com.fs.starfarer.api.util.Misc;
012import com.fs.starfarer.api.util.RollingAverageTracker;
013import com.fs.starfarer.api.util.TimeoutTracker;
014
015public class StarSystemActivityTracker extends BaseCampaignEventListener {
016
017        public static Logger log = Global.getLogger(StarSystemActivityTracker.class);
018        public static final float ROLLING_AVG_FACTOR = 0.5f;
019        
020        private float econInterval = Global.getSettings().getFloat("economyIntervalnGameDays");
021        
022        private IntervalUtil timer = new IntervalUtil(0.25f, .75f);
023        private TimeoutTracker<String> seen = new TimeoutTracker<String>();
024        private StarSystemAPI system;
025        
026        private RollingAverageTracker points, fleets, ships;
027        
028        public StarSystemActivityTracker(StarSystemAPI system) {
029                super(false);
030                
031                this.system = system;
032                
033                points = new RollingAverageTracker(econInterval - Math.min(econInterval * 0.5f, 2f),
034                                                                                   econInterval +  - Math.min(econInterval * 0.5f, 2f),
035                                                                                   ROLLING_AVG_FACTOR);
036                fleets = new RollingAverageTracker(econInterval - Math.min(econInterval * 0.5f, 2f),
037                                                                                   econInterval +  - Math.min(econInterval * 0.5f, 2f),
038                                                                                   ROLLING_AVG_FACTOR);
039                ships = new RollingAverageTracker(econInterval - Math.min(econInterval * 0.5f, 2f),
040                                                                                   econInterval +  - Math.min(econInterval * 0.5f, 2f),
041                                                                                   ROLLING_AVG_FACTOR);
042        }
043
044        
045        Object readResolve() {
046                return this;
047        }
048        
049        Object writeReplace() {
050                return this;
051        }
052        
053        public void advance(float days) {
054                seen.advance(days);
055                
056                timer.advance(days);
057                if (timer.intervalElapsed()) {
058                        for (CampaignFleetAPI fleet : system.getFleets()) {
059                                if (!seen.contains(fleet.getId())) {
060                                        seen.set(fleet.getId(), econInterval);
061                                        
062                                        points.add(fleet.getFleetPoints());
063                                        ships.add(fleet.getFleetData().getMembersListCopy().size());
064                                        fleets.add(1);
065                                }
066                        }
067                        
068                        for (CampaignFleetAPI fleet : Global.getSector().getHyperspace().getFleets()) {
069                                float dist = Misc.getDistance(fleet.getLocation(), system.getLocation());
070                                //if (!seen.contains(fleet) && dist < 1000) {
071                                if (!seen.contains(fleet.getId()) && dist < Global.getSettings().getFloat("commRelayRangeAroundSystem")) {
072                                        seen.set(fleet.getId(), econInterval);
073                                        
074                                        points.add(fleet.getFleetPoints());
075                                        ships.add(fleet.getFleetData().getMembersListCopy().size());
076                                        fleets.add(1);
077                                }
078                        }
079                }
080
081                points.advance(days);
082                fleets.advance(days);
083                ships.advance(days);
084
085        }
086        
087        
088
089        public StarSystemAPI getSystem() {
090                return system;
091        }
092
093        public float getPointsSeen() {
094                return points.getAverage();
095        }
096
097        public float getFleetsSeen() {
098                return fleets.getAverage();
099        }
100
101        public float getShipsSeen() {
102                return ships.getAverage();
103        }
104
105        @Override
106        public void reportBattleOccurred(CampaignFleetAPI primaryWinner, BattleAPI battle) {
107
108//              if (!primaryWinner.isInOrNearSystem(system)) return;
109//              
110//              int minSize = 4;
111//              
112//              //for (MarketAPI market : Global.getSector().getEconomy().getMarketsCopy()) {
113//              for (MarketAPI market : Misc.getMarketsInLocation(system)) {
114//                      if (market.getSize() < minSize) continue;
115//                      
116//                      if (market.getFaction().getCustom().optBoolean(Factions.CUSTOM_POSTS_NO_BOUNTIES)) {
117//                              continue;
118//                      }
119//                      
120//                      for (CampaignFleetAPI winner : battle.getSnapshotSideFor(primaryWinner)) {
121//                              increaseBountyProbability(winner, market);
122//                      }
123//                      
124//                      for (CampaignFleetAPI loser : battle.getOtherSideSnapshotFor(primaryWinner)) {
125//                              increaseBountyProbability(loser, market);
126//                      }
127//              }
128        }
129        
130        
131//      private void increaseBountyProbability(CampaignFleetAPI fleetWithLosses, MarketAPI market) {
132//              CampaignEventManagerAPI eventManager = Global.getSector().getEventManager();
133//              EventProbabilityAPI ep = eventManager.getProbability(Events.SYSTEM_BOUNTY, market);
134//              if (!eventManager.isOngoing(ep)) {
135//                      float fpLost = Misc.getSnapshotFPLost(fleetWithLosses);
136//                      if (fpLost < 10) fpLost = 10;
137//                      float fpSeen = points.getAverage();
138//                      if (fpSeen < 1) fpSeen = 1;
139//                      float f = fpLost / fpSeen;
140//                      if (f > 1) f = 1;
141//                      //float probabilityIncrease = f * 10f;
142//                      float probabilityIncrease = f * 0.05f;
143//                      if (probabilityIncrease > 0) {
144//                              ep.increaseProbability(probabilityIncrease);
145//                              log.info("Increasing system bounty probability for " + market.getName() + " by " + probabilityIncrease + ", is now " + ep.getProbability());
146//                      }
147//              }
148//      }
149}
150
151
152
153
154
155
156
157
158