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