1package com.fs.starfarer.api.impl.campaign.fleets;
3import java.util.Random;
5import com.fs.starfarer.api.Global;
6import com.fs.starfarer.api.campaign.CampaignFleetAPI;
7import com.fs.starfarer.api.campaign.SectorEntityToken;
8import com.fs.starfarer.api.campaign.econ.MarketAPI;
9import com.fs.starfarer.api.impl.campaign.fleets.FleetFactory.MercType;
10import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.OptionalFleetData;
11import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteData;
12import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteSegment;
13import com.fs.starfarer.api.impl.campaign.ids.Factions;
14import com.fs.starfarer.api.impl.campaign.ids.Tags;
15import com.fs.starfarer.api.impl.campaign.intel.SystemBountyManager;
16import com.fs.starfarer.api.util.Misc;
17import com.fs.starfarer.api.util.WeightedRandomPicker;
34 if (from ==
null)
return;
37 if (to ==
null)
return;
39 Long seed =
new Random().nextLong();
42 OptionalFleetData extra =
new OptionalFleetData(from);
46 float orbitDays = 2f + (float) Math.random() * 3f;
47 float deorbitDays = 2f + (float) Math.random() * 3f;
48 float patrolDays = 2f + (float) Math.random() * 3f;
50 SectorEntityToken target = to.getPrimaryEntity();
51 if ((
float) Math.random() > 0.25f && to.getStarSystem() !=
null) {
52 if ((
float) Math.random() > 0.25f) {
53 target = to.getStarSystem().getCenter();
55 target = to.getStarSystem().getHyperspaceAnchor();
59 if (from.getContainingLocation() == to.getContainingLocation() && !from.getContainingLocation().isHyperspace()) {
60 route.addSegment(
new RouteSegment(
ROUTE_PREPARE, orbitDays, from.getPrimaryEntity()));
61 route.addSegment(
new RouteSegment(
ROUTE_PATROL, patrolDays, target));
62 route.addSegment(
new RouteSegment(
ROUTE_STAND_DOWN, deorbitDays, from.getPrimaryEntity()));
64 route.addSegment(
new RouteSegment(
ROUTE_PREPARE, orbitDays, from.getPrimaryEntity()));
65 route.addSegment(
new RouteSegment(
ROUTE_TRAVEL, from.getPrimaryEntity(), to.getPrimaryEntity()));
66 route.addSegment(
new RouteSegment(
ROUTE_PATROL, patrolDays, target));
67 route.addSegment(
new RouteSegment(
ROUTE_RETURN, to.getPrimaryEntity(), from.getPrimaryEntity()));
68 route.addSegment(
new RouteSegment(
ROUTE_STAND_DOWN, deorbitDays, from.getPrimaryEntity()));
73 WeightedRandomPicker<MercType> picker =
new WeightedRandomPicker<MercType>(random);
74 picker.add(MercType.SCOUT, 10f);
75 picker.add(MercType.BOUNTY_HUNTER, 10f);
76 picker.add(MercType.PRIVATEER, 10f);
77 picker.add(MercType.PATROL, 10f);
78 picker.add(MercType.ARMADA, 3f);
79 MercType type = picker.pick();
84 Random random = route.getRandom();
91 String fleetType = type.fleetType;
94 combat = Math.round(1f + random.nextFloat() * 2f);
98 combat = Math.round(3f + random.nextFloat() * 2f);
101 combat = Math.round(9f + random.nextFloat() * 3f);
102 tanker = Math.round(random.nextFloat()) * 5f;
105 combat = Math.round(10f + random.nextFloat() * 4f);
106 tanker = Math.round(random.nextFloat()) * 10f;
107 freighter = Math.round(random.nextFloat()) * 10f;
116 Factions.INDEPENDENT,
117 route.getQualityOverride() + 0.2f,
127 params.timestamp = route.getTimestamp();
128 params.random = random;
131 if (fleet ==
null || fleet.isEmpty())
return null;
133 route.getMarket().getContainingLocation().addEntity(fleet);
134 fleet.setFacing((
float) Math.random() * 360f);
136 fleet.setLocation(route.getMarket().getPrimaryEntity().getLocation().x, route.getMarket().getPrimaryEntity().getLocation().x);
147 WeightedRandomPicker<MarketAPI> picker =
new WeightedRandomPicker<MarketAPI>();
148 for (MarketAPI market :
Global.
getSector().getEconomy().getMarketsCopy()) {
149 if (market.isHidden())
continue;
150 if (market.getFactionId().equals(Factions.PIRATES))
continue;
151 if (market.getFaction().isHostileTo(Factions.INDEPENDENT))
continue;
153 if (!market.hasSpaceport())
continue;
155 if (market.getStarSystem() !=
null && market.getStarSystem().hasTag(Tags.SYSTEM_CUT_OFF_FROM_HYPER)) {
167 float mult = Misc.getSpawnChanceMult(market.getLocationInHyperspace());
168 float w = market.getStabilityValue() + market.getSize();
171 picker.add(market, w);
173 return picker.pick();
178 WeightedRandomPicker<MarketAPI> picker =
new WeightedRandomPicker<MarketAPI>();
182 for (MarketAPI market :
Global.
getSector().getEconomy().getMarketsCopy()) {
184 if (market.getFaction().isHostileTo(Factions.INDEPENDENT))
continue;
185 if (market.getStarSystem() ==
null)
continue;
186 if (market.isHidden())
continue;
188 if (market.getStarSystem() !=
null && market.getStarSystem().hasTag(Tags.SYSTEM_CUT_OFF_FROM_HYPER)) {
192 float dist = Misc.getDistance(market.getLocationInHyperspace(), source.getLocationInHyperspace());
193 if (dist < 1000) dist = 1000;
194 float weight = 10000f / dist;
196 if (SystemBountyManager.getInstance().isActive(market)) {
200 picker.add(market, weight);
202 MarketAPI market = picker.pick();
217 return "mercs_global";
static SettingsAPI getSettings()
static SectorAPI getSector()
static CampaignFleetAPI createFleet(FleetParamsV3 params)
boolean shouldRepeat(RouteData route)
static final Integer ROUTE_STAND_DOWN
void addRouteFleetIfPossible()
static final Integer ROUTE_PATROL
boolean shouldCancelRouteAfterDelayCheck(RouteData route)
CampaignFleetAPI spawnFleet(RouteData route)
MercType pickFleetType(Random random)
void reportAboutToBeDespawnedByRouteManager(RouteData route)
static final Integer ROUTE_PREPARE
MarketAPI pickNearbyMarketToDefend(MarketAPI source)
static final Integer ROUTE_TRAVEL
String getRouteSourceId()
static final Integer ROUTE_RETURN
RouteData addRoute(String source, MarketAPI market, Long seed, OptionalFleetData extra, RouteFleetSpawner spawner)
static RouteManager getInstance()
float getFloat(String key)