sin-sdk/surface.h

256 lines
6.8 KiB
C++

//-----------------------------------------------------------------------------
//
// $Logfile:: /Quake 2 Engine/Sin/code/game/surface.h $
// $Revision:: 19 $
// $Author:: Jimdose $
// $Date:: 10/25/98 11:53p $
//
// Copyright (C) 1998 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/surface.h $
//
// 19 10/25/98 11:53p Jimdose
// added EXPORT_TEMPLATE
//
// 18 10/20/98 8:26p Markd
// Added Attacker to DamageSurface stuff
//
// 17 10/10/98 9:59p Jimdose
// made savegames work with surfaces
//
// 16 10/05/98 11:02p Jimdose
// Added destructor
// Made Reset free up all surfaces
//
// 15 9/21/98 10:15p Markd
// Putting archiving and unarchiving functions in
//
// 14 9/21/98 4:21p Markd
// Put in archive functions and rewrote all archive routines
//
// 13 9/18/98 8:14p Markd
// rewrote surface system so that surfaces are now damaged by surface name
// instead of by surfinfo
//
// 12 8/31/98 7:45p Aldie
// Updated surface data structure and removed surfinfo field
//
// 11 8/29/98 9:53p Jimdose
// moved prototype of CreateSurfaces from g_local.h
//
// 10 6/08/98 7:23p Aldie
// Added damage command back in
//
// 9 5/25/98 2:29p Aldie
// Fixed issues with not loading game dll
//
// 8 5/24/98 9:00p Jimdose
// made SetName us G_CopyString to allocate a string
//
// 7 5/24/98 4:48p Jimdose
// Made char *'s const
//
// 6 5/13/98 4:47p Aldie
// Update damage surfaces
//
// 5 5/05/98 2:44p Aldie
// Added server side surface states
//
// 3 5/04/98 8:12p Aldie
// Added texture states.
//
// 2 3/23/98 1:33p Jimdose
// Revamped event and command system
//
// DESCRIPTION:
// Controls surfaces
//
#ifndef __SURFACE_H__
#define __SURFACE_H__
#include "g_local.h"
#include "listener.h"
extern Event EV_Surface_TransOn;
extern Event EV_Surface_TransOff;
extern Event EV_Surface_TransToggle;
extern Event EV_Surface_TransMag;
extern Event EV_Surface_Translucence;
extern Event EV_Surface_Magnitude;
extern Event EV_Surface_Frequency;
extern Event EV_Surface_TransAngle;
extern Event EV_Surface_DamageFrame;
class EXPORT_FROM_DLL Surface : public Class
{
private:
str surface_name;
int surface_number;
int damage;
int state;
int threshold;
int numframes;
int style;
public:
CLASS_PROTOTYPE( Surface );
const char *SurfaceName() {return surface_name.c_str();}
int SurfaceNumber() {return surface_number;};
int Damage() {return damage;};
int State() {return state;};
int Threshold() {return threshold;};
int NumFrames() {return numframes;};
int LightStyle() {return style;};
void SetThreshold(int num) {threshold = num;};
void SetNumFrames(int num) {numframes = num;};
void SetLightStyle(int num) {style = num;};
void SetDamage(int num) {damage = num;};
void SetNumber(int num) {surface_number = num;};
void SetState(int num) {state = num;};
void SetName(const char *surf_name)
{
surface_name = str( surf_name );
};
virtual void Archive( Archiver &arc );
virtual void Unarchive( Archiver &arc );
};
inline EXPORT_FROM_DLL void Surface::Archive
(
Archiver &arc
)
{
arc.WriteInteger( damage );
arc.WriteInteger( state );
}
inline EXPORT_FROM_DLL void Surface::Unarchive
(
Archiver &arc
)
{
arc.ReadInteger( &damage );
arc.ReadInteger( &state );
}
#ifdef EXPORT_TEMPLATE
template class EXPORT_FROM_DLL Container<Surface *>;
#endif
class EXPORT_FROM_DLL SurfaceModifier : public Listener
{
private:
Container<Surface *> surfaceList;
void DoDamage ( trace_t * trace, const char * group_name, float damage, Entity * attacker = world );
public:
CLASS_PROTOTYPE( SurfaceModifier );
~SurfaceModifier();
void CreateSurface (const char *surf_name, csurface_t *surfinfo);
int AddSurface(Surface *surf);
void RemoveSurface(const char *surf_name);
int SurfaceExists(const char *surf_name);
Surface *GetSurface(const char *surf_name);
void DamageSurface( trace_t * trace, float damage, Entity * attacker );
void Reset();
void TranslationOn(Event *ev);
void TranslationOff(Event *ev);
void TranslationToggle(Event *ev);
void SetTranslationMagnitude(Event *ev);
void SetTranslationAngle(Event *ev);
void SetTranslucence(Event *ev);
void SetMagnitude(Event *ev);
void SetFrequency(Event *ev);
void SetDamageFrame(Event *ev);
void SetDamage(Event *ev);
virtual void Archive( Archiver &arc );
virtual void Unarchive( Archiver &arc );
};
inline EXPORT_FROM_DLL void SurfaceModifier::Archive
(
Archiver &arc
)
{
int i;
Surface * surf;
netsurface_t *s;
int num;
Listener::Archive( arc );
num = surfaceList.NumObjects();
arc.WriteInteger( num );
for( i = 1; i <= num; i++ )
{
//
// we only save out the dynamic fields
//
surf = surfaceList.ObjectAt( i );
arc.WriteObject( surf );
}
// write the surface states
s = g_surfaces;
for( i = 0; i < game.maxsurfaces; i++, s++ )
{
arc.WriteBoolean( s->inuse );
if ( s->inuse )
{
arc.WriteRaw( &s->s, sizeof( s->s ) );
}
}
}
inline EXPORT_FROM_DLL void SurfaceModifier::Unarchive
(
Archiver &arc
)
{
int i;
Surface *surf;
netsurface_t *s;
int num;
char *name;
Listener::Unarchive( arc );
// get the number
arc.ReadInteger( &num );
for( i = 1; i <= num; i++ )
{
//
// we only read in the dynamic fields
//
surf = surfaceList.ObjectAt( i );
arc.ReadObject( surf );
}
// read the surface states
s = g_surfaces;
for( i = 0; i < game.maxsurfaces; i++, s++ )
{
arc.ReadBoolean( &s->inuse );
if ( s->inuse )
{
name = s->s.name;
arc.ReadRaw( &s->s, sizeof( s->s ) );
s->s.name = name;
}
}
}
extern SurfaceModifier surfaceManager;
extern "C" void CreateSurfaces( csurface_t *surfaces, int count );
#endif /* surface.h */