room.extra.tin 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650
  1. #nop 房间信息解析模块;
  2. load-module basic/title;
  3. event.Define {map/ArriveDock} {无参} {$MODULE} {已经抵达码头};
  4. event.Define {map/ArriveCoachPark} {无参} {$MODULE} {已经抵达马车行};
  5. event.Define {map/fix/room} {无参} {$MODULE} {修复房间信息};
  6. event.Define {map/fix/obj} {无参} {$MODULE} {修复物品信息};
  7. event.HandleOnce {map/init} {pkuxkx/map/room} {map} {pkuxkx.map.Room.init};
  8. #alias {pkuxkx.map.Room.init} {
  9. set area_detail;
  10. };
  11. VAR {可能的房间小地图} miniMapBuffer {};
  12. #alias {map.Room.Watch} {
  13. #local dungeon {?:\[(\S{3,10})副本\]|};
  14. #local weather {?:[ ]+\[((?:春|夏|秋|冬)(?:风|雨)|暖阳|酷晴|晴朗|雪晴|冬雾)\]|};
  15. #local nation {?:[ ]?\[(大宋|大元|大理|大夏)国\]|};
  16. #local pkzone {?:[ ]+(杀戮场)|};
  17. #local terrain {?:[ ]+\[(都城|城市|城内|村镇|野外|门派|帮派|阴间|(\S+)势力范围)\]|};
  18. #local save {?:[ ]+\[(存盘点)\]|};
  19. #local store {?:[ ]+\[(玩家储物柜)\]|};
  20. #local group {?:[ ]+\[(\S+)\]|};
  21. #local mark {?:[ ]+((?:㊣|★|☆|\s)*)|};
  22. #local undef {?:[ ]+\[未定义\]|};
  23. #class map.Room.Watch open;
  24. #action {^%*{|ID=basic/map/minimap}$} {
  25. #local line {%%1};
  26. #if { "$line" == "{\s{8}}%*" } {
  27. #replace line {%+1..u%+1..s$} {&1};
  28. #cat miniMapBuffer {|$line|};
  29. };
  30. #else {
  31. #var miniMapBuffer {};
  32. };
  33. #config {MULTI TRIGGER} ON;
  34. } {4.020};
  35. #action {{*UTF8}{?:^}{.{1,9}?\S}{$dungeon} -{$weather}{$nation}{$pkzone}{$terrain}{$save}{$store}{$group}{$mark}{$undef}{| \[副本\]}$} {
  36. #local ret {@map.GMCP.Confirm{}};
  37. #if { @isFalse{$gMapRoom[allDone]} } {
  38. map.Room.getInfo.done;
  39. };
  40. #local keep {};
  41. #if { &ret[gmcp][] > 0 } {
  42. #local keep[direction] {here};
  43. #local keep[gmcp] {$ret[gmcp]};
  44. };
  45. #elseif { "$ret[cmd]" == "look" } {
  46. #if { "$ret[exit]" != "" } {
  47. #local keep {
  48. {direction} {$ret[exit]}
  49. };
  50. };
  51. #else {
  52. #local keep {
  53. {area} {$gMapRoom[area]}
  54. {node} {$gMapRoom[node]}
  55. {nodeLinks} {$gMapRoom[nodeLinks]}
  56. {coach} {$gMapRoom[coach]}
  57. {coachLinks}{$gMapRoom[coachLinks]}
  58. {direction} {here}
  59. {gmcp} {$gMapRoom[gmcp]}
  60. };
  61. };
  62. };
  63. #local room {
  64. {name}{%%1}
  65. {dungeon}{%%2}
  66. {nation}{%%4}
  67. {pkzone}{@if{{"%%5" == "杀戮场"};true;false}}
  68. {terrain}{%%6}
  69. {save}{@if{{"%%8" == "存盘点"};true;false}}
  70. {store}{@if{{"%%9" == "玩家储物柜"};true;false}}
  71. {group}{%%10}
  72. {mark}{@str.Split{{%%11};{{ +}};{;}}}
  73. {cmd}{$ret[cmd]}
  74. {look}{$ret[exit]}
  75. {gmcp}{$ret[gmcp]}
  76. $keep
  77. };
  78. #local room {$room};
  79. #local here {0};
  80. #if { "$room[direction]" == "here" } {
  81. #local here {@map.Here{}};
  82. };
  83. #local header {%%99};
  84. #if { @option.IsEnable{MapDebug} } {
  85. #local optional {};
  86. #if { "$room[mark]" != "" } {#cat optional { <175>标记<299> $room[mark] }};
  87. #if { @isTrue{$room[save]} } {#cat optional { <129><存盘点><299>}};
  88. #if { @isTrue{$room[store]} } {#cat optional { <139><储物柜><299>}};
  89. #if { "$room[group]" != "" } {#cat optional { <175>帮派驻地<299> $room[group]}};
  90. #if { $here > 0 } {#cat optional { <129>定位结果<299> <159>@map.Here{RID}<299>}};
  91. #echo {<175>房间名称<299> %s <175>国家<299> %s <175>地段<299> %s%s}
  92. {$room[name]} {$room[nation]} {$room[terrain]} $optional;
  93. };
  94. #elseif { $here > 0 } {
  95. #if { "@map.FollowState{}" == "Normal" } {
  96. #local here {<159>@map.Here{RID}<299>};
  97. };
  98. #else {
  99. #local here {<259>GPS 无信号<299>};
  100. };
  101. #local width {@math.Min{@prompt.ScreenWidth{};90}};
  102. #local space {@str.Space{@math.Eval{$width - @str.Width{{$header}} - @str.Width{$here}}}};
  103. #echo {%s %s %s} {$header} {$space} {$here};
  104. };
  105. #else {
  106. #echo {%s} {$header};
  107. };
  108. #line gag;
  109. map.Room.getInfo {$room};
  110. } {4.010};
  111. #class map.Room.Watch close;
  112. };
  113. #alias {map.Room.getInfo} {
  114. #local args {%1};
  115. #var gMapRoom {};
  116. #var gMapRoom[id] {}; #nop 房间ID;
  117. #var gMapRoom[name] {$args[name]}; #nop 房间名称;
  118. #var gMapRoom[colorName] {}; #nop 带颜色的房间名称;
  119. #var gMapRoom[dungeon] {$args[dungeon]}; #nop 副本名称;
  120. #var gMapRoom[pkzone] {$args[pkzone]}; #nop 杀戮场标记;
  121. #var gMapRoom[nation] {$args[nation]}; #nop 房间国家,大宋/大理/大元/大夏;
  122. #var gMapRoom[terrain] {$args[terrain]}; #nop 房间地段,包含村落和城墙;
  123. #var gMapRoom[save] {$args[save]}; #nop 是否为存盘点;
  124. #var gMapRoom[store] {$args[store]}; #nop 是否为玩家储物柜;
  125. #var gMapRoom[group] {$args[group]}; #nop 帮派名称,非帮派驻地留空;
  126. #var gMapRoom[village] {}; #nop 村落名称(仅村落有效);
  127. #var gMapRoom[mark] {$args[mark]}; #nop 帮派名称,非帮派驻地留空;
  128. #var gMapRoom[prev] {$args[prev]}; #nop 上一个房间 ID;
  129. #var gMapRoom[entry] {$args[entry]}; #nop 房间入口,是用哪个方向指令进入本房间的;
  130. #var gMapRoom[cmd] {$args[cmd]}; #nop 本条房间信息是用何种命令获得;
  131. #var gMapRoom[look] {$args[look]}; #nop 如果是 look 命令,那么 look 的是哪个方向;
  132. #var gMapRoom[gmcp] {$args[gmcp]}; #nop GMCP.Move 信息;
  133. #var gMapRoom[area] {$args[area]}; #nop 房间所在区域;
  134. #var gMapRoom[map] {$miniMapBuffer}; #nop 房间小地图;
  135. #var gMapRoom[maphere] {}; #nop 周围地形图;
  136. #var gMapRoom[desc] {}; #nop 房间文字描述;
  137. #var gMapRoom[descEnd] {false}; #nop 房间文字描述已结束(目前以空行标识);
  138. #var gMapRoom[view] {}; #nop 房间的风景(非文字描述);
  139. #var gMapRoom[fog] {false}; #nop 是否有雾;
  140. #var gMapRoom[exits] {}; #nop 出口列表;
  141. #var gMapRoom[colorExits] {}; #nop 带颜色的出口;
  142. #var gMapRoom[exitHint] {}; #nop 出口所连接的房间;
  143. #var gMapRoom[existShown] {false}; #nop 出口信息已出现;
  144. #var gMapRoom[lookable] {}; #nop 你可以看看(look)的东西;
  145. #var gMapRoom[colorItems] {}; #nop 带颜色的房间特殊物品;
  146. #var gMapRoom[getable] {}; #nop 你可以获取(get)的东西;
  147. #var gMapRoom[objs] {}; #nop 房间物品,不包含生物;
  148. #var gMapRoom[npcs] {}; #nop 房间NPC, 不包含非生物和玩家;
  149. #var gMapRoom[players] {}; #nop 房间玩家,不包含非生物和NPC;
  150. #var gMapRoom[dock] {}; #nop 是否为渡口;
  151. #var gMapRoom[funcs] {}; #nop 房间功能,领悟,睡觉,吃喝,买卖,等等;
  152. #var gMapRoom[node] {$args[node]}; #nop 节点名称,非节点留空;
  153. #var gMapRoom[nodeLinks] {$args[nodeLinks]}; #nop 通过本节点可以抵达的节点列表,非节点留空;
  154. #var gMapRoom[coach] {$args[coach]}; #nop 马车行名称,非马车行留空;
  155. #var gMapRoom[coachLinks] {$args[coachLinks]}; #nop 通过本车行可以抵达的车行列表,非节点留空;
  156. #var gMapRoom[direction] {$args[direction]}; #nop 该房间所在的方位,如果是当前位置则为 here;
  157. #var gMapRoom[allDone] {false}; #nop 房间信息已收集完毕;
  158. #local color {@buffer.RawLine{}};
  159. #replace color {<{/|}H2>} {};
  160. #replace color {%S - %*$} {&1};
  161. #replace color {\e[2;37;0m} {};
  162. #replace color {%S[%u]} {&1};
  163. #var gMapRoom[colorName] {$color};
  164. #class map.Room.getInfo open;
  165. event.HandleOnce {GA} {map/room} {map} {map.Room.getInfo.done};
  166. #action {{*UTF8}{^\s{4}((.*)(\p{Han}+).*\([A-Z][a-z A-Z']*\).*)}{|ID=map/Room/getInfo/objs}$} {
  167. #local obj {@ParseTitle{%%2}};
  168. event.Emit {map/fix/obj};
  169. #if { "$obj[title]" == "船老大" } {
  170. #if { "$gMapRoom[river]" == "长江" } {
  171. #var gMapRoom[dock] {GuoJiang};
  172. };
  173. #elseif { "$gMapRoom[river]" == "黄河" } {
  174. #var gMapRoom[dock] {GuoHe};
  175. };
  176. #else {
  177. #var gMapRoom[dock] {YellBoat};
  178. };
  179. #if { "$obj[type]" != "NPC" } {
  180. #local obj[type] {NPC};
  181. #list gMapRoom[npcs] add {{$obj}};
  182. };
  183. };
  184. #list gMapRoom[objs] add {{$obj}};
  185. #if { @option.IsEnable{MapDebug} } {
  186. #local type {$obj[type]};
  187. #switch {"$type"} {
  188. #case {"NPC"} {#local type {<134>房间 NPC}};
  189. #case {"物品"} {#local type {<164>房间物品}};
  190. #case {"玩家"} {#local type {<174>房间玩家}};
  191. #default {#local type {<164>房间物品}};
  192. };
  193. #if { @isFalse{$gMapRoom[existShown]} } {
  194. #var gMapRoom[existShown] {true};
  195. #echo {%s} {<134>房间出口<299> @slist.JoinAs{{@slist.FromList{$gMapRoom[gmcp][出口信息]}};{<179>%s<299>};{ }}};
  196. };
  197. #local name {$obj[name]};
  198. #if { "$obj[colorName]" != "" } {
  199. #local name {$obj[colorName]};
  200. };
  201. #if { "$obj[emoji]" != "" } {
  202. #local name {$name<299>{<139>$obj[emoji] <299>}};
  203. };
  204. #echo {<164>$type<299> %-18s<299> <169>%-16s<299> %s [%s] %s}
  205. {$name} {$obj[id]} {{$obj[title]}} {$obj[nick]}
  206. {@slist.Join{{$obj[status1];$obj[status2]}}};
  207. #if { "$obj[desc]" != "" } {
  208. #echo {<164> <070> %s} {$obj[desc]};
  209. };
  210. #line gag;
  211. };
  212. } {9.9};
  213. #action {^%+4s你可以看看(look):%*。$} {
  214. #local lookable {@str.Split{{%%2};{{,|,}}}};
  215. #var gMapRoom[lookable] {$lookable};
  216. #local raw {@buffer.RawLine{}};
  217. #replace raw {<{\e\[([0-9\e\[m;]+)m([^>]+)\e\[2;37;0m}>} {@map.Room.colorItems{colorItems;{{color}{&2}{name}{&3}}}};
  218. #local item {};
  219. #foreach {$lookable} {item} {
  220. #list gMapRoom[objs] add {{
  221. {id} {$item}
  222. {type} {lookable}
  223. }};
  224. };
  225. #class map.Room.getInfo.map kill;
  226. #class map.Room.getInfo.desc kill;
  227. #if { @option.IsEnable{MapDebug} } {
  228. #echo {%s} {<171>特殊物品<299> {$lookable}};
  229. #line gag;
  230. };
  231. };
  232. #action {^%+4s你可以获取(get):%*。$} {
  233. #local getable {@str.Split{{%%2};{{,|,}}}};
  234. #var gMapRoom[getable] {$getable};
  235. #local item {};
  236. #foreach {$getable} {item} {
  237. #list gMapRoom[objs] add {{
  238. {id} {$item}
  239. {type} {getable}
  240. }};
  241. };
  242. #class map.Room.getInfo.map kill;
  243. #class map.Room.getInfo.desc kill;
  244. #if { @option.IsEnable{MapDebug} } {
  245. #echo {%s} {<171>动态物品<299> {$getable}};
  246. #line gag;
  247. };
  248. };
  249. #action {^%+4s这里正是{举世闻名|声威赫赫|名震天下}的%*的产业,你可以进店(shop)逛逛。$} {
  250. #var gMapRoom[group] {%%3};
  251. #if { @option.IsEnable{MapDebug} } {
  252. #echo {%s} {<175>帮派驻地<299> $gMapRoom[group],有商店};
  253. #line gag;
  254. };
  255. } {3};
  256. #action {^%+4s这里正是%*的产业$} {
  257. #var gMapRoom[group] {%%2};
  258. #if { @option.IsEnable{MapDebug} } {
  259. #echo {%s} {<175>帮派驻地<299> $gMapRoom[group],无商店};
  260. #line gag;
  261. };
  262. } {4};
  263. #action {^%+4s这里建起了一大片宅子,气势恢宏,不知道主人是谁。$} {
  264. #var gMapRoom[group] {UNKNOWN};
  265. #if { @option.IsEnable{MapDebug} } {
  266. #echo {%s} {<175>帮派驻地<299> $gMapRoom[group]};
  267. #line gag;
  268. };
  269. } {4};
  270. #action {^%+4s这里是%*通往外界的唯一道路。$} {
  271. #var gMapRoom[terrain] {村落出口};
  272. #var gMapRoom[village] {%%2};
  273. #if { @option.IsEnable{MapDebug} } {
  274. #echo {%s} {<175>村落出口<299> <599><119>%%2<299>};
  275. #line gag;
  276. };
  277. };
  278. #action {^%+4s这里是%+3..4u的一处$gMapRoom[name]。} {
  279. #var gMapRoom[terrain] {村落内部};
  280. #var gMapRoom[village] {%%2};
  281. #if { @option.IsEnable{MapDebug} } {
  282. #echo {%s} {<175>村落内部<299> %%2};
  283. #line gag;
  284. };
  285. };
  286. #action {^%+4s这里是%*的一段城墙。$} {
  287. #var gMapRoom[terrain] {城墙};
  288. #var gMapRoom[desc] {@str.Trim{%%0}};
  289. #if { @option.IsEnable{MapDebug} } {
  290. #echo {%s} {<175>城 墙<299> %%2};
  291. #line gag;
  292. };
  293. };
  294. #action {^%+4s这里是一处%*,人迹罕至,也不知道你怎么会来到这里的。$} {
  295. #var gMapRoom[terrain] {随机地图};
  296. #if { @option.IsEnable{MapDebug} } {
  297. #echo {%s} {<175>随机地图<299>};
  298. #line gag;
  299. };
  300. };
  301. #action {^%+4s这里显然经常有人经过,地上被踩出了路。$} {
  302. #var gMapRoom[terrain] {迷宫通道};
  303. #if { @option.IsEnable{MapDebug} } {
  304. #echo {%s} {<175>迷宫通道<299> <599><129>发现足迹<299>};
  305. #line gag;
  306. };
  307. };
  308. #action {^%+4s{长江渡船|黄河渡船|渡船|羊皮筏}停在岸边,随时可以出发。$} {
  309. map.room.mark-river %%2;
  310. };
  311. #action {^%+4s{长江渡船|黄河渡船|渡船|羊皮筏}正在驶回,马上就要靠岸了。$} {
  312. map.room.mark-river %%2;
  313. };
  314. #action {^%+4s{长江渡船|黄河渡船|渡船|羊皮筏}刚刚离开驶向对岸,需要一些时间才能回来。$} {
  315. map.room.mark-river %%2;
  316. };
  317. #alias {map.room.mark-river} {
  318. #local boat {%%1};
  319. #switch {"$boat"} {
  320. #case {"长江渡船"} {#var gMapRoom[river] {长江}};
  321. #case {"{黄河渡船|渡船|羊皮筏}"} {#var gMapRoom[river] {黄河}};
  322. #default {errLog 发现不明渡船「$boat」,请联系开发者。};
  323. };
  324. #var gMapRoom[dock] {YellBoat};
  325. #if { @option.IsEnable{MapDebug} } {
  326. #echo {%s} {<175>大河渡口<299> 此处有「<130>$boat<299>」可供渡过「<120>$gMapRoom[river]<299>」。};
  327. #line gag;
  328. };
  329. };
  330. #action {^%+4s一片浓雾中,什么也看不清。$} {
  331. #var gMapRoom[fog] {true};
  332. #var gMapRoom[exitStr] {};
  333. };
  334. #action {^%+4s浓雾中你依稀觉得似乎可以通往%*方向。$} {
  335. #var gMapRoom[fog] {true};
  336. #var gMapRoom[exitStr] {};
  337. #var gMapRoom[existShown] {true};
  338. #class map.Room.getInfo.map kill;
  339. #class map.Room.getInfo.desc kill;
  340. };
  341. #action {^%+4s{这里(?:明显|所有|唯一)的(?:出口|方向)有|浓雾中你觉得似乎有出口通往} %*$} {
  342. #local desc {%%2};
  343. #if { "$desc" == "%*浓雾%*" } {
  344. #var gMapRoom[fog] {true};
  345. #var gMapRoom[exitStr] {};
  346. };
  347. #else {
  348. #var gMapRoom[exitStr] {%%3};
  349. };
  350. #var gMapRoom[existShown] {true};
  351. #class map.Room.getInfo.map kill;
  352. #class map.Room.getInfo.desc kill;
  353. #if { @option.IsEnable{MapDebug} } {#line gag};
  354. #local raw {@buffer.RawLine{}};
  355. #var gMapRoom[colorExitStr] {$raw};
  356. #if { "$gMapRoom[exitStr]" == "%*。" } {
  357. map.parseExit;
  358. #return;
  359. };
  360. #class map.Room.getInfo.exit open;
  361. #local exitCharsets {和|、|[a-z A-Z]};
  362. #action {^{($exitCharsets)+}$} {
  363. #local raw {@buffer.RawLine{}};
  364. #cat gMapRoom[exitStr] {%%%1};
  365. #cat gMapRoom[colorExitStr] {$raw};
  366. #if { @option.IsEnable{MapDebug} } {#line gag};
  367. };
  368. #action {^{($exitCharsets)*}。$} {
  369. #class map.Room.getInfo.exit kill;
  370. #local raw {@buffer.RawLine{}};
  371. #cat gMapRoom[exitStr] {%%%1};
  372. #cat gMapRoom[colorExitStr] {$raw};
  373. map.parseExit;
  374. } {4};
  375. #class map.Room.getInfo.exit close;
  376. };
  377. #action {^%+4s这里没有任何明显的出口。$} {
  378. #class map.Room.getInfo.map kill;
  379. #class map.Room.getInfo.desc kill;
  380. #var gMapRoom[existShown] {true};
  381. #var {gMapRoom[exits]} {};
  382. #if { @option.IsEnable{MapDebug} } {
  383. #line gag;
  384. #echo {%s} {<134>房间出口<299> %%0};
  385. };
  386. };
  387. #action {^%+4s「%*」: %*{|ID=map/Room/getInfo/weather}$} {
  388. #var gMapRoom[season] {%%2};
  389. #var gMapRoom[weather] {%%3};
  390. #class map.Room.getInfo.map kill;
  391. #class map.Room.getInfo.desc kill;
  392. #if { @option.IsEnable{MapDebug} } {
  393. #echo {%s} {<174>时令季节<299> %%2 <174>天气信息<299> %%3};
  394. #line gag;
  395. };
  396. };
  397. #action {{*UTF8}{^ (\p{Han}+)等(.*)人\(users\)也在此处。$}} {
  398. #if { @option.IsEnable{MapDebug} } {
  399. #echo {<174>房间玩家<299> 仍有%s等 %d 人。} {%%2} {@math.ParseCN{%%3}};
  400. #line gag;
  401. };
  402. };
  403. #alias {map.parseExit} {
  404. #local exitList {$gMapRoom[exitStr]};
  405. #unvar gMapRoom[exitStr];
  406. #replace exitList {、} {;};
  407. #replace exitList { 和 } {;};
  408. #replace exitList {。} {};
  409. #replace exitList { } {};
  410. #local exitList {@slist.Sort{$exitList}};
  411. #var gMapRoom[exits] {$exitList};
  412. #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}}}};
  413. #unvar gMapRoom[colorExitStr];
  414. #if { @option.IsEnable{MapDebug} } {
  415. #local exitStr {$gMapRoom[exits]};
  416. #if { &gMapRoom[exitHint][] > 0 } {
  417. #local template {VALUE<299>(<129>\@if{{"\$gMapRoom[exitHint][VALUE]" == ""};{N/A};{\$gMapRoom[exitHint][VALUE]}}<299>)};
  418. #local exitStr {@fp.Transform{{$exitStr};{$template}}};
  419. };
  420. #local exitStr {@slist.JoinAs{{$exitStr};{<179>%s<299>};{ }}};
  421. #echo {%s} {<134>房间出口<299> $exitStr};
  422. };
  423. };
  424. #alias {map.Room.getInfo.done} {
  425. #local __unused {%%0};
  426. #class map.Room.getInfo kill;
  427. #class map.Room.getInfo.map kill;
  428. #class map.Room.getInfo.desc kill;
  429. #unvar gMapRoom[descEnd];
  430. #unvar gMapRoom[existShown];
  431. #unvar gMapRoom[drawMap];
  432. #var gMapRoom[allDone] {true};
  433. #if { @slist.Contains{{$gMapRoom[lookable]};{<ferry>}} } {
  434. #var gMapRoom[dock] {Ride};
  435. };
  436. #if { @slist.Contains{{$gMapRoom[lookable]};{shalou}} } {
  437. #var gMapRoom[dock] {Shalou};
  438. };
  439. #nop 如果有渡船,则一定可以过河,但如果没有船老大,则只能自己喊。;
  440. #nop 如果有船老大,那么 gMapRoom[dock] 此时应该已经有值了。;
  441. #if { "$gMapRoom[river]" == "{长江|黄河}" && "$gMapRoom[dock]" == "" } {
  442. #var gMapRoom[dock] {YellBoat};
  443. };
  444. #nop 同步事件以允许插件修改房间信息。;
  445. event.Emit {map/fix/room};
  446. #nop 同步事件以确保连续行走时及时处理回调。;
  447. event.Emit {map/GotRoomInfo};
  448. #if { @option.IsEnable{DrawRoomMap} } {
  449. map.Room.DrawMap {$gMapRoom};
  450. };
  451. };
  452. #func {map.Room.colorItems} {
  453. #local key {%%1};
  454. #local data {%%2};
  455. #replace data[color] {m\e\[} {;};
  456. #var gMapRoom[$key][$data[name]] {$data[color]};
  457. };
  458. #class map.Room.getInfo close;
  459. #class map.Room.getInfo.map open;
  460. #action {^{?:\s{8}}%*{|ID=map/Room/getInfo/minimap}$} {
  461. #local line {%%1};
  462. #replace line {%+1..u%+1..s$} {&1};
  463. #cat gMapRoom[map] {|$line|};
  464. #if { @option.IsEnable{DrawRoomMap} } {
  465. #line gag;
  466. };
  467. #elseif { @option.IsEnable{MapDebug} } {
  468. #echo {%s} {<174>地图信息<299> %%1};
  469. #line gag;
  470. };
  471. };
  472. #class map.Room.getInfo.map close;
  473. #class map.Room.getInfo.desc open;
  474. #action {^%*{|ID=map/Room/getInfo/others}$} {
  475. #class map.Room.getInfo.map kill;
  476. #if { @isTrue{$gMapRoom[descEnd]} } {
  477. #if { "%%0" == "%s" && "$gMapRoom[view]" == "" } {
  478. #return;
  479. };
  480. #cat gMapRoom[view] {%%0};
  481. map.Room.ShowView {%%0};
  482. #return;
  483. };
  484. #if { "%%0" == "%s" } {
  485. #var gMapRoom[descEnd] {true};
  486. #return;
  487. };
  488. #local obj {@ParseTitle{%%0}};
  489. #if { &obj[] > 0 } {
  490. #class map.Room.getInfo.desc kill;
  491. #var gMapRoom[descEnd] {true};
  492. #showme @buffer.RawLine{};
  493. #line gag;
  494. #return;
  495. };
  496. #local text {%%0};
  497. #replace {text} {{*UTF8}{\p{Han}}} {};
  498. #local origLen {@str.Len{%%0}};
  499. #local nonHans {@str.Len{$text}};
  500. #if { $origLen > 5 && $nonHans * 3 / 2 > $origLen } {
  501. #var gMapRoom[descEnd] {true};
  502. #cat gMapRoom[view] {%%0};
  503. map.Room.ShowView {%%0};
  504. };
  505. #else {
  506. #if { @option.IsEnable{DrawRoomMap} && "$gMapRoom[desc]" == "" } {
  507. map.Room.DrawMap {@map.Here{ROOM}};
  508. };
  509. #cat gMapRoom[desc] {@str.Trim{%%0}};
  510. #if { @option.IsEnable{MapDebug} } {
  511. #echo {%s} {<172>房间描述<299> %%0};
  512. #line gag;
  513. };
  514. };
  515. } {9};
  516. #class map.Room.getInfo.desc close;
  517. };
  518. ///=== {
  519. // ## map.Room.GetObj <物品 ID 及数量,表格>
  520. // 从房间捡起物品,但限制背包中的数量,防止过于贪婪。
  521. // };
  522. #alias {map.Room.GetObj} {
  523. #local dict {%1};
  524. #local nop {1};
  525. #local id {};
  526. #foreach {*dict[]} {id} {
  527. #local amount {$dict[$id]};
  528. #if { "@map.Room.GetObjByID{$id}" != "" && @char.backpack.Amount{Item;$id} < $amount } {
  529. #local nop {0}; get $id;
  530. };
  531. };
  532. #if { ! $nop } {i2};
  533. };
  534. ///=== {
  535. // #@ map.Room.exits
  536. // 获取 gMapRoom 变量中的出口信息。结果承诺将按照字母排序。
  537. // 没有 fullme 的时候,移动时看不到出口,但可以从 GMCP 里获取。
  538. // };
  539. #func {map.Room.exits} {
  540. #local exits {$gMapRoom[exits]};
  541. #if { "$exits" != "" } {
  542. #return {$exits};
  543. };
  544. #if { &gMapRoom[gmcp][出口信息][] == 0 } {
  545. #return {};
  546. };
  547. #local exits {$gMapRoom[gmcp][出口信息][%*]};
  548. #return {@slist.Sort{$exits}};
  549. };