pao.c

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

C
304
字号
//Cracked by Kafei//
// sdong, 3/18/2000

#include <ansi.h>
#include <armor.h>
#include <room.h>
//inherit F_SSERVER;
inherit ITEM;
#define ORIGINAL "/d/bwdh/sjsz/room_28.c"
int explode(object me, object ob);
int do_fire(string arg);
int do_aim(string arg);
string look_room(object me, object env);
int do_load(string arg);

mapping default_dirs = ([
	"north":	"北",
	"south":	"南",
	"east":		"东",
	"west":		"西",
	"northup":	"北边",
	"southup":	"南边",
	"eastup":	"东边",
	"westup":	"西边",
	"northdown":	"北边",
	"southdown":	"南边",
	"eastdown":	"东边",
	"westdown":	"西边",
	"northeast":	"东北",
	"northwest":	"西北",
	"southeast":	"东南",
	"southwest":	"西南",
	"up":		"上",
	"down":		"下",
	"out":		"外",
	"enter":	"里",
	"in":		"里",
	"left":		"左",
	"right":	"右",
]);

string day_event(){return NATURE_D->outdoor_room_event();}

void create()
{
        set_name(HIY"青铜炮"NOR, ({"pao","qingtong pao","bombgun"}));
        set_weight(1500000);
        set("value",150000);
        if( clonep() )
                set_default_object(__FILE__);
        else {
                set("long", 
"一座青铜铸造的大炮,巨大的炮管昂然挺空,端的是威风八面。
久闻试剑山庄主人收集天下奇门兵器,没想到连大炮都有,只是
不知好用不好用。\n\n");

                set("unit", "座");
                set("material", "bronze");
        }
        setup();
}

void init()
{
	add_action( "do_load", "load" );
	add_action( "do_aim", "aim" );
	add_action( "do_fire", "shoot" );
}

int do_load(string arg)
{
	object ob = this_object(), huoyao, dantou;
	object me = this_player();
	int exp_time;

	if ( !arg || (arg!="powder" && arg!="huo yao" && arg!="dan tou" ) )
	   return notify_fail( "你想要加载什么?\n");

	if( me->is_busy() ) return notify_fail("你还在忙着呢!\n") ;
	
	if( arg=="powder" || arg =="huo yao" )
	{
		huoyao = present("huo yao");
		if( !huoyao || !objectp(huoyao) )return notify_fail( "你想要加载什么?\n");

		if( query_temp("yao_loaded") > 2 )return notify_fail("大炮已经装满火药了。\n");
		
		if( huoyao && objectp(huoyao) && huoyao->query("load") > 0 )
		{
			message_vision("$N往炮筒里加入一些火药。\n",me);
			huoyao->set("load",huoyao->query("load")-1 );
			if( huoyao->query("load") <=0 ) destruct(huoyao);
			add_temp("yao_loaded",1);
			me->start_busy(1);
		}
	}
	else if( arg =="dan tou" )
	{
		dantou = present("dan tou");
		if( !dantou || !objectp(dantou) )return notify_fail( "你想要加载什么?\n");

		if( query_temp("dan_loaded") > 0 )return notify_fail("大炮已经装有弹头了。\n");
		
		message_vision("$N往炮筒里加入一枚弹头。\n",me);
		destruct(dantou);
		add_temp("dan_loaded",1);
		me->start_busy(1);
	}

	return 1;
}



string look_room(object me, object env)
{
		  int i;
		  object *inv;
		  mapping exits;
		  string str, *dirs;

		  if( !env ) {
					 return "你的四周灰蒙蒙地一片,什么也没有。\n";
		  }
		  str = sprintf( "%s - %s\n    %s%s",
					 env->query("short"),
					 wizardp(me)? file_name(env): "",
					 env->query("long"),
					 env->query("outdoors")? NATURE_D->outdoor_room_description() : "" );

		  if( mapp(exits = env->query("exits")) ) {
					 dirs = keys(exits);
					 for(i=0; i<sizeof(dirs); i++)
                        if( (int)env->query_door(dirs[i], "status") & DOOR_CLOSED )
										  dirs[i] = 0;
					 dirs -= ({ 0 });
					 if( sizeof(dirs)==0 )
								str += "    这里没有任何明显的出路。\n";
					 else if( sizeof(dirs)==1 )
								str += "    这里唯一的出口是 " + BOLD + dirs[0] + NOR + "。\n";
                else
                        str += sprintf("    这里明显的出口是 " + BOLD + "%s" + NOR + " 和 " + BOLD + "%s" + NOR + "。\n",
                                implode(dirs[0..sizeof(dirs)-2], "、"), dirs[sizeof(dirs)-1]);
		  }
//      str += env->door_description();

        inv = all_inventory(env);
        for(i=0; i<sizeof(inv); i++) {
					 if( inv[i]==me ) continue;
					 if( !me->visible(inv[i]) ) continue;
					 if( objectp(inv[i]->query("rider")) ) continue;
					 else inv[i]->delete("rider");
					 if( objectp(inv[i]->query("rided")) ) {
								str += "  " + inv[i]->short() + "骑在" +
								(inv[i]->query("rided"))->name() + "上";
					 if( stringp(inv[i]->query_temp("exit_blocked")))
								str += "挡着往"+inv[i]->query_temp("exit_blocked")+
								"去的路";
								str += "\n";
					 }
					 else {
								if (stringp(inv[i]->query_temp("exit_blocked")))
								str += "  " + inv[i]->short() + "挡着往" + inv[i]->query_temp("exit_blocked")
										  +"去的路\n";
								else
								str += "  " + inv[i]->short() + "\n";
								inv[i]->delete("rided");
					 }
		  }

		  return(str);
}


int do_aim(string arg)
{
	object me = this_player();
	object cur_target, target;
	string str, dest;
	mapping exit;

	if( me->is_busy() ) return notify_fail("你还在忙着呢!\n") ;

	cur_target = query_temp("target");

	if( !cur_target ){
		cur_target = find_object(ORIGINAL);
		if( !cur_target )cur_target=load_object(ORIGINAL);
		if (!objectp(cur_target))return notify_fail("找不到目标。\n");
	}

	if( arg=="down" || arg=="up" || arg=="out" || arg=="enter" )return notify_fail("这个方向没法打到。\n");
	
	if( arg )
	{
		if( !mapp( exit = cur_target->query("exits") ) || undefinedp(exit[arg]) ) {
			return notify_fail("这个方向没有出路。\n");
		}

		if( !cur_target->valid_leave(me, arg) ) notify_fail("这个方向太远了。\n");

		dest = exit[arg];

		if( !(target = load_object(dest)) )
			return notify_fail("无法移动。\n");
	}
	else target = cur_target;

	set_temp("target",target);

	str = look_room(me, target);
	tell_object(me, str+"\n");
	if(arg)
		message_vision(HIW"$N将炮口缓缓向"+ default_dirs[arg] + "转,瞄准了"+target->query("short")+"。\n"NOR,me);

	me->start_busy(1);

	return 1;
}

int do_fire(string arg)
{
	object ob = this_object();
	object me = this_player();
	int exp_time;

    if( ob->query_temp("fired") ) return notify_fail("你一拉才发现此炮已被引燃了,就快发射了!\n");
	if( ob->query_temp( "dan_loaded" ) <=0 )return notify_fail("炮还没有上弹头呢!\n");
	if( ob->query_temp( "yao_loaded" ) < 3 )return notify_fail("炮还没装满\弹药呢!\n");

	message_vision("$N伸手用力一拉,拉开了$n导火索。\n", me,ob);
	ob->set_temp("fired", 1);
	ob->set_temp("owner",me);
	call_out("explode", 1 + random(5), me, ob);

	return 1;
}

int explode(object me, object ob)
{
	object *victims, env, owner;
	int i,damage;
	string str;

		ob->delete_temp("fired");
		ob->delete_temp("owner");
		ob->delete_temp("dan_loaded");
		ob->delete_temp("yao_loaded");

	env = query_temp("target");
	if( !env ){
		env = find_object(ORIGINAL);
		if( !env )env=load_object(ORIGINAL);
		if (!objectp(env))return notify_fail("找不到目标。\n");
	}

	message_vision(HIY"只听的一声惊天动地的爆响,$N"+HIY"发射了,弹头带着一道火线飞向"+env->query("short")+HIY",四周一片硝烟祢漫。\n"NOR, ob);

	owner = query_temp("owner");

	if( !owner || !objectp(owner) )
	{
		if(me && objectp(me) )
			owner=me;
		else owner=ob;
	}

	tell_room(env,HIR"只听的一声惊天动地的爆响,一发炮弹落地,四周一切立刻被炸得灰飞烟灭!\n"NOR, me);

	if( env->query("no_fight") ){
		return 0;
	}
	
	victims = all_inventory(env);

	for (i=0; i<sizeof(victims); i++) {
	   	if (!living(victims[i]) || victims[i]==me ) continue;
		damage= 4000+random(8000);
        victims[i]->receive_damage("qi", damage,  owner);
        victims[i]->receive_wound("qi", random(damage), owner);
        str = COMBAT_D->status_msg((int)victims[i]->query("qi") * 100 /(int)victims[i]->query("max_qi"));

		message_vision(HIR"$N被炸得人仰马翻!\n"NOR,victims[i]);
		message_vision(HIR"你远远看到"+victims[i]->query("name")+"被炸得人仰马翻!\n"NOR,ob);
        message_vision("($N"+str+")\n", victims[i]);
		message_vision(HIR"你远远看到("+victims[i]->query("name")+str+")\n",ob);
	}

        if (!env->query("th_buzhen")) return 1;

        env->set("long", env->query("org_desc"));
        env->set("exits", env->query("org_exits"));
        env->set("cost", env->query("org_cost"));
        env->delete("org_desc");
        env->delete("org_cost");
        env->delete("org_exits");
        env->delete("th_buzhen");
        env->delete("th_pozhen");
        env->delete("th_zhen_owner");

	return 1;
}

⌨️ 快捷键说明

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