[ioquake3] 10/50: Split G_AddRandomBot into multiple functions

Simon McVittie smcv at debian.org
Sun Jul 23 21:55:22 UTC 2017


This is an automated email from the git hooks/post-receive script.

smcv pushed a commit to branch debian/master
in repository ioquake3.

commit 007e250e114d9f74ad3b3e1446082b652b1cff61
Author: Zack Middleton <zack at cloemail.com>
Date:   Thu Jun 29 15:30:16 2017 -0500

    Split G_AddRandomBot into multiple functions
---
 code/game/g_bot.c | 123 ++++++++++++++++++++++++++++++++----------------------
 1 file changed, 73 insertions(+), 50 deletions(-)

diff --git a/code/game/g_bot.c b/code/game/g_bot.c
index c509772..52db7cb 100644
--- a/code/game/g_bot.c
+++ b/code/game/g_bot.c
@@ -230,71 +230,94 @@ static void PlayerIntroSound( const char *modelAndSkin ) {
 
 /*
 ===============
-G_AddRandomBot
+G_CountBotPlayersByName
+
+Returns number of bots with name on specified team or whole server if team is -1.
 ===============
 */
-void G_AddRandomBot( int team ) {
-	int		i, n, num;
-	float	skill;
-	char	*value, netname[36], *teamstr;
+int G_CountBotPlayersByName( const char *name, int team ) {
+	int			i, num;
 	gclient_t	*cl;
 
 	num = 0;
-	for ( n = 0; n < g_numBots ; n++ ) {
-		value = Info_ValueForKey( g_botInfos[n], "name" );
-		//
-		for ( i=0 ; i< g_maxclients.integer ; i++ ) {
-			cl = level.clients + i;
-			if ( cl->pers.connected != CON_CONNECTED ) {
-				continue;
-			}
-			if ( !(g_entities[i].r.svFlags & SVF_BOT) ) {
-				continue;
-			}
-			if ( team >= 0 && cl->sess.sessionTeam != team ) {
-				continue;
-			}
-			if ( !Q_stricmp( value, cl->pers.netname ) ) {
-				break;
-			}
+	for ( i=0 ; i< g_maxclients.integer ; i++ ) {
+		cl = level.clients + i;
+		if ( cl->pers.connected != CON_CONNECTED ) {
+			continue;
+		}
+		if ( !(g_entities[i].r.svFlags & SVF_BOT) ) {
+			continue;
 		}
-		if (i >= g_maxclients.integer) {
-			num++;
+		if ( team >= 0 && cl->sess.sessionTeam != team ) {
+			continue;
+		}
+		if ( name && Q_stricmp( name, cl->pers.netname ) ) {
+			continue;
 		}
+		num++;
 	}
-	num = random() * num;
+	return num;
+}
+
+/*
+===============
+G_SelectRandomBotInfo
+
+Get random unused bot info on team or whole server if team is -1.
+===============
+*/
+int G_SelectRandomBotInfo( int team ) {
+	int		selection[MAX_BOTS];
+	int		n, num;
+	char	*value;
+
+	num = 0;
 	for ( n = 0; n < g_numBots ; n++ ) {
 		value = Info_ValueForKey( g_botInfos[n], "name" );
 		//
-		for ( i=0 ; i< g_maxclients.integer ; i++ ) {
-			cl = level.clients + i;
-			if ( cl->pers.connected != CON_CONNECTED ) {
-				continue;
-			}
-			if ( !(g_entities[i].r.svFlags & SVF_BOT) ) {
-				continue;
-			}
-			if ( team >= 0 && cl->sess.sessionTeam != team ) {
-				continue;
-			}
-			if ( !Q_stricmp( value, cl->pers.netname ) ) {
+		if ( G_CountBotPlayersByName( value, team ) == 0 ) {
+			selection[num++] = n;
+
+			if ( num == MAX_BOTS ) {
 				break;
 			}
 		}
-		if (i >= g_maxclients.integer) {
-			num--;
-			if (num <= 0) {
-				skill = trap_Cvar_VariableValue( "g_spSkill" );
-				if (team == TEAM_RED) teamstr = "red";
-				else if (team == TEAM_BLUE) teamstr = "blue";
-				else teamstr = "";
-				Q_strncpyz(netname, value, sizeof(netname));
-				Q_CleanStr(netname);
-				trap_SendConsoleCommand( EXEC_INSERT, va("addbot %s %f %s %i\n", netname, skill, teamstr, 0) );
-				return;
-			}
-		}
 	}
+
+	if ( num > 0 ) {
+		num = random() * ( num - 1 );
+		return selection[num];
+	}
+
+	return -1;
+}
+
+/*
+===============
+G_AddRandomBot
+===============
+*/
+void G_AddRandomBot( int team ) {
+	int		n;
+	char	*value, netname[36], *teamstr;
+	float	skill;
+
+	n = G_SelectRandomBotInfo( team );
+
+	if ( n < 0 ) {
+		// all bot types are in use on team
+		return;
+	}
+
+	value = Info_ValueForKey( g_botInfos[n], "name" );
+
+	skill = trap_Cvar_VariableValue( "g_spSkill" );
+	if (team == TEAM_RED) teamstr = "red";
+	else if (team == TEAM_BLUE) teamstr = "blue";
+	else teamstr = "";
+	Q_strncpyz(netname, value, sizeof(netname));
+	Q_CleanStr(netname);
+	trap_SendConsoleCommand( EXEC_INSERT, va("addbot %s %f %s %i\n", netname, skill, teamstr, 0) );
 }
 
 /*

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/ioquake3.git



More information about the Pkg-games-commits mailing list