1mj.c
来自「C实现的MUD,对大家基本入门网络游戏很有帮助!」· C语言 代码 · 共 1,606 行 · 第 1/5 页
C
1,606 行
ponid=check_id(str,"tin");
if (ponid!=""){
me=present(ponid, environment(this_object()));
if (!me) me=find_player(ponid);
if (!me) return 1;
return do_win(str,me);
}
}
if (Auto_Gon){
ponid=check_id(str,"gon");
if (ponid!=""){
me=present(ponid, environment(this_object()));
if (!me) me=find_player(ponid);
if (!me) return 1;
do_gon(str,me);
}
}
if (Auto_Pon){
ponid=check_id(str,"pon");
if (ponid!=""){
me=present(ponid, environment(this_object()));
if (!me) me=find_player(ponid);
if (!me) return 1;
do_pon(str,me);
}
}
if (count==(end-16-Goned)){
Playing=0;
Count++;
message_vision("$N说道:此局"+HIY+"流局"+NOR+"请再重新开始 "+HIR+"start"+NOR+" 。\n",this_object());
str="所剩下的牌只有:"+show_mj(List[count..end],2)+"\n";
tell_room(environment(this_object()),str);
if (Play==4){
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);
}
}
}
return 1;
}
if (Auto){
if (NowPlayerId[NowPlayer]==P1Data["Id"]) who=P1Data;
else if (NowPlayerId[NowPlayer]==P2Data["Id"]) who=P2Data;
else if (NowPlayerId[NowPlayer]==P3Data["Id"]) who=P3Data;
else if (NowPlayerId[NowPlayer]==P4Data["Id"]) who=P4Data;
if (who["Auto"]=="auto"){
me=present(NowPlayerId[NowPlayer], environment(this_object()));
if (!me) me=find_player(NowPlayerId[NowPlayer]);
if (!me) return 1;
do_touch("AUTO",me);
}
}
if(npc_action(me)) return 1;
else {
//如果下一个出牌的是电脑,自动调用摸牌函数
PAUSE = 0;
str = me->query("id");
if( !userp(next_data(str, 1, "player")) )
do_touch( 0, next_data(str, 1, "player") );
}
return 1;
}
int do_eat(string str, object me)
{
int LastDumpMan,i;
string num1,num2;
mapping who, lastwho;
if(!me) me=this_player();
if (!str || sscanf(str,"%s %s",num1,num2)!=2) return 0;
if (check_id(me->query("id"),"player")!="");
else {
command("stare "+me->query("id"));
command("say 这牌局跟你没关系。");
return 1;
}
if (!Playing){
command("say 牌局还没开始。");
return 1;
}
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"]+=sort_data(num2+num1+LastDump);
//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;
//把杠的牌从出牌者面前拿掉!
lastwho = next_data( LastDumpId, 0, "data");
lastwho["Dump"] = do_delete_Mj(lastwho["Dump"], str, 1);
//再显示所有的牌,这样可以更好的把握!! 还是算了吧!
/*for(i=0; i<4; i++)
tell_room(environment(this_object()),next_data(LastDumpId , i, "id")+
"前面的牌是:\n"+show_mj(next_data(LastDumpId, i, "allout"), 6));*/
tell_object(me,"以下是你的牌:\n");
i=0;
if (who["Show"]=="代码") i=3;
if (who["Show"]=="color") i=5;
tell_object(me,show_mj(who["Mj"],i));
if( !userp(me) )
call_out("dump_what", DELAY, me ); //如果吃牌者是电脑,调用函数计算出什么牌。
return delete_last_dump(who["Id"]);
}
int do_gon(string str,object me)
{
int i;
mapping who, lastwho;
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);
destop+=str; //杠完这牌当然要到桌面上来咯
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+who["Mj"]; //为了习惯把牌放在右边
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脸上露出邪恶的笑容说道:"+HIR"日音木工~~~"+NOR"嘿嘿.....\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;
//把杠的牌从出牌者面前拿掉!
lastwho = next_data( LastDumpId, 0, "data");
lastwho["Dump"] = do_delete_Mj(lastwho["Dump"], str, 1);
//再显示所有的牌,这样可以更好的把握!! 还是算了吧!
/* for(i=0; i<4; i++)
tell_room(environment(this_object()),next_data(LastDumpId , i, "id")+
"前面的牌是:\n"+show_mj(next_data(LastDumpId, i, "allout"), 6));
*/
PAUSE = 0; //取消暂停
if(userp(me)) who["Pause"] = "";//取消玩家的暂停标记
for (i=0; i<3; i++) destop+=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+who["Mj"];
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;
if(!userp(me)) {
call_out("dump_what", DELAY, me);//如果是NPC就继续出牌
}
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,obn;
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");
PAUSE = 0; //取消暂停
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+=show_mj(who["OutPon"]+who["Out"], 0);
//Mj+=who["Id"]+":手中的牌有:\n";
if (!Touched){
who["Mj"]+=LastDump;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?