/* 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 original Mortville Manor DOS source code * Copyright (c) 1987-1989 Lankhor */ #include "mortevielle/mortevielle.h" #include "mortevielle/dialogs.h" #include "mortevielle/menu.h" #include "mortevielle/mouse.h" #include "mortevielle/outtext.h" #include "common/scummsys.h" namespace Mortevielle { /** * Engine function - Move * @remarks Originally called 'taller' */ void MortevielleEngine::fctMove() { int oldMenu = (_menu->_moveMenu[6]._menuId << 8) | _menu->_moveMenu[6]._actionId; if ((_coreVar._currPlace == ROOM26) && (_currAction == oldMenu)) { _coreVar._currPlace = LANDING; _caff = _coreVar._currPlace; drawPictureWithText(); handleDescriptionText(2, _coreVar._currPlace); } if ((_coreVar._currPlace == LANDING) && (_currAction == oldMenu)) { if (!_syn) displayTextInVerbBar(getEngineString(S_GO_TO)); displayStatusArrow(); if (_keyPressedEsc) _destinationOk = false; if ((_anyone) || (_keyPressedEsc)) return; setCoordinates(1); if (_num == 0) return; if (_num == 1) { _coreVar._currPlace = OWN_ROOM; _menu->setDestinationText(OWN_ROOM); } else if (_num == 7) { _coreVar._currPlace = ATTIC; _menu->setDestinationText(ATTIC); } else if (_num != 6) _coreVar._currPlace = ROOM26; if ((_num > 1) && (_num < 6)) _roomDoorId = _num - 1; else if (_num > 7) _roomDoorId = _num - 3; if (_num != 6) prepareDisplayText(); else showMoveMenuAlert(); return; } exitRoom(); int menuChoice = 1; oldMenu = (_menu->_moveMenu[menuChoice]._menuId << 8) | _menu->_moveMenu[menuChoice]._actionId; while (oldMenu != _currAction) { ++menuChoice; oldMenu = (_menu->_moveMenu[menuChoice]._menuId << 8) | _menu->_moveMenu[menuChoice]._actionId; } switch (_coreVar._currPlace) { case MOUNTAIN: if (menuChoice == 1) gotoManorFront(); else if (menuChoice == 2) checkManorDistance(); _menu->setDestinationText(_coreVar._currPlace); return; case INSIDE_WELL: if (menuChoice == 1) floodedInWell(); else if (menuChoice == 2) gotoManorBack(); _menu->setDestinationText(_coreVar._currPlace); return; case BUREAU: if (menuChoice == 1) menuChoice = 6; break; case KITCHEN: if (menuChoice == 2) menuChoice = 6; else if (menuChoice == 5) menuChoice = 16; break; case CELLAR: if (menuChoice == 3) menuChoice = 6; break; case LANDING: case ROOM26: if (menuChoice == 4) menuChoice = 6; break; default: break; } if ((_coreVar._currPlace > MOUNTAIN) && (_coreVar._currPlace != ROOM26)) menuChoice += 10; if ((_coreVar._currPlace == CHAPEL) && (menuChoice == 13)) menuChoice = 16; else if (_coreVar._currPlace == MANOR_FRONT) { if (menuChoice == 12) menuChoice = 16; else if (menuChoice > 13) menuChoice = 15; } else if ((_coreVar._currPlace == MANOR_BACK) && (menuChoice > 14)) menuChoice = 15; else if ((_coreVar._currPlace == WELL) && (menuChoice > 13) && (menuChoice != 17)) menuChoice = 15; switch (menuChoice) { case 1: _coreVar._currPlace = BUREAU; break; case 2: _coreVar._currPlace = KITCHEN; break; case 3: _coreVar._currPlace = CELLAR; break; case 4: _coreVar._currPlace = LANDING; break; case 5: case 12: gotoManorFront(); break; case 6: case 11: gotoDiningRoom(); break; case 13: _coreVar._currPlace = CHAPEL; break; case 14: _coreVar._currPlace = WELL; break; case 15: checkManorDistance(); break; case 16: gotoManorBack(); break; case 17: if ((_coreVar._wellObjectId != 120) && (_coreVar._wellObjectId != 140)) _crep = 997; else if (_coreVar._wellObjectId == 120) _crep = 181; else if (_coreVar._faithScore > 80) { _crep = 1505; loseGame(); } else { _coreVar._currPlace = INSIDE_WELL; prepareDisplayText(); } break; default: break; } if ((menuChoice < 5) || (menuChoice == 13) || (menuChoice == 14)) prepareDisplayText(); resetRoomVariables(_coreVar._currPlace); _menu->setDestinationText(_coreVar._currPlace); } /** * Engine function - Take * @remarks Originally called 'tprendre' */ void MortevielleEngine::fctTake() { if (_caff > 99) { int cx = _caff; putInHand(cx); if (_crep != 139) { if (_currBitIndex > 0) _coreVar._faithScore += 3; if (_obpart) { switch (_coreVar._currPlace) { case PURPLE_ROOM: _coreVar._purpleRoomObjectId = 0; break; case ATTIC: if (_coreVar._atticBallHoleObjectId == _caff) _coreVar._atticBallHoleObjectId = 0; if (_coreVar._atticRodHoleObjectId == _caff) _coreVar._atticRodHoleObjectId = 0; break; case CELLAR: _coreVar._cellarObjectId = 0; break; case CRYPT: _coreVar._cryptObjectId = 0; break; case SECRET_PASSAGE: _coreVar._secretPassageObjectId = 0; break; case WELL: _coreVar._wellObjectId = 0; break; default: break; } _menu->unsetSearchMenu(); _obpart = false; prepareDisplayText(); } else { _tabdon[kAcha + ((_curSearchObjId - 1) * 10) + _searchCount - 1] = 0; prepareNextObject(); ++_takeObjCount; if (_takeObjCount > 6) { _coreVar._faithScore += 2; _takeObjCount = 0; } } } return; } if (!_syn) displayTextInVerbBar(getEngineString(S_TAKE)); displayStatusArrow(); if ((_anyone) || (_keyPressedEsc)) return; if (_caff == 3) { setCoordinates(2); if (_num == 1) { _crep = 152; return; } } setCoordinates(5); if ((_num == 0) || ((_num == 1) && (_coreVar._currPlace == CRYPT))) { setCoordinates(8); if (_num != 0) { if (_currBitIndex > 0) _coreVar._faithScore += 3; _crep = 997; switch (_coreVar._currPlace) { case PURPLE_ROOM: if (_coreVar._purpleRoomObjectId != 0) putInHand(_coreVar._purpleRoomObjectId); break; case ATTIC: if ((_num == 1) && (_coreVar._atticBallHoleObjectId != 0)) { putInHand(_coreVar._atticBallHoleObjectId); if ((_crep != 997) && (_crep != 139)) displayAnimFrame(2, 7); } else if ((_num == 2) && (_coreVar._atticRodHoleObjectId != 0)) { putInHand(_coreVar._atticRodHoleObjectId); if ((_crep != 997) && (_crep != 139)) displayAnimFrame(2, 6); } break; case CELLAR: if (_coreVar._cellarObjectId != 0) { putInHand(_coreVar._cellarObjectId); if ((_crep != 997) && (_crep != 139)) displayAnimFrame(2, 2); } break; case CRYPT: if (_coreVar._cryptObjectId != 0) putInHand(_coreVar._cryptObjectId); break; case SECRET_PASSAGE: if (_coreVar._secretPassageObjectId != 0) { putInHand(_coreVar._secretPassageObjectId); if ((_crep != 997) && (_crep != 139)) { _crep = 182; displayAnimFrame(2, 1); } } break; case WELL: if (_coreVar._wellObjectId != 0) { putInHand(_coreVar._wellObjectId); if ((_crep != 997) && (_crep != 139)) displayAnimFrame(2, 1); } break; default: break; } if ((_crep != 997) && (_crep != 182) && (_crep != 139)) _crep = 999; } } else { if ( ((_coreVar._currPlace == OWN_ROOM) && (_num == 3)) || ((_coreVar._currPlace == GREEN_ROOM) && (_num == 4)) || ((_coreVar._currPlace == PURPLE_ROOM) && (_num == 1)) || ((_coreVar._currPlace == DARKBLUE_ROOM) && (_num == 3)) || ((_coreVar._currPlace == BLUE_ROOM) && (_num == 6)) || ((_coreVar._currPlace == RED_ROOM) && (_num == 2)) || ((_coreVar._currPlace == BATHROOM) && (_num == 6)) || ((_coreVar._currPlace == GREEN_ROOM2) && (_num == 4)) || ((_coreVar._currPlace == JULIA_ROOM) && (_num == 4)) || ((_coreVar._currPlace == DINING_ROOM) && (_num > 2)) || ((_coreVar._currPlace == BUREAU) && (_num == 7)) || ((_coreVar._currPlace == KITCHEN) && (_num == 6)) || ((_coreVar._currPlace == ATTIC) && (_num > 4)) || ((_coreVar._currPlace > ATTIC) && (_coreVar._currPlace != INSIDE_WELL)) ) _crep = 997; else if (_coreVar._currPlace == INSIDE_WELL) { _crep = 1504; loseGame(); } else _crep = 120; } } /** * Engine function - Inventory / Take * @remarks Originally called 'tsprendre' */ void MortevielleEngine::fctInventoryTake() { int inventIndex = 0; int oldMenu = 0; do { ++inventIndex; oldMenu = (_menu->_inventoryMenu[inventIndex]._menuId << 8) | _menu->_inventoryMenu[inventIndex]._actionId; } while (oldMenu != _currAction); int cz = 0; int cy = 0; do { ++cy; if (_coreVar._inventory[cy] != 0) ++cz; } while (cz != inventIndex); cz = _coreVar._inventory[cy]; _coreVar._inventory[cy] = 0; _menu->setInventoryText(); putInHand(cz); _crep = 998; clearDescriptionBar(); } /** * Engine function - Lift * @remarks Originally called 'tsoulever' */ void MortevielleEngine::fctLift() { if (!_syn) displayTextInVerbBar(getEngineString(S_LIFT)); displayStatusArrow(); if ((_anyone) || (_keyPressedEsc)) return; setCoordinates(3); if (_num == 0) { setCoordinates(8); if (_num != 0) { if (_currBitIndex > 0) ++_coreVar._faithScore; _crep = 997; if ((_coreVar._currPlace == PURPLE_ROOM) && (_coreVar._purpleRoomObjectId != 0)) displayLookScreen(_coreVar._purpleRoomObjectId); } return; } if (_currBitIndex > 0) ++_coreVar._faithScore; int tmpPlace = _coreVar._currPlace; if (_coreVar._currPlace == CRYPT) tmpPlace = 14; else if (_coreVar._currPlace == MOUNTAIN) tmpPlace = 15; _crep = _tabdon[kAsoul + (tmpPlace << 3) + (_num - 1)]; if (_crep == 255) _crep = 997; } /** * Engine function - Read * @remarks Originally called 'tlire' */ void MortevielleEngine::fctRead() { if (_caff > 99) getReadDescription(_caff); else { if (!_syn) displayTextInVerbBar(getEngineString(S_READ)); displayStatusArrow(); if (!(_anyone) && !(_keyPressedEsc)) { setCoordinates(4); if (_num != 0) _crep = 107; } } } /** * Engine function - Self / Read * @remarks Originally called 'tslire' */ void MortevielleEngine::fctSelfRead() { if (_coreVar._selectedObjectId == 0) _crep = 186; else getReadDescription(_coreVar._selectedObjectId); } /** * Engine function - Look * @remarks Originally called 'tregarder' */ void MortevielleEngine::fctLook() { if (_caff > 99) { _crep = 103; return; } if (!_syn) displayTextInVerbBar(getEngineString(S_LOOK)); displayStatusArrow(); if ((_anyone) || (_keyPressedEsc)) return; setCoordinates(5); if (_num == 0) { setCoordinates(8); _crep = 131; if (_num != 0) { if (_coreVar._currPlace == ATTIC) { if (_num == 1) { _crep = 164; if (_coreVar._atticRodHoleObjectId != 0) displayLookScreen(_coreVar._atticRodHoleObjectId); else if (_coreVar._atticBallHoleObjectId != 0) displayLookScreen(_coreVar._atticBallHoleObjectId); } else { _crep = 193; if (_coreVar._atticRodHoleObjectId != 0) displayLookScreen(_coreVar._atticRodHoleObjectId); } } if (_coreVar._currPlace == CELLAR) { _crep = 164; if (_coreVar._cellarObjectId != 0) displayLookScreen(_coreVar._cellarObjectId); } if (_coreVar._currPlace == SECRET_PASSAGE) { _crep = 174; if (_coreVar._secretPassageObjectId != 0) displayLookScreen(_coreVar._secretPassageObjectId); } if (_coreVar._currPlace == WELL) { _crep = 131; if (_coreVar._wellObjectId != 0) displayLookScreen(_coreVar._wellObjectId); } } return; } int cx = _coreVar._currPlace; switch (_coreVar._currPlace) { case CHAPEL: cx = 17; break; case MANOR_BACK: case INSIDE_WELL: case WELL: cx -= 4; break; case ROOM26: cx = 21; break; default: break; } _crep = _tabdon[kArega + (cx * 7) + _num - 1]; if ((_coreVar._currPlace == ATTIC) && (_num == 8)) _crep = 126; if (_coreVar._currPlace == MOUNTAIN) _crep = 103; if (_crep == 255) _crep = 131; if ((_coreVar._currPlace == GREEN_ROOM) && (_num == 1)) displayLookScreen(144); if ((_coreVar._currPlace == BLUE_ROOM) && (_num == 3)) displayLookScreen(147); if ((_coreVar._currPlace == GREEN_ROOM2) && (_num == 3)) displayLookScreen(149); if ((_coreVar._currPlace == JULIA_ROOM) && (_num == 2)) displayLookScreen(30); if ((_coreVar._currPlace == DINING_ROOM) && (_num == 3)) displayLookScreen(31); } /** * Engine function - Self / Look * @remarks Originally called 'tsregarder' */ void MortevielleEngine::fctSelftLook() { if (_coreVar._selectedObjectId != 0) displayLookScreen(_coreVar._selectedObjectId); else _crep = 186; } /** * Engine function - Search * @remarks Originally called 'tfouiller' */ void MortevielleEngine::fctSearch() { static const byte answerArr[14] = {123, 104, 123, 131, 131, 123, 104, 131, 123, 123, 106, 123, 123, 107}; if (_caff > 99) { getSearchDescription(_caff); return; } if (!_syn) displayTextInVerbBar(getEngineString(S_SEARCH)); displayStatusArrow(); if (_anyone || _keyPressedEsc) return; if (_coreVar._currPlace == INSIDE_WELL) { _crep = 1504; loseGame(); return; } setCoordinates(6); if (_num == 0) { setCoordinates(7); if (_num != 0) { int i; for (i = 1; i <= 6; i++) { if (_num == _openObjects[i]) break; } if (i <= 6) { if (_currBitIndex > 0) _coreVar._faithScore += 3; _curSearchObjId = getFirstObject(); if (_curSearchObjId != 0) { _searchCount = 0; _is = 0; _heroSearching = true; _menu->setSearchMenu(); prepareNextObject(); } else _crep = 997; } else _crep = 187; } else { setCoordinates(8); _crep = 997; if (_num != 0) { if (_currBitIndex > 0) _coreVar._faithScore += 3; if ((_coreVar._currPlace != WELL) && (_coreVar._currPlace != SECRET_PASSAGE) && (_coreVar._currPlace != ATTIC)) { if (_coreVar._currPlace == PURPLE_ROOM) { _crep = 123; if (_coreVar._purpleRoomObjectId != 0) displayLookScreen(_coreVar._purpleRoomObjectId); } if (_coreVar._currPlace == CRYPT) { _crep = 123; if (_coreVar._cryptObjectId != 0) displayLookScreen(_coreVar._cryptObjectId); } } } } } else { if (_currBitIndex > 0) _coreVar._faithScore += 3; _crep = 997; if (_coreVar._currPlace < CELLAR) _crep = answerArr[_coreVar._currPlace]; if ((_coreVar._currPlace == TOILETS) && (_num == 2)) _crep = 162; if (_coreVar._currPlace == KITCHEN) { if ((_num == 3) || (_num == 4)) _crep = 162; else if (_num == 5) _crep = 159; } if (_coreVar._currPlace == MOUNTAIN) _crep = 104; else if (_coreVar._currPlace == CRYPT) _crep = 155; } } /** * Engine function - Self / Search * @remarks Originally called 'tsfouiller' */ void MortevielleEngine::fctSelfSearch() { if (_coreVar._selectedObjectId != 0) getSearchDescription(_coreVar._selectedObjectId); else _crep = 186; } /** * Engine function - Open * @remarks Originally called 'touvrir' */ void MortevielleEngine::fctOpen() { if (!_syn) displayTextInVerbBar(getEngineString(S_OPEN)); if (_caff == ROOM26) { if (_roomDoorId != OWN_ROOM) { _currAction = _menu->_opcodeEnter; _syn = true; } else _crep = 997; return; } if (_caff == LANDING) { showMoveMenuAlert(); return; } displayStatusArrow(); if ((_anyone) || (_keyPressedEsc)) return; setCoordinates(7); if (_num != 0) { if (_currBitIndex > 0) _coreVar._faithScore += 2; ++_openObjCount; int i; for (i = 1; (i <= 6); i++) { if ((_openObjects[i] == 0) || (_openObjects[i] == _num)) break; } if (i > 6) { warning("Unexpected action: Too many open objects"); return; } if (_openObjects[i] == _num) // display "Already Opened" _crep = 18; else { if (!( ((_num == 3) && ((_coreVar._currPlace == OWN_ROOM) || (_coreVar._currPlace == JULIA_ROOM) || (_coreVar._currPlace == BLUE_ROOM) || (_coreVar._currPlace == BATHROOM))) || ((_num == 4) && ((_coreVar._currPlace == GREEN_ROOM) || (_coreVar._currPlace == PURPLE_ROOM) || (_coreVar._currPlace == RED_ROOM))) || ((_coreVar._currPlace == DARKBLUE_ROOM) && (_num == 5)) || ((_num == 6) && ((_coreVar._currPlace == BATHROOM) || (_coreVar._currPlace == DINING_ROOM) || (_coreVar._currPlace == GREEN_ROOM2) || (_coreVar._currPlace == ATTIC))) || ((_coreVar._currPlace == GREEN_ROOM2) && (_num == 2)) || ((_coreVar._currPlace == KITCHEN) && (_num == 7))) ) { if ( ((_coreVar._currPlace > DINING_ROOM) && (_coreVar._currPlace < CELLAR)) || ((_coreVar._currPlace > RED_ROOM) && (_coreVar._currPlace < DINING_ROOM)) || (_coreVar._currPlace == OWN_ROOM) || (_coreVar._currPlace == PURPLE_ROOM) || (_coreVar._currPlace == BLUE_ROOM)) { if (getRandomNumber(1, 4) == 3) _soundManager->startSpeech(7, 9, 1); } _openObjects[i] = _num; displayAnimFrame(1, _num); _soundManager->waitSpeech(); } int tmpPlace = _coreVar._currPlace; if (_coreVar._currPlace == CRYPT) tmpPlace = CELLAR; _crep = _tabdon[kAouvr + (tmpPlace * 7) + _num - 1]; if (_crep == 254) _crep = 999; } } } /** * Engine function - Place * @remarks Originally called 'tmettre' */ void MortevielleEngine::fctPlace() { if (_coreVar._selectedObjectId == 0) { _crep = 186; return; } if (!_syn) displayTextInVerbBar(getEngineString(S_PUT)); displayStatusArrow(); if (_keyPressedEsc) _crep = 998; if ((_anyone) || (_keyPressedEsc)) return; setCoordinates(8); if (_num != 0) { _crep = 999; if (_caff == ATTIC) { if (_num == 1) { if (_coreVar._atticBallHoleObjectId != 0) { _crep = 188; } else { _coreVar._atticBallHoleObjectId = _coreVar._selectedObjectId; if (_coreVar._selectedObjectId == 141) displayAnimFrame(1, 7); } } else if (_coreVar._atticRodHoleObjectId != 0) { _crep = 188; } else { _coreVar._atticRodHoleObjectId = _coreVar._selectedObjectId; if (_coreVar._selectedObjectId == 159) displayAnimFrame(1, 6); } } if (_caff == CELLAR) { if (_coreVar._cellarObjectId != 0) { _crep = 188; } else { _coreVar._cellarObjectId = _coreVar._selectedObjectId; if (_coreVar._selectedObjectId == 151) { // Open hidden passage displayAnimFrame(1, 2); displayAnimFrame(1, 1); handleDescriptionText(2, 165); displayEmptyHand(); _soundManager->startSpeech(6, -9, 1); // Do you want to enter the hidden passage? int answer = _dialogManager->show(getEngineString(S_YES_NO)); if (answer == 1) { Common::String alertTxt = getString(582); _dialogManager->show(alertTxt); bool enterPassageFl = _dialogManager->showKnowledgeCheck(); _mouse->hideMouse(); clearScreen(); drawRightFrame(); clearDescriptionBar(); clearVerbBar(); _mouse->showMouse(); prepareRoom(); drawClock(); if (_currBitIndex != 0) showPeoplePresent(_currBitIndex); else displayAloneText(); _menu->displayMenu(); if (enterPassageFl) { _coreVar._currPlace = SECRET_PASSAGE; _menu->setDestinationText(SECRET_PASSAGE); } else { _menu->setDestinationText(_coreVar._currPlace); setPal(14); drawPicture(); displayAnimFrame(1, 2); displayAnimFrame(1, 1); alertTxt = getString(577); _dialogManager->show(alertTxt); displayAnimFrame(2, 1); _crep = 166; } prepareDisplayText(); } else { displayAnimFrame(2, 1); _crep = 166; } return; } } } if (_caff == CRYPT) { if (_coreVar._cryptObjectId == 0) _coreVar._cryptObjectId = _coreVar._selectedObjectId; else _crep = 188; } if (_caff == SECRET_PASSAGE) { if (_coreVar._secretPassageObjectId != 0) { _crep = 188; } else if (_coreVar._selectedObjectId == 143) { _coreVar._secretPassageObjectId = 143; displayAnimFrame(1, 1); } else { _crep = 1512; loseGame(); } } if (_caff == WELL) { if (_coreVar._wellObjectId != 0) { _crep = 188; } else if ((_coreVar._selectedObjectId == 140) || (_coreVar._selectedObjectId == 120)) { _coreVar._wellObjectId = _coreVar._selectedObjectId; displayAnimFrame(1, 1); } else { _crep = 185; } } if (_crep != 188) displayEmptyHand(); } } /** * Engine function - Turn * @remarks Originally called 'ttourner' */ void MortevielleEngine::fctTurn() { if (_caff > 99) { _crep = 149; return; } if (!_syn) displayTextInVerbBar(getEngineString(S_TURN)); displayStatusArrow(); if ((_anyone) || (_keyPressedEsc)) return; setCoordinates(9); if (_num != 0) { _crep = 997; if ((_coreVar._currPlace == ATTIC) && (_coreVar._atticRodHoleObjectId == 159) && (_coreVar._atticBallHoleObjectId == 141)) { handleDescriptionText(2, 167); _soundManager->startSpeech(7, 9, 1); int answer = _dialogManager->show(getEngineString(S_YES_NO)); if (answer == 1) _endGame = true; else _crep = 168; } if ((_coreVar._currPlace == SECRET_PASSAGE) && (_coreVar._secretPassageObjectId == 143)) { handleDescriptionText(2, 175); clearVerbBar(); _soundManager->startSpeech(6, -9, 1); int answer = _dialogManager->show(getEngineString(S_YES_NO)); if (answer == 1) { _coreVar._currPlace = CRYPT; prepareDisplayText(); } else _crep = 176; } } } /** * Engine function - Hide Self * @remarks Originally called 'tcacher' */ void MortevielleEngine::fctSelfHide() { if (!_syn) displayTextInVerbBar(getEngineString(S_HIDE_SELF)); displayStatusArrow(); if (!(_anyone) && !(_keyPressedEsc)) { setCoordinates(10); if (_num == 0) _hiddenHero = false; else { _hiddenHero = true; _crep = 999; } } } /** * Engine function - Attach * @remarks Originally called 'tattacher' */ void MortevielleEngine::fctAttach() { if (_coreVar._selectedObjectId == 0) _crep = 186; else { if (!_syn) displayTextInVerbBar(getEngineString(S_TIE)); displayStatusArrow(); if (!(_anyone) && !(_keyPressedEsc)) { setCoordinates(8); _crep = 997; if ((_num != 0) && (_coreVar._currPlace == WELL)) { _crep = 999; if ((_coreVar._selectedObjectId == 120) || (_coreVar._selectedObjectId == 140)) { _coreVar._wellObjectId = _coreVar._selectedObjectId; displayAnimFrame(1, 1); } else _crep = 185; displayEmptyHand(); } } } } /** * Engine function - Close * @remarks Originally called 'tfermer' */ void MortevielleEngine::fctClose() { if (!_syn) displayTextInVerbBar(getEngineString(S_CLOSE)); if (_caff < ROOM26) { displayStatusArrow(); if (_keyPressedEsc) _crep = 998; if ((_anyone) || (_keyPressedEsc)) return; setCoordinates(7); if (_num != 0) { int i; for (i = 1; i <= 6; ++i) { if (_num == _openObjects[i]) break; } if (i <= 6) { displayAnimFrame(2, _num); _crep = 998; _openObjects[i] = 0; --_openObjCount; if (_openObjCount < 0) _openObjCount = 0; int objId = getFirstObject(); if (_curSearchObjId == objId) _curSearchObjId = 0; } else { _crep = 187; } } } if (_caff == ROOM26) _crep = 999; } /** * Engine function - Knock * @remarks Originally called 'tfrapper' */ void MortevielleEngine::fctKnock() { if (!_syn) displayTextInVerbBar(getEngineString(S_HIT)); if (_coreVar._currPlace == LANDING) { _dialogManager->show(getEngineString(S_BEFORE_USE_DEP_MENU)); return; } if (_coreVar._currPlace < DOOR) { displayStatusArrow(); if (!(_anyone) && !(_keyPressedEsc)) { if ((_coreVar._currPlace < MOUNTAIN) && (_coreVar._currPlace != LANDING)) _crep = 133; else _crep = 997; } return; } if (_coreVar._currPlace == ROOM26) { int rand = (getRandomNumber(0, 8)) - 4; _soundManager->startSpeech(11, rand, 1); int pres = getPresenceStats(rand, _coreVar._faithScore, _roomDoorId); if (_roomDoorId != OWN_ROOM) { if (pres != -500) { if (rand > pres) _crep = 190; else { setPresenceFlags(_roomDoorId); getKnockAnswer(); } } else getKnockAnswer(); } if (_roomDoorId == GREEN_ROOM2) _crep = 190; } } /** * Engine function - Self / Put * @remarks Originally called 'tposer' */ void MortevielleEngine::fctSelfPut() { if (!_syn) displayTextInVerbBar(getEngineString(S_POSE)); if (_coreVar._selectedObjectId == 0) _crep = 186; else { if (_caff > 99) { _crep = 999; putObject(); if (_crep != 192) displayEmptyHand(); return; } displayStatusArrow(); if ((_anyone) || (_keyPressedEsc)) return; setCoordinates(7); _crep = 124; if (_num != 0) { int objId = getFirstObject(); if (objId == 0) _crep = 997; else { int i; for (i = 1; i <= 6; i++) { if (_num == _openObjects[i]) break; } if (i <= 6) { _curSearchObjId = objId; _crep = 999; } else _crep = 187; } } else { setCoordinates(8); if (_num != 0) { _crep = 998; if (_caff == PURPLE_ROOM) { if (_coreVar._purpleRoomObjectId != 0) _crep = 188; else _coreVar._purpleRoomObjectId = _coreVar._selectedObjectId; } if (_caff == ATTIC) { if (_num == 1) { if (_coreVar._atticBallHoleObjectId != 0) _crep = 188; else { _coreVar._atticBallHoleObjectId = _coreVar._selectedObjectId; displayAnimFrame(1, 7); } } else if (_coreVar._atticRodHoleObjectId != 0) { _crep = 188; } else { _coreVar._atticRodHoleObjectId = _coreVar._selectedObjectId; displayAnimFrame(1, 6); } } if (_caff == CRYPT) { if (_coreVar._cryptObjectId != 0) _crep = 188; else _coreVar._cryptObjectId = _coreVar._selectedObjectId; } if (_caff == WELL) _crep = 185; if ((_caff == CELLAR) || (_caff == SECRET_PASSAGE)) _crep = 124; } else { _crep = 124; if (_caff == WELL) { setCoordinates(5); if (_num != 0) _crep = 185; } } } if (_caff == INSIDE_WELL) _crep = 185; if ((_crep == 999) || (_crep == 185) || (_crep == 998)) { if (_crep == 999) putObject(); if (_crep != 192) displayEmptyHand(); } } } /** * Engine function - Listen * @remarks Originally called 'tecouter' */ void MortevielleEngine::fctListen() { if (_coreVar._currPlace != ROOM26) _crep = 101; else { if (_currBitIndex != 0) ++_coreVar._faithScore; int rand; int pres = getPresenceStats(rand, _coreVar._faithScore, _roomDoorId); if (_roomDoorId != OWN_ROOM) { if (pres != -500) { if (rand > pres) _crep = 101; else { setPresenceFlags(_roomDoorId); int day, hour, minute; updateHour(day, hour, minute); rand = getRandomNumber(1, 100); if ((hour >= 0) && (hour < 8)) { if (rand > 30) _crep = 101; else _crep = 178; } else if (rand > 70) _crep = 101; else _crep = 178; } } else _crep = 178; } } } /** * Engine function - Eat * @remarks Originally called 'tmanger' */ void MortevielleEngine::fctEat() { if ((_coreVar._currPlace > LANDING) && (_coreVar._currPlace < ROOM26)) { _crep = 148; } else { exitRoom(); _coreVar._currPlace = DINING_ROOM; _caff = DINING_ROOM; resetRoomVariables(_coreVar._currPlace); _menu->setDestinationText(_coreVar._currPlace); int day, hour, minute; updateHour(day, hour, minute); if ((hour == 12) || (hour == 13) || (hour == 19)) { _coreVar._faithScore -= (_coreVar._faithScore / 7); if (hour == 12) { if (minute == 0) hour = 4; else hour = 3; } if ((hour == 13) || (hour == 19)) { if (minute == 0) hour = 2; else hour = 1; } _currentHourCount += hour; _crep = 135; prepareRoom(); } else { _crep = 134; } } } /** * Engine function - Enter * @remarks Originally called 'tentrer' */ void MortevielleEngine::fctEnter() { if ((_coreVar._currPlace == MANOR_FRONT) || (_coreVar._currPlace == MANOR_BACK)) { gotoDiningRoom(); _menu->setDestinationText(_coreVar._currPlace); } else if (_coreVar._currPlace == LANDING) showMoveMenuAlert(); else if (_roomDoorId == OWN_ROOM) _crep = 997; else if ((_roomDoorId == JULIA_ROOM) && (_coreVar._selectedObjectId != 136)) { _crep = 189; _coreVar._availableQuestion[8] = '*'; } else { int pres = 0; if (!_outsideOnlyFl) pres = getPresence(_roomDoorId); if (pres != 0) { if ((_roomDoorId == TOILETS) || (_roomDoorId == BATHROOM)) _crep = 179; else { int randVal = (getRandomNumber(0, 10)) - 5; _soundManager->startSpeech(7, randVal, 1); displayAnimFrame(1, 1); _soundManager->waitSpeech(); int charIndex = convertBitIndexToCharacterIndex(pres); ++_coreVar._faithScore; _coreVar._currPlace = LANDING; _currMenu = MENU_DISCUSS; _currAction = (_menu->_discussMenu[charIndex]._menuId << 8) | _menu->_discussMenu[charIndex]._actionId; _syn = true; if (_roomDoorId == JULIA_ROOM) { _col = true; _caff = 70; drawPictureWithText(); handleDescriptionText(2, _caff); } else _col = false; resetRoomVariables(_roomDoorId); _roomDoorId = OWN_ROOM; } } else { int randVal = (getRandomNumber(0, 10)) - 5; _soundManager->startSpeech(7, randVal, 1); displayAnimFrame(1, 1); _soundManager->waitSpeech(); _coreVar._currPlace = _roomDoorId; prepareDisplayText(); resetRoomVariables(_coreVar._currPlace); _menu->setDestinationText(_coreVar._currPlace); _roomDoorId = OWN_ROOM; _savedBitIndex = 0; _currBitIndex = 0; } } } /** * Engine function - Sleep * @remarks Originally called 'tdormir' */ void MortevielleEngine::fctSleep() { if ((_coreVar._currPlace > LANDING) && (_coreVar._currPlace < ROOM26)) { _crep = 148; return; } if (_coreVar._currPlace != OWN_ROOM) { exitRoom(); _coreVar._currPlace = OWN_ROOM; prepareDisplayText(); drawPictureWithText(); resetRoomVariables(_coreVar._currPlace); _menu->setDestinationText(_coreVar._currPlace); } clearVerbBar(); clearDescriptionBar(); prepareScreenType2(); displayTextBlock(getEngineString(S_WANT_TO_WAKE_UP)); int day, hour, minute; updateHour(day, hour, minute); int answer; do { if (hour < 8) { _coreVar._faithScore -= (_coreVar._faithScore / 20); int z = (7 - hour) * 2; if (minute == 30) --z; _currentHourCount += z; hour = 7; } _currentHourCount += 2; ++hour; if (hour > 23) hour = 0; prepareRoom(); answer = _dialogManager->show(getEngineString(S_YES_NO)); _anyone = false; } while (answer != 1); _crep = 998; _num = 0; } /** * Engine function - Force * @remarks Originally called 'tdefoncer' */ void MortevielleEngine::fctForce() { if (!_syn) displayTextInVerbBar(getEngineString(S_SMASH)); if (_caff < DOOR) displayStatusArrow(); if ((!_anyone) && (!_keyPressedEsc)) { if (_coreVar._currPlace != ROOM26) _crep = 997; else { _crep = 143; _coreVar._faithScore += 2; } } } /** * Engine function - Leave * @remarks Originally called 'tsortir' */ void MortevielleEngine::fctLeave() { exitRoom(); _crep = 0; if ((_coreVar._currPlace == MOUNTAIN) || (_coreVar._currPlace == MANOR_FRONT) || (_coreVar._currPlace == MANOR_BACK) || (_coreVar._currPlace == WELL)) _crep = 997; else { int nextPlace = OWN_ROOM; if ((_coreVar._currPlace < CRYPT) || (_coreVar._currPlace == ROOM26)) nextPlace = DINING_ROOM; else if ((_coreVar._currPlace == DINING_ROOM) || (_coreVar._currPlace == CHAPEL)) nextPlace = MANOR_FRONT; else if ((_coreVar._currPlace < DINING_ROOM) || (_coreVar._currPlace == ATTIC)) nextPlace = LANDING; else if (_coreVar._currPlace == CRYPT) { nextPlace = SECRET_PASSAGE; _crep = 176; } else if (_coreVar._currPlace == SECRET_PASSAGE) nextPlace = checkLeaveSecretPassage(); else if (_coreVar._currPlace == INSIDE_WELL) nextPlace = WELL; if (_crep != 997) _coreVar._currPlace = nextPlace; _caff = nextPlace; if (_crep == 0) _crep = nextPlace; resetRoomVariables(nextPlace); _menu->setDestinationText(nextPlace); } } /** * Engine function - Wait * @remarks Originally called 'tattendre' */ void MortevielleEngine::fctWait() { _savedBitIndex = 0; clearVerbBar(); int answer; do { ++_currentHourCount; prepareRoom(); if (!_outsideOnlyFl) getPresence(_coreVar._currPlace); if ((_currBitIndex != 0) && (_savedBitIndex == 0)) { _crep = 998; if ((_coreVar._currPlace == ATTIC) || (_coreVar._currPlace == CELLAR)) initCaveOrCellar(); if ((_coreVar._currPlace > OWN_ROOM) && (_coreVar._currPlace < DINING_ROOM)) _anyone = true; _savedBitIndex = _currBitIndex; if (!_anyone) prepareRoom(); return; } handleDescriptionText(2, 102); answer = _dialogManager->show(getEngineString(S_YES_NO)); } while (answer != 2); _crep = 998; if (!_anyone) prepareRoom(); } /** * Engine function - Sound * @remarks Originally called 'tsonder' */ void MortevielleEngine::fctSound() { if (!_syn) displayTextInVerbBar(getEngineString(S_PROBE2)); if (_caff < 27) { displayStatusArrow(); if (!(_anyone) && (!_keyPressedEsc)) _crep = 145; _num = 0; } } /** * Engine function - Discuss * @remarks Originally called 'tparler' */ void MortevielleEngine::fctDiscuss() { bool questionAsked[47]; int cy, cx; int x, y; Common::String lib[47]; int choice; int displId; endSearch(); if (_col) displId = 128; else { cx = 0; int oldMenu; do { ++cx; oldMenu = (_menu->_discussMenu[cx]._menuId << 8) | _menu->_discussMenu[cx]._actionId; } while (oldMenu != _currAction); _caff = 69 + cx; drawPictureWithText(); handleDescriptionText(2, _caff); displId = _caff + 60; } testKey(false); menuUp(); _mouse->hideMouse(); clearScreen(); drawDiscussionBox(); startDialog(displId); clearScreen(); for (int ix = 1; ix <= 46; ++ix) questionAsked[ix] = false; for (int ix = 1; ix <= 45; ++ix) { lib[ix] = getString(ix + kQuestionStringIndex); for (int i = lib[ix].size(); i <= 40; ++i) lib[ix] = lib[ix] + ' '; } lib[46] = lib[45]; lib[45] = ' '; _mouse->showMouse(); do { choice = 0; int posX = 0; int posY = 0; for (int icm = 1; icm < 43; icm++) { _screenSurface->putxy(posX, posY); if (_coreVar._availableQuestion[icm] == '*') { // If question already asked, write it in reverse video if (questionAsked[icm]) displayQuestionText(lib[icm], 1); else displayQuestionText(lib[icm], 0); } if (icm == 23) { posY = 0; posX = 320; } else posY += 8; } _screenSurface->putxy(320, 176); displayQuestionText(lib[46], 0); char retKey = '\0'; bool click; do { bool dummyFl; _mouse->moveMouse(dummyFl, retKey); if (shouldQuit()) return; _mouse->getMousePosition(x, y, click); x *= (3 - kResolutionScaler); if (x > 319) cx = 41; else cx = 1; cy = ((uint)y >> 3) + 1; // 0-199 => 1-25 if ((cy > 23) || ((cx == 41) && ((cy >= 20) && (cy <= 22)))) { if (choice != 0) { posY = ((choice - 1) % 23) << 3; if (choice > 23) posX = 320; else posX = 0; _screenSurface->putxy(posX, posY); if (questionAsked[choice]) displayQuestionText(lib[choice], 0); else displayQuestionText(lib[choice], 1); questionAsked[choice] = !questionAsked[choice]; choice = 0; } } else { int ix = cy; if (cx == 41) ix += 23; if (ix != choice) { if (choice != 0) { posY = ((choice - 1) % 23) << 3; if (choice > 23) posX = 320; else posX = 0; _screenSurface->putxy(posX, posY); if (questionAsked[choice]) displayQuestionText(lib[choice], 0); else displayQuestionText(lib[choice], 1); questionAsked[choice] = ! questionAsked[choice]; } if ((ix == 46) || (_coreVar._availableQuestion[ix] == '*')) { posY = ((ix - 1) % 23) << 3; if (ix > 23) posX = 320; else posX = 0; _screenSurface->putxy(posX, posY); if (questionAsked[ix]) displayQuestionText(lib[ix], 0); else displayQuestionText(lib[ix], 1); questionAsked[ix] = ! questionAsked[ix]; choice = ix; } else choice = 0; } } } while (!((retKey == '\15') || (((click != 0) || getMouseClick()) && (choice != 0)))); setMouseClick(false); // If choice is not "End of Conversation" if (choice != 46) { int ix = choice - 1; if (_col) { _col = false; _coreVar._currPlace = 15; int maxRandVal; if (_openObjCount > 0) maxRandVal = 8; else maxRandVal = 4; if (getRandomNumber(1, maxRandVal) == 2) displId = 129; else { displId = 138; _coreVar._faithScore += (3 * (_coreVar._faithScore / 10)); } } else if (_charAnswerCount[_caff - 69] < _charAnswerMax[_caff - 69]) { displId = _tabdon[kArep + (ix << 3) + (_caff - 70)]; _coreVar._faithScore += _tabdon[kArcf + ix]; ++_charAnswerCount[_caff - 69]; } else { _coreVar._faithScore += 3; displId = 139; } _mouse->hideMouse(); clearScreen(); drawDiscussionBox(); startDialog(displId); _mouse->showMouse(); if ((displId == 84) || (displId == 86)) { _coreVar._pctHintFound[5] = '*'; _coreVar._availableQuestion[7] = '*'; } if ((displId == 106) || (displId == 108) || (displId == 94)) { for (int indx = 29; indx <= 31; ++indx) _coreVar._availableQuestion[indx] = '*'; _coreVar._pctHintFound[7] = '*'; } if (displId == 70) { _coreVar._pctHintFound[8] = '*'; _coreVar._availableQuestion[32] = '*'; } _mouse->hideMouse(); clearScreen(); _mouse->showMouse(); } } while ((choice != 46) && (displId != 138)); if (_col) { _coreVar._faithScore += (3 * (_coreVar._faithScore / 10)); _mouse->hideMouse(); clearScreen(); drawDiscussionBox(); startDialog(138); _mouse->showMouse(); _col = false; _coreVar._currPlace = LANDING; } _controlMenu = 0; _mouse->hideMouse(); clearScreen(); drawRightFrame(); _mouse->showMouse(); showPeoplePresent(_currBitIndex); prepareRoom(); drawClock(); prepareDisplayText(); /* chech;*/ _menu->setDestinationText(_coreVar._currPlace); clearVerbBar(); } /** * Engine function - Smell * @remarks Originally called 'tsentir' */ void MortevielleEngine::fctSmell() { _crep = 119; if (_caff < ROOM26) { if (!_syn) displayTextInVerbBar(getEngineString(S_SMELL)); displayStatusArrow(); if (!(_anyone) && !(_keyPressedEsc)) if (_caff == CRYPT) _crep = 153; } else if (_caff == 123) _crep = 110; _num = 0; } /** * Engine function - Scratch * @remarks Originally called 'tgratter' */ void MortevielleEngine::fctScratch() { _crep = 155; if (_caff < 27) { if (!_syn) displayTextInVerbBar(getEngineString(S_SCRATCH)); displayStatusArrow(); } _num = 0; } /** * The game is over * @remarks Originally called 'tmaj1' */ void MortevielleEngine::endGame() { _quitGame = true; displayNarrativePicture(13, 152); displayEmptyHand(); clearUpperLeftPart(); clearDescriptionBar(); clearVerbBar(); handleDescriptionText(9, 1509); testKey(false); _mouse->hideMouse(); _caff = 70; _text->taffich(); clearScreen(); drawDiscussionBox(); startDialog(141); _mouse->showMouse(); clearUpperLeftPart(); handleDescriptionText(9, 1509); handleDescriptionText(2, 142); testKey(false); _caff = 32; drawPictureWithText(); handleDescriptionText(6, 34); handleDescriptionText(2, 35); startMusicOrSpeech(0); testKey(false); displayInterScreenMessage(2036); testKey(false); resetVariables(); } /** * You lost! * @remarks Originally called 'tencore' */ void MortevielleEngine::askRestart() { clearDescriptionBar(); startMusicOrSpeech(0); testKey(false); displayEmptyHand(); resetVariables(); initGame(); _currHour = 10; _currHalfHour = 0; _currDay = 0; _minute = 0; _hour = 10; _day = 0; handleDescriptionText(2, 180); int answer = _dialogManager->show(getEngineString(S_YES_NO)); _quitGame = (answer != 1); } } // End of namespace Mortevielle