summaryrefslogtreecommitdiff
path: root/game/client/tf/halloween
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/tf/halloween
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/client/tf/halloween')
-rw-r--r--game/client/tf/halloween/c_eyeball_boss.cpp273
-rw-r--r--game/client/tf/halloween/c_eyeball_boss.h55
-rw-r--r--game/client/tf/halloween/c_headless_hatman.cpp101
-rw-r--r--game/client/tf/halloween/c_headless_hatman.h39
-rw-r--r--game/client/tf/halloween/c_merasmus.cpp148
-rw-r--r--game/client/tf/halloween/c_merasmus.h49
-rw-r--r--game/client/tf/halloween/c_merasmus_dancer.cpp29
-rw-r--r--game/client/tf/halloween/c_merasmus_dancer.h26
-rw-r--r--game/client/tf/halloween/c_zombie.cpp38
-rw-r--r--game/client/tf/halloween/c_zombie.h32
10 files changed, 790 insertions, 0 deletions
diff --git a/game/client/tf/halloween/c_eyeball_boss.cpp b/game/client/tf/halloween/c_eyeball_boss.cpp
new file mode 100644
index 0000000..30245a1
--- /dev/null
+++ b/game/client/tf/halloween/c_eyeball_boss.cpp
@@ -0,0 +1,273 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+// c_eyeball_boss.cpp
+
+#include "cbase.h"
+#include "NextBot/C_NextBot.h"
+#include "c_eyeball_boss.h"
+#include "tf_shareddefs.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+#undef NextBot
+
+#ifdef STAGING_ONLY
+static ConVar cl_eyeball_boss_debug( "cl_eyeball_boss_debug", "0" );
+#endif
+
+
+//-----------------------------------------------------------------------------
+IMPLEMENT_CLIENTCLASS_DT( C_EyeballBoss, DT_EyeballBoss, CEyeballBoss )
+
+ RecvPropVector( RECVINFO( m_lookAtSpot ) ),
+ RecvPropInt( RECVINFO( m_attitude ) ),
+
+END_RECV_TABLE()
+
+
+//-----------------------------------------------------------------------------
+C_EyeballBoss::C_EyeballBoss()
+{
+ m_ghostEffect = NULL;
+ m_auraEffect = NULL;
+ m_attitude = EYEBALL_CALM;
+ m_priorAttitude = m_attitude;
+}
+
+
+//-----------------------------------------------------------------------------
+C_EyeballBoss::~C_EyeballBoss()
+{
+ if ( m_ghostEffect )
+ {
+ ParticleProp()->StopEmission( m_ghostEffect );
+ m_ghostEffect = NULL;
+ }
+
+ if ( m_auraEffect )
+ {
+ ParticleProp()->StopEmission( m_auraEffect );
+ m_auraEffect = NULL;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+void C_EyeballBoss::Spawn( void )
+{
+ BaseClass::Spawn();
+
+ m_leftRightPoseParameter = -1;
+ m_upDownPoseParameter = -1;
+
+ m_myAngles = vec3_angle;
+
+ m_attitude = EYEBALL_CALM;
+ m_priorAttitude = m_attitude;
+
+ SetNextClientThink( CLIENT_THINK_ALWAYS );
+}
+
+
+//-----------------------------------------------------------------------------
+void C_EyeballBoss::OnPreDataChanged( DataUpdateType_t updateType )
+{
+ BaseClass::OnPreDataChanged( updateType );
+
+ m_priorAttitude = m_attitude;
+}
+
+
+//-----------------------------------------------------------------------------
+void C_EyeballBoss::OnDataChanged( DataUpdateType_t updateType )
+{
+ BaseClass::OnDataChanged( updateType );
+
+ if ( updateType == DATA_UPDATE_CREATED )
+ {
+ const char *pszMaterial = NULL;
+ const char *pszAuraEffect = "eyeboss_aura_calm";
+ switch ( GetTeamNumber() )
+ {
+ case TF_TEAM_RED:
+ {
+ pszAuraEffect = "eyeboss_team_red";
+ //pszMaterial = "models/effects/invulnfx_red.vmt";
+ }
+ break;
+ case TF_TEAM_BLUE:
+ {
+ pszAuraEffect = "eyeboss_team_blue";
+ //pszMaterial = "models/effects/invulnfx_blue.vmt";
+ }
+ break;
+ default:
+ {
+ if ( !m_ghostEffect )
+ {
+ m_ghostEffect = ParticleProp()->Create( "ghost_pumpkin", PATTACH_ABSORIGIN_FOLLOW );
+ }
+ }
+ break;
+ }
+
+ if ( !m_auraEffect )
+ {
+ m_auraEffect = ParticleProp()->Create( pszAuraEffect, PATTACH_ABSORIGIN_FOLLOW );
+ }
+
+ if ( pszMaterial )
+ {
+ m_InvulnerableMaterial.Init( pszMaterial, TEXTURE_GROUP_CLIENT_EFFECTS );
+ }
+ else
+ {
+ m_InvulnerableMaterial.Shutdown();
+ }
+ }
+ else if ( GetTeamNumber() == TF_TEAM_HALLOWEEN )
+ {
+ // update eyeball aura
+ if ( m_attitude != m_priorAttitude )
+ {
+ // kill the old aura
+ if ( m_auraEffect )
+ {
+ ParticleProp()->StopEmission( m_auraEffect );
+ }
+
+ switch( m_attitude )
+ {
+ case EYEBALL_CALM:
+ m_auraEffect = ParticleProp()->Create( "eyeboss_aura_calm", PATTACH_ABSORIGIN_FOLLOW );
+ break;
+
+ case EYEBALL_GRUMPY:
+ m_auraEffect = ParticleProp()->Create( "eyeboss_aura_grumpy", PATTACH_ABSORIGIN_FOLLOW );
+ break;
+
+ case EYEBALL_ANGRY:
+ m_auraEffect = ParticleProp()->Create( "eyeboss_aura_angry", PATTACH_ABSORIGIN_FOLLOW );
+ break;
+ }
+
+ m_priorAttitude = m_attitude;
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+void C_EyeballBoss::ClientThink( void )
+{
+ // update eyeball aim
+ if ( m_leftRightPoseParameter < 0 )
+ {
+ m_leftRightPoseParameter = LookupPoseParameter( "left_right" );
+ }
+
+ if ( m_upDownPoseParameter < 0 )
+ {
+ m_upDownPoseParameter = LookupPoseParameter( "up_down" );
+ }
+
+
+ Vector myForward, myRight, myUp;
+ AngleVectors( m_myAngles, &myForward, &myRight, &myUp );
+
+#ifdef STAGING_ONLY
+ if ( cl_eyeball_boss_debug.GetBool() )
+ {
+ QAngle myAbsAngles = GetAbsAngles();
+
+ DevMsg( "%3.2f: EYEBALL BEFORE AIM m_myAngles( %f, %f, %f ), myForward( %f, %f, %f ), GetAbsAngles( %f, %f, %f )\n",
+ gpGlobals->curtime, m_myAngles.x, m_myAngles.y, m_myAngles.z, myForward.x, myForward.y, myForward.z,
+ myAbsAngles.x, myAbsAngles.y, myAbsAngles.z );
+ }
+#endif
+
+ const float myApproachRate = 3.0f; // 1.0f;
+
+ Vector toTarget = m_lookAtSpot - WorldSpaceCenter();
+ toTarget.NormalizeInPlace();
+
+ myForward += toTarget * myApproachRate * gpGlobals->frametime;
+ myForward.NormalizeInPlace();
+
+ QAngle myNewAngles;
+ VectorAngles( myForward, myNewAngles );
+
+ SetAbsAngles( myNewAngles );
+ m_myAngles = myNewAngles;
+
+#ifdef STAGING_ONLY
+ if ( cl_eyeball_boss_debug.GetBool() )
+ {
+ QAngle myAbsAngles = GetAbsAngles();
+
+ DevMsg( "%3.2f: EYEBALL AFTER AIM m_myAngles( %f, %f, %f ), myForward( %f, %f, %f ), GetAbsAngles( %f, %f, %f )\n",
+ gpGlobals->curtime, m_myAngles.x, m_myAngles.y, m_myAngles.z, myForward.x, myForward.y, myForward.z,
+ myAbsAngles.x, myAbsAngles.y, myAbsAngles.z );
+ }
+#endif
+
+
+ // set pose parameters to aim pupil directly at target
+ float toTargetRight = DotProduct( myRight, toTarget );
+ float toTargetUp = DotProduct( myUp, toTarget );
+
+ if ( m_leftRightPoseParameter >= 0 )
+ {
+ int angle = -50 * toTargetRight;
+
+ SetPoseParameter( m_leftRightPoseParameter, angle );
+ }
+
+ if ( m_upDownPoseParameter >= 0 )
+ {
+ int angle = -50 * toTargetUp;
+
+ SetPoseParameter( m_upDownPoseParameter, angle );
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+void C_EyeballBoss::SetDormant( bool bDormant )
+{
+ BaseClass::SetDormant( bDormant );
+}
+
+
+//-----------------------------------------------------------------------------
+void C_EyeballBoss::FireEvent( const Vector& origin, const QAngle& angles, int event, const char *options )
+{
+}
+
+
+//-----------------------------------------------------------------------------
+QAngle const &C_EyeballBoss::GetRenderAngles( void )
+{
+ return m_myAngles;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int C_EyeballBoss::InternalDrawModel( int flags )
+{
+ bool bUseInvulnMaterial = ( GetTeamNumber() == TF_TEAM_RED ) || ( GetTeamNumber() == TF_TEAM_BLUE );
+
+ if ( bUseInvulnMaterial )
+ {
+ modelrender->ForcedMaterialOverride( m_InvulnerableMaterial );
+ }
+
+ int ret = BaseClass::InternalDrawModel( flags );
+
+ if ( bUseInvulnMaterial )
+ {
+ modelrender->ForcedMaterialOverride( NULL );
+ }
+
+ return ret;
+} \ No newline at end of file
diff --git a/game/client/tf/halloween/c_eyeball_boss.h b/game/client/tf/halloween/c_eyeball_boss.h
new file mode 100644
index 0000000..b4c8315
--- /dev/null
+++ b/game/client/tf/halloween/c_eyeball_boss.h
@@ -0,0 +1,55 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+#ifndef C_EYEBALL_BOSS_H
+#define C_EYEBALL_BOSS_H
+
+#include "c_ai_basenpc.h"
+
+#define EYEBALL_ANGRY 2
+#define EYEBALL_GRUMPY 1
+#define EYEBALL_CALM 0
+
+//--------------------------------------------------------------------------------------------------------
+/**
+ * The client-side implementation of the Halloween Eyeball Boss
+ */
+class C_EyeballBoss : public C_NextBotCombatCharacter
+{
+public:
+ DECLARE_CLASS( C_EyeballBoss, C_NextBotCombatCharacter );
+ DECLARE_CLIENTCLASS();
+
+ C_EyeballBoss();
+ virtual ~C_EyeballBoss();
+
+ virtual void Spawn( void );
+ virtual void OnPreDataChanged( DataUpdateType_t updateType );
+ virtual void OnDataChanged( DataUpdateType_t updateType );
+ virtual bool IsNextBot() { return true; }
+
+ virtual void FireEvent( const Vector& origin, const QAngle& angles, int event, const char *options );
+ virtual void ClientThink();
+ virtual void SetDormant( bool bDormant );
+
+ virtual QAngle const &GetRenderAngles( void );
+ virtual int InternalDrawModel( int flags );
+
+private:
+ C_EyeballBoss( const C_EyeballBoss & ); // not defined, not accessible
+
+ Vector m_lookAtSpot;
+ int m_attitude;
+ int m_priorAttitude;
+
+ QAngle m_myAngles;
+
+ int m_leftRightPoseParameter;
+ int m_upDownPoseParameter;
+
+ HPARTICLEFFECT m_ghostEffect;
+
+ HPARTICLEFFECT m_auraEffect;
+
+ CMaterialReference m_InvulnerableMaterial;
+};
+
+#endif // C_EYEBALL_BOSS_H
diff --git a/game/client/tf/halloween/c_headless_hatman.cpp b/game/client/tf/halloween/c_headless_hatman.cpp
new file mode 100644
index 0000000..d8b63f5
--- /dev/null
+++ b/game/client/tf/halloween/c_headless_hatman.cpp
@@ -0,0 +1,101 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+// C_HeadlessHatman.cpp
+
+#include "cbase.h"
+#include "NextBot/C_NextBot.h"
+#include "c_headless_hatman.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+#undef NextBot
+
+//-----------------------------------------------------------------------------
+IMPLEMENT_CLIENTCLASS_DT( C_HeadlessHatman, DT_HeadlessHatman, CHeadlessHatman )
+END_RECV_TABLE()
+
+
+//-----------------------------------------------------------------------------
+C_HeadlessHatman::C_HeadlessHatman()
+{
+ m_ghostEffect = NULL;
+ m_leftEyeEffect = NULL;
+ m_rightEyeEffect = NULL;
+}
+
+
+//-----------------------------------------------------------------------------
+C_HeadlessHatman::~C_HeadlessHatman()
+{
+ if ( m_ghostEffect )
+ {
+ ParticleProp()->StopEmission( m_ghostEffect );
+ m_ghostEffect = NULL;
+ }
+
+ if ( m_leftEyeEffect )
+ {
+ ParticleProp()->StopEmission( m_leftEyeEffect );
+ m_leftEyeEffect = NULL;
+ }
+
+ if ( m_rightEyeEffect )
+ {
+ ParticleProp()->StopEmission( m_rightEyeEffect );
+ m_rightEyeEffect = NULL;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+void C_HeadlessHatman::Spawn( void )
+{
+ BaseClass::Spawn();
+
+ m_vecViewOffset = Vector( 0, 0, 100.0f );
+
+ if ( !m_ghostEffect )
+ {
+ m_ghostEffect = ParticleProp()->Create( "ghost_pumpkin", PATTACH_ABSORIGIN_FOLLOW );
+ }
+
+ SetNextClientThink( gpGlobals->curtime + 1.0f );
+}
+
+
+//-----------------------------------------------------------------------------
+void C_HeadlessHatman::ClientThink( void )
+{
+ if ( !m_leftEyeEffect )
+ {
+ m_leftEyeEffect = ParticleProp()->Create( "halloween_boss_eye_glow", PATTACH_POINT_FOLLOW, "lefteye" );
+ }
+
+ if ( !m_rightEyeEffect )
+ {
+ m_rightEyeEffect = ParticleProp()->Create( "halloween_boss_eye_glow", PATTACH_POINT_FOLLOW, "righteye" );
+ }
+
+ SetNextClientThink( CLIENT_THINK_NEVER );
+}
+
+
+//-----------------------------------------------------------------------------
+// Return the origin for player observers tracking this target
+Vector C_HeadlessHatman::GetObserverCamOrigin( void )
+{
+ return EyePosition();
+}
+
+
+//-----------------------------------------------------------------------------
+void C_HeadlessHatman::FireEvent( const Vector& origin, const QAngle& angles, int event, const char *options )
+{
+ if ( event == 7001 )
+ {
+ // footstep event
+ EmitSound( "Halloween.HeadlessBossFootfalls" );
+
+ ParticleProp()->Create( "halloween_boss_foot_impact", PATTACH_ABSORIGIN, 0 );
+ }
+}
diff --git a/game/client/tf/halloween/c_headless_hatman.h b/game/client/tf/halloween/c_headless_hatman.h
new file mode 100644
index 0000000..0fab53e
--- /dev/null
+++ b/game/client/tf/halloween/c_headless_hatman.h
@@ -0,0 +1,39 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+#ifndef C_HEADLESS_HATMAN_H
+#define C_HEADLESS_HATMAN_H
+
+#include "c_ai_basenpc.h"
+
+
+//--------------------------------------------------------------------------------------------------------
+/**
+ * The client-side implementation of the Dark Knight
+ */
+class C_HeadlessHatman : public C_NextBotCombatCharacter
+{
+public:
+ DECLARE_CLASS( C_HeadlessHatman, C_NextBotCombatCharacter );
+ DECLARE_CLIENTCLASS();
+
+ C_HeadlessHatman();
+ virtual ~C_HeadlessHatman();
+
+public:
+ virtual void Spawn( void );
+ virtual bool IsNextBot() { return true; }
+
+ virtual Vector GetObserverCamOrigin( void ); // Return the origin for player observers tracking this target
+
+ virtual void FireEvent( const Vector& origin, const QAngle& angles, int event, const char *options );
+
+ virtual void ClientThink();
+
+private:
+ C_HeadlessHatman( const C_HeadlessHatman & ); // not defined, not accessible
+
+ HPARTICLEFFECT m_ghostEffect;
+ HPARTICLEFFECT m_leftEyeEffect;
+ HPARTICLEFFECT m_rightEyeEffect;
+};
+
+#endif // C_HEADLESS_HATMAN_H
diff --git a/game/client/tf/halloween/c_merasmus.cpp b/game/client/tf/halloween/c_merasmus.cpp
new file mode 100644
index 0000000..6e287dc
--- /dev/null
+++ b/game/client/tf/halloween/c_merasmus.cpp
@@ -0,0 +1,148 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+//
+//
+//=============================================================================
+#include "cbase.h"
+#include "NextBot/C_NextBot.h"
+#include "c_merasmus.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+#undef NextBot
+
+//-----------------------------------------------------------------------------
+IMPLEMENT_CLIENTCLASS_DT( C_Merasmus, DT_Merasmus, CMerasmus )
+ RecvPropBool( RECVINFO( m_bRevealed ) ),
+ RecvPropBool( RECVINFO( m_bIsDoingAOEAttack ) ),
+ RecvPropBool( RECVINFO( m_bStunned ) ),
+END_RECV_TABLE()
+
+
+//-----------------------------------------------------------------------------
+C_Merasmus::C_Merasmus()
+{
+ m_ghostEffect = NULL;
+ m_aoeEffect = NULL;
+ m_stunEffect = NULL;
+ m_bRevealed = false;
+ m_bWasRevealed = false;
+ m_bIsDoingAOEAttack = false;
+ m_bStunned = false;
+}
+
+
+//-----------------------------------------------------------------------------
+C_Merasmus::~C_Merasmus()
+{
+ if ( m_ghostEffect )
+ {
+ ParticleProp()->StopEmission( m_ghostEffect );
+ m_ghostEffect = NULL;
+ }
+
+ if ( m_aoeEffect )
+ {
+ ParticleProp()->StopEmission( m_aoeEffect );
+ m_aoeEffect = NULL;
+ }
+
+ if ( m_stunEffect )
+ {
+ ParticleProp()->StopEmission( m_stunEffect );
+ m_stunEffect = NULL;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+void C_Merasmus::Spawn( void )
+{
+ BaseClass::Spawn();
+
+ m_vecViewOffset = Vector( 0, 0, 100.0f );
+}
+
+
+//-----------------------------------------------------------------------------
+// Return the origin for player observers tracking this target
+Vector C_Merasmus::GetObserverCamOrigin( void )
+{
+ return EyePosition();
+}
+
+
+//-----------------------------------------------------------------------------
+void C_Merasmus::OnPreDataChanged( DataUpdateType_t updateType )
+{
+ BaseClass::OnPreDataChanged( updateType );
+
+ m_bWasRevealed = m_bRevealed;
+}
+
+
+//-----------------------------------------------------------------------------
+void C_Merasmus::OnDataChanged( DataUpdateType_t updateType )
+{
+ BaseClass::OnDataChanged( updateType );
+
+ if ( m_bRevealed != m_bWasRevealed )
+ {
+ if ( m_bRevealed )
+ {
+ if ( !m_ghostEffect )
+ {
+ m_ghostEffect = ParticleProp()->Create( "merasmus_ambient_body", PATTACH_ABSORIGIN_FOLLOW );
+ }
+ }
+ else
+ {
+ if ( m_ghostEffect )
+ {
+ ParticleProp()->StopEmission( m_ghostEffect );
+ m_ghostEffect = NULL;
+ }
+ }
+ }
+
+ // book attack
+ if ( m_bIsDoingAOEAttack )
+ {
+ if ( !m_aoeEffect )
+ {
+ m_aoeEffect = ParticleProp()->Create( "merasmus_book_attack", PATTACH_POINT_FOLLOW, LookupAttachment( "effect_hand_R" ), Vector( 16.f, 0.f, 0.f ) );
+ }
+ }
+ else
+ {
+ if ( m_aoeEffect )
+ {
+ ParticleProp()->StopEmission( m_aoeEffect );
+ m_aoeEffect = NULL;
+ }
+ }
+
+ // stunned
+ if ( m_bStunned )
+ {
+ if ( !m_stunEffect )
+ {
+ m_stunEffect = ParticleProp()->Create( "merasmus_dazed", PATTACH_POINT_FOLLOW, LookupAttachment( "head" ) );
+ }
+ }
+ else
+ {
+ if ( m_stunEffect )
+ {
+ ParticleProp()->StopEmission( m_stunEffect );
+ m_stunEffect = NULL;
+ }
+ }
+}
+
+
+int C_Merasmus::GetSkin()
+{
+ return ( m_bIsDoingAOEAttack || m_bStunned ) ? 0 : 1;
+}
diff --git a/game/client/tf/halloween/c_merasmus.h b/game/client/tf/halloween/c_merasmus.h
new file mode 100644
index 0000000..1c4e166
--- /dev/null
+++ b/game/client/tf/halloween/c_merasmus.h
@@ -0,0 +1,49 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+//
+//
+//=============================================================================
+#ifndef C_MERASMUS_H
+#define C_MERASMUS_H
+
+#include "c_ai_basenpc.h"
+
+
+//--------------------------------------------------------------------------------------------------------
+/**
+ * The client-side implementation of the Dark Knight
+ */
+class C_Merasmus : public C_NextBotCombatCharacter
+{
+public:
+ DECLARE_CLASS( C_Merasmus, C_NextBotCombatCharacter );
+ DECLARE_CLIENTCLASS();
+
+ C_Merasmus();
+ virtual ~C_Merasmus();
+
+public:
+ virtual void Spawn( void );
+ virtual bool IsNextBot() { return true; }
+
+ virtual Vector GetObserverCamOrigin( void ); // Return the origin for player observers tracking this target
+
+ virtual void OnPreDataChanged( DataUpdateType_t updateType );
+ virtual void OnDataChanged( DataUpdateType_t updateType );
+
+ virtual int GetSkin();
+
+private:
+ C_Merasmus( const C_Merasmus & ); // not defined, not accessible
+
+ HPARTICLEFFECT m_ghostEffect;
+ HPARTICLEFFECT m_aoeEffect;
+ HPARTICLEFFECT m_stunEffect;
+
+ bool m_bWasRevealed;
+ CNetworkVar( bool, m_bRevealed );
+ CNetworkVar( bool, m_bIsDoingAOEAttack );
+ CNetworkVar( bool, m_bStunned );
+};
+
+#endif // C_MERASMUS_H
diff --git a/game/client/tf/halloween/c_merasmus_dancer.cpp b/game/client/tf/halloween/c_merasmus_dancer.cpp
new file mode 100644
index 0000000..4f0c08d
--- /dev/null
+++ b/game/client/tf/halloween/c_merasmus_dancer.cpp
@@ -0,0 +1,29 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+//
+//
+//=============================================================================
+#include "cbase.h"
+#include "c_merasmus_dancer.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+//-----------------------------------------------------------------------------
+IMPLEMENT_CLIENTCLASS_DT( C_MerasmusDancer, DT_MerasmusDancer, CMerasmusDancer )
+END_RECV_TABLE()
+
+
+//-----------------------------------------------------------------------------
+C_MerasmusDancer::C_MerasmusDancer()
+{
+}
+
+
+//-----------------------------------------------------------------------------
+C_MerasmusDancer::~C_MerasmusDancer()
+{
+}
+
+
+
diff --git a/game/client/tf/halloween/c_merasmus_dancer.h b/game/client/tf/halloween/c_merasmus_dancer.h
new file mode 100644
index 0000000..f8d1cf2
--- /dev/null
+++ b/game/client/tf/halloween/c_merasmus_dancer.h
@@ -0,0 +1,26 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+//
+//
+//=============================================================================
+#ifndef C_MERASMUS_DANCER_H
+#define C_MERASMUS_DANCER_H
+
+#include "c_baseanimating.h"
+
+//--------------------------------------------------------------------------------------------------------
+
+class C_MerasmusDancer : public C_BaseAnimating
+{
+public:
+ DECLARE_CLASS( C_MerasmusDancer, C_BaseAnimating );
+ DECLARE_CLIENTCLASS();
+
+ C_MerasmusDancer();
+ virtual ~C_MerasmusDancer();
+
+private:
+ C_MerasmusDancer( const C_MerasmusDancer & ); // not defined, not accessible
+};
+
+#endif // C_MERASMUS_DANCER_H
diff --git a/game/client/tf/halloween/c_zombie.cpp b/game/client/tf/halloween/c_zombie.cpp
new file mode 100644
index 0000000..0cebd29
--- /dev/null
+++ b/game/client/tf/halloween/c_zombie.cpp
@@ -0,0 +1,38 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+// c_eyeball_boss.cpp
+
+#include "cbase.h"
+#include "NextBot/C_NextBot.h"
+#include "c_zombie.h"
+#include "tf_shareddefs.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+//-----------------------------------------------------------------------------
+IMPLEMENT_CLIENTCLASS_DT( C_Zombie, DT_Zombie, CZombie )
+ RecvPropFloat( RECVINFO( m_flHeadScale ) ),
+END_RECV_TABLE()
+
+
+C_Zombie::C_Zombie()
+{
+}
+
+
+bool C_Zombie::ShouldCollide( int collisionGroup, int contentsMask ) const
+{
+ if ( collisionGroup == COLLISION_GROUP_PLAYER_MOVEMENT )
+ return false;
+
+ return BaseClass::ShouldCollide( collisionGroup, contentsMask );
+}
+
+extern void BuildBigHeadTransformations( CBaseAnimating *pObject, CStudioHdr *hdr, Vector *pos, Quaternion q[], const matrix3x4_t& cameraTransform, int boneMask, CBoneBitList &boneComputed, float flScale );
+void C_Zombie::BuildTransformations( CStudioHdr *hdr, Vector *pos, Quaternion q[], const matrix3x4_t& cameraTransform, int boneMask, CBoneBitList &boneComputed )
+{
+ BaseClass::BuildTransformations( hdr, pos, q, cameraTransform, boneMask, boneComputed );
+
+ m_BoneAccessor.SetWritableBones( BONE_USED_BY_ANYTHING );
+ BuildBigHeadTransformations( this, hdr, pos, q, cameraTransform, boneMask, boneComputed, m_flHeadScale );
+}
diff --git a/game/client/tf/halloween/c_zombie.h b/game/client/tf/halloween/c_zombie.h
new file mode 100644
index 0000000..c226fd2
--- /dev/null
+++ b/game/client/tf/halloween/c_zombie.h
@@ -0,0 +1,32 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+#ifndef C_ZOMBIE_H
+#define C_ZOMBIE_H
+
+#include "c_ai_basenpc.h"
+#include "props_shared.h"
+
+//--------------------------------------------------------------------------------------------------------
+/**
+ * The client-side implementation of the Halloween Zombie
+ */
+class C_Zombie : public C_NextBotCombatCharacter
+{
+public:
+ DECLARE_CLASS( C_Zombie, C_NextBotCombatCharacter );
+ DECLARE_CLIENTCLASS();
+
+ C_Zombie();
+
+ virtual bool IsNextBot() { return true; }
+
+ virtual bool ShouldCollide( int collisionGroup, int contentsMask ) const;
+
+ virtual void BuildTransformations( CStudioHdr *hdr, Vector *pos, Quaternion q[], const matrix3x4_t& cameraTransform, int boneMask, CBoneBitList &boneComputed ) OVERRIDE;
+
+private:
+ C_Zombie( const C_Zombie & ); // not defined, not accessible
+
+ float m_flHeadScale;
+};
+
+#endif // C_EYEBALL_BOSS_H \ No newline at end of file