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.impl.campaign.fleets.AutoDespawnScript;
011import com.fs.starfarer.api.impl.campaign.ids.Factions;
012import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
013import com.fs.starfarer.api.impl.campaign.ids.Tags;
014import com.fs.starfarer.api.impl.campaign.missions.FleetCreatorMission;
015import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.FleetQuality;
016import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.FleetSize;
017import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.OfficerNum;
018import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.OfficerQuality;
019import com.fs.starfarer.api.impl.campaign.procgen.themes.RemnantStationFleetManager;
020import com.fs.starfarer.api.util.Misc;
021
022public class OutsideSystemRemnantEPEC extends BaseEPEncounterCreator {
023        
024        @Override
025        public void createEncounter(EncounterManager manager, EncounterPoint point) {
026                if (!(point.custom instanceof RemnantStationFleetManager)) return;
027                
028                Random random = manager.getRandom();
029                RemnantStationFleetManager fm = (RemnantStationFleetManager) point.custom;
030                
031                int difficulty = 0;
032                int max = 10;
033                float mult = 1f;
034                if (fm.getSource() != null && fm.getSource().getStarSystem() != null && 
035                                fm.getSource().getStarSystem().hasTag(Tags.THEME_REMNANT_SUPPRESSED)) {
036                        max = 3;
037                        mult = 0.25f;
038                }
039                
040                difficulty += (int) Math.min(fm.getTotalLost() * mult, max);
041                difficulty += random.nextInt(4);
042                if (difficulty > 10) difficulty = 10;
043                
044                FleetCreatorMission m = new FleetCreatorMission(random);
045                m.beginFleet();
046                
047                Vector2f loc = point.getLocInHyper();
048                
049                FleetSize size = FleetSize.MEDIUM;
050                FleetQuality quality = FleetQuality.VERY_HIGH;
051                OfficerQuality oQuality = OfficerQuality.AI_MIXED;
052                OfficerNum oNum = OfficerNum.ALL_SHIPS;
053                String type = FleetTypes.PATROL_SMALL;
054                
055                if (difficulty <= 1) {
056                        size = FleetSize.VERY_SMALL;
057                        type = FleetTypes.PATROL_SMALL;
058                        oQuality = OfficerQuality.AI_GAMMA;
059                } else if (difficulty <= 2) {
060                        size = FleetSize.SMALL;
061                        type = FleetTypes.PATROL_SMALL;
062                        oQuality = OfficerQuality.AI_GAMMA;
063                } else if (difficulty <= 5) {
064                        size = FleetSize.MEDIUM;
065                        type = FleetTypes.PATROL_SMALL;
066                        oQuality = OfficerQuality.AI_BETA_OR_GAMMA;
067                } else if (difficulty <= 7) {
068                        size = FleetSize.LARGE;
069                        type = FleetTypes.PATROL_MEDIUM;
070                        oQuality = OfficerQuality.AI_BETA_OR_GAMMA;
071                } else if (difficulty == 8) {
072                        size = FleetSize.LARGE;
073                        type = FleetTypes.PATROL_LARGE;
074                        oQuality = OfficerQuality.AI_MIXED;
075                } else if (difficulty == 9) {
076                        size = FleetSize.LARGER;
077                        type = FleetTypes.PATROL_LARGE;
078                        oQuality = OfficerQuality.AI_ALPHA;
079                } else {
080                        size = FleetSize.VERY_LARGE;
081                        type = FleetTypes.PATROL_LARGE;
082                        oQuality = OfficerQuality.AI_ALPHA;
083                }
084                
085                m.triggerCreateFleet(size, quality, Factions.REMNANTS, type, loc);
086                m.triggerSetFleetOfficers(oNum, oQuality);
087                m.triggerSetRemnantConfigActive();
088                m.triggerFleetUnsetAllowLongPursuit();
089                
090                CampaignFleetAPI fleet = m.createFleet();
091                if (fleet != null) {
092                        point.where.addEntity(fleet);
093                        fleet.setLocation(point.loc.x, point.loc.y);
094                        Vector2f spawnLoc = Misc.getPointWithinRadius(point.loc, 1000f);
095                        SectorEntityToken e = point.where.createToken(spawnLoc);
096                        String actionText = "patrolling";
097                        if (difficulty <= 2) actionText = "reconnoitering";
098                        fleet.addAssignment(FleetAssignment.PATROL_SYSTEM, e, 30f * random.nextFloat(), actionText);
099                        fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, fm.getSource(), 1000f, "returning to " + fm.getSource().getName());
100                        fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, fm.getSource(), 3f + random.nextFloat() * 2f, "uploading encrypted data");
101                        fleet.addAssignment(FleetAssignment.GO_TO_LOCATION_AND_DESPAWN, fm.getSource(), 10f);
102                        fleet.addScript(new AutoDespawnScript(fleet));
103                }
104        }
105
106        public float getFrequencyForPoint(EncounterManager manager, EncounterPoint point) {
107                if (!EncounterManager.EP_TYPE_OUTSIDE_SYSTEM.equals(point.type)) return 0f;
108                if (!(point.custom instanceof RemnantStationFleetManager)) return 0f;
109                RemnantStationFleetManager fm = (RemnantStationFleetManager) point.custom;
110                
111                float mult = 0.5f;
112                if (fm.getSource() != null && fm.getSource().getStarSystem() != null && 
113                                fm.getSource().getStarSystem().hasTag(Tags.THEME_REMNANT_SUPPRESSED)) {
114                        mult = 0.1f;
115                }
116                
117                return 10f * (float) Math.min(10f, fm.getTotalLost()) * mult;
118        }
119        
120        
121        
122}
123
124
125
126
127