001package com.fs.starfarer.api.impl.campaign.procgen.themes; 002 003import java.util.List; 004import java.util.Random; 005 006import org.lwjgl.util.vector.Vector2f; 007 008import com.fs.starfarer.api.Global; 009import com.fs.starfarer.api.campaign.CampaignFleetAPI; 010import com.fs.starfarer.api.campaign.FleetAssignment; 011import com.fs.starfarer.api.campaign.SectorEntityToken; 012import com.fs.starfarer.api.campaign.StarSystemAPI; 013import com.fs.starfarer.api.campaign.SectorEntityToken.VisibilityLevel; 014import com.fs.starfarer.api.campaign.ai.CampaignFleetAIAPI.EncounterOption; 015import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteData; 016import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteSegment; 017import com.fs.starfarer.api.impl.campaign.ids.Factions; 018import com.fs.starfarer.api.impl.campaign.ids.MemFlags; 019import com.fs.starfarer.api.util.IntervalUtil; 020import com.fs.starfarer.api.util.Misc; 021 022public class ScavengerFleetAssignmentAI extends RouteFleetAssignmentAI { 023 024 protected boolean pirate; 025 protected IntervalUtil piracyCheck = new IntervalUtil(0.2f, 0.4f); 026 public ScavengerFleetAssignmentAI(CampaignFleetAPI fleet, RouteData route, boolean pirate) { 027 super(fleet, route); 028 this.pirate = pirate; 029 } 030 031 @Override 032 protected String getTravelActionText(RouteSegment segment) { 033 //if (segment.systemTo == route.getMarket().getContainingLocation()) { 034 if (segment.to == route.getMarket().getPrimaryEntity()) { 035 return "returning to " + route.getMarket().getName(); 036 } 037 return "on a salvage expedition"; 038 } 039 040 @Override 041 protected String getInSystemActionText(RouteSegment segment) { 042 return "exploring"; 043 } 044 045 046 @Override 047 protected void addLocalAssignment(RouteSegment segment, boolean justSpawned) { 048 //boolean pickSpecificEntity = (float) Math.random() > 0.2f && segment.systemFrom instanceof StarSystemAPI; 049 boolean pickSpecificEntity = (float) Math.random() > 0.2f && !segment.from.getContainingLocation().isHyperspace(); 050 if (pickSpecificEntity) { 051 SectorEntityToken target = RemnantSeededFleetManager.pickEntityToGuard(new Random(), (StarSystemAPI) segment.from.getContainingLocation(), fleet); 052 if (target != null) { 053 if (justSpawned) { 054 Vector2f loc = Misc.getPointAtRadius(new Vector2f(target.getLocation()), 500); 055 fleet.setLocation(loc.x, loc.y); 056 } 057 058 float speed = Misc.getSpeedForBurnLevel(8); 059 float dist = Misc.getDistance(fleet.getLocation(), target.getLocation()); 060 float seconds = dist / speed; 061 float days = seconds / Global.getSector().getClock().getSecondsPerDay(); 062 days += 5f + 5f * (float) Math.random(); 063 fleet.addAssignment(FleetAssignment.PATROL_SYSTEM, target, days, "investigating"); 064 return; 065 } else { 066 if (justSpawned) { 067 Vector2f loc = Misc.getPointAtRadius(new Vector2f(), 8000); 068 fleet.setLocation(loc.x, loc.y); 069 } 070 071 float days = 5f + 5f * (float) Math.random(); 072 fleet.addAssignment(FleetAssignment.PATROL_SYSTEM, null, days, "exploring"); 073 } 074 } else { 075 super.addLocalAssignment(segment, justSpawned); 076 } 077 } 078 079 080 @Override 081 public void advance(float amount) { 082 super.advance(amount); 083 084 if (pirate) { 085 float days = Global.getSector().getClock().convertToDays(amount); 086 piracyCheck.advance(days); 087 if (piracyCheck.intervalElapsed()) { 088 doPiracyCheck(); 089 } 090 } 091 } 092 093 protected void doPiracyCheck() { 094 if (fleet.getBattle() != null) return; 095 096 097 boolean isCurrentlyPirate = fleet.getFaction().getId().equals(Factions.PIRATES); 098 099 if (fleet.isTransponderOn() && !isCurrentlyPirate) { 100 return; 101 } 102 103 if (isCurrentlyPirate) { 104 List<CampaignFleetAPI> visible = Misc.getVisibleFleets(fleet, false); 105 if (visible.isEmpty()) { 106 fleet.setFaction(Factions.INDEPENDENT, true); 107 Misc.clearTarget(fleet, true); 108 } 109 return; 110 } 111 112 List<CampaignFleetAPI> visible = Misc.getVisibleFleets(fleet, false); 113 if (visible.size() == 1) { 114 int weakerCount = 0; 115 for (CampaignFleetAPI other : visible) { 116 if (fleet.getAI() != null && 117 Global.getSector().getFaction(Factions.PIRATES).isHostileTo(other.getFaction())) { 118 EncounterOption option = fleet.getAI().pickEncounterOption(null, other, true); 119 if (option == EncounterOption.ENGAGE || option == EncounterOption.HOLD) { 120 float dist = Misc.getDistance(fleet.getLocation(), other.getLocation()); 121 VisibilityLevel level = other.getVisibilityLevelTo(fleet); 122 boolean seesComp = level == VisibilityLevel.COMPOSITION_AND_FACTION_DETAILS || 123 level == VisibilityLevel.COMPOSITION_DETAILS; 124 if (dist < 800f && seesComp) { 125 weakerCount++; 126 } 127 } 128 } 129 } 130 131 if (weakerCount == 1) { 132 fleet.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_PIRATE, true); 133 fleet.setNoFactionInName(true); 134 fleet.setFaction(Factions.PIRATES, true); 135 } 136 } 137 138 } 139 140 141 142 143 144} 145 146 147 148 149 150 151 152 153 154