shithub: choc

Download patch

ref: d0d3b5a6945ece4bd6c8bb1102e8fe55f25852e8
parent: fd40e07993f83ecb222246d3137949b067c30fce
author: Simon Howard <fraggle@gmail.com>
date: Fri Feb 3 13:41:26 EST 2006

Support NWT-style WAD merging (-af and -as command line parameters).
Restructure WAD loading so that merged WADs are always loaded before
normal PWADs. Remove W_InitMultipleFiles().

Subversion-branch: /trunk/chocolate-doom
Subversion-revision: 362

--- a/src/d_main.c
+++ b/src/d_main.c
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: d_main.c 336 2006-01-23 00:47:16Z fraggle $
+// $Id: d_main.c 362 2006-02-03 18:41:26Z fraggle $
 //
 // Copyright(C) 1993-1996 Id Software, Inc.
 // Copyright(C) 2005 Simon Howard
@@ -22,6 +22,11 @@
 // 02111-1307, USA.
 //
 // $Log$
+// Revision 1.42  2006/02/03 18:41:26  fraggle
+// Support NWT-style WAD merging (-af and -as command line parameters).
+// Restructure WAD loading so that merged WADs are always loaded before
+// normal PWADs.  Remove W_InitMultipleFiles().
+//
 // Revision 1.41  2006/01/23 00:47:16  fraggle
 // Rearrange the order of startup code to allow replacing the IWAD filename via dehacked
 //
@@ -179,7 +184,7 @@
 //-----------------------------------------------------------------------------
 
 
-static const char rcsid[] = "$Id: d_main.c 336 2006-01-23 00:47:16Z fraggle $";
+static const char rcsid[] = "$Id: d_main.c 362 2006-02-03 18:41:26Z fraggle $";
 
 #define	BGCOLOR		7
 #define	FGCOLOR		8
@@ -259,7 +264,6 @@
 // location of IWAD and WAD files
 
 char *          iwadfile;
-char *          wadfiles[MAXWADFILES];
 
 
 boolean		devparm;	// started game with -devparm
@@ -720,24 +724,13 @@
 char            title[128];
 
 
-
-//
-// D_AddFile
-//
-void D_AddFile (char *file)
+static void D_AddFile(char *filename)
 {
-    int     numwadfiles;
-    char    *newfile;
-	
-    for (numwadfiles = 0 ; wadfiles[numwadfiles] ; numwadfiles++)
-	;
-
-    newfile = malloc (strlen(file)+1);
-    strcpy (newfile, file);
-	
-    wadfiles[numwadfiles] = newfile;
+    printf(" adding %s\n", filename);
+    W_AddFile(filename);
 }
 
+
 // Check if a file exists
 
 static int FileExists(char *filename)
@@ -770,14 +763,11 @@
 };
 
 // Search a directory to try to find an IWAD
-// Returns non-zero if successful
+// Returns the location of the IWAD if found, otherwise NULL.
 
-static int SearchDirectoryForIWAD(char *dir)
+static char *SearchDirectoryForIWAD(char *dir)
 {
     int i;
-    int result;
- 
-    result = 0;
 
     for (i=0; i<sizeof(iwads) / sizeof(*iwads); ++i) 
     {
@@ -794,17 +784,13 @@
         {
             iwadfile = filename;
             gamemission = iwads[i].mission;
-            D_AddFile(filename);
-            result = 1;
-            break;
+            return filename;
         }
-        else
-        {
-            free(filename);
-        }
+
+        free(filename);
     }
 
-    return result;
+    return NULL;
 }
 
 // When given an IWAD with the '-iwad' parameter,
@@ -840,12 +826,13 @@
 // FindIWAD
 // Checks availability of IWAD files by name,
 // to determine whether registered/commercial features
-// should be executed (notably loading PWAD's).
+// should be executed (notably loading PWADs).
 //
+
 static void FindIWAD (void)
 {
     char *doomwaddir;
-    int result;
+    char *result;
     int iwadparm;
 
     result = 0;
@@ -855,9 +842,8 @@
     if (iwadparm)
     {
         iwadfile = myargv[iwadparm + 1];
-        D_AddFile(iwadfile);
+        result = iwadfile;
         IdentifyIWADByName(iwadfile);
-        result = 1;
     }
     else if (doomwaddir != NULL)
     {
@@ -864,14 +850,14 @@
         result = SearchDirectoryForIWAD(doomwaddir);
     }
 
-    if (result == 0)
-    {
-        result = SearchDirectoryForIWAD(".")
-              || SearchDirectoryForIWAD("/usr/share/games/doom")
-              || SearchDirectoryForIWAD("/usr/local/share/games/doom");
-    }
+    if (result == NULL)
+        result = SearchDirectoryForIWAD(".");
+    if (result == NULL)
+        result = SearchDirectoryForIWAD("/usr/share/games/doom");
+    if (result == NULL)
+        result = SearchDirectoryForIWAD("/usr/local/share/games/doom");
 
-    if (result == 0)
+    if (result == NULL)
     {
         I_Error("Game mode indeterminate.  No IWAD file was found.  Try\n"
                 "specifying one with the '-iwad' command line parameter.\n");
@@ -1340,7 +1326,6 @@
     }
 }
 
-
 //
 // D_DoomMain
 //
@@ -1404,6 +1389,86 @@
 	sidemove[1] = sidemove[1]*scale/100;
     }
     
+    // init subsystems
+    printf (DEH_String("V_Init: allocate screens.\n"));
+    V_Init ();
+
+    printf (DEH_String("M_LoadDefaults: Load system defaults.\n"));
+    M_LoadDefaults ();              // load before initing other systems
+
+    printf (DEH_String("W_Init: Init WADfiles.\n"));
+    D_AddFile(iwadfile);
+
+#ifdef FEATURE_WAD_MERGE
+    // Merged PWADs are loaded first, because they are supposed to be 
+    // modified IWADs.
+
+    p = M_CheckParm("-merge");
+
+    if (p > 0)
+    {
+        for (p = p + 1; p<myargc && myargv[p][0] != '-'; ++p)
+        {
+            printf(" merging %s\n", myargv[p]);
+            W_MergeFile(myargv[p]);
+        }
+    }
+
+    // NWT-style merging:
+
+    // Add flats
+
+    p = M_CheckParm("-af");
+
+    if (p > 0)
+    {
+        for (p = p + 1; p<myargc && myargv[p][0] != '-'; ++p)
+        {
+            printf(" merging flats from %s\n", myargv[p]);
+            W_NWTMergeFile(myargv[p], W_NWT_MERGE_FLATS);
+        }
+    }
+
+    // Add sprites
+
+    p = M_CheckParm("-as");
+
+    if (p > 0)
+    {
+        for (p = p + 1; p<myargc && myargv[p][0] != '-'; ++p)
+        {
+            printf(" merging sprites from %s\n", myargv[p]);
+            W_NWTMergeFile(myargv[p], W_NWT_MERGE_SPRITES);
+        }
+    }
+
+    // Add sprites AND flats
+
+    p = M_CheckParm("-aa");
+
+    if (p > 0)
+    {
+        for (p = p + 1; p<myargc && myargv[p][0] != '-'; ++p)
+        {
+            printf(" merging sprites and flats from %s\n", myargv[p]);
+            W_NWTMergeFile(myargv[p], W_NWT_MERGE_SPRITES | W_NWT_MERGE_FLATS);
+        }
+    }
+
+#endif
+
+    // Load normal PWADs
+
+    p = M_CheckParm ("-file");
+    if (p)
+    {
+	// the parms after p are wadfile/lump names,
+	// until end of parms or another - preceded parm
+	modifiedgame = true;            // homebrew levels
+	while (++p != myargc && myargv[p][0] != '-')
+	    D_AddFile (myargv[p]);
+    }
+
     // add any files specified on the command line with -file wadfile
     // to the wad list
     //
@@ -1438,16 +1503,6 @@
 	D_AddFile (file);
     }
 	
-    p = M_CheckParm ("-file");
-    if (p)
-    {
-	// the parms after p are wadfile/lump names,
-	// until end of parms or another - preceded parm
-	modifiedgame = true;            // homebrew levels
-	while (++p != myargc && myargv[p][0] != '-')
-	    D_AddFile (myargv[p]);
-    }
-
     p = M_CheckParm ("-playdemo");
 
     if (!p)
@@ -1460,28 +1515,6 @@
 	printf(DEH_String("Playing demo %s.lmp.\n"),myargv[p+1]);
     }
     
-    // init subsystems
-    printf (DEH_String("V_Init: allocate screens.\n"));
-    V_Init ();
-
-    printf (DEH_String("M_LoadDefaults: Load system defaults.\n"));
-    M_LoadDefaults ();              // load before initing other systems
-
-    printf (DEH_String("W_Init: Init WADfiles.\n"));
-    W_InitMultipleFiles (wadfiles);
-
-#ifdef FEATURE_WAD_MERGE
-    p = M_CheckParm("-merge");
-
-    if (p > 0)
-    {
-        for (p = p + 1; p<myargc && myargv[p][0] != '-'; ++p)
-        {
-            W_MergeFile(myargv[p]);
-        }
-    }
-#endif
-
     IdentifyVersion();
     InitGameVersion();
     SetGameDescription();
--- a/src/d_main.h
+++ b/src/d_main.h
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: d_main.h 241 2006-01-02 00:17:42Z fraggle $
+// $Id: d_main.h 362 2006-02-03 18:41:26Z fraggle $
 //
 // Copyright(C) 1993-1996 Id Software, Inc.
 // Copyright(C) 2005 Simon Howard
@@ -22,6 +22,11 @@
 // 02111-1307, USA.
 //
 // $Log$
+// Revision 1.5  2006/02/03 18:41:26  fraggle
+// Support NWT-style WAD merging (-af and -as command line parameters).
+// Restructure WAD loading so that merged WADs are always loaded before
+// normal PWADs.  Remove W_InitMultipleFiles().
+//
 // Revision 1.4  2006/01/02 00:17:42  fraggle
 // Encapsulate the event queue code properly.  Add a D_PopEvent function
 // to read a new event from the event queue.
@@ -47,13 +52,6 @@
 
 #include "d_event.h"
 
-
-
-
-#define MAXWADFILES             20
-extern char*		wadfiles[MAXWADFILES];
-
-void D_AddFile (char *file);
 
 
 
--- a/src/w_merge.c
+++ b/src/w_merge.c
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: w_merge.c 222 2005-10-23 20:22:35Z fraggle $
+// $Id: w_merge.c 362 2006-02-03 18:41:26Z fraggle $
 //
 // Copyright(C) 2005 Simon Howard
 //
@@ -21,6 +21,11 @@
 // 02111-1307, USA.
 //
 // $Log$
+// Revision 1.4  2006/02/03 18:41:26  fraggle
+// Support NWT-style WAD merging (-af and -as command line parameters).
+// Restructure WAD loading so that merged WADs are always loaded before
+// normal PWADs.  Remove W_InitMultipleFiles().
+//
 // Revision 1.3  2005/10/23 20:22:35  fraggle
 // Drastically refactor the WAD merging code.  Allow multiple replacements
 // of the same sprite in a PWAD (fixes Scientist 2)
@@ -44,6 +49,7 @@
 #include <string.h>
 
 #include "i_system.h"
+#include "w_merge.h"
 #include "w_wad.h"
 #include "z_zone.h"
 
@@ -552,15 +558,11 @@
 
     old_numlumps = numlumps;
 
-    W_AddFile(filename);
+    // Load PWAD
 
-    // failed to load?
-
-    if (numlumps == old_numlumps)
+    if (!W_AddFile(filename))
         return;
 
-    printf(" merging %s\n", filename);
-
     // iwad is at the start, pwad was appended to the end
 
     iwad.lumps = lumpinfo;
@@ -582,4 +584,72 @@
     DoMerge();
 }
 
+// Replace lumps in the given list with lumps from the PWAD
+
+static void W_NWTAddLumps(searchlist_t *list)
+{
+    int i;
+
+    // Go through the IWAD list given, replacing lumps with lumps of 
+    // the same name from the PWAD
+
+    for (i=0; i<list->numlumps; ++i)
+    {
+        int index;
+
+        index = FindInList(&pwad, list->lumps[i].name);
+
+        if (index > 0)
+        {
+            memcpy(&list->lumps[i], &pwad.lumps[index], 
+                   sizeof(lumpinfo_t));
+        }
+    }
+    
+}
+
+// Merge sprites and flats in the way NWT does with its -af and -as 
+// command-line options.
+
+void W_NWTMergeFile(char *filename, int flags)
+{
+    int old_numlumps;
+
+    old_numlumps = numlumps;
+
+    // Load PWAD
+
+    if (!W_AddFile(filename))
+        return;
+
+    // iwad is at the start, pwad was appended to the end
+
+    iwad.lumps = lumpinfo;
+    iwad.numlumps = old_numlumps;
+
+    pwad.lumps = lumpinfo + old_numlumps;
+    pwad.numlumps = numlumps - old_numlumps;
+    
+    // Setup sprite/flat lists
+
+    SetupLists();
+
+    // Merge in flats?
+    
+    if (flags & W_NWT_MERGE_FLATS)
+    {
+        W_NWTAddLumps(&iwad_flats);
+    }
+
+    // Sprites?
+
+    if (flags & W_NWT_MERGE_SPRITES)
+    {
+        W_NWTAddLumps(&iwad_sprites);
+    }
+    
+    // Discard the PWAD
+
+    numlumps = old_numlumps;
+}
 
--- a/src/w_merge.h
+++ b/src/w_merge.h
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: w_merge.h 168 2005-10-08 18:23:18Z fraggle $
+// $Id: w_merge.h 362 2006-02-03 18:41:26Z fraggle $
 //
 // Copyright(C) 2005 Simon Howard
 //
@@ -21,6 +21,11 @@
 // 02111-1307, USA.
 //
 // $Log$
+// Revision 1.2  2006/02/03 18:41:26  fraggle
+// Support NWT-style WAD merging (-af and -as command line parameters).
+// Restructure WAD loading so that merged WADs are always loaded before
+// normal PWADs.  Remove W_InitMultipleFiles().
+//
 // Revision 1.1  2005/10/08 18:23:18  fraggle
 // WAD merging code
 //
@@ -36,9 +41,16 @@
 #ifndef W_MERGE_H
 #define W_MERGE_H
 
+#define W_NWT_MERGE_SPRITES   0x1
+#define W_NWT_MERGE_FLATS     0x2
+
 // Add a new WAD and merge it into the main directory
 
 void W_MergeFile(char *filename);
+
+// NWT-style merging
+
+void W_NWTMergeFile(char *filename, int flags);
 
 #endif /* #ifndef W_MERGE_H */
 
--- a/src/w_wad.c
+++ b/src/w_wad.c
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: w_wad.c 342 2006-01-24 01:46:08Z fraggle $
+// $Id: w_wad.c 362 2006-02-03 18:41:26Z fraggle $
 //
 // Copyright(C) 1993-1996 Id Software, Inc.
 // Copyright(C) 2005 Simon Howard
@@ -22,6 +22,11 @@
 // 02111-1307, USA.
 //
 // $Log$
+// Revision 1.11  2006/02/03 18:41:26  fraggle
+// Support NWT-style WAD merging (-af and -as command line parameters).
+// Restructure WAD loading so that merged WADs are always loaded before
+// normal PWADs.  Remove W_InitMultipleFiles().
+//
 // Revision 1.10  2006/01/24 01:46:08  fraggle
 // More endianness fixes
 //
@@ -61,7 +66,7 @@
 
 
 static const char
-rcsid[] = "$Id: w_wad.c 342 2006-01-24 01:46:08Z fraggle $";
+rcsid[] = "$Id: w_wad.c 362 2006-02-03 18:41:26Z fraggle $";
 
 
 #include <ctype.h>
@@ -88,7 +93,7 @@
 
 // Location of each lump on disk.
 lumpinfo_t*		lumpinfo;		
-int			numlumps;
+int			numlumps = 0;
 
 #define strcmpi	strcasecmp
 
@@ -171,7 +176,7 @@
 char*			reloadname;
 
 
-void W_AddFile (char *filename)
+boolean W_AddFile (char *filename)
 {
     wadinfo_t		header;
     lumpinfo_t*		lump_p;
@@ -196,10 +201,9 @@
     if ( (handle = fopen(filename,"rb")) == NULL)
     {
 	printf (" couldn't open %s\n",filename);
-	return;
+	return false;
     }
 
-    printf (" adding %s\n",filename);
     startlump = numlumps;
 	
     if (strcmpi (filename+strlen(filename)-3 , "wad" ) )
@@ -259,6 +263,8 @@
 	fclose (handle);
 
     Z_Free(fileinfo);
+
+    return true;
 }
 
 
@@ -310,52 +316,6 @@
     fclose(handle);
 
     Z_Free(fileinfo);
-}
-
-
-
-//
-// W_InitMultipleFiles
-// Pass a null terminated list of files to use.
-// All files are optional, but at least one file
-//  must be found.
-// Files with a .wad extension are idlink files
-//  with multiple lumps.
-// Other files are single lumps with the base filename
-//  for the lump name.
-// Lump names can appear multiple times.
-// The name searcher looks backwards, so a later file
-//  does override all earlier ones.
-//
-void W_InitMultipleFiles (char** filenames)
-{	
-    // open all the files, load headers, and count lumps
-    numlumps = 0;
-
-    // will be realloced as lumps are added
-    lumpinfo = malloc(1);	
-
-    for ( ; *filenames ; filenames++)
-	W_AddFile (*filenames);
-
-    if (!numlumps)
-	I_Error ("W_InitFiles: no files found");
-}
-
-
-
-
-//
-// W_InitFile
-// Just initialize from a single file.
-//
-void W_InitFile (char* filename)
-{
-    char*	names[2];
-
-    names[0] = filename;
-    names[1] = NULL;
-    W_InitMultipleFiles (names);
 }
 
 
--- a/src/w_wad.h
+++ b/src/w_wad.h
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: w_wad.h 167 2005-10-08 18:22:46Z fraggle $
+// $Id: w_wad.h 362 2006-02-03 18:41:26Z fraggle $
 //
 // Copyright(C) 1993-1996 Id Software, Inc.
 // Copyright(C) 2005 Simon Howard
@@ -32,6 +32,7 @@
 
 #include <stdio.h>
 
+#include "doomtype.h"
 
 
 //
@@ -72,8 +73,7 @@
 extern	lumpinfo_t*	lumpinfo;
 extern	int		numlumps;
 
-void    W_AddFile (char *filename);
-void    W_InitMultipleFiles (char** filenames);
+boolean W_AddFile (char *filename);
 void    W_Reload (void);
 
 int	W_CheckNumForName (char* name);
@@ -92,6 +92,11 @@
 //-----------------------------------------------------------------------------
 //
 // $Log$
+// Revision 1.5  2006/02/03 18:41:26  fraggle
+// Support NWT-style WAD merging (-af and -as command line parameters).
+// Restructure WAD loading so that merged WADs are always loaded before
+// normal PWADs.  Remove W_InitMultipleFiles().
+//
 // Revision 1.4  2005/10/08 18:22:46  fraggle
 // Store the cache as part of the lumpinfo_t struct.  Add W_AddFile prototype
 // to header.