/* 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 "dreamweb/sound.h" #include "dreamweb/dreamweb.h" namespace DreamWeb { void DreamWebEngine::newPlace() { if (_vars._needToTravel == 1) { _vars._needToTravel = 0; selectLocation(); } else if (_autoLocation != 0xFF) { _newLocation = _autoLocation; _autoLocation = 0xFF; } } void DreamWebEngine::selectLocation() { _inMapArea = 0; clearBeforeLoad(); _getBack = 0; _pointerFrame = 22; readCityPic(); showCity(); _cityGraphics.clear(); readDestIcon(); loadTravelText(); showPanel(); showMan(); showArrows(); showExit(); locationPic(); underTextLine(); _commandType = 255; readMouse(); _pointerFrame = 0; showPointer(); workToScreen(); _sound->playChannel0(9, 255); _newLocation = 255; while (_newLocation == 255) { if (_quitRequested) break; delPointer(); readMouse(); showPointer(); waitForVSync(); dumpPointer(); dumpTextLine(); if (_getBack == 1) break; RectWithCallback destList[] = { { 238,258,4,44,&DreamWebEngine::nextDest }, { 104,124,4,44,&DreamWebEngine::lastDest }, { 280,308,4,44,&DreamWebEngine::lookAtPlace }, { 104,216,138,192,&DreamWebEngine::destSelect }, { 273,320,157,198,&DreamWebEngine::getBack1 }, { 0,320,0,200,&DreamWebEngine::blank }, { 0xFFFF,0,0,0,0 } }; checkCoords(destList); } if (_quitRequested || _getBack == 1 || _newLocation == _vars._location) { _newLocation = _realLocation; _getBack = 0; } _newplaceGraphics.clear(); _newplaceGraphics2.clear(); _newplaceGraphics3.clear(); _travelText.clear(); } void DreamWebEngine::showCity() { clearWork(); showFrame(_cityGraphics, 57, 32, 0, 0); showFrame(_cityGraphics, 120+57, 32, 1, 0); } void DreamWebEngine::lookAtPlace() { commandOnlyCond(27, 224); if (!(_mouseButton & 1) || _mouseButton == _oldButton || _destPos >= 15) return; // noinfo delPointer(); delTextLine(); getUnderCenter(); showFrame(_newplaceGraphics3, 60, 72, 0, 0); showFrame(_newplaceGraphics3, 60, 72 + 55, 4, 0); if (_foreignRelease) showFrame(_newplaceGraphics3, 60, 72+55+21, 4, 0); const uint8 *string = (const uint8 *)_travelText.getString(_destPos); findNextColon(&string); uint16 y = (_foreignRelease) ? 84 + 4 : 84; printDirect(&string, 63, &y, 191, 191 & 1); workToScreenM(); hangOnP(500); _pointerMode = 0; _pointerFrame = 0; putUnderCenter(); workToScreenM(); } void DreamWebEngine::getUnderCenter() { multiGet(_mapStore, 58, 72, 254, 110); } void DreamWebEngine::putUnderCenter() { multiPut(_mapStore, 58, 72, 254, 110); } void DreamWebEngine::locationPic() { const int roomPics[] = { 5, 0, 3, 2, 4, 1, 10, 9, 8, 6, 11, 4, 7, 7, 0, 0 }; byte picture = roomPics[_destPos]; if (picture >= 6) showFrame(_newplaceGraphics2, 104, 138 + 14, picture - 6, 0); // Second slot else showFrame(_newplaceGraphics, 104, 138 + 14, picture + 4, 0); if (_destPos == _realLocation) showFrame(_newplaceGraphics, 104, 140 + 14, 3, 0); // Currently in this location const uint8 *string = (const uint8 *)_travelText.getString(_destPos); printDirect(string, 50, 20, 241, 241 & 1); } void DreamWebEngine::showArrows() { showFrame(_newplaceGraphics, 116 - 12, 16, 0, 0); showFrame(_newplaceGraphics, 226 + 12, 16, 1, 0); showFrame(_newplaceGraphics, 280, 14, 2, 0); } void DreamWebEngine::nextDest() { commandOnlyCond(28, 218); if (!(_mouseButton & 1) || _oldButton == 1) return; // nodu do { _destPos++; if (_destPos == 15) _destPos = 0; // last destination } while (!getLocation(_destPos)); _newTextLine = 1; delTextLine(); delPointer(); showPanel(); showMan(); showArrows(); locationPic(); underTextLine(); readMouse(); showPointer(); workToScreen(); delPointer(); } void DreamWebEngine::lastDest() { commandOnlyCond(29, 219); if (!(_mouseButton & 1) || _oldButton == 1) return; // nodd do { _destPos--; if (_destPos == 0xFF) _destPos = 15; // first destination } while (!getLocation(_destPos)); _newTextLine = 1; delTextLine(); delPointer(); showPanel(); showMan(); showArrows(); locationPic(); underTextLine(); readMouse(); showPointer(); workToScreen(); delPointer(); } void DreamWebEngine::destSelect() { commandOnlyCond(30, 222); if (!(_mouseButton & 1) || _oldButton == 1) return; // notrav _newLocation = _destPos; } uint8 DreamWebEngine::getLocation(uint8 index) { return _roomsCanGo[index]; } void DreamWebEngine::setLocation(uint8 index) { _roomsCanGo[index] = 1; } void DreamWebEngine::clearLocation(uint8 index) { _roomsCanGo[index] = 0; } void DreamWebEngine::resetLocation(uint8 index) { if (index == 5) { // delete hotel purgeALocation(5); purgeALocation(21); purgeALocation(22); purgeALocation(27); } else if (index == 8) { // delete TV studio purgeALocation(8); purgeALocation(28); } else if (index == 6) { // delete sarters purgeALocation(6); purgeALocation(20); purgeALocation(25); } else if (index == 13) { // delete boathouse purgeALocation(13); purgeALocation(29); } clearLocation(index); } void DreamWebEngine::readDestIcon() { loadGraphicsFile(_newplaceGraphics, "G05"); loadGraphicsFile(_newplaceGraphics2, "G06"); loadGraphicsFile(_newplaceGraphics3, "G08"); } void DreamWebEngine::readCityPic() { loadGraphicsFile(_cityGraphics, "G04"); } } // End of namespace DreamWeb