aboutsummaryrefslogtreecommitdiff
path: root/engines/avalanche/avalanche.h
blob: cc9a34d82b397873037874639ab64b7f1d99a135 (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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
/* 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.
 */

#ifndef AVALANCHE_AVALANCHE_H
#define AVALANCHE_AVALANCHE_H

#include "avalanche/console.h"
#include "avalanche/graphics.h"
#include "avalanche/parser.h"
#include "avalanche/avalot.h"
#include "avalanche/pingo.h"
#include "avalanche/dialogs.h"
#include "avalanche/background.h"
#include "avalanche/sequence.h"
#include "avalanche/timer.h"
#include "avalanche/animation.h"
#include "avalanche/menu.h"
#include "avalanche/closing.h"
#include "avalanche/sound.h"

#include "common/serializer.h"

#include "engines/engine.h"
#include "engines/advancedDetector.h"

#include "graphics/cursorman.h"

namespace Common {
class RandomSource;
}

namespace Avalanche {

struct AvalancheGameDescription;

static const int kSavegameVersion = 1;

enum Pitch {
	kPitchInvalid,
	kPitchLower,
	kPitchSame,
	kPitchHigher
};

class AvalancheEngine : public Engine {
public:
	byte _saveNum; // number of times this game has been saved

	Clock *_clock;
	GraphicManager *_graphics;
	Parser *_parser;
	Pingo *_pingo;
	Dialogs *_dialogs;
	Background *_background;
	Sequence *_sequence;
	Timer *_timer;
	Animation *_animation;
	Menu *_menu;
	Closing *_closing;
	SoundHandler *_sound;

	OSystem *_system;

	AvalancheEngine(OSystem *syst, const AvalancheGameDescription *gd);
	~AvalancheEngine();

	Common::ErrorCode initialize();
	GUI::Debugger *getDebugger();

	Common::RandomSource *_rnd;

	const AvalancheGameDescription *_gameDescription;
	uint32 getFeatures() const;
	const char *getGameId() const;
	Common::Platform getPlatform() const;
	bool hasFeature(EngineFeature f) const;
	const char *getCopyrightString() const;

	void synchronize(Common::Serializer &sz);
	virtual bool canSaveGameStateCurrently();
	Common::Error saveGameState(int slot, const Common::String &desc);
	bool saveGame(const int16 slot, const Common::String &desc);
	Common::String getSaveFileName(const int slot);
	virtual bool canLoadGameStateCurrently();
	Common::Error loadGameState(int slot);
	bool loadGame(const int16 slot);
	Common::String expandDate(int d, int m, int y);

	void updateEvents();
	bool getEvent(Common::Event &event); // A wrapper around _eventMan->pollEvent(), so we can use it in Scrolls::normscroll() for example.
	Common::Point getMousePos();

protected:
	// Engine APIs
	Common::Error run();

private:
	AvalancheConsole *_console;
	Common::Platform _platform;

#if 0
	struct {
		byte _operation;
		uint16 _skellern;
		byte _contents[1000];
	} _storage;

	static const int16 kRunShootemup = 1, kRunDosshell = 2, kRunGhostroom = 3, kRunGolden = 4;
	static const int16 kReset = 0;

	static const bool kJsb = true, kNoJsb = false, kBflight = true, kNoBflight = false;

	// From bootstrp:
	enum Elm {kNormal, kMusical, kElmpoyten, kRegi};

	Common::String _argsWithNoFilename;
	byte _originalMode;
	byte *_old1c;
	Common::String _segofs;
	int32 _soundcard, _speed, _baseaddr, _irq, _dma;
	bool _zoomy;

	void run(Common::String what, bool withJsb, bool withBflight, Elm how);
	void bFlightOn();
	void bFlightOff();
	Common::String elmToStr(Elm how);
	bool keyPressed();
	void flushBuffer();
	void dosShell();
	void bFlight();
	Common::String commandCom();
	void explain(byte error);
	void cursorOff();
	void cursorOn();
	void quit();
#endif

public:
	// For Thinkabout:
	static const bool kThing = true;
	static const bool kPerson = false;

	static const char kSpludwicksOrder[3];

	static const uint16 kNotes[12];
	static const TuneType kTune;

	bool _holdLeftMouse;

	// If this is greater than zero, the next line you type is stored in the DNA in a position dictated by the value.
	// If a scroll comes up, or you leave the room, it's automatically set to zero.
	byte _interrogation;

	// Former DNA structure
	byte _carryNum; // How many objects you're carrying...
	bool _objects[kObjectNum]; // ...and which ones they are.
	int16 _dnascore; // your score, of course
	int32 _money; // your current amount of dosh
	Room _room; // your current room
	bool _wonNim; // Have you *won* Nim? (That's harder.)
	byte _wineState; // 0=good (Notts), 1=passable(Argent) ... 3=vinegar.
	bool _cwytalotGone; // Has Cwytalot rushed off to Jerusalem yet?
	byte _passwordNum; // Number of the passw for this game.
	bool _aylesIsAwake; // pretty obvious!
	byte _drawbridgeOpen; // Between 0 (shut) and 4 (open).
	byte _avariciusTalk; // How much Avaricius has said to you.
	bool _rottenOnion; // And has it rotted?
	bool _onionInVinegar; // Is the onion in the vinegar?
	byte _givenToSpludwick; // 0 = nothing given, 1 = onion...
	byte _brummieStairs; // Progression through the stairs trick.
	byte _cardiffQuestionNum; // Things you get asked in Cardiff.
	bool _avvyIsAwake; // Well? Is Avvy awake? (Screen 1 only.)
	bool _avvyInBed; // True if Avvy's in bed, but awake.
	bool _userMovesAvvy; // If this is false, the user has no control over Avvy's movements.
	byte _npcFacing; // If there's an NPC in the current room which turns it's head according to Avvy's movement (keep looking at him), this variable tells which way it's facing at the moment.
	bool _givenBadgeToIby; // Have you given the badge to Iby yet?
	bool _friarWillTieYouUp; // If you're going to get tied up.
	bool _tiedUp; // You ARE tied up!
	byte _boxContent; // 0 = money (sixpence), 254 = empty, any other number implies the contents of the box.
	bool _talkedToCrapulus; // Pretty self-explanatory.
	byte _jacquesState; // 0=asleep, 1=awake, 2=gets up, 3=gone.
	bool _bellsAreRinging; // Is Jacques ringing the bells?
	bool _standingOnDais; // In room 71, inside Cardiff Castle.
	bool _takenPen; // Have you taken the pen (in Cardiff?)
	bool _arrowInTheDoor;  // Did the arrow hit the wall?
	Common::String _favouriteDrink, _favouriteSong, _worstPlaceOnEarth, _spareEvening; // Personalisation str's
	uint32 _totalTime; // Your total time playing this game, in ticks.
	byte _jumpStatus; // Fixes how high you're jumping.
	bool _mushroomGrowing; // Is the mushroom growing in 42?
	bool _crapulusWillTell; // Will Crapulus tell you about Spludwick being away?
	bool _enterCatacombsFromLustiesRoom;
	bool _teetotal; // Are we touching any more drinks?
	byte _malagauche; // Position of Malagauche. See Celer for more info.
	char _drinking; // What's he getting you?
	bool _enteredLustiesRoomAsMonk;
	byte _catacombX, _catacombY;   // XY coords in the catacombs.
	bool _avvysInTheCupboard; // On screen 22.
	bool _geidaFollows; // Is Geida following you?
	bool _givenPotionToGeida; // Does Geida have the potion?
	bool _lustieIsAsleep; // Is BDL asleep?
	bool _beenTiedUp; // In r__Robins.
	bool _sittingInPub; // Are you sitting down in the pub?
	byte _spurgeTalkCount; // Count for talking to Spurge.
	bool _metAvaroid;
	bool _takenMushroom, _givenPenToAyles, _askedDogfoodAboutNim;
	// End of former DNA Structure

	bool _showDebugLines;
	byte _lineNum; // Number of lines.
	LineType _lines[50]; // For Also.
	bool _dropsOk;
	bool _cheat; // CHECKME: Currently unused
	bool _letMeOut;
	byte _thinks;
	bool _thinkThing;
	bool _seeScroll; // TODO: maybe this means we're interacting with the toolbar / a scroll?
	char _objectList[10];
	// Called .free() for them in ~Gyro().

	byte _currentMouse; // current mouse-void
	Common::String *_also[31][2];
	PedType _peds[15];
	MagicType _magics[15];
	MagicType _portals[7];
	FieldType _fields[30];
	byte _fieldNum;
	Common::String _listen;
	byte _cp, _ledStatus;
	FontType _font;
	bool _alive;
	byte _subjectNum; // The same thing.
	People _him, _her;
	byte _it;
	uint32 _roomTime; // Set to 0 when you enter a room, added to in every loop.

	bool _doingSpriteRun; // Only set to True if we're doing a sprite_run at this moment. This stops the trippancy system from moving any of the sprites.
	bool _isLoaded; // Is it a loaded gamestate?
	bool _soundFx;

	void callVerb(VerbCode id);
	void loadRoom(byte num);
	void thinkAbout(byte object, bool type); // Hey!!! Get it and put it!!!
	void incScore(byte num); // Add on no. of points
	void fxToggle();
	void refreshObjectList();
	void errorLed();
	void fadeOut();
	void fadeIn();
	void drawDirection(); // Draws the little icon at the left end of the text input field.
	void gameOver();
	uint16 bearing(byte whichPed); // Returns the bearing from ped 'whichped' to Avvy, in degrees.

	// There are two kinds of redraw: Major and Minor. Minor is what happens when you load a game, etc. Major redraws EVERYTHING.
	void minorRedraw();
	void majorRedraw();

	void spriteRun();

	Common::String intToStr(int32 num);
	void newGame(); // This sets up the DNA for a completely new game.
	bool getFlag(char x);
	bool decreaseMoney(uint16 amount); // Called pennycheck in the original.
	
	Common::String getName(People whose);
	Common::String getItem(byte which); // Called get_better in the original.
	Common::String f5Does(); // This procedure determines what f5 does.

	void openDoor(Room whither, byte ped, byte magicnum); // Handles slidey-open doors.
	void flipRoom(Room room, byte ped);

	void setRoom(People persId, Room roomId);
	Room getRoom(People persId);
private:
	static const int16 kMaxSprites = 2; // Current max no. of sprites.
	static Room _whereIs[29];

	// Will be used in dusk() and dawn().
	bool _fxHidden;
	byte _fxPal[16][16][3];

	bool _spludwickAtHome; // Is Spludwick at home?
	bool _passedCwytalotInHerts; // Have you passed Cwytalot in Herts?
	bool _holdTheDawn; // If this is true, calling Dawn will do nothing. It's used, for example, at the start, to stop Load from dawning.
	byte _lastRoom;
	byte _lastRoomNotMap;
	byte _roomCount[100]; // Add one to each every time you enter a room
	Common::String _mouseText;
	Common::String _flags;
	Common::String _roomnName; // Name of actual room
	int8 _scoreToDisplay[3];

	Common::String readAlsoStringFromFile(Common::File &file);
	void runAvalot();
	void init();
	void setup();
	void scram(Common::String &str);
	void unScramble();
	void handleKeyDown(Common::Event &event); // To replace Basher::keyboard_link() and Basher::typein().
	void enterNewTown();
	void findPeople(byte room);
	void putGeidaAt(byte whichPed, byte ped);
	void guideAvvy(Common::Point cursorPos);
	void enterRoom(Room room, byte ped);
	void exitRoom(byte x);
	void drawToolbar();
	void drawScore();
	void useCompass(const Common::Point &cursorPos); // Click on the compass on the toolbar to control Avvy's movement.
	void checkClick();
	void fixFlashers();
	void loadAlso(byte num);
	void resetVariables();
};

} // End of namespace Avalanche

#endif // AVALANCHE_AVALANCHE_H