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