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.ids.MemFlags; 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 SlipstreamPirateEPEC extends BaseEPEncounterCreator { 019 020 @Override 021 public void createEncounter(EncounterManager manager, EncounterPoint point) { 022 Random random = manager.getRandom(); 023 024 PirateBaseIntel intel = getClosestPirateBase(point.getLocInHyper()); 025 float f = getProximityFactor(point.getLocInHyper()); // not just bases - ruins/core, too 026 027 int difficulty = 0; 028 difficulty += (int) Math.round(f * 3f); 029 if (intel != null) { 030 switch (intel.getTier()) { 031 case TIER_1_1MODULE: difficulty += 1; break; 032 case TIER_2_1MODULE: difficulty += 1; break; 033 case TIER_3_2MODULE: difficulty += 2; break; 034 case TIER_4_3MODULE: difficulty += 3; break; 035 case TIER_5_3MODULE: difficulty += 4; break; 036 } 037 } 038 difficulty += random.nextInt(4); 039 040 FleetCreatorMission m = new FleetCreatorMission(random); 041 m.beginFleet(); 042 043 Vector2f loc = point.getLocInHyper(); 044 String factionId = Factions.PIRATES; 045 if (intel != null && intel.getMarket() != null) factionId = intel.getMarket().getFactionId(); 046 m.createStandardFleet(difficulty, factionId, loc); 047 m.triggerSetPirateFleet(); 048 m.triggerMakeLowRepImpact(); 049 m.triggerFleetAllowLongPursuit(); 050 if (intel != null && intel.getMarket() != null) { 051 m.triggerSetFleetMemoryValue(MemFlags.MEMORY_KEY_SOURCE_MARKET, intel.getMarket().getId()); 052 } 053 054 CampaignFleetAPI fleet = m.createFleet(); 055 if (fleet != null) { 056 point.where.addEntity(fleet); 057 fleet.setLocation(point.loc.x, point.loc.y); 058 Vector2f spawnLoc = Misc.getPointWithinRadius(point.loc, 1000f); 059 SectorEntityToken e = point.where.createToken(spawnLoc); 060 fleet.addAssignment(FleetAssignment.ORBIT_AGGRESSIVE, e, 30f * random.nextFloat(), "laying in wait"); 061 fleet.removeScriptsOfClass(MissionFleetAutoDespawn.class); 062 fleet.addScript(new MissionFleetAutoDespawn(null, fleet)); 063 } 064 } 065 066 public float getFrequencyForPoint(EncounterManager manager, EncounterPoint point) { 067 if (!EncounterManager.EP_TYPE_SLIPSTREAM.equals(point.type)) return 0f; 068 069 PirateBaseIntel intel = getClosestPirateBase(point.getLocInHyper()); 070 float f = getProximityFactor(point.getLocInHyper()); // not just bases - ruins/core, too 071 072 if (intel != null && f > 0) { 073 f = 0.25f + 0.75f * f; 074 switch (intel.getTier()) { 075 case TIER_1_1MODULE: f *= 1f; break; 076 case TIER_2_1MODULE: f *= 2f; break; 077 case TIER_3_2MODULE: f *= 3f; break; 078 case TIER_4_3MODULE: f *= 4f; break; 079 case TIER_5_3MODULE: f *= 5f; break; 080 } 081 } 082 return 10f * f; 083 } 084 085 086 public static float getProximityFactor(Vector2f locInHyper) { 087 PirateBaseIntel intel = getClosestPirateBase(locInHyper); 088 float f = getPirateBaseProximityFactor(intel, locInHyper); 089 090 float f2 = getCoreProximityFactor(locInHyper); 091 f2 *= 0.5f; 092 if (f2 > f) f = f2; 093 094 StarSystemAPI ruins = getClosestSystemWithRuins(locInHyper); 095 float f3 = getRuinsProximityFactor(ruins, locInHyper); 096 f3 *= 0.25f; 097 if (f3 > f) f = f3; 098 099 return f; 100 } 101} 102 103 104 105 106