From 1a9c762115f02c41251d0a25484b66c2d77c0719 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Thu, 15 Aug 2013 07:55:37 +0200 Subject: [PATCH] add location in sequence yaml to FormatExceptions --- OpenRA.Game/Graphics/Sequence.cs | 153 ++++++++++++++++--------------- 1 file changed, 80 insertions(+), 73 deletions(-) diff --git a/OpenRA.Game/Graphics/Sequence.cs b/OpenRA.Game/Graphics/Sequence.cs index 5e6d771448..0bcd018cc7 100644 --- a/OpenRA.Game/Graphics/Sequence.cs +++ b/OpenRA.Game/Graphics/Sequence.cs @@ -40,83 +40,90 @@ namespace OpenRA.Graphics var offset = float2.Zero; var blendMode = BlendMode.Alpha; - if (d.ContainsKey("Start")) - Start = int.Parse(d["Start"].Value); - - if (d.ContainsKey("Offset")) - offset = FieldLoader.GetValue("Offset", d["Offset"].Value); - - if (d.ContainsKey("BlendMode")) - blendMode = FieldLoader.GetValue("BlendMode", d["BlendMode"].Value); - - // Apply offset to each sprite in the sequence - // Different sequences may apply different offsets to the same frame - sprites = Game.modData.SpriteLoader.LoadAllSprites(srcOverride ?? unit).Select( - s => new Sprite(s.sheet, s.bounds, s.offset + offset, s.channel, blendMode)).ToArray(); - - if (!d.ContainsKey("Length")) - Length = 1; - else if (d["Length"].Value == "*") - Length = sprites.Length - Start; - else - Length = int.Parse(d["Length"].Value); - - if (d.ContainsKey("Stride")) - Stride = int.Parse(d["Stride"].Value); - else - Stride = Length; - - if (d.ContainsKey("Facings")) + try { - var f = int.Parse(d["Facings"].Value); - Facings = Math.Abs(f); - reverseFacings = f < 0; + if (d.ContainsKey("Start")) + Start = int.Parse(d["Start"].Value); + + if (d.ContainsKey("Offset")) + offset = FieldLoader.GetValue("Offset", d["Offset"].Value); + + if (d.ContainsKey("BlendMode")) + blendMode = FieldLoader.GetValue("BlendMode", d["BlendMode"].Value); + + // Apply offset to each sprite in the sequence + // Different sequences may apply different offsets to the same frame + sprites = Game.modData.SpriteLoader.LoadAllSprites(srcOverride ?? unit).Select( + s => new Sprite(s.sheet, s.bounds, s.offset + offset, s.channel, blendMode)).ToArray(); + + if (!d.ContainsKey("Length")) + Length = 1; + else if (d["Length"].Value == "*") + Length = sprites.Length - Start; + else + Length = int.Parse(d["Length"].Value); + + if (d.ContainsKey("Stride")) + Stride = int.Parse(d["Stride"].Value); + else + Stride = Length; + + if (d.ContainsKey("Facings")) + { + var f = int.Parse(d["Facings"].Value); + Facings = Math.Abs(f); + reverseFacings = f < 0; + } + else + Facings = 1; + + if (d.ContainsKey("Tick")) + Tick = int.Parse(d["Tick"].Value); + else + Tick = 40; + + if (d.ContainsKey("Transpose")) + transpose = bool.Parse(d["Transpose"].Value); + + if (d.ContainsKey("Frames")) + Frames = Array.ConvertAll(d["Frames"].Value.Split(','), int.Parse); + + if (d.ContainsKey("ShadowStart")) + ShadowStart = int.Parse(d["ShadowStart"].Value); + else + ShadowStart = -1; + + if (d.ContainsKey("ShadowZOffset")) + { + WRange r; + if (WRange.TryParse(d["ShadowZOffset"].Value, out r)) + ShadowZOffset = r.Range; + } + else + ShadowZOffset = -5; + + if (d.ContainsKey("ZOffset")) + { + WRange r; + if (WRange.TryParse(d["ZOffset"].Value, out r)) + ZOffset = r.Range; + } + + if (Length > Stride) + throw new InvalidOperationException( + "{0}: Sequence {1}.{2}: Length must be <= stride" + .F(info.Nodes[0].Location, unit, name)); + + if (Start < 0 || Start + Facings * Stride > sprites.Length || ShadowStart + Facings * Stride > sprites.Length) + throw new InvalidOperationException( + "{6}: Sequence {0}.{1} uses frames [{2}..{3}] of SHP `{4}`, but only 0..{5} actually exist" + .F(unit, name, Start, Start + Facings * Stride - 1, srcOverride ?? unit, sprites.Length - 1, + info.Nodes[0].Location)); } - else - Facings = 1; - - if (d.ContainsKey("Tick")) - Tick = int.Parse(d["Tick"].Value); - else - Tick = 40; - - if (d.ContainsKey("Transpose")) - transpose = bool.Parse(d["Transpose"].Value); - - if (d.ContainsKey("Frames")) - Frames = Array.ConvertAll(d["Frames"].Value.Split(','), int.Parse); - - if (d.ContainsKey("ShadowStart")) - ShadowStart = int.Parse(d["ShadowStart"].Value); - else - ShadowStart = -1; - - if (d.ContainsKey("ShadowZOffset")) + catch (FormatException f) { - WRange r; - if (WRange.TryParse(d["ShadowZOffset"].Value, out r)) - ShadowZOffset = r.Range; + throw new FormatException("Failed to parse sequences for {0}.{1} at {2}:\n{3}".F(unit, name, info.Nodes[0].Location, f)); } - else - ShadowZOffset = -5; - - if (d.ContainsKey("ZOffset")) - { - WRange r; - if (WRange.TryParse(d["ZOffset"].Value, out r)) - ZOffset = r.Range; - } - - if (Length > Stride) - throw new InvalidOperationException( - "{0}: Sequence {1}.{2}: Length must be <= stride" - .F(info.Nodes[0].Location, unit, name)); - - if (Start < 0 || Start + Facings * Stride > sprites.Length || ShadowStart + Facings * Stride > sprites.Length) - throw new InvalidOperationException( - "{6}: Sequence {0}.{1} uses frames [{2}..{3}] of SHP `{4}`, but only 0..{5} actually exist" - .F(unit, name, Start, Start + Facings * Stride - 1, srcOverride ?? unit, sprites.Length - 1, - info.Nodes[0].Location)); } public Sprite GetSprite(int frame)