4933 lines
150 KiB
C++
4933 lines
150 KiB
C++
//=============================================================================
|
|
// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
|
|
//
|
|
// File:
|
|
//
|
|
// Description: Implementation of class ActionButtonHandler
|
|
//
|
|
// History: 08/07/2002 + Created -- NAME
|
|
//
|
|
//=============================================================================
|
|
|
|
//========================================
|
|
// System Includes
|
|
//========================================
|
|
// Foundation Tech
|
|
#include <raddebug.hpp>
|
|
|
|
#include <poser/joint.hpp>
|
|
#include <poser/poseengine.hpp>
|
|
#include <poser/pose.hpp>
|
|
|
|
#include <p3d/anim/pose.hpp>
|
|
#include <p3d/anim/animate.hpp>
|
|
#include <p3d/anim/poseanimation.hpp>
|
|
#include <p3d/anim/compositedrawable.hpp>
|
|
#include <p3d/anim/multicontroller.hpp>
|
|
#include <p3d/matrixstack.hpp>
|
|
|
|
//========================================
|
|
// Project Includes
|
|
//========================================
|
|
#include <ai/actionbuttonhandler.h>
|
|
#include <ai/actionbuttonmanager.h>
|
|
#include <presentation/presentation.h>
|
|
#include <worldsim/character/character.h>
|
|
#include <worldsim/character/charactercontroller.h>
|
|
#include <ai/statemanager.h>
|
|
#include <worldsim/avatarmanager.h>
|
|
#include <worldsim/vehiclecentral.h>
|
|
#include <worldsim/character/charactermanager.h>
|
|
#include <events/eventmanager.h>
|
|
#include <events/eventenum.h>
|
|
#include <sound/soundmanager.h>
|
|
|
|
#include <memory/srrmemory.h>
|
|
#include <meta/eventlocator.h>
|
|
#include <meta/actioneventlocator.h>
|
|
#include <meta/spheretriggervolume.h>
|
|
#include <meta/triggervolumetracker.h>
|
|
#include <meta/interiorentrancelocator.h>
|
|
#include <meta/carstartlocator.h>
|
|
#include <worldsim/parkedcars/parkedcarmanager.h>
|
|
#include <worldsim/traffic/trafficmanager.h>
|
|
#include <worldsim/redbrick/vehicle.h>
|
|
#include <worldsim/vehiclecentral.h>
|
|
#include <worldsim/hitnrunmanager.h>
|
|
|
|
#include <ai/sequencer/action.h>
|
|
#include <ai/sequencer/actioncontroller.h>
|
|
#include <ai/sequencer/sequencer.h>
|
|
#include <ai/actionbuttonhandler.h>
|
|
#ifdef ACTIONEVENTHANDLER_DEBUG
|
|
#include <ai/actionnames.h>
|
|
#endif // ACTIONEVENTHANDLER_DEBUG
|
|
#include <cards/cardgallery.h>
|
|
#include <cards/cardsdb.h>
|
|
#include <cards/card.h>
|
|
#include <camera/supercam.h>
|
|
|
|
#include <render/DSG/animcollisionentitydsg.h>
|
|
#include <render/DSG/InstDynaPhysDSG.h>
|
|
#include <render/RenderManager/RenderManager.h>
|
|
#include <render/RenderManager/RenderLayer.h>
|
|
#include <render/particles/particlemanager.h>
|
|
|
|
#include <presentation/gui/guisystem.h>
|
|
#include <presentation/gui/guiwindow.h>
|
|
#include <presentation/gui/ingame/guiscreenhud.h>
|
|
#include <presentation/gui/ingame/guimanageringame.h>
|
|
#include <presentation/gui/ingame/guiscreeniriswipe.h>
|
|
#include <presentation/gui/ingame/guiscreenletterbox.h>
|
|
|
|
#include <gameflow/gameflow.h>
|
|
#include <mission/gameplaymanager.h>
|
|
|
|
#include <mission/animatedicon.h>
|
|
#include <mission/charactersheet/charactersheetmanager.h>
|
|
#include <mission/gameplaymanager.h>
|
|
#include <mission/rewards/rewardsmanager.h>
|
|
|
|
#include <render/loaders/allwrappers.h>
|
|
#include <render/loaders/BillboardWrappedLoader.h>
|
|
|
|
#include <interiors/interiormanager.h>
|
|
#include <render/DSG/InstAnimDynaPhysDSG.h>
|
|
|
|
#include <input/inputmanager.h>
|
|
#ifdef RAD_WIN32
|
|
#include <input/usercontrollerWin32.h>
|
|
#else
|
|
#include <input/usercontroller.h>
|
|
#endif
|
|
|
|
#include <contexts/contextenum.h>
|
|
|
|
#include <camera/relativeanimatedcam.h>
|
|
#include <camera/supercammanager.h>
|
|
#include <camera/supercamcentral.h>
|
|
#include <camera/supercam.h>
|
|
|
|
#include <contexts/context.h>
|
|
#include <render/DSG/StatePropDSG.h>
|
|
|
|
//******************************************************************************
|
|
//
|
|
// Global Data, Local Data, Local Classes
|
|
//
|
|
//******************************************************************************
|
|
static const tUID GIL = tEntity::MakeUID( "gil" );
|
|
|
|
//
|
|
// Oh yeah. Big pre-final hack.
|
|
//
|
|
struct CarPurchaseDialogueStuff
|
|
{
|
|
radKey32 convName;
|
|
radInt64 sellerName;
|
|
};
|
|
static CarPurchaseDialogueStuff s_carPurchaseConvNames[] =
|
|
{
|
|
{ ::radMakeKey32( "plowking" ), tEntity::MakeUID( "reward_barney" ) },
|
|
{ ::radMakeKey32( "son" ), tEntity::MakeUID( "reward_homer" ) },
|
|
{ ::radMakeKey32( "bus" ), tEntity::MakeUID( "reward_otto" ) },
|
|
{ ::radMakeKey32( "tractor" ), tEntity::MakeUID( "reward_willie" ) },
|
|
{ ::radMakeKey32( "borrowing" ), tEntity::MakeUID( "reward_homer" ) },
|
|
{ ::radMakeKey32( "swine" ), tEntity::MakeUID( "reward_kearney" ) },
|
|
{ 0, tEntity::MakeUID( "zombie" ) } // No conversation for zombies
|
|
};
|
|
|
|
struct AnimSwitchSoundData
|
|
{
|
|
radKey32 objKey;
|
|
const char* soundName;
|
|
const char* positionalSettings;
|
|
bool isMovingSound;
|
|
};
|
|
|
|
static const AnimSwitchSoundData ANIM_SWITCH_SOUND_TABLE[] =
|
|
{
|
|
{ ::radMakeKey32( "TD" ), "trapdoor", "platform_settings", false },
|
|
{ ::radMakeKey32( "Splatform1Trans" ), "platform_02", "platform_settings", true },
|
|
{ ::radMakeKey32( "Splatform4Trans" ), "platform_01", "platform_settings", true },
|
|
{ ::radMakeKey32( "Splatform5Trans" ), "platform_01", "platform_settings", true },
|
|
{ ::radMakeKey32( "Splatform6Trans" ), "platform_01", "platform_settings", true },
|
|
{ ::radMakeKey32( "Aplatform6Trans" ), "aplatform6", "platform_settings", true },
|
|
{ ::radMakeKey32( "Splatfrom7Trans" ), "platform_01", "platform_settings", true }, // (sic)
|
|
{ ::radMakeKey32( "truck1" ), "duff_truck", "platform_settings", false },
|
|
{ ::radMakeKey32( "hdoortrans1" ), "plantdoor", "platform_settings", false },
|
|
{ ::radMakeKey32( "elevator" ), "elevator", "loud_elevator_settings", true },
|
|
{ ::radMakeKey32( "library" ), "gag_library", "platform_settings", false }
|
|
};
|
|
|
|
static unsigned int ANIM_SWITCH_SOUND_TABLE_SIZE =
|
|
sizeof( ANIM_SWITCH_SOUND_TABLE ) / sizeof( AnimSwitchSoundData );
|
|
|
|
namespace ActionButton
|
|
{
|
|
//******************************************************************************
|
|
//
|
|
// Public Member Functions
|
|
//
|
|
//******************************************************************************
|
|
/*
|
|
==============================================================================
|
|
AnimCollisionEntityDSGWrapper::AnimCollisionEntityDSGWrapper
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: AnimCollisionEntityDSGWrapper
|
|
|
|
=============================================================================
|
|
*/
|
|
AnimCollisionEntityDSGWrapper::AnimCollisionEntityDSGWrapper( void )
|
|
:
|
|
mpGameObject( 0 )
|
|
{
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimCollisionEntityDSGWrapper::~AnimCollisionEntityDSGWrapper
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: AnimCollisionEntityDSGWrapper
|
|
|
|
=============================================================================
|
|
*/
|
|
AnimCollisionEntityDSGWrapper::~AnimCollisionEntityDSGWrapper( void )
|
|
{
|
|
// Do not release. See comment in AnimCollisionEntityDSGWrapper::SetGameObject().
|
|
//
|
|
// TBJ [8/14/2002]
|
|
//
|
|
//tRefCounted::Release( mpGameObject );
|
|
mpGameObject = 0;
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimCollisionEntityDSGWrapper::UpdateVisibility
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AnimCollisionEntityDSGWrapper::UpdateVisibility( void )
|
|
{
|
|
mpGameObject->UpdateVisibility();
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimCollisionEntityDSGWrapper::SetGameObject
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( AnimCollisionEntityDSG* pGameObject )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AnimCollisionEntityDSGWrapper::SetGameObject( AnimCollisionEntityDSG* pGameObject )
|
|
{
|
|
// Do NOT addref. The "AnimCollisionEntityDSG" is dynamically loaded.
|
|
// If the dynaload system wants to release this object, we must let it go.
|
|
// We will assume that the 'AnimCollisionEntityDSG' will notify the AnimSwitch
|
|
// when it is deleted.
|
|
//
|
|
// TBJ [8/14/2002]
|
|
//
|
|
//tRefCounted::Assign( mpGameObject, pGameObject );
|
|
mpGameObject = pGameObject;
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
AnimCollisionEntityDSGWrapper::GetAnimationDirection
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: float
|
|
|
|
=============================================================================
|
|
*/
|
|
float& AnimCollisionEntityDSGWrapper::GetAnimationDirection( void )
|
|
{
|
|
return mpGameObject->GetAnimationDirection();
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimCollisionEntityDSGWrapper::SetAnimationDirection
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( float fDirection )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AnimCollisionEntityDSGWrapper::SetAnimationDirection( float fDirection )
|
|
{
|
|
mpGameObject->SetAnimationDirection( fDirection );
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimCollisionEntityDSGWrapper::GetAnimController
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: tMultiController
|
|
|
|
=============================================================================
|
|
*/
|
|
tMultiController* AnimCollisionEntityDSGWrapper::GetAnimController( void ) const
|
|
{
|
|
return mpGameObject->GetAnimController();
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
AnimCollisionEntityDSGWrapper::GetDrawable
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: tCompositeDrawable
|
|
|
|
=============================================================================
|
|
*/
|
|
tCompositeDrawable* AnimCollisionEntityDSGWrapper::GetDrawable( void ) const
|
|
{
|
|
return mpGameObject->GetDrawable();
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimCollisionEntityDSGWrapper::Display
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AnimCollisionEntityDSGWrapper::Display( void )
|
|
{
|
|
rAssertMsg( false, "This object should not be drawn.\n" );
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
/*
|
|
==============================================================================
|
|
AnimEntityDSGWrapper::AnimEntityDSGWrapper
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: AnimEntityDSGWrapper
|
|
|
|
=============================================================================
|
|
*/
|
|
AnimEntityDSGWrapper::AnimEntityDSGWrapper( void )
|
|
:
|
|
mpDrawable( 0 ),
|
|
mpPose( 0 ),
|
|
mpAnimController( 0 ),
|
|
mbVisible( true )
|
|
{
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimEntityDSGWrapper::~AnimEntityDSGWrapper
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: AnimEntityDSGWrapper
|
|
|
|
=============================================================================
|
|
*/
|
|
AnimEntityDSGWrapper::~AnimEntityDSGWrapper( void )
|
|
{
|
|
tRefCounted::Release( mpDrawable );
|
|
tRefCounted::Release( mpPose );
|
|
tRefCounted::Release( mpAnimController );
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimEntityDSGWrapper::UpdateVisibility
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AnimEntityDSGWrapper::UpdateVisibility( void )
|
|
{
|
|
// No physics here, so do nothing.
|
|
//
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimEntityDSGWrapper::SetDrawable
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( tCompositeDrawable* pDrawable )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AnimEntityDSGWrapper::SetDrawable( tCompositeDrawable* pDrawable )
|
|
{
|
|
tRefCounted::Assign( mpDrawable, pDrawable );
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimEntityDSGWrapper::SetPose
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( tPose* pPose )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AnimEntityDSGWrapper::SetPose( tPose* pPose )
|
|
{
|
|
tRefCounted::Assign( mpPose, pPose );
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimEntityDSGWrapper::SetAnimController
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( tMultiController* pAnimController )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AnimEntityDSGWrapper::SetAnimController( tMultiController* pAnimController )
|
|
{
|
|
tRefCounted::Assign( mpAnimController, pAnimController );
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimEntityDSGWrapper::SetTransform
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( rmt::Matrix& transform )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AnimEntityDSGWrapper::SetTransform( rmt::Matrix& transform )
|
|
{
|
|
mTransform = transform;
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimEntityDSGWrapper::GetAnimationDirection
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: float
|
|
|
|
=============================================================================
|
|
*/
|
|
float& AnimEntityDSGWrapper::GetAnimationDirection( void )
|
|
{
|
|
return mfDirection;
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimEntityDSGWrapper::SetAnimationDirection
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( float fDirection )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AnimEntityDSGWrapper::SetAnimationDirection( float fDirection )
|
|
{
|
|
mfDirection = fDirection;
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimEntityDSGWrapper::GetAnimController
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: tMultiController
|
|
|
|
=============================================================================
|
|
*/
|
|
tMultiController* AnimEntityDSGWrapper::GetAnimController( void ) const
|
|
{
|
|
// Why did I need to do this?
|
|
//
|
|
//mpAnimController->SetPose( mpPose );
|
|
return mpAnimController;
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
AnimEntityDSGWrapper::GetDrawable
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: tCompositeDrawable
|
|
|
|
=============================================================================
|
|
*/
|
|
tCompositeDrawable* AnimEntityDSGWrapper::GetDrawable( void ) const
|
|
{
|
|
return mpDrawable;
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimEntityDSGWrapper::Display
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AnimEntityDSGWrapper::Display( void )
|
|
{
|
|
if ( IsVisible() )
|
|
{
|
|
p3d::stack->PushMultiply( mTransform );
|
|
{
|
|
mpDrawable->SetPose( mpPose );
|
|
mpDrawable->Display();
|
|
}
|
|
p3d::stack->Pop( );
|
|
}
|
|
}
|
|
|
|
//==============================================================================
|
|
// ActionButtonHandler::ActionButtonHandler
|
|
//==============================================================================
|
|
// Description: Constructor.
|
|
//
|
|
// Parameters: None.
|
|
//
|
|
// Return: N/A.
|
|
//
|
|
//==============================================================================
|
|
ButtonHandler::ButtonHandler( void )
|
|
:
|
|
mActionButton( CharacterController::DoAction )
|
|
{
|
|
}
|
|
|
|
//==============================================================================
|
|
// ActionButtonHandler::~ActionButtonHandler
|
|
//==============================================================================
|
|
// Description: Destructor.
|
|
//
|
|
// Parameters: None.
|
|
//
|
|
// Return: N/A.
|
|
//
|
|
//==============================================================================
|
|
ButtonHandler::~ButtonHandler()
|
|
{
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
ButtonHandler::ButtonPressed
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: bool
|
|
|
|
=============================================================================
|
|
*/
|
|
bool ButtonHandler::ButtonPressed( Character* pCharacter )
|
|
{
|
|
if ( IsActionButtonPressed( pCharacter ) )
|
|
{
|
|
pCharacter->GetActionController()->Clear();
|
|
Sequencer* pSeq = pCharacter->GetActionController()->GetNextSequencer();
|
|
if ( OnButtonPressed( pCharacter, pSeq ) )
|
|
{
|
|
if ( UsesActionButton() )
|
|
{
|
|
// GetGuiSystem()->HandleMessage( GUI_MSG_HIDE_HUD_OVERLAY, HUD_ACTION_BUTTON );
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
/*
|
|
==============================================================================
|
|
ButtonHandler::Enter
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void ButtonHandler::Enter( Character* pCharacter )
|
|
{
|
|
OnEnter( pCharacter );
|
|
}
|
|
/*
|
|
==============================================================================
|
|
ButtonHandler::Exit
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void ButtonHandler::Exit( Character* pCharacter )
|
|
{
|
|
OnExit( pCharacter );
|
|
}
|
|
//******************************************************************************
|
|
//
|
|
// Protected Member Functions
|
|
//
|
|
//******************************************************************************
|
|
/*
|
|
==============================================================================
|
|
ButtonHandler::IsActionButtonPressed
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: bool
|
|
|
|
=============================================================================
|
|
*/
|
|
bool ButtonHandler::IsActionButtonPressed( Character* pCharacter )
|
|
{
|
|
CharacterController::eIntention theIntention = pCharacter->GetController()->GetIntention();
|
|
return ( theIntention == mActionButton );
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
PropHandler::PropHandler
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: PropHandler
|
|
|
|
=============================================================================
|
|
*/
|
|
PropHandler::PropHandler( void )
|
|
:
|
|
mpProp( 0 )
|
|
{
|
|
}
|
|
/*
|
|
==============================================================================
|
|
PropHandler::~PropHandler
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: PropHandler
|
|
|
|
=============================================================================
|
|
*/
|
|
PropHandler::~PropHandler( void )
|
|
{
|
|
tRefCounted::Release( mpProp );
|
|
}
|
|
/*
|
|
==============================================================================
|
|
PropHandler::SetProp
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( InstDynaPhysDSG* pProp )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void PropHandler::SetProp( InstDynaPhysDSG* pProp )
|
|
{
|
|
tRefCounted::Assign( mpProp, pProp );
|
|
}
|
|
/*
|
|
==============================================================================
|
|
PropHandler::GetProp
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: InstDynaPhysDSG
|
|
|
|
=============================================================================
|
|
*/
|
|
InstDynaPhysDSG* PropHandler::GetProp( void ) const
|
|
{
|
|
return mpProp;
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AttachProp::OnButtonPressed
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter, Sequencer* pSeq )
|
|
|
|
Return: bool
|
|
|
|
=============================================================================
|
|
*/
|
|
bool AttachProp::OnButtonPressed( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
rAssert( GetProp( ) != 0 );
|
|
pCharacter->AttachProp( GetProp( ) );
|
|
return true;
|
|
}
|
|
/*
|
|
==============================================================================
|
|
EnterInterior::EnterInterior
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: EnterInterior
|
|
|
|
=============================================================================
|
|
*/
|
|
EnterInterior::EnterInterior( InteriorEntranceLocator* pLocator )
|
|
:
|
|
mpLocator( 0 )
|
|
{
|
|
SetLocator (pLocator);
|
|
}
|
|
/*
|
|
==============================================================================
|
|
EnterInterior::~EnterInterior
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ()
|
|
|
|
Return: EnterInterior
|
|
|
|
=============================================================================
|
|
*/
|
|
EnterInterior::~EnterInterior()
|
|
{
|
|
}
|
|
|
|
|
|
void EnterInterior::SetLocator ( InteriorEntranceLocator* pLocator )
|
|
{
|
|
mpLocator = pLocator;
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
EnterInterior::OnButtonPressed
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
bool EnterInterior::OnButtonPressed( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
if(GetGameFlow()->GetNextContext() != CONTEXT_PAUSE)
|
|
{
|
|
GetInteriorManager()->Enter(mpLocator, pCharacter, pSeq);
|
|
}
|
|
return true;
|
|
}
|
|
/*
|
|
==============================================================================
|
|
GetInCar::GetInCar
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: GetInCar
|
|
|
|
=============================================================================
|
|
*/
|
|
GetInCar::GetInCar( EventLocator* pEventLocator )
|
|
:
|
|
mpEventLocator( 0 ),
|
|
mCharacter( NULL )
|
|
{
|
|
SetEventLocator( pEventLocator );
|
|
}
|
|
/*
|
|
==============================================================================
|
|
GetInCar::~GetInCar
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ()
|
|
|
|
Return: GetInCar
|
|
|
|
=============================================================================
|
|
*/
|
|
GetInCar::~GetInCar()
|
|
{
|
|
if ( mpEventLocator )
|
|
{
|
|
mpEventLocator->Release( );
|
|
mpEventLocator = 0;
|
|
}
|
|
|
|
if ( mCharacter )
|
|
{
|
|
mCharacter->Release();
|
|
mCharacter = NULL;
|
|
}
|
|
}
|
|
/*
|
|
==============================================================================
|
|
GetInCar::SetEventLocator
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( EventLocator* pEventLocator )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void GetInCar::SetEventLocator( EventLocator* pEventLocator )
|
|
{
|
|
tRefCounted::Assign( mpEventLocator, pEventLocator );
|
|
}
|
|
/*
|
|
==============================================================================
|
|
GetInCar::OnButtonPressed
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
bool GetInCar::OnButtonPressed( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
CharacterController::eIntention theIntention = pCharacter->GetController()->GetIntention();
|
|
|
|
Vehicle* pVehicle = GetVehicleCentral()->GetVehicle( mVehicleId );
|
|
rAssert( pVehicle );
|
|
|
|
tRefCounted::Assign( mCharacter, pCharacter );
|
|
|
|
//
|
|
// Trigger an event for tutorial mode
|
|
//
|
|
pCharacter->SetTargetVehicle( pVehicle );
|
|
|
|
rAssertMsg( pVehicle->mVehicleType != VT_AI,
|
|
"Trying to get into AI car?? Don't! We shouldn't have even allowed "
|
|
"reaching this point!" );
|
|
|
|
if( pVehicle->mVehicleType == VT_TRAFFIC)
|
|
{
|
|
GetEventManager()->TriggerEvent( EVENT_ENTERING_TRAFFIC_CAR, (void*)pVehicle );
|
|
}
|
|
else
|
|
{
|
|
GetEventManager()->TriggerEvent( EVENT_ENTERING_PLAYER_CAR, (void*)pVehicle );
|
|
}
|
|
|
|
pCharacter->GetStateManager()->SetState<CharacterAi::GetIn>();
|
|
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
ActionEventHandler::ActionEventHandler
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( ActionEventLocator* pActionEventLocator )
|
|
|
|
Return: ActionEventHandler
|
|
|
|
=============================================================================
|
|
*/
|
|
ActionEventHandler::ActionEventHandler( ActionEventLocator* pActionEventLocator )
|
|
:
|
|
mpActionEventLocator( 0 ),
|
|
mIsEnabled( true )
|
|
{
|
|
SetActionEventLocator( pActionEventLocator );
|
|
}
|
|
/*
|
|
==============================================================================
|
|
ActionEventHandler::~ActionEventHandler
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: ActionEventHandler
|
|
|
|
=============================================================================
|
|
*/
|
|
ActionEventHandler::~ActionEventHandler( void )
|
|
{
|
|
tRefCounted::Release( mpActionEventLocator );
|
|
mpActionEventLocator = 0;
|
|
}
|
|
#ifdef ACTIONEVENTHANDLER_DEBUG
|
|
void ActionEventHandler::Enter( Character* pCharacter )
|
|
{
|
|
if ( mpActionEventLocator )
|
|
{
|
|
rReleasePrintf( "Object:\t%s\nJoint:\t%s\nAction:\t%s\nButton:\t%s\nShouldTransform:\t%d\n",
|
|
mpActionEventLocator->GetObjName(),
|
|
mpActionEventLocator->GetJointName(),
|
|
mpActionEventLocator->GetActionName(),
|
|
ButtonName[ mpActionEventLocator->GetButtonInput() ],
|
|
mpActionEventLocator->GetShouldTransform() ? 1 : 0 );
|
|
}
|
|
ButtonHandler::Enter( pCharacter );
|
|
}
|
|
#endif //ACTIONEVENTHANDLER_DEBUG
|
|
/*
|
|
==============================================================================
|
|
ActionEventHandler::SetActionEventLocator
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( ActionEventLocator* pActionEventLocator )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void ActionEventHandler::SetActionEventLocator( ActionEventLocator* pActionEventLocator )
|
|
{
|
|
tRefCounted::Assign( mpActionEventLocator, pActionEventLocator );
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimSwitch::AnimSwitch
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( ActionEventLocator* pActionEventLocator )
|
|
|
|
Return: AnimSwitch
|
|
|
|
=============================================================================
|
|
*/
|
|
AnimSwitch::AnimSwitch( ActionEventLocator* pActionEventLocator )
|
|
:
|
|
ActionEventHandler( pActionEventLocator ),
|
|
mpJoint( 0 ),
|
|
mpGameObject( 0 ),
|
|
mbAttachToJoint( false )
|
|
{
|
|
unsigned int i;
|
|
const char* objName = pActionEventLocator->GetObjName();
|
|
radKey32 objNameKey;
|
|
|
|
mSoundName = NULL;
|
|
|
|
if( objName != NULL )
|
|
{
|
|
//
|
|
// Trapdoor hack! This is ugly, but not quite as ugly as listing
|
|
// each trapdoor separately in the table, I think.
|
|
//
|
|
if( ( objName[0] == 'T' ) && ( objName[1] == 'D' ) )
|
|
{
|
|
mSoundName = ANIM_SWITCH_SOUND_TABLE[0].soundName;
|
|
mIsMovingSound = ANIM_SWITCH_SOUND_TABLE[0].isMovingSound;
|
|
mSettingsName = ANIM_SWITCH_SOUND_TABLE[0].positionalSettings;
|
|
}
|
|
else
|
|
{
|
|
objNameKey = ::radMakeKey32( objName );
|
|
|
|
//
|
|
// Set the sound key
|
|
//
|
|
for( i = 0; i < ANIM_SWITCH_SOUND_TABLE_SIZE; i++ )
|
|
{
|
|
if( objNameKey == ANIM_SWITCH_SOUND_TABLE[i].objKey )
|
|
{
|
|
mSoundName = ANIM_SWITCH_SOUND_TABLE[i].soundName;
|
|
mIsMovingSound = ANIM_SWITCH_SOUND_TABLE[i].isMovingSound;
|
|
mSettingsName = ANIM_SWITCH_SOUND_TABLE[i].positionalSettings;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimSwitch::~AnimSwitch
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: AnimSwitch
|
|
|
|
=============================================================================
|
|
*/
|
|
AnimSwitch::~AnimSwitch( void )
|
|
{
|
|
mpJoint = 0;
|
|
tRefCounted::Release( mpGameObject );
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
AnimSwitch::Create
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: bool
|
|
|
|
=============================================================================
|
|
*/
|
|
bool AnimSwitch::Create( tEntityStore* inStore )
|
|
{
|
|
AnimCollisionEntityDSG* pAnimCollisionEntityDSG = p3d::find<AnimCollisionEntityDSG>( inStore, mpActionEventLocator->GetObjName() );
|
|
bool bCreated = false;
|
|
if ( pAnimCollisionEntityDSG )
|
|
{
|
|
tPose* p3dPose = pAnimCollisionEntityDSG->GetPoseEngine()->GetP3DPose( );
|
|
rAssert( p3dPose );
|
|
|
|
// Evaluate the pose to get the proper worldmatrix for the joints.
|
|
//
|
|
p3dPose->Evaluate();
|
|
int jointIndex = p3dPose->FindJointIndex( mpActionEventLocator->GetJointName() );
|
|
|
|
tPose::Joint* pJoint = pAnimCollisionEntityDSG->GetPoseJoint( jointIndex, mpActionEventLocator->GetShouldTransform() );
|
|
|
|
ActionButton::AnimCollisionEntityDSGWrapper* pGameObject = new(GMA_LEVEL_OTHER) ActionButton::AnimCollisionEntityDSGWrapper;
|
|
pGameObject->SetGameObject( pAnimCollisionEntityDSG );
|
|
// Set the start state of all animations requiring a trigger to off.
|
|
//
|
|
// This will stop the animation until Action executes.
|
|
//
|
|
pGameObject->SetAnimationDirection( 0.0f );
|
|
// Reset the animation to the initial frame.
|
|
//
|
|
pGameObject->GetAnimController( )->SetFrame( 0.0f );
|
|
|
|
// The AnimCollisionEntityDSG must store a pointer to the action handler
|
|
// so it can callback when it is dumped by the dynaloader.
|
|
//
|
|
// TBJ [8/14/2002]
|
|
//
|
|
pAnimCollisionEntityDSG->SetAction( this );
|
|
Init( pGameObject, pJoint, mpActionEventLocator->GetShouldTransform() );
|
|
bCreated = true;
|
|
}
|
|
return bCreated;
|
|
}
|
|
//=============================================================================
|
|
// AnimSwitch::OnReset
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( void )
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void AnimSwitch::OnReset( void )
|
|
{
|
|
// Set the start state of all animations requiring a trigger to off.
|
|
//
|
|
// This will stop the animation until Action executes.
|
|
//
|
|
mpGameObject->SetAnimationDirection( 0.0f );
|
|
// Reset the animation to the initial frame.
|
|
//
|
|
mpGameObject->GetAnimController( )->SetFrame( 0.0f );
|
|
mpGameObject->GetAnimController( )->Advance( 0.0f );
|
|
mpGameObject->UpdateVisibility( );
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimSwitch::Init
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( AnimCollisionEntityDSG* pAnimCollisionEntityDSG, tPose::Joint* pJoint, bool bAttachToJoint )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AnimSwitch::Init( IGameObjectWrapper* pGameObject, tPose::Joint* pJoint, bool bAttachToJoint )
|
|
{
|
|
mbAttachToJoint = bAttachToJoint;
|
|
mpJoint = pJoint;
|
|
rAssert( mpJoint );
|
|
|
|
tRefCounted::Assign( mpGameObject, pGameObject );
|
|
|
|
ActionEventLocator* pActionEventLocator = GetActionEventLocator();
|
|
rAssert( pActionEventLocator );
|
|
pActionEventLocator->GetLocation( &mStandPosition );
|
|
if ( mbAttachToJoint )
|
|
{
|
|
// If attach to joint, then transform the eventlocator into
|
|
// the object local space. Store it in mStandPosition.
|
|
// Then we will transform mStandPosition back to
|
|
// world space when we need the position.
|
|
//
|
|
rmt::Matrix invMat = mpJoint->worldMatrix;
|
|
invMat.InvertOrtho( );
|
|
mStandPosition.Transform( invMat );
|
|
}
|
|
OnInit( );
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimSwitch::GetAnimationDirection
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: float
|
|
|
|
=============================================================================
|
|
*/
|
|
float& AnimSwitch::GetAnimationDirection( void )
|
|
{
|
|
return mpGameObject->GetAnimationDirection();
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimSwitch::SetAnimationDirection
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( float fDirection )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AnimSwitch::SetAnimationDirection( float fDirection )
|
|
{
|
|
mpGameObject->SetAnimationDirection( fDirection );
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimSwitch::GetAnimController
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: tMultiController
|
|
|
|
=============================================================================
|
|
*/
|
|
tMultiController* AnimSwitch::GetAnimController( void ) const
|
|
{
|
|
return mpGameObject->GetAnimController();
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimSwitch::Update
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( float timeins )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AnimSwitch::Update( float timeins )
|
|
{
|
|
if ( mbAttachToJoint )
|
|
{
|
|
rAssert( mpJoint );
|
|
ActionEventLocator* pActionEventLocator = GetActionEventLocator( );
|
|
rAssert( pActionEventLocator );
|
|
|
|
rmt::Vector pos = mpJoint->worldMatrix.Row( 3 );
|
|
|
|
pActionEventLocator->GetTriggerVolume( 0 )->SetPosition( pos );
|
|
}
|
|
OnUpdate( timeins );
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimSwitch::ReleaseGameObject
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AnimSwitch::Destroy( void )
|
|
{
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimSwitch::ButtonPressed
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
bool AnimSwitch::ButtonPressed( Character* pCharacter )
|
|
{
|
|
CharacterController::eIntention theIntention = pCharacter->GetController()->GetIntention();
|
|
|
|
if ( IsActionButtonPressed( pCharacter ) )
|
|
{
|
|
pCharacter->GetActionController()->Clear();
|
|
Sequencer* pSeq = pCharacter->GetActionController()->GetNextSequencer();
|
|
if ( OnButtonPressed( pCharacter, pSeq ) )
|
|
{
|
|
PositionCharacter( pCharacter, pSeq );
|
|
SetAnimation( pCharacter, pSeq );
|
|
|
|
if ( UsesActionButton() )
|
|
{
|
|
// GetGuiSystem()->HandleMessage( GUI_MSG_HIDE_HUD_OVERLAY, HUD_ACTION_BUTTON );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
AnimSwitch::PositionCharacter
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AnimSwitch::PositionCharacter( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
|
|
rmt::Vector standPosition = mStandPosition;
|
|
if ( mbAttachToJoint )
|
|
{
|
|
// If attach to joint, then the locator has been transformed into
|
|
// object local space. Here we need to transform the point back
|
|
// into world space, but maintain the object local space of the locator,
|
|
// so we transform a copy of the position.
|
|
//
|
|
rmt::Matrix mat = mpJoint->worldMatrix;
|
|
standPosition.Transform( mat );
|
|
}
|
|
|
|
Action* pAction = 0;
|
|
|
|
// Orient.
|
|
//
|
|
rAssert( mpJoint );
|
|
|
|
rmt::Vector direction = GetActionEventLocator()->GetMatrix().Row(2);
|
|
|
|
// If direction != 0, 0, 0, then rotate us to align with direction.
|
|
//
|
|
if ( direction.NormalizeSafe( ) )
|
|
{
|
|
pSeq->BeginSequence();
|
|
pAction = new Orient( pCharacter, direction );
|
|
pSeq->AddAction( pAction );
|
|
// SlaveLoco
|
|
//
|
|
pAction = 0;
|
|
|
|
pAction = pCharacter->GetWalkerLocomotionAction();
|
|
|
|
pSeq->AddAction( pAction );
|
|
pSeq->EndSequence( );
|
|
}
|
|
|
|
// Play run_into_object.
|
|
//
|
|
pSeq->BeginSequence();
|
|
pAction = new Position( pCharacter, standPosition, 0.1f );
|
|
pSeq->AddAction( pAction );
|
|
pSeq->EndSequence( );
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AnimSwitch::SequenceActions
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter, Sequencer* pSeq )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AnimSwitch::SequenceActions( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
AnimSwitch::SetAnimation
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter, Sequencer* pSeq )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AnimSwitch::SetAnimation( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
Action* pAction = 0;
|
|
pAction = new PlayAnimationAction( pCharacter, "hit_switch_quick" );
|
|
pSeq->AddActionToSequence( pAction );
|
|
Action* eventAction = new TriggerEventAction( EVENT_BIG_RED_SWITCH_PRESSED, (void*)0 );
|
|
pSeq->AddActionToSequence( 0.3f, -1.0f, eventAction );
|
|
}
|
|
/*
|
|
==============================================================================
|
|
ToggleAnim::ToggleAnim
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: ToggleAnim
|
|
|
|
=============================================================================
|
|
*/
|
|
ToggleAnim::ToggleAnim( ActionEventLocator* pActionEventLocator )
|
|
:
|
|
AnimSwitch( pActionEventLocator )
|
|
{
|
|
}
|
|
/*
|
|
==============================================================================
|
|
ToggleAnim::~ToggleAnim
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ()
|
|
|
|
Return: ToggleAnim
|
|
|
|
=============================================================================
|
|
*/
|
|
ToggleAnim::~ToggleAnim()
|
|
{
|
|
//
|
|
// Make good and sure this thing isn't going to play sound anymore
|
|
//
|
|
GetEventManager()->TriggerEvent( EVENT_STOP_ANIMATION_SOUND, this );
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
ToggleAnim::OnButtonPressed
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter, Sequencer* pSeq )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
bool ToggleAnim::OnButtonPressed( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
Action* pAction = 0;
|
|
float fDirection = 0.0f;
|
|
if ( GetAnimationDirection( ) != 0.0f )
|
|
{
|
|
fDirection = 0.0f;
|
|
}
|
|
else
|
|
{
|
|
fDirection = 1.0f;
|
|
}
|
|
tMultiController* pAnimController = GetAnimController( );
|
|
pAnimController->SetCycleMode( FORCE_CYCLIC );
|
|
|
|
pSeq->BeginSequence();
|
|
pAction = new AssignValueToFloat( GetAnimationDirection(), fDirection );
|
|
pSeq->AddAction( pAction );
|
|
pSeq->EndSequence( );
|
|
|
|
if( mSoundName != NULL )
|
|
{
|
|
if( fDirection == 0.0f )
|
|
{
|
|
GetEventManager()->TriggerEvent( EVENT_STOP_ANIMATION_SOUND, this );
|
|
}
|
|
else
|
|
{
|
|
AnimSoundData data( mSoundName, mSettingsName );
|
|
|
|
if( mIsMovingSound )
|
|
{
|
|
tPoseAnimationController* controller;
|
|
tPose::Joint theJoint;
|
|
|
|
//
|
|
// Platform. Yank the joint out of the animation stuff so that the
|
|
// moving sound code can calculate a position for it.
|
|
//
|
|
rAssert( dynamic_cast<tPoseAnimationController*>( pAnimController->GetTrack( 0 ) ) );
|
|
controller = static_cast<tPoseAnimationController*>( pAnimController->GetTrack( 0 ) );
|
|
|
|
rAssert( controller->GetPose()->GetNumJoint() >= 2 );
|
|
data.animJoint = controller->GetPose()->GetJoint( 1 );
|
|
|
|
data.soundObject = this;
|
|
}
|
|
|
|
GetEventManager()->TriggerEvent( EVENT_START_ANIMATION_SOUND, &data );
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
ReverseAnim::OnButtonPressed
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter, Sequencer* pSeq )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
bool ReverseAnim::OnButtonPressed( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
Action* pAction = 0;
|
|
float fDirection = 0.0f;
|
|
if ( GetAnimationDirection( ) == 1.0f )
|
|
{
|
|
fDirection = -1.0f;
|
|
}
|
|
else
|
|
{
|
|
fDirection = 1.0f;
|
|
}
|
|
tMultiController* pAnimController = GetAnimController( );
|
|
pAnimController->SetCycleMode( FORCE_CYCLIC );
|
|
|
|
pSeq->BeginSequence();
|
|
pAction = new AssignValueToFloat( GetAnimationDirection( ), fDirection );
|
|
pSeq->AddAction( pAction );
|
|
pSeq->EndSequence( );
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
PlayAnim::PlayAnim
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: ToggleAnim
|
|
|
|
=============================================================================
|
|
*/
|
|
PlayAnim::PlayAnim( ActionEventLocator* pActionEventLocator )
|
|
:
|
|
AnimSwitch( pActionEventLocator )
|
|
{
|
|
}
|
|
/*
|
|
==============================================================================
|
|
PlayAnim::~PlayAnim
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ()
|
|
|
|
Return: PlayAnim
|
|
|
|
=============================================================================
|
|
*/
|
|
PlayAnim::~PlayAnim()
|
|
{
|
|
//
|
|
// Make good and sure this thing isn't going to play sound anymore
|
|
//
|
|
GetEventManager()->TriggerEvent( EVENT_STOP_ANIMATION_SOUND, this );
|
|
}
|
|
|
|
|
|
/*
|
|
==============================================================================
|
|
PlayAnim::OnButtonPressed
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter, Sequencer* pSeq )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
bool PlayAnim::OnButtonPressed( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
tMultiController* pAnimController = GetAnimController( );
|
|
bool bRestart = true;
|
|
// If the animation has already been triggered.
|
|
//
|
|
if ( GetAnimationDirection( ) == 1.0f )
|
|
{
|
|
// Test to see if the animation has finished.
|
|
//
|
|
if ( !pAnimController->LastFrameReached() )
|
|
{
|
|
// Don't perform the action.
|
|
//
|
|
bRestart = false;
|
|
}
|
|
}
|
|
if ( bRestart )
|
|
{
|
|
// This will stop the animation until Action executes.
|
|
//
|
|
SetAnimationDirection( 0.0f );
|
|
// Reset the animation to the initial frame.
|
|
// This assumes that the animation first frame is equal to last frame.
|
|
//
|
|
pAnimController->SetFrame( 0.0f );
|
|
|
|
// Force the animation to be NOT cyclic.
|
|
//
|
|
pAnimController->SetCycleMode( FORCE_NON_CYCLIC );
|
|
|
|
|
|
// Action will assign this value which will start the animation.
|
|
//
|
|
Action* pAction = 0;
|
|
float fDirection = 1.0f;
|
|
pSeq->BeginSequence();
|
|
pAction = new AssignValueToFloat( GetAnimationDirection( ), fDirection );
|
|
pSeq->AddAction( pAction );
|
|
pSeq->EndSequence( );
|
|
|
|
if( mSoundName != NULL )
|
|
{
|
|
AnimSoundData data( mSoundName, mSettingsName );
|
|
|
|
if( mIsMovingSound )
|
|
{
|
|
tPoseAnimationController* controller;
|
|
tPose::Joint theJoint;
|
|
|
|
//
|
|
// Platform. Yank the joint out of the animation stuff so that the
|
|
// moving sound code can calculate a position for it.
|
|
//
|
|
rAssert( dynamic_cast<tPoseAnimationController*>( pAnimController->GetTrack( 0 ) ) );
|
|
controller = static_cast<tPoseAnimationController*>( pAnimController->GetTrack( 0 ) );
|
|
|
|
data.animJoint = controller->GetPose()->GetJoint( 4 );
|
|
|
|
data.soundObject = this;
|
|
}
|
|
|
|
GetEventManager()->TriggerEvent( EVENT_START_ANIMATION_SOUND, &data );
|
|
}
|
|
}
|
|
return bRestart;
|
|
}
|
|
/*
|
|
==============================================================================
|
|
PlayAnimLoop::PlayAnimLoop
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: ToggleAnim
|
|
|
|
=============================================================================
|
|
*/
|
|
PlayAnimLoop::PlayAnimLoop( ActionEventLocator* pActionEventLocator )
|
|
:
|
|
AnimSwitch( pActionEventLocator )
|
|
{
|
|
}
|
|
/*
|
|
==============================================================================
|
|
PlayAnimLoop::~PlayAnimLoop
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ()
|
|
|
|
Return: PlayAnimLoop
|
|
|
|
=============================================================================
|
|
*/
|
|
PlayAnimLoop::~PlayAnimLoop()
|
|
{
|
|
}
|
|
|
|
|
|
/*
|
|
==============================================================================
|
|
PlayAnimLoop::OnButtonPressed
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter, Sequencer* pSeq )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
bool PlayAnimLoop::OnButtonPressed( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
// Only do this once.
|
|
//
|
|
if ( GetAnimationDirection( ) == 0.0f )
|
|
{
|
|
|
|
// Force the animation to be cyclic.
|
|
//
|
|
tMultiController* pAnimController = GetAnimController( );
|
|
pAnimController->SetCycleMode( FORCE_CYCLIC );
|
|
|
|
// Action will assign this value which will start the animation.
|
|
//
|
|
Action* pAction = 0;
|
|
float fDirection = 1.0f;
|
|
pSeq->BeginSequence();
|
|
pAction = new AssignValueToFloat( GetAnimationDirection( ), fDirection );
|
|
pSeq->AddAction( pAction );
|
|
pSeq->EndSequence( );
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
AutoPlayAnim::AutoPlayAnim
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: ToggleAnim
|
|
|
|
=============================================================================
|
|
*/
|
|
AutoPlayAnim::AutoPlayAnim( ActionEventLocator* pActionEventLocator )
|
|
:
|
|
AnimSwitch( pActionEventLocator ),
|
|
mCharacterCount( 0 ),
|
|
mbJustEmpty( false )
|
|
{
|
|
SetActionButton( CharacterController::NONE );
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AutoPlayAnim::~AutoPlayAnim
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ()
|
|
|
|
Return: AutoPlayAnim
|
|
|
|
=============================================================================
|
|
*/
|
|
AutoPlayAnim::~AutoPlayAnim()
|
|
{
|
|
//
|
|
// Make good and sure this thing isn't going to play sound anymore
|
|
//
|
|
GetEventManager()->TriggerEvent( EVENT_STOP_ANIMATION_SOUND, this );
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
AutoPlayAnim::IsActionButtonPressed
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: bool
|
|
|
|
=============================================================================
|
|
*/
|
|
bool AutoPlayAnim::IsActionButtonPressed( Character* pCharacter )
|
|
{
|
|
// These are auto volumes. No buttons.
|
|
//
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
AutoPlayAnim::IsActionButtonPressed
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: bool
|
|
|
|
=============================================================================
|
|
*/
|
|
bool AutoPlayAnim::OnButtonPressed( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
return false;
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AutoPlayAnim::OnEnter
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AutoPlayAnim::OnEnter( Character* pCharacter )
|
|
{
|
|
if ( mCharacterCount == 0 )
|
|
{
|
|
tMultiController* pAnimController = GetAnimController( );
|
|
// First person in the volume.
|
|
//
|
|
// Reset the animation to the initial frame.
|
|
// This assumes that the animation first frame is equal to last frame.
|
|
//
|
|
pAnimController->SetFrame( 0.0f );
|
|
|
|
// This will start the animation.
|
|
//
|
|
SetAnimationDirection( 1.0f );
|
|
|
|
// Force the animation to be cyclic dependent on the class type.
|
|
// GetIsCyclic is virtual.
|
|
//
|
|
pAnimController->SetCycleMode( GetIsCyclic() ? FORCE_CYCLIC : FORCE_NON_CYCLIC );
|
|
|
|
if( mSoundName != NULL )
|
|
{
|
|
AnimSoundData data( mSoundName, mSettingsName );
|
|
|
|
if( mIsMovingSound )
|
|
{
|
|
tPoseAnimationController* controller;
|
|
tPose::Joint theJoint;
|
|
|
|
//
|
|
// Platform. Yank the joint out of the animation stuff so that the
|
|
// moving sound code can calculate a position for it.
|
|
//
|
|
rAssert( dynamic_cast<tPoseAnimationController*>( pAnimController->GetTrack( 0 ) ) );
|
|
controller = static_cast<tPoseAnimationController*>( pAnimController->GetTrack( 0 ) );
|
|
|
|
rAssert( controller->GetPose()->GetNumJoint() >= 2 );
|
|
data.animJoint = controller->GetPose()->GetJoint( 1 );
|
|
|
|
data.soundObject = this;
|
|
}
|
|
|
|
GetEventManager()->TriggerEvent( EVENT_START_ANIMATION_SOUND, &data );
|
|
}
|
|
}
|
|
mCharacterCount++;
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AutoPlayAnim::OnUpdate
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( float timeins )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AutoPlayAnim::OnUpdate( float timeins )
|
|
{
|
|
if ( mbJustEmpty )
|
|
{
|
|
// Test to see if the animation has finished.
|
|
//
|
|
tMultiController* pAnimController = GetAnimController( );
|
|
if ( pAnimController->LastFrameReached() )
|
|
{
|
|
mbJustEmpty = false;
|
|
// The animation is finished. Reactivate the trigger volume.
|
|
//
|
|
mpActionEventLocator->SetFlag( Locator::ACTIVE, true );
|
|
|
|
GetEventManager()->TriggerEvent( EVENT_STOP_ANIMATION_SOUND, this );
|
|
}
|
|
}
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AutoPlayAnim::OnExit
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AutoPlayAnim::OnExit( Character* pCharacter )
|
|
{
|
|
mCharacterCount--;
|
|
if ( mCharacterCount == 0 )
|
|
{
|
|
tMultiController* pAnimController = GetAnimController( );
|
|
|
|
// Force the animation to be NOT cyclic.
|
|
//
|
|
pAnimController->SetCycleMode( FORCE_NON_CYCLIC );
|
|
|
|
mbJustEmpty = true;
|
|
|
|
// Deactivate the trigger volume. Give the animation a chance to finish.
|
|
//
|
|
mpActionEventLocator->SetFlag( Locator::ACTIVE, false );
|
|
}
|
|
rAssert( mCharacterCount >= 0 );
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
AutoPlayAnim::PositionCharacter
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AutoPlayAnim::PositionCharacter( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AutoPlayAnim::SetAnimation
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AutoPlayAnim::SetAnimation( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AutoPlayAnimLoop::AutoPlayAnimLoop
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: ToggleAnim
|
|
|
|
=============================================================================
|
|
*/
|
|
AutoPlayAnimLoop::AutoPlayAnimLoop( ActionEventLocator* pActionEventLocator )
|
|
:
|
|
AutoPlayAnim( pActionEventLocator )
|
|
{
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AutoPlayAnimLoop::~AutoPlayAnimLoop
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ()
|
|
|
|
Return: AutoPlayAnimLoop
|
|
|
|
=============================================================================
|
|
*/
|
|
AutoPlayAnimLoop::~AutoPlayAnimLoop()
|
|
{
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
AutoPlayAnimInOut::AutoPlayAnimInOut
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: ToggleAnim
|
|
|
|
=============================================================================
|
|
*/
|
|
AutoPlayAnimInOut::AutoPlayAnimInOut( ActionEventLocator* pActionEventLocator )
|
|
:
|
|
AutoPlayAnim( pActionEventLocator )
|
|
{
|
|
}
|
|
/*
|
|
==============================================================================
|
|
AutoPlayAnimInOut::~AutoPlayAnimInOut
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ()
|
|
|
|
Return: AutoPlayAnimInOut
|
|
|
|
=============================================================================
|
|
*/
|
|
AutoPlayAnimInOut::~AutoPlayAnimInOut()
|
|
{
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
AutoPlayAnimInOut::IsActionButtonPressed
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: bool
|
|
|
|
=============================================================================
|
|
*/
|
|
bool AutoPlayAnimInOut::IsActionButtonPressed( Character* pCharacter )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
AutoPlayAnimInOut::IsActionButtonPressed
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: bool
|
|
|
|
=============================================================================
|
|
*/
|
|
bool AutoPlayAnimInOut::OnButtonPressed( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
AutoPlayAnimInOut::OnUpdate
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( float timeins )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AutoPlayAnimInOut::OnUpdate( float timeins )
|
|
{
|
|
if ( mbJustEmpty )
|
|
{
|
|
// Test to see if the animation has finished.
|
|
//
|
|
tMultiController* pAnimController = GetAnimController( );
|
|
if ( pAnimController->LastFrameReached() )
|
|
{
|
|
// This will reverse the animation.
|
|
//
|
|
SetAnimationDirection( -1.0f );
|
|
|
|
|
|
}
|
|
else if ( pAnimController->GetFrame() == 0.0f )
|
|
{
|
|
// We have played back to the start.
|
|
//
|
|
|
|
mbJustEmpty = false;
|
|
// The animation is finished. Reactivate the trigger volume.
|
|
//
|
|
mpActionEventLocator->SetFlag( Locator::ACTIVE, true );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
AutoPlayAnimInOut::OnExit
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void AutoPlayAnimInOut::OnExit( Character* pCharacter )
|
|
{
|
|
mCharacterCount--;
|
|
if ( mCharacterCount == 0 )
|
|
{
|
|
mbJustEmpty = true;
|
|
// Deactivate the trigger volume. Give the animation a chance to finish.
|
|
//
|
|
mpActionEventLocator->SetFlag( Locator::ACTIVE, false );
|
|
}
|
|
rAssert( mCharacterCount >= 0 );
|
|
}
|
|
/*
|
|
==============================================================================
|
|
DestroyObject::DestroyObject
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: ToggleAnim
|
|
|
|
=============================================================================
|
|
*/
|
|
DestroyObject::DestroyObject( ActionEventLocator* pActionEventLocator )
|
|
:
|
|
AnimSwitch( pActionEventLocator ),
|
|
mbDestroyed( false ),
|
|
mpStatePropDSG( NULL )
|
|
{
|
|
}
|
|
/*
|
|
==============================================================================
|
|
DestroyObject::~DestroyObject
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ()
|
|
|
|
Return: DestroyObject
|
|
|
|
=============================================================================
|
|
*/
|
|
DestroyObject::~DestroyObject()
|
|
{
|
|
if ( mpStatePropDSG != NULL )
|
|
{
|
|
mpStatePropDSG->RemoveStatePropListener( this );
|
|
}
|
|
}
|
|
|
|
bool
|
|
DestroyObject::Create( tEntityStore* inStore )
|
|
{
|
|
bool success;
|
|
// Try and find the corresponding InstAnimDynaPhysDSG object in the inventory.
|
|
// InstAnimDynaPhysDSG* pDSG = p3d::find< InstAnimDynaPhysDSG > ( inStore, mpActionEventLocator->GetObjName() );
|
|
StatePropDSG* pDSG = p3d::find< StatePropDSG >( inStore, mpActionEventLocator->GetObjName() );
|
|
|
|
if ( pDSG != NULL )
|
|
{
|
|
mpStatePropDSG = pDSG;
|
|
mpStatePropDSG->AddStatePropListener( this );
|
|
mpStatePropDSG->SetState(0);
|
|
|
|
SetInstanceEnabled( false );
|
|
|
|
success = true;
|
|
}
|
|
else
|
|
{
|
|
rTuneWarning("ERROR : DestroyObject::Create() could not find DSG object in inventory");
|
|
success = false;
|
|
}
|
|
|
|
return success;
|
|
}
|
|
bool
|
|
DestroyObject::NeedsUpdate( void ) const
|
|
{
|
|
// Plain destroy objects need no per-frame updating
|
|
return false;
|
|
}
|
|
|
|
void DestroyObject::Enter( Character* pCharacter )
|
|
{
|
|
// don't let the action handler get registered of object is destroyed
|
|
// TODO : should really save processing by removing trigger from trigger volume tracker
|
|
if(!mbDestroyed)
|
|
{
|
|
AnimSwitch::Enter(pCharacter);
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
// DestroyObject::OnReset
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( void )
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void DestroyObject::OnReset( void )
|
|
{
|
|
// We want to respawn the stateprops and reset their state.
|
|
// So even if the user stomped and kicked them out of existance before the
|
|
// mission started, they would have magically respawned.
|
|
|
|
if ( mpStatePropDSG != NULL )
|
|
{
|
|
mpStatePropDSG->SetState( 0 );
|
|
mpStatePropDSG->EnableCollisionVolume( true );
|
|
}
|
|
mbDestroyed = false;
|
|
}
|
|
/*
|
|
==============================================================================
|
|
DestroyObject::OnButtonPressed==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter, Sequencer* pSeq )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
bool DestroyObject::OnButtonPressed( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
// Button press
|
|
// Destroy the object immediately
|
|
// Play a particle effect
|
|
// Then remove it from the DSG
|
|
if ( mpStatePropDSG != NULL )
|
|
{
|
|
pCharacter->Kick();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
DestroyObject::PositionCharacter
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void DestroyObject::PositionCharacter( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
|
|
if ( mbAttachToJoint )
|
|
{
|
|
ActionEventLocator* pActionEventLocator = GetActionEventLocator();
|
|
if ( pActionEventLocator )
|
|
{
|
|
static float sfX = 0.2f;
|
|
static float sfZ = -0.7f;
|
|
rmt::Vector loc( sfX, 0.0f, sfZ );
|
|
rmt::Matrix mat = mpJoint->worldMatrix;
|
|
rmt::Vector pos = mpJoint->worldMatrix.Row( 3 );
|
|
loc.Transform( mat );
|
|
pActionEventLocator->SetLocation( loc );
|
|
}
|
|
}
|
|
ActionEventLocator* pActionEventLocator = GetActionEventLocator( );
|
|
rAssert( pActionEventLocator );
|
|
rmt::Vector standPosition;
|
|
pCharacter->GetPosition( standPosition );
|
|
rmt::Vector direction;
|
|
pActionEventLocator->GetLocation( &direction );
|
|
|
|
Action* pAction = 0;
|
|
// Orient.
|
|
//
|
|
direction.Sub( standPosition );
|
|
// If direction != 0, 0, 0, then rotate us to align with direction.
|
|
//
|
|
if ( direction.NormalizeSafe( ) )
|
|
{
|
|
pSeq->BeginSequence();
|
|
pAction = new Orient( pCharacter, direction );
|
|
pSeq->AddAction( pAction );
|
|
// SlaveLoco
|
|
//
|
|
pAction = 0;
|
|
|
|
pAction = pCharacter->GetWalkerLocomotionAction();
|
|
|
|
pSeq->AddAction( pAction );
|
|
pSeq->EndSequence( );
|
|
}
|
|
}
|
|
/*
|
|
==============================================================================
|
|
DestroyObject::SetAnimation
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void DestroyObject::SetAnimation( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
Action* pAction = 0;
|
|
pAction = new PlayAnimationAction( pCharacter, "break_quick" );
|
|
pSeq->AddActionToSequence( pAction );
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
DestroyObject::OnUpdate
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( float timeins )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void DestroyObject::OnUpdate( float timeins )
|
|
{
|
|
|
|
}
|
|
|
|
void DestroyObject::RecieveEvent( int callback , CStateProp* stateProp )
|
|
{
|
|
const int REMOVE_FROM_WORLD_CALLBACK = 0;
|
|
const int OBJECT_DESTROYED_CALLBACK = 10;
|
|
if ( callback == REMOVE_FROM_WORLD_CALLBACK || callback == OBJECT_DESTROYED_CALLBACK )
|
|
{
|
|
rAssert( mpStatePropDSG != NULL );
|
|
mbDestroyed = true;
|
|
GetEventManager()->TriggerEvent( EVENT_OBJECT_DESTROYED, mpActionEventLocator );
|
|
GetEventManager()->TriggerEvent( EVENT_BREAK_CAMERA_OR_BOX );
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
==============================================================================
|
|
UseVendingMachine::UseVendingMachine
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: ToggleAnim
|
|
|
|
=============================================================================
|
|
*/
|
|
UseVendingMachine::UseVendingMachine( ActionEventLocator* pActionEventLocator )
|
|
:
|
|
PlayAnim( pActionEventLocator )
|
|
{
|
|
}
|
|
/*
|
|
==============================================================================
|
|
UseVendingMachine::~UseVendingMachine
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ()
|
|
|
|
Return: UseVendingMachine
|
|
|
|
=============================================================================
|
|
*/
|
|
UseVendingMachine::~UseVendingMachine()
|
|
{
|
|
}
|
|
|
|
|
|
/*
|
|
==============================================================================
|
|
UseVendingMachine::OnButtonPressed
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter, Sequencer* pSeq )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
bool UseVendingMachine::OnButtonPressed( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
if ( PlayAnim::OnButtonPressed( pCharacter, pSeq ) )
|
|
{
|
|
// used to set turbo meter here, is this class even neccesary any more
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
/*
|
|
==============================================================================
|
|
UseVendingMachine::SetAnimation
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void UseVendingMachine::SetAnimation( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
Action* pAction = 0;
|
|
pAction = new PlayAnimationAction( pCharacter, "hit_switch_quick" );
|
|
pSeq->AddActionToSequence( pAction );
|
|
}
|
|
/*
|
|
==============================================================================
|
|
PrankPhone::PrankPhone
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: ToggleAnim
|
|
|
|
=============================================================================
|
|
*/
|
|
PrankPhone::PrankPhone( ActionEventLocator* pActionEventLocator )
|
|
:
|
|
PlayAnim( pActionEventLocator )
|
|
{
|
|
}
|
|
/*
|
|
==============================================================================
|
|
PrankPhone::~PrankPhone
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ()
|
|
|
|
Return: PrankPhone
|
|
|
|
=============================================================================
|
|
*/
|
|
PrankPhone::~PrankPhone()
|
|
{
|
|
}
|
|
|
|
|
|
/*
|
|
==============================================================================
|
|
PrankPhone::OnButtonPressed
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter, Sequencer* pSeq )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
bool PrankPhone::OnButtonPressed( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
if ( PlayAnim::OnButtonPressed( pCharacter, pSeq ) )
|
|
{
|
|
// Setup the prank phone call.
|
|
//
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
/*
|
|
==============================================================================
|
|
PrankPhone::SetAnimation
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void PrankPhone::SetAnimation( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
Action* pAction = 0;
|
|
pAction = new PlayAnimationAction( pCharacter, "break_quick" );
|
|
pSeq->AddActionToSequence( pAction );
|
|
}
|
|
|
|
//=============================================================================
|
|
// Doorbell::Create
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( tEntityStore* inStore )
|
|
//
|
|
// Return: bool
|
|
//
|
|
//=============================================================================
|
|
bool Doorbell::Create( tEntityStore* inStore )
|
|
{
|
|
AnimCollisionEntityDSG* pAnimCollisionEntityDSG = p3d::find<AnimCollisionEntityDSG>( inStore, mpActionEventLocator->GetJointName() );
|
|
bool bCreated = false;
|
|
if ( pAnimCollisionEntityDSG )
|
|
{
|
|
tPose* p3dPose = pAnimCollisionEntityDSG->GetPoseEngine()->GetP3DPose( );
|
|
rAssert( p3dPose );
|
|
|
|
// Evaluate the pose to get the proper worldmatrix for the joints.
|
|
//
|
|
p3dPose->Evaluate();
|
|
int jointIndex = p3dPose->FindJointIndex( mpActionEventLocator->GetJointName() );
|
|
|
|
tPose::Joint* pJoint = pAnimCollisionEntityDSG->GetPoseJoint( jointIndex, mpActionEventLocator->GetShouldTransform() );
|
|
|
|
ActionButton::AnimCollisionEntityDSGWrapper* pGameObject = new(GMA_LEVEL_OTHER) ActionButton::AnimCollisionEntityDSGWrapper;
|
|
pGameObject->SetGameObject( pAnimCollisionEntityDSG );
|
|
// Set the start state of all animations requiring a trigger to off.
|
|
//
|
|
// This will stop the animation until Action executes.
|
|
//
|
|
|
|
pAnimCollisionEntityDSG->GetAnimController()->SetCycleMode( FORCE_CYCLIC );
|
|
pGameObject->SetAnimationDirection( 1.0f );
|
|
|
|
Init( pGameObject, pJoint, false );
|
|
bCreated = true;
|
|
}
|
|
return bCreated;
|
|
}
|
|
|
|
//=============================================================================
|
|
// Doorbell::OnButtonPressed
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( Character* pCharacter, Sequencer* pSeq )
|
|
//
|
|
// Return: bool
|
|
//
|
|
//=============================================================================
|
|
bool Doorbell::OnButtonPressed( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
//if ( PlayAnim::OnButtonPressed( pCharacter, pSeq ) )
|
|
{
|
|
//Use the object name as the name for the sound as well.
|
|
const char* charName = this->mpActionEventLocator->GetObjName();
|
|
|
|
//Send this to the sound system.
|
|
if( charName != NULL )
|
|
{
|
|
GetEventManager()->TriggerEvent( EVENT_DING_DONG, const_cast<char*>(&charName[3]) );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool SummonVehiclePhone::sbEnabled = true;
|
|
int SummonVehiclePhone::CarSelectionInfo::sNumUsedSlots = 0;
|
|
//int SummonVehiclePhone::sSelectedVehicle = INVALID_VEHICLE;
|
|
char SummonVehiclePhone::sSelectedVehicleName[ SummonVehiclePhone::MAX_VEHICLE_NAME_LENGTH ];
|
|
SummonVehiclePhone::CarSelectionInfo SummonVehiclePhone::sCarSelectInfo[ NUM_CAR_SELECTION_SLOTS ];
|
|
SummonVehiclePhoneStaticCallback SummonVehiclePhone::sCallback;
|
|
/*
|
|
==============================================================================
|
|
SummonVehiclePhone::SummonVehiclePhone
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: ToggleAnim
|
|
|
|
=============================================================================
|
|
*/
|
|
SummonVehiclePhone::SummonVehiclePhone( ActionEventLocator* pActionEventLocator )
|
|
: ActionEventHandler( pActionEventLocator ),
|
|
mHudMapIconID( -1 )
|
|
{
|
|
rmt::Vector pos;
|
|
pActionEventLocator->GetLocation( &pos );
|
|
mPhoneIcon.Init( "phone_icon", pos );
|
|
|
|
// register phone booth icon on HUD map
|
|
//
|
|
CGuiScreenHud* currentHud = GetCurrentHud();
|
|
if( currentHud != NULL )
|
|
{
|
|
mHudMapIconID = currentHud->GetHudMap( 0 )->RegisterIcon( HudMapIcon::ICON_PHONE_BOOTH, pos );
|
|
}
|
|
|
|
}
|
|
/*
|
|
==============================================================================
|
|
SummonVehiclePhone::~SummonVehiclePhone
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ()
|
|
|
|
Return: SummonVehiclePhone
|
|
|
|
=============================================================================
|
|
*/
|
|
SummonVehiclePhone::~SummonVehiclePhone()
|
|
{
|
|
// un-register phone booth icon
|
|
//
|
|
if( mHudMapIconID != -1 )
|
|
{
|
|
CGuiScreenHud* currentHud = GetCurrentHud();
|
|
if( currentHud != NULL )
|
|
{
|
|
currentHud->GetHudMap( 0 )->UnregisterIcon( mHudMapIconID );
|
|
mHudMapIconID = -1;
|
|
}
|
|
}
|
|
|
|
// release event locator
|
|
//
|
|
if( sCallback.mpActionEventLocator != NULL )
|
|
{
|
|
sCallback.mpActionEventLocator->Release();
|
|
sCallback.mpActionEventLocator = NULL;
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
// SummonVehiclePhone::Create
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( tEntityStore* inStore /* = 0 */ )
|
|
//
|
|
// Return: bool
|
|
//
|
|
//=============================================================================
|
|
bool SummonVehiclePhone::Create( tEntityStore* inStore /* = 0 */ )
|
|
{
|
|
tUID nameUID = tEntity::MakeUID(mpActionEventLocator->GetObjName());
|
|
unsigned int i;
|
|
for ( i = 0; i < ActionButtonManager::MAX_ACTIONS; ++i )
|
|
{
|
|
if ( GetActionButtonManager()->GetActionByIndex( i ) )
|
|
{
|
|
ActionButton::ButtonHandler* bh = GetActionButtonManager()->GetActionByIndex( i );
|
|
|
|
if ( bh && bh->GetType() == ActionButton::ButtonHandler::SUMMON_PHONE )
|
|
{
|
|
rAssert( dynamic_cast<ActionButton::SummonVehiclePhone*>(bh) != NULL );
|
|
ActionButton::SummonVehiclePhone* svp = static_cast<ActionButton::SummonVehiclePhone*>(bh);
|
|
rAssert( svp );
|
|
if ( tEntity::MakeUID(svp->GetActionEventLocator()->GetObjName()) == nameUID )
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool
|
|
SummonVehiclePhone::UsesActionButton() const
|
|
{
|
|
bool isPhoneEnabled = GetGameplayManager()->QueryPhoneBoothsEnabled();
|
|
return isPhoneEnabled;
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
SummonVehiclePhone::DumpVehicle
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void SummonVehiclePhone::DumpVehicle( void )
|
|
{
|
|
rAssertMsg( false, "*** DEPRECATED FUNCTION! ***" );
|
|
/*
|
|
if ( INVALID_VEHICLE != GetSelectedVehicleIndex( ) )
|
|
{
|
|
// A vehicle is already loaded. We need to dump a vehicle.
|
|
//
|
|
CarSelectionInfo* pInfo = GetCarSelectInfo( GetSelectedVehicleIndex( ) );
|
|
rAssert( pInfo );
|
|
if ( pInfo )
|
|
{
|
|
// Dump the vehicle.
|
|
//
|
|
Vehicle* pVehicle = GetVehicleCentral()->GetVehicleByName( pInfo->GetVehicleName() );
|
|
if ( pVehicle )
|
|
{
|
|
GetVehicleCentral()->RemoveVehicleFromActiveList( pVehicle );
|
|
}
|
|
|
|
pVehicle->ReleaseVerified();
|
|
// Dump the inventory associated with this vehicle.
|
|
|
|
|
|
p3d::inventory->RemoveSectionElements( pInfo->GetFileName() );
|
|
p3d::inventory->DeleteSection( pInfo->GetFileName() );
|
|
}
|
|
}
|
|
*/
|
|
}
|
|
/*
|
|
==============================================================================
|
|
SummonVehiclePhone::OnButtonPressed
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter, Sequencer* pSeq )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
bool SummonVehiclePhone::OnButtonPressed( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
//chuck
|
|
//we cant enter the phonebooth if we are in the paused state due to mission fail
|
|
//since this will generate a stack overflow and game death
|
|
if (
|
|
GetGameFlow()->GetNextContext() == CONTEXT_PAUSE
|
|
||
|
|
GetGameplayManager()->GetCurrentMission()->GetState() ==Mission::STATE_FAILED
|
|
)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if( GetGuiSystem()->GetInGameManager()->IsEnteringPauseMenu() )
|
|
{
|
|
// if about to enter pause menu, ignore button press
|
|
//
|
|
return false;
|
|
}
|
|
|
|
//check if we can use the phone booth.
|
|
if ( sbEnabled && GetGameplayManager()->QueryPhoneBoothsEnabled() )
|
|
{
|
|
// clear out any unneeded characters here (mainly to remove characters
|
|
// from completed bonus missions in case we need their car)
|
|
GetCharacterManager()->GarbageCollect(true);
|
|
|
|
// We do some of the work here, then we will trigger an event to do the menu.
|
|
// The menu will trigger the loading.
|
|
//
|
|
|
|
//Chuck: We update the users vehicle's Hit points in the Charactersheet
|
|
int CarIndex = -1;
|
|
char car_name [16];
|
|
car_name[0] = '\0';
|
|
strcpy(car_name,GetGameplayManager()->GetVehicleSlotVehicleName(GameplayManager::eDefaultCar));
|
|
CarIndex = GetCharacterSheetManager()->GetCarIndex(car_name);
|
|
|
|
//check if the players default car exists
|
|
|
|
if ( GetGameplayManager()->GetVehicleInSlot(GameplayManager::eDefaultCar) != NULL)
|
|
{
|
|
//update
|
|
float currentCarHitpoints = GetGameplayManager()->GetVehicleInSlot(GameplayManager::eDefaultCar)->mHitPoints;
|
|
GetCharacterSheetManager()->UpdateCarHealth(CarIndex,GetGameplayManager()->GetVehicleInSlot(GameplayManager::eDefaultCar)->GetVehicleLifePercentage(currentCarHitpoints));
|
|
}
|
|
else
|
|
{
|
|
if (GetGameplayManager()->GetVehicleInSlot(GameplayManager::eOtherCar) != NULL)
|
|
{
|
|
//we are in a forced car mission do nothing since player may not repair cars in a forced car mission.
|
|
}
|
|
}
|
|
|
|
|
|
|
|
tRefCounted::Assign( sCallback.mpActionEventLocator, mpActionEventLocator );
|
|
|
|
// From this point we should just trigger an event to throw up a
|
|
// menu of cars to choose from. Selecting from the menu will trigger the load.
|
|
//
|
|
GetGuiSystem()->HandleMessage( GUI_MSG_GOTO_SCREEN,
|
|
CGuiWindow::GUI_SCREEN_ID_PHONE_BOOTH );
|
|
|
|
const rmt::Matrix& matrix = mpActionEventLocator->GetMatrix();
|
|
SuperCam* sc = GetSuperCamManager()->GetSCC( 0 )->GetSuperCam( SuperCam::RELATIVE_ANIMATED_CAM );
|
|
RelativeAnimatedCam* rac = dynamic_cast< RelativeAnimatedCam* >( sc );
|
|
rmt::Matrix m2 = matrix;
|
|
rmt::Matrix rotate;
|
|
rotate.Identity();
|
|
rotate.FillRotateY( rmt::PI / 2 );
|
|
m2.Mult( rotate );
|
|
const rmt::Vector& translation = matrix.Row( 3 );
|
|
m2.FillTranslate( translation );
|
|
rac->SetOffsetMatrix( m2 );
|
|
|
|
// switch to pause context
|
|
//
|
|
GetGameFlow()->SetContext( CONTEXT_PAUSE );
|
|
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
// TC: [TODO] trigger 'busy signal' event
|
|
//
|
|
GetEventManager()->TriggerEvent( EVENT_PHONE_BOOTH_BUSY );
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
SummonVehiclePhone::SelectLoadedVehicle
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( int selectedVehicleIndex )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
/*
|
|
void SummonVehiclePhone::SelectLoadedVehicle( int selectedVehicleIndex )
|
|
{
|
|
//HACK: this a perpetuation of Trav's original Billboardwrappedloader hack.
|
|
//dyna loading duriong a car load will now be BAD. -dm
|
|
((BillboardWrappedLoader*)GetAllWrappers()->mpLoader(AllWrappers::msBillboard))->OverrideLoader(true);
|
|
//user has confirmed vehicle switch, so we must dump cars
|
|
//DumpVehicle();
|
|
GetGameplayManager()->DumpCurrentCar();
|
|
|
|
// sSelectedVehicle = selectedVehicleIndex;
|
|
CarSelectionInfo* pInfo = GetCarSelectInfo( GetSelectedVehicleIndex( ) );
|
|
rAssert( pInfo );
|
|
if ( pInfo )
|
|
{
|
|
//update the Gameplaymanager about new car getting loaded into the Other slot.
|
|
strcpy(GetGameplayManager()->mVehicleSlots[GameplayManager::eOtherCar].name,pInfo->GetVehicleName());
|
|
strcpy(GetGameplayManager()->mVehicleSlots[GameplayManager::eOtherCar].filename,pInfo->GetFileName());
|
|
|
|
sCallback.OnProcessRequestsComplete( NULL );
|
|
}
|
|
}
|
|
*/
|
|
|
|
/*
|
|
==============================================================================
|
|
SummonVehiclePhone::LoadVehicle
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( const char* filename )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void SummonVehiclePhone::LoadVehicle( const char* name, const char* filename, VehicleCentral::DriverInit driver)
|
|
{
|
|
//HACK: this a perpetuation of Trav's original Billboardwrappedloader hack.
|
|
//dyna loading duriong a car load will now be BAD. -dm
|
|
((BillboardWrappedLoader*)GetAllWrappers()->mpLoader(AllWrappers::msBillboard))->OverrideLoader(true);
|
|
|
|
//user has confirmed vehicle switch, so we must dump cars
|
|
//DumpVehicle();
|
|
GetGameplayManager()->DumpCurrentCar();
|
|
rmt::Vector position;
|
|
GetAvatarManager()->GetAvatarForPlayer( 0 )->GetPosition( position );
|
|
GetPCM().RemoveFreeCarIfClose( position );
|
|
rmt::Sphere s;
|
|
s.centre = position;
|
|
s.radius = 10.0f;
|
|
TrafficManager::GetInstance()->ClearTrafficInSphere( s );
|
|
|
|
// new
|
|
// greg
|
|
// jan 4, 2003
|
|
|
|
// phone booth cars should overwrite the default slot
|
|
|
|
rAssert( name != NULL && filename != NULL );
|
|
|
|
strncpy( sSelectedVehicleName, name, sizeof( sSelectedVehicleName ) );
|
|
|
|
//update the Gameplaymanager about new car getting loaded into the Other slot.
|
|
strcpy(GetGameplayManager()->mVehicleSlots[GameplayManager::eDefaultCar].name, name);
|
|
strcpy(GetGameplayManager()->mVehicleSlots[GameplayManager::eDefaultCar].filename, filename);
|
|
|
|
sCallback.mDriver = driver;
|
|
GetLoadingManager()->AddRequest( FILEHANDLER_PURE3D, filename, GMA_LEVEL_MISSION, filename, NULL, &sCallback );
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
SummonVehiclePhone::LoadVehicle
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( int selectedVehicleIndex )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void SummonVehiclePhone::LoadVehicle( int selectedVehicleIndex )
|
|
{
|
|
// sSelectedVehicle = selectedVehicleIndex;
|
|
|
|
CarSelectionInfo* pInfo = GetCarSelectInfo( selectedVehicleIndex );
|
|
rAssert( pInfo );
|
|
SummonVehiclePhone::LoadVehicle( pInfo->GetVehicleName(), pInfo->GetFileName(), VehicleCentral::ALLOW_DRIVER );
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
SummonVehiclePhone::LoadDebugVehicle
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( const char* filename )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void SummonVehiclePhone::LoadDebugVehicle( void )
|
|
{
|
|
LoadVehicle( NUM_CAR_SELECTION_SLOTS - 1 );
|
|
}
|
|
|
|
//=============================================================================
|
|
// SummonVehiclePhone::OnUpdate
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( float timeins )
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void SummonVehiclePhone::OnUpdate( float timeins )
|
|
{
|
|
if ( GetGameplayManager()->QueryPhoneBoothsEnabled() )
|
|
{
|
|
mPhoneIcon.ShouldRender( true );
|
|
mPhoneIcon.Update( rmt::FtoL(timeins * 1000.0f) );
|
|
}
|
|
else
|
|
{
|
|
mPhoneIcon.ShouldRender( false );
|
|
}
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
SummonVehiclePhoneStaticCallback::~SummonVehiclePhoneStaticCallback
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: SummonVehiclePhoneStaticCallback
|
|
|
|
=============================================================================
|
|
*/
|
|
SummonVehiclePhoneStaticCallback::~SummonVehiclePhoneStaticCallback( void )
|
|
{
|
|
tRefCounted::Release( mpActionEventLocator );
|
|
}
|
|
/*
|
|
==============================================================================
|
|
SummonVehiclePhoneStaticCallback::OnProcessRequestsComplete
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void* pUserData )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void SummonVehiclePhoneStaticCallback::OnProcessRequestsComplete( void* pUserData )
|
|
{
|
|
((BillboardWrappedLoader*)GetAllWrappers()->mpLoader(AllWrappers::msBillboard))->OverrideLoader(false);
|
|
// So now the vehicle is loaded.
|
|
//
|
|
// SummonVehiclePhone::CarSelectionInfo* pInfo = SummonVehiclePhone::GetCarSelectInfo( SummonVehiclePhone::GetSelectedVehicleIndex( ) );
|
|
// rAssert( pInfo );
|
|
// You suck, non const mf.
|
|
|
|
//check to see if player car is being requested
|
|
bool bplayercar = true;
|
|
|
|
if (GetCharacterSheetManager()->GetCarIndex(SummonVehiclePhone::GetSelectedVehicleName() ) == -1 )
|
|
{
|
|
bool bplayercar = false;
|
|
}
|
|
|
|
|
|
Vehicle* pVehicle = GetVehicleCentral()->InitVehicle( const_cast<char*>( SummonVehiclePhone::GetSelectedVehicleName() ), true, NULL, VT_USER, mDriver,bplayercar );
|
|
rAssert( pVehicle );
|
|
if ( pVehicle )
|
|
{
|
|
if ( mpActionEventLocator )
|
|
{
|
|
CarStartLocator* pLocator = p3d::find<CarStartLocator>( mpActionEventLocator->GetObjName() );
|
|
if ( pLocator )
|
|
{
|
|
|
|
rmt::Vector position;
|
|
|
|
pLocator->GetLocation( &position );
|
|
float facing = pLocator->GetRotation();
|
|
|
|
// Set the vehicle.
|
|
//
|
|
//pVehicle->SetInitialPosition( &position );
|
|
pVehicle->SetInitialPositionGroundOffsetAutoAdjust( &position );
|
|
pVehicle->SetResetFacingInRadians( facing );
|
|
|
|
// This will activate the above settings.
|
|
//
|
|
pVehicle->Reset( false );
|
|
//applying the correct damage to the called vehicle
|
|
/*
|
|
//check if car is in charactersheet a -1 from car index indicates cars is not owned by player
|
|
int carindex = -1;
|
|
carindex = GetCharacterSheetManager()->GetCarIndex(pVehicle->GetName());
|
|
|
|
//so if the car is owned by the player and not a husk then apply the recorded damage to it.
|
|
if ( (carindex != -1) && (GetCharacterSheetManager()->GetCarHealth(carindex) != 0.0f) )
|
|
{
|
|
float damage = 1.0f - GetCharacterSheetManager()->GetCarHealth(carindex);
|
|
damage *= pVehicle->mDesignerParams.mHitPoints;
|
|
pVehicle->TriggerDamage(damage);
|
|
|
|
|
|
}
|
|
*/
|
|
|
|
//Chuck: Adding support of "current" vehicle
|
|
GetGameplayManager()->SetCurrentVehicle(pVehicle);
|
|
|
|
//Also adding support for continuity errors.
|
|
//If this car is the same as a car currently loaded according to the table, then
|
|
//we have a problem.
|
|
if ( GetGameplayManager()->TestForContinuityErrorWithCar( pVehicle, true ) )
|
|
{
|
|
Vehicle* errorCar = GetGameplayManager()->GetVehicleInSlot( GameplayManager::eAICar );
|
|
if ( errorCar )
|
|
{
|
|
//This is kinda hacky.
|
|
GetVehicleCentral()->RemoveVehicleFromActiveList( errorCar );
|
|
errorCar->DrawVehicle( false );
|
|
}
|
|
}
|
|
|
|
// new
|
|
// greg
|
|
// jan 4, 2003
|
|
|
|
// phone booth cars should overwrite the default slot
|
|
|
|
GetGameplayManager()->mVehicleSlots[GameplayManager::eDefaultCar].mp_vehicle = pVehicle;
|
|
GetGameplayManager()->mVehicleSlots[GameplayManager::eDefaultCar].mp_vehicle->AddRef();
|
|
}
|
|
else
|
|
{
|
|
rAssertMsg(0, "what now! - vehicle init'd and added to active list but not addref'd - see greg \n");
|
|
}
|
|
tRefCounted::Release( mpActionEventLocator );
|
|
}
|
|
else
|
|
{
|
|
rAssertMsg(0, "what now! - vehicle init'd and added to active list but not addref'd - see greg \n");
|
|
}
|
|
|
|
// tell GUI system to resume in-game
|
|
//
|
|
GetGuiSystem()->HandleMessage( GUI_MSG_RESUME_INGAME );
|
|
}
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
SummonVehiclePhone::SetAnimation
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void SummonVehiclePhone::SetAnimation( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
Action* pAction = 0;
|
|
pAction = new PlayAnimationAction( pCharacter, "phone_hold" );
|
|
pSeq->AddActionToSequence( pAction );
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
Bounce::Bounce
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: ToggleAnim
|
|
|
|
=============================================================================
|
|
*/
|
|
Bounce::Bounce( ActionEventLocator* pActionEventLocator )
|
|
:
|
|
ActionEventHandler( pActionEventLocator )
|
|
{
|
|
}
|
|
/*
|
|
==============================================================================
|
|
Bounce::~Bounce
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ()
|
|
|
|
Return: Bounce
|
|
|
|
=============================================================================
|
|
*/
|
|
Bounce::~Bounce()
|
|
{
|
|
}
|
|
/*
|
|
==============================================================================
|
|
Bounce::Create
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: bool
|
|
|
|
=============================================================================
|
|
*/
|
|
bool Bounce::Create( tEntityStore* inStore )
|
|
{
|
|
EventLocator* pEventLocator = new (GMA_LEVEL_OTHER) EventLocator();
|
|
pEventLocator->SetName( mpActionEventLocator->GetObjName() );
|
|
pEventLocator->AddRef();
|
|
pEventLocator->SetEventType( LocatorEvent::BOUNCEPAD );
|
|
pEventLocator->SetNumTriggers( 1, GMA_LEVEL_OTHER );
|
|
rmt::Vector location;
|
|
mpActionEventLocator->GetLocation( &location );
|
|
pEventLocator->SetLocation( location );
|
|
|
|
TriggerVolume* pTriggerVolume = mpActionEventLocator->GetTriggerVolume( 0 );
|
|
pEventLocator->AddTriggerVolume( pTriggerVolume );
|
|
pTriggerVolume->SetLocator( pEventLocator );
|
|
pTriggerVolume->SetName( mpActionEventLocator->GetObjName() );
|
|
|
|
// Nothing can go wrong here.
|
|
//
|
|
return true;
|
|
}
|
|
/*
|
|
==============================================================================
|
|
Bounce::OnButtonPressed
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter, Sequencer* pSeq )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void Bounce::OnEnter( Character* pCharacter )
|
|
{
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
Bounce::OnEnter
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter, Locator* pLocator )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void Bounce::OnEnter( Character* pCharacter, Locator* pLocator )
|
|
{
|
|
if(pCharacter->GetStateManager()->GetState() != CharacterAi::LOCO)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Do the bounce logic.
|
|
//
|
|
rmt::Vector mJumpTarget;
|
|
pLocator->GetLocation( &mJumpTarget );
|
|
rmt::Vector position;
|
|
pCharacter->GetPosition( position );
|
|
mJumpTarget.Sub( position );
|
|
|
|
pCharacter->GetActionController()->Clear();
|
|
pCharacter->GetJumpLocomotionAction()->Reset( mJumpTarget, false );
|
|
Sequencer* seq = pCharacter->GetActionController()->GetNextSequencer();
|
|
seq->BeginSequence();
|
|
seq->AddAction(pCharacter->GetJumpLocomotionAction());
|
|
seq->EndSequence();
|
|
}
|
|
|
|
static float sfCollectibleRespawnTime = 10.0f;
|
|
/*
|
|
==============================================================================
|
|
Collectible::Collectible
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: ToggleAnim
|
|
|
|
=============================================================================
|
|
*/
|
|
Collectible::Collectible( ActionEventLocator* pActionEventLocator )
|
|
:
|
|
ActionEventHandler( pActionEventLocator ),
|
|
mAnimatedIcon( NULL ),
|
|
mbCollected( false )
|
|
//mpGameObject( 0 )
|
|
{
|
|
}
|
|
/*
|
|
==============================================================================
|
|
Collectible::~Collectible
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ()
|
|
|
|
Return: Collectible
|
|
|
|
=============================================================================
|
|
*/
|
|
Collectible::~Collectible()
|
|
{
|
|
//tRefCounted::Release( mpGameObject );
|
|
if ( mAnimatedIcon )
|
|
{
|
|
delete mAnimatedIcon;
|
|
}
|
|
}
|
|
/*
|
|
==============================================================================
|
|
Collectible::Create
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( tEntityStore* inStore )
|
|
|
|
Return: bool
|
|
|
|
=============================================================================
|
|
*/
|
|
bool Collectible::Create( tEntityStore* inStore )
|
|
{
|
|
bool bCreated = false;
|
|
|
|
return bCreated;
|
|
/*
|
|
// We can use this same tCompositeDrawable pointer, because what is really unique
|
|
// is the tPose, not the tCompositeDrawable.
|
|
//
|
|
tCompositeDrawable* pDrawable = p3d::find<tCompositeDrawable>( mpActionEventLocator->GetObjName() );
|
|
if ( pDrawable )
|
|
{
|
|
tMultiController* pAnimController = p3d::find<tMultiController>( pDrawable->GetUID() );
|
|
if ( pAnimController )
|
|
{
|
|
ActionButton::AnimEntityDSGWrapper* pGameObject = new ActionButton::AnimEntityDSGWrapper;
|
|
|
|
rmt::Matrix transform;
|
|
rmt::Vector position;
|
|
mpActionEventLocator->GetLocation( &position );
|
|
transform.Identity( );
|
|
transform.FillTranslate( position );
|
|
pGameObject->SetDrawable( pDrawable );
|
|
pGameObject->SetPose( pDrawable->GetSkeleton()->NewPose() );
|
|
pGameObject->SetAnimController( pAnimController );
|
|
pGameObject->SetTransform( transform );
|
|
|
|
// Set the start state of all animations requiring a trigger to off.
|
|
//
|
|
// This will stop the animation until Action executes.
|
|
//
|
|
pGameObject->SetAnimationDirection( 0.0f );
|
|
// Reset the animation to the initial frame.
|
|
//
|
|
pGameObject->GetAnimController( )->SetFrame( 0.0f );
|
|
|
|
// Play the Collectible animation.
|
|
//
|
|
pGameObject->SetAnimationDirection( 1.0f );
|
|
|
|
tRefCounted::Assign( mpGameObject, pGameObject );
|
|
// Temporary.
|
|
//
|
|
GetRenderManager()->mpLayer(RenderEnums::LevelSlot)->AddGuts((tDrawable*)(pGameObject) );
|
|
bCreated = true;
|
|
}
|
|
else
|
|
{
|
|
#ifdef RAD_DEBUG
|
|
char error[256];
|
|
sprintf( error, "Shouldn't %s have a properly named multicontroller?\n", mpActionEventLocator->GetObjName());
|
|
rAssert(false);
|
|
#endif
|
|
}
|
|
}
|
|
return bCreated;
|
|
*/
|
|
}
|
|
|
|
//=============================================================================
|
|
// Collectible::OnReset
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( void )
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void Collectible::OnReset( void )
|
|
{
|
|
/*
|
|
// Set the start state of all animations requiring a trigger to off.
|
|
//
|
|
// This will stop the animation until Action executes.
|
|
//
|
|
mpGameObject->SetAnimationDirection( 0.0f );
|
|
// Reset the animation to the initial frame.
|
|
//
|
|
mpGameObject->GetAnimController( )->SetFrame( 0.0f );
|
|
|
|
// Play the Collectible animation.
|
|
//
|
|
mpGameObject->SetAnimationDirection( 1.0f );
|
|
|
|
mbCollected = false;
|
|
mpGameObject->SetVisible( true );
|
|
mpGameObject->UpdateVisibility( );
|
|
*/
|
|
//Kinda slow, but guarantees that the object will only be in once.
|
|
mAnimatedIcon->ShouldRender( false );
|
|
mAnimatedIcon->ShouldRender( true );
|
|
}
|
|
|
|
|
|
//Chuck: added this to make wrenches respawn since I didnt see a method to set mbCollected to false;
|
|
|
|
void Collectible::ResetCollectible()
|
|
{
|
|
mbCollected = false;
|
|
}
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
|
|
==============================================================================
|
|
Collectible::OnUpdate
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( float timeins )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void Collectible::OnUpdate( float timeins )
|
|
{
|
|
if ( IsCollected() )
|
|
{
|
|
if ( ShouldRespawn() )
|
|
{
|
|
if ( IsRespawnTimeExpired( ) )
|
|
{
|
|
mbCollected = false;
|
|
SetRespawnTime( sfCollectibleRespawnTime );
|
|
|
|
// Reactivate the trigger volumes.
|
|
//
|
|
mpActionEventLocator->SetFlag( Locator::ACTIVE, true );
|
|
|
|
// Allow display.
|
|
//
|
|
//mpGameObject->SetVisible( true );
|
|
mAnimatedIcon->ShouldRender( true );
|
|
}
|
|
else
|
|
{
|
|
UpdateRespawnTime( timeins );
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//mpGameObject->GetAnimController()->Advance( timeins * 1000.0f * mpGameObject->GetAnimationDirection() );
|
|
mAnimatedIcon->Update( rmt::FtoL(timeins * 1000.0f) );
|
|
}
|
|
}
|
|
/*
|
|
==============================================================================
|
|
Collectible::OnEnter
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void Collectible::OnEnter( Character* pCharacter )
|
|
{
|
|
if ( !IsCollected() )
|
|
{
|
|
// Make it disappear.
|
|
//
|
|
//mpGameObject->SetVisible( false );
|
|
mAnimatedIcon->ShouldRender( false );
|
|
|
|
// Deactivate the trigger volumes.
|
|
//
|
|
mpActionEventLocator->SetFlag( Locator::ACTIVE, false );
|
|
// Maybe play an animation?
|
|
//
|
|
|
|
// Maybe play a sound effect.
|
|
//
|
|
|
|
// We collected it.
|
|
//
|
|
mbCollected = true;
|
|
|
|
GetEventManager()->TriggerEvent( EVENT_COLLECT_OBJECT );
|
|
}
|
|
}
|
|
|
|
void Collectible::OnExit( Character* pCharacter )
|
|
{
|
|
// Do nothing.
|
|
//
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
RespawnCollectible::RespawnCollectible
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: ToggleAnim
|
|
|
|
=============================================================================
|
|
*/
|
|
RespawnCollectible::RespawnCollectible( ActionEventLocator* pActionEventLocator )
|
|
:
|
|
Collectible( pActionEventLocator ),
|
|
mfRespawnTime( sfCollectibleRespawnTime )
|
|
{
|
|
}
|
|
/*
|
|
==============================================================================
|
|
RespawnCollectible::~RespawnCollectible
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ()
|
|
|
|
Return: RespawnCollectible
|
|
|
|
=============================================================================
|
|
*/
|
|
RespawnCollectible::~RespawnCollectible()
|
|
{
|
|
}
|
|
/*
|
|
==============================================================================
|
|
CollectibleFood::CollectibleFood
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: ToggleAnim
|
|
|
|
=============================================================================
|
|
*/
|
|
float CollectibleFood::sfSmallTurboGain = 0.1f;
|
|
float CollectibleFood::sfLargeTurboGain = 0.3f;
|
|
CollectibleFood::CollectibleFood( ActionEventLocator* pActionEventLocator, float fTurboGain )
|
|
:
|
|
RespawnCollectible( pActionEventLocator ),
|
|
mfTurboGain( fTurboGain )
|
|
{
|
|
}
|
|
/*
|
|
==============================================================================
|
|
CollectibleFood::~CollectibleFood
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ()
|
|
|
|
Return: CollectibleFood
|
|
|
|
=============================================================================
|
|
*/
|
|
CollectibleFood::~CollectibleFood()
|
|
{
|
|
}
|
|
/*
|
|
==============================================================================
|
|
CollectibleFood::OnEnter
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void CollectibleFood::OnEnter( Character* pCharacter )
|
|
{
|
|
if ( !IsCollected() )
|
|
{
|
|
// used to add turbo here, is this class even neccesary any more
|
|
|
|
// Maybe play an animation?
|
|
//
|
|
|
|
// Maybe play a sound effect.
|
|
//
|
|
}
|
|
Collectible::OnEnter( pCharacter );
|
|
}
|
|
|
|
AnimatedIcon* CollectibleCard::mAnimatedCollectionThing = NULL;
|
|
unsigned int CollectibleCard::mCollectibleCardCount = 0;
|
|
|
|
|
|
/*
|
|
==============================================================================
|
|
CollectibleCard::CollectibleCard
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: ToggleAnim
|
|
|
|
=============================================================================
|
|
*/
|
|
CollectibleCard::CollectibleCard( ActionEventLocator* pActionEventLocator )
|
|
:
|
|
Collectible( pActionEventLocator )
|
|
{
|
|
mCollectibleCardCount++;
|
|
}
|
|
/*
|
|
==============================================================================
|
|
CollectibleCard::~CollectibleCard
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ()
|
|
|
|
Return: CollectibleCard
|
|
|
|
=============================================================================
|
|
*/
|
|
CollectibleCard::~CollectibleCard()
|
|
{
|
|
mCollectibleCardCount--;
|
|
|
|
if ( mCollectibleCardCount == 0 )
|
|
{
|
|
delete mAnimatedCollectionThing;
|
|
mAnimatedCollectionThing = NULL;
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
// CollectibleCard::Create
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( tEntityStore* inStore )
|
|
//
|
|
// Return: bool
|
|
//
|
|
//=============================================================================
|
|
bool CollectibleCard::Create( tEntityStore* inStore )
|
|
{
|
|
MEMTRACK_PUSH_GROUP( "Collectible - Cards" );
|
|
bool bCreated = false;
|
|
|
|
// We can use this same tCompositeDrawable pointer, because what is really unique
|
|
// is the tPose, not the tCompositeDrawable.
|
|
//
|
|
bool found = false;
|
|
tUID nameUID = tEntity::MakeUID(mpActionEventLocator->GetObjName());
|
|
unsigned int i;
|
|
for ( i = 0; i < ActionButtonManager::MAX_ACTIONS; ++i )
|
|
{
|
|
if ( GetActionButtonManager()->GetActionByIndex( i ) )
|
|
{
|
|
ActionButton::ButtonHandler* bh = GetActionButtonManager()->GetActionByIndex( i );
|
|
|
|
if ( bh && bh->GetType() == ActionButton::ButtonHandler::COLLECTOR_CARD )
|
|
{
|
|
rAssert( dynamic_cast<ActionButton::CollectibleCard*>(bh) != NULL );
|
|
ActionButton::CollectibleCard* cc = static_cast<ActionButton::CollectibleCard*>(bh);
|
|
rAssert( cc );
|
|
if ( tEntity::MakeUID(cc->GetActionEventLocator()->GetObjName()) == nameUID )
|
|
{
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//Test to make sure the player doesn't already have this one.
|
|
if ( !found &&
|
|
!GetCardGallery()->IsCardCollected( nameUID ) )
|
|
{
|
|
// make sure this card belongs in the current level
|
|
//
|
|
CardsDB* cardsDB = GetCardGallery()->GetCardsDB();
|
|
rAssert( cardsDB != NULL );
|
|
Card* card = cardsDB->GetCardByName( nameUID );
|
|
if( card != NULL &&
|
|
static_cast<int>( card->GetLevel() ) != (GetGameplayManager()->GetCurrentLevelIndex() + 1) )
|
|
{
|
|
rTunePrintf( "*** Invalid card found: %d-%d\n", card->GetLevel(), card->GetLevelID() );
|
|
rTuneAssertMsg( false, "This card does not belong in this level! Please go tell Sheik!" );
|
|
}
|
|
|
|
mAnimatedIcon = new(GMA_LEVEL_OTHER) AnimatedIcon();
|
|
|
|
rmt::Vector pos;
|
|
mpActionEventLocator->GetLocation( &pos );
|
|
mAnimatedIcon->Init( "card_idle", pos, true );
|
|
|
|
if ( mAnimatedCollectionThing == NULL )
|
|
{
|
|
mAnimatedCollectionThing = new(GMA_LEVEL_OTHER) AnimatedIcon();
|
|
mAnimatedCollectionThing->Init( "card_collect", rmt::Vector(0.0f, 0.0f, 0.0f), false, true );
|
|
}
|
|
|
|
bCreated = true;
|
|
}
|
|
MEMTRACK_POP_GROUP( "Collectible - Cards" );
|
|
|
|
return bCreated;
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
CollectibleCard::OnEnter
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void CollectibleCard::OnEnter( Character* pCharacter )
|
|
{
|
|
if ( !IsCollected() )
|
|
{
|
|
// Talk to the collector card DB.
|
|
//
|
|
Card* collectedCard = GetCardGallery()->AddCollectedCardByName( tEntity::MakeUID(mpActionEventLocator->GetObjName()) );
|
|
if( collectedCard != NULL )
|
|
{
|
|
// Update collected cards in character sheet
|
|
//
|
|
GetCharacterSheetManager()->AddCard( static_cast<RenderEnums::LevelEnum>( collectedCard->GetLevel() - 1 ),
|
|
collectedCard->GetLevelID() - 1 );
|
|
}
|
|
|
|
// Maybe play an animation?
|
|
//
|
|
mAnimatedCollectionThing->Reset();
|
|
rmt::Vector pos;
|
|
mpActionEventLocator->GetLocation( &pos );
|
|
mAnimatedCollectionThing->ShouldRender( true );
|
|
mAnimatedCollectionThing->Move( pos );
|
|
|
|
// Maybe play a sound effect.
|
|
//
|
|
GetEventManager()->TriggerEvent( EVENT_CARD_COLLECTED, reinterpret_cast<void*>( collectedCard ) );
|
|
|
|
//Rumble the controller.
|
|
int playerID = mpActionEventLocator->GetPlayerID();
|
|
int controllerID = GetInputManager()->GetControllerIDforPlayer( playerID );
|
|
if ( controllerID != -1 )
|
|
{
|
|
GetInputManager()->GetController( controllerID )->ApplyEffect( RumbleEffect::MEDIUM, 250 );
|
|
GetInputManager()->GetController( controllerID )->ApplyEffect( RumbleEffect::HARD2, 250 );
|
|
}
|
|
}
|
|
Collectible::OnEnter( pCharacter );
|
|
}
|
|
|
|
//=============================================================================
|
|
// CollectibleCard::UpdateThing
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( unsigned int milliseconds )
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void CollectibleCard::UpdateThing( unsigned int milliseconds )
|
|
{
|
|
if ( mAnimatedCollectionThing )
|
|
{
|
|
mAnimatedCollectionThing->Update( milliseconds );
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
//Intializing static stuff for WrenchIcon
|
|
|
|
unsigned int ActionButton::WrenchIcon::mWrenchCount = 0;
|
|
AnimatedIcon* ActionButton::WrenchIcon::mAnimatedCollectionThing = NULL;
|
|
|
|
|
|
|
|
/*
|
|
==============================================================================
|
|
WrenchIcon::WrenchIcon
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( void )
|
|
|
|
Return: ToggleAnim
|
|
|
|
=============================================================================
|
|
*/
|
|
WrenchIcon::WrenchIcon ( ActionEventLocator* pActionEventLocator ) :
|
|
Collectible( pActionEventLocator ),
|
|
RespawnEntity(RespawnEntity::eWrench)
|
|
{
|
|
mWrenchCount++;
|
|
}
|
|
/*
|
|
==============================================================================
|
|
WrenchIcon::~WrenchIcon
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ()
|
|
|
|
Return: WrenchIcon
|
|
|
|
=============================================================================
|
|
*/
|
|
WrenchIcon::~WrenchIcon()
|
|
{
|
|
mWrenchCount--;
|
|
|
|
if (mWrenchCount ==0)
|
|
{
|
|
delete mAnimatedCollectionThing;
|
|
mAnimatedCollectionThing = NULL;
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
// WrenchIcon::Create
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( tEntityStore* inStore )
|
|
//
|
|
// Return: bool
|
|
//
|
|
//=============================================================================
|
|
bool WrenchIcon::Create( tEntityStore* inStore )
|
|
{
|
|
MEMTRACK_PUSH_GROUP( "Wrench - Icon" );
|
|
bool bCreated = false;
|
|
// We can use this same tCompositeDrawable pointer, because what is really unique
|
|
// is the tPose, not the tCompositeDrawable.
|
|
//
|
|
bool found = false;
|
|
tUID nameUID = tEntity::MakeUID(mpActionEventLocator->GetObjName());
|
|
unsigned int i;
|
|
for ( i = 0; i < ActionButtonManager::MAX_ACTIONS; ++i )
|
|
{
|
|
if ( GetActionButtonManager()->GetActionByIndex( i ) )
|
|
{
|
|
ActionButton::ButtonHandler* bh = GetActionButtonManager()->GetActionByIndex( i );
|
|
|
|
if ( bh && bh->GetType() == ActionButton::ButtonHandler::WRENCH_ICON )
|
|
{
|
|
rAssert( dynamic_cast<ActionButton::WrenchIcon*>(bh) != NULL );
|
|
ActionButton::WrenchIcon* pWrenchIcon = static_cast<ActionButton::WrenchIcon*>(bh);
|
|
rAssert( pWrenchIcon );
|
|
if ( tEntity::MakeUID(pWrenchIcon->GetActionEventLocator()->GetObjName()) == nameUID )
|
|
{
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
mAnimatedIcon = new(GMA_LEVEL_OTHER) AnimatedIcon();
|
|
|
|
rmt::Vector pos;
|
|
mpActionEventLocator->GetLocation( &pos );
|
|
mAnimatedIcon->Init( "wrench", pos, true );
|
|
mAnimatedIcon->ShouldRender(true);
|
|
|
|
if ( mAnimatedCollectionThing == NULL )
|
|
{
|
|
mAnimatedCollectionThing = new(GMA_LEVEL_OTHER) AnimatedIcon();
|
|
mAnimatedCollectionThing->Init( "wrench_collect", rmt::Vector(0.0f, 0.0f, 0.0f), false, true );
|
|
}
|
|
|
|
bCreated = true;
|
|
|
|
MEMTRACK_POP_GROUP("Wrench - Icon");
|
|
|
|
return bCreated;
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
WrenchIcon::OnEnter
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void WrenchIcon::OnEnter( Character* pCharacter )
|
|
{
|
|
if ( !IsCollected() )
|
|
{
|
|
|
|
|
|
// Maybe play an animation?
|
|
mAnimatedCollectionThing->Reset();
|
|
rmt::Vector pos;
|
|
mpActionEventLocator->GetLocation( &pos );
|
|
mAnimatedCollectionThing->ShouldRender( true );
|
|
mAnimatedCollectionThing->Move( pos );
|
|
|
|
// Maybe play a sound effect.
|
|
//
|
|
|
|
//check which context we're in. If we are in regular gameplay then trigger Repair Car Event.
|
|
if ( GetGameFlow()->GetCurrentContext() == CONTEXT_GAMEPLAY)
|
|
{
|
|
GetEventManager()->TriggerEvent(EVENT_REPAIR_CAR);
|
|
}
|
|
//we must be in super sprint mode then just repair the car since we arent going to summon the helper bee thingy
|
|
else
|
|
{
|
|
int playerid = mpActionEventLocator->GetPlayerID();
|
|
|
|
GetAvatarManager()->GetAvatarForPlayer(playerid)->GetVehicle()->ResetDamageState();
|
|
}
|
|
//Fire off a event for the sound manager
|
|
GetEventManager()->TriggerEvent(EVENT_COLLECTED_WRENCH);
|
|
|
|
|
|
}
|
|
Collectible::OnEnter( pCharacter );
|
|
//update the respawnentity
|
|
RespawnEntity::EntityCollected();
|
|
}
|
|
|
|
//=============================================================================
|
|
// WrenchIcon::UpdateThing
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( unsigned int milliseconds )
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void WrenchIcon::UpdateThing( unsigned int milliseconds )
|
|
{
|
|
if ( mAnimatedCollectionThing != NULL)
|
|
{
|
|
mAnimatedCollectionThing->Update( milliseconds );
|
|
}
|
|
|
|
}
|
|
|
|
|
|
void WrenchIcon::Update(float timeins)
|
|
{
|
|
unsigned int timeinms=0;
|
|
timeinms = rmt::FtoL(timeins * 1000.0f);
|
|
mAnimatedIcon->Update(timeinms);
|
|
RespawnEntity::Update(timeinms);
|
|
//check if entity should respawn.
|
|
if (RespawnEntity::ShouldEntityRespawn ())
|
|
{
|
|
//reset the collectible class created by trav and cary .
|
|
Collectible::Reset();
|
|
Collectible::ResetCollectible();
|
|
Collectible::mpActionEventLocator->SetFlag(Locator::ACTIVE,true);
|
|
Collectible::mAnimatedIcon->ShouldRender(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Intializing static stuff for NitroIcon
|
|
unsigned int ActionButton::NitroIcon::mNitroCount = 0;
|
|
AnimatedIcon* ActionButton::NitroIcon::mAnimatedCollectionThing = NULL;
|
|
|
|
|
|
|
|
/*
|
|
==============================================================================
|
|
NitroIcon::NitroIcon
|
|
==============================================================================
|
|
Description: Create the Nitro
|
|
|
|
Parameters:
|
|
|
|
Return:
|
|
|
|
=============================================================================
|
|
*/
|
|
NitroIcon::NitroIcon ( ActionEventLocator* pActionEventLocator ) :
|
|
Collectible( pActionEventLocator ),
|
|
RespawnEntity(RespawnEntity::eNitro)
|
|
{
|
|
mNitroCount++;
|
|
}
|
|
/*
|
|
==============================================================================
|
|
NitroIcon::~NitroIcon
|
|
==============================================================================
|
|
Description: Destructor
|
|
|
|
Parameters: ()
|
|
|
|
Return:
|
|
|
|
=============================================================================
|
|
*/
|
|
NitroIcon::~NitroIcon()
|
|
{
|
|
mNitroCount--;
|
|
|
|
if (mNitroCount ==0) //if no more instances left deleted the static animated class
|
|
{
|
|
delete mAnimatedCollectionThing;
|
|
mAnimatedCollectionThing = NULL;
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
// NitroIcon::Create
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( tEntityStore* inStore )
|
|
//
|
|
// Return: bool
|
|
//
|
|
//=============================================================================
|
|
bool NitroIcon::Create( tEntityStore* inStore )
|
|
{
|
|
MEMTRACK_PUSH_GROUP( "Nitro - Icon" );
|
|
bool bCreated = false;
|
|
// We can use this same tCompositeDrawable pointer, because what is really unique
|
|
// is the tPose, not the tCompositeDrawable.
|
|
//
|
|
bool found = false;
|
|
tUID nameUID = tEntity::MakeUID(mpActionEventLocator->GetObjName());
|
|
unsigned int i;
|
|
for ( i = 0; i < ActionButtonManager::MAX_ACTIONS; ++i )
|
|
{
|
|
if ( GetActionButtonManager()->GetActionByIndex( i ) )
|
|
{
|
|
ActionButton::ButtonHandler* bh = GetActionButtonManager()->GetActionByIndex( i );
|
|
|
|
if ( bh && bh->GetType() == ActionButton::ButtonHandler::NITRO_ICON )
|
|
{
|
|
rAssert( dynamic_cast<ActionButton::NitroIcon*>(bh) != NULL );
|
|
ActionButton::NitroIcon* pNitroIcon = static_cast<ActionButton::NitroIcon*>(bh);
|
|
rAssert( pNitroIcon );
|
|
if ( tEntity::MakeUID(pNitroIcon->GetActionEventLocator()->GetObjName()) == nameUID )
|
|
{
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
mAnimatedIcon = new(GMA_LEVEL_OTHER) AnimatedIcon();
|
|
|
|
rmt::Vector pos;
|
|
mpActionEventLocator->GetLocation( &pos );
|
|
mAnimatedIcon->Init( "nitro", pos, true ); //Hack!
|
|
|
|
if ( mAnimatedCollectionThing == NULL )
|
|
{
|
|
mAnimatedCollectionThing = new(GMA_LEVEL_OTHER) AnimatedIcon();
|
|
mAnimatedCollectionThing->Init( "wrench_collect", rmt::Vector(0.0f, 0.0f, 0.0f), false, true );
|
|
}
|
|
|
|
bCreated = true;
|
|
|
|
MEMTRACK_POP_GROUP("Nitro - Icon");
|
|
|
|
return bCreated;
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
NitroIcon::OnEnter
|
|
==============================================================================
|
|
Description: Comment
|
|
|
|
Parameters: ( Character* pCharacter )
|
|
|
|
Return: void
|
|
|
|
=============================================================================
|
|
*/
|
|
void NitroIcon::OnEnter( Character* pCharacter )
|
|
{
|
|
if ( !IsCollected() )
|
|
{
|
|
// Maybe play an animation?
|
|
mAnimatedCollectionThing->Reset();
|
|
rmt::Vector pos;
|
|
mpActionEventLocator->GetLocation( &pos );
|
|
mAnimatedCollectionThing->ShouldRender( true );
|
|
mAnimatedCollectionThing->Move( pos );
|
|
|
|
int playerid = mpActionEventLocator->GetPlayerID();
|
|
Avatar* player = GetAvatarManager()->GetAvatarForPlayer( playerid );
|
|
|
|
/*
|
|
// TODO:
|
|
// Maybe play a sound effect? Pass in the avatar pointer? Ask Esan
|
|
::GetEventManager()->TriggerEvent( EVENT_COLLECTED_NITRO, player );
|
|
*/
|
|
Vehicle* playerVehicle = player->GetVehicle();
|
|
if( playerVehicle )
|
|
{
|
|
// increase the nitro count...
|
|
playerVehicle->mNumTurbos++;
|
|
}
|
|
}
|
|
Collectible::OnEnter( pCharacter );
|
|
//update the respawnentity
|
|
RespawnEntity::EntityCollected();
|
|
}
|
|
|
|
//=============================================================================
|
|
// NitroIcon::UpdateThing
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( unsigned int milliseconds )
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void NitroIcon::UpdateThing( unsigned int milliseconds )
|
|
{
|
|
if ( mAnimatedCollectionThing != NULL)
|
|
{
|
|
mAnimatedCollectionThing->Update( milliseconds );
|
|
}
|
|
|
|
}
|
|
|
|
|
|
void NitroIcon::Update(float timeins)
|
|
{
|
|
unsigned int timeinms=0;
|
|
timeinms = rmt::FtoL(timeins * 1000.0f);
|
|
mAnimatedIcon->Update(timeinms);
|
|
RespawnEntity::Update(timeinms);
|
|
//check if entity should respawn.
|
|
if (RespawnEntity::ShouldEntityRespawn ())
|
|
{
|
|
//reset the collectible class created by trav and cary .
|
|
Collectible::Reset();
|
|
Collectible::ResetCollectible();
|
|
Collectible::mpActionEventLocator->SetFlag(Locator::ACTIVE,true);
|
|
Collectible::mAnimatedIcon->ShouldRender(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//=============================================================================
|
|
// GenericEventButtonHandler::GenericEventButtonHandler
|
|
//=============================================================================
|
|
// Description: Constructor
|
|
//
|
|
// Parameters: ( EventLocator* pEventLocator, EventEnum event )
|
|
//
|
|
// Return:
|
|
//
|
|
//=============================================================================
|
|
GenericEventButtonHandler::GenericEventButtonHandler( EventLocator* pEventLocator, EventEnum event ) :
|
|
mpEventLocator( NULL ),
|
|
mEvent( event ),
|
|
mEventData( NULL )
|
|
{
|
|
SetEventLocator( pEventLocator );
|
|
}
|
|
|
|
//=============================================================================
|
|
// ::~GenericEventButtonHandler
|
|
//=============================================================================
|
|
// Description: Destructor
|
|
//
|
|
// Parameters: ()
|
|
//
|
|
// Return:
|
|
//
|
|
//=============================================================================
|
|
GenericEventButtonHandler::~GenericEventButtonHandler()
|
|
{
|
|
if ( mpEventLocator )
|
|
{
|
|
mpEventLocator->Release();
|
|
mpEventLocator = NULL;
|
|
}
|
|
};
|
|
|
|
//=============================================================================
|
|
// GenericEventButtonHandler::NewAction
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( EventLocator* pEventLocator, EventEnum event, GameMemoryAllocator alloc )
|
|
//
|
|
// Return: ButtonHandler
|
|
//
|
|
//=============================================================================
|
|
ButtonHandler* GenericEventButtonHandler::NewAction( EventLocator* pEventLocator, EventEnum event, GameMemoryAllocator alloc )
|
|
{
|
|
return new (alloc) GenericEventButtonHandler( pEventLocator, event );
|
|
}
|
|
|
|
//=============================================================================
|
|
// GenericEventButtonHandler::SetEventLocator
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( EventLocator* pEventLocator )
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void GenericEventButtonHandler::SetEventLocator( EventLocator* pEventLocator )
|
|
{
|
|
tRefCounted::Assign( mpEventLocator, pEventLocator );
|
|
}
|
|
|
|
//=============================================================================
|
|
// GenericEventButtonHandler::OnButtonPressed
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( Character* pCharacter, Sequencer* pSeq )
|
|
//
|
|
// Return: bool
|
|
//
|
|
//=============================================================================
|
|
bool GenericEventButtonHandler::OnButtonPressed( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
CGuiScreenHud* currentHUD = GetCurrentHud();
|
|
if( (currentHUD != NULL && !currentHUD->IsActive()) || GetHitnRunManager()->BustingPlayer())
|
|
{
|
|
// if HUD is not active, ignore button press
|
|
//
|
|
return false;
|
|
}
|
|
|
|
if ( pCharacter->GetController()->GetIntention() == CharacterController::DoAction )
|
|
{
|
|
GetEventManager()->TriggerEvent( mEvent, mEventData );
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
// TeleportAction::TeleportAction
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( ActionEventLocator* pActionEventLocator )
|
|
//
|
|
// Return: TeleportAction
|
|
//
|
|
//=============================================================================
|
|
TeleportAction::TeleportAction( ActionEventLocator* pActionEventLocator ) :
|
|
ActionEventHandler( pActionEventLocator )
|
|
{
|
|
}
|
|
|
|
//=============================================================================
|
|
// ::~TeleportAction
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ()
|
|
//
|
|
// Return: TeleportAction
|
|
//
|
|
//=============================================================================
|
|
TeleportAction::~TeleportAction()
|
|
{
|
|
GetEventManager()->RemoveListener( this, EVENT_GUI_IRIS_WIPE_CLOSED );
|
|
}
|
|
|
|
//=============================================================================
|
|
// TeleportAction::Create
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( tEntityStore* inStore = 0 )
|
|
//
|
|
// Return: bool
|
|
//
|
|
//=============================================================================
|
|
bool TeleportAction::Create( tEntityStore* inStore )
|
|
{
|
|
return true;
|
|
}
|
|
|
|
//=============================================================================
|
|
// TeleportAction::HandleEvent
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( EventEnum id, void* pEventData )
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void TeleportAction::HandleEvent( EventEnum id, void* pEventData )
|
|
{
|
|
if ( id == EVENT_GUI_IRIS_WIPE_CLOSED )
|
|
{
|
|
GetEventManager()->RemoveListener( this, EVENT_GUI_IRIS_WIPE_CLOSED );
|
|
|
|
//Send the teleporting event
|
|
GetEventManager()->TriggerEvent( EVENT_TAKING_TELEPORT, mpActionEventLocator );
|
|
|
|
//Teleport the player to the locator
|
|
rmt::Vector pos;
|
|
mpActionEventLocator->GetLocation( &pos );
|
|
|
|
rmt::Matrix mat = mpActionEventLocator->GetMatrix();
|
|
mat.IdentityTranslation();
|
|
|
|
rmt::Vector z( 1.0f, 0.0f, 0.0f );
|
|
z.Transform( mat );
|
|
float facing, magWaste;
|
|
|
|
rmt::CartesianToPolar( z.x, z.z, &magWaste, &facing );
|
|
|
|
GetAvatarManager()->GetAvatarForPlayer( 0 )->GetCharacter()->RelocateAndReset( pos, facing, true );
|
|
#ifdef RAD_WIN32
|
|
GetSuperCamManager()->GetSCC( 0 )->SelectSuperCam( SuperCam::ON_FOOT_CAM, SuperCamCentral::CUT, 0 );
|
|
#else
|
|
GetSuperCamManager()->GetSCC( 0 )->SelectSuperCam( SuperCam::WALKER_CAM, SuperCamCentral::CUT, 0 );
|
|
#endif
|
|
GetSuperCamManager()->GetSCC( 0 )->DoCameraCut();
|
|
|
|
//Wipe out when we are finished moving.
|
|
GetGuiSystem()->HandleMessage( GUI_MSG_START_IRIS_WIPE_OPEN );
|
|
|
|
GetGameFlow()->GetContext( CONTEXT_GAMEPLAY )->Resume();
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
// TeleportAction::OnButtonPressed
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( Character* pCharacter, Sequencer* pSeq )
|
|
//
|
|
// Return: bool
|
|
//
|
|
//=============================================================================
|
|
bool TeleportAction::OnButtonPressed( Character* pCharacter, Sequencer* pSeq )
|
|
{
|
|
//Do an iris wipe in
|
|
GetGuiSystem()->HandleMessage( GUI_MSG_START_IRIS_WIPE_CLOSE );
|
|
|
|
//add listener
|
|
GetEventManager()->AddListener( this, EVENT_GUI_IRIS_WIPE_CLOSED );
|
|
|
|
//Pause gameplay
|
|
GetGameFlow()->GetContext( CONTEXT_GAMEPLAY )->Suspend();
|
|
return true;
|
|
}
|
|
|
|
//=============================================================================
|
|
// TeleportAction::OnEnter
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( Character* pCharacter )
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void TeleportAction::OnEnter( Character* pCharacter )
|
|
{
|
|
GetEventManager()->TriggerEvent( EVENT_ENTERED_TELEPORT_PAD, mpActionEventLocator );
|
|
}
|
|
|
|
//=============================================================================
|
|
// TeleportAction::OnExit
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( Character* pCharacter )
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void TeleportAction::OnExit( Character* pCharacter )
|
|
{
|
|
GetEventManager()->TriggerEvent( EVENT_EXITED_TELEPORT_PAD, mpActionEventLocator );
|
|
}
|
|
|
|
//===============================================================================
|
|
|
|
bool PurchaseReward::sbEnabled = true;
|
|
|
|
//=============================================================================
|
|
// PurchaseReward::PurchaseReward
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( ActionEventLocator* pActionEventLocator )
|
|
//
|
|
// Return: PurchaseReward
|
|
//
|
|
//=============================================================================
|
|
PurchaseReward::PurchaseReward( ActionEventLocator* pActionEventLocator ) :
|
|
ActionEventHandler( pActionEventLocator ),
|
|
mAllPurchased( false ),
|
|
mIsActive( true ),
|
|
mHudMapIconID( -1 )
|
|
{
|
|
}
|
|
|
|
//=============================================================================
|
|
// ::~PurchaseReward
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ()
|
|
//
|
|
// Return: PurchaseReward
|
|
//
|
|
//=============================================================================
|
|
PurchaseReward::~PurchaseReward()
|
|
{
|
|
if( mHudMapIconID != -1 )
|
|
{
|
|
CGuiScreenHud* currentHud = GetCurrentHud();
|
|
if( currentHud != NULL )
|
|
{
|
|
currentHud->GetHudMap( 0 )->UnregisterIcon( mHudMapIconID );
|
|
mHudMapIconID = -1;
|
|
}
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
// PurchaseReward::OnUpdate
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( float timeins )
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void PurchaseReward::OnUpdate( float timeins )
|
|
{
|
|
if ( sbEnabled && mIsActive && !mAllPurchased && GetGameplayManager()->IsSundayDrive() )
|
|
{
|
|
mIcon.Update( rmt::FtoL(timeins * 1000.0f) );
|
|
}
|
|
|
|
if ( mIsActive && ( mAllPurchased || !sbEnabled || !GetGameplayManager()->IsSundayDrive() ) )
|
|
{
|
|
//Time to shut this one down.
|
|
mIcon.ShouldRender( false );
|
|
mIsActive = false;
|
|
|
|
mpActionEventLocator->SetFlag( Locator::ACTIVE, false );
|
|
|
|
if( mHudMapIconID != -1 )
|
|
{
|
|
CGuiScreenHud* currentHud = GetCurrentHud();
|
|
if( currentHud != NULL )
|
|
{
|
|
currentHud->GetHudMap( 0 )->UnregisterIcon( mHudMapIconID );
|
|
mHudMapIconID = -1;
|
|
}
|
|
}
|
|
}
|
|
else if ( !mIsActive && !mAllPurchased && sbEnabled && GetGameplayManager()->IsSundayDrive() )
|
|
{
|
|
mIcon.ShouldRender( true );
|
|
mIsActive = true;
|
|
|
|
mpActionEventLocator->SetFlag( Locator::ACTIVE, true );
|
|
|
|
rAssert( mHudMapIconID == -1 );
|
|
if( mHudMapIconID == -1 )
|
|
{
|
|
CGuiScreenHud* currentHud = GetCurrentHud();
|
|
if( currentHud != NULL )
|
|
{
|
|
mHudMapIconID = currentHud->GetHudMap( 0 )->RegisterIcon( HudMapIcon::ICON_PURCHASE_CENTRE,
|
|
rmt::Vector( 0.0f, 0.0f, 0.0f ),
|
|
mpActionEventLocator );
|
|
rAssert( mHudMapIconID != -1 );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
// PurchaseReward::CanEnable
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ()
|
|
//
|
|
// Return: bool
|
|
//
|
|
//=============================================================================
|
|
bool PurchaseReward::CanEnable() const
|
|
{
|
|
return (!mAllPurchased && sbEnabled && GetGameplayManager()->IsSundayDrive() );
|
|
}
|
|
|
|
|
|
//=============================================================================
|
|
// PurchaseCar::PurchaseCar
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( ActionEventLocator* pActionEventLocator )
|
|
//
|
|
// Return: PurchaseCar
|
|
//
|
|
//=============================================================================
|
|
PurchaseCar::PurchaseCar( ActionEventLocator* pActionEventLocator ) :
|
|
PurchaseReward( pActionEventLocator )
|
|
{
|
|
rmt::Vector pos;
|
|
pActionEventLocator->GetLocation( &pos );
|
|
mIcon.Init( "dollar", pos ); //TODO: get the real icon in.
|
|
|
|
//
|
|
// Set up transitions
|
|
//
|
|
m_DisableInput.SetState( Input::ACTIVE_FRONTEND );
|
|
m_GotoLetterbox.SetScreen( CGuiWindow::GUI_SCREEN_ID_LETTER_BOX );
|
|
m_GotoLetterbox.SetWindowOptions( CLEAR_WINDOW_HISTORY );
|
|
m_ContextSwitch.SetContext( CONTEXT_PAUSE );
|
|
m_WaitForConversationDone.SetEvent( EVENT_CONVERSATION_DONE );
|
|
m_GotoHud.SetScreen( CGuiWindow::GUI_SCREEN_ID_HUD );
|
|
m_GotoHud.SetWindowOptions( FORCE_WINDOW_CHANGE_IMMEDIATE );
|
|
m_GotoScreen.SetScreen( CGuiWindow::GUI_SCREEN_ID_PURCHASE_REWARDS );
|
|
m_GotoScreen.SetWindowOptions( CLEAR_WINDOW_HISTORY );
|
|
|
|
m_GotoLetterbox.SetNextTransition( m_DisableInput );
|
|
m_DisableInput.SetNextTransition( m_WaitForConversationDone );
|
|
m_WaitForConversationDone.SetNextTransition( m_ContextSwitch );
|
|
// m_GotoHud.SetNextTransition( m_ContextSwitch ); // TC: no need to go to the HUD
|
|
m_ContextSwitch.SetNextTransition( m_GotoScreen );
|
|
m_GotoScreen.SetNextTransition( NULL );
|
|
}
|
|
|
|
//=============================================================================
|
|
// ::~PurchaseCar
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ()
|
|
//
|
|
// Return: PurchaseCar
|
|
//
|
|
//=============================================================================
|
|
PurchaseCar::~PurchaseCar()
|
|
{
|
|
}
|
|
|
|
//=============================================================================
|
|
// PurchaseCar::Create
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( tEntityStore* inStore )
|
|
//
|
|
// Return: bool
|
|
//
|
|
//=============================================================================
|
|
bool PurchaseCar::Create( tEntityStore* inStore )
|
|
{
|
|
CGuiScreenHud* currentHud = GetCurrentHud();
|
|
if( currentHud != NULL )
|
|
{
|
|
mHudMapIconID = currentHud->GetHudMap( 0 )->RegisterIcon( HudMapIcon::ICON_PURCHASE_CENTRE,
|
|
rmt::Vector( 0.0f, 0.0f, 0.0f ),
|
|
mpActionEventLocator );
|
|
}
|
|
|
|
//Should findout and fill in all the Car selection data here.
|
|
//Tony?
|
|
return true;
|
|
}
|
|
|
|
//=============================================================================
|
|
// PurchaseCar::OnButtonPressed
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( Character* pCharacter )
|
|
//
|
|
// Return: bool
|
|
//
|
|
//=============================================================================
|
|
bool PurchaseCar::OnButtonPressed( Character* pCharacter )
|
|
{
|
|
if( GetGuiSystem()->GetInGameManager()->IsEnteringPauseMenu() )
|
|
{
|
|
// if about to enter pause menu, ignore button press
|
|
//
|
|
return false;
|
|
}
|
|
|
|
int level;
|
|
GameplayManager* gameplayMgr = NULL;
|
|
|
|
//Purchase and load the car.
|
|
//Tony?
|
|
// switch to pause context
|
|
//
|
|
|
|
if ( mpActionEventLocator->GetUID() == GIL )
|
|
{
|
|
m_ContextSwitch.Activate();
|
|
m_GotoScreen.SetParam1( Merchandise::SELLER_GIL );
|
|
m_GotoScreen.Activate();
|
|
|
|
//
|
|
// Make Gil say something
|
|
//
|
|
GetEventManager()->TriggerEvent( EVENT_HAGGLING_WITH_GIL, GetCharacterManager()->GetCharacterByName( "reward_gil" ) );
|
|
}
|
|
else
|
|
{
|
|
m_GotoScreen.SetParam1( Merchandise::SELLER_SIMPSON );
|
|
//
|
|
// Start a conversation
|
|
//
|
|
gameplayMgr = GetGameplayManager();
|
|
rAssert( gameplayMgr != NULL );
|
|
|
|
level = gameplayMgr->GetCurrentLevelIndex() - RenderEnums::L1;
|
|
rAssert( ( level >= 0 ) && ( level <= 7 ) );
|
|
|
|
if( s_carPurchaseConvNames[level].convName != 0 )
|
|
{
|
|
DialogEventData data;
|
|
|
|
data.dialogName = s_carPurchaseConvNames[level].convName;
|
|
|
|
rAssert( pCharacter != NULL );
|
|
|
|
data.charUID1 = s_carPurchaseConvNames[level].sellerName;
|
|
data.charUID2 = pCharacter->GetUID();
|
|
|
|
GetEventManager()->TriggerEvent( EVENT_CONVERSATION_INIT_DIALOG, &data );
|
|
GetEventManager()->TriggerEvent( EVENT_CONVERSATION_START );
|
|
|
|
//
|
|
// make the two characters face one another
|
|
//
|
|
Character* c0 = GetCharacterManager()->GetCharacterByName( data.charUID1 );
|
|
Character* c1 = GetCharacterManager()->GetCharacterByName( data.charUID2 );
|
|
rAssertMsg( c0 != NULL, "Character's name is incorrect" );
|
|
rAssertMsg( c1 != NULL, "Character's name is incorrect" );
|
|
GetPresentationManager()->MakeCharactersFaceEachOther( c0, c1 );
|
|
|
|
CGuiScreenLetterBox::SuppressAcceptCancelButtons();
|
|
CGuiScreenLetterBox::ForceOpen();
|
|
m_GotoLetterbox.Activate();
|
|
}
|
|
else
|
|
{
|
|
m_ContextSwitch.Activate();
|
|
m_GotoScreen.Activate();
|
|
}
|
|
}
|
|
|
|
//Trickyness to get the carstart locator.
|
|
// We do some of the work here, then we will trigger an event to do the menu.
|
|
// The menu will trigger the loading.
|
|
//
|
|
tRefCounted::Assign( SummonVehiclePhone::sCallback.mpActionEventLocator, mpActionEventLocator );
|
|
|
|
|
|
return true;
|
|
}
|
|
|
|
//=============================================================================
|
|
// PurchaseCar::OnEnter
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( Character* pCharacter )
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void PurchaseCar::OnEnter( Character* pCharacter )
|
|
{
|
|
}
|
|
|
|
//=============================================================================
|
|
// PurchaseCar::OnExit
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( Character* pCharacter )
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void PurchaseCar::OnExit( Character* pCharacter )
|
|
{
|
|
}
|
|
|
|
//=============================================================================
|
|
// PurchaseCar::OnUpdate
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( float timeins )
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void PurchaseCar::OnUpdate( float timeins )
|
|
{
|
|
RenderEnums::LevelEnum currLev = GetGameplayManager()->GetCurrentLevelIndex();
|
|
RewardsManager* rm = GetRewardsManager();
|
|
|
|
Merchandise::eSellerType st = Merchandise::SELLER_GIL;
|
|
if ( mpActionEventLocator->GetUID() != GIL )
|
|
{
|
|
st = Merchandise::SELLER_SIMPSON;
|
|
}
|
|
|
|
//Test to see if the cars are all sold.
|
|
|
|
Merchandise* m = rm->FindFirstMerchandise( currLev, st );
|
|
|
|
mAllPurchased = true;
|
|
while ( m != NULL )
|
|
{
|
|
if ( !m->RewardStatus() )
|
|
{
|
|
//If one isn't purchased, we're not all purchased.
|
|
mAllPurchased = false;
|
|
break;
|
|
}
|
|
|
|
m = rm->FindNextMerchandise( currLev, st );
|
|
}
|
|
|
|
if ( mIsActive )
|
|
{
|
|
//Follow the character around.
|
|
const char* charName = mpActionEventLocator->GetJointName();
|
|
Character* character = GetCharacterManager()->GetCharacterByName( tEntity::MakeUID( charName ) );
|
|
rAssert( character );
|
|
|
|
rmt::Vector pos;
|
|
character->GetPosition( &pos );
|
|
mIcon.Move( pos );
|
|
|
|
mpActionEventLocator->SetLocation( pos );
|
|
mpActionEventLocator->GetTriggerVolume( 0 )->SetPosition( pos );
|
|
}
|
|
|
|
PurchaseReward::OnUpdate( timeins );
|
|
}
|
|
|
|
//=============================================================================
|
|
// PurchaseSkin::PurchaseSkin
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( ActionEventLocator* pActionEventLocator )
|
|
//
|
|
// Return: PurchaseSkin
|
|
//
|
|
//=============================================================================
|
|
PurchaseSkin::PurchaseSkin( ActionEventLocator* pActionEventLocator ) :
|
|
PurchaseReward( pActionEventLocator )
|
|
{
|
|
rmt::Vector pos;
|
|
pActionEventLocator->GetLocation( &pos );
|
|
mIcon.Init( "shirtdollar", pos ); //TODO: get the real icon in.
|
|
}
|
|
|
|
//=============================================================================
|
|
// ::~PurchaseSkin
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ()
|
|
//
|
|
// Return: PurchaseSkin
|
|
//
|
|
//=============================================================================
|
|
PurchaseSkin::~PurchaseSkin()
|
|
{
|
|
}
|
|
|
|
//=============================================================================
|
|
// PurchaseSkin::Create
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( tEntityStore* inStore )
|
|
//
|
|
// Return: bool
|
|
//
|
|
//=============================================================================
|
|
bool PurchaseSkin::Create( tEntityStore* inStore )
|
|
{
|
|
rmt::Vector pos;
|
|
rAssert( mpActionEventLocator != NULL );
|
|
mpActionEventLocator->GetPosition( &pos );
|
|
|
|
CGuiScreenHud* currentHud = GetCurrentHud();
|
|
if( currentHud != NULL )
|
|
{
|
|
mHudMapIconID = currentHud->GetHudMap( 0 )->RegisterIcon( HudMapIcon::ICON_PURCHASE_CENTRE,
|
|
pos );
|
|
}
|
|
|
|
GetActionButtonManager()->LoadingIntoInterior(); //HACK
|
|
|
|
return true;
|
|
}
|
|
|
|
//=============================================================================
|
|
// PurchaseSkin::OnButtonPressed
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( Character* pCharacter )
|
|
//
|
|
// Return: bool
|
|
//
|
|
//=============================================================================
|
|
bool PurchaseSkin::OnButtonPressed( Character* pCharacter )
|
|
{
|
|
if( GetGuiSystem()->GetInGameManager()->IsEnteringPauseMenu() )
|
|
{
|
|
// if about to enter pause menu, ignore button press
|
|
//
|
|
return false;
|
|
}
|
|
|
|
// switch to pause context
|
|
//
|
|
GetGameFlow()->SetContext( CONTEXT_PAUSE );
|
|
|
|
GetGuiSystem()->GotoScreen( CGuiWindow::GUI_SCREEN_ID_PURCHASE_REWARDS, Merchandise::SELLER_INTERIOR );
|
|
|
|
return true;
|
|
}
|
|
|
|
//=============================================================================
|
|
// PurchaseSkin::OnEnter
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( Character* pCharacter )
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void PurchaseSkin::OnEnter( Character* pCharacter )
|
|
{
|
|
}
|
|
|
|
//=============================================================================
|
|
// PurchaseSkin::OnExit
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( Character* pCharacter )
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void PurchaseSkin::OnExit( Character* pCharacter )
|
|
{
|
|
}
|
|
|
|
//=============================================================================
|
|
// PurchaseSkin::OnUpdate
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( float timeins )
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void PurchaseSkin::OnUpdate( float timeins )
|
|
{
|
|
RenderEnums::LevelEnum currLev = GetGameplayManager()->GetCurrentLevelIndex();
|
|
RewardsManager* rm = GetRewardsManager();
|
|
|
|
//Test to see if the skins are all sold.
|
|
/*
|
|
Merchandise* m = rm->FindFirstMerchandise( currLev, Merchandise::SELLER_INTERIOR );
|
|
|
|
/* mAllPurchased = true;
|
|
|
|
while ( m != NULL )
|
|
{
|
|
if ( !m->RewardStatus() )
|
|
{
|
|
//If one isn't purchased, we're not all purchased.
|
|
mAllPurchased = false;
|
|
break;
|
|
}
|
|
|
|
m = rm->FindNextMerchandise( currLev, Merchandise::SELLER_INTERIOR );
|
|
}
|
|
*/
|
|
PurchaseReward::OnUpdate( timeins );
|
|
}
|
|
|
|
}; // namespace ActionButton.
|