You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
368 lines
8.1 KiB
368 lines
8.1 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#ifndef TF_WHEEL_OF_DOOM_H |
|
#define TF_WHEEL_OF_DOOM_H |
|
#pragma once |
|
|
|
#include "GameEventListener.h" |
|
|
|
// Client specific. |
|
#ifdef CLIENT_DLL |
|
#define CWheelOfDoom C_WheelOfDoom |
|
#endif |
|
|
|
enum eWheelOfDoomEffectSkinIndex |
|
{ |
|
EFFECT_WHAMMY = 1, |
|
EFFECT_JUMP_HEIGHT, |
|
EFFECT_SMALL_HEAD, |
|
EFFECT_SPEED, |
|
EFFECT_LOW_GRAVITY, |
|
EFFECT_BIG_HEAD, |
|
EFFECT_UBER, |
|
EFFECT_CRITS, |
|
EFFECT_DANCE, |
|
EFFECT_BASEBALLS, |
|
EFFECT_DECAPITATE, |
|
EFFECT_BARS, |
|
EFFECT_BELLS, |
|
EFFECT_SEVENS, |
|
EFFECT_CHERRIES, |
|
|
|
EFFECT_COUNT |
|
}; |
|
|
|
|
|
#ifdef GAME_DLL |
|
|
|
class CWheelOfDoomSpiral; |
|
|
|
//============================================================================= |
|
// |
|
// Wheel of doom class |
|
// |
|
class CWheelOfDoom : public CBaseAnimating, public CGameEventListener |
|
{ |
|
public: |
|
DECLARE_CLASS( CWheelOfDoom, CBaseAnimating ); |
|
DECLARE_DATADESC(); |
|
|
|
|
|
CWheelOfDoom( void ); |
|
~CWheelOfDoom( void ); |
|
|
|
// Initialization |
|
virtual void Spawn( void ); |
|
virtual void Precache( void ); |
|
|
|
// Thinks |
|
void IdleThink( void ); |
|
void SpinThink( void ); |
|
|
|
virtual void FireGameEvent( IGameEvent *gameEvent ); |
|
|
|
void StartSpin( void ); |
|
void Spin( inputdata_t& inputdata ); |
|
void ClearAllEffects( inputdata_t& inputdata ); |
|
bool IsDoneBoardcastingEffectSound() const; |
|
|
|
float GetDuration() const { return m_flDuration; } |
|
|
|
void DBG_ApplyEffectByName( const char* pszEffectName ); |
|
|
|
private: |
|
|
|
enum eEffectProperty |
|
{ |
|
PROPERTY_WHAMMY, |
|
PROPERTY_DOES_NOT_REAPPLY_ON_SPAWN |
|
}; |
|
|
|
struct EffectData_t |
|
{ |
|
CUtlVector<CTFPlayer*> m_vecPlayers; |
|
CWheelOfDoom* m_pWheel; |
|
}; |
|
|
|
struct EffectManager; |
|
class WOD_BaseEffect |
|
{ |
|
public: |
|
WOD_BaseEffect(); |
|
|
|
virtual void InitEffect( float flDefaultDuration ); |
|
|
|
virtual void ActivateEffect( EffectData_t& data ) {}; |
|
virtual void UpdateEffect( EffectData_t& data ) {}; |
|
virtual void DeactivateEffect( EffectData_t& data ) {}; |
|
|
|
void SetListFlags( int iFlags ); |
|
int GetListFlags() const { return m_iListFlags; } |
|
const char* GetName() { return m_pszName; } |
|
eWheelOfDoomEffectSkinIndex GetSkinIndex() const { return m_nSkin; } |
|
protected: |
|
|
|
eWheelOfDoomEffectSkinIndex m_nSkin; |
|
float m_flExpireTime; |
|
const char* m_pszEffectAnnouncementSound; |
|
int m_iListFlags; |
|
|
|
const char* m_pszName; |
|
|
|
friend struct EffectManager; |
|
}; |
|
|
|
struct EffectManager |
|
{ |
|
public: |
|
explicit EffectManager( CWheelOfDoom* pWheel ) { m_pWheel = pWheel; } |
|
~EffectManager(); |
|
|
|
int AddEffect( WOD_BaseEffect* pEffect, float flDefaultDuration ); |
|
void ApplyAllEffectsToPlayer( CTFPlayer* pPlayer ); |
|
void ClearEffects(); |
|
bool UpdateAndClearExpiredEffects(); |
|
void Precache(); |
|
|
|
private: |
|
CWheelOfDoom* m_pWheel; |
|
CUtlVector<WOD_BaseEffect*> m_vecActiveEffects; |
|
} m_EffectManager; |
|
|
|
WOD_BaseEffect* GetRandomEffectWithFlags(); |
|
void EndSpin(); |
|
|
|
CUtlVector<WOD_BaseEffect*> m_vecEffects; |
|
|
|
void RegisterEffect( WOD_BaseEffect* pEffect, int nFlags = 0 ); |
|
|
|
static void ApplyAttributeToAllPlayers( const char* pszAttribName, float flValue ); |
|
static void ApplyAttributeToPlayer( CTFPlayer* pPlayer, const char* pszAttribName, float flValue ); |
|
static void RemoveAttributeFromAllPlayers( const char* pszAttribName ); |
|
static void RemoveAttributeFromPlayer( CTFPlayer* pPlayer, const char* pszAttribName ); |
|
|
|
static void SpeakMagicConceptToAllPlayers( const char* pszEffect ); |
|
|
|
|
|
WOD_BaseEffect* m_pChosenEffect; |
|
CWheelOfDoomSpiral* m_pSpiral; |
|
|
|
static const char* GetScreenModelName(); |
|
float CalcNextTickTime() const; |
|
float CalcSpinCompletion() const; |
|
void SetSkin( int nSkin ); |
|
void SetScale( float flScale ); |
|
void PlaySound( const char* pszSound ); |
|
|
|
bool m_bAnnounced; |
|
bool m_bHasSpiral; |
|
float m_flDuration; |
|
float m_flNextTickTime; |
|
float m_flNextAnnounceTime; |
|
float m_flStopSpinTime; |
|
CUtlVector<CWheelOfDoom*> m_vecOtherWODs; |
|
|
|
float m_flFinishBroadcastingEffectTime; |
|
|
|
COutputEvent m_EffectApplied; |
|
COutputEvent m_EffectExpired; |
|
|
|
|
|
//----------------------------------------------------------------------- |
|
// Effects |
|
|
|
class WOD_CritsEffect : public WOD_BaseEffect |
|
{ |
|
public: |
|
WOD_CritsEffect() |
|
{ |
|
m_pszName = "Crits"; |
|
m_nSkin = EFFECT_CRITS; |
|
m_pszEffectAnnouncementSound = "Halloween.MerasmusWheelCrits"; |
|
}; |
|
|
|
void ActivateEffect( EffectData_t& data ); |
|
}; |
|
|
|
class WOD_UberEffect : public WOD_BaseEffect |
|
{ |
|
public: |
|
WOD_UberEffect() |
|
{ |
|
m_pszName = "Uber"; |
|
m_nSkin = EFFECT_UBER; |
|
m_pszEffectAnnouncementSound = "Halloween.MerasmusWheelUber"; |
|
}; |
|
|
|
void InitEffect( float flDefaultExpireTime ); |
|
void ActivateEffect( EffectData_t& data ); |
|
}; |
|
|
|
class WOD_SuperSpeedEffect : public WOD_BaseEffect |
|
{ |
|
public: |
|
WOD_SuperSpeedEffect() |
|
{ |
|
m_pszName = "Super Speed"; |
|
m_nSkin = EFFECT_SPEED; |
|
m_pszEffectAnnouncementSound = "Halloween.MerasmusWheelSuperSpeed"; |
|
}; |
|
|
|
void ActivateEffect( EffectData_t& data ); |
|
void DeactivateEffect( EffectData_t& data ); |
|
}; |
|
|
|
class WOD_SuperJumpEffect : public WOD_BaseEffect |
|
{ |
|
public: |
|
WOD_SuperJumpEffect() |
|
{ |
|
m_pszName = "Super Jump"; |
|
m_nSkin = EFFECT_JUMP_HEIGHT; |
|
m_pszEffectAnnouncementSound = "Halloween.MerasmusWheelSuperJump"; |
|
} |
|
|
|
void ActivateEffect( EffectData_t& data ); |
|
void DeactivateEffect( EffectData_t& data ); |
|
}; |
|
|
|
class WOD_BigHeadEffect : public WOD_BaseEffect |
|
{ |
|
public: |
|
WOD_BigHeadEffect() |
|
{ |
|
m_pszName = "Big Head"; |
|
m_nSkin = EFFECT_BIG_HEAD; |
|
m_pszEffectAnnouncementSound = "Halloween.MerasmusWheelBigHead"; |
|
} |
|
|
|
void ActivateEffect( EffectData_t& data ); |
|
void DeactivateEffect( EffectData_t& data ); |
|
}; |
|
|
|
class WOD_SmallHeadEffect : public WOD_BaseEffect |
|
{ |
|
public: |
|
WOD_SmallHeadEffect() |
|
{ |
|
m_pszName = "Small Head"; |
|
m_nSkin = EFFECT_SMALL_HEAD; |
|
m_pszEffectAnnouncementSound = "Halloween.MerasmusWheelShrunkHead"; |
|
} |
|
|
|
void ActivateEffect( EffectData_t& data ); |
|
void DeactivateEffect( EffectData_t& data ); |
|
}; |
|
|
|
class WOD_LowGravityEffect : public WOD_BaseEffect |
|
{ |
|
public: |
|
WOD_LowGravityEffect() |
|
{ |
|
m_pszName = "Low Gravity"; |
|
m_nSkin = EFFECT_LOW_GRAVITY; |
|
m_pszEffectAnnouncementSound = "Halloween.MerasmusWheelGravity"; |
|
} |
|
|
|
void ActivateEffect( EffectData_t& data ); |
|
void DeactivateEffect( EffectData_t& data ); |
|
}; |
|
|
|
class WOD_Pee : public WOD_BaseEffect |
|
{ |
|
public: |
|
WOD_Pee() |
|
{ |
|
m_pszName = "Pee"; |
|
m_nSkin = EFFECT_WHAMMY; |
|
m_pszEffectAnnouncementSound = "Halloween.MerasmusWheelJarate"; |
|
} |
|
|
|
void ActivateEffect( EffectData_t& data ); |
|
void UpdateEffect( EffectData_t& data ); |
|
|
|
private: |
|
|
|
float m_flNextPeeTime; |
|
CUtlVector<CBaseEntity*> m_vecClouds; |
|
}; |
|
|
|
class WOD_Burn : public WOD_BaseEffect |
|
{ |
|
public: |
|
WOD_Burn() |
|
{ |
|
m_pszName = "Burn"; |
|
m_nSkin = EFFECT_WHAMMY; |
|
m_pszEffectAnnouncementSound = "Halloween.MerasmusWheelBurn"; |
|
} |
|
|
|
void InitEffect( float flDefaultDuration ); |
|
void ActivateEffect( EffectData_t& data ); |
|
}; |
|
|
|
class WOD_Ghosts : public WOD_BaseEffect |
|
{ |
|
public: |
|
WOD_Ghosts() |
|
{ |
|
m_pszName = "Ghosts"; |
|
m_nSkin = EFFECT_WHAMMY; |
|
m_pszEffectAnnouncementSound = "Halloween.MerasmusWheelGhosts"; |
|
} |
|
|
|
void ActivateEffect( EffectData_t& data ); |
|
void DeactivateEffect( EffectData_t& data ); |
|
}; |
|
|
|
class WOD_Dance : public WOD_BaseEffect |
|
{ |
|
public: |
|
WOD_Dance() |
|
{ |
|
m_pszName = "Dance"; |
|
m_nSkin = EFFECT_DANCE; |
|
m_pszEffectAnnouncementSound = "Halloween.MerasmusWheelDance"; |
|
m_flNextDanceTime = 0.f; |
|
} |
|
|
|
void InitEffect( float flExpireTime ); |
|
|
|
void UpdateEffect( EffectData_t& data ); |
|
void DeactivateEffect( EffectData_t& data ); |
|
|
|
private: |
|
int GetNumOFTeamDancing( int nTeam ) const; |
|
void SlamPosAndAngles( CTFPlayer* pPlayer, const Vector& vPos, const QAngle& vAng ); |
|
|
|
struct Dancer_t |
|
{ |
|
Vector m_vecPos; |
|
QAngle m_vecAngles; |
|
CHandle<CTFPlayer> m_hPlayer; |
|
}; |
|
|
|
CUtlVector<Dancer_t*> m_vecDancers; |
|
|
|
struct MerasmusCreateInfo_t |
|
{ |
|
MerasmusCreateInfo_t( const Vector& p, const QAngle& ang ) : m_vecPos( p ), m_vecAngles( ang ) {} |
|
Vector m_vecPos; |
|
QAngle m_vecAngles; |
|
}; |
|
CUtlVector< MerasmusCreateInfo_t > m_vecMerasmusDancerCreateInfos; |
|
int m_iCurrentMerasmusCreateInfo; |
|
CHandle<CMerasmusDancer> m_hMerasmusDancer; |
|
|
|
float m_flNextDanceTime; |
|
}; |
|
}; |
|
|
|
#endif // GAME_DLL |
|
|
|
#endif // TF_WHEEL_OF_DOOM_H
|
|
|