diff options
author | Willem Jan Palenstijn | 2013-04-18 23:35:23 +0200 |
---|---|---|
committer | Willem Jan Palenstijn | 2013-05-08 20:40:58 +0200 |
commit | 9c2341678ef4984bf92b3878295250faf980b066 (patch) | |
tree | 2fb4805e05e16b9924e80c9947e6bad723b28c4b /engines/dreamweb/people.cpp | |
parent | 8172d679df5148a4a32f46074b20cb6caf91844f (diff) | |
parent | a5f4ff36ffc386d48f2da49387a9655ce9295a4d (diff) | |
download | scummvm-rg350-9c2341678ef4984bf92b3878295250faf980b066.tar.gz scummvm-rg350-9c2341678ef4984bf92b3878295250faf980b066.tar.bz2 scummvm-rg350-9c2341678ef4984bf92b3878295250faf980b066.zip |
Merge branch 'master'
Diffstat (limited to 'engines/dreamweb/people.cpp')
-rw-r--r-- | engines/dreamweb/people.cpp | 1121 |
1 files changed, 1121 insertions, 0 deletions
diff --git a/engines/dreamweb/people.cpp b/engines/dreamweb/people.cpp new file mode 100644 index 0000000000..dfb5c62618 --- /dev/null +++ b/engines/dreamweb/people.cpp @@ -0,0 +1,1121 @@ +/* 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/dreamweb.h" + +namespace DreamWeb { + +static void (DreamWebEngine::*reelCallbacks[57])(ReelRoutine &) = { + &DreamWebEngine::gamer, &DreamWebEngine::sparkyDrip, + &DreamWebEngine::eden, &DreamWebEngine::edenInBath, + &DreamWebEngine::sparky, &DreamWebEngine::smokeBloke, + &DreamWebEngine::manAsleep, &DreamWebEngine::drunk, + &DreamWebEngine::receptionist, &DreamWebEngine::genericPerson /*maleFan*/, + &DreamWebEngine::genericPerson /*femaleFan*/, &DreamWebEngine::louis, + &DreamWebEngine::louisChair, &DreamWebEngine::soldier1, + &DreamWebEngine::bossMan, &DreamWebEngine::interviewer, + &DreamWebEngine::heavy, &DreamWebEngine::manAsleep /*manAsleep2*/, + &DreamWebEngine::genericPerson /*manSatStill*/, &DreamWebEngine::drinker, + &DreamWebEngine::bartender, &DreamWebEngine::genericPerson /*otherSmoker*/, + &DreamWebEngine::genericPerson /*tattooMan*/, &DreamWebEngine::attendant, + &DreamWebEngine::keeper, &DreamWebEngine::candles1, + &DreamWebEngine::smallCandle, &DreamWebEngine::security, + &DreamWebEngine::copper, &DreamWebEngine::poolGuard, + &DreamWebEngine::rockstar, &DreamWebEngine::businessMan, + &DreamWebEngine::train, &DreamWebEngine::genericPerson /*aide*/, + &DreamWebEngine::mugger, &DreamWebEngine::helicopter, + &DreamWebEngine::introMagic1, &DreamWebEngine::introMusic, + &DreamWebEngine::introMagic2, &DreamWebEngine::candles2, + &DreamWebEngine::gates, &DreamWebEngine::introMagic3, + &DreamWebEngine::introMonks1, &DreamWebEngine::candles, + &DreamWebEngine::introMonks2, &DreamWebEngine::handClap, + &DreamWebEngine::monkAndRyan, &DreamWebEngine::endGameSeq, + &DreamWebEngine::priest, &DreamWebEngine::madman, + &DreamWebEngine::madmansTelly, &DreamWebEngine::alleyBarkSound, + &DreamWebEngine::foghornSound, &DreamWebEngine::carParkDrip, + &DreamWebEngine::carParkDrip, &DreamWebEngine::carParkDrip, + &DreamWebEngine::carParkDrip +}; + +static const ReelRoutine g_initialReelRoutines[] = { +// Room number and x,y +// reel pointer +// speed,speed count,convers. no. + { 1,44,0, 20, 2,0,1 }, + { 1,55,0, 0, 50,20,0 }, + { 24,22,0, 74, 1,0,0 }, + { 24,33,10, 75, 1,0,1 }, + { 1,44,0, 27, 2,0,2 }, + { 1,44,0, 96, 3,0,4 }, + { 1,44,0, 118, 2,0,5 }, + { 1,44,10, 0, 2,0,0 }, + { 5,22,20, 53, 3,0,0 }, + { 5,22,20, 40, 1,0,2 }, + { 5,22,20, 50, 1,0,3 }, + { 2,11,10, 192, 1,0,0 }, + { 2,11,10, 182, 2,0,1 }, + { 8,11,10, 0, 2,0,1 }, + { 23,0,50, 0, 3,0,0 }, + { 28,11,20, 250, 4,0,0 }, + { 23,0,50, 43, 2,0,8 }, + { 23,11,40, 130, 2,0,1 }, + { 23,22,40, 122, 2,0,2 }, + { 23,22,40, 105, 2,0,3 }, + { 23,22,40, 81, 2,0,4 }, + { 23,11,40, 135, 2,0,5 }, + { 23,22,40, 145, 2,0,6 }, + { 4,22,30, 0, 2,0,0 }, + { 45,22,30, 200, 0,0,20 }, + { 45,22,30, 39, 2,0,0 }, + { 45,22,30, 25, 2,0,0 }, + { 8,22,40, 32, 2,0,0 }, + { 7,11,20, 64, 2,0,0 }, + { 22,22,20, 82, 2,0,0 }, + { 27,11,30, 0, 2,0,0 }, + { 20,0,30, 0, 2,0,0 }, + { 14,33,40, 21, 1,0,0 }, + { 29,11,10, 0, 1,0,0 }, + { 2,22,0, 2, 2,0,0 }, + { 25,0,50, 4, 2,0,0 }, + { 50,22,30, 121, 2,0,0 }, + { 50,22,30, 0, 20,0,0 }, + { 52,22,30, 192, 2,0,0 }, + { 52,22,30, 233, 2,0,0 }, + { 50,22,40, 104, 55,0,0 }, // ...., 65,0,0 for German CD + { 53,33,0, 99, 2,0,0 }, + { 50,22,40, 0, 3,0,0 }, + { 50,22,30, 162, 2,0,0 }, + { 52,22,30, 57, 2,0,0 }, + { 52,22,30, 0, 2,0,0 }, + { 54,0,0, 72, 3,0,0 }, + { 55,44,0, 0, 2,0,0 }, + { 19,0,0, 0, 28,0,0 }, + { 14,22,0, 2, 2,0,0 }, + { 14,22,0, 300, 1,0,0 }, + { 10,22,30, 174, 0,0,0 }, + { 12,22,20, 0, 1,0,0 }, + { 11,11,20, 0, 50,20,0 }, + { 11,11,30, 0, 50,20,0 }, + { 11,22,20, 0, 50,20,0 }, + { 14,33,40, 0, 50,20,0 }, + { 255,0,0, 0, 0,0,0 } +}; + +void DreamWebEngine::setupInitialReelRoutines() { + for (unsigned int i = 0; i < kNumReelRoutines + 1; ++i) { + _reelRoutines[i] = g_initialReelRoutines[i]; + if (_reelRoutines[i].period == 55 && hasSpeech() && getLanguage() == Common::DE_DEU) + _reelRoutines[i].period = 65; + } +} + +void DreamWebEngine::updatePeople() { + _peopleList.clear(); + ++_mainTimer; + + for (int i = 0; _reelRoutines[i].reallocation != 255; ++i) { + if (_reelRoutines[i].reallocation == _realLocation && + _reelRoutines[i].mapX == _mapX && + _reelRoutines[i].mapY == _mapY) { + assert(reelCallbacks[i]); + (this->*(reelCallbacks[i]))(_reelRoutines[i]); + } + } +} + +void DreamWebEngine::madmanText() { + byte origCount; + + uint16 length = 90; + if (hasSpeech()) { + if (_speechCount > 15) + return; + if (_channel1Playing != 255) + return; + origCount = _speechCount; + ++_speechCount; + + if (origCount != 15) + length = 32000; // Set subtitle time very high to make it + // always wait for the next line, except for the + // last one, when there is no next line. + } else { + if (_vars._combatCount >= 61) + return; + if (_vars._combatCount & 3) + return; + origCount = _vars._combatCount / 4; + } + setupTimedTemp(47 + origCount, 82, 72, 80, length, 1); +} + +void DreamWebEngine::madman(ReelRoutine &routine) { + _vars._watchingTime = 2; + if (checkSpeed(routine)) { + uint16 newReelPointer = routine.reelPointer(); + if (newReelPointer >= 364) { + _vars._manDead = 2; + showGameReel(&routine); + return; + } + if (newReelPointer == 10) { + loadTempText("T82"); + _vars._combatCount = (uint8)-1; + _speechCount = 0; + } + ++newReelPointer; + if (newReelPointer == 294) { + if (!_wonGame) { + _wonGame = true; + getRidOfTempText(); + } + return; + } + if (newReelPointer == 66) { + ++_vars._combatCount; + + if (_lastHardKey == 1) // ESC pressed, skip the mad man's speech + _vars._combatCount = _speechCount = (hasSpeech() ? 65 : 63); + + madmanText(); + newReelPointer = 53; + + if (_vars._combatCount >= (hasSpeech() ? 64 : 62)) { + if (_vars._combatCount == (hasSpeech() ? 70 : 68)) + newReelPointer = 310; + else { + if (_vars._lastWeapon == 8) { + _vars._combatCount = hasSpeech() ? 72 : 70; + _vars._lastWeapon = (uint8)-1; + _vars._madmanFlag = 1; + newReelPointer = 67; + } + } + } + } + routine.setReelPointer(newReelPointer); + } + showGameReel(&routine); + routine.mapX = _mapX; + madMode(); +} + +void DreamWebEngine::madMode() { + _vars._watchingTime = 2; + _pointerMode = 0; + if (_vars._combatCount < (hasSpeech() ? 65 : 63)) + return; + if (_vars._combatCount >= (hasSpeech() ? 70 : 68)) + return; + _pointerMode = 2; +} + +void DreamWebEngine::addToPeopleList(ReelRoutine *routine) { + People people; + people._reelPointer = routine->reelPointer(); + people._routinePointer = routine; + people.b4 = routine->b7; + + _peopleList.push_back(people); +} + +bool DreamWebEngine::checkSpeed(ReelRoutine &routine) { + if (_vars._lastWeapon != (uint8)-1) + return true; + ++routine.counter; + if (routine.counter != routine.period) + return false; + routine.counter = 0; + return true; +} + +void DreamWebEngine::sparkyDrip(ReelRoutine &routine) { + if (checkSpeed(routine)) + playChannel0(14, 0); +} + +void DreamWebEngine::genericPerson(ReelRoutine &routine) { + showGameReel(&routine); + addToPeopleList(&routine); +} + +void DreamWebEngine::gamer(ReelRoutine &routine) { + if (checkSpeed(routine)) { + uint8 v; + do { + v = _rnd.getRandomNumberRng(20, 24); + } while (v == routine.reelPointer()); + routine.setReelPointer(v); + } + + showGameReel(&routine); + addToPeopleList(&routine); +} + +void DreamWebEngine::eden(ReelRoutine &routine) { + if (_vars._generalDead) + return; + showGameReel(&routine); + addToPeopleList(&routine); +} + +void DreamWebEngine::sparky(ReelRoutine &routine) { + if (_vars._card1Money) + routine.b7 = 3; + if (checkSpeed(routine)) { + if (routine.reelPointer() == 34) { + if (randomNumber() < 30) + routine.incReelPointer(); + else + routine.setReelPointer(27); + } else { + if (routine.reelPointer() != 48) + routine.incReelPointer(); + else + routine.setReelPointer(27); + } + } + showGameReel(&routine); + addToPeopleList(&routine); + if (routine.b7 & 128) + _vars._talkedToSparky = 1; +} + +void DreamWebEngine::rockstar(ReelRoutine &routine) { + if ((routine.reelPointer() == 303) || (routine.reelPointer() == 118)) { + _newLocation = 45; + showGameReel(&routine); + return; + } + if (checkSpeed(routine)) { + uint16 nextReelPointer = routine.reelPointer() + 1; + if (nextReelPointer == 118) { + _vars._manDead = 2; + } else if (nextReelPointer == 79) { + --nextReelPointer; + if (_vars._lastWeapon != 1) { + ++_vars._combatCount; + if (_vars._combatCount == 40) { + _vars._combatCount = 0; + nextReelPointer = 79; + } + } else { + _vars._lastWeapon = (uint8)-1; + nextReelPointer = 123; + } + } + routine.setReelPointer(nextReelPointer); + } + showGameReel(&routine); + if (routine.reelPointer() == 78) { + addToPeopleList(&routine); + _pointerMode = 2; + _vars._watchingTime = 0; + } else { + _vars._watchingTime = 2; + _pointerMode = 0; + routine.mapY = _mapY; + } +} + +void DreamWebEngine::madmansTelly(ReelRoutine &routine) { + uint16 nextReelPointer = routine.reelPointer() + 1; + if (nextReelPointer == 307) + nextReelPointer = 300; + routine.setReelPointer(nextReelPointer); + showGameReel(&routine); +} + + +void DreamWebEngine::smokeBloke(ReelRoutine &routine) { + if (_vars._rockstarDead == 0) { + if (routine.b7 & 128) + setLocation(5); + } + if (checkSpeed(routine)) { + if (routine.reelPointer() == 100) { + if (randomNumber() < 30) + routine.incReelPointer(); + else + routine.setReelPointer(96); + } else if (routine.reelPointer() == 117) + routine.setReelPointer(96); + else + routine.incReelPointer(); + } + showGameReel(&routine); + addToPeopleList(&routine); +} + +void DreamWebEngine::manAsleep(ReelRoutine &routine) { + routine.b7 &= 127; + showGameReel(&routine); + addToPeopleList(&routine); +} + +void DreamWebEngine::attendant(ReelRoutine &routine) { + showGameReel(&routine); + addToPeopleList(&routine); + if (routine.b7 & 128) + _vars._talkedToAttendant = 1; +} + +void DreamWebEngine::keeper(ReelRoutine &routine) { + if (_vars._keeperFlag != 0) { + // Not waiting + addToPeopleList(&routine); + showGameReel(&routine); + return; + } + + if (_vars._reelToWatch < 190) + return; // waiting + + _vars._keeperFlag++; + + if ((routine.b7 & 127) != _vars._dreamNumber) + routine.b7 = _vars._dreamNumber; +} + +void DreamWebEngine::drunk(ReelRoutine &routine) { + if (_vars._generalDead) + return; + routine.b7 &= 127; + showGameReel(&routine); + addToPeopleList(&routine); +} + +void DreamWebEngine::interviewer(ReelRoutine &routine) { + if (_vars._reelToWatch == 68) + routine.incReelPointer(); + + if (routine.reelPointer() != 250 && routine.reelPointer() != 259 && checkSpeed(routine)) + routine.incReelPointer(); + + showGameReel(&routine); +} + +void DreamWebEngine::drinker(ReelRoutine &routine) { + if (checkSpeed(routine)) { + routine.incReelPointer(); + + if ( routine.reelPointer() == 115 || + (routine.reelPointer() == 106 && randomNumber() >= 3)) + routine.setReelPointer(105); + } + + showGameReel(&routine); + addToPeopleList(&routine); +} + +void DreamWebEngine::alleyBarkSound(ReelRoutine &routine) { + uint16 prevReelPointer = routine.reelPointer() - 1; + if (prevReelPointer == 0) { + playChannel1(14); + routine.setReelPointer(1000); + } else { + routine.setReelPointer(prevReelPointer); + } +} + +void DreamWebEngine::introMagic1(ReelRoutine &routine) { + if (checkSpeed(routine)) { + uint16 nextReelPointer = routine.reelPointer() + 1; + if (nextReelPointer == 145) + nextReelPointer = 121; + routine.setReelPointer(nextReelPointer); + if (nextReelPointer == 121) { + ++_introCount; + intro1Text(); + if (_introCount == 8) { + _mapY += 10; + _nowInNewRoom = 1; + } + } + } + showGameReel(&routine); +} + +void DreamWebEngine::introMagic2(ReelRoutine &routine) { + if (checkSpeed(routine)) { + uint16 nextReelPointer = routine.reelPointer() + 1; + if (nextReelPointer == 216) + nextReelPointer = 192; + routine.setReelPointer(nextReelPointer); + } + showGameReel(&routine); +} + +void DreamWebEngine::introMagic3(ReelRoutine &routine) { + if (checkSpeed(routine)) { + uint16 nextReelPointer = routine.reelPointer() + 1; + if (nextReelPointer == 218) + _getBack = 1; + routine.setReelPointer(nextReelPointer); + } + showGameReel(&routine); + routine.mapX = _mapX; +} + +void DreamWebEngine::candles1(ReelRoutine &routine) { + if (checkSpeed(routine)) { + uint16 nextReelPointer = routine.reelPointer() + 1; + if (nextReelPointer == 44) + nextReelPointer = 39; + routine.setReelPointer(nextReelPointer); + } + showGameReel(&routine); +} + +void DreamWebEngine::candles2(ReelRoutine &routine) { + if (checkSpeed(routine)) { + uint16 nextReelPointer = routine.reelPointer() + 1; + if (nextReelPointer == 238) + nextReelPointer = 233; + routine.setReelPointer(nextReelPointer); + } + showGameReel(&routine); +} + +void DreamWebEngine::smallCandle(ReelRoutine &routine) { + if (checkSpeed(routine)) { + uint16 nextReelPointer = routine.reelPointer() + 1; + if (nextReelPointer == 37) + nextReelPointer = 25; + routine.setReelPointer(nextReelPointer); + } + showGameReel(&routine); +} + +void DreamWebEngine::introMusic(ReelRoutine &routine) { +} + +void DreamWebEngine::candles(ReelRoutine &routine) { + if (checkSpeed(routine)) { + uint16 nextReelPointer = routine.reelPointer() + 1; + if (nextReelPointer == 167) + nextReelPointer = 162; + routine.setReelPointer(nextReelPointer); + } + showGameReel(&routine); +} + +void DreamWebEngine::gates(ReelRoutine &routine) { + if (checkSpeed(routine)) { + uint16 nextReelPointer = routine.reelPointer() + 1; + if (nextReelPointer == 116) + playChannel1(17); + if (nextReelPointer >= 110) + routine.period = 2; + if (nextReelPointer == 120) { + _getBack = 1; + nextReelPointer = 119; + } + routine.setReelPointer(nextReelPointer); + intro3Text(nextReelPointer); + } + showGameReel(&routine); +} + +void DreamWebEngine::security(ReelRoutine &routine) { + if (routine.reelPointer() == 32) { + if (_vars._lastWeapon == 1) { + _vars._watchingTime = 10; + if ((_mansPath == 9) && (_facing == 0)) { + _vars._lastWeapon = (uint8)-1; + routine.incReelPointer(); + } + } + } else if (routine.reelPointer() == 69) + return; + else { + _vars._watchingTime = 10; + if (checkSpeed(routine)) + routine.incReelPointer(); + } + showGameReel(&routine); + addToPeopleList(&routine); +} + +void DreamWebEngine::edenInBath(ReelRoutine &routine) { + if (_vars._generalDead == 0 || _vars._sartainDead != 0) + return; + + showGameReel(&routine); + addToPeopleList(&routine); +} + +void DreamWebEngine::louis(ReelRoutine &routine) { + if (_vars._rockstarDead != 0) + return; + + showGameReel(&routine); + addToPeopleList(&routine); +} + +void DreamWebEngine::handClap(ReelRoutine &routine) { +} + +void DreamWebEngine::carParkDrip(ReelRoutine &routine) { + if (!checkSpeed(routine)) + return; // cantdrip2 + + playChannel1(14); +} + +void DreamWebEngine::foghornSound(ReelRoutine &routine) { + if (randomNumber() == 198) + playChannel1(13); +} + +void DreamWebEngine::train(ReelRoutine &routine) { + // The original code has logic for this, but it is disabled +} + +void DreamWebEngine::louisChair(ReelRoutine &routine) { + if (_vars._rockstarDead == 0) + return; // notlouis2 + + if (checkSpeed(routine)) { + uint16 nextReelPointer = routine.reelPointer() + 1; + if (nextReelPointer == 191) { + routine.setReelPointer(182); // Restart Louis + } else if (nextReelPointer != 185) { + routine.setReelPointer(nextReelPointer); + } else { + if (randomNumber() < 245) + routine.setReelPointer(182); // Restart Louis + else + routine.setReelPointer(nextReelPointer); + } + } + + showGameReel(&routine); + addToPeopleList(&routine); +} + +void DreamWebEngine::bossMan(ReelRoutine &routine) { + if (checkSpeed(routine)) { + uint16 nextReelPointer = routine.reelPointer() + 1; + + if (nextReelPointer == 4) { + if (_vars._gunPassFlag != 1 && randomNumber() >= 10) + nextReelPointer = 0; + } else if (nextReelPointer == 20) { + if (_vars._gunPassFlag != 1) + nextReelPointer = 0; + } else if (nextReelPointer == 41) { + nextReelPointer = 0; + _vars._gunPassFlag++; + routine.b7 = 10; + } + + routine.setReelPointer(nextReelPointer); + } + + showGameReel(&routine); + addToPeopleList(&routine); + + if (routine.b7 & 128) + _vars._talkedToBoss = 1; +} + +void DreamWebEngine::priest(ReelRoutine &routine) { + if (routine.reelPointer() == 8) + return; // priestspoken + + _pointerMode = 0; + _vars._watchingTime = 2; + + if (checkSpeed(routine)) { + routine.incReelPointer(); + priestText(routine); + } +} + +void DreamWebEngine::priestText(ReelRoutine &routine) { + uint16 reel = routine.reelPointer(); + if (reel < 2 || reel >= 7 || (reel & 1)) + return; // nopriesttext + + setupTimedUse((reel >> 1) + 50, 54, 1, 72, 80); +} + +void DreamWebEngine::monkAndRyan(ReelRoutine &routine) { + if (checkSpeed(routine)) { + uint16 nextReelPointer = routine.reelPointer() + 1; + if (nextReelPointer == 83) { + _introCount++; + textForMonk(); + nextReelPointer = 77; + + if (_introCount == 57) { + _getBack = 1; + return; + } + } + + routine.setReelPointer(nextReelPointer); + } + + showGameReel(&routine); +} + +void DreamWebEngine::copper(ReelRoutine &routine) { + if (checkSpeed(routine)) { + uint16 nextReelPointer = routine.reelPointer() + 1; + if (nextReelPointer == 94) { + nextReelPointer = 64; + } else if (nextReelPointer == 81 || nextReelPointer == 66) { + // Might wait + if (randomNumber() >= 7) + nextReelPointer--; + } + + routine.setReelPointer(nextReelPointer); + } + + showGameReel(&routine); + addToPeopleList(&routine); +} + +void DreamWebEngine::introMonks1(ReelRoutine &routine) { + if (checkSpeed(routine)) { + uint16 nextReelPointer = routine.reelPointer() + 1; + + if (nextReelPointer == 80) { + _mapY += 10; + _nowInNewRoom = 1; + showGameReel(&routine); + return; + } else if (nextReelPointer == 30) { + _mapY -= 10; + _nowInNewRoom = 1; + nextReelPointer = 51; + } + + routine.setReelPointer(nextReelPointer); + + if (nextReelPointer == 5 || nextReelPointer == 15 || + nextReelPointer == 25 || nextReelPointer == 61 || + nextReelPointer == 71) { + // Wait step + intro2Text(nextReelPointer); + routine.counter = (uint8)-20; + } + } + + showGameReel(&routine); + routine.mapY = _mapY; +} + +void DreamWebEngine::introMonks2(ReelRoutine &routine) { + if (checkSpeed(routine)) { + uint16 nextReelPointer = routine.reelPointer() + 1; + if (nextReelPointer == 87) { + _introCount++; + monks2text(); + + if (_introCount == 19) + nextReelPointer = 87; + else + nextReelPointer = 74; + } + + if (nextReelPointer == 110) { + _introCount++; + monks2text(); + + if (_introCount == 35) + nextReelPointer = 111; + else + nextReelPointer = 98; + } else if (nextReelPointer == 176) { + _getBack = 1; + } else if (nextReelPointer == 125) { + nextReelPointer = 140; + } + + routine.setReelPointer(nextReelPointer); + } + + showGameReel(&routine); +} + +void DreamWebEngine::soldier1(ReelRoutine &routine) { + if (routine.reelPointer() != 0) { + _vars._watchingTime = 10; + if (routine.reelPointer() == 30) { + _vars._combatCount++; + if (_vars._combatCount == 40) + _vars._manDead = 2; + } else if (checkSpeed(routine)) { + // Not after shot + routine.incReelPointer(); + } + } else if (_vars._lastWeapon == 1) { + _vars._watchingTime = 10; + if (_mansPath == 2 && _facing == 4) + routine.incReelPointer(); + _vars._lastWeapon = 0xFF; + _vars._combatCount = 0; + } + + showGameReel(&routine); + addToPeopleList(&routine); +} + +void DreamWebEngine::receptionist(ReelRoutine &routine) { + if (checkSpeed(routine)) { + if (_vars._cardPassFlag == 1) { + // Set card + _vars._cardPassFlag++; + routine.b7 = 1; + routine.setReelPointer(64); + } + + if (routine.reelPointer() != 58) { + // notdes1 + if (routine.reelPointer() != 60) { + // notdes2 + if (routine.reelPointer() != 88) + routine.incReelPointer(); // not end card + else + routine.setReelPointer(53); + } else if (randomNumber() >= 240) { + routine.setReelPointer(53); + } + } else if (randomNumber() >= 30) { + routine.setReelPointer(55); + } else { + // notdes2 + if (routine.reelPointer() != 88) + routine.incReelPointer(); // not end card + else + routine.setReelPointer(53); + } + } + + showGameReel(&routine); + addToPeopleList(&routine); + if (routine.b7 & 128) + _vars._talkedToRecep = 1; +} + +void DreamWebEngine::bartender(ReelRoutine &routine) { + if (checkSpeed(routine)) { + if (routine.reelPointer() == 86) { + if (randomNumber() >= 18) + routine.setReelPointer(81); + else + routine.incReelPointer(); // notsmoket2 + } else if (routine.reelPointer() == 103) { + routine.setReelPointer(81); // notsmoket1 + } else { + routine.incReelPointer(); // notsmoket2 + } + } + + showGameReel(&routine); + if (_vars._gunPassFlag == 1) + routine.b7 = 9; // got gun + + addToPeopleList(&routine); +} + +void DreamWebEngine::heavy(ReelRoutine &routine) { + routine.b7 &= 127; + if (routine.reelPointer() != 43) { + _vars._watchingTime = 10; + if (routine.reelPointer() == 70) { + // After shot + _vars._combatCount++; + if (_vars._combatCount == 80) + _vars._manDead = 2; + } else { + if (checkSpeed(routine)) + routine.incReelPointer(); + } + } else if (_vars._lastWeapon == 1 && _mansPath == 5 && _facing == 4) { + // Heavy wait + _vars._lastWeapon = (byte)-1; + routine.incReelPointer(); + _vars._combatCount = 0; + } + + showGameReel(&routine); + addToPeopleList(&routine); +} + +void DreamWebEngine::helicopter(ReelRoutine &routine) { + if (routine.reelPointer() == 203) { + // Won helicopter + _pointerMode = 0; + return; + } + + if (checkSpeed(routine)) { + uint16 nextReelPointer = routine.reelPointer() + 1; + if (nextReelPointer == 53) { + // Before killing helicopter + _vars._combatCount++; + if (_vars._combatCount >= 8) + _vars._manDead = 2; + nextReelPointer = 49; + } else if (nextReelPointer == 9) { + nextReelPointer--; + if (_vars._lastWeapon == 1) { + _vars._lastWeapon = (byte)-1; + nextReelPointer = 55; + } else { + nextReelPointer = 5; + _vars._combatCount++; + if (_vars._combatCount == 20) { + _vars._combatCount = 0; + nextReelPointer = 9; + } + } + } + + routine.setReelPointer(nextReelPointer); + } + + showGameReel(&routine); + routine.mapX = _mapX; + if (routine.reelPointer() < 9 && _vars._combatCount >= 7) { + _pointerMode = 2; + _vars._watchingTime = 0; + } else { + // Not waiting helicopter + _pointerMode = 0; + _vars._watchingTime = 2; + } +} + +void DreamWebEngine::mugger(ReelRoutine &routine) { + if (routine.reelPointer() != 138) { + if (routine.reelPointer() == 176) + return; // endmugger2 + + if (routine.reelPointer() == 2) + _vars._watchingTime = 175 * 2; // set watch + + if (checkSpeed(routine)) + routine.incReelPointer(); + + showGameReel(&routine); + routine.mapX = _mapX; + } else { + createPanel2(); + showIcon(); + + const uint8 *string = (const uint8 *)_puzzleText.getString(41); + uint16 y = 104; + printDirect(&string, 33 + 20, &y, 241, 241 & 1); + workToScreen(); + hangOn(300); + routine.setReelPointer(140); + _mansPath = 2; + _finalDest = 2; + findXYFromPath(); + _resetManXY = 1; + _command = findExObject("WETA"); + _objectType = kExObjectType; + removeObFromInv(); + _command = findExObject("WETB"); + _objectType = kExObjectType; + removeObFromInv(); + makeMainScreen(); + setupTimedUse(48, 70, 10, 68 - 32, 54 + 64); + _vars._beenMugged = 1; + } +} + +// Exiting the elevator of Sartain's industries, Sartain (the businessman) and +// two bodyguards are expecting Ryan. +void DreamWebEngine::businessMan(ReelRoutine &routine) { + _pointerMode = 0; + _vars._watchingTime = 2; + if (routine.reelPointer() == 2) + setupTimedUse(49, 30, 1, 68, 174); // First + + if (routine.reelPointer() == 95) { + // Businessman combat won - end + _pointerMode = 0; + _vars._watchingTime = 0; + return; + } + + if (routine.reelPointer() == 49) + return; // Businessman combat end + + if (checkSpeed(routine)) { + uint16 nextReelPointer = routine.reelPointer() + 1; + if (nextReelPointer == 48) { + _vars._manDead = 2; // before dead body + } else if (nextReelPointer == 15) { + nextReelPointer--; + if (_vars._lastWeapon == 3) { + // Shield on bus + _vars._lastWeapon = (byte)-1; + _vars._combatCount = 0; + nextReelPointer = 51; + } else { + // No shield on businessman + _vars._combatCount++; + if (_vars._combatCount == 20) { + _vars._combatCount = 0; + nextReelPointer = 15; + } + } + } else { + // Businessman combat won + if (nextReelPointer == 91) { + turnPathOn(0); + turnPathOn(1); + turnPathOn(2); + turnPathOff(3); + _mansPath = 5; + _finalDest = 5; + findXYFromPath(); + _resetManXY = 1; + nextReelPointer = 92; + } + } + + routine.setReelPointer(nextReelPointer); + } + + showGameReel(&routine); + routine.mapY = _mapY; + if (routine.reelPointer() == 14) { + _vars._watchingTime = 0; + _pointerMode = 2; + } +} + +void DreamWebEngine::endGameSeq(ReelRoutine &routine) { + if (checkSpeed(routine)) { + uint16 nextReelPointer = routine.reelPointer() + 1; + if (nextReelPointer == 51 && _introCount != 140) { + _introCount++; + textForEnd(); + nextReelPointer = 50; + } + + routine.setReelPointer(nextReelPointer); + if (nextReelPointer == 134) { + fadeScreenDownHalf(); + } else if (nextReelPointer == 324) { + fadeScreenDowns(); + _volumeTo = 7; + _volumeDirection = 1; + } + + if (nextReelPointer == 340) + _getBack = 1; + } + + showGameReel(&routine); + routine.mapY = _mapY; + + if (routine.reelPointer() == 145) { + routine.setReelPointer(146); + rollEndCreditsGameWon(); + } +} + +void DreamWebEngine::poolGuard(ReelRoutine &routine) { + if (routine.reelPointer() == 214 || routine.reelPointer() == 258) { + // Combat over 2 + showGameReel(&routine); + _vars._watchingTime = 2; + _pointerMode = 0; + _vars._combatCount++; + if (_vars._combatCount < 100) + return; // doneover2 + _vars._watchingTime = 0; + _vars._manDead = 2; + return; + } else if (routine.reelPointer() == 185) { + // Combat over 1 + _vars._watchingTime = 0; + _pointerMode = 0; + turnPathOn(0); + turnPathOff(1); + return; + } + + if (routine.reelPointer() == 0) + turnPathOn(0); // first pool + + if (checkSpeed(routine)) { + uint16 nextReelPointer = routine.reelPointer() + 1; + + if (nextReelPointer != 122) { + // Not end guard 1 + if (nextReelPointer == 147) { + nextReelPointer--; + if (_vars._lastWeapon == 1) { + // Gun on pool + _vars._lastWeapon = (byte)-1; + nextReelPointer = 147; + } else { + // Gun not on pool + _vars._combatCount++; + if (_vars._combatCount == 40) { + _vars._combatCount = 0; + nextReelPointer = 220; + } + } + } + } else { + nextReelPointer--; + + if (_vars._lastWeapon == 2) { + // Axe on pool + _vars._lastWeapon = (byte)-1; + nextReelPointer = 122; + } else { + _vars._combatCount++; + if (_vars._combatCount == 40) { + _vars._combatCount = 0; + nextReelPointer = 195; + } + } + } + + routine.setReelPointer(nextReelPointer); + } + + showGameReel(&routine); + + if (routine.reelPointer() != 121 && routine.reelPointer() != 146) { + _pointerMode = 0; + _vars._watchingTime = 2; + } else { + _pointerMode = 2; + _vars._watchingTime = 0; + } +} + +} // End of namespace DreamWeb |