diff --git a/OpenRA.Game/WAngle.cs b/OpenRA.Game/WAngle.cs index ab16e4b0a5..74cec071bd 100644 --- a/OpenRA.Game/WAngle.cs +++ b/OpenRA.Game/WAngle.cs @@ -19,6 +19,7 @@ namespace OpenRA public struct WAngle : IEquatable { public readonly int Angle; + public int AngleSquared { get { return (int)Angle * Angle; } } public WAngle(int a) { diff --git a/OpenRA.Mods.Common/Lint/CheckAngle.cs b/OpenRA.Mods.Common/Lint/CheckAngle.cs new file mode 100644 index 0000000000..64fcb15039 --- /dev/null +++ b/OpenRA.Mods.Common/Lint/CheckAngle.cs @@ -0,0 +1,70 @@ +#region Copyright & License Information +/* + * Copyright 2007-2016 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, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System; +using System.Linq; +using OpenRA.Mods.Common.Projectiles; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Lint +{ + class CheckAngle : ILintRulesPass + { + public void Run(Action emitError, Action emitWarning, Ruleset rules) + { + foreach (var weaponInfo in rules.Weapons) + { + var missile = weaponInfo.Value.Projectile as MissileInfo; + if (missile != null) + { + var minAngle = missile.MinimumLaunchAngle.Angle; + var maxAngle = missile.MaximumLaunchAngle.Angle; + + // If both angles are identical, we only need to test one of them + var testMaxAngle = minAngle != maxAngle; + CheckLaunchAngles(weaponInfo.Key, minAngle, testMaxAngle, maxAngle, emitError); + } + + var bullet = weaponInfo.Value.Projectile as BulletInfo; + if (bullet != null) + { + var minAngle = bullet.LaunchAngle[0].Angle; + var maxAngle = bullet.LaunchAngle.Length > 1 ? bullet.LaunchAngle[1].Angle : minAngle; + + // If both angles are identical, we only need to test one of them + var testMaxAngle = minAngle != maxAngle; + CheckLaunchAngles(weaponInfo.Key, minAngle, testMaxAngle, maxAngle, emitError); + } + } + } + + static bool InvalidAngle(int value) + { + return value > 255 && value < 769; + } + + static void CheckLaunchAngles(string weaponInfo, int minAngle, bool testMaxAngle, int maxAngle, Action emitError) + { + if (InvalidAngle(minAngle)) + emitError("Weapon `{0}`: Projectile minimum LaunchAngle must not exceed (-)255!".F(weaponInfo)); + if (testMaxAngle && InvalidAngle(maxAngle)) + emitError("Weapon `{0}`: Projectile maximum LaunchAngle must not exceed (-)255!".F(weaponInfo)); + + if ((minAngle < 256) && (maxAngle < 256) && (minAngle > maxAngle)) + emitError("Weapon `{0}`: Projectile minimum LaunchAngle must not exceed maximum LaunchAngle!".F(weaponInfo)); + if ((minAngle > 768) && (maxAngle > 768) && (minAngle > maxAngle)) + emitError("Weapon `{0}`: Projectile minimum LaunchAngle must not exceed maximum LaunchAngle!".F(weaponInfo)); + if ((minAngle < 256) && (maxAngle > 768)) + emitError("Weapon `{0}`: Projectile minimum LaunchAngle must not exceed maximum LaunchAngle!".F(weaponInfo)); + } + } +} diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj index 689ba58687..0d2ef7a946 100644 --- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj +++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj @@ -168,6 +168,7 @@ +