openmohaa/code/fgame/playerbot.h

176 lines
4.8 KiB
C++

/*
===========================================================================
Copyright (C) 2015 the OpenMoHAA team
This file is part of OpenMoHAA source code.
OpenMoHAA source code is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.
OpenMoHAA source code is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenMoHAA source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/
// playerbot.h: Multiplayer bot system.
#ifndef __PLAYERBOT_H__
#define __PLAYERBOT_H__
#include "player.h"
#include "navigate.h"
#include "actorpath.h"
#define MAX_BOT_FUNCTIONS 5
typedef struct nodeAttract_s {
float m_fRespawnTime;
AttractiveNodePtr m_pNode;
} nodeAttract_t;
class PlayerBot : public Player
{
struct botfunc_t {
bool ( PlayerBot::*CheckCondition )( void );
void ( PlayerBot::*BeginState )( void );
void ( PlayerBot::*EndState )( void );
void ( PlayerBot::*ThinkState )( void );
};
private:
static botfunc_t botfuncs[];
// Paths
ActorPath m_Path;
Vector m_vTargetPos;
Vector m_vCurrentGoal;
Vector m_vLastValidDir;
Vector m_vLastValidGoal;
bool m_bPathing;
bool m_bTempAway;
bool m_bAimPath;
bool m_bDeltaMove;
int m_iTempAwayTime;
int m_iCheckPathTime;
AttractiveNodePtr m_pPrimaryAttract;
float m_fAttractTime;
Container< nodeAttract_t * > m_attractList;
// States
int m_iCuriousTime;
int m_iAttackTime;
Vector m_vLastCuriousPos;
Vector m_vOldEnemyPos;
Vector m_vLastEnemyPos;
Vector m_vLastDeathPos;
SafePtr< Sentient > m_pEnemy;
// Input
usercmd_t m_botCmd;
usereyes_t m_botEyes;
// Direction
Vector m_vTargetAng;
Vector m_vCurrentAng;
Vector m_vAngSpeed;
float m_fYawSpeedMult;
// States
int m_StateCount;
unsigned int m_StateFlags;
ScriptThreadLabel m_RunLabel;
private:
void CheckAttractiveNodes( void );
void MoveThink( void );
void TurnThink( void );
void CheckEndPos( void );
void CheckJump( void );
void CheckUse( void );
void State_DefaultBegin( void );
void State_DefaultEnd( void );
void State_Reset( void );
static void InitState_Idle( botfunc_t *func );
bool CheckCondition_Idle( void );
void State_BeginIdle( void );
void State_EndIdle( void );
void State_Idle( void );
static void InitState_Curious( botfunc_t *func );
bool CheckCondition_Curious( void );
void State_BeginCurious( void );
void State_EndCurious( void );
void State_Curious( void );
static void InitState_Attack( botfunc_t *func );
bool CheckCondition_Attack( void );
void State_BeginAttack( void );
void State_EndAttack( void );
void State_Attack( void );
static void InitState_Grenade( botfunc_t *func );
bool CheckCondition_Grenade( void );
void State_BeginGrenade( void );
void State_EndGrenade( void );
void State_Grenade( void );
static void InitState_Weapon( botfunc_t *func );
bool CheckCondition_Weapon( void );
void State_BeginWeapon( void );
void State_EndWeapon( void );
void State_Weapon( void );
void CheckStates( void );
public:
CLASS_PROTOTYPE( PlayerBot );
PlayerBot();
static void Init( void );
void GetEyeInfo( usereyes_t *eyeinfo );
void GetUsercmd( usercmd_t *ucmd );
void SetTargetAngles( Vector vAngles );
void UpdateBotStates( void );
void CheckReload( void );
void AimAt( Vector vPos );
void AimAtAimNode( void );
void AvoidPath( Vector vPos, float fAvoidRadius, Vector vPreferredDir = vec_zero, float *vLeashHome = NULL, float fLeashRadius = 0.0f );
void MoveNear( Vector vNear, float fRadius, float *vLeashHome = NULL, float fLeashRadius = 0.0f );
void MoveTo( Vector vPos, float *vLeashHome = NULL, float fLeashRadius = 0.0f );
bool MoveToBestAttractivePoint( int iMinPriority = 0 );
bool CanMoveTo( Vector vPos );
bool MoveDone( void );
bool IsMoving( void );
void ClearMove( void );
void NoticeEvent( Vector vPos, int iType, Entity *pEnt, float fDistanceSquared, float fRadiusSquared );
void ClearEnemy( void );
void SendCommand( const char *text );
void setAngles( Vector angles ) override;
void updateOrigin( void ) override;
void Spawned( void ) override;
void Killed( Event *ev );
void GotKill( Event *ev );
void EventStuffText( Event *ev );
};
#endif /* playerbot.h */