From ec960e263744157598006930240122e14958f9ee Mon Sep 17 00:00:00 2001
From: jsalmon3 <>
Date: Mon, 24 Jun 2002 15:15:39 +0000
Subject: [PATCH] Fixed multiplayer fog of war, initial support for more game
 types

---
 src/game/game.cpp        | 45 ++++++++++++++++++++++++++++++++++++++++
 src/include/netconnect.h |  3 ++-
 src/include/settings.h   | 20 ++++++++++++++++++
 src/ui/menu_defs.inc     |  8 ++++---
 src/ui/menus.cpp         | 28 +++++++++++++++++++++----
 5 files changed, 96 insertions(+), 8 deletions(-)

diff --git a/src/game/game.cpp b/src/game/game.cpp
index 0ff53e3c3..7690867d0 100644
--- a/src/game/game.cpp
+++ b/src/game/game.cpp
@@ -56,6 +56,7 @@
 #include "settings.h"
 #include "campaign.h"
 #include "trigger.h"
+#include "commands.h"
 
 #include "ccl.h"
 
@@ -151,6 +152,20 @@ local void LoadMap(const char* filename,WorldMap* map)
 --	Game creation
 ----------------------------------------------------------------------------*/
 
+local void GameTypeFreeForAll(void)
+{
+    int i;
+    int j;
+
+    for (i=0; i<15; i++) {
+	for (j=0; j<15; j++) {
+	    if (i != j) {
+		SendCommandDiplomacy(i,DiplomacyEnemy,j);
+	    }
+	}
+    }
+}
+
 /**
 **	CreateGame.
 **
@@ -229,6 +244,35 @@ global void CreateGame(char* filename, WorldMap* map)
 	}
     }
 
+    // FIXME: implement more game types
+    if (GameSettings.GameType != SettingsGameTypeMapDefault) {
+	switch (GameSettings.GameType) {
+	    case SettingsGameTypeMelee:
+		break;
+	    case SettingsGameTypeFreeForAll:
+		GameTypeFreeForAll();
+		break;
+	    case SettingsGameTypeOneOnOne:
+		break;
+	    case SettingsGameTypeCaptureTheFlag:
+		break;
+	    case SettingsGameTypeGreed:
+		break;
+	    case SettingsGameTypeSlaughter:
+		break;
+	    case SettingsGameTypeSuddenDeath:
+		break;
+	    case SettingsGameTypeTeamMelee:
+		break;
+	    case SettingsGameTypeTeamCaptureTheFlag:
+		break;
+	    case SettingsGameTypeTopVsBottom:
+		break;
+	    case SettingsGameTypeLeftVsRight:
+		break;
+	}
+    }
+
     //
     //	Graphic part
     //
@@ -395,6 +439,7 @@ global void InitSettings(void)
     GameSettings.NumUnits = SettingsNumUnitsMapDefault;
     GameSettings.Opponents = SettingsPresetMapDefault;
     GameSettings.Terrain = SettingsPresetMapDefault;
+    GameSettings.GameType = SettingsPresetMapDefault;
 }
 
 //@}
diff --git a/src/include/netconnect.h b/src/include/netconnect.h
index 39a7ad563..2d903c8d4 100644
--- a/src/include/netconnect.h
+++ b/src/include/netconnect.h
@@ -43,7 +43,7 @@
     /// Network protocol minor version (maximal 99)
 #define NetworkProtocolMinorVersion	4
     /// Network protocol patch level (maximal 99)
-#define NetworkProtocolPatchLevel	4
+#define NetworkProtocolPatchLevel	5
     /// Network protocol version (1,2,3) -> 10203
 #define NetworkProtocolVersion \
 	(NetworkProtocolMajorVersion*10000+NetworkProtocolMinorVersion*100 \
@@ -87,6 +87,7 @@ typedef struct _setup_state_ {
     unsigned char	UnsOpt;			/// Unit # option
     unsigned char	FwsOpt;			/// Fog of war option
     unsigned char	TssOpt;			/// Tileset select option
+    unsigned char	GaTOpt;			/// Game type option
     unsigned char	CompOpt[PlayerMax];	/// Free slot option selection
     unsigned char	Ready[PlayerMax];	/// Client ready state
     unsigned char	Race[PlayerMax];	/// Client race selection
diff --git a/src/include/settings.h b/src/include/settings.h
index 470a1fa21..861e23853 100644
--- a/src/include/settings.h
+++ b/src/include/settings.h
@@ -67,6 +67,7 @@ struct _settings_ {
     unsigned	NumUnits;		/// Preset # of units
     unsigned	Opponents;		/// Preset # of ai-opponents
     unsigned	Terrain;		/// Terrain type (summer,winter,...)
+    unsigned	GameType;		/// Game type (melee, free for all,...)
 };
 
 #define SettingsPresetMapDefault	(~0ul)	/// Special: Use pud/cm supplied
@@ -85,6 +86,25 @@ struct _settings_ {
 #define SettingsNumUnitsMapDefault	SettingsPresetMapDefault
 #define SettingsNumUnits1		0
 
+/*
+**	GameType settings
+*/
+enum {
+    SettingsGameTypeMapDefault=SettingsPresetMapDefault,
+    SettingsGameTypeMelee=0,
+    SettingsGameTypeFreeForAll,
+    SettingsGameTypeOneOnOne,
+    SettingsGameTypeCaptureTheFlag,
+    SettingsGameTypeGreed,
+    SettingsGameTypeSlaughter,
+    SettingsGameTypeSuddenDeath,
+    SettingsGameTypeTeamMelee,
+    SettingsGameTypeTeamCaptureTheFlag,
+    SettingsGameTypeTopVsBottom,
+    SettingsGameTypeLeftVsRight,
+} GameTypes;
+
+
 // ----------------------------------------------------------------------------
 
 #define MAX_BRIEFING_VOICES	2	/// How many intro voices supported
diff --git a/src/ui/menu_defs.inc b/src/ui/menu_defs.inc
index 6baa245b8..853fef07e 100644
--- a/src/ui/menu_defs.inc
+++ b/src/ui/menu_defs.inc
@@ -2172,9 +2172,9 @@ global void SaveMenus(FILE* file)
     /// Offsets into NetMultiSetupMenuItems
 #define SERVER_PLAYER_STATE	5
     /// Offsets into NetMultiSetupMenuItems
-#define SERVER_PLAYER_READY	30
+#define SERVER_PLAYER_READY	32
     /// Offsets into NetMultiSetupMenuItems
-#define SERVER_PLAYER_LAG	44
+#define SERVER_PLAYER_LAG	46
 
     /// Offsets into NetMultiClientMenuItems
 #define CLIENT_PLAYER_STATE	5
@@ -2188,7 +2188,9 @@ global void SaveMenus(FILE* file)
 #define CLIENT_FOG_OF_WAR	27
     /// Offsets into NetMultiClientMenuItems
 #define CLIENT_TILESET		29
+	/// Offsets into NetMultiClientMenuItems
+#define CLIENT_GAMETYPE		31
     /// Offsets into NetMultiClientMenuItems
-#define CLIENT_PLAYER_READY	30
+#define CLIENT_PLAYER_READY	32
 
 //@}
diff --git a/src/ui/menus.cpp b/src/ui/menus.cpp
index 4113f097f..e993624ad 100644
--- a/src/ui/menus.cpp
+++ b/src/ui/menus.cpp
@@ -3543,8 +3543,8 @@ local void GameGATAction(Menuitem *mi, int i)
 {
     if (!mi || mi->d.pulldown.curopt == i) {
 	// FIXME: not supported
-	// GameSettings.GameType = i-1;
-	// ServerSetupState.GaTOpt = i;
+	GameSettings.GameType = i ? SettingsGameTypeMelee + i-1 : SettingsGameTypeMapDefault;
+	ServerSetupState.GaTOpt = i;
 	if (mi) {
 	    NetworkServerResyncClients();
 	}
@@ -3564,7 +3564,24 @@ local void CustomGameOPSAction(Menuitem *mi __attribute__((unused)), int i)
 local void MultiGameFWSAction(Menuitem *mi, int i)
 {
     if (!mi || mi->d.pulldown.curopt == i) {
-	FlagRevealMap = i;
+	switch (i) {
+	    case 0:
+		TheMap.NoFogOfWar = 0;
+		FlagRevealMap = 0;
+		break;
+	    case 1:
+		TheMap.NoFogOfWar = 1;
+		FlagRevealMap = 0;
+		break;
+	    case 2:
+		TheMap.NoFogOfWar = 0;
+		FlagRevealMap = 1;
+		break;
+	    case 3:
+		TheMap.NoFogOfWar = 1;
+		FlagRevealMap = 1;
+		break;
+	}
 	ServerSetupState.FwsOpt = i;
 	if (mi) {
 	    NetworkServerResyncClients();
@@ -3933,7 +3950,6 @@ local void MultiGameSetupInit(Menuitem *mi)
 	*CurrentMapPath='\0';
     }
 
-    FlagRevealMap = 0;
     GameSetupInit(mi);
     NetworkInitServerConnect();
     menu->items[SERVER_PLAYER_STATE] = NetMultiButtonStorage[1];
@@ -4195,6 +4211,10 @@ global void NetClientUpdateState(void)
     menu->items[CLIENT_TILESET].d.pulldown.curopt =
 	ServerSetupState.TssOpt;
 
+    GameGATAction(NULL, ServerSetupState.GaTOpt);
+    menu->items[CLIENT_GAMETYPE].d.pulldown.curopt =
+	ServerSetupState.GaTOpt;
+
     MultiClientUpdate(0);
     DebugLevel1Fn("MultiClientMenuRedraw\n");