001package com.fs.starfarer.api.impl.campaign.events.nearby;
002
003import java.util.ArrayList;
004import java.util.List;
005
006import com.fs.starfarer.api.Global;
007import com.fs.starfarer.api.campaign.CampaignFleetAPI;
008import com.fs.starfarer.api.campaign.CustomCampaignEntityAPI;
009import com.fs.starfarer.api.campaign.FleetAssignment;
010import com.fs.starfarer.api.campaign.SectorEntityToken;
011import com.fs.starfarer.api.campaign.StarSystemAPI;
012import com.fs.starfarer.api.campaign.SectorEntityToken.VisibilityLevel;
013import com.fs.starfarer.api.campaign.rules.MemoryAPI;
014import com.fs.starfarer.api.fleet.FleetMemberAPI;
015import com.fs.starfarer.api.impl.campaign.CargoPodsEntityPlugin;
016import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
017import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseAssignmentAI;
018import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.CargoPods;
019import com.fs.starfarer.api.util.Misc;
020
021public class DistressCallNormalAssignmentAI extends BaseAssignmentAI {
022
023        protected StarSystemAPI system;
024        protected SectorEntityToken jumpPoint;
025        
026        protected float elapsed = 0f;
027        protected float dur = 30f + (float) Math.random() * 20f;
028        protected boolean contactedPlayer = false;
029        
030        public DistressCallNormalAssignmentAI(CampaignFleetAPI fleet, StarSystemAPI system, SectorEntityToken jumpPoint) {
031                super();
032                this.fleet = fleet;
033                this.system = system;
034                this.jumpPoint = jumpPoint;
035                
036                giveInitialAssignments();
037        }
038
039        @Override
040        protected void giveInitialAssignments() {
041                fleet.addAssignment(FleetAssignment.ORBIT_AGGRESSIVE, jumpPoint, 30f);
042        }
043
044        @Override
045        protected void pickNext() {
046                fleet.addAssignment(FleetAssignment.ORBIT_AGGRESSIVE, jumpPoint, 30f);
047        }
048
049        @Override
050        public void advance(float amount) {
051                super.advance(amount);
052                
053                if (!fleet.getMemoryWithoutUpdate().contains("$distress")) {
054                        //fleet.getMemoryWithoutUpdate().unset(MemFlags.ENTITY_MISSION_IMPORTANT);
055                        
056                        Misc.giveStandardReturnToSourceAssignments(fleet);
057                        fleet.removeScript(this);
058                        return;
059                }
060                
061                float days = Global.getSector().getClock().convertToDays(amount);
062                boolean playerNearby = Misc.getDistanceToPlayerLY(fleet) <= 3f;
063                
064                elapsed += days;
065                
066//              if (!playerNearby && elapsed >= dur && fleet.getBattle() == null) {
067//                      fleet.despawn(FleetDespawnReason.OTHER, null);
068//              }
069//              if (fleet.isDespawning()) return;
070                
071                
072                if (elapsed >= dur - 10f) {
073                        boolean seesPlayer = false;
074                        if (playerNearby) {
075                                VisibilityLevel level = fleet.getVisibilityLevelOfPlayerFleet();
076                                seesPlayer |= level == VisibilityLevel.COMPOSITION_DETAILS;
077                                seesPlayer |= level == VisibilityLevel.COMPOSITION_AND_FACTION_DETAILS;
078                        }
079                        if (!seesPlayer) {
080                                undistress(fleet);
081                                int crewToLeave = (int) (fleet.getFleetData().getMinCrew() * 0.5f);
082                                scuttleShips(fleet, crewToLeave);
083                                leaveCrewInPods(fleet, crewToLeave);
084                        }
085                }
086                
087                if (fleet.isInCurrentLocation() && !contactedPlayer) {
088                        VisibilityLevel level = fleet.getVisibilityLevelOfPlayerFleet();
089                        if (level != VisibilityLevel.NONE &&
090                                        level != VisibilityLevel.SENSOR_CONTACT) {
091                                contactedPlayer = true;
092                                fleet.clearAssignments();
093                                fleet.addAssignment(FleetAssignment.INTERCEPT, Global.getSector().getPlayerFleet(), 30f, "approaching your fleet");
094                        }
095                }
096        }
097        
098        public static void leaveCrewInPods(CampaignFleetAPI fleet, int crew) {
099                CustomCampaignEntityAPI pods = Misc.addCargoPods(fleet.getContainingLocation(), fleet.getLocation());
100                CargoPodsEntityPlugin plugin = (CargoPodsEntityPlugin)pods.getCustomPlugin();
101                plugin.setExtraDays(100f);
102                pods.getCargo().addCrew(crew);
103                CargoPods.stabilizeOrbit(pods, false);
104                
105                //int machinery = crew / 10;
106                //pods.setDiscoverable(true);
107        }
108        
109
110        public static void undistress(SectorEntityToken fleet) {
111                MemoryAPI memory = fleet.getMemoryWithoutUpdate();
112                memory.unset("$distress");
113                memory.unset(MemFlags.MEMORY_KEY_NO_JUMP);
114                
115                //memory.unset(MemFlags.ENTITY_MISSION_IMPORTANT);
116                Misc.setFlagWithReason(fleet.getMemoryWithoutUpdate(), MemFlags.ENTITY_MISSION_IMPORTANT,
117                                                   "distress", false, 1000f);
118        }
119        
120        public static void scuttleShips(CampaignFleetAPI fleet, int crewFreed) {
121                List<FleetMemberAPI> members = new ArrayList<FleetMemberAPI>(fleet.getFleetData().getMembersListCopy());
122                float scuttledCrewRoom = 0;
123                for (int i = members.size() - 1; i >= 0 && scuttledCrewRoom < crewFreed; i--) {
124                        FleetMemberAPI member = members.get(i);
125                        fleet.removeFleetMemberWithDestructionFlash(member);
126                        scuttledCrewRoom += member.getMinCrew();
127                }
128        }
129
130}
131
132
133
134
135
136
137
138
139
140
141
142