diff --git a/src/g_demo.c b/src/g_demo.c index 16c972c26..be7d391ea 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -3991,11 +3991,6 @@ void G_StopDemo(void) singletics = false; demo.freecam = false; - // reset democam shit too: - democam.cam = NULL; - democam.localangle = 0; - democam.localaiming = 0; - democam.keyboardlook = false; if (gamestate == GS_INTERMISSION) Y_EndIntermission(); // cleanup diff --git a/src/g_game.c b/src/g_game.c index 00857faaa..e3fe917e0 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -976,8 +976,8 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) joystickvector2_t joystickvector; // you'd BETTER not touch the player while freecamming... - player_t *player = fordemocam ? NULL : &players[g_localplayers[forplayer]]; - camera_t *thiscam = fordemocam ? democam.cam : &camera[forplayer]; + player_t *player = &players[g_localplayers[forplayer]]; + camera_t *thiscam = &camera[forplayer]; boolean *rd = &resetdown[forplayer]; boolean spectating = fordemocam || player->spectator; diff --git a/src/m_menu.c b/src/m_menu.c index 64ae9e8d4..dd68f5db1 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -4223,14 +4223,10 @@ void M_PlaybackToggleFreecam(INT32 choice) if (!demo.freecam) // toggle on { demo.freecam = true; - democam.cam = &camera[0]; // this is rather useful } else // toggle off { 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 } } diff --git a/src/p_local.h b/src/p_local.h index fc5307be2..35c6eb6cd 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -133,19 +133,6 @@ struct camera_t 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 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]; diff --git a/src/p_tick.c b/src/p_tick.c index 0fe6d8822..b19e02bee 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -690,9 +690,8 @@ void P_Ticker(boolean run) timeinmap = (timeinmap-1) & ~3; G_PreviewRewind(leveltime); } - else if (demo.freecam && democam.cam) // special case: allow freecam to MOVE during pause! - P_DemoCameraMovement(democam.cam); - S_SetStackAdjustmentStart(); + else + P_RunChaseCameras(); // special case: allow freecam to MOVE during pause! return; } diff --git a/src/p_user.c b/src/p_user.c index c3a4ae9df..bb954160c 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2077,42 +2077,6 @@ static void P_UpdateBotAngle(player_t* player) 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 void P_MovePlayer(player_t *player) @@ -2139,7 +2103,6 @@ void P_MovePlayer(player_t *player) if (player->spectator) { player->mo->eflags &= ~MFE_VERTICALFLIP; // deflip... - P_SpectatorMovement(player); return; } @@ -2682,8 +2645,6 @@ fixed_t t_cam_rotate[MAXSPLITSCREENPLAYERS] = {-42,-42,-42,-42}; static ticcmd_t cameracmd; -struct demofreecam_s democam; - // called by m_menu to reinit cam input every time it's toggled void P_InitCameraCmd(void) { @@ -2696,22 +2657,13 @@ void P_DemoCameraMovement(camera_t *cam) angle_t thrustangle; 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 G_BuildTiccmd(cmd, 1, UINT8_MAX); cam->aiming += cmd->aiming << 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); - democam.localaiming = G_ClipAimingPitch((INT32 *)&democam.localaiming); // camera movement: if (cmd->buttons & BT_ACCELERATE) @@ -2720,7 +2672,7 @@ void P_DemoCameraMovement(camera_t *cam) cam->z -= 32*mapobjectscale; // 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. 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) return true; - if (demo.freecam) + if (demo.freecam || player->spectator) { P_DemoCameraMovement(thiscam); return true; } + if (paused || P_AutoPause()) + return true; + if (thiscam == &camera[1]) // Camera 2 { num = 1; diff --git a/src/r_main.cpp b/src/r_main.cpp index 867cc950d..25017fd02 100644 --- a/src/r_main.cpp +++ b/src/r_main.cpp @@ -1254,8 +1254,12 @@ void R_SetupFrame(int s, boolean skybox) R_SetViewContext(static_cast(VIEWCONTEXT_PLAYER1 + s)); - if (player->spectator) // no spectator chasecam - chasecam = false; // force chasecam off + if (player->spectator) + { + // Free flying spectator uses demo freecam. This + // requires chasecam to be enabled. + chasecam = true; + } if (chasecam && (thiscam && !thiscam->chase)) { @@ -1281,7 +1285,7 @@ void R_SetupFrame(int s, boolean skybox) R_SetupCommonFrame(player, r_viewmobj->subsector); } - else if (!player->spectator && chasecam) + else if (chasecam) // use outside cam view { 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 - else if (player->spectator) // no spectator chasecam - chasecam = false; // force chasecam off return chasecam; } @@ -1451,7 +1453,7 @@ boolean R_IsViewpointThirdPerson(player_t *player, boolean skybox) if (player->awayviewtics || skybox) return chasecam; // use outside cam view - else if (!player->spectator && chasecam) + else if (chasecam) return true; // use the player's eyes view