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

楼主: laechan (挥泪斩马云)   2014-06-10 10:12:38
tmi2_fluffos_v3_改,20140610 版本
http://sanclaechan.myweb.hinet.net/tmi2_fluffos_v3_modify.rar
建议下载并解压缩后目录位置为 D:\tmi2_fluffos_v3_改\
(底下以 tmi2_v3_改 简称)
这个版本做了更有效率的压缩,档案大小约 3MB 多。
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 可连到以最新版本所架的测试站
,有公频聊天指令可使用。
==================================================================
本次修改范围: 2014/06/06~2014/06/09
一、实装 wear/remove 指令
移除 tmi2_v3 原先使用的 equip、unequip、wield、unwield 四个指
令,改成穿脱装备一律使用 wear 及 remove 指令。
(但是透过修改 /adm/etc/global_aliases,玩家还是能使用这四个指
令,只是它们会被导向 wear 及 remove)
装备是否被 wear 的参数也统一使用 "wear" 资料字段。
还有一些细部的地方要修改,集中在 /std/armor.c 与 weapon.c。
二、实装 /adm/daemons/channeld.c 公频管理系统
这是仿 sanc 对公频的规划,而 sanc 是仿 tmi2 对 channels 的规
划(所以系出同源)。
这东西简单的说就是 user.c 的 cmd_hook 函数是管理玩家下了指令
  后应呼叫什么,在它里面加上这一段:
if(verb=="chat" || verb=="rumor" || verb=="chatlog")
return CHANNEL_D->find_channel(this_object(),verb,cmd);
那么遇到玩家下 chat、rumor、chatlog 的场合就会让 channeld.c
呼叫 find_channel 函数去执行相对映的动作。
这样日后不管增加几个频道指令,都不会占用 /cmds/std 的指令数
量,而且方便管理各个公频。
三、确立 tmi2_v3_改 的 "stat" 属性字段
这是可以日后修改的。
/include/stats.h 定义了 tmi2_v3_改 使用的六个属性。
/adm/daemons/newuserd.c 也设定新玩家会预载这六个属性。
/std/body/attack.c 也建立 query_stats、set_stats、add_stats
等函数,用来统一做为属性资料的存取函数。
/std/user.c 则尚未动到相关设定。
(玩家与 mob 皆共用相同的函数)
这样日后使用者想要修改 tmi2_v3_改 的属性时,只要更动上述四
  个档案的对映内容即可,这是建立在“你的 mud 尚未正式开放给
玩家游戏”的前提。(已开放的 mud 要做更多修改是必然的)
例如说你希望你的 mud 没有 "mag" 字段,然后以动 attack.c 为
  例,它的做法就类似底下
int query_stats(string str)
{
if(str=="mag") str="int";
return data["stat"][str];
}
这样 tmi2_v3_改 原本读取 "mag" 的地方就通通会被导向为读取
"int",也就是说日后你只需要动相关的函数就行了。
四、实装新的战斗系统&普攻的部份
新增 /adm/simul_efun/attack.c 全域函数物件
它有几个与战斗系统有关的函数(而且视情况会再增加)
cant_attack(object me,object tar)
me 与 tar 能否进入战斗状态的总控管函数
damage_str(int hp,int damage)
hp 指的是 tar 的剩余 hp,damage 指的是对 tar 的伤害。比
   方 hp 剩 1000,而 damage 是 500,意思就是说这一击就造成
   对方剩余血量“又少掉 50%”,然后它就会传回一个对这一击
   的描述,如下的 running code:
> running
To end message type ".". To abort, type ~q. To view help, type ~h.
__________________________________________________________________
write(damage_str(1000,500)+"\n");
.
========== 程式执行区 ==========
对$O造成身体机能严重的伤害!
========== 程式执行区 ==========
我应该会变更这个函数,把 damage 放前面 hp 放后面,并改用
varargs 宣告,这是方便使用者日后做修改。
defence_attack(object me,object tar,int dam,int hit)
这个函数就是 me 与 tar 在进行战斗时会呼叫的函数,用来处
理闪格挡的相关判断,并得到最终的伤害计算结果及相对映的讯
   息等等。
目前我还没有写 sample 进去,之后我会写一个简易的 sample。
即便如此,使用者目前还是可以找 newbie 区域里面的小兔兔进
   行战斗测试(只是讯息几乎都会是没有造成伤害这类的)。底下会
   有 demo。
总之,闪格挡通通都是呼叫这个函数做统一处理。
notmal_attack(object me,mixed attackers,int n)
这个就是“普攻”的专门处理函数,也就是 continue_atttack
一般会持续呼叫的函数。
这个函数的运作过程很简单,它当然会先判断自己与该战斗的目
   标们是否存在,存在的话:
tar=attackers[0];
// tar=attackers[random(sizeof(attackers))];
就选出一个 tar 来做为本次攻击的目标。选择的方法不外乎两
   种:固定及乱数。tmi2_v3_改 默认为取 attackers[0]。
接着,就是呼叫 defence_attack(me,tar) 来做闪格挡方面的相
   关判断并取得结果:
// 先读取 defence_attack 的计算结果
// ({伤害, "闪格挡讯息"})
result=defence_attack(me,tar);
然后取得 me 本次攻击应击出的攻击叙述(空手, 拿武器, en..)
// 每连击一次,就取得一次 me 的攻击讯息
msg=sprintf("%s,%s",me->query_attack_msg(),result[1]);
第一个 %s 就类似 "$N用砂锅大的拳头打向$O" (me->query_attack_msg())
第二个 %s 就类似 "造成了巨大的伤害!" (result[1])
最后将 msg 传给 show 做处理:
show(me,tar,msg,result[0]);
show 也是本次新增的全域函数,写在 tell_room.c 里头。
细部的说明可参看修改日志.txt。
=================================================================
底下为 demo 的部份。
> chat *test
【闲聊】你笑道:‘测试一下东东。’
> rumor *test
【谣言】你笑道:‘测试一下东东。’
> rumor test
【谣言】你说道: test
> chatlog
(09:40) 某人 : test
(09:40) 某人 : *test
(09:40) Laechan : *test
> i
You are carrying 6 objects. (Total bulk: 0 Total weight 68)
新手地图(newbie map).
小短剑(short sword).
格斗匕首(fight dagger).
小布靴(boots).
小披风(cloak).
小布靴(boots).
> data
armor : ([ ])
armor_class : 0
damage : 0
hit_chance : 0
> wear all
你装备上小短剑(short sword). 已装备上 sword 就不会再去装备 dagger
你装备上小布靴(boots).
你装备上小披风(cloak).
你装备上小布靴(boots). <= 这有一点 bug 下次修正(实际上无装备)
你装备上所有的东西!
> i
You are carrying 6 objects. (Total bulk: 0 Total weight 68)
新手地图(newbie map).
小短剑(short sword) (已装备).
格斗匕首(fight dagger).
小布靴(boots) (已装备).
小披风(cloak) (已装备).
小布靴(boots). <= 实际上是没有装备的
> data
armor : ([ "cape" : 30, "foot" : 15 ])
armor_class : 45
damage : 175 <= 装备武防后相关数值的更动情况
hit_chance : 350
> remove all
你卸下了小短剑(short sword).
你脱下了小布靴(boots).
你脱下了小披风(cloak).
你脱卸了所有的武防!
> i
You are carrying 6 objects. (Total bulk: 0 Total weight 68)
新手地图(newbie map).
小短剑(short sword).
格斗匕首(fight dagger).
小布靴(boots).
小披风(cloak).
小布靴(boots).
> data
armor : ([ ])
armor_class : 0 资料顺利归零
damage : 0
hit_chance : 0
> data
stat : ([ "dex" : 11, "agi" : 11, "con" : 11,
"int" : 11, "str" : 13, "mag" : 11 ])
> k rabbit
你对着小兔兔喝道: “小王八蛋! 今日不是你死就是我活! ”
☆☆☆ 战 斗 开 始 ☆☆☆
你用砂锅大的拳头打向小兔兔,但是无关痛痒..
小兔兔用砂锅大的拳头打向你,但是无关痛痒...
上面就代表 me 与 tar 在呼叫 continue_attack 的过程中是顺利的。
然后我 demo 两种攻击对象消失时的情况
> call rabbit;set;"hp";0 <= 1.将 rabbit 的血量变成 0
OBJ(小兔兔 /d/area/newbie/mob/rabbit1#14)-> set( "hp", 0 ) = 1
> You have died. <= 这一句是错的应显示为 rabbit has died.
以后会修正并中文化.
○○○ 这场战斗结束了! ○○○
第二种
> k rabbit
你对着小兔兔喝道: “小王八蛋! 今日不是你死就是我活! ”
☆☆☆ 战 斗 开 始 ☆☆☆
你用砂锅大的拳头打向小兔兔,但是无关痛痒...
小兔兔用砂锅大的拳头打向你,但是无关痛痒...
> update here <= 2.将房间更新
/d/area/newbie/room/012: Updated and loaded.
>
○○○ 这场战斗结束了! ○○○
continue_attack 会判断何时开始进入战斗,以及何时战斗消失。
今次最主要的修改就是将原本只需 me->kill_ob(tar) 的单方面呼
叫,修改为若 me 与 tar 要进入战斗,一定要
me->kill_ob(tar);
tar->kill_ob(me);
它的好处就是有时候我们视情况会需要“打不还手的 mob”,这时
只需要 call me;kill_ob;目标 即可。(想要它还手就下 kill)
我规划 tmi2_v3_改 在战斗上至少有四种类技能:
1.基础技能(有些游戏称为被动技能)
2.enable 类技能
3.cast/spell 类技能=法术技能
4.force 类技能=特攻技能
未来它们都会有相对映的指令、物件以及函数,而且会参考 sanc
的发展经验,为相关的存取及运算做一下最佳化的配置,而且这些
技能也都会有 sample 档供设定参考。
技能会使用 "skill" 这个字段,并有 query/add/set/del_skills
等字段相关存取函数,但是特殊情况下会直接读字段值。
(所以才说函数化不是万能的)
技能熟练度则会使用 "skill_exp" 字段名称,技能熟练度的相关
存取函数则会使用 query/set/add/del_skill_exps 等名称。
下一次的改版会优先以虚拟物品系统的实装为主,并且应该会重写
monster.c 的 die 函数,让怪物可掉落虚拟物品。
laechan

Links booklink

Contact Us: admin [ a t ] ucptt.com