ASK.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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.
  6. /// ASK saves the chosen line index into a temp variable which you can retrieve with PSHI_L 0.
  7. /// AASK is an upgrade that also lets you set the window position.
  8. /// </summary>
  9. internal sealed class ASK : JsmInstruction
  10. {
  11. private IJsmExpression _channel;
  12. private IJsmExpression _messageId;
  13. private IJsmExpression _firstLine;
  14. private IJsmExpression _lastLine;
  15. private IJsmExpression _beginLine;
  16. private IJsmExpression _cancelLine;
  17. public ASK(IJsmExpression channel, IJsmExpression messageId, IJsmExpression firstLine, IJsmExpression lastLine, IJsmExpression beginLine, IJsmExpression cancelLine)
  18. {
  19. _channel = channel;
  20. _messageId = messageId;
  21. _firstLine = firstLine;
  22. _lastLine = lastLine;
  23. _beginLine = beginLine;
  24. _cancelLine = cancelLine;
  25. }
  26. public ASK(Int32 parameter, IStack<IJsmExpression> stack)
  27. : this(
  28. cancelLine: stack.Pop(),
  29. beginLine: stack.Pop(),
  30. lastLine: stack.Pop(),
  31. firstLine: stack.Pop(),
  32. messageId: stack.Pop(),
  33. channel: stack.Pop())
  34. {
  35. }
  36. public override String ToString()
  37. {
  38. return $"{nameof(ASK)}({nameof(_channel)}: {_channel}, {nameof(_messageId)}: {_messageId}, {nameof(_firstLine)}: {_firstLine}, {nameof(_lastLine)}: {_lastLine}, {nameof(_beginLine)}: {_beginLine}, {nameof(_cancelLine)}: {_cancelLine})";
  39. }
  40. public override void Format(ScriptWriter sw, IScriptFormatterContext formatterContext, IServices services)
  41. {
  42. if (_messageId is IConstExpression message)
  43. FormatHelper.FormatAnswers(sw, formatterContext.GetMessage(message.Int32()), _firstLine, _lastLine, _beginLine, _cancelLine);
  44. sw.Format(formatterContext, services)
  45. .Await()
  46. .StaticType(nameof(IMessageService))
  47. .Method(nameof(IMessageService.ShowDialog))
  48. .Argument("channel", _channel)
  49. .Argument("messageId", _messageId)
  50. .Argument("firstLine", _firstLine)
  51. .Argument("lastLine", _lastLine)
  52. .Argument("beginLine", _beginLine)
  53. .Argument("cancelLine", _cancelLine)
  54. .Comment(nameof(AASK));
  55. }
  56. public override IAwaitable TestExecute(IServices services)
  57. {
  58. return ServiceId.Message[services].ShowQuestion(
  59. _channel.Int32(services),
  60. _messageId.Int32(services),
  61. _firstLine.Int32(services),
  62. _lastLine.Int32(services),
  63. _beginLine.Int32(services),
  64. _cancelLine.Int32(services));
  65. }
  66. }
  67. }