From 2a0e787ae7d5d5502879d9c2c037bbcbe89486d0 Mon Sep 17 00:00:00 2001 From: Ashley Newson Date: Sat, 24 May 2025 22:22:26 +0100 Subject: [PATCH] Check for and fix non-unit MultiBrush segment steps TilingPath's algorithms are designed on the assumption that MultiBrush segments use unit steps in their point sequences. Non-unit sequences can result in incorrect or suboptimal tilings. This change ensures point sequences are validated for unit steps, and fixes a non-compliant cliff tile across all tilesets. --- OpenRA.Mods.Common/MapGenerator/MultiBrush.cs | 10 ++++++++++ mods/cnc/tilesets/desert.yaml | 2 +- mods/cnc/tilesets/snow.yaml | 2 +- mods/cnc/tilesets/temperat.yaml | 2 +- mods/cnc/tilesets/winter.yaml | 2 +- mods/ra/tilesets/desert.yaml | 2 +- mods/ra/tilesets/snow.yaml | 2 +- mods/ra/tilesets/temperat.yaml | 2 +- 8 files changed, 17 insertions(+), 7 deletions(-) diff --git a/OpenRA.Mods.Common/MapGenerator/MultiBrush.cs b/OpenRA.Mods.Common/MapGenerator/MultiBrush.cs index c618e96bef..933cfeb933 100644 --- a/OpenRA.Mods.Common/MapGenerator/MultiBrush.cs +++ b/OpenRA.Mods.Common/MapGenerator/MultiBrush.cs @@ -189,9 +189,19 @@ namespace OpenRA.Mods.Common.MapGenerator .Split(',', StringSplitOptions.RemoveEmptyEntries); if (parts.Length % 2 != 0) FieldLoader.InvalidValueAction(value, typeof(int2[]), "Points"); + var points = new CVec[parts.Length / 2]; for (var i = 0; i < points.Length; i++) + { points[i] = new CVec(Exts.ParseInt32Invariant(parts[2 * i]), Exts.ParseInt32Invariant(parts[2 * i + 1])); + if (i > 0) + { + var step = points[i] - points[i - 1]; + if (Math.Abs(step.X) + Math.Abs(step.Y) != 1) + throw new YamlException($"Points sequence {value} has non-unit steps"); + } + } + Points = [.. points]; } } diff --git a/mods/cnc/tilesets/desert.yaml b/mods/cnc/tilesets/desert.yaml index 82833b19f1..8da81a8825 100644 --- a/mods/cnc/tilesets/desert.yaml +++ b/mods/cnc/tilesets/desert.yaml @@ -2232,7 +2232,7 @@ MultiBrushCollections: Start: Cliff.L Inner: Cliff End: Cliff.L - Points: 2,1, 1,1, 0,2 + Points: 2,1, 1,1, 1,2, 0,2 MultiBrush@19: Template: 19 Segment: diff --git a/mods/cnc/tilesets/snow.yaml b/mods/cnc/tilesets/snow.yaml index f05a9bf509..d8f297a282 100644 --- a/mods/cnc/tilesets/snow.yaml +++ b/mods/cnc/tilesets/snow.yaml @@ -1879,7 +1879,7 @@ MultiBrushCollections: Start: Cliff.L Inner: Cliff End: Cliff.L - Points: 2,1, 1,1, 0,2 + Points: 2,1, 1,1, 1,2, 0,2 MultiBrush@19: Template: 19 Segment: diff --git a/mods/cnc/tilesets/temperat.yaml b/mods/cnc/tilesets/temperat.yaml index 8a01292f86..13502ca491 100644 --- a/mods/cnc/tilesets/temperat.yaml +++ b/mods/cnc/tilesets/temperat.yaml @@ -1880,7 +1880,7 @@ MultiBrushCollections: Start: Cliff.L Inner: Cliff End: Cliff.L - Points: 2,1, 1,1, 0,2 + Points: 2,1, 1,1, 1,2, 0,2 MultiBrush@19: Template: 19 Segment: diff --git a/mods/cnc/tilesets/winter.yaml b/mods/cnc/tilesets/winter.yaml index ecc28e4e47..6cc7dacfa4 100644 --- a/mods/cnc/tilesets/winter.yaml +++ b/mods/cnc/tilesets/winter.yaml @@ -1915,7 +1915,7 @@ MultiBrushCollections: Start: Cliff.L Inner: Cliff End: Cliff.L - Points: 2,1, 1,1, 0,2 + Points: 2,1, 1,1, 1,2, 0,2 MultiBrush@19: Template: 19 Segment: diff --git a/mods/ra/tilesets/desert.yaml b/mods/ra/tilesets/desert.yaml index ad1ffbc275..2605bd089b 100644 --- a/mods/ra/tilesets/desert.yaml +++ b/mods/ra/tilesets/desert.yaml @@ -3475,7 +3475,7 @@ MultiBrushCollections: Start: Cliff.L Inner: Cliff End: Cliff.L - Points: 2,1, 1,1, 0,2 + Points: 2,1, 1,1, 1,2, 0,2 MultiBrush@186: Template: 186 Segment: diff --git a/mods/ra/tilesets/snow.yaml b/mods/ra/tilesets/snow.yaml index ed1a496195..b9361fc490 100644 --- a/mods/ra/tilesets/snow.yaml +++ b/mods/ra/tilesets/snow.yaml @@ -4015,7 +4015,7 @@ MultiBrushCollections: Start: Cliff.L Inner: Cliff End: Cliff.L - Points: 2,1, 1,1, 0,2 + Points: 2,1, 1,1, 1,2, 0,2 MultiBrush@141: Template: 141 Segment: diff --git a/mods/ra/tilesets/temperat.yaml b/mods/ra/tilesets/temperat.yaml index 81ccba9e59..775cf14043 100644 --- a/mods/ra/tilesets/temperat.yaml +++ b/mods/ra/tilesets/temperat.yaml @@ -4475,7 +4475,7 @@ MultiBrushCollections: Start: Cliff.L Inner: Cliff End: Cliff.L - Points: 2,1, 1,1, 0,2 + Points: 2,1, 1,1, 1,2, 0,2 MultiBrush@141: Template: 141 Segment: