Change terrain layers to track sequences instead of sprites.
This commit is contained in:
@@ -66,6 +66,16 @@ namespace OpenRA.Graphics
|
|||||||
dirtyRows.Add(row);
|
dirtyRows.Add(row);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Clear(CPos cell)
|
||||||
|
{
|
||||||
|
Update(cell, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Update(CPos cell, ISpriteSequence sequence, int frame)
|
||||||
|
{
|
||||||
|
Update(cell, sequence.GetSprite(frame));
|
||||||
|
}
|
||||||
|
|
||||||
public void Update(CPos cell, Sprite sprite)
|
public void Update(CPos cell, Sprite sprite)
|
||||||
{
|
{
|
||||||
var xyz = float3.Zero;
|
var xyz = float3.Zero;
|
||||||
|
|||||||
@@ -70,17 +70,18 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
var res = r;
|
var res = r;
|
||||||
var layer = spriteLayers.GetOrAdd(r.Value.Palette, pal =>
|
var layer = spriteLayers.GetOrAdd(r.Value.Palette, pal =>
|
||||||
{
|
{
|
||||||
var first = res.Value.Variants.First().Value.First();
|
var first = res.Value.Variants.First().Value.GetSprite(0);
|
||||||
return new TerrainSpriteLayer(w, wr, first.Sheet, first.BlendMode, pal, false);
|
return new TerrainSpriteLayer(w, wr, first.Sheet, first.BlendMode, pal, false);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Validate that sprites are compatible with this layer
|
// Validate that sprites are compatible with this layer
|
||||||
var sheet = layer.Sheet;
|
var sheet = layer.Sheet;
|
||||||
if (res.Value.Variants.Any(kv => kv.Value.Any(s => s.Sheet != sheet)))
|
var sprites = res.Value.Variants.Values.SelectMany(v => Exts.MakeArray(v.Length, x => v.GetSprite(x)));
|
||||||
|
if (sprites.Any(s => s.Sheet != sheet))
|
||||||
throw new InvalidDataException("Resource sprites span multiple sheets. Try loading their sequences earlier.");
|
throw new InvalidDataException("Resource sprites span multiple sheets. Try loading their sequences earlier.");
|
||||||
|
|
||||||
var blendMode = layer.BlendMode;
|
var blendMode = layer.BlendMode;
|
||||||
if (res.Value.Variants.Any(kv => kv.Value.Any(s => s.BlendMode != blendMode)))
|
if (sprites.Any(s => s.BlendMode != blendMode))
|
||||||
throw new InvalidDataException("Resource sprites specify different blend modes. "
|
throw new InvalidDataException("Resource sprites specify different blend modes. "
|
||||||
+ "Try using different palettes for resource types that use different blend modes.");
|
+ "Try using different palettes for resource types that use different blend modes.");
|
||||||
}
|
}
|
||||||
@@ -151,7 +152,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
// Empty tile
|
// Empty tile
|
||||||
if (type == null)
|
if (type == null)
|
||||||
{
|
{
|
||||||
t.Sprite = null;
|
t.Sequence = null;
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -164,9 +165,8 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
NetWorth += (t.Density + 1) * type.Info.ValuePerUnit;
|
NetWorth += (t.Density + 1) * type.Info.ValuePerUnit;
|
||||||
|
|
||||||
var sprites = type.Variants[t.Variant];
|
t.Sequence = type.Variants[t.Variant];
|
||||||
var frame = int2.Lerp(0, sprites.Length - 1, t.Density, type.Info.MaxDensity);
|
t.Frame = int2.Lerp(0, t.Sequence.Length - 1, t.Density, type.Info.MaxDensity);
|
||||||
t.Sprite = sprites[frame];
|
|
||||||
|
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
@@ -185,11 +185,11 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
foreach (var kv in spriteLayers)
|
foreach (var kv in spriteLayers)
|
||||||
{
|
{
|
||||||
// resource.Type is meaningless (and may be null) if resource.Sprite is null
|
// resource.Type is meaningless (and may be null) if resource.Sequence is null
|
||||||
if (resource.Sprite != null && resource.Type.Palette == kv.Key)
|
if (resource.Sequence != null && resource.Type.Palette == kv.Key)
|
||||||
kv.Value.Update(c, resource.Sprite);
|
kv.Value.Update(c, resource.Sequence, resource.Frame);
|
||||||
else
|
else
|
||||||
kv.Value.Update(c, null);
|
kv.Value.Clear(c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -220,6 +220,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
public ResourceType Type;
|
public ResourceType Type;
|
||||||
public int Density;
|
public int Density;
|
||||||
public string Variant;
|
public string Variant;
|
||||||
public Sprite Sprite;
|
public ISpriteSequence Sequence;
|
||||||
|
public int Frame;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,17 +64,18 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
{
|
{
|
||||||
var layer = spriteLayers.GetOrAdd(r.Value.Palette, pal =>
|
var layer = spriteLayers.GetOrAdd(r.Value.Palette, pal =>
|
||||||
{
|
{
|
||||||
var first = r.Value.Variants.First().Value.First();
|
var first = r.Value.Variants.First().Value.GetSprite(0);
|
||||||
return new TerrainSpriteLayer(w, wr, first.Sheet, first.BlendMode, pal, wr.World.Type != WorldType.Editor);
|
return new TerrainSpriteLayer(w, wr, first.Sheet, first.BlendMode, pal, wr.World.Type != WorldType.Editor);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Validate that sprites are compatible with this layer
|
// Validate that sprites are compatible with this layer
|
||||||
var sheet = layer.Sheet;
|
var sheet = layer.Sheet;
|
||||||
if (r.Value.Variants.Any(kv => kv.Value.Any(s => s.Sheet != sheet)))
|
var sprites = r.Value.Variants.Values.SelectMany(v => Exts.MakeArray(v.Length, x => v.GetSprite(x)));
|
||||||
|
if (sprites.Any(s => s.Sheet != sheet))
|
||||||
throw new InvalidDataException("Resource sprites span multiple sheets. Try loading their sequences earlier.");
|
throw new InvalidDataException("Resource sprites span multiple sheets. Try loading their sequences earlier.");
|
||||||
|
|
||||||
var blendMode = layer.BlendMode;
|
var blendMode = layer.BlendMode;
|
||||||
if (r.Value.Variants.Any(kv => kv.Value.Any(s => s.BlendMode != blendMode)))
|
if (sprites.Any(s => s.BlendMode != blendMode))
|
||||||
throw new InvalidDataException("Resource sprites specify different blend modes. "
|
throw new InvalidDataException("Resource sprites specify different blend modes. "
|
||||||
+ "Try using different palettes for resource types that use different blend modes.");
|
+ "Try using different palettes for resource types that use different blend modes.");
|
||||||
}
|
}
|
||||||
@@ -94,15 +95,15 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void UpdateSpriteLayers(CPos cell, Sprite sprite, PaletteReference palette)
|
protected void UpdateSpriteLayers(CPos cell, ISpriteSequence sequence, int frame, PaletteReference palette)
|
||||||
{
|
{
|
||||||
foreach (var kv in spriteLayers)
|
foreach (var kv in spriteLayers)
|
||||||
{
|
{
|
||||||
// resource.Type is meaningless (and may be null) if resource.Sprite is null
|
// resource.Type is meaningless (and may be null) if resource.Sequence is null
|
||||||
if (sprite != null && palette == kv.Key)
|
if (sequence != null && palette == kv.Key)
|
||||||
kv.Value.Update(cell, sprite);
|
kv.Value.Update(cell, sequence, frame);
|
||||||
else
|
else
|
||||||
kv.Value.Update(cell, null);
|
kv.Value.Clear(cell);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,10 +163,10 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
var maxDensity = type.Info.MaxDensity;
|
var maxDensity = type.Info.MaxDensity;
|
||||||
var frame = int2.Lerp(0, sprites.Length - 1, density, maxDensity);
|
var frame = int2.Lerp(0, sprites.Length - 1, density, maxDensity);
|
||||||
|
|
||||||
UpdateSpriteLayers(cell, sprites[frame], type.Palette);
|
UpdateSpriteLayers(cell, sprites, frame, type.Palette);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
UpdateSpriteLayers(cell, null, null);
|
UpdateSpriteLayers(cell, null, 0, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool disposed;
|
bool disposed;
|
||||||
|
|||||||
@@ -86,17 +86,16 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
{
|
{
|
||||||
public readonly ResourceTypeInfo Info;
|
public readonly ResourceTypeInfo Info;
|
||||||
public PaletteReference Palette { get; private set; }
|
public PaletteReference Palette { get; private set; }
|
||||||
public readonly Dictionary<string, Sprite[]> Variants;
|
public readonly Dictionary<string, ISpriteSequence> Variants;
|
||||||
|
|
||||||
public ResourceType(ResourceTypeInfo info, World world)
|
public ResourceType(ResourceTypeInfo info, World world)
|
||||||
{
|
{
|
||||||
Info = info;
|
Info = info;
|
||||||
Variants = new Dictionary<string, Sprite[]>();
|
Variants = new Dictionary<string, ISpriteSequence>();
|
||||||
foreach (var v in info.Sequences)
|
foreach (var v in info.Sequences)
|
||||||
{
|
{
|
||||||
var seq = world.Map.Rules.Sequences.GetSequence(Info.Image, v);
|
var seq = world.Map.Rules.Sequences.GetSequence(Info.Image, v);
|
||||||
var sprites = Exts.MakeArray(seq.Length, x => seq.GetSprite(x));
|
Variants.Add(v, seq);
|
||||||
Variants.Add(v, sprites);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -82,13 +82,13 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
{
|
{
|
||||||
public string Type;
|
public string Type;
|
||||||
public int Depth;
|
public int Depth;
|
||||||
public Sprite Sprite;
|
public ISpriteSequence Sequence;
|
||||||
}
|
}
|
||||||
|
|
||||||
public readonly SmudgeLayerInfo Info;
|
public readonly SmudgeLayerInfo Info;
|
||||||
readonly Dictionary<CPos, Smudge> tiles = new Dictionary<CPos, Smudge>();
|
readonly Dictionary<CPos, Smudge> tiles = new Dictionary<CPos, Smudge>();
|
||||||
readonly Dictionary<CPos, Smudge> dirty = new Dictionary<CPos, Smudge>();
|
readonly Dictionary<CPos, Smudge> dirty = new Dictionary<CPos, Smudge>();
|
||||||
readonly Dictionary<string, Sprite[]> smudges = new Dictionary<string, Sprite[]>();
|
readonly Dictionary<string, ISpriteSequence> smudges = new Dictionary<string, ISpriteSequence>();
|
||||||
readonly World world;
|
readonly World world;
|
||||||
|
|
||||||
TerrainSpriteLayer render;
|
TerrainSpriteLayer render;
|
||||||
@@ -102,22 +102,19 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
var sequenceProvider = world.Map.Rules.Sequences;
|
var sequenceProvider = world.Map.Rules.Sequences;
|
||||||
var types = sequenceProvider.Sequences(Info.Sequence);
|
var types = sequenceProvider.Sequences(Info.Sequence);
|
||||||
foreach (var t in types)
|
foreach (var t in types)
|
||||||
{
|
smudges.Add(t, sequenceProvider.GetSequence(Info.Sequence, t));
|
||||||
var seq = sequenceProvider.GetSequence(Info.Sequence, t);
|
|
||||||
var sprites = Exts.MakeArray(seq.Length, x => seq.GetSprite(x));
|
|
||||||
smudges.Add(t, sprites);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WorldLoaded(World w, WorldRenderer wr)
|
public void WorldLoaded(World w, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
var first = smudges.First().Value.First();
|
var sprites = smudges.Values.SelectMany(v => Exts.MakeArray(v.Length, x => v.GetSprite(x))).ToList();
|
||||||
var sheet = first.Sheet;
|
var sheet = sprites[0].Sheet;
|
||||||
if (smudges.Values.Any(sprites => sprites.Any(s => s.Sheet != sheet)))
|
var blendMode = sprites[0].BlendMode;
|
||||||
|
|
||||||
|
if (sprites.Any(s => s.Sheet != sheet))
|
||||||
throw new InvalidDataException("Resource sprites span multiple sheets. Try loading their sequences earlier.");
|
throw new InvalidDataException("Resource sprites span multiple sheets. Try loading their sequences earlier.");
|
||||||
|
|
||||||
var blendMode = first.BlendMode;
|
if (sprites.Any(s => s.BlendMode != blendMode))
|
||||||
if (smudges.Values.Any(sprites => sprites.Any(s => s.BlendMode != blendMode)))
|
|
||||||
throw new InvalidDataException("Smudges specify different blend modes. "
|
throw new InvalidDataException("Smudges specify different blend modes. "
|
||||||
+ "Try using different smudge types for smudges that use different blend modes.");
|
+ "Try using different smudge types for smudges that use different blend modes.");
|
||||||
|
|
||||||
@@ -130,15 +127,16 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
if (!smudges.ContainsKey(s.Type))
|
if (!smudges.ContainsKey(s.Type))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
var seq = smudges[s.Type];
|
||||||
var smudge = new Smudge
|
var smudge = new Smudge
|
||||||
{
|
{
|
||||||
Type = s.Type,
|
Type = s.Type,
|
||||||
Depth = s.Depth,
|
Depth = s.Depth,
|
||||||
Sprite = smudges[s.Type][s.Depth]
|
Sequence = seq
|
||||||
};
|
};
|
||||||
|
|
||||||
tiles.Add(kv.Key, smudge);
|
tiles.Add(kv.Key, smudge);
|
||||||
render.Update(kv.Key, smudge.Sprite);
|
render.Update(kv.Key, seq, s.Depth);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -150,24 +148,21 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
if (Game.CosmeticRandom.Next(0, 100) <= Info.SmokePercentage)
|
if (Game.CosmeticRandom.Next(0, 100) <= Info.SmokePercentage)
|
||||||
world.AddFrameEndTask(w => w.Add(new SpriteEffect(world.Map.CenterOfCell(loc), w, Info.SmokeType, Info.SmokeSequence, Info.SmokePalette)));
|
world.AddFrameEndTask(w => w.Add(new SpriteEffect(world.Map.CenterOfCell(loc), w, Info.SmokeType, Info.SmokeSequence, Info.SmokePalette)));
|
||||||
|
|
||||||
// A null Sprite indicates a deleted smudge.
|
// A null Sequence indicates a deleted smudge.
|
||||||
if ((!dirty.ContainsKey(loc) || dirty[loc].Sprite == null) && !tiles.ContainsKey(loc))
|
if ((!dirty.ContainsKey(loc) || dirty[loc].Sequence == null) && !tiles.ContainsKey(loc))
|
||||||
{
|
{
|
||||||
// No smudge; create a new one
|
// No smudge; create a new one
|
||||||
var st = smudges.Keys.Random(Game.CosmeticRandom);
|
var st = smudges.Keys.Random(Game.CosmeticRandom);
|
||||||
dirty[loc] = new Smudge { Type = st, Depth = 0, Sprite = smudges[st][0] };
|
dirty[loc] = new Smudge { Type = st, Depth = 0, Sequence = smudges[st] };
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Existing smudge; make it deeper
|
// Existing smudge; make it deeper
|
||||||
// A null Sprite indicates a deleted smudge.
|
// A null Sequence indicates a deleted smudge.
|
||||||
var tile = dirty.ContainsKey(loc) && dirty[loc].Sprite != null ? dirty[loc] : tiles[loc];
|
var tile = dirty.ContainsKey(loc) && dirty[loc].Sequence != null ? dirty[loc] : tiles[loc];
|
||||||
var maxDepth = smudges[tile.Type].Length;
|
var maxDepth = smudges[tile.Type].Length;
|
||||||
if (tile.Depth < maxDepth - 1)
|
if (tile.Depth < maxDepth - 1)
|
||||||
{
|
|
||||||
tile.Depth++;
|
tile.Depth++;
|
||||||
tile.Sprite = smudges[tile.Type][tile.Depth];
|
|
||||||
}
|
|
||||||
|
|
||||||
dirty[loc] = tile;
|
dirty[loc] = tile;
|
||||||
}
|
}
|
||||||
@@ -180,8 +175,8 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
var tile = dirty.ContainsKey(loc) ? dirty[loc] : default(Smudge);
|
var tile = dirty.ContainsKey(loc) ? dirty[loc] : default(Smudge);
|
||||||
|
|
||||||
// Setting Sprite to null to indicate a deleted smudge.
|
// Setting Sequence to null to indicate a deleted smudge.
|
||||||
tile.Sprite = null;
|
tile.Sequence = null;
|
||||||
dirty[loc] = tile;
|
dirty[loc] = tile;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,12 +187,18 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
{
|
{
|
||||||
if (!self.World.FogObscures(kv.Key))
|
if (!self.World.FogObscures(kv.Key))
|
||||||
{
|
{
|
||||||
// A null Sprite indicates a deleted smudge.
|
// A null Sequence
|
||||||
if (kv.Value.Sprite == null)
|
if (kv.Value.Sequence == null)
|
||||||
|
{
|
||||||
tiles.Remove(kv.Key);
|
tiles.Remove(kv.Key);
|
||||||
|
render.Clear(kv.Key);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
tiles[kv.Key] = kv.Value;
|
{
|
||||||
render.Update(kv.Key, kv.Value.Sprite);
|
var smudge = kv.Value;
|
||||||
|
tiles[kv.Key] = smudge;
|
||||||
|
render.Update(kv.Key, smudge.Sequence, smudge.Depth);
|
||||||
|
}
|
||||||
|
|
||||||
remove.Add(kv.Key);
|
remove.Add(kv.Key);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ namespace OpenRA.Mods.D2k.Traits
|
|||||||
public class BuildableTerrainLayer : IRenderOverlay, IWorldLoaded, ITickRender, INotifyActorDisposing
|
public class BuildableTerrainLayer : IRenderOverlay, IWorldLoaded, ITickRender, INotifyActorDisposing
|
||||||
{
|
{
|
||||||
readonly BuildableTerrainLayerInfo info;
|
readonly BuildableTerrainLayerInfo info;
|
||||||
readonly Dictionary<CPos, Sprite> dirty = new Dictionary<CPos, Sprite>();
|
readonly Dictionary<CPos, TerrainTile?> dirty = new Dictionary<CPos, TerrainTile?>();
|
||||||
readonly Map map;
|
readonly Map map;
|
||||||
readonly CellLayer<int> strength;
|
readonly CellLayer<int> strength;
|
||||||
|
|
||||||
@@ -61,10 +61,7 @@ namespace OpenRA.Mods.D2k.Traits
|
|||||||
|
|
||||||
map.CustomTerrain[cell] = map.Rules.TileSet.GetTerrainIndex(tile);
|
map.CustomTerrain[cell] = map.Rules.TileSet.GetTerrainIndex(tile);
|
||||||
strength[cell] = info.MaxStrength;
|
strength[cell] = info.MaxStrength;
|
||||||
|
dirty[cell] = tile;
|
||||||
// Terrain tiles define their origin at the topleft
|
|
||||||
var s = theater.TileSprite(tile);
|
|
||||||
dirty[cell] = new Sprite(s.Sheet, s.Bounds, s.ZRamp, float2.Zero, s.Channel, s.BlendMode);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void HitTile(CPos cell, int damage)
|
public void HitTile(CPos cell, int damage)
|
||||||
@@ -94,7 +91,17 @@ namespace OpenRA.Mods.D2k.Traits
|
|||||||
{
|
{
|
||||||
if (!self.World.FogObscures(kv.Key))
|
if (!self.World.FogObscures(kv.Key))
|
||||||
{
|
{
|
||||||
render.Update(kv.Key, kv.Value);
|
var tile = kv.Value;
|
||||||
|
if (tile.HasValue)
|
||||||
|
{
|
||||||
|
// Terrain tiles define their origin at the topleft
|
||||||
|
var s = theater.TileSprite(tile.Value);
|
||||||
|
var ss = new Sprite(s.Sheet, s.Bounds, s.ZRamp, float2.Zero, s.Channel, s.BlendMode);
|
||||||
|
render.Update(kv.Key, ss);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
render.Clear(kv.Key);
|
||||||
|
|
||||||
remove.Add(kv.Key);
|
remove.Add(kv.Key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ namespace OpenRA.Mods.D2k.Traits
|
|||||||
// Empty tile
|
// Empty tile
|
||||||
if (t.Type == null)
|
if (t.Type == null)
|
||||||
{
|
{
|
||||||
t.Sprite = null;
|
t.Sequence = null;
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,12 +51,16 @@ namespace OpenRA.Mods.D2k.Traits
|
|||||||
{
|
{
|
||||||
var sprites = D2kResourceRenderer.Variants[t.Variant];
|
var sprites = D2kResourceRenderer.Variants[t.Variant];
|
||||||
var frame = t.Density > t.Type.Info.MaxDensity / 2 ? 1 : 0;
|
var frame = t.Density > t.Type.Info.MaxDensity / 2 ? 1 : 0;
|
||||||
t.Sprite = t.Type.Variants.First().Value[sprites[frame]];
|
t.Sequence = t.Type.Variants.First().Value;
|
||||||
|
t.Frame = sprites[frame];
|
||||||
}
|
}
|
||||||
else if (D2kResourceRenderer.SpriteMap.TryGetValue(clear, out index))
|
else if (D2kResourceRenderer.SpriteMap.TryGetValue(clear, out index))
|
||||||
t.Sprite = t.Type.Variants.First().Value[index];
|
{
|
||||||
|
t.Sequence = t.Type.Variants.First().Value;
|
||||||
|
t.Frame = index;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
t.Sprite = null;
|
t.Sequence = null;
|
||||||
|
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -173,17 +173,17 @@ namespace OpenRA.Mods.D2k.Traits
|
|||||||
var sprites = Variants[content.Variant];
|
var sprites = Variants[content.Variant];
|
||||||
var frame = density > ResourceLayer.GetMaxResourceDensity(cell) / 2 ? 1 : 0;
|
var frame = density > ResourceLayer.GetMaxResourceDensity(cell) / 2 ? 1 : 0;
|
||||||
|
|
||||||
UpdateSpriteLayers(cell, renderType.Variants.First().Value[sprites[frame]], renderType.Palette);
|
UpdateSpriteLayers(cell, renderType.Variants.First().Value, sprites[frame], renderType.Palette);
|
||||||
}
|
}
|
||||||
else if (SpriteMap.TryGetValue(clear, out index))
|
else if (SpriteMap.TryGetValue(clear, out index))
|
||||||
{
|
{
|
||||||
UpdateSpriteLayers(cell, renderType.Variants.First().Value[index], renderType.Palette);
|
UpdateSpriteLayers(cell, renderType.Variants.First().Value, index, renderType.Palette);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
throw new InvalidOperationException("SpriteMap does not contain an index for ClearSides type '{0}'".F(clear));
|
throw new InvalidOperationException("SpriteMap does not contain an index for ClearSides type '{0}'".F(clear));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
UpdateSpriteLayers(cell, null, null);
|
UpdateSpriteLayers(cell, null, 0, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override string ChooseRandomVariant(ResourceType t)
|
protected override string ChooseRandomVariant(ResourceType t)
|
||||||
|
|||||||
Reference in New Issue
Block a user