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