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