paimai.c

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

C
694
字号
			return 1;
		}
		if(!objectp(ob = present(str,me)))
		{
			tell_object(me,"你身上没有 "+HIG+str+NOR+" 这件物品。\n");
			return 1;
		}		
		if(member_array(ob->query("id"),ob_key)!= -1)
		{
			tell_object(me,"你晚了一步,这类物品已经有人拍卖了。\n");
			return 1;
		}
		
        if( ob->query("equipped") )		{
			tell_object(me,"这件物品装备着,不能参加拍卖。\n");
			return 1;
		}


        if( !ob->query("value") ) 		{
			tell_object(me,"这件物品不值什么钱。\n");
			return 1;
		}
        if( ob->query("value")< 100 ) 		{
			tell_object(me,"这件物品不值什么钱。\n");
			return 1;
		}
		
	if (ob->query("food_supply"))		{
			tell_object(me,"剩菜剩饭不能参加拍卖。\n");
			return 1;
		}
	if (ob->query("liquid/remaining"))		{
			tell_object(me,"剩菜剩饭不能参加拍卖。\n");
			return 1;
		}

		if(ob->query("no_drop") || ob->query("no_sell") || ob->query("ownmake") || ob->query("money_id") || ob->is_character() )
		{
			tell_object(me,"这件物品不能参加拍卖。\n");
			return 1;
		}
	if( num > 20000)
		{
			tell_object(me,"价格不能超过20000。\n");
			return 1;
		}
	if( num < 10)
		{
			tell_object(me,"价格不能小于10。\n");
			return 1;
		}
	if( unit!="gold")
		{
			tell_object(me,"单位必须是黄金。\n");
			return 1;
		}

	if( ob->query("no_give")&& ob->query("no_get")&&!wizardp(me))
		{
			tell_object(me,"这件物品不能参加拍卖。\n");
			return 1;
		}
		// 克扣拍卖手续费10%
		guaranty = (int)(ob->query("value")/50);
		if (guaranty < 10) guaranty = 10;
		if(!player_pay(me, guaranty)) 
		{
			tell_object(me,"你全部的身家财产尚不足以交纳拍卖保证金!(如果使用银票,请事先兑换)\n");
			return 1;
		}
		unit = lower_case(unit);
		if(!(num = player_demand(num, unit, me))) return 1;
		
		write("你所要拍卖的物品:"+ob->query("name")+", 底价:"+MONEY_D->price_str(num)+"\n\n");
		write("请输入你对该物品的介绍(控制在50个字符内)\n直接按回车(enter)可以忽略此项。\n");
		input_to("get_ob_desc", me, ob->query("id"), num);
		return 1;
	}
	if(sscanf(arg,"%d add %d %s", index,num,unit) == 3)
	{
		object obj, ob_onwer;
		mixed *v; 
		int ob_price; 
		if(me->query("age") < 18)
		{
			tell_object(me,"你还没有成年,能对自己的拍卖行为负责吗?\n");			
			return 1;
		}
		if(me->query("combat_exp") < 10000)
		{
			tell_object(me,"你虽已成年,但是涉世经验太少,无法对自己的拍卖行为负责。\n");
			return 1;
		}
		if(me->is_busy())
		{
			tell_object(me,"你正忙着呢。\n");
			return 1;
		}
		if(me->query_temp("discredit") && !me->query_temp("auctioning"))
		{
			if(me->query("mud_age") - me->query_temp("discredit") < 3600)	
			{
				tell_object(me,"你由于在上次拍卖过程中信誉值降低,暂时无权参与。\n");
				return 1;
			}
			else me->delete_temp("discredit");			
		}
		if(index < 1 || index > sizeof(auction))
		{
			tell_object(me,"没有这个序号的物品!\n请用 auction -l 指令查询目前竞拍物品清单。\n");
			return 1;
		}
		v = ob_value[index-1];
		obj = v[0];
		ob_price = v[1];
		
		if(objectp(obj) && v[3] == me)
		{
			tell_object(me,"那是你自己的拍卖物品,想暗地托价不成?\n");
			return 1;
		}
		coin = player_bank(me);
		unit = lower_case(unit);
                if(!(num = player_demand(num, unit, me))) return 1;
		if(num < PRICE_DIFFERENCE)
		{
			tell_object(me,"竞拍规则:差价以1两白银为底线。\n");
			return 1;
		}
		if(num + ob_price > coin)
		{
			tell_object(me,"你没有这么多钱可以偿付这个出价。\n");
			return 1;
		}

		me->set_temp("discredit",me->query("mud_age"));
		me->set_temp("auctioning",1);
		me->start_busy(10);
		v[1] = num + ob_price;
		v[2] = me;
		v[5] = me->query("id");
		str = me->query("name")+"("+me->query("id")+")投标"+v[7]+",竞价:"+MONEY_D->price_str(v[1])+"!\n";
		auction_chat(str);
		return 1;
	}
	else return help();
}

void get_ob_desc(string desc, object me, string str, int num)
{
	write("\n");
	if (strlen(desc) > 60)
	{
		write("您对物品的介绍太长了,请注意言简意赅。\n");
	        input_to("get_ob_desc", me, str, num);
                return ;
	}
	write("作为物主,您是否愿意在拍卖过程中透露自己姓名?(y/n)\n");
	input_to("choise_secret", me, str, desc, num);	
        return;
}

void choise_secret(string yn, object me, string ob_id, string desc, int num)
{
	mixed *values;
	int guaranty, i;
	string ob_name, onwer_id, str;
	object ob;

	if (yn[0] != 'y' && yn[0] != 'Y')
		me->set_temp("auction/"+ob_id, "某人");
        else 
        	me->set_temp("auction/"+ob_id, me->query("name")+"("+me->query("id")+")");
	if(!objectp(ob = present(ob_id, me)))
	{
		tell_object(me,"你身上已经没有这件东西了,不能参加拍卖。\n");
		return;
	}        	
	if(sizeof(auction) && member_array(ob_id,keys(auction))!= -1)
	{
		tell_object(me,"你晚了一步,这类物品已经被人抢先拍卖了。\n");
		return;
	}
	onwer_id = me->query_temp("auction/"+ob_id);
	ob_name = ob->query("name")+"("+ob_id+")";

	// 以下设置信任属性,判断违反拍卖规则的玩家
	me->set_temp("discredit",me->query("mud_age"));
	me->set_temp("auctioning",1);
	me->start_busy(10);
	
        values = ({ob, num, "", me , desc, "", onwer_id, ob_name, ob->long()});
	auction[ob_id] = values;
	
	str = onwer_id+"现在开始拍卖"+ob_name+","+"底价:"+MONEY_D->price_str(num)+"。\n";
	auction_chat(str);
	call_out("auction_state_check", 20, 0, 0, num,ob_id);
	return;
}

int player_demand(int num, string unit, object me)
{
	switch(unit)
	{
		case "coin":break;
		case "silver":num*=100;break;
		case "gold":num*=10000;break;
		case "cash":
		case "thousand-cash":
		        tell_object(me,"拍卖交易中不得使用银票,请先在钱庄兑换成硬通货。\n");
			return 0;
		default:
			tell_object(me,"非法的货币单位!\nvalid unit: coin, silver, gold\n");
			return 0;
	}
	if (num < 1000)
	{
		tell_object(me,"对不起,本行不支持无底价拍卖,10两银子是出价底线。\n");
		return 0;
	}
	return num;
}

int player_bank(object ob)
{
	object g_ob;
	object c_ob;
	object s_ob;
	int total;

	total = ob->query("balance");

	g_ob = present("gold_money", ob);
	c_ob = present("coin_money", ob);
	s_ob = present("silver_money", ob);

	if (g_ob) total += g_ob->query_amount() * 10000;
	if (s_ob) total += s_ob->query_amount() * 100;
	if (c_ob)   total += c_ob->query_amount();
	return total;
}

int player_pay(object who, int amount)
{
	object g_ob, s_ob, c_ob;
	int gc, sc, cc, left, total, more;

	seteuid(getuid());

	if (g_ob = present("gold_money", who))
		gc = g_ob->query_amount();
	else
		gc = 0;
	if (s_ob = present("silver_money", who))
		sc = s_ob->query_amount();
	else
		sc = 0;
	if (c_ob = present("coin_money", who))
		cc = c_ob->query_amount();
	else
		cc = 0;
	total = cc + sc * 100 + gc * 10000;
	
	if ( total < amount )
	{
		if((amount-total) > who->query("balance"))
			return 0;
		if(objectp(c_ob)) destruct(c_ob);
		if(objectp(s_ob)) destruct(s_ob);
		if(objectp(g_ob)) destruct(g_ob);		
		who->add("balance",-(amount-total)); 
			tell_object(who,"你身上的零钱不够,所需费用已直接从钱庄帐户上扣除。\n\n");
		return 1;
	}
	else 
	{
		left = total - amount;
		gc = left / 10000;
		left = left % 10000;
		sc = left / 100;
		cc = left % 100;

		if (g_ob)
			g_ob->set_amount(gc);
		else sc += (gc * 100);
		if (s_ob)
		 	s_ob->set_amount(sc);
		else if (sc) {
			s_ob = new(SILVER_OB);
			s_ob->set_amount(sc);
			s_ob->move(who);
		}
		if (c_ob)
			c_ob->set_amount(cc);
		else if (cc) {
			c_ob = new(COIN_OB);
			c_ob->set_amount(cc);
			c_ob->move(who);
		}
		return 1;
	}
}

int help()
{	
    write(@HELP命令格式:
    
    开启拍卖频道:auction
    关闭拍卖频道:tune auction
    查看目前处于竞拍状态的物品清单:paimai -l
    查看目前处于竞拍状态的物品介绍:paimai -m
    拍卖物品:paimai <物品ID> for <底价值> <货币单位>
    竞拍物品:paimai <物品序列号> add <加价值> <货币单位> 
    
    说明文档:
    1. 拍卖过程中银票无效,请先去钱庄兑换成硬通货,如黄金、白银、铜钱。
    
    2. 当有人拍卖物品时,拍卖进程正式开始,此时玩家可以以至少1两白银(或100文铜钱)
       的最低差价值参加竞拍,如果一段时间内无人投标,将进行喊价,如果三次喊价后仍然
       无人出价,则拍卖终止。如果一直有人投标,到了规定时间,此次拍卖活动仍会被终止。
       
    3. 拍卖活动终止后,最后出价者为胜,货款从买者手边及钱庄提取,物品直接转移到买者
       身上,如果不堪负重则放在买者所在房间之中,如果房间也无法装下,物品作没收处理,
       切记!物主所得款额直接转至其钱庄帐户。整个拍卖活动加收0%的手续费。倘若拍卖
       过程中始终无人投标,拍卖过程宣布失败,手续费恕不退还物主。
       
    4. 拍卖过程中,如果因为买卖双方的离开游戏或者物品离开了物主本人,导致拍卖进程中
       断,当作违反拍卖规则处理,责任方信誉度会降低,惩罚是一小时内不得参加任何与拍
       卖有关的活动。倘若拍卖物品三次喊价之后因为无人竞标而取消,卖家信誉度也会降低,
       五分钟内不得再拍卖其他物品。
       2001.8.       
    		
HELP
    );
    return 1;
}

 

  

⌨️ 快捷键说明

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