kantai.c

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

C
403
字号
//Cracked by Kafei// 看台
// by sdong 09/25/98

#include <ansi.h>
inherit ROOM;
int do_practice(string arg);
int do_study(string arg);
string long_desc();
int do_start(string arg);
int do_stop(string arg);
int do_baoming();
int start(string host,string challenger);
void sort_rank(object ob,int i);
int auto_check();
int let(string arg);
void full_all(object me);

#define LEITAI "/d/bwdh/leitai"
#define KANTAI "/d/bwdh/kantai"
#define CANGKU "/d/bwdh/cangku"

void create()
{
	set("short", "看台");
	set("long", (: long_desc :));
	set("valid_startroom", 1);

	set("no_fight", 1);
	set("no_practice", 1);

	set("exits", ([
		"up" : __DIR__"leitai",
		"out": "/d/bwdh/square",
	]));

	set("objects", ([
		__DIR__"npc/mu":1,
	]));

	setup();
}

void init()
{
  object player = this_player();
  object *inv, cangku, *basket;
  int i;

  if ( objectp(player) && player->query("bwdh/fighting") ) {

    player->remove_all_killer();
    player->clear_condition();	
    inv = all_inventory(player);
    for (i=0; i<sizeof(inv); i++) {
        message_vision("$N把从擂台取的"+inv[i]->query("name")+"还给主持人。\n", 
        player);
        destruct(inv[i]);
    }
  
  cangku = find_object(CANGKU);
  if (! objectp(cangku)) {
    cangku = load_object(CANGKU);
    if (!objectp(cangku)) {
      message_vision("$N请告诉 wiz: cangku not found\n", player);
      return 0;
    }
  }

  player->restore();	

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

  if (basket) {
    for (i=0; i<sizeof(basket); i++) {
      if (objectp(basket[i])) {
        basket[i]->move(player);
        message_vision("$N从主持人手里拿回一"+
                basket[i]->query("unit")+ 
                basket[i]->query("name")+"。\n", player);
      }
    }
    cangku->delete("basket/"+player->query("id"));
  }
  player->delete("bwdh/admitted");
  player->delete("bwdh/fighting");
  player->delete("bwdh/once");

 }
		  add_action("do_practice",  "practice");
		  add_action("do_practice",  "lian");
		  add_action("do_study",  "study");
		  add_action("do_study",  "du");
		  add_action("do_baoming", "报名");
		  add_action("do_baoming", "baoming");
		  add_action("do_abandon", "放弃");
		  add_action("do_abandon", "abandon");
		  add_action("do_start", "start");
		  add_action("do_stop", "stop");

}

string long_desc()
{
  	string desc,temp;
	int nRank,i,j;

  	desc  = HIY"

		           /I______________I\\               "+HIC"|"+HIR"=====|"+HIY"
		         //||||||||||||||||||\\\\             "+HIC"|"+HIR" 武   |"+HIY"
		     T\\//IIIIIIIIIIIIIIIIIIIIII\\\\/T         "+HIC"|"+HIR"=====|"+HIY"
	             ^^^^"+HIG"||"NOR+HIY"^^^"+HIR"【比武擂台】"NOR+HIY"^^^"+HIG"||"+HIY"^^^^         "+HIC"|"+HIY"
		         "+HIG"||"NOR+HIY"__________________"+HIG"||"NOR+HIY"             "+HIC"|"+HIY"
			/||||||||||||||||||||||\\            "+HIC"|"+HIY"
		    T\\//IIIIIIIIIIIIIIIIIIIIIIII\\\\/T        "+HIC"|"+HIY"
	            ^^^^"+HIG"||"+HIY"^^^^^^^^^^^^^^^^^^^^"+HIG"||"+HIY"^^^^        "+HIC"|"+HIG"
			||                    ||            "+HIC"|"+HIW"
	  []___[]___[]__|[]___[]___||___[]___[]|__[]___[]___[]
	  |__________________|_|________|_|__________________|"+HIG"
             ||                                          ||
             ||  ________       龙 虎 板       ________  ||
             ||  |                                    |  ||\n";

		

	if(query("age"))
	{
		desc += "     	     ||  |          "+query("age")+"岁以下组比武大赛        |  ||\n";
		desc += "     	     ||  |                                    |  ||\n";
	}

	nRank = this_object()->query("nRank");
	for ( i=1;i<=nRank && i <= 10;i++)
	{
		desc += "             ||  | ";
		desc += i + ". ";

		temp = this_object()->query("rank/"+i+"/name") + "("; 
		temp += this_object()->query("rank/"+i+"/id") + ") "; 
		temp += "胜:"+this_object()->query("rank/"+i+"/win") + " "; 
		temp += "负:"+this_object()->query("rank/"+i+"/loss");
		
		desc += temp; 
		for(j=strlen(temp);j<=31;j++)
		{
			desc += " ";
		}

		desc += "|  ||\n"; 
	}

	for(i=i;i<=12;i++)
	{
		desc += "     	     ||  |                                    |  ||\n";
	}
  
	desc+="             ||  |____________________________________|  ||\n";
  	return desc;
}


int valid_leave(object me, string dir)
{
	if( dir=="up" ) {
		if( wizardp(me) || me->query_temp("organizer") ) return 1;
		else return notify_fail("你不能自己上去。\n");
	}

	if( dir=="out" ) {
		if( wizardp(me) || !me->query_temp("admitted") ) return 1;
		else
		{
			return notify_fail("你是选手,现在不能离开。\n");
		}
	}

	return ::valid_leave(me, dir);

}

void sort_rank(object ob, int n)
{
	int nRank = query("nRank");
	int i;
	string id = ob->query("id");
	
	if(n>0)
	{
		
		for(i=nRank;i>=1;i--)
		{
			if(query("rank/"+i+"/id")==id)break;
		}
		if( i<1 )
		{
			nRank ++;
			set( "nRank",nRank );
			set( "rank/"+nRank+"/name",ob->query("name") );
			set( "rank/"+nRank+"/id",ob->query("id") );
			set( "rank/"+nRank+"/win",ob->query("bwdh/win") );
			set( "rank/"+nRank+"/loss",ob->query("bwdh/defeated") );
			i=nRank;
		}

		for(i=i;i>=1;i--)
		{
			if( i>1 && query("rank/"+(i-1)+"/win") < ob->query("bwdh/win") )
			{
				set( "rank/"+i+"/name",query("rank/"+(i-1)+"/name") );
				set( "rank/"+i+"/id",query("rank/"+(i-1)+"/id") );
				set( "rank/"+i+"/win",query("rank/"+(i-1)+"/win") );
				set( "rank/"+i+"/loss",query("rank/"+(i-1)+"/loss") );

				set( "rank/"+(i-1)+"/name",ob->query("name") );
				set( "rank/"+(i-1)+"/id",ob->query("id") );
				set( "rank/"+(i-1)+"/win",ob->query("bwdh/win") );
				set( "rank/"+(i-1)+"/loss",ob->query("bwdh/defeated") );
			} 
			else
			{
				set( "rank/"+i+"/name",ob->query("name") );
				set( "rank/"+i+"/id",ob->query("id") );
				set( "rank/"+i+"/win",ob->query("bwdh/win") );
				set( "rank/"+i+"/loss",ob->query("bwdh/defeated") );
				break;
			}
		}
	}
	else
	{
		for(i=nRank;i>=1;i--)
		{
			if(query("rank/"+i+"/id")==id)break;
		}
		if( i<1 )
		{
			nRank ++;
			set( "nRank",nRank );
			set( "rank/"+nRank+"/name",ob->query("name") );
			set( "rank/"+nRank+"/id",ob->query("id") );
			set( "rank/"+nRank+"/win",ob->query("bwdh/win") );
			set( "rank/"+nRank+"/loss",ob->query("bwdh/defeated") );
			return;
		}
		set( "rank/"+i+"/name",ob->query("name") );
		set( "rank/"+i+"/id",ob->query("id") );
		set( "rank/"+i+"/win",ob->query("bwdh/win") );
		set( "rank/"+i+"/loss",ob->query("bwdh/defeated") );
	}

}

int do_start(string arg)
{
	object me = this_player();
	int age;

	if (!wizardp(me)) {
					 tell_object(me,"你不是巫师,不能发动比武大会!\n");
					 return 1;
		  }

	if (!arg || sscanf(arg, "%d", age)!=1)
		  {
					 tell_object(me,"usage: start age\n");
					 return 1;
		  }
	if(query("start"))
		{
					 tell_object(me,"比武已经开始了,如要终止,请用STOP命令。\n");
					 return 1;
		}

	this_object()->set("age",age);
	this_object()->set("start",1);
	message_vision("$N高声宣布:这个擂台现在开始"+age+"岁以下组比武大赛!\n",me);
	return 1;
}

int do_stop(string arg)
{
	object ob1,ob2,me = this_player();
	int age;
	string host,challenger;

	if (!wizardp(me)) {
					 tell_object(me,"你不是巫师,不能终止比武大会!\n");
					 return 1;
		  }

	if(!query("start"))
		{
					 tell_object(me,"比武还没开始呢。如要开始,请用start age命令。\n");
					 return 1;
		}

        age = query("age");
	this_object()->delete("age");

	if( (host = query("host")) )
		ob1=find_player( query("host") );
	if(ob1 && ob1->query("bwdh/fighting") )
	{
		ob1->move(KANTAI);
		ob1->delete("bwdh/fighting");
		ob1->delete("bwdh/admitted");
	}

	if( ( challenger=query("challenger")) )
	{
	  ob2=find_player(challenger);
	  if( ob2 && ob2->query("bwdh/fighting") )
	 {
		ob2->move(KANTAI);
		ob2->delete("bwdh/fighting");
		ob2->delete("bwdh/admitted");
	 }
	}

	delete("start");
	delete("host");
	delete("challenger");
	delete("fighting");

	message_vision("$N高声宣布:"+age+"岁以下组比武大赛现在结束!\n",me);
	return 1;
}

int do_baoming()
{
	string msg, name;
	object me;
	string host,challenger,girl;
	int i, age = 0;

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

	me = this_player();

	if(this_object()->query("start")!=1)
	{
	        tell_object(me,"对不起,现在没有比武大赛!\n");
		return 1;
	}


	if( me->query("age") >= this_object()->query("age") )
	{
	  	tell_object(me,"主持人对你说: 对不起,这个擂台专门进行"+age+"岁以下组比武大赛,你已经超龄!\n");
		return 1;
	}


	if( me->query("bwdh/admitted") )
	{
	  	tell_object(me,"主持人对你说: 你已经报名。急什么?到时会叫你上!\n");
		return 1;
	}

	if( me->query("bwdh/defeated") >= 3 )
	{
	  	tell_object(me,"主持人对你说: 你这个连输三场的败将,回家好好练去吧!\n");
		return 1;
	}



	if( !(host=query("host")) )
	{
		name = me->query("name")+"("+me->query("id")+")";
		set("host",me->query("id") );
		host = me->query("id");

		remove_call_out("let");
		call_out("let",0,me->query("id") + " play " + me->query("id"));
		message_vision("主持人说: 好,现在$N是擂主!\n", me);
		delete_temp("no_challenger");
		remove_call_out("auto_check");
		call_out("auto_check",30);
		return 1;
	}

	if( query_temp("fighting"))
	{
		me->set("bwdh/admitted",1);
		tell_object(me,"主持人对你说: 好。现在有人正在比武,轮到你时会叫你!\n");
		set("boy/" + time(), me->query("id") );
		return 1;
	}


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

	remove_call_out("let");
	call_out("let",0,me->query("id") + " play " + me->query("id"));

	remove_call_out("start");
	call_out("start",30,host,challenger);
	message_vision("主持人说: 好,$N

⌨️ 快捷键说明

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