mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-09 11:20:56 +00:00
64b57afe2c
This reverts commit bf69b25e33
.
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.
308 lines
7.5 KiB
C++
308 lines
7.5 KiB
C++
/* 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.
|
|
*
|
|
*/
|
|
|
|
#include "common/textconsole.h"
|
|
|
|
#include "drascula/drascula.h"
|
|
|
|
namespace Drascula {
|
|
|
|
void DrasculaEngine::pickObject(int object) {
|
|
if (currentChapter == 6)
|
|
loadPic("iconsp.alg", backSurface);
|
|
else if (currentChapter == 4)
|
|
loadPic("icons2.alg", backSurface);
|
|
else if (currentChapter == 5)
|
|
loadPic("icons3.alg", backSurface);
|
|
else
|
|
loadPic("icons.alg", backSurface);
|
|
chooseObject(object);
|
|
if (currentChapter == 2)
|
|
loadPic(menuBackground, backSurface);
|
|
else
|
|
loadPic(99, backSurface);
|
|
}
|
|
|
|
void DrasculaEngine::chooseObject(int object) {
|
|
if (currentChapter == 5) {
|
|
if (takeObject == 1 && !_menuScreen && pickedObject != 16)
|
|
addObject(pickedObject);
|
|
} else {
|
|
if (takeObject == 1 && !_menuScreen)
|
|
addObject(pickedObject);
|
|
}
|
|
for (int i = 0; i < OBJHEIGHT; i++)
|
|
memcpy(mouseCursor + i * OBJWIDTH, backSurface + _x1d_menu[object] + (_y1d_menu[object] + i) * 320, OBJWIDTH);
|
|
setCursor(kCursorCurrentItem);
|
|
takeObject = 1;
|
|
pickedObject = object;
|
|
}
|
|
|
|
void DrasculaEngine::walkToPoint(Common::Point pos) {
|
|
bool cursorVisible = isCursorVisible();
|
|
hideCursor();
|
|
|
|
if (currentChapter == 5 || currentChapter == 6) {
|
|
if (!_characterVisible) {
|
|
curX = roomX;
|
|
curY = roomY;
|
|
updateRoom();
|
|
updateScreen();
|
|
return;
|
|
}
|
|
}
|
|
roomX = pos.x;
|
|
roomY = pos.y;
|
|
startWalking();
|
|
|
|
while (!shouldQuit()) {
|
|
updateRoom();
|
|
updateScreen();
|
|
updateEvents();
|
|
if (!_characterMoved)
|
|
break;
|
|
|
|
pause(3);
|
|
}
|
|
|
|
if (_walkToObject) {
|
|
_walkToObject = false;
|
|
trackProtagonist = trackFinal;
|
|
}
|
|
updateRoom();
|
|
updateScreen();
|
|
|
|
// _roomNumber -2 is end credits. Do not show cursor there
|
|
if (cursorVisible && _roomNumber != -2)
|
|
showCursor();
|
|
}
|
|
|
|
void DrasculaEngine::checkObjects() {
|
|
int l;
|
|
|
|
_hasName = false;
|
|
|
|
for (l = 0; l < numRoomObjs; l++) {
|
|
if (_objectRect[l].contains(Common::Point(_mouseX, _mouseY)) && visible[l] == 1 && isDoor[l] == 0) {
|
|
strcpy(textName, objName[l]);
|
|
_hasName = true;
|
|
}
|
|
}
|
|
|
|
if (_mouseX > curX + 2 && _mouseY > curY + 2
|
|
&& _mouseX < curX + curWidth - 2 && _mouseY < curY + curHeight - 2) {
|
|
if (currentChapter == 2 || !_hasName) {
|
|
strcpy(textName, _textmisc[3]); // "hacker"
|
|
_hasName = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Remove an item from the inventory, namely the item in the slot
|
|
* over which the mouse cursor currently hovers.
|
|
*/
|
|
void DrasculaEngine::removeObject() {
|
|
int obj = 0, n;
|
|
|
|
updateRoom();
|
|
|
|
n = whichObject();
|
|
if (n != 0) {
|
|
obj = inventoryObjects[n];
|
|
inventoryObjects[n] = 0;
|
|
if (obj != 0)
|
|
takeObject = 1;
|
|
}
|
|
|
|
updateEvents();
|
|
|
|
if (takeObject == 1)
|
|
chooseObject(obj);
|
|
}
|
|
|
|
/**
|
|
* Remove the item with the given id from the inventory.
|
|
* Returns 0 if was in the inventory, 1 otherwise.
|
|
*/
|
|
int DrasculaEngine::removeObject(int obj) {
|
|
for (int n = 1; n < ARRAYSIZE(inventoryObjects); n++) {
|
|
if (inventoryObjects[n] == obj) {
|
|
inventoryObjects[n] = 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
bool DrasculaEngine::pickupObject() {
|
|
int obj = pickedObject;
|
|
checkFlags = 1;
|
|
|
|
updateRoom();
|
|
showMenu();
|
|
updateScreen();
|
|
|
|
// Objects with an ID smaller than 7 are the inventory verbs
|
|
if (pickedObject >= 7) {
|
|
int n = whichObject();
|
|
if (n != 0 && inventoryObjects[n] == 0) {
|
|
inventoryObjects[n] = obj;
|
|
takeObject = 0;
|
|
checkFlags = 0;
|
|
}
|
|
}
|
|
|
|
if (checkFlags == 1) {
|
|
if (checkMenuFlags())
|
|
return true;
|
|
}
|
|
updateEvents();
|
|
if (takeObject == 0)
|
|
selectVerb(kVerbNone);
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Add the object with the given id to the inventory.
|
|
*/
|
|
void DrasculaEngine::addObject(int obj) {
|
|
int n;
|
|
|
|
// Check whether obj is already in the inventory.
|
|
// If it is, just do nothing and return.
|
|
for (n = 1; n < ARRAYSIZE(inventoryObjects); n++) {
|
|
if (inventoryObjects[n] == obj)
|
|
return;
|
|
}
|
|
|
|
// Otherwise, look for a free slot and add the object there.
|
|
for (n = 1; n < ARRAYSIZE(inventoryObjects); n++) {
|
|
if (inventoryObjects[n] == 0) {
|
|
inventoryObjects[n] = obj;
|
|
return;
|
|
}
|
|
}
|
|
|
|
// If we get here, then we failed to add the object to the inventory.
|
|
error("DrasculaEngine::addObject: Failed to add object %d to inventory", obj);
|
|
}
|
|
|
|
/**
|
|
* Return the id of the inventory slot under the mouse cursor right now.
|
|
* If no inventory slot is under the mouse cursor, return 0.
|
|
*/
|
|
int DrasculaEngine::whichObject() {
|
|
int n;
|
|
|
|
for (n = 1; n < ARRAYSIZE(inventoryObjects); n++) {
|
|
if (_mouseX > _itemLocations[n].x && _mouseY > _itemLocations[n].y &&
|
|
_mouseX < _itemLocations[n].x + OBJWIDTH &&
|
|
_mouseY < _itemLocations[n].y + OBJHEIGHT) {
|
|
return n;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void DrasculaEngine::updateVisible() {
|
|
if (currentChapter == 1) {
|
|
// nothing
|
|
} else if (currentChapter == 2) {
|
|
if (_roomNumber == 2 && flags[40] == 0)
|
|
visible[3] = 0;
|
|
else if (_roomNumber == 3 && flags[3] == 1)
|
|
visible[8] = 0;
|
|
else if (_roomNumber == 6 && flags[1] == 1 && flags[10] == 0) {
|
|
visible[2] = 0;
|
|
visible[4] = 1;
|
|
} else if (_roomNumber == 7 && flags[35] == 1)
|
|
visible[3] = 0;
|
|
else if (_roomNumber == 14 && flags[5] == 1)
|
|
visible[4] = 0;
|
|
else if (_roomNumber == 18 && flags[28] == 1)
|
|
visible[2] = 0;
|
|
} else if (currentChapter == 3) {
|
|
// nothing
|
|
} else if (currentChapter == 4) {
|
|
if (_roomNumber == 23 && flags[0] == 0 && flags[11] == 0)
|
|
visible[2] = 1;
|
|
if (_roomNumber == 23 && flags[0] == 1 && flags[11] == 0)
|
|
visible[2] = 0;
|
|
if (_roomNumber == 21 && flags[10] == 1)
|
|
visible[2] = 0;
|
|
if (_roomNumber == 22 && flags[26] == 1) {
|
|
visible[2] = 0;
|
|
visible[1] = 1;
|
|
}
|
|
if (_roomNumber == 22 && flags[27] == 1)
|
|
visible[3] = 0;
|
|
if (_roomNumber == 26 && flags[21] == 0)
|
|
Common::strlcpy(objName[2], _textmisc[0], 20);
|
|
if (_roomNumber == 26 && flags[18] == 1)
|
|
visible[2] = 0;
|
|
if (_roomNumber == 26 && flags[12] == 1)
|
|
visible[1] = 0;
|
|
if (_roomNumber == 31 && flags[13] == 1)
|
|
visible[1] = 0;
|
|
if (_roomNumber == 35 && flags[14] == 1)
|
|
visible[2] = 0;
|
|
if (_roomNumber == 35 && flags[17] == 1)
|
|
visible[3] = 1;
|
|
if (_roomNumber == 35 && flags[15] == 1)
|
|
visible[1] = 0;
|
|
} else if (currentChapter == 5) {
|
|
if (_roomNumber == 49 && flags[6] == 1)
|
|
visible[2] = 0;
|
|
if (_roomNumber == 49 && flags[6] == 0)
|
|
visible[1] = 0;
|
|
if (_roomNumber == 49 && flags[6] == 1)
|
|
visible[1] = 1;
|
|
if (_roomNumber == 45 && flags[6] == 1)
|
|
visible[3] = 1;
|
|
if (_roomNumber == 53 && flags[2] == 1)
|
|
visible[3] = 0;
|
|
if (_roomNumber == 54 && flags[13] == 1)
|
|
visible[3] = 0;
|
|
if (_roomNumber == 55 && flags[8] == 1)
|
|
visible[1] = 0;
|
|
} else if (currentChapter == 6) {
|
|
if (_roomNumber == 58 && flags[8] == 0)
|
|
isDoor[1] = 0;
|
|
if (_roomNumber == 58 && flags[8] == 1)
|
|
isDoor[1] = 1;
|
|
if (_roomNumber == 59)
|
|
isDoor[1] = 0;
|
|
if (_roomNumber == 60) {
|
|
trackDrascula = 0;
|
|
drasculaX = 155;
|
|
drasculaY = 69;
|
|
}
|
|
}
|
|
}
|
|
|
|
} // End of namespace Drascula
|