001package com.fs.starfarer.api.impl.campaign.rulecmd; 002 003import java.util.List; 004import java.util.Map; 005 006import com.fs.starfarer.api.Global; 007import com.fs.starfarer.api.campaign.CampaignFleetAPI; 008import com.fs.starfarer.api.campaign.InteractionDialogAPI; 009import com.fs.starfarer.api.campaign.SectorEntityToken.VisibilityLevel; 010import com.fs.starfarer.api.campaign.rules.MemoryAPI; 011import com.fs.starfarer.api.fleet.FleetMemberAPI; 012import com.fs.starfarer.api.impl.campaign.ids.MemFlags; 013import com.fs.starfarer.api.util.Misc; 014import com.fs.starfarer.api.util.Misc.Token; 015 016/** 017 * IsSeenByPatrols <factionId> <patrolMustCareAboutTransponder> 018 */ 019public class IsSeenByPatrols extends BaseCommandPlugin { 020 021 public boolean execute(String ruleId, InteractionDialogAPI dialog, List<Token> params, Map<String, MemoryAPI> memoryMap) { 022 023 //if (true) return false; 024 025 String factionId = params.get(0).getString(memoryMap); 026 027 boolean patrolMustCareAboutTransponder = false; 028 if (params.size() > 1) { 029 patrolMustCareAboutTransponder = params.get(1).getBoolean(memoryMap); 030 } 031 //float range = Global.getSettings().getFloat("sensorRangeMax"); 032 033 CampaignFleetAPI playerFleet = Global.getSector().getPlayerFleet(); 034 035 for (CampaignFleetAPI fleet : playerFleet.getContainingLocation().getFleets()) { 036 if (!fleet.getFaction().getId().equals(factionId)) continue; 037 if (fleet.getFaction().isPlayerFaction()) continue; 038 if (fleet.getBattle() != null) continue; 039 040 if (patrolMustCareAboutTransponder && !Misc.caresAboutPlayerTransponder(fleet)) continue; 041// float dist = Misc.getDistance(playerFleet.getLocation(), fleet.getLocation()) - playerFleet.getRadius() - fleet.getRadius(); 042// if (dist > range) continue; 043 044 VisibilityLevel level = playerFleet.getVisibilityLevelTo(fleet); 045 MemoryAPI mem = fleet.getMemoryWithoutUpdate(); 046 if (!mem.contains(MemFlags.MEMORY_KEY_SAW_PLAYER_WITH_TRANSPONDER_OFF) && 047 !mem.contains(MemFlags.MEMORY_KEY_PURSUE_PLAYER)) { 048 if (level == VisibilityLevel.NONE) continue; 049 } 050 051 float dist = Misc.getDistance(fleet.getLocation(), playerFleet.getLocation()); 052 if (dist > 1000f) continue; 053 054 if (isPatrol(fleet)) return true; 055 } 056 057 return false; 058 } 059 060 private boolean isPatrol(CampaignFleetAPI fleet) { 061 if (!fleet.getMemoryWithoutUpdate().contains(MemFlags.MEMORY_KEY_PATROL_FLEET)) { 062 return false; 063 } 064 065 for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) { 066 if (!member.isCivilian()) return true; 067 } 068 069 return false; 070 } 071} 072 073 074 075