ns/releases/3.03/source/HPB_bot/dlls/bot_start.cpp
tankefugl 54a4ac5469 o Branched from 3.02
git-svn-id: https://unknownworlds.svn.cloudforge.com/ns1@85 67975925-1194-0748-b3d5-c16f83f1a3a1
2005-04-26 15:38:32 +00:00

813 lines
25 KiB
C++

//
// HPB bot - botman's High Ping Bastard bot
//
// (http://planethalflife.com/botman/)
//
// bot_start.cpp
//
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "bot.h"
#include "bot_func.h"
#include "bot_weapons.h"
#include "mod/AvHMessage.h"
extern int mod_id;
extern edict_t *pent_info_ctfdetect;
extern int max_team_players[4];
extern int team_class_limits[4];
extern int max_teams;
void BotStartGame( bot_t *pBot )
{
char c_team[32];
char c_class[32];
char c_item[32];
int index, count, retry_count;
edict_t *pPlayer;
int team;
int class_not_allowed;
edict_t *pEdict = pBot->pEdict;
//CBaseEntity* theEntity = CBaseEntity::Instance(pEdict);
//AvHPlayer* thePlayer = dynamic_cast<AvHPlayer*>(theEntity);
if (mod_id == TFC_DLL)
{
if ((pBot->start_action == MSG_TFC_IDLE) &&
(pBot->create_time + 3.0 <= gpGlobals->time))
{
pBot->start_action = MSG_TFC_TEAM_SELECT; // force team selection
}
// handle Team Fortress Classic stuff here...
if (pBot->start_action == MSG_TFC_TEAM_SELECT)
{
pBot->start_action = MSG_TFC_IDLE; // switch back to idle
pBot->create_time = gpGlobals->time; // reset
if ((pBot->bot_team != 1) && (pBot->bot_team != 2) &&
(pBot->bot_team != 3) && (pBot->bot_team != 4) &&
(pBot->bot_team != 5))
pBot->bot_team = -1;
if (pBot->bot_team == -1)
pBot->bot_team = RANDOM_LONG(1, max_teams);
retry_count = 0;
while ((retry_count < 4) &&
(max_team_players[pBot->bot_team-1] > 0)) // not unlimited?
{
count = 0;
// count number of players on this team...
for (index = 1; index <= gpGlobals->maxClients; index++)
{
pPlayer = INDEXENT(index);
if (pPlayer && !pPlayer->free)
{
if (UTIL_GetTeam(pPlayer) == (pBot->bot_team - 1))
count++;
}
}
if (count < max_team_players[pBot->bot_team-1])
break; // haven't reached limit yet, continue
else
{
pBot->bot_team++;
if (pBot->bot_team > max_teams)
pBot->bot_team = 1;
retry_count++;
}
}
// select the team the bot wishes to join...
if (pBot->bot_team == 1)
strcpy(c_team, "1");
else if (pBot->bot_team == 2)
strcpy(c_team, "2");
else if (pBot->bot_team == 3)
strcpy(c_team, "3");
else if (pBot->bot_team == 4)
strcpy(c_team, "4");
else
strcpy(c_team, "5");
FakeClientCommand(pEdict, "jointeam", c_team, NULL);
return;
}
if (pBot->start_action == MSG_TFC_CLASS_SELECT)
{
pBot->start_action = MSG_TFC_IDLE; // switch back to idle
pBot->create_time = gpGlobals->time; // reset
if ((pBot->bot_class < 0) || (pBot->bot_class > 10))
pBot->bot_class = -1;
if (pBot->bot_class == -1)
pBot->bot_class = RANDOM_LONG(1, 10);
team = UTIL_GetTeam(pEdict);
if (team_class_limits[team] == -1) // civilian only?
{
pBot->bot_class = 0; // civilian
}
else
{
if (pBot->bot_class == 10)
class_not_allowed = team_class_limits[team] & (1<<7);
else if (pBot->bot_class <= 7)
class_not_allowed = team_class_limits[team] & (1<<(pBot->bot_class-1));
else
class_not_allowed = team_class_limits[team] & (1<<(pBot->bot_class));
while (class_not_allowed)
{
pBot->bot_class = RANDOM_LONG(1, 10);
if (pBot->bot_class == 10)
class_not_allowed = team_class_limits[team] & (1<<7);
else if (pBot->bot_class <= 7)
class_not_allowed = team_class_limits[team] & (1<<(pBot->bot_class-1));
else
class_not_allowed = team_class_limits[team] & (1<<(pBot->bot_class));
}
}
// select the class the bot wishes to use...
if (pBot->bot_class == 0)
strcpy(c_class, "civilian");
else if (pBot->bot_class == 1)
strcpy(c_class, "scout");
else if (pBot->bot_class == 2)
strcpy(c_class, "sniper");
else if (pBot->bot_class == 3)
strcpy(c_class, "soldier");
else if (pBot->bot_class == 4)
strcpy(c_class, "demoman");
else if (pBot->bot_class == 5)
strcpy(c_class, "medic");
else if (pBot->bot_class == 6)
strcpy(c_class, "hwguy");
else if (pBot->bot_class == 7)
strcpy(c_class, "pyro");
else if (pBot->bot_class == 8)
strcpy(c_class, "spy");
else if (pBot->bot_class == 9)
strcpy(c_class, "engineer");
else
strcpy(c_class, "randompc");
FakeClientCommand(pEdict, c_class, NULL, NULL);
// bot has now joined the game (doesn't need to be started)
pBot->not_started = 0;
return;
}
}
else if (mod_id == CSTRIKE_DLL)
{
// handle Counter-Strike stuff here...
if (pBot->start_action == MSG_CS_TEAM_SELECT)
{
pBot->start_action = MSG_CS_IDLE; // switch back to idle
if ((pBot->bot_team != 1) && (pBot->bot_team != 2) &&
(pBot->bot_team != 5))
pBot->bot_team = -1;
if (pBot->bot_team == -1)
pBot->bot_team = RANDOM_LONG(1, 2);
// select the team the bot wishes to join...
if (pBot->bot_team == 1)
strcpy(c_team, "1");
else if (pBot->bot_team == 2)
strcpy(c_team, "2");
else
strcpy(c_team, "5");
FakeClientCommand(pEdict, "menuselect", c_team, NULL);
return;
}
if (pBot->start_action == MSG_CS_CT_SELECT) // counter terrorist
{
pBot->start_action = MSG_CS_IDLE; // switch back to idle
if ((pBot->bot_class < 1) || (pBot->bot_class > 4))
pBot->bot_class = -1; // use random if invalid
if (pBot->bot_class == -1)
pBot->bot_class = RANDOM_LONG(1, 4);
// select the class the bot wishes to use...
if (pBot->bot_class == 1)
strcpy(c_class, "1");
else if (pBot->bot_class == 2)
strcpy(c_class, "2");
else if (pBot->bot_class == 3)
strcpy(c_class, "3");
else if (pBot->bot_class == 4)
strcpy(c_class, "4");
else
strcpy(c_class, "5"); // random
FakeClientCommand(pEdict, "menuselect", c_class, NULL);
// bot has now joined the game (doesn't need to be started)
pBot->not_started = 0;
return;
}
if (pBot->start_action == MSG_CS_T_SELECT) // terrorist select
{
pBot->start_action = MSG_CS_IDLE; // switch back to idle
if ((pBot->bot_class < 1) || (pBot->bot_class > 4))
pBot->bot_class = -1; // use random if invalid
if (pBot->bot_class == -1)
pBot->bot_class = RANDOM_LONG(1, 4);
// select the class the bot wishes to use...
if (pBot->bot_class == 1)
strcpy(c_class, "1");
else if (pBot->bot_class == 2)
strcpy(c_class, "2");
else if (pBot->bot_class == 3)
strcpy(c_class, "3");
else if (pBot->bot_class == 4)
strcpy(c_class, "4");
else
strcpy(c_class, "5"); // random
FakeClientCommand(pEdict, "menuselect", c_class, NULL);
// bot has now joined the game (doesn't need to be started)
pBot->not_started = 0;
return;
}
}
else if ((mod_id == GEARBOX_DLL) && (pent_info_ctfdetect != NULL))
{
// handle Opposing Force CTF stuff here...
if (pBot->start_action == MSG_OPFOR_TEAM_SELECT)
{
pBot->start_action = MSG_OPFOR_IDLE; // switch back to idle
if ((pBot->bot_team != 1) && (pBot->bot_team != 2) &&
(pBot->bot_team != 3))
pBot->bot_team = -1;
if (pBot->bot_team == -1)
pBot->bot_team = RANDOM_LONG(1, 2);
// select the team the bot wishes to join...
if (pBot->bot_team == 1)
strcpy(c_team, "1");
else if (pBot->bot_team == 2)
strcpy(c_team, "2");
else
strcpy(c_team, "3");
FakeClientCommand(pEdict, "jointeam", c_team, NULL);
return;
}
if (pBot->start_action == MSG_OPFOR_CLASS_SELECT)
{
pBot->start_action = MSG_OPFOR_IDLE; // switch back to idle
if ((pBot->bot_class < 0) || (pBot->bot_class > 10))
pBot->bot_class = -1;
if (pBot->bot_class == -1)
pBot->bot_class = RANDOM_LONG(1, 10);
// select the class the bot wishes to use...
if (pBot->bot_class == 1)
strcpy(c_class, "1");
else if (pBot->bot_class == 2)
strcpy(c_class, "2");
else if (pBot->bot_class == 3)
strcpy(c_class, "3");
else if (pBot->bot_class == 4)
strcpy(c_class, "4");
else if (pBot->bot_class == 5)
strcpy(c_class, "5");
else if (pBot->bot_class == 6)
strcpy(c_class, "6");
else
strcpy(c_class, "7");
FakeClientCommand(pEdict, "selectchar", c_class, NULL);
// bot has now joined the game (doesn't need to be started)
pBot->not_started = 0;
return;
}
}
else if (mod_id == FRONTLINE_DLL)
{
// handle FrontLineForce stuff here...
if (pBot->start_action == MSG_FLF_TEAM_SELECT)
{
pBot->start_action = MSG_FLF_IDLE; // switch back to idle
if ((pBot->bot_team != 1) && (pBot->bot_team != 2) &&
(pBot->bot_team != 5))
pBot->bot_team = -1;
if (pBot->bot_team == -1)
pBot->bot_team = RANDOM_LONG(1, 2);
// select the team the bot wishes to join...
if (pBot->bot_team == 1)
strcpy(c_team, "1");
else if (pBot->bot_team == 2)
strcpy(c_team, "2");
else
strcpy(c_team, "5");
FakeClientCommand(pEdict, "jointeam", c_team, NULL);
return;
}
if (pBot->start_action == MSG_FLF_CLASS_SELECT)
{
pBot->start_action = MSG_FLF_IDLE; // switch back to idle
team = UTIL_GetTeam(pEdict);
if (team == 0) // rebels
{
if ((pBot->bot_class < 0) || (pBot->bot_class > 3))
pBot->bot_class = -1;
if (pBot->bot_class == -1)
pBot->bot_class = RANDOM_LONG(1, 3);
// select the class the bot wishes to use...
if (pBot->bot_class == 1)
strcpy(c_class, "rebelsrecon");
else if (pBot->bot_class == 2)
strcpy(c_class, "rebelsassault");
else
strcpy(c_class, "rebelssupport");
}
else // commandos
{
if ((pBot->bot_class < 0) || (pBot->bot_class > 3))
pBot->bot_class = -1;
if (pBot->bot_class == -1)
pBot->bot_class = RANDOM_LONG(1, 3);
// select the class the bot wishes to use...
if (pBot->bot_class == 1)
strcpy(c_class, "commandosrecon");
else if (pBot->bot_class == 2)
strcpy(c_class, "commandosassault");
else
strcpy(c_class, "commandossupport");
}
FakeClientCommand(pEdict, c_class, NULL, NULL);
return;
}
if (pBot->start_action == MSG_FLF_PISTOL_SELECT)
{
int prim_weapon_group, sec_weapon_group;
pBot->start_action = MSG_FLF_IDLE; // switch back to idle
int flf_class = UTIL_GetClass(pEdict);
if (flf_class == 0) // recon
{
prim_weapon_group = RANDOM_LONG(1, 3);
if (prim_weapon_group == 1) // shotguns
pBot->primary_weapon = FLF_WEAPON_SPAS12;
else if (prim_weapon_group == 2) // submachine
{
int weapon = RANDOM_LONG(1, 4);
if (weapon == 1)
pBot->primary_weapon = FLF_WEAPON_MP5A2;
else if (weapon == 2)
pBot->primary_weapon = FLF_WEAPON_MP5SD;
else if (weapon == 3)
pBot->primary_weapon = FLF_WEAPON_MAC10;
else
pBot->primary_weapon = FLF_WEAPON_UMP45;
}
else // rifles
{
pBot->primary_weapon = FLF_WEAPON_MSG90;
}
if (prim_weapon_group == 1)
sec_weapon_group = RANDOM_LONG(2, 3);
else if (prim_weapon_group == 3)
sec_weapon_group = RANDOM_LONG(1, 2);
else
{
if (RANDOM_LONG(1, 100) <= 50)
sec_weapon_group = 1;
else
sec_weapon_group = 3;
}
if (sec_weapon_group == 1) // shotguns
pBot->secondary_weapon = FLF_WEAPON_SPAS12;
else if (sec_weapon_group == 2) // submachine
{
int weapon = RANDOM_LONG(1, 4);
if (weapon == 1)
pBot->secondary_weapon = FLF_WEAPON_MP5A2;
else if (weapon == 2)
pBot->secondary_weapon = FLF_WEAPON_MP5SD;
else if (weapon == 3)
pBot->secondary_weapon = FLF_WEAPON_MAC10;
else
pBot->secondary_weapon = FLF_WEAPON_UMP45;
}
else // rifles
{
pBot->secondary_weapon = FLF_WEAPON_MSG90;
}
}
else if (flf_class == 1) // assault
{
prim_weapon_group = RANDOM_LONG(1, 3);
if (prim_weapon_group == 1) // shotguns
pBot->primary_weapon = FLF_WEAPON_SPAS12;
else if (prim_weapon_group == 2) // submachine
{
int weapon = RANDOM_LONG(1, 4);
if (weapon == 1)
pBot->primary_weapon = FLF_WEAPON_MP5A2;
else if (weapon == 2)
pBot->primary_weapon = FLF_WEAPON_MP5SD;
else if (weapon == 3)
pBot->primary_weapon = FLF_WEAPON_MAC10;
else
pBot->primary_weapon = FLF_WEAPON_UMP45;
}
else // rifles
{
int weapon = RANDOM_LONG(1, 3);
if (weapon == 1)
pBot->primary_weapon = FLF_WEAPON_M4;
else if (weapon == 2)
pBot->primary_weapon = FLF_WEAPON_FAMAS;
else
pBot->primary_weapon = FLF_WEAPON_AK5;
}
if (prim_weapon_group == 1)
sec_weapon_group = RANDOM_LONG(2, 3);
else if (prim_weapon_group == 2)
{
if (RANDOM_LONG(1, 100) <= 50)
sec_weapon_group = 1;
else
sec_weapon_group = 3;
}
else // prim == 3
sec_weapon_group = RANDOM_LONG(1, 2);
if (sec_weapon_group == 1) // shotguns
pBot->secondary_weapon = FLF_WEAPON_SPAS12;
else if (sec_weapon_group == 2) // submachine
{
int weapon = RANDOM_LONG(1, 4);
if (weapon == 1)
pBot->secondary_weapon = FLF_WEAPON_MP5A2;
else if (weapon == 2)
pBot->secondary_weapon = FLF_WEAPON_MP5SD;
else if (weapon == 3)
pBot->secondary_weapon = FLF_WEAPON_MAC10;
else
pBot->secondary_weapon = FLF_WEAPON_UMP45;
}
else // rifles
{
int weapon = RANDOM_LONG(1, 3);
if (weapon == 1)
pBot->secondary_weapon = FLF_WEAPON_M4;
else if (weapon == 2)
pBot->secondary_weapon = FLF_WEAPON_FAMAS;
else
pBot->secondary_weapon = FLF_WEAPON_AK5;
}
}
else // support
{
prim_weapon_group = RANDOM_LONG(1, 3);
if (prim_weapon_group == 1) // shotguns
pBot->primary_weapon = FLF_WEAPON_SPAS12;
else if (prim_weapon_group == 2) // submachine
{
int weapon = RANDOM_LONG(1, 4);
if (weapon == 1)
pBot->primary_weapon = FLF_WEAPON_MP5A2;
else if (weapon == 2)
pBot->primary_weapon = FLF_WEAPON_MP5SD;
else if (weapon == 3)
pBot->primary_weapon = FLF_WEAPON_MAC10;
else
pBot->primary_weapon = FLF_WEAPON_UMP45;
}
else if (prim_weapon_group == 3) // rifles & heavyweapons
{
if (RANDOM_LONG(1, 100) <= 50)
{
int weapon = RANDOM_LONG(1, 3); // rifles
if (weapon == 1)
pBot->primary_weapon = FLF_WEAPON_M4;
else if (weapon == 2)
pBot->primary_weapon = FLF_WEAPON_FAMAS;
else
pBot->primary_weapon = FLF_WEAPON_AK5;
}
else // heavy weapons
{
pBot->primary_weapon = FLF_WEAPON_HK21;
}
}
if (prim_weapon_group == 1)
sec_weapon_group = RANDOM_LONG(2, 3);
else if (prim_weapon_group == 2)
{
if (RANDOM_LONG(1, 100) <= 50)
sec_weapon_group = 1;
else
sec_weapon_group = 3;
}
else // prim == 3
sec_weapon_group = RANDOM_LONG(1, 2);
if (sec_weapon_group == 1) // shotguns
pBot->secondary_weapon = FLF_WEAPON_SPAS12;
else if (sec_weapon_group == 2) // submachine
{
int weapon = RANDOM_LONG(1, 4);
if (weapon == 1)
pBot->secondary_weapon = FLF_WEAPON_MP5A2;
else if (weapon == 2)
pBot->secondary_weapon = FLF_WEAPON_MP5SD;
else if (weapon == 3)
pBot->secondary_weapon = FLF_WEAPON_MAC10;
else
pBot->secondary_weapon = FLF_WEAPON_UMP45;
}
else if (sec_weapon_group == 3) // rifles & heavyweapons
{
if (RANDOM_LONG(1, 100) <= 50)
{
int weapon = RANDOM_LONG(1, 3); // rifles
if (weapon == 1)
pBot->secondary_weapon = FLF_WEAPON_M4;
else if (weapon == 2)
pBot->secondary_weapon = FLF_WEAPON_FAMAS;
else
pBot->secondary_weapon = FLF_WEAPON_AK5;
}
else // heavy weapons
{
pBot->secondary_weapon = FLF_WEAPON_HK21;
}
}
}
int pistol = RANDOM_LONG(1, 2);
if (pistol == 1)
strcpy(c_item, "26"); // mk23
else
strcpy(c_item, "23"); // beretta
FakeClientCommand(pEdict, "pistols", c_item, NULL);
return;
}
if (pBot->start_action == MSG_FLF_WEAPON_SELECT)
{
int weapon_class;
pBot->start_action = MSG_FLF_IDLE; // switch back to idle
if (pBot->primary_weapon)
weapon_class = pBot->primary_weapon;
else
weapon_class = pBot->secondary_weapon;
if (weapon_class == FLF_WEAPON_SPAS12) // shotguns
strcpy(c_item, "shotgun");
else if ((weapon_class == FLF_WEAPON_MP5A2) || // submachine
(weapon_class == FLF_WEAPON_MP5SD) ||
(weapon_class == FLF_WEAPON_MAC10) ||
(weapon_class == FLF_WEAPON_UMP45))
strcpy(c_item, "submachine");
else if ((weapon_class == FLF_WEAPON_M4) ||
(weapon_class == FLF_WEAPON_FAMAS) ||
(weapon_class == FLF_WEAPON_AK5) ||
(weapon_class == FLF_WEAPON_MSG90))
strcpy(c_item, "rifles");
else
strcpy(c_item, "heavyweapons");
FakeClientCommand(pEdict, "wpnclass", c_item, NULL);
return;
}
if (pBot->start_action == MSG_FLF_SHOTGUN_SELECT)
{
int weapon_class;
pBot->start_action = MSG_FLF_IDLE; // switch back to idle
if (pBot->primary_weapon)
{
weapon_class = pBot->primary_weapon;
pBot->primary_weapon = 0;
}
else
{
weapon_class = pBot->secondary_weapon;
// bot has now joined the game (doesn't need to be started)
pBot->not_started = 0;
}
sprintf(c_item, "%d", weapon_class);
FakeClientCommand(pEdict, "shotgun", c_item, NULL);
return;
}
if (pBot->start_action == MSG_FLF_SUBMACHINE_SELECT)
{
int weapon_class;
pBot->start_action = MSG_FLF_IDLE; // switch back to idle
if (pBot->primary_weapon)
{
weapon_class = pBot->primary_weapon;
pBot->primary_weapon = 0;
}
else
{
weapon_class = pBot->secondary_weapon;
// bot has now joined the game (doesn't need to be started)
pBot->not_started = 0;
}
sprintf(c_item, "%d", weapon_class);
FakeClientCommand(pEdict, "submach", c_item, NULL);
return;
}
if (pBot->start_action == MSG_FLF_RIFLE_SELECT)
{
int weapon_class;
pBot->start_action = MSG_FLF_IDLE; // switch back to idle
if (pBot->primary_weapon)
{
weapon_class = pBot->primary_weapon;
pBot->primary_weapon = 0;
}
else
{
weapon_class = pBot->secondary_weapon;
// bot has now joined the game (doesn't need to be started)
pBot->not_started = 0;
}
sprintf(c_item, "%d", weapon_class);
FakeClientCommand(pEdict, "rifles", c_item, NULL);
return;
}
if (pBot->start_action == MSG_FLF_HEAVYWEAPONS_SELECT)
{
int weapon_class;
pBot->start_action = MSG_FLF_IDLE; // switch back to idle
if (pBot->primary_weapon)
{
weapon_class = pBot->primary_weapon;
pBot->primary_weapon = 0;
}
else
{
weapon_class = pBot->secondary_weapon;
// bot has now joined the game (doesn't need to be started)
pBot->not_started = 0;
}
sprintf(c_item, "%d", weapon_class);
FakeClientCommand(pEdict, "heavyweapons", c_item, NULL);
return;
}
}
else if (mod_id == AVH_DLL)
{
// if(pBot->mBotPlayMode == PLAYMODE_READYROOM)
// {
// // Look at desired team and head to nearest start entity
// AvHClassType theClassType = AVH_CLASS_TYPE_UNDEFINED;
//// if(pBot->mBotRole == ROLE_UNDEFINED)
//// {
//// // Choose a random team
//// theClassType = AvHClassType(RANDOM_LONG(1, 2));
//// }
//// else
//// {
//// theClassType = (AvHClassType)pBot->mBotRole;
//// }
////
//// // Now navigate to the nearest start entity
//// if(theClassType == AVH_CLASS_TYPE_MARINE)
//// {
// FakeClientCommand(pEdict, kcAutoAssign, c_item, NULL);
// //FakeClientCommand(pEdict, kcJoinTeamOne, c_item, NULL);
//
// // Try to become a squad leader if possible
//// pBot->pEdict->v.impulse = RANK_PROMOTE;
//// }
//// else if(theClassType == AVH_CLASS_TYPE_ALIEN)
//// {
//// FakeClientCommand(pEdict, kcJoinTeamTwo, c_item, NULL);
//// }
//
// // bot has now joined the game (doesn't need to be started)
// pBot->not_started = 0;
// }
}
else
{
// otherwise, don't need to do anything to start game...
pBot->not_started = 0;
}
}