2016-03-01 15:47:10 +00:00
/*******************************
* B_Bot . h *
* Description : *
* Used with all b_ * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# ifndef __B_BOT_H__
# define __B_BOT_H__
# include "c_cvars.h"
# include "info.h"
# include "doomdef.h"
2017-03-09 22:30:42 +00:00
# include "d_protocol.h"
2016-03-01 15:47:10 +00:00
# include "r_defs.h"
# include "a_pickups.h"
2018-11-24 22:48:23 +00:00
# include "a_weapons.h"
2016-03-01 15:47:10 +00:00
# include "stats.h"
# 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"
2016-03-25 23:34:56 +00:00
# define MAX_TRAVERSE_DIST (100000000 / 65536.) //10 meters, used within b_func.c
# define AVOID_DIST (45000000 / 65536.) //Try avoid incoming missiles once they reached this close
# define SAFE_SELF_MISDIST (140.) //Distance from self to target where it's safe to pull a rocket.
# define FRIEND_DIST (15000000 / 65536.) //To friend.
# define DARK_DIST (5000000 / 65536.) //Distance that bot can see enemies in the dark from.
2016-03-01 15:47:10 +00:00
# define WHATS_DARK 50 //light value thats classed as dark.
2016-03-25 23:34:56 +00:00
# define MAX_MONSTER_TARGET_DIST (50000000 / 65536.) //Too high can slow down the performance, see P_mobj.c
# define ENEMY_SCAN_FOV (120.)
2016-03-01 15:47:10 +00:00
# define THINGTRYTICK 1000
2016-03-25 23:34:56 +00:00
# define MAXMOVEHEIGHT (32) //MAXSTEPMOVE but with jumping counted in.
# define GETINCOMBAT (35000000 / 65536.) //Max distance to item. if it's due to be icked up in a combat situation.
# define SHOOTFOV (60.)
2016-03-01 15:47:10 +00:00
# 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.
struct FCheckPosition ;
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
} ;
enum
{
BOTINUSE_No ,
BOTINUSE_Waiting ,
BOTINUSE_Yes ,
} ;
//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 ;
int inuse ;
int lastteam ;
} ;
2018-11-24 22:48:23 +00:00
struct BotInfoData
{
int MoveCombatDist = 0 ;
int flags = 0 ;
PClassActor * projectileType = nullptr ;
} ;
enum
{
BIF_BOT_REACTION_SKILL_THING = 1 ,
BIF_BOT_EXPLOSIVE = 2 ,
BIF_BOT_BFG = 4 ,
} ;
using BotInfoMap = TMap < FName , BotInfoData > ;
extern BotInfoMap BotInfo ;
2018-12-04 16:00:48 +00:00
inline BotInfoData GetBotInfo ( AActor * weap )
2018-11-24 22:48:23 +00:00
{
if ( weap = = nullptr ) return BotInfoData ( ) ;
auto k = BotInfo . CheckKey ( weap - > GetClass ( ) - > TypeName ) ;
if ( k ) return * k ;
return BotInfoData ( ) ;
}
2016-03-01 15:47:10 +00:00
//Used to keep all the globally needed variables in nice order.
class FCajunMaster
{
public :
~ FCajunMaster ( ) ;
void ClearPlayer ( int playernum , bool keepTeam ) ;
//(b_game.cpp)
void Main ( ) ;
void Init ( ) ;
void End ( ) ;
bool SpawnBot ( const char * name , int color = NOCOLOR ) ;
2017-03-08 17:47:52 +00:00
void TryAddBot ( uint8_t * * stream , int player ) ;
2016-03-01 15:47:10 +00:00
void RemoveAllBots ( bool fromlist ) ;
bool LoadBots ( ) ;
void ForgetBots ( ) ;
//(b_func.cpp)
void StartTravel ( ) ;
void FinishTravel ( ) ;
bool IsLeader ( player_t * player ) ;
2016-03-23 09:42:41 +00:00
void SetBodyAt ( const DVector3 & pos , int hostnum ) ;
2016-03-25 23:34:56 +00:00
double FakeFire ( AActor * source , AActor * dest , ticcmd_t * cmd ) ;
bool SafeCheckPosition ( AActor * actor , double x , double y , FCheckPosition & tm ) ;
2016-03-26 00:30:28 +00:00
void BotTick ( AActor * mo ) ;
2016-03-01 15:47:10 +00:00
//(b_move.cpp)
2016-03-25 23:34:56 +00:00
bool CleanAhead ( AActor * thing , double x , double y , ticcmd_t * cmd ) ;
2016-03-01 15:47:10 +00:00
bool IsDangerous ( sector_t * sec ) ;
TArray < FString > getspawned ; //Array of bots (their names) which should be spawned when starting a game.
2017-03-08 17:47:52 +00:00
uint8_t freeze ; //Game in freeze mode.
uint8_t changefreeze ; //Game wants to change freeze mode.
2016-03-01 15:47:10 +00:00
int botnum ;
botinfo_t * botinfo ;
int spawn_tries ;
int wanted_botnum ;
2018-12-04 16:00:48 +00:00
TObjPtr < AActor * > firstthing ;
2017-03-08 12:34:26 +00:00
TObjPtr < AActor * > body1 ;
TObjPtr < AActor * > body2 ;
2016-03-01 15:47:10 +00:00
bool m_Thinking ;
private :
//(b_game.cpp)
2017-03-08 17:47:52 +00:00
bool DoAddBot ( uint8_t * info , botskill_t skill ) ;
2016-03-01 15:47:10 +00:00
protected :
bool ctf ;
int t_join ;
bool observer ; //Consoleplayer is observer.
} ;
class DBot : public DThinker
{
DECLARE_CLASS ( DBot , DThinker )
HAS_OBJECT_POINTERS
public :
DBot ( ) ;
void Clear ( ) ;
2016-09-19 22:41:22 +00:00
void Serialize ( FSerializer & arc ) ;
2016-03-01 15:47:10 +00:00
void Tick ( ) ;
//(b_think.cpp)
void WhatToGet ( AActor * item ) ;
//(b_func.cpp)
2016-03-25 23:34:56 +00:00
bool Check_LOS ( AActor * to , DAngle vangle ) ;
2016-03-01 15:47:10 +00:00
player_t * player ;
2016-03-25 23:34:56 +00:00
DAngle Angle ; // The wanted angle that the bot try to get every tic.
2016-03-01 15:47:10 +00:00
// (used to get a smooth view movement)
2017-03-08 12:34:26 +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
2016-03-01 15:47:10 +00:00
// 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 ;
bool increase ;
2016-03-25 23:34:56 +00:00
DVector2 old ;
2016-03-01 15:47:10 +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 ( ) ;
2016-03-25 23:34:56 +00:00
DAngle FireRox ( AActor * enemy , ticcmd_t * cmd ) ;
2016-03-01 15:47:10 +00:00
//(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 ) ;
} ;
//Externs
extern FCajunMaster bglobal ;
extern cycle_t BotThinkCycles , BotSupportCycles ;
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__