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 { } public sealed class UpgradeUsedReferenceAttribute : Attribute { }
[AttributeUsage(AttributeTargets.Field)] [AttributeUsage(AttributeTargets.Field)]
public sealed class PaletteDefinitionAttribute : Attribute { } public sealed class PaletteDefinitionAttribute : Attribute
{
public readonly bool IsPlayerPalette;
public PaletteDefinitionAttribute(bool isPlayerPalette = false)
{
IsPlayerPalette = isPlayerPalette;
}
}
// TODO: differentiate player palettes
[AttributeUsage(AttributeTargets.Field)] [AttributeUsage(AttributeTargets.Field)]
public sealed class PaletteReferenceAttribute : Attribute { } 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; [PaletteReference] public readonly string BasePalette = null;
[Desc("The prefix for the resulting player palettes")] [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.")] [Desc("Remap these indices to player colors.")]
public readonly int[] RemapIndex = { }; public readonly int[] RemapIndex = { };

View File

@@ -19,7 +19,7 @@ namespace OpenRA.Traits
public class PlayerHighlightPaletteInfo : ITraitInfo public class PlayerHighlightPaletteInfo : ITraitInfo
{ {
[Desc("The prefix for the resulting player palettes")] [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); } 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.")] [Desc("Delay in ticks until trail animaion is spawned.")]
public readonly int TrailDelay = 1; public readonly int TrailDelay = 1;
public readonly string TrailPalette = "effect"; [PaletteReference("TrailUsePlayerPalette")] public readonly string TrailPalette = "effect";
public readonly bool TrailUsePlayerPalette = false; public readonly bool TrailUsePlayerPalette = false;
public readonly int ContrailLength = 0; public readonly int ContrailLength = 0;
public readonly Color ContrailColor = Color.White; public readonly Color ContrailColor = Color.White;
public readonly bool ContrailUsePlayerColor = false; 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.")] [Desc("Interval in ticks between each spawned Trail animation.")]
public readonly int TrailInterval = 2; public readonly int TrailInterval = 2;
// TODO: Re-add PaletteReference as soon as it handles player palettes [PaletteReference("TrailUsePlayerPalette")] public readonly string TrailPalette = "effect";
public readonly string TrailPalette = "effect";
public readonly bool TrailUsePlayerPalette = false; public readonly bool TrailUsePlayerPalette = false;
public readonly int ContrailLength = 0; public readonly int ContrailLength = 0;
public readonly Color ContrailColor = Color.White; public readonly Color ContrailColor = Color.White;
public readonly bool ContrailUsePlayerColor = false; public readonly bool ContrailUsePlayerColor = false;

View File

@@ -18,9 +18,12 @@ namespace OpenRA.Mods.Common.Lint
{ {
class CheckPalettes : ILintRulesPass 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) 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) foreach (var actorInfo in rules.Actors)
{ {
@@ -29,14 +32,36 @@ namespace OpenRA.Mods.Common.Lint
var fields = traitInfo.GetType().GetFields(); var fields = traitInfo.GetType().GetFields();
foreach (var field in fields.Where(x => x.HasAttribute<PaletteReferenceAttribute>())) 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); var references = LintExts.GetFieldValues(traitInfo, field, emitError);
foreach (var reference in references) foreach (var reference in references)
{ {
if (string.IsNullOrEmpty(reference)) if (string.IsNullOrEmpty(reference))
continue; continue;
if (!palettes.Contains(reference)) if (isPlayerPalette)
emitError("Undefined palette reference {0} detected at {1}".F(reference, traitInfo)); {
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} for {2}".F(reference, traitInfo, actorInfo.Key));
}
} }
} }
} }
@@ -48,16 +73,36 @@ namespace OpenRA.Mods.Common.Lint
if (projectileInfo == null) if (projectileInfo == null)
continue; 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 references = LintExts.GetFieldValues(projectileInfo, field, emitError);
foreach (var reference in references)
{
if (string.IsNullOrEmpty(reference))
continue;
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)) if (!palettes.Contains(reference))
emitError("Undefined palette reference {0} detected at weapon {1}.".F(reference, weaponInfo.Key)); 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) foreach (var actorInfo in rules.Actors)
{ {
@@ -75,9 +120,15 @@ namespace OpenRA.Mods.Common.Lint
var fields = traitInfo.GetType().GetFields(); var fields = traitInfo.GetType().GetFields();
foreach (var field in fields.Where(x => x.HasAttribute<PaletteDefinitionAttribute>())) foreach (var field in fields.Where(x => x.HasAttribute<PaletteDefinitionAttribute>()))
{ {
var paletteDefinition = field.GetCustomAttributes<PaletteDefinitionAttribute>(true).First();
var values = LintExts.GetFieldValues(traitInfo, field, emitError); var values = LintExts.GetFieldValues(traitInfo, field, emitError);
foreach (var value in values) 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"; [SequenceReference("Image")] public readonly string CirclesSequence = "circles";
[Desc("Custom indicator palette name")] [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")] [Desc("Custom palette is a player palette BaseName")]
public readonly bool IsPlayerPalette = true; public readonly bool IsPlayerPalette = true;

View File

@@ -35,7 +35,7 @@ namespace OpenRA.Mods.Common.Traits
public readonly string CloakSound = null; public readonly string CloakSound = null;
public readonly string UncloakSound = 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 bool IsPlayerPalette = false;
public readonly HashSet<string> CloakTypes = new HashSet<string> { "Cloak" }; 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; [PaletteReference] public readonly string Palette = null;
[Desc("Custom PlayerColorPalette: BaseName")] [Desc("Custom PlayerColorPalette: BaseName")]
public readonly string PlayerPalette = "player"; [PaletteReference(true)] public readonly string PlayerPalette = "player";
[Desc("Change the sprite image size.")] [Desc("Change the sprite image size.")]
public readonly float Scale = 1f; public readonly float Scale = 1f;

View File

@@ -23,7 +23,7 @@ namespace OpenRA.Mods.Common.Traits
public readonly WVec Offset = WVec.Zero; public readonly WVec Offset = WVec.Zero;
[Desc("Custom palette name")] [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")] [Desc("Custom palette is a player palette BaseName")]
public readonly bool IsPlayerPalette = false; public readonly bool IsPlayerPalette = false;

View File

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

View File

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

View File

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

View File

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

View File

@@ -26,7 +26,7 @@ namespace OpenRA.Mods.Common.Traits
public readonly WVec Offset = WVec.Zero; public readonly WVec Offset = WVec.Zero;
[Desc("Custom palette name")] [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")] [Desc("Custom palette is a player palette BaseName")]
public readonly bool IsPlayerPalette = false; public readonly bool IsPlayerPalette = false;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -25,7 +25,7 @@ namespace OpenRA.Mods.D2k.Traits
public readonly WVec Offset = WVec.Zero; public readonly WVec Offset = WVec.Zero;
[Desc("Custom palette name")] [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")] [Desc("Custom palette is a player palette BaseName")]
public readonly bool IsPlayerPalette = false; public readonly bool IsPlayerPalette = false;