area.tin 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. #nop vim: set filetype=tt:;
  2. /*
  3. 本文件属于 PaoTin++ 的一部分
  4. ===========
  5. PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
  6. 你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
  7. ===========
  8. */
  9. load-module bot/pp;
  10. VAR {全局区域对照表} {map.area.dict} {};
  11. #nop Careless(随便查查)、Careful(仔细查查)、CarefulOnce(仔细查一次)三选一;
  12. VAR {定位模式} map.Locate.mode {Careless};
  13. event.Define {map/GotArea} {无参} {$MODULE} {已经获取到区域信息,并更新到 gMapRoom 全局变量。};
  14. event.Define {map/GotLocalmaps} {无参} {$MODULE} {已经解析 localmaps 命令。};
  15. event.HandleOnce {map/init} {map/area} {map} {map.area.Init};
  16. #alias {map.area.Init} {
  17. set localmap;
  18. storage.Load {map-area} {map.area.dict};
  19. event.Handle {map/GotRoomInfo} {map/area} {map} {map.GetArea};
  20. };
  21. #alias {map.GetArea} {
  22. #if { "$gMapRoom[area][RESOLVED]" != "" } {#return};
  23. #if { "$map.Locate.mode" == "Careless" } {#return};
  24. #if { "$gMapRoom[direction]" != "here" } {#return};
  25. #if { @ga.IsUnderway{} } {#return};
  26. #if { "$map.Locate.mode" == "CarefulOnce" } {
  27. #var map.Locate.mode {Careless};
  28. };
  29. event.HandleOnce {map/GotNodeInfo} {map/area} {map} {map.area.check walk-done};
  30. map.GetNodeInfo;
  31. };
  32. #alias {map.area.check} {
  33. #local stage {%1};
  34. #local area {@map.resolveArea{$gMapRoom[area]}};
  35. #if { "$area" == "" } {
  36. #switch {"$stage"} {
  37. #case {"walk-done"} {
  38. event.HandleOnce {map/GotLocalmaps} {map/area} {map} {map.area.check localmaps-done};
  39. localmaps;
  40. };
  41. #case {"localmaps-done"} {
  42. event.HandleOnce {pp/Response} {map/area} {map} {map.GetArea.pp.done};
  43. pp $user[id];
  44. #delay map.GetArea.pp {map.area.check pp-timeout} {30};
  45. };
  46. #case {"pp-timeoout"} {
  47. errLog 竭尽全力也无法获得区域信息。我这是到了什么地方?;
  48. event.UnHandle {pp/Response} {map/area} {map};
  49. };
  50. };
  51. #return;
  52. };
  53. #var gMapRoom[area][RESOLVED] {$area};
  54. okLog 调查完毕,这里是 $gMapRoom[area][RESOLVED]的$gMapRoom[name];
  55. event.DelayEmit map/GotArea;
  56. };
  57. #alias {map.GetArea.pp.done} {
  58. #undelay map.GetArea.pp;
  59. #local ppInfo {$gPPResponse[$user[id]]};
  60. #if { "$ppInfo" == "" } {
  61. errLog PP 机器人应答出错,请检查设置。;
  62. #return;
  63. };
  64. #if { "$ppInfo[room]" != "$gMapRoom[name]" } {
  65. warnLog PP 期间角色发生了移动。定位失效。;
  66. #return;
  67. };
  68. #var gMapRoom[area][PP] {$ppInfo[area]};
  69. map.area.check;
  70. };
  71. #alias {map.Localmaps} {
  72. #local gag {%1};
  73. #local args {%2};
  74. #if { "$args" != "" } {
  75. xtt.Send {localmaps $args};
  76. #return;
  77. };
  78. #var gMapRoom[area][LMAP] {};
  79. #class map.Localmaps open;
  80. #line oneshot #action {~^{\e\[0m|}%c◆%*地图%*◆%c$} {
  81. #local color {%%2};
  82. #replace color {\e[} {};
  83. #replace color {m$} {};
  84. #replace color {m} {;};
  85. #var gMapRoom[area][LMAP] {%%3};
  86. #var gMapRoom[area][COLOR] {$color};
  87. } {2};
  88. #line oneshot #action {^%s%S略图%s$} {
  89. #var gMapRoom[terrain] {随机地图};
  90. #var gMapRoom[village] {%%2};
  91. };
  92. #line oneshot #action {┌─{(─)*}─%*附近详图─{(─)*}─┐$} {
  93. #var gMapRoom[terrain] {随机地图};
  94. };
  95. #if { "$gag" == "gag" } {
  96. #action {^%*{|ID=map/localmaps}$} {#line gag} {6};
  97. #gag {^%*{|ID=map/localmaps}$} {1};
  98. };
  99. #class map.Localmaps close;
  100. xtt.Send {localmaps};
  101. sync.Wait {
  102. #class map.Localmaps kill;
  103. event.DelayEmit map/GotLocalmaps;
  104. };
  105. };
  106. #alias {lm} {map.Localmaps nogag {%0}};
  107. #alias {localmaps} {map.Localmaps gag {%0}};
  108. #nop 根据数据源确定区域信息。数据源有三种:walk、localmaps、pp;
  109. #func {map.resolveArea} {
  110. #local source {%0};
  111. #if { "$source[RESOLVED]" != "" } {
  112. #return {$source[RESOLVED]};
  113. };
  114. #if { "$source[PP]$source[WALK]$source[LMAP]" == "" } {
  115. #return {};
  116. };
  117. #local pp {@default{$source[PP];%*}};
  118. #local walk {@default{$source[WALK];%*}};
  119. #local lmap {@default{$source[LMAP];%*}};
  120. #local pattern {$pp/$walk/$lmap};
  121. #if { "$source[PP]" != "" } {
  122. #local key {};
  123. #local value {{PP}{$source[PP]}};
  124. #foreach {*map.area.dict[$source[PP]/%*/%*][]} {key} {
  125. #local value {$map.area.dict[$key]};
  126. #unvar map.area.dict[$key];
  127. };
  128. #local value[WALK] {@default{$value[WALK];$source[WALK]}};
  129. #local value[LMAP] {@default{$value[LMAP];$source[LMAP]}};
  130. #local value[COLOR] {@default{$value[COLOR];{$source[COLOR]}}};
  131. #local key {$source[PP]/@default{$source[WALK];UNKNOWN}/@default{$source[LMAP];UNKNOWN}};
  132. #var map.area.dict[$key] {$value};
  133. storage.Save {map-area} {map.area.dict};
  134. #return {$pp};
  135. };
  136. #if { &map.area.dict[$pattern][] != 1 } {
  137. #return {};
  138. };
  139. #foreach {*map.area.dict[$pattern]} {pattern} {
  140. #return {$map.area.dict[$pattern][PP]};
  141. };
  142. };
  143. #func {map.AreaColor} {
  144. #local area {%1};
  145. #local pattern {$area/%*/%*};
  146. #if { &map.area.dict[$pattern][] != 1 } {
  147. #return {};
  148. };
  149. #foreach {*map.area.dict[$pattern]} {pattern} {
  150. #return {$map.area.dict[$pattern][COLOR]};
  151. };
  152. };
  153. #alias {map.Here} {
  154. #var map.Locate.mode {CarefulOnce};
  155. look;
  156. };
  157. #alias {ll} {map.Here} {9.0};