aboutsummaryrefslogtreecommitdiff
path: root/engines/gnap/character.h
blob: 27e98be15c156a9ffac4587e2d15fe410249f3ad (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
145
146
/* 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 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.
 *
 */

#ifndef GNAP_CHARACTER_H
#define GNAP_CHARACTER_H

namespace Gnap {

class GnapEngine;

enum Facing {
	kDirIdleLeft = 0,
	kDirBottomRight = 1,
	kDirBottomLeft = 3,
	kDirIdleRight = 4,
	kDirUpLeft = 5,
	kDirUpRight = 7
};

struct GridStruct {
	int _deltaX, _deltaY;
	int _gridX1, _gridY1;
	int _sequenceId;
	int _id;
};

const int kMaxGridStructs = 30;

class Character {
public:
	Character(GnapEngine *vm);
	virtual ~Character();

	void walkStep();

	virtual int getSequenceId(int kind, Common::Point gridPos) = 0;
	virtual void playSequence(int sequenceId) = 0;
	virtual void updateIdleSequence() = 0;
	virtual void updateIdleSequence2() = 0;
	virtual void initPos(int gridX, int gridY, Facing facing) = 0;
	virtual int getWalkSequenceId(int deltaX, int deltaY) = 0;
	virtual bool walkTo(Common::Point gridPos, int animationIndex, int sequenceId, int flags) = 0;

	Common::Point _pos;
	Facing _idleFacing;
	int _actionStatus;
	int _sequenceId;
	int _sequenceDatNum;
	int _id;
	int _gridX;
	int _gridY;
	int _walkNodesCount;
	GridStruct _walkNodes[kMaxGridStructs];
	int _walkDestX, _walkDestY;
	int _walkDeltaX, _walkDeltaY, _walkDirX, _walkDirY, _walkDirXIncr, _walkDirYIncr;

protected:
	GnapEngine *_vm;
};

class PlayerGnap : public Character {
public:
	PlayerGnap(GnapEngine *vm);
	virtual int getSequenceId(int kind, Common::Point gridPos);
	virtual void initPos(int gridX, int gridY, Facing facing);
	virtual void playSequence(int sequenceId);
	virtual void updateIdleSequence();
	virtual void updateIdleSequence2();
	virtual int getWalkSequenceId(int deltaX, int deltaY);
	virtual bool walkTo(Common::Point gridPos, int animationIndex, int sequenceId, int flags);

	void actionIdle(int sequenceId);
	bool doPlatypusAction(int gridX, int gridY, int platSequenceId, int callback);
	int getShowSequenceId(int index, int gridX, int gridY);
	Facing getWalkFacing(int deltaX, int deltaY);
	int getWalkStopSequenceId(int deltaX, int deltaY);
	void idle();
	void initBrainPulseRndValue();
	void kissPlatypus(int callback);
	void playBrainPulsating(Common::Point gridPos = Common::Point(0, 0));
	void playIdle(Common::Point gridPos = Common::Point(0, 0));
	void playImpossible(Common::Point gridPos = Common::Point(0, 0));
	void playMoan1(Common::Point gridPos = Common::Point(0, 0));
	void playMoan2(Common::Point gridPos = Common::Point(0, 0));
	void playPullOutDevice(Common::Point gridPos = Common::Point(0, 0));
	void playPullOutDeviceNonWorking(Common::Point gridPos = Common::Point(0, 0));
	void playScratchingHead(Common::Point gridPos = Common::Point(0, 0));
	void playShowCurrItem(Common::Point destPos, int gridLookX, int gridLookY);
	void playShowItem(int itemIndex, int gridLookX, int gridLookY);
	void playUseDevice(Common::Point gridPos = Common::Point(0, 0));
	void useDeviceOnPlatypus();
	void useDisguiseOnPlatypus();
	void useJointOnPlatypus();

	int _brainPulseNum;
	int _brainPulseRndValue;

private:
	bool findPath1(int gridX, int gridY, int index);
	bool findPath2(int gridX, int gridY, int index);
	bool findPath3(int gridX, int gridY);
	bool findPath4(int gridX, int gridY);
};

class PlayerPlat : public Character {
public:
	PlayerPlat(GnapEngine *vm);
	virtual ~PlayerPlat() {}
	virtual int getSequenceId(int kind = 0, Common::Point gridPos = Common::Point(0, 0));
	virtual void initPos(int gridX, int gridY, Facing facing);
	virtual void playSequence(int sequenceId);
	virtual void updateIdleSequence();
	virtual void updateIdleSequence2();
	virtual int getWalkSequenceId(int deltaX, int deltaY);
	virtual bool walkTo(Common::Point gridPos, int animationIndex, int sequenceId, int flags);

	void makeRoom();

private:
	bool findPath1(int gridX, int gridY, int index);
	bool findPath2(int gridX, int gridY, int index);
	bool findPath3(int gridX, int gridY);
	bool findPath4(int gridX, int gridY);
};
} // End of namespace Gnap

#endif // GNAP_CHARACTER_H