diff --git a/source/games/duke/src/gameloop.cpp b/source/games/duke/src/gameloop.cpp index 36c31338a..21fb1f371 100644 --- a/source/games/duke/src/gameloop.cpp +++ b/source/games/duke/src/gameloop.cpp @@ -94,7 +94,6 @@ void GameInterface::Ticker() p->pals.a--; hud_input(i); - processinputvel(i); fi.processinput(i); fi.checksectors(i); } diff --git a/source/games/duke/src/input.cpp b/source/games/duke/src/input.cpp index 74f9d5b74..1600c5332 100644 --- a/source/games/duke/src/input.cpp +++ b/source/games/duke/src/input.cpp @@ -502,36 +502,6 @@ void hud_input(int plnum) } } -//--------------------------------------------------------------------------- -// -// 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. -// -//--------------------------------------------------------------------------- - -#if 0 -enum -{ - - TURBOTURNTIME = (TICRATE/8), // 7 - NORMALTURN = 15, - PREAMBLETURN = 5, - NORMALKEYMOVE = 40, - MAXVEL = ((NORMALKEYMOVE*2)+10), - MAXSVEL = ((NORMALKEYMOVE*2)+10), - MAXANGVEL = 1024, // 127 - MAXHORIZVEL = 256, // 127 -}; -#endif - -enum -{ - MAXVELMOTO = 120, -}; - -static constexpr float VEHICLETURN = (20.f * 360.f / 2048.f); - //--------------------------------------------------------------------------- // // split out for readability @@ -608,6 +578,7 @@ static float getVehicleTurnVel(player_struct* p, HIDInput* const hidInput, const static void processVehicleInput(player_struct *p, HIDInput* const hidInput, InputPacket* const inputBuffer, InputPacket* const currInput, const double scaleAdjust) { + static constexpr float VEHICLETURN = (20.f * 360.f / 2048.f); float baseVel, velScale; // mask out all actions not compatible with vehicles. @@ -616,8 +587,9 @@ static void processVehicleInput(player_struct *p, HIDInput* const hidInput, Inpu if (p->OnBoat || !p->moto_underwater) { - p->vehForwardScale = min((buttonMap.ButtonDown(gamefunc_Move_Forward) || buttonMap.ButtonDown(gamefunc_Strafe)) + hidInput->joyaxes[JOYAXIS_Forward], 1.f); - p->vehReverseScale = min(buttonMap.ButtonDown(gamefunc_Move_Backward) + -hidInput->joyaxes[JOYAXIS_Forward], 1.f); + const bool kbdForwards = buttonMap.ButtonDown(gamefunc_Move_Forward) || buttonMap.ButtonDown(gamefunc_Strafe); + const bool kbdBackward = buttonMap.ButtonDown(gamefunc_Move_Backward); + inputBuffer->fvel = clamp(kbdForwards - kbdBackward + hidInput->joyaxes[JOYAXIS_Forward], -1.f, 1.f); if (buttonMap.ButtonDown(gamefunc_Run)) inputBuffer->actions |= SB_CROUCH; @@ -627,7 +599,6 @@ static void processVehicleInput(player_struct *p, HIDInput* const hidInput, Inpu { velScale = (3.f / 10.f); baseVel = VEHICLETURN * Sgn(p->MotoSpeed); - if (p->moto_underwater) p->MotoSpeed = 0; } else { @@ -635,7 +606,6 @@ static void processVehicleInput(player_struct *p, HIDInput* const hidInput, Inpu baseVel = VEHICLETURN * velScale; } - inputBuffer->fvel = clamp((float)p->MotoSpeed, -(MAXVELMOTO >> 3), MAXVELMOTO) * (1.f / 40.f); inputBuffer->avel += (currInput->avel = getVehicleTurnVel(p, hidInput, (float)scaleAdjust, baseVel, velScale)); } diff --git a/source/games/duke/src/player_d.cpp b/source/games/duke/src/player_d.cpp index 69378fe2e..e4304d23c 100644 --- a/source/games/duke/src/player_d.cpp +++ b/source/games/duke/src/player_d.cpp @@ -2600,6 +2600,7 @@ void processinput_d(int snum) ESyncBits& actions = p->sync.actions; + processinputvel(snum); auto sb_fvel = PlayerInputForwardVel(snum); auto sb_svel = PlayerInputSideVel(snum); diff --git a/source/games/duke/src/player_r.cpp b/source/games/duke/src/player_r.cpp index 0ff0f5c85..d57c52b51 100644 --- a/source/games/duke/src/player_r.cpp +++ b/source/games/duke/src/player_r.cpp @@ -1471,8 +1471,14 @@ static void onMotorcycle(int snum, ESyncBits &actions) int rng; if (p->MotoSpeed < 0) + { p->MotoSpeed = 0; + p->sync.fvel = 0; + } + const auto oldMotoSpeed = clamp((float)p->MotoSpeed, -15.f, 120.f) * (1.f / 40.f); + bool forward = p->sync.fvel > 0; + bool reverse = p->sync.fvel < 0; bool turnLeft = p->sync.avel < 0; bool turnRight = p->sync.avel > 0; @@ -1481,7 +1487,7 @@ static void onMotorcycle(int snum, ESyncBits &actions) actions &= ~SB_CROUCH; } - if (p->vehForwardScale != 0) + if (forward != 0) { if (p->on_ground) { @@ -1551,7 +1557,7 @@ static void onMotorcycle(int snum, ESyncBits &actions) p->VBumpTarget = -30; p->moto_do_bump = 1; } - else if (p->vehForwardScale != 0 && !braking) + else if (forward && !braking) { if (p->MotoSpeed < 40) { @@ -1559,8 +1565,8 @@ static void onMotorcycle(int snum, ESyncBits &actions) p->moto_bump_fast = 1; } - p->MotoSpeed += 2 * p->vehForwardScale; - p->vehForwardScale = 0; + p->MotoSpeed += 2 * p->sync.fvel; + forward = false; if (p->MotoSpeed > 120) p->MotoSpeed = 120; @@ -1577,13 +1583,13 @@ static void onMotorcycle(int snum, ESyncBits &actions) p->moto_do_bump = 0; } - if (p->vehReverseScale != 0 && p->MotoSpeed <= 0 && !braking) + if (reverse && p->MotoSpeed <= 0 && !braking) { bool temp = turnRight; turnRight = turnLeft; turnLeft = temp; - p->MotoSpeed = -15 * p->vehReverseScale; - p->vehReverseScale = 0; + p->MotoSpeed = 15.f * p->sync.fvel; + reverse = false; } } if (p->MotoSpeed != 0 && p->on_ground == 1) @@ -1699,6 +1705,7 @@ static void onMotorcycle(int snum, ESyncBits &actions) } p->moto_on_mud = p->moto_on_oil = 0; + p->sync.fvel = oldMotoSpeed; } //--------------------------------------------------------------------------- @@ -1715,6 +1722,9 @@ static void onBoat(int snum, ESyncBits &actions) bool braking = false, heeltoe = false; int rng; + const auto oldMotoSpeed = clamp((float)p->MotoSpeed, -15.f, 120.f) * (1.f / 40.f); + bool forward = p->sync.fvel > 0; + bool reverse = p->sync.fvel < 0; bool turnLeft = p->sync.avel < 0; bool turnRight = p->sync.avel > 0; @@ -1735,13 +1745,13 @@ static void onBoat(int snum, ESyncBits &actions) if (p->MotoSpeed < 0) p->MotoSpeed = 0; - if ((actions & SB_CROUCH) && (p->vehForwardScale != 0)) + if ((actions & SB_CROUCH) && forward) { heeltoe = true; - p->vehForwardScale = 0; + forward = false; } - if (p->vehForwardScale != 0) + if (forward) { if (p->MotoSpeed == 0 && !S_CheckActorSoundPlaying(pact, 89)) { @@ -1830,15 +1840,15 @@ static void onBoat(int snum, ESyncBits &actions) p->VBumpTarget = 30; p->moto_do_bump = 1; } - else if (p->vehForwardScale != 0) + else if (forward) { if (p->MotoSpeed < 40 && !p->NotOnWater) { p->VBumpTarget = -30; p->moto_bump_fast = 1; } - p->MotoSpeed += 1 * p->vehForwardScale; - p->vehForwardScale = 0; + p->MotoSpeed += 1 * p->sync.fvel; + forward = false; if (p->MotoSpeed > 120) p->MotoSpeed = 120; } @@ -1851,13 +1861,13 @@ static void onBoat(int snum, ESyncBits &actions) p->moto_do_bump = 0; } - if (p->vehReverseScale != 0 && p->MotoSpeed == 0 && !braking) + if (reverse && p->MotoSpeed == 0 && !braking) { bool temp = turnRight; turnRight = turnLeft; turnLeft = temp; - p->MotoSpeed = -(!p->NotOnWater ? 25 : 20) * p->vehReverseScale; - p->vehReverseScale = 0; + p->MotoSpeed = (!p->NotOnWater ? 25 : 20) * p->sync.fvel; + reverse = false; } } if (p->MotoSpeed != 0 && p->on_ground == 1) @@ -1938,6 +1948,8 @@ static void onBoat(int snum, ESyncBits &actions) } if (p->NotOnWater && p->MotoSpeed > 50) p->MotoSpeed -= (p->MotoSpeed / 2.); + + p->sync.fvel = oldMotoSpeed; } //--------------------------------------------------------------------------- @@ -3197,9 +3209,6 @@ void processinput_r(int snum) ESyncBits& actions = p->sync.actions; - auto sb_fvel = PlayerInputForwardVel(snum); - auto sb_svel = PlayerInputSideVel(snum); - auto psectp = p->cursector; if (p->OnMotorcycle && pact->spr.extra > 0) { @@ -3209,6 +3218,11 @@ void processinput_r(int snum) { onBoat(snum, actions); } + + processinputvel(snum); + auto sb_fvel = PlayerInputForwardVel(snum); + auto sb_svel = PlayerInputSideVel(snum); + if (psectp == nullptr) { if (pact->spr.extra > 0 && ud.clipping == 0) diff --git a/source/games/duke/src/types.h b/source/games/duke/src/types.h index 39d798b13..e2f9fa98d 100644 --- a/source/games/duke/src/types.h +++ b/source/games/duke/src/types.h @@ -308,7 +308,7 @@ struct player_struct uint8_t hurt_delay2, nocheat; uint8_t OnMotorcycle, OnBoat, moto_underwater, NotOnWater, MotoOnGround; uint8_t moto_do_bump, moto_bump_fast, moto_on_oil, moto_on_mud; - double vehForwardScale, vehReverseScale, MotoSpeed; + double MotoSpeed; TArray uservars; diff --git a/source/games/duke/src/vmexports.cpp b/source/games/duke/src/vmexports.cpp index 8e5b20730..9d77cbbb5 100644 --- a/source/games/duke/src/vmexports.cpp +++ b/source/games/duke/src/vmexports.cpp @@ -941,8 +941,6 @@ DEFINE_FIELD_X(DukePlayer, player_struct, moto_do_bump) DEFINE_FIELD_X(DukePlayer, player_struct, moto_bump_fast) DEFINE_FIELD_X(DukePlayer, player_struct, moto_on_oil) DEFINE_FIELD_X(DukePlayer, player_struct, moto_on_mud) -DEFINE_FIELD_X(DukePlayer, player_struct, vehForwardScale) -DEFINE_FIELD_X(DukePlayer, player_struct, vehReverseScale) DEFINE_FIELD_X(DukePlayer, player_struct, MotoSpeed) DEFINE_FIELD_X(DukePlayer, player_struct, holoduke_on) DEFINE_FIELD_X(DukePlayer, player_struct, actorsqu) diff --git a/wadsrc/static/zscript/games/duke/dukegame.zs b/wadsrc/static/zscript/games/duke/dukegame.zs index 591abf8bb..7f3a7cb84 100644 --- a/wadsrc/static/zscript/games/duke/dukegame.zs +++ b/wadsrc/static/zscript/games/duke/dukegame.zs @@ -334,7 +334,7 @@ struct DukePlayer native native uint8 hurt_delay2, nocheat; native uint8 OnMotorcycle, OnBoat, moto_underwater, NotOnWater, MotoOnGround; native uint8 moto_do_bump, moto_bump_fast, moto_on_oil, moto_on_mud; - native double vehForwardScale, vehReverseScale, MotoSpeed; + native double MotoSpeed; // input stuff. //InputPacket sync;