From 6d6bbf02a63fe102f2c09d52360a1d68823ac5f2 Mon Sep 17 00:00:00 2001 From: Starkku Date: Fri, 11 Jul 2025 12:43:11 +0300 Subject: [PATCH 1/6] Add custom palette support for TerrainTypes --- src/TSMapEditor/Initialization/Initializer.cs | 9 +----- .../Models/ArtConfig/TerrainArtConfig.cs | 29 +++++++++++++++++++ src/TSMapEditor/Models/TerrainType.cs | 12 ++------ src/TSMapEditor/Rendering/TheaterGraphics.cs | 17 ++++++++--- 4 files changed, 46 insertions(+), 21 deletions(-) create mode 100644 src/TSMapEditor/Models/ArtConfig/TerrainArtConfig.cs diff --git a/src/TSMapEditor/Initialization/Initializer.cs b/src/TSMapEditor/Initialization/Initializer.cs index e440d7844..ecdd6fd51 100644 --- a/src/TSMapEditor/Initialization/Initializer.cs +++ b/src/TSMapEditor/Initialization/Initializer.cs @@ -44,7 +44,7 @@ public Initializer(IMap map) private Dictionary> objectTypeArtInitializers = new Dictionary>() { - { typeof(TerrainType), InitTerrainTypeArt }, + { typeof(TerrainType), InitArtConfigGeneric }, { typeof(SmudgeType), InitSmudgeTypeArt }, { typeof(BuildingType), InitBuildingArtConfig }, { typeof(OverlayType), InitArtConfigGeneric }, @@ -224,13 +224,6 @@ private static void InitTerrainType(INIDefineable obj, IniFile rulesIni, IniSect terrainType.SnowOccupationBits = (TerrainOccupation)section.GetIntValue("SnowOccupationBits", 0); terrainType.TemperateOccupationBits = (TerrainOccupation)section.GetIntValue("TemperateOccupationBits", 0); } - - private static void InitTerrainTypeArt(IMap map, AbstractObject obj, IniFile artIni, IniSection artSection) - { - var terrainType = (TerrainType)obj; - terrainType.Theater = artSection.GetBooleanValue("Theater", terrainType.Theater); - terrainType.Image = artSection.GetStringValue("Image", terrainType.Image); - } private static void InitSmudgeType(INIDefineable obj, IniFile rulesIni, IniSection section) { diff --git a/src/TSMapEditor/Models/ArtConfig/TerrainArtConfig.cs b/src/TSMapEditor/Models/ArtConfig/TerrainArtConfig.cs new file mode 100644 index 000000000..ad9ceec78 --- /dev/null +++ b/src/TSMapEditor/Models/ArtConfig/TerrainArtConfig.cs @@ -0,0 +1,29 @@ +using Rampastring.Tools; + +namespace TSMapEditor.Models.ArtConfig +{ + public class TerrainArtConfig : IArtConfig + { + /// + /// Defined in Art.ini. If set to true, + /// the art for this terrain type is theater-specific; + /// if false, the art is a generic .SHP used for every theater. + /// + public bool Theater { get; set; } + + public string Image { get; set; } + public bool Remapable => false; + + /// + /// Palette override for TerrainTypes in Phobos + /// + public string Palette { get; set; } + + public void ReadFromIniSection(IniSection iniSection) + { + Theater = iniSection.GetBooleanValue(nameof(Theater), Theater); + Image = iniSection.GetStringValue(nameof(Image), Image); + Palette = iniSection.GetStringValue(nameof(Palette), Palette); + } + } +} diff --git a/src/TSMapEditor/Models/TerrainType.cs b/src/TSMapEditor/Models/TerrainType.cs index b9e8643e7..e02969830 100644 --- a/src/TSMapEditor/Models/TerrainType.cs +++ b/src/TSMapEditor/Models/TerrainType.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using TSMapEditor.GameMath; +using TSMapEditor.Models.ArtConfig; using TSMapEditor.Models.Enums; namespace TSMapEditor.Models @@ -12,6 +13,8 @@ public TerrainType(string iniName) : base(iniName) public override RTTIType WhatAmI() => RTTIType.TerrainType; + public TerrainArtConfig ArtConfig { get; } = new TerrainArtConfig(); + public TerrainOccupation TemperateOccupationBits { get; set; } public TerrainOccupation SnowOccupationBits { get; set; } @@ -24,15 +27,6 @@ public TerrainType(string iniName) : base(iniName) public int YDrawFudge { get; set; } - /// - /// Defined in Art.ini. If set to true, - /// the art for this terrain type is theater-specific; - /// if false, the art is a generic .SHP used for every theater. - /// - public bool Theater { get; set; } - - public string Image { get; set; } - /// /// Impassable cell data for automatically placing impassable overlay /// under terrain objects. diff --git a/src/TSMapEditor/Rendering/TheaterGraphics.cs b/src/TSMapEditor/Rendering/TheaterGraphics.cs index 1fc8acaab..ada7f4cba 100644 --- a/src/TSMapEditor/Rendering/TheaterGraphics.cs +++ b/src/TSMapEditor/Rendering/TheaterGraphics.cs @@ -621,17 +621,19 @@ public void ReadTerrainObjectTextures(List terrainTypes) TerrainObjectTextures = new ShapeImage[terrainTypes.Count]; for (int i = 0; i < terrainTypes.Count; i++) { - string shpFileName = terrainTypes[i].Image != null ? terrainTypes[i].Image : terrainTypes[i].ININame; + var terrainType = terrainTypes[i]; + + string shpFileName = terrainType.ArtConfig.Image != null ? terrainType.ArtConfig.Image : terrainType.ININame; string pngFileName = shpFileName + PNG_FILE_EXTENSION; - if (terrainTypes[i].Theater) + if (terrainType.ArtConfig.Theater) shpFileName += Theater.FileExtension; else shpFileName += SHP_FILE_EXTENSION; byte[] data = fileManager.LoadFile(pngFileName); - bool subjectToLighting = !terrainTypes[i].SpawnsTiberium || Constants.TiberiumTreesAffectedByLighting; + bool subjectToLighting = !terrainType.SpawnsTiberium || Constants.TiberiumTreesAffectedByLighting; if (data != null) { @@ -650,8 +652,15 @@ public void ReadTerrainObjectTextures(List terrainTypes) var shpFile = new ShpFile(shpFileName); shpFile.ParseFromBuffer(data); + + var palette = TheaterPalette; + if (terrainType.SpawnsTiberium) + palette = unitPalette; + else if (!string.IsNullOrEmpty(terrainType.ArtConfig.Palette)) + palette = GetPaletteOrDefault(terrainType.ArtConfig.Palette + Theater.FileExtension[1..] + ".pal", palette, true); + TerrainObjectTextures[i] = new ShapeImage(graphicsDevice, shpFile, data, - terrainTypes[i].SpawnsTiberium ? unitPalette : TheaterPalette, subjectToLighting); + palette, subjectToLighting); } } From 06118695176680db59dfbcc433473e62d160b2b9 Mon Sep 17 00:00:00 2001 From: Shush Date: Sat, 12 Jul 2025 23:54:30 +0300 Subject: [PATCH 2/6] Fix bug with double clicking on an existing tunnel node --- .../UI/CursorActions/PlaceTubeCursorAction.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/TSMapEditor/UI/CursorActions/PlaceTubeCursorAction.cs b/src/TSMapEditor/UI/CursorActions/PlaceTubeCursorAction.cs index 737c7567f..790fe7ac2 100644 --- a/src/TSMapEditor/UI/CursorActions/PlaceTubeCursorAction.cs +++ b/src/TSMapEditor/UI/CursorActions/PlaceTubeCursorAction.cs @@ -235,20 +235,23 @@ public override void LeftClick(Point2D cellCoords) if (CursorActionTarget.Map.Tubes.Exists(tb => tb.EntryPoint == cellCoords)) return; } - if (!points.Contains(cellCoords) && !tubeCells.Contains(cellCoords)) { points.Add(cellCoords); RefreshTube(); - TubeRefreshHelper.MapViewRefreshTube(tube, CursorActionTarget.MutationTarget); - lastClickedCell = cellCoords; - lastClickedCellDateTime = DateTime.Now; + TubeRefreshHelper.MapViewRefreshTube(tube, CursorActionTarget.MutationTarget); } else { if (points.Count > 1 && lastClickedCell == cellCoords && DateTime.Now - lastClickedCellDateTime < TimeSpan.FromSeconds(DoubleClickTime)) + { ConfirmTube(); + return; + } } + + lastClickedCell = cellCoords; + lastClickedCellDateTime = DateTime.Now; } } } From 56610c144d699f1477f45bb9f4e849887cd02f02 Mon Sep 17 00:00:00 2001 From: Shush Date: Thu, 17 Jul 2025 09:48:01 +0300 Subject: [PATCH 3/6] Remove unnecessary space --- src/TSMapEditor/UI/CursorActions/PlaceTubeCursorAction.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TSMapEditor/UI/CursorActions/PlaceTubeCursorAction.cs b/src/TSMapEditor/UI/CursorActions/PlaceTubeCursorAction.cs index 790fe7ac2..fa838cc1d 100644 --- a/src/TSMapEditor/UI/CursorActions/PlaceTubeCursorAction.cs +++ b/src/TSMapEditor/UI/CursorActions/PlaceTubeCursorAction.cs @@ -239,7 +239,7 @@ public override void LeftClick(Point2D cellCoords) { points.Add(cellCoords); RefreshTube(); - TubeRefreshHelper.MapViewRefreshTube(tube, CursorActionTarget.MutationTarget); + TubeRefreshHelper.MapViewRefreshTube(tube, CursorActionTarget.MutationTarget); } else { From a71827a2ee333c5b642188071f4ac8f1c916d64e Mon Sep 17 00:00:00 2001 From: Shush Date: Thu, 17 Jul 2025 14:18:52 +0300 Subject: [PATCH 4/6] Fix ordering --- src/TSMapEditor/Models/TerrainType.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TSMapEditor/Models/TerrainType.cs b/src/TSMapEditor/Models/TerrainType.cs index 476450100..ce09d9ccb 100644 --- a/src/TSMapEditor/Models/TerrainType.cs +++ b/src/TSMapEditor/Models/TerrainType.cs @@ -13,8 +13,8 @@ public TerrainType(string iniName) : base(iniName) public override RTTIType WhatAmI() => RTTIType.TerrainType; - public TerrainArtConfig ArtConfig { get; } = new TerrainArtConfig(); public IArtConfig GetArtConfig() => ArtConfig; + public TerrainArtConfig ArtConfig { get; } = new TerrainArtConfig(); public TerrainOccupation TemperateOccupationBits { get; set; } public TerrainOccupation SnowOccupationBits { get; set; } From 8f4bf2871524c416031c15d01869e40fbe61cb81 Mon Sep 17 00:00:00 2001 From: Shush Date: Thu, 17 Jul 2025 14:19:45 +0300 Subject: [PATCH 5/6] Remove unnecessary spaces --- src/TSMapEditor/Models/TerrainType.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TSMapEditor/Models/TerrainType.cs b/src/TSMapEditor/Models/TerrainType.cs index ce09d9ccb..b062cbe87 100644 --- a/src/TSMapEditor/Models/TerrainType.cs +++ b/src/TSMapEditor/Models/TerrainType.cs @@ -14,7 +14,7 @@ public TerrainType(string iniName) : base(iniName) public override RTTIType WhatAmI() => RTTIType.TerrainType; public IArtConfig GetArtConfig() => ArtConfig; - public TerrainArtConfig ArtConfig { get; } = new TerrainArtConfig(); + public TerrainArtConfig ArtConfig { get; } = new TerrainArtConfig(); public TerrainOccupation TemperateOccupationBits { get; set; } public TerrainOccupation SnowOccupationBits { get; set; } From 35fb7cbd1d333d2f4b6e4fbf62ed0d04043d4fc5 Mon Sep 17 00:00:00 2001 From: Rami Pasanen Date: Thu, 17 Jul 2025 14:28:50 +0300 Subject: [PATCH 6/6] Restore removed blank line --- src/TSMapEditor/UI/CursorActions/PlaceTubeCursorAction.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/TSMapEditor/UI/CursorActions/PlaceTubeCursorAction.cs b/src/TSMapEditor/UI/CursorActions/PlaceTubeCursorAction.cs index fa838cc1d..1dcaa9639 100644 --- a/src/TSMapEditor/UI/CursorActions/PlaceTubeCursorAction.cs +++ b/src/TSMapEditor/UI/CursorActions/PlaceTubeCursorAction.cs @@ -235,6 +235,7 @@ public override void LeftClick(Point2D cellCoords) if (CursorActionTarget.Map.Tubes.Exists(tb => tb.EntryPoint == cellCoords)) return; } + if (!points.Contains(cellCoords) && !tubeCells.Contains(cellCoords)) { points.Add(cellCoords);