Change terrain layers to track sequences instead of sprites.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user