From 74c9a7bf67378e3ba32d64249b747607c2f44e7d Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 8 Apr 2016 13:08:08 +0200 Subject: [PATCH 1/4] - fixed angle calculation in AdjustPlayerAngle for portals. Normally this will adjust relative to the actual direction to the target, but with arbitrary portals that cannot be calculated so using the actual attack angle is the only option. --- src/g_hexen/a_fighterplayer.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/g_hexen/a_fighterplayer.cpp b/src/g_hexen/a_fighterplayer.cpp index 607a9a88a6..c8f3aa19f7 100644 --- a/src/g_hexen/a_fighterplayer.cpp +++ b/src/g_hexen/a_fighterplayer.cpp @@ -27,7 +27,11 @@ static FRandom pr_fpatk ("FPunchAttack"); void AdjustPlayerAngle (AActor *pmo, FTranslatedLineTarget *t) { - DAngle difference = deltaangle(pmo->Angles.Yaw, pmo->AngleTo(t->linetarget)); + // normally this will adjust relative to the actual direction to the target, + // but with arbitrary portals that cannot be calculated so using the actual + // attack angle is the only option. + DAngle atkangle = t->unlinked ? t->angleFromSource : pmo->AngleTo(t->linetarget); + DAngle difference = deltaangle(pmo->Angles.Yaw, atkangle); if (fabs(difference) > MAX_ANGLE_ADJUST) { if (difference > 0) From fb2234396c4b9139fa4e592f572c6e3647b1d7cc Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 8 Apr 2016 13:39:08 +0200 Subject: [PATCH 2/4] - split DSectorEffect::MovePlane into MoveFloor and MoveCeiling. What was the point of this strange setup anyway? MoveFloor and MoveCeiling were inlines calling the universal MovePlane, which had nothing better to do than a switch/case with two cases - floor and ceiling! --- src/dsectoreffect.cpp | 392 +++++++++++++++++++++--------------------- src/dsectoreffect.h | 22 +-- 2 files changed, 205 insertions(+), 209 deletions(-) diff --git a/src/dsectoreffect.cpp b/src/dsectoreffect.cpp index 50909764f4..b4e0777bbb 100644 --- a/src/dsectoreffect.cpp +++ b/src/dsectoreffect.cpp @@ -155,8 +155,7 @@ bool DMover::MoveAttached(int crush, double move, int floorOrCeiling, bool reset // (Use -1 to prevent it from trying to crush) // dest is the desired d value for the plane // -DMover::EResult DMover::MovePlane (double speed, double dest, int crush, - int floorOrCeiling, int direction, bool hexencrush) +DMover::EResult DMover::MoveFloor(double speed, double dest, int crush, int direction, bool hexencrush) { bool flag; double lastpos; @@ -164,227 +163,228 @@ DMover::EResult DMover::MovePlane (double speed, double dest, int crush, double move; //double destheight; //jff 02/04/98 used to keep floors/ceilings // from moving thru each other - switch (floorOrCeiling) + lastpos = m_Sector->floorplane.fD(); + switch (direction) { - case 0: - // FLOOR - lastpos = m_Sector->floorplane.fD(); - switch (direction) + case -1: + // DOWN + movedest = m_Sector->floorplane.GetChangedHeight(-speed); + if (movedest >= dest) { - case -1: - // DOWN - movedest = m_Sector->floorplane.GetChangedHeight (-speed); - if (movedest >= dest) + move = m_Sector->floorplane.HeightDiff(lastpos, dest); + + if (!MoveAttached(crush, move, 0, true)) return crushed; + + m_Sector->floorplane.setD(dest); + flag = P_ChangeSector(m_Sector, crush, move, 0, false); + if (flag) { - move = m_Sector->floorplane.HeightDiff (lastpos, dest); - - if (!MoveAttached(crush, move, 0, true)) return crushed; - - m_Sector->floorplane.setD(dest); - flag = P_ChangeSector (m_Sector, crush, move, 0, false); - if (flag) - { - m_Sector->floorplane.setD(lastpos); - P_ChangeSector (m_Sector, crush, -move, 0, true); - MoveAttached(crush, -move, 0, false); - } - else - { - m_Sector->ChangePlaneTexZ(sector_t::floor, move); - m_Sector->AdjustFloorClip (); - } - return pastdest; + m_Sector->floorplane.setD(lastpos); + P_ChangeSector(m_Sector, crush, -move, 0, true); + MoveAttached(crush, -move, 0, false); } else { - if (!MoveAttached(crush, -speed, 0, true)) return crushed; - - m_Sector->floorplane.setD(movedest); - - flag = P_ChangeSector (m_Sector, crush, -speed, 0, false); - if (flag) - { - m_Sector->floorplane.setD(lastpos); - P_ChangeSector (m_Sector, crush, speed, 0, true); - MoveAttached(crush, speed, 0, false); - return crushed; - } - else - { - m_Sector->ChangePlaneTexZ(sector_t::floor, m_Sector->floorplane.HeightDiff (lastpos)); - m_Sector->AdjustFloorClip (); - } + m_Sector->ChangePlaneTexZ(sector_t::floor, move); + m_Sector->AdjustFloorClip(); } - break; - - case 1: - // UP - // jff 02/04/98 keep floor from moving thru ceilings - // [RH] not so easy with arbitrary planes - //destheight = (dest < m_Sector->ceilingheight) ? dest : m_Sector->ceilingheight; - if (!m_Sector->ceilingplane.isSlope() && !m_Sector->floorplane.isSlope() && - (!(i_compatflags2 & COMPATF2_FLOORMOVE) && -dest > m_Sector->ceilingplane.fD())) + return pastdest; + } + else + { + if (!MoveAttached(crush, -speed, 0, true)) return crushed; + + m_Sector->floorplane.setD(movedest); + + flag = P_ChangeSector(m_Sector, crush, -speed, 0, false); + if (flag) { - dest = -m_Sector->ceilingplane.fD(); - } - - movedest = m_Sector->floorplane.GetChangedHeight (speed); - - if (movedest <= dest) - { - move = m_Sector->floorplane.HeightDiff (lastpos, dest); - - if (!MoveAttached(crush, move, 0, true)) return crushed; - - m_Sector->floorplane.setD(dest); - - flag = P_ChangeSector (m_Sector, crush, move, 0, false); - if (flag) - { - m_Sector->floorplane.setD(lastpos); - P_ChangeSector (m_Sector, crush, -move, 0, true); - MoveAttached(crush, -move, 0, false); - } - else - { - m_Sector->ChangePlaneTexZ(sector_t::floor, move); - m_Sector->AdjustFloorClip (); - } - return pastdest; + m_Sector->floorplane.setD(lastpos); + P_ChangeSector(m_Sector, crush, speed, 0, true); + MoveAttached(crush, speed, 0, false); + return crushed; } else { - if (!MoveAttached(crush, speed, 0, true)) return crushed; - - m_Sector->floorplane.setD(movedest); - - // COULD GET CRUSHED - flag = P_ChangeSector (m_Sector, crush, speed, 0, false); - if (flag) - { - if (crush >= 0 && !hexencrush) - { - m_Sector->ChangePlaneTexZ(sector_t::floor, m_Sector->floorplane.HeightDiff (lastpos)); - m_Sector->AdjustFloorClip (); - return crushed; - } - m_Sector->floorplane.setD(lastpos); - P_ChangeSector (m_Sector, crush, -speed, 0, true); - MoveAttached(crush, -speed, 0, false); - return crushed; - } - m_Sector->ChangePlaneTexZ(sector_t::floor, m_Sector->floorplane.HeightDiff (lastpos)); - m_Sector->AdjustFloorClip (); + m_Sector->ChangePlaneTexZ(sector_t::floor, m_Sector->floorplane.HeightDiff(lastpos)); + m_Sector->AdjustFloorClip(); } - break; } break; - - case 1: - // CEILING - lastpos = m_Sector->ceilingplane.fD(); - switch (direction) + + case 1: + // UP + // jff 02/04/98 keep floor from moving thru ceilings + // [RH] not so easy with arbitrary planes + //destheight = (dest < m_Sector->ceilingheight) ? dest : m_Sector->ceilingheight; + if (!m_Sector->ceilingplane.isSlope() && !m_Sector->floorplane.isSlope() && + (!(i_compatflags2 & COMPATF2_FLOORMOVE) && -dest > m_Sector->ceilingplane.fD())) { - case -1: - // DOWN - // jff 02/04/98 keep ceiling from moving thru floors - // [RH] not so easy with arbitrary planes - //destheight = (dest > m_Sector->floorheight) ? dest : m_Sector->floorheight; - if (!m_Sector->ceilingplane.isSlope() && !m_Sector->floorplane.isSlope() && - (!(i_compatflags2 & COMPATF2_FLOORMOVE) && dest < -m_Sector->floorplane.fD())) + dest = -m_Sector->ceilingplane.fD(); + } + + movedest = m_Sector->floorplane.GetChangedHeight(speed); + + if (movedest <= dest) + { + move = m_Sector->floorplane.HeightDiff(lastpos, dest); + + if (!MoveAttached(crush, move, 0, true)) return crushed; + + m_Sector->floorplane.setD(dest); + + flag = P_ChangeSector(m_Sector, crush, move, 0, false); + if (flag) { - dest = -m_Sector->floorplane.fD(); - } - movedest = m_Sector->ceilingplane.GetChangedHeight (-speed); - if (movedest <= dest) - { - move = m_Sector->ceilingplane.HeightDiff (lastpos, dest); - - if (!MoveAttached(crush, move, 1, true)) return crushed; - - m_Sector->ceilingplane.setD(dest); - flag = P_ChangeSector (m_Sector, crush, move, 1, false); - - if (flag) - { - m_Sector->ceilingplane.setD(lastpos); - P_ChangeSector (m_Sector, crush, -move, 1, true); - MoveAttached(crush, -move, 1, false); - } - else - { - m_Sector->ChangePlaneTexZ(sector_t::ceiling, move); - } - return pastdest; + m_Sector->floorplane.setD(lastpos); + P_ChangeSector(m_Sector, crush, -move, 0, true); + MoveAttached(crush, -move, 0, false); } else { - if (!MoveAttached(crush, -speed, 1, true)) return crushed; + m_Sector->ChangePlaneTexZ(sector_t::floor, move); + m_Sector->AdjustFloorClip(); + } + return pastdest; + } + else + { + if (!MoveAttached(crush, speed, 0, true)) return crushed; - m_Sector->ceilingplane.setD(movedest); + m_Sector->floorplane.setD(movedest); - // COULD GET CRUSHED - flag = P_ChangeSector (m_Sector, crush, -speed, 1, false); - if (flag) + // COULD GET CRUSHED + flag = P_ChangeSector(m_Sector, crush, speed, 0, false); + if (flag) + { + if (crush >= 0 && !hexencrush) { - if (crush >= 0 && !hexencrush) - { - m_Sector->ChangePlaneTexZ(sector_t::ceiling, m_Sector->ceilingplane.HeightDiff (lastpos)); - return crushed; - } - m_Sector->ceilingplane.setD(lastpos); - P_ChangeSector (m_Sector, crush, speed, 1, true); - MoveAttached(crush, speed, 1, false); + m_Sector->ChangePlaneTexZ(sector_t::floor, m_Sector->floorplane.HeightDiff(lastpos)); + m_Sector->AdjustFloorClip(); return crushed; } - m_Sector->ChangePlaneTexZ(sector_t::ceiling, m_Sector->ceilingplane.HeightDiff (lastpos)); + m_Sector->floorplane.setD(lastpos); + P_ChangeSector(m_Sector, crush, -speed, 0, true); + MoveAttached(crush, -speed, 0, false); + return crushed; } - break; - - case 1: - // UP - movedest = m_Sector->ceilingplane.GetChangedHeight (speed); - if (movedest >= dest) - { - move = m_Sector->ceilingplane.HeightDiff (lastpos, dest); - - if (!MoveAttached(crush, move, 1, true)) return crushed; - - m_Sector->ceilingplane.setD(dest); - - flag = P_ChangeSector (m_Sector, crush, move, 1, false); - if (flag) - { - m_Sector->ceilingplane.setD(lastpos); - P_ChangeSector (m_Sector, crush, move, 1, true); - MoveAttached(crush, move, 1, false); - } - else - { - m_Sector->ChangePlaneTexZ(sector_t::ceiling, move); - } - return pastdest; - } - else - { - if (!MoveAttached(crush, speed, 1, true)) return crushed; - - m_Sector->ceilingplane.setD(movedest); - - flag = P_ChangeSector (m_Sector, crush, speed, 1, false); - if (flag) - { - m_Sector->ceilingplane.setD(lastpos); - P_ChangeSector (m_Sector, crush, -speed, 1, true); - MoveAttached(crush, -speed, 1, false); - return crushed; - } - m_Sector->ChangePlaneTexZ(sector_t::ceiling, m_Sector->ceilingplane.HeightDiff (lastpos)); - } - break; + m_Sector->ChangePlaneTexZ(sector_t::floor, m_Sector->floorplane.HeightDiff(lastpos)); + m_Sector->AdjustFloorClip(); + } + break; + } + return ok; +} + +DMover::EResult DMover::MoveCeiling(double speed, double dest, int crush, int direction, bool hexencrush) +{ + bool flag; + double lastpos; + double movedest; + double move; + //double destheight; //jff 02/04/98 used to keep floors/ceilings + // from moving thru each other + + lastpos = m_Sector->ceilingplane.fD(); + switch (direction) + { + case -1: + // DOWN + // jff 02/04/98 keep ceiling from moving thru floors + // [RH] not so easy with arbitrary planes + //destheight = (dest > m_Sector->floorheight) ? dest : m_Sector->floorheight; + if (!m_Sector->ceilingplane.isSlope() && !m_Sector->floorplane.isSlope() && + (!(i_compatflags2 & COMPATF2_FLOORMOVE) && dest < -m_Sector->floorplane.fD())) + { + dest = -m_Sector->floorplane.fD(); + } + movedest = m_Sector->ceilingplane.GetChangedHeight (-speed); + if (movedest <= dest) + { + move = m_Sector->ceilingplane.HeightDiff (lastpos, dest); + + if (!MoveAttached(crush, move, 1, true)) return crushed; + + m_Sector->ceilingplane.setD(dest); + flag = P_ChangeSector (m_Sector, crush, move, 1, false); + + if (flag) + { + m_Sector->ceilingplane.setD(lastpos); + P_ChangeSector (m_Sector, crush, -move, 1, true); + MoveAttached(crush, -move, 1, false); + } + else + { + m_Sector->ChangePlaneTexZ(sector_t::ceiling, move); + } + return pastdest; + } + else + { + if (!MoveAttached(crush, -speed, 1, true)) return crushed; + + m_Sector->ceilingplane.setD(movedest); + + // COULD GET CRUSHED + flag = P_ChangeSector (m_Sector, crush, -speed, 1, false); + if (flag) + { + if (crush >= 0 && !hexencrush) + { + m_Sector->ChangePlaneTexZ(sector_t::ceiling, m_Sector->ceilingplane.HeightDiff (lastpos)); + return crushed; + } + m_Sector->ceilingplane.setD(lastpos); + P_ChangeSector (m_Sector, crush, speed, 1, true); + MoveAttached(crush, speed, 1, false); + return crushed; + } + m_Sector->ChangePlaneTexZ(sector_t::ceiling, m_Sector->ceilingplane.HeightDiff (lastpos)); + } + break; + + case 1: + // UP + movedest = m_Sector->ceilingplane.GetChangedHeight (speed); + if (movedest >= dest) + { + move = m_Sector->ceilingplane.HeightDiff (lastpos, dest); + + if (!MoveAttached(crush, move, 1, true)) return crushed; + + m_Sector->ceilingplane.setD(dest); + + flag = P_ChangeSector (m_Sector, crush, move, 1, false); + if (flag) + { + m_Sector->ceilingplane.setD(lastpos); + P_ChangeSector (m_Sector, crush, move, 1, true); + MoveAttached(crush, move, 1, false); + } + else + { + m_Sector->ChangePlaneTexZ(sector_t::ceiling, move); + } + return pastdest; + } + else + { + if (!MoveAttached(crush, speed, 1, true)) return crushed; + + m_Sector->ceilingplane.setD(movedest); + + flag = P_ChangeSector (m_Sector, crush, speed, 1, false); + if (flag) + { + m_Sector->ceilingplane.setD(lastpos); + P_ChangeSector (m_Sector, crush, -speed, 1, true); + MoveAttached(crush, -speed, 1, false); + return crushed; + } + m_Sector->ChangePlaneTexZ(sector_t::ceiling, m_Sector->ceilingplane.HeightDiff (lastpos)); } break; - } return ok; } diff --git a/src/dsectoreffect.h b/src/dsectoreffect.h index bbafd898d5..43ee32168a 100644 --- a/src/dsectoreffect.h +++ b/src/dsectoreffect.h @@ -31,28 +31,24 @@ protected: TObjPtr interpolation; private: bool MoveAttached(int crush, double move, int floorOrCeiling, bool resetfailed); - EResult MovePlane (double speed, double dest, int crush, int floorOrCeiling, int direction, bool hexencrush); protected: DMover (); void Serialize (FArchive &arc); void Destroy(); void StopInterpolation(bool force = false); - inline EResult MoveFloor (double speed, double dest, int crush, int direction, bool hexencrush) + EResult MoveFloor(double speed, double dest, int crush, int direction, bool hexencrush); + EResult MoveCeiling(double speed, double dest, int crush, int direction, bool hexencrush); + + inline EResult MoveFloor(double speed, double dest, int direction) { - return MovePlane (speed, dest, crush, 0, direction, hexencrush); + return MoveFloor(speed, dest, -1, direction, false); } - inline EResult MoveFloor (double speed, double dest, int direction) + + inline EResult MoveCeiling(double speed, double dest, int direction) { - return MovePlane (speed, dest, -1, 0, direction, false); - } - inline EResult MoveCeiling (double speed, double dest, int crush, int direction, bool hexencrush) - { - return MovePlane (speed, dest, crush, 1, direction, hexencrush); - } - inline EResult MoveCeiling (double speed, double dest, int direction) - { - return MovePlane (speed, dest, -1, 1, direction, false); + return MoveCeiling(speed, dest, -1, direction, false); } + }; class DMovingFloor : public DMover From e505bfd7a3c65716e87d8bdf80ad548d4e67d774 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 8 Apr 2016 13:59:03 +0200 Subject: [PATCH 3/4] - took EResult out of DMover and made it an enum class. --- src/dsectoreffect.cpp | 44 ++++++++++++++++++------------------ src/dsectoreffect.h | 9 ++++---- src/fragglescript/t_func.cpp | 4 ++-- src/p_ceiling.cpp | 8 +++---- src/p_doors.cpp | 12 +++++----- src/p_floor.cpp | 16 ++++++------- src/p_pillar.cpp | 8 +++---- src/p_plats.cpp | 10 ++++---- src/r_defs.h | 2 ++ 9 files changed, 57 insertions(+), 56 deletions(-) diff --git a/src/dsectoreffect.cpp b/src/dsectoreffect.cpp index b4e0777bbb..8cc8f4166c 100644 --- a/src/dsectoreffect.cpp +++ b/src/dsectoreffect.cpp @@ -155,7 +155,7 @@ bool DMover::MoveAttached(int crush, double move, int floorOrCeiling, bool reset // (Use -1 to prevent it from trying to crush) // dest is the desired d value for the plane // -DMover::EResult DMover::MoveFloor(double speed, double dest, int crush, int direction, bool hexencrush) +EMoveResult DMover::MoveFloor(double speed, double dest, int crush, int direction, bool hexencrush) { bool flag; double lastpos; @@ -173,7 +173,7 @@ DMover::EResult DMover::MoveFloor(double speed, double dest, int crush, int dire { move = m_Sector->floorplane.HeightDiff(lastpos, dest); - if (!MoveAttached(crush, move, 0, true)) return crushed; + if (!MoveAttached(crush, move, 0, true)) return EMoveResult::crushed; m_Sector->floorplane.setD(dest); flag = P_ChangeSector(m_Sector, crush, move, 0, false); @@ -188,11 +188,11 @@ DMover::EResult DMover::MoveFloor(double speed, double dest, int crush, int dire m_Sector->ChangePlaneTexZ(sector_t::floor, move); m_Sector->AdjustFloorClip(); } - return pastdest; + return EMoveResult::pastdest; } else { - if (!MoveAttached(crush, -speed, 0, true)) return crushed; + if (!MoveAttached(crush, -speed, 0, true)) return EMoveResult::crushed; m_Sector->floorplane.setD(movedest); @@ -202,7 +202,7 @@ DMover::EResult DMover::MoveFloor(double speed, double dest, int crush, int dire m_Sector->floorplane.setD(lastpos); P_ChangeSector(m_Sector, crush, speed, 0, true); MoveAttached(crush, speed, 0, false); - return crushed; + return EMoveResult::crushed; } else { @@ -229,7 +229,7 @@ DMover::EResult DMover::MoveFloor(double speed, double dest, int crush, int dire { move = m_Sector->floorplane.HeightDiff(lastpos, dest); - if (!MoveAttached(crush, move, 0, true)) return crushed; + if (!MoveAttached(crush, move, 0, true)) return EMoveResult::crushed; m_Sector->floorplane.setD(dest); @@ -245,11 +245,11 @@ DMover::EResult DMover::MoveFloor(double speed, double dest, int crush, int dire m_Sector->ChangePlaneTexZ(sector_t::floor, move); m_Sector->AdjustFloorClip(); } - return pastdest; + return EMoveResult::pastdest; } else { - if (!MoveAttached(crush, speed, 0, true)) return crushed; + if (!MoveAttached(crush, speed, 0, true)) return EMoveResult::crushed; m_Sector->floorplane.setD(movedest); @@ -261,22 +261,22 @@ DMover::EResult DMover::MoveFloor(double speed, double dest, int crush, int dire { m_Sector->ChangePlaneTexZ(sector_t::floor, m_Sector->floorplane.HeightDiff(lastpos)); m_Sector->AdjustFloorClip(); - return crushed; + return EMoveResult::crushed; } m_Sector->floorplane.setD(lastpos); P_ChangeSector(m_Sector, crush, -speed, 0, true); MoveAttached(crush, -speed, 0, false); - return crushed; + return EMoveResult::crushed; } m_Sector->ChangePlaneTexZ(sector_t::floor, m_Sector->floorplane.HeightDiff(lastpos)); m_Sector->AdjustFloorClip(); } break; } - return ok; + return EMoveResult::ok; } -DMover::EResult DMover::MoveCeiling(double speed, double dest, int crush, int direction, bool hexencrush) +EMoveResult DMover::MoveCeiling(double speed, double dest, int crush, int direction, bool hexencrush) { bool flag; double lastpos; @@ -303,7 +303,7 @@ DMover::EResult DMover::MoveCeiling(double speed, double dest, int crush, int di { move = m_Sector->ceilingplane.HeightDiff (lastpos, dest); - if (!MoveAttached(crush, move, 1, true)) return crushed; + if (!MoveAttached(crush, move, 1, true)) return EMoveResult::crushed; m_Sector->ceilingplane.setD(dest); flag = P_ChangeSector (m_Sector, crush, move, 1, false); @@ -318,11 +318,11 @@ DMover::EResult DMover::MoveCeiling(double speed, double dest, int crush, int di { m_Sector->ChangePlaneTexZ(sector_t::ceiling, move); } - return pastdest; + return EMoveResult::pastdest; } else { - if (!MoveAttached(crush, -speed, 1, true)) return crushed; + if (!MoveAttached(crush, -speed, 1, true)) return EMoveResult::crushed; m_Sector->ceilingplane.setD(movedest); @@ -333,12 +333,12 @@ DMover::EResult DMover::MoveCeiling(double speed, double dest, int crush, int di if (crush >= 0 && !hexencrush) { m_Sector->ChangePlaneTexZ(sector_t::ceiling, m_Sector->ceilingplane.HeightDiff (lastpos)); - return crushed; + return EMoveResult::crushed; } m_Sector->ceilingplane.setD(lastpos); P_ChangeSector (m_Sector, crush, speed, 1, true); MoveAttached(crush, speed, 1, false); - return crushed; + return EMoveResult::crushed; } m_Sector->ChangePlaneTexZ(sector_t::ceiling, m_Sector->ceilingplane.HeightDiff (lastpos)); } @@ -351,7 +351,7 @@ DMover::EResult DMover::MoveCeiling(double speed, double dest, int crush, int di { move = m_Sector->ceilingplane.HeightDiff (lastpos, dest); - if (!MoveAttached(crush, move, 1, true)) return crushed; + if (!MoveAttached(crush, move, 1, true)) return EMoveResult::crushed; m_Sector->ceilingplane.setD(dest); @@ -366,11 +366,11 @@ DMover::EResult DMover::MoveCeiling(double speed, double dest, int crush, int di { m_Sector->ChangePlaneTexZ(sector_t::ceiling, move); } - return pastdest; + return EMoveResult::pastdest; } else { - if (!MoveAttached(crush, speed, 1, true)) return crushed; + if (!MoveAttached(crush, speed, 1, true)) return EMoveResult::crushed; m_Sector->ceilingplane.setD(movedest); @@ -380,11 +380,11 @@ DMover::EResult DMover::MoveCeiling(double speed, double dest, int crush, int di m_Sector->ceilingplane.setD(lastpos); P_ChangeSector (m_Sector, crush, -speed, 1, true); MoveAttached(crush, -speed, 1, false); - return crushed; + return EMoveResult::crushed; } m_Sector->ChangePlaneTexZ(sector_t::ceiling, m_Sector->ceilingplane.HeightDiff (lastpos)); } break; } - return ok; + return EMoveResult::ok; } diff --git a/src/dsectoreffect.h b/src/dsectoreffect.h index 43ee32168a..62199fd1a8 100644 --- a/src/dsectoreffect.h +++ b/src/dsectoreffect.h @@ -27,7 +27,6 @@ class DMover : public DSectorEffect public: DMover (sector_t *sector); protected: - enum EResult { ok, crushed, pastdest }; TObjPtr interpolation; private: bool MoveAttached(int crush, double move, int floorOrCeiling, bool resetfailed); @@ -36,15 +35,15 @@ protected: void Serialize (FArchive &arc); void Destroy(); void StopInterpolation(bool force = false); - EResult MoveFloor(double speed, double dest, int crush, int direction, bool hexencrush); - EResult MoveCeiling(double speed, double dest, int crush, int direction, bool hexencrush); + EMoveResult MoveFloor(double speed, double dest, int crush, int direction, bool hexencrush); + EMoveResult MoveCeiling(double speed, double dest, int crush, int direction, bool hexencrush); - inline EResult MoveFloor(double speed, double dest, int direction) + inline EMoveResult MoveFloor(double speed, double dest, int direction) { return MoveFloor(speed, dest, -1, direction, false); } - inline EResult MoveCeiling(double speed, double dest, int direction) + inline EMoveResult MoveCeiling(double speed, double dest, int direction) { return MoveCeiling(speed, dest, -1, direction, false); } diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp index 41f740dda6..03a6bba23d 100644 --- a/src/fragglescript/t_func.cpp +++ b/src/fragglescript/t_func.cpp @@ -1545,7 +1545,7 @@ public: bool Move(double speed, double dest, int crush, int direction) { - bool res = DMover::crushed != MoveFloor(speed, dest, crush, direction, false); + bool res = EMoveResult::crushed != MoveFloor(speed, dest, crush, direction, false); Destroy(); m_Sector->floordata=NULL; StopInterpolation(true); @@ -1694,7 +1694,7 @@ public: bool Move(double speed, double dest, int crush, int direction) { - bool res = DMover::crushed != MoveCeiling(speed, dest, crush, direction, false); + bool res = EMoveResult::crushed != MoveCeiling(speed, dest, crush, direction, false); Destroy(); m_Sector->ceilingdata=NULL; StopInterpolation (true); diff --git a/src/p_ceiling.cpp b/src/p_ceiling.cpp index 00af933ef3..52ec02b2f8 100644 --- a/src/p_ceiling.cpp +++ b/src/p_ceiling.cpp @@ -127,7 +127,7 @@ void DCeiling::PlayCeilingSound () void DCeiling::Tick () { - EResult res; + EMoveResult res; switch (m_Direction) { @@ -138,7 +138,7 @@ void DCeiling::Tick () // UP res = MoveCeiling (m_Speed, m_TopHeight, m_Direction); - if (res == pastdest) + if (res == EMoveResult::pastdest) { switch (m_Type) { @@ -169,7 +169,7 @@ void DCeiling::Tick () // DOWN res = MoveCeiling (m_Speed, m_BottomHeight, m_Crush, m_Direction, m_CrushMode == ECrushMode::crushHexen); - if (res == pastdest) + if (res == EMoveResult::pastdest) { switch (m_Type) { @@ -198,7 +198,7 @@ void DCeiling::Tick () } else // ( res != pastdest ) { - if (res == crushed) + if (res == EMoveResult::crushed) { switch (m_Type) { diff --git a/src/p_doors.cpp b/src/p_doors.cpp index ba2fba399e..21419abb97 100644 --- a/src/p_doors.cpp +++ b/src/p_doors.cpp @@ -80,7 +80,7 @@ void DDoor::Serialize (FArchive &arc) void DDoor::Tick () { - EResult res; + EMoveResult res; // Adjust bottom height - but only if there isn't an active lift attached to the floor. if (m_Sector->floorplane.fD() != m_OldFloorDist) @@ -146,7 +146,7 @@ void DDoor::Tick () (m_Sector->ceilingplane.fD() + m_Sector->floorplane.fD()) / (m_TopDist + m_Sector->floorplane.fD())); } - if (res == pastdest) + if (res == EMoveResult::pastdest) { SN_StopSequence (m_Sector, CHAN_CEILING); switch (m_Type) @@ -166,7 +166,7 @@ void DDoor::Tick () break; } } - else if (res == crushed) + else if (res == EMoveResult::crushed) { switch (m_Type) { @@ -192,7 +192,7 @@ void DDoor::Tick () (m_Sector->ceilingplane.fD() + m_Sector->floorplane.fD()) / (m_TopDist + m_Sector->floorplane.fD())); } - if (res == pastdest) + if (res == EMoveResult::pastdest) { SN_StopSequence (m_Sector, CHAN_CEILING); switch (m_Type) @@ -212,7 +212,7 @@ void DDoor::Tick () break; } } - else if (res == crushed) + else if (res == EMoveResult::crushed) { switch (m_Type) { @@ -560,7 +560,7 @@ bool DAnimatedDoor::StartClosing () } double topdist = m_Sector->ceilingplane.fD(); - if (MoveCeiling (2048., m_BotDist, 0, -1, false) == crushed) + if (MoveCeiling (2048., m_BotDist, 0, -1, false) == EMoveResult::crushed) { return false; } diff --git a/src/p_floor.cpp b/src/p_floor.cpp index 9ad68c3b1f..110b2814d7 100644 --- a/src/p_floor.cpp +++ b/src/p_floor.cpp @@ -112,7 +112,7 @@ void DFloor::Serialize (FArchive &arc) void DFloor::Tick () { - EResult res; + EMoveResult res; // [RH] Handle resetting stairs if (m_Type == buildStair || m_Type == waitStair) @@ -146,7 +146,7 @@ void DFloor::Tick () res = MoveFloor (m_Speed, m_FloorDestDist, m_Crush, m_Direction, m_Hexencrush); - if (res == pastdest) + if (res == EMoveResult::pastdest) { SN_StopSequence (m_Sector, CHAN_FLOOR); @@ -898,7 +898,7 @@ void DElevator::Destroy() void DElevator::Tick () { - EResult res; + EMoveResult res; double oldfloor, oldceiling; @@ -908,10 +908,10 @@ void DElevator::Tick () if (m_Direction < 0) // moving down { res = MoveFloor (m_Speed, m_FloorDestDist, m_Direction); - if (res == ok || res == pastdest) + if (res == EMoveResult::ok || res == EMoveResult::pastdest) { res = MoveCeiling (m_Speed, m_CeilingDestDist, m_Direction); - if (res == crushed) + if (res == EMoveResult::crushed) { MoveFloor (m_Speed, oldfloor, -m_Direction); } @@ -920,17 +920,17 @@ void DElevator::Tick () else // up { res = MoveCeiling (m_Speed, m_CeilingDestDist, m_Direction); - if (res == ok || res == pastdest) + if (res == EMoveResult::ok || res == EMoveResult::pastdest) { res = MoveFloor (m_Speed, m_FloorDestDist, m_Direction); - if (res == crushed) + if (res == EMoveResult::crushed) { MoveCeiling (m_Speed, oldceiling, -m_Direction); } } } - if (res == pastdest) // if destination height acheived + if (res == EMoveResult::pastdest) // if destination height acheived { // make floor stop sound SN_StopSequence (m_Sector, CHAN_FLOOR); diff --git a/src/p_pillar.cpp b/src/p_pillar.cpp index da939abb0b..a21724945c 100644 --- a/src/p_pillar.cpp +++ b/src/p_pillar.cpp @@ -88,7 +88,7 @@ void DPillar::Serialize (FArchive &arc) void DPillar::Tick () { - int r, s; + EMoveResult r, s; double oldfloor, oldceiling; oldfloor = m_Sector->floorplane.fD(); @@ -105,18 +105,18 @@ void DPillar::Tick () s = MoveCeiling (m_CeilingSpeed, m_CeilingTarget, m_Crush, 1, m_Hexencrush); } - if (r == pastdest && s == pastdest) + if (r == EMoveResult::pastdest && s == EMoveResult::pastdest) { SN_StopSequence (m_Sector, CHAN_FLOOR); Destroy (); } else { - if (r == crushed) + if (r == EMoveResult::crushed) { MoveFloor (m_FloorSpeed, oldfloor, -1, -1, m_Hexencrush); } - if (s == crushed) + if (s == EMoveResult::crushed) { MoveCeiling (m_CeilingSpeed, oldceiling, -1, 1, m_Hexencrush); } diff --git a/src/p_plats.cpp b/src/p_plats.cpp index 7d2754d2c7..b90372b460 100644 --- a/src/p_plats.cpp +++ b/src/p_plats.cpp @@ -94,20 +94,20 @@ void DPlat::PlayPlatSound (const char *sound) // void DPlat::Tick () { - EResult res; + EMoveResult res; switch (m_Status) { case up: res = MoveFloor (m_Speed, m_High, m_Crush, 1, false); - if (res == crushed && (m_Crush == -1)) + if (res == EMoveResult::crushed && (m_Crush == -1)) { m_Count = m_Wait; m_Status = down; PlayPlatSound ("Platform"); } - else if (res == pastdest) + else if (res == EMoveResult::pastdest) { SN_StopSequence (m_Sector, CHAN_FLOOR); if (m_Type != platToggle) @@ -146,7 +146,7 @@ void DPlat::Tick () case down: res = MoveFloor (m_Speed, m_Low, -1, -1, false); - if (res == pastdest) + if (res == EMoveResult::pastdest) { SN_StopSequence (m_Sector, CHAN_FLOOR); // if not an instant toggle, start waiting @@ -172,7 +172,7 @@ void DPlat::Tick () m_Status = in_stasis; //for reactivation of toggle } } - else if (res == crushed && m_Crush < 0 && m_Type != platToggle) + else if (res == EMoveResult::crushed && m_Crush < 0 && m_Type != platToggle) { m_Status = up; m_Count = m_Wait; diff --git a/src/r_defs.h b/src/r_defs.h index 6b2aa79a3c..6eda369533 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -616,6 +616,8 @@ struct secspecial_t FArchive &operator<< (FArchive &arc, secspecial_t &p); +enum class EMoveResult { ok, crushed, pastdest }; + struct sector_t { // Member functions From 8535a973cf3e905e5229a3db94d5d8737d67218f Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 8 Apr 2016 14:18:46 +0200 Subject: [PATCH 4/4] - made MoveAttached, MoveCeiling and MoveFloor members of sector_t instead of DMover. - call MoveFloor and MoveCeiling directly in FS's floorheight and ceilingheight functions and remove the dummy thinkers it had to use before. --- src/dsectoreffect.cpp | 146 +++++++++++++++++------------------ src/dsectoreffect.h | 14 ---- src/fragglescript/t_func.cpp | 55 ++----------- src/p_ceiling.cpp | 4 +- src/p_doors.cpp | 12 +-- src/p_floor.cpp | 14 ++-- src/p_pillar.cpp | 12 +-- src/p_plats.cpp | 4 +- src/r_defs.h | 17 ++++ 9 files changed, 119 insertions(+), 159 deletions(-) diff --git a/src/dsectoreffect.cpp b/src/dsectoreffect.cpp index 8cc8f4166c..499eb96c8d 100644 --- a/src/dsectoreffect.cpp +++ b/src/dsectoreffect.cpp @@ -133,17 +133,17 @@ DMovingCeiling::DMovingCeiling (sector_t *sector) interpolation = sector->SetInterpolation(sector_t::CeilingMove, true); } -bool DMover::MoveAttached(int crush, double move, int floorOrCeiling, bool resetfailed) +bool sector_t::MoveAttached(int crush, double move, int floorOrCeiling, bool resetfailed) { - if (!P_Scroll3dMidtex(m_Sector, crush, move, !!floorOrCeiling) && resetfailed) + if (!P_Scroll3dMidtex(this, crush, move, !!floorOrCeiling) && resetfailed) { - P_Scroll3dMidtex(m_Sector, crush, -move, !!floorOrCeiling); + P_Scroll3dMidtex(this, crush, -move, !!floorOrCeiling); return false; } - if (!P_MoveLinkedSectors(m_Sector, crush, move, !!floorOrCeiling) && resetfailed) + if (!P_MoveLinkedSectors(this, crush, move, !!floorOrCeiling) && resetfailed) { - P_MoveLinkedSectors(m_Sector, crush, -move, !!floorOrCeiling); - P_Scroll3dMidtex(m_Sector, crush, -move, !!floorOrCeiling); + P_MoveLinkedSectors(this, crush, -move, !!floorOrCeiling); + P_Scroll3dMidtex(this, crush, -move, !!floorOrCeiling); return false; } return true; @@ -155,7 +155,7 @@ bool DMover::MoveAttached(int crush, double move, int floorOrCeiling, bool reset // (Use -1 to prevent it from trying to crush) // dest is the desired d value for the plane // -EMoveResult DMover::MoveFloor(double speed, double dest, int crush, int direction, bool hexencrush) +EMoveResult sector_t::MoveFloor(double speed, double dest, int crush, int direction, bool hexencrush) { bool flag; double lastpos; @@ -163,30 +163,30 @@ EMoveResult DMover::MoveFloor(double speed, double dest, int crush, int directio double move; //double destheight; //jff 02/04/98 used to keep floors/ceilings // from moving thru each other - lastpos = m_Sector->floorplane.fD(); + lastpos = floorplane.fD(); switch (direction) { case -1: // DOWN - movedest = m_Sector->floorplane.GetChangedHeight(-speed); + movedest = floorplane.GetChangedHeight(-speed); if (movedest >= dest) { - move = m_Sector->floorplane.HeightDiff(lastpos, dest); + move = floorplane.HeightDiff(lastpos, dest); if (!MoveAttached(crush, move, 0, true)) return EMoveResult::crushed; - m_Sector->floorplane.setD(dest); - flag = P_ChangeSector(m_Sector, crush, move, 0, false); + floorplane.setD(dest); + flag = P_ChangeSector(this, crush, move, 0, false); if (flag) { - m_Sector->floorplane.setD(lastpos); - P_ChangeSector(m_Sector, crush, -move, 0, true); + floorplane.setD(lastpos); + P_ChangeSector(this, crush, -move, 0, true); MoveAttached(crush, -move, 0, false); } else { - m_Sector->ChangePlaneTexZ(sector_t::floor, move); - m_Sector->AdjustFloorClip(); + ChangePlaneTexZ(sector_t::floor, move); + AdjustFloorClip(); } return EMoveResult::pastdest; } @@ -194,20 +194,20 @@ EMoveResult DMover::MoveFloor(double speed, double dest, int crush, int directio { if (!MoveAttached(crush, -speed, 0, true)) return EMoveResult::crushed; - m_Sector->floorplane.setD(movedest); + floorplane.setD(movedest); - flag = P_ChangeSector(m_Sector, crush, -speed, 0, false); + flag = P_ChangeSector(this, crush, -speed, 0, false); if (flag) { - m_Sector->floorplane.setD(lastpos); - P_ChangeSector(m_Sector, crush, speed, 0, true); + floorplane.setD(lastpos); + P_ChangeSector(this, crush, speed, 0, true); MoveAttached(crush, speed, 0, false); return EMoveResult::crushed; } else { - m_Sector->ChangePlaneTexZ(sector_t::floor, m_Sector->floorplane.HeightDiff(lastpos)); - m_Sector->AdjustFloorClip(); + ChangePlaneTexZ(sector_t::floor, floorplane.HeightDiff(lastpos)); + AdjustFloorClip(); } } break; @@ -216,34 +216,34 @@ EMoveResult DMover::MoveFloor(double speed, double dest, int crush, int directio // UP // jff 02/04/98 keep floor from moving thru ceilings // [RH] not so easy with arbitrary planes - //destheight = (dest < m_Sector->ceilingheight) ? dest : m_Sector->ceilingheight; - if (!m_Sector->ceilingplane.isSlope() && !m_Sector->floorplane.isSlope() && - (!(i_compatflags2 & COMPATF2_FLOORMOVE) && -dest > m_Sector->ceilingplane.fD())) + //destheight = (dest < ceilingheight) ? dest : ceilingheight; + if (!ceilingplane.isSlope() && !floorplane.isSlope() && + (!(i_compatflags2 & COMPATF2_FLOORMOVE) && -dest > ceilingplane.fD())) { - dest = -m_Sector->ceilingplane.fD(); + dest = -ceilingplane.fD(); } - movedest = m_Sector->floorplane.GetChangedHeight(speed); + movedest = floorplane.GetChangedHeight(speed); if (movedest <= dest) { - move = m_Sector->floorplane.HeightDiff(lastpos, dest); + move = floorplane.HeightDiff(lastpos, dest); if (!MoveAttached(crush, move, 0, true)) return EMoveResult::crushed; - m_Sector->floorplane.setD(dest); + floorplane.setD(dest); - flag = P_ChangeSector(m_Sector, crush, move, 0, false); + flag = P_ChangeSector(this, crush, move, 0, false); if (flag) { - m_Sector->floorplane.setD(lastpos); - P_ChangeSector(m_Sector, crush, -move, 0, true); + floorplane.setD(lastpos); + P_ChangeSector(this, crush, -move, 0, true); MoveAttached(crush, -move, 0, false); } else { - m_Sector->ChangePlaneTexZ(sector_t::floor, move); - m_Sector->AdjustFloorClip(); + ChangePlaneTexZ(sector_t::floor, move); + AdjustFloorClip(); } return EMoveResult::pastdest; } @@ -251,32 +251,32 @@ EMoveResult DMover::MoveFloor(double speed, double dest, int crush, int directio { if (!MoveAttached(crush, speed, 0, true)) return EMoveResult::crushed; - m_Sector->floorplane.setD(movedest); + floorplane.setD(movedest); // COULD GET CRUSHED - flag = P_ChangeSector(m_Sector, crush, speed, 0, false); + flag = P_ChangeSector(this, crush, speed, 0, false); if (flag) { if (crush >= 0 && !hexencrush) { - m_Sector->ChangePlaneTexZ(sector_t::floor, m_Sector->floorplane.HeightDiff(lastpos)); - m_Sector->AdjustFloorClip(); + ChangePlaneTexZ(sector_t::floor, floorplane.HeightDiff(lastpos)); + AdjustFloorClip(); return EMoveResult::crushed; } - m_Sector->floorplane.setD(lastpos); - P_ChangeSector(m_Sector, crush, -speed, 0, true); + floorplane.setD(lastpos); + P_ChangeSector(this, crush, -speed, 0, true); MoveAttached(crush, -speed, 0, false); return EMoveResult::crushed; } - m_Sector->ChangePlaneTexZ(sector_t::floor, m_Sector->floorplane.HeightDiff(lastpos)); - m_Sector->AdjustFloorClip(); + ChangePlaneTexZ(sector_t::floor, floorplane.HeightDiff(lastpos)); + AdjustFloorClip(); } break; } return EMoveResult::ok; } -EMoveResult DMover::MoveCeiling(double speed, double dest, int crush, int direction, bool hexencrush) +EMoveResult sector_t::MoveCeiling(double speed, double dest, int crush, int direction, bool hexencrush) { bool flag; double lastpos; @@ -285,38 +285,38 @@ EMoveResult DMover::MoveCeiling(double speed, double dest, int crush, int direct //double destheight; //jff 02/04/98 used to keep floors/ceilings // from moving thru each other - lastpos = m_Sector->ceilingplane.fD(); + lastpos = ceilingplane.fD(); switch (direction) { case -1: // DOWN // jff 02/04/98 keep ceiling from moving thru floors // [RH] not so easy with arbitrary planes - //destheight = (dest > m_Sector->floorheight) ? dest : m_Sector->floorheight; - if (!m_Sector->ceilingplane.isSlope() && !m_Sector->floorplane.isSlope() && - (!(i_compatflags2 & COMPATF2_FLOORMOVE) && dest < -m_Sector->floorplane.fD())) + //destheight = (dest > floorheight) ? dest : floorheight; + if (!ceilingplane.isSlope() && !floorplane.isSlope() && + (!(i_compatflags2 & COMPATF2_FLOORMOVE) && dest < -floorplane.fD())) { - dest = -m_Sector->floorplane.fD(); + dest = -floorplane.fD(); } - movedest = m_Sector->ceilingplane.GetChangedHeight (-speed); + movedest = ceilingplane.GetChangedHeight (-speed); if (movedest <= dest) { - move = m_Sector->ceilingplane.HeightDiff (lastpos, dest); + move = ceilingplane.HeightDiff (lastpos, dest); if (!MoveAttached(crush, move, 1, true)) return EMoveResult::crushed; - m_Sector->ceilingplane.setD(dest); - flag = P_ChangeSector (m_Sector, crush, move, 1, false); + ceilingplane.setD(dest); + flag = P_ChangeSector (this, crush, move, 1, false); if (flag) { - m_Sector->ceilingplane.setD(lastpos); - P_ChangeSector (m_Sector, crush, -move, 1, true); + ceilingplane.setD(lastpos); + P_ChangeSector (this, crush, -move, 1, true); MoveAttached(crush, -move, 1, false); } else { - m_Sector->ChangePlaneTexZ(sector_t::ceiling, move); + ChangePlaneTexZ(sector_t::ceiling, move); } return EMoveResult::pastdest; } @@ -324,47 +324,47 @@ EMoveResult DMover::MoveCeiling(double speed, double dest, int crush, int direct { if (!MoveAttached(crush, -speed, 1, true)) return EMoveResult::crushed; - m_Sector->ceilingplane.setD(movedest); + ceilingplane.setD(movedest); // COULD GET CRUSHED - flag = P_ChangeSector (m_Sector, crush, -speed, 1, false); + flag = P_ChangeSector (this, crush, -speed, 1, false); if (flag) { if (crush >= 0 && !hexencrush) { - m_Sector->ChangePlaneTexZ(sector_t::ceiling, m_Sector->ceilingplane.HeightDiff (lastpos)); + ChangePlaneTexZ(sector_t::ceiling, ceilingplane.HeightDiff (lastpos)); return EMoveResult::crushed; } - m_Sector->ceilingplane.setD(lastpos); - P_ChangeSector (m_Sector, crush, speed, 1, true); + ceilingplane.setD(lastpos); + P_ChangeSector (this, crush, speed, 1, true); MoveAttached(crush, speed, 1, false); return EMoveResult::crushed; } - m_Sector->ChangePlaneTexZ(sector_t::ceiling, m_Sector->ceilingplane.HeightDiff (lastpos)); + ChangePlaneTexZ(sector_t::ceiling, ceilingplane.HeightDiff (lastpos)); } break; case 1: // UP - movedest = m_Sector->ceilingplane.GetChangedHeight (speed); + movedest = ceilingplane.GetChangedHeight (speed); if (movedest >= dest) { - move = m_Sector->ceilingplane.HeightDiff (lastpos, dest); + move = ceilingplane.HeightDiff (lastpos, dest); if (!MoveAttached(crush, move, 1, true)) return EMoveResult::crushed; - m_Sector->ceilingplane.setD(dest); + ceilingplane.setD(dest); - flag = P_ChangeSector (m_Sector, crush, move, 1, false); + flag = P_ChangeSector (this, crush, move, 1, false); if (flag) { - m_Sector->ceilingplane.setD(lastpos); - P_ChangeSector (m_Sector, crush, move, 1, true); + ceilingplane.setD(lastpos); + P_ChangeSector (this, crush, move, 1, true); MoveAttached(crush, move, 1, false); } else { - m_Sector->ChangePlaneTexZ(sector_t::ceiling, move); + ChangePlaneTexZ(sector_t::ceiling, move); } return EMoveResult::pastdest; } @@ -372,17 +372,17 @@ EMoveResult DMover::MoveCeiling(double speed, double dest, int crush, int direct { if (!MoveAttached(crush, speed, 1, true)) return EMoveResult::crushed; - m_Sector->ceilingplane.setD(movedest); + ceilingplane.setD(movedest); - flag = P_ChangeSector (m_Sector, crush, speed, 1, false); + flag = P_ChangeSector (this, crush, speed, 1, false); if (flag) { - m_Sector->ceilingplane.setD(lastpos); - P_ChangeSector (m_Sector, crush, -speed, 1, true); + ceilingplane.setD(lastpos); + P_ChangeSector (this, crush, -speed, 1, true); MoveAttached(crush, -speed, 1, false); return EMoveResult::crushed; } - m_Sector->ChangePlaneTexZ(sector_t::ceiling, m_Sector->ceilingplane.HeightDiff (lastpos)); + ChangePlaneTexZ(sector_t::ceiling, ceilingplane.HeightDiff (lastpos)); } break; } diff --git a/src/dsectoreffect.h b/src/dsectoreffect.h index 62199fd1a8..0423244161 100644 --- a/src/dsectoreffect.h +++ b/src/dsectoreffect.h @@ -29,25 +29,11 @@ public: protected: TObjPtr interpolation; private: - bool MoveAttached(int crush, double move, int floorOrCeiling, bool resetfailed); protected: DMover (); void Serialize (FArchive &arc); void Destroy(); void StopInterpolation(bool force = false); - EMoveResult MoveFloor(double speed, double dest, int crush, int direction, bool hexencrush); - EMoveResult MoveCeiling(double speed, double dest, int crush, int direction, bool hexencrush); - - inline EMoveResult MoveFloor(double speed, double dest, int direction) - { - return MoveFloor(speed, dest, -1, direction, false); - } - - inline EMoveResult MoveCeiling(double speed, double dest, int direction) - { - return MoveCeiling(speed, dest, -1, direction, false); - } - }; class DMovingFloor : public DMover diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp index 03a6bba23d..9bf043af73 100644 --- a/src/fragglescript/t_func.cpp +++ b/src/fragglescript/t_func.cpp @@ -1535,26 +1535,6 @@ void FParser::SF_StartSectorSound(void) } } -/************* Sector functions ***************/ - -class DFloorChanger : public DFloor -{ -public: - DFloorChanger(sector_t * sec) - : DFloor(sec) {} - - bool Move(double speed, double dest, int crush, int direction) - { - bool res = EMoveResult::crushed != MoveFloor(speed, dest, crush, direction, false); - Destroy(); - m_Sector->floordata=NULL; - StopInterpolation(true); - m_Sector=NULL; - return res; - } -}; - - //========================================================================== // // @@ -1588,12 +1568,12 @@ void FParser::SF_FloorHeight(void) { if (sectors[i].floordata) continue; // don't move floors that are active! - DFloorChanger * f = new DFloorChanger(§ors[i]); - if (!f->Move( + if (sectors[i].MoveFloor( fabs(dest - sectors[i].CenterFloor()), sectors[i].floorplane.PointToDist (sectors[i].centerspot, dest), crush? 10:-1, - (dest > sectors[i].CenterFloor()) ? 1 : -1)) + (dest > sectors[i].CenterFloor()) ? 1 : -1, + false) != EMoveResult::crushed) { returnval = 0; } @@ -1686,29 +1666,6 @@ void FParser::SF_MoveFloor(void) // //========================================================================== -class DCeilingChanger : public DCeiling -{ -public: - DCeilingChanger(sector_t * sec) - : DCeiling(sec) {} - - bool Move(double speed, double dest, int crush, int direction) - { - bool res = EMoveResult::crushed != MoveCeiling(speed, dest, crush, direction, false); - Destroy(); - m_Sector->ceilingdata=NULL; - StopInterpolation (true); - m_Sector=NULL; - return res; - } -}; - -//========================================================================== -// -// -// -//========================================================================== - // ceiling height of sector void FParser::SF_CeilingHeight(void) { @@ -1735,12 +1692,12 @@ void FParser::SF_CeilingHeight(void) { if (sectors[i].ceilingdata) continue; // don't move ceilings that are active! - DCeilingChanger * c = new DCeilingChanger(§ors[i]); - if (!c->Move( + if (sectors[i].MoveCeiling( fabs(dest - sectors[i].CenterCeiling()), sectors[i].ceilingplane.PointToDist (sectors[i].centerspot, dest), crush? 10:-1, - (dest > sectors[i].CenterCeiling()) ? 1 : -1)) + (dest > sectors[i].CenterCeiling()) ? 1 : -1, + false) != EMoveResult::crushed) { returnval = 0; } diff --git a/src/p_ceiling.cpp b/src/p_ceiling.cpp index 52ec02b2f8..9a506be29b 100644 --- a/src/p_ceiling.cpp +++ b/src/p_ceiling.cpp @@ -136,7 +136,7 @@ void DCeiling::Tick () break; case 1: // UP - res = MoveCeiling (m_Speed, m_TopHeight, m_Direction); + res = m_Sector->MoveCeiling (m_Speed, m_TopHeight, m_Direction); if (res == EMoveResult::pastdest) { @@ -167,7 +167,7 @@ void DCeiling::Tick () case -1: // DOWN - res = MoveCeiling (m_Speed, m_BottomHeight, m_Crush, m_Direction, m_CrushMode == ECrushMode::crushHexen); + res = m_Sector->MoveCeiling (m_Speed, m_BottomHeight, m_Crush, m_Direction, m_CrushMode == ECrushMode::crushHexen); if (res == EMoveResult::pastdest) { diff --git a/src/p_doors.cpp b/src/p_doors.cpp index 21419abb97..b122768bbc 100644 --- a/src/p_doors.cpp +++ b/src/p_doors.cpp @@ -137,7 +137,7 @@ void DDoor::Tick () case -1: // DOWN - res = MoveCeiling (m_Speed, m_BotDist, -1, m_Direction, false); + res = m_Sector->MoveCeiling (m_Speed, m_BotDist, -1, m_Direction, false); // killough 10/98: implement gradual lighting effects if (m_LightTag != 0 && m_TopDist != -m_Sector->floorplane.fD()) @@ -183,7 +183,7 @@ void DDoor::Tick () case 1: // UP - res = MoveCeiling (m_Speed, m_TopDist, -1, m_Direction, false); + res = m_Sector->MoveCeiling (m_Speed, m_TopDist, -1, m_Direction, false); // killough 10/98: implement gradual lighting effects if (m_LightTag != 0 && m_TopDist != -m_Sector->floorplane.fD()) @@ -560,12 +560,12 @@ bool DAnimatedDoor::StartClosing () } double topdist = m_Sector->ceilingplane.fD(); - if (MoveCeiling (2048., m_BotDist, 0, -1, false) == EMoveResult::crushed) + if (m_Sector->MoveCeiling (2048., m_BotDist, 0, -1, false) == EMoveResult::crushed) { return false; } - MoveCeiling (2048., topdist, 1); + m_Sector->MoveCeiling (2048., topdist, 1); m_Line1->flags |= ML_BLOCKING; m_Line2->flags |= ML_BLOCKING; @@ -650,7 +650,7 @@ void DAnimatedDoor::Tick () if (--m_Frame < 0) { // IF DOOR IS DONE CLOSING... - MoveCeiling (2048., m_BotDist, -1); + m_Sector->MoveCeiling (2048., m_BotDist, -1); m_Sector->ceilingdata = NULL; Destroy (); // Unset blocking flags on lines that didn't start with them. Since the @@ -734,7 +734,7 @@ DAnimatedDoor::DAnimatedDoor (sector_t *sec, line_t *line, int speed, int delay, m_Line1->flags |= ML_BLOCKING; m_Line2->flags |= ML_BLOCKING; m_BotDist = m_Sector->ceilingplane.fD(); - MoveCeiling (2048., topdist, 1); + m_Sector->MoveCeiling (2048., topdist, 1); if (m_DoorAnim->OpenSound != NAME_None) { SN_StartSequence (m_Sector, CHAN_INTERIOR, m_DoorAnim->OpenSound, 1); diff --git a/src/p_floor.cpp b/src/p_floor.cpp index 110b2814d7..7dc0f6e6e1 100644 --- a/src/p_floor.cpp +++ b/src/p_floor.cpp @@ -144,7 +144,7 @@ void DFloor::Tick () if (m_Type == waitStair) return; - res = MoveFloor (m_Speed, m_FloorDestDist, m_Crush, m_Direction, m_Hexencrush); + res = m_Sector->MoveFloor (m_Speed, m_FloorDestDist, m_Crush, m_Direction, m_Hexencrush); if (res == EMoveResult::pastdest) { @@ -907,25 +907,25 @@ void DElevator::Tick () if (m_Direction < 0) // moving down { - res = MoveFloor (m_Speed, m_FloorDestDist, m_Direction); + res = m_Sector->MoveFloor (m_Speed, m_FloorDestDist, m_Direction); if (res == EMoveResult::ok || res == EMoveResult::pastdest) { - res = MoveCeiling (m_Speed, m_CeilingDestDist, m_Direction); + res = m_Sector->MoveCeiling (m_Speed, m_CeilingDestDist, m_Direction); if (res == EMoveResult::crushed) { - MoveFloor (m_Speed, oldfloor, -m_Direction); + m_Sector->MoveFloor (m_Speed, oldfloor, -m_Direction); } } } else // up { - res = MoveCeiling (m_Speed, m_CeilingDestDist, m_Direction); + res = m_Sector->MoveCeiling (m_Speed, m_CeilingDestDist, m_Direction); if (res == EMoveResult::ok || res == EMoveResult::pastdest) { - res = MoveFloor (m_Speed, m_FloorDestDist, m_Direction); + res = m_Sector->MoveFloor (m_Speed, m_FloorDestDist, m_Direction); if (res == EMoveResult::crushed) { - MoveCeiling (m_Speed, oldceiling, -m_Direction); + m_Sector->MoveCeiling (m_Speed, oldceiling, -m_Direction); } } } diff --git a/src/p_pillar.cpp b/src/p_pillar.cpp index a21724945c..2a134cc50e 100644 --- a/src/p_pillar.cpp +++ b/src/p_pillar.cpp @@ -96,13 +96,13 @@ void DPillar::Tick () if (m_Type == pillarBuild) { - r = MoveFloor (m_FloorSpeed, m_FloorTarget, m_Crush, 1, m_Hexencrush); - s = MoveCeiling (m_CeilingSpeed, m_CeilingTarget, m_Crush, -1, m_Hexencrush); + r = m_Sector->MoveFloor (m_FloorSpeed, m_FloorTarget, m_Crush, 1, m_Hexencrush); + s = m_Sector->MoveCeiling (m_CeilingSpeed, m_CeilingTarget, m_Crush, -1, m_Hexencrush); } else { - r = MoveFloor (m_FloorSpeed, m_FloorTarget, m_Crush, -1, m_Hexencrush); - s = MoveCeiling (m_CeilingSpeed, m_CeilingTarget, m_Crush, 1, m_Hexencrush); + r = m_Sector->MoveFloor (m_FloorSpeed, m_FloorTarget, m_Crush, -1, m_Hexencrush); + s = m_Sector->MoveCeiling (m_CeilingSpeed, m_CeilingTarget, m_Crush, 1, m_Hexencrush); } if (r == EMoveResult::pastdest && s == EMoveResult::pastdest) @@ -114,11 +114,11 @@ void DPillar::Tick () { if (r == EMoveResult::crushed) { - MoveFloor (m_FloorSpeed, oldfloor, -1, -1, m_Hexencrush); + m_Sector->MoveFloor (m_FloorSpeed, oldfloor, -1, -1, m_Hexencrush); } if (s == EMoveResult::crushed) { - MoveCeiling (m_CeilingSpeed, oldceiling, -1, 1, m_Hexencrush); + m_Sector->MoveCeiling (m_CeilingSpeed, oldceiling, -1, 1, m_Hexencrush); } } } diff --git a/src/p_plats.cpp b/src/p_plats.cpp index b90372b460..55ba39fe54 100644 --- a/src/p_plats.cpp +++ b/src/p_plats.cpp @@ -99,7 +99,7 @@ void DPlat::Tick () switch (m_Status) { case up: - res = MoveFloor (m_Speed, m_High, m_Crush, 1, false); + res = m_Sector->MoveFloor (m_Speed, m_High, m_Crush, 1, false); if (res == EMoveResult::crushed && (m_Crush == -1)) { @@ -144,7 +144,7 @@ void DPlat::Tick () break; case down: - res = MoveFloor (m_Speed, m_Low, -1, -1, false); + res = m_Sector->MoveFloor (m_Speed, m_Low, -1, -1, false); if (res == EMoveResult::pastdest) { diff --git a/src/r_defs.h b/src/r_defs.h index 6eda369533..2b7b4a218f 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -621,6 +621,23 @@ enum class EMoveResult { ok, crushed, pastdest }; struct sector_t { // Member functions + +private: + bool MoveAttached(int crush, double move, int floorOrCeiling, bool resetfailed); +public: + EMoveResult MoveFloor(double speed, double dest, int crush, int direction, bool hexencrush); + EMoveResult MoveCeiling(double speed, double dest, int crush, int direction, bool hexencrush); + + inline EMoveResult MoveFloor(double speed, double dest, int direction) + { + return MoveFloor(speed, dest, -1, direction, false); + } + + inline EMoveResult MoveCeiling(double speed, double dest, int direction) + { + return MoveCeiling(speed, dest, -1, direction, false); + } + bool IsLinked(sector_t *other, bool ceiling) const; double FindLowestFloorSurrounding(vertex_t **v) const; double FindHighestFloorSurrounding(vertex_t **v) const;