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);
int getSequenceId(int kind, Common::Point gridPos) override;
void initPos(int gridX, int gridY, Facing facing) override;
void playSequence(int sequenceId) override;
void updateIdleSequence() override;
void updateIdleSequence2() override;
int getWalkSequenceId(int deltaX, int deltaY) override;
bool walkTo(Common::Point gridPos, int animationIndex, int sequenceId, int flags) override;
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);
~PlayerPlat() override {}
int getSequenceId(int kind = 0, Common::Point gridPos = Common::Point(0, 0)) override;
void initPos(int gridX, int gridY, Facing facing) override;
void playSequence(int sequenceId) override;
void updateIdleSequence() override;
void updateIdleSequence2() override;
int getWalkSequenceId(int deltaX, int deltaY) override;
bool walkTo(Common::Point gridPos, int animationIndex, int sequenceId, int flags) override;
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
|