sjsz_room.h

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

H
374
字号
//Cracked by Kafei
// Modified by Apache for Group BWDH
// sdong, 8/8/1999
#define BOARD "/clone/board/bwboard"
int do_attack(string arg);
int do_stop(string arg);
int do_bwscore(string arg);
void nude(object obj);

void create_room() {
	 set("no_death", 1);
	 set("invalid_startroom", 1);
	 set("outdoors", "sjsz");
}

void init_room() {
	 add_action("do_attack", "attack");
	 add_action("do_stop", "stop");
	 add_action("do_finish", "finish");
	 add_action("do_kickout", "kickout");
	 add_action("do_disable", "quit");
	 add_action("do_disable", "lian");
	 add_action("do_disable", "practice");
	 add_action("do_disable", "xue");
	 add_action("do_disable", "learn");
}

int do_disable() {
	 tell_object(this_player(), "你不能在这里干这个。\n");
	 return 1;
}

void move_me(object me, string place)
{
	object obj;

	if( !me || !objectp(me) || !userp(me) )return;

	if( !living(me) ) me->revive(0);

	if ( (obj = find_object(place)) && obj && objectp(obj) ) {
		me->move(obj);
	}
	else if ( (obj = load_object(place)) && obj && objectp(obj) ) {
		me->move(obj);
	}
	else return;
}

void full_all(object me) {
	 me->set("eff_jing", (int)me->query("max_jing"));
	 me->set("jing", (int)me->query("max_jing"));
	 me->set("eff_qi", (int)me->query("max_qi"));
	 me->set("qi", (int)me->query("max_qi"));
	 me->set("jingli", (int)me->query("max_jingli"));
	 me->set("neili", (int)me->query("max_neili"));
	 me->set("food", (int)me->max_food_capacity());
	 me->set("water", (int)me->max_water_capacity());
	 me->remove_all_killer();
	 me->clear_condition();
}



void my_destruct(object obj)
{
		  int i;

		  object *inv;
		  string err;

		  if (obj && objectp(obj) ) {
								inv = all_inventory(obj);
								i = sizeof(inv);
								while(i--)
								{
										  if( inv[i] && objectp(inv[i]) && userp(inv[i]) )
										  {
											 call_out("move_me",1+random(4),inv[i],"/d/bwdh/sjsz/kantai_w1.c");
											 if( !living(inv[i]) ) inv[i]->revive(1);
											 full_all(inv[i]);
											 nude(inv[i]);
										  }
										  else
										  {
											if(inv[i] && objectp(inv[i]))
											{
												my_destruct(inv[i]);
											}
										  }
								}
					 if( userp(obj) )
					 {
						 call_out("move_me",1+random(4),obj,"/d/bwdh/sjsz/kantai_w1.c");
						 if( !living(obj) )obj->revive(1);
						 full_all(obj);
						 nude(obj);
					 }
					 else destruct(obj);
		  }
}

void nude(object obj)
{
		  int i;

		  object *inv;
		  if (obj && objectp(obj) ) {
								inv = all_inventory(obj);
								i = sizeof(inv);
								while(i--)
								{
										  if( inv[i] && objectp(inv[i]) && userp(inv[i]) )
										  {
											 call_out("move_me",1+random(4),inv[i],"/d/bwdh/sjsz/kantai_w1.c");
											 if( !living(inv[i]) ) inv[i]->revive(1);
											 full_all(inv[i]);
											 nude(inv[i]);
										  }
										  else
										  {
											if(inv[i] && objectp(inv[i]))
											{
												destruct(inv[i]);
											}
										  }
								}
		  }
}

// clean up all the flags on a player, set back conditions etc.
void finish(object target) {
	object ob, me, corpse;
	object board;
	mapping entryA, entryB;
	int i, scoreA,scoreB;

	 board =  find_object(BOARD);
	 if (!objectp(board)) {
		  board = load_object(BOARD);
		  if (!objectp(board))
				return ;
	 }
	 if( !target || !objectp(target) || !userp(target) )return;

	 entryA = board->query("team/" + board->query("east"));
	 entryB = board->query("team/" + board->query("west"));
	 if(!entryA || !entryB )
	 {
		 call_out("move_me",1+random(2),target,__DIR__"square");
		 if (!living(target)) target->revive(0);
		 full_all(target);
		 nude(target);
		 return;
	 }

	 scoreA = entryA["this_score"];
	 scoreB = entryB["this_score"];

	 me = this_player();

	if( objectp(ob = target->query_temp("last_damage_from") ) && userp(ob) &&
		ob->query("sjsz/team_name") != target->query("sjsz/team_name") )
	{
		ob->add("sjsz/exp",target->query("combat_exp")/10000);
		ob->add("sjsz/this_exp",target->query("combat_exp")/10000);
		ob->add("sjsz/bw_score",target->query("combat_exp")/10000);
		ob->add("sjsz/this_score",target->query("combat_exp")/10000);
		if( ob->query("sjsz/white") )scoreA += target->query("combat_exp")/10000;
		else if( ob->query("sjsz/red") )scoreB += target->query("combat_exp")/10000;
	}

	 if ( !target->query("sjsz/entrance") && !target->query("sjsz/fighting") ) {
		  call_out("move_me",1+random(2),target,__DIR__"square");
	 	  full_all(target);
		  nude(target);
		  return;
	 }

	 me->add("sjsz/this_exp",5);
	 me->add("sjsz/exp",5);
	 me->add("sjsz/bw_score",5);
	 me->add("sjsz/this_score",5);

	 if( me->query("sjsz/white") ) scoreA += 5;
	 else if( me->query("sjsz/red") ) scoreB += 5;

	 entryA["this_score"]=scoreA;
	 entryB["this_score"]=scoreB;

	 board->set("team/" + board->query("east"), entryA);
	 board->set("team/" + board->query("west"), entryB);
	 board->save();

	 if( objectp(corpse = CHAR_D->make_corpse(target, ob)) )
	 {
		 corpse->move(environment(me) );
	 }

	 target->set_temp("finished",1);
	 target->remove_all_killer();

	 full_all(target);
     nude(target);

	 if ( target->query("sjsz/white") )
		  move_me(target,__DIR__"east_xiangfang");
	 else if ( target->query("sjsz/red") )
		  move_me(target,__DIR__"west_xiangfang");


	 return;
}

int do_kickout(string arg) {
	 object player = this_player();
	 object room = this_object();
	 object target;

	 if (!wizardp(player))  // only wiz can kickout someone
		  return 0;

	 if (!arg)
		  return notify_fail("你要把谁赶走?\n");

	 target = present(arg, room);
	 if (!target)
		  return notify_fail("这里没有这个人.\n");

	 if (!userp(target))
		  return notify_fail("你只能赶走玩家。\n");

	 message_vision("$N被试剑山庄主人踢出。\n", target);

	 finish(target);

	 return 1;
}


int do_finish(string arg) {
	 object player=this_player();
	 object room=this_object();
	 object target;

	 if (! arg || arg=="")
		  return notify_fail("你要结果谁?\n");

	 target = present(arg, room);
	 if ( !target || !objectp(target)  )
		  return notify_fail("这里没有这个人.\n");

	 if ( ! userp(target) )
		  return notify_fail("你想结果那个玩家?\n");

	 if ( arg == player->query("id") ) return notify_fail("你发疯啦?\n");

	 if( target->query_temp("finished") )return notify_fail("这里没有这个人.\n");

	 if ( target->query("qi")<0 || target->query("eff_qi")<0 ||
		  target->query("jing")<0 || target->query("eff_jing")<0 || 
		  target->query("jingli") < 0 ||
		  !living(target) 
		  ) {
		  message_vision("$N恶狠狠地一脚把$n踢出比武场。\n", player, target);
	 }
	 else {
		return notify_fail("人家还没死呢,先打一架吧.\n");
	 }
	 

	 finish(target);

	 return 1;
}

int do_attack(string arg)
{
	object here, *obj, me = this_player(),target;
	string victim;
	int i;

	if (!arg) return notify_fail("你要攻击谁?\n");

	victim = arg;
	if ( victim == me->query("id") ) return notify_fail("你发疯啦?\n");
	here = environment(me);

	target = present(victim, here);
	if (!target || !objectp(target) ) return notify_fail("这里并无此人!\n");

	if ( target->query("race") != "人类" || target->query("sjsz/team_name") == me->query("sjsz/team_name"))
	{
		return notify_fail("你发疯啦?\n");
	}

	obj = all_inventory(here);

	message_vision(HIR "$N对着$n"+HIR"喝道:"+RANK_D->query_rude(target)+HIR",今日不是你死就是我活!弟兄们,给我狠狠地教训$p!\n\n" NOR, me, target);
	me->kill_ob(target);

	if( me->query("sjsz/fighting") )
	{
		for(i=0;i<sizeof(obj);i++)
		{
			if( living(obj[i]) &&
				 obj[i]->query("sjsz/team_name") == me->query("sjsz/team_name") && obj[i] != me
				 && obj[i]->query("env/invisibility") < 1 )
			{
					//message_vision(HIY "只见$N应声冲着$n扑了过去!喝道:"+RANK_D->query_rude(target)+HIY"拿命来吧!\n" NOR, obj[i], target);
					obj[i]->kill_ob(target);
			}
		}
	}

	if( living(target) )
	{
		//message_vision( HIR "\n$N对着$n"+HIR"冷笑一声:想倚多为胜?看招!\n\n" NOR, target,me );
		target->kill_ob(me);
	}

	return 1;
}

int do_stop(string arg)
{
	object here, *obj, me = this_player(),target;
	string victim;
	int i;

	here = environment(me);
	obj = all_inventory(here);

	if(arg)
	{
	  victim = arg;

	  if ( victim == me->query("id") ) return notify_fail("你发疯啦?\n");

	  target = present(victim, here);
	  if( !objectp(target) ) return notify_fail("没有这个人。\n");

	 if ( target->query("race") != "人类" || target->query("sjsz/team_name") != me->query("sjsz/team_name"))
	 {
		return notify_fail("人家理也不理你。\n");
	 }
		message_vision(HIY "$N对着$n"+HIY"劝道:"+RANK_D->query_respect(target)+HIY"请住手,暂且饶人一命!\n" NOR, me, target);
		message_vision(HIY "$N看了看$n"+HIY",痛快地说道:好吧,不打了,暂且将狗腿子脑袋寄在其脖子上!\n" NOR, target, me);
		target->remove_all_killer();

	}
	else
	{
		message_vision(HIY "$N高声喊着:弟兄们请住手,看看人家有何话说!\n" NOR, me);

		for(i=0;i<sizeof(obj);i++)
		{
			if( objectp(obj[i]) && living(obj[i]) &&
				 obj[i]->query("sjsz/team_name") == me->query("sjsz/team_name") && obj[i] != me
				 && obj[i]->query("env/invisibility") < 1 )
			{
					message_vision(HIG "只见$N应声向后一跳,不打了。\n" NOR, obj[i]);
					obj[i]->remove_all_killer();
			}
		}
	}

	me->remove_all_killer();

	return 1;
}


⌨️ 快捷键说明

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