check sequence image at RenderSprites level
This commit is contained in:
@@ -20,13 +20,20 @@ namespace OpenRA.Mods.Common.Lint
|
|||||||
public void Run(Action<string> emitError, Action<string> emitWarning, Map map)
|
public void Run(Action<string> emitError, Action<string> emitWarning, Map map)
|
||||||
{
|
{
|
||||||
var sequences = MiniYaml.MergeLiberal(map.SequenceDefinitions, Game.ModData.Manifest.Sequences.Select(s => MiniYaml.FromFile(s)).Aggregate(MiniYaml.MergeLiberal));
|
var sequences = MiniYaml.MergeLiberal(map.SequenceDefinitions, Game.ModData.Manifest.Sequences.Select(s => MiniYaml.FromFile(s)).Aggregate(MiniYaml.MergeLiberal));
|
||||||
|
var races = map.Rules.Actors["world"].Traits.WithInterface<CountryInfo>().Select(c => c.Race);
|
||||||
|
|
||||||
foreach (var actorInfo in map.Rules.Actors)
|
foreach (var actorInfo in map.Rules.Actors)
|
||||||
foreach (var renderInfo in actorInfo.Value.Traits.WithInterface<RenderSimpleInfo>())
|
|
||||||
{
|
{
|
||||||
var image = renderInfo.Image ?? actorInfo.Value.Name;
|
foreach (var renderInfo in actorInfo.Value.Traits.WithInterface<RenderSpritesInfo>())
|
||||||
|
{
|
||||||
|
foreach (var race in races)
|
||||||
|
{
|
||||||
|
var image = renderInfo.GetImage(actorInfo.Value, map.Rules.Sequences[map.Tileset], race);
|
||||||
if (!sequences.Any(s => s.Key == image.ToLowerInvariant()) && !actorInfo.Value.Name.Contains("^"))
|
if (!sequences.Any(s => s.Key == image.ToLowerInvariant()) && !actorInfo.Value.Name.Contains("^"))
|
||||||
emitWarning("Sprite image {0} from actor {1} has no sequence definition.".F(image, actorInfo.Value.Name));
|
emitWarning("Sprite image {0} from actor {1} on tileset {2} using race {3} has no sequence definition."
|
||||||
|
.F(image, actorInfo.Value.Name, map.Tileset, race));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,8 +20,6 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
[Desc("Renders crates with both water and land variants.")]
|
[Desc("Renders crates with both water and land variants.")]
|
||||||
class WithCrateBodyInfo : ITraitInfo, Requires<RenderSpritesInfo>, IQuantizeBodyOrientationInfo, IRenderActorPreviewSpritesInfo
|
class WithCrateBodyInfo : ITraitInfo, Requires<RenderSpritesInfo>, IQuantizeBodyOrientationInfo, IRenderActorPreviewSpritesInfo
|
||||||
{
|
{
|
||||||
public readonly string[] Images = { "crate" };
|
|
||||||
|
|
||||||
[Desc("Easteregg sequences to use in december.")]
|
[Desc("Easteregg sequences to use in december.")]
|
||||||
public readonly string[] XmasImages = { };
|
public readonly string[] XmasImages = { };
|
||||||
|
|
||||||
@@ -29,7 +27,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
public IEnumerable<IActorPreview> RenderPreviewSprites(ActorPreviewInitializer init, RenderSpritesInfo rs, string image, int facings, PaletteReference p)
|
public IEnumerable<IActorPreview> RenderPreviewSprites(ActorPreviewInitializer init, RenderSpritesInfo rs, string image, int facings, PaletteReference p)
|
||||||
{
|
{
|
||||||
var anim = new Animation(init.World, Images.First(), () => 0);
|
var anim = new Animation(init.World, rs.Image, () => 0);
|
||||||
anim.PlayRepeating(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), "idle"));
|
anim.PlayRepeating(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), "idle"));
|
||||||
yield return new SpriteActorPreview(anim, WVec.Zero, 0, p, rs.Scale);
|
yield return new SpriteActorPreview(anim, WVec.Zero, 0, p, rs.Scale);
|
||||||
}
|
}
|
||||||
@@ -46,7 +44,8 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
{
|
{
|
||||||
this.self = self;
|
this.self = self;
|
||||||
var rs = self.Trait<RenderSprites>();
|
var rs = self.Trait<RenderSprites>();
|
||||||
var images = info.XmasImages.Any() && DateTime.Today.Month == 12 ? info.XmasImages : info.Images;
|
var image = rs.GetImage(self);
|
||||||
|
var images = info.XmasImages.Any() && DateTime.Today.Month == 12 ? info.XmasImages : new[] { image };
|
||||||
anim = new Animation(self.World, images.Random(Game.CosmeticRandom));
|
anim = new Animation(self.World, images.Random(Game.CosmeticRandom));
|
||||||
anim.Play("idle");
|
anim.Play("idle");
|
||||||
rs.Add(anim);
|
rs.Add(anim);
|
||||||
|
|||||||
@@ -1119,6 +1119,36 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Images from WithCrateBody was moved into RenderSprites
|
||||||
|
if (engineVersion < 20150530)
|
||||||
|
{
|
||||||
|
if (depth == 0)
|
||||||
|
{
|
||||||
|
var actorTraits = node.Value.Nodes;
|
||||||
|
var withCrateBody = actorTraits.FirstOrDefault(t => t.Key == "WithCrateBody");
|
||||||
|
if (withCrateBody != null)
|
||||||
|
{
|
||||||
|
var withCrateBodyFields = withCrateBody.Value.Nodes;
|
||||||
|
var images = withCrateBodyFields.FirstOrDefault(n => n.Key == "Images");
|
||||||
|
if (images == null)
|
||||||
|
images = new MiniYamlNode("Images", "crate");
|
||||||
|
else
|
||||||
|
withCrateBodyFields.Remove(images);
|
||||||
|
|
||||||
|
images.Key = "Image";
|
||||||
|
|
||||||
|
var renderSprites = actorTraits.FirstOrDefault(t => t.Key == "RenderSprites");
|
||||||
|
if (renderSprites != null)
|
||||||
|
renderSprites.Value.Nodes.Add(images);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("Warning: Adding RenderSprites trait to {0} in {1}".F(node.Key, node.Location.Filename));
|
||||||
|
actorTraits.Add(new MiniYamlNode("RenderSprites", new MiniYaml("", new List<MiniYamlNode> { images })));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1);
|
UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,8 +62,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
layerPreview.GetPalette = () => resource.Palette;
|
layerPreview.GetPalette = () => resource.Palette;
|
||||||
|
|
||||||
var variant = resource.Variants.FirstOrDefault();
|
var variant = resource.Variants.FirstOrDefault();
|
||||||
var sequenceProvier = modRules.Sequences[world.TileSet.Id];
|
var sequenceProvider = modRules.Sequences[world.TileSet.Id];
|
||||||
var sequence = sequenceProvier.GetSequence("resources", variant);
|
var sequence = sequenceProvider.GetSequence("resources", variant);
|
||||||
var frame = sequence.Frames != null ? sequence.Frames.Last() : resource.MaxDensity - 1;
|
var frame = sequence.Frames != null ? sequence.Frames.Last() : resource.MaxDensity - 1;
|
||||||
layerPreview.GetSprite = () => sequence.GetSprite(frame);
|
layerPreview.GetSprite = () => sequence.GetSprite(frame);
|
||||||
|
|
||||||
|
|||||||
@@ -658,6 +658,7 @@
|
|||||||
TerrainTypes: Clear, Rough, Road, Tiberium, BlueTiberium, Beach
|
TerrainTypes: Clear, Rough, Road, Tiberium, BlueTiberium, Beach
|
||||||
RenderSprites:
|
RenderSprites:
|
||||||
Palette: effect
|
Palette: effect
|
||||||
|
Image: crate
|
||||||
WithCrateBody:
|
WithCrateBody:
|
||||||
XmasImages: xcratea, xcrateb, xcratec, xcrated
|
XmasImages: xcratea, xcrateb, xcratec, xcrated
|
||||||
Selectable:
|
Selectable:
|
||||||
|
|||||||
@@ -81,3 +81,4 @@ FLARE:
|
|||||||
Tooltip:
|
Tooltip:
|
||||||
Name: Flare
|
Name: Flare
|
||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
|
|
||||||
|
|||||||
@@ -151,3 +151,4 @@ EditorWorld:
|
|||||||
Inherits: ^BaseWorld
|
Inherits: ^BaseWorld
|
||||||
EditorActorLayer:
|
EditorActorLayer:
|
||||||
EditorResourceLayer:
|
EditorResourceLayer:
|
||||||
|
|
||||||
|
|||||||
@@ -1422,7 +1422,8 @@ Rules:
|
|||||||
Tooltip:
|
Tooltip:
|
||||||
Name: Crate
|
Name: Crate
|
||||||
WithCrateBody:
|
WithCrateBody:
|
||||||
Images: scrate
|
RenderSprites:
|
||||||
|
Image: scrate
|
||||||
E1.Autotarget:
|
E1.Autotarget:
|
||||||
Inherits: E1
|
Inherits: E1
|
||||||
Buildable:
|
Buildable:
|
||||||
|
|||||||
@@ -1331,7 +1331,8 @@ Rules:
|
|||||||
Tooltip:
|
Tooltip:
|
||||||
Name: Crate
|
Name: Crate
|
||||||
WithCrateBody:
|
WithCrateBody:
|
||||||
Images: scrate
|
RenderSprites:
|
||||||
|
Image: scrate
|
||||||
E1.Autotarget:
|
E1.Autotarget:
|
||||||
Inherits: E1
|
Inherits: E1
|
||||||
Buildable:
|
Buildable:
|
||||||
|
|||||||
@@ -655,8 +655,8 @@
|
|||||||
TerrainTypes: Clear, Rough, Road, Ore, Beach
|
TerrainTypes: Clear, Rough, Road, Ore, Beach
|
||||||
RenderSprites:
|
RenderSprites:
|
||||||
Palette: effect
|
Palette: effect
|
||||||
|
Image: scrate
|
||||||
WithCrateBody:
|
WithCrateBody:
|
||||||
Images: scrate
|
|
||||||
XmasImages: xcratea, xcrateb, xcratec, xcrated
|
XmasImages: xcratea, xcrateb, xcratec, xcrated
|
||||||
Selectable:
|
Selectable:
|
||||||
Selectable: false
|
Selectable: false
|
||||||
|
|||||||
@@ -195,3 +195,4 @@ MSLF:
|
|||||||
Cost: 250
|
Cost: 250
|
||||||
RequiresPower:
|
RequiresPower:
|
||||||
DisabledOverlay:
|
DisabledOverlay:
|
||||||
|
|
||||||
|
|||||||
@@ -152,7 +152,8 @@ MONEYCRATE:
|
|||||||
SelectionShares: 1
|
SelectionShares: 1
|
||||||
UseCashTick: true
|
UseCashTick: true
|
||||||
WithCrateBody:
|
WithCrateBody:
|
||||||
Images: wcrate
|
RenderSprites:
|
||||||
|
Image: wcrate
|
||||||
|
|
||||||
HEALCRATE:
|
HEALCRATE:
|
||||||
Inherits: ^Crate
|
Inherits: ^Crate
|
||||||
|
|||||||
@@ -71,3 +71,4 @@
|
|||||||
ExcludePalettes: terrain, effect
|
ExcludePalettes: terrain, effect
|
||||||
ChronoshiftPaletteEffect:
|
ChronoshiftPaletteEffect:
|
||||||
NukePaletteEffect:
|
NukePaletteEffect:
|
||||||
|
|
||||||
|
|||||||
@@ -169,3 +169,4 @@ EditorWorld:
|
|||||||
Inherits: ^BaseWorld
|
Inherits: ^BaseWorld
|
||||||
EditorActorLayer:
|
EditorActorLayer:
|
||||||
EditorResourceLayer:
|
EditorResourceLayer:
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ DPOD:
|
|||||||
PipType: Ammo
|
PipType: Ammo
|
||||||
PipTypeEmpty: AmmoEmpty
|
PipTypeEmpty: AmmoEmpty
|
||||||
AutoTarget:
|
AutoTarget:
|
||||||
RenderSprites:
|
|
||||||
RenderVoxels:
|
RenderVoxels:
|
||||||
WithVoxelBody:
|
WithVoxelBody:
|
||||||
|
|
||||||
@@ -55,7 +54,6 @@ DSHP:
|
|||||||
Types: Infantry
|
Types: Infantry
|
||||||
MaxWeight: 5
|
MaxWeight: 5
|
||||||
PipCount: 5
|
PipCount: 5
|
||||||
RenderSprites:
|
|
||||||
RenderVoxels:
|
RenderVoxels:
|
||||||
WithVoxelBody:
|
WithVoxelBody:
|
||||||
Hovers:
|
Hovers:
|
||||||
@@ -161,7 +159,6 @@ ORCATRAN:
|
|||||||
Types: Infantry
|
Types: Infantry
|
||||||
MaxWeight: 5
|
MaxWeight: 5
|
||||||
PipCount: 5
|
PipCount: 5
|
||||||
RenderSprites:
|
|
||||||
RenderVoxels:
|
RenderVoxels:
|
||||||
WithVoxelBody:
|
WithVoxelBody:
|
||||||
Hovers:
|
Hovers:
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ TRUCKB:
|
|||||||
Speed: 56
|
Speed: 56
|
||||||
RevealsShroud:
|
RevealsShroud:
|
||||||
Range: 5c0
|
Range: 5c0
|
||||||
RenderSprites:
|
|
||||||
RenderVoxels:
|
RenderVoxels:
|
||||||
WithVoxelBody:
|
WithVoxelBody:
|
||||||
|
|
||||||
@@ -69,7 +68,6 @@ ICBM:
|
|||||||
ROT: 5
|
ROT: 5
|
||||||
RevealsShroud:
|
RevealsShroud:
|
||||||
Range: 7c0
|
Range: 7c0
|
||||||
RenderSprites:
|
|
||||||
RenderVoxels:
|
RenderVoxels:
|
||||||
WithVoxelBody:
|
WithVoxelBody:
|
||||||
Transforms:
|
Transforms:
|
||||||
@@ -98,7 +96,6 @@ BUS:
|
|||||||
Types: Infantry
|
Types: Infantry
|
||||||
MaxWeight: 20
|
MaxWeight: 20
|
||||||
PipCount: 5
|
PipCount: 5
|
||||||
RenderSprites:
|
|
||||||
RenderVoxels:
|
RenderVoxels:
|
||||||
WithVoxelBody:
|
WithVoxelBody:
|
||||||
|
|
||||||
@@ -121,7 +118,6 @@ PICK:
|
|||||||
Types: Infantry
|
Types: Infantry
|
||||||
MaxWeight: 2
|
MaxWeight: 2
|
||||||
PipCount: 5
|
PipCount: 5
|
||||||
RenderSprites:
|
|
||||||
RenderVoxels:
|
RenderVoxels:
|
||||||
WithVoxelBody:
|
WithVoxelBody:
|
||||||
|
|
||||||
@@ -144,7 +140,6 @@ CAR:
|
|||||||
Types: Infantry
|
Types: Infantry
|
||||||
MaxWeight: 4
|
MaxWeight: 4
|
||||||
PipCount: 5
|
PipCount: 5
|
||||||
RenderSprites:
|
|
||||||
RenderVoxels:
|
RenderVoxels:
|
||||||
WithVoxelBody:
|
WithVoxelBody:
|
||||||
|
|
||||||
@@ -167,6 +162,5 @@ WINI:
|
|||||||
Types: Infantry
|
Types: Infantry
|
||||||
MaxWeight: 5
|
MaxWeight: 5
|
||||||
PipCount: 5
|
PipCount: 5
|
||||||
RenderSprites:
|
|
||||||
RenderVoxels:
|
RenderVoxels:
|
||||||
WithVoxelBody:
|
WithVoxelBody:
|
||||||
Reference in New Issue
Block a user