The-Simpsons-Hit-and-Run/game/code/meta/triggerlocator.cpp

204 lines
5.8 KiB
C++

//=============================================================================
// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
//
// File:
//
// Description: Implement TriggerLocator
//
// History: 04/04/2002 + Created -- Cary Brisebois
//
//=============================================================================
//========================================
// System Includes
//========================================
// Foundation Tech
#include <raddebug.hpp>
//========================================
// Project Includes
//========================================
#ifndef WORLD_BUILDER
#include <meta/TriggerLocator.h>
#include <meta/TriggerVolume.h>
#include <meta/triggervolumetracker.h>
#include <memory/srrmemory.h>
#else
#include "TriggerLocator.h"
#include "TriggerVolume.h"
#include "triggervolumetracker.h"
#define new(s) new
#endif
//******************************************************************************
//
// Global Data, Local Data, Local Classes
//
//******************************************************************************
//******************************************************************************
//
// Public Member Functions
//
//******************************************************************************
//==============================================================================
// TriggerLocator::TriggerLocator
//==============================================================================
// Description: Constructor.
//
// Parameters: None.
//
// Return: N/A.
//
//==============================================================================
TriggerLocator::TriggerLocator() :
mTriggerVolumes( NULL ),
mNumTriggers( 0 ),
mMaxNumTriggers( 0 ),
mPlayerEntered( false ),
mPlayerID( -1 )
{
}
//==============================================================================
// TriggerLocator::~TriggerLocator
//==============================================================================
// Description: Destructor.
//
// Parameters: None.
//
// Return: N/A.
//
//==============================================================================
TriggerLocator::~TriggerLocator()
{
unsigned int i;
for ( i = 0; i < mMaxNumTriggers; ++i )
{
if ( mTriggerVolumes[ i ] != NULL )
{
//Chuck We should check if the Trig Track even exists
// since it maybe destroyed when we are clearing the inventory of these things.
if(GetTriggerVolumeTracker() != NULL)
{
GetTriggerVolumeTracker( )->RemoveTrigger( mTriggerVolumes[ i ] );
}
mTriggerVolumes[ i ]->Release( );
mTriggerVolumes[ i ] = NULL;
}
}
delete[] mTriggerVolumes;
mTriggerVolumes = NULL;
}
//=============================================================================
// TriggerLocator::SetNumTriggers
//=============================================================================
// Description: Comment
//
// Parameters: ( unsigned int num, int allocID )
//
// Return: void
//
//=============================================================================
void TriggerLocator::SetNumTriggers( unsigned int num, int allocID )
{
MEMTRACK_PUSH_GROUP( "TriggerLocator" );
rAssert( !mTriggerVolumes );
#ifdef RAD_DEBUG
if ( allocID == 0 )
{
rDebugString( "Someone is allocating trigger volume space in the DEFAULT heap!\n");
rDebugString( "Pass the correct allocator id to SetNumTriggers please!!\n");
}
#endif
mTriggerVolumes = new( (GameMemoryAllocator)allocID ) TriggerVolume*[num];
mMaxNumTriggers = (short)num;
unsigned short i;
for ( i = 0; i < mMaxNumTriggers; ++i )
{
mTriggerVolumes[ i ] = NULL;
}
MEMTRACK_POP_GROUP( "TriggerLocator" );
}
//=============================================================================
// TriggerLocator::AddTriggerVolume
//=============================================================================
// Description: Comment
//
// Parameters: ( TriggerVolume* volume )
//
// Return: void
//
//=============================================================================
void TriggerLocator::AddTriggerVolume( TriggerVolume* volume )
{
rAssert( mNumTriggers < mMaxNumTriggers );
rAssert( mTriggerVolumes );
if ( volume )
{
volume->AddRef();
mTriggerVolumes[ mNumTriggers ] = volume;
mNumTriggers++;
}
}
//=============================================================================
// TriggerLocator::GetTriggerVolume
//=============================================================================
// Description: Comment
//
// Parameters: ( unsigned int i )
//
// Return: TriggerVolume
//
//=============================================================================
TriggerVolume* TriggerLocator::GetTriggerVolume( unsigned int i )
{
rAssert( i < mMaxNumTriggers );
rAssert( mTriggerVolumes );
return mTriggerVolumes[ i ];
}
//=============================================================================
// TriggerLocator::IsPlayerTracked
//=============================================================================
// Description: Comment
//
// Parameters: ( int playerID )
//
// Return: unsigned int
//
//=============================================================================
unsigned int TriggerLocator::IsPlayerTracked( int playerID ) const
{
unsigned int count = 0;
unsigned int i;
for ( i = 0; i < mNumTriggers; ++i )
{
if ( mTriggerVolumes[ i ] && mTriggerVolumes[ i ]->IsPlayerTracking( playerID ) )
{
++count;
}
}
return count;
}
//******************************************************************************
//
// Private Member Functions
//
//******************************************************************************