questd.c

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

C
360
字号
//Heart of fy3 -- Tie
mapping *quests;
mapping *read_table(string file);
string *roomlines;
varargs void init_dynamic_quest(int hard);
varargs int spread_quest(mapping one_quest, int hard);
object find_env(object ob);
varargs int already_spreaded(string str, int hard);
int quest_reward( object me, object who,object quest_item);
string dyn_quest_list();
#define MAX_DIS 7
#define MAX_ALT  2
#define MAX_DIR  8
#include <ansi.h>
string locate_obj(string str);
void create()
{
	string file;
	quests = read_table("/quest/dynamic_quest");
	file = read_file("/quest/dynamic_location");
	roomlines = explode(file,"\n");	
	//CRON_D->set_last_hard_dis();
	init_dynamic_quest(1);
}
int quest_reward(object me, object who,object quest_item)
{
	mapping quest;
	int exp,pot,score;
	int color;
	quest = quest_item->query("dynamic_quest");
	if(base_name(who) != quest["owner_name"]) return 0;
        exp =200+random(1000);
        pot = exp/7;
        score = random(10)+1;
        me->add("combat_exp",exp);
        me->add("potential",pot);
        me->add("score",score);
	color=random(5);
	if (color>3)
	{tell_object(me,HIR"你被奖励了:\n" +
        chinese_number(exp) + "点实战经验\n"+
        chinese_number(pot) + "点潜能\n" +
        chinese_number(score)+"点江湖阅历\n"NOR);}
	else if (color>2)
	{tell_object(me,HIB"你被奖励了:\n" +
        chinese_number(exp) + "点实战经验\n"+
        chinese_number(pot) + "点潜能\n" +
        chinese_number(score)+"点江湖阅历\n"NOR);}
	else if (color>1)
	{tell_object(me,HIM"你被奖励了:\n" +
        chinese_number(exp) + "点实战经验\n"+
        chinese_number(pot) + "点潜能\n" +
        chinese_number(score)+"点江湖阅历\n"NOR);}
	else if (color>0)
	{tell_object(me,HIY"你被奖励了:\n" +
        chinese_number(exp) + "点实战经验\n"+
        chinese_number(pot) + "点潜能\n" +
        chinese_number(score)+"点江湖阅历\n"NOR);}
	else 
	{tell_object(me,HIC"你被奖励了:\n" +
        chinese_number(exp) + "点实战经验\n"+
        chinese_number(pot) + "点潜能\n" +
        chinese_number(score)+"点江湖阅历\n"NOR);}
	me->add("TASK",1);
	if( !undefinedp(quest["fin_func"]))
	call_other(this_object(),quest["fin_func"],me,who,quest_item);
	if(quest_item)
	destruct(quest_item);destruct(present("xdshi",me));
	tell_object(me,HIW"你身上的"+HIR+"七"+HIC+"彩"+HIY+"向"+HIM+"导"+HIG+"石"HIW"跟着神书一起消失了。\n"NOR);
	return 1;
}

varargs void init_dynamic_quest(int hard)
{
	int i;
	for( i=0; i < sizeof(quests); i++)
		spread_quest(quests[i],hard);
}
varargs int spread_quest(mapping quest, int hard)
{
	object obj0,obj1,obj2,obj3;
	object cur_obj;
	object next_obj;
	object tar;
	object *inv;
	object *target=({});
	int i;
	string location;
	if(already_spreaded(quest["file_name"],hard)) return 0;
	reset_eval_cost();
	location = roomlines[random(sizeof(roomlines))];
	obj0=find_object(location);
	if(obj0)
	obj0->reset();
	else
	obj0=load_object(location);
	cur_obj =obj0;
	if(cur_obj)
	{
	inv = all_inventory(cur_obj);
	for(i=0; i<sizeof(inv); i++) {
	if(inv[i]->is_character() && !userp(inv[i]))
	target += ({ inv[i] });
	if(inv[i]->is_container()) target += ({ inv[i] });
		}
	}
	if(sizeof(target)) cur_obj = target[random(sizeof(target))];
	if(cur_obj)
	{
	tar = new(quest["file_name"]);
	tar->set("value",0);
	tar->set("dynamic_quest",quest);
	tar->move(cur_obj);		
	}
return 1;
}
string dyn_quest_list()
{
	string output="";
	object owner,item;
        int i;
        for( i=0; i < sizeof(quests); i++)
	{
	reset_eval_cost();
	if(!objectp(owner= find_object(quests[i]["owner_name"])))
	owner = load_object(quests[i]["owner_name"]);
        if(!objectp(item= find_object(quests[i]["file_name"])))
        item = load_object(quests[i]["file_name"]);
	if(already_spreaded(quests[i]["file_name"]))
	{
	if(random(2))
	output += sprintf("%s的%s(%s)\n",owner->query("name"),item->query("name"),item->query("id"));
	else
	output = sprintf("%s的%s(%s)\n",owner->query("name"),item->query("name"),item->query("id")) + output;
	}
	else
	{
	if(random(2))
	output += sprintf("%s的%s(%s)〔已完成〕\n",owner->query("name"),item->query("name"),item->query("id"));
	else
	output = sprintf("%s的%s(%s)〔已完成〕\n",owner->query("name"),item->query("name"),item->query("id")) + output;
	}
	}
	return output;
}
string locate_obj(string strr)
{
        string *distance = ({
"极近", "很近", "比较近", "不远",
"不近", "比较远", "很远", "极远"
        });
        string *altitude =({
"高处", "地方", "低处"
        });
        string *directions=({
"周围","北方", "南方", "东方","西方",
"东北方","西北方","东南方","西南方"
        });
        object ob, tmpobj,where, *ob_list;
        object item,room;
        string output,dis,alt,dir;
        int i;
        int x,y,z,x0,y0,z0;
        int realdis;
        int tmp;
	string str="";
	reset_eval_cost();
        for( i=0; i < sizeof(quests); i++)
	{
        if(!objectp(item= find_object(quests[i]["file_name"])))
        item = load_object(quests[i]["file_name"]);
	if(item->query("id") == strr || item->query("name") == strr) str = quests[i]["file_name"];
	}
	if(str != "") {
                //room = environment(me);
                ob_list = children(str);
                for(i=0; i<sizeof(ob_list); i++) {
                ob=find_env(ob_list[i]);
                if(ob)
                {
       if (ob->query("outdoors")=="baituo")  
	output="『"+ob_list[i]->query("name")+"』似乎在白驼山的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="binghuodao")  
	output="『"+ob_list[i]->query("name")+"』似乎在冰火岛的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="city")  
	output="『"+ob_list[i]->query("name")+"』似乎在扬州的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="yangzhou")  
	output="『"+ob_list[i]->query("name")+"』似乎在扬州郊外的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="city2")  
	output="『"+ob_list[i]->query("name")+"』似乎在京城的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="chengdu") 
	output="『"+ob_list[i]->query("name")+"』似乎在成都的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="changan")  
	output="『"+ob_list[i]->query("name")+"』似乎在长安城的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="dali")  
	output="『"+ob_list[i]->query("name")+"』似乎在大理的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="emei")  
	output="『"+ob_list[i]->query("name")+"』似乎在娥眉山的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="foshan")  
	output="『"+ob_list[i]->query("name")+"』似乎在佛山的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="gaibang")  
	output="『"+ob_list[i]->query("name")+"』似乎在丐帮的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="gaochang")  
	output="『"+ob_list[i]->query("name")+"』似乎在高昌的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="guanwai")  
	output="『"+ob_list[i]->query("name")+"』似乎在关外的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="guiyun")  
	output="『"+ob_list[i]->query("name")+"』似乎在归云庄的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="gumu")  
	output="『"+ob_list[i]->query("name")+"』似乎在古墓派的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="hangzhou")  
	output="『"+ob_list[i]->query("name")+"』似乎在杭州的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="heimuya")  
	output="『"+ob_list[i]->query("name")+"』似乎在黑木崖的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="hengshan")  
	output="『"+ob_list[i]->query("name")+"』似乎在恒山的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="henshan")  
	output="『"+ob_list[i]->query("name")+"』似乎在衡山的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="huanggon")  
	output="『"+ob_list[i]->query("name")+"』似乎在皇宫的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="huanghe")  
	output="『"+ob_list[i]->query("name")+"』似乎在黄河九曲的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="xx")  
	output="『"+ob_list[i]->query("name")+"』似乎在华山的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="jinshe")  
	output="『"+ob_list[i]->query("name")+"』似乎在金蛇山洞的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="lingjiu")  
	output="『"+ob_list[i]->query("name")+"』似乎在灵鹫宫的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="lingzhou")  
	output="『"+ob_list[i]->query("name")+"』似乎在灵洲的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="meizhuang")  
	output="『"+ob_list[i]->query("name")+"』似乎在梅庄的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="mingjiao")  
	output="『"+ob_list[i]->query("name")+"』似乎在明教的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="qingcheng")  
	output="『"+ob_list[i]->query("name")+"』似乎在青城山的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="quanzhen")  
	output="『"+ob_list[i]->query("name")+"』似乎在重阳宫的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="quanzhou")  
	output="『"+ob_list[i]->query("name")+"』似乎在泉洲的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="shaolin")  
	output="『"+ob_list[i]->query("name")+"』似乎在少林寺的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="shenlong")  
	output="『"+ob_list[i]->query("name")+"』似乎在神龙岛的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="songshan")  
	output="『"+ob_list[i]->query("name")+"』似乎在嵩山的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="suzhou")  
	output="『"+ob_list[i]->query("name")+"』似乎在苏州的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="taishan")  
	output="『"+ob_list[i]->query("name")+"』似乎在泰山的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="taohua")  
	output="『"+ob_list[i]->query("name")+"』似乎在桃花岛的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="tianlongsi")  
	output="『"+ob_list[i]->query("name")+"』似乎在天龙寺的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="wanjiegu")  
	output="『"+ob_list[i]->query("name")+"』似乎在万劫谷的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="wudang")  
	output="『"+ob_list[i]->query("name")+"』似乎在武当山的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="xiakedao")  
	output="『"+ob_list[i]->query("name")+"』似乎在侠客岛的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="xiangyang")  
	output="『"+ob_list[i]->query("name")+"』似乎在襄阳城的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="xiaoyao")  
	output="『"+ob_list[i]->query("name")+"』似乎在逍遥林的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="xingxiuhai")  
	output="『"+ob_list[i]->query("name")+"』似乎在星宿海的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="xueshan")  
	output="『"+ob_list[i]->query("name")+"』似乎在雪山寺的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="mr")  
	output="『"+ob_list[i]->query("name")+"』似乎在慕容世家的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="kunlun")  
	output="『"+ob_list[i]->query("name")+"』似乎在昆仑山的"+ob->query("short")+"\n";
else if (ob->query("outdoors")=="tiezhang")  
	output="『"+ob_list[i]->query("name")+"』似乎在铁掌门的"+ob->query("short")+"\n";
else 	output="『"+ob_list[i]->query("name")+"』似乎在某个地方的"+ob->query("short")+"\n";
	return output;
                }
                }
	}
                return "确定不了"+strr+"的大概位置.\n";

}
varargs int already_spreaded(string str,int hard)
{
        object ob,*ob_list;
        int i;
        if(!str) return 0;
	if(hard)
	{
        ob_list = children(str);
        for(i=0; i<sizeof(ob_list); i++) {
                ob=find_env(ob_list[i]);
                if(ob)
		{ ob_list[i]->move(VOID_OB);
		 destruct(ob_list[i]);
		}
	}
	return 0;
	}
	else
	{
	if(!str) return 0;
	ob_list = children(str);
	for(i=0; i<sizeof(ob_list); i++) {
                ob=find_env(ob_list[i]);
                if(ob)
			return 1;
	}
	return 0;
	}
}
object find_env(object ob)
{
        while(ob)
        {
        if(ob->query("exits") ) return ob;
        else ob=environment(ob);
        }
        return ob;
}
mapping *read_table(string file)
{
	string *line, *field, *format;
	mapping *data;
	int i, rn, fn;

	line = explode(read_file(file), "\n");
	data = ({});
	for(i=0; i<sizeof(line); i++) {
		if( line[i]=="" || line[i][0]=='#' ) continue;
		if( !pointerp(field) ) {
			field = explode( line[i], ":" );
			continue;
		}
		if( !pointerp(format) ) {
			format = explode( line[i], ":" );
			continue;
		}
		break;
	}

	for( rn = 0, fn = 0; i<sizeof(line); i++) {
		if( line[i]=="" || line[i][0]=='#' ) continue;
		if( !fn ) data += ({ allocate_mapping(sizeof(field)) });
		sscanf( line[i], format[fn], data[rn][field[fn]] );
		fn = (++fn) % sizeof(field);
		if( !fn ) ++rn;
	}
	return data;
}
void big_reward(object me, object who, object item)
{
	tell_object(me,"你真行!!\n");
}

void execute_accept_object(object me, object who, object item)
{
	who->accept_object(me,item);
}

⌨️ 快捷键说明

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