diff --git a/polymer/eduke32/source/funct.h b/polymer/eduke32/source/funct.h index 1c20c1431..c5e3c0e80 100644 --- a/polymer/eduke32/source/funct.h +++ b/polymer/eduke32/source/funct.h @@ -353,5 +353,6 @@ extern int issoundplaying(int num); extern void stopspritesound(short num, short i); extern void updatenames(void); extern void sendboardname(void); +extern void sendquit(void); #endif // __funct_h__ diff --git a/polymer/eduke32/source/game.c b/polymer/eduke32/source/game.c index c2bd29ee1..ba970277d 100644 --- a/polymer/eduke32/source/game.c +++ b/polymer/eduke32/source/game.c @@ -325,6 +325,47 @@ void getpackets(void) { switch(packbuf[0]) { + case 254: + //slaves in M/S mode only send to master + if (myconnectindex == connecthead) + { + //Master re-transmits message to all others + for(i=connectpoint2[connecthead];i>=0;i=connectpoint2[i]) + if (i != other) + sendpacket(i,packbuf,packbufleng); + } + + j = packbuf[1]; + playerquitflag[j] = 0; + Bsprintf(buf,"%s is history!",ud.user_name[j]); + adduserquote(buf); + + if(j == connecthead && networkmode == 0 ) + gameexit( " \nThe 'MASTER/First player' just quit the game. All\nplayers are returned from the game."); + + for(i=connecthead;i>=0;i=connectpoint2[i]) + { + if (playerquitflag[i] != 0) + continue; + if (i == connecthead) + connecthead = connectpoint2[connecthead]; + else + { + for(j=connecthead;j>=0;j=connectpoint2[j]) { + if(connectpoint2[j] == i) + connectpoint2[j] = connectpoint2[i]; + } + } + } + + numplayers--; + ud.multimode--; + + if (numplayers < 2) + sound(GENERIC_AMBIENCE17); + + break; + case 9: //slaves in M/S mode only send to master if (myconnectindex == connecthead) @@ -661,7 +702,7 @@ void getpackets(void) playerreadyflag[other]++; break; case 255: - gameexit(" "); + sendquit(); break; } } @@ -2068,20 +2109,18 @@ void gameexit(char *t) if(ud.recstat == 1) closedemowrite(); else if(ud.recstat == 2) { if (frecfilep) fclose(frecfilep); } // JBF: fixes crash on demo playback - if(qe || cp) - goto GOTOHERE; - - if(playerswhenstarted > 1 && (gametype_flags[ud.coop] & GAMETYPE_FLAG_SCORESHEET) && *t == ' ') + if(!qe && !cp) { - dobonus(1); - setgamemode(ScreenMode,ScreenWidth,ScreenHeight,ScreenBPP); + if(playerswhenstarted > 1 && ps[myconnectindex].gm&MODE_GAME && (gametype_flags[ud.coop] & GAMETYPE_FLAG_SCORESHEET) && *t == ' ') + { + dobonus(1); + setgamemode(ScreenMode,ScreenWidth,ScreenHeight,ScreenBPP); + } + + if( *t != 0 && *(t+1) != 'V' && *(t+1) != 'Y') + showtwoscreens(); } - if( *t != 0 && *(t+1) != 'V' && *(t+1) != 'Y') - showtwoscreens(); - - GOTOHERE: - if (qsetmode == 200) Shutdown(); @@ -9657,7 +9696,7 @@ char domovethings(void) adduserquote(buf); if(j < 0 && networkmode == 0 ) - gameexit( " \nThe 'MASTER/First player' just quit the game. All\nplayers are returned from the game. This only happens in 5-8\nplayer mode as a different network scheme is used."); + gameexit( " \nThe 'MASTER/First player' just quit the game. All\nplayers are returned from the game."); } if ((numplayers >= 2) && ((movefifoplc&7) == 7)) diff --git a/polymer/eduke32/source/menus.c b/polymer/eduke32/source/menus.c index 274674feb..0c558cbe9 100644 --- a/polymer/eduke32/source/menus.c +++ b/polymer/eduke32/source/menus.c @@ -438,7 +438,7 @@ static void modval(int min, int max,int *p,short dainc,char damodify) } } -#define MENUHIGHLIGHT(x) probey==x?(sintable[(totalclock<<4)&2047]>>12):10 +#define MENUHIGHLIGHT(x) probey==x?2-(sintable[(totalclock<<4)&2047]>>12):10 #define SHX(X) 0 // ((x==X)*(-sh)) #define PHX(X) 0 @@ -512,6 +512,37 @@ void check_player_color(int *color,int prev_color) } } +void sendquit(void) +{ + int i; + + if( gamequit == 0 && ( numplayers > 1 ) ) + { + if(ps[myconnectindex].gm&MODE_GAME) + { + gamequit = 1; + quittimer = totalclock+120; + } + else + { + tempbuf[0] = 254; + tempbuf[1] = myconnectindex; + + for(i=connecthead;i >= 0;i=connectpoint2[i]) + { + if (i != myconnectindex) sendpacket(i,tempbuf,2); + if ((!networkmode) && (myconnectindex != connecthead)) break; //slaves in M/S mode only send to master + } + gameexit(" "); + } + } + else if( numplayers < 2 ) + gameexit(" "); + + if( ( totalclock > quittimer ) && ( gamequit == 1) ) + gameexit("Timed out."); +} + void menus(void) { CACHE1D_FIND_REC *dir; @@ -3798,24 +3829,7 @@ VOLUME_ALL_40x: { KB_FlushKeyboardQueue(); - if( gamequit == 0 && ( numplayers > 1 ) ) - { - if(ps[myconnectindex].gm&MODE_GAME) - { - gamequit = 1; - quittimer = totalclock+120; - } - else - { - sendlogoff(); - gameexit(" "); - } - } - else if( numplayers < 2 ) - gameexit(" "); - - if( ( totalclock > quittimer ) && ( gamequit == 1) ) - gameexit("Timed out."); + sendquit(); } x = probe(186,124,0,0); diff --git a/polymer/eduke32/source/osdcmds.c b/polymer/eduke32/source/osdcmds.c index 6277080f3..8c751713a 100644 --- a/polymer/eduke32/source/osdcmds.c +++ b/polymer/eduke32/source/osdcmds.c @@ -30,23 +30,7 @@ struct osdcmd_cheatsinfo osdcmd_cheatsinfo_stat; int osdcmd_quit(const osdfuncparm_t *parm) { - extern long quittimer; - if( gamequit == 0 && ( numplayers > 1 ) ) - { - if(ps[myconnectindex].gm&MODE_GAME) - { - gamequit = 1; - quittimer = totalclock+120; - } - else - { - sendlogoff(); - gameexit(" "); - } - } - else if( numplayers < 2 ) - gameexit(" "); - + sendquit(); return OSDCMD_OK; }