001package com.fs.starfarer.api.impl.campaign;
002
003import java.util.List;
004
005import com.fs.starfarer.api.EveryFrameScript;
006import com.fs.starfarer.api.Global;
007import com.fs.starfarer.api.campaign.CampaignFleetAPI;
008import com.fs.starfarer.api.campaign.SectorEntityToken.VisibilityLevel;
009import com.fs.starfarer.api.campaign.rules.MemoryAPI;
010import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
011import com.fs.starfarer.api.util.IntervalUtil;
012import com.fs.starfarer.api.util.Misc;
013
014public class TOffAlarm implements EveryFrameScript {
015        private IntervalUtil tracker = new IntervalUtil(0.05f, 0.1f);
016        private final CampaignFleetAPI fleet;
017        
018        public TOffAlarm(CampaignFleetAPI fleet) {
019                this.fleet = fleet;
020                notifyNearby();
021        }
022
023        public void advance(float amount) {
024                float days = Global.getSector().getClock().convertToDays(amount);
025                tracker.advance(days);
026                
027                
028                if (tracker.intervalElapsed()) {
029                        notifyNearby();
030                }
031        }
032        
033                
034        public void notifyNearby() {
035                CampaignFleetAPI playerFleet = Global.getSector().getPlayerFleet();
036                if (playerFleet == null) return;
037                
038                //VisibilityLevel playerVis = playerFleet.getVisibilityLevelTo(fleet);
039                //if (playerVis == VisibilityLevel.NONE) return;
040                if (fleet.getContainingLocation() == null) return;
041                
042                // don't spread "hostile" status if this fleet was the aggressor or if attacking it has a low
043                // reputation impact for some other reason
044                if (fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_LOW_REP_IMPACT) &&
045                                !fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.SPREAD_TOFF_HOSTILITY_IF_LOW_IMPACT)) {
046                        return;
047                }
048                
049                List<CampaignFleetAPI> fleets = fleet.getContainingLocation().getFleets();
050                for (CampaignFleetAPI other : fleets) {
051                        VisibilityLevel level = other.getVisibilityLevelTo(fleet);
052                        if (level == VisibilityLevel.NONE) continue;
053                        
054                        if (level == VisibilityLevel.COMPOSITION_AND_FACTION_DETAILS && other.getFaction() == fleet.getFaction()) {
055                                MemoryAPI mem = other.getMemoryWithoutUpdate();
056                                Misc.setFlagWithReason(mem, MemFlags.MEMORY_KEY_MAKE_HOSTILE_WHILE_TOFF, "tOffAlarm", true, 3f + (float) Math.random() * 3f);
057                        }
058                        
059//                      if (!other.hasScriptOfClass(TOffAlarm.class)) {
060//                              other.addScript(new TOffAlarm(otherFleet));
061//                      }
062                }
063        }
064
065        public boolean isDone() {
066                MemoryAPI mem = fleet.getMemoryWithoutUpdate();
067                if (mem.getBoolean(MemFlags.MEMORY_KEY_LOW_REP_IMPACT) &&
068                                !fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.SPREAD_TOFF_HOSTILITY_IF_LOW_IMPACT)) {
069                        return true;
070                }
071                return !(mem.is(MemFlags.MEMORY_KEY_SAW_PLAYER_WITH_TRANSPONDER_OFF, true) &&
072                           mem.is(MemFlags.MEMORY_KEY_MAKE_HOSTILE_WHILE_TOFF, true));
073        }
074
075        public boolean runWhilePaused() {
076                return false;
077        }
078
079}