⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 control.c

📁 C实现的MUD,对大家基本入门网络游戏很有帮助!
💻 C
📖 第 1 页 / 共 4 页
字号:
		  player = present(user[i], here);
		  if( !player && wizardp(me) )
			  player = find_player(user[i]);
		  if (!player || !objectp(player) || !userp(player))
				continue;

		  board->set("team/" + sprintf("%d",total)+"/ids/"+sprintf("%d",i+1), player->query("id"));
		  board->set("team/" + sprintf("%d",total)+"/names/"+sprintf("%d",i+1), player->query("name"));

		  player->delete("sjsz");
		  player->set("sjsz/team_name",title);
		  player->set_temp("apply/short", ({HIW""+player->query("sjsz/team_name")+"  "NOR+player->name()+"("+player->query("id")+")"}));
		  exp += player->query("combat_exp");
		  msg = msg + player->query("name") + " ";
	 }

	 if( exp < 1000000 )
	 {
		  board->delete("team/" + sprintf("%d",total));
		  for(i = 0; i < 20; i++)
		  {
			  if( user[i] == "" )break;
			  player = find_player(user[i]);
			  if (!player || !objectp(player) || !userp(player))
				continue;
			  player->delete("sjsz");
			  player->delete("apply/short");
		  }
		  return notify_fail("主持人怒道:尔等武功这么差,不配在试剑山庄舞剑。\n");
	 }

	 board->set("team/" + sprintf("%d",total)+"/exp", exp);

	 present(user[0],here)->set("sjsz/leader",title);
	 /*board->set("team/" + sprintf("%d",total)+"/leader", me->query("id"));*/
	 board->set("team/" + sprintf("%d",total)+"/leader", user[0] );

	 board->save();
	 message_vision("$N报名" + msg + "为第" + chinese_number(total) + "队:" + title + "\n", me);
	 return 1;
}


int do_fire(string arg) {
	 mapping entry;
	 int i, j,k,exp;
	 string title,id;
	 object me = this_player(), board, player;

	 if(!arg)
		  return notify_fail("Usage: fire player\n");

	 if( !me->query("sjsz/leader") && !wizardp(me) )
		  return notify_fail("只有队长才能下命令!\n");

	 player = find_player(arg);
	 if(!player)return notify_fail("找不到这个玩家\n");

	 if(player == me ) return notify_fail("你身为队长还开除自己?还是解散(dismiss)队伍算了。\n");

	 board =  find_object(BOARD);
	 if (!objectp(board)) {
		  board = load_object(BOARD);
		  if (!objectp(board))
				return notify_fail("找不到团体赛成绩版。\n");
	 }


	 for(i = 1; i <= sizeof(board->query("team")); i++) {
		  entry = board->query("team/" + sprintf("%d", i));
		  title = entry["title"];
		  if( title == me->query("sjsz/team_name") )
		  {
			for ( j = 0; j < sizeof(entry); j++) {
				id= board->query("team/" + sprintf("%d", i) + "/ids/" + sprintf("%d", j+1) );
				if( id != arg )continue;
				player = find_player(id);
				if( !player || !userp(player))
					  return notify_fail("找不到玩家 " + board->query("team/" + sprintf("%d", i) + "/names/" + sprintf("%d", j+1) ) + "\n");
				player->delete("sjsz");
				for ( k = j; k < sizeof(keys(entry))-1; k++) {
					board->set(("team/" + sprintf("%d", i) + "/names/" + sprintf("%d", k+1) ),
						board->query("team/" + sprintf("%d", i) + "/names/" + sprintf("%d", k+2) ) );
					board->set( ("team/" + sprintf("%d", i) + "/ids/" + sprintf("%d", k+1) ),
						board->query("team/" + sprintf("%d", i) + "/ids/" + sprintf("%d", k+2) ) );
				}
				board->delete("team/" + sprintf("%d", i) + "/ids/" + sprintf("%d", k+2) );

				exp = board->query("team/"+ sprintf("%d", i) + "/exp");
				exp -= player->query("combat_exp");
				exp = board->set("team/"+ sprintf("%d", i) + "/exp",exp);

				if(player!=me)
					message_vision("$N把$n开除出"+title+"!\n",me,player);
				else message_vision("$N把自己开除出"+title+"!\n",me);
				player->delete("sjsz");
				board->save();
				return 1;
			}
		 }
	 }

	 return notify_fail("这个玩家不在自己队伍\n");
}


int do_clean(string arg) {
	 mapping entry;
	 int i, j,k,exp;
	 string title,id;
	 object me = this_player(), board, player;

	 if(!arg)
		  return notify_fail("Usage: clean player to clean score\n");

	 if( do_fire(arg) == 1 ) return 1;

	 player = find_player(arg);
	 if(!player)return notify_fail("找不到这个玩家\n");

	 if( !me->query("sjsz/leader") && me != player  && !wizardp(me) )
		  return notify_fail("只有队长或自己才能下命令!\n");

	 board =  find_object(BOARD);
	 if (!objectp(board)) {
		  board = load_object(BOARD);
		  if (!objectp(board))
				return notify_fail("找不到团体赛成绩版。\n");
	 }


	 for(i = 1; i <= sizeof(board->query("team")); i++) {
		  entry = board->query("team/" + sprintf("%d", i));
		  title = entry["title"];

			for ( j = 0; j < sizeof(entry); j++) {
				id= board->query("team/" + sprintf("%d", i) + "/ids/" + sprintf("%d", j+1) );
				if( id != arg )continue;
				player = find_player(id);
				if( !player || !userp(player))
					  return notify_fail("找不到玩家 " + board->query("team/" + sprintf("%d", i) + "/names/" + sprintf("%d", j+1) ) + "\n");
				player->delete("sjsz");
				for ( k = j; k < sizeof(keys(entry))-1; k++) {
					board->set(("team/" + sprintf("%d", i) + "/names/" + sprintf("%d", k+1) ),
						board->query("team/" + sprintf("%d", i) + "/names/" + sprintf("%d", k+2) ) );
					board->set( ("team/" + sprintf("%d", i) + "/ids/" + sprintf("%d", k+1) ),
						board->query("team/" + sprintf("%d", i) + "/ids/" + sprintf("%d", k+2) ) );
				}
				board->delete("team/" + sprintf("%d", i) + "/ids/" + sprintf("%d", k+2) );

				exp = board->query("team/"+ sprintf("%d", i) + "/exp");
				exp -= player->query("combat_exp");
				board->set("team/"+ sprintf("%d", i) + "/exp",exp);

				if(player!=me)
					message_vision("$N把$n开除出"+title+"!\n",me,player);
				else message_vision("$N把自己开除出"+title+"!\n",me);
				board->save();
			}
	 }

	 player->delete("sjsz");

	 return notify_fail(arg+" 比武成绩被清除.\n");
}

int do_challenge(string arg) {
	 object me = this_player(), player, board,target;
	 mapping entry;
	 string id,s, my_title, target_title;
	 int n, total, i, j, my_exp, target_exp,gap_exp;

	 if( !arg || sscanf(arg, "%d", n) != 1)
		  return notify_fail("指令错误!(challenge n(to challenge team n)\n");

	 if( me->query("sjsz/challenging") ==n )return notify_fail("你已经向此队挑战了!\n");

	 if( !me->query("sjsz/leader") )
		  return notify_fail("只有队长才能下命令!\n");

	 board =  find_object(BOARD);
	 if (!objectp(board)) {
		  board = load_object(BOARD);
		  if (!objectp(board))
				return notify_fail("找不到团体赛成绩版。\n");
	 }

	 s = "team/" + sprintf("%d", n);
	 entry = board->query(s);
	 if ( (n < 1) || !entry )
		  return notify_fail("找不到这个队。\n");

	target_title = entry["title"];
	target_exp = entry["exp"];

	for ( i = 0; i < sizeof(board->query( s + "/ids")); i++) {
		id = board->query( s + "/ids/" + sprintf("%d", i+1) );
		if( !id ) return notify_fail("找不到玩家 " + id + "\n");
		player = find_player(id);
		if (!player || !objectp(player) || !userp(player))
			return notify_fail("找不到玩家 " + id + "\n");
	}

	my_title = me->query("sjsz/team_name");
	if( i+1 == n || target_title == my_title) return notify_fail("自己挑战自己?\n");


  for ( i = 0; i < sizeof(board->query( "team" ) ); i++) {
		if( board->query( "team/" + sprintf("%d", i+1) + "/title") == my_title )
		{
			if( i+1 == n || target_title == my_title) return notify_fail("自己挑战自己?\n");

			my_exp = board->query( "team/" + sprintf("%d", i+1)  + "/exp");
			if( my_exp > target_exp ) gap_exp = my_exp - target_exp;
			else gap_exp = target_exp - my_exp;
			if( gap_exp/10 / ((my_exp + target_exp)/1000) > 20 )
				return notify_fail("山庄主人摇头道:“两队武功差距太大,不妥不妥!n");

						for ( j = 0; j < sizeof(board->query( "team/" + sprintf("%d", i+1) + "/ids")); j++) {
								id = board->query( "team/" + sprintf("%d", i+1) + "/ids/" + sprintf("%d", j+1) );
								if( !id ) continue;
								player = find_player(id);
								if (!player || !objectp(player) || !userp(player))
								{
										  return notify_fail("找不到玩家 " + id + "\n");
								}
					  }
			break;
		}
  }

  target = find_player( board->query( "team/" + sprintf("%d", n) + "/leader" ) );
  if( objectp(target))
  {
	  message_vision("$N代表"+my_title+"队向$n的"+target_title+"队发出挑战:"+HIR"“素闻尔队本领高强,今日可敢与本座决一死战!”\n"NOR,me,target);
	  me->set("sjsz/challenging",n);
	  target->set("sjsz/challenger",i+1);
  }

  return 1;
}

void do_accept(string arg) {
	 object me = this_player(), player, board,target;
	 mapping entry;
	 string id,s, my_title, target_title;
	 int n, total, i, j;

	 if( !arg )
		  return notify_fail("指令错误!\naccept n(to accept team n challenging)\n");
	 n = to_int(arg);

	 if( !me->query("sjsz/leader") )
		  return notify_fail("只有队长才能下命令挑战!\n");

	 if( me->query("sjsz/challenger") !=n )return notify_fail("此队目前并没有向你挑战!\n");

	 board =  find_object(BOARD);
	 if (!objectp(board)) {
		  board = load_object(BOARD);
		  if (!objectp(board))
				return notify_fail("找不到团体赛成绩版。\n");
	 }

	 if( board->query("west") && board->query("east") )return notify_fail("山庄主人抱歉道:“现在有人已经占用比武场了。请稍后再来!”\n");

	 s = "team/" + sprintf("%d", n);

	 entry = board->query(s);
	 if ( (n < 1) || !entry )
		  return notify_fail("找不到这个队。\n");

	for ( i = 0; i < sizeof(board->query( s + "/ids")); i++) {
		id = board->query( s + "/ids/" + sprintf("%d", i+1) );
		if( !id ) return notify_fail("找不到玩家 " + id + "\n");
		player = find_player(id);
		if (!player || !objectp(player) || !userp(player))
			return notify_fail("找不到玩家 " + id + "\n");
	}

	target_title = entry["title"];
	my_title = me->query("sjsz/team_name");

  for ( i = 0; i < sizeof(board->query( "team" ) ); i++) {
		if( board->query( "team/" + sprintf("%d", i+1)  + "/title") == my_title )
		{
						for ( j = 0; j < sizeof(board->query( "team/" + sprintf("%d", i+1) + "/ids")); j++) {
								id = board->query( "team/" + sprintf("%d", i+1) + "/ids/" + sprintf("%d", j+1) );
								if( !id ) return notify_fail("找不到玩家 " + id + "\n");
								player = find_player(id);
								if (!player || !objectp(player) || !userp(player))
								{
										  return notify_fail("找不到玩家 " + id + "\n");
								}
					  }
					  break;
		}
  }

  target = find_player( board->query( "team/" + sprintf("%d", n) + "/leader" ) );
  if( objectp(target))
  {
	  message_vision( my_title+"队$N应声对"+target_title+"队$n喝道:"+HIR"“"+RANK_D->query_rude(target)+","+RANK_D->query_self(me)+HIR"岂会怕你?今日本座就与你决一死战!弟兄们,抄家伙上啊!”\n"NOR,me,target);
  }

	start_busy(20);
	call_out( "do_duet", 5, "start" );
  clean_sjsz();
  refresh_sjsz();

  call_out( "do_assign",1, sprintf("%d west",i+1) );
  message_vision( HIG"$N率领第"+chinese_number(i+1)+ "队"+my_title+"队由西门入场\n"NOR,me);

  call_out( "do_assign",3, sprintf("%d east",n)  ) ;
  message_vision( HIG"$N率领第"+chinese_number(n)+ "队"+target_title+"队由东门入场\n"NOR,target);

  
  CHANNEL_D->do_channel(this_object(), "chat", me->query("name")+"率领"+my_title+"队现在开始与"+target->query("name")+"率领的"+target_title+"队决斗!\n" );

  target->delete("sjsz/challenging");
  me->delete("sjsz/challenger");
}

int do_auto_teamup(string arg) {
	 object me = this_player(), board, player;
	 string *user = ({ "", "", "", "", "", "", "", "", "","", "", "", "", "", "", "", "", "","", "", "", "", "", "", "", "", "","", "", "", "", "", "", "", "", "","", "", "", "", "", "", "", "", "","", "", "", "", "", "", "", "", "" });
	 string title;
	 string msg = "";
	 int ppl=0, i,j, exp, exp1,exp2,sum_exp,top_exp,sec_exp;
     object *inv, here = environment(me);
	 string team1,team2,top_id,sec_id;

	 board =  find_object(BOARD);
	 if (!objectp(board)) {
		  board = load_object(BOARD);
		  if (!objectp(board))
				return notify_fail("找不到团体赛成绩版。\n");
	 }


	 if( this_object()->is_busy() )return notify_fail("主持人道:还在忙着呢!\n") ;

	 if( board->query("west") && board->query("east") )return notify_fail("山庄主人抱歉道:“现在有人已经占用比武场了。请稍后再来!”\n");

	 if( me->query("combat_exp") < 500000 )return notify_fail("主持人怒道:你武功这么差,岂配指挥老子?\n");

	 inv = all_inventory(here);
	 i = sizeof(inv);

	 exp=0;
	 top_exp=0;
	 sec_exp=0;
	 while(i)
	{
		 i--;
	  if( inv[i] && objectp(inv[i]) && living(inv[i]) && userp(inv[i]) && inv[i]->query("combat_exp") > 80000 )
	  {
		  exp = inv[i]->query("combat_exp"); 
		  if( exp > top_exp )
		  { 
			sec_exp=top_exp; sec_id = top_id; 
			top_exp = exp; top_id = inv[i]->query("id");
		  }
		  if( exp >sec_exp && exp < top_exp ){ sec_exp=exp; sec_id = inv[i]->query("id"); }
		  sum_exp += exp;
		  inv[i]->delete("sjsz");
		  ppl++;
	  }
	 }

	 if(ppl<6)return notify_fail("人数不够。\n");

	 i = sizeof(inv);
	 exp1=top_exp;
	 exp2=sec_exp;
	 team1 = HIW + "野虎队" + NOR + " " +top_id;
	 team2 = HIR + "猛狮队" + NOR + " " +sec_id;
     message_vision( HIG"主持人分配$N率领第一队\n"NOR,present(top_id,here) );
	 message_vision( HIG"主持人分配$N率领第二队\n"NOR,present(sec_id,here) );

	 while(i)
	{
		 i--;
	  if( inv[i] && objectp(inv[i]) && living(inv[i]) && userp(inv[i]) && inv[i]->query("combat_exp") > 80000 )
	  {
		  exp = inv[i]->query("combat_exp"); 
		  if( exp == top_exp || exp == sec_exp )continue;
		  if(exp1 > exp2 && random(4) != 1)
		  {
			  team2 += " "+inv[i]->query("id");
			  exp2 += exp;
			  inv[i]->delete("sjsz");
			  //message_vision( HIG"主持人分配$N加入第二队\n"NOR,inv[i] );
		  }
		  else
		  {
			  team1 += " "+inv[i]->query("id");
			  exp1 += exp;
			  inv[i]->delete("sjsz");
			  //message_vision( HIG"主持人分配$N加入第一队\n"NOR,inv[i] );
		  }
	  }
	 }
	 message_vision( HIG"主持人向$N报告道:第一队经验总数:"+exp1+"第二队经验总数:"+exp2+"\n"NOR,me);


	 board->delete("team");
	 board->delete("counts");
	 board->delete("east");
	 board->delete("west");
	 board->save();

	 call_out("do_add",1,team2);
	 start_busy(5);
	 return do_add(team1);
}


⌨️ 快捷键说明

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