嘛,明年应该会继续改。
最近思考的东西有两个层面:
1.生物属性值
2.板模
所谓生物属性值是说,例如我想架的 mud,我希望它有 hp/sp/pp
三种数值,那比较合理的想法就是,既然我同时也是 tmi2_v3_改
的修改者,我自然会在 tmi2_v3_改,加上这三个属性值,但是其
它拿到 tmi2_v3_改 的人,他可能只希望他的 mud,有 hp/sp 就
好,不要有 pp。
那麻烦了,因为对一个已写了 hp/sp/pp 的 mudlib 来说,拿这
一份去改为只有 hp/sp 的 mud,得改动不少地方。
(反过来也一样,但新增毕竟比减少简单一点)
是以这里就带出一个直觉的做法:
少用 query("xxx"),多用 query_xxx 的函数读取法。
事实上前者也不是不行(在 user.c 里面针对 query 做判断式),
但后者最大的好处,是给修改者较大的修改及扩充弹性。
而且使用函数名,在 win 下的最大好处就是可透过 win 的搜寻
功能,直接就能搜出到底哪些 .c 档有写到 query_xxx,将来要
做统一的修改时把这些档案搜出来,一次修改即可。
然后以上面为前提,则必然需要一个用来继承的 .c 档,统一宣
告这些 query_xxx 函数,来让 user.c、monster.c 等继承,或
是更干脆一点写成 simul_efun。
这个明年再决定。
再来,所谓的板模是说,例如 sanc 风格的 who 长这样:
> who
ζ TMI-2 Win32 ζ 现在时刻: 12/20 10:03(四)(已执行: 15分 49秒)
──────────────────────────────────────
线上的玩家:
──────────────────────────────────────
线上的巫师:
*Laechan
──────────────────────────────────────
共有 1/1 位玩家在 TMI-2 Win32. (断线状态: 0 位)
但是 casamia 的 who 是长这样
> who2
[冒险者] 13级 人类 0 Laechan
你看到 1 位玩家进入游戏.
板模的常见做法,是先将板模读进来:
if(!module_str || module_str=="")
module_str=read_file(THIS_CMD_MODULE);
然后是这里:
str=sprintf(module_str,
ppl->query_hp(),
ppl->query_sp(),
. <= 看板模里头有多少 %s, %d, ..
. 依序放进所需的参数
.
);
str=COLOR_D->get_color(str); <= 这样就可以使用 $HIW$ 等颜色字串
这样做的好处是,常用指令的各个板模,可放在同一个目录下,
方便修改及管理。缺点就是,例如说 sanc 的 who 是只读取玩
家的 cap_name 然后每 6 个 id 一列,像这种在板模内可能只
有一行:
$CYN$──────────────────────────────────$NOR$
线上的玩家:
%s
$CYN$──────────────────────────────────$NOR$
然后修改者得为这个 %s 写一个处理用的函数:
string who_string()
{
string tmp;
mixed usr=users();
object ppl;
foreach(ppl in usr)
.
.
return tmp;
}
当然 who 的例子可能复杂了些(因为是读取全部玩家的资料),
但这代表了如果今天要显示的是一个不定size的 mapping 或是
array 的资料时,就得自订函数来应付板模化的读取方式。
(这些问题在 guild 显示玩家已加入公会、或是 skill 显示玩
家已习得技能等指令上面会特别明显,都得靠自订函数)
那么,板模化有没有必要?
我认为板模化还是有其价值,因为初期把指令的显示结果写得
太阳春的话,对拿到这份 mudlib 的人来说,它要改的东西就
会很多,反之,如果有提供大部份指令的显示板模,那初期至
少修改者可以只改动板模跟指令里头 sprintf 的地方,就能
达到个人化显示风格的目的。
以上两个,会列入明年初的修改重点。