diff --git a/src/p_local.h b/src/p_local.h index 36ada1661..b3c291b05 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -136,6 +136,9 @@ struct camera_t boolean reset_aiming; // camera aiming needs to be reset from chase camera + // 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 89beafb4a..943c61da3 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -650,7 +650,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 cd150c864..f94f0d17e 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3100,6 +3100,11 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall focusaiming = player->aiming; } + 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;