From e38aee070ce3dcbc394ffc44cf52d6f0fa5fd6cb Mon Sep 17 00:00:00 2001 From: ChillyDoom Date: Sat, 15 Nov 2014 08:58:29 +0000 Subject: [PATCH] - Changed TThinkerIterator loops back to MAXPLAYERS loops. - Added STAT_BOT. --- src/b_bot.cpp | 1 + src/b_func.cpp | 28 +++++++++++++--------------- src/b_game.cpp | 38 +++++++++++++++++++------------------- src/g_shared/a_pickups.cpp | 9 +++------ src/p_interaction.cpp | 13 +++++-------- src/p_mobj.cpp | 28 ++++++++++++++-------------- src/statnums.h | 1 + 7 files changed, 56 insertions(+), 62 deletions(-) diff --git a/src/b_bot.cpp b/src/b_bot.cpp index 6a088ffcb..d2acdcab6 100644 --- a/src/b_bot.cpp +++ b/src/b_bot.cpp @@ -24,6 +24,7 @@ IMPLEMENT_POINTY_CLASS(DBot) END_POINTERS DBot::DBot () +: DThinker(STAT_BOT) { Clear (); } diff --git a/src/b_func.cpp b/src/b_func.cpp index 9ea03d45e..349155a81 100644 --- a/src/b_func.cpp +++ b/src/b_func.cpp @@ -272,12 +272,10 @@ shootmissile: bool FCajunMaster::IsLeader (player_t *player) { - DBot *Bot; - TThinkerIterator it; - - while ((Bot = it.Next ()) != NULL) + for (int count = 0; count < MAXPLAYERS; count++) { - if (Bot->mate == player->mo) + if (players[count].Bot != NULL + && players[count].Bot->mate == player->mo) { return true; } @@ -557,22 +555,22 @@ bool FCajunMaster::SafeCheckPosition (AActor *actor, fixed_t x, fixed_t y, FChec void FCajunMaster::StartTravel () { - DBot *Bot; - TThinkerIterator it; - - while ((Bot = it.Next ()) != NULL) + for (int i = 0; i < MAXPLAYERS; ++i) { - Bot->ChangeStatNum (STAT_TRAVELLING); + if (players[i].Bot != NULL) + { + players[i].Bot->ChangeStatNum (STAT_TRAVELLING); + } } } void FCajunMaster::FinishTravel () { - DBot *Bot; - TThinkerIterator it(STAT_TRAVELLING); - - while ((Bot = it.Next ()) != NULL) + for (int i = 0; i < MAXPLAYERS; ++i) { - Bot->ChangeStatNum (STAT_DEFAULT); + if (players[i].Bot != NULL) + { + players[i].Bot->ChangeStatNum (STAT_BOT); + } } } diff --git a/src/b_game.cpp b/src/b_game.cpp index a05106a70..44aff03fa 100644 --- a/src/b_game.cpp +++ b/src/b_game.cpp @@ -170,16 +170,15 @@ void FCajunMaster::Init () //Called on each level exit (from g_game.c). void FCajunMaster::End () { + int i; + //Arrange wanted botnum and their names, so they can be spawned next level. getspawned.Clear(); if (deathmatch) { - DBot *Bot; - TThinkerIterator it; - - while ((Bot = it.Next ()) != NULL) + for (i = 0; i < MAXPLAYERS; i++) { - getspawned.Push(Bot->player->userinfo.GetName()); + getspawned.Push(players[i].userinfo.GetName()); } wanted_botnum = botnum; @@ -393,30 +392,31 @@ bool FCajunMaster::DoAddBot (BYTE *info, botskill_t skill) void FCajunMaster::RemoveAllBots (bool fromlist) { - DBot *Bot; - TThinkerIterator it; - int i; + int i, j; - while ((Bot = it.Next ()) != NULL) + for (i = 0; i < MAXPLAYERS; ++i) { - // If a player is looking through this bot's eyes, make him - // look through his own eyes instead. - for (i = 0; i < MAXPLAYERS; ++i) + if (players[i].Bot != NULL) { - if (Bot->player != &players[i] && playeringame[i] && players[i].Bot == NULL) + // If a player is looking through this bot's eyes, make him + // look through his own eyes instead. + for (j = 0; j < MAXPLAYERS; ++j) { - if (players[i].camera == Bot->player->mo) + if (i != j && playeringame[j] && players[j].Bot == NULL) { - players[i].camera = players[i].mo; - if (i == consoleplayer) + if (players[j].camera == players[i].mo) { - StatusBar->AttachToPlayer (players + i); + players[j].camera = players[j].mo; + if (j == consoleplayer) + { + StatusBar->AttachToPlayer (players + j); + } } } } + ClearPlayer (i, !fromlist); + FBehavior::StaticStartTypedScripts (SCRIPT_Disconnect, NULL, true, i); } - ClearPlayer (Bot->player - players, !fromlist); - FBehavior::StaticStartTypedScripts (SCRIPT_Disconnect, NULL, true, Bot->player - players); } if (fromlist) diff --git a/src/g_shared/a_pickups.cpp b/src/g_shared/a_pickups.cpp index f5c262d8c..1aab998a9 100644 --- a/src/g_shared/a_pickups.cpp +++ b/src/g_shared/a_pickups.cpp @@ -1021,14 +1021,11 @@ void AInventory::Touch (AActor *toucher) P_GiveSecret(toucher, true, true, -1); } - DBot *Bot; - TThinkerIterator it; - //Added by MC: Check if item taken was the roam destination of any bot - while ((Bot = it.Next ()) != NULL) + for (int i = 0; i < MAXPLAYERS; i++) { - if (Bot->dest == this) - Bot->dest = NULL; + if (players[i].Bot != NULL && this == players[i].Bot->dest) + players[i].Bot->dest = NULL; } } diff --git a/src/p_interaction.cpp b/src/p_interaction.cpp index 88cc89668..88d95b25e 100644 --- a/src/p_interaction.cpp +++ b/src/p_interaction.cpp @@ -611,17 +611,14 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags) if (player->Bot != NULL) player->Bot->t_respawn = (pr_botrespawn()%15)+((bglobal.botnum-1)*2)+TICRATE+1; - DBot *Bot; - TThinkerIterator it; - //Added by MC: Discard enemies. - while ((Bot = it.Next ()) != NULL) + for (int i = 0; i < MAXPLAYERS; i++) { - if (this == Bot->enemy) + if (players[i].Bot != NULL && this == players[i].Bot->enemy) { - if (Bot->dest == Bot->enemy) - Bot->dest = NULL; - Bot->enemy = NULL; + if (players[i].Bot->dest == players[i].Bot->enemy) + players[i].Bot->dest = NULL; + players[i].Bot->enemy = NULL; } } diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 27bc50a83..4ef075720 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -3042,6 +3042,7 @@ void AActor::Tick () AActor *onmo; + int i; //assert (state != NULL); if (state == NULL) @@ -3231,36 +3232,35 @@ void AActor::Tick () { BotSupportCycles.Clock(); bglobal.m_Thinking = true; - - DBot *Bot; - TThinkerIterator it; - - while ((Bot = it.Next ()) != NULL) + for (i = 0; i < MAXPLAYERS; i++) { + if (!playeringame[i] || players[i].Bot == NULL) + continue; + if (flags3 & MF3_ISMONSTER) { if (health > 0 - && !Bot->enemy - && player ? !IsTeammate (Bot->player->mo) : true - && P_AproxDistance (Bot->player->mo->x-x, Bot->player->mo->y-y) < MAX_MONSTER_TARGET_DIST - && P_CheckSight (Bot->player->mo, this, SF_SEEPASTBLOCKEVERYTHING)) + && !players[i].Bot->enemy + && player ? !IsTeammate (players[i].mo) : true + && P_AproxDistance (players[i].mo->x-x, players[i].mo->y-y) < MAX_MONSTER_TARGET_DIST + && P_CheckSight (players[i].mo, this, SF_SEEPASTBLOCKEVERYTHING)) { //Probably a monster, so go kill it. - Bot->enemy = this; + players[i].Bot->enemy = this; } } else if (flags & MF_SPECIAL) { //Item pickup time //clock (BotWTG); - bglobal.WhatToGet (Bot->player->mo, this); + bglobal.WhatToGet (players[i].mo, this); //unclock (BotWTG); BotWTG++; } else if (flags & MF_MISSILE) { - if (!Bot->missile && (flags3 & MF3_WARNBOT)) + if (!players[i].Bot->missile && (flags3 & MF3_WARNBOT)) { //warn for incoming missiles. - if (target != Bot->player->mo && bglobal.Check_LOS (Bot->player->mo, this, ANGLE_90)) - Bot->missile = this; + if (target != players[i].mo && bglobal.Check_LOS (players[i].mo, this, ANGLE_90)) + players[i].Bot->missile = this; } } } diff --git a/src/statnums.h b/src/statnums.h index 344a328c8..25f644d1d 100644 --- a/src/statnums.h +++ b/src/statnums.h @@ -63,6 +63,7 @@ enum STAT_SECTOREFFECT, // All sector effects that cause floor and ceiling movement STAT_ACTORMOVER, // actor movers STAT_SCRIPTS, // The ACS thinker. This is to ensure that it can't tick before all actors called PostBeginPlay + STAT_BOT, // Bot thinker }; #endif \ No newline at end of file