From 915c9460cf3f7862c4678b85603e0dd2ed7d297c Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Mon, 28 Jun 2010 12:38:35 +1200 Subject: [PATCH] Theater specific artwork done properly --- OpenRA.Editor/Form1.cs | 15 +- OpenRA.Game/Graphics/SequenceProvider.cs | 13 +- OpenRA.Game/Traits/Render/RenderSimple.cs | 14 +- mods/cnc/civilian.yaml | 80 ++++++++-- mods/cnc/defaults.yaml | 9 ++ mods/cnc/sequences-map.xml | 171 ++++++++-------------- 6 files changed, 165 insertions(+), 137 deletions(-) diff --git a/OpenRA.Editor/Form1.cs b/OpenRA.Editor/Form1.cs index 8e1449f1f1..d65d5fe27c 100644 --- a/OpenRA.Editor/Form1.cs +++ b/OpenRA.Editor/Form1.cs @@ -147,7 +147,7 @@ namespace OpenRA.Editor try { var info = Rules.Info[a]; - var template = RenderActor(info, tileset.TileSuffix, palette); + var template = RenderActor(info, tileset, palette); var ibox = new PictureBox { Image = template.Bitmap, @@ -241,10 +241,17 @@ namespace OpenRA.Editor return bitmap; } - static ActorTemplate RenderActor(ActorInfo info, string ext, Palette p) + static ActorTemplate RenderActor(ActorInfo info, TileSet tileset, Palette p) { - var image = info.Traits.Get().Image ?? info.Name; - using (var s = FileSystem.OpenWithExts(image, "." + ext, ".shp")) + var ri = info.Traits.Get(); + string image = null; + if (ri.OverrideTheater != null) + for (int i = 0; i < ri.OverrideTheater.Length; i++) + if (ri.OverrideTheater[i] == tileset.Id) + image = ri.OverrideImage[i]; + + image = image ?? ri.Image ?? info.Name; + using (var s = FileSystem.OpenWithExts(image, "." + tileset.TileSuffix, ".shp")) { var shp = new ShpReader(s); var frame = shp[0]; diff --git a/OpenRA.Game/Graphics/SequenceProvider.cs b/OpenRA.Game/Graphics/SequenceProvider.cs index e28517a50b..4d2fd1b3ae 100644 --- a/OpenRA.Game/Graphics/SequenceProvider.cs +++ b/OpenRA.Game/Graphics/SequenceProvider.cs @@ -78,23 +78,16 @@ namespace OpenRA.Graphics public static Sequence GetSequence(string unitName, string sequenceName) { - try { return units[unitName+"@"+currentTheater][sequenceName]; } + try { return units[unitName][sequenceName]; } catch (KeyNotFoundException) { - try { return units[unitName][sequenceName]; } - catch (KeyNotFoundException) - { - throw new InvalidOperationException( - "Unit `{0}` does not have a sequence `{1}`".F(unitName, sequenceName)); - } + throw new InvalidOperationException( + "Unit `{0}` does not have a sequence `{1}`".F(unitName, sequenceName)); } } public static bool HasSequence(string unit, string seq) { - if (units.ContainsKey(unit+"@"+currentTheater)) - return units[unit+"@"+currentTheater].ContainsKey(seq); - return units[unit].ContainsKey(seq); } diff --git a/OpenRA.Game/Traits/Render/RenderSimple.cs b/OpenRA.Game/Traits/Render/RenderSimple.cs index 809afd64f6..015d696c77 100644 --- a/OpenRA.Game/Traits/Render/RenderSimple.cs +++ b/OpenRA.Game/Traits/Render/RenderSimple.cs @@ -27,6 +27,8 @@ namespace OpenRA.Traits public abstract class RenderSimpleInfo : ITraitInfo { public readonly string Image = null; + public readonly string[] OverrideTheater = null; + public readonly string[] OverrideImage = null; public readonly string Palette = null; public abstract object Create(ActorInitializer init); } @@ -36,9 +38,19 @@ namespace OpenRA.Traits public Dictionary anims = new Dictionary(); public Animation anim { get { return anims[""].Animation; } protected set { anims[""].Animation = value; } } + string cachedImage = null; public string GetImage(Actor self) { - return self.Info.Traits.Get().Image ?? self.Info.Name; + if (cachedImage != null) + return cachedImage; + + var Info = self.Info.Traits.Get(); + if (Info.OverrideTheater != null) + for (int i = 0; i < Info.OverrideTheater.Length; i++) + if (Info.OverrideTheater[i] == self.World.Map.Theater) + return cachedImage = Info.OverrideImage[i]; + + return cachedImage = Info.Image ?? self.Info.Name; } public RenderSimple(Actor self, Func baseFacing) diff --git a/mods/cnc/civilian.yaml b/mods/cnc/civilian.yaml index 0468a28b7d..d40f65e2fa 100644 --- a/mods/cnc/civilian.yaml +++ b/mods/cnc/civilian.yaml @@ -1,5 +1,8 @@ V01: Inherits: ^CivBuilding + RenderBuilding: + OverrideTheater: DESERT + OverrideImage: v25 Building: Footprint: xx xx Dimensions: 2,2 @@ -8,6 +11,9 @@ V01: V02: Inherits: ^CivBuilding + RenderBuilding: + OverrideTheater: DESERT + OverrideImage: v20 Building: Footprint: xx xx Dimensions: 2,2 @@ -17,80 +23,124 @@ V03: Building: Footprint: xx xx Dimensions: 2,2 + RenderBuilding: + OverrideTheater: DESERT + OverrideImage: v21 V04: Inherits: ^CivBuilding Building: Footprint: xx xx Dimensions: 2,2 + RenderBuilding: + OverrideTheater: DESERT + OverrideImage: v24 V05: Inherits: ^CivBuilding Building: Footprint: xx Dimensions: 2,1 + RenderBuilding: + OverrideTheater: DESERT + OverrideImage: v22 V06: Inherits: ^CivBuilding Building: Footprint: xx Dimensions: 2,1 + RenderBuilding: + OverrideTheater: DESERT + OverrideImage: v26 V07: Inherits: ^CivBuilding Building: Footprint: xx Dimensions: 2,1 + RenderBuilding: + OverrideTheater: DESERT + OverrideImage: v30 V08: Inherits: ^CivBuilding + RenderBuilding: + OverrideTheater: DESERT + OverrideImage: v23 V09: Inherits: ^CivBuilding + RenderBuilding: + OverrideTheater: DESERT + OverrideImage: v27 V10: Inherits: ^CivBuilding + RenderBuilding: + OverrideTheater: DESERT + OverrideImage: v28 V11: Inherits: ^CivBuilding + RenderBuilding: + OverrideTheater: DESERT + OverrideImage: v29 V12: Inherits: ^CivBuilding + RenderBuilding: + OverrideTheater: DESERT + OverrideImage: v34 V13: Inherits: ^CivBuilding + RenderBuilding: + OverrideTheater: DESERT + OverrideImage: v35 V14: - Inherits: ^CivBuilding - Valued: - Description: Field + Inherits: ^CivField V15: - Inherits: ^CivBuilding - Valued: - Description: Field + Inherits: ^CivField V16: - Inherits: ^CivBuilding - Valued: - Description: Field + Inherits: ^CivField V17: - Inherits: ^CivBuilding - Valued: - Description: Field + Inherits: ^CivField V18: - Inherits: ^CivBuilding - Valued: - Description: Field + Inherits: ^CivField V31: Inherits: ^CivBuilding + Building: + Footprint: xx + Dimensions: 2,1 + RenderBuilding: + Image: v05 + OverrideTheater: DESERT + OverrideImage: v31 V32: Inherits: ^CivBuilding + Building: + Footprint: xx + Dimensions: 2,1 + RenderBuilding: + Image: v05 + OverrideTheater: DESERT + OverrideImage: v32 V33: Inherits: ^CivBuilding + Building: + Footprint: xx + Dimensions: 2,1 + RenderBuilding: + Image: v05 + OverrideTheater: DESERT + OverrideImage: v33 BARB: Inherits: ^Wall diff --git a/mods/cnc/defaults.yaml b/mods/cnc/defaults.yaml index 20cef07a34..3a4867c0d9 100644 --- a/mods/cnc/defaults.yaml +++ b/mods/cnc/defaults.yaml @@ -106,6 +106,15 @@ Valued: Description: Civilian Building +^CivField: + Inherits: ^CivBuilding + -Selectable: + Valued: + Description: Field + RenderBuilding: + OverrideTheater: DESERT + OverrideImage: v23 + ^Wall: Category: Building Building: diff --git a/mods/cnc/sequences-map.xml b/mods/cnc/sequences-map.xml index 350dcd60b0..303b29fc43 100644 --- a/mods/cnc/sequences-map.xml +++ b/mods/cnc/sequences-map.xml @@ -135,130 +135,142 @@ - - - - + + + + + - - - - + + + + + - - - - + + + + + - - - - + + + + + - - - - + + + + + - - - - + + + + + - - - - + + + + + - - - - + + + + + - - - - + + + + + - - - - + + + + + - - - - + + + + + - - - - + + + + + - - - - + + + + @@ -287,31 +299,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - @@ -329,34 +316,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file