paimaishi.c

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

C
334
字号
// 拍卖师

inherit NPC;
#include <ansi.h>;
int begin_paimai(string name,int value ,int paimai_count,int m);
int go_paimai(string id,string name,int value,int num,int m);
int report_paimai(object buyer,int money,int num);
int finish_paimai(int num,int sign);
int pay_back(string id, int amount);
int delete_ob(int num);
void create()
{
        set_name("拍卖师", ({ "paimai shi", "ji", "shi" }) );
		set("nickname", HIW "天下第一锤" NOR);
        set("gender", "男性");
        set("age", 45);
        set("no_get", 1);
        set("long",
"这是一位瘦高的中年人,因为公正无私而被推为天下第一拍卖师。\n"
"关于的拍卖命令。\n"
"paimai 物品 with 钱数(银子为单位) 。\n"
"paimailist         :查询当前的拍卖物品。\n"
"yao                : 取回自己的东西。\n"
"以上三个命令必须在平安广场使用。\n"
"bid 钱数     :  竞拍 \n"
                );
        set("combat_exp",600000);
        set("shen", 0);
	set("attitude", "friendly");

        set("apply/attack", 100);
        set("apply/defense", 100);

        set("max_kee", 800);
        set("max_gin", 800);
        set("max_sen", 800);
        set("max_force", 8000);
        set("eff_force",8000);
        set("force",8000);
	
        set_skill("force", 300);
        set_skill("unarmed", 300);
        set_skill("sword",300);
        set_skill("parry",300);
        set_skill("dodge", 300);

	    setup();

        carry_object("clone/cloth/cloth")->wear();
}


void init()
{
        ::init();
        add_action("do_paimai", "paimai");
		add_action("do_paimailist", "paimailist");
		add_action("do_yao", "yao");
        
}
int do_paimai(string arg)
{
	object who,ob;
	int money,clone_number,paimai_count,i,value,sale_price;
	string id,file_name;
	mapping fpaimai,vpaimai,ipaimai,npaimai,lpaimai,opaimai,spaimai;
	string* terms;
	
	fpaimai = query("fpaimai");
	vpaimai = query("vpaimai");
	ipaimai = query("ipaimai");
	npaimai = query("npaimai");
	lpaimai = query("lpaimai");
	opaimai = query("opaimai");
	spaimai = query("opaimai");
	
	who=this_player();
	
	if( who->is_busy() )
         return notify_fail("你的动作还没有完成,不能提交物品进行拍卖。\n");
    if( !arg || sscanf(arg, "%s with %d",id, money)!=2 )
		return notify_fail("指令格式:paimai <物品id> with <底价(silver为单位)> \n");
	if( !ob=present(id, who))
		return notify_fail("你身上没有这样东西。\n");
	if( ob->query("money_id") )	
		return notify_fail("你要拍卖「钱」?\n");
	
	if (ob->query("value")==0 || money==0)
		return notify_fail("不值钱,你就别卖了!\n");
	if (ob->query("no_paimai"))
		return notify_fail("这样东西不能拍卖了!\n");

	if (ob->query("no_get"))
		return notify_fail("这样东西不能拍卖了!\n");

	if (ob->query("ownmake"))
		return notify_fail("这样东西不能拍卖了!\n");

       if( ob->is_character() || ob->is_corpse() )
        return notify_fail("看清楚一点,这个东西不能卖。\n");


	if (money>200000)
		return notify_fail("要价太高了,你可能卖不出去!\n");
	if (who->query("balance")<10000)
		return notify_fail("你账号里的钱不够支付手续费!\n");
	who->add("balance",-10000);
	who->start_busy(6);

	command("chat "+"有人提交"+NOR+ob->query("name")+HIW+"进行拍卖。"NOR);
	sscanf(file_name(ob),"%s#%d",file_name,clone_number);

	if( mapp(fpaimai) &&  sizeof(fpaimai) )
		add("total_number",1);
	else
		set("total_number",0);
	
	value = ob->query("value");
	sale_price= ob->query_temp("sale_price");
	if (sale_price>0)
		sale_price= sale_price>value?value:sale_price;

	set("fpaimai/"+ sprintf("%d",query("total_number")),file_name);
	set("vpaimai/"+sprintf("%d",query("total_number")), money);
	set("ipaimai/"+sprintf("%d",query("total_number")), who->query("id"));
	set("npaimai/"+sprintf("%d",query("total_number")), ob->query("name"));
	set("lpaimai/"+sprintf("%d",query("total_number")), 1);
	set("opaimai/"+sprintf("%d",query("total_number")), who->query("id"));
	set("spaimai/"+sprintf("%d",query("total_number")), sale_price);
	
	if (query("total_number")==0 || query("lpaimai/"+sprintf("%d",query("number")))==0)
	{
		set("value",money);
		set("pnum",0);
		set("number",query("total_number")>0?query("number")+1:0);
		call_out("begin_paimai",5,ob->query("name"),money,query("number"),0);
	}
	destruct(ob);
	return 1;
}
int begin_paimai(string name,int money,int num,int m)
{
	m+=1;
	if (m==1)
	{
		command("chat "+"现在开始拍卖 "NOR+name+HIW+" 的所有权。"+NOR);
	}
	set("on_paimai",1);
	command("chat  "+NOR+name+HIW+" 底价 "+chinese_number(money)+"两银子 第"+chinese_number(m)+"次");
	if (!(m==3))
		call_out("begin_paimai",20,name,money,num,m);
	else
		call_out("finish_paimai",2,num,0);	
}
int finish_paimai(int num,int sign)
{
	string id,owner_id;
	object buyer,owner;
	int i;

	
	id=query("ipaimai/" + sprintf("%d", num));
	owner_id=query("opaimai/" + sprintf("%d", num));
	set("lpaimai/"+sprintf("%d",num), 0);
		
	buyer=find_player(id);
	owner=find_player(owner_id);
	if (sign==0)
	{
		if(owner)
			tell_object(owner,HIR"你的东西没有卖出去,请在十分钟内来平安广场取回自己的物品。\n"NOR);
	}
	else		
	{
		command("chat  成交!"+buyer->query("id")+"获得了 "+NOR+query("npaimai/" + sprintf("%d", num))+HIW+" 的所有权。"+NOR);
		if (buyer)
			tell_object(buyer,HIR"你获得了 "+NOR+query("npaimai/" + sprintf("%d", num))+HIR+" 的所有权,请在十分钟内来平安广场取回你买的东西。\n"NOR);
		if (owner)
			tell_object(owner,HIR"你的"+NOR+query("npaimai/" + sprintf("%d", num))+HIR+"卖了"
			+chinese_number(query("vpaimai/" + sprintf("%d", num)))+"两银子,扣除5%手续费,其余的已经加入你的户头了。\n"NOR);	
	}
	set("on_paimai",0);
	
	pay_back(owner_id,query("vpaimai/" + sprintf("%d", num))*95);
	
	call_out("delete_ob",36000,num);

	num=num+1;
	if (query("lpaimai/" + sprintf("%d", num))==1)
	{
		set("value",query("vpaimai/" + sprintf("%d", num)));
		set("number",num);
		set("pnum",0);
		call_out("begin_paimai",5,query("npaimai/" + sprintf("%d", num)),query("vpaimai/" + sprintf("%d", num)),num,0);
	}
	return 1;
}
int report_paimai(object buyer,int money,int num)
{
	remove_call_out("begin_paimai");
	remove_call_out("finish_paimai");
	remove_call_out("go_paimai");
	
	if (query("pnum"))
	{
		pay_back(query("ipaimai/" + sprintf("%d", num)),query("vpaimai/" + sprintf("%d", num))*100);
	}
	add("pnum",1);
	buyer->add("balance",(0-money*100));
	set("vpaimai/"+sprintf("%d",num), money);
	set("ipaimai/"+sprintf("%d",num), buyer->query("id"));
	set("value",money);
	command("chat  "+buyer->query("id")+" 出价 "+chinese_number(money)+"两银子 购入"+NOR+query("npaimai/" + sprintf("%d", num))+HIW"的所有权。");
	call_out("go_paimai",5,buyer->query("id"),query("npaimai/" + sprintf("%d", num)),money,num,0);
	return 1;
}
int pay_back(string id, int amount)
{
    object who;
    
    who=find_player(id);
    if(who)
	{
		who->add("balance",amount);
		if(!who->save(1)) 
		{
			log_file("paimai_log","Failed to return "+amount+
				" coin to "+id+"\n");
			return 0;
		}
	log_file("paimai_log","pay "+amount+" to "+id+"\n");
	return 1;
    } 
	else
	{
		who=new(USER_OB);
		who->set("id",id);
		if(!who->restore())
		{
			log_file("paimai_log","Failed to return "+amount+
				" coin to "+id+"\n");
			destruct(who);
			return 0;
		}
		else 
		{
			who->add("balance",amount);
			if(!who->save(1))
			{ // save(1) will not erase autoload.
				log_file("paimai_log","Failed to return "+amount+
					" coin to "+id+"\n");
				destruct(who);
				return 0;
			} 
			log_file("paimai_log","pay "+amount+" to "+id+"\n");
			destruct(who);
			return 1;
		}
    }
}
int go_paimai(string id,string name,int money,int num,int m)
{
	m+=1;
	command("chat  "+id+" 出价 "+chinese_number(money)+"两银子 购入 "+NOR+name+HIW+" 的所有权,第"+chinese_number(m)+"次");
	if (!(m==3))
		call_out("go_paimai",20,id,name,money,num,m);
	else
		call_out("finish_paimai",5,num,1);	
}
int do_paimailist()
{
	int i;
	
	for(i=query("number")+1;;i++)
	{
		if (query("lpaimai/" + sprintf("%d", i))==1)
		{
			printf("%-10s: 底价 %-3d 两银子 \n",query("npaimai/" + sprintf("%d", i)),query("vpaimai/" + sprintf("%d", i)));
		}
		else
			return 1;
	}
	return 1;
}
int do_yao()
{
	mapping fpaimai,vpaimai,ipaimai,npaimai,lpaimai,spaimai;
	string* terms;
	string id;
	object ob;
	int i;

	fpaimai = query("fpaimai");
	vpaimai = query("vpaimai");
	ipaimai = query("ipaimai");
	npaimai = query("npaimai");
	lpaimai = query("lpaimai");
	spaimai = query("spaimai");
	
	if( mapp(fpaimai) &&  sizeof(fpaimai) )
	{
		terms=keys(fpaimai);
	
		for(i=0;i<sizeof(terms);i++)
		{
			if (ipaimai[terms[i]]==this_player()->query("id") && lpaimai[terms[i]]==0)
			{
				ob=new(fpaimai[terms[i]]);
				if (spaimai[terms[i]]>0)
					ob->set_temp("sale_price",spaimai[terms[i]]);
				ob->move(this_player());
				ipaimai[terms[i]]="paimai shi";
				message_vision(CYN+"拍卖师将"+NOR+npaimai[terms[i]]+CYN+"交给$N。\n", this_player(),this_object());
				return 1;
			}
		}
	}
	tell_object(this_player(),"这里没有属于你的物品。\n");
	return 1;
}
int delete_ob(int num)
{
	delete("npaimai/"+sprintf("%d",num));
	delete("ipaimai/"+sprintf("%d",num));
	delete("vpaimai/"+sprintf("%d",num));
	delete("lpaimai/"+sprintf("%d",num));
	delete("fpaimai/"+sprintf("%d",num));
	delete("spaimai/"+sprintf("%d",num));
	
	return 1;
}


        

⌨️ 快捷键说明

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