Awayview cleanup

- Moved variables to awayview_t
- Arbritrary +20 is no longer added to z pos, it will use the thing position as the camera position directly.
This commit is contained in:
Sally Coolatta 2023-02-26 20:27:39 -05:00
parent 4ff0a8358f
commit 82313de499
15 changed files with 109 additions and 111 deletions

View file

@ -2557,7 +2557,7 @@ void CL_ClearPlayer(INT32 playernum)
P_SetTarget(&players[playernum].skybox.viewpoint, NULL);
P_SetTarget(&players[playernum].skybox.centerpoint, NULL);
P_SetTarget(&players[playernum].awayviewmobj, NULL);
P_SetTarget(&players[playernum].awayview.mobj, NULL);
P_SetTarget(&players[playernum].followmobj, NULL);
P_SetTarget(&players[playernum].hoverhyudoro, NULL);
P_SetTarget(&players[playernum].stumbleIndicator, NULL);

View file

@ -384,6 +384,13 @@ typedef struct {
boolean flip;
} sonicloopvars_t;
// player_t struct for all alternative viewpoint variables
struct altview_t
{
mobj_t *mobj;
INT32 tics;
};
// ========================================================================
// PLAYER STRUCTURE
// ========================================================================
@ -644,9 +651,7 @@ struct player_t
INT32 onconveyor; // You are on a conveyor belt if nonzero
mobj_t *awayviewmobj;
INT32 awayviewtics;
angle_t awayviewaiming; // Used for cut-away view
altview_t awayview;
boolean spectator;
tic_t spectatewait; // reimplementable as UINT8 queue - How long have you been waiting as a spectator

View file

@ -62,7 +62,7 @@ static tic_t stoptimer;
static boolean keypressed = false;
static INT32 menuanimtimer; // Title screen: background animation timing
mobj_t *titlemapcameraref = NULL;
altview_t titlemapcam = {0};
// menu presentation state
char curbgname[9];
@ -1836,7 +1836,7 @@ void F_StartTitleScreen(void)
gamestate_t prevwipegamestate = wipegamestate;
titlemapinaction = true;
titlemapcameraref = NULL;
P_SetTarget(&titlemapcam.mobj, NULL);
gamemap = titleMapNum+1;
maptol = mapheaderinfo[titleMapNum]->typeoflevel;
@ -2138,7 +2138,7 @@ void F_TitleScreenTicker(boolean run)
mobj_t *cameraref = NULL;
// If there's a Line 422 Switch Cut-Away view, don't force us.
if (!titlemapcameraref || titlemapcameraref->type != MT_ALTVIEWMAN)
if (titlemapcam.mobj == NULL || titlemapcam.mobj->type != MT_ALTVIEWMAN)
{
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
{
@ -2153,14 +2153,21 @@ void F_TitleScreenTicker(boolean run)
if (mo2->type != MT_ALTVIEWMAN)
continue;
cameraref = titlemapcameraref = mo2;
cameraref = mo2;
break;
}
if (cameraref != NULL)
{
P_SetTarget(&titlemapcam.mobj, cameraref);
}
}
else
cameraref = titlemapcameraref;
{
cameraref = titlemapcam.mobj;
}
if (cameraref)
if (cameraref != NULL)
{
camera[0].x = cameraref->x;
camera[0].y = cameraref->y;
@ -3136,8 +3143,6 @@ boolean F_StartCeremony(void)
{
INT32 podiumMapNum = nummapheaders;
wipegamestate = GS_CEREMONY;
if (podiummap
&& ((podiumMapNum = G_MapNumber(podiummap)) < nummapheaders)
&& mapheaderinfo[podiumMapNum]

View file

@ -105,17 +105,10 @@ extern INT16 ttloop;
extern UINT16 tttics;
extern boolean ttavailable[6];
typedef enum
{
TITLEMAP_OFF = 0,
TITLEMAP_LOADING,
TITLEMAP_RUNNING
} titlemap_enum;
// Current menu parameters
extern mobj_t *titlemapcameraref;
extern altview_t titlemapcam;
extern char curbgname[9];
extern SINT8 curfadevalue;
extern INT32 curbgcolor;

View file

@ -2520,7 +2520,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
{
follower = players[player].follower;
P_SetTarget(&players[player].follower, NULL);
P_SetTarget(&players[player].awayviewmobj, NULL);
P_SetTarget(&players[player].awayview.mobj, NULL);
P_SetTarget(&players[player].stumbleIndicator, NULL);
P_SetTarget(&players[player].followmobj, NULL);

View file

@ -2989,7 +2989,7 @@ static void K_drawKartPlayerCheck(void)
return;
}
if (stplyr->spectator || stplyr->awayviewtics)
if (stplyr->spectator || stplyr->awayview.tics)
{
return;
}
@ -3238,7 +3238,7 @@ static void K_drawKartNameTags(void)
return;
}
if (stplyr->awayviewtics)
if (stplyr->awayview.tics)
{
return;
}

View file

@ -482,12 +482,10 @@ static int player_get(lua_State *L)
lua_pushinteger(L, plr->timeshitprev);
else if (fastcmp(field,"onconveyor"))
lua_pushinteger(L, plr->onconveyor);
else if (fastcmp(field,"awayviewmobj"))
LUA_PushUserdata(L, plr->awayviewmobj, META_MOBJ);
else if (fastcmp(field,"awayviewtics"))
lua_pushinteger(L, plr->awayviewtics);
else if (fastcmp(field,"awayviewaiming"))
lua_pushangle(L, plr->awayviewaiming);
else if (fastcmp(field,"awayviewmobj")) // FIXME: struct
LUA_PushUserdata(L, plr->awayview.mobj, META_MOBJ);
else if (fastcmp(field,"awayviewtics")) // FIXME: struct
lua_pushinteger(L, plr->awayview.tics);
else if (fastcmp(field,"spectator"))
lua_pushboolean(L, plr->spectator);
@ -848,21 +846,19 @@ static int player_set(lua_State *L)
plr->timeshitprev = (UINT8)luaL_checkinteger(L, 3);
else if (fastcmp(field,"onconveyor"))
plr->onconveyor = (INT32)luaL_checkinteger(L, 3);
else if (fastcmp(field,"awayviewmobj"))
else if (fastcmp(field,"awayviewmobj")) // FIXME: struct
{
mobj_t *mo = NULL;
if (!lua_isnil(L, 3))
mo = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ));
P_SetTarget(&plr->awayviewmobj, mo);
P_SetTarget(&plr->awayview.mobj, mo);
}
else if (fastcmp(field,"awayviewtics"))
else if (fastcmp(field,"awayviewtics")) // FIXME: struct
{
plr->awayviewtics = (INT32)luaL_checkinteger(L, 3);
if (plr->awayviewtics && !plr->awayviewmobj) // awayviewtics must ALWAYS have an awayviewmobj set!!
P_SetTarget(&plr->awayviewmobj, plr->mo); // but since the script might set awayviewmobj immediately AFTER setting awayviewtics, use player mobj as filler for now.
plr->awayview.tics = (INT32)luaL_checkinteger(L, 3);
if (plr->awayview.tics && !plr->awayview.mobj) // awayviewtics must ALWAYS have an awayviewmobj set!!
P_SetTarget(&plr->awayview.mobj, plr->mo); // but since the script might set awayviewmobj immediately AFTER setting awayviewtics, use player mobj as filler for now.
}
else if (fastcmp(field,"awayviewaiming"))
plr->awayviewaiming = luaL_checkangle(L, 3);
else if (fastcmp(field,"spectator"))
plr->spectator = lua_toboolean(L, 3);
else if (fastcmp(field,"bot"))

View file

@ -4165,8 +4165,8 @@ void A_OverlayThink(mobj_t *actor)
{
angle_t viewingangle;
if (players[displayplayers[0]].awayviewtics)
viewingangle = R_PointToAngle2(actor->target->x, actor->target->y, players[displayplayers[0]].awayviewmobj->x, players[displayplayers[0]].awayviewmobj->y);
if (players[displayplayers[0]].awayview.tics)
viewingangle = R_PointToAngle2(actor->target->x, actor->target->y, players[displayplayers[0]].awayview.mobj->x, players[displayplayers[0]].awayview.mobj->y);
else if (!camera[0].chase && players[displayplayers[0]].mo)
viewingangle = R_PointToAngle2(actor->target->x, actor->target->y, players[displayplayers[0]].mo->x, players[displayplayers[0]].mo->y);
else

View file

@ -3779,13 +3779,13 @@ void P_CalcChasePostImg(player_t *player, camera_t *thiscam)
{
postimg = postimg_mirror;
}
else if (player->awayviewtics && player->awayviewmobj && !P_MobjWasRemoved(player->awayviewmobj)) // Camera must obviously exist
else if (player->awayview.tics && player->awayview.mobj && !P_MobjWasRemoved(player->awayview.mobj)) // Camera must obviously exist
{
camera_t dummycam;
dummycam.subsector = player->awayviewmobj->subsector;
dummycam.x = player->awayviewmobj->x;
dummycam.y = player->awayviewmobj->y;
dummycam.z = player->awayviewmobj->z;
dummycam.subsector = player->awayview.mobj->subsector;
dummycam.x = player->awayview.mobj->x;
dummycam.y = player->awayview.mobj->y;
dummycam.z = player->awayview.mobj->z;
//dummycam.height = 40*FRACUNIT; // alt view height is 20*FRACUNIT
dummycam.height = 0; // Why? Remote viewpoint cameras have no height.
// Are we in water?
@ -8088,8 +8088,8 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
angle_t viewingangle;
statenum_t curstate = ((mobj->tics == 1) ? (mobj->state->nextstate) : ((statenum_t)(mobj->state-states)));
if (players[displayplayers[0]].awayviewtics)
viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, players[displayplayers[0]].awayviewmobj->x, players[displayplayers[0]].awayviewmobj->y);
if (players[displayplayers[0]].awayview.tics)
viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, players[displayplayers[0]].awayview.mobj->x, players[displayplayers[0]].awayview.mobj->y);
else if (!camera[0].chase && players[displayplayers[0]].mo)
viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, players[displayplayers[0]].mo->x, players[displayplayers[0]].mo->y);
else
@ -8219,8 +8219,8 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
{
angle_t viewingangle;
if (players[displayplayers[0]].awayviewtics)
viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, players[displayplayers[0]].awayviewmobj->x, players[displayplayers[0]].awayviewmobj->y);
if (players[displayplayers[0]].awayview.tics)
viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, players[displayplayers[0]].awayview.mobj->x, players[displayplayers[0]].awayview.mobj->y);
else if (!camera[0].chase && players[displayplayers[0]].mo)
viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, players[displayplayers[0]].mo->x, players[displayplayers[0]].mo->y);
else
@ -8324,8 +8324,8 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
{
angle_t viewingangle;
if (players[displayplayers[0]].awayviewtics)
viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, players[displayplayers[0]].awayviewmobj->x, players[displayplayers[0]].awayviewmobj->y);
if (players[displayplayers[0]].awayview.tics)
viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, players[displayplayers[0]].awayview.mobj->x, players[displayplayers[0]].awayview.mobj->y);
else if (!camera[0].chase && players[displayplayers[0]].mo)
viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, players[displayplayers[0]].mo->x, players[displayplayers[0]].mo->y);
else

View file

@ -137,8 +137,7 @@ static void P_NetArchivePlayers(savebuffer_t *save)
WRITEANGLE(save->p, players[i].drawangle);
WRITEANGLE(save->p, players[i].viewrollangle);
WRITEANGLE(save->p, players[i].tilt);
WRITEANGLE(save->p, players[i].awayviewaiming);
WRITEINT32(save->p, players[i].awayviewtics);
WRITEINT32(save->p, players[i].awayview.tics);
WRITEUINT8(save->p, players[i].playerstate);
WRITEUINT32(save->p, players[i].pflags);
@ -197,7 +196,7 @@ static void P_NetArchivePlayers(savebuffer_t *save)
WRITEUINT8(save->p, players[i].splitscreenindex);
if (players[i].awayviewmobj)
if (players[i].awayview.mobj)
flags |= AWAYVIEW;
if (players[i].followmobj)
@ -227,7 +226,7 @@ static void P_NetArchivePlayers(savebuffer_t *save)
WRITEUINT32(save->p, players[i].skybox.centerpoint->mobjnum);
if (flags & AWAYVIEW)
WRITEUINT32(save->p, players[i].awayviewmobj->mobjnum);
WRITEUINT32(save->p, players[i].awayview.mobj->mobjnum);
if (flags & FOLLOWITEM)
WRITEUINT32(save->p, players[i].followmobj->mobjnum);
@ -527,8 +526,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
players[i].drawangle = players[i].old_drawangle = READANGLE(save->p);
players[i].viewrollangle = READANGLE(save->p);
players[i].tilt = READANGLE(save->p);
players[i].awayviewaiming = READANGLE(save->p);
players[i].awayviewtics = READINT32(save->p);
players[i].awayview.tics = READINT32(save->p);
players[i].playerstate = READUINT8(save->p);
players[i].pflags = READUINT32(save->p);
@ -596,7 +594,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
players[i].skybox.centerpoint = (mobj_t *)(size_t)READUINT32(save->p);
if (flags & AWAYVIEW)
players[i].awayviewmobj = (mobj_t *)(size_t)READUINT32(save->p);
players[i].awayview.mobj = (mobj_t *)(size_t)READUINT32(save->p);
if (flags & FOLLOWITEM)
players[i].followmobj = (mobj_t *)(size_t)READUINT32(save->p);
@ -4684,12 +4682,12 @@ static void P_RelinkPointers(void)
if (!P_SetTarget(&players[i].skybox.centerpoint, P_FindNewPosition(temp)))
CONS_Debug(DBG_GAMELOGIC, "skybox.centerpoint not found on player %d\n", i);
}
if (players[i].awayviewmobj)
if (players[i].awayview.mobj)
{
temp = (UINT32)(size_t)players[i].awayviewmobj;
players[i].awayviewmobj = NULL;
if (!P_SetTarget(&players[i].awayviewmobj, P_FindNewPosition(temp)))
CONS_Debug(DBG_GAMELOGIC, "awayviewmobj not found on player %d\n", i);
temp = (UINT32)(size_t)players[i].awayview.mobj;
players[i].awayview.mobj = NULL;
if (!P_SetTarget(&players[i].awayview.mobj, P_FindNewPosition(temp)))
CONS_Debug(DBG_GAMELOGIC, "awayview.mobj not found on player %d\n", i);
}
if (players[i].followmobj)
{

View file

@ -2994,35 +2994,35 @@ boolean P_ProcessSpecial(activator_t *activator, INT16 special, INT32 *args, cha
case 422: // Cut away to another view
{
mobj_t *altview;
INT32 aim;
altview_t *modifyView = NULL;
mobj_t *newViewMobj = NULL;
if ((!mo || !mo->player) && !titlemapinaction) // only players have views, and title screens
return false;
altview = P_FindObjectTypeFromTag(MT_ALTVIEWMAN, args[0]);
if (!altview || !altview->spawnpoint)
return false;
// If titlemap, set the camera ref for title's thinker
// This is not revoked until overwritten; awayviewtics is ignored
if (titlemapinaction)
titlemapcameraref = altview;
{
modifyView = &titlemapcam;
}
else if (mo != NULL && mo->player != NULL)
{
modifyView = &mo->player->awayview;
}
else
{
P_SetTarget(&mo->player->awayviewmobj, altview);
mo->player->awayviewtics = args[1];
return false;
}
aim = (backwardsCompat) ? args[2] : altview->spawnpoint->pitch;
aim = (aim + 360) % 360;
aim *= (ANGLE_90>>8);
aim /= 90;
aim <<= 8;
if (titlemapinaction)
titlemapcameraref->cusval = (angle_t)aim;
else
mo->player->awayviewaiming = (angle_t)aim;
newViewMobj = P_FindObjectTypeFromTag(MT_ALTVIEWMAN, args[0]);
if (newViewMobj == NULL || newViewMobj->spawnpoint == NULL)
{
return false;
}
P_SetTarget(&modifyView->mobj, newViewMobj);
// If titlemap, awayview.tics is ignored
if (titlemapinaction == false)
{
modifyView->tics = args[1];
}
}
break;

View file

@ -3670,10 +3670,10 @@ static void P_CalcPostImg(player_t *player)
else
pviewheight = player->mo->z + player->viewheight;
if (player->awayviewtics && player->awayviewmobj && !P_MobjWasRemoved(player->awayviewmobj))
if (player->awayview.tics && player->awayview.mobj && !P_MobjWasRemoved(player->awayview.mobj))
{
sector = player->awayviewmobj->subsector->sector;
pviewheight = player->awayviewmobj->z + 20*FRACUNIT;
sector = player->awayview.mobj->subsector->sector;
pviewheight = player->awayview.mobj->z;
}
for (i = 0; i <= (unsigned)r_splitscreen; i++)
@ -4020,17 +4020,17 @@ void P_PlayerThink(player_t *player)
player->old_drawangle = player->drawangle;
if (player->awayviewmobj && P_MobjWasRemoved(player->awayviewmobj))
if (player->awayview.mobj && P_MobjWasRemoved(player->awayview.mobj))
{
P_SetTarget(&player->awayviewmobj, NULL); // remove awayviewmobj asap if invalid
player->awayviewtics = 0; // reset to zero
P_SetTarget(&player->awayview.mobj, NULL); // remove awayview.mobj asap if invalid
player->awayview.tics = 0; // reset to zero
}
if (player->flashcount)
player->flashcount--;
if (player->awayviewtics && player->awayviewtics != -1)
player->awayviewtics--;
if (player->awayview.tics && player->awayview.tics != -1)
player->awayview.tics--;
// Track airtime
if (P_IsObjectOnGround(player->mo)

View file

@ -1192,10 +1192,10 @@ static void R_SetupAimingFrame(int s)
player_t *player = &players[displayplayers[s]];
camera_t *thiscam = &camera[s];
if (player->awayviewtics)
if (player->awayview.tics)
{
newview->aim = player->awayviewaiming;
newview->angle = player->awayviewmobj->angle;
newview->aim = player->awayview.mobj->pitch;
newview->angle = player->awayview.mobj->angle;
}
else if (thiscam && thiscam->chase)
{
@ -1237,15 +1237,15 @@ void R_SetupFrame(int s)
R_SetupAimingFrame(s);
if (player->awayviewtics)
if (player->awayview.tics)
{
// cut-away view stuff
r_viewmobj = player->awayviewmobj; // should be a MT_ALTVIEWMAN
r_viewmobj = player->awayview.mobj; // should be a MT_ALTVIEWMAN
I_Assert(r_viewmobj != NULL);
newview->x = r_viewmobj->x;
newview->y = r_viewmobj->y;
newview->z = r_viewmobj->z + 20*FRACUNIT;
newview->z = r_viewmobj->z;
R_SetupCommonFrame(player, r_viewmobj->subsector);
}
@ -1306,10 +1306,10 @@ void R_SkyboxFrame(int s)
vector3_t campos = {0,0,0}; // Position of player's actual view point
mobj_t *center = player->skybox.centerpoint;
if (player->awayviewtics) {
campos.x = player->awayviewmobj->x;
campos.y = player->awayviewmobj->y;
campos.z = player->awayviewmobj->z + 20*FRACUNIT;
if (player->awayview.tics) {
campos.x = player->awayview.mobj->x;
campos.y = player->awayview.mobj->y;
campos.z = player->awayview.mobj->z;
} else if (thiscam->chase) {
campos.x = thiscam->x;
campos.y = thiscam->y;
@ -1403,7 +1403,7 @@ boolean R_IsViewpointThirdPerson(player_t *player, boolean skybox)
boolean chasecam = R_ViewpointHasChasecam(player);
// cut-away view stuff
if (player->awayviewtics || skybox)
if (player->awayview.tics || skybox)
return chasecam;
// use outside cam view
else if (!player->spectator && chasecam)

View file

@ -540,9 +540,9 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume)
continue;
}
if (player->awayviewtics)
if (player->awayview.tics)
{
listenmobj[i] = player->awayviewmobj;
listenmobj[i] = player->awayview.mobj;
}
else
{
@ -572,7 +572,7 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume)
continue;
}
if (camera[i].chase && !player->awayviewtics)
if (camera[i].chase && !player->awayview.tics)
{
listener[i].x = camera[i].x;
listener[i].y = camera[i].y;
@ -827,9 +827,9 @@ void S_UpdateSounds(void)
continue;
}
if (player->awayviewtics)
if (player->awayview.tics)
{
listenmobj[i] = player->awayviewmobj;
listenmobj[i] = player->awayview.mobj;
}
else
{
@ -858,7 +858,7 @@ void S_UpdateSounds(void)
continue;
}
if (camera[i].chase && !player->awayviewtics)
if (camera[i].chase && !player->awayview.tics)
{
listener[i].x = camera[i].x;
listener[i].y = camera[i].y;

View file

@ -46,6 +46,7 @@ TYPEDEF (respawnvars_t);
TYPEDEF (botvars_t);
TYPEDEF (skybox_t);
TYPEDEF (itemroulette_t);
TYPEDEF (altview_t);
TYPEDEF (player_t);
// d_clisrv.h