001package com.fs.starfarer.api.impl.campaign.procgen.themes; 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.ai.CampaignFleetAIAPI.EncounterOption; 010import com.fs.starfarer.api.impl.campaign.ids.Factions; 011import com.fs.starfarer.api.impl.campaign.ids.MemFlags; 012import com.fs.starfarer.api.util.IntervalUtil; 013import com.fs.starfarer.api.util.Misc; 014 015public class ScavengerPiracyScript implements EveryFrameScript { 016 017 protected IntervalUtil piracyCheck = new IntervalUtil(0.2f, 0.4f); 018 protected CampaignFleetAPI fleet; 019 public ScavengerPiracyScript(CampaignFleetAPI fleet) { 020 this.fleet = fleet; 021 } 022 023 public void advance(float amount) { 024 float days = Global.getSector().getClock().convertToDays(amount); 025 piracyCheck.advance(days); 026 if (piracyCheck.intervalElapsed()) { 027 doPiracyCheck(); 028 } 029 } 030 031 protected void doPiracyCheck() { 032 if (fleet.getBattle() != null) return; 033 034 035 boolean isCurrentlyPirate = fleet.getFaction().getId().equals(Factions.PIRATES); 036 037 if (fleet.isTransponderOn() && !isCurrentlyPirate) { 038 return; 039 } 040 041 if (isCurrentlyPirate) { 042 List<CampaignFleetAPI> visible = Misc.getVisibleFleets(fleet, false); 043 if (visible.isEmpty()) { 044 fleet.setFaction(Factions.INDEPENDENT, true); 045 Misc.clearTarget(fleet, true); 046 } 047 return; 048 } 049 050 List<CampaignFleetAPI> visible = Misc.getVisibleFleets(fleet, false); 051 if (visible.size() == 1) { 052 int weakerCount = 0; 053 for (CampaignFleetAPI other : visible) { 054 if (fleet.getAI() != null && 055 Global.getSector().getFaction(Factions.PIRATES).isHostileTo(other.getFaction())) { 056 EncounterOption option = fleet.getAI().pickEncounterOption(null, other, true); 057 if (option == EncounterOption.ENGAGE || option == EncounterOption.HOLD) { 058 float dist = Misc.getDistance(fleet.getLocation(), other.getLocation()); 059 VisibilityLevel level = other.getVisibilityLevelTo(fleet); 060 boolean seesComp = level == VisibilityLevel.COMPOSITION_AND_FACTION_DETAILS || 061 level == VisibilityLevel.COMPOSITION_DETAILS; 062 if (dist < 800f && seesComp) { 063 weakerCount++; 064 } 065 } 066 } 067 } 068 069 if (weakerCount == 1) { 070 fleet.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_PIRATE, true); 071 fleet.setNoFactionInName(true); 072 fleet.setFaction(Factions.PIRATES, true); 073 } 074 } 075 076 } 077 078 public boolean isDone() { 079 return false; 080 } 081 082 public boolean runWhilePaused() { 083 return false; 084 } 085 086 087 088 089 090} 091 092 093 094 095 096 097 098 099 100