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)]
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
{
[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")]
public readonly string Name = "resources";
[PaletteDefinition] public readonly string Name = "resources";
[Desc("Remap these indices to pre-defined colors.")]
public readonly int[] RemapIndex = { };
[Desc("The fixed color to remap.")]
public readonly HSLColor Color;
[Desc("Luminosity range to span.")]
public readonly float Ramp = 0.05f;
[Desc("Allow palette modifiers to change the palette.")]
public readonly bool AllowModifiers = true;

View File

@@ -17,13 +17,17 @@ namespace OpenRA.Traits
public class PlayerColorPaletteInfo : ITraitInfo
{
[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")]
public readonly string BaseName = "player";
[Desc("Remap these indices to player colors.")]
public readonly int[] RemapIndex = { };
[Desc("Luminosity range to span.")]
public readonly float Ramp = 0.05f;
[Desc("Allow palette modifiers to change the palette.")]
public readonly bool AllowModifiers = true;

View File

@@ -17,7 +17,7 @@ namespace OpenRA.Traits
{
public readonly string Sequence = "resources";
[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 ValuePerUnit = 0;

View File

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

View File

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

View File

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

View File

@@ -25,7 +25,7 @@ namespace OpenRA.Mods.Common.Effects
public readonly string Image = null;
[SequenceReference("Image")] public readonly string Sequence = "idle";
public readonly string Palette = "effect";
[PaletteReference] public readonly string Palette = "effect";
public readonly bool Shadow = false;
@@ -59,7 +59,8 @@ namespace OpenRA.Mods.Common.Effects
[Desc("Interval in ticks between each spawned Trail animation.")]
public readonly int TrailInterval = 2;
public readonly string TrailPalette = "effect";
[PaletteReference] public readonly string TrailPalette = "effect";
public readonly bool TrailUsePlayerPalette = false;
public readonly int ContrailLength = 0;
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\VoxelRenderable.cs" />
<Compile Include="Lint\CheckSequences.cs" />
<Compile Include="Lint\CheckPalettes.cs" />
<Compile Include="Lint\CheckPlayers.cs" />
<Compile Include="Lint\CheckActors.cs" />
<Compile Include="Lint\CheckMapCordon.cs" />

View File

@@ -57,7 +57,7 @@ namespace OpenRA.Mods.Common.Traits
public readonly string MuzzleSequence = null;
[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")]
public readonly int MuzzleSplitFacings = 0;

View File

@@ -39,7 +39,7 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Fire port yaw cone angle.")]
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); }
}

View File

@@ -33,7 +33,7 @@ namespace OpenRA.Mods.Common.Traits
public readonly string ForceFaction = null;
[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
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>
{
[SequenceReference] public readonly string Sequence = "bib";
public readonly string Palette = "terrain";
[PaletteReference] public readonly string Palette = "terrain";
public readonly bool HasMinibib = false;
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";
[Desc("Overrides the IndicatorPalettePrefix.")]
public readonly string IndicatorPalette = "";
[PaletteReference] public readonly string IndicatorPalette = "";
[Desc("Suffixed by the interal repairing player name.")]
public readonly string IndicatorPalettePrefix = "player";

View File

@@ -34,7 +34,7 @@ namespace OpenRA.Mods.Common.Traits
public readonly string CloakSound = null;
public readonly string UncloakSound = null;
public readonly string Palette = "cloak";
[PaletteReference] public readonly string Palette = "cloak";
public readonly string[] CloakTypes = { "Cloak" };

View File

@@ -23,7 +23,7 @@ namespace OpenRA.Mods.Common.Traits
public readonly string Effect = null;
[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.")]
public readonly string Notification = null;

View File

@@ -27,7 +27,7 @@ namespace OpenRA.Mods.Common.Traits
public readonly Dictionary<int, string[]> Upgrades = null;
[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?")]
public readonly bool SuppressLevelupAnimation = true;

View File

@@ -18,7 +18,7 @@ namespace OpenRA.Mods.Common.Traits
public class UpgradeOverlayInfo : UpgradableTraitInfo
{
[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); }
}

View File

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

View File

@@ -19,7 +19,7 @@ namespace OpenRA.Mods.Common.Traits
public class PlaceBuildingInfo : ITraitInfo
{
[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.")]
public readonly int NewOptionsNotificationDelay = 10;

View File

@@ -18,7 +18,7 @@ namespace OpenRA.Mods.Common.Traits
public class LeavesTrailsInfo : ITraitInfo
{
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.")]
public readonly string[] TerrainTypes = { };

View File

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

View File

@@ -28,12 +28,12 @@ namespace OpenRA.Mods.Common.Traits
public readonly string Image = null;
[Desc("Custom palette name")]
public readonly string Palette = null;
[PaletteReference] public readonly string Palette = null;
[Desc("Custom PlayerColorPalette: BaseName")]
public readonly string PlayerPalette = "player";
public readonly string NormalsPalette = "normals";
public readonly string ShadowPalette = "shadow";
[PaletteReference] public readonly string PlayerPalette = "player";
[PaletteReference] public readonly string NormalsPalette = "normals";
[PaletteReference] public readonly string ShadowPalette = "shadow";
[Desc("Change the image size.")]
public readonly float Scale = 10;

View File

@@ -19,7 +19,7 @@ namespace OpenRA.Mods.Common.Traits
{
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.",
"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;
[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); }
}

View File

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

View File

@@ -38,7 +38,7 @@ namespace OpenRA.Mods.Common.Traits
public readonly string Sequence = null;
[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." +
"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")]
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); }
}

View File

@@ -26,7 +26,7 @@ namespace OpenRA.Mods.Common.Traits
public readonly WVec Offset = WVec.Zero;
[Desc("Custom palette name")]
public readonly string Palette = null;
[PaletteReference] public readonly string Palette = null;
[Desc("Custom palette is a player palette BaseName")]
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.")]
class WithShadowInfo : ITraitInfo
{
public readonly string Palette = "shadow";
[PaletteReference] public readonly string Palette = "shadow";
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;
[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")]
public readonly bool DisplayBeacon = false;
public readonly string BeaconPalettePrefix = "player";
public readonly string BeaconPoster = null;
public readonly string BeaconPosterPalette = "chrome";
[PaletteReference] public readonly string BeaconPosterPalette = "chrome";
public readonly bool DisplayRadarPing = false;

View File

@@ -27,7 +27,7 @@ namespace OpenRA.Mods.Common.Traits
[SequenceReference("Image")] public readonly string Sequence = null;
[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. ",
"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")]
class PaletteFromCurrentTilesetInfo : ITraitInfo
{
[FieldLoader.Require]
[FieldLoader.Require, PaletteDefinition]
[Desc("internal palette name")]
public readonly string Name = null;
[Desc("Map listed indices to shadow. Ignores previous color.")]
public readonly int[] ShadowIndex = { };
public readonly bool AllowModifiers = true;
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
{
[FieldLoader.Require]
[FieldLoader.Require, PaletteDefinition]
[Desc("internal palette name")]
public readonly string Name = null;
[Desc("If defined, load the palette only for this tileset.")]
public readonly string Tileset = null;
[FieldLoader.Require]
[Desc("filename to load")]
public readonly string Filename = null;
[Desc("Map listed indices to shadow. Ignores previous color.")]
public readonly int[] ShadowIndex = { };
public readonly bool AllowModifiers = true;
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.")]
class PaletteFromPaletteWithAlphaInfo : ITraitInfo
{
[FieldLoader.Require]
[FieldLoader.Require, PaletteDefinition]
[Desc("Internal palette name")]
public readonly string Name = null;
[FieldLoader.Require]
[FieldLoader.Require, PaletteReference]
[Desc("The name of the palette to base off.")]
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.")]
class PaletteFromRGBAInfo : ITraitInfo
{
[FieldLoader.Require]
[FieldLoader.Require, PaletteDefinition]
[Desc("internal palette name")]
public readonly string Name = null;
[Desc("If defined, load the palette only for this tileset.")]
public readonly string Tileset = null;
[Desc("red color component")]
public readonly int R = 0;
[Desc("green color component")]
public readonly int G = 0;
[Desc("blue color component")]
public readonly int B = 0;
[Desc("alpha channel (transparency)")]
public readonly int A = 255;
public readonly bool AllowModifiers = true;
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
{
[FieldLoader.Require]
[FieldLoader.Require, PaletteDefinition]
[Desc("internal palette name")]
public readonly string Name = null;
[Desc("Map listed indices to shadow.")]

View File

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

View File

@@ -23,11 +23,11 @@ namespace OpenRA.Mods.Common.Traits
public class ShroudRendererInfo : ITraitInfo
{
public readonly string Sequence = "shroud";
public readonly string[] ShroudVariants = new[] { "shroud" };
public readonly string[] FogVariants = new[] { "fog" };
[SequenceReference("Sequence")] public readonly string[] ShroudVariants = new[] { "shroud" };
[SequenceReference("Sequence")] public readonly string[] FogVariants = new[] { "fog" };
public readonly string ShroudPalette = "shroud";
public readonly string FogPalette = "fog";
[PaletteReference] public readonly string ShroudPalette = "shroud";
[PaletteReference] public readonly string FogPalette = "fog";
[Desc("Bitfield of shroud directions for each frame. Lower four bits are",
"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;
[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;
[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 BlendMode ShroudBlend = BlendMode.Alpha;

View File

@@ -31,9 +31,9 @@ namespace OpenRA.Mods.Common.Traits
public readonly string SmokeType = "smoke_m";
[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); }
}

View File

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

View File

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

View File

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

View File

@@ -19,14 +19,17 @@ namespace OpenRA.Mods.D2k.Traits
{
class PaletteFromR8Info : ITraitInfo
{
[FieldLoader.Require]
[FieldLoader.Require, PaletteDefinition]
[Desc("Internal palette name")]
public readonly string Name = null;
[FieldLoader.Require]
[Desc("Filename to load")]
public readonly string Filename = null;
[Desc("Palette byte offset")]
public readonly long Offset = 0;
public readonly bool AllowModifiers = true;
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.")]
class PaletteFromScaledPaletteInfo : ITraitInfo
{
[FieldLoader.Require]
[FieldLoader.Require, PaletteDefinition]
[Desc("Internal palette name")]
public readonly string Name = null;
[FieldLoader.Require]
[FieldLoader.Require, PaletteReference]
[Desc("The name of the palette to base off.")]
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 DimSequence = "dim";
public readonly string Palette = "effect";
[PaletteReference] public readonly string Palette = "effect";
public readonly int BrightZaps = 1;
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")]
class TSShroudPaletteInfo : ITraitInfo
{
[FieldLoader.Require, PaletteDefinition]
[Desc("Internal palette name")]
public readonly string Name = "shroud";

View File

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

View File

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

View File

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