From 8284fcba9a2456e0bb52176e83ce691db1dcfb1d Mon Sep 17 00:00:00 2001 From: NY00123 Date: Fri, 3 Apr 2020 22:08:21 +0300 Subject: [PATCH] sw/src/player.cpp:DoPlayerTurn: Increase turning precision with q16 angle. This uses the new NORM_Q16ANGLE macro. --- source/sw/src/game.h | 1 + source/sw/src/player.cpp | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/source/sw/src/game.h b/source/sw/src/game.h index b7ed94394..6fd4ceb62 100644 --- a/source/sw/src/game.h +++ b/source/sw/src/game.h @@ -445,6 +445,7 @@ extern char MessageOutputString[256]; #define NORM_ANGLE(ang) ((ang) & 2047) #define ANGLE_2_PLAYER(pp,x,y) (NORM_ANGLE(getangle(pp->posx-(x), pp->posy-(y)))) +#define NORM_Q16ANGLE(ang) ((ang) & 0x7FFFFFF) int StdRandomRange(int range); diff --git a/source/sw/src/player.cpp b/source/sw/src/player.cpp index de2bbedbe..04e9a7bd5 100644 --- a/source/sw/src/player.cpp +++ b/source/sw/src/player.cpp @@ -1538,7 +1538,7 @@ DoPlayerCrawlHeight(PLAYERp pp) void DoPlayerTurn(PLAYERp pp) { - short angvel; + fix16_t q16avel; #define TURN_SHIFT 2 @@ -1594,15 +1594,15 @@ DoPlayerTurn(PLAYERp pp) return; } - angvel = fix16_to_int(pp->input.q16avel) * PLAYER_TURN_SCALE; + q16avel = fix16_smul(pp->input.q16avel, fix16_from_int(PLAYER_TURN_SCALE)); - if (angvel != 0) + if (q16avel != 0) { // running is not handled here now - angvel += DIV4(angvel); + q16avel += fix16_sdiv(q16avel, fix16_from_int(4)); - pp->q16ang += fix16_from_int(DIV32(angvel * synctics)); - pp->q16ang = fix16_from_int(NORM_ANGLE(fix16_to_int(pp->q16ang))); + pp->q16ang += fix16_sdiv(fix16_mul(q16avel, fix16_from_int(synctics)), fix16_from_int(32)); + pp->q16ang = NORM_Q16ANGLE(pp->q16ang); // update players sprite angle // NOTE: It's also updated in UpdatePlayerSprite, but needs to be