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.Factions; 012import com.fs.starfarer.api.impl.campaign.intel.bases.LuddicPathBaseIntel; 013import com.fs.starfarer.api.impl.campaign.intel.bases.PirateBaseIntel; 014import com.fs.starfarer.api.impl.campaign.missions.FleetCreatorMission; 015import com.fs.starfarer.api.impl.campaign.missions.hub.MissionFleetAutoDespawn; 016import com.fs.starfarer.api.util.Misc; 017 018public class SlipstreamMercenaryEPEC extends BaseEPEncounterCreator { 019 020 @Override 021 public void createEncounter(EncounterManager manager, EncounterPoint point) { 022 Random random = manager.getRandom(); 023 024 float f = getProximityFactor(point.getLocInHyper()); 025 026 int difficulty = 0; 027 difficulty += (int) Math.round(f * 5f); 028 difficulty += random.nextInt(6); 029 030 FleetCreatorMission m = new FleetCreatorMission(random); 031 m.beginFleet(); 032 033 Vector2f loc = point.getLocInHyper(); 034 m.createQualityFleet(difficulty, Factions.MERCENARY, loc); 035 m.triggerFleetAllowLongPursuit(); 036 m.triggerSetFleetFaction(Factions.INDEPENDENT); 037 m.triggerMakeNoRepImpact(); 038 m.triggerFleetSetAllWeapons(); 039 040 CampaignFleetAPI fleet = m.createFleet(); 041 if (fleet != null) { 042 point.where.addEntity(fleet); 043 fleet.setLocation(point.loc.x, point.loc.y); 044 Vector2f spawnLoc = Misc.getPointWithinRadius(point.loc, 1000f); 045 SectorEntityToken e = point.where.createToken(spawnLoc); 046 fleet.addAssignment(FleetAssignment.ORBIT_AGGRESSIVE, e, 30f * random.nextFloat(), "laying in wait"); 047 fleet.removeScriptsOfClass(MissionFleetAutoDespawn.class); 048 fleet.addScript(new MissionFleetAutoDespawn(null, fleet)); 049 } 050 } 051 052 public float getFrequencyForPoint(EncounterManager manager, EncounterPoint point) { 053 if (!EncounterManager.EP_TYPE_SLIPSTREAM.equals(point.type)) return 0f; 054 055 float f = getProximityFactor(point.getLocInHyper()); 056 if (f > 0) { 057 f = 0.25f + 0.75f * f; 058 } 059 return 10f * f; 060 } 061 062 public static float getProximityFactor(Vector2f locInHyper) { 063 LuddicPathBaseIntel intel = getClosestLuddicPathBase(locInHyper); 064 float f1 = getLuddicPathBaseProximityFactor(intel, locInHyper); 065 066 PirateBaseIntel intel2 = getClosestPirateBase(locInHyper); 067 float f2 = getPirateBaseProximityFactor(intel2, locInHyper); 068 069 float result = Math.max(f1, f2); 070 071 StarSystemAPI ruins = getClosestSystemWithRuins(locInHyper); 072 float f3 = getRuinsProximityFactor(ruins, locInHyper); 073 f3 *= 0.25f; 074 result = Math.max(result, f3); 075 076 return result; 077 } 078 079} 080 081 082 083 084