Replace spectator movement with demo freecam

This commit is contained in:
James R 2023-08-14 01:50:34 -07:00 committed by NepDisk
parent 6531cc065e
commit e0a191f4d5
7 changed files with 18 additions and 84 deletions

View file

@ -3991,11 +3991,6 @@ void G_StopDemo(void)
singletics = false; singletics = false;
demo.freecam = false; demo.freecam = false;
// reset democam shit too:
democam.cam = NULL;
democam.localangle = 0;
democam.localaiming = 0;
democam.keyboardlook = false;
if (gamestate == GS_INTERMISSION) if (gamestate == GS_INTERMISSION)
Y_EndIntermission(); // cleanup Y_EndIntermission(); // cleanup

View file

@ -976,8 +976,8 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
joystickvector2_t joystickvector; joystickvector2_t joystickvector;
// you'd BETTER not touch the player while freecamming... // you'd BETTER not touch the player while freecamming...
player_t *player = fordemocam ? NULL : &players[g_localplayers[forplayer]]; player_t *player = &players[g_localplayers[forplayer]];
camera_t *thiscam = fordemocam ? democam.cam : &camera[forplayer]; camera_t *thiscam = &camera[forplayer];
boolean *rd = &resetdown[forplayer]; boolean *rd = &resetdown[forplayer];
boolean spectating = fordemocam || player->spectator; boolean spectating = fordemocam || player->spectator;

View file

@ -4223,14 +4223,10 @@ void M_PlaybackToggleFreecam(INT32 choice)
if (!demo.freecam) // toggle on if (!demo.freecam) // toggle on
{ {
demo.freecam = true; demo.freecam = true;
democam.cam = &camera[0]; // this is rather useful
} }
else // toggle off else // toggle off
{ {
demo.freecam = false; demo.freecam = false;
// reset democam vars:
democam.cam = NULL;
democam.keyboardlook = false; // reset only these. localangle / aiming gets set before the cam does anything anyway
} }
} }

View file

@ -133,19 +133,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 {
camera_t *cam; // this is useful when the game is paused, notably
angle_t localangle; // keeps track of the cam angle for cmds
angle_t localaiming; // ditto with aiming
boolean turnheld; // holding turn button for gradual turn speed
boolean keyboardlook; // keyboard look
};
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];

View file

@ -690,9 +690,8 @@ void P_Ticker(boolean run)
timeinmap = (timeinmap-1) & ~3; timeinmap = (timeinmap-1) & ~3;
G_PreviewRewind(leveltime); G_PreviewRewind(leveltime);
} }
else if (demo.freecam && democam.cam) // special case: allow freecam to MOVE during pause! else
P_DemoCameraMovement(democam.cam); P_RunChaseCameras(); // special case: allow freecam to MOVE during pause!
S_SetStackAdjustmentStart();
return; return;
} }

View file

@ -2077,42 +2077,6 @@ static void P_UpdateBotAngle(player_t* player)
player->mo->angle = player->angleturn; player->mo->angle = player->angleturn;
} }
//
// P_SpectatorMovement
//
// Control for spectators in multiplayer
//
static void P_SpectatorMovement(player_t *player)
{
ticcmd_t *cmd = &player->cmd;
player->mo->angle = cmd->angle<<16;
P_UpdatePlayerAiming(player);
ticruned++;
if (!(cmd->flags & TICCMD_RECEIVED))
ticmiss++;
if (cmd->buttons & BT_ACCELERATE)
player->mo->z += 32*mapobjectscale;
else if (cmd->buttons & BT_BRAKE)
player->mo->z -= 32*mapobjectscale;
if (player->mo->z > player->mo->ceilingz - player->mo->height)
player->mo->z = player->mo->ceilingz - player->mo->height;
if (player->mo->z < player->mo->floorz)
player->mo->z = player->mo->floorz;
player->mo->momx = player->mo->momy = player->mo->momz = 0;
if (cmd->forwardmove != 0)
{
P_Thrust(player->mo, player->mo->angle, cmd->forwardmove*mapobjectscale);
// Quake-style flying spectators :D
player->mo->momz += FixedMul(cmd->forwardmove*mapobjectscale, AIMINGTOSLOPE(player->aiming));
}
}
// //
// P_MovePlayer // P_MovePlayer
void P_MovePlayer(player_t *player) void P_MovePlayer(player_t *player)
@ -2139,7 +2103,6 @@ void P_MovePlayer(player_t *player)
if (player->spectator) if (player->spectator)
{ {
player->mo->eflags &= ~MFE_VERTICALFLIP; // deflip... player->mo->eflags &= ~MFE_VERTICALFLIP; // deflip...
P_SpectatorMovement(player);
return; return;
} }
@ -2682,8 +2645,6 @@ fixed_t t_cam_rotate[MAXSPLITSCREENPLAYERS] = {-42,-42,-42,-42};
static ticcmd_t cameracmd; static ticcmd_t cameracmd;
struct demofreecam_s democam;
// called by m_menu to reinit cam input every time it's toggled // called by m_menu to reinit cam input every time it's toggled
void P_InitCameraCmd(void) void P_InitCameraCmd(void)
{ {
@ -2696,22 +2657,13 @@ void P_DemoCameraMovement(camera_t *cam)
angle_t thrustangle; angle_t thrustangle;
player_t *lastp; player_t *lastp;
// update democam stuff with what we got here:
democam.cam = cam;
democam.localangle = cam->angle;
democam.localaiming = cam->aiming;
// first off we need to get button input // first off we need to get button input
G_BuildTiccmd(cmd, 1, UINT8_MAX); G_BuildTiccmd(cmd, 1, UINT8_MAX);
cam->aiming += cmd->aiming << TICCMD_REDUCE; cam->aiming += cmd->aiming << TICCMD_REDUCE;
cam->angle += cmd->turning << TICCMD_REDUCE; cam->angle += cmd->turning << TICCMD_REDUCE;
democam.localangle += cmd->turning << TICCMD_REDUCE;
democam.localaiming += cmd->aiming << TICCMD_REDUCE;
cam->aiming = G_ClipAimingPitch((INT32 *)&cam->aiming); cam->aiming = G_ClipAimingPitch((INT32 *)&cam->aiming);
democam.localaiming = G_ClipAimingPitch((INT32 *)&democam.localaiming);
// camera movement: // camera movement:
if (cmd->buttons & BT_ACCELERATE) if (cmd->buttons & BT_ACCELERATE)
@ -2720,7 +2672,7 @@ void P_DemoCameraMovement(camera_t *cam)
cam->z -= 32*mapobjectscale; cam->z -= 32*mapobjectscale;
// 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 (cmd->buttons & BT_ATTACK) if (demo.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);
@ -2820,12 +2772,15 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall
if (thiscam->subsector == NULL || thiscam->subsector->sector == NULL) if (thiscam->subsector == NULL || thiscam->subsector->sector == NULL)
return true; return true;
if (demo.freecam) if (demo.freecam || player->spectator)
{ {
P_DemoCameraMovement(thiscam); P_DemoCameraMovement(thiscam);
return true; return true;
} }
if (paused || P_AutoPause())
return true;
if (thiscam == &camera[1]) // Camera 2 if (thiscam == &camera[1]) // Camera 2
{ {
num = 1; num = 1;

View file

@ -1254,8 +1254,12 @@ void R_SetupFrame(int s, boolean skybox)
R_SetViewContext(static_cast<viewcontext_e>(VIEWCONTEXT_PLAYER1 + s)); R_SetViewContext(static_cast<viewcontext_e>(VIEWCONTEXT_PLAYER1 + s));
if (player->spectator) // no spectator chasecam if (player->spectator)
chasecam = false; // force chasecam off {
// Free flying spectator uses demo freecam. This
// requires chasecam to be enabled.
chasecam = true;
}
if (chasecam && (thiscam && !thiscam->chase)) if (chasecam && (thiscam && !thiscam->chase))
{ {
@ -1281,7 +1285,7 @@ void R_SetupFrame(int s, boolean skybox)
R_SetupCommonFrame(player, r_viewmobj->subsector); R_SetupCommonFrame(player, r_viewmobj->subsector);
} }
else if (!player->spectator && chasecam) else if (chasecam)
// use outside cam view // use outside cam view
{ {
r_viewmobj = NULL; r_viewmobj = NULL;
@ -1429,10 +1433,8 @@ boolean R_ViewpointHasChasecam(player_t *player)
} }
} }
if (player->playerstate == PST_DEAD || gamestate == GS_TITLESCREEN || tutorialmode) if (player->playerstate == PST_DEAD || gamestate == GS_TITLESCREEN || tutorialmode || player->spectator)
chasecam = true; // force chasecam on chasecam = true; // force chasecam on
else if (player->spectator) // no spectator chasecam
chasecam = false; // force chasecam off
return chasecam; return chasecam;
} }
@ -1451,7 +1453,7 @@ boolean R_IsViewpointThirdPerson(player_t *player, boolean skybox)
if (player->awayviewtics || skybox) if (player->awayviewtics || skybox)
return chasecam; return chasecam;
// use outside cam view // use outside cam view
else if (!player->spectator && chasecam) else if (chasecam)
return true; return true;
// use the player's eyes view // use the player's eyes view