1package com.fs.starfarer.api.impl.campaign.econ.impl;
5import org.json.JSONException;
6import org.json.JSONObject;
8import com.fs.starfarer.api.Global;
9import com.fs.starfarer.api.campaign.AICoreOfficerPlugin;
10import com.fs.starfarer.api.campaign.BattleAPI;
11import com.fs.starfarer.api.campaign.CampaignEventListener.FleetDespawnReason;
12import com.fs.starfarer.api.campaign.CampaignFleetAPI;
13import com.fs.starfarer.api.campaign.CustomCampaignEntityAPI;
14import com.fs.starfarer.api.campaign.FleetInflater;
15import com.fs.starfarer.api.campaign.SectorEntityToken;
16import com.fs.starfarer.api.campaign.econ.CommoditySpecAPI;
17import com.fs.starfarer.api.campaign.econ.Industry;
18import com.fs.starfarer.api.campaign.econ.MarketAPI.MarketInteractionMode;
19import com.fs.starfarer.api.campaign.listeners.FleetEventListener;
20import com.fs.starfarer.api.characters.PersonAPI;
21import com.fs.starfarer.api.combat.ShipVariantAPI;
22import com.fs.starfarer.api.fleet.FleetMemberAPI;
23import com.fs.starfarer.api.fleet.FleetMemberType;
24import com.fs.starfarer.api.impl.campaign.events.OfficerManagerEvent;
25import com.fs.starfarer.api.impl.campaign.fleets.DefaultFleetInflater;
26import com.fs.starfarer.api.impl.campaign.fleets.DefaultFleetInflaterParams;
27import com.fs.starfarer.api.impl.campaign.fleets.FleetFactoryV3;
28import com.fs.starfarer.api.impl.campaign.fleets.FleetParamsV3;
29import com.fs.starfarer.api.impl.campaign.ids.Abilities;
30import com.fs.starfarer.api.impl.campaign.ids.Commodities;
31import com.fs.starfarer.api.impl.campaign.ids.Entities;
32import com.fs.starfarer.api.impl.campaign.ids.Factions;
33import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
34import com.fs.starfarer.api.impl.campaign.ids.HullMods;
35import com.fs.starfarer.api.impl.campaign.ids.Industries;
36import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
37import com.fs.starfarer.api.impl.campaign.ids.Stats;
38import com.fs.starfarer.api.impl.campaign.ids.Tags;
39import com.fs.starfarer.api.impl.campaign.procgen.themes.RemnantOfficerGeneratorPlugin;
40import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.MarketCMD.RaidDangerLevel;
41import com.fs.starfarer.api.ui.TooltipMakerAPI;
42import com.fs.starfarer.api.util.Misc;
43import com.fs.starfarer.api.util.Pair;
60 boolean battlestation =
getSpec().hasTag(Industries.TAG_BATTLESTATION);
61 boolean starfortress =
getSpec().hasTag(Industries.TAG_STARFORTRESS);
64 }
else if (starfortress) {
72 demand(Commodities.CREW, size);
73 demand(Commodities.SUPPLIES, size);
78 market.getStats().getDynamic().getMod(Stats.GROUND_DEFENSES_MOD)
99 market.getStats().getDynamic().getMod(Stats.GROUND_DEFENSES_MOD).unmodifyMult(
getModId());
105 for (FleetMemberAPI member :
stationFleet.getFleetData().getMembersListCopy()) {
106 member.getRepairTracker().setCR(cr);
109 if (inflater !=
null) {
113 inflater.setQuality(Misc.getShipQuality(
market));
114 if (inflater instanceof DefaultFleetInflater) {
115 DefaultFleetInflater dfi = (DefaultFleetInflater) inflater;
116 ((DefaultFleetInflaterParams)dfi.getParams()).allWeapons =
true;
123 float deficit =
getMaxDeficit(Commodities.CREW, Commodities.SUPPLIES).two;
124 float demand = Math.max(
getDemand(Commodities.CREW).getQuantity().getModifiedInt(),
125 getDemand(Commodities.SUPPLIES).getQuantity().getModifiedInt());
127 if (deficit < 0) deficit = 0f;
134 float q = Misc.getShipQuality(
market);
144 float cr = 0.5f + 0.5f * Math.min(d, q);
153 return mode != IndustryTooltipMode.NORMAL ||
isFunctional();
159 if (mode != IndustryTooltipMode.NORMAL ||
isFunctional()) {
160 Color h = Misc.getHighlightColor();
164 tooltip.addPara(
"Station combat readiness: %s", opad, h,
"" + Math.round(cr * 100f) +
"%");
168 boolean battlestation =
getSpec().hasTag(Industries.TAG_BATTLESTATION);
169 boolean starfortress =
getSpec().hasTag(Industries.TAG_STARFORTRESS);
198 super.advance(amount);
263 super.buildingFinished();
274 super.notifyBeingRemoved(mode, forUpgrade);
283 super.upgradeFinished(previous);
306 stationEntity.getMemoryWithoutUpdate().unset(MemFlags.STATION_FLEET);
307 stationEntity.getMemoryWithoutUpdate().unset(MemFlags.STATION_BASE_FLEET);
319 ((CustomCampaignEntityAPI)
stationEntity).setFleetForVisual(
null);
320 float origRadius = ((CustomCampaignEntityAPI)
stationEntity).getCustomEntitySpec().getDefaultRadius();
321 ((CustomCampaignEntityAPI)
stationEntity).setRadius(origRadius);
325 stationFleet.getMemoryWithoutUpdate().unset(MemFlags.STATION_MARKET);
337 super.notifyColonyRenamed();
347 FleetParamsV3 fParams =
new FleetParamsV3(
null,
null,
350 FleetTypes.PATROL_SMALL,
353 fParams.allWeapons =
true;
374 stationFleet.getAbility(Abilities.TRANSPONDER).activate();
375 stationFleet.getDetectedRangeMod().modifyFlat(
"gen", 10000f);
400 for (SectorEntityToken entity :
market.getConnectedEntities()) {
401 if (entity.hasTag(Tags.STATION) && !entity.hasTag(
"NO_ORBITAL_STATION")) {
411 null,
market.getName() +
" Station", Entities.STATION_BUILT_FROM_INDUSTRY,
market.getFactionId());
412 SectorEntityToken primary =
market.getPrimaryEntity();
413 float orbitRadius = primary.getRadius() + 150f;
414 stationEntity.setCircularOrbitWithSpin(primary, (
float) Math.random() * 360f, orbitRadius, orbitRadius / 10f, 5f, 5f);
424 String fleetName =
null;
425 String variantId =
null;
429 JSONObject json =
new JSONObject(
getSpec().getData());
430 variantId = json.getString(
"variant");
431 radius = (float) json.getDouble(
"radius");
432 fleetName = json.getString(
"fleetName");
433 }
catch (JSONException e) {
434 throw new RuntimeException(e);
453 String name = fleetName;
454 member.setShipName(name);
481 stationEntity.getMemoryWithoutUpdate().unset(MemFlags.STATION_FLEET);
485 for (
int i = 1; i < member.getStatus().getNumStatuses(); i++) {
486 ShipVariantAPI variant = member.getVariant();
488 String slotId = member.getVariant().getModuleSlots().get(i - 1);
489 variant = variant.getModuleVariant(slotId);
494 if (!variant.hasHullMod(HullMods.VASTBULK)) {
495 member.getStatus().setDetached(i,
true);
496 member.getStatus().setPermaDetached(i,
true);
497 member.getStatus().setHullFraction(i, 0f);
502 stationEntity.getMemoryWithoutUpdate().unset(MemFlags.STATION_BASE_FLEET);
513 boolean battlestation =
getSpec().hasTag(Industries.TAG_BATTLESTATION);
514 boolean starfortress =
getSpec().hasTag(Industries.TAG_STARFORTRESS);
518 }
else if (battlestation) {
531 PersonAPI commander =
null;
532 if (Commodities.ALPHA_CORE.equals(aiCore)) {
537 AICoreOfficerPlugin plugin = Misc.getAICoreOfficerPlugin(Commodities.ALPHA_CORE);
538 commander = plugin.createPerson(Commodities.ALPHA_CORE, Factions.REMNANTS,
null);
540 RemnantOfficerGeneratorPlugin.integrateAndAdaptCoreForAIFleet(
stationFleet.getFlagship());
551 PersonAPI current =
stationFleet.getFlagship().getCaptain();
553 if (current.isAICore() || current.getStats().getLevel() != level) {
554 commander = OfficerManagerEvent.createOfficer(
576 if (commander !=
null) {
593 super.disruptionFinished();
600 super.notifyDisrupted();
612 if (
stationFleet.getMembersWithFightersCopy().isEmpty()) {
618 public static void disrupt(Industry station) {
619 station.setDisrupted(station.getSpec().getBuildTime() * 0.5f,
true);
625 boolean canBuild =
false;
626 for (Industry ind :
market.getIndustries()) {
627 if (ind ==
this)
continue;
628 if (!ind.isFunctional())
continue;
629 if (ind.getSpec().hasTag(Industries.TAG_SPACEPORT)) {
638 return "Requires a functional spaceport";
644 boolean battlestation =
getSpec().hasTag(Industries.TAG_BATTLESTATION);
645 boolean starfortress =
getSpec().hasTag(Industries.TAG_STARFORTRESS);
646 int stabilityMod = 1;
649 }
else if (starfortress) {
657 return getMaxDeficit(Commodities.SUPPLIES, Commodities.CREW);
676 Color highlight = Misc.getHighlightColor();
678 String pre =
"Alpha-level AI core currently assigned. ";
679 if (mode == AICoreDescriptionMode.MANAGE_CORE_DIALOG_LIST || mode == AICoreDescriptionMode.INDUSTRY_TOOLTIP) {
680 pre =
"Alpha-level AI core. ";
682 if (mode == AICoreDescriptionMode.INDUSTRY_TOOLTIP) {
684 TooltipMakerAPI text = tooltip.beginImageWithText(coreSpec.getIconName(), 48);
685 text.addPara(pre +
"Reduces upkeep cost by %s. Reduces demand by %s unit. " +
686 "Increases station combat effectiveness.", 0f, highlight,
688 tooltip.addImageWithText(opad);
692 tooltip.addPara(pre +
"Reduces upkeep cost by %s. Reduces demand by %s unit. " +
693 "Increases station combat effectiveness.", opad, highlight,
708 market.getStability().unmodifyFlat(
"orbital_station_improve");
712 public void addImproveDesc(TooltipMakerAPI info, ImprovementDescriptionMode mode) {
714 Color highlight = Misc.getHighlightColor();
717 if (mode == ImprovementDescriptionMode.INDUSTRY_TOOLTIP) {
723 info.addSpacer(opad);
724 super.addImproveDesc(info, mode);
729 boolean battlestation =
getSpec().hasTag(Industries.TAG_BATTLESTATION);
730 boolean starfortress =
getSpec().hasTag(Industries.TAG_STARFORTRESS);
731 return battlestation || starfortress;
static SettingsAPI getSettings()
static FactoryAPI getFactory()
static SectorAPI getSector()
IndustrySpecAPI getSpec()
static int DEMAND_REDUCTION
void applyIncomeAndUpkeep(float sizeOverride)
Map< String, MutableCommodityQuantity > supply
String getImprovementsDescForModifiers()
MutableCommodityQuantity getDemand(String id)
void addStabilityPostDemandSection(TooltipMakerAPI tooltip, boolean hasDemand, IndustryTooltipMode mode)
void unmodifyStabilityWithBaseMod()
void modifyStabilityWithBaseMod()
void addGroundDefensesImpactSection(TooltipMakerAPI tooltip, float bonus, String ...commodities)
Map< String, MutableCommodityQuantity > demand
String getNameForModifier()
MutableStat demandReduction
Pair< String, Integer > getMaxDeficit(String ... commodityIds)
void removeStationEntityAndFleetIfNeeded()
Pair< String, Integer > getStabilityAffectingDeficit()
void applyNoAICoreModifiers()
void applyAlphaCoreSupplyAndDemandModifiers()
void addImproveDesc(TooltipMakerAPI info, ImprovementDescriptionMode mode)
void reportFleetDespawnedToListener(CampaignFleetAPI fleet, FleetDespawnReason reason, Object param)
void disruptionFinished()
boolean hasPostDemandSection(boolean hasDemand, IndustryTooltipMode mode)
boolean usingExistingStation
static float IMPROVE_STABILITY_BONUS
RaidDangerLevel adjustCommodityDangerLevel(String commodityId, RaidDangerLevel level)
void matchCommanderToAICore(String aiCore)
static float DEFENSE_BONUS_FORTRESS
RaidDangerLevel adjustItemDangerLevel(String itemId, String data, RaidDangerLevel level)
void matchStationAndCommanderToCurrentIndustry()
void applyAlphaCoreModifiers()
void applyImproveModifiers()
static float DEFENSE_BONUS_BASE
String getUnavailableReason()
void addAlphaCoreDescription(TooltipMakerAPI tooltip, AICoreDescriptionMode mode)
CampaignFleetAPI stationFleet
void addPostDemandSection(TooltipMakerAPI tooltip, boolean hasDemand, IndustryTooltipMode mode)
void ensureStationEntityIsSetOrCreated()
SectorEntityToken stationEntity
void advance(float amount)
boolean isAvailableToBuild()
void upgradeFinished(Industry previous)
void reportBattleOccurred(CampaignFleetAPI fleet, CampaignFleetAPI primaryWinner, BattleAPI battle)
static void disrupt(Industry station)
void notifyColonyRenamed()
void notifyBeingRemoved(MarketInteractionMode mode, boolean forUpgrade)
int getBaseStabilityMod()
static float DEFENSE_BONUS_BATTLESTATION
int getHumanCommanderLevel()
FleetMemberAPI createFleetMember(FleetMemberType type, String variantOrWingId)
CommoditySpecAPI getCommoditySpec(String commodityId)