From 563e62d625e0b287a7eca1bb2f09c9a034a1a48b Mon Sep 17 00:00:00 2001 From: Strangerke Date: Thu, 15 Aug 2013 07:57:07 +0200 Subject: MORTEVIELLE: Use verb order stored in mort.dat --- engines/mortevielle/actions.cpp | 2 +- engines/mortevielle/menu.cpp | 107 +++++++++++++++++++++++++++++++++++- engines/mortevielle/menu.h | 57 +++++++++++-------- engines/mortevielle/mortevielle.cpp | 6 +- engines/mortevielle/outtext.cpp | 2 +- engines/mortevielle/utils.cpp | 60 ++++++++++---------- 6 files changed, 178 insertions(+), 56 deletions(-) diff --git a/engines/mortevielle/actions.cpp b/engines/mortevielle/actions.cpp index 2a66100e17..1b1e10daa2 100644 --- a/engines/mortevielle/actions.cpp +++ b/engines/mortevielle/actions.cpp @@ -584,7 +584,7 @@ void MortevielleEngine::fctOpen() { if (_caff == ROOM26) { if (_roomDoorId != OWN_ROOM) { - _currAction = OPCODE_ENTER; + _currAction = _menu.OPCODE_ENTER; _syn = true; } else _crep = 997; diff --git a/engines/mortevielle/menu.cpp b/engines/mortevielle/menu.cpp index f32c551ddb..c8f34991bd 100644 --- a/engines/mortevielle/menu.cpp +++ b/engines/mortevielle/menu.cpp @@ -48,6 +48,109 @@ const byte menuConstants[8][4] = { {62, 46, 13, 10} }; +Menu::Menu() { + OPCODE_ATTACH = OPCODE_WAIT = OPCODE_FORCE = OPCODE_SLEEP = OPCODE_NONE; + OPCODE_LISTEN = OPCODE_ENTER = OPCODE_CLOSE = OPCODE_SEARCH = OPCODE_NONE; + OPCODE_KNOCK = OPCODE_SCRATCH = OPCODE_READ = OPCODE_EAT = OPCODE_NONE; + OPCODE_PLACE = OPCODE_OPEN = OPCODE_TAKE = OPCODE_LOOK = OPCODE_NONE; + OPCODE_SMELL = OPCODE_SOUND = OPCODE_LEAVE = OPCODE_LIFT = OPCODE_NONE; + OPCODE_TURN = OPCODE_SHIDE = OPCODE_SSEARCH = OPCODE_SREAD = OPCODE_NONE; + OPCODE_SPUT = OPCODE_SLOOK = OPCODE_NONE; +} + +void Menu::readVerbNums(Common::File &f, int dataSize) { + // Figure out what language Id is needed + byte desiredLanguageId; + switch(_vm->getLanguage()) { + case Common::EN_ANY: + desiredLanguageId = MORTDAT_LANG_ENGLISH; + break; + case Common::FR_FRA: + desiredLanguageId = MORTDAT_LANG_FRENCH; + break; + case Common::DE_DEU: + desiredLanguageId = MORTDAT_LANG_GERMAN; + break; + default: + warning("Language not supported, switching to English"); + desiredLanguageId = MORTDAT_LANG_ENGLISH; + break; + } + // Read in the language + byte languageId = f.readByte(); + --dataSize; + + // If the language isn't correct, then skip the entire block + if (languageId != desiredLanguageId) { + f.skip(dataSize); + return; + } + + assert(dataSize == 52); + OPCODE_ATTACH = f.readUint16LE(); + OPCODE_WAIT = f.readUint16LE(); + OPCODE_FORCE = f.readUint16LE(); + OPCODE_SLEEP = f.readUint16LE(); + OPCODE_LISTEN = f.readUint16LE(); + OPCODE_ENTER = f.readUint16LE(); + OPCODE_CLOSE = f.readUint16LE(); + OPCODE_SEARCH = f.readUint16LE(); + OPCODE_KNOCK = f.readUint16LE(); + OPCODE_SCRATCH = f.readUint16LE(); + OPCODE_READ = f.readUint16LE(); + OPCODE_EAT = f.readUint16LE(); + OPCODE_PLACE = f.readUint16LE(); + OPCODE_OPEN = f.readUint16LE(); + OPCODE_TAKE = f.readUint16LE(); + OPCODE_LOOK = f.readUint16LE(); + OPCODE_SMELL = f.readUint16LE(); + OPCODE_SOUND = f.readUint16LE(); + OPCODE_LEAVE = f.readUint16LE(); + OPCODE_LIFT = f.readUint16LE(); + OPCODE_TURN = f.readUint16LE(); + OPCODE_SHIDE = f.readUint16LE(); + OPCODE_SSEARCH = f.readUint16LE(); + OPCODE_SREAD = f.readUint16LE(); + OPCODE_SPUT = f.readUint16LE(); + OPCODE_SLOOK = f.readUint16LE(); + + _actionMenu[0]._menuId = OPCODE_NONE >> 8; + _actionMenu[0]._actionId = OPCODE_NONE & 0xFF; + + _actionMenu[1]._menuId = OPCODE_SHIDE >> 8; + _actionMenu[1]._actionId = OPCODE_SHIDE & 0xFF; + + _actionMenu[2]._menuId = OPCODE_ATTACH >> 8; + _actionMenu[2]._actionId = OPCODE_ATTACH & 0xFF; + + _actionMenu[3]._menuId = OPCODE_FORCE >> 8; + _actionMenu[3]._actionId = OPCODE_FORCE & 0xFF; + + _actionMenu[4]._menuId = OPCODE_SLEEP >> 8; + _actionMenu[4]._actionId = OPCODE_SLEEP & 0xFF; + + _actionMenu[5]._menuId = OPCODE_ENTER >> 8; + _actionMenu[5]._actionId = OPCODE_ENTER & 0xFF; + + _actionMenu[6]._menuId = OPCODE_CLOSE >> 8; + _actionMenu[6]._menuId = OPCODE_CLOSE & 0xFF; + + _actionMenu[7]._menuId = OPCODE_KNOCK >> 8; + _actionMenu[7]._menuId = OPCODE_KNOCK & 0xFF; + + _actionMenu[8]._menuId = OPCODE_EAT >> 8; + _actionMenu[8]._menuId = OPCODE_EAT & 0xFF; + + _actionMenu[9]._menuId = OPCODE_PLACE >> 8; + _actionMenu[9]._menuId = OPCODE_PLACE & 0xFF; + + _actionMenu[10]._menuId = OPCODE_OPEN >> 8; + _actionMenu[10]._menuId = OPCODE_OPEN & 0xFF; + + _actionMenu[11]._menuId = OPCODE_LEAVE >> 8; + _actionMenu[11]._menuId = OPCODE_LEAVE & 0xFF; +} + /** * Setup a menu's contents * @remarks Originally called 'menut' @@ -486,9 +589,11 @@ void Menu::updateMenu() { } } -void Menu::initMenu(MortevielleEngine *vm) { +void Menu::setParent(MortevielleEngine *vm) { _vm = vm; +} +void Menu::initMenu() { int i; Common::File f; diff --git a/engines/mortevielle/menu.h b/engines/mortevielle/menu.h index 2428d8917b..a1b654ccaf 100644 --- a/engines/mortevielle/menu.h +++ b/engines/mortevielle/menu.h @@ -40,33 +40,13 @@ enum { MENU_LOAD = 8 }; -enum verbs {OPCODE_NONE = 0, OPCODE_ATTACH = 0x301, OPCODE_WAIT = 0x302, OPCODE_FORCE = 0x303, OPCODE_SLEEP = 0x304, OPCODE_LISTEN = 0x305, -OPCODE_ENTER = 0x306, OPCODE_CLOSE = 0x307, OPCODE_SEARCH = 0x308, OPCODE_KNOCK = 0x309, OPCODE_SCRATCH = 0x30a, -OPCODE_READ = 0x30b, OPCODE_EAT = 0x30c, OPCODE_PLACE = 0x30d, OPCODE_OPEN = 0x30e, OPCODE_TAKE = 0x30f, -OPCODE_LOOK = 0x310, OPCODE_SMELL = 0x311, OPCODE_SOUND = 0x312, OPCODE_LEAVE = 0x313, OPCODE_LIFT = 0x314, -OPCODE_TURN = 0x315, OPCODE_SHIDE = 0x401, OPCODE_SSEARCH = 0x402, OPCODE_SREAD = 0x403, OPCODE_SPUT = 0x404, -OPCODE_SLOOK = 0x405}; +const int OPCODE_NONE = 0; struct menuItem { int _menuId; int _actionId; }; -static const menuItem _actionMenu[12] = { - {OPCODE_NONE >> 8, OPCODE_NONE & 0xFF}, - {OPCODE_SHIDE >> 8, OPCODE_SHIDE & 0xFF}, - {OPCODE_ATTACH >> 8, OPCODE_ATTACH & 0xFF}, - {OPCODE_FORCE >> 8, OPCODE_FORCE & 0xFF}, - {OPCODE_SLEEP >> 8, OPCODE_SLEEP & 0xFF}, - {OPCODE_ENTER >> 8, OPCODE_ENTER & 0xFF}, - {OPCODE_CLOSE >> 8, OPCODE_CLOSE & 0xFF}, - {OPCODE_KNOCK >> 8, OPCODE_KNOCK & 0xFF}, - {OPCODE_EAT >> 8, OPCODE_EAT & 0xFF}, - {OPCODE_PLACE >> 8, OPCODE_PLACE & 0xFF}, - {OPCODE_OPEN >> 8, OPCODE_OPEN & 0xFF}, - {OPCODE_LEAVE >> 8, OPCODE_LEAVE & 0xFF} -}; - class Menu { private: MortevielleEngine *_vm; @@ -78,7 +58,10 @@ private: void util(Common::Point pos); void invert(int indx); void menuDown(int ii); + public: + Menu(); + bool _menuActive; bool _menuSelected; bool _multiTitle; @@ -92,6 +75,36 @@ public: menuItem _inventoryMenu[9]; menuItem _moveMenu[8]; + int OPCODE_ATTACH; + int OPCODE_WAIT; + int OPCODE_FORCE; + int OPCODE_SLEEP; + int OPCODE_LISTEN; + int OPCODE_ENTER; + int OPCODE_CLOSE; + int OPCODE_SEARCH; + int OPCODE_KNOCK; + int OPCODE_SCRATCH; + int OPCODE_READ; + int OPCODE_EAT; + int OPCODE_PLACE; + int OPCODE_OPEN; + int OPCODE_TAKE; + int OPCODE_LOOK; + int OPCODE_SMELL; + int OPCODE_SOUND; + int OPCODE_LEAVE; + int OPCODE_LIFT; + int OPCODE_TURN; + int OPCODE_SHIDE; + int OPCODE_SSEARCH; + int OPCODE_SREAD; + int OPCODE_SPUT; + int OPCODE_SLOOK; + menuItem _actionMenu[12]; + + void setParent(MortevielleEngine *vm); + void readVerbNums(Common::File &f, int dataSize); void setText(int menuId, int actionId, Common::String name); void setDestinationText(int roomId); void setInventoryText(); @@ -102,7 +115,7 @@ public: void menuUp(int msgId); void eraseMenu(); void updateMenu(); - void initMenu(MortevielleEngine *vm); + void initMenu(); void setSearchMenu(); void unsetSearchMenu(); diff --git a/engines/mortevielle/mortevielle.cpp b/engines/mortevielle/mortevielle.cpp index 7b2a648221..059bde4614 100644 --- a/engines/mortevielle/mortevielle.cpp +++ b/engines/mortevielle/mortevielle.cpp @@ -57,6 +57,7 @@ MortevielleEngine::MortevielleEngine(OSystem *system, const MortevielleGameDescr _text.setParent(this); _soundManager.setParent(this); _savegameManager.setParent(this); + _menu.setParent(this); _lastGameFrame = 0; _mouseClick = false; @@ -273,6 +274,8 @@ Common::ErrorCode MortevielleEngine::loadMortDat() { readStaticStrings(f, dataSize, kStaticStrings); } else if ((!strncmp(dataType, "GSTR", 4)) && (!_txxFileFl)) { readStaticStrings(f, dataSize, kGameStrings); + } else if (!strncmp(dataType, "VERB", 4)) { + _menu.readVerbNums(f, dataSize); } else { // Unknown section f.skip(dataSize); @@ -286,6 +289,7 @@ Common::ErrorCode MortevielleEngine::loadMortDat() { return Common::kNoError; } + /** * Read in a static strings block, and if the language matches, load up the static strings */ @@ -400,7 +404,7 @@ void MortevielleEngine::mainGame() { for (_crep = 1; _crep <= _x26KeyCount; ++_crep) decodeNumber(&_cfiecBuffer[161 * 16], (_cfiecBufferSize - (161 * 16)) / 64); - _menu.initMenu(this); + _menu.initMenu(); charToHour(); initGame(); diff --git a/engines/mortevielle/outtext.cpp b/engines/mortevielle/outtext.cpp index 99c06c7c4c..9451e655dd 100644 --- a/engines/mortevielle/outtext.cpp +++ b/engines/mortevielle/outtext.cpp @@ -314,7 +314,7 @@ void TextHandler::taffich() { loadAniFile(filename, drawingStartPos, drawingSize); } _vm->_mouse.showMouse(); - if ((a < COAT_ARMS) && ((_vm->_maff < COAT_ARMS) || (_vm->_coreVar._currPlace == LANDING)) && (_vm->_currAction != OPCODE_ENTER)) { + if ((a < COAT_ARMS) && ((_vm->_maff < COAT_ARMS) || (_vm->_coreVar._currPlace == LANDING)) && (_vm->_currAction != _vm->_menu.OPCODE_ENTER)) { if ((a == ATTIC) || (a == CELLAR)) _vm->displayAloneText(); else if (!_vm->_blo) diff --git a/engines/mortevielle/utils.cpp b/engines/mortevielle/utils.cpp index fff53dbc30..3cacbec630 100644 --- a/engines/mortevielle/utils.cpp +++ b/engines/mortevielle/utils.cpp @@ -327,9 +327,9 @@ void MortevielleEngine::handleAction() { if (_mouse._pos.y < 12) return; - if ((_currAction == OPCODE_SOUND) || (_currAction == OPCODE_LIFT)) { + if ((_currAction == _menu.OPCODE_SOUND) || (_currAction == _menu.OPCODE_LIFT)) { handledOpcodeFl = true; - if ((_currAction == OPCODE_LIFT) || (_obpart)) { + if ((_currAction == _menu.OPCODE_LIFT) || (_obpart)) { endSearch(); _caff = _coreVar._currPlace; _crep = 998; @@ -1536,7 +1536,7 @@ void MortevielleEngine::handleOpcode() { _keyPressedEsc = false; if (!_anyone) { if (_uptodatePresence) { - if ((_currMenu == MENU_MOVE) || (_currAction == OPCODE_LEAVE) || (_currAction == OPCODE_SLEEP) || (_currAction == OPCODE_EAT)) { + if ((_currMenu == MENU_MOVE) || (_currAction == _menu.OPCODE_LEAVE) || (_currAction == _menu.OPCODE_SLEEP) || (_currAction == _menu.OPCODE_EAT)) { _controlMenu = 4; menuUp(); return; @@ -1548,59 +1548,59 @@ void MortevielleEngine::handleOpcode() { fctDiscuss(); if (_currMenu == MENU_INVENTORY) fctInventoryTake(); - if (_currAction == OPCODE_ATTACH) + if (_currAction == _menu.OPCODE_ATTACH) fctAttach(); - if (_currAction == OPCODE_WAIT) + if (_currAction == _menu.OPCODE_WAIT) fctWait(); - if (_currAction == OPCODE_FORCE) + if (_currAction == _menu.OPCODE_FORCE) fctForce(); - if (_currAction == OPCODE_SLEEP) + if (_currAction == _menu.OPCODE_SLEEP) fctSleep(); - if (_currAction == OPCODE_LISTEN) + if (_currAction == _menu.OPCODE_LISTEN) fctListen(); - if (_currAction == OPCODE_ENTER) + if (_currAction == _menu.OPCODE_ENTER) fctEnter(); - if (_currAction == OPCODE_CLOSE) + if (_currAction == _menu.OPCODE_CLOSE) fctClose(); - if (_currAction == OPCODE_SEARCH) + if (_currAction == _menu.OPCODE_SEARCH) fctSearch(); - if (_currAction == OPCODE_KNOCK) + if (_currAction == _menu.OPCODE_KNOCK) fctKnock(); - if (_currAction == OPCODE_SCRATCH) + if (_currAction == _menu.OPCODE_SCRATCH) fctScratch(); - if (_currAction == OPCODE_READ) + if (_currAction == _menu.OPCODE_READ) fctRead(); - if (_currAction == OPCODE_EAT) + if (_currAction == _menu.OPCODE_EAT) fctEat(); - if (_currAction == OPCODE_PLACE) + if (_currAction == _menu.OPCODE_PLACE) fctPlace(); - if (_currAction == OPCODE_OPEN) + if (_currAction == _menu.OPCODE_OPEN) fctOpen(); - if (_currAction == OPCODE_TAKE) + if (_currAction == _menu.OPCODE_TAKE) fctTake(); - if (_currAction == OPCODE_LOOK) + if (_currAction == _menu.OPCODE_LOOK) fctLook(); - if (_currAction == OPCODE_SMELL) + if (_currAction == _menu.OPCODE_SMELL) fctSmell(); - if (_currAction == OPCODE_SOUND) + if (_currAction == _menu.OPCODE_SOUND) fctSound(); - if (_currAction == OPCODE_LEAVE) + if (_currAction == _menu.OPCODE_LEAVE) fctLeave(); - if (_currAction == OPCODE_LIFT) + if (_currAction == _menu.OPCODE_LIFT) fctLift(); - if (_currAction == OPCODE_TURN) + if (_currAction == _menu.OPCODE_TURN) fctTurn(); - if (_currAction == OPCODE_SSEARCH) + if (_currAction == _menu.OPCODE_SSEARCH) fctSelfSearch(); - if (_currAction == OPCODE_SREAD) + if (_currAction == _menu.OPCODE_SREAD) fctSelfRead(); - if (_currAction == OPCODE_SPUT) + if (_currAction == _menu.OPCODE_SPUT) fctSelfPut(); - if (_currAction == OPCODE_SLOOK) + if (_currAction == _menu.OPCODE_SLOOK) fctSelftLook(); _hiddenHero = false; - if (_currAction == OPCODE_SHIDE) + if (_currAction == _menu.OPCODE_SHIDE) fctSelfHide(); } else { if (_anyone) { @@ -3400,7 +3400,7 @@ void MortevielleEngine::displayLookScreen(int objId) { int mdes = _caff; _caff = objId; - if (((_caff > 29) && (_caff < 33)) || (_caff == 144) || (_caff == 147) || (_caff == 149) || (_currAction == OPCODE_SLOOK)) { + if (((_caff > 29) && (_caff < 33)) || (_caff == 144) || (_caff == 147) || (_caff == 149) || (_currAction == _menu.OPCODE_SLOOK)) { drawPictureWithText(); if ((_caff > 29) && (_caff < 33)) handleDescriptionText(2, _caff); -- cgit v1.2.3