| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- #nop vim: set filetype=tt:;
- /*
- 本文件属于 PaoTin++ 的一部分
- ===========
- PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
- 你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
- ===========
- */
- ///=== {
- ///// map/area --- 大众版区域信息获取模块
- /////
- ///// 本模块主要使用 walk 和 localmaps 两个常用命令。
- ///// };
- VAR {全局区域对照表} {map.area.dict} {};
- event.Define {map/GotArea} {无参} {$MODULE} {已经获取到区域信息,并更新到 gMapRoom 全局变量。};
- event.Define {map/GotLocalmaps} {无参} {$MODULE} {已经解析 localmaps 命令。};
- event.HandleOnce {map/init} {map/area} {map} {pkuxkx.map.area.init};
- #alias {pkuxkx.map.area.init} {
- set localmap;
- storage.Load {map-area} {map.area.dict};
- };
- ///=== {
- // ## map.GetArea
- // 弄清楚角色当前位于哪个区域。
- // 注意调查过程中可能会向服务器发送必要的命令(尽可能少地)。但如果角色正在移动,则不会发送任何命令。
- // 弄清楚之后,发送事件 map/GotArea。
- // 注意如果已经弄清楚了,则不会发送事件。因此建议先通过函数 map.GetArea 进行查询。
- // };
- #alias {map.GetArea} {
- #if { @ga.IsUnderway{} } {dbgLog map underway; #return};
- #if { "$gMapRoom[direction]" != "here" } {dbgLog map not here; #return};
- map.area.check;
- };
- ///=== {
- // #@ map.GetArea
- // 返回当前房间信息中的区域信息。无参数。
- // };
- #func {map.GetArea} {
- #return {@map.resolveArea{$gMapRoom[area]}};
- };
- #alias {map.area.check} {
- #local stage {@default{{%1};start}};
- #local area {@map.GetArea{}};
- #if { "$area" != "" } {
- #if { "$gMapRoom[area][RESOLVED]" == "" } {
- #var gMapRoom[area][RESOLVED] {$area};
- event.DelayEmit map/GotArea;
- };
- #return;
- };
- #switch {"$stage"} {
- #case {"start"} {
- event.HandleOnce {map/GotNodeInfo} {map/area} {map} {map.area.check walk-done};
- map.GetNodeInfo gag;
- };
- #case {"walk-done"} {
- event.HandleOnce {map/GotLocalmaps} {map/area} {map} {map.area.check localmaps-done};
- map.Localmaps gag;
- };
- #case {"localmaps-done"} {
- #return;
- };
- };
- };
- ///=== {
- // ## map.Localmaps <是否 gag> [<命令参数>]
- // 执行 localmaps,但因为该命令结果过于刷屏,因此允许 gag 其输出。
- // };
- #alias {map.Localmaps} {
- #local gag {%1};
- #local args {%2};
- #if { "$args" != "" } {
- xtt.Send {localmaps $args};
- #return;
- };
- #var gMapRoom[area][LMAP] {};
- #class map.Localmaps open;
- #line oneshot #action {~^{\e\[0m|}◆%*◆%C{|\(非任务区域\)}%C$} {
- #local rawTitle {@raw.EraseInvisible{{%%2};true}};
- #if { &rawTitle[fragments][] == 0 } {
- errLog 遇到了特殊情况,请报告开发者。;
- #return;
- };
- #local title {$rawTitle[fragments][1]};
- #var gMapRoom[area][LMAP] {$title[text]};
- #var gMapRoom[area][COLOR] {$title[color]};
- #if { "%%4" == "" } {
- #var gMapRoom[area][JOB] {true};
- };
- #else {
- #var gMapRoom[area][JOB] {false};
- };
- } {4};
- #line oneshot #action {~^{\e\[0m|}%c◆%*地图%*◆%C{|\(非任务区域\)}%C$} {
- #local color {%%2};
- #replace color {\e[} {};
- #replace color {m$} {};
- #replace color {m} {;};
- #local area {%%3%%4};
- #var gMapRoom[area][LMAP] {$area};
- #var gMapRoom[area][COLOR] {$color};
- #if { "%%6" == "" } {
- #var gMapRoom[area][JOB] {true};
- };
- #else {
- #var gMapRoom[area][JOB] {false};
- };
- #if { "$area" == "柳秀山庄" } {
- #class map.Localmaps.gag kill;
- };
- } {2};
- #line oneshot #action {^%s%S略图%s$} {
- #var gMapRoom[terrain] {@default{$gMapRoom[terrain];随机地图}};
- #var gMapRoom[village] {%%2};
- };
- #line oneshot #action {┌─{(─)*}─%*附近详图─{(─)*}─┐$} {
- #var gMapRoom[terrain] {随机地图};
- };
- #if { "$gag" == "gag" } {
- #class map.Localmaps.gag open;
- #action {^%*{|ID=map/localmaps}$} {#line gag} {6};
- #gag {^%*{|ID=map/localmaps}$};
- #class map.Localmaps.gag close;
- };
- #class map.Localmaps close;
- xtt.Send {localmaps};
- sync.Wait {
- #class map.Localmaps kill;
- #class map.Localmaps.gag kill;
- event.DelayEmit map/GotLocalmaps;
- };
- };
- #alias {lm} {map.Localmaps nogag {%0}};
- #alias {localmaps} {map.Localmaps nogag {%0}};
- #alias {localmaps_gag} {map.Localmaps gag {%0}};
- #nop 根据数据源确定区域信息。数据源有四种(按使用优先级):link、walk、node、localmaps;
- #func {map.resolveArea} {
- #local source {%0};
- #if { "$source[RESOLVED]" != "" } {
- #return {$source[RESOLVED]};
- };
- #if { "$source[LINK]$source[WALK]$source[NODE]$source[LMAP]" == "" } {
- #return {};
- };
- #local lmap {@default{$source[LMAP];%*}};
- #local pattern {%*/$lmap};
- #nop 如果有 LMAP 的话,先根据 LMAP 检索,这个基本上可以做到一一对应。;
- #if { "$source[LMAP]" != "" } {
- #local keys {@table.Keys{map.area.dict;{$pattern}}};
- #if { @sset.Size{$keys} == 1 } {
- #return {$map.area.dict[$keys][PP]};
- };
- };
- #nop 否则查找与 LINK/WALK/NODE 相匹配的信息。;
- #nop TODO: 理论上这部分也可以做优化,但是 KEY 长了之后太丑了没必要。;
- #local area {};
- #foreach {*map.area.dict[$pattern]} {area} {
- #local area {$map.area.dict[$area]};
- #if { "$source[LINK]" == "%+/%+" } {
- #local link {@str.Replace{{$source[LINK]};%+/%+;{{node}{&1}{links}{&2}}}};
- #if { "$area[LINKS][$link[node]]" === "$link[links]" } {
- #return {$area[PP]};
- };
- };
- #elseif { "$source[WALK]$source[NODE]" != "" } {
- #if { "$source[WALK]$source[NODE]" !== "$area[WALK]$area[NODE]" } {
- #continue;
- };
- #if { "$source[WALK]/$source[NODE]" !== "NOTHING/NOTHING" } {
- #return {$area[PP]};
- };
- };
- };
- #return {};
- };
- ///=== {
- /// #@ map.AreaColor <区域名称>
- // 获取该区域的颜色。
- // 区域颜色是一个区域的固有属性,可以通过该区域的平民 title 的颜色来确认。
- // };
- #func {map.AreaColor} {
- #local area {%1};
- #local pattern {$area/%*};
- #if { &map.area.dict[$pattern][] != 1 } {
- #return {};
- };
- #foreach {*map.area.dict[$pattern]} {pattern} {
- #return {$map.area.dict[$pattern][COLOR]};
- };
- };
|