newstart 发表于 2023-7-9 11:20:34

【PyMUD】PyMUD使用指南-基础篇(一)

本帖最后由 newstart 于 2023-7-9 11:27 AM 编辑

写在最前面的话
最早想要自己写MUD客户端的念头,还是在几年前。但前几年事情太多,人太忙,我记得自20年疫情之后,到今年年初就没有再登陆过北侠了。今年春节之后空闲一些,于2月分重启MUD客户端的计划。我翻了一下自己的提交记录,最早是2023年2月19日开始正式启动程序计划,4月9号实现第一个可实现基本功能的初始版本,然后边玩边修复客户端bug,到5月22号才形成基本完善的初始版本(也就是5月29日发布到github的0.05b版)。自2月19日启动项目以来,截止7月9日,已进行过225次提交和修改(在自建的git服务器上,未发布到github),才有目前的0.10b版状态。
在自己写客户端之前,我主要用过zmud和mushclient两个客户端,北大侠客行一直是用mushclient(玩的那会儿还没有mudlet)。我认为mushclient是一个功能非常强大的客户端,唯一缺点是不支持跨平台。由于工作原因,上班的地方不能上网,手机玩的话,确实没有特别适合的跨平台客户端(tintint++倒是支持,但一直不想重学然后重写我在mushclient里的所有python脚本),加上我是一个软件爱好者(当然现在岗位也不是程序员),所以决定自己干起,正好在游戏之中学习了。
因为我要综合平衡工作、生活、写代码、当然还有自己玩,所以整个更新节奏不会很快,但我认为我会一直更新下去的。感谢北大侠客行巫师团队的努力,北侠吸引我玩的动力,也是我不断更新完善客户端的动力{:7_272:}1. 需求、安装与运行1.1 环境需求PyMUD是一个原生基于Python语言的MUD客户端,因此最基本的环境是Python环境而非操作系统环境。理论上,只要你的操作系统下可以运行Python,就可以运行PyMUD。另外,本客户端的UI设计是基于控制台的,因此也不需要有图形环境的支持。
[*]操作系统需求:不限,能运行Python是必要条件。
[*]版本需求:>3.6(这个是我根据语法规定推测的,因为我也没用过这么低的版本,我用过的版本的包括3.9、3.10、3.11),32位/64位随意,但我建议用64位版,可以支持4G以上的内存访问
[*]包需求:prompt-toolkit 3.0(代码在https://github.com/prompt-toolkit/python-prompt-toolkit),以及由prompt-toolkit所依赖的wcwidth、pygment、pyperclip

1.2 安装
[*]安装Python,这个就不讲了。如果不会python语言可以学,如果不会任何编程语言,用这个客户端可能还是有点难度。所以假设用户是会python的
[*]安装支持包,pip安装即可, pip install prompt-toolkit pyperclip。理论上wcwidth和pygment包在安装prompt-toolkit时会自动安装(因为是依赖项),如果没有就自行安装。pyperclip是跨平台剪贴板的处理包,prompt-toolkit中默认使用了自己的InMemoryClipboard,但这个只能在程序内部复制,所以我使用了pyperclip,可以在操作系统中的程序间复制(此处备注:经测试,在华为鸿蒙系统的termux下,pyperclip包无法复制,因此在手机上的复制,请直接使用termux的复制功能)
[*]获取PyMUD程序本体:(1)可以直接使用git从github上clone。命令行执行 git clone https://github.com/crapex/pymud.git (2)可以从github页面下载(3)可以从北侠论坛下载 https://www.pkuxkx.com/forum/thread-48138-1-1.html。后续考虑将PyMUD发布到pip上,到时候也可以直接pip install来安装了(暂时还没做)

1.3 运行在命令行下,PyMUD目录内,直接运行python pymud.py即可。linux下有时候python链接到python2,此时需要执行python3 pymud.py即可。
2. 目录文件结构及主要内容
git clone/论坛下载下来的程序本体一共10个文件(0.10b版),一个文件夹。
其中,screen_shot文件夹,是我在windows、ubuntu、以及华为手机(鸿蒙3.0)下的运行截图; LICENSE是GNU GPL V3协议;README.md是说明文件,都不是程序本体内容。
[*]settings.py 程序应用的配置文件(如何配置将在后面详述)
[*]pymud.py 主入口对象,PyMudApplication的实现,主要处理界面、菜单、快捷键、鼠标、会话管理等功能;
[*]extras.py 对prompt-toolkit库里某些类的继承修改,以适应东方字符的宽度、北大侠客行字符对齐、鼠标操作、显示的分屏处理等;
[*]dialogs.py 调用的各种对话框的实现(ui界面内容)
[*]protocol.py 处理Telnet协议,以及MUD的各种扩展协议(如MTTS、GMCP等)
[*]session.py 会话管理对象,每一个会话,就是一个角色的世界,所有会话处理,包括与protocol之间的交互、触发器、别名、变量等的处理均在此实现
[*]objects.py MUD基本对象,触发器、别名、定时器、命令等的实现类
[*]pkuxkx.py 这个文件不是程序的组成部分,只是使用pymud写的角色脚本的一个示例(如何写脚本将在后面详述)

3. 主要界面和操作

上图是主要界面,用1-7标注出7个主要内容,含义如下:
[*]菜单栏,可以鼠标操作(手机上是触控),目前只有3个1级菜单(慢慢完善中)
[*]多会话的显示和切换标签。多个会话时,每一个会话的名称会在此处,灰底亮字的是当前会话。颜色为绿色的表示当前会话处于连接状态,未处于连接状态的为白色(灰色)。可以直接单击会话名称切换会话。键盘的话,Ctrl+左右箭头可以切换
[*]滚动条。滚动条是显示上半部显示的内容在全文中的位置。注意:这个滚动条只能看,不能点{:7_278:}。上下翻页只能使用鼠标滚轮,或者PageUp\PageDown按键。鼠标滚轮是一次一行,键盘是一次一页(由于自动折行原因,滚动的时候可能不是正好这么多,这是prompt-toolkit的问题,还在完善中)
[*]中间分隔线。当向上滚动或翻页的时候,会产生中间分隔线,此时上半部分不再滚动,下半部分持续滚动显示最新的消息(由于自动折行原因,显示可能会把最下面的行折行给漏掉,这是prompt-toolkit的问题,还在完善中)。取消分隔的话,可以向下滚动到底,或者Ctrl-Z快捷键取消(仿zmud操作)
[*]命令输入行。命令输入行支持历史记录、以及基于历史记录的自动建议和自动完成。键盘上下方向键可以在历史记录中选择,键盘右键实现历史记录建议的自动完成。比如前面输入过ask pu about job,后面输入ask的时候,后面的 pu about job会以灰色显示(表示自动建议),只需键盘右箭头,即可完成输入。
[*]状态栏,显示状态信息,目前只有会话切换、复制内容的信息会显示,可以通过app.set_status来设置显示的文字
[*]状态栏(右),显示连接状态和连接时间。因为基于控制台的ui不是时刻刷新,因此链接的时间有时会滞后显示,看上去就是秒在跳动,不影响时间记录.



__________________________________________________________________________________________
PS:吐个槽,写这个好麻烦,论坛编辑更麻烦,我只能慢慢来写了。啥时候论坛能支持markdown语法解决啊...


toobadboy 发表于 2023-7-9 13:09:02

不明觉厉

icer 发表于 2023-7-9 13:11:55

等我在wiki建个北侠玩家自己开发的客户端列表,由作者维护内容,支持md

icer 发表于 2023-7-9 14:08:05

https://pkuxkx.com/wiki/start#北侠玩家自研客户端

newstart 发表于 2023-7-9 15:16:21

icer 发表于 2023-7-9 02:08 PM
https://pkuxkx.com/wiki/start#北侠玩家自研客户端

弱弱的问一下,这个wiki编辑的“创建该页面”按钮在哪里{:7_274:}



icer 发表于 2023-7-9 15:33:06

经验大于50万,右边会出编辑图标

newstart 发表于 2023-7-9 15:36:05

本帖最后由 newstart 于 2023-7-9 03:37 PM 编辑

icer 发表于 2023-7-9 03:33 PM
经验大于50万,右边会出编辑图标


可是我这都8M了啊,为什么没有{:7_289:}
是不是我账号注册早,论坛和角色没有关联起来?没读到角色信息?我是2018年的注册账号了...



icer 发表于 2023-7-9 16:03:37

newstart 发表于 2023-7-9 03:36 PM
可是我这都8M了啊,为什么没有
是不是我账号注册早,论坛和角色没有关联起来?没读到角色信息 ...
重新登录一下mud就好

zhuzi 发表于 2023-7-9 17:10:12

SimpleAlias好啊

self._aliases['ali_get'] = Alias(self.session, "^gp\s(.+)$", id = "ali_get", onSuccess = self.getfromcorpse)
\s(.+)获取到到参数怎么传到getfromcorpse()里没看懂,self.getfromcorpse没参数啊

期待下一章教程

simcore 发表于 2023-7-10 00:49:31

给大牛点个赞!祝游戏内游戏外都顺利成功。
页: [1] 2 3 4
查看完整版本: 【PyMUD】PyMUD使用指南-基础篇(一)