Re: [闲聊] tmi2-mudlib 的更改

楼主: laechan (挥泪斩马云)   2014-06-13 10:41:33
网页好读版: http://www.ptt.cc/bbs/mud/M.1402627296.A.1E8.html
tmi2_fluffos_v3_改,20140612 版本
http://sanclaechan.myweb.hinet.net/tmi2_fluffos_v3_modify.rar
建议下载并解压缩后目录位置为 D:\tmi2_fluffos_v3_改\
(底下以 tmi2_v3_改 简称)
WinXP 使用者,可直接双击 D:\tmi2_fluffos_v3_改\bin\启动 mud 捷径,
即可执行 mud。Win7 或 Win8 使用者,则务必先参考底下这篇:
http://www.ptt.cc/bbs/mud/M.1399357070.A.366.html
mud 启动成功后,目前确定以 pietty 连线 localhost 5000 (Telnet),可
连线成功:
http://imgur.com/IQwusvX.jpg
在 tmi2_fluffos_v3_改\ 目录下会放一些图片及说明文件。
目前连线 telnet://210.61.157.53:5000 可连到以最新版本所架的测试站
,有公频聊天指令可使用;mail 向 laechan.bbs@ptt.cc 申请 tmi2 频道
互通,则可使用 tmi2 频道进行跨站聊天。
==================================================================
本次修改范围: 2014/06/10~2014/06/12
一、虚拟物品系统既怪物掉落物系统实装
相关档案: /include/vobj.h
/adm/daemons/vobjd.c
/std/vobj.c (单纯房间档案)
/cmds/wiz/_vobj.c
/cmds/std/_ob.c
其它更动: /adm/etc/preload 加载 /adm/daemons/vobjd.c
/std/monster.c 的 die 函数增加呼叫 vobjd.c
/include/daemons.h 增加 VOBJ_D 定义
vobjd.c 使用 /data/vobj.o 储存盘
核心指令有两个,wiz 使用的 vobj 以及共通指令 ob,底下会有相
关 demo。理论上使用者不需知道 vobjd.c 的架构,只需了解上述两
个指令如何使用即可。
vobjd.c 的两个 mapping 资料架构如下
第一层主key 第二层 第三层
vobj_data = ([
"编号标头":([
"编号":([
"name":"物品名称",
"value":"物品价格",
.
.
]),
]),
]);
例如 vobj_data["m"]["m001"]["name"] 即可取得 m001 的名字。
第一层主key 第二层 第三层
mob_drop = ([
"怪物所在目录":([
"怪物档名":([
"编号":掉落率数值,
"档名":掉落率数值,
.
.
]),
]),
]);
例如 mob_drop["/d/area/newbie/mob"]["rabbit1"]["m001"]
就可取得 "/d/area/newbie/mob/rabbit1" 的 m001 物品掉落率数值
mob_drop["/d/area/newbie/mob"]["rabbit1"]["/d/area/newbie/obj/map1"]
就可取得 "/d/area/newbie/mob/rabbit1" 的 map1 这个物品的掉落率数值
从上面可发现 mob_drop 亦可支援实体物品的掉落。
这个系统最大的好处,就是在做虚拟物品的设定或是怪物掉落率的设
  定时,都无需动到怪物或是物品档案,比方传统我们设计打死一只怪
  物时会掉落实体物品,必须先将该物品 clone 出来 move 到该怪物
  上,或是让怪物自订 die 函数来执行物品掉落,往后则只需要将掉
  落资讯设定在 mob_drop,怪物一被 call die 就会执行物品掉落判
  断。
二、新增 ansi color 的相关函数
写在 /adm/simul_efun/format_string.c (字串处理相关)
包含 get_ansi_color 及 no_ansi_color 两个函数。
比方某字串是 "$HIR$test$NOR$",get_ansi_color 可以将这个字串
转成 HIR"test"NOR,即 test 这样的颜色字串。
而 no_ansi_color 则会将颜色字串消去,上述字串会变成 "test"。
这两个字串我是规划日后有可能频繁读取,所以放进全域函数区。
(sanc 也有类似的东西只是放成 /adm/daemons/color_d.c)
三、模拟的(阳春的) intermud channel 设定实装
相关档案: /include/simul_intermud.h
/adm/daemons/channeld.c
/adm/daemons/logind.c
相关修改: /std/user.c 的 cmd_hook 函数,增加 "tmi2" 频道
指令。
模拟结果类似底下
http://imgur.com/ExDbzQA.jpg
channeld.c 主要新增几个 socket 相关的函数,并在 channel
函数内新增 "tmi2" 频道指令(使用者可更改此指令名称)。
logind.c 则在 get_name 函数内新增 socket 讯息的接收程式
段落。
四、其它修改
/bin 目录下新增另一个启动 mud 的捷径“启动 wiz”。先执行
“启动 mud”再执行“启动 wiz”即可让自己的 pc 跑两个 mud
,一个默认 port = 5000,一个默认 port = 6000。
  两个 mud 跑同一个 /lib,但是 6000 默认只有 wiz 可登入,
相关程式段落可见 /adm/daemons/logind.c 的 get_name 函数。
http://imgur.com/OZ3KXWb.jpg
修正 wear all 时的显示错误。
修正当战斗中下 recall 回到起始点后,战斗不会结束的问题。
(修正与战斗对象不同房间时战斗不会结束的问题)
修改 /adm/daemons/newuserd.c,为新玩家加上初始等级与经验
  值的设定。(可搜寻该档案内的 set_levels 字串)
新增 /cmds/std/_attack2.c、_config2.c、_score2.c,做为日
后使用者写指令时的参考(正式指令是 attack、config、score)
类似的做法日后会持续采用,非正式指令后面都会有编号,并且
是可执行的,使用者就可依执行结果做为自己写指令时的参考。
============================================================
底下是一些 demo:
> vobj -list
虚拟物品名称 编号 单位 种类 价格 携带 交易 贩卖
===============================================================
兔毛 m001 个 怪掉落 362 99 可 可
兔牙 m002 个 怪掉落 501 99 可 可
===============================================================
> vobj -export
vobj -set 兔毛;m001;;;;362;;;;;
vobj -set 兔牙;m002;;;;501;;;;;
上面的意思就是说,所有设定的结果会被 -export 汇出来。复制它
们再贴上,就能把资料设定进去,如下..
> rm /data/vobj.o
Rm: /data/vobj.o removed.
> update /adm/daemons/vobjd.c
/adm/daemons/vobjd: Updated and loaded.
> vobj -list
虚拟物品名称 编号 单位 种类 价格 携带 交易 贩卖
===============================================================
===============================================================
这样就没东西了,然后把上面两行复制后贴上:
> vobj -set 兔毛;m001;;;;362;;;;;
vobj -set 兔牙;m002;;;;501;;;;;
就会出现如下讯息:
vobj_data[m][m001]=([ "value" : 362, "name" : "兔毛" ]) 设定 ok.
vobj_data[m][m002]=([ "value" : 501, "name" : "兔牙" ]) 设定 ok.
> vobj -list
虚拟物品名称 编号 单位 种类 价格 携带 交易 贩卖
===============================================================
兔毛 m001 个 怪掉落 362 99 可 可
兔牙 m002 个 怪掉落 501 99 可 可
===============================================================
这样设定就回来了,这就是 -export 的原意。
而因为可以用复制贴上的方式汇入资料,因此使用者也可以自己在记事本
上编辑要汇入的一整串内容,编好后贴上,就能做整批式的汇入。
(删除也是一样)
怪物掉落物的设定亦参照类似的概念
> vobj -mob_drop_list all
cd /d/area/newbie/mob
vobj -mob_drop rabbit1 set m001 = 5000
vobj -mob_drop rabbit1 set m002 = 5000
vobj -mob_drop rabbit1 set /d/area/newbie/obj/map1 = 5000
将上面的结果,复制贴上于 mud,即可完成大批式的怪物掉落物设定
其它内容可参见 vobj 的指令说明。
============================================================
ob 指令的部份:
> ob
你的物品栏带着 2/99 种物品:
╔════════════╦════════════╦══════════╗
║ 1.兔毛 ( 56)║ 2.兔牙 ( 53)║          ║
╠═════╦══════╩════════════╩══════════╣
║ 指令说明 ║ob ? (指令 i 可以看"身上的物品") ║
╚═════╩══════════════════════════════╝
对照身上的资料字段
> data me
vobj : ([ "m002" : 53, "m001" : 56 ])
亦写有 query_vobjs、set_vobjs、add_vobjs、del_vobjs 等函数。
> ob view m001
兔毛(物品编号: m001)
────────────────────────────
型态:怪掉落
重量:99
价格:362
贩卖:可
交换:可
一个兔毛,可向收集品商人购买。
────────────────────────────
档案路径:/std/vobj。
使用者身上不需带有兔牙,只要知道 m001 这个编号就能 view。
这就是编号的好处,因为当玩家知道能 view m001 时,自然就会
想 view 看看有没有 m002、m003、....
亦即玩家可因此知道全部的 mXXX 物品的资讯。
> ob view 兔牙
兔牙(物品编号: m002)
────────────────────────────
型态:怪掉落
重量:99
价格:501
贩卖:可
交换:可
一个兔牙,可向收集品商人购买。
────────────────────────────
档案路径:/std/vobj。
ob view 亦支援直接给物品名称的 view 方式。
> ob search 兔牙
线上目前拥有物品 兔牙 的玩家人数: 1 人.
其它内容可参见 ob 的指令说明。
============================================================
> vobj -mob_drop_list all
cd /d/area/newbie/mob
vobj -mob_drop rabbit1 set m001 = 5000
vobj -mob_drop rabbit1 set m002 = 5000
vobj -mob_drop rabbit1 set /d/area/newbie/obj/map1 = 5000
上面的 5000 即是 50.00% 的意思,即掉落机率 50%。
> call rabbit;die
小兔兔(Small Rabbit)发出一声惨叫!!
小兔兔(Small Rabbit)慢慢的倒在地上...死了!
你得到了一个兔牙.
你得到了一个新手地图(newbie map).
OBJ(小兔兔 /d/area/newbie/mob/rabbit1#24)-> die() = 0
掉落率采串联判断,也就是怪物有可能一次掉落两种物品以上,只
要它被设定会掉两种物品以上。
怪物档不需做任何更动,即可实装掉落效果,就是此系统最大好处
===========================================================
tmi2 远端频道交谈指令,以架在我自己 pc 下的 tmi2_v3_改 与
sanc 的交谈为例
> tmi2 向 sanc 端发送讯息测试
>
【远端】Laechan(TMI-2 Win32)说道: 向 sanc 端发送讯息测试 (From: Laechan's PC)

 我这一边发送出去的讯息
【远端】Laechan:进阶法师(Sanctuary)说道: sanc 端有收到讯息 (From: 圣殿主机)

sanc 那边回回来的讯息
> chatlog
(10:31) 【远端】Laechan:进阶法师(Sanctuary)说道: sanc 端接收到讯息了
(From: 圣殿主机)
(10:31) 【远端】Laechan(TMI-2 Win32)说道: 向 sanc 端发送讯息测试
(From: Laechan's PC)
目前 tmi2_v3_改 的 chatlog 会自动纪录收到的讯息。
tmi2_v3_改 的使用者可向我申请开通 tmi2 频道互连,只要给我底下的资讯
1.tmi2_v3_改 的站台 ip 及使用的 port
2.你想使用的站台名字(没有申请这一项时,From: 那边就会带出 IP 而非名字)
非 tmi2_v3_改 的 mud adm 亦可向我申请,只要你的 mud 有针对 logind
处理档及公频管理档做对映的修改即可,需修改项目就自行 download 最上
面的 tmi2_v3_改 的压缩档,download 下来解压缩后自行参照对映的程式
段落即可。(像 sanc 就是参考 tmi2_v3_改 的相关程式段落做对映修改)
PS因为远端讯息的最后都会由 SERVER 端附加 From 的资讯,各站使用者就
 可根据这个 From 资讯做进一步的过滤。
其它详见修改日志。
Laechan

Links booklink

Contact Us: admin [ a t ] ucptt.com