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 { } }