001package com.fs.starfarer.api.impl.campaign.econ; 002 003import java.util.Iterator; 004import java.util.LinkedHashSet; 005 006import com.fs.starfarer.api.campaign.SectorEntityToken; 007import com.fs.starfarer.api.campaign.econ.MarketAPI; 008import com.fs.starfarer.api.campaign.econ.MarketConditionAPI; 009import com.fs.starfarer.api.impl.campaign.ids.Conditions; 010import com.fs.starfarer.api.impl.campaign.ids.MemFlags; 011import com.fs.starfarer.api.impl.campaign.ids.Tags; 012 013 014 015public class CommRelayCondition extends BaseMarketConditionPlugin { 016 017 public static String COMM_RELAY_MOD_ID = "core_comm_relay"; 018 019 public static float NO_RELAY_PENALTY = -1f; 020 public static float COMM_RELAY_BONUS = 2f; 021 public static float MAKESHIFT_COMM_RELAY_BONUS = 1f; 022 023 public static CommRelayCondition get(MarketAPI market) { 024 MarketConditionAPI mc = market.getCondition(Conditions.COMM_RELAY); 025 if (mc != null && mc.getPlugin() instanceof CommRelayCondition) { 026 return (CommRelayCondition) mc.getPlugin(); 027 } 028 return null; 029 } 030 031 032 033 protected LinkedHashSet<SectorEntityToken> relays = new LinkedHashSet<SectorEntityToken>(); 034 035 public LinkedHashSet<SectorEntityToken> getRelays() { 036 return relays; 037 } 038 039 @Override 040 public void advance(float amount) { 041 Iterator<SectorEntityToken> iter = relays.iterator(); 042 while (iter.hasNext()) { 043 SectorEntityToken relay = iter.next(); 044 if (!relay.isAlive() || relay.getContainingLocation() != market.getContainingLocation()) { 045 iter.remove(); 046 } 047 } 048 if (relays.isEmpty()) { 049 market.removeSpecificCondition(condition.getIdForPluginModifications()); 050 } 051 } 052 053 protected boolean isMakeshift(SectorEntityToken relay) { 054 return relay.hasTag(Tags.MAKESHIFT); 055 } 056 057 protected SectorEntityToken getBestRelay() { 058 if (market.getContainingLocation() == null) return null; 059 060 SectorEntityToken best = null; 061 for (SectorEntityToken relay : relays) { 062 if (relay.getMemoryWithoutUpdate().getBoolean(MemFlags.OBJECTIVE_NON_FUNCTIONAL)) { 063 continue; 064 } 065 if (relay.getFaction() == market.getFaction()) { 066 if (best == null || (isMakeshift(best) && !isMakeshift(relay))) { 067 best = relay; 068 } 069 } 070 } 071 return best; 072 } 073 074 075 public void apply(String id) { 076 SectorEntityToken relay = getBestRelay(); 077 if (relay == null) { 078 unapply(id); 079 return; 080 } 081 082 if (isMakeshift(relay)) { 083 market.getStability().modifyFlat(COMM_RELAY_MOD_ID, MAKESHIFT_COMM_RELAY_BONUS, "Makeshift comm relay"); 084 } else { 085 market.getStability().modifyFlat(COMM_RELAY_MOD_ID, COMM_RELAY_BONUS, "Comm relay"); 086 } 087 088 } 089 090 public void unapply(String id) { 091 market.getStability().unmodifyFlat(COMM_RELAY_MOD_ID); 092 } 093 094 @Override 095 public boolean showIcon() { 096 return false; 097 } 098} 099 100 101 102 103