doomgod icon

Difference between 0.97c2 and 0.97c3

doomgod | PRO | 08/27/12 08:02:31 AM UTC | 0 ⭐ | 463 👁️ | Never ⏰ | []
Diff |

27.45 KB

|

None

|

0 👍

/

0 👎

--- src/callvote.cpp
+++ src/callvote.cpp
@@ -70,6 +70,7 @@ static    ULONG                   g_ulVoteCompletedTicks 
 static bool                    g_bVotePassed;
 static ULONG                   g_ulPlayersWhoVotedYes[(MAXPLAYERS / 2) + 1];
 static ULONG                   g_ulPlayersWhoVotedNo[(MAXPLAYERS / 2) + 1];
+static ULONG                   g_ulKickVoteTargetPlayerIdx;
 
 //*****************************************************************************
 // PROTOTYPES
@@ -126,9 +127,12 @@ void CALLVOTE_Tick( void )
            if ( --g_ulVoteCompletedTicks == 0 )
            {
                // If the vote passed, execute the command string.
-               if ( g_bVotePassed && ( NETWORK_GetState( ) != NETSTATE_CLIENT ))
+               if ( g_bVotePassed && ( NETWORK_GetState( ) != NETSTATE_CLIENT )){
+                   // If the vote is a kick vote, we have to alter g_szVoteCommand to kick the cached player idx
+                   if( strncmp ( g_szVoteCommand, "kick ", 5 ) == 0 )
+                       sprintf( g_szVoteCommand, "kick_idx %d", g_ulKickVoteTargetPlayerIdx );
                    AddCommandString( g_szVoteCommand );
-
+               }
                // Reset the module.
                CALLVOTE_ClearVote( );
            }
@@ -509,24 +513,34 @@ static bool callvote_CheckValidity( char
    // First, figure out what kind of command we're trying to vote on.
    if ( stricmp( "kick", pszCommand ) == 0 )
        ulVoteCmd = VOTECMD_KICK;
-   else if ( stricmp( "map", pszCommand ) == 0 )
-       ulVoteCmd = VOTECMD_MAP;
-   else if ( stricmp( "changemap", pszCommand ) == 0 )
-       ulVoteCmd = VOTECMD_CHANGEMAP;
-   else if ( stricmp( "fraglimit", pszCommand ) == 0 )
-       ulVoteCmd = VOTECMD_FRAGLIMIT;
-   else if ( stricmp( "timelimit", pszCommand ) == 0 )
-       ulVoteCmd = VOTECMD_TIMELIMIT;
-   else if ( stricmp( "winlimit", pszCommand ) == 0 )
-       ulVoteCmd = VOTECMD_WINLIMIT;
-   else if ( stricmp( "duellimit", pszCommand ) == 0 )
-       ulVoteCmd = VOTECMD_DUELLIMIT;
-   else if ( stricmp( "pointlimit", pszCommand ) == 0 )
-       ulVoteCmd = VOTECMD_POINTLIMIT;
-   else
-       return ( false );
+   else {
+       int i = 0;
+       while( pszParameters[i] != '\0' )
+       {
+         if( pszParameters[i] == ';' || pszParameters[i] == ' ' )
+               return ( false );
+         i++;
+       }
+       if ( stricmp( "map", pszCommand ) == 0 )
+           ulVoteCmd = VOTECMD_MAP;
+       else if ( stricmp( "changemap", pszCommand ) == 0 )
+           ulVoteCmd = VOTECMD_CHANGEMAP;
+       else if ( stricmp( "fraglimit", pszCommand ) == 0 )
+           ulVoteCmd = VOTECMD_FRAGLIMIT;
+       else if ( stricmp( "timelimit", pszCommand ) == 0 )
+           ulVoteCmd = VOTECMD_TIMELIMIT;
+       else if ( stricmp( "winlimit", pszCommand ) == 0 )
+           ulVoteCmd = VOTECMD_WINLIMIT;
+       else if ( stricmp( "duellimit", pszCommand ) == 0 )
+           ulVoteCmd = VOTECMD_DUELLIMIT;
+       else if ( stricmp( "pointlimit", pszCommand ) == 0 )
+           ulVoteCmd = VOTECMD_POINTLIMIT;
+       else
+           return ( false );
+   }
 
    // Then, make sure the parameter for each vote is valid.
+   int parameterInt = atoi( pszParameters );
    switch ( ulVoteCmd )
    {
    case VOTECMD_KICK:
@@ -542,8 +556,11 @@ static bool callvote_CheckValidity( char
            // Compare the parameter to the version of the player's name without color codes.
            sprintf( szPlayerName, players[ulIdx].userinfo.netname );
            V_RemoveColorCodes( szPlayerName );
-           if ( stricmp( pszParameters, szPlayerName ) == 0 )
+           if ( stricmp( pszParameters, szPlayerName ) == 0 ){
+               // to prevent a player from escaping a kick vote by renaming, we store his ID at the beginning of the vote
+               g_ulKickVoteTargetPlayerIdx = ulIdx;
                break;
+           }
        }
 
        // If we didn't find the player, then don't allow the vote.
@@ -565,57 +582,62 @@ static bool callvote_CheckValidity( char
    case VOTECMD_FRAGLIMIT:
 
        // Fraglimit must be from 0-255.
-       if (( atoi( pszParameters ) < 0 ) || ( atoi( pszParameters ) >= 256 ))
+       if (( parameterInt < 0 ) || ( parameterInt >= 256 ))
            return ( false );
-       else if ( atoi( pszParameters ) == 0 )
+       else if ( parameterInt == 0 )
        {
            if (( pszParameters[0] != '0' ) || ( strlen( pszParameters ) != 1 ))
                return ( false );
        }
+       sprintf( pszParameters, "%d", parameterInt );
        break;
    case VOTECMD_TIMELIMIT:
 
-       // Timelimit must be from 0-65536.
-       if (( atof( pszParameters ) < 0.0 ) || ( atoi( pszParameters ) >= 65536.0 ))
+       // Timelimit must be from 0-65535.
+       if (( parameterInt < 0 ) || ( parameterInt >= 65536 ))
            return ( false );
-       else if ( atoi( pszParameters ) == 0 )
+       else if ( parameterInt == 0 )
        {
            if (( pszParameters[0] != '0' ) || ( strlen( pszParameters ) != 1 ))
                return ( false );
        }
+       sprintf( pszParameters, "%d", parameterInt );
        break;
    case VOTECMD_WINLIMIT:
 
        // Winlimit must be from 0-255.
-       if (( atoi( pszParameters ) < 0 ) || ( atoi( pszParameters ) >= 256 ))
+       if (( parameterInt < 0 ) || ( parameterInt >= 256 ))
            return ( false );
-       else if ( atoi( pszParameters ) == 0 )
+       else if ( parameterInt == 0 )
        {
            if (( pszParameters[0] != '0' ) || ( strlen( pszParameters ) != 1 ))
                return ( false );
        }
+       sprintf( pszParameters, "%d", parameterInt );
        break;
    case VOTECMD_DUELLIMIT:
 
        // Duellimit must be from 0-255.
-       if (( atoi( pszParameters ) < 0 ) || ( atoi( pszParameters ) >= 256 ))
+       if (( parameterInt < 0 ) || ( parameterInt >= 256 ))
            return ( false );
-       else if ( atoi( pszParameters ) == 0 )
+       else if ( parameterInt == 0 )
        {
            if (( pszParameters[0] != '0' ) || ( strlen( pszParameters ) != 1 ))
                return ( false );
        }
+       sprintf( pszParameters, "%d", parameterInt );
        break;
    case VOTECMD_POINTLIMIT:
 
-       // Pointlimit must be from 0-65526.
-       if (( atoi( pszParameters ) < 0 ) || ( atoi( pszParameters ) >= 65536 ))
+       // Pointlimit must be from 0-65535.
+       if (( parameterInt < 0 ) || ( parameterInt >= 65536 ))
            return ( false );
-       else if ( atoi( pszParameters ) == 0 )
+       else if ( parameterInt == 0 )
        {
            if (( pszParameters[0] != '0' ) || ( strlen( pszParameters ) != 1 ))
                return ( false );
        }
+       sprintf( pszParameters, "%d", parameterInt );
        break;
    default:
 
--- src/d_main.cpp
+++ src/d_main.cpp
@@ -928,8 +928,11 @@ void D_DoomLoop ()
                    G_BuildTiccmd (&netcmds[consoleplayer][maketic%BACKUPTICS]);
                    if (advancedemo)
                        D_DoAdvanceDemo ();
+                   // Console Ticker
                    C_Ticker ();
+                   // Menu Ticker
                    M_Ticker ();
+                   // Game Ticker
                    G_Ticker ();
                    gametic++;
                    maketic++;
@@ -2234,9 +2237,10 @@ void D_DoomMain (void)
    // voices. I never got around to writing the utility to do it, though.
    // And I probably never will now. But I know at least one person uses
    // it for something else, so this gets to stay here.
-   wad = BaseFileSearch ("zvox.wad", NULL);
-   if (wad)
-       D_AddFile (wad, false); // [BC]
+   // [BB] Loading zvox with Skulltag introduces a bag of problems and does't do any good.
+   //wad = BaseFileSearch ("zvox.wad", NULL);
+   //if (wad)
+   //  D_AddFile (wad, false); // [BC]
 
 
    // [BC] Also load skulltag.wad.
--- src/d_protocol.h
+++ src/d_protocol.h
@@ -69,14 +69,23 @@ struct zdemoheader_s {
 
 struct usercmd_s
 {
-   BYTE    buttons;
-   BYTE    pad;
-   short   pitch;          // up/down
+   // [BB] Added unused dummy variables to prevent sthook from working at all.
+   BYTE    dummy1;
+   BYTE    dummy2;
+   short   dummy3;
+   short   dummy4;
+   short   dummy5;
+   short   dummy6;
+   short   dummy7;
+   short   dummy8;
    short   yaw;            // left/right   // If you haven't guessed, I just
    short   roll;           // tilt         // ripped these from Quake2's usercmd.
+   short   pitch;          // up/down
+   BYTE    buttons;
+   BYTE    pad;
+   short   upmove;
    short   forwardmove;
    short   sidemove;
-   short   upmove;
 };
 typedef struct usercmd_s usercmd_t;
 
--- src/g_level.cpp
+++ src/g_level.cpp
@@ -1928,9 +1928,9 @@ void G_DoCompleted (void)
        level.maptime = 0;
    }
 
-   if (!deathmatch &&
-       ((level.flags & LEVEL_NOINTERMISSION) ||
-       ((nextcluster == thiscluster) && (thiscluster->flags & CLUSTER_HUB))))
+    // [BB] LEVEL_NOINTERMISSION is also respected in deathmatch games
+   if ( ((level.flags & LEVEL_NOINTERMISSION) ||
+        ( !deathmatch && (nextcluster == thiscluster) && (thiscluster->flags & CLUSTER_HUB))))
    {
        G_WorldDone ();
        return;
--- src/gi.cpp
+++ src/gi.cpp
@@ -293,7 +293,7 @@ gameinfo_t CommercialGameInfo =
    GI_MAPxx | GI_MENUHACK_COMMERCIAL,
    "TITLEPIC",
    "CREDIT",
-   "STCREDIT", // [BC] In Skulltag, show the ST credits screen, instead of the regular credits screen twice.
+   "CREDIT",
    "D_DM2TTL",
    11,
    0,
--- src/r_data.cpp
+++ src/r_data.cpp
@@ -1011,7 +1011,6 @@ static void R_InitPatches ()
        "FINAL2",
        "E2END",
        // [BC] New Skulltag patches here.
-       "STCREDIT",
        "STFLA1",
        "STFLA2",
        "STFLA3",
--- src/r_plane.cpp
+++ src/r_plane.cpp
@@ -68,7 +68,7 @@ planefunction_t       ceilingfunc;
 #define MAXVISPLANES 128    /* must be a power of 2 */
 
 // Avoid infinite recursion with stacked sectors by limiting them.
-#define MAX_SKYBOX_PLANES 100
+#define MAX_SKYBOX_PLANES 1000
 
 // [RH] Allocate one extra for sky box planes.
 static visplane_t      *visplanes[MAXVISPLANES+1]; // killough
--- src/sv_commands.cpp
+++ src/sv_commands.cpp
@@ -170,6 +170,10 @@ void SERVERCOMMANDS_SpawnPlayer( ULONG u
        NETWORK_WriteLong( &clients[ulIdx].netbuf, players[ulPlayer].mo->z );
        NETWORK_WriteByte( &clients[ulIdx].netbuf, players[ulPlayer].userinfo.PlayerClass );
    }
+   NETWORK_CheckBuffer( ulPlayer, 3 );
+   NETWORK_WriteHeader( &clients[ulPlayer].netbuf, SVC_SETPLAYERHEALTH );
+   NETWORK_WriteByte( &clients[ulPlayer].netbuf, ulPlayer );
+   NETWORK_WriteShort( &clients[ulPlayer].netbuf, players[ulPlayer].health );
 }
 
 //*****************************************************************************
--- src/sv_main.cpp
+++ src/sv_main.cpp
@@ -187,7 +187,7 @@ static  ULONG   g_ulMaxPacketSize = 0;
 //*****************************************************************************
 // CONSOLE VARIABLES
 
-CVAR( String, sv_motd, "\\cgWelcome to this Skulltag v0.96d server!\n\n\\ccHope you enjoy your stay!\n\\ccIf you have any questions or requests,\n\\ccplease talk to the admin of this server. Thanks!", CVAR_ARCHIVE )
+CVAR( String, sv_motd, "\\cgWelcome to this Skulltag v0.97c3 server!\n\n\\ccHope you enjoy your stay!\n\\ccIf you have any questions or requests,\n\\ccplease talk to the admin of this server. Thanks!", CVAR_ARCHIVE )
 CVAR( Bool, sv_defaultdmflags, true, 0 )
 CVAR( Bool, sv_forcepassword, false, CVAR_ARCHIVE )
 CVAR( Bool, sv_forcejoinpassword, false, CVAR_ARCHIVE )
@@ -4386,6 +4386,34 @@ static bool server_VoteNo( void )
 //*****************************************************************************
 // CONSOLE COMMANDS
 
+CCMD( kick_idx )
+{
+   // Only the server can boot players!
+   if ( NETWORK_GetState( ) != NETSTATE_SERVER )
+       return;
+
+   if ( argv.argc( ) < 2 )
+   {
+       Printf( "Usage: kick_idx <player Idx> [reason]\n" );
+       return;
+   }
+   ULONG ulIdx =  atoi(argv[1]);
+   // check if the player idx is identifying an ingame player
+   if ( playeringame[ulIdx] == false )
+       return;
+
+   // you can't kick admins
+   if ( SERVER_ADMIN_IsAdministrator( clients[ulIdx].address ))
+       return;
+
+   // If we provided a reason, give it.
+   if ( argv.argc( ) >= 3 )
+       SERVER_KickPlayer( ulIdx, argv[2] );
+   else
+       SERVER_KickPlayer( ulIdx, "None given." );
+   return;
+}
+
 CCMD( kick )
 {
    ULONG   ulIdx;
--- src/version.h
+++ src/version.h
@@ -36,15 +36,14 @@
 
 // The svnrevision.h is automatically updated to grab the revision of
 // of the current source tree so that it can be included with version numbers.
-// [BC] No need for SVN revision stuff.
-//#include "svnrevision.h"
+#include "svnrevision.h"
 
 /** Lots of different version numbers **/
 
-#define DOTVERSIONSTR_NOREV "0.97c2"
+#define DOTVERSIONSTR_NOREV "0.97c3"
 
 // The version string the user actually sees.
-#define DOTVERSIONSTR DOTVERSIONSTR_NOREV
+#define DOTVERSIONSTR DOTVERSIONSTR_NOREV "-r" SVN_REVISION_STRING
 
 // [BC] What version of ZDoom is this based off of?
 #define    ZDOOMVERSIONSTR     "2.1.7"
@@ -53,13 +52,14 @@
 #define RC_FILEVERSION 0,0,0,SVN_REVISION_NUMBER
 #define RC_PRODUCTVERSION 0,0,0,97
 #define RC_FILEVERSION2 DOTVERSIONSTR
-#define RC_PRODUCTVERSION2 "97c2"
+#define RC_PRODUCTVERSION2 "97c3-alpha0"
 
 // Version identifier for network games.
 // Bump it every time you do a release unless you're certain you
 // didn't change anything that will affect network protocol.
-// This has been updated for 97d.
-#define NETGAMEVERSION 003
+// NETGAMEVERSION 003 = 0.97c2
+// NETGAMEVERSION 004 = 0.97c3
+#define NETGAMEVERSION 004
 
 // Version stored in the ini's [LastRun] section.
 // Bump it if you made some configuration change that you want to
@@ -76,7 +76,7 @@
 #define MINDEMOVERSION 0x205
 
 // [BC] This is what's displayed as the title for server windows.
-#define    SERVERCONSOLE_TITLESTRING   "Skulltag v0.97c Server"
+#define    SERVERCONSOLE_TITLESTRING   "Skulltag v0.97c3 Server"
 
 // SAVEVER is the version of the information stored in level snapshots.
 // Note that SAVEVER is not directly comparable to VERSION.
--- src/win32/resource.h
+++ src/win32/resource.h
@@ -176,7 +176,7 @@
 #define IDCE_REFLECTIONSPANX            1103
 #define IDC_NO_FOV                      1103
 #define IDCS_REFLECTIONSPANX            1104
-#define IDC_NO_IMPALING                 1104
+#define IDC_NO_COOP_MP_WEAPON_SPAWN     1104
 #define IDCE_REFLECTIONSPANY            1105
 #define IDC_YES_WEAPONDROP              1105
 #define IDCS_REFLECTIONSPANY            1106
@@ -184,23 +184,23 @@
 #define IDCE_REFLECTIONSPANZ            1107
 #define IDC_INSTANT_RETURN              1107
 #define IDCS_REFLECTIONSPANZ            1108
-#define IDC_ALLOW_BASECOLORS            1108
+#define IDC_DISALLOW_CROUCH             1108
 #define IDCE_REVERB                     1109
 #define IDC_NO_TEAM_SWITCH              1109
 #define IDCS_REVERB                     1110
 #define IDC_NO_TEAM_SELECT              1110
 #define IDCE_REVERBDELAY                1111
-#define IDC_YES_RUNEDROP                1111
+#define IDC_COOP_LOSE_INVENTORY         1111
 #define IDCS_REVERBDELAY                1112
-#define IDC_YES_200MAX                  1112
+#define IDC_COOP_LOSE_ARMOR             1112
 #define IDCE_REVERBPANX                 1113
 #define IDC_YES_DOUBLEAMMO              1113
 #define IDCS_REVERBPANX                 1114
-#define IDC_NO_CLEARFRAGS               1114
+#define IDC_COOP_LOSE_POWERUPS          1114
 #define IDCE_REVERBPANY                 1115
 #define IDC_YES_DEGENERATION            1115
 #define IDCS_REVERBPANY                 1116
-#define IDC_LOSEFRAG_ON_DEATH           1116
+#define IDC_COOP_LOSE_AMMO              1116
 #define IDCE_REVERBPANZ                 1117
 #define IDC_YES_FREEAIMBFG              1117
 #define IDCS_REVERBPANZ                 1118
@@ -245,7 +245,7 @@
 #define IDC_ORIGINALSOUNDCURVE          1138
 #define IDC_OLDINTERMISSION             1139
 #define IDC_DISABLESTEALTHMONSTERS      1140
-#define IDC_DISABLECOOPERATIVEBACKPACKS 1141
+#define IDC_COOP_HALVE_AMMO             1141
 #define IDC_TITLEBOX                    1142
 #define IDC_SCOREBOARD1                 1143
 #define IDC_SCOREBOARD2                 1144
--- src/win32/serverconsole.cpp
+++ src/win32/serverconsole.cpp
@@ -634,19 +634,19 @@ BOOL CALLBACK SERVERCONSOLE_DMFlagsCallb
            case IDC_NO_JUMP:
            case IDC_NO_FREELOOK:
            case IDC_NO_FOV:
-           case IDC_NO_IMPALING:
+           case IDC_NO_COOP_MP_WEAPON_SPAWN:
            case IDC_YES_WEAPONDROP:
            case IDC_NO_RUNES:
            case IDC_INSTANT_RETURN:
-           case IDC_ALLOW_BASECOLORS:
+           case IDC_DISALLOW_CROUCH:
            case IDC_NO_TEAM_SWITCH:
            case IDC_NO_TEAM_SELECT:
-           case IDC_YES_RUNEDROP:
-           case IDC_YES_200MAX:
+           case IDC_COOP_LOSE_INVENTORY:
+           case IDC_COOP_LOSE_ARMOR:
            case IDC_YES_DOUBLEAMMO:
-           case IDC_NO_CLEARFRAGS:
+           case IDC_COOP_LOSE_POWERUPS:
            case IDC_YES_DEGENERATION:
-           case IDC_LOSEFRAG_ON_DEATH:
+           case IDC_COOP_LOSE_AMMO:
            case IDC_YES_FREEAIMBFG:
            case IDC_BARRELS_RESPAWN:
            case IDC_NO_RESPAWN_INVUL:
@@ -3292,6 +3292,51 @@ void SERVERCONSOLE_InitializeDMFlagsDisp
    else
        SendDlgItemMessage( hDlg, IDC_NO_FOV, BM_SETCHECK, BST_UNCHECKED, 0 );
 
+   if ( dmflags & DF_NO_COOP_WEAPON_SPAWN )
+       SendDlgItemMessage( hDlg, IDC_NO_COOP_MP_WEAPON_SPAWN, BM_SETCHECK, BST_CHECKED, 0 );
+   else
+       SendDlgItemMessage( hDlg, IDC_NO_COOP_MP_WEAPON_SPAWN, BM_SETCHECK, BST_UNCHECKED, 0 );
+
+   if ( dmflags & DF_NO_CROUCH )
+       SendDlgItemMessage( hDlg, IDC_DISALLOW_CROUCH, BM_SETCHECK, BST_CHECKED, 0 );
+   else
+       SendDlgItemMessage( hDlg, IDC_DISALLOW_CROUCH, BM_SETCHECK, BST_UNCHECKED, 0 );
+
+   if ( dmflags & DF_COOP_LOSE_INVENTORY )
+       SendDlgItemMessage( hDlg, IDC_COOP_LOSE_INVENTORY, BM_SETCHECK, BST_CHECKED, 0 );
+   else
+       SendDlgItemMessage( hDlg, IDC_COOP_LOSE_INVENTORY, BM_SETCHECK, BST_UNCHECKED, 0 );
+
+   if ( dmflags & DF_COOP_LOSE_KEYS )
+       SendDlgItemMessage( hDlg, IDC_KEEP_KEYS, BM_SETCHECK, BST_CHECKED, 0 );
+   else
+       SendDlgItemMessage( hDlg, IDC_KEEP_KEYS, BM_SETCHECK, BST_UNCHECKED, 0 );
+
+   if ( dmflags & DF_COOP_LOSE_WEAPONS )
+       SendDlgItemMessage( hDlg, IDC_KEEP_WEAPONS, BM_SETCHECK, BST_CHECKED, 0 );
+   else
+       SendDlgItemMessage( hDlg, IDC_KEEP_WEAPONS, BM_SETCHECK, BST_UNCHECKED, 0 );
+
+   if ( dmflags & DF_COOP_LOSE_ARMOR )
+       SendDlgItemMessage( hDlg, IDC_COOP_LOSE_ARMOR, BM_SETCHECK, BST_CHECKED, 0 );
+   else
+       SendDlgItemMessage( hDlg, IDC_COOP_LOSE_ARMOR, BM_SETCHECK, BST_UNCHECKED, 0 );
+
+   if ( dmflags & DF_COOP_LOSE_POWERUPS )
+       SendDlgItemMessage( hDlg, IDC_COOP_LOSE_POWERUPS, BM_SETCHECK, BST_CHECKED, 0 );
+   else
+       SendDlgItemMessage( hDlg, IDC_COOP_LOSE_POWERUPS, BM_SETCHECK, BST_UNCHECKED, 0 );
+
+   if ( dmflags & DF_COOP_LOSE_AMMO )
+       SendDlgItemMessage( hDlg, IDC_COOP_LOSE_AMMO, BM_SETCHECK, BST_CHECKED, 0 );
+   else
+       SendDlgItemMessage( hDlg, IDC_COOP_LOSE_AMMO, BM_SETCHECK, BST_UNCHECKED, 0 );
+
+   if ( dmflags & DF_COOP_HALVE_AMMO )
+       SendDlgItemMessage( hDlg, IDC_COOP_HALVE_AMMO, BM_SETCHECK, BST_CHECKED, 0 );
+   else
+       SendDlgItemMessage( hDlg, IDC_COOP_HALVE_AMMO, BM_SETCHECK, BST_UNCHECKED, 0 );
+
    // DMFLAGS2
    if ( dmflags2 & DF2_YES_WEAPONDROP )
        SendDlgItemMessage( hDlg, IDC_YES_WEAPONDROP, BM_SETCHECK, BST_CHECKED, 0 );
@@ -3343,6 +3388,7 @@ void SERVERCONSOLE_InitializeDMFlagsDisp
    else
        SendDlgItemMessage( hDlg, IDC_NO_RESPAWN_INVUL, BM_SETCHECK, BST_UNCHECKED, 0 );
 
+
    if ( dmflags2 & DF2_COOP_SHOTGUNSTART )
        SendDlgItemMessage( hDlg, IDC_SHOTGUN_START, BM_SETCHECK, BST_CHECKED, 0 );
    else
@@ -3364,10 +3410,10 @@ void SERVERCONSOLE_InitializeDMFlagsDisp
    else
        SendDlgItemMessage( hDlg, IDC_STAIRINDEX, BM_SETCHECK, BST_UNCHECKED, 0 );
 
-   if ( compatflags & COMPATF_LIMITPAIN )
-       SendDlgItemMessage( hDlg, IDC_LIMITPAIN, BM_SETCHECK, BST_CHECKED, 0 );
+   if ( compatflags & COMPATF_SILENTPICKUP )
+       SendDlgItemMessage( hDlg, IDC_SILENTPICKUP, BM_SETCHECK, BST_CHECKED, 0 );
    else
-       SendDlgItemMessage( hDlg, IDC_LIMITPAIN, BM_SETCHECK, BST_UNCHECKED, 0 );
+       SendDlgItemMessage( hDlg, IDC_SILENTPICKUP, BM_SETCHECK, BST_UNCHECKED, 0 );
 
    if ( compatflags & COMPATF_LIMITPAIN )
        SendDlgItemMessage( hDlg, IDC_LIMITPAIN, BM_SETCHECK, BST_CHECKED, 0 );
@@ -3442,8 +3488,8 @@ void SERVERCONSOLE_InitializeDMFlagsDisp
    if ( compatflags & COMPATF_DISABLECOOPERATIVEBACKPACKS )
        SendDlgItemMessage( hDlg, IDC_DISABLECOOPERATIVEBACKPACKS, BM_SETCHECK, BST_CHECKED, 0 );
    else
-*/
        SendDlgItemMessage( hDlg, IDC_DISABLECOOPERATIVEBACKPACKS, BM_SETCHECK, BST_UNCHECKED, 0 );
+*/
 
    // Store current values for dmflags/dmflags2/compatflags.
    Val = dmflags.GetGenericRep( CVAR_Int );
@@ -3502,6 +3548,24 @@ void SERVERCONSOLE_UpdateDMFlagsDisplay(
        ulDMFlags |= DF_NO_FREELOOK;
    if ( SendDlgItemMessage( hDlg, IDC_NO_FOV, BM_GETCHECK, 0, 0 ) == BST_CHECKED )
        ulDMFlags |= DF_NO_FOV;
+   if ( SendDlgItemMessage( hDlg, IDC_NO_COOP_MP_WEAPON_SPAWN, BM_GETCHECK, 0, 0 ) == BST_CHECKED )
+       ulDMFlags |= DF_NO_COOP_WEAPON_SPAWN;
+   if ( SendDlgItemMessage( hDlg, IDC_DISALLOW_CROUCH, BM_GETCHECK, 0, 0 ) == BST_CHECKED )
+       ulDMFlags |= DF_NO_CROUCH ;
+   if ( SendDlgItemMessage( hDlg, IDC_COOP_LOSE_INVENTORY, BM_GETCHECK, 0, 0 ) == BST_CHECKED )
+       ulDMFlags |= DF_COOP_LOSE_INVENTORY;
+   if ( SendDlgItemMessage( hDlg, IDC_KEEP_KEYS, BM_GETCHECK, 0, 0 ) == BST_CHECKED )
+       ulDMFlags |= DF_COOP_LOSE_KEYS;
+   if ( SendDlgItemMessage( hDlg, IDC_KEEP_WEAPONS, BM_GETCHECK, 0, 0 ) == BST_CHECKED )
+       ulDMFlags |= DF_COOP_LOSE_WEAPONS;
+   if ( SendDlgItemMessage( hDlg, IDC_COOP_LOSE_ARMOR, BM_GETCHECK, 0, 0 ) == BST_CHECKED )
+       ulDMFlags |= DF_COOP_LOSE_ARMOR;
+   if ( SendDlgItemMessage( hDlg, IDC_COOP_LOSE_POWERUPS, BM_GETCHECK, 0, 0 ) == BST_CHECKED )
+       ulDMFlags |= DF_COOP_LOSE_POWERUPS;
+   if ( SendDlgItemMessage( hDlg, IDC_COOP_LOSE_AMMO, BM_GETCHECK, 0, 0 ) == BST_CHECKED )
+       ulDMFlags |= DF_COOP_LOSE_AMMO;
+   if ( SendDlgItemMessage( hDlg, IDC_COOP_HALVE_AMMO, BM_GETCHECK, 0, 0 ) == BST_CHECKED )
+       ulDMFlags |= DF_COOP_HALVE_AMMO;
 
    sprintf( szString, "dmflags: %d", ulDMFlags );
    SetDlgItemText( hDlg, IDC_DMFLAGS, szString );
@@ -3625,6 +3689,24 @@ void SERVERCONSOLE_UpdateDMFlags( HWND h
        ulDMFlags |= DF_NO_FREELOOK;
    if ( SendDlgItemMessage( hDlg, IDC_NO_FOV, BM_GETCHECK, 0, 0 ) == BST_CHECKED )
        ulDMFlags |= DF_NO_FOV;
+   if ( SendDlgItemMessage( hDlg, IDC_NO_COOP_MP_WEAPON_SPAWN, BM_GETCHECK, 0, 0 ) == BST_CHECKED )
+       ulDMFlags |= DF_NO_COOP_WEAPON_SPAWN;
+   if ( SendDlgItemMessage( hDlg, IDC_DISALLOW_CROUCH, BM_GETCHECK, 0, 0 ) == BST_CHECKED )
+       ulDMFlags |= DF_NO_CROUCH;
+   if ( SendDlgItemMessage( hDlg, IDC_COOP_LOSE_INVENTORY, BM_GETCHECK, 0, 0 ) == BST_CHECKED )
+       ulDMFlags |= DF_COOP_LOSE_INVENTORY;
+   if ( SendDlgItemMessage( hDlg, IDC_KEEP_KEYS, BM_GETCHECK, 0, 0 ) == BST_CHECKED )
+       ulDMFlags |= DF_COOP_LOSE_KEYS;
+   if ( SendDlgItemMessage( hDlg, IDC_KEEP_WEAPONS, BM_GETCHECK, 0, 0 ) == BST_CHECKED )
+       ulDMFlags |= DF_COOP_LOSE_WEAPONS;
+   if ( SendDlgItemMessage( hDlg, IDC_COOP_LOSE_ARMOR, BM_GETCHECK, 0, 0 ) == BST_CHECKED )
+       ulDMFlags |= DF_COOP_LOSE_ARMOR;
+   if ( SendDlgItemMessage( hDlg, IDC_COOP_LOSE_POWERUPS, BM_GETCHECK, 0, 0 ) == BST_CHECKED )
+       ulDMFlags |= DF_COOP_LOSE_POWERUPS;
+   if ( SendDlgItemMessage( hDlg, IDC_COOP_LOSE_AMMO, BM_GETCHECK, 0, 0 ) == BST_CHECKED )
+       ulDMFlags |= DF_COOP_LOSE_AMMO;
+   if ( SendDlgItemMessage( hDlg, IDC_COOP_HALVE_AMMO, BM_GETCHECK, 0, 0 ) == BST_CHECKED )
+       ulDMFlags |= DF_COOP_HALVE_AMMO;
 
    // If the DMFlags have changed, send the update.
    if ( g_ulStoredDMFlags != ulDMFlags )
--- src/win32/zdoom.rc
+++ src/win32/zdoom.rc
@@ -304,7 +304,7 @@ BEGIN
             VALUE "Comments", "Thanks to id Software for creating DOOM and then releasing the source code. Thanks also to TeamTNT for creating BOOM, which ZDoom (and thus Skulltag) is partially based on.  Giant thanks to Randy Heit for his wonderful ZDoom.\0"
             VALUE "CompanyName", " \0"
             VALUE "FileDescription", "Skulltag\0"
-            VALUE "FileVersion", "v0.97c\0"
+            VALUE "FileVersion", "v0.97c3\0"
             VALUE "InternalName", "Skulltag\0"
             VALUE "LegalCopyright", "Copyright © 1993-1996, id Software & 1998-2006, Randy Heit\0"
             VALUE "LegalTrademarks", "Doom® is a Registered Trademark of id Software, Inc.\0"
@@ -749,32 +749,32 @@ BEGIN
                     BS_AUTOCHECKBOX | WS_TABSTOP,16,294,69,10
     CONTROL         "Disallow fov",IDC_NO_FOV,"Button",BS_AUTOCHECKBOX | 
                     WS_TABSTOP,16,304,54,10
-    CONTROL         "No impaling",IDC_NO_IMPALING,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,168,124,53,10
+    CONTROL         "Don't spawn multi. weapons (CO-OP)",IDC_NO_COOP_MP_WEAPON_SPAWN,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,168,124,130,10
     CONTROL         "Drop weapons (DM)",IDC_YES_WEAPONDROP,"Button",
                     BS_AUTOCHECKBOX | WS_TABSTOP,168,134,79,10
     CONTROL         "Don't spawn runes (DM)",IDC_NO_RUNES,"Button",
                     BS_AUTOCHECKBOX | WS_TABSTOP,168,144,92,10
     CONTROL         "Instant flag return (ST/CTF)",IDC_INSTANT_RETURN,"Button",
                     BS_AUTOCHECKBOX | WS_TABSTOP,168,154,103,10
-    CONTROL         "Allow base colors (ST/CTF)",IDC_ALLOW_BASECOLORS,"Button",
+    CONTROL         "Disallow crouch",IDC_DISALLOW_CROUCH,"Button",
                     BS_AUTOCHECKBOX | WS_TABSTOP,168,164,103,10
     CONTROL         "No team switching (ST/CTF)",IDC_NO_TEAM_SWITCH,"Button",
                     BS_AUTOCHECKBOX | WS_TABSTOP,168,174,106,10
     CONTROL         "Server picks teams (ST/CTF)",IDC_NO_TEAM_SELECT,"Button",
                     BS_AUTOCHECKBOX | WS_TABSTOP,168,184,108,10
-    CONTROL         "Drop runes",IDC_YES_RUNEDROP,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,168,194,51,10
-    CONTROL         "Force 200%/200% max (DM)",IDC_YES_200MAX,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,168,204,106,10
+    CONTROL         "Lose inventory (CO-OP)",IDC_COOP_LOSE_INVENTORY,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,168,194,130,10
+    CONTROL         "Lose armor (CO-OP)",IDC_COOP_LOSE_ARMOR,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,168,204,130,10
     CONTROL         "Double ammo (DM)",IDC_YES_DOUBLEAMMO,"Button",
                     BS_AUTOCHECKBOX | WS_TABSTOP,168,214,77,10
-    CONTROL         "Don't clear frags (DM)",IDC_NO_CLEARFRAGS,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,168,224,85,10
+    CONTROL         "Lose powerups (CO-OP)",IDC_COOP_LOSE_POWERUPS,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,168,224,130,10
     CONTROL         "Degeneration",IDC_YES_DEGENERATION,"Button",
                     BS_AUTOCHECKBOX | WS_TABSTOP,168,234,59,10
-    CONTROL         "Lose frag on death (DM)",IDC_LOSEFRAG_ON_DEATH,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,168,244,93,10
+    CONTROL         "Lose ammo (CO-OP)",IDC_COOP_LOSE_AMMO,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,168,244,130,10
     CONTROL         "Allow BFG freeaiming",IDC_YES_FREEAIMBFG,"Button",
                     BS_AUTOCHECKBOX | WS_TABSTOP,168,254,83,10
     CONTROL         "Barrels respawn (DM)",IDC_BARRELS_RESPAWN,"Button",
@@ -827,8 +827,8 @@ BEGIN
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,320,274,126,10
     CONTROL         "Disable stealth monsters",IDC_DISABLESTEALTHMONSTERS,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,320,284,92,10
-    CONTROL         "Disable cooperative backpacks",
-                    IDC_DISABLECOOPERATIVEBACKPACKS,"Button",BS_AUTOCHECKBOX | 
+    CONTROL         "Lose half ammo (CO-OP)",
+                    IDC_COOP_HALVE_AMMO,"Button",BS_AUTOCHECKBOX | 
                     WS_TABSTOP,320,294,116,10
 END
 
@@ -1042,7 +1042,7 @@ END
 
 IDD_SERVERDIALOG DIALOG DISCARDABLE  0, 0, 288, 322
 STYLE DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Skulltag v0.96d Server"
+CAPTION "Skulltag v0.97c3 Server"
 MENU IDR_MAINMENU
 FONT 8, "MS Sans Serif"
 BEGIN
--- zdoom.vcproj
+++ zdoom.vcproj
@@ -201,6 +201,7 @@
                Name="VCLinkerTool"
                AdditionalOptions="/MACHINE:I386"
                AdditionalDependencies="gdi32.lib user32.lib comctl32.lib shell32.lib advapi32.lib comdlg32.lib ole32.lib dxguid.lib dsound.lib ddraw.lib dinput8.lib strmiids.lib wsock32.lib winmm.lib fmodex_vc.lib setupapi.lib ws2_32.lib opengl32.lib glu32.lib ilu.lib ilut.lib devil.lib fmodvc.lib $(NOINHERIT)"
+               OutputFile="..\$(ProjectName)-debug.exe"
                LinkIncremental="2"
                SuppressStartupBanner="true"
                AdditionalLibraryDirectories=""

Comments