MORTEVIELLE: More renaming and refactoring

This commit is contained in:
Strangerke 2012-03-24 22:00:28 +01:00
parent 7b94de6408
commit 4b9e71952c
12 changed files with 515 additions and 598 deletions

View File

@ -1575,7 +1575,7 @@ void MortevielleEngine::endGame() {
testKey(false);
_mouse.hideMouse();
_caff = 70;
taffich();
_text.taffich();
hirs();
premtet();
startDialog(141);

View File

@ -27,7 +27,6 @@
#include "common/str.h"
#include "mortevielle/dialogs.h"
#include "mortevielle/keyboard.h"
#include "mortevielle/mortevielle.h"
#include "mortevielle/mouse.h"
#include "mortevielle/outtext.h"
@ -307,7 +306,7 @@ bool KnowledgeCheck::show() {
dialogHeight = 23;
g_vm->_screenSurface.fillRect(15, Common::Rect(0, 14, 630, dialogHeight));
Common::String tmpStr = g_vm->getString(textIndexArr[indx]);
displayStr(tmpStr, 20, 15, 100, 2, 0);
g_vm->_text.displayStr(tmpStr, 20, 15, 100, 2, 0);
if (indx != 9) {
firstOption = textIndexArr[indx] + 1;
@ -324,7 +323,7 @@ bool KnowledgeCheck::show() {
tmpStr = g_vm->getString(j);
if ((int) tmpStr.size() > maxLength)
maxLength = tmpStr.size();
displayStr(tmpStr, 100, optionPosY, 100, 1, 0);
g_vm->_text.displayStr(tmpStr, 100, optionPosY, 100, 1, 0);
choiceArray[prevChoice] = tmpStr;
optionPosY += 8;
}
@ -362,16 +361,16 @@ bool KnowledgeCheck::show() {
if (coor[currChoice]._enabled) {
if ((prevChoice != 0) && (prevChoice != currChoice)) {
tmpStr = choiceArray[prevChoice] + '$';
displayStr(tmpStr, 100, 27 + (prevChoice * 8), 100, 1, 0);
g_vm->_text.displayStr(tmpStr, 100, 27 + (prevChoice * 8), 100, 1, 0);
}
if (prevChoice != currChoice) {
tmpStr = choiceArray[currChoice] + '$';
displayStr(tmpStr, 100, 27 + (currChoice * 8), 100, 1, 1);
g_vm->_text.displayStr(tmpStr, 100, 27 + (currChoice * 8), 100, 1, 1);
prevChoice = currChoice;
}
} else if (prevChoice != 0) {
tmpStr = choiceArray[prevChoice] + '$';
displayStr(tmpStr, 100, 27 + (prevChoice * 8), 100, 1, 0);
g_vm->_text.displayStr(tmpStr, 100, 27 + (prevChoice * 8), 100, 1, 0);
prevChoice = 0;
}
} while (!((prevChoice != 0) && g_vm->getMouseClick()));
@ -420,7 +419,7 @@ void f3f8::draw() {
* @remarks Originally called 'diver'
*/
void f3f8::checkForF8(int SpeechNum, bool drawAni50Fl) {
teskbd();
g_vm->testKeyboard();
do {
g_vm->_speechManager.startSpeech(SpeechNum, 0, 0);
g_vm->_key = waitForF3F8();
@ -442,7 +441,7 @@ int f3f8::waitForF3F8() {
int key;
do {
key = testou();
key = g_vm->testou();
if (g_vm->shouldQuit())
return key;
} while ((key != 61) && (key != 66));
@ -453,7 +452,7 @@ int f3f8::waitForF3F8() {
void f3f8::aff50(bool drawAni50Fl) {
g_vm->_caff = 50;
g_vm->_maff = 0;
taffich();
g_vm->_text.taffich();
g_vm->draw(kAdrDes, 63, 12);
if (drawAni50Fl)
ani50();

View File

@ -1,71 +0,0 @@
/* 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) 1988-1989 Lankhor
*/
#include "mortevielle/mortevielle.h"
#include "mortevielle/keyboard.h"
#include "mortevielle/var_mor.h"
namespace Mortevielle {
char readkey1() {
char c = g_vm->getChar();
return c;
}
int testou() {
char ch = g_vm->getChar();
switch (ch) {
case '\23' :
g_vm->_soundOff = !g_vm->_soundOff;
break;
case '\26' :
if ((g_vm->_c_zzz == 1) || (g_vm->_c_zzz == 2)) {
g_vm->decodeNumber(&g_vm->_cfiecBuffer[161 * 16], ((822 * 128) - (161 * 16)) / 64);
++g_vm->_c_zzz;
return 61;
}
break;
case '\33' :
if (g_vm->keyPressed())
ch = g_vm->getChar();
break;
default:
break;
}
return ord(ch);
}
void teskbd() {
if (g_vm->keyPressed())
testou();
}
} // End of namespace Mortevielle

View File

@ -1,38 +0,0 @@
/* 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) 1988-1989 Lankhor
*/
#ifndef MORTEVIELLE_KEYBOARD_H
#define MORTEVIELLE_KEYBOARD_H
namespace Mortevielle {
extern char readkey1();
extern int testou();
extern void teskbd();
} // End of namespace Mortevielle
#endif

View File

@ -5,7 +5,6 @@ MODULE_OBJS := \
detection.o \
dialogs.o \
graphics.o \
keyboard.o \
menu.o \
mortevielle.o \
mouse.o \

View File

@ -30,7 +30,6 @@
#include "graphics/pixelformat.h"
#include "mortevielle/mortevielle.h"
#include "mortevielle/dialogs.h"
#include "mortevielle/keyboard.h"
#include "mortevielle/menu.h"
#include "mortevielle/mouse.h"
#include "mortevielle/outtext.h"
@ -208,10 +207,10 @@ Common::ErrorCode MortevielleEngine::initialise() {
_soundOff = false;
_largestClearScreen = false;
teskbd();
testKeyboard();
showConfigScreen();
_newGraphicalDevice = _currGraphicalDevice;
teskbd();
testKeyboard();
if (_newGraphicalDevice != _currGraphicalDevice)
_currGraphicalDevice = _newGraphicalDevice;
hirs();
@ -693,7 +692,7 @@ void MortevielleEngine::handleAction() {
handleOpcode();
if ((_controlMenu == 0) && (! _loseGame) && (! _endGame)) {
taffich();
g_vm->_text.taffich();
if (_okdes) {
_okdes = false;
dessin();
@ -1706,7 +1705,7 @@ void MortevielleEngine::startDialog(int16 rep) {
_mouse.hideMouse();
Common::String dialogStr = getString(rep + kDialogStringIndex);
displayStr(dialogStr, 230, 4, 65, 24, 5);
_text.displayStr(dialogStr, 230, 4, 65, 24, 5);
f3f8::draw();
key = 0;
@ -2512,8 +2511,8 @@ void MortevielleEngine::showTitleScreen() {
hirs();
repon(7, 2035);
_caff = 51;
taffich();
teskbd();
_text.taffich();
testKeyboard();
if (_newGraphicalDevice != _currGraphicalDevice)
_currGraphicalDevice = _newGraphicalDevice;
hirs();
@ -2898,7 +2897,7 @@ void MortevielleEngine::text1(int x, int y, int nb, int m) {
Common::String tmpStr = getString(m);
if ((y == 182) && ((int) tmpStr.size() * co > nb * 6))
y = 176;
displayStr(tmpStr, x, y, nb, 20, _textColor);
_text.displayStr(tmpStr, x, y, nb, 20, _textColor);
}
void MortevielleEngine::repon(int f, int m) {
@ -2911,7 +2910,7 @@ void MortevielleEngine::repon(int f, int m) {
_largestClearScreen = false;
clearScreenType2();
displayStr(tmpStr, 8, 176, 85, 3, 5);
_text.displayStr(tmpStr, 8, 176, 85, 3, 5);
} else {
modif(m);
switch (f) {
@ -2940,7 +2939,7 @@ void MortevielleEngine::repon(int f, int m) {
i = 5;
Common::String tmpStr = getString(m);
displayStr(tmpStr, 80, 40, 60, 25, i);
_text.displayStr(tmpStr, 80, 40, 60, 25, i);
if (m == 180)
_coreVar._pourc[6] = '*';
@ -3288,7 +3287,7 @@ void MortevielleEngine::dessin() {
}
void MortevielleEngine::afdes() {
taffich();
_text.taffich();
dessin();
_okdes = false;
}
@ -3424,38 +3423,38 @@ void MortevielleEngine::getSearchDescription(int objId) {
}
void MortevielleEngine::mennor() {
g_vm->_menu.menuUp(g_vm->_msg[3]);
_menu.menuUp(_msg[3]);
}
void MortevielleEngine::premtet() {
g_vm->draw(kAdrDes, 10, 80);
g_vm->_screenSurface.drawBox(18, 79, 155, 91, 15);
draw(kAdrDes, 10, 80);
_screenSurface.drawBox(18, 79, 155, 91, 15);
}
void MortevielleEngine::ajchai() {
int cy = kAcha + ((g_vm->_mchai - 1) * 10) - 1;
int cy = kAcha + ((_mchai - 1) * 10) - 1;
int cx = 0;
do {
++cx;
} while ((cx <= 9) && (g_vm->_tabdon[cy + cx] != 0));
} while ((cx <= 9) && (_tabdon[cy + cx] != 0));
if (g_vm->_tabdon[cy + cx] == 0)
g_vm->_tabdon[cy + cx] = g_vm->_coreVar._selectedObjectId;
if (_tabdon[cy + cx] == 0)
_tabdon[cy + cx] = _coreVar._selectedObjectId;
else
g_vm->_crep = 192;
_crep = 192;
}
void MortevielleEngine::ajjer(int ob) {
int cx = 0;
do {
++cx;
} while ((cx <= 5) && (ord(g_vm->_coreVar._sjer[cx]) != 0));
} while ((cx <= 5) && (ord(_coreVar._sjer[cx]) != 0));
if (ord(g_vm->_coreVar._sjer[cx]) == 0) {
g_vm->_coreVar._sjer[(cx)] = chr(ob);
g_vm->_menu.setInventoryText();
if (ord(_coreVar._sjer[cx]) == 0) {
_coreVar._sjer[(cx)] = chr(ob);
_menu.setInventoryText();
} else
g_vm->_crep = 139;
_crep = 139;
}
/**
@ -3463,77 +3462,77 @@ void MortevielleEngine::ajjer(int ob) {
* @remarks Originally called 'quelquun'
*/
void MortevielleEngine::interactNPC() {
if (g_vm->_menu._menuDisplayed)
g_vm->_menu.eraseMenu();
if (_menu._menuDisplayed)
_menu.eraseMenu();
g_vm->endSearch();
g_vm->_crep = 997;
endSearch();
_crep = 997;
L1:
if (!g_vm->_hiddenHero) {
if (g_vm->_crep == 997)
g_vm->_crep = 138;
g_vm->repon(2, g_vm->_crep);
if (g_vm->_crep == 138)
g_vm->_speechManager.startSpeech(5, 2, 1);
if (!_hiddenHero) {
if (_crep == 997)
_crep = 138;
repon(2, _crep);
if (_crep == 138)
_speechManager.startSpeech(5, 2, 1);
else
g_vm->_speechManager.startSpeech(4, 4, 1);
_speechManager.startSpeech(4, 4, 1);
if (g_vm->_iouv == 0)
g_vm->_coreVar._faithScore += 2;
else if (g_vm->_coreVar._faithScore < 50)
g_vm->_coreVar._faithScore += 4;
if (_iouv == 0)
_coreVar._faithScore += 2;
else if (_coreVar._faithScore < 50)
_coreVar._faithScore += 4;
else
g_vm->_coreVar._faithScore += 3 * (g_vm->_coreVar._faithScore / 10);
g_vm->exitRoom();
g_vm->_menu.setDestinationText(LANDING);
int cx = g_vm->convertBitIndexToCharacterIndex(g_vm->_currBitIndex);
g_vm->_caff = 69 + cx;
g_vm->_crep = g_vm->_caff;
g_vm->_msg[3] = MENU_DISCUSS;
g_vm->_msg[4] = g_vm->_menu._discussMenu[cx];
g_vm->_syn = true;
g_vm->_col = true;
_coreVar._faithScore += 3 * (_coreVar._faithScore / 10);
exitRoom();
_menu.setDestinationText(LANDING);
int cx = convertBitIndexToCharacterIndex(_currBitIndex);
_caff = 69 + cx;
_crep = _caff;
_msg[3] = MENU_DISCUSS;
_msg[4] = _menu._discussMenu[cx];
_syn = true;
_col = true;
} else {
if (g_vm->getRandomNumber(1, 3) == 2) {
g_vm->_hiddenHero = false;
g_vm->_crep = 137;
if (getRandomNumber(1, 3) == 2) {
_hiddenHero = false;
_crep = 137;
goto L1;
} else {
g_vm->repon(2, 136);
int rand = (g_vm->getRandomNumber(0, 4)) - 2;
g_vm->_speechManager.startSpeech(3, rand, 1);
g_vm->clearScreenType2();
g_vm->displayAloneText();
g_vm->resetRoomVariables(MANOR_FRONT);
g_vm->affrep();
repon(2, 136);
int rand = (getRandomNumber(0, 4)) - 2;
_speechManager.startSpeech(3, rand, 1);
clearScreenType2();
displayAloneText();
resetRoomVariables(MANOR_FRONT);
affrep();
}
}
if (g_vm->_menu._menuDisplayed)
g_vm->_menu.drawMenu();
if (_menu._menuDisplayed)
_menu.drawMenu();
}
void MortevielleEngine::tsuiv() {
int tbcl;
int cy = kAcha + ((g_vm->_mchai - 1) * 10) - 1;
int cy = kAcha + ((_mchai - 1) * 10) - 1;
int cx = 0;
do {
++cx;
++g_vm->_cs;
int cl = cy + g_vm->_cs;
tbcl = g_vm->_tabdon[cl];
} while ((tbcl == 0) && (g_vm->_cs <= 9));
++_cs;
int cl = cy + _cs;
tbcl = _tabdon[cl];
} while ((tbcl == 0) && (_cs <= 9));
if ((tbcl != 0) && (g_vm->_cs < 11)) {
++g_vm->_is;
g_vm->_caff = tbcl;
g_vm->_crep = g_vm->_caff + 400;
if (g_vm->_currBitIndex != 0)
g_vm->_coreVar._faithScore += 2;
if ((tbcl != 0) && (_cs < 11)) {
++_is;
_caff = tbcl;
_crep = _caff + 400;
if (_currBitIndex != 0)
_coreVar._faithScore += 2;
} else {
g_vm->affrep();
g_vm->endSearch();
affrep();
endSearch();
if (cx > 9)
g_vm->_crep = 131;
_crep = 131;
}
}
@ -3541,7 +3540,7 @@ void MortevielleEngine::tfleche() {
bool qust;
char touch;
if (g_vm->_num == 9999)
if (_num == 9999)
return;
fenat(chr(152));
@ -3550,24 +3549,24 @@ void MortevielleEngine::tfleche() {
touch = '\0';
do {
g_vm->_mouse.moveMouse(qust, touch);
_mouse.moveMouse(qust, touch);
CHECK_QUIT;
if (g_vm->getMouseClick())
inRect = (g_vm->_mouse._pos.x < 256 * g_vm->_res) && (g_vm->_mouse._pos.y < 176) && (g_vm->_mouse._pos.y > 12);
g_vm->prepareRoom();
} while (!(qust || inRect || g_vm->_anyone));
if (getMouseClick())
inRect = (_mouse._pos.x < 256 * _res) && (_mouse._pos.y < 176) && (_mouse._pos.y > 12);
prepareRoom();
} while (!(qust || inRect || _anyone));
if (qust && (touch == '\103'))
Alert::show(g_vm->_hintPctMessage, 1);
} while (!((touch == '\73') || ((touch == '\104') && (g_vm->_x != 0) && (g_vm->_y != 0)) || (g_vm->_anyone) || (inRect)));
Alert::show(_hintPctMessage, 1);
} while (!((touch == '\73') || ((touch == '\104') && (_x != 0) && (_y != 0)) || (_anyone) || (inRect)));
if (touch == '\73')
g_vm->_keyPressedEsc = true;
_keyPressedEsc = true;
if (inRect) {
g_vm->_x = g_vm->_mouse._pos.x;
g_vm->_y = g_vm->_mouse._pos.y;
_x = _mouse._pos.x;
_y = _mouse._pos.y;
}
}
@ -3580,92 +3579,92 @@ void MortevielleEngine::setCoordinates(int sx) {
int ib;
g_vm->_num = 0;
g_vm->_crep = 999;
_num = 0;
_crep = 999;
int a = 0;
int atdon = amzon + 3;
int cy = 0;
while (cy < g_vm->_caff) {
a += g_vm->_tabdon[atdon];
while (cy < _caff) {
a += _tabdon[atdon];
atdon += 4;
++cy;
}
if (g_vm->_tabdon[atdon] == 0) {
g_vm->_crep = 997;
if (_tabdon[atdon] == 0) {
_crep = 997;
return;
}
a += kFleche;
int cb = 0;
for (cy = 0; cy <= (sx - 2); ++cy) {
ib = (g_vm->_tabdon[a + cb] << 8) + g_vm->_tabdon[(a + cb + 1)];
ib = (_tabdon[a + cb] << 8) + _tabdon[(a + cb + 1)];
cb += (ib * 4) + 2;
}
ib = (g_vm->_tabdon[a + cb] << 8) + g_vm->_tabdon[(a + cb + 1)];
ib = (_tabdon[a + cb] << 8) + _tabdon[(a + cb + 1)];
if (ib == 0) {
g_vm->_crep = 997;
_crep = 997;
return;
}
cy = 1;
do {
cb += 2;
sx = g_vm->_tabdon[a + cb] * g_vm->_res;
sy = g_vm->_tabdon[(a + cb + 1)];
sx = _tabdon[a + cb] * _res;
sy = _tabdon[(a + cb + 1)];
cb += 2;
ix = g_vm->_tabdon[a + cb] * g_vm->_res;
iy = g_vm->_tabdon[(a + cb + 1)];
ix = _tabdon[a + cb] * _res;
iy = _tabdon[(a + cb + 1)];
++cy;
} while (!(((g_vm->_x >= sx) && (g_vm->_x <= ix) && (g_vm->_y >= sy) && (g_vm->_y <= iy)) || (cy > ib)));
} while (!(((_x >= sx) && (_x <= ix) && (_y >= sy) && (_y <= iy)) || (cy > ib)));
if ((g_vm->_x >= sx) && (g_vm->_x <= ix) && (g_vm->_y >= sy) && (g_vm->_y <= iy)) {
g_vm->_num = cy - 1;
if ((_x >= sx) && (_x <= ix) && (_y >= sy) && (_y <= iy)) {
_num = cy - 1;
return;
}
g_vm->_crep = 997;
_crep = 997;
}
void MortevielleEngine::treg(int objId) {
int mdes = g_vm->_caff;
g_vm->_caff = objId;
int mdes = _caff;
_caff = objId;
if (((g_vm->_caff > 29) && (g_vm->_caff < 33)) || (g_vm->_caff == 144) || (g_vm->_caff == 147) || (g_vm->_caff == 149) || (g_vm->_msg[4] == OPCODE_SLOOK)) {
g_vm->afdes();
if ((g_vm->_caff > 29) && (g_vm->_caff < 33))
g_vm->repon(2, g_vm->_caff);
if (((_caff > 29) && (_caff < 33)) || (_caff == 144) || (_caff == 147) || (_caff == 149) || (_msg[4] == OPCODE_SLOOK)) {
afdes();
if ((_caff > 29) && (_caff < 33))
repon(2, _caff);
else
g_vm->repon(2, g_vm->_caff + 400);
g_vm->testKey(true);
g_vm->_caff = mdes;
g_vm->_msg[3] = 0;
g_vm->_crep = 998;
repon(2, _caff + 400);
testKey(true);
_caff = mdes;
_msg[3] = 0;
_crep = 998;
} else {
g_vm->_obpart = true;
g_vm->_crep = g_vm->_caff + 400;
g_vm->_menu.setSearchMenu();
_obpart = true;
_crep = _caff + 400;
_menu.setSearchMenu();
}
}
void MortevielleEngine::avpoing(int &objId) {
g_vm->_crep = 999;
if (g_vm->_coreVar._selectedObjectId != 0)
g_vm->ajjer(g_vm->_coreVar._selectedObjectId);
_crep = 999;
if (_coreVar._selectedObjectId != 0)
ajjer(_coreVar._selectedObjectId);
if (g_vm->_crep != 139) {
g_vm->displayItemInHand(objId + 400);
g_vm->_coreVar._selectedObjectId = objId;
if (_crep != 139) {
displayItemInHand(objId + 400);
_coreVar._selectedObjectId = objId;
objId = 0;
}
}
void MortevielleEngine::rechai(int &ch) {
int tmpPlace = g_vm->_coreVar._currPlace;
int tmpPlace = _coreVar._currPlace;
if (g_vm->_coreVar._currPlace == CRYPT)
if (_coreVar._currPlace == CRYPT)
tmpPlace = CELLAR;
ch = g_vm->_tabdon[achai + (tmpPlace * 7) + g_vm->_num - 1];
ch = _tabdon[achai + (tmpPlace * 7) + _num - 1];
}
/**
@ -3673,9 +3672,9 @@ void MortevielleEngine::rechai(int &ch) {
* @remarks Originally called 't23coul'
*/
int MortevielleEngine::checkLeaveSecretPassage() {
if (!g_vm->checkInventory(143)) {
g_vm->_crep = 1512;
g_vm->loseGame();
if (!checkInventory(143)) {
_crep = 1512;
loseGame();
}
return CELLAR;
@ -3684,17 +3683,52 @@ int MortevielleEngine::checkLeaveSecretPassage() {
void MortevielleEngine::fenat(char ans) {
int coul;
g_vm->_mouse.hideMouse();
if (g_vm->_currGraphicalDevice == MODE_CGA)
_mouse.hideMouse();
if (_currGraphicalDevice == MODE_CGA)
coul = 2;
else if (g_vm->_currGraphicalDevice == MODE_HERCULES)
else if (_currGraphicalDevice == MODE_HERCULES)
coul = 1;
else
coul = 12;
g_vm->_screenSurface.writeCharacter(Common::Point(306, 193), ord(ans), coul);
g_vm->_screenSurface.drawBox(300, 191, 16, 8, 15);
g_vm->_mouse.showMouse();
_screenSurface.writeCharacter(Common::Point(306, 193), ord(ans), coul);
_screenSurface.drawBox(300, 191, 16, 8, 15);
_mouse.showMouse();
}
/**
* Test Keyboard
* @remarks Originally called 'teskbd'
*/
void MortevielleEngine::testKeyboard() {
if (keyPressed())
testou();
}
int MortevielleEngine::testou() {
char ch = getChar();
switch (ch) {
case '\23' :
_soundOff = !_soundOff;
break;
case '\26' :
if ((_c_zzz == 1) || (_c_zzz == 2)) {
decodeNumber(&_cfiecBuffer[161 * 16], ((822 * 128) - (161 * 16)) / 64);
++_c_zzz;
return 61;
}
break;
case '\33' :
if (keyPressed())
ch = getChar();
break;
default:
break;
}
return ord(ch);
}
void MortevielleEngine::sauvecr(int y, int dy) {

View File

@ -38,9 +38,32 @@
#include "mortevielle/saveload.h"
#include "mortevielle/sound.h"
#include "mortevielle/speech.h"
#include "mortevielle/outtext.h"
namespace Mortevielle {
/*---------------------------------------------------------------------------*/
/*------------------- MEMORY MAP ------------------------*/
/*---------------------------------------------------------------------------*/
/* The following is a list of physical addresses in memory currently used
* by the game.
*
* Address
* -------
* 5000:0 - Music data
* 6000:0 - Decompressed current image
* 7000:0+ - Compressed images
* 7000:2 - 16 words representing palette map
* 7000:4138 - width, height, x/y offset of decoded image
*/
#define ord(v) ((int) v)
#define chr(v) ((unsigned char) v)
#define lo(v) ((v) & 0xff)
#define hi(v) (((v) >> 8) & 0xff)
#define swap(v) (((lo(v)) << 8) | ((hi(v)) >> 8))
#define odd(v) (((v) % 2) == 1)
// Debug channels
enum {
kMortevielleCore = 1 << 0,
@ -73,12 +96,6 @@ enum DataType {
kGameStrings = 1
};
static const int _actionMenu[12] = { OPCODE_NONE,
OPCODE_SHIDE, OPCODE_ATTACH, OPCODE_FORCE, OPCODE_SLEEP,
OPCODE_ENTER, OPCODE_CLOSE, OPCODE_KNOCK, OPCODE_EAT,
OPCODE_PLACE, OPCODE_OPEN, OPCODE_LEAVE
};
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 400
#define SCREEN_ORIG_HEIGHT 200
@ -101,6 +118,51 @@ const int arep = 1314;
const int amzon = 1650;
const int arega = 0;
const int kMaxTi = 7975;
const int kMaxTd = 600;
const int kDescriptionStringIndex = 0; // Unused
const int kInventoryStringIndex = 186;
const int kQuestionStringIndex = 247;
const int kDialogStringIndex = 292;
const int kMenuPlaceStringIndex = 435;
const int kMenuActionStringIndex = 476;
const int kMenuSelfStringIndex = 497;
const int kMenuSayStringIndex = 502;
const int kSecretPassageQuestionStringIndex = 510; // Unusued?
const int kMaxPatt = 20;
const int OPCODE_NONE = 0;
enum verbs {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};
static const int _actionMenu[12] = { OPCODE_NONE,
OPCODE_SHIDE, OPCODE_ATTACH, OPCODE_FORCE, OPCODE_SLEEP,
OPCODE_ENTER, OPCODE_CLOSE, OPCODE_KNOCK, OPCODE_EAT,
OPCODE_PLACE, OPCODE_OPEN, OPCODE_LEAVE
};
/*
9 "A glance at the forbidden$",
18 "It's already open$",
26 "A photograph$",
27 "The coat of arms$",
*/
enum places {
OWN_ROOM = 0, GREEN_ROOM = 1, PURPLE_ROOM = 2, TOILETS = 3, DARKBLUE_ROOM = 4,
BLUE_ROOM = 5, RED_ROOM = 6, BATHROOM = 7, GREEN_ROOM2 = 8, ROOM9 = 9,
DINING_ROOM = 10, BUREAU = 11, KITCHEN = 12, ATTIC = 13, CELLAR = 14,
LANDING = 15, CRYPT = 16, SECRET_PASSAGE = 17, ROOM18 = 18, MOUNTAIN = 19,
CHAPEL = 20, MANOR_FRONT = 21, MANOR_BACK = 22, INSIDE_WELL = 23, WELL = 24,
DOOR = 25, ROOM26 = 26, ROOM27 = 27
};
enum GraphicModes { MODE_AMSTRAD1512 = 0, MODE_CGA = 1, MODE_EGA = 2, MODE_HERCULES = 3, MODE_TANDY = 4 };
struct nhom {
byte _id; /* number between 0 and 32 */
byte _hom[4];
@ -144,15 +206,79 @@ private:
const ADGameDescription *_gameDescription;
Common::Stack<int> _keypresses;
uint32 _lastGameFrame;
bool _mouseClick;
Common::Point _mousePos;
bool _inMainGameLoop; // Flag when the main game loop is active
Common::StringArray _engineStrings;
Common::StringArray _gameStrings;
Pattern _patternArr[15];
int _menuOpcode;
bool _mouseClick;
bool _inMainGameLoop; // Flag when the main game loop is active
bool _quitGame; // Quit game flag. Originally called 'arret'
bool _endGame; // End game flag. Originally called 'solu'
bool _loseGame; // Lose game flag. Originally called 'perdu'
bool _txxFileFl; // Flag used to determine if texts are from the original files or from a DAT file
bool _roomPresenceLuc;
bool _roomPresenceIda;
bool _purpleRoomPresenceLeo;
bool _roomPresenceGuy;
bool _roomPresenceEva;
bool _roomPresenceMax;
bool _roomPresenceBob;
bool _roomPresencePat;
bool _toiletsPresenceBobMax;
bool _bathRoomPresenceBobMax;
bool _room9PresenceLeo;
bool _hiddenHero;
bool _heroSearching;
bool _keyPressedEsc;
bool _reloadCFIEC;
bool _col;
bool _syn;
bool _obpart;
bool _anyone;
bool _brt;
int _textColor;
int _place;
int _manorDistance;
int _currBitIndex;
int _currDay;
int _currHour;
int _currHalfHour;
int _day;
int _hour;
int _minute;
int _mchai;
int _controlMenu;
int _startHour;
int _endHour;
Common::Point _stdPal[91][17];
t_pcga _cgaPal[91];
int _c_zzz;
int _ment;
int _iouv;
int _dobj;
int _num;
int _cs;
int _prebru;
int _t;
int _x;
int _y;
int _jh;
int _mh;
Common::String _hintPctMessage;
byte _cfiecBuffer[822 * 128];
byte _touv[8];
int _nbrep[9];
int _nbrepm[9];
uint16 _inpBuffer[kMaxTi + 1];
Hint _ntpBuffer[kMaxTd + 1];
Common::ErrorCode initialise();
Common::ErrorCode loadMortDat();
void readStaticStrings(Common::File &f, int dataSize, DataType dataType);
@ -164,8 +290,6 @@ private:
void mainGame();
void playGame();
void handleAction();
void cinq_huit(char &c, int &idx, byte &pt, bool &the_end);
void copcha();
void displayCGAPattern(int n, Pattern p, nhom *pal);
void loadPalette();
void loadTexts();
@ -177,146 +301,86 @@ private:
void palette(int v1);
int checkLeoMaxRandomPresence();
void interactNPC();
void adzon();
void text1(int x, int y, int nb, int m);
void modif(int &nu);
void initouv();
void phaz(int &rand, int &p, int cf);
void writetp(Common::String s, int t);
void premtet();
void ajchai();
void tfleche();
void setCoordinates(int sx);
public:
Common::String _hintPctMessage;
Common::Point _prevPos;
byte _tabdon[4001];
byte _cfiecBuffer[822 * 128];
int _fxxBuffer[108];
byte _touv[8];
int _msg[5];
int _nbrep[9];
int _nbrepm[9];
uint16 _inpBuffer[kMaxTi + 1];
Hint _ntpBuffer[kMaxTd + 1];
bool _roomPresenceLuc;
bool _roomPresenceIda;
bool _purpleRoomPresenceLeo;
bool _roomPresenceGuy;
bool _roomPresenceEva;
bool _roomPresenceMax;
bool _roomPresenceBob;
bool _roomPresencePat;
bool _toiletsPresenceBobMax;
bool _bathRoomPresenceBobMax;
bool _room9PresenceLeo;
bool _soundOff;
bool _largestClearScreen;
bool _hiddenHero;
bool _heroSearching;
bool _keyPressedEsc;
bool _reloadCFIEC;
bool _blo;
bool _col;
bool _syn;
bool _obpart;
bool _okdes;
bool _anyone;
bool _brt;
int _textColor;
int _currGraphicalDevice;
int _newGraphicalDevice;
int _place;
int _manorDistance;
int _currBitIndex;
int _savedBitIndex;
int _currDay;
int _currHour;
int _currHalfHour;
int _day;
int _hour;
int _minute;
int _mchai;
float _addFix;
SaveStruct _coreVar, _saveStruct;
Common::Point _stdPal[91][17];
t_pcga _cgaPal[91];
int _key;
int _controlMenu;
int _startHour;
int _endHour;
int _c_zzz;
int ptr_word;
byte _v_lieu[7][25];
byte _is;
int _numpal;
int _ment;
int _iouv;
int _caff;
int _maff;
int _dobj;
int _num;
int _crep;
int _cs;
int _res;
int _prebru;
int _t;
int _x;
int _y;
int _jh;
int _mh;
// TODO: Replace the following with proper implementations, or refactor out the code using them
byte _mem[65536 * 16];
ScreenSurface _screenSurface;
PaletteManager _paletteManager;
GfxSurface _backgroundSurface;
Common::RandomSource _randomSource;
SoundManager _soundManager;
SavegameManager _savegameManager;
SpeechManager _speechManager;
Menu _menu;
MouseHandler _mouse;
bool _quitGame; // Quit game flag. Originally called 'arret'
bool _endGame; // End game flag. Originally called 'solu'
bool _loseGame; // Lose game flag. Originally called 'perdu'
bool _txxFileFl; // Flag used to determine if texts are from the original files or from a DAT file
MortevielleEngine(OSystem *system, const ADGameDescription *gameDesc);
~MortevielleEngine();
virtual bool hasFeature(EngineFeature f) const;
virtual bool canLoadGameStateCurrently();
virtual bool canSaveGameStateCurrently();
virtual Common::Error loadGameState(int slot);
virtual Common::Error saveGameState(int slot, const Common::String &desc);
virtual Common::Error run();
uint32 getGameFlags() const;
Common::Language getLanguage() const;
bool keyPressed();
int getChar();
Common::Point getMousePos() const { return _mousePos; }
void setMousePos(const Common::Point &pt);
bool getMouseClick() const { return _mouseClick; }
void setMouseClick(bool v) { _mouseClick = v; }
void delay(int amount);
Common::String getEngineString(int idx) const { return _engineStrings[idx]; }
Common::String getGameString(int idx) const { return _gameStrings[idx]; }
void handleOpcode();
void endGame();
void askRestart();
void gameLoaded();
void initCaveOrCellar();
void displayControlMenu();
void displayItemInHand(int objId);
void resetRoomVariables(int roomId);
int getPresenceStats(int &rand, int cf, int roomId);
void setPresenceFlags(int roomId);
void testKey(bool d);
void exitRoom();
void getReadDescription(int objId);
void getSearchDescription(int objId);
int checkLeaveSecretPassage();
void changeGraphicalDevice(int newDevice);
void startDialog(int16 rep);
void endSearch();
int convertCharacterIndexToBitIndex(int characterIndex);
int convertBitIndexToCharacterIndex(int bitIndex);
void clearScreenType1();
void clearScreenType2();
void clearScreenType3();
void clearScreenType10();
int getRandomNumber(int minval, int maxval);
void showMoveMenuAlert();
void showConfigScreen();
void decodeNumber(byte *pStart, int count);
void resetVariables();
void music();
void drawRightFrame();
void prepareRoom();
void drawClock();
void checkManorDistance();
void gotoManorFront();
void gotoManorBack();
void gotoDiningRoom();
bool checkInventory(int objectId);
void loseGame();
void floodedInWell();
void displayDiningRoom();
void startMusicOrSpeech(int so);
void setTextColor(int col);
void prepareScreenType1();
void prepareScreenType2();
void prepareScreenType3();
void updateHour(int &day, int &hour, int &minute);
void getKnockAnswer();
int getPresenceStatsGreenRoom();
int getPresenceStatsPurpleRoom();
int getPresenceStatsToilets();
int getPresenceStatsBlueRoom();
int getPresenceStatsRedRoom();
int getPresenceStatsDiningRoom(int &hour);
int getPresenceStatsBureau(int &hour);
int getPresenceStatsKitchen();
int getPresenceStatsAttic();
int getPresenceStatsLanding();
int getPresenceStatsChapel(int &hour);
int getPresenceBitIndex(int roomId);
void setPresenceGreenRoom(int roomId);
void setPresencePurpleRoom();
void setPresenceBlueRoom();
void setPresenceRedRoom(int roomId);
int setPresenceDiningRoom(int hour);
int setPresenceBureau(int hour);
int setPresenceKitchen();
int setPresenceLanding();
int setPresenceChapel(int hour);
void setRandomPresenceGreenRoom(int cf);
void setRandomPresencePurpleRoom(int cf);
void setRandomPresenceBlueRoom(int cf);
void setRandomPresenceRedRoom(int cf);
void setRandomPresenceRoom9(int cf);
void setRandomPresenceDiningRoom(int cf);
void setRandomPresenceBureau(int cf);
void setRandomPresenceKitchen(int cf);
void setRandomPresenceAttic(int cf);
void setRandomPresenceLanding(int cf);
void setRandomPresenceChapel(int cf);
void loadPlaces();
void resetPresenceInRooms(int roomId);
void showPeoplePresent(int bitIndex);
int selectCharacters(int min, int max);
void fctMove();
void fctTake();
void fctInventoryTake();
@ -346,105 +410,23 @@ public:
void fctDiscuss();
void fctSmell();
void fctScratch();
void endGame();
void askRestart();
void delay(int amount);
void handleOpcode();
int getPresenceStatsGreenRoom();
int getPresenceStatsPurpleRoom();
int getPresenceStatsToilets();
int getPresenceStatsBlueRoom();
int getPresenceStatsRedRoom();
int getPresenceStatsDiningRoom(int &hour);
int getPresenceStatsBureau(int &hour);
int getPresenceStatsKitchen();
int getPresenceStatsAttic();
int getPresenceStatsLanding();
int getPresenceStatsChapel(int &hour);
int getPresenceBitIndex(int roomId);
void setPresenceGreenRoom(int roomId);
void setPresencePurpleRoom();
void setPresenceBlueRoom();
void setPresenceRedRoom(int roomId);
int setPresenceDiningRoom(int hour);
int setPresenceBureau(int hour);
int setPresenceKitchen();
int setPresenceLanding();
int setPresenceChapel(int hour);
void setRandomPresenceGreenRoom(int cf);
void setRandomPresencePurpleRoom(int cf);
void setRandomPresenceBlueRoom(int cf);
void setRandomPresenceRedRoom(int cf);
void setRandomPresenceRoom9(int cf);
void setRandomPresenceDiningRoom(int cf);
void setRandomPresenceBureau(int cf);
void setRandomPresenceKitchen(int cf);
void setRandomPresenceAttic(int cf);
void setRandomPresenceLanding(int cf);
void setRandomPresenceChapel(int cf);
void loadPlaces();
void initGame();
void resetPresenceInRooms(int roomId);
void showPeoplePresent(int bitIndex);
int selectCharacters(int min, int max);
void displayAloneText();
void checkManorDistance();
void gotoManorFront();
void gotoManorBack();
void gotoDiningRoom();
bool checkInventory(int objectId);
void loseGame();
void floodedInWell();
void displayDiningRoom();
void startMusicOrSpeech(int so);
void setTextColor(int col);
void prepareScreenType1();
void prepareScreenType2();
void prepareScreenType3();
void updateHour(int &day, int &hour, int &minute);
void getKnockAnswer();
void charToHour();
void hourToChar();
void changeGraphicalDevice(int newDevice);
void startDialog(int16 rep);
void endSearch();
int convertCharacterIndexToBitIndex(int characterIndex);
int convertBitIndexToCharacterIndex(int bitIndex);
void clearScreenType1();
void clearScreenType2();
void clearScreenType3();
void clearScreenType10();
int getRandomNumber(int minval, int maxval);
void showMoveMenuAlert();
void showConfigScreen();
void decodeNumber(byte *pStart, int count);
Common::String getString(int num);
void resetVariables();
void setPal(int n);
void music();
void draw(int ad, int x, int y);
void drawRightFrame();
void prepareRoom();
void drawClock();
Common::String copy(const Common::String &s, int idx, size_t size);
void hirs();
void initCaveOrCellar();
void displayControlMenu();
void displayItemInHand(int objId);
void displayEmptyHand();
void resetRoomVariables(int roomId);
int getPresenceStats(int &rand, int cf, int roomId);
void setPresenceFlags(int roomId);
int getPresence(int roomId);
void testKey(bool d);
void exitRoom();
void getReadDescription(int objId);
void getSearchDescription(int objId);
int checkLeaveSecretPassage();
void pictout(int seg, int dep, int x, int y);
int animof(int ouf, int num);
void repon(int f, int m);
void cinq_huit(char &c, int &idx, byte &pt, bool &the_end);
void copcha();
void adzon();
void text1(int x, int y, int nb, int m);
void modif(int &nu);
void initouv();
void phaz(int &rand, int &p, int cf);
void writetp(Common::String s, int t);
void premtet();
void ajchai();
void tfleche();
void setCoordinates(int sx);
void ecr2(Common::String text);
void ecr3(Common::String text);
void init_nbrepm();
@ -461,6 +443,82 @@ public:
void rechai(int &ch);
void fenat(char ans);
public:
Common::Point _prevPos;
int _msg[5];
int _fxxBuffer[108];
byte _tabdon[4001];
bool _soundOff;
bool _blo;
bool _okdes;
bool _largestClearScreen;
int _currGraphicalDevice;
int _newGraphicalDevice;
float _addFix;
int _savedBitIndex;
int _numpal;
int _key;
SaveStruct _coreVar, _saveStruct;
int _maff;
int _res;
int _caff;
int _crep;
byte _is;
byte _v_lieu[7][25];
// TODO: Replace the following with proper implementations, or refactor out the code using them
byte _mem[65536 * 16];
ScreenSurface _screenSurface;
PaletteManager _paletteManager;
GfxSurface _backgroundSurface;
Common::RandomSource _randomSource;
SoundManager _soundManager;
SavegameManager _savegameManager;
SpeechManager _speechManager;
Menu _menu;
MouseHandler _mouse;
TextHandler _text;
MortevielleEngine(OSystem *system, const ADGameDescription *gameDesc);
~MortevielleEngine();
virtual bool hasFeature(EngineFeature f) const;
virtual bool canLoadGameStateCurrently();
virtual bool canSaveGameStateCurrently();
virtual Common::Error loadGameState(int slot);
virtual Common::Error saveGameState(int slot, const Common::String &desc);
virtual Common::Error run();
uint32 getGameFlags() const;
Common::Language getLanguage() const;
int getChar();
bool keyPressed();
Common::Point getMousePos() const { return _mousePos; }
void setMousePos(const Common::Point &pt);
bool getMouseClick() const { return _mouseClick; }
void setMouseClick(bool v) { _mouseClick = v; }
Common::String getEngineString(int idx) const { return _engineStrings[idx]; }
Common::String getGameString(int idx) const { return _gameStrings[idx]; }
void gameLoaded();
void initGame();
void displayAloneText();
void draw(int ad, int x, int y);
void charToHour();
void hourToChar();
Common::String getString(int num);
void setPal(int n);
Common::String copy(const Common::String &s, int idx, size_t size);
void testKeyboard();
int getPresence(int roomId);
void displayEmptyHand();
void hirs();
int testou();
void repon(int f, int m);
int animof(int ouf, int num);
void pictout(int seg, int dep, int x, int y);
void sauvecr(int y, int dy);
void charecr(int y, int dy);

View File

@ -69,7 +69,6 @@ void MouseHandler::hideMouse() {
case MODE_AMSTRAD1512: {
bool imp = odd(_pos.y);
for (int i = 0; i <= 3; ++i) {
_port[0x3dd] = 1 << i;
int k = 0;
j = 0;
do {
@ -87,12 +86,8 @@ void MouseHandler::hideMouse() {
break;
}
case MODE_EGA: {
_port[0x3c4] = 2;
_port[0x3ce] = 8;
_port[0x3cf] = 255;
int i = 0;
do {
_port[0x3c5] = 1 << i;
int k = 0;
j = 0;
do {
@ -167,7 +162,6 @@ void MouseHandler::showMouse() {
for (i = 0; i <= 3; ++i) {
j = 0;
imp = odd(_pos.y);
_port[0x3de] = i;
k = 0;
do {
if (imp) {
@ -184,10 +178,8 @@ void MouseHandler::showMouse() {
break;
}
case MODE_EGA:
_port[0x3ce] = 4;
l = 0;
do {
_port[0x3cf] = l;
k = 0;
j = 0;
do {

View File

@ -36,8 +36,6 @@ class MouseHandler {
private:
int s_s[12][6];
int _counter;
// TODO: Replace the following with proper implementations, or refactor out the code using them
int _port[0xfff];
public:
Common::Point _pos;

View File

@ -35,10 +35,11 @@
namespace Mortevielle {
typedef unsigned char uchar;
const byte _rang[16] = {15, 14, 11, 7, 13, 12, 10, 6, 9, 5, 3, 1, 2, 4, 8, 0};
static int l_motsuiv(int p, const char *ch, int &tab) {
/**
* Next word
* @remarks Originally called 'l_motsuiv'
*/
int TextHandler::nextWord(int p, const char *ch, int &tab) {
int c = p;
while ((ch[p] != ' ') && (ch[p] != '$') && (ch[p] != '@'))
@ -51,7 +52,7 @@ static int l_motsuiv(int p, const char *ch, int &tab) {
* Engine function - Display Text
* @remarks Originally called 'afftex'
*/
void displayStr(Common::String inputStr, int x, int y, int dx, int dy, int typ) {
void TextHandler::displayStr(Common::String inputStr, int x, int y, int dx, int dy, int typ) {
int tab;
Common::String s;
int i, j;
@ -87,7 +88,7 @@ void displayStr(Common::String inputStr, int x, int y, int dx, int dy, int typ)
s += ' ';
xc += tab;
++p;
if (l_motsuiv(p, inputStr.c_str(), tab) + xc > xf) {
if (nextWord(p, inputStr.c_str(), tab) + xc > xf) {
g_vm->_screenSurface.drawString(s, typ);
s = "";
xc = x;
@ -123,7 +124,11 @@ void displayStr(Common::String inputStr, int x, int y, int dx, int dy, int typ)
}
}
void chardes(Common::String filename, int32 skipSize, int length) {
/**
* Load DES file
* @remarks Originally called 'chardes'
*/
void TextHandler::loadDesFile(Common::String filename, int32 skipSize, int length) {
Common::File f;
if (!f.open(filename))
error("Missing file %s", filename.c_str());
@ -150,7 +155,11 @@ void chardes(Common::String filename, int32 skipSize, int length) {
g_vm->_mem[0x7000 * 16 + i - remainingSkipSize] = g_vm->_mem[0x6000 * 16 + i];
}
void charani(Common::String filename, int32 skipSize, int length) {
/**
* Load ANI file
* @remarks Originally called 'charani'
*/
void TextHandler::loadAniFile(Common::String filename, int32 skipSize, int length) {
Common::File f;
if (!f.open(filename))
error("Missing file - %s", filename.c_str());
@ -177,7 +186,9 @@ void charani(Common::String filename, int32 skipSize, int length) {
g_vm->_mem[kAdrAni * 16 + i - remainingSkipSize] = g_vm->_mem[0x6000 * 16 + i];
}
void taffich() {
void TextHandler::taffich() {
static const byte _rang[16] = {15, 14, 11, 7, 13, 12, 10, 6, 9, 5, 3, 1, 2, 4, 8, 0};
byte tran1[] = { 121, 121, 138, 139, 120 };
byte tran2[] = { 150, 150, 152, 152, 100, 110, 159, 100, 100 };
@ -295,7 +306,7 @@ void taffich() {
g_vm->_maff = a;
npal = a + 37;
}
chardes(filename, lgt, handle);
loadDesFile(filename, lgt, handle);
if (g_vm->_currGraphicalDevice == MODE_HERCULES) {
for (int i = 0; i <= 15; ++i) {
int palh = READ_LE_UINT16(&g_vm->_mem[(0x7000 * 16) + ((i + 1) << 1)]);
@ -330,7 +341,7 @@ void taffich() {
filename = "AZZ.mor";
handle = 1260;
}
charani(filename, lgt, handle);
loadAniFile(filename, lgt, handle);
}
g_vm->_mouse.showMouse();
if ((a < 27) && ((g_vm->_maff < 27) || (g_vm->_coreVar._currPlace == LANDING)) && (g_vm->_msg[4] != OPCODE_ENTER)) {

View File

@ -35,10 +35,15 @@ namespace Mortevielle {
const int kAdrAni = 0x7314;
extern void displayStr(Common::String inputStr, int x, int y, int dx, int dy, int typ);
extern void chardes(Common::String filename, int32 passe, int long_);
extern void charani(Common::String filename, int32 skipSize, int length);
extern void taffich();
class TextHandler {
private:
int nextWord(int p, const char *ch, int &tab);
public:
void displayStr(Common::String inputStr, int x, int y, int dx, int dy, int typ);
void loadDesFile(Common::String filename, int32 passe, int long_);
void loadAniFile(Common::String filename, int32 skipSize, int length);
void taffich();
};
} // End of namespace Mortevielle
#endif

View File

@ -33,76 +33,6 @@
namespace Mortevielle {
/*---------------------------------------------------------------------------*/
/*------------------- MEMORY MAP ------------------------*/
/*---------------------------------------------------------------------------*/
/* The following is a list of physical addresses in memory currently used
* by the game.
*
* Address
* -------
* 5000:0 - Music data
* 6000:0 - Decompressed current image
* 7000:0+ - Compressed images
* 7000:2 - 16 words representing palette map
* 7000:4138 - width, height, x/y offset of decoded image
*/
/*---------------------------------------------------------------------------*/
/*------------------------- DEFINES ----------------------------------*/
/*---------------------------------------------------------------------------*/
#define ord(v) ((int) v)
#define chr(v) ((unsigned char) v)
#define lo(v) ((v) & 0xff)
#define hi(v) (((v) >> 8) & 0xff)
#define swap(v) (((lo(v)) << 8) | ((hi(v)) >> 8))
#define odd(v) (((v) % 2) == 1)
/*---------------------------------------------------------------------------*/
/*------------------------- CONSTANTS ----------------------------------*/
/*---------------------------------------------------------------------------*/
const int kMaxTi = 7975;
const int kMaxTd = 600;
const int kDescriptionStringIndex = 0; // Unused
const int kInventoryStringIndex = 186;
const int kQuestionStringIndex = 247;
const int kDialogStringIndex = 292;
const int kMenuPlaceStringIndex = 435;
const int kMenuActionStringIndex = 476;
const int kMenuSelfStringIndex = 497;
const int kMenuSayStringIndex = 502;
const int kSecretPassageQuestionStringIndex = 510; // Unusued?
const int kMaxPatt = 20;
const int OPCODE_NONE = 0;
enum verbs {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};
/*
9 "A glance at the forbidden$",
18 "It's already open$",
26 "A photograph$",
27 "The coat of arms$",
*/
enum places {
OWN_ROOM = 0, GREEN_ROOM = 1, PURPLE_ROOM = 2, TOILETS = 3, DARKBLUE_ROOM = 4,
BLUE_ROOM = 5, RED_ROOM = 6, BATHROOM = 7, GREEN_ROOM2 = 8, ROOM9 = 9,
DINING_ROOM = 10, BUREAU = 11, KITCHEN = 12, ATTIC = 13, CELLAR = 14,
LANDING = 15, CRYPT = 16, SECRET_PASSAGE = 17, ROOM18 = 18, MOUNTAIN = 19,
CHAPEL = 20, MANOR_FRONT = 21, MANOR_BACK = 22, INSIDE_WELL = 23, WELL = 24,
DOOR = 25, ROOM26 = 26, ROOM27 = 27
};
enum GraphicModes { MODE_AMSTRAD1512 = 0, MODE_CGA = 1, MODE_EGA = 2, MODE_HERCULES = 3, MODE_TANDY = 4 };
struct Rect {
int _x1, _x2, _y1, _y2;
bool _enabled;