001package com.fs.starfarer.api.impl.campaign.enc; 002 003import java.util.Random; 004 005import org.lwjgl.util.vector.Vector2f; 006 007import com.fs.starfarer.api.campaign.CampaignFleetAPI; 008import com.fs.starfarer.api.campaign.FleetAssignment; 009import com.fs.starfarer.api.campaign.SectorEntityToken; 010import com.fs.starfarer.api.campaign.StarSystemAPI; 011import com.fs.starfarer.api.impl.campaign.ids.FleetTypes; 012import com.fs.starfarer.api.impl.campaign.missions.hub.MissionFleetAutoDespawn; 013import com.fs.starfarer.api.impl.campaign.procgen.themes.RuinsFleetRouteManager; 014import com.fs.starfarer.api.impl.campaign.procgen.themes.ScavengerPiracyScript; 015import com.fs.starfarer.api.util.Misc; 016import com.fs.starfarer.api.util.WeightedRandomPicker; 017 018public class SlipstreamScavengerEPEC extends BaseEPEncounterCreator { 019 020 @Override 021 public void createEncounter(EncounterManager manager, EncounterPoint point) { 022 Random random = manager.getRandom(); 023 boolean pirate = random.nextBoolean(); 024 pirate = true; // seems like legit scavengers wouldn't spend too much time waiting in ambush 025 026 WeightedRandomPicker<String> picker = new WeightedRandomPicker<String>(random); 027 picker.add(FleetTypes.SCAVENGER_SMALL, 5f); 028 picker.add(FleetTypes.SCAVENGER_MEDIUM, 15f); 029 picker.add(FleetTypes.SCAVENGER_LARGE, 10f); 030 String type = picker.pick(); 031 032 CampaignFleetAPI fleet = RuinsFleetRouteManager.createScavenger(type, point.getLocInHyper(), 033 null, null, pirate, random); 034 035 if (fleet != null) { 036 point.where.addEntity(fleet); 037 fleet.setLocation(point.loc.x, point.loc.y); 038 Vector2f spawnLoc = Misc.getPointWithinRadius(point.loc, 1000f); 039 SectorEntityToken e = point.where.createToken(spawnLoc); 040 fleet.addAssignment(FleetAssignment.ORBIT_AGGRESSIVE, e, 30f * random.nextFloat(), "waiting"); 041 fleet.removeScriptsOfClass(MissionFleetAutoDespawn.class); 042 fleet.addScript(new MissionFleetAutoDespawn(null, fleet)); 043 fleet.addScript(new ScavengerPiracyScript(fleet)); 044 } 045 } 046 047 public float getFrequencyForPoint(EncounterManager manager, EncounterPoint point) { 048 if (!EncounterManager.EP_TYPE_SLIPSTREAM.equals(point.type)) return 0f; 049 050 float f = getProximityFactor(point.getLocInHyper()); 051 if (f > 0) { 052 f = 0.25f + 0.75f * f; 053 } 054 return 10f * f; 055 } 056 057 058 public static float getProximityFactor(Vector2f locInHyper) { 059 StarSystemAPI ruins = getClosestSystemWithRuins(locInHyper); 060 float f = getRuinsProximityFactor(ruins, locInHyper); 061 return f; 062 } 063 064 065} 066 067 068 069 070