diff options
Diffstat (limited to 'engines/mortevielle')
-rw-r--r-- | engines/mortevielle/actions.cpp | 6 | ||||
-rw-r--r-- | engines/mortevielle/detection_tables.h | 2 | ||||
-rw-r--r-- | engines/mortevielle/dialogs.cpp | 6 | ||||
-rw-r--r-- | engines/mortevielle/graphics.cpp | 2 | ||||
-rw-r--r-- | engines/mortevielle/mortevielle.h | 6 | ||||
-rw-r--r-- | engines/mortevielle/outtext.cpp | 24 | ||||
-rw-r--r-- | engines/mortevielle/utils.cpp | 82 |
7 files changed, 108 insertions, 20 deletions
diff --git a/engines/mortevielle/actions.cpp b/engines/mortevielle/actions.cpp index 556475d515..b7b9c1e000 100644 --- a/engines/mortevielle/actions.cpp +++ b/engines/mortevielle/actions.cpp @@ -571,6 +571,7 @@ void MortevielleEngine::fctSearch() { _curSearchObjId = getFirstObject(); if (_curSearchObjId != 0) { _searchCount = 0; + _is = 0; _heroSearching = true; _menu->setSearchMenu(); prepareNextObject(); @@ -1678,9 +1679,8 @@ void MortevielleEngine::endGame() { handleDescriptionText(2, 35); startMusicOrSpeech(0); testKey(false); - // A wait message was displayed. - // testKey (aka tkey1) was called before and after. - // This double call is useless, thus removed + displayInterScreenMessage(2036); + testKey(false); resetVariables(); } diff --git a/engines/mortevielle/detection_tables.h b/engines/mortevielle/detection_tables.h index 0aa27b89eb..d244d15365 100644 --- a/engines/mortevielle/detection_tables.h +++ b/engines/mortevielle/detection_tables.h @@ -75,7 +75,7 @@ static const MortevielleGameDescription MortevielleGameDescriptions[] = { // DOS English version doesn't exist. Technically, they are French or German versions, // using English strings stored mort.dat - + // English on top of French version { { diff --git a/engines/mortevielle/dialogs.cpp b/engines/mortevielle/dialogs.cpp index 89098fabe5..9df66846d2 100644 --- a/engines/mortevielle/dialogs.cpp +++ b/engines/mortevielle/dialogs.cpp @@ -66,12 +66,12 @@ int DialogManager::show(const Common::String &msg) { drawAlertBox(10, 5, colNumb); } else { drawAlertBox(8, 7, colNumb); - int i = 0; + int i = -1; _vm->_screenSurface->_textPos.y = 70; do { curPos.x = 320; Common::String displayStr = ""; - while ((alertStr[i + 1] != '\174') && (alertStr[i + 1] != '\135')) { + while ((alertStr[i + 1] != '|') && (alertStr[i + 1] != ']')) { ++i; displayStr += alertStr[i]; curPos.x -= 3; @@ -405,7 +405,7 @@ void DialogManager::drawF3F8() { int f8Width = _vm->_screenSurface->getStringWidth(f8); // Write out the bounding box - _vm->_screenSurface->drawBox(0, 42, MAX(f3Width, f8Width) + 6, 18, 7); + _vm->_screenSurface->drawBox(0, 42, MAX(f3Width, f8Width) + 4, 16, 7); } /** diff --git a/engines/mortevielle/graphics.cpp b/engines/mortevielle/graphics.cpp index 553c1a759e..aa479fdd44 100644 --- a/engines/mortevielle/graphics.cpp +++ b/engines/mortevielle/graphics.cpp @@ -1019,6 +1019,8 @@ void ScreenSurface::writeCharacter(const Common::Point &pt, unsigned char ch, in * simulate the original 640x400 surface, all Y values have to be doubled */ void ScreenSurface::drawBox(int x, int y, int dx, int dy, int col) { + dx++; dy++; // Original function draws 1px bigger + Graphics::Surface destSurface = lockArea(Common::Rect(x, y * 2, x + dx, (y + dy) * 2)); destSurface.hLine(0, 0, dx, col); diff --git a/engines/mortevielle/mortevielle.h b/engines/mortevielle/mortevielle.h index c3d1e4ae8b..42d70fcb37 100644 --- a/engines/mortevielle/mortevielle.h +++ b/engines/mortevielle/mortevielle.h @@ -92,6 +92,7 @@ enum DataType { #define MORT_DAT_REQUIRED_VERSION 1 #define MORT_DAT "mort.dat" #define GAME_FRAME_DELAY (1000 / 50) +#define DISK_ACCESS_DELAY 1000 const int kTime1 = 410; const int kTime2 = 250; @@ -115,6 +116,7 @@ const int kInventoryStringIndex = 186; const int kQuestionStringIndex = 247; const int kDialogStringIndex = 292; const int kMenuPlaceStringIndex = 435; +const int kStartingScreenStringIndex = 456; const int kMenuActionStringIndex = 476; const int kMenuSelfStringIndex = 497; const int kMenuSayStringIndex = 502; @@ -415,13 +417,14 @@ public: int _maff; int _caff; int _crep; + int _is; // ??? byte _destinationArray[7][25]; byte *_curPict; byte *_curAnim; byte *_rightFramePict; - + PaletteManager _paletteManager; GfxSurface _backgroundSurface; Common::RandomSource _randomSource; @@ -465,6 +468,7 @@ public: void gameLoaded(); void initGame(); void displayAloneText(); + void displayInterScreenMessage(int mesgId); void draw(int x, int y); void charToHour(); void hourToChar(); diff --git a/engines/mortevielle/outtext.cpp b/engines/mortevielle/outtext.cpp index 6a479c0859..5cbe4deab3 100644 --- a/engines/mortevielle/outtext.cpp +++ b/engines/mortevielle/outtext.cpp @@ -227,7 +227,31 @@ void TextHandler::taffich() { Common::String filename, altFilename; if ((a != 50) && (a != 51)) { + int m = a + 2000; + + if ((m > 2001) && (m < 2010)) + m = 2001; + else if (m == 2011) + m = 2010; + if (a == 32) + m = 2034; + else if ((a == 17) && (_vm->_maff == 14)) + m = 2018; + else if (a > 99) { + if ((_vm->_is == 1) || (_vm->_is == 0)) + m = 2031; + else + m = 2032; + } + + if ( ((a > 69) && (a < 80)) || (a == 30) || (a == 31) || (a == 144) || (a == 147) || (a == 149) ) + m = 2030; + else if ( ((a < 27) && ( ((_vm->_maff > 69) && (!_vm->_coreVar._alreadyEnteredManor)) || (_vm->_maff > 99) )) || ((_vm->_maff > 29) && (_vm->_maff < 33)) ) + m = 2033; + + _vm->displayInterScreenMessage(m); _vm->_maff = a; + if (a == 159) a = 86; else if (a > 140) diff --git a/engines/mortevielle/utils.cpp b/engines/mortevielle/utils.cpp index d5dec6a286..5137e1892b 100644 --- a/engines/mortevielle/utils.cpp +++ b/engines/mortevielle/utils.cpp @@ -234,6 +234,7 @@ void MortevielleEngine::setMousePos(const Common::Point &pt) { void MortevielleEngine::delay(int amount) { uint32 endTime = g_system->getMillis() + amount; + g_system->showMouse(false); while (g_system->getMillis() < endTime) { if (g_system->getMillis() > (_lastGameFrame + GAME_FRAME_DELAY)) { _lastGameFrame = g_system->getMillis(); @@ -244,6 +245,7 @@ void MortevielleEngine::delay(int amount) { g_system->delayMillis(10); } + g_system->showMouse(true); } /** @@ -389,7 +391,7 @@ void MortevielleEngine::setTextColor(int col) { */ void MortevielleEngine::prepareScreenType1() { // Large drawing - _screenSurface->drawBox(0, 11, 512, 164, 15); + _screenSurface->drawBox(0, 11, 512, 163, 15); } /** @@ -705,11 +707,11 @@ void MortevielleEngine::displayAloneText() { Common::String sAlone = getEngineString(S_ALONE); clearUpperRightPart(); - _screenSurface->putxy(580 - (_screenSurface->getStringWidth(sYou) / 2), 30); + _screenSurface->putxy(560, 30); _screenSurface->drawString(sYou, 4); - _screenSurface->putxy(580 - (_screenSurface->getStringWidth(sAre) / 2), 50); + _screenSurface->putxy(560, 50); _screenSurface->drawString(sAre, 4); - _screenSurface->putxy(580 - (_screenSurface->getStringWidth(sAlone) / 2), 70); + _screenSurface->putxy(560, 70); _screenSurface->drawString(sAlone, 4); _currBitIndex = 0; @@ -1357,6 +1359,7 @@ void MortevielleEngine::endSearch() { _heroSearching = false; _obpart = false; _searchCount = 0; + _is = 0; _menu->unsetSearchMenu(); } @@ -1379,7 +1382,7 @@ void MortevielleEngine::gotoDiningRoom() { showPeoplePresent(_currBitIndex); _caff = 77; drawPictureWithText(); - _screenSurface->drawBox(223, 47, 155, 92, 15); + _screenSurface->drawBox(223, 47, 155, 91, 15); handleDescriptionText(2, 33); testKey(false); menuUp(); @@ -1467,6 +1470,7 @@ void MortevielleEngine::gameLoaded() { _num = 0; _startTime = 0; _endTime = 0; + _is = 0; _searchCount = 0; _roomDoorId = OWN_ROOM; _syn = true; @@ -1653,11 +1657,11 @@ void MortevielleEngine::clearDescriptionBar() { _mouse->hideMouse(); if (_largestClearScreen) { _screenSurface->fillRect(0, Common::Rect(1, 176, 633, 199)); - _screenSurface->drawBox(0, 176, 634, 23, 15); + _screenSurface->drawBox(0, 175, 634, 24, 15); _largestClearScreen = false; } else { _screenSurface->fillRect(0, Common::Rect(1, 176, 633, 190)); - _screenSurface->drawBox(0, 176, 634, 14, 15); + _screenSurface->drawBox(0, 175, 634, 15, 15); } _mouse->showMouse(); } @@ -1691,7 +1695,7 @@ void MortevielleEngine::clearUpperRightPart() { else if (_coreVar._faithScore > 65) st = getEngineString(S_MALSAINE); - int x1 = 580 - (_screenSurface->getStringWidth(st) / 2); + int x1 = 574 - (_screenSurface->getStringWidth(st) / 2); _screenSurface->putxy(x1, 92); _screenSurface->drawString(st, 4); @@ -1722,6 +1726,22 @@ void MortevielleEngine::showMoveMenuAlert() { * @remarks Originally called 'dialpre' */ void MortevielleEngine::showConfigScreen() { + // FIXME: need a DOS palette, index 9 (light blue). Also we should show DOS font here + Common::String tmpStr; + int width, cy = 0; + clearScreen(); + do { + ++cy; + tmpStr = getString(cy + kStartingScreenStringIndex); + width = _screenSurface->getStringWidth(tmpStr); + _text->displayStr(tmpStr, 320 - width / 2, cy * 8, 80, 1, 2); + } while (cy != 20); + + int ix = 0; + do { + ++ix; + } while (!(keyPressed() || ix == 0x5e5)); + _crep = 998; } @@ -2124,9 +2144,11 @@ void MortevielleEngine::showTitleScreen() { _caff = 51; _text->taffich(); testKeyboard(); + delay(DISK_ACCESS_DELAY); clearScreen(); draw(0, 0); + // FIXME: should be a DOS font here Common::String cpr = "COPYRIGHT 1989 : LANKHOR"; _screenSurface->putxy(104 + 72 * kResolutionScaler, 185); _screenSurface->drawString(cpr, 0); @@ -2521,6 +2543,18 @@ void MortevielleEngine::handleDescriptionText(int f, int mesgId) { _coreVar._pctHintFound[10] = '*'; } break; + case 7: { + prepareScreenType3(); + Common::String tmpStr = getString(mesgId); + // CHECKME: original code seems to consider one extra character + // See text position in the 3rd intro screen + int size = tmpStr.size() + 1; + if (size < 40) + _text->displayStr(tmpStr, 252 - size * 3, 86, 50, 3, 5); + else + _text->displayStr(tmpStr, 144, 86, 50, 3, 5); + } + break; default: break; } @@ -2870,10 +2904,10 @@ void MortevielleEngine::drawPicture() { clearUpperLeftPart(); if (_caff > 99) { draw(60, 33); - _screenSurface->drawBox(118, 32, 291, 122, 15); // Medium box + _screenSurface->drawBox(118, 32, 291, 121, 15); // Medium box } else if (_caff > 69) { draw(112, 48); // Heads - _screenSurface->drawBox(222, 47, 155, 92, 15); + _screenSurface->drawBox(222, 47, 155, 91, 15); } else { draw(0, 12); prepareScreenType1(); @@ -2911,6 +2945,9 @@ void MortevielleEngine::drawPicture() { } } +/** + * @remarks Originally called 'afdes' + */ void MortevielleEngine::drawPictureWithText() { _text->taffich(); drawPicture(); @@ -2971,6 +3008,26 @@ void MortevielleEngine::displayNarrativePicture(int af, int ob) { } /** + * Display a message switching from a screen to another. + * @remarks Originally called 'messint' + */ +void MortevielleEngine::displayInterScreenMessage(int mesgId) { + clearUpperLeftPart(); + clearDescriptionBar(); + clearVerbBar(); + + GfxSurface surface; + surface.decode(_rightFramePict + 1008); + surface._offset.x = 80; + surface._offset.y = 40; + setPal(90); + _screenSurface->drawPicture(surface, 0, 0); + _screenSurface->drawPicture(surface, 0, 70); + handleDescriptionText(7, mesgId); + delay(DISK_ACCESS_DELAY); +} + +/** * Prepare Display Text * @remarks Originally called 'affrep' */ @@ -3072,7 +3129,7 @@ void MortevielleEngine::menuUp() { */ void MortevielleEngine::drawDiscussionBox() { draw(10, 80); - _screenSurface->drawBox(18, 79, 155, 92, 15); + _screenSurface->drawBox(18, 79, 155, 91, 15); } /** @@ -3097,7 +3154,7 @@ void MortevielleEngine::putObject() { */ void MortevielleEngine::addObjectToInventory(int objectId) { int i; - + for (i = 1; (i <= 5) && (_coreVar._inventory[i] != 0); i++) ; @@ -3178,6 +3235,7 @@ void MortevielleEngine::prepareNextObject() { } while ((objId == 0) && (_searchCount <= 9)); if ((objId != 0) && (_searchCount < 11)) { + _is++; _caff = objId; _crep = _caff + 400; if (_currBitIndex != 0) |