The-Simpsons-Hit-and-Run/game/code/worldsim/redbrick/vehiclecontroller/aivehiclecontroller.cpp

167 lines
3.3 KiB
C++

#include <worldsim/redbrick/vehiclecontroller/aivehiclecontroller.h>
#include <main/game.h>
#include <memory/classsizetracker.h>
#include <radmath/radmath.hpp>
class Behaviour
{
public:
virtual rmt::Vector Tick( Vehicle* pVehicle ) = 0;
};
class VehicleWander
:
public Behaviour
{
public:
VehicleWander( void );
virtual ~VehicleWander( void );
rmt::Vector& GetTargetPoint( void );
void SetTargetPoint( rmt::Vector& targetPoint );
rmt::Vector& GetPosition( void );
void SetPosition( rmt::Vector& position );
float GetTargetRadius( void ) const;
void SetTargetRadius( float radius );
float GetSteeringRadius( void ) const;
void SetSteeringRadius( float radius );
rmt::Vector Tick( Vehicle* pVehicle );
private:
rmt::Vector mTargetPoint;
rmt::Vector mPosition;
float mfTargetCircleRadius;
float mfSteeringCircleRadius;
};
VehicleWander::VehicleWander( void )
:
mTargetPoint( 0.0f, 0.0f, 1.0f ),
mPosition( 0.0f, 0.0f, 0.1f ),
mfTargetCircleRadius( 1.0f ),
mfSteeringCircleRadius( 0.003f )
{
mTargetPoint.z = mfTargetCircleRadius;
}
VehicleWander::~VehicleWander( void )
{
}
rmt::Vector VehicleWander::Tick( Vehicle* pVehicle )
{
static rmt::Randomizer r( Game::GetRandomSeed () );
static rmt::Vector point( 0.0f, 0.0f, 0.0f );
point.x = r.FloatSigned( );
point.y = 0.0f;
point.z = r.FloatSigned( );
// Make a point on the new circle.
//
point.Normalize( );
point.Scale( mfSteeringCircleRadius );
// Add to point on circle.
//
mTargetPoint.Add( point );
// Project back to unit circle.
//
mTargetPoint.Normalize( );
// Scale to actual Target Circle.
//
mTargetPoint.Scale( mfTargetCircleRadius );
rmt::Vector retVector;
retVector.Add( mPosition, mTargetPoint );
retVector.Normalize( );
return retVector;
}
AiVehicleController::AiVehicleController( Vehicle* pVehicle )
{
//CLASSTRACKER_CREATE( AiVehicleController );
SetVehicle( pVehicle );
}
AiVehicleController::~AiVehicleController( void )
{
//CLASSTRACKER_DESTROY( AiVehicleController );
}
void AiVehicleController::Update( float timeins )
{
/*
static Behaviour* spBehaviour = 0;
if ( !spBehaviour )
{
spBehaviour = new VehicleWander;
}
rmt::Vector direction = spBehaviour->Tick( GetVehicle( ) );
mSteering.SetValue( direction.x );
mGas.SetValue( direction.z );
*/
mHandBrake.SetValue( 1.0f );
mGas.SetValue( 0.0f );
mSteering.SetValue( 0.0f );
mBrake.SetValue( 0.0f );
mReverse.SetValue( 0.0f );
mHorn.SetValue( 0.0f );
}
float AiVehicleController::GetGas( void ) const
{
// ai shoudln't really use this?
return mGas.GetValue();
}
float AiVehicleController::GetThrottle( void ) const
{
return mGas.GetValue();
}
float AiVehicleController::GetBrake( void ) const
{
return mBrake.GetValue();
}
float AiVehicleController::GetSteering( bool& isWheel ) const
{
isWheel = false;
return mSteering.GetValue();
}
// AI shouldn't really call these
float AiVehicleController::GetSteerLeft( void ) const
{
return 0.0f;
}
float AiVehicleController::GetSteerRight( void ) const
{
return 0.0f;
}
float AiVehicleController::GetHandBrake( void ) const
{
return mHandBrake.GetValue();
}
float AiVehicleController::GetReverse( void ) const
{
return mReverse.GetValue();
}
float AiVehicleController::GetHorn( void ) const
{
return mHorn.GetValue();
}