From 319610763e127bd689ef8bfadf589bb537ccae92 Mon Sep 17 00:00:00 2001
From: Lactozilla <jp6781615@gmail.com>
Date: Wed, 17 Jul 2024 23:22:56 -0300
Subject: [PATCH] Fix "Several patches used in Sol Sestancia 2 are broken"

---
 src/w_wad.c | 24 +++++++++++++++++++-----
 src/w_wad.h |  1 +
 2 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/src/w_wad.c b/src/w_wad.c
index cc7cdc2016..97208296aa 100644
--- a/src/w_wad.c
+++ b/src/w_wad.c
@@ -1329,10 +1329,10 @@ UINT16 W_CheckNumForFolderStartPK3(const char *name, UINT16 wad, UINT16 startlum
 			/* SLADE is special and puts a single directory entry. Skip that. */
 			if (strlen(lump_p->fullname) == name_length)
 				i++;
-			break;
+			return i;
 		}
 	}
-	return i;
+	return INT16_MAX;
 }
 
 // In a PK3 type of resource file, it looks for the next lumpinfo entry that doesn't share the specified pathfile.
@@ -1350,6 +1350,17 @@ UINT16 W_CheckNumForFolderEndPK3(const char *name, UINT16 wad, UINT16 startlump)
 	return i;
 }
 
+// Returns 0 if the folder is not empty, 1 if it is empty, -1 if it doesn't exist
+INT32 W_IsFolderEmpty(const char *name, UINT16 wad)
+{
+	UINT16 start = W_CheckNumForFolderStartPK3(name, wad, 0);
+	if (start == INT16_MAX)
+		return -1;
+
+	// Unlike W_CheckNumForFolderStartPK3, W_CheckNumForFolderEndPK3 doesn't return INT16_MAX.
+	return W_CheckNumForFolderEndPK3(name, wad, start) <= start;
+}
+
 char *W_GetLumpFolderPathPK3(UINT16 wad, UINT16 lump)
 {
 	const char *fullname = wadfiles[wad]->lumpinfo[lump].fullname;
@@ -1692,7 +1703,7 @@ lumpnum_t W_GetNumForLongName(const char *name)
 //
 static UINT16 W_CheckNumForPatchNamePwad(const char *name, UINT16 wad, boolean longname)
 {
-	UINT16 i, start, end;
+	UINT16 i, start = INT16_MAX, end = INT16_MAX;
 	static char uname[8 + 1] = { 0 };
 	UINT32 hash = 0;
 	lumpinfo_t *lump_p;
@@ -1714,8 +1725,11 @@ static UINT16 W_CheckNumForPatchNamePwad(const char *name, UINT16 wad, boolean l
 	// TODO: cache namespace lump IDs
 	if (W_FileHasFolders(wadfiles[wad]))
 	{
-		start = W_CheckNumForFolderStartPK3("Flats/", wad, 0);
-		end = W_CheckNumForFolderEndPK3("Flats/", wad, start);
+		if (!W_IsFolderEmpty("Flats/", wad))
+		{
+			start = W_CheckNumForFolderStartPK3("Flats/", wad, 0);
+			end = W_CheckNumForFolderEndPK3("Flats/", wad, start);
+		}
 	}
 	else
 	{
diff --git a/src/w_wad.h b/src/w_wad.h
index 3dcb9b6e8b..4fd7b2c008 100644
--- a/src/w_wad.h
+++ b/src/w_wad.h
@@ -180,6 +180,7 @@ UINT16 W_CheckNumForMarkerStartPwad(const char *name, UINT16 wad, UINT16 startlu
 UINT16 W_CheckNumForFullNamePK3(const char *name, UINT16 wad, UINT16 startlump);
 UINT16 W_CheckNumForFolderStartPK3(const char *name, UINT16 wad, UINT16 startlump);
 UINT16 W_CheckNumForFolderEndPK3(const char *name, UINT16 wad, UINT16 startlump);
+INT32 W_IsFolderEmpty(const char *name, UINT16 wad);
 char *W_GetLumpFolderPathPK3(UINT16 wad, UINT16 lump);
 char *W_GetLumpFolderNamePK3(UINT16 wad, UINT16 lump);
 
-- 
GitLab