// // Move a plane (floor or ceiling) and check for crushing // [RH] Crush specifies the actual amount of crushing damage inflictable. // (Use -1 to prevent it from trying to crush) // dest is the desired d value for the plane // DMover::EResult DMover::MovePlane (fixed_t speed, fixed_t dest, int crush, int floorOrCeiling, int direction, bool hexencrush) { bool flag; fixed_t lastpos; fixed_t movedest; fixed_t move; //fixed_t destheight; //jff 02/04/98 used to keep floors/ceilings // from moving thru each other switch (floorOrCeiling) { case 0: // FLOOR lastpos = m_Sector->floorplane.d; switch (direction) { 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.d = dest; flag = P_ChangeSector (m_Sector, crush, move, 0, false); if (flag) { m_Sector->floorplane.d = 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; } else { if (!MoveAttached(crush, -speed, 0, true)) return crushed; m_Sector->floorplane.d = movedest; flag = P_ChangeSector (m_Sector, crush, -speed, 0, false); if (flag) { m_Sector->floorplane.d = 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 (); } } 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.a | m_Sector->ceilingplane.b | m_Sector->floorplane.a | m_Sector->floorplane.b) == 0 && (!(i_compatflags2 & COMPATF2_FLOORMOVE) && -dest > m_Sector->ceilingplane.d)) { dest = -m_Sector->ceilingplane.d; } 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.d = dest; flag = P_ChangeSector (m_Sector, crush, move, 0, false); if (flag) { m_Sector->floorplane.d = 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; } else { if (!MoveAttached(crush, speed, 0, true)) return crushed; m_Sector->floorplane.d = 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.d = 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 (); } break; } break; case 1: // CEILING lastpos = m_Sector->ceilingplane.d; 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.a | m_Sector->ceilingplane.b | m_Sector->floorplane.a | m_Sector->floorplane.b) == 0 && (!(i_compatflags2 & COMPATF2_FLOORMOVE) && dest < -m_Sector->floorplane.d)) { dest = -m_Sector->floorplane.d; } 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.d = dest; flag = P_ChangeSector (m_Sector, crush, move, 1, false); if (flag) { m_Sector->ceilingplane.d = 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.d = 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.d = 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.d = dest; flag = P_ChangeSector (m_Sector, crush, move, 1, false); if (flag) { m_Sector->ceilingplane.d = 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.d = movedest; flag = P_ChangeSector (m_Sector, crush, speed, 1, false); if (flag) { m_Sector->ceilingplane.d = 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; } break; } return ok; }
EMoveResult sector_t::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 = 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 > floorheight) ? dest : floorheight; if (!ceilingplane.isSlope() && !floorplane.isSlope() && !PortalIsLinked(sector_t::floor) && (!(i_compatflags2 & COMPATF2_FLOORMOVE) && dest < -floorplane.fD())) { dest = -floorplane.fD(); } movedest = ceilingplane.GetChangedHeight (-speed); if (movedest <= dest) { move = ceilingplane.HeightDiff (lastpos, dest); if (!MoveAttached(crush, move, 1, true)) return EMoveResult::crushed; ceilingplane.setD(dest); flag = P_ChangeSector (this, crush, move, 1, false); if (flag) { ceilingplane.setD(lastpos); P_ChangeSector (this, crush, -move, 1, true); MoveAttached(crush, -move, 1, false); } else { ChangePlaneTexZ(sector_t::ceiling, move); } return EMoveResult::pastdest; } else { if (!MoveAttached(crush, -speed, 1, true)) return EMoveResult::crushed; ceilingplane.setD(movedest); // COULD GET CRUSHED flag = P_ChangeSector (this, crush, -speed, 1, false); if (flag) { if (crush >= 0 && !hexencrush) { ChangePlaneTexZ(sector_t::ceiling, ceilingplane.HeightDiff (lastpos)); return EMoveResult::crushed; } ceilingplane.setD(lastpos); P_ChangeSector (this, crush, speed, 1, true); MoveAttached(crush, speed, 1, false); return EMoveResult::crushed; } ChangePlaneTexZ(sector_t::ceiling, ceilingplane.HeightDiff (lastpos)); } break; case 1: // UP movedest = ceilingplane.GetChangedHeight (speed); if (movedest >= dest) { move = ceilingplane.HeightDiff (lastpos, dest); if (!MoveAttached(crush, move, 1, true)) return EMoveResult::crushed; ceilingplane.setD(dest); flag = P_ChangeSector (this, crush, move, 1, false); if (flag) { ceilingplane.setD(lastpos); P_ChangeSector (this, crush, move, 1, true); MoveAttached(crush, move, 1, false); } else { ChangePlaneTexZ(sector_t::ceiling, move); } return EMoveResult::pastdest; } else { if (!MoveAttached(crush, speed, 1, true)) return EMoveResult::crushed; ceilingplane.setD(movedest); flag = P_ChangeSector (this, crush, speed, 1, false); if (flag) { ceilingplane.setD(lastpos); P_ChangeSector (this, crush, -speed, 1, true); MoveAttached(crush, -speed, 1, false); return EMoveResult::crushed; } ChangePlaneTexZ(sector_t::ceiling, ceilingplane.HeightDiff (lastpos)); } break; } return EMoveResult::ok; }