mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-28 23:21:58 +00:00
Changed teetering to match the discoveries made about it in the sectorlist_traversal branch in a way that matches my revamps here, since I DID change a lot.
This commit is contained in:
parent
51c769247a
commit
19b186e52e
1 changed files with 4 additions and 100 deletions
104
src/p_user.c
104
src/p_user.c
|
@ -2852,8 +2852,8 @@ static void P_DoTeeter(player_t *player)
|
||||||
msecnode_t *node;
|
msecnode_t *node;
|
||||||
boolean teeter = false;
|
boolean teeter = false;
|
||||||
boolean roverfloor; // solid 3d floors?
|
boolean roverfloor; // solid 3d floors?
|
||||||
boolean checkedforteeter = false;
|
|
||||||
fixed_t floorheight, ceilingheight;
|
fixed_t floorheight, ceilingheight;
|
||||||
|
fixed_t highestceilingheight, lowestfloorheight;
|
||||||
fixed_t topheight, bottomheight; // for 3d floor usage
|
fixed_t topheight, bottomheight; // for 3d floor usage
|
||||||
const fixed_t tiptop = FixedMul(MAXSTEPMOVE, player->mo->scale); // Distance you have to be above the ground in order to teeter.
|
const fixed_t tiptop = FixedMul(MAXSTEPMOVE, player->mo->scale); // Distance you have to be above the ground in order to teeter.
|
||||||
|
|
||||||
|
@ -2862,107 +2862,11 @@ static void P_DoTeeter(player_t *player)
|
||||||
teeter = true;
|
teeter = true;
|
||||||
#undef maxzdelta
|
#undef maxzdelta
|
||||||
else // Let's do some checks...
|
else // Let's do some checks...
|
||||||
{
|
|
||||||
for (node = player->mo->touching_sectorlist; node; node = node->m_snext)
|
|
||||||
{
|
|
||||||
// Ledge teetering. Check if any nearby sectors are low enough from your current one.
|
|
||||||
checkedforteeter = true;
|
|
||||||
roverfloor = false;
|
|
||||||
|
|
||||||
ceilingheight = node->m_sector->ceilingheight;
|
|
||||||
floorheight = node->m_sector->floorheight;
|
|
||||||
#ifdef ESLOPE
|
|
||||||
if (node->m_sector->c_slope)
|
|
||||||
ceilingheight = P_GetZAt(node->m_sector->c_slope, player->mo->x, player->mo->y) + FixedMul(node->m_sector->c_slope->zdelta, tiptop);
|
|
||||||
if (node->m_sector->f_slope)
|
|
||||||
floorheight = P_GetZAt(node->m_sector->f_slope, player->mo->x, player->mo->y);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (node->m_sector->ffloors)
|
|
||||||
{
|
|
||||||
ffloor_t *rover;
|
|
||||||
for (rover = node->m_sector->ffloors; rover; rover = rover->next)
|
|
||||||
{
|
|
||||||
if (!(rover->flags & FF_EXISTS)) continue;
|
|
||||||
|
|
||||||
topheight = *rover->topheight;
|
|
||||||
bottomheight = *rover->bottomheight;
|
|
||||||
|
|
||||||
#ifdef ESLOPE
|
|
||||||
if (*rover->t_slope)
|
|
||||||
topheight = P_GetZAt(*rover->t_slope, player->mo->x, player->mo->y);
|
|
||||||
if (*rover->b_slope)
|
|
||||||
bottomheight = P_GetZAt(*rover->b_slope, player->mo->x, player->mo->y);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (P_CheckSolidLava(player->mo, rover))
|
|
||||||
;
|
|
||||||
else if (!(rover->flags & FF_BLOCKPLAYER || rover->flags & FF_QUICKSAND))
|
|
||||||
continue; // intangible 3d floor
|
|
||||||
|
|
||||||
if (player->mo->eflags & MFE_VERTICALFLIP)
|
|
||||||
{
|
|
||||||
if (bottomheight > ceilingheight) // Above the ceiling
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (bottomheight > player->mo->z + player->mo->height + tiptop
|
|
||||||
|| (topheight < player->mo->z
|
|
||||||
&& player->mo->z + player->mo->height < ceilingheight - tiptop))
|
|
||||||
{
|
|
||||||
teeter = true;
|
|
||||||
roverfloor = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
teeter = false;
|
|
||||||
roverfloor = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (topheight < floorheight) // Below the floor
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (topheight < player->mo->z - tiptop
|
|
||||||
|| (bottomheight > player->mo->z + player->mo->height
|
|
||||||
&& player->mo->z > floorheight + tiptop))
|
|
||||||
{
|
|
||||||
teeter = true;
|
|
||||||
roverfloor = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
teeter = false;
|
|
||||||
roverfloor = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!teeter && !roverfloor)
|
|
||||||
{
|
|
||||||
if (player->mo->eflags & MFE_VERTICALFLIP)
|
|
||||||
{
|
|
||||||
if (ceilingheight > player->mo->z + player->mo->height + tiptop)
|
|
||||||
teeter = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (floorheight < player->mo->z - tiptop)
|
|
||||||
teeter = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (checkedforteeter && !teeter) // Backup code
|
|
||||||
{
|
{
|
||||||
sector_t *sec;
|
sector_t *sec;
|
||||||
UINT8 i;
|
UINT8 i;
|
||||||
fixed_t highestceilingheight = INT32_MIN;
|
highestceilingheight = INT32_MIN;
|
||||||
fixed_t lowestfloorheight = INT32_MAX;
|
lowestfloorheight = INT32_MAX;
|
||||||
|
|
||||||
teeter = false;
|
teeter = false;
|
||||||
roverfloor = false;
|
roverfloor = false;
|
||||||
|
@ -3197,7 +3101,7 @@ teeterdone:
|
||||||
if ((player->mo->state == &states[S_PLAY_STND] || player->mo->state == &states[S_PLAY_TAP1] || player->mo->state == &states[S_PLAY_TAP2] || player->mo->state == &states[S_PLAY_SUPERSTAND]))
|
if ((player->mo->state == &states[S_PLAY_STND] || player->mo->state == &states[S_PLAY_TAP1] || player->mo->state == &states[S_PLAY_TAP2] || player->mo->state == &states[S_PLAY_SUPERSTAND]))
|
||||||
P_SetPlayerMobjState(player->mo, S_PLAY_TEETER1);
|
P_SetPlayerMobjState(player->mo, S_PLAY_TEETER1);
|
||||||
}
|
}
|
||||||
else if (checkedforteeter && (player->mo->state == &states[S_PLAY_TEETER1] || player->mo->state == &states[S_PLAY_TEETER2] || player->mo->state == &states[S_PLAY_SUPERTEETER]))
|
else if ((player->mo->state == &states[S_PLAY_TEETER1] || player->mo->state == &states[S_PLAY_TEETER2] || player->mo->state == &states[S_PLAY_SUPERTEETER]))
|
||||||
P_SetPlayerMobjState(player->mo, S_PLAY_STND);
|
P_SetPlayerMobjState(player->mo, S_PLAY_STND);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue