mirror of
https://github.com/ReactionQuake3/reaction.git
synced 2025-01-31 13:50:55 +00:00
Recoded AI for weapon mode switching. Bots can now zoom with the sg
This commit is contained in:
parent
0f30bf6f6d
commit
287485115f
3 changed files with 138 additions and 6 deletions
|
@ -5,6 +5,9 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// $Log$
|
// $Log$
|
||||||
|
// Revision 1.44 2002/06/15 15:02:05 makro
|
||||||
|
// Recoded AI for weapon mode switching. Bots can now zoom with the sg
|
||||||
|
//
|
||||||
// Revision 1.43 2002/06/11 14:03:04 makro
|
// Revision 1.43 2002/06/11 14:03:04 makro
|
||||||
// Forgot (), heh
|
// Forgot (), heh
|
||||||
//
|
//
|
||||||
|
@ -411,6 +414,23 @@ int RQ3_Bot_GetWeaponMode(bot_state_t *bs, int weapon)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
case WP_SSG3000:
|
||||||
|
{
|
||||||
|
//6x
|
||||||
|
if ( (bs->cur_ps.stats[STAT_RQ3] & RQ3_ZOOM_MED) == RQ3_ZOOM_MED &&
|
||||||
|
(bs->cur_ps.stats[STAT_RQ3] & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW ) {
|
||||||
|
return 3;
|
||||||
|
//4x
|
||||||
|
} else if ( (bs->cur_ps.stats[STAT_RQ3] & RQ3_ZOOM_MED) == RQ3_ZOOM_MED ) {
|
||||||
|
return 2;
|
||||||
|
//2x
|
||||||
|
} else if ( (bs->cur_ps.stats[STAT_RQ3] & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW ) {
|
||||||
|
return 1;
|
||||||
|
//unzoomed
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -424,18 +444,25 @@ Added by Makro
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
void RQ3_Bot_SetWeaponMode(bot_state_t *bs, int weapon, int mode) {
|
void RQ3_Bot_SetWeaponMode(bot_state_t *bs, int weapon, int mode) {
|
||||||
int i, modeCount, oldMode, press;
|
//int i, modeCount, oldMode, press;
|
||||||
float reactionTime = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_REACTIONTIME, 0, 1);
|
float reactionTime = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_REACTIONTIME, 0, 1);
|
||||||
|
|
||||||
|
//invalid weapon
|
||||||
|
if (weapon <= WP_NONE || weapon >= WP_NUM_WEAPONS)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Makro - old code
|
||||||
//not holding the right weapon
|
//not holding the right weapon
|
||||||
if (weapon != bs->cur_ps.weapon)
|
if (weapon != bs->cur_ps.weapon)
|
||||||
return;
|
return;
|
||||||
|
*/
|
||||||
|
|
||||||
//too soon ?
|
//too soon ?
|
||||||
//TODO: array with weapon mode change times for individual weapons ?
|
//TODO: array with weapon mode change times for individual weapons ?
|
||||||
if (FloatTime() < bs->weapoModeChange_time + 2 - reactionTime)
|
if (FloatTime() < bs->weaponModeChange_time + 2 - reactionTime)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* Old code
|
||||||
switch (bs->cur_ps.weapon) {
|
switch (bs->cur_ps.weapon) {
|
||||||
case WP_PISTOL:
|
case WP_PISTOL:
|
||||||
case WP_KNIFE:
|
case WP_KNIFE:
|
||||||
|
@ -443,10 +470,12 @@ void RQ3_Bot_SetWeaponMode(bot_state_t *bs, int weapon, int mode) {
|
||||||
break;
|
break;
|
||||||
case WP_MP5:
|
case WP_MP5:
|
||||||
case WP_M4:
|
case WP_M4:
|
||||||
case WP_SSG3000:
|
|
||||||
case WP_GRENADE:
|
case WP_GRENADE:
|
||||||
modeCount = 3;
|
modeCount = 3;
|
||||||
break;
|
break;
|
||||||
|
case WP_SSG3000:
|
||||||
|
modeCount = 4;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
modeCount = 1;
|
modeCount = 1;
|
||||||
break;
|
break;
|
||||||
|
@ -468,8 +497,12 @@ void RQ3_Bot_SetWeaponMode(bot_state_t *bs, int weapon, int mode) {
|
||||||
//Cmd_Weapon( &g_entities[bs->entitynum] );
|
//Cmd_Weapon( &g_entities[bs->entitynum] );
|
||||||
Cmd_New_Weapon( &g_entities[bs->entitynum] );
|
Cmd_New_Weapon( &g_entities[bs->entitynum] );
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
bs->weapoModeChange_time = FloatTime();
|
//new code
|
||||||
|
bs->weapMode[weapon] = mode;
|
||||||
|
|
||||||
|
bs->weaponModeChange_time = FloatTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2123,8 +2156,15 @@ BotChooseWeapon
|
||||||
void BotChooseWeapon(bot_state_t *bs) {
|
void BotChooseWeapon(bot_state_t *bs) {
|
||||||
int newweaponnum;
|
int newweaponnum;
|
||||||
//distance from the enemy
|
//distance from the enemy
|
||||||
int dist = sqrt(bs->inventory[ENEMY_HORIZONTAL_DIST] * bs->inventory[ENEMY_HORIZONTAL_DIST] +
|
int dist;
|
||||||
|
|
||||||
|
if (bs->enemy != -1) {
|
||||||
|
dist = sqrt(bs->inventory[ENEMY_HORIZONTAL_DIST] * bs->inventory[ENEMY_HORIZONTAL_DIST] +
|
||||||
bs->inventory[ENEMY_HEIGHT] * bs->inventory[ENEMY_HEIGHT]);
|
bs->inventory[ENEMY_HEIGHT] * bs->inventory[ENEMY_HEIGHT]);
|
||||||
|
} else {
|
||||||
|
dist = 8;
|
||||||
|
}
|
||||||
|
|
||||||
if (dist <= 0) {
|
if (dist <= 0) {
|
||||||
dist = 8;
|
dist = 8;
|
||||||
}
|
}
|
||||||
|
@ -2150,6 +2190,14 @@ void BotChooseWeapon(bot_state_t *bs) {
|
||||||
} else {
|
} else {
|
||||||
RQ3_Bot_SetWeaponMode(bs, WP_GRENADE, 0);
|
RQ3_Bot_SetWeaponMode(bs, WP_GRENADE, 0);
|
||||||
}
|
}
|
||||||
|
} else if (bs->weaponnum == WP_SSG3000) {
|
||||||
|
//2x
|
||||||
|
if (bs->enemy != -1 && dist > 600) {
|
||||||
|
RQ3_Bot_SetWeaponMode(bs, WP_SSG3000, 1);
|
||||||
|
//unzoomed
|
||||||
|
} else {
|
||||||
|
RQ3_Bot_SetWeaponMode(bs, WP_SSG3000, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -2175,6 +2223,14 @@ void BotChooseWeapon(bot_state_t *bs) {
|
||||||
} else {
|
} else {
|
||||||
RQ3_Bot_SetWeaponMode(bs, WP_GRENADE, 0);
|
RQ3_Bot_SetWeaponMode(bs, WP_GRENADE, 0);
|
||||||
}
|
}
|
||||||
|
} else if (bs->weaponnum == WP_SSG3000) {
|
||||||
|
//2x
|
||||||
|
if (bs->enemy != -1 && dist > 600) {
|
||||||
|
RQ3_Bot_SetWeaponMode(bs, WP_SSG3000, 1);
|
||||||
|
//unzoomed
|
||||||
|
} else {
|
||||||
|
RQ3_Bot_SetWeaponMode(bs, WP_SSG3000, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2436,6 +2492,16 @@ void BotUpdateInventory(bot_state_t *bs) {
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
BotCheckItemPickup(bs, oldinventory);
|
BotCheckItemPickup(bs, oldinventory);
|
||||||
|
|
||||||
|
//Makro - new weapon mode switching code
|
||||||
|
if (RQ3_Bot_GetWeaponMode(bs, bs->cur_ps.weapon) != bs->weapMode[bs->cur_ps.weapon]) {
|
||||||
|
if (bs->weaponModeClick_time + 0.1 < FloatTime()) {
|
||||||
|
if (bs->cur_ps.weaponstate == WEAPON_READY) {
|
||||||
|
Cmd_New_Weapon(&g_entities[bs->entitynum]);
|
||||||
|
}
|
||||||
|
bs->weaponModeClick_time = FloatTime();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2724,6 +2790,11 @@ void RQ3_Bot_IdleActions( bot_state_t *bs ) {
|
||||||
int weapon = bs->cur_ps.weapon;
|
int weapon = bs->cur_ps.weapon;
|
||||||
//float reactiontime = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_REACTIONTIME, 0, 1);
|
//float reactiontime = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_REACTIONTIME, 0, 1);
|
||||||
|
|
||||||
|
//always unzoom SSG when idle
|
||||||
|
if (RQ3_Bot_GetWeaponMode(bs, WP_SSG3000)) {
|
||||||
|
RQ3_Bot_SetWeaponMode(bs, WP_SSG3000, 0);
|
||||||
|
}
|
||||||
|
|
||||||
//too soon to reload/bandage again ?
|
//too soon to reload/bandage again ?
|
||||||
if (bs->idleAction_time > FloatTime())
|
if (bs->idleAction_time > FloatTime())
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -5,6 +5,9 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// $Log$
|
// $Log$
|
||||||
|
// Revision 1.11 2002/06/15 15:02:05 makro
|
||||||
|
// Recoded AI for weapon mode switching. Bots can now zoom with the sg
|
||||||
|
//
|
||||||
// Revision 1.10 2002/06/11 13:42:54 makro
|
// Revision 1.10 2002/06/11 13:42:54 makro
|
||||||
// Added a time limit for changing weapon modes for bots
|
// Added a time limit for changing weapon modes for bots
|
||||||
//
|
//
|
||||||
|
@ -225,7 +228,10 @@ typedef struct bot_state_s
|
||||||
float radioresponse_time; //Makro - the last time the bot responded to a radio message
|
float radioresponse_time; //Makro - the last time the bot responded to a radio message
|
||||||
int radioresponse_count; //Makro - how many times the bot responded to radio messages
|
int radioresponse_count; //Makro - how many times the bot responded to radio messages
|
||||||
float idleAction_time; //Makro - last time the bot did something while roaming around (reload/bandage)
|
float idleAction_time; //Makro - last time the bot did something while roaming around (reload/bandage)
|
||||||
float weapoModeChange_time; //Makro - last time the bot changed weapon modes
|
float weaponModeChange_time; //Makro - last time the bot changed weapon modes
|
||||||
|
float weaponModeClick_time; //Makro - last time the bot "pressed" the weapon button
|
||||||
|
|
||||||
|
int weapMode[WP_NUM_WEAPONS]; //Makro - the weapon modes the bot wants to use
|
||||||
|
|
||||||
vec3_t aimtarget;
|
vec3_t aimtarget;
|
||||||
vec3_t enemyvelocity; //enemy velocity 0.5 secs ago during battle
|
vec3_t enemyvelocity; //enemy velocity 0.5 secs ago during battle
|
||||||
|
|
|
@ -6,6 +6,61 @@
|
||||||
--------------------Configuration: game - Win32 Release--------------------
|
--------------------Configuration: game - Win32 Release--------------------
|
||||||
</h3>
|
</h3>
|
||||||
<h3>Command Lines</h3>
|
<h3>Command Lines</h3>
|
||||||
|
Creating temporary file "D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSPA71.tmp" with contents
|
||||||
|
[
|
||||||
|
/nologo /G6 /ML /W4 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FR"c:\reactionoutput/" /Fp"c:\reactionoutput/game.pch" /YX /Fo"c:\reactionoutput/" /Fd"c:\reactionoutput/" /FD /c
|
||||||
|
"C:\Games\Quake3\rq3source\reaction\game\ai_dmq3.c"
|
||||||
|
]
|
||||||
|
Creating command line "cl.exe @D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSPA71.tmp"
|
||||||
|
Creating temporary file "D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSPA72.tmp" with contents
|
||||||
|
[
|
||||||
|
kernel32.lib user32.lib winmm.lib /nologo /base:"0x20000000" /subsystem:windows /dll /incremental:no /pdb:"c:\reactionoutput/qagamex86.pdb" /map:"c:\reactionoutput/qagamex86.map" /machine:I386 /def:".\game.def" /out:"..\Release/qagamex86.dll" /implib:"c:\reactionoutput/qagamex86.lib"
|
||||||
|
\reactionoutput\ai_chat.obj
|
||||||
|
\reactionoutput\ai_cmd.obj
|
||||||
|
\reactionoutput\ai_dmnet.obj
|
||||||
|
\reactionoutput\ai_dmq3.obj
|
||||||
|
\reactionoutput\ai_main.obj
|
||||||
|
\reactionoutput\ai_team.obj
|
||||||
|
\reactionoutput\ai_vcmd.obj
|
||||||
|
\reactionoutput\bg_misc.obj
|
||||||
|
\reactionoutput\bg_pmove.obj
|
||||||
|
\reactionoutput\bg_slidemove.obj
|
||||||
|
\reactionoutput\g_active.obj
|
||||||
|
\reactionoutput\g_arenas.obj
|
||||||
|
\reactionoutput\g_bot.obj
|
||||||
|
\reactionoutput\g_client.obj
|
||||||
|
\reactionoutput\g_cmds.obj
|
||||||
|
\reactionoutput\g_combat.obj
|
||||||
|
\reactionoutput\g_fileio.obj
|
||||||
|
\reactionoutput\g_items.obj
|
||||||
|
\reactionoutput\g_main.obj
|
||||||
|
\reactionoutput\g_matchmode.obj
|
||||||
|
\reactionoutput\g_mem.obj
|
||||||
|
\reactionoutput\g_misc.obj
|
||||||
|
\reactionoutput\g_missile.obj
|
||||||
|
\reactionoutput\g_mover.obj
|
||||||
|
\reactionoutput\g_session.obj
|
||||||
|
\reactionoutput\g_spawn.obj
|
||||||
|
\reactionoutput\g_svcmds.obj
|
||||||
|
\reactionoutput\g_syscalls.obj
|
||||||
|
\reactionoutput\g_target.obj
|
||||||
|
\reactionoutput\g_team.obj
|
||||||
|
\reactionoutput\g_teamplay.obj
|
||||||
|
\reactionoutput\g_trigger.obj
|
||||||
|
\reactionoutput\g_utils.obj
|
||||||
|
\reactionoutput\g_weapon.obj
|
||||||
|
\reactionoutput\q_math.obj
|
||||||
|
\reactionoutput\q_shared.obj
|
||||||
|
\reactionoutput\rxn_game.obj
|
||||||
|
\reactionoutput\zcam.obj
|
||||||
|
\reactionoutput\zcam_target.obj
|
||||||
|
]
|
||||||
|
Creating command line "link.exe @D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSPA72.tmp"
|
||||||
|
<h3>Output Window</h3>
|
||||||
|
Compiling...
|
||||||
|
ai_dmq3.c
|
||||||
|
Linking...
|
||||||
|
Creating library c:\reactionoutput/qagamex86.lib and object c:\reactionoutput/qagamex86.exp
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue