mirror of
https://github.com/dhewm/dhewm3.git
synced 2024-11-30 16:11:11 +00:00
736ec20d4d
Don't include the lazy precompiled.h everywhere, only what's required for the compilation unit. platform.h needs to be included instead to provide all essential defines and types. All includes use the relative path to the neo or the game specific root. Move all idlib related includes from idlib/Lib.h to precompiled.h. precompiled.h still exists for the MFC stuff in tools/. Add some missing header guards.
222 lines
7.5 KiB
C++
222 lines
7.5 KiB
C++
/*
|
|
===========================================================================
|
|
|
|
Doom 3 GPL Source Code
|
|
Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
|
|
|
|
This file is part of the Doom 3 GPL Source Code ("Doom 3 Source Code").
|
|
|
|
Doom 3 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 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
Doom 3 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 Doom 3 Source Code. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below.
|
|
|
|
If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
|
|
|
|
===========================================================================
|
|
*/
|
|
|
|
#ifndef __GAME_MOVEABLE_H__
|
|
#define __GAME_MOVEABLE_H__
|
|
|
|
#include "physics/Physics_RigidBody.h"
|
|
#include "script/Script_Thread.h"
|
|
#include "gamesys/Event.h"
|
|
#include "Entity.h"
|
|
#include "Player.h"
|
|
#include "Projectile.h"
|
|
|
|
/*
|
|
===============================================================================
|
|
|
|
Entity using rigid body physics.
|
|
|
|
===============================================================================
|
|
*/
|
|
|
|
extern const idEventDef EV_BecomeNonSolid;
|
|
extern const idEventDef EV_IsAtRest;
|
|
|
|
class idMoveable : public idEntity {
|
|
public:
|
|
CLASS_PROTOTYPE( idMoveable );
|
|
|
|
idMoveable( void );
|
|
~idMoveable( void );
|
|
|
|
void Spawn( void );
|
|
|
|
void Save( idSaveGame *savefile ) const;
|
|
void Restore( idRestoreGame *savefile );
|
|
|
|
virtual void Think( void );
|
|
|
|
virtual void Hide( void );
|
|
virtual void Show( void );
|
|
|
|
bool AllowStep( void ) const;
|
|
void EnableDamage( bool enable, float duration );
|
|
virtual bool Collide( const trace_t &collision, const idVec3 &velocity );
|
|
virtual void Killed( idEntity *inflictor, idEntity *attacker, int damage, const idVec3 &dir, int location );
|
|
virtual void WriteToSnapshot( idBitMsgDelta &msg ) const;
|
|
virtual void ReadFromSnapshot( const idBitMsgDelta &msg );
|
|
|
|
#ifdef _D3XP
|
|
void SetAttacker( idEntity *ent );
|
|
#endif
|
|
|
|
protected:
|
|
idPhysics_RigidBody physicsObj; // physics object
|
|
idStr brokenModel; // model set when health drops down to or below zero
|
|
idStr damage; // if > 0 apply damage to hit entities
|
|
#ifdef _D3XP
|
|
idStr monsterDamage;
|
|
idEntity *attacker;
|
|
#endif
|
|
idStr fxCollide; // fx system to start when collides with something
|
|
int nextCollideFxTime; // next time it is ok to spawn collision fx
|
|
float minDamageVelocity; // minimum velocity before moveable applies damage
|
|
float maxDamageVelocity; // velocity at which the maximum damage is applied
|
|
idCurve_Spline<idVec3> *initialSpline; // initial spline path the moveable follows
|
|
idVec3 initialSplineDir; // initial relative direction along the spline path
|
|
bool explode; // entity explodes when health drops down to or below zero
|
|
bool unbindOnDeath; // unbind from master when health drops down to or below zero
|
|
bool allowStep; // allow monsters to step on the object
|
|
bool canDamage; // only apply damage when this is set
|
|
int nextDamageTime; // next time the movable can hurt the player
|
|
int nextSoundTime; // next time the moveable can make a sound
|
|
|
|
const idMaterial * GetRenderModelMaterial( void ) const;
|
|
void BecomeNonSolid( void );
|
|
void InitInitialSpline( int startTime );
|
|
bool FollowInitialSplinePath( void );
|
|
|
|
void Event_Activate( idEntity *activator );
|
|
void Event_BecomeNonSolid( void );
|
|
void Event_SetOwnerFromSpawnArgs( void );
|
|
void Event_IsAtRest( void );
|
|
void Event_EnableDamage( float enable );
|
|
};
|
|
|
|
|
|
/*
|
|
===============================================================================
|
|
|
|
A barrel using rigid body physics. The barrel has special handling of
|
|
the view model orientation to make it look like it rolls instead of slides.
|
|
|
|
===============================================================================
|
|
*/
|
|
|
|
class idBarrel : public idMoveable {
|
|
|
|
public:
|
|
CLASS_PROTOTYPE( idBarrel );
|
|
idBarrel();
|
|
|
|
void Spawn( void );
|
|
|
|
void Save( idSaveGame *savefile ) const;
|
|
void Restore( idRestoreGame *savefile );
|
|
|
|
void BarrelThink( void );
|
|
virtual void Think( void );
|
|
virtual bool GetPhysicsToVisualTransform( idVec3 &origin, idMat3 &axis );
|
|
virtual void ClientPredictionThink( void );
|
|
|
|
private:
|
|
float radius; // radius of barrel
|
|
int barrelAxis; // one of the coordinate axes the barrel cylinder is parallel to
|
|
idVec3 lastOrigin; // origin of the barrel the last think frame
|
|
idMat3 lastAxis; // axis of the barrel the last think frame
|
|
float additionalRotation; // additional rotation of the barrel about it's axis
|
|
idMat3 additionalAxis; // additional rotation axis
|
|
};
|
|
|
|
|
|
/*
|
|
===============================================================================
|
|
|
|
A barrel using rigid body physics and special handling of the view model
|
|
orientation to make it look like it rolls instead of slides. The barrel
|
|
can burn and explode when damaged.
|
|
|
|
===============================================================================
|
|
*/
|
|
|
|
class idExplodingBarrel : public idBarrel {
|
|
public:
|
|
CLASS_PROTOTYPE( idExplodingBarrel );
|
|
|
|
idExplodingBarrel();
|
|
~idExplodingBarrel();
|
|
|
|
void Spawn( void );
|
|
|
|
void Save( idSaveGame *savefile ) const;
|
|
void Restore( idRestoreGame *savefile );
|
|
|
|
#ifdef _D3XP
|
|
bool IsStable( void );
|
|
void SetStability( bool stability );
|
|
void StartBurning( void );
|
|
void StopBurning( void );
|
|
#endif
|
|
|
|
virtual void Think( void );
|
|
virtual void Damage( idEntity *inflictor, idEntity *attacker, const idVec3 &dir,
|
|
const char *damageDefName, const float damageScale, const int location );
|
|
virtual void Killed( idEntity *inflictor, idEntity *attacker, int damage, const idVec3 &dir, int location );
|
|
|
|
virtual void WriteToSnapshot( idBitMsgDelta &msg ) const;
|
|
virtual void ReadFromSnapshot( const idBitMsgDelta &msg );
|
|
virtual bool ClientReceiveEvent( int event, int time, const idBitMsg &msg );
|
|
|
|
enum {
|
|
EVENT_EXPLODE = idEntity::EVENT_MAXEVENTS,
|
|
EVENT_MAXEVENTS
|
|
};
|
|
|
|
private:
|
|
typedef enum {
|
|
NORMAL = 0,
|
|
BURNING,
|
|
BURNEXPIRED,
|
|
EXPLODING
|
|
} explode_state_t;
|
|
explode_state_t state;
|
|
|
|
idVec3 spawnOrigin;
|
|
idMat3 spawnAxis;
|
|
qhandle_t particleModelDefHandle;
|
|
qhandle_t lightDefHandle;
|
|
renderEntity_t particleRenderEntity;
|
|
renderLight_t light;
|
|
int particleTime;
|
|
int lightTime;
|
|
float time;
|
|
#ifdef _D3XP
|
|
bool isStable;
|
|
#endif
|
|
|
|
void AddParticles( const char *name, bool burn );
|
|
void AddLight( const char *name , bool burn );
|
|
void ExplodingEffects( void );
|
|
|
|
void Event_Activate( idEntity *activator );
|
|
void Event_Respawn();
|
|
void Event_Explode();
|
|
void Event_TriggerTargets();
|
|
};
|
|
|
|
#endif /* !__GAME_MOVEABLE_H__ */
|