using System.Text.Json.Serialization; namespace SpaceGame.Api.Definitions; public sealed class ConstructionDefinition { public string? RecipeId { get; set; } public string FacilityCategory { get; set; } = "station"; public List RequiredModules { get; set; } = []; public List Requirements { get; set; } = []; public float CycleTime { get; set; } public float BatchSize { get; set; } = 1f; public float ProductsPerHour { get; set; } public float MaxEfficiency { get; set; } = 1f; public int Priority { get; set; } } public sealed class ItemPriceDefinition { public float Min { get; set; } public float Max { get; set; } public float Avg { get; set; } } public sealed class ItemEffectDefinition { public required string Type { get; set; } public float Product { get; set; } } public sealed class ItemProductionDefinition { public float Time { get; set; } public float Amount { get; set; } public string Method { get; set; } = "default"; public string Name { get; set; } = "Universal"; public List Wares { get; set; } = []; public List Effects { get; set; } = []; } public sealed class BalanceDefinition { public float YPlane { get; set; } public float ArrivalThreshold { get; set; } public float MiningRate { get; set; } public float MiningCycleSeconds { get; set; } public float TransferRate { get; set; } public float DockingDuration { get; set; } public float UndockingDuration { get; set; } public float UndockDistance { get; set; } } public sealed class StarDefinition { public string Kind { get; set; } = "main-sequence"; public required string Color { get; set; } public required string Glow { get; set; } public float Size { get; set; } public float OrbitRadius { get; set; } public float OrbitSpeed { get; set; } public float OrbitPhaseAtEpoch { get; set; } } public sealed class MoonDefinition { public required string Label { get; set; } public float Size { get; set; } public required string Color { get; set; } public float OrbitRadius { get; set; } public float OrbitSpeed { get; set; } public float OrbitPhaseAtEpoch { get; set; } public float OrbitInclination { get; set; } public float OrbitLongitudeOfAscendingNode { get; set; } } public sealed class SolarSystemDefinition { public required string Id { get; set; } public required string Label { get; set; } public required float[] Position { get; set; } public required List Stars { get; set; } public required AsteroidFieldDefinition AsteroidField { get; set; } public required List ResourceNodes { get; set; } public required List Planets { get; set; } } public sealed class AsteroidFieldDefinition { public int DecorationCount { get; set; } public float RadiusOffset { get; set; } public float RadiusVariance { get; set; } public float HeightVariance { get; set; } } public sealed class ResourceNodeDefinition { public string SourceKind { get; set; } = "asteroid-belt"; public float Angle { get; set; } public float RadiusOffset { get; set; } public float InclinationDegrees { get; set; } public int? AnchorPlanetIndex { get; set; } public int? AnchorMoonIndex { get; set; } public float OreAmount { get; set; } public required string ItemId { get; set; } public int ShardCount { get; set; } } public sealed class ItemDefinition { public required string Id { get; set; } public required string Name { get; set; } public string Description { get; set; } = string.Empty; public string Type { get; set; } = "material"; public string CargoKind { get; set; } = string.Empty; public float Volume { get; set; } = 1f; public int Version { get; set; } public string FactoryName { get; set; } = string.Empty; public string Icon { get; set; } = string.Empty; public string Group { get; set; } = string.Empty; public ItemPriceDefinition? Price { get; set; } public List Illegal { get; set; } = []; public List Production { get; set; } = []; public ConstructionDefinition? Construction { get; set; } [JsonPropertyName("transport")] public string Transport { set => CargoKind = value; } } public sealed class RecipeOutputDefinition { public required string ItemId { get; set; } public float Amount { get; set; } } public sealed class RecipeInputDefinition { public string ItemId { get; set; } = string.Empty; public float Amount { get; set; } [JsonPropertyName("ware")] public string Ware { set => ItemId = value; } } public sealed class ModuleConstructionDefinition { public required List Requirements { get; set; } public float ProductionTime { get; set; } } public sealed class ModuleDockDefinition { public int Capacity { get; set; } public required string Size { get; set; } } public sealed class ModuleCargoDefinition { public float Max { get; set; } public required string Type { get; set; } } public sealed class ModuleWorkForceDefinition { public float Capacity { get; set; } public float Max { get; set; } public string Race { get; set; } = string.Empty; } public sealed class ModuleMountDefinition { public required string Group { get; set; } public required string Size { get; set; } public bool Hittable { get; set; } public List Types { get; set; } = []; } public sealed class ModuleProductionDefinition { public float Time { get; set; } public float Amount { get; set; } public string Method { get; set; } = "default"; public string Name { get; set; } = "Universal"; public List Wares { get; set; } = []; } public sealed class ModuleDefinition { public required string Id { get; set; } public required string Name { get; set; } public string Description { get; set; } = string.Empty; public required string Type { get; set; } [JsonIgnore] public string? Product { get; set; } public List Products { get; set; } = []; public string ProductionMode { get; set; } = "passive"; public float Radius { get; set; } = 12f; public float Hull { get; set; } = 100f; public float WorkforceNeeded { get; set; } public int Version { get; set; } public string Macro { get; set; } = string.Empty; public string MakerRace { get; set; } = string.Empty; public int ExplosionDamage { get; set; } public ItemPriceDefinition? Price { get; set; } public List Owners { get; set; } = []; public ModuleCargoDefinition? Cargo { get; set; } public ModuleWorkForceDefinition? WorkForce { get; set; } public List Docks { get; set; } = []; public List Shields { get; set; } = []; public List Turrets { get; set; } = []; public List Production { get; set; } = []; public ModuleConstructionDefinition? Construction { get; set; } [JsonPropertyName("product")] public List ProductIds { get => Products; set => Products = value ?? []; } } public sealed class ModuleRecipeDefinition { public required string ModuleId { get; set; } public float Duration { get; set; } public required List Inputs { get; set; } } public sealed class RecipeDefinition { public required string Id { get; set; } public required string Label { get; set; } public required string FacilityCategory { get; set; } public float Duration { get; set; } public int Priority { get; set; } public List RequiredModules { get; set; } = []; public List Inputs { get; set; } = []; public List Outputs { get; set; } = []; public string? ShipOutputId { get; set; } } public sealed class PlanetDefinition { public required string Label { get; set; } public string PlanetType { get; set; } = "terrestrial"; public string Shape { get; set; } = "sphere"; public List Moons { get; set; } = []; public float OrbitRadius { get; set; } public float OrbitSpeed { get; set; } public float OrbitEccentricity { get; set; } public float OrbitInclination { get; set; } public float OrbitLongitudeOfAscendingNode { get; set; } public float OrbitArgumentOfPeriapsis { get; set; } public float OrbitPhaseAtEpoch { get; set; } public float Size { get; set; } public required string Color { get; set; } public float Tilt { get; set; } public bool HasRing { get; set; } } public sealed class ShipDefinition { public required string Id { get; set; } public required string Label { get; set; } public required string Kind { get; set; } public required string Class { get; set; } public float Speed { get; set; } public float WarpSpeed { get; set; } public float FtlSpeed { get; set; } public float SpoolTime { get; set; } public float CargoCapacity { get; set; } public string? CargoKind { get; set; } public required string Color { get; set; } public required string HullColor { get; set; } public float Size { get; set; } public float MaxHealth { get; set; } public List Capabilities { get; set; } = []; public ConstructionDefinition? Construction { get; set; } } public sealed class ScenarioDefinition { public required List InitialStations { get; set; } public required List ShipFormations { get; set; } public required List PatrolRoutes { get; set; } public required MiningDefaultsDefinition MiningDefaults { get; set; } } public sealed class InitialStationDefinition { public required string SystemId { get; set; } public string Label { get; set; } = "Orbital Station"; public string Color { get; set; } = "#8df0d2"; public List StartingModules { get; set; } = []; public string? FactionId { get; set; } public int? PlanetIndex { get; set; } public int? LagrangeSide { get; set; } public float[]? Position { get; set; } } public sealed class ShipFormationDefinition { public required string ShipId { get; set; } public int Count { get; set; } public required float[] Center { get; set; } public required string SystemId { get; set; } public string? FactionId { get; set; } } public sealed class PatrolRouteDefinition { public required string SystemId { get; set; } public required List Points { get; set; } } public sealed class MiningDefaultsDefinition { public required string NodeSystemId { get; set; } public required string RefinerySystemId { get; set; } }