check sequence image at RenderSprites level

This commit is contained in:
Matthias Mailänder
2015-05-30 11:40:07 +02:00
parent b7567fa5fa
commit e2e9ce9d7e
16 changed files with 60 additions and 24 deletions

View File

@@ -20,13 +20,20 @@ namespace OpenRA.Mods.Common.Lint
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 races = map.Rules.Actors["world"].Traits.WithInterface<CountryInfo>().Select(c => c.Race);
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("^"))
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));
}
}
}
}
}

View File

@@ -20,8 +20,6 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Renders crates with both water and land variants.")]
class WithCrateBodyInfo : ITraitInfo, Requires<RenderSpritesInfo>, IQuantizeBodyOrientationInfo, IRenderActorPreviewSpritesInfo
{
public readonly string[] Images = { "crate" };
[Desc("Easteregg sequences to use in december.")]
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)
{
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"));
yield return new SpriteActorPreview(anim, WVec.Zero, 0, p, rs.Scale);
}
@@ -46,7 +44,8 @@ namespace OpenRA.Mods.Common.Traits
{
this.self = self;
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.Play("idle");
rs.Add(anim);

View File

@@ -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);
}
}

View File

@@ -62,8 +62,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
layerPreview.GetPalette = () => resource.Palette;
var variant = resource.Variants.FirstOrDefault();
var sequenceProvier = modRules.Sequences[world.TileSet.Id];
var sequence = sequenceProvier.GetSequence("resources", variant);
var sequenceProvider = modRules.Sequences[world.TileSet.Id];
var sequence = sequenceProvider.GetSequence("resources", variant);
var frame = sequence.Frames != null ? sequence.Frames.Last() : resource.MaxDensity - 1;
layerPreview.GetSprite = () => sequence.GetSprite(frame);

View File

@@ -658,6 +658,7 @@
TerrainTypes: Clear, Rough, Road, Tiberium, BlueTiberium, Beach
RenderSprites:
Palette: effect
Image: crate
WithCrateBody:
XmasImages: xcratea, xcrateb, xcratec, xcrated
Selectable:

View File

@@ -81,3 +81,4 @@ FLARE:
Tooltip:
Name: Flare
BodyOrientation:

View File

@@ -151,3 +151,4 @@ EditorWorld:
Inherits: ^BaseWorld
EditorActorLayer:
EditorResourceLayer:

View File

@@ -1422,7 +1422,8 @@ Rules:
Tooltip:
Name: Crate
WithCrateBody:
Images: scrate
RenderSprites:
Image: scrate
E1.Autotarget:
Inherits: E1
Buildable:

View File

@@ -1331,7 +1331,8 @@ Rules:
Tooltip:
Name: Crate
WithCrateBody:
Images: scrate
RenderSprites:
Image: scrate
E1.Autotarget:
Inherits: E1
Buildable:

View File

@@ -655,8 +655,8 @@
TerrainTypes: Clear, Rough, Road, Ore, Beach
RenderSprites:
Palette: effect
Image: scrate
WithCrateBody:
Images: scrate
XmasImages: xcratea, xcrateb, xcratec, xcrated
Selectable:
Selectable: false

View File

@@ -195,3 +195,4 @@ MSLF:
Cost: 250
RequiresPower:
DisabledOverlay:

View File

@@ -152,7 +152,8 @@ MONEYCRATE:
SelectionShares: 1
UseCashTick: true
WithCrateBody:
Images: wcrate
RenderSprites:
Image: wcrate
HEALCRATE:
Inherits: ^Crate

View File

@@ -71,3 +71,4 @@
ExcludePalettes: terrain, effect
ChronoshiftPaletteEffect:
NukePaletteEffect:

View File

@@ -169,3 +169,4 @@ EditorWorld:
Inherits: ^BaseWorld
EditorActorLayer:
EditorResourceLayer:

View File

@@ -29,7 +29,6 @@ DPOD:
PipType: Ammo
PipTypeEmpty: AmmoEmpty
AutoTarget:
RenderSprites:
RenderVoxels:
WithVoxelBody:
@@ -55,7 +54,6 @@ DSHP:
Types: Infantry
MaxWeight: 5
PipCount: 5
RenderSprites:
RenderVoxels:
WithVoxelBody:
Hovers:
@@ -161,7 +159,6 @@ ORCATRAN:
Types: Infantry
MaxWeight: 5
PipCount: 5
RenderSprites:
RenderVoxels:
WithVoxelBody:
Hovers:

View File

@@ -50,7 +50,6 @@ TRUCKB:
Speed: 56
RevealsShroud:
Range: 5c0
RenderSprites:
RenderVoxels:
WithVoxelBody:
@@ -69,7 +68,6 @@ ICBM:
ROT: 5
RevealsShroud:
Range: 7c0
RenderSprites:
RenderVoxels:
WithVoxelBody:
Transforms:
@@ -98,7 +96,6 @@ BUS:
Types: Infantry
MaxWeight: 20
PipCount: 5
RenderSprites:
RenderVoxels:
WithVoxelBody:
@@ -121,7 +118,6 @@ PICK:
Types: Infantry
MaxWeight: 2
PipCount: 5
RenderSprites:
RenderVoxels:
WithVoxelBody:
@@ -144,7 +140,6 @@ CAR:
Types: Infantry
MaxWeight: 4
PipCount: 5
RenderSprites:
RenderVoxels:
WithVoxelBody:
@@ -167,6 +162,5 @@ WINI:
Types: Infantry
MaxWeight: 5
PipCount: 5
RenderSprites:
RenderVoxels:
WithVoxelBody: