AMESW.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. namespace OpenVIII.Fields.Scripts.Instructions
  2. {
  3. /// <summary>
  4. /// Pop up a message window and pauses script execution until the player dismisses the window.
  5. /// </summary>
  6. /// <see cref="http://wiki.ffrtt.ru/index.php?title=FF8/Field/Script/Opcodes/064_AMESW"/>
  7. public sealed class AMESW : JsmInstruction
  8. {
  9. #region Fields
  10. /// <summary>
  11. /// Message Channel
  12. /// </summary>
  13. private readonly IJsmExpression _channel;
  14. /// <summary>
  15. /// Field message ID
  16. /// </summary>
  17. private readonly IJsmExpression _messageId;
  18. /// <summary>
  19. /// X position of window
  20. /// </summary>
  21. private readonly IJsmExpression _posX;
  22. /// <summary>
  23. /// Y position of window
  24. /// </summary>
  25. private readonly IJsmExpression _posY;
  26. #endregion Fields
  27. #region Constructors
  28. public AMESW(IJsmExpression channel, IJsmExpression messageId, IJsmExpression posX, IJsmExpression posY)
  29. {
  30. _channel = channel;
  31. _messageId = messageId;
  32. _posX = posX;
  33. _posY = posY;
  34. }
  35. public AMESW(int parameter, IStack<IJsmExpression> stack)
  36. : this(
  37. posY: stack.Pop(),
  38. posX: stack.Pop(),
  39. messageId: stack.Pop(),
  40. channel: stack.Pop())
  41. {
  42. }
  43. #endregion Constructors
  44. #region Methods
  45. public override void Format(ScriptWriter sw, IScriptFormatterContext formatterContext, IServices services)
  46. {
  47. if (_messageId is IConstExpression message)
  48. FormatHelper.FormatMonologue(sw, formatterContext.GetMessage(message.Int32()));
  49. sw.Format(formatterContext, services)
  50. .Await()
  51. .StaticType(nameof(IMessageService))
  52. .Method(nameof(IMessageService.ShowDialog))
  53. .Argument("channel", _channel)
  54. .Argument("messageId", _messageId)
  55. .Argument("posX", _posX)
  56. .Argument("posY", _posY)
  57. .Comment(nameof(AMESW));
  58. }
  59. public override IAwaitable TestExecute(IServices services) => ServiceId.Message[services].ShowDialog(
  60. _channel.Int32(services),
  61. _messageId.Int32(services),
  62. _posX.Int32(services),
  63. _posY.Int32(services));
  64. public override string ToString() => $"{nameof(AMESW)}({nameof(_channel)}: {_channel}, {nameof(_messageId)}: {_messageId}, {nameof(_posX)}: {_posX}, {nameof(_posY)}: {_posY})";
  65. #endregion Methods
  66. }
  67. }