diff options
Diffstat (limited to 'engines/drascula/objects.cpp')
-rw-r--r-- | engines/drascula/objects.cpp | 300 |
1 files changed, 300 insertions, 0 deletions
diff --git a/engines/drascula/objects.cpp b/engines/drascula/objects.cpp new file mode 100644 index 0000000000..01967d975d --- /dev/null +++ b/engines/drascula/objects.cpp @@ -0,0 +1,300 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#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 == 0 && pickedObject != 16) + addObject(pickedObject); + } else { + if (takeObject == 1 && menuScreen == 0) + addObject(pickedObject); + } + copyBackground(_x1d_menu[object], _y1d_menu[object], 0, 0, OBJWIDTH,OBJHEIGHT, backSurface, drawSurface3); + takeObject = 1; + pickedObject = object; +} + +int DrasculaEngine::removeObject(int obj) { + int result = 1; + + for (int h = 1; h < 43; h++) { + if (inventoryObjects[h] == obj) { + inventoryObjects[h] = 0; + result = 0; + break; + } + } + + return result; +} + +void DrasculaEngine::withoutVerb() { + int c = (menuScreen == 1) ? 0 : 171; + + if (currentChapter == 5) { + if (takeObject == 1 && pickedObject != 16) + addObject(pickedObject); + } else { + if (takeObject == 1) + addObject(pickedObject); + } + copyBackground(0, c, 0, 0, OBJWIDTH,OBJHEIGHT, backSurface, drawSurface3); + + takeObject = 0; + hasName = 0; +} + +void DrasculaEngine::gotoObject(int pointX, int pointY) { + if (currentChapter == 5 || currentChapter == 6) { + if (hare_se_ve == 0) { + curX = roomX; + curY = roomY; + updateRoom(); + updateScreen(); + return; + } + } + roomX = pointX; + roomY = pointY; + startWalking(); + + for (;;) { + updateRoom(); + updateScreen(); + if (characterMoved == 0) + break; + } + + if (walkToObject == 1) { + walkToObject = 0; + trackProtagonist = trackFinal; + } + updateRoom(); + updateScreen(); +} + +void DrasculaEngine::checkObjects() { + int l, veo = 0; + + for (l = 0; l < numRoomObjs; l++) { + if (mouseX > x1[l] && mouseY > y1[l] + && mouseX < x2[l] && mouseY < y2[l] + && visible[l] == 1 && isDoor[l] == 0) { + strcpy(textName, objName[l]); + hasName = 1; + veo = 1; + } + } + + if (mouseX > curX + 2 && mouseY > curY + 2 + && mouseX < curX + curWidth - 2 && mouseY < curY + curHeight - 2) { + if (currentChapter == 2 || veo == 0) { + strcpy(textName, "hacker"); + hasName = 1; + veo = 1; + } + } + + if (veo == 0) + hasName = 0; +} + +void DrasculaEngine::removeObject() { + int h = 0, n; + + updateRoom(); + + for (n = 1; n < 43; n++){ + if (whichObject() == n) { + h = inventoryObjects[n]; + inventoryObjects[n] = 0; + if (h != 0) + takeObject = 1; + } + } + + updateEvents(); + + if (takeObject == 1) + chooseObject(h); +} + +bool DrasculaEngine::pickupObject() { + int h = pickedObject; + checkFlags = 1; + + updateRoom(); + showMenu(); + updateScreen(); + + // Objects with an ID smaller than 7 are the inventory verbs + if (pickedObject >= 7) { + for (int n = 1; n < 43; n++) { + if (whichObject() == n && inventoryObjects[n] == 0) { + inventoryObjects[n] = h; + takeObject = 0; + checkFlags = 0; + } + } + } + + if (checkFlags == 1) { + if (checkMenuFlags()) + return true; + } + updateEvents(); + if (takeObject == 0) + withoutVerb(); + + return false; +} + +void DrasculaEngine::addObject(int obj) { + int h, position = 0; + + for (h = 1; h < 43; h++) { + if (inventoryObjects[h] == obj) + position = 1; + } + + if (position == 0) { + for (h = 1; h < 43; h++) { + if (inventoryObjects[h] == 0) { + inventoryObjects[h] = obj; + position = 1; + break; + } + } + } +} + +int DrasculaEngine::whichObject() { + int n = 0; + + for (n = 1; n < 43; n++) { + if (mouseX > _itemLocations[n].x && mouseY > _itemLocations[n].y && + mouseX < _itemLocations[n].x + OBJWIDTH && + mouseY < _itemLocations[n].y + OBJHEIGHT) + break; + } + + return n; +} + +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) + strcpy(objName[2], _textmisc[_lang][0]); + if (roomNumber == 26 && flags[18] == 1) + visible[2] = 0; + if (roomNumber == 26 && flags[12] == 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 |