2020-05-14 10:14:03 +00:00
//-------------------------------------------------------------------------
/*
Copyright ( C ) 1996 , 2003 - 3 D Realms Entertainment
Copyright ( C ) 2017 - 2019 Nuke . YKT
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 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
*/
//-------------------------------------------------------------------------
# include "ns.h"
# include "global.h"
2020-07-03 21:56:14 +00:00
# include "names_r.h"
2020-07-07 15:56:20 +00:00
# include "mapinfo.h"
2020-10-21 17:14:41 +00:00
# include "dukeactor.h"
2020-05-14 10:14:03 +00:00
BEGIN_DUKE_NS
2020-07-16 15:59:25 +00:00
2020-05-16 21:55:21 +00:00
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2022-02-07 10:04:19 +00:00
void incur_damage_r ( player_struct * p )
2020-05-16 21:55:21 +00:00
{
2021-11-14 14:03:50 +00:00
int damage = 0 , shield_damage = 0 ;
2021-11-07 13:36:39 +00:00
int gut = 0 ;
2020-05-16 21:55:21 +00:00
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 - > steroids_amount > 0 & & p - > steroids_amount < 400 )
{
shield_damage = damage * ( 20 + ( krand ( ) % 30 ) ) / 100 ;
damage - = shield_damage ;
}
if ( p - > drink_amt > 31 & & p - > drink_amt < 65 )
gut + + ;
if ( p - > eat > 31 & & p - > eat < 65 )
gut + + ;
switch ( gut )
{
case 1 :
2021-05-12 15:33:33 +00:00
damage = damage * 3 / 4 ;
2020-05-16 21:55:21 +00:00
break ;
case 2 :
2021-05-12 15:33:33 +00:00
damage / = 4 ;
2020-05-16 21:55:21 +00:00
break ;
}
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-10-24 04:58:52 +00:00
static void shootmelee ( DDukeActor * actor , int p , int sx , int sy , int sz , int sa , int atwith )
2020-05-16 21:55:21 +00:00
{
2021-12-30 15:51:56 +00:00
auto sectp = actor - > sector ( ) ;
2020-10-20 23:03:38 +00:00
int zvel ;
2021-12-06 11:24:22 +00:00
HitInfo hit { } ;
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
if ( p > = 0 )
2020-05-16 21:55:21 +00:00
{
2020-10-20 23:03:38 +00:00
zvel = - ps [ p ] . horizon . sum ( ) . asq16 ( ) > > 11 ;
sz + = ( 6 < < 8 ) ;
sa + = 15 ;
2020-05-16 21:55:21 +00:00
}
else
{
2020-10-20 23:03:38 +00:00
int x ;
2020-11-02 22:10:19 +00:00
auto pspr = ps [ findplayer ( actor , & x ) ] . GetActor ( ) ;
2022-01-31 18:21:49 +00:00
zvel = ( ( pspr - > int_pos ( ) . Z - sz ) < < 8 ) / ( x + 1 ) ;
sa = getangle ( pspr - > int_pos ( ) . X - sx , pspr - > int_pos ( ) . Y - sy ) ;
2020-05-16 21:55:21 +00:00
}
2022-08-20 13:47:52 +00:00
hitscan ( vec3_t ( sx , sy , sz ) , sectp , { bcos ( sa ) , bsin ( sa ) , zvel < < 6 } , hit , CLIPMASK1 ) ;
2020-09-17 21:02:52 +00:00
2021-11-25 23:08:59 +00:00
if ( isRRRA ( ) & & hit . hitSector ! = nullptr & & ( ( hit . hitSector - > lotag = = 160 & & zvel > 0 ) | | ( hit . hitSector - > lotag = = 161 & & zvel < 0 ) )
& & hit . actor ( ) = = nullptr & & hit . hitWall = = nullptr )
2020-05-16 21:55:21 +00:00
{
2021-11-17 23:01:29 +00:00
DukeStatIterator its ( STAT_EFFECTOR ) ;
2020-10-24 04:58:52 +00:00
while ( auto effector = its . Next ( ) )
2020-10-20 23:03:38 +00:00
{
2021-12-30 15:51:56 +00:00
if ( effector - > sector ( ) = = hit . hitSector & & effector - > spr . picnum = = SECTOREFFECTOR & & effector - > GetOwner ( )
2021-12-21 17:19:45 +00:00
& & effector - > spr . lotag = = SE_7_TELEPORT )
2020-10-20 23:03:38 +00:00
{
int nx , ny , nz ;
2022-08-16 22:59:32 +00:00
nx = hit . int_hitpos ( ) . X + ( effector - > GetOwner ( ) - > int_pos ( ) . X - effector - > int_pos ( ) . X ) ;
ny = hit . int_hitpos ( ) . Y + ( effector - > GetOwner ( ) - > int_pos ( ) . Y - effector - > int_pos ( ) . Y ) ;
2021-11-25 23:08:59 +00:00
if ( hit . hitSector - > lotag = = 161 )
2020-10-20 23:03:38 +00:00
{
2022-02-02 23:46:04 +00:00
nz = effector - > GetOwner ( ) - > sector ( ) - > int_floorz ( ) ;
2020-10-20 23:03:38 +00:00
}
else
{
2022-02-02 23:46:04 +00:00
nz = effector - > GetOwner ( ) - > sector ( ) - > int_ceilingz ( ) ;
2020-10-20 23:03:38 +00:00
}
2022-08-20 13:47:52 +00:00
hitscan ( vec3_t ( nx , ny , nz ) , effector - > GetOwner ( ) - > sector ( ) , { bcos ( sa ) , bsin ( sa ) , zvel < < 6 } , hit , CLIPMASK1 ) ;
2020-10-20 23:03:38 +00:00
break ;
}
}
}
2020-05-16 21:55:21 +00:00
2021-11-25 23:08:59 +00:00
if ( hit . hitSector = = nullptr ) return ;
2020-05-16 21:55:21 +00:00
2022-08-16 22:59:32 +00:00
if ( ( abs ( sx - hit . int_hitpos ( ) . X ) + abs ( sy - hit . int_hitpos ( ) . Y ) ) < 1024 )
2020-10-20 23:03:38 +00:00
{
2021-11-25 23:08:59 +00:00
if ( hit . hitWall ! = nullptr | | hit . actor ( ) )
2020-05-16 21:55:21 +00:00
{
2020-10-24 04:58:52 +00:00
DDukeActor * wpn ;
2020-10-20 23:03:38 +00:00
if ( isRRRA ( ) & & atwith = = SLINGBLADE )
2020-05-16 21:55:21 +00:00
{
2022-08-23 20:32:45 +00:00
wpn = CreateActor ( hit . hitSector , hit . hitpos , SLINGBLADE , - 15 , 0 , 0 , sa , 32 , 0 , actor , 4 ) ;
2021-11-19 08:47:17 +00:00
if ( ! wpn ) return ;
2021-12-21 17:19:45 +00:00
wpn - > spr . extra + = 50 ;
2020-05-16 21:55:21 +00:00
}
else
{
2022-08-23 20:32:45 +00:00
wpn = CreateActor ( hit . hitSector , hit . hitpos , KNEE , - 15 , 0 , 0 , sa , 32 , 0 , actor , 4 ) ;
2021-11-19 08:47:17 +00:00
if ( ! wpn ) return ;
2021-12-21 17:19:45 +00:00
wpn - > spr . extra + = ( krand ( ) & 7 ) ;
2020-05-16 21:55:21 +00:00
}
2020-10-20 23:03:38 +00:00
if ( p > = 0 )
2020-05-16 21:55:21 +00:00
{
2020-10-24 04:58:52 +00:00
auto k = spawn ( wpn , SMALLSMOKE ) ;
2022-02-07 07:47:18 +00:00
if ( k ) k - > spr . pos . Z - = 8 ;
2020-10-24 04:58:52 +00:00
if ( atwith = = KNEE ) S_PlayActorSound ( KICK_HIT , wpn ) ;
else if ( isRRRA ( ) & & atwith = = SLINGBLADE ) S_PlayActorSound ( 260 , wpn ) ;
2020-05-16 21:55:21 +00:00
}
2020-10-20 23:03:38 +00:00
if ( p > = 0 & & ps [ p ] . steroids_amount > 0 & & ps [ p ] . steroids_amount < 400 )
2021-12-21 17:19:45 +00:00
wpn - > spr . extra + = ( gs . max_player_health > > 2 ) ;
2020-05-16 21:55:21 +00:00
2021-12-21 17:19:45 +00:00
if ( hit . actor ( ) & & hit . actor ( ) - > spr . picnum ! = ACCESSSWITCH & & hit . actor ( ) - > spr . picnum ! = ACCESSSWITCH2 )
2020-05-16 21:55:21 +00:00
{
2021-11-25 23:08:59 +00:00
fi . checkhitsprite ( hit . actor ( ) , wpn ) ;
if ( p > = 0 ) fi . checkhitswitch ( p , nullptr , hit . actor ( ) ) ;
2020-05-16 21:55:21 +00:00
}
2021-11-25 23:08:59 +00:00
else if ( hit . hitWall )
2020-05-16 21:55:21 +00:00
{
2021-12-18 14:11:21 +00:00
if ( hit . hitWall - > cstat & CSTAT_WALL_BOTTOM_SWAP )
2021-11-25 23:08:59 +00:00
if ( hit . hitWall - > twoSided ( ) )
2022-08-28 09:34:54 +00:00
if ( hit . hitpos . Z > = hit . hitWall - > nextSector ( ) - > floorz )
2021-11-25 23:08:59 +00:00
hit . hitWall = hit . hitWall - > nextWall ( ) ;
2020-05-16 21:55:21 +00:00
2021-11-25 23:08:59 +00:00
if ( hit . hitWall - > picnum ! = ACCESSSWITCH & & hit . hitWall - > picnum ! = ACCESSSWITCH2 )
2020-10-20 23:03:38 +00:00
{
2022-08-23 20:39:07 +00:00
fi . checkhitwall ( wpn , hit . hitWall , hit . hitpos , atwith ) ;
2021-11-25 23:08:59 +00:00
if ( p > = 0 ) fi . checkhitswitch ( p , hit . hitWall , nullptr ) ;
2020-10-20 23:03:38 +00:00
}
2020-05-16 21:55:21 +00:00
}
}
2021-11-25 23:08:59 +00:00
else if ( p > = 0 & & zvel > 0 & & hit . hitSector - > lotag = = 1 )
2020-10-20 23:03:38 +00:00
{
2020-10-24 04:58:52 +00:00
auto splash = spawn ( ps [ p ] . GetActor ( ) , WATERSPLASH2 ) ;
2021-11-19 11:32:12 +00:00
if ( splash )
{
2022-08-16 22:59:32 +00:00
splash - > set_int_xy ( hit . int_hitpos ( ) . X , hit . int_hitpos ( ) . Y ) ;
2022-08-27 13:09:22 +00:00
splash - > set_int_ang ( ps [ p ] . angle . ang . Buildang ( ) ) ; // Total tweek
2021-12-21 17:19:45 +00:00
splash - > spr . xvel = 32 ;
2021-11-19 11:32:12 +00:00
ssp ( actor , 0 ) ;
2021-12-21 17:19:45 +00:00
splash - > spr . xvel = 0 ;
2021-11-19 11:32:12 +00:00
}
2020-10-20 23:03:38 +00:00
}
}
}
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2020-05-16 21:55:21 +00:00
2020-10-24 05:01:01 +00:00
static void shootweapon ( DDukeActor * actor , int p , int sx , int sy , int sz , int sa , int atwith )
2020-10-20 23:03:38 +00:00
{
2021-12-30 15:51:56 +00:00
auto sectp = actor - > sector ( ) ;
2021-11-14 12:33:35 +00:00
int zvel = 0 ;
2021-12-06 11:24:22 +00:00
HitInfo hit { } ;
2020-05-16 21:55:21 +00:00
2021-12-21 19:56:37 +00:00
if ( actor - > spr . extra > = 0 ) actor - > spr . shade = - 96 ;
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
if ( p > = 0 )
{
2020-11-01 19:57:02 +00:00
auto aimed = aim ( actor , AUTO_AIM_ANGLE ) ;
if ( aimed )
2020-05-16 21:55:21 +00:00
{
2021-12-21 17:19:45 +00:00
int dal = ( ( aimed - > spr . xrepeat * tileHeight ( aimed - > spr . picnum ) ) < < 1 ) + ( 5 < < 8 ) ;
2022-01-31 18:21:49 +00:00
zvel = ( ( aimed - > int_pos ( ) . Z - sz - dal ) < < 8 ) / ldist ( ps [ p ] . GetActor ( ) , aimed ) ;
sa = getangle ( aimed - > int_pos ( ) . X - sx , aimed - > int_pos ( ) . Y - sy ) ;
2020-10-20 23:03:38 +00:00
}
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
if ( atwith = = SHOTSPARK1 )
{
2020-11-01 19:57:02 +00:00
if ( aimed = = nullptr )
2020-05-16 21:55:21 +00:00
{
2020-10-20 23:03:38 +00:00
sa + = 16 - ( krand ( ) & 31 ) ;
zvel = - ps [ p ] . horizon . sum ( ) . asq16 ( ) > > 11 ;
2020-05-16 21:55:21 +00:00
zvel + = 128 - ( krand ( ) & 255 ) ;
}
}
else
{
2020-10-20 23:03:38 +00:00
if ( atwith = = SHOTGUN )
sa + = 64 - ( krand ( ) & 127 ) ;
2020-05-16 21:55:21 +00:00
else
2020-10-20 23:03:38 +00:00
sa + = 16 - ( krand ( ) & 31 ) ;
2020-11-01 19:57:02 +00:00
if ( aimed = = nullptr ) zvel = - ps [ p ] . horizon . sum ( ) . asq16 ( ) > > 11 ;
2020-10-20 23:03:38 +00:00
zvel + = 128 - ( krand ( ) & 255 ) ;
}
sz - = ( 2 < < 8 ) ;
}
else
{
int x ;
2020-11-01 19:57:02 +00:00
int j = findplayer ( actor , & x ) ;
2020-10-20 23:03:38 +00:00
sz - = ( 4 < < 8 ) ;
2022-02-04 17:11:44 +00:00
zvel = ( ( ps [ j ] . player_int_pos ( ) . Z - sz ) < < 8 ) / ( ldist ( ps [ j ] . GetActor ( ) , actor ) ) ;
2021-12-21 19:56:37 +00:00
if ( actor - > spr . picnum ! = BOSS1 )
2020-10-20 23:03:38 +00:00
{
zvel + = 128 - ( krand ( ) & 255 ) ;
sa + = 32 - ( krand ( ) & 63 ) ;
}
else
{
zvel + = 128 - ( krand ( ) & 255 ) ;
2022-02-04 17:11:44 +00:00
sa = getangle ( ps [ j ] . player_int_pos ( ) . X - sx , ps [ j ] . player_int_pos ( ) . Y - sy ) + 64 - ( krand ( ) & 127 ) ;
2020-05-16 21:55:21 +00:00
}
2020-10-20 23:03:38 +00:00
}
2020-05-16 21:55:21 +00:00
2021-12-21 19:56:37 +00:00
actor - > spr . cstat & = ~ CSTAT_SPRITE_BLOCK_ALL ;
2022-08-20 13:47:52 +00:00
hitscan ( vec3_t ( sx , sy , sz ) , sectp , { bcos ( sa ) , bsin ( sa ) , zvel < < 6 } , hit , CLIPMASK1 ) ;
2020-05-16 21:55:21 +00:00
2021-11-25 23:08:59 +00:00
if ( isRRRA ( ) & & hit . hitSector ! = nullptr & & ( ( ( hit . hitSector - > lotag = = 160 & & zvel > 0 ) | | ( hit . hitSector - > lotag = = 161 & & zvel < 0 ) )
& & hit . actor ( ) = = nullptr & & hit . hitWall = = nullptr ) )
2020-10-20 23:03:38 +00:00
{
2021-11-17 23:01:29 +00:00
DukeStatIterator its ( STAT_EFFECTOR ) ;
2020-10-24 05:01:01 +00:00
while ( auto effector = its . Next ( ) )
2020-05-16 21:55:21 +00:00
{
2021-12-30 15:51:56 +00:00
if ( effector - > sector ( ) = = hit . hitSector & & effector - > spr . picnum = = SECTOREFFECTOR & & effector - > GetOwner ( )
2021-12-21 17:19:45 +00:00
& & effector - > spr . lotag = = SE_7_TELEPORT )
2020-05-16 21:55:21 +00:00
{
2020-10-20 23:03:38 +00:00
int nx , ny , nz ;
2022-08-16 22:59:32 +00:00
nx = hit . int_hitpos ( ) . X + ( effector - > GetOwner ( ) - > int_pos ( ) . X - effector - > int_pos ( ) . X ) ;
ny = hit . int_hitpos ( ) . Y + ( effector - > GetOwner ( ) - > int_pos ( ) . Y - effector - > int_pos ( ) . Y ) ;
2021-11-25 23:08:59 +00:00
if ( hit . hitSector - > lotag = = 161 )
2020-10-20 23:03:38 +00:00
{
2022-02-02 23:46:04 +00:00
nz = effector - > GetOwner ( ) - > sector ( ) - > int_floorz ( ) ;
2020-10-20 23:03:38 +00:00
}
else
2020-05-16 21:55:21 +00:00
{
2022-02-02 23:46:04 +00:00
nz = effector - > GetOwner ( ) - > sector ( ) - > int_ceilingz ( ) ;
2020-05-16 21:55:21 +00:00
}
2022-08-20 13:47:52 +00:00
hitscan ( vec3_t ( nx , ny , nz ) , effector - > GetOwner ( ) - > sector ( ) , { bcos ( sa ) , bsin ( sa ) , zvel < < 6 } , hit , CLIPMASK1 ) ;
2020-10-20 23:03:38 +00:00
break ;
2020-05-16 21:55:21 +00:00
}
}
2020-10-20 23:03:38 +00:00
}
2020-05-16 21:55:21 +00:00
2021-12-21 19:56:37 +00:00
actor - > spr . cstat | = CSTAT_SPRITE_BLOCK_ALL ;
2020-05-16 21:55:21 +00:00
2021-11-25 23:08:59 +00:00
if ( hit . hitSector = = nullptr ) return ;
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
if ( atwith = = SHOTGUN )
2021-11-25 23:08:59 +00:00
if ( hit . hitSector - > lotag = = 1 )
2020-10-20 23:03:38 +00:00
if ( krand ( ) & 1 )
return ;
2020-05-16 21:55:21 +00:00
2021-11-25 23:08:59 +00:00
if ( ( krand ( ) & 15 ) = = 0 & & hit . hitSector - > lotag = = 2 )
2022-08-16 22:59:32 +00:00
tracers ( hit . int_hitpos ( ) . X , hit . int_hitpos ( ) . Y , hit . int_hitpos ( ) . Z , sx , sy , sz , 8 - ( ud . multimode > > 1 ) ) ;
2020-05-16 21:55:21 +00:00
2020-10-24 05:01:01 +00:00
DDukeActor * spark ;
2020-10-20 23:03:38 +00:00
if ( p > = 0 )
{
2022-08-17 16:55:19 +00:00
spark = CreateActor ( hit . hitSector , hit . hitpos , SHOTSPARK1 , - 15 , 10 , 10 , sa , 0 , 0 , actor , 4 ) ;
2021-11-19 08:47:17 +00:00
if ( ! spark ) return ;
2021-12-21 17:19:45 +00:00
spark - > spr . extra = ScriptCode [ gs . actorinfo [ atwith ] . scriptaddress ] ;
spark - > spr . extra + = ( krand ( ) % 6 ) ;
2020-05-16 21:55:21 +00:00
2021-11-25 23:08:59 +00:00
if ( hit . hitWall = = nullptr & & hit . actor ( ) = = nullptr )
2020-10-20 23:03:38 +00:00
{
if ( zvel < 0 )
2020-05-16 21:55:21 +00:00
{
2021-12-18 12:14:56 +00:00
if ( hit . hitSector - > ceilingstat & CSTAT_SECTOR_SKY )
2020-05-16 21:55:21 +00:00
{
2021-12-21 17:19:45 +00:00
spark - > spr . xrepeat = 0 ;
spark - > spr . yrepeat = 0 ;
2020-10-20 23:03:38 +00:00
return ;
2020-05-16 21:55:21 +00:00
}
2020-10-20 23:03:38 +00:00
else
2021-11-25 23:08:59 +00:00
fi . checkhitceiling ( hit . hitSector ) ;
2020-05-16 21:55:21 +00:00
}
2021-11-25 23:08:59 +00:00
if ( hit . hitSector - > lotag ! = 1 )
2020-10-24 05:01:01 +00:00
spawn ( spark , SMALLSMOKE ) ;
2020-10-20 23:03:38 +00:00
}
2020-05-16 21:55:21 +00:00
2021-11-25 23:08:59 +00:00
if ( hit . actor ( ) )
2020-10-20 23:03:38 +00:00
{
2021-12-21 17:19:45 +00:00
if ( hit . actor ( ) - > spr . picnum = = 1930 )
2020-10-20 23:03:38 +00:00
return ;
2021-11-25 23:08:59 +00:00
fi . checkhitsprite ( hit . actor ( ) , spark ) ;
2021-12-31 17:47:00 +00:00
if ( hit . actor ( ) - > isPlayer ( ) & & ( ud . coop ! = 1 | | ud . ffire = = 1 ) )
2020-05-16 21:55:21 +00:00
{
2020-10-24 05:01:01 +00:00
auto l = spawn ( spark , JIBS6 ) ;
2021-12-21 17:19:45 +00:00
spark - > spr . xrepeat = spark - > spr . yrepeat = 0 ;
2021-11-19 11:32:12 +00:00
if ( l )
{
2022-02-07 07:47:18 +00:00
l - > spr . pos . Z + = 4 ;
2021-12-21 17:19:45 +00:00
l - > spr . xvel = 16 ;
l - > spr . xrepeat = l - > spr . yrepeat = 24 ;
2022-08-16 21:26:39 +00:00
l - > add_int_ang ( 64 - ( krand ( ) & 127 ) ) ;
2021-11-19 11:32:12 +00:00
}
2020-05-16 21:55:21 +00:00
}
2020-10-24 05:01:01 +00:00
else spawn ( spark , SMALLSMOKE ) ;
2020-10-20 23:03:38 +00:00
if ( p > = 0 & & (
2021-12-21 17:19:45 +00:00
hit . actor ( ) - > spr . picnum = = DIPSWITCH | |
hit . actor ( ) - > spr . picnum = = DIPSWITCH + 1 | |
hit . actor ( ) - > spr . picnum = = DIPSWITCH2 | |
hit . actor ( ) - > spr . picnum = = DIPSWITCH2 + 1 | |
hit . actor ( ) - > spr . picnum = = DIPSWITCH3 | |
hit . actor ( ) - > spr . picnum = = DIPSWITCH3 + 1 | |
( isRRRA ( ) & & hit . actor ( ) - > spr . picnum = = RRTILE8660 ) | |
hit . actor ( ) - > spr . picnum = = HANDSWITCH | |
hit . actor ( ) - > spr . picnum = = HANDSWITCH + 1 ) )
2020-05-16 21:55:21 +00:00
{
2021-11-25 23:08:59 +00:00
fi . checkhitswitch ( p , nullptr , hit . actor ( ) ) ;
2020-10-20 23:03:38 +00:00
return ;
}
}
2021-11-25 23:08:59 +00:00
else if ( hit . hitWall ! = nullptr )
2020-10-20 23:03:38 +00:00
{
2020-10-24 05:01:01 +00:00
spawn ( spark , SMALLSMOKE ) ;
2020-05-16 21:55:21 +00:00
2021-11-25 23:08:59 +00:00
if ( fi . isadoorwall ( hit . hitWall - > picnum ) = = 1 )
2020-10-20 23:03:38 +00:00
goto SKIPBULLETHOLE ;
2021-11-25 23:08:59 +00:00
if ( isablockdoor ( hit . hitWall - > picnum ) = = 1 )
2020-10-20 23:03:38 +00:00
goto SKIPBULLETHOLE ;
if ( p > = 0 & & (
2021-11-25 23:08:59 +00:00
hit . hitWall - > picnum = = DIPSWITCH | |
hit . hitWall - > picnum = = DIPSWITCH + 1 | |
hit . hitWall - > picnum = = DIPSWITCH2 | |
hit . hitWall - > picnum = = DIPSWITCH2 + 1 | |
hit . hitWall - > picnum = = DIPSWITCH3 | |
hit . hitWall - > picnum = = DIPSWITCH3 + 1 | |
( isRRRA ( ) & & hit . hitWall - > picnum = = RRTILE8660 ) | |
hit . hitWall - > picnum = = HANDSWITCH | |
hit . hitWall - > picnum = = HANDSWITCH + 1 ) )
2020-10-20 23:03:38 +00:00
{
2021-11-25 23:08:59 +00:00
fi . checkhitswitch ( p , hit . hitWall , nullptr ) ;
2020-10-20 23:03:38 +00:00
return ;
}
2020-05-16 21:55:21 +00:00
2021-11-25 23:08:59 +00:00
if ( hit . hitWall - > hitag ! = 0 | | ( hit . hitWall - > twoSided ( ) & & hit . hitWall - > nextWall ( ) - > hitag ! = 0 ) )
2020-10-20 23:03:38 +00:00
goto SKIPBULLETHOLE ;
2020-05-16 21:55:21 +00:00
2021-11-25 23:08:59 +00:00
if ( hit . hitSector ! = nullptr & & hit . hitSector - > lotag = = 0 )
if ( hit . hitWall - > overpicnum ! = BIGFORCE )
if ( ( hit . hitWall - > twoSided ( ) & & hit . hitWall - > nextSector ( ) - > lotag = = 0 ) | |
( ! hit . hitWall - > twoSided ( ) & & hit . hitSector - > lotag = = 0 ) )
2021-12-18 14:11:21 +00:00
if ( ( hit . hitWall - > cstat & CSTAT_WALL_MASKED ) = = 0 )
2020-10-20 23:03:38 +00:00
{
2021-11-25 23:08:59 +00:00
if ( hit . hitWall - > twoSided ( ) )
2020-05-16 21:55:21 +00:00
{
2021-11-25 23:08:59 +00:00
DukeSectIterator it ( hit . hitWall - > nextSector ( ) ) ;
2020-10-24 05:01:01 +00:00
while ( auto l = it . Next ( ) )
2020-05-16 21:55:21 +00:00
{
2022-01-13 19:53:36 +00:00
if ( l - > spr . statnum = = STAT_EFFECTOR & & l - > spr . lotag = = SE_13_EXPLOSIVE )
2020-10-20 23:03:38 +00:00
goto SKIPBULLETHOLE ;
2020-05-16 21:55:21 +00:00
}
}
2020-10-24 05:01:01 +00:00
DukeStatIterator it ( STAT_MISC ) ;
while ( auto l = it . Next ( ) )
2020-10-20 23:03:38 +00:00
{
2021-12-21 17:19:45 +00:00
if ( l - > spr . picnum = = BULLETHOLE )
2020-10-24 05:01:01 +00:00
if ( dist ( l , spark ) < ( 12 + ( krand ( ) & 7 ) ) )
2020-10-20 23:03:38 +00:00
goto SKIPBULLETHOLE ;
}
2022-01-13 19:53:36 +00:00
auto hole = spawn ( spark , BULLETHOLE ) ;
if ( hole )
2021-11-19 11:32:12 +00:00
{
2022-01-13 19:53:36 +00:00
hole - > spr . xvel = - 1 ;
2021-11-25 23:08:59 +00:00
auto delta = hit . hitWall - > delta ( ) ;
2022-08-16 21:20:35 +00:00
hole - > set_int_ang ( getangle ( - delta . X , - delta . Y ) + 512 ) ;
2022-01-13 19:53:36 +00:00
ssp ( hole , CLIPMASK0 ) ;
hole - > spr . cstat2 | = CSTAT2_SPRITE_DECAL ;
2021-11-19 11:32:12 +00:00
}
2020-10-20 23:03:38 +00:00
}
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
SKIPBULLETHOLE :
2020-05-16 21:55:21 +00:00
2021-12-18 14:11:21 +00:00
if ( hit . hitWall - > cstat & CSTAT_WALL_BOTTOM_SWAP )
2021-11-25 23:08:59 +00:00
if ( hit . hitWall - > twoSided ( ) )
2022-08-28 09:34:54 +00:00
if ( hit . hitpos . Z > = hit . hitWall - > nextSector ( ) - > floorz )
2021-11-25 23:08:59 +00:00
hit . hitWall = hit . hitWall - > nextWall ( ) ;
2020-05-16 21:55:21 +00:00
2022-08-23 20:39:07 +00:00
fi . checkhitwall ( spark , hit . hitWall , hit . hitpos , SHOTSPARK1 ) ;
2020-05-16 21:55:21 +00:00
}
2020-10-20 23:03:38 +00:00
}
else
{
2022-08-17 16:55:19 +00:00
spark = CreateActor ( hit . hitSector , hit . hitpos , SHOTSPARK1 , - 15 , 24 , 24 , sa , 0 , 0 , actor , 4 ) ;
2021-11-19 08:47:17 +00:00
if ( ! spark ) return ;
2021-12-21 17:19:45 +00:00
spark - > spr . extra = ScriptCode [ gs . actorinfo [ atwith ] . scriptaddress ] ;
2020-05-16 21:55:21 +00:00
2021-11-25 23:08:59 +00:00
if ( hit . actor ( ) )
2020-05-16 21:55:21 +00:00
{
2021-11-25 23:08:59 +00:00
fi . checkhitsprite ( hit . actor ( ) , spark ) ;
2021-12-31 17:47:00 +00:00
if ( ! hit . actor ( ) - > isPlayer ( ) )
2020-10-24 05:01:01 +00:00
spawn ( spark , SMALLSMOKE ) ;
2021-12-21 17:19:45 +00:00
else spark - > spr . xrepeat = spark - > spr . yrepeat = 0 ;
2020-05-16 21:55:21 +00:00
}
2021-11-25 23:08:59 +00:00
else if ( hit . hitWall ! = nullptr )
2022-08-23 20:39:07 +00:00
fi . checkhitwall ( spark , hit . hitWall , hit . hitpos , SHOTSPARK1 ) ;
2020-10-20 23:03:38 +00:00
}
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
if ( ( krand ( ) & 255 ) < 10 )
{
2022-08-16 22:59:32 +00:00
S_PlaySound3D ( PISTOL_RICOCHET , spark , hit . int_hitpos ( ) ) ;
2020-10-20 23:03:38 +00:00
}
}
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2020-05-16 21:55:21 +00:00
2020-10-25 05:09:33 +00:00
static void shootstuff ( DDukeActor * actor , int p , int sx , int sy , int sz , int sa , int atwith )
2020-10-20 23:03:38 +00:00
{
2021-12-30 15:51:56 +00:00
auto sect = actor - > sector ( ) ;
2021-11-14 14:03:50 +00:00
int vel = 0 , zvel ;
2021-11-07 13:55:28 +00:00
int scount ;
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
if ( isRRRA ( ) )
{
2021-12-21 19:56:37 +00:00
if ( atwith ! = SPIT & & actor - > spr . extra > = 0 ) actor - > spr . shade = - 96 ;
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
scount = 1 ;
if ( atwith = = SPIT )
{
2021-12-21 19:56:37 +00:00
if ( actor - > spr . picnum = = 8705 )
2020-10-20 23:03:38 +00:00
vel = 600 ;
else
vel = 400 ;
}
}
else
{
2021-12-21 19:56:37 +00:00
if ( actor - > spr . extra > = 0 ) actor - > spr . shade = - 96 ;
2020-05-16 21:55:21 +00:00
scount = 1 ;
2020-10-20 23:03:38 +00:00
if ( atwith = = SPIT ) vel = 400 ;
}
if ( atwith ! = SPIT )
{
vel = 840 ;
sz - = ( 4 < < 7 ) ;
2021-12-21 19:56:37 +00:00
if ( actor - > spr . picnum = = 4649 )
2020-05-16 21:55:21 +00:00
{
2022-08-16 21:15:49 +00:00
sx + = bcos ( actor - > int_ang ( ) + 256 , - 6 ) ;
sy + = bsin ( actor - > int_ang ( ) + 256 , - 6 ) ;
2020-10-20 23:03:38 +00:00
sz + = ( 12 < < 8 ) ;
2020-05-16 21:55:21 +00:00
}
2021-12-21 19:56:37 +00:00
if ( actor - > spr . picnum = = VIXEN )
2020-05-16 21:55:21 +00:00
{
2020-10-20 23:03:38 +00:00
sz - = ( 12 < < 8 ) ;
2020-05-16 21:55:21 +00:00
}
2020-10-20 23:03:38 +00:00
}
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
if ( p > = 0 )
{
2020-11-01 19:57:02 +00:00
auto aimed = aim ( actor , AUTO_AIM_ANGLE ) ;
2020-05-16 21:55:21 +00:00
2022-08-16 21:15:49 +00:00
sx + = bcos ( actor - > int_ang ( ) + 160 , - 7 ) ;
sy + = bsin ( actor - > int_ang ( ) + 160 , - 7 ) ;
2020-11-15 11:07:30 +00:00
2020-11-01 19:57:02 +00:00
if ( aimed )
2020-10-20 23:03:38 +00:00
{
2021-12-21 17:19:45 +00:00
int dal = ( ( aimed - > spr . xrepeat * tileHeight ( aimed - > spr . picnum ) ) < < 1 ) - ( 12 < < 8 ) ;
2022-01-31 18:21:49 +00:00
zvel = ( ( aimed - > int_pos ( ) . Z - sz - dal ) * vel ) / ldist ( ps [ p ] . GetActor ( ) , aimed ) ;
sa = getangle ( aimed - > int_pos ( ) . X - sx , aimed - > int_pos ( ) . Y - sy ) ;
2020-05-16 21:55:21 +00:00
}
else
{
2021-01-04 11:36:54 +00:00
zvel = - MulScale ( ps [ p ] . horizon . sum ( ) . asq16 ( ) , 98 , 16 ) ;
2020-05-16 21:55:21 +00:00
}
2020-10-20 23:03:38 +00:00
}
else
{
int x ;
2020-11-02 22:10:19 +00:00
int j = findplayer ( actor , & x ) ;
2021-11-09 23:05:42 +00:00
// sa = getangle(ps[j].oposx-sx,ps[j].oposy-sy);
2021-12-21 19:56:37 +00:00
if ( actor - > spr . picnum = = HULK )
2020-10-20 23:03:38 +00:00
sa - = ( krand ( ) & 31 ) ;
2021-12-21 19:56:37 +00:00
else if ( actor - > spr . picnum = = VIXEN )
2020-10-20 23:03:38 +00:00
sa - = ( krand ( ) & 16 ) ;
2021-12-21 19:56:37 +00:00
else if ( actor - > spr . picnum ! = UFOBEAM )
2020-10-20 23:03:38 +00:00
sa + = 16 - ( krand ( ) & 31 ) ;
2022-02-04 17:11:44 +00:00
zvel = ( ( ( ps [ j ] . player_int_opos ( ) . Z - sz + ( 3 < < 8 ) ) ) * vel ) / ldist ( ps [ j ] . GetActor ( ) , actor ) ;
2020-10-20 23:03:38 +00:00
}
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
int oldzvel = zvel ;
int sizx , sizy ;
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
if ( atwith = = SPIT )
{
sizx = 18 ; sizy = 18 ;
2021-12-21 19:56:37 +00:00
if ( ! isRRRA ( ) | | actor - > spr . picnum ! = MAMA ) sz - = ( 10 < < 8 ) ; else sz - = ( 20 < < 8 ) ;
2020-10-20 23:03:38 +00:00
}
else
{
if ( atwith = = COOLEXPLOSION1 )
{
sizx = 8 ;
sizy = 8 ;
}
else if ( atwith = = FIRELASER )
{
if ( p > = 0 )
{
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
sizx = 34 ;
sizy = 34 ;
}
else
{
sizx = 18 ;
sizy = 18 ;
}
}
else
2020-05-16 21:55:21 +00:00
{
2020-10-20 23:03:38 +00:00
sizx = 18 ;
sizy = 18 ;
}
}
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
if ( p > = 0 ) sizx = 7 , sizy = 7 ;
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
while ( scount > 0 )
{
2020-10-25 05:09:33 +00:00
auto j = EGS ( sect , sx , sy , sz , atwith , - 127 , sizx , sizy , sa , vel , zvel , actor , 4 ) ;
2021-11-19 08:47:17 +00:00
if ( ! j ) return ;
2021-12-21 17:19:45 +00:00
j - > spr . extra + = ( krand ( ) & 7 ) ;
j - > spr . cstat = CSTAT_SPRITE_YCENTER ;
j - > spr . clipdist = 4 ;
2020-10-20 23:03:38 +00:00
2022-08-16 21:15:49 +00:00
sa = actor - > int_ang ( ) + 32 - ( krand ( ) & 63 ) ;
2020-10-20 23:03:38 +00:00
zvel = oldzvel + 512 - ( krand ( ) & 1023 ) ;
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
if ( atwith = = FIRELASER )
{
2021-12-21 17:19:45 +00:00
j - > spr . xrepeat = 8 ;
j - > spr . yrepeat = 8 ;
2020-05-16 21:55:21 +00:00
}
2020-10-20 23:03:38 +00:00
scount - - ;
}
}
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2020-05-16 21:55:21 +00:00
2020-10-25 05:10:10 +00:00
static void shootrpg ( DDukeActor * actor , int p , int sx , int sy , int sz , int sa , int atwith )
2020-10-20 23:03:38 +00:00
{
2021-12-30 15:51:56 +00:00
auto sect = actor - > sector ( ) ;
2020-10-20 23:03:38 +00:00
int vel , zvel ;
2021-11-07 13:36:39 +00:00
int l , scount ;
2020-10-20 23:03:38 +00:00
2020-11-01 19:57:02 +00:00
DDukeActor * act90 = nullptr ;
2021-12-21 19:56:37 +00:00
if ( actor - > spr . extra > = 0 ) actor - > spr . shade = - 96 ;
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
scount = 1 ;
vel = 644 ;
2020-11-01 19:57:02 +00:00
DDukeActor * aimed = nullptr ;
2020-10-20 23:03:38 +00:00
if ( p > = 0 )
{
2020-11-01 19:57:02 +00:00
aimed = aim ( actor , 48 ) ;
if ( aimed )
2020-10-20 23:03:38 +00:00
{
if ( isRRRA ( ) & & atwith = = RPG2 )
2020-05-16 21:55:21 +00:00
{
2021-12-21 17:19:45 +00:00
if ( aimed - > spr . picnum = = HEN | | aimed - > spr . picnum = = HENSTAYPUT )
2020-11-01 19:57:02 +00:00
act90 = ps [ screenpeek ] . GetActor ( ) ;
2020-05-16 21:55:21 +00:00
else
2020-11-01 19:57:02 +00:00
act90 = aimed ;
2020-05-16 21:55:21 +00:00
}
2021-12-21 17:19:45 +00:00
int dal = ( ( aimed - > spr . xrepeat * tileHeight ( aimed - > spr . picnum ) ) < < 1 ) + ( 8 < < 8 ) ;
2022-01-31 18:21:49 +00:00
zvel = ( ( aimed - > int_pos ( ) . Z - sz - dal ) * vel ) / ldist ( ps [ p ] . GetActor ( ) , aimed ) ;
2021-12-21 17:19:45 +00:00
if ( aimed - > spr . picnum ! = RECON )
2022-01-31 18:21:49 +00:00
sa = getangle ( aimed - > int_pos ( ) . X - sx , aimed - > int_pos ( ) . Y - sy ) ;
2020-05-16 21:55:21 +00:00
}
2021-01-04 11:36:54 +00:00
else zvel = - MulScale ( ps [ p ] . horizon . sum ( ) . asq16 ( ) , 81 , 16 ) ;
2020-10-20 23:03:38 +00:00
if ( atwith = = RPG )
2020-11-01 19:57:02 +00:00
S_PlayActorSound ( RPG_SHOOT , actor ) ;
2020-10-20 23:03:38 +00:00
else if ( isRRRA ( ) )
2020-05-16 21:55:21 +00:00
{
2020-10-20 23:03:38 +00:00
if ( atwith = = RPG2 )
2020-11-01 19:57:02 +00:00
S_PlayActorSound ( 244 , actor ) ;
2020-10-20 23:03:38 +00:00
else if ( atwith = = RRTILE1790 )
2020-11-01 19:57:02 +00:00
S_PlayActorSound ( 94 , actor ) ;
2020-05-16 21:55:21 +00:00
}
2020-10-20 23:03:38 +00:00
}
else
{
int x ;
2020-11-02 22:10:19 +00:00
int j = findplayer ( actor , & x ) ;
2022-02-04 17:11:44 +00:00
sa = getangle ( ps [ j ] . player_int_opos ( ) . X - sx , ps [ j ] . player_int_opos ( ) . Y - sy ) ;
2021-12-21 19:56:37 +00:00
if ( actor - > spr . picnum = = BOSS3 )
2020-10-20 23:03:38 +00:00
sz - = ( 32 < < 8 ) ;
2021-12-21 19:56:37 +00:00
else if ( actor - > spr . picnum = = BOSS2 )
2020-05-16 21:55:21 +00:00
{
2020-10-20 23:03:38 +00:00
vel + = 128 ;
sz + = 24 < < 8 ;
2020-05-16 21:55:21 +00:00
}
2020-11-01 19:57:02 +00:00
l = ldist ( ps [ j ] . GetActor ( ) , actor ) ;
2022-02-04 17:11:44 +00:00
zvel = ( ( ps [ j ] . player_int_opos ( ) . Z - sz ) * vel ) / l ;
2020-05-16 21:55:21 +00:00
2021-12-21 19:56:37 +00:00
if ( badguy ( actor ) & & ( actor - > spr . hitag & face_player_smart ) )
2022-08-16 21:15:49 +00:00
sa = actor - > int_ang ( ) + ( krand ( ) & 31 ) - 16 ;
2020-10-20 23:03:38 +00:00
}
2020-11-01 19:57:02 +00:00
if ( p < 0 ) aimed = nullptr ;
2020-10-20 23:03:38 +00:00
if ( isRRRA ( ) & & atwith = = RRTILE1790 )
{
zvel = - ( 10 < < 8 ) ;
vel < < = 1 ;
}
2020-10-23 19:37:40 +00:00
auto spawned = EGS ( sect ,
2020-11-15 11:07:30 +00:00
sx + ( bcos ( sa + 348 ) / 448 ) ,
sy + ( bsin ( sa + 348 ) / 448 ) ,
2020-10-25 05:10:10 +00:00
sz - ( 1 < < 8 ) , atwith , 0 , 14 , 14 , sa , vel , zvel , actor , 4 ) ;
2020-10-20 23:03:38 +00:00
2021-11-19 08:47:17 +00:00
if ( ! spawned ) return ;
2020-10-20 23:03:38 +00:00
if ( isRRRA ( ) )
{
if ( atwith = = RRTILE1790 )
{
2021-12-21 17:19:45 +00:00
spawned - > spr . extra = 10 ;
spawned - > spr . zvel = - ( 10 < < 8 ) ;
2020-05-16 21:55:21 +00:00
}
2020-10-20 23:03:38 +00:00
else if ( atwith = = RPG2 )
2020-05-16 21:55:21 +00:00
{
2020-11-01 19:57:02 +00:00
spawned - > seek_actor = act90 ;
2021-12-21 17:19:45 +00:00
spawned - > spr . hitag = 0 ;
2020-10-23 19:37:40 +00:00
fi . lotsofmoney ( spawned , ( krand ( ) & 3 ) + 1 ) ;
2020-05-16 21:55:21 +00:00
}
2020-10-20 23:03:38 +00:00
}
2020-05-16 21:55:21 +00:00
2021-12-21 17:19:45 +00:00
spawned - > spr . extra + = ( krand ( ) & 7 ) ;
2020-10-20 23:03:38 +00:00
if ( atwith ! = FREEZEBLAST )
2020-11-01 19:57:02 +00:00
spawned - > temp_actor = aimed ;
2020-10-20 23:03:38 +00:00
else
{
2021-12-21 17:19:45 +00:00
spawned - > spr . yvel = gs . numfreezebounces ;
spawned - > spr . xrepeat > > = 1 ;
spawned - > spr . yrepeat > > = 1 ;
spawned - > spr . zvel - = ( 2 < < 4 ) ;
2020-10-20 23:03:38 +00:00
}
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
if ( p = = - 1 )
{
2021-12-21 19:56:37 +00:00
if ( actor - > spr . picnum = = HULK )
2020-05-16 21:55:21 +00:00
{
2021-12-21 17:19:45 +00:00
spawned - > spr . xrepeat = 8 ;
spawned - > spr . yrepeat = 8 ;
2020-05-16 21:55:21 +00:00
}
2020-10-20 23:03:38 +00:00
else if ( atwith ! = FREEZEBLAST )
2020-05-16 21:55:21 +00:00
{
2021-12-21 17:19:45 +00:00
spawned - > spr . xrepeat = 30 ;
spawned - > spr . yrepeat = 30 ;
spawned - > spr . extra > > = 2 ;
2020-05-16 21:55:21 +00:00
}
2020-10-20 23:03:38 +00:00
}
else if ( ps [ p ] . curr_weapon = = TIT_WEAPON )
{
2021-12-21 17:19:45 +00:00
spawned - > spr . extra > > = 2 ;
2022-08-16 21:26:39 +00:00
spawned - > add_int_ang ( 16 - ( krand ( ) & 31 ) ) ;
2021-12-21 17:19:45 +00:00
spawned - > spr . zvel + = 256 - ( krand ( ) & 511 ) ;
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
if ( ps [ p ] . hbomb_hold_delay )
{
2022-01-30 17:33:11 +00:00
spawned - > add_int_pos ( { - bsin ( sa ) / 644 , bcos ( sa ) / 644 , 0 } ) ;
2020-10-20 23:03:38 +00:00
}
else
2020-05-16 21:55:21 +00:00
{
2022-01-30 17:33:11 +00:00
spawned - > add_int_pos ( { bsin ( sa , - 8 ) , - bcos ( sa , - 8 ) , 0 } ) ;
2020-10-20 23:03:38 +00:00
}
2021-12-21 17:19:45 +00:00
spawned - > spr . xrepeat > > = 1 ;
spawned - > spr . yrepeat > > = 1 ;
2020-10-20 23:03:38 +00:00
}
2021-12-21 17:19:45 +00:00
spawned - > spr . cstat = CSTAT_SPRITE_YCENTER ;
2020-10-20 23:03:38 +00:00
if ( atwith = = RPG | | ( atwith = = RPG2 & & isRRRA ( ) ) )
2021-12-21 17:19:45 +00:00
spawned - > spr . clipdist = 4 ;
2020-10-20 23:03:38 +00:00
else
2021-12-21 17:19:45 +00:00
spawned - > spr . clipdist = 40 ;
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
}
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2020-05-16 21:55:21 +00:00
2020-10-25 05:10:10 +00:00
static void shootwhip ( DDukeActor * actor , int p , int sx , int sy , int sz , int sa , int atwith )
2020-10-20 23:03:38 +00:00
{
2021-12-30 15:51:56 +00:00
auto sect = actor - > sector ( ) ;
2021-11-14 14:03:50 +00:00
int vel = 0 , zvel ;
2021-11-07 13:36:39 +00:00
int scount ;
2020-05-16 21:55:21 +00:00
2021-12-21 19:56:37 +00:00
if ( actor - > spr . extra > = 0 ) actor - > spr . shade = - 96 ;
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
scount = 1 ;
if ( atwith = = 3471 )
2020-05-16 21:55:21 +00:00
{
2020-10-20 23:03:38 +00:00
vel = 300 ;
sz - = ( 15 < < 8 ) ;
2020-05-16 21:55:21 +00:00
scount = 1 ;
2020-10-20 23:03:38 +00:00
}
else if ( atwith = = 3475 )
{
vel = 300 ;
sz + = ( 4 < < 8 ) ;
scount = 1 ;
}
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
if ( p > = 0 )
{
2020-11-01 19:57:02 +00:00
auto aimed = aim ( actor , AUTO_AIM_ANGLE ) ;
2020-05-16 21:55:21 +00:00
2020-11-01 19:57:02 +00:00
if ( aimed )
2020-05-16 21:55:21 +00:00
{
2021-12-21 17:19:45 +00:00
int dal = ( ( aimed - > spr . xrepeat * tileHeight ( aimed - > spr . picnum ) ) < < 1 ) - ( 12 < < 8 ) ;
2022-01-31 18:21:49 +00:00
zvel = ( ( aimed - > int_pos ( ) . Z - sz - dal ) * vel ) / ldist ( ps [ p ] . GetActor ( ) , aimed ) ;
sa = getangle ( aimed - > int_pos ( ) . X - sx , aimed - > int_pos ( ) . Y - sy ) ;
2020-05-16 21:55:21 +00:00
}
else
2021-01-04 11:36:54 +00:00
zvel = - MulScale ( ps [ p ] . horizon . sum ( ) . asq16 ( ) , 98 , 16 ) ;
2020-10-20 23:03:38 +00:00
}
else
{
int x ;
2020-11-02 22:10:19 +00:00
int j = findplayer ( actor , & x ) ;
2020-10-20 23:03:38 +00:00
// sa = getangle(ps[j].oposx-sx,ps[j].oposy-sy);
2021-12-21 19:56:37 +00:00
if ( actor - > spr . picnum = = VIXEN )
2020-10-20 23:03:38 +00:00
sa - = ( krand ( ) & 16 ) ;
else
sa + = 16 - ( krand ( ) & 31 ) ;
2022-02-04 17:11:44 +00:00
zvel = ( ( ( ps [ j ] . player_int_opos ( ) . Z - sz + ( 3 < < 8 ) ) ) * vel ) / ldist ( ps [ j ] . GetActor ( ) , actor ) ;
2020-10-20 23:03:38 +00:00
}
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
int oldzvel = zvel ;
int sizx = 18 ;
int sizy = 18 ;
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
if ( p > = 0 ) sizx = 7 , sizy = 7 ;
else sizx = 8 , sizy = 8 ;
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
while ( scount > 0 )
{
2020-10-25 05:10:10 +00:00
auto j = EGS ( sect , sx , sy , sz , atwith , - 127 , sizx , sizy , sa , vel , zvel , actor , 4 ) ;
2021-11-19 08:47:17 +00:00
if ( ! j ) return ;
2021-12-21 17:19:45 +00:00
j - > spr . extra + = ( krand ( ) & 7 ) ;
j - > spr . cstat = CSTAT_SPRITE_YCENTER ;
j - > spr . clipdist = 4 ;
2020-05-16 21:55:21 +00:00
2022-08-16 21:15:49 +00:00
sa = actor - > int_ang ( ) + 32 - ( krand ( ) & 63 ) ;
2020-10-20 23:03:38 +00:00
zvel = oldzvel + 512 - ( krand ( ) & 1023 ) ;
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
scount - - ;
}
}
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2020-10-24 05:34:39 +00:00
void shoot_r ( DDukeActor * actor , int atwith )
2020-10-20 23:03:38 +00:00
{
2021-11-18 18:04:00 +00:00
int sa , p ;
2020-10-21 05:31:21 +00:00
int sx , sy , sz , vel , zvel , x ;
2020-10-20 23:03:38 +00:00
2020-11-01 17:23:09 +00:00
2021-12-30 15:51:56 +00:00
auto const sect = actor - > sector ( ) ;
2020-10-20 23:03:38 +00:00
zvel = 0 ;
2021-12-31 17:47:00 +00:00
if ( actor - > isPlayer ( ) )
2020-10-20 23:03:38 +00:00
{
2021-12-21 19:56:37 +00:00
p = actor - > spr . yvel ;
2020-05-16 21:55:21 +00:00
2022-02-04 17:11:44 +00:00
sx = ps [ p ] . player_int_pos ( ) . X ;
sy = ps [ p ] . player_int_pos ( ) . Y ;
sz = ps [ p ] . player_int_pos ( ) . Z + ps [ p ] . pyoff + ( 4 < < 8 ) ;
2022-08-27 13:09:22 +00:00
sa = ps [ p ] . angle . ang . Buildang ( ) ;
2020-10-20 23:03:38 +00:00
if ( isRRRA ( ) ) ps [ p ] . crack_time = CRACK_TIME ;
}
else
{
p = - 1 ;
2022-08-16 21:17:01 +00:00
sa = actor - > int_ang ( ) ;
2022-01-31 18:21:49 +00:00
sx = actor - > int_pos ( ) . X ;
sy = actor - > int_pos ( ) . Y ;
sz = actor - > int_pos ( ) . Z - ( ( actor - > spr . yrepeat * tileHeight ( actor - > spr . picnum ) ) < < 1 ) + ( 4 < < 8 ) ;
2020-10-20 23:03:38 +00:00
sz - = ( 7 < < 8 ) ;
2021-12-21 19:56:37 +00:00
if ( badguy ( actor ) )
2020-05-16 21:55:21 +00:00
{
2020-11-15 11:07:30 +00:00
sx - = bsin ( sa , - 7 ) ;
sy + = bcos ( sa , - 7 ) ;
2020-05-16 21:55:21 +00:00
}
2020-10-20 23:03:38 +00:00
}
2020-05-16 21:55:21 +00:00
2020-10-24 05:28:07 +00:00
SetGameVarID ( g_iAtWithVarID , atwith , actor , p ) ;
2020-11-01 17:23:09 +00:00
SetGameVarID ( g_iReturnVarID , 0 , actor , p ) ;
OnEvent ( EVENT_SHOOT , p , ps [ p ] . GetActor ( ) , - 1 ) ;
2021-12-05 16:36:57 +00:00
if ( GetGameVarID ( g_iReturnVarID , actor , p ) . safeValue ( ) ! = 0 )
2020-10-20 23:03:38 +00:00
{
return ;
}
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
switch ( atwith )
{
case BLOODSPLAT1 :
case BLOODSPLAT2 :
case BLOODSPLAT3 :
case BLOODSPLAT4 :
2020-10-23 17:50:18 +00:00
shootbloodsplat ( actor , p , sx , sy , sz , sa , atwith , BIGFORCE , OOZFILTER , - 1 ) ;
2020-10-20 23:03:38 +00:00
return ;
2020-05-16 21:55:21 +00:00
2020-10-20 23:03:38 +00:00
case SLINGBLADE :
if ( ! isRRRA ( ) ) break ;
2021-11-14 11:25:25 +00:00
[[fallthrough]] ;
2020-10-20 23:03:38 +00:00
case KNEE :
case GROWSPARK :
2020-10-24 04:58:52 +00:00
shootmelee ( actor , p , sx , sy , sz , sa , atwith ) ;
2020-10-20 23:03:38 +00:00
return ;
case SHOTSPARK1 :
case SHOTGUN :
case CHAINGUN :
2020-10-24 05:01:01 +00:00
shootweapon ( actor , p , sx , sy , sz , sa , atwith ) ;
2020-10-20 23:03:38 +00:00
return ;
2022-01-19 09:05:41 +00:00
case POWDERKEG :
2020-10-24 05:34:39 +00:00
{
auto j = spawn ( actor , atwith ) ;
2021-11-19 11:32:12 +00:00
if ( j )
{
2021-12-21 17:19:45 +00:00
j - > spr . xvel = 32 ;
2022-08-28 03:15:31 +00:00
j - > spr . angle = actor - > spr . angle ;
2022-08-20 15:59:15 +00:00
j - > spr . pos . Z - = 5 ;
2021-11-19 11:32:12 +00:00
}
2020-10-20 23:03:38 +00:00
break ;
2020-10-24 05:34:39 +00:00
}
2020-10-20 23:03:38 +00:00
case BOWLINGBALL :
2020-10-24 05:34:39 +00:00
{
auto j = spawn ( actor , atwith ) ;
2021-11-19 11:32:12 +00:00
if ( j )
{
2021-12-21 17:19:45 +00:00
j - > spr . xvel = 250 ;
2022-08-28 03:15:31 +00:00
j - > spr . angle = actor - > spr . angle ;
2022-08-20 15:59:15 +00:00
j - > spr . pos . Z - = 15 ;
2021-11-19 11:32:12 +00:00
}
2020-10-20 23:03:38 +00:00
break ;
2020-10-24 05:34:39 +00:00
}
2020-10-20 23:03:38 +00:00
case OWHIP :
case UWHIP :
2020-10-25 05:10:10 +00:00
shootwhip ( actor , p , sx , sy , sz , sa , atwith ) ;
2020-10-20 23:03:38 +00:00
return ;
case FIRELASER :
case SPIT :
case COOLEXPLOSION1 :
2020-10-25 05:09:33 +00:00
shootstuff ( actor , p , sx , sy , sz , sa , atwith ) ;
2020-10-20 23:03:38 +00:00
return ;
case RPG2 :
case RRTILE1790 :
if ( isRRRA ( ) ) goto rrra_rpg2 ;
else break ;
case FREEZEBLAST :
sz + = ( 3 < < 8 ) ;
case RPG :
case SHRINKSPARK :
rrra_rpg2 :
2020-10-25 05:10:10 +00:00
shootrpg ( actor , p , sx , sy , sz , sa , atwith ) ;
2020-10-20 23:03:38 +00:00
break ;
2020-05-16 21:55:21 +00:00
case CHEERBOMB :
if ( ! isRRRA ( ) ) break ;
case MORTER :
2020-10-25 05:14:54 +00:00
{
2021-12-21 19:56:37 +00:00
if ( actor - > spr . extra > = 0 ) actor - > spr . shade = - 96 ;
2020-05-16 21:55:21 +00:00
2020-10-25 05:14:54 +00:00
auto j = ps [ findplayer ( actor , & x ) ] . GetActor ( ) ;
x = ldist ( j , actor ) ;
2020-05-16 21:55:21 +00:00
zvel = - x > > 1 ;
if ( zvel < - 4096 )
zvel = - 2048 ;
vel = x > > 4 ;
if ( atwith = = CHEERBOMB )
EGS ( sect ,
2020-11-15 11:07:30 +00:00
sx - bsin ( sa + 512 , - 8 ) ,
sy + bcos ( sa + 512 , - 8 ) ,
2020-10-25 05:14:54 +00:00
sz + ( 6 < < 8 ) , atwith , - 64 , 16 , 16 , sa , vel , zvel , actor , 1 ) ;
2020-05-16 21:55:21 +00:00
else
EGS ( sect ,
2020-11-15 11:07:30 +00:00
sx - bsin ( sa + 512 , - 8 ) ,
sy + bcos ( sa + 512 , - 8 ) ,
2020-10-25 05:14:54 +00:00
sz + ( 6 < < 8 ) , atwith , - 64 , 32 , 32 , sa , vel , zvel , actor , 1 ) ;
2020-05-16 21:55:21 +00:00
break ;
}
2020-10-25 05:14:54 +00:00
}
2020-05-16 21:55:21 +00:00
return ;
}
2020-05-17 11:25:39 +00:00
//---------------------------------------------------------------------------
//
// this is one lousy hack job...
//
//---------------------------------------------------------------------------
2020-08-26 22:53:35 +00:00
void selectweapon_r ( int snum , int weap )
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 ] ;
2021-12-21 17:19:45 +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 . xrepeat > 8 & & 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 THROWSAW_WEAPON :
2020-12-01 20:07:38 +00:00
if ( p - > ammo_amount [ BUZZSAW_WEAPON ] > 0 )
{
j = BUZZSAW_WEAPON ;
p - > subweapon = 1 < < BUZZSAW_WEAPON ;
}
2020-08-29 11:27:58 +00:00
break ;
case BUZZSAW_WEAPON :
2020-12-01 20:07:38 +00:00
if ( p - > ammo_amount [ THROWSAW_WEAPON ] > 0 )
{
j = THROWSAW_WEAPON ;
p - > subweapon = 0 ;
}
2020-08-29 11:27:58 +00:00
break ;
case POWDERKEG_WEAPON :
2020-12-01 20:07:38 +00:00
if ( p - > ammo_amount [ BOWLING_WEAPON ] > 0 )
{
j = BOWLING_WEAPON ;
p - > subweapon = 1 < < BOWLING_WEAPON ;
}
2020-08-29 11:27:58 +00:00
break ;
case BOWLING_WEAPON :
2020-12-01 20:07:38 +00:00
if ( p - > ammo_amount [ POWDERKEG_WEAPON ] > 0 )
{
j = POWDERKEG_WEAPON ;
p - > subweapon = 0 ;
}
2020-08-29 11:27:58 +00:00
break ;
case KNEE_WEAPON :
2020-12-01 20:07:38 +00:00
if ( isRRRA ( ) )
{
j = SLINGBLADE_WEAPON ;
p - > subweapon = 2 ;
}
2020-08-29 11:27:58 +00:00
break ;
case SLINGBLADE_WEAPON :
j = KNEE_WEAPON ;
2020-12-01 20:07:38 +00:00
p - > subweapon = 0 ;
2020-08-29 11:27:58 +00:00
break ;
2021-06-24 08:56:12 +00:00
case CROSSBOW_WEAPON :
2020-12-01 20:07:38 +00:00
if ( p - > ammo_amount [ CHICKEN_WEAPON ] > 0 & & isRRRA ( ) )
{
j = CHICKEN_WEAPON ;
p - > subweapon = 4 ;
}
2020-08-29 11:27:58 +00:00
break ;
case CHICKEN_WEAPON :
2021-06-24 08:56:12 +00:00
if ( p - > ammo_amount [ CROSSBOW_WEAPON ] > 0 )
2020-12-01 20:07:38 +00:00
{
2021-06-24 08:56:12 +00:00
j = CROSSBOW_WEAPON ;
2020-12-01 20:07:38 +00:00
p - > subweapon = 0 ;
}
2020-08-29 11:27:58 +00:00
break ;
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 ;
if ( isRRRA ( ) )
{
if ( k = = CHICKEN_WEAPON ) k = CROSSBOW_WEAPON ;
else if ( k = = BUZZSAW_WEAPON ) k = THROWSAW_WEAPON ;
else if ( k = = SLINGBLADE_WEAPON ) k = KNEE_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 ;
while ( k > = 0 & & k < 10 )
{
k + = j ;
if ( k = = - 1 ) k = 9 ;
else if ( k = = 10 ) k = 0 ;
if ( p - > gotweapon [ k ] & & p - > ammo_amount [ k ] > 0 )
{
j = k ;
break ;
}
i + + ;
if ( i = = 10 )
{
fi . addweapon ( p , KNEE_WEAPON ) ;
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 = = DYNAMITE_WEAPON & & p - > ammo_amount [ DYNAMITE_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
{
2021-12-21 17:19:45 +00:00
if ( act - > spr . picnum = = HEAVYHBOMB & & act - > GetOwner ( ) = = p - > GetActor ( ) )
2020-05-17 11:25:39 +00:00
{
2021-05-15 08:23:50 +00:00
p - > gotweapon [ DYNAMITE_WEAPON ] = true ;
2020-05-20 08:38:56 +00:00
j = THROWINGDYNAMITE_WEAPON ;
2020-05-17 11:25:39 +00:00
break ;
}
}
}
else if ( j = = KNEE_WEAPON & & isRRRA ( ) )
{
if ( p - > curr_weapon = = KNEE_WEAPON )
{
p - > subweapon = 2 ;
j = SLINGBLADE_WEAPON ;
}
else if ( p - > subweapon & 2 )
{
p - > subweapon = 0 ;
j = KNEE_WEAPON ;
}
}
else if ( j = = CROSSBOW_WEAPON & & isRRRA ( ) )
{
if ( p - > curr_weapon = = CROSSBOW_WEAPON | | p - > ammo_amount [ CROSSBOW_WEAPON ] = = 0 )
{
if ( p - > ammo_amount [ CHICKEN_WEAPON ] = = 0 )
return ;
p - > subweapon = 4 ;
j = CHICKEN_WEAPON ;
}
else if ( ( p - > subweapon & 4 ) | | p - > ammo_amount [ CHICKEN_WEAPON ] = = 0 )
{
p - > subweapon = 0 ;
j = CROSSBOW_WEAPON ;
}
}
else if ( j = = THROWSAW_WEAPON )
{
if ( p - > curr_weapon = = THROWSAW_WEAPON | | p - > ammo_amount [ THROWSAW_WEAPON ] = = 0 )
{
p - > subweapon = ( 1 < < BUZZSAW_WEAPON ) ;
j = BUZZSAW_WEAPON ;
}
else if ( ( p - > subweapon & ( 1 < < BUZZSAW_WEAPON ) ) | | p - > ammo_amount [ BUZZSAW_WEAPON ] = = 0 )
{
p - > subweapon = 0 ;
j = THROWSAW_WEAPON ;
}
}
else if ( j = = POWDERKEG_WEAPON )
{
if ( p - > curr_weapon = = POWDERKEG_WEAPON | | p - > ammo_amount [ POWDERKEG_WEAPON ] = = 0 )
{
p - > subweapon = ( 1 < < BOWLING_WEAPON ) ;
j = BOWLING_WEAPON ;
}
else if ( ( p - > subweapon & ( 1 < < BOWLING_WEAPON ) ) | | p - > ammo_amount [ BOWLING_WEAPON ] = = 0 )
{
p - > subweapon = 0 ;
j = POWDERKEG_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
}
else if ( j > = MIN_WEAPON & & p - > gotweapon [ j ] & & p - > curr_weapon ! = j ) switch ( j )
{
case KNEE_WEAPON :
fi . addweapon ( p , j ) ;
break ;
case SLINGBLADE_WEAPON :
if ( isRRRA ( ) )
{
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( 496 , ps [ screenpeek ] . GetActor ( ) ) ;
2020-05-17 11:25:39 +00:00
fi . addweapon ( p , j ) ;
}
break ;
case PISTOL_WEAPON :
if ( p - > ammo_amount [ PISTOL_WEAPON ] = = 0 )
if ( p - > show_empty_weapon = = 0 )
{
p - > last_full_weapon = p - > curr_weapon ;
p - > show_empty_weapon = 32 ;
}
fi . addweapon ( p , PISTOL_WEAPON ) ;
break ;
case CHICKEN_WEAPON :
if ( ! isRRRA ( ) ) break ;
2021-11-14 11:25:25 +00:00
[[fallthrough]] ;
2020-05-17 11:25:39 +00:00
case SHOTGUN_WEAPON :
case RIFLEGUN_WEAPON :
case CROSSBOW_WEAPON :
case TIT_WEAPON :
case ALIENBLASTER_WEAPON :
case THROWSAW_WEAPON :
case BUZZSAW_WEAPON :
case POWDERKEG_WEAPON :
case BOWLING_WEAPON :
if ( p - > ammo_amount [ j ] = = 0 & & p - > show_empty_weapon = = 0 )
{
p - > last_full_weapon = p - > curr_weapon ;
p - > show_empty_weapon = 32 ;
}
fi . addweapon ( p , j ) ;
break ;
case MOTORCYCLE_WEAPON :
case BOAT_WEAPON :
if ( isRRRA ( ) )
{
if ( p - > ammo_amount [ j ] = = 0 & & p - > show_empty_weapon = = 0 )
{
p - > show_empty_weapon = 32 ;
}
fi . addweapon ( p , j ) ;
}
break ;
2020-05-20 08:38:56 +00:00
case THROWINGDYNAMITE_WEAPON :
2020-05-17 11:25:39 +00:00
if ( k > = 0 ) // Found in list of [1]'s
{
2020-05-20 08:38:56 +00:00
p - > curr_weapon = THROWINGDYNAMITE_WEAPON ;
2020-05-17 11:25:39 +00:00
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 DYNAMITE_WEAPON :
if ( p - > ammo_amount [ DYNAMITE_WEAPON ] > 0 & & p - > gotweapon [ DYNAMITE_WEAPON ] )
fi . addweapon ( p , DYNAMITE_WEAPON ) ;
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_r ( 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 ( ) ;
2020-05-17 16:04:45 +00:00
if ( isRRRA ( ) )
{
if ( WindTime > 0 )
WindTime - - ;
else if ( ( krand ( ) & 127 ) = = 8 )
{
WindTime = 120 + ( ( krand ( ) & 63 ) < < 2 ) ;
WindDir = krand ( ) & 2047 ;
}
if ( BellTime > 0 )
{
BellTime - - ;
2020-10-26 06:30:34 +00:00
if ( BellTime = = 0 & & BellSprite )
2021-12-21 17:19:45 +00:00
BellSprite - > spr . picnum + + ;
2020-05-17 16:04:45 +00:00
}
if ( chickenphase > 0 )
chickenphase - - ;
if ( p - > SeaSick )
{
p - > SeaSick - - ;
if ( p - > SeaSick = = 0 )
p - > sea_sick_stat = 0 ;
}
}
2021-12-21 17:19:45 +00:00
snum = p - > GetActor ( ) - > spr . yvel ;
2020-05-17 16:04:45 +00:00
p - > player_par + + ;
if ( p - > yehaa_timer )
p - > yehaa_timer - - ;
if ( p - > detonate_count > 0 )
{
p - > detonate_count + + ;
p - > detonate_time - - ;
}
p - > drink_timer - - ;
if ( p - > drink_timer < = 0 )
{
p - > drink_timer = 1024 ;
if ( p - > drink_amt )
{
p - > drink_amt - - ;
}
}
p - > eat_timer - - ;
if ( p - > eat_timer < = 0 )
{
p - > eat_timer = 1024 ;
if ( p - > eat )
p - > eat - - ;
}
if ( p - > drink_amt > = 100 )
{
2020-11-02 19:24:07 +00:00
if ( ! S_CheckActorSoundPlaying ( pact , 420 ) )
S_PlayActorSound ( 420 , pact ) ;
2020-05-17 16:04:45 +00:00
p - > drink_amt - = 9 ;
p - > eat > > = 1 ;
}
p - > eatang = ( 1647 + p - > eat * 8 ) & 2047 ;
if ( p - > eat > = 100 )
p - > eat = 100 ;
if ( p - > eat > = 31 & & krand ( ) < p - > eat )
{
switch ( krand ( ) & 3 )
{
case 0 :
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( 404 , pact ) ;
2020-05-17 16:04:45 +00:00
break ;
case 1 :
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( 422 , pact ) ;
2020-05-17 16:04:45 +00:00
break ;
case 2 :
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( 423 , pact ) ;
2020-05-17 16:04:45 +00:00
break ;
case 3 :
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( 424 , pact ) ;
2020-05-17 16:04:45 +00:00
break ;
}
if ( numplayers < 2 )
{
p - > noise_radius = 16384 ;
madenoise ( screenpeek ) ;
2022-08-27 13:09:51 +00:00
p - > vel . X + = p - > angle . ang . Cos ( ) * ( 1 < < 18 ) ;
p - > vel . Y + = p - > angle . ang . Sin ( ) * ( 1 < < 18 ) ;
2020-05-17 16:04:45 +00:00
}
p - > eat - = 4 ;
if ( p - > eat < 0 )
p - > eat = 0 ;
}
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 - > drink_amt > 66 & & ( p - > last_pissed_time % 26 ) = = 0 )
p - > drink_amt - - ;
{
if ( p - > last_pissed_time = = 5662 )
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( 434 , pact ) ;
2020-05-17 16:04:45 +00:00
else if ( p - > last_pissed_time = = 5567 )
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( 434 , pact ) ;
2020-05-17 16:04:45 +00:00
else if ( p - > last_pissed_time = = 5472 )
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( 433 , pact ) ;
2020-05-17 16:04:45 +00:00
else if ( p - > last_pissed_time = = 5072 )
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( 435 , pact ) ;
2020-05-17 16:04:45 +00:00
else if ( p - > last_pissed_time = = 5014 )
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( 434 , pact ) ;
2020-05-17 16:04:45 +00:00
else if ( p - > last_pissed_time = = 4919 )
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( 433 , pact ) ;
2020-05-17 16:04:45 +00:00
}
if ( p - > last_pissed_time = = 5668 )
{
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 ) ;
p - > eat = p - > drink_amt = 0 ;
p - > eatang = p - > drunkang = 1647 ;
}
if ( ! ( p - > steroids_amount & 14 ) )
if ( snum = = screenpeek | | ud . coop = = 1 )
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( DUKE_TAKEPILLS , pact ) ;
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
{
2021-11-17 23:16:53 +00:00
fi . 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 - > keys [ 1 ] = 1 ; break ;
case 21 : p - > keys [ 2 ] = 1 ; break ;
case 23 : p - > keys [ 3 ] = 1 ; break ;
}
2020-10-25 05:34:25 +00:00
p - > access_spritenum = nullptr ;
2020-05-17 16:04:45 +00:00
}
else
{
2021-11-17 23:20:39 +00:00
fi . checkhitswitch ( snum , p - > access_wall , nullptr ) ;
switch ( p - > access_wall - > pal )
2020-05-17 16:04:45 +00:00
{
case 0 : p - > keys [ 1 ] = 1 ; break ;
case 21 : p - > keys [ 2 ] = 1 ; break ;
case 23 : p - > keys [ 3 ] = 1 ; 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 )
{
if ( ! wupass )
{
2021-05-02 11:12:24 +00:00
int snd = currentLevel - > rr_startsound ? currentLevel - > rr_startsound : 391 ;
2020-05-17 16:04:45 +00:00
wupass = 1 ;
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( snd , pact ) ;
2020-05-17 16:04:45 +00:00
}
2021-02-18 10:46:36 +00:00
else 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-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 ;
}
2020-05-17 21:44:53 +00:00
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2022-02-07 10:04:19 +00:00
void checkweapons_r ( player_struct * p )
2020-05-17 21:44:53 +00:00
{
2021-11-07 13:09:55 +00:00
static const uint16_t weapon_sprites [ MAX_WEAPONS ] = { KNEE , FIRSTGUNSPRITE , SHOTGUNSPRITE ,
2020-05-17 21:44:53 +00:00
CHAINGUNSPRITE , RPGSPRITE , HEAVYHBOMB , SHRINKERSPRITE , DEVISTATORSPRITE ,
2022-01-19 09:05:41 +00:00
POWDERKEG , BOWLINGBALLSPRITE , FREEZEBLAST , HEAVYHBOMB } ;
2020-05-17 21:44:53 +00:00
if ( isRRRA ( ) )
{
if ( p - > OnMotorcycle & & numplayers > 1 )
{
2020-10-25 06:30:47 +00:00
auto j = spawn ( p - > GetActor ( ) , 7220 ) ;
2021-11-19 11:32:12 +00:00
if ( j )
{
2022-08-28 22:02:17 +00:00
j - > spr . angle = p - > angle . ang ;
2021-11-19 11:32:12 +00:00
j - > saved_ammo = p - > ammo_amount [ MOTORCYCLE_WEAPON ] ;
}
2020-05-17 21:44:53 +00:00
p - > OnMotorcycle = 0 ;
2021-05-15 08:23:50 +00:00
p - > gotweapon [ MOTORCYCLE_WEAPON ] = false ;
2020-10-07 06:12:37 +00:00
p - > horizon . horiz = q16horiz ( 0 ) ;
2020-05-17 21:44:53 +00:00
p - > moto_do_bump = 0 ;
p - > MotoSpeed = 0 ;
p - > TiltStatus = 0 ;
p - > moto_drink = 0 ;
p - > VBumpTarget = 0 ;
p - > VBumpNow = 0 ;
p - > TurbCount = 0 ;
}
else if ( p - > OnBoat & & numplayers > 1 )
{
2020-10-25 06:30:47 +00:00
auto j = spawn ( p - > GetActor ( ) , 7233 ) ;
2021-11-19 11:32:12 +00:00
if ( j )
{
2022-08-28 22:02:17 +00:00
j - > spr . angle = p - > angle . ang ;
2021-11-19 11:32:12 +00:00
j - > saved_ammo = p - > ammo_amount [ BOAT_WEAPON ] ;
}
2020-05-17 21:44:53 +00:00
p - > OnBoat = 0 ;
2021-05-15 08:23:50 +00:00
p - > gotweapon [ BOAT_WEAPON ] = false ;
2020-10-07 06:12:37 +00:00
p - > horizon . horiz = q16horiz ( 0 ) ;
2020-05-17 21:44:53 +00:00
p - > moto_do_bump = 0 ;
p - > MotoSpeed = 0 ;
p - > TiltStatus = 0 ;
p - > moto_drink = 0 ;
p - > VBumpTarget = 0 ;
p - > VBumpNow = 0 ;
p - > TurbCount = 0 ;
}
}
if ( p - > curr_weapon > 0 )
{
if ( krand ( ) & 1 )
2020-10-25 06:30:47 +00:00
spawn ( p - > GetActor ( ) , weapon_sprites [ p - > curr_weapon ] ) ;
2020-05-17 21:44:53 +00:00
else switch ( p - > curr_weapon )
{
case CHICKEN_WEAPON :
if ( ! isRRRA ( ) ) break ;
2021-11-14 11:25:25 +00:00
[[fallthrough]] ;
2020-05-17 21:44:53 +00:00
case DYNAMITE_WEAPON :
case CROSSBOW_WEAPON :
2020-10-25 06:30:47 +00:00
spawn ( p - > GetActor ( ) , EXPLOSION2 ) ;
2020-05-17 21:44:53 +00:00
break ;
}
}
2020-10-25 06:30:47 +00:00
for ( int i = 0 ; i < 5 ; i + + )
2020-05-17 21:44:53 +00:00
{
if ( p - > keys [ i ] = = 1 )
{
2020-10-25 06:30:47 +00:00
auto j = spawn ( p - > GetActor ( ) , ACCESSCARD ) ;
2021-11-19 11:32:12 +00:00
if ( j ) switch ( i )
2020-05-17 21:44:53 +00:00
{
case 1 :
2021-12-21 17:19:45 +00:00
j - > spr . lotag = 100 ;
2020-05-17 21:44:53 +00:00
break ;
case 2 :
2021-12-21 17:19:45 +00:00
j - > spr . lotag = 101 ;
2020-05-17 21:44:53 +00:00
break ;
case 3 :
2021-12-21 17:19:45 +00:00
j - > spr . lotag = 102 ;
2020-05-17 21:44:53 +00:00
break ;
case 4 :
2021-12-21 17:19:45 +00:00
j - > spr . lotag = 103 ;
2020-05-17 21:44:53 +00:00
break ;
}
}
}
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2020-08-29 11:32:14 +00:00
static void onMotorcycle ( int snum , ESyncBits & actions )
2020-05-17 21:44:53 +00:00
{
auto p = & ps [ snum ] ;
2020-10-25 06:42:29 +00:00
auto pact = p - > GetActor ( ) ;
2020-05-17 21:44:53 +00:00
2021-11-07 13:36:39 +00:00
int rng ;
2020-11-05 08:32:14 +00:00
2020-05-17 21:44:53 +00:00
if ( p - > MotoSpeed < 0 )
p - > MotoSpeed = 0 ;
2020-11-05 08:32:14 +00:00
2020-11-04 23:07:39 +00:00
if ( p - > vehForwardScale ! = 0 )
2020-05-17 21:44:53 +00:00
{
if ( p - > on_ground )
{
2021-01-03 08:25:49 +00:00
if ( p - > MotoSpeed = = 0 & & p - > vehBraking )
2020-05-17 21:44:53 +00:00
{
2020-10-25 06:42:29 +00:00
if ( ! S_CheckActorSoundPlaying ( pact , 187 ) )
S_PlayActorSound ( 187 , pact ) ;
2020-05-17 21:44:53 +00:00
}
2020-10-25 06:42:29 +00:00
else if ( p - > MotoSpeed = = 0 & & ! S_CheckActorSoundPlaying ( pact , 214 ) )
2020-05-17 21:44:53 +00:00
{
2020-10-25 06:42:29 +00:00
if ( S_CheckActorSoundPlaying ( pact , 187 ) )
S_StopSound ( 187 , pact ) ;
S_PlayActorSound ( 214 , pact ) ;
2020-05-17 21:44:53 +00:00
}
2020-10-25 06:42:29 +00:00
else if ( p - > MotoSpeed > = 50 & & ! S_CheckActorSoundPlaying ( pact , 188 ) )
2020-05-17 21:44:53 +00:00
{
2020-10-25 06:42:29 +00:00
S_PlayActorSound ( 188 , pact ) ;
2020-05-17 21:44:53 +00:00
}
2020-10-25 06:42:29 +00:00
else if ( ! S_CheckActorSoundPlaying ( pact , 188 ) & & ! S_CheckActorSoundPlaying ( pact , 214 ) )
2020-05-17 21:44:53 +00:00
{
2020-10-25 06:42:29 +00:00
S_PlayActorSound ( 188 , pact ) ;
2020-05-17 21:44:53 +00:00
}
}
}
else
{
2020-10-25 06:42:29 +00:00
if ( S_CheckActorSoundPlaying ( pact , 214 ) )
2020-05-17 21:44:53 +00:00
{
2020-10-25 06:42:29 +00:00
S_StopSound ( 214 , pact ) ;
if ( ! S_CheckActorSoundPlaying ( pact , 189 ) )
S_PlayActorSound ( 189 , pact ) ;
2020-05-17 21:44:53 +00:00
}
2020-10-25 06:42:29 +00:00
if ( S_CheckActorSoundPlaying ( pact , 188 ) )
2020-05-17 21:44:53 +00:00
{
2020-10-25 06:42:29 +00:00
S_StopSound ( 188 , pact ) ;
if ( ! S_CheckActorSoundPlaying ( pact , 189 ) )
S_PlayActorSound ( 189 , pact ) ;
2020-05-17 21:44:53 +00:00
}
2020-10-25 06:42:29 +00:00
if ( ! S_CheckActorSoundPlaying ( pact , 189 ) & & ! S_CheckActorSoundPlaying ( pact , 187 ) )
S_PlayActorSound ( 187 , pact ) ;
2020-05-17 21:44:53 +00:00
}
2020-11-05 08:32:14 +00:00
2020-05-17 21:44:53 +00:00
if ( p - > drink_amt > 88 & & p - > moto_drink = = 0 )
{
2020-11-04 21:22:01 +00:00
rng = krand ( ) & 63 ;
if ( rng = = 1 )
2020-05-17 21:44:53 +00:00
p - > moto_drink = - 10 ;
2020-11-04 21:22:01 +00:00
else if ( rng = = 2 )
2020-05-17 21:44:53 +00:00
p - > moto_drink = 10 ;
}
else if ( p - > drink_amt > 99 & & p - > moto_drink = = 0 )
{
2020-11-04 21:22:01 +00:00
rng = krand ( ) & 31 ;
if ( rng = = 1 )
2020-05-17 21:44:53 +00:00
p - > moto_drink = - 20 ;
2020-11-04 21:22:01 +00:00
else if ( rng = = 2 )
2020-05-17 21:44:53 +00:00
p - > moto_drink = 20 ;
}
2020-11-05 08:32:14 +00:00
2020-05-17 21:44:53 +00:00
if ( p - > on_ground = = 1 )
{
2021-01-03 08:25:49 +00:00
if ( p - > vehBraking & & p - > MotoSpeed > 0 )
2020-05-17 21:44:53 +00:00
{
2020-11-05 08:32:14 +00:00
p - > MotoSpeed - = p - > moto_on_oil ? 2 : 4 ;
2020-05-17 21:44:53 +00:00
if ( p - > MotoSpeed < 0 )
p - > MotoSpeed = 0 ;
p - > VBumpTarget = - 30 ;
p - > moto_do_bump = 1 ;
}
2021-01-03 08:25:49 +00:00
else if ( p - > vehForwardScale ! = 0 & & ! p - > vehBraking )
2020-05-17 21:44:53 +00:00
{
if ( p - > MotoSpeed < 40 )
{
p - > VBumpTarget = 70 ;
p - > moto_bump_fast = 1 ;
}
2020-11-05 08:32:14 +00:00
2020-11-04 23:07:39 +00:00
p - > MotoSpeed + = 2 * p - > vehForwardScale ;
p - > vehForwardScale = 0 ;
2020-11-05 08:32:14 +00:00
2020-05-17 21:44:53 +00:00
if ( p - > MotoSpeed > 120 )
p - > MotoSpeed = 120 ;
2020-11-05 08:32:14 +00:00
if ( ! p - > NotOnWater & & p - > MotoSpeed > 80 )
p - > MotoSpeed = 80 ;
2020-05-17 21:44:53 +00:00
}
else if ( p - > MotoSpeed > 0 )
p - > MotoSpeed - - ;
2020-11-05 08:32:14 +00:00
2021-01-03 08:25:49 +00:00
if ( p - > moto_do_bump & & ( ! p - > vehBraking | | p - > MotoSpeed = = 0 ) )
2020-05-17 21:44:53 +00:00
{
p - > VBumpTarget = 0 ;
p - > moto_do_bump = 0 ;
}
2020-11-05 08:32:14 +00:00
2021-01-03 08:25:49 +00:00
if ( p - > vehReverseScale ! = 0 & & p - > MotoSpeed < = 0 & & ! p - > vehBraking )
2020-05-17 21:44:53 +00:00
{
2020-11-05 08:32:14 +00:00
bool temp = p - > vehTurnRight ;
2020-11-04 23:19:15 +00:00
p - > vehTurnRight = p - > vehTurnLeft ;
p - > vehTurnLeft = temp ;
2020-11-05 08:32:14 +00:00
p - > MotoSpeed = - 15 * p - > vehReverseScale ;
p - > vehReverseScale = 0 ;
2020-05-17 21:44:53 +00:00
}
}
if ( p - > MotoSpeed ! = 0 & & p - > on_ground = = 1 )
{
2020-11-05 08:32:14 +00:00
if ( ! p - > VBumpNow & & ( krand ( ) & 3 ) = = 2 )
2021-12-06 11:27:02 +00:00
p - > VBumpTarget = p - > MotoSpeed * ( 1. / 16. ) * ( ( krand ( ) & 7 ) - 4 ) ;
2020-11-05 08:32:14 +00:00
2020-11-04 23:19:15 +00:00
if ( p - > vehTurnLeft | | p - > moto_drink < 0 )
2020-05-17 21:44:53 +00:00
{
if ( p - > moto_drink < 0 )
p - > moto_drink + + ;
}
2020-11-04 23:19:15 +00:00
else if ( p - > vehTurnRight | | p - > moto_drink > 0 )
2020-05-17 21:44:53 +00:00
{
if ( p - > moto_drink > 0 )
p - > moto_drink - - ;
}
}
2020-09-22 12:50:27 +00:00
2020-10-15 09:33:28 +00:00
double horiz = FRACUNIT ;
2020-05-17 21:44:53 +00:00
if ( p - > TurbCount )
{
if ( p - > TurbCount < = 1 )
{
2020-10-14 23:20:52 +00:00
horiz = 0 ;
2020-05-17 21:44:53 +00:00
p - > TurbCount = 0 ;
p - > VBumpTarget = 0 ;
p - > VBumpNow = 0 ;
}
else
{
2020-10-14 23:20:52 +00:00
horiz = ( ( krand ( ) & 15 ) - 7 ) ;
2020-05-17 21:44:53 +00:00
p - > TurbCount - - ;
p - > moto_drink = ( krand ( ) & 3 ) - 2 ;
}
}
else if ( p - > VBumpTarget > p - > VBumpNow )
{
2020-11-05 08:32:14 +00:00
p - > VBumpNow + = p - > moto_bump_fast ? 6 : 1 ;
2020-05-17 21:44:53 +00:00
if ( p - > VBumpTarget < p - > VBumpNow )
p - > VBumpNow = p - > VBumpTarget ;
2021-12-06 11:27:02 +00:00
horiz = p - > VBumpNow * ( 1. / 3. ) ;
2020-05-17 21:44:53 +00:00
}
else if ( p - > VBumpTarget < p - > VBumpNow )
{
2020-11-05 08:32:14 +00:00
p - > VBumpNow - = p - > moto_bump_fast ? 6 : 1 ;
2020-05-17 21:44:53 +00:00
if ( p - > VBumpTarget > p - > VBumpNow )
p - > VBumpNow = p - > VBumpTarget ;
2021-12-06 11:27:02 +00:00
horiz = p - > VBumpNow * ( 1. / 3. ) ;
2020-05-17 21:44:53 +00:00
}
else
{
p - > VBumpTarget = 0 ;
p - > moto_bump_fast = 0 ;
}
2020-10-15 09:33:28 +00:00
if ( horiz ! = FRACUNIT )
2020-09-22 12:50:27 +00:00
{
2022-05-30 10:35:41 +00:00
p - > horizon . addadjustment ( buildfhoriz ( horiz ) - p - > horizon . horiz ) ;
2020-09-22 12:50:27 +00:00
}
2021-05-12 15:33:33 +00:00
int currSpeed = int ( p - > MotoSpeed ) ;
2021-11-07 13:36:39 +00:00
int velAdjustment ;
2020-11-04 23:19:15 +00:00
if ( p - > MotoSpeed > = 20 & & p - > on_ground = = 1 & & ( p - > vehTurnLeft | | p - > vehTurnRight ) )
2020-05-17 21:44:53 +00:00
{
2020-11-05 08:32:14 +00:00
velAdjustment = p - > vehTurnLeft ? - 10 : 10 ;
2021-04-11 08:34:07 +00:00
auto angAdjustment = ( velAdjustment < 0 ? 350 : - 350 ) < < BAMBITS ;
2020-11-04 21:22:01 +00:00
2020-05-17 21:44:53 +00:00
if ( p - > moto_on_mud | | p - > moto_on_oil | | ! p - > NotOnWater )
{
2020-11-06 04:59:24 +00:00
currSpeed < < = p - > moto_on_oil ? 3 : 2 ;
2020-11-05 08:32:14 +00:00
2020-05-17 21:44:53 +00:00
if ( p - > moto_do_bump )
{
2020-11-06 04:59:24 +00:00
currSpeed > > = 5 ;
2020-11-04 21:22:01 +00:00
angAdjustment > > = 2 ;
2020-05-17 21:44:53 +00:00
}
else
{
2020-11-06 04:59:24 +00:00
currSpeed > > = 7 ;
2020-11-04 21:22:01 +00:00
angAdjustment > > = 6 ;
2020-05-17 21:44:53 +00:00
}
2020-11-05 08:32:14 +00:00
2020-05-17 21:44:53 +00:00
p - > moto_on_mud = 0 ;
p - > moto_on_oil = 0 ;
}
else
{
if ( p - > moto_do_bump )
{
2020-11-06 04:59:24 +00:00
currSpeed > > = 5 ;
2020-11-04 21:22:01 +00:00
angAdjustment > > = 4 ;
2020-10-25 06:42:29 +00:00
if ( ! S_CheckActorSoundPlaying ( pact , 220 ) )
S_PlayActorSound ( 220 , pact ) ;
2020-05-17 21:44:53 +00:00
}
else
{
2020-11-06 04:59:24 +00:00
currSpeed > > = 7 ;
2020-11-04 21:22:01 +00:00
angAdjustment > > = 7 ;
2020-05-17 21:44:53 +00:00
}
}
2020-11-05 08:32:14 +00:00
2022-08-27 13:09:22 +00:00
p - > vel . X + = currSpeed * bcos ( velAdjustment * - 51 + p - > angle . ang . Buildang ( ) , 4 ) ;
p - > vel . Y + = currSpeed * bsin ( velAdjustment * - 51 + p - > angle . ang . Buildang ( ) , 4 ) ;
p - > angle . addadjustment ( deltaangle ( p - > angle . ang , p - > angle . ang - DAngle : : fromBam ( angAdjustment ) ) ) ;
2020-05-17 21:44:53 +00:00
}
else if ( p - > MotoSpeed > = 20 & & p - > on_ground = = 1 & & ( p - > moto_on_mud | | p - > moto_on_oil ) )
{
2020-11-04 21:22:01 +00:00
rng = krand ( ) & 1 ;
2020-11-05 08:32:14 +00:00
velAdjustment = rng = = 0 ? - 10 : 10 ;
2021-01-04 11:36:54 +00:00
currSpeed = MulScale ( currSpeed , p - > moto_on_oil ? 10 : 5 , 7 ) ;
2022-08-27 13:09:22 +00:00
p - > vel . X + = currSpeed * bcos ( velAdjustment * - 51 + p - > angle . ang . Buildang ( ) , 4 ) ;
p - > vel . Y + = currSpeed * bsin ( velAdjustment * - 51 + p - > angle . ang . Buildang ( ) , 4 ) ;
2020-05-17 21:44:53 +00:00
}
2020-11-05 08:32:14 +00:00
2021-01-03 08:25:49 +00:00
p - > moto_on_mud = p - > moto_on_oil = 0 ;
p - > vehTurnLeft = p - > vehTurnRight = p - > vehBraking = false ;
2020-05-17 21:44:53 +00:00
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2020-08-29 11:32:14 +00:00
static void onBoat ( int snum , ESyncBits & actions )
2020-05-17 21:44:53 +00:00
{
auto p = & ps [ snum ] ;
2020-10-25 06:42:29 +00:00
auto pact = p - > GetActor ( ) ;
2020-05-17 21:44:53 +00:00
2021-01-03 08:25:49 +00:00
bool heeltoe ;
2021-11-07 13:36:39 +00:00
int rng ;
2020-11-05 08:32:14 +00:00
2020-05-17 21:44:53 +00:00
if ( p - > NotOnWater )
{
if ( p - > MotoSpeed > 0 )
{
2020-10-25 06:42:29 +00:00
if ( ! S_CheckActorSoundPlaying ( pact , 88 ) )
S_PlayActorSound ( 88 , pact ) ;
2020-05-17 21:44:53 +00:00
}
else
{
2020-10-25 06:42:29 +00:00
if ( ! S_CheckActorSoundPlaying ( pact , 87 ) )
S_PlayActorSound ( 87 , pact ) ;
2020-05-17 21:44:53 +00:00
}
}
2020-11-05 08:32:14 +00:00
2020-05-17 21:44:53 +00:00
if ( p - > MotoSpeed < 0 )
p - > MotoSpeed = 0 ;
2020-11-05 08:32:14 +00:00
2021-01-03 08:25:49 +00:00
if ( p - > vehBraking & & ( p - > vehForwardScale ! = 0 ) )
2020-05-17 21:44:53 +00:00
{
2020-11-04 23:15:55 +00:00
heeltoe = true ;
2021-01-03 08:25:49 +00:00
p - > vehBraking = false ;
2020-11-04 23:07:39 +00:00
p - > vehForwardScale = 0 ;
2020-05-17 21:44:53 +00:00
}
else
2020-11-04 23:15:55 +00:00
heeltoe = false ;
2020-11-05 08:32:14 +00:00
2020-11-04 23:07:39 +00:00
if ( p - > vehForwardScale ! = 0 )
2020-05-17 21:44:53 +00:00
{
2020-10-25 06:42:29 +00:00
if ( p - > MotoSpeed = = 0 & & ! S_CheckActorSoundPlaying ( pact , 89 ) )
2020-05-17 21:44:53 +00:00
{
2020-10-25 06:42:29 +00:00
if ( S_CheckActorSoundPlaying ( pact , 87 ) )
S_StopSound ( 87 , pact ) ;
S_PlayActorSound ( 89 , pact ) ;
2020-05-17 21:44:53 +00:00
}
2020-10-25 06:42:29 +00:00
else if ( p - > MotoSpeed > = 50 & & ! S_CheckActorSoundPlaying ( pact , 88 ) )
S_PlayActorSound ( 88 , pact ) ;
else if ( ! S_CheckActorSoundPlaying ( pact , 88 ) & & ! S_CheckActorSoundPlaying ( pact , 89 ) )
S_PlayActorSound ( 88 , pact ) ;
2020-05-17 21:44:53 +00:00
}
else
{
2020-10-25 06:42:29 +00:00
if ( S_CheckActorSoundPlaying ( pact , 89 ) )
2020-05-17 21:44:53 +00:00
{
2020-10-25 06:42:29 +00:00
S_StopSound ( 89 , pact ) ;
if ( ! S_CheckActorSoundPlaying ( pact , 90 ) )
S_PlayActorSound ( 90 , pact ) ;
2020-05-17 21:44:53 +00:00
}
2020-10-25 06:42:29 +00:00
if ( S_CheckActorSoundPlaying ( pact , 88 ) )
2020-05-17 21:44:53 +00:00
{
2020-10-25 06:42:29 +00:00
S_StopSound ( 88 , pact ) ;
if ( ! S_CheckActorSoundPlaying ( pact , 90 ) )
S_PlayActorSound ( 90 , pact ) ;
2020-05-17 21:44:53 +00:00
}
2020-10-25 06:42:29 +00:00
if ( ! S_CheckActorSoundPlaying ( pact , 90 ) & & ! S_CheckActorSoundPlaying ( pact , 87 ) )
S_PlayActorSound ( 87 , pact ) ;
2020-05-17 21:44:53 +00:00
}
2020-11-05 08:32:14 +00:00
if ( p - > vehTurnLeft & & ! S_CheckActorSoundPlaying ( pact , 91 ) & & p - > MotoSpeed > 30 & & ! p - > NotOnWater )
S_PlayActorSound ( 91 , pact ) ;
if ( p - > vehTurnRight & & ! S_CheckActorSoundPlaying ( pact , 91 ) & & p - > MotoSpeed > 30 & & ! p - > NotOnWater )
S_PlayActorSound ( 91 , pact ) ;
2020-05-17 21:44:53 +00:00
if ( ! p - > NotOnWater )
{
if ( p - > drink_amt > 88 & & p - > moto_drink = = 0 )
{
2020-11-04 21:22:01 +00:00
rng = krand ( ) & 63 ;
if ( rng = = 1 )
2020-05-17 21:44:53 +00:00
p - > moto_drink = - 10 ;
2020-11-04 21:22:01 +00:00
else if ( rng = = 2 )
2020-05-17 21:44:53 +00:00
p - > moto_drink = 10 ;
}
else if ( p - > drink_amt > 99 & & p - > moto_drink = = 0 )
{
2020-11-04 21:22:01 +00:00
rng = krand ( ) & 31 ;
if ( rng = = 1 )
2020-05-17 21:44:53 +00:00
p - > moto_drink = - 20 ;
2020-11-04 21:22:01 +00:00
else if ( rng = = 2 )
2020-05-17 21:44:53 +00:00
p - > moto_drink = 20 ;
}
}
2020-11-05 08:32:14 +00:00
2020-05-17 21:44:53 +00:00
if ( p - > on_ground = = 1 )
{
2020-11-04 21:22:01 +00:00
if ( heeltoe )
2020-05-17 21:44:53 +00:00
{
if ( p - > MotoSpeed < = 25 )
{
p - > MotoSpeed + + ;
2020-10-25 06:42:29 +00:00
if ( ! S_CheckActorSoundPlaying ( pact , 182 ) )
S_PlayActorSound ( 182 , pact ) ;
2020-05-17 21:44:53 +00:00
}
else
{
p - > MotoSpeed - = 2 ;
if ( p - > MotoSpeed < 0 )
p - > MotoSpeed = 0 ;
p - > VBumpTarget = 30 ;
p - > moto_do_bump = 1 ;
}
}
2021-01-03 08:25:49 +00:00
else if ( p - > vehBraking & & p - > MotoSpeed > 0 )
2020-05-17 21:44:53 +00:00
{
p - > MotoSpeed - = 2 ;
if ( p - > MotoSpeed < 0 )
p - > MotoSpeed = 0 ;
p - > VBumpTarget = 30 ;
p - > moto_do_bump = 1 ;
}
2020-11-04 23:07:39 +00:00
else if ( p - > vehForwardScale ! = 0 )
2020-05-17 21:44:53 +00:00
{
2020-11-05 08:32:14 +00:00
if ( p - > MotoSpeed < 40 & & ! p - > NotOnWater )
{
p - > VBumpTarget = - 30 ;
p - > moto_bump_fast = 1 ;
}
2020-11-04 23:07:39 +00:00
p - > MotoSpeed + = 1 * p - > vehForwardScale ;
p - > vehForwardScale = 0 ;
2020-05-17 21:44:53 +00:00
if ( p - > MotoSpeed > 120 )
p - > MotoSpeed = 120 ;
}
else if ( p - > MotoSpeed > 0 )
p - > MotoSpeed - - ;
2020-11-05 08:32:14 +00:00
2021-01-03 08:25:49 +00:00
if ( p - > moto_do_bump & & ( ! p - > vehBraking | | p - > MotoSpeed = = 0 ) )
2020-05-17 21:44:53 +00:00
{
p - > VBumpTarget = 0 ;
p - > moto_do_bump = 0 ;
}
2020-11-05 08:32:14 +00:00
2021-01-03 08:25:49 +00:00
if ( p - > vehReverseScale ! = 0 & & p - > MotoSpeed = = 0 & & ! p - > vehBraking )
2020-05-17 21:44:53 +00:00
{
2020-11-05 08:32:14 +00:00
bool temp = p - > vehTurnRight ;
2020-11-04 23:19:15 +00:00
p - > vehTurnRight = p - > vehTurnLeft ;
p - > vehTurnLeft = temp ;
2020-11-05 08:32:14 +00:00
p - > MotoSpeed = - ( ! p - > NotOnWater ? 25 : 20 ) * p - > vehReverseScale ;
p - > vehReverseScale = 0 ;
2020-05-17 21:44:53 +00:00
}
}
if ( p - > MotoSpeed ! = 0 & & p - > on_ground = = 1 )
{
2020-11-05 08:32:14 +00:00
if ( ! p - > VBumpNow & & ( krand ( ) & 15 ) = = 14 )
2021-12-06 11:27:02 +00:00
p - > VBumpTarget = p - > MotoSpeed * ( 1. / 16. ) * ( ( krand ( ) & 3 ) - 2 ) ;
2020-11-05 08:32:14 +00:00
if ( p - > vehTurnLeft & & p - > moto_drink < 0 )
2020-05-17 21:44:53 +00:00
{
2020-11-05 08:32:14 +00:00
p - > moto_drink + + ;
2020-05-17 21:44:53 +00:00
}
2020-11-05 08:32:14 +00:00
else if ( p - > vehTurnRight & & p - > moto_drink > 0 )
2020-05-17 21:44:53 +00:00
{
2020-11-05 08:32:14 +00:00
p - > moto_drink - - ;
2020-05-17 21:44:53 +00:00
}
}
2020-09-22 12:50:27 +00:00
2020-10-15 09:33:28 +00:00
double horiz = FRACUNIT ;
2020-05-17 21:44:53 +00:00
if ( p - > TurbCount )
{
if ( p - > TurbCount < = 1 )
{
2020-10-14 23:20:52 +00:00
horiz = 0 ;
2020-05-17 21:44:53 +00:00
p - > TurbCount = 0 ;
p - > VBumpTarget = 0 ;
p - > VBumpNow = 0 ;
}
else
{
2020-10-14 23:20:52 +00:00
horiz = ( ( krand ( ) & 15 ) - 7 ) ;
2020-05-17 21:44:53 +00:00
p - > TurbCount - - ;
p - > moto_drink = ( krand ( ) & 3 ) - 2 ;
}
}
else if ( p - > VBumpTarget > p - > VBumpNow )
{
2020-11-05 08:32:14 +00:00
p - > VBumpNow + = p - > moto_bump_fast ? 6 : 1 ;
2020-05-17 21:44:53 +00:00
if ( p - > VBumpTarget < p - > VBumpNow )
p - > VBumpNow = p - > VBumpTarget ;
2021-12-06 11:27:02 +00:00
horiz = p - > VBumpNow * ( 1. / 3. ) ;
2020-05-17 21:44:53 +00:00
}
else if ( p - > VBumpTarget < p - > VBumpNow )
{
2020-11-05 08:32:14 +00:00
p - > VBumpNow - = p - > moto_bump_fast ? 6 : 1 ;
2020-05-17 21:44:53 +00:00
if ( p - > VBumpTarget > p - > VBumpNow )
p - > VBumpNow = p - > VBumpTarget ;
2021-12-06 11:27:02 +00:00
horiz = p - > VBumpNow * ( 1. / 3. ) ;
2020-05-17 21:44:53 +00:00
}
else
{
p - > VBumpTarget = 0 ;
p - > moto_bump_fast = 0 ;
}
2020-10-15 09:33:28 +00:00
if ( horiz ! = FRACUNIT )
2020-09-22 12:50:27 +00:00
{
2022-05-30 10:35:41 +00:00
p - > horizon . addadjustment ( buildfhoriz ( horiz ) - p - > horizon . horiz ) ;
2020-09-22 12:50:27 +00:00
}
2020-11-04 23:19:15 +00:00
if ( p - > MotoSpeed > 0 & & p - > on_ground = = 1 & & ( p - > vehTurnLeft | | p - > vehTurnRight ) )
2020-05-17 21:44:53 +00:00
{
2021-05-12 15:33:33 +00:00
int currSpeed = int ( p - > MotoSpeed * 4. ) ;
2021-11-07 13:36:39 +00:00
int velAdjustment = p - > vehTurnLeft ? - 10 : 10 ;
2021-04-11 08:34:07 +00:00
auto angAdjustment = ( velAdjustment < 0 ? 350 : - 350 ) < < BAMBITS ;
2020-11-04 21:22:01 +00:00
2020-05-17 21:44:53 +00:00
if ( p - > moto_do_bump )
{
2020-11-06 04:59:24 +00:00
currSpeed > > = 6 ;
2020-11-04 21:22:01 +00:00
angAdjustment > > = 5 ;
2020-05-17 21:44:53 +00:00
}
else
{
2020-11-06 04:59:24 +00:00
currSpeed > > = 7 ;
2020-11-04 21:22:01 +00:00
angAdjustment > > = 6 ;
2020-08-05 07:53:22 +00:00
}
2020-11-05 08:32:14 +00:00
2022-08-27 13:09:22 +00:00
p - > vel . X + = currSpeed * bcos ( velAdjustment * - 51 + p - > angle . ang . Buildang ( ) , 4 ) ;
p - > vel . Y + = currSpeed * bsin ( velAdjustment * - 51 + p - > angle . ang . Buildang ( ) , 4 ) ;
p - > angle . addadjustment ( deltaangle ( p - > angle . ang , p - > angle . ang - DAngle : : fromBam ( angAdjustment ) ) ) ;
2020-05-17 21:44:53 +00:00
}
2020-11-05 08:32:14 +00:00
if ( p - > NotOnWater & & p - > MotoSpeed > 50 )
p - > MotoSpeed - = ( p - > MotoSpeed / 2. ) ;
2020-05-17 21:44:53 +00:00
2021-01-03 08:25:49 +00:00
p - > vehTurnLeft = p - > vehTurnRight = p - > vehBraking = false ;
2020-05-17 21:44:53 +00:00
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2021-11-18 16:34:31 +00:00
static void movement ( int snum , ESyncBits actions , sectortype * psect , int fz , int cz , int shrunk , int truefdist , int psectlotag )
2020-05-17 21:44:53 +00:00
{
auto p = & ps [ snum ] ;
2020-10-25 06:21:33 +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 ;
int i = 40 ;
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 ;
2020-11-15 11:07:30 +00:00
p - > pyoff = bsin ( p - > pycount , - 6 ) ;
2020-05-17 21:44:53 +00:00
}
else i = 12 ;
2022-02-04 17:06:08 +00:00
if ( shrunk = = 0 & & truefdist < = gs . int_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 )
p - > dummyplayersprite = spawn ( pact , PLAYERONWATER ) ;
2020-05-17 21:44:53 +00:00
p - > footprintcount = 6 ;
2021-11-21 07:56:39 +00:00
if ( p - > cursector - > floorpicnum = = FLOORSLIME )
2020-05-17 21:44:53 +00:00
{
p - > footprintpal = 8 ;
p - > footprintshade = 0 ;
}
2021-11-21 07:56:39 +00:00
else if ( isRRRA ( ) & & ( p - > cursector - > floorpicnum = = RRTILE7756 | | p - > cursector - > floorpicnum = = RRTILE7888 ) )
2020-05-17 21:44:53 +00:00
{
p - > footprintpal = 0 ;
p - > footprintshade = 40 ;
}
else
{
p - > footprintpal = 0 ;
p - > footprintshade = 0 ;
}
}
}
}
else if ( ! p - > OnMotorcycle )
{
footprints ( snum ) ;
}
2022-02-04 17:11:44 +00:00
if ( p - > player_int_pos ( ) . Z < ( fz - ( i < < 8 ) ) ) //falling
2020-05-17 21:44:53 +00:00
{
2022-02-04 17:11:44 +00:00
if ( ( actions & ( SB_JUMP | SB_CROUCH ) ) = = 0 & & p - > on_ground & & ( psect - > floorstat & CSTAT_SECTOR_SLOPE ) & & p - > player_int_pos ( ) . Z > = ( fz - ( i < < 8 ) - ( 16 < < 8 ) ) )
2022-02-05 11:56:49 +00:00
p - > player_set_int_z ( fz - ( i < < 8 ) ) ;
2020-05-17 21:44:53 +00:00
else
{
p - > on_ground = 0 ;
2022-02-04 17:11:44 +00:00
if ( ( p - > OnMotorcycle | | p - > OnBoat ) & & fz - ( i < < 8 ) * 2 > p - > player_int_pos ( ) . Z )
2020-05-17 21:44:53 +00:00
{
if ( p - > MotoOnGround )
{
p - > VBumpTarget = 80 ;
p - > moto_bump_fast = 1 ;
2022-07-21 10:18:40 +00:00
p - > vel . Z - = int ( gs . gravity * p - > MotoSpeed * ( 1. / 16. ) ) ;
2020-05-17 21:44:53 +00:00
p - > MotoOnGround = 0 ;
2020-10-25 06:21:33 +00:00
if ( S_CheckActorSoundPlaying ( pact , 188 ) )
S_StopSound ( 188 , pact ) ;
S_PlayActorSound ( 189 , pact ) ;
2020-05-17 21:44:53 +00:00
}
else
{
2021-12-30 11:14:04 +00:00
p - > vel . Z + = gs . gravity - 80 + int ( 120 - p - > MotoSpeed ) ;
2020-10-25 06:21:33 +00:00
if ( ! S_CheckActorSoundPlaying ( pact , 189 ) & & ! S_CheckActorSoundPlaying ( pact , 190 ) )
S_PlayActorSound ( 190 , pact ) ;
2020-05-17 21:44:53 +00:00
}
}
else
2021-12-30 11:14:04 +00:00
p - > vel . Z + = ( gs . gravity + 80 ) ; // (TICSPERFRAME<<6);
2020-05-17 16:04:45 +00:00
2021-12-30 11:14:04 +00:00
if ( p - > vel . Z > = ( 4096 + 2048 ) ) p - > vel . Z = ( 4096 + 2048 ) ;
if ( p - > vel . Z > 2400 & & p - > falling_counter < 255 )
2020-05-17 21:44:53 +00:00
{
p - > falling_counter + + ;
2020-10-25 06:21:33 +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-02-04 17:11:44 +00:00
if ( ( p - > player_int_pos ( ) . Z + p - > vel . Z ) > = ( fz - ( i < < 8 ) ) ) // hit the ground
2020-08-07 20:20:29 +00:00
{
2020-10-25 06:21:33 +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 ( isRRRA ( ) ) p - > MotoOnGround = 1 ;
2021-11-21 07:56:39 +00:00
if ( p - > falling_counter > 62 | | ( isRRRA ( ) & & p - > falling_counter > 2 & & p - > insector ( ) & & p - > cursector - > lotag = = 802 ) )
2020-05-17 21:44:53 +00:00
quickkill ( p ) ;
else if ( p - > falling_counter > 9 )
{
int j = p - > falling_counter ;
2021-12-21 19:50:51 +00:00
pact - > spr . extra - = j - ( krand ( ) & 3 ) ;
if ( pact - > spr . extra < = 0 )
2020-05-17 21:44:53 +00:00
{
2020-10-25 06:21:33 +00:00
S_PlayActorSound ( SQUISHED , pact ) ;
2020-05-17 21:44:53 +00:00
}
else
{
2020-10-25 06:21:33 +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 ) ) ;
}
2021-12-30 11:14:04 +00:00
else if ( p - > vel . Z > 2048 )
2020-05-17 21:44:53 +00:00
{
if ( p - > OnMotorcycle )
{
2020-10-25 06:21:33 +00:00
if ( S_CheckActorSoundPlaying ( pact , 190 ) )
S_StopSound ( 190 , pact ) ;
S_PlayActorSound ( 191 , pact ) ;
2020-05-17 21:44:53 +00:00
p - > TurbCount = 12 ;
}
2020-10-25 06:21:33 +00:00
else S_PlayActorSound ( DUKE_LAND , pact ) ;
2020-05-17 21:44:53 +00:00
}
2021-12-30 11:14:04 +00:00
else if ( p - > vel . Z > 1024 & & p - > OnMotorcycle )
2020-05-17 21:44:53 +00:00
{
2020-10-25 06:21:33 +00:00
S_PlayActorSound ( DUKE_LAND , pact ) ;
2020-05-17 21:44:53 +00:00
p - > TurbCount = 12 ;
}
}
2020-08-07 20:20:29 +00:00
}
2020-05-17 21:44:53 +00:00
}
}
else
{
p - > falling_counter = 0 ;
2020-10-25 06:21:33 +00:00
S_StopSound ( - 1 , pact , CHAN_VOICE ) ;
2020-05-17 21:44:53 +00:00
2021-12-30 11:14:04 +00:00
if ( psectlotag ! = ST_1_ABOVE_WATER & & psectlotag ! = ST_2_UNDERWATER & & p - > on_ground = = 0 & & p - > vel . Z > ( 6144 > > 1 ) )
p - > hard_landing = p - > vel . Z > > 10 ;
2020-05-17 21:44:53 +00:00
p - > on_ground = 1 ;
if ( i = = 40 )
{
//Smooth on the ground
2022-02-04 17:11:44 +00:00
int k = ( ( fz - ( i < < 8 ) ) - p - > player_int_pos ( ) . Z ) > > 1 ;
2020-05-17 21:44:53 +00:00
if ( abs ( k ) < 256 ) k = 0 ;
2022-02-05 11:56:49 +00:00
p - > player_add_int_z ( k ) ;
2021-12-30 11:14:04 +00:00
p - > vel . Z - = 768 ;
if ( p - > vel . Z < 0 ) p - > vel . Z = 0 ;
2020-05-17 21:44:53 +00:00
}
else if ( p - > jumping_counter = = 0 )
{
2022-02-05 11:56:49 +00:00
p - > player_add_int_z ( ( ( fz - ( i < < 7 ) ) - p - > player_int_pos ( ) . Z ) > > 1 ) ; //Smooth on the water
2022-02-04 17:11:44 +00:00
if ( p - > on_warping_sector = = 0 & & p - > player_int_pos ( ) . Z > fz - ( 16 < < 8 ) )
2020-05-17 21:44:53 +00:00
{
2022-02-05 11:56:49 +00:00
p - > player_set_int_z ( fz - ( 16 < < 8 ) ) ;
2021-12-30 11:14:04 +00:00
p - > vel . Z > > = 1 ;
2020-05-17 21:44:53 +00:00
}
}
p - > on_warping_sector = 0 ;
2022-01-13 11:42:48 +00:00
if ( ( ( actions & SB_CROUCH ) | | crouch_toggle ) & & ! p - > OnMotorcycle ) // FIXME: The crouch_toggle check here is not network safe and needs revision when multiplayer is going.
2020-05-17 21:44:53 +00:00
{
playerCrouch ( snum ) ;
}
2020-08-28 20:51:05 +00:00
if ( ( actions & SB_JUMP ) = = 0 & & ! p - > OnMotorcycle & & 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 ) & & ! p - > OnMotorcycle & & p - > jumping_toggle = = 0 )
2020-05-17 21:44:53 +00:00
{
playerJump ( snum , fz , cz ) ;
}
}
if ( p - > jumping_counter )
{
2020-08-28 20:51:05 +00:00
if ( ( actions & SB_JUMP ) = = 0 & & ! p - > OnMotorcycle & & p - > jumping_toggle = = 1 )
2020-05-17 21:44:53 +00:00
p - > jumping_toggle = 0 ;
if ( p - > jumping_counter < 768 )
{
2020-08-07 19:59:11 +00:00
if ( psectlotag = = ST_1_ABOVE_WATER & & p - > jumping_counter > 768 )
2020-05-17 21:44:53 +00:00
{
p - > jumping_counter = 0 ;
2021-12-30 11:14:04 +00:00
p - > vel . Z = - 512 ;
2020-05-17 21:44:53 +00:00
}
else
{
2021-12-30 11:14:04 +00:00
p - > vel . Z - = bsin ( 2048 - 128 + p - > jumping_counter ) / 12 ;
2020-05-17 21:44:53 +00:00
p - > jumping_counter + = 180 ;
p - > on_ground = 0 ;
}
}
else
{
p - > jumping_counter = 0 ;
2021-12-30 11:14:04 +00:00
p - > vel . Z = 0 ;
2020-05-17 21:44:53 +00:00
}
}
2022-02-05 11:56:49 +00:00
p - > player_add_int_z ( p - > vel . Z ) ;
2020-05-17 21:44:53 +00:00
2022-02-04 17:11:44 +00:00
if ( p - > player_int_pos ( ) . Z < ( cz + ( 4 < < 8 ) ) )
2020-05-17 21:44:53 +00:00
{
p - > jumping_counter = 0 ;
2021-12-30 11:14:04 +00:00
if ( p - > vel . Z < 0 )
2021-12-30 11:18:56 +00:00
p - > vel . X = p - > vel . Y = 0 ;
2021-12-30 11:14:04 +00:00
p - > vel . Z = 128 ;
2022-02-05 11:56:49 +00:00
p - > player_set_int_z ( cz + ( 4 < < 8 ) ) ;
2020-05-17 21:44:53 +00:00
}
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2021-11-18 16:34:31 +00:00
static void underwater ( int snum , ESyncBits actions , int fz , int cz )
2020-05-17 21:44:53 +00:00
{
auto p = & ps [ snum ] ;
2020-10-25 06:42:29 +00:00
auto pact = p - > GetActor ( ) ;
2020-05-17 21:44:53 +00:00
p - > jumping_counter = 0 ;
p - > pycount + = 32 ;
p - > pycount & = 2047 ;
2020-11-15 11:07:30 +00:00
p - > pyoff = bsin ( p - > pycount , - 7 ) ;
2020-05-17 21:44:53 +00:00
2020-10-25 06:42:29 +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 ) & & ! p - > OnMotorcycle )
2020-05-17 21:44:53 +00:00
{
2021-12-30 11:14:04 +00:00
if ( p - > vel . Z > 0 ) p - > vel . Z = 0 ;
p - > vel . Z - = 348 ;
if ( p - > vel . Z < - ( 256 * 6 ) ) p - > vel . Z = - ( 256 * 6 ) ;
2020-05-17 21:44:53 +00:00
}
2021-01-24 07:59:08 +00:00
else if ( ( actions & SB_CROUCH ) | | p - > OnMotorcycle )
2020-05-17 21:44:53 +00:00
{
2021-12-30 11:14:04 +00:00
if ( p - > vel . Z < 0 ) p - > vel . Z = 0 ;
p - > vel . Z + = 348 ;
if ( p - > vel . Z > ( 256 * 6 ) ) p - > vel . Z = ( 256 * 6 ) ;
2020-05-17 21:44:53 +00:00
}
else
{
2021-12-30 11:14:04 +00:00
if ( p - > vel . Z < 0 )
2020-05-17 21:44:53 +00:00
{
2021-12-30 11:14:04 +00:00
p - > vel . Z + = 256 ;
if ( p - > vel . Z > 0 )
p - > vel . Z = 0 ;
2020-05-17 21:44:53 +00:00
}
2021-12-30 11:14:04 +00:00
if ( p - > vel . Z > 0 )
2020-05-17 21:44:53 +00:00
{
2021-12-30 11:14:04 +00:00
p - > vel . Z - = 256 ;
if ( p - > vel . Z < 0 )
p - > vel . Z = 0 ;
2020-05-17 21:44:53 +00:00
}
}
2021-12-30 11:14:04 +00:00
if ( p - > vel . Z > 2048 )
p - > vel . Z > > = 1 ;
2020-05-17 21:44:53 +00:00
2022-02-05 11:56:49 +00:00
p - > player_add_int_z ( p - > vel . Z ) ;
2020-05-17 21:44:53 +00:00
2022-02-04 17:11:44 +00:00
if ( p - > player_int_pos ( ) . Z > ( fz - ( 15 < < 8 ) ) )
2022-02-05 11:56:49 +00:00
p - > player_add_int_z ( ( ( fz - ( 15 < < 8 ) ) - p - > player_int_pos ( ) . Z ) > > 1 ) ;
2020-05-17 21:44:53 +00:00
2022-02-04 17:11:44 +00:00
if ( p - > player_int_pos ( ) . Z < ( cz + ( 4 < < 8 ) ) )
2020-05-17 21:44:53 +00:00
{
2022-02-05 11:56:49 +00:00
p - > player_set_int_z ( cz + ( 4 < < 8 ) ) ;
2021-12-30 11:14:04 +00:00
p - > vel . Z = 0 ;
2020-05-17 21:44:53 +00:00
}
if ( p - > scuba_on & & ( krand ( ) & 255 ) < 8 )
{
2020-10-25 06:42:29 +00:00
auto j = spawn ( pact , WATERBUBBLE ) ;
2021-11-19 11:32:12 +00:00
if ( j )
{
2022-08-27 13:09:22 +00:00
j - > add_int_pos ( { bcos ( p - > angle . ang . Buildang ( ) + 64 - ( global_random & 128 ) + 128 , - 6 ) , bsin ( p - > angle . ang . Buildang ( ) + 64 - ( global_random & 128 ) + 128 , - 6 ) , 0 } ) ;
2021-12-21 17:19:45 +00:00
j - > spr . xrepeat = 3 ;
j - > spr . yrepeat = 2 ;
2022-02-04 17:11:44 +00:00
j - > set_int_z ( p - > player_int_pos ( ) . Z + ( 8 < < 8 ) ) ;
2021-12-21 17:19:45 +00:00
j - > spr . cstat = CSTAT_SPRITE_TRANS_FLIP | CSTAT_SPRITE_TRANSLUCENT ;
2021-11-19 11:32:12 +00:00
}
2020-05-17 21:44:53 +00:00
}
2020-05-17 22:10:42 +00:00
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2021-11-18 16:34:31 +00:00
void onMotorcycleMove ( int snum , walltype * wal )
2020-05-17 22:10:42 +00:00
{
auto p = & ps [ snum ] ;
2020-10-25 06:42:29 +00:00
auto pact = p - > GetActor ( ) ;
2022-08-27 13:09:22 +00:00
int angleDelta = abs ( p - > angle . ang . Buildang ( ) - getangle ( wal - > delta ( ) ) ) ;
2022-07-21 10:18:40 +00:00
double damageAmount = p - > MotoSpeed * p - > MotoSpeed ;
2020-11-05 08:32:14 +00:00
2022-08-27 13:43:23 +00:00
p - > angle . addadjustment ( DAngle : : fromBuildf ( p - > MotoSpeed / ( krand ( ) & 1 ? - 2 : 2 ) ) ) ;
2020-05-17 22:10:42 +00:00
2020-11-04 21:22:01 +00:00
if ( angleDelta > = 441 & & angleDelta < = 581 )
2020-05-17 22:10:42 +00:00
{
2022-07-21 10:18:40 +00:00
damageAmount * = ( 1. / 256. ) ;
2020-05-17 22:10:42 +00:00
p - > MotoSpeed = 0 ;
2020-10-25 06:42:29 +00:00
if ( S_CheckActorSoundPlaying ( pact , 238 ) = = 0 )
S_PlayActorSound ( 238 , pact ) ;
2020-05-17 22:10:42 +00:00
}
2020-11-04 21:22:01 +00:00
else if ( angleDelta > = 311 & & angleDelta < = 711 )
2020-05-17 22:10:42 +00:00
{
2022-07-21 10:18:40 +00:00
damageAmount * = ( 1. / 2048. ) ;
2020-11-04 22:17:18 +00:00
p - > MotoSpeed - = ( p - > MotoSpeed / 2. ) + ( p - > MotoSpeed / 4. ) ;
2020-10-25 06:42:29 +00:00
if ( S_CheckActorSoundPlaying ( pact , 238 ) = = 0 )
S_PlayActorSound ( 238 , pact ) ;
2020-05-17 22:10:42 +00:00
}
2020-11-04 21:22:01 +00:00
else if ( angleDelta > = 111 & & angleDelta < = 911 )
2020-05-17 22:10:42 +00:00
{
2022-07-21 10:18:40 +00:00
damageAmount * = ( 1. / 16384. ) ;
2020-11-04 22:17:18 +00:00
p - > MotoSpeed - = p - > MotoSpeed / 2. ;
2020-10-25 06:42:29 +00:00
if ( S_CheckActorSoundPlaying ( pact , 239 ) = = 0 )
S_PlayActorSound ( 239 , pact ) ;
2020-05-17 22:10:42 +00:00
}
else
{
2022-07-21 10:18:40 +00:00
damageAmount * = ( 1. / 32768. ) ;
2020-11-04 22:17:18 +00:00
p - > MotoSpeed - = p - > MotoSpeed / 8. ;
2020-10-25 06:42:29 +00:00
if ( S_CheckActorSoundPlaying ( pact , 240 ) = = 0 )
S_PlayActorSound ( 240 , pact ) ;
2020-05-17 22:10:42 +00:00
}
2022-07-21 10:18:40 +00:00
pact - > spr . extra - = int ( damageAmount ) ;
2021-12-21 19:50:51 +00:00
if ( pact - > spr . extra < = 0 )
2020-05-17 22:10:42 +00:00
{
2020-10-25 06:42:29 +00:00
S_PlayActorSound ( SQUISHED , pact ) ;
2020-05-17 22:10:42 +00:00
SetPlayerPal ( p , PalEntry ( 63 , 63 , 0 , 0 ) ) ;
}
2020-11-04 21:22:01 +00:00
else if ( damageAmount )
2020-10-25 06:42:29 +00:00
S_PlayActorSound ( DUKE_LAND_HURT , pact ) ;
2020-05-17 22:10:42 +00:00
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2021-11-18 16:34:31 +00:00
void onBoatMove ( int snum , int psectlotag , walltype * wal )
2020-05-17 22:10:42 +00:00
{
auto p = & ps [ snum ] ;
2020-10-25 06:42:29 +00:00
auto pact = p - > GetActor ( ) ;
2021-11-17 21:48:48 +00:00
auto delta = wal - > delta ( ) ;
2022-08-27 13:09:22 +00:00
int angleDelta = abs ( p - > angle . ang . Buildang ( ) - getangle ( wal - > delta ( ) ) ) ;
2020-11-05 08:32:14 +00:00
2022-08-27 13:43:23 +00:00
p - > angle . addadjustment ( DAngle : : fromBuildf ( p - > MotoSpeed / ( krand ( ) & 1 ? - 4 : 4 ) ) ) ;
2020-05-17 22:10:42 +00:00
2020-11-04 21:22:01 +00:00
if ( angleDelta > = 441 & & angleDelta < = 581 )
2020-05-17 22:10:42 +00:00
{
2020-11-04 22:17:18 +00:00
p - > MotoSpeed = ( ( p - > MotoSpeed / 2. ) + ( p - > MotoSpeed / 4. ) ) / 4. ;
2020-11-05 08:32:14 +00:00
if ( psectlotag = = 1 & & S_CheckActorSoundPlaying ( pact , 178 ) = = 0 )
S_PlayActorSound ( 178 , pact ) ;
2020-05-17 22:10:42 +00:00
}
2020-11-04 21:22:01 +00:00
else if ( angleDelta > = 311 & & angleDelta < = 711 )
2020-05-17 22:10:42 +00:00
{
2020-11-04 22:17:18 +00:00
p - > MotoSpeed - = ( ( p - > MotoSpeed / 2. ) + ( p - > MotoSpeed / 4. ) ) / 8. ;
2020-11-05 08:32:14 +00:00
if ( psectlotag = = 1 & & S_CheckActorSoundPlaying ( pact , 179 ) = = 0 )
S_PlayActorSound ( 179 , pact ) ;
2020-05-17 22:10:42 +00:00
}
2020-11-04 21:22:01 +00:00
else if ( angleDelta > = 111 & & angleDelta < = 911 )
2020-05-17 22:10:42 +00:00
{
2020-11-04 22:17:18 +00:00
p - > MotoSpeed - = p - > MotoSpeed / 16. ;
2020-11-05 08:32:14 +00:00
if ( psectlotag = = 1 & & S_CheckActorSoundPlaying ( pact , 180 ) = = 0 )
S_PlayActorSound ( 180 , pact ) ;
2020-05-17 22:10:42 +00:00
}
else
{
2020-11-04 22:17:18 +00:00
p - > MotoSpeed - = p - > MotoSpeed / 64. ;
2020-11-05 08:32:14 +00:00
if ( psectlotag = = 1 & & S_CheckActorSoundPlaying ( pact , 181 ) = = 0 )
S_PlayActorSound ( 181 , pact ) ;
2020-05-17 22:10:42 +00:00
}
}
2020-05-17 21:44:53 +00:00
2020-05-17 22:10:42 +00:00
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2020-10-25 07:09:24 +00:00
void onMotorcycleHit ( int snum , DDukeActor * victim )
2020-05-17 22:10:42 +00:00
{
auto p = & ps [ snum ] ;
2021-12-21 19:50:51 +00:00
if ( badguy ( victim ) | | victim - > spr . picnum = = APLAYER )
2020-05-17 22:10:42 +00:00
{
2021-12-21 19:50:51 +00:00
if ( victim - > spr . picnum ! = APLAYER )
2020-05-17 22:10:42 +00:00
{
if ( numplayers = = 1 )
{
2020-10-25 07:09:24 +00:00
Collision coll ;
2022-08-27 13:09:22 +00:00
int ang = int ( p - > TiltStatus * 20 + p - > angle . ang . Buildang ( ) ) ;
2021-12-21 19:50:51 +00:00
movesprite_ex ( victim , bcos ( ang , - 8 ) , bsin ( ang , - 8 ) , victim - > spr . zvel , CLIPMASK0 , coll ) ;
2020-05-17 22:10:42 +00:00
}
}
else
2020-10-25 07:09:24 +00:00
victim - > SetHitOwner ( p - > GetActor ( ) ) ;
2021-12-27 22:52:16 +00:00
victim - > attackertype = MOTOHIT ;
2022-07-21 10:18:40 +00:00
victim - > hitextra = int ( p - > MotoSpeed * 0.5 ) ;
2020-11-04 22:17:18 +00:00
p - > MotoSpeed - = p - > MotoSpeed / 4. ;
2020-05-17 22:10:42 +00:00
p - > TurbCount = 6 ;
}
2021-12-21 19:50:51 +00:00
else if ( ( victim - > spr . picnum = = RRTILE2431 | | victim - > spr . picnum = = RRTILE2443 | | victim - > spr . picnum = = RRTILE2451 | | victim - > spr . picnum = = RRTILE2455 )
& & victim - > spr . picnum ! = ACTIVATORLOCKED & & p - > MotoSpeed > 45 )
2020-05-17 22:10:42 +00:00
{
2020-10-25 07:09:24 +00:00
S_PlayActorSound ( SQUISHED , victim ) ;
2021-12-21 19:50:51 +00:00
if ( victim - > spr . picnum = = RRTILE2431 | | victim - > spr . picnum = = RRTILE2451 )
2020-05-17 22:10:42 +00:00
{
2021-12-21 19:50:51 +00:00
if ( victim - > spr . lotag ! = 0 )
2020-05-17 22:10:42 +00:00
{
2020-10-25 07:12:25 +00:00
DukeSpriteIterator it ;
while ( auto act2 = it . Next ( ) )
2020-05-17 22:10:42 +00:00
{
2021-12-21 19:50:51 +00:00
if ( ( act2 - > spr . picnum = = RRTILE2431 | | act2 - > spr . picnum = = RRTILE2451 ) & & act2 - > spr . pal = = 4 )
2020-05-17 22:10:42 +00:00
{
2021-12-21 19:50:51 +00:00
if ( victim - > spr . lotag = = act2 - > spr . lotag )
2020-05-17 22:10:42 +00:00
{
2021-12-21 19:50:51 +00:00
act2 - > spr . xrepeat = 0 ;
act2 - > spr . yrepeat = 0 ;
2020-05-17 22:10:42 +00:00
}
}
}
}
2020-10-25 07:09:24 +00:00
fi . guts ( victim , RRTILE2460 , 12 , myconnectindex ) ;
fi . guts ( victim , RRTILE2465 , 3 , myconnectindex ) ;
2020-05-17 22:10:42 +00:00
}
else
2020-10-25 07:09:24 +00:00
fi . guts ( victim , RRTILE2465 , 3 , myconnectindex ) ;
fi . guts ( victim , RRTILE2465 , 3 , myconnectindex ) ;
2021-12-21 19:50:51 +00:00
victim - > spr . xrepeat = 0 ;
victim - > spr . yrepeat = 0 ;
2020-05-17 22:10:42 +00:00
}
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2020-10-25 07:09:24 +00:00
void onBoatHit ( int snum , DDukeActor * victim )
2020-05-17 22:10:42 +00:00
{
auto p = & ps [ snum ] ;
2020-10-12 21:06:08 +00:00
2021-12-21 19:50:51 +00:00
if ( badguy ( victim ) | | victim - > spr . picnum = = APLAYER )
2020-05-17 22:10:42 +00:00
{
2021-12-21 19:50:51 +00:00
if ( victim - > spr . picnum ! = APLAYER )
2020-05-17 22:10:42 +00:00
{
if ( numplayers = = 1 )
{
2020-10-25 07:09:24 +00:00
Collision coll ;
2022-08-27 13:09:22 +00:00
int ang = int ( p - > TiltStatus * 20 + p - > angle . ang . Buildang ( ) ) ;
2021-12-21 19:50:51 +00:00
movesprite_ex ( victim , bcos ( ang , - 9 ) , bsin ( ang , - 9 ) , victim - > spr . zvel , CLIPMASK0 , coll ) ;
2020-05-17 22:10:42 +00:00
}
}
else
2020-10-25 07:09:24 +00:00
victim - > SetHitOwner ( p - > GetActor ( ) ) ;
2021-12-27 22:52:16 +00:00
victim - > attackertype = MOTOHIT ;
2022-07-21 10:18:40 +00:00
victim - > hitextra = int ( p - > MotoSpeed * 0.25 ) ;
2020-11-04 22:17:18 +00:00
p - > MotoSpeed - = p - > MotoSpeed / 4. ;
2020-05-17 22:10:42 +00:00
p - > TurbCount = 6 ;
}
2020-05-17 21:44:53 +00:00
}
2020-05-18 06:26:09 +00:00
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2020-05-19 07:03:07 +00:00
static void fireweapon ( int snum )
2020-05-18 06:26:09 +00:00
{
auto p = & ps [ snum ] ;
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
{
2020-05-19 16:40:40 +00:00
if ( ! isRRRA ( ) & & p - > curr_weapon > = MOTORCYCLE_WEAPON ) return ;
2020-05-18 06:26:09 +00:00
switch ( p - > curr_weapon )
{
case DYNAMITE_WEAPON :
p - > hbomb_hold_delay = 0 ;
if ( p - > ammo_amount [ DYNAMITE_WEAPON ] > 0 )
2020-05-19 07:03:07 +00:00
p - > kickback_pic = 1 ;
2020-05-18 06:26:09 +00:00
break ;
2020-05-20 08:38:56 +00:00
case THROWINGDYNAMITE_WEAPON :
2020-05-18 06:26:09 +00:00
p - > hbomb_hold_delay = 0 ;
2020-05-19 07:03: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-19 07:03:07 +00:00
p - > kickback_pic = 1 ;
2020-05-18 06:26:09 +00:00
}
break ;
case RIFLEGUN_WEAPON :
if ( p - > ammo_amount [ RIFLEGUN_WEAPON ] > 0 ) // && p->random_club_frame == 0)
2020-05-19 07:03: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-19 07:03:07 +00:00
p - > kickback_pic = 1 ;
2020-05-18 06:26:09 +00:00
break ;
case BOWLING_WEAPON :
if ( p - > ammo_amount [ BOWLING_WEAPON ] > 0 )
2020-05-19 07:03:07 +00:00
p - > kickback_pic = 1 ;
2020-05-18 06:26:09 +00:00
break ;
case POWDERKEG_WEAPON :
if ( p - > ammo_amount [ POWDERKEG_WEAPON ] > 0 )
2020-05-19 07:03:07 +00:00
p - > kickback_pic = 1 ;
2020-05-18 06:26:09 +00:00
break ;
case BUZZSAW_WEAPON :
case THROWSAW_WEAPON :
if ( p - > curr_weapon = = BUZZSAW_WEAPON )
{
if ( p - > ammo_amount [ BUZZSAW_WEAPON ] > 0 )
{
2020-05-19 07:03:07 +00:00
p - > kickback_pic = 1 ;
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( 431 , p - > GetActor ( ) ) ;
2020-05-18 06:26:09 +00:00
}
}
else if ( p - > ammo_amount [ THROWSAW_WEAPON ] > 0 )
{
2020-05-19 07:03:07 +00:00
p - > kickback_pic = 1 ;
2020-11-02 19:24:07 +00:00
S_PlayActorSound ( SHRINKER_FIRE , p - > GetActor ( ) ) ;
2020-05-18 06:26:09 +00:00
}
break ;
case ALIENBLASTER_WEAPON :
if ( p - > ammo_amount [ ALIENBLASTER_WEAPON ] > 0 )
2020-05-19 07:03:07 +00:00
p - > kickback_pic = 1 ;
2020-05-18 06:26:09 +00:00
break ;
case TIT_WEAPON :
if ( p - > ammo_amount [ TIT_WEAPON ] > 0 )
{
2020-05-19 07:03:07 +00:00
p - > kickback_pic = 1 ;
2020-05-18 06:26:09 +00:00
p - > hbomb_hold_delay = ! p - > hbomb_hold_delay ;
}
break ;
case MOTORCYCLE_WEAPON :
if ( p - > ammo_amount [ MOTORCYCLE_WEAPON ] > 0 )
{
2020-05-19 07:03:07 +00:00
p - > kickback_pic = 1 ;
2020-05-18 06:26:09 +00:00
p - > hbomb_hold_delay = ! p - > hbomb_hold_delay ;
}
break ;
case BOAT_WEAPON :
if ( p - > ammo_amount [ BOAT_WEAPON ] > 0 )
2020-05-19 07:03:07 +00:00
p - > kickback_pic = 1 ;
2020-05-18 06:26:09 +00:00
break ;
case CROSSBOW_WEAPON :
if ( p - > ammo_amount [ CROSSBOW_WEAPON ] > 0 )
2020-05-19 07:03:07 +00:00
p - > kickback_pic = 1 ;
2020-05-18 06:26:09 +00:00
break ;
case CHICKEN_WEAPON :
if ( p - > ammo_amount [ CHICKEN_WEAPON ] > 0 )
2020-05-19 07:03:07 +00:00
p - > kickback_pic = 1 ;
2020-05-18 06:26:09 +00:00
break ;
case KNEE_WEAPON :
case SLINGBLADE_WEAPON :
if ( p - > curr_weapon = = SLINGBLADE_WEAPON )
{
if ( p - > ammo_amount [ SLINGBLADE_WEAPON ] > 0 )
if ( p - > quick_kick = = 0 )
2020-05-19 07:03:07 +00:00
p - > kickback_pic = 1 ;
2020-05-18 06:26:09 +00:00
}
else if ( ! isRRRA ( ) | | p - > ammo_amount [ KNEE_WEAPON ] > 0 )
if ( p - > quick_kick = = 0 )
2020-05-19 07:03:07 +00:00
p - > kickback_pic = 1 ;
2020-05-18 06:26:09 +00:00
break ;
}
}
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2021-11-18 19:17:47 +00:00
static void operateweapon ( int snum , ESyncBits actions , sectortype * psectp )
2020-05-18 06:26:09 +00:00
{
auto p = & ps [ snum ] ;
2020-10-24 05:34:39 +00:00
auto pact = p - > GetActor ( ) ;
int i , k ;
2021-12-07 10:42:21 +00:00
int psectlotag = psectp ? psectp - > lotag : 857 ;
2020-05-18 06:26:09 +00:00
2020-05-19 16:40:40 +00:00
if ( ! isRRRA ( ) & & p - > curr_weapon > = MOTORCYCLE_WEAPON ) return ;
2020-05-18 06:26:09 +00:00
switch ( p - > curr_weapon )
{
2020-05-18 20:28:12 +00:00
case DYNAMITE_WEAPON :
2020-05-18 06:26:09 +00:00
2020-05-19 07:03:07 +00:00
if ( p - > kickback_pic = = 1 )
2020-07-25 07:32:54 +00:00
S_PlaySound ( 401 ) ;
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-19 07:03:07 +00:00
p - > kickback_pic + + ;
if ( p - > kickback_pic > 19 )
2020-05-18 06:26:09 +00:00
{
2020-09-16 11:01:09 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-20 08:38:56 +00:00
p - > curr_weapon = THROWINGDYNAMITE_WEAPON ;
2020-05-18 06:26:09 +00:00
p - > last_weapon = - 1 ;
2020-09-16 11:01:09 +00:00
p - > oweapon_pos = p - > weapon_pos = 10 ;
2020-05-18 20:28:12 +00:00
p - > detonate_time = 45 ;
p - > detonate_count = 1 ;
2020-07-25 07:32:54 +00:00
S_PlaySound ( 402 ) ;
2020-05-18 06:26:09 +00:00
}
break ;
2020-05-20 08:38:56 +00:00
case THROWINGDYNAMITE_WEAPON :
2020-05-18 06:26:09 +00:00
2020-05-19 07:03:07 +00:00
p - > kickback_pic + + ;
2020-05-18 06:26:09 +00:00
2020-05-18 20:28:12 +00:00
if ( p - > detonate_time < 0 )
2020-05-18 06:26:09 +00:00
{
p - > hbomb_on = 0 ;
}
2020-05-19 07:03:07 +00:00
if ( p - > kickback_pic = = 39 )
2020-05-18 06:26:09 +00:00
{
p - > hbomb_on = 0 ;
2020-05-18 20:28:12 +00:00
p - > noise_radius = 8192 ;
2020-05-18 06:26:09 +00:00
madenoise ( snum ) ;
}
2020-05-19 07:03:07 +00:00
if ( p - > kickback_pic = = 12 )
2020-05-18 06:26:09 +00:00
{
2020-05-18 20:28:12 +00:00
p - > ammo_amount [ DYNAMITE_WEAPON ] - - ;
if ( p - > ammo_amount [ CROSSBOW_WEAPON ] )
p - > ammo_amount [ CROSSBOW_WEAPON ] - - ;
2020-08-28 20:51:05 +00:00
if ( p - > on_ground & & ( actions & SB_CROUCH ) & & ! p - > OnMotorcycle )
2020-05-18 06:26:09 +00:00
{
k = 15 ;
2021-01-04 11:36:54 +00:00
i = - MulScale ( p - > horizon . sum ( ) . asq16 ( ) , 20 , 16 ) ;
2020-05-18 06:26:09 +00:00
}
else
{
k = 140 ;
2021-05-20 17:06:11 +00:00
i = - 512 - MulScale ( p - > horizon . sum ( ) . asq16 ( ) , 20 , 16 ) ;
2020-05-18 06:26:09 +00:00
}
2021-11-21 07:56:39 +00:00
auto spawned = EGS ( p - > cursector ,
2022-08-27 13:09:51 +00:00
p - > player_int_pos ( ) . X + p - > angle . ang . Cos ( ) * ( 1 < < 8 ) ,
p - > player_int_pos ( ) . Y + p - > angle . ang . Sin ( ) * ( 1 < < 8 ) ,
2022-02-04 17:11:44 +00:00
p - > player_int_pos ( ) . Z , HEAVYHBOMB , - 16 , 9 , 9 ,
2022-08-27 13:09:22 +00:00
p - > angle . ang . Buildang ( ) , ( k + ( p - > hbomb_hold_delay < < 5 ) ) * 2 , i , pact , 1 ) ;
2020-05-18 06:26:09 +00:00
2021-11-19 08:47:17 +00:00
if ( spawned )
2020-05-18 06:26:09 +00:00
{
2021-11-19 08:47:17 +00:00
if ( k = = 15 )
{
2021-12-21 17:19:45 +00:00
spawned - > spr . yvel = 3 ;
2022-02-07 07:47:18 +00:00
spawned - > spr . pos . Z + = 8 ;
2021-11-19 08:47:17 +00:00
}
2020-05-18 06:26:09 +00:00
2021-11-19 08:47:17 +00:00
k = hits ( p - > GetActor ( ) ) ;
if ( k < 512 )
{
2022-08-16 21:26:39 +00:00
spawned - > add_int_ang ( 1024 ) ;
2021-12-21 17:19:45 +00:00
spawned - > spr . zvel / = 3 ;
spawned - > spr . xvel / = 3 ;
2021-11-19 08:47:17 +00:00
}
2020-05-18 06:26:09 +00:00
2021-11-19 08:47:17 +00:00
p - > hbomb_on = 1 ;
}
2020-05-18 06:26:09 +00:00
}
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-19 07:03:07 +00:00
if ( p - > kickback_pic = = 40 )
2020-05-18 06:26:09 +00:00
{
2020-09-16 11:01:09 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 20:28:12 +00:00
p - > curr_weapon = DYNAMITE_WEAPON ;
2020-05-18 06:26:09 +00:00
p - > last_weapon = - 1 ;
2020-05-18 20:28:12 +00:00
p - > detonate_count = 0 ;
p - > detonate_time = 45 ;
if ( p - > ammo_amount [ DYNAMITE_WEAPON ] > 0 )
2020-05-18 06:26:09 +00:00
{
2020-05-18 20:28:12 +00:00
fi . addweapon ( p , DYNAMITE_WEAPON ) ;
2020-09-16 11:01:09 +00:00
p - > oweapon_pos = p - > weapon_pos = - 9 ;
2020-05-18 06:26:09 +00:00
}
else checkavailweapon ( p ) ;
}
break ;
case PISTOL_WEAPON :
2020-05-19 07:03:07 +00:00
if ( p - > kickback_pic = = 1 )
2020-05-18 06:26:09 +00:00
{
2020-10-24 05:34:39 +00:00
fi . shoot ( pact , SHOTSPARK1 ) ;
S_PlayActorSound ( PISTOL_FIRE , pact ) ;
2020-05-18 20:28:12 +00:00
p - > noise_radius = 8192 ;
2020-05-18 06:26:09 +00:00
madenoise ( snum ) ;
2021-02-18 10:46:36 +00:00
lastvisinc = PlayClock + 32 ;
2020-05-18 06:26:09 +00:00
p - > visibility = 0 ;
if ( psectlotag ! = 857 )
{
2022-08-27 13:09:51 +00:00
p - > vel . X - = p - > angle . ang . Cos ( ) * ( 1 < < 18 ) ;
p - > vel . Y - = p - > angle . ang . Sin ( ) * ( 1 < < 18 ) ;
2020-05-18 06:26:09 +00:00
}
}
2020-05-19 07:03:07 +00:00
else if ( p - > kickback_pic = = 2 )
2020-05-18 06:26:09 +00:00
if ( p - > ammo_amount [ PISTOL_WEAPON ] < = 0 )
{
2020-09-16 11:01:09 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 06:26:09 +00:00
checkavailweapon ( p ) ;
}
2020-05-19 07:03:07 +00:00
p - > kickback_pic + + ;
2020-05-18 06:26:09 +00:00
2020-05-19 07:03:07 +00:00
if ( p - > kickback_pic > = 22 )
2020-05-18 06:26:09 +00:00
{
if ( p - > ammo_amount [ PISTOL_WEAPON ] < = 0 )
{
2020-09-16 11:01:09 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 06:26:09 +00:00
checkavailweapon ( p ) ;
break ;
}
else if ( ( p - > ammo_amount [ PISTOL_WEAPON ] % 6 ) = = 0 )
{
2020-05-19 07:03:07 +00:00
switch ( p - > kickback_pic )
2020-05-18 06:26:09 +00:00
{
case 24 :
2020-10-24 05:34:39 +00:00
S_PlayActorSound ( EJECT_CLIP , pact ) ;
2020-05-18 06:26:09 +00:00
break ;
case 30 :
2020-10-24 05:34:39 +00:00
S_PlayActorSound ( INSERT_CLIP , pact ) ;
2020-05-18 06:26:09 +00:00
break ;
}
}
else
2020-05-19 07:03:07 +00:00
p - > kickback_pic = 38 ;
2020-05-18 06:26:09 +00:00
}
2020-05-19 07:03:07 +00:00
if ( p - > kickback_pic = = 38 )
2020-05-18 06:26:09 +00:00
{
2020-09-16 11:01:09 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 06:26:09 +00:00
checkavailweapon ( p ) ;
}
break ;
case SHOTGUN_WEAPON :
2020-05-19 07:03:07 +00:00
p - > kickback_pic + + ;
2020-05-18 06:26:09 +00:00
2020-05-19 07:03:07 +00:00
if ( p - > kickback_pic = = 6 )
2020-05-18 20:28:12 +00:00
if ( p - > shotgun_state [ 0 ] = = 0 )
2020-05-18 06:26:09 +00:00
if ( p - > ammo_amount [ SHOTGUN_WEAPON ] > 1 )
2020-08-28 20:51:05 +00:00
if ( actions & SB_FIRE )
2020-05-18 20:28:12 +00:00
p - > shotgun_state [ 1 ] = 1 ;
2020-05-18 06:26:09 +00:00
2020-05-19 07:03:07 +00:00
if ( p - > kickback_pic = = 4 )
2020-05-18 06:26:09 +00:00
{
2020-10-24 05:34:39 +00:00
fi . shoot ( pact , SHOTGUN ) ;
fi . shoot ( pact , SHOTGUN ) ;
fi . shoot ( pact , SHOTGUN ) ;
fi . shoot ( pact , SHOTGUN ) ;
fi . shoot ( pact , SHOTGUN ) ;
fi . shoot ( pact , SHOTGUN ) ;
fi . shoot ( pact , SHOTGUN ) ;
fi . shoot ( pact , SHOTGUN ) ;
fi . shoot ( pact , SHOTGUN ) ;
fi . shoot ( pact , SHOTGUN ) ;
2020-05-18 06:26:09 +00:00
p - > ammo_amount [ SHOTGUN_WEAPON ] - - ;
2020-10-24 05:34:39 +00:00
S_PlayActorSound ( SHOTGUN_FIRE , pact ) ;
2020-05-18 06:26:09 +00:00
2020-05-18 20:28:12 +00:00
p - > noise_radius = 8192 ;
2020-05-18 06:26:09 +00:00
madenoise ( snum ) ;
2021-02-18 10:46:36 +00:00
lastvisinc = PlayClock + 32 ;
2020-05-18 06:26:09 +00:00
p - > visibility = 0 ;
}
2020-05-19 07:03:07 +00:00
if ( p - > kickback_pic = = 7 )
2020-05-18 06:26:09 +00:00
{
2020-05-18 20:28:12 +00:00
if ( p - > shotgun_state [ 1 ] )
2020-05-18 06:26:09 +00:00
{
2020-10-24 05:34:39 +00:00
fi . shoot ( pact , SHOTGUN ) ;
fi . shoot ( pact , SHOTGUN ) ;
fi . shoot ( pact , SHOTGUN ) ;
fi . shoot ( pact , SHOTGUN ) ;
fi . shoot ( pact , SHOTGUN ) ;
fi . shoot ( pact , SHOTGUN ) ;
fi . shoot ( pact , SHOTGUN ) ;
fi . shoot ( pact , SHOTGUN ) ;
fi . shoot ( pact , SHOTGUN ) ;
fi . shoot ( pact , SHOTGUN ) ;
2020-05-18 06:26:09 +00:00
p - > ammo_amount [ SHOTGUN_WEAPON ] - - ;
2020-10-24 05:34:39 +00:00
S_PlayActorSound ( SHOTGUN_FIRE , pact ) ;
2020-05-18 06:26:09 +00:00
if ( psectlotag ! = 857 )
{
2022-08-27 13:09:51 +00:00
p - > vel . X - = p - > angle . ang . Cos ( ) * ( 1 < < 19 ) ;
p - > vel . Y - = p - > angle . ang . Sin ( ) * ( 1 < < 19 ) ;
2020-05-18 06:26:09 +00:00
}
}
else if ( psectlotag ! = 857 )
{
2022-08-27 13:09:51 +00:00
p - > vel . X - = p - > angle . ang . Cos ( ) * ( 1 < < 18 ) ;
p - > vel . Y - = p - > angle . ang . Sin ( ) * ( 1 < < 18 ) ;
2020-05-18 06:26:09 +00:00
}
}
2020-05-18 20:28:12 +00:00
if ( p - > shotgun_state [ 0 ] )
2020-05-18 06:26:09 +00:00
{
2020-05-19 07:03:07 +00:00
switch ( p - > kickback_pic )
2020-05-18 06:26:09 +00:00
{
case 16 :
checkavailweapon ( p ) ;
break ;
case 17 :
2020-10-24 05:34:39 +00:00
S_PlayActorSound ( SHOTGUN_COCK , pact ) ;
2020-05-18 06:26:09 +00:00
break ;
case 28 :
2020-09-16 11:01:09 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 20:28:12 +00:00
p - > shotgun_state [ 0 ] = 0 ;
p - > shotgun_state [ 1 ] = 0 ;
2020-05-18 06:26:09 +00:00
return ;
}
}
2020-05-18 20:28:12 +00:00
else if ( p - > shotgun_state [ 1 ] )
2020-05-18 06:26:09 +00:00
{
2020-05-19 07:03:07 +00:00
switch ( p - > kickback_pic )
2020-05-18 06:26:09 +00:00
{
case 26 :
checkavailweapon ( p ) ;
break ;
case 27 :
2020-10-24 05:34:39 +00:00
S_PlayActorSound ( SHOTGUN_COCK , pact ) ;
2020-05-18 06:26:09 +00:00
break ;
case 38 :
2020-08-27 12:47:18 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 20:28:12 +00:00
p - > shotgun_state [ 0 ] = 0 ;
p - > shotgun_state [ 1 ] = 0 ;
2020-05-18 06:26:09 +00:00
return ;
}
}
else
{
2020-05-19 07:03:07 +00:00
switch ( p - > kickback_pic )
2020-05-18 06:26:09 +00:00
{
case 16 :
checkavailweapon ( p ) ;
2020-08-27 12:47:18 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 20:28:12 +00:00
p - > shotgun_state [ 0 ] = 1 ;
p - > shotgun_state [ 1 ] = 0 ;
2020-05-18 06:26:09 +00:00
return ;
}
}
break ;
2020-05-18 20:28:12 +00:00
case RIFLEGUN_WEAPON :
2020-05-18 06:26:09 +00:00
2020-05-19 07:03:07 +00:00
p - > kickback_pic + + ;
2022-05-30 10:35:41 +00:00
p - > horizon . addadjustment ( buildhoriz ( 1 ) ) ;
2020-05-18 20:28:12 +00:00
p - > recoil + + ;
2020-05-18 06:26:09 +00:00
2020-05-19 07:03:07 +00:00
if ( p - > kickback_pic < = 12 )
2020-05-18 06:26:09 +00:00
{
2020-05-19 07:03:07 +00:00
if ( ( p - > kickback_pic % 3 ) = = 0 )
2020-05-18 06:26:09 +00:00
{
2020-05-18 20:28:12 +00:00
p - > ammo_amount [ RIFLEGUN_WEAPON ] - - ;
2020-05-18 06:26:09 +00:00
2020-05-19 07:03:07 +00:00
if ( ( p - > kickback_pic % 3 ) = = 0 )
2020-05-18 06:26:09 +00:00
{
2020-10-24 05:34:39 +00:00
auto j = spawn ( pact , SHELL ) ;
2021-11-19 11:32:12 +00:00
if ( j )
{
2020-05-18 06:26:09 +00:00
2022-08-16 21:27:44 +00:00
j - > set_int_ang ( ( j - > int_ang ( ) + 1024 ) & 2047 ) ;
2021-12-21 17:19:45 +00:00
j - > spr . xvel + = 32 ;
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 ) ;
fi . shoot ( pact , CHAINGUN ) ;
2020-05-18 20:28:12 +00:00
p - > noise_radius = 8192 ;
2020-05-18 06:26:09 +00:00
madenoise ( snum ) ;
2021-02-18 10:46:36 +00:00
lastvisinc = PlayClock + 32 ;
2020-05-18 06:26:09 +00:00
p - > visibility = 0 ;
if ( psectlotag ! = 857 )
{
2022-08-27 13:09:51 +00:00
p - > vel . X - = p - > angle . ang . Cos ( ) * ( 1 < < 18 ) ;
p - > vel . Y - = p - > angle . ang . Sin ( ) * ( 1 < < 18 ) ;
2020-05-18 06:26:09 +00:00
}
checkavailweapon ( p ) ;
2020-08-28 20:51:05 +00:00
if ( ( actions & SB_FIRE ) = = 0 )
2020-05-18 06:26:09 +00:00
{
2020-09-16 11:01:09 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 06:26:09 +00:00
break ;
}
}
}
2020-05-19 07:03: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 - > kickback_pic = 1 ;
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 BUZZSAW_WEAPON :
2020-05-18 06:26:09 +00:00
2020-05-19 07:03:07 +00:00
if ( p - > kickback_pic > 3 )
2020-05-18 06:26:09 +00:00
{
2020-09-16 11:01:09 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-10-24 05:34:39 +00:00
fi . shoot ( pact , GROWSPARK ) ;
2020-05-18 20:28:12 +00:00
p - > noise_radius = 1024 ;
madenoise ( snum ) ;
checkavailweapon ( p ) ;
2020-05-18 06:26:09 +00:00
}
2020-05-19 07:03:07 +00:00
else p - > kickback_pic + + ;
2020-05-18 20:28:12 +00:00
break ;
case THROWSAW_WEAPON :
2020-05-19 07:03:07 +00:00
if ( p - > kickback_pic = = 1 )
2020-05-18 06:26:09 +00:00
{
2020-05-19 07:54:52 +00:00
p - > ammo_amount [ THROWSAW_WEAPON ] - - ;
2020-10-24 05:34:39 +00:00
fi . shoot ( pact , SHRINKSPARK ) ;
2020-05-18 20:28:12 +00:00
checkavailweapon ( p ) ;
2020-05-18 06:26:09 +00:00
}
2020-05-19 07:03:07 +00:00
p - > kickback_pic + + ;
if ( p - > kickback_pic > 20 )
2020-09-16 11:01:09 +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
case TIT_WEAPON :
2020-05-19 07:03:07 +00:00
p - > kickback_pic + + ;
if ( p - > kickback_pic = = 2 | | p - > kickback_pic = = 4 )
2020-05-18 06:26:09 +00:00
{
p - > visibility = 0 ;
2021-02-18 10:46:36 +00:00
lastvisinc = PlayClock + 32 ;
2020-10-24 05:34:39 +00:00
S_PlayActorSound ( CHAINGUN_FIRE , pact ) ;
fi . shoot ( pact , SHOTSPARK1 ) ;
2020-05-18 20:28:12 +00:00
p - > noise_radius = 16384 ;
2020-05-18 06:26:09 +00:00
madenoise ( snum ) ;
2020-05-18 20:28:12 +00:00
p - > ammo_amount [ TIT_WEAPON ] - - ;
2020-05-18 06:26:09 +00:00
checkavailweapon ( p ) ;
}
2020-05-19 07:03:07 +00:00
if ( p - > kickback_pic = = 2 )
2020-05-18 06:26:09 +00:00
{
2022-08-27 13:43:23 +00:00
p - > angle . addadjustment ( DAngle : : fromBuild ( 16 ) ) ;
2020-05-18 06:26:09 +00:00
}
2020-05-19 07:03:07 +00:00
else if ( p - > kickback_pic = = 4 )
2020-05-18 06:26:09 +00:00
{
2022-08-27 13:43:23 +00:00
p - > angle . addadjustment ( DAngle : : fromBuild ( - 16 ) ) ;
2020-05-18 06:26:09 +00:00
}
2020-05-19 07:03:07 +00:00
if ( p - > kickback_pic > 4 )
p - > kickback_pic = 1 ;
2020-08-28 20:51:05 +00:00
if ( ! ( actions & SB_FIRE ) )
2020-09-16 11:01:09 +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
case MOTORCYCLE_WEAPON :
2020-05-19 07:03:07 +00:00
p - > kickback_pic + + ;
if ( p - > kickback_pic = = 2 | | p - > kickback_pic = = 4 )
2020-05-18 06:26:09 +00:00
{
p - > visibility = 0 ;
2021-02-18 10:46:36 +00:00
lastvisinc = PlayClock + 32 ;
2020-10-24 05:34:39 +00:00
S_PlayActorSound ( CHAINGUN_FIRE , pact ) ;
fi . shoot ( pact , CHAINGUN ) ;
2020-05-18 20:28:12 +00:00
p - > noise_radius = 16384 ;
2020-05-18 06:26:09 +00:00
madenoise ( snum ) ;
2020-05-18 20:28:12 +00:00
p - > ammo_amount [ MOTORCYCLE_WEAPON ] - - ;
if ( p - > ammo_amount [ MOTORCYCLE_WEAPON ] < = 0 )
2020-09-16 11:01:09 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 06:26:09 +00:00
else
checkavailweapon ( p ) ;
}
2020-05-19 07:03:07 +00:00
if ( p - > kickback_pic = = 2 )
2020-05-18 06:26:09 +00:00
{
2022-08-27 13:43:23 +00:00
p - > angle . addadjustment ( DAngle : : fromBuild ( 4 ) ) ;
2020-05-18 06:26:09 +00:00
}
2020-05-19 07:03:07 +00:00
else if ( p - > kickback_pic = = 4 )
2020-05-18 06:26:09 +00:00
{
2022-08-27 13:43:23 +00:00
p - > angle . addadjustment ( DAngle : : fromBuild ( - 4 ) ) ;
2020-05-18 06:26:09 +00:00
}
2020-05-19 07:03:07 +00:00
if ( p - > kickback_pic > 4 )
p - > kickback_pic = 1 ;
2020-08-28 20:51:05 +00:00
if ( ! ( actions & SB_FIRE ) )
2020-09-16 11:01:09 +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
case BOAT_WEAPON :
2020-05-19 07:03:07 +00:00
if ( p - > kickback_pic = = 3 )
2020-05-18 06:26:09 +00:00
{
p - > MotoSpeed - = 20 ;
2020-05-18 20:28:12 +00:00
p - > ammo_amount [ BOAT_WEAPON ] - - ;
2020-10-24 05:34:39 +00:00
fi . shoot ( pact , RRTILE1790 ) ;
2020-05-18 06:26:09 +00:00
}
2020-05-19 07:03:07 +00:00
p - > kickback_pic + + ;
if ( p - > kickback_pic > 20 )
2020-05-18 06:26:09 +00:00
{
2020-09-16 11:01:09 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 06:26:09 +00:00
checkavailweapon ( p ) ;
}
2020-05-18 20:28:12 +00:00
if ( p - > ammo_amount [ BOAT_WEAPON ] < = 0 )
2020-09-16 11:01:09 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 06:26:09 +00:00
else
checkavailweapon ( p ) ;
break ;
2020-05-18 20:28:12 +00:00
case ALIENBLASTER_WEAPON :
2020-05-19 07:03:07 +00:00
p - > kickback_pic + + ;
if ( p - > kickback_pic > = 7 & & p - > kickback_pic < = 11 )
2020-10-24 05:34:39 +00:00
fi . shoot ( pact , FIRELASER ) ;
2020-05-18 06:26:09 +00:00
2020-05-19 07:03:07 +00:00
if ( p - > kickback_pic = = 5 )
2020-05-18 06:26:09 +00:00
{
2020-10-24 05:34:39 +00:00
S_PlayActorSound ( CAT_FIRE , pact ) ;
2020-05-18 20:28:12 +00:00
p - > noise_radius = 2048 ;
2020-05-18 06:26:09 +00:00
madenoise ( snum ) ;
}
2020-05-19 07:03:07 +00:00
else if ( p - > kickback_pic = = 9 )
2020-05-18 06:26:09 +00:00
{
2020-05-18 20:28:12 +00:00
p - > ammo_amount [ ALIENBLASTER_WEAPON ] - - ;
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
checkavailweapon ( p ) ;
}
2020-05-19 07:03:07 +00:00
else if ( p - > kickback_pic = = 12 )
2020-05-18 06:26:09 +00:00
{
2022-08-27 13:09:51 +00:00
p - > vel . X - = p - > angle . ang . Cos ( ) * ( 1 < < 18 ) ;
p - > vel . Y - = p - > angle . ang . Sin ( ) * ( 1 < < 18 ) ;
2022-05-30 10:35:41 +00:00
p - > horizon . addadjustment ( buildhoriz ( 20 ) ) ;
2020-05-18 20:28:12 +00:00
p - > recoil + = 20 ;
2020-05-18 06:26:09 +00:00
}
2020-05-19 07:03:07 +00:00
if ( p - > kickback_pic > 20 )
2020-09-16 11:01:09 +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
case POWDERKEG_WEAPON :
2020-05-19 07:03:07 +00:00
if ( p - > kickback_pic = = 3 )
2020-05-18 06:26:09 +00:00
{
2020-05-18 20:28:12 +00:00
p - > ammo_amount [ POWDERKEG_WEAPON ] - - ;
2021-05-15 08:23:50 +00:00
p - > gotweapon [ POWDERKEG_WEAPON ] = false ;
2020-08-28 20:51:05 +00:00
if ( p - > on_ground & & ( actions & SB_CROUCH ) & & ! p - > OnMotorcycle )
2020-05-18 06:26:09 +00:00
{
2020-05-18 20:28:12 +00:00
k = 15 ;
2021-01-04 11:36:54 +00:00
i = MulScale ( p - > horizon . sum ( ) . asq16 ( ) , 20 , 16 ) ;
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 20:28:12 +00:00
k = 32 ;
2021-01-04 11:36:54 +00:00
i = - 512 - MulScale ( p - > horizon . sum ( ) . asq16 ( ) , 20 , 16 ) ;
2020-05-18 06:26:09 +00:00
}
2020-05-18 20:28:12 +00:00
2021-11-21 07:56:39 +00:00
EGS ( p - > cursector ,
2022-08-27 13:09:51 +00:00
p - > player_int_pos ( ) . X + p - > angle . ang . Cos ( ) * ( 1 < < 8 ) ,
p - > player_int_pos ( ) . Y + p - > angle . ang . Sin ( ) * ( 1 < < 8 ) ,
2022-02-04 17:11:44 +00:00
p - > player_int_pos ( ) . Z , POWDERKEG , - 16 , 9 , 9 ,
2022-08-27 13:09:22 +00:00
p - > angle . ang . Buildang ( ) , k * 2 , i , pact , 1 ) ;
2020-05-18 20:28:12 +00:00
}
2020-05-19 07:03:07 +00:00
p - > kickback_pic + + ;
if ( p - > kickback_pic > 20 )
2020-05-18 20:28:12 +00:00
{
2020-09-16 11:01:09 +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
}
break ;
2020-05-18 20:28:12 +00:00
case BOWLING_WEAPON :
2020-05-19 07:03:07 +00:00
if ( p - > kickback_pic = = 30 )
2020-05-18 20:28:12 +00:00
{
p - > ammo_amount [ BOWLING_WEAPON ] - - ;
2020-10-24 05:34:39 +00:00
S_PlayActorSound ( 354 , pact ) ;
fi . shoot ( pact , BOWLINGBALL ) ;
2020-05-18 20:28:12 +00:00
p - > noise_radius = 1024 ;
madenoise ( snum ) ;
}
2020-05-19 07:03:07 +00:00
if ( p - > kickback_pic < 30 )
2020-05-18 20:28:12 +00:00
{
2022-08-27 13:09:51 +00:00
p - > vel . X - = p - > angle . ang . Cos ( ) * ( 1 < < 18 ) ;
p - > vel . Y - = p - > angle . ang . Sin ( ) * ( 1 < < 18 ) ;
2020-05-18 20:28:12 +00:00
}
2020-05-19 07:03:07 +00:00
p - > kickback_pic + + ;
if ( p - > kickback_pic > 40 )
2020-05-18 20:28:12 +00:00
{
2020-09-16 11:01:09 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2021-05-15 08:23:50 +00:00
p - > gotweapon [ BOWLING_WEAPON ] = false ;
2020-05-18 20:28:12 +00:00
checkavailweapon ( p ) ;
}
break ;
2020-05-18 06:26:09 +00:00
case KNEE_WEAPON :
2020-05-19 07:03:07 +00:00
p - > kickback_pic + + ;
if ( p - > kickback_pic = = 3 )
2020-10-24 05:34:39 +00:00
S_PlayActorSound ( 426 , pact ) ;
2020-05-19 07:03:07 +00:00
if ( p - > kickback_pic = = 12 )
2020-05-18 06:26:09 +00:00
{
2020-10-24 05:34:39 +00:00
fi . shoot ( pact , KNEE ) ;
2020-05-18 20:28:12 +00:00
p - > noise_radius = 1024 ;
2020-05-18 06:26:09 +00:00
madenoise ( snum ) ;
}
2020-05-19 07:03:07 +00:00
else if ( p - > kickback_pic = = 16 )
2020-09-16 11:01:09 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 06:26:09 +00:00
if ( p - > wantweaponfire > = 0 )
checkavailweapon ( p ) ;
break ;
2020-05-18 20:28:12 +00:00
case SLINGBLADE_WEAPON :
2020-05-19 07:03:07 +00:00
p - > kickback_pic + + ;
if ( p - > kickback_pic = = 3 )
2020-10-24 05:34:39 +00:00
S_PlayActorSound ( 252 , pact ) ;
2020-05-19 07:03:07 +00:00
if ( p - > kickback_pic = = 8 )
2020-05-18 06:26:09 +00:00
{
2020-10-24 05:34:39 +00:00
fi . shoot ( pact , SLINGBLADE ) ;
2020-05-18 20:28:12 +00:00
p - > noise_radius = 1024 ;
2020-05-18 06:26:09 +00:00
madenoise ( snum ) ;
}
2020-05-19 07:03:07 +00:00
else if ( p - > kickback_pic = = 16 )
2020-09-16 11:01:09 +00:00
p - > okickback_pic = p - > kickback_pic = 0 ;
2020-05-18 06:26:09 +00:00
if ( p - > wantweaponfire > = 0 )
checkavailweapon ( p ) ;
break ;
2020-05-18 20:28:12 +00:00
case CROSSBOW_WEAPON :
2020-05-19 07:03:07 +00:00
p - > kickback_pic + + ;
if ( p - > kickback_pic = = 4 )
2020-05-18 06:26:09 +00:00
{
2020-05-18 20:28:12 +00:00
p - > ammo_amount [ CROSSBOW_WEAPON ] - - ;
if ( p - > ammo_amount [ DYNAMITE_WEAPON ] )
p - > ammo_amount [ DYNAMITE_WEAPON ] - - ;
2021-02-18 10:46:36 +00:00
lastvisinc = PlayClock + 32 ;
2020-05-18 06:26:09 +00:00
p - > visibility = 0 ;
2020-10-24 05:34:39 +00:00
fi . shoot ( pact , RPG ) ;
2020-05-18 20:28:12 +00:00
p - > noise_radius = 32768 ;
2020-05-18 06:26:09 +00:00
madenoise ( snum ) ;
checkavailweapon ( p ) ;
}
2020-05-19 07:03:07 +00:00
else if ( p - > kickback_pic = = 16 )
2020-10-24 05:34:39 +00:00
S_PlayActorSound ( 450 , pact ) ;
2020-05-19 07:03:07 +00:00
else if ( p - > kickback_pic = = 34 )
2020-09-16 11:01:09 +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
case CHICKEN_WEAPON :
2020-05-19 07:03:07 +00:00
p - > kickback_pic + + ;
if ( p - > kickback_pic = = 4 )
2020-05-18 06:26:09 +00:00
{
2020-05-18 20:28:12 +00:00
p - > ammo_amount [ CHICKEN_WEAPON ] - - ;
2021-02-18 10:46:36 +00:00
lastvisinc = PlayClock + 32 ;
2020-05-18 06:26:09 +00:00
p - > visibility = 0 ;
2020-10-24 05:34:39 +00:00
fi . shoot ( pact , RPG2 ) ;
2020-05-18 20:28:12 +00:00
p - > noise_radius = 32768 ;
2020-05-18 06:26:09 +00:00
madenoise ( snum ) ;
checkavailweapon ( p ) ;
}
2020-05-19 07:03:07 +00:00
else if ( p - > kickback_pic = = 16 )
2020-10-24 05:34:39 +00:00
S_PlayActorSound ( 450 , pact ) ;
2020-05-19 07:03:07 +00:00
else if ( p - > kickback_pic = = 34 )
2020-09-16 11:01:09 +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-18 06:26:09 +00:00
}
}
2020-05-19 07:03:07 +00:00
2020-05-19 07:54:52 +00:00
//---------------------------------------------------------------------------
//
// this function exists because gotos suck. :P
//
//---------------------------------------------------------------------------
2021-11-18 19:17:47 +00:00
static void processweapon ( int snum , ESyncBits actions , sectortype * psectp )
2020-05-19 07:54:52 +00:00
{
auto p = & ps [ snum ] ;
2020-10-25 07:12:25 +00:00
auto pact = p - > GetActor ( ) ;
2021-12-21 19:50:51 +00:00
int shrunk = ( pact - > spr . yrepeat < 8 ) ;
2020-05-19 07:54:52 +00:00
if ( p - > detonate_count > 0 )
{
if ( ud . god )
{
p - > detonate_time = 45 ;
p - > detonate_count = 0 ;
}
else if ( p - > detonate_time < = 0 & & p - > kickback_pic < 5 )
{
2020-07-25 07:32:54 +00:00
S_PlaySound ( 14 ) ;
2020-05-19 07:54:52 +00:00
quickkill ( p ) ;
}
}
if ( isRRRA ( ) & & ( p - > curr_weapon = = KNEE_WEAPON | | p - > curr_weapon = = SLINGBLADE_WEAPON ) )
p - > random_club_frame + = 64 ;
if ( p - > curr_weapon = = THROWSAW_WEAPON | | p - > curr_weapon = = BUZZSAW_WEAPON )
p - > random_club_frame + = 64 ; // Glowing
if ( p - > curr_weapon = = TRIPBOMB_WEAPON | | p - > curr_weapon = = BOWLING_WEAPON )
p - > random_club_frame + = 64 ;
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 ) )
{
fireweapon ( snum ) ;
}
else if ( p - > kickback_pic )
{
2021-11-18 19:17:47 +00:00
operateweapon ( snum , actions , psectp ) ;
2020-05-19 07:54:52 +00:00
}
}
2020-05-19 07:03:07 +00:00
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void processinput_r ( int snum )
{
2020-10-25 07:25:45 +00:00
int i , k , doubvel , fz , cz , truefdist ;
Collision chz , clz ;
2021-11-07 15:46:23 +00:00
bool shrunk ;
2021-11-21 07:50:04 +00:00
int psectlotag ;
2020-05-19 07:03:07 +00:00
2020-10-25 07:12:25 +00:00
auto p = & ps [ snum ] ;
auto pact = p - > GetActor ( ) ;
2020-05-19 07:03:07 +00:00
2020-10-12 03:42:43 +00:00
p - > horizon . resetadjustment ( ) ;
p - > angle . resetadjustment ( ) ;
2020-05-19 17:50:31 +00:00
2021-04-21 10:41:04 +00:00
ESyncBits & actions = p - > sync . actions ;
2020-05-19 07:03:07 +00:00
2020-07-14 22:26:58 +00:00
auto sb_fvel = PlayerInputForwardVel ( snum ) ;
auto sb_svel = PlayerInputSideVel ( snum ) ;
auto sb_avel = PlayerInputAngVel ( snum ) ;
2020-05-19 07:03:07 +00:00
2021-11-21 07:56:39 +00:00
auto psectp = p - > cursector ;
2021-12-21 19:50:51 +00:00
if ( p - > OnMotorcycle & & pact - > spr . extra > 0 )
2020-05-19 07:03:07 +00:00
{
2020-08-29 11:32:14 +00:00
onMotorcycle ( snum , actions ) ;
2020-05-19 07:03:07 +00:00
}
2021-12-21 19:50:51 +00:00
else if ( p - > OnBoat & & pact - > spr . extra > 0 )
2020-05-19 07:03:07 +00:00
{
2020-08-29 11:32:14 +00:00
onBoat ( snum , actions ) ;
2020-05-19 07:03:07 +00:00
}
2021-11-21 07:50:04 +00:00
if ( psectp = = nullptr )
2020-05-19 07:03:07 +00:00
{
2021-12-21 19:50:51 +00:00
if ( pact - > spr . extra > 0 & & ud . clipping = = 0 )
2020-05-19 07:03:07 +00:00
{
quickkill ( p ) ;
2020-10-25 07:12:25 +00:00
S_PlayActorSound ( SQUISHED , pact ) ;
2020-05-19 07:03:07 +00:00
}
2021-11-21 07:50:04 +00:00
psectp = & sector [ 0 ] ;
2020-05-19 07:03:07 +00:00
}
2021-11-18 16:34:31 +00:00
psectlotag = psectp - > lotag ;
2020-05-19 07:03:07 +00:00
if ( psectlotag = = 867 )
{
2021-11-21 07:50:04 +00:00
DukeSectIterator it ( psectp ) ;
2020-10-25 07:25:45 +00:00
while ( auto act2 = it . Next ( ) )
2020-05-19 07:03:07 +00:00
{
2021-12-21 17:19:45 +00:00
if ( act2 - > spr . picnum = = RRTILE380 )
2022-02-04 17:11:44 +00:00
if ( act2 - > int_pos ( ) . Z - ( 8 < < 8 ) < p - > player_int_pos ( ) . Z )
2020-05-19 07:03:07 +00:00
psectlotag = 2 ;
}
}
2021-05-02 12:01:10 +00:00
else if ( psectlotag = = 7777 & & ( currentLevel - > gameflags & LEVEL_RR_HULKSPAWN ) )
2020-05-19 07:03:07 +00:00
lastlevel = 1 ;
2021-11-18 16:34:31 +00:00
if ( psectlotag = = 848 & & psectp - > floorpicnum = = WATERTILE2 )
2020-05-19 07:03:07 +00:00
psectlotag = 1 ;
if ( psectlotag = = 857 )
2021-12-21 19:50:51 +00:00
pact - > spr . clipdist = 1 ;
2020-05-19 07:03:07 +00:00
else
2021-12-21 19:50:51 +00:00
pact - > spr . clipdist = 64 ;
2020-05-19 07:03:07 +00:00
p - > spritebridge = 0 ;
2021-12-21 19:50:51 +00:00
shrunk = ( pact - > spr . yrepeat < 8 ) ;
2020-10-25 07:25:45 +00:00
int tempfz ;
2021-12-21 19:50:51 +00:00
if ( pact - > spr . clipdist = = 64 )
2020-05-19 07:03:07 +00:00
{
2022-02-05 11:05:29 +00:00
getzrange ( p - > player_int_pos ( ) , psectp , & cz , chz , & fz , clz , 163L , CLIPMASK0 ) ;
2022-02-04 17:11:44 +00:00
tempfz = getflorzofslopeptr ( psectp , p - > player_int_pos ( ) . X , p - > player_int_pos ( ) . Y ) ;
2020-05-19 07:03:07 +00:00
}
else
{
2022-02-05 11:05:29 +00:00
getzrange ( p - > player_int_pos ( ) , psectp , & cz , chz , & fz , clz , 4L , CLIPMASK0 ) ;
2022-02-04 17:11:44 +00:00
tempfz = getflorzofslopeptr ( psectp , p - > player_int_pos ( ) . X , p - > player_int_pos ( ) . Y ) ;
2020-05-19 07:03:07 +00:00
}
2022-02-04 16:49:48 +00:00
p - > truefz = tempfz * zinttoworld ;
2022-02-04 17:11:44 +00:00
p - > truecz = getceilzofslopeptr ( psectp , p - > player_int_pos ( ) . X , p - > player_int_pos ( ) . Y ) * zinttoworld ;
2020-05-19 07:03:07 +00:00
2022-02-04 17:11:44 +00:00
truefdist = abs ( p - > player_int_pos ( ) . Z - tempfz ) ;
2022-02-04 17:06:08 +00:00
if ( clz . type = = kHitSector & & psectlotag = = 1 & & truefdist > gs . int_playerheight + ( 16 < < 8 ) )
2020-05-19 07:03:07 +00:00
psectlotag = 0 ;
2022-02-03 23:44:13 +00:00
pact - > floorz = fz * zinttoworld ;
pact - > ceilingz = cz * zinttoworld ;
2020-05-19 07:03:07 +00:00
2020-11-30 22:40:16 +00:00
if ( SyncInput ( ) )
2020-05-19 07:03:07 +00:00
{
2020-10-07 06:12:37 +00:00
p - > horizon . backup ( ) ;
2021-01-01 22:32:19 +00:00
doslopetilting ( p ) ;
2020-05-19 07:03:07 +00:00
}
2020-10-25 07:25:45 +00:00
if ( chz . type = = kHitSprite )
2020-05-19 07:03:07 +00:00
{
2021-12-21 17:19:45 +00:00
if ( chz . actor ( ) - > spr . statnum = = 1 & & chz . actor ( ) - > spr . extra > = 0 )
2020-05-19 07:03:07 +00:00
{
2021-11-26 12:41:15 +00:00
chz . setNone ( ) ;
2022-02-04 16:49:48 +00:00
cz = p - > truecz * zworldtoint ;
2020-05-19 07:03:07 +00:00
}
2021-12-21 17:19:45 +00:00
else if ( chz . actor ( ) - > spr . picnum = = LADDER )
2020-05-19 07:03:07 +00:00
{
if ( ! p - > stairs )
{
p - > stairs = 10 ;
2020-08-28 20:51:05 +00:00
if ( ( actions & SB_JUMP ) & & ! p - > OnMotorcycle )
2020-05-19 07:03:07 +00:00
{
2021-11-26 12:41:15 +00:00
chz . setNone ( ) ;
2022-02-04 16:49:48 +00:00
cz = p - > truecz * zworldtoint ;
2020-05-19 07:03:07 +00:00
}
}
else
p - > stairs - - ;
}
}
2020-10-25 07:25:45 +00:00
if ( clz . type = = kHitSprite )
2020-05-19 07:03:07 +00:00
{
2022-07-21 10:18:40 +00:00
auto doVehicleHit = [ & ] ( )
{
if ( badguy ( clz . actor ( ) ) )
{
clz . actor ( ) - > attackertype = MOTOHIT ;
clz . actor ( ) - > hitextra = int ( 2 + ( p - > MotoSpeed * 0.5 ) ) ;
p - > MotoSpeed - = p - > MotoSpeed * ( 1. / 16. ) ;
}
} ;
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-19 07:03:07 +00:00
{
psectlotag = 0 ;
p - > footprintcount = 0 ;
p - > spritebridge = 1 ;
}
if ( p - > OnMotorcycle )
2022-07-21 10:18:40 +00:00
doVehicleHit ( ) ;
2020-05-19 07:03:07 +00:00
if ( p - > OnBoat )
{
2022-07-21 10:18:40 +00:00
doVehicleHit ( ) ;
2020-05-19 07:03:07 +00:00
}
2022-01-31 18:21:49 +00:00
else if ( badguy ( clz . actor ( ) ) & & clz . actor ( ) - > spr . xrepeat > 24 & & abs ( pact - > int_pos ( ) . Z - clz . actor ( ) - > int_pos ( ) . Z ) < ( 84 < < 8 ) )
2020-05-19 07:03:07 +00:00
{
2022-02-04 17:11:44 +00:00
int j = getangle ( clz . actor ( ) - > int_pos ( ) . X - p - > player_int_pos ( ) . X , clz . actor ( ) - > int_pos ( ) . Y - p - > player_int_pos ( ) . Y ) ;
2021-12-30 11:14:55 +00:00
p - > vel . X - = bcos ( j , 4 ) ;
2021-12-30 11:18:56 +00:00
p - > vel . Y - = bsin ( j , 4 ) ;
2020-05-19 07:03:07 +00:00
}
2021-12-21 17:19:45 +00:00
if ( clz . actor ( ) - > spr . picnum = = LADDER )
2020-05-19 07:03:07 +00:00
{
if ( ! p - > stairs )
{
p - > stairs = 10 ;
2020-08-28 20:51:05 +00:00
if ( ( actions & SB_CROUCH ) & & ! p - > OnMotorcycle )
2020-05-19 07:03:07 +00:00
{
2022-01-31 18:21:49 +00:00
cz = clz . actor ( ) - > int_pos ( ) . Z ;
2021-11-26 12:41:15 +00:00
chz . setNone ( ) ;
2022-01-31 18:21:49 +00:00
fz = clz . actor ( ) - > int_pos ( ) . Z + ( 4 < < 8 ) ;
2020-05-19 07:03:07 +00:00
}
}
else
p - > stairs - - ;
}
2021-12-21 17:19:45 +00:00
else if ( clz . actor ( ) - > spr . picnum = = TOILET | | clz . actor ( ) - > spr . picnum = = RRTILE2121 )
2020-05-19 07:03:07 +00:00
{
2020-08-28 20:51:05 +00:00
if ( ( actions & SB_CROUCH ) & & ! p - > OnMotorcycle )
2020-05-19 07:03:07 +00:00
//if (Sound[436].num == 0)
{
2020-10-25 07:25:45 +00:00
S_PlayActorSound ( 436 , pact ) ;
2020-05-19 07:03:07 +00:00
p - > last_pissed_time = 4000 ;
p - > eat = 0 ;
}
}
}
2021-12-21 19:50:51 +00:00
if ( pact - > spr . extra > 0 ) fi . incur_damage ( p ) ;
2020-05-19 07:03:07 +00:00
else
{
2021-12-21 19:50:51 +00:00
pact - > spr . extra = 0 ;
2020-05-19 07:03:07 +00:00
p - > shield_amount = 0 ;
}
2021-12-21 19:50:51 +00:00
p - > last_extra = pact - > spr . extra ;
2020-05-19 07:03: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-19 07:03: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:50:51 +00:00
if ( pact - > spr . extra < = 0 & & ! ud . god )
2020-05-19 07:03:07 +00:00
{
playerisdead ( snum , psectlotag , fz , cz ) ;
2020-07-16 13:03:09 +00:00
return ;
2020-05-19 07:03:07 +00:00
}
2022-06-06 01:04:51 +00:00
if ( p - > GetActor ( ) - > spr . xrepeat < 8 & & p - > jetpack_on = = 0 )
{
p - > ofistsign = p - > fistsign ;
p - > fistsign + = p - > GetActor ( ) - > spr . xvel ;
}
2020-05-19 07:03: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-19 07:03:07 +00:00
{
2021-12-30 11:18:56 +00:00
p - > vel . X = p - > vel . Y = pact - > spr . xvel = 0 ;
2020-05-19 07:03:07 +00:00
fi . doincrements ( p ) ;
2021-11-18 19:17:47 +00:00
if ( p - > curr_weapon = = THROWINGDYNAMITE_WEAPON ) processweapon ( snum , actions , psectp ) ;
2020-05-19 07:03:07 +00:00
return ;
}
doubvel = TICSPERFRAME ;
2020-08-29 11:32:14 +00:00
checklook ( snum , actions ) ;
2021-01-03 09:06:28 +00:00
p - > apply_seasick ( 1 ) ;
2020-05-19 07:03:07 +00:00
2022-02-05 11:30:00 +00:00
auto oldpos = p - > opos ;
2022-01-04 23:39:09 +00:00
2020-10-17 08:44:00 +00:00
if ( p - > on_crane ! = nullptr )
2020-05-19 07:03:07 +00:00
goto HORIZONLY ;
2021-12-21 19:50:51 +00:00
p - > playerweaponsway ( pact - > spr . xvel ) ;
2020-05-19 07:03:07 +00:00
2022-02-05 12:58:12 +00:00
pact - > spr . xvel = int ( clamp ( ( p - > pos . XY ( ) - p - > bobpos ) . Length ( ) , 0. , 32. ) * worldtoint ) ;
2021-12-21 17:19:45 +00:00
if ( p - > on_ground ) p - > bobcounter + = p - > GetActor ( ) - > spr . xvel > > 1 ;
2020-05-19 07:03:07 +00:00
2022-01-04 03:00:18 +00:00
p - > backuppos ( ud . clipping = = 0 & & ( ( p - > insector ( ) & & p - > cursector - > floorpicnum = = MIRROR ) | | ! p - > insector ( ) ) ) ;
2020-05-19 07:03:07 +00:00
// Shrinking code
i = 40 ;
2020-07-16 13:03:09 +00:00
if ( psectlotag = = ST_17_PLATFORM_UP | | ( isRRRA ( ) & & psectlotag = = ST_18_ELEVATOR_DOWN ) )
2020-05-19 07:03:07 +00:00
{
int tmp ;
2021-11-21 07:56:39 +00:00
tmp = getanimationgoal ( anim_floorz , p - > cursector ) ;
2020-05-19 07:03:07 +00:00
if ( tmp > = 0 )
{
2020-11-02 19:24:07 +00:00
if ( ! S_CheckActorSoundPlaying ( pact , 432 ) )
2020-10-25 07:12:25 +00:00
S_PlayActorSound ( 432 , pact ) ;
2020-05-19 07:03:07 +00:00
}
else
2020-07-25 07:32:54 +00:00
S_StopSound ( 432 ) ;
2020-05-19 07:03:07 +00:00
}
if ( isRRRA ( ) & & p - > sea_sick_stat )
{
p - > pycount + = 32 ;
p - > pycount & = 2047 ;
2020-11-15 11:07:30 +00:00
p - > pyoff = bsin ( p - > pycount , - ( p - > SeaSick ? 2 : 7 ) ) ;
2020-05-19 07:03:07 +00:00
}
2020-07-16 13:03:09 +00:00
if ( psectlotag = = ST_2_UNDERWATER )
2020-05-19 07:03:07 +00:00
{
2021-11-18 16:34:31 +00:00
underwater ( snum , actions , fz , cz ) ;
2020-05-19 07:03:07 +00:00
}
2020-08-07 19:59:11 +00:00
else
2020-05-19 07:03:07 +00:00
{
2021-11-18 16:34:31 +00:00
movement ( snum , actions , psectp , fz , cz , shrunk , truefdist , psectlotag ) ;
2020-05-19 07:03:07 +00:00
}
2020-08-05 12:57:47 +00:00
p - > psectlotag = psectlotag ;
2020-08-05 07:53:22 +00:00
//Do the quick lefts and rights
2021-01-02 00:04:03 +00:00
if ( movementBlocked ( p ) )
2020-08-05 07:53:22 +00:00
{
doubvel = 0 ;
2021-12-30 11:14:55 +00:00
p - > vel . X = 0 ;
2021-12-30 11:18:56 +00:00
p - > vel . Y = 0 ;
2020-08-05 07:53:22 +00:00
}
2020-11-30 22:40:16 +00:00
else if ( SyncInput ( ) )
2020-08-05 07:53:22 +00:00
{
//p->ang += syncangvel * constant
//ENGINE calculates angvel for you
// may still be needed later for demo recording
2020-11-29 08:00:00 +00:00
sb_avel = p - > adjustavel ( sb_avel ) ;
2021-04-21 10:41:04 +00:00
p - > angle . applyinput ( sb_avel , & actions ) ;
2020-08-05 07:53:22 +00:00
}
2021-12-30 15:24:51 +00:00
if ( p - > spritebridge = = 0 & & pact - > insector ( ) )
2020-05-19 07:03:07 +00:00
{
2021-12-30 15:51:56 +00:00
int j = pact - > sector ( ) - > floorpicnum ;
2020-05-19 07:03:07 +00:00
k = 0 ;
2022-02-04 17:06:08 +00:00
if ( p - > on_ground & & truefdist < = gs . int_playerheight + ( 16 < < 8 ) )
2020-05-19 07:03:07 +00:00
{
2022-01-21 13:02:59 +00:00
int whichsound = ( gs . tileinfo [ j ] . flags & TFLAG_ELECTRIC ) ? 0 : j = = FLOORSLIME ? 1 : j = = FLOORPLASMA ? 2 :
2020-08-07 21:30:08 +00:00
( isRRRA ( ) & & ( j = = RRTILE7768 | | j = = RRTILE7820 ) ? 3 : - 1 ) ;
2020-05-19 07:03:07 +00:00
if ( j > = 0 ) k = makepainsounds ( snum , whichsound ) ;
}
if ( k )
{
FTA ( 75 , p ) ;
p - > boot_amount - = 2 ;
if ( p - > boot_amount < = 0 )
checkavailinven ( p ) ;
}
}
2021-12-30 11:18:56 +00:00
if ( p - > vel . X | | p - > vel . Y | | sb_fvel | | sb_svel )
2020-05-19 07:03:07 +00:00
{
2020-08-27 05:54:49 +00:00
p - > crack_time = CRACK_TIME ;
2020-05-19 07:03:07 +00:00
2020-11-15 11:07:30 +00:00
k = bsin ( p - > bobcounter , - 12 ) ;
2020-05-19 07:03:07 +00:00
if ( isRRRA ( ) & & p - > spritebridge = = 0 & & p - > on_ground )
{
if ( psectlotag = = 1 )
p - > NotOnWater = 0 ;
else if ( p - > OnBoat )
{
if ( psectlotag = = 1234 )
p - > NotOnWater = 0 ;
else
p - > NotOnWater = 1 ;
}
else
p - > NotOnWater = 1 ;
}
2022-02-04 17:06:08 +00:00
if ( truefdist < gs . int_playerheight + ( 8 < < 8 ) & & ( k = = 1 | | k = = 3 ) )
2020-05-19 07:03:07 +00:00
{
if ( p - > spritebridge = = 0 & & p - > walking_snd_toggle = = 0 & & p - > on_ground )
{
2020-10-25 07:25:45 +00:00
int j ;
2020-05-19 07:03:07 +00:00
switch ( psectlotag )
{
case 0 :
2020-10-25 07:25:45 +00:00
if ( clz . type = = kHitSprite )
2021-12-21 17:19:45 +00:00
j = clz . actor ( ) - > spr . picnum ;
2021-11-18 16:34:31 +00:00
else j = psectp - > floorpicnum ;
2020-05-19 07:03:07 +00:00
break ;
case 1 :
if ( ( krand ( ) & 1 ) = = 0 )
2021-11-21 07:56:39 +00:00
if ( ! isRRRA ( ) | | ( ! p - > OnBoat & & ! p - > OnMotorcycle & & p - > cursector - > hitag ! = 321 ) )
2020-10-25 07:12:25 +00:00
S_PlayActorSound ( DUKE_ONWATER , pact ) ;
2020-05-19 07:03: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 ;
2021-12-30 11:14:55 +00:00
p - > vel . X + = ( ( sb_fvel * doubvel ) < < 6 ) ;
2021-12-30 11:18:56 +00:00
p - > vel . Y + = ( ( sb_svel * doubvel ) < < 6 ) ;
2020-05-19 07:03:07 +00:00
2020-08-28 20:51:05 +00:00
if ( ! isRRRA ( ) & & ( ( p - > curr_weapon = = KNEE_WEAPON & & p - > kickback_pic > 10 & & p - > on_ground ) | | ( p - > on_ground & & ( actions & SB_CROUCH ) ) ) )
2020-05-19 07:03:07 +00:00
{
2021-12-30 11:14:55 +00:00
p - > vel . X = MulScale ( p - > vel . X , gs . playerfriction - 0x2000 , 16 ) ;
2021-12-30 11:18:56 +00:00
p - > vel . Y = MulScale ( p - > vel . Y , gs . playerfriction - 0x2000 , 16 ) ;
2020-05-19 07:03:07 +00:00
}
else
{
if ( psectlotag = = 2 )
{
2021-12-30 11:14:55 +00:00
p - > vel . X = MulScale ( p - > vel . X , gs . playerfriction - 0x1400 , 16 ) ;
2021-12-30 11:18:56 +00:00
p - > vel . Y = MulScale ( p - > vel . Y , gs . playerfriction - 0x1400 , 16 ) ;
2020-05-19 07:03:07 +00:00
}
else
{
2021-12-30 11:14:55 +00:00
p - > vel . X = MulScale ( p - > vel . X , gs . playerfriction , 16 ) ;
2021-12-30 11:18:56 +00:00
p - > vel . Y = MulScale ( p - > vel . Y , gs . playerfriction , 16 ) ;
2020-05-19 07:03:07 +00:00
}
}
2021-11-18 16:34:31 +00:00
if ( isRRRA ( ) & & psectp - > floorpicnum = = RRTILE7888 )
2020-05-19 07:03:07 +00:00
{
if ( p - > OnMotorcycle )
if ( p - > on_ground )
p - > moto_on_oil = 1 ;
}
2021-11-18 16:34:31 +00:00
else if ( isRRRA ( ) & & psectp - > floorpicnum = = RRTILE7889 )
2020-05-19 07:03:07 +00:00
{
if ( p - > OnMotorcycle )
{
if ( p - > on_ground )
p - > moto_on_mud = 1 ;
}
else if ( p - > boot_amount > 0 )
p - > boot_amount - - ;
else
{
2021-12-30 11:14:55 +00:00
p - > vel . X = MulScale ( p - > vel . X , gs . playerfriction , 16 ) ;
2021-12-30 11:18:56 +00:00
p - > vel . Y = MulScale ( p - > vel . Y , gs . playerfriction , 16 ) ;
2020-05-19 07:03:07 +00:00
}
}
else
2021-11-18 16:34:31 +00:00
if ( psectp - > floorpicnum = = RRTILE3073 | | psectp - > floorpicnum = = RRTILE2702 )
2020-05-19 07:03:07 +00:00
{
if ( p - > OnMotorcycle )
{
if ( p - > on_ground )
{
2021-12-30 11:14:55 +00:00
p - > vel . X = MulScale ( p - > vel . X , gs . playerfriction - 0x1800 , 16 ) ;
2021-12-30 11:18:56 +00:00
p - > vel . Y = MulScale ( p - > vel . Y , gs . playerfriction - 0x1800 , 16 ) ;
2020-05-19 07:03:07 +00:00
}
}
else
if ( p - > boot_amount > 0 )
p - > boot_amount - - ;
else
{
2021-12-30 11:14:55 +00:00
p - > vel . X = MulScale ( p - > vel . X , gs . playerfriction - 0x1800 , 16 ) ;
2021-12-30 11:18:56 +00:00
p - > vel . Y = MulScale ( p - > vel . Y , gs . playerfriction - 0x1800 , 16 ) ;
2020-05-19 07:03:07 +00:00
}
}
2021-12-30 11:18:56 +00:00
if ( abs ( p - > vel . X ) < 2048 & & abs ( p - > vel . Y ) < 2048 )
p - > vel . X = p - > vel . Y = 0 ;
2020-05-19 07:03:07 +00:00
if ( shrunk )
{
2021-12-30 11:14:55 +00:00
p - > vel . X =
MulScale ( p - > vel . X , gs . playerfriction - ( gs . playerfriction > > 1 ) + ( gs . playerfriction > > 2 ) , 16 ) ;
2021-12-30 11:18:56 +00:00
p - > vel . Y =
MulScale ( p - > vel . Y , gs . playerfriction - ( gs . playerfriction > > 1 ) + ( gs . playerfriction > > 2 ) , 16 ) ;
2020-05-19 07:03:07 +00:00
}
}
HORIZONLY :
if ( psectlotag = = 1 | | p - > spritebridge = = 1 ) i = ( 4L < < 8 ) ;
else i = ( 20L < < 8 ) ;
2021-11-21 07:56:39 +00:00
if ( p - > insector ( ) & & p - > cursector - > lotag = = 2 ) k = 0 ;
2020-05-19 07:03:07 +00:00
else k = 1 ;
2020-10-25 07:25:45 +00:00
Collision clip { } ;
2020-05-19 07:03:07 +00:00
if ( ud . clipping )
{
2022-02-05 12:12:19 +00:00
p - > player_add_int_xy ( { p - > vel . X > > 14 , p - > vel . Y > > 14 } ) ;
2022-02-04 17:11:44 +00:00
updatesector ( p - > player_int_pos ( ) . X , p - > player_int_pos ( ) . Y , & p - > cursector ) ;
2021-11-26 20:52:01 +00:00
ChangeActorSect ( pact , p - > cursector ) ;
2020-05-19 07:03:07 +00:00
}
else
2022-02-05 12:29:21 +00:00
clipmove ( p - > pos , & p - > cursector , p - > vel . X , p - > vel . Y , 164 , ( 4 < < 8 ) , i , CLIPMASK0 , clip ) ;
2020-05-19 07:03:07 +00:00
if ( p - > jetpack_on = = 0 & & psectlotag ! = 2 & & psectlotag ! = 1 & & shrunk )
2022-02-05 12:40:30 +00:00
p - > pos . Z + = 32 ;
2020-05-19 07:03:07 +00:00
2020-10-25 07:50:03 +00:00
if ( clip . type ! = kHitNone )
checkplayerhurt_r ( p , clip ) ;
2020-05-19 07:03:07 +00:00
else if ( isRRRA ( ) & & p - > hurt_delay2 > 0 )
p - > hurt_delay2 - - ;
2020-10-25 07:50:03 +00:00
if ( clip . type = = kHitWall )
2020-05-19 07:03:07 +00:00
{
2021-11-26 12:41:15 +00:00
auto wal = clip . hitWall ;
2020-05-19 07:03:07 +00:00
if ( p - > OnMotorcycle )
{
2021-11-18 16:34:31 +00:00
onMotorcycleMove ( snum , wal ) ;
2020-05-19 07:03:07 +00:00
}
else if ( p - > OnBoat )
{
2021-11-18 16:34:31 +00:00
onBoatMove ( snum , psectlotag , wal ) ;
2020-05-19 07:03:07 +00:00
}
else
{
2021-11-17 21:48:48 +00:00
if ( wal - > lotag > = 40 & & wal - > lotag < = 44 )
2020-05-19 07:03:07 +00:00
{
2021-11-17 21:48:48 +00:00
if ( wal - > lotag < 44 )
2020-05-19 07:03:07 +00:00
{
2021-11-26 12:41:15 +00:00
dofurniture ( clip . hitWall , p - > cursector , snum ) ;
2022-08-21 13:47:44 +00:00
pushmove ( p - > pos , & p - > cursector , 172 , ( 4 < < 8 ) , ( 4 < < 8 ) , CLIPMASK0 ) ;
2020-05-19 07:03:07 +00:00
}
else
2022-08-21 13:47:44 +00:00
pushmove ( p - > pos , & p - > cursector , 172 , ( 4 < < 8 ) , ( 4 < < 8 ) , CLIPMASK0 ) ;
2020-05-19 07:03:07 +00:00
}
}
}
2020-10-25 07:50:03 +00:00
if ( clip . type = = kHitSprite )
2020-05-19 07:03:07 +00:00
{
if ( p - > OnMotorcycle )
{
2021-11-26 12:41:15 +00:00
onMotorcycleHit ( snum , clip . actor ( ) ) ;
2020-05-19 07:03:07 +00:00
}
else if ( p - > OnBoat )
{
2021-11-26 12:41:15 +00:00
onBoatHit ( snum , clip . actor ( ) ) ;
2020-05-19 07:03:07 +00:00
}
2021-11-26 12:41:15 +00:00
else if ( badguy ( clip . actor ( ) ) )
2020-11-05 06:30:56 +00:00
{
2021-12-21 17:19:45 +00:00
if ( clip . actor ( ) - > spr . statnum ! = 1 )
2020-05-19 07:03:07 +00:00
{
2021-11-26 12:41:15 +00:00
clip . actor ( ) - > timetosleep = 0 ;
2021-12-21 17:19:45 +00:00
if ( clip . actor ( ) - > spr . picnum = = BILLYRAY )
2021-11-26 12:41:15 +00:00
S_PlayActorSound ( 404 , clip . actor ( ) ) ;
2020-11-05 06:30:56 +00:00
else
2021-11-26 12:41:15 +00:00
check_fta_sounds_r ( clip . actor ( ) ) ;
2021-11-26 20:52:01 +00:00
ChangeActorStat ( clip . actor ( ) , 1 ) ;
2020-05-19 07:03:07 +00:00
}
2020-11-05 06:30:56 +00:00
}
2021-12-21 17:19:45 +00:00
else if ( ! isRRRA ( ) & & clip . actor ( ) - > spr . picnum = = RRTILE3410 )
2020-11-05 06:30:56 +00:00
{
quickkill ( p ) ;
S_PlayActorSound ( 446 , pact ) ;
}
if ( isRRRA ( ) )
{
2021-12-21 17:19:45 +00:00
if ( clip . actor ( ) - > spr . picnum = = RRTILE3410 )
2020-11-05 06:30:56 +00:00
{
quickkill ( p ) ;
S_PlayActorSound ( 446 , pact ) ;
}
2021-12-21 17:19:45 +00:00
else if ( clip . actor ( ) - > spr . picnum = = RRTILE2443 & & clip . actor ( ) - > spr . pal = = 19 )
2020-11-05 06:30:56 +00:00
{
2021-12-21 17:19:45 +00:00
clip . actor ( ) - > spr . pal = 0 ;
2020-11-05 06:30:56 +00:00
p - > DrugMode = 5 ;
2021-12-21 17:19:45 +00:00
ps [ snum ] . GetActor ( ) - > spr . extra = gs . max_player_health ;
2020-11-05 06:30:56 +00:00
}
}
2020-05-19 07:03:07 +00:00
}
if ( p - > jetpack_on = = 0 )
{
2021-12-21 19:50:51 +00:00
if ( pact - > spr . xvel > 16 )
2020-05-19 07:03:07 +00:00
{
if ( psectlotag ! = ST_1_ABOVE_WATER & & psectlotag ! = ST_2_UNDERWATER & & p - > on_ground & & ( ! isRRRA ( ) | | ! p - > sea_sick_stat ) )
{
p - > pycount + = 52 ;
p - > pycount & = 2047 ;
p - > pyoff =
2021-12-21 19:50:51 +00:00
abs ( pact - > spr . xvel * bsin ( p - > pycount ) ) / 1596 ;
2020-05-19 07:03:07 +00:00
}
}
else if ( psectlotag ! = ST_2_UNDERWATER & & psectlotag ! = 1 & & ( ! isRRRA ( ) | | ! p - > sea_sick_stat ) )
p - > pyoff = 0 ;
}
// RBG***
2022-02-06 21:56:25 +00:00
SetActor ( pact , p - > pos . plusZ ( gs . playerheight ) ) ;
2020-05-19 07:03:07 +00:00
if ( psectlotag = = 800 & & ( ! isRRRA ( ) | | ! p - > lotag800kill ) )
{
if ( isRRRA ( ) ) p - > lotag800kill = 1 ;
quickkill ( p ) ;
return ;
}
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 = = ST_31_TWO_WAY_TRAIN )
2020-05-19 07:03:07 +00:00
{
2021-12-05 23:50:33 +00:00
auto act = barrier_cast < DDukeActor * > ( psectp - > hitagactor ) ;
2021-12-21 17:19:45 +00:00
if ( act & & act - > spr . xvel & & act - > temp_data [ 0 ] = = 0 )
2020-05-19 07:03:07 +00:00
{
quickkill ( p ) ;
return ;
}
}
}
2022-02-04 17:06:08 +00:00
if ( truefdist < gs . int_playerheight & & p - > on_ground & & psectlotag ! = 1 & & shrunk = = 0 & & p - > insector ( ) & & p - > cursector - > lotag = = 1 )
2020-10-25 07:12:25 +00:00
if ( ! S_CheckActorSoundPlaying ( pact , DUKE_ONWATER ) )
2021-11-21 07:56:39 +00:00
if ( ! isRRRA ( ) | | ( ! p - > OnBoat & & ! p - > OnMotorcycle & & p - > cursector - > hitag ! = 321 ) )
2020-10-25 07:12:25 +00:00
S_PlayActorSound ( DUKE_ONWATER , pact ) ;
2020-05-19 07:03: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-19 07:03:07 +00:00
2022-01-04 23:39:09 +00:00
int retry = 0 ;
while ( ud . clipping = = 0 )
2020-05-19 07:03:07 +00:00
{
2022-01-04 23:39:09 +00:00
int blocked ;
2021-12-21 19:50:51 +00:00
if ( pact - > spr . clipdist = = 64 )
2022-02-05 12:29:21 +00:00
blocked = ( pushmove ( p - > pos , & p - > cursector , 128 , ( 4 < < 8 ) , ( 4 < < 8 ) , CLIPMASK0 ) < 0 & & furthestangle ( p - > GetActor ( ) , 8 ) < 512 ) ;
2020-05-19 07:03:07 +00:00
else
2022-02-05 12:29:21 +00:00
blocked = ( pushmove ( p - > pos , & p - > cursector , 16 , ( 4 < < 8 ) , ( 4 < < 8 ) , CLIPMASK0 ) < 0 & & furthestangle ( p - > GetActor ( ) , 8 ) < 512 ) ;
2020-05-19 07:03:07 +00:00
2022-02-03 23:55:12 +00:00
if ( fabs ( pact - > floorz - pact - > ceilingz ) < 48 | | blocked )
2020-05-19 07:03: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-19 07:03:07 +00:00
{
2022-01-04 23:39:09 +00:00
if ( ! retry + + )
{
2022-02-05 12:29:21 +00:00
p - > pos = p - > opos = oldpos ;
2022-01-04 23:39:09 +00:00
continue ;
}
2020-05-19 07:03:07 +00:00
quickkill ( p ) ;
return ;
}
}
2021-11-18 16:34:31 +00:00
else if ( abs ( fz - cz ) < ( 32 < < 8 ) & & 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-19 07:03:07 +00:00
}
2022-08-28 09:34:54 +00:00
if ( ud . clipping = = 0 & & ( ! p - > cursector | | ( p - > cursector & & p - > cursector - > ceilingz > ( p - > cursector - > floorz - 12 ) ) ) )
2020-05-19 07:03:07 +00:00
{
quickkill ( p ) ;
return ;
}
2020-08-27 22:03:35 +00:00
if ( actions & SB_CENTERVIEW | | p - > hard_landing )
2020-05-19 07:03:07 +00:00
{
playerCenterView ( snum ) ;
}
2020-08-29 11:32:14 +00:00
else if ( actions & SB_LOOK_UP )
2020-05-19 07:03:07 +00:00
{
2020-08-28 22:57:07 +00:00
playerLookUp ( snum , actions ) ;
2020-05-19 07:03:07 +00:00
}
2020-08-29 11:32:14 +00:00
else if ( actions & SB_LOOK_DOWN )
2020-05-19 07:03:07 +00:00
{
2020-08-28 22:57:07 +00:00
playerLookDown ( snum , actions ) ;
2020-05-19 07:03:07 +00:00
}
2020-08-29 11:32:14 +00:00
else if ( ( actions & SB_AIM_UP ) & & ! p - > OnMotorcycle )
2020-05-19 07:03:07 +00:00
{
2020-08-28 22:57:07 +00:00
playerAimUp ( snum , actions ) ;
2020-05-19 07:03:07 +00:00
}
2020-08-29 11:32:14 +00:00
else if ( ( actions & SB_AIM_DOWN ) & & ! p - > OnMotorcycle )
2020-05-19 07:03:07 +00:00
{
2020-08-28 22:57:07 +00:00
playerAimDown ( snum , actions ) ;
2020-05-19 07:03:07 +00:00
}
if ( p - > recoil & & p - > kickback_pic = = 0 )
{
2021-11-07 13:36:39 +00:00
int d = p - > recoil > > 1 ;
2020-05-19 07:03:07 +00:00
if ( ! d )
d = 1 ;
p - > recoil - = d ;
2022-05-30 10:35:41 +00:00
p - > horizon . addadjustment ( buildhoriz ( - d ) ) ;
2020-05-19 07:03:07 +00:00
}
2020-08-05 07:53:22 +00:00
2020-11-30 22:40:16 +00:00
if ( SyncInput ( ) )
2020-05-19 07:03:07 +00:00
{
2021-05-02 20:37:46 +00:00
p - > horizon . applyinput ( GetPlayerHorizon ( snum ) , & actions ) ;
2020-05-19 07:03:07 +00:00
}
2020-11-29 08:00:00 +00:00
p - > checkhardlanding ( ) ;
2020-08-05 07:53:22 +00:00
2020-05-19 07:03:07 +00:00
//Shooting code/changes
if ( p - > show_empty_weapon > 0 )
p - > show_empty_weapon - - ;
if ( p - > show_empty_weapon = = 1 )
{
fi . addweapon ( p , p - > last_full_weapon ) ;
return ;
}
2020-10-23 17:50:18 +00:00
dokneeattack ( snum , { FEM10 , NAKED1 , STATUE } ) ;
2020-05-19 07:03: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-19 07:03: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-19 07:03:07 +00:00
}
else p - > weapon_pos - - ;
}
2021-11-18 19:17:47 +00:00
processweapon ( snum , actions , psectp ) ;
2020-05-19 07:54:52 +00:00
}
2020-05-19 07:03:07 +00:00
2020-05-22 06:56:42 +00:00
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2022-02-07 10:04:19 +00:00
void OnMotorcycle ( player_struct * p , DDukeActor * motosprite )
2020-05-22 06:56:42 +00:00
{
2021-11-21 07:56:39 +00:00
if ( ! p - > OnMotorcycle & & ! ( p - > cursector - > lotag = = 2 ) )
2020-07-20 21:21:27 +00:00
{
if ( motosprite )
{
2022-02-05 12:40:30 +00:00
p - > pos . X = motosprite - > spr . pos . X ;
p - > pos . Y = motosprite - > spr . pos . Y ;
2022-08-28 03:15:31 +00:00
p - > angle . ang = motosprite - > spr . angle ;
2020-10-28 06:30:17 +00:00
p - > ammo_amount [ MOTORCYCLE_WEAPON ] = motosprite - > saved_ammo ;
2020-07-20 21:21:27 +00:00
deletesprite ( motosprite ) ;
}
p - > over_shoulder_on = 0 ;
p - > OnMotorcycle = 1 ;
p - > last_full_weapon = p - > curr_weapon ;
p - > curr_weapon = MOTORCYCLE_WEAPON ;
2021-05-15 08:23:50 +00:00
p - > gotweapon [ MOTORCYCLE_WEAPON ] = true ;
2021-12-30 11:14:55 +00:00
p - > vel . X = 0 ;
2021-12-30 11:18:56 +00:00
p - > vel . Y = 0 ;
2020-10-07 06:12:37 +00:00
p - > horizon . horiz = q16horiz ( 0 ) ;
2020-07-20 21:21:27 +00:00
}
2020-10-27 05:50:06 +00:00
if ( ! S_CheckActorSoundPlaying ( p - > GetActor ( ) , 186 ) )
S_PlayActorSound ( 186 , p - > GetActor ( ) ) ;
2020-05-22 06:56:42 +00:00
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2022-02-07 10:04:19 +00:00
void OffMotorcycle ( player_struct * p )
2020-05-22 06:56:42 +00:00
{
2020-11-02 19:24:07 +00:00
auto pact = p - > GetActor ( ) ;
2020-07-20 21:21:27 +00:00
if ( p - > OnMotorcycle )
{
2020-11-02 19:24:07 +00:00
if ( S_CheckActorSoundPlaying ( pact , 188 ) )
S_StopSound ( 188 , pact ) ;
if ( S_CheckActorSoundPlaying ( pact , 187 ) )
S_StopSound ( 187 , pact ) ;
if ( S_CheckActorSoundPlaying ( pact , 186 ) )
S_StopSound ( 186 , pact ) ;
if ( S_CheckActorSoundPlaying ( pact , 214 ) )
S_StopSound ( 214 , pact ) ;
if ( ! S_CheckActorSoundPlaying ( pact , 42 ) )
S_PlayActorSound ( 42 , pact ) ;
2020-07-20 21:21:27 +00:00
p - > OnMotorcycle = 0 ;
2021-05-15 08:23:50 +00:00
p - > gotweapon [ MOTORCYCLE_WEAPON ] = false ;
2020-07-20 21:21:27 +00:00
p - > curr_weapon = p - > last_full_weapon ;
checkavailweapon ( p ) ;
2020-10-07 06:12:37 +00:00
p - > horizon . horiz = q16horiz ( 0 ) ;
2020-07-20 21:21:27 +00:00
p - > moto_do_bump = 0 ;
p - > MotoSpeed = 0 ;
p - > TiltStatus = 0 ;
p - > moto_drink = 0 ;
p - > VBumpTarget = 0 ;
p - > VBumpNow = 0 ;
p - > TurbCount = 0 ;
2022-08-23 19:25:05 +00:00
p - > vel . X = 0 - p - > angle . ang . Cos ( ) * ( 1 < < 7 ) ;
p - > vel . Y = 0 - p - > angle . ang . Sin ( ) * ( 1 < < 7 ) ;
2020-07-20 21:21:27 +00:00
p - > moto_underwater = 0 ;
2020-10-23 19:53:39 +00:00
auto spawned = spawn ( p - > GetActor ( ) , EMPTYBIKE ) ;
2021-11-19 11:32:12 +00:00
if ( spawned )
{
2022-08-28 22:02:17 +00:00
spawned - > spr . angle = p - > angle . ang ;
2022-08-27 13:09:51 +00:00
spawned - > spr . xvel + = p - > angle . ang . Cos ( ) * ( 1 < < 7 ) ;
spawned - > spr . yvel + = p - > angle . ang . Sin ( ) * ( 1 < < 7 ) ;
2021-11-19 11:32:12 +00:00
spawned - > saved_ammo = p - > ammo_amount [ MOTORCYCLE_WEAPON ] ;
}
2020-07-20 21:21:27 +00:00
}
2020-05-22 06:56:42 +00:00
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2022-02-07 10:04:19 +00:00
void OnBoat ( player_struct * p , DDukeActor * boat )
2020-05-22 06:56:42 +00:00
{
2020-07-20 21:21:27 +00:00
if ( ! p - > OnBoat )
{
2020-10-23 19:53:39 +00:00
if ( boat )
2020-07-20 21:21:27 +00:00
{
2022-02-05 12:40:30 +00:00
p - > pos . X = boat - > spr . pos . X ;
p - > pos . Y = boat - > spr . pos . Y ;
2022-08-28 03:15:31 +00:00
p - > angle . ang = boat - > spr . angle ;
2020-10-28 06:30:17 +00:00
p - > ammo_amount [ BOAT_WEAPON ] = boat - > saved_ammo ;
2020-10-23 19:53:39 +00:00
deletesprite ( boat ) ;
2020-07-20 21:21:27 +00:00
}
p - > over_shoulder_on = 0 ;
p - > OnBoat = 1 ;
p - > last_full_weapon = p - > curr_weapon ;
p - > curr_weapon = BOAT_WEAPON ;
2021-05-15 08:23:50 +00:00
p - > gotweapon [ BOAT_WEAPON ] = true ;
2021-12-30 11:14:55 +00:00
p - > vel . X = 0 ;
2021-12-30 11:18:56 +00:00
p - > vel . Y = 0 ;
2020-10-07 06:12:37 +00:00
p - > horizon . horiz = q16horiz ( 0 ) ;
2020-07-20 21:21:27 +00:00
}
2020-05-22 06:56:42 +00:00
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
2022-02-07 10:04:19 +00:00
void OffBoat ( player_struct * p )
2020-05-22 06:56:42 +00:00
{
2020-07-20 21:21:27 +00:00
if ( p - > OnBoat )
{
p - > OnBoat = 0 ;
2021-05-15 08:23:50 +00:00
p - > gotweapon [ BOAT_WEAPON ] = false ;
2020-07-20 21:21:27 +00:00
p - > curr_weapon = p - > last_full_weapon ;
checkavailweapon ( p ) ;
2020-10-07 06:12:37 +00:00
p - > horizon . horiz = q16horiz ( 0 ) ;
2020-05-22 06:56:42 +00:00
p - > moto_do_bump = 0 ;
p - > MotoSpeed = 0 ;
2020-07-20 21:21:27 +00:00
p - > TiltStatus = 0 ;
p - > moto_drink = 0 ;
p - > VBumpTarget = 0 ;
p - > VBumpNow = 0 ;
p - > TurbCount = 0 ;
2022-08-23 19:25:05 +00:00
p - > vel . X = 0 - p - > angle . ang . Cos ( ) * ( 1 < < 7 ) ;
p - > vel . Y = 0 - p - > angle . ang . Sin ( ) * ( 1 < < 7 ) ;
2020-07-20 21:21:27 +00:00
p - > moto_underwater = 0 ;
2020-10-23 19:53:39 +00:00
auto spawned = spawn ( p - > GetActor ( ) , EMPTYBOAT ) ;
2021-11-19 11:32:12 +00:00
if ( spawned )
{
2022-08-28 22:02:17 +00:00
spawned - > spr . angle = p - > angle . ang ;
2022-08-27 13:09:51 +00:00
spawned - > spr . xvel + = p - > angle . ang . Cos ( ) * ( 1 < < 7 ) ;
spawned - > spr . yvel + = p - > angle . ang . Sin ( ) * ( 1 < < 7 ) ;
2021-11-19 11:32:12 +00:00
spawned - > saved_ammo = p - > ammo_amount [ BOAT_WEAPON ] ;
}
2020-07-20 21:21:27 +00:00
}
2020-05-22 06:56:42 +00:00
}
2020-05-14 10:14:03 +00:00
END_DUKE_NS