1package com.fs.starfarer.api.impl.campaign.fleets;
3import java.util.ArrayList;
4import java.util.Collections;
5import java.util.Comparator;
6import java.util.LinkedHashMap;
9import java.util.Random;
11import com.fs.starfarer.api.Global;
12import com.fs.starfarer.api.campaign.CampaignFleetAPI;
13import com.fs.starfarer.api.campaign.CargoAPI;
14import com.fs.starfarer.api.campaign.FactionAPI.ShipPickParams;
15import com.fs.starfarer.api.campaign.econ.CommoditySpecAPI;
16import com.fs.starfarer.api.campaign.econ.MarketAPI;
17import com.fs.starfarer.api.fleet.FleetMemberAPI;
18import com.fs.starfarer.api.fleet.ShipRolePick;
19import com.fs.starfarer.api.impl.campaign.econ.impl.BaseIndustry;
20import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteData;
21import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteSegment;
22import com.fs.starfarer.api.impl.campaign.ids.Commodities;
23import com.fs.starfarer.api.impl.campaign.ids.Factions;
24import com.fs.starfarer.api.impl.campaign.ids.ShipRoles;
25import com.fs.starfarer.api.impl.campaign.procgen.themes.RouteFleetAssignmentAI;
26import com.fs.starfarer.api.util.IntervalUtil;
27import com.fs.starfarer.api.util.Misc;
28import com.fs.starfarer.api.util.WeightedRandomPicker;
32 public static class CargoQuantityData {
35 public CargoQuantityData(String cargo,
int units) {
46 public static class EconomyRouteData {
47 public float cargoCap, fuelCap, personnelCap;
49 public boolean smuggling =
false;
53 public List<CargoQuantityData> cargoDeliver =
new ArrayList<CargoQuantityData>();
54 public List<CargoQuantityData> cargoReturn =
new ArrayList<CargoQuantityData>();
56 public void addDeliver(String
id,
int qty) {
57 cargoDeliver.add(
new CargoQuantityData(
id, qty));
59 public void addReturn(String
id,
int qty) {
60 cargoReturn.add(
new CargoQuantityData(
id, qty));
63 public static String getCargoList(List<CargoQuantityData> cargo) {
64 List<String> strings =
new ArrayList<String>();
66 List<CargoQuantityData> sorted =
new ArrayList<CargoQuantityData>(cargo);
67 Collections.sort(sorted,
new Comparator<CargoQuantityData>() {
68 public int compare(CargoQuantityData o1, CargoQuantityData o2) {
75 return o2.units - o1.units;
79 for (CargoQuantityData curr : sorted) {
84 strings.add(
"ship hulls");
89 if (spec.
isMeta())
continue;
90 strings.add(spec.
getName().toLowerCase());
92 if (strings.size() > 4) {
93 List<String> copy =
new ArrayList<String>();
94 copy.add(strings.get(0));
95 copy.add(strings.get(1));
96 copy.add(
"other commodities");
104 private String origFaction;
109 origFaction =
route.getFactionId();
112 factionChangeTracker =
null;
127 EconomyRouteData data = (EconomyRouteData)
route.getCustom();
129 Integer
id = segment.getId();
132 return EconomyRouteData.getCargoList(data.cargoDeliver);
134 return EconomyRouteData.getCargoList(data.cargoReturn);
150 Integer
id = segment.getId();
159 EconomyRouteData data =
getData();
161 List<CargoQuantityData> list = data.cargoDeliver;
163 cargoSource = data.to;
164 list = data.cargoReturn;
171 Map<String, Float> target =
new LinkedHashMap<String, Float>();
173 for (CargoQuantityData curr : list) {
178 ships = Math.max(ships, curr.units);
191 target.put(curr.cargo, qty);
196 if (total <= 0)
return;
199 for (String cid : target.keySet()) {
200 float qty = target.get(cid);
202 cargo.
addCommodity(cid, ((
int) qty * Math.min(1f, maxCargo / total)));
208 if (member.isMothballed()) {
213 if (units <= 0)
return;
216 Random random =
new Random();
217 if (
route.getSeed() !=
null) {
218 random =
new Random(
route.getSeed());
221 float add = units * 1.5f + random.nextInt(3);
223 EconomyRouteData data =
getData();
225 for (
int i = 0; i < add; i++) {
241 String role = roles.
pick();
242 ShipPickParams params = ShipPickParams.priority();
243 if (!sameFaction) params = ShipPickParams.imported();
244 List<ShipRolePick> picks = market.
pickShipsForRole(role, params, random,
null);
257 if (list.isEmpty()) {
265 if (list.isEmpty()) {
276 Integer
id = segment.getId();
278 if (list.isEmpty()) {
283 if (list.isEmpty()) {
286 return "returning to " +
getData().from.
getName() +
" with " + list;
288 return super.getTravelActionText(segment);
295 Integer
id = segment.getId();
298 if (list.isEmpty()) {
303 if (list.isEmpty()) {
308 return "resupplying";
311 return super.getInSystemActionText(segment);
317 super.addEndingAssignment(current, justSpawned);
323 super.addLocalAssignment(current, justSpawned);
329 super.addStartingAssignment(current, justSpawned);
335 super.addTravelAssignment(current, justSpawned);
341 EconomyRouteData data = (EconomyRouteData)
route.getCustom();
348 super.advance(amount);
354 EconomyRouteData data =
getData();
355 if (!data.smuggling)
return;
363 factionChangeTracker.
advance(days);
364 if (factionChangeTracker.intervalElapsed() &&
fleet.
getAI() !=
null) {
373 String targetFac = origFaction;
386 String targetFac = origFaction;
static SettingsAPI getSettings()
static SectorAPI getSector()
void syncMothballedShips(float units, MarketAPI market)
void addTravelAssignment(RouteSegment current, boolean justSpawned)
String getEndingActionText(RouteSegment segment)
String getCargoList(RouteSegment segment)
void updateCargo(RouteSegment segment)
void addEndingAssignment(RouteSegment current, boolean justSpawned)
String getInSystemActionText(RouteSegment segment)
void advance(float amount)
void addStartingAssignment(RouteSegment current, boolean justSpawned)
String getTravelActionText(RouteSegment segment)
void doSmugglingFactionChangeCheck(float amount)
String getStartingActionText(RouteSegment segment)
static String getCargoList(RouteData route, RouteSegment segment)
static String getCargoListReturn(RouteData route)
EconomyRouteData getData()
static String getCargoListDeliver(RouteData route)
void addLocalAssignment(RouteSegment current, boolean justSpawned)
EconomyFleetAssignmentAI(CampaignFleetAPI fleet, RouteData route)
static final Integer ROUTE_SRC_LOAD
static final Integer ROUTE_RESUPPLY_WS
static final Integer ROUTE_TRAVEL_DST
static final Integer ROUTE_TRAVEL_BACK_WS
static final Integer ROUTE_RESUPPLY_BACK_WS
static final Integer ROUTE_DST_UNLOAD
static final Integer ROUTE_DST_LOAD
static final Integer ROUTE_TRAVEL_SRC
static final Integer ROUTE_TRAVEL_WS
static final String MARINES
static final String SHIPS
static final String INDEPENDENT
static final String TANKER_LARGE
static final String TANKER_SMALL
static final String COMBAT_FREIGHTER_MEDIUM
static final String FREIGHTER_MEDIUM
static final String COMBAT_FREIGHTER_SMALL
static final String COMBAT_FREIGHTER_LARGE
static final String FREIGHTER_LARGE
static final String TANKER_MEDIUM
static final String FREIGHTER_SMALL
void forceIntervalElapsed()
void advance(float amount)
static String getAndJoined(List< String > strings)
CommoditySpecAPI getCommoditySpec(String commodityId)
float convertToDays(float realSeconds)
LocationAPI getContainingLocation()
CampaignFleetAIAPI getAI()
void setFaction(String factionId, boolean includeCaptains)
FleetDataAPI getFleetData()
void addFuel(float quantity)
void addCommodity(String commodityId, float quantity)
boolean isHostileTo(FactionAPI other)
void addFleetMember(FleetMemberAPI member)
void removeFleetMember(FleetMemberAPI member)
List< FleetMemberAPI > getMembersListCopy()
CampaignClockAPI getClock()
List< ShipRolePick > pickShipsForRole(String role, ShipPickParams params, Random random, ShipFilter filter)
StarSystemAPI getStarSystem()
RepairTrackerAPI getRepairTracker()
void setMothballed(boolean mothballed)