1package com.fs.starfarer.api.impl.campaign;
3import java.util.HashSet;
5import java.util.Random;
8import com.fs.starfarer.api.Global;
9import com.fs.starfarer.api.campaign.CampaignEngineLayers;
10import com.fs.starfarer.api.campaign.CargoAPI;
11import com.fs.starfarer.api.campaign.CustomCampaignEntityAPI;
12import com.fs.starfarer.api.campaign.FactionAPI;
13import com.fs.starfarer.api.campaign.SectorEntityToken;
14import com.fs.starfarer.api.campaign.SectorEntityToken.VisibilityLevel;
15import com.fs.starfarer.api.combat.ShipAPI.HullSize;
16import com.fs.starfarer.api.combat.ViewportAPI;
17import com.fs.starfarer.api.fleet.FleetMemberAPI;
18import com.fs.starfarer.api.fleet.FleetMemberType;
19import com.fs.starfarer.api.graphics.SpriteAPI;
20import com.fs.starfarer.api.impl.campaign.ids.Drops;
21import com.fs.starfarer.api.impl.campaign.ids.ShipRoles;
22import com.fs.starfarer.api.impl.campaign.procgen.DropGroupRow;
23import com.fs.starfarer.api.impl.campaign.procgen.SalvageEntityGenDataSpec.DropData;
24import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.BaseSalvageSpecial;
25import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.ShipRecoverySpecial.PerShipData;
26import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.ShipRecoverySpecial.ShipCondition;
27import com.fs.starfarer.api.ui.TooltipMakerAPI;
28import com.fs.starfarer.api.util.Misc;
29import com.fs.starfarer.api.util.WeightedRandomPicker;
35 public static enum DerelictType {
46 public static DerelictShipData
createHull(String hullId, Random random,
float sModProb) {
50 String variantId = picker.
pick();
51 if (variantId ==
null) {
56 public static DerelictShipData
createVariant(String variantId, Random random,
float sModProb) {
58 PerShipData ship =
new PerShipData(variantId, condition, sModProb);
59 return new DerelictShipData(ship,
true);
62 public static DerelictShipData
createRandom(String factionId, DerelictType type, Random random) {
65 public static DerelictShipData
createRandom(String factionId, DerelictType type, Random random,
float sModProb) {
66 if (random ==
null) random =
new Random();
68 String variantId =
null;
76 if (variantId ==
null)
return null;
80 PerShipData ship =
new PerShipData(variantId, condition, sModProb);
82 return new DerelictShipData(ship,
true);
86 if (random ==
null) random =
new Random();
89 picker.
add(DerelictType.CIVILIAN, 10f);
90 picker.
add(DerelictType.LARGE, 5f);
91 picker.
add(DerelictType.MEDIUM, 10f);
92 picker.
add(DerelictType.SMALL, 20f);
97 if (random ==
null) random =
new Random();
100 picker.
add(ShipCondition.WRECKED, 10f);
101 picker.
add(ShipCondition.BATTERED, 10f);
102 picker.
add(ShipCondition.AVERAGE, 7f);
103 picker.
add(ShipCondition.GOOD, 5f);
104 picker.
add(ShipCondition.PRISTINE, 1f);
106 return picker.
pick();
110 if (random ==
null) random =
new Random();
113 picker.
add(ShipCondition.WRECKED, 10f);
114 picker.
add(ShipCondition.BATTERED, 10f);
115 picker.
add(ShipCondition.AVERAGE, 3f);
117 return picker.
pick();
182 public static String
pickVariant(String factionId, Random random, Object ... shipRoles) {
183 if (random ==
null) random =
new Random();
188 for (
int i = 0; i < shipRoles.length; i += 2) {
189 String role = (String) shipRoles[i];
190 Float weight = (Float) shipRoles[i + 1];
191 picker.
add(role, weight);
194 Set<String> variantsForRole =
new HashSet<String>();
195 while (variantsForRole.isEmpty() && !picker.
isEmpty()) {
197 if (role ==
null)
return null;
203 picker.
addAll(variantsForRole);
204 String variantId = picker.
pick();
211 public static class DerelictShipData {
212 public PerShipData ship;
213 public float durationDays = 10000000f;
214 public boolean canHaveExtraCargo =
false;
215 public DerelictShipData(PerShipData ship,
boolean canHaveExtraCargo) {
217 this.canHaveExtraCargo = canHaveExtraCargo;
229 private DerelictShipData data;
231 private transient GenericCampaignEntitySprite sprite;
233 private transient float scale;
235 private float angVel = 0f;
238 super.init(
entity, params);
240 data = (DerelictShipData) params;
242 angVel = 5f + (float) Math.random() * 10f;
243 angVel *= Math.signum((
float) Math.random() - 0.5f);
260 DropData data =
new DropData();
270 if (this.data.canHaveExtraCargo) {
275 float extraProb = 0.5f;
276 if (r.nextFloat() < extraProb) {
281 for (
int i = 0; i < 3; i++) {
285 (
int)Math.ceil(member.
getCargoCapacity() * (0.15f + 0.15f * r.nextFloat())));
312 case CAPITAL_SHIP:
return 40f;
313 case CRUISER:
return 35f;
314 case DESTROYER:
return 30f;
315 case FRIGATE:
return 25f;
322 case CAPITAL_SHIP:
return 50f;
323 case CRUISER:
return 40f;
324 case DESTROYER:
return 30f;
325 case FRIGATE:
return 25f;
332 case CAPITAL_SHIP:
return 1700f;
333 case CRUISER:
return 1300f;
334 case DESTROYER:
return 1000f;
335 case FRIGATE:
return 800f;
345 Object readResolve() {
347 if (data.ship.variantId !=
null) {
363 float size = Math.max(w, h) * 3f * scale;
365 sprite.setOverlay(overlay);
378 float turn = amount * angVel;
392 (vis == VisibilityLevel.COMPOSITION_AND_FACTION_DETAILS ||
393 vis == VisibilityLevel.COMPOSITION_DETAILS);
409 if (alphaMult <= 0)
return;
static SettingsAPI getSettings()
static FactoryAPI getFactory()
static SectorAPI getSector()
void modifyFlat(String source, float value)
static ShipCondition pickBadCondition(Random random)
static String pickVariant(String factionId, Random random, Object ... shipRoles)
static DerelictShipData createRandom(String factionId, DerelictType type, Random random, float sModProb)
static String pickCivilianVariantId(String factionId, Random random)
static String pickSmallVariantId(String factionId, Random random)
void advance(float amount)
void init(SectorEntityToken entity, Object params)
static float getDefaultSModProb()
static String pickLargeVariantId(String factionId, Random random)
static float getRadius(HullSize size)
static float DEFAULT_SMOD_PROB
static DerelictShipData createRandom(String factionId, DerelictType type, Random random)
static String pickMediumVariantId(String factionId, Random random)
void appendToCampaignTooltip(TooltipMakerAPI tooltip, VisibilityLevel level)
static DerelictType pickDerelictType(Random random)
void render(CampaignEngineLayers layer, ViewportAPI viewport)
static DerelictShipData createVariant(String variantId, Random random, float sModProb)
static float getDetectedAtRange(HullSize size)
static ShipCondition pickDerelictCondition(Random random)
static float getBasicDropValue(FleetMemberAPI member)
static DerelictShipData createHull(String hullId, Random random, float sModProb)
DerelictShipData getData()
static float getBaseDuration(HullSize size)
static final String BASIC
static final String FREIGHTER_CARGO
static final String TANKER_LARGE
static final String COMBAT_CAPITAL
static final String COMBAT_LARGE
static final String PERSONNEL_LARGE
static final String TANKER_SMALL
static final String LINER_SMALL
static final String COMBAT_SMALL
static final String CARRIER_LARGE
static final String CIV_RANDOM
static final String COMBAT_FREIGHTER_MEDIUM
static final String FREIGHTER_MEDIUM
static final String COMBAT_MEDIUM
static final String COMBAT_FREIGHTER_SMALL
static final String PERSONNEL_MEDIUM
static final String COMBAT_FREIGHTER_LARGE
static final String FREIGHTER_LARGE
static final String TANKER_MEDIUM
static final String CARRIER_SMALL
static final String LINER_MEDIUM
static final String FREIGHTER_SMALL
static final String CARRIER_MEDIUM
static final String LINER_LARGE
static final String PERSONNEL_SMALL
static WeightedRandomPicker< DropGroupRow > getPicker(String group)
static void addExtraSalvage(SectorEntityToken entity, CargoAPI cargo)
static Random getRandom(long seed, int level)
static void fadeAndExpire(SectorEntityToken entity)
static long getSalvageSeed(SectorEntityToken entity)
static float normalizeAngle(float angleDeg)
void addAll(Collection< T > items)
void setRandom(Random random)
CargoAPI createCargo(boolean unlimitedStacks)
FleetMemberAPI createFleetMember(FleetMemberType type, String variantOrWingId)
ListMap< String > getHullIdToVariantListMap()
SpriteAPI getSprite(String filename)
float convertToDays(float realSeconds)
void addFuel(float quantity)
void addCommodity(String commodityId, float quantity)
Set< String > getVariantsForRole(String roleId)
CampaignClockAPI getClock()
FactionAPI getFaction(String factionId)
StatBonus getDetectedRangeMod()
float getSensorContactFaderBrightness()
boolean isInCurrentLocation()
void addDropValue(String group, int value)
void setSensorProfile(Float sensorProfile)
float getSensorFaderBrightness()
void setDiscoverable(Boolean discoverable)
VisibilityLevel getVisibilityLevelToPlayerFleet()
void setFacing(float facing)
void setSalvageXP(Float salvageXP)
MemoryAPI getMemoryWithoutUpdate()
void setDiscoveryXP(Float discoveryXP)
ShipVariantAPI getVariant()
float getDeploymentCostSupplies()
ShipHullSpecAPI getHullSpec()
void setSize(float width, float height)