//关于/daemon里的文件的整理，用于代替原来的/public/doc中的东西
//截止期限1997-11-31
//by leonhart
//使用者权限:XO team


aliasd.c 定义了 mapping global_alias([]) 定义一些通用的alias
                process_global_alias(string arg) 用一些全局的alias 替换arg
                如果 arg[ 0 ] 为 ', 替换为 say;
                如果以空格区分的第一个字串在 global_alias 中存在, 替换为
                该 alias 对应的指令.
allowd.c 现在正式开放，已经没用了。
                string *ID_list;        不受 wizlock 限制的 user id 列表
                string *tester_list;    测试者列表, 有登录时间限制
                1. add_allow( string user_id );
                2. remove_allow( string user_id );
                   实际上用程序减去 allow_list 中的 id 不是太方便, 所以这个
                   函数现在没有用.
                3. allow_tester( string user_id );
                4. is_allowed( string user_id );
                   判断 user_id 是否允许在 wizlock 存在的情况下登录.
                   返回 1 表示允许登录, 0 表示不允许.
                   先检查 user_id 是否存在于 ID_list 中, 再检查是否存在于
                   tester_list 中, 而且 tester 有时间限制.
                5. print_allow_list();
                6. print_tester_list();

applyd.c 现在好象不提供这个功能了，略。

autod.c  .....faint

band.c   void load_sites()
        //reads in the list of the banned sites
        int is_banned(string site) //是个判断函数
        add(string site)   //比较简单的;
        remove(string site) //这个函数可以认为是没有:PP

channeld.c mapping channels([]) //频道的mapping;
           varargs int do_channel(object me, string verb, string arg, int emote)
            //send message to channel
            先判断此 ppl 的此通道是否被关闭, 然后检查权限, 重复次数.
       如果此 channel 没有打开, 先打开.
       如果 me 是 user 或者 me 有 channel_id 属性, 记下 me 的 id 和 name.
       匿名频道的使用者在系统频道中说明.
`           int filter_listener( object ppl, mapping ch )
            //对接受者的过滤 wiz_only和family
            void register_relay_channel(string channel)
       如果此 channel 注册了 extra_listener, 还将对他们执行 relay_channel.
       但此功能暂时没有用上.
       还提供 MUD 间交谈功能, 暂时也没有使用.
        int repeat_count 是用来记录 ppl 重复次数的计数器

chard.c  void setup_char(object ob)//先判断是否有race，如否则设为人类
         然后按人类，妖魔，野兽三个种族来调用HUMAN_RACE->setup_human(ob)...
         然后定义精气神，及其有效值(如果原来没有定义的话)
         varargs object make_corpse(object victim, object killer)
            此函数由die()来调用，就是造尸体而已,victim是受害者，
            killer可没有。
trill: make_corpse 是唯一的用途。
chinesed.c 用途:提供中英文转换
    内部数据:
    static string *c_digit;
    static string *c_num;
    static string *sym_tien;
    static string *sym_dee;
    mapping dict
           static mapping place_name ([])
           noticed！！！要及时添加这个mapping
           void create()
           将字典中的资料载入.
           void remove()
           将字典里的资料存入文件中.
           string chinese_number(int i)
           将英文数字换算成中文数字.
           string query_save_file() { return DICTIONARY; }
           传回字典存盘文件的文件名.
           // This is called by to_chinese() simul_efun
           void remove_translate( string key )
           将字典里某个字删除.
           void add_translate( string key, string chinz )
           将 key 及相对应的中文 chinz 加入字典里.
           void dump_translate()
           列出字典里所有的内容.
           string chinese_date(mixed local)
           换算中文时间.
           string chinese_season(int season)
           返回1,2,3,4

cmd_d.c    mapping search([]) 现为空
           void rehash(string dir)更新dir目录下的指令表
           string find_command(string verb, string *path)
           在传入的 *path 中查询 <verb> 是否存在. 如果存在则返回该指令
       的文件名(包含路径, 减去 '.c'), 如果不存在则传回 0.
       如果所传入的 *path 里含有未经 rehash() 处理过的子目录. 则该
       目录名会被传入 rehash() 以将指令加入系统指令表.

combatd.c FAINT...这个比较麻烦呢，还没有搞好，破鱼和破雀正在外面比划呢:PPP
           string *guard_msg 防守
           string *catch_hunt_msg 见到仇人
           string *winner_msg 获胜
           string *fangfan_msg 防守反击
           string *fanji_msg 反击
           string *shouzhao_msg 收招
           string *parry_fail_msg 招架失败
           string *dodge_fail_msg 躲闪失败
           string *second_parry_msg 第二次招架时
    以上的都可以增加一些描述类的文字，让战斗更丰富多姿
           string get_guard_msg();
           string get_fangfan_msg();
           string get_winner_msg();
           string get_fanji_msg();
           string get_shouzhao_msg();
           string get_parry_fail_msg();
           string get_dodge_fail_msg();
           string get_second_parry_msg();
           string damage_msg( int damage, string type );
           string eff_status_msg( int ratio );
           string status_msg( int ratio );
           varargs void report_status( object ob, int effective );
           int make_fanji_decide( object me, int type );
           int make_defense_decide( int ap, int pp, int dp );
           int make_attack_decide( object me );
           int get_fight_type( object me );
           int can_hit_enemy( int ap, int dp );
           int attack_reward( object me, int ap, int dp );
           int parry_reward( object me, int ap, int dp );
           int dodge_reward( object me, int ap, int dp );
           mapping make_damage( string msg,object me, object you, mapping action );
           string replace_limb( object enemy, mapping action, string result );
           varargs string replace_weapon( string, object, object, mapping, mapping );
           string jiaohuan_daci( string result );
           void defend_action( object, object, mapping, string, int );
           void duel_attack( object, object, mapping, mapping, string );
           int wugong_power(object ob, string skill, int usage)
           计算角色 ob 使用 skill 时的威力.
           usage 分三类, attack, parry, dodge.
           具体的计算公式待调，略。
           varargs int fight_control( object me, object you, int type )
           顾名思义, 这个函数调度安排双方采用的战斗动作.
           type 是 AT_NORMAL, AT_QUICK 中的一种.
           void fight(object me, object victim)
           这个函数由 F_ATTACK 里面的 attack() 函数调用.
           决定每个回合的进攻者是谁, 然后相应调用 fight_control 或进入
           guarding 状态.实际上，这里是比较主要的部分！
           因为这里决定的是状态，如果你一直是在防守，那显然赢的希望比较渺茫。
           void auto_fight(object me, object obj, string type)
           没有调用这个函数，why?当初是做什么用的呢？
           void start_berserk(object me, object obj)
           哈哈，这个的公式是酱紫的:开始发疯
           如果你的force > 0.5~1*bellicosity then 
            if bellicosity > score && !wizardp() me->kill_ob(obj)
            else fight_ob(obj)
           void start_hatred(object me, object obj)
           恩，这是遇见仇人时呼叫的函数，结果是kill_ob() :PP
           void start_vendetta(object me, object obj)
           同上？两者的区别是什么？
           void start_aggressive(object me, object obj)
           ？？这三个函数都有什么区别？？
           为什么内容完全一样却不用一个函数来简化代码呢？
           void announce(object ob, string event)
           对死亡，昏迷，苏醒信息的发布:PP
           这里可以加些东西,xixi:-)
            剩下还有些内部的函数，复杂计算的东西，又是private的
            用不到，就先不列了。
crime_d.c   string query_save_file()
           int set_crime(object me, string arg)
           mapping query_present_crime( string arg )
           int is_crime( object ob, string arg )
           int delete_crime( object ob, string arg )
           int check_continue_pk( object me )
            这是破trill写的东东说是等lin的禁军写完后再加
            对pk太多的处理，现在没有任何影响。
emoted.c   对emote的管理，以及与channeld共同提供频道emote支持
           mapping emote;用来存放所有的emote
           int remove()
           remove 好象在 simul_efun destruct 中调用
           int repeat_count;最多重复次数
           int do_emote(object me, string verb, string arg)
            verb是频道名
           int set_emote(string pattern, mapping def)
           int delete_emote(string pattern)
           mapping query_emote(string pattern)
           string *query_all_emote()
            列了一些可能会有人用的函数，比较简单，就不多说了。
estate.c   这是个造房子用的东东。
           int CreateRoom( string city, string own, string out_dir )
           string GetRoom( string city, string own )
           int AddItem( mixed obj, class Location location )
trill: 我写的玩的暂时没有什么用。
familyd.c  负责存放各门派之间的友好度。 
           int set_relation(string my_fam, mapping relation)
           int add_family_enemy( string my_fam, string name, int score )
           int remove_family_enemy( string my_fam, string name )
           int is_family_enemy( string my_fam, string name )
           int query_enemy_quantity( string my_fam, string name )
           int improve_relation( string my_fam, string your_fam, int relation )
           mapping query_relation(string my_fam)
           int family_relation( string my_fam, string your_fam )
           int deal_family_relation( object victim, object killer )
           void clear_all_family_relation( string id )
           破马给这个关系弄得好好复杂哦，不过函数的意思还是可以一目了然的

fingerd.c  string age_string(int time)
           将传入的数字转换为用日月表示的字符串.
           object *check_dup_ip(object the_user)   
           用的是efun query_ip_name(the_user);
           作用是查user的ip
           string finger_all()
           列出线上所有使用者的信息.
           XKX 里的 finger 值得我们学习.(破qyz语)
trill: 这个我写了一个 sort.c ，不知道为什么死活在 4000 不行，但是
在 上地 却没有问题。巫师在最后，按照升序排列。有空在调试一翻。
做法就是重载 users() 这个 efun, 把它排个序。
           string finger_user(string name)
           varargs string remote_finger_user(string name, int chinese_flag)
            作用同上，但返回值是到chinese_flag中
           object acquire_login_ob(string id)
                // Check if the player is linkdead

helpd.c    private int file_exists(string file)
           判断一个文件是否存在
           static private void LoadIndices()
           mixed GetHelp(string str);
           mixed GetHelpByIndex(string index, string topic);
           string GetTopic(string index, string topic);
           string* GetTopics(string index)
           varargs string *GetIndices(string topic);
           对help分类建立索引:cmds,wizcmds,rules,map....
           mixed GetHelp(string str)
           找出str的索引条数,如为1，return GetHelpByIndex(tmp[0], str);
           mixed GetHelpByIndex(string index, string topic)
           判断用户权限后返回help
inquiryd.c // This function handles the default inquiry between ppls and npcs to
           // make npc more talktive. This is the '<me> ask <ob> about <topic>'
           // case.
           int parse_inquiry(object me, object ob, string topic)
           对贵姓，此地，消息三个topic返回1
log_d.c    对玩家的log记录
           string query_log_file( string arg)
           这个比较简单，望fun生义。
           int do_log( object me, string str )
           记录log文件
           int do_record( object me, string str )
           这是玩家自己每年的备忘
logind.c   int wiz_lock_level = WIZ_LOCK_LEVEL;
           int startup_time;
           mapping multi_allow;
           // 允许 multi_login 的登记表
           mapping user_ip;
           // 目前的 IP 与 ID 的对应表
           mapping skill_revise;
           string *banned_name;
           string *banned_id;
           string *start_rooms
           private void replace_some_mark( object user );
           可以在这里改一些要替换掉的东西
           private int select_max_age( object user );
           给玩家选择最大年龄
           private void read_config_file();
           读取config
           private void read_multi_allow_file();
           读m_login的表
           private void read_revise_file();
           读修正file
           private void update_user_ip();
           private void get_id(string arg, object ob);
           private void get_name(string arg, object ob)
           private void get_passwd(string pass, object ob)
           private void new_password(string pass, object ob)
           private void confirm_relogin(string yn, object ob, object user)
           private void confirm_id(string yn, object ob);
           private void confirm_password(string pass, object ob)
           private void get_email(string email, object ob)
           这里要改一下,不能光判断有没有@号
           private void get_gender(string gender, object ob, object user)
           object make_body(object ob)
           给player设置uid,euid,id,name.
           private void check_double_login(object user);
           private void init_new_player(object user);
           登一个新人的时候，设置他的天赋
           private void revise_illegal_data(object user);
           对old skills 进行修正
           varargs void enter_world(object ob, object user, int silent);
           varargs void reconnect(object ob, object user, int silent);
           object find_body(string name);
           object make_body(object ob);
           int check_legal_id(string arg);
           对输入id是否符合条件,字母数等进行判断，返回0为不合法
           int check_legal_name(string arg);
           对输入名字是否为中文等进行判断
           int new_random();
           一个比较好的random fun
           string select_start_room();
           void log_login( object ob, object user, string format );
           void logon(object ob)
           对player是否id被ban,是否达到login的巫师级别进行判断
           当有人连接 MUD 的登录端口时, 系统会调用此函数处理他的登录过程.
           此函数显示 welcome 画面, 告诉连线者现在 MUD 中的玩家个数. 然后
           等待输入 id. 然后调用 get_id().
           ban site 功能可以在这个函数的最开始实现.
           如果有人连接, 但不输入 id 就断开了, 这时候系统就有个 login
           object 浮在内存中, 有可能一段时间后能 clean_up 掉. 但破坏者可
           以不断地进行上述动作, 使得系统中出现很多无用的 login object,
           这就提供了把 MUD 搞 down 的一个漏洞.
trill: 这个好象不会的，除非哪个家伙及其恶意的攻击，才可能产生大量的 login object
浪费内存。一般的几十个也是能忍受的。
           void check_double_login(object user)
marryd.c   控制婚姻关系
           string query_save_file()
           int will_marry( object me, string your_id )
           void check_will_marry( object me )
           void marry( string my_id, string your_id )
           void check_marriage( object me )
           int is_consort( object me, string your_id )
           void divorce( mixed me )
           这个文件里的函数都是一看就可以用的，应该不会有什么误解
natured.c  varargs mixed game_season(int flag)
           varargs mixed game_time(int flag)
           把flag转化为game中时间
           string outdoor_room_description()
           void update_day_phase()
           mapping *query_day_phase()
           void init_day_phase()
           游戏中时间格式
           mapping *read_table(string file)
poisond.c  void get_effect(object me,object who,int touch_type,int eff_type);
           void add_effect(object me,object who,int get_type,int eff_type);  
           void copy_virus(object me,object who,mapping eff,string type);
           void complete_effect(object me,object who,int eff_type);   
rankd.c    string query_rank(object ob)
           string query_zhiye(object ob)
           string query_respect(object ob)
           string query_rude(object ob)
           string query_self(object ob)
           string query_self_rude(object ob)
           string query_normal(object ob)
           string query_self_respect(object ob)
           string query_me_target(object ob)
           string query_target_me(object ob)
reward_d.c void fight_reward(object winner, object victim)
           当 fight 结束时此函数被调用, 在这个函数里分别对 winner 调用
           defeated_enemy( victim ), 对 victim 调用 be_defeated( winner ).
           void killer_reward( object victim )
           当 victim 被杀死的时候, 此函数被调用. 处理 victim 和 killer 各
           项相关属性的增减; 处理 killer 犯罪的记录; 处理 quest 的问题;
           做的关键调用有: victim->deal_family_relation( killer )
                           killer->killed_enemy( victim )
                           victim->be_killed( killer )
           void bihua_reward( object winner, object loser )
           当 bihua 结束时被调用, 此函数做两件事: 分别是
           对 winner, 调用 win_bihua( loser );
           对 loser, 调用 lose_bihua( winner ).
skilld.c   string * path在这里定义了所有的skills应该放在哪个目录下
           void rehash(string dir)
           刷新dir
           string find_skill(string skill)
sort.c     int ComparePlayer(object Player1, object Player2)
           int CompareFamily( string family1, string family2 )
           int CompareZuzhi( mixed one, mixed two )
           int CompareWizardLevel( int level1, int level2 )
           int CompareAge(int age1, int age2 )
           就是简单的比较和返回,在ComparePlayer里对后四项做了比较

taskd.c    void eventRehashTask()
           void eventDestructTask( object ob )
           void TaskRestore( object ppl, string GroupName, string TaskName )
           varargs void TaskBegin( object ppl, string GroupName, string TaskName ) 
           private object * get_group_task( string GroupName, int Level )
           object load_task(string GroupName, int level, string name)
           private string get_task_index( object ob )
virtuald.c object compile_object(string file)  //just return 0:PP
trill: 这个函数在 master.c 被调用，主要是用来生成一些 虚 的object
比如，使用一个文件生成一批 room, 或者是 根据一个 script 来生成一个 room, npc
这个可以实现一些特殊的效果。
updated.c  void check_user(object ob)
uniqued.c  string query_save_file();
           void set_unique(object unique_ob,object user);
           string query_unique(object unique_ob);
           int had_cloned(object unique_ob);
           int cloned_by_new(object unique_ob);
           void delete_unique(string unique_ob);
           void change_user_for_unique(object unique_ob,object user);
           void check_unique_for_delete(object user);             
           void check_unique_(object user);
           void check_unique_temp(object user);
weapond.c  mapping weapon_actions
           把伤害类型和action包括在这个map中
           varargs mapping query_action()
           void throw_weapon(object me, object victim, object weapon, int damage)
           void bash_weapon(object me, object victim, object weapon, int damage)
zuzhid.c  //  说明：
           //    每个组织有一个自己的文件"zuzhi".c，放在/system/feature/zuzhi/下面，
           //  用来记载每个组织的一些数据库和单独的函数。每个人应该允许参加多个组织
           //  正因为如此，一般上不应该让别人看到这个人的组织归属情况。
           //  现在最大的问题就是：组织应该是可以重叠参与的，所以，怎么决定表现出来的是哪个
           //  组织的数据呢？
           //      首先，可以是最后进入的组织。
           //  现在还是决定不让其它人看到组织属性，如果另一个人是你所在的组织中的上级，那么
           //  他可以看到你是这个组织的什么人。（这个交给look.c去完成）
           //  由于有TRILL 原来用的"zuzhi"数据存在，现在的组织数据改用"group"这个mapping.
           mixed SetupZuzhi( object who, string zuzhiname, string touxian, string zhiwu, mixed group );
           //  初始化
           mixed DeleteZuzhi( object who, string zuzhiname, mixed group );
           //  离开组织的数据删除工作
           //  同时应该另置标以记录曾经参加过的组织情况。
           int SetZuzhi( string title, object who, string zuzhiname, mixed what );
           int Save( object saveobj );
           mixed GetDbase( object saveobj );
           string *GetSameZuzhi( object ob1, object ob2 );
           mapping ToId
           把一些组织的name与id对应
           对每个zuzhi map:有touxian,entertime,zhiwu,score,lastcontacttime
beast.c    void setup_beast(object ob)
human.c    int new_random();
           void setup_human(object ob)
monster.c  void setup_monster(object ob)
capitald.c //这是臭带鱼做的，对capital特殊化:PP
           // 汴京daemon:     capitald.c
           用途：在城市中接受由ROOM或NPC提出的调用请求，根据这些 
           请求来决定各种不同的反应。 
           设想：一个城市作为一个整体应该有些指数，比如安定系数， 
           人口指数，商业值，军队化程度等等。在游戏运行过程中， 
           daemon将对这些数值进行探查，并根据这些实时进行反应。 
           同时，将对由NPC 和ROOM提出的各种请求进行反应，比如围捕 
           玩家，商店开业，酒店关门，城门的开闭，某个区域的开与关， 
           NPC 的不同反应等等。 里面没什么可说的函数

/////////////////////////////////////////////////////////////////////////////////////////
以上是/system/daemon中的东东
对/secure下的东东
只是securityd.c里
           private mapping trusted_write是对a user可写的目录做出规定
           private mapping exclude_write是对a user不能写的目录做出规定
           private mapping trusted_read与上相似
           private mapping exclude_read
            具体一个user写文件时的过程是这样的：先对这个目录直至根目录
            查是否有允许写的记录，然后对这个目录直至根目录查是否有禁止
            他写的记录，如果两种都通过的话，他才可以写这个目录
           string get_status(mixed ob)
            判断user是否为wiz
           int get_wiz_level(object ob)
           int set_status(mixed ob, string status)
           string *get_wizlist() { return keys(wiz_status); }
           int valid_write(string file, mixed user, string func)
           int valid_read(string file, mixed user, string func)
           int valid_seteuid( object ob, string uid )
还有的ftpd.c和profile.c里的东东没必要去管的，因为xo的ftp都关掉了:)


trill: 关于 daemon 低下的东西，falcon 提出的 1.5 计划，整理一下这些东西。
我曾经想过，大概 daemon 底下的东西可以分成三类

1 网络部分: logind, band. ftpd. intermud 
这个我想把 logind 整个减小一点，把一些有效的检查独立出去, 写一个  register.c
包括band.c ftpd，其实问题不大，好象就是读写权限没有考虑清楚。
目标：一个小的，比较纯粹的login.c 一个 register.c 和 ftd.c
intermud 这个 nerd 比较有研究。 
这个我已经写了一点了，只是在上个月太忙，工作停了。大概两三天就可以彻底
搞定，只是一直没有兴趣。 :-(

2 数据管理和查询 emoted.c chinesed.c rankd.c familyd.c marryd.c skilld.c aliasd.c log_d.c
    fingerd.c uniqued.c zuzhid.c 
    这些 daemon, 一些可以合并，搞个 data_manager.c 就可以了，比如 familyd.c marryd.c log_d.c
    全部的 需要管理的 玩家数据 放在一个 daemon.c 里面管理。 这样可以减少接口，方便管理。
    查询的，有工夫就添加一些新的，最好改写一下。
    一些 weapon npc city menpai 的 比如 weapond.c natured.c 数据管理，也最好写个管理程序，或者建
    立一个子目录，统一放置这些 daemon. 

3 另类，combatd autod reword_d virtuald.c 这些 daemon 严格的做，其实可以是 simul_efun 或者 是 feature 
比如 autod.c do_command.c 如果写成 feature 更加合适一些。或者 
        cmd->main( me, arg )
也是可以的。
combatd.c 应该包含的一些是 character 的 feature，应该提取成一个 feature/combat.c
virtuald.c 这个东西，直接写在 master.c 或者 写成 simul_efun 也是合适的。

