/* 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 { typedef void (DreamWebEngine::*UseCallback)(void); // Note: The callback pointer has been placed before the // ID to keep MSVC happy (otherwise, it throws warnings // that alignment of a member was sensitive to packing) struct UseListEntry { UseCallback callback; const char *id; }; void DreamWebEngine::useRoutine() { static const UseListEntry kUseList[] = { { &DreamWebEngine::useMon, "NETW" }, { &DreamWebEngine::useElevator1, "ELVA" }, { &DreamWebEngine::useElevator2, "ELVB" }, { &DreamWebEngine::useElevator3, "ELVC" }, { &DreamWebEngine::useElevator4, "ELVE" }, { &DreamWebEngine::useElevator5, "ELVF" }, { &DreamWebEngine::useChurchGate, "CGAT" }, { &DreamWebEngine::useStereo, "REMO" }, { &DreamWebEngine::useButtonA, "BUTA" }, { &DreamWebEngine::useWinch, "CBOX" }, { &DreamWebEngine::useLighter, "LITE" }, { &DreamWebEngine::usePlate, "PLAT" }, { &DreamWebEngine::useControl, "LIFT" }, { &DreamWebEngine::useWire, "WIRE" }, { &DreamWebEngine::useHandle, "HNDL" }, { &DreamWebEngine::useHatch, "HACH" }, { &DreamWebEngine::useElvDoor, "DOOR" }, { &DreamWebEngine::useCashCard, "CSHR" }, { &DreamWebEngine::useGun, "GUNA" }, { &DreamWebEngine::useCardReader1, "CRAA" }, { &DreamWebEngine::useCardReader2, "CRBB" }, { &DreamWebEngine::useCardReader3, "CRCC" }, { &DreamWebEngine::sitDownInBar, "SEAT" }, { &DreamWebEngine::useMenu, "MENU" }, { &DreamWebEngine::useCooker, "COOK" }, { &DreamWebEngine::callHotelLift, "ELCA" }, { &DreamWebEngine::callEdensLift, "EDCA" }, { &DreamWebEngine::callEdensDLift, "DDCA" }, { &DreamWebEngine::useAltar, "ALTR" }, { &DreamWebEngine::openHotelDoor, "LOKA" }, { &DreamWebEngine::openHotelDoor2, "LOKB" }, { &DreamWebEngine::openLouis, "ENTA" }, { &DreamWebEngine::openRyan, "ENTB" }, { &DreamWebEngine::openPoolBoss, "ENTE" }, { &DreamWebEngine::openYourNeighbour, "ENTC" }, { &DreamWebEngine::openEden, "ENTD" }, { &DreamWebEngine::openSarters, "ENTH" }, { &DreamWebEngine::wearWatch, "WWAT" }, { &DreamWebEngine::usePoolReader, "POOL" }, { &DreamWebEngine::wearShades, "WSHD" }, { &DreamWebEngine::grafittiDoor, "GRAF" }, { &DreamWebEngine::trapDoor, "TRAP" }, { &DreamWebEngine::edensCDPlayer, "CDPE" }, { &DreamWebEngine::openTVDoor, "DLOK" }, { &DreamWebEngine::useHole, "HOLE" }, { &DreamWebEngine::useDryer, "DRYR" }, { &DreamWebEngine::useChurchHole, "HOLY" }, { &DreamWebEngine::useWall, "WALL" }, { &DreamWebEngine::useDiary, "BOOK" }, { &DreamWebEngine::useAxe, "AXED" }, { &DreamWebEngine::useShield, "SHLD" }, { &DreamWebEngine::useRailing, "BCNY" }, { &DreamWebEngine::useCoveredBox, "LIDC" }, { &DreamWebEngine::useClearBox, "LIDU" }, { &DreamWebEngine::useOpenBox, "LIDO" }, { &DreamWebEngine::usePipe, "PIPE" }, { &DreamWebEngine::useBalcony, "BALC" }, { &DreamWebEngine::useWindow, "WIND" }, { &DreamWebEngine::viewFolder, "PAPR" }, { &DreamWebEngine::useTrainer, "UWTA" }, { &DreamWebEngine::useTrainer, "UWTB" }, { &DreamWebEngine::enterSymbol, "STAT" }, { &DreamWebEngine::openTomb, "TLID" }, { &DreamWebEngine::useSlab, "SLAB" }, { &DreamWebEngine::useCart, "CART" }, { &DreamWebEngine::useFullCart, "FCAR" }, { &DreamWebEngine::slabDoorA, "SLBA" }, { &DreamWebEngine::slabDoorB, "SLBB" }, { &DreamWebEngine::slabDoorC, "SLBC" }, { &DreamWebEngine::slabDoorD, "SLBD" }, { &DreamWebEngine::slabDoorE, "SLBE" }, { &DreamWebEngine::slabDoorF, "SLBF" }, { &DreamWebEngine::usePlinth, "PLIN" }, { &DreamWebEngine::useLadder, "LADD" }, { &DreamWebEngine::useLadderB, "LADB" }, { &DreamWebEngine::chewy, "GUMA" }, { &DreamWebEngine::wheelSound, "SQEE" }, { &DreamWebEngine::runTap, "TAPP" }, { &DreamWebEngine::playGuitar, "GUIT" }, { &DreamWebEngine::hotelControl, "CONT" }, { &DreamWebEngine::hotelBell, "BELL" }, }; if (_realLocation >= 50) { if (_pointerPower == 0) return; _pointerPower = 0; } uint8 dummy; void *obj = getAnyAd(&dummy, &dummy); for (uint i = 0; i < ARRAYSIZE(kUseList); ++i) { const UseListEntry &entry = kUseList[i]; if (objectMatches(obj, entry.id)) { (this->*entry.callback)(); return; } } delPointer(); const uint8 *obText = getObTextStart(); if (findNextColon(&obText) != 0) { if (findNextColon(&obText) != 0) { if (*obText != 0) { useText(obText); hangOnP(400); putBackObStuff(); return; } } } createPanel(); showPanel(); showMan(); showExit(); obIcons(); printMessage(33, 100, 63, 241, true); workToScreenM(); hangOnP(50); putBackObStuff(); _commandType = 255; } void DreamWebEngine::useText(const uint8 *string) { createPanel(); showPanel(); showMan(); showExit(); obIcons(); printDirect(string, 36, 104, 241, true); workToScreenM(); } void DreamWebEngine::showFirstUse() { const uint8 *obText = getObTextStart(); findNextColon(&obText); findNextColon(&obText); useText(obText); hangOnP(400); } void DreamWebEngine::showSecondUse() { const uint8 *obText = getObTextStart(); findNextColon(&obText); findNextColon(&obText); findNextColon(&obText); useText(obText); hangOnP(400); } void DreamWebEngine::edensCDPlayer() { showFirstUse(); _vars._watchingTime = 18 * 2; _vars._reelToWatch = 25; _vars._endWatchReel = 42; _vars._watchSpeed = 1; _vars._speedCount = 1; _getBack = 1; } void DreamWebEngine::hotelBell() { _sound->playChannel1(12); showFirstUse(); putBackObStuff(); } void DreamWebEngine::playGuitar() { _sound->playChannel1(14); showFirstUse(); putBackObStuff(); } void DreamWebEngine::useElevator1() { showFirstUse(); selectLocation(); _getBack = 1; } void DreamWebEngine::useElevator2() { showFirstUse(); if (_vars._location == 23) // In pool hall _newLocation = 31; else _newLocation = 23; _vars._countToClose = 20; _vars._countToOpen = 0; _vars._watchingTime = 80; _getBack = 1; } void DreamWebEngine::useElevator3() { showFirstUse(); _vars._countToClose = 20; _newLocation = 34; _vars._reelToWatch = 46; _vars._endWatchReel = 63; _vars._watchSpeed = 1; _vars._speedCount = 1; _vars._watchingTime = 80; _getBack = 1; } void DreamWebEngine::useElevator4() { showFirstUse(); _vars._reelToWatch = 0; _vars._endWatchReel = 11; _vars._watchSpeed = 1; _vars._speedCount = 1; _vars._countToClose = 20; _vars._watchingTime = 80; _getBack = 1; _newLocation = 24; } void DreamWebEngine::useElevator5() { placeSetObject(4); removeSetObject(0); _newLocation = 20; _vars._watchingTime = 80; _vars._liftFlag = 1; _vars._countToClose = 8; _getBack = 1; } void DreamWebEngine::useHatch() { showFirstUse(); _newLocation = 40; _getBack = 1; } void DreamWebEngine::wheelSound() { _sound->playChannel1(17); showFirstUse(); putBackObStuff(); } void DreamWebEngine::callHotelLift() { _sound->playChannel1(12); showFirstUse(); _vars._countToOpen = 8; _getBack = 1; _destination = 5; _finalDest = 5; autoSetWalk(); turnPathOn(4); } void DreamWebEngine::useShield() { if (_realLocation != 20 || _vars._combatCount == 0) { // Not in Sart room showFirstUse(); putBackObStuff(); } else { _vars._lastWeapon = 3; showSecondUse(); _getBack = 1; _vars._progressPoints++; removeObFromInv(); } } void DreamWebEngine::useCoveredBox() { _vars._progressPoints++; showFirstUse(); _vars._watchingTime = 50; _vars._reelToWatch = 41; _vars._endWatchReel = 66; _vars._watchSpeed = 1; _vars._speedCount = 1; _getBack = 1; } void DreamWebEngine::useRailing() { showFirstUse(); _vars._watchingTime = 80; _vars._reelToWatch = 0; _vars._endWatchReel = 30; _vars._watchSpeed = 1; _vars._speedCount = 1; _getBack = 1; _vars._manDead = 4; } void DreamWebEngine::wearWatch() { if (_vars._watchOn == 1) { // Already wearing watch showSecondUse(); putBackObStuff(); } else { showFirstUse(); _vars._watchOn = 1; _getBack = 1; uint8 dummy; makeWorn((DynObject *)getAnyAd(&dummy, &dummy)); } } void DreamWebEngine::wearShades() { if (_vars._shadesOn == 1) { // Already wearing shades showSecondUse(); putBackObStuff(); } else { _vars._shadesOn = 1; showFirstUse(); _getBack = 1; uint8 dummy; makeWorn((DynObject *)getAnyAd(&dummy, &dummy)); } } void DreamWebEngine::useChurchHole() { showFirstUse(); _getBack = 1; _vars._watchingTime = 28; _vars._reelToWatch = 13; _vars._endWatchReel = 26; _vars._watchSpeed = 1; _vars._speedCount = 1; } void DreamWebEngine::sitDownInBar() { if (_vars._watchMode != 0xFF) { // Sat down showSecondUse(); putBackObStuff(); } else { showFirstUse(); _vars._watchingTime = 50; _vars._reelToWatch = 55; _vars._endWatchReel = 71; _vars._reelToHold = 73; _vars._endOfHoldReel = 83; _vars._watchSpeed = 1; _vars._speedCount = 1; _getBack = 1; } } void DreamWebEngine::useDryer() { _sound->playChannel1(12); showFirstUse(); _getBack = 1; } void DreamWebEngine::useBalcony() { showFirstUse(); turnPathOn(6); turnPathOff(0); turnPathOff(1); turnPathOff(2); turnPathOff(3); turnPathOff(4); turnPathOff(5); _vars._progressPoints++; _mansPath = 6; _destination = 6; _finalDest = 6; findXYFromPath(); switchRyanOff(); _resetManXY = 1; _vars._watchingTime = 30 * 2; _vars._reelToWatch = 183; _vars._endWatchReel = 212; _vars._watchSpeed = 1; _vars._speedCount = 1; _getBack = 1; } void DreamWebEngine::useWindow() { if (_mansPath != 6) { // Not on balcony showSecondUse(); putBackObStuff(); } else { _vars._progressPoints++; showFirstUse(); _newLocation = 29; _getBack = 1; } } void DreamWebEngine::trapDoor() { _vars._progressPoints++; showFirstUse(); switchRyanOff(); _vars._watchingTime = 20 * 2; _vars._reelToWatch = 181; _vars._endWatchReel = 197; _newLocation = 26; _vars._watchSpeed = 1; _vars._speedCount = 1; _getBack = 1; } void DreamWebEngine::callEdensLift() { showFirstUse(); _vars._countToOpen = 8; _getBack = 1; turnPathOn(2); } void DreamWebEngine::callEdensDLift() { if (_vars._liftFlag == 1) { // Eden's D here showSecondUse(); putBackObStuff(); } else { showFirstUse(); _vars._countToOpen = 8; _getBack = 1; turnPathOn(2); } } void DreamWebEngine::openYourNeighbour() { enterCode(255, 255, 255, 255); _getBack = 1; } void DreamWebEngine::openRyan() { enterCode(5, 1, 0, 6); _getBack = 1; } void DreamWebEngine::openPoolBoss() { enterCode(5, 2, 2, 2); _getBack = 1; } void DreamWebEngine::openEden() { enterCode(2, 8, 6, 5); _getBack = 1; } void DreamWebEngine::openSarters() { enterCode(7, 8, 3, 3); _getBack = 1; } void DreamWebEngine::openLouis() { enterCode(5, 2, 3, 8); _getBack = 1; } void DreamWebEngine::useWall() { showFirstUse(); if (_mansPath != 3) { _vars._watchingTime = 30*2; _vars._reelToWatch = 2; _vars._endWatchReel = 31; _vars._watchSpeed = 1; _vars._speedCount = 1; _getBack = 1; turnPathOn(3); turnPathOn(4); turnPathOff(0); turnPathOff(1); turnPathOff(2); turnPathOff(5); _mansPath = 3; _finalDest = 3; findXYFromPath(); _resetManXY = 1; switchRyanOff(); } else { // Go back over _vars._watchingTime = 30 * 2; _vars._reelToWatch = 34; _vars._endWatchReel = 60; _vars._watchSpeed = 1; _vars._speedCount = 1; _getBack = 1; turnPathOff(3); turnPathOff(4); turnPathOn(0); turnPathOn(1); turnPathOn(2); turnPathOn(5); _mansPath = 5; _finalDest = 5; findXYFromPath(); _resetManXY = 1; switchRyanOff(); } } void DreamWebEngine::useLadder() { showFirstUse(); _mapX = _mapX - 11; findRoomInLoc(); _facing = 6; _turnToFace = 6; _mansPath = 0; _destination = 0; _finalDest = 0; findXYFromPath(); _resetManXY = 1; _getBack = 1; } void DreamWebEngine::useLadderB() { showFirstUse(); _mapX = _mapX + 11; findRoomInLoc(); _facing = 2; _turnToFace = 2; _mansPath = 1; _destination = 1; _finalDest = 1; findXYFromPath(); _resetManXY = 1; _getBack = 1; } void DreamWebEngine::slabDoorA() { showFirstUse(); _getBack = 1; _vars._watchSpeed = 1; _vars._speedCount = 1; _vars._reelToWatch = 13; if (_vars._dreamNumber != 3) { // Wrong _vars._watchingTime = 40; _vars._endWatchReel = 34; _vars._watchSpeed = 1; _vars._speedCount = 1; } else { _vars._progressPoints++; _vars._watchingTime = 60; _vars._endWatchReel = 42; _newLocation = 47; } } void DreamWebEngine::slabDoorB() { if (_vars._dreamNumber != 1) { // Wrong showFirstUse(); _getBack = 1; _vars._watchSpeed = 1; _vars._speedCount = 1; _vars._reelToWatch = 44; _vars._watchingTime = 40; _vars._endWatchReel = 63; _vars._watchSpeed = 1; _vars._speedCount = 1; } else { if (!isRyanHolding("SHLD")) { // No crystal showPuzText(44, 200); putBackObStuff(); } else { // Got crystal showFirstUse(); _vars._progressPoints++; _getBack = 1; _vars._watchSpeed = 1; _vars._speedCount = 1; _vars._reelToWatch = 44; _vars._watchingTime = 60; _vars._endWatchReel = 71; _newLocation = 47; } } } void DreamWebEngine::slabDoorC() { showFirstUse(); _getBack = 1; _vars._watchSpeed = 1; _vars._speedCount = 1; _vars._reelToWatch = 108; if (_vars._dreamNumber != 4) { // Wrong _vars._watchingTime = 40; _vars._endWatchReel = 127; _vars._watchSpeed = 1; _vars._speedCount = 1; } else { _vars._progressPoints++; _vars._watchingTime = 60; _vars._endWatchReel = 135; _newLocation = 47; } } void DreamWebEngine::slabDoorD() { showFirstUse(); _getBack = 1; _vars._watchSpeed = 1; _vars._speedCount = 1; _vars._reelToWatch = 75; if (_vars._dreamNumber != 0) { // Wrong _vars._watchingTime = 40; _vars._endWatchReel = 94; _vars._watchSpeed = 1; _vars._speedCount = 1; } else { _vars._progressPoints++; _vars._watchingTime = 60; _vars._endWatchReel = 102; _newLocation = 47; } } void DreamWebEngine::slabDoorE() { showFirstUse(); _getBack = 1; _vars._watchSpeed = 1; _vars._speedCount = 1; _vars._reelToWatch = 141; if (_vars._dreamNumber != 5) { // Wrong _vars._watchingTime = 40; _vars._endWatchReel = 160; _vars._watchSpeed = 1; _vars._speedCount = 1; } else { _vars._progressPoints++; _vars._watchingTime = 60; _vars._endWatchReel = 168; _newLocation = 47; } } void DreamWebEngine::slabDoorF() { showFirstUse(); _getBack = 1; _vars._watchSpeed = 1; _vars._speedCount = 1; _vars._reelToWatch = 171; if (_vars._dreamNumber != 2) { // Wrong _vars._watchingTime = 40; _vars._endWatchReel = 189; _vars._watchSpeed = 1; _vars._speedCount = 1; } else { _vars._progressPoints++; _vars._watchingTime = 60; _vars._endWatchReel = 197; _newLocation = 47; } } bool DreamWebEngine::defaultUseHandler(const char *id) { if (_withObject == 255) { withWhat(); return true; // event handled } if (!compare(_withObject, _withType, id)) { // Wrong item showPuzText(14, 300); putBackObStuff(); return true; // event handled } return false; // continue with the original event } void DreamWebEngine::useChurchGate() { if (defaultUseHandler("CUTT")) return; // Cut gate showFirstUse(); _vars._watchingTime = 64 * 2; _vars._reelToWatch = 4; _vars._endWatchReel = 70; _vars._watchSpeed = 1; _vars._speedCount = 1; _getBack = 1; _vars._progressPoints++; turnPathOn(3); if (_vars._aideDead != 0) turnPathOn(2); // Open church } void DreamWebEngine::useGun() { if (_objectType != kExObjectType) { // gun is not taken showSecondUse(); putBackObStuff(); } else if (_realLocation == 22) { // in pool room showPuzText(34, 300); _vars._lastWeapon = 1; _vars._combatCount = 39; _getBack = 1; _vars._progressPoints++; } else if (_realLocation == 25) { // helicopter showPuzText(34, 300); _vars._lastWeapon = 1; _vars._combatCount = 19; _getBack = 1; _vars._dreamNumber = 2; _vars._roomAfterDream = 38; _vars._sartainDead = 1; _vars._progressPoints++; } else if (_realLocation == 27) { // in rock room showPuzText(46, 300); _pointerMode = 2; _vars._rockstarDead = 1; _vars._lastWeapon = 1; _vars._newsItem = 1; _getBack = 1; _vars._roomAfterDream = 32; _vars._dreamNumber = 0; _vars._progressPoints++; } else if (_realLocation == 8 && _mapX == 22 && _mapY == 40 && !isSetObOnMap(92) && _mansPath != 9) { // by studio _destination = 9; _finalDest = 9; autoSetWalk(); _vars._lastWeapon = 1; _getBack = 1; _vars._progressPoints++; } else if (_realLocation == 6 && _mapX == 11 && _mapY == 20 && isSetObOnMap(5)) { // sarters _destination = 1; _finalDest = 1; autoSetWalk(); removeSetObject(5); placeSetObject(6); turnAnyPathOn(1, _roomNum - 1); _vars._liftFlag = 1; _vars._watchingTime = 40*2; _vars._reelToWatch = 4; _vars._endWatchReel = 43; _vars._watchSpeed = 1; _vars._speedCount = 1; _getBack = 1; _vars._progressPoints++; } else if (_realLocation == 29) { // aide _getBack = 1; resetLocation(13); setLocation(12); _destPos = 12; _destination = 2; _finalDest = 2; autoSetWalk(); _vars._watchingTime = 164*2; _vars._reelToWatch = 3; _vars._endWatchReel = 164; _vars._watchSpeed = 1; _vars._speedCount = 1; _vars._aideDead = 1; _vars._dreamNumber = 3; _vars._roomAfterDream = 33; _vars._progressPoints++; } else if (_realLocation == 23 && _mapX == 0 && _mapY == 50) { // with boss if (_mansPath != 5) { _destination = 5; _finalDest = 5; autoSetWalk(); } _vars._lastWeapon = 1; _getBack = 1; } else if (_realLocation == 8 && _mapX == 11 && _mapY == 10) { // tv soldier if (_mansPath != 2) { _destination = 2; _finalDest = 2; autoSetWalk(); } _vars._lastWeapon = 1; _getBack = 1; } else { showFirstUse(); putBackObStuff(); } } void DreamWebEngine::useFullCart() { _vars._progressPoints++; turnAnyPathOn(2, _roomNum + 6); _mansPath = 4; _facing = 4; _turnToFace = 4; _finalDest = 4; findXYFromPath(); _resetManXY = 1; showFirstUse(); _vars._watchingTime = 72 * 2; _vars._reelToWatch = 58; _vars._endWatchReel = 142; _vars._watchSpeed = 1; _vars._speedCount = 1; _getBack = 1; } void DreamWebEngine::useClearBox() { if (defaultUseHandler("RAIL")) return; // Open box _vars._progressPoints++; showFirstUse(); _vars._watchingTime = 80; _vars._reelToWatch = 67; _vars._endWatchReel = 105; _vars._watchSpeed = 1; _vars._speedCount = 1; _getBack = 1; } void DreamWebEngine::openTVDoor() { if (defaultUseHandler("ULOK")) return; // Key on TV showFirstUse(); _vars._lockStatus = 0; _getBack = 1; } void DreamWebEngine::usePlate() { if (_withObject == 255) { withWhat(); return; } if (compare(_withObject, _withType, "SCRW")) { // Unscrew plate _sound->playChannel1(20); showFirstUse(); placeSetObject(28); placeSetObject(24); removeSetObject(25); placeFreeObject(0); _vars._progressPoints++; _getBack = 1; } else if (compare(_withObject, _withType, "KNFE")) { // Tried knife showPuzText(54, 300); putBackObStuff(); } else { // Wrong item showPuzText(14, 300); putBackObStuff(); } } void DreamWebEngine::usePlinth() { if (_withObject == 255) { withWhat(); return; } if (!compare(_withObject, _withType, "DKEY")) { // Wrong key showFirstUse(); putBackObStuff(); } else { _vars._progressPoints++; showSecondUse(); _vars._watchingTime = 220; _vars._reelToWatch = 0; _vars._endWatchReel = 104; _vars._watchSpeed = 1; _vars._speedCount = 1; _getBack = 1; _newLocation = _vars._roomAfterDream; } } void DreamWebEngine::useElvDoor() { if (defaultUseHandler("AXED")) return; // Axe on door showPuzText(15, 300); _vars._progressPoints++; _vars._watchingTime = 46 * 2; _vars._reelToWatch = 31; _vars._endWatchReel = 77; _vars._watchSpeed = 1; _vars._speedCount = 1; _getBack = 1; } void DreamWebEngine::useObject() { _withObject = 255; if (_commandType != 229) { _commandType = 229; commandWithOb(51, _objectType, _command); } if (_mouseButton == _oldButton) return; // nouse if (_mouseButton & 1) useRoutine(); } void DreamWebEngine::useWinch() { uint16 contentIndex = checkInside(40, 1); if (contentIndex == kNumexobjects || !compare(contentIndex, kExObjectType, "FUSE")) { // No winch showFirstUse(); putBackObStuff(); return; } _vars._watchingTime = 217 * 2; _vars._reelToWatch = 0; _vars._endWatchReel = 217; _vars._watchSpeed = 1; _vars._speedCount = 1; _destPos = 1; _newLocation = 45; _vars._dreamNumber = 1; _vars._roomAfterDream = 44; _vars._generalDead = 1; _vars._newsItem = 2; _getBack = 1; _vars._progressPoints++; } void DreamWebEngine::useCart() { if (defaultUseHandler("ROCK")) return; DynObject *exObject = getExAd(_withObject); exObject->mapad[0] = 0; removeSetObject(_command); placeSetObject(_command + 1); _vars._progressPoints++; _sound->playChannel1(17); showFirstUse(); _getBack = 1; } void DreamWebEngine::useTrainer() { uint8 dummy; DynObject *object = (DynObject *)getAnyAd(&dummy, &dummy); if (object->mapad[0] != 4) { notHeldError(); } else { _vars._progressPoints++; makeWorn(object); showSecondUse(); putBackObStuff(); } } void DreamWebEngine::chewy() { // Chewing a gum showFirstUse(); uint8 dummy; DynObject *object = (DynObject *)getAnyAd(&dummy, &dummy); object->mapad[0] = 255; _getBack = 1; } void DreamWebEngine::useHole() { if (defaultUseHandler("HNDA")) return; showFirstUse(); removeSetObject(86); DynObject *exObject = getExAd(_withObject); exObject->mapad[0] = 255; _vars._canMoveAltar = 1; _getBack = 1; } void DreamWebEngine::openHotelDoor() { if (defaultUseHandler("KEYA")) return; _sound->playChannel1(16); showFirstUse(); _vars._lockStatus = 0; _getBack = 1; } void DreamWebEngine::openHotelDoor2() { if (defaultUseHandler("KEYA")) return; _sound->playChannel1(16); showFirstUse(); putBackObStuff(); } void DreamWebEngine::grafittiDoor() { if (defaultUseHandler("APEN")) return; showFirstUse(); putBackObStuff(); } void DreamWebEngine::usePoolReader() { if (defaultUseHandler("MEMB")) return; if (_vars._talkedToAttendant != 1) { // Can't open pool showSecondUse(); putBackObStuff(); } else { _sound->playChannel1(17); showFirstUse(); _vars._countToOpen = 6; _getBack = 1; } } void DreamWebEngine::useCardReader1() { if (defaultUseHandler("CSHR")) return; if (_vars._talkedToSparky == 0) { // Not yet showFirstUse(); putBackObStuff(); } else if (_vars._card1Money != 0) { // No cash showPuzText(17, 300); putBackObStuff(); } else { // Get cash _sound->playChannel1(16); showPuzText(18, 300); _vars._progressPoints++; _vars._card1Money = 12432; _getBack = 1; } } void DreamWebEngine::useCardReader2() { if (defaultUseHandler("CSHR")) return; if (_vars._talkedToBoss == 0) { // Haven't talked to boss showFirstUse(); putBackObStuff(); } else if (_vars._card1Money == 0) { // No cash showPuzText(20, 300); putBackObStuff(); } else if (_vars._gunPassFlag == 2) { // Already got new showPuzText(22, 300); putBackObStuff(); } else { _sound->playChannel1(18); showPuzText(19, 300); placeSetObject(94); _vars._gunPassFlag = 1; _vars._card1Money -= 2000; _vars._progressPoints++; _getBack = 1; } } void DreamWebEngine::useCardReader3() { if (defaultUseHandler("CSHR")) return; if (_vars._talkedToRecep == 0) { // Haven't talked to receptionist showFirstUse(); putBackObStuff(); } else if (_vars._cardPassFlag != 0) { // Already used it showPuzText(26, 300); putBackObStuff(); } else { _sound->playChannel1(16); showPuzText(25, 300); _vars._progressPoints++; _vars._card1Money -= 8300; _vars._cardPassFlag = 1; _getBack = 1; } } void DreamWebEngine::useLighter() { if (_withObject == 255) { withWhat(); return; } if (!compare(_withObject, _withType, "SMKE")) { showFirstUse(); putBackObStuff(); } else { showPuzText(9, 300); DynObject *withObj = getExAd(_withObject); withObj->mapad[0] = 255; _getBack = 1; } } void DreamWebEngine::useWire() { if (_withObject == 255) { withWhat(); return; } if (compare(_withObject, _withType, "KNFE")) { removeSetObject(51); placeSetObject(52); showPuzText(11, 300); _vars._progressPoints++; _getBack = 1; return; } if (compare(_withObject, _withType, "AXED")) { showPuzText(16, 300); putBackObStuff(); return; } showPuzText(14, 300); putBackObStuff(); } void DreamWebEngine::openTomb() { _vars._progressPoints++; showFirstUse(); _vars._watchingTime = 35 * 2; _vars._reelToWatch = 1; _vars._endWatchReel = 33; _vars._watchSpeed = 1; _vars._speedCount = 1; _getBack = 1; } void DreamWebEngine::hotelControl() { if (_realLocation != 21 || _mapX != 33) showSecondUse(); // Not right control else showFirstUse(); putBackObStuff(); } void DreamWebEngine::useCooker() { if (checkInside(_command, _objectType) == kNumexobjects) showFirstUse(); else showSecondUse(); // Food inside putBackObStuff(); } void DreamWebEngine::placeFreeObject(uint8 index) { findOrMake(index, 0, 1); getFreeAd(index)->mapad[0] = 0; } void DreamWebEngine::removeFreeObject(uint8 index) { getFreeAd(index)->mapad[0] = 0xFF; } void DreamWebEngine::useControl() { if (_withObject == 255) { withWhat(); return; } if (compare(_withObject, _withType, "KEYA")) { // Right key _sound->playChannel1(16); if (_vars._location == 21) { // Going down showPuzText(3, 300); _newLocation = 30; } else { showPuzText(0, 300); _newLocation = 21; } _vars._countToClose = 8; _vars._countToOpen = 0; _vars._watchingTime = 80; _getBack = 1; return; } if (_realLocation == 21) { if (compare(_withObject, _withType, "KNFE")) { // Jimmy controls placeSetObject(50); placeSetObject(51); placeSetObject(26); placeSetObject(30); removeSetObject(16); removeSetObject(17); _sound->playChannel1(14); showPuzText(10, 300); _vars._progressPoints++; _getBack = 1; } else if (compare(_withObject, _withType, "AXED")) { // Axe on controls showPuzText(16, 300); _vars._progressPoints++; putBackObStuff(); } else { // Balls showFirstUse(); putBackObStuff(); } } else { // Balls showFirstUse(); putBackObStuff(); } } void DreamWebEngine::useSlab() { if (_withObject == 255) { withWhat(); return; } if (!compare(_withObject, _withType, "JEWL")) { showPuzText(14, 300); putBackObStuff(); return; } DynObject *exObject = getExAd(_withObject); exObject->mapad[0] = 0; removeSetObject(_command); placeSetObject(_command + 1); if (_command + 1 == 54) { // Last slab turnPathOn(0); _vars._watchingTime = 22; _vars._reelToWatch = 35; _vars._endWatchReel = 48; _vars._watchSpeed = 1; _vars._speedCount = 1; } _vars._progressPoints++; showFirstUse(); _getBack = 1; } void DreamWebEngine::usePipe() { if (_withObject == 255) { withWhat(); return; } if (compare(_withObject, _withType, "CUPE")) { // Fill cup showPuzText(36, 300); putBackObStuff(); DynObject *exObject = getExAd(_withObject); exObject->objId[3] = 'F'-'A'; // CUPE (empty cup) -> CUPF (full cup) return; } else if (compare(_withObject, _withType, "CUPF")) { // Already full showPuzText(35, 300); putBackObStuff(); } else { showPuzText(14, 300); putBackObStuff(); } } void DreamWebEngine::useOpenBox() { if (_withObject == 255) { withWhat(); return; } if (compare(_withObject, _withType, "CUPF")) { // Destroy open box _vars._progressPoints++; showPuzText(37, 300); DynObject *exObject = getExAd(_withObject); exObject->objId[3] = 'E'-'A'; // CUPF (full cup) -> CUPE (empty cup) _vars._watchingTime = 140; _vars._reelToWatch = 105; _vars._endWatchReel = 181; _vars._watchSpeed = 1; _vars._speedCount = 1; turnPathOn(4); _getBack = 1; return; } if (compare(_withObject, _withType, "CUPE")) { // Open box wrong showPuzText(38, 300); putBackObStuff(); return; } showFirstUse(); } void DreamWebEngine::runTap() { if (_withObject == 255) { withWhat(); return; } if (compare(_withObject, _withType, "CUPE")) { // Fill cup from tap DynObject *exObject = getExAd(_withObject); exObject->objId[3] = 'F'-'A'; // CUPE (empty cup) -> CUPF (full cup) _sound->playChannel1(8); showPuzText(57, 300); putBackObStuff(); return; } if (compare(_withObject, _withType, "CUPF")) { // Cup from tap full showPuzText(58, 300); putBackObStuff(); return; } showPuzText(56, 300); putBackObStuff(); } void DreamWebEngine::useAxe() { if (_realLocation != 22) { // Not in pool showFirstUse(); return; } if (_mapY == 10) { // Axe on door showPuzText(15, 300); _vars._progressPoints++; _vars._watchingTime = 46*2; _vars._reelToWatch = 31; _vars._endWatchReel = 77; _vars._watchSpeed = 1; _vars._speedCount = 1; _getBack = 1; return; } showSecondUse(); _vars._progressPoints++; _vars._lastWeapon = 2; _getBack = 1; removeObFromInv(); } void DreamWebEngine::useHandle() { SetObject *object = getSetAd(findSetObject("CUTW")); if (object->mapad[0] == 255) { // Wire not cut showPuzText(12, 300); } else { // Wire has been cut showPuzText(13, 300); _newLocation = 22; } _getBack = 1; } void DreamWebEngine::useAltar() { if (findExObject("CNDA") == 114 || findExObject("CNDB") == 114) { // Things on altar showFirstUse(); _getBack = 1; return; } if (_vars._canMoveAltar == 1) { // Move altar _vars._progressPoints++; showSecondUse(); _vars._watchingTime = 160; _vars._reelToWatch = 81; _vars._endWatchReel = 174; _vars._watchSpeed = 1; _vars._speedCount = 1; setupTimedUse(47, 32, 98, 52, 76); _getBack = 1; } else { showPuzText(23, 300); _getBack = 1; } } void DreamWebEngine::withWhat() { uint8 commandLine[64] = "OBJECT NAME ONE "; createPanel(); showPanel(); showMan(); showExit(); copyName(_objectType, _command, commandLine); printMessage2(100, 21, 63, 200, false, 2); uint16 x = _lastXPos + 5; printDirect(commandLine, x, 21, 220, false); printMessage2(_lastXPos + 5, 21, 63, 200, false, 3); fillRyan(); _commandType = 255; readMouse(); showPointer(); workToScreen(); delPointer(); _invOpen = 2; } void DreamWebEngine::notHeldError() { createPanel(); showPanel(); showMan(); showExit(); obIcons(); printMessage2(64, 100, 63, 200 + 1, true, 1); workToScreenM(); hangOnP(50); putBackObStuff(); } void DreamWebEngine::useCashCard() { getRidOfReels(); loadKeypad(); createPanel(); showPanel(); showExit(); showMan(); uint16 y = (!_foreignRelease) ? 120 : 120 - 3; showFrame(_keypadGraphics, 114, y, 39, 0); const uint8 *obText = getObTextStart(); findNextColon(&obText); findNextColon(&obText); y = 98; printDirect(&obText, 36, &y, 36, 36 & 1); char amountStr[10]; sprintf(amountStr, "%04d", _vars._card1Money / 10); _charShift = 91 * 2 + 75; printDirect((const uint8 *)amountStr, 160, 155, 240, 240 & 1); sprintf(amountStr, "%02d", (_vars._card1Money % 10) * 10); _charShift = 91 * 2 + 85; printDirect((const uint8 *)amountStr, 187, 155, 240, 240 & 1); _charShift = 0; workToScreenM(); hangOnP(400); _keypadGraphics.clear(); restoreReels(); putBackObStuff(); } void DreamWebEngine::useStereo() { // Handles the stereo in Ryan's apartment (accessible from the remote on // the couch) if (_vars._location != 0) { showPuzText(4, 400); putBackObStuff(); } else if (_mapX != 11) { showPuzText(5, 400); putBackObStuff(); } else if (checkInside(findSetObject("CDPL"), 1) == kNumexobjects) { // No CD inside showPuzText(6, 400); putBackObStuff(); uint8 dummy; DynObject *object = (DynObject *)getAnyAd(&dummy, &dummy); object->turnedOn = 255; } else { // CD inside uint8 dummy; DynObject *object = (DynObject *)getAnyAd(&dummy, &dummy); object->turnedOn ^= 1; if (object->turnedOn != 255) showPuzText(7, 400); // Stereo off else showPuzText(8, 400); // Stereo on putBackObStuff(); } } uint16 DreamWebEngine::checkInside(uint16 command, uint16 type) { for (uint16 index = 0; index < kNumexobjects; index++) { DynObject *object = getExAd(index); if (object->mapad[1] == command && object->mapad[0] == type) return index; } return kNumexobjects; } void DreamWebEngine::showPuzText(uint16 command, uint16 count) { createPanel(); showPanel(); showMan(); showExit(); obIcons(); const uint8 *string = (const uint8 *)_puzzleText.getString(command); printDirect(string, 36, 104, 241, 241 & 1); workToScreenM(); hangOnP(count); } void DreamWebEngine::useButtonA() { if (!isSetObOnMap(95)) { showFirstUse(); turnAnyPathOn(0, _roomNum - 1); removeSetObject(9); placeSetObject(95); _vars._watchingTime = 15 * 2; _vars._reelToWatch = 71; _vars._endWatchReel = 85; _vars._watchSpeed = 1; _vars._speedCount = 1; _getBack = 1; _vars._progressPoints++; } else { // Done this bit showSecondUse(); putBackObStuff(); } } } // End of namespace DreamWeb