kantai.h
来自「C实现的MUD,对大家基本入门网络游戏很有帮助!」· C头文件 代码 · 共 1,072 行 · 第 1/2 页
H
1,072 行
remove_call_out("auto_check");
call_out("auto_check",10);
return 1;
}
if( me->query("bwdh/"+host+"/time") >= 3)
return notify_fail("你们已经交手三次了!\n");
name = me->query("name")+"("+me->query("id")+")";
set("challenger",me->query("id") );
challenger = me->query("id");
delete_temp("no_challenger");
remove_call_out("start");
call_out("start",60,host,challenger);
message_vision("主持人说: 好,$N准许参加比赛!\n", me);
me->set("bwdh/fighting",1);
set( "bet",1); // now can bet
delete("bet_amount"); // clear last record
let(me->query("id") + " play " + me->query("id"));
remove_call_out("auto_check");
call_out("auto_check",1);
return 1;
}
int start(string host,string challenger)
{
object ob1,ob2;
ob1=find_player(host);
ob2=find_player(challenger);
if( ob1 && ob2 && ob1->query("bwdh/fighting") && ob2->query("bwdh/fighting") )
{
message_vision(HIR"一声锣响,$N和$n比赛开始。\n"NOR,ob1,ob2);
ob1->kill_ob(ob2);
ob2->kill_ob(ob1);
ob1->set("bwdh/fighting",1);
ob2->set("bwdh/fighting",1);
set("fighting",1);
delete( "bet" ); // fight start, no bet
}
remove_call_out("auto_check");
call_out("auto_check",20);
}
int update_room (string file, string winner)
{
int i, amount, total, win_m,me_m;
object obj, *inv, money, me = this_player(), here = find_object(KANTAI);
string err;
tell_room( LEITAI, HIY"主持人高声说,开奖开奖啦,买得越多赚得越多!\n"NOR, this_object());
inv = all_inventory( here );
i = sizeof(inv);
while(i--)
{
if( userp(inv[i]) )
{
total = query("bet_amount/sum") ;
total = total ;
tell_object( inv[i], HIY"总共有"+chinese_number(total)+"两银子压上了\n"NOR);
win_m = query( "bet_amount/" + winner ) ;
tell_object( inv[i], HIY"总共有"+chinese_number(win_m)+"两银子压对了\n"NOR);
me_m = inv[i]->query( "bet/"+winner );
if(me_m>0)
tell_object( inv[i], HIY"你总共有"+chinese_number(me_m)+"两银子压对了\n"NOR);
if( inv[i]->query( "bet/"+winner ) )
{
amount = me_m * total / win_m;
if( amount > 100 )
{
seteuid(geteuid());
money = new ("/clone/money/gold");
money->set_amount(amount/100);
//tell_object( inv[i], HIY"你赚回了"+chinese_number(amount/100)+"两金子\n"NOR);
message_vision(HIG"$N赚回了"+chinese_number(amount/100)+"两金子\n"NOR,inv[i]);
}
else if( amount > 1 )
{
seteuid(geteuid());
money = new ("/clone/money/silver");
money->set_amount(amount);
//tell_object( inv[i], "你赚回了"+chinese_number(amount)+"两银子\n");
message_vision(HIG"$N赚回了"+chinese_number(amount)+"两银子\n"NOR,inv[i]);
}
if(money)
money->move(inv[i]);
inv[i]->delete("bet");
}
else if( inv[i]->query( "bet" ) )
{
tell_object( inv[i], "你暗自怪自己:真倒霉!怎么就没压在该赢的一边?\n");
}
inv[i]->delete("bet");
}
}
tell_room( LEITAI, HIW"两名小厮跑上来,快手快脚把擂台扫得干干净净。\n"NOR, this_object());
if (obj = find_object(file)) {
if( file_name(obj)==VOID_OB )
return notify_fail("你不能在 VOID_OB 里重新编译 VOID_OB。\n");
inv = all_inventory(obj);
i = sizeof(inv);
while(i--)
if( userp(inv[i]) ) inv[i]->move(VOID_OB, 1);
else inv[i] = 0;
destruct(obj);
}
if (obj) return notify_fail("无法清除旧程式码。\n");
err = catch( call_other(file, "???") );
if (err)
printf( "发生错误:\n%s\n", err );
else {
if( (i=sizeof(inv)) && (obj = find_object(file))) {
while(i--)
if( inv[i] && userp(inv[i]) ) inv[i]->move(obj, 1);
}
}
}
void move_me(object ob, string target)
{
if( !ob || !objectp(ob) )return;
ob->set("bwdh/fighting",1);
ob->move(target);
}
int auto_check()
{
object ob1,ob2;
object me,ob;
mapping boy;
int i, *times;
string old_host,old_challenger,host,girl,challenger,name;
if( !query("start") )
return 0;
if( !( host=query("host")) )
{
tell_room( this_object(), "主持人高声说,"+query("age")+"岁以下比武大会正在进行,赶紧报名(baoming)呀!\n", this_object());
delete("fighting");
delete("challenger");
delete_temp("no_challenger");
remove_call_out("auto_check");
call_out("auto_check",20);
return 0;
}
old_host = query("host");
old_challenger = query("challenger");
ob1=find_player(host);
if(ob1 && living(ob1) && ob1->query("qi") > 0 && ob1->query("bwdh/fighting") )
message_vision("主持人高声说,$N是现在的擂主.\n", ob1);
else
{
message_vision(HIR"$N守擂失败,被抬下擂台.\n"NOR, ob1);
ob1->restore();
ob1->set("bwdh/defeated",1+ob1->query("bwdh/defeated"));
ob1->delete("bwdh/fighting");
ob1->set("bwdh/"+old_challenger+"/time",ob1->query("bwdh/"+old_challenger+"/time")+1 );
ob1->set("bwdh/"+old_challenger+"/lose",ob1->query("bwdh/"+old_challenger+"/lose")+1 );
sort_rank(ob1,-1);
delete("fighting");
full_all(ob1);
ob1->save();
//ob1->move(KANTAI); // move out will restore data
call_out("move_me",1,ob1,KANTAI);
delete("host");
delete_temp("no_challenger");
call_out("update_room",1,LEITAI,query("challenger") );
//update_room( LEITAI,query("challenger") );
}
if( ( challenger=query("challenger") ) )
{
ob2=find_player(challenger);
if( ob2)
{
if( !( host=query("host")) )
if( living(ob2) && !ob2->is_ghost() && ob2->query("qi") > 0 )
{
ob2->restore();
ob2->set("bwdh/win",1+ob2->query("bwdh/win") );
ob2->set("bwdh/"+old_host+"/time",ob2->query("bwdh/"+old_host+"/time")+1 );
ob2->set("bwdh/"+old_host+"/win",ob2->query("bwdh/"+old_host+"/win")+1 );
ob2->set("bwdh/once",1);
ob2->set("bwdh/fighting",1);
set("host",challenger);
delete("challenger");
delete_temp("no_challenger");
host = challenger;
sort_rank(ob2,1);
message_vision(HIG"主持人高声说,$N艺高一筹,将$n打下擂台,是现在的擂主. 哪位好汉或者女英雄有种就上呀!\n"NOR, ob2,ob1);
//update_player(ob2);
full_all(ob2);
call_out("update_player",1,ob2);
ob2 = find_player(host);
if(ob2)
{
tell_object(ob2,"请重新拿兵器。\n");
}
set("fighting",0); // challenger win, host exchange, so no fighting
remove_call_out("auto_check");
call_out("auto_check",1);
return 1;
}
if( !( living(ob2) ) || ob2->query("qi")<=0 )
{
message_vision(HIR"$N挑战$n失败,被抬下擂台.\n\n"NOR, ob2,ob1);
ob2->restore();
ob2->set("bwdh/defeated",1+ob2->query("bwdh/defeated"));
ob2->set("bwdh/"+old_host+"/time",ob2->query("bwdh/"+old_host+"/time")+1 );
ob2->set("bwdh/"+old_host+"/lose",ob2->query("bwdh/"+old_host+"/lose")+1 );
ob2->delete("bwdh/fighting");
sort_rank(ob2,-1);
full_all(ob2);
ob2->save();
//ob2->move(KANTAI);
call_out("move_me",2,ob2,KANTAI);
delete("challenger");
delete_temp("no_challenger");
//update_room(LEITAI, query("host") );
call_out("update_room",1,LEITAI, query("host") );
set("fighting",0);
if( ( host=query("host") ) && userp(ob1) && living(ob1) && !ob1->is_ghost() ) //host win twice, out to rest
{
ob1->restore();
ob1->set("bwdh/win",1+ob1->query("bwdh/win") );
ob1->set("bwdh/"+old_challenger+"/time",ob1->query("bwdh/"+old_challenger+"/time")+1 );
ob1->set("bwdh/"+old_challenger+"/win",ob1->query("bwdh/"+old_challenger+"/win")+1 );
ob1->set("bwdh/fighting",1);
sort_rank(ob1,1);
message_vision("主持人高声说: $N打败$n,守擂成功!\n", ob1,ob2);
if( ob1->query("bwdh/once") )
{
message_vision("主持人高声说: $N真是神勇,竟然连胜两场。请下场休息一会!\n", ob1);
delete("host");
delete_temp("no_challenger");
message_vision(HIM"$N神彩飞扬地跳下擂台休息去了.\n"NOR, ob1);
ob1->delete("bwdh/once");
set("fighting",0);
full_all(ob1);
ob1->save();
//ob1->move(KANTAI);
call_out("move_me",2,ob1,KANTAI);
}
else
{
ob1->set("bwdh/once",1);
//update_player(ob1);
full_all(ob1);
call_out("update_player",1,ob1);
ob1 = find_player(host);
if(ob1)
{
tell_object(ob1,"请重新拿兵器。\n");
}
}
}
remove_call_out("auto_check"); // challenger defeated
call_out("auto_check",1);
return 1;
}
// now both host and challenger on LEITAI, fighting ?
if( !query("fighting") && query("bet") )
{
message_vision(HIY"主持人高声说:$N和$n比武就要开始了,赶紧下注呀!下注呀!下注(bet id #gold)越多,赢的越多。\n"NOR, ob1,ob2);
message_vision(HIY"主持人高声说:$N和$n的赌注比现在是: "+(query("bet_amount/" + host ))+":"+(query("bet_amount/" + challenger ))+"。\n"NOR, ob1,ob2);
}
remove_call_out("auto_check");
call_out("auto_check",20);
return 0;
}
else
{
// if this challenger not online, count as defeated, this should not happen indeed
ob2 = new(USER_OB);
ob2->set("id", challenger);
if( !ob2->restore() )
{
destruct(ob2);
// no this ppl, suicided ?
return 0;
}
delete("challenger");
ob2->restore();
ob2->set("bwdh/defeated",1+ob2->query("bwdh/defeated") );
ob2->delete("bwdh/fighting");
sort_rank(ob2,-1);
set("fighting",0);
message_vision("主持人高声说: $N居然临战脱逃,按打败计。\n", ob2);
update_room(LEITAI,query("host"));
ob2->save();
destruct(ob2);
// count host win once
if( ( host=query("host") ) && userp(ob1) && living(ob1) && !ob1->is_ghost() ) //host win twice, out to rest
{
ob1->restore();
ob1->set("bwdh/win",1+ob1->query("bwdh/win") );
ob1->set("bwdh/fighting",1);
sort_rank(ob1,1);
if( ob1->query("bwdh/once") )
{
message_vision("主持人高声说: $N真是神勇,竟然连胜两场。请下场休息一会!\n", ob1);
delete("host");
message_vision("$N神彩飞扬地跳下擂台休息去了.\n", ob1);
ob1->delete("bwdh/once");
full_all(ob1);
ob1->save();
ob1->move(KANTAI);
}
else
{
ob1->set("bwdh/once",1);
update_player(ob1);
full_all(ob1);
}
}
set("fighting",0); // no fighting
remove_call_out("auto_check");
call_out("auto_check",1);
return 0;
}
}
else // no challenger, no fight
{
set("fighting",0);
}
if( query("fighting") )
{
remove_call_out("auto_check");
call_out("auto_check",10);
return 0;
}
if( !( host=query("host") ) )
{
remove_call_out("auto_check");
call_out("auto_check",30);
return 1;
}
// nobody come challenge
set_temp("no_challenger",query_temp("no_challenger")+1);
if( query_temp("no_challenger") >= 3 && ( host=query("host") ) && userp(ob1) && living(ob1) && !ob1->is_ghost() )
{
delete_temp("no_challenger");
delete("host");
message_vision(HIM"\n主持人高声说: $N真是威镇八方,居然无人敢上场挑战。这场算赢了.\n"NOR, ob1);
message_vision(HIM"$N神彩飞扬地跳下擂台休息去了.\n"NOR, ob1);
// count host win once
ob1->restore();
ob1->set("bwdh/win",1+ob1->query("bwdh/win") );
//ob1->set("bwdh/"+challenger,ob1->query("bwdh/"+challenger)+1 );
//ob1->set("bwdh/"+challenger+"/win",ob1->query("bwdh/"+challenger+"/win")+1 );
ob1->delete("bwdh/fighting");
sort_rank(ob1,1);
ob1->save();
//ob1->move(KANTAI);
call_out("move_me",1,ob1,KANTAI);
remove_call_out("auto_check");
call_out("auto_check",30);
return 1;
}
if( query_temp("no_challenger") >= 2 )
{
message_vision(HIY"主持人高声说,如果再过一会儿还没有人敢上来挑战的话,就算$N赢了.\n"NOR, ob1);
remove_call_out("auto_check");
call_out("auto_check",60);
return 1;
}
message_vision(HIW"主持人高声说,$N艺盖群雄,是现在的擂主,哪位豪杰上来挑战呀?\n", ob1);
remove_call_out("auto_check");
call_out("auto_check",30);
return 1;
}
int let(string arg)
{
object ob;
string pl1, pl2;
object room = this_object();
object *inv;
object *old_basket, *basket;
object cangku;
int i;
if(!arg) return 0;
if(sscanf(arg, "%s play %s", pl1, pl2) != 2) {
pl1 = arg;
pl2 = arg;
}
ob = find_player(pl1);
if(!ob)return 0;
ob->set("bwdh/fighting",1);
ob->save();
inv = all_inventory(ob);
basket = allocate(sizeof(inv));
cangku = find_object(CANGKU);
if (! objectp(cangku)) {
cangku = load_object(CANGKU);
if (!objectp(cangku)) {
message_vision("$N请告诉 wiz: cangku not found\n", ob);
return 0;
}
}
for (i=0; i<sizeof(inv); i++) {
//if ( !inv[i]->query_autoload() && inv[i]->query("id")!="bu dai" )
if ( inv[i]->query("id")!="yu di" )
{ // leave yudi etc.
basket[i] = inv[i];
inv[i]->move(cangku);
message_vision("$N将一"+
inv[i]->query("unit")+
inv[i]->query("name")+"交给主持人。\n", ob);
}else{
basket[i] = 0;
}
}
old_basket=cangku->query("basket/"+ob->query("id"));
if (arrayp(old_basket)) basket = basket + old_basket;
cangku->set("basket/"+ ob->query("id"), basket);
message_vision("$N进入擂台。\n", ob);
ob->move(LEITAI);
full_all(ob);
message_vision("$N进入擂台。\n", ob);
tell_object(ob, "主持人告诉你" + RANK_D->query_respect(ob)+
",请从武器架上取武器(look jia; get armor from jia and get weapon from jia).\n");
delete_temp("no_challenger");
ob->set("bwdh/fighting",1);
update_player(ob);
return 1;
}
int update_player(object me)
{
object env, link_ob, obj;
env = environment(me);
// Save the data and exec the player to his/her link object.
me->save();
// First, create the new body.
link_ob = me->query_temp("link_ob");
obj = LOGIN_D->make_body(link_ob);
if (!obj) return 0;
exec(link_ob, me);
destruct(me);
// Restore new body and exec to it via enter_world in LOGIN_D
obj->restore();
LOGIN_D->enter_world(link_ob, obj, 1);
obj->move(env);
return 1;
}
void full_all(object me)
{
if( !living(me) )
{
message_vision(HIW"主持人闪电般的伸出中指在$N的人中穴上一点一按,原来这招就是江湖上失传已久的一指神针,传说可以起死回生。\n", me);
me->revive(0);
}
message_vision(HIG"主持人身形闪动,突然一掌按在$N的头顶百会穴上,将内力源源不断的灌输进去,片刻之间,\n"+
"$P就觉得全身百窍无不舒畅,内力极其充沛,这招就是江湖传说中的神掌传功,据说失传已久。\n\n", me);
me->set("eff_jing", (int)me->query("max_jing"));
me->set("jing", (int)me->query("max_jing"));
me->set("eff_qi", (int)me->query("max_qi"));
me->set("qi", (int)me->query("max_qi"));
me->set("jingli", (int)me->query("max_jingli"));
me->set("neili", (int)me->query("max_neili"));
me->set("food", (int)me->max_food_capacity());
me->set("water", (int)me->max_water_capacity());
me->remove_all_killer();
me->clear_condition();
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?