From 6ed8d99b48d31255f47f62ee590abd871fcc6f7b Mon Sep 17 00:00:00 2001
From: toasterbabe <rollerorbital@gmail.com>
Date: Sun, 1 Jan 2017 16:24:47 +0000
Subject: [PATCH] * Added "Flickylist = DEMO" option, creating the five species
 of flicky similar enough in appearance to the Freed Animals from the days of
 yore. * Set the default flicky group to be equivalent to Flickylist = Demo. *
 Refactored a little. (This also removed a crash-causing typo in a Z_Free in
 P_ClearSingleMapHeaderInfo.)

---
 src/dehacked.c | 14 +++++---------
 src/p_setup.c  | 36 ++++++++++++++++++++++++++++++++----
 src/p_setup.h  |  3 +++
 3 files changed, 40 insertions(+), 13 deletions(-)

diff --git a/src/dehacked.c b/src/dehacked.c
index ea8b7cb3c1..34558df194 100644
--- a/src/dehacked.c
+++ b/src/dehacked.c
@@ -371,8 +371,7 @@ static void clear_levels(void)
 		// (no need to set num to 0, we're freeing the entire header shortly)
 		Z_Free(mapheaderinfo[i]->customopts);
 
-		if (mapheaderinfo[i]->flickies)
-			Z_Free(mapheaderinfo[i]->flickies);
+		P_DeleteFlickies(i);
 		P_DeleteGrades(i);
 
 		Z_Free(mapheaderinfo[i]);
@@ -1123,12 +1122,9 @@ static void readlevelheader(MYFILE *f, INT32 num)
 			if (fastcmp(word, "FLICKYLIST") || fastcmp(word, "ANIMALLIST"))
 			{
 				if (fastcmp(word2, "NONE"))
-				{
-					if (mapheaderinfo[num-1]->flickies)
-						Z_Free(mapheaderinfo[num-1]->flickies);
-					mapheaderinfo[num-1]->flickies = NULL;
-					mapheaderinfo[num-1]->numFlickies = 0;
-				}
+					P_DeleteFlickies(num-1);
+				else if (fastcmp(word2, "DEMO"))
+					P_SetDemoFlickies(num-1);
 				else if (fastcmp(word2, "ALL"))
 				{
 					mobjtype_t tmpflickies[MAXFLICKIES];
@@ -1138,7 +1134,7 @@ static void readlevelheader(MYFILE *f, INT32 num)
 					mapheaderinfo[num-1]->numFlickies++)
 						tmpflickies[mapheaderinfo[num-1]->numFlickies] = FLICKYTYPES[mapheaderinfo[num-1]->numFlickies].type;
 
-					if (mapheaderinfo[num-1]->numFlickies)
+					if (mapheaderinfo[num-1]->numFlickies) // just in case...
 					{
 						size_t newsize = sizeof(mobjtype_t) * mapheaderinfo[num-1]->numFlickies;
 						mapheaderinfo[num-1]->flickies = Z_Realloc(mapheaderinfo[num-1]->flickies, newsize, PU_STATIC, NULL);
diff --git a/src/p_setup.c b/src/p_setup.c
index a9121e6b82..ae866c2dcd 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -160,6 +160,33 @@ FUNCNORETURN static ATTRNORETURN void CorruptMapError(const char *msg)
 	I_Error("Invalid or corrupt map.\nLook in log file or text console for technical details.");
 }
 
+/** Sets a header's flickies to be equivalent to the original Freed Animals
+  *
+  * \param i The header to set flickies for
+  */
+void P_SetDemoFlickies(INT16 i)
+{
+	mapheaderinfo[i]->numFlickies = 5;
+	mapheaderinfo[i]->flickies = Z_Realloc(mapheaderinfo[i]->flickies, 5*sizeof(mobjtype_t), PU_STATIC, NULL);
+	mapheaderinfo[i]->flickies[0] = MT_FLICKY_02/*MT_BUNNY*/;
+	mapheaderinfo[i]->flickies[1] = MT_FLICKY_01/*MT_BIRD*/;
+	mapheaderinfo[i]->flickies[2] = MT_FLICKY_12/*MT_MOUSE*/;
+	mapheaderinfo[i]->flickies[3] = MT_FLICKY_11/*MT_COW*/;
+	mapheaderinfo[i]->flickies[4] = MT_FLICKY_03/*MT_CHICKEN*/;
+}
+
+/** Clears a header's flickies
+  *
+  * \param i The header to clear flickies for
+  */
+void P_DeleteFlickies(INT16 i)
+{
+	if (mapheaderinfo[i]->flickies)
+		Z_Free(mapheaderinfo[i]->flickies);
+	mapheaderinfo[i]->flickies = NULL;
+	mapheaderinfo[i]->numFlickies = 0;
+}
+
 #define NUMLAPS_DEFAULT 4
 
 /** Clears the data from a single map header.
@@ -224,10 +251,11 @@ static void P_ClearSingleMapHeaderInfo(INT16 i)
 	DEH_WriteUndoline("MENUFLAGS", va("%d", mapheaderinfo[num]->menuflags), UNDO_NONE);
 	mapheaderinfo[num]->menuflags = 0;
 	// Flickies. Nope, no delfile support here either
-	if (mapheaderinfo[num]->flickies)
-		Z_Free(mapheaderinfo[i]->flickies);
-	mapheaderinfo[num]->flickies = NULL;
-	mapheaderinfo[num]->numFlickies = 0;
+#if 1 // equivalent to "FlickyList = DEMO"
+	P_SetDemoFlickies(num);
+#else // equivalent to "FlickyList = NONE"
+	P_DeleteFlickies(num);
+#endif
 	// TODO grades support for delfile (pfft yeah right)
 	P_DeleteGrades(num);
 	// an even further impossibility, delfile custom opts support
diff --git a/src/p_setup.h b/src/p_setup.h
index 0d735fd71c..98ae7745e3 100644
--- a/src/p_setup.h
+++ b/src/p_setup.h
@@ -66,6 +66,9 @@ void P_WriteThings(lumpnum_t lump);
 size_t P_PrecacheLevelFlats(void);
 void P_AllocMapHeader(INT16 i);
 
+void P_SetDemoFlickies(INT16 i);
+void P_DeleteFlickies(INT16 i);
+
 // Needed for NiGHTS
 void P_ReloadRings(void);
 void P_DeleteGrades(INT16 i);
-- 
GitLab