if (mo->momx > 0)
{
leadx = mo->x + mo->radius; trailx = mo->x - mo->radius;
}
else
{
leadx = mo->x - mo->radius; trailx = mo->x + mo->radius;
}
if (mo->momy > 0)
{
leady = mo->y + mo->radius; traily = mo->y - mo->radius;
}
else
{
leady = mo->y - mo->radius; traily = mo->y + mo->radius;
}
bestslidefrac = FRACUNIT+1;
P_PathTraverse ( leadx, leady, leadx+mo->momx, leady+mo->momy, PT_ADDLINES, PTR_SlideTraverse );
P_PathTraverse ( trailx, leady, trailx+mo->momx, leady+mo->momy, PT_ADDLINES, PTR_SlideTraverse );
P_PathTraverse ( leadx, traily, leadx+mo->momx, traily+mo->momy, PT_ADDLINES, PTR_SlideTraverse );
// move up to the wall
if (bestslidefrac == FRACUNIT+1)
{
// the move most have hit the middle, so stairstep stairstep:
if (!P_TryMove (mo, mo->x, mo->y + mo->momy)) P_TryMove (mo, mo->x + mo->momx, mo->y);
return;
}
// fudge a bit to make sure it doesn’t hit bestslidefrac -= 0x800;
if (bestslidefrac > 0)
{
newx = FixedMul (mo->momx, bestslidefrac); newy = FixedMul (mo->momy, bestslidefrac);
if (!P_TryMove (mo, mo->x+newx, mo->y+newy)) goto stairstep;
}
//Now continue along the wall.
//First calculate remainder.
bestslidefrac = FRACUNIT-(bestslidefrac+0x800);
if (bestslidefrac > FRACUNIT) bestslidefrac = FRACUNIT;
if (bestslidefrac <= 0) return;
tmxmove = FixedMul (mo->momx, bestslidefrac); tmymove = FixedMul (mo->momy, bestslidefrac);