AASK.cs 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using System;
  2. namespace OpenVIII.Fields.Scripts.Instructions
  3. {
  4. /// <summary>
  5. /// Opens a field message window and lets player choose a single line. AASK saves the chosen line index (first option is always 0) into a temp variable which you can retrieve with PSHI_L 0.
  6. /// </summary>
  7. internal sealed class AASK : JsmInstruction
  8. {
  9. private IJsmExpression _channel;
  10. private IJsmExpression _messageId;
  11. private IJsmExpression _firstLine;
  12. private IJsmExpression _lastLine;
  13. private IJsmExpression _beginLine;
  14. private IJsmExpression _cancelLine;
  15. private IJsmExpression _posX;
  16. private IJsmExpression _posY;
  17. public AASK(IJsmExpression channel, IJsmExpression messageId, IJsmExpression firstLine, IJsmExpression lastLine, IJsmExpression beginLine, IJsmExpression cancelLine, IJsmExpression posX, IJsmExpression posY)
  18. {
  19. _channel = channel;
  20. _messageId = messageId;
  21. _firstLine = firstLine;
  22. _lastLine = lastLine;
  23. _beginLine = beginLine;
  24. _cancelLine = cancelLine;
  25. _posX = posX;
  26. _posY = posY;
  27. }
  28. public AASK(Int32 parameter, IStack<IJsmExpression> stack)
  29. : this(
  30. posY: stack.Pop(),
  31. posX: stack.Pop(),
  32. cancelLine: stack.Pop(),
  33. beginLine: stack.Pop(),
  34. lastLine: stack.Pop(),
  35. firstLine: stack.Pop(),
  36. messageId: stack.Pop(),
  37. channel: stack.Pop())
  38. {
  39. }
  40. public override String ToString()
  41. {
  42. return $"{nameof(AASK)}({nameof(_channel)}: {_channel}, {nameof(_messageId)}: {_messageId}, {nameof(_firstLine)}: {_firstLine}, {nameof(_lastLine)}: {_lastLine}, {nameof(_beginLine)}: {_beginLine}, {nameof(_cancelLine)}: {_cancelLine}, {nameof(_posX)}: {_posX}, {nameof(_posY)}: {_posY})";
  43. }
  44. public override void Format(ScriptWriter sw, IScriptFormatterContext formatterContext, IServices services)
  45. {
  46. if (_messageId is IConstExpression message)
  47. FormatHelper.FormatAnswers(sw, formatterContext.GetMessage(message.Int32()), _firstLine, _lastLine, _beginLine, _cancelLine);
  48. sw.Format(formatterContext, services)
  49. .Await()
  50. .StaticType(nameof(IMessageService))
  51. .Method(nameof(IMessageService.ShowDialog))
  52. .Argument("channel", _channel)
  53. .Argument("messageId", _messageId)
  54. .Argument("firstLine", _firstLine)
  55. .Argument("lastLine", _lastLine)
  56. .Argument("beginLine", _beginLine)
  57. .Argument("cancelLine", _cancelLine)
  58. .Argument("posX", _posX)
  59. .Argument("posY", _posY)
  60. .Comment(nameof(AASK));
  61. }
  62. public override IAwaitable TestExecute(IServices services)
  63. {
  64. return ServiceId.Message[services].ShowQuestion(
  65. _channel.Int32(services),
  66. _messageId.Int32(services),
  67. _firstLine.Int32(services),
  68. _lastLine.Int32(services),
  69. _beginLine.Int32(services),
  70. _cancelLine.Int32(services),
  71. _posX.Int32(services),
  72. _posY.Int32(services));
  73. }
  74. }
  75. }