bid.c

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

C
646
字号
// cmds/std/auction.c 拍卖与竞价程序
// call_out() 映射控制版 for sz xo2(xkx)
// By Shure@mudbuilder.net 2001-8-17
/*
key  string ob_id      物品ID
v[0] object obj        拍卖物品     
v[1] int    ob_price   竞标价格               
v[2] object ob_auction 竞标者                 
v[3] object ob_onwer   物品所有者             
v[4] string ob_desc    物品所有者对该物品的介绍
v[5] string auction_id 竞标者ID
v[6] string onwer_id   物主ID
v[7] string ob_name    物品名称
v[8] string ob_long    物品描述

mapping structure:
auction[obj : {ob, ob_price, ob_auction, ob_onwer, ob_desc, auction_id, ...} ]
*/

#include <ansi.h>
inherit F_DBASE;

#define PRICE_DIFFERENCE 100

static mapping auction = ([]);

// 状态变化的控制中心
void auction_chat(string msg);  
void auction_state_check(int times, int s_times, int last_price, string obj_id); 
// 静止的状态切换
void auction_end(string ob_name, int ob_price, mixed ob_auction, object ob_onwer, object ob, string ob_id);
void auction_cancel(string ob_id, object discredit_1, object discredit_2);
// 实现拍卖
void get_ob_desc(string desc, object me, string str, int num);
void choise_secret(string decide, object me, string ob_id, string desc, int num);
// 数据反馈
int player_demand(int num, string unit, object me);
int player_bank(object ob);
int player_pay(object who, int amount);
int help();

// channeld.c需要增加auction频道
/*
	"auction":([	"msg_speak": HIY "【拍卖场】%s: %s\n" NOR,
			"msg_color": HIY,
		]),
*/

int clean_up(){ return 1;}

void create()
{
	seteuid(ROOT_UID);
	set("name", "拍卖指令");
	set("id", "auction");
	set("channel_id","");
}

void auction_chat(string msg) 
{	
	msg = replace_string(msg,NOR,HIY);	
	CHANNEL_D->do_channel(this_object(),"auction",msg);
}

void auction_state_check(int times, int s_times, int last_price, string obj_id)
{
	int i, ob_price, flag1 = 0, flag2 = 0;
	object ob, ob_auction, ob_onwer, new_auction, new_onwer, nul;
	mixed *values, *v;
	string *k, ob_name, ob_id, str;
	
	// 重新定位此物品,避免因为其他物品被清除导致索引号变化
	k = keys(auction);
	i = member_array(obj_id,k); 
	v = values(auction)[i];
	ob_id      = k[i];
	ob         = v[0];
	ob_price   = v[1];
	ob_auction = v[2];
	ob_onwer   = v[3];
	ob_name    = v[7];
	
	if(!objectp(ob_auction) && !stringp(ob_auction))
	{
		flag1++;
		if(objectp(new_auction = find_player(v[5])))
		{
			ob_auction = new_auction;
			flag1 = 0;
		}
	}
	if(!objectp(ob_onwer))
	{
		flag2++;
		if(objectp(new_onwer = find_player(v[6])))
		{
			ob_onwer = new_onwer;
			flag2 = 0;
		}
	}

	if(flag2 && !flag1) 
	{
		str="由于卖方缺席,取消"+ob_name+"的拍卖";
		auction_chat(str);
		auction_cancel(ob_id, ob_auction, nul);
		return;
	}
	if(!objectp(ob) || !objectp(present(ob,ob_onwer)))
	{
		str="由于卖方保管不当,拍卖物品"+ob_name+"丢失,本次拍卖取消!\n";
		auction_chat(str);
		ob_onwer->delete_temp("auctioning");
		auction_cancel(ob_id, ob_auction, nul);
		return;
	}
	if(times < 20)
	{
		times++;
		if(ob_price > last_price)
		{
			s_times = 0;
			call_out("auction_state_check", 20, times, s_times, ob_price, ob_id);
		}
		else
		{
			s_times++;
			if(s_times<4)
			{
				str = "第"+CHINESE_D->chinese_number(s_times)+"次喊价:拍卖"+ob_name+",现价"+MONEY_D->price_str(ob_price)+"!!";
				auction_chat(str);   
				call_out("auction_state_check", 10, times, s_times, ob_price, ob_id);
			}
			else
			{
				if(flag1 && !flag2)
				{
					str="由于买方缺席,取消"+ob_name+"的拍卖!";
					auction_chat(str);
					auction_cancel(ob_id, ob_onwer, nul);
					return;
				}
				if(flag1 && flag2)
				{
					str="由于买卖双方缺席,取消"+ob_name+"的拍卖!";
					auction_chat(str);
					auction_cancel(ob_id, nul, nul);
					return;
				}	
				auction_end(ob_name, ob_price, ob_auction, ob_onwer, ob, ob_id);
			}
		}
	}
	else
	{
		if(flag1 && !flag2)
		{
			str="由于买方缺席,取消"+ob_name+"的拍卖!";
			auction_chat(str);
			auction_cancel(ob_id, ob_onwer, nul);
			return;
		}
		if(flag1 && flag2)
		{
			str="由于买卖双方缺席,取消"+ob_name+"的拍卖!";
			auction_chat(str);
			auction_cancel(ob_id, nul, nul);
			return;
		}
		str = "时间已到,拍卖"+ob_name+"的过程到此为止!\n";
		auction_chat(str);
		auction_end(ob_name, ob_price, ob_auction, ob_onwer, ob, ob_id);
		return;
	}
	return ;
}

void auction_end(string ob_name, int ob_price, mixed ob_auction, object ob_onwer, object ob, string ob_id)
{

	object  *inv, *en_inv, nul;
	string onwer_id, str;

	if(!objectp(ob_onwer))	return;  // 虽然不太可能发生,但还是判断下保险
	onwer_id = ob_onwer->query_temp("auction/"+ob_id);
	
	if(stringp(ob_auction))
	{
		str=onwer_id+ " 以底价 "+MONEY_D->price_str(ob_price)+" 拍卖 "+
		ob_name+",三次喊价后无人投标,本次拍卖无效!\n";		
		auction_cancel(ob_id, ob_onwer, nul);
		ob_onwer->set("auction_fail",ob_onwer->query("mud_age"));
	}
	else
	{
		str=ob_auction->query("name")+"("+ob_auction->query("id")+")"+ " 出价 "+MONEY_D->price_str(ob_price)+" 竞标 "+
		ob_name+"成功,本次拍卖成交!\n";
			
		// 买卖双方金钱物品的交换,买方需另交成交价10%的手续费(卖方之前已经交过底价10%的保证金)
		inv = all_inventory(ob_auction); 
		en_inv = all_inventory(environment(ob_auction)); 
		if(!player_pay(ob_auction, (int)(ob_price*10/9))) 
		{
			str="由于买方无力支付竞价,本次拍卖无效。\n";
			ob_auction->delete_temp("auctioning");
			auction_cancel(ob_id, ob_onwer, nul);
		}
		else
		{
			tell_object(ob_auction,"恭喜!你竞标成功,得到了 "+ob_name+"\n");
				if(!ob->move(ob_auction) || (inv && sizeof(inv) > 49))
				{
					if(en_inv && sizeof(en_inv) < 49)
					{
						tell_object(ob_auction, "你手头已经拿不下了,东西落到了你的脚边..\n");
						ob->move(environment(ob_auction)); 
					}
					else
					{
						tell_object(ob_auction, "此次拍卖所得由于你无力保管而收归国有!\n");
					 	destruct(ob);
					}
				}	
			if(!MONEY_D->pay_player(ob_onwer, ob_price)) 
			{
				tell_object(ob_onwer,ob_name+"拍卖成功,所得款已经转至你的钱庄帐户。\n");
				ob_onwer->add("balance",ob_price);
			}
			auction_cancel(ob_id, ob_auction, ob_onwer);
		}
	}
	auction_chat(str);
	return;
}

void auction_cancel(string ob_id, object discredit_1, object discredit_2)
{
	if(member_array(ob_id, keys(auction)) != -1)
		map_delete(auction, ob_id);

	if(objectp(discredit_1))
		discredit_1->delete("discredit");
	if(objectp(discredit_2))
		discredit_2->delete("discredit");
}

int main(object me,string arg)
{
	int i, coin, guaranty, num, index;
	mixed *ob_value;
	string str, unit, *tuned_ch, *ob_key;
	object ob;
	
	ob_key = keys(auction);
	ob_value = values(auction);
	if(!arg)
	{
		tuned_ch = me->query("channels");
                me->set("channels", ({ auction }) );
                me->set("channels", tuned_ch + ({ auction }) );
		if( !pointerp(tuned_ch) )
			me->set("channels", ({ auction }) );
		else if( member_array(auction, tuned_ch) == -1 )
			me->set("channels", tuned_ch + ({ auction }) );
		tell_object(me,"\n你的拍卖频道(auction)现在处于开通状态\n");
		return 1;
	}	
		
	if(arg == "-l")
	{
	    	if(!sizeof(auction))
		{
			tell_object(me,"目前没有物品被拍卖。\n");
			return 1;
		}
		str=HIG"当前拍卖物品清单:\n\n";
		str += "—————————————————————————————————————\n";
		str += "序号  物品名称                 当前标价             最高竞价者\n";
                str += "—————————————————————————————————————\n"NOR;
		for(i=0; i < sizeof(auction);i++)
		{
			mixed  *v = ob_value[i];

			str += sprintf("%-4s  ",  i+1+".");
			str += sprintf("%-20s  ", v[7]);
			str += sprintf("%-20s  ", MONEY_D->price_str(v[1]));
			str += sprintf("%-15s  \n", (!stringp(v[2]))? v[5] : "");
		}
		str += "\n\n";
        	me->start_more(str);
		return 1;
	}
	if(arg == "-m")
	{
		if(!sizeof(auction))
		{
			tell_object(me,"目前没有物品被拍卖。\n");
			return 1;
		}
		str=HIG"当前拍卖物品详细介绍:\n\n"NOR;
		for(i=0; i < sizeof(auction);i++)
		{
			mixed  *v = ob_value[i];

			str+=HIG+(i+1)+".\n----------"NOR"\n物品名称: "+v[7]+
			"\n物品描述:"+v[8]+
			"\n物主介绍:"+v[4]+
			"\n物主:"+v[6]+"\n\n";
		}
       		me->start_more(str);		
		return 1;
	}
	if(sscanf(arg,"%s for %d %s",str,num,unit) == 3)
	{
		str = lower_case(str);
		if(me->query("age") < 18)
		{
			tell_object(me,"你还没有成年,能对自己的拍卖行为负责吗?\n");
			return 1;
		}			
		if(me->query("combat_exp") < 10000)
		{
			tell_object(me,"你虽已成年,但是涉世经验太少,无法对自己的拍卖行为负责。\n");

⌨️ 快捷键说明

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