node.tin 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. #nop vim: set filetype=tt:;
  2. /*
  3. 本文件属于 PaoTin++ 的一部分
  4. ===========
  5. PaoTin++ © 2020~2026 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
  6. 你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
  7. ===========
  8. */
  9. event.Define {map/GotNodeInfo} {无参} {$MODULE} {已经获取到节点信息,并更新到 gMapRoom 全局变量。};
  10. /*
  11. ╭───扬州──────────────┬────────────┬─────╮
  12. │目的地 │拼音名称 │步数 │
  13. │丐帮分舵 ◇ 土地庙 │gaibang │13 │
  14. │濠州府 ◇ 广场 │haozhou │11 │
  15. │建康府 ◇ 长江渡口 │jiankang │12 │
  16. │庐州 ◇ 石板桥 │luzhou │11 │
  17. │往生堂 ◇ 往生堂广场 │shashou │14 │
  18. │信阳 ◇ 小广场 │xinyang │10 │
  19. │徐州 ◇ 戏马台 │xuzhou │14 │
  20. │镇江 ◇ 扬子津 │zhenjiang │8 │
  21. ├───────────────────┴────────────┴─────┤
  22. │walk [拼音名]命令使用内建路径。 │
  23. │walk -c [拼音名]返回具体地点的路径。 │
  24. │node 命令列出玩家自建路径。 │
  25. ╰─────────────────────────────北大侠客行────╯
  26. */
  27. ///=== {
  28. // ## map.GetNodeInfo
  29. // 通过 walk -c 命令查询当前房间的节点信息。如果当前房间不是节点,则什么也获取不到。
  30. // 否则可以获得两个信息:
  31. // 1. 当前节点的名称,如「扬州」,储存在 \$gMapRoom[node]。
  32. // 2. 当前节点所联通的节点列表,是个表格,储存在 \$gMapRoom[nodeLinks];
  33. // };
  34. #alias {map.GetNodeInfo} {
  35. #local gag {%1};
  36. #class map.GetNodeInfo open;
  37. #alias {map.GetNodeInfo.done} {
  38. #class map.GetNodeInfo kill;
  39. #if { &gMapRoom[nodeLinks][] > 0 } {
  40. #local links {@table.Keys{gMapRoom[nodeLinks]}};
  41. #var gMapRoom[area][LINK] {$gMapRoom[node]/$links};
  42. #delay 0 okLog 节点信息已识别。;
  43. };
  44. event.DelayEmit map/GotNodeInfo;
  45. };
  46. #local {E} {{?:|id=map/getnode}$};
  47. #if { "$gag" == "gag" } {
  48. #gag {^%*$E};
  49. };
  50. #action {@re.TableHeader{0%s}} {
  51. #local nodeName {@map.FixNode{}};
  52. #if { "$nodeName" != "" } {
  53. okLog 节点信息发现 BUG,已经主动修正。;
  54. #line gag;
  55. #show ╭───$nodeName────────┬──────────╮;
  56. };
  57. #else {
  58. errLog 节点信息发现 BUG,请主动修正。;
  59. };
  60. };
  61. re.ParseServerTable map.GetNodeInfo.parse;
  62. #alias {map.GetNodeInfo.parse} {
  63. #var gMapRoom[node] {$gServerTable[name]};
  64. #var gMapRoom[nodeLinks] {};
  65. #local idx {};
  66. #foreach {*gServerTable[body][]} {idx} {
  67. #local body {$gServerTable[body][$idx]};
  68. #local colorBody {$gServerTable[colorBody][$idx]};
  69. #var dest {@str.Replace{{$colorBody[目的地]};{%S%!c %c ◇ %*};{
  70. {dest} {&1}
  71. {markColor} {&2}
  72. {colorRoom} {&3}
  73. {room} {&3}
  74. }}};
  75. #local name {@str.Plain{$dest[dest]}};
  76. #local room {@str.Plain{$dest[room]}};
  77. #local pinyin {$body[拼音名称]};
  78. #local markColor {@str.Color{$dest[markColor]}};
  79. #local pinyinColor {@str.Color{$colorBody[拼音]}};
  80. #local steps {$body[步数]};
  81. #var {gMapRoom[nodeLinks][$pinyin]} {
  82. {name} {$name}
  83. {room} {$room}
  84. {steps} {$steps}
  85. };
  86. #if { "$markColor" != "" } {
  87. #var {gMapRoom[nodeLinks][$pinyin][markColor]} {$markColor};
  88. };
  89. #if { "$pinyinColor" != "" } {
  90. #var {gMapRoom[nodeLinks][$pinyin][pinyinColor]} {$pinyinColor};
  91. };
  92. };
  93. };
  94. #action {^%*内的系统内建路径出发点在:%*,请查询localmaps获得具体方位。$E} {
  95. #var gMapRoom[area][WALK] {%%1/%%2};
  96. };
  97. #action {^%*内共有一处内建玩家路径起点,在%*。$E} {
  98. #var gMapRoom[area][NODE] {%%1/%%2};
  99. };
  100. #action {^%*内共有%d处内建玩家路径起点,分别在%*。$E} {
  101. #var gMapRoom[area][NODE] {%%1/%%3};
  102. };
  103. #action {^当前区域的系统内建路径出发点在:%*,请查询localmaps获得具体方位。$E} {
  104. #var gMapRoom[area][WALK] {%%1};
  105. };
  106. #action {^当前区域共有%d处内建玩家路径起点,分别在%*。$E} {
  107. #var gMapRoom[area][NODE] {%%2};
  108. };
  109. #action {^当前区域共有一处内建玩家路径起点,在%*。$E} {
  110. #var gMapRoom[area][NODE] {%%1};
  111. };
  112. #action {^当前区域的内建路径出发点暂时不明确。$E} {
  113. #var gMapRoom[area][WALK] {NOTHING};
  114. };
  115. #action {^当前区域没有任何内建玩家路径起点。$E} {
  116. #var gMapRoom[area][NODE] {NOTHING};
  117. };
  118. #class map.GetNodeInfo close;
  119. xtt.Send {walk -c};
  120. sync.Wait {map.GetNodeInfo.done} {map/GetNodeInfo};
  121. };
  122. #func {map.FixNode} {
  123. #local nodeName {};
  124. #foreach {*map.xiaoyao.FixNode[]} {nodeName} {
  125. #local desc {$map.xiaoyao.FixNode[$nodeName]};
  126. #if { "$gMapRoom[desc]" == "%*$desc%*" } {
  127. #return {$nodeName};
  128. };
  129. };
  130. #return {};
  131. };
  132. #alias {walk} {
  133. #if { "%1" == "-c" && "%2" == "{gag|nogag|}" } {
  134. map.GetNodeInfo {%2};
  135. };
  136. #elseif { "%1" == "{[a-z0-9;]+}" } {
  137. map.WalkNodes {%1} {%2};
  138. };
  139. #else {
  140. xtt.Send {walk %0};
  141. };
  142. };
  143. ///=== {
  144. // ## map.WalkNodes <节点列表> [<回调钩子ID>]
  145. // 执行 walk 命令,按节点列表顺序依次行走,并发射走路机器人事件。
  146. // 可选的回调钩子 ID 可以只唤醒指定的钩子,避免惊群。
  147. // 到达目的地后会自动执行 look 命令。
  148. // };
  149. #alias {map.WalkNodes} {
  150. #class map.WalkNodes open;
  151. #var map.WalkNodes.nodes {@list.FromSlist{%1}};
  152. #var map.WalkNodes.hook {%2};
  153. #var map.WalkNodes.delay {3};
  154. #local ID {|ID=map/WalkNodes};
  155. #action {^你开始往%*方向飞奔过去……{$ID}$} {
  156. #var map.WalkNodes.delay {3};
  157. };
  158. #action {^频繁使用此命令会对系统造成很重负担,请稍等。{$ID}$} {
  159. #delay map.WalkNodes.retry {walk} $map.WalkNodes.delay;
  160. };
  161. #action {^你因为种种原因停了下来,可以用walk继续进行。{$ID}$} {
  162. #switch {"$gMapRoom[name]"} {
  163. #case {"襄阳南门"} {ask shou jiang about 投军; walk};
  164. #case {"万纶台"} {ask liang liuhe about 拜山; walk};
  165. #case {"山路"} {
  166. #local obj {@map.Room.GetObjByID{shan xiao}};
  167. #if { "$obj[name]" == "山魈" } {
  168. give 1 coin to shan xiao;
  169. };
  170. busy.Wait walk;
  171. };
  172. #default {
  173. tuna max;
  174. #delay $map.WalkNodes.delay {halt; walk};
  175. #var map.WalkNodes.delay {1};
  176. };
  177. };
  178. };
  179. #action {^你到达了%*。{$ID}$} {
  180. #delay 0 {map.WalkNodes.walk-next};
  181. };
  182. #alias {map.WalkNodes.walk-next} {
  183. #if { &map.WalkNodes.nodes[] > 0 } {
  184. #local node {$map.WalkNodes.nodes[1]};
  185. #local node {@str.Replace{{$node};{^%+{|/\x7b?([^\x7b\x7d]+)\x7d?}$};{{step}{&1}{args}{&3}}}};
  186. #list map.WalkNodes.nodes delete 1;
  187. #if { "$node[step]" == "PATH" } {
  188. xtt.SendBatch {$node[args]};
  189. sync.Wait {map.WalkNodes.walk-next};
  190. };
  191. #elseif { "$node[step]" == "{[A-Z][A-Za-z0-9]+}" } {
  192. #local bot {$node[step]};
  193. event.HandleOnce map/walk/continue {map.$bot} {map} {map.WalkNodes.walk-next};
  194. map.$bot $node[args];
  195. };
  196. #else {
  197. xtt.Send {walk $node[step]};
  198. };
  199. };
  200. #else {
  201. #local hook {$map.WalkNodes.hook};
  202. #class map.WalkNodes kill;
  203. event.Emit map/walk/continue {$hook};
  204. };
  205. };
  206. #class map.WalkNodes close;
  207. map.WalkNodes.walk-next;
  208. };
  209. #alias {^/{[a-z0-9]{2,}}_{[a-z0-9]{2,}}$} {node walk %1_%2} 9.5;
  210. /*
  211. 襄阳南门
  212. 守军拦住了你的去路,大声喝到:干什么的?要想通过先问问我们守将大人!
  213. 守将给了你一块腰牌。
  214. 牧民告诉你:牧场上最近出现了一只游荡的野狼,已经吞食了很多单身的旅人,没事最好经过这里。
  215. 走路太快,你没在意脚下,被杂草绊了一下。
  216. */