mirror of
https://github.com/libretro/scummvm.git
synced 2025-03-02 16:31:01 +00:00
MORTEVIELLE: Use verb order stored in mort.dat
This commit is contained in:
parent
019f7e59fd
commit
563e62d625
engines/mortevielle
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user