From b1c9de32c6ac4993b3f470857d4cfaff4aac8478 Mon Sep 17 00:00:00 2001 From: James R Date: Sat, 20 Jan 2024 21:48:54 -0800 Subject: [PATCH] Battle: use round end camera when player wins with final KO --- src/k_endcam.cpp | 19 +++++++++++++++++++ src/k_endcam.h | 3 +++ src/k_kart.c | 11 +++++++++++ 3 files changed, 33 insertions(+) diff --git a/src/k_endcam.cpp b/src/k_endcam.cpp index 91f87d35b..ec04351cb 100644 --- a/src/k_endcam.cpp +++ b/src/k_endcam.cpp @@ -195,3 +195,22 @@ void K_LoadEndCamera(savebuffer_t *save) { endcam_cast().Archive(srb2::UnArchiveWrapper(save)); } + +void K_StartRoundWinCamera(mobj_t *origin, angle_t focusAngle, fixed_t finalRadius, tic_t panDuration, fixed_t panSpeed) +{ + const fixed_t angF = AngleFixed(focusAngle); + + g_endcam.origin = {origin->x, origin->y, P_GetMobjHead(origin)}; + g_endcam.startRadius = {2400*mapobjectscale, 800*mapobjectscale}; + g_endcam.endRadius = {finalRadius, finalRadius / 2}; + + g_endcam.swirlDuration = 3*TICRATE; + g_endcam.startAngle = angF + (90*FRACUNIT); + g_endcam.endAngle = angF + (720*FRACUNIT); + + P_SetTarget(&g_endcam.panMobj, origin); + g_endcam.panDuration = panDuration; + g_endcam.panSpeed = panSpeed; + + K_CommitEndCamera(); +} diff --git a/src/k_endcam.h b/src/k_endcam.h index e9ea3ed7a..d6d976883 100644 --- a/src/k_endcam.h +++ b/src/k_endcam.h @@ -58,6 +58,9 @@ extern endcam_t g_endcam; // function, so the camera can cut away cleanly. void K_CommitEndCamera(void); +// Automatically set up a cool camera in one-shot. +void K_StartRoundWinCamera(mobj_t *origin, angle_t focusAngle, fixed_t finalRadius, tic_t panDuration, fixed_t panSpeed); + /// ... // Low-level functions diff --git a/src/k_kart.c b/src/k_kart.c index 2af7cee2e..be7213d43 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -50,6 +50,7 @@ #include "k_tally.h" #include "music.h" #include "m_easing.h" +#include "k_endcam.h" // SOME IMPORTANT VARIABLES DEFINED IN DOOMDEF.H: // gamespeed is cc (0 for easy, 1 for normal, 2 for hard) @@ -3918,6 +3919,16 @@ void K_BattleAwardHit(player_t *player, player_t *victim, mobj_t *inflictor, UIN { player->roundscore = 100; // Make sure you win! P_DoAllPlayersExit(0, false); + + mobj_t *source = !P_MobjWasRemoved(inflictor) ? inflictor : player->mo; + + K_StartRoundWinCamera( + victim->mo, + R_PointToAngle2(source->x, source->y, victim->mo->x, victim->mo->y) + ANGLE_135, + 200*mapobjectscale, + 8*TICRATE, + FRACUNIT/512 + ); } P_AddPlayerScore(player, points);