diff --git a/src/p_user.c b/src/p_user.c index d7423d80..74644f98 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -8165,6 +8165,8 @@ void P_ResetCamera(player_t *player, camera_t *thiscam) boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcalled) { + static UINT8 lookbackdelay[4] = {0,0,0,0}; + UINT8 num; angle_t angle = 0, focusangle = 0, focusaiming = 0; fixed_t x, y, z, dist, height, viewpointx, viewpointy, camspeed, camdist, camheight, pviewheight; fixed_t pan, xpan, ypan; @@ -8293,6 +8295,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall if (thiscam == &camera) { + num = 0; camspeed = cv_cam_speed.value; camstill = cv_cam_still.value; camrotate = cv_cam_rotate.value; @@ -8302,6 +8305,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall } else if (thiscam == &camera2) // Camera 2 { + num = 1; camspeed = cv_cam2_speed.value; camstill = cv_cam2_still.value; camrotate = cv_cam2_rotate.value; @@ -8311,6 +8315,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall } else if (thiscam == &camera3) // Camera 3 { + num = 2; camspeed = cv_cam3_speed.value; camstill = cv_cam3_still.value; camrotate = cv_cam3_rotate.value; @@ -8320,6 +8325,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall } else // Camera 4 { + num = 3; camspeed = cv_cam4_speed.value; camstill = cv_cam4_still.value; camrotate = cv_cam4_rotate.value; @@ -8342,12 +8348,16 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall } else if (player->exiting) // SRB2Kart: Leave the camera behind while exiting, for dramatic effect! camstill = true; - else if (lookback) // SRB2kart - Camera flipper + else if (lookback || lookbackdelay[num]) // SRB2kart - Camera flipper { - camrotate += 180; - camspeed *= 2; - if (camspeed > FRACUNIT) - camspeed = FRACUNIT; + camspeed = FRACUNIT; + if (lookback) + { + camrotate += 180; + lookbackdelay[num] = 2; + } + else + lookbackdelay[num]--; } if (mo->eflags & MFE_VERTICALFLIP) @@ -8356,6 +8366,9 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall if (splitscreen == 1) camspeed = (3*camspeed)/4; + if (camspeed > FRACUNIT) + camspeed = FRACUNIT; + if (timeover) angle = mo->angle + FixedAngle(camrotate*FRACUNIT); else if (leveltime < starttime) @@ -8364,16 +8377,21 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall angle = thiscam->angle; else { - angle_t input = focusangle + FixedAngle(camrotate<angle; - boolean invert = (input > ANGLE_180); - if (invert) - input = InvAngle(input); + if (camspeed == FRACUNIT) + angle = focusangle + FixedAngle(camrotate<angle; + boolean invert = (input > ANGLE_180); + if (invert) + input = InvAngle(input); - input = FixedAngle(FixedMul(AngleFixed(input), camspeed)); - if (invert) - input = InvAngle(input); + input = FixedAngle(FixedMul(AngleFixed(input), camspeed)); + if (invert) + input = InvAngle(input); - angle = thiscam->angle + input; + angle = thiscam->angle + input; + } } if (!resetcalled && (leveltime > starttime && timeover != 2) @@ -8697,8 +8715,25 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall if (twodlevel || (mo->flags2 & MF2_TWOD) || (!camstill && !timeover)) // Keep the view still... { G_ClipAimingPitch((INT32 *)&angle); - dist = thiscam->aiming - angle; - thiscam->aiming -= (dist>>3); + + if (camspeed == FRACUNIT) + thiscam->aiming = angle; + else + { + angle_t input; + boolean invert; + + input = thiscam->aiming - angle; + invert = (input > ANGLE_180); + if (invert) + input = InvAngle(input); + + input = FixedAngle(FixedMul(AngleFixed(input), (5*camspeed)/16)); + if (invert) + input = InvAngle(input); + + thiscam->aiming -= input; + } } if (!resetcalled && (player->playerstate == PST_DEAD || player->playerstate == PST_REBORN))