shithub: choc

Download patch

ref: d36dafa3fc3457333f1c49ce133c1e2587e778d4
parent: d8cfdba5bffc84b917f11db9564319693f29a629
parent: 7607140288b936d29f86b67eec1cbfa3eb60f5ca
author: Simon Howard <[email protected]>
date: Sat Jun 4 15:36:32 EDT 2016

Merge remote-tracking branch 'origin/master' into sdl2-branch

--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -1,6 +1,11 @@
 Thanks for contributing to Chocolate Doom! Whatever your contribution,
 whether it's code or just a bug report, it's greatly appreciated.
 
+The project is governed by the
+[Contributor Covenant](http://contributor-covenant.org/version/1/4/)
+version 1.4. By contributing to the project you agree to abide by its
+terms. To report violations, please send an email to [email protected].
+
 ### Reporting bugs
 
 Before reporting a bug, it's worth checking if this really is a bug.
--- a/AUTHORS
+++ b/AUTHORS
@@ -2,4 +2,5 @@
 James Haley <[email protected]>
 Samuel Villarreal <[email protected]>
 Fabian Greffrath <[email protected]>
-Jonathan Dowland <[email protected]>
+Jonathan Dowland <[email protected]>
+Alexey Khokholov <[email protected]>
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -1,0 +1,74 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, gender identity and expression, level of experience,
+nationality, personal appearance, race, religion, or sexual identity and
+orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+  address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+  professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. Examples of
+representing a project or community include using an official project e-mail
+address, posting via an official social media account, or acting as an appointed
+representative at an online or offline event. Representation of a project may be
+further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team at [email protected]. All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at [http://contributor-covenant.org/version/1/4][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/4/
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,66 @@
+HEAD:
+
+    General:
+    * Bash completion scripts are included. (thanks Fabian)
+    * Support the *.lmp file format in the OS X launcher (thanks Jon)
+    * Added emulation for pitch-shifting as in early versions of Doom,
+      Heretic, and Hexen. (thanks Jon)
+    * Write out aspect-correct 1600×1200 PNGs. (thanks Jon)
+    * OPL emulation is more accurate. (thanks Nuke.YKT)
+    * Futher emulation of DMX bugs with GUS cards. (thanks Nuke.YKT)
+    * Emulation of the disk icon has returned. (thanks Fabian, Jon)
+    * Checksum calculations were fixed on big endian systems, allowing
+      multiplayer games to be played in mixed little/big-endian
+      environments. (thanks GhostlyDeath, njankowski)
+
+    Build systems:
+    * Improved compatibility with BSD Make. (thanks R.Rebello)
+    * “./configure --with-PACKAGE” checks were repaired to behave
+      logically, rather than disabling the feature. (thanks R.Rebello)
+    * Default to installing the games to ${bindir}, such as /usr/local/bin,
+      rather than /usr/local/games. (thanks chungy)
+    * Support Visual Studio 2015. (thanks Azarien)
+    * Allow SDL headers and libraries to exist in the Microsoft Visual
+      Studio project directory. (thanks Quasar)
+    * Repaired the CodeBlocks projects by removing non-existent files from
+      the project files (thanks krystalgamer)
+
+    Doom:
+    * Chex Quest's level warp cheat (LEESNYDER##) was changed to behave
+      like the original EXE. (thanks Nuke.YKT)
+    * Allow starting multiplayer Chex Quest games.
+    * Allow Freedoom: Phase 1 ≤ 0.10.1 to be loaded with mods, with
+      -gameversion older than ultimate. (thanks Fabian, chungy)
+    * Added safety checks against write failures when saving a game,
+      such as when the directory is read-only.  Try falling back to a
+      temporary directory and reporting an error instead.
+      (thanks terrorcide)
+    * Versions 1.666, 1.7, and 1.8 are emulated. (thanks Nuke.YKT)
+
+    Heretic:
+    * Added map names for Episode 6, fixing a crash after completing a
+      level in this episode. (thanks J.Benaim)
+
+    Hexen:
+    * The MRJONES cheat code returns an identical string as vanilla,
+      and enables fully reproducable builds. (thanks Fabian)
+    * Fixed an issue where the game crashed while killing the Wraithverge
+      in 64-bit builds. (thanks J.Benaim)
+
+    Strife:
+    * Support added for automatic loading of the IWAD from the GOG.com
+      release of Strife: Veteran Edition on Windows. (thanks chungy)
+    * Jumping can be bound to a mouse button. (thanks Gez)
+    * Gibbing logic was changed to match vanilla behavior. (thanks Quasar)
+    * Several constants differences from vanilla were fixed. (thanks
+      Nuke.YKT, Quasar)
+    * When using -iwad, voices.wad from the IWAD's directory is prefered
+      over auto-detected DOS/Steam/GOG.com installs. (thanks Quasar)
+
+    libtextscreen:
+    * Simplified the API for creating and managing tables and columns.
+    * Allow cycling through tables with tab key.
+
 2.2.1 (2015-09-10):
 
     Chocolate Doom has not seen a great deal of "stable" patch
--- a/NOT-BUGS
+++ b/NOT-BUGS
@@ -18,7 +18,7 @@
     (read 106, should be 109)
 
     *** You may need to upgrade your version of Doom to v1.9. ***
-        See: http://doomworld.com/files/patches.shtml
+        See: https://www.doomworld.com/classicdoom/info/patches.php
         This appears to be v1.6/v1.666.
 
 This usually indicates that your IWAD file that you are using to play
@@ -130,9 +130,9 @@
 play is too complex; it was most likely designed to work with a limit
 removing source port.
 
-More information can be found here:
+More information can be found here (archived link):
 
-    http://rome.ro/lee_killough/editing/visplane.shtml
+    https://archive.is/s6h7V
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
--- a/README
+++ b/README
@@ -73,7 +73,7 @@
  * More information, including information about how to play various
    classic TCs, is available on the Chocolate Doom website:
 
-     http://www.chocolate-doom.org/
+     https://www.chocolate-doom.org/
 
    You are encouraged to sign up and contribute any useful information
    you may have regarding the port!
--- a/README.Music
+++ b/README.Music
@@ -18,7 +18,7 @@
 a good quality sound font is the eawpats font, which can be downloaded
 from the idgames archive as sounds/eawpats.zip:
 
-  http://www.doomworld.com/idgames/index.php?file=sounds/eawpats.zip
+  https://www.doomworld.com/idgames/sounds/eawpats
 
 Having installed a sound font, select "Native MIDI" in the sound
 configuration dialog in the setup tool, and use the "Timidity
@@ -39,7 +39,7 @@
 and are automatically detected. Otherwise, they can be downloaded
 from the idgames archive as music/dgguspat.zip:
 
-  http://www.doomworld.com/idgames/index.php?file=music/dgguspat.zip
+  https://www.doomworld.com/idgames/music/dgguspat
 
 Having downloaded the patches, select "GUS (emulated)" in the sound
 configuration dialog in the setup tool, and use the "GUS patch path"
--- a/configure.ac
+++ b/configure.ac
@@ -5,7 +5,7 @@
 PACKAGE_COPYRIGHT="Copyright (C) 1993-2015"
 PACKAGE_LICENSE="GNU General Public License, version 2"
 PACKAGE_MAINTAINER="Simon Howard"
-PACKAGE_URL="http://www.chocolate-doom.org/"
+PACKAGE_URL="https://www.chocolate-doom.org/"
 PACKAGE_ISSUES="https://github.com/chocolate-doom/chocolate-doom/issues"
 
 AC_CONFIG_AUX_DIR(autotools)
--- a/man/INSTALL.template
+++ b/man/INSTALL.template
@@ -65,6 +65,7 @@
    tnt.wad                     (Final Doom: TNT: Evilution)
    plutonia.wad                (Final Doom: Plutonia Experiment)
    chex.wad                    (Chex Quest)
+   freedm.wad                  (FreeDM)
 #endif
 #if HERETIC
    heretic1.wad                (Shareware Heretic)
@@ -81,7 +82,7 @@
 If you don't have a copy of a commercial version, you can download
 the shareware version of Doom (extract the file named doom1.wad):
 
- * http://www.doomworld.com/idgames/index.php?id=7053
+ * https://www.doomworld.com/idgames/idstuff/doom/win95/doom95
    (idstuff/doom/win95/doom95.zip in your nearest /idgames mirror)
 
 #endif
@@ -195,7 +196,7 @@
  * The IWAD file 'chex.wad', from the Chex Quest CD.
 
  * The dehacked patch 'chex.deh', which can be found here:
-   http://www.doomworld.com/idgames/?id=15420
+   https://www.doomworld.com/idgames/utils/exe_edit/patches/chexdeh
    (utils/exe_edit/patches/chexdeh.zip in your nearest /idgames mirror)
 
 Copy these files into a directory together and use the '-iwad' command
--- a/msvc/.gitignore
+++ b/msvc/.gitignore
@@ -5,3 +5,6 @@
 savegames
 strfsav*
 *.pcx
+SDL*
+begin_code.h
+close_code.h
\ No newline at end of file
--- a/opl/opl_sdl.c
+++ b/opl/opl_sdl.c
@@ -157,8 +157,6 @@
 
 static void FillBuffer(int16_t *buffer, unsigned int nsamples)
 {
-    unsigned int i;
-
     // This seems like a reasonable assumption.  mix_buffer is
     // 1 second long, which should always be much longer than the
     // SDL mix buffer.
--- a/pkg/osx/AppController.m
+++ b/pkg/osx/AppController.m
@@ -101,6 +101,11 @@
         [self->launcherManager addFileToCommandLine: fileName
                                forArgument: @"-merge"];
     }
+    else if (![extension caseInsensitiveCompare: @"lmp"])
+    {
+        [self->launcherManager addFileToCommandLine: fileName
+                               forArgument: @"-playdemo"];
+    }
     else if (![extension caseInsensitiveCompare: @"deh"])
     {
         [self->launcherManager addFileToCommandLine: fileName
--- a/pkg/osx/Info.plist.in
+++ b/pkg/osx/Info.plist.in
@@ -53,6 +53,18 @@
                 </dict>
                 <dict>
                         <key>CFBundleTypeName</key>
+                        <string>Doom demo recording</string>
+                        <key>CFBundleTypeIconFile</key>
+                        <string>wadfile.icns</string>
+                        <key>CFBundleTypeRole</key>
+                        <string>Viewer</string>
+                        <key>CFBundleTypeExtensions</key>
+                        <array>
+                                <string>lmp</string>
+                        </array>
+                </dict>
+                <dict>
+                        <key>CFBundleTypeName</key>
                         <string>Doom Dehacked patch</string>
                         <key>CFBundleTypeIconFile</key>
                         <string>wadfile.icns</string>
--- a/rpm.spec.in
+++ b/rpm.spec.in
@@ -3,7 +3,7 @@
 Summary: @PACKAGE_SHORTDESC@
 Version: @VERSION@
 Release: 1
-Source: http://www.chocolate-doom.org/downloads/@VERSION@/@PACKAGE@-@[email protected]
+Source: https://www.chocolate-doom.org/downloads/@VERSION@/@PACKAGE@-@[email protected]
 URL: @PACKAGE_URL@
 Group: Amusements/Games
 BuildRoot: /var/tmp/@PACKAGE@-buildroot
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,7 +1,7 @@
 
 SUBDIRS = doom heretic hexen strife setup
 
-execgamesdir = ${exec_prefix}/games
+execgamesdir = ${bindir}
 
 execgames_PROGRAMS = @PROGRAM_PREFIX@doom     \
                      @PROGRAM_PREFIX@heretic  \
--- a/src/d_iwad.c
+++ b/src/d_iwad.c
@@ -177,6 +177,14 @@
         SOFTWARE_KEY "\\GOG.com\\Games\\1435848742",
         "PATH",
     },
+
+    // Strife: Veteran Edition
+
+    {
+	HKEY_LOCAL_MACHINE,
+	SOFTWARE_KEY "\\GOG.com\\Games\\1432899949",
+	"PATH",
+    },
 };
 
 // Subdirectories of the above install path, where IWADs are installed.
--- a/src/d_mode.h
+++ b/src/d_mode.h
@@ -74,6 +74,16 @@
     exe_strife_1_31  // Strife v1.31
 } GameVersion_t;
 
+// What IWAD variant are we using?
+
+typedef enum
+{
+    vanilla,    // Vanilla Doom
+    freedoom,   // FreeDoom: Phase 1 + 2
+    freedm,     // FreeDM
+    bfgedition, // Doom Classic (Doom 3: BFG Edition)
+} GameVariant_t;
+
 // Skill level.
 
 typedef enum
--- a/src/doom.appdata.xml.in
+++ b/src/doom.appdata.xml.in
@@ -26,19 +26,19 @@
   </description>
   <screenshots>
     <screenshot type="default">
-      <image>http://www.chocolate-doom.org/wiki/images/9/97/GNOME_FreeDM_DEMO4.png</image>
+      <image>https://www.chocolate-doom.org/wiki/images/9/97/GNOME_FreeDM_DEMO4.png</image>
       <caption>FreeDM, DM05: Metal</caption>
     </screenshot>
     <screenshot>
-      <image>http://www.chocolate-doom.org/wiki/images/a/a6/GNOME_Doom_II_DEMO2.png</image>
+      <image>https://www.chocolate-doom.org/wiki/images/a/a6/GNOME_Doom_II_DEMO2.png</image>
       <caption>Doom II, Level 5: The Waste Tunnels</caption>
     </screenshot>
     <screenshot>
-      <image>http://www.chocolate-doom.org/wiki/images/4/41/GNOME_Doomsday_of_UAC.png</image>
+      <image>https://www.chocolate-doom.org/wiki/images/4/41/GNOME_Doomsday_of_UAC.png</image>
       <caption>Doomsday of UAC (uac_dead.wad)</caption>
     </screenshot>
     <screenshot>
-      <image>http://www.chocolate-doom.org/wiki/images/2/2a/GNOME_Freedoom_DTWID_DEMO3.png</image>
+      <image>https://www.chocolate-doom.org/wiki/images/2/2a/GNOME_Freedoom_DTWID_DEMO3.png</image>
       <caption>Doom the Way id Did, on Freedoom. Level 3-2: City of Corpses</caption>
     </screenshot>
   </screenshots>
--- a/src/doom/d_main.c
+++ b/src/doom/d_main.c
@@ -119,9 +119,6 @@
 // Store demo, do not accept any inputs
 boolean         storedemo;
 
-// "BFG Edition" version of doom2.wad does not include TITLEPIC.
-boolean         bfgedition;
-
 // If true, the main game loop has started.
 boolean         main_loop_started = false;
 
@@ -413,7 +410,7 @@
 //
 void D_DoomLoop (void)
 {
-    if (bfgedition &&
+    if (gamevariant == bfgedition &&
         (demorecording || (gameaction == ga_playdemo) || netgame))
     {
         printf(" WARNING: You are playing using one of the Doom Classic\n"
@@ -582,7 +579,7 @@
 
     // The Doom 3: BFG Edition version of doom2.wad does not have a
     // TITLETPIC lump. Use INTERPIC instead as a workaround.
-    if (bfgedition && !strcasecmp(pagename, "TITLEPIC")
+    if (gamevariant == bfgedition && !strcasecmp(pagename, "TITLEPIC")
         && W_CheckNumForName("titlepic") < 0)
     {
         pagename = DEH_String("INTERPIC");
@@ -815,9 +812,6 @@
 
 void D_SetGameDescription(void)
 {
-    boolean is_freedoom = W_CheckNumForName("FREEDOOM") >= 0,
-            is_freedm = W_CheckNumForName("FREEDM") >= 0;
-
     gamedescription = "Unknown";
 
     if (logical_gamemission == doom)
@@ -824,7 +818,7 @@
     {
         // Doom 1.  But which version?
 
-        if (is_freedoom)
+        if (gamevariant == freedoom)
         {
             gamedescription = GetGameName("Freedoom: Phase 1");
         }
@@ -847,17 +841,14 @@
     {
         // Doom 2 of some kind.  But which mission?
 
-        if (is_freedoom)
+        if (gamevariant == freedm)
         {
-            if (is_freedm)
-            {
-                gamedescription = GetGameName("FreeDM");
-            }
-            else
-            {
-                gamedescription = GetGameName("Freedoom: Phase 2");
-            }
+            gamedescription = GetGameName("FreeDM");
         }
+        else if (gamevariant == freedoom)
+        {
+            gamedescription = GetGameName("Freedoom: Phase 2");
+        }
         else if (logical_gamemission == doom2)
         {
             gamedescription = GetGameName("DOOM 2: Hell on Earth");
@@ -1129,7 +1120,7 @@
 static void LoadIwadDeh(void)
 {
     // The Freedoom IWADs have DEHACKED lumps that must be loaded.
-    if (W_CheckNumForName("FREEDOOM") >= 0)
+    if (gamevariant == freedoom || gamevariant == freedm)
     {
         // Old versions of Freedoom (before 2014-09) did not have technically
         // valid DEHACKED lumps, so ignore errors and just continue if this
@@ -1440,6 +1431,24 @@
         LoadIwadDeh();
     }
 
+    // Check which IWAD variant we are using.
+
+    if (W_CheckNumForName("FREEDOOM") >= 0)
+    {
+        if (W_CheckNumForName("FREEDM") >= 0)
+        {
+            gamevariant = freedm;
+        }
+        else
+        {
+            gamevariant = freedoom;
+        }
+    }
+    else if (W_CheckNumForName("DMENUPIC") >= 0)
+    {
+        gamevariant = bfgedition;
+    }
+
     // Doom 3: BFG Edition includes modified versions of the classic
     // IWADs which can be identified by an additional DMENUPIC lump.
     // Furthermore, the M_GDHIGH lumps have been modified in a way that
@@ -1448,10 +1457,9 @@
     // We specifically check for DMENUPIC here, before PWADs have been
     // loaded which could probably include a lump of that name.
 
-    if (W_CheckNumForName("dmenupic") >= 0)
+    if (gamevariant == bfgedition)
     {
         printf("BFG Edition: Using workarounds as needed.\n");
-        bfgedition = true;
 
         // BFG Edition changes the names of the secret levels to
         // censor the Wolfenstein references. It also has an extra
@@ -1599,7 +1607,7 @@
     }
 
     // Check for -file in shareware
-    if (modifiedgame)
+    if (modifiedgame && (gamevariant != freedoom))
     {
 	// These are the lumps that will be checked in IWAD,
 	// if any one is not present, execution will be aborted.
@@ -1638,12 +1646,12 @@
     // Freedoom's IWADs are Boom-compatible, which means they usually
     // don't work in Vanilla (though FreeDM is okay). Show a warning
     // message and give a link to the website.
-    if (W_CheckNumForName("FREEDOOM") >= 0 && W_CheckNumForName("FREEDM") < 0)
+    if (gamevariant == freedoom)
     {
         printf(" WARNING: You are playing using one of the Freedoom IWAD\n"
                " files, which might not work in this port. See this page\n"
                " for more information on how to play using Freedoom:\n"
-               "   http://www.chocolate-doom.org/wiki/index.php/Freedoom\n");
+               "   https://www.chocolate-doom.org/wiki/index.php/Freedoom\n");
         I_PrintDivider();
     }
 
--- a/src/doom/doomstat.c
+++ b/src/doom/doomstat.c
@@ -25,6 +25,7 @@
 GameMode_t gamemode = indetermined;
 GameMission_t	gamemission = doom;
 GameVersion_t   gameversion = exe_final2;
+GameVariant_t   gamevariant = vanilla;
 char *gamedescription;
 
 // Set if homebrew PWAD stuff has been added.
--- a/src/doom/doomstat.h
+++ b/src/doom/doomstat.h
@@ -56,10 +56,8 @@
 extern GameMode_t	gamemode;
 extern GameMission_t	gamemission;
 extern GameVersion_t    gameversion;
+extern GameVariant_t    gamevariant;
 extern char            *gamedescription;
-
-// If true, we're using one of the mangled BFG edition IWADs.
-extern boolean bfgedition;
 
 // Convenience macro.
 // 'gamemission' can be equal to pack_chex or pack_hacx, but these are
--- a/src/doom/g_game.c
+++ b/src/doom/g_game.c
@@ -2177,7 +2177,8 @@
                         "\n"
                         "*** You may need to upgrade your version "
                             "of Doom to v1.9. ***\n"
-                        "    See: http://doomworld.com/files/patches.shtml\n"
+                        "    See: https://www.doomworld.com/classicdoom"
+                                  "/info/patches.php\n"
                         "    This appears to be %s.";
 
         I_Error(message, demoversion, G_VanillaVersionCode(),
--- a/src/doom/m_random.c
+++ b/src/doom/m_random.c
@@ -16,11 +16,6 @@
 //	Random number LUT.
 //
 
-
-#include <time.h>
-
-#include "m_random.h"
-
 //
 // M_Random
 // Returns a 0-255 number
@@ -66,13 +61,5 @@
 
 void M_ClearRandom (void)
 {
-    prndindex = 0;
-
-    // Seed the M_Random counter from the system time
-
-    rndindex = time(NULL) & 0xff;
+    rndindex = prndindex = 0;
 }
-
-
-
-
--- a/src/doom/p_mobj.c
+++ b/src/doom/p_mobj.c
@@ -44,6 +44,12 @@
 //
 int test;
 
+// Use a heuristic approach to detect infinite state cycles: Count the number
+// of times the loop in P_SetMobjState() executes and exit with an error once
+// an arbitrary very large limit is reached.
+
+#define MOBJ_CYCLE_LIMIT 1000000
+
 boolean
 P_SetMobjState
 ( mobj_t*	mobj,
@@ -50,6 +56,7 @@
   statenum_t	state )
 {
     state_t*	st;
+    int	cycle_counter = 0;
 
     do
     {
@@ -72,6 +79,11 @@
 	    st->action.acp1(mobj);	
 	
 	state = st->nextstate;
+
+	if (cycle_counter++ > MOBJ_CYCLE_LIMIT)
+	{
+	    I_Error("P_SetMobjState: Infinite state cycle detected!");
+	}
     } while (!mobj->tics);
 				
     return true;
--- a/src/gusconf.c
+++ b/src/gusconf.c
@@ -35,7 +35,9 @@
 typedef struct
 {
     char *patch_names[MAX_INSTRUMENTS];
+    int used[MAX_INSTRUMENTS];
     int mapping[MAX_INSTRUMENTS];
+    unsigned int count;
 } gus_config_t;
 
 char *gus_patch_path = "";
@@ -109,6 +111,7 @@
 static void ParseLine(gus_config_t *config, char *line)
 {
     char *fields[6];
+    unsigned int i;
     unsigned int num_fields;
     unsigned int instr_id, mapped_id;
 
@@ -120,11 +123,33 @@
     }
 
     instr_id = atoi(fields[0]);
+
+    // Skip non GM percussions.
+    if ((instr_id >= 128 && instr_id < 128 + 35) || instr_id > 128 + 81)
+    {
+        return;
+    }
+
     mapped_id = atoi(fields[MappingIndex()]);
 
-    free(config->patch_names[instr_id]);
-    config->patch_names[instr_id] = M_StringDuplicate(fields[5]);
-    config->mapping[instr_id] = mapped_id;
+    for (i = 0; i < config->count; i++)
+    {
+        if (config->used[i] == mapped_id)
+        {
+            break;
+        }
+    }
+    
+    if (i == config->count)
+    {
+        // DMX uses wrong patch name (we should use name of 'mapped_id'
+        // instrument, but DMX uses name of 'instr_id' instead).
+        free(config->patch_names[i]);
+        config->patch_names[i] = M_StringDuplicate(fields[5]);
+        config->used[i] = mapped_id;
+        config->count++;
+    }
+    config->mapping[instr_id] = i;
 }
 
 static void ParseDMXConfig(char *dmxconf, gus_config_t *config)
@@ -137,8 +162,11 @@
     for (i = 0; i < MAX_INSTRUMENTS; ++i)
     {
         config->mapping[i] = -1;
+        config->used[i] = -1;
     }
 
+    config->count = 0;
+
     p = dmxconf;
 
     for (;;)
@@ -225,8 +253,8 @@
     }
 
     fprintf(fstream, "\ndrumset 0\n\n");
-
-    for (i = 128 + 25; i < MAX_INSTRUMENTS; ++i)
+    
+    for (i = 128 + 35; i <= 128 + 81; ++i)
     {
         if (config->mapping[i] >= 0 && config->mapping[i] < MAX_INSTRUMENTS
          && config->patch_names[config->mapping[i]] != NULL)
--- a/src/heretic.appdata.xml.in
+++ b/src/heretic.appdata.xml.in
@@ -25,19 +25,19 @@
   </description>
   <screenshots>
     <screenshot type="default">
-      <image>http://www.chocolate-doom.org/wiki/images/9/93/GNOME_Heretic_E5M4.png</image>
+      <image>https://www.chocolate-doom.org/wiki/images/9/93/GNOME_Heretic_E5M4.png</image>
       <caption>Level E5M4: Courtyard</caption>
     </screenshot>
     <screenshot>
-      <image>http://www.chocolate-doom.org/wiki/images/1/14/GNOME_Heretic_Shareware_DEMO3.png</image>
+      <image>https://www.chocolate-doom.org/wiki/images/1/14/GNOME_Heretic_Shareware_DEMO3.png</image>
       <caption>Shareware Level E1M9: The Graveyard</caption>
     </screenshot>
     <screenshot>
-      <image>http://www.chocolate-doom.org/wiki/images/3/34/GNOME_Heretic_E4M1.png</image>
+      <image>https://www.chocolate-doom.org/wiki/images/3/34/GNOME_Heretic_E4M1.png</image>
       <caption>Level E4M1: Catafalque</caption>
     </screenshot>
     <screenshot>
-      <image>http://www.chocolate-doom.org/wiki/images/4/42/GNOME_Heretic_Shareware_DEMO1.png</image>
+      <image>https://www.chocolate-doom.org/wiki/images/4/42/GNOME_Heretic_Shareware_DEMO1.png</image>
       <caption>Shareware Level E1M3: The Gatehouse</caption>
     </screenshot>
   </screenshots>
--- a/src/heretic/am_map.c
+++ b/src/heretic/am_map.c
@@ -83,7 +83,11 @@
     "E5M6:  COLONNADE",
     "E5M7:  FOETID MANSE",
     "E5M8:  FIELD OF JUDGEMENT",
-    "E5M9:  SKEIN OF D'SPARIL"
+    "E5M9:  SKEIN OF D'SPARIL",
+    // EPISODE 6: unnamed
+    "E6M1:  ",
+    "E6M2:  ",
+    "E6M3:  ",
 };
 
 static int cheating = 0;
--- a/src/hexen.appdata.xml.in
+++ b/src/hexen.appdata.xml.in
@@ -25,19 +25,19 @@
   </description>
   <screenshots>
     <screenshot type="default">
-      <image>http://www.chocolate-doom.org/wiki/images/0/0f/GNOME_Hexen_Guardian_of_Fire.png</image>
+      <image>https://www.chocolate-doom.org/wiki/images/0/0f/GNOME_Hexen_Guardian_of_Fire.png</image>
       <caption>Level "Guardian of Fire"</caption>
     </screenshot>
     <screenshot>
-      <image>http://www.chocolate-doom.org/wiki/images/5/5c/GNOME_Hexen_Effluvium.png</image>
+      <image>https://www.chocolate-doom.org/wiki/images/5/5c/GNOME_Hexen_Effluvium.png</image>
       <caption>Level "Effluvium"</caption>
     </screenshot>
     <screenshot>
-      <image>http://www.chocolate-doom.org/wiki/images/c/c1/GNOME_Hexen_Dragon_Chapel.png</image>
+      <image>https://www.chocolate-doom.org/wiki/images/c/c1/GNOME_Hexen_Dragon_Chapel.png</image>
       <caption>Level "Dragon Chapel"</caption>
     </screenshot>
     <screenshot>
-      <image>http://www.chocolate-doom.org/wiki/images/a/a7/GNOME_Hexen_Darkmere.png</image>
+      <image>https://www.chocolate-doom.org/wiki/images/a/a7/GNOME_Hexen_Darkmere.png</image>
       <caption>Level "Darkmere"</caption>
     </screenshot>
   </screenshots>
--- a/src/hexen/h2_main.c
+++ b/src/hexen/h2_main.c
@@ -290,7 +290,7 @@
             "You are trying to use the Hexen v1.0 IWAD. This isn't\n"
             "supported by " PACKAGE_NAME ". Please upgrade to the v1.1\n"
             "IWAD file. See here for more information:\n"
-            "  http://www.doomworld.com/classicdoom/info/patches.php");
+            "  https://www.doomworld.com/classicdoom/info/patches.php");
     }
 }
 
--- a/src/mus2mid.c
+++ b/src/mus2mid.c
@@ -403,7 +403,7 @@
 
             // First time using the channel, send an "all notes off"
             // event. This fixes "The D_DDTBLU disease" described here:
-            // http://www.doomworld.com/vb/source-ports/66802-the
+            // https://www.doomworld.com/vb/source-ports/66802-the
             WriteChangeController_Valueless(channel_map[mus_channel], 0x7b,
                                             midioutput);
         }
--- a/src/setup/Makefile.am
+++ b/src/setup/Makefile.am
@@ -1,6 +1,4 @@
 
-gamesdir = $(prefix)/games
-
 AM_CFLAGS = @SDL_CFLAGS@                                           \
             @SDLMIXER_CFLAGS@                                      \
             -I$(top_srcdir)/textscreen -I$(top_srcdir)/src
--- a/src/setup/compatibility.c
+++ b/src/setup/compatibility.c
@@ -22,7 +22,7 @@
 
 #include "compatibility.h"
 
-#define WINDOW_HELP_URL "http://www.chocolate-doom.org/setup-compat"
+#define WINDOW_HELP_URL "https://www.chocolate-doom.org/setup-compat"
 
 int vanilla_savegame_limit = 1;
 int vanilla_demo_limit = 1;
--- a/src/setup/display.c
+++ b/src/setup/display.c
@@ -28,7 +28,7 @@
 #include "display.h"
 #include "config.h"
 
-#define WINDOW_HELP_URL "http://www.chocolate-doom.org/setup-display"
+#define WINDOW_HELP_URL "https://www.chocolate-doom.org/setup-display"
 
 extern void RestartTextscreen(void);
 
--- a/src/setup/joystick.c
+++ b/src/setup/joystick.c
@@ -29,7 +29,7 @@
 #include "txt_joyaxis.h"
 #include "txt_joybinput.h"
 
-#define WINDOW_HELP_URL "http://www.chocolate-doom.org/setup-gamepad"
+#define WINDOW_HELP_URL "https://www.chocolate-doom.org/setup-gamepad"
 
 typedef struct
 {
--- a/src/setup/keyboard.c
+++ b/src/setup/keyboard.c
@@ -25,7 +25,7 @@
 #include "joystick.h"
 #include "keyboard.h"
 
-#define WINDOW_HELP_URL "http://www.chocolate-doom.org/setup-keyboard"
+#define WINDOW_HELP_URL "https://www.chocolate-doom.org/setup-keyboard"
 
 int vanilla_keyboard_mapping = 1;
 
--- a/src/setup/mainmenu.c
+++ b/src/setup/mainmenu.c
@@ -38,7 +38,7 @@
 #include "multiplayer.h"
 #include "sound.h"
 
-#define WINDOW_HELP_URL "http://www.chocolate-doom.org/setup"
+#define WINDOW_HELP_URL "https://www.chocolate-doom.org/setup"
 
 static const int cheat_sequence[] =
 {
--- a/src/setup/mouse.c
+++ b/src/setup/mouse.c
@@ -25,7 +25,7 @@
 #include "mode.h"
 #include "mouse.h"
 
-#define WINDOW_HELP_URL "http://www.chocolate-doom.org/setup-mouse"
+#define WINDOW_HELP_URL "https://www.chocolate-doom.org/setup-mouse"
 
 static int usemouse = 1;
 
--- a/src/setup/multiplayer.c
+++ b/src/setup/multiplayer.c
@@ -34,10 +34,10 @@
 #include "net_io.h"
 #include "net_query.h"
 
-#define MULTI_START_HELP_URL "http://www.chocolate-doom.org/setup-multi-start"
-#define MULTI_JOIN_HELP_URL "http://www.chocolate-doom.org/setup-multi-join"
-#define MULTI_CONFIG_HELP_URL "http://www.chocolate-doom.org/setup-multi-config"
-#define LEVEL_WARP_HELP_URL "http://www.chocolate-doom.org/setup-level-warp"
+#define MULTI_START_HELP_URL "https://www.chocolate-doom.org/setup-multi-start"
+#define MULTI_JOIN_HELP_URL "https://www.chocolate-doom.org/setup-multi-join"
+#define MULTI_CONFIG_HELP_URL "https://www.chocolate-doom.org/setup-multi-config"
+#define LEVEL_WARP_HELP_URL "https://www.chocolate-doom.org/setup-level-warp"
 
 #define NUM_WADS 10
 #define NUM_EXTRA_PARAMS 10
--- a/src/setup/sound.c
+++ b/src/setup/sound.c
@@ -25,7 +25,7 @@
 #include "mode.h"
 #include "sound.h"
 
-#define WINDOW_HELP_URL "http://www.chocolate-doom.org/setup-sound"
+#define WINDOW_HELP_URL "https://www.chocolate-doom.org/setup-sound"
 
 typedef enum
 {
--- a/src/strife.appdata.xml.in
+++ b/src/strife.appdata.xml.in
@@ -26,19 +26,19 @@
   </description>
   <screenshots>
     <screenshot type="default">
-      <image>http://www.chocolate-doom.org/wiki/images/b/b2/GNOME_Strife_Rowan.png</image>
+      <image>https://www.chocolate-doom.org/wiki/images/b/b2/GNOME_Strife_Rowan.png</image>
       <caption>Talking to Rowan</caption>
     </screenshot>
     <screenshot>
-      <image>http://www.chocolate-doom.org/wiki/images/1/1f/GNOME_Strife_Town.png</image>
+      <image>https://www.chocolate-doom.org/wiki/images/1/1f/GNOME_Strife_Town.png</image>
       <caption>The Town</caption>
     </screenshot>
     <screenshot>
-      <image>http://www.chocolate-doom.org/wiki/images/8/8a/GNOME_Strife_Opening.png</image>
+      <image>https://www.chocolate-doom.org/wiki/images/8/8a/GNOME_Strife_Opening.png</image>
       <caption>Opening Cinematic</caption>
     </screenshot>
     <screenshot>
-      <image>http://www.chocolate-doom.org/wiki/images/c/c4/GNOME_Strife_Sewage.png</image>
+      <image>https://www.chocolate-doom.org/wiki/images/c/c4/GNOME_Strife_Sewage.png</image>
       <caption>In the sewage</caption>
     </screenshot>
   </screenshots>
--- a/src/strife/am_map.c
+++ b/src/strife/am_map.c
@@ -320,11 +320,10 @@
 //
 void AM_addMark(void)
 {
-    markpoints[markpointnum].x = m_x + m_w/2;
-    markpoints[markpointnum].y = m_y + m_h/2;
+    markpoints[markpointnum].x = plr->mo->x; // 20160306 [STRIFE]: use player position
+    markpoints[markpointnum].y = plr->mo->y;
     //markpointnum = (markpointnum + 1) % AM_NUMMARKPOINTS;
     ++markpointnum; // haleyjd 20141101: [STRIFE] does not wrap around
-
 }
 
 //
--- a/src/strife/d_main.c
+++ b/src/strife/d_main.c
@@ -832,49 +832,48 @@
     // Load voices.wad 
     if(isregistered)
     {
-        char *name = D_FindWADByName("voices.wad");
+        char *name = NULL;
+        int p;
 
-        if(!name) // not found?
+        // If -iwad was used, check and see if voices.wad exists on the same
+        // filepath.
+        if((p = M_CheckParm("-iwad")) && p < myargc - 1)
         {
-            int p;
+            char   *iwad     = myargv[p + 1];
+            size_t  len      = strlen(iwad) + 1;
+            char   *iwadpath = Z_Malloc(len, PU_STATIC, NULL);
+            char   *voiceswad;
 
-            // haleyjd STRIFE-FIXME: Temporary?
-            // If -iwad was used, check and see if voices.wad exists on the
-            // same filepath.
-            if((p = M_CheckParm("-iwad")) && p < myargc - 1)
-            {
-                char   *iwad     = myargv[p + 1];
-                size_t  len      = strlen(iwad) + 1;
-                char   *iwadpath = Z_Malloc(len, PU_STATIC, NULL);
-                char   *voiceswad;
-                
-                // extract base path of IWAD parameter
-                M_GetFilePath(iwad, iwadpath, len);
-                
-                // concatenate with /voices.wad
-                voiceswad = M_SafeFilePath(iwadpath, "voices.wad");
-                Z_Free(iwadpath);
-
-                if(!M_FileExists(voiceswad))
-                {
-                    disable_voices = 1;
-                    Z_Free(voiceswad);
-                }
-                else
-                    name = voiceswad; // STRIFE-FIXME: memory leak!!
-            }
+            // extract base path of IWAD parameter
+            M_GetFilePath(iwad, iwadpath, len);
+
+            // concatenate with /voices.wad
+            voiceswad = M_SafeFilePath(iwadpath, "voices.wad");
+            Z_Free(iwadpath);
+
+            if(!M_FileExists(voiceswad))
+                Z_Free(voiceswad);
             else
-                disable_voices = 1;
+                name = voiceswad; // STRIFE-FIXME: memory leak!!
         }
 
-        if(disable_voices) // voices disabled?
+        // not found? try global search paths
+        if(!name)
+            name = D_FindWADByName("voices.wad");
+
+        // still not found? too bad.
+        if(!name)
         {
+            disable_voices = 1;
+
             if(devparm)
                  printf("Voices disabled\n");
-            return;
         }
-
-        D_AddFile(name);
+        else
+        {
+            // add it.
+            D_AddFile(name);
+        }
     }
 }
 
--- a/src/strife/g_game.c
+++ b/src/strife/g_game.c
@@ -2329,7 +2329,8 @@
                         "\n"
                         "*** You may need to upgrade your version "
                             "of Strife to v1.1 or later. ***\n"
-                        "    See: http://doomworld.com/files/patches.shtml\n"
+                        "    See: https://www.doomworld.com/classicdoom"
+                                  "/info/patches.php\n"
                         "    This appears to be %s.";
 
         I_Error(message, demoversion, STRIFE_VERSION,
--- a/src/strife/p_enemy.c
+++ b/src/strife/p_enemy.c
@@ -1240,7 +1240,7 @@
     {
         int     t          = P_Random();
         angle_t shootangle = actor->angle + ((t - P_Random()) << 20);
-        int     damage     = (P_Random() & 7) + 1;
+        int     damage     = 3*((P_Random() & 7) + 1);
 
         P_LineAttack(actor, shootangle, 2048*FRACUNIT, slope, damage);
         ++i;
@@ -2211,7 +2211,7 @@
     A_FaceTarget(actor);
     if(P_CheckMeleeRange(actor))
     {
-        int damage = 8 * (P_Random() % 10 + 1);
+        int damage = 6 * (P_Random() % 10 + 1);
         
         S_StartSound(actor, sfx_mtalht);
         P_DamageMobj(actor->target, actor, actor, damage);
@@ -3177,7 +3177,10 @@
     // beacon no longer special
     actor->flags &= ~MF_SPECIAL;
 
-    // set color and flags
+    // 20160306: set rebel threshold
+    mobj->threshold = 100;
+
+    // set rebel color and flags
     mobj->flags |= ((actor->miscdata << MF_TRANSSHIFT) | MF_NODIALOG);
     mobj->target = NULL;
 
--- a/src/strife/p_inter.c
+++ b/src/strife/p_inter.c
@@ -488,13 +488,13 @@
         break;
 
     // missile
-    case SPR_ROKT:
+    case SPR_MSSL:
         if(!P_GiveAmmo(player, am_missiles, 1))
             return;
         break;
 
     // box of missiles
-    case SPR_MSSL:
+    case SPR_ROKT:
         if(!P_GiveAmmo(player, am_missiles, 5))
             return;
         break;
@@ -852,9 +852,9 @@
             }
         }
 
-        target->flags &= ~MF_SOLID;
+        //target->flags &= ~MF_SOLID;
         target->player->playerstate = PST_DEAD;
-        target->player->mo->momz = 5*FRACUNIT;  // [STRIFE]: small hop!
+        target->player->mo->momz += 5*FRACUNIT;  // [STRIFE]: small hop!
         P_DropWeapon(target->player);
 
         if(target->player == &players[consoleplayer]
@@ -1352,7 +1352,7 @@
             if(target->player)
             {
                 target->player->cheats |= CF_ONFIRE;
-                target->player->powers[pw_communicator] = false;
+                target->player->powers[pw_invisibility] = false;
                 target->player->readyweapon = 0;
                 P_SetPsprite(target->player, ps_weapon, S_WAVE_00); // 02
                 P_SetPsprite(target->player, ps_flash, S_NULL);
--- a/src/strife/p_pspr.c
+++ b/src/strife/p_pspr.c
@@ -854,7 +854,7 @@
         mo->health = -1;
         if(!linetarget)
         {
-            an = player->pitch >> ANGLETOFINESHIFT;
+            an = (unsigned int)player->pitch >> ANGLETOFINESHIFT;
             mo->momz += FixedMul(finesine[an], mo->info->speed); 
         }
         break;