scummvm/engines/dreamweb/people.cpp
Filippos Karapetis eaed1b725a DREAMWEB: Replaced most isCD calls with calls checking for speech
This is quite useful for devices with limited storage, where the user
can use the CD version without its speech files
2011-12-28 18:54:17 +02:00

1111 lines
27 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 "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;
if (hasSpeech()) {
if (_speechCount >= 63)
return;
if (_channel1Playing != 255)
return;
origCount = _speechCount;
++_speechCount;
} else {
if (_vars._combatCount >= 61)
return;
if (_vars._combatCount & 3)
return;
origCount = _vars._combatCount / 4;
}
setupTimedTemp(47 + origCount, 82, 72, 80, 90, 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("DREAMWEB.T82");
_vars._combatCount = (uint8)-1;
_speechCount = 0;
}
++newReelPointer;
if (newReelPointer == 294) {
if (!_wonGame) {
_wonGame = true;
getRidOfTempText();
}
return;
}
if (newReelPointer == 66) {
++_vars._combatCount;
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 = 20 + randomNumber() % 5;
} 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)
DreamWebEngine::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();
DreamWebEngine::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)
DreamWebEngine::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