storyd.c

来自「C实现的MUD,对大家基本入门网络游戏很有帮助!」· C语言 代码 · 共 175 行

C
175
字号
// storyd.c#include <ansi.h>inherit F_DBASE;private string *story_name = ({//选择故事#if 1        "laojun",        "xiyou",        "guanzhang",        "nanji",        "liandan",	"caishen",	"zhengxi",	"zagang",	"songdai",	"niulang",#endif        "normal",});private object  running_story;private mapping history;private int step;int filter_listener(object ob);void ready_to_start(){        remove_call_out("process_story");        call_out("start_story", 1800 + random(300));//间隔时间//        call_out("start_story", 1 + random(1));//间隔时间}void go_on_process(object ob){        remove_call_out("start_story");        remove_call_out("process_story");        call_out("process_story", 1, ob);}void create(){        seteuid(ROOT_UID);        set("channel_id", "事件精灵");        CHANNEL_D->do_channel( this_object(), "sys", "事件系统已经启动。\n");        history = allocate_mapping(sizeof(story_name));        ready_to_start();}int clean_up(){        return 1;}object query_running_story(){        return running_story;}void start_story(){        string name;        object ob;        int i;        ready_to_start();        CHANNEL_D->do_channel( this_object(), "sys", "事件系统开始选择事件。\n");        for (i = 0; i < 12; i++)        {                name = story_name[random(sizeof(story_name))];                if (undefinedp(history[name]))                        history += ([ name : 0 ]);                if (time() - history[name] > 14400 || name == "normal")                {                        history[name] = (int)time();                        break;                }        }        if (i >= 12) return;        CHANNEL_D->do_channel( this_object(), "sys", "事件系统选择了事件(" + name + ")。\n");        name = STORY_DIR + name;        if (ob = find_object(name))                destruct(ob);        catch(ob = load_object(name));        running_story = ob;        if (! objectp(ob))                return;        step = 0;        go_on_process(ob);}void process_story(object ob){        mixed line;	object *listeners;        string prompt;        go_on_process(ob);        if (! objectp(ob))        {                ready_to_start();                return;        }        line = ob->query_story_message(step);        step++;        prompt = ob->prompt();        if (! prompt) prompt = HIY "【江湖逸事】 " NOR;        if (functionp(line)) catch(line = evaluate(line));        if (stringp(line))	{		listeners = filter_array(users(), (: filter_listener :));                message( "story",  prompt + WHT + line + "\n" NOR, listeners );	}        if (intp(line) && ! line)        {                ready_to_start();                destruct(ob);        }}int filter_listener(object ob){	if (ob->query("env/no_story")) return 0;	return 1;}void give_gift(string gift, int amount, string msg){        int i;        object ob;        object env;        object *players;        players = users();        if (sizeof(players) >= 5)        {                for (i = 0; i < 5; i++)                {                        ob = players[random(sizeof(players))];                        if (wizardp(ob)) continue;                                                        env = environment(ob);                        while (env && env->is_character())                                env = environment(env);                        if (env) break;                }                if (i >= 5) return;                if (objectp(env))                        tell_room(env, msg);                for (i = 0; i < amount; i++)                {                        ob = new(gift);                        ob->move(env);                }	        CHANNEL_D->do_channel( this_object(),			"sys", sprintf(NOR WHT "赠品%s" NOR WHT "掉到了"				HIC "%s" NOR WHT "(%O" NOR WHT ")。\n" NOR,                               ob->name(), env->query("short"), env));        }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?