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