gzdoom/src/b_bot.cpp
2008-03-18 03:01:21 +00:00

164 lines
3.4 KiB
C++

// Cajun bot console commands.
//
// [RH] Moved out of d_netcmd.c (in Cajun source), because they don't really
// belong there.
#include "c_cvars.h"
#include "c_dispatch.h"
#include "b_bot.h"
#include "m_argv.h"
#include "doomstat.h"
#include "p_local.h"
#include "cmdlib.h"
#include "teaminfo.h"
CVAR (Int, bot_next_color, 11, 0)
CVAR (Bool, bot_observer, false, 0)
IMPLEMENT_POINTY_CLASS (DCajunMaster)
DECLARE_POINTER (getspawned)
DECLARE_POINTER (firstthing)
DECLARE_POINTER (body1)
DECLARE_POINTER (body2)
END_POINTERS
CCMD (addbot)
{
if (gamestate != GS_LEVEL && gamestate != GS_INTERMISSION)
{
Printf ("Bots cannot be added when not in a game!\n");
return;
}
if (!players[consoleplayer].settings_controller)
{
Printf ("Only setting controllers can add bots\n");
return;
}
if (argv.argc() > 2)
{
Printf ("addbot [botname] : add a bot to the game\n");
return;
}
if (argv.argc() > 1)
bglobal.SpawnBot (argv[1]);
else
bglobal.SpawnBot (NULL);
}
void DCajunMaster::ClearPlayer (int i, bool keepTeam)
{
if (players[i].mo)
{
players[i].mo->Destroy ();
players[i].mo = NULL;
}
botinfo_t *bot = botinfo;
while (bot && stricmp (players[i].userinfo.netname, bot->name))
bot = bot->next;
if (bot)
{
bot->inuse = false;
bot->lastteam = keepTeam ? players[i].userinfo.team : TEAM_None;
}
players[i].~player_t();
::new(&players[i]) player_t;
playeringame[i] = false;
}
CCMD (removebots)
{
Net_WriteByte (DEM_KILLBOTS);
}
extern bool CheckCheatmode ();
CCMD (freeze)
{
if (CheckCheatmode ())
return;
if (netgame && !players[consoleplayer].settings_controller)
{
Printf ("Only setting controllers can use freeze mode\n");
return;
}
Net_WriteByte (DEM_GENERICCHEAT);
Net_WriteByte (CHT_FREEZE);
}
CCMD (listbots)
{
botinfo_t *thebot = bglobal.botinfo;
int count = 0;
while (thebot)
{
Printf ("%s%s\n", thebot->name, thebot->inuse ? " (active)" : "");
thebot = thebot->next;
count++;
}
Printf ("> %d bots\n", count);
}
FArchive &operator<< (FArchive &arc, botskill_t &skill)
{
return arc << skill.aiming << skill.perfection << skill.reaction << skill.isp;
}
// set the bot specific weapon information
// This is intentionally not in the weapon definition anymore.
AT_GAME_SET(BotStuff)
{
AWeapon * w;
AActor * a;
w = (AWeapon*)GetDefaultByName ("Pistol");
if (w != NULL)
{
w->MoveCombatDist=25000000;
}
w = (AWeapon*)GetDefaultByName ("Shotgun");
if (w != NULL)
{
w->MoveCombatDist=24000000;
}
w = (AWeapon*)GetDefaultByName ("SuperShotgun");
if (w != NULL)
{
w->MoveCombatDist=15000000;
}
w = (AWeapon*)GetDefaultByName ("Chaingun");
if (w != NULL)
{
w->MoveCombatDist=27000000;
}
w = (AWeapon*)GetDefaultByName ("RocketLauncher");
if (w != NULL)
{
w->MoveCombatDist=18350080;
w->WeaponFlags|=WIF_BOT_REACTION_SKILL_THING|WIF_BOT_EXPLOSIVE;
w->ProjectileType=PClass::FindClass("Rocket");
}
w = (AWeapon*)GetDefaultByName ("PlasmaRifle");
if (w != NULL)
{
w->MoveCombatDist=27000000;
w->ProjectileType=PClass::FindClass("PlasmaBall");
}
a = GetDefaultByName ("PlasmaBall");
if (a != NULL)
{
a->flags3|=MF3_WARNBOT;
}
w = (AWeapon*)GetDefaultByName ("BFG9000");
if (w != NULL)
{
w->MoveCombatDist=10000000;
w->WeaponFlags|=WIF_BOT_REACTION_SKILL_THING|WIF_BOT_BFG;
w->ProjectileType=PClass::FindClass("BFGBall");
}
}