ref: 8c723c09234bbfdda47b12e65ca8dfbd58e18673
dir: /src/w_main.c/
//
// Copyright(C) 1993-1996 Id Software, Inc.
// Copyright(C) 2005-2014 Simon Howard
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// DESCRIPTION:
// Common code to parse command line, identifying WAD files to load.
//
#include <stdlib.h>
#include "config.h"
#include "d_iwad.h"
#include "i_glob.h"
#include "i_system.h"
#include "m_argv.h"
#include "w_main.h"
#include "w_merge.h"
#include "w_wad.h"
#include "z_zone.h"
// Parse the command line, merging WAD files that are sppecified.
// Returns true if at least one file was added.
boolean W_ParseCommandLine(void)
{
boolean modifiedgame = false;
int p;
// Merged PWADs are loaded first, because they are supposed to be
// modified IWADs.
//!
// @arg <files>
// @category mod
//
// Simulates the behavior of deutex's -merge option, merging a PWAD
// into the main IWAD. Multiple files may be specified.
//
p = M_CheckParmWithArgs("-merge", 1);
if (p > 0)
{
for (p = p + 1; p<myargc && myargv[p][0] != '-'; ++p)
{
char *filename;
modifiedgame = true;
filename = D_TryFindWADByName(myargv[p]);
printf(" merging %s\n", filename);
W_MergeFile(filename);
free(filename);
}
}
// NWT-style merging:
// NWT's -merge option:
//!
// @arg <files>
// @category mod
//
// Simulates the behavior of NWT's -merge option. Multiple files
// may be specified.
p = M_CheckParmWithArgs("-nwtmerge", 1);
if (p > 0)
{
for (p = p + 1; p<myargc && myargv[p][0] != '-'; ++p)
{
char *filename;
modifiedgame = true;
filename = D_TryFindWADByName(myargv[p]);
printf(" performing NWT-style merge of %s\n", filename);
W_NWTDashMerge(filename);
free(filename);
}
}
// Add flats
//!
// @arg <files>
// @category mod
//
// Simulates the behavior of NWT's -af option, merging flats into
// the main IWAD directory. Multiple files may be specified.
//
p = M_CheckParmWithArgs("-af", 1);
if (p > 0)
{
for (p = p + 1; p<myargc && myargv[p][0] != '-'; ++p)
{
char *filename;
modifiedgame = true;
filename = D_TryFindWADByName(myargv[p]);
printf(" merging flats from %s\n", filename);
W_NWTMergeFile(filename, W_NWT_MERGE_FLATS);
free(filename);
}
}
//!
// @arg <files>
// @category mod
//
// Simulates the behavior of NWT's -as option, merging sprites
// into the main IWAD directory. Multiple files may be specified.
//
p = M_CheckParmWithArgs("-as", 1);
if (p > 0)
{
for (p = p + 1; p<myargc && myargv[p][0] != '-'; ++p)
{
char *filename;
modifiedgame = true;
filename = D_TryFindWADByName(myargv[p]);
printf(" merging sprites from %s\n", filename);
W_NWTMergeFile(filename, W_NWT_MERGE_SPRITES);
free(filename);
}
}
//!
// @arg <files>
// @category mod
//
// Equivalent to "-af <files> -as <files>".
//
p = M_CheckParmWithArgs("-aa", 1);
if (p > 0)
{
for (p = p + 1; p<myargc && myargv[p][0] != '-'; ++p)
{
char *filename;
modifiedgame = true;
filename = D_TryFindWADByName(myargv[p]);
printf(" merging sprites and flats from %s\n", filename);
W_NWTMergeFile(filename, W_NWT_MERGE_SPRITES | W_NWT_MERGE_FLATS);
free(filename);
}
}
//!
// @arg <files>
// @vanilla
//
// Load the specified PWAD files.
//
p = M_CheckParmWithArgs ("-file", 1);
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] != '-')
{
char *filename;
filename = D_TryFindWADByName(myargv[p]);
printf(" adding %s\n", filename);
W_AddFile(filename);
free(filename);
}
}
// W_PrintDirectory();
return modifiedgame;
}
// Load all WAD files from the given directory.
void W_AutoLoadWADs(const char *path)
{
glob_t *glob;
const char *filename;
glob = I_StartMultiGlob(path, GLOB_FLAG_NOCASE|GLOB_FLAG_SORTED,
"*.wad", "*.lmp", NULL);
for (;;)
{
filename = I_NextGlob(glob);
if (filename == NULL)
{
break;
}
printf(" [autoload] merging %s\n", filename);
W_MergeFile(filename);
}
I_EndGlob(glob);
}
// Lump names that are unique to particular game types. This lets us check
// the user is not trying to play with the wrong executable, eg.
// chocolate-doom -iwad hexen.wad.
static const struct
{
GameMission_t mission;
const char *lumpname;
} unique_lumps[] = {
{ doom, "POSSA1" },
{ heretic, "IMPXA1" },
{ hexen, "ETTNA1" },
{ strife, "AGRDA1" },
};
void W_CheckCorrectIWAD(GameMission_t mission)
{
int i;
lumpindex_t lumpnum;
for (i = 0; i < arrlen(unique_lumps); ++i)
{
if (mission != unique_lumps[i].mission)
{
lumpnum = W_CheckNumForName(unique_lumps[i].lumpname);
if (lumpnum >= 0)
{
I_Error("\nYou are trying to use a %s IWAD file with "
"the %s%s binary.\nThis isn't going to work.\n"
"You probably want to use the %s%s binary.",
D_SuggestGameName(unique_lumps[i].mission,
indetermined),
PROGRAM_PREFIX,
D_GameMissionString(mission),
PROGRAM_PREFIX,
D_GameMissionString(unique_lumps[i].mission));
}
}
}
}