SET3.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using Microsoft.Xna.Framework;
  2. namespace OpenVIII.Fields.Scripts.Instructions
  3. {
  4. /// <summary>
  5. /// Place this entity's model at XCoord, YCoord, ZCoord standing on the given walkmesh triangle.
  6. /// </summary>
  7. /// <see cref="http://wiki.ffrtt.ru/index.php?title=FF8/Field/Script/Opcodes/01E_SET3"/>
  8. public sealed class SET3 : JsmInstruction
  9. {
  10. #region Fields
  11. private readonly Vector3 _pos;
  12. private readonly int _walkmeshTriangleId;
  13. #endregion Fields
  14. #region Constructors
  15. public SET3(int walkmeshTriangleId, int x, int y, int z) => (_walkmeshTriangleId, _pos.X, _pos.Y, _pos.Z) = (walkmeshTriangleId, x, y, z);
  16. public SET3(int walkmeshTriangleId, IStack<IJsmExpression> stack)
  17. : this(walkmeshTriangleId,
  18. z: ((IConstExpression)stack.Pop()).Int32(),
  19. y: ((IConstExpression)stack.Pop()).Int32(),
  20. x: ((IConstExpression)stack.Pop()).Int32())
  21. {
  22. }
  23. #endregion Constructors
  24. #region Methods
  25. public override void Format(ScriptWriter sw, IScriptFormatterContext formatterContext, IServices services) => sw.Format(formatterContext, services)
  26. .Property(nameof(FieldObject.Model))
  27. .Method(nameof(FieldObjectModel.SetPosition))
  28. .Argument("walkmeshTriangleId", _walkmeshTriangleId)
  29. .Argument("x", (int)_pos.X)
  30. .Argument("y", (int)_pos.Y)
  31. .Argument("z", (int)_pos.Z)
  32. .Comment(nameof(SET3));
  33. public override IAwaitable TestExecute(IServices services)
  34. {
  35. var currentObject = ServiceId.Field[services].Engine.CurrentObject;
  36. currentObject.Model.SetPosition(new WalkMeshCoords(_walkmeshTriangleId, _pos));
  37. return DummyAwaitable.Instance;
  38. }
  39. public override string ToString() => $"{nameof(SET3)}({nameof(_walkmeshTriangleId)}: {_walkmeshTriangleId}, {nameof(_pos)}: {_pos})";
  40. #endregion Methods
  41. }
  42. }