001package com.fs.starfarer.api.impl.campaign.tutorial;
002
003import com.fs.starfarer.api.Global;
004import com.fs.starfarer.api.campaign.CampaignFleetAPI;
005import com.fs.starfarer.api.campaign.CommDirectoryEntryAPI;
006import com.fs.starfarer.api.campaign.CommDirectoryEntryAPI.EntryType;
007import com.fs.starfarer.api.campaign.FactionAPI;
008import com.fs.starfarer.api.campaign.FleetAssignment;
009import com.fs.starfarer.api.campaign.LocationAPI;
010import com.fs.starfarer.api.campaign.SectorEntityToken;
011import com.fs.starfarer.api.campaign.StarSystemAPI;
012import com.fs.starfarer.api.campaign.econ.MarketAPI;
013import com.fs.starfarer.api.characters.PersonAPI;
014import com.fs.starfarer.api.impl.campaign.fleets.FleetFactoryV3;
015import com.fs.starfarer.api.impl.campaign.fleets.SourceBasedFleetManager;
016import com.fs.starfarer.api.impl.campaign.ids.Abilities;
017import com.fs.starfarer.api.impl.campaign.ids.Factions;
018import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
019import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
020import com.fs.starfarer.api.impl.campaign.ids.Submarkets;
021import com.fs.starfarer.api.util.Misc;
022import com.fs.starfarer.api.util.WeightedRandomPicker;
023
024public class RogueMinerMiscFleetManager extends SourceBasedFleetManager {
025
026        protected float daysRemaining = 40f;
027        
028        public RogueMinerMiscFleetManager(SectorEntityToken source) {
029                super(source, 3f, 0, 5, 5f);
030        }
031
032        @Override
033        public void advance(float amount) {
034                super.advance(amount);
035                
036                if (isDone()) return;
037                
038                float days = Global.getSector().getClock().convertToDays(amount);
039                daysRemaining -= days;
040                if (daysRemaining <= 0 && source != null) {
041                        // source is Derinkuyu; going back to independent status
042                        if (source.getMarket() != null && source.getMarket().isInEconomy()) {
043                                source.setFaction(Factions.INDEPENDENT);
044                                source.getMarket().setFactionId(Factions.INDEPENDENT);
045                                
046                                if (source.getMarket().getCommDirectory() != null &&
047                                                source.getMarket().getCommDirectory().getEntriesCopy() != null) {
048                                        for (CommDirectoryEntryAPI entry : source.getMarket().getCommDirectory().getEntriesCopy()) {
049                                                if (entry.getType() == EntryType.PERSON && entry.getEntryData() instanceof PersonAPI) {
050                                                        PersonAPI p = (PersonAPI) entry.getEntryData();
051                                                        p.setFaction(Factions.INDEPENDENT);
052                                                }
053                                        }
054                                }
055                                
056                                FactionAPI ind = Global.getSector().getFaction(Factions.INDEPENDENT);
057                                if (source.getMarket() != null && source.getMarket().getSubmarket(Submarkets.SUBMARKET_OPEN) != null) {
058                                        source.getMarket().getSubmarket(Submarkets.SUBMARKET_OPEN).setFaction(ind);
059                                }
060                        }
061                        
062                        setDone(true);
063                }
064        }
065
066
067
068        @Override
069        protected CampaignFleetAPI spawnFleet() {
070                if (source == null) return null;
071                CampaignFleetAPI fleet = createEmptyRogueFleet("Rogue Miner Force", false);
072        
073                WeightedRandomPicker<String> picker1 = new WeightedRandomPicker<String>();
074                picker1.add("cerberus_d_Standard");
075                picker1.add("hound_d_Standard");
076                picker1.add("kite_pirates_Raider");
077                //picker1.add("shepherd_Frontier");
078                
079                WeightedRandomPicker<String> picker2 = new WeightedRandomPicker<String>();
080                picker2.add("hammerhead_d_CS");
081                picker2.add("enforcer_d_Strike");
082                picker2.add("sunder_d_Assault");
083                picker2.add("buffalo2_FS");
084                picker2.add("condor_Support");
085                picker2.add("condor_Attack");
086                
087                
088                fleet.getFleetData().addFleetMember(picker1.pick());
089                fleet.getFleetData().addFleetMember(picker1.pick());
090                if ((float) Math.random() > 0.5f) fleet.getFleetData().addFleetMember(picker1.pick());
091                fleet.getFleetData().addFleetMember(picker2.pick());
092                if ((float) Math.random() > 0.5f) fleet.getFleetData().addFleetMember(picker2.pick());
093                
094                fleet.getFleetData().sort();
095                
096                LocationAPI location = source.getContainingLocation();
097                location.addEntity(fleet);
098                fleet.setLocation(source.getLocation().x, source.getLocation().y);
099                
100                
101                WeightedRandomPicker<MarketAPI> marketPicker = new WeightedRandomPicker<MarketAPI>();
102                for (MarketAPI market : Global.getSector().getEconomy().getMarketsCopy()) {
103                        if (market == source) continue;
104                        if (market.isHidden()) continue;
105                        if (Factions.PIRATES.equals(market.getFactionId())) {
106                                float dist = Misc.getDistance(source.getLocationInHyperspace(), market.getLocationInHyperspace());
107                                float w = Math.max(1000f, 50000f - dist);
108                                marketPicker.add(market, w);
109                        }
110                }
111                
112                MarketAPI market = marketPicker.pick();
113                if (market != null) {
114                        fleet.addAssignment(FleetAssignment.RAID_SYSTEM, ((StarSystemAPI)source.getContainingLocation()).getCenter(), 40f);
115                        Misc.giveStandardReturnAssignments(fleet, market.getPrimaryEntity(), "heading to", false);
116                } else {
117                        fleet.addAssignment(FleetAssignment.RAID_SYSTEM, ((StarSystemAPI)source.getContainingLocation()).getCenter(), 100f);
118                        Misc.giveStandardReturnToSourceAssignments(fleet, false);
119                }
120                
121                
122                return fleet;
123        }
124        
125        public static CampaignFleetAPI createEmptyRogueFleet(String name, boolean withFaction) {
126                CampaignFleetAPI fleet = FleetFactoryV3.createEmptyFleet(Factions.PIRATES, FleetTypes.MERC_SCOUT, null);
127                
128                fleet.setName(name);
129                fleet.setNoFactionInName(!withFaction);
130        
131                fleet.removeAbility(Abilities.INTERDICTION_PULSE);
132                
133                fleet.getStats().getFleetwideMaxBurnMod().modifyMult("tutorial", 0.6f);
134                //fleet.getStats().getDetectedRangeMod().modifyFlat("tutorial", 500f);
135                
136                fleet.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_PIRATE, true);
137                fleet.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_NO_JUMP, true);
138                fleet.getMemoryWithoutUpdate().set("$rogueMiner", true);
139                
140                fleet.getMemoryWithoutUpdate().set(MemFlags.FLEET_NO_MILITARY_RESPONSE, true);
141                
142                return fleet;
143        }
144        
145        
146        public static CampaignFleetAPI createGuardFleet(boolean stronger) {
147                CampaignFleetAPI fleet = createEmptyRogueFleet("Rogue Miner Force", false);
148        
149                WeightedRandomPicker<String> picker1 = new WeightedRandomPicker<String>();
150                picker1.add("cerberus_d_Standard");
151                picker1.add("hound_d_Standard");
152                picker1.add("kite_pirates_Raider");
153                picker1.add("shepherd_Frontier");
154                
155                WeightedRandomPicker<String> picker2 = new WeightedRandomPicker<String>();
156                picker2.add("hammerhead_d_CS");
157                picker2.add("enforcer_d_Strike");
158                picker2.add("sunder_d_Assault");
159                picker2.add("buffalo2_FS");
160                
161                
162                fleet.getFleetData().addFleetMember(picker1.pick());
163                if (stronger) fleet.getFleetData().addFleetMember(picker1.pick());
164                if ((float) Math.random() > 0.5f) fleet.getFleetData().addFleetMember(picker1.pick());
165                fleet.getFleetData().addFleetMember(picker2.pick());
166                
167                fleet.getFleetData().sort();
168                
169                return fleet;
170        }
171}
172
173
174
175
176
177
178
179
180
181