From 15862ed02c888feb74cc2cabd64c546cd503df73 Mon Sep 17 00:00:00 2001
From: Jaime Passos <lazymyuutsu@gmail.com>
Date: Wed, 18 Dec 2019 12:23:42 -0300
Subject: [PATCH] G_NewGametype

---
 src/d_netcmd.c |  2 ++
 src/doomstat.h |  2 ++
 src/g_game.c   | 27 +++++++++++++++++++++++++++
 src/g_game.h   |  2 ++
 4 files changed, 33 insertions(+)

diff --git a/src/d_netcmd.c b/src/d_netcmd.c
index a806a1052..7b8095555 100644
--- a/src/d_netcmd.c
+++ b/src/d_netcmd.c
@@ -383,6 +383,8 @@ boolean timedemo_quit;
 
 INT16 gametype = GT_COOP;
 UINT32 gametyperules = 0;
+INT16 numgametypes = (GT_CTF + 1);
+
 boolean splitscreen = false;
 boolean circuitmap = false;
 INT32 adminplayers[MAXPLAYERS];
diff --git a/src/doomstat.h b/src/doomstat.h
index c51b98c3f..66f7f3008 100644
--- a/src/doomstat.h
+++ b/src/doomstat.h
@@ -85,6 +85,8 @@ extern boolean multiplayer;
 
 extern INT16 gametype;
 extern UINT32 gametyperules;
+extern INT16 numgametypes;
+
 extern boolean splitscreen;
 extern boolean circuitmap; // Does this level have 'circuit mode'?
 extern boolean fromlevelselect;
diff --git a/src/g_game.c b/src/g_game.c
index cb25dd954..e70d4a6d1 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -3094,6 +3094,33 @@ void G_SetGametype(INT16 gtype)
 	CONS_Printf("Gametype set to %s (%d)\n", Gametype_Names[gametype], gametype);
 }
 
+//
+// G_NewGametype
+//
+// Create a new gametype. Returns the new gametype number.
+//
+INT16 G_NewGametype(UINT32 rules)
+{
+	INT32 i;
+	INT16 newgtype = numgametypes;
+	numgametypes++;
+
+	// Set gametype rules.
+	gametypedefaultrules[newgtype] = numgametypes;
+	Gametype_Names[newgtype] = "???";
+
+	// Update gametype_cons_t accordingly.
+	for (i = 0; i < numgametypes; i++)
+	{
+		gametype_cons_t[i].value = i;
+		gametype_cons_t[i].strvalue = Gametype_Names[i];
+	}
+	gametype_cons_t[NUMGAMETYPES].value = 0;
+	gametype_cons_t[NUMGAMETYPES].strvalue = NULL;
+
+	return newgtype;
+}
+
 //
 // G_GetGametypeByName
 //
diff --git a/src/g_game.h b/src/g_game.h
index a925e14c1..ef3e9ffab 100644
--- a/src/g_game.h
+++ b/src/g_game.h
@@ -202,6 +202,8 @@ void G_StopDemo(void);
 boolean G_CheckDemoStatus(void);
 
 void G_SetGametype(INT16 gametype);
+INT16 G_NewGametype(UINT32 rules);
+
 INT32 G_GetGametypeByName(const char *gametypestr);
 boolean G_IsSpecialStage(INT32 mapnum);
 boolean G_GametypeUsesLives(void);