Move default tileset parsing to Mods.Common.

This commit is contained in:
Paul Chote
2020-12-30 18:44:09 +00:00
committed by reaperrr
parent 207e09fea9
commit 53db1230ab
19 changed files with 404 additions and 355 deletions

View File

@@ -16,6 +16,7 @@ using System.Linq;
using OpenRA.Effects;
using OpenRA.GameRules;
using OpenRA.Graphics;
using OpenRA.Mods.Common.Terrain;
using OpenRA.Primitives;
using OpenRA.Traits;

View File

@@ -12,6 +12,7 @@
using System.Collections.Generic;
using System.Linq;
using OpenRA.Graphics;
using OpenRA.Mods.Common.Terrain;
using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits

View File

@@ -13,6 +13,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using OpenRA.Graphics;
using OpenRA.Mods.Common.Terrain;
using OpenRA.Primitives;
using OpenRA.Traits;

View File

@@ -13,6 +13,7 @@ using System;
using System.Collections.Generic;
using System.IO;
using OpenRA.Graphics;
using OpenRA.Mods.Common.Terrain;
using OpenRA.Primitives;
using OpenRA.Traits;
@@ -31,19 +32,20 @@ namespace OpenRA.Mods.Common.Traits
failed = true;
};
var tileCache = new Theater((TileSet)terrainInfo, onMissingImage);
var tileCache = new DefaultTileCache((DefaultTerrain)terrainInfo, onMissingImage);
foreach (var t in terrainInfo.Templates)
{
for (var v = 0; v < t.Value.Images.Length; v++)
var templateInfo = (DefaultTerrainTemplateInfo)t.Value;
for (var v = 0; v < templateInfo.Images.Length; v++)
{
if (!missingImages.Contains(t.Value.Images[v]))
if (!missingImages.Contains(templateInfo.Images[v]))
{
for (var i = 0; i < t.Value.TilesCount; i++)
{
if (t.Value[i] == null || tileCache.HasTileSprite(new TerrainTile(t.Key, (byte)i), v))
continue;
onError("\tTemplate `{0}` references frame {1} that does not exist in sprite `{2}`.".F(t.Key, i, t.Value.Images[v]));
onError("\tTemplate `{0}` references frame {1} that does not exist in sprite `{2}`.".F(t.Key, i, templateInfo.Images[v]));
failed = true;
}
}
@@ -60,25 +62,26 @@ namespace OpenRA.Mods.Common.Traits
{
readonly Map map;
readonly Dictionary<string, TerrainSpriteLayer> spriteLayers = new Dictionary<string, TerrainSpriteLayer>();
readonly TileSet terrainInfo;
readonly Theater tileCache;
readonly DefaultTerrain terrainInfo;
readonly DefaultTileCache tileCache;
bool disposed;
public TerrainRenderer(World world)
{
map = world.Map;
terrainInfo = map.Rules.TerrainInfo as TileSet;
terrainInfo = map.Rules.TerrainInfo as DefaultTerrain;
if (terrainInfo == null)
throw new InvalidDataException("TerrainRenderer can only be used with the default TileSet");
throw new InvalidDataException("TerrainRenderer can only be used with the DefaultTerrain parser");
tileCache = new Theater(terrainInfo);
tileCache = new DefaultTileCache(terrainInfo);
}
void IWorldLoaded.WorldLoaded(World world, WorldRenderer wr)
{
foreach (var template in terrainInfo.Templates)
{
var palette = template.Value.Palette ?? TileSet.TerrainPaletteInternalName;
var templateInfo = (DefaultTerrainTemplateInfo)template.Value;
var palette = templateInfo.Palette ?? TileSet.TerrainPaletteInternalName;
spriteLayers.GetOrAdd(palette, pal =>
new TerrainSpriteLayer(world, wr, tileCache.Sheet, BlendMode.Alpha, wr.Palette(palette), world.Type != WorldType.Editor));
}
@@ -95,7 +98,7 @@ namespace OpenRA.Mods.Common.Traits
var tile = map.Tiles[cell];
var palette = TileSet.TerrainPaletteInternalName;
if (terrainInfo.Templates.TryGetValue(tile.Type, out var template))
palette = template.Palette ?? palette;
palette = ((DefaultTerrainTemplateInfo)template).Palette ?? palette;
foreach (var kv in spriteLayers)
kv.Value.Update(cell, palette == kv.Key ? tileCache.TileSprite(tile) : null, false);
@@ -159,8 +162,9 @@ namespace OpenRA.Mods.Common.Traits
return templateRect ?? Rectangle.Empty;
}
IEnumerable<IRenderable> ITiledTerrainRenderer.RenderUIPreview(WorldRenderer wr, TerrainTemplateInfo template, int2 origin, float scale)
IEnumerable<IRenderable> ITiledTerrainRenderer.RenderUIPreview(WorldRenderer wr, TerrainTemplateInfo t, int2 origin, float scale)
{
var template = t as DefaultTerrainTemplateInfo;
if (template == null)
yield break;
@@ -187,8 +191,11 @@ namespace OpenRA.Mods.Common.Traits
}
}
IEnumerable<IRenderable> ITiledTerrainRenderer.RenderPreview(WorldRenderer wr, TerrainTemplateInfo template, WPos origin)
IEnumerable<IRenderable> ITiledTerrainRenderer.RenderPreview(WorldRenderer wr, TerrainTemplateInfo t, WPos origin)
{
if (!(t is DefaultTerrainTemplateInfo template))
yield break;
var i = 0;
for (var y = 0; y < template.Size.Y; y++)
{