Remove derived properties from Parameters.

This commit is contained in:
Paul Chote
2025-04-12 15:21:13 +01:00
committed by Gustas Kažukauskas
parent e10cdc6690
commit 31154e3d2d

View File

@@ -62,11 +62,6 @@ namespace OpenRA.Mods.Common.Traits
sealed class Parameters sealed class Parameters
{ {
[FieldLoader.Ignore]
public readonly Map Map;
[FieldLoader.Ignore]
public readonly ITemplatedTerrainInfo TemplatedTerrainInfo;
[FieldLoader.Require] [FieldLoader.Require]
public readonly int Seed = default; public readonly int Seed = default;
[FieldLoader.Require] [FieldLoader.Require]
@@ -229,16 +224,11 @@ namespace OpenRA.Mods.Common.Traits
[FieldLoader.Ignore] [FieldLoader.Ignore]
public readonly IReadOnlyList<string> RoadSegmentTypes; public readonly IReadOnlyList<string> RoadSegmentTypes;
[FieldLoader.Ignore]
public readonly int SymmetryCount;
[FieldLoader.Ignore]
public readonly int TotalPlayers;
public Parameters(Map map, MiniYaml my) public Parameters(Map map, MiniYaml my)
{ {
FieldLoader.Load(this, my); FieldLoader.Load(this, my);
Map = map;
TemplatedTerrainInfo = Map.Rules.TerrainInfo as ITemplatedTerrainInfo; var terrainInfo = (ITemplatedTerrainInfo)map.Rules.TerrainInfo;
ForestObstacles = MultiBrush.LoadCollection(map, my.NodeWithKey("ForestObstacles").Value.Value); ForestObstacles = MultiBrush.LoadCollection(map, my.NodeWithKey("ForestObstacles").Value.Value);
UnplayableObstacles = MultiBrush.LoadCollection(map, my.NodeWithKey("UnplayableObstacles").Value.Value); UnplayableObstacles = MultiBrush.LoadCollection(map, my.NodeWithKey("UnplayableObstacles").Value.Value);
CivilianBuildingsObstacles = MultiBrush.LoadCollection(map, my.NodeWithKey("CivilianBuildingsObstacles").Value.Value); CivilianBuildingsObstacles = MultiBrush.LoadCollection(map, my.NodeWithKey("CivilianBuildingsObstacles").Value.Value);
@@ -262,7 +252,7 @@ namespace OpenRA.Mods.Common.Traits
AllowedTerrainResourceCombos = ResourceTypes AllowedTerrainResourceCombos = ResourceTypes
.Values .Values
.SelectMany(resourceTypeInfo => resourceTypeInfo.AllowedTerrainTypes .SelectMany(resourceTypeInfo => resourceTypeInfo.AllowedTerrainTypes
.Select(terrainName => (resourceTypeInfo, TemplatedTerrainInfo.GetTerrainIndex(terrainName)))) .Select(terrainName => (resourceTypeInfo, terrainInfo.GetTerrainIndex(terrainName))))
.ToImmutableHashSet(); .ToImmutableHashSet();
try try
{ {
@@ -290,7 +280,7 @@ namespace OpenRA.Mods.Common.Traits
{ {
return my.NodeWithKey(key).Value.Value return my.NodeWithKey(key).Value.Value
.Split(',', StringSplitOptions.RemoveEmptyEntries) .Split(',', StringSplitOptions.RemoveEmptyEntries)
.Select(TemplatedTerrainInfo.GetTerrainIndex) .Select(terrainInfo.GetTerrainIndex)
.ToImmutableHashSet(); .ToImmutableHashSet();
} }
@@ -317,10 +307,7 @@ namespace OpenRA.Mods.Common.Traits
CliffSegmentTypes = ParseSegmentTypes("CliffSegmentTypes"); CliffSegmentTypes = ParseSegmentTypes("CliffSegmentTypes");
RoadSegmentTypes = ParseSegmentTypes("RoadSegmentTypes"); RoadSegmentTypes = ParseSegmentTypes("RoadSegmentTypes");
SymmetryCount = Symmetry.RotateAndMirrorProjectionCount(Rotations, Mirror); Validate(terrainInfo);
TotalPlayers = Players * SymmetryCount;
Validate();
} }
static object MirrorLoader(MiniYaml my) static object MirrorLoader(MiniYaml my)
@@ -353,7 +340,7 @@ namespace OpenRA.Mods.Common.Traits
}); });
} }
public void Validate() public void Validate(ITemplatedTerrainInfo terrainInfo)
{ {
if (Rotations < 1) if (Rotations < 1)
throw new MapGenerationException("Rotations must be >= 1"); throw new MapGenerationException("Rotations must be >= 1");
@@ -463,12 +450,13 @@ namespace OpenRA.Mods.Common.Traits
if (!ResourceSpawnSeeds.ContainsKey(kv.Key)) if (!ResourceSpawnSeeds.ContainsKey(kv.Key))
throw new MapGenerationException($"ResourceSpawnSeeds does not contain possible resource spawn `{kv.Key}`"); throw new MapGenerationException($"ResourceSpawnSeeds does not contain possible resource spawn `{kv.Key}`");
if (!(TemplatedTerrainInfo.Templates.TryGetValue(LandTile, out var landTemplate) && landTemplate.Contains(0))) if (!(terrainInfo.Templates.TryGetValue(LandTile, out var landTemplate) && landTemplate.Contains(0)))
throw new MapGenerationException("LandTile is not valid"); throw new MapGenerationException("LandTile is not valid");
if (!(TemplatedTerrainInfo.Templates.TryGetValue(LandTile, out var waterTemplate) && waterTemplate.Contains(0))) if (!(terrainInfo.Templates.TryGetValue(LandTile, out var waterTemplate) && waterTemplate.Contains(0)))
throw new MapGenerationException("WaterTile is not valid"); throw new MapGenerationException("WaterTile is not valid");
if (TotalPlayers > 32) var symmetryCount = Symmetry.RotateAndMirrorProjectionCount(Rotations, Mirror);
if (Players * symmetryCount > 32)
throw new MapGenerationException("Total number of players must not exceed 32"); throw new MapGenerationException("Total number of players must not exceed 32");
} }
@@ -512,14 +500,7 @@ namespace OpenRA.Mods.Common.Traits
if (externalCircleRadius <= 0) if (externalCircleRadius <= 0)
throw new MapGenerationException("map is too small for circular shaping"); throw new MapGenerationException("map is too small for circular shaping");
var trivialMirror = var tileset = (ITemplatedTerrainInfo)map.Rules.TerrainInfo;
size.X == size.Y ||
param.Mirror == Symmetry.Mirror.None ||
param.Mirror == Symmetry.Mirror.LeftMatchesRight ||
param.Mirror == Symmetry.Mirror.TopMatchesBottom;
var tileset = param.TemplatedTerrainInfo;
var beachPermittedTemplates = var beachPermittedTemplates =
TilingPath.PermittedSegments.FromType(tileset, param.BeachSegmentTypes); TilingPath.PermittedSegments.FromType(tileset, param.BeachSegmentTypes);
var beachTiles = beachPermittedTemplates.PossibleTiles().ToImmutableHashSet(); var beachTiles = beachPermittedTemplates.PossibleTiles().ToImmutableHashSet();
@@ -1016,7 +997,8 @@ namespace OpenRA.Mods.Common.Traits
if (largest == null) if (largest == null)
throw new MapGenerationException("could not find a playable region"); throw new MapGenerationException("could not find a playable region");
var minimumPlayableSpace = (int)(param.TotalPlayers * Math.PI * param.SpawnBuildSize * param.SpawnBuildSize); var totalPlayers = param.Players * Symmetry.RotateAndMirrorProjectionCount(param.Rotations, param.Mirror);
var minimumPlayableSpace = (int)(totalPlayers * Math.PI * param.SpawnBuildSize * param.SpawnBuildSize);
if (largest.PlayableArea < minimumPlayableSpace) if (largest.PlayableArea < minimumPlayableSpace)
throw new MapGenerationException("playable space is too small"); throw new MapGenerationException("playable space is too small");
@@ -1261,10 +1243,12 @@ namespace OpenRA.Mods.Common.Traits
} }
var zoneableArea = zoneable.Count(v => v); var zoneableArea = zoneable.Count(v => v);
var symmetryCount = Symmetry.RotateAndMirrorProjectionCount(param.Rotations, param.Mirror);
var totalPlayers = param.Players * symmetryCount;
var entityMultiplier = var entityMultiplier =
(long)zoneableArea * param.AreaEntityBonus + (long)zoneableArea * param.AreaEntityBonus +
(long)param.TotalPlayers * param.PlayerCountEntityBonus; (long)totalPlayers * param.PlayerCountEntityBonus;
var perSymmetryEntityMultiplier = entityMultiplier / param.SymmetryCount; var perSymmetryEntityMultiplier = entityMultiplier / symmetryCount;
// Spawn generation // Spawn generation
for (var iteration = 0; iteration < param.Players; iteration++) for (var iteration = 0; iteration < param.Players; iteration++)