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;
}
if (demo.freecam)
if (camera[viewnum-1].freecam)
return;
displayplayerp = &displayplayers[viewnum-1];

View file

@ -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();
}

View file

@ -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;

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
if (

View file

@ -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
{

View file

@ -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);

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_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);

View file

@ -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)

View file

@ -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);

View file

@ -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)

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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)

View file

@ -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)
{