2020-05-14 10:14:03 +00:00
//-------------------------------------------------------------------------
/*
Copyright ( C ) 1996 , 2003 - 3 D Realms Entertainment
Copyright ( C ) 2000 , 2003 - Matt Saettler ( EDuke Enhancements )
2020-06-28 07:03:31 +00:00
Copyright ( C ) 2020 - Christoph Oelckers
2020-05-14 10:14:03 +00:00
This file is part of Enhanced Duke Nukem 3 D version 1.5 - Atomic Edition
Duke Nukem 3 D 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 .
Original Source : 1996 - Todd Replogle
Prepared for public release : 03 / 21 / 2003 - Charlie Wiederhold , 3 D Realms
EDuke enhancements integrated : 04 / 13 / 2003 - Matt Saettler
Note : EDuke source was in transition . Changes are in - progress in the
source as it is released .
*/
//-------------------------------------------------------------------------
# include "ns.h"
# include "global.h"
2020-05-16 21:55:21 +00:00
# include "gamevar.h"
2020-07-03 21:56:14 +00:00
# include "names_d.h"
2020-10-21 17:38:53 +00:00
# include "dukeactor.h"
2020-05-14 10:14:03 +00:00
BEGIN_DUKE_NS
2020-05-18 22:26:07 +00:00
void fireweapon_ww ( int snum ) ;
2021-11-21 07:48:36 +00:00
void operateweapon_ww ( int snum , ESyncBits actions ) ;
2020-05-18 22:26:07 +00:00
2020-05-16 21:55:21 +00:00
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2022-02-07 10:04:19 +00:00
void incur_damage_d ( player_struct * p )
2020-05-16 21:55:21 +00:00
{
int damage = 0L , shield_damage = 0L ;
2021-12-21 17:19:45 +00:00
p - > GetActor ( ) - > spr . extra - = p - > extra_extra8 > > 8 ;
2020-05-16 21:55:21 +00:00
2021-12-21 17:19:45 +00:00
damage = p - > GetActor ( ) - > spr . extra - p - > last_extra ;
2020-05-16 21:55:21 +00:00
if ( damage < 0 )
{
p - > extra_extra8 = 0 ;
if ( p - > shield_amount > 0 )
{
shield_damage = damage * ( 20 + ( rand ( ) % 30 ) ) / 100 ;
damage - = shield_damage ;
p - > shield_amount + = shield_damage ;
if ( p - > shield_amount < 0 )
{
damage + = p - > shield_amount ;
p - > shield_amount = 0 ;
}
}
2021-12-21 17:19:45 +00:00
p - > GetActor ( ) - > spr . extra = p - > last_extra + damage ;
2020-05-16 21:55:21 +00:00
}
}
2020-05-17 11:25:39 +00:00
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2020-08-26 22:53:35 +00:00
void selectweapon_d ( int snum , int weap ) // playernum, weaponnum
2020-05-17 11:25:39 +00:00
{
2020-08-26 22:53:35 +00:00
int i , j , k ;
2020-05-17 11:25:39 +00:00
auto p = & ps [ snum ] ;
2022-10-07 21:33:37 +00:00
if ( p - > last_pissed_time < = ( 26 * 218 ) & & p - > show_empty_weapon = = 0 & & p - > kickback_pic = = 0 & & p - > quick_kick = = 0 & & p - > GetActor ( ) - > spr . scale . X > 0.5 & & p - > access_incs = = 0 & & p - > knee_incs = = 0 )
2020-05-17 11:25:39 +00:00
{
if ( ( p - > weapon_pos = = 0 | | ( p - > holster_weapon & & p - > weapon_pos = = - 9 ) ) )
{
2020-08-26 22:53:35 +00:00
if ( weap = = WeaponSel_Alt )
{
2020-12-01 20:07:38 +00:00
j = p - > curr_weapon ;
2020-08-29 11:27:58 +00:00
switch ( p - > curr_weapon )
{
case SHRINKER_WEAPON :
2020-12-01 20:07:38 +00:00
if ( p - > ammo_amount [ GROW_WEAPON ] > 0 & & p - > gotweapon [ GROW_WEAPON ] & & isPlutoPak ( ) )
{
j = GROW_WEAPON ;
p - > subweapon | = ( 1 < < GROW_WEAPON ) ;
}
2020-08-29 11:27:58 +00:00
break ;
case GROW_WEAPON :
2020-12-01 20:07:38 +00:00
if ( p - > ammo_amount [ SHRINKER_WEAPON ] > 0 & & p - > gotweapon [ SHRINKER_WEAPON ] )
{
j = SHRINKER_WEAPON ;
p - > subweapon & = ~ ( 1 < < GROW_WEAPON ) ;
}
2020-08-29 11:27:58 +00:00
break ;
2020-08-29 12:30:45 +00:00
case FREEZE_WEAPON :
2020-12-01 20:07:38 +00:00
if ( p - > ammo_amount [ FLAMETHROWER_WEAPON ] > 0 & & p - > gotweapon [ FLAMETHROWER_WEAPON ] & & isWorldTour ( ) )
{
j = FLAMETHROWER_WEAPON ;
p - > subweapon | = ( 1 < < FLAMETHROWER_WEAPON ) ;
}
2020-08-29 12:30:45 +00:00
break ;
case FLAMETHROWER_WEAPON :
2020-12-01 20:07:38 +00:00
if ( p - > ammo_amount [ FREEZE_WEAPON ] > 0 & & p - > gotweapon [ FREEZE_WEAPON ] )
{
j = FREEZE_WEAPON ;
p - > subweapon & = ~ ( 1 < < FLAMETHROWER_WEAPON ) ;
}
2020-08-29 12:30:45 +00:00
break ;
2020-08-29 11:27:58 +00:00
default :
break ;
}
2020-08-26 22:53:35 +00:00
}
else if ( weap = = WeaponSel_Next | | weap = = WeaponSel_Prev )
2020-05-17 11:25:39 +00:00
{
k = p - > curr_weapon ;
2020-08-26 22:53:35 +00:00
j = ( weap = = WeaponSel_Prev ? - 1 : 1 ) ; // JBF: prev (-1) or next (1) weapon choice
2020-05-17 11:25:39 +00:00
i = 0 ;
2020-10-11 09:39:51 +00:00
while ( ( k > = 0 & & k < 10 ) | | ( isPlutoPak ( ) & & k = = GROW_WEAPON & & ( p - > subweapon & ( 1 < < GROW_WEAPON ) ) ! = 0 )
2020-05-17 12:20:49 +00:00
| | ( isWorldTour ( ) & & k = = FLAMETHROWER_WEAPON & & ( p - > subweapon & ( 1 < < FLAMETHROWER_WEAPON ) ) ! = 0 ) )
2020-05-17 11:25:39 +00:00
{
2020-05-17 12:20:49 +00:00
if ( k = = FLAMETHROWER_WEAPON ) //Twentieth Anniversary World Tour
{
if ( j = = - 1 ) k = TRIPBOMB_WEAPON ;
else k = PISTOL_WEAPON ;
}
else if ( k = = GROW_WEAPON ) // JBF: this is handling next/previous with the grower selected
2020-05-17 11:25:39 +00:00
{
2021-10-08 17:21:29 +00:00
if ( j = = - 1 )
2020-05-17 11:25:39 +00:00
k = 5 ;
else k = 7 ;
}
else
{
k + = j ;
2020-05-17 12:20:49 +00:00
// JBF 20040116: so we don't select grower with v1.3d
2020-10-11 09:39:51 +00:00
if ( isPlutoPak ( ) & & k = = SHRINKER_WEAPON & & ( p - > subweapon & ( 1 < < GROW_WEAPON ) ) ) // JBF: activates grower
2020-05-17 12:20:49 +00:00
k = GROW_WEAPON ; // if enabled
if ( isWorldTour ( ) & & k = = FREEZE_WEAPON & & ( p - > subweapon & ( 1 < < FLAMETHROWER_WEAPON ) ) ! = 0 )
k = FLAMETHROWER_WEAPON ;
2020-05-17 11:25:39 +00:00
}
if ( k = = - 1 ) k = 9 ;
else if ( k = = 10 ) k = 0 ;
if ( p - > gotweapon [ k ] & & p - > ammo_amount [ k ] > 0 )
{
2020-10-11 09:39:51 +00:00
if ( isPlutoPak ( ) ) // JBF 20040116: so we don't select grower with v1.3d
2021-11-14 11:25:25 +00:00
{
2020-05-17 11:25:39 +00:00
if ( k = = SHRINKER_WEAPON & & ( p - > subweapon & ( 1 < < GROW_WEAPON ) ) )
k = GROW_WEAPON ;
2020-05-17 12:20:49 +00:00
if ( isWorldTour ( ) & & k = = FREEZE_WEAPON & & ( p - > subweapon & ( 1 < < FLAMETHROWER_WEAPON ) ) ! = 0 )
k = FLAMETHROWER_WEAPON ;
2021-11-14 11:25:25 +00:00
}
2020-05-17 11:25:39 +00:00
j = k ;
break ;
}
2020-10-11 09:39:51 +00:00
else if ( isPlutoPak ( ) & & k = = GROW_WEAPON & & p - > ammo_amount [ GROW_WEAPON ] = = 0 & & p - > gotweapon [ SHRINKER_WEAPON ] & & p - > ammo_amount [ SHRINKER_WEAPON ] > 0 ) // JBF 20040116: added isPlutoPak() so we don't select grower with v1.3d
2020-05-17 12:20:49 +00:00
{
j = SHRINKER_WEAPON ;
p - > subweapon & = ~ ( 1 < < GROW_WEAPON ) ;
break ;
}
2020-10-11 09:39:51 +00:00
else if ( isPlutoPak ( ) & & k = = SHRINKER_WEAPON & & p - > ammo_amount [ SHRINKER_WEAPON ] = = 0 & & p - > gotweapon [ SHRINKER_WEAPON ] & & p - > ammo_amount [ GROW_WEAPON ] > 0 ) // JBF 20040116: added isPlutoPak() so we don't select grower with v1.3d
2020-05-17 12:20:49 +00:00
{
j = GROW_WEAPON ;
p - > subweapon | = ( 1 < < GROW_WEAPON ) ;
break ;
}
//Twentieth Anniversary World Tour
else if ( isWorldTour ( ) & & k = = FLAMETHROWER_WEAPON & & p - > ammo_amount [ FLAMETHROWER_WEAPON ] = = 0 & & p - > gotweapon [ FREEZE_WEAPON ] & & p - > ammo_amount [ FREEZE_WEAPON ] > 0 )
{
j = FREEZE_WEAPON ;
p - > subweapon & = ~ ( 1 < < FLAMETHROWER_WEAPON ) ;
break ;
}
else if ( isWorldTour ( ) & & k = = FREEZE_WEAPON & & p - > ammo_amount [ FREEZE_WEAPON ] = = 0 & & p - > gotweapon [ FLAMETHROWER_WEAPON ] & & p - > ammo_amount [ FLAMETHROWER_WEAPON ] > 0 )
{
j = FLAMETHROWER_WEAPON ;
p - > subweapon | = ( 1 < < FLAMETHROWER_WEAPON ) ;
break ;
}
2020-05-17 11:25:39 +00:00
i + + ; // absolutely no weapons, so use foot
if ( i = = 10 )
{
2022-11-12 08:33:33 +00:00
fi . addweapon ( p , KNEE_WEAPON , true ) ;
2020-05-17 11:25:39 +00:00
break ;
}
}
}
2021-07-17 12:42:58 +00:00
else j = weap - 1 ;
2020-05-17 11:25:39 +00:00
k = - 1 ;
if ( j = = HANDBOMB_WEAPON & & p - > ammo_amount [ HANDBOMB_WEAPON ] = = 0 )
{
2020-10-25 05:34:25 +00:00
DukeStatIterator it ( STAT_ACTOR ) ;
while ( auto act = it . Next ( ) )
2020-05-17 11:25:39 +00:00
{
2022-12-30 20:45:31 +00:00
if ( act - > GetClass ( ) = = DukePipeBombClass & & act - > GetOwner ( ) = = p - > GetActor ( ) )
2020-05-17 11:25:39 +00:00
{
2021-05-15 08:23:50 +00:00
p - > gotweapon [ HANDBOMB_WEAPON ] = true ;
2020-05-17 11:25:39 +00:00
j = HANDREMOTE_WEAPON ;
break ;
}
}
}
2020-05-17 12:20:49 +00:00
//Twentieth Anniversary World Tour
if ( j = = FREEZE_WEAPON & & isWorldTour ( ) )
{
if ( p - > curr_weapon ! = FLAMETHROWER_WEAPON & & p - > curr_weapon ! = FREEZE_WEAPON )
{
if ( p - > ammo_amount [ FLAMETHROWER_WEAPON ] > 0 )
{
if ( ( p - > subweapon & ( 1 < < FLAMETHROWER_WEAPON ) ) = = ( 1 < < FLAMETHROWER_WEAPON ) )
j = FLAMETHROWER_WEAPON ;
else if ( p - > ammo_amount [ FREEZE_WEAPON ] = = 0 )
{
j = FLAMETHROWER_WEAPON ;
p - > subweapon | = ( 1 < < FLAMETHROWER_WEAPON ) ;
}
}
else if ( p - > ammo_amount [ FREEZE_WEAPON ] > 0 )
p - > subweapon & = ~ ( 1 < < FLAMETHROWER_WEAPON ) ;
}
else if ( p - > curr_weapon = = FREEZE_WEAPON )
{
p - > subweapon | = ( 1 < < FLAMETHROWER_WEAPON ) ;
j = FLAMETHROWER_WEAPON ;
}
else
p - > subweapon & = ~ ( 1 < < FLAMETHROWER_WEAPON ) ;
}
2020-10-11 09:39:51 +00:00
if ( j = = SHRINKER_WEAPON & & isPlutoPak ( ) ) // JBF 20040116: so we don't select the grower with v1.3d
2020-05-17 11:25:39 +00:00
{
if ( p - > curr_weapon ! = GROW_WEAPON & & p - > curr_weapon ! = SHRINKER_WEAPON )
{
if ( p - > ammo_amount [ GROW_WEAPON ] > 0 )
{
if ( ( p - > subweapon & ( 1 < < GROW_WEAPON ) ) = = ( 1 < < GROW_WEAPON ) )
j = GROW_WEAPON ;
else if ( p - > ammo_amount [ SHRINKER_WEAPON ] = = 0 )
{
j = GROW_WEAPON ;
p - > subweapon | = ( 1 < < GROW_WEAPON ) ;
}
}
else if ( p - > ammo_amount [ SHRINKER_WEAPON ] > 0 )
p - > subweapon & = ~ ( 1 < < GROW_WEAPON ) ;
}
else if ( p - > curr_weapon = = SHRINKER_WEAPON )
{
p - > subweapon | = ( 1 < < GROW_WEAPON ) ;
j = GROW_WEAPON ;
}
else
p - > subweapon & = ~ ( 1 < < GROW_WEAPON ) ;
}
if ( p - > holster_weapon )
{
2020-08-27 22:03:35 +00:00
PlayerSetInput ( snum , SB_HOLSTER ) ;
2020-09-16 11:01:09 +00:00
p - > oweapon_pos = p - > weapon_pos = - 9 ;
2020-05-17 11:25:39 +00:00
}
2021-10-08 17:21:29 +00:00
else if ( j > = MIN_WEAPON & & p - > gotweapon [ j ] & & p - > curr_weapon ! = j ) switch ( j )
2020-05-17 11:25:39 +00:00
{
case KNEE_WEAPON :
2022-11-12 08:33:33 +00:00
fi . addweapon ( p , KNEE_WEAPON , true ) ;
2020-05-17 11:25:39 +00:00
break ;
case PISTOL_WEAPON :
case SHOTGUN_WEAPON :
case CHAINGUN_WEAPON :
case RPG_WEAPON :
case DEVISTATOR_WEAPON :
case FREEZE_WEAPON :
2020-05-17 12:20:49 +00:00
case FLAMETHROWER_WEAPON :
2020-05-17 11:25:39 +00:00
case GROW_WEAPON :
case SHRINKER_WEAPON :
if ( p - > ammo_amount [ j ] = = 0 & & p - > show_empty_weapon = = 0 )
{
p - > show_empty_weapon = 32 ;
p - > last_full_weapon = p - > curr_weapon ;
}
2022-11-12 08:33:33 +00:00
fi . addweapon ( p , j , true ) ;
2020-05-17 11:25:39 +00:00
break ;
case HANDREMOTE_WEAPON :
if ( k > = 0 ) // Found in list of [1]'s
{
p - > curr_weapon = HANDREMOTE_WEAPON ;
p - > last_weapon = - 1 ;
2020-09-16 11:01:09 +00:00
p - > oweapon_pos = p - > weapon_pos = 10 ;
2020-05-17 11:25:39 +00:00
}
break ;
case HANDBOMB_WEAPON :
if ( p - > ammo_amount [ HANDBOMB_WEAPON ] > 0 & & p - > gotweapon [ HANDBOMB_WEAPON ] )
2022-11-12 08:33:33 +00:00
fi . addweapon ( p , HANDBOMB_WEAPON , true ) ;
2020-05-17 11:25:39 +00:00
break ;
case TRIPBOMB_WEAPON :
if ( p - > ammo_amount [ TRIPBOMB_WEAPON ] > 0 & & p - > gotweapon [ TRIPBOMB_WEAPON ] )
2022-11-12 08:33:33 +00:00
fi . addweapon ( p , TRIPBOMB_WEAPON , true ) ;
2020-05-17 11:25:39 +00:00
break ;
}
}
}
}
2020-05-16 21:55:21 +00:00
2020-05-17 16:04:45 +00:00
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2022-02-07 10:04:19 +00:00
int doincrements_d ( player_struct * p )
2020-05-17 16:04:45 +00:00
{
int snum ;
2020-11-02 19:24:07 +00:00
auto pact = p - > GetActor ( ) ;
2022-09-01 15:26:46 +00:00
snum = pact - > PlayerIndex ( ) ;
2020-05-17 16:04:45 +00:00
p - > player_par + + ;
if ( p - > invdisptime > 0 )
p - > invdisptime - - ;
2022-06-05 23:40:47 +00:00
if ( p - > tipincs > 0 )
{
p - > otipincs = p - > tipincs ;
p - > tipincs - - ;
}
2020-05-17 16:04:45 +00:00
if ( p - > last_pissed_time > 0 )
{
p - > last_pissed_time - - ;
if ( p - > last_pissed_time = = ( 26 * 219 ) )
{
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( FLUSH_TOILET , pact ) ;
2020-05-17 16:04:45 +00:00
if ( snum = = screenpeek | | ud . coop = = 1 )
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( DUKE_PISSRELIEF , pact ) ;
2020-05-17 16:04:45 +00:00
}
if ( p - > last_pissed_time = = ( 26 * 218 ) )
{
p - > holster_weapon = 0 ;
2020-09-16 11:01:09 +00:00
p - > oweapon_pos = p - > weapon_pos = 10 ;
2020-05-17 16:04:45 +00:00
}
}
if ( p - > crack_time > 0 )
{
p - > crack_time - - ;
if ( p - > crack_time = = 0 )
{
p - > knuckle_incs = 1 ;
2020-08-27 05:54:49 +00:00
p - > crack_time = CRACK_TIME ;
2020-05-17 16:04:45 +00:00
}
}
if ( p - > steroids_amount > 0 & & p - > steroids_amount < 400 )
{
p - > steroids_amount - - ;
if ( p - > steroids_amount = = 0 )
checkavailinven ( p ) ;
if ( ! ( p - > steroids_amount & 7 ) )
if ( snum = = screenpeek | | ud . coop = = 1 )
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( DUKE_HARTBEAT , pact ) ;
2020-05-17 16:04:45 +00:00
}
if ( p - > heat_on & & p - > heat_amount > 0 )
{
p - > heat_amount - - ;
if ( p - > heat_amount = = 0 )
{
p - > heat_on = 0 ;
checkavailinven ( p ) ;
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( NITEVISION_ONOFF , pact ) ;
2020-05-17 16:04:45 +00:00
}
}
2020-10-21 08:48:38 +00:00
if ( p - > holoduke_on ! = nullptr )
2020-05-17 16:04:45 +00:00
{
p - > holoduke_amount - - ;
if ( p - > holoduke_amount < = 0 )
{
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( TELEPORTER , pact ) ;
2020-10-21 08:48:38 +00:00
p - > holoduke_on = nullptr ;
2020-05-17 16:04:45 +00:00
checkavailinven ( p ) ;
}
}
if ( p - > jetpack_on & & p - > jetpack_amount > 0 )
{
p - > jetpack_amount - - ;
if ( p - > jetpack_amount < = 0 )
{
p - > jetpack_on = 0 ;
checkavailinven ( p ) ;
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( DUKE_JETPACK_OFF , pact ) ;
S_StopSound ( DUKE_JETPACK_IDLE , pact ) ;
S_StopSound ( DUKE_JETPACK_ON , pact ) ;
2020-05-17 16:04:45 +00:00
}
}
2021-12-21 17:19:45 +00:00
if ( p - > quick_kick > 0 & & p - > GetActor ( ) - > spr . pal ! = 1 )
2020-05-17 16:04:45 +00:00
{
2020-07-26 08:18:55 +00:00
p - > last_quick_kick = p - > quick_kick + 1 ;
2020-05-17 16:04:45 +00:00
p - > quick_kick - - ;
if ( p - > quick_kick = = 8 )
2022-12-29 09:56:10 +00:00
shoot ( p - > GetActor ( ) , DukeMeleeAttackClass ) ;
2020-05-17 16:04:45 +00:00
}
2020-07-26 08:18:55 +00:00
else if ( p - > last_quick_kick > 0 )
p - > last_quick_kick - - ;
2020-05-17 16:04:45 +00:00
2021-12-21 17:19:45 +00:00
if ( p - > access_incs & & p - > GetActor ( ) - > spr . pal ! = 1 )
2020-05-17 16:04:45 +00:00
{
2022-06-05 23:47:30 +00:00
p - > oaccess_incs = p - > access_incs ;
2020-05-17 16:04:45 +00:00
p - > access_incs + + ;
2021-12-21 17:19:45 +00:00
if ( p - > GetActor ( ) - > spr . extra < = 0 )
2020-05-17 16:04:45 +00:00
p - > access_incs = 12 ;
if ( p - > access_incs = = 12 )
{
2020-10-25 05:34:25 +00:00
if ( p - > access_spritenum ! = nullptr )
2020-05-17 16:04:45 +00:00
{
2022-12-11 14:42:33 +00:00
checkhitswitch ( snum , nullptr , p - > access_spritenum ) ;
2021-12-21 17:19:45 +00:00
switch ( p - > access_spritenum - > spr . pal )
2020-05-17 16:04:45 +00:00
{
case 0 : p - > got_access & = ( 0xffff - 0x1 ) ; break ;
case 21 : p - > got_access & = ( 0xffff - 0x2 ) ; break ;
case 23 : p - > got_access & = ( 0xffff - 0x4 ) ; break ;
}
2020-10-25 05:34:25 +00:00
p - > access_spritenum = nullptr ;
2020-05-17 16:04:45 +00:00
}
else
{
2022-12-11 14:42:33 +00:00
checkhitswitch ( snum , p - > access_wall , nullptr ) ;
2021-11-17 23:20:39 +00:00
switch ( p - > access_wall - > pal )
2020-05-17 16:04:45 +00:00
{
case 0 : p - > got_access & = ( 0xffff - 0x1 ) ; break ;
case 21 : p - > got_access & = ( 0xffff - 0x2 ) ; break ;
case 23 : p - > got_access & = ( 0xffff - 0x4 ) ; break ;
}
}
}
if ( p - > access_incs > 20 )
{
2022-06-05 23:47:30 +00:00
p - > oaccess_incs = p - > access_incs = 0 ;
2020-09-16 11:01:09 +00:00
p - > oweapon_pos = p - > weapon_pos = 10 ;
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-17 16:04:45 +00:00
}
}
2021-11-21 07:56:39 +00:00
if ( p - > scuba_on = = 0 & & p - > insector ( ) & & p - > cursector - > lotag = = 2 )
2020-05-17 16:04:45 +00:00
{
if ( p - > scuba_amount > 0 )
{
p - > scuba_on = 1 ;
p - > inven_icon = 6 ;
FTA ( 76 , p ) ;
}
else
{
if ( p - > airleft > 0 )
p - > airleft - - ;
else
{
p - > extra_extra8 + = 32 ;
2020-11-29 12:54:58 +00:00
if ( p - > last_extra < ( gs . max_player_health > > 1 ) & & ( p - > last_extra & 3 ) = = 0 )
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( DUKE_LONGTERM_PAIN , pact ) ;
2020-05-17 16:04:45 +00:00
}
}
}
else if ( p - > scuba_amount > 0 & & p - > scuba_on )
{
p - > scuba_amount - - ;
if ( p - > scuba_amount = = 0 )
{
p - > scuba_on = 0 ;
checkavailinven ( p ) ;
}
}
if ( p - > knuckle_incs )
{
p - > knuckle_incs + + ;
if ( p - > knuckle_incs = = 10 & & ! isWW2GI ( ) )
{
2021-02-18 10:46:36 +00:00
if ( PlayClock > 1024 )
2020-05-17 16:04:45 +00:00
if ( snum = = screenpeek | | ud . coop = = 1 )
{
if ( rand ( ) & 1 )
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( DUKE_CRACK , pact ) ;
else S_PlayActorSound ( DUKE_CRACK2 , pact ) ;
2020-05-17 16:04:45 +00:00
}
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( DUKE_CRACK_FIRST , pact ) ;
2020-05-17 16:04:45 +00:00
}
2020-08-28 20:51:05 +00:00
else if ( p - > knuckle_incs = = 22 | | PlayerInput ( snum , SB_FIRE ) )
2020-05-17 16:04:45 +00:00
p - > knuckle_incs = 0 ;
return 1 ;
}
return 0 ;
}
2022-12-29 08:56:14 +00:00
//---------------------------------------------------------------------------NAM
2020-05-17 21:44:53 +00:00
//
//
//
//---------------------------------------------------------------------------
2022-02-07 10:04:19 +00:00
void checkweapons_d ( player_struct * p )
2020-05-17 21:44:53 +00:00
{
2022-12-29 08:56:14 +00:00
static PClassActor * const * const weapon_sprites [ MAX_WEAPONS ] = { & DukeMeleeAttackClass , & DukeFirstgunSpriteClass , & DukeShotgunSpriteClass ,
& DukeChaingunSpriteClass , & DukeRPGSpriteClass , & DukePipeBombClass , & DukeShrinkerSpriteClass , & DukeDevastatorSpriteClass ,
& DukeTripBombSpriteClass , & DukeFreezeSpriteClass , & DukePipeBombClass , & DukeShrinkerSpriteClass } ;
2020-05-17 21:44:53 +00:00
int cw ;
if ( isWW2GI ( ) )
{
2022-09-01 15:26:46 +00:00
int snum = p - > GetActor ( ) - > PlayerIndex ( ) ;
2021-12-05 12:43:31 +00:00
cw = aplWeaponWorksLike ( p - > curr_weapon , snum ) ;
2020-05-17 21:44:53 +00:00
}
else
cw = p - > curr_weapon ;
if ( cw < 1 | | cw > = MAX_WEAPONS ) return ;
if ( cw )
{
if ( krand ( ) & 1 )
2022-12-29 08:56:14 +00:00
spawn ( p - > GetActor ( ) , * weapon_sprites [ cw ] ) ;
2020-05-17 21:44:53 +00:00
else switch ( cw )
{
case RPG_WEAPON :
case HANDBOMB_WEAPON :
2022-12-29 08:56:14 +00:00
spawn ( p - > GetActor ( ) , DukeExplosion2Class ) ;
2020-05-17 21:44:53 +00:00
break ;
}
}
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2022-09-14 19:29:37 +00:00
static void operateJetpack ( int snum , ESyncBits actions , int psectlotag , double floorz , double ceilingz , int shrunk )
2020-05-17 21:44:53 +00:00
{
auto p = & ps [ snum ] ;
2020-10-25 05:50:31 +00:00
auto pact = p - > GetActor ( ) ;
2020-05-17 21:44:53 +00:00
p - > on_ground = 0 ;
p - > jumping_counter = 0 ;
p - > hard_landing = 0 ;
p - > falling_counter = 0 ;
p - > pycount + = 32 ;
p - > pycount & = 2047 ;
2022-09-03 22:04:01 +00:00
p - > pyoff = BobVal ( p - > pycount ) ;
2020-05-17 21:44:53 +00:00
if ( p - > jetpack_on < 11 )
{
p - > jetpack_on + + ;
2022-11-20 08:14:51 +00:00
p - > GetActor ( ) - > spr . pos . Z - = p - > jetpack_on * 0.5 ; //Goin up
2020-05-17 21:44:53 +00:00
}
2020-10-25 05:50:31 +00:00
else if ( p - > jetpack_on = = 11 & & ! S_CheckActorSoundPlaying ( pact , DUKE_JETPACK_IDLE ) )
S_PlayActorSound ( DUKE_JETPACK_IDLE , pact ) ;
2020-05-17 21:44:53 +00:00
2022-02-05 12:40:30 +00:00
double dist ;
if ( shrunk ) dist = 2 ;
else dist = 8 ;
2020-05-17 21:44:53 +00:00
2020-08-28 20:51:05 +00:00
if ( actions & SB_JUMP ) //A (soar high)
2020-05-17 21:44:53 +00:00
{
// jump
2020-11-01 17:23:09 +00:00
SetGameVarID ( g_iReturnVarID , 0 , p - > GetActor ( ) , snum ) ;
2020-11-01 16:57:40 +00:00
OnEvent ( EVENT_SOARUP , snum , p - > GetActor ( ) , - 1 ) ;
2021-12-05 16:36:57 +00:00
if ( GetGameVarID ( g_iReturnVarID , p - > GetActor ( ) , snum ) . value ( ) = = 0 )
2020-05-17 21:44:53 +00:00
{
2022-11-20 08:14:51 +00:00
p - > GetActor ( ) - > spr . pos . Z - = dist ;
2020-08-27 05:54:49 +00:00
p - > crack_time = CRACK_TIME ;
2020-05-17 21:44:53 +00:00
}
}
2020-08-28 20:51:05 +00:00
if ( actions & SB_CROUCH ) //Z (soar low)
2020-05-17 21:44:53 +00:00
{
// crouch
2020-11-01 17:23:09 +00:00
SetGameVarID ( g_iReturnVarID , 0 , p - > GetActor ( ) , snum ) ;
2020-11-01 16:57:40 +00:00
OnEvent ( EVENT_SOARDOWN , snum , p - > GetActor ( ) , - 1 ) ;
2021-12-05 16:36:57 +00:00
if ( GetGameVarID ( g_iReturnVarID , p - > GetActor ( ) , snum ) . value ( ) = = 0 )
2020-05-17 21:44:53 +00:00
{
2022-11-20 08:14:51 +00:00
p - > GetActor ( ) - > spr . pos . Z + = dist ;
2020-08-27 05:54:49 +00:00
p - > crack_time = CRACK_TIME ;
2020-05-17 21:44:53 +00:00
}
}
int k ;
2022-12-30 13:05:39 +00:00
if ( shrunk = = 0 & & ( psectlotag = = ST_0_NO_EFFECT | | psectlotag = = ST_2_UNDERWATER ) ) k = 32 ;
2020-05-17 21:44:53 +00:00
else k = 16 ;
if ( psectlotag ! = 2 & & p - > scuba_on = = 1 )
p - > scuba_on = 0 ;
2022-11-21 04:20:08 +00:00
if ( p - > GetActor ( ) - > getOffsetZ ( ) > floorz - k )
p - > GetActor ( ) - > spr . pos . Z + = ( ( floorz - k ) - p - > GetActor ( ) - > getOffsetZ ( ) ) * 0.5 ;
if ( p - > GetActor ( ) - > getOffsetZ ( ) < pact - > ceilingz + 18 )
2022-11-21 04:34:37 +00:00
p - > GetActor ( ) - > spr . pos . Z = pact - > ceilingz + 18 + gs . playerheight ;
2020-05-17 21:44:53 +00:00
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2022-09-14 19:46:04 +00:00
static void movement ( int snum , ESyncBits actions , sectortype * psect , double floorz , double ceilingz , int shrunk , double truefdist , int psectlotag )
2020-05-17 21:44:53 +00:00
{
int j ;
auto p = & ps [ snum ] ;
2020-10-25 05:50:31 +00:00
auto pact = p - > GetActor ( ) ;
2020-05-17 21:44:53 +00:00
if ( p - > airleft ! = 15 * 26 )
p - > airleft = 15 * 26 ; //Aprox twenty seconds.
if ( p - > scuba_on = = 1 )
p - > scuba_on = 0 ;
2022-11-24 02:38:03 +00:00
double i = gs . playerheight ;
2020-08-07 19:59:11 +00:00
if ( psectlotag = = ST_1_ABOVE_WATER & & p - > spritebridge = = 0 )
2020-05-17 21:44:53 +00:00
{
if ( shrunk = = 0 )
{
i = 34 ;
p - > pycount + = 32 ;
p - > pycount & = 2047 ;
2022-09-03 22:04:01 +00:00
p - > pyoff = BobVal ( p - > pycount ) * 2 ;
2020-05-17 21:44:53 +00:00
}
else i = 12 ;
2022-09-14 19:46:04 +00:00
if ( shrunk = = 0 & & truefdist < = gs . playerheight )
2020-05-17 21:44:53 +00:00
{
if ( p - > on_ground = = 1 )
{
2020-10-25 06:21:33 +00:00
if ( p - > dummyplayersprite = = nullptr )
2022-12-29 08:56:14 +00:00
p - > dummyplayersprite = spawn ( pact , DukePlayerOnWaterClass ) ;
2020-05-17 21:44:53 +00:00
p - > footprintcount = 6 ;
2022-12-09 09:48:47 +00:00
if ( tilesurface ( p - > cursector - > floortexture ) = = TSURF_SLIME )
2020-05-17 21:44:53 +00:00
p - > footprintpal = 8 ;
else p - > footprintpal = 0 ;
p - > footprintshade = 0 ;
}
}
}
else
{
footprints ( snum ) ;
}
2022-11-21 04:20:08 +00:00
if ( p - > GetActor ( ) - > getOffsetZ ( ) < floorz - i ) //falling
2020-05-17 21:44:53 +00:00
{
// not jumping or crouching
2022-11-21 04:20:08 +00:00
if ( ( actions & ( SB_JUMP | SB_CROUCH ) ) = = 0 & & p - > on_ground & & ( psect - > floorstat & CSTAT_SECTOR_SLOPE ) & & p - > GetActor ( ) - > getOffsetZ ( ) > = ( floorz - i - 16 ) )
2022-11-21 04:34:37 +00:00
p - > GetActor ( ) - > spr . pos . Z = floorz - i + gs . playerheight ;
2020-05-17 21:44:53 +00:00
else
{
p - > on_ground = 0 ;
2022-09-11 22:40:33 +00:00
p - > vel . Z + = ( gs . gravity + 5 / 16. ) ; // (TICSPERFRAME<<6);
if ( p - > vel . Z > = ( 16 + 8 ) ) p - > vel . Z = ( 16 + 8 ) ;
if ( p - > vel . Z > 2400 / 256 & & p - > falling_counter < 255 )
2020-05-17 21:44:53 +00:00
{
p - > falling_counter + + ;
2020-10-25 05:50:31 +00:00
if ( p - > falling_counter = = 38 & & ! S_CheckActorSoundPlaying ( pact , DUKE_SCREAM ) )
S_PlayActorSound ( DUKE_SCREAM , pact ) ;
2020-05-17 21:44:53 +00:00
}
2022-11-21 04:20:08 +00:00
if ( p - > GetActor ( ) - > getOffsetZ ( ) + p - > vel . Z > = floorz - i ) // hit the ground
2020-08-07 20:20:29 +00:00
{
2020-10-25 05:50:31 +00:00
S_StopSound ( DUKE_SCREAM , pact ) ;
2021-11-21 07:56:39 +00:00
if ( ! p - > insector ( ) | | p - > cursector - > lotag ! = 1 )
2020-05-17 21:44:53 +00:00
{
if ( p - > falling_counter > 62 ) quickkill ( p ) ;
else if ( p - > falling_counter > 9 )
{
j = p - > falling_counter ;
2021-12-21 17:19:45 +00:00
pact - > spr . extra - = j - ( krand ( ) & 3 ) ;
if ( pact - > spr . extra < = 0 )
2020-05-17 21:44:53 +00:00
{
2020-10-25 05:50:31 +00:00
S_PlayActorSound ( SQUISHED , pact ) ;
2020-05-17 21:44:53 +00:00
SetPlayerPal ( p , PalEntry ( 63 , 63 , 0 , 0 ) ) ;
}
else
{
2020-10-25 05:50:31 +00:00
S_PlayActorSound ( DUKE_LAND , pact ) ;
S_PlayActorSound ( DUKE_LAND_HURT , pact ) ;
2020-05-17 21:44:53 +00:00
}
SetPlayerPal ( p , PalEntry ( 32 , 16 , 0 , 0 ) ) ;
}
2022-09-11 22:40:33 +00:00
else if ( p - > vel . Z > 8 ) S_PlayActorSound ( DUKE_LAND , pact ) ;
2020-05-17 21:44:53 +00:00
}
2020-08-07 20:20:29 +00:00
}
2020-05-17 21:44:53 +00:00
}
}
else
{
p - > falling_counter = 0 ;
2023-01-06 11:17:14 +00:00
S_StopSound ( DUKE_SCREAM , pact ) ;
2020-05-17 21:44:53 +00:00
2022-09-11 22:40:33 +00:00
if ( psectlotag ! = ST_1_ABOVE_WATER & & psectlotag ! = ST_2_UNDERWATER & & p - > on_ground = = 0 & & p - > vel . Z > 12 )
p - > hard_landing = uint8_t ( p - > vel . Z / 4. ) ;
2020-05-17 21:44:53 +00:00
p - > on_ground = 1 ;
2022-11-24 02:38:03 +00:00
if ( i = = gs . playerheight )
2020-05-17 21:44:53 +00:00
{
//Smooth on the ground
2022-11-21 04:20:08 +00:00
double k = ( floorz - i - p - > GetActor ( ) - > getOffsetZ ( ) ) * 0.5 ;
2022-11-20 08:14:51 +00:00
p - > GetActor ( ) - > spr . pos . Z + = k ;
2022-09-11 22:40:33 +00:00
p - > vel . Z - = 3 ;
2022-09-11 22:17:09 +00:00
if ( p - > vel . Z < 0 ) p - > vel . Z = 0 ;
2020-05-17 21:44:53 +00:00
}
else if ( p - > jumping_counter = = 0 )
{
2022-11-21 04:20:08 +00:00
p - > GetActor ( ) - > spr . pos . Z + = ( ( floorz - i * 0.5 ) - p - > GetActor ( ) - > getOffsetZ ( ) ) * 0.5 ; //Smooth on the water
if ( p - > on_warping_sector = = 0 & & p - > GetActor ( ) - > getOffsetZ ( ) > floorz - 16 )
2020-05-17 21:44:53 +00:00
{
2022-11-21 04:34:37 +00:00
p - > GetActor ( ) - > spr . pos . Z = floorz - 16 + gs . playerheight ;
2022-09-11 22:17:09 +00:00
p - > vel . Z * = 0.5 ;
2020-05-17 21:44:53 +00:00
}
}
p - > on_warping_sector = 0 ;
2023-03-17 22:15:15 +00:00
if ( actions & SB_CROUCH )
2020-05-17 21:44:53 +00:00
{
playerCrouch ( snum ) ;
}
// jumping
2020-08-28 20:51:05 +00:00
if ( ( actions & SB_JUMP ) = = 0 & & p - > jumping_toggle = = 1 )
2020-05-17 21:44:53 +00:00
p - > jumping_toggle = 0 ;
2020-08-28 20:51:05 +00:00
else if ( ( actions & SB_JUMP ) )
2020-05-17 21:44:53 +00:00
{
2022-09-14 20:04:41 +00:00
playerJump ( snum , floorz , ceilingz ) ;
2020-05-17 21:44:53 +00:00
}
2020-08-28 20:51:05 +00:00
if ( p - > jumping_counter & & ( actions & SB_JUMP ) = = 0 )
2020-05-17 21:44:53 +00:00
p - > jumping_toggle = 0 ;
}
if ( p - > jumping_counter )
{
2020-08-28 20:51:05 +00:00
if ( ( actions & SB_JUMP ) = = 0 & & p - > jumping_toggle = = 1 )
2020-05-17 21:44:53 +00:00
p - > jumping_toggle = 0 ;
if ( p - > jumping_counter < ( 1024 + 256 ) )
{
if ( psectlotag = = 1 & & p - > jumping_counter > 768 )
{
p - > jumping_counter = 0 ;
2022-09-11 22:40:33 +00:00
p - > vel . Z = - 2 ;
2020-05-17 21:44:53 +00:00
}
else
{
2022-09-11 22:40:33 +00:00
p - > vel . Z - = BobVal ( 2048 - 128 + p - > jumping_counter ) * ( 64. / 12 ) ;
2020-05-17 21:44:53 +00:00
p - > jumping_counter + = 180 ;
p - > on_ground = 0 ;
}
}
else
{
p - > jumping_counter = 0 ;
2022-09-11 22:17:09 +00:00
p - > vel . Z = 0 ;
2020-05-17 21:44:53 +00:00
}
}
2022-11-20 08:14:51 +00:00
p - > GetActor ( ) - > spr . pos . Z + = p - > vel . Z ;
2020-05-17 21:44:53 +00:00
2022-11-21 04:20:08 +00:00
if ( p - > GetActor ( ) - > getOffsetZ ( ) < ceilingz + 4 )
2020-05-17 21:44:53 +00:00
{
p - > jumping_counter = 0 ;
2022-09-11 22:17:09 +00:00
if ( p - > vel . Z < 0 )
p - > vel . X = p - > vel . Y = 0 ;
2022-09-11 22:40:33 +00:00
p - > vel . Z = 0.5 ;
2022-11-21 04:34:37 +00:00
p - > GetActor ( ) - > spr . pos . Z = ceilingz + 4 + gs . playerheight ;
2020-05-17 21:44:53 +00:00
}
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2022-09-14 19:46:04 +00:00
static void underwater ( int snum , ESyncBits actions , double floorz , double ceilingz )
2020-05-17 21:44:53 +00:00
{
auto p = & ps [ snum ] ;
2020-10-25 06:01:58 +00:00
auto pact = p - > GetActor ( ) ;
2020-05-17 21:44:53 +00:00
// under water
p - > jumping_counter = 0 ;
p - > pycount + = 32 ;
p - > pycount & = 2047 ;
2022-09-03 22:04:01 +00:00
p - > pyoff = BobVal ( p - > pycount ) ;
2020-05-17 21:44:53 +00:00
2020-10-25 06:01:58 +00:00
if ( ! S_CheckActorSoundPlaying ( pact , DUKE_UNDERWATER ) )
S_PlayActorSound ( DUKE_UNDERWATER , pact ) ;
2020-05-17 21:44:53 +00:00
2020-08-28 20:51:05 +00:00
if ( actions & SB_JUMP )
2020-05-17 21:44:53 +00:00
{
// jump
2022-09-11 22:17:09 +00:00
if ( p - > vel . Z > 0 ) p - > vel . Z = 0 ;
2022-09-11 22:40:33 +00:00
p - > vel . Z - = ( 348 / 256. ) ;
if ( p - > vel . Z < - 6 ) p - > vel . Z = - 6 ;
2020-05-17 21:44:53 +00:00
}
2020-08-28 20:51:05 +00:00
else if ( actions & SB_CROUCH )
2020-05-17 21:44:53 +00:00
{
// crouch
2022-09-11 22:17:09 +00:00
if ( p - > vel . Z < 0 ) p - > vel . Z = 0 ;
2022-09-11 22:40:33 +00:00
p - > vel . Z + = ( 348 / 256. ) ;
if ( p - > vel . Z > 6 ) p - > vel . Z = 6 ;
2020-05-17 21:44:53 +00:00
}
else
{
// normal view
2022-09-11 22:17:09 +00:00
if ( p - > vel . Z < 0 )
2020-05-17 21:44:53 +00:00
{
2022-09-11 22:40:33 +00:00
p - > vel . Z + = 1 ;
2022-09-11 22:17:09 +00:00
if ( p - > vel . Z > 0 )
p - > vel . Z = 0 ;
2020-05-17 21:44:53 +00:00
}
2022-09-11 22:17:09 +00:00
if ( p - > vel . Z > 0 )
2020-05-17 21:44:53 +00:00
{
2022-09-11 22:40:33 +00:00
p - > vel . Z - = 1 ;
2022-09-11 22:17:09 +00:00
if ( p - > vel . Z < 0 )
p - > vel . Z = 0 ;
2020-05-17 21:44:53 +00:00
}
}
2022-09-11 22:40:33 +00:00
if ( p - > vel . Z > 8 )
2022-09-11 22:17:09 +00:00
p - > vel . Z * = 0.5 ;
2020-05-17 21:44:53 +00:00
2022-11-20 08:14:51 +00:00
p - > GetActor ( ) - > spr . pos . Z + = p - > vel . Z ;
2020-05-17 21:44:53 +00:00
2022-11-21 04:20:08 +00:00
if ( p - > GetActor ( ) - > getOffsetZ ( ) > floorz - 15 )
p - > GetActor ( ) - > spr . pos . Z + = ( ( floorz - 15 ) - p - > GetActor ( ) - > getOffsetZ ( ) ) * 0.5 ;
2020-05-17 21:44:53 +00:00
2022-11-21 04:20:08 +00:00
if ( p - > GetActor ( ) - > getOffsetZ ( ) < ceilingz + 4 )
2020-05-17 21:44:53 +00:00
{
2022-11-21 04:34:37 +00:00
p - > GetActor ( ) - > spr . pos . Z = ceilingz + 4 + gs . playerheight ;
2022-09-11 22:17:09 +00:00
p - > vel . Z = 0 ;
2020-05-17 21:44:53 +00:00
}
if ( p - > scuba_on & & ( krand ( ) & 255 ) < 8 )
{
2022-12-29 08:56:14 +00:00
auto j = spawn ( pact , DukeWaterBubbleClass ) ;
2021-11-19 11:32:12 +00:00
if ( j )
{
2022-11-25 11:30:40 +00:00
j - > spr . pos + = ( p - > GetActor ( ) - > spr . Angles . Yaw . ToVector ( ) + DVector2 ( 4 - ( global_random & 8 ) , 4 - ( global_random & 8 ) ) ) * 16 ;
2022-10-07 21:52:29 +00:00
j - > spr . scale = DVector2 ( 0.046875 , 0.3125 ) ;
2022-11-21 04:20:08 +00:00
j - > spr . pos . Z = p - > GetActor ( ) - > getOffsetZ ( ) + 8 ;
2021-11-19 11:32:12 +00:00
}
2020-05-17 21:44:53 +00:00
}
}
2020-05-18 06:26:09 +00:00
2020-05-18 20:28:12 +00:00
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
int operateTripbomb ( int snum )
2020-05-18 06:26:09 +00:00
{
auto p = & ps [ snum ] ;
2021-12-06 11:24:22 +00:00
HitInfo hit { } ;
2022-10-11 01:57:54 +00:00
double vel = 1024 , zvel = 0 ;
2022-11-25 11:24:32 +00:00
setFreeAimVelocity ( vel , zvel , p - > Angles . getPitchWithView ( ) , 16. ) ;
2020-05-18 06:26:09 +00:00
2022-11-25 11:30:40 +00:00
hitscan ( p - > GetActor ( ) - > getPosWithOffsetZ ( ) , p - > cursector , DVector3 ( p - > GetActor ( ) - > spr . Angles . Yaw . ToVector ( ) * vel , zvel ) , hit , CLIPMASK1 ) ;
2020-05-18 06:26:09 +00:00
2021-11-25 23:08:59 +00:00
if ( hit . hitSector = = nullptr | | hit . actor ( ) )
2020-05-18 06:26:09 +00:00
return 0 ;
2021-11-25 23:08:59 +00:00
if ( hit . hitWall ! = nullptr & & hit . hitSector - > lotag > 2 )
2020-05-18 06:26:09 +00:00
return 0 ;
2022-12-09 23:56:40 +00:00
if ( hit . hitWall ! = nullptr )
2022-12-10 18:03:17 +00:00
if ( tileflags ( hit . hitWall - > overtexture ) & TFLAG_FORCEFIELD )
2020-05-18 06:26:09 +00:00
return 0 ;
2021-12-21 19:33:39 +00:00
DDukeActor * act ;
2021-11-25 23:08:59 +00:00
DukeSectIterator it ( hit . hitSector ) ;
2021-12-21 19:33:39 +00:00
while ( ( act = it . Next ( ) ) )
2020-05-18 06:26:09 +00:00
{
2022-12-20 21:25:48 +00:00
if ( ! ( act - > flags1 & SFLAG_BLOCK_TRIPBOMB ) )
2022-09-02 21:52:40 +00:00
{
auto delta = act - > spr . pos - hit . hitpos ;
if ( abs ( delta . Z ) < 12 & & delta . XY ( ) . LengthSquared ( ) < ( 18.125 * 18.125 ) )
return 0 ;
}
2020-05-18 06:26:09 +00:00
}
2021-12-21 19:33:39 +00:00
if ( act = = nullptr & & hit . hitWall ! = nullptr & & ( hit . hitWall - > cstat & CSTAT_WALL_MASKED ) = = 0 )
2021-11-25 23:08:59 +00:00
if ( ( hit . hitWall - > twoSided ( ) & & hit . hitWall - > nextSector ( ) - > lotag < = 2 ) | | ( ! hit . hitWall - > twoSided ( ) & & hit . hitSector - > lotag < = 2 ) )
2022-09-02 21:52:40 +00:00
{
2022-11-20 08:07:23 +00:00
auto delta = hit . hitpos . XY ( ) - p - > GetActor ( ) - > spr . pos . XY ( ) ;
2022-09-02 21:52:40 +00:00
if ( delta . LengthSquared ( ) < ( 18.125 * 18.125 ) )
2020-05-18 06:26:09 +00:00
{
2022-11-21 04:34:37 +00:00
p - > GetActor ( ) - > restorez ( ) ;
2022-09-11 22:18:56 +00:00
p - > vel . Z = 0 ;
2020-05-18 06:26:09 +00:00
return 1 ;
}
2022-09-02 21:52:40 +00:00
}
2020-05-18 06:26:09 +00:00
return 0 ;
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2020-05-18 22:26:07 +00:00
static void fireweapon ( int snum )
2020-05-18 06:26:09 +00:00
{
auto p = & ps [ snum ] ;
2020-11-02 19:24:07 +00:00
auto pact = p - > GetActor ( ) ;
2020-05-18 06:26:09 +00:00
2020-08-27 05:54:49 +00:00
p - > crack_time = CRACK_TIME ;
2020-05-18 06:26:09 +00:00
if ( p - > holster_weapon = = 1 )
{
if ( p - > last_pissed_time < = ( 26 * 218 ) & & p - > weapon_pos = = - 9 )
{
p - > holster_weapon = 0 ;
2020-09-16 11:01:09 +00:00
p - > oweapon_pos = p - > weapon_pos = 10 ;
2020-05-18 06:26:09 +00:00
FTA ( 74 , p ) ;
}
}
else switch ( p - > curr_weapon )
{
case HANDBOMB_WEAPON :
p - > hbomb_hold_delay = 0 ;
if ( p - > ammo_amount [ HANDBOMB_WEAPON ] > 0 )
2020-05-18 22:26:07 +00:00
p - > kickback_pic = 1 ;
2020-05-18 06:26:09 +00:00
break ;
case HANDREMOTE_WEAPON :
p - > hbomb_hold_delay = 0 ;
2020-05-18 22:26:07 +00:00
p - > kickback_pic = 1 ;
2020-05-18 06:26:09 +00:00
break ;
case PISTOL_WEAPON :
if ( p - > ammo_amount [ PISTOL_WEAPON ] > 0 )
{
p - > ammo_amount [ PISTOL_WEAPON ] - - ;
2020-05-18 22:26:07 +00:00
p - > kickback_pic = 1 ;
2020-05-18 06:26:09 +00:00
}
break ;
case CHAINGUN_WEAPON :
if ( p - > ammo_amount [ CHAINGUN_WEAPON ] > 0 ) // && p->random_club_frame == 0)
2020-05-18 22:26:07 +00:00
p - > kickback_pic = 1 ;
2020-05-18 06:26:09 +00:00
break ;
case SHOTGUN_WEAPON :
if ( p - > ammo_amount [ SHOTGUN_WEAPON ] > 0 & & p - > random_club_frame = = 0 )
2020-05-18 22:26:07 +00:00
p - > kickback_pic = 1 ;
2020-05-18 06:26:09 +00:00
break ;
case TRIPBOMB_WEAPON :
if ( p - > ammo_amount [ TRIPBOMB_WEAPON ] > 0 )
{
if ( operateTripbomb ( snum ) )
2020-05-18 22:26:07 +00:00
p - > kickback_pic = 1 ;
2020-05-18 06:26:09 +00:00
}
break ;
case SHRINKER_WEAPON :
case GROW_WEAPON :
if ( p - > curr_weapon = = GROW_WEAPON )
{
if ( p - > ammo_amount [ GROW_WEAPON ] > 0 )
{
2020-05-18 22:26:07 +00:00
p - > kickback_pic = 1 ;
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( EXPANDERSHOOT , pact ) ;
2020-05-18 06:26:09 +00:00
}
}
else if ( p - > ammo_amount [ SHRINKER_WEAPON ] > 0 )
{
2020-05-18 22:26:07 +00:00
p - > kickback_pic = 1 ;
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( SHRINKER_FIRE , pact ) ;
2020-05-18 06:26:09 +00:00
}
break ;
case FREEZE_WEAPON :
if ( p - > ammo_amount [ FREEZE_WEAPON ] > 0 )
{
2020-05-18 22:26:07 +00:00
p - > kickback_pic = 1 ;
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( CAT_FIRE , pact ) ;
2020-05-18 06:26:09 +00:00
}
break ;
case DEVISTATOR_WEAPON :
if ( p - > ammo_amount [ DEVISTATOR_WEAPON ] > 0 )
{
2020-05-18 22:26:07 +00:00
p - > kickback_pic = 1 ;
2020-05-18 06:26:09 +00:00
p - > hbomb_hold_delay = ! p - > hbomb_hold_delay ;
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( CAT_FIRE , pact ) ;
2020-05-18 06:26:09 +00:00
}
break ;
case RPG_WEAPON :
if ( p - > ammo_amount [ RPG_WEAPON ] > 0 )
{
2020-05-18 22:26:07 +00:00
p - > kickback_pic = 1 ;
2020-05-18 06:26:09 +00:00
}
break ;
2020-05-18 20:28:12 +00:00
case FLAMETHROWER_WEAPON : // Twentieth Anniversary World Tour
if ( isWorldTour ( ) & & p - > ammo_amount [ FLAMETHROWER_WEAPON ] > 0 )
{
2020-05-18 22:26:07 +00:00
p - > kickback_pic = 1 ;
2021-11-21 07:56:39 +00:00
if ( p - > cursector - > lotag ! = 2 )
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( FLAMETHROWER_INTRO , pact ) ;
2020-05-18 20:28:12 +00:00
}
break ;
2020-05-18 06:26:09 +00:00
case KNEE_WEAPON :
if ( p - > quick_kick = = 0 )
{
2020-05-18 22:26:07 +00:00
p - > kickback_pic = 1 ;
2020-05-18 06:26:09 +00:00
}
break ;
}
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2021-11-21 07:48:36 +00:00
static void operateweapon ( int snum , ESyncBits actions )
2020-05-18 06:26:09 +00:00
{
auto p = & ps [ snum ] ;
2020-10-24 05:34:39 +00:00
auto pact = p - > GetActor ( ) ;
2020-05-18 06:26:09 +00:00
// already firing...
2020-05-18 20:28:12 +00:00
switch ( p - > curr_weapon )
2020-05-18 06:26:09 +00:00
{
2020-05-18 20:28:12 +00:00
case HANDBOMB_WEAPON : // grenade in NAM
2020-08-28 20:51:05 +00:00
if ( p - > kickback_pic = = 6 & & ( actions & SB_FIRE ) )
2020-05-18 06:26:09 +00:00
{
p - > rapid_fire_hold = 1 ;
2020-05-18 20:28:12 +00:00
break ;
2020-05-18 06:26:09 +00:00
}
2020-05-18 22:26:07 +00:00
p - > kickback_pic + + ;
if ( p - > kickback_pic = = 12 )
2020-05-18 06:26:09 +00:00
{
2022-09-15 17:03:24 +00:00
double zvel , vel ;
2020-05-18 20:28:12 +00:00
p - > ammo_amount [ HANDBOMB_WEAPON ] - - ;
2020-05-18 06:26:09 +00:00
2020-08-28 20:51:05 +00:00
if ( p - > on_ground & & ( actions & SB_CROUCH ) )
2020-05-18 06:26:09 +00:00
{
2022-09-14 18:44:10 +00:00
vel = 15 / 16. ;
2022-11-25 11:24:32 +00:00
zvel = p - > Angles . getPitchWithView ( ) . Sin ( ) * 10. ;
2020-05-18 06:26:09 +00:00
}
else
{
2022-09-14 18:44:10 +00:00
vel = 140 / 16. ;
2022-11-25 11:24:32 +00:00
setFreeAimVelocity ( vel , zvel , p - > Angles . getPitchWithView ( ) , 10. ) ;
2022-10-11 01:57:01 +00:00
zvel - = 4 ;
2020-05-18 06:26:09 +00:00
}
2022-12-04 13:03:24 +00:00
auto spawned = CreateActor ( p - > cursector , p - > GetActor ( ) - > getPosWithOffsetZ ( ) + p - > GetActor ( ) - > spr . Angles . Yaw . ToVector ( ) * 16 , DTILE_HEAVYHBOMB , - 16 , DVector2 ( 0.140625 , 0.140625 ) ,
2022-12-01 09:19:37 +00:00
p - > GetActor ( ) - > spr . Angles . Yaw , vel + p - > hbomb_hold_delay * 2 , zvel , pact , STAT_ACTOR ) ;
2020-05-18 06:26:09 +00:00
2020-05-18 20:28:12 +00:00
if ( isNam ( ) )
2020-05-18 06:26:09 +00:00
{
2021-12-21 17:19:45 +00:00
spawned - > spr . extra = MulScale ( krand ( ) , NAM_GRENADE_LIFETIME_VAR , 14 ) ;
2020-05-18 06:26:09 +00:00
}
2022-09-15 17:03:24 +00:00
if ( vel = = 15 / 16. )
2020-05-18 06:26:09 +00:00
{
2022-09-01 16:15:52 +00:00
spawned - > spr . yint = 3 ;
2022-02-07 07:47:18 +00:00
spawned - > spr . pos . Z + = 8 ;
2020-05-18 06:26:09 +00:00
}
2022-09-13 22:05:32 +00:00
double hd = hits ( pact ) ;
if ( hd < 32 )
2020-05-18 06:26:09 +00:00
{
2022-11-25 12:13:50 +00:00
spawned - > spr . Angles . Yaw + = DAngle180 ;
2022-09-03 08:04:16 +00:00
spawned - > vel * = 1. / 3. ;
2020-05-18 06:26:09 +00:00
}
p - > hbomb_on = 1 ;
}
2020-08-28 20:51:05 +00:00
else if ( p - > kickback_pic < 12 & & ( actions & SB_FIRE ) )
2020-05-18 06:26:09 +00:00
p - > hbomb_hold_delay + + ;
2020-05-18 22:26:07 +00:00
else if ( p - > kickback_pic > 19 )
2020-05-18 06:26:09 +00:00
{
2020-08-03 05:02:30 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 06:26:09 +00:00
// don't change to remote when in NAM: grenades are timed
2020-05-18 20:28:12 +00:00
if ( isNam ( ) ) checkavailweapon ( p ) ;
else
{
p - > curr_weapon = HANDREMOTE_WEAPON ;
p - > last_weapon = - 1 ;
2020-08-03 05:05:38 +00:00
p - > oweapon_pos = p - > weapon_pos = 10 ;
2020-05-18 20:28:12 +00:00
}
2020-05-18 06:26:09 +00:00
}
2020-05-18 20:28:12 +00:00
break ;
case HANDREMOTE_WEAPON : // knife in NAM
2020-05-18 22:26:07 +00:00
p - > kickback_pic + + ;
2020-05-18 06:26:09 +00:00
2020-05-18 22:26:07 +00:00
if ( p - > kickback_pic = = 2 )
2020-05-18 06:26:09 +00:00
{
2020-05-18 20:28:12 +00:00
p - > hbomb_on = 0 ;
2020-05-18 06:26:09 +00:00
}
2020-05-18 22:26:07 +00:00
if ( p - > kickback_pic = = 10 )
2020-05-18 06:26:09 +00:00
{
2020-08-03 05:02:30 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 20:28:12 +00:00
int weapon = isNam ( ) ? TRIPBOMB_WEAPON : HANDBOMB_WEAPON ;
if ( p - > ammo_amount [ weapon ] > 0 )
2022-11-12 08:33:33 +00:00
fi . addweapon ( p , weapon , true ) ;
2020-05-18 06:26:09 +00:00
else
checkavailweapon ( p ) ;
}
2020-05-18 20:28:12 +00:00
break ;
2020-05-18 06:26:09 +00:00
2020-05-18 20:28:12 +00:00
case PISTOL_WEAPON : // m-16 in NAM
2020-05-18 22:26:07 +00:00
if ( p - > kickback_pic = = 1 )
2020-05-18 06:26:09 +00:00
{
2022-12-29 09:56:10 +00:00
shoot ( pact , DukeShotSparkClass ) ;
2020-10-24 05:34:39 +00:00
S_PlayActorSound ( PISTOL_FIRE , pact ) ;
2021-02-18 10:46:36 +00:00
lastvisinc = PlayClock + 32 ;
2020-05-18 20:28:12 +00:00
p - > visibility = 0 ;
2020-05-18 06:26:09 +00:00
}
2020-05-18 22:26:07 +00:00
else if ( p - > kickback_pic = = 2 )
2022-12-29 08:56:14 +00:00
spawn ( pact , DukeShellClass ) ;
2020-05-18 20:28:12 +00:00
2020-05-18 22:26:07 +00:00
p - > kickback_pic + + ;
2020-05-18 20:28:12 +00:00
2020-05-18 22:26:07 +00:00
if ( p - > kickback_pic > = 5 )
2020-05-18 20:28:12 +00:00
{
if ( p - > ammo_amount [ PISTOL_WEAPON ] < = 0 | | ( p - > ammo_amount [ PISTOL_WEAPON ] % ( isNam ( ) ? 20 : 12 ) ) )
2020-05-18 06:26:09 +00:00
{
2020-08-03 05:02:30 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 20:28:12 +00:00
checkavailweapon ( p ) ;
2020-05-18 06:26:09 +00:00
}
2020-05-18 20:28:12 +00:00
else
2020-05-18 06:26:09 +00:00
{
2020-05-18 22:26:07 +00:00
switch ( p - > kickback_pic )
2020-05-18 06:26:09 +00:00
{
2020-05-18 20:28:12 +00:00
case 5 :
2020-10-24 05:34:39 +00:00
S_PlayActorSound ( EJECT_CLIP , pact ) ;
2020-05-18 20:28:12 +00:00
break ;
//#ifdef NAM
2021-11-09 23:05:42 +00:00
// case WEAPON2_RELOAD_TIME - 15:
2020-05-18 20:28:12 +00:00
//#else
case 8 :
//#endif
2020-10-24 05:34:39 +00:00
S_PlayActorSound ( INSERT_CLIP , pact ) ;
2020-05-18 20:28:12 +00:00
break ;
2020-05-18 06:26:09 +00:00
}
}
2020-05-18 20:28:12 +00:00
}
2020-05-18 06:26:09 +00:00
2020-05-18 20:28:12 +00:00
// 3 second re-load time
2020-05-18 22:26:07 +00:00
if ( p - > kickback_pic = = ( isNam ( ) ? 50 : 27 ) )
2020-05-18 20:28:12 +00:00
{
2020-08-03 05:02:30 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 20:28:12 +00:00
checkavailweapon ( p ) ;
}
break ;
2020-05-18 06:26:09 +00:00
2020-05-18 20:28:12 +00:00
case SHOTGUN_WEAPON :
2020-05-18 06:26:09 +00:00
2020-05-18 22:26:07 +00:00
p - > kickback_pic + + ;
2020-05-18 06:26:09 +00:00
2020-05-18 22:26:07 +00:00
if ( p - > kickback_pic = = 4 )
2020-05-18 20:28:12 +00:00
{
2021-12-24 09:53:27 +00:00
for ( int ii = 0 ; ii < 7 ; ii + + )
2022-12-29 09:56:10 +00:00
shoot ( pact , DukeShotgunShotClass ) ;
2020-05-18 20:28:12 +00:00
p - > ammo_amount [ SHOTGUN_WEAPON ] - - ;
2020-05-18 06:26:09 +00:00
2020-10-24 05:34:39 +00:00
S_PlayActorSound ( SHOTGUN_FIRE , pact ) ;
2020-05-18 06:26:09 +00:00
2021-02-18 10:46:36 +00:00
lastvisinc = PlayClock + 32 ;
2020-05-18 20:28:12 +00:00
p - > visibility = 0 ;
2020-05-18 06:26:09 +00:00
}
2020-05-18 22:26:07 +00:00
switch ( p - > kickback_pic )
2020-05-18 06:26:09 +00:00
{
case 13 :
checkavailweapon ( p ) ;
break ;
case 15 :
2020-10-24 05:34:39 +00:00
S_PlayActorSound ( SHOTGUN_COCK , pact ) ;
2020-05-18 06:26:09 +00:00
break ;
case 17 :
case 20 :
p - > kickback_pic + + ;
break ;
case 24 :
2020-10-24 05:34:39 +00:00
{
2022-12-29 08:56:14 +00:00
auto j = spawn ( pact , DukeShotgunShellClass ) ;
2021-11-19 11:32:12 +00:00
if ( j )
{
2022-11-25 12:13:50 +00:00
j - > spr . Angles . Yaw + = DAngle180 ;
2021-11-19 11:32:12 +00:00
ssp ( j , CLIPMASK0 ) ;
2022-11-25 12:13:50 +00:00
j - > spr . Angles . Yaw - = DAngle180 ;
2021-11-19 11:32:12 +00:00
}
2020-05-18 06:26:09 +00:00
p - > kickback_pic + + ;
break ;
2020-10-24 05:34:39 +00:00
}
2020-05-18 06:26:09 +00:00
case 31 :
2020-08-03 05:02:30 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 06:26:09 +00:00
return ;
}
break ;
case CHAINGUN_WEAPON : // m-60 in NAM
2020-05-18 22:26:07 +00:00
p - > kickback_pic + + ;
2020-05-18 06:26:09 +00:00
2020-05-18 22:26:07 +00:00
if ( p - > kickback_pic < = 12 )
2020-05-18 06:26:09 +00:00
{
2020-05-18 22:26:07 +00:00
if ( ( ( p - > kickback_pic ) % 3 ) = = 0 )
2020-05-18 06:26:09 +00:00
{
2022-11-26 16:59:22 +00:00
if ( p - > ammo_amount [ CHAINGUN_WEAPON ] < = 0 )
{
p - > ammo_amount [ CHAINGUN_WEAPON ] = 0 ;
p - > okickback_pic = p - > kickback_pic = 0 ;
break ;
}
2020-05-18 06:26:09 +00:00
p - > ammo_amount [ CHAINGUN_WEAPON ] - - ;
2020-05-18 22:26:07 +00:00
if ( ( p - > kickback_pic % 3 ) = = 0 )
2020-05-18 06:26:09 +00:00
{
2022-12-29 08:56:14 +00:00
auto j = spawn ( pact , DukeShellClass ) ;
2021-11-19 11:32:12 +00:00
if ( j )
{
2022-11-25 12:13:50 +00:00
j - > spr . Angles . Yaw + = DAngle180 ;
2022-09-11 17:28:45 +00:00
j - > vel . X + = 2. ;
2022-02-07 07:47:18 +00:00
j - > spr . pos . Z + = 3 ;
2021-11-19 11:32:12 +00:00
ssp ( j , CLIPMASK0 ) ;
}
2020-05-18 06:26:09 +00:00
}
2020-10-24 05:34:39 +00:00
S_PlayActorSound ( CHAINGUN_FIRE , pact ) ;
2022-12-29 09:56:10 +00:00
shoot ( pact , DukeChaingunShotClass ) ;
2021-02-18 10:46:36 +00:00
lastvisinc = PlayClock + 32 ;
2020-05-18 06:26:09 +00:00
p - > visibility = 0 ;
checkavailweapon ( p ) ;
2020-08-28 20:51:05 +00:00
if ( ( actions & SB_FIRE ) = = 0 )
2020-05-18 06:26:09 +00:00
{
2020-08-03 05:02:30 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 06:26:09 +00:00
break ;
}
}
}
2020-05-18 22:26:07 +00:00
else if ( p - > kickback_pic > 10 )
2020-05-18 06:26:09 +00:00
{
2020-08-28 20:51:05 +00:00
if ( actions & SB_FIRE ) p - > okickback_pic = p - > kickback_pic = 1 ;
2020-08-03 05:02:30 +00:00
else p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 06:26:09 +00:00
}
break ;
case GROW_WEAPON : // m-14 with scope (sniper rifle)
2020-05-18 20:28:12 +00:00
bool check ;
if ( isNam ( ) )
2020-05-18 06:26:09 +00:00
{
2020-05-18 22:26:07 +00:00
p - > kickback_pic + + ;
check = ( p - > kickback_pic = = 3 ) ;
2020-05-18 06:26:09 +00:00
}
else
{
2020-05-18 22:26:07 +00:00
check = ( p - > kickback_pic > 3 ) ;
2020-05-18 06:26:09 +00:00
}
2020-05-18 20:28:12 +00:00
if ( check )
2020-05-18 06:26:09 +00:00
{
2020-05-18 20:28:12 +00:00
// fire now, but don't reload right away...
if ( isNam ( ) )
{
2020-05-18 22:26:07 +00:00
p - > kickback_pic + + ;
2020-05-18 06:26:09 +00:00
if ( p - > ammo_amount [ p - > curr_weapon ] < = 1 )
2020-08-03 05:02:30 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 06:26:09 +00:00
}
2020-05-18 20:28:12 +00:00
else
2020-08-03 05:02:30 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 20:28:12 +00:00
p - > ammo_amount [ p - > curr_weapon ] - - ;
2022-12-29 09:56:10 +00:00
shoot ( pact , DukeGrowSparkClass ) ;
2020-05-18 20:28:12 +00:00
//#ifdef NAM
//#else
2021-12-05 12:43:31 +00:00
if ( ! ( aplWeaponFlags ( p - > curr_weapon , snum ) & WEAPON_FLAG_NOVISIBLE ) )
2020-05-18 20:28:12 +00:00
{
// make them visible if not set...
p - > visibility = 0 ;
2021-02-18 10:46:36 +00:00
lastvisinc = PlayClock + 32 ;
2020-05-18 06:26:09 +00:00
}
2020-05-18 20:28:12 +00:00
checkavailweapon ( p ) ;
//#endif
2020-05-18 06:26:09 +00:00
}
2020-05-18 22:26:07 +00:00
else if ( ! isNam ( ) ) p - > kickback_pic + + ;
2022-01-08 20:42:44 +00:00
if ( isNam ( ) & & p - > kickback_pic > 30 )
2020-05-18 06:26:09 +00:00
{
2020-05-18 20:28:12 +00:00
// reload now...
2020-08-03 05:02:30 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2021-12-05 12:43:31 +00:00
if ( ! ( aplWeaponFlags ( p - > curr_weapon , snum ) & WEAPON_FLAG_NOVISIBLE ) )
2020-05-18 06:26:09 +00:00
{
2020-05-18 20:28:12 +00:00
// make them visible if not set...
2020-05-18 06:26:09 +00:00
p - > visibility = 0 ;
2021-02-18 10:46:36 +00:00
lastvisinc = PlayClock + 32 ;
2020-05-18 06:26:09 +00:00
}
2020-05-18 20:28:12 +00:00
checkavailweapon ( p ) ;
}
break ;
case SHRINKER_WEAPON : // m-79 in NAM (Grenade launcher)
2020-05-18 22:26:07 +00:00
if ( ( ! isNam ( ) & & p - > kickback_pic > 10 ) | | ( isNam ( ) & & p - > kickback_pic = = 10 ) )
2020-05-18 20:28:12 +00:00
{
2020-05-18 22:26:07 +00:00
if ( isNam ( ) ) p - > kickback_pic + + ; // fire now, but wait for reload...
2020-08-03 05:02:30 +00:00
else p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 20:28:12 +00:00
p - > ammo_amount [ SHRINKER_WEAPON ] - - ;
2022-12-29 09:56:10 +00:00
shoot ( pact , DukeShrinkerClass ) ;
2020-05-18 20:28:12 +00:00
if ( ! isNam ( ) )
2020-05-18 06:26:09 +00:00
{
p - > visibility = 0 ;
2020-05-18 20:28:12 +00:00
//flashColor = 176 + (252 << 8) + (120 << 16);
2021-02-18 10:46:36 +00:00
lastvisinc = PlayClock + 32 ;
2020-05-18 06:26:09 +00:00
checkavailweapon ( p ) ;
}
}
2020-05-18 22:26:07 +00:00
else if ( isNam ( ) & & p - > kickback_pic > 30 )
2020-05-18 20:28:12 +00:00
{
2020-08-03 05:02:30 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 20:28:12 +00:00
p - > visibility = 0 ;
2021-02-18 10:46:36 +00:00
lastvisinc = PlayClock + 32 ;
2020-05-18 20:28:12 +00:00
checkavailweapon ( p ) ;
}
2020-05-18 22:26:07 +00:00
else p - > kickback_pic + + ;
2020-05-18 06:26:09 +00:00
break ;
case DEVISTATOR_WEAPON :
2020-05-18 22:26:07 +00:00
if ( p - > kickback_pic )
2020-05-18 06:26:09 +00:00
{
2020-05-18 22:26:07 +00:00
p - > kickback_pic + + ;
2020-05-18 06:26:09 +00:00
2020-08-05 19:48:16 +00:00
if ( isNam ( ) )
{
if ( ( p - > kickback_pic > = 2 ) & &
p - > kickback_pic < 5 & &
2020-05-18 22:26:07 +00:00
( p - > kickback_pic & 1 ) )
2020-05-18 06:26:09 +00:00
{
2020-08-05 19:48:16 +00:00
p - > visibility = 0 ;
2021-02-18 10:46:36 +00:00
lastvisinc = PlayClock + 32 ;
2022-12-29 09:56:10 +00:00
shoot ( pact , DukeRPGClass ) ;
2020-05-18 06:26:09 +00:00
p - > ammo_amount [ DEVISTATOR_WEAPON ] - - ;
checkavailweapon ( p ) ;
}
2020-09-16 11:01:09 +00:00
if ( p - > kickback_pic > 5 ) p - > okickback_pic = p - > kickback_pic = 0 ;
2020-08-05 19:48:16 +00:00
}
else if ( p - > kickback_pic & 1 )
{
p - > visibility = 0 ;
2021-02-18 10:46:36 +00:00
lastvisinc = PlayClock + 32 ;
2022-12-29 09:56:10 +00:00
shoot ( pact , DukeRPGClass ) ;
2020-08-05 19:48:16 +00:00
p - > ammo_amount [ DEVISTATOR_WEAPON ] - - ;
checkavailweapon ( p ) ;
2020-09-16 11:01:09 +00:00
if ( p - > ammo_amount [ DEVISTATOR_WEAPON ] < = 0 ) p - > okickback_pic = p - > kickback_pic = 0 ;
2020-08-05 19:48:16 +00:00
}
2020-09-16 11:01:09 +00:00
if ( p - > kickback_pic > 5 ) p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 06:26:09 +00:00
}
break ;
case FREEZE_WEAPON :
// flame thrower in NAM
2020-05-18 22:26:07 +00:00
if ( p - > kickback_pic < 4 )
2020-05-18 06:26:09 +00:00
{
2020-05-18 22:26:07 +00:00
p - > kickback_pic + + ;
if ( p - > kickback_pic = = 3 )
2020-05-18 06:26:09 +00:00
{
p - > ammo_amount [ p - > curr_weapon ] - - ;
p - > visibility = 0 ;
2021-02-18 10:46:36 +00:00
lastvisinc = PlayClock + 32 ;
2022-12-29 09:56:10 +00:00
shoot ( pact , DukeFreezeBlastClass ) ;
2020-05-18 06:26:09 +00:00
checkavailweapon ( p ) ;
}
2022-10-07 21:33:37 +00:00
if ( pact - > spr . scale . X < 0.5 )
2020-05-18 06:26:09 +00:00
{
2020-08-03 05:02:30 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ; break ;
2020-05-18 06:26:09 +00:00
}
}
else
{
2020-08-28 20:51:05 +00:00
if ( actions & SB_FIRE )
2020-05-18 06:26:09 +00:00
{
2020-08-03 05:02:30 +00:00
p - > okickback_pic = p - > kickback_pic = 1 ;
2020-10-24 05:34:39 +00:00
S_PlayActorSound ( CAT_FIRE , pact ) ;
2020-05-18 06:26:09 +00:00
}
2020-09-16 11:01:09 +00:00
else p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 06:26:09 +00:00
}
break ;
2020-05-18 20:28:12 +00:00
case FLAMETHROWER_WEAPON :
if ( ! isWorldTour ( ) ) // Twentieth Anniversary World Tour
break ;
2020-05-18 22:26:07 +00:00
p - > kickback_pic + + ;
if ( p - > kickback_pic = = 2 )
2020-05-18 20:28:12 +00:00
{
2021-11-21 07:56:39 +00:00
if ( p - > cursector - > lotag ! = 2 )
2020-05-18 20:28:12 +00:00
{
p - > ammo_amount [ FLAMETHROWER_WEAPON ] - - ;
2022-12-29 09:56:10 +00:00
shoot ( pact , DukeFireballClass ) ;
2020-05-18 20:28:12 +00:00
}
checkavailweapon ( p ) ;
}
2020-05-18 22:26:07 +00:00
else if ( p - > kickback_pic = = 16 )
2020-05-18 20:28:12 +00:00
{
2020-08-28 20:51:05 +00:00
if ( ( actions & SB_FIRE ) ! = 0 )
2020-05-18 20:28:12 +00:00
{
2020-08-03 05:02:30 +00:00
p - > okickback_pic = p - > kickback_pic = 1 ;
2020-10-24 05:34:39 +00:00
S_PlayActorSound ( FLAMETHROWER_INTRO , pact ) ;
2020-05-18 20:28:12 +00:00
}
else
2020-08-03 05:02:30 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 20:28:12 +00:00
}
break ;
2020-05-18 06:26:09 +00:00
case TRIPBOMB_WEAPON : // Claymore in NAM
2020-05-18 22:26:07 +00:00
if ( p - > kickback_pic < 4 )
2020-05-18 06:26:09 +00:00
{
2022-11-21 04:34:37 +00:00
p - > GetActor ( ) - > restorez ( ) ;
2022-09-11 22:18:56 +00:00
p - > vel . Z = 0 ;
2020-05-18 22:26:07 +00:00
if ( p - > kickback_pic = = 3 )
2022-12-29 09:56:10 +00:00
shoot ( pact , DukeHandHoldingLaserClass ) ;
2020-05-18 06:26:09 +00:00
}
2020-05-18 22:26:07 +00:00
if ( p - > kickback_pic = = 16 )
2020-05-18 06:26:09 +00:00
{
2020-08-03 05:02:30 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 06:26:09 +00:00
checkavailweapon ( p ) ;
2020-08-03 05:05:38 +00:00
p - > oweapon_pos = p - > weapon_pos = - 9 ;
2020-05-18 06:26:09 +00:00
}
2020-05-18 22:26:07 +00:00
else p - > kickback_pic + + ;
2020-05-18 06:26:09 +00:00
break ;
case KNEE_WEAPON :
2020-05-18 22:26:07 +00:00
p - > kickback_pic + + ;
2020-05-18 06:26:09 +00:00
2022-12-29 09:56:10 +00:00
if ( p - > kickback_pic = = 7 ) shoot ( pact , DukeMeleeAttackClass ) ;
2020-05-18 22:26:07 +00:00
else if ( p - > kickback_pic = = 14 )
2020-05-18 06:26:09 +00:00
{
2020-08-28 20:51:05 +00:00
if ( actions & SB_FIRE )
2020-08-03 05:02:30 +00:00
p - > okickback_pic = p - > kickback_pic = 1 + ( krand ( ) & 3 ) ;
else p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 06:26:09 +00:00
}
if ( p - > wantweaponfire > = 0 )
checkavailweapon ( p ) ;
break ;
case RPG_WEAPON : // m-72 in NAM (LAW)
2020-05-18 22:26:07 +00:00
p - > kickback_pic + + ;
if ( p - > kickback_pic = = 4 )
2020-05-18 06:26:09 +00:00
{
p - > ammo_amount [ RPG_WEAPON ] - - ;
2021-02-18 10:46:36 +00:00
lastvisinc = PlayClock + 32 ;
2020-05-18 06:26:09 +00:00
p - > visibility = 0 ;
2022-12-29 09:56:10 +00:00
shoot ( pact , DukeRPGClass ) ;
2020-05-18 06:26:09 +00:00
checkavailweapon ( p ) ;
}
2021-03-31 09:35:10 +00:00
else if ( p - > kickback_pic = = 20 )
2020-08-03 05:02:30 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 06:26:09 +00:00
break ;
}
}
2020-05-18 20:28:12 +00:00
2020-05-19 07:54:52 +00:00
//---------------------------------------------------------------------------
//
// this function exists because gotos suck. :P
//
//---------------------------------------------------------------------------
2021-11-21 07:48:36 +00:00
static void processweapon ( int snum , ESyncBits actions )
2020-05-19 07:54:52 +00:00
{
auto p = & ps [ snum ] ;
2020-10-25 05:34:25 +00:00
auto pact = p - > GetActor ( ) ;
2022-10-07 21:33:37 +00:00
int shrunk = ( pact - > spr . scale . Y < 0.5 ) ;
2020-05-19 07:54:52 +00:00
2020-08-27 22:03:35 +00:00
if ( isNamWW2GI ( ) & & ( actions & SB_HOLSTER ) ) // 'Holster Weapon
2020-05-19 07:54:52 +00:00
{
if ( isWW2GI ( ) )
{
2020-11-01 17:23:09 +00:00
SetGameVarID ( g_iReturnVarID , 0 , p - > GetActor ( ) , snum ) ;
SetGameVarID ( g_iWeaponVarID , p - > curr_weapon , p - > GetActor ( ) , snum ) ;
2021-12-05 12:43:31 +00:00
SetGameVarID ( g_iWorksLikeVarID , aplWeaponWorksLike ( p - > curr_weapon , snum ) , p - > GetActor ( ) , snum ) ;
2020-11-01 16:57:40 +00:00
OnEvent ( EVENT_HOLSTER , snum , p - > GetActor ( ) , - 1 ) ;
2021-12-05 16:36:57 +00:00
if ( GetGameVarID ( g_iReturnVarID , p - > GetActor ( ) , snum ) . value ( ) = = 0 )
2020-05-19 07:54:52 +00:00
{
// now it uses the game definitions...
2021-12-05 12:43:31 +00:00
if ( aplWeaponFlags ( p - > curr_weapon , snum ) & WEAPON_FLAG_HOLSTER_CLEARS_CLIP )
2020-05-19 07:54:52 +00:00
{
2021-12-05 12:43:31 +00:00
if ( p - > ammo_amount [ p - > curr_weapon ] > aplWeaponClip ( p - > curr_weapon , snum )
& & ( p - > ammo_amount [ p - > curr_weapon ] % aplWeaponClip ( p - > curr_weapon , snum ) ) ! = 0 )
2020-05-19 07:54:52 +00:00
{
// throw away the remaining clip
p - > ammo_amount [ p - > curr_weapon ] - =
2021-12-05 12:43:31 +00:00
p - > ammo_amount [ p - > curr_weapon ] % aplWeaponClip ( p - > curr_weapon , snum ) ;
// p->kickback_pic = aplWeaponFireDelay(p->curr_weapon, snum)+1; // animate, but don't shoot...
p - > kickback_pic = aplWeaponTotalTime ( p - > curr_weapon , snum ) + 1 ; // animate, but don't shoot...
2020-08-28 20:51:05 +00:00
actions & = ~ SB_FIRE ; // not firing...
2020-05-19 07:54:52 +00:00
}
return ;
}
}
}
else if ( p - > curr_weapon = = PISTOL_WEAPON )
{
if ( p - > ammo_amount [ PISTOL_WEAPON ] > 20 )
{
// throw away the remaining clip
p - > ammo_amount [ PISTOL_WEAPON ] - = p - > ammo_amount [ PISTOL_WEAPON ] % 20 ;
p - > kickback_pic = 3 ; // animate, but don't shoot...
2020-08-28 20:51:05 +00:00
actions & = ~ SB_FIRE ; // not firing...
2020-05-19 07:54:52 +00:00
}
return ;
}
}
2021-12-05 12:43:31 +00:00
if ( isWW2GI ( ) & & ( aplWeaponFlags ( p - > curr_weapon , snum ) & WEAPON_FLAG_GLOWS ) )
2020-05-19 07:54:52 +00:00
p - > random_club_frame + = 64 ; // Glowing
if ( ! isWW2GI ( ) & & ( p - > curr_weapon = = SHRINKER_WEAPON | | p - > curr_weapon = = GROW_WEAPON ) )
p - > random_club_frame + = 64 ; // Glowing
if ( p - > rapid_fire_hold = = 1 )
{
2020-08-28 20:51:05 +00:00
if ( actions & SB_FIRE ) return ;
2020-05-19 07:54:52 +00:00
p - > rapid_fire_hold = 0 ;
}
if ( shrunk | | p - > tipincs | | p - > access_incs )
2020-08-28 20:51:05 +00:00
actions & = ~ SB_FIRE ;
else if ( shrunk = = 0 & & ( actions & SB_FIRE ) & & p - > kickback_pic = = 0 & & p - > fist_incs = = 0 & &
2020-05-19 07:54:52 +00:00
p - > last_weapon = = - 1 & & ( p - > weapon_pos = = 0 | | p - > holster_weapon = = 1 ) )
{
if ( ! isWW2GI ( ) ) fireweapon ( snum ) ;
else fireweapon_ww ( snum ) ;
}
else if ( p - > kickback_pic )
{
2021-11-21 07:48:36 +00:00
if ( ! isWW2GI ( ) ) operateweapon ( snum , actions ) ;
else operateweapon_ww ( snum , actions ) ;
2020-05-19 07:54:52 +00:00
}
}
2020-05-18 22:26:07 +00:00
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2020-05-19 07:03:07 +00:00
void processinput_d ( int snum )
2020-05-18 22:26:07 +00:00
{
2022-09-14 19:46:04 +00:00
int k , doubvel ;
double floorz , ceilingz , truefdist ;
2020-10-25 06:12:04 +00:00
Collision chz , clz ;
bool shrunk ;
2021-11-21 07:48:36 +00:00
int psectlotag ;
2022-02-07 10:04:19 +00:00
player_struct * p ;
2020-05-18 22:26:07 +00:00
p = & ps [ snum ] ;
2020-10-25 05:34:25 +00:00
auto pact = p - > GetActor ( ) ;
2020-05-18 22:26:07 +00:00
2021-04-21 10:41:04 +00:00
ESyncBits & actions = p - > sync . actions ;
2020-05-18 22:26:07 +00:00
2023-04-22 09:34:44 +00:00
// Get strafe value before it's rotated by the angle.
const auto strafeVel = PlayerInputSideVel ( snum ) ;
constexpr auto maxVel = ( 117351124. / 10884538. ) ;
2023-03-19 09:42:12 +00:00
processinputvel ( snum ) ;
2020-07-03 19:44:57 +00:00
auto sb_fvel = PlayerInputForwardVel ( snum ) ;
auto sb_svel = PlayerInputSideVel ( snum ) ;
2020-05-18 22:26:07 +00:00
2021-11-21 07:56:39 +00:00
auto psectp = p - > cursector ;
2021-11-21 07:48:36 +00:00
if ( psectp = = nullptr )
2020-05-18 22:26:07 +00:00
{
2021-12-21 19:33:39 +00:00
if ( pact - > spr . extra > 0 & & ud . clipping = = 0 )
2020-05-18 22:26:07 +00:00
{
quickkill ( p ) ;
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( SQUISHED , pact ) ;
2020-05-18 22:26:07 +00:00
}
2021-11-21 07:48:36 +00:00
psectp = & sector [ 0 ] ;
2020-05-18 22:26:07 +00:00
}
2021-11-18 16:34:31 +00:00
psectlotag = psectp - > lotag ;
2020-05-18 22:26:07 +00:00
p - > spritebridge = 0 ;
2022-10-07 21:33:37 +00:00
shrunk = ( pact - > spr . scale . Y < 0.5 ) ;
2022-11-24 02:20:17 +00:00
getzrange ( p - > GetActor ( ) - > getPosWithOffsetZ ( ) , psectp , & ceilingz , chz , & floorz , clz , 10.1875 , CLIPMASK0 ) ;
2020-05-18 22:26:07 +00:00
2023-03-16 11:24:34 +00:00
setPlayerActorViewZOffset ( pact ) ;
2023-03-16 11:15:11 +00:00
2022-11-24 02:20:17 +00:00
p - > truefz = getflorzofslopeptr ( psectp , p - > GetActor ( ) - > getPosWithOffsetZ ( ) ) ;
p - > truecz = getceilzofslopeptr ( psectp , p - > GetActor ( ) - > getPosWithOffsetZ ( ) ) ;
2020-05-18 22:26:07 +00:00
2022-11-21 04:20:08 +00:00
truefdist = abs ( p - > GetActor ( ) - > getOffsetZ ( ) - p - > truefz ) ;
2022-09-14 19:46:04 +00:00
if ( clz . type = = kHitSector & & psectlotag = = 1 & & truefdist > gs . playerheight + 16 )
2020-05-18 22:26:07 +00:00
psectlotag = 0 ;
2022-09-14 19:46:04 +00:00
pact - > floorz = floorz ;
pact - > ceilingz = ceilingz ;
2020-05-18 22:26:07 +00:00
2022-11-25 10:18:36 +00:00
doslopetilting ( p ) ;
2020-05-18 22:26:07 +00:00
2020-10-25 06:12:04 +00:00
if ( chz . type = = kHitSprite )
2020-05-18 22:26:07 +00:00
{
2021-12-21 17:19:45 +00:00
if ( chz . actor ( ) - > spr . statnum = = 1 & & chz . actor ( ) - > spr . extra > = 0 )
2020-05-18 22:26:07 +00:00
{
2021-11-26 12:41:15 +00:00
chz . setNone ( ) ;
2022-09-14 19:46:04 +00:00
ceilingz = p - > truecz ;
2020-05-18 22:26:07 +00:00
}
}
2020-10-25 06:12:04 +00:00
if ( clz . type = = kHitSprite )
2020-05-18 22:26:07 +00:00
{
2021-12-21 17:19:45 +00:00
if ( ( clz . actor ( ) - > spr . cstat & ( CSTAT_SPRITE_ALIGNMENT_FLOOR | CSTAT_SPRITE_BLOCK ) ) = = ( CSTAT_SPRITE_ALIGNMENT_FLOOR | CSTAT_SPRITE_BLOCK ) )
2020-05-18 22:26:07 +00:00
{
psectlotag = 0 ;
p - > footprintcount = 0 ;
p - > spritebridge = 1 ;
}
2022-10-07 21:33:37 +00:00
else if ( badguy ( clz . actor ( ) ) & & clz . actor ( ) - > spr . scale . X > 0.375 & & abs ( pact - > spr . pos . Z - clz . actor ( ) - > spr . pos . Z ) < 84 )
2020-05-18 22:26:07 +00:00
{
2022-11-24 02:20:17 +00:00
auto ang = ( clz . actor ( ) - > spr . pos . XY ( ) - p - > GetActor ( ) - > spr . pos . XY ( ) ) . Angle ( ) ;
2022-09-11 22:40:33 +00:00
p - > vel . XY ( ) - = ang . ToVector ( ) ;
2020-05-18 22:26:07 +00:00
}
2022-12-02 22:26:55 +00:00
CallStandingOn ( clz . actor ( ) , p ) ;
2020-05-18 22:26:07 +00:00
}
2021-12-21 19:33:39 +00:00
if ( pact - > spr . extra > 0 ) fi . incur_damage ( p ) ;
2020-05-18 22:26:07 +00:00
else
{
2021-12-21 19:33:39 +00:00
pact - > spr . extra = 0 ;
2020-05-18 22:26:07 +00:00
p - > shield_amount = 0 ;
}
2021-12-21 19:33:39 +00:00
p - > last_extra = pact - > spr . extra ;
2020-05-18 22:26:07 +00:00
2022-06-06 01:24:38 +00:00
if ( p - > loogcnt > 0 )
{
p - > oloogcnt = p - > loogcnt ;
p - > loogcnt - - ;
}
else
{
p - > oloogcnt = p - > loogcnt = 0 ;
}
2020-05-18 22:26:07 +00:00
if ( p - > fist_incs )
{
if ( endoflevel ( snum ) ) return ;
}
if ( p - > timebeforeexit > 1 & & p - > last_extra > 0 )
{
if ( timedexit ( snum ) )
return ;
}
2021-12-21 19:33:39 +00:00
if ( pact - > spr . extra < = 0 & & ! ud . god )
2020-05-18 22:26:07 +00:00
{
2022-09-14 19:46:04 +00:00
playerisdead ( snum , psectlotag , floorz , ceilingz ) ;
2020-07-16 13:03:09 +00:00
return ;
2020-05-18 22:26:07 +00:00
}
2022-10-07 21:33:37 +00:00
if ( p - > GetActor ( ) - > spr . scale . X < 0.625 & & p - > jetpack_on = = 0 )
2022-01-15 14:48:50 +00:00
{
2022-06-06 00:51:57 +00:00
p - > ofistsign = p - > fistsign ;
2022-10-12 17:00:43 +00:00
p - > fistsign + = int ( p - > GetActor ( ) - > vel . X * 16 ) ;
2022-01-15 14:48:50 +00:00
}
2020-05-18 22:26:07 +00:00
if ( p - > transporter_hold > 0 )
{
p - > transporter_hold - - ;
if ( p - > transporter_hold = = 0 & & p - > on_warping_sector )
p - > transporter_hold = 2 ;
}
if ( p - > transporter_hold < 0 )
p - > transporter_hold + + ;
2020-11-02 23:20:51 +00:00
if ( p - > newOwner ! = nullptr )
2020-05-18 22:26:07 +00:00
{
2023-03-23 06:09:02 +00:00
setForcedSyncInput ( snum ) ;
2022-09-11 22:18:56 +00:00
p - > vel . X = p - > vel . Y = 0 ;
2022-09-03 08:02:25 +00:00
pact - > vel . X = 0 ;
2020-05-18 22:26:07 +00:00
fi . doincrements ( p ) ;
2021-12-05 12:43:31 +00:00
if ( isWW2GI ( ) & & aplWeaponWorksLike ( p - > curr_weapon , snum ) = = HANDREMOTE_WEAPON ) processweapon ( snum , actions ) ;
2021-11-21 07:48:36 +00:00
if ( ! isWW2GI ( ) & & p - > curr_weapon = = HANDREMOTE_WEAPON ) processweapon ( snum , actions ) ;
2020-05-18 22:26:07 +00:00
return ;
}
doubvel = TICSPERFRAME ;
2020-08-29 11:32:14 +00:00
checklook ( snum , actions ) ;
2023-03-21 10:37:25 +00:00
p - > Angles . doViewYaw ( & p - > sync ) ;
2020-05-18 22:26:07 +00:00
2023-03-26 02:34:58 +00:00
p - > updatecentering ( snum ) ;
2023-03-23 05:34:07 +00:00
2020-10-17 08:44:00 +00:00
if ( p - > on_crane ! = nullptr )
2023-03-18 08:28:02 +00:00
{
2023-03-23 06:09:02 +00:00
setForcedSyncInput ( snum ) ;
2020-05-18 22:26:07 +00:00
goto HORIZONLY ;
2023-03-18 08:28:02 +00:00
}
2020-05-18 22:26:07 +00:00
2022-09-15 16:41:01 +00:00
p - > playerweaponsway ( pact - > vel . X ) ;
2020-05-18 22:26:07 +00:00
2022-11-20 08:07:23 +00:00
pact - > vel . X = clamp ( ( p - > GetActor ( ) - > spr . pos . XY ( ) - p - > bobpos ) . Length ( ) , 0. , 32. ) ;
2022-09-14 19:46:04 +00:00
if ( p - > on_ground ) p - > bobcounter + = int ( p - > GetActor ( ) - > vel . X * 8 ) ;
2020-05-18 22:26:07 +00:00
2022-12-09 09:48:47 +00:00
p - > backuppos ( ud . clipping = = 0 & & ( ( p - > insector ( ) & & p - > cursector - > floortexture = = mirrortex ) | | ! p - > insector ( ) ) ) ;
2020-05-18 22:26:07 +00:00
// Shrinking code
2020-07-16 13:03:09 +00:00
if ( psectlotag = = ST_2_UNDERWATER )
2020-05-18 22:26:07 +00:00
{
2022-09-14 19:46:04 +00:00
underwater ( snum , actions , floorz , ceilingz ) ;
2020-05-18 22:26:07 +00:00
}
else if ( p - > jetpack_on )
{
2022-09-14 19:46:04 +00:00
operateJetpack ( snum , actions , psectlotag , floorz , ceilingz , shrunk ) ;
2020-05-18 22:26:07 +00:00
}
2020-07-16 13:03:09 +00:00
else if ( psectlotag ! = ST_2_UNDERWATER )
2020-05-18 22:26:07 +00:00
{
2022-09-14 19:46:04 +00:00
movement ( snum , actions , psectp , floorz , ceilingz , shrunk , truefdist , psectlotag ) ;
2020-05-18 22:26:07 +00:00
}
2020-08-05 12:57:47 +00:00
p - > psectlotag = psectlotag ;
2021-01-02 00:04:03 +00:00
if ( movementBlocked ( p ) )
2020-05-18 22:26:07 +00:00
{
doubvel = 0 ;
2022-09-11 22:18:56 +00:00
p - > vel . X = 0 ;
p - > vel . Y = 0 ;
2023-04-18 12:37:28 +00:00
p - > sync . avel = 0 ;
2023-03-23 06:09:02 +00:00
setForcedSyncInput ( snum ) ;
2020-05-18 22:26:07 +00:00
}
2023-04-18 12:37:28 +00:00
else
2020-07-28 12:12:09 +00:00
{
2023-04-18 12:37:28 +00:00
p - > sync . avel = p - > adjustavel ( PlayerInputAngVel ( snum ) ) ;
2020-05-18 22:26:07 +00:00
}
2023-04-18 12:37:28 +00:00
p - > Angles . doYawInput ( & p - > sync ) ;
2022-12-08 20:58:05 +00:00
purplelavacheck ( p ) ;
2022-12-09 07:09:59 +00:00
2021-12-30 15:24:51 +00:00
if ( p - > spritebridge = = 0 & & pact - > insector ( ) )
2020-05-18 22:26:07 +00:00
{
2022-12-08 20:58:05 +00:00
auto sect = pact - > sector ( ) ;
2020-05-18 22:26:07 +00:00
k = 0 ;
2022-09-14 19:46:04 +00:00
if ( p - > on_ground & & truefdist < = gs . playerheight + 16 )
2020-05-18 22:26:07 +00:00
{
2022-12-09 09:48:47 +00:00
int surface = tilesurface ( sect - > floortexture ) ;
2022-12-08 23:44:48 +00:00
int whichsound = surface = = TSURF_ELECTRIC ? 0 : surface = = TSURF_SLIME ? 1 : surface = = TSURF_PLASMA ? 2 : - 1 ;
k = makepainsounds ( snum , whichsound ) ;
2020-05-18 22:26:07 +00:00
}
if ( k )
{
FTA ( 75 , p ) ;
p - > boot_amount - = 2 ;
if ( p - > boot_amount < = 0 )
checkavailinven ( p ) ;
}
}
2022-09-11 22:23:37 +00:00
if ( p - > vel . X | | p - > vel . Y | | sb_fvel | | sb_svel )
2020-05-18 22:26:07 +00:00
{
2020-08-27 05:54:49 +00:00
p - > crack_time = CRACK_TIME ;
2020-05-18 22:26:07 +00:00
2022-09-15 17:23:47 +00:00
k = int ( BobVal ( p - > bobcounter ) * 4 ) ;
2020-05-18 22:26:07 +00:00
2022-09-14 19:46:04 +00:00
if ( truefdist < gs . playerheight + 8 & & ( k = = 1 | | k = = 3 ) )
2020-05-18 22:26:07 +00:00
{
if ( p - > spritebridge = = 0 & & p - > walking_snd_toggle = = 0 & & p - > on_ground )
{
2022-12-09 07:28:55 +00:00
FTextureID j ;
2020-05-18 22:26:07 +00:00
switch ( psectlotag )
{
case 0 :
2020-10-25 06:12:04 +00:00
if ( clz . type = = kHitSprite )
2022-12-09 07:28:55 +00:00
j = clz . actor ( ) - > spr . spritetexture ( ) ;
2020-10-25 06:12:04 +00:00
else
2022-12-09 09:48:47 +00:00
j = psectp - > floortexture ;
2020-05-18 22:26:07 +00:00
2022-12-09 07:28:55 +00:00
if ( tilesurface ( j ) = = TSURF_METALDUCTS )
2020-05-18 22:26:07 +00:00
{
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( DUKE_WALKINDUCTS , pact ) ;
2020-05-18 22:26:07 +00:00
p - > walking_snd_toggle = 1 ;
}
break ;
2022-12-09 07:28:55 +00:00
case ST_1_ABOVE_WATER :
2020-05-18 22:26:07 +00:00
if ( ( krand ( ) & 1 ) = = 0 )
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( DUKE_ONWATER , pact ) ;
2020-05-18 22:26:07 +00:00
p - > walking_snd_toggle = 1 ;
break ;
}
}
}
else if ( p - > walking_snd_toggle > 0 )
p - > walking_snd_toggle - - ;
if ( p - > jetpack_on = = 0 & & p - > steroids_amount > 0 & & p - > steroids_amount < 400 )
doubvel < < = 1 ;
2022-09-19 23:54:01 +00:00
p - > vel . X + = sb_fvel * doubvel * ( 5. / 16. ) ;
p - > vel . Y + = sb_svel * doubvel * ( 5. / 16. ) ;
2023-04-22 09:34:44 +00:00
p - > Angles . StrafeVel + = strafeVel * doubvel * ( 5. / 16. ) ;
2020-05-18 22:26:07 +00:00
bool check ;
2020-08-28 20:51:05 +00:00
if ( ! isWW2GI ( ) ) check = ( ( p - > curr_weapon = = KNEE_WEAPON & & p - > kickback_pic > 10 & & p - > on_ground ) | | ( p - > on_ground & & ( actions & SB_CROUCH ) ) ) ;
2021-12-05 12:43:31 +00:00
else check = ( ( aplWeaponWorksLike ( p - > curr_weapon , snum ) = = KNEE_WEAPON & & p - > kickback_pic > 10 & & p - > on_ground ) | | ( p - > on_ground & & ( actions & SB_CROUCH ) ) ) ;
2020-05-18 22:26:07 +00:00
if ( check )
{
2022-09-11 22:08:42 +00:00
p - > vel . XY ( ) * = gs . playerfriction - 0.125 ;
2023-04-22 09:34:44 +00:00
p - > Angles . StrafeVel * = gs . playerfriction - 0.125 ;
2020-05-18 22:26:07 +00:00
}
else
{
if ( psectlotag = = 2 )
{
2022-09-11 22:08:42 +00:00
p - > vel . XY ( ) * = gs . playerfriction - FixedToFloat ( 0x1400 ) ;
2023-04-22 09:34:44 +00:00
p - > Angles . StrafeVel * = gs . playerfriction - FixedToFloat ( 0x1400 ) ;
2020-05-18 22:26:07 +00:00
}
else
{
2022-09-11 22:08:42 +00:00
p - > vel . XY ( ) * = gs . playerfriction ;
2023-04-22 09:34:44 +00:00
p - > Angles . StrafeVel * = gs . playerfriction ;
2020-05-18 22:26:07 +00:00
}
}
2022-09-11 22:40:33 +00:00
if ( abs ( p - > vel . X ) < 1 / 128. & & abs ( p - > vel . Y ) < 1 / 128. )
2023-04-22 09:34:44 +00:00
{
2022-09-11 22:18:56 +00:00
p - > vel . X = p - > vel . Y = 0 ;
2023-04-22 09:34:44 +00:00
p - > Angles . StrafeVel = 0 ;
}
2020-05-18 22:26:07 +00:00
if ( shrunk )
{
2022-09-11 22:18:56 +00:00
p - > vel . XY ( ) * = gs . playerfriction * 0.75 ;
2023-04-22 09:34:44 +00:00
p - > Angles . StrafeVel * = gs . playerfriction * 0.75 ;
2020-05-18 22:26:07 +00:00
}
}
2023-04-22 09:34:44 +00:00
p - > Angles . doViewTilting ( & p - > sync , p - > vel . XY ( ) , maxVel , ( psectlotag = = 1 ) | | ( psectlotag = = 2 ) ) ;
2020-05-18 22:26:07 +00:00
HORIZONLY :
2023-03-21 10:37:25 +00:00
double iif = ( psectlotag = = 1 | | p - > spritebridge = = 1 ) ? 4 : 20 ;
2020-05-18 22:26:07 +00:00
2021-11-21 07:56:39 +00:00
if ( p - > insector ( ) & & p - > cursector - > lotag = = 2 ) k = 0 ;
2020-05-18 22:26:07 +00:00
else k = 1 ;
2020-10-25 07:50:03 +00:00
Collision clip { } ;
2020-05-18 22:26:07 +00:00
if ( ud . clipping )
{
2022-11-20 08:07:23 +00:00
p - > GetActor ( ) - > spr . pos . XY ( ) + = p - > vel . XY ( ) ;
2022-11-24 02:20:17 +00:00
updatesector ( p - > GetActor ( ) - > getPosWithOffsetZ ( ) , & p - > cursector ) ;
2021-11-26 20:52:01 +00:00
ChangeActorSect ( pact , p - > cursector ) ;
2020-05-18 22:26:07 +00:00
}
else
2022-11-21 04:20:08 +00:00
clipmove ( p - > GetActor ( ) - > spr . pos . XY ( ) , p - > GetActor ( ) - > getOffsetZ ( ) , & p - > cursector , p - > vel , 10.25 , 4. , iif , CLIPMASK0 , clip ) ;
2020-05-18 22:26:07 +00:00
if ( p - > jetpack_on = = 0 & & psectlotag ! = 2 & & psectlotag ! = 1 & & shrunk )
2022-11-20 08:14:51 +00:00
p - > GetActor ( ) - > spr . pos . Z + = 32 ;
2020-05-18 22:26:07 +00:00
2020-10-25 07:50:03 +00:00
if ( clip . type ! = kHitNone )
checkplayerhurt_d ( p , clip ) ;
2020-05-18 22:26:07 +00:00
if ( p - > jetpack_on = = 0 )
{
2022-09-13 17:51:25 +00:00
if ( pact - > vel . X > 1 )
2020-05-18 22:26:07 +00:00
{
if ( psectlotag ! = 1 & & psectlotag ! = 2 & & p - > on_ground )
{
p - > pycount + = 52 ;
p - > pycount & = 2047 ;
2022-09-14 17:30:20 +00:00
const double factor = 1024. / 1596 ; // What is 1596?
p - > pyoff = abs ( pact - > vel . X * BobVal ( p - > pycount ) ) * factor ;
2020-05-18 22:26:07 +00:00
}
}
else if ( psectlotag ! = 2 & & psectlotag ! = 1 )
p - > pyoff = 0 ;
}
// RBG***
2023-03-16 11:15:11 +00:00
SetActor ( pact , pact - > spr . pos ) ;
2020-05-18 22:26:07 +00:00
if ( psectlotag < 3 )
{
2021-12-30 15:51:56 +00:00
psectp = pact - > sector ( ) ;
2021-11-18 16:34:31 +00:00
if ( ud . clipping = = 0 & & psectp - > lotag = = 31 )
2020-05-18 22:26:07 +00:00
{
2021-12-05 23:50:33 +00:00
auto secact = barrier_cast < DDukeActor * > ( psectp - > hitagactor ) ;
2022-12-22 08:49:42 +00:00
if ( secact & & secact - > vel . X ! = 0 & & secact - > counter = = 0 )
2020-05-18 22:26:07 +00:00
{
quickkill ( p ) ;
return ;
}
}
}
2022-09-14 19:46:04 +00:00
if ( truefdist < gs . playerheight & & p - > on_ground & & psectlotag ! = 1 & & shrunk = = 0 & & p - > insector ( ) & & p - > cursector - > lotag = = 1 )
2020-10-25 07:50:03 +00:00
if ( ! S_CheckActorSoundPlaying ( pact , DUKE_ONWATER ) )
S_PlayActorSound ( DUKE_ONWATER , pact ) ;
2020-05-18 22:26:07 +00:00
2021-12-30 15:51:56 +00:00
if ( p - > cursector ! = pact - > sector ( ) )
2021-11-26 20:52:01 +00:00
ChangeActorSect ( pact , p - > cursector ) ;
2020-05-18 22:26:07 +00:00
2023-03-21 10:37:25 +00:00
auto oldpos = p - > GetActor ( ) - > opos ;
2022-01-04 23:39:09 +00:00
int retry = 0 ;
while ( ud . clipping = = 0 )
2020-05-18 22:26:07 +00:00
{
2022-01-04 23:39:09 +00:00
int blocked ;
2022-11-21 04:20:08 +00:00
blocked = ( pushmove ( p - > GetActor ( ) - > spr . pos . XY ( ) , p - > GetActor ( ) - > getOffsetZ ( ) , & p - > cursector , 10.25 , 4 , 4 , CLIPMASK0 ) < 0 & & furthestangle ( p - > GetActor ( ) , 8 ) < DAngle90 ) ;
2022-01-04 23:39:09 +00:00
2022-02-03 23:55:12 +00:00
if ( fabs ( pact - > floorz - pact - > ceilingz ) < 48 | | blocked )
2020-05-18 22:26:07 +00:00
{
2021-12-30 15:51:56 +00:00
if ( ! ( pact - > sector ( ) - > lotag & 0x8000 ) & & ( isanunderoperator ( pact - > sector ( ) - > lotag ) | |
isanearoperator ( pact - > sector ( ) - > lotag ) ) )
fi . activatebysector ( pact - > sector ( ) , pact ) ;
2022-01-04 23:39:09 +00:00
if ( blocked )
2020-05-18 22:26:07 +00:00
{
2022-01-04 23:39:09 +00:00
if ( ! retry + + )
{
2022-11-21 02:39:48 +00:00
p - > GetActor ( ) - > spr . pos = oldpos ;
2022-11-15 08:27:07 +00:00
p - > GetActor ( ) - > backuppos ( ) ;
2022-01-04 23:39:09 +00:00
continue ;
}
2020-05-18 22:26:07 +00:00
quickkill ( p ) ;
return ;
}
}
2022-09-14 19:46:04 +00:00
else if ( abs ( floorz - ceilingz ) < 32 & & isanunderoperator ( psectp - > lotag ) )
2021-11-18 17:51:19 +00:00
fi . activatebysector ( psectp , pact ) ;
2022-01-04 23:39:09 +00:00
break ;
2020-05-18 22:26:07 +00:00
}
// center_view
2023-03-26 01:45:48 +00:00
if ( actions & SB_CENTERVIEW | | ( p - > hard_landing & & ( cl_dukepitchmode & kDukePitchLandingRecenter ) ) )
2020-05-18 22:26:07 +00:00
{
playerCenterView ( snum ) ;
}
2023-03-29 11:20:07 +00:00
else if ( ( actions & SB_LOOK_UP ) = = SB_LOOK_UP )
2020-05-18 22:26:07 +00:00
{
2020-08-28 22:57:07 +00:00
playerLookUp ( snum , actions ) ;
2020-05-18 22:26:07 +00:00
}
2023-03-29 11:20:07 +00:00
else if ( ( actions & SB_LOOK_DOWN ) = = SB_LOOK_DOWN )
2020-05-18 22:26:07 +00:00
{
2020-08-28 22:57:07 +00:00
playerLookDown ( snum , actions ) ;
2020-05-18 22:26:07 +00:00
}
2023-03-29 11:20:07 +00:00
else if ( ( actions & SB_LOOK_UP ) = = SB_AIM_UP )
2020-05-18 22:26:07 +00:00
{
2020-08-28 22:57:07 +00:00
playerAimUp ( snum , actions ) ;
2020-05-18 22:26:07 +00:00
}
2023-03-29 11:20:07 +00:00
else if ( ( actions & SB_LOOK_DOWN ) = = SB_AIM_DOWN )
2020-05-18 22:26:07 +00:00
{ // aim_down
2020-08-28 22:57:07 +00:00
playerAimDown ( snum , actions ) ;
2020-05-18 22:26:07 +00:00
}
2020-07-17 01:00:43 +00:00
2023-04-18 12:37:28 +00:00
p - > Angles . doPitchInput ( & p - > sync ) ;
2023-03-26 05:40:25 +00:00
2023-04-02 09:17:43 +00:00
p - > checkhardlanding ( ) ;
2020-05-18 22:26:07 +00:00
//Shooting code/changes
if ( p - > show_empty_weapon > 0 )
{
p - > show_empty_weapon - - ;
2022-11-12 08:33:33 +00:00
if ( p - > show_empty_weapon = = 0 & & ( WeaponSwitch ( p - ps ) & 2 ) )
2020-05-18 22:26:07 +00:00
{
if ( p - > last_full_weapon = = GROW_WEAPON )
p - > subweapon | = ( 1 < < GROW_WEAPON ) ;
else if ( p - > last_full_weapon = = SHRINKER_WEAPON )
p - > subweapon & = ~ ( 1 < < GROW_WEAPON ) ;
2022-11-12 08:33:33 +00:00
fi . addweapon ( p , p - > last_full_weapon , true ) ;
2020-05-18 22:26:07 +00:00
return ;
}
}
2022-11-30 13:29:34 +00:00
dokneeattack ( snum ) ;
2020-05-18 22:26:07 +00:00
if ( fi . doincrements ( p ) ) return ;
if ( p - > weapon_pos ! = 0 )
{
if ( p - > weapon_pos = = - 9 )
{
if ( p - > last_weapon > = 0 )
{
2020-09-16 11:01:09 +00:00
p - > oweapon_pos = p - > weapon_pos = 10 ;
2021-11-09 23:05:42 +00:00
// if(p->curr_weapon == KNEE_WEAPON) p->kickback_pic = 1;
2020-05-18 22:26:07 +00:00
p - > last_weapon = - 1 ;
}
else if ( p - > holster_weapon = = 0 )
2020-09-16 11:01:09 +00:00
p - > oweapon_pos = p - > weapon_pos = 10 ;
2020-05-18 22:26:07 +00:00
}
else p - > weapon_pos - - ;
}
// HACKS
2021-11-21 07:48:36 +00:00
processweapon ( snum , actions ) ;
2020-05-19 07:54:52 +00:00
}
2020-05-18 22:26:07 +00:00
2020-05-14 10:14:03 +00:00
END_DUKE_NS
2022-11-24 06:42:17 +00:00