Expose WAngle to Lua API and deprecate old Facing.

This commit is contained in:
Paul Chote
2020-06-10 20:53:44 +01:00
committed by reaperrr
parent 0349435650
commit a98e460257
6 changed files with 121 additions and 12 deletions

View File

@@ -10,13 +10,16 @@
#endregion
using System;
using Eluant;
using Eluant.ObjectBinding;
using OpenRA.Scripting;
namespace OpenRA
{
/// <summary>
/// 1D angle - 1024 units = 360 degrees.
/// </summary>
public struct WAngle : IEquatable<WAngle>
public struct WAngle : IScriptBindable, ILuaAdditionBinding, ILuaSubtractionBinding, ILuaEqualityBinding, IEquatable<WAngle>
{
public readonly int Angle;
public int AngleSquared { get { return (int)Angle * Angle; } }
@@ -169,5 +172,58 @@ namespace OpenRA
9233, 9781, 10396, 11094, 11891, 12810, 13882, 15148, 16667, 18524, 20843,
23826, 27801, 33366, 41713, 55622, 83438, 166883, int.MaxValue
};
#region Scripting interface
public LuaValue Add(LuaRuntime runtime, LuaValue left, LuaValue right)
{
WAngle a, b;
int c;
if (!left.TryGetClrValue(out a))
throw new LuaException("Attempted to call WAngle.Add(WAngle, WAngle) with invalid arguments ({0}, {1})".F(left.WrappedClrType().Name, right.WrappedClrType().Name));
if (right.TryGetClrValue(out c))
{
Game.Debug("Support for facing calculations mixing Angle with integers is deprecated. Make sure all facing calculations use Angle");
return new LuaCustomClrObject(a + FromFacing(c));
}
if (right.TryGetClrValue(out b))
return new LuaCustomClrObject(a + b);
throw new LuaException("Attempted to call WAngle.Add(WAngle, WAngle) with invalid arguments ({0}, {1})".F(left.WrappedClrType().Name, right.WrappedClrType().Name));
}
public LuaValue Subtract(LuaRuntime runtime, LuaValue left, LuaValue right)
{
WAngle a, b;
int c;
if (!left.TryGetClrValue(out a))
throw new LuaException("Attempted to call WAngle.Subtract(WAngle, WAngle) with invalid arguments ({0}, {1})".F(left.WrappedClrType().Name, right.WrappedClrType().Name));
if (right.TryGetClrValue(out c))
{
Game.Debug("Support for facing calculations mixing Angle with integers is deprecated. Make sure all facing calculations use Angle");
return new LuaCustomClrObject(a - FromFacing(c));
}
if (right.TryGetClrValue(out b))
return new LuaCustomClrObject(a - b);
throw new LuaException("Attempted to call WAngle.Subtract(WAngle, WAngle) with invalid arguments ({0}, {1})".F(left.WrappedClrType().Name, right.WrappedClrType().Name));
}
public LuaValue Equals(LuaRuntime runtime, LuaValue left, LuaValue right)
{
WAngle a, b;
if (!left.TryGetClrValue(out a) || !right.TryGetClrValue(out b))
return false;
return a == b;
}
#endregion
}
}

View File

@@ -150,7 +150,7 @@ namespace OpenRA
case "X": return X;
case "Y": return Y;
case "Z": return Z;
case "Facing": return Yaw.Facing;
case "Facing": return new LuaCustomClrObject(Yaw);
default: throw new LuaException("WVec does not define a member '{0}'".F(key));
}
}

View File

@@ -75,6 +75,20 @@ namespace OpenRA.Mods.Common.Scripting
return init;
}
// HACK: Forward compatibility for future WAngle facings
var facingInit = init as FacingInit;
if (facingInit != null)
{
WAngle angle;
if (value.TryGetClrValue(out angle))
{
facingInit.Initialize(angle.Facing);
return facingInit;
}
Game.Debug("Initializing Facing with integers is deprecated. Use Angle instead.");
}
var initializers = initType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
.Where(m => m.Name == "Initialize" && m.GetParameters().Length == 1);

View File

@@ -0,0 +1,34 @@
#region Copyright & License Information
/*
* Copyright 2007-2020 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 OpenRA.Scripting;
namespace OpenRA.Mods.Common.Scripting.Global
{
[ScriptGlobal("Angle")]
public class AngleGlobal : ScriptGlobal
{
public AngleGlobal(ScriptContext context)
: base(context) { }
public WAngle North { get { return WAngle.Zero; } }
public WAngle NorthWest { get { return new WAngle(128); } }
public WAngle West { get { return new WAngle(256); } }
public WAngle SouthWest { get { return new WAngle(384); } }
public WAngle South { get { return new WAngle(512); } }
public WAngle SouthEast { get { return new WAngle(640); } }
public WAngle East { get { return new WAngle(768); } }
public WAngle NorthEast { get { return new WAngle(896); } }
[Desc("Create an arbitrary angle.")]
public WAngle New(int a) { return new WAngle(a); }
}
}

View File

@@ -19,13 +19,18 @@ namespace OpenRA.Mods.Common.Scripting.Global
public FacingGlobal(ScriptContext context)
: base(context) { }
public int North { get { return 0; } }
public int NorthWest { get { return 32; } }
public int West { get { return 64; } }
public int SouthWest { get { return 96; } }
public int South { get { return 128; } }
public int SouthEast { get { return 160; } }
public int East { get { return 192; } }
public int NorthEast { get { return 224; } }
void Deprecated()
{
Game.Debug("The Facing table is deprecated. Use Angle instead.");
}
public int North { get { Deprecated(); return 0; } }
public int NorthWest { get { Deprecated(); return 32; } }
public int West { get { Deprecated(); return 64; } }
public int SouthWest { get { Deprecated(); return 96; } }
public int South { get { Deprecated(); return 128; } }
public int SouthEast { get { Deprecated(); return 160; } }
public int East { get { Deprecated(); return 192; } }
public int NorthEast { get { Deprecated(); return 224; } }
}
}

View File

@@ -122,14 +122,14 @@ namespace OpenRA.Mods.Common.Scripting
public WPos CenterPosition { get { return Self.CenterPosition; } }
[Desc("The direction that the actor is facing.")]
public int Facing
public WAngle Facing
{
get
{
if (facing == null)
throw new LuaException("Actor '{0}' doesn't define a facing".F(Self));
return facing.Facing.Facing;
return facing.Facing;
}
}