mj.c
来自「C实现的MUD,对大家基本入门网络游戏很有帮助!」· C语言 代码 · 共 1,668 行 · 第 1/5 页
C
1,668 行
}
tell_object(me,"换谁摸牌:"+NowPlayerId[NowPlayer]+"\n");
if (me->query("id")!=NowPlayerId[NowPlayer]){
command("hammer "+me->query("id"));
command("say 还没轮到你。");
return 1;
}
if (!LastDump || LastDump==""){
command("hammer "+me->query("id"));
command("say 摸牌吧。");
return 1;
}
if (Touched){
command("flop "+me->query("id"));
command("say 打牌啦!!");
return 1;
}
if (do_check_eat(num1,num2,LastDump)==0){
command("flop "+me->name());
command("say 你眼精花了ㄚ!!这样也能吃。");
return 1;
}
if (num1==num2){
command("flop "+me->name());
command("say 相同的牌不能吃。");
return 1;
}
if (me->query("id")==P1Data["Id"]) who=P1Data;
else if (me->query("id")==P2Data["Id"]) who=P2Data;
else if (me->query("id")==P3Data["Id"]) who=P3Data;
else if (me->query("id")==P4Data["Id"]) who=P4Data;
LastDumpMan=do_check_Mj(MjE,num1);
if (LastDumpMan==0) return notify_fail("没有["+num1+"]这种代码。\n");
LastDumpMan=do_check_Mj(MjE,num2);
if (LastDumpMan==0) return notify_fail("没有["+num2+"]这种代码。\n");
LastDumpMan=do_check_Mj(who["Mj"],num1);
if (LastDumpMan==0) return notify_fail("你没"+do_check_num(num1,0)+"这张牌。\n");
LastDumpMan=do_check_Mj(who["Mj"],num2);
if (LastDumpMan==0) return notify_fail("你没"+do_check_num(num2,0)+"这张牌。\n");
message_vision("\n$N拿出了一张"+HIG+do_check_num(num1,0)+NOR+
"与一张"+HIY+do_check_num(num2,0)+NOR+
"吃下了"+HIR+do_check_num(LastDump,0)+NOR+"。\n\n",me);
who["Out"]+=num2;
who["Out"]+=LastDump;
who["Out"]+=num1;
who["Mj"]=do_delete_Mj(who["Mj"],num1,1);
who["Mj"]=do_delete_Mj(who["Mj"],num2,1);
Touched=1;
NO_HU=1;
NO_GON=1;
i=0;
if (who["Show"]=="代码") i=3;
if (who["Show"]=="color") i=5;
tell_object(me,show_mj(who["Mj"],i));
return delete_last_dump(who["Id"]);
}
int do_gon(string str,object me)
{
int i;
mapping who;
if (!me) me=this_player();
if (check_id(me->query("id"),"player")!="");
else {
command("stare "+me->query("id"));
command("say 这牌局跟你没关系。");
return 1;
}
if (!Playing){
command("say 牌局还没开始!!");
return 1;
}
if (LastDumpId==me->query("id")){
command("stare "+me->query("id"));
command("say 那张牌是你自己打的!。");
return 1;
}
if (Touched && NowPlayerId[NowPlayer]!=me->query("id")){
command("hammer "+me->query("id"));
command("say 别人没打牌你怎麽 。");
return 1;
}
if (!str) str=LastDump;
if (me->query("id")==P1Data["Id"]) who=P1Data;
else if (me->query("id")==P2Data["Id"]) who=P2Data;
else if (me->query("id")==P3Data["Id"]) who=P3Data;
else if (me->query("id")==P4Data["Id"]) who=P4Data;
if (who["Auto"]=="auto") return 1;
i=do_check_Mj(who["Mj"],str);
if (i==1){
if (!Touched) return notify_fail("你还没摸牌。\n");
i=do_check_Mj(who["OutPon"],str);
if (!i) return notify_fail("你只有一张不能 。\n");
if (NO_GON) return notify_fail("这样无法杠牌。\n");
message_vision("\n$N说道:"+HIB+"木工"+NOR+"~~~\n\n",me);
who["Mj"]=do_delete_Mj(who["Mj"],str,1);
sort_data(who["OutPon"]+=str);
str=List[end..end+1];
end-=2;
Goned++;
message_vision("\n$N从後面补了一张牌。\n\n",me);
printf("你补到一张%s\n",do_check_num(str,0));
i=0;
if (who["Show"]=="代码") i=3;
if (who["Show"]=="color") i=5;
who["Mj"]+=str;
check_flower(who);
tell_object(me,show_mj(who["Mj"],i));
Touched=1;
return 1;
}
if (i < 3) return notify_fail("你手中要有叁张"+do_check_num(str,0)+"才能杠。\n");
if (!Touched){
if (str!=LastDump) return notify_fail("这样无法杠。\n");
}
else if (i < 4) return notify_fail("你手中要有四张"+do_check_num(str,0)+"才能暗杠。\n");
for (i=0;i<Play;i++) {
if (NowPlayerId[NowPlayer]==me->query("id")) break;
NowPlayer++;
NowPlayer%=Play;
}
who["Mj"]=do_delete_Mj(who["Mj"],str,3);
if (Touched && NowPlayerId[NowPlayer]==me->query("id")){
NO_HU=0;
message_vision("\n$N脸上露出邪恶的笑容说道:暗杠嘿嘿.....\n\n",me);
who["Mj"]=do_delete_Mj(who["Mj"],str,1);
for (i=0;i<4;i++) who["Out"]+="xx";
for (i=0;i<4;i++) who["OutGon"]+=str;
}else{
NO_HU=1;
message_vision("\n$N大叫:"+do_check_num(str,0)+"~"+HIW+"木工~~~"+NOR+"\n\n",me);
for (i=0;i<4;i++) who["Out"]+=str;
}
str=List[end..end+1];
end-=2;
Goned++;
message_vision("$N从後面补了一张牌。\n",me);
tell_object(me,"你补到一张"+do_check_num(str,0)+"\n");
who["Mj"]+=str;
check_flower(who);
i=0;
if (who["Show"]=="代码") i=3;
if (who["Show"]=="color") i=5;
tell_object(me,show_mj(who["Mj"],i));
if (Touched) return 1;
Touched=1;
return delete_last_dump(who["Id"]);
}
varargs int do_win(string str,object me)
{
int i,j;
int *winner=({0,0,0,0});
string Mj="";
mapping who;
object met;
if (!me) me=this_player();
if (check_id(me->query("id"),"player")!="");
else {
command("stare "+me->query("id"));
command("say 这牌局跟你没关系。");
return 1;
}
if (!Playing){
command("say 牌局还没开始...");
return 1;
}
if (NO_HU || LastDumpId==me->query("id")) return notify_fail("这样不能胡牌。\n");
if (LastDump==""&&Touched) message_vision("\n$N大叫:"+HIW+"天~~~古月~~~"+NOR+"\n\n",me);
else{
tell_room(environment(this_object()),"\n"+me->name()+"大叫:"+HIW+"我~古月~啦~"+NOR+"\n\n",me);
tell_object(me,"\n你大叫:"+HIW+"我~古月~啦~"+NOR+"\n\n");
}
if (Touched&&NowPlayerId[NowPlayer]==me->query("id"))
message_vision("$N说道:胡家"+me->name()+HIG+"自摸"+NOR+"~~~~~~~"+HIR+"吃红"+NOR+"~~~~~\n",this_object());
else command("say "+me->name()+"胡了");
if (me->query("id")==P1Data["Id"]) who=P1Data;
else if (me->query("id")==P2Data["Id"]) who=P2Data;
else if (me->query("id")==P3Data["Id"]) who=P3Data;
else if (me->query("id")==P4Data["Id"]) who=P4Data;
if (sizeof(who["OutFlower"]) ==16) i=1;
else if (sizeof(who["OutFlower"]) ==14&&sizeof(P1Data["OutFlower"]+P2Data["OutFlower"]+P3Data["OutFlower"]+P4Data["OutFlower"])==16) i=1;
if (!HU_F) i=0;
if (i){
Mj+="胡家的花牌是:\n";
Mj+=show_mj(who["OutFlower"],1);
if (NowPlayerId[NowPlayer]==who["Id"]) Mj+="胡家花胡自摸\n";
else{
if (sizeof(P1Data["OutFlower"])==2) LastDumpId=P1Data["Id"];
else if (sizeof(P2Data["OutFlower"])==2) LastDumpId=P2Data["Id"];
else if (sizeof(P3Data["OutFlower"])==2) LastDumpId=P3Data["Id"];
else if (sizeof(P4Data["OutFlower"])==2) LastDumpId=P4Data["Id"];
Mj+="\n花牌放枪者:"+HIB+LastDumpId+NOR+"\n";
}
}else{
Mj+="胡家的牌是:\n";
if (who["OutGon"]!=""){
Mj+="暗杠的有:\n";
Mj+=show_mj(who["OutGon"],0);
}
Mj+=who["Id"]+":手中的牌有:\n";
if (!Touched){
who["Mj"]+=LastDump;
who["Mj"]=sort_data(who["Mj"]);
Mj+=show_mj(who["Mj"],0);
Mj+="所胡的牌是:"+HIR+do_check_num(LastDump,0)+NOR;
Mj+="\n放枪者:"+HIB+LastDumpId+NOR+"\n";
}else{
Mj+=show_mj(who["Mj"],0);
if (str) Mj+="所自摸的牌是:"+HIR+do_check_num(str,0)+NOR+"\n";
}
}
Playing=0;
tell_room(environment(this_object()),Mj);
Tc="";
if (do_check_win(who["Mj"])==1||i==1){
//算台///////////////////////////////////
mixed MjT = ([
"@1" : ({ "庄家", 1 }),"@2" : ({ "自摸", 1 }),"@3" : ({ "花牌", 1 }),"@4" : ({ "门清", 1 }),
"@5" : ({ "东风", 1 }),"@6" : ({ "南风", 1 }),"@7" : ({ "西风", 1 }),"@8" : ({ "北风", 1 }),
"@9" : ({ "红中", 1 }),"@0" : ({ "青发", 1 }),"@a" : ({ "白板", 1 }),"@G" : ({ "一丕口", 1 }),
"@b" : ({ "海底摸月", 1 }),"@c" : ({ "海底捞鱼", 1 }),"@d" : ({ "平胡", 2 }),"@e" : ({ "东风东", 2 }),
"@f" : ({ "南风南", 2 }),"@g" : ({ "西风西", 2 }),"@h" : ({ "北风北", 2 }),"@i" : ({ "全求人", 2 }),
"@j" : ({ "叁暗刻", 2 }),"@H" : ({ "二丕口", 2 }),"@k" : ({ "叁杠子", 2 }),"@B" : ({ "春夏秋冬", 2 }),
"@C" : ({ "梅兰菊竹", 2 }),"@l" : ({ "门清自摸", 3 }),"@m" : ({ "碰碰胡", 4 }),"@n" : ({ "混一色", 4 }),
"@o" : ({ "小叁元", 4 }),"@p" : ({ "四暗刻", 6 }),"@q" : ({ "清一色", 8 }),"@r" : ({ "字一色", 8 }),
"@s" : ({ "七对子", 8 }),"@t" : ({ "大叁元", 8 }),"@u" : ({ "五暗刻", 8 }),"@F" : ({ "小四喜", 8 }),
"@D" : ({ "七抢一", 8 }),"@E" : ({ "绿一色", 16 }),"@v" : ({ "大四喜", 16 }),"@w" : ({ "天胡", 16 }),
"@x" : ({ "地胡", 16 }),"@y" : ({ "人胡", 16 }),"@z" : ({ "国士无双", 16 }),"@A" : ({ "八仙过海", 16 }),
"@J" : ({ "清老头", 8 }),"@I" : ({ "混老头", 4 }),
]);//H
get_tc(who);
////////////////
str="\t\t\t≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡\n";
for (i=0;i<sizeof(Tc);i+=2){
str+=sprintf("\t\t\t%-12s%8s 台\n",MjT[Tc[i..i+1]][0],chinese_number(MjT[Tc[i..i+1]][1]));
j+=MjT[Tc[i..i+1]][1];
}
if (Count){
str+=sprintf("\t\t\t%-12s%8s 台\n","连"+chinese_number(Count)+"拉"+chinese_number(Count),chinese_number(Count*2));
j+=Count*2;
}
str+=sprintf("\t\t\t%20s\n","总台数:"+chinese_number(j+5)+" 台");
str+="\t\t\t≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡\n";
tell_room(environment(this_player()),str);
/////////////
if (!Touched){
if (Play==4){
if (!winner=get_mjdata(me->query("id"))) winner=({0,0,0,0});
winner[1]+=j;
set_mjdata(me,winner);
met=present(LastDumpId, environment(this_object()));
if (!met) met=find_player(LastDumpId);
if (!met);
else{
if (!winner=get_mjdata(LastDumpId)) winner=({0,0,0,0});
winner[1]-=j; //战绩
winner[3]++; //放枪
set_mjdata(met,winner);
}
for (i=0;i<Play;i++){
met=present(NowPlayerId[i], environment(this_object()));
if (!met) met=find_player(NowPlayerId[i]);
if (!met);
else{
if (!winner=get_mjdata(NowPlayerId[i])) winner=({0,0,0,0});
winner[0]++; //局数
set_mjdata(met,winner);
}
}
}
}else{
if (Play==4){
if (!winner=get_mjdata(me->query("id"))) winner=({0,0,0,0});
winner[0]++;
winner[1]+=(j*3);
winner[2]++;
set_mjdata(me,winner);
for (i=0;i<Play;i++){
if (NowPlayerId[i]==me->query("id")) continue;
met=present(NowPlayerId[i], environment(this_object()));
if (!met) met=find_player(NowPlayerId[i]);
if (!met);
else{
if (!winner=get_mjdata(NowPlayerId[i])) winner=({0,0,0,0});
winner[0]++;
winner[1]-=j;
set_mjdata(met,winner);
}
}
}
}
if (NowPlayerId[0]==who["Id"]) Count++;
else{
Times++;
Count=0;
}
}else{
command("sigh "+who["Id"]);
message_vision("$N说道:玩家 ["+HIR+who["Id"]+HIG+"] 言乍~ 古月~~~"+NOR+"。\n",this_object());
Times++;
Count=0;
if (Play==4){
if (!winner=get_mjdata(me->query("id"))) winner=({0,0,0,0});
if (NowPlayerId[NowPlayer]==who["Id"]&&Touched){
if (who["Out"]==""&&who["OutPon"]==""){
winner[1]-=24;
j=-24;
}else {
winner[1]-=18;
j=-18;
}
}else{
if (who["Out"]==""&&who["OutPon"]==""){
winner[1]-=6;
j=-6;
}else{
winner[1]-=5;
j=-5;
}
}
////////////////
str="\t\t\t≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡\n";
str+=sprintf("\t\t\t%-12s%8s 台\n","言乍古月",chinese_number(j));
str+=sprintf("\t\t\t%20s\n","总台数:"+chinese_number(j+5)+" 台");
str+="\t\t\t≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡\n";
tell_room(environment(this_player()),str);
/////////////
set_mjdata(me,winner);
for (i=0;i<Play;i++){
met=present(NowPlayerId[i], environment(this_object()));
if (!met) met=find_player(NowPlayerId[i]);
if (!met);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?