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