Replace Map.CustomTerrain radar colors with IRadarTerrainLayer.

* TSVeinsRenderer now shows border cells on the radar
* BuildableTerrainLayer now uses the radar colors defined on the individual tiles
* CliffBackImpassabilityLayer no longer overrides the underlying terrain color.
This commit is contained in:
Paul Chote
2021-08-20 18:43:22 +01:00
committed by abcdefg30
parent 72c0c7e38b
commit 7f94d67d39
11 changed files with 278 additions and 58 deletions

View File

@@ -10,6 +10,7 @@
#endregion
using System;
using System.Linq;
using OpenRA.Graphics;
using OpenRA.Traits;
@@ -29,6 +30,7 @@ namespace OpenRA.Mods.Common.Traits
public bool IsInitialized { get; private set; }
readonly World world;
IRadarTerrainLayer[] radarTerrainLayers;
CellLayer<(int, int)> terrainColor;
readonly Shroud shroud;
@@ -50,22 +52,20 @@ namespace OpenRA.Mods.Common.Traits
void UpdateTerrainCell(MPos uv)
{
if (!world.Map.CustomTerrain.Contains(uv))
return;
if (shroud.IsVisible(uv))
UpdateTerrainCellColor(uv);
}
void UpdateTerrainCellColor(MPos uv)
{
terrainColor[uv] = GetColor(world.Map, uv);
terrainColor[uv] = GetColor(world.Map, radarTerrainLayers, uv);
CellTerrainColorChanged?.Invoke(uv);
}
public void WorldLoaded(World w, WorldRenderer wr)
{
radarTerrainLayers = w.WorldActor.TraitsImplementing<IRadarTerrainLayer>().ToArray();
terrainColor = new CellLayer<(int, int)>(w.Map);
w.AddFrameEndTask(_ =>
@@ -75,7 +75,8 @@ namespace OpenRA.Mods.Common.Traits
UpdateTerrainCellColor(uv);
world.Map.Tiles.CellEntryChanged += cell => UpdateTerrainCell(cell.ToMPos(world.Map));
world.Map.CustomTerrain.CellEntryChanged += cell => UpdateTerrainCell(cell.ToMPos(world.Map));
foreach (var rtl in radarTerrainLayers)
rtl.CellEntryChanged += cell => UpdateTerrainCell(cell.ToMPos(world.Map));
IsInitialized = true;
});
@@ -83,14 +84,11 @@ namespace OpenRA.Mods.Common.Traits
public (int Left, int Right) this[MPos uv] => terrainColor[uv];
public static (int Left, int Right) GetColor(Map map, MPos uv)
public static (int Left, int Right) GetColor(Map map, IRadarTerrainLayer[] radarTerrainLayers, MPos uv)
{
var custom = map.CustomTerrain[uv];
if (custom != byte.MaxValue)
{
var c = map.Rules.TerrainInfo.TerrainTypes[custom].Color.ToArgb();
return (c, c);
}
foreach (var rtl in radarTerrainLayers)
if (rtl.TryGetTerrainColorPair(uv, out var c))
return (c.Left.ToArgb(), c.Right.ToArgb());
var tc = map.GetTerrainColorPair(uv);
return (tc.Left.ToArgb(), tc.Right.ToArgb());