001package com.fs.starfarer.api.impl.campaign.intel.group;
002
003import java.util.LinkedHashSet;
004import java.util.Random;
005import java.util.Set;
006
007import com.fs.starfarer.api.Global;
008import com.fs.starfarer.api.campaign.CampaignFleetAPI;
009import com.fs.starfarer.api.campaign.InteractionDialogAPI;
010import com.fs.starfarer.api.campaign.SectorEntityToken;
011import com.fs.starfarer.api.campaign.StarSystemAPI;
012import com.fs.starfarer.api.campaign.econ.Industry;
013import com.fs.starfarer.api.campaign.econ.MarketAPI;
014import com.fs.starfarer.api.campaign.rules.MemoryAPI;
015import com.fs.starfarer.api.impl.campaign.ids.Factions;
016import com.fs.starfarer.api.impl.campaign.ids.Industries;
017import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
018import com.fs.starfarer.api.impl.campaign.ids.Tags;
019import com.fs.starfarer.api.impl.campaign.intel.events.TriTachyonHostileActivityFactor;
020import com.fs.starfarer.api.impl.campaign.intel.events.ttcr.TTCRMercenariesBribedFactor;
021import com.fs.starfarer.api.impl.campaign.intel.events.ttcr.TriTachyonCommerceRaiding;
022import com.fs.starfarer.api.impl.campaign.intel.group.FGRaidAction.FGRaidType;
023import com.fs.starfarer.api.ui.SectorMapAPI;
024import com.fs.starfarer.api.util.IntervalUtil;
025import com.fs.starfarer.api.util.Misc;
026
027
028
029public class TTMercenaryReversedAttack extends GenericRaidFGI  {
030
031        public static final String TTMAR_FLEET = "$TTMAR_fleet";
032        public static final String TTMAR_COMMAND = "$TTMAR_command";
033        
034        public static String KEY = "$TTMAR_ref";
035        public static TTMercenaryReversedAttack get() {
036                return (TTMercenaryReversedAttack) Global.getSector().getMemoryWithoutUpdate().get(KEY);
037        }
038        
039        
040        
041        
042        public static void sendReversedAttack(InteractionDialogAPI dialog) {
043                TTMercenaryAttack attack = TTMercenaryAttack.get();
044                if (attack == null || attack.isEnding()) return;
045                
046                Random random = new Random();
047                
048                StarSystemAPI target = TriTachyonHostileActivityFactor.getPrimaryTriTachyonSystem();
049                if (target == null) return;
050                
051                GenericRaidParams params = new GenericRaidParams(new Random(), false);
052                //params.makeFleetsHostile = true; // irrelevant since fleets already spawned
053                
054                //params.source = attack.params.source;
055                
056                CampaignFleetAPI pf = Global.getSector().getPlayerFleet();
057                SectorEntityToken origin = pf.getContainingLocation().createToken(pf.getLocation());
058                
059                MarketAPI fake = Global.getFactory().createMarket("fake", "an independent world", 5);
060                fake.setFactionId(Factions.INDEPENDENT);
061                fake.setPrimaryEntity(origin);
062                origin.setMarket(fake);
063                params.source = fake;
064                
065                params.prepDays = 0f;
066                params.payloadDays = 27f + 7f * random.nextFloat();
067                
068                params.raidParams.where = target;
069                params.raidParams.type = FGRaidType.SEQUENTIAL;
070                
071                Set<String> disrupt = new LinkedHashSet<String>();
072                for (MarketAPI market : Misc.getMarketsInLocation(target, Factions.TRITACHYON)) {
073                        params.raidParams.allowedTargets.add(market);
074                        params.raidParams.allowNonHostileTargets = true;
075                        for (Industry ind : market.getIndustries()) {
076                                if (ind.getSpec().hasTag(Industries.TAG_UNRAIDABLE)) continue;
077                                disrupt.add(ind.getId());
078                        }
079                }
080                
081                params.raidParams.disrupt.addAll(disrupt);
082                params.raidParams.raidsPerColony = Math.min(disrupt.size(), 4);
083                if (disrupt.isEmpty()) {
084                        params.raidParams.raidsPerColony = 2;
085                }
086                
087                if (params.raidParams.allowedTargets.isEmpty()) {
088                        return;
089                }
090                
091                params.factionId = Factions.INDEPENDENT;
092
093                
094                TTMercenaryReversedAttack reverse = new TTMercenaryReversedAttack(params);
095                
096//              CampaignFleetAPI pf = Global.getSector().getPlayerFleet();
097//              SectorEntityToken origin = pf.getContainingLocation().createToken(pf.getLocation());
098//              reverse.setOrigin(origin);
099                
100                
101                reverse.setSpawnedFleets(true);
102                reverse.setDoIncrementalSpawn(false);
103                reverse.getFleets().addAll(attack.getFleets());
104                reverse.setTotalFPSpawned(attack.getTotalFPSpawned());
105                
106                reverse.setApproximateNumberOfFleets(attack.getApproximateNumberOfFleets());
107                
108                reverse.getRoute().setExtra(attack.getRoute().getExtra());
109                
110                // the raid "source" may be a tritach market
111                // so, make the fleets scatter/return to their individual sourceMarket instead 
112                reverse.removeAction(GenericRaidFGI.RETURN_ACTION);
113                
114                attack.finish(false);
115                attack.getFleets().clear();
116                attack.endImmediately();
117                
118                String reasonTTMA = "TTMA";
119                String reasonTTMAR = "TTMAR";
120                for (CampaignFleetAPI fleet : reverse.getFleets()) {
121                        MemoryAPI mem = fleet.getMemoryWithoutUpdate();
122                        fleet.clearAssignments();
123                        mem.unset(Misc.FLEET_RETURNING_TO_DESPAWN);
124                        
125                        mem.set(TTMAR_FLEET, true);
126                        if (mem.getBoolean(TTMercenaryAttack.TTMA_COMMAND)) {
127                                mem.set(TTMAR_COMMAND, true);
128                        }
129                        
130                        mem.unset(TTMercenaryAttack.TTMA_COMMAND);
131                        mem.unset(TTMercenaryAttack.TTMA_FLEET);
132                        
133                        Misc.makeNonHostileToFaction(fleet, Factions.DIKTAT, false, -1);
134                        Misc.makeNonHostileToFaction(fleet, Factions.TRITACHYON, false, -1);
135                        
136                        
137                        Misc.setFlagWithReason(mem, MemFlags.MEMORY_KEY_MAKE_HOSTILE,
138                                                        reasonTTMA, false, -1f);
139                        Misc.setFlagWithReason(mem, MemFlags.MEMORY_KEY_MAKE_NON_HOSTILE,
140                                                        reasonTTMAR, true, -1f);
141                }
142                
143
144                // not player targeted, so needs to be "important" so the player gets updates
145                reverse.setImportant(true);
146                
147                Global.getSector().getIntelManager().addIntel(reverse, false, dialog.getTextPanel());
148                
149                TriTachyonCommerceRaiding.addFactorCreateIfNecessary(new TTCRMercenariesBribedFactor(), dialog);
150        }
151        
152        
153        
154        protected IntervalUtil interval = new IntervalUtil(0.1f, 0.3f);
155        
156        
157        public TTMercenaryReversedAttack(GenericRaidParams params) {
158                super(params);
159                
160                Global.getSector().getMemoryWithoutUpdate().set(KEY, this);
161        }
162        
163        @Override
164        protected void notifyEnding() {
165                super.notifyEnding();
166                
167                Global.getSector().getMemoryWithoutUpdate().unset(KEY);
168        }
169        
170        @Override
171        protected void notifyEnded() {
172                super.notifyEnded();
173        }
174        
175
176        @Override
177        public String getNoun() {
178                return "mercenary attack";
179        }
180
181        @Override
182        public String getForcesNoun() {
183                return super.getForcesNoun();
184        }
185
186
187        @Override
188        public String getBaseName() {
189                return "Mercenary Counter-raid";
190        }
191
192        @Override
193        public void abort() {
194                if (!isAborted()) {
195                        for (CampaignFleetAPI curr : getFleets()) {
196                                curr.getMemoryWithoutUpdate().unset(TTMAR_FLEET);
197                        }
198                }
199                super.abort();
200        }
201        
202        
203        @Override
204        public void advance(float amount) {
205                super.advance(amount);
206
207                float days = Misc.getDays(amount);
208                interval.advance(days);
209                
210                if (interval.intervalElapsed()) {
211                        if (isCurrent(PAYLOAD_ACTION)) {
212                                for (CampaignFleetAPI curr : getFleets()) {
213                                        Misc.makeHostileToFaction(curr, Factions.TRITACHYON, 1f);
214                                }
215                        }
216                }
217        }
218
219        @Override
220        public Set<String> getIntelTags(SectorMapAPI map) {
221                Set<String> tags = super.getIntelTags(map);
222                tags.remove(Tags.INTEL_COLONIES);
223                return tags;
224        }
225
226        
227}
228
229
230
231