Merge pull request #8749 from Mailaender/lint-palettes

Added a lint rule for palette references
This commit is contained in:
Pavel Penev
2015-08-17 23:09:53 +03:00
55 changed files with 195 additions and 62 deletions

View File

@@ -43,4 +43,11 @@ namespace OpenRA.Traits
[AttributeUsage(AttributeTargets.Field)] [AttributeUsage(AttributeTargets.Field)]
public sealed class UpgradeUsedReferenceAttribute : Attribute { } 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 { }
} }

View File

@@ -16,15 +16,20 @@ namespace OpenRA.Traits
public class FixedColorPaletteInfo : ITraitInfo public class FixedColorPaletteInfo : ITraitInfo
{ {
[Desc("The name of the palette to base off.")] [Desc("The name of the palette to base off.")]
public readonly string Base = "terrain"; [PaletteReference] public readonly string Base = "terrain";
[Desc("The name of the resulting palette")] [Desc("The name of the resulting palette")]
public readonly string Name = "resources"; [PaletteDefinition] public readonly string Name = "resources";
[Desc("Remap these indices to pre-defined colors.")] [Desc("Remap these indices to pre-defined colors.")]
public readonly int[] RemapIndex = { }; public readonly int[] RemapIndex = { };
[Desc("The fixed color to remap.")] [Desc("The fixed color to remap.")]
public readonly HSLColor Color; public readonly HSLColor Color;
[Desc("Luminosity range to span.")] [Desc("Luminosity range to span.")]
public readonly float Ramp = 0.05f; public readonly float Ramp = 0.05f;
[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

@@ -17,13 +17,17 @@ namespace OpenRA.Traits
public class PlayerColorPaletteInfo : ITraitInfo public class PlayerColorPaletteInfo : ITraitInfo
{ {
[Desc("The name of the palette to base off.")] [Desc("The name of the palette to base off.")]
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"; 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 = { };
[Desc("Luminosity range to span.")] [Desc("Luminosity range to span.")]
public readonly float Ramp = 0.05f; public readonly float Ramp = 0.05f;
[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

@@ -17,7 +17,7 @@ namespace OpenRA.Traits
{ {
public readonly string Sequence = "resources"; public readonly string Sequence = "resources";
[SequenceReference("Sequence")] public readonly string[] Variants = { }; [SequenceReference("Sequence")] public readonly string[] Variants = { };
public readonly string Palette = "terrain"; [PaletteReference] public readonly string Palette = "terrain";
public readonly int ResourceType = 1; public readonly int ResourceType = 1;
public readonly int ValuePerUnit = 0; public readonly int ValuePerUnit = 0;

View File

@@ -27,7 +27,7 @@ namespace OpenRA.Mods.Cnc.Traits
[Desc("Effect sequence to display")] [Desc("Effect sequence to display")]
public readonly string Effect = "ionsfx"; public readonly string Effect = "ionsfx";
public readonly string EffectPalette = "effect"; [PaletteReference] public readonly string EffectPalette = "effect";
[Desc("Which weapon to fire"), WeaponReference] [Desc("Which weapon to fire"), WeaponReference]
public readonly string Weapon = "IonCannon"; public readonly string Weapon = "IonCannon";

View File

@@ -35,13 +35,13 @@ namespace OpenRA.Mods.Common.Effects
[SequenceReference("Image")] public readonly string Sequence = "idle"; [SequenceReference("Image")] public readonly string Sequence = "idle";
[Desc("The palette used to draw this projectile.")] [Desc("The palette used to draw this projectile.")]
public readonly string Palette = "effect"; [PaletteReference] public readonly string Palette = "effect";
[Desc("Does this projectile have a shadow?")] [Desc("Does this projectile have a shadow?")]
public readonly bool Shadow = false; public readonly bool Shadow = false;
[Desc("Palette to use for this projectile's shadow if Shadow is true.")] [Desc("Palette to use for this projectile's shadow if Shadow is true.")]
public readonly string ShadowPalette = "shadow"; [PaletteReference] public readonly string ShadowPalette = "shadow";
[Desc("Trail animation.")] [Desc("Trail animation.")]
public readonly string Trail = null; public readonly string Trail = null;

View File

@@ -26,7 +26,7 @@ namespace OpenRA.Mods.Common.Effects
[Desc("Sequence to play when launched. Skipped if null or empty.")] [Desc("Sequence to play when launched. Skipped if null or empty.")]
[SequenceReference("Image")] public readonly string OpenSequence = null; [SequenceReference("Image")] public readonly string OpenSequence = null;
public readonly string Palette = "effect"; [PaletteReference] public readonly string Palette = "effect";
public readonly bool Shadow = false; public readonly bool Shadow = false;

View File

@@ -36,7 +36,7 @@ namespace OpenRA.Mods.Common.Effects
[Desc("Sequence of impact animation to use.")] [Desc("Sequence of impact animation to use.")]
[SequenceReference("HitAnim")] public readonly string HitAnimSequence = "idle"; [SequenceReference("HitAnim")] public readonly string HitAnimSequence = "idle";
public readonly string HitAnimPalette = "effect"; [PaletteReference] public readonly string HitAnimPalette = "effect";
public IEffect Create(ProjectileArgs args) public IEffect Create(ProjectileArgs args)
{ {

View File

@@ -25,7 +25,7 @@ namespace OpenRA.Mods.Common.Effects
public readonly string Image = null; public readonly string Image = null;
[SequenceReference("Image")] public readonly string Sequence = "idle"; [SequenceReference("Image")] public readonly string Sequence = "idle";
public readonly string Palette = "effect"; [PaletteReference] public readonly string Palette = "effect";
public readonly bool Shadow = false; public readonly bool Shadow = false;
@@ -59,7 +59,8 @@ 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;
public readonly string TrailPalette = "effect"; [PaletteReference] 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;

View File

@@ -0,0 +1,91 @@
#region Copyright & License Information
/*
* Copyright 2007-2015 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using OpenRA.Mods.Common.Traits;
using OpenRA.Traits;
namespace OpenRA.Mods.Common.Lint
{
class CheckPalettes : ILintPass
{
public void Run(Action<string> emitError, Action<string> emitWarning, Map map)
{
if (map != null && !map.RuleDefinitions.Any())
return;
var rules = map == null ? Game.ModData.DefaultRules : map.Rules;
var palettes = GetPalettes(emitError, rules).ToList();
foreach (var actorInfo in rules.Actors)
{
foreach (var traitInfo in actorInfo.Value.Traits)
{
var fields = traitInfo.GetType().GetFields();
foreach (var field in fields.Where(x => x.HasAttribute<PaletteReferenceAttribute>()))
{
var references = LintExts.GetFieldValues(traitInfo, field, emitError);
foreach (var reference in references)
{
if (string.IsNullOrEmpty(reference))
continue;
if (!palettes.Contains(reference))
emitError("Undefined palette reference {0} detected at {1}".F(reference, traitInfo));
}
}
}
}
foreach (var weaponInfo in rules.Weapons)
{
var projectileInfo = weaponInfo.Value.Projectile;
if (projectileInfo == null)
continue;
foreach (var field in projectileInfo.GetType().GetFields())
{
if (field.HasAttribute<PaletteReferenceAttribute>())
{
var references = LintExts.GetFieldValues(projectileInfo, field, emitError);
foreach (var reference in references)
{
if (string.IsNullOrEmpty(reference))
continue;
if (!palettes.Contains(reference))
emitError("Undefined palette reference {0} detected at weapon {1}.".F(reference, weaponInfo.Key));
}
}
}
}
}
static IEnumerable<string> GetPalettes(Action<string> emitError, Ruleset rules)
{
foreach (var actorInfo in rules.Actors)
{
foreach (var traitInfo in actorInfo.Value.Traits)
{
var fields = traitInfo.GetType().GetFields();
foreach (var field in fields.Where(x => x.HasAttribute<PaletteDefinitionAttribute>()))
{
var values = LintExts.GetFieldValues(traitInfo, field, emitError);
foreach (var value in values)
yield return value;
}
}
}
}
}
}

View File

@@ -178,6 +178,7 @@
<Compile Include="Graphics\VoxelActorPreview.cs" /> <Compile Include="Graphics\VoxelActorPreview.cs" />
<Compile Include="Graphics\VoxelRenderable.cs" /> <Compile Include="Graphics\VoxelRenderable.cs" />
<Compile Include="Lint\CheckSequences.cs" /> <Compile Include="Lint\CheckSequences.cs" />
<Compile Include="Lint\CheckPalettes.cs" />
<Compile Include="Lint\CheckPlayers.cs" /> <Compile Include="Lint\CheckPlayers.cs" />
<Compile Include="Lint\CheckActors.cs" /> <Compile Include="Lint\CheckActors.cs" />
<Compile Include="Lint\CheckMapCordon.cs" /> <Compile Include="Lint\CheckMapCordon.cs" />

View File

@@ -57,7 +57,7 @@ namespace OpenRA.Mods.Common.Traits
public readonly string MuzzleSequence = null; public readonly string MuzzleSequence = null;
[Desc("Palette to render Muzzle flash sequence in")] [Desc("Palette to render Muzzle flash sequence in")]
public readonly string MuzzlePalette = "effect"; [PaletteReference] public readonly string MuzzlePalette = "effect";
[Desc("Use multiple muzzle images if non-zero")] [Desc("Use multiple muzzle images if non-zero")]
public readonly int MuzzleSplitFacings = 0; public readonly int MuzzleSplitFacings = 0;

View File

@@ -39,7 +39,7 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Fire port yaw cone angle.")] [Desc("Fire port yaw cone angle.")]
public readonly WAngle[] PortCones = null; public readonly WAngle[] PortCones = null;
public readonly string MuzzlePalette = "effect"; [PaletteReference] public readonly string MuzzlePalette = "effect";
public override object Create(ActorInitializer init) { return new AttackGarrisoned(init.Self, this); } public override object Create(ActorInitializer init) { return new AttackGarrisoned(init.Self, this); }
} }

View File

@@ -33,7 +33,7 @@ namespace OpenRA.Mods.Common.Traits
public readonly string ForceFaction = null; public readonly string ForceFaction = null;
[Desc("Palette used for the production icon.")] [Desc("Palette used for the production icon.")]
public readonly string IconPalette = "chrome"; [PaletteReference] public readonly string IconPalette = "chrome";
// TODO: UI fluff; doesn't belong here // TODO: UI fluff; doesn't belong here
public readonly int BuildPaletteOrder = 9999; public readonly int BuildPaletteOrder = 9999;

View File

@@ -18,7 +18,7 @@ namespace OpenRA.Mods.Common.Traits
public class BibInfo : ITraitInfo, Requires<BuildingInfo>, IRenderActorPreviewSpritesInfo, Requires<RenderSpritesInfo> public class BibInfo : ITraitInfo, Requires<BuildingInfo>, IRenderActorPreviewSpritesInfo, Requires<RenderSpritesInfo>
{ {
[SequenceReference] public readonly string Sequence = "bib"; [SequenceReference] public readonly string Sequence = "bib";
public readonly string Palette = "terrain"; [PaletteReference] public readonly string Palette = "terrain";
public readonly bool HasMinibib = false; public readonly bool HasMinibib = false;
public object Create(ActorInitializer init) { return new Bib(init.Self, this); } public object Create(ActorInitializer init) { return new Bib(init.Self, this); }

View File

@@ -29,7 +29,7 @@ namespace OpenRA.Mods.Common.Traits
[SequenceReference("IndicatorImage")] public readonly string IndicatorSequence = "repair"; [SequenceReference("IndicatorImage")] public readonly string IndicatorSequence = "repair";
[Desc("Overrides the IndicatorPalettePrefix.")] [Desc("Overrides the IndicatorPalettePrefix.")]
public readonly string IndicatorPalette = ""; [PaletteReference] public readonly string IndicatorPalette = "";
[Desc("Suffixed by the interal repairing player name.")] [Desc("Suffixed by the interal repairing player name.")]
public readonly string IndicatorPalettePrefix = "player"; public readonly string IndicatorPalettePrefix = "player";

View File

@@ -34,7 +34,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] public readonly string Palette = "cloak";
public readonly string[] CloakTypes = { "Cloak" }; public readonly string[] CloakTypes = { "Cloak" };

View File

@@ -23,7 +23,7 @@ namespace OpenRA.Mods.Common.Traits
public readonly string Effect = null; public readonly string Effect = null;
[Desc("Palette to draw the animation in.")] [Desc("Palette to draw the animation in.")]
public readonly string Palette = "effect"; [PaletteReference] public readonly string Palette = "effect";
[Desc("Audio clip to play when the crate is collected.")] [Desc("Audio clip to play when the crate is collected.")]
public readonly string Notification = null; public readonly string Notification = null;

View File

@@ -27,7 +27,7 @@ namespace OpenRA.Mods.Common.Traits
public readonly Dictionary<int, string[]> Upgrades = null; public readonly Dictionary<int, string[]> Upgrades = null;
[Desc("Palette for the level up sprite.")] [Desc("Palette for the level up sprite.")]
public readonly string LevelUpPalette = "effect"; [PaletteReference] public readonly string LevelUpPalette = "effect";
[Desc("Should the level-up animation be suppressed when actor is created?")] [Desc("Should the level-up animation be suppressed when actor is created?")]
public readonly bool SuppressLevelupAnimation = true; public readonly bool SuppressLevelupAnimation = true;

View File

@@ -18,7 +18,7 @@ namespace OpenRA.Mods.Common.Traits
public class UpgradeOverlayInfo : UpgradableTraitInfo public class UpgradeOverlayInfo : UpgradableTraitInfo
{ {
[Desc("Palette to use when rendering the overlay")] [Desc("Palette to use when rendering the overlay")]
public readonly string Palette = "invuln"; [PaletteReference] public readonly string Palette = "invuln";
public override object Create(ActorInitializer init) { return new UpgradeOverlay(this); } public override object Create(ActorInitializer init) { return new UpgradeOverlay(this); }
} }

View File

@@ -24,11 +24,11 @@ namespace OpenRA.Mods.Common.Traits
public readonly string GroundImpactSound = null; public readonly string GroundImpactSound = null;
[SequenceReference("CorpseSequenceCollection")] public readonly string GroundCorpseSequence = "corpse"; [SequenceReference("CorpseSequenceCollection")] public readonly string GroundCorpseSequence = "corpse";
public readonly string GroundCorpsePalette = "effect"; [PaletteReference] public readonly string GroundCorpsePalette = "effect";
public readonly string WaterImpactSound = null; public readonly string WaterImpactSound = null;
[SequenceReference("CorpseSequenceCollection")] public readonly string WaterCorpseSequence = null; [SequenceReference("CorpseSequenceCollection")] public readonly string WaterCorpseSequence = null;
public readonly string WaterCorpsePalette = "effect"; [PaletteReference] public readonly string WaterCorpsePalette = "effect";
public readonly int FallRate = 13; public readonly int FallRate = 13;

View File

@@ -19,7 +19,7 @@ namespace OpenRA.Mods.Common.Traits
public class PlaceBuildingInfo : ITraitInfo public class PlaceBuildingInfo : ITraitInfo
{ {
[Desc("Palette to use for rendering the placement sprite.")] [Desc("Palette to use for rendering the placement sprite.")]
public readonly string Palette = "terrain"; [PaletteReference] public readonly string Palette = "terrain";
[Desc("Play NewOptionsNotification this many ticks after building placement.")] [Desc("Play NewOptionsNotification this many ticks after building placement.")]
public readonly int NewOptionsNotificationDelay = 10; public readonly int NewOptionsNotificationDelay = 10;

View File

@@ -18,7 +18,7 @@ namespace OpenRA.Mods.Common.Traits
public class LeavesTrailsInfo : ITraitInfo public class LeavesTrailsInfo : ITraitInfo
{ {
public readonly string Image = null; public readonly string Image = null;
public readonly string Palette = "effect"; [PaletteReference] public readonly string Palette = "effect";
[Desc("Only do so when the terrain types match with the previous cell.")] [Desc("Only do so when the terrain types match with the previous cell.")]
public readonly string[] TerrainTypes = { }; public readonly string[] TerrainTypes = { };

View File

@@ -34,7 +34,7 @@ namespace OpenRA.Mods.Common.Traits
public readonly Dictionary<string, string> RaceImages = null; public readonly Dictionary<string, string> RaceImages = null;
[Desc("Custom palette name")] [Desc("Custom palette name")]
public readonly string Palette = null; [PaletteReference] public readonly string Palette = null;
[Desc("Custom PlayerColorPalette: BaseName")] [Desc("Custom PlayerColorPalette: BaseName")]
public readonly string PlayerPalette = "player"; public readonly string PlayerPalette = "player";

View File

@@ -28,12 +28,12 @@ namespace OpenRA.Mods.Common.Traits
public readonly string Image = null; public readonly string Image = null;
[Desc("Custom palette name")] [Desc("Custom palette name")]
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] public readonly string PlayerPalette = "player";
public readonly string NormalsPalette = "normals"; [PaletteReference] public readonly string NormalsPalette = "normals";
public readonly string ShadowPalette = "shadow"; [PaletteReference] public readonly string ShadowPalette = "shadow";
[Desc("Change the image size.")] [Desc("Change the image size.")]
public readonly float Scale = 10; public readonly float Scale = 10;

View File

@@ -19,7 +19,7 @@ namespace OpenRA.Mods.Common.Traits
{ {
public class SelectionDecorationsInfo : ITraitInfo, ISelectionDecorationsInfo public class SelectionDecorationsInfo : ITraitInfo, ISelectionDecorationsInfo
{ {
public readonly string Palette = "chrome"; [PaletteReference] public readonly string Palette = "chrome";
[Desc("Visual bounds for selection box. If null, it uses AutoSelectionSize.", [Desc("Visual bounds for selection box. If null, it uses AutoSelectionSize.",
"The first two values define the bounds' size, the optional third and fourth", "The first two values define the bounds' size, the optional third and fourth",

View File

@@ -28,7 +28,7 @@ namespace OpenRA.Mods.Common.Traits
public readonly int Delay = 0; public readonly int Delay = 0;
[Desc("Custom palette name")] [Desc("Custom palette name")]
public readonly string Palette = "effect"; [PaletteReference] public readonly string Palette = "effect";
public object Create(ActorInitializer init) { return new WithBuildingExplosion(init.Self, this); } public object Create(ActorInitializer init) { return new WithBuildingExplosion(init.Self, this); }
} }

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")]
public readonly string Palette = null; [PaletteReference] 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")]
public readonly string Palette = null; [PaletteReference] 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

@@ -38,7 +38,7 @@ namespace OpenRA.Mods.Common.Traits
public readonly string Sequence = null; public readonly string Sequence = null;
[Desc("Palette to render the sprite in. Reference the world actor's PaletteFrom* traits.")] [Desc("Palette to render the sprite in. Reference the world actor's PaletteFrom* traits.")]
public readonly string Palette = "chrome"; [PaletteReference] public readonly string Palette = "chrome";
[Desc("Point in the actor's bounding box used as reference for offsetting the decoration image." + [Desc("Point in the actor's bounding box used as reference for offsetting the decoration image." +
"Possible values are any combination of Top, VCenter, Bottom and Left, HCenter, Right separated by a comma.")] "Possible values are any combination of Top, VCenter, Bottom and Left, HCenter, Right separated by a comma.")]

View File

@@ -23,7 +23,7 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Position relative to body")] [Desc("Position relative to body")]
public readonly WVec Offset = WVec.Zero; public readonly WVec Offset = WVec.Zero;
public readonly string Palette = "effect"; [PaletteReference] public readonly string Palette = "effect";
public object Create(ActorInitializer init) { return new WithHarvestOverlay(init.Self, this); } public object Create(ActorInitializer init) { return new WithHarvestOverlay(init.Self, this); }
} }

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")]
public readonly string Palette = null; [PaletteReference] 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

@@ -19,7 +19,7 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Clones the aircraft sprite with another palette below it.")] [Desc("Clones the aircraft sprite with another palette below it.")]
class WithShadowInfo : ITraitInfo class WithShadowInfo : ITraitInfo
{ {
public readonly string Palette = "shadow"; [PaletteReference] public readonly string Palette = "shadow";
public object Create(ActorInitializer init) { return new WithShadow(this); } public object Create(ActorInitializer init) { return new WithShadow(this); }
} }

View File

@@ -40,13 +40,13 @@ namespace OpenRA.Mods.Common.Traits
public readonly bool DisplayTimer = false; public readonly bool DisplayTimer = false;
[Desc("Palette used for the icon.")] [Desc("Palette used for the icon.")]
public readonly string IconPalette = "chrome"; [PaletteReference] public readonly string IconPalette = "chrome";
[Desc("Beacons are only supported on the Airstrike and Nuke powers")] [Desc("Beacons are only supported on the Airstrike and Nuke powers")]
public readonly bool DisplayBeacon = false; public readonly bool DisplayBeacon = false;
public readonly string BeaconPalettePrefix = "player"; public readonly string BeaconPalettePrefix = "player";
public readonly string BeaconPoster = null; public readonly string BeaconPoster = null;
public readonly string BeaconPosterPalette = "chrome"; [PaletteReference] public readonly string BeaconPosterPalette = "chrome";
public readonly bool DisplayRadarPing = false; public readonly bool DisplayRadarPing = false;

View File

@@ -27,7 +27,7 @@ namespace OpenRA.Mods.Common.Traits
[SequenceReference("Image")] public readonly string Sequence = null; [SequenceReference("Image")] public readonly string Sequence = null;
[Desc("Palette to render the sprite in. Reference the world actor's PaletteFrom* traits.")] [Desc("Palette to render the sprite in. Reference the world actor's PaletteFrom* traits.")]
public readonly string Palette = "chrome"; [PaletteReference] public readonly string Palette = "chrome";
[Desc("Point on the production icon's used as reference for offsetting the overlay. ", [Desc("Point on the production icon's used as reference for offsetting the overlay. ",
"Possible values are any combination of Top, VCenter, Bottom and Left, HCenter, Right separated by a comma.")] "Possible values are any combination of Top, VCenter, Bottom and Left, HCenter, Right separated by a comma.")]

View File

@@ -18,11 +18,13 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Loads the palette specified in the tileset definition")] [Desc("Loads the palette specified in the tileset definition")]
class PaletteFromCurrentTilesetInfo : ITraitInfo class PaletteFromCurrentTilesetInfo : ITraitInfo
{ {
[FieldLoader.Require] [FieldLoader.Require, PaletteDefinition]
[Desc("internal palette name")] [Desc("internal palette name")]
public readonly string Name = null; public readonly string Name = null;
[Desc("Map listed indices to shadow. Ignores previous color.")] [Desc("Map listed indices to shadow. Ignores previous color.")]
public readonly int[] ShadowIndex = { }; public readonly int[] ShadowIndex = { };
public readonly bool AllowModifiers = true; public readonly bool AllowModifiers = true;
public object Create(ActorInitializer init) { return new PaletteFromCurrentTileset(init.World, this); } public object Create(ActorInitializer init) { return new PaletteFromCurrentTileset(init.World, this); }

View File

@@ -17,16 +17,20 @@ namespace OpenRA.Mods.Common.Traits
{ {
class PaletteFromFileInfo : ITraitInfo class PaletteFromFileInfo : ITraitInfo
{ {
[FieldLoader.Require] [FieldLoader.Require, PaletteDefinition]
[Desc("internal palette name")] [Desc("internal palette name")]
public readonly string Name = null; public readonly string Name = null;
[Desc("If defined, load the palette only for this tileset.")] [Desc("If defined, load the palette only for this tileset.")]
public readonly string Tileset = null; public readonly string Tileset = null;
[FieldLoader.Require] [FieldLoader.Require]
[Desc("filename to load")] [Desc("filename to load")]
public readonly string Filename = null; public readonly string Filename = null;
[Desc("Map listed indices to shadow. Ignores previous color.")] [Desc("Map listed indices to shadow. Ignores previous color.")]
public readonly int[] ShadowIndex = { }; public readonly int[] ShadowIndex = { };
public readonly bool AllowModifiers = true; public readonly bool AllowModifiers = true;
public object Create(ActorInitializer init) { return new PaletteFromFile(init.World, this); } public object Create(ActorInitializer init) { return new PaletteFromFile(init.World, this); }

View File

@@ -19,11 +19,11 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Create a palette by applying alpha transparency to another palette.")] [Desc("Create a palette by applying alpha transparency to another palette.")]
class PaletteFromPaletteWithAlphaInfo : ITraitInfo class PaletteFromPaletteWithAlphaInfo : ITraitInfo
{ {
[FieldLoader.Require] [FieldLoader.Require, PaletteDefinition]
[Desc("Internal palette name")] [Desc("Internal palette name")]
public readonly string Name = null; public readonly string Name = null;
[FieldLoader.Require] [FieldLoader.Require, PaletteReference]
[Desc("The name of the palette to base off.")] [Desc("The name of the palette to base off.")]
public readonly string BasePalette = null; public readonly string BasePalette = null;

View File

@@ -18,19 +18,25 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Creates a single color palette without any base palette file.")] [Desc("Creates a single color palette without any base palette file.")]
class PaletteFromRGBAInfo : ITraitInfo class PaletteFromRGBAInfo : ITraitInfo
{ {
[FieldLoader.Require] [FieldLoader.Require, PaletteDefinition]
[Desc("internal palette name")] [Desc("internal palette name")]
public readonly string Name = null; public readonly string Name = null;
[Desc("If defined, load the palette only for this tileset.")] [Desc("If defined, load the palette only for this tileset.")]
public readonly string Tileset = null; public readonly string Tileset = null;
[Desc("red color component")] [Desc("red color component")]
public readonly int R = 0; public readonly int R = 0;
[Desc("green color component")] [Desc("green color component")]
public readonly int G = 0; public readonly int G = 0;
[Desc("blue color component")] [Desc("blue color component")]
public readonly int B = 0; public readonly int B = 0;
[Desc("alpha channel (transparency)")] [Desc("alpha channel (transparency)")]
public readonly int A = 255; public readonly int A = 255;
public readonly bool AllowModifiers = true; public readonly bool AllowModifiers = true;
public object Create(ActorInitializer init) { return new PaletteFromRGBA(init.World, this); } public object Create(ActorInitializer init) { return new PaletteFromRGBA(init.World, this); }

View File

@@ -16,7 +16,7 @@ namespace OpenRA.Mods.Common.Traits
{ {
class PlayerPaletteFromCurrentTilesetInfo : ITraitInfo class PlayerPaletteFromCurrentTilesetInfo : ITraitInfo
{ {
[FieldLoader.Require] [FieldLoader.Require, PaletteDefinition]
[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

@@ -20,6 +20,7 @@ namespace OpenRA.Mods.Common.Traits
class ShroudPaletteInfo : ITraitInfo class ShroudPaletteInfo : ITraitInfo
{ {
[Desc("Internal palette name")] [Desc("Internal palette name")]
[FieldLoader.Require, PaletteDefinition]
public readonly string Name = "shroud"; public readonly string Name = "shroud";
[Desc("Palette type")] [Desc("Palette type")]

View File

@@ -23,11 +23,11 @@ namespace OpenRA.Mods.Common.Traits
public class ShroudRendererInfo : ITraitInfo public class ShroudRendererInfo : ITraitInfo
{ {
public readonly string Sequence = "shroud"; public readonly string Sequence = "shroud";
public readonly string[] ShroudVariants = new[] { "shroud" }; [SequenceReference("Sequence")] public readonly string[] ShroudVariants = new[] { "shroud" };
public readonly string[] FogVariants = new[] { "fog" }; [SequenceReference("Sequence")] public readonly string[] FogVariants = new[] { "fog" };
public readonly string ShroudPalette = "shroud"; [PaletteReference] public readonly string ShroudPalette = "shroud";
public readonly string FogPalette = "fog"; [PaletteReference] public readonly string FogPalette = "fog";
[Desc("Bitfield of shroud directions for each frame. Lower four bits are", [Desc("Bitfield of shroud directions for each frame. Lower four bits are",
"corners clockwise from TL; upper four are edges clockwise from top")] "corners clockwise from TL; upper four are edges clockwise from top")]
@@ -37,11 +37,11 @@ namespace OpenRA.Mods.Common.Traits
public readonly bool UseExtendedIndex = false; public readonly bool UseExtendedIndex = false;
[Desc("Override for source art that doesn't define a fully shrouded tile")] [Desc("Override for source art that doesn't define a fully shrouded tile")]
public readonly string OverrideFullShroud = null; [SequenceReference("Sequence")] public readonly string OverrideFullShroud = null;
public readonly int OverrideShroudIndex = 15; public readonly int OverrideShroudIndex = 15;
[Desc("Override for source art that doesn't define a fully fogged tile")] [Desc("Override for source art that doesn't define a fully fogged tile")]
public readonly string OverrideFullFog = null; [SequenceReference("Sequence")] public readonly string OverrideFullFog = null;
public readonly int OverrideFogIndex = 15; public readonly int OverrideFogIndex = 15;
public readonly BlendMode ShroudBlend = BlendMode.Alpha; public readonly BlendMode ShroudBlend = BlendMode.Alpha;

View File

@@ -31,9 +31,9 @@ namespace OpenRA.Mods.Common.Traits
public readonly string SmokeType = "smoke_m"; public readonly string SmokeType = "smoke_m";
[SequenceReference("SmokeType")] public readonly string SmokeSequence = "idle"; [SequenceReference("SmokeType")] public readonly string SmokeSequence = "idle";
public readonly string SmokePalette = "effect"; [PaletteReference] public readonly string SmokePalette = "effect";
public readonly string Palette = "terrain"; [PaletteReference] public readonly string Palette = "terrain";
public object Create(ActorInitializer init) { return new SmudgeLayer(init.Self, this); } public object Create(ActorInitializer init) { return new SmudgeLayer(init.Self, this); }
} }

View File

@@ -16,6 +16,7 @@ namespace OpenRA.Mods.Common.Traits
{ {
public class VoxelNormalsPaletteInfo : ITraitInfo public class VoxelNormalsPaletteInfo : ITraitInfo
{ {
[PaletteDefinition]
public readonly string Name = "normals"; public readonly string Name = "normals";
[Desc("Can be TiberianSun or RedAlert2")] [Desc("Can be TiberianSun or RedAlert2")]

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")]
public readonly string Palette = null; [PaletteReference] 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")]
public readonly string Palette = null; [PaletteReference] 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")]
public readonly string Palette = null; [PaletteReference] 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

@@ -19,14 +19,17 @@ namespace OpenRA.Mods.D2k.Traits
{ {
class FogPaletteFromR8Info : ITraitInfo class FogPaletteFromR8Info : ITraitInfo
{ {
[FieldLoader.Require] [FieldLoader.Require, PaletteDefinition]
[Desc("Internal palette name")] [Desc("Internal palette name")]
public readonly string Name = null; public readonly string Name = null;
[FieldLoader.Require] [FieldLoader.Require]
[Desc("Filename to load")] [Desc("Filename to load")]
public readonly string Filename = null; public readonly string Filename = null;
[Desc("Palette byte offset")] [Desc("Palette byte offset")]
public readonly long Offset = 0; public readonly long Offset = 0;
public readonly bool AllowModifiers = true; public readonly bool AllowModifiers = true;
public readonly bool InvertColor = false; public readonly bool InvertColor = false;

View File

@@ -19,14 +19,17 @@ namespace OpenRA.Mods.D2k.Traits
{ {
class PaletteFromR8Info : ITraitInfo class PaletteFromR8Info : ITraitInfo
{ {
[FieldLoader.Require] [FieldLoader.Require, PaletteDefinition]
[Desc("Internal palette name")] [Desc("Internal palette name")]
public readonly string Name = null; public readonly string Name = null;
[FieldLoader.Require] [FieldLoader.Require]
[Desc("Filename to load")] [Desc("Filename to load")]
public readonly string Filename = null; public readonly string Filename = null;
[Desc("Palette byte offset")] [Desc("Palette byte offset")]
public readonly long Offset = 0; public readonly long Offset = 0;
public readonly bool AllowModifiers = true; public readonly bool AllowModifiers = true;
public readonly bool InvertColor = false; public readonly bool InvertColor = false;

View File

@@ -19,11 +19,11 @@ namespace OpenRA.Mods.D2k.Traits
[Desc("Create a palette by applying a scale and offset to the colors in another palette.")] [Desc("Create a palette by applying a scale and offset to the colors in another palette.")]
class PaletteFromScaledPaletteInfo : ITraitInfo class PaletteFromScaledPaletteInfo : ITraitInfo
{ {
[FieldLoader.Require] [FieldLoader.Require, PaletteDefinition]
[Desc("Internal palette name")] [Desc("Internal palette name")]
public readonly string Name = null; public readonly string Name = null;
[FieldLoader.Require] [FieldLoader.Require, PaletteReference]
[Desc("The name of the palette to base off.")] [Desc("The name of the palette to base off.")]
public readonly string BasePalette = null; public readonly string BasePalette = null;

View File

@@ -24,7 +24,7 @@ namespace OpenRA.Mods.RA.Effects
[SequenceReference("Image")] public readonly string BrightSequence = "bright"; [SequenceReference("Image")] public readonly string BrightSequence = "bright";
[SequenceReference("Image")] public readonly string DimSequence = "dim"; [SequenceReference("Image")] public readonly string DimSequence = "dim";
public readonly string Palette = "effect"; [PaletteReference] public readonly string Palette = "effect";
public readonly int BrightZaps = 1; public readonly int BrightZaps = 1;
public readonly int DimZaps = 2; public readonly int DimZaps = 2;

View File

@@ -20,6 +20,7 @@ namespace OpenRA.Mods.TS.Traits
[Desc("Adds the hard-coded shroud palette to the game")] [Desc("Adds the hard-coded shroud palette to the game")]
class TSShroudPaletteInfo : ITraitInfo class TSShroudPaletteInfo : ITraitInfo
{ {
[FieldLoader.Require, PaletteDefinition]
[Desc("Internal palette name")] [Desc("Internal palette name")]
public readonly string Name = "shroud"; public readonly string Name = "shroud";

View File

@@ -54,6 +54,7 @@
B: 0 B: 0
A: 180 A: 180
ShroudPalette@shroud: ShroudPalette@shroud:
Name: shroud
Type: Shroud Type: Shroud
ShroudPalette@fog: ShroudPalette@fog:
Name: fog Name: fog

View File

@@ -56,6 +56,7 @@
B: 0 B: 0
A: 180 A: 180
ShroudPalette@shroud: ShroudPalette@shroud:
Name: shroud
Type: Shroud Type: Shroud
ShroudPalette@fog: ShroudPalette@fog:
Name: fog Name: fog

View File

@@ -80,6 +80,7 @@
BasePalette: ra BasePalette: ra
Alpha: 0.75 Alpha: 0.75
TSShroudPalette@shroud: TSShroudPalette@shroud:
Name: shroud
Type: Shroud Type: Shroud
VoxelNormalsPalette@normals: VoxelNormalsPalette@normals:
Name: normals Name: normals