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