From fa89576f34898d1ec0fb928292db0e0dafa8c0dc Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 3 Oct 2023 20:20:27 -0700 Subject: [PATCH] Move freecam state to camera_t, lets splitscreen players use freecam independently of each other --- src/d_netcmd.c | 2 +- src/g_build_ticcmd.cpp | 12 ++++---- src/g_demo.c | 11 ++++--- src/g_game.c | 2 +- src/k_hud.c | 8 ++--- src/k_kart.c | 2 +- src/k_roulette.c | 6 ++-- src/menus/transient/pause-replay.c | 6 +++- src/p_local.h | 15 ++++------ src/p_mobj.c | 2 +- src/p_user.c | 48 +++++++++++++++--------------- src/r_main.c | 6 ++-- src/r_main.h | 2 +- src/s_sound.c | 16 +++++----- src/st_stuff.c | 2 +- 15 files changed, 73 insertions(+), 67 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index e5f461985..acb00e589 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -1645,7 +1645,7 @@ static void Command_View_f(void) return; } - if (demo.freecam) + if (camera[viewnum-1].freecam) return; displayplayerp = &displayplayers[viewnum-1]; diff --git a/src/g_build_ticcmd.cpp b/src/g_build_ticcmd.cpp index 1e1f0bee5..72dbe83f4 100644 --- a/src/g_build_ticcmd.cpp +++ b/src/g_build_ticcmd.cpp @@ -86,6 +86,8 @@ class TiccmdBuilder UINT8 forplayer() const { return ssplayer - 1; } player_t* player() const { return &players[g_localplayers[forplayer()]]; } + bool freecam() const { return camera[forplayer()].freecam; } + UINT8 swap_ssplayer() const { if (ssplayer == cv_1pswap.value) @@ -239,13 +241,13 @@ class TiccmdBuilder { if (M_MenuButtonPressed(pid, MBT_C)) { - P_ToggleDemoCamera(); + P_ToggleDemoCamera(forplayer()); } } bool director_input() { - if (demo.freecam || !K_DirectorIsAvailable(viewnum)) + if (freecam() || !K_DirectorIsAvailable(viewnum)) { return false; } @@ -283,7 +285,7 @@ class TiccmdBuilder bool spectator_analog_input() { - if (!player()->spectator && !objectplacing && !demo.freecam) + if (!player()->spectator && !objectplacing && !freecam()) { return false; } @@ -406,7 +408,7 @@ public: common_button_input(); }; - if (demo.playback || demo.freecam || player()->spectator) + if (demo.playback || freecam() || player()->spectator) { // freecam is controllable even while paused @@ -416,7 +418,7 @@ public: { regular_input(); - if (demo.freecam) + if (freecam()) { toggle_freecam_input(); } diff --git a/src/g_demo.c b/src/g_demo.c index 95f5a0ac3..5c5c58fe0 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -1653,9 +1653,6 @@ void G_ConfirmRewind(tic_t rewindtime) COM_BufInsertText("renderview on\n"); - if (demo.freecam) - return; // don't touch from there - splitscreen = oldss; displayplayers[0] = olddp1; displayplayers[1] = olddp2; @@ -4126,7 +4123,13 @@ void G_StopDemo(void) demo.timing = false; singletics = false; - demo.freecam = false; + { + UINT8 i; + for (i = 0; i < MAXSPLITSCREENPLAYERS; ++i) + { + camera[i].freecam = false; + } + } Z_Free(demo.skinlist); demo.skinlist = NULL; diff --git a/src/g_game.c b/src/g_game.c index f6587e492..2ecb144e1 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1364,7 +1364,7 @@ boolean G_Responder(event_t *ev) } } - if (gamestate == GS_LEVEL && ev->type == ev_keydown && multiplayer && demo.playback && !demo.freecam) + if (gamestate == GS_LEVEL && ev->type == ev_keydown && multiplayer && demo.playback) { // Allow pausing if ( diff --git a/src/k_hud.c b/src/k_hud.c index 4ca34618a..ed033d3d9 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -3381,7 +3381,7 @@ static boolean K_ShowPlayerNametag(player_t *p) return false; } - if (demo.playback == true && demo.freecam == true) + if (demo.playback == true && camera[R_GetViewNumber()].freecam == true) { return true; } @@ -3762,7 +3762,7 @@ static void K_drawKartNameTags(void) if (result.onScreen == true) { - if (!(demo.playback == true && demo.freecam == true) && P_IsDisplayPlayer(ntplayer) && + if (!(demo.playback == true && camera[cnum].freecam == true) && P_IsDisplayPlayer(ntplayer) && ntplayer != &players[displayplayers[cnum]]) { localindicator = G_PartyPosition(ntplayer - players); @@ -5455,8 +5455,8 @@ static void K_DrawGPRankDebugger(void) void K_drawKartHUD(void) { boolean islonesome = false; - boolean freecam = demo.freecam; //disable some hud elements w/ freecam UINT8 viewnum = R_GetViewNumber(); + boolean freecam = camera[viewnum].freecam; //disable some hud elements w/ freecam // Define the X and Y for each drawn object // This is handled by console/menu values @@ -5531,7 +5531,7 @@ void K_drawKartHUD(void) } } - if (!stplyr->spectator && !demo.freecam) // Bottom of the screen elements, don't need in spectate mode + if (!stplyr->spectator && !freecam) // Bottom of the screen elements, don't need in spectate mode { if (demo.title) // Draw title logo instead in demo.titles { diff --git a/src/k_kart.c b/src/k_kart.c index 65f7baf2b..cb2b5f538 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -12279,7 +12279,7 @@ void K_EggmanTransfer(player_t *source, player_t *victim) victim->eggmanexplode = 6*TICRATE; K_StopRoulette(&victim->itemRoulette); - if (P_IsDisplayPlayer(victim) && !demo.freecam) + if (P_IsDisplayPlayer(victim)) S_StartSound(NULL, sfx_itrole); K_AddHitLag(source->mo, 2, true); diff --git a/src/k_roulette.c b/src/k_roulette.c index 8868286e5..1b378aeae 100644 --- a/src/k_roulette.c +++ b/src/k_roulette.c @@ -1633,7 +1633,7 @@ void K_KartItemRoulette(player_t *const player, ticcmd_t *const cmd) //player->karthud[khud_itemblinkmode] = 1; //player->karthud[khud_rouletteoffset] = K_GetRouletteOffset(roulette, FRACUNIT); - if (P_IsDisplayPlayer(player) && !demo.freecam) + if (P_IsDisplayPlayer(player)) { S_StartSound(NULL, sfx_itrole); } @@ -1680,7 +1680,7 @@ void K_KartItemRoulette(player_t *const player, ticcmd_t *const cmd) player->karthud[khud_itemblinkmode] = 0; player->karthud[khud_rouletteoffset] = K_GetRouletteOffset(roulette, FRACUNIT); - if (P_IsDisplayPlayer(player) && !demo.freecam) + if (P_IsDisplayPlayer(player)) { if (roulette->ringbox) { @@ -1714,7 +1714,7 @@ void K_KartItemRoulette(player_t *const player, ticcmd_t *const cmd) // This makes the roulette produce the random noises. roulette->sound = (roulette->sound + 1) % 8; - if (P_IsDisplayPlayer(player) && !demo.freecam) + if (P_IsDisplayPlayer(player)) { if (roulette->ringbox) S_StartSound(NULL, sfx_s240); diff --git a/src/menus/transient/pause-replay.c b/src/menus/transient/pause-replay.c index 68b4859dc..c04b8a2aa 100644 --- a/src/menus/transient/pause-replay.c +++ b/src/menus/transient/pause-replay.c @@ -236,7 +236,11 @@ void M_PlaybackToggleFreecam(INT32 choice) splitscreen = 0; R_ExecuteSetViewSize(); - P_ToggleDemoCamera(); + UINT8 i; + for (i = 0; i <= r_splitscreen; ++i) + { + P_ToggleDemoCamera(i); + } } void M_PlaybackQuit(INT32 choice) diff --git a/src/p_local.h b/src/p_local.h index 15b338f9d..4cf3fbd7c 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -92,6 +92,8 @@ void P_UnlinkThinker(thinker_t *thinker); struct camera_t { boolean chase; + boolean freecam; + angle_t aiming; // Things used by FS cameras. @@ -126,6 +128,9 @@ struct camera_t // SRB2Kart: camera pitches on slopes angle_t pitch; + // Freecam: A button was held since entering from menu, so don't move camera + UINT8 button_a_held; + // Freecam: aiming needs to be reset after switching from chasecam boolean reset_aiming; @@ -134,14 +139,6 @@ struct camera_t angle_t old_angle, old_aiming; }; -// demo freecam or something before i commit die -struct demofreecam_s { - - UINT8 button_a_held; // A button was held since entering from menu, so don't move camera -}; - -extern struct demofreecam_s democam; - extern camera_t camera[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_cam_dist[MAXSPLITSCREENPLAYERS], cv_cam_still[MAXSPLITSCREENPLAYERS], cv_cam_height[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_cam_speed[MAXSPLITSCREENPLAYERS], cv_cam_rotate[MAXSPLITSCREENPLAYERS]; @@ -156,7 +153,7 @@ boolean P_TryCameraMove(fixed_t x, fixed_t y, camera_t *thiscam); void P_SlideCameraMove(camera_t *thiscam); void P_DemoCameraMovement(camera_t *cam, UINT8 num); boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcalled); -void P_ToggleDemoCamera(void); +void P_ToggleDemoCamera(UINT8 viewnum); boolean P_PlayerInPain(player_t *player); void P_ResetPlayer(player_t *player); diff --git a/src/p_mobj.c b/src/p_mobj.c index d68232db3..46b0990f9 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12231,7 +12231,7 @@ void P_SpawnPlayer(INT32 playernum) // changes. if (!demo.playback) { - demo.freecam = false; + camera[G_PartyPosition(playernum)].freecam = false; } } else if (pcount == 1) diff --git a/src/p_user.c b/src/p_user.c index feab05130..1dedec3f0 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1077,17 +1077,17 @@ boolean P_IsDisplayPlayer(player_t *player) return false; } - // Freecam still techically has a player in - // displayplayers. But since the camera is detached, it - // would be weird if sounds were heard from that player's - // perspective. - if (demo.freecam) - { - return false; - } - for (i = 0; i <= r_splitscreen; i++) // DON'T skip P1 { + if (camera[i].freecam) + { + // Freecam still techically has a player in + // displayplayers. But since the camera is + // detached, it would be weird if sounds were + // heard from that player's perspective. + continue; + } + if (player == &players[displayplayers[i]]) return true; } @@ -2884,8 +2884,6 @@ fixed_t t_cam_dist[MAXSPLITSCREENPLAYERS] = {-42,-42,-42,-42}; fixed_t t_cam_height[MAXSPLITSCREENPLAYERS] = {-42,-42,-42,-42}; fixed_t t_cam_rotate[MAXSPLITSCREENPLAYERS] = {-42,-42,-42,-42}; -struct demofreecam_s democam; - void P_DemoCameraMovement(camera_t *cam, UINT8 num) { ticcmd_t *cmd; @@ -2913,7 +2911,7 @@ void P_DemoCameraMovement(camera_t *cam, UINT8 num) cam->angle += turning; // camera movement: - if (!democam.button_a_held) + if (!cam->button_a_held) { if (cmd->buttons & BT_ACCELERATE) { @@ -2927,13 +2925,13 @@ void P_DemoCameraMovement(camera_t *cam, UINT8 num) } } - if (!(cmd->buttons & (BT_ACCELERATE | BT_DRIFT)) && democam.button_a_held) + if (!(cmd->buttons & (BT_ACCELERATE | BT_DRIFT)) && cam->button_a_held) { - democam.button_a_held--; + cam->button_a_held--; } // if you hold item, you will lock on to displayplayer. (The last player you were ""f12-ing"") - if (demo.freecam && cmd->buttons & BT_ATTACK) + if (cam->freecam && cmd->buttons & BT_ATTACK) { lastp = &players[displayplayers[0]]; // Fun fact, I was trying displayplayers[0]->mo as if it was Lua like an absolute idiot. cam->angle = R_PointToAngle2(cam->x, cam->y, lastp->mo->x, lastp->mo->y); @@ -2953,7 +2951,7 @@ void P_DemoCameraMovement(camera_t *cam, UINT8 num) // forward/back will have a slope. So, as long as democam // controls haven't been used to alter the vertical angle, // slowly reset it to flat. - if ((cam->reset_aiming && moving) || ((cmd->buttons & BT_DRIFT) && !democam.button_a_held)) + if ((cam->reset_aiming && moving) || ((cmd->buttons & BT_DRIFT) && !cam->button_a_held)) { INT32 aiming = cam->aiming; INT32 smooth = FixedMul(ANGLE_11hh / 4, FCOS(cam->aiming)); @@ -2994,17 +2992,19 @@ void P_DemoCameraMovement(camera_t *cam, UINT8 num) cam->subsector = R_PointInSubsector(cam->x, cam->y); } -void P_ToggleDemoCamera(void) +void P_ToggleDemoCamera(UINT8 viewnum) { - if (!demo.freecam) // toggle on + camera_t *cam = &camera[viewnum]; + + if (!cam->freecam) // toggle on { - demo.freecam = true; - democam.button_a_held = 2; - camera[0].reset_aiming = true; + cam->freecam = true; + cam->button_a_held = 2; + cam->reset_aiming = true; } else // toggle off { - demo.freecam = false; + cam->freecam = false; } } @@ -3013,7 +3013,7 @@ void P_ResetCamera(player_t *player, camera_t *thiscam) tic_t tries = 0; fixed_t x, y, z; - if (demo.freecam) + if (thiscam->freecam) return; // do not reset the camera there. if (!player->mo) @@ -3099,7 +3099,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall num = 0; } - if (demo.freecam || player->spectator) + if (thiscam->freecam || player->spectator) { P_DemoCameraMovement(thiscam, num); return true; diff --git a/src/r_main.c b/src/r_main.c index 3dc986b4a..a8bf00d4e 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -906,7 +906,7 @@ void R_ApplyViewMorph(int s) width*vid.bpp, height, width*vid.bpp, vid.width); } -angle_t R_ViewRollAngle(const player_t *player) +angle_t R_ViewRollAngle(const player_t *player, UINT8 viewnum) { angle_t roll = 0; @@ -927,7 +927,7 @@ angle_t R_ViewRollAngle(const player_t *player) if (cv_tilting.value) { - if (!player->spectator && !demo.freecam) + if (!player->spectator && !camera[viewnum].freecam) { roll += player->tilt; } @@ -1169,7 +1169,7 @@ R_SetupCommonFrame newview->y += offset.y; newview->z += offset.z; - newview->roll = R_ViewRollAngle(player); + newview->roll = R_ViewRollAngle(player, viewnum); if (subsector) newview->sector = subsector->sector; diff --git a/src/r_main.h b/src/r_main.h index e7d0f8a87..f3687dd8c 100644 --- a/src/r_main.h +++ b/src/r_main.h @@ -168,7 +168,7 @@ void R_Init(void); void R_CheckViewMorph(int split); void R_ApplyViewMorph(int split); -angle_t R_ViewRollAngle(const player_t *player); +angle_t R_ViewRollAngle(const player_t *player, UINT8 viewnum); // just sets setsizeneeded true extern boolean setsizeneeded; diff --git a/src/s_sound.c b/src/s_sound.c index d69e48e72..759674f1a 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -444,7 +444,7 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume) listenmobj[i] = player->mo; } - if (origin && origin == listenmobj[i] && !demo.freecam) + if (origin && origin == listenmobj[i] && !camera[i].freecam) { itsUs = true; } @@ -755,15 +755,15 @@ void S_UpdateSounds(void) { boolean itsUs = false; - if (!demo.freecam) + for (i = r_splitscreen; i >= 0; i--) { - for (i = r_splitscreen; i >= 0; i--) - { - if (c->origin != listenmobj[i]) - continue; + if (camera[i].freecam) + continue; - itsUs = true; - } + if (c->origin != listenmobj[i]) + continue; + + itsUs = true; } if (itsUs == false) diff --git a/src/st_stuff.c b/src/st_stuff.c index 153e2a48b..0ccddfc31 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -1192,7 +1192,7 @@ static void ST_overlayDrawer(void) { if (cv_showviewpointtext.value) { - if (!demo.title && !P_IsLocalPlayer(stplyr) && !demo.freecam) + if (!demo.title && !P_IsLocalPlayer(stplyr) && !camera[viewnum].freecam) { if (!r_splitscreen) {