Przeglądaj źródła

feat(MUDLIB): 支持多 MUDLIB,支持清华西游记登录

dzp 3 lat temu
rodzic
commit
81ec220aba

+ 15 - 2
framework/main.tin

@@ -71,16 +71,27 @@ PaoTin++ © 2020~2022 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 
     };
 };
 
+#nop 优先加载 var/$file(玩家自定义文件),其次加载 mud/$file(MUDLIB 相关文件);
 #alias {load-file} {
     #local file {%1};
+
     #local output {};
     #script output {test -f var/$file && echo true || echo false};
     #if { "$output[1]" == "true" } {
         #read var/$file;
+        #return;
     };
-    #else {
-        #read $file;
+
+    #if { "$gCurrentMUDLIB" != "" } {
+        #local output {};
+        #script output {test -f mud/$gCurrentMUDLIB/$file && echo true || echo false};
+        #if { "$output[1]" == "true" } {
+            #read mud/$gCurrentMUDLIB/$file;
+            #return;
+        };
     };
+
+    #read $file;
 };
 
 #alias {init} {
@@ -92,6 +103,8 @@ PaoTin++ © 2020~2022 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 
     load-file framework/log.tin;
     #nop 为 TinTin 赋能,实现模块加载器;
     load-file framework/module-loader.tin;
+    #nop 支持不同的 MUD 服务器环境;
+    load-file framework/multi-mud.tin;
 
     #nop 为 TinTin 赋能,自行实现的扩展语法和实用函数集。;
     load-lib xtintin;

+ 38 - 0
framework/multi-mud.tin

@@ -0,0 +1,38 @@
+#nop vim: set filetype=tt:;
+
+/*
+模块名称:多 MUD 支持
+模块说明:本文件属于框架代码的一部分,不建议修改。如有需求请在 GitHub 发 issue 或者 PR
+版权声明:本文件属于 PaoTin++ 的一部分
+===========
+PaoTin++ © 2020~2022 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
+你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
+===========
+*/
+
+#var gMUDLIB {
+    {pkuxkx} {北大侠客行}
+    {thuxyj} {清华西游记}
+};
+
+#var gCurrentMUDLIB {};
+
+#nop 定义 MUDLIB,原则上,只有提供的游戏内容完全不一致才可以称为是不同的 MUDLIB。;
+#alias {mudlib.Define} {
+    #local id   {%1};
+    #local name {%2};
+
+    #var {gMUDLIB[$id]} {$name};
+};
+
+#nop 设置当前使用的 MUDLIB。这会导致后续加载的 MUD 相关的插件全部优先使用该 MUD 目录。;
+#alias {mudlib.Set} {
+    #local id {%1};
+
+    #if { "$gMUDLIB[$id]" == "" } {
+        errLog 未知的 MUDLIB $id,请先定义它。;
+        #return;
+    };
+
+    #var gCurrentMUDLIB {$id};
+};

+ 2 - 0
ids/DEFAULT

@@ -11,6 +11,8 @@ PaoTin++ © 2020~2022 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 
 ===========
 */
 
+mudlib.Set {pkuxkx};
+
 #nop session 的名字,没特殊需求不建议修改;
 #var session[name]  pkuxkx;
 

+ 46 - 0
mud/thuxyj/framework/online.tin

@@ -0,0 +1,46 @@
+#nop vim: set filetype=tt:;
+
+/*
+模块名称:几个常用的别名
+模块说明:本文件属于框架代码的一部分,不建议修改。如有需求请在 GitHub 发 issue 或者 PR
+版权声明:本文件属于 PaoTin++ 的一部分
+===========
+PaoTin++ © 2020~2022 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
+你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
+===========
+*/
+
+#nop 一些中文 MUD 服务器在接收到 quit 命令时会让角色从服务器上下线,;
+#nop 这往往会导致玩家丢失背包里的物品。;
+#nop 为了避免悲剧发生,这里特别映射一下,改成仅断开连接,而不退出服务器角色。;
+#nop 如果玩家真的需要向服务器发送 quit 指令,请输入 #send quit。exit 同理;
+#alias {exit} {#end};
+#alias {quit} {#end};
+
+#nop 类似于 DOS/Unix,设置 clear/cls 命令为清除屏幕上的内容。;
+#alias {cls} {clear};
+#alias {clear} {
+    #system {tput clear};
+    prompt.refresh;
+};
+
+#ticker {save-data}     {xtt.Send save}     {600};
+#ticker {backup-data}   {xtt.Send backup}   {1800};
+
+#delay 1 {
+    set openmap 1;
+
+    load-module basic/char;
+    load-module shortcut;
+
+    event.Handle {char/hpbrief} {prompt} {framework/online} {prompt.UpdateHP};
+    event.Handle {char/status}  {prompt} {framework/online} {prompt.UpdateSM};
+
+    #nop 提供给用户的自动执行函数;
+    user-online;
+};
+
+#event {RECEIVED OUTPUT} {
+    #undelay KeepAlive;
+    #delay KeepAlive {#zap} 180;
+};

+ 69 - 0
mud/thuxyj/plugins/basic/login.tin

@@ -0,0 +1,69 @@
+#nop vim: filetype=tt
+
+#class login kill;
+#class login open;
+
+#var login[session]     {};
+#var login[user]        {};
+#var login[autoexec]    {};
+
+#alias {login} {
+    #var    login[session]  {%1};
+    #var    login[user]     {%2};
+    #var    login[autoexec] {%3};
+    #session {$session[name]} {$session[host]} {$session[port]};
+};
+
+#event {SESSION CONNECTED} {
+    #if { "%0" == "$login[session][name]" } {
+        #class auto-login kill;
+        #class auto-login open;
+
+        #nop 如果角色设置了 GMCP 支持,则积极回应服务器的 GMCP 协商请求。;
+        #if { "$user[GMCP]" == "true" } {
+            load-lib gmcp;
+            gmcp.Enable;
+        };
+
+        #if { "$session[UTF8]" == "true" } {
+            #config {charset} {UTF-8};
+        };
+        #else {
+            #config {charset} {GBK1TOUTF8};
+        };
+
+        #line oneshot #action {^%sWelcome to Xi You Ji! Select GB or BIG5 (gb/big5):$} {
+            #send gb;
+        };
+
+        #line oneshot #action {^您是否是中小学学生或年龄更小?(yes/no)$} {
+            #delay 0 {#echo {\n}; #send no};
+        };
+
+        #line oneshot #action {^您的英文名字:(新玩家请键入 new 注册)$} {
+            #delay 0 {#echo {\n}; #send $login[user][id]};
+        };
+
+        #action {^请输入相应密码:$} {
+            #delay  0 {#echo {\n}; #send {$user[passwd]}};
+        };
+
+        #line oneshot #action {^您要将另一个连线中的相同人物赶出去,取而代之吗?(y/n)$} {
+            #delay 0 {#echo {\n}; #send y};
+        };
+
+        #line oneshot #action {^重新连线完毕。$} {
+            #delay 0 {
+                #showme 登录成功。;
+                #local handler $login[autoexec];
+                #class auto-login kill;
+                #class login kill;
+                $handler;
+            };
+        };
+
+        #class auto-login close;
+    };
+};
+
+#class login close;