Bots now respond to radio commands

This commit is contained in:
Andrei Drexler 2002-04-03 16:33:20 +00:00
parent 162c87e06f
commit 1ced14633b
2 changed files with 96 additions and 10 deletions

View file

@ -5,6 +5,9 @@
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// //
// $Log$ // $Log$
// Revision 1.10 2002/04/03 16:33:20 makro
// Bots now respond to radio commands
//
// Revision 1.9 2002/04/01 12:45:54 makro // Revision 1.9 2002/04/01 12:45:54 makro
// Changed some weapon names // Changed some weapon names
// //
@ -63,7 +66,9 @@
//Blaze: was there a extra ../ here? //Blaze: was there a extra ../ here?
#include "../ui/menudef.h" #include "../ui/menudef.h"
//Makro - to get rid of the warnings
void BotMoveTowardsEnt(bot_state_t *bs, vec3_t dest, int dist);
void Cmd_Bandage (gentity_t *ent);
//goal flag, see be_ai_goal.h for the other GFL_* //goal flag, see be_ai_goal.h for the other GFL_*
#define GFL_AIR 128 #define GFL_AIR 128
@ -238,6 +243,11 @@ int BotReachedGoal(bot_state_t *bs, bot_goal_t *goal) {
if (!(goal->flags & GFL_DROPPED)) { if (!(goal->flags & GFL_DROPPED)) {
trap_BotSetAvoidGoalTime(bs->gs, goal->number, -1); trap_BotSetAvoidGoalTime(bs->gs, goal->number, -1);
} }
/*
if (g_entities[goal->entitynum].classname) {
G_Printf(va("^5BOT CODE: ^7Reached item of type (%s)\n", g_entities[goal->entitynum].classname));
}
*/
return qtrue; return qtrue;
} }
//if the goal isn't there //if the goal isn't there
@ -1498,12 +1508,10 @@ int AINode_Seek_ActivateEntity(bot_state_t *bs) {
//Makro - if the bot has to open a door //Makro - if the bot has to open a door
if (bs->activatestack->openDoor) { if (bs->activatestack->openDoor) {
int dist; //int dist;
BotEntityInfo(goal->entitynum, &entinfo); BotEntityInfo(goal->entitynum, &entinfo);
dist = Distance(bs->origin, entinfo.origin); //dist = Distance(bs->origin, entinfo.origin);
if (trap_BotTouchingGoal(bs->origin, goal)) {
if (dist < 64) {
/* /*
if (bot_developer.integer == 2) { if (bot_developer.integer == 2) {
G_Printf(va("^5BOT CODE: ^7Reached door at (%i %i %i) from (%i %i %i)\n", G_Printf(va("^5BOT CODE: ^7Reached door at (%i %i %i) from (%i %i %i)\n",
@ -1514,7 +1522,7 @@ int AINode_Seek_ActivateEntity(bot_state_t *bs) {
BotPopFromActivateGoalStack(bs); BotPopFromActivateGoalStack(bs);
//bs->activatestack->time = 0; //bs->activatestack->time = 0;
Cmd_OpenDoor( &g_entities[bs->entitynum] ); Cmd_OpenDoor( &g_entities[bs->entitynum] );
BotMoveTowardsEnt(bs, entinfo.origin, -80); BotMoveTowardsEnt(bs, entinfo.origin, -64);
return qtrue; return qtrue;
} }

View file

@ -5,6 +5,9 @@
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// //
// $Log$ // $Log$
// Revision 1.12 2002/04/03 16:33:20 makro
// Bots now respond to radio commands
//
// Revision 1.11 2002/04/01 12:45:54 makro // Revision 1.11 2002/04/01 12:45:54 makro
// Changed some weapon names // Changed some weapon names
// //
@ -71,6 +74,9 @@
//Blaze: was there a extra ../ here? //Blaze: was there a extra ../ here?
#include "../ui/menudef.h" #include "../ui/menudef.h"
//Makro - to get rid of the warnings
void Cmd_Bandage (gentity_t *ent);
// from aasfile.h // from aasfile.h
#define AREACONTENTS_MOVER 1024 #define AREACONTENTS_MOVER 1024
#define AREACONTENTS_MODELNUMSHIFT 24 #define AREACONTENTS_MODELNUMSHIFT 24
@ -1397,7 +1403,7 @@ BotTeamGoals
================== ==================
*/ */
void BotTeamGoals(bot_state_t *bs, int retreat) { void BotTeamGoals(bot_state_t *bs, int retreat) {
bot_goal_t *goal;
if ( retreat ) { if ( retreat ) {
if (gametype == GT_CTF) { if (gametype == GT_CTF) {
BotCTFRetreatGoals(bs); BotCTFRetreatGoals(bs);
@ -1715,7 +1721,7 @@ void BotCheckItemPickup(bot_state_t *bs, int *oldinventory) {
#ifdef MISSIONPACK #ifdef MISSIONPACK
int offence, leader; int offence, leader;
// if (gametype <= GT_TEAM) //if (gametype <= GT_TEAM)
if (gametype <= GT_TEAMPLAY) if (gametype <= GT_TEAMPLAY)
return; return;
@ -4195,7 +4201,7 @@ int BotFuncDoorRotatingActivateGoal(bot_state_t *bs, int bspent, bot_activategoa
VectorAdd(mins, maxs, origin); VectorAdd(mins, maxs, origin);
VectorScale(origin, 0.5, origin); VectorScale(origin, 0.5, origin);
activategoal->goal.entitynum = entitynum; activategoal->goal.entitynum = entitynum;
VectorCopy(origin, activategoal->target); VectorTargetDist(bs->origin, origin, -40, activategoal->origin);
activategoal->openDoor = qtrue; activategoal->openDoor = qtrue;
activategoal->goal.number = 0; activategoal->goal.number = 0;
activategoal->goal.flags = 0; activategoal->goal.flags = 0;
@ -4850,6 +4856,61 @@ int BotAIPredictObstacles(bot_state_t *bs, bot_goal_t *goal) {
return qfalse; return qfalse;
} }
/*
==================
BotReplyToRadioMessage
Added by Makro
==================
*/
void BotReplyToRadioMessage( bot_state_t *bs, char *msg, int handle ) {
//Bot must be alive to report
if (!BotIsDead(bs)) {
char *token;
char *initial = msg;
token = COM_ParseExt(&msg, qtrue);
if ( !Q_stricmp(token, "radio") ) {
//Bots won't reply to ALL radio messages; they do have a life, you know
if ( random() < 0.9 ) {
char *sender = COM_ParseExt(&msg, qtrue);
if (strstr(msg, "treport")) {
//Team, report in
G_Say( &g_entities[bs->entitynum], NULL, SAY_TEAM, va("%s, I have a $W with $A ammo and $H health", sender));
}
//TODO:
//Add code that makes the bot move towards
//the player that sent the radio message
//Prioritize teamdown, taking_f, im_hit
//over enemyd and enemys
}
}
msg = initial;
}
}
/*
==================
BotCheckRadioMessage
Added by Makro
==================
*/
qboolean BotCheckRadioMessage( bot_state_t *bs, char *msg, int handle ) {
char *token;
char *initial = msg;
token = COM_ParseExt(&msg, qtrue);
msg = initial;
if ( !Q_stricmp(token, "radio") ) {
return qtrue;
}
return qfalse;
}
/* /*
================== ==================
BotCheckConsoleMessages BotCheckConsoleMessages
@ -4861,6 +4922,7 @@ void BotCheckConsoleMessages(bot_state_t *bs) {
int context, handle; int context, handle;
bot_consolemessage_t m; bot_consolemessage_t m;
bot_match_t match; bot_match_t match;
qboolean radio;
//the name of this bot //the name of this bot
ClientName(bs->client, botname, sizeof(botname)); ClientName(bs->client, botname, sizeof(botname));
@ -4871,6 +4933,22 @@ void BotCheckConsoleMessages(bot_state_t *bs) {
//if it is a chat message the bot needs some time to read it //if it is a chat message the bot needs some time to read it
if (m.type == CMS_CHAT && m.time > FloatTime() - (1 + random())) break; if (m.type == CMS_CHAT && m.time > FloatTime() - (1 + random())) break;
} }
//Makro - check for radio commands
radio = BotCheckRadioMessage(bs, m.message, handle);
if ( radio ) {
//The bot needs at least two seconds to reply
if ( FloatTime() > (m.time + 2 + random()) ) {
BotReplyToRadioMessage(bs, m.message, handle);
//remove the console message
trap_BotRemoveConsoleMessage(bs->cs, handle);
continue;
} else {
//Too soon to reply
break;
}
}
// //
ptr = m.message; ptr = m.message;
//if it is a chat message then don't unify white spaces and don't //if it is a chat message then don't unify white spaces and don't