quadrilateralcowboy/d3xp/rotdoor.cpp

104 lines
2.4 KiB
C++
Raw Normal View History

2020-06-12 21:06:25 +00:00
//Rotating door.
//Based on The Dark Mod's CBinaryFrobMover.
#include "../idlib/precompiled.h"
#pragma hdrstop
#include "Game_local.h"
const idEventDef EV_rotdoor_open( "open", NULL );
const idEventDef EV_rotdoor_close( "close", NULL );
const idEventDef EV_rotdoor_isOpen( "isOpen", NULL, 'f' );
CLASS_DECLARATION( idMover, idRotDoor )
EVENT( EV_rotdoor_open, idRotDoor::Event_Open )
EVENT( EV_rotdoor_close, idRotDoor::Event_Close )
EVENT( EV_rotdoor_isOpen, idRotDoor::Event_isOpen )
END_CLASS
void idRotDoor::Save( idSaveGame *savefile ) const
{
savefile->WriteBool(shouldOpen);
savefile->WriteAngles(m_Rotate);
savefile->WriteVec3(m_ClosedPos);
savefile->WriteVec3(m_OpenPos);
savefile->WriteVec3(m_OpenDir);
savefile->WriteAngles(m_ClosedAngles);
savefile->WriteAngles(m_OpenAngles);
}
void idRotDoor::Restore( idRestoreGame *savefile )
{
savefile->ReadBool(shouldOpen);
savefile->ReadAngles(m_Rotate);
savefile->ReadVec3(m_ClosedPos);
savefile->ReadVec3(m_OpenPos);
savefile->ReadVec3(m_OpenDir);
savefile->ReadAngles(m_ClosedAngles);
savefile->ReadAngles(m_OpenAngles);
}
void idRotDoor::Spawn( void )
{
m_Rotate = spawnArgs.GetAngles("rotate", "0 90 0");
m_ClosedAngles = physicsObj.GetLocalAngles();
m_ClosedAngles.Normalize180();
m_OpenAngles = (m_ClosedAngles + m_Rotate).Normalize180();
idRotation rot = m_Rotate.ToRotation();
idVec3 rotationAxis = rot.GetVec();
idVec3 normal = rotationAxis.Cross(m_ClosedPos);
m_OpenDir = (m_OpenPos * normal) * normal;
m_OpenDir.Normalize();
this->shouldOpen = true;
}
void idRotDoor::Event_isOpen( void )
{
idThread::ReturnInt( IsOpen() );
}
bool idRotDoor::IsOpen( void )
{
return ( !this->shouldOpen );
}
void idRotDoor::Event_Activate( idEntity *activator )
{
idAngles targetAngles = this->shouldOpen ? m_OpenAngles : m_ClosedAngles;
idAngles angleDelta = (targetAngles - physicsObj.GetLocalAngles()).Normalize180();
if (!angleDelta.Compare(idAngles(0,0,0)))
{
Event_RotateOnce(angleDelta);
if (this->shouldOpen)
{
StartSound( "snd_open", SND_CHANNEL_ANY, 0, false, NULL );
Signal( SIG_MOVER_1TO2 );
}
else
StartSound( "snd_close", SND_CHANNEL_ANY, 0, false, NULL );
}
this->shouldOpen = !this->shouldOpen;
}
void idRotDoor::Event_Open( void )
{
this->shouldOpen = true;
this->Event_Activate( NULL );
}
void idRotDoor::Event_Close( void )
{
this->shouldOpen = false;
this->Event_Activate( NULL );
}