001package com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special; 002 003import org.lwjgl.util.vector.Vector2f; 004 005import com.fs.starfarer.api.Global; 006import com.fs.starfarer.api.campaign.CampaignFleetAPI; 007import com.fs.starfarer.api.campaign.FleetAssignment; 008import com.fs.starfarer.api.campaign.InteractionDialogAPI; 009import com.fs.starfarer.api.campaign.PlanetAPI; 010import com.fs.starfarer.api.campaign.SectorEntityToken; 011import com.fs.starfarer.api.campaign.ai.FleetAIFlags; 012import com.fs.starfarer.api.campaign.ai.ModularFleetAIAPI; 013import com.fs.starfarer.api.fleet.FleetMemberAPI; 014import com.fs.starfarer.api.impl.campaign.fleets.FleetFactoryV3; 015import com.fs.starfarer.api.impl.campaign.fleets.FleetParamsV3; 016import com.fs.starfarer.api.impl.campaign.ids.Factions; 017import com.fs.starfarer.api.impl.campaign.ids.MemFlags; 018import com.fs.starfarer.api.impl.campaign.procgen.themes.RemnantSeededFleetManager; 019import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.SalvageSpecialInteraction.SalvageSpecialData; 020import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.SalvageSpecialInteraction.SalvageSpecialPlugin; 021import com.fs.starfarer.api.util.Misc; 022 023public class TransmitterTrapSpecial extends BaseSalvageSpecial { 024 025 026 public static class TransmitterTrapSpecialData implements SalvageSpecialData { 027 public float prob = 0.5f; 028 029 public String fleetId; 030 031 public String nearbyFleetFaction = null; 032 public Boolean useClosestFleetInRange = null; 033 public Boolean useAllFleetsInRange = null; 034 035 public FleetParamsV3 params; 036 037 public float minRange = 2500; 038 public float maxRange = 5000; 039 040 public TransmitterTrapSpecialData() { 041 } 042 043 public TransmitterTrapSpecialData(FleetParamsV3 params) { 044 this.params = params; 045 } 046 047 public TransmitterTrapSpecialData(float prob, FleetParamsV3 params) { 048 this.prob = prob; 049 this.params = params; 050 } 051 052 public SalvageSpecialPlugin createSpecialPlugin() { 053 return new TransmitterTrapSpecial(); 054 } 055 } 056 057 private TransmitterTrapSpecialData data; 058 059 public TransmitterTrapSpecial() { 060 } 061 062 063 @Override 064 public void init(InteractionDialogAPI dialog, Object specialData) { 065 super.init(dialog, specialData); 066 067 data = (TransmitterTrapSpecialData) specialData; 068 069 initEntityLocation(); 070 } 071 072 private void initEntityLocation() { 073 074 if (random.nextFloat() > data.prob) { 075 076 if (random.nextFloat() > 0.5f) { 077 addText("Your salvage crews discover a transmitter set to send a signal when " + 078 "tripped by an alarm system, but it doesn't appear to be functional. " + 079 "Closer examination indicates it was probably set many cycles ago."); 080 } else { 081 addText("Your salvage crews discover a transmitter set to send a signal when " + 082 "tripped by an alarm system. The alarm went off as intended, but the transmitter " + 083 "was fried by a power surge before it could do its job."); 084 } 085 086 setDone(true); 087 setEndWithContinue(true); 088 setShowAgain(false); 089 return; 090 } 091 092 if (entity instanceof PlanetAPI) { 093 addText("As your salvage crews begin their work, a transmitter hidden somewhere planetside " + 094 "sends out an encrypted, broadwave signal. Whatever destination it's meant for, " + 095 "it has to be nearby."); 096 } else { 097 addText("As your salvage crews begin their work, a transmitter inside the $shortName " + 098 "sends out an encrypted, broadwave signal. Whatever destination it's meant for, " + 099 "it has to be nearby."); 100 } 101 102 transmitterActivated(); 103 104 setDone(true); 105 setEndWithContinue(true); 106 setShowAgain(false); 107 } 108 109 110 public void transmitterActivated() { 111 if (data == null) return; 112 if (entity == null) return; 113 114 if (data.fleetId != null) { 115 SectorEntityToken found = Global.getSector().getEntityById(data.fleetId); 116 if (found instanceof CampaignFleetAPI) { 117 CampaignFleetAPI fleet = (CampaignFleetAPI) found; 118 FleetMemberAPI flagship = fleet.getFlagship(); 119 boolean makeAggressive = false; 120 if (flagship != null) { 121 makeAggressive = Misc.isAutomated(flagship.getVariant()); 122 } 123 makeFleetInterceptPlayer(fleet, makeAggressive, true, 30f); 124 } 125 return; 126 } 127 128 if (data.useAllFleetsInRange != null && data.useAllFleetsInRange) { 129 boolean foundSomeFleets = false; 130 for (CampaignFleetAPI fleet : entity.getContainingLocation().getFleets()) { 131 if (data.nearbyFleetFaction != null && 132 !data.nearbyFleetFaction.equals(fleet.getFaction().getId())) { 133 continue; 134 } 135 136 if (fleet.isStationMode()) continue; 137 138 if (fleet.getMemoryWithoutUpdate().is(MemFlags.MEMORY_KEY_TRADE_FLEET, true)) continue; 139 140 float dist = Misc.getDistance(fleet.getLocation(), entity.getLocation()); 141 if (dist < data.maxRange) { 142 FleetMemberAPI flagship = fleet.getFlagship(); 143 boolean makeAggressive = false; 144 if (flagship != null) { 145 makeAggressive = Misc.isAutomated(flagship.getVariant()); 146 } 147 makeFleetInterceptPlayer(fleet, makeAggressive, true, 30f); 148 foundSomeFleets = true; 149 } 150 } 151 if (foundSomeFleets) return; 152 } 153 154 if (data.useClosestFleetInRange != null && data.useClosestFleetInRange) { 155 CampaignFleetAPI closest = null; 156 float minDist = Float.MAX_VALUE; 157 for (CampaignFleetAPI fleet : entity.getContainingLocation().getFleets()) { 158 if (data.nearbyFleetFaction != null && 159 !data.nearbyFleetFaction.equals(fleet.getFaction().getId())) { 160 continue; 161 } 162 163 if (fleet.isStationMode()) continue; 164 165 if (fleet.getMemoryWithoutUpdate().is(MemFlags.MEMORY_KEY_TRADE_FLEET, true)) continue; 166 167 float dist = Misc.getDistance(fleet.getLocation(), entity.getLocation()); 168 if (dist < data.maxRange && dist < minDist) { 169 closest = fleet; 170 minDist = dist; 171 } 172 } 173 if (closest != null) { 174 FleetMemberAPI flagship = closest.getFlagship(); 175 boolean makeAggressive = false; 176 if (flagship != null) { 177 makeAggressive = Misc.isAutomated(flagship.getVariant()); 178 } 179 makeFleetInterceptPlayer(closest, makeAggressive, true, 30f); 180 return; 181 } 182 } 183 184 if (data.params != null) { 185 CampaignFleetAPI fleet = FleetFactoryV3.createFleet(data.params); 186 if (fleet == null || fleet.isEmpty()) return; 187 188 if (Factions.REMNANTS.equals(fleet.getFaction().getId())) { 189 RemnantSeededFleetManager.initRemnantFleetProperties(null, fleet, false); 190 } else { 191 fleet.setTransponderOn(false); 192 fleet.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_PIRATE, true); 193 Misc.makeNoRepImpact(fleet, "tTrap"); 194 } 195 196 float range = data.minRange + random.nextFloat() * (data.maxRange - data.minRange); 197 Vector2f loc = Misc.getPointAtRadius(entity.getLocation(), range); 198 199 entity.getContainingLocation().addEntity(fleet); 200 fleet.setLocation(loc.x, loc.y); 201 202 FleetMemberAPI flagship = fleet.getFlagship(); 203 boolean makeAggressive = false; 204 if (flagship != null) { 205 makeAggressive = Misc.isAutomated(flagship.getVariant()); 206 } 207 makeFleetInterceptPlayer(fleet, makeAggressive, true, 30f); 208 209 210// SectorEntityToken despawnLoc = entity.getContainingLocation().createToken(20000, 0); 211// fleet.addAssignment(FleetAssignment.GO_TO_LOCATION_AND_DESPAWN, despawnLoc, 10000f); 212 Misc.giveStandardReturnToSourceAssignments(fleet, false); 213 return; 214 } 215 } 216 217 218 219 220 public static void makeFleetInterceptPlayer(CampaignFleetAPI fleet, boolean makeAggressive, boolean makeLowRepImpact, float interceptDays) { 221 makeFleetInterceptPlayer(fleet, makeAggressive, makeLowRepImpact, true, interceptDays); 222 } 223 public static void makeFleetInterceptPlayer(CampaignFleetAPI fleet, boolean makeAggressive, boolean makeLowRepImpact, boolean makeHostile, float interceptDays) { 224 CampaignFleetAPI playerFleet = Global.getSector().getPlayerFleet(); 225 226 if (fleet.getAI() == null) { 227 fleet.setAI(Global.getFactory().createFleetAI(fleet)); 228 fleet.setLocation(fleet.getLocation().x, fleet.getLocation().y); 229 } 230 231 if (makeAggressive) { 232 float expire = fleet.getMemoryWithoutUpdate().getExpire(MemFlags.MEMORY_KEY_MAKE_AGGRESSIVE); 233 fleet.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_MAKE_AGGRESSIVE, true, Math.max(expire, interceptDays)); 234 fleet.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_MAKE_AGGRESSIVE_ONE_BATTLE_ONLY, true, Math.max(expire, interceptDays)); 235 } 236 237 if (makeHostile) { 238 fleet.getMemoryWithoutUpdate().unset(MemFlags.MEMORY_KEY_MAKE_ALLOW_DISENGAGE); 239 fleet.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_MAKE_HOSTILE, true, interceptDays); 240 } 241 fleet.getMemoryWithoutUpdate().set(FleetAIFlags.PLACE_TO_LOOK_FOR_TARGET, new Vector2f(playerFleet.getLocation()), interceptDays); 242 243 if (makeLowRepImpact) { 244 Misc.makeLowRepImpact(fleet, "ttSpecial"); 245 } 246 247 if (fleet.getAI() instanceof ModularFleetAIAPI) { 248 ((ModularFleetAIAPI)fleet.getAI()).getTacticalModule().setTarget(playerFleet); 249 } 250 251 fleet.addAssignmentAtStart(FleetAssignment.INTERCEPT, playerFleet, interceptDays, null); 252 } 253 254 255 @Override 256 public void optionSelected(String optionText, Object optionData) { 257 super.optionSelected(optionText, optionData); 258 } 259 260 261 public static void main(String[] args) { 262 Boolean b = null;//new Boolean(true); 263 System.out.println(b == true); 264 } 265} 266 267 268 269 270 271