001package com.fs.starfarer.api.impl.campaign.shared;
002
003import java.util.HashMap;
004import java.util.Map;
005
006import com.fs.starfarer.api.Global;
007import com.fs.starfarer.api.campaign.FactionAPI;
008import com.fs.starfarer.api.impl.campaign.ids.Factions;
009
010public class ReputationChangeTracker {
011        public static class ReputationChangeData {
012                private long lastPositiveChange;
013                private long lastNegativeChange;
014                private float lastValue;
015                
016                public long getLastPositiveChange() {
017                        return lastPositiveChange;
018                }
019                public void setLastPositiveChange(long lastChange) {
020                        this.lastPositiveChange = lastChange;
021                }
022                public float getLastValue() {
023                        return lastValue;
024                }
025                public void setLastValue(float lastValue) {
026                        this.lastValue = lastValue;
027                }
028                public long getLastNegativeChange() {
029                        return lastNegativeChange;
030                }
031                public void setLastNegativeChange(long lastNegativeChange) {
032                        this.lastNegativeChange = lastNegativeChange;
033                }
034        }
035        
036        private Map<String, ReputationChangeData> repData = new HashMap<String, ReputationChangeData>();
037        
038        public void advance(float days) {
039                
040                for (FactionAPI faction : Global.getSector().getAllFactions()) {
041                        if (faction.isPlayerFaction()) continue;
042                
043                        ReputationChangeData data = getDataFor(faction.getId());
044                        float rep = faction.getRelationship(Factions.PLAYER);
045                        if (data.getLastValue() != rep) {
046                                if (data.getLastValue() > rep) {
047                                        data.setLastNegativeChange(Global.getSector().getClock().getTimestamp());
048                                } else {
049                                        data.setLastPositiveChange(Global.getSector().getClock().getTimestamp());
050                                }
051                                data.setLastValue(rep);
052                        }
053                }
054        }
055        
056        public float getDaysSinceLastPositiveChange(String factionId) {
057                ReputationChangeData data = getDataFor(factionId);
058                return Global.getSector().getClock().getElapsedDaysSince(data.getLastPositiveChange());
059        }
060        public float getDaysSinceLastNegativeChange(String factionId) {
061                ReputationChangeData data = getDataFor(factionId);
062                return Global.getSector().getClock().getElapsedDaysSince(data.getLastPositiveChange());
063        }
064        
065        public ReputationChangeData getDataFor(String factionId) {
066                ReputationChangeData data = repData.get(factionId);
067                if (data == null) {
068                        data = new ReputationChangeData();
069                        FactionAPI faction = Global.getSector().getFaction(factionId);
070                        float rep = faction.getRelationship(Factions.PLAYER);
071                        data.setLastValue(rep);
072                        data.setLastPositiveChange(Global.getSector().getClock().getTimestamp());
073                        data.setLastNegativeChange(Global.getSector().getClock().getTimestamp());
074                        repData.put(factionId, data);
075                }
076                return data;
077        }
078}
079
080
081
082
083
084
085
086
087
088
089