//-----------------------------------------------------------------------------
//
//  $Logfile:: /Quake 2 Engine/Sin/code/game/sniperrifle.cpp                  $
// $Revision:: 28                                                             $
//   $Author:: Jimdose                                                        $
//     $Date:: 3/12/99 8:15p                                                  $
//
// 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/sniperrifle.cpp                       $
// 
// 28    3/12/99 8:15p Jimdose
// made weapons fire 1/10th of a second sooner on clients
// 
// 27    3/02/99 9:15p Aldie
// Added CTF game code
// 
// 2     2/16/99 4:09p Aldie
// 
// 1     2/11/99 1:39p Aldie
// 
// 26    11/13/98 3:30p Markd
// put in more precaching on weapons
// 
// 25    10/10/98 5:58p Aldie
// More quantumdestab fixes
// 
// 24    8/14/98 6:19p Aldie
// Tweaked damage setting
// 
// 23    8/06/98 10:53p Aldie
// Added weapon tweaks and kickback.  Also modified blast radius damage and
// rocket jumping.
// 
// 22    8/01/98 3:24p Aldie
// Added server effects flag for specific weapons
// 
// 21    7/23/98 6:36p Aldie
// Increase damage
// 
// 20    7/22/98 9:57p Markd
// Defined weapon type
// 
// 19    7/21/98 1:10p Aldie
// Added meansofdeath to obituaries
// 
// 18    7/10/98 12:05a Aldie
// Added autochange support
// 
// 17    6/19/98 9:30p Jimdose
// Moved gun orientation code to Weapon
// 
// 16    6/17/98 10:55a Aldie
// Changed back to regular bulletweapon
// 
// 15    6/15/98 9:10p Aldie
// Added silenced effect
// 
// 14    6/10/98 2:10p Aldie
// Updated damage function.
// 
// 13    4/20/98 1:57p Markd
// SINED decelration is now in def file
// 
// 12    4/18/98 3:13p Markd
// Changed view weapon naming convention
// 
// 11    4/09/98 3:26p Jimdose
// took out sound from shoot since anim plays it
// 
// 10    4/07/98 6:43p Jimdose
// Rewrote weapon code.
// Added order to rank
// 
// 9     4/06/98 7:10p Aldie
// Added zooming for SniperRifle
// 
// 8     4/04/98 6:11p Jimdose
// Made animation control the sequence of becoming ready to fire
// 
// 7     4/02/98 4:20p Jimdose
// Tweaked for DM
// 
// 6     3/30/98 9:55p Jimdose
// Changed location of .def files
// 
// 5     3/30/98 2:37p Jimdose
// Moved firing to BulletWeapon to make more general
// Added Ammo
// Added world models
// 
// 4     3/27/98 11:03p Jimdose
// Added muzzle flash
// 
// 3     3/23/98 1:31p Jimdose
// Revamped event and command system
// 
// 2     3/18/98 2:39p Jimdose
// created file
// 
// DESCRIPTION:
// Sniper rifle
// 

#include "g_local.h"
#include "bullet.h"
#include "sniperrifle.h"
#include "player.h"

CLASS_DECLARATION( BulletWeapon, SniperRifle, "weapon_sniperrifle" );

Event EV_SniperRifle_Ready( "sniperrifle_ready" );

ResponseDef SniperRifle::Responses[] =
	{
	   { &EV_Weapon_SecondaryUse,	( Response )&SniperRifle::SecondaryUse },
	   { &EV_SniperRifle_Ready,	( Response )&SniperRifle::DoneRaising },
	   { &EV_Weapon_DoneRaising,	( Response )&SniperRifle::Open },
	   { &EV_Weapon_Shoot,			( Response )&SniperRifle::Shoot },
		{ NULL, NULL }
	};

SniperRifle::SniperRifle()
	{
	SetModels( "sniperrifle.def", "view_srifle.def" );
	SetAmmo( "BulletSniper", 1, 5 );
	modelIndex( "sniper_ammo.def" );
	SetRank( 100, 0 );	
   SetType( WEAPON_2HANDED_HI );
	}

// CTF - Fire upon release of the weapon
void SniperRifle::ReleaseFire
   (
   float holdfiretime
   )

   {
   StopAnimating();
   RandomAnimate( "releasefire", EV_Weapon_DoneFiring );
   last_animation_time = ( level.framenum + 1 ) * FRAMETIME;
   }

void SniperRifle::Shoot
	(
	Event *ev
	)

	{
	assert( owner );
	if ( !owner )
		{
		return;
      }

	if ( ctf->value )
		{
		// CTF - kill the target
		FireBullets( 1, vec_zero, 10000, 10000, DAMAGE_BULLET|DAMAGE_NO_ARMOR, MOD_SNIPER, false );
		}
   else if ( deathmatch->value )
		{
   	FireBullets( 1, vec_zero, 105, 135, DAMAGE_BULLET|DAMAGE_NO_ARMOR, MOD_SNIPER, false );
		}
   else
		{
      FireBullets( 1, vec_zero, 105, 135, DAMAGE_BULLET, MOD_SNIPER, false );
		}
   
	NextAttack( 1.5 );
	}

void SniperRifle::DoneRaising
	(
	Event *ev
	)

	{
	BulletWeapon::DoneRaising( ev );
	}

void SniperRifle::Open
	(
	Event *ev
	)

	{
	RandomAnimate( "open", EV_SniperRifle_Ready );
	}

void SniperRifle::SecondaryUse
   (
   Event *ev
   )
   {
   Entity *ent;
   Event *event;

   event = new Event(EV_Player_ToggleZoomMode);
   ent = ev->GetEntity(1);
   ent->ProcessEvent(event);
   }

void SniperRifle::DoneLowering
   (
   Event *ev
   )
   {
   Event *event;

	assert( owner );
	if ( !owner )
		{
		return;
		}

   event = new Event( EV_Player_ZoomOut );
   owner->ProcessEvent( event );

   Weapon::DoneLowering( ev );
   }

qboolean SniperRifle::AutoChange
   (
   void
   )

   {
   return false;
   }