diff --git a/source/blood/src/controls.cpp b/source/blood/src/controls.cpp index 005fa9d0c..b69c0a7d7 100644 --- a/source/blood/src/controls.cpp +++ b/source/blood/src/controls.cpp @@ -138,7 +138,7 @@ static void processMovement(ControlInfo* const hidInput) // Perform unsynchronised angle/horizon if not dead. if (gView->pXSprite->health != 0) { - applylook(&pPlayer->q16ang, &pPlayer->q16look_ang, &pPlayer->q16rotscrnang, &pPlayer->spin, input.q16avel, &pPlayer->input.actions, scaleAdjust, gView->pXSprite->health == 0, pPlayer->posture != 0); + applylook(&pPlayer->q16ang, &pPlayer->q16look_ang, &pPlayer->q16rotscrnang, &pPlayer->spin, input.q16avel, &pPlayer->input.actions, scaleAdjust, pPlayer->posture != 0); UpdatePlayerSpriteAngle(pPlayer); sethorizon(&pPlayer->q16horiz, input.q16horz, &pPlayer->input.actions, scaleAdjust); } diff --git a/source/blood/src/player.cpp b/source/blood/src/player.cpp index 46fca1854..b1d072023 100644 --- a/source/blood/src/player.cpp +++ b/source/blood/src/player.cpp @@ -1445,7 +1445,7 @@ void ProcessInput(PLAYER *pPlayer) if (cl_syncinput) { - applylook(&pPlayer->q16ang, &pPlayer->q16look_ang, &pPlayer->q16rotscrnang, &pPlayer->spin, pInput->q16avel, &pInput->actions, 1, gView->pXSprite->health == 0, pPlayer->posture != 0); + applylook(&pPlayer->q16ang, &pPlayer->q16look_ang, &pPlayer->q16rotscrnang, &pPlayer->spin, pInput->q16avel, &pInput->actions, 1, pPlayer->posture != 0); UpdatePlayerSpriteAngle(pPlayer); } diff --git a/source/core/gamecontrol.cpp b/source/core/gamecontrol.cpp index cb838ada8..cc0867b0a 100644 --- a/source/core/gamecontrol.cpp +++ b/source/core/gamecontrol.cpp @@ -1560,54 +1560,58 @@ void sethorizon(fixed_t* q16horiz, fixed_t const q16horz, ESyncBits* actions, do // //--------------------------------------------------------------------------- -void applylook(fixed_t* q16ang, fixed_t* q16look_ang, fixed_t* q16rotscrnang, fixed_t* spin, fixed_t const q16avel, ESyncBits* actions, double const scaleAdjust, bool const dead, bool const crouching) +void applylook(fixed_t* q16ang, fixed_t* q16look_ang, fixed_t* q16rotscrnang, fixed_t* spin, fixed_t const q16avel, ESyncBits* actions, double const scaleAdjust, bool const crouching) { - if (!dead) + // return q16rotscrnang to 0 and set to 0 if less than a quarter of a FRACUNIT (16384) + *q16rotscrnang -= xs_CRoundToInt(scaleAdjust * (*q16rotscrnang * (15. / GameTicRate))); + if (abs(*q16rotscrnang) < (FRACUNIT >> 2)) *q16rotscrnang = 0; + + // return q16look_ang to 0 and set to 0 if less than a quarter of a FRACUNIT (16384) + *q16look_ang -= xs_CRoundToInt(scaleAdjust * (*q16look_ang * (7.5 / GameTicRate))); + if (abs(*q16look_ang) < (FRACUNIT >> 2)) *q16look_ang = 0; + + if (*actions & SB_LOOK_LEFT) { - *q16rotscrnang -= xs_CRoundToInt(scaleAdjust * (*q16rotscrnang * (15. / GameTicRate))); - if (abs(*q16rotscrnang) < (FRACUNIT >> 2)) *q16rotscrnang = 0; + // start looking left + *q16look_ang -= FloatToFixed(scaleAdjust * (4560. / GameTicRate)); + *q16rotscrnang += FloatToFixed(scaleAdjust * (720. / GameTicRate)); + } - *q16look_ang -= xs_CRoundToInt(scaleAdjust * (*q16look_ang * (7.5 / GameTicRate))); - if (abs(*q16look_ang) < (FRACUNIT >> 2)) *q16look_ang = 0; + if (*actions & SB_LOOK_RIGHT) + { + // start looking right + *q16look_ang += FloatToFixed(scaleAdjust * (4560. / GameTicRate)); + *q16rotscrnang -= FloatToFixed(scaleAdjust * (720. / GameTicRate)); + } - if (*actions & SB_LOOK_LEFT) + if (*actions & SB_TURNAROUND) + { + if (*spin == 0) { - *q16look_ang -= FloatToFixed(scaleAdjust * (4560. / GameTicRate)); - *q16rotscrnang += FloatToFixed(scaleAdjust * (720. / GameTicRate)); + // currently not spinning, so start a spin + *spin = IntToFixed(-1024); } + *actions &= ~SB_TURNAROUND; + } - if (*actions & SB_LOOK_RIGHT) + if (*spin < 0) + { + // return spin to 0 + fixed_t add = FloatToFixed(scaleAdjust * ((!crouching ? 3840. : 1920.) / GameTicRate)); + *spin += add; + if (*spin > 0) { - *q16look_ang += FloatToFixed(scaleAdjust * (4560. / GameTicRate)); - *q16rotscrnang -= FloatToFixed(scaleAdjust * (720. / GameTicRate)); + // Don't overshoot our target. With variable factor this is possible. + add -= *spin; + *spin = 0; } + *q16ang += add; + } - if (*actions & SB_TURNAROUND) - { - if (*spin == 0) - { - *spin = IntToFixed(-1024); - } - *actions &= ~SB_TURNAROUND; - } - - if (*spin < 0) - { - fixed_t add = FloatToFixed(scaleAdjust * ((!crouching ? 3840. : 1920.) / GameTicRate)); - *spin += add; - if (*spin > 0) - { - // Don't overshoot our target. With variable factor this is possible. - add -= *spin; - *spin = 0; - } - *q16ang += add; - } - - if (q16avel) - { - *q16ang = (*q16ang + q16avel) & 0x7FFFFFF; - } + if (q16avel) + { + // add player's input + *q16ang = (*q16ang + q16avel) & 0x7FFFFFF; } } @@ -1634,7 +1638,7 @@ void playerSetAngle(fixed_t* q16ang, fixed_t* helper, double adjustment) if (!cl_syncinput) { // Add slight offset if adjustment is coming in as absolute 0. - if (adjustment == 0) adjustment += (1. / FRACUNIT); + if (adjustment == 0) adjustment += (1. / (FRACUNIT >> 1)); *helper = *q16ang + getincangleq16(*q16ang, FloatToFixed(adjustment)); } @@ -1661,7 +1665,7 @@ void playerSetHoriz(fixed_t* q16horiz, fixed_t* helper, double adjustment) if (!cl_syncinput) { // Add slight offset if adjustment is coming in as absolute 0. - if (adjustment == 0) adjustment += (1. / FRACUNIT); + if (adjustment == 0) adjustment += (1. / (FRACUNIT >> 1)); *helper = FloatToFixed(adjustment); } diff --git a/source/core/gamecontrol.h b/source/core/gamecontrol.h index 4939875e3..7268f657b 100644 --- a/source/core/gamecontrol.h +++ b/source/core/gamecontrol.h @@ -68,7 +68,7 @@ int getincangle(int c, int n); fixed_t getincangleq16(fixed_t c, fixed_t n); void sethorizon(fixed_t* q16horiz, fixed_t const q16horz, ESyncBits* actions, double const scaleAdjust); -void applylook(fixed_t* q16ang, fixed_t* q16look_ang, fixed_t* q16rotscrnang, fixed_t* spin, fixed_t const q16avel, ESyncBits* actions, double const scaleAdjust, bool const dead, bool const crouching); +void applylook(fixed_t* q16ang, fixed_t* q16look_ang, fixed_t* q16rotscrnang, fixed_t* spin, fixed_t const q16avel, ESyncBits* actions, double const scaleAdjust, bool const crouching); void playerAddAngle(fixed_t* q16ang, double* helper, double adjustment); void playerSetAngle(fixed_t* q16ang, fixed_t* helper, double adjustment); void playerAddHoriz(fixed_t* q16horiz, double* helper, double adjustment); diff --git a/source/games/duke/src/input.cpp b/source/games/duke/src/input.cpp index 02c57ca7b..9dd2d17c7 100644 --- a/source/games/duke/src/input.cpp +++ b/source/games/duke/src/input.cpp @@ -1020,12 +1020,15 @@ static void GetInputInternal(InputPacket &locInput, ControlInfo* const hidInput) if (!cl_syncinput) { - // Do these in the same order as the old code. - calcviewpitch(p, scaleAdjust); - processq16avel(p, &input.q16avel); - applylook(&p->q16ang, &p->q16look_ang, &p->q16rotscrnang, &p->one_eighty_count, input.q16avel, &sync[myconnectindex].actions, scaleAdjust, p->dead_flag != 0, p->crouch_toggle || sync[myconnectindex].actions & SB_CROUCH); - apply_seasick(p, scaleAdjust); - sethorizon(&p->q16horiz, input.q16horz, &sync[myconnectindex].actions, scaleAdjust); + if (p->dead_flag == 0) + { + // Do these in the same order as the old code. + calcviewpitch(p, scaleAdjust); + processq16avel(p, &input.q16avel); + applylook(&p->q16ang, &p->q16look_ang, &p->q16rotscrnang, &p->one_eighty_count, input.q16avel, &sync[myconnectindex].actions, scaleAdjust, p->crouch_toggle || sync[myconnectindex].actions & SB_CROUCH); + sethorizon(&p->q16horiz, input.q16horz, &sync[myconnectindex].actions, scaleAdjust); + } + playerProcessHelpers(&p->q16ang, &p->angAdjust, &p->angTarget, &p->q16horiz, &p->horizAdjust, &p->horizTarget, scaleAdjust); } } diff --git a/source/games/duke/src/player_d.cpp b/source/games/duke/src/player_d.cpp index 80d09468b..1142ffb6a 100644 --- a/source/games/duke/src/player_d.cpp +++ b/source/games/duke/src/player_d.cpp @@ -2847,7 +2847,7 @@ void processinput_d(int snum) // may still be needed later for demo recording processq16avel(p, &sb_avel); - applylook(&p->q16ang, &p->q16look_ang, &p->q16rotscrnang, &p->one_eighty_count, sb_avel, &actions, 1, p->dead_flag != 0, p->crouch_toggle || actions & SB_CROUCH); + applylook(&p->q16ang, &p->q16look_ang, &p->q16rotscrnang, &p->one_eighty_count, sb_avel, &sync[snum].actions, 1, p->crouch_toggle || actions & SB_CROUCH); } if (p->spritebridge == 0) @@ -3079,7 +3079,7 @@ HORIZONLY: if (cl_syncinput) { - sethorizon(&p->q16horiz, PlayerHorizon(snum), &actions, 1); + sethorizon(&p->q16horiz, PlayerHorizon(snum), &sync[snum].actions, 1); } checkhardlanding(p); diff --git a/source/games/duke/src/player_r.cpp b/source/games/duke/src/player_r.cpp index 26d231e24..978d07198 100644 --- a/source/games/duke/src/player_r.cpp +++ b/source/games/duke/src/player_r.cpp @@ -1812,7 +1812,7 @@ static void onMotorcycle(int snum, ESyncBits &actions) ang = var98 >> 7; } } - playerSetAngle(&p->q16ang, &p->angTarget, (var90 - ang) & 2047); + playerAddAngle(&p->q16ang, &p->angAdjust, FixedToFloat(getincangleq16(p->q16ang, IntToFixed(var90 - ang)))); } else if (p->MotoSpeed >= 20 && p->on_ground == 1 && (p->moto_on_mud || p->moto_on_oil)) { @@ -2111,7 +2111,7 @@ static void onBoat(int snum, ESyncBits &actions) p->posyv += (vard4 >> 7) * (sintable[(vardc * -51 + vard8) & 2047] << 4); ang = vare0 >> 6; } - playerSetAngle(&p->q16ang, &p->angTarget, (vard8 - ang) & 2047); + playerAddAngle(&p->q16ang, &p->angAdjust, FixedToFloat(getincangleq16(p->q16ang, IntToFixed(vard8 - ang)))); } if (p->NotOnWater) if (p->MotoSpeed > 50) @@ -3737,7 +3737,7 @@ void processinput_r(int snum) // may still be needed later for demo recording processq16avel(p, &sb_avel); - applylook(&p->q16ang, &p->q16look_ang, &p->q16rotscrnang, &p->one_eighty_count, sb_avel, &actions, 1, p->dead_flag != 0, p->crouch_toggle || actions & SB_CROUCH); + applylook(&p->q16ang, &p->q16look_ang, &p->q16rotscrnang, &p->one_eighty_count, sb_avel, &sync[snum].actions, 1, p->crouch_toggle || actions & SB_CROUCH); apply_seasick(p, 1); } @@ -4093,7 +4093,7 @@ HORIZONLY: if (cl_syncinput) { - sethorizon(&p->q16horiz, PlayerHorizon(snum), &actions, 1); + sethorizon(&p->q16horiz, PlayerHorizon(snum), &sync[snum].actions, 1); } checkhardlanding(p); diff --git a/source/sw/src/player.cpp b/source/sw/src/player.cpp index 50f05604e..24234708e 100644 --- a/source/sw/src/player.cpp +++ b/source/sw/src/player.cpp @@ -1525,7 +1525,7 @@ UpdatePlayerSpriteAngle(PLAYERp pp) void DoPlayerTurn(PLAYERp pp, fixed_t const q16avel, double const scaleAdjust) { - applylook(&pp->q16ang, &pp->q16look_ang, &pp->q16rotscrnang, &pp->turn180_target, q16avel, &pp->input.actions, scaleAdjust, TEST(pp->Flags, PF_DEAD), pp->input.actions & (SB_CROUCH|SB_CROUCH_LOCK)); + applylook(&pp->q16ang, &pp->q16look_ang, &pp->q16rotscrnang, &pp->turn180_target, q16avel, &pp->input.actions, scaleAdjust, pp->input.actions & (SB_CROUCH|SB_CROUCH_LOCK)); UpdatePlayerSpriteAngle(pp); }