diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 97f416c20..56cb58b47 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -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); diff --git a/src/d_player.h b/src/d_player.h index 298c65485..f38076f6f 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -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 diff --git a/src/f_finale.c b/src/f_finale.c index 9f7f18076..54f90e07a 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -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] diff --git a/src/f_finale.h b/src/f_finale.h index 8afc54aba..9b5ef0691 100644 --- a/src/f_finale.h +++ b/src/f_finale.h @@ -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; diff --git a/src/g_game.c b/src/g_game.c index f8e0bd2a1..48692590a 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -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); diff --git a/src/k_hud.c b/src/k_hud.c index 8fd7607ec..bbc008520 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -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; } diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 211f83867..5e3963402 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -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")) diff --git a/src/p_enemy.c b/src/p_enemy.c index 86ae6d0c3..7c1ede87a 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -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 diff --git a/src/p_mobj.c b/src/p_mobj.c index 3f0481a94..4433e1c64 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -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 diff --git a/src/p_saveg.c b/src/p_saveg.c index fc9d7daf4..4d252c64b 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -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) { diff --git a/src/p_spec.c b/src/p_spec.c index 5d52da0fb..60c261ad8 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -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; diff --git a/src/p_user.c b/src/p_user.c index f95d5afc1..fcf035850 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -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) diff --git a/src/r_main.c b/src/r_main.c index b00717810..ded540741 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -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) diff --git a/src/s_sound.c b/src/s_sound.c index 6deab1f91..b45215c73 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -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; diff --git a/src/typedef.h b/src/typedef.h index 632684d1e..0b745eb30 100644 --- a/src/typedef.h +++ b/src/typedef.h @@ -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