Refactor runtime bootstrap and ship control flows
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
using static SpaceGame.Api.Factions.AI.CommanderPlanningService;
|
||||
using static SpaceGame.Api.Shared.Runtime.KnownShipTypes;
|
||||
using static SpaceGame.Api.Shared.Runtime.SimulationRuntimeSupport;
|
||||
using SpaceGame.Api.Shared.Runtime;
|
||||
|
||||
@@ -7,6 +8,10 @@ namespace SpaceGame.Api.Stations.Simulation;
|
||||
internal sealed class StationSimulationService
|
||||
{
|
||||
internal const int StrategicControlTargetSystems = 5;
|
||||
private const string MilitaryShipCategory = "military";
|
||||
private const string ConstructionShipCategory = "construction";
|
||||
private const string TransportShipCategory = "transport";
|
||||
private const string MiningShipCategory = "mining";
|
||||
|
||||
internal void ReviewStationMarketOrders(SimulationWorld world, StationRuntime station)
|
||||
{
|
||||
@@ -63,7 +68,7 @@ internal sealed class StationSimulationService
|
||||
var superfluidCoolantReserve = role == "superfluidcoolant" ? 120f : 0f;
|
||||
var quantumTubesReserve = role == "quantumtubes" ? 120f : 0f;
|
||||
var shipPartsReserve = HasShipyardCapability(station)
|
||||
&& GetShipProductionPressure(world, station.FactionId, "military") > 0.2f
|
||||
&& GetShipProductionPressure(world, station.FactionId, MilitaryShipCategory) > 0.2f
|
||||
? 90f
|
||||
: 0f;
|
||||
|
||||
@@ -118,7 +123,7 @@ internal sealed class StationSimulationService
|
||||
var constructionClayReserve = GetConstructionDemandForItem(world, site, "claytronics");
|
||||
var constructionRefinedReserve = GetConstructionDemandForItem(world, site, "refinedmetals");
|
||||
var shipPartsReserve = HasShipyardCapability(station)
|
||||
&& GetShipProductionPressure(world, station.FactionId, "military") > 0.2f
|
||||
&& GetShipProductionPressure(world, station.FactionId, MilitaryShipCategory) > 0.2f
|
||||
? 90f
|
||||
: 0f;
|
||||
|
||||
@@ -255,7 +260,7 @@ internal sealed class StationSimulationService
|
||||
var priority = (float)recipe.Priority;
|
||||
|
||||
var expansionPressure = GetFactionExpansionPressure(world, station.FactionId);
|
||||
var fleetPressure = GetShipProductionPressure(world, station.FactionId, "military");
|
||||
var fleetPressure = GetShipProductionPressure(world, station.FactionId, MilitaryShipCategory);
|
||||
priority += GetStationRecipePriorityAdjustment(world, station, recipe, expansionPressure, fleetPressure);
|
||||
priority += GetStrategicRecipeBias(world, station, recipe);
|
||||
|
||||
@@ -266,21 +271,34 @@ internal sealed class StationSimulationService
|
||||
{
|
||||
if (recipe.ShipOutputId is not null && world.ShipDefinitions.TryGetValue(recipe.ShipOutputId, out var shipDefinition))
|
||||
{
|
||||
var shipPressure = GetShipProductionPressure(world, station.FactionId, shipDefinition.Kind);
|
||||
return shipDefinition.Kind switch
|
||||
var shipPressure = GetShipProductionPressure(world, station.FactionId, GetShipCategory(shipDefinition));
|
||||
if (IsMilitaryShip(shipDefinition))
|
||||
{
|
||||
"military" => recipe.Id switch
|
||||
return recipe.Id switch
|
||||
{
|
||||
"frigate-construction" => 320f * shipPressure,
|
||||
"destroyer-construction" => 200f * shipPressure,
|
||||
"cruiser-construction" => 120f * shipPressure,
|
||||
_ => 160f * shipPressure,
|
||||
},
|
||||
"construction" => 260f * shipPressure,
|
||||
"mining" => 250f * shipPressure,
|
||||
"transport" => 230f * shipPressure,
|
||||
_ => 0f,
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
if (IsConstructionShip(shipDefinition))
|
||||
{
|
||||
return 260f * shipPressure;
|
||||
}
|
||||
|
||||
if (IsMiningShip(shipDefinition))
|
||||
{
|
||||
return 250f * shipPressure;
|
||||
}
|
||||
|
||||
if (IsTransportShip(shipDefinition))
|
||||
{
|
||||
return 230f * shipPressure;
|
||||
}
|
||||
|
||||
return 0f;
|
||||
}
|
||||
|
||||
var outputItemIds = recipe.Outputs
|
||||
@@ -338,7 +356,7 @@ internal sealed class StationSimulationService
|
||||
if (string.Equals(assignment.Kind, "ship-production-focus", StringComparison.Ordinal)
|
||||
&& recipe.ShipOutputId is not null
|
||||
&& world.ShipDefinitions.TryGetValue(recipe.ShipOutputId, out var shipDefinition)
|
||||
&& string.Equals(shipDefinition.Kind, "military", StringComparison.Ordinal))
|
||||
&& IsMilitaryShip(shipDefinition))
|
||||
{
|
||||
return 260f;
|
||||
}
|
||||
@@ -383,7 +401,7 @@ internal sealed class StationSimulationService
|
||||
return false;
|
||||
}
|
||||
|
||||
if (GetShipProductionPressure(world, station.FactionId, shipDefinition.Kind) <= 0.05f)
|
||||
if (GetShipProductionPressure(world, station.FactionId, GetShipCategory(shipDefinition)) <= 0.05f)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@@ -708,7 +726,7 @@ internal sealed class StationSimulationService
|
||||
.ToList();
|
||||
}
|
||||
|
||||
private static float GetShipProductionPressure(SimulationWorld world, string factionId, string shipKind)
|
||||
private static float GetShipProductionPressure(SimulationWorld world, string factionId, string? shipCategory)
|
||||
{
|
||||
var economic = FindFactionEconomicAssessment(world, factionId);
|
||||
var threat = FindFactionThreatAssessment(world, factionId);
|
||||
@@ -717,16 +735,16 @@ internal sealed class StationSimulationService
|
||||
return 0f;
|
||||
}
|
||||
|
||||
return shipKind switch
|
||||
return shipCategory switch
|
||||
{
|
||||
"military" => threat.EnemyFactionCount > 0
|
||||
MilitaryShipCategory => threat.EnemyFactionCount > 0
|
||||
? economic.MilitaryShipCount < Math.Max(4, economic.ControlledSystemCount * 2) ? 1f : 0.25f
|
||||
: 0.1f,
|
||||
"construction" => economic.PrimaryExpansionSiteId is not null
|
||||
ConstructionShipCategory => economic.PrimaryExpansionSiteId is not null
|
||||
? economic.ConstructorShipCount < 1 ? 1f : 0.35f
|
||||
: economic.ConstructorShipCount < 1 ? 0.5f : 0f,
|
||||
"transport" => economic.TransportShipCount < Math.Max(2, economic.ControlledSystemCount) ? 0.8f : 0.2f,
|
||||
_ when shipKind == "mining" || shipKind == "miner" => economic.MinerShipCount < Math.Max(2, economic.ControlledSystemCount) ? 0.85f : 0.2f,
|
||||
TransportShipCategory => economic.TransportShipCount < Math.Max(2, economic.ControlledSystemCount) ? 0.8f : 0.2f,
|
||||
MiningShipCategory => economic.MinerShipCount < Math.Max(2, economic.ControlledSystemCount) ? 0.85f : 0.2f,
|
||||
_ => 0.15f,
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user