- consolidated the finalizing parts of the input code and fully merged most of the bike/boat handlers.

Turned out that the only major difference was already split off into subfunctions.
This commit is contained in:
Christoph Oelckers 2020-07-17 22:09:01 +02:00
parent 61d08f41e0
commit 7bc2befc84
2 changed files with 94 additions and 223 deletions

View file

@ -721,27 +721,8 @@ void processCommonInput(ControlInfo &info, bool onVehicle)
if (buttonMap.ButtonDown(gamefunc_Fire)) loc.bits |= SKB_FIRE; if (buttonMap.ButtonDown(gamefunc_Fire)) loc.bits |= SKB_FIRE;
if (buttonMap.ButtonDown(gamefunc_Open)) loc.bits |= SKB_OPEN; if (buttonMap.ButtonDown(gamefunc_Open)) loc.bits |= SKB_OPEN;
#if 0 // These 3 bits are only available when not riding a bike or boat.
// todo: handle these with CCMDs instead.
if (buttonMap.ButtonDown(gamefunc_Inventory)) loc.bits |= SKB_INVENTORY;
if (buttonMap.ButtonDown(gamefunc_MedKit)) loc.bits |= SKB_MEDKIT;
if (buttonMap.ButtonDown(gamefunc_Steroids)) loc.bits |= SKB_STEROIDS;
if (buttonMap.ButtonDown(gamefunc_NightVision)) loc.bits |= SKB_NIGHTVISION;
if (buttonMap.ButtonDown(gamefunc_Holo_Duke)) loc.bits |= SKB_HOLODUKE;
if (buttonMap.ButtonDown(gamefunc_Jetpack)) loc.bits |= SKB_JETPACK;
//if (inputState.CheckPause()) loc.bits |= SKB_PAUSE;
if (buttonMap.ButtonDown(gamefunc_Inventory_Left)) loc.bits |= SKB_INV_LEFT;
if (buttonMap.ButtonDown(gamefunc_Inventory_Right)) loc.bits |= SKB_INV_RIGHT;
/*
loc.bits |= (buttonMap.ButtonDown(gamefunc_Center_View) << SK_CENTER_VIEW);
loc.bits |= buttonMap.ButtonDown(gamefunc_Holster_Weapon) << SK_HOLSTER;
loc.bits |= buttonMap.ButtonDown(gamefunc_TurnAround) << SK_TURNAROUND;
*/
#else
if (onVehicle) BitsToSend &= ~(SKB_HOLSTER|SKB_TURNAROUND|SKB_CENTER_VIEW); if (onVehicle) BitsToSend &= ~(SKB_HOLSTER|SKB_TURNAROUND|SKB_CENTER_VIEW);
#endif
if (buttonMap.ButtonDown(gamefunc_Dpad_Select)) if (buttonMap.ButtonDown(gamefunc_Dpad_Select))
{ {
@ -756,17 +737,13 @@ void processCommonInput(ControlInfo &info, bool onVehicle)
if (g_gameQuit) loc.bits |= SKB_GAMEQUIT; if (g_gameQuit) loc.bits |= SKB_GAMEQUIT;
//if (inputState.GetKeyStatus(sc_Escape)) loc.bits |= SKB_ESCAPE; fixme. This never gets here because the menu eats the escape key. //if (inputState.GetKeyStatus(sc_Escape)) loc.bits |= SKB_ESCAPE; fixme. This never gets here because the menu eats the escape key.
if (buttonMap.ButtonDown(gamefunc_Dpad_Aiming)) if (buttonMap.ButtonDown(gamefunc_Dpad_Aiming))
info.dz = 0; info.dz = 0;
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// //
// weapon selection bits. // weapon selection bits. Using CVARs now instead of buttons.
// This should all be remapped to CCMDs, except for the controller check
// For the next and prev weapon functions this is particularly necessary
// due to how the mouse wheel works.
// //
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -776,25 +753,6 @@ void processSelectWeapon(input_t& input)
WeaponToSend = 0; WeaponToSend = 0;
if (VOLUMEONE && (j >= 7 && j <= 10)) j = 0; if (VOLUMEONE && (j >= 7 && j <= 10)) j = 0;
#if 0 // must be removed once the CCMDs are hooked up
if (buttonMap.ButtonPressed(gamefunc_Weapon_1)) j = 1;
if (buttonMap.ButtonPressed(gamefunc_Weapon_2)) j = 2;
if (buttonMap.ButtonPressed(gamefunc_Weapon_3)) j = 3;
if (buttonMap.ButtonPressed(gamefunc_Weapon_4)) j = 4;
if (buttonMap.ButtonPressed(gamefunc_Weapon_5)) j = 5;
if (buttonMap.ButtonPressed(gamefunc_Weapon_6)) j = 6;
if (!VOLUMEONE)
{
if (buttonMap.ButtonPressed(gamefunc_Weapon_7)) j = 7;
if (buttonMap.ButtonPressed(gamefunc_Weapon_8)) j = 8;
if (buttonMap.ButtonPressed(gamefunc_Weapon_9)) j = 9;
if (buttonMap.ButtonPressed(gamefunc_Weapon_10)) j = 10;
}
if (buttonMap.ButtonPressed(gamefunc_Previous_Weapon)) j = 11;
if (buttonMap.ButtonPressed(gamefunc_Next_Weapon)) j = 12;
#endif
if (buttonMap.ButtonDown(gamefunc_Dpad_Select) && input.fvel < 0) j = 11; if (buttonMap.ButtonDown(gamefunc_Dpad_Select) && input.fvel < 0) j = 11;
if (buttonMap.ButtonDown(gamefunc_Dpad_Select) && input.fvel < 0) j = 12; if (buttonMap.ButtonDown(gamefunc_Dpad_Select) && input.fvel < 0) j = 12;
@ -963,43 +921,60 @@ static int boatApplyTurn(player_struct *p, int turnl, int turnr, int bike_turn,
// //
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void processBoatInput(player_struct *p, ControlInfo& info, input_t& input, double scaleAdjust) void processVehicleInput(player_struct *p, ControlInfo& info, input_t& input, double scaleAdjust)
{ {
auto boat_turn = info.mousex + scaleAdjust * info.dyaw * (1. / 32); // originally this was 64, not 32. Why the change? auto turnspeed = info.mousex + scaleAdjust * info.dyaw * (1. / 32); // originally this was 64, not 32. Why the change?
int turnl = buttonMap.ButtonDown(gamefunc_Turn_Left) || buttonMap.ButtonDown(gamefunc_Strafe_Left); int turnl = buttonMap.ButtonDown(gamefunc_Turn_Left) || buttonMap.ButtonDown(gamefunc_Strafe_Left);
int turnr = buttonMap.ButtonDown(gamefunc_Turn_Right) || buttonMap.ButtonDown(gamefunc_Strafe_Right); int turnr = buttonMap.ButtonDown(gamefunc_Turn_Right) || buttonMap.ButtonDown(gamefunc_Strafe_Right);
// Cancel out micro-movement // Cancel out micro-movement
const double turn_threshold = 1 / 65536.; const double turn_threshold = 1 / 65536.;
if (boat_turn < -turn_threshold) if (turnspeed < -turn_threshold)
turnl = 1; turnl = 1;
else if (boat_turn > turn_threshold) else if (turnspeed > turn_threshold)
turnr = 1; turnr = 1;
else else
boat_turn = 0; turnspeed = 0;
if (p->OnBoat || !p->moto_underwater)
{
if (buttonMap.ButtonDown(gamefunc_Move_Forward) || buttonMap.ButtonDown(gamefunc_Strafe)) if (buttonMap.ButtonDown(gamefunc_Move_Forward) || buttonMap.ButtonDown(gamefunc_Strafe))
loc.bits |= SKB_JUMP; loc.bits |= SKB_JUMP;
if (buttonMap.ButtonDown(gamefunc_Move_Backward)) if (buttonMap.ButtonDown(gamefunc_Move_Backward))
loc.bits |= SKB_AIM_UP; loc.bits |= SKB_AIM_UP;
if (buttonMap.ButtonDown(gamefunc_Run)) if (buttonMap.ButtonDown(gamefunc_Run))
loc.bits |= SKB_CROUCH; loc.bits |= SKB_CROUCH;
}
if (turnl) if (turnl)
loc.bits |= SKB_AIM_DOWN; loc.bits |= SKB_AIM_DOWN;
if (turnr) if (turnr)
loc.bits |= SKB_LOOK_LEFT; loc.bits |= SKB_LOOK_LEFT;
double turnvel = boatApplyTurn(p, turnl, turnr, boat_turn != 0, scaleAdjust) * scaleAdjust * 2; double turnvel;
if (p->OnMotorcycle)
{
bool moveBack = buttonMap.ButtonDown(gamefunc_Move_Backward) && p->MotoSpeed <= 0;
turnvel = motoApplyTurn(p, turnl, turnr, turnspeed, moveBack, scaleAdjust);
if (p->moto_underwater) p->MotoSpeed = 0;
}
else
{
turnvel = boatApplyTurn(p, turnl, turnr, turnspeed != 0, scaleAdjust) * scaleAdjust * 2;
}
// What is this? Optimization for playing with a mouse which the original did not have? // What is this? Optimization for playing with a mouse which the original did not have?
if (boat_turn) if (turnspeed)
turnvel *= clamp(boat_turn * boat_turn, 0., 1.); turnvel *= clamp(turnspeed * turnspeed, 0., 1.);
input.fvel = p->MotoSpeed; input.fvel = p->MotoSpeed;
input.q16avel = fix16_from_dbl(turnvel); input.q16avel = fix16_from_dbl(turnvel);
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// //
// CCMD based input. The basics are from Randi's ZDuke but this uses dynamic // CCMD based input. The basics are from Randi's ZDuke but this uses dynamic

View file

@ -31,7 +31,7 @@ fix16_t GetDeltaQ16Angle(fix16_t ang1, fix16_t ang2);
void processCommonInput(ControlInfo& info, bool onVehicle); void processCommonInput(ControlInfo& info, bool onVehicle);
void processSelectWeapon(input_t& input); void processSelectWeapon(input_t& input);
int motoApplyTurn(player_struct* p, int turnl, int turnr, int bike_turn, bool goback, double factor); int motoApplyTurn(player_struct* p, int turnl, int turnr, int bike_turn, bool goback, double factor);
void processBoatInput(player_struct* p, ControlInfo& info, input_t& input, double scaleAdjust); void processVehicleInput(player_struct* p, ControlInfo& info, input_t& input, double scaleAdjust);
int32_t PHEIGHT = PHEIGHT_DUKE; int32_t PHEIGHT = PHEIGHT_DUKE;
@ -88,6 +88,59 @@ static int P_CheckLockedMovement(int const playerNum)
return 0; return 0;
} }
void FinalizeInput(int playerNum, input_t &input, bool vehicle)
{
auto p = &ps[playerNum];
int const movementLocked = P_CheckLockedMovement(playerNum);
if ((ud.scrollmode && ud.overhead_on) || (movementLocked & IL_NOTHING) == IL_NOTHING)
{
if (ud.scrollmode && ud.overhead_on)
{
ud.folfvel = input.fvel;
ud.folavel = fix16_to_int(input.q16avel);
}
loc.fvel = loc.svel = 0;
loc.q16avel = loc.q16horz = 0;
}
else
{
if (!(movementLocked & IL_NOMOVE))
{
if (!vehicle)
{
loc.fvel = clamp(loc.fvel + input.fvel, -MAXVEL, MAXVEL);
loc.svel = clamp(loc.svel + input.svel, -MAXSVEL, MAXSVEL);
}
else
loc.fvel = clamp(input.fvel, -(MAXVELMOTO / 8), MAXVELMOTO);
}
if (!(movementLocked & IL_NOANGLE))
{
loc.q16avel = fix16_sadd(loc.q16avel, input.q16avel);
if (!synchronized_input)
{
p->q16ang = fix16_sadd(p->q16ang, input.q16avel) & 0x7FFFFFF;
if (input.q16avel)
{
p->one_eighty_count = 0;
}
}
}
if (!(movementLocked & IL_NOHORIZ))
{
loc.q16horz = fix16_clamp(fix16_sadd(loc.q16horz, input.q16horz), F16(-MAXHORIZVEL), F16(MAXHORIZVEL));
if (!synchronized_input)
p->q16horiz += input.q16horz; // will be clamped below in sethorizon.
}
}
}
double elapsedInputTicks = -1; double elapsedInputTicks = -1;
static double scaleAdjustmentToInterval(double x) static double scaleAdjustmentToInterval(double x)
@ -259,48 +312,8 @@ void P_GetInput(int const playerNum)
loc.bits |= SKB_LOOK_DOWN; loc.bits |= SKB_LOOK_DOWN;
} }
int const movementLocked = P_CheckLockedMovement(playerNum); FinalizeInput(playerNum, input, false);
if ((ud.scrollmode && ud.overhead_on) || (movementLocked & IL_NOTHING) == IL_NOTHING)
{
if (ud.scrollmode && ud.overhead_on)
{
ud.folfvel = input.fvel;
ud.folavel = fix16_to_int(input.q16avel);
}
loc.fvel = loc.svel = 0;
loc.q16avel = loc.q16horz = 0;
}
else
{
if (!(movementLocked & IL_NOMOVE))
{
loc.fvel = clamp(loc.fvel + input.fvel, -MAXVEL, MAXVEL);
loc.svel = clamp(loc.svel + input.svel, -MAXSVEL, MAXSVEL);
}
if (!(movementLocked & IL_NOANGLE))
{
loc.q16avel = fix16_sadd(loc.q16avel, input.q16avel);
if (!synchronized_input)
{
pPlayer->q16ang = fix16_sadd(pPlayer->q16ang, input.q16avel) & 0x7FFFFFF;
if (input.q16avel)
{
pPlayer->one_eighty_count = 0;
}
}
}
if (!(movementLocked & IL_NOHORIZ))
{
loc.q16horz = fix16_clamp(fix16_sadd(loc.q16horz, input.q16horz), F16(-MAXHORIZVEL), F16(MAXHORIZVEL));
if (!synchronized_input)
pPlayer->q16horiz += input.q16horz; // will be clamped below in sethorizon.
}
}
if (!synchronized_input) if (!synchronized_input)
{ {
// don't adjust rotscrnang and look_ang if dead. // don't adjust rotscrnang and look_ang if dead.
@ -316,98 +329,7 @@ void P_GetInput(int const playerNum)
} }
void P_GetInputMotorcycle(int playerNum) void P_GetInputVehicle(int playerNum)
{
auto &thisPlayer = g_player[playerNum];
auto const pPlayer = &ps[playerNum];
auto const pSprite = &sprite[pPlayer->i];
ControlInfo info;
double scaleAdjust = elapsedInputTicks * REALGAMETICSPERSEC / 1000.0;
bool mouseaim = in_mousemode || buttonMap.ButtonDown(gamefunc_Mouse_Aiming);
CONTROL_GetInput(&info);
// JBF: Run key behaviour is selectable
int const playerRunning = G_CheckAutorun(buttonMap.ButtonDown(gamefunc_Run));
int const keyMove = playerRunning ? (NORMALKEYMOVE << 1) : NORMALKEYMOVE;
input_t input {};
pPlayer->crouch_toggle = 0;
processCommonInput(info, true);
int const turn = input.q16avel / 32;
int turnLeft = buttonMap.ButtonDown(gamefunc_Turn_Left) || buttonMap.ButtonDown(gamefunc_Strafe_Left);
int turnRight = buttonMap.ButtonDown(gamefunc_Turn_Right) || buttonMap.ButtonDown(gamefunc_Strafe_Right);
int avelScale = F16((turnLeft || turnRight) ? 1 : 0);
if (turn)
{
avelScale = fix16_max(avelScale, fix16_clamp(fix16_mul(turn, turn),0,F16(1)));
if (turn < 0)
turnLeft = 1;
else if (turn > 0)
turnRight = 1;
}
loc.bits |= turnLeft << SK_AIM_DOWN;
loc.bits |= turnRight << SK_LOOK_LEFT;
int const moveBack = buttonMap.ButtonDown(gamefunc_Move_Backward) && pPlayer->MotoSpeed <= 0;
// turn is truncated to integer precision to avoid having micro-movement affect the result, which makes a significant difference here.
int turnvel = motoApplyTurn(pPlayer, turnLeft, turnRight, turn >> FRACBITS, moveBack, scaleAdjust);
input.q16avel += int(turnvel * scaleAdjust * FRACUNIT * 2);
if (pPlayer->moto_underwater)
{
pPlayer->MotoSpeed = 0;
}
else
{
loc.bits |= (buttonMap.ButtonDown(gamefunc_Move_Forward) || buttonMap.ButtonDown(gamefunc_Strafe)) << SK_JUMP;
loc.bits |= buttonMap.ButtonDown(gamefunc_Move_Backward) << SK_AIM_UP;
loc.bits |= buttonMap.ButtonDown(gamefunc_Run) << SK_CROUCH;
}
input.fvel += pPlayer->MotoSpeed;
input.q16avel = fix16_mul(input.q16avel, avelScale);
int const movementLocked = P_CheckLockedMovement(playerNum);
if ((ud.scrollmode && ud.overhead_on) || (movementLocked & IL_NOTHING) == IL_NOTHING)
{
if (ud.scrollmode && ud.overhead_on)
{
ud.folfvel = input.fvel;
ud.folavel = fix16_to_int(input.q16avel);
}
loc.fvel = loc.svel = 0;
loc.q16avel = loc.q16horz = 0;
}
else
{
if (!(movementLocked & IL_NOMOVE))
{
loc.fvel = clamp(input.fvel, -(MAXVELMOTO / 8), MAXVELMOTO);
}
if (!(movementLocked & IL_NOANGLE))
{
loc.q16avel = fix16_sadd(loc.q16avel, input.q16avel);
if (!synchronized_input) pPlayer->q16ang = fix16_sadd(pPlayer->q16ang, input.q16avel) & 0x7FFFFFF;
}
}
// don't adjust rotscrnang and look_ang if dead.
if (pSprite->extra > 0 && !synchronized_input)
{
apply_seasick(pPlayer, scaleAdjust);
}
}
void P_GetInputBoat(int playerNum)
{ {
auto const pPlayer = &ps[playerNum]; auto const pPlayer = &ps[playerNum];
ControlInfo info; ControlInfo info;
@ -419,34 +341,9 @@ void P_GetInputBoat(int playerNum)
pPlayer->crouch_toggle = 0; pPlayer->crouch_toggle = 0;
processCommonInput(info, true); processCommonInput(info, true);
processBoatInput(pPlayer, info, input, scaleAdjust); processVehicleInput(pPlayer, info, input, scaleAdjust);
int const movementLocked = P_CheckLockedMovement(playerNum); FinalizeInput(playerNum, input, true);
if ((ud.scrollmode && ud.overhead_on) || (movementLocked & IL_NOTHING) == IL_NOTHING)
{
if (ud.scrollmode && ud.overhead_on)
{
ud.folfvel = input.fvel;
ud.folavel = fix16_to_int(input.q16avel);
}
loc.fvel = loc.svel = 0;
loc.q16avel = loc.q16horz = 0;
}
else
{
if (!(movementLocked & IL_NOMOVE))
{
loc.fvel = clamp(input.fvel, -(MAXVELMOTO / 8), MAXVELMOTO);
}
if (!(movementLocked & IL_NOANGLE))
{
loc.q16avel = fix16_sadd(loc.q16avel, input.q16avel);
if (!synchronized_input) pPlayer->q16ang = fix16_sadd(pPlayer->q16ang, input.q16avel) & 0x7FFFFFF;
}
}
// don't adjust rotscrnang and look_ang if dead. // don't adjust rotscrnang and look_ang if dead.
if (sprite[pPlayer->i].extra > 0 && !synchronized_input) if (sprite[pPlayer->i].extra > 0 && !synchronized_input)
@ -455,6 +352,7 @@ void P_GetInputBoat(int playerNum)
} }
} }
void GetInput() void GetInput()
{ {
static double lastCheck; static double lastCheck;
@ -482,10 +380,8 @@ void GetInput()
setlocalplayerinput(p); setlocalplayerinput(p);
} }
if (isRRRA() && p->OnMotorcycle) if (isRRRA() && (p->OnMotorcycle || p->OnBoat))
P_GetInputMotorcycle(myconnectindex); P_GetInputVehicle(myconnectindex);
else if (isRRRA() && p->OnBoat)
P_GetInputBoat(myconnectindex);
else else
P_GetInput(myconnectindex); P_GetInput(myconnectindex);
} }