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