1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* 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 3 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, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef QUEEN_WALK_H
#define QUEEN_WALK_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
|