222 public static SpecialCreator
pickSpecialFor(SectorEntityToken entity, SpecialCreationContext context) {
229 WeightedRandomPicker<SpecialCreator> picker =
new WeightedRandomPicker<SpecialCreator>(random);
233 String type = entity.getCustomEntityType();
235 WeightedRandomPicker<String> recoverableShipFactions =
getNearbyFactions(random, entity);
237 if (entity.getContainingLocation().hasTag(Tags.THEME_REMNANT)) {
238 recoverableShipFactions = Misc.createStringPicker(random,
239 Factions.TRITACHYON, 10f, Factions.HEGEMONY, 7f, Factions.INDEPENDENT, 3f);
248 WeightedRandomPicker<String> remnantsFaction = Misc.createStringPicker(random, Factions.REMNANTS, 10f);
249 WeightedRandomPicker<String> piratesFaction = Misc.createStringPicker(random, Factions.PIRATES, 10f);
252 WeightedRandomPicker<String> trapFactions = piratesFaction;
253 if (entity.getContainingLocation().hasTag(Tags.THEME_REMNANT_SUPPRESSED) ||
254 entity.getContainingLocation().hasTag(Tags.THEME_REMNANT_RESURGENT)) {
255 trapFactions = remnantsFaction;
269 WeightedRandomPicker<String> officerFactions = recoverableShipFactions;
276 WeightedRandomPicker<String> habCargo =
getHabCargo(random);
280 if (entity instanceof PlanetAPI) {
282 float sizeMult = TechMining.getTechMiningRuinSizeModifier(entity.getMarket());
284 picker.add(
new NothingSpecialCreator(), 30f);
285 picker.add(
new ShipRecoverySpecialCreator(random, 1, 2,
false, DerelictType.CIVILIAN, recoverableShipFactions), 5f);
286 picker.add(
new ShipRecoverySpecialCreator(random, 1, 3,
false, DerelictType.SMALL, recoverableShipFactions), 10f);
287 picker.add(
new ShipRecoverySpecialCreator(random, 1, 1,
false, DerelictType.MEDIUM, recoverableShipFactions), 3f);
288 picker.add(
new ShipRecoverySpecialCreator(random, 1, 1,
false, DerelictType.LARGE, recoverableShipFactions), 1f);
290 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.MARINES, 100 * sizeMult, 200 * sizeMult,
null), 2f);
291 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.CREW, 500 * sizeMult, 1000 * sizeMult,
null), 6f);
292 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.ORGANS, 50 * sizeMult, 500 * sizeMult,
null), 3f);
294 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.OFFICER,
STANDARD_PODS_OFFICER_LEVEL, maxPodsOfficerLevel, officerFactions), 1f);
296 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.ADMIN, 1, 1, officerFactions), 5f);
298 picker.add(
new CargoManifestSpecialCreator(random, industryCargo, 500 * sizeMult, 2500 * sizeMult), 15f);
299 picker.add(
new CargoManifestSpecialCreator(random, valuableCargo, 500 * sizeMult, 2500 * sizeMult), 15f);
301 picker.add(
new TransmitterTrapSpecialCreator(random, 0.5f, FleetTypes.PATROL_LARGE, trapFactions,
302 (
int)(10 + 30 * sizeMult), (
int)(10 + 30 * sizeMult)), 10f);
303 picker.add(
new TopographicDataSpecialCreator(random, HTPoints.LOW_MIN, HTPoints.HIGH_MAX), 3f);
315 PerShipData shipData = plugin.
getData().ship;
316 ShipVariantAPI variant = shipData.variant;
317 if (variant ==
null && shipData.variantId !=
null) {
320 float p = variant.getHullSpec().getMaxCrew();
321 float c = variant.getHullSpec().getCargo();
323 picker.add(
new NothingSpecialCreator(), 40f);
324 picker.add(
new ShipRecoverySpecialCreator(random, 0, 0,
false,
null,
null), 30f);
325 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.MARINES, p * 0.125f, p * 0.25f,
null), 2f);
326 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.CREW, p * 0.25f, p * 0.5f,
null), 7f);
327 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.ORGANS, p * 0.1f, p * 0.2f,
null), 3f);
328 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.OFFICER,
STANDARD_PODS_OFFICER_LEVEL, maxPodsOfficerLevel, officerFactions), 10f);
329 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.ADMIN, 1, 1, officerFactions), 0.2f);
330 picker.add(
new CargoManifestSpecialCreator(random, valuableCargo, c * 0.25f, c * 0.5f), 10f);
331 picker.add(
new SurveyDataSpecialCreator(random, SurveyDataSpecialType.AUTO_PICK_NOT_SYSTEM), 10f);
332 picker.add(
new BreadcrumbSpecialCreator(random, context.all), 10f);
333 picker.add(
new TopographicDataSpecialCreator(random, HTPoints.LOW_MIN, HTPoints.LOW_MAX), 5f);
335 if (entity.getOrbit() !=
null) {
336 picker.add(
new TransmitterTrapSpecialCreator(random, 0.5f, FleetTypes.PATROL_SMALL, trapFactions, 4, 25), 10f);
339 if (!entity.hasTag(Tags.EXPIRES)) {
340 picker.add(
new BlueprintSpecialCreator(random), 1f);
345 boolean debris = entity instanceof CampaignTerrainAPI &&
346 ((CampaignTerrainAPI)entity).getPlugin() instanceof DebrisFieldTerrainPlugin;
348 picker.add(
new NothingSpecialCreator(), 60f);
349 picker.add(
new ShipRecoverySpecialCreator(random, 1, 3,
true,
null, recoverableShipFactions), 10f);
350 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.MARINES, 10, 30,
null), 2f);
351 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.CREW, 10, 50,
null), 6f);
352 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.ORGANS, 1, 5,
null), 3f);
353 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.OFFICER,
STANDARD_PODS_OFFICER_LEVEL, maxPodsOfficerLevel, officerFactions), 1f);
354 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.ADMIN, 1, 5, officerFactions), 0.2f);
355 picker.add(
new CargoManifestSpecialCreator(random, valuableCargo, 10, 50), 10f);
356 picker.add(
new SurveyDataSpecialCreator(random, SurveyDataSpecialType.AUTO_PICK_NOT_SYSTEM), 10f);
357 picker.add(
new BreadcrumbSpecialCreator(random, context.all), 10f);
358 picker.add(
new TransmitterTrapSpecialCreator(random, 0.5f, FleetTypes.PATROL_SMALL, trapFactions, 4, 25), 10f);
359 picker.add(
new TopographicDataSpecialCreator(random, HTPoints.LOW_MIN, HTPoints.LOW_MAX), 1f);
362 if (Entities.STATION_MINING_REMNANT.equals(type) || Entities.STATION_MINING.equals(type)) {
363 picker.add(
new NothingSpecialCreator(), 30f);
364 picker.add(
new ShipRecoverySpecialCreator(random, 1, 3,
false, DerelictType.CIVILIAN, recoverableShipFactions), 10f);
365 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.MARINES, 10, 20,
null), 1f);
366 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.CREW, 100, 200,
null), 6f);
367 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.ORGANS, 5, 50,
null), 3f);
368 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.OFFICER,
STANDARD_PODS_OFFICER_LEVEL, maxPodsOfficerLevel, officerFactions), 1f);
369 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.ADMIN, 1, 5, officerFactions), 3f);
370 picker.add(
new CargoManifestSpecialCreator(random, industryCargo, 50, 250), 30f);
371 picker.add(
new SurveyDataSpecialCreator(random, SurveyDataSpecialType.AUTO_PICK), 20f);
372 picker.add(
new BreadcrumbSpecialCreator(random, context.all), 10f);
373 picker.add(
new TransmitterTrapSpecialCreator(random, 0.5f, FleetTypes.PATROL_MEDIUM, trapFactions, 10, 16), 10f);
374 picker.add(
new TopographicDataSpecialCreator(random, HTPoints.MEDIUM_MIN, HTPoints.MEDIUM_MAX), 1f);
377 if (Entities.STATION_RESEARCH_REMNANT.equals(type) || Entities.STATION_RESEARCH.equals(type)) {
378 picker.add(
new NothingSpecialCreator(), 30f);
379 picker.add(
new ShipRecoverySpecialCreator(random, 1, 3,
false, DerelictType.CIVILIAN, recoverableShipFactions), 10f);
380 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.MARINES, 50, 100,
null), 2f);
381 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.CREW, 100, 200,
null), 6f);
382 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.ORGANS, 5, 50,
null), 3f);
383 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.OFFICER,
STANDARD_PODS_OFFICER_LEVEL, maxPodsOfficerLevel, officerFactions), 1f);
384 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.ADMIN, 1, 5, officerFactions), 3f);
385 picker.add(
new CargoManifestSpecialCreator(random, valuableCargo, 10, 30), 10f);
386 picker.add(
new SurveyDataSpecialCreator(random, SurveyDataSpecialType.AUTO_PICK), 10f);
387 picker.add(
new BreadcrumbSpecialCreator(random, context.all), 10f);
388 picker.add(
new TransmitterTrapSpecialCreator(random, 0.5f, FleetTypes.PATROL_MEDIUM, trapFactions, 10, 16), 20f);
389 picker.add(
new TopographicDataSpecialCreator(random, HTPoints.HIGH_MIN, HTPoints.HIGH_MAX), 10f);
392 if (Entities.ORBITAL_HABITAT_REMNANT.equals(type) || Entities.ORBITAL_HABITAT.equals(type)) {
393 picker.add(
new NothingSpecialCreator(), 40f);
394 picker.add(
new ShipRecoverySpecialCreator(random, 1, 3,
false, DerelictType.CIVILIAN, recoverableShipFactions), 20f);
395 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.MARINES, 50, 100,
null), 6f);
396 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.CREW, 100, 200,
null), 20f);
397 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.ORGANS, 5, 50,
null), 5f);
398 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.OFFICER,
STANDARD_PODS_OFFICER_LEVEL, maxPodsOfficerLevel, officerFactions), 10f);
399 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.ADMIN, 1, 5, officerFactions), 5f);
400 picker.add(
new CargoManifestSpecialCreator(random, habCargo, 10, 30), 10f);
401 picker.add(
new SurveyDataSpecialCreator(random, SurveyDataSpecialType.AUTO_PICK), 5f);
402 picker.add(
new BreadcrumbSpecialCreator(random, context.all), 10f);
403 picker.add(
new TransmitterTrapSpecialCreator(random, 0.5f, FleetTypes.PATROL_MEDIUM, trapFactions, 10, 16), 10f);
404 picker.add(
new TopographicDataSpecialCreator(random, HTPoints.MEDIUM_MIN, HTPoints.MEDIUM_MAX), 2f);
408 List<String> weapons = Arrays.asList(Entities.WEAPONS_CACHE, Entities.WEAPONS_CACHE_HIGH, Entities.WEAPONS_CACHE_LOW, Entities.WEAPONS_CACHE_REMNANT);
409 if (weapons.contains(type)) {
410 picker.add(
new NothingSpecialCreator(), 30f);
411 picker.add(
new ShipRecoverySpecialCreator(random, 1, 1,
false, DerelictType.SMALL, recoverableShipFactions), 10f);
412 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.MARINES, 50, 100,
null), 1f);
413 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.OFFICER,
STANDARD_PODS_OFFICER_LEVEL, maxPodsOfficerLevel, officerFactions), 2f);
414 picker.add(
new CargoManifestSpecialCreator(random, valuableCargo, 10, 30), 10f);
415 picker.add(
new TransmitterTrapSpecialCreator(random, 0.5f, FleetTypes.PATROL_SMALL, trapFactions, 4, 8), 10f);
418 List<String> weaponsSmall = Arrays.asList(Entities.WEAPONS_CACHE_SMALL, Entities.WEAPONS_CACHE_SMALL_HIGH,
419 Entities.WEAPONS_CACHE_SMALL_LOW, Entities.WEAPONS_CACHE_SMALL_REMNANT);
420 if (weaponsSmall.contains(type)) {
421 picker.add(
new NothingSpecialCreator(), 30f);
422 picker.add(
new ShipRecoverySpecialCreator(random, 1, 1,
false, DerelictType.SMALL, recoverableShipFactions), 10f);
423 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.OFFICER,
STANDARD_PODS_OFFICER_LEVEL, maxPodsOfficerLevel, officerFactions), 1f);
424 picker.add(
new CargoManifestSpecialCreator(random, valuableCargo, 10, 30), 10f);
425 picker.add(
new TransmitterTrapSpecialCreator(random, 0.5f, FleetTypes.PATROL_SMALL, trapFactions, 4, 8), 10f);
429 List<String> supplies = Arrays.asList(Entities.SUPPLY_CACHE);
430 if (supplies.contains(type)) {
431 picker.add(
new NothingSpecialCreator(), 30f);
432 picker.add(
new ShipRecoverySpecialCreator(random, 1, 1,
false, DerelictType.SMALL, recoverableShipFactions), 10f);
433 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.OFFICER,
STANDARD_PODS_OFFICER_LEVEL, maxPodsOfficerLevel, officerFactions), 1f);
434 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.ADMIN, 1, 5, officerFactions), 0.2f);
435 picker.add(
new CargoManifestSpecialCreator(random, valuableCargo, 10, 30), 10f);
436 picker.add(
new TransmitterTrapSpecialCreator(random, 0.5f, FleetTypes.PATROL_SMALL, trapFactions, 4, 8), 10f);
439 List<String> suppliesSmall = Arrays.asList(Entities.SUPPLY_CACHE_SMALL);
440 if (suppliesSmall.contains(type)) {
441 picker.add(
new NothingSpecialCreator(), 30f);
442 picker.add(
new ShipRecoverySpecialCreator(random, 1, 1,
false, DerelictType.SMALL, recoverableShipFactions), 10f);
443 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.OFFICER,
STANDARD_PODS_OFFICER_LEVEL, maxPodsOfficerLevel, officerFactions), 1f);
444 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.ADMIN, 1, 5, officerFactions), 0.2f);
445 picker.add(
new CargoManifestSpecialCreator(random, valuableCargo, 10, 30), 10f);
446 picker.add(
new TransmitterTrapSpecialCreator(random, 0.5f, FleetTypes.PATROL_SMALL, trapFactions, 4, 8), 10f);
450 List<String> equipment = Arrays.asList(Entities.EQUIPMENT_CACHE);
451 if (equipment.contains(type)) {
452 picker.add(
new NothingSpecialCreator(), 30f);
453 picker.add(
new ShipRecoverySpecialCreator(random, 1, 1,
false, DerelictType.SMALL, recoverableShipFactions), 10f);
454 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.OFFICER,
STANDARD_PODS_OFFICER_LEVEL, maxPodsOfficerLevel, officerFactions), 1f);
455 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.ADMIN, 1, 5, officerFactions), 0.2f);
456 picker.add(
new CargoManifestSpecialCreator(random, industryCargo, 10, 30), 10f);
457 picker.add(
new TransmitterTrapSpecialCreator(random, 0.5f, FleetTypes.PATROL_SMALL, trapFactions, 4, 8), 10f);
458 picker.add(
new TopographicDataSpecialCreator(random, HTPoints.LOW_MIN, HTPoints.LOW_MAX), 1f);
461 List<String> equipmentSmall = Arrays.asList(Entities.EQUIPMENT_CACHE_SMALL);
462 if (equipmentSmall.contains(type)) {
463 picker.add(
new NothingSpecialCreator(), 30f);
464 picker.add(
new ShipRecoverySpecialCreator(random, 1, 1,
false, DerelictType.SMALL, recoverableShipFactions), 10f);
465 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.OFFICER,
STANDARD_PODS_OFFICER_LEVEL, maxPodsOfficerLevel, officerFactions), 1f);
466 picker.add(
new SleeperPodsSpecialCreator(random, SleeperSpecialType.ADMIN, 1, 5, officerFactions), 0.2f);
467 picker.add(
new CargoManifestSpecialCreator(random, industryCargo, 10, 30), 10f);
468 picker.add(
new TransmitterTrapSpecialCreator(random, 0.5f, FleetTypes.PATROL_SMALL, trapFactions, 4, 8), 10f);
472 return picker.pick();