(svn r3226) -Fix: GPMI implementation had minor glitches
authortruelight
Tue, 22 Nov 2005 15:55:38 +0000
changeset 2684 8aba54c245cc
parent 2683 6f67fcf73873
child 2685 00111d5ca47f
(svn r3226) -Fix: GPMI implementation had minor glitches
-Fix: the AI speed control is done by the AI-core, individual AIs don't have to do it (so, AIs were delayed twice ;)
-Add: Support for AI-network-clients (an AI, connecting to a remote server)
-Fix: minor AI-core problems
ai/ai.c
ai/ai.h
ai/default/default.c
ai/trolly/trolly.c
economy.c
network_client.c
openttd.c
players.c
--- a/ai/ai.c	Tue Nov 22 14:02:45 2005 +0000
+++ b/ai/ai.c	Tue Nov 22 15:55:38 2005 +0000
@@ -87,7 +87,7 @@
 	/* First, do a test-run to see if we can do this */
 	res = DoCommandByTile(tile, p1, p2, flags & ~DC_EXEC, procc);
 	/* The command failed, or you didn't want to execute, or you are quering, return */
-	if ((res & CMD_ERROR) || !(flags & DC_EXEC) || (flags & DC_QUERY_COST))
+	if ((CmdFailed(res)) || !(flags & DC_EXEC) || (flags & DC_QUERY_COST))
 		return res;
 
 	/* If we did a DC_EXEC, and the command did not return an error, execute it
@@ -162,10 +162,10 @@
 		return;
 
 	/* Check for AI-client (so joining a network with an AI) */
-	if (_ai.network_client) {
+	if (_ai.network_client && _ai_player[_ai.network_playas].active) {
 		/* Run the script */
-		AI_DequeueCommands(_ai.network_player);
-		AI_RunTick(_ai.network_player);
+		AI_DequeueCommands(_ai.network_playas);
+		AI_RunTick(_ai.network_playas);
 	} else if (!_networking || _network_server) {
 		/* Check if we want to run AIs (server or SP only) */
 		Player *p;
@@ -199,6 +199,9 @@
  */
 void AI_PlayerDied(PlayerID player)
 {
+	if (_ai.network_client && _ai.network_playas == player)
+		_ai.network_playas = OWNER_SPECTATOR;
+
 	/* Called if this AI died */
 	_ai_player[player].active = false;
 }
@@ -208,9 +211,13 @@
  */
 void AI_Initialize(void)
 {
+	bool ai_network_client = _ai.network_client;
+
 	memset(&_ai, 0, sizeof(_ai));
 	memset(&_ai_player, 0, sizeof(_ai_player));
 
+	_ai.network_client = ai_network_client;
+	_ai.network_playas = OWNER_SPECTATOR;
 	_ai.enabled = true;
 }
 
--- a/ai/ai.h	Tue Nov 22 14:02:45 2005 +0000
+++ b/ai/ai.h	Tue Nov 22 15:55:38 2005 +0000
@@ -31,7 +31,7 @@
 
 	/* For network-clients (a OpenTTD client who acts as an AI connected to a server) */
 	bool network_client;    //! Are we a network_client?
-	uint8 network_player;   //! The current network player we are connected as
+	uint8 network_playas;   //! The current network player we are connected as
 } AIStruct;
 
 VARDEF AIStruct _ai;
--- a/ai/default/default.c	Tue Nov 22 14:02:45 2005 +0000
+++ b/ai/default/default.c	Tue Nov 22 15:55:38 2005 +0000
@@ -3938,24 +3938,6 @@
 	AiAdjustLoan(p);
 	AiBuildCompanyHQ(p);
 
-	if (_opt.diff.competitor_speed == 4) {
-		/* ultraspeed */
-		_ai_actions[p->ai.state](p);
-		if (p->bankrupt_asked != 0)
-			return;
-	} else if (_opt.diff.competitor_speed != 3) {
-		p->ai.tick++;
-		if (!(p->ai.tick&1))
-			return;
-		if (_opt.diff.competitor_speed != 2) {
-			if (!(p->ai.tick&2))
-				return;
-			if (_opt.diff.competitor_speed == 0) {
-				if (!(p->ai.tick&4))
-					return;
-			}
-		}
-	}
 #if 0
 	{
 		static byte old_state = 99;
--- a/ai/trolly/trolly.c	Tue Nov 22 14:02:45 2005 +0000
+++ b/ai/trolly/trolly.c	Tue Nov 22 15:55:38 2005 +0000
@@ -44,7 +44,7 @@
 	assert(p->ainew.state == AI_STATE_FIRST_TIME);
 	// We first have to init some things
 
-	if (_current_player == 1) {
+	if (_current_player == 1 || _ai.network_client) {
 		ShowErrorMessage(-1, TEMP_AI_IN_PROGRESS, 0, 0);
 	}
 
@@ -1347,9 +1347,6 @@
 
 void AiNewDoGameLoop(Player *p)
 {
-	// If it is a human player, it is not an AI, so bubye!
-	if (IS_HUMAN_PLAYER(_current_player)) return;
-
 	if (p->ainew.state == AI_STATE_STARTUP) {
 		// The AI just got alive!
 		p->ainew.state = AI_STATE_FIRST_TIME;
@@ -1362,29 +1359,6 @@
 	// We keep a ticker. We use it for competitor_speed
 	p->ainew.tick++;
 
-	// See what the speed is
-	switch (_opt.diff.competitor_speed) {
-		case 0: // Very slow
-			if (!(p->ainew.tick&8)) return;
-			break;
-
-		case 1: // Slow
-			if (!(p->ainew.tick&4)) return;
-			break;
-
-		case 2:
-			if (!(p->ainew.tick&2)) return;
-			break;
-
-		case 3:
-			if (!(p->ainew.tick&1)) return;
-			break;
-
-		case 4: // Very fast
-		default: // Cool, a new speed setting.. ;) VERY fast ;)
-			break;
-	}
-
 	// If we come here, we can do a tick.. do so!
 	AiNew_OnTick(p);
 }
--- a/economy.c	Tue Nov 22 14:02:45 2005 +0000
+++ b/economy.c	Tue Nov 22 15:55:38 2005 +0000
@@ -477,6 +477,8 @@
 
 				if (!IS_HUMAN_PLAYER(owner) && (!_networking || _network_server) && _ai.enabled)
 					AI_PlayerDied(owner);
+				if (IS_HUMAN_PLAYER(owner) && owner == _local_player && _ai.network_client)
+					AI_PlayerDied(owner);
 			}
 		}
 	}
--- a/network_client.c	Tue Nov 22 14:02:45 2005 +0000
+++ b/network_client.c	Tue Nov 22 15:55:38 2005 +0000
@@ -19,6 +19,7 @@
 #include "settings.h"
 #include "console.h"
 #include "variables.h"
+#include "ai/ai.h"
 
 
 // This file handles all the client-commands
@@ -342,9 +343,18 @@
 		return NETWORK_RECV_STATUS_CONN_LOST;
 
 	/* Do we receive a change of data? Most likely we changed playas */
-	if (index == _network_own_client_index)
+	if (index == _network_own_client_index) {
 		_network_playas = playas;
 
+		/* Are we a ai-network-client? */
+		if (_ai.network_client) {
+			if (_ai.network_playas == OWNER_SPECTATOR)
+				AI_StartNewAI(playas - 1);
+
+			_ai.network_playas = playas - 1;
+		}
+	}
+
 	ci = NetworkFindClientInfoFromIndex(index);
 	if (ci != NULL) {
 		if (playas == ci->client_playas && strcmp(name, ci->client_name) != 0) {
@@ -532,6 +542,17 @@
 			_patches.autorenew_money = GetPlayer(_local_player)->engine_renew_money;
 			DeleteWindowById(WC_NETWORK_STATUS_WINDOW, 0);
 		}
+
+		/* Check if we are an ai-network-client, and if so, disable GUI */
+		if (_ai.network_client) {
+			_ai.network_playas = _local_player;
+			_local_player      = OWNER_SPECTATOR;
+
+			if (_ai.network_playas != OWNER_SPECTATOR) {
+				/* If we didn't join the game as a spectator, activate the AI */
+				AI_StartNewAI(_ai.network_playas);
+			}
+		}
 	}
 
 	return NETWORK_RECV_STATUS_OKAY;
--- a/openttd.c	Tue Nov 22 14:02:45 2005 +0000
+++ b/openttd.c	Tue Nov 22 15:55:38 2005 +0000
@@ -330,9 +330,9 @@
 	//   a ':' behind it means: it need a param (e.g.: -m<driver>)
 	//   a '::' behind it means: it can optional have a param (e.g.: -d<debug>)
 	#if !defined(__MORPHOS__) && !defined(__AMIGA__) && !defined(WIN32)
-		optformat = "m:s:v:hDfn::l:eit:d::r:g::G:p:c:";
+		optformat = "bm:s:v:hDfn::l:eit:d::r:g::G:p:c:";
 	#else
-		optformat = "m:s:v:hDn::l:eit:d::r:g::G:p:c:"; // no fork option
+		optformat = "bm:s:v:hDn::l:eit:d::r:g::G:p:c:"; // no fork option
 	#endif
 
 	MyGetOptInit(&mgo, argc-1, argv+1, optformat);
@@ -358,6 +358,7 @@
 				else
 					network_conn = NULL;
 			} break;
+		case 'b': _ai.network_client = true; break;
 		case 'r': ParseResolution(resolution, mgo.opt); break;
 		case 'l': language = mgo.opt; break;
 		case 't': startdate = atoi(mgo.opt); break;
@@ -395,12 +396,17 @@
 		}
 	}
 
+	if (_ai.network_client && !network) {
+		_ai.network_client = false;
+		DEBUG(ai, 0)("[AI] Can't enable network-AI, because '-n' is not used\n");
+	}
+
 	DeterminePaths();
 	CheckExternalFiles();
 
 #ifdef GPMI
 	/* Set the debug proc */
-	gpmi_debug_proc    = &gpmi_debug_openttd;
+	gpmi_debug_proc = &gpmi_debug_openttd;
 
 	/* Initialize GPMI */
 	gpmi_init();
@@ -531,6 +537,11 @@
 	/* stop the AI */
 	AI_Uninitialize();
 
+#ifdef GPMI
+	/* Uninitialize GPMI */
+	gpmi_uninit();
+#endif /* GPMI */
+
 	/* Close all and any open filehandles */
 	FioCloseAll();
 	UnInitializeGame();
--- a/players.c	Tue Nov 22 14:02:45 2005 +0000
+++ b/players.c	Tue Nov 22 15:55:38 2005 +0000
@@ -806,10 +806,20 @@
 #endif /* ENABLE_NETWORK */
 
 		if (p != NULL) {
-			if (_local_player == OWNER_SPECTATOR) {
+			if (_local_player == OWNER_SPECTATOR && (!_ai.network_client || _ai.network_playas == OWNER_SPECTATOR)) {
 				/* Check if we do not want to be a spectator in network */
-				if (!_networking ||  (_network_server && !_network_dedicated) || _network_playas != OWNER_SPECTATOR) {
-					_local_player = p->index;
+				if (!_networking || (_network_server && !_network_dedicated) || _network_playas != OWNER_SPECTATOR || _ai.network_client) {
+					if (_ai.network_client) {
+						/* As ai-network-client, we have our own rulez (disable GUI and stuff) */
+						_ai.network_playas = p->index;
+						_local_player      = OWNER_SPECTATOR;
+						if (_ai.network_playas != OWNER_SPECTATOR) {
+							/* If we didn't join the game as a spectator, activate the AI */
+							AI_StartNewAI(_ai.network_playas);
+						}
+					} else {
+						_local_player = p->index;
+					}
 					MarkWholeScreenDirty();
 				}
 			} else if (p->index == _local_player) {