diff --git a/src/d_clisrv.c b/src/d_clisrv.c index f4caf66e6..734173f8d 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -506,6 +506,8 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i) rsp->skin = LONG(players[i].skin); // Just in case Lua does something like // modify these at runtime + rsp->camerascale = (fixed_t)LONG(players[i].camerascale); + rsp->shieldscale = (fixed_t)LONG(players[i].shieldscale); rsp->normalspeed = (fixed_t)LONG(players[i].normalspeed); rsp->runspeed = (fixed_t)LONG(players[i].runspeed); rsp->thrustfactor = players[i].thrustfactor; @@ -521,6 +523,8 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i) rsp->mindash = (fixed_t)LONG(players[i].mindash); rsp->maxdash = (fixed_t)LONG(players[i].maxdash); rsp->jumpfactor = (fixed_t)LONG(players[i].jumpfactor); + rsp->playerheight = (fixed_t)LONG(players[i].height); + rsp->playerspinheight = (fixed_t)LONG(players[i].spinheight); rsp->speed = (fixed_t)LONG(players[i].speed); rsp->jumping = players[i].jumping; @@ -632,6 +636,8 @@ static void resynch_read_player(resynch_pak *rsp) players[i].skin = LONG(rsp->skin); // Just in case Lua does something like // modify these at runtime + players[i].camerascale = (fixed_t)LONG(rsp->camerascale); + players[i].shieldscale = (fixed_t)LONG(rsp->shieldscale); players[i].normalspeed = (fixed_t)LONG(rsp->normalspeed); players[i].runspeed = (fixed_t)LONG(rsp->runspeed); players[i].thrustfactor = rsp->thrustfactor; @@ -647,6 +653,8 @@ static void resynch_read_player(resynch_pak *rsp) players[i].mindash = (fixed_t)LONG(rsp->mindash); players[i].maxdash = (fixed_t)LONG(rsp->maxdash); players[i].jumpfactor = (fixed_t)LONG(rsp->jumpfactor); + players[i].height = (fixed_t)LONG(rsp->playerheight); + players[i].spinheight = (fixed_t)LONG(rsp->playerspinheight); players[i].speed = (fixed_t)LONG(rsp->speed); players[i].jumping = rsp->jumping; diff --git a/src/d_clisrv.h b/src/d_clisrv.h index 9d130618b..f86c09b45 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -166,6 +166,8 @@ typedef struct INT32 skin; // Just in case Lua does something like // modify these at runtime + fixed_t camerascale; + fixed_t shieldscale; fixed_t normalspeed; fixed_t runspeed; UINT8 thrustfactor; @@ -181,6 +183,8 @@ typedef struct fixed_t mindash; fixed_t maxdash; fixed_t jumpfactor; + fixed_t playerheight; + fixed_t playerspinheight; fixed_t speed; UINT8 jumping; diff --git a/src/d_player.h b/src/d_player.h index 620b698c7..bd553d9fa 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -282,6 +282,8 @@ typedef struct player_s playerstate_t playerstate; // Determine POV, including viewpoint bobbing during movement. + fixed_t camerascale; + fixed_t shieldscale; // Focal origin above r.z fixed_t viewz; // Base height above floor for viewz. @@ -349,6 +351,9 @@ typedef struct player_s fixed_t jumpfactor; // How high can the player jump? + fixed_t height; // Bounding box changes. + fixed_t spinheight; + SINT8 lives; SINT8 continues; // continues that player has acquired diff --git a/src/g_game.c b/src/g_game.c index 76229347e..2f60b79c3 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2047,6 +2047,8 @@ void G_PlayerReborn(INT32 player) INT32 score; INT32 lives; INT32 continues; + fixed_t camerascale; + fixed_t shieldscale; UINT8 charability; UINT8 charability2; fixed_t normalspeed; @@ -2070,6 +2072,8 @@ void G_PlayerReborn(INT32 player) INT32 starpostnum; INT32 starpostangle; fixed_t jumpfactor; + fixed_t height; + fixed_t spinheight; INT32 exiting; INT16 numboxes; INT16 totalring; @@ -2101,6 +2105,8 @@ void G_PlayerReborn(INT32 player) skincolor = players[player].skincolor; skin = players[player].skin; + camerascale = players[player].camerascale; + shieldscale = players[player].shieldscale; charability = players[player].charability; charability2 = players[player].charability2; normalspeed = players[player].normalspeed; @@ -2117,6 +2123,8 @@ void G_PlayerReborn(INT32 player) starpostnum = players[player].starpostnum; starpostangle = players[player].starpostangle; jumpfactor = players[player].jumpfactor; + height = players[player].height; + spinheight = players[player].spinheight; thokitem = players[player].thokitem; spinitem = players[player].spinitem; revitem = players[player].revitem; @@ -2142,6 +2150,8 @@ void G_PlayerReborn(INT32 player) // save player config truth reborn p->skincolor = skincolor; p->skin = skin; + p->camerascale = camerascale; + p->shieldscale = shieldscale; p->charability = charability; p->charability2 = charability2; p->normalspeed = normalspeed; @@ -2164,6 +2174,8 @@ void G_PlayerReborn(INT32 player) p->starpostnum = starpostnum; p->starpostangle = starpostangle; p->jumpfactor = jumpfactor; + p->height = height; + p->spinheight = spinheight; p->exiting = exiting; p->numboxes = numboxes; @@ -4696,6 +4708,8 @@ void G_BeginRecording(void) demo_p += 16; // Stats + WRITEUINT8(demo_p,player->camerascale>>FRACBITS); + WRITEUINT8(demo_p,player->shieldscale>>FRACBITS); WRITEUINT8(demo_p,player->charability); WRITEUINT8(demo_p,player->charability2); WRITEUINT8(demo_p,player->actionspd>>FRACBITS); @@ -4706,6 +4720,8 @@ void G_BeginRecording(void) WRITEUINT8(demo_p,player->thrustfactor); WRITEUINT8(demo_p,player->accelstart); WRITEUINT8(demo_p,player->acceleration); + WRITEUINT8(demo_p,player->height>>FRACBITS); + WRITEUINT8(demo_p,player->spinheight>>FRACBITS); // Trying to convert it back to % causes demo desync due to precision loss. // Don't do it. @@ -4936,7 +4952,7 @@ void G_DoPlayDemo(char *defdemoname) char skin[17],color[17],*n,*pdemoname; UINT8 version,subversion,charability,charability2,thrustfactor,accelstart,acceleration; UINT32 randseed; - fixed_t actionspd,mindash,maxdash,normalspeed,runspeed,jumpfactor; + fixed_t camerascale,shieldscale,actionspd,mindash,maxdash,normalspeed,runspeed,jumpfactor,height,spinheight; char msg[1024]; skin[16] = '\0'; @@ -5072,6 +5088,8 @@ void G_DoPlayDemo(char *defdemoname) M_Memcpy(color,demo_p,16); demo_p += 16; + camerascale = (fixed_t)READUINT8(demo_p)<cmd, META_TICCMD); else if (fastcmp(field,"playerstate")) lua_pushinteger(L, plr->playerstate); + else if (fastcmp(field,"camerascale")) + lua_pushfixed(L, plr->camerascale); + else if (fastcmp(field,"shieldscale")) + lua_pushfixed(L, plr->shieldscale); else if (fastcmp(field,"viewz")) lua_pushfixed(L, plr->viewz); else if (fastcmp(field,"viewheight")) @@ -172,6 +176,10 @@ static int player_get(lua_State *L) lua_pushfixed(L, plr->maxdash); else if (fastcmp(field,"jumpfactor")) lua_pushfixed(L, plr->jumpfactor); + else if (fastcmp(field,"height")) + lua_pushfixed(L, plr->height); + else if (fastcmp(field,"spinheight")) + lua_pushfixed(L, plr->spinheight); else if (fastcmp(field,"lives")) lua_pushinteger(L, plr->lives); else if (fastcmp(field,"continues")) @@ -355,6 +363,10 @@ static int player_set(lua_State *L) return NOSET; else if (fastcmp(field,"playerstate")) plr->playerstate = luaL_checkinteger(L, 3); + else if (fastcmp(field,"camerascale")) + plr->camerascale = luaL_checkfixed(L, 3); + else if (fastcmp(field,"shieldscale")) + plr->shieldscale = luaL_checkfixed(L, 3); else if (fastcmp(field,"viewz")) plr->viewz = luaL_checkfixed(L, 3); else if (fastcmp(field,"viewheight")) @@ -429,6 +441,10 @@ static int player_set(lua_State *L) plr->maxdash = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"jumpfactor")) plr->jumpfactor = (INT32)luaL_checkinteger(L, 3); + else if (fastcmp(field,"height")) + plr->height = luaL_checkfixed(L, 3); + else if (fastcmp(field,"spinheight")) + plr->spinheight = luaL_checkfixed(L, 3); else if (fastcmp(field,"lives")) plr->lives = (SINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"continues")) diff --git a/src/p_local.h b/src/p_local.h index 8a451566f..a1cf4892a 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -62,6 +62,9 @@ #define mariomode (maptol & TOL_MARIO) #define twodlevel (maptol & TOL_2D) +#define P_GetPlayerHeight(player) FixedMul(player->height, player->mo->scale) +#define P_GetPlayerSpinHeight(player) FixedMul(player->spinheight, player->mo->scale) + // // P_TICK // @@ -119,9 +122,6 @@ extern consvar_t cv_cam2_speed, cv_cam2_rotate, cv_cam2_rotspeed; extern fixed_t t_cam_dist, t_cam_height, t_cam_rotate; extern fixed_t t_cam2_dist, t_cam2_height, t_cam2_rotate; -fixed_t P_GetPlayerRadius(player_t *player); -fixed_t P_GetPlayerHeight(player_t *player); -fixed_t P_GetPlayerSpinHeight(player_t *player); INT32 P_GetPlayerControlDirection(player_t *player); void P_AddPlayerScore(player_t *player, UINT32 amount); void P_ResetCamera(player_t *player, camera_t *thiscam); diff --git a/src/p_mobj.c b/src/p_mobj.c index f2ef4dc0d..72f6098aa 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6301,7 +6301,7 @@ static boolean P_ShieldLook(mobj_t *thing, shieldtype_t shield) thing->flags |= MF_NOCLIPHEIGHT; thing->eflags = (thing->eflags & ~MFE_VERTICALFLIP)|(thing->target->eflags & MFE_VERTICALFLIP); - P_SetScale(thing, FixedMul(thing->target->scale, skins[thing->target->player->skin].shieldscale)); + P_SetScale(thing, FixedMul(thing->target->scale, thing->target->player->shieldscale)); P_UnsetThingPosition(thing); thing->x = thing->target->x; thing->y = thing->target->y; diff --git a/src/p_saveg.c b/src/p_saveg.c index 768949b3c..b086b076e 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -259,6 +259,9 @@ static void P_NetArchivePlayers(void) if (flags & AWAYVIEW) WRITEUINT32(save_p, players[i].awayviewmobj->mobjnum); + WRITEFIXED(save_p, players[i].camerascale); + WRITEFIXED(save_p, players[i].shieldscale); + WRITEUINT8(save_p, players[i].charability); WRITEUINT8(save_p, players[i].charability2); WRITEUINT32(save_p, players[i].charflags); @@ -274,6 +277,8 @@ static void P_NetArchivePlayers(void) WRITEUINT8(save_p, players[i].accelstart); WRITEUINT8(save_p, players[i].acceleration); WRITEFIXED(save_p, players[i].jumpfactor); + WRITEFIXED(save_p, players[i].height); + WRITEFIXED(save_p, players[i].spinheight); } } @@ -424,6 +429,9 @@ static void P_NetUnArchivePlayers(void) players[i].viewheight = cv_viewheight.value<skin].radius, player->mo->scale); -} - -// -// P_GetPlayerHeight -// -// Returns the height -// of the player. -// -fixed_t P_GetPlayerHeight(player_t *player) -{ - return FixedMul(skins[player->skin].height, player->mo->scale); -} - -// -// P_GetPlayerSpinHeight -// -// Returns the 'spin height' -// of the player. -// -fixed_t P_GetPlayerSpinHeight(player_t *player) -{ - return FixedMul(skins[player->skin].spinheight, player->mo->scale); -} - // // Movement. // @@ -7002,7 +6969,6 @@ static void P_MovePlayer(player_t *player) player->mo->height = P_GetPlayerSpinHeight(player); else player->mo->height = P_GetPlayerHeight(player); - player->mo->radius = P_GetPlayerRadius(player); if (player->mo->eflags & MFE_VERTICALFLIP && player->mo->height != oldheight) // adjust z height for reverse gravity, similar to how it's done for scaling player->mo->z -= player->mo->height - oldheight; @@ -7968,16 +7934,16 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall camspeed = cv_cam_speed.value; camstill = cv_cam_still.value; camrotate = cv_cam_rotate.value; - camdist = FixedMul(cv_cam_dist.value, FixedMul(skins[player->skin].camerascale, mo->scale)); - camheight = FixedMul(cv_cam_height.value, FixedMul(skins[player->skin].camerascale, mo->scale)); + camdist = FixedMul(cv_cam_dist.value, FixedMul(player->camerascale, mo->scale)); + camheight = FixedMul(cv_cam_height.value, FixedMul(player->camerascale, mo->scale)); } else // Camera 2 { camspeed = cv_cam2_speed.value; camstill = cv_cam2_still.value; camrotate = cv_cam2_rotate.value; - camdist = FixedMul(cv_cam2_dist.value, FixedMul(skins[player->skin].camerascale, mo->scale)); - camheight = FixedMul(cv_cam2_height.value, FixedMul(skins[player->skin].camerascale, mo->scale)); + camdist = FixedMul(cv_cam2_dist.value, FixedMul(player->camerascale, mo->scale)); + camheight = FixedMul(cv_cam2_height.value, FixedMul(player->camerascale, mo->scale)); } #ifdef REDSANALOG diff --git a/src/r_things.c b/src/r_things.c index ab155bd4d..f9f0f756c 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -2432,7 +2432,7 @@ void SetPlayerSkin(INT32 playernum, const char *skinname) INT32 i = R_SkinAvailable(skinname); player_t *player = &players[playernum]; - if (i != -1) + if ((i != -1) && (!P_IsLocalPlayer(player) || R_SkinUnlock(i))) { SetPlayerSkinByNum(playernum, i); return; @@ -2459,6 +2459,9 @@ void SetPlayerSkinByNum(INT32 playernum, INT32 skinnum) { player->skin = skinnum; + player->camerascale = skin->camerascale; + player->shieldscale = skin->shieldscale; + player->charability = (UINT8)skin->ability; player->charability2 = (UINT8)skin->ability2; @@ -2480,6 +2483,9 @@ void SetPlayerSkinByNum(INT32 playernum, INT32 skinnum) player->jumpfactor = skin->jumpfactor; + player->height = skin->height; + player->spinheight = skin->spinheight; + if (!(cv_debug || devparm) && !(netgame || multiplayer || demoplayback)) { if (playernum == consoleplayer) @@ -2500,6 +2506,7 @@ void SetPlayerSkinByNum(INT32 playernum, INT32 skinnum) if (newcolor) player->mo->color = newcolor; P_SetScale(player->mo, player->mo->scale); + player->mo->radius = FixedMul(skin->radius, player->mo->scale); } return; }