Add Alpha support to sequences.
Alpha can specify a single value for the sequence or values for each frame in the sequence. AlphaFade: True can be specified to linearly fade to transparent over the length of the animation.
This commit is contained in:
@@ -149,7 +149,7 @@ namespace OpenRA.Mods.Cnc.Graphics
|
||||
|
||||
var pos = wr.ProjectedPosition((z + new float2(step[2], step[3])).ToInt2());
|
||||
var tintModifiers = s.IgnoreWorldTint ? TintModifiers.IgnoreWorldTint : TintModifiers.None;
|
||||
rs.Add(new SpriteRenderable(s.GetSprite(step[4]), pos, WVec.Zero, 0, pal, 1f, true, tintModifiers).PrepareRender(wr));
|
||||
rs.Add(new SpriteRenderable(s.GetSprite(step[4]), pos, WVec.Zero, 0, pal, 1f, s.GetAlpha(step[4]), float3.Ones, tintModifiers, true).PrepareRender(wr));
|
||||
|
||||
z += new float2(step[0], step[1]);
|
||||
if (rs.Count >= 1000)
|
||||
|
||||
@@ -200,9 +200,8 @@ namespace OpenRA.Mods.Cnc.Traits
|
||||
{
|
||||
readonly List<Actor> minelayers;
|
||||
readonly Minelayer minelayer;
|
||||
readonly Sprite tileOk;
|
||||
readonly Sprite tileUnknown;
|
||||
readonly Sprite tileBlocked;
|
||||
readonly Sprite validTile, unknownTile, blockedTile;
|
||||
readonly float validAlpha, unknownAlpha, blockedAlpha;
|
||||
readonly CPos minefieldStart;
|
||||
readonly bool queued;
|
||||
|
||||
@@ -215,19 +214,43 @@ namespace OpenRA.Mods.Cnc.Traits
|
||||
minelayer = a.Trait<Minelayer>();
|
||||
var tileset = a.World.Map.Tileset.ToLowerInvariant();
|
||||
if (a.World.Map.Rules.Sequences.HasSequence("overlay", "{0}-{1}".F(minelayer.Info.TileValidName, tileset)))
|
||||
tileOk = a.World.Map.Rules.Sequences.GetSequence("overlay", "{0}-{1}".F(minelayer.Info.TileValidName, tileset)).GetSprite(0);
|
||||
{
|
||||
var validSequence = a.World.Map.Rules.Sequences.GetSequence("overlay", "{0}-{1}".F(minelayer.Info.TileValidName, tileset));
|
||||
validTile = validSequence.GetSprite(0);
|
||||
validAlpha = validSequence.GetAlpha(0);
|
||||
}
|
||||
else
|
||||
tileOk = a.World.Map.Rules.Sequences.GetSequence("overlay", minelayer.Info.TileValidName).GetSprite(0);
|
||||
{
|
||||
var validSequence = a.World.Map.Rules.Sequences.GetSequence("overlay", minelayer.Info.TileValidName);
|
||||
validTile = validSequence.GetSprite(0);
|
||||
validAlpha = validSequence.GetAlpha(0);
|
||||
}
|
||||
|
||||
if (a.World.Map.Rules.Sequences.HasSequence("overlay", "{0}-{1}".F(minelayer.Info.TileUnknownName, tileset)))
|
||||
tileUnknown = a.World.Map.Rules.Sequences.GetSequence("overlay", "{0}-{1}".F(minelayer.Info.TileUnknownName, tileset)).GetSprite(0);
|
||||
{
|
||||
var unknownSequence = a.World.Map.Rules.Sequences.GetSequence("overlay", "{0}-{1}".F(minelayer.Info.TileUnknownName, tileset));
|
||||
unknownTile = unknownSequence.GetSprite(0);
|
||||
unknownAlpha = unknownSequence.GetAlpha(0);
|
||||
}
|
||||
else
|
||||
tileUnknown = a.World.Map.Rules.Sequences.GetSequence("overlay", minelayer.Info.TileUnknownName).GetSprite(0);
|
||||
{
|
||||
var unknownSequence = a.World.Map.Rules.Sequences.GetSequence("overlay", minelayer.Info.TileUnknownName);
|
||||
unknownTile = unknownSequence.GetSprite(0);
|
||||
unknownAlpha = unknownSequence.GetAlpha(0);
|
||||
}
|
||||
|
||||
if (a.World.Map.Rules.Sequences.HasSequence("overlay", "{0}-{1}".F(minelayer.Info.TileInvalidName, tileset)))
|
||||
tileBlocked = a.World.Map.Rules.Sequences.GetSequence("overlay", "{0}-{1}".F(minelayer.Info.TileInvalidName, tileset)).GetSprite(0);
|
||||
{
|
||||
var blockedSequence = a.World.Map.Rules.Sequences.GetSequence("overlay", "{0}-{1}".F(minelayer.Info.TileInvalidName, tileset));
|
||||
blockedTile = blockedSequence.GetSprite(0);
|
||||
blockedAlpha = blockedSequence.GetAlpha(0);
|
||||
}
|
||||
else
|
||||
tileBlocked = a.World.Map.Rules.Sequences.GetSequence("overlay", minelayer.Info.TileInvalidName).GetSprite(0);
|
||||
{
|
||||
var blockedSequence = a.World.Map.Rules.Sequences.GetSequence("overlay", minelayer.Info.TileInvalidName);
|
||||
blockedTile = blockedSequence.GetSprite(0);
|
||||
blockedAlpha = blockedSequence.GetAlpha(0);
|
||||
}
|
||||
}
|
||||
|
||||
public void AddMinelayer(Actor a, CPos xy)
|
||||
@@ -276,18 +299,31 @@ namespace OpenRA.Mods.Cnc.Traits
|
||||
var pal = wr.Palette(TileSet.TerrainPaletteInternalName);
|
||||
foreach (var c in minefield)
|
||||
{
|
||||
var tile = tileOk;
|
||||
var tile = validTile;
|
||||
var alpha = validAlpha;
|
||||
if (!world.Map.Contains(c))
|
||||
tile = tileBlocked;
|
||||
{
|
||||
tile = blockedTile;
|
||||
alpha = blockedAlpha;
|
||||
}
|
||||
else if (world.ShroudObscures(c))
|
||||
tile = tileBlocked;
|
||||
{
|
||||
tile = blockedTile;
|
||||
alpha = blockedAlpha;
|
||||
}
|
||||
else if (world.FogObscures(c))
|
||||
tile = tileUnknown;
|
||||
{
|
||||
tile = unknownTile;
|
||||
alpha = unknownAlpha;
|
||||
}
|
||||
else if (!this.minelayer.IsCellAcceptable(minelayer, c)
|
||||
|| !movement.CanEnterCell(c, null, BlockedByActor.Immovable) || (mobile != null && !mobile.CanStayInCell(c)))
|
||||
tile = tileBlocked;
|
||||
{
|
||||
tile = blockedTile;
|
||||
alpha = blockedAlpha;
|
||||
}
|
||||
|
||||
yield return new SpriteRenderable(tile, world.Map.CenterOfCell(c), WVec.Zero, -511, pal, 1f, true, TintModifiers.IgnoreWorldTint);
|
||||
yield return new SpriteRenderable(tile, world.Map.CenterOfCell(c), WVec.Zero, -511, pal, 1f, alpha, float3.Ones, TintModifiers.IgnoreWorldTint, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -143,6 +143,7 @@ namespace OpenRA.Mods.Cnc.Traits
|
||||
readonly char[] footprint;
|
||||
readonly CVec dimensions;
|
||||
readonly Sprite tile;
|
||||
readonly float alpha;
|
||||
readonly SupportPowerManager manager;
|
||||
readonly string order;
|
||||
|
||||
@@ -157,9 +158,11 @@ namespace OpenRA.Mods.Cnc.Traits
|
||||
this.power = power;
|
||||
|
||||
var info = (ChronoshiftPowerInfo)power.Info;
|
||||
var s = world.Map.Rules.Sequences.GetSequence(info.FootprintImage, info.SourceFootprintSequence);
|
||||
footprint = info.Footprint.Where(c => !char.IsWhiteSpace(c)).ToArray();
|
||||
dimensions = info.Dimensions;
|
||||
tile = world.Map.Rules.Sequences.GetSequence(info.FootprintImage, info.SourceFootprintSequence).GetSprite(0);
|
||||
tile = s.GetSprite(0);
|
||||
alpha = s.GetAlpha(0);
|
||||
}
|
||||
|
||||
protected override IEnumerable<Order> OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi)
|
||||
@@ -203,7 +206,7 @@ namespace OpenRA.Mods.Cnc.Traits
|
||||
var tiles = power.CellsMatching(xy, footprint, dimensions);
|
||||
var palette = wr.Palette(((ChronoshiftPowerInfo)power.Info).TargetOverlayPalette);
|
||||
foreach (var t in tiles)
|
||||
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, palette, 1f, true, TintModifiers.IgnoreWorldTint);
|
||||
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, palette, 1f, alpha, float3.Ones, TintModifiers.IgnoreWorldTint, true);
|
||||
}
|
||||
|
||||
protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi)
|
||||
@@ -219,6 +222,7 @@ namespace OpenRA.Mods.Cnc.Traits
|
||||
readonly char[] footprint;
|
||||
readonly CVec dimensions;
|
||||
readonly Sprite validTile, invalidTile, sourceTile;
|
||||
readonly float validAlpha, invalidAlpha, sourceAlpha;
|
||||
readonly SupportPowerManager manager;
|
||||
readonly string order;
|
||||
|
||||
@@ -236,12 +240,25 @@ namespace OpenRA.Mods.Cnc.Traits
|
||||
var sequences = world.Map.Rules.Sequences;
|
||||
var tilesetValid = info.ValidFootprintSequence + "-" + world.Map.Tileset.ToLowerInvariant();
|
||||
if (sequences.HasSequence(info.FootprintImage, tilesetValid))
|
||||
validTile = sequences.GetSequence(info.FootprintImage, tilesetValid).GetSprite(0);
|
||||
{
|
||||
var validSequence = sequences.GetSequence(info.FootprintImage, tilesetValid);
|
||||
validTile = validSequence.GetSprite(0);
|
||||
validAlpha = validSequence.GetAlpha(0);
|
||||
}
|
||||
else
|
||||
validTile = sequences.GetSequence(info.FootprintImage, info.ValidFootprintSequence).GetSprite(0);
|
||||
{
|
||||
var validSequence = sequences.GetSequence(info.FootprintImage, info.ValidFootprintSequence);
|
||||
validTile = validSequence.GetSprite(0);
|
||||
validAlpha = validSequence.GetAlpha(0);
|
||||
}
|
||||
|
||||
invalidTile = sequences.GetSequence(info.FootprintImage, info.InvalidFootprintSequence).GetSprite(0);
|
||||
sourceTile = sequences.GetSequence(info.FootprintImage, info.SourceFootprintSequence).GetSprite(0);
|
||||
var invalidSequence = sequences.GetSequence(info.FootprintImage, info.InvalidFootprintSequence);
|
||||
invalidTile = invalidSequence.GetSprite(0);
|
||||
invalidAlpha = invalidSequence.GetAlpha(0);
|
||||
|
||||
var sourceSequence = sequences.GetSequence(info.FootprintImage, info.SourceFootprintSequence);
|
||||
sourceTile = sourceSequence.GetSprite(0);
|
||||
sourceAlpha = sourceSequence.GetAlpha(0);
|
||||
}
|
||||
|
||||
protected override IEnumerable<Order> OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi)
|
||||
@@ -287,8 +304,10 @@ namespace OpenRA.Mods.Cnc.Traits
|
||||
var delta = xy - sourceLocation;
|
||||
foreach (var t in power.CellsMatching(sourceLocation, footprint, dimensions))
|
||||
{
|
||||
var tile = manager.Self.Owner.Shroud.IsExplored(t + delta) ? validTile : invalidTile;
|
||||
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(t + delta), WVec.Zero, -511, palette, 1f, true, TintModifiers.IgnoreWorldTint);
|
||||
var isValid = manager.Self.Owner.Shroud.IsExplored(t + delta);
|
||||
var tile = isValid ? validTile : invalidTile;
|
||||
var alpha = isValid ? validAlpha : invalidAlpha;
|
||||
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(t + delta), WVec.Zero, -511, palette, 1f, alpha, float3.Ones, TintModifiers.IgnoreWorldTint, true);
|
||||
}
|
||||
|
||||
// Unit previews
|
||||
@@ -300,7 +319,8 @@ namespace OpenRA.Mods.Cnc.Traits
|
||||
var canEnter = manager.Self.Owner.Shroud.IsExplored(targetCell) &&
|
||||
unit.Trait<Chronoshiftable>().CanChronoshiftTo(unit, targetCell);
|
||||
var tile = canEnter ? validTile : invalidTile;
|
||||
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(targetCell), WVec.Zero, -511, palette, 1f, true, TintModifiers.IgnoreWorldTint);
|
||||
var alpha = canEnter ? validAlpha : invalidAlpha;
|
||||
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(targetCell), WVec.Zero, -511, palette, 1f, alpha, float3.Ones, TintModifiers.IgnoreWorldTint, true);
|
||||
}
|
||||
|
||||
var offset = world.Map.CenterOfCell(xy) - world.Map.CenterOfCell(sourceLocation);
|
||||
@@ -330,7 +350,7 @@ namespace OpenRA.Mods.Cnc.Traits
|
||||
|
||||
// Source tiles
|
||||
foreach (var t in power.CellsMatching(sourceLocation, footprint, dimensions))
|
||||
yield return new SpriteRenderable(sourceTile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, palette, 1f, true, TintModifiers.IgnoreWorldTint);
|
||||
yield return new SpriteRenderable(sourceTile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, palette, 1f, sourceAlpha, float3.Ones, TintModifiers.IgnoreWorldTint, true);
|
||||
}
|
||||
|
||||
bool IsValidTarget(CPos xy)
|
||||
|
||||
Reference in New Issue
Block a user