diff --git a/source/rr/src/actors.cpp b/source/rr/src/actors.cpp index db50dfb5f..cb76f6443 100644 --- a/source/rr/src/actors.cpp +++ b/source/rr/src/actors.cpp @@ -1111,23 +1111,6 @@ static int P_Submerge(int, int, DukePlayer_t *, int, int); static int P_Emerge(int, int, DukePlayer_t *, int, int); static void P_FinishWaterChange(int, DukePlayer_t *, int, int, int); -static fix16_t P_GetQ16AngleDeltaForTic(DukePlayer_t const *pPlayer) -{ - auto oldAngle = pPlayer->oq16ang; - auto newAngle = pPlayer->q16ang; - - if (klabs(fix16_sub(oldAngle, newAngle)) < F16(1024)) - return fix16_sub(newAngle, oldAngle); - - if (newAngle > F16(1024)) - newAngle = fix16_sub(newAngle, F16(2048)); - - if (oldAngle > F16(1024)) - oldAngle = fix16_sub(oldAngle, F16(2048)); - - return fix16_sub(newAngle, oldAngle); -} - ACTOR_STATIC void G_MovePlayers(void) { int spriteNum = headspritestat[STAT_PLAYER]; @@ -1181,7 +1164,7 @@ ACTOR_STATIC void G_MovePlayers(void) if (G_HaveActor(sprite[spriteNum].picnum)) A_Execute(spriteNum, P_GetP(pSprite), otherPlayerDist); - pPlayer->q16angvel = P_GetQ16AngleDeltaForTic(pPlayer); + pPlayer->q16angvel = G_GetQ16AngleDelta(pPlayer->oq16ang, pPlayer->q16ang); pPlayer->oq16ang = pPlayer->q16ang; pPlayer->oq16horiz = pPlayer->q16horiz; pPlayer->oq16horizoff = pPlayer->q16horizoff; diff --git a/source/rr/src/gameexec.cpp b/source/rr/src/gameexec.cpp index 53bdd3a6f..c2d2f3906 100644 --- a/source/rr/src/gameexec.cpp +++ b/source/rr/src/gameexec.cpp @@ -492,6 +492,20 @@ int32_t __fastcall G_GetAngleDelta(int32_t currAngle, int32_t newAngle) return newAngle-currAngle; } +fix16_t __fastcall G_GetQ16AngleDelta(fix16_t oldAngle, fix16_t newAngle) +{ + if (fix16_abs(fix16_sub(oldAngle, newAngle)) < fix16_from_int(1024)) + return fix16_sub(newAngle, oldAngle); + + if (newAngle > fix16_from_int(1024)) + newAngle = fix16_sub(newAngle, fix16_from_int(2048)); + + if (oldAngle > fix16_from_int(1024)) + oldAngle = fix16_sub(oldAngle, fix16_from_int(2048)); + + return fix16_sub(newAngle, oldAngle); +} + GAMEEXEC_STATIC void VM_AlterAng(int32_t const moveFlags) { int const elapsedTics = (AC_COUNT(vm.pData))&31; diff --git a/source/rr/src/gameexec.h b/source/rr/src/gameexec.h index 7fe8712d8..dc0f29632 100644 --- a/source/rr/src/gameexec.h +++ b/source/rr/src/gameexec.h @@ -74,6 +74,7 @@ void A_Fall(int spriteNum); int32_t A_GetFurthestAngle(int spriteNum, int angDiv); void A_GetZLimits(int spriteNum); int32_t __fastcall G_GetAngleDelta(int32_t currAngle, int32_t newAngle); +fix16_t __fastcall G_GetQ16AngleDelta(fix16_t oldAngle, fix16_t newAngle); //void G_RestoreMapState(); //void G_SaveMapState(); diff --git a/source/rr/src/player.cpp b/source/rr/src/player.cpp index a9fbb2ba7..6984ee791 100644 --- a/source/rr/src/player.cpp +++ b/source/rr/src/player.cpp @@ -22,6 +22,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "ns.h" // Must come before everything else! #include "duke3d.h" +#include "gameexec.h" #include "demo.h" #include "d_event.h" @@ -3155,16 +3156,16 @@ enddisplayweapon: P_DisplaySpit(); } -#define TURBOTURNTIME (TICRATE/8) // 7 -#define NORMALTURN 15 -#define PREAMBLETURN 5 -#define NORMALKEYMOVE 40 -#define MAXVEL ((NORMALKEYMOVE*2)+10) -#define MAXSVEL ((NORMALKEYMOVE*2)+10) -#define MAXANGVEL 1024 -#define MAXHORIZVEL 256 - -#define MAXVELMOTO 120 +#define TURBOTURNTIME (TICRATE/8) // 7 +#define NORMALTURN 15 +#define PREAMBLETURN 5 +#define NORMALKEYMOVE 40 +#define MAXVEL ((NORMALKEYMOVE*2)+10) +#define MAXSVEL ((NORMALKEYMOVE*2)+10) +#define MAXANGVEL 1024 +#define MAXHORIZVEL 256 +#define ONEEIGHTYSCALE 4 +#define MAXVELMOTO 120 int32_t g_myAimStat = 0, g_oldAimStat = 0; int32_t mouseyaxismode = -1; @@ -3536,6 +3537,12 @@ void P_GetInput(int const playerNum) pPlayer->q16rotscrnang = fix16_ssub(pPlayer->q16rotscrnang, fix16_from_dbl(scaleAdjustmentToInterval(24))); } + if (pPlayer->one_eighty_count < 0) + { + pPlayer->one_eighty_count = -fix16_to_int(fix16_abs(G_GetQ16AngleDelta(pPlayer->one_eighty_target, pPlayer->q16ang))); + pPlayer->q16ang = fix16_sadd(pPlayer->q16ang, fix16_max(fix16_one, fix16_from_dbl(scaleAdjustmentToInterval(-pPlayer->one_eighty_count / ONEEIGHTYSCALE)))) & 0x7FFFFFF; + } + if (RRRA && pPlayer->sea_sick) { if (pPlayer->sea_sick < 250) @@ -4297,6 +4304,12 @@ void P_DHGetInput(int const playerNum) pPlayer->q16look_ang = fix16_sadd(pPlayer->q16look_ang, fix16_from_dbl(scaleAdjustmentToInterval(152))); pPlayer->q16rotscrnang = fix16_ssub(pPlayer->q16rotscrnang, fix16_from_dbl(scaleAdjustmentToInterval(24))); } + + if (pPlayer->one_eighty_count < 0) + { + pPlayer->one_eighty_count = -fix16_to_int(fix16_abs(G_GetQ16AngleDelta(pPlayer->one_eighty_target, pPlayer->q16ang))); + pPlayer->q16ang = fix16_sadd(pPlayer->q16ang, fix16_max(fix16_one, fix16_from_dbl(scaleAdjustmentToInterval(-pPlayer->one_eighty_count / ONEEIGHTYSCALE)))) & 0x7FFFFFF; + } } // A horiz diff of 128 equal 45 degrees, so we convert horiz to 1024 angle units @@ -8010,12 +8023,6 @@ check_enemy_sprite: pPlayer->opos.z = pPlayer->pos.z; pPlayer->opyoff = pPlayer->pyoff; - if (pPlayer->one_eighty_count < 0) - { - pPlayer->one_eighty_count += 128; - pPlayer->q16ang += F16(128); - } - // Shrinking code if (RR) @@ -9235,12 +9242,6 @@ void P_DHProcessInput(int playerNum) pPlayer->opos.z = pPlayer->pos.z; pPlayer->opyoff = pPlayer->pyoff; - if (pPlayer->one_eighty_count < 0) - { - pPlayer->one_eighty_count += 128; - pPlayer->q16ang += F16(128); - } - // Shrinking code if (sectorLotag == ST_2_UNDERWATER) diff --git a/source/rr/src/player.h b/source/rr/src/player.h index 5a77d2a96..cd6d357c8 100644 --- a/source/rr/src/player.h +++ b/source/rr/src/player.h @@ -164,6 +164,7 @@ typedef struct { int16_t random_club_frame, one_eighty_count; int16_t dummyplayersprite, extra_extra8; int16_t actorsqu, timebeforeexit, customexitsound, last_pissed_time; + fix16_t one_eighty_target; int16_t weaprecs[MAX_WEAPON_RECS], weapon_sway, crack_time, bobcounter; diff --git a/source/rr/src/sector.cpp b/source/rr/src/sector.cpp index d9accdc63..4bb934b5c 100644 --- a/source/rr/src/sector.cpp +++ b/source/rr/src/sector.cpp @@ -4248,7 +4248,10 @@ rrtripbomb_case: if (TEST_SYNC_KEY(playerBits, SK_TURNAROUND) && pPlayer->one_eighty_count == 0) if (VM_OnEvent(EVENT_TURNAROUND,pPlayer->i,playerNum) == 0) - pPlayer->one_eighty_count = -1024; + { + pPlayer->one_eighty_count = -1024; + pPlayer->one_eighty_target = fix16_sadd(pPlayer->q16ang, -fix16_from_int(pPlayer->one_eighty_count)) & 0x7FFFFFF; + } } }