2020-05-17 06:51:49 +00:00
//-------------------------------------------------------------------------
/*
Copyright ( C ) 1996 , 2003 - 3 D Realms Entertainment
Copyright ( C ) 2000 , 2003 - Matt Saettler ( EDuke Enhancements )
2020-06-28 07:03:31 +00:00
Copyright ( C ) 2020 - Christoph Oelckers
2020-05-17 06:51:49 +00:00
This file is part of Enhanced Duke Nukem 3 D version 1.5 - Atomic Edition
Duke Nukem 3 D is free software ; you can redistribute it and / or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation ; either version 2
of the License , or ( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE .
See the GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
2020-05-17 11:51:18 +00:00
Foundation , Inc . , 59 Temple Place - Suite 330 , Boston , MA 02111 - 1307 , USA .
2020-05-17 06:51:49 +00:00
Original Source : 1996 - Todd Replogle
Prepared for public release : 03 / 21 / 2003 - Charlie Wiederhold , 3 D Realms
EDuke enhancements integrated : 04 / 13 / 2003 - Matt Saettler
Note : EDuke source was in transition . Changes are in - progress in the
source as it is released .
*/
//-------------------------------------------------------------------------
# include "ns.h"
# include "global.h"
2020-08-24 18:34:18 +00:00
# include "gamecontrol.h"
2020-08-31 17:18:53 +00:00
# include "v_video.h"
2020-10-21 08:48:38 +00:00
# include "dukeactor.h"
2020-05-17 06:51:49 +00:00
2020-07-17 18:56:10 +00:00
BEGIN_DUKE_NS
2020-05-17 06:51:49 +00:00
2020-07-18 11:27:24 +00:00
// State timer counters.
static int turnheldtime ;
static int lastcontroltime ;
2020-08-29 19:20:10 +00:00
static InputPacket loc ; // input accumulation buffer.
2020-07-18 11:27:24 +00:00
2020-05-17 06:51:49 +00:00
//---------------------------------------------------------------------------
//
2020-05-17 11:25:39 +00:00
// handles all HUD related input, i.e. inventory item selection and activation plus weapon selection.
//
// Note: This doesn't restrict the events to WW2GI - since the other games do
// not define any by default there is no harm done keeping the code clean.
2020-05-17 06:51:49 +00:00
//
//---------------------------------------------------------------------------
2020-05-17 11:25:39 +00:00
2020-11-01 16:57:40 +00:00
void hud_input ( int plnum )
2020-05-17 11:25:39 +00:00
{
int i , k ;
uint8_t dainv ;
struct player_struct * p ;
short unk ;
unk = 0 ;
2020-11-01 16:57:40 +00:00
p = & ps [ plnum ] ;
2020-11-02 19:23:48 +00:00
auto pact = p - > GetActor ( ) ;
2020-05-17 11:25:39 +00:00
i = p - > aim_mode ;
2020-11-01 16:57:40 +00:00
p - > aim_mode = ! PlayerInput ( plnum , SB_AIMMODE ) ;
2020-05-17 11:25:39 +00:00
if ( p - > aim_mode < i )
2020-09-24 14:09:31 +00:00
p - > sync . actions | = SB_CENTERVIEW ;
2020-05-17 11:25:39 +00:00
2020-08-03 03:28:16 +00:00
// Backup weapon here as hud_input() is the first function where any one of the weapon variables can change.
backupweapon ( p ) ;
2020-08-02 13:00:53 +00:00
2020-05-17 11:25:39 +00:00
if ( isRR ( ) )
{
2020-11-01 16:57:40 +00:00
if ( PlayerInput ( plnum , SB_QUICK_KICK ) & & p - > last_pissed_time = = 0 )
2020-05-17 11:25:39 +00:00
{
2020-10-23 19:40:49 +00:00
if ( ! isRRRA ( ) | | p - > GetActor ( ) - > s . extra > 0 )
2020-05-17 11:25:39 +00:00
{
p - > last_pissed_time = 4000 ;
2020-11-02 19:23:48 +00:00
S_PlayActorSound ( 437 , pact ) ;
2020-10-23 19:40:49 +00:00
if ( p - > GetActor ( ) - > s . extra < = max_player_health - max_player_health / 10 )
2020-05-17 11:25:39 +00:00
{
2020-10-23 19:40:49 +00:00
p - > GetActor ( ) - > s . extra + = 2 ;
p - > last_extra = p - > GetActor ( ) - > s . extra ;
2020-05-17 11:25:39 +00:00
}
2020-10-23 19:40:49 +00:00
else if ( p - > GetActor ( ) - > s . extra < max_player_health )
p - > GetActor ( ) - > s . extra = max_player_health ;
2020-05-17 11:25:39 +00:00
}
}
}
else
{
2020-11-01 16:57:40 +00:00
if ( PlayerInput ( plnum , SB_QUICK_KICK ) & & p - > quick_kick = = 0 & & ( p - > curr_weapon ! = KNEE_WEAPON | | p - > kickback_pic = = 0 ) )
2020-05-17 11:25:39 +00:00
{
2020-11-01 17:23:09 +00:00
SetGameVarID ( g_iReturnVarID , 0 , nullptr , plnum ) ;
2020-11-01 16:57:40 +00:00
OnEvent ( EVENT_QUICKKICK , plnum , nullptr , - 1 ) ;
2020-11-01 17:23:09 +00:00
if ( GetGameVarID ( g_iReturnVarID , nullptr , plnum ) = = 0 )
2020-05-17 11:25:39 +00:00
{
p - > quick_kick = 14 ;
2020-11-01 16:57:40 +00:00
if ( ! p - > quick_kick_msg & & plnum = = screenpeek ) FTA ( QUOTE_MIGHTY_FOOT , p ) ;
2020-07-28 18:43:33 +00:00
p - > quick_kick_msg = true ;
2020-05-17 11:25:39 +00:00
}
}
}
2020-11-01 16:57:40 +00:00
if ( ! PlayerInput ( plnum , SB_QUICK_KICK ) ) p - > quick_kick_msg = false ;
2020-05-17 11:25:39 +00:00
2020-11-01 16:57:40 +00:00
if ( ! PlayerInputBits ( plnum , SB_INTERFACE_BITS ) )
2020-05-17 11:25:39 +00:00
p - > interface_toggle_flag = 0 ;
else if ( p - > interface_toggle_flag = = 0 )
{
p - > interface_toggle_flag = 1 ;
2020-05-17 11:51:18 +00:00
// Don't go on if paused or dead.
2020-07-15 16:10:31 +00:00
if ( paused ) return ;
2020-10-23 19:40:49 +00:00
if ( p - > GetActor ( ) - > s . extra < = 0 ) return ;
2020-05-17 11:51:18 +00:00
// Activate an inventory item. This just forwards to the other inventory bits. If the inventory selector was taken out of the playsim this could be removed.
2020-11-02 23:20:51 +00:00
if ( PlayerInput ( plnum , SB_INVUSE ) & & p - > newOwner = = nullptr )
2020-05-17 11:25:39 +00:00
{
2020-11-01 17:23:09 +00:00
SetGameVarID ( g_iReturnVarID , 0 , nullptr , plnum ) ;
2020-11-01 16:57:40 +00:00
OnEvent ( EVENT_INVENTORY , plnum , nullptr , - 1 ) ;
2020-11-01 17:23:09 +00:00
if ( GetGameVarID ( g_iReturnVarID , nullptr , plnum ) = = 0 )
2020-05-17 11:25:39 +00:00
{
2020-11-01 16:57:40 +00:00
if ( p - > inven_icon > ICON_NONE & & p - > inven_icon < = ICON_HEATS ) PlayerSetItemUsed ( plnum , p - > inven_icon ) ;
2020-05-17 11:25:39 +00:00
}
}
2020-11-01 16:57:40 +00:00
if ( ! isRR ( ) & & PlayerUseItem ( plnum , ICON_HEATS ) )
2020-05-17 11:25:39 +00:00
{
2020-11-01 17:23:09 +00:00
SetGameVarID ( g_iReturnVarID , 0 , nullptr , plnum ) ;
2020-11-01 16:57:40 +00:00
OnEvent ( EVENT_USENIGHTVISION , plnum , nullptr , - 1 ) ;
2020-11-01 17:23:09 +00:00
if ( GetGameVarID ( g_iReturnVarID , nullptr , plnum ) = = 0 & & p - > heat_amount > 0 )
2020-05-17 11:51:18 +00:00
{
p - > heat_on = ! p - > heat_on ;
p - > inven_icon = 5 ;
2020-11-02 19:23:48 +00:00
S_PlayActorSound ( NITEVISION_ONOFF , pact ) ;
2020-05-17 11:51:18 +00:00
FTA ( 106 + ( ! p - > heat_on ) , p ) ;
}
2020-05-17 11:25:39 +00:00
}
2020-11-01 16:57:40 +00:00
if ( PlayerUseItem ( plnum , ICON_STEROIDS ) )
2020-05-17 11:25:39 +00:00
{
2020-11-01 17:23:09 +00:00
SetGameVarID ( g_iReturnVarID , 0 , nullptr , plnum ) ;
2020-11-01 16:57:40 +00:00
OnEvent ( EVENT_USESTEROIDS , plnum , nullptr , - 1 ) ;
2020-11-01 17:23:09 +00:00
if ( GetGameVarID ( g_iReturnVarID , nullptr , plnum ) = = 0 )
2020-05-17 11:25:39 +00:00
{
2020-05-17 11:51:18 +00:00
if ( p - > steroids_amount = = 400 )
{
p - > steroids_amount - - ;
2020-11-02 19:23:48 +00:00
S_PlayActorSound ( DUKE_TAKEPILLS , pact ) ;
2020-05-17 11:51:18 +00:00
p - > inven_icon = ICON_STEROIDS ;
FTA ( 12 , p ) ;
}
2020-05-17 11:25:39 +00:00
}
2020-05-17 11:51:18 +00:00
return ;
2020-05-17 11:25:39 +00:00
}
2020-11-01 16:57:40 +00:00
if ( PlayerInput ( plnum , SB_INVPREV ) | | PlayerInput ( plnum , SB_INVNEXT ) )
2020-05-17 11:51:18 +00:00
{
p - > invdisptime = 26 * 2 ;
2020-05-17 11:25:39 +00:00
2020-11-01 16:57:40 +00:00
if ( PlayerInput ( plnum , SB_INVNEXT ) ) k = 1 ;
2020-05-17 11:51:18 +00:00
else k = 0 ;
2020-05-17 11:25:39 +00:00
2020-05-17 11:51:18 +00:00
dainv = p - > inven_icon ;
2020-05-17 11:25:39 +00:00
2020-05-17 11:51:18 +00:00
i = 0 ;
CHECKINV1 :
2020-05-17 11:25:39 +00:00
2020-05-17 11:51:18 +00:00
if ( i < 9 )
2020-05-17 11:25:39 +00:00
{
2020-05-17 11:51:18 +00:00
i + + ;
switch ( dainv )
{
case 4 :
if ( p - > jetpack_amount > 0 & & i > 1 )
break ;
if ( k ) dainv = 5 ;
else dainv = 3 ;
goto CHECKINV1 ;
case 6 :
if ( p - > scuba_amount > 0 & & i > 1 )
break ;
if ( k ) dainv = 7 ;
else dainv = 5 ;
goto CHECKINV1 ;
case 2 :
if ( p - > steroids_amount > 0 & & i > 1 )
break ;
if ( k ) dainv = 3 ;
else dainv = 1 ;
goto CHECKINV1 ;
case 3 :
if ( p - > holoduke_amount > 0 & & i > 1 )
break ;
if ( k ) dainv = 4 ;
else dainv = 2 ;
goto CHECKINV1 ;
case 0 :
case 1 :
if ( p - > firstaid_amount > 0 & & i > 1 )
break ;
if ( k ) dainv = 2 ;
else dainv = 7 ;
goto CHECKINV1 ;
case 5 :
if ( p - > heat_amount > 0 & & i > 1 )
break ;
if ( k ) dainv = 6 ;
else dainv = 4 ;
goto CHECKINV1 ;
case 7 :
if ( p - > boot_amount > 0 & & i > 1 )
break ;
if ( k ) dainv = 1 ;
else dainv = 6 ;
goto CHECKINV1 ;
}
2020-05-17 11:25:39 +00:00
}
2020-05-17 11:51:18 +00:00
else dainv = 0 ;
2020-05-17 11:25:39 +00:00
2020-05-17 11:51:18 +00:00
// These events force us to keep the inventory selector in the playsim as opposed to the UI where it really belongs.
2020-11-01 16:57:40 +00:00
if ( PlayerInput ( plnum , SB_INVPREV ) )
2020-05-17 11:51:18 +00:00
{
2020-11-01 17:23:09 +00:00
SetGameVarID ( g_iReturnVarID , dainv , nullptr , plnum ) ;
2020-11-01 16:57:40 +00:00
OnEvent ( EVENT_INVENTORYLEFT , plnum , nullptr , - 1 ) ;
2020-11-01 17:23:09 +00:00
dainv = GetGameVarID ( g_iReturnVarID , nullptr , plnum ) ;
2020-05-17 11:51:18 +00:00
}
2020-11-01 16:57:40 +00:00
if ( PlayerInput ( plnum , SB_INVNEXT ) )
2020-05-17 11:51:18 +00:00
{
2020-11-01 17:23:09 +00:00
SetGameVarID ( g_iReturnVarID , dainv , nullptr , plnum ) ;
2020-11-01 16:57:40 +00:00
OnEvent ( EVENT_INVENTORYRIGHT , plnum , nullptr , - 1 ) ;
2020-11-01 17:23:09 +00:00
dainv = GetGameVarID ( g_iReturnVarID , nullptr , plnum ) ;
2020-05-17 11:51:18 +00:00
}
p - > inven_icon = dainv ;
// Someone must have really hated constant data, doing this with a switch/case (and of course also with literal numbers...)
static const uint8_t invquotes [ ] = { QUOTE_MEDKIT , QUOTE_STEROIDS , QUOTE_HOLODUKE , QUOTE_JETPACK , QUOTE_NVG , QUOTE_SCUBA , QUOTE_BOOTS } ;
if ( dainv > = 1 & & dainv < 8 ) FTA ( invquotes [ dainv - 1 ] , p ) ;
2020-05-17 11:25:39 +00:00
}
2020-11-01 16:57:40 +00:00
int weap = PlayerNewWeapon ( plnum ) ;
2020-08-26 22:53:35 +00:00
if ( weap > 1 & & p - > kickback_pic > 0 )
p - > wantweaponfire = weap - 1 ;
2020-05-17 11:25:39 +00:00
// Here we have to be extra careful that the weapons do not get mixed up, so let's keep the code for Duke and RR completely separate.
2020-11-01 16:57:40 +00:00
fi . selectweapon ( plnum , weap ) ;
2020-05-17 11:25:39 +00:00
2020-11-01 16:57:40 +00:00
if ( PlayerInput ( plnum , SB_HOLSTER ) )
2020-05-17 11:25:39 +00:00
{
if ( p - > curr_weapon > KNEE_WEAPON )
{
if ( p - > holster_weapon = = 0 & & p - > weapon_pos = = 0 )
{
p - > holster_weapon = 1 ;
p - > weapon_pos = - 1 ;
FTA ( QUOTE_WEAPON_LOWERED , p ) ;
}
else if ( p - > holster_weapon = = 1 & & p - > weapon_pos = = - 9 )
{
p - > holster_weapon = 0 ;
p - > weapon_pos = 10 ;
FTA ( QUOTE_WEAPON_RAISED , p ) ;
}
}
}
2020-11-02 23:20:51 +00:00
if ( PlayerUseItem ( plnum , ICON_HOLODUKE ) & & ( isRR ( ) | | p - > newOwner = = nullptr ) )
2020-05-17 11:25:39 +00:00
{
2020-11-01 17:23:09 +00:00
SetGameVarID ( g_iReturnVarID , 0 , nullptr , plnum ) ;
2020-11-01 16:57:40 +00:00
OnEvent ( EVENT_HOLODUKEON , plnum , nullptr , - 1 ) ;
2020-11-01 17:23:09 +00:00
if ( GetGameVarID ( g_iReturnVarID , nullptr , plnum ) = = 0 )
2020-05-17 11:25:39 +00:00
{
2020-05-17 11:51:18 +00:00
if ( ! isRR ( ) )
2020-05-17 11:25:39 +00:00
{
2020-10-21 08:48:38 +00:00
if ( p - > holoduke_on = = nullptr )
2020-05-17 11:25:39 +00:00
{
2020-05-17 11:51:18 +00:00
if ( p - > holoduke_amount > 0 )
{
p - > inven_icon = 3 ;
2020-10-23 17:02:58 +00:00
auto pactor =
2020-05-17 11:51:18 +00:00
EGS ( p - > cursectnum ,
p - > posx ,
p - > posy ,
2020-10-23 17:02:58 +00:00
p - > posz + ( 30 < < 8 ) , TILE_APLAYER , - 64 , 0 , 0 , p - > angle . ang . asbuild ( ) , 0 , 0 , nullptr , 10 ) ;
pactor - > temp_data [ 3 ] = pactor - > temp_data [ 4 ] = 0 ;
p - > holoduke_on = pactor ;
pactor - > s . yvel = plnum ;
pactor - > s . extra = 0 ;
2020-08-31 18:01:55 +00:00
FTA ( QUOTE_HOLODUKE_ON , p ) ;
2020-08-31 18:04:20 +00:00
S_PlayActorSound ( TELEPORTER , p - > holoduke_on ) ;
2020-05-17 11:51:18 +00:00
}
2020-08-31 18:01:55 +00:00
else FTA ( QUOTE_HOLODUKE_NOT_FOUND , p ) ;
2020-05-17 11:25:39 +00:00
}
2020-05-17 11:51:18 +00:00
else
{
2020-07-25 07:32:54 +00:00
S_PlayActorSound ( TELEPORTER , p - > holoduke_on ) ;
2020-10-21 08:48:38 +00:00
p - > holoduke_on = nullptr ;
2020-08-31 18:01:55 +00:00
FTA ( QUOTE_HOLODUKE_OFF , p ) ;
2020-05-17 11:51:18 +00:00
}
2020-05-17 11:25:39 +00:00
}
2020-05-17 11:51:18 +00:00
else // In RR this means drinking whiskey.
2020-05-17 11:25:39 +00:00
{
2020-10-23 19:40:49 +00:00
if ( p - > holoduke_amount > 0 & & p - > GetActor ( ) - > s . extra < max_player_health )
2020-05-17 11:51:18 +00:00
{
p - > holoduke_amount - = 400 ;
2020-10-23 19:40:49 +00:00
p - > GetActor ( ) - > s . extra + = 5 ;
if ( p - > GetActor ( ) - > s . extra > max_player_health )
p - > GetActor ( ) - > s . extra = max_player_health ;
2020-05-17 11:51:18 +00:00
p - > drink_amt + = 5 ;
p - > inven_icon = 3 ;
if ( p - > holoduke_amount = = 0 )
checkavailinven ( p ) ;
2020-11-02 19:23:48 +00:00
if ( p - > drink_amt < 99 & & ! S_CheckActorSoundPlaying ( pact , 425 ) )
S_PlayActorSound ( 425 , pact ) ;
2020-05-17 11:51:18 +00:00
}
2020-05-17 11:25:39 +00:00
}
}
}
2020-11-02 23:20:51 +00:00
if ( isRR ( ) & & PlayerUseItem ( plnum , ICON_HEATS ) & & p - > newOwner = = nullptr )
2020-05-17 11:25:39 +00:00
{
2020-11-01 17:23:09 +00:00
SetGameVarID ( g_iReturnVarID , 0 , nullptr , plnum ) ;
2020-11-01 16:57:40 +00:00
OnEvent ( EVENT_USENIGHTVISION , plnum , nullptr , - 1 ) ;
2020-11-01 17:23:09 +00:00
if ( GetGameVarID ( g_iReturnVarID , nullptr , plnum ) = = 0 )
2020-05-17 11:25:39 +00:00
{
2020-05-17 11:51:18 +00:00
if ( p - > yehaa_timer = = 0 )
2020-05-17 11:25:39 +00:00
{
2020-05-17 11:51:18 +00:00
p - > yehaa_timer = 126 ;
2020-11-02 19:23:48 +00:00
S_PlayActorSound ( 390 , pact ) ;
2020-05-17 11:51:18 +00:00
p - > noise_radius = 16384 ;
2020-11-01 16:57:40 +00:00
madenoise ( plnum ) ;
2020-05-17 11:51:18 +00:00
if ( sector [ p - > cursectnum ] . lotag = = 857 )
2020-05-17 11:25:39 +00:00
{
2020-10-23 19:40:49 +00:00
if ( p - > GetActor ( ) - > s . extra < = max_player_health )
2020-05-17 11:51:18 +00:00
{
2020-10-23 19:40:49 +00:00
p - > GetActor ( ) - > s . extra + = 10 ;
if ( p - > GetActor ( ) - > s . extra > = max_player_health )
p - > GetActor ( ) - > s . extra = max_player_health ;
2020-05-17 11:51:18 +00:00
}
2020-05-17 11:25:39 +00:00
}
2020-05-17 11:51:18 +00:00
else
2020-05-17 11:25:39 +00:00
{
2020-10-23 19:40:49 +00:00
if ( p - > GetActor ( ) - > s . extra + 1 < = max_player_health )
2020-05-17 11:51:18 +00:00
{
2020-10-23 19:40:49 +00:00
p - > GetActor ( ) - > s . extra + + ;
2020-05-17 11:51:18 +00:00
}
2020-05-17 11:25:39 +00:00
}
}
}
}
2020-11-01 16:57:40 +00:00
if ( PlayerUseItem ( plnum , ICON_FIRSTAID ) )
2020-05-17 11:25:39 +00:00
{
2020-11-01 17:23:09 +00:00
SetGameVarID ( g_iReturnVarID , 0 , nullptr , plnum ) ;
2020-11-01 16:57:40 +00:00
OnEvent ( EVENT_USEMEDKIT , plnum , nullptr , - 1 ) ;
2020-11-01 17:23:09 +00:00
if ( GetGameVarID ( g_iReturnVarID , nullptr , plnum ) = = 0 )
2020-05-17 11:25:39 +00:00
{
2020-10-23 19:40:49 +00:00
if ( p - > firstaid_amount > 0 & & p - > GetActor ( ) - > s . extra < max_player_health )
2020-05-17 11:25:39 +00:00
{
2020-05-17 11:51:18 +00:00
if ( ! isRR ( ) )
2020-05-17 11:25:39 +00:00
{
2020-10-23 19:40:49 +00:00
int j = max_player_health - p - > GetActor ( ) - > s . extra ;
2020-05-17 11:51:18 +00:00
if ( ( unsigned int ) p - > firstaid_amount > j )
{
p - > firstaid_amount - = j ;
2020-10-23 19:40:49 +00:00
p - > GetActor ( ) - > s . extra = max_player_health ;
2020-05-17 11:51:18 +00:00
p - > inven_icon = 1 ;
}
else
{
2020-10-23 19:40:49 +00:00
p - > GetActor ( ) - > s . extra + = p - > firstaid_amount ;
2020-05-17 11:51:18 +00:00
p - > firstaid_amount = 0 ;
checkavailinven ( p ) ;
}
2020-11-02 19:23:48 +00:00
S_PlayActorSound ( DUKE_USEMEDKIT , pact ) ;
2020-05-17 11:25:39 +00:00
}
else
{
2020-08-26 22:53:35 +00:00
int j = 10 ;
2020-05-17 11:51:18 +00:00
if ( p - > firstaid_amount > j )
{
p - > firstaid_amount - = j ;
2020-10-23 19:40:49 +00:00
p - > GetActor ( ) - > s . extra + = j ;
if ( p - > GetActor ( ) - > s . extra > max_player_health )
p - > GetActor ( ) - > s . extra = max_player_health ;
2020-05-17 11:51:18 +00:00
p - > inven_icon = 1 ;
}
else
{
2020-10-23 19:40:49 +00:00
p - > GetActor ( ) - > s . extra + = p - > firstaid_amount ;
2020-05-17 11:51:18 +00:00
p - > firstaid_amount = 0 ;
checkavailinven ( p ) ;
}
2020-10-23 19:40:49 +00:00
if ( p - > GetActor ( ) - > s . extra > max_player_health )
p - > GetActor ( ) - > s . extra = max_player_health ;
2020-05-17 11:51:18 +00:00
p - > drink_amt + = 10 ;
2020-11-02 19:23:48 +00:00
if ( p - > drink_amt < = 100 & & ! S_CheckActorSoundPlaying ( pact , DUKE_USEMEDKIT ) )
S_PlayActorSound ( DUKE_USEMEDKIT , pact ) ;
2020-05-17 11:25:39 +00:00
}
}
}
}
2020-11-02 23:20:51 +00:00
if ( PlayerUseItem ( plnum , ICON_JETPACK ) & & ( isRR ( ) | | p - > newOwner = = nullptr ) )
2020-05-17 11:25:39 +00:00
{
2020-11-01 17:23:09 +00:00
SetGameVarID ( g_iReturnVarID , 0 , nullptr , plnum ) ;
2020-11-01 16:57:40 +00:00
OnEvent ( EVENT_USEJETPACK , plnum , nullptr , - 1 ) ;
2020-11-01 17:23:09 +00:00
if ( GetGameVarID ( g_iReturnVarID , nullptr , plnum ) = = 0 )
2020-05-17 11:25:39 +00:00
{
2020-05-17 11:51:18 +00:00
if ( ! isRR ( ) )
2020-05-17 11:25:39 +00:00
{
2020-05-17 11:51:18 +00:00
if ( p - > jetpack_amount > 0 )
2020-05-17 11:25:39 +00:00
{
2020-05-17 11:51:18 +00:00
p - > jetpack_on = ! p - > jetpack_on ;
if ( p - > jetpack_on )
{
p - > inven_icon = 4 ;
2020-11-02 19:23:48 +00:00
S_StopSound ( - 1 , pact , CHAN_VOICE ) ; // this will stop the falling scream
S_PlayActorSound ( DUKE_JETPACK_ON , pact ) ;
2020-05-17 11:51:18 +00:00
FTA ( QUOTE_JETPACK_ON , p ) ;
}
else
{
p - > hard_landing = 0 ;
p - > poszv = 0 ;
2020-11-02 19:23:48 +00:00
S_PlayActorSound ( DUKE_JETPACK_OFF , pact ) ;
S_StopSound ( DUKE_JETPACK_IDLE , pact ) ;
S_StopSound ( DUKE_JETPACK_ON , pact ) ;
2020-05-17 11:51:18 +00:00
FTA ( QUOTE_JETPACK_OFF , p ) ;
}
2020-05-17 11:25:39 +00:00
}
2020-05-17 11:51:18 +00:00
else FTA ( QUOTE_JETPACK_NOT_FOUND , p ) ;
2020-05-17 11:25:39 +00:00
}
2020-05-17 11:51:18 +00:00
else
2020-05-17 11:25:39 +00:00
{
2020-05-17 11:51:18 +00:00
// eat cow pie
2020-10-23 19:40:49 +00:00
if ( p - > jetpack_amount > 0 & & p - > GetActor ( ) - > s . extra < max_player_health )
2020-05-17 11:25:39 +00:00
{
2020-11-02 19:23:48 +00:00
if ( ! S_CheckActorSoundPlaying ( pact , 429 ) )
S_PlayActorSound ( 429 , pact ) ;
2020-05-17 11:51:18 +00:00
p - > jetpack_amount - = 100 ;
if ( p - > drink_amt > 0 )
{
p - > drink_amt - = 5 ;
if ( p - > drink_amt < 0 )
p - > drink_amt = 0 ;
}
if ( p - > eat < 100 )
{
p - > eat + = 5 ;
if ( p - > eat > 100 )
p - > eat = 100 ;
}
2020-10-23 19:40:49 +00:00
p - > GetActor ( ) - > s . extra + = 5 ;
2020-05-17 11:25:39 +00:00
2020-05-17 11:51:18 +00:00
p - > inven_icon = 4 ;
2020-05-17 11:25:39 +00:00
2020-10-23 19:40:49 +00:00
if ( p - > GetActor ( ) - > s . extra > max_player_health )
p - > GetActor ( ) - > s . extra = max_player_health ;
2020-05-17 11:25:39 +00:00
2020-05-17 11:51:18 +00:00
if ( p - > jetpack_amount < = 0 )
checkavailinven ( p ) ;
}
2020-05-17 11:25:39 +00:00
}
}
}
2020-11-01 16:57:40 +00:00
if ( PlayerInput ( plnum , SB_TURNAROUND ) & & p - > angle . spin . asbam ( ) = = 0 & & p - > on_crane = = nullptr )
2020-05-17 11:25:39 +00:00
{
2020-11-01 17:23:09 +00:00
SetGameVarID ( g_iReturnVarID , 0 , nullptr , plnum ) ;
2020-11-01 16:57:40 +00:00
OnEvent ( EVENT_TURNAROUND , plnum , nullptr , - 1 ) ;
2020-11-01 17:23:09 +00:00
if ( GetGameVarID ( g_iReturnVarID , nullptr , plnum ) ! = 0 )
2020-05-17 11:51:18 +00:00
{
2020-09-24 14:09:31 +00:00
p - > sync . actions & = ~ SB_TURNAROUND ;
2020-05-17 11:51:18 +00:00
}
2020-05-17 11:25:39 +00:00
}
}
}
2020-07-16 16:58:31 +00:00
2020-07-17 22:34:20 +00:00
//---------------------------------------------------------------------------
//
2020-07-18 07:59:16 +00:00
// Main input routine.
// This includes several input improvements from EDuke32, but this code
// has been mostly rewritten completely to make it clearer and reduce redundancy.
2020-07-17 22:34:20 +00:00
//
//---------------------------------------------------------------------------
2020-07-16 16:58:31 +00:00
enum
{
2020-10-15 08:47:14 +00:00
TURBOTURNTIME = ( TICRATE / 8 ) , // 7
2020-07-17 22:34:20 +00:00
NORMALTURN = 15 ,
PREAMBLETURN = 5 ,
NORMALKEYMOVE = 40 ,
MAXVEL = ( ( NORMALKEYMOVE * 2 ) + 10 ) ,
MAXSVEL = ( ( NORMALKEYMOVE * 2 ) + 10 ) ,
2020-10-15 08:47:14 +00:00
MAXANGVEL = 1024 , // 127
MAXHORIZVEL = 256 , // 127
2020-07-17 22:34:20 +00:00
2020-11-06 05:34:46 +00:00
MAXVELMOTO = 120 ,
VEHICLETURN = 20
2020-07-16 16:58:31 +00:00
} ;
2020-07-16 20:49:26 +00:00
//---------------------------------------------------------------------------
//
2020-07-17 22:34:20 +00:00
// handles the input bits
2020-07-16 20:49:26 +00:00
//
//---------------------------------------------------------------------------
2020-09-06 10:17:54 +00:00
static void processInputBits ( player_struct * p , ControlInfo * const hidInput )
2020-07-16 20:49:26 +00:00
{
2020-11-07 07:16:16 +00:00
// Set-up crouch bools.
int const sectorLotag = p - > cursectnum ! = - 1 ? sector [ p - > cursectnum ] . lotag : 0 ;
bool const crouchable = sectorLotag ! = ST_2_UNDERWATER & & ( sectorLotag ! = ST_1_ABOVE_WATER | | p - > spritebridge ) ;
bool const disableToggle = p - > jetpack_on | | ( ! crouchable & & p - > on_ground ) | | ( isRRRA ( ) & & ( p - > OnMotorcycle | | p - > OnBoat ) ) ;
ApplyGlobalInput ( loc , hidInput , crouchable , disableToggle ) ;
2020-08-29 19:09:04 +00:00
if ( isRR ( ) & & ( loc . actions & SB_CROUCH ) ) loc . actions & = ~ SB_JUMP ;
2020-08-28 20:51:05 +00:00
2020-08-29 11:32:14 +00:00
if ( p - > OnMotorcycle | | p - > OnBoat )
2020-08-27 22:03:35 +00:00
{
// mask out all actions not compatible with vehicles.
2020-08-29 19:09:04 +00:00
loc . actions & = ~ ( SB_WEAPONMASK_BITS | SB_TURNAROUND | SB_CENTERVIEW | SB_HOLSTER | SB_JUMP | SB_CROUCH | SB_RUN |
2020-08-29 11:32:14 +00:00
SB_AIM_UP | SB_AIM_DOWN | SB_AIMMODE | SB_LOOK_UP | SB_LOOK_DOWN | SB_LOOK_LEFT | SB_LOOK_RIGHT ) ;
2020-07-16 20:49:26 +00:00
}
2020-08-29 11:32:14 +00:00
else
{
if ( buttonMap . ButtonDown ( gamefunc_Quick_Kick ) ) // this shares a bit with another function so cannot be in the common code.
2020-08-29 19:09:04 +00:00
loc . actions | = SB_QUICK_KICK ;
2020-07-17 18:56:10 +00:00
2020-08-29 19:09:04 +00:00
if ( ( isRR ( ) & & p - > drink_amt > 88 ) ) loc . actions | = SB_LOOK_LEFT ;
if ( ( isRR ( ) & & p - > drink_amt > 99 ) ) loc . actions | = SB_LOOK_DOWN ;
2020-08-29 11:32:14 +00:00
}
2020-07-16 21:32:00 +00:00
}
2020-07-18 11:27:24 +00:00
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
int getticssincelastupdate ( )
{
2020-08-31 17:23:05 +00:00
int tics = lastcontroltime = = 0 | | ud . levelclock < lastcontroltime ? 0 : ud . levelclock - lastcontroltime ;
lastcontroltime = ud . levelclock ;
2020-07-18 11:27:24 +00:00
return tics ;
}
2020-07-16 17:16:56 +00:00
//---------------------------------------------------------------------------
//
2020-07-17 22:34:20 +00:00
// split out for readability
2020-07-16 17:16:56 +00:00
//
//---------------------------------------------------------------------------
2020-11-06 05:34:46 +00:00
static double motoApplyTurn ( player_struct * p , ControlInfo * const hidInput , bool const kbdLeft , bool const kbdRight , double const factor )
2020-07-16 17:16:56 +00:00
{
2020-11-06 05:34:46 +00:00
double turnvel = 0 ;
2020-08-04 07:10:44 +00:00
p - > oTiltStatus = p - > TiltStatus ;
2020-07-24 10:46:20 +00:00
2020-07-16 17:16:56 +00:00
if ( p - > MotoSpeed = = 0 | | ! p - > on_ground )
{
2020-07-18 11:27:24 +00:00
turnheldtime = 0 ;
lastcontroltime = 0 ;
2020-11-06 05:34:46 +00:00
if ( kbdLeft | | hidInput - > mouseturnx < 0 | | hidInput - > dyaw < 0 )
2020-07-16 17:16:56 +00:00
{
2020-11-06 05:34:46 +00:00
p - > TiltStatus - = factor ;
2020-07-16 17:16:56 +00:00
if ( p - > TiltStatus < - 10 )
p - > TiltStatus = - 10 ;
}
2020-11-06 05:34:46 +00:00
else if ( kbdRight | | hidInput - > mouseturnx > 0 | | hidInput - > dyaw > 0 )
2020-07-16 17:16:56 +00:00
{
2020-11-06 05:34:46 +00:00
p - > TiltStatus + = factor ;
2020-07-16 17:16:56 +00:00
if ( p - > TiltStatus > 10 )
p - > TiltStatus = 10 ;
}
}
else
{
2020-11-06 05:34:46 +00:00
if ( kbdLeft | | kbdRight | | p - > moto_drink | | hidInput - > mouseturnx | | hidInput - > dyaw )
2020-07-16 17:16:56 +00:00
{
2020-11-06 05:34:46 +00:00
auto const baseVel = ( buttonMap . ButtonDown ( gamefunc_Move_Backward ) | | hidInput - > dz < 0 ) & & p - > MotoSpeed < = 0 ? - VEHICLETURN : VEHICLETURN ;
int tics = getticssincelastupdate ( ) ;
if ( kbdLeft | | p - > moto_drink < 0 | | hidInput - > mouseturnx < 0 | | hidInput - > dyaw < 0 )
2020-07-16 17:16:56 +00:00
{
2020-07-24 10:46:20 +00:00
turnheldtime + = tics ;
2020-11-06 05:34:46 +00:00
p - > TiltStatus - = factor ;
2020-07-24 10:46:20 +00:00
if ( p - > TiltStatus < - 10 )
p - > TiltStatus = - 10 ;
2020-11-06 05:34:46 +00:00
if ( kbdLeft )
2020-11-06 22:48:26 +00:00
turnvel - = turnheldtime > = TURBOTURNTIME & & p - > MotoSpeed > 0 ? baseVel : baseVel * ( 3. / 10. ) ;
2020-11-06 05:34:46 +00:00
if ( hidInput - > mouseturnx < 0 )
2020-11-06 22:48:26 +00:00
turnvel - = sqrt ( ( p - > MotoSpeed > 0 ? baseVel : baseVel * ( 3. / 10. ) ) * - ( hidInput - > mouseturnx / factor ) * 2. ) ;
2020-11-06 05:34:46 +00:00
if ( hidInput - > dyaw < 0 )
turnvel + = ( p - > MotoSpeed > 0 ? baseVel : baseVel * ( 3. / 10. ) ) * hidInput - > dyaw ;
2020-07-16 17:16:56 +00:00
}
2020-07-24 10:46:20 +00:00
2020-11-06 05:34:46 +00:00
if ( kbdRight | | p - > moto_drink > 0 | | hidInput - > mouseturnx > 0 | | hidInput - > dyaw > 0 )
2020-07-16 17:16:56 +00:00
{
2020-07-24 10:46:20 +00:00
turnheldtime + = tics ;
2020-11-06 05:34:46 +00:00
p - > TiltStatus + = factor ;
2020-07-24 10:46:20 +00:00
if ( p - > TiltStatus > 10 )
p - > TiltStatus = 10 ;
2020-11-06 05:34:46 +00:00
if ( kbdRight )
turnvel + = turnheldtime > = TURBOTURNTIME & & p - > MotoSpeed > 0 ? baseVel : baseVel * ( 3. / 10. ) ;
if ( hidInput - > mouseturnx > 0 )
2020-11-06 22:48:26 +00:00
turnvel + = sqrt ( ( p - > MotoSpeed > 0 ? baseVel : baseVel * ( 3. / 10. ) ) * ( hidInput - > mouseturnx / factor ) * 2. ) ;
2020-11-06 05:34:46 +00:00
if ( hidInput - > dyaw > 0 )
turnvel + = ( p - > MotoSpeed > 0 ? baseVel : baseVel * ( 3. / 10. ) ) * hidInput - > dyaw ;
2020-07-16 17:16:56 +00:00
}
}
else
{
turnheldtime = 0 ;
2020-07-18 11:27:24 +00:00
lastcontroltime = 0 ;
2020-07-16 17:16:56 +00:00
if ( p - > TiltStatus > 0 )
2020-11-06 05:34:46 +00:00
p - > TiltStatus - = factor ;
2020-07-16 17:16:56 +00:00
else if ( p - > TiltStatus < 0 )
2020-11-06 05:34:46 +00:00
p - > TiltStatus + = factor ;
2020-07-16 17:16:56 +00:00
}
}
2020-07-24 23:51:52 +00:00
if ( fabs ( p - > TiltStatus ) < factor )
p - > TiltStatus = 0 ;
2020-07-24 10:46:20 +00:00
return turnvel * factor ;
2020-07-16 17:16:56 +00:00
}
2020-07-16 16:58:31 +00:00
//---------------------------------------------------------------------------
//
2020-07-16 17:16:56 +00:00
// same for the boat
2020-07-16 16:58:31 +00:00
//
//---------------------------------------------------------------------------
2020-11-06 05:34:46 +00:00
static double boatApplyTurn ( player_struct * p , ControlInfo * const hidInput , bool const kbdLeft , bool const kbdRight , double const factor )
2020-07-16 16:58:31 +00:00
{
2020-11-06 05:34:46 +00:00
double turnvel = 0 ;
p - > oTiltStatus = p - > TiltStatus ;
2020-07-16 16:58:31 +00:00
if ( p - > MotoSpeed )
{
2020-11-06 05:34:46 +00:00
if ( kbdLeft | | kbdRight | | p - > moto_drink | | hidInput - > mouseturnx | | hidInput - > dyaw )
2020-07-16 16:58:31 +00:00
{
2020-11-06 05:34:46 +00:00
double const velScale = 6. / 19. ;
auto const baseVel = ! p - > NotOnWater ? VEHICLETURN : VEHICLETURN * velScale ;
int tics = getticssincelastupdate ( ) ;
if ( kbdLeft | | p - > moto_drink < 0 | | hidInput - > mouseturnx < 0 | | hidInput - > dyaw < 0 )
2020-07-16 16:58:31 +00:00
{
2020-07-24 11:27:47 +00:00
turnheldtime + = tics ;
2020-11-06 05:34:46 +00:00
2020-07-24 11:27:47 +00:00
if ( ! p - > NotOnWater )
{
2020-11-06 05:34:46 +00:00
p - > TiltStatus - = factor ;
2020-07-24 11:27:47 +00:00
if ( p - > TiltStatus < - 10 )
p - > TiltStatus = - 10 ;
}
2020-11-06 05:34:46 +00:00
2020-11-06 06:11:15 +00:00
if ( kbdLeft )
2020-11-06 05:34:46 +00:00
turnvel - = turnheldtime > = TURBOTURNTIME ? baseVel : baseVel * velScale ;
if ( hidInput - > mouseturnx < 0 )
2020-11-06 22:48:26 +00:00
turnvel - = sqrt ( baseVel * - ( hidInput - > mouseturnx / factor ) * 2. ) ;
2020-11-06 05:34:46 +00:00
if ( hidInput - > dyaw < 0 )
turnvel + = baseVel * hidInput - > dyaw ;
2020-07-16 16:58:31 +00:00
}
2020-07-24 11:27:47 +00:00
2020-11-06 05:34:46 +00:00
if ( kbdRight | | p - > moto_drink > 0 | | hidInput - > mouseturnx > 0 | | hidInput - > dyaw > 0 )
2020-07-16 16:58:31 +00:00
{
2020-07-24 11:27:47 +00:00
turnheldtime + = tics ;
2020-11-06 05:34:46 +00:00
2020-07-24 11:27:47 +00:00
if ( ! p - > NotOnWater )
{
2020-11-06 05:34:46 +00:00
p - > TiltStatus + = factor ;
2020-07-24 11:27:47 +00:00
if ( p - > TiltStatus > 10 )
p - > TiltStatus = 10 ;
}
2020-11-06 05:34:46 +00:00
if ( kbdRight )
turnvel + = turnheldtime > = TURBOTURNTIME ? baseVel : baseVel * velScale ;
if ( hidInput - > mouseturnx > 0 )
2020-11-06 22:48:26 +00:00
turnvel + = sqrt ( baseVel * ( hidInput - > mouseturnx / factor ) * 2. ) ;
2020-11-06 05:34:46 +00:00
if ( hidInput - > dyaw > 0 )
turnvel + = baseVel * hidInput - > dyaw ;
2020-07-16 16:58:31 +00:00
}
}
else if ( ! p - > NotOnWater )
{
turnheldtime = 0 ;
2020-07-18 11:27:24 +00:00
lastcontroltime = 0 ;
2020-07-16 16:58:31 +00:00
if ( p - > TiltStatus > 0 )
2020-11-06 05:34:46 +00:00
p - > TiltStatus - = factor ;
2020-07-16 16:58:31 +00:00
else if ( p - > TiltStatus < 0 )
2020-11-06 05:34:46 +00:00
p - > TiltStatus + = factor ;
2020-07-16 16:58:31 +00:00
}
}
2020-07-24 11:27:47 +00:00
else if ( ! p - > NotOnWater )
2020-07-18 11:27:24 +00:00
{
turnheldtime = 0 ;
lastcontroltime = 0 ;
2020-07-24 11:27:47 +00:00
if ( p - > TiltStatus > 0 )
2020-11-06 05:34:46 +00:00
p - > TiltStatus - = factor ;
2020-07-24 11:27:47 +00:00
else if ( p - > TiltStatus < 0 )
2020-11-06 05:34:46 +00:00
p - > TiltStatus + = factor ;
2020-07-18 11:27:24 +00:00
}
2020-07-24 11:27:47 +00:00
2020-07-24 11:38:11 +00:00
if ( fabs ( p - > TiltStatus ) < factor )
2020-07-24 11:27:47 +00:00
p - > TiltStatus = 0 ;
return turnvel * factor ;
2020-07-16 16:58:31 +00:00
}
2020-07-17 18:56:10 +00:00
//---------------------------------------------------------------------------
//
// much of this was rewritten from scratch to make the logic easier to follow.
//
//---------------------------------------------------------------------------
2020-11-06 05:34:46 +00:00
static void processVehicleInput ( player_struct * p , ControlInfo * const hidInput , InputPacket & input , double const scaleAdjust )
2020-07-17 18:56:10 +00:00
{
2020-11-06 05:34:46 +00:00
bool const kbdLeft = buttonMap . ButtonDown ( gamefunc_Turn_Left ) | | buttonMap . ButtonDown ( gamefunc_Strafe_Left ) ;
bool const kbdRight = buttonMap . ButtonDown ( gamefunc_Turn_Right ) | | buttonMap . ButtonDown ( gamefunc_Strafe_Right ) ;
p - > vehTurnLeft = kbdLeft | | hidInput - > mouseturnx < 0 | | hidInput - > dyaw < 0 ;
p - > vehTurnRight = kbdRight | | hidInput - > mouseturnx > 0 | | hidInput - > dyaw > 0 ;
2020-07-17 18:56:10 +00:00
2020-07-17 20:09:01 +00:00
if ( p - > OnBoat | | ! p - > moto_underwater )
{
2020-11-06 05:04:33 +00:00
p - > vehForwardScale = std : : min ( ( buttonMap . ButtonDown ( gamefunc_Move_Forward ) | | buttonMap . ButtonDown ( gamefunc_Strafe ) ) + hidInput - > dz , 1.f ) ;
p - > vehReverseScale = std : : min ( buttonMap . ButtonDown ( gamefunc_Move_Backward ) + - hidInput - > dz , 1.f ) ;
2020-11-04 23:07:39 +00:00
2020-08-29 19:09:04 +00:00
if ( loc . actions & SB_RUN )
loc . actions | = SB_CROUCH ;
2020-07-17 20:09:01 +00:00
}
2020-07-17 18:56:10 +00:00
2020-07-17 20:09:01 +00:00
if ( p - > OnMotorcycle )
{
2020-11-06 05:34:46 +00:00
input . avel = motoApplyTurn ( p , hidInput , kbdLeft , kbdRight , scaleAdjust ) ;
2020-07-17 20:09:01 +00:00
if ( p - > moto_underwater ) p - > MotoSpeed = 0 ;
}
else
{
2020-11-06 05:34:46 +00:00
input . avel = boatApplyTurn ( p , hidInput , kbdLeft , kbdRight , scaleAdjust ) ;
2020-07-17 20:09:01 +00:00
}
2020-07-17 18:56:10 +00:00
2020-11-04 22:17:18 +00:00
input . fvel = xs_CRoundToInt ( p - > MotoSpeed ) ;
2020-11-06 05:34:46 +00:00
input . avel * = ( 45. / 256. ) ;
loc . avel + = input . avel ;
2020-07-17 18:56:10 +00:00
}
2020-07-18 07:59:16 +00:00
//---------------------------------------------------------------------------
//
// finalizes the input and passes it to the global input buffer
//
//---------------------------------------------------------------------------
2020-08-29 19:09:04 +00:00
static void FinalizeInput ( int playerNum , InputPacket & input , bool vehicle )
2020-07-18 07:59:16 +00:00
{
auto p = & ps [ playerNum ] ;
2020-10-23 19:40:49 +00:00
bool blocked = movementBlocked ( playerNum ) | | p - > GetActor ( ) - > s . extra < = 0 | | ( p - > dead_flag & & ! ud . god ) ;
2020-07-18 07:59:16 +00:00
2020-11-02 23:20:51 +00:00
if ( blocked & & ps [ playerNum ] . newOwner = = nullptr )
2020-07-18 07:59:16 +00:00
{
2020-09-06 08:08:47 +00:00
// neutralize all movement when blocked or in automap follow mode
2020-08-29 19:09:04 +00:00
loc . fvel = loc . svel = 0 ;
2020-10-08 03:47:30 +00:00
loc . avel = loc . horz = 0 ;
input . avel = input . horz = 0 ;
2020-07-18 07:59:16 +00:00
}
else
{
2020-10-17 08:44:00 +00:00
if ( p - > on_crane = = nullptr )
2020-07-18 07:59:16 +00:00
{
if ( ! vehicle )
{
2020-08-29 19:09:04 +00:00
loc . fvel = clamp ( loc . fvel + input . fvel , - MAXVEL , MAXVEL ) ;
loc . svel = clamp ( loc . svel + input . svel , - MAXSVEL , MAXSVEL ) ;
2020-07-18 07:59:16 +00:00
}
else
2020-10-15 09:11:22 +00:00
loc . fvel = clamp ( input . fvel , - ( MAXVELMOTO > > 3 ) , MAXVELMOTO ) ;
2020-07-18 07:59:16 +00:00
}
2020-08-05 21:25:04 +00:00
else
{
2020-08-29 19:09:04 +00:00
loc . fvel = input . fvel = 0 ;
loc . svel = input . svel = 0 ;
2020-08-05 21:25:04 +00:00
}
2020-07-18 07:59:16 +00:00
2020-11-02 23:20:51 +00:00
if ( p - > on_crane = = nullptr & & p - > newOwner = = nullptr )
2020-07-18 07:59:16 +00:00
{
2020-10-08 03:47:30 +00:00
// input.avel already added to loc in processMovement()
loc . avel = clamp ( loc . avel , - MAXANGVEL , MAXANGVEL ) ;
if ( ! cl_syncinput & & input . avel )
2020-07-18 07:59:16 +00:00
{
2020-10-07 12:13:21 +00:00
p - > angle . spin = bamlook ( 0 ) ;
2020-07-18 07:59:16 +00:00
}
}
2020-08-05 21:25:04 +00:00
else
{
2020-10-08 03:47:30 +00:00
loc . avel = input . avel = 0 ;
2020-08-05 21:25:04 +00:00
}
2020-07-18 07:59:16 +00:00
2020-11-02 23:20:51 +00:00
if ( p - > newOwner = = nullptr & & ! ( p - > sync . actions & SB_CENTERVIEW ) )
2020-07-18 07:59:16 +00:00
{
2020-10-07 07:22:07 +00:00
// input.horz already added to loc in processMovement()
loc . horz = clamp ( loc . horz , - MAXHORIZVEL , MAXHORIZVEL ) ;
2020-07-18 07:59:16 +00:00
}
2020-08-05 21:25:04 +00:00
else
{
2020-10-07 07:22:07 +00:00
loc . horz = input . horz = 0 ;
2020-08-05 21:25:04 +00:00
}
2020-07-18 07:59:16 +00:00
}
}
2020-09-24 12:32:37 +00:00
2020-07-17 22:59:10 +00:00
//---------------------------------------------------------------------------
//
2020-09-24 12:32:37 +00:00
// External entry point
2020-07-17 22:59:10 +00:00
//
//---------------------------------------------------------------------------
2020-09-24 12:32:37 +00:00
void GameInterface : : GetInput ( InputPacket * packet , ControlInfo * const hidInput )
2020-07-17 22:59:10 +00:00
{
if ( paused )
{
loc = { } ;
return ;
}
2020-09-24 12:32:37 +00:00
auto const p = & ps [ myconnectindex ] ;
2020-07-17 22:59:10 +00:00
if ( numplayers = = 1 )
{
setlocalplayerinput ( p ) ;
}
2020-09-04 07:53:36 +00:00
double const scaleAdjust = InputScale ( ) ;
2020-08-26 15:12:48 +00:00
InputPacket input { } ;
2020-07-17 22:59:10 +00:00
if ( isRRRA ( ) & & ( p - > OnMotorcycle | | p - > OnBoat ) )
{
2020-09-06 10:17:54 +00:00
processInputBits ( p , hidInput ) ;
processVehicleInput ( p , hidInput , input , scaleAdjust ) ;
2020-08-29 19:09:04 +00:00
FinalizeInput ( myconnectindex , input , true ) ;
2020-07-17 22:59:10 +00:00
2020-10-23 19:40:49 +00:00
if ( ! cl_syncinput & & p - > GetActor ( ) - > s . extra > 0 )
2020-07-17 22:59:10 +00:00
{
2020-08-05 07:53:22 +00:00
apply_seasick ( p , scaleAdjust ) ;
2020-07-17 22:59:10 +00:00
}
}
else
{
2020-09-06 10:17:54 +00:00
processInputBits ( p , hidInput ) ;
2020-09-25 12:26:50 +00:00
processMovement ( & input , & loc , hidInput , scaleAdjust , p - > drink_amt ) ;
2020-08-29 19:09:04 +00:00
FinalizeInput ( myconnectindex , input , false ) ;
2020-08-05 07:53:22 +00:00
}
2020-07-17 22:59:10 +00:00
2020-08-05 07:53:22 +00:00
if ( ! cl_syncinput )
{
2020-10-23 17:02:58 +00:00
if ( p - > GetActor ( ) - > s . extra > 0 )
2020-09-21 05:51:33 +00:00
{
// Do these in the same order as the old code.
calcviewpitch ( p , scaleAdjust ) ;
2020-10-08 03:47:30 +00:00
processavel ( p , & input . avel ) ;
2020-11-07 07:16:16 +00:00
applylook ( & p - > angle , input . avel , & p - > sync . actions , scaleAdjust , p - > sync . actions & SB_CROUCH ) ;
2020-10-07 07:22:07 +00:00
sethorizon ( & p - > horizon . horiz , input . horz , & p - > sync . actions , scaleAdjust ) ;
2020-09-21 05:51:33 +00:00
}
2020-10-07 12:13:21 +00:00
p - > angle . processhelpers ( scaleAdjust ) ;
2020-10-07 06:12:37 +00:00
p - > horizon . processhelpers ( scaleAdjust ) ;
2020-07-17 22:59:10 +00:00
}
2020-07-17 20:09:01 +00:00
2020-08-29 19:20:10 +00:00
if ( packet )
{
auto const pPlayer = & ps [ myconnectindex ] ;
2020-10-07 12:13:21 +00:00
auto const ang = pPlayer - > angle . ang . asbuild ( ) ;
2020-08-29 19:20:10 +00:00
* packet = loc ;
auto fvel = loc . fvel ;
auto svel = loc . svel ;
2020-10-07 12:13:21 +00:00
packet - > fvel = mulscale9 ( fvel , sintable [ ( ang + 2560 ) & 2047 ] ) +
mulscale9 ( svel , sintable [ ( ang + 2048 ) & 2047 ] ) +
2020-08-29 19:20:10 +00:00
pPlayer - > fric . x ;
2020-10-07 12:13:21 +00:00
packet - > svel = mulscale9 ( fvel , sintable [ ( ang + 2048 ) & 2047 ] ) +
mulscale9 ( svel , sintable [ ( ang + 1536 ) & 2047 ] ) +
2020-08-29 19:20:10 +00:00
pPlayer - > fric . y ;
loc = { } ;
}
}
//---------------------------------------------------------------------------
//
2020-09-23 14:20:40 +00:00
// This is called from InputState::ClearAllInput and resets all static state being used here.
2020-08-29 19:20:10 +00:00
//
//---------------------------------------------------------------------------
2020-07-17 18:56:10 +00:00
void GameInterface : : clearlocalinputstate ( )
{
2020-08-29 19:20:10 +00:00
loc = { } ;
2020-07-18 11:27:24 +00:00
turnheldtime = 0 ;
lastcontroltime = 0 ;
2020-07-17 18:56:10 +00:00
}
2020-08-29 19:20:10 +00:00
2020-05-17 11:25:39 +00:00
END_DUKE_NS