diff --git a/src/p_local.h b/src/p_local.h index 748d29073..7545c88d9 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -138,6 +138,9 @@ struct camera_t // Freecam: aiming needs to be reset after switching from chasecam boolean reset_aiming; + // Hold up/down to pan the camera vertically + SINT8 dpad_y_held; + // Interpolation data fixed_t old_x, old_y, old_z; angle_t old_angle, old_aiming; diff --git a/src/p_tick.c b/src/p_tick.c index ed89f563b..16cb5e831 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -763,7 +763,18 @@ void P_RunChaseCameras(void) { if (camera[i].chase) { - P_MoveChaseCamera(&players[displayplayers[i]], &camera[i], false); + player_t *p = &players[displayplayers[i]]; + camera_t *cam = &camera[i]; + + if (p->mo && p->cmd.throwdir != 0) + { + if (p->speed < 6 * p->mo->scale && abs(cam->dpad_y_held) < 2*TICRATE) + cam->dpad_y_held += intsign(p->cmd.throwdir); + } + else + cam->dpad_y_held = 0; + + P_MoveChaseCamera(p, cam, false); } } diff --git a/src/p_user.c b/src/p_user.c index 1eae7e18f..ea2fef0bb 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3275,6 +3275,11 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall focusaiming = localaiming[num]; } + if (abs(thiscam->dpad_y_held) >= 2*TICRATE) + { + focusaiming += ANGLE_45 * intsign(thiscam->dpad_y_held) * P_MobjFlip(mo); + } + if (P_CameraThinker(player, thiscam, resetcalled)) return true;