auction.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 + -
显示快捷键?