From 079cff0a7a3401b6406697cb7c6615da662e691c Mon Sep 17 00:00:00 2001 From: atlimit8 Date: Sat, 26 Sep 2015 11:12:39 -0500 Subject: [PATCH] IRulesetLoaded Warhead support and better error messages. --- OpenRA.Game/FieldLoader.cs | 2 +- OpenRA.Game/FileFormats/ReplayMetadata.cs | 4 +++ OpenRA.Game/GameInformation.cs | 2 +- OpenRA.Game/GameRules/Ruleset.cs | 32 ++++++++++++++++++++++- OpenRA.Game/Network/Session.cs | 8 ++++-- OpenRA.Game/Traits/TraitsInterfaces.cs | 3 ++- 6 files changed, 45 insertions(+), 6 deletions(-) diff --git a/OpenRA.Game/FieldLoader.cs b/OpenRA.Game/FieldLoader.cs index 07d2387672..5957ab158c 100644 --- a/OpenRA.Game/FieldLoader.cs +++ b/OpenRA.Game/FieldLoader.cs @@ -46,7 +46,7 @@ namespace OpenRA public static Func InvalidValueAction = (s, t, f) => { - throw new InvalidOperationException("FieldLoader: Cannot parse `{0}` into `{1}.{2}` ".F(s, f, t)); + throw new YamlException("FieldLoader: Cannot parse `{0}` into `{1}.{2}` ".F(s, f, t)); }; public static Action UnknownFieldAction = (s, f) => diff --git a/OpenRA.Game/FileFormats/ReplayMetadata.cs b/OpenRA.Game/FileFormats/ReplayMetadata.cs index d8e0be7449..ca2a895e1d 100644 --- a/OpenRA.Game/FileFormats/ReplayMetadata.cs +++ b/OpenRA.Game/FileFormats/ReplayMetadata.cs @@ -102,6 +102,10 @@ namespace OpenRA.FileFormats { return new ReplayMetadata(fs, path); } + catch (YamlException ex) + { + Log.Write("debug", ex.ToString()); + } catch (InvalidOperationException ex) { Log.Write("debug", ex.ToString()); diff --git a/OpenRA.Game/GameInformation.cs b/OpenRA.Game/GameInformation.cs index 50ceef446b..67c496bc64 100644 --- a/OpenRA.Game/GameInformation.cs +++ b/OpenRA.Game/GameInformation.cs @@ -70,7 +70,7 @@ namespace OpenRA return info; } - catch (InvalidOperationException) + catch (YamlException) { Log.Write("debug", "GameInformation deserialized invalid MiniYaml:\n{0}".F(data)); throw; diff --git a/OpenRA.Game/GameRules/Ruleset.cs b/OpenRA.Game/GameRules/Ruleset.cs index 19dbf28449..2b27910440 100644 --- a/OpenRA.Game/GameRules/Ruleset.cs +++ b/OpenRA.Game/GameRules/Ruleset.cs @@ -44,8 +44,38 @@ namespace OpenRA Sequences = new ReadOnlyDictionary(sequences); foreach (var a in Actors.Values) + { foreach (var t in a.TraitInfos()) - t.RulesetLoaded(this, a); + { + try + { + t.RulesetLoaded(this, a); + } + catch (YamlException e) + { + throw new YamlException("Actor type {0}: {1}".F(a.Name, e.Message)); + } + } + } + + foreach (var weapon in Weapons) + { + foreach (var warhead in weapon.Value.Warheads) + { + var cacher = warhead as IRulesetLoaded; + if (cacher != null) + { + try + { + cacher.RulesetLoaded(this, weapon.Value); + } + catch (YamlException e) + { + throw new YamlException("Weapon type {0}: {1}".F(weapon.Key, e.Message)); + } + } + } + } } public IEnumerable> InstalledMusic { get { return Music.Where(m => m.Value.Exists); } } diff --git a/OpenRA.Game/Network/Session.cs b/OpenRA.Game/Network/Session.cs index d4a09185a0..e452f09a07 100644 --- a/OpenRA.Game/Network/Session.cs +++ b/OpenRA.Game/Network/Session.cs @@ -59,9 +59,13 @@ namespace OpenRA.Network return session; } - catch (InvalidOperationException e) + catch (YamlException) { - throw new InvalidOperationException("Session deserialized invalid MiniYaml:\n{0}".F(data), e); + throw new YamlException("Session deserialized invalid MiniYaml:\n{0}".F(data)); + } + catch (InvalidOperationException) + { + throw new YamlException("Session deserialized invalid MiniYaml:\n{0}".F(data)); } } diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 96d4a0a8c5..95cd22a7dc 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -369,5 +369,6 @@ namespace OpenRA.Traits bool RemoveActor(Actor self, Player owner); } - public interface IRulesetLoaded : ITraitInfo { void RulesetLoaded(Ruleset rules, ActorInfo ai); } + public interface IRulesetLoaded { void RulesetLoaded(Ruleset rules, TInfo info); } + public interface IRulesetLoaded : IRulesetLoaded, ITraitInfo { } }