From 4434e322e25e1d578197f44e9868e7d4c401ba3d Mon Sep 17 00:00:00 2001
From: Christoph Oelckers <coelckers@zdoom.fake>
Date: Fri, 23 May 2008 14:04:16 +0000
Subject: [PATCH] - Fixed: The first texture in a TEXTURE1 lump, although
 invalid when used   elsewhere, must be usable as sky (see Requiem.wad's
 SKY3.)

SVN r993 (trunk)
---
 docs/rh-log.txt                    |  2 ++
 src/g_level.cpp                    |  4 ++--
 src/p_acs.cpp                      |  4 ++--
 src/r_defs.h                       |  2 ++
 src/textures/multipatchtexture.cpp |  2 +-
 src/textures/texturemanager.cpp    | 11 ++++++++++-
 6 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/docs/rh-log.txt b/docs/rh-log.txt
index fbfb4d264..ab001cb9e 100644
--- a/docs/rh-log.txt
+++ b/docs/rh-log.txt
@@ -1,4 +1,6 @@
 May 23, 2008 (Changes by Graf Zahl)
+- Fixed: The first texture in a TEXTURE1 lump, although invalid when used
+  elsewhere, must be usable as sky (see Requiem.wad's SKY3.)
 - Fixed: side_t::GetLightLevel relied on the global 'linedef' variable for
   automatic fake contrast.
 - Changed: Fake contrast now uses the WALLF_AUTOCONTRAST globally instead
diff --git a/src/g_level.cpp b/src/g_level.cpp
index f1a95647c..0060ca177 100644
--- a/src/g_level.cpp
+++ b/src/g_level.cpp
@@ -2043,8 +2043,8 @@ void G_DoLoadLevel (int position, bool autosave)
 	// DOOM determines the sky texture to be used
 	// depending on the current episode and the game version.
 	// [RH] Fetch sky parameters from FLevelLocals.
-	sky1texture = TexMan.GetTexture (level.skypic1, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable);
-	sky2texture = TexMan.GetTexture (level.skypic2, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable);
+	sky1texture = TexMan.GetTexture (level.skypic1, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_ReturnFirst);
+	sky2texture = TexMan.GetTexture (level.skypic2, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_ReturnFirst);
 
 	// [RH] Set up details about sky rendering
 	R_InitSkyMap ();
diff --git a/src/p_acs.cpp b/src/p_acs.cpp
index 804c98053..5aafafdb6 100644
--- a/src/p_acs.cpp
+++ b/src/p_acs.cpp
@@ -5065,12 +5065,12 @@ int DLevelScript::RunScript ()
 				if (sky1name[0] != 0)
 				{
 					strncpy (level.skypic1, sky1name, 8);
-					sky1texture = TexMan.GetTexture (sky1name, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable);
+					sky1texture = TexMan.GetTexture (sky1name, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_ReturnFirst);
 				}
 				if (sky2name[0] != 0)
 				{
 					strncpy (level.skypic2, sky2name, 8);
-					sky2texture = TexMan.GetTexture (sky2name, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable);
+					sky2texture = TexMan.GetTexture (sky2name, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_ReturnFirst);
 				}
 				R_InitSkyMap ();
 			}
diff --git a/src/r_defs.h b/src/r_defs.h
index d58c39632..a81d1dad4 100644
--- a/src/r_defs.h
+++ b/src/r_defs.h
@@ -796,6 +796,7 @@ public:
 		TEX_Override,	// For patches between TX_START/TX_END
 		TEX_Autopage,	// Automap background - used to enable the use of FAutomapTexture
 		TEX_Null,
+		TEX_FirstDefined,
 	};
 
 	struct Span
@@ -945,6 +946,7 @@ public:
 	{
 		TEXMAN_TryAny = 1,
 		TEXMAN_Overridable = 2,
+		TEXMAN_ReturnFirst = 4,
 	};
 
 	int CheckForTexture (const char *name, int usetype, BITFIELD flags=TEXMAN_TryAny);
diff --git a/src/textures/multipatchtexture.cpp b/src/textures/multipatchtexture.cpp
index 6ca630f0f..ffa0806d7 100644
--- a/src/textures/multipatchtexture.cpp
+++ b/src/textures/multipatchtexture.cpp
@@ -807,7 +807,7 @@ void FTextureManager::AddTexturesLump (const void *lumpdata, int lumpsize, int d
 			FMultiPatchTexture *tex = new FMultiPatchTexture ((const BYTE *)maptex + offset, patchlookup, numpatches, isStrife, deflumpnum);
 			if (i == 1 && texture1)
 			{
-				tex->UseType = FTexture::TEX_Null;
+				tex->UseType = FTexture::TEX_FirstDefined;
 			}
 			TexMan.AddTexture (tex);
 			StartScreen->Progress();
diff --git a/src/textures/texturemanager.cpp b/src/textures/texturemanager.cpp
index 16cc6ecc5..9937df0f8 100644
--- a/src/textures/texturemanager.cpp
+++ b/src/textures/texturemanager.cpp
@@ -125,6 +125,11 @@ int FTextureManager::CheckForTexture (const char *name, int usetype, BITFIELD fl
 			{
 				return i;
 			}
+			else if (tex->UseType == FTexture::TEX_FirstDefined && usetype == FTexture::TEX_Wall)
+			{
+				if (!(flags & TEXMAN_ReturnFirst)) return 0;
+				else return i;
+			}
 			else if (tex->UseType == FTexture::TEX_Null && usetype == FTexture::TEX_Wall)
 			{
 				// We found a NULL texture on a wall -> return 0
@@ -147,7 +152,11 @@ int FTextureManager::CheckForTexture (const char *name, int usetype, BITFIELD fl
 	if ((flags & TEXMAN_TryAny) && usetype != FTexture::TEX_Any)
 	{
 		// Never return the index of NULL textures.
-		if (firstfound != -1 && firsttype == FTexture::TEX_Null) return 0;
+		if (firstfound != -1)
+		{
+			if (firsttype == FTexture::TEX_Null) return 0;
+			if (firsttype == FTexture::TEX_FirstDefined && !(flags & TEXMAN_ReturnFirst)) return 0;
+		}
 		return firstfound;
 	}