aboutsummaryrefslogtreecommitdiff
path: root/engines/avalanche/animation.h
blob: 73abadac2e2579853505f59b77bf7ef4a1046163 (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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
/* 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.
 *
 */

/*
 * This code is based on the original source code of Lord Avalot d'Argent version 1.3.
 * Copyright (c) 1994-1995 Mike, Mark and Thomas Thurman.
 */

/* Original name: TRIP5 / Trippancy V - the sprite animation subsystem */

#ifndef AVALANCHE_ANIMATION_H
#define AVALANCHE_ANIMATION_H

#include "avalanche/graphics.h"

#include "common/scummsys.h"
#include "common/str.h"

namespace Avalanche {
class AvalancheEngine;
class Animation;

struct StatType {
	Common::String _name; // Name of character.
	Common::String _comment; // Comment.
	byte _frameNum; // Number of pictures.
	byte _seq; // How many in one stride.
	byte _fgBubbleCol, _bgBubbleCol; // Foreground & background bubble colors.
	byte _acciNum; // The number according to Acci. (1=Avvy, etc.)
};

class AnimationType {
public:
	SpriteInfo _info;
	StatType _stat; // Vital statistics.
	byte _facingDir, _stepNum;
	int16 _x, _y; // Current xy coords.
	int16 _oldX[2], _oldY[2];  // Last xy coords.
	int8 _moveX, _moveY; // Amount to move sprite by, each step.
	byte _id;
	bool _quick, _visible, _homing, _doCheck;
	int16 _homingX, _homingY; // Homing x & y coords.
	byte _count; // Counts before changing step.
	byte _speedX, _speedY; // x & y speed.
	byte _animCount; // Total number of sprites.
	bool _vanishIfStill; // Do we show this sprite if it's still?
	bool _callEachStepFl; // Do we call the eachstep procedure?
	byte _eachStepProc;

	void init(byte spritenum, bool doCheck, Animation *anim); // Loads & sets up the sprite.
	void original(); // Just sets 'quick' to false.
	void draw(); // Drops sprite onto screen. Original: andexor().
	void turn(byte whichway); // Turns character round.
	void appear(int16 wx, int16 wy, byte wf); // Switches it on.
	void bounce(); // Bounces off walls.
	void walk(); // Prepares for andexor, etc.
	void walkTo(byte pednum); // Home in on a point.
	void stopHoming(); // Self-explanatory.
	void homeStep(); // Calculates ix & iy for one homing step.
	void setSpeed(int8 xx, int8 yy); // Sets ix & iy, non-homing, etc.
	void stopWalk(); // Stops the sprite from moving.
	void chatter();  // Sets up talk vars.
	void remove();

private:
	Animation *_anim;

	bool checkCollision();
	int8 getSign(int16 val);
};

class Animation {
public:
	friend class AnimationType;

	enum Direction {
		kDirUp, kDirRight, kDirDown, kDirLeft,
		kDirUpRight, kDirDownRight, kDirDownLeft, kDirUpLeft,
		kDirStopped
	};

	static const byte kSpriteNumbMax = 5; // current max no. of sprites

	enum Proc {
		kProcFollowAvvyY = 1,
		kProcBackAndForth,
		kProcFaceAvvy,
		kProcArrow,
		kProcSpludwick, // Unused
		kProcGrabAvvy,
		kProcGeida // Spludwick uses it as well for homing! TODO: Unify it with kProcSpludwick.
	};

	AnimationType _sprites[kSpriteNumbMax];
	bool _mustExclaim;
	uint16 _sayWhat;

	Animation(AvalancheEngine *vm);
	~Animation();

	void animLink();
	void loadAnims(); // Original: loadtrip().
	void callSpecial(uint16 which);
	void openDoor(byte whither, byte ped, byte magicnum); // Handles slidey-open doors.
	void catacombMove(byte ped); // When you enter a new position in the catacombs, this procedure should be called. It changes the 'also' codes so that they may match the picture on the screen.
	void stopWalking();
	void changeDirection(byte t, byte dir);
	void appearPed(byte trn, byte np);
	void flipRoom(byte room, byte ped);
	bool inField(byte which); // Returns true if you're within field "which".
	bool nearDoor(); // Returns True if you're near a door.
	void updateSpeed();
	void handleMoveKey(const Common::Event &event); // To replace tripkey().

private:
	AvalancheEngine *_vm;

	byte checkFeet(int16 x1, int16 x2, int16 oy, int16 y, byte yl);
	byte geidaPed(byte which);
	void dawnDelay();

	void grabAvvy(byte tripnum);
	void arrowProcs(byte tripnum);
	void hideInCupboard();

	// Different movements for NPCs:
	void followAvalotY(byte tripnum); // Original: follow_avvy_y().
	void backAndForth(byte tripnum);
	void faceAvvy(byte tripnum);
	
	// Movements for Homing NPCs: Spludwick and Geida.
	void spin(byte whichway, byte &tripnum);
	void takeAStep(byte &tripnum);
	void geidaProcs(byte tripnum);

	void drawSprites(); // Original: call_andexors().
};

} // End of namespace Avalanche.

#endif // AVALANCHE_ANIMATION_H