shithub: choc

Download patch

ref: a28f58da05ed501efd913527067d07be85b1cc55
parent: 7b128dc1e7586ad00dc63d1be272ec61cfe7526b
parent: 429fa571c476bf8ffb8aa9994e63db0ef79efe23
author: Fabian Greffrath <fabian@greffrath.com>
date: Mon Apr 24 10:46:31 EDT 2017

Merge branch 'master' into sdl2-branch

--- a/configure.ac
+++ b/configure.ac
@@ -113,15 +113,16 @@
 
 WINDOWS_RC_VERSION=`echo $PACKAGE_VERSION | sed 's/-.*//; s/\./, /g; s/$/, 0/'`
 
-# This controls the prefix added to the start of program names.  For example,
-# if this is changed to "lemon-", the programs generated will be named
-# lemon-doom, lemon-heretic, etc.
+dnl Without a hyphen. This is used for the bash-completion scripts.
+PROGRAM_SPREFIX=$(echo $PACKAGE_SHORTNAME | tr A-Z a-z)
 
-PROGRAM_PREFIX=chocolate-
+dnl With a hyphen, used almost everywhere else.
+PROGRAM_PREFIX=${PROGRAM_SPREFIX}-
 
 AC_SUBST(PROGRAM_PREFIX)
 AC_DEFINE_UNQUOTED(PROGRAM_PREFIX, "$PROGRAM_PREFIX",
                    Change this when you create your awesome forked version)
+AC_SUBST(PROGRAM_SPREFIX)
 
 AM_CONFIG_HEADER(config.h:config.hin)
 
@@ -151,6 +152,10 @@
 Makefile
 man/Makefile
 man/bash-completion/Makefile
+man/bash-completion/doom.template
+man/bash-completion/heretic.template
+man/bash-completion/hexen.template
+man/bash-completion/strife.template
 opl/Makefile
 opl/examples/Makefile
 pcsound/Makefile
--- a/data/convert-icon
+++ b/data/convert-icon
@@ -23,8 +23,13 @@
 try:
         import Image
 except ImportError:
-        print("WARNING: Could not update %s.  Please install the Python Imaging library." % sys.argv[2])
-        sys.exit(0)
+        try:
+                from PIL import Image
+        except ImportError:
+                print("WARNING: Could not update %s.  "
+                      "Please install the Python Imaging library or Pillow."
+                      % sys.argv[2])
+                sys.exit(0)
 
 
 def convert_image(filename, output_filename):
--- a/man/bash-completion/.gitignore
+++ b/man/bash-completion/.gitignore
@@ -2,3 +2,4 @@
 *heretic
 *hexen
 *strife
+*.template
--- a/man/bash-completion/doom.template
+++ /dev/null
@@ -1,51 +1,0 @@
-# bash completion for Chocolate Doom                       -*- shell-script -*-
-
-_chocolate_doom()
-{
-    local cur prev words cword
-    _init_completion || return
-
-    # Save the previous switch on the command line in the prevsw variable
-    local i prevsw=""
-    for (( i=1; $cword > 1 && i <= $cword; i++ )); do
-        if [[ ${words[i]} == -* ]]; then
-            prevsw=${words[i]}
-        fi
-    done
-
-    # Allow adding more than one file with the same extension to the same switch
-    case $prevsw in
-        -config|-extraconfig)
-            _filedir cfg
-            ;;
-        -file|-iwad|-aa|-af|-as|-merge|-nwtmerge)
-            _filedir wad
-            ;;
-        -playdemo|-timedemo)
-            _filedir lmp
-            ;;
-        -deh)
-            _filedir '@(bex|deh)'
-            ;;
-    esac
-
-    case $prev in
-        -pack)
-            COMPREPLY=(doom2 tnt plutonia)
-            ;;
-        -gameversion)
-            COMPREPLY=(1.9 ultimate final final2 hacx chex)
-            ;;
-        -setmem)
-            COMPREPLY=(dos622 dos71 dosbox)
-            ;;
-    esac
-
-    if [[ $cur == -* ]]; then
-        COMPREPLY=( $( compgen -W '@content' -- "$cur" ) )
-    fi
-} &&
-
-complete -F _chocolate_doom chocolate-doom
-
-# ex: ts=4 sw=4 et filetype=sh
--- /dev/null
+++ b/man/bash-completion/doom.template.in
@@ -1,0 +1,51 @@
+# bash completion for @PACKAGE_SHORTNAME@ Doom               -*- shell-script -*-
+
+_@PROGRAM_SPREFIX@_doom()
+{
+    local cur prev words cword
+    _init_completion || return
+
+    # Save the previous switch on the command line in the prevsw variable
+    local i prevsw=""
+    for (( i=1; $cword > 1 && i <= $cword; i++ )); do
+        if [[ ${words[i]} == -* ]]; then
+            prevsw=${words[i]}
+        fi
+    done
+
+    # Allow adding more than one file with the same extension to the same switch
+    case $prevsw in
+        -config|-extraconfig)
+            _filedir cfg
+            ;;
+        -file|-iwad|-aa|-af|-as|-merge|-nwtmerge)
+            _filedir wad
+            ;;
+        -playdemo|-timedemo)
+            _filedir lmp
+            ;;
+        -deh)
+            _filedir '@(bex|deh)'
+            ;;
+    esac
+
+    case $prev in
+        -pack)
+            COMPREPLY=(doom2 tnt plutonia)
+            ;;
+        -gameversion)
+            COMPREPLY=(1.9 ultimate final final2 hacx chex)
+            ;;
+        -setmem)
+            COMPREPLY=(dos622 dos71 dosbox)
+            ;;
+    esac
+
+    if [[ $cur == -* ]]; then
+        COMPREPLY=( $( compgen -W '@content' -- "$cur" ) )
+    fi
+} &&
+
+complete -F _@PROGRAM_SPREFIX@_doom @PROGRAM_PREFIX@doom
+
+# ex: ts=4 sw=4 et filetype=sh
--- a/man/bash-completion/heretic.template
+++ /dev/null
@@ -1,48 +1,0 @@
-# bash completion for Chocolate Heretic                    -*- shell-script -*-
-
-_chocolate_heretic()
-{
-    local cur prev words cword
-    _init_completion || return
-
-    # Save the previous switch on the command line in the prevsw variable
-    local i prevsw=""
-    for (( i=1; $cword > 1 && i <= $cword; i++ )); do
-        if [[ ${words[i]} == -* ]]; then
-            prevsw=${words[i]}
-        fi
-    done
-
-    # Allow adding more than one file with the same extension to the same switch
-    case $prevsw in
-        -config|-extraconfig)
-            _filedir cfg
-            ;;
-        -file|-iwad|-aa|-af|-as|-merge|-nwtmerge)
-            _filedir wad
-            ;;
-        -playdemo|-timedemo)
-            _filedir lmp
-            ;;
-        -deh)
-            _filedir hhe
-            ;;
-    esac
-
-    case $prev in
-        -hhever)
-            COMPREPLY=(1.0 1.2 1.3)
-            ;;
-        -setmem)
-            COMPREPLY=(dos622 dos71 dosbox)
-            ;;
-    esac
-
-    if [[ $cur == -* ]]; then
-        COMPREPLY=( $( compgen -W '@content' -- "$cur" ) )
-    fi
-} &&
-
-complete -F _chocolate_heretic chocolate-heretic
-
-# ex: ts=4 sw=4 et filetype=sh
--- /dev/null
+++ b/man/bash-completion/heretic.template.in
@@ -1,0 +1,48 @@
+# bash completion for @PACKAGE_SHORTNAME@ Heretic            -*- shell-script -*-
+
+_@PROGRAM_SPREFIX@_heretic()
+{
+    local cur prev words cword
+    _init_completion || return
+
+    # Save the previous switch on the command line in the prevsw variable
+    local i prevsw=""
+    for (( i=1; $cword > 1 && i <= $cword; i++ )); do
+        if [[ ${words[i]} == -* ]]; then
+            prevsw=${words[i]}
+        fi
+    done
+
+    # Allow adding more than one file with the same extension to the same switch
+    case $prevsw in
+        -config|-extraconfig)
+            _filedir cfg
+            ;;
+        -file|-iwad|-aa|-af|-as|-merge|-nwtmerge)
+            _filedir wad
+            ;;
+        -playdemo|-timedemo)
+            _filedir lmp
+            ;;
+        -deh)
+            _filedir hhe
+            ;;
+    esac
+
+    case $prev in
+        -hhever)
+            COMPREPLY=(1.0 1.2 1.3)
+            ;;
+        -setmem)
+            COMPREPLY=(dos622 dos71 dosbox)
+            ;;
+    esac
+
+    if [[ $cur == -* ]]; then
+        COMPREPLY=( $( compgen -W '@content' -- "$cur" ) )
+    fi
+} &&
+
+complete -F _@PROGRAM_SPREFIX@_heretic @PROGRAM_PREFIX@heretic
+
+# ex: ts=4 sw=4 et filetype=sh
--- a/man/bash-completion/hexen.template
+++ /dev/null
@@ -1,42 +1,0 @@
-# bash completion for Chocolate Hexen                     -*- shell-script -*-
-
-_chocolate_hexen()
-{
-    local cur prev words cword
-    _init_completion || return
-
-    # Save the previous switch on the command line in the prevsw variable
-    local i prevsw=""
-    for (( i=1; $cword > 1 && i <= $cword; i++ )); do
-        if [[ ${words[i]} == -* ]]; then
-            prevsw=${words[i]}
-        fi
-    done
-
-    # Allow adding more than one file with the same extension to the same switch
-    case $prevsw in
-        -config|-extraconfig)
-            _filedir cfg
-            ;;
-        -file|-iwad|-aa|-af|-as|-merge|-nwtmerge)
-            _filedir wad
-            ;;
-        -playdemo|-timedemo)
-            _filedir lmp
-            ;;
-    esac
-
-    case $prev in
-        -setmem)
-            COMPREPLY=(dos622 dos71 dosbox)
-            ;;
-    esac
-
-    if [[ $cur == -* ]]; then
-        COMPREPLY=( $( compgen -W '@content' -- "$cur" ) )
-    fi
-} &&
-
-complete -F _chocolate_hexen chocolate-hexen
-
-# ex: ts=4 sw=4 et filetype=sh
--- /dev/null
+++ b/man/bash-completion/hexen.template.in
@@ -1,0 +1,42 @@
+# bash completion for @PACKAGE_SHORTNAME@ Hexen              -*- shell-script -*-
+
+_@PROGRAM_SPREFIX@_hexen()
+{
+    local cur prev words cword
+    _init_completion || return
+
+    # Save the previous switch on the command line in the prevsw variable
+    local i prevsw=""
+    for (( i=1; $cword > 1 && i <= $cword; i++ )); do
+        if [[ ${words[i]} == -* ]]; then
+            prevsw=${words[i]}
+        fi
+    done
+
+    # Allow adding more than one file with the same extension to the same switch
+    case $prevsw in
+        -config|-extraconfig)
+            _filedir cfg
+            ;;
+        -file|-iwad|-aa|-af|-as|-merge|-nwtmerge)
+            _filedir wad
+            ;;
+        -playdemo|-timedemo)
+            _filedir lmp
+            ;;
+    esac
+
+    case $prev in
+        -setmem)
+            COMPREPLY=(dos622 dos71 dosbox)
+            ;;
+    esac
+
+    if [[ $cur == -* ]]; then
+        COMPREPLY=( $( compgen -W '@content' -- "$cur" ) )
+    fi
+} &&
+
+complete -F _@PROGRAM_SPREFIX@_hexen @PROGRAM_PREFIX@hexen
+
+# ex: ts=4 sw=4 et filetype=sh
--- a/man/bash-completion/strife.template
+++ /dev/null
@@ -1,48 +1,0 @@
-# bash completion for Chocolate Strife                     -*- shell-script -*-
-
-_chocolate_strife()
-{
-    local cur prev words cword
-    _init_completion || return
-
-    # Save the previous switch on the command line in the prevsw variable
-    local i prevsw=""
-    for (( i=1; $cword > 1 && i <= $cword; i++ )); do
-        if [[ ${words[i]} == -* ]]; then
-            prevsw=${words[i]}
-        fi
-    done
-
-    # Allow adding more than one file with the same extension to the same switch
-    case $prevsw in
-        -config|-extraconfig)
-            _filedir cfg
-            ;;
-        -file|-iwad|-aa|-af|-as|-merge|-nwtmerge)
-            _filedir wad
-            ;;
-        -playdemo|-timedemo)
-            _filedir lmp
-            ;;
-        -deh)
-            _filedir seh
-            ;;
-    esac
-
-    case $prev in
-        -gameversion)
-            COMPREPLY=(1.2 1.31)
-            ;;
-        -setmem)
-            COMPREPLY=(dos622 dos71 dosbox)
-            ;;
-    esac
-
-    if [[ $cur == -* ]]; then
-        COMPREPLY=( $( compgen -W '@content' -- "$cur" ) )
-    fi
-} &&
-
-complete -F _chocolate_strife chocolate-strife
-
-# ex: ts=4 sw=4 et filetype=sh
--- /dev/null
+++ b/man/bash-completion/strife.template.in
@@ -1,0 +1,48 @@
+# bash completion for @PACKAGE_SHORTNAME@ Strife             -*- shell-script -*-
+
+_@PROGRAM_SPREFIX@_strife()
+{
+    local cur prev words cword
+    _init_completion || return
+
+    # Save the previous switch on the command line in the prevsw variable
+    local i prevsw=""
+    for (( i=1; $cword > 1 && i <= $cword; i++ )); do
+        if [[ ${words[i]} == -* ]]; then
+            prevsw=${words[i]}
+        fi
+    done
+
+    # Allow adding more than one file with the same extension to the same switch
+    case $prevsw in
+        -config|-extraconfig)
+            _filedir cfg
+            ;;
+        -file|-iwad|-aa|-af|-as|-merge|-nwtmerge)
+            _filedir wad
+            ;;
+        -playdemo|-timedemo)
+            _filedir lmp
+            ;;
+        -deh)
+            _filedir seh
+            ;;
+    esac
+
+    case $prev in
+        -gameversion)
+            COMPREPLY=(1.2 1.31)
+            ;;
+        -setmem)
+            COMPREPLY=(dos622 dos71 dosbox)
+            ;;
+    esac
+
+    if [[ $cur == -* ]]; then
+        COMPREPLY=( $( compgen -W '@content' -- "$cur" ) )
+    fi
+} &&
+
+complete -F _@PROGRAM_SPREFIX@_strife @PROGRAM_PREFIX@strife
+
+# ex: ts=4 sw=4 et filetype=sh
--- a/src/d_iwad.c
+++ b/src/d_iwad.c
@@ -650,6 +650,11 @@
     // source ports is /usr/share/games/doom - we support this through the
     // XDG_DATA_DIRS mechanism, through which it can be overridden.
     AddIWADPath(env, "/games/doom");
+
+    // The convention set by RBDOOM-3-BFG is to install Doom 3: BFG
+    // Edition into this directory, under which includes the Doom
+    // Classic WADs.
+    AddIWADPath(env, "/games/doom3bfg/base/wads");
 }
 #endif
 
--- a/src/doom/doomdata.h
+++ b/src/doom/doomdata.h
@@ -54,16 +54,16 @@
 
 
 // A single Vertex.
-typedef struct
+typedef PACKED_STRUCT (
 {
   short		x;
   short		y;
-} PACKEDATTR mapvertex_t;
+}) mapvertex_t;
 
 
 // A SideDef, defining the visual appearance of a wall,
 // by setting textures and offsets.
-typedef struct
+typedef PACKED_STRUCT (
 {
   short		textureoffset;
   short		rowoffset;
@@ -72,13 +72,13 @@
   char		midtexture[8];
   // Front sector, towards viewer.
   short		sector;
-} PACKEDATTR mapsidedef_t;
+}) mapsidedef_t;
 
 
 
 // A LineDef, as used for editing, and as input
 // to the BSP builder.
-typedef struct
+typedef PACKED_STRUCT (
 {
   short		v1;
   short		v2;
@@ -87,7 +87,7 @@
   short		tag;
   // sidenum[1] will be -1 if one sided
   short		sidenum[2];		
-} PACKEDATTR maplinedef_t;
+}) maplinedef_t;
 
 
 //
@@ -135,7 +135,7 @@
 
 
 // Sector definition, from editing.
-typedef	struct
+typedef	PACKED_STRUCT (
 {
   short		floorheight;
   short		ceilingheight;
@@ -144,20 +144,20 @@
   short		lightlevel;
   short		special;
   short		tag;
-} PACKEDATTR mapsector_t;
+}) mapsector_t;
 
 // SubSector, as generated by BSP.
-typedef struct
+typedef PACKED_STRUCT (
 {
   short		numsegs;
   // Index of first one, segs are stored sequentially.
   short		firstseg;	
-} PACKEDATTR mapsubsector_t;
+}) mapsubsector_t;
 
 
 // LineSeg, generated by splitting LineDefs
 // using partition lines selected by BSP builder.
-typedef struct
+typedef PACKED_STRUCT (
 {
   short		v1;
   short		v2;
@@ -165,7 +165,7 @@
   short		linedef;
   short		side;
   short		offset;
-} PACKEDATTR mapseg_t;
+}) mapseg_t;
 
 
 
@@ -174,7 +174,7 @@
 // Indicate a leaf.
 #define	NF_SUBSECTOR	0x8000
 
-typedef struct
+typedef PACKED_STRUCT (
 {
   // Partition line from (x,y) to x+dx,y+dy)
   short		x;
@@ -190,7 +190,7 @@
   // else it's a node of another subtree.
   unsigned short	children[2];
 
-} PACKEDATTR mapnode_t;
+}) mapnode_t;
 
 
 
@@ -197,7 +197,7 @@
 
 // Thing definition, position, orientation and type,
 // plus skill/visibility flags and attributes.
-typedef struct
+typedef PACKED_STRUCT (
 {
     short		x;
     short		y;
@@ -204,7 +204,7 @@
     short		angle;
     short		type;
     short		options;
-} PACKEDATTR mapthing_t;
+}) mapthing_t;
 
 
 
--- a/src/doom/p_setup.c
+++ b/src/doom/p_setup.c
@@ -677,11 +677,13 @@
 
     unsigned int rejectpad[4] =
     {
-        ((totallines * 4 + 3) & ~3) + 24,     // Size
+        0,                                    // Size
         0,                                    // Part of z_zone block header
         50,                                   // PU_LEVEL
         0x1d4a11                              // DOOM_CONST_ZONEID
     };
+
+    rejectpad[0] = ((totallines * 4 + 3) & ~3) + 24;
 
     // Copy values from rejectpad into the destination array.
 
--- a/src/doom/r_data.c
+++ b/src/doom/r_data.c
@@ -56,7 +56,7 @@
 // into the rectangular texture space using origin
 // and possibly other attributes.
 //
-typedef struct
+typedef PACKED_STRUCT (
 {
     short	originx;
     short	originy;
@@ -63,7 +63,7 @@
     short	patch;
     short	stepdir;
     short	colormap;
-} PACKEDATTR mappatch_t;
+}) mappatch_t;
 
 
 //
@@ -71,7 +71,7 @@
 // A DOOM wall texture is a list of patches
 // which are to be combined in a predefined order.
 //
-typedef struct
+typedef PACKED_STRUCT (
 {
     char		name[8];
     int			masked;	
@@ -80,7 +80,7 @@
     int                 obsolete;
     short		patchcount;
     mappatch_t	patches[1];
-} PACKEDATTR maptexture_t;
+}) maptexture_t;
 
 
 // A single patch from a texture definition,
--- a/src/doomtype.h
+++ b/src/doomtype.h
@@ -63,7 +63,15 @@
 #define PACKEDATTR
 #endif
 
-// C99 integer types; with gcc we just use this.  Other compilers 
+#ifdef __WATCOMC__
+#define PACKEDPREFIX _Packed
+#else
+#define PACKEDPREFIX
+#endif
+
+#define PACKED_STRUCT(...) PACKEDPREFIX struct __VA_ARGS__ PACKEDATTR
+
+// C99 integer types; with gcc we just use this.  Other compilers
 // should add conditional statements that define the C99 types.
 
 // What is really wanted here is stdint.h; however, some old versions
--- a/src/heretic/d_main.c
+++ b/src/heretic/d_main.c
@@ -456,15 +456,6 @@
     {
         return;
     }
-    // haleyjd FIXME: convert to textscreen code?
-#ifdef __WATCOMC__
-    _settextposition(23, 2);
-    _setbkcolor(1);
-    _settextcolor(0);
-    _outtext(exrnwads);
-    _settextposition(24, 2);
-    _outtext(exrnwads2);
-#endif
 }
 
 boolean D_AddFile(char *file)
@@ -550,41 +541,6 @@
         return;
     }
 
-#if 0
-    progress = (98 * thermCurrent) / thermMax;
-    screen = (char *) 0xb8000 + (THERM_Y * 160 + THERM_X * 2);
-    for (i = 0; i < progress / 2; i++)
-    {
-        switch (i)
-        {
-            case 4:
-            case 9:
-            case 14:
-            case 19:
-            case 29:
-            case 34:
-            case 39:
-            case 44:
-                *screen++ = 0xb3;
-                *screen++ = (THERMCOLOR << 4) + 15;
-                break;
-            case 24:
-                *screen++ = 0xba;
-                *screen++ = (THERMCOLOR << 4) + 15;
-                break;
-            default:
-                *screen++ = 0xdb;
-                *screen++ = 0x40 + THERMCOLOR;
-                break;
-        }
-    }
-    if (progress & 1)
-    {
-        *screen++ = 0xdd;
-        *screen++ = 0x40 + THERMCOLOR;
-    }
-#else
-
     // No progress? Don't update the screen.
 
     progress = (50 * thermCurrent) / thermMax + 2;
@@ -607,7 +563,6 @@
     }
 
     TXT_UpdateScreen();
-#endif
 }
 
 void initStartup(void)
@@ -658,39 +613,7 @@
 char tmsg[300];
 void tprintf(char *msg, int initflag)
 {
-    // haleyjd FIXME: convert to textscreen code?
-#ifdef __WATCOMC__
-    char temp[80];
-    int start;
-    int add;
-    int i;
-
-    if (initflag)
-        tmsg[0] = 0;
-    M_StringConcat(tmsg, msg, sizeof(tmsg));
-    blitStartup();
-    DrawThermo();
-    _setbkcolor(4);
-    _settextcolor(15);
-    for (add = start = i = 0; i <= strlen(tmsg); i++)
-        if ((tmsg[i] == '\n') || (!tmsg[i]))
-        {
-            memset(temp, 0, 80);
-            M_StringCopy(temp, tmsg + start, sizeof(temp));
-            if (i - start < sizeof(temp))
-            {
-                temp[i - start] = '\0';
-            }
-            _settextposition(MSG_Y + add, 40 - strlen(temp) / 2);
-            _outtext(temp);
-            start = i + 1;
-            add++;
-        }
-    _settextposition(25, 1);
-    drawstatus();
-#else
     printf("%s", msg);
-#endif
 }
 
 // haleyjd: moved up, removed WATCOMC code
--- a/src/heretic/doomdata.h
+++ b/src/heretic/doomdata.h
@@ -48,26 +48,26 @@
 };
 
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     short x, y;
-} PACKEDATTR mapvertex_t;
+}) mapvertex_t;
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     short textureoffset;
     short rowoffset;
     char toptexture[8], bottomtexture[8], midtexture[8];
     short sector;               // on viewer's side
-} PACKEDATTR mapsidedef_t;
+}) mapsidedef_t;
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     short v1, v2;
     short flags;
     short special, tag;
     short sidenum[2];           // sidenum[1] will be -1 if one sided
-} PACKEDATTR maplinedef_t;
+}) maplinedef_t;
 
 #define	ML_BLOCKING			1
 #define	ML_BLOCKMONSTERS	2
@@ -88,43 +88,43 @@
 #define	ML_MAPPED			256     // set if allready drawn in automap
 
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     short floorheight, ceilingheight;
     char floorpic[8], ceilingpic[8];
     short lightlevel;
     short special, tag;
-} PACKEDATTR mapsector_t;
+}) mapsector_t;
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     short numsegs;
     short firstseg;             // segs are stored sequentially
-} PACKEDATTR mapsubsector_t;
+}) mapsubsector_t;
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     short v1, v2;
     short angle;
     short linedef, side;
     short offset;
-} PACKEDATTR mapseg_t;
+}) mapseg_t;
 
 #define	NF_SUBSECTOR	0x8000
-typedef struct
+typedef PACKED_STRUCT (
 {
     short x, y, dx, dy;         // partition line
     short bbox[2][4];           // bounding box for each child
     unsigned short children[2]; // if NF_SUBSECTOR its a subsector
-} PACKEDATTR mapnode_t;
+}) mapnode_t;
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     short x, y;
     short angle;
     short type;
     short options;
-} PACKEDATTR mapthing_t;
+}) mapthing_t;
 
 #define	MTF_EASY		1
 #define	MTF_NORMAL		2
@@ -139,7 +139,7 @@
 ===============================================================================
 */
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     short originx;
     short originy;
@@ -146,9 +146,9 @@
     short patch;
     short stepdir;
     short colormap;
-} PACKEDATTR mappatch_t;
+}) mappatch_t;
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     char name[8];
     boolean masked;
@@ -157,7 +157,7 @@
     int obsolete;
     short patchcount;
     mappatch_t patches[1];
-} PACKEDATTR maptexture_t;
+}) maptexture_t;
 
 
 /*
--- a/src/hexen/h2_main.c
+++ b/src/hexen/h2_main.c
@@ -187,7 +187,7 @@
     {
         // only get hexen.cfg path if one is not already found
 
-        if (!strcmp(SavePathConfig, ""))
+        if (SavePathConfig == NULL || !strcmp(SavePathConfig, ""))
         {
             // If we are not using a savegame path (probably because we are on
             // Windows and not using a config dir), behave like Vanilla Hexen
--- a/src/hexen/p_acs.c
+++ b/src/hexen/p_acs.c
@@ -45,12 +45,12 @@
 
 // TYPES -------------------------------------------------------------------
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     int marker;
     int infoOffset;
     int code;
-} PACKEDATTR acsHeader_t;
+}) acsHeader_t;
 
 // EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
 
--- a/src/hexen/xddefs.h
+++ b/src/hexen/xddefs.h
@@ -44,13 +44,13 @@
     ML_BEHAVIOR
 };
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     short x;
     short y;
-} PACKEDATTR mapvertex_t;
+})  mapvertex_t;
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     short textureoffset;
     short rowoffset;
@@ -58,9 +58,9 @@
     char bottomtexture[8];
     char midtexture[8];
     short sector;               // on viewer's side
-} PACKEDATTR mapsidedef_t;
+}) mapsidedef_t;
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     short v1;
     short v2;
@@ -72,7 +72,7 @@
     byte arg4;
     byte arg5;
     short sidenum[2];           // sidenum[1] will be -1 if one sided
-} PACKEDATTR maplinedef_t;
+}) maplinedef_t;
 
 #define	ML_BLOCKING			0x0001
 #define	ML_BLOCKMONSTERS	0x0002
@@ -96,7 +96,7 @@
 #define SPAC_PUSH		4       // when player/monster pushes line
 #define SPAC_PCROSS		5       // when projectile crosses line
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     short floorheight;
     short ceilingheight;
@@ -105,15 +105,15 @@
     short lightlevel;
     short special;
     short tag;
-} PACKEDATTR mapsector_t;
+}) mapsector_t;
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     short numsegs;
     short firstseg;             // segs are stored sequentially
-} PACKEDATTR mapsubsector_t;
+}) mapsubsector_t;
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     short v1;
     short v2;
@@ -121,17 +121,17 @@
     short linedef;
     short side;
     short offset;
-} PACKEDATTR mapseg_t;
+}) mapseg_t;
 
 #define	NF_SUBSECTOR	0x8000
-typedef struct
+typedef PACKED_STRUCT (
 {
     short x, y, dx, dy;         // partition line
     short bbox[2][4];           // bounding box for each child
     unsigned short children[2]; // if NF_SUBSECTOR its a subsector
-} PACKEDATTR mapnode_t;
+}) mapnode_t;
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     short tid;
     short x;
@@ -146,7 +146,7 @@
     byte arg3;
     byte arg4;
     byte arg5;
-} PACKEDATTR mapthing_t;
+}) mapthing_t;
 
 #define MTF_EASY		1
 #define MTF_NORMAL		2
@@ -166,7 +166,7 @@
 //
 //--------------------------------------------------------------------------
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     short originx;
     short originy;
@@ -173,9 +173,9 @@
     short patch;
     short stepdir;
     short colormap;
-} PACKEDATTR mappatch_t;
+}) mappatch_t;
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     char name[8];
     boolean masked;
@@ -184,6 +184,6 @@
     int obsolete;
     short patchcount;
     mappatch_t patches[1];
-} PACKEDATTR maptexture_t;
+}) maptexture_t;
 
 #endif // __XDDEFS__
--- a/src/i_oplmusic.c
+++ b/src/i_oplmusic.c
@@ -46,7 +46,7 @@
 
 #define PERCUSSION_LOG_LEN 16
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     byte tremolo;
     byte attack;
@@ -54,9 +54,9 @@
     byte waveform;
     byte scale;
     byte level;
-} PACKEDATTR genmidi_op_t;
+}) genmidi_op_t;
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     genmidi_op_t modulator;
     byte feedback;
@@ -63,9 +63,9 @@
     genmidi_op_t carrier;
     byte unused;
     short base_note_offset;
-} PACKEDATTR genmidi_voice_t;
+}) genmidi_voice_t;
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     unsigned short flags;
     byte fine_tuning;
@@ -72,7 +72,7 @@
     byte fixed_note;
 
     genmidi_voice_t voices[2];
-} PACKEDATTR genmidi_instr_t;
+}) genmidi_instr_t;
 
 // Data associated with a channel of a track that is currently playing.
 
--- a/src/midifile.c
+++ b/src/midifile.c
@@ -33,19 +33,19 @@
 #pragma pack(push, 1)
 #endif
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     byte chunk_id[4];
     unsigned int chunk_size;
-} PACKEDATTR chunk_header_t;
+}) chunk_header_t;
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     chunk_header_t chunk_header;
     unsigned short format_type;
     unsigned short num_tracks;
     unsigned short time_division;
-} PACKEDATTR midi_header_t;
+}) midi_header_t;
 
 // haleyjd 09/09/10: packing off.
 #ifdef _MSC_VER
--- a/src/mus2mid.c
+++ b/src/mus2mid.c
@@ -53,7 +53,7 @@
 } midievent;
 
 // Structure to hold MUS file header
-typedef struct
+typedef PACKED_STRUCT (
 {
     byte id[4];
     unsigned short scorelength;
@@ -61,7 +61,7 @@
     unsigned short primarychannels;
     unsigned short secondarychannels;
     unsigned short instrumentcount;
-} PACKEDATTR musheader;
+}) musheader;
 
 // Standard MIDI type 0 header + track header
 static const byte midiheader[] =
--- a/src/strife/doomdata.h
+++ b/src/strife/doomdata.h
@@ -54,16 +54,16 @@
 
 
 // A single Vertex.
-typedef struct
+typedef PACKED_STRUCT (
 {
   short		x;
   short		y;
-} PACKEDATTR mapvertex_t;
+}) mapvertex_t;
 
 
 // A SideDef, defining the visual appearance of a wall,
 // by setting textures and offsets.
-typedef struct
+typedef PACKED_STRUCT (
 {
   short		textureoffset;
   short		rowoffset;
@@ -72,13 +72,13 @@
   char		midtexture[8];
   // Front sector, towards viewer.
   short		sector;
-} PACKEDATTR mapsidedef_t;
+}) mapsidedef_t;
 
 
 
 // A LineDef, as used for editing, and as input
 // to the BSP builder.
-typedef struct
+typedef PACKED_STRUCT (
 {
   short		v1;
   short		v2;
@@ -87,7 +87,7 @@
   short		tag;
   // sidenum[1] will be -1 if one sided
   short		sidenum[2];		
-} PACKEDATTR maplinedef_t;
+}) maplinedef_t;
 
 
 //
@@ -147,7 +147,7 @@
 
 
 // Sector definition, from editing.
-typedef	struct
+typedef	PACKED_STRUCT (
 {
   short		floorheight;
   short		ceilingheight;
@@ -156,20 +156,20 @@
   short		lightlevel;
   short		special;
   short		tag;
-} PACKEDATTR mapsector_t;
+}) mapsector_t;
 
 // SubSector, as generated by BSP.
-typedef struct
+typedef PACKED_STRUCT (
 {
   short		numsegs;
   // Index of first one, segs are stored sequentially.
   short		firstseg;	
-} PACKEDATTR mapsubsector_t;
+}) mapsubsector_t;
 
 
 // LineSeg, generated by splitting LineDefs
 // using partition lines selected by BSP builder.
-typedef struct
+typedef PACKED_STRUCT (
 {
   short		v1;
   short		v2;
@@ -177,7 +177,7 @@
   short		linedef;
   short		side;
   short		offset;
-} PACKEDATTR mapseg_t;
+}) mapseg_t;
 
 
 
@@ -186,7 +186,7 @@
 // Indicate a leaf.
 #define	NF_SUBSECTOR	0x8000
 
-typedef struct
+typedef PACKED_STRUCT (
 {
   // Partition line from (x,y) to x+dx,y+dy)
   short		x;
@@ -202,7 +202,7 @@
   // else it's a node of another subtree.
   unsigned short	children[2];
 
-} PACKEDATTR mapnode_t;
+}) mapnode_t;
 
 
 
@@ -209,7 +209,7 @@
 
 // Thing definition, position, orientation and type,
 // plus skill/visibility flags and attributes.
-typedef struct
+typedef PACKED_STRUCT (
 {
     short		x;
     short		y;
@@ -216,7 +216,7 @@
     short		angle;
     short		type;
     short		options;
-} PACKEDATTR mapthing_t;
+}) mapthing_t;
 
 
 
--- a/src/strife/m_saves.c
+++ b/src/strife/m_saves.c
@@ -25,6 +25,8 @@
 #include <win_opendir.h>
 #elif defined(__GNUC__) || defined(POSIX)
 #include <dirent.h>
+#elif defined(__WATCOMC__)
+#include <direct.h>
 #else
 #error Need an include for dirent.h!
 #endif
--- a/src/strife/p_setup.c
+++ b/src/strife/p_setup.c
@@ -670,11 +670,13 @@
 
     unsigned int rejectpad[4] =
     {
-        ((totallines * 4 + 3) & ~3) + 24,     // Size
+        0,                                    // Size
         0,                                    // Part of z_zone block header
         50,                                   // PU_LEVEL
         0x1d4a11                              // DOOM_CONST_ZONEID
     };
+
+    rejectpad[0] = ((totallines * 4 + 3) & ~3) + 24;
 
     // Copy values from rejectpad into the destination array.
 
--- a/src/strife/r_data.c
+++ b/src/strife/r_data.c
@@ -52,7 +52,7 @@
 // into the rectangular texture space using origin
 // and possibly other attributes.
 //
-typedef struct
+typedef PACKED_STRUCT (
 {
     short	originx;
     short	originy;
@@ -59,7 +59,7 @@
     short	patch;
     //short	stepdir;    // villsa [STRIFE] removed
     //short	colormap;   // villsa [STRIFE] removed
-} PACKEDATTR mappatch_t;
+}) mappatch_t;
 
 
 //
@@ -67,7 +67,7 @@
 // A DOOM wall texture is a list of patches
 // which are to be combined in a predefined order.
 //
-typedef struct
+typedef PACKED_STRUCT (
 {
     char		name[8];
     int			masked;	
@@ -76,7 +76,7 @@
     //int               obsolete;   // villsa [STRIFE] removed
     short		patchcount;
     mappatch_t	patches[1];
-} PACKEDATTR maptexture_t;
+}) maptexture_t;
 
 
 // A single patch from a texture definition,
--- a/src/v_patch.h
+++ b/src/v_patch.h
@@ -26,22 +26,22 @@
 // and we compose textures from the TEXTURE1/2 lists
 // of patches.
 
-typedef struct 
-{ 
-    short		width;		// bounding box size 
-    short		height; 
-    short		leftoffset;	// pixels to the left of origin 
-    short		topoffset;	// pixels below the origin 
+typedef PACKED_STRUCT (
+{
+    short		width;		// bounding box size
+    short		height;
+    short		leftoffset;	// pixels to the left of origin
+    short		topoffset;	// pixels below the origin
     int			columnofs[8];	// only [width] used
-    // the [0] is &columnofs[width] 
-} PACKEDATTR patch_t;
+    // the [0] is &columnofs[width]
+}) patch_t;
 
 // posts are runs of non masked source pixels
-typedef struct
+typedef PACKED_STRUCT (
 {
     byte		topdelta;	// -1 is the last post in a column
     byte		length; 	// length data bytes follows
-} PACKEDATTR post_t;
+}) post_t;
 
 // column_t is a list of 0 or more post_t, (byte)-1 terminated
 typedef post_t	column_t;
--- a/src/v_video.c
+++ b/src/v_video.c
@@ -624,7 +624,7 @@
 // SCREEN SHOTS
 //
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     char		manufacturer;
     char		version;
@@ -648,7 +648,7 @@
     
     char		filler[58];
     unsigned char	data;		// unbounded
-} PACKEDATTR pcx_t;
+}) pcx_t;
 
 
 //
--- a/src/w_wad.c
+++ b/src/w_wad.c
@@ -35,21 +35,21 @@
 
 #include "w_wad.h"
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     // Should be "IWAD" or "PWAD".
     char		identification[4];
     int			numlumps;
     int			infotableofs;
-} PACKEDATTR wadinfo_t;
+}) wadinfo_t;
 
 
-typedef struct
+typedef PACKED_STRUCT (
 {
     int			filepos;
     int			size;
     char		name[8];
-} PACKEDATTR filelump_t;
+}) filelump_t;
 
 //
 // GLOBALS