aboutsummaryrefslogtreecommitdiff
path: root/engines/drascula
diff options
context:
space:
mode:
authorWillem Jan Palenstijn2017-11-14 19:13:48 +0100
committerWillem Jan Palenstijn2017-11-14 19:14:00 +0100
commitbf69b25e33189581848412e77624865aa55ba234 (patch)
tree9b45f9c606a7060afdccee9a4c8768357ad7d4f3 /engines/drascula
parentc8d3429ab47cdc484b8ab042c9686d976c17ea64 (diff)
downloadscummvm-rg350-bf69b25e33189581848412e77624865aa55ba234.tar.gz
scummvm-rg350-bf69b25e33189581848412e77624865aa55ba234.tar.bz2
scummvm-rg350-bf69b25e33189581848412e77624865aa55ba234.zip
DRASCULA: Revert range 4dbed774..1f1d8607
This reverts 1f1d8607 DRASCULA: Merge the floor coordinates into _walkRect 1e1b6f7c DRASCULA: Rename gotoObject() to walkToPoint() and simplify it 2bf05c2a DRASCULA: Clean up room variables, and simplify some related checks Reverting due to unanswered questions about why the changes in behaviour in 2bf05c2a746065f373ac136c994714dae376cdbc are correct.
Diffstat (limited to 'engines/drascula')
-rw-r--r--engines/drascula/animation.cpp38
-rw-r--r--engines/drascula/drascula.cpp33
-rw-r--r--engines/drascula/drascula.h14
-rw-r--r--engines/drascula/interface.cpp4
-rw-r--r--engines/drascula/objects.cpp10
-rw-r--r--engines/drascula/rooms.cpp80
6 files changed, 92 insertions, 87 deletions
diff --git a/engines/drascula/animation.cpp b/engines/drascula/animation.cpp
index c89e5ff738..741c145132 100644
--- a/engines/drascula/animation.cpp
+++ b/engines/drascula/animation.cpp
@@ -362,7 +362,7 @@ void DrasculaEngine::animation_2_1() {
int l;
- walkToPoint(Common::Point(231, 91));
+ gotoObject(231, 91);
_characterVisible = false;
term_int = 0;
@@ -439,7 +439,7 @@ void DrasculaEngine::animation_2_1() {
if (animate("lev.bin", 15))
break;
- walkToPoint(Common::Point(100 + curWidth / 2, 99 + curHeight));
+ gotoObject(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;
- walkToPoint(Common::Point(132, 97 + curHeight));
+ gotoObject(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);
- walkToPoint(Common::Point(157, 98 + curHeight));
+ gotoObject(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;
- walkToPoint(Common::Point(157, 147));
- walkToPoint(Common::Point(131, 149));
+ gotoObject(157, 147);
+ gotoObject(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);
- walkToPoint(Common::Point(159, 140));
+ gotoObject(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()");
- walkToPoint(Common::Point(96, 165));
- walkToPoint(Common::Point(79, 165));
+ gotoObject(96, 165);
+ gotoObject(79, 165);
updateRoom();
updateScreen();
@@ -1130,7 +1130,7 @@ void DrasculaEngine::animation_2_3() {
loadPic(97, extraSurface);
loadPic(99, backSurface);
- walkToPoint(Common::Point(332, 127));
+ gotoObject(332, 127);
}
void DrasculaEngine::animation_6_3() {
@@ -1221,7 +1221,7 @@ void DrasculaEngine::animation_1_5() {
talk_bj(19);
talk(229);
pause(5);
- walkToPoint(Common::Point(114, 170));
+ gotoObject(114, 170);
trackProtagonist = 3;
talk(431);
talk_bj(20);
@@ -1265,7 +1265,7 @@ void DrasculaEngine::animation_5_5(){
selectVerb(kVerbNone);
removeObject(8);
- walkToPoint(Common::Point(curX - 19, curY + curHeight));
+ gotoObject(curX - 19, curY + curHeight);
trackProtagonist = 1;
updateRoom();
updateScreen();
@@ -1429,8 +1429,8 @@ void DrasculaEngine::animation_12_5() {
loadPic(99, backSurface);
- walkToPoint(Common::Point(40, 169));
- walkToPoint(Common::Point(-14, 175));
+ gotoObject(40, 169);
+ gotoObject(-14, 175);
doBreak = 1;
previousMusic = roomMusic;
@@ -1487,7 +1487,7 @@ void DrasculaEngine::animation_14_5() {
pause(17);
trackProtagonist = 3;
talk(246);
- walkToPoint(Common::Point(89, 160));
+ gotoObject(89, 160);
flags[10] = 1;
playSound(7);
updateRoom();
@@ -1659,7 +1659,7 @@ void DrasculaEngine::animation_9_6() {
updateScreen();
fadeFromBlack(0);
pause(96);
- walkToPoint(Common::Point(116, 178));
+ gotoObject(116, 178);
trackProtagonist = 2;
updateRoom();
updateScreen();
@@ -1844,7 +1844,7 @@ void DrasculaEngine::animation_24_2() {
debug(4, "animation_24_2()");
if (curX < 178)
- walkToPoint(Common::Point(208, 136));
+ gotoObject(208, 136);
trackProtagonist = 3;
updateRoom();
pause(3);
@@ -2139,8 +2139,8 @@ void DrasculaEngine::animation_5_4(){
trackProtagonist = 3;
loadPic("anh_dr.alg", backSurface);
- walkToPoint(Common::Point(99, 160));
- walkToPoint(Common::Point(38, 177));
+ gotoObject(99, 160);
+ gotoObject(38, 177);
_characterVisible = false;
updateRoom();
updateScreen();
diff --git a/engines/drascula/drascula.cpp b/engines/drascula/drascula.cpp
index 3f840b0901..1f3f0c654d 100644
--- a/engines/drascula/drascula.cpp
+++ b/engines/drascula/drascula.cpp
@@ -94,6 +94,10 @@ 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;
@@ -440,7 +444,7 @@ bool DrasculaEngine::runCurrentChapter() {
enterRoom(62);
curX = -20;
curY = 56;
- walkToPoint(Common::Point(65, 145));
+ gotoObject(65, 145);
}
// REMINDER: This is a good place to debug animations
@@ -546,14 +550,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)) {
- walkToPoint(Common::Point(178, 121));
- walkToPoint(Common::Point(169, 135));
+ gotoObject(178, 121);
+ gotoObject(169, 135);
} else if (_roomNumber == 14 && (curX == 214) && (curY + curHeight == 121)) {
_walkToObject = true;
- walkToPoint(Common::Point(190, 130));
+ gotoObject(190, 130);
} else if (_roomNumber == 14 && (curX == 246) && (curY + curHeight == 112)) {
_walkToObject = true;
- walkToPoint(Common::Point(190, 130));
+ gotoObject(190, 130);
}
}
@@ -740,7 +744,8 @@ bool DrasculaEngine::verify1() {
removeObject();
else {
for (l = 0; l < numRoomObjs; l++) {
- if (_objectRect[l].contains(Common::Point(_mouseX, _mouseY)) && doBreak == 0) {
+ if (_mouseX >= _objectX1[l] && _mouseY >= _objectY1[l]
+ && _mouseX <= _objectX2[l] && _mouseY <= _objectY2[l] && doBreak == 0) {
if (exitRoom(l))
return true;
if (doBreak == 1)
@@ -753,9 +758,10 @@ bool DrasculaEngine::verify1() {
doBreak = 1;
for (l = 0; l < numRoomObjs; l++) {
- if (_objectRect[l].contains(Common::Point(_mouseX, _mouseY)) && doBreak == 0) {
- roomX = _roomObject[l].x;
- roomY = _roomObject[l].y;
+ if (_mouseX > _objectX1[l] && _mouseY > _objectY1[l]
+ && _mouseX < _objectX2[l] && _mouseY < _objectY2[l] && doBreak == 0) {
+ roomX = roomObjX[l];
+ roomY = roomObjY[l];
trackFinal = trackObj[l];
doBreak = 1;
_walkToObject = true;
@@ -764,8 +770,8 @@ bool DrasculaEngine::verify1() {
}
if (doBreak == 0) {
- roomX = CLIP<int16>(_mouseX, _walkRect.left, _walkRect.right);
- roomY = CLIP<int16>(_mouseY, _walkRect.top + feetHeight, _walkRect.bottom);
+ roomX = CLIP(_mouseX, floorX1, floorX2);
+ roomY = CLIP(_mouseY, floorY1 + feetHeight, floorY2);
startWalking();
}
doBreak = 0;
@@ -786,10 +792,11 @@ bool DrasculaEngine::verify2() {
return true;
} else {
for (l = 0; l < numRoomObjs; l++) {
- if (_objectRect[l].contains(Common::Point(_mouseX, _mouseY)) && visible[l] == 1) {
+ if (_mouseX > _objectX1[l] && _mouseY > _objectY1[l]
+ && _mouseX < _objectX2[l] && _mouseY < _objectY2[l] && visible[l] == 1) {
trackFinal = trackObj[l];
_walkToObject = true;
- walkToPoint(_roomObject[l]);
+ gotoObject(roomObjX[l], roomObjY[l]);
if (checkAction(objectNum[l]))
return true;
if (currentChapter == 4)
diff --git a/engines/drascula/drascula.h b/engines/drascula/drascula.h
index a7eadcd069..fbc29ed206 100644
--- a/engines/drascula/drascula.h
+++ b/engines/drascula/drascula.h
@@ -420,13 +420,11 @@ public:
char iconName[44][13];
int objectNum[40], visible[40], isDoor[40];
- int trackObj[40];
- Common::Point _roomObject[40];
+ int roomObjX[40], roomObjY[40], trackObj[40];
int inventoryObjects[43];
- int _doorDestRoom[40];
- Common::Point _doorDestPoint[40];
- int trackCharacter_alkeva[40], _roomExitId[40];
- Common::Rect _objectRect[40];
+ char _targetSurface[40][20];
+ int _destX[40], _destY[40], trackCharacter_alkeva[40], roomExits[40];
+ int _objectX1[40], _objectY1[40], _objectX2[40], _objectY2[40];
int takeObject, pickedObject;
bool _subtitlesDisabled;
bool _menuBar, _menuScreen, _hasName;
@@ -443,7 +441,7 @@ public:
int doBreak;
int stepX, stepY;
int curHeight, curWidth, feetHeight;
- Common::Rect _walkRect;
+ int floorX1, floorY1, floorX2, floorY2;
int lowerLimit, upperLimit;
int trackFinal;
bool _walkToObject;
@@ -487,7 +485,7 @@ public:
void enterRoom(int);
void clearRoom();
- void walkToPoint(Common::Point pos);
+ void gotoObject(int, int);
void moveCursor();
void checkObjects();
void selectVerbFromBar();
diff --git a/engines/drascula/interface.cpp b/engines/drascula/interface.cpp
index a0656e1f41..07f192cd4c 100644
--- a/engines/drascula/interface.cpp
+++ b/engines/drascula/interface.cpp
@@ -165,7 +165,9 @@ void DrasculaEngine::showMap() {
_hasName = false;
for (int l = 0; l < numRoomObjs; l++) {
- if (_objectRect[l].contains(Common::Point(_mouseX, _mouseY)) && visible[l] == 1) {
+ if (_mouseX > _objectX1[l] && _mouseY > _objectY1[l]
+ && _mouseX < _objectX2[l] && _mouseY < _objectY2[l]
+ && visible[l] == 1) {
strcpy(textName, objName[l]);
_hasName = true;
}
diff --git a/engines/drascula/objects.cpp b/engines/drascula/objects.cpp
index 65c042a9fe..cff26c93d5 100644
--- a/engines/drascula/objects.cpp
+++ b/engines/drascula/objects.cpp
@@ -57,7 +57,7 @@ void DrasculaEngine::chooseObject(int object) {
pickedObject = object;
}
-void DrasculaEngine::walkToPoint(Common::Point pos) {
+void DrasculaEngine::gotoObject(int pointX, int pointY) {
bool cursorVisible = isCursorVisible();
hideCursor();
@@ -70,8 +70,8 @@ void DrasculaEngine::walkToPoint(Common::Point pos) {
return;
}
}
- roomX = pos.x;
- roomY = pos.y;
+ roomX = pointX;
+ roomY = pointY;
startWalking();
while (!shouldQuit()) {
@@ -102,7 +102,9 @@ void DrasculaEngine::checkObjects() {
_hasName = false;
for (l = 0; l < numRoomObjs; l++) {
- if (_objectRect[l].contains(Common::Point(_mouseX, _mouseY)) && visible[l] == 1 && isDoor[l] == 0) {
+ if (_mouseX > _objectX1[l] && _mouseY > _objectY1[l]
+ && _mouseX < _objectX2[l] && _mouseY < _objectY2[l]
+ && 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 f99f00c8e7..75d2928f0f 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) {
- walkToPoint(Common::Point(260, 180));
+ gotoObject(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);
- walkToPoint(Common::Point(153, 180));
+ gotoObject(153, 180);
} else if (pickedObject == kVerbPick && fl == 143 && flags[18] == 0) {
- walkToPoint(Common::Point(260, 180));
+ gotoObject(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);
- walkToPoint(Common::Point(153, 180));
+ gotoObject(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();
- walkToPoint(Common::Point(curX - 3, curY + curHeight + 6));
+ gotoObject(curX - 3, curY + curHeight + 6);
} else
hasAnswer = 0;
@@ -972,7 +972,7 @@ bool DrasculaEngine::room_59(int fl) {
delay(40);
finishSound();
delay(10);
- walkToPoint(Common::Point(174, 168));
+ gotoObject(174, 168);
trackProtagonist = 2;
updateRoom();
updateScreen();
@@ -1705,38 +1705,32 @@ 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(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(_objectX1[l]);
+ p.parseInt(_objectY1[l]);
+ p.parseInt(_objectX2[l]);
+ p.parseInt(_objectY2[l]);
+ p.parseInt(roomObjX[l]);
+ p.parseInt(roomObjY[l]);
p.parseInt(trackObj[l]);
p.parseInt(visible[l]);
p.parseInt(isDoor[l]);
if (isDoor[l] != 0) {
- p.parseInt(_doorDestRoom[l]);
- p.parseInt(x1);
- p.parseInt(y1);
- _doorDestPoint[l] = Common::Point(x1, y1);
+ p.parseString(_targetSurface[l]);
+ p.parseInt(_destX[l]);
+ p.parseInt(_destY[l]);
p.parseInt(trackCharacter_alkeva[l]);
- p.parseInt(_roomExitId[l]);
+ p.parseInt(roomExits[l]);
updateDoor(l);
}
}
- p.parseInt(x1);
- p.parseInt(y1);
- p.parseInt(x2);
- p.parseInt(y2);
- _walkRect = Common::Rect(x1, y1, x2, y2);
+ p.parseInt(floorX1);
+ p.parseInt(floorY1);
+ p.parseInt(floorX2);
+ p.parseInt(floorY2);
if (currentChapter != 2) {
p.parseInt(upperLimit);
@@ -1773,8 +1767,8 @@ void DrasculaEngine::enterRoom(int roomIndex) {
if (currentChapter == 2) {
if (curX == -1) {
- curX = _doorDestPoint[objIsExit].x;
- curY = _doorDestPoint[objIsExit].y - curHeight;
+ curX = _destX[objIsExit];
+ curY = _destY[objIsExit] - curHeight;
}
_characterMoved = false;
}
@@ -1798,27 +1792,27 @@ void DrasculaEngine::enterRoom(int roomIndex) {
color_abc(kColorLightGreen);
if (currentChapter != 2) {
- for (l = 0; l <= _walkRect.top; l++)
+ for (l = 0; l <= floorY1; l++)
factor_red[l] = upperLimit;
- for (l = _walkRect.top; l <= 201; l++)
+ for (l = floorY1; l <= 201; l++)
factor_red[l] = lowerLimit;
- chiquez = (float)(lowerLimit - upperLimit) / (float)(_walkRect.bottom - _walkRect.top);
- for (l = _walkRect.top; l <= _walkRect.bottom; l++) {
+ chiquez = (float)(lowerLimit - upperLimit) / (float)(floorY2 - floorY1);
+ for (l = floorY1; l <= floorY2; l++) {
factor_red[l] = (int)(upperLimit + pequegnez);
pequegnez = pequegnez + chiquez;
}
}
if (_roomNumber == 24) {
- for (l = _walkRect.top - 1; l > 74; l--) {
+ for (l = floorY1 - 1; l > 74; l--) {
factor_red[l] = (int)(upperLimit - pequegnez);
pequegnez = pequegnez + chiquez;
}
}
if (currentChapter == 5 && _roomNumber == 54) {
- for (l = _walkRect.top - 1; l > 84; l--) {
+ for (l = floorY1 - 1; l > 84; l--) {
factor_red[l] = (int)(upperLimit - pequegnez);
pequegnez = pequegnez + chiquez;
}
@@ -1826,8 +1820,8 @@ void DrasculaEngine::enterRoom(int roomIndex) {
if (currentChapter != 2) {
if (curX == -1) {
- curX = _doorDestPoint[objIsExit].x;
- curY = _doorDestPoint[objIsExit].y;
+ curX = _destX[objIsExit];
+ curY = _destY[objIsExit];
curHeight = (CHARACTER_HEIGHT * factor_red[curY]) / 100;
curWidth = (CHARACTER_WIDTH * factor_red[curY]) / 100;
curY = curY - curHeight;
@@ -1921,7 +1915,7 @@ bool DrasculaEngine::exitRoom(int doorNumber) {
((currentChapter != 3 && currentChapter != 5) || visible[doorNumber] == 1)) {
hideCursor();
- walkToPoint(_roomObject[doorNumber]);
+ gotoObject(roomObjX[doorNumber], roomObjY[doorNumber]);
if (currentChapter != 2) {
trackProtagonist = trackObj[doorNumber];
updateRoom();
@@ -1929,7 +1923,7 @@ bool DrasculaEngine::exitRoom(int doorNumber) {
}
_characterMoved = false;
trackProtagonist = trackCharacter_alkeva[doorNumber];
- objExit = _roomExitId[doorNumber];
+ objExit = roomExits[doorNumber];
doBreak = 1;
previousMusic = roomMusic;
@@ -1941,8 +1935,8 @@ bool DrasculaEngine::exitRoom(int doorNumber) {
if (objectNum[doorNumber] == 136)
animation_2_2();
if (objectNum[doorNumber] == 124) {
- walkToPoint(Common::Point(163, 106));
- walkToPoint(Common::Point(287, 101));
+ gotoObject(163, 106);
+ gotoObject(287, 101);
trackProtagonist = 0;
}
if (objectNum[doorNumber] == 173) {
@@ -1959,14 +1953,16 @@ bool DrasculaEngine::exitRoom(int doorNumber) {
addObject(kItemEarplugs);
}
} else if (currentChapter == 4 && objectNum[doorNumber] == 108) {
- walkToPoint(Common::Point(171, 78));
+ gotoObject(171, 78);
}
if (currentChapter == 5)
_characterVisible = true;
clearRoom();
- roomNum = _doorDestRoom[doorNumber];
+ if (!sscanf(_targetSurface[doorNumber], "%d", &roomNum)) {
+ error("Malformed roomNum in targetSurface (%s)", _targetSurface[doorNumber]);
+ }
curX = -1;
enterRoom(roomNum);