From d7ab41a90b9393f5228d5e1940b9f19b2cd88db5 Mon Sep 17 00:00:00 2001 From: lachwright Date: Sun, 6 Sep 2020 17:28:34 +0930 Subject: [PATCH] Objectplace improvements: - movement speeds are scaled with player scale - spawned objects are scaled with player scale - command accepts argument for thing num to set --- src/m_cheat.c | 130 ++++++++++++++++++++++++++++---------------------- src/p_local.h | 2 + src/p_mobj.c | 2 +- 3 files changed, 75 insertions(+), 59 deletions(-) diff --git a/src/m_cheat.c b/src/m_cheat.c index ab1454503..3a2bf79a8 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -1023,8 +1023,8 @@ static void OP_CycleThings(INT32 amt) states[S_OBJPLACE_DUMMY].frame = states[mobjinfo[op_currentthing].spawnstate].frame; } if (players[0].mo->eflags & MFE_VERTICALFLIP) // correct z when flipped - players[0].mo->z += players[0].mo->height - mobjinfo[op_currentthing].height; - players[0].mo->height = mobjinfo[op_currentthing].height; + players[0].mo->z += players[0].mo->height - FixedMul(mobjinfo[op_currentthing].height, players[0].mo->scale); + players[0].mo->height = FixedMul(mobjinfo[op_currentthing].height, players[0].mo->scale); P_SetPlayerMobjState(players[0].mo, S_OBJPLACE_DUMMY); op_currentdoomednum = mobjinfo[op_currentthing].doomednum; @@ -1107,6 +1107,7 @@ static mapthing_t *OP_CreateNewMapThing(player_t *player, UINT16 type, boolean c mt->angle = (INT16)(FixedInt(AngleFixed(player->mo->angle))); mt->options = (mt->z << ZSHIFT) | (UINT16)cv_opflags.value; + mt->scale = player->mo->scale; return mt; } @@ -1305,19 +1306,19 @@ void OP_ObjectplaceMovement(player_t *player) ticmiss++; if (cmd->buttons & BT_JUMP) - player->mo->z += FRACUNIT*cv_speed.value; + player->mo->z += player->mo->scale*cv_speed.value; else if (cmd->buttons & BT_SPIN) - player->mo->z -= FRACUNIT*cv_speed.value; + player->mo->z -= player->mo->scale*cv_speed.value; if (cmd->forwardmove != 0) { - P_Thrust(player->mo, player->mo->angle, (cmd->forwardmove*FRACUNIT/MAXPLMOVE)*cv_speed.value); + P_Thrust(player->mo, player->mo->angle, (cmd->forwardmove*player->mo->scale/MAXPLMOVE)*cv_speed.value); P_TeleportMove(player->mo, player->mo->x+player->mo->momx, player->mo->y+player->mo->momy, player->mo->z); player->mo->momx = player->mo->momy = 0; } if (cmd->sidemove != 0) { - P_Thrust(player->mo, player->mo->angle-ANGLE_90, (cmd->sidemove*FRACUNIT/MAXPLMOVE)*cv_speed.value); + P_Thrust(player->mo, player->mo->angle-ANGLE_90, (cmd->sidemove*player->mo->scale/MAXPLMOVE)*cv_speed.value); P_TeleportMove(player->mo, player->mo->x+player->mo->momx, player->mo->y+player->mo->momy, player->mo->z); player->mo->momx = player->mo->momy = 0; } @@ -1443,62 +1444,75 @@ void Command_ObjectPlace_f(void) G_SetGameModified(multiplayer); // Entering objectplace? - if (!objectplacing) + if (!objectplacing || COM_Argc() > 1) { - objectplacing = true; - - if (players[0].powers[pw_carry] == CR_NIGHTSMODE) - return; - - if (!COM_CheckParm("-silent")) + if (!objectplacing) { - HU_SetCEchoFlags(V_RETURN8|V_MONOSPACE|V_AUTOFADEOUT); - HU_SetCEchoDuration(10); - HU_DoCEcho(va(M_GetText( - "\\\\\\\\\\\\\\\\\\\\\\\\\x82" - " Objectplace Controls: \x80\\\\" - "Weapon Next/Prev: Cycle mapthings\\" - " Jump: Float up \\" - " Spin: Float down \\" - " Fire Ring: Place object \\"))); + objectplacing = true; + + if (players[0].powers[pw_carry] == CR_NIGHTSMODE) + return; + + if (!COM_CheckParm("-silent")) + { + HU_SetCEchoFlags(V_RETURN8|V_MONOSPACE|V_AUTOFADEOUT); + HU_SetCEchoDuration(10); + HU_DoCEcho(va(M_GetText( + "\\\\\\\\\\\\\\\\\\\\\\\\\x82" + " Objectplace Controls: \x80\\\\" + "Weapon Next/Prev: Cycle mapthings\\" + " Jump: Float up \\" + " Spin: Float down \\" + " Fire Ring: Place object \\"))); + } + + // Save all the player's data. + op_oldflags1 = players[0].mo->flags; + op_oldflags2 = players[0].mo->flags2; + op_oldeflags = players[0].mo->eflags; + op_oldpflags = players[0].pflags; + op_oldmomx = players[0].mo->momx; + op_oldmomy = players[0].mo->momy; + op_oldmomz = players[0].mo->momz; + op_oldheight = players[0].mo->height; + op_oldstate = S_PLAY_STND; + op_oldcolor = players[0].mo->color; // save color too in case of super/fireflower + + // Remove ALL flags and motion. + P_UnsetThingPosition(players[0].mo); + players[0].pflags = 0; + players[0].mo->flags2 = 0; + players[0].mo->eflags = 0; + players[0].mo->flags = (MF_NOCLIP|MF_NOGRAVITY|MF_NOBLOCKMAP); + players[0].mo->momx = players[0].mo->momy = players[0].mo->momz = 0; + P_SetThingPosition(players[0].mo); + + // Take away color so things display properly + players[0].mo->color = 0; + + // Like the classics, recover from death by entering objectplace + if (players[0].mo->health <= 0) + { + players[0].mo->health = 1; + players[0].deadtimer = 0; + op_oldflags1 = mobjinfo[MT_PLAYER].flags; + ++players[0].lives; + players[0].playerstate = PST_LIVE; + P_RestoreMusic(&players[0]); + } + else + op_oldstate = (statenum_t)(players[0].mo->state-states); } - // Save all the player's data. - op_oldflags1 = players[0].mo->flags; - op_oldflags2 = players[0].mo->flags2; - op_oldeflags = players[0].mo->eflags; - op_oldpflags = players[0].pflags; - op_oldmomx = players[0].mo->momx; - op_oldmomy = players[0].mo->momy; - op_oldmomz = players[0].mo->momz; - op_oldheight = players[0].mo->height; - op_oldstate = S_PLAY_STND; - op_oldcolor = players[0].mo->color; // save color too in case of super/fireflower - - // Remove ALL flags and motion. - P_UnsetThingPosition(players[0].mo); - players[0].pflags = 0; - players[0].mo->flags2 = 0; - players[0].mo->eflags = 0; - players[0].mo->flags = (MF_NOCLIP|MF_NOGRAVITY|MF_NOBLOCKMAP); - players[0].mo->momx = players[0].mo->momy = players[0].mo->momz = 0; - P_SetThingPosition(players[0].mo); - - // Take away color so things display properly - players[0].mo->color = 0; - - // Like the classics, recover from death by entering objectplace - if (players[0].mo->health <= 0) + if (COM_Argc() > 1) { - players[0].mo->health = 1; - players[0].deadtimer = 0; - op_oldflags1 = mobjinfo[MT_PLAYER].flags; - ++players[0].lives; - players[0].playerstate = PST_LIVE; - P_RestoreMusic(&players[0]); + UINT16 mapthingnum = atoi(COM_Argv(1)); + mobjtype_t type = P_GetMobjtype(mapthingnum); + if (type == MT_UNKNOWN) + CONS_Printf(M_GetText("No mobj type delegated to thing type %d.\n"), mapthingnum); + else + op_currentthing = type; } - else - op_oldstate = (statenum_t)(players[0].mo->state-states); // If no thing set, then cycle a little if (!op_currentthing) @@ -1506,8 +1520,8 @@ void Command_ObjectPlace_f(void) op_currentthing = 1; OP_CycleThings(1); } - else // Cycle things sets this for the former. - players[0].mo->height = mobjinfo[op_currentthing].height; + else + OP_CycleThings(0); // sets all necessary height values without cycling op_currentthing P_SetPlayerMobjState(players[0].mo, S_OBJPLACE_DUMMY); } diff --git a/src/p_local.h b/src/p_local.h index 4077fecf6..cf3a66e9d 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -274,6 +274,8 @@ extern tic_t itemrespawntime[ITEMQUESIZE]; extern size_t iquehead, iquetail; extern consvar_t cv_gravity, cv_movebob; +mobjtype_t P_GetMobjtype(UINT16 mthingtype); + void P_RespawnSpecials(void); mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type); diff --git a/src/p_mobj.c b/src/p_mobj.c index fcba1f690..1e8fe02c1 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -11249,7 +11249,7 @@ void P_PrecipitationEffects(void) * \param mthingtype Mapthing number in question. * \return Mobj type; MT_UNKNOWN if nothing found. */ -static mobjtype_t P_GetMobjtype(UINT16 mthingtype) +mobjtype_t P_GetMobjtype(UINT16 mthingtype) { mobjtype_t i; for (i = 0; i < NUMMOBJTYPES; i++)