lint check player palette reference

and tell which actor is affected when a problem is found
This commit is contained in:
Matthias Mailänder
2015-09-19 20:25:46 +02:00
parent 3e0330ab8b
commit defba7aece
22 changed files with 110 additions and 40 deletions

View File

@@ -45,9 +45,28 @@ namespace OpenRA.Traits
public sealed class UpgradeUsedReferenceAttribute : Attribute { }
[AttributeUsage(AttributeTargets.Field)]
public sealed class PaletteDefinitionAttribute : Attribute { }
// TODO: differentiate player palettes
[AttributeUsage(AttributeTargets.Field)]
public sealed class PaletteReferenceAttribute : Attribute { }
public sealed class PaletteDefinitionAttribute : Attribute
{
public readonly bool IsPlayerPalette;
public PaletteDefinitionAttribute(bool isPlayerPalette = false)
{
IsPlayerPalette = isPlayerPalette;
}
}
[AttributeUsage(AttributeTargets.Field)]
public sealed class PaletteReferenceAttribute : Attribute
{
public readonly bool IsPlayerPalette;
public PaletteReferenceAttribute(bool isPlayerPalette = false)
{
IsPlayerPalette = isPlayerPalette;
}
public readonly string PlayerPaletteReferenceSwitch;
public PaletteReferenceAttribute(string playerPaletteReferenceSwitch)
{
PlayerPaletteReferenceSwitch = playerPaletteReferenceSwitch;
}
}
}

View File

@@ -20,7 +20,7 @@ namespace OpenRA.Traits
[PaletteReference] public readonly string BasePalette = null;
[Desc("The prefix for the resulting player palettes")]
public readonly string BaseName = "player";
[PaletteDefinition(true)] public readonly string BaseName = "player";
[Desc("Remap these indices to player colors.")]
public readonly int[] RemapIndex = { };

View File

@@ -19,7 +19,7 @@ namespace OpenRA.Traits
public class PlayerHighlightPaletteInfo : ITraitInfo
{
[Desc("The prefix for the resulting player palettes")]
public readonly string BaseName = "highlight";
[PaletteDefinition(true)] public readonly string BaseName = "highlight";
public object Create(ActorInitializer init) { return new PlayerHighlightPalette(this); }
}

View File

@@ -58,8 +58,9 @@ namespace OpenRA.Mods.Common.Effects
[Desc("Delay in ticks until trail animaion is spawned.")]
public readonly int TrailDelay = 1;
public readonly string TrailPalette = "effect";
[PaletteReference("TrailUsePlayerPalette")] 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;

View File

@@ -59,10 +59,9 @@ namespace OpenRA.Mods.Common.Effects
[Desc("Interval in ticks between each spawned Trail animation.")]
public readonly int TrailInterval = 2;
// TODO: Re-add PaletteReference as soon as it handles player palettes
public readonly string TrailPalette = "effect";
[PaletteReference("TrailUsePlayerPalette")] 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;

View File

@@ -18,9 +18,12 @@ namespace OpenRA.Mods.Common.Lint
{
class CheckPalettes : ILintRulesPass
{
List<string> palettes = new List<string>();
List<string> playerPalettes = new List<string>();
public void Run(Action<string> emitError, Action<string> emitWarning, Ruleset rules)
{
var palettes = GetPalettes(emitError, rules).ToList();
GetPalettes(emitError, rules);
foreach (var actorInfo in rules.Actors)
{
@@ -29,14 +32,36 @@ namespace OpenRA.Mods.Common.Lint
var fields = traitInfo.GetType().GetFields();
foreach (var field in fields.Where(x => x.HasAttribute<PaletteReferenceAttribute>()))
{
var isPlayerPalette = false;
var paletteReference = field.GetCustomAttributes<PaletteReferenceAttribute>(true).FirstOrDefault();
if (paletteReference != null)
{
if (!string.IsNullOrEmpty(paletteReference.PlayerPaletteReferenceSwitch))
{
var fieldInfo = fields.First(f => f.Name == paletteReference.PlayerPaletteReferenceSwitch);
isPlayerPalette = (bool)fieldInfo.GetValue(traitInfo);
}
else
isPlayerPalette = paletteReference.IsPlayerPalette;
}
var references = LintExts.GetFieldValues(traitInfo, field, emitError);
foreach (var reference in references)
{
if (string.IsNullOrEmpty(reference))
continue;
if (isPlayerPalette)
{
if (!playerPalettes.Contains(reference))
emitError("Undefined player palette reference {0} detected at {1} for {2}".F(reference, traitInfo, actorInfo.Key));
}
else
{
if (!palettes.Contains(reference))
emitError("Undefined palette reference {0} detected at {1}".F(reference, traitInfo));
emitError("Undefined palette reference {0} detected at {1} for {2}".F(reference, traitInfo, actorInfo.Key));
}
}
}
}
@@ -48,16 +73,36 @@ namespace OpenRA.Mods.Common.Lint
if (projectileInfo == null)
continue;
foreach (var field in projectileInfo.GetType().GetFields())
var fields = projectileInfo.GetType().GetFields();
foreach (var field in fields.Where(x => x.HasAttribute<PaletteReferenceAttribute>()))
{
if (field.HasAttribute<PaletteReferenceAttribute>())
var isPlayerPalette = false;
var paletteReference = field.GetCustomAttributes<PaletteReferenceAttribute>(true).First();
if (paletteReference != null)
{
if (!string.IsNullOrEmpty(paletteReference.PlayerPaletteReferenceSwitch))
{
var fieldInfo = fields.First(f => f.Name == paletteReference.PlayerPaletteReferenceSwitch);
isPlayerPalette = (bool)fieldInfo.GetValue(projectileInfo);
}
else
isPlayerPalette = paletteReference.IsPlayerPalette;
}
var references = LintExts.GetFieldValues(projectileInfo, field, emitError);
foreach (var reference in references)
{
if (string.IsNullOrEmpty(reference))
continue;
if (isPlayerPalette)
{
if (!playerPalettes.Contains(reference))
emitError("Undefined player palette reference {0} detected at weapon {1}.".F(reference, weaponInfo.Key));
}
else
{
if (!palettes.Contains(reference))
emitError("Undefined palette reference {0} detected at weapon {1}.".F(reference, weaponInfo.Key));
}
@@ -66,7 +111,7 @@ namespace OpenRA.Mods.Common.Lint
}
}
static IEnumerable<string> GetPalettes(Action<string> emitError, Ruleset rules)
void GetPalettes(Action<string> emitError, Ruleset rules)
{
foreach (var actorInfo in rules.Actors)
{
@@ -75,9 +120,15 @@ namespace OpenRA.Mods.Common.Lint
var fields = traitInfo.GetType().GetFields();
foreach (var field in fields.Where(x => x.HasAttribute<PaletteDefinitionAttribute>()))
{
var paletteDefinition = field.GetCustomAttributes<PaletteDefinitionAttribute>(true).First();
var values = LintExts.GetFieldValues(traitInfo, field, emitError);
foreach (var value in values)
yield return value;
{
if (paletteDefinition.IsPlayerPalette)
playerPalettes.Add(value);
else
palettes.Add(value);
}
}
}
}

View File

@@ -22,7 +22,7 @@ namespace OpenRA.Mods.Common.Traits
[SequenceReference("Image")] public readonly string CirclesSequence = "circles";
[Desc("Custom indicator palette name")]
public readonly string Palette = "player";
[PaletteReference("IsPlayerPalette")] public readonly string Palette = "player";
[Desc("Custom palette is a player palette BaseName")]
public readonly bool IsPlayerPalette = true;

View File

@@ -35,7 +35,7 @@ namespace OpenRA.Mods.Common.Traits
public readonly string CloakSound = null;
public readonly string UncloakSound = null;
public readonly string Palette = "cloak";
[PaletteReference("IsPlayerPalette")] public readonly string Palette = "cloak";
public readonly bool IsPlayerPalette = false;
public readonly HashSet<string> CloakTypes = new HashSet<string> { "Cloak" };

View File

@@ -36,7 +36,7 @@ namespace OpenRA.Mods.Common.Traits
[PaletteReference] public readonly string Palette = null;
[Desc("Custom PlayerColorPalette: BaseName")]
public readonly string PlayerPalette = "player";
[PaletteReference(true)] public readonly string PlayerPalette = "player";
[Desc("Change the sprite image size.")]
public readonly float Scale = 1f;

View File

@@ -23,7 +23,7 @@ namespace OpenRA.Mods.Common.Traits
public readonly WVec Offset = WVec.Zero;
[Desc("Custom palette name")]
[PaletteReference] public readonly string Palette = null;
[PaletteReference("IsPlayerPalette")] public readonly string Palette = null;
[Desc("Custom palette is a player palette BaseName")]
public readonly bool IsPlayerPalette = false;

View File

@@ -20,7 +20,7 @@ namespace OpenRA.Mods.Common.Traits
[SequenceReference] public readonly string Sequence = "active";
[Desc("Custom palette name")]
[PaletteReference] public readonly string Palette = null;
[PaletteReference("IsPlayerPalette")] public readonly string Palette = null;
[Desc("Custom palette is a player palette BaseName")]
public readonly bool IsPlayerPalette = false;

View File

@@ -24,7 +24,7 @@ namespace OpenRA.Mods.Common.Traits
[SequenceReference(null, true)] public readonly string DeathSequence = "die";
[Desc("The palette used for `DeathSequence`.")]
public readonly string DeathSequencePalette = "player";
[PaletteReference("DeathPaletteIsPlayerPalette")] public readonly string DeathSequencePalette = "player";
[Desc("Custom death animation palette is a player palette BaseName")]
public readonly bool DeathPaletteIsPlayerPalette = true;
@@ -36,7 +36,7 @@ namespace OpenRA.Mods.Common.Traits
[SequenceReference] public readonly string CrushedSequence = null;
[Desc("The palette used for `CrushedSequence`.")]
public readonly string CrushedSequencePalette = "effect";
[PaletteReference("CrushedPaletteIsPlayerPalette")] public readonly string CrushedSequencePalette = "effect";
[Desc("Custom crushed animation palette is a player palette BaseName")]
public readonly bool CrushedPaletteIsPlayerPalette = false;

View File

@@ -24,7 +24,7 @@ namespace OpenRA.Mods.Common.Traits
public readonly WVec Offset = WVec.Zero;
[Desc("Custom palette name")]
public readonly string Palette = null;
[PaletteReference("IsPlayerPalette")] public readonly string Palette = null;
[Desc("Custom palette is a player palette BaseName")]
public readonly bool IsPlayerPalette = false;

View File

@@ -29,7 +29,7 @@ namespace OpenRA.Mods.Common.Traits
public readonly WVec Offset = WVec.Zero;
[Desc("Custom palette name")]
public readonly string Palette = null;
[PaletteReference("IsPlayerPalette")] public readonly string Palette = null;
[Desc("Custom palette is a player palette BaseName")]
public readonly bool IsPlayerPalette = false;

View File

@@ -26,7 +26,7 @@ namespace OpenRA.Mods.Common.Traits
public readonly WVec Offset = WVec.Zero;
[Desc("Custom palette name")]
[PaletteReference] public readonly string Palette = null;
[PaletteReference("IsPlayerPalette")] public readonly string Palette = null;
[Desc("Custom palette is a player palette BaseName")]
public readonly bool IsPlayerPalette = false;

View File

@@ -25,7 +25,7 @@ namespace OpenRA.Mods.Common.Traits
public readonly WVec Offset = WVec.Zero;
[Desc("Custom palette name")]
public readonly string Palette = null;
[PaletteReference("IsPlayerPalette")] public readonly string Palette = null;
[Desc("Custom palette is a player palette BaseName")]
public readonly bool IsPlayerPalette = false;

View File

@@ -21,11 +21,11 @@ namespace OpenRA.Mods.Common.Traits
{
[FieldLoader.Require]
[Desc("The prefix for the resulting player palettes")]
public readonly string BaseName = null;
[PaletteDefinition(true)] public readonly string BaseName = null;
[FieldLoader.Require]
[Desc("The name of the player palette to base off.")]
public readonly string BasePalette = null;
[PaletteReference(true)] public readonly string BasePalette = null;
[Desc("Allow palette modifiers to change the palette.")]
public readonly bool AllowModifiers = true;

View File

@@ -16,7 +16,7 @@ namespace OpenRA.Mods.Common.Traits
{
class PlayerPaletteFromCurrentTilesetInfo : ITraitInfo
{
[FieldLoader.Require, PaletteDefinition]
[FieldLoader.Require, PaletteDefinition(true)]
[Desc("internal palette name")]
public readonly string Name = null;
[Desc("Map listed indices to shadow.")]

View File

@@ -23,7 +23,7 @@ namespace OpenRA.Mods.Common.Warheads
public readonly string Explosion = null;
[Desc("Palette to use for explosion effect.")]
public readonly string ExplosionPalette = "effect";
[PaletteReference("UsePlayerPalette")] public readonly string ExplosionPalette = "effect";
[Desc("Remap explosion effect to player color, if art supports it.")]
public readonly bool UsePlayerPalette = false;

View File

@@ -22,7 +22,7 @@ namespace OpenRA.Mods.D2k.Traits
[SequenceReference] public readonly string Sequence = null;
[Desc("Custom palette name")]
[PaletteReference] public readonly string Palette = null;
[PaletteReference("IsPlayerPalette")] public readonly string Palette = null;
[Desc("Custom palette is a player palette BaseName")]
public readonly bool IsPlayerPalette = false;

View File

@@ -21,7 +21,7 @@ namespace OpenRA.Mods.D2k.Traits
[SequenceReference] public readonly string Sequence = "crumble-overlay";
[Desc("Custom palette name")]
[PaletteReference] public readonly string Palette = null;
[PaletteReference("IsPlayerPalette")] public readonly string Palette = null;
[Desc("Custom palette is a player palette BaseName")]
public readonly bool IsPlayerPalette = false;

View File

@@ -25,7 +25,7 @@ namespace OpenRA.Mods.D2k.Traits
public readonly WVec Offset = WVec.Zero;
[Desc("Custom palette name")]
[PaletteReference] public readonly string Palette = null;
[PaletteReference("IsPlayerPalette")] public readonly string Palette = null;
[Desc("Custom palette is a player palette BaseName")]
public readonly bool IsPlayerPalette = false;