ef2gamesource/dlls/game/botlib.h
Walter Julius Hennecke d4d5f3f521 reformat
2014-03-09 23:49:29 +01:00

497 lines
22 KiB
C

// Copyright (C) 1999-2000 Id Software, Inc.
//
/*****************************************************************************
* name: botlib.h
*
* desc: bot AI library
*
* $Archive: /EF2/Code/DLLs/game/botlib.h $
* $Author: Singlis $
* $Revision: 5 $
* $Modtime: 9/24/03 3:09p $
* $Date: 9/26/03 2:35p $
*
*****************************************************************************/
#ifndef __BOTLIB_H__
#define __BOTLIB_H__
#define BOTLIB_API_VERSION 2
struct aas_clientmove_s;
struct aas_entityinfo_s;
struct aas_areainfo_s;
struct aas_altroutegoal_s;
struct aas_predictroute_s;
struct bot_consolemessage_s;
struct bot_match_s;
struct bot_goal_s;
struct bot_moveresult_s;
struct bot_initmove_s;
struct weaponinfo_s;
#define BOTFILESBASEFOLDER "botfiles"
//debug line colors
#define LINECOLOR_NONE -1
#define LINECOLOR_RED 1//0xf2f2f0f0L
#define LINECOLOR_GREEN 2//0xd0d1d2d3L
#define LINECOLOR_BLUE 3//0xf3f3f1f1L
#define LINECOLOR_YELLOW 4//0xdcdddedfL
#define LINECOLOR_ORANGE 5//0xe0e1e2e3L
//Print types
#define PRT_MESSAGE 1
#define PRT_WARNING 2
#define PRT_ERROR 3
#define PRT_FATAL 4
#define PRT_EXIT 5
//console message types
#define CMS_NORMAL 0
#define CMS_CHAT 1
//botlib error codes
#define BLERR_NOERROR 0 //no error
#define BLERR_LIBRARYNOTSETUP 1 //library not setup
#define BLERR_INVALIDENTITYNUMBER 2 //invalid entity number
#define BLERR_NOAASFILE 3 //no AAS file available
#define BLERR_CANNOTOPENAASFILE 4 //cannot open AAS file
#define BLERR_WRONGAASFILEID 5 //incorrect AAS file id
#define BLERR_WRONGAASFILEVERSION 6 //incorrect AAS file version
#define BLERR_CANNOTREADAASLUMP 7 //cannot read AAS file lump
#define BLERR_CANNOTLOADICHAT 8 //cannot load initial chats
#define BLERR_CANNOTLOADITEMWEIGHTS 9 //cannot load item weights
#define BLERR_CANNOTLOADITEMCONFIG 10 //cannot load item config
#define BLERR_CANNOTLOADWEAPONWEIGHTS 11 //cannot load weapon weights
#define BLERR_CANNOTLOADWEAPONCONFIG 12 //cannot load weapon config
//action flags
#define ACTION_ATTACK 0x0000001
#define ACTION_ATTACKRIGHT 0x0000002
#define ACTION_USE 0x0000004
#define ACTION_RESPAWN 0x0000008
#define ACTION_JUMP 0x0000010
#define ACTION_MOVEUP 0x0000020
#define ACTION_CROUCH 0x0000080
#define ACTION_MOVEDOWN 0x0000100
#define ACTION_MOVEFORWARD 0x0000200
#define ACTION_MOVEBACK 0x0000800
#define ACTION_MOVELEFT 0x0001000
#define ACTION_MOVERIGHT 0x0002000
#define ACTION_DELAYEDJUMP 0x0008000
#define ACTION_TALK 0x0010000
#define ACTION_GESTURE 0x0020000
#define ACTION_WALK 0x0080000
#define ACTION_AFFIRMATIVE 0x0100000
#define ACTION_NEGATIVE 0x0200000
#define ACTION_GETFLAG 0x0800000
#define ACTION_GUARDBASE 0x1000000
#define ACTION_PATROL 0x2000000
#define ACTION_FOLLOWME 0x8000000
//the bot input, will be converted to an usercmd_t
typedef struct bot_input_s {
float thinktime; //time since last output (in seconds)
vec3_t dir; //movement direction
float speed; //speed in the range [0, 400]
vec3_t viewangles; //the view angles
int actionflags; //one of the ACTION_? flags
int weapon, latchweapon; //weapon to use
int firestate; //right/left hand fire state
} bot_input_t;
#ifndef BSPTRACE
#define BSPTRACE
//bsp_trace_t hit surface
typedef struct bsp_surface_s {
char name[16];
int flags;
int value;
} bsp_surface_t;
//remove the bsp_trace_s structure definition l8r on
//a trace is returned when a box is swept through the world
typedef struct bsp_trace_s {
qboolean allsolid; // if true, plane is not valid
qboolean startsolid; // if true, the initial point was in a solid area
float fraction; // time completed, 1.0 = didn't hit anything
vec3_t endpos; // final position
cplane_t plane; // surface normal at impact
float exp_dist; // expanded plane distance
int sidenum; // number of the brush side hit
bsp_surface_t surface; // the hit point surface
int contents; // contents on other side of surface hit
int ent; // number of entity hit
} bsp_trace_t;
#endif // BSPTRACE
//entity state
typedef struct bot_entitystate_s {
int type; // entity type
int flags; // entity flags
vec3_t origin; // origin of the entity
vec3_t angles; // angles of the model
vec3_t old_origin; // for lerping
vec3_t mins; // bounding box minimums
vec3_t maxs; // bounding box maximums
int groundent; // ground entity
int solid; // solid type
int modelindex; // model used
int modelindex2; // weapons, CTF flags, etc
int frame; // model frame number
int event; // impulse events -- muzzle flashes, footsteps, etc
int eventParm; // even parameter
int powerups; // bit flags
int weapon; // determines weapon and flash model, etc
int legsAnim; // mask off ANIM_TOGGLEBIT
int torsoAnim; // mask off ANIM_TOGGLEBIT
} bot_entitystate_t;
//bot AI library exported functions
typedef struct botlib_import_s {
//print messages from the bot library
void (QDECL* Print)(int type, char* fmt, ...);
//trace a bbox through the world
void(*Trace)(bsp_trace_t* trace, vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, int passent, int contentmask);
//trace a bbox against a specific entity
void(*EntityTrace)(bsp_trace_t* trace, vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, int entnum, int contentmask);
//retrieve the contents at the given point
int(*PointContents)(vec3_t point);
//check if the point is in potential visible sight
int(*inPVS)(vec3_t p1, vec3_t p2);
//retrieve the BSP entity data lump
char* (*BSPEntityData)(void);
//
void(*BSPModelMinsMaxsOrigin)(int modelnum, vec3_t angles, vec3_t mins, vec3_t maxs, vec3_t origin);
//send a bot client command
void(*BotClientCommand)(int client, const char* command); // was char *, changed for c++ compilation
//memory allocation
void* (*GetMemory)(int size); // allocate from Zone
void(*FreeMemory)(void* ptr); // free memory from Zone
int(*AvailableMemory)(void); // available Zone memory
void* (*HunkAlloc)(int size); // allocate from hunk
//file system access
int(*FS_FOpenFile)(const char* qpath, fileHandle_t* file, fsMode_t mode);
int(*FS_Read)(void* buffer, int len, fileHandle_t f);
int(*FS_Write)(const void* buffer, int len, fileHandle_t f);
void(*FS_FCloseFile)(fileHandle_t f);
int(*FS_Seek)(fileHandle_t f, long offset, int origin);
//debug visualisation stuff
int(*DebugLineCreate)(void);
void(*DebugLineDelete)(int line);
void(*DebugLineShow)(int line, vec3_t start, vec3_t end, int color);
//
int(*DebugPolygonCreate)(int color, int numPoints, vec3_t* points);
void(*DebugPolygonDelete)(int id);
} botlib_import_t;
typedef struct aas_export_s {
//-----------------------------------
// be_aas_entity.h
//-----------------------------------
void(*AAS_EntityInfo)(int entnum, struct aas_entityinfo_s* info);
//-----------------------------------
// be_aas_main.h
//-----------------------------------
int(*AAS_Initialized)(void);
void(*AAS_PresenceTypeBoundingBox)(int presencetype, vec3_t mins, vec3_t maxs);
float(*AAS_Time)(void);
//--------------------------------------------
// be_aas_sample.c
//--------------------------------------------
int(*AAS_PointAreaNum)(vec3_t point);
int(*AAS_PointReachabilityAreaIndex)(vec3_t point);
int(*AAS_TraceAreas)(vec3_t start, vec3_t end, int* areas, vec3_t* points, int maxareas);
int(*AAS_BBoxAreas)(vec3_t absmins, vec3_t absmaxs, int* areas, int maxareas);
int(*AAS_AreaInfo)(int areanum, struct aas_areainfo_s* info);
//--------------------------------------------
// be_aas_bspq3.c
//--------------------------------------------
int(*AAS_PointContents)(vec3_t point);
int(*AAS_NextBSPEntity)(int ent);
int(*AAS_ValueForBSPEpairKey)(int ent, char* key, char* value, int size);
int(*AAS_VectorForBSPEpairKey)(int ent, char* key, vec3_t v);
int(*AAS_FloatForBSPEpairKey)(int ent, char* key, float* value);
int(*AAS_IntForBSPEpairKey)(int ent, char* key, int* value);
//--------------------------------------------
// be_aas_reach.c
//--------------------------------------------
int(*AAS_AreaReachability)(int areanum);
//--------------------------------------------
// be_aas_route.c
//--------------------------------------------
int(*AAS_AreaTravelTimeToGoalArea)(int areanum, vec3_t origin, int goalareanum, int travelflags);
int(*AAS_EnableRoutingArea)(int areanum, int enable);
int(*AAS_PredictRoute)(struct aas_predictroute_s* route, int areanum, vec3_t origin,
int goalareanum, int travelflags, int maxareas, int maxtime,
int stopevent, int stopcontents, int stoptfl, int stopareanum);
//--------------------------------------------
// be_aas_altroute.c
//--------------------------------------------
int(*AAS_AlternativeRouteGoals)(vec3_t start, int startareanum, vec3_t goal, int goalareanum, int travelflags,
struct aas_altroutegoal_s* altroutegoals, int maxaltroutegoals,
int type);
//--------------------------------------------
// be_aas_move.c
//--------------------------------------------
int(*AAS_Swimming)(vec3_t origin);
int(*AAS_PredictClientMovement)(struct aas_clientmove_s* move,
int entnum, vec3_t origin,
int presencetype, int onground,
vec3_t velocity, vec3_t cmdmove,
int cmdframes,
int maxframes, float frametime,
int stopevent, int stopareanum, int visualize);
} aas_export_t;
typedef struct ea_export_s {
//ClientCommand elementary actions
void(*EA_Command)(int client, const char* command);
void(*EA_Say)(int client, char* str);
void(*EA_SayTeam)(int client, char* str);
//
void(*EA_Action)(int client, int action);
void(*EA_Gesture)(int client);
void(*EA_Talk)(int client);
void(*EA_ToggleFireState)(int client);
void(*EA_Attack)(int client, int primarydangerous, int altdangerous);
void(*EA_Use)(int client);
void(*EA_Respawn)(int client);
void(*EA_MoveUp)(int client);
void(*EA_MoveDown)(int client);
void(*EA_MoveForward)(int client);
void(*EA_MoveBack)(int client);
void(*EA_MoveLeft)(int client);
void(*EA_MoveRight)(int client);
void(*EA_Crouch)(int client);
void(*EA_SelectWeapon)(int client, int weapon);
void(*EA_Jump)(int client);
void(*EA_DelayedJump)(int client);
void(*EA_Move)(int client, vec3_t dir, float speed);
void(*EA_View)(int client, vec3_t viewangles);
//send regular input to the server
void(*EA_EndRegular)(int client, float thinktime);
void(*EA_GetInput)(int client, float thinktime, bot_input_t* input);
void(*EA_ResetInput)(int client);
} ea_export_t;
typedef struct ai_export_s {
//-----------------------------------
// be_ai_char.h
//-----------------------------------
int(*BotLoadCharacter)(char* charfile, float skill);
void(*BotFreeCharacter)(int character);
float(*Characteristic_Float)(int character, int index);
float(*Characteristic_BFloat)(int character, int index, float min, float max);
int(*Characteristic_Integer)(int character, int index);
int(*Characteristic_BInteger)(int character, int index, int min, int max);
void(*Characteristic_String)(int character, int index, char* buf, int size);
//-----------------------------------
// be_ai_chat.h
//-----------------------------------
int(*BotAllocChatState)(void);
void(*BotFreeChatState)(int handle);
void(*BotQueueConsoleMessage)(int chatstate, int type, char* message);
void(*BotRemoveConsoleMessage)(int chatstate, int handle);
int(*BotNextConsoleMessage)(int chatstate, struct bot_consolemessage_s* cm);
int(*BotNumConsoleMessages)(int chatstate);
void(*BotInitialChat)(int chatstate, char* type, int mcontext, char* var0, char* var1, char* var2, char* var3, char* var4, char* var5, char* var6, char* var7);
int(*BotNumInitialChats)(int chatstate, char* type);
int(*BotReplyChat)(int chatstate, char* message, int mcontext, int vcontext, char* var0, char* var1, char* var2, char* var3, char* var4, char* var5, char* var6, char* var7);
int(*BotChatLength)(int chatstate);
void(*BotEnterChat)(int chatstate, int client, int sendto);
void(*BotGetChatMessage)(int chatstate, char* buf, int size);
int(*StringContains)(char* str1, char* str2, int casesensitive);
int(*BotFindMatch)(char* str, struct bot_match_s* match, unsigned long int context);
void(*BotMatchVariable)(struct bot_match_s* match, int variable, char* buf, int size);
void(*UnifyWhiteSpaces)(char* string);
void(*BotReplaceSynonyms)(char* string, unsigned long int context);
int(*BotLoadChatFile)(int chatstate, char* chatfile, char* chatname);
void(*BotSetChatGender)(int chatstate, int gender);
void(*BotSetChatName)(int chatstate, char* name, int client);
//-----------------------------------
// be_ai_goal.h
//-----------------------------------
void(*BotResetGoalState)(int goalstate);
void(*BotResetAvoidGoals)(int goalstate);
void(*BotRemoveFromAvoidGoals)(int goalstate, int number);
void(*BotPushGoal)(int goalstate, struct bot_goal_s* goal);
void(*BotPopGoal)(int goalstate);
void(*BotEmptyGoalStack)(int goalstate);
void(*BotDumpAvoidGoals)(int goalstate);
void(*BotDumpGoalStack)(int goalstate);
void(*BotGoalName)(int number, char* name, int size);
int(*BotGetTopGoal)(int goalstate, struct bot_goal_s* goal);
int(*BotGetSecondGoal)(int goalstate, struct bot_goal_s* goal);
int(*BotChooseLTGItem)(int goalstate, vec3_t origin, int* inventory, int travelflags);
int(*BotChooseNBGItem)(int goalstate, vec3_t origin, int* inventory, int travelflags,
struct bot_goal_s* ltg, float maxtime);
int(*BotTouchingGoal)(vec3_t origin, struct bot_goal_s* goal);
int(*BotItemGoalInVisButNotVisible)(int viewer, vec3_t eye, vec3_t viewangles, struct bot_goal_s* goal);
int(*BotGetLevelItemGoal)(int index, char* classname, struct bot_goal_s* goal);
int(*BotGetNextCampSpotGoal)(int num, struct bot_goal_s* goal);
int(*BotGetMapLocationGoal)(char* name, struct bot_goal_s* goal);
float(*BotAvoidGoalTime)(int goalstate, int number);
void(*BotSetAvoidGoalTime)(int goalstate, int number, float avoidtime);
void(*BotInitLevelItems)(void);
void(*BotUpdateEntityItems)(void);
int(*BotLoadItemWeights)(int goalstate, char* filename);
void(*BotFreeItemWeights)(int goalstate);
void(*BotInterbreedGoalFuzzyLogic)(int parent1, int parent2, int child);
void(*BotSaveGoalFuzzyLogic)(int goalstate, char* filename);
void(*BotMutateGoalFuzzyLogic)(int goalstate, float range);
int(*BotAllocGoalState)(int client);
void(*BotFreeGoalState)(int handle);
//-----------------------------------
// be_ai_move.h
//-----------------------------------
void(*BotResetMoveState)(int movestate);
void(*BotMoveToGoal)(struct bot_moveresult_s* result, int movestate, struct bot_goal_s* goal, int travelflags);
int(*BotMoveInDirection)(int movestate, vec3_t dir, float speed, int type);
void(*BotResetAvoidReach)(int movestate);
void(*BotResetLastAvoidReach)(int movestate);
int(*BotReachabilityArea)(vec3_t origin, int testground);
int(*BotMovementViewTarget)(int movestate, struct bot_goal_s* goal, int travelflags, float lookahead, vec3_t target);
int(*BotPredictVisiblePosition)(vec3_t origin, int areanum, struct bot_goal_s* goal, int travelflags, vec3_t target);
int(*BotAllocMoveState)(void);
void(*BotFreeMoveState)(int handle);
void(*BotInitMoveState)(int handle, struct bot_initmove_s* initmove);
void(*BotAddAvoidSpot)(int movestate, vec3_t origin, float radius, int type);
//-----------------------------------
// be_ai_weap.h
//-----------------------------------
int(*BotChooseBestFightWeapon)(int weaponstate, int* inventory);
void(*BotGetWeaponInfo)(int weaponstate, int weapon, struct weaponinfo_s* weaponinfo);
int(*BotLoadWeaponWeights)(int weaponstate, char* filename);
int(*BotAllocWeaponState)(void);
void(*BotFreeWeaponState)(int weaponstate);
void(*BotResetWeaponState)(int weaponstate);
//-----------------------------------
// be_ai_gen.h
//-----------------------------------
int(*GeneticParentsAndChildSelection)(int numranks, float* ranks, int* parent1, int* parent2, int* child);
} ai_export_t;
//bot AI library imported functions
typedef struct botlib_export_s {
//Area Awareness System functions
aas_export_t aas;
//Elementary Action functions
ea_export_t ea;
//AI functions
ai_export_t ai;
//setup the bot library, returns BLERR_
int(*BotLibSetup)(void);
//shutdown the bot library, returns BLERR_
int(*BotLibShutdown)(void);
//sets a library variable returns BLERR_
int(*BotLibVarSet)(char* var_name, char* value);
//gets a library variable returns BLERR_
int(*BotLibVarGet)(char* var_name, char* value, int size);
//sets a C-like define returns BLERR_
int(*PC_AddGlobalDefine)(char* string);
int(*PC_LoadSourceHandle)(const char* filename);
int(*PC_FreeSourceHandle)(int handle);
// int (*PC_ReadTokenHandle)(int handle, pc_token_t* pc_token);
int(*PC_SourceFileAndLine)(int handle, char* filename, int* line);
//start a frame in the bot library
int(*BotLibStartFrame)(float time);
//load a new map in the bot library
int(*BotLibLoadMap)(const char* mapname);
//entity updates
int(*BotLibUpdateEntity)(int ent, bot_entitystate_t* state);
//just for testing
int(*Test)(int parm0, int parm1, vec3_t parm2, vec3_t parm3);
} botlib_export_t;
//linking of bot library
botlib_export_t* GetBotLibAPI(int apiVersion, botlib_import_t* import);
/* Library variables:
name: default: module(s): description:
"basedir" "" l_utils.c base directory
"gamedir" "" l_utils.c game directory
"cddir" "" l_utils.c CD directory
"log" "0" l_log.c enable/disable creating a log file
"maxclients" "4" be_interface.c maximum number of clients
"maxentities" "1024" be_interface.c maximum number of entities
"bot_developer" "0" be_interface.c bot developer mode
"phys_friction" "6" be_aas_move.c ground friction
"phys_stopspeed" "100" be_aas_move.c stop speed
"phys_gravity" "800" be_aas_move.c gravity value
"phys_waterfriction" "1" be_aas_move.c water friction
"phys_watergravity" "400" be_aas_move.c gravity in water
"phys_maxvelocity" "320" be_aas_move.c maximum velocity
"phys_maxwalkvelocity" "320" be_aas_move.c maximum walk velocity
"phys_maxcrouchvelocity" "100" be_aas_move.c maximum crouch velocity
"phys_maxswimvelocity" "150" be_aas_move.c maximum swim velocity
"phys_walkaccelerate" "10" be_aas_move.c walk acceleration
"phys_airaccelerate" "1" be_aas_move.c air acceleration
"phys_swimaccelerate" "4" be_aas_move.c swim acceleration
"phys_maxstep" "18" be_aas_move.c maximum step height
"phys_maxsteepness" "0.7" be_aas_move.c maximum floor steepness
"phys_maxbarrier" "32" be_aas_move.c maximum barrier height
"phys_maxwaterjump" "19" be_aas_move.c maximum waterjump height
"phys_jumpvel" "270" be_aas_move.c jump z velocity
"phys_falldelta5" "40" be_aas_move.c
"phys_falldelta10" "60" be_aas_move.c
"rs_waterjump" "400" be_aas_move.c
"rs_teleport" "50" be_aas_move.c
"rs_barrierjump" "100" be_aas_move.c
"rs_startcrouch" "300" be_aas_move.c
"rs_startgrapple" "500" be_aas_move.c
"rs_startwalkoffledge" "70" be_aas_move.c
"rs_startjump" "300" be_aas_move.c
"rs_rocketjump" "500" be_aas_move.c
"rs_bfgjump" "500" be_aas_move.c
"rs_jumppad" "250" be_aas_move.c
"rs_aircontrolledjumppad" "300" be_aas_move.c
"rs_funcbob" "300" be_aas_move.c
"rs_startelevator" "50" be_aas_move.c
"rs_falldamage5" "300" be_aas_move.c
"rs_falldamage10" "500" be_aas_move.c
"rs_maxjumpfallheight" "450" be_aas_move.c
"max_aaslinks" "4096" be_aas_sample.c maximum links in the AAS
"max_routingcache" "4096" be_aas_route.c maximum routing cache size in KB
"forceclustering" "0" be_aas_main.c force recalculation of clusters
"forcereachability" "0" be_aas_main.c force recalculation of reachabilities
"forcewrite" "0" be_aas_main.c force writing of aas file
"aasoptimize" "0" be_aas_main.c enable aas optimization
"sv_mapChecksum" "0" be_aas_main.c BSP file checksum
"bot_visualizejumppads" "0" be_aas_reach.c visualize jump pads
"bot_reloadcharacters" "0" - reload bot character files
"ai_gametype" "0" be_ai_goal.c game type
"droppedweight" "1000" be_ai_goal.c additional dropped item weight
"weapindex_rocketlauncher" "5" be_ai_move.c rl weapon index for rocket jumping
"weapindex_bfg10k" "9" be_ai_move.c bfg weapon index for bfg jumping
"weapindex_grapple" "10" be_ai_move.c grapple weapon index for grappling
"entitytypemissile" "3" be_ai_move.c ET_MISSILE
"offhandgrapple" "0" be_ai_move.c enable off hand grapple hook
"cmd_grappleon" "grappleon" be_ai_move.c command to activate off hand grapple
"cmd_grappleoff" "grappleoff" be_ai_move.c command to deactivate off hand grapple
"itemconfig" "items.c" be_ai_goal.c item configuration file
"weaponconfig" "weapons.c" be_ai_weap.c weapon configuration file
"synfile" "syn.c" be_ai_chat.c file with synonyms
"rndfile" "rnd.c" be_ai_chat.c file with random strings
"matchfile" "match.c" be_ai_chat.c file with match strings
"nochat" "0" be_ai_chat.c disable chats
"max_messages" "1024" be_ai_chat.c console message heap size
"max_weaponinfo" "32" be_ai_weap.c maximum number of weapon info
"max_projectileinfo" "32" be_ai_weap.c maximum number of projectile info
"max_iteminfo" "256" be_ai_goal.c maximum number of item info
"max_levelitems" "256" be_ai_goal.c maximum number of level items
*/
#endif