//************************************************************************** //** //** ## ## ## ## ## #### #### ### ### //** ## ## ## ## ## ## ## ## ## ## #### #### //** ## ## ## ## ## ## ## ## ## ## ## ## ## ## //** ## ## ######## ## ## ## ## ## ## ## ### ## //** ### ## ## ### ## ## ## ## ## ## //** # ## ## # #### #### ## ## //** //** $Id: PolyobjDoor.vc 1744 2006-10-01 12:40:46Z dj_jl $ //** //** Copyright (C) 1999-2006 Jānis Legzdiņš //** //** This program is free software; you can redistribute it and/or //** modify it under the terms of the GNU General Public License //** as published by the Free Software Foundation; either version 2 //** of the License, or (at your option) any later version. //** //** This program is distributed in the hope that it will be useful, //** but WITHOUT ANY WARRANTY; without even the implied warranty of //** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //** GNU General Public License for more details. //** //************************************************************************** class PolyobjDoor : PolyobjThinker; enum { PODOOR_NONE, PODOOR_SLIDE, PODOOR_SWING }; int type; int polyobj; float speed; float dist; float xSpeed; // for sliding walls float ySpeed; float totalDist; float time; float waitTime; bool bClose; //========================================================================== // // Tick // //========================================================================== void Tick(float deltaTime) { polyobj_t *poly; float move; if (time) { time -= deltaTime; if (time <= 0.0) { time = 0.0; poly = XLevel.GetPolyobj(polyobj); PolyobjStartSequence(poly, GetSeqTrans(poly->seqType, SEQ_Door), 0); } return; } switch (type) { case PODOOR_SLIDE: move = speed * deltaTime; if (fabs(move) > dist) { move = (move < 0.0 ? -1.0 : 1.0) * dist; } if (XLevel.MovePolyobj(polyobj, move * xSpeed, move * ySpeed)) { dist -= fabs(move); if (dist <= 0.0) { poly = XLevel.GetPolyobj(polyobj); PolyobjStopSequence(poly); if (!bClose) { dist = totalDist; bClose = true; time = waitTime; xSpeed = -xSpeed; ySpeed = -ySpeed; } else { if (poly->SpecialData == self) { poly->SpecialData = none; } Destroy(); } } } else { poly = XLevel.GetPolyobj(polyobj); if (poly->bCrush || !bClose) { // continue moving if the poly is a crusher, or is opening return; } else { // open back up dist = totalDist - dist; xSpeed = -xSpeed; ySpeed = -ySpeed; bClose = false; PolyobjStartSequence(poly, GetSeqTrans(poly->seqType, SEQ_Door), 0); } } break; case PODOOR_SWING: move = speed * deltaTime; if (fabs(move) > dist) { move = (move < 0.0 ? -1.0 : 1.0) * dist; } if (XLevel.RotatePolyobj(polyobj, move)) { dist -= fabs(move); if (dist <= 0.0) { poly = XLevel.GetPolyobj(polyobj); PolyobjStopSequence(poly); if (!bClose) { dist = totalDist; bClose = true; time = waitTime; speed = -speed; } else { if (poly->SpecialData == self) { poly->SpecialData = none; } Destroy(); } } } else { poly = XLevel.GetPolyobj(polyobj); if (poly->bCrush || !bClose) { // continue moving if the poly is a crusher, or is opening return; } else { // open back up and rewait dist = totalDist - dist; speed = -speed; bClose = false; PolyobjStartSequence(poly, GetSeqTrans(poly->seqType, SEQ_Door), 0); } } break; default: break; } } defaultproperties { }