mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-02-25 23:11:20 +00:00
Move freecam state to camera_t, lets splitscreen players use freecam independently of each other
This commit is contained in:
parent
49898abfeb
commit
fa89576f34
15 changed files with 73 additions and 67 deletions
|
|
@ -1645,7 +1645,7 @@ static void Command_View_f(void)
|
|||
return;
|
||||
}
|
||||
|
||||
if (demo.freecam)
|
||||
if (camera[viewnum-1].freecam)
|
||||
return;
|
||||
|
||||
displayplayerp = &displayplayers[viewnum-1];
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
11
src/g_demo.c
11
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;
|
||||
|
|
|
|||
|
|
@ -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 (
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
48
src/p_user.c
48
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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue