From a85e31932c2e8acc53c3fe3cb843e44fbd18ea0e Mon Sep 17 00:00:00 2001
From: Tim Felgentreff <timfelgentreff@gmail.com>
Date: Tue, 22 Dec 2020 17:53:39 +0100
Subject: [PATCH] add game types that are useful for training AIs

---
 src/game/game.cpp      | 44 ++++++++++++++++++++++++++++++++++++++++++
 src/include/settings.h |  4 +++-
 src/tolua/game.pkg     |  2 ++
 3 files changed, 49 insertions(+), 1 deletion(-)

diff --git a/src/game/game.cpp b/src/game/game.cpp
index d07bba4b8..435100586 100644
--- a/src/game/game.cpp
+++ b/src/game/game.cpp
@@ -690,6 +690,7 @@ static void GameTypeLeftVsRight()
 */
 static void GameTypeManVsMachine()
 {
+	Map.NoFogOfWar = true;
 	for (int i = 0; i < PlayerMax - 1; ++i) {
 		if (Players[i].Type != PlayerPerson && Players[i].Type != PlayerComputer) {
 			continue;
@@ -738,6 +739,42 @@ static void GameTypeManTeamVsMachine()
 	}
 }
 
+/**
+**  Machine vs Machine
+*/
+static void GameTypeMachineVsMachine()
+{
+	Map.Reveal();
+	for (int i = 0; i < PlayerMax - 1; ++i) {
+		if (Players[i].Type == PlayerComputer) {
+			for (int j = i + 1; j < PlayerMax - 1; ++j) {
+				if (Players[j].Type == PlayerComputer) {
+					CommandDiplomacy(i, DiplomacyEnemy, j);
+					CommandDiplomacy(j, DiplomacyEnemy, i);
+				} else {
+					CommandDiplomacy(i, DiplomacyNeutral, j);
+					CommandDiplomacy(j, DiplomacyNeutral, i);
+				}
+			}
+		}
+	}
+}
+
+/**
+ ** Machine vs Machine Training
+ */
+static void GameTypeMachineVsMachineTraining()
+{
+	Assert(!IsNetworkGame());
+	GameTypeMachineVsMachine();
+	FastForwardCycle = LONG_MAX;
+	SyncHash = 0;
+	InitSyncRand();
+	for (int i = 0; i < MyRand() % 100; i++) {
+		SyncRand();
+	}
+}
+
 /*----------------------------------------------------------------------------
 --  Game creation
 ----------------------------------------------------------------------------*/
@@ -871,6 +908,13 @@ void CreateGame(const std::string &filename, CMap *map)
 				break;
 			case SettingsGameTypeManTeamVsMachine:
 				GameTypeManTeamVsMachine();
+				break;
+			case SettingsGameTypeMachineVsMachine:
+				GameTypeMachineVsMachine();
+				break;
+			case SettingsGameTypeMachineVsMachineTraining:
+				GameTypeMachineVsMachineTraining();
+				break;
 
 				// Future game type ideas
 #if 0
diff --git a/src/include/settings.h b/src/include/settings.h
index 409519b83..9508cfd99 100644
--- a/src/include/settings.h
+++ b/src/include/settings.h
@@ -101,7 +101,9 @@ enum GameTypes {
 	SettingsGameTypeTopVsBottom,
 	SettingsGameTypeLeftVsRight,
 	SettingsGameTypeManVsMachine,
-	SettingsGameTypeManTeamVsMachine
+	SettingsGameTypeManTeamVsMachine,
+	SettingsGameTypeMachineVsMachine,
+	SettingsGameTypeMachineVsMachineTraining
 
 	// Future game type ideas
 #if 0
diff --git a/src/tolua/game.pkg b/src/tolua/game.pkg
index bfc1b63ce..e085a08a8 100644
--- a/src/tolua/game.pkg
+++ b/src/tolua/game.pkg
@@ -80,5 +80,7 @@ enum GameTypes {
 	SettingsGameTypeLeftVsRight,
 	SettingsGameTypeManVsMachine,
 	SettingsGameTypeManTeamVsMachine,
+	SettingsGameTypeMachineVsMachine,
+        SettingsGameTypeMachineVsMachineTraining,
 };