001package com.fs.starfarer.api.impl.campaign.intel.events;
002
003import com.fs.starfarer.api.Global;
004import com.fs.starfarer.api.campaign.comm.CommMessageAPI.MessageClickAction;
005import com.fs.starfarer.api.campaign.econ.EconomyAPI.EconomyUpdateListener;
006import com.fs.starfarer.api.campaign.econ.MarketAPI;
007import com.fs.starfarer.api.impl.campaign.econ.PiracyRespite;
008import com.fs.starfarer.api.impl.campaign.ids.Conditions;
009import com.fs.starfarer.api.impl.campaign.ids.Sounds;
010import com.fs.starfarer.api.impl.campaign.intel.BaseIntelPlugin;
011import com.fs.starfarer.api.impl.campaign.intel.MessageIntel;
012import com.fs.starfarer.api.util.Misc;
013
014public class PiracyRespiteScript implements EconomyUpdateListener {
015
016        public static String KEY = "$prs_ref";
017        
018        //public static float DURATION = 730;
019        public static float DURATION = -1f;
020        
021        public static PiracyRespiteScript get() {
022                //if (true) return null;
023                return (PiracyRespiteScript) Global.getSector().getMemoryWithoutUpdate().get(KEY);
024        }
025        
026        public static boolean playerHasPiracyRespite() {
027                return get() != null;
028        }
029        
030
031        protected long timestamp;
032        
033        public PiracyRespiteScript() {
034                sendGainedMessage();
035                
036                // to avoid duplicates
037                PiracyRespiteScript existing = get();
038                if (existing != null) {
039                        existing.resetTimestamp();
040                        return;
041                }
042                
043                resetTimestamp();
044                Global.getSector().getEconomy().addUpdateListener(this);
045                Global.getSector().getMemoryWithoutUpdate().set(KEY, this);
046                
047                economyUpdated();
048        }
049        
050        public void sendGainedMessage() {
051                MessageIntel msg = new MessageIntel();
052                msg.addLine("Piracy Respite gained", Misc.getBasePlayerColor());
053                if (!PiracyRespite.NEW_MODE) {
054                        msg.addLine(BaseIntelPlugin.BULLET + "Colonies receive %s accessibility", Misc.getTextColor(),
055                                        new String [] {"+" + (int)Math.round(PiracyRespite.ACCESSIBILITY_BONUS * 100f) + "%"},
056                                        Misc.getHighlightColor());
057                        if (DURATION > 0) {
058                                msg.addLine(BaseIntelPlugin.BULLET + "Lasts for %s days", Misc.getTextColor(),
059                                                new String [] {"" + (int)PiracyRespiteScript.DURATION},
060                                        Misc.getHighlightColor());
061                        }
062                } else {
063                        msg.addLine(BaseIntelPlugin.BULLET + "Reduced shipping disruptions", Misc.getTextColor());
064                }
065                msg.setIcon(Global.getSettings().getSpriteName("events", "piracy_respite"));
066                msg.setSound(Sounds.REP_GAIN);
067                Global.getSector().getCampaignUI().addMessage(msg, MessageClickAction.COLONY_INFO);
068        }
069        
070        public void sendExpiredMessage() {
071                MessageIntel msg = new MessageIntel();
072                msg.addLine("Piracy Respite expired", Misc.getBasePlayerColor());
073                msg.setIcon(Global.getSettings().getSpriteName("events", "piracy_respite"));
074                msg.setSound(Sounds.REP_LOSS);
075                Global.getSector().getCampaignUI().addMessage(msg, MessageClickAction.COLONY_INFO);
076        }
077
078        public void resetTimestamp() {
079                timestamp = Global.getSector().getClock().getTimestamp();               
080        }
081        
082        public float getDaysRemaining() {
083                if (DURATION < 0) return DURATION;
084                float rem = DURATION - Global.getSector().getClock().getElapsedDaysSince(timestamp);
085                //rem = 1f - Global.getSector().getClock().getElapsedDaysSince(timestamp);
086                if (rem < 0) rem = 0;
087                return rem;
088        }
089
090        public void commodityUpdated(String commodityId) {
091                
092        }
093
094        public void economyUpdated() {
095                //for (MarketAPI curr : Misc.getPlayerMarkets(false)) {
096                for (MarketAPI curr : Global.getSector().getEconomy().getMarketsCopy()) {
097                        if (curr.isPlayerOwned() && curr.getFaction() != null && curr.getFaction().isPlayerFaction()) {
098                                if (!curr.hasCondition(Conditions.PIRACY_RESPITE)) {
099                                        curr.addCondition(Conditions.PIRACY_RESPITE);
100                                }
101                        } else {
102                                if (curr.hasCondition(Conditions.PIRACY_RESPITE)) {
103                                        curr.removeCondition(Conditions.PIRACY_RESPITE);
104                                }
105                        }
106                }
107        }
108
109        public void cleanup() {
110                if (Global.getSector().getMemoryWithoutUpdate().contains(KEY)) {
111                        sendExpiredMessage();
112                }
113                Global.getSector().getMemoryWithoutUpdate().unset(KEY);
114                //for (MarketAPI curr : Misc.getPlayerMarkets(false)) {
115                for (MarketAPI curr : Global.getSector().getEconomy().getMarketsCopy()) {
116                        if (curr.hasCondition(Conditions.PIRACY_RESPITE)) {
117                                curr.removeCondition(Conditions.PIRACY_RESPITE);
118                        }
119                }
120        }
121        
122        public boolean isEconomyListenerExpired() {
123                if (DURATION < 0) return false;
124                
125                float days = getDaysRemaining();
126                if (days <= 0) {
127                        cleanup();
128                        return true;
129                }
130                return false;
131        }
132
133}
134
135
136