MORTEVIELLE: Use verb order stored in mort.dat

This commit is contained in:
Strangerke 2013-08-15 07:57:07 +02:00
parent 019f7e59fd
commit 563e62d625
6 changed files with 178 additions and 56 deletions

@ -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;

@ -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;

@ -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();

@ -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();

@ -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)

@ -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);