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}