ask.tin 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. #nop vim: set filetype=tt:;
  2. ///=== {
  3. // ## ask.About <NPC> <台词> <触发组别名>
  4. // 询问某人关于某事的消息,相当于执行 ask <NPC> about <台词>。
  5. //
  6. // 常规的 NPC 交互框架本别名已经帮你处理好了,包括各种异常处理,以及防止被其他玩家误触发的设计。
  7. // 通常你只会关心其中的某些回复,那你应当通过别名来订阅它们。
  8. //
  9. // 指定 NPC 共有三种格式,可以仅指定 ID,或者同时指定 ID 和名字:
  10. // - 格式1: 砍柴人/kanchai ren
  11. // - 格式2: 砍柴人(kanchai ren)
  12. // - 格式3: kanchai ren
  13. // 以上皆可,其中 ID 部分不论大小写均可。
  14. // 通常建议你尽量指定名字,以防止误触发,但有些时候名字是动态的,则不必勉强指定。
  15. //
  16. // 用法举例,假设系统存在以下别名:
  17. //
  18. // #alias {shouyin.answer} {
  19. // #action {^砍柴人说道:「我已经把它送给陆大人了。」$} {
  20. // okLog 手印已经送给陆大人;
  21. // };
  22. // #action {^砍柴人说道:「我们刚找到手印,还没来得及送给陆大人,你给我们代劳吧。」$} {
  23. // put shouyin in bag;
  24. // okLog 手印已经放入背包;
  25. // };
  26. // #action {^NPC%*,无法对话。$} {
  27. // okLog 因为某种异常,无法对话。;
  28. // };
  29. // };
  30. //
  31. // 那么当你执行如下命令时:
  32. //
  33. // ask.About {砍柴人/kanchai ren} {手印} {shouyin.answer};
  34. //
  35. // 将首先执行命令 ask kanchai ren about 手印,并且认为 kanchai ren 的名字叫做「砍柴人」。
  36. // 当砍柴人正常回复之后,将会调用别名 shouyin.answer 来注册你关心两条回复和一条异常触发。
  37. // 无论你如何处理它们,最后都会安全地删除那些触发,以防止稍后被其他玩家的信息误触发。
  38. //
  39. // 实际上,本别名有一种更自然的使用方式,可以平替 ask 命令。注意这里请不要加花括号:
  40. //
  41. // Ask 砍柴人/kanchai ren about 手印 wait shouyin.answer;
  42. //
  43. // 另外还有两种特殊情况需要注意:
  44. // 第一,如果系统提示说话太快,那么本别名会自动延迟 N 秒后重试,随着重试次数的递增,间隔时间也会越来越长。
  45. // 第二,如果 NPC 因为各种异常,导致无法正常对话,那么本别名会根据情况,模拟一条信息,方便你做触发:
  46. // - NPC不存在,无法对话。
  47. // - NPC晕倒了,无法对话。
  48. // - NPC听不懂,无法对话。
  49. //
  50. // FIXME: 另外还有一些情况本别名暂时无法处理,需要持续完善。考虑到现有功能已经可以满足大部分需求,所以先这样了。
  51. // 第一,本别名不支持连续重复使用,即使是不同的 NPC,也不支持。因为那样的话,会导致触发混乱。
  52. // 第二,本别名在使用前,应自行移动到 NPC 所在房间,并且在使用期间,角色不应当移动,否则必然失败。
  53. // };
  54. #alias {Ask %* about %* wait %*} {ask.About {%1} {%2} {%3}};
  55. #alias {ask.About} {
  56. #local npc {%1};
  57. #local words {%2};
  58. #local alias {%3};
  59. #local retry {@default{%4;0}};
  60. math.Inc retry;
  61. #local name {};
  62. #local id {};
  63. #switch {"$npc"} {
  64. #match {"%*(%*)"} {#var name {@str.Trim{&1}}; #var id {@str.ToLower{@str.Trim{&2}}}};
  65. #match {"%*/%*"} {#var name {@str.Trim{&1}}; #var id {@str.ToLower{@str.Trim{&2}}}};
  66. #match {"%*"} {#var name {}; #var id {@str.ToLower{@str.Trim{&1}}}};
  67. };
  68. #if { "$id" == "" || "$words" == "" || "$alias" == "" } {
  69. xtt.Usage %90;
  70. #return;
  71. };
  72. #local name {@default{$name;%*}};
  73. #class ask.About open;
  74. #line sub var #line oneshot #action {^你向$name打听有关『$words』的消息。$} {
  75. #class ask.About open;
  76. ga.ClassWait {#class ask.About kill};
  77. $alias;
  78. #action {^$name嘻嘻笑道:你说什么鸟语啊?$} {
  79. ask.About.fail NPC听不懂,无法对话。;
  80. };
  81. #action {^$name说道:你在说外国话吧?我不会,你最好带个翻译来。$} {
  82. ask.About.fail NPC听不懂,无法对话。;
  83. };
  84. #action {^$name说道:才阿八热古里古鲁。你看,我也能假装会说外国话。$} {
  85. ask.About.fail NPC听不懂,无法对话。;
  86. };
  87. #action {^$name摇摇头,说道:没听说过。$} {
  88. ask.About.fail NPC听不懂,无法对话。;
  89. };
  90. #action {^$name看着你,说道:我从没听说过这事。$} {
  91. ask.About.fail NPC听不懂,无法对话。;
  92. };
  93. #action {^$name耸了耸肩,很抱歉地说:无可奉告。$} {
  94. ask.About.fail NPC听不懂,无法对话。;
  95. };
  96. #action {^$name皱了皱眉头,说道:你去问别人吧。$} {
  97. ask.About.fail NPC听不懂,无法对话。;
  98. };
  99. #action {^$name睁大眼睛望着你,显然不知道你在说什么。$} {
  100. ask.About.fail NPC听不懂,无法对话。;
  101. };
  102. #action {^$name耸了耸肩,很抱歉地说:我对闲谈不感兴趣。$} {
  103. ask.About.fail NPC听不懂,无法对话。;
  104. };
  105. #action {^$name不耐烦的瞪了你一眼,说道:没看我正忙着吗?$} {
  106. ask.About.fail NPC听不懂,无法对话。;
  107. };
  108. #action {^$name说道:嗯....这我可不清楚,你最好问问别人吧。$} {
  109. ask.About.fail NPC听不懂,无法对话。;
  110. };
  111. #action {^$name看了你一眼,说道:对不起。又接着忙自己的事去了。$} {
  112. ask.About.fail NPC听不懂,无法对话。;
  113. };
  114. #action {^$name想了一会儿,说道:对不起,你问的事我实在没有印象。$} {
  115. ask.About.fail NPC听不懂,无法对话。;
  116. };
  117. #class ask.About close;
  118. };
  119. #line sub var #action {^你说话太快,对方听不懂,慢点说吧。$} {
  120. #class ask.About kill;
  121. #delay ask.About.retry {ask.About {$npc} {$words} {$alias} {$retry}} 1;
  122. };
  123. #action {^这里没有这个人。$} {
  124. ask.About.fail NPC不存在,无法对话。;
  125. };
  126. #action {^但是很显然的,$name现在的状况没有办法给你任何答复。$} {
  127. ask.About.fail NPC晕倒了,无法对话。;
  128. };
  129. #line sub var #alias {ask.About.fail} {
  130. #class ask.About open;
  131. $alias;
  132. #class ask.About close;
  133. #showme <119>%%0<299>;
  134. #class ask.About kill;
  135. };
  136. ask $id about $words;
  137. #class ask.About close;
  138. };