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