| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- #nop vim: set filetype=tt:;
- ///=== {
- // ## ask.About <NPC> <台词> <触发组别名>
- // 询问某人关于某事的消息,相当于执行 ask <NPC> about <台词>。
- //
- // 常规的 NPC 交互框架本别名已经帮你处理好了,包括各种异常处理,以及防止被其他玩家误触发的设计。
- // 通常你只会关心其中的某些回复,那你应当通过别名来订阅它们。
- //
- // 指定 NPC 共有三种格式,可以仅指定 ID,或者同时指定 ID 和名字:
- // - 格式1: 砍柴人/kanchai ren
- // - 格式2: 砍柴人(kanchai ren)
- // - 格式3: kanchai ren
- // 以上皆可,其中 ID 部分不论大小写均可。
- // 通常建议你尽量指定名字,以防止误触发,但有些时候名字是动态的,则不必勉强指定。
- //
- // 用法举例,假设系统存在以下别名:
- //
- // #alias {shouyin.answer} {
- // #action {^砍柴人说道:「我已经把它送给陆大人了。」$} {
- // okLog 手印已经送给陆大人;
- // };
- // #action {^砍柴人说道:「我们刚找到手印,还没来得及送给陆大人,你给我们代劳吧。」$} {
- // put shouyin in bag;
- // okLog 手印已经放入背包;
- // };
- // #action {^NPC%*,无法对话。$} {
- // okLog 因为某种异常,无法对话。;
- // };
- // };
- //
- // 那么当你执行如下命令时:
- //
- // ask.About {砍柴人/kanchai ren} {手印} {shouyin.answer};
- //
- // 将首先执行命令 ask kanchai ren about 手印,并且认为 kanchai ren 的名字叫做「砍柴人」。
- // 当砍柴人正常回复之后,将会调用别名 shouyin.answer 来注册你关心两条回复和一条异常触发。
- // 无论你如何处理它们,最后都会安全地删除那些触发,以防止稍后被其他玩家的信息误触发。
- //
- // 实际上,本别名有一种更自然的使用方式,可以平替 ask 命令。注意这里请不要加花括号:
- //
- // Ask 砍柴人/kanchai ren about 手印 wait shouyin.answer;
- //
- // 另外还有两种特殊情况需要注意:
- // 第一,如果系统提示说话太快,那么本别名会自动延迟 N 秒后重试,随着重试次数的递增,间隔时间也会越来越长。
- // 第二,如果 NPC 因为各种异常,导致无法正常对话,那么本别名会根据情况,模拟一条信息,方便你做触发:
- // - NPC不存在,无法对话。
- // - NPC晕倒了,无法对话。
- // - NPC听不懂,无法对话。
- //
- // FIXME: 另外还有一些情况本别名暂时无法处理,需要持续完善。考虑到现有功能已经可以满足大部分需求,所以先这样了。
- // 第一,本别名不支持连续重复使用,即使是不同的 NPC,也不支持。因为那样的话,会导致触发混乱。
- // 第二,本别名在使用前,应自行移动到 NPC 所在房间,并且在使用期间,角色不应当移动,否则必然失败。
- // };
- #alias {Ask %* about %* wait %*} {ask.About {%1} {%2} {%3}};
- #alias {ask.About} {
- #local npc {%1};
- #local words {%2};
- #local alias {%3};
- #local retry {@default{%4;0}};
- math.Inc retry;
- #local name {};
- #local id {};
- #switch {"$npc"} {
- #match {"%*(%*)"} {#var name {@str.Trim{&1}}; #var id {@str.ToLower{@str.Trim{&2}}}};
- #match {"%*/%*"} {#var name {@str.Trim{&1}}; #var id {@str.ToLower{@str.Trim{&2}}}};
- #match {"%*"} {#var name {}; #var id {@str.ToLower{@str.Trim{&1}}}};
- };
- #if { "$id" == "" || "$words" == "" || "$alias" == "" } {
- xtt.Usage %90;
- #return;
- };
- #local name {@default{$name;%*}};
- #class ask.About open;
- #line sub var #line oneshot #action {^你向$name打听有关『$words』的消息。$} {
- #class ask.About open;
- ga.ClassWait {#class ask.About kill};
- $alias;
- #action {^$name嘻嘻笑道:你说什么鸟语啊?$} {
- ask.About.fail NPC听不懂,无法对话。;
- };
- #action {^$name说道:你在说外国话吧?我不会,你最好带个翻译来。$} {
- ask.About.fail NPC听不懂,无法对话。;
- };
- #action {^$name说道:才阿八热古里古鲁。你看,我也能假装会说外国话。$} {
- ask.About.fail NPC听不懂,无法对话。;
- };
- #action {^$name摇摇头,说道:没听说过。$} {
- ask.About.fail NPC听不懂,无法对话。;
- };
- #action {^$name看着你,说道:我从没听说过这事。$} {
- ask.About.fail NPC听不懂,无法对话。;
- };
- #action {^$name耸了耸肩,很抱歉地说:无可奉告。$} {
- ask.About.fail NPC听不懂,无法对话。;
- };
- #action {^$name皱了皱眉头,说道:你去问别人吧。$} {
- ask.About.fail NPC听不懂,无法对话。;
- };
- #action {^$name睁大眼睛望着你,显然不知道你在说什么。$} {
- ask.About.fail NPC听不懂,无法对话。;
- };
- #action {^$name耸了耸肩,很抱歉地说:我对闲谈不感兴趣。$} {
- ask.About.fail NPC听不懂,无法对话。;
- };
- #action {^$name不耐烦的瞪了你一眼,说道:没看我正忙着吗?$} {
- ask.About.fail NPC听不懂,无法对话。;
- };
- #action {^$name说道:嗯....这我可不清楚,你最好问问别人吧。$} {
- ask.About.fail NPC听不懂,无法对话。;
- };
- #action {^$name看了你一眼,说道:对不起。又接着忙自己的事去了。$} {
- ask.About.fail NPC听不懂,无法对话。;
- };
- #action {^$name想了一会儿,说道:对不起,你问的事我实在没有印象。$} {
- ask.About.fail NPC听不懂,无法对话。;
- };
- #class ask.About close;
- };
- #line sub var #action {^你说话太快,对方听不懂,慢点说吧。$} {
- #class ask.About kill;
- #delay ask.About.retry {ask.About {$npc} {$words} {$alias} {$retry}} 1;
- };
- #action {^这里没有这个人。$} {
- ask.About.fail NPC不存在,无法对话。;
- };
- #action {^但是很显然的,$name现在的状况没有办法给你任何答复。$} {
- ask.About.fail NPC晕倒了,无法对话。;
- };
- #line sub var #alias {ask.About.fail} {
- #class ask.About open;
- $alias;
- #class ask.About close;
- #showme <119>%%0<299>;
- #class ask.About kill;
- };
- ask $id about $words;
- #class ask.About close;
- };
|