aboutsummaryrefslogtreecommitdiff
path: root/queen/walk.h
blob: 02c8264db9d902f524248e949ea10912ac0503c4 (plain)
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
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