1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  *
21  */
22 
23 #ifndef GNAP_CHARACTER_H
24 #define GNAP_CHARACTER_H
25 
26 namespace Gnap {
27 
28 class GnapEngine;
29 
30 enum Facing {
31 	kDirIdleLeft = 0,
32 	kDirBottomRight = 1,
33 	kDirBottomLeft = 3,
34 	kDirIdleRight = 4,
35 	kDirUpLeft = 5,
36 	kDirUpRight = 7
37 };
38 
39 struct GridStruct {
40 	int _deltaX, _deltaY;
41 	int _gridX1, _gridY1;
42 	int _sequenceId;
43 	int _id;
44 };
45 
46 const int kMaxGridStructs = 30;
47 
48 class Character {
49 public:
50 	Character(GnapEngine *vm);
51 	virtual ~Character();
52 
53 	void walkStep();
54 
55 	virtual int getSequenceId(int kind, Common::Point gridPos) = 0;
56 	virtual void playSequence(int sequenceId) = 0;
57 	virtual void updateIdleSequence() = 0;
58 	virtual void updateIdleSequence2() = 0;
59 	virtual void initPos(int gridX, int gridY, Facing facing) = 0;
60 	virtual int getWalkSequenceId(int deltaX, int deltaY) = 0;
61 	virtual bool walkTo(Common::Point gridPos, int animationIndex, int sequenceId, int flags) = 0;
62 
63 	Common::Point _pos;
64 	Facing _idleFacing;
65 	int _actionStatus;
66 	int _sequenceId;
67 	int _sequenceDatNum;
68 	int _id;
69 	int _gridX;
70 	int _gridY;
71 	int _walkNodesCount;
72 	GridStruct _walkNodes[kMaxGridStructs];
73 	int _walkDestX, _walkDestY;
74 	int _walkDeltaX, _walkDeltaY, _walkDirX, _walkDirY, _walkDirXIncr, _walkDirYIncr;
75 
76 protected:
77 	GnapEngine *_vm;
78 };
79 
80 class PlayerGnap : public Character {
81 public:
82 	PlayerGnap(GnapEngine *vm);
83 	virtual int getSequenceId(int kind, Common::Point gridPos);
84 	virtual void initPos(int gridX, int gridY, Facing facing);
85 	virtual void playSequence(int sequenceId);
86 	virtual void updateIdleSequence();
87 	virtual void updateIdleSequence2();
88 	virtual int getWalkSequenceId(int deltaX, int deltaY);
89 	virtual bool walkTo(Common::Point gridPos, int animationIndex, int sequenceId, int flags);
90 
91 	void actionIdle(int sequenceId);
92 	bool doPlatypusAction(int gridX, int gridY, int platSequenceId, int callback);
93 	int getShowSequenceId(int index, int gridX, int gridY);
94 	Facing getWalkFacing(int deltaX, int deltaY);
95 	int getWalkStopSequenceId(int deltaX, int deltaY);
96 	void idle();
97 	void initBrainPulseRndValue();
98 	void kissPlatypus(int callback);
99 	void playBrainPulsating(Common::Point gridPos = Common::Point(0, 0));
100 	void playIdle(Common::Point gridPos = Common::Point(0, 0));
101 	void playImpossible(Common::Point gridPos = Common::Point(0, 0));
102 	void playMoan1(Common::Point gridPos = Common::Point(0, 0));
103 	void playMoan2(Common::Point gridPos = Common::Point(0, 0));
104 	void playPullOutDevice(Common::Point gridPos = Common::Point(0, 0));
105 	void playPullOutDeviceNonWorking(Common::Point gridPos = Common::Point(0, 0));
106 	void playScratchingHead(Common::Point gridPos = Common::Point(0, 0));
107 	void playShowCurrItem(Common::Point destPos, int gridLookX, int gridLookY);
108 	void playShowItem(int itemIndex, int gridLookX, int gridLookY);
109 	void playUseDevice(Common::Point gridPos = Common::Point(0, 0));
110 	void useDeviceOnPlatypus();
111 	void useDisguiseOnPlatypus();
112 	void useJointOnPlatypus();
113 
114 	int _brainPulseNum;
115 	int _brainPulseRndValue;
116 
117 private:
118 	bool findPath1(int gridX, int gridY, int index);
119 	bool findPath2(int gridX, int gridY, int index);
120 	bool findPath3(int gridX, int gridY);
121 	bool findPath4(int gridX, int gridY);
122 };
123 
124 class PlayerPlat : public Character {
125 public:
126 	PlayerPlat(GnapEngine *vm);
~PlayerPlat()127 	virtual ~PlayerPlat() {}
128 	virtual int getSequenceId(int kind = 0, Common::Point gridPos = Common::Point(0, 0));
129 	virtual void initPos(int gridX, int gridY, Facing facing);
130 	virtual void playSequence(int sequenceId);
131 	virtual void updateIdleSequence();
132 	virtual void updateIdleSequence2();
133 	virtual int getWalkSequenceId(int deltaX, int deltaY);
134 	virtual bool walkTo(Common::Point gridPos, int animationIndex, int sequenceId, int flags);
135 
136 	void makeRoom();
137 
138 private:
139 	bool findPath1(int gridX, int gridY, int index);
140 	bool findPath2(int gridX, int gridY, int index);
141 	bool findPath3(int gridX, int gridY);
142 	bool findPath4(int gridX, int gridY);
143 };
144 } // End of namespace Gnap
145 
146 #endif // GNAP_CHARACTER_H
147