The-Simpsons-Hit-and-Run/game/code/ai/state.h

233 lines
4.9 KiB
C++

//=============================================================================
// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
//
// File: state.h
//
// Description: Blahblahblah
//
// History: 6/12/2002 + Created -- NAME
//
//=============================================================================
#ifndef STATE_H
#define STATE_H
//========================================
// Nested Includes
//========================================
#include <memory/memorypool.h>
#include <radmath/radmath.hpp>
#include <events/eventenum.h>
#include <events/eventlistener.h>
//========================================
// Forward References
//========================================
class Character;
class InCarAction;
namespace CharacterAi
{
enum CharacterState
{
NOSTATE,
LOCO,
INCAR,
GET_IN,
GET_OUT,
INSIM
};
//=============================================================================
//
// Synopsis: Blahblahblah
//
//=============================================================================
class State
{
public:
State( Character* pCharacter );
virtual ~State( void );
virtual void Enter( void ) = 0;
virtual void Exit( void ) = 0;
virtual void SequenceAction( void ) = 0;
virtual void Update( float timeins ) = 0;
virtual CharacterState GetStateID( void ) const = 0;
static void* operator new( size_t size ) { return( sMemoryPool.Allocate( size ) ); }
static void operator delete( void* deadObject, size_t size ) { sMemoryPool.Free( deadObject, size ); }
// Declared but not defined to prevent access.
static void* operator new[]( size_t size );
static void operator delete[]( void* pMemory );
protected:
Character* mpCharacter;
private:
//Prevent wasteful constructor creation.
State();
State( const State& state );
State& operator=( const State& state );
static FBMemoryPool sMemoryPool;
};
class NoState
:
public State
{
public:
NoState(Character* c) : State(c) {}
virtual ~NoState( void ) {}
static CharacterState StateID( void ) { return NOSTATE; }
virtual CharacterState GetStateID( void ) const { return StateID(); }
protected:
virtual void Enter( void ) {}
virtual void Exit( void ) {}
virtual void SequenceAction( void ) {}
virtual void Update( float timeins ) {}
};
class InCar
:
public State
{
public:
InCar( Character* pCharacter );
virtual ~InCar( void );
static CharacterState StateID( void ) { return INCAR; }
virtual CharacterState GetStateID( void ) const { return StateID(); }
protected:
virtual void Enter( void );
virtual void Exit( void );
virtual void SequenceAction( void );
virtual void Update( float timeins );
private:
InCarAction* m_InCarAction;
enum GetOutState
{
GETOUT_NONE,
GETOUT_TRYING,
GETOUT_COMITTED
};
bool mIsDriver : 1;
GetOutState m_GetOutState;
};
class Loco
:
public State
{
public:
Loco( Character* pCharacter );
virtual ~Loco( void );
static CharacterState StateID( void ) { return LOCO; }
virtual CharacterState GetStateID( void ) const { return StateID(); }
protected:
unsigned mLastActionFrame;
virtual void Enter( void );
virtual void Exit( void );
virtual void SequenceAction( void );
virtual void Update( float timeins );
};
class InSim : public State
{
public:
InSim( Character* pCharacter );
virtual ~InSim( void );
static CharacterState StateID( void ) { return INSIM; }
virtual CharacterState GetStateID( void ) const { return StateID(); }
protected:
virtual void Enter( void );
virtual void Exit( void );
virtual void SequenceAction( void );
virtual void Update( float timeins );
};
class GetIn : public State, public EventListener
{
public:
GetIn( Character* pCharacter );
virtual ~GetIn( void );
static CharacterState StateID( void ) { return GET_IN; }
virtual CharacterState GetStateID( void ) const { return StateID(); }
protected:
virtual void Enter( void );
virtual void Exit( void );
virtual void SequenceAction( void );
virtual void Update( float timeins );
void HandleEvent( EventEnum id, void* pUserData );
private:
void CalcGetInPath(int* nWaypoints, rmt::Vector* waypoints, bool* doingSlide, bool* jump);
bool mObstructed : 1;
bool mFirst : 1;
int mCollisionFailure : 3;
};
class GetOut : public State, public EventListener
{
public:
GetOut( Character* pCharacter );
virtual ~GetOut( void );
static CharacterState StateID( void ) { return GET_OUT; }
virtual CharacterState GetStateID( void ) const { return StateID(); }
protected:
void DoGetOut(void);
virtual void Enter( void );
virtual void Exit( void );
virtual void SequenceAction( void );
virtual void Update( float timeins );
void HandleEvent( EventEnum id, void* pUserData );
bool mObstructed : 1;
bool mFirst : 1;
bool mPanic : 1;
};
}; // end of namespace
#endif //STATE_H