Change terrain layers to track sequences instead of sprites.

This commit is contained in:
Paul Chote
2020-06-21 13:43:24 +01:00
committed by abcdefg30
parent 38b3fbbdbe
commit fdb66c769c
8 changed files with 90 additions and 67 deletions

View File

@@ -70,17 +70,18 @@ namespace OpenRA.Mods.Common.Traits
var res = r;
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);
});
// Validate that sprites are compatible with this layer
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.");
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. "
+ "Try using different palettes for resource types that use different blend modes.");
}
@@ -151,7 +152,7 @@ namespace OpenRA.Mods.Common.Traits
// Empty tile
if (type == null)
{
t.Sprite = null;
t.Sequence = null;
return t;
}
@@ -164,9 +165,8 @@ namespace OpenRA.Mods.Common.Traits
NetWorth += (t.Density + 1) * type.Info.ValuePerUnit;
var sprites = type.Variants[t.Variant];
var frame = int2.Lerp(0, sprites.Length - 1, t.Density, type.Info.MaxDensity);
t.Sprite = sprites[frame];
t.Sequence = type.Variants[t.Variant];
t.Frame = int2.Lerp(0, t.Sequence.Length - 1, t.Density, type.Info.MaxDensity);
return t;
}
@@ -185,11 +185,11 @@ namespace OpenRA.Mods.Common.Traits
foreach (var kv in spriteLayers)
{
// resource.Type is meaningless (and may be null) if resource.Sprite is null
if (resource.Sprite != null && resource.Type.Palette == kv.Key)
kv.Value.Update(c, resource.Sprite);
// resource.Type is meaningless (and may be null) if resource.Sequence is null
if (resource.Sequence != null && resource.Type.Palette == kv.Key)
kv.Value.Update(c, resource.Sequence, resource.Frame);
else
kv.Value.Update(c, null);
kv.Value.Clear(c);
}
}
}
@@ -220,6 +220,7 @@ namespace OpenRA.Mods.Common.Traits
public ResourceType Type;
public int Density;
public string Variant;
public Sprite Sprite;
public ISpriteSequence Sequence;
public int Frame;
}
}