作者laechan (小太保)
看板mud
标题Re: [闲聊] tmi2-mudlib 的更改
时间Mon Jun 23 16:27:38 2014
网页好读版:
http://webptt.com/cn.aspx?n=bbs/mud/M.1403512062.A.D9C.html
tmi2_fluffos_v3_改,20140623 版本
http://sanclaechan.myweb.hinet.net/tmi2_fluffos_v3_modify.rar
建议下载并解压缩後目录位置为 D:\tmi2_fluffos_v3_改\
(底下以 tmi2_v3_改 简称)
新旧目录之间资料的替换主要以底下目录为主
1./data
2./u <= 比方你已经有建立自己的使用者目录了
3./doc <= 比方你已经有新增一些说明文件了
比方你已经有在前一版本的 tmi2_v3_改 用 vobj 指令设定了一些虚拟物
品了,那只要把前一版本的 /data 目录的 vobj.o 拿来盖掉新的 vobj.o
,这样旧版本的 tmi2_v3_改 的虚拟物品资料就能移植到新的版本。
WinXP 使用者,可直接双击 D:\tmi2_fluffos_v3_改\bin\启动 mud 捷径,
即可执行 mud。Win7 或 Win8 使用者,则务必先参考底下这篇:
http://webptt.com/cn.aspx?n=bbs/mud/M.1399357070.A.366.html
mud 启动成功後,目前确定以 pietty 连线 localhost 5000 (Telnet),可
连线成功:
http://imgur.com/IQwusvX.jpg
在 tmi2_fluffos_v3_改\ 目录下会放一些图片及说明文件。
管理者帐号预设为 mudadm,密码 mudadm,只允许本机端登入,无法远端登
入。欲新增管理者帐号,请依序做底下动作
1.修改 /adm/etc/groups 档,将欲新增的管理者帐号加到 (admin) 群组
2.修改 /include/config.h 档,确定 #define AUTO_WIZHOOD 没有 // 掉
3.启动 mud,然後创建一个步骤 1 所指定的管理者帐号角色
4.角色创完後 save quit,然後关闭 mud
5.再修改 /include/config.h 档,将 #define AUTO_WIZHOOD 给 // 掉
6.再重新启动 mud
7.此时再登入你的管理者角色帐号,此帐号就具有管理者权限
目前连线 telnet://210.61.157.53:5000 可连到以最新版本所架的测试站
,有公频聊天指令可使用,也有远端频道指令 tmi2 可使用,使用前 mail
给
[email protected] 提出申请,信件内容需有:
1.你所架的站台 ip 及 port
2.你所架的站台之名称(若没有这个名称会内定为 XXX's PC
==================================================================
本次修改范围:20140619~20140623
一、新增群式怪物继承档 GMONSTER = /std/gmonster.c
对群式怪物的描述采用 sanc 的描述,但是程式架构不采用 sanc 的
架构(因为作者不是我),gmonster.c 基本上 inherit monster.c,
但是自订底下函数
void init(); 怪物被触发时的函数
string query_short(); 读取怪物 short 名称的函数
int query_points(string str); 读取怪物 hp/sp/.. 的函数
int receive_damage(int damage); 怪物损血时呼叫的函数
群式怪物不需 set("short"),但需 set("member") 即只数。
群式怪物档案可参考 /d/area/newbie/mob/bear1.c
群式怪物的 script_mob 档可参考 /d/area/redant/script_mob
底下会有群式怪物的相关 demo。
二、修改 /adm/simul_efun/base_name.c,新增 explode_base_name 全
域函数
base_name(ob) = "/d/area/newbie/room
/001"
↓
则 └────────┐
↓
explode_base_name(base_name(ob)) = "/d/area/newbie/room
*001"
也就是最後一个 / 会被替换为 *,这样就容易对这样的字串做目录
与档名的拆解。
三、/cmds/std/_help.c 指令档再补强
增加「虚拟目录」以及相关指令功能:
数字 : 进入一个目录或观看一个说明档案
0 或 < : 回上一层
q : 离开
底下指令只有 wiz 可以使用
add 数字 : 将某一项目还原
name 数字 = 名称 : 将某一项目取新的名称
virtual *目录 = 名称 : 新增一虚拟目录
link 数字a to 数字b : 将 a link 到 b 这个虚拟目录
unlink 数字a : 取消 a 的 link
data : 显示所在目录有哪些设定资料
del 数字 : 将某一项目遮蔽不显示或删除一虚拟目录
底下会有 demo。
四、修改 /cmds/object/_update.c
增加两种指令语法
update -n 数字a-数字b
比方对 001.c~400.c 这个范围做 update,就是 update -n 1-400
(这个语法还存在改版的空间,下一次再改版,它会更方便)
update -p
它可以对整个目录的 .c 档做 update。
五、新增 /cmds/std/_betla.c,线上赌盘指令
直接下载 sanc 由我写的指令,连同 /open/betla 也一起下载。
底下会有 demo。
六、新增 tmi2_v3_改 专用的地图系统
这个系统最重要的功能是做地图的共享,这个往後的改版会有更进
一步的说明。
修改日志则有提到要新增这个系统需要新增及更动哪些东西,使用
者可参考修改日志档,这里不做赘述(因为很长)。
底下会有 demo。
七、修改 /adm/simul_efun/attack.c 的 defence_attack 函数
增加如何写盾挡及武器招架的程式段范例。
底下会有 demo。
八、其它修改
修正 !指令 、 数字 !指令 等上一次版本有 bug 的部份。
修改 /std/user.c 的 complete_setup 函数,对每一个登入的玩家
做部份数值初始化的工作。
修改 /adm/simul_efun/adminp.c,新增 wiz_lv 函数,可简易判断
一个使用者 id 是不是 wiz,是的话就会传回 >0 的数值。
(使用者可用 running code: write(wiz_lv("随便一个id")) 去看
新增 /cmds/std/_who2.c、_guild2.c,供使用者写指令时参考。
新增 /d/area/redant 区域目录,即 sanc 的「炙蚁地狱」区域
修改 /include/mudlib.h 全域定义档,於最底下新增更多的定义
=================================================================
demo 区
> l
[/d/area/redant/180 ]
炙蚁地穴-第二层
这座洞穴长年栖息着巨大的蚁类,嘎吱嘎吱的走动声音不时从洞
穴的深处传来,生活在这里的炙蚁,其酸液据说是珍贵的药材!
明显出口有: east 和 west.
工炙蚁群(worker redants) [
10群工炙蚁]
> data redants
id : ({ "worker redants", "redants",
"monster" })
member : 10 <- 只数
short : "@@query_short" <- 此时会读取 query_short 函数去产生
unit : "群工炙蚁" <- unit 跟一般怪物的设定不太一样
一般怪物顶多设 "只", "位", ..
现在所有新式区域产生的怪物会自动带的怪物 id 是 "monster"
,这个 id 定义在 /include/mudlib.h 的最底下。
上面各颜色则对映其作用的位置。
> wear all
你装备上小盾牌(shield).
你装备上格斗匕首(fight dagger).
你装备上所有的东西!
> k redants
你对着工炙蚁群喝道: 「小王八蛋! 今日不是你死就是我活! 」
☆☆☆ 战 斗 开 始 ☆☆☆
你手握格斗匕首刺向工炙蚁群,造成结实的伤害!(170)
工炙蚁群用酸液喷向你,
但是被你以小盾牌挡开了! <= 盾挡成功判断到的讯息
你手握格斗匕首戳向工炙蚁群,造成结实的伤害!(170)
工炙蚁群猛烈地攻击你,但是无关痛痒... <= 闪格挡没有成功
你手握格斗匕首刺向工炙蚁群,造成结实的伤害!(170)
工炙蚁群用酸液喷向你,
但是被你以格斗匕首格开了! <= 武器招架成功判断到的讯息
.
.
你手握格斗匕首捅向工炙蚁群,造成结实的伤害!(170)
工炙蚁群 死掉了 1 群工炙蚁! <= 开始死第一只
.
.
工炙蚁群猛烈地攻击你,但是被你以小盾牌挡开了
你手握格斗匕首捅向工炙蚁群,造成结实的伤害!(170)
工炙蚁群 死掉了 1 群工炙蚁! <= 死第九只了
工炙蚁群用酸液喷向你,但是无关痛痒...
你手握格斗匕首刺向工炙蚁群,造成结实的伤害!(170)
工炙蚁群 死掉了 1 群工炙蚁! <= 第十只阵亡
工炙蚁群
全体阵亡了。 这时就全体阵亡
工炙蚁群(worker redants)发出一声惨叫!!
工炙蚁群(worker redants)慢慢的倒在地上...死了!
○○○ 这场战斗结束了! ○○○
如果四个人围殴「这只怪物」,那麽在上面 10 只的死掉过程中,
就可以实现:
玩家A 打死了 3 只
玩家B 打死了 4 只
玩家C 打死了 2 只
玩家D 打死了 1 只
========================================================================
explode_base_name 的好处可以用底下的 running code 说明
tmp=base_name(environment(me));
write("explode 前: "+tmp+"\n");
tmp=explode_base_name(tmp);
write("explode 後: "+tmp+"\n");
// 第一种方式: 用 explode, 以 "*" 为分隔字
obs=explode(tmp,"*");
write("目录: "+obs[0]+", 档名: "+obs[1]+"\n");
// 第二种方式: 用 strsrch, 找出 "*" 在字串里的位置
i=strsrch(tmp,"*");
j=strlen(tmp);
write("目录: "+tmp[0..i-1]+", 档名: "+tmp[i+1..j-1]+"\n");
========== 程式执行区 ==========
explode 前: /d/area/redant/313
explode 後: /d/area/redant
*313
目录: /d/area/redant, 档名: 313
目录: /d/area/redant, 档名: 313
<= 两种做法都能得到相同结果
========== 程式执行区 ==========
传统上要取出目录及档名要用 while 去做,现在有 explode_base_name
就方便很多,使用者可依需要看是要用 explode 的方式或 strsrch 的
方式分解出目录及档名皆可。
================================================================
再来是 help 的 demo。我已经先建立 /doc/skill 目录,并且从 sanc
下载了一些技能说明档。
> ls /doc/skill
Path: [/doc/skill]
1 adventure_heart 1 counter 1 parry
1 backstab 1 dagger 1 return_spell
1 barefist 1 daggermaster 1 shield
1 blade_heart 1 dodge 1 thunder_spell
1 blizzard 1 egingin 1 watershield
1 bousou 1 fighter_heart
> help
[/doc/]
1.README 2.[concepts] 3.[daemons]
4.[driverdoc] 5.[emote] 6.[etc]
7.[functions] 8.[help] 9.[lpc]
10.[mudlib] 11.[properties] 12.[skill]
13.[wizhelp] 14.备忘 15.回上一层.
请输入:
首先,可以把 12 那一项改名为 技能
请输入: name 12 = 技能
skill 已更名为 技能.
[/doc/]
1.README 2.[concepts] 3.[daemons]
4.[driverdoc] 5.[emote] 6.[etc]
7.[functions] 8.[help] 9.[lpc]
10.[mudlib] 11.[properties]
12.[技能]
13.[wizhelp] 14.备忘 15.回上一层.
请输入:
然後进入 12
请输入: 12
[/doc/skill/]
1.adventure_heart 2.backstab 3.barefist
4.blade_heart 5.blizzard 6.bousou
7.counter 8.dagger 9.daggermaster
10.dodge 11.egingin 12.fighter_heart
13.parry 14.return_spell 15.shield
16.thunder_spell 17.watershield 18.回上一层.
请输入:
从上面可以看出技能其实有冒险者的、有盗贼的、有战士的、有骑士的
......通通都放在同一个目录。这时就可以建虚拟目录,例如说先来建
一个冒险者的:
请输入:
virtual *adventure = 冒险者(adventure)
虚拟目录 冒险者(adventure) 已新增.
[/doc/skill/]
1.[冒险者(adventure)] 2.adventure_heart 3.backstab
4.barefist 5.blade_heart 6.blizzard
7.bousou 8.counter 9.dagger
10.daggermaster 11.dodge 12.egingin
13.fighter_heart 14.parry 15.return_spell
16.shield 17.thunder_spell 18.watershield
19.回上一层.
请输入:
虚拟目录的 *adventure 的 * 就是虚拟目录的标头,有 * 就是虚拟目
录,没有 * 就不是。
接下来,就可以把 adventure_heart、barefist、dodge、parry、
shield 这五个技能 "link" 到 1.[冒险者(adventure)]:
请输入: link 2 to 1
已将文件 adventure_heart link 到 冒险者(adventure) 中了.
请输入: link 3 to 1
已将文件 barefist link 到 冒险者(adventure) 中了.
.
.
请输入: link 12 to 1
已将文件 shield link 到 冒险者(adventure) 中了.
[/doc/skill/]
1.[冒险者(adventure)] 2.backstab 3.blade_heart
4.blizzard 5.bousou 6.counter
7.dagger 8.daggermaster 9.egingin
10.fighter_heart 11.return_spell 12.thunder_spell
13.watershield 14.回上一层.
请输入:
然後我们进 1.[冒险者(adventure)] 去看
请输入: 1
[/doc/skill/*adventure/]
1.adventure_heart 2.barefist 3.dodge
4.parry 5.shield 6.回上一层.
请输入:
同样的,上面的东西也可以命名,例如把 1 命名成冒险者之心
请输入:
name 1 = 冒险者之心
adventure_heart 已更名为 冒险者之心.
[/doc/skill/*adventure/]
1.冒险者之心 2.barefist 3.dodge
4.parry 5.shield 6.回上一层.
请输入:
然後看一下 1 这个档案在说些什麽
请输入:
1
冒险者之心(Adventure heart)
这是个冒险者公会的技能,使用後可以让新手冒险者更有勇气及
能力去面对未来将会碰上的事件及怪物,虽然帮助有限,但对初
期的冒险者来说,这是非常有用的。
*使用方式:heart adventure。
指令 a 及 score l 可观看使用後的影响。
请按 enter 键继续...
[/doc/skill/*adventure/]
1.冒险者之心 2.barefist 3.dodge
4.parry 5.shield 6.回上一层.
请输入:
也可以解除某一个档案的 link
请输入:
unlink 2
你解除了 barefist 的 link 设定.
[/doc/skill/*adventure/]
1.冒险者之心 2.dodge 3.parry
4.shield 5.回上一层.
按 < 就能返回上一层:
请输入: <
[/doc/skill/]
1.[冒险者(adventure)] 2.backstab
3.barefist
4.blade_heart 5.blizzard 6.bousou
7.counter 8.dagger 9.daggermaster
10.egingin 11.fighter_heart 12.return_spell
13.thunder_spell 14.watershield 15.回上一层.
请输入:
可以看见 barefist 已经是未 link 状态。
然後如果把 1. 那个虚拟目录整个删掉,就会变成如下:
请输入:
del 1
*adventure 已删除.
[/doc/skill/]
1.adventure_heart 2.backstab
3.barefist
4.blade_heart 5.blizzard 6.bousou
7.counter 8.dagger 9.daggermaster
10.dodge 11.egingin 12.fighter_heart
13.parry 14.return_spell
15.shield
16.thunder_spell 17.watershield 18.回上一层.
请输入:
所有曾被 link 到 虚拟目录 的档名就会回到未 link 状态。
这样就能实现树状型式的输入型 help 功能,而且管理者也能透过
选单功能快速建立树状架构。
这东西比 sanc 现用的 help 及未完全开放的 xhelp 功能更强。
==========================================================
线上赌盘指令如下:
> betla
现有赌盘:
========================================================================
========================================================================
betla [赌盘编号] 即可参与线上投注,请参阅 betla 指令说明。
到 /open/betla 目录下随便读入一个 betla 档
> cd /open/betla
/open/betla
> ls
Path: [/open/betla]
1 20111114_5 1 20130413_1 1 betla.c 1 r1
1 20130410_1 1 20130415_1 1 betla_ex realtime/
1 20130410_2 baseball/ 1 laechan tseng/
1 20130411_1 1 betla polite/ wang/
> betla readfile 20130415_1
欲开赌盘:北韩20130414(日)发射飞弹
金额设定:每注 3000 影特币
封盘时间:600 分钟後
赌盘项目:会打美国
会打韩国
会打日本
会打其它(例如只射向东海)
不会射
其它可能
赞助赌盘
<< 你赞助了 9999 注 >>
确定请按 Y or y: Y
跟 more 该档的结果对照
> more 20130415_1
北韩20130414(日)发射飞弹 <= 赌盘标题
3000 <= 每注多少
600 <= 封盘时间设定在「几分钟後」
add:9999 <= 官方赞助多少注
会打美国 <= 赌盘选项1
会打韩国 <= 2
会打日本 <= 3
会打其它(例如只射向东海) <= 4
不会射 <= 5
其它可能 <= 6
赞助赌盘 <= 最後一项预设为赞助赌盘
> betla
现有赌盘:
========================================================================
1. 北韩20130414(日)发射飞弹 封盘时间:2014/06/24 02:02
========================================================================
betla [赌盘编号] 即可参与线上投注,请参阅 betla 指令说明。
> betla 1
赌盘:北韩20130414(日)发射飞弹
每注:3000 影特币
======================================================================
1.会打美国 0 注(赔率:0.000000)
2.会打韩国 0 注(赔率:0.000000)
3.会打日本 0 注(赔率:0.000000)
4.会打其它(例如只射向东海) 0 注(赔率:0.000000)
5.不会射 0 注(赔率:0.000000)
6.其它可能 0 注(赔率:0.000000)
7.赞助赌盘 9999 注(赔率:1.000000) (你已下 9999 注)
======================================================================
指令语法:betla [赌盘编号] [赌盘项目] [下注数].
比方我们下注 1
> betla 1 1 1000
betla: 下注完毕.
> betla 1
赌盘:北韩20130414(日)发射飞弹
每注:3000 影特币
======================================================================
1.会打美国 1000 注(赔率:10.999000) (你已下 1001 注)
2.会打韩国 0 注(赔率:0.000000)
3.会打日本 0 注(赔率:0.000000)
4.会打其它(例如只射向东海) 0 注(赔率:0.000000)
5.不会射 0 注(赔率:0.000000)
6.其它可能 0 注(赔率:0.000000)
7.赞助赌盘 9999 注(赔率:1.100010) (你已下 9999 注)
======================================================================
指令语法:betla [赌盘编号] [赌盘项目] [下注数].
然後假设我们要手动封盘(时间到它也会自动封盘)并开奖:
> betla set 1
1.赌盘:北韩20130414(日)发射飞弹(1 to [新标题])
2.赌项:共 7 个(2 [n] to [新名称])
({ "会打美国", "会打韩国", "会打日本", "会打其它(例如只射向东海)", "不会射", "其它可能", "赞助赌盘" })
3.每注:3000 影特币(3 to [n])
4.开放/暂停/取消该赌盘(4 to start/stop/halt)
(附注:4 to halt 可以补发奖金给未领取的人。)
5.设定中奖项目及开奖(5 to [n])
6.线上公告赌盘(6 to shout)
===================================================
请输入(直接按[ENTER]为离开设定):
4 to stop
betla: 你暂停了该赌盘的下注.
请输入(直接按[ENTER]为离开设定):
5 to 1
赌盘:北韩20130414(日)发射飞弹
项目:会打美国
你决定开这个奖项吗(y/n):
y
【赌盘系统】北韩20130414(日)发射飞弹
【赌盘系统】本赌盘开 1. 会打美国
【赌盘系统】赔率 10.999000,每一注可得 32997 影特币.
【赌盘系统】你下注了第 1 个项目,赢得赌金 33029996 影特币!
【赌盘系统】赢得了赌盘使你的赌技有所增长!
【赌盘系统】laechan 买了 1001 注赢得赌金 33029996 影特币!
剩余未领奖人员:
我曾用这指令在 sanc 开过金曲奖、金马奖相关赌盘,而且是边看
转播边开赌盘,它的做法就是先把赌盘脚本档编好,如下
> ls /open/betla/realtime/2013金曲奖
Path: [/open/betla/realtime/2013金曲奖]
1 台语女歌手 1 作词人 1 原住民语歌手 1 单曲制作人
1 台语男歌手 1 客语专辑 1 国语女歌手 1 新人
1 台语专辑 1 客语歌手 1 国语男歌手 1 演唱组合
1 年度歌曲 1 音乐录影带 1 国语专辑 1 乐团
1 作曲人 1 原住民语专辑 1 专辑制作人 1 编曲人
> more /open/betla/realtime/2013金曲奖/国语女歌手
2013金曲奖─最佳国语女歌手奖
5000
300
add:9999
卢凯彤/你安安静静地躲起来
邓紫棋/第四张专辑 Xposed曝光
林忆莲/盖亚
家家 /忘不记
徐佳莹/理想人生
蔡依林/MUSE
从缺
赞助赌盘
这样当电视直播到要开始颁最佳国语女歌手了时,就马上把该赌盘
readfile 进来,然後就可以等颁奖结果揭晓,就再用 betla set
设定要开哪一项目,马上就能开出赌盘。
/open/betla 下有 sanc 开过的所有赌盘,使用者可参考。
===========================================================
新式地图系统如下
首先在 /d/area/redant 目录下下这三个指令(要分开下)
trans map1 to /d/area/redant by script_room
trans map2 to /d/area/redant by script_room
trans map3 to /d/area/redant by script_room
上面三个指令可依三张数字图各自产生出对映的房间,三个区域的
范围如下:
map1: 001.c~177.c
map2: 178.c~331.c
map3: 332.c~475.c
只要 more map1, map2, map3 就可知道其范围,而 map1x、map2x
、map3x 就是其 x-x 图。
这个区域共三层,map1、map2、map3 就代表第一、二、三层。
接着,就以 map 指令设定这三层地图的资料:
目录 层 起 迄 x-x地图档
> map -set redant 1 = 1,177,map1x
map_data[redant][0]=({ 1, 177, ({ }), "map1x" }) 资料设定 ok.
> map -set redant 2 = 178,331,map2x
map_data[redant][1]=({ 178, 331, ({ }), "map2x" }) 资料设定 ok.
> map -set redant 3 = 332,475,map3x
map_data[redant][2]=({ 332, 475, ({ }), "map3x" }) 资料设定 ok.
上面应该不难理解。如果只有一层(如 /d/area/01/01) 那当然就
只需要一行,然後给个起迄范围及 x-x 地图是哪一个档即可。
接着设定出口资料,根据 /d/area/redant/area_room.c
// 这里则可以针对房间号码变更出口设定
// 依房间号码来设定连接上下层的例子
if(n==152 && !query("exits/down"))
set("exits/down",__DIR__+"313");
if(n==313 && !query("exits/up"))
set("exits/up",__DIR__+"152");
if(n==210 && !query("exits/down"))
set("exits/down",__DIR__+"370");
if(n==370 && !query("exits/up"))
set("exits/up",__DIR__+"210");
(这里就是一个透过 area_room.c 做集中管理的例子)
我设定第一层的出口是 001 之外还有 152,第二层 210 及 313
,第三层为 370,也就是说
第一层 入口001───152
│
第二层 210───313
│
第三层 370
大概是这样的关系,这时指令就可以这样下
> map -exits redant 1 = 1,152
map_data[redant][0]=({ 1, 177, ({ 1, 152 }), "map1x" }) 设定完成.
> map -exits redant 2 = 210,313
map_data[redant][1]=({ 178, 331, ({ 210, 313 }), "map2x" }) 设定完成.
> map -exits redant 3 = 370
map_data[redant][2]=({ 332, 475, ({ 370 }), "map3x" }) 设定完成.
接着还可以再为各层命名,指令这样下
> map -name redant 1 = 炙蚁地狱第一层
map_data[redant][0]=({ 1, 177,({1,152}),"map1x","炙蚁地狱第一层"})
设定完成.
> map -name redant 2 = 炙蚁地狱第二层
map_data[redant][1]=({ 178, 331,({210,313}),"map2x","炙蚁地狱第二层"})
设定完成.
> map -name redant 3 = 炙蚁地狱第三层
map_data[redant][2]=({ 332, 475,({ 370 }),"map3x","炙蚁地狱第三层"})
设定完成.
这样设定就结束了,流程就是:
trans产生房间→map -set 设定基本资料→map -exits 设出口→map -name 设名字
然後就能使用 map 指令了,先 goto 到 /d/area/redant/001 区域入口。
> goto 001
[/d/area/redant/001 ]
炙蚁地穴-第一层
越往洞穴的深处走,你越觉得燥热难当,在这个狭窄的地方遇上
魔物的话,在战斗上极为不利,生活在这里的炙蚁,其酸液据说
是珍贵的药材!
明显出口有: south 和 east.
兵炙蚁群(soldier redants) [10群兵炙蚁]
> map
★─
口
│
口
>
由上图可知入口在区域的左上角。接着往东走两格看看
> run 2e
炙蚁地穴-第一层
明显出口有: south, east, 和 west.
黑炙蚁群(black redants) [10群黑炙蚁]
工炙蚁群(worker redants) [10群工炙蚁]
炙蚁地穴-第一层
明显出口有: south, east, 和 west.
> map
@─
口─
★─
口
│ │ │
口 口─
口
>
上面包含了三种东西
1.你走了多少范围,就显示多少范围的地图出来
2.区域的出口会以
@ 标示
自己则以
★ 标示
房间则以
口 标示
路线则以 ─ │ 标示
3.它不只显示你走过的房间,连相邻的房间也显示
wiz 如果下 map here 则会看到全图:
> map here
@─口─
★─口 口─口─口─口─口─口 口 口 口─口─口 口
│ │ │ │ │ │ │ │ │ │ │ │ │
口 口─口─口─口─口 口─口─口─口─口─口─口─口 口─口 口─口
│ │ │ │ │ │ │ │ │
口─口 口─口─口─口 口─口─口─口 口─口─口─口─口─口─口─口─口
│ │ │ │ │ │ │ │ │ │ │
口─口─口─口─口─口─口 口─口─口 口─口─口 口 口─口 口─口 口─口
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
口─口─口 口─口─口─口─口─口─口 口─口 口 口─口─口─口 口
│ │
口─口─口─口 口 口 口─口─口─口─口 口
│ │ │ │ │
口─口 口─口 口─口─口 口─口 口─口─口─口─口 口─口─口
│ │ │ │ │ │ │ │ │
口─口 口 口─口─口─口 口─口─口─口 口─口─口 口 口─口─口─口
│ │ │ │ │ │ │
口 口─口─口─口─口 口 口 口 口─口─口
@ 口 口─口─口─口 口─口
│ │ │ │ │ │ │ │ │ │ │ │ │
口─口 口 口─口─口─口─口─口 口─口─口─口 口 口─口─口─口
底下模拟接近到下一个区域出口时的情况:
> run e 4s 6e 3s w 2s e n 2e s 3e 3n 2w
> map
@─口─口─口
│ │ │ │
口 口─口─口─口
│ │
口─口─口
│ │
口─口─口─口─口 口─口─口
│ │ │ │ │ │ │
口─口─口─口─口─口─口
│
口 口
│ │
口 口─口
★─口─口─口
│ │ │ │
口─口─口─口 口 口
│ │
口 口─口─口 口 口─口
│ │ │ │ │
口─口─口─口 口─口─口─口
>
然後再往南走一格
> s
[/d/area/redant/133 ]
炙蚁地穴-第一层
走在这座洞穴里令你觉得十分的闷热,嘎吱嘎吱的走动声音不时
从洞穴的深处传来,生活在这里的炙蚁,其酸液据说是珍贵的药
材。
明显出口有: south, north, east, 和 west.
兵炙蚁群(soldier redants) [10群兵炙蚁]
> map
@─口─口─口
│ │ │ │
口 口─口─口─口
│ │
口─口─口
│ │
口─口─口─口─口 口─口─口
│ │ │ │ │ │ │
口─口─口─口─口─口─口
│
口 口
│ │
口 口─口 口─口─口─口
│ │ │ │
口─口─口─口 口─
★─口 口
│ │ │
口 口─口─口
@ 口 口─口
│ │ │ │ │
口─口─口─口 口─口─口─口
>
上面包含了两种东西
1.它真的只显示你走过的范围以及其邻近房间
2.只有走到接近出口的那一格,才显示出口
在刀剑神域的某一集里,桐人与亚丝娜组队遇到克莱因,打屁闲聊
之後又遇到军队,军队的队长就开口向桐人他们要「地图」。
这个地图系统就能做到「给玩家地图」。
而例如说你希望你的 mud 有小地图,则这个地图系统是办得到的,
例如你要预设玩家能看到全图,只要修改特定段落即可(我会在地图
系统的说明文件里说明要怎麽改)。
我设计了只显示走过的范围 -> 你可以将其改成显示全图
我只设计一律显示全图 -> 你很难新增只显示走过的范围的功能
我的意思就是,我今天设计它具有「只显示走过的范围」的用意,
并不是要所有 tmi2_v3_改 的使用者都要照我设计的去跑,因为程
式是可以修改的。
但是如果我没有为 tmi2_v3_改 设计这个东西,使用者要设计出这
东西却是很困难的。
两相比较当然是「
我把它设计出来,然後由你来决定要不要用它」
(那基本上我会想设计这个,当然也是因为我本来就要用的缘故)
有任何问题或建议,都可透过推文或回文的方式让我知道。
我觉得关键是像 caselook 这位使用者,是否能光靠 map 指令所
看到的地图,就知道下一步应该怎麽走,据我的了解有些使用者是
办不到的,sanc 为此才新增了位於地图底下的资讯:
> map
炙蚁地穴-第一层(
o: 你的位置
@: 区域出入口)
@-x-x-x x-x-x-x-x-x x x x-x-x x
| | | | | | | | | | | | |
x x-x-x-x-x x-x-x-x-x-x-x-x x-x x-x
| | | | | | | | |
x-x x-x-x-x x-x-x-x x-x-x-x-x-x-x-x-x
| | | | | | | | | | |
x-x-x-x-x-x-x x-x-x x-x-x x x-x x-x x-x
| | | | | | | | | | | | | | | |
x-x-x x-x-x-x-x-x-x x-x x x-x-x-x x
| |
x-x-x-x x x x-x-x-x-x x
| | | | |
x-x x-x x-x-x x-x x-x-x-x-
o x-x-x
| | | | | | | | |
x-x x x-x-x-x x-x-x-x x-x-x x x-x-x-x
| | | | | | |
x x-x-x-x-x x x x x-x-x
@ x x-x-x-x x-x
| | | | | | | | | | | | |
x-x x x-x-x-x-x-x x-x-x-x x x-x-x-x
前往方式: recall w look mirror 输入 felid, 然後
11d 4s 32w n enter
地图说明: 本区域为亚雷克莱斯特大陆上的区域,共三层。区域一
开始的进入点为地图的最左上角。前往第二层建议走法
3e 4s 6e 3s w 2s e n 2e s 3e 3n 2w 2s down
(上面就是新增的资讯)
预计下次的版本会对 attack.c 做更多的修改、建立更多的说明文件、
并在 show 函数实装「
小黑鼠伤口鲜血满身是。」这个受伤状况讯息,
说明文件会占大部份。
Laechan
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 210.61.157.53
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/mud/M.1403512062.A.D9C.html
1F:→ laechan :明天起没啥空,但有零碎时间编文件档 210.61.157.53 06/23 16:53
※ 编辑: laechan (210.61.157.53), 06/23/2014 17:02:49
2F:推 happyhero :推啊 越来越强大的mudlib 49.158.118.57 06/23 18:45
3F:→ laechan :突然发现应该可以练习看口─口图 61.224.75.82 06/23 19:07
4F:推 tenyfish :好,上次更新我只摸到一次:p 111.70.133.98 06/23 21:19
5F:推 tenyfish :那群式怪物loot判定是如何呢? 114.37.59.169 06/23 21:51
6F:→ laechan :基本设定是杀死最後一只=呼叫die的人 61.224.75.82 06/23 22:15
7F:推 tenyfish :但是要get all不会选不到吗? 114.37.59.169 06/23 22:36
原则上 tmi2_v3_改 会避免把东西「放进」怪物身上,从虚拟物品
及怪物掉落物系统的设计可以看得出来,每一样该掉落的东西都是
有设定机率的,实体物品只有符合机率的情况才会 clone 出来。
因此是由呼叫怪物 die 函数的 killer,由他呼叫 exec_mob_drop
,但是这只是呼叫的人是他,实际上 exec_mob_drop 还是可以实现
各种 loot 设定,端看你怎麽设定。
但即便如此,你还是可以设定你的 mud 有 corpse、以及打死了东
西会掉在屍体或是掉在地上,因为这是 tmi2_v3 本来就有的东西,
只是我目前透过怪物掉落物系统而得以无视它而已。
这是你自己可以决定的。
底下举例
int exec_mob_drop(object killer,object mob)
{
mixed obs,attackers,tmps;
object ob,env;
mapping mob_drops;
string tmp;
// 怪物所在的房间
env=environment(mob);
// 该房间所有的物件
obs=all_inventory(env);
// 或是说 obs = killer 的所有队友
// obs=PARTY_D->query_members(killer);
// 该怪物死前所有的攻击对象
attackers=mob->query_attackers();
// 读出该怪物的掉宝资讯
mob_drops=mob_drop("query",base_name(mob));
tmps=keys(mob_drops);
foreach(ob in obs)
{
// ob 符合掉宝机率的条件就是要在 attackers 内
if(ob && member_array(ob,attackers)!=-1)
{
// 然後就看你怎麽设定
// 比方以 D3 的做法,每个符合掉宝的 ob
// 都会跑一次掉宝
foreach(tmp in tmps)
{
// 当符合掉宝机率时
if(mob_drops[tmp]>random(10000))
// 或者「主杀的 killer」才享有主掉宝率,其它非主杀的较低
// if(mob_drops[tmp]>random(12000) ||
// (ob==killer && mob_drops[tmp]>random(10000)))
{
// 若是实体物品就 clone 出来 move 给 ob
if(tmp[0..0]=="/")
// 或者只有主杀的 killer 才能拿到实体物品
// if(ob==killer)
// 又或者只有主杀的 killer 才能拿到机率在 1% 以下的物品
// if(ob==killer && (int)mob_drops[tmp]<=100)
clone_object(tmp)->move(ob);
// 非实体物品就是虚拟物品,就让玩家增加 1 个 tmp
else
ob->add_vobjs(tmp,1);
}
}
}
}
上面的东西很直觉,你可以把重点摆在让自己渐渐有能力写出这
些 code,这样不管你如何构思要怎麽执行掉宝,你都能在想到的
同时,就马上能将它们写成相对映的程式段,就如同我上面所写
的程式段一样,tmi2_v3 具有不管你希望它怎麽执行掉宝,它都
几乎可以办到的特质,而且很直觉,就如同你上面看到的。
既然它有这样的特质,则只要常摸就一定能熟。
※ 编辑: laechan (61.224.75.82), 06/23/2014 23:14:23
※ 编辑: laechan (61.224.75.82), 06/23/2014 23:16:39
※ 编辑: laechan (61.224.75.82), 06/23/2014 23:18:56
8F:推 tenyfish :只是函数很多,又没API查,只能慢来 114.37.59.169 06/23 23:35
常用的 efun 及 simul_efun 就那几个,我会写在说明内,然後我
事先有写在备忘内你亦可先看,就知道「其实就那几个而已」,然
後 running 指令就很适合用来练习这些函数。
我新增的系统部份,规则几乎都很共通:
/adm/daemons/vobjd.c VOBJ_D->vobj_data("query","物品编号或名字");
VOBJ_D->mob_drop("query","怪物档名");
/adm/daemons/mapd.c MAP_D->map_data("query","目录名");
/adm/daemons/chinesed.c CHINESE_D->chinese_data("query","英文");
(query/set/... 也共通,因为它们都是 cp from /adm/系统物件范例.txt)
以底下的 running code 为例
write(identify("/adm/daemons/vobjd"->vobj_data("query","m001"))+"\n"+
identify("/adm/daemons/vobjd"->mob_drop("query",
"/d/area/newbie/mob/rabbit1"))+"\n"+
identify("/adm/daemons/mapd"->map_data("query","redant"))+"\n"+
identify("/adm/daemons/chinesed"->chinese_data("query","knight"))+"\n");
========== 程式执行区 ==========
([ "name" : "兔毛", "value" : 362 ])
([ "m001" : 5000 ])
({ ({ 1, 177, ({ 1, 152 }), "map1x", "炙蚁地狱第一层" }),
({ 178, 331, ({ 210, 313 }), "map2x", "炙蚁地狱第二层" }),
({ 332, 475, ({ 370 }), "map3x", "炙蚁地狱沦胪T层" }) })
"骑士"
========== 程式执行区 ==========
我还有规划一种速查的做法,但是它跟写说明文件一样超耗时间,
sanc 一度想实装但後来我放弃了,tmi2_v3_改 确定会实装,因为
有要写说明文件,写完後再写它就会比较简单。
以前 spock@ff 也有翻译一系列的 LPC 函数说明,因为他有做释出
,所以我也会将那一系列的说明档通通放进 /doc 目录内,有中文
翻译。
大家都是从对它很不熟,然後一路走过来的。
※ 编辑: laechan (61.224.75.82), 06/24/2014 00:20:38
9F:→ laechan :任务系统接近完工,比sanc现用的还好 210.61.157.53 06/25 17:33
> quest show l001
┌──────────────────────────────┐
│任务名称:测试任务 │
│任务作者:laechan │
│关 键 字:({ "test", "测试" }) │
├──────────────────────────────┤
│任务步骤: │
│ │
│ 1.与 道具店老板--玛儿(Maor) 对话。 │
│ 2.与 修理店老板--安琪拉(Angelia) 对话。 │
│ 3.与 道具店老板--玛儿(Maor) 对话。 │
└──────────────────────────────┘
话说回来,这不是结束,而是漫长 debug 的开始。。。。。。
※ 编辑: laechan (61.224.75.82), 06/27/2014 00:49:45
10F:→ laechan :任务系统明天就能完成雏形必释出 1.165.161.242 06/30 00:29