From 91a6c869bb9ef511b3e5f0622518ef9aa71f1034 Mon Sep 17 00:00:00 2001 From: Drake53 <49623303+Drake53@users.noreply.github.com> Date: Fri, 26 Sep 2025 22:08:51 +0200 Subject: [PATCH 1/5] Support war3map.w3e v12 --- .../MapEnvironmentFormatVersion.cs | 3 ++ .../Environment/TerrainTile.cs | 29 +++++++++++------- .../Environment/TileFlags.cs | 20 +++++++++++++ .../Binary/Environment/TerrainTile.cs | 30 +++++++++++++++++-- 4 files changed, 69 insertions(+), 13 deletions(-) create mode 100644 src/War3Net.Build.Core/Environment/TileFlags.cs diff --git a/src/War3Net.Build.Core/Environment/MapEnvironmentFormatVersion.cs b/src/War3Net.Build.Core/Environment/MapEnvironmentFormatVersion.cs index 843e538d..b858060d 100644 --- a/src/War3Net.Build.Core/Environment/MapEnvironmentFormatVersion.cs +++ b/src/War3Net.Build.Core/Environment/MapEnvironmentFormatVersion.cs @@ -17,5 +17,8 @@ public enum MapEnvironmentFormatVersion { /// The initial version. v11 = 11, + + /// Introduced in patch 2.0.3. + v12 = 12, } } \ No newline at end of file diff --git a/src/War3Net.Build.Core/Environment/TerrainTile.cs b/src/War3Net.Build.Core/Environment/TerrainTile.cs index 02122c71..5fa642d2 100644 --- a/src/War3Net.Build.Core/Environment/TerrainTile.cs +++ b/src/War3Net.Build.Core/Environment/TerrainTile.cs @@ -21,7 +21,8 @@ public sealed partial class TerrainTile private ushort _heightData; private ushort _waterDataAndEdgeFlag; - private byte _textureDataAndFlags; + private byte _textureData; + private TileFlags _tileFlags; private byte _variationData; private byte _cliffData; @@ -52,32 +53,38 @@ public bool IsEdgeTile public int Texture { - get => _textureDataAndFlags & 0x0F; - set => _textureDataAndFlags = (value >= 0 && value <= 0x0F) ? (byte)(value | (_textureDataAndFlags & 0xF0)) : throw new ArgumentOutOfRangeException(nameof(value)); + get => _textureData; + set => _textureData = (value >= 0 && value < 64) ? (byte)value : throw new ArgumentOutOfRangeException(nameof(value)); + } + + public TileFlags Flags + { + get => _tileFlags; + set => _tileFlags = value; } public bool IsRamp { - get => (_textureDataAndFlags & 0x10) != 0; - set => _textureDataAndFlags = (byte)(value ? _textureDataAndFlags | 0x10 : _textureDataAndFlags & 0xEF); + get => _tileFlags.HasFlag(TileFlags.Ramp); + set => _tileFlags = value ? _tileFlags | TileFlags.Ramp : _tileFlags & ~TileFlags.Ramp; } public bool IsBlighted { - get => (_textureDataAndFlags & 0x20) != 0; - set => _textureDataAndFlags = (byte)(value ? _textureDataAndFlags | 0x20 : _textureDataAndFlags & 0xDF); + get => _tileFlags.HasFlag(TileFlags.Blighted); + set => _tileFlags = value ? _tileFlags | TileFlags.Blighted : _tileFlags & ~TileFlags.Blighted; } public bool IsWater { - get => (_textureDataAndFlags & 0x40) != 0; - set => _textureDataAndFlags = (byte)(value ? _textureDataAndFlags | 0x40 : _textureDataAndFlags & 0xBF); + get => _tileFlags.HasFlag(TileFlags.Water); + set => _tileFlags = value ? _tileFlags | TileFlags.Water : _tileFlags & ~TileFlags.Water; } public bool IsBoundary { - get => (_textureDataAndFlags & 0x80) != 0; - set => _textureDataAndFlags = (byte)(value ? _textureDataAndFlags | 0x80 : _textureDataAndFlags & 0x7F); + get => _tileFlags.HasFlag(TileFlags.Boundary); + set => _tileFlags = value ? _tileFlags | TileFlags.Boundary : _tileFlags & ~TileFlags.Boundary; } public int Variation diff --git a/src/War3Net.Build.Core/Environment/TileFlags.cs b/src/War3Net.Build.Core/Environment/TileFlags.cs new file mode 100644 index 00000000..8c446541 --- /dev/null +++ b/src/War3Net.Build.Core/Environment/TileFlags.cs @@ -0,0 +1,20 @@ +// ------------------------------------------------------------------------------ +// +// Licensed under the MIT license. +// See the LICENSE file in the project root for more information. +// +// ------------------------------------------------------------------------------ + +using System; + +namespace War3Net.Build.Environment +{ + [Flags] + public enum TileFlags : byte + { + Ramp = 1 << 0, + Blighted = 1 << 1, + Water = 1 << 2, + Boundary = 1 << 3, + } +} \ No newline at end of file diff --git a/src/War3Net.Build.Core/Serialization/Binary/Environment/TerrainTile.cs b/src/War3Net.Build.Core/Serialization/Binary/Environment/TerrainTile.cs index 1947242f..959cdfc3 100644 --- a/src/War3Net.Build.Core/Serialization/Binary/Environment/TerrainTile.cs +++ b/src/War3Net.Build.Core/Serialization/Binary/Environment/TerrainTile.cs @@ -20,7 +20,23 @@ internal void ReadFrom(BinaryReader reader, MapEnvironmentFormatVersion formatVe { _heightData = reader.ReadUInt16(); _waterDataAndEdgeFlag = reader.ReadUInt16(); - _textureDataAndFlags = reader.ReadByte(); + + if (formatVersion >= MapEnvironmentFormatVersion.v12) + { + var textureDataAndFlags = reader.ReadByte(); + var remainingFlags = reader.ReadByte(); + + _textureData = (byte)(textureDataAndFlags & 0x3F); + _tileFlags = (TileFlags)(((textureDataAndFlags & 0xC0) >> 6) | ((remainingFlags & 0x03) << 2)); + } + else + { + var textureDataAndFlags = reader.ReadByte(); + + _textureData = (byte)(textureDataAndFlags & 0x0F); + _tileFlags = (TileFlags)((textureDataAndFlags & 0xF0) >> 4); + } + _variationData = reader.ReadByte(); _cliffData = reader.ReadByte(); } @@ -29,7 +45,17 @@ internal void WriteTo(BinaryWriter writer, MapEnvironmentFormatVersion formatVer { writer.Write(_heightData); writer.Write(_waterDataAndEdgeFlag); - writer.Write(_textureDataAndFlags); + + if (formatVersion >= MapEnvironmentFormatVersion.v12) + { + writer.Write((byte)((_textureData & 0x3F) | (((byte)_tileFlags & 0x03) << 6))); + writer.Write((byte)((byte)_tileFlags & 0x0C) >> 2); + } + else + { + writer.Write((byte)((_textureData & 0x0F) | (((byte)_tileFlags & 0x0F) << 4))); + } + writer.Write(_variationData); writer.Write(_cliffData); } From a3f6328ecbd923a7f26205b0b18de8edeed73a28 Mon Sep 17 00:00:00 2001 From: Drake53 <49623303+Drake53@users.noreply.github.com> Date: Sat, 27 Sep 2025 09:24:40 +0200 Subject: [PATCH 2/5] Add files via upload --- .../TestData/Environment/v12.w3e | Bin 0 -> 133209 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/War3Net.TestTools.UnitTesting/TestData/Environment/v12.w3e diff --git a/tests/War3Net.TestTools.UnitTesting/TestData/Environment/v12.w3e b/tests/War3Net.TestTools.UnitTesting/TestData/Environment/v12.w3e new file mode 100644 index 0000000000000000000000000000000000000000..f1a17a8522c60732cd77a6d95525fe1e3447f9c0 GIT binary patch literal 133209 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 Date: Sat, 27 Sep 2025 09:35:51 +0200 Subject: [PATCH 3/5] Fix missing parens causing it to write int32 instead of byte. --- .../Serialization/Binary/Environment/TerrainTile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/War3Net.Build.Core/Serialization/Binary/Environment/TerrainTile.cs b/src/War3Net.Build.Core/Serialization/Binary/Environment/TerrainTile.cs index 959cdfc3..8415da06 100644 --- a/src/War3Net.Build.Core/Serialization/Binary/Environment/TerrainTile.cs +++ b/src/War3Net.Build.Core/Serialization/Binary/Environment/TerrainTile.cs @@ -49,7 +49,7 @@ internal void WriteTo(BinaryWriter writer, MapEnvironmentFormatVersion formatVer if (formatVersion >= MapEnvironmentFormatVersion.v12) { writer.Write((byte)((_textureData & 0x3F) | (((byte)_tileFlags & 0x03) << 6))); - writer.Write((byte)((byte)_tileFlags & 0x0C) >> 2); + writer.Write((byte)(((byte)_tileFlags & 0x0C) >> 2)); } else { From 79a446eac2a78c9f9c68af3e85be7fa0b91ba7a2 Mon Sep 17 00:00:00 2001 From: Drake53 <49623303+Drake53@users.noreply.github.com> Date: Sat, 27 Sep 2025 09:38:30 +0200 Subject: [PATCH 4/5] Add new game build. --- src/War3Net.Build.Core/Resources/GameBuilds.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/War3Net.Build.Core/Resources/GameBuilds.json b/src/War3Net.Build.Core/Resources/GameBuilds.json index bc220435..01e8bc15 100644 --- a/src/War3Net.Build.Core/Resources/GameBuilds.json +++ b/src/War3Net.Build.Core/Resources/GameBuilds.json @@ -102,5 +102,6 @@ { "GameExpansion": 3, "GameReleaseType": "Retail", "ReleaseDate": "2024-12-17", "GamePatch": "v2_0_1", "Version": "2.0.1.22474", "EditorVersion": 6115 }, { "GameExpansion": 3, "GameReleaseType": "Retail", "ReleaseDate": "2025-04-15", "GamePatch": "v2_0_2", "Version": "2.0.2.22761", "EditorVersion": 6115 }, { "GameExpansion": 3, "GameReleaseType": "Retail", "ReleaseDate": "2025-07-17", "GamePatch": "v2_0_3", "Version": "2.0.3.22978", "EditorVersion": 6116 }, - { "GameExpansion": 3, "GameReleaseType": "Retail", "ReleaseDate": "2025-07-22", "GamePatch": "v2_0_3", "Version": "2.0.3.22988", "EditorVersion": 6116 } + { "GameExpansion": 3, "GameReleaseType": "Retail", "ReleaseDate": "2025-07-22", "GamePatch": "v2_0_3", "Version": "2.0.3.22988", "EditorVersion": 6116 }, + { "GameExpansion": 3, "GameReleaseType": "Retail", "ReleaseDate": "2025-09-15", "GamePatch": "v2_0_3", "Version": "2.0.3.23101", "EditorVersion": 6116 } ] \ No newline at end of file From 153c419db6132e782d4b917bbc4258ed66bafae3 Mon Sep 17 00:00:00 2001 From: Drake53 <49623303+Drake53@users.noreply.github.com> Date: Sat, 27 Sep 2025 09:38:49 +0200 Subject: [PATCH 5/5] Fix restore. --- .../War3Net.Drawing.Blp.Benchmarks.csproj | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/perf/War3Net.Drawing.Blp.Benchmarks/War3Net.Drawing.Blp.Benchmarks.csproj b/perf/War3Net.Drawing.Blp.Benchmarks/War3Net.Drawing.Blp.Benchmarks.csproj index 9452fa72..7b616b09 100644 --- a/perf/War3Net.Drawing.Blp.Benchmarks/War3Net.Drawing.Blp.Benchmarks.csproj +++ b/perf/War3Net.Drawing.Blp.Benchmarks/War3Net.Drawing.Blp.Benchmarks.csproj @@ -6,7 +6,11 @@ Exe - + + + + +