ScummVM API documentation
mortevielle.h
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 modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (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, see <http://www.gnu.org/licenses/>.
19 *
20 */
21
22/*
23 * This code is based on original Mortville Manor DOS source code
24 * Copyright (c) 1987-1989 Lankhor
25 */
26
27#ifndef MORTEVIELLE_MORTEVIELLE_H
28#define MORTEVIELLE_MORTEVIELLE_H
29
30#include "common/events.h"
31#include "common/file.h"
32#include "common/random.h"
33#include "common/rect.h"
34#include "common/stack.h"
35#include "engines/engine.h"
36#include "common/error.h"
37#include "graphics/surface.h"
38#include "mortevielle/debugger.h"
39#include "mortevielle/dialogs.h"
40#include "mortevielle/graphics.h"
41#include "mortevielle/menu.h"
42#include "mortevielle/mouse.h"
43#include "mortevielle/saveload.h"
44#include "mortevielle/sound.h"
45#include "mortevielle/outtext.h"
46#include "mortevielle/detection.h"
47
48namespace Mortevielle {
49
50// Debug channels
51enum {
52 kMortevielleCore = 1,
53 kMortevielleGraphics,
54 kMortevielleSounds,
55};
56
57// Game languages
58enum {
59 MORTDAT_LANG_FRENCH = 0,
60 MORTDAT_LANG_ENGLISH = 1,
61 MORTDAT_LANG_GERMAN = 2
62};
63
64// Static string list
65enum {
66 S_YES_NO = 0, S_GO_TO = 1, S_SOMEONE_ENTERS = 2, S_COOL = 3, S_LOURDE = 4,
67 S_MALSAINE = 5, S_IDEM = 6, S_YOU = 7, S_ARE = 8, S_ALONE = 9,
68 S_HEAR_NOISE = 10, S_SHOULD_HAVE_NOTICED = 11, S_NUMBER_OF_HINTS = 12,
69 S_WANT_TO_WAKE_UP = 13, S_OKAY = 14, S_SAVE_LOAD = 15, S_RESTART = 18, S_F3 = 19,
70 S_F8 = 20, S_HIDE_SELF = 21, S_TAKE = 22, S_PROBE = 23, S_RAISE = 24, S_SUITE = 25,
71 S_STOP = 26, S_USE_DEP_MENU = 27, S_LIFT = 28, S_READ = 29,
72 S_LOOK = 30, S_SEARCH = 31, S_OPEN = 32, S_PUT = 33, S_TURN = 34, S_TIE = 35, S_CLOSE = 36,
73 S_HIT = 37, S_POSE = 38, S_SMASH = 39,
74
75 S_SMELL = 40, S_SCRATCH = 41, S_PROBE2 = 42, S_BEFORE_USE_DEP_MENU = 43, S_DAY = 44
76};
77
78enum DataType {
79 kStaticStrings = 0,
80 kGameStrings = 1
81};
82
83#define SCREEN_WIDTH 640
84#define SCREEN_HEIGHT 400
85#define SCREEN_ORIG_HEIGHT 200
86#define MORT_DAT_REQUIRED_VERSION 1
87#define MORT_DAT "mort.dat"
88#define GAME_FRAME_DELAY (1000 / 50)
89#define DISK_ACCESS_DELAY 1000
90
91const int kTime1 = 410;
92const int kTime2 = 250;
93
94const int kAcha = 492;
95const int kFleche = 1758;
96
97const int kAsoul = 154;
98const int kAouvr = 282;
99const int kAsearch = 387;
100const int kArcf = 1272;
101const int kArep = 1314;
102const int kAmzon = 1650;
103const int kArega = 0;
104
105const int kMaxDialogIndex = 9000;
106const int kMaxDialogHint = 600;
107
108const int kDescriptionStringIndex = 0; // Unused
109const int kInventoryStringIndex = 186;
110const int kQuestionStringIndex = 247;
111const int kDialogStringIndex = 292;
112const int kMenuPlaceStringIndex = 435;
113const int kStartingScreenStringIndex = 456;
114const int kMenuActionStringIndex = 476;
115const int kMenuSelfStringIndex = 497;
116const int kMenuSayStringIndex = 502;
117const int kMaxPatt = 20;
118
119const int kResolutionScaler = 2;
120/*
12118 "It's already open$",
12226 "A photograph$"
123*/
124enum Places {
125 OWN_ROOM = 0, GREEN_ROOM = 1, PURPLE_ROOM = 2, TOILETS = 3, DARKBLUE_ROOM = 4,
126 BLUE_ROOM = 5, RED_ROOM = 6, BATHROOM = 7, GREEN_ROOM2 = 8, JULIA_ROOM = 9,
127 DINING_ROOM = 10, BUREAU = 11, KITCHEN = 12, ATTIC = 13, CELLAR = 14,
128 LANDING = 15, CRYPT = 16, SECRET_PASSAGE = 17, ROOM18 = 18, MOUNTAIN = 19,
129 CHAPEL = 20, MANOR_FRONT = 21, MANOR_BACK = 22, INSIDE_WELL = 23, WELL = 24,
130 DOOR = 25, ROOM26 = 26, COAT_ARMS = 27
131};
132
134 int _faithScore;
135 byte _pctHintFound[11];
136 byte _availableQuestion[43];
137 byte _inventory[31];
138 int _currPlace;
139 int _atticBallHoleObjectId;
140 int _atticRodHoleObjectId;
141 int _cellarObjectId;
142 int _secretPassageObjectId;
143 int _wellObjectId;
144 int _selectedObjectId;
145 int _purpleRoomObjectId;
146 int _cryptObjectId;
147 bool _alreadyEnteredManor;
148 byte _fullHour;
149};
150
151struct Hint {
152 int _hintId;
153 byte _point;
154};
155
156class MortevielleEngine : public Engine {
157private:
158 const MortevielleGameDescription *_gameDescription;
159 Common::Stack<int> _keypresses;
160 uint32 _lastGameFrame;
161 Common::Point _mousePos;
162 Common::StringArray _engineStrings;
163 Common::StringArray _gameStrings;
164
165 int _menuOpcode;
166
167 bool _inMainGameLoop; // Flag when the main game loop is active
168 bool _quitGame; // Quit game flag. Originally called 'arret'
169 bool _endGame; // End game flag. Originally called 'solu'
170 bool _loseGame; // Lose game flag. Originally called 'perdu'
171 bool _txxFileFl; // Flag used to determine if texts are from the original files or from a DAT file
172 bool _roomPresenceLuc;
173 bool _roomPresenceIda;
174 bool _purpleRoomPresenceLeo;
175 bool _roomPresenceGuy;
176 bool _roomPresenceEva;
177 bool _roomPresenceMax;
178 bool _roomPresenceBob;
179 bool _roomPresencePat;
180 bool _toiletsPresenceBobMax;
181 bool _bathRoomPresenceBobMax;
182 bool _juliaRoomPresenceLeo;
183 bool _hiddenHero;
184 bool _heroSearching;
185 bool _keyPressedEsc;
186 bool _reloadCFIEC;
187 bool _col;
188 bool _syn;
189 bool _obpart;
190 bool _anyone;
191 bool _uptodatePresence;
192
193 int _textColor;
194 int _place;
195 int _manorDistance;
196 int _currBitIndex;
197 int _currDay;
198 int _currHour;
199 int _currHalfHour;
200 int _day;
201 int _hour;
202 int _minute;
203 int _curSearchObjId;
204 int _controlMenu;
205 int _startTime;
206 int _endTime;
207 Common::Point _stdPal[91][17];
208
209 int _x26KeyCount;
210 int _roomDoorId;
211 int _openObjCount;
212 int _takeObjCount;
213 int _num;
214 int _searchCount;
215 bool _introSpeechPlayed;
216 int _inGameHourDuration;
217 int _x;
218 int _y;
219 int _currentHourCount;
220 int _currentTime;
221 int _pauseStartTime;
222
223 Common::String _hintPctMessage;
224 byte *_cfiecBuffer;
225 int _cfiecBufferSize;
226 int _openObjects[7];
227 uint16 _dialogIndexArray[kMaxDialogIndex + 1];
228 Hint _dialogHintArray[kMaxDialogHint + 1];
229
230 Common::ErrorCode initialize();
231 Common::ErrorCode loadMortDat();
232 void readStaticStrings(Common::File &f, int dataSize, DataType dataType);
233 void loadFont(Common::File &f);
234 bool handleEvents();
235 void addKeypress(Common::Event &evt);
236 void initMouse();
237 void showIntroduction();
238 void mainGame();
239 void playGame();
240 void handleAction();
241 void loadPalette();
242 void loadTexts();
243 void loadCFIEC();
244 void loadCFIPH();
245 void showTitleScreen();
246 int readclock();
247 void palette(int v1);
248 int checkLeoMaxRandomPresence();
249 void interactNPC();
250 void initCaveOrCellar();
251 void displayControlMenu();
252 void displayItemInHand(int objId);
253 void resetRoomVariables(int roomId);
254 int getPresenceStats(int &rand, int faithScore, int roomId);
255 void setPresenceFlags(int roomId);
256 void testKey(bool d);
257 void exitRoom();
258 void getReadDescription(int objId);
259 void getSearchDescription(int objId);
260 int checkLeaveSecretPassage();
261 void startDialog(int16 rep);
262 void endSearch();
263 int convertCharacterIndexToBitIndex(int characterIndex);
264 int convertBitIndexToCharacterIndex(int bitIndex);
265 void clearUpperLeftPart();
266 void clearDescriptionBar();
267 void clearVerbBar();
268 void clearUpperRightPart();
269 int getRandomNumber(int minval, int maxval);
270 void showMoveMenuAlert();
271 void showConfigScreen();
272 void decodeNumber(byte *pStart, int count);
273 void resetVariables();
274 void music();
275 void drawRightFrame();
276 void prepareRoom();
277 void drawClock();
278 void checkManorDistance();
279 void gotoManorFront();
280 void gotoManorBack();
281 void gotoDiningRoom();
282 bool checkInventory(int objectId);
283 void loseGame();
284 void floodedInWell();
285 void displayDiningRoom();
286 void startMusicOrSpeech(int so);
287 void setTextColor(int col);
288 void prepareScreenType1();
289 void prepareScreenType2();
290 void prepareScreenType3();
291 void updateHour(int &day, int &hour, int &minute);
292 void getKnockAnswer();
293 int getPresenceStatsGreenRoom();
294 int getPresenceStatsPurpleRoom();
295 int getPresenceStatsToilets();
296 int getPresenceStatsBlueRoom();
297 int getPresenceStatsRedRoom();
298 int getPresenceStatsDiningRoom(int &hour);
299 int getPresenceStatsBureau(int &hour);
300 int getPresenceStatsKitchen();
301 int getPresenceStatsAttic();
302 int getPresenceStatsLanding();
303 int getPresenceStatsChapel(int &hour);
304 int getPresenceBitIndex(int roomId);
305 void setPresenceGreenRoom(int roomId);
306 void setPresencePurpleRoom();
307 void setPresenceBlueRoom();
308 void setPresenceRedRoom(int roomId);
309 int setPresenceDiningRoom(int hour);
310 int setPresenceBureau(int hour);
311 int setPresenceKitchen();
312 int setPresenceLanding();
313 int setPresenceChapel(int hour);
314 void setRandomPresenceGreenRoom(int faithScore);
315 void setRandomPresencePurpleRoom(int faithScore);
316 void setRandomPresenceBlueRoom(int faithScore);
317 void setRandomPresenceRedRoom(int faithScore);
318 void setRandomPresenceJuliaRoom(int faithScore);
319 void setRandomPresenceDiningRoom(int faithScore);
320 void setRandomPresenceBureau(int faithScore);
321 void setRandomPresenceKitchen(int faithScore);
322 void setRandomPresenceAttic(int faithScore);
323 void setRandomPresenceLanding(int faithScore);
324 void setRandomPresenceChapel(int faithScore);
325 void loadPlaces();
326 void resetPresenceInRooms(int roomId);
327 void showPeoplePresent(int bitIndex);
328 int selectCharacters(int min, int max);
329 void fctMove();
330 void fctTake();
331 void fctInventoryTake();
332 void fctLift();
333 void fctRead();
334 void fctSelfRead();
335 void fctLook();
336 void fctSelftLook();
337 void fctSearch();
338 void fctSelfSearch();
339 void fctOpen();
340 void fctPlace();
341 void fctTurn();
342 void fctSelfHide();
343 void fctAttach();
344 void fctClose();
345 void fctKnock();
346 void fctSelfPut();
347 void fctListen();
348 void fctEat();
349 void fctEnter();
350 void fctSleep();
351 void fctForce();
352 void fctLeave();
353 void fctWait();
354 void fctSound();
355 void fctDiscuss();
356 void fctSmell();
357 void fctScratch();
358 void endGame();
359 void askRestart();
360 void handleOpcode();
361 void prepareDisplayText();
362 bool decryptNextChar(char &c, int &idx, byte &pt);
363 void displayStatusArrow();
364 void displayStatusInDescriptionBar(char stat);
365 void displayQuestionText(Common::String s, int cmd);
366 void displayTextInDescriptionBar(int x, int y, int nb, int mesgId);
367 void displayTextInVerbBar(Common::String text);
368 void displayTextBlock(Common::String text);
369 void mapMessageId(int &mesgId);
370 void resetOpenObjects();
371 void setCoordinates(int sx);
372 void drawPicture();
373 void drawPictureWithText();
374 void addObjectToInventory(int objectId);
375 void putInHand(int &objId);
376 void initMaxAnswer();
377 void displayAnimFrame(int frameNum, int animId);
378 int getFirstObject();
379 void prepareNextObject();
380 void putObject();
381 void resetObjectPlace();
382 void resetCoreVar();
383 void drawDiscussionBox();
384 void displayNarrativePicture(int af, int ob);
385 void menuUp();
386 void displayLookScreen(int objId);
387
388 void adzon();
389
390public:
391 Common::Point _prevPos;
392 int _currMenu;
393 int _currAction;
394 int _drawingSizeArr[108];
395 int _charAnswerCount[9];
396 int _charAnswerMax[9];
397 byte _tabdon[4001];
398 bool _soundOff;
399 bool _outsideOnlyFl;
400 bool _destinationOk;
401 bool _largestClearScreen;
402 float _addFix;
403 int _savedBitIndex;
404 int _numpal;
405 int _key;
406 bool _mouseClick;
407 SaveStruct _coreVar, _saveStruct;
408
409 int _maff;
410 int _caff;
411 int _crep;
412 int _is; // ???
413
414 byte _destinationArray[7][25];
415
416 byte *_curPict;
417 byte *_curAnim;
418 byte *_rightFramePict;
419
420 PaletteManager _paletteManager;
421 GfxSurface _backgroundSurface;
422 Common::RandomSource _randomSource;
423
424 ScreenSurface *_screenSurface;
425 SoundManager *_soundManager;
426 SavegameManager *_savegameManager;
427 Menu *_menu;
428 MouseHandler *_mouse;
429 TextHandler *_text;
430 DialogManager *_dialogManager;
431
432 MortevielleEngine(OSystem *system, const MortevielleGameDescription *gameDesc);
433 ~MortevielleEngine() override;
434 bool hasFeature(EngineFeature f) const override;
435 bool canLoadGameStateCurrently(Common::U32String *msg = nullptr) override;
436 bool canSaveGameStateCurrently(Common::U32String *msg = nullptr) override;
437 Common::Error loadGameState(int slot) override;
438 Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
439 Common::Error run() override;
440 void pauseEngineIntern(bool pause) override;
441 uint32 getGameFlags() const;
442 Common::Language getLanguage() const;
443 Common::Language getOriginalLanguage() const;
444 bool useOriginalData() const;
445 static Common::String generateSaveFilename(const Common::String &target, int slot);
446 Common::String getSaveStateName(int slot) const override {
447 return generateSaveFilename(_targetName, slot);
448 }
449
450 int getChar();
451 bool keyPressed();
452 Common::Point getMousePos() const { return _mousePos; }
453 void setMousePos(const Common::Point &pt);
454 bool getMouseClick() const { return _mouseClick; }
455 void setMouseClick(bool v) { _mouseClick = v; }
456 Common::String getEngineString(int idx) const { return _engineStrings[idx]; }
457 Common::String getGameString(int idx) const { return _gameStrings[idx]; }
458
459 void delay(int amount);
460 void gameLoaded();
461 void initGame();
462 void displayAloneText();
463 void displayInterScreenMessage(int mesgId);
464 void draw(int x, int y);
465 void charToHour();
466 void hourToChar();
467 Common::String getString(int num);
468 void setPal(int n);
469 Common::String copy(const Common::String &s, int idx, size_t size);
470 void testKeyboard();
471 int getPresence(int roomId);
472 void displayEmptyHand();
473 void displayPicture(const byte *pic, int x, int y);
474
475 int gettKeyPressed();
476 void handleDescriptionText(int f, int mesgId);
477 int getAnimOffset(int frameNum, int animNum);
478
479 void clearScreen();
480};
481
482extern MortevielleEngine *g_vm;
483
484} // End of namespace Mortevielle
485
486#endif
Definition: error.h:81
Definition: file.h:47
Definition: random.h:44
Definition: str.h:59
Definition: ustr.h:57
Definition: engine.h:149
const Common::String _targetName
Definition: engine.h:186
EngineFeature
Definition: engine.h:282
Definition: dialogs.h:44
Definition: graphics.h:50
Definition: menu.h:49
Definition: mortevielle.h:156
void pauseEngineIntern(bool pause) override
bool canSaveGameStateCurrently(Common::U32String *msg=nullptr) override
Common::Error run() override
Common::Error loadGameState(int slot) override
Common::String getSaveStateName(int slot) const override
Definition: mortevielle.h:446
bool canLoadGameStateCurrently(Common::U32String *msg=nullptr) override
bool hasFeature(EngineFeature f) const override
Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave=false) override
Definition: mouse.h:35
Definition: graphics.h:38
Definition: saveload.h:51
Definition: graphics.h:85
Definition: sound.h:58
Definition: outtext.h:35
Definition: system.h:166
ErrorCode
Definition: error.h:47
Language
Definition: language.h:45
Definition: events.h:218
Definition: rect.h:144
Definition: mortevielle.h:151
Definition: detection.h:36
Definition: mortevielle.h:133