133 List<MarketAPI> markets = Misc.getFactionMarkets(player);
135 Set<StarSystemAPI> systems =
new LinkedHashSet<StarSystemAPI>();
136 for (MarketAPI curr : markets) {
137 StarSystemAPI system = curr.getStarSystem();
138 if (system !=
null) {
142 if (systems.isEmpty())
return;
144 float marketTotal = markets.size();
145 int numBases = (int) (marketTotal / 2);
146 if (numBases < 1) numBases = 1;
147 if (numBases > 2) numBases = 2;
150 if (
bases.size() >= numBases) {
155 StarSystemAPI initialTarget =
null;
156 float bestWeight = 0f;
157 OUTER:
for (StarSystemAPI curr : systems) {
160 if (m.hasCondition(Conditions.PIRATE_ACTIVITY))
continue OUTER;
161 if (m.getFaction().isPlayerFaction()) {
162 w += m.getSize() * m.getSize();
165 if (w > bestWeight) {
167 initialTarget = curr;
171 if (initialTarget ==
null)
return;
174 if (target ==
null)
return;
176 PirateBaseTier tier =
pickTier(target);
179 if (factionId ==
null)
return;
199 WeightedRandomPicker<String> picker =
new WeightedRandomPicker<String>(
random);
201 if (!faction.isHostileTo(Factions.PLAYER))
continue;
203 if (faction.getCustomBoolean(Factions.CUSTOM_MAKES_PIRATE_BASES)) {
204 picker.add(faction.getId(), 1f);
207 return picker.pick();
242 protected PirateBaseTier
pickTier(StarSystemAPI system) {
244 for (MarketAPI m :
Global.
getSector().getEconomy().getMarkets(system)) {
245 if (m.getFaction().isPlayerFaction()) {
246 max = Math.max(m.getSize(), max);
250 return PirateBaseTier.TIER_5_3MODULE;
251 }
else if (max >= 6) {
252 return PirateBaseTier.TIER_4_3MODULE;
253 }
else if (max >= 5) {
254 return PirateBaseTier.TIER_3_2MODULE;
255 }
else if (max >= 4) {
256 return PirateBaseTier.TIER_2_1MODULE;
258 return PirateBaseTier.TIER_1_1MODULE;
264 WeightedRandomPicker<StarSystemAPI> veryFar =
new WeightedRandomPicker<StarSystemAPI>(
random);
265 WeightedRandomPicker<StarSystemAPI> far =
new WeightedRandomPicker<StarSystemAPI>(
random);
266 WeightedRandomPicker<StarSystemAPI> picker =
new WeightedRandomPicker<StarSystemAPI>(
random);
269 if (system.hasPulsar())
continue;
271 float days =
Global.
getSector().getClock().getElapsedDaysSince(system.getLastPlayerVisitTimestamp());
272 if (days < 180f)
continue;
277 if (system.hasTag(Tags.THEME_MISC_SKIP)) {
279 }
else if (system.hasTag(Tags.THEME_MISC)) {
281 }
else if (system.hasTag(Tags.THEME_REMNANT_NO_FLEETS)) {
283 }
else if (system.hasTag(Tags.THEME_REMNANT_DESTROYED)) {
285 }
else if (system.hasTag(Tags.THEME_RUINS)) {
287 }
else if (system.hasTag(Tags.THEME_CORE_UNPOPULATED)) {
291 if (weight <= 0f)
continue;
293 float usefulStuff = system.getCustomEntitiesWithTag(Tags.OBJECTIVE).size() +
294 system.getCustomEntitiesWithTag(Tags.STABLE_LOCATION).size();
295 if (usefulStuff <= 0)
continue;
297 if (Misc.getMarketsInLocation(system).size() > 0)
continue;
299 float dist = Misc.getDistance(initialTarget.getLocation(), system.getLocation());
301 float distMult = 100000f / dist;
302 distMult *= distMult;
305 veryFar.add(system, weight * usefulStuff * distMult);
306 }
else if (dist > 10000f) {
307 far.add(system, weight * usefulStuff * distMult);
309 picker.add(system, weight * usefulStuff * distMult);
313 if (picker.isEmpty()) {
316 if (picker.isEmpty()) {
317 picker.addAll(veryFar);
320 return picker.pick();