feat: massive AI generation
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -1,224 +0,0 @@
|
||||
|
||||
namespace SpaceGame.Api.Factions.AI;
|
||||
|
||||
// ─── Planning State ────────────────────────────────────────────────────────────
|
||||
|
||||
public sealed class FactionPlanningState
|
||||
{
|
||||
public int MilitaryShipCount { get; set; }
|
||||
public int MinerShipCount { get; set; }
|
||||
public int TransportShipCount { get; set; }
|
||||
public int ConstructorShipCount { get; set; }
|
||||
public int ControlledSystemCount { get; set; }
|
||||
public int TargetSystemCount { get; set; }
|
||||
public bool HasShipFactory { get; set; }
|
||||
public int EnemyFactionCount { get; set; }
|
||||
public int EnemyShipCount { get; set; }
|
||||
public int EnemyStationCount { get; set; }
|
||||
public float OreStockpile { get; set; }
|
||||
public float RefinedMetalsAvailableStock { get; set; }
|
||||
public float RefinedMetalsUsageRate { get; set; }
|
||||
public float RefinedMetalsProjectedProductionRate { get; set; }
|
||||
public float RefinedMetalsProjectedNetRate { get; set; }
|
||||
public float RefinedMetalsLevelSeconds { get; set; }
|
||||
public string RefinedMetalsLevel { get; set; } = "unknown";
|
||||
public float HullpartsAvailableStock { get; set; }
|
||||
public float HullpartsUsageRate { get; set; }
|
||||
public float HullpartsProjectedProductionRate { get; set; }
|
||||
public float HullpartsProjectedNetRate { get; set; }
|
||||
public float HullpartsLevelSeconds { get; set; }
|
||||
public string HullpartsLevel { get; set; } = "unknown";
|
||||
public float ClaytronicsAvailableStock { get; set; }
|
||||
public float ClaytronicsUsageRate { get; set; }
|
||||
public float ClaytronicsProjectedProductionRate { get; set; }
|
||||
public float ClaytronicsProjectedNetRate { get; set; }
|
||||
public float ClaytronicsLevelSeconds { get; set; }
|
||||
public string ClaytronicsLevel { get; set; } = "unknown";
|
||||
public float WaterAvailableStock { get; set; }
|
||||
public float WaterUsageRate { get; set; }
|
||||
public float WaterProjectedProductionRate { get; set; }
|
||||
public float WaterProjectedNetRate { get; set; }
|
||||
public float WaterLevelSeconds { get; set; }
|
||||
public string WaterLevel { get; set; } = "unknown";
|
||||
|
||||
public bool HasRefinedMetalsProduction => RefinedMetalsProjectedProductionRate > 0.01f;
|
||||
public bool HasHullpartsProduction => HullpartsProjectedProductionRate > 0.01f;
|
||||
public bool HasClaytronicsProduction => ClaytronicsProjectedProductionRate > 0.01f;
|
||||
public bool HasWaterProduction => WaterProjectedProductionRate > 0.01f;
|
||||
|
||||
public bool HasWarIndustrySupplyChain =>
|
||||
IsCommodityOperational(RefinedMetalsProjectedProductionRate, RefinedMetalsProjectedNetRate, RefinedMetalsLevelSeconds, RefinedMetalsLevel, 240f)
|
||||
&& IsCommodityOperational(HullpartsProjectedProductionRate, HullpartsProjectedNetRate, HullpartsLevelSeconds, HullpartsLevel, 240f)
|
||||
&& IsCommodityOperational(ClaytronicsProjectedProductionRate, ClaytronicsProjectedNetRate, ClaytronicsLevelSeconds, ClaytronicsLevel, 240f);
|
||||
|
||||
public FactionPlanningState Clone() => (FactionPlanningState)MemberwiseClone();
|
||||
|
||||
internal static int ComputeTargetWarships(FactionPlanningState state)
|
||||
{
|
||||
var expansionDeficit = Math.Max(0, state.TargetSystemCount - state.ControlledSystemCount);
|
||||
return Math.Max(3, (state.ControlledSystemCount * 2) + (expansionDeficit * 3) + Math.Min(4, state.EnemyFactionCount + state.EnemyStationCount));
|
||||
}
|
||||
|
||||
internal static bool IsCommodityOperational(
|
||||
float projectedProductionRate,
|
||||
float projectedNetRate,
|
||||
float levelSeconds,
|
||||
string level,
|
||||
float targetLevelSeconds) =>
|
||||
projectedProductionRate > 0.01f
|
||||
&& projectedNetRate >= -0.01f
|
||||
&& levelSeconds >= targetLevelSeconds
|
||||
&& (string.Equals(level, "stable", StringComparison.OrdinalIgnoreCase)
|
||||
|| string.Equals(level, "surplus", StringComparison.OrdinalIgnoreCase));
|
||||
|
||||
internal static float ComputeCommodityNeed(
|
||||
float projectedProductionRate,
|
||||
float usageRate,
|
||||
float projectedNetRate,
|
||||
float levelSeconds,
|
||||
string level,
|
||||
float targetLevelSeconds)
|
||||
{
|
||||
var levelWeight = level switch
|
||||
{
|
||||
"critical" => 140f,
|
||||
"low" => 80f,
|
||||
"stable" => 20f,
|
||||
_ => 0f,
|
||||
};
|
||||
var rateDeficit = MathF.Max(0f, usageRate - projectedProductionRate);
|
||||
var levelDeficit = MathF.Max(0f, targetLevelSeconds - levelSeconds) / MathF.Max(targetLevelSeconds, 1f);
|
||||
var instability = projectedNetRate < 0f ? MathF.Abs(projectedNetRate) * 80f : 0f;
|
||||
return levelWeight + (rateDeficit * 140f) + (levelDeficit * 120f) + instability;
|
||||
}
|
||||
}
|
||||
|
||||
// ─── Goals ─────────────────────────────────────────────────────────────────────
|
||||
|
||||
public sealed class EnsureWarIndustryGoal : GoapGoal<FactionPlanningState>
|
||||
{
|
||||
public override string Name => "ensure-war-industry";
|
||||
|
||||
public override bool IsSatisfied(FactionPlanningState state) =>
|
||||
state.EnemyFactionCount <= 0 || (state.HasWarIndustrySupplyChain && state.HasShipFactory);
|
||||
|
||||
public override float ComputePriority(FactionPlanningState state, SimulationWorld world, CommanderRuntime commander)
|
||||
{
|
||||
if (state.EnemyFactionCount <= 0)
|
||||
{
|
||||
return 0f;
|
||||
}
|
||||
|
||||
var missingStages =
|
||||
(FactionPlanningState.IsCommodityOperational(state.RefinedMetalsProjectedProductionRate, state.RefinedMetalsProjectedNetRate, state.RefinedMetalsLevelSeconds, state.RefinedMetalsLevel, 240f) ? 0 : 1) +
|
||||
(FactionPlanningState.IsCommodityOperational(state.HullpartsProjectedProductionRate, state.HullpartsProjectedNetRate, state.HullpartsLevelSeconds, state.HullpartsLevel, 240f) ? 0 : 1) +
|
||||
(FactionPlanningState.IsCommodityOperational(state.ClaytronicsProjectedProductionRate, state.ClaytronicsProjectedNetRate, state.ClaytronicsLevelSeconds, state.ClaytronicsLevel, 240f) ? 0 : 1) +
|
||||
(state.HasShipFactory ? 0 : 1);
|
||||
var supplyNeed =
|
||||
FactionPlanningState.ComputeCommodityNeed(state.RefinedMetalsProjectedProductionRate, state.RefinedMetalsUsageRate, state.RefinedMetalsProjectedNetRate, state.RefinedMetalsLevelSeconds, state.RefinedMetalsLevel, 240f)
|
||||
+ FactionPlanningState.ComputeCommodityNeed(state.HullpartsProjectedProductionRate, state.HullpartsUsageRate, state.HullpartsProjectedNetRate, state.HullpartsLevelSeconds, state.HullpartsLevel, 240f)
|
||||
+ FactionPlanningState.ComputeCommodityNeed(state.ClaytronicsProjectedProductionRate, state.ClaytronicsUsageRate, state.ClaytronicsProjectedNetRate, state.ClaytronicsLevelSeconds, state.ClaytronicsLevel, 240f);
|
||||
|
||||
return missingStages <= 0 && supplyNeed <= 0.01f ? 0f : 110f + (missingStages * 22f) + (supplyNeed * 0.18f);
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class EnsureWaterSecurityGoal : GoapGoal<FactionPlanningState>
|
||||
{
|
||||
public override string Name => "ensure-water-security";
|
||||
|
||||
public override bool IsSatisfied(FactionPlanningState state) =>
|
||||
FactionPlanningState.IsCommodityOperational(state.WaterProjectedProductionRate, state.WaterProjectedNetRate, state.WaterLevelSeconds, state.WaterLevel, 300f);
|
||||
|
||||
public override float ComputePriority(FactionPlanningState state, SimulationWorld world, CommanderRuntime commander)
|
||||
{
|
||||
if (FactionPlanningState.IsCommodityOperational(state.WaterProjectedProductionRate, state.WaterProjectedNetRate, state.WaterLevelSeconds, state.WaterLevel, 300f))
|
||||
{
|
||||
return 0f;
|
||||
}
|
||||
|
||||
return 55f + FactionPlanningState.ComputeCommodityNeed(
|
||||
state.WaterProjectedProductionRate,
|
||||
state.WaterUsageRate,
|
||||
state.WaterProjectedNetRate,
|
||||
state.WaterLevelSeconds,
|
||||
state.WaterLevel,
|
||||
300f) * 0.25f;
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class EnsureWarFleetGoal : GoapGoal<FactionPlanningState>
|
||||
{
|
||||
public override string Name => "ensure-war-fleet";
|
||||
|
||||
public override bool IsSatisfied(FactionPlanningState state) =>
|
||||
state.MilitaryShipCount >= FactionPlanningState.ComputeTargetWarships(state);
|
||||
|
||||
public override float ComputePriority(FactionPlanningState state, SimulationWorld world, CommanderRuntime commander)
|
||||
{
|
||||
var deficit = FactionPlanningState.ComputeTargetWarships(state) - state.MilitaryShipCount;
|
||||
return deficit <= 0 ? 0f : 50f + (deficit * 10f);
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class ExterminateRivalGoal : GoapGoal<FactionPlanningState>
|
||||
{
|
||||
public override string Name => "exterminate-rival";
|
||||
|
||||
public override bool IsSatisfied(FactionPlanningState state) =>
|
||||
state.EnemyFactionCount <= 0 || (state.EnemyShipCount <= 0 && state.EnemyStationCount <= 0);
|
||||
|
||||
public override float ComputePriority(FactionPlanningState state, SimulationWorld world, CommanderRuntime commander)
|
||||
{
|
||||
if (state.EnemyFactionCount <= 0)
|
||||
{
|
||||
return 0f;
|
||||
}
|
||||
|
||||
return 140f + (state.EnemyStationCount * 25f) + (state.EnemyShipCount * 6f);
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class ExpandTerritoryGoal : GoapGoal<FactionPlanningState>
|
||||
{
|
||||
public override string Name => "expand-territory";
|
||||
|
||||
public override bool IsSatisfied(FactionPlanningState state) =>
|
||||
state.ControlledSystemCount >= state.TargetSystemCount;
|
||||
|
||||
public override float ComputePriority(FactionPlanningState state, SimulationWorld world, CommanderRuntime commander)
|
||||
{
|
||||
var deficit = state.TargetSystemCount - state.ControlledSystemCount;
|
||||
return deficit <= 0 ? 0f : 80f + (deficit * 15f);
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class EnsureMiningCapacityGoal : GoapGoal<FactionPlanningState>
|
||||
{
|
||||
private const int MinMiners = 2;
|
||||
|
||||
public override string Name => "ensure-mining-capacity";
|
||||
|
||||
public override bool IsSatisfied(FactionPlanningState state) => state.MinerShipCount >= MinMiners;
|
||||
|
||||
public override float ComputePriority(FactionPlanningState state, SimulationWorld world, CommanderRuntime commander)
|
||||
{
|
||||
var deficit = MinMiners - state.MinerShipCount;
|
||||
return deficit <= 0 ? 0f : 70f + (deficit * 12f);
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class EnsureConstructionCapacityGoal : GoapGoal<FactionPlanningState>
|
||||
{
|
||||
private const int MinConstructors = 1;
|
||||
|
||||
public override string Name => "ensure-construction-capacity";
|
||||
|
||||
public override bool IsSatisfied(FactionPlanningState state) => state.ConstructorShipCount >= MinConstructors;
|
||||
|
||||
public override float ComputePriority(FactionPlanningState state, SimulationWorld world, CommanderRuntime commander)
|
||||
{
|
||||
var deficit = MinConstructors - state.ConstructorShipCount;
|
||||
return deficit <= 0 ? 0f : 60f + (deficit * 10f);
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,40 +1,76 @@
|
||||
namespace SpaceGame.Api.Factions.Contracts;
|
||||
|
||||
public sealed record FactionPlanningStateSnapshot(
|
||||
int MilitaryShipCount,
|
||||
int MinerShipCount,
|
||||
int TransportShipCount,
|
||||
int ConstructorShipCount,
|
||||
int ControlledSystemCount,
|
||||
int TargetSystemCount,
|
||||
bool HasShipFactory,
|
||||
float OreStockpile,
|
||||
float RefinedMetalsAvailableStock,
|
||||
float RefinedMetalsUsageRate,
|
||||
float RefinedMetalsProjectedProductionRate,
|
||||
float RefinedMetalsProjectedNetRate,
|
||||
float RefinedMetalsLevelSeconds,
|
||||
string RefinedMetalsLevel,
|
||||
float HullpartsAvailableStock,
|
||||
float HullpartsUsageRate,
|
||||
float HullpartsProjectedProductionRate,
|
||||
float HullpartsProjectedNetRate,
|
||||
float HullpartsLevelSeconds,
|
||||
string HullpartsLevel,
|
||||
float ClaytronicsAvailableStock,
|
||||
float ClaytronicsUsageRate,
|
||||
float ClaytronicsProjectedProductionRate,
|
||||
float ClaytronicsProjectedNetRate,
|
||||
float ClaytronicsLevelSeconds,
|
||||
string ClaytronicsLevel,
|
||||
float WaterAvailableStock,
|
||||
float WaterUsageRate,
|
||||
float WaterProjectedProductionRate,
|
||||
float WaterProjectedNetRate,
|
||||
float WaterLevelSeconds,
|
||||
string WaterLevel);
|
||||
public sealed record FactionDoctrineSnapshot(
|
||||
string StrategicPosture,
|
||||
string ExpansionPosture,
|
||||
string MilitaryPosture,
|
||||
string EconomicPosture,
|
||||
int DesiredControlledSystems,
|
||||
int DesiredMilitaryPerFront,
|
||||
int DesiredMinersPerSystem,
|
||||
int DesiredTransportsPerSystem,
|
||||
int DesiredConstructors,
|
||||
float ReserveCreditsRatio,
|
||||
float ExpansionBudgetRatio,
|
||||
float WarBudgetRatio,
|
||||
float ReserveMilitaryRatio,
|
||||
float OffensiveReadinessThreshold,
|
||||
float SupplySecurityBias,
|
||||
float FailureAversion,
|
||||
int ReinforcementLeadPerFront);
|
||||
|
||||
public sealed record FactionStrategicPrioritySnapshot(string GoalName, float Priority);
|
||||
public sealed record FactionSystemMemorySnapshot(
|
||||
string SystemId,
|
||||
DateTimeOffset LastSeenAtUtc,
|
||||
int LastEnemyShipCount,
|
||||
int LastEnemyStationCount,
|
||||
bool ControlledByFaction,
|
||||
string? LastRole,
|
||||
float FrontierPressure,
|
||||
float RouteRisk,
|
||||
float HistoricalShortagePressure,
|
||||
int OffensiveFailures,
|
||||
int DefensiveFailures,
|
||||
int OffensiveSuccesses,
|
||||
int DefensiveSuccesses,
|
||||
DateTimeOffset? LastContestedAtUtc,
|
||||
DateTimeOffset? LastShortageAtUtc);
|
||||
|
||||
public sealed record FactionCommodityMemorySnapshot(
|
||||
string ItemId,
|
||||
float HistoricalShortageScore,
|
||||
float HistoricalSurplusScore,
|
||||
float LastObservedBacklog,
|
||||
DateTimeOffset UpdatedAtUtc,
|
||||
DateTimeOffset? LastCriticalAtUtc);
|
||||
|
||||
public sealed record FactionOutcomeRecordSnapshot(
|
||||
string Id,
|
||||
string Kind,
|
||||
string Summary,
|
||||
string? RelatedCampaignId,
|
||||
string? RelatedObjectiveId,
|
||||
DateTimeOffset OccurredAtUtc);
|
||||
|
||||
public sealed record FactionMemorySnapshot(
|
||||
int LastPlanCycle,
|
||||
DateTimeOffset UpdatedAtUtc,
|
||||
int LastObservedShipsBuilt,
|
||||
int LastObservedShipsLost,
|
||||
float LastObservedCredits,
|
||||
IReadOnlyList<string> KnownSystemIds,
|
||||
IReadOnlyList<string> KnownEnemyFactionIds,
|
||||
IReadOnlyList<FactionSystemMemorySnapshot> Systems,
|
||||
IReadOnlyList<FactionCommodityMemorySnapshot> Commodities,
|
||||
IReadOnlyList<FactionOutcomeRecordSnapshot> RecentOutcomes);
|
||||
|
||||
public sealed record FactionBudgetSnapshot(
|
||||
float ReservedCredits,
|
||||
float ExpansionCredits,
|
||||
float WarCredits,
|
||||
int ReservedMilitaryAssets,
|
||||
int ReservedLogisticsAssets,
|
||||
int ReservedConstructionAssets);
|
||||
|
||||
public sealed record FactionCommoditySignalSnapshot(
|
||||
string ItemId,
|
||||
@@ -51,96 +87,185 @@ public sealed record FactionCommoditySignalSnapshot(
|
||||
float BuyBacklog,
|
||||
float ReservedForConstruction);
|
||||
|
||||
public sealed record FactionThreatSignalSnapshot(
|
||||
string ScopeId,
|
||||
string ScopeKind,
|
||||
int EnemyShipCount,
|
||||
int EnemyStationCount);
|
||||
|
||||
public sealed record FactionBlackboardSnapshot(
|
||||
public sealed record FactionEconomicAssessmentSnapshot(
|
||||
int PlanCycle,
|
||||
DateTimeOffset UpdatedAtUtc,
|
||||
int TargetWarshipCount,
|
||||
bool HasWarIndustrySupplyChain,
|
||||
bool HasShipyard,
|
||||
bool HasActiveExpansionProject,
|
||||
string? ActiveExpansionCommodityId,
|
||||
string? ActiveExpansionModuleId,
|
||||
string? ActiveExpansionSiteId,
|
||||
string? ActiveExpansionSystemId,
|
||||
int EnemyFactionCount,
|
||||
int EnemyShipCount,
|
||||
int EnemyStationCount,
|
||||
int MilitaryShipCount,
|
||||
int MinerShipCount,
|
||||
int TransportShipCount,
|
||||
int ConstructorShipCount,
|
||||
int ControlledSystemCount,
|
||||
IReadOnlyList<FactionCommoditySignalSnapshot> CommoditySignals,
|
||||
int TargetMilitaryShipCount,
|
||||
int TargetMinerShipCount,
|
||||
int TargetTransportShipCount,
|
||||
int TargetConstructorShipCount,
|
||||
bool HasShipyard,
|
||||
bool HasWarIndustrySupplyChain,
|
||||
string? PrimaryExpansionSiteId,
|
||||
string? PrimaryExpansionSystemId,
|
||||
float ReplacementPressure,
|
||||
float SustainmentScore,
|
||||
float LogisticsSecurityScore,
|
||||
int CriticalShortageCount,
|
||||
string? IndustrialBottleneckItemId,
|
||||
IReadOnlyList<FactionCommoditySignalSnapshot> CommoditySignals);
|
||||
|
||||
public sealed record FactionThreatSignalSnapshot(
|
||||
string ScopeId,
|
||||
string ScopeKind,
|
||||
int EnemyShipCount,
|
||||
int EnemyStationCount,
|
||||
string? EnemyFactionId);
|
||||
|
||||
public sealed record FactionThreatAssessmentSnapshot(
|
||||
int PlanCycle,
|
||||
DateTimeOffset UpdatedAtUtc,
|
||||
int EnemyFactionCount,
|
||||
int EnemyShipCount,
|
||||
int EnemyStationCount,
|
||||
string? PrimaryThreatFactionId,
|
||||
string? PrimaryThreatSystemId,
|
||||
IReadOnlyList<FactionThreatSignalSnapshot> ThreatSignals);
|
||||
|
||||
public sealed record FactionTheaterSnapshot(
|
||||
string Id,
|
||||
string Kind,
|
||||
string SystemId,
|
||||
string Status,
|
||||
float Priority,
|
||||
float SupplyRisk,
|
||||
float FriendlyAssetValue,
|
||||
string? TargetFactionId,
|
||||
string? AnchorEntityId,
|
||||
Vector3Dto? AnchorPosition,
|
||||
DateTimeOffset UpdatedAtUtc,
|
||||
IReadOnlyList<string> CampaignIds);
|
||||
|
||||
public sealed record FactionPlanStepSnapshot(
|
||||
string Id,
|
||||
string Kind,
|
||||
string Status,
|
||||
float Priority,
|
||||
string? CommodityId,
|
||||
string? ModuleId,
|
||||
string? TargetFactionId,
|
||||
string? TargetSiteId,
|
||||
string? StatusReason,
|
||||
string? ExecutionBindingKind,
|
||||
string? ExecutionBindingTargetId,
|
||||
string? ExecutionBindingSummary,
|
||||
string? BlockingReason,
|
||||
string? Notes,
|
||||
int LastEvaluatedCycle,
|
||||
IReadOnlyList<string> DependencyStepIds,
|
||||
IReadOnlyList<string> RequiredFacts,
|
||||
IReadOnlyList<string> ProducedFacts,
|
||||
IReadOnlyList<string> AssignedAssets,
|
||||
IReadOnlyList<string> IssuedTaskIds);
|
||||
string? Summary,
|
||||
string? BlockingReason);
|
||||
|
||||
public sealed record FactionIssuedTaskSnapshot(
|
||||
public sealed record FactionCampaignSnapshot(
|
||||
string Id,
|
||||
string Kind,
|
||||
string State,
|
||||
string ObjectiveId,
|
||||
string StepId,
|
||||
string Status,
|
||||
float Priority,
|
||||
string? ShipRole,
|
||||
string? CommodityId,
|
||||
string? ModuleId,
|
||||
string? TheaterId,
|
||||
string? TargetFactionId,
|
||||
string? TargetSystemId,
|
||||
string? TargetSiteId,
|
||||
int CreatedAtCycle,
|
||||
int UpdatedAtCycle,
|
||||
string? BlockingReason,
|
||||
string? Notes,
|
||||
IReadOnlyList<string> AssignedAssets);
|
||||
string? TargetEntityId,
|
||||
string? CommodityId,
|
||||
string? SupportStationId,
|
||||
int CurrentStepIndex,
|
||||
DateTimeOffset CreatedAtUtc,
|
||||
DateTimeOffset UpdatedAtUtc,
|
||||
string? Summary,
|
||||
string? PauseReason,
|
||||
float ContinuationScore,
|
||||
float SupplyAdequacy,
|
||||
float ReplacementPressure,
|
||||
int FailureCount,
|
||||
int SuccessCount,
|
||||
string? FleetCommanderId,
|
||||
bool RequiresReinforcement,
|
||||
IReadOnlyList<FactionPlanStepSnapshot> Steps,
|
||||
IReadOnlyList<string> ObjectiveIds);
|
||||
|
||||
public sealed record FactionObjectiveSnapshot(
|
||||
string Id,
|
||||
string CampaignId,
|
||||
string? TheaterId,
|
||||
string Kind,
|
||||
string State,
|
||||
string DelegationKind,
|
||||
string BehaviorKind,
|
||||
string Status,
|
||||
float Priority,
|
||||
string? ParentObjectiveId,
|
||||
string? TargetFactionId,
|
||||
string? CommanderId,
|
||||
string? HomeSystemId,
|
||||
string? HomeStationId,
|
||||
string? TargetSystemId,
|
||||
string? TargetSiteId,
|
||||
string? TargetRegionId,
|
||||
string? TargetEntityId,
|
||||
Vector3Dto? TargetPosition,
|
||||
string? ItemId,
|
||||
string? Notes,
|
||||
int CurrentStepIndex,
|
||||
DateTimeOffset CreatedAtUtc,
|
||||
DateTimeOffset UpdatedAtUtc,
|
||||
bool UseOrders,
|
||||
string? StagingOrderKind,
|
||||
int ReinforcementLevel,
|
||||
IReadOnlyList<FactionPlanStepSnapshot> Steps,
|
||||
IReadOnlyList<string> ReservedAssetIds);
|
||||
|
||||
public sealed record FactionReservationSnapshot(
|
||||
string Id,
|
||||
string ObjectiveId,
|
||||
string? CampaignId,
|
||||
string AssetKind,
|
||||
string AssetId,
|
||||
float Priority,
|
||||
DateTimeOffset CreatedAtUtc,
|
||||
DateTimeOffset UpdatedAtUtc);
|
||||
|
||||
public sealed record FactionProductionProgramSnapshot(
|
||||
string Id,
|
||||
string Kind,
|
||||
string Status,
|
||||
float Priority,
|
||||
string? CampaignId,
|
||||
string? CommodityId,
|
||||
string? ModuleId,
|
||||
int BudgetWeight,
|
||||
int SlotCost,
|
||||
int CreatedAtCycle,
|
||||
int UpdatedAtCycle,
|
||||
string? InvalidationReason,
|
||||
string? BlockingReason,
|
||||
IReadOnlyList<string> PrerequisiteObjectiveIds,
|
||||
IReadOnlyList<string> AssignedAssets,
|
||||
IReadOnlyList<FactionPlanStepSnapshot> Steps);
|
||||
string? ShipKind,
|
||||
string? TargetSystemId,
|
||||
int TargetCount,
|
||||
int CurrentCount,
|
||||
string? Notes);
|
||||
|
||||
public sealed record FactionDecisionLogEntrySnapshot(
|
||||
string Id,
|
||||
string Kind,
|
||||
string Summary,
|
||||
string? RelatedEntityId,
|
||||
int PlanCycle,
|
||||
DateTimeOffset OccurredAtUtc);
|
||||
|
||||
public sealed record FactionStrategicStateSnapshot(
|
||||
int PlanCycle,
|
||||
DateTimeOffset UpdatedAtUtc,
|
||||
string Status,
|
||||
FactionBudgetSnapshot Budget,
|
||||
FactionEconomicAssessmentSnapshot EconomicAssessment,
|
||||
FactionThreatAssessmentSnapshot ThreatAssessment,
|
||||
IReadOnlyList<FactionTheaterSnapshot> Theaters,
|
||||
IReadOnlyList<FactionCampaignSnapshot> Campaigns,
|
||||
IReadOnlyList<FactionObjectiveSnapshot> Objectives,
|
||||
IReadOnlyList<FactionReservationSnapshot> Reservations,
|
||||
IReadOnlyList<FactionProductionProgramSnapshot> ProductionPrograms);
|
||||
|
||||
public sealed record CommanderAssignmentSnapshot(
|
||||
string CommanderId,
|
||||
string Kind,
|
||||
string BehaviorKind,
|
||||
string Status,
|
||||
string? ObjectiveId,
|
||||
string? CampaignId,
|
||||
string? TheaterId,
|
||||
string? ParentCommanderId,
|
||||
string? ControlledEntityId,
|
||||
float Priority,
|
||||
string? HomeSystemId,
|
||||
string? HomeStationId,
|
||||
string? TargetSystemId,
|
||||
string? TargetEntityId,
|
||||
Vector3Dto? TargetPosition,
|
||||
string? ItemId,
|
||||
string? Notes,
|
||||
DateTimeOffset? UpdatedAtUtc,
|
||||
IReadOnlyList<string> ActiveObjectiveIds,
|
||||
IReadOnlyList<string> SubordinateCommanderIds);
|
||||
|
||||
public sealed record FactionSnapshot(
|
||||
string Id,
|
||||
@@ -153,11 +278,11 @@ public sealed record FactionSnapshot(
|
||||
int ShipsBuilt,
|
||||
int ShipsLost,
|
||||
string? DefaultPolicySetId,
|
||||
FactionPlanningStateSnapshot? StrategicAssessment,
|
||||
IReadOnlyList<FactionStrategicPrioritySnapshot>? StrategicPriorities,
|
||||
FactionBlackboardSnapshot? Blackboard,
|
||||
IReadOnlyList<FactionObjectiveSnapshot>? Objectives,
|
||||
IReadOnlyList<FactionIssuedTaskSnapshot>? IssuedTasks);
|
||||
FactionDoctrineSnapshot Doctrine,
|
||||
FactionMemorySnapshot Memory,
|
||||
FactionStrategicStateSnapshot StrategicState,
|
||||
IReadOnlyList<FactionDecisionLogEntrySnapshot> DecisionLog,
|
||||
IReadOnlyList<CommanderAssignmentSnapshot> Commanders);
|
||||
|
||||
public sealed record FactionDelta(
|
||||
string Id,
|
||||
@@ -170,8 +295,8 @@ public sealed record FactionDelta(
|
||||
int ShipsBuilt,
|
||||
int ShipsLost,
|
||||
string? DefaultPolicySetId,
|
||||
FactionPlanningStateSnapshot? StrategicAssessment,
|
||||
IReadOnlyList<FactionStrategicPrioritySnapshot>? StrategicPriorities,
|
||||
FactionBlackboardSnapshot? Blackboard,
|
||||
IReadOnlyList<FactionObjectiveSnapshot>? Objectives,
|
||||
IReadOnlyList<FactionIssuedTaskSnapshot>? IssuedTasks);
|
||||
FactionDoctrineSnapshot Doctrine,
|
||||
FactionMemorySnapshot Memory,
|
||||
FactionStrategicStateSnapshot StrategicState,
|
||||
IReadOnlyList<FactionDecisionLogEntrySnapshot> DecisionLog,
|
||||
IReadOnlyList<CommanderAssignmentSnapshot> Commanders);
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
namespace SpaceGame.Api.Factions.Runtime;
|
||||
|
||||
public sealed class FactionRuntime
|
||||
@@ -14,6 +13,10 @@ public sealed class FactionRuntime
|
||||
public int ShipsLost { get; set; }
|
||||
public HashSet<string> CommanderIds { get; } = new(StringComparer.Ordinal);
|
||||
public string? DefaultPolicySetId { get; set; }
|
||||
public FactionDoctrineRuntime Doctrine { get; set; } = new();
|
||||
public FactionMemoryRuntime Memory { get; set; } = new();
|
||||
public FactionStrategicStateRuntime StrategicState { get; set; } = new();
|
||||
public List<FactionDecisionLogEntryRuntime> DecisionLog { get; } = [];
|
||||
public string LastDeltaSignature { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
@@ -26,183 +29,296 @@ public sealed class CommanderRuntime
|
||||
public string? ControlledEntityId { get; set; }
|
||||
public string? PolicySetId { get; set; }
|
||||
public string? Doctrine { get; set; }
|
||||
public List<string> Goals { get; } = [];
|
||||
public string? ActiveGoalName { get; set; }
|
||||
public string? ActiveActionName { get; set; }
|
||||
public float ReplanTimer { get; set; }
|
||||
public bool NeedsReplan { get; set; } = true;
|
||||
public CommanderBehaviorRuntime? ActiveBehavior { get; set; }
|
||||
public CommanderOrderRuntime? ActiveOrder { get; set; }
|
||||
public CommanderTaskRuntime? ActiveTask { get; set; }
|
||||
public CommanderAssignmentRuntime? Assignment { get; set; }
|
||||
public CommanderSkillProfileRuntime Skills { get; set; } = new();
|
||||
public HashSet<string> SubordinateCommanderIds { get; } = new(StringComparer.Ordinal);
|
||||
public HashSet<string> ActiveObjectiveIds { get; } = new(StringComparer.Ordinal);
|
||||
public bool IsAlive { get; set; } = true;
|
||||
public FactionPlanningState? LastStrategicAssessment { get; set; }
|
||||
public IReadOnlyList<(string Name, float Priority)>? LastStrategicPriorities { get; set; }
|
||||
public FactionBlackboardRuntime? FactionBlackboard { get; set; }
|
||||
public List<FactionObjectiveRuntime> Objectives { get; } = [];
|
||||
public List<FactionIssuedTaskRuntime> IssuedTasks { get; } = [];
|
||||
public int PlanningCycle { get; set; }
|
||||
public string LastDeltaSignature { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
public enum FactionObjectiveKind
|
||||
public sealed class CommanderAssignmentRuntime
|
||||
{
|
||||
DestroyFaction,
|
||||
BootstrapWarIndustry,
|
||||
BuildShipyard,
|
||||
BuildAttackFleet,
|
||||
EnsureCommoditySupply,
|
||||
EnsureWaterSecurity,
|
||||
EnsureMiningCapacity,
|
||||
EnsureConstructionCapacity,
|
||||
EnsureTransportCapacity,
|
||||
}
|
||||
|
||||
public enum FactionObjectiveState
|
||||
{
|
||||
Planned,
|
||||
Active,
|
||||
Blocked,
|
||||
Complete,
|
||||
Failed,
|
||||
Cancelled,
|
||||
}
|
||||
|
||||
public enum FactionPlanStepKind
|
||||
{
|
||||
EnsureCommodityProduction,
|
||||
EnsureShipyardSite,
|
||||
ProduceFleet,
|
||||
AttackFactionAssets,
|
||||
EnsureWaterSupply,
|
||||
EnsureMiningCapacity,
|
||||
EnsureConstructionCapacity,
|
||||
EnsureTransportCapacity,
|
||||
MonitorExpansionProject,
|
||||
}
|
||||
|
||||
public enum FactionPlanStepStatus
|
||||
{
|
||||
Planned,
|
||||
Ready,
|
||||
Running,
|
||||
Blocked,
|
||||
Complete,
|
||||
Failed,
|
||||
Cancelled,
|
||||
}
|
||||
|
||||
public enum FactionIssuedTaskKind
|
||||
{
|
||||
ExpandIndustry,
|
||||
ProduceShips,
|
||||
AttackFactionAssets,
|
||||
SustainWarIndustry,
|
||||
}
|
||||
|
||||
public enum FactionIssuedTaskState
|
||||
{
|
||||
Planned,
|
||||
Active,
|
||||
Blocked,
|
||||
Complete,
|
||||
Cancelled,
|
||||
}
|
||||
|
||||
public sealed class FactionObjectiveRuntime
|
||||
{
|
||||
public required string Id { get; init; }
|
||||
public required string MergeKey { get; init; }
|
||||
public required FactionObjectiveKind Kind { get; init; }
|
||||
public FactionObjectiveState State { get; set; } = FactionObjectiveState.Planned;
|
||||
public required string ObjectiveId { get; set; }
|
||||
public string? CampaignId { get; set; }
|
||||
public string? TheaterId { get; set; }
|
||||
public required string Kind { get; set; }
|
||||
public required string BehaviorKind { get; set; }
|
||||
public string Status { get; set; } = "active";
|
||||
public float Priority { get; set; }
|
||||
public string? ParentObjectiveId { get; set; }
|
||||
public string? TargetFactionId { get; set; }
|
||||
public string? HomeSystemId { get; set; }
|
||||
public string? HomeStationId { get; set; }
|
||||
public string? TargetSystemId { get; set; }
|
||||
public string? TargetSiteId { get; set; }
|
||||
public string? TargetRegionId { get; set; }
|
||||
public string? CommodityId { get; set; }
|
||||
public string? ModuleId { get; set; }
|
||||
public int BudgetWeight { get; set; }
|
||||
public int SlotCost { get; set; } = 1;
|
||||
public int CreatedAtCycle { get; init; }
|
||||
public int UpdatedAtCycle { get; set; }
|
||||
public string? InvalidationReason { get; set; }
|
||||
public string? BlockingReason { get; set; }
|
||||
public HashSet<string> PrerequisiteObjectiveIds { get; } = new(StringComparer.Ordinal);
|
||||
public HashSet<string> AssignedAssetIds { get; } = new(StringComparer.Ordinal);
|
||||
public List<FactionPlanStepRuntime> Steps { get; } = [];
|
||||
public string? TargetEntityId { get; set; }
|
||||
public Vector3? TargetPosition { get; set; }
|
||||
public string? ItemId { get; set; }
|
||||
public string? Notes { get; set; }
|
||||
public DateTimeOffset UpdatedAtUtc { get; set; } = DateTimeOffset.UtcNow;
|
||||
}
|
||||
|
||||
public sealed class FactionPlanStepRuntime
|
||||
public sealed class CommanderSkillProfileRuntime
|
||||
{
|
||||
public int Leadership { get; set; } = 3;
|
||||
public int Coordination { get; set; } = 3;
|
||||
public int Strategy { get; set; } = 3;
|
||||
}
|
||||
|
||||
public sealed class FactionDoctrineRuntime
|
||||
{
|
||||
public string StrategicPosture { get; set; } = "balanced";
|
||||
public string ExpansionPosture { get; set; } = "measured";
|
||||
public string MilitaryPosture { get; set; } = "defensive";
|
||||
public string EconomicPosture { get; set; } = "self-sufficient";
|
||||
public int DesiredControlledSystems { get; set; } = 3;
|
||||
public int DesiredMilitaryPerFront { get; set; } = 2;
|
||||
public int DesiredMinersPerSystem { get; set; } = 1;
|
||||
public int DesiredTransportsPerSystem { get; set; } = 1;
|
||||
public int DesiredConstructors { get; set; } = 1;
|
||||
public float ReserveCreditsRatio { get; set; } = 0.2f;
|
||||
public float ExpansionBudgetRatio { get; set; } = 0.25f;
|
||||
public float WarBudgetRatio { get; set; } = 0.35f;
|
||||
public float ReserveMilitaryRatio { get; set; } = 0.2f;
|
||||
public float OffensiveReadinessThreshold { get; set; } = 0.62f;
|
||||
public float SupplySecurityBias { get; set; } = 0.55f;
|
||||
public float FailureAversion { get; set; } = 0.45f;
|
||||
public int ReinforcementLeadPerFront { get; set; } = 1;
|
||||
}
|
||||
|
||||
public sealed class FactionMemoryRuntime
|
||||
{
|
||||
public int LastPlanCycle { get; set; }
|
||||
public DateTimeOffset UpdatedAtUtc { get; set; }
|
||||
public int LastObservedShipsBuilt { get; set; }
|
||||
public int LastObservedShipsLost { get; set; }
|
||||
public float LastObservedCredits { get; set; }
|
||||
public HashSet<string> KnownSystemIds { get; } = new(StringComparer.Ordinal);
|
||||
public HashSet<string> KnownEnemyFactionIds { get; } = new(StringComparer.Ordinal);
|
||||
public List<FactionSystemMemoryRuntime> SystemMemories { get; } = [];
|
||||
public List<FactionCommodityMemoryRuntime> CommodityMemories { get; } = [];
|
||||
public List<FactionOutcomeRecordRuntime> RecentOutcomes { get; } = [];
|
||||
}
|
||||
|
||||
public sealed class FactionSystemMemoryRuntime
|
||||
{
|
||||
public required string SystemId { get; init; }
|
||||
public DateTimeOffset LastSeenAtUtc { get; set; }
|
||||
public int LastEnemyShipCount { get; set; }
|
||||
public int LastEnemyStationCount { get; set; }
|
||||
public bool ControlledByFaction { get; set; }
|
||||
public string? LastRole { get; set; }
|
||||
public float FrontierPressure { get; set; }
|
||||
public float RouteRisk { get; set; }
|
||||
public float HistoricalShortagePressure { get; set; }
|
||||
public int OffensiveFailures { get; set; }
|
||||
public int DefensiveFailures { get; set; }
|
||||
public int OffensiveSuccesses { get; set; }
|
||||
public int DefensiveSuccesses { get; set; }
|
||||
public DateTimeOffset? LastContestedAtUtc { get; set; }
|
||||
public DateTimeOffset? LastShortageAtUtc { get; set; }
|
||||
}
|
||||
|
||||
public sealed class FactionCommodityMemoryRuntime
|
||||
{
|
||||
public required string ItemId { get; init; }
|
||||
public float HistoricalShortageScore { get; set; }
|
||||
public float HistoricalSurplusScore { get; set; }
|
||||
public float LastObservedBacklog { get; set; }
|
||||
public DateTimeOffset UpdatedAtUtc { get; set; }
|
||||
public DateTimeOffset? LastCriticalAtUtc { get; set; }
|
||||
}
|
||||
|
||||
public sealed class FactionOutcomeRecordRuntime
|
||||
{
|
||||
public required string Id { get; init; }
|
||||
public required string ObjectiveId { get; init; }
|
||||
public required FactionPlanStepKind Kind { get; init; }
|
||||
public FactionPlanStepStatus Status { get; set; } = FactionPlanStepStatus.Planned;
|
||||
public float Priority { get; set; }
|
||||
public string? CommodityId { get; set; }
|
||||
public string? ModuleId { get; set; }
|
||||
public string? TargetFactionId { get; set; }
|
||||
public string? TargetSiteId { get; set; }
|
||||
public string? StatusReason { get; set; }
|
||||
public string? ExecutionBindingKind { get; set; }
|
||||
public string? ExecutionBindingTargetId { get; set; }
|
||||
public string? ExecutionBindingSummary { get; set; }
|
||||
public string? BlockingReason { get; set; }
|
||||
public string? Notes { get; set; }
|
||||
public int LastEvaluatedCycle { get; set; }
|
||||
public HashSet<string> DependencyStepIds { get; } = new(StringComparer.Ordinal);
|
||||
public HashSet<string> RequiredFacts { get; } = new(StringComparer.Ordinal);
|
||||
public HashSet<string> ProducedFacts { get; } = new(StringComparer.Ordinal);
|
||||
public HashSet<string> AssignedAssetIds { get; } = new(StringComparer.Ordinal);
|
||||
public HashSet<string> IssuedTaskIds { get; } = new(StringComparer.Ordinal);
|
||||
public required string Kind { get; set; }
|
||||
public required string Summary { get; set; }
|
||||
public string? RelatedCampaignId { get; set; }
|
||||
public string? RelatedObjectiveId { get; set; }
|
||||
public DateTimeOffset OccurredAtUtc { get; set; } = DateTimeOffset.UtcNow;
|
||||
}
|
||||
|
||||
public sealed class FactionIssuedTaskRuntime
|
||||
{
|
||||
public required string Id { get; init; }
|
||||
public required string MergeKey { get; init; }
|
||||
public required FactionIssuedTaskKind Kind { get; init; }
|
||||
public required string ObjectiveId { get; init; }
|
||||
public required string StepId { get; init; }
|
||||
public FactionIssuedTaskState State { get; set; } = FactionIssuedTaskState.Planned;
|
||||
public float Priority { get; set; }
|
||||
public string? ShipRole { get; set; }
|
||||
public string? CommodityId { get; set; }
|
||||
public string? ModuleId { get; set; }
|
||||
public string? TargetFactionId { get; set; }
|
||||
public string? TargetSystemId { get; set; }
|
||||
public string? TargetSiteId { get; set; }
|
||||
public int CreatedAtCycle { get; init; }
|
||||
public int UpdatedAtCycle { get; set; }
|
||||
public string? BlockingReason { get; set; }
|
||||
public string? Notes { get; set; }
|
||||
public HashSet<string> AssignedAssetIds { get; } = new(StringComparer.Ordinal);
|
||||
}
|
||||
|
||||
public sealed class FactionBlackboardRuntime
|
||||
public sealed class FactionStrategicStateRuntime
|
||||
{
|
||||
public int PlanCycle { get; set; }
|
||||
public DateTimeOffset UpdatedAtUtc { get; set; }
|
||||
public string Status { get; set; } = "stable";
|
||||
public FactionBudgetRuntime Budget { get; set; } = new();
|
||||
public FactionEconomicAssessmentRuntime EconomicAssessment { get; set; } = new();
|
||||
public FactionThreatAssessmentRuntime ThreatAssessment { get; set; } = new();
|
||||
public List<FactionTheaterRuntime> Theaters { get; } = [];
|
||||
public List<FactionCampaignRuntime> Campaigns { get; } = [];
|
||||
public List<FactionOperationalObjectiveRuntime> Objectives { get; } = [];
|
||||
public List<FactionAssetReservationRuntime> Reservations { get; } = [];
|
||||
public List<FactionProductionProgramRuntime> ProductionPrograms { get; } = [];
|
||||
}
|
||||
|
||||
public sealed class FactionBudgetRuntime
|
||||
{
|
||||
public float ReservedCredits { get; set; }
|
||||
public float ExpansionCredits { get; set; }
|
||||
public float WarCredits { get; set; }
|
||||
public int ReservedMilitaryAssets { get; set; }
|
||||
public int ReservedLogisticsAssets { get; set; }
|
||||
public int ReservedConstructionAssets { get; set; }
|
||||
}
|
||||
|
||||
public sealed class FactionEconomicAssessmentRuntime
|
||||
{
|
||||
public int PlanCycle { get; set; }
|
||||
public DateTimeOffset UpdatedAtUtc { get; set; }
|
||||
public int TargetWarshipCount { get; set; }
|
||||
public bool HasWarIndustrySupplyChain { get; set; }
|
||||
public bool HasShipyard { get; set; }
|
||||
public bool HasActiveExpansionProject { get; set; }
|
||||
public string? ActiveExpansionCommodityId { get; set; }
|
||||
public string? ActiveExpansionModuleId { get; set; }
|
||||
public string? ActiveExpansionSiteId { get; set; }
|
||||
public string? ActiveExpansionSystemId { get; set; }
|
||||
public int EnemyFactionCount { get; set; }
|
||||
public int EnemyShipCount { get; set; }
|
||||
public int EnemyStationCount { get; set; }
|
||||
public int MilitaryShipCount { get; set; }
|
||||
public int MinerShipCount { get; set; }
|
||||
public int TransportShipCount { get; set; }
|
||||
public int ConstructorShipCount { get; set; }
|
||||
public int ControlledSystemCount { get; set; }
|
||||
public int TargetMilitaryShipCount { get; set; }
|
||||
public int TargetMinerShipCount { get; set; }
|
||||
public int TargetTransportShipCount { get; set; }
|
||||
public int TargetConstructorShipCount { get; set; }
|
||||
public bool HasShipyard { get; set; }
|
||||
public bool HasWarIndustrySupplyChain { get; set; }
|
||||
public string? PrimaryExpansionSiteId { get; set; }
|
||||
public string? PrimaryExpansionSystemId { get; set; }
|
||||
public float ReplacementPressure { get; set; }
|
||||
public float SustainmentScore { get; set; }
|
||||
public float LogisticsSecurityScore { get; set; }
|
||||
public int CriticalShortageCount { get; set; }
|
||||
public string? IndustrialBottleneckItemId { get; set; }
|
||||
public List<FactionCommoditySignalRuntime> CommoditySignals { get; } = [];
|
||||
}
|
||||
|
||||
public sealed class FactionThreatAssessmentRuntime
|
||||
{
|
||||
public int PlanCycle { get; set; }
|
||||
public DateTimeOffset UpdatedAtUtc { get; set; }
|
||||
public int EnemyFactionCount { get; set; }
|
||||
public int EnemyShipCount { get; set; }
|
||||
public int EnemyStationCount { get; set; }
|
||||
public string? PrimaryThreatFactionId { get; set; }
|
||||
public string? PrimaryThreatSystemId { get; set; }
|
||||
public List<FactionThreatSignalRuntime> ThreatSignals { get; } = [];
|
||||
public HashSet<string> AvailableShipIds { get; } = new(StringComparer.Ordinal);
|
||||
}
|
||||
|
||||
public sealed class FactionTheaterRuntime
|
||||
{
|
||||
public required string Id { get; init; }
|
||||
public required string Kind { get; set; }
|
||||
public required string SystemId { get; set; }
|
||||
public string Status { get; set; } = "active";
|
||||
public float Priority { get; set; }
|
||||
public float SupplyRisk { get; set; }
|
||||
public float FriendlyAssetValue { get; set; }
|
||||
public string? TargetFactionId { get; set; }
|
||||
public string? AnchorEntityId { get; set; }
|
||||
public Vector3? AnchorPosition { get; set; }
|
||||
public DateTimeOffset UpdatedAtUtc { get; set; } = DateTimeOffset.UtcNow;
|
||||
public List<string> CampaignIds { get; } = [];
|
||||
}
|
||||
|
||||
public sealed class FactionCampaignRuntime
|
||||
{
|
||||
public required string Id { get; init; }
|
||||
public required string Kind { get; set; }
|
||||
public string Status { get; set; } = "planned";
|
||||
public float Priority { get; set; }
|
||||
public string? TheaterId { get; set; }
|
||||
public string? TargetFactionId { get; set; }
|
||||
public string? TargetSystemId { get; set; }
|
||||
public string? TargetEntityId { get; set; }
|
||||
public string? CommodityId { get; set; }
|
||||
public string? SupportStationId { get; set; }
|
||||
public int CurrentStepIndex { get; set; }
|
||||
public DateTimeOffset CreatedAtUtc { get; set; } = DateTimeOffset.UtcNow;
|
||||
public DateTimeOffset UpdatedAtUtc { get; set; } = DateTimeOffset.UtcNow;
|
||||
public string? Summary { get; set; }
|
||||
public string? PauseReason { get; set; }
|
||||
public float ContinuationScore { get; set; }
|
||||
public float SupplyAdequacy { get; set; }
|
||||
public float ReplacementPressure { get; set; }
|
||||
public int FailureCount { get; set; }
|
||||
public int SuccessCount { get; set; }
|
||||
public string? FleetCommanderId { get; set; }
|
||||
public bool RequiresReinforcement { get; set; }
|
||||
public List<FactionPlanStepRuntime> Steps { get; } = [];
|
||||
public List<string> ObjectiveIds { get; } = [];
|
||||
}
|
||||
|
||||
public sealed class FactionOperationalObjectiveRuntime
|
||||
{
|
||||
public required string Id { get; init; }
|
||||
public required string CampaignId { get; set; }
|
||||
public string? TheaterId { get; set; }
|
||||
public required string Kind { get; set; }
|
||||
public required string DelegationKind { get; set; }
|
||||
public required string BehaviorKind { get; set; }
|
||||
public string Status { get; set; } = "planned";
|
||||
public float Priority { get; set; }
|
||||
public string? CommanderId { get; set; }
|
||||
public string? HomeSystemId { get; set; }
|
||||
public string? HomeStationId { get; set; }
|
||||
public string? TargetSystemId { get; set; }
|
||||
public string? TargetEntityId { get; set; }
|
||||
public Vector3? TargetPosition { get; set; }
|
||||
public string? ItemId { get; set; }
|
||||
public string? Notes { get; set; }
|
||||
public int CurrentStepIndex { get; set; }
|
||||
public DateTimeOffset CreatedAtUtc { get; set; } = DateTimeOffset.UtcNow;
|
||||
public DateTimeOffset UpdatedAtUtc { get; set; } = DateTimeOffset.UtcNow;
|
||||
public bool UseOrders { get; set; }
|
||||
public string? StagingOrderKind { get; set; }
|
||||
public int ReinforcementLevel { get; set; }
|
||||
public List<FactionPlanStepRuntime> Steps { get; } = [];
|
||||
public List<string> ReservedAssetIds { get; } = [];
|
||||
}
|
||||
|
||||
public sealed class FactionPlanStepRuntime
|
||||
{
|
||||
public required string Id { get; init; }
|
||||
public required string Kind { get; set; }
|
||||
public string Status { get; set; } = "planned";
|
||||
public string? Summary { get; set; }
|
||||
public string? BlockingReason { get; set; }
|
||||
}
|
||||
|
||||
public sealed class FactionAssetReservationRuntime
|
||||
{
|
||||
public required string Id { get; init; }
|
||||
public required string ObjectiveId { get; set; }
|
||||
public string? CampaignId { get; set; }
|
||||
public required string AssetKind { get; set; }
|
||||
public required string AssetId { get; set; }
|
||||
public float Priority { get; set; }
|
||||
public DateTimeOffset CreatedAtUtc { get; set; } = DateTimeOffset.UtcNow;
|
||||
public DateTimeOffset UpdatedAtUtc { get; set; } = DateTimeOffset.UtcNow;
|
||||
}
|
||||
|
||||
public sealed class FactionProductionProgramRuntime
|
||||
{
|
||||
public required string Id { get; init; }
|
||||
public required string Kind { get; set; }
|
||||
public string Status { get; set; } = "planned";
|
||||
public float Priority { get; set; }
|
||||
public string? CampaignId { get; set; }
|
||||
public string? CommodityId { get; set; }
|
||||
public string? ModuleId { get; set; }
|
||||
public string? ShipKind { get; set; }
|
||||
public string? TargetSystemId { get; set; }
|
||||
public int TargetCount { get; set; }
|
||||
public int CurrentCount { get; set; }
|
||||
public string? Notes { get; set; }
|
||||
}
|
||||
|
||||
public sealed class FactionDecisionLogEntryRuntime
|
||||
{
|
||||
public required string Id { get; init; }
|
||||
public required string Kind { get; set; }
|
||||
public required string Summary { get; set; }
|
||||
public string? RelatedEntityId { get; set; }
|
||||
public int PlanCycle { get; set; }
|
||||
public DateTimeOffset OccurredAtUtc { get; set; } = DateTimeOffset.UtcNow;
|
||||
}
|
||||
|
||||
public sealed class FactionCommoditySignalRuntime
|
||||
@@ -228,38 +344,5 @@ public sealed class FactionThreatSignalRuntime
|
||||
public required string ScopeKind { get; init; }
|
||||
public int EnemyShipCount { get; set; }
|
||||
public int EnemyStationCount { get; set; }
|
||||
}
|
||||
|
||||
public sealed class CommanderBehaviorRuntime
|
||||
{
|
||||
public required string Kind { get; set; }
|
||||
public string? Phase { get; set; }
|
||||
public string? TargetEntityId { get; set; }
|
||||
public string? ItemId { get; set; }
|
||||
public string? NodeId { get; set; }
|
||||
public string? StationId { get; set; }
|
||||
public string? ModuleId { get; set; }
|
||||
public string? AreaSystemId { get; set; }
|
||||
public int PatrolIndex { get; set; }
|
||||
}
|
||||
|
||||
public sealed class CommanderOrderRuntime
|
||||
{
|
||||
public required string Kind { get; init; }
|
||||
public OrderStatus Status { get; set; } = OrderStatus.Accepted;
|
||||
public string? TargetEntityId { get; set; }
|
||||
public string? DestinationNodeId { get; set; }
|
||||
public required string DestinationSystemId { get; init; }
|
||||
public required Vector3 DestinationPosition { get; init; }
|
||||
}
|
||||
|
||||
public sealed class CommanderTaskRuntime
|
||||
{
|
||||
public required string Kind { get; set; }
|
||||
public WorkStatus Status { get; set; } = WorkStatus.Pending;
|
||||
public string? TargetEntityId { get; set; }
|
||||
public string? TargetSystemId { get; set; }
|
||||
public string? TargetNodeId { get; set; }
|
||||
public Vector3? TargetPosition { get; set; }
|
||||
public float Threshold { get; set; }
|
||||
public string? EnemyFactionId { get; set; }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user