room.tin 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. #nop 房间信息解析模块;
  2. load-module basic/title;
  3. VAR {当前房间ID} gMapHereID {0};
  4. VAR {当前房间信息} gMapRoom {};
  5. option.Define {ShowRoomView} {Bool} {是否显示房间风景} {false};
  6. option.Define {MapDebug} {Bool} {房间信息解析调试开关} {false};
  7. event.Define {map/GotRoomInfo} {无参} {$MODULE} {已经获取到房间信息,并储存到 gMapRoom 全局变量。};
  8. event.Define {map/ArriveDock} {无参} {$MODULE} {已经抵达码头};
  9. event.Define {map/ArriveCoachPark} {无参} {$MODULE} {已经抵达马车行};
  10. event.HandleOnce {map/init} {map/room} {map} {map.Room.Watch};
  11. #alias {map.Room.Watch} {
  12. #local nation {?:[ ]+\[(大宋|大元|大理|大夏)国\]|};
  13. #local terrain {?:[ ]+\[(都城|城市|城内|村镇|野外|门派|帮派|阴间|(\S+)势力范围)\]|};
  14. #local save {?:[ ]+\[(存盘点)\]|};
  15. #local store {?:[ ]+\[(玩家储物柜)\]|};
  16. #local group {?:[ ]+\[(\S+)\]|};
  17. #local mark {?:[ ]+((?:㊣|★|☆|\s)*)|};
  18. #local undef {?:[ ]+\[未定义\]|};
  19. #class map.Room.Watch open;
  20. #action {^%* -{$nation}{$terrain}{$save}{$store}{$group}{$mark}{$undef}%s{?:房间名颜色代码: ([0-9;]+)|}$} {
  21. #local ret {@map.GMCP.Confirm{}};
  22. #local keep {};
  23. #if { &ret[gmcp][] > 0 } {
  24. #local keep[direction] {here};
  25. };
  26. #elseif { "$ret[cmd]" == "look" } {
  27. #if { "$ret[exit]" != "" } {
  28. #local keep {
  29. {direction} {$ret[exit]}
  30. };
  31. };
  32. #else {
  33. #local keep {
  34. {area} {$gMapRoom[area]}
  35. {node} {$gMapRoom[node]}
  36. {nodeLinks} {$gMapRoom[nodeLinks]}
  37. {coach} {$gMapRoom[coach]}
  38. {coachLinks}{$gMapRoom[coachLinks]}
  39. {direction} {here}
  40. };
  41. };
  42. };
  43. #local room {
  44. {name}{%%1}
  45. {nation}{%%2}
  46. {terrain}{%%3}
  47. {save}{@if{{"%%5" == "存盘点"};true;false}}
  48. {store}{@if{{"%%6" == "玩家储物柜"};true;false}}
  49. {group}{%%7}
  50. {mark}{@str.Split{{%%8};{{ +}};{;}}}
  51. {cmd}{$ret[cmd]}
  52. {look}{$ret[exit]}
  53. {gmcp}{$ret[gmcp]}
  54. $keep
  55. };
  56. map.Room.getInfo {$room};
  57. };
  58. #class map.Room.Watch close;
  59. };
  60. #alias {map.StopWatchRoom} {
  61. #class map.Room.Watch kill;
  62. };
  63. #alias {map.Room.getInfo} {
  64. #local args {%1};
  65. #var gMapRoom {};
  66. #var gMapRoom[id] {}; #nop 房间ID;
  67. #var gMapRoom[name] {$args[name]}; #nop 房间名称;
  68. #var gMapRoom[colorName] {}; #nop 带颜色的房间名称;
  69. #var gMapRoom[nation] {$args[nation]}; #nop 房间国家,大宋/大理/大元/大夏;
  70. #var gMapRoom[terrain] {$args[terrain]}; #nop 房间地段,包含村落和城墙;
  71. #var gMapRoom[save] {$args[save]}; #nop 是否为存盘点;
  72. #var gMapRoom[store] {$args[store]}; #nop 是否为玩家储物柜;
  73. #var gMapRoom[group] {$args[group]}; #nop 帮派名称,非帮派驻地留空;
  74. #var gMapRoom[village] {}; #nop 村落名称(仅村落有效);
  75. #var gMapRoom[mark] {$args[mark]}; #nop 帮派名称,非帮派驻地留空;
  76. #var gMapRoom[prev] {$args[prev]}; #nop 上一个房间 ID;
  77. #var gMapRoom[entry] {$args[entry]}; #nop 房间入口,是用哪个方向指令进入本房间的;
  78. #var gMapRoom[cmd] {$args[cmd]}; #nop 本条房间信息是用何种命令获得;
  79. #var gMapRoom[look] {$args[look]}; #nop 如果是 look 命令,那么 look 的是哪个方向;
  80. #var gMapRoom[gmcp] {$args[gmcp]}; #nop GMCP.Move 信息;
  81. #var gMapRoom[area] {$args[area]}; #nop 房间所在区域;
  82. #var gMapRoom[map] {}; #nop 房间小地图;
  83. #var gMapRoom[maphere] {}; #nop 周围地形图;
  84. #var gMapRoom[desc] {}; #nop 房间文字描述;
  85. #var gMapRoom[descEnd] {false}; #nop 房间文字描述已结束(目前以空行标识);
  86. #var gMapRoom[view] {}; #nop 房间的风景(非文字描述);
  87. #var gMapRoom[fog] {false}; #nop 是否有雾;
  88. #var gMapRoom[exits] {}; #nop 出口列表;
  89. #var gMapRoom[colorExits] {}; #nop 带颜色的出口;
  90. #var gMapRoom[exitHint] {}; #nop 出口所连接的房间;
  91. #var gMapRoom[existShown] {false}; #nop 出口信息已出现;
  92. #var gMapRoom[lookable] {}; #nop 你可以看看(look)的东西;
  93. #var gMapRoom[objs] {}; #nop 房间物品,不包含生物;
  94. #var gMapRoom[items] {}; #nop 房间特殊物品;
  95. #var gMapRoom[colorItems] {}; #nop 带颜色的房间特殊物品;
  96. #var gMapRoom[dynItems] {}; #nop 房间动态物品;
  97. #var gMapRoom[npcs] {}; #nop 房间NPC, 不包含非生物和玩家;
  98. #var gMapRoom[players] {}; #nop 房间玩家,不包含非生物和NPC;
  99. #var gMapRoom[dock] {}; #nop 是否为渡口;
  100. #var gMapRoom[funcs] {}; #nop 房间功能,领悟,睡觉,吃喝,买卖,等等;
  101. #var gMapRoom[node] {$args[node]}; #nop 节点名称,非节点留空;
  102. #var gMapRoom[nodeLinks] {$args[nodeLinks]}; #nop 通过本节点可以抵达的节点列表,非节点留空;
  103. #var gMapRoom[coach] {$args[coach]}; #nop 马车行名称,非马车行留空;
  104. #var gMapRoom[coachLinks] {$args[coachLinks]};#nop 通过本车行可以抵达的车行列表,非节点留空;
  105. #var gMapRoom[direction] {$args[direction]}; #nop 该房间所在的方位,如果是当前位置则为 here;
  106. #local color {@buffer.RawLine{}};
  107. #replace color {%S - %*$} {&1};
  108. #replace color {\e[2;37;0m} {};
  109. #var gMapRoom[colorName] {$color};
  110. #if { @option.IsEnable{MapDebug} } {
  111. #local optional {};
  112. #if { "$gMapRoom[mark]" != "" } {#cat optional { <175>标记<299> $gMapRoom[mark] }};
  113. #if { @isTrue{$gMapRoom[save]} } {#cat optional { <129><存盘点><299>}};
  114. #if { @isTrue{$gMapRoom[store]} } {#cat optional { <139><储物柜><299>}};
  115. #if { "$gMapRoom[group]" != "" } {#cat optional { <175>帮派驻地<299> $gMapRoom[group]}};
  116. #echo {<175>房间名称<299> %s <175>国家<299> %s <175>地段<299> %s%s}
  117. {$gMapRoom[name]} {$gMapRoom[nation]} {$gMapRoom[terrain]} $optional;
  118. #line gag;
  119. };
  120. #class map.Room.getInfo open;
  121. event.HandleOnce {GA} {map/room} {map} {map.Room.getInfo.done};
  122. #action {{*UTF8}{^\s{4}((.*)(\p{Han}+).*\([A-Z][a-z A-Z']*\).*)}{|ID=map/Room/getInfo/objs}$} {
  123. #local obj {@ParseTitle{%%2}};
  124. #local name {$obj[name]};
  125. #local type {房间物品};
  126. #if { "$obj[title]" == "船老大" } {
  127. #list gMapRoom[npcs] add {{$obj}};
  128. #var gMapRoom[dock] {dock};
  129. #local type {房间 NPC};
  130. };
  131. #else {
  132. #list gMapRoom[objs] add {{$obj}};
  133. };
  134. #if { @option.IsEnable{MapDebug} } {
  135. #if { @isFalse{$gMapRoom[existShown]} } {
  136. #var gMapRoom[existShown] {true};
  137. #echo {%s} {<134>房间出口<299> @slist.JoinAs{{@slist.FromList{$gMapRoom[gmcp][出口信息]}};{<179>%s<299>};{ }}};
  138. };
  139. #if { "$obj[emoji]" != "" } {
  140. #local name {$name<299>{<139>$obj[emoji]<299>}};
  141. };
  142. #echo {<164>$type<299> %-18s<299> <169>%-16s<299> %s [%s] %s}
  143. {$name} {$obj[id]} {{$obj[title]}} {$obj[nick]}
  144. {@slist.Join{{$obj[status1];$obj[status2]}}};
  145. #line gag;
  146. };
  147. } {9.9};
  148. #action {^%s你可以看看(look):%*。$} {
  149. #local items {@str.Split{{%%2};{{,|,}}}};
  150. #var gMapRoom[items] {$items};
  151. #local raw {@buffer.RawLine{}};
  152. #replace raw {<{\e\[([0-9\e\[m;]+)m([^>]+)\e\[2;37;0m}>} {@map.Room.colorItems{colorItems;{{color}{&2}{name}{&3}}}};
  153. #class map.Room.getInfo.map kill;
  154. #class map.Room.getInfo.desc kill;
  155. #if { @option.IsEnable{MapDebug} } {
  156. #echo {%s} {<171>特殊物品<299> {$items}};
  157. #line gag;
  158. };
  159. };
  160. #action {^%s你可以获取(get):%*。$} {
  161. #local items {@str.Split{{%%2};{{,|,}}}};
  162. #var gMapRoom[dynItems] {$items};
  163. #class map.Room.getInfo.map kill;
  164. #class map.Room.getInfo.desc kill;
  165. #if { @option.IsEnable{MapDebug} } {
  166. #echo {%s} {<171>动态物品<299> {$items}};
  167. #line gag;
  168. };
  169. };
  170. #action {^%s这里正是{举世闻名|声威赫赫|名震天下}的%*的产业,你可以进店(shop)逛逛。$} {
  171. #var gMapRoom[group] {%%3};
  172. #if { @option.IsEnable{MapDebug} } {
  173. #echo {%s} {<171>帮派驻地<299> $gMapRoom[group],有商店};
  174. #line gag;
  175. };
  176. } {3};
  177. #action {^%s这里正是%*的产业$} {
  178. #var gMapRoom[group] {%%2};
  179. #if { @option.IsEnable{MapDebug} } {
  180. #echo {%s} {<171>帮派驻地<299> $gMapRoom[group],无商店};
  181. #line gag;
  182. };
  183. } {4};
  184. #action {^%s这里建起了一大片宅子,气势恢宏,不知道主人是谁。$} {
  185. #var gMapRoom[group] {UNKNOWN};
  186. #if { @option.IsEnable{MapDebug} } {
  187. #echo {%s} {<171>帮派驻地<299> $gMapRoom[group]};
  188. #line gag;
  189. };
  190. } {4};
  191. #action {^%s这里是%*通往外界的唯一道路。$} {
  192. #var gMapRoom[terrain] {村落};
  193. #var gMapRoom[village] {%%2};
  194. };
  195. #action {^%s这里是%*的一段城墙。$} {
  196. #var gMapRoom[terrain] {城墙};
  197. };
  198. #action {^%*这里是一处%*,人迹罕至,也不知道你怎么会来到这里的。$} {
  199. #var gMapRoom[terrain] {随机地图};
  200. };
  201. #action {^%s{长江渡船|黄河渡船|渡船|羊皮筏}停在岸边,随时可以出发。$} {
  202. map.room.mark-river %2;
  203. };
  204. #action {^%s{长江渡船|黄河渡船|渡船|羊皮筏}正在驶回,马上就要靠岸了。$} {
  205. map.room.mark-river %2;
  206. };
  207. #action {^%s{长江渡船|黄河渡船|渡船|羊皮筏}刚刚离开驶向对岸,需要一些时间才能回来。$} {
  208. map.room.mark-river %2;
  209. };
  210. #alias {map.room.mark-river} {
  211. #local boat {%%1};
  212. #switch {"$boat"} {
  213. #case {"长江渡船"} {#var gMapRoom[river] {长江}};
  214. #case {"{黄河渡船|渡船|羊皮筏}"} {#var gMapRoom[river] {黄河}};
  215. };
  216. };
  217. #action {^%s{这里(?:明显|所有|唯一)的(?:出口|方向)有|浓雾中你觉得似乎有出口通往} %*$} {
  218. #local desc {%%2};
  219. #if { "$desc" == "%*浓雾%*" } {
  220. #var gMapRoom[fog] {true};
  221. #var gMapRoom[exitStr] {};
  222. };
  223. #else {
  224. #var gMapRoom[exitStr] {%%3};
  225. };
  226. #var gMapRoom[existShown] {true};
  227. #class map.Room.getInfo.map kill;
  228. #class map.Room.getInfo.desc kill;
  229. #if { @option.IsEnable{MapDebug} } {#line gag};
  230. #local raw {@buffer.RawLine{}};
  231. #var gMapRoom[colorExitStr] {$raw};
  232. #if { "$gMapRoom[exitStr]" == "%*。" } {
  233. map.parseExit;
  234. #return;
  235. };
  236. #class map.Room.getInfo.exit open;
  237. #local exitCharsets {和|、|[a-z A-Z]};
  238. #action {^{($exitCharsets)+}$} {
  239. #local raw {@buffer.RawLine{}};
  240. #cat gMapRoom[exitStr] {%%%1};
  241. #cat gMapRoom[colorExitStr] {$raw};
  242. #if { @option.IsEnable{MapDebug} } {#line gag};
  243. };
  244. #action {^{($exitCharsets)*}。$} {
  245. #class map.Room.getInfo.exit kill;
  246. #local raw {@buffer.RawLine{}};
  247. #cat gMapRoom[exitStr] {%%%1};
  248. #cat gMapRoom[colorExitStr] {$raw};
  249. map.parseExit;
  250. } {4};
  251. #class map.Room.getInfo.exit close;
  252. };
  253. #action {^%s这里没有任何明显的出口。$} {
  254. #class map.Room.getInfo.map kill;
  255. #class map.Room.getInfo.desc kill;
  256. #var gMapRoom[existShown] {true};
  257. #var {gMapRoom[exits]} {};
  258. #if { @option.IsEnable{MapDebug} } {
  259. #line gag;
  260. #echo {%s} {<134>房间出口<299> %%0};
  261. };
  262. };
  263. #action {^%s「%*」: %*{|ID=map/Room/getInfo/weather}$} {
  264. #var gMapRoom[season] {%%2};
  265. #var gMapRoom[weather] {%%3};
  266. #class map.Room.getInfo.map kill;
  267. #class map.Room.getInfo.desc kill;
  268. #if { @option.IsEnable{MapDebug} } {
  269. #echo {%s} {<174>时令季节<299> %%2 <174>天气信息<299> %%3};
  270. #line gag;
  271. };
  272. };
  273. #action {{*UTF8}{^ (\p{Han}+)等(.*)人\(users\)也在此处。$}} {
  274. #if { @option.IsEnable{MapDebug} } {
  275. #echo {<164>房间玩家<299> 仍有%s等 %d 人。} {%%2} {@math.ParseCN{%%3}};
  276. #line gag;
  277. };
  278. };
  279. #alias {map.parseExit} {
  280. #local exitList {$gMapRoom[exitStr]};
  281. #unvar gMapRoom[exitStr];
  282. #replace exitList {、} {;};
  283. #replace exitList { 和 } {;};
  284. #replace exitList {。} {};
  285. #replace exitList { } {};
  286. #local exitList {@slist.Sort{$exitList}};
  287. #var gMapRoom[exits] {$exitList};
  288. #replace gMapRoom[colorExitStr] {{\e\[([0-9\e\[m;]+)m}{[a-z]{2,9}}{\e\[2;37;0m}} {@map.Room.colorItems{colorExits;{{color}{&2}{name}{&3}}}};
  289. #unvar gMapRoom[colorExitStr];
  290. #if { @option.IsEnable{MapDebug} } {
  291. #local exitStr {$gMapRoom[exits]};
  292. #if { &gMapRoom[exitHint][] > 0 } {
  293. #local template {VALUE<299>(<129>\@if{{"\$gMapRoom[exitHint][VALUE]" == ""};{N/A};{\$gMapRoom[exitHint][VALUE]}}<299>)};
  294. #local exitStr {@fp.Transform{{$exitStr};{$template}}};
  295. };
  296. #local exitStr {@slist.JoinAs{{$exitStr};{<179>%s<299>};{ }}};
  297. #echo {%s} {<134>房间出口<299> $exitStr};
  298. };
  299. };
  300. #alias {map.Room.getInfo.done} {
  301. #local __unused {%%0};
  302. #class map.Room.getInfo kill;
  303. #class map.Room.getInfo.map kill;
  304. #class map.Room.getInfo.desc kill;
  305. #unvar gMapRoom[descEnd];
  306. #unvar gMapRoom[existShown];
  307. #if { @slist.Contains{{$gMapRoom[items]};{<ferry>}} } {
  308. #var gMapRoom[dock] {ride};
  309. };
  310. #nop 同步事件以允许插件修改房间信息。;
  311. event.Emit {map/GotRoomInfo};
  312. };
  313. #func {map.Room.colorItems} {
  314. #local key {%%1};
  315. #local data {%%2};
  316. #replace data[color] {m\e\[} {;};
  317. #var gMapRoom[$key][$data[name]] {$data[color]};
  318. };
  319. #class map.Room.getInfo close;
  320. #class map.Room.getInfo.map open;
  321. #action {^{?:\s{8}}%*{|ID=map/Room/getInfo/minimap}$} {
  322. #local line {%%1};
  323. #replace line {%+1..u%+1..s$} {&1};
  324. #cat gMapRoom[map] {|$line|};
  325. #if { @option.IsEnable{MapDebug} } {
  326. #echo {%s} {<174>地图信息<299> %%1};
  327. #line gag;
  328. };
  329. };
  330. #class map.Room.getInfo.map close;
  331. #class map.Room.getInfo.desc open;
  332. #action {^%*{|ID=map/Room/getInfo/others}$} {
  333. #class map.Room.getInfo.map kill;
  334. #if { @isTrue{$gMapRoom[descEnd]} } {
  335. #if { "%%0" == "%s" && "$gMapRoom[view]" == "" } {
  336. #return;
  337. };
  338. #cat gMapRoom[view] {%%0};
  339. map.Room.ShowView {%%0};
  340. #return;
  341. };
  342. #if { "%%0" == "%s" } {
  343. #var gMapRoom[descEnd] {true};
  344. #return;
  345. };
  346. #local obj {@ParseTitle{%%0}};
  347. #if { &obj[] > 0 } {
  348. #class map.Room.getInfo.desc kill;
  349. #var gMapRoom[descEnd] {true};
  350. #showme @buffer.RawLine{};
  351. #line gag;
  352. #return;
  353. };
  354. #local text {%%0};
  355. #replace {text} {{*UTF8}{\p{Han}}} {};
  356. #local origLen {@str.Len{%%0}};
  357. #local nonHans {@str.Len{$text}};
  358. #if { $origLen > 5 && $nonHans * 2 > $origLen } {
  359. #var gMapRoom[descEnd] {true};
  360. #cat gMapRoom[view] {%%0};
  361. map.Room.ShowView {%%0};
  362. };
  363. #else {
  364. #cat gMapRoom[desc] {@str.Trim{%%0}};
  365. #if { @option.IsEnable{MapDebug} } {
  366. #echo {%s} {<172>房间描述<299> %%0};
  367. #line gag;
  368. };
  369. };
  370. } {9};
  371. #class map.Room.getInfo.desc close;
  372. };
  373. #alias {map.Room.ShowView} {
  374. #if { @option.IsDisable{ShowRoomView} } {
  375. #line gag;
  376. };
  377. #elseif { @option.IsEnable{MapDebug} } {
  378. #echo {%s} {<174>房间风景<299> @Beautify{{%1}}};
  379. #line gag;
  380. };
  381. };
  382. #func {map.Room.GetObjByName} {
  383. #local name {%1};
  384. #local title {@default{%2;%*}};
  385. #local idx {};
  386. #foreach {*gMapRoom[objs][]} {idx} {
  387. #if { "$gMapRoom[objs][$idx][title]" == "$title" && "$gMapRoom[objs][$idx][name]" == "$name" } {
  388. #return {$gMapRoom[objs][$idx]};
  389. };
  390. };
  391. #return {};
  392. };
  393. #func {map.Room.GetObjByID} {
  394. #local id {%1};
  395. #local idx {};
  396. #foreach {*gMapRoom[objs][]} {idx} {
  397. #if { "$gMapRoom[objs][$idx][id]" == "$id" } {
  398. #return {$gMapRoom[objs][$idx]};
  399. };
  400. };
  401. #return {};
  402. };