211 lines
9.6 KiB
C
211 lines
9.6 KiB
C
|
// Copyright (C) 2007 Id Software, Inc.
|
||
|
//
|
||
|
|
||
|
#ifndef __BOTACTIONS_H__
|
||
|
#define __BOTACTIONS_H__
|
||
|
|
||
|
#include "Bot_Common.h"
|
||
|
|
||
|
enum botActionType_t {
|
||
|
BASE_ACTION = 1,
|
||
|
BBOX_ACTION = 2,
|
||
|
VEHICLE_PATH_ACTION = 3,
|
||
|
TARGET_ACTION = 4,
|
||
|
};
|
||
|
|
||
|
#define ACTION_BBOX_EXPAND_BIG 64.0f
|
||
|
#define ACTION_BBOX_EXPAND_SMALL 12.0f
|
||
|
|
||
|
#define MAX_LINKACTIONS 8
|
||
|
#define MAX_ACTIONS 512 //mal: max number of actions in the game
|
||
|
|
||
|
enum botActionGoals_t {
|
||
|
ACTION_NULL = -1,
|
||
|
ACTION_ROAM,
|
||
|
ACTION_CAMP,
|
||
|
ACTION_DENY_SPAWNPOINT, // deny the enemy from having a FDA here.
|
||
|
ACTION_MAJOR_OBJ_BUILD,
|
||
|
ACTION_MINOR_OBJ_BUILD,
|
||
|
ACTION_PREVENT_BUILD, // the opposite of ACTION_MAJOR_OBJ_BUILD/ACTION_MINOR_OBJ_BUILD
|
||
|
ACTION_HE_CHARGE,
|
||
|
ACTION_DEFUSE, // the opposite of ACTION_DEFUSE
|
||
|
ACTION_HACK,
|
||
|
ACTION_PREVENT_HACK, // the opposite of ACTION_HACK
|
||
|
ACTION_STEAL,
|
||
|
ACTION_PREVENT_STEAL, // the opposite of ACTION_STEAL
|
||
|
ACTION_SNIPE,
|
||
|
ACTION_DELIVER,
|
||
|
ACTION_LANDMINE,
|
||
|
ACTION_FIRESUPPORT, // a place for FOps to unleash firesupport
|
||
|
ACTION_AIRCAN_HINT,
|
||
|
ACTION_SMOKE_HINT, // have coverts throw smoke at the obj, so their teammates can do it in peace.
|
||
|
ACTION_NADE_HINT,
|
||
|
ACTION_VEHICLE_CAMP, // vehicle specific camp
|
||
|
ACTION_VEHICLE_ROAM, // vehicle specific roam
|
||
|
ACTION_SUPPLY_HINT,
|
||
|
ACTION_MCP_OUTPOST,
|
||
|
ACTION_SHIELD_HINT, // a good place to drop a shield.
|
||
|
ACTION_TELEPORTER_HINT,
|
||
|
ACTION_FORWARD_SPAWN, // forward deployment area
|
||
|
ACTION_PREVENT_DELIVER,
|
||
|
ACTION_DROP_DEPLOYABLE, // team can drop a deployable here.
|
||
|
ACTION_MCP_START, // this is where the MCP begins its path.
|
||
|
ACTION_DEFENSE_CAMP, // HIGH priority camp location.
|
||
|
ACTION_DEFENSE_MINE,
|
||
|
ACTION_VEHICLE_GRAB,
|
||
|
ACTION_THIRDEYE_HINT,
|
||
|
ACTION_MG_NEST,
|
||
|
ACTION_MG_NEST_BUILD,
|
||
|
ACTION_FLYER_HIVE_LAUNCH,
|
||
|
ACTION_FLYER_HIVE_TARGET,
|
||
|
ACTION_FLYER_HIVE_HINT,
|
||
|
ACTION_DROP_PRIORITY_DEPLOYABLE,
|
||
|
ACTION_MCP_ROUTE_MARKER,
|
||
|
ACTION_MAX_ACTIONS
|
||
|
};
|
||
|
|
||
|
enum leanTypes_t {
|
||
|
NULL_LEAN = -1,
|
||
|
LEAN_BODY_RIGHT,
|
||
|
LEAN_BODY_LEFT
|
||
|
};
|
||
|
|
||
|
enum botActionStates_t {
|
||
|
ACTION_STATE_NULL = -1, //mal: action is dead/deactivated/etc
|
||
|
ACTION_STATE_NORMAL, //mal: nothing to see here, move along.... the default state of an action.
|
||
|
ACTION_STATE_START_BUILD,
|
||
|
ACTION_STATE_PLANTED,
|
||
|
ACTION_STATE_START_HACK,
|
||
|
ACTION_STATE_OBJ_STOLEN,
|
||
|
ACTION_STATE_DEFUSED,
|
||
|
ACTION_STATE_BUILD_FIZZLED, //mal_TODO: add something for minor builds? so that the bots know they're done?
|
||
|
ACTION_STATE_HACK_FIZZLED,
|
||
|
ACTION_STATE_OBJ_RETURNED,
|
||
|
ACTION_STATE_OBJ_DROPPED,
|
||
|
ACTION_STATE_FINISH_BUILD,
|
||
|
ACTION_STATE_OBJ_BORN, //mal: at map start, when the obj is first born
|
||
|
ACTION_STATE_OBJ_DELIVERED,
|
||
|
ACTION_STATE_GUN_READY,
|
||
|
ACTION_STATE_GUN_DESTROYED
|
||
|
};
|
||
|
|
||
|
struct actionTarget_t {
|
||
|
bool inuse;
|
||
|
int radius;
|
||
|
idVec3 origin;
|
||
|
};
|
||
|
|
||
|
class idBotActions {
|
||
|
public:
|
||
|
|
||
|
friend class idBotAI;
|
||
|
friend class idBotThreadData; //mal_FIXME: when get map loading finished, take this out!
|
||
|
|
||
|
idBotActions();
|
||
|
virtual ~idBotActions() {}
|
||
|
|
||
|
//mal_TODO: finish these functions for the map loading stuff.....
|
||
|
|
||
|
void SetActive( bool isActive ) { active = isActive; }
|
||
|
void SetActionState( const botActionStates_t &state ) { actionState = state; }
|
||
|
void SetOrigin( const idVec3 &actionOrigin ) { origin = actionOrigin; }
|
||
|
void SetRadius( float actionRadius ) { radius = actionRadius; }
|
||
|
void SetActionTimeInSeconds( int time ) { actionTimeInSeconds = time; }
|
||
|
void SetAreaNum( int actionAreaNum ) { areaNum = actionAreaNum; }
|
||
|
void SetHumanObj( botActionGoals_t obj ) { humanObj = obj; }
|
||
|
void SetStroggObj( botActionGoals_t obj ) { stroggObj = obj; }
|
||
|
void SetActionGroupNum( int actionGroupNum ) { groupID = actionGroupNum; }
|
||
|
void SetActionPriority( bool isPriority ) { priority = isPriority; }
|
||
|
bool ActionIsPriority() { return priority; }
|
||
|
void SetActionPosture( botMoveFlags_t &actionPosture ) { posture = actionPosture; }
|
||
|
bool ActionIsValid() const { return ( baseActionType == BASE_ACTION && ( humanObj != ACTION_NULL || stroggObj != ACTION_NULL ) ); }
|
||
|
bool ActionIsActiveForever() const { return activeForever; }
|
||
|
int GetActionGroup() const { return groupID; }
|
||
|
bool ActionIsActive() const { return active; }
|
||
|
const botActionGoals_t GetStroggObj() const { return stroggObj; }
|
||
|
const botActionGoals_t GetHumanObj() const { return humanObj; }
|
||
|
const botActionStates_t GetActionState() const { return actionState; }
|
||
|
const botActionGoals_t GetObjForTeam( playerTeamTypes_t team ) const { return ( team == GDF ) ? humanObj : stroggObj; }
|
||
|
const botActionGoals_t GetBaseObjForTeam( playerTeamTypes_t team ) const { return ( team == GDF ) ? baseHumanObj : baseStroggObj; }
|
||
|
const idBox& GetBox() const { return actionBBox; }
|
||
|
float GetRadius() const { return radius; }
|
||
|
bool EntityIsInsideActionBBox( int entNum, const dangerTypes_t entityType, bool expandBox = true ) const;
|
||
|
bool EntityOriginIsInsideActionBBox( const idVec3& entOrg );
|
||
|
void SetActionDisabled( int actionNum );
|
||
|
bool ArmedChargesInsideActionBBox( int ignoreEnt ) const;
|
||
|
bool ArmedMinesInsideActionBBox() const;
|
||
|
int GetValidClasses() const { return validClasses; }
|
||
|
bool CheckTeamMemberIsInsideAction( int ignoreClientNum, const playerTeamTypes_t team, const playerClassTypes_t classType, bool needsBombCharge = false ) const;
|
||
|
int GetActionVehicleFlags( const playerTeamTypes_t botTeam ) const;
|
||
|
void SetActionVehicleFlags( int vehicleFlags ) { actionVehicleFlags = vehicleFlags; }
|
||
|
const botChatTypes_t GetVOChat() const { return VOChatFlag; }
|
||
|
playerTeamTypes_t GetTeamOwner() const { return teamOwner; }
|
||
|
void SetActionTeamOwner( const playerTeamTypes_t newTeamOwner ) { teamOwner = newTeamOwner; }
|
||
|
void SetActionObjState( bool isHome ) { hasObj = isHome; }
|
||
|
bool GetActionObjState() const { return hasObj; }
|
||
|
int GetActionVehicleType() const { return actionVehicleFlags; }
|
||
|
const playerWeaponTypes_t GetActionWeapType() const { return weapType; }
|
||
|
|
||
|
void FindBBoxCenterLinePoint( idVec3 &point ) const; //mal: will find a line for the bots to look at. Not the best yet, but it does some good. Needs improvement!
|
||
|
void ProjectPointOntoLine( const idVec3 &start, const idVec3 &end, idVec3 &point ) const;
|
||
|
void FindRandomPointInBBox( idVec3 &point, int ignoreClientNum, const playerTeamTypes_t team ) const;
|
||
|
|
||
|
const char* GetActionName() const { return name.c_str(); }
|
||
|
|
||
|
int GetActionSpawnControllerEntNum() const { return spawnControllerEntityNum; }
|
||
|
|
||
|
int GetDeployableType() const { return deployableType; }
|
||
|
|
||
|
const idVec3& GetActionOrigin() const { return origin; }
|
||
|
|
||
|
int GetActionAreaNum() const { return areaNum; }
|
||
|
int GetActionVehicleAreaNum() const { return areaNumVehicle; }
|
||
|
void SetActionActivateTime( int newTime ) { actionActivateTime = newTime; }
|
||
|
|
||
|
botActionType_t GetBaseActionType() const { return baseActionType; }
|
||
|
|
||
|
private:
|
||
|
|
||
|
bool active; // is this action currently active?
|
||
|
bool noHack;
|
||
|
bool priority;
|
||
|
bool blindFire;
|
||
|
bool requiresVehicleType; // if true - wont do goal unless can find vehicle type.
|
||
|
bool activeForever; // if true, is turned on for the duration of the map.
|
||
|
bool disguiseSafe;
|
||
|
bool hasObj; // for carryable objs - if true, obj is home.
|
||
|
botActionType_t baseActionType; // baseAction, vehicleBBox, targetAction or actionBBox?
|
||
|
int actionVehicleFlags; // does this vehicle require the use of a vehicle to do/reach/etc? and if so - what type?
|
||
|
int entityNum; // the entity this action points to. Will be infered by the name of the entity passed.
|
||
|
int areaNum; // the area of AAS that this action is in.
|
||
|
int areaNumVehicle;
|
||
|
int groupID; // the group this action belongs to - useful for grouping actions together in the script
|
||
|
int validClasses; // a bitmask of what classes can do this action. 0 = ANYONE, 1 = SOLDIER, 2 = MEDIC, 4 = ENG, 8 = FOPS, 16 = COVERTOPS
|
||
|
int actionTimeInSeconds; // how long the bot should do whatever its supposed to do here. defined in seconds
|
||
|
int routeID;
|
||
|
int deployableType; // what kind of deployable belongs here.
|
||
|
int spawnControllerEntityNum; // only used for forward spawns - points to the entity that the action encompansses.
|
||
|
int actionActivateTime;
|
||
|
float radius; // this actions range of effect
|
||
|
|
||
|
botChatTypes_t VOChatFlag; // what chat the bot should play when selecting this action.
|
||
|
leanTypes_t leanDir;
|
||
|
playerWeaponTypes_t weapType;
|
||
|
playerTeamTypes_t teamOwner; // which team owns this action.
|
||
|
actionTarget_t actionTargets[ MAX_LINKACTIONS ]; // locations on the map for the bots be interested in, while doing this action. EX: an aim point to look at while camped, etc.
|
||
|
botActionGoals_t humanObj; // the human's goal at this action. ACTION_NULL if have none.
|
||
|
botActionGoals_t stroggObj; // the strogg's goal at this action. ACTION_NULL if have none.
|
||
|
botActionGoals_t baseHumanObj; //
|
||
|
botActionGoals_t baseStroggObj; //
|
||
|
botMoveFlags_t posture; // should a bot stand, crouch, or go prone when reaching this action?
|
||
|
botActionStates_t actionState; // a generic action state tracker
|
||
|
idVec3 origin; // actions origin
|
||
|
idStr name; // the name of this action.
|
||
|
idStr targetAction; // the action this one points to.
|
||
|
idBox actionBBox; // bounding box that marks where the bot should perform this action. Useful for knowing when bot is "touching" intended action.
|
||
|
//mal_TODO: add more stuff!!
|
||
|
|
||
|
};
|
||
|
|
||
|
#endif /* !__BOTACTIONS_H__ */
|