duchang1.c
来自「C实现的MUD,对大家基本入门网络游戏很有帮助!」· C语言 代码 · 共 280 行
C
280 行
/* <SecCrypt CPL V3R05> */
// Room: /d/changan/duchang1
// by snowcat 7/5/1997
inherit ROOM;
int room_status = 0;
int *res = allocate(5);
int random2 (int i)
{
return (random(i)+uptime()) % i;
}
mapping qians = ([
"dqq" : "大乾签",
"dkq" : "大坤签",
"xqq" : "小乾签",
"xkq" : "小坤签",
"qq" : "乾签",
"kq" : "坤签",
]);
void create()
{
set ("short", "押签房");
set ("long", @LONG
一群人围着紫檀木大桌而坐,首席座着一位精瘦的签客,正在
一本正经地从镶金黑盒里慢悠悠一根一根往外抽出乾坤签,码在桌
面上。
墙上有一匾写着:
大乾签(全部五根皆为乾签):一赢三十二
大坤签(全部五根皆为坤签):一赢三十二
小乾签(连续四根皆为乾签):一赢十六
小坤签(连续四根皆为坤签):一赢十六
乾签(任意三根皆为乾签):一赢二
坤签(任意三根皆为坤签):一赢二
匾角有一个牌子(paizi)。
LONG);
set("item_desc",([
"paizi" : "押大乾签: qian dqq <amount> <money>\n"+
"押大坤签: qian dkq <amount> <money>\n"+
"押小乾签: qian xqq <amount> <money>\n"+
"押小坤签: qian xkq <amount> <money>\n"+
"押乾签: qian qq <amount> <money>\n"+
"押坤签: qian kq <amount> <money>\n\n"+
"为免破产跳楼 限押一两黄金\n",
]));
set("exits", ([ /* sizeof() == 1 */
"east" : __DIR__"clubup",
]));
set("objects", ([ /* sizeof() == 1 */
__DIR__"npc/qianke" : 1,
]));
set("light_up", 1);
set("no_fight", 1);
set("no_beg", 1);
setup();
}
void init ()
{
add_action ("do_qian","qian");
if (room_status > 0)
return;
remove_call_out ("gamble_prepare");
remove_call_out ("gamble_start");
remove_call_out ("gamble_perform");
remove_call_out ("gamble_finish");
call_out ("gamble_prepare",2);
room_status = 1;
}
int do_qian (string arg)
{
object me = this_player();
string what;
int amount;
string money;
object ob;
if (!arg ||
sscanf(arg,"%s %d %s",what,amount,money) != 3)
return notify_fail("请使用: qian <押签种类> <数目> <货币>\n");
if (what != "dqq" &&
what != "dkq" &&
what != "xqq" &&
what != "xkq" &&
what != "qq" &&
what != "kq")
return notify_fail("你要押什么签?\n");
ob = present (money+"_money", me);
if (! ob)
return notify_fail("你身上没有这种货币。\n");
if (amount < 1)
return notify_fail("请多押一些钱。\n");
if (amount > ob->query_amount())
return notify_fail("你身上的钱不够押。\n");
if (amount * (ob->query("base_value")) > 10000 )
return notify_fail("你想豪赌啊,拜托!官兵就上来了。\n");
if (me->query_temp ("gamble_qian/amount") > 0)
return notify_fail("你已经押过了。\n");
if (room_status > 1)
return notify_fail("现在正在赌呢,稍等片刻。\n");
me->set_temp("gamble_qian/kind",what);
me->set_temp("gamble_qian/amount",amount);
me->set_temp("gamble_qian/money",money);
message_vision (sprintf("$N拿出%s%s%s,押在%s上。\n",
chinese_number(amount),
ob->query("base_unit"),
ob->query("name"),
qians[what]),
me);
if (amount == ob->query_amount())
destruct (ob);
else
ob->add_amount(-amount);
return 1;
}
int valid_leave(object me, string dir)
{
if (dir == "east")
{
if (me->query_temp ("gamble_qian/amount") > 0)
message_vision ("$N扔下押签的钱。\n",me);
me->delete_temp("gamble_qian");
}
return ::valid_leave(me,dir);
}
void gamble_prepare ()
{
object room = this_object();
object *inv;
int i;
tell_room (room,"签客将一大束签在桌上哗啦啦地迅速洗了一遍。\n");
tell_room (room,"洗签之后,签客啪地一声将签装入镶金黑盒,叫道:开押!\n");
inv=all_inventory();
i=sizeof(inv);
while(i--) {
if(userp(inv[i])) {
room_status = 1;
call_out ("gamble_start",25);
return;
}
}
room_status=0;
return;
}
void gamble_start ()
{
object room = this_object();
tell_room (room,"签客喊声:停押!\n");
tell_room (room,"然后闭上眼睛,将镶金黑盒打开从里开始往外抽签。\n");
room_status = 2;
call_out ("gamble_perform",3,0);
call_out ("gamble_perform",6,1);
call_out ("gamble_perform",9,2);
call_out ("gamble_perform",12,3);
call_out ("gamble_perform",15,4);
call_out ("gamble_finish",18);
}
void gamble_perform (int i)
{
object room = this_object();
switch (random2(2))
{
case 0:
{
tell_room (room,"\n□□ 坤 签 □□\n");
res[i] = 0;
break;
}
case 1:
{
tell_room (room,"\n□□ 乾 签 □□\n");
res[i] = 1;
break;
}
}
}
void player_wins (object who, int total)
{
object money = new ("/clone/money/"+who->query_temp("gamble_qian/money"));
int amount = who->query_temp("gamble_qian/amount");
total = total * amount;
money->set_amount(total);
message_vision (sprintf("$N赢了%s%s%s!\n",
chinese_number(total),
money->query("base_unit"),
money->query("name")),
who);
money->move(who);
}
void player_loses (object who, int total)
{
object money = new ("/clone/money/"+who->query_temp("gamble_qian/money"));
total = who->query_temp("gamble_qian/amount");
message_vision (sprintf("签客将$N押在盘中的%s%s%s收走。\n",
chinese_number(total),
money->query("base_unit"),
money->query("name")),
who);
destruct (money);
}
void gamble_finish ()
{
string win;
int total, i;
object room = this_object();
object *list = all_inventory(room);
if (res[0]==1 && res[1]==1 && res[2]==1 && res[3]==1 && res[4]==1)
{
total = 32;
win = "dqq";
}
else if (res[0]==0 && res[1]==0 && res[2]==0 && res[3]==0 && res[4]==0)
{
total = 32;
win = "dkq";
}
else if ((res[0]==1 && res[1]==1 && res[2]==1 && res[3]==1) ||
(res[1]==1 && res[2]==1 && res[3]==1 && res[4]==1))
{
total = 16;
win = "xqq";
}
else if ((res[0]==0 && res[1]==0 && res[2]==0 && res[3]==0) ||
(res[1]==0 && res[2]==0 && res[3]==0 && res[4]==0))
{
total = 16;
win = "xkq";
}
else
{
int r = 0;
total = 2;
for (i = 0; i < 5; i++)
r += res[i];
if (r >= 3)
win = "qq";
else
win = "kq";
}
tell_room (room,"\n签客睁开眼睛,迅速看一眼桌面,叫道:"+qians[win]+"!\n");
i = sizeof(list);
while (i--)
{
if (!userp(list[i]))
continue;
if (list[i]->query_temp("gamble_qian/kind") == win)
player_wins(list[i],total);
else if (list[i]->query_temp("gamble_qian/kind"))
player_loses(list[i],total);
list[i]->delete_temp("gamble_qian");
}
tell_room (room,"\n");
call_out ("gamble_prepare",5);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?