es2型的mud中/feature/是一个非常重要，同时也是一个非常基本的文件夹。说它重
要是因为保存在它里面的文件一般来说都是函数集，用于实现mudlib中的各种功能，
一个巫师如果对它没有一定的了解，是编不了程序的，退一步说，至少这个巫师编
不出最简捷有效的程序。说它是一个基本的文件夹则是因为：在整个mudlib中至少
有99%的文件用到了它里面定义的各种函数，如果没有它，那么mudlib就只剩下那少
得可怜的1%了！所以就我个人认为，做为一个巫师，想了解es2的mudlib，最好从此
入手。

1 action.c

varargs void start_busy(mixed new_busy, mixed new_interrupt)
设定busy时间
若new_interrupt是string则当作busy_msg

nomask mixed query_busy()
返回busy数

nomask string is_busy()
判断是否处于busy状态,是的话,有busy_msy就返回busy_msy

void continue_action()
busy更新
相关文件：inherit/char.c

varargs void interrupt_me(object who, string how)
停止busy

int start_call_out(function fun, int delay)
用于呼叫efun，不过有权限判断


2 alias.c

string process_input(string str)
输入处理，包括一些输入的限制，alias（别名）和历史命令（有10个）

int set_alias(string verb, string replace)
设定alias

mapping query_all_alias()
返回alias


3 apprentice.c

int is_apprentice_of(object ob)
判断ob是否是师父,是返回1,不是返回0

void assign_apprentice(string title, int privs)
设定派内头衔

void create_family(string family_name, int generation, string title)
用于创建一个门派

int recruit_apprentice(object ob)
写入门派关系

4 attack.c

object *query_enemy()
返回对手阵列

string *query_killer()
返回死敌阵列

varargs int is_fighting(object ob)
判断ob是否正在fight

varargs int is_killing(string id)
无id判断是否有死敌,否则判断id是否为死敌

void fight_ob(object ob)
使this_object()和ob开始fight

void kill_ob(object ob)
使this_object()和ob开始kill

void clean_up_enemy()
对手阵列更新

object select_opponent()
选择对手

object select_opponent_owner(object ob)
选择对手进攻，可指定对手

int remove_enemy(object ob)
停止this_object()和ob的fight

int remove_killer(object ob)
停止kill

void remove_all_enemy()
清空对手阵列

void remove_all_killer()
清空对手和死敌阵列

void reset_action()
更新动作描述

varargs int attack(object ob)
出招,由hheart_beat()进行呼叫


5 attribute.c
此文件主要用于天赋修正(就是产生后天天赋)


6 autoload.c

void clean_up_autoload()
相关文件clone/user/user.c

void save_autoload()
得到离线后不会消失的物件阵列

void restore_autoload()
恢复不会消失的物件

7 clean_up.c
此文件用于清除不用的object,以释放内存


8 command.c
此文件使mud中的object可以使用各种命令


9 condition.c

nomask int update_condition()
更新condition

nomask void apply_condition(string cnd, mixed info)
此函数用于给ob加上condition,小心覆盖

nomask mixed query_condition(string cnd)
返回condition的情况

nomask varargs void clear_condition( string cnd )
清condition


10 damage.c

varargs int receive_damage(string type, int damage, object who)
用于减少某一项数值

varargs int receive_wound(string type, int damage, object who)
受伤

int receive_heal(string type, int heal)
恢复

int receive_curing(string type, int heal)
治疗

void unconcious()
昏迷

void revive(int quiet)
苏醒过来

void die()
死亡

void reincarnate()
重生

int heal_up()
定时更新人物的一些数据


11 dbase.c

mixed set(string prop, mixed data)
用于设定数值

varargs mixed query(string prop, int raw)
用于获得数值

int delete(string prop)
用于删除数值

mixed add(string prop, mixed data)
用于数值的修正

int set_entire_dbase( mapping tmp )
可以整个的设定dbase

int delete_all_dbase()
删除所有数据

mapping query_entire_dbase()
用于获取整个dbase的数据

其它有temp的为临时数据,并且不于保存

int undefined( string prop )
用于判断prop是否没有定义，记住是没有定义返回1


12 13 14 vendor.c dealer.c pawn.c
这三个文件为一个系统,所以连在一起说
vendor.c支持list和buy命令,只卖不买
dealer.c继承了vendor.c,所以支持list,buy,value,sell四个指令,可卖可买
pawn.c又继承了dealer.c,再另加pawn,redeemp(赎玩家)和redeem赎东西
不过此文件来自jackyboy,由于jackyboy的redeem()太长了看不懂,只好自己
编了个短的,不知有没有漏洞


15 edit.c
玩家输入(如post)会用到


16 encoding.c
此文件用于玩家的内码设定(来自西游记)


17 equip.c

int wear()
穿各种防具,xkx的mud都有一个bug,可以穿兵器,只要多加个判断就能改过来

int wield()
装备兵器,此处我还解释了一下位操作

int unequip()
卸载


18 finance.c

int can_afford(int amount)
检查是否有足够的money

int pay_money(int amount, int can_cash)
玩家付钱,return 0为身上所有钱加起来都不够
return 2为身上的现金不够
return 1为可以支付
can_cash参数不为零时,为可使用银票和金票
可用ob->pay_money(2000, 1)的形式使ob支付money

void get_money(int amount)
付给玩家money
可用ob->get_money(2000)的形式使ob得到money


19 food.c 20 liquid.c
这二个文件解决了饮食问题,某些部分来自xo_mini


21 massage.c

void receive_message(string msgclass, string msg)
收信息

void write_prompt()
提示符

void receive_snoop(string msg)
监听,如没有必要,请尽量不要使用


22 more.c
此文件为对多页文本的处理,由于本人对ansi中关于显示的定义不太清楚,
所以此文件的一些格式目前尚无法解释


23 move.c

nomask int query_encumbrance()
返回负重

nomask int over_encumbranced()
检查是否超重

nomask int query_max_encumbrance()
返回最大负重

nomask void set_max_encumbrance(int e)
设定最大负重

nomask void add_encumbrance(int w)
增加负重

void over_encumbrance()
超重时的处理

nomask int query_weight()
返回重量

nomask void set_weight(int w)
设定重量

varargs int move(mixed dest, int silently)
移动object

void remove(mixed euid)
摧毁object


24 name.c

void set_name(string name, string *id)
设定名称

int id(string str)
判别str是否为this_object()的id

string *parse_command_id_list()
this_object()的所有id

varargs string name(int raw)
this_object()的名字

varargs string short(int raw)
生成短描述

varargs string long(int raw)
生成长描述


25 save.c

int save()
保存文件

int restore()
恢复变数


26 skill.c

void set_skill(string skill, int val)
设定技能

int delete_skill(string skill)
删除某一技能

varargs void map_skill(string skill, string mapped_to)
用一种技能装备另一种技能,这里的skill是基本技,而mapped_to则是特殊技

varargs void prepare_skill(string skill, string mapped_to)
此函数用于准备武功

string query_skill_mapped(string skill)
显示某项skill_map

string query_skill_prepared(string skill)
显示某项skill_prepare

varargs int query_skill(string skill, int raw)
显示技能等级,没有raw为某项技能的有效等级,有raw为实际等级

mapping query_skill_map()
返回skill_map

mapping query_skill_prepare()
返回skill_prepare

int skill_death_penalty()
死亡后的技能处理

varargs void improve_skill(string skill, int amount, int weak_mode)
技能的增进,weak_mode为1时,则技能不会升级


27 sserver.c
此文件用于对手的确定


28 team.c

int set_leader(object ob)
设定领头者

object query_leader()
返回头头

int follow_me(object ob, string dir)
使this_object()跟着ob走

int add_team_member(object ob)
增加组员

int is_team_leader()
team[0]是队伍的领导者

varargs int dismiss_team(object ob)
散队,只有领导者且没有ob参数时,才可以完全解散队伍

object *query_team()
返回队伍


28 treemap.c
此文件用于mapping的处理,且大部分地方使用了递归的方法


29 unique.c
此文件应该很有用,但现在公开源程序的mud却都没有很好地使用它

nomask int violate_unique()
用于检查某物品在mud运行中是否多于1个
返回0,说明没有多于一个(在玩家手中),返回1,说明此物品在mud中多于1个

object create_replica()
以另一个物件替代原物

如想灵活应用,最好能再看一下每一个源文件(一般都有详细注解)

以上文件是我在cctx基础上结合了一些xyj和xo_mini中的源码和思路,
修改而成,在此特向他们表示忠心的感谢.

