kantai.h

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

H
1,072
字号
		remove_call_out("auto_check");
		call_out("auto_check",10);
		return 1;
	}

	if( me->query("bwdh/"+host+"/time") >= 3)
	 return notify_fail("你们已经交手三次了!\n");

	name = me->query("name")+"("+me->query("id")+")";
	set("challenger",me->query("id") );
	challenger = me->query("id");

	delete_temp("no_challenger");

	remove_call_out("start");
	call_out("start",60,host,challenger);

	message_vision("主持人说: 好,$N准许参加比赛!\n", me);
	me->set("bwdh/fighting",1);
	set( "bet",1); // now can bet
	delete("bet_amount"); // clear last record

	let(me->query("id") + " play " + me->query("id"));

	remove_call_out("auto_check");
	call_out("auto_check",1);

	return 1;
}

int start(string host,string challenger)
{
	object ob1,ob2;
	ob1=find_player(host);
	ob2=find_player(challenger);


	if( ob1 && ob2 && ob1->query("bwdh/fighting") && ob2->query("bwdh/fighting") )
	{
		message_vision(HIR"一声锣响,$N和$n比赛开始。\n"NOR,ob1,ob2);
		ob1->kill_ob(ob2);
		ob2->kill_ob(ob1);
		ob1->set("bwdh/fighting",1);
		ob2->set("bwdh/fighting",1);
		set("fighting",1);
		delete( "bet" ); // fight start, no bet
	}

	remove_call_out("auto_check");
	call_out("auto_check",20);
}

int update_room (string file, string winner)
{
		  int i, amount, total, win_m,me_m;
		  object obj, *inv, money, me = this_player(), here = find_object(KANTAI);
		  string err;
		 tell_room( LEITAI, HIY"主持人高声说,开奖开奖啦,买得越多赚得越多!\n"NOR, this_object());

		 inv = all_inventory( here );
		 i = sizeof(inv);
		 while(i--)
		 {
			 if( userp(inv[i]) )
			 {
				total = query("bet_amount/sum") ;
				total = total ;
				tell_object( inv[i], HIY"总共有"+chinese_number(total)+"两银子压上了\n"NOR);
				win_m =  query( "bet_amount/" + winner ) ;
				tell_object( inv[i], HIY"总共有"+chinese_number(win_m)+"两银子压对了\n"NOR);
				me_m = inv[i]->query( "bet/"+winner );
				if(me_m>0)
					tell_object( inv[i], HIY"你总共有"+chinese_number(me_m)+"两银子压对了\n"NOR);

			  if( inv[i]->query( "bet/"+winner ) )
			  {
				amount = me_m  * total / win_m;

				if( amount > 100 )
				{
					seteuid(geteuid());
					money = new ("/clone/money/gold");
					money->set_amount(amount/100);
					//tell_object( inv[i], HIY"你赚回了"+chinese_number(amount/100)+"两金子\n"NOR);
					message_vision(HIG"$N赚回了"+chinese_number(amount/100)+"两金子\n"NOR,inv[i]);
				}
				else if( amount > 1 )
				{
					seteuid(geteuid());
					money = new ("/clone/money/silver");
					money->set_amount(amount);
					//tell_object( inv[i], "你赚回了"+chinese_number(amount)+"两银子\n");
					message_vision(HIG"$N赚回了"+chinese_number(amount)+"两银子\n"NOR,inv[i]);
				}
				if(money)
				 money->move(inv[i]);
				inv[i]->delete("bet");
			  }
			  else if( inv[i]->query( "bet" ) )
			  {
					tell_object( inv[i], "你暗自怪自己:真倒霉!怎么就没压在该赢的一边?\n");
			  }
			  inv[i]->delete("bet");
			}
		}

	  tell_room( LEITAI, HIW"两名小厮跑上来,快手快脚把擂台扫得干干净净。\n"NOR, this_object());
	  if (obj = find_object(file)) {
		if( file_name(obj)==VOID_OB )
		  return notify_fail("你不能在 VOID_OB 里重新编译 VOID_OB。\n");
		inv = all_inventory(obj);
		i = sizeof(inv);
		while(i--)
		  if( userp(inv[i]) ) inv[i]->move(VOID_OB, 1);
		  else inv[i] = 0;

		destruct(obj);
	  }

	  if (obj) return notify_fail("无法清除旧程式码。\n");
	  err = catch( call_other(file, "???") );
	  if (err)
		 printf( "发生错误:\n%s\n", err );
	  else {
		 if( (i=sizeof(inv)) && (obj = find_object(file))) {
			while(i--)
			  if( inv[i] && userp(inv[i]) ) inv[i]->move(obj, 1);
		 }
			 }
}

void move_me(object ob, string target)
{
	if( !ob || !objectp(ob) )return;
   ob->set("bwdh/fighting",1);
	ob->move(target);
}


int auto_check()
{
		  object ob1,ob2;
		  object me,ob;
		  mapping boy;
		  int i, *times;
		  string old_host,old_challenger,host,girl,challenger,name;

		  if( !query("start") )
				return 0;

		  if( !( host=query("host")) )
		  {
			tell_room( this_object(), "主持人高声说,"+query("age")+"岁以下比武大会正在进行,赶紧报名(baoming)呀!\n", this_object());
			delete("fighting");
			delete("challenger");
			delete_temp("no_challenger");
			remove_call_out("auto_check");
			call_out("auto_check",20);
			return 0;
		  }

		  old_host = query("host");
		  old_challenger = query("challenger");

		  ob1=find_player(host);

			if(ob1 && living(ob1) && ob1->query("qi") > 0 && ob1->query("bwdh/fighting") )
				message_vision("主持人高声说,$N是现在的擂主.\n", ob1);
			else
			{
				message_vision(HIR"$N守擂失败,被抬下擂台.\n"NOR, ob1);
				ob1->restore();
				ob1->set("bwdh/defeated",1+ob1->query("bwdh/defeated"));
				ob1->delete("bwdh/fighting");
				ob1->set("bwdh/"+old_challenger+"/time",ob1->query("bwdh/"+old_challenger+"/time")+1 );
				ob1->set("bwdh/"+old_challenger+"/lose",ob1->query("bwdh/"+old_challenger+"/lose")+1 );
				sort_rank(ob1,-1);
				delete("fighting");
				full_all(ob1);
				ob1->save();
				//ob1->move(KANTAI); // move out will restore data
				call_out("move_me",1,ob1,KANTAI);

				delete("host");
				delete_temp("no_challenger");
				call_out("update_room",1,LEITAI,query("challenger") );
				//update_room( LEITAI,query("challenger") );
			}

	  if( ( challenger=query("challenger") ) )
		{
				  ob2=find_player(challenger);
				  if( ob2)
				  {
					 if( !( host=query("host")) )
					  if( living(ob2) && !ob2->is_ghost() && ob2->query("qi") > 0 )
					 {
						ob2->restore();
						ob2->set("bwdh/win",1+ob2->query("bwdh/win") );
						ob2->set("bwdh/"+old_host+"/time",ob2->query("bwdh/"+old_host+"/time")+1 );
						ob2->set("bwdh/"+old_host+"/win",ob2->query("bwdh/"+old_host+"/win")+1 );
						ob2->set("bwdh/once",1);
						ob2->set("bwdh/fighting",1);
						set("host",challenger);
						delete("challenger");
						delete_temp("no_challenger");
						host = challenger;

						sort_rank(ob2,1);
						message_vision(HIG"主持人高声说,$N艺高一筹,将$n打下擂台,是现在的擂主. 哪位好汉或者女英雄有种就上呀!\n"NOR, ob2,ob1);
						//update_player(ob2);
						full_all(ob2);
						call_out("update_player",1,ob2);
						ob2 = find_player(host);
						if(ob2)
						{
						 tell_object(ob2,"请重新拿兵器。\n");
						}

						set("fighting",0); // challenger win, host exchange, so no fighting
						remove_call_out("auto_check");
						call_out("auto_check",1);
						return 1;
					 }

					  if( !( living(ob2) ) || ob2->query("qi")<=0 )
					  {
						message_vision(HIR"$N挑战$n失败,被抬下擂台.\n\n"NOR, ob2,ob1);
						ob2->restore();
						ob2->set("bwdh/defeated",1+ob2->query("bwdh/defeated"));
						ob2->set("bwdh/"+old_host+"/time",ob2->query("bwdh/"+old_host+"/time")+1 );
						ob2->set("bwdh/"+old_host+"/lose",ob2->query("bwdh/"+old_host+"/lose")+1 );
						ob2->delete("bwdh/fighting");
						sort_rank(ob2,-1);
						full_all(ob2);
						ob2->save();
						//ob2->move(KANTAI);
						call_out("move_me",2,ob2,KANTAI);
						delete("challenger");
						delete_temp("no_challenger");
						//update_room(LEITAI, query("host") );
						call_out("update_room",1,LEITAI, query("host") );

						set("fighting",0);

						 if( ( host=query("host") ) && userp(ob1) && living(ob1) && !ob1->is_ghost() ) //host win twice, out to rest
						 {
							ob1->restore();
							ob1->set("bwdh/win",1+ob1->query("bwdh/win") );
							ob1->set("bwdh/"+old_challenger+"/time",ob1->query("bwdh/"+old_challenger+"/time")+1 );
							ob1->set("bwdh/"+old_challenger+"/win",ob1->query("bwdh/"+old_challenger+"/win")+1 );
							ob1->set("bwdh/fighting",1);
							sort_rank(ob1,1);
							message_vision("主持人高声说: $N打败$n,守擂成功!\n", ob1,ob2);
							if( ob1->query("bwdh/once") )
							{
								message_vision("主持人高声说: $N真是神勇,竟然连胜两场。请下场休息一会!\n", ob1);
								delete("host");
								delete_temp("no_challenger");
								message_vision(HIM"$N神彩飞扬地跳下擂台休息去了.\n"NOR, ob1);
								ob1->delete("bwdh/once");
								set("fighting",0);
								full_all(ob1);
								ob1->save();
								//ob1->move(KANTAI);
								call_out("move_me",2,ob1,KANTAI);
							}
							else
							{
							 ob1->set("bwdh/once",1);
							 //update_player(ob1);
							 full_all(ob1);
							 call_out("update_player",1,ob1);
							 ob1 = find_player(host);
							 if(ob1)
							 {
								tell_object(ob1,"请重新拿兵器。\n");
							 }
							}
						 }

						 remove_call_out("auto_check"); // challenger defeated
						 call_out("auto_check",1);
						 return 1;
					  }

					 // now both host and challenger on LEITAI, fighting ?
					 if( !query("fighting") && query("bet") )
					 {
						message_vision(HIY"主持人高声说:$N和$n比武就要开始了,赶紧下注呀!下注呀!下注(bet id #gold)越多,赢的越多。\n"NOR, ob1,ob2);
						message_vision(HIY"主持人高声说:$N和$n的赌注比现在是: "+(query("bet_amount/" + host ))+":"+(query("bet_amount/" + challenger ))+"。\n"NOR, ob1,ob2);
					 }

					 remove_call_out("auto_check");
					 call_out("auto_check",20);
					 return 0;

				 }
				 else
				 {
					 // if this challenger not online, count as defeated, this should not happen indeed

					 ob2 = new(USER_OB);
					 ob2->set("id", challenger);
					 if( !ob2->restore() )
					{
						destruct(ob2);
						// no this ppl, suicided ?
						return 0;
					 }

					delete("challenger");
					ob2->restore();
					ob2->set("bwdh/defeated",1+ob2->query("bwdh/defeated") );
					ob2->delete("bwdh/fighting");
					sort_rank(ob2,-1);
					set("fighting",0);
					message_vision("主持人高声说: $N居然临战脱逃,按打败计。\n", ob2);
					update_room(LEITAI,query("host"));
					ob2->save();
					destruct(ob2);

						 // count host win once
						 if( ( host=query("host") ) && userp(ob1) && living(ob1) && !ob1->is_ghost() ) //host win twice, out to rest
						  {
							ob1->restore();
							ob1->set("bwdh/win",1+ob1->query("bwdh/win") );
							ob1->set("bwdh/fighting",1);
							sort_rank(ob1,1);
							if( ob1->query("bwdh/once") )
							{
								message_vision("主持人高声说: $N真是神勇,竟然连胜两场。请下场休息一会!\n", ob1);
								delete("host");
								message_vision("$N神彩飞扬地跳下擂台休息去了.\n", ob1);
								ob1->delete("bwdh/once");
											 full_all(ob1);
								ob1->save();
								ob1->move(KANTAI);
							}
							else
							{
							 ob1->set("bwdh/once",1);
							 update_player(ob1);
							 full_all(ob1);
							}
						  }

					set("fighting",0); // no fighting
					remove_call_out("auto_check");
					call_out("auto_check",1);
					return 0;
				}
		}
		else // no challenger, no fight
		{
			set("fighting",0);
		}


		  if( query("fighting") )
		  {
			  remove_call_out("auto_check");
			  call_out("auto_check",10);
			  return 0;
		  }


	if( !( host=query("host") ) )
	{
		remove_call_out("auto_check");
		call_out("auto_check",30);
		return 1;
	}

	// nobody come challenge

	set_temp("no_challenger",query_temp("no_challenger")+1);
	if( query_temp("no_challenger") >= 3 && ( host=query("host") ) && userp(ob1) && living(ob1) && !ob1->is_ghost() )
	{
		delete_temp("no_challenger");
		delete("host");
		message_vision(HIM"\n主持人高声说: $N真是威镇八方,居然无人敢上场挑战。这场算赢了.\n"NOR, ob1);
		message_vision(HIM"$N神彩飞扬地跳下擂台休息去了.\n"NOR, ob1);

		 // count host win once
		ob1->restore();
		ob1->set("bwdh/win",1+ob1->query("bwdh/win") );
		//ob1->set("bwdh/"+challenger,ob1->query("bwdh/"+challenger)+1 );
		//ob1->set("bwdh/"+challenger+"/win",ob1->query("bwdh/"+challenger+"/win")+1 );
		ob1->delete("bwdh/fighting");
		sort_rank(ob1,1);
		ob1->save();
		//ob1->move(KANTAI);
		call_out("move_me",1,ob1,KANTAI);
		remove_call_out("auto_check");
		call_out("auto_check",30);
		return 1;
	}

	if( query_temp("no_challenger") >= 2 )
	  {
		message_vision(HIY"主持人高声说,如果再过一会儿还没有人敢上来挑战的话,就算$N赢了.\n"NOR, ob1);
		remove_call_out("auto_check");
		call_out("auto_check",60);
		return 1;
	  }

	message_vision(HIW"主持人高声说,$N艺盖群雄,是现在的擂主,哪位豪杰上来挑战呀?\n", ob1);

	remove_call_out("auto_check");
	call_out("auto_check",30);

	return 1;
}



int let(string arg)
{
  object ob;
  string pl1, pl2;
  object room = this_object();
  object *inv;
  object *old_basket, *basket;
  object cangku;
  int i;

	if(!arg) return 0;
	if(sscanf(arg, "%s play %s", pl1, pl2) != 2) {
		pl1 = arg;
		pl2 = arg;
	}

	ob = find_player(pl1);
	if(!ob)return 0;
	ob->set("bwdh/fighting",1);
	ob->save();

	inv = all_inventory(ob);
	basket = allocate(sizeof(inv));

	cangku = find_object(CANGKU);
	if (! objectp(cangku)) {
			cangku = load_object(CANGKU);
			if (!objectp(cangku)) {
					message_vision("$N请告诉 wiz: cangku not found\n", ob);
					return 0;
			}
	}


	for (i=0; i<sizeof(inv); i++) {
			//if ( !inv[i]->query_autoload() && inv[i]->query("id")!="bu dai" )
		 if ( inv[i]->query("id")!="yu di" )
		{ // leave yudi etc.
				basket[i] = inv[i];
				inv[i]->move(cangku);
				message_vision("$N将一"+
				  inv[i]->query("unit")+
				  inv[i]->query("name")+"交给主持人。\n", ob);
		}else{
					basket[i] = 0;
		}
	  }

	old_basket=cangku->query("basket/"+ob->query("id"));

	if (arrayp(old_basket)) basket = basket + old_basket;
	cangku->set("basket/"+ ob->query("id"), basket);

	message_vision("$N进入擂台。\n", ob);

	ob->move(LEITAI);
	full_all(ob);

	message_vision("$N进入擂台。\n", ob);
	tell_object(ob, "主持人告诉你" + RANK_D->query_respect(ob)+
								",请从武器架上取武器(look jia; get armor from jia and get weapon from jia).\n");
	delete_temp("no_challenger");
	ob->set("bwdh/fighting",1);
	update_player(ob);
	return 1;
}



int update_player(object me)
{
		  object env, link_ob, obj;

		  env = environment(me);

		  // Save the data and exec the player to his/her link object.
		  me->save();

		  // First, create the new body.
		  link_ob = me->query_temp("link_ob");
		  obj = LOGIN_D->make_body(link_ob);
		  if (!obj) return 0;

		  exec(link_ob, me);
		  destruct(me);

		  // Restore new body and exec to it via enter_world in LOGIN_D
		  obj->restore();
		  LOGIN_D->enter_world(link_ob, obj, 1);

		  obj->move(env);

		  return 1;
}

void full_all(object me)
{
	  if( !living(me) )
	  {
		message_vision(HIW"主持人闪电般的伸出中指在$N的人中穴上一点一按,原来这招就是江湖上失传已久的一指神针,传说可以起死回生。\n", me);
		me->revive(0);
	  }

	  message_vision(HIG"主持人身形闪动,突然一掌按在$N的头顶百会穴上,将内力源源不断的灌输进去,片刻之间,\n"+
		"$P就觉得全身百窍无不舒畅,内力极其充沛,这招就是江湖传说中的神掌传功,据说失传已久。\n\n", 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();
}


⌨️ 快捷键说明

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