aboutsummaryrefslogtreecommitdiff
path: root/engines/queen/walk.h
diff options
context:
space:
mode:
Diffstat (limited to 'engines/queen/walk.h')
-rw-r--r--engines/queen/walk.h144
1 files changed, 144 insertions, 0 deletions
diff --git a/engines/queen/walk.h b/engines/queen/walk.h
new file mode 100644
index 0000000000..02c8264db9
--- /dev/null
+++ b/engines/queen/walk.h
@@ -0,0 +1,144 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2003-2006 The ScummVM project
+ *
+ * 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.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#ifndef QUEENWALK_H
+#define QUEENWALK_H
+
+#include "common/util.h"
+#include "queen/structs.h"
+
+namespace Queen {
+
+struct MovePersonAnim {
+ int16 firstFrame;
+ int16 lastFrame;
+ Direction facing;
+
+ void set(int16 ff, int16 lf, Direction dir) {
+ firstFrame = ff;
+ lastFrame = lf;
+ facing = dir;
+ }
+};
+
+struct WalkData {
+ int16 dx, dy;
+ const Area *area;
+ uint16 areaNum;
+ MovePersonAnim anim;
+};
+
+struct MovePersonData {
+ const char *name;
+ int16 walkLeft1, walkLeft2;
+ int16 walkRight1, walkRight2;
+ int16 walkBack1, walkBack2;
+ int16 walkFront1, walkFront2;
+ uint16 frontStandingFrame;
+ uint16 backStandingFrame;
+ uint16 animSpeed;
+ uint16 moveSpeed;
+};
+
+class QueenEngine;
+
+class Walk {
+public:
+
+ Walk(QueenEngine *vm);
+
+ int16 moveJoe(int direction, int16 endx, int16 endy, bool inCutaway);
+ int16 movePerson(const Person *pp, int16 endx, int16 endy, uint16 curImage, int direction);
+
+ void stopJoe();
+ void stopPerson(uint16 bobNum);
+
+ enum {
+ MAX_WALK_DATA = 16
+ };
+
+private:
+
+ void animateJoePrepare();
+ void animateJoe();
+
+ void animatePersonPrepare(const MovePersonData *mpd, int direction);
+ void animatePerson(const MovePersonData *mpd, uint16 image, uint16 bobNum, uint16 bankNum, int direction);
+
+ //! compute transition coordinate
+ static int16 calcC(int16 c1, int16 c2, int16 c3, int16 c4, int16 lastc);
+
+ //! find area for position
+ int16 findAreaPosition(int16 *x, int16 *y, bool recalibrate);
+
+ //! find an area not already struck
+ uint16 findFreeArea(uint16 area) const;
+
+ //! return true if the area is already on the walking path
+ bool isAreaStruck(uint16 area) const;
+
+ //! calculates the path list from oldArea to newArea
+ bool calcPath(uint16 oldArea, uint16 newArea);
+
+ //! resets path computed in calcPath()
+ void initWalkData();
+
+ //! add an area to the path
+ void incWalkData(int16 px, int16 py, int16 x, int16 y, uint16 area);
+
+ //! compute path (and populates _walkData) from current position to the new one
+ bool calc(uint16 oldPos, uint16 newPos, int16 oldx, int16 oldy, int16 x, int16 y);
+
+
+ //! areas for current room
+ const Area *_roomArea;
+
+ //! number of areas for current room
+ uint16 _roomAreaCount;
+
+ //! walking steps
+ WalkData _walkData[MAX_WALK_DATA];
+
+ //! number of walking steps
+ uint16 _walkDataCount;
+
+ uint16 _areaStrike[MAX_WALK_DATA];
+ uint16 _areaStrikeCount;
+
+ uint16 _areaList[MAX_WALK_DATA];
+ uint16 _areaListCount;
+
+ //! set if stopJoe() is called
+ bool _joeInterrupted;
+
+ //! set if handleSpecialArea() is called
+ bool _joeMoveBlock;
+
+ QueenEngine *_vm;
+
+ //! persons walking animation data
+ static const MovePersonData _moveData[];
+};
+
+} // End of namespace Queen
+
+#endif