123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- /*
- Copyright (C) 2004 Michael Liebscher
- Copyright (C) 2000-2002 by DarkOne the Hacker
- This program 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.
- This program 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 this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
- #include "../wolfiphone.h"
- /*
- -----------------------------------------------------------------------------
- Function:
-
- Parameters:
-
- Returns:
-
- Notes:
- -----------------------------------------------------------------------------
- */
- PUBLIC void fire_hit( player_t *self )
- {
- entity_t *closest;
- int dist, d1, n, shot_dist, damage;
- Sound_StartSound( NULL, 0, CHAN_WEAPON, Sound_RegisterSound( "lsfx/023.wav" ), 1, ATTN_NORM, 0 );
- // actually fire
- dist = 0x7fffffff;
- closest = NULL;
- for( n = 0 ; n < NumGuards ; ++n )
- {
- if( Guards[ n ].flags & FL_SHOOTABLE ) // && Guards[n].flags&FL_VISABLE
- {
- shot_dist = Point2LineDist( Guards[ n ].x - self->position.origin[ 0 ], Guards[ n ].y - self->position.origin[ 1 ], self->position.angle );
-
- if( shot_dist > (2 * TILEGLOBAL / 3) )
- {
- continue; // miss
- }
-
- d1 = LineLen2Point( Guards[ n ].x - self->position.origin[ 0 ], Guards[ n ].y - self->position.origin[ 1 ], self->position.angle );
-
- if( d1 < 0 || d1 > dist )
- {
- continue;
- }
-
- if( ! Level_CheckLine( Guards[ n ].x, Guards[ n ].y, Player.position.origin[0], Player.position.origin[1], r_world ) )
- {
- //if( ! CheckLine( &Guards[ n ] ) )
- continue; // obscured
- }
- dist = d1;
- closest = &Guards[ n ];
- }
- }
- if( ! closest || dist > TILE2POS( 1 ) )
- {
- return; // missed if further than 1.5 tiles
- }
- damage = US_RndT() >> 4;
- A_DamageActor( closest, damage ); // hit something
- }
- /*
- -----------------------------------------------------------------------------
- Function:
-
- Parameters:
-
- Returns:
-
- Notes:
- -----------------------------------------------------------------------------
- */
- PUBLIC void fire_lead( player_t *self )
- {
- entity_t *closest;
- int damage;
- int dx, dy, dist;
- int d1, shot_dist, n;
- switch( self->weapon )
- {
- case WEAPON_PISTOL:
- Sound_StartSound( NULL, 0, CHAN_WEAPON, Sound_RegisterSound( "sfx/012.wav" ), 1, ATTN_NORM, 0 );
- break;
- case WEAPON_AUTO:
- Sound_StartSound( NULL, 0, CHAN_WEAPON, Sound_RegisterSound( "sfx/011.wav" ), 1, ATTN_NORM, 0 );
- break;
- case WEAPON_CHAIN:
- Sound_StartSound( NULL, 0, CHAN_WEAPON, Sound_RegisterSound( "sfx/013.wav" ), 1, ATTN_NORM, 0 );
- break;
- }
- self->madenoise = true;
- dist = 0x7fffffffl;
- closest = NULL;
- for( n = 0 ; n < NumGuards; ++n )
- {
- if( Guards[ n ].flags & FL_SHOOTABLE ) // && Guards[n].flags&FL_VISABLE
- {
- shot_dist = Point2LineDist( Guards[ n ].x - self->position.origin[ 0 ], Guards[ n ].y - self->position.origin[ 1 ], self->position.angle );
- if( shot_dist > (2 * TILEGLOBAL / 3) )
- {
- continue; // miss
- }
- d1 = LineLen2Point( Guards[ n ].x - self->position.origin[ 0 ], Guards[ n ].y - self->position.origin[ 1 ], self->position.angle );
- if( d1 < 0 || d1 > dist )
- {
- continue;
- }
-
- if( ! Level_CheckLine( Guards[ n ].x, Guards[ n ].y, Player.position.origin[0], Player.position.origin[1], r_world ) )
- {
- //if( ! CheckLine( &Guards[ n ] ) )
- continue; // obscured
- }
- dist = d1;
- closest = &Guards[ n ];
- }
- }
- if( ! closest ) // missed
- {
- r_trace_t trace;
- trace.a = NormalizeAngle( self->position.angle - DEG2FINE( 2 ) + rand() % (DEG2FINE( 4 ) ) );
- trace.x = self->position.origin[ 0 ];
- trace.y = self->position.origin[ 1 ];
- trace.flags = TRACE_BULLET;
- trace.tile_vis = NULL;
- R_Trace( &trace, r_world );
- if( trace.flags & TRACE_HIT_DOOR )
- {
- Sound_StartSound( NULL, 0, CHAN_AUTO, Sound_RegisterSound( "lsfx/028.wav" ), 1, ATTN_NORM, 0 );
- }
- return;
- }
- // hit something
- dx = ABS( closest->tilex - self->tilex );
- dy = ABS( closest->tiley - self->tiley );
- dist = max_of_2( dx, dy );
- if( dist < 2 )
- {
- damage = US_RndT() / 4;
- }
- else if( dist < 4 )
- {
- damage = US_RndT() / 6;
- }
- else
- {
- if( US_RndT() / 12 < dist )
- {
- return; // missed
- }
- damage = US_RndT() / 6;
- }
- A_DamageActor( closest, damage );
- }
|