Replace spectator movement with demo freecam
This commit is contained in:
parent
6531cc065e
commit
e0a191f4d5
7 changed files with 18 additions and 84 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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];
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
55
src/p_user.c
55
src/p_user.c
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue