Re: [wizs] 请教 .h 档

楼主: laechan (挥泪斩马云)   2014-05-22 13:43:30
※ 引述《caselook (幸福要懂得耕耘)》之铭言:
: 全域继承档是不是定义在 /include/globals.h 里面?
不是,是被写在 mudos 所使用的 config 档,如果你曾抓过
tmi2-mudlib+fluffos 包裹压缩档,可打开其 mudos 目录下
bin/config.tmi2 档查看
(如果解压缩在 D 槽就是 D:\tmi2_fluffos_v3\bin\config.tmi2)
最底下那几行就如下
maximum buffer size : 100000
debug log file : debug.log
global include file : <mudlib.h>
而 sanc 的 mudlib.h 里面又有一行 #include "ansi.h",
所以这两个 .h 档才会变成 sanc 今天的 global .h 档。
: : void create()
: : {
: : ::create();
: : seteuid(getuid(this_object())); // 到这里为止都是固定的
: : // seteuid: 设定一个物件的有效识别名称
: : // 有这一行, 房间才被允许做一些
: : // 加载或复制物件的动作
: : // getuid : 传回一个物件的有效识别名称
: : // this_object(): 这个物件本身
: 上面这一段应该就是标准写法了。似乎是与mudos设定物件的权限有关。
: 所以,是不是所有的 void create(){}都要加上这一行?
通常一个最单纯的房间(没有特殊用途等),是不需要 seteuid 的,
反过来说不单纯的房间你就想成最好都 seteuid 过比较没问题。
这跟 valid_xxx 相关函数有关,透过这个房间去做加载物件或是执
行一些特殊函数、动作时,它会要求房间要先有 uid。
所以 uid“有设”比“没设”保险,这是首先可了解的。
其次就是“它不一定要设,看情况”,这也接着要了解的。
(::create(); 那行则几乎都是要的)
: : set("light",1); // 房间维持光亮
: : set("short","工作室"); // 设定房间名称
: 我看 wizhelp 的 basic 说明档,提到 set()的标准写法是
: this_object->set() ,这个“->”符号的意思是?
那个不要看了有些东西是旧的。
-> 你可以理解为 物件 呼叫(->) 函数(参数)
mud 会有像是物件导向的东西,指的就是这一方面,任何已
被加载到内存的东西几乎都能称为是一个物件,而我们将
它加载到内存的目的就是希望这个物件能为我们提供什么
服务,它的最基础语法就是 物件->。
以上面来说 this_object()->set 就是要求“this_object()”
这个函数回传回来的“物件”,去呼叫 set() 这个函数。
那么为什么写房间却是用 set 而不用 this_object()->set
呢,因为 this_object() 就是“传回这个房间本身”,则
既然 this_object() 可呼叫 set(),那写在这个房间里面
的函数本来就可以呼叫本地的 set,也就是说以这个 case
this_object()->set("light",1);

set("light",1);
是同义的。而在执行速度上自然是后者较快,因为它属于本
地呼叫,而没有透过 this_object() 函数先取得一个物件
,再令它做 set 的动作。
: 在 create room 的set(),除了设定 exits,hide_exits,objects....之外,
: 还有那些资料可以参考 set()函数的功能?
你先知道基础的这几个就可,因为这些几乎是 LPmud 通用的设定。
然后理论上房间的 set 语法是
set("设定项目",设定内容);
只要设定项目符合“字串”就几乎都可以设,重点就在于你设了这
个字串,就需赋予它“意义”。例如说我们今天设定 "short" 这
个资料串,那为什么玩家下 look 时可看到我们设定的 short 呢
?这是因为我们在 look 这个动作里有加上相对应的程式段例如
if(room->query("short"))
write(room->query("short")+"\n");
则玩家下 look → 程式执行到上面的段落 → 让玩家看到 short
所以一开始了解最基本的房间大概包含哪些设定即可,这样就足
够写简单的区域了,然后一开始需做的就是试着写几个简单的物
件,而不要把它想得太复杂。
: : reset(); // 有 set("object") 就要有这一行 reset()
: : // 被设定的物件才会被 load 到房间
: : }
: : 你所参考的房间,有一些写法是错误的,那是非常早期版本的
: : mudos 可相容的写法,现在是不相容的,这只要 update 那个
: : 房间马上就会知道。
: update 还没用过。主要是因为觉得 edit 不习惯。
: 所以我 cp 了 workroom,c workroom.bak 之后,不知道怎么 edit workroom.c
: 有没有办法在 local 端用 npp 编辑好,再上传到 sanc?
sanc 目前不开放 ftp 上传,我比较建议先在自己电脑的文书编
辑软件将档案编好,再用 edit 把档案写入,这样有错误时,只
要改自己电脑下的档案,改好再重新 edit 进去就可。
因为你一开始编辑的东西并不会太复杂,所以我才建议这样的方
式。
edit 跟 vi 一样都分为命令模式(即最前面有 : 号)跟编辑模式
,命令模式可下的指令最常用的有底下几个
a : 往后添加 1 至数行
i : 从所在行开始添加 1 至数行
d : 删除所在行
w : 存盘
q : 离开
Q : 不存盘离开
数字 : 直接跳往某一行
在编辑模式要跳回命令模式,则是在行首输入 . 符号按 enter
即可。
: : 如果你真的要自己研究,那你应该先问的是一开始要知道哪些
: : 事情,包括有哪些指令(工具)可使用、可先参考哪几个区域、
: : 然后怎么设定自己的 workroom 去快速连结这些区域等。
: 这个很需要知道,我原以为直接在 caselook 的工作目录下先写区域,
: 包含 room 及各种 objcet后,再考虑连结其他的区域的说。
这也是可以的,但是我觉得对你来说,现在更应该做的不是急着写
区域,而是先“多看看别人怎么写”,然后看一看后你想写,就先
“试着写”而不是“就开始写”,把基础尽量打稳,看久了你就会
发现一个东西叫做“框架”,在你看过足够多的样本后,你就会知
道你想写的东西,它的框架其实跟现存的许多样本都大同小异,你
会在无形中自然理解:
1.要写一个东西,会需要用到哪些框架
2.每一个框架的各种组成要素有哪些是常用的
例如说要写房间,我们需要 void create() { } 这个框架;要在
房间里面设定让玩家可执行一些指令,需要 void init() { } 这
个框架;......
: : 有哪些 wiz 的指令可用
: : update - 更新(编译, compile)一个 .c 档并将其加载到内存
: : invis player - 让自己隐形, 在调查主动怪区域时可使自己不被攻击
: : more [目标] - 如 more lodao、more here、more ~/workroom.c、..
: : clone [目标] - 叫出一个物件,如 clone /d/wiz/mob/lodao
: : dest [目标] - 消灭一个物件,如 dest lodao、dest cloth、...
: : goto [目标] - 如 goto laechan、goto ~/workroom.c、..
: : home - 回自己的工作室,默认为 /u/c/caselook/workroom.c
: : 也可以 home 其它 wiz 的工作室如 home laechan
: : cp - 拷贝档案
: : rm - 删除档案, 目录
: : mv - 搬移档案, 目录
: : md - 建立目录
: : da [目标] - 观看一个被加载物件的设定资料。如 da me、da laechan、
: : da here、da ~/workroom、...
: sanc 好像没有 cat指令,打 cat 呼叫的是妙喵的哀嚎....
: sanc有没有类似于 cat 的指令呢?
: 我用的 pietty只有“复制全部”的功能,用 more 分段显示是很方便,
: 但比较不容易截录画面文字。
cat 有它的极限(跟字串长度有关),不过我可以写一个给你,顺便跟你说
一下最简单的 cat 指令写法
// /cmds/file/_cat.c
inherit DAEMON;
int cmd_cat(string str,object me)
{
string files;
if(!str || str=="")
return notify_fail("语法: cat [档案名称].\n");
if(ob=present(str,me))
files=base_name(ob)+".c";
else if(ob=present(str,environment(me)))
files=base_name(ob)+".c";
else if(str=="me")
files=base_name(me)+".c";
else
files=resolv_path(me->query("cwd"),str);
if(!file_exists(files))
return notify_fail("cat: "+files+" 档案不存在.\n");
str=read_file(files);
return notify_fail(str);
}
cat 指令已实装于 5003。
: : 可先参考哪几个区域
: : 基本上 /d/ppl/ 目录下的区域就是一开始可以参考的。
: /d/ppl/我会好好观摩,有问题再在板上请益^^
嗯嗯,可以多看,有问题亦可尽量问。

Links booklink

Contact Us: admin [ a t ] ucptt.com