2006-02-24 04:48:15 +00:00
/*******************************
* B_Bot . h *
* Description : *
* Used with all b_ * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# ifndef __B_BOT_H__
# define __B_BOT_H__
# include "c_cvars.h"
# include "tables.h"
# include "info.h"
# include "doomdef.h"
# include "d_ticcmd.h"
# include "r_defs.h"
# include "a_pickups.h"
2014-11-14 16:54:56 +00:00
# include "stats.h"
2006-02-24 04:48:15 +00:00
# define FORWARDWALK 0x1900
# define FORWARDRUN 0x3200
# define SIDEWALK 0x1800
# define SIDERUN 0x2800
# define BOT_VERSION 0.97
//Switches-
# define BOT_RELEASE_COMPILE //Define this when compiling a version that should be released.
# define NOCOLOR 11
# define MAXTHINGNODES 100 //Path stuff (paths created between items).
# define SPAWN_DELAY 80 //Used to determine how many tics there are between each bot spawn when bot's are being spawned in a row (like when entering a new map).
# define BOTFILENAME "bots.cfg"
# define MAX_TRAVERSE_DIST 100000000 //10 meters, used within b_func.c
# define AVOID_DIST 45000000 //Try avoid incoming missiles once they reached this close
# define SAFE_SELF_MISDIST (140*FRACUNIT) //Distance from self to target where it's safe to pull a rocket.
# define FRIEND_DIST 15000000 //To friend.
# define DARK_DIST 5000000 //Distance that bot can see enemies in the dark from.
# define WHATS_DARK 50 //light value thats classed as dark.
# define MAX_MONSTER_TARGET_DIST 50000000 //Too high can slow down the performance, see P_mobj.c
# define ENEMY_SCAN_FOV (120*ANGLE_1)
# define THINGTRYTICK 1000
# define MAXMOVEHEIGHT (32*FRACUNIT) //MAXSTEPMOVE but with jumping counted in.
# define GETINCOMBAT 35000000 //Max distance to item. if it's due to be icked up in a combat situation.
# define SHOOTFOV (60*ANGLE_1)
# define AFTERTICS (2*TICRATE) //Seconds that bot will be alert on an recent enemy. Ie not looking the other way
# define MAXROAM (4*TICRATE) //When this time is elapsed the bot will roam after something else.
//monster mod
# define MSPAWN_DELAY 20 //Tics between each spawn.
# define MMAXSELECT 100 //Maximum number of monsters that can be selected at a time.
2008-04-08 20:52:49 +00:00
struct FCheckPosition ;
2006-02-24 04:48:15 +00:00
struct botskill_t
{
int aiming ;
int perfection ;
int reaction ; //How fast the bot will fire after seeing the player.
int isp ; //Instincts of Self Preservation. Personality
} ;
FArchive & operator < < ( FArchive & arc , botskill_t & skill ) ;
2014-10-25 13:58:10 +00:00
enum
{
BOTINUSE_No ,
BOTINUSE_Waiting ,
BOTINUSE_Yes ,
} ;
2006-02-24 04:48:15 +00:00
//Info about all bots in the bots.cfg
//Updated during each level start.
//Info given to bots when they're spawned.
struct botinfo_t
{
botinfo_t * next ;
char * name ;
char * info ;
botskill_t skill ;
2014-10-25 13:58:10 +00:00
int inuse ;
2006-02-24 04:48:15 +00:00
int lastteam ;
} ;
//Used to keep all the globally needed variables in nice order.
2008-03-28 00:38:17 +00:00
class FCajunMaster
2006-02-24 04:48:15 +00:00
{
public :
2008-03-28 00:38:17 +00:00
~ FCajunMaster ( ) ;
2006-05-11 04:00:58 +00:00
2006-02-24 04:48:15 +00:00
void ClearPlayer ( int playernum , bool keepTeam ) ;
2014-11-29 17:03:58 +00:00
//(b_game.cpp)
2014-11-14 16:54:56 +00:00
void Main ( ) ;
2006-02-24 04:48:15 +00:00
void Init ( ) ;
void End ( ) ;
bool SpawnBot ( const char * name , int color = NOCOLOR ) ;
2014-10-25 13:58:10 +00:00
void TryAddBot ( BYTE * * stream , int player ) ;
2006-02-24 04:48:15 +00:00
void RemoveAllBots ( bool fromlist ) ;
2014-11-14 16:54:56 +00:00
bool LoadBots ( ) ;
void ForgetBots ( ) ;
2006-02-24 04:48:15 +00:00
2014-11-29 17:03:58 +00:00
//(b_func.cpp)
2014-11-14 16:54:56 +00:00
void StartTravel ( ) ;
void FinishTravel ( ) ;
2014-11-29 17:03:58 +00:00
bool IsLeader ( player_t * player ) ;
void SetBodyAt ( fixed_t x , fixed_t y , fixed_t z , int hostnum ) ;
fixed_t FakeFire ( AActor * source , AActor * dest , ticcmd_t * cmd ) ;
bool SafeCheckPosition ( AActor * actor , fixed_t x , fixed_t y , FCheckPosition & tm ) ;
2006-02-24 04:48:15 +00:00
2014-11-29 17:03:58 +00:00
//(b_move.cpp)
2006-02-24 04:48:15 +00:00
bool CleanAhead ( AActor * thing , fixed_t x , fixed_t y , ticcmd_t * cmd ) ;
bool IsDangerous ( sector_t * sec ) ;
2008-03-28 00:38:17 +00:00
TArray < FString > getspawned ; //Array of bots (their names) which should be spawned when starting a game.
2007-12-06 23:17:38 +00:00
BYTE freeze : 1 ; //Game in freeze mode.
BYTE changefreeze : 1 ; //Game wants to change freeze mode.
2006-02-24 04:48:15 +00:00
int botnum ;
botinfo_t * botinfo ;
int spawn_tries ;
int wanted_botnum ;
2008-03-12 02:56:11 +00:00
TObjPtr < AActor > firstthing ;
2008-03-28 00:38:17 +00:00
TObjPtr < AActor > body1 ;
TObjPtr < AActor > body2 ;
2006-02-24 04:48:15 +00:00
bool m_Thinking ;
private :
2014-11-29 17:03:58 +00:00
//(b_game.cpp)
2014-10-25 13:58:10 +00:00
bool DoAddBot ( BYTE * info , botskill_t skill ) ;
2006-02-24 04:48:15 +00:00
protected :
bool ctf ;
int loaded_bots ;
int t_join ;
bool observer ; //Consoleplayer is observer.
} ;
2014-11-14 16:54:56 +00:00
class DBot : public DThinker
2014-10-13 17:40:25 +00:00
{
2014-11-14 16:54:56 +00:00
DECLARE_CLASS ( DBot , DThinker )
2014-10-14 18:57:11 +00:00
HAS_OBJECT_POINTERS
2014-10-13 17:40:25 +00:00
public :
2014-10-14 18:57:11 +00:00
DBot ( ) ;
2014-10-15 16:54:12 +00:00
void Clear ( ) ;
2014-10-14 18:57:11 +00:00
void Serialize ( FArchive & arc ) ;
2014-11-14 16:54:56 +00:00
void Tick ( ) ;
2014-10-14 18:57:11 +00:00
2014-11-29 17:03:58 +00:00
//(b_think.cpp)
void WhatToGet ( AActor * item ) ;
//(b_func.cpp)
bool Check_LOS ( AActor * to , angle_t vangle ) ;
2014-11-14 16:54:56 +00:00
player_t * player ;
2014-10-13 17:40:25 +00:00
angle_t angle ; // The wanted angle that the bot try to get every tic.
2014-10-14 18:57:11 +00:00
// (used to get a smooth view movement)
2014-10-13 17:40:25 +00:00
TObjPtr < AActor > dest ; // Move Destination.
TObjPtr < AActor > prev ; // Previous move destination.
TObjPtr < AActor > enemy ; // The dead meat.
TObjPtr < AActor > missile ; // A threatening missile that needs to be avoided.
TObjPtr < AActor > mate ; // Friend (used for grouping in teamplay or coop).
TObjPtr < AActor > last_mate ; // If bots mate disappeared (not if died) that mate is
// pointed to by this. Allows bot to roam to it if
// necessary.
//Skills
struct botskill_t skill ;
//Tickers
int t_active ; // Open door, lower lift stuff, door must open and
// lift must go down before bot does anything
// radical like try a stuckmove
int t_respawn ;
int t_strafe ;
int t_react ;
int t_fight ;
int t_roam ;
int t_rocket ;
//Misc booleans
bool first_shot ; // Used for reaction skill.
bool sleft ; // If false, strafe is right.
bool allround ;
2014-10-14 18:57:11 +00:00
bool increase ;
2014-10-13 17:40:25 +00:00
fixed_t oldx ;
fixed_t oldy ;
2014-11-29 17:03:58 +00:00
private :
//(B_think.cpp)
void Think ( ) ;
void ThinkForMove ( ticcmd_t * cmd ) ;
void Set_enemy ( ) ;
//(B_func.cpp)
bool Reachable ( AActor * target ) ;
void Dofire ( ticcmd_t * cmd ) ;
AActor * Choose_Mate ( ) ;
AActor * Find_enemy ( ) ;
angle_t FireRox ( AActor * enemy , ticcmd_t * cmd ) ;
//(b_move.cpp)
void Roam ( ticcmd_t * cmd ) ;
bool Move ( ticcmd_t * cmd ) ;
bool TryWalk ( ticcmd_t * cmd ) ;
void NewChaseDir ( ticcmd_t * cmd ) ;
void TurnToAng ( ) ;
void Pitch ( AActor * target ) ;
2014-10-13 17:40:25 +00:00
} ;
2006-02-24 04:48:15 +00:00
//Externs
2008-03-28 00:38:17 +00:00
extern FCajunMaster bglobal ;
2014-11-14 16:54:56 +00:00
extern cycle_t BotThinkCycles , BotSupportCycles ;
2006-02-24 04:48:15 +00:00
EXTERN_CVAR ( Float , bot_flag_return_time )
EXTERN_CVAR ( Int , bot_next_color )
EXTERN_CVAR ( Bool , bot_allow_duds )
EXTERN_CVAR ( Int , bot_maxcorpses )
EXTERN_CVAR ( Bool , bot_observer )
EXTERN_CVAR ( Bool , bot_watersplash )
EXTERN_CVAR ( Bool , bot_chat )
# endif // __B_BOT_H__