From 75d41d1d317b9e05a678f4d29807f1ae3f47e862 Mon Sep 17 00:00:00 2001 From: Mitchell Richters Date: Wed, 10 Jun 2020 06:05:06 +1000 Subject: [PATCH 1/5] Duke3D: Promote rotscrnang to Q16.16. --- source/build/include/build.h | 2 +- source/build/src/engine.cpp | 4 +- source/duke3d/src/game.cpp | 10 ++-- source/duke3d/src/gamedef.h | 3 ++ source/duke3d/src/gameexec.cpp | 4 +- source/duke3d/src/gamestructures.cpp | 73 ++++++++++++++++------------ source/duke3d/src/player.cpp | 14 +++--- source/duke3d/src/player.h | 3 +- source/duke3d/src/premap.cpp | 6 +-- 9 files changed, 66 insertions(+), 53 deletions(-) diff --git a/source/build/include/build.h b/source/build/include/build.h index bf55cd6f1..6a251aff1 100644 --- a/source/build/include/build.h +++ b/source/build/include/build.h @@ -1438,7 +1438,7 @@ void editorDraw2dCircle(int32_t x1, int32_t y1, int32_t r, int32_t eccen, char int32_t videoSetRenderMode(int32_t renderer); #ifdef USE_OPENGL -void renderSetRollAngle(int32_t rolla); +void renderSetRollAngle(float rolla); #endif // pal: pass -1 to invalidate all palettes for the tile, or >=0 for a particular palette diff --git a/source/build/src/engine.cpp b/source/build/src/engine.cpp index 8ab36e772..b481c5981 100644 --- a/source/build/src/engine.cpp +++ b/source/build/src/engine.cpp @@ -13662,9 +13662,9 @@ int32_t videoSetRenderMode(int32_t renderer) // setrollangle // #ifdef USE_OPENGL -void renderSetRollAngle(int32_t rolla) +void renderSetRollAngle(float rolla) { - gtang = (float)rolla * (fPI * (1.f/1024.f)); + gtang = rolla * (fPI * (1.f/1024.f)); } #endif diff --git a/source/duke3d/src/game.cpp b/source/duke3d/src/game.cpp index 5a60f1fca..3b9eeea23 100644 --- a/source/duke3d/src/game.cpp +++ b/source/duke3d/src/game.cpp @@ -830,7 +830,7 @@ void G_DrawRooms(int32_t playerNum, int32_t smoothRatio) int vr = divscale22(1, sprite[pPlayer->i].yrepeat + 28); int screenTilting = (videoGetRenderMode() == REND_CLASSIC - && ((ud.screen_tilting && pPlayer->rotscrnang + && ((ud.screen_tilting && fix16_to_int(pPlayer->q16rotscrnang) #ifdef SPLITSCREEN_MOD_HACKS && !g_fakeMultiMode @@ -857,7 +857,7 @@ void G_DrawRooms(int32_t playerNum, int32_t smoothRatio) else if (screenTilting) { int32_t oviewingrange = viewingrange; // save it from renderSetAspect() - const int16_t tang = (ud.screen_tilting) ? pPlayer->rotscrnang : 0; + const int16_t tang = (ud.screen_tilting) ? fix16_to_int(pPlayer->q16rotscrnang) : 0; if (tang == 1024) screenTilting = 2; @@ -944,9 +944,9 @@ void G_DrawRooms(int32_t playerNum, int32_t smoothRatio) ) { #ifdef USE_OPENGL - renderSetRollAngle(pPlayer->orotscrnang + mulscale16(((pPlayer->rotscrnang - pPlayer->orotscrnang + 1024)&2047)-1024, smoothRatio)); + renderSetRollAngle(fix16_to_float(pPlayer->oq16rotscrnang + mulscale16(((pPlayer->q16rotscrnang - pPlayer->oq16rotscrnang + fix16_from_int(1024))&0x7FFFFFF)-fix16_from_int(1024), smoothRatio))); #endif - pPlayer->orotscrnang = pPlayer->rotscrnang; + pPlayer->oq16rotscrnang = pPlayer->q16rotscrnang; } #ifdef USE_OPENGL else @@ -1126,7 +1126,7 @@ void G_DrawRooms(int32_t playerNum, int32_t smoothRatio) } else if (screenTilting) { - const int16_t tang = (ud.screen_tilting) ? pPlayer->rotscrnang : 0; + const int16_t tang = (ud.screen_tilting) ? fix16_to_int(pPlayer->q16rotscrnang) : 0; if (screenTilting == 2) // tang == 1024 { diff --git a/source/duke3d/src/gamedef.h b/source/duke3d/src/gamedef.h index b0e2a4f68..5076c8550 100644 --- a/source/duke3d/src/gamedef.h +++ b/source/duke3d/src/gamedef.h @@ -330,6 +330,9 @@ enum PlayerLabel_t PLAYER_WEAPRECCNT, PLAYER_INTERFACE_TOGGLE, PLAYER_ROTSCRNANG, + PLAYER_OROTSCRNANG, + PLAYER_Q16ROTSCRNANG, + PLAYER_OQ16ROTSCRNANG, PLAYER_DEAD_FLAG, PLAYER_SHOW_EMPTY_WEAPON, PLAYER_SCUBA_AMOUNT, diff --git a/source/duke3d/src/gameexec.cpp b/source/duke3d/src/gameexec.cpp index 4a386b83e..ffcd1829b 100644 --- a/source/duke3d/src/gameexec.cpp +++ b/source/duke3d/src/gameexec.cpp @@ -250,8 +250,8 @@ GAMEEXEC_STATIC GAMEEXEC_INLINE void P_ForceAngle(DukePlayer_t *pPlayer) pPlayer->q16horiz += F16(64); pPlayer->return_to_center = 9; - pPlayer->rotscrnang = nAngle >> 1; - pPlayer->look_ang = pPlayer->rotscrnang; + pPlayer->q16rotscrnang = fix16_from_int(nAngle >> 1); + pPlayer->look_ang = fix16_to_int(pPlayer->q16rotscrnang); } // wow, this function sucks diff --git a/source/duke3d/src/gamestructures.cpp b/source/duke3d/src/gamestructures.cpp index 31e10e2d0..53ad62820 100644 --- a/source/duke3d/src/gamestructures.cpp +++ b/source/duke3d/src/gamestructures.cpp @@ -464,6 +464,9 @@ memberlabel_t const PlayerLabels[]= { "weapreccnt", PLAYER_WEAPRECCNT, 0, 0, -1 }, { "interface_toggle_flag", PLAYER_INTERFACE_TOGGLE, 0, 0, -1 }, { "rotscrnang", PLAYER_ROTSCRNANG, 0, 0, -1 }, + { "orotscrnang", PLAYER_OROTSCRNANG, 0, 0, -1 }, + { "q16rotscrnang", PLAYER_Q16ROTSCRNANG, 0, 0, -1 }, + { "oq16rotscrnang", PLAYER_OQ16ROTSCRNANG, 0, 0, -1 }, { "dead_flag", PLAYER_DEAD_FLAG, 0, 0, -1 }, { "show_empty_weapon", PLAYER_SHOW_EMPTY_WEAPON, 0, 0, -1 }, { "scuba_amount", PLAYER_SCUBA_AMOUNT, 0, 0, -1 }, @@ -547,21 +550,25 @@ int32_t __fastcall VM_GetPlayer(int const playerNum, int32_t labelNum, int const switch (labelNum) { - case PLAYER_ANG: labelNum = fix16_to_int(ps.q16ang); break; - case PLAYER_OANG: labelNum = fix16_to_int(ps.oq16ang); break; - case PLAYER_ANGVEL: labelNum = fix16_to_int(ps.q16angvel); break; - case PLAYER_HORIZ: labelNum = fix16_to_int(ps.q16horiz); break; - case PLAYER_OHORIZ: labelNum = fix16_to_int(ps.oq16horiz); break; - case PLAYER_HORIZOFF: labelNum = fix16_to_int(ps.q16horizoff); break; - case PLAYER_OHORIZOFF: labelNum = fix16_to_int(ps.oq16horizoff); break; - - case PLAYER_Q16ANG: labelNum = ps.q16ang; break; - case PLAYER_OQ16ANG: labelNum = ps.oq16ang; break; - case PLAYER_Q16ANGVEL: labelNum = ps.q16angvel; break; - case PLAYER_Q16HORIZ: labelNum = ps.q16horiz; break; - case PLAYER_OQ16HORIZ: labelNum = ps.oq16horiz; break; - case PLAYER_Q16HORIZOFF: labelNum = ps.q16horizoff; break; - case PLAYER_OQ16HORIZOFF: labelNum = ps.oq16horizoff; break; + case PLAYER_ANG: labelNum = fix16_to_int(ps.q16ang); break; + case PLAYER_OANG: labelNum = fix16_to_int(ps.oq16ang); break; + case PLAYER_ANGVEL: labelNum = fix16_to_int(ps.q16angvel); break; + case PLAYER_HORIZ: labelNum = fix16_to_int(ps.q16horiz); break; + case PLAYER_OHORIZ: labelNum = fix16_to_int(ps.oq16horiz); break; + case PLAYER_HORIZOFF: labelNum = fix16_to_int(ps.q16horizoff); break; + case PLAYER_OHORIZOFF: labelNum = fix16_to_int(ps.oq16horizoff); break; + case PLAYER_ROTSCRNANG: labelNum = fix16_to_int(ps.q16rotscrnang); break; + case PLAYER_OROTSCRNANG: labelNum = fix16_to_int(ps.oq16rotscrnang); break; + + case PLAYER_Q16ANG: labelNum = ps.q16ang; break; + case PLAYER_OQ16ANG: labelNum = ps.oq16ang; break; + case PLAYER_Q16ANGVEL: labelNum = ps.q16angvel; break; + case PLAYER_Q16HORIZ: labelNum = ps.q16horiz; break; + case PLAYER_OQ16HORIZ: labelNum = ps.oq16horiz; break; + case PLAYER_Q16HORIZOFF: labelNum = ps.q16horizoff; break; + case PLAYER_OQ16HORIZOFF: labelNum = ps.oq16horizoff; break; + case PLAYER_Q16ROTSCRNANG: labelNum = ps.q16rotscrnang; break; + case PLAYER_OQ16ROTSCRNANG: labelNum = ps.oq16rotscrnang; break; case PLAYER_ACCESS_INCS: labelNum = ps.access_incs; break; case PLAYER_ACCESS_SPRITENUM: labelNum = ps.access_spritenum; break; @@ -662,7 +669,6 @@ int32_t __fastcall VM_GetPlayer(int const playerNum, int32_t labelNum, int const case PLAYER_RAPID_FIRE_HOLD: labelNum = ps.rapid_fire_hold; break; case PLAYER_RELOADING: labelNum = ps.reloading; break; case PLAYER_RETURN_TO_CENTER: labelNum = ps.return_to_center; break; - case PLAYER_ROTSCRNANG: labelNum = ps.rotscrnang; break; case PLAYER_RUNSPEED: labelNum = ps.runspeed; break; case PLAYER_SBS: labelNum = ps.sbs; break; case PLAYER_SCREAM_VOICE: labelNum = ps.scream_voice; break; @@ -741,21 +747,25 @@ void __fastcall VM_SetPlayer(int const playerNum, int const labelNum, int const switch (labelNum) { - case PLAYER_HORIZ: ps.q16horiz = fix16_from_int(newValue); break; - case PLAYER_OHORIZ: ps.oq16horiz = fix16_from_int(newValue); break; - case PLAYER_OHORIZOFF: ps.oq16horizoff = fix16_from_int(newValue); break; - case PLAYER_ANG: ps.q16ang = fix16_from_int(newValue); break; - case PLAYER_OANG: ps.oq16ang = fix16_from_int(newValue); break; - case PLAYER_ANGVEL: ps.q16angvel = fix16_from_int(newValue); break; - case PLAYER_HORIZOFF: ps.q16horizoff = fix16_from_int(newValue); break; - - case PLAYER_Q16HORIZ: ps.q16horiz = newValue; break; - case PLAYER_OQ16HORIZ: ps.oq16horiz = newValue; break; - case PLAYER_OQ16HORIZOFF: ps.oq16horizoff = newValue; break; - case PLAYER_Q16ANG: ps.q16ang = newValue; break; - case PLAYER_OQ16ANG: ps.oq16ang = newValue; break; - case PLAYER_Q16ANGVEL: ps.q16angvel = newValue; break; - case PLAYER_Q16HORIZOFF: ps.q16horizoff = newValue; break; + case PLAYER_HORIZ: ps.q16horiz = fix16_from_int(newValue); break; + case PLAYER_OHORIZ: ps.oq16horiz = fix16_from_int(newValue); break; + case PLAYER_OHORIZOFF: ps.oq16horizoff = fix16_from_int(newValue); break; + case PLAYER_ANG: ps.q16ang = fix16_from_int(newValue); break; + case PLAYER_OANG: ps.oq16ang = fix16_from_int(newValue); break; + case PLAYER_ANGVEL: ps.q16angvel = fix16_from_int(newValue); break; + case PLAYER_HORIZOFF: ps.q16horizoff = fix16_from_int(newValue); break; + case PLAYER_ROTSCRNANG: ps.q16rotscrnang = fix16_from_int(newValue); break; + case PLAYER_OROTSCRNANG: ps.oq16rotscrnang = fix16_from_int(newValue); break; + + case PLAYER_Q16HORIZ: ps.q16horiz = newValue; break; + case PLAYER_OQ16HORIZ: ps.oq16horiz = newValue; break; + case PLAYER_OQ16HORIZOFF: ps.oq16horizoff = newValue; break; + case PLAYER_Q16ANG: ps.q16ang = newValue; break; + case PLAYER_OQ16ANG: ps.oq16ang = newValue; break; + case PLAYER_Q16ANGVEL: ps.q16angvel = newValue; break; + case PLAYER_Q16HORIZOFF: ps.q16horizoff = newValue; break; + case PLAYER_Q16ROTSCRNANG: ps.q16rotscrnang = newValue; break; + case PLAYER_OQ16ROTSCRNANG: ps.oq16rotscrnang = newValue; break; case PLAYER_ACCESS_INCS: ps.access_incs = newValue; break; case PLAYER_ACCESS_SPRITENUM: ps.access_spritenum = newValue; break; @@ -851,7 +861,6 @@ void __fastcall VM_SetPlayer(int const playerNum, int const labelNum, int const case PLAYER_RAPID_FIRE_HOLD: ps.rapid_fire_hold = newValue; break; case PLAYER_RELOADING: ps.reloading = newValue; break; case PLAYER_RETURN_TO_CENTER: ps.return_to_center = newValue; break; - case PLAYER_ROTSCRNANG: ps.rotscrnang = newValue; break; case PLAYER_RUNSPEED: ps.runspeed = newValue; break; case PLAYER_SBS: ps.sbs = newValue; break; case PLAYER_SCREAM_VOICE: ps.scream_voice = newValue; break; diff --git a/source/duke3d/src/player.cpp b/source/duke3d/src/player.cpp index da4c287d4..ed08eba25 100644 --- a/source/duke3d/src/player.cpp +++ b/source/duke3d/src/player.cpp @@ -4651,7 +4651,7 @@ void P_UpdatePosWhenViewingCam(DukePlayer_t *pPlayer) pPlayer->vel.y = 0; sprite[pPlayer->i].xvel = 0; pPlayer->look_ang = 0; - pPlayer->rotscrnang = 0; + pPlayer->q16rotscrnang = 0; } static void P_DoWater(int const playerNum, int const playerBits, int const floorZ, int const ceilZ) @@ -4817,7 +4817,7 @@ static void P_Dead(int const playerNum, int const sectorLotag, int const floorZ, pushmove(&pPlayer->pos, &pPlayer->cursectnum, 128L, (4L<<8), (20L<<8), CLIPMASK0); if (floorZ > ceilZ + ZOFFSET2 && pSprite->pal != 1) - pPlayer->rotscrnang = (pPlayer->dead_flag + ((floorZ+pPlayer->pos.z)>>7))&2047; + pPlayer->q16rotscrnang = fix16_from_int((pPlayer->dead_flag + ((floorZ+pPlayer->pos.z)>>7))) & 0x7FFFFFF; pPlayer->on_warping_sector = 0; } @@ -5047,10 +5047,10 @@ void P_ProcessInput(int playerNum) return; } - pPlayer->rotscrnang -= (pPlayer->rotscrnang >> 1); + pPlayer->q16rotscrnang = fix16_ssub(pPlayer->q16rotscrnang, fix16_sdiv(pPlayer->q16rotscrnang, fix16_from_int(2))); - if (pPlayer->rotscrnang && !(pPlayer->rotscrnang >> 1)) - pPlayer->rotscrnang -= ksgn(pPlayer->rotscrnang); + if (pPlayer->q16rotscrnang && !fix16_sdiv(pPlayer->q16rotscrnang, fix16_from_int(2))) + pPlayer->q16rotscrnang = fix16_ssub(pPlayer->q16rotscrnang, fix16_from_int(ksgn(fix16_to_int(pPlayer->q16rotscrnang)))); pPlayer->look_ang -= (pPlayer->look_ang >> 2); @@ -5063,7 +5063,7 @@ void P_ProcessInput(int playerNum) if (VM_OnEvent(EVENT_LOOKLEFT,pPlayer->i,playerNum) == 0) { pPlayer->look_ang -= 152; - pPlayer->rotscrnang += 24; + pPlayer->q16rotscrnang = fix16_sadd(pPlayer->q16rotscrnang, fix16_from_int(24)); } } @@ -5073,7 +5073,7 @@ void P_ProcessInput(int playerNum) if (VM_OnEvent(EVENT_LOOKRIGHT,pPlayer->i,playerNum) == 0) { pPlayer->look_ang += 152; - pPlayer->rotscrnang -= 24; + pPlayer->q16rotscrnang = fix16_ssub(pPlayer->q16rotscrnang, fix16_from_int(24)); } } diff --git a/source/duke3d/src/player.h b/source/duke3d/src/player.h index c95253603..fd6962cd3 100644 --- a/source/duke3d/src/player.h +++ b/source/duke3d/src/player.h @@ -146,6 +146,7 @@ typedef struct { fix16_t q16horiz, q16horizoff, oq16horiz, oq16horizoff; fix16_t q16ang, oq16ang, q16angvel; + fix16_t oq16rotscrnang, q16rotscrnang; // JBF 20031220: added orotscrnang int32_t truefz, truecz, player_par; int32_t runspeed, max_player_health, max_shield_amount; @@ -171,7 +172,7 @@ typedef struct { int16_t weaprecs[MAX_WEAPONS], weapon_sway, crack_time, bobcounter; - int16_t orotscrnang, rotscrnang, dead_flag; // JBF 20031220: added orotscrnang + int16_t dead_flag; int16_t holoduke_on, pycount; int16_t transporter_hold, clipdist; diff --git a/source/duke3d/src/premap.cpp b/source/duke3d/src/premap.cpp index 8cc75fa88..90300770e 100644 --- a/source/duke3d/src/premap.cpp +++ b/source/duke3d/src/premap.cpp @@ -709,7 +709,7 @@ void P_ResetMultiPlayer(int playerNum) p.opyoff = 0; p.q16horiz = F16(100); p.q16horizoff = 0; - p.rotscrnang = 0; + p.q16rotscrnang = 0; p.runspeed = g_playerFriction; p.vel = { 0, 0, 0 }; p.wackedbyactor = -1; @@ -793,7 +793,7 @@ void P_ResetPlayer(int playerNum) p.one_eighty_count = 0; p.opyoff = 0; p.oq16horiz = F16(140); - p.orotscrnang = 1; // JBF 20031220 + p.oq16rotscrnang = fix16_one; // JBF 20031220 p.over_shoulder_on = 0; p.palette = BASEPAL; p.player_par = 0; @@ -807,7 +807,7 @@ void P_ResetPlayer(int playerNum) p.rapid_fire_hold = 0; p.reloading = 0; p.return_to_center = 9; - p.rotscrnang = 0; + p.q16rotscrnang = 0; p.sbs = 0; p.show_empty_weapon = 0; p.somethingonplayer = -1; -- GitLab From 43eb263ec46ef240e3c94bd5eaa647425b3c2495 Mon Sep 17 00:00:00 2001 From: Mitchell Richters Date: Wed, 10 Jun 2020 06:05:56 +1000 Subject: [PATCH 2/5] Duke3D: Promote look_ang to Q16.16. --- source/duke3d/src/game.cpp | 6 +- source/duke3d/src/gamedef.h | 1 + source/duke3d/src/gameexec.cpp | 2 +- source/duke3d/src/gamestructures.cpp | 7 +- source/duke3d/src/player.cpp | 96 ++++++++++++++-------------- source/duke3d/src/player.h | 6 +- source/duke3d/src/premap.cpp | 2 +- source/duke3d/src/screens.cpp | 2 +- 8 files changed, 63 insertions(+), 59 deletions(-) diff --git a/source/duke3d/src/game.cpp b/source/duke3d/src/game.cpp index 3b9eeea23..8583aadd8 100644 --- a/source/duke3d/src/game.cpp +++ b/source/duke3d/src/game.cpp @@ -968,13 +968,13 @@ void G_DrawRooms(int32_t playerNum, int32_t smoothRatio) { CAMERA(q16ang) = pPlayer->oq16ang + mulscale16(((pPlayer->q16ang + F16(1024) - pPlayer->oq16ang) & 0x7FFFFFF) - F16(1024), smoothRatio) - + fix16_from_int(pPlayer->look_ang); + + pPlayer->q16look_ang; CAMERA(q16horiz) = pPlayer->oq16horiz + pPlayer->oq16horizoff + mulscale16((pPlayer->q16horiz + pPlayer->q16horizoff - pPlayer->oq16horiz - pPlayer->oq16horizoff), smoothRatio); } else { - CAMERA(q16ang) = pPlayer->q16ang + fix16_from_int(pPlayer->look_ang); + CAMERA(q16ang) = pPlayer->q16ang + pPlayer->q16look_ang; CAMERA(q16horiz) = pPlayer->q16horiz + pPlayer->q16horizoff; } @@ -1005,7 +1005,7 @@ void G_DrawRooms(int32_t playerNum, int32_t smoothRatio) // looking through viewscreen CAMERA(pos) = camVect; - CAMERA(q16ang) = pPlayer->q16ang + fix16_from_int(pPlayer->look_ang); + CAMERA(q16ang) = pPlayer->q16ang + pPlayer->q16look_ang; CAMERA(q16horiz) = fix16_from_int(100 + sprite[pPlayer->newowner].shade); CAMERA(sect) = sprite[pPlayer->newowner].sectnum; } diff --git a/source/duke3d/src/gamedef.h b/source/duke3d/src/gamedef.h index 5076c8550..728da3c7b 100644 --- a/source/duke3d/src/gamedef.h +++ b/source/duke3d/src/gamedef.h @@ -284,6 +284,7 @@ enum PlayerLabel_t PLAYER_Q16ANGVEL, PLAYER_CURSECTNUM, PLAYER_LOOK_ANG, + PLAYER_Q16LOOK_ANG, PLAYER_LAST_EXTRA, PLAYER_SUBWEAPON, PLAYER_AMMO_AMOUNT, diff --git a/source/duke3d/src/gameexec.cpp b/source/duke3d/src/gameexec.cpp index ffcd1829b..91eea5cf3 100644 --- a/source/duke3d/src/gameexec.cpp +++ b/source/duke3d/src/gameexec.cpp @@ -251,7 +251,7 @@ GAMEEXEC_STATIC GAMEEXEC_INLINE void P_ForceAngle(DukePlayer_t *pPlayer) pPlayer->q16horiz += F16(64); pPlayer->return_to_center = 9; pPlayer->q16rotscrnang = fix16_from_int(nAngle >> 1); - pPlayer->look_ang = fix16_to_int(pPlayer->q16rotscrnang); + pPlayer->q16look_ang = pPlayer->q16rotscrnang; } // wow, this function sucks diff --git a/source/duke3d/src/gamestructures.cpp b/source/duke3d/src/gamestructures.cpp index 53ad62820..ccc84f1b6 100644 --- a/source/duke3d/src/gamestructures.cpp +++ b/source/duke3d/src/gamestructures.cpp @@ -418,6 +418,7 @@ memberlabel_t const PlayerLabels[]= { "q16angvel", PLAYER_Q16ANGVEL, 0, 0, -1 }, { "cursectnum", PLAYER_CURSECTNUM, 0, 0, -1 }, { "look_ang", PLAYER_LOOK_ANG, 0, 0, -1 }, + { "q16look_ang", PLAYER_Q16LOOK_ANG, 0, 0, -1 }, { "last_extra", PLAYER_LAST_EXTRA, 0, 0, -1 }, { "subweapon", PLAYER_SUBWEAPON, 0, 0, -1 }, { "ammo_amount", PLAYER_AMMO_AMOUNT, LABEL_HASPARM2, MAX_WEAPONS, -1 }, @@ -559,6 +560,7 @@ int32_t __fastcall VM_GetPlayer(int const playerNum, int32_t labelNum, int const case PLAYER_OHORIZOFF: labelNum = fix16_to_int(ps.oq16horizoff); break; case PLAYER_ROTSCRNANG: labelNum = fix16_to_int(ps.q16rotscrnang); break; case PLAYER_OROTSCRNANG: labelNum = fix16_to_int(ps.oq16rotscrnang); break; + case PLAYER_LOOK_ANG: labelNum = fix16_to_int(ps.q16look_ang); break; case PLAYER_Q16ANG: labelNum = ps.q16ang; break; case PLAYER_OQ16ANG: labelNum = ps.oq16ang; break; @@ -569,6 +571,7 @@ int32_t __fastcall VM_GetPlayer(int const playerNum, int32_t labelNum, int const case PLAYER_OQ16HORIZOFF: labelNum = ps.oq16horizoff; break; case PLAYER_Q16ROTSCRNANG: labelNum = ps.q16rotscrnang; break; case PLAYER_OQ16ROTSCRNANG: labelNum = ps.oq16rotscrnang; break; + case PLAYER_Q16LOOK_ANG: labelNum = ps.q16look_ang; break; case PLAYER_ACCESS_INCS: labelNum = ps.access_incs; break; case PLAYER_ACCESS_SPRITENUM: labelNum = ps.access_spritenum; break; @@ -634,7 +637,6 @@ int32_t __fastcall VM_GetPlayer(int const playerNum, int32_t labelNum, int const case PLAYER_LOOGCNT: labelNum = ps.loogcnt; break; case PLAYER_LOOGIEX: labelNum = ps.loogiex[lParm2]; break; case PLAYER_LOOGIEY: labelNum = ps.loogiey[lParm2]; break; - case PLAYER_LOOK_ANG: labelNum = ps.look_ang; break; case PLAYER_MAX_ACTORS_KILLED: labelNum = ps.max_actors_killed; break; case PLAYER_MAX_PLAYER_HEALTH: labelNum = ps.max_player_health; break; case PLAYER_MAX_SECRET_ROOMS: labelNum = ps.max_secret_rooms; break; @@ -756,6 +758,7 @@ void __fastcall VM_SetPlayer(int const playerNum, int const labelNum, int const case PLAYER_HORIZOFF: ps.q16horizoff = fix16_from_int(newValue); break; case PLAYER_ROTSCRNANG: ps.q16rotscrnang = fix16_from_int(newValue); break; case PLAYER_OROTSCRNANG: ps.oq16rotscrnang = fix16_from_int(newValue); break; + case PLAYER_LOOK_ANG: ps.q16look_ang = fix16_from_int(newValue); break; case PLAYER_Q16HORIZ: ps.q16horiz = newValue; break; case PLAYER_OQ16HORIZ: ps.oq16horiz = newValue; break; @@ -766,6 +769,7 @@ void __fastcall VM_SetPlayer(int const playerNum, int const labelNum, int const case PLAYER_Q16HORIZOFF: ps.q16horizoff = newValue; break; case PLAYER_Q16ROTSCRNANG: ps.q16rotscrnang = newValue; break; case PLAYER_OQ16ROTSCRNANG: ps.oq16rotscrnang = newValue; break; + case PLAYER_Q16LOOK_ANG: ps.q16look_ang = newValue; break; case PLAYER_ACCESS_INCS: ps.access_incs = newValue; break; case PLAYER_ACCESS_SPRITENUM: ps.access_spritenum = newValue; break; @@ -827,7 +831,6 @@ void __fastcall VM_SetPlayer(int const playerNum, int const labelNum, int const case PLAYER_LOOGCNT: ps.loogcnt = newValue; break; case PLAYER_LOOGIEX: ps.loogiex[lParm2] = newValue; break; case PLAYER_LOOGIEY: ps.loogiey[lParm2] = newValue; break; - case PLAYER_LOOK_ANG: ps.look_ang = newValue; break; case PLAYER_MAX_ACTORS_KILLED: ps.max_actors_killed = newValue; break; case PLAYER_MAX_PLAYER_HEALTH: ps.max_player_health = newValue; break; case PLAYER_MAX_SECRET_ROOMS: ps.max_secret_rooms = newValue; break; diff --git a/source/duke3d/src/player.cpp b/source/duke3d/src/player.cpp index ed08eba25..661b4475f 100644 --- a/source/duke3d/src/player.cpp +++ b/source/duke3d/src/player.cpp @@ -1808,7 +1808,7 @@ static int P_DisplayFist(int const fistShade) case -1: return 0; } - int const fistY = klabs(pPlayer->look_ang) / 9; + int const fistY = klabs(fix16_to_int(pPlayer->q16look_ang)) / 9; int const fistZoom = clamp(65536 - (sintable[(512 + (fistInc << 6)) & 2047] << 2), 40920, 90612); int const fistYOffset = 194 + (sintable[((6 + fistInc) << 7) & 2047] >> 9); int const fistPal = P_GetHudPal(pPlayer); @@ -1967,10 +1967,10 @@ static int P_DisplayKnee(int kneeShade) if (ps->knee_incs >= ARRAY_SIZE(knee_y) || sprite[ps->i].extra <= 0) return 0; - int const kneeY = knee_y[ps->knee_incs] + (klabs(ps->look_ang) / 9) - (ps->hard_landing << 3); + int const kneeY = knee_y[ps->knee_incs] + (klabs(fix16_to_int(ps->q16look_ang)) / 9) - (ps->hard_landing << 3); int const kneePal = P_GetKneePal(ps); - G_DrawTileScaled(105+(fix16_to_int(g_player[screenpeek].input->q16avel)>>5)-(ps->look_ang>>1)+(knee_y[ps->knee_incs]>>2), + G_DrawTileScaled(105+(fix16_to_int(g_player[screenpeek].input->q16avel)>>5)-(fix16_to_int(ps->q16look_ang)>>1)+(knee_y[ps->knee_incs]>>2), kneeY+280-(fix16_to_int(ps->q16horiz-ps->q16horizoff)>>4),KNEE,kneeShade,4+DRAWEAP_CENTER,kneePal); return 1; @@ -1997,10 +1997,10 @@ static int P_DisplayKnuckles(int knuckleShade) if ((unsigned) (pPlayer->knuckle_incs>>1) >= ARRAY_SIZE(knuckleFrames) || sprite[pPlayer->i].extra <= 0) return 0; - int const knuckleY = (klabs(pPlayer->look_ang) / 9) - (pPlayer->hard_landing << 3); + int const knuckleY = (klabs(fix16_to_int(pPlayer->q16look_ang)) / 9) - (pPlayer->hard_landing << 3); int const knucklePal = P_GetHudPal(pPlayer); - G_DrawTileScaled(160 + (fix16_to_int(g_player[screenpeek].input->q16avel) >> 5) - (pPlayer->look_ang >> 1), + G_DrawTileScaled(160 + (fix16_to_int(g_player[screenpeek].input->q16avel) >> 5) - (fix16_to_int(pPlayer->q16look_ang) >> 1), knuckleY + 180 - (fix16_to_int(pPlayer->q16horiz - pPlayer->q16horizoff) >> 4), CRACKKNUCKLES + knuckleFrames[pPlayer->knuckle_incs >> 1], knuckleShade, 4 + DRAWEAP_CENTER, knucklePal); @@ -2163,13 +2163,13 @@ static int P_DisplayTip(int tipShade) if ((unsigned)pPlayer->tipincs >= ARRAY_SIZE(access_tip_y)) return 1; - int const tipY = (klabs(pPlayer->look_ang) / 9) - (pPlayer->hard_landing << 3); + int const tipY = (klabs(fix16_to_int(pPlayer->q16look_ang)) / 9) - (pPlayer->hard_landing << 3); int const tipPal = P_GetHudPal(pPlayer); int const tipYOffset = access_tip_y[pPlayer->tipincs] >> 1; guniqhudid = 201; - G_DrawTileScaled(170 + (fix16_to_int(g_player[screenpeek].input->q16avel) >> 5) - (pPlayer->look_ang >> 1), + G_DrawTileScaled(170 + (fix16_to_int(g_player[screenpeek].input->q16avel) >> 5) - (fix16_to_int(pPlayer->q16look_ang) >> 1), tipYOffset + tipY + 240 - (fix16_to_int(pPlayer->q16horiz - pPlayer->q16horizoff) >> 4), TIP + ((26 - pPlayer->tipincs) >> 4), tipShade, DRAWEAP_CENTER, tipPal); @@ -2195,20 +2195,20 @@ static int P_DisplayAccess(int accessShade) return 1; int const accessX = access_tip_y[pSprite->access_incs] >> 2; - int const accessY = access_tip_y[pSprite->access_incs] + (klabs(pSprite->look_ang) / 9) - (pSprite->hard_landing << 3); + int const accessY = access_tip_y[pSprite->access_incs] + (klabs(fix16_to_int(pSprite->q16look_ang)) / 9) - (pSprite->hard_landing << 3); int const accessPal = (pSprite->access_spritenum >= 0) ? sprite[pSprite->access_spritenum].pal : 0; guniqhudid = 200; if ((pSprite->access_incs - 3) > 0 && (pSprite->access_incs - 3) >> 3) { - G_DrawTileScaled(170 + (fix16_to_int(g_player[screenpeek].input->q16avel) >> 5) - (pSprite->look_ang >> 1) + accessX, + G_DrawTileScaled(170 + (fix16_to_int(g_player[screenpeek].input->q16avel) >> 5) - (fix16_to_int(pSprite->q16look_ang) >> 1) + accessX, accessY + 266 - (fix16_to_int(pSprite->q16horiz - pSprite->q16horizoff) >> 4), HANDHOLDINGLASER + (pSprite->access_incs >> 3), accessShade, DRAWEAP_CENTER, accessPal); } else { - G_DrawTileScaled(170 + (fix16_to_int(g_player[screenpeek].input->q16avel) >> 5) - (pSprite->look_ang >> 1) + accessX, + G_DrawTileScaled(170 + (fix16_to_int(g_player[screenpeek].input->q16avel) >> 5) - (fix16_to_int(pSprite->q16look_ang) >> 1) + accessX, accessY + 266 - (fix16_to_int(pSprite->q16horiz - pSprite->q16horizoff) >> 4), HANDHOLDINGACCESS, accessShade, 4 + DRAWEAP_CENTER, accessPal); } @@ -2234,7 +2234,7 @@ void P_DisplayWeapon(void) return; int weaponX = (160) - 90; - int weaponY = klabs(pPlayer->look_ang) / 9; + int weaponY = klabs(fix16_to_int(pPlayer->q16look_ang)) / 9; int weaponYOffset = 80 - (pPlayer->weapon_pos * pPlayer->weapon_pos); int weaponShade = sprite[pPlayer->i].shade <= 24 ? sprite[pPlayer->i].shade : 24; @@ -2264,7 +2264,7 @@ void P_DisplayWeapon(void) hudweap.gunposx = weaponX; hudweap.shade = weaponShade; hudweap.count = *weaponFrame; - hudweap.lookhalfang = pPlayer->look_ang >> 1; + hudweap.lookhalfang = fix16_to_int(pPlayer->q16look_ang) >> 1; if (VM_OnEvent(EVENT_DISPLAYWEAPON, pPlayer->i, screenpeek) == 0) { @@ -2278,10 +2278,10 @@ void P_DisplayWeapon(void) guniqhudid = 100; if (quickKickFrame < 6 || quickKickFrame > 12) - G_DrawTileScaled(weaponX + 80 - (pPlayer->look_ang >> 1), weaponY + 250 - weaponYOffset, KNEE, weaponShade, + G_DrawTileScaled(weaponX + 80 - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 250 - weaponYOffset, KNEE, weaponShade, weaponBits | 4 | DRAWEAP_CENTER, weaponPal); else - G_DrawTileScaled(weaponX + 160 - 16 - (pPlayer->look_ang >> 1), weaponY + 214 - weaponYOffset, KNEE + 1, + G_DrawTileScaled(weaponX + 160 - 16 - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 214 - weaponYOffset, KNEE + 1, weaponShade, weaponBits | 4 | DRAWEAP_CENTER, weaponPal); guniqhudid = 0; } @@ -2301,10 +2301,10 @@ void P_DisplayWeapon(void) currentWeapon = weaponX; weaponX += sintable[(fistPos)&2047] >> 10; - G_DrawTileScaled(weaponX + 250 - (pPlayer->look_ang >> 1), weaponY + 258 - (klabs(sintable[(fistPos)&2047] >> 8)), + G_DrawTileScaled(weaponX + 250 - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 258 - (klabs(sintable[(fistPos)&2047] >> 8)), FIST, weaponShade, weaponBits, weaponPal); weaponX = currentWeapon - (sintable[(fistPos)&2047] >> 10); - G_DrawTileScaled(weaponX + 40 - (pPlayer->look_ang >> 1), weaponY + 200 + (klabs(sintable[(fistPos)&2047] >> 8)), FIST, + G_DrawTileScaled(weaponX + 40 - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 200 + (klabs(sintable[(fistPos)&2047] >> 8)), FIST, weaponShade, weaponBits | 4, weaponPal); } else @@ -2328,7 +2328,7 @@ void P_DisplayWeapon(void) #ifndef EDUKE32_STANDALONE int const doAnim = !(sprite[pPlayer->i].pal == 1 || ud.pause_on || g_player[myconnectindex].ps->gm & MODE_MENU); - int const halfLookAng = pPlayer->look_ang >> 1; + int const halfLookAng = fix16_to_int(pPlayer->q16look_ang) >> 1; int const weaponPal = P_GetHudPal(pPlayer); @@ -2592,7 +2592,7 @@ void P_DisplayWeapon(void) switch (*weaponFrame) { case 0: - G_DrawWeaponTileWithID(currentWeapon, weaponX + 178 - (pPlayer->look_ang >> 1), weaponY + 233 - weaponYOffset, + G_DrawWeaponTileWithID(currentWeapon, weaponX + 178 - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 233 - weaponYOffset, CHAINGUN + 1, weaponShade, weaponBits, weaponPal); break; @@ -2601,11 +2601,11 @@ void P_DisplayWeapon(void) *weaponFrame < PWEAPON(screenpeek, CHAINGUN_WEAPON, TotalTime)) { int randomOffset = doAnim ? rand()&7 : 0; - G_DrawWeaponTileWithID(currentWeapon << 2, randomOffset + weaponX - 4 + 140 - (pPlayer->look_ang >> 1), + G_DrawWeaponTileWithID(currentWeapon << 2, randomOffset + weaponX - 4 + 140 - (fix16_to_int(pPlayer->q16look_ang) >> 1), randomOffset + weaponY - ((*weaponFrame) >> 1) + 208 - weaponYOffset, CHAINGUN + 5 + ((*weaponFrame - 4) / 5), weaponShade, weaponBits, weaponPal); if (doAnim) randomOffset = rand()&7; - G_DrawWeaponTileWithID(currentWeapon << 2, randomOffset + weaponX - 4 + 184 - (pPlayer->look_ang >> 1), + G_DrawWeaponTileWithID(currentWeapon << 2, randomOffset + weaponX - 4 + 184 - (fix16_to_int(pPlayer->q16look_ang) >> 1), randomOffset + weaponY - ((*weaponFrame) >> 1) + 208 - weaponYOffset, CHAINGUN + 5 + ((*weaponFrame - 4) / 5), weaponShade, weaponBits, weaponPal); } @@ -2613,20 +2613,20 @@ void P_DisplayWeapon(void) if (*weaponFrame < PWEAPON(screenpeek, CHAINGUN_WEAPON, TotalTime)-4) { int const randomOffset = doAnim ? rand()&7 : 0; - G_DrawWeaponTileWithID(currentWeapon << 2, randomOffset + weaponX - 4 + 162 - (pPlayer->look_ang >> 1), + G_DrawWeaponTileWithID(currentWeapon << 2, randomOffset + weaponX - 4 + 162 - (fix16_to_int(pPlayer->q16look_ang) >> 1), randomOffset + weaponY - ((*weaponFrame) >> 1) + 208 - weaponYOffset, CHAINGUN + 5 + ((*weaponFrame - 2) / 5), weaponShade, weaponBits, weaponPal); - G_DrawWeaponTileWithID(currentWeapon, weaponX + 178 - (pPlayer->look_ang >> 1), weaponY + 233 - weaponYOffset, + G_DrawWeaponTileWithID(currentWeapon, weaponX + 178 - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 233 - weaponYOffset, CHAINGUN + 1 + ((*weaponFrame) >> 1), weaponShade, weaponBits, weaponPal); } else - G_DrawWeaponTileWithID(currentWeapon, weaponX + 178 - (pPlayer->look_ang >> 1), weaponY + 233 - weaponYOffset, + G_DrawWeaponTileWithID(currentWeapon, weaponX + 178 - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 233 - weaponYOffset, CHAINGUN + 1, weaponShade, weaponBits, weaponPal); break; } - G_DrawWeaponTileWithID(currentWeapon << 1, weaponX + 168 - (pPlayer->look_ang >> 1), weaponY + 260 - weaponYOffset, + G_DrawWeaponTileWithID(currentWeapon << 1, weaponX + 168 - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 260 - weaponYOffset, CHAINGUN, weaponShade, weaponBits, weaponPal); break; @@ -2640,7 +2640,7 @@ void P_DisplayWeapon(void) if ((*weaponFrame) == PWEAPON(screenpeek, PISTOL_WEAPON, FireDelay)) pistolOffset -= 3; - G_DrawWeaponTileWithID(currentWeapon, (pistolOffset - (pPlayer->look_ang >> 1)), (weaponY + 244 - weaponYOffset), + G_DrawWeaponTileWithID(currentWeapon, (pistolOffset - (fix16_to_int(pPlayer->q16look_ang) >> 1)), (weaponY + 244 - weaponYOffset), FIRSTGUN + pistolFrames[*weaponFrame > 2 ? 0 : *weaponFrame], weaponShade, 2, weaponPal); @@ -2653,41 +2653,41 @@ void P_DisplayWeapon(void) int32_t const FIRSTGUN_5 = WORLDTOUR ? FIRSTGUNRELOADWIDE : FIRSTGUN + 5; if ((*weaponFrame) < PWEAPON(screenpeek, PISTOL_WEAPON, Reload) - (NAM_WW2GI ? 40 : 17)) - G_DrawWeaponTileWithID(currentWeapon, 194 - (pPlayer->look_ang >> 1), weaponY + 230 - weaponYOffset, FIRSTGUN + 4, + G_DrawWeaponTileWithID(currentWeapon, 194 - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 230 - weaponYOffset, FIRSTGUN + 4, weaponShade, weaponBits, weaponPal); else if ((*weaponFrame) < PWEAPON(screenpeek, PISTOL_WEAPON, Reload) - (NAM_WW2GI ? 35 : 12)) { - G_DrawWeaponTileWithID(currentWeapon << 1, 244 - ((*weaponFrame) << 3) - (pPlayer->look_ang >> 1), + G_DrawWeaponTileWithID(currentWeapon << 1, 244 - ((*weaponFrame) << 3) - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 130 - weaponYOffset + ((*weaponFrame) << 4), FIRSTGUN + 6, weaponShade, weaponBits, weaponPal); - G_DrawWeaponTileWithID(currentWeapon, 224 - (pPlayer->look_ang >> 1), weaponY + 220 - weaponYOffset, FIRSTGUN_5, + G_DrawWeaponTileWithID(currentWeapon, 224 - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 220 - weaponYOffset, FIRSTGUN_5, weaponShade, weaponBits, weaponPal); } else if ((*weaponFrame) < PWEAPON(screenpeek, PISTOL_WEAPON, Reload) - (NAM_WW2GI ? 30 : 7)) { - G_DrawWeaponTileWithID(currentWeapon << 1, 124 + ((*weaponFrame) << 1) - (pPlayer->look_ang >> 1), + G_DrawWeaponTileWithID(currentWeapon << 1, 124 + ((*weaponFrame) << 1) - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 430 - weaponYOffset - ((*weaponFrame) << 3), FIRSTGUN + 6, weaponShade, weaponBits, weaponPal); - G_DrawWeaponTileWithID(currentWeapon, 224 - (pPlayer->look_ang >> 1), weaponY + 220 - weaponYOffset, FIRSTGUN_5, + G_DrawWeaponTileWithID(currentWeapon, 224 - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 220 - weaponYOffset, FIRSTGUN_5, weaponShade, weaponBits, weaponPal); } else if ((*weaponFrame) < PWEAPON(screenpeek, PISTOL_WEAPON, Reload) - (NAM_WW2GI ? 12 : 4)) { - G_DrawWeaponTileWithID(currentWeapon << 2, 184 - (pPlayer->look_ang >> 1), weaponY + 235 - weaponYOffset, + G_DrawWeaponTileWithID(currentWeapon << 2, 184 - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 235 - weaponYOffset, FIRSTGUN + 8, weaponShade, weaponBits, weaponPal); - G_DrawWeaponTileWithID(currentWeapon, 224 - (pPlayer->look_ang >> 1), weaponY + 210 - weaponYOffset, FIRSTGUN_5, + G_DrawWeaponTileWithID(currentWeapon, 224 - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 210 - weaponYOffset, FIRSTGUN_5, weaponShade, weaponBits, weaponPal); } else if ((*weaponFrame) < PWEAPON(screenpeek, PISTOL_WEAPON, Reload) - (NAM_WW2GI ? 6 : 2)) { - G_DrawWeaponTileWithID(currentWeapon << 2, 164 - (pPlayer->look_ang >> 1), weaponY + 245 - weaponYOffset, + G_DrawWeaponTileWithID(currentWeapon << 2, 164 - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 245 - weaponYOffset, FIRSTGUN + 8, weaponShade, weaponBits, weaponPal); - G_DrawWeaponTileWithID(currentWeapon, 224 - (pPlayer->look_ang >> 1), weaponY + 220 - weaponYOffset, FIRSTGUN_5, + G_DrawWeaponTileWithID(currentWeapon, 224 - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 220 - weaponYOffset, FIRSTGUN_5, weaponShade, weaponBits, weaponPal); } else if ((*weaponFrame) < PWEAPON(screenpeek, PISTOL_WEAPON, Reload)) - G_DrawWeaponTileWithID(currentWeapon, 194 - (pPlayer->look_ang >> 1), weaponY + 235 - weaponYOffset, FIRSTGUN_5, + G_DrawWeaponTileWithID(currentWeapon, 194 - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 235 - weaponYOffset, FIRSTGUN_5, weaponShade, weaponBits, weaponPal); break; @@ -2855,13 +2855,13 @@ void P_DisplayWeapon(void) weaponY += rand() & 3; } weaponYOffset -= 16; - G_DrawWeaponTileWithID(currentWeapon << 1, weaponX + 210 - (pPlayer->look_ang >> 1), weaponY + 261 - weaponYOffset, + G_DrawWeaponTileWithID(currentWeapon << 1, weaponX + 210 - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 261 - weaponYOffset, WORLDTOUR ? FREEZEFIREWIDE : FREEZE + 2, -32, weaponBits, weaponPal); - G_DrawWeaponTileWithID(currentWeapon, weaponX + 210 - (pPlayer->look_ang >> 1), weaponY + 235 - weaponYOffset, + G_DrawWeaponTileWithID(currentWeapon, weaponX + 210 - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 235 - weaponYOffset, FREEZE + 3 + freezerFrames[*weaponFrame % 6], -32, weaponBits, weaponPal); } else - G_DrawWeaponTileWithID(currentWeapon, weaponX + 210 - (pPlayer->look_ang >> 1), weaponY + 261 - weaponYOffset, + G_DrawWeaponTileWithID(currentWeapon, weaponX + 210 - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 261 - weaponYOffset, WT_WIDE(FREEZE), weaponShade, weaponBits, weaponPal); break; @@ -2876,16 +2876,16 @@ void P_DisplayWeapon(void) weaponY += rand() & 1; } weaponYOffset -= 16; - G_DrawWeaponTileWithID(currentWeapon << 1, weaponX + 210 - (pPlayer->look_ang >> 1), weaponY + 261 - weaponYOffset, + G_DrawWeaponTileWithID(currentWeapon << 1, weaponX + 210 - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 261 - weaponYOffset, FLAMETHROWERFIRE, -32, weaponBits, weaponPal); - G_DrawWeaponTileWithID(currentWeapon, weaponX + 210 - (pPlayer->look_ang >> 1), weaponY + 235 - weaponYOffset, + G_DrawWeaponTileWithID(currentWeapon, weaponX + 210 - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 235 - weaponYOffset, FLAMETHROWERFIRE + 1 + freezerFrames[*weaponFrame % 6], -32, weaponBits, weaponPal); } else { - G_DrawWeaponTileWithID(currentWeapon, weaponX + 210 - (pPlayer->look_ang >> 1), weaponY + 261 - weaponYOffset, + G_DrawWeaponTileWithID(currentWeapon, weaponX + 210 - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 261 - weaponYOffset, FLAMETHROWER, weaponShade, weaponBits, weaponPal); - G_DrawWeaponTileWithID(currentWeapon, weaponX + 210 - (pPlayer->look_ang >> 1), weaponY + 261 - weaponYOffset, + G_DrawWeaponTileWithID(currentWeapon, weaponX + 210 - (fix16_to_int(pPlayer->q16look_ang) >> 1), weaponY + 261 - weaponYOffset, FLAMETHROWERPILOT, weaponShade, weaponBits, weaponPal); } break; @@ -4650,7 +4650,7 @@ void P_UpdatePosWhenViewingCam(DukePlayer_t *pPlayer) pPlayer->vel.x = 0; pPlayer->vel.y = 0; sprite[pPlayer->i].xvel = 0; - pPlayer->look_ang = 0; + pPlayer->q16look_ang = 0; pPlayer->q16rotscrnang = 0; } @@ -5052,17 +5052,17 @@ void P_ProcessInput(int playerNum) if (pPlayer->q16rotscrnang && !fix16_sdiv(pPlayer->q16rotscrnang, fix16_from_int(2))) pPlayer->q16rotscrnang = fix16_ssub(pPlayer->q16rotscrnang, fix16_from_int(ksgn(fix16_to_int(pPlayer->q16rotscrnang)))); - pPlayer->look_ang -= (pPlayer->look_ang >> 2); + pPlayer->q16look_ang = fix16_ssub(pPlayer->q16look_ang, fix16_sdiv(pPlayer->q16look_ang, fix16_from_int(4))); - if (pPlayer->look_ang && !(pPlayer->look_ang >> 2)) - pPlayer->look_ang -= ksgn(pPlayer->look_ang); + if (pPlayer->q16look_ang && !fix16_sdiv(pPlayer->q16look_ang, fix16_from_int(4))) + pPlayer->q16look_ang = fix16_ssub(pPlayer->q16look_ang, fix16_from_int(ksgn(fix16_to_int(pPlayer->q16look_ang)))); if (TEST_SYNC_KEY(playerBits, SK_LOOK_LEFT)) { // look_left if (VM_OnEvent(EVENT_LOOKLEFT,pPlayer->i,playerNum) == 0) { - pPlayer->look_ang -= 152; + pPlayer->q16look_ang = fix16_ssub(pPlayer->q16look_ang, F16(152)); pPlayer->q16rotscrnang = fix16_sadd(pPlayer->q16rotscrnang, fix16_from_int(24)); } } @@ -5072,7 +5072,7 @@ void P_ProcessInput(int playerNum) // look_right if (VM_OnEvent(EVENT_LOOKRIGHT,pPlayer->i,playerNum) == 0) { - pPlayer->look_ang += 152; + pPlayer->q16look_ang = fix16_sadd(pPlayer->q16look_ang, F16(152)); pPlayer->q16rotscrnang = fix16_ssub(pPlayer->q16rotscrnang, fix16_from_int(24)); } } diff --git a/source/duke3d/src/player.h b/source/duke3d/src/player.h index fd6962cd3..9c17e6fb8 100644 --- a/source/duke3d/src/player.h +++ b/source/duke3d/src/player.h @@ -145,7 +145,7 @@ typedef struct { vec2_t bobpos, fric; fix16_t q16horiz, q16horizoff, oq16horiz, oq16horizoff; - fix16_t q16ang, oq16ang, q16angvel; + fix16_t q16ang, oq16ang, q16angvel, q16look_ang; fix16_t oq16rotscrnang, q16rotscrnang; // JBF 20031220: added orotscrnang int32_t truefz, truecz, player_par; @@ -158,7 +158,7 @@ typedef struct { int16_t loogiex[64], loogiey[64], sbs, sound_pitch; - int16_t cursectnum, look_ang, last_extra, subweapon; + int16_t cursectnum, last_extra, subweapon; int16_t max_ammo_amount[MAX_WEAPONS], ammo_amount[MAX_WEAPONS], inv_amount[GET_MAX]; int16_t wackedbyactor, pyoff, opyoff; @@ -205,7 +205,7 @@ typedef struct { int8_t last_used_weapon; int8_t crouch_toggle; - int8_t padding_[3]; + int8_t padding_[1]; } DukePlayer_t; typedef struct diff --git a/source/duke3d/src/premap.cpp b/source/duke3d/src/premap.cpp index 90300770e..64f196e45 100644 --- a/source/duke3d/src/premap.cpp +++ b/source/duke3d/src/premap.cpp @@ -784,7 +784,7 @@ void P_ResetPlayer(int playerNum) p.last_full_weapon = 0; p.last_pissed_time = 0; p.loogcnt = 0; - p.look_ang = 512 - ((ud.level_number&1)<<10); + p.q16look_ang = fix16_from_int(512 - ((ud.level_number&1)<<10)); p.movement_lock = 0; p.newowner = -1; p.on_crane = -1; diff --git a/source/duke3d/src/screens.cpp b/source/duke3d/src/screens.cpp index 41658339f..67176416d 100644 --- a/source/duke3d/src/screens.cpp +++ b/source/duke3d/src/screens.cpp @@ -1206,7 +1206,7 @@ void G_DisplayRest(int32_t smoothratio) if (g_player[myconnectindex].ps->newowner == -1 && ud.overhead_on == 0 && ud.crosshair && ud.camerasprite == -1) { - ud.returnvar[0] = (160<<16) - (g_player[myconnectindex].ps->look_ang<<15); + ud.returnvar[0] = (160<<16) - (fix16_to_int(g_player[myconnectindex].ps->q16look_ang)<<15); ud.returnvar[1] = 100<<16; int32_t a = VM_OnEventWithReturn(EVENT_DISPLAYCROSSHAIR, g_player[screenpeek].ps->i, screenpeek, CROSSHAIR); if ((unsigned) a < MAXTILES) -- GitLab From 221dfdd7fe69e9812d49834b03b16ef1680bec36 Mon Sep 17 00:00:00 2001 From: Mitchell Richters Date: Wed, 10 Jun 2020 06:11:40 +1000 Subject: [PATCH 3/5] Duke3D: Process q16rotscrnang and q16look_ang at frame-rate. Had to make lastInputTicks a global so it could be reset in P_ResetPlayer(). When first running P_GetInput(), the initial value of elapsedInputTicks is the actual value of timerGetHiTicks(), which is into the thousands. This high initial value was affecting how scaleAdjustmentToInterval() scales as it was taking an initial q16look_ang value of 512 and overflowing the fix16_t type, making it -32,768. --- source/duke3d/src/game.cpp | 2 +- source/duke3d/src/global.h | 1 + source/duke3d/src/player.cpp | 66 ++++++++++++++++++++++++++---------- source/duke3d/src/player.h | 2 ++ source/duke3d/src/premap.cpp | 2 ++ 5 files changed, 55 insertions(+), 18 deletions(-) diff --git a/source/duke3d/src/game.cpp b/source/duke3d/src/game.cpp index 8583aadd8..a594b5ef4 100644 --- a/source/duke3d/src/game.cpp +++ b/source/duke3d/src/game.cpp @@ -944,7 +944,7 @@ void G_DrawRooms(int32_t playerNum, int32_t smoothRatio) ) { #ifdef USE_OPENGL - renderSetRollAngle(fix16_to_float(pPlayer->oq16rotscrnang + mulscale16(((pPlayer->q16rotscrnang - pPlayer->oq16rotscrnang + fix16_from_int(1024))&0x7FFFFFF)-fix16_from_int(1024), smoothRatio))); + renderSetRollAngle(fix16_to_float(pPlayer->q16rotscrnang)); #endif pPlayer->oq16rotscrnang = pPlayer->q16rotscrnang; } diff --git a/source/duke3d/src/global.h b/source/duke3d/src/global.h index 4d90343ff..0a9018757 100644 --- a/source/duke3d/src/global.h +++ b/source/duke3d/src/global.h @@ -163,6 +163,7 @@ G_EXTERN double g_gameUpdateTime; G_EXTERN double g_gameUpdateAndDrawTime; #define GAMEUPDATEAVGTIMENUMSAMPLES 100 extern double g_gameUpdateAvgTime; +G_EXTERN double g_lastInputTicks; #ifndef global_c_ extern char CheatKeys[2]; diff --git a/source/duke3d/src/player.cpp b/source/duke3d/src/player.cpp index 661b4475f..686a71000 100644 --- a/source/duke3d/src/player.cpp +++ b/source/duke3d/src/player.cpp @@ -3033,6 +3033,7 @@ void P_GetInput(int const playerNum) { auto &thisPlayer = g_player[playerNum]; auto const pPlayer = thisPlayer.ps; + auto const pSprite = &sprite[pPlayer->i]; ControlInfo info; if (g_cheatBufLen > 1 || (pPlayer->gm & (MODE_MENU|MODE_TYPE)) || (ud.pause_on && !KB_KeyPressed(sc_Pause))) @@ -3108,11 +3109,13 @@ void P_GetInput(int const playerNum) input.svel -= info.dx * keyMove / analogExtent; input.fvel -= info.dz * keyMove / analogExtent; - static double lastInputTicks; auto const currentHiTicks = timerGetHiTicks(); - double const elapsedInputTicks = currentHiTicks - lastInputTicks; + double const elapsedInputTicks = currentHiTicks - g_lastInputTicks; - lastInputTicks = currentHiTicks; + g_lastInputTicks = currentHiTicks; + + if (elapsedInputTicks == currentHiTicks) + return; auto scaleAdjustmentToInterval = [=](double x) { return x * REALGAMETICSPERSEC / (1000.0 / elapsedInputTicks); }; @@ -3296,6 +3299,31 @@ void P_GetInput(int const playerNum) } } + // don't adjust rotscrnang and look_ang if dead. + if (pSprite->extra > 0) + { + pPlayer->q16rotscrnang = fix16_ssub(pPlayer->q16rotscrnang, fix16_from_dbl(scaleAdjustmentToInterval(fix16_to_dbl(fix16_sdiv(pPlayer->q16rotscrnang, fix16_from_int(2)))))); + + if (pPlayer->q16rotscrnang && !fix16_sdiv(pPlayer->q16rotscrnang, fix16_from_dbl(scaleAdjustmentToInterval(2)))) + pPlayer->q16rotscrnang = fix16_ssub(pPlayer->q16rotscrnang, fix16_from_dbl(scaleAdjustmentToInterval(ksgn(fix16_to_int(pPlayer->q16rotscrnang))))); + + pPlayer->q16look_ang = fix16_ssub(pPlayer->q16look_ang, fix16_from_dbl(scaleAdjustmentToInterval(fix16_to_dbl(fix16_sdiv(pPlayer->q16look_ang, fix16_from_int(4)))))); + + if (pPlayer->q16look_ang && !fix16_sdiv(pPlayer->q16look_ang, fix16_from_dbl(scaleAdjustmentToInterval(4)))) + pPlayer->q16look_ang = fix16_ssub(pPlayer->q16look_ang, fix16_from_dbl(scaleAdjustmentToInterval(ksgn(fix16_to_int(pPlayer->q16look_ang))))); + + if (thisPlayer.lookLeft) + { + pPlayer->q16look_ang = fix16_ssub(pPlayer->q16look_ang, fix16_from_dbl(scaleAdjustmentToInterval(152))); + pPlayer->q16rotscrnang = fix16_sadd(pPlayer->q16rotscrnang, fix16_from_dbl(scaleAdjustmentToInterval(24))); + } + if (thisPlayer.lookRight) + { + pPlayer->q16look_ang = fix16_sadd(pPlayer->q16look_ang, fix16_from_dbl(scaleAdjustmentToInterval(152))); + pPlayer->q16rotscrnang = fix16_ssub(pPlayer->q16rotscrnang, fix16_from_dbl(scaleAdjustmentToInterval(24))); + } + } + // A horiz diff of 128 equal 45 degrees, so we convert horiz to 1024 angle units if (thisPlayer.horizAngleAdjust) @@ -5047,35 +5075,39 @@ void P_ProcessInput(int playerNum) return; } - pPlayer->q16rotscrnang = fix16_ssub(pPlayer->q16rotscrnang, fix16_sdiv(pPlayer->q16rotscrnang, fix16_from_int(2))); - - if (pPlayer->q16rotscrnang && !fix16_sdiv(pPlayer->q16rotscrnang, fix16_from_int(2))) - pPlayer->q16rotscrnang = fix16_ssub(pPlayer->q16rotscrnang, fix16_from_int(ksgn(fix16_to_int(pPlayer->q16rotscrnang)))); - - pPlayer->q16look_ang = fix16_ssub(pPlayer->q16look_ang, fix16_sdiv(pPlayer->q16look_ang, fix16_from_int(4))); - - if (pPlayer->q16look_ang && !fix16_sdiv(pPlayer->q16look_ang, fix16_from_int(4))) - pPlayer->q16look_ang = fix16_ssub(pPlayer->q16look_ang, fix16_from_int(ksgn(fix16_to_int(pPlayer->q16look_ang)))); - if (TEST_SYNC_KEY(playerBits, SK_LOOK_LEFT)) { // look_left if (VM_OnEvent(EVENT_LOOKLEFT,pPlayer->i,playerNum) == 0) { - pPlayer->q16look_ang = fix16_ssub(pPlayer->q16look_ang, F16(152)); - pPlayer->q16rotscrnang = fix16_sadd(pPlayer->q16rotscrnang, fix16_from_int(24)); + thisPlayer.lookLeft = true; + } + else + { + thisPlayer.lookLeft = false; } } + else + { + thisPlayer.lookLeft = false; + } if (TEST_SYNC_KEY(playerBits, SK_LOOK_RIGHT)) { // look_right if (VM_OnEvent(EVENT_LOOKRIGHT,pPlayer->i,playerNum) == 0) { - pPlayer->q16look_ang = fix16_sadd(pPlayer->q16look_ang, F16(152)); - pPlayer->q16rotscrnang = fix16_ssub(pPlayer->q16rotscrnang, fix16_from_int(24)); + thisPlayer.lookRight = true; + } + else + { + thisPlayer.lookRight = false; } } + else + { + thisPlayer.lookRight = false; + } int velocityModifier = TICSPERFRAME; const uint8_t *const weaponFrame = &pPlayer->kickback_pic; diff --git a/source/duke3d/src/player.h b/source/duke3d/src/player.h index 9c17e6fb8..693ea048e 100644 --- a/source/duke3d/src/player.h +++ b/source/duke3d/src/player.h @@ -216,6 +216,8 @@ typedef struct bool horizRecenter; float horizAngleAdjust; fix16_t horizSkew; + bool lookLeft; + bool lookRight; int32_t netsynctime; int32_t pcolor, pteam; diff --git a/source/duke3d/src/premap.cpp b/source/duke3d/src/premap.cpp index 64f196e45..ddae37b05 100644 --- a/source/duke3d/src/premap.cpp +++ b/source/duke3d/src/premap.cpp @@ -844,6 +844,8 @@ void P_ResetPlayer(int playerNum) thisPlayer.horizSkew = 0; thisPlayer.horizAngleAdjust = 0; + g_lastInputTicks = 0; + P_UpdateScreenPal(&p); VM_OnEvent(EVENT_RESETPLAYER, p.i, playerNum); } -- GitLab From 0646613801e19a940199317219f5f7674c7f1b70 Mon Sep 17 00:00:00 2001 From: Mitchell Richters Date: Wed, 10 Jun 2020 06:30:22 +1000 Subject: [PATCH 4/5] Duke3D: Process one_eighty_count (Turn-around key) at frame-rate. --- source/duke3d/src/actors.cpp | 26 +------------------------- source/duke3d/src/gameexec.cpp | 14 ++++++++++++++ source/duke3d/src/gameexec.h | 1 + source/duke3d/src/player.cpp | 29 +++++++++++++++++++++-------- source/duke3d/src/player.h | 1 + source/duke3d/src/sector.cpp | 5 ++++- 6 files changed, 42 insertions(+), 34 deletions(-) diff --git a/source/duke3d/src/actors.cpp b/source/duke3d/src/actors.cpp index 67510d6e8..47681747a 100644 --- a/source/duke3d/src/actors.cpp +++ b/source/duke3d/src/actors.cpp @@ -1330,23 +1330,6 @@ static int P_Submerge(int, DukePlayer_t *, int, int); static int P_Emerge(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]; @@ -1404,18 +1387,11 @@ ACTOR_STATIC void G_MovePlayers(void) thisPlayer.smoothcamera = false; - 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; - if (pPlayer->one_eighty_count < 0) - { - thisPlayer.smoothcamera = true; - pPlayer->one_eighty_count += 128; - pPlayer->q16ang += F16(128); - } - if (g_netServer || ud.multimode > 1) { if (sprite[g_player[otherp].ps->i].extra > 0) diff --git a/source/duke3d/src/gameexec.cpp b/source/duke3d/src/gameexec.cpp index 91eea5cf3..dde26ba95 100644 --- a/source/duke3d/src/gameexec.cpp +++ b/source/duke3d/src/gameexec.cpp @@ -469,6 +469,20 @@ int __fastcall G_GetAngleDelta(int currAngle, int newAngle) return newAngle-currAngle; } +fix16_t __fastcall G_GetQ16AngleDelta(fix16_t currAngle, fix16_t newAngle) +{ + if (fix16_abs(fix16_sub(currAngle, newAngle)) < F16(1024)) + return fix16_sub(newAngle, currAngle); + + if (newAngle > F16(1024)) + newAngle = fix16_sub(newAngle, F16(2048)); + + if (currAngle > F16(1024)) + currAngle = fix16_sub(currAngle, F16(2048)); + + return fix16_sub(newAngle, currAngle); +} + GAMEEXEC_STATIC void VM_AlterAng(int32_t const moveFlags) { int const elapsedTics = (AC_COUNT(vm.pData))&31; diff --git a/source/duke3d/src/gameexec.h b/source/duke3d/src/gameexec.h index efbcdbb8b..c78c5eda6 100644 --- a/source/duke3d/src/gameexec.h +++ b/source/duke3d/src/gameexec.h @@ -85,6 +85,7 @@ void A_Fall(int spriteNum); int A_GetFurthestAngle(int const spriteNum, int const angDiv); void A_GetZLimits(int spriteNum); int __fastcall G_GetAngleDelta(int currAngle, int newAngle); +fix16_t __fastcall G_GetQ16AngleDelta(fix16_t oldAngle, fix16_t newAngle); void G_RestoreMapState(); void G_SaveMapState(); diff --git a/source/duke3d/src/player.cpp b/source/duke3d/src/player.cpp index 686a71000..feae2f04c 100644 --- a/source/duke3d/src/player.cpp +++ b/source/duke3d/src/player.cpp @@ -21,6 +21,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. //------------------------------------------------------------------------- #include "duke3d.h" +#include "gameexec.h" #include "demo.h" #include "enet.h" @@ -2985,14 +2986,15 @@ 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 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 int32_t g_myAimMode = 0, g_myAimStat = 0, g_oldAimStat = 0; int32_t mouseyaxismode = -1; @@ -3290,6 +3292,11 @@ void P_GetInput(int const playerNum) { localInput.q16avel = fix16_sadd(localInput.q16avel, input.q16avel); pPlayer->q16ang = fix16_sadd(pPlayer->q16ang, input.q16avel) & 0x7FFFFFF; + + if (input.q16avel) + { + pPlayer->one_eighty_count = 0; + } } if (!(movementLocked & IL_NOHORIZ)) @@ -3322,6 +3329,12 @@ void P_GetInput(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 diff --git a/source/duke3d/src/player.h b/source/duke3d/src/player.h index 693ea048e..cf3d0d5d4 100644 --- a/source/duke3d/src/player.h +++ b/source/duke3d/src/player.h @@ -169,6 +169,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_WEAPONS], weapon_sway, crack_time, bobcounter; diff --git a/source/duke3d/src/sector.cpp b/source/duke3d/src/sector.cpp index ab694c2f5..4ea2711b3 100644 --- a/source/duke3d/src/sector.cpp +++ b/source/duke3d/src/sector.cpp @@ -3170,7 +3170,10 @@ CHECKINV1: 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; + } } } -- GitLab From 811826289ad93b50f6d6cb8d66c506814759cf93 Mon Sep 17 00:00:00 2001 From: Mitchell Richters Date: Tue, 9 Jun 2020 23:01:00 +1000 Subject: [PATCH 5/5] Duke3D: Bump `BYTEVERSION_EDUKE32` following changes to DukePlayer_t struct. --- source/duke3d/src/duke3d.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/duke3d/src/duke3d.h b/source/duke3d/src/duke3d.h index 5ca361681..1e489a0cf 100644 --- a/source/duke3d/src/duke3d.h +++ b/source/duke3d/src/duke3d.h @@ -57,7 +57,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #endif // increase by 3, because atomic GRP adds 1, and Shareware adds 2 -#define BYTEVERSION_EDUKE32 339 +#define BYTEVERSION_EDUKE32 342 //#define BYTEVERSION_13 27 //#define BYTEVERSION_14 116 -- GitLab