Commit 8d0ac9b2 authored by Fabian Greffrath's avatar Fabian Greffrath

New upstream version 5.4

parent f3f5d721
......@@ -26,5 +26,3 @@ script: ./.travis.sh
branches:
only:
- master
- sdl2-branch
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
cmake_minimum_required(VERSION 3.7.2)
project("Chocolate Doom" VERSION 3.0.0 LANGUAGES C)
project("Crispy Doom" VERSION 5.4.0 LANGUAGES C)
# Autotools variables
set(top_srcdir ${CMAKE_CURRENT_SOURCE_DIR})
......@@ -9,10 +9,10 @@ set(top_builddir ${CMAKE_CURRENT_BINARY_DIR})
# AC_INIT variables
set(PACKAGE_NAME "${PROJECT_NAME}")
set(PACKAGE_TARNAME "chocolate-doom")
set(PACKAGE_TARNAME "crispy-doom")
set(PACKAGE_VERSION "${PROJECT_VERSION}")
set(PACKAGE_STRING "${PROJECT_NAME} ${PROJECT_VERSION}")
set(PACKAGE_BUGREPORT "chocolate-doom-dev-list@chocolate-doom.org")
set(PACKAGE_BUGREPORT "https://github.com/fabiangreffrath/crispy-doom/issues")
string(REGEX REPLACE " Doom$" "" PACKAGE_SHORTNAME "${PACKAGE_NAME}")
set(PACKAGE_COPYRIGHT "Copyright (C) 1993-2017")
......@@ -47,8 +47,10 @@ endif()
find_package(m)
include(CheckSymbolExists)
include(CheckIncludeFile)
check_symbol_exists(strcasecmp "strings.h" HAVE_DECL_STRCASECMP)
check_symbol_exists(strncasecmp "strings.h" HAVE_DECL_STRNCASECMP)
check_include_file("dirent.h" HAVE_DIRENT_H)
string(CONCAT WINDOWS_RC_VERSION "${PROJECT_VERSION_MAJOR}, "
"${PROJECT_VERSION_MINOR}, ${PROJECT_VERSION_PATCH}, 0")
......
This diff is collapsed.
This diff is collapsed.
codeblocks/config.h
codeblocks/game-res.rc
codeblocks/server.cbp
codeblocks/setup-res.rc
codeblocks/setup.cbp
configure.ac
data/doom.png
data/setup.png
src/doom/Makefile.am
src/doom/d_main.c
src/doom/f_finale.c
src/doom/m_menu.c
src/doom/p_switch.c
src/doom/r_draw.c
src/doom/st_stuff.c
src/i_system.c
src/i_video.c
src/i_video.h
src/icon.c
src/setup/display.c
src/setup/mainmenu.c
src/setup/setup_icon.c
src/v_video.c
src/v_video.h
......@@ -6,5 +6,6 @@
#cmakedefine HAVE_LIBSAMPLERATE
#cmakedefine HAVE_LIBPNG
#cmakedefine HAVE_DIRENT_H
#cmakedefine01 HAVE_DECL_STRCASECMP
#cmakedefine01 HAVE_DECL_STRNCASECMP
AC_INIT(Crispy Doom, 5.2,
AC_INIT(Crispy Doom, 5.4,
fabian@greffrath.com, crispy-doom)
PACKAGE_SHORTNAME=${PACKAGE_NAME% Doom}
......@@ -15,6 +15,7 @@ AC_CANONICAL_HOST
orig_CFLAGS="$CFLAGS"
AM_PROG_AR
AC_PROG_CC
AC_PROG_RANLIB
AC_CHECK_PROG(HAVE_PYTHON, python, true, false)
......@@ -97,7 +98,7 @@ AC_CHECK_LIB(m, log)
# [crispy] use stdlib's qsort() function for sorting the vissprites[] array
AC_CHECK_FUNCS(qsort)
AC_CHECK_HEADERS([linux/kd.h dev/isa/spkrio.h dev/speaker/speaker.h])
AC_CHECK_HEADERS([dirent.h linux/kd.h dev/isa/spkrio.h dev/speaker/speaker.h])
AC_CHECK_FUNCS(mmap ioperm)
AC_CHECK_DECLS([strcasecmp, strncasecmp], [], [], [[#include <strings.h>]])
......
CMDLINE.doom
CMDLINE.doom.md
CMDLINE.heretic
CMDLINE.heretic.md
CMDLINE.hexen
CMDLINE.hexen.md
CMDLINE.strife
CMDLINE.strife.md
INSTALL.doom
INSTALL.heretic
INSTALL.hexen
......
# Command line parameters
This is a full list of the supported command line parameters. A number of
additional parameters are supported in addition to those present in the DOS
version.
@content
This diff is collapsed.
......@@ -17,12 +17,6 @@ strifedocsdir = ${docdir}/../${PROGRAM_PREFIX}strife
if HAVE_PYTHON
if HAVE_WINDRES
WIN32=-D_WIN32
endif
GENERATED_MAN_PAGES = \
@PROGRAM_PREFIX@doom.6 \
default.cfg.5 \
......@@ -52,6 +46,17 @@ doomdocs_DATA = INSTALL.doom CMDLINE.doom
#hexendocs_DATA = INSTALL.hexen CMDLINE.hexen
#strifedocs_DATA = INSTALL.strife CMDLINE.strife
if HAVE_WINDRES
WIN32=-D_WIN32
doomdocs_DATA += CMDLINE.doom.md
#hereticdocs_DATA += CMDLINE.heretic.md
#hexendocs_DATA += CMDLINE.hexen.md
#strifedocs_DATA += CMDLINE.strife.md
endif
CLEANFILES = $(GENERATED_MAN_PAGES) $(SETUP_MAN_PAGES) \
$(doomdocs_DATA) $(hereticdocs_DATA) \
$(hexendocs_DATA) $(strifedocs_DATA)
......@@ -78,6 +83,11 @@ CMDLINE.doom : CMDLINE.template $(top_srcdir)/src $(top_srcdir)/src/doom
-p $(srcdir)/CMDLINE.template \
$(top_srcdir)/src/ $(top_srcdir)/src/doom/ > $@
CMDLINE.doom.md : CMDLINE.template.md $(top_srcdir)/src $(top_srcdir)/src/doom
$(DOCGEN) $(DOCGEN_COMMON_ARGS) \
-M $(srcdir)/CMDLINE.template.md \
$(top_srcdir)/src/ $(top_srcdir)/src/doom/ > $@
CMDLINE.doom.wikitext : $(top_srcdir)/src $(top_srcdir)/src/doom
$(DOCGEN) $(DOCGEN_COMMON_ARGS) \
-w $(top_srcdir)/src/ $(top_srcdir)/src/doom/ > $@
......@@ -108,6 +118,11 @@ CMDLINE.heretic : CMDLINE.template $(top_srcdir)/src $(top_srcdir)/src/heretic
-p $(srcdir)/CMDLINE.template \
$(top_srcdir)/src/ $(top_srcdir)/src/heretic/ > $@
CMDLINE.heretic.md : CMDLINE.template.md $(top_srcdir)/src $(top_srcdir)/src/heretic
$(DOCGEN) $(DOCGEN_COMMON_ARGS) \
-M $(srcdir)/CMDLINE.template.md \
$(top_srcdir)/src/ $(top_srcdir)/src/heretic/ > $@
INSTALL.heretic: INSTALL.template
$(srcdir)/simplecpp -DHERETIC $(WIN32) \
-DLONG_GAME_NAME="@PACKAGE_SHORTNAME@ Heretic" \
......@@ -135,6 +150,11 @@ CMDLINE.hexen : CMDLINE.template $(top_srcdir)/src $(top_srcdir)/src/hexen
-p $(srcdir)/CMDLINE.template \
$(top_srcdir)/src/ $(top_srcdir)/src/hexen/ > $@
CMDLINE.hexen.md : CMDLINE.template.md $(top_srcdir)/src $(top_srcdir)/src/hexen
$(DOCGEN) $(DOCGEN_COMMON_ARGS) \
-M $(srcdir)/CMDLINE.template.md \
$(top_srcdir)/src/ $(top_srcdir)/src/hexen/ > $@
INSTALL.hexen: INSTALL.template
$(srcdir)/simplecpp -DHEXEN $(WIN32) \
-DLONG_GAME_NAME="@PACKAGE_SHORTNAME@ Hexen" \
......@@ -172,6 +192,11 @@ CMDLINE.strife : CMDLINE.template $(top_srcdir)/src $(top_srcdir)/src/strife
-p $(srcdir)/CMDLINE.template \
$(top_srcdir)/src/ $(top_srcdir)/src/strife/ > $@
CMDLINE.strife.md : CMDLINE.template.md $(top_srcdir)/src $(top_srcdir)/src/strife
$(DOCGEN) $(DOCGEN_COMMON_ARGS) \
-M $(srcdir)/CMDLINE.template.md \
$(top_srcdir)/src/ $(top_srcdir)/src/strife/ > $@
INSTALL.strife: INSTALL.template
$(srcdir)/simplecpp -DSTRIFE $(WIN32) \
-DLONG_EXE_NAME="@PROGRAM_PREFIX@strife" \
......@@ -190,6 +215,7 @@ endif
EXTRA_DIST = $(man_MANS) $(MANPAGE_GEN_FILES) \
wikipages \
CMDLINE.template \
CMDLINE.template.md \
INSTALL.template \
simplecpp
......@@ -116,6 +116,19 @@ class Category:
return result
def markdown_output(self):
result = "## %s\n\n| Parameter | Description |\n| - | - |\n" % self.description
self.params.sort()
for p in self.params:
if p.should_show():
result += p.markdown_output()
result = result.rstrip() + "\n"
return result
def completion_output(self):
result = ""
......@@ -262,6 +275,28 @@ class Parameter:
return result
def markdown_output(self):
if self.args:
name = "%s %s" % (self.name, self.args)
else:
name = "%s" % self.name
name = name.replace("|", "\\|")
text = self.text
if self.platform:
text += " (%s only)" % self.platform
text = text.replace("|", "\\|")
result = "| %s | %s |\n" % (name, text)
# html escape
result = result.replace("<", "&lt;")
result = result.replace(">", "&gt;")
return result
def plaintext_output(self, indent):
# Build the first line, with the argument on
start = " " + self.name
......@@ -468,6 +503,14 @@ def wiki_output(targets, _, template):
for t in targets:
stdout(t.wiki_output().encode('UTF-8') + b'\n')
def markdown_output(targets, substs, template_file):
content = ""
for t in targets:
content += t.markdown_output() + "\n"
print_template(template_file, substs, content)
def plaintext_output(targets, substs, template_file):
content = ""
......@@ -487,13 +530,14 @@ def completion_output(targets, substs, template_file):
print_template(template_file, substs, content)
def usage():
print("Usage: %s [-V] [-c tag] [-g game] -n program_name -s package_name [ -z shortname ] ( -m | -w | -p ) <dir>..." \
print("Usage: %s [-V] [-c tag] [-g game] -n program_name -s package_name [ -z shortname ] ( -M | -m | -w | -p ) <dir>..." \
% sys.argv[0])
print(" -c : Provide documentation for the specified configuration file")
print(" (matches the given tag name in the source file)")
print(" -s : Package name, e.g. Chocolate Doom (for substitution)")
print(" -z : Package short-name, e.g. Chocolate (for substitution)")
print(" -n : Program name, e.g. chocolate (for substitution)")
print(" -M : Markdown output")
print(" -m : Manpage output")
print(" -w : Wikitext output")
print(" -p : Plaintext output")
......@@ -504,7 +548,7 @@ def usage():
# Parse command line
opts, args = getopt.getopt(sys.argv[1:], "n:s:z:m:wp:b:c:g:V")
opts, args = getopt.getopt(sys.argv[1:], "n:s:z:M:m:wp:b:c:g:V")
output_function = None
template = None
......@@ -522,6 +566,9 @@ for opt in opts:
if opt[0] == "-m":
output_function = manpage_output
template = opt[1]
elif opt[0] == "-M":
output_function = markdown_output
template = opt[1]
elif opt[0] == "-w":
output_function = wiki_output
elif opt[0] == "-p":
......
......@@ -75,7 +75,7 @@ static int opl_opl3mode;
// Temporary mixing buffer used by the mixing callback.
static int32_t *mix_buffer = NULL;
static uint8_t *mix_buffer = NULL;
// Register number that was written.
......@@ -155,36 +155,32 @@ static void AdvanceTime(unsigned int nsamples)
// Call the OPL emulator code to fill the specified buffer.
static void FillBuffer(int16_t *buffer, unsigned int nsamples)
static void FillBuffer(uint8_t *buffer, unsigned int nsamples)
{
// This seems like a reasonable assumption. mix_buffer is
// 1 second long, which should always be much longer than the
// SDL mix buffer.
assert(nsamples < mixing_freq);
OPL3_GenerateStream(&opl_chip, buffer, nsamples);
// OPL output is generated into temporary buffer and then mixed
// (to avoid overflows etc.)
OPL3_GenerateStream(&opl_chip, (Bit16s *) mix_buffer, nsamples);
SDL_MixAudioFormat(buffer, mix_buffer, AUDIO_S16SYS, nsamples * 4,
SDL_MIX_MAXVOLUME);
}
// Callback function to fill a new sound buffer:
static void OPL_Mix_Callback(void *udata,
Uint8 *byte_buffer,
int buffer_bytes)
static void OPL_Mix_Callback(void *udata, Uint8 *buffer, int len)
{
int16_t *buffer;
unsigned int buffer_len;
unsigned int filled = 0;
// Buffer length in samples (quadrupled, because of 16-bit and stereo)
buffer = (int16_t *) byte_buffer;
buffer_len = buffer_bytes / 4;
unsigned int filled, buffer_samples;
// Repeatedly call the OPL emulator update function until the buffer is
// full.
filled = 0;
buffer_samples = len / 4;
while (filled < buffer_len)
while (filled < buffer_samples)
{
uint64_t next_callback_time;
uint64_t nsamples;
......@@ -197,7 +193,7 @@ static void OPL_Mix_Callback(void *udata,
if (opl_sdl_paused || OPL_Queue_IsEmpty(callback_queue))
{
nsamples = buffer_len - filled;
nsamples = buffer_samples - filled;
}
else
{
......@@ -206,9 +202,9 @@ static void OPL_Mix_Callback(void *udata,
nsamples = (next_callback_time - current_time) * mixing_freq;
nsamples = (nsamples + OPL_SECOND - 1) / OPL_SECOND;
if (nsamples > buffer_len - filled)
if (nsamples > buffer_samples - filled)
{
nsamples = buffer_len - filled;
nsamples = buffer_samples - filled;
}
}
......@@ -216,7 +212,7 @@ static void OPL_Mix_Callback(void *udata,
// Add emulator output to buffer.
FillBuffer(buffer + filled * 2, nsamples);
FillBuffer(buffer + filled * 4, nsamples);
filled += nsamples;
// Invoke callbacks for this point in time.
......@@ -340,9 +336,8 @@ static int OPL_SDL_Init(unsigned int port_base)
return 0;
}
// Mix buffer:
mix_buffer = malloc(mixing_freq * sizeof(uint32_t) * 2);
// Mix buffer: four bytes per sample (16 bits * 2 channels):
mix_buffer = malloc(mixing_freq * 4);
// Create the emulator structure:
......@@ -352,8 +347,10 @@ static int OPL_SDL_Init(unsigned int port_base)
callback_mutex = SDL_CreateMutex();
callback_queue_mutex = SDL_CreateMutex();
// TODO: This should be music callback? or-?
Mix_HookMusic(OPL_Mix_Callback, NULL);
// Set postmix that adds the OPL music. This is deliberately done
// as a postmix and not using Mix_HookMusic() as the latter disables
// normal SDL_mixer music mixing.
Mix_SetPostMix(OPL_Mix_Callback, NULL);
return 1;
}
......
......@@ -16,7 +16,6 @@ DLL_FILES=$(TOPLEVEL)/src/SDL.dll \
all: $(ZIPS)
$(ZIPS):
unix2dos --add-bom $</*.txt
zip -j -r $@ $</*
$(DOOM_ZIP): staging-doom hook-doom
......@@ -27,12 +26,12 @@ $(STRIFE_ZIP): staging-strife hook-strife
# Special hooks to custom modify files for particular games.
hook-doom: staging-doom
cp $(TOPLEVEL)/NOT-BUGS.md $</NOT-BUGS.txt
-pandoc -f gfm -s -o $</NOT-BUGS.html $(TOPLEVEL)/NOT-BUGS.md
# Chocolate Strife has its own custom README file:
hook-strife: staging-strife
cp $(TOPLEVEL)/README.Strife.md $</README.txt
-pandoc -f gfm -s -o $</README.html $(TOPLEVEL)/README.Strife.md
# Build up a staging dir for a particular game.
......@@ -49,11 +48,12 @@ staging-%:
$(STRIP) $@/*.exe $@/*.dll
for f in $(DOC_FILES); do \
cp $(TOPLEVEL)/$$f $@/$$(basename $$f .md).txt; \
-for f in $(DOC_FILES); do \
pandoc -f gfm -o $@/$$(basename $$f .md).html \
-s $(TOPLEVEL)/$$f; \
done
cp $(TOPLEVEL)/man/CMDLINE.$* $@/CMDLINE.txt
cp $(TOPLEVEL)/man/INSTALL.$* $@/INSTALL.txt
-pandoc -f gfm -s -o $@/CMDLINE.html $(TOPLEVEL)/man/CMDLINE.$*.md
-pandoc -f gfm -s -o $@/INSTALL.html $(TOPLEVEL)/man/INSTALL.$*
clean:
rm -f $(ZIPS)
......
......@@ -5,6 +5,7 @@ endforeach()
# Common source files used by absolutely everything:
set(COMMON_SOURCE_FILES
crispy.c crispy.h
i_main.c
i_system.c i_system.h
m_argv.c m_argv.h
......@@ -46,10 +47,12 @@ set(GAME_SOURCE_FILES
gusconf.c gusconf.h
i_cdmus.c i_cdmus.h
i_endoom.c i_endoom.h
i_glob.c i_glob.h
i_input.c i_input.h
i_joystick.c i_joystick.h
i_swap.h
i_midipipe.c i_midipipe.h
i_musicpack.c
i_oplmusic.c
i_pcsound.c
i_sdlmusic.c
......@@ -83,6 +86,7 @@ set(GAME_SOURCE_FILES
v_diskicon.c v_diskicon.h
v_video.c v_video.h
v_patch.h
v_trans.c v_trans.h
w_checksum.c w_checksum.h
w_main.c w_main.h
w_wad.c w_wad.h
......@@ -93,6 +97,11 @@ set(GAME_SOURCE_FILES
w_merge.c w_merge.h
z_zone.c z_zone.h)
if(MSVC)
list(APPEND GAME_SOURCE_FILES
"../win32/win_opendir.c" "../win32/win_opendir.h")
endif()
set(DEHACKED_SOURCE_FILES
deh_defs.h
deh_io.c deh_io.h
......
......@@ -66,10 +66,12 @@ deh_str.c deh_str.h \
gusconf.c gusconf.h \
i_cdmus.c i_cdmus.h \
i_endoom.c i_endoom.h \
i_glob.c i_glob.h \
i_input.c i_input.h \
i_joystick.c i_joystick.h \
i_swap.h \
i_midipipe.c i_midipipe.h \
i_musicpack.c \
i_oplmusic.c \
i_pcsound.c \
i_sdlmusic.c \
......
......@@ -28,6 +28,7 @@ static crispy_t crispy_s = {
.hires = 1,
.smoothscaling = 1,
.soundfix = 1,
.vsync = 1,
};
crispy_t *const crispy = &crispy_s;
......
......@@ -63,12 +63,12 @@ typedef struct
int secretmessage;
int smoothlight;
int smoothscaling;
int sndchannels;
int soundfix;
int soundfull;
int soundmono;
int translucency;
int uncapped;
int vsync;
int weaponsquat;
// [crispy] in-game switches and variables
......@@ -80,6 +80,7 @@ typedef struct
boolean automapoverlay;
boolean flashinghom;
boolean fliplevels;
boolean flipweapons;
boolean havee1m10;
boolean havemap33;
boolean havessg;
......@@ -88,6 +89,8 @@ typedef struct
const char *sdlversion;
const char *platform;
void (*post_rendering_hook) (void);
} crispy_t;
extern crispy_t *const crispy;
......@@ -95,6 +98,14 @@ extern const crispy_t *critical;
extern void CheckCrispySingleplayer (boolean singleplayer);
enum
{
ASPECTRATIO_OFF,
ASPECTRATIO_4_3,
ASPECTRATIO_16_10,
NUM_ASPECTRATIOS,
};
enum
{
BRIGHTMAPS_OFF,
......@@ -165,14 +176,6 @@ enum
NUM_JUMPS
};
enum
{
SNDCHANNELS_8,
SNDCHANNELS_16,
SNDCHANNELS_32,
NUM_SNDCHANNELS
};
enum
{
TRANSLUCENCY_OFF,
......@@ -182,12 +185,4 @@ enum
NUM_TRANSLUCENCY
};
enum
{
UNCAPPED_OFF,
UNCAPPED_ON,
UNCAPPED_VSYNC,
NUM_UNCAPPED
};
#endif
......@@ -385,8 +385,7 @@ static void CheckSteamGUSPatches(void)
{
const char *current_path;
char *install_path;
char *patch_path;
int len;
char *test_patch_path, *patch_path;
// Already configured? Don't stomp on the user's choices.
current_path = M_GetStringVariable("gus_patch_path");
......@@ -402,19 +401,17 @@ static void CheckSteamGUSPatches(void)
return;
}
len = strlen(install_path) + strlen(STEAM_BFG_GUS_PATCHES) + 20;
patch_path = malloc(len);
M_snprintf(patch_path, len, "%s\\%s\\ACBASS.PAT",
install_path, STEAM_BFG_GUS_PATCHES);
patch_path = M_StringJoin(install_path, "\\", STEAM_BFG_GUS_PATCHES,
NULL);
test_patch_path = M_StringJoin(patch_path, "\\ACBASS.PAT", NULL);
// Does acbass.pat exist? If so, then set gus_patch_path.
if (M_FileExists(patch_path))
if (M_FileExists(test_patch_path))
{
M_snprintf(patch_path, len, "%s\\%s",
install_path, STEAM_BFG_GUS_PATCHES);
M_SetVariable("gus_patch_path", patch_path);
}
free(test_patch_path);
free(patch_path);
free(install_path);
}
......@@ -450,15 +447,8 @@ static void CheckDOSDefaults(void)
static boolean DirIsFile(const char *path, const char *filename)
{
size_t path_len;
size_t filename_len;
path_len = strlen(path);
filename_len = strlen(filename);
return path_len >= filename_len + 1
&& path[path_len - filename_len - 1] == DIR_SEPARATOR
&& !strcasecmp(&path[path_len - filename_len], filename);
return strchr(path, DIR_SEPARATOR) != NULL
&& !strcasecmp(M_BaseName(path), filename);
}
// Check if the specified directory contains the specified IWAD
......@@ -491,6 +481,7 @@ static char *CheckDirectoryHasIWAD(const char *dir, const char *iwadname)
filename = M_StringJoin(dir, DIR_SEPARATOR_S, iwadname, NULL);
}
free(probe);
probe = M_FileCaseExists(filename);
free(filename);
if (probe != NULL)
......@@ -532,19 +523,12 @@ static char *SearchDirectoryForIWAD(const char *dir, int mask, GameMission_t *mi
// When given an IWAD with the '-iwad' parameter,
// attempt to identify it by its name.
static GameMission_t IdentifyIWADByName(char *name, int mask)
static GameMission_t IdentifyIWADByName(const char *name, int mask)
{
size_t i;
GameMission_t mission;
char *p;
p = strrchr(name, DIR_SEPARATOR);
if (p != NULL)
{
name = p + 1;
}
name = M_BaseName(name);
mission = none;
for (i=0; i<arrlen(iwads); ++i)
......@@ -664,7 +648,37 @@ static void AddXdgDirs(void)
// Classic WADs.
AddIWADPath(env, "/games/doom3bfg/base/wads");
}
#endif
#ifndef __MACOSX__
// Steam on Linux allows installing some select Windows games,
// including the classic Doom series (running DOSBox via Wine). We
// could parse *.vdf files to more accurately detect installation
// locations, but the defaults are likely to be good enough for just
// about everyone.
static void AddSteamDirs(void)
{
char *homedir, *steampath;
homedir = getenv("HOME");
if (homedir == NULL)
{
homedir = "/";
}
steampath = M_StringJoin(homedir, "/.steam/root/steamapps/common", NULL);
AddIWADPath(steampath, "/Doom 2/base");
AddIWADPath(steampath, "/Master Levels of Doom/doom2");
AddIWADPath(steampath, "/Ultimate Doom/base");
AddIWADPath(steampath, "/Final Doom/base");
AddIWADPath(steampath, "/DOOM 3 BFG Edition/base/wads");
AddIWADPath(steampath, "/Heretic Shadow of the Serpent Riders/base");