sin-2015/doors.h
1999-04-22 00:00:00 +00:00

393 lines
9.7 KiB
C++

//-----------------------------------------------------------------------------
//
// $Logfile:: /Quake 2 Engine/Sin/code/game/doors.h $
// $Revision:: 26 $
// $Author:: Jimdose $
// $Date:: 11/08/98 10:50p $
//
// Copyright (C) 1997 by Ritual Entertainment, Inc.
// All rights reserved.
//
// This source is may not be distributed and/or modified without
// expressly written permission by Ritual Entertainment, Inc.
//
// $Log:: /Quake 2 Engine/Sin/code/game/doors.h $
//
// 26 11/08/98 10:50p Jimdose
// reordered archived variables so that they match the order in the struct
//
// 25 10/25/98 11:53p Jimdose
// added EXPORT_TEMPLATE
//
// 24 10/23/98 11:10p Jimdose
// removed trigger_finished
//
// 23 10/21/98 10:58p Jimdose
// fixed (hopefully) most of the door bugs
//
// 22 9/29/98 5:58p Markd
// put in archive and unarchive
//
// 21 9/03/98 9:07p Jimdose
// Added CanBeOpenedBy so that the AI can check if a door is useable by an
// actor
// changed owner to master
// Fixed bug with doors that don't stop
// opened doors can be used again to close them
// fixed door blocked
//
// 20 8/28/98 4:14p Markd
// Added sound_locked to doors
//
// 19 8/24/98 6:10p Markd
// removed dmg from doors
//
// 18 8/21/98 3:48p Markd
// Added openthread and closethread events
//
// 17 8/21/98 1:43a Markd
// Added full ScriptDoor functionality
//
// 16 7/26/98 3:40p Jimdose
// made locked public
//
// 15 7/10/98 2:09p Markd
// Added locking capability to doors
//
// 14 6/25/98 8:48p Markd
// Rewrote Item class, added keyed items to triggers, cleaned up item system
//
// 13 6/24/98 8:45p Markd
// Rewrote Door Code
//
// 12 5/13/98 4:54p Jimdose
// now uses SafePtrs
//
// 11 4/30/98 9:24p Jimdose
// Changed use of string to str class
//
// 10 3/29/98 9:38p Jimdose
// Changed killed to an event
//
// 9 3/23/98 1:33p Jimdose
// Revamped event and command system
//
// 8 3/11/98 2:25p Jimdose
// Updated to work with areaportals
//
// 7 3/07/98 5:06p Jimdose
// Converted to Quake2
//
// 5 12/06/97 4:50p Markd
// Added interpretCommands.
// Added GetArgs as commands for future processing
// Removed dmg,attentuatioin and volume, moved these to Trigger
//
// 4 10/27/97 2:50p Jimdose
// Removed dependency on quakedef.h
//
// 3 10/27/97 2:38p Jimdose
// Changed nextdoor from a Door * into an int.
//
// 2 9/26/97 5:23p Jimdose
// Added standard Ritual headers
//
// DESCRIPTION:
// Doors are environment objects that slide open when activated by triggers
// or when used by the player.
//
#ifndef __DOORS_H__
#define __DOORS_H__
#include "g_local.h"
#include "entity.h"
#include "trigger.h"
#include "scriptslave.h"
extern Event EV_Door_TryOpen;
extern Event EV_Door_GoDown;
extern Event EV_Door_GoUp;
extern Event EV_Door_HitBottom;
extern Event EV_Door_HitTop;
extern Event EV_Door_Fire;
extern Event EV_Door_Link;
extern Event EV_Door_SetSpeed;
extern Event EV_Door_Lock;
extern Event EV_Door_Unlock;
extern Event EV_Door_RespondTo;//###
class Door;
#ifdef EXPORT_TEMPLATE
template class EXPORT_FROM_DLL SafePtr<Door>;
#endif
typedef SafePtr<Door> DoorPtr;
class EXPORT_FROM_DLL Door : public ScriptSlave
{
protected:
str sound_stop;
str sound_move;
str sound_message;
str sound_locked;
//###
str sound_close_stop;
str sound_close_move;
//###
float lastblocktime;
float angle;
Vector dir;
Vector doormin;
Vector doormax;
float diropened;
int state;
int previous_state;
int trigger;
int nextdoor;
DoorPtr master;
//###
qboolean preciseopen;
float trigdist;
//###
void OpenEnd( Event *ev );
void CloseEnd( Event *ev );
void Close( Event *ev );
void Open( Event *ev );
void DoorUse( Event *ev );
void DoorFire( Event *ev );
void DoorBlocked( Event *ev );
void FieldTouched( Event *ev );
void TryOpen( Event *ev );
void SpawnTriggerField( Vector fmins, Vector fmaxs );
qboolean DoorTouches( Door *e1 );
void LinkDoors( Event *ev );
void SetTime( Event *ev );
void LockDoor( Event *ev );
void UnlockDoor( Event *ev );
void RespondTo( Event *ev );//###
public:
CLASS_PROTOTYPE( Door );
qboolean locked;
Door();
qboolean isOpen( void );
qboolean CanBeOpenedBy( Entity *ent );
virtual void Archive( Archiver &arc );
virtual void Unarchive( Archiver &arc );
};
inline EXPORT_FROM_DLL void Door::Archive
(
Archiver &arc
)
{
ScriptSlave::Archive( arc );
arc.WriteString( sound_stop );
arc.WriteString( sound_move );
arc.WriteString( sound_message );
arc.WriteString( sound_locked );
arc.WriteFloat( lastblocktime );
arc.WriteFloat( angle );
arc.WriteVector( dir );
arc.WriteVector( doormin );
arc.WriteVector( doormax );
arc.WriteFloat( diropened );
arc.WriteInteger( state );
arc.WriteInteger( previous_state );
arc.WriteInteger( trigger );
arc.WriteInteger( nextdoor );
arc.WriteSafePointer( master );
arc.WriteBoolean( locked );
//###
arc.WriteString(sound_close_stop);
arc.WriteString(sound_close_move);
arc.WriteBoolean(preciseopen);
arc.WriteFloat(trigdist);
//###
}
inline EXPORT_FROM_DLL void Door::Unarchive
(
Archiver &arc
)
{
ScriptSlave::Unarchive( arc );
arc.ReadString( &sound_stop );
arc.ReadString( &sound_move );
arc.ReadString( &sound_message );
arc.ReadString( &sound_locked );
arc.ReadFloat( &lastblocktime );
arc.ReadFloat( &angle );
arc.ReadVector( &dir );
arc.ReadVector( &doormin );
arc.ReadVector( &doormax );
arc.ReadFloat( &diropened );
arc.ReadInteger( &state );
arc.ReadInteger( &previous_state );
arc.ReadInteger( &trigger );
arc.ReadInteger( &nextdoor );
arc.ReadSafePointer( &master );
arc.ReadBoolean( &locked );
//###
arc.ReadString(&sound_close_stop);
arc.ReadString(&sound_close_move);
arc.ReadBoolean(&preciseopen);
arc.ReadFloat(&trigdist);
//###
}
class EXPORT_FROM_DLL SlidingDoor : public Door
{
protected:
float totalmove;
float lip;
Vector pos1;
Vector pos2;
public:
CLASS_PROTOTYPE( SlidingDoor );
void DoOpen( Event *ev );
void DoClose( Event *ev );
virtual void Archive( Archiver &arc );
virtual void Unarchive( Archiver &arc );
SlidingDoor();
};
inline EXPORT_FROM_DLL void SlidingDoor::Archive
(
Archiver &arc
)
{
Door::Archive( arc );
arc.WriteFloat( totalmove );
arc.WriteFloat( lip );
arc.WriteVector( pos1 );
arc.WriteVector( pos2 );
}
inline EXPORT_FROM_DLL void SlidingDoor::Unarchive
(
Archiver &arc
)
{
Door::Unarchive( arc );
arc.ReadFloat( &totalmove );
arc.ReadFloat( &lip );
arc.ReadVector( &pos1 );
arc.ReadVector( &pos2 );
}
class EXPORT_FROM_DLL RotatingDoor : public Door
{
protected:
float angle;
Vector startangle;
int init_door_direction;
Vector onewayangles; //###
public:
CLASS_PROTOTYPE( RotatingDoor );
void DoOpen( Event *ev );
void DoClose( Event *ev );
virtual void Archive( Archiver &arc );
virtual void Unarchive( Archiver &arc );
RotatingDoor();
};
inline EXPORT_FROM_DLL void RotatingDoor::Archive
(
Archiver &arc
)
{
Door::Archive( arc );
arc.WriteFloat( angle );
arc.WriteVector( startangle );
arc.WriteInteger( init_door_direction );
arc.WriteVector( onewayangles ); //###
}
inline EXPORT_FROM_DLL void RotatingDoor::Unarchive
(
Archiver &arc
)
{
Door::Unarchive( arc );
arc.ReadFloat( &angle );
arc.ReadVector( &startangle );
arc.ReadInteger( &init_door_direction );
arc.ReadVector( &onewayangles ); //###
}
class EXPORT_FROM_DLL ScriptDoor : public Door
{
protected:
ThreadPtr doorthread;
str initthreadname;
str openthreadname;
str closethreadname;
float doorsize;
Vector startangle;
Vector startorigin;
Vector movedir;
public:
CLASS_PROTOTYPE( ScriptDoor );
void DoInit( Event *ev );
void DoOpen( Event *ev );
void DoClose( Event *ev );
void SetOpenThread( Event *ev );
void SetCloseThread( Event *ev );
virtual void Archive( Archiver &arc );
virtual void Unarchive( Archiver &arc );
ScriptDoor();
};
inline EXPORT_FROM_DLL void ScriptDoor::Archive
(
Archiver &arc
)
{
Door::Archive( arc );
arc.WriteSafePointer( doorthread );
arc.WriteString( initthreadname );
arc.WriteString( openthreadname );
arc.WriteString( closethreadname );
arc.WriteFloat( doorsize );
arc.WriteVector( startangle );
arc.WriteVector( startorigin );
arc.WriteVector( movedir );
}
inline EXPORT_FROM_DLL void ScriptDoor::Unarchive
(
Archiver &arc
)
{
Door::Unarchive( arc );
arc.ReadSafePointer( &doorthread );
arc.ReadString( &initthreadname );
arc.ReadString( &openthreadname );
arc.ReadString( &closethreadname );
arc.ReadFloat( &doorsize );
arc.ReadVector( &startangle );
arc.ReadVector( &startorigin );
arc.ReadVector( &movedir );
}
#endif /* doors.h */