From 64b57afe2c140359b04e77689af4ddb53f2b5c7d Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 15 Nov 2017 01:49:50 +0200 Subject: Revert "DRASCULA: Revert range 4dbed774..1f1d8607" This reverts commit bf69b25e33189581848412e77624865aa55ba234. The original game had slight differences between the code for each chapter. Part of these changes was to simplify the code and unify some of these differences, particularly in the checks for clickable areas, where the code is using Common::Rects with contains() now. I have play tested the whole game with these changes, there are no visible regressions, and the game is still completable. Thus, I'm restoring the changes to the engine. --- engines/drascula/animation.cpp | 38 ++++++++++---------- engines/drascula/drascula.cpp | 33 +++++++---------- engines/drascula/drascula.h | 14 ++++---- engines/drascula/interface.cpp | 4 +-- engines/drascula/objects.cpp | 10 +++--- engines/drascula/rooms.cpp | 80 ++++++++++++++++++++++-------------------- 6 files changed, 87 insertions(+), 92 deletions(-) diff --git a/engines/drascula/animation.cpp b/engines/drascula/animation.cpp index 741c145132..c89e5ff738 100644 --- a/engines/drascula/animation.cpp +++ b/engines/drascula/animation.cpp @@ -362,7 +362,7 @@ void DrasculaEngine::animation_2_1() { int l; - gotoObject(231, 91); + walkToPoint(Common::Point(231, 91)); _characterVisible = false; term_int = 0; @@ -439,7 +439,7 @@ void DrasculaEngine::animation_2_1() { if (animate("lev.bin", 15)) break; - gotoObject(100 + curWidth / 2, 99 + curHeight); + walkToPoint(Common::Point(100 + curWidth / 2, 99 + curHeight)); if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit()) break; trackProtagonist = 1; @@ -484,7 +484,7 @@ void DrasculaEngine::animation_2_1() { pause(118); if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit()) break; - gotoObject(132, 97 + curHeight); + walkToPoint(Common::Point(132, 97 + curHeight)); pause(60); if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit()) break; @@ -492,7 +492,7 @@ void DrasculaEngine::animation_2_1() { if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit()) break; talk_bj(12); - gotoObject(157, 98 + curHeight); + walkToPoint(Common::Point(157, 98 + curHeight)); if (animate("bes.bin", 16)) break; playMusic(11); @@ -880,8 +880,8 @@ void DrasculaEngine::animation_23_2() { trackVonBraun = 1; talk_vonBraun(16, kVonBraunNormal); trackVonBraun = 2; - gotoObject(157, 147); - gotoObject(131, 149); + walkToPoint(Common::Point(157, 147)); + walkToPoint(Common::Point(131, 149)); trackProtagonist = 0; animation_14_2(); if (flags[25] == 0) @@ -1024,7 +1024,7 @@ void DrasculaEngine::animation_31_2() { talk_vonBraun(44, kVonBraunNormal); placeVonBraun(-50); pause(15); - gotoObject(159, 140); + walkToPoint(Common::Point(159, 140)); loadPic(99, backSurface); playTalkSequence(31); // sequence 31, chapter 2 @@ -1041,8 +1041,8 @@ void DrasculaEngine::animation_31_2() { void DrasculaEngine::animation_35_2() { debug(4, "animation_35_2()"); - gotoObject(96, 165); - gotoObject(79, 165); + walkToPoint(Common::Point(96, 165)); + walkToPoint(Common::Point(79, 165)); updateRoom(); updateScreen(); @@ -1130,7 +1130,7 @@ void DrasculaEngine::animation_2_3() { loadPic(97, extraSurface); loadPic(99, backSurface); - gotoObject(332, 127); + walkToPoint(Common::Point(332, 127)); } void DrasculaEngine::animation_6_3() { @@ -1221,7 +1221,7 @@ void DrasculaEngine::animation_1_5() { talk_bj(19); talk(229); pause(5); - gotoObject(114, 170); + walkToPoint(Common::Point(114, 170)); trackProtagonist = 3; talk(431); talk_bj(20); @@ -1265,7 +1265,7 @@ void DrasculaEngine::animation_5_5(){ selectVerb(kVerbNone); removeObject(8); - gotoObject(curX - 19, curY + curHeight); + walkToPoint(Common::Point(curX - 19, curY + curHeight)); trackProtagonist = 1; updateRoom(); updateScreen(); @@ -1429,8 +1429,8 @@ void DrasculaEngine::animation_12_5() { loadPic(99, backSurface); - gotoObject(40, 169); - gotoObject(-14, 175); + walkToPoint(Common::Point(40, 169)); + walkToPoint(Common::Point(-14, 175)); doBreak = 1; previousMusic = roomMusic; @@ -1487,7 +1487,7 @@ void DrasculaEngine::animation_14_5() { pause(17); trackProtagonist = 3; talk(246); - gotoObject(89, 160); + walkToPoint(Common::Point(89, 160)); flags[10] = 1; playSound(7); updateRoom(); @@ -1659,7 +1659,7 @@ void DrasculaEngine::animation_9_6() { updateScreen(); fadeFromBlack(0); pause(96); - gotoObject(116, 178); + walkToPoint(Common::Point(116, 178)); trackProtagonist = 2; updateRoom(); updateScreen(); @@ -1844,7 +1844,7 @@ void DrasculaEngine::animation_24_2() { debug(4, "animation_24_2()"); if (curX < 178) - gotoObject(208, 136); + walkToPoint(Common::Point(208, 136)); trackProtagonist = 3; updateRoom(); pause(3); @@ -2139,8 +2139,8 @@ void DrasculaEngine::animation_5_4(){ trackProtagonist = 3; loadPic("anh_dr.alg", backSurface); - gotoObject(99, 160); - gotoObject(38, 177); + walkToPoint(Common::Point(99, 160)); + walkToPoint(Common::Point(38, 177)); _characterVisible = false; updateRoom(); updateScreen(); diff --git a/engines/drascula/drascula.cpp b/engines/drascula/drascula.cpp index 1f3f0c654d..3f840b0901 100644 --- a/engines/drascula/drascula.cpp +++ b/engines/drascula/drascula.cpp @@ -94,10 +94,6 @@ DrasculaEngine::DrasculaEngine(OSystem *syst, const DrasculaGameDescription *gam _talkSequencesSize = 0; _numLangs = 0; feetHeight = 0; - floorX1 = 0; - floorY1 = 0; - floorX2 = 0; - floorY2 = 0; lowerLimit = 0; upperLimit = 0; trackFinal = 0; @@ -444,7 +440,7 @@ bool DrasculaEngine::runCurrentChapter() { enterRoom(62); curX = -20; curY = 56; - gotoObject(65, 145); + walkToPoint(Common::Point(65, 145)); } // REMINDER: This is a good place to debug animations @@ -550,14 +546,14 @@ bool DrasculaEngine::runCurrentChapter() { // made the character start walking off screen, as his actual position was // different than the displayed one if (_roomNumber == 3 && (curX == 279) && (curY + curHeight == 101)) { - gotoObject(178, 121); - gotoObject(169, 135); + walkToPoint(Common::Point(178, 121)); + walkToPoint(Common::Point(169, 135)); } else if (_roomNumber == 14 && (curX == 214) && (curY + curHeight == 121)) { _walkToObject = true; - gotoObject(190, 130); + walkToPoint(Common::Point(190, 130)); } else if (_roomNumber == 14 && (curX == 246) && (curY + curHeight == 112)) { _walkToObject = true; - gotoObject(190, 130); + walkToPoint(Common::Point(190, 130)); } } @@ -744,8 +740,7 @@ bool DrasculaEngine::verify1() { removeObject(); else { for (l = 0; l < numRoomObjs; l++) { - if (_mouseX >= _objectX1[l] && _mouseY >= _objectY1[l] - && _mouseX <= _objectX2[l] && _mouseY <= _objectY2[l] && doBreak == 0) { + if (_objectRect[l].contains(Common::Point(_mouseX, _mouseY)) && doBreak == 0) { if (exitRoom(l)) return true; if (doBreak == 1) @@ -758,10 +753,9 @@ bool DrasculaEngine::verify1() { doBreak = 1; for (l = 0; l < numRoomObjs; l++) { - if (_mouseX > _objectX1[l] && _mouseY > _objectY1[l] - && _mouseX < _objectX2[l] && _mouseY < _objectY2[l] && doBreak == 0) { - roomX = roomObjX[l]; - roomY = roomObjY[l]; + if (_objectRect[l].contains(Common::Point(_mouseX, _mouseY)) && doBreak == 0) { + roomX = _roomObject[l].x; + roomY = _roomObject[l].y; trackFinal = trackObj[l]; doBreak = 1; _walkToObject = true; @@ -770,8 +764,8 @@ bool DrasculaEngine::verify1() { } if (doBreak == 0) { - roomX = CLIP(_mouseX, floorX1, floorX2); - roomY = CLIP(_mouseY, floorY1 + feetHeight, floorY2); + roomX = CLIP(_mouseX, _walkRect.left, _walkRect.right); + roomY = CLIP(_mouseY, _walkRect.top + feetHeight, _walkRect.bottom); startWalking(); } doBreak = 0; @@ -792,11 +786,10 @@ bool DrasculaEngine::verify2() { return true; } else { for (l = 0; l < numRoomObjs; l++) { - if (_mouseX > _objectX1[l] && _mouseY > _objectY1[l] - && _mouseX < _objectX2[l] && _mouseY < _objectY2[l] && visible[l] == 1) { + if (_objectRect[l].contains(Common::Point(_mouseX, _mouseY)) && visible[l] == 1) { trackFinal = trackObj[l]; _walkToObject = true; - gotoObject(roomObjX[l], roomObjY[l]); + walkToPoint(_roomObject[l]); if (checkAction(objectNum[l])) return true; if (currentChapter == 4) diff --git a/engines/drascula/drascula.h b/engines/drascula/drascula.h index fbc29ed206..a7eadcd069 100644 --- a/engines/drascula/drascula.h +++ b/engines/drascula/drascula.h @@ -420,11 +420,13 @@ public: char iconName[44][13]; int objectNum[40], visible[40], isDoor[40]; - int roomObjX[40], roomObjY[40], trackObj[40]; + int trackObj[40]; + Common::Point _roomObject[40]; int inventoryObjects[43]; - char _targetSurface[40][20]; - int _destX[40], _destY[40], trackCharacter_alkeva[40], roomExits[40]; - int _objectX1[40], _objectY1[40], _objectX2[40], _objectY2[40]; + int _doorDestRoom[40]; + Common::Point _doorDestPoint[40]; + int trackCharacter_alkeva[40], _roomExitId[40]; + Common::Rect _objectRect[40]; int takeObject, pickedObject; bool _subtitlesDisabled; bool _menuBar, _menuScreen, _hasName; @@ -441,7 +443,7 @@ public: int doBreak; int stepX, stepY; int curHeight, curWidth, feetHeight; - int floorX1, floorY1, floorX2, floorY2; + Common::Rect _walkRect; int lowerLimit, upperLimit; int trackFinal; bool _walkToObject; @@ -485,7 +487,7 @@ public: void enterRoom(int); void clearRoom(); - void gotoObject(int, int); + void walkToPoint(Common::Point pos); void moveCursor(); void checkObjects(); void selectVerbFromBar(); diff --git a/engines/drascula/interface.cpp b/engines/drascula/interface.cpp index 07f192cd4c..a0656e1f41 100644 --- a/engines/drascula/interface.cpp +++ b/engines/drascula/interface.cpp @@ -165,9 +165,7 @@ void DrasculaEngine::showMap() { _hasName = false; for (int l = 0; l < numRoomObjs; l++) { - if (_mouseX > _objectX1[l] && _mouseY > _objectY1[l] - && _mouseX < _objectX2[l] && _mouseY < _objectY2[l] - && visible[l] == 1) { + if (_objectRect[l].contains(Common::Point(_mouseX, _mouseY)) && visible[l] == 1) { strcpy(textName, objName[l]); _hasName = true; } diff --git a/engines/drascula/objects.cpp b/engines/drascula/objects.cpp index cff26c93d5..65c042a9fe 100644 --- a/engines/drascula/objects.cpp +++ b/engines/drascula/objects.cpp @@ -57,7 +57,7 @@ void DrasculaEngine::chooseObject(int object) { pickedObject = object; } -void DrasculaEngine::gotoObject(int pointX, int pointY) { +void DrasculaEngine::walkToPoint(Common::Point pos) { bool cursorVisible = isCursorVisible(); hideCursor(); @@ -70,8 +70,8 @@ void DrasculaEngine::gotoObject(int pointX, int pointY) { return; } } - roomX = pointX; - roomY = pointY; + roomX = pos.x; + roomY = pos.y; startWalking(); while (!shouldQuit()) { @@ -102,9 +102,7 @@ void DrasculaEngine::checkObjects() { _hasName = false; for (l = 0; l < numRoomObjs; l++) { - if (_mouseX > _objectX1[l] && _mouseY > _objectY1[l] - && _mouseX < _objectX2[l] && _mouseY < _objectY2[l] - && visible[l] == 1 && isDoor[l] == 0) { + if (_objectRect[l].contains(Common::Point(_mouseX, _mouseY)) && visible[l] == 1 && isDoor[l] == 0) { strcpy(textName, objName[l]); _hasName = true; } diff --git a/engines/drascula/rooms.cpp b/engines/drascula/rooms.cpp index 75d2928f0f..f99f00c8e7 100644 --- a/engines/drascula/rooms.cpp +++ b/engines/drascula/rooms.cpp @@ -690,7 +690,7 @@ bool DrasculaEngine::room_26(int fl) { else if (pickedObject == 16 && fl == 50 && flags[18] == 1 && flags[12] == 1) animation_5_4(); else if (pickedObject == kVerbPick && fl == 143 && flags[18] == 1) { - gotoObject(260, 180); + walkToPoint(Common::Point(260, 180)); pickObject(10); visible[1] = 0; flags[12] = 1; @@ -699,14 +699,14 @@ bool DrasculaEngine::room_26(int fl) { talk_igor(27, kIgorDoor); flags[30] = 1; talk_igor(28, kIgorDoor); - gotoObject(153, 180); + walkToPoint(Common::Point(153, 180)); } else if (pickedObject == kVerbPick && fl == 143 && flags[18] == 0) { - gotoObject(260, 180); + walkToPoint(Common::Point(260, 180)); copyBackground(80, 78, 199, 94, 38, 27, drawSurface3, screenSurface); updateScreen(199, 94, 199, 94, 38, 27, screenSurface); pause(3); talk_igor(25, kIgorWig); - gotoObject(153, 180); + walkToPoint(Common::Point(153, 180)); } else if (pickedObject == kVerbTalk && fl == 51) animation_1_4(); else @@ -927,7 +927,7 @@ bool DrasculaEngine::room_55(int fl) { playSound(11); animate("det.bin", 17); finishSound(); - gotoObject(curX - 3, curY + curHeight + 6); + walkToPoint(Common::Point(curX - 3, curY + curHeight + 6)); } else hasAnswer = 0; @@ -972,7 +972,7 @@ bool DrasculaEngine::room_59(int fl) { delay(40); finishSound(); delay(10); - gotoObject(174, 168); + walkToPoint(Common::Point(174, 168)); trackProtagonist = 2; updateRoom(); updateScreen(); @@ -1705,32 +1705,38 @@ void DrasculaEngine::enterRoom(int roomIndex) { p.parseInt(numRoomObjs); + int x1, y1, x2, y2; + for (l = 0; l < numRoomObjs; l++) { p.parseInt(objectNum[l]); p.parseString(objName[l]); - p.parseInt(_objectX1[l]); - p.parseInt(_objectY1[l]); - p.parseInt(_objectX2[l]); - p.parseInt(_objectY2[l]); - p.parseInt(roomObjX[l]); - p.parseInt(roomObjY[l]); + p.parseInt(x1); + p.parseInt(y1); + p.parseInt(x2); + p.parseInt(y2); + _objectRect[l] = Common::Rect(x1, y1, x2, y2); + p.parseInt(x1); + p.parseInt(y1); + _roomObject[l] = Common::Point(x1, y1); p.parseInt(trackObj[l]); p.parseInt(visible[l]); p.parseInt(isDoor[l]); if (isDoor[l] != 0) { - p.parseString(_targetSurface[l]); - p.parseInt(_destX[l]); - p.parseInt(_destY[l]); + p.parseInt(_doorDestRoom[l]); + p.parseInt(x1); + p.parseInt(y1); + _doorDestPoint[l] = Common::Point(x1, y1); p.parseInt(trackCharacter_alkeva[l]); - p.parseInt(roomExits[l]); + p.parseInt(_roomExitId[l]); updateDoor(l); } } - p.parseInt(floorX1); - p.parseInt(floorY1); - p.parseInt(floorX2); - p.parseInt(floorY2); + p.parseInt(x1); + p.parseInt(y1); + p.parseInt(x2); + p.parseInt(y2); + _walkRect = Common::Rect(x1, y1, x2, y2); if (currentChapter != 2) { p.parseInt(upperLimit); @@ -1767,8 +1773,8 @@ void DrasculaEngine::enterRoom(int roomIndex) { if (currentChapter == 2) { if (curX == -1) { - curX = _destX[objIsExit]; - curY = _destY[objIsExit] - curHeight; + curX = _doorDestPoint[objIsExit].x; + curY = _doorDestPoint[objIsExit].y - curHeight; } _characterMoved = false; } @@ -1792,27 +1798,27 @@ void DrasculaEngine::enterRoom(int roomIndex) { color_abc(kColorLightGreen); if (currentChapter != 2) { - for (l = 0; l <= floorY1; l++) + for (l = 0; l <= _walkRect.top; l++) factor_red[l] = upperLimit; - for (l = floorY1; l <= 201; l++) + for (l = _walkRect.top; l <= 201; l++) factor_red[l] = lowerLimit; - chiquez = (float)(lowerLimit - upperLimit) / (float)(floorY2 - floorY1); - for (l = floorY1; l <= floorY2; l++) { + chiquez = (float)(lowerLimit - upperLimit) / (float)(_walkRect.bottom - _walkRect.top); + for (l = _walkRect.top; l <= _walkRect.bottom; l++) { factor_red[l] = (int)(upperLimit + pequegnez); pequegnez = pequegnez + chiquez; } } if (_roomNumber == 24) { - for (l = floorY1 - 1; l > 74; l--) { + for (l = _walkRect.top - 1; l > 74; l--) { factor_red[l] = (int)(upperLimit - pequegnez); pequegnez = pequegnez + chiquez; } } if (currentChapter == 5 && _roomNumber == 54) { - for (l = floorY1 - 1; l > 84; l--) { + for (l = _walkRect.top - 1; l > 84; l--) { factor_red[l] = (int)(upperLimit - pequegnez); pequegnez = pequegnez + chiquez; } @@ -1820,8 +1826,8 @@ void DrasculaEngine::enterRoom(int roomIndex) { if (currentChapter != 2) { if (curX == -1) { - curX = _destX[objIsExit]; - curY = _destY[objIsExit]; + curX = _doorDestPoint[objIsExit].x; + curY = _doorDestPoint[objIsExit].y; curHeight = (CHARACTER_HEIGHT * factor_red[curY]) / 100; curWidth = (CHARACTER_WIDTH * factor_red[curY]) / 100; curY = curY - curHeight; @@ -1915,7 +1921,7 @@ bool DrasculaEngine::exitRoom(int doorNumber) { ((currentChapter != 3 && currentChapter != 5) || visible[doorNumber] == 1)) { hideCursor(); - gotoObject(roomObjX[doorNumber], roomObjY[doorNumber]); + walkToPoint(_roomObject[doorNumber]); if (currentChapter != 2) { trackProtagonist = trackObj[doorNumber]; updateRoom(); @@ -1923,7 +1929,7 @@ bool DrasculaEngine::exitRoom(int doorNumber) { } _characterMoved = false; trackProtagonist = trackCharacter_alkeva[doorNumber]; - objExit = roomExits[doorNumber]; + objExit = _roomExitId[doorNumber]; doBreak = 1; previousMusic = roomMusic; @@ -1935,8 +1941,8 @@ bool DrasculaEngine::exitRoom(int doorNumber) { if (objectNum[doorNumber] == 136) animation_2_2(); if (objectNum[doorNumber] == 124) { - gotoObject(163, 106); - gotoObject(287, 101); + walkToPoint(Common::Point(163, 106)); + walkToPoint(Common::Point(287, 101)); trackProtagonist = 0; } if (objectNum[doorNumber] == 173) { @@ -1953,16 +1959,14 @@ bool DrasculaEngine::exitRoom(int doorNumber) { addObject(kItemEarplugs); } } else if (currentChapter == 4 && objectNum[doorNumber] == 108) { - gotoObject(171, 78); + walkToPoint(Common::Point(171, 78)); } if (currentChapter == 5) _characterVisible = true; clearRoom(); - if (!sscanf(_targetSurface[doorNumber], "%d", &roomNum)) { - error("Malformed roomNum in targetSurface (%s)", _targetSurface[doorNumber]); - } + roomNum = _doorDestRoom[doorNumber]; curX = -1; enterRoom(roomNum); -- cgit v1.2.3