Merge pull request #8685 from Mailaender/lint-projectile-sprites

Added projectile sprite testing to the CheckYaml lint rules
This commit is contained in:
reaperrr
2015-07-21 01:56:58 +02:00
8 changed files with 100 additions and 15 deletions

View File

@@ -31,8 +31,8 @@ namespace OpenRA.Mods.Common.Effects
[Desc("Image to display.")]
public readonly string Image = null;
[Desc("Loop this sequence of Image while this projectile is moving."), SequenceReference("Image")]
public readonly string Sequence = "idle";
[Desc("Loop this sequence of Image while this projectile is moving.")]
[SequenceReference("Image")] public readonly string Sequence = "idle";
[Desc("The palette used to draw this projectile.")]
public readonly string Palette = "effect";

View File

@@ -19,13 +19,19 @@ namespace OpenRA.Mods.Common.Effects
public class GravityBombInfo : IProjectileInfo
{
public readonly string Image = null;
[Desc("Sequence to loop while falling.")]
public readonly string Sequence = "idle";
[SequenceReference("Image")] public readonly string Sequence = "idle";
[Desc("Sequence to play when launched. Skipped if null or empty.")]
public readonly string OpenSequence = null;
[SequenceReference("Image")] public readonly string OpenSequence = null;
public readonly string Palette = "effect";
public readonly bool Shadow = false;
public readonly WDist Velocity = WDist.Zero;
[Desc("Value added to velocity every tick.")]
public readonly WDist Acceleration = new WDist(15);

View File

@@ -22,14 +22,20 @@ namespace OpenRA.Mods.Common.Effects
class LaserZapInfo : IProjectileInfo
{
public readonly int BeamWidth = 2;
public readonly int BeamDuration = 10;
public readonly bool UsePlayerColor = false;
[Desc("Laser color in (A,)R,G,B.")]
public readonly Color Color = Color.Red;
[Desc("Impact animation.")]
public readonly string HitAnim = null;
[Desc("Sequence of impact animation to use.")]
public readonly string HitAnimSequence = "idle";
[SequenceReference("HitAnim")] public readonly string HitAnimSequence = "idle";
public readonly string HitAnimPalette = "effect";
public IEffect Create(ProjectileArgs args)

View File

@@ -24,38 +24,54 @@ namespace OpenRA.Mods.Common.Effects
{
public readonly string Image = null;
[SequenceReference("Image")] public readonly string Sequence = "idle";
public readonly string Palette = "effect";
public readonly bool Shadow = false;
[Desc("Projectile speed in WDist / tick")]
public readonly WDist Speed = new WDist(8);
[Desc("Maximum vertical pitch when changing altitude.")]
public readonly WAngle MaximumPitch = WAngle.FromDegrees(30);
[Desc("How many ticks before this missile is armed and can explode.")]
public readonly int Arm = 0;
[Desc("Is the missile blocked by actors with BlocksProjectiles: trait.")]
public readonly bool Blockable = true;
[Desc("Maximum offset at the maximum range")]
public readonly WDist Inaccuracy = WDist.Zero;
[Desc("Probability of locking onto and following target.")]
public readonly int LockOnProbability = 100;
[Desc("In n/256 per tick.")]
public readonly int RateOfTurn = 5;
[Desc("Explode when following the target longer than this many ticks.")]
public readonly int RangeLimit = 0;
[Desc("Trail animation.")]
public readonly string Trail = null;
[Desc("Interval in ticks between each spawned Trail animation.")]
public readonly int TrailInterval = 2;
public readonly string TrailPalette = "effect";
public readonly bool TrailUsePlayerPalette = false;
public readonly int ContrailLength = 0;
public readonly Color ContrailColor = Color.White;
public readonly bool ContrailUsePlayerColor = false;
public readonly int ContrailDelay = 1;
[Desc("Should missile targeting be thrown off by nearby actors with JamsMissiles.")]
public readonly bool Jammable = true;
[Desc("Explodes when leaving the following terrain type, e.g., Water for torpedoes.")]
public readonly string BoundToTerrainType = "";
[Desc("Explodes when inside this proximity radius to target.",
"Note: If this value is lower than the missile speed, this check might",
"not trigger fast enough, causing the missile to fly past the target.")]

View File

@@ -12,6 +12,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using OpenRA.GameRules;
using OpenRA.Mods.Common.Traits;
using OpenRA.Traits;
@@ -89,6 +90,48 @@ namespace OpenRA.Mods.Common.Lint
}
}
}
foreach (var weaponInfo in map.Rules.Weapons)
{
var projectileInfo = weaponInfo.Value.Projectile;
if (projectileInfo == null)
continue;
var fields = projectileInfo.GetType().GetFields();
foreach (var field in fields)
{
if (field.HasAttribute<SequenceReferenceAttribute>())
{
var sequences = LintExts.GetFieldValues(projectileInfo, field, emitError);
foreach (var sequence in sequences)
{
if (string.IsNullOrEmpty(sequence))
continue;
var sequenceReference = field.GetCustomAttributes<SequenceReferenceAttribute>(true).FirstOrDefault();
if (sequenceReference != null && !string.IsNullOrEmpty(sequenceReference.ImageReference))
{
var imageField = fields.FirstOrDefault(f => f.Name == sequenceReference.ImageReference);
if (imageField != null)
{
foreach (var imageOverride in LintExts.GetFieldValues(projectileInfo, imageField, emitError))
{
if (!string.IsNullOrEmpty(imageOverride))
{
var definitions = sequenceDefinitions.FirstOrDefault(n => n.Key == imageOverride.ToLowerInvariant());
if (definitions == null)
emitWarning("Can't find sequence definition for projectile image {0} at weapon {1}.".F(imageOverride, weaponInfo.Key));
else if (!definitions.Value.Nodes.Any(n => n.Key == sequence))
emitWarning("Projectile sprite image {0} from weapon {1} does not define sequence {2} from field {3} of {4}"
.F(imageOverride, weaponInfo.Key, sequence, field.Name, projectileInfo));
}
}
}
}
}
}
}
}
}
}

View File

@@ -77,7 +77,7 @@ namespace OpenRA.Mods.Common.UtilityCommands
}
catch (Exception e)
{
EmitError("{0} failed with exception: {0}".F(customPassType, e));
EmitError("{0} failed with exception: {1}".F(customPassType, e));
}
}
}