diff --git a/source/sw/src/game.cpp b/source/sw/src/game.cpp index 908b3dfb7..c09083c93 100644 --- a/source/sw/src/game.cpp +++ b/source/sw/src/game.cpp @@ -3019,7 +3019,7 @@ void getinput(int const playerNum) #define MAXANGVEL 1024 #define MAXHORIZVEL 256 #define HORIZ_SPEED (16) -#define TURN_SHIFT 2 +#define TURN_SHIFT 4 #define SET_LOC_KEY(bits, sync_num, key_test) SET(bits, ((!!(key_test)) << (sync_num))) static int32_t turnheldtime; @@ -3295,17 +3295,17 @@ void getinput(int const playerNum) { if (FLAG_KEY_PRESSED(pp, SK_TURN_180)) { - short delta_ang; + fix16_t delta_q16ang; FLAG_KEY_RELEASE(pp, SK_TURN_180); - pp->turn180_target = NORM_ANGLE(fix16_to_int(pp->q16ang) + 1024); + pp->turn180_target = fix16_sadd(pp->q16ang, fix16_from_int(1024)) & 0x7FFFFFF; // make the first turn in the clockwise direction // the rest will follow - delta_ang = GetDeltaAngle(pp->turn180_target, fix16_to_int(pp->q16ang)); + delta_q16ang = GetDeltaAngleQ16(pp->turn180_target, pp->q16ang); - pp->q16ang = fix16_sadd(pp->q16ang, fix16_from_float(scaleAdjustmentToInterval(labs(delta_ang) >> TURN_SHIFT))) & 0x7FFFFFF; + pp->q16ang = fix16_sadd(pp->q16ang, fix16_max(fix16_one,fix16_from_float(scaleAdjustmentToInterval(fix16_to_int(fix16_sdiv(fix16_abs(delta_q16ang), fix16_from_int(TURN_SHIFT))))))) & 0x7FFFFFF; SET(pp->Flags, PF_TURN_180); } @@ -3318,10 +3318,10 @@ void getinput(int const playerNum) if (TEST(pp->Flags, PF_TURN_180)) { - short delta_ang; + fix16_t delta_q16ang; - delta_ang = GetDeltaAngle(pp->turn180_target, fix16_to_int(pp->q16ang)); - pp->q16ang = fix16_sadd(pp->q16ang, fix16_from_float(scaleAdjustmentToInterval(delta_ang >> TURN_SHIFT))) & 0x7FFFFFF; + delta_q16ang = GetDeltaAngleQ16(pp->turn180_target, pp->q16ang); + pp->q16ang = fix16_sadd(pp->q16ang, fix16_from_float(scaleAdjustmentToInterval(fix16_to_int(fix16_sdiv(fix16_abs(delta_q16ang), fix16_from_int(TURN_SHIFT)))))) & 0x7FFFFFF; sprite[pp->PlayerSprite].ang = fix16_to_int(pp->q16ang); if (!Prediction) @@ -3331,11 +3331,11 @@ void getinput(int const playerNum) } // get new delta to see how close we are - delta_ang = GetDeltaAngle(pp->turn180_target, fix16_to_int(pp->q16ang)); + delta_q16ang = GetDeltaAngleQ16(pp->turn180_target, pp->q16ang); - if (labs(delta_ang) < (3<q16ang = fix16_from_int(pp->turn180_target); + pp->q16ang = pp->turn180_target; RESET(pp->Flags, PF_TURN_180); } else @@ -3344,7 +3344,7 @@ void getinput(int const playerNum) if (input.q16avel != 0) { - pp->q16ang = fix16_sadd(pp->q16ang, input.q16avel) & 0x7FFFFFF; + pp->q16ang = fix16_sadd(pp->q16ang, input.q16avel) & 0x7FFFFFF; // update players sprite angle // NOTE: It's also updated in UpdatePlayerSprite, but needs to be diff --git a/source/sw/src/game.h b/source/sw/src/game.h index 630cc186e..5f546d6a4 100644 --- a/source/sw/src/game.h +++ b/source/sw/src/game.h @@ -1138,7 +1138,7 @@ struct PLAYERstruct short camera_check_time_delay; short cursectnum,lastcursectnum; - short turn180_target; // 180 degree turn + fix16_t turn180_target; // 180 degree turn // variables that do not fit into sprite structure int hvel,tilt,tilt_dest; @@ -2122,6 +2122,7 @@ void SetBorder(PLAYERp pp, int); void SetFragBar(PLAYERp pp); int Distance(int x1, int y1, int x2, int y2); short GetDeltaAngle(short, short); +fix16_t GetDeltaAngleQ16(fix16_t, fix16_t); int SetActorRotation(short SpriteNum,int,int); int NewStateGroup(short SpriteNum, STATEp SpriteGroup[]); diff --git a/source/sw/src/player.cpp b/source/sw/src/player.cpp index 1ada29093..cd6368908 100644 --- a/source/sw/src/player.cpp +++ b/source/sw/src/player.cpp @@ -1152,6 +1152,26 @@ GetDeltaAngle(short ang1, short ang2) } +fix16_t +GetDeltaAngleQ16(fix16_t ang1, fix16_t ang2) +{ + // Look at the smaller angle if > 1024 (180 degrees) + if (fix16_abs(fix16_sub(ang1, ang2)) > fix16_from_int(1024)) + { + if (ang1 <= fix16_from_int(1024)) + ang1 = fix16_add(ang1, fix16_from_int(2048)); + + if (ang2 <= fix16_from_int(1024)) + ang2 = fix16_add(ang2, fix16_from_int(2048)); + } + + //if (ang1 - ang2 == -fix16_from_int(1024)) + // return(fix16_from_int(1024)); + + return fix16_sub(ang1, ang2); + +} + TARGET_SORT TargetSort[MAX_TARGET_SORT]; unsigned TargetSortCount; @@ -6303,15 +6323,13 @@ void DoPlayerDeathFollowKiller(PLAYERp pp) if (pp->Killer > -1) { SPRITEp kp = &sprite[pp->Killer]; - short ang2,delta_ang; + fix16_t delta_q16ang; if (FAFcansee(kp->x, kp->y, SPRITEp_TOS(kp), kp->sectnum, pp->posx, pp->posy, pp->posz, pp->cursectnum)) { - ang2 = getangle(kp->x - pp->posx, kp->y - pp->posy); - - delta_ang = GetDeltaAngle(ang2, fix16_to_int(pp->q16ang)); - pp->q16ang = fix16_sadd(pp->q16ang, fix16_from_int((delta_ang >> 4))) & 0x7FFFFFF; + delta_q16ang = GetDeltaAngleQ16(fix16_from_int(getangle(kp->x - pp->posx, kp->y - pp->posy)), pp->q16ang); + pp->q16ang = fix16_sadd(pp->q16ang, fix16_sdiv(delta_q16ang, fix16_from_int(16))) & 0x7FFFFFF; } } }