Move freecam state to camera_t, lets splitscreen players use freecam independently of each other

This commit is contained in:
James R 2023-10-03 20:20:27 -07:00
parent 49898abfeb
commit fa89576f34
15 changed files with 73 additions and 67 deletions

View file

@ -1645,7 +1645,7 @@ static void Command_View_f(void)
return; return;
} }
if (demo.freecam) if (camera[viewnum-1].freecam)
return; return;
displayplayerp = &displayplayers[viewnum-1]; displayplayerp = &displayplayers[viewnum-1];

View file

@ -86,6 +86,8 @@ class TiccmdBuilder
UINT8 forplayer() const { return ssplayer - 1; } UINT8 forplayer() const { return ssplayer - 1; }
player_t* player() const { return &players[g_localplayers[forplayer()]]; } player_t* player() const { return &players[g_localplayers[forplayer()]]; }
bool freecam() const { return camera[forplayer()].freecam; }
UINT8 swap_ssplayer() const UINT8 swap_ssplayer() const
{ {
if (ssplayer == cv_1pswap.value) if (ssplayer == cv_1pswap.value)
@ -239,13 +241,13 @@ class TiccmdBuilder
{ {
if (M_MenuButtonPressed(pid, MBT_C)) if (M_MenuButtonPressed(pid, MBT_C))
{ {
P_ToggleDemoCamera(); P_ToggleDemoCamera(forplayer());
} }
} }
bool director_input() bool director_input()
{ {
if (demo.freecam || !K_DirectorIsAvailable(viewnum)) if (freecam() || !K_DirectorIsAvailable(viewnum))
{ {
return false; return false;
} }
@ -283,7 +285,7 @@ class TiccmdBuilder
bool spectator_analog_input() bool spectator_analog_input()
{ {
if (!player()->spectator && !objectplacing && !demo.freecam) if (!player()->spectator && !objectplacing && !freecam())
{ {
return false; return false;
} }
@ -406,7 +408,7 @@ public:
common_button_input(); common_button_input();
}; };
if (demo.playback || demo.freecam || player()->spectator) if (demo.playback || freecam() || player()->spectator)
{ {
// freecam is controllable even while paused // freecam is controllable even while paused
@ -416,7 +418,7 @@ public:
{ {
regular_input(); regular_input();
if (demo.freecam) if (freecam())
{ {
toggle_freecam_input(); toggle_freecam_input();
} }

View file

@ -1653,9 +1653,6 @@ void G_ConfirmRewind(tic_t rewindtime)
COM_BufInsertText("renderview on\n"); COM_BufInsertText("renderview on\n");
if (demo.freecam)
return; // don't touch from there
splitscreen = oldss; splitscreen = oldss;
displayplayers[0] = olddp1; displayplayers[0] = olddp1;
displayplayers[1] = olddp2; displayplayers[1] = olddp2;
@ -4126,7 +4123,13 @@ void G_StopDemo(void)
demo.timing = false; demo.timing = false;
singletics = false; singletics = false;
demo.freecam = false; {
UINT8 i;
for (i = 0; i < MAXSPLITSCREENPLAYERS; ++i)
{
camera[i].freecam = false;
}
}
Z_Free(demo.skinlist); Z_Free(demo.skinlist);
demo.skinlist = NULL; demo.skinlist = NULL;

View file

@ -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 // Allow pausing
if ( if (

View file

@ -3381,7 +3381,7 @@ static boolean K_ShowPlayerNametag(player_t *p)
return false; return false;
} }
if (demo.playback == true && demo.freecam == true) if (demo.playback == true && camera[R_GetViewNumber()].freecam == true)
{ {
return true; return true;
} }
@ -3762,7 +3762,7 @@ static void K_drawKartNameTags(void)
if (result.onScreen == true) 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]]) ntplayer != &players[displayplayers[cnum]])
{ {
localindicator = G_PartyPosition(ntplayer - players); localindicator = G_PartyPosition(ntplayer - players);
@ -5455,8 +5455,8 @@ static void K_DrawGPRankDebugger(void)
void K_drawKartHUD(void) void K_drawKartHUD(void)
{ {
boolean islonesome = false; boolean islonesome = false;
boolean freecam = demo.freecam; //disable some hud elements w/ freecam
UINT8 viewnum = R_GetViewNumber(); UINT8 viewnum = R_GetViewNumber();
boolean freecam = camera[viewnum].freecam; //disable some hud elements w/ freecam
// Define the X and Y for each drawn object // Define the X and Y for each drawn object
// This is handled by console/menu values // 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 if (demo.title) // Draw title logo instead in demo.titles
{ {

View file

@ -12279,7 +12279,7 @@ void K_EggmanTransfer(player_t *source, player_t *victim)
victim->eggmanexplode = 6*TICRATE; victim->eggmanexplode = 6*TICRATE;
K_StopRoulette(&victim->itemRoulette); K_StopRoulette(&victim->itemRoulette);
if (P_IsDisplayPlayer(victim) && !demo.freecam) if (P_IsDisplayPlayer(victim))
S_StartSound(NULL, sfx_itrole); S_StartSound(NULL, sfx_itrole);
K_AddHitLag(source->mo, 2, true); K_AddHitLag(source->mo, 2, true);

View file

@ -1633,7 +1633,7 @@ void K_KartItemRoulette(player_t *const player, ticcmd_t *const cmd)
//player->karthud[khud_itemblinkmode] = 1; //player->karthud[khud_itemblinkmode] = 1;
//player->karthud[khud_rouletteoffset] = K_GetRouletteOffset(roulette, FRACUNIT); //player->karthud[khud_rouletteoffset] = K_GetRouletteOffset(roulette, FRACUNIT);
if (P_IsDisplayPlayer(player) && !demo.freecam) if (P_IsDisplayPlayer(player))
{ {
S_StartSound(NULL, sfx_itrole); 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_itemblinkmode] = 0;
player->karthud[khud_rouletteoffset] = K_GetRouletteOffset(roulette, FRACUNIT); player->karthud[khud_rouletteoffset] = K_GetRouletteOffset(roulette, FRACUNIT);
if (P_IsDisplayPlayer(player) && !demo.freecam) if (P_IsDisplayPlayer(player))
{ {
if (roulette->ringbox) 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. // This makes the roulette produce the random noises.
roulette->sound = (roulette->sound + 1) % 8; roulette->sound = (roulette->sound + 1) % 8;
if (P_IsDisplayPlayer(player) && !demo.freecam) if (P_IsDisplayPlayer(player))
{ {
if (roulette->ringbox) if (roulette->ringbox)
S_StartSound(NULL, sfx_s240); S_StartSound(NULL, sfx_s240);

View file

@ -236,7 +236,11 @@ void M_PlaybackToggleFreecam(INT32 choice)
splitscreen = 0; splitscreen = 0;
R_ExecuteSetViewSize(); R_ExecuteSetViewSize();
P_ToggleDemoCamera(); UINT8 i;
for (i = 0; i <= r_splitscreen; ++i)
{
P_ToggleDemoCamera(i);
}
} }
void M_PlaybackQuit(INT32 choice) void M_PlaybackQuit(INT32 choice)

View file

@ -92,6 +92,8 @@ void P_UnlinkThinker(thinker_t *thinker);
struct camera_t struct camera_t
{ {
boolean chase; boolean chase;
boolean freecam;
angle_t aiming; angle_t aiming;
// Things used by FS cameras. // Things used by FS cameras.
@ -126,6 +128,9 @@ struct camera_t
// SRB2Kart: camera pitches on slopes // SRB2Kart: camera pitches on slopes
angle_t pitch; 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 // Freecam: aiming needs to be reset after switching from chasecam
boolean reset_aiming; boolean reset_aiming;
@ -134,14 +139,6 @@ struct camera_t
angle_t old_angle, old_aiming; 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 camera_t camera[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_cam_dist[MAXSPLITSCREENPLAYERS], cv_cam_still[MAXSPLITSCREENPLAYERS], cv_cam_height[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]; 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_SlideCameraMove(camera_t *thiscam);
void P_DemoCameraMovement(camera_t *cam, UINT8 num); void P_DemoCameraMovement(camera_t *cam, UINT8 num);
boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcalled); 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); boolean P_PlayerInPain(player_t *player);
void P_ResetPlayer(player_t *player); void P_ResetPlayer(player_t *player);

View file

@ -12231,7 +12231,7 @@ void P_SpawnPlayer(INT32 playernum)
// changes. // changes.
if (!demo.playback) if (!demo.playback)
{ {
demo.freecam = false; camera[G_PartyPosition(playernum)].freecam = false;
} }
} }
else if (pcount == 1) else if (pcount == 1)

View file

@ -1077,17 +1077,17 @@ boolean P_IsDisplayPlayer(player_t *player)
return false; 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 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]]) if (player == &players[displayplayers[i]])
return true; 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_height[MAXSPLITSCREENPLAYERS] = {-42,-42,-42,-42};
fixed_t t_cam_rotate[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) void P_DemoCameraMovement(camera_t *cam, UINT8 num)
{ {
ticcmd_t *cmd; ticcmd_t *cmd;
@ -2913,7 +2911,7 @@ void P_DemoCameraMovement(camera_t *cam, UINT8 num)
cam->angle += turning; cam->angle += turning;
// camera movement: // camera movement:
if (!democam.button_a_held) if (!cam->button_a_held)
{ {
if (cmd->buttons & BT_ACCELERATE) 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 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. 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); 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 // forward/back will have a slope. So, as long as democam
// controls haven't been used to alter the vertical angle, // controls haven't been used to alter the vertical angle,
// slowly reset it to flat. // 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 aiming = cam->aiming;
INT32 smooth = FixedMul(ANGLE_11hh / 4, FCOS(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); 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; cam->freecam = true;
democam.button_a_held = 2; cam->button_a_held = 2;
camera[0].reset_aiming = true; cam->reset_aiming = true;
} }
else // toggle off 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; tic_t tries = 0;
fixed_t x, y, z; fixed_t x, y, z;
if (demo.freecam) if (thiscam->freecam)
return; // do not reset the camera there. return; // do not reset the camera there.
if (!player->mo) if (!player->mo)
@ -3099,7 +3099,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall
num = 0; num = 0;
} }
if (demo.freecam || player->spectator) if (thiscam->freecam || player->spectator)
{ {
P_DemoCameraMovement(thiscam, num); P_DemoCameraMovement(thiscam, num);
return true; return true;

View file

@ -906,7 +906,7 @@ void R_ApplyViewMorph(int s)
width*vid.bpp, height, width*vid.bpp, vid.width); 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; angle_t roll = 0;
@ -927,7 +927,7 @@ angle_t R_ViewRollAngle(const player_t *player)
if (cv_tilting.value) if (cv_tilting.value)
{ {
if (!player->spectator && !demo.freecam) if (!player->spectator && !camera[viewnum].freecam)
{ {
roll += player->tilt; roll += player->tilt;
} }
@ -1169,7 +1169,7 @@ R_SetupCommonFrame
newview->y += offset.y; newview->y += offset.y;
newview->z += offset.z; newview->z += offset.z;
newview->roll = R_ViewRollAngle(player); newview->roll = R_ViewRollAngle(player, viewnum);
if (subsector) if (subsector)
newview->sector = subsector->sector; newview->sector = subsector->sector;

View file

@ -168,7 +168,7 @@ void R_Init(void);
void R_CheckViewMorph(int split); void R_CheckViewMorph(int split);
void R_ApplyViewMorph(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 // just sets setsizeneeded true
extern boolean setsizeneeded; extern boolean setsizeneeded;

View file

@ -444,7 +444,7 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume)
listenmobj[i] = player->mo; listenmobj[i] = player->mo;
} }
if (origin && origin == listenmobj[i] && !demo.freecam) if (origin && origin == listenmobj[i] && !camera[i].freecam)
{ {
itsUs = true; itsUs = true;
} }
@ -755,15 +755,15 @@ void S_UpdateSounds(void)
{ {
boolean itsUs = false; boolean itsUs = false;
if (!demo.freecam) for (i = r_splitscreen; i >= 0; i--)
{ {
for (i = r_splitscreen; i >= 0; i--) if (camera[i].freecam)
{ continue;
if (c->origin != listenmobj[i])
continue;
itsUs = true; if (c->origin != listenmobj[i])
} continue;
itsUs = true;
} }
if (itsUs == false) if (itsUs == false)

View file

@ -1192,7 +1192,7 @@ static void ST_overlayDrawer(void)
{ {
if (cv_showviewpointtext.value) if (cv_showviewpointtext.value)
{ {
if (!demo.title && !P_IsLocalPlayer(stplyr) && !demo.freecam) if (!demo.title && !P_IsLocalPlayer(stplyr) && !camera[viewnum].freecam)
{ {
if (!r_splitscreen) if (!r_splitscreen)
{ {