mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-23 11:04:44 +00:00
64b57afe2c
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.
176 lines
4.3 KiB
C++
176 lines
4.3 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 "drascula/drascula.h"
|
|
#include "graphics/cursorman.h"
|
|
|
|
namespace Drascula {
|
|
|
|
void DrasculaEngine::setCursor(int cursor) {
|
|
switch (cursor) {
|
|
case kCursorCrosshair:
|
|
CursorMan.replaceCursor(crosshairCursor, 40, 25, 20, 17, 255);
|
|
break;
|
|
case kCursorCurrentItem:
|
|
CursorMan.replaceCursor(mouseCursor, OBJWIDTH, OBJHEIGHT, 20, 17, 255);
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void DrasculaEngine::showCursor() {
|
|
CursorMan.showMouse(true);
|
|
}
|
|
|
|
void DrasculaEngine::hideCursor() {
|
|
CursorMan.showMouse(false);
|
|
}
|
|
|
|
bool DrasculaEngine::isCursorVisible() {
|
|
return CursorMan.isVisible();
|
|
}
|
|
|
|
void DrasculaEngine::selectVerbFromBar() {
|
|
for (int n = 0; n < 7; n++) {
|
|
if (_mouseX > _verbBarX[n] && _mouseX < _verbBarX[n + 1] && n > 0) {
|
|
selectVerb(n);
|
|
return;
|
|
}
|
|
}
|
|
|
|
// no verb selected
|
|
selectVerb(kVerbNone);
|
|
}
|
|
|
|
void DrasculaEngine::selectVerb(int verb) {
|
|
debug(4, "selectVerb(%d)", verb);
|
|
|
|
int c = _menuScreen ? 0 : 171;
|
|
|
|
if (currentChapter == 5) {
|
|
if (takeObject == 1 && pickedObject != 16)
|
|
addObject(pickedObject);
|
|
} else {
|
|
if (takeObject == 1)
|
|
addObject(pickedObject);
|
|
}
|
|
|
|
for (int i = 0; i < OBJHEIGHT; i++)
|
|
memcpy(mouseCursor + i * OBJWIDTH, cursorSurface + OBJWIDTH * verb + (c + i) * 320, OBJWIDTH);
|
|
setCursor(kCursorCurrentItem);
|
|
|
|
if (verb > 0) {
|
|
takeObject = 1;
|
|
pickedObject = verb;
|
|
} else {
|
|
takeObject = 0;
|
|
_hasName = false;
|
|
}
|
|
}
|
|
|
|
bool DrasculaEngine::confirmExit() {
|
|
byte key = 0;
|
|
|
|
color_abc(kColorRed);
|
|
updateRoom();
|
|
centerText(_textsys[1], 160, 87);
|
|
updateScreen();
|
|
|
|
delay(100);
|
|
while (!shouldQuit()) {
|
|
key = getScan();
|
|
if (key != 0)
|
|
break;
|
|
|
|
// This gives a better feedback to the user when he is asked to
|
|
// confirm whether he wants to quit. It now still updates the room and
|
|
// shows mouse cursor movement. Hopefully it will work in all
|
|
// locations of the game.
|
|
updateRoom();
|
|
color_abc(kColorRed);
|
|
centerText(_textsys[1], 160, 87);
|
|
updateScreen();
|
|
}
|
|
|
|
if (key == Common::KEYCODE_ESCAPE || shouldQuit()) {
|
|
stopMusic();
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void DrasculaEngine::showMenu() {
|
|
int h, n, x;
|
|
byte *srcSurface = (currentChapter == 6) ? tableSurface : frontSurface;
|
|
x = whichObject();
|
|
|
|
for (n = 1; n < ARRAYSIZE(inventoryObjects); n++) {
|
|
h = inventoryObjects[n];
|
|
|
|
if (h != 0) {
|
|
copyBackground(_polX[n], _polY[n], _itemLocations[n].x, _itemLocations[n].y,
|
|
OBJWIDTH, OBJHEIGHT, srcSurface, screenSurface);
|
|
}
|
|
copyRect(_x1d_menu[h], _y1d_menu[h], _itemLocations[n].x, _itemLocations[n].y,
|
|
OBJWIDTH, OBJHEIGHT, cursorSurface, screenSurface);
|
|
}
|
|
|
|
if (x < 7)
|
|
print_abc(iconName[x], _itemLocations[x].x - 2, _itemLocations[x].y - 7);
|
|
}
|
|
|
|
void DrasculaEngine::clearMenu() {
|
|
int n, verbActivated = 1;
|
|
|
|
for (n = 0; n < 7; n++) {
|
|
if (_mouseX > _verbBarX[n] && _mouseX < _verbBarX[n + 1])
|
|
verbActivated = 0;
|
|
copyRect(OBJWIDTH * n, OBJHEIGHT * verbActivated, _verbBarX[n], 2,
|
|
OBJWIDTH, OBJHEIGHT, cursorSurface, screenSurface);
|
|
verbActivated = 1;
|
|
}
|
|
}
|
|
|
|
bool DrasculaEngine::checkMenuFlags() {
|
|
int n = whichObject();
|
|
if (n != 0) {
|
|
if (inventoryObjects[n] != 0 && checkAction(inventoryObjects[n]))
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void DrasculaEngine::showMap() {
|
|
_hasName = false;
|
|
|
|
for (int l = 0; l < numRoomObjs; l++) {
|
|
if (_objectRect[l].contains(Common::Point(_mouseX, _mouseY)) && visible[l] == 1) {
|
|
strcpy(textName, objName[l]);
|
|
_hasName = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
} // End of namespace Drascula
|