作者laechan (小太保)
看板mud
标题Re: [闲聊] tmi2_v3_改 使用回馈/提问
时间Mon Jun 16 00:25:38 2014
※ 引述《tenyfish (何时才有发言权?)》之铭言:
: 趁心血来潮,就把 Mud lib 抓下来摸一摸了,
: 约莫花了1个小时读new_wiz及directories等文件
: 然後在u/xxx/开了自己的workroom.c,写了几个房间这样。
: 以下是简单的心得,不一定有参考价值 :
: 1.因为之前有摸过DS MUDLIB所以我直觉得就改完设定
: 开runmud.bat,然後就出错了(因为driver.exe改位置了)
: 原来东西都放在bin里面了,而且都有中文注记,不错
: 2.档案资料架构相对DS mudlib简单,而且都有原文说明
: 这一点对於新人入门比较方面一点
: 3.DSmudlib会帮有权限的人直接开资料夹,而看起来TMI2要自己去开
: 不然home只会到一个clone的workroom,要是能自动开的话也不错。
: 有些还没摸出来,我就直接在这里提问了,
: 懒的回我可以自己再摸看看。
: 4. 回wiz.c有指令吗 除了goto之外
: 5. 要如何设定home会到的room?是叫workroom.c吗?
: 6. 这里有任何快速编辑当下房间的指令吗
: 例:在DSmudlib的 modify room long 这只是一个房间
: 只是一些当下的想法
是通常没那麽晚睡^^;
tmi-2 的话,通常以 "laechan" 这个使用者为例,如果有
/u/l/laechan/
workroom.c 的话,按 home 就是 move 到这
个物件,没有的话就是 move 到你看到的那个 clone 出来
的房间。
换言之你了解其运作原理的话 /cmds/wiz/_home.c 指令自
己写也可以,我在 tmi2_v3_改 写的一些指令就是这样子写
来的。
/d/area/wiz.c 则是用
recall 指令,而且是要 wiz 身份
,非 wiz 身份则会到 /d/area/newbie/room/007.c,这个
修改日志有提到可参考。
workroom.c 不是重点,/cmds/std/_recall.c 才是,一边
看这指令执行的结果,一边 more 这个指令的内容,两相对
照就比较能了解它是干嘛的,了解其原理的话就能自己写。
区域房间的部份,我有更快的方法,我在 mud 板有张贴过
这个方法以及实际的 demo 结果,我预计等改到差不多了才
会把区域产生系统放进去。
不论是 roommaker 或是 modify、setroom、....这些做法
对我来说都太没效率了,万一不幸的你找不到人一起架站,
你只能一个人架的时候,tmi2_v3_改 就是「即便你只有一
个人」,你也能架站、能维护、能持续发展及扩充。
区域产生器
https://webptt.com/cn.aspx?n=bbs/mud/M.1320510743.A.4BB.html
https://webptt.com/cn.aspx?n=bbs/mud/M.1320564310.A.5D9.html
https://webptt.com/cn.aspx?n=bbs/mud/M.1321636486.A.0FA.html
新 mud 的设定 - 区域篇
https://webptt.com/cn.aspx?n=bbs/mud/M.1348040578.A.C4A.html
有问题都能尽量提出,在你原本的那篇提出也可,我都会
集中在这篇说明。
==================================================
杀不了兔子是因为我就是那样子设定的,你可以参考前面
tmi2_v3_改 释出的相关文章。
http://webptt.com/cn.aspx?n=bbs/mud/M.1402366361.A.1FB.html
它的关键段落,放在 /adm/simul_efun/attack.c 里面的
normal_attack 函数,如果你有拿武器就有 damage 值那
或许就杀得死,你可以 clone /d/area/newbie/wp 目录
下的武器出来 wear,然後再打看看。
战斗系统也会有说明文件。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.165.194.160
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/mud/M.1402849541.A.F0C.html
※ 编辑: laechan (1.165.194.160), 06/16/2014 00:29:22
1F:推 tenyfish :我clone了一把白瓦的blade杀 伤害740 1.162.184.31 06/16 00:33
以武器为例,/cmds/std/_wear.c 会看到最终它做了一个
wear_xx() 的呼叫,这个函数是写在 /std/weapon.c 里头
,会写在这里是因为所有的武器都是 inherit 它。
(也就是 inherit WEAPON = inherit "/std/weapon.c" )
函数里面一定会有一行就是
玩家->add_damages(武器的damage);
而它要怎麽跟指令对照呢? 就是你 wear 前 data 一下自
己,wear 後再 data 一下自己,就能发现有两个数值有改
变: damage(伤害) 与 hit_chance(命中)
(或是 call me;query;"damage" )
我要强调的是,「这是我为 tmi2_v3_改 所做的雏形规划
」,将来要拿 tmi2_v3_改 架站的人,是可以有自己的规
划的,就像我也不是照 tmi2_v3 原本的规划,而是自己写
一样。
tmi2 的目录规划很简单,核心目录说穿了就底下几个
/adm/daemons
/adm/etc
/adm/simul_efun
/adm/obj
/std
/cmds
/data
如果你会用 grep 指令的话你几乎能找到你想要找的任何
资讯,如果你不会用也没关系,因为 win 也提供依关键
字搜寻到档案的功能,所以你确实可以将重点摆在「我今
天看到了一项有中文的执行结果,我就用它来当关键字去
找出它到底是被写在哪里」,这是确实可以的。
比方我要找「巨大的伤害」是写在哪..
http://imgur.com/JpPBIek.jpg
※ 编辑: laechan (1.165.194.160), 06/16/2014 00:59:03
2F:推 tenyfish :然後我竟然忘了recall的存在 哈哈 1.162.184.31 06/16 00:50
3F:推 tenyfish :有照你的文件 用data确认伤害 114.37.55.240 06/16 01:04
4F:推 tenyfish :我先睡了谢谢l大几个指令摸了一下 114.37.55.240 06/16 01:09
5F:→ laechan :今天继续新增新的系统 210.61.157.53 06/16 09:14
6F:→ laechan :新增数字图防机程式 210.61.157.53 06/16 09:57
在 win 下,比方你进入某一个目录,按右键→排列图示依→修改日期,
就可以知道这个目录有被我动到什麽,以及更动的顺序是什麽,比方如
下:
http://imgur.com/9uBO1zJ.jpg
像这样一排就知道我更动了啥,像最新的更动就是 _xxx2.c 那三个指
令,再之前就是 _note.c、_wear.c 这几个指令。
※ 编辑: laechan (210.61.157.53), 06/16/2014 12:14:16
7F:→ laechan :今天进度不错,这礼拜至少可再释出1次 210.61.157.53 06/16 16:54
8F:→ laechan :明天会针对/doc/emote稍微做个整理 1.165.194.160 06/16 19:25
9F:→ laechan :并开始动货币 1.165.194.160 06/16 19:41
10F:推 tenyfish :确定有伤害还是杀不死兔子 111.243.135.25 06/16 23:20
那就检查 /adm/simul_efun/tell_room.c
> grep -n show *
[/adm/simul_efun/attack.c]
307: // 让 show 依照 result 是否 >0
309: show(me,tar,msg,result[0]);
312: // 内回的极限就在上面, 即内回 n 次,show 就会被呼叫 n 次
313: // show 的呼叫如果
[/adm/simul_efun/tell_room.c]
11:// show 最好是用 int 宣告
12:varargs int show(object me,object tar,string msg,int damage)
伤害是从 attack.c 的 normal_attack 函数呼叫 show 函数来执行的。
if(damage>0)
tar->receive_damage(damage);
然後再看 /std/body/attack.c 的 receive_damage 函数
> grep -n receive_damage *
[/std/body/attack.c]
15:// Added receive_damage() and receive_healing() systems, Watcher 3-27-93
117:int receive_damage(int damage) {
143:// positive healing calls. receive_damage() should be used for damage.
dam = query("hp") - damage;
if(dam < 0) dam = -1;
// 暂时 abort by laechan@sanc 2014/06/01
// set("hp", dam);
return 1; }
这就是为何打不死的原因。以上也是一种 trace 的 demo,你可以
参考,tmi2 有些东西是固定的,tmi2_v3_改 也不打算做太大的变
动,以上面来说呼叫 receive_damage 进行扣血就是 tmi2 的传统
,我是从 sanc 也是这样做的来推测。
sanc 的 int 大改过 tmi2 mudlib,结构较 tmi2_v3 更简单,我
有考虑也做这样的大改。比方你 update -R /std/monster.c:
> update -R /std/monster.c
/std/priv.c: Updated and loaded.
/std/object/ob_logic.c: Updated and loaded.
/std/object/sec_ob.c: Updated and loaded.
/std/body/more.c: Updated and loaded.
/std/body/wild_card.c: Updated and loaded.
/std/body/alias.c: Updated and loaded.
/std/body/track.c: Updated and loaded.
/std/body/attack.c: Updated and loaded.
/std/living/messages.c: Updated and loaded.
/std/coinvalue.c: Updated and loaded.
/std/living/env.c: Updated and loaded.
/std/object/contents.c: Updated and loaded.
/std/living/edit.c: Updated and loaded.
/std/living/skills.c: Updated and loaded.
/std/living/spells.c: Updated and loaded.
/std/body.c: Updated and loaded.
/std/living.c: Updated and loaded.
/std/monster: Updated and loaded.
但是在 sanc 则是
> update -R /std/monster.c
/std/ob/mob.c: 更新及载入了.
/std/mob/living.c: 更新及载入了.
/std/mob/attack.c: 更新及载入了.
/std/monster: 更新及载入了.
int 这样的改版不仅是我所欣赏的,也是我想在 tmi2_v3_改 实
作的。
※ 编辑: laechan (1.165.194.160), 06/17/2014 00:04:03
11F:→ laechan :今天应可完成新版的 help 210.61.157.53 06/17 12:05
12F:→ laechan :新的 help 指令完工 210.61.157.53 06/17 15:10
13F:→ laechan :drawmap,makearea,trans指令修改完毕 210.61.157.53 06/17 16:38
14F:→ laechan :明天会对战斗系统做更多的更动 210.61.157.53 06/17 17:21
15F:→ laechan :明天的目标就是完成区域生产架构 61.224.75.116 06/17 22:55