openmohaa/code/fgame/misc.h

604 lines
15 KiB
C
Raw Normal View History

2016-03-27 11:49:47 +02:00
/*
===========================================================================
Copyright (C) 2015 the OpenMoHAA team
This file is part of OpenMoHAA source code.
OpenMoHAA source code is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.
OpenMoHAA source code is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenMoHAA source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/
// misc.h:
// Basically the big stew pot of the DLLs, or maybe a garbage bin, whichever
// metaphore you prefer. This really should be cleaned up. Anyway, this
// should contain utility functions that could be used by any entity.
// Right now it contains everything from entities that could be in their
// own file to my mother pot roast recipes.
//
#ifndef __MISC_H__
#define __MISC_H__
#include "g_local.h"
#include "entity.h"
#include "mover.h"
#include "animate.h"
class InfoNull : public Entity
{
public:
CLASS_PROTOTYPE( InfoNull );
InfoNull();
};
class FuncRemove : public Entity
{
public:
CLASS_PROTOTYPE( FuncRemove );
FuncRemove();
};
class MiscModel : public Entity
{
public:
CLASS_PROTOTYPE( MiscModel );
MiscModel();
};
class InfoNotNull : public Entity
{
public:
CLASS_PROTOTYPE( InfoNotNull );
};
class ExplodingWall : public Trigger
{
protected:
int dmg;
int explosions;
float attack_finished;
Vector land_angles;
float land_radius;
float angle_speed;
int state;
Vector base_velocity;
Vector random_velocity;
Vector orig_mins, orig_maxs;
qboolean on_ground;
public:
CLASS_PROTOTYPE( ExplodingWall );
ExplodingWall();
void Setup( Event *ev );
void AngleSpeed( Event *ev );
void LandRadius( Event *ev );
void LandAngles( Event *ev );
void BaseVelocity( Event *ev );
void RandomVelocity( Event *ev );
void SetDmg( Event *ev );
void SetExplosions( Event *ev );
void SetupSecondStage( void );
void Explode( Event *ev );
void DamageEvent( Event *ev ) override;
2016-03-27 11:49:47 +02:00
void GroundDamage( Event *ev );
void TouchFunc( Event *ev );
void StopRotating( Event *ev );
void CheckOnGround( Event *ev );
void Archive( Archiver &arc ) override;
2016-03-27 11:49:47 +02:00
};
inline void ExplodingWall::Archive
(
Archiver &arc
)
{
Trigger::Archive( arc );
arc.ArchiveInteger( &dmg );
arc.ArchiveInteger( &explosions );
arc.ArchiveFloat( &attack_finished );
arc.ArchiveVector( &land_angles );
arc.ArchiveFloat( &land_radius );
arc.ArchiveFloat( &angle_speed );
arc.ArchiveInteger( &state );
arc.ArchiveVector( &base_velocity );
arc.ArchiveVector( &random_velocity );
arc.ArchiveVector( &orig_mins );
arc.ArchiveVector( &orig_maxs );
arc.ArchiveBoolean( &on_ground );
}
class Teleporter : public Trigger
{
public:
ScriptThreadLabel teleport_label;
qboolean in_use;
CLASS_PROTOTYPE( Teleporter );
Teleporter();
virtual void StartTeleport( Event *ev );
virtual void Teleport( Event *ev );
virtual void StopTeleport( Event *ev );
void SetThread( Event *ev );
void Archive( Archiver &arc ) override;
2016-03-27 11:49:47 +02:00
};
inline void Teleporter::Archive
(
Archiver &arc
)
{
Trigger::Archive( arc );
arc.ArchiveBoolean( &in_use );
}
class TeleporterDestination : public Entity
{
public:
Vector movedir;
CLASS_PROTOTYPE( TeleporterDestination );
TeleporterDestination();
void SetMoveDir( Event *ev );
void Archive( Archiver &arc ) override;
2016-03-27 11:49:47 +02:00
};
inline void TeleporterDestination::Archive
(
Archiver &arc
)
{
Entity::Archive( arc );
arc.ArchiveVector( &movedir );
}
class UseAnim : public Entity
{
public:
int count;
qboolean active;
ScriptThreadLabel thread;
str triggertarget;
int num_loops;
str state;
str camera;
str anim;
str key;
float delay;
float last_active_time;
CLASS_PROTOTYPE( UseAnim );
UseAnim();
virtual void Touched( Event *ev );
2016-03-27 11:49:47 +02:00
void Reset( Event *ev );
void SetThread( Event * ev );
void SetTriggerTarget( Event * ev );
void SetCount( Event * ev );
void SetAnim( Event *ev );
void SetState( Event *ev );
void SetKey( Event *ev );
void SetCamera( Event *ev );
void SetNumLoops( Event *ev );
void SetDelay( Event *ev );
bool canBeUsed( Entity *activator );
bool GetInformation( Entity *activator, Vector * org, Vector * angles, str * animatoin, int * loopcount, str * state, str * camera );
void TriggerTargets( Entity *activator );
void Archive( Archiver &arc ) override;
2016-03-27 11:49:47 +02:00
};
inline void UseAnim::Archive
(
Archiver &arc
)
{
Entity::Archive( arc );
arc.ArchiveInteger( &count );
arc.ArchiveBoolean( &active );
arc.ArchiveString( &triggertarget );
arc.ArchiveInteger( &num_loops );
arc.ArchiveString( &state );
arc.ArchiveString( &camera );
arc.ArchiveString( &anim );
arc.ArchiveString( &key );
arc.ArchiveFloat( &delay );
arc.ArchiveFloat( &last_active_time );
}
class TouchAnim : public UseAnim
{
public:
CLASS_PROTOTYPE( TouchAnim );
TouchAnim();
};
class UseAnimDestination : public Entity
{
public:
int num_loops;
str state;
str anim;
CLASS_PROTOTYPE( UseAnimDestination );
UseAnimDestination();
void SetAnim( Event *ev );
void SetState( Event *ev );
void SetNumLoops( Event *ev );
int GetNumLoops( void );
str GetAnim( void );
str GetState( void );
void Archive( Archiver &arc ) override;
2016-03-27 11:49:47 +02:00
};
inline void UseAnimDestination::Archive
(
Archiver &arc
)
{
Entity::Archive( arc );
arc.ArchiveInteger( &num_loops );
arc.ArchiveString( &state );
arc.ArchiveString( &anim );
}
class UseObject : public Animate
{
public:
ScriptThreadLabel move_thread;
ScriptThreadLabel stop_thread;
ScriptThreadLabel reset_thread;
str triggertarget;
Vector offset;
float yaw_offset;
int count;
float cone;
str state;
str state_backwards;
str useMaterial;
int objectState;
float reset_time;
qboolean active;
CLASS_PROTOTYPE( UseObject );
UseObject();
void SetMoveThread( Event * ev );
void SetStopThread( Event * ev );
void SetResetThread( Event * ev );
void SetTriggerTarget( Event * ev );
void SetOffset( Event * ev );
void SetYawOffset( Event * ev );
void SetCount( Event * ev );
void SetCone( Event * ev );
void SetState( Event * ev );
void SetBackwardsState( Event * ev );
void SetResetTime( Event * ev );
void Reset( Event * ev );
void Resetting( Event * ev );
void DamageTriggered( Event * ev );
void DamageFunc( Event * ev );
bool canBeUsed( Vector org, Vector dir );
void Setup( Entity *activator, Vector *org, Vector *ang, str *newstate );
void Start( Event * ev = NULL );
bool Loop( void );
void SetActiveState( Event *ev );
void Stop( Entity *activator );
void ActivateEvent( Event *ev );
void DeactivateEvent( Event *ev );
void UseMaterialEvent( Event *ev );
void Archive( Archiver &arc ) override;
2016-03-27 11:49:47 +02:00
};
inline void UseObject::Archive
(
Archiver &arc
)
{
Animate::Archive( arc );
arc.ArchiveString( &triggertarget );
arc.ArchiveVector( &offset );
arc.ArchiveFloat( &yaw_offset );
arc.ArchiveInteger( &count );
arc.ArchiveFloat( &cone );
arc.ArchiveString( &state );
arc.ArchiveString( &state_backwards );
arc.ArchiveString( &useMaterial );
arc.ArchiveInteger( &objectState );
arc.ArchiveFloat( &reset_time );
arc.ArchiveBoolean( &active );
}
class Waypoint : public SimpleArchivedEntity
{
public:
CLASS_PROTOTYPE( Waypoint );
};
class TempWaypoint : public SimpleArchivedEntity
{
public:
CLASS_PROTOTYPE( TempWaypoint );
};
class VehiclePoint : public Waypoint
{
public:
unsigned int spawnflags;
CLASS_PROTOTYPE( VehiclePoint );
void SetSpawnFlags( Event *ev );
void Archive( Archiver& arc ) override;
2016-03-27 11:49:47 +02:00
};
inline void VehiclePoint::Archive
(
Archiver &arc
)
{
SimpleArchivedEntity::Archive( arc );
arc.ArchiveUnsigned( &spawnflags );
}
class MonkeyBars : public Entity
{
public:
float dir;
CLASS_PROTOTYPE( MonkeyBars );
MonkeyBars();
void SetAngleEvent( Event *ev );
void Archive( Archiver &arc ) override;
2016-03-27 11:49:47 +02:00
};
inline void MonkeyBars::Archive
(
Archiver &arc
)
{
Entity::Archive( arc );
arc.ArchiveFloat( &dir );
}
class HorizontalPipe : public Entity
{
public:
float dir;
CLASS_PROTOTYPE( HorizontalPipe );
HorizontalPipe();
void SetAngleEvent( Event *ev );
void Archive( Archiver &arc ) override;
2016-03-27 11:49:47 +02:00
};
inline void HorizontalPipe::Archive
(
Archiver &arc
)
{
Entity::Archive( arc );
arc.ArchiveFloat( &dir );
}
class TossObject : public Animate
{
private:
str bouncesound;
float bouncesoundchance;
void Stop( Event *ev );
void Touch( Event *ev );
void SetBounceSound( Event *ev );
void SetBounceSoundChance( Event *ev );
public:
CLASS_PROTOTYPE( TossObject );
TossObject();
TossObject( str modelname );
void SetBounceSound( str bounce );
void SetBounceSoundChance( float chance );
void SetVelocity( float severity );
void Archive( Archiver &arc ) override;
2016-03-27 11:49:47 +02:00
};
inline void TossObject::Archive
(
Archiver &arc
)
{
Animate::Archive( arc );
arc.ArchiveString( &bouncesound );
arc.ArchiveFloat( &bouncesoundchance );
}
class PushObject : public Entity
{
private:
EntityPtr owner;
float attack_finished;
int dmg;
str pushsound;
public:
CLASS_PROTOTYPE( PushObject );
PushObject();
void Start( Event *ev );
void SetDamage( Event *ev );
void BlockFunc( Event *ev );
void SetPushSound( Event *ev );
qboolean Push( Entity *pusher, Vector move );
qboolean canPush( Vector dir );
Entity *getOwner( void );
void Archive( Archiver &arc ) override;
2016-03-27 11:49:47 +02:00
};
inline void PushObject::Archive
(
Archiver &arc
)
{
Entity::Archive( arc );
arc.ArchiveSafePointer( &owner );
arc.ArchiveFloat( &attack_finished );
arc.ArchiveInteger( &dmg );
arc.ArchiveString( &pushsound );
}
class FallingRock : public Entity
{
private:
int active;
Vector start_origin;
Vector last_bounce_origin;
Entity *current;
Entity *activator;
Vector bounce_dir;
Vector rotateaxis;
float attack_finished;
float wait;
float speed;
int dmg;
str bouncesound;
void Touch( Event *ev );
void Bounce( Event *ev );
void Rotate( Event *ev );
void Activate( Event *ev );
void NextBounce( void );
void StartFalling( Event *ev );
void SetWait( Event *ev );
void SetSpeed( Event *ev );
void SetDmg( Event *ev );
Entity *SetNextBounceDir( void );
void SetBounceSound( str sound );
void SetBounceSound( Event *ev );
void Archive( Archiver &arc ) override;
2016-03-27 11:49:47 +02:00
public:
CLASS_PROTOTYPE( FallingRock );
FallingRock();
};
inline void FallingRock::Archive
(
Archiver &arc
)
{
Entity::Archive( arc );
arc.ArchiveInteger( &active );
arc.ArchiveVector( &start_origin );
arc.ArchiveVector( &last_bounce_origin );
arc.ArchiveObjectPointer( ( Class ** )&current );
arc.ArchiveObjectPointer( ( Class ** )&activator );
arc.ArchiveVector( &bounce_dir );
arc.ArchiveVector( &rotateaxis );
arc.ArchiveFloat( &attack_finished );
arc.ArchiveFloat( &wait );
arc.ArchiveFloat( &speed );
arc.ArchiveInteger( &dmg );
arc.ArchiveString( &bouncesound );
if ( arc.Loading() )
{
SetBounceSound( bouncesound );
}
}
class SupplyWater : public Trigger
{
private:
int maxwater;
int amount;
public:
CLASS_PROTOTYPE( SupplyWater );
SupplyWater();
void Activate( Event *ev );
void MaxWater( Event *ev );
void ChargeOff( Event *ev );
void Archive( Archiver &arc ) override;
2016-03-27 11:49:47 +02:00
};
inline void SupplyWater::Archive
(
Archiver &arc
)
{
Trigger::Archive( arc );
arc.ArchiveInteger( &amount );
arc.ArchiveInteger( &maxwater );
}
class FuncLadder : public Entity {
private:
Vector m_vFacingAngles;
Vector m_vFacingDir;
public:
CLASS_PROTOTYPE( FuncLadder );
FuncLadder();
void LadderSetup( Event *ev );
qboolean CanUseLadder( Entity *pUser );
void PositionOnLadder( Entity *pUser );
void SetLadderFacing( Event *ev );
void AdjustPositionOnLadder( Entity *pUser );
void EnsureOverLadder( Entity *pUser );
void EnsureForwardOffLadder( Entity *pUser );
};
#endif /* misc.h */