scummvm/engines/teenagent/callbacks.cpp
D G Turner e2d6381645 TEENAGENT: Switch Callback ordering to use switch before cseg data.
This now emits warning output if a callback is not explicitly
implemented in the switch statement. This is to migrate away from
loading and using the cseg data in favor of explicit code blocks.

Also, some implementation of callbacks using cseg previously.
2012-07-29 06:00:27 +01:00

4409 lines
105 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 "teenagent/teenagent.h"
#include "teenagent/scene.h"
#include "teenagent/inventory.h"
#include "teenagent/resources.h"
#include "teenagent/dialog.h"
#include "common/textconsole.h"
namespace TeenAgent {
#define CHECK_FLAG(addr, v) (res->dseg.get_byte(addr) == (v))
#define SET_FLAG(addr, v) (res->dseg.set_byte((addr), (v)))
#define GET_FLAG(addr) (res->dseg.get_byte(addr))
#define INC_FLAG(addr) (++*res->dseg.ptr(addr))
void TeenAgentEngine::fnIntro() {
hideActor();
loadScene(41, 139, 156, 3);
playSound(41, 12);
playAnimation(912, 1);
setOns(0, 108);
playSound(62, 8);
playSound(58, 40);
playAnimation(913, 1);
setOns(1, 109);
setLan(2, 1);
dialog->show(192, scene, 914, 915, 0xe7, 0xd7, 2, 1);
displayCredits(dsAddr_introCredits1);
loadScene(42, 139, 156, 3);
playSound(15, 20);
playAnimation(916, 1);
playSound(40, 18);
playSound(40, 22);
for (byte i = 27; i < 37; i += 2)
playSound(40, i);
playSound(29, 44);
playAnimation(918, 0, true);
playAnimation(917, 1, true);
waitAnimation();
displayCredits(dsAddr_introCredits2);
loadScene(40, 139, 156, 3);
playMusic(3);
dialog->show(193, scene, 920, 924, 0xe7, 0xeb, 1, 2);
playSound(26, 50);
playAnimation(925, 0, true);
playAnimation(926, 1, true);
waitAnimation();
dialog->show(194, scene, 927, 920, 0xeb, 0xe7, 2, 1);
displayCredits(dsAddr_introCredits3);
loadScene(39, 139, 156, 3);
playMusic(11);
playSound(81, 2);
playSound(81, 8);
playSound(81, 11);
playSound(81, 14);
playSound(81, 16);
playSound(81, 18);
playSound(81, 20);
playSound(81, 21);
playAnimation(928, 1);
setOns(0, 112);
dialog->showMono(195, scene, 929, 0xd1, 1);
showActor();
moveTo(319, 150, 1, true);
moveTo(63, 150, 1);
displayAsyncMessage(dsAddr_HeyWtmQMsg, 4, 62, 18, 36); // hey, what's the matter?
playAnimation(851, 0, true);
playActorAnimation(930, true);
waitAnimation();
playSound(24, 11);
playActorAnimation(931);
displayCredits(dsAddr_introCredits4);
playMusic(3);
loadScene(40, 50, 186, 1);
setOns(0, 113);
dialog->show(196, scene, 919, 0, 0xe7, 0xd1, 1, 0);
moveTo(196, 186, 1);
dialog->show(197, scene, 0, 920, 0xd1, 0xe7, 0, 1);
playActorAnimation(932);
dialog->show(198, scene, 0, 920, 0xd1, 0xe7, 0, 1);
playActorAnimation(932);
dialog->show(199, scene, 0, 920, 0xd1, 0xe7, 0, 1);
playActorAnimation(932);
dialog->show(200, scene, 0, 922, 0xd1, 0xe7, 0, 1);
playActorAnimation(933);
dialog->show(201, scene, 0, 920, 0xd1, 0xe7, 0, 1);
moveTo(174, 186, 1);
playAnimation(851, 0, true);
playActorAnimation(934, true);
waitAnimation();
loadScene(10, 136, 153, 3);
}
void TeenAgentEngine::fnPoleClimbFail() {
moveTo(86, 195, 1, true);
playActorAnimation(868);
}
void TeenAgentEngine::fnGotAnchor() {
SET_FLAG(0x0000, 0);
setTimerCallback(0, 0);
scene->getActorAnimation()->free();
playSound(64, 7);
playActorAnimation(618);
disableObject(5);
setOns(0, 0);
playSound(31, 1);
playActorAnimation(619);
fnGetOutOfLake();
inventory->add(42);
displayMessage(dsAddr_hookedAnchorMsg); // "I was really hooked on this anchor!"
}
void TeenAgentEngine::fnGetOutOfLake() {
loadScene(15, 156, 180, 3);
playSound(5, 5);
playSound(38, 14);
playSound(38, 20);
playSound(5, 25);
playActorAnimation(616);
}
void TeenAgentEngine::fnGuardDrinking() {
SET_FLAG(0x0000, 0);
setTimerCallback(0, 0);
scene->getAnimation(0)->free();
SET_FLAG(0xdb9c, 1);
displayAsyncMessage(dsAddr_BooMsg, 300, 130, 1, 5); // "Booo!"
setOns(0, 16);
enableObject(2);
playSound(17, 5);
playAnimation(545, 0);
dialog->show(5, scene, 0, 546, 0xd1, 0xd9, 0, 1);
SET_FLAG(0xda96, 1);
SET_FLAG(0xda97, 0);
}
void TeenAgentEngine::fnEgoDefaultPosition() {
if (scene->getPosition().y <= 149)
moveTo(94, 115, 4);
else
moveTo(51, 149, 4);
}
void TeenAgentEngine::fnEnterCave() {
loadScene(24, 230, 170, 1);
playSound(52, 3);
playSound(52, 7);
playSound(52, 11);
playSound(52, 14);
playSound(52, 18);
playSound(52, 21);
playSound(52, 25);
playActorAnimation(601);
moveTo(230, 179, 3);
if (!CHECK_FLAG(dsAddr_lightOnFlag, 1))
displayMessage(dsAddr_kindaDarkMsg); // "It's kinda dark here"
}
void TeenAgentEngine::fnEgoScaredBySpider() {
if (CHECK_FLAG(0xdbae, 1)) {
fnMoveToLadderAndLeaveCellar();
dialog->showMark(75, scene);
} else {
dialog->showMark(73, scene);
fnMoveToLadderAndLeaveCellar();
wait(100);
dialog->showMark(74, scene);
}
}
void TeenAgentEngine::fnMoveToLadderAndLeaveCellar() {
Object *objTemp = scene->getObject(3);
moveTo(objTemp);
fnLeaveCellar();
moveTo(48, 190, 3);
}
void TeenAgentEngine::fnLeaveCellar() {
playSound(52, 10);
playSound(52, 14);
playSound(52, 18);
playSound(52, 21);
playSound(52, 25);
playSound(52, 28);
playSound(52, 32);
playActorAnimation(600);
loadScene(21, 297, 178, 3);
}
void TeenAgentEngine::fnPutRockInHole() {
if (CHECK_FLAG(0x0000, 0)) {
playSound(5, 2);
playSound(15, 12);
playActorAnimation(638);
inventory->remove(48);
setTimerCallback(csAddr_mouseOutOfHoleTimeout, 100);
SET_FLAG(0x0000, 1);
} else if (CHECK_FLAG(0x0000, 1)) {
playSound(5, 2);
playSound(52, 13);
playActorAnimation(648);
setOns(1, 46);
inventory->remove(49);
setTimerCallback(csAddr_mouseOutOfHoleTimeout, 100);
SET_FLAG(0x0000, 2);
} else if (CHECK_FLAG(0x0000, 2)) {
playActorAnimation(649);
setOns(1, 47);
wait(300);
for (byte i = 1; i <= 37; i += 4)
playSound(68, i);
playAnimation(639, 2);
setOns(0, 42);
enableObject(6);
disableObject(5);
SET_FLAG(dsAddr_mouseGotGoldNuggetFlag, 1);
SET_FLAG(0x0000, 0);
setTimerCallback(0, 0);
}
}
void TeenAgentEngine::fnEgoBottomRightTurn() {
Common::Point p = scene->getPosition();
if (p.x == 208 && p.y == 151)
moveRel(0, 0, 2);
else
moveTo(208, 151, 1);
}
bool TeenAgentEngine::fnCheckingDrawers() {
uint16 v = GET_FLAG(0xdbc1) - 1;
if (GET_FLAG(0xdbb7 + v) != 1)
return false;
else {
uint16 sum = 0;
for (uint i = 0; i < 6; ++i)
sum += GET_FLAG(0xdbb7 + i);
if (sum != 1)
return false;
else
return true;
}
}
void TeenAgentEngine::fnDrawerOpenMessage() {
if (CHECK_FLAG(0xdbbd, 1))
displayMessage(dsAddr_drawerOpenMsg); // "I cannot open the drawer if the next one is open!"
else {
displayMessage(dsAddr_strangeDrawerMsg); // "Strange, but the drawer is stuck if the next drawer is open"
displayMessage(dsAddr_notOrdinaryDrawersMsg); // "Maybe these are not just ordinary drawers!"
SET_FLAG(0xdbbd, 1);
}
}
bool TeenAgentEngine::fnRobotSafeAlreadyUnlockedCheck() {
if (!CHECK_FLAG(0xdbd1, 1)) {
displayMessage(dsAddr_noReasonMsg); // "There's no reason to do it"
return false;
} else
return true;
}
void TeenAgentEngine::fnRobotSafeUnlockCheck() {
if (!(CHECK_FLAG(0xdbd2, 0) || CHECK_FLAG(0xdbd3, 0) || CHECK_FLAG(0xdbd4, 0))) {
waitLanAnimationFrame(1, 1);
playSound(89, 2);
playActorAnimation(731);
setOns(0, 70);
setLan(1, 0);
disableObject(1);
enableObject(2);
enableObject(3);
}
}
bool TeenAgentEngine::fnMansionIntrusionAttempt() {
wait(50);
byte attempts = res->dseg.get_byte(dsAddr_mansionEntryCount) + 1;
res->dseg.set_byte(dsAddr_mansionEntryCount, attempts);
debugC(0, kDebugCallbacks, "mansion intrusion attempt #%u", attempts);
if (attempts >= 7)
return false;
else {
byte id = scene->getId();
playMusic(11);
displayCutsceneMessage(dsAddr_cutsceneMsg2, 84, 95); // "Meanwhile in the mansion"
switch (attempts) {
case 2:
fnSecondMansionIntrusion();
break;
case 3:
fnThirdMansionIntrusion();
break;
case 4:
fnFourthMansionIntrusion();
break;
case 5:
fnFifthMansionIntrusion();
break;
case 6:
fnSixthMansionIntrusion();
break;
default:
error("mansion intrusion attempts out of range!");
break;
}
playMusic(6);
if (getFlag(0xdbec) != 1 || attempts != 6)
loadScene(id, scene->getPosition());
return true;
}
}
void TeenAgentEngine::fnSecondMansionIntrusion() {
hideActor();
loadScene(34, scene->getPosition());
playAnimation(986, 0, true);
playAnimation(987, 1, true);
waitAnimation();
dialog->show(178, scene, 988, 989, 0xd9, 0xd0, 1, 2);
playAnimation(990, 0, true);
playAnimation(991, 1, true);
waitAnimation();
showActor();
}
void TeenAgentEngine::fnThirdMansionIntrusion() {
hideActor();
loadScene(30, scene->getPosition());
playAnimation(887, 1);
playAnimation(888, 2, true, true, true);
//waitAnimation();
dialog->showMono(179, scene, 889, 0xd9, 2);
playSound(26, 3);
playAnimation(891, 1, true, true, true);
playAnimation(892, 2);
waitAnimation();
dialog->show(180, scene, 890, 889, 0xd0, 0xd9, 3, 2);
showActor();
}
void TeenAgentEngine::fnFourthMansionIntrusion() {
hideActor();
loadScene(32, scene->getPosition());
playAnimation(894, 1, true, true, true);
playAnimation(893, 2, true);
waitAnimation();
dialog->showMono(181, scene, 895, 0xd9, 3);
playSound(75, 9);
playAnimation(898, 1, true);
playAnimation(897, 2, true);
dialog->show(182, scene, 896, 895, 0xd0, 0xd9, 2, 3);
showActor();
}
void TeenAgentEngine::fnFifthMansionIntrusion() {
hideActor();
loadScene(29, scene->getPosition());
playActorAnimation(901, true);
playAnimation(900, 1, true);
waitAnimation();
dialog->show(183, scene, 903, 902, 0xd0, 0xd9, 2, 3);
for (byte i = 3; i <= 9; i += 2)
playSound(56, i);
playActorAnimation(905, true);
playAnimation(904, 1, true);
dialog->show(184, scene, 903, 902, 0xd0, 0xd9, 2, 3);
showActor();
}
void TeenAgentEngine::fnSixthMansionIntrusion() {
hideActor();
loadScene(35, scene->getPosition());
playAnimation(907, 2, true);
playAnimation(906, 3, true);
waitAnimation();
dialog->show(185, scene, 908, 909, 0xd9, 0xd0, 2, 3);
dialog->show(186, scene, 910, 908, 0xd0, 0xd9, 3, 2);
loadScene(11, scene->getPosition());
showActor();
setOns(3, 51);
playAnimation(911, 1);
playAnimation(899, 1);
setFlag(0xdbec, 1);
reloadLan();
wait(200);
enableObject(8);
setLan(2, 8);
}
void TeenAgentEngine::fnTooDark() {
displayMessage(dsAddr_TooDarkMsg); // "It's too dark to see clearly"
}
bool TeenAgentEngine::fnIsCookGone() {
if (!CHECK_FLAG(0xdbcc, 1)) {
displayMessage(dsAddr_cookAroundMsg); // "I can't do anything with this cook around"
return false;
} else
return true;
}
void TeenAgentEngine::fnEgoSuspiciousPosition() {
Common::Point p = scene->getPosition();
if (p.x != 203 && p.y != 171)
moveTo(203, 169, 2);
else
moveTo(203, 169, 1);
}
void TeenAgentEngine::fnGivingFlowerToOldLady() {
playSound(5, 2);
dialog->show(37, scene, 0, 523, 0xd1, 0xe5, 0, 1);
playActorAnimation(537, true);
playAnimation(538, 0, true);
waitAnimation();
wait(100);
dialog->show(38, scene, 0, 523, 0xd1, 0xe5, 0, 1);
}
void TeenAgentEngine::fnGiveAnotherFlowerToOldLady() {
dialog->pop(scene, 0xdaf0, 0, 523, 0xd1, 0xe5, 0, 1);
}
void TeenAgentEngine::fnGivingFlowerToAnne() {
dialog->show(53, scene, 0, 524, 0xd1, 0xe5, 0, 2);
playSound(5, 10);
playActorAnimation(540, true);
playAnimation(539, 1, true);
waitAnimation();
wait(100);
dialog->show(54, scene, 0, 524, 0xd1, 0xe5, 0, 2);
wait(50);
dialog->show(55, scene, 0, 524, 0xd1, 0xe5, 0, 2);
dialog->show(56, scene, 0, 524, 0xd1, 0xe5, 0, 2);
wait(50);
moveRel(0, 1, 0);
dialog->show(57, scene, 0, 524, 0xd1, 0xe5, 0, 2);
moveRel(0, -1, 0);
wait(50);
}
void TeenAgentEngine::fnGiveAnotherFlowerToAnne() {
dialog->pop(scene, 0xdb02, 0, 524, 0xd1, 0xe5, 0, 2);
}
void TeenAgentEngine::rejectMessage() {
uint i = _rnd.getRandomNumber(3);
switch (i) {
case 0:
displayMessage(dsAddr_rejectMsg0); // "I have no idea what to do with it"
break;
case 1:
displayMessage(dsAddr_rejectMsg1); // "I can't imagine what I could do with this"
break;
case 2:
displayMessage(dsAddr_rejectMsg2); // "I can't figure out what I should do with this"
break;
case 3:
displayMessage(dsAddr_rejectMsg3); // "I can't find any reason to mess with it"
break;
default:
error("rejectMessage() index out of range");
break;
}
}
bool TeenAgentEngine::processCallback(uint16 addr) {
if (addr == 0)
return false;
debugC(0, kDebugCallbacks, "processCallback(%04x)", addr);
bool retVal = true;
switch (addr) {
case csAddr_intro: // intro
fnIntro();
break;
case 0x3fed:
loadScene(3, Common::Point(305, 104));
scene->setOrientation(4);
break;
case 0x4007:
loadScene(5, Common::Point(300, 131));
scene->setOrientation(3);
break;
case 0x4021:
// pulling out mysterious object
if (CHECK_FLAG(0xdbe1, 1)) {
playActorAnimation(844);
playActorAnimation(846);
playActorAnimation(845);
displayMessage(dsAddr_pullObjMsg1); // "I can't pull it out"
} else {
displayMessage(dsAddr_pullObjMsg2); // "I can't reach it"
}
break;
case 0x404f:
displayMessage(dsAddr_notWantToSleepMsg); // "I don't want to sleep"
break;
case 0x4060:
loadScene(2, Common::Point(28, 180));
scene->setOrientation(2);
break;
case 0x407a:
loadScene(4, Common::Point(297, 128));
scene->setOrientation(4);
break;
case 0x4094: // climbing to the pole near mudpool
if (CHECK_FLAG(0xdbe4, 1)) {
displayMessage(dsAddr_poleClimbDoneMsg); // "Never Again!"
} else {
for (byte i = 11; i <= 27; i += 4)
playSound(76, i);
playSound(56, 35);
playSound(19, 59);
playActorAnimation(864);
playAnimation(865, 1);
playActorAnimation(866);
//InventoryObject *obj = inventory->selectedObject();
//if (obj != NULL && obj->id == 0x55) {
// implement pause and using real object:
if (inventory->has(0x55)) {
playSound(5, 4);
playSound(5, 19);
playSound(64, 11);
playActorAnimation(867);
inventory->remove(0x55);
inventory->add(0x56);
moveTo(86, 195, 1, true);
playActorAnimation(868);
SET_FLAG(0xdbe4, 1);
} else {
fnPoleClimbFail();
dialog->pop(scene, 0xdb72, 0, 0, 0xd1, 0xd1, 0, 0);
}
}
break;
case csAddr_poleClimbFail:
fnPoleClimbFail();
break;
case 0x4195:
displayMessage(dsAddr_preferWaterMsg); // "I prefer water"
break;
case 0x419c: // getting the bird
setOns(0, 0);
playSound(56, 10);
playActorAnimation(875);
disableObject(6);
inventory->add(0x5c);
break;
case 0x41ca:
rejectMessage();
break;
case 0x41ce:
moveTo(197, 159, 4);
setOns(0, 0);
playSound(71, 8);
playActorAnimation(833);
moveTo(225, 159, 4);
inventory->add(0x4e);
disableObject(3);
break;
case 0x422c:
displayMessage(dsAddr_tooWeakToClimbMsg); // "I'm too weak to climb it"
break;
case 0x4233:
loadScene(3, Common::Point(216, 199));
scene->setOrientation(1);
break;
case 0x424d:
loadScene(5, Common::Point(18, 174));
scene->setOrientation(2);
break;
case 0x4267:
hideActor();
playSound(23, 8);
playSound(24, 13);
setOns(1, 0);
playActorAnimation(841);
setOns(1, 0x61);
setOns(2, 0);
playSound(63, 12);
playSound(5, 26);
playActorAnimation(842);
wait(100);
// shown in different positions
displayMessage(dsAddr_fnMsg2, 0xd1, 16, 68); // "And how am I supposed to get back?"
wait(50);
displayMessage(dsAddr_fnMsg3, 0xd1, 92, 68); // "Great"
wait(50);
displayMessage(dsAddr_fnMsg4, 0xd1, 62, 68); // "Oh, yeah, right"
wait(50);
playActorAnimation(843);
showActor();
moveTo(223, 149, 0, true);
disableObject(7);
disableObject(1);
inventory->add(0x51);
displayMessage(dsAddr_fnMsg1); // "Piece of cake"
break;
case 0x433a:
loadScene(10, Common::Point(294, 183));
scene->setOrientation(4);
break;
case 0x4354:
loadScene(4, Common::Point(300, 185));
scene->setOrientation(4);
break;
case 0x436e:
loadScene(2, Common::Point(219, 199));
scene->setOrientation(1);
break;
case 0x4388:
playSound(80, 4);
playActorAnimation(961);
loadScene(8, 155, 199, 1);
break;
case 0x43b5: // HQ, first trial - prison
playSound(70, 6);
playActorAnimation(962);
loadScene(7, 30, 184, 2);
if (res->dseg.get_byte(0xdbdf) < 2) {
wait(150);
moveTo(134, 167, 2);
displayMessage(dsAddr_firstTrialMsg); // "Sir, I'm Mark. A rookie"
setLan(1, 0);
playAnimation(812, 0, true);
playActorAnimation(811);
dialog->show(148, scene, 0, 813, 0xd1, 0xec, 0, 1);
loadScene(6, 230, 184);
playMusic(5);
dialog->show(149, scene, 0, 814, 0xd1, 0xec, 0, 1);
playSound(4, 14);
playAnimation(815, 0);
setOns(1, 0);
dialog->showMono(150, scene, 0, 0xd1, 0);
SET_FLAG(0xdbdf, 1);
}
break;
case 0x4482:
if (CHECK_FLAG(0xdbdf, 0)) {
playActorAnimation(968);
displayMessage(dsAddr_lockedMsg); // "It's Locked!"
} else {
playSound(80, 3);
playSound(79, 4);
playActorAnimation(968);
loadScene(6, 280, 186, 4);
}
break;
case 0x44fc: // pull out spring from bed
playSound(53, 25);
playSound(24, 27);
playSound(5, 36);
playActorAnimation(839);
moveTo(278, scene->getPosition().y, 0, true);
inventory->add(0x50);
disableObject(1);
break;
case 0x44cb:
if (CHECK_FLAG(0xdbe5, 1)) {
displayMessage(dsAddr_vacMsg); // "What am I? A vacuum cleaner?!"
} else {
playSound(49, 14);
playSound(5, 21);
playActorAnimation(869);
inventory->add(0x58);
SET_FLAG(0xdbe5, 1);
}
break;
case 0x4532:
displayMessage(dsAddr_springPrickMsg); // "The springs would prick my back"
break;
case 0x4539: // prison cell: use crates
if (CHECK_FLAG(0xdbdd, 2)) {
// finished the meal - trap
displayMessage(dsAddr_mealFinishedMsg); // "Hey! I finished my meal."
moveTo(306, 196, 2);
wait(50);
//playAnimation(825, 1); //very long empty animation. what for?
wait(50);
setLan(1, 0);
playSound(71, 4);
playActorAnimation(823);
loadScene(5, scene->getPosition());
playSound(74, 1);
playSound(74, 3);
playSound(74, 6);
playActorAnimation(826);
loadScene(6, scene->getPosition());
setOns(3, 0x5b);
wait(50);
displayMessage(dsAddr_bowlWeldedMsg); // "Wow. He got welded to the bowl"
SET_FLAG(0xdbdd, 3);
scene->getObject(4)->setName("body");
} else {
if (dialog->pop(scene, 0xdb5c, 0, 0, 0xd1, 0xd1, 0, 0) == 0x636b) { // 'im getting hungry'
wait(100);
playSound(52, 8);
playSound(52, 13);
playAnimation(820, 1);
setOns(3, 0x59);
wait(50);
moveTo(scene->getPosition().x, scene->getPosition().y + 1, 3);
wait(150);
moveTo(scene->getPosition().x, scene->getPosition().y - 1, 2);
wait(100);
displayMessage(dsAddr_ThanksMsg); // "Thanks."
enableObject(4);
SET_FLAG(0xdbdc, 1);
}
}
break;
case 0x4662:
if (CHECK_FLAG(0xdbdd, 3)) {
if (CHECK_FLAG(0xdbde, 1)) {
displayMessage(dsAddr_noPocketMsg); // "I don't want to touch his pockets again."
} else {
moveTo(280, 179, 2);
playSound(49, 7);
playSound(5, 17);
playActorAnimation(827);
inventory->add(0x4d);
SET_FLAG(0xdbde, 1);
}
} else
displayMessage(dsAddr_foodAliveMsg); // "No, thanks. This food seems still alive"
break;
case 0x46af: // prison cell: use live cable
if (CHECK_FLAG(0xdbdc, 1)) {
displayMessage(dsAddr_ideaMsg); // "That gives me an idea"
setOns(2, 0);
playActorAnimation(821);
setOns(2, 0x5a);
setOns(3, 0);
playSound(22, 2);
playActorAnimation(822);
displayMessage(dsAddr_checkWorksMsg); // "Now I got to check if it works"
disableObject(5);
SET_FLAG(0xdbdd, 1);
} else
displayMessage(dsAddr_unkUsageMsg); // "I don't have any idea what to do with it right now"
break;
case 0x4705: // prison: getting lamp bulb
wait(50);
moveTo(144, 185, 4);
playSound(56, 15);
setOns(0, 86); // hiding lamp
playActorAnimation(816, true);
playAnimation(817, 0, true);
waitAnimation();
setOns(0, 87);
playSound(34, 1);
playSound(5, 15);
playActorAnimation(818, true);
playAnimation(819, 0, true);
waitAnimation();
moveTo(160, 188, 1, true);
setOns(2, 88);
disableObject(6);
enableObject(5);
inventory->add(0x4c);
break;
case 0x4794: // prison cell door
if (res->dseg.get_byte(0xdbdf) >= 2) {
loadScene(5, 287, 143);
} else {
displayMessage(dsAddr_doorClosedMsg); // "The door is closed. What a surprise."
}
break;
case 0x47bc: // prison: examining trash can
playSound(79, 5);
playSound(1, 14);
playActorAnimation(966);
displayMessage(dsAddr_emptyMsg); // "It's Empty"
break;
case 0x47db: // prison: use switch
if (CHECK_FLAG(0xdbdf, 1)) {
playSound(71, 4);
playActorAnimation(823);
if (CHECK_FLAG(0xdbdd, 0)) {
displayMessage(dsAddr_NotHappenMsg); // "Nothing happened"
} else {
playSound(74, 1);
playAnimation(824, 1);
if (CHECK_FLAG(0xdbdd, 1)) {
wait(100);
displayMessage(dsAddr_timeToCallMsg); // "I think it is time to call captain"
SET_FLAG(0xdbdd, 2);
}
}
} else {
displayMessage(dsAddr_nahMsg); // "Nah"
}
break;
case 0x4836:
rejectMessage();
break;
case 0x4871:
playActorAnimation(965);
displayMessage(dsAddr_lockedMsg); // "It's Locked!"
break;
case 0x487e:
displayMessage(dsAddr_geographyClassMsg); // "I should have paid more attention in geography classes."
break;
case 0x4893: // taking pills
if (CHECK_FLAG(dsAddr_captainDrawerState, 1)) {
SET_FLAG(dsAddr_captainDrawerState, 2);
setOns(1, 0x67);
playSound(5, 9);
playActorAnimation(872);
inventory->add(0x5a);
disableObject(7);
} else {
playActorAnimation(964);
displayMessage(dsAddr_lockedMsg); // "It's Locked!"
}
break;
case 0x48db:
displayMessage(dsAddr_uselessModelsMsg); // "What's the use of the models?"
break;
case 0x48e2:
case 0x48e6:
rejectMessage();
break;
case 0x4918: // talking with barmen
if (CHECK_FLAG(0xdbe7, 1)) {
moveTo(140, 152, 1);
if (CHECK_FLAG(0xdbe8, 1)) {
dialog->showMono(177, scene, 0, 0xd1, 0);
displayMessage(dsAddr_yeahRightMsg, 0xef, 32, 67); // "Yeah right!"
//reloadLan();
setLan(1, 0);
playAnimation(882, 0);
playSound(75, 10);
setOns(2, 0);
playSound(75, 10);
playSound(24, 15);
playAnimation(883, 0);
shakeScreen();
disableObject(1);
disableObject(2);
SET_FLAG(0xdbe9, 1);
} else
displayMessage(dsAddr_talkNotNowMsg); // "I've got no reason to talk to him right now."
} else {
if (CHECK_FLAG(0xdbdf, 3)) {
if (CHECK_FLAG(0xdbe3, 1)) {
dialog->show(168, scene, 0, 857, 0xd1, 0xef, 0, 1);
} else {
dialog->show(166, scene, 0, 857, 0xd1, 0xef, 0, 1); // taking mug
playActorAnimation(859, true);
playAnimation(858, 0, true);
waitAnimation();
playSound(75, 6);
playActorAnimation(860);
dialog->show(167, scene, 0, 857, 0xd1, 0xef, 0, 1);
inventory->add(0x55);
SET_FLAG(0xdbe3, 1);
SET_FLAG(0xdbf0, 0);
}
} else {
dialog->pop(scene, 0xdb68, 0, 857, 0xd1, 0xef, 0, 1);
}
}
break;
case 0x4f14: // use the hollow
if (CHECK_FLAG(0xdba1, 1))
displayMessage(dsAddr_totalEmptyMsg); // "I can see it's totally empty"
else
displayMessage(dsAddr_noHandsMsg); // "I'd better not put my hands in there..."
break;
case 0x4a64:
if (CHECK_FLAG(0xdbf0, 1))
displayMessage(dsAddr_firstBusinessMsg); // "First I've got some business to take care of"
else
loadScene(5, 35, 162);
break;
case 0x4bf5:
playActorAnimation(959);
loadScene(8, 40, 152, 3);
break;
case 0x483a:
dialog->pop(scene, 0xdb82, 0, 0, 0xd1, 0xd1, 0, 0);
break;
case 0x4844:
playSound(80, 4);
playActorAnimation(963);
loadScene(5, 166, 158);
break;
case 0x48ea:
setOns(0, 0);
playSound(5, 9);
playActorAnimation(836);
inventory->add(0x4f);
disableObject(12);
break;
case 0x4a8c:
if (CHECK_FLAG(0xdbe9, 1)) {
playSound(89, 5);
playActorAnimation(958);
loadScene(9, 240, 182, 4);
} else if (CHECK_FLAG(0xdbe7, 1)) {
displayMessage(dsAddr_barmanTooCloseMsg); // "The barman is too close"
} else {
dialog->pop(scene, 0xdb8a, 0, 857, 0xd1, 0xef, 0, 1);
}
break;
case 0x4aed:
displayMessage(dsAddr_tooBigMsg); // "It's too big and I doubt if I'll ever need it"
break;
case 0x4af4: // taking the crumbs
setOns(0, 0);
playSound(49, 6);
playSound(5, 13);
playActorAnimation(861);
inventory->add(0x57);
disableObject(6);
break;
case 0x4b23:
rejectMessage();
break;
case 0x4b27:
displayMessage(dsAddr_tooMuchToDrinkMsg); // "It'd take too much time to drink it..."
break;
case 0x4b2e:
displayMessage(dsAddr_notThiefMsg); // "I'm not a thief. And it's empty, by the way."
break;
case 0x4b35:
playSound(15, 7);
playActorAnimation(884);
playSound(55, 1);
playSound(24, 12);
playAnimation(885, 0);
dialog->show(164, scene, 886, 0, 0xd0, 0xd1, 1, 0);
playMusic(3);
loadScene(40, 198, 186, 1);
dialog->show(202, scene, 0, 920, 0xd1, 0xe7, 0, 1);
inventory->clear();
inventory->add(0x1d);
displayCredits(dsAddr_credits5);
loadScene(1, 198, 186);
hideActor();
playActorAnimation(956);
dialog->showMono(212, scene, 957, 0xd1, 1);
waitAnimation();
loadScene(15, 157, 199, 1);
playMusic(6);
break;
case 0x4c3e: // get the grenade
playSound(32, 24);
playActorAnimation(862);
reloadLan();
playAnimation(863, 1);
inventory->add(0x54);
disableObject(1);
SET_FLAG(0xdbe2, 2);
break;
case 0x4c70:
if (CHECK_FLAG(0xdbe2, 0)) {
if (CHECK_FLAG(0xdbda, 1)) { // papers are shown
dialog->pop(scene, 0xdb4c, 0, 809, 0xd1, 0xd0, 0, 1);
} else {
dialog->pop(scene, 0xdb40, 0, 809, 0xd1, 0xd0, 0, 1);
}
} else {
displayMessage(dsAddr_helloQMsg); // "Hello?"
wait(100);
displayMessage(dsAddr_totallyAddictedMsg); // "He's totally addicted"
}
break;
case 0x4c1c:
playActorAnimation(960);
displayMessage(dsAddr_lockedMsg); // "It's Locked!"
break;
case 0x4ca5:
displayMessage(dsAddr_chickenNeverMsg); // "Chickening? Me? Never!"
break;
case 0x4cac:
if (CHECK_FLAG(0xdbda, 1)) { // papers are shown
loadScene(5, 124, 199);
} else {
dialog->show(144, scene, 0, 809, 0xd1, 0xd0, 0, 1);
moveTo(269, 175, 4);
dialog->pop(scene, 0xdb56, 0, 809, 0xd1, 0xd0, 0, 1);
}
break;
case 0x4cf1: // talking with mansion guard
SET_FLAG(0xda96, 1);
if (dialog->pop(scene, 0xdaa6, 0, 529, 0xd1, 0xd9, 0, 1) == 0x1b4) {
Common::Point p = scene->getPosition();
moveTo(189, 159, 0);
//waitLanAnimationFrame(1, 1);
playSound(5, 2);
playSound(5, 19);
playActorAnimation(550, true);
playAnimation(551, 0, true);
waitAnimation();
moveTo(p, 2);
inventory->add(0x13);
dialog->pop(scene, 0xdaa6, 0, 529, 0xd1, 0xd9, 0, 1);
}
break;
case 0x4d94: // talking with fatso
dialog->show(87, scene, 0, 666, 0xd1, 0xd0, 0, 2);
displayAsyncMessage(dsAddr_BribeMsg, 120, 109, 1, 10, 0xd0); // FIXME: Original (x,y) was (100, 78), rather than (120, 109)?
playSound(5, 3);
playAnimation(667, 1);
playAnimation(668, 1);
setOns(2, 50);
dialog->show(88, scene, 0, 666, 0xd1, 0xd0, 0, 2);
setOns(3, 0);
setFlag(0xdbec, 0);
reloadLan();
playSound(82, 19);
playAnimation(669, 1);
dialog->showMark(89, scene);
enableObject(15);
disableObject(8);
break;
case 0x4e61:
loadScene(14, 280, 198);
break;
case 0x4ee5:
setOns(2, 0);
playSound(5, 12);
playActorAnimation(676);
displayMessage(dsAddr_WimpMsg); // "I'm a pathetic little wimp"
disableObject(15);
inventory->add(51);
break;
case 0x4d56:
inventory->add(16);
disableObject(2);
setOns(0, 0);
playSound(5, 12);
playActorAnimation(547);
break;
case 0x4eb9: // Pick up wrapper
playSound(5, 12);
playSound(5, 18);
inventory->add(0x12);
setOns(1, 0);
playActorAnimation(549);
disableObject(13);
break;
case 0x4f25:
playActorAnimation(967);
displayMessage(dsAddr_tooHardWoodMsg); // "This wood is too hard to break"
break;
case 0x4f32: // use tree near the mansion
if (CHECK_FLAG(0xdba1, 1)) {
if (CHECK_FLAG(0xdba2, 1)) {
displayMessage(dsAddr_noChanceMsg); // "I won't take my chances a second time"
} else {
playSound(26, 13);
playSound(26, 15);
playSound(26, 23);
playSound(26, 25);
playSound(26, 32);
playSound(26, 34);
playSound(26, 36);
playActorAnimation(590);
moveTo(204, 178, 3, true);
playSound(59, 1);
playSound(60, 16);
playActorAnimation(591);
wait(50);
displayMessage(dsAddr_oneSmallStepMsg); // "One small step for man, one big pain in the head"
SET_FLAG(0xdba2, 1);
fnMansionIntrusionAttempt();
}
} else {
playActorAnimation(49);
playSound(56, 8);
playSound(56, 12);
playSound(49, 10);
displayAsyncMessage(dsAddr_laughterMsg, 219, 98, 16, 24); // "(laughter)"
playActorAnimation(587);
moveRel(0, 0, 2);
wait(100);
displayMessage(dsAddr_tickledMsg); // "Something tickled me!"
}
break;
case 0x500d: // picking up wild plant
if (CHECK_FLAG(0xdb9e, 1)) {
displayMessage(dsAddr_noPotatoMsg); // "There are no more potatoes"
} else {
SET_FLAG(0xdb9e, 1);
setOns(2, 0);
playSound(21, 9);
playSound(34, 21);
playSound(26, 30);
playActorAnimation(552);
setOns(2, 0x12);
inventory->add(0x14);
}
break;
case 0x5104:
loadScene(11, 319, 198, 4);
if (!CHECK_FLAG(0xdb9c, 1)) {
// guard is drinking
SET_FLAG(0x0000, 3);
setTimerCallback(csAddr_guardScareTimeout, 40);
playAnimation(544, 0, true, true); // ignore busy flag for this animation
}
break;
case csAddr_guardScareTimeout: // too late to scare guard, resetting
SET_FLAG(0x0000, 0);
break;
case csAddr_guardDrinking:
fnGuardDrinking();
break;
case 0x51f0:
setOns(0, 0);
playSound(5, 11);
playActorAnimation(637);
disableObject(7);
inventory->add(49);
break;
case 0x5217:
if (CHECK_FLAG(0xdb9f, 1))
displayMessage(dsAddr_notHungryMsg); // "Thanks, I'm not hungry"
else
displayMessage(dsAddr_avoidBeesMsg); // "I'm going to stay at least five meters away from these bees!"
break;
case 0x5237:
if (!CHECK_FLAG(0xdb9f, 1)) {
displayMessage(dsAddr_avoidBeesMsg); // "I'm going to stay at least five meters away from these bees!"
} else if (CHECK_FLAG(0xdba0, 1))
displayMessage(dsAddr_roadNowhereMsg); // "Nah. It's a road to nowhere"
else {
moveTo(173, 138, 2);
playSound(28, 5);
playActorAnimation(583);
playActorAnimation(584);
loadScene(0, 0, 0, 0); // clear background
playSound(72, 18);
playSound(73, 39);
playActorAnimation(585);
loadScene(11, 194, 160, 2);
playSound(28, 2);
playActorAnimation(586);
moveTo(138, 163, 3);
displayMessage(dsAddr_lifeBrutalMsg); // "Life is really brutal"
SET_FLAG(0xdba0, 1);
fnMansionIntrusionAttempt();
}
break;
case 0x55a8:
{
uint16 d = dialog->pop(scene, 0xdb08, 0, 0, 0xd1, 0xd1, 0, 0);
if (d == 0x2c5d) {
waitLanAnimationFrame(1, 0x23);
setOns(0, 0);
playSound(52, 9);
playSound(52, 11);
playSound(52, 13);
playSound(53, 32);
playAnimation(570, 0);
wait(50);
displayMessage(dsAddr_ThanksMsg); // "Thanks."
disableObject(5);
SET_FLAG(0xdbb0, 1);
} else if (d != 0x2c9b) {
waitLanAnimationFrame(1, 0x23);
playSound(52, 9);
playSound(52, 11);
playSound(52, 13);
playAnimation(569, 0);
}
}
break;
case 0x5663:
if (CHECK_FLAG(0xdbb0, 1))
displayMessage(dsAddr_findNutMsg); // "I won't find the nut just like that. The grass is too dense"
else
displayMessage(dsAddr_hmmGrassMsg); // "Hmmm. Grass..."
break;
case 0x569c:
playSound(67, 5);
playActorAnimation(983);
displayMessage(dsAddr_emptyMsg); // "It's Empty"
break;
case 0x56b7:
playSound(66, 5);
playSound(67, 11);
playActorAnimation(984);
displayMessage(dsAddr_emptyMsg); // "It's Empty"
break;
case 0x5728:
inventory->add(0x0d);
disableObject(14);
setOns(0, 0);
playSound(5, 10);
playActorAnimation(566);
break;
case 0x5793:
if (!CHECK_FLAG(0xdb94, 1)) {
displayMessage(dsAddr_shutTightMsg); // "It's shut tight"
} else if (CHECK_FLAG(0xdb95, 1)) {
displayMessage(dsAddr_bootEmptyMsg); // "There's nothing else in the boot"
} else {
SET_FLAG(0xdb95, 1);
moveTo(188, 179, 0);
playSound(7, 16);
playActorAnimation(519);
wait(150);
moveTo(168, 179, 2);
inventory->add(3);
}
break;
case 0x5d88:
if (CHECK_FLAG(0xdba5, 1)) { // dry laundry
SET_FLAG(0xdba5, 2);
dialog->show(46, scene, 0, 523, 0xd1, 0xe5, 0, 1);
//waitLanAnimationFrame(1, 1); // another long waiting
playAnimation(604, 0);
loadScene(21, scene->getPosition());
setOns(0, 0);
disableObject(4);
enableObject(12);
playSound(46, 5);
playAnimation(606, 1);
setOns(0, 33);
loadScene(23, scene->getPosition());
playAnimation(605, 0);
dialog->show(47, scene, 0, 523, 0xd1, 0xe5, 0, 1);
} else {
uint16 d = dialog->pop(scene, 0xdada, 0, 523, 0xd1, 0xe5, 0, 1);
if (d == 0x1913) {
wait(100);
moveRel(0, 0, 3);
wait(50);
displayMessage(dsAddr_giveUpMsg); // "I give up"
wait(50);
}
}
break;
case 0x5ff3: // get duster
if (CHECK_FLAG(0xdb9a, 0)) {
dialog->pop(scene, 0xdaf6, 0, 523, 0xd1, 0xe5, 0, 1);
} else {
dialog->show(43, scene, 0, 523, 0xd1, 0xe5, 0, 1);
wait(50);
inventory->add(12);
disableObject(12);
setOns(0, 0);
playSound(5, 6);
playActorAnimation(541);
}
break;
case 0x603e:
if (CHECK_FLAG(0xdbb3, 1)) {
displayMessage(dsAddr_busyThinkingMsg); // "I'd better not interrupt it's thought process"
} else {
displayMessage(dsAddr_mirrorMirrorMsg); // "Mirror, Mirror on the wall...."
wait(150);
displayMessage(dsAddr_thinkTooLongMsg); // "Hey, don't think too long"
wait(150);
displayMessage(dsAddr_HintMaleMsg); // "A hint: Someone in this room, a male"
wait(150);
displayMessage(dsAddr_okWaitMsg); // "OK, take your time"
wait(150);
SET_FLAG(0xdbb3, 1);
}
break;
case 0x6205:
if (CHECK_FLAG(dsAddr_lightOnFlag, 1))
displayMessage(dsAddr_tooHeavyMsg); // "It's too heavy. Not that I'm wimp"
else
fnTooDark();
break;
case 0x6217:
if (CHECK_FLAG(dsAddr_lightOnFlag, 1))
displayMessage(dsAddr_noDentistsMsg); // "I don't want to have anything in common with dentists"
else
fnTooDark();
break;
case 0x62c1:
if (CHECK_FLAG(dsAddr_lightOnFlag, 1))
retVal = false;
else
fnTooDark();
break;
case 0x63bc:
playMusic(6);
loadScene(25, 151, 156, 2);
break;
case 0x63dc:
dialog->showMono(86, scene, 0, 0xd1, 0);
break;
case 0x646e:
case 0x6475:
dialog->showMono(85, scene, 0, 0xd1, 0);
break;
case 0x6479:
dialog->showMono(84, scene, 0, 0xd1, 0);
break;
case 0x6507:
if (CHECK_FLAG(0xdb96, 1))
rejectMessage();
else
displayMessage(dsAddr_birdAttackMsg); // "Hey You! Wake up! Bird attack!"
break;
case 0x65c3:
if (CHECK_FLAG(dsAddr_mouseHoleState, 1)) {
playActorAnimation(635);
setOns(5, 0);
playSound(63, 11);
playSound(15, 20);
playSound(32, 31);
playActorAnimation(636);
inventory->add(47);
inventory->add(48);
moveTo(scene->getPosition().x - 1, 139, 1, true);
displayMessage(dsAddr_yikesMsg); // "Yikes!"
SET_FLAG(dsAddr_mouseHoleState, 2);
SET_FLAG(0xdba8, 0);
} else
displayMessage(dsAddr_noSearchWarrantMsg); // "I don't have a search-warrant"
break;
case 0x7866:
if (CHECK_FLAG(0xdbdd, 3))
displayMessage(dsAddr_gotchaMsg); // "Gotcha"
else
retVal = false;
break;
case 0x7878:
{
byte v = res->dseg.get_byte(dsAddr_graffitiMsgId) + 1;
if (v <= 6)
SET_FLAG(dsAddr_graffitiMsgId, v);
switch (v) {
case 1:
displayMessage(dsAddr_SavingFineMsg); // "Saving is a very fine thing..."
break;
case 2:
displayMessage(dsAddr_loveCaptainMsg); // "I love captain"
break;
case 3:
displayMessage(dsAddr_soccerRulzMsg); // "Soccer rulz"
break;
case 4:
displayMessage(dsAddr_treeCutMsg); // "Don't cut the trees..."
break;
case 5:
displayMessage(dsAddr_visaAcceptedMsg); // "VISA Accepted"
break;
default:
displayMessage(dsAddr_otherGraffitiMsg); // "The rest of graffiti is obscene"
break;
}
}
break;
case 0x78a9:
if (CHECK_FLAG(dsAddr_captainDrawerState, 1))
displayMessage(dsAddr_nowOpenMsg); // "Now it's open"
else
retVal = false;
break;
case 0x78bb:
if (CHECK_FLAG(0xdbe8, 1))
displayMessage(dsAddr_yuckMsg); // "Yuck!"
else
retVal = false;
break;
case 0x78ce:
if (!CHECK_FLAG(0xdba1, 1))
displayMessage(dsAddr_monstersMsg); // "Who knows what monsters live in there"
else
retVal = false;
break;
case 0x792b: // left click on ann
moveTo(245, 198, 1);
if (!CHECK_FLAG(0xdbaf, 1)) {
dialog->showMono(50, scene, 0, 0xd1, 0);
SET_FLAG(0xdbaf, 1);
} else
retVal = false;
break;
case 0x79c3:
if (CHECK_FLAG(dsAddr_lightOnFlag, 1))
retVal = false;
else
fnTooDark();
break;
case 0x7b26: // cutting the fence
setOns(0, 0);
playSound(5, 2);
playSound(51, 11);
playSound(51, 23);
playActorAnimation(837);
playSound(51, 3);
playSound(51, 19);
playSound(23, 26);
playActorAnimation(838);
setOns(0, 0x60);
moveTo(281, scene->getPosition().y, 0, true);
disableObject(4);
SET_FLAG(0xdbe1, 1);
break;
case 0x7b89: // digging mysterious object
if (CHECK_FLAG(0xdbe1, 1)) {
playActorAnimation(844);
setOns(1, 0);
playSound(5, 5);
playSound(26, 19);
playSound(24, 25);
playActorAnimation(847);
playSound(5, 11);
playActorAnimation(848);
setOns(1, 0x64);
playActorAnimation(845);
disableObject(3);
inventory->add(0x52);
inventory->remove(0x51);
} else
displayMessage(dsAddr_fenceBlocksMsg); // "The fence blocks the way"
break;
case 0x7bfd:
playSound(76, 18);
playSound(76, 22);
playSound(76, 26);
playSound(76, 30);
playSound(76, 34);
playSound(76, 47);
playSound(76, 51);
playSound(76, 55);
playSound(76, 59);
playSound(76, 63);
playActorAnimation(873);
moveTo(240, 163, 4);
displayMessage(dsAddr_cmonBabyMsg); // "C'mon baby, it's all yours!"
waitLanAnimationFrame(1, 0x22);
playSound(77, 2);
playSound(77, 12);
playSound(77, 16);
playSound(77, 20);
playSound(77, 34);
playSound(78, 41);
playSound(78, 51);
playSound(56, 63);
playSound(24, 67);
playSound(23, 76);
setLan(1, 0);
playAnimation(874, 1);
setOns(0, 0x68);
inventory->remove(0x5b);
enableObject(6);
disableObject(1);
break;
case 0x7ce5: // put spring on the solid ground
playSound(5, 2);
playSound(19, 11);
playActorAnimation(840);
setOns(1, 0x61);
inventory->remove(0x50);
disableObject(2);
enableObject(7);
break;
case 0x7d1a: // captain's key + door
if (res->dseg.get_byte(0xdbdf) <= 1) {
playSound(5, 2);
playSound(57, 12);
playSound(70, 19);
playActorAnimation(828);
moveTo(262, 160, 1, true);
disableObject(4);
disableObject(3);
setOns(0, 0);
setOns(1, 85);
setOns(2, 0);
setOns(3, 0);
loadScene(5, scene->getPosition());
setOns(0, 92);
playAnimation(829, 1, true, true, true);
wait(200);
playAnimation(0, 1);
setOns(0, 0);
dialog->showMono(156, scene, 830, 0xd0, 1);
loadScene(7, 130, 195, 2);
playMusic(4);
setLan(1, 1);
wait(100);
dialog->show(157, scene, 0, 832, 0xd1, 0xec, 0, 1);
//playAnimation(831, 1);
SET_FLAG(0xdbdf, 2);
} else
displayMessage(dsAddr_nahMsg); // "Nah"
break;
case 0x7e02: // tickling the captain
if (CHECK_FLAG(0xdbe0, 1)) {
displayMessage(dsAddr_doesNotWorkMsg); // "That doesn't work"
} else {
playSound(5, 6);
playSound(27, 49);
playActorAnimation(834, true);
playAnimation(835, 1, true);
waitAnimation();
setOns(0, 94);
dialog->show(161, scene, 0, 832, 0xd1, 0xec, 0, 1);
enableObject(12);
SET_FLAG(0xdbe0, 1);
}
break;
case 0x7e4f: // giving magazine to captain
dialog->show(162, scene, 0, 856, 0xd1, 0xec, 0, 1);
playSound(5, 3);
playActorAnimation(852, true);
playActorAnimation(853, true);
displayMessage(dsAddr_whatAboutMsg); // "What about a new"
displayMessage(dsAddr_hotOffMsg); // "hot off the press"
displayMessage(dsAddr_fullColorMsg); // "full-color"
displayMessage(dsAddr_specialEdMsg); // "special edition"
displayMessage(dsAddr_soldierNewsMsg); // "of Soldier News?!"
playAnimation(856, 1);
playSound(5, 3);
//playActorAnimation(854);
dialog->show(163, scene, 0, 856, 0xd1, 0xec, 0, 1);
playAnimation(855, 1);
wait(200);
moveTo(30, 181, 0);
disableObject(1);
setLan(1, 0);
SET_FLAG(0xdbdf, 3);
SET_FLAG(0xdbf0, 1);
loadScene(8, 155, 199);
break;
case 0x7fbd: // using bird & bartender
playSound(5, 3);
playActorAnimation(876);
setOns(1, 0);
playSound(26, 7);
playSound(79, 15);
playAnimation(877, 1);
playAnimation(880, 1, true);
dialog->show(176, scene, 0, 857, 0xd1, 0xef, 0, 1);
setOns(2, 0x6a);
reloadLan();
playAnimation(878, 0);
//playAnimation(879, 0); // background bartender animation
inventory->remove(0x5c);
enableObject(1);
SET_FLAG(0xdbe7, 1);
break;
case 0x8047:
playSound(32, 5);
playSound(5, 17);
playSound(52, 23);
playActorAnimation(881);
setOns(2, 0x6b);
inventory->remove(0x56);
inventory->add(0x55);
SET_FLAG(0xdbe8, 1);
break;
case 0x808b:
if (CHECK_FLAG(0xdbda, 1)) {
displayMessage(dsAddr_gotPermissionMsg); // "I already got the permission"
} else {
displayMessage(dsAddr_showPapersMsg); // "Here are my papers"
playSound(5, 2);
playSound(5, 18);
playActorAnimation(810);
dialog->show(147, scene, 0, 809, 0xd1, 0xd0, 0, 1);
SET_FLAG(0xdbda, 1);
}
break;
case 0x80c3: // show kaleidoscope to the guard
dialog->show(165, scene, 0, 809, 0xd1, 0xd0, 0, 1);
playSound(5, 3);
playSound(5, 30);
playSound(26, 14);
hideActor();
playAnimation(849, 0);
showActor();
playAnimation(851, 0);
playAnimation(850, 0);
reloadLan();
inventory->add(0x53);
inventory->remove(0x52);
enableObject(1);
SET_FLAG(0xdbe2, 1);
break;
// Shore
case 0x5348:
if (CHECK_FLAG(0xdb99, 1)) { // got broken paddle from boat
displayMessage(dsAddr_boatEmptyMsg); // "There's nothing else in the boat"
} else {
SET_FLAG(0xdb99, 1);
playSound(57, 6);
playActorAnimation(536);
dialog->showMono(77, scene, 0, 0xd1, 0);
inventory->add(0x8);
}
break;
case 0x53a1:
if (CHECK_FLAG(0xdbb2, 1)) { // spoken to man in well
displayMessage(dsAddr_stillThereMsg); // "Are you still there?"
} else {
displayMessage(dsAddr_echoMsg); // "Echo!"
displayMessage(dsAddr_loudEchoMsg, 0xe5, 248, 164); // "ECHO!"
displayMessage(dsAddr_whoThereMsg); // "Who's there?!"
displayMessage(dsAddr_loudWhoThereMsg, 0xe5, 225, 164); // "WHO'S THERE?!"
displayMessage(dsAddr_dontCopyMsg); // "DON'T COPY ME!"
displayMessage(dsAddr_loudDontCopyMsg, 0xe5, 172, 164); // "DON'T COPY ME!!!"
displayMessage(dsAddr_throwRockMsg); // "OR I WILL THROW A ROCK DOWN THERE!"
displayMessage(dsAddr_orIWillMsg, 0xe5, 232, 164); // "OR I WILL"
wait(100);
displayMessage(dsAddr_loudEchoMsg, 0xe5, 248, 164);
SET_FLAG(0xdbb2, 1);
}
break;
case 0x5458:
{
setOns(2, 0);
playSound(34, 7);
playActorAnimation(535);
inventory->add(11);
disableObject(1);
byte *scene_15_ons = scene->getOns(15); // patch ons for the scene 15
scene_15_ons[0] = 0;
byte f = GET_FLAG(0xdb98) + 1;
SET_FLAG(0xdb98, f);
if (f >= 2) {
// disable object boat for scene 15!!
disableObject(1, 15);
}
}
break;
case 0x54b3:
{
setOns(1, 0);
setOns(3, 0);
playSound(33, 6);
playActorAnimation(534);
inventory->add(10);
disableObject(2);
setOns(1, 10);
setOns(1, 0, 15);
byte f = GET_FLAG(0xdb98) + 1;
SET_FLAG(0xdb98, f);
if (f >= 2) {
// disable object boat for scene 15!!
disableObject(1, 15);
}
}
break;
case 0x5502:
setOns(0, 0);
loadScene(15, 115, 180, 1);
playMusic(6);
playActorAnimation(568);
break;
case 0x5561: // Enter lakeside house
fnEgoDefaultPosition();
loadScene(19, 223, 199, 1);
break;
case 0x55a1:
fnEgoDefaultPosition();
rejectMessage();
break;
case csAddr_egoDefaultPosition:
fnEgoDefaultPosition();
break;
case 0x563b:
playSound(5, 10);
setOns(1, 0);
playActorAnimation(561);
inventory->add(26);
disableObject(6);
break;
case 0x56f6:
playSound(32, 7);
setOns(1, 0);
playActorAnimation(626);
disableObject(12);
inventory->add(45);
displayMessage(dsAddr_foundFoodMsg); // "People leave food in unbelievable places"
break;
case 0x5756: // Open car door
playSound(11, 4);
playActorAnimation(514);
setOns(4, 8);
setOns(2, 5);
enableObject(14);
enableObject(15);
enableObject(16);
disableObject(1);
break;
case 0x5805: // Enter basketball house
playSound(70, 6);
playActorAnimation(513);
loadScene(22, 51, 180, 2);
break;
case 0x5832: // Ring doorbell
playActorAnimation(509);
displayMessage(dsAddr_outOfOrderMsg); // "It's out of order"
break;
case 0x58a2:
dialog->pop(scene, 0xdaba, 0, 502, 0xd1, 0xe5, 0, 1);
scene->getObject(13)->setName((const char *)res->dseg.ptr(0x92e5));
break;
case 0x58b7: // Get comb from car
disableObject(14);
setOns(4, 0);
playSound(5, 7);
playActorAnimation(521);
setOns(4, 0);
inventory->add(0x6);
break;
case 0x58df: // Pull trunk lever in car
SET_FLAG(0xdb94, 1);
playSound(6, 1);
setOns(3, 6);
playActorAnimation(515);
break;
case 0x593e: // Enter annes house
playSound(89, 4);
playActorAnimation(980);
loadScene(23, 76, 199, 1);
if (CHECK_FLAG(0xdbee, 1))
playMusic(7);
break;
case 0x5994:
fnEnterCave();
break;
case csAddr_caveNOP:
break;
case csAddr_enterCave:
fnEnterCave();
break;
case 0x5a8b:
if (!CHECK_FLAG(0xdbad, 1)) {
playSound(43, 4); // grrrrrr
playSound(42, 15);
playSound(42, 17);
playSound(42, 19);
playAnimation(656, 0);
wait(50);
displayMessage(dsAddr_goodDoggyMsg); // "I understand. Good doggy"
} else if (!CHECK_FLAG(0xdba3, 1)) { // Dog has bone
playSound(28, 3);
playActorAnimation(596);
setOns(1, 30);
SET_FLAG(0xdba3, 1);
enableObject(8);
} else {
setOns(1, 0);
playSound(4, 4);
playActorAnimation(597);
SET_FLAG(0xdba3, 0);
disableObject(8);
displayMessage(dsAddr_wallShakenMsg); // "Wow! This must have shaken all the nearby walls!"
setOns(1, 32, 24);
enableObject(4, 24);
}
break;
case 0x5b3a: // Click on dog
dialog->popMark(scene, 0xdb14);
break;
case 0x5b59: // picking up the rope
dialog->showMark(70, scene);
wait(150);
dialog->showMark(71, scene);
moveRel(0, -12, 0);
playSound(34, 5);
playActorAnimation(607);
setOns(0, 0);
playActorAnimation(608);
playActorAnimation(609);
playActorAnimation(610);
playSound(5, 25);
playActorAnimation(611);
moveTo(16, scene->getPosition().y, 4, true);
inventory->add(38);
disableObject(12);
break;
case 0x5be1: // Talk to grandpa
dialog->pop(scene, 0xdac4, 0, 522, 0xd1, 0xd8, 0, 1);
break;
case 0x5bee:
playSound(89, 5);
playSound(67, 11);
playActorAnimation(982);
displayMessage(dsAddr_emptyMsg); // "It's Empty"
break;
case 0x5c0d: // grandpa - drawers
if (CHECK_FLAG(0xdba7, 1)) {
displayMessage(dsAddr_drawersEmptyMsg); // "There's nothing else in the drawers"
} else {
if (!CHECK_FLAG(0xdb92, 1))
dialog->show(24, scene, 0, 522, 0xd1, 0xd8, 0, 1);
playSound(66, 5);
playSound(67, 20);
playSound(5, 23);
playActorAnimation(631);
inventory->add(47);
SET_FLAG(0xdba7, 1);
}
break;
case 0x5c84:
if (CHECK_FLAG(0xdb92, 1)) {
inventory->add(2);
disableObject(7);
playSound(32, 7);
setOns(0, 0);
playActorAnimation(520);
} else {
dialog->pop(scene, 0xdace, 0, 522, 0xd1, 0xd8, 0, 1);
}
break;
case 0x5cf0:// Exit basketball house
playSound(88, 5);
playActorAnimation(981);
loadScene(20, 161, 165);
break;
case 0x5d24: // getting the fan
if (CHECK_FLAG(0xdb92, 1)) {
setLan(2, 0);
playSound(32, 7);
playActorAnimation(508);
disableObject(13);
inventory->add(7);
} else {
dialog->pop(scene, 0xdad4, 0, 522, 0xd1, 0xd8, 0, 1);
}
break;
case 0x5e4d: // right click on ann
if (!CHECK_FLAG(0xdb97, 0)) {
displayMessage(dsAddr_girlTalkMsg); // "I really don't know how to talk to girls"
} else {
moveTo(245, 198, 1);
dialog->show(51, scene, 0, 524, 0xd1, 0xe5, 0, 2);
//waitLanAnimationFrame(2, 1); // too long, about 200 frames! seems to be present in original game (sic)
SET_FLAG(0xdb97, 1);
for (byte i = 10; i <= 20; i += 2)
playSound(13, i);
playAnimation(528, 1);
wait(50);
playMusic(7);
SET_FLAG(0xdbee, 1);
for (byte i = 3; i <= 17; i += 2)
playSound(56, i);
playActorAnimation(525);
for (byte i = 1; i <= 13; i += 2)
playSound(56, i);
playSound(40, 15);
playSound(40, 18);
playSound(40, 22);
playActorAnimation(526);
playSound(54, 1);
playSound(55, 5);
playActorAnimation(527);
wait(50);
dialog->show(52, scene, 0, 524, 0xd1, 0xe5, 0, 2);
scene->getObject(2)->setName((const char *)res->dseg.ptr(0x9820));
}
break;
case 0x5f73: // exiting ann's house
if (CHECK_FLAG(0xdbee, 1))
playMusic(6);
loadScene(21, 99, 180, 3);
break;
case 0x5fba:
if (CHECK_FLAG(0xdbb1, 1)) {
displayMessage(dsAddr_noFruitMsg); // "There are no more interesting fruits here"
} else {
dialog->pop(scene, 0xdafc, 0, 523, 0xd1, 0xe5, 0, 1);
}
break;
case 0x607f:
fnEgoScaredBySpider();
break;
case 0x6083:
if (CHECK_FLAG(dsAddr_lightOnFlag, 1)) {
setOns(0, 0);
playSound(56, 10);
playActorAnimation(599);
inventory->add(37);
disableObject(2);
} else
fnEgoScaredBySpider();
break;
case csAddr_egoScaredBySpider:
fnEgoScaredBySpider();
break;
case csAddr_moveToLadderAndLeaveCellar:
fnMoveToLadderAndLeaveCellar();
break;
case csAddr_leaveCellar:
fnLeaveCellar();
break;
case 0x6176:
if (CHECK_FLAG(dsAddr_lightOnFlag, 1)) {
displayMessage(dsAddr_notInDarkMsg); // "I'm not going to wander here in the dark again"
} else {
playSound(71, 6);
playActorAnimation(598);
loadScene(24, scene->getPosition());
setOns(2, 0);
setLan(1, 0);
playAnimation(660, 0);
disableObject(1);
SET_FLAG(dsAddr_lightOnFlag, 1);
loadScene(24, scene->getPosition());
}
break;
case 0x61e9:
if (CHECK_FLAG(dsAddr_lightOnFlag, 1))
dialog->popMark(scene, 0xdb1e);
else
fnTooDark();
break;
case csAddr_TooDark:
displayMessage(dsAddr_TooDarkMsg); // "It's too dark to see clearly"
break;
case 0x6229: // shelves in cellar
if (CHECK_FLAG(dsAddr_lightOnFlag, 1)) {
Common::Point p = scene->getPosition();
byte v = GET_FLAG(0xdbb4);
switch (v) {
case 0:
displayMessage(dsAddr_whatGotMsg); // "Let's look what we've got here"
moveRel(-34, 0, 1);
displayMessage(dsAddr_strawberryJamMsg); // "Strawberry jam"
moveRel(20, 0, 1);
displayMessage(dsAddr_gooseberryJamMsg); // "Gooseberry jam"
moveRel(20, 0, 1);
displayMessage(dsAddr_blackberryJamMsg); // "Blackberry jam"
moveRel(20, 0, 1);
displayMessage(dsAddr_bilberryJamMsg); // "Bilberry jam"
moveTo(p, 3);
displayMessage(dsAddr_getMeOutJamMsg); // "Get me out of this jam!"
SET_FLAG(0xdbb4, 1);
break;
case 1:
displayMessage(dsAddr_rosemaryJamMsg); // "Oh, and there is Rosemary jam"
wait(100);
displayMessage(dsAddr_knowRosemaryMsg); // "I used to know someone called Rosemary"
SET_FLAG(0xdbb4, 2);
break;
default:
displayMessage(dsAddr_unwantedJamsMsg); // "I don't want those jams"
break;
}
} else
fnTooDark();
break;
case 0x6480: // dive mask
if (CHECK_FLAG(0xdb96, 1)) {
playSound(56, 7);
playSound(5, 15);
playActorAnimation(613);
setOns(3, 36);
inventory->add(39);
disableObject(5);
displayMessage(dsAddr_needSunglassesMsg); // "Sorry buddy, but I need your sunglasses"
} else
displayMessage(dsAddr_crowKillMsg); // "I'm sure these crows will kill me"
break;
case 0x64c4: // flippers
if (CHECK_FLAG(0xdb96, 1)) {
setOns(2, 35);
playSound(63, 8);
playSound(24, 10);
playActorAnimation(612);
inventory->add(40);
disableObject(6);
} else
displayMessage(dsAddr_crowKillMsg); // "I'm sure these crows will kill me"
break;
case 0x7907: // Describe car lever
if (CHECK_FLAG(0xdb94, 1)) { // Already pulled lever?
displayMessage(dsAddr_openBootMsg); // "It opens the boot"
} else
retVal = false;
break;
case 0x62d0: // Get bone from under rock
displayAsyncMessage(dsAddr_yeowMsg, 218, 96, 16, 24); // "YEEEOOOWWWW!"
playSound(26, 6);
playSound(26, 10);
playSound(24, 13);
playSound(46, 37);
setOns(0, 0);
playActorAnimation(594);
setOns(0, 29);
disableObject(1);
inventory->add(36);
playSound(5, 2);
playActorAnimation(595);
displayMessage(dsAddr_dinoBoneMsg); // "I really hope this is DINOSAUR bone"
break;
case 0x6351:
if (CHECK_FLAG(0xdaca, 1)) { // cave bush is cut down
playMusic(8);
loadScene(26, 319, 169, 4);
} else
displayMessage(dsAddr_ridBushMsg); // "I must get rid of this bush first"
break;
case 0x63ea:
playSound(5, 10);
setOns(0, 0);
playActorAnimation(640);
inventory->add(50);
disableObject(6);
break;
case 0x6411: // Kick hen
if (CHECK_FLAG(0xdb93, 1)) { // already kicked hen
displayMessage(dsAddr_ridFrustationsMsg); // "I'd already got rid of my frustrations"
} else {
SET_FLAG(0xdb93, 1);
displayMessage(dsAddr_henFlyMsg); // "I wonder if hens can fly. Come here, baby"
waitLanAnimationFrame(1, 87);
playSound(30, 26);
playSound(29, 49);
playActorAnimation(500, true);
playAnimation(501, 0, true);
waitAnimation();
setOns(0, 1);
enableObject(14);
displayMessage(dsAddr_firstTestFailMsg); // "First test failed"
}
break;
case 0x6592: // Rake
setOns(1, 0);
playSound(18, 10);
playActorAnimation(553);
inventory->add(0x15);
wait(50);
displayMessage(dsAddr_trousersMsg); // "Good I always asked mum for trousers with BIG pockets"
disableObject(11);
break;
case 0x66b5:
playSound(89, 5);
playActorAnimation(969);
loadScene(33, 319, 181, 4);
break;
case 0x6519: // Sickle
setOns(4, 0);
playSound(5, 11);
playActorAnimation(625);
inventory->add(0x2c);
disableObject(8);
break;
case 0x655b: // Get needle from haystack
if (CHECK_FLAG(0xdb9d, 1)) { // already have needle
displayMessage(dsAddr_dontPushLuckMsg); // "I don't think I should push my luck"
} else {
SET_FLAG(0xdb9d, 1);
playSound(49, 3);
playActorAnimation(548);
inventory->add(0x11);
displayMessage(dsAddr_needleHaystackMsg); // "And they say you can't find a needle in a haystack"
}
break;
case 0x663c: // Feather
setOns(0, 0);
playSound(5, 9);
playActorAnimation(511);
inventory->add(1);
disableObject(15);
break;
case 0x667c:
playSound(70, 4);
playActorAnimation(972);
loadScene(29, 160, 199, 1);
break;
case 0x66a9:
displayMessage(dsAddr_dontLeaveMansionMsg); // "I don't want to leave the mansion, I want blood!"
disableObject(4);
break;
case 0x66e2:
playSound(88, 4);
playActorAnimation(970);
loadScene(35, 160, 199, 1);
break;
case 0x70bb:
dialog->pop(scene, 0xdb24, 0, 709, 0xd1, 0xef, 0, 1);
break;
case 0x71ae:
if (CHECK_FLAG(0xdbcd, 1)) {
if (CHECK_FLAG(0xdbce, 1)) {
displayMessage(dsAddr_restUselessMsg); // "The rest is useless"
} else {
displayMessage(dsAddr_twoBatteriesMsg); // "Wow! Two 1.5V batteries!"
playSound(32, 6);
playActorAnimation(717);
inventory->add(66);
SET_FLAG(0xdbce, 1);
}
} else
dialog->showMark(97, scene);
break;
case 0x70c8:
if (fnIsCookGone()) {
moveTo(81, 160, 4);
displayMessage(dsAddr_cognacMsg); // "Pfui! The cognac really didn't do any good"
}
break;
case csAddr_isCookGone:
retVal = fnIsCookGone();
break;
case 0x70ef:
if (fnIsCookGone())
displayMessage(dsAddr_tooHotMsg); // "It's too hot to touch!"
break;
case 0x70f9:
if (inventory->has(68)) {
inventory->remove(68);
loadScene(29, 40, 176, 2);
displayMessage(dsAddr_paperBurntMsg); // "The paper burnt out completely!"
} else
loadScene(29, 40, 176, 2);
break;
case 0x712c:
if (fnIsCookGone()) {
if (CHECK_FLAG(0xdbcf, 1)) {
playSound(89, 4);
playActorAnimation(719);
setOns(4, 67);
++ *res->dseg.ptr(READ_LE_UINT16(res->dseg.ptr(dsAddr_sceneWalkboxTablePtr + (scene->getId() - 1) * 2)));
disableObject(5);
enableObject(12);
} else {
playSound(89, 4);
playSound(89, 4);
playSound(87, 45);
displayAsyncMessage(dsAddr_oneTakenMsg, 112, 108, 11, 35, 0xe5); // "This one's taken, OK?"
playActorAnimation(718);
wait(100);
displayMessage(dsAddr_slightMadMsg); // "It finally happened. I'm slightly mad"
SET_FLAG(0xdbcf, 1);
}
}
break;
case 0x71eb:
setOns(2, 0);
playSound(32, 7);
playActorAnimation(710);
inventory->add(62);
disableObject(7);
enableObject(8);
break;
case 0x7244:
if (fnIsCookGone())
displayMessage(dsAddr_neverLearntMsg); // "I never learnt to how use one"
break;
case 0x7255:
if (CHECK_FLAG(0xdbd0, 1)) {
setOns(4, 69);
playSound(32, 5);
playActorAnimation(725);
disableObject(12);
inventory->add(69);
} else {
playActorAnimation(721);
displayMessage(dsAddr_frozenShelfMsg); // "It has frozen hard onto the shelf!"
}
break;
case 0x721c:
setOns(3, 0);
playSound(32, 7);
playActorAnimation(715);
inventory->add(63);
disableObject(9);
break;
case 0x7336:
setOns(1, 0);
playSound(5, 42);
displayAsyncMessage(dsAddr_noDepraveMsg, 2, 102, 20, 38); // "Nah, I don't want to deprave the kids"
playActorAnimation(697);
inventory->add(56);
disableObject(1);
break;
case 0x7381:
playSound(5, 12);
playActorAnimation(704);
disableObject(2);
inventory->add(58);
break;
case 0x7408:
if (CHECK_FLAG(0xdbc4, 1)) {
displayMessage(dsAddr_noReadAgainMsg); // "I don't want to read it again. I might like it."
} else {
setOns(0, 0);
playSound(26, 17);
playSound(26, 23);
playSound(26, 30);
playSound(26, 37);
playSound(26, 43);
playSound(52, 34);
playActorAnimation(698);
setOns(0, 52);
setOns(2, 61);
dialog->showMark(92, scene);
enableObject(11);
SET_FLAG(0xdbc4, 1);
}
break;
case 0x7476:
if (CHECK_FLAG(0xdbc9, 1)) {
displayMessage(dsAddr_noSleepMsg); // "I don't want to sleep"
} else {
SET_FLAG(0xdbc9, 1);
dialog->showMark(94, scene);
playSound(61, 5);
playSound(5, 14);
playActorAnimation(705);
displayMessage(dsAddr_justCorkMsg); // "It's just a cork"
inventory->add(59);
}
break;
case 0x74d1:
setOns(2, 0);
playSound(5, 12);
playActorAnimation(699);
inventory->add(57);
disableObject(11);
break;
case 0x7513: // fatso + doctor: pre-final
if (CHECK_FLAG(0xdbd7, 1)) {
if (CHECK_FLAG(0xdbd8, 1)) {
playSound(88, 4);
playActorAnimation(979);
loadScene(37, 51, 183);
dialog->show(125, scene, 768, 769, 0xd9, 0xe5, 1, 2);
playAnimation(770, 0, true, true, true);
playAnimation(771, 1, true, true, true);
dialog->showMono(126, scene, 0, 0xd1, 0);
playAnimation(770, 0, true, true, true);
playAnimation(771, 1, true, true, true);
playSound(5, 3);
playSound(56, 12);
playSound(23, 20);
playSound(75, 25);
playActorAnimation(772);
playActorAnimation(773, true);
playAnimation(774, 0, true);
waitAnimation();
setOns(0, 74);
hideActor();
dialog->showMono(127, scene, 775, 0xd0, 1);
playAnimation(771, 1, true, true, true);
playAnimation(776, 0);
dialog->show(128, scene, 777, 778, 0xd0, 0xe5, 1, 2);
playAnimation(779, 0, true, true, true);
playAnimation(780, 1, true, true, true);
for (byte i = 1; i <= 6; ++i)
playSound(58, i);
playSound(58, 10);
playSound(2, 7);
playSound(55, 11);
playSound(54, 15);
playAnimation(781, 2, true);
playAnimation(782, 3, true);
waitAnimation();
setOns(1, 75);
setOns(2, 76);
for (byte i = 1; i <= 6; ++i)
playSound(58, i);
playSound(58, 9);
playSound(2, 7);
playSound(2, 15);
playSound(55, 10);
playAnimation(783, 2, true);
playAnimation(784, 3, true);
waitAnimation();
setOns(1, 77);
setOns(2, 78);
playAnimation(785, 2, true);
playAnimation(786, 3, true);
waitAnimation();
moveTo(112, 183, 2, true);
setOns(3, 79);
setOns(0, 0);
showActor();
playAnimation(0, 0);
playAnimation(787, 2, true);
playAnimation(788, 3, true);
waitAnimation();
playAnimation(0, 1);
playSound(32, 2);
playSound(24, 7);
playAnimation(790, 3, true);
playAnimation(789, 0, true);
waitAnimation();
setOns(0, 80);
playAnimation(792, 3, true, true, true);
dialog->show(129, scene, 0, 791, 0xd1, 0xd0, 0, 4);
playAnimation(792, 3, true, true, true);
moveTo(40, 171, 4);
setOns(3, 81, 35);
enableObject(12, 35);
playAnimation(0, 3);
loadScene(31, 298, 177, 4);
SET_FLAG(0xdbd9, 1);
} else
displayMessage(dsAddr_ventFirstMsg); // "I'd better stop this ventilator first"
} else
displayMessage(dsAddr_noSaladMsg); // "I don't want to turn myself into a salad"
break;
case 0x783d:
dialog->pop(scene, 0xdb36, 0, 797, 0xd1, 0xd0, 0, 1);
break;
case 0x7966:
if (CHECK_FLAG(dsAddr_lightOnFlag, 1))
retVal = false;
else
fnEgoScaredBySpider();
break;
case 0x7ad0:
case 0x7ad7:
retVal = !fnIsCookGone();
break;
case 0x7ab9:
if (CHECK_FLAG(0xdbb6, 1))
retVal = false;
else {
dialog->showMono(90, scene, 0, 0xd1, 0);
SET_FLAG(0xdbb6, 1);
}
break;
case 0x7ade:
if (CHECK_FLAG(0xdbcd, 1))
displayMessage(dsAddr_whatInsideMsg); // "I was always curious what's inside these things"
else
retVal = false;
break;
case 0x7f23: // Use grenade on captains drawer
if (CHECK_FLAG(0xdbdf, 3)) {
enableOn(false);
playSound(5, 3);
playSound(58, 11);
playSound(46, 56);
playSound(46, 85);
playSound(46, 117);
playActorAnimation(870);
playSound(54, 15);
playActorAnimation(871);
SET_FLAG(dsAddr_captainDrawerState, 1);
setOns(1, 0x66);
moveTo(224, 194, 0, true);
displayCutsceneMessage(dsAddr_cutsceneMsg1, 23, 95); // "sixty seven rude words later"
inventory->remove(0x59);
enableOn(true);
} else
displayMessage(dsAddr_captainWatchingMsg); // "with captain watching? Better not"
break;
case csAddr_egoSuspiciousPosition:
fnEgoSuspiciousPosition();
break;
case 0x509a:
fnEgoSuspiciousPosition();
setOns(1, 0);
playSound(5, 10);
playActorAnimation(543);
inventory->add(15);
disableObject(9);
break;
case 0x7802:
if (CHECK_FLAG(0xdbd7, 1)) {
if (CHECK_FLAG(0xdbd8, 1))
displayMessage(dsAddr_nahMsg); // "Nah"
else {
playSound(71, 4);
playActorAnimation(796);
setLan(1, 0);
SET_FLAG(0xdbd8, 1);
}
} else
displayMessage(dsAddr_noSaladMsg); // "I don't want to turn myself into a salad"
break;
case 0x78e0:
fnEgoSuspiciousPosition();
retVal = false;
break;
case 0x78e7:
case 0x78ee:
fnEgoDefaultPosition();
retVal = false;
break;
case 0x78f5:
if (CHECK_FLAG(0xdb95, 1)) {
displayMessage(dsAddr_bootEmptyMsg); // "There's nothing else in the boot"
} else
retVal = false;
break;
case 0x7919:
if (!CHECK_FLAG(0xdba5, 1))
retVal = false;
else
displayMessage(dsAddr_clothesDryMsg); // "The clothes are dry now."
break;
case 0x7950:
if (!CHECK_FLAG(0xdbb1, 1))
retVal = false;
else
displayMessage(dsAddr_nutRealMsg); // "Only the nut is real"
break;
case 0x7975:
if (CHECK_FLAG(dsAddr_lightOnFlag, 1))
retVal = false;
else
displayMessage(dsAddr_shutValveMsg); // "Shutting the valve shook the dirt from the wall..."
break;
case 0x7987:
case 0x7996:
case 0x79a5:
case 0x79b4:
if (CHECK_FLAG(dsAddr_lightOnFlag, 1))
retVal = false;
else
fnTooDark();
break;
case 0x79d2:
if (!CHECK_FLAG(0xdb9d, 1))
retVal = false;
else
displayMessage(dsAddr_ordinaryHaystackMsg); // "Just an ordinary hay stack. Now."
break;
case 0x7af0:
if (fnIsCookGone())
retVal = false;
break;
case 0x8117:
dialog->show(9, scene, 0, 529, 0xd1, 0xd9, 0, 1);
playSound(5, 2);
playSound(5, 44);
playAnimation(642, 0, true);
playActorAnimation(641, true);
waitAnimation();
dialog->show(10, scene, 0, 529, 0xd1, 0xd9, 0, 1);
wait(170);
dialog->show(11, scene, 0, 529, 0xd1, 0xd9, 0, 1);
moveRel(0, 1, 0);
wait(100);
dialog->show(12, scene, 0, 529, 0xd1, 0xd9, 0, 1);
inventory->remove(50);
fnMansionIntrusionAttempt();
break;
case 0x8174:
setOns(0, 0);
playSound(5, 2);
playSound(5, 5);
playSound(5, 9);
playSound(14, 19);
playSound(5, 50);
playActorAnimation(542);
setOns(1, 15);
disableObject(3);
enableObject(9);
break;
case 0x81c2:
playSound(56, 11);
playSound(36, 13);
playSound(48, 22);
playSound(56, 57);
playSound(36, 59);
playSound(48, 68);
playSound(54, 120);
playSound(56, 141);
playSound(56, 144);
playSound(56, 147);
playAnimation(589, 1, true);
playActorAnimation(588, true);
waitAnimation();
wait(50);
displayMessage(dsAddr_itsGoneMsg); // "At least it's gone"
inventory->remove(34);
SET_FLAG(0xdba1, 1);
break;
case 0x823d: // grappling hook on the wall
playSound(5, 3);
for (byte i = 16; i <= 28; i += 2)
playSound(65, i);
playSound(47, 33);
playActorAnimation(620);
for (byte i = 3; i <= 18; i += 3)
playSound(56, i);
displayAsyncMessage(dsAddr_heyLetGoMsg, 38, 12, 20, 37, 0xd9); // "Hey, let go, will ya?!"
playActorAnimation(621, true);
playAnimation(623, 1, true);
waitAnimation();
displayAsyncMessage(dsAddr_aaahhhMsg, 30, 12, 1, 9, 0xd9); // "Aaaaaaaaaaaaahhh!"
playSound(35, 1);
playActorAnimation(622, true);
playAnimation(624, 0, true);
waitAnimation();
wait(150);
displayMessage(dsAddr_oopsMsg); // "Oops"
inventory->remove(43);
fnMansionIntrusionAttempt();
break;
case 0x8312: // hedgehog + plastic apple
dialog->showMark(76, scene);
setLan(1, 0);
playSound(5, 24);
playSound(26, 32);
playSound(5, 42);
playSound(15, 77);
playSound(15, 79);
playSound(15, 82);
playSound(22, 91);
playSound(22, 102);
playSound(26, 114);
playSound(24, 124);
waitLanAnimationFrame(1, 0x1a);
playActorAnimation(562, true);
playAnimation(563, 1, true);
waitAnimation();
disableObject(6);
displayMessage(dsAddr_lifeIsBrutalMsg); // "Life is brutal"
inventory->remove(27);
inventory->add(28);
break;
case 0x839f:
inventory->remove(32);
playSound(37, 14);
playSound(16, 17);
playActorAnimation(564, true);
playAnimation(565, 2, true);
waitAnimation();
setOns(0, 24);
playSound(39, 5);
playActorAnimation(582);
moveTo(63, 195, 1);
playAnimation(571, 1);
playAnimation(572, 1);
playAnimation(573, 1);
for (byte i = 1; i <= 7; i += 2)
playSound(40, i);
playAnimation(574, 1);
setLan(1, 0);
playAnimation(575, 1);
playAnimation(576, 1);
playAnimation(577, 1);
playAnimation(578, 1);
playAnimation(579, 1);
playAnimation(580, 1);
playSound(55, 18);
playAnimation(581, 1);
disableObject(2);
SET_FLAG(0xdb9f, 1);
break;
case 0x84c7: // using paddle on boat
playSound(20, 9);
playActorAnimation(530);
loadScene(16, 236, 95, 1);
playMusic(9);
playActorAnimation(531);
playSound(36, 4);
playActorAnimation(532);
playActorAnimation(533);
setOns(0, 9);
moveTo(236, 95, 1, true);
break;
case 0x8538: // Sharpen sickle on well
moveTo(236, 190, 0);
setOns(2, 0);
// TODO: Remove handle sprite
playSound(5, 4);
playSound(14, 14);
playSound(14, 33);
playSound(5, 43);
playActorAnimation(643);
setOns(2, 43);
moveTo(236, 179, 3);
inventory->remove(0x2c);
inventory->add(0x2e);
break;
case 0x85eb:
if (CHECK_FLAG(0xdbb0, 1)) {
enableObject(6);
playSound(25, 10);
playSound(25, 14);
playSound(25, 18);
playActorAnimation(559);
setOns(1, 23);
SET_FLAG(0xdbb0, 2);
} else
displayMessage(dsAddr_dontWorkPurposeMsg); // "I usually don't work without a purpose"
break;
case 0x863d:
playSound(12, 4);
playSound(50, 20);
playSound(50, 29);
playActorAnimation(554);
inventory->remove(19);
inventory->add(22);
break;
case 0x8665:
playSound(5, 3);
for (byte i = 12; i <= 24; i += 2)
playSound(56, i);
playActorAnimation(567);
inventory->remove(12);
inventory->add(33);
break;
case 0x862c:
if (CHECK_FLAG(0xdbb0, 1))
displayMessage(dsAddr_nutRakeMsg); // "It's pointless, the nut will slip between the rake's teeth"
else
displayMessage(dsAddr_objErrorMsg); // "That's no good"
break;
case 0x86a9: // correcting height of the pole with spanner
if (CHECK_FLAG(0xdb92, 1)) {
displayMessage(dsAddr_noNeedMsg); // "No need to do it again"
} else {
SET_FLAG(0xdb92, 1);
dialog->show(17, scene, 0, 502, 0xd0, 0xe5, 0, 1);
waitLanAnimationFrame(1, 7);
playSound(5, 16);
playSound(1, 25);
playSound(1, 29);
playSound(1, 34);
playAnimation(506, 0, true);
playActorAnimation(504, true);
waitAnimation();
setOns(0, 0);
playSound(24, 2);
playSound(22, 24);
playSound(1, 28);
playSound(1, 32);
playSound(1, 37);
playSound(5, 43);
playSound(61, 70);
playSound(61, 91);
displayAsyncMessage(dsAddr_ConfusionMsg, 77, 90, 6, 17); // "!?&!"
playActorAnimation(505, true);
playAnimation(507, 0, true);
waitAnimation();
setOns(0, 4);
{
Object *obj = scene->getObject(3);
obj->rect.top += 20;
obj->rect.bottom += 20;
obj->rect.save();
}
playSound(10, 3);
playAnimation(503, 0);
setLan(1, 0, 22);
disableObject(1, 22);
disableObject(13, 20);
setLan(1, 0);
disableObject(1);
disableObject(2);
disableObject(14);
disableObject(15);
disableObject(16);
moveTo(162, 164, 2);
displayMessage(dsAddr_grandpaPromiseMsg, 0xe5, 70, 76); // "But grandpa, you promised!"
displayMessage(dsAddr_ohLetsGoMsg, 0xd8, 90, 76); // "Oh all right. Let's go"
moveTo(162, 191, 2);
setOns(1, 0);
setOns(2, 0);
setOns(3, 0);
setOns(4, 0);
{
Walkbox *w = scene->getWalkbox(0);
w->rect.clear();
w->save();
}
playSound(62, 1);
playSound(9, 8);
setLan(1, 0);
playAnimation(512, 0);
wait(100);
displayMessage(dsAddr_byeMsg); // "Bye."
{
Object *obj = scene->getObject(7);
obj->actor_rect.left = obj->actor_rect.right = 228;
obj->actor_rect.top = obj->actor_rect.bottom = 171;
obj->actor_rect.save();
}
{
Object *obj = scene->getObject(8);
obj->actor_rect.left = obj->actor_rect.right = 290;
obj->actor_rect.top = obj->actor_rect.bottom = 171;
obj->actor_rect.save();
}
}
break;
case 0x88c9: // give flower to old lady
if (CHECK_FLAG(0xdb9a, 1))
fnGiveAnotherFlowerToOldLady();
else {
inventory->remove(10);
SET_FLAG(0xdb9a, 1);
fnGivingFlowerToOldLady();
}
break;
case csAddr_givingFlowerToOldLady:
fnGivingFlowerToOldLady();
break;
case csAddr_giveAnotherFlowerToOldLady:
fnGiveAnotherFlowerToOldLady();
break;
case 0x8918: // give flower to old lady
if (CHECK_FLAG(0xdb9a, 1))
fnGiveAnotherFlowerToOldLady();
else {
inventory->remove(11);
SET_FLAG(0xdb9a, 1);
fnGivingFlowerToOldLady();
}
break;
case 0x892d:
if (CHECK_FLAG(0xdb9b, 1))
fnGiveAnotherFlowerToAnne();
else {
fnGivingFlowerToAnne();
inventory->remove(10);
SET_FLAG(0xdb9b, 1);
}
break;
case csAddr_givingFlowerToAnne:
fnGivingFlowerToAnne();
break;
case csAddr_giveAnotherFlowerToAnne:
fnGiveAnotherFlowerToAnne();
break;
case 0x89b7:
if (CHECK_FLAG(0xdb9b, 1))
fnGiveAnotherFlowerToAnne();
else {
fnGivingFlowerToAnne();
inventory->remove(11);
SET_FLAG(0xdb9b, 1);
}
break;
case 0x89cc:
inventory->remove(23);
playSound(5, 6);
dialog->show(60, scene, 0, 524, 0xd1, 0xe5, 0, 2);
playActorAnimation(555, true);
playAnimation(556, 1, true);
waitAnimation();
playActorAnimation(557, true);
playAnimation(558, 1, true);
waitAnimation();
dialog->show(62, scene, 0, 524, 0xd1, 0xe5, 0, 2);
inventory->add(24);
break;
case 0x8a22:
playSound(45, 16);
playActorAnimation(560);
inventory->remove(26);
inventory->add(27);
wait(50);
dialog->show(44, scene, 0, 523, 0xd1, 0xe5, 0, 1);
dialog->show(45, scene, 0, 523, 0xd1, 0xe5, 0, 1);
SET_FLAG(0xdbb1, 1);
break;
case 0x8a6f: // banknote + ann
if (CHECK_FLAG(0xdbb5, 1)) {
dialog->show(63, scene, 0, 524, 0xd1, 0xe5, 0, 2);
playSound(5, 3);
playSound(5, 20);
playAnimation(671, 1, true);
playActorAnimation(670, true);
waitAnimation();
//playAnimation(672, 1);
dialog->show(64, scene, 524, 672, 0xd1, 0xe5, 0, 2);
//playAnimation(672, 1);
playSound(83, 12);
displayAsyncMessage(dsAddr_hundredBucksMsg, 204, 114, 23, 38, 0xe5); // "A hundred bucks!!!"
playActorAnimation(673);
loadScene(11, scene->getPosition());
playSound(24, 31);
playSound(24, 48);
playSound(79, 50);
playActorAnimation(674, true);
playAnimation(675, 0, true);
waitAnimation();
loadScene(28, 0, 167, 2);
playMusic(10);
moveTo(66, 167, 2);
displayMessage(dsAddr_wantBloodMsg); // "I want Blood!"
inventory->clear();
inventory->add(29);
} else
displayMessage(dsAddr_showHerMoneyMsg); // "If I just show her the money, she might take it"
break;
case 0x8b82: // use fan on laundry
setOns(0, 0);
playSound(5, 3);
playSound(5, 6);
playSound(5, 10);
playSound(92, 20);
playSound(92, 38);
playSound(92, 58);
displayAsyncMessage(dsAddr_yawnMsg, 30, 114, 58, 67); // "(yawn)"
playActorAnimation(602);
playSound(5, 3);
playActorAnimation(603);
setOns(0, 27);
SET_FLAG(0xdba5, 1);
break;
case 0x8bfc: // Give bone to dog
displayMessage(dsAddr_hereBoyMsg); // "Here, boy"
playSound(5, 3);
playSound(26, 13);
playActorAnimation(657, true);
playAnimation(658, 0, true);
waitAnimation();
reloadLan();
playAnimation(659, 0);
inventory->remove(36);
SET_FLAG(0xdbad, 1);
{
Object *o = scene->getObject(7);
o->actor_rect.left = o->actor_rect.right = 297;
o->actor_rect.top = o->actor_rect.bottom = 181;
o->actor_orientation = 1;
o->save();
}
{
Object *o = scene->getObject(9);
o->actor_rect.left = o->actor_rect.right = 297;
o->actor_rect.top = o->actor_rect.bottom = 181;
o->actor_orientation = 1;
o->save();
}
{
Walkbox *w = scene->getWalkbox(0);
w->rect.right = 266;
w->rect.bottom = 193;
w->save();
}
wait(100);
displayMessage(dsAddr_friendsNowMsg); // "I hope we're friends now"
break;
case 0x8c6e: // Use car jack on rock
playSound(5, 3);
playSound(26, 13);
playSound(24, 22);
playActorAnimation(592);
playSound(1, 5);
playSound(1, 9);
playSound(1, 13);
setOns(0, 0);
playActorAnimation(593);
setOns(0, 28);
enableObject(1);
inventory->remove(35);
break;
case 0x8cc8: // Cut bush with sickle
playSound(5, 3);
playActorAnimation(644);
setOns(1, 45);
playSound(56, 2);
playSound(26, 4);
playActorAnimation(645);
playSound(56, 1);
playSound(56, 6);
playSound(26, 3);
playSound(26, 8);
playActorAnimation(646);
playSound(5, 21);
playActorAnimation(647);
SET_FLAG(0xdaca, 1);
inventory->remove(0x2e);
disableObject(2);
scene->getObject(3)->actor_rect.right = 156;
scene->getObject(3)->save();
break;
case csAddr_mouseOutOfHoleTimeout: // mouse falls back from the hole (cave)
if (CHECK_FLAG(0x0000, 1)) {
inventory->add(48);
playSound(24, 26);
playActorAnimation(650, true);
playAnimation(651, 2, true);
waitAnimation();
} else {
playSound(27, 5);
setOns(1, 0);
playActorAnimation(652);
playSound(24, 4);
playSound(5, 12);
moveTo(186, 179, 1, true);
playActorAnimation(653);
playActorAnimation(654, true);
playAnimation(655, 2, true);
waitAnimation();
displayMessage(dsAddr_mouseGoneMsg); // "The mouse has gone!"
inventory->add(49);
setLan(2, 4, 27);
enableObject(4, 27);
SET_FLAG(dsAddr_mouseHoleState, 0);
}
SET_FLAG(0x0000, 0);
break;
case csAddr_putRockInHole:
fnPutRockInHole();
break;
case 0x8f1d:
dialog->showMark(72, scene);
for (uint i = 16; i <= 30; i += 2)
playSound(56, i);
playSound(2, 64);
playSound(3, 74);
displayAsyncMessage(dsAddr_lastChanceMsg, 212, 80, 35, 50); // "Last chance?"
playActorAnimation(516, true);
playAnimation(517, 2, true);
playAnimation(518, 3, true);
waitAnimation();
setLan(3, 0);
setLan(4, 0);
disableObject(2);
disableObject(3);
inventory->remove(2);
SET_FLAG(0xdb96, 1);
break;
case 0x8fc8:
displayMessage(dsAddr_comeHereMsg); // "Come here, I've got something for you"
waitLanAnimationFrame(2, 4);
playSound(5, 3);
playActorAnimation(627, true);
playAnimation(629, 1, true);
waitAnimation();
playSound(41, 10);
playSound(41, 47);
playSound(55, 52);
if (CHECK_FLAG(0xdba8, 1)) {
setLan(2, 0);
playActorAnimation(628, true);
playAnimation(634, 1, true);
waitAnimation();
disableObject(4);
displayMessage(dsAddr_trappedMouseMsg); // "The mouse is trapped!"
SET_FLAG(dsAddr_mouseHoleState, 1);
} else {
playActorAnimation(628, true);
playAnimation(630, 1, true);
waitAnimation();
displayMessage(dsAddr_cantCatchMsg); // "I can't catch it!"
}
break;
case 0x9054: // mouse hole
if (CHECK_FLAG(dsAddr_mouseGotGoldNuggetFlag, 1)) {
displayMessage(dsAddr_nonsenseMsg); // "Nonsense"
} else {
playSound(5, 11);
playSound(49, 21);
playActorAnimation(632);
setOns(5, 40);
moveTo(239, 139, 0, true);
playActorAnimation(633);
SET_FLAG(0xdba8, 1);
inventory->remove(47);
if (!CHECK_FLAG(dsAddr_mouseNerveMsgSaidFlag, 1)) {
SET_FLAG(dsAddr_mouseNerveMsgSaidFlag, 1);
displayMessage(dsAddr_mouseNerveMsg); // "Boy, this mouse has some nerve!"
}
}
break;
case 0x933d:
if (fnIsCookGone()) {
if (CHECK_FLAG(0xdbcd, 1))
displayMessage(dsAddr_breakFlattenMsg); // "I wanted to break it, not to flatten it!"
else {
setOns(1, 0);
playSound(5, 3);
playSound(5, 33);
playSound(24, 13);
playSound(24, 19);
playSound(24, 23);
playSound(24, 26);
playSound(24, 29);
playSound(23, 21);
playSound(74, 25);
playActorAnimation(716);
setOns(1, 66);
SET_FLAG(0xdbcd, 1);
}
}
break;
case 0x93af: // sheet + hot plate
if (fnIsCookGone()) {
playSound(5, 3);
playSound(86, 11);
playActorAnimation(720);
inventory->add(68);
inventory->remove(55);
}
break;
case 0x93d5: // burning sheet + plate
setOns(4, 0);
playSound(87, 7);
playActorAnimation(722);
playSound(5, 3);
playSound(88, 12);
playSound(87, 24);
playActorAnimation(723);
displayMessage(dsAddr_burnBabyMsg); // "Burn, baby, burn!"
wait(100);
playSound(89, 4);
playActorAnimation(724);
setOns(4, 68);
displayMessage(dsAddr_voilaMsg); // "Voila"
inventory->remove(68);
SET_FLAG(0xdbd0, 1);
break;
case 0x98fa: // Right click to open toolbox
inventory->remove(3);
inventory->add(4);
inventory->add(35);
inventory->activate(false);
inventory->resetSelectedObject();
displayMessage(dsAddr_carJackMsg); // "Wow! There's a car jack inside! Great!"
break;
case 0x9910:
inventory->remove(4);
inventory->add(5);
inventory->activate(false);
inventory->resetSelectedObject();
displayMessage(dsAddr_spannerMsg); // "There's something else inside the toolbox! A spanner!"
break;
case 0x671d: // very last part of the game
moveTo(153, 163, 4);
playActorAnimation(973);
if (CHECK_FLAG(0xdbc1, 0)) {
SET_FLAG(0xdbc1, _rnd.getRandomNumber(5) + 1);
}
loadScene(30, 18, 159, 2);
break;
case 0x67a6:
loadScene(29, 149, 163, 1);
playActorAnimation(974);
moveTo(160, 188, 0);
break;
case 0x6805:
fnEgoBottomRightTurn();
playSound(32, 12);
playActorAnimation(694);
playSound(15, 8);
playAnimation(693, 0);
setOns(6, 0);
displayMessage(dsAddr_fullAutomaticMsg); // "Fully Automatic"
inventory->add(54);
disableObject(4);
break;
case csAddr_egoBottomRightTurn:
fnEgoBottomRightTurn();
break;
case 0x687a: // using the book
if (CHECK_FLAG(0xdbc2, 1)) {
displayMessage(dsAddr_dontMessMsg); // "I don't need to mess with it anymore"
} else {
playSound(49, 5);
playSound(49, 17);
playActorAnimation(691);
if (!fnCheckingDrawers()) {
if (!CHECK_FLAG(0xdbc0, 1)) {
displayMessage(dsAddr_bookHeldMsg); // "Something's got hold of the book!"
SET_FLAG(0xdbc0, 1);
}
} else {
playSound(15, 8); // secret compartment
playAnimation(692, 0);
setOns(6, 59);
enableObject(4);
displayMessage(dsAddr_secretCompartmentMsg); // "Wow! A secret compartment!"
SET_FLAG(0xdbc2, 1);
}
}
break;
case csAddr_checkingDrawers:
fnCheckingDrawers();
break;
case 0x6918:
if (inventory->has(55))
displayMessage(dsAddr_noMoreSheetsMsg); // "Right now I don't need any more sheets"
else {
if (!CHECK_FLAG(0xdbc3, 1)) {
playActorAnimation(695);
dialog->showMark(91, scene);
SET_FLAG(0xdbc3, 1);
}
playSound(5, 11);
playActorAnimation(696);
inventory->add(55);
}
break;
case 0x6962:
if (CHECK_FLAG(0xdbb7, 1)) {
setOns(0, 0);
playSound(67, 4);
playActorAnimation(678);
SET_FLAG(0xdbb7, 0);
} else if (CHECK_FLAG(0xdbb8, 1)) {
fnDrawerOpenMessage();
} else {
playSound(66, 4);
playActorAnimation(677);
setOns(0, 53);
SET_FLAG(0xdbb7, 1);
}
break;
case 0x69b8:
if (CHECK_FLAG(0xdbb8, 1)) {
setOns(1, 0);
playSound(67, 4);
playActorAnimation(680);
SET_FLAG(0xdbb8, 0);
} else if (CHECK_FLAG(0xdbb7, 1)) {
fnDrawerOpenMessage();
} else if (CHECK_FLAG(0xdbb9, 1)) {
fnDrawerOpenMessage();
} else {
playSound(66, 5);
playActorAnimation(679);
setOns(1, 54);
SET_FLAG(0xdbb8, 1);
}
break;
case 0x6a1b:
if (CHECK_FLAG(0xdbb9, 1)) {
setOns(2, 0);
playSound(67, 5);
playActorAnimation(682);
SET_FLAG(0xdbb9, 0);
} else if (CHECK_FLAG(0xdbb8, 1)) {
fnDrawerOpenMessage();
} else {
playSound(67, 5);
playActorAnimation(681);
setOns(2, 55);
SET_FLAG(0xdbb9, 1);
}
break;
case 0x6a73:
if (CHECK_FLAG(0xdbba, 1)) {
setOns(3, 0);
playSound(67, 4);
playActorAnimation(684);
SET_FLAG(0xdbba, 0);
} else if (!CHECK_FLAG(0xdbbb, 1)) {
playSound(66, 4);
playActorAnimation(683);
setOns(3, 56);
SET_FLAG(0xdbba, 1);
} else
fnDrawerOpenMessage();
break;
case 0x6acb:
if (CHECK_FLAG(0xdbbb, 1)) {
setOns(4, 0);
playSound(67, 4);
playActorAnimation(686);
SET_FLAG(0xdbbb, 0);
} else if (CHECK_FLAG(0xdbba, 1)) {
fnDrawerOpenMessage();
} else if (CHECK_FLAG(0xdbbc, 1)) {
fnDrawerOpenMessage();
} else {
playSound(66, 5);
playActorAnimation(685);
setOns(4, 57);
SET_FLAG(0xdbbb, 1);
}
break;
case 0x6b2e:
if (CHECK_FLAG(0xdbbc, 1)) {
setOns(5, 0);
playSound(67, 5);
playActorAnimation(688);
SET_FLAG(0xdbbc, 0);
} else if (CHECK_FLAG(0xdbbb, 1)) {
fnDrawerOpenMessage();
} else {
playSound(66, 6);
playActorAnimation(687);
setOns(5, 58);
SET_FLAG(0xdbbc, 1);
}
break;
case csAddr_DrawerOpenMessage:
fnDrawerOpenMessage();
break;
case 0x6be1: // handle to the bathroom
if (CHECK_FLAG(0xdbd9, 1))
displayMessage(dsAddr_catchJohnFirstMsg); // "I'd better catch John Noty first"
else {
playSound(88, 4);
playActorAnimation(808);
loadScene(36, 41, 195, 2);
}
break;
case 0x6bad:
playSound(80, 4);
playActorAnimation(971);
loadScene(32, 139, 199, 1);
break;
case 0x6c45:
playSound(89, 6);
playActorAnimation(CHECK_FLAG(0xdbef, 1) ? 985 : 806);
loadScene(34, 40, 133, 2);
break;
case 0x6c83:
waitLanAnimationFrame(1, 1);
dialog->pop(scene, 0xdb2e, 0, 727, 0xd1, 0xef, 0, 1);
scene->getObject(1)->setName((const char *)res->dseg.ptr(0xaa94));
SET_FLAG(0xdbd1, 1);
break;
case 0x6c9d: // getting jar
setOns(0, 71);
playSound(32, 5);
playActorAnimation(732);
disableObject(2);
inventory->add(72);
break;
case 0x6cc4: // secret diary
playActorAnimation(754);
hideActor();
displayCutsceneMessage(dsAddr_cutsceneMsg0, 30, 95); // "A secret diary of ..."
playMusic(3);
loadScene(11, scene->getPosition());
playAnimation(750, 2);
dialog->show(117, scene, 751, 529, 0xe5, 0xd9, 2, 1);
playAnimation(752, 0, true);
playAnimation(753, 1, true);
waitAnimation();
dialog->show(118, scene, 529, 751, 0xd9, 0xe5, 1, 2);
loadScene(30, scene->getPosition());
dialog->show(108, scene, 733, 734, 0xe5, 0xd0, 2, 3);
playSound(75, 13);
playSound(32, 22);
playAnimation(735, 1, true);
playAnimation(736, 2, true);
waitAnimation();
dialog->show(109, scene, 737, 738, 0xd0, 0xe5, 3, 2);
playSound(32, 1);
playAnimation(739, 1, true);
playAnimation(740, 2, true);
waitAnimation();
dialog->show(110, scene, 733, 734, 0xe5, 0xd0, 2, 3);
playAnimation(742, 1, true);
playAnimation(741, 2, true);
waitAnimation();
dialog->show(111, scene, 743, 733, 0xd0, 0xe5, 3, 2);
playAnimation(744, 1, true);
playAnimation(745, 2, true);
waitAnimation();
dialog->show(112, scene, 734, 733, 0xd0, 0xe5, 3, 2);
playAnimation(746, 1, true);
playAnimation(747, 2, true);
waitAnimation();
dialog->show(113, scene, 734, 734, 0xd0, 0xd0, 3, 3);
dialog->show(114, scene, 748, 748, 0xd0, 0xd0, 3, 3);
dialog->show(115, scene, 749, 749, 0xd0, 0xd0, 3, 3);
dialog->show(116, scene, 748, 748, 0xd0, 0xd0, 3, 3);
playMusic(10);
loadScene(32, scene->getPosition());
showActor();
playSound(26, 10);
playActorAnimation(755);
moveRel(0, 0, 3);
dialog->show(119, scene, 0, 0, 0xd1, 0xd1, 0, 0);
hideActor();
loadScene(31, scene->getPosition());
dialog->show(123, scene, 763, 764, 0xd9, 0xd0, 1, 2);
loadScene(32, scene->getPosition());
showActor();
dialog->show(120, scene, 0, 0, 0xd1, 0xd1, 0, 0);
disableObject(3);
enableObject(7);
SET_FLAG(0xdbd5, 1);
break;
case 0x6f20:
if (CHECK_FLAG(0xdbd5, 1))
displayMessage(dsAddr_cantHideMsg); // "I can't hide here!"
else
rejectMessage();
break;
case 0x6f75: // hiding in left corner
moveRel(0, 0, 3);
playActorAnimation(756);
hideActor();
playAnimation(758, 1);
dialog->show(121, scene, 759, 759, 0xd0, 0xd0, 2, 2);
playSound(40, 5);
playSound(52, 13);
playSound(52, 17);
playSound(52, 21);
playAnimation(760, 1);
setOns(1, 72);
setOns(2, 73);
loadScene(31, scene->getPosition());
playSound(58, 5);
playSound(58, 8);
playSound(58, 10);
playSound(58, 12);
playSound(58, 14);
playAnimation(765, 1);
dialog->show(124, scene, 766, 766, 0xd9, 0xd9, 1, 1);
loadScene(32, scene->getPosition());
dialog->show(122, scene, 761, 761, 0xd0, 0xd0, 2, 2);
playAnimation(762, 1);
setOns(2, 0);
showActor();
playActorAnimation(757);
moveRel(0, 0, 1);
displayMessage(dsAddr_wasCloseMsg); // "That was close"
enableObject(8);
disableObject(7);
SET_FLAG(0xdbd5, 0);
break;
case 0x6f4d:
if (CHECK_FLAG(0xdbd5, 1))
displayMessage(dsAddr_johnOutsideMsg); // "There's John Noty outside! I can't go out!"
else
loadScene(31, 139, 172, 3);
break;
case 0x6f32:
if (CHECK_FLAG(0xdbd5, 1)) {
displayMessage(dsAddr_cantHideMsg); // "I can't hide here!"
} else {
playActorAnimation(977);
displayMessage(dsAddr_lockedMsg); // "It's Locked!"
}
break;
case 0x7096:
playSound(32, 5);
playActorAnimation(767);
setOns(1, 0);
inventory->add(73);
disableObject(8);
break;
case 0x7291:
playSound(89, 3);
playActorAnimation(975);
loadScene(31, 298, 177, 4);
break;
case 0x72c2:
if (CHECK_FLAG(0xdbd6, 2)) {
displayMessage(dsAddr_enoughWaterMsg); // "There's enough water in the sink"
} else {
playSound(79, 6);
playSound(84, 9);
playActorAnimation(801);
wait(50);
if (CHECK_FLAG(0xdbd6, 1)) {
displayMessage(dsAddr_sinkFullMsg); // "The sink is full of hot water"
SET_FLAG(0xdbd6, 2);
} else
displayMessage(dsAddr_waterHotMsg); // "The water looks very hot"
}
break;
case 0x7309:
playSound(66, 5);
playSound(67, 11);
playActorAnimation(976);
displayMessage(dsAddr_emptyMsg); // "It's Empty"
break;
case 0x77d5:
if (CHECK_FLAG(0xdbd7, 1) && !CHECK_FLAG(0xdbd8, 1)) { // disallow exiting through the first door until switch turned on, not present in original game
displayMessage(dsAddr_noSaladMsg); // "I don't want to turn myself into a salad"
} else {
playSound(89, 6);
playActorAnimation(978);
loadScene(31, 298, 177, 4);
}
break;
case 0x79e4:
fnEgoBottomRightTurn();
retVal = false;
break;
case 0x79eb: // color of the book
// FIXME - Replace with internal lookup and switch
displayMessage(res->dseg.get_word(dsAddr_bookColorMsgPtr + GET_FLAG(0xdbc1) * 2 - 2));
break;
case 0x79fd:
if (CHECK_FLAG(0xdbb7, 1))
displayMessage(dsAddr_blueInteriorMsg); // "It's got a blue interior"
else
retVal = false;
break;
case 0x7a0f:
if (CHECK_FLAG(0xdbb8, 1)) {
if (!CHECK_FLAG(0xdbbf, 1)) {
displayMessage(dsAddr_foundPolaroidMsg); // "There's a polaroid inside! I might need that"
playSound(5, 11);
playActorAnimation(690);
inventory->add(53);
SET_FLAG(0xdbbf, 1);
}
displayMessage(dsAddr_redInteriorMsg); // "It's got a red interior"
} else
retVal = false;
break;
case 0x7a49:
if (CHECK_FLAG(0xdbb9, 1))
displayMessage(dsAddr_greyInteriorMsg); // "It's got a grey interior"
else
retVal = false;
break;
case 0x7a5b:
if (CHECK_FLAG(0xdbba, 1))
displayMessage(dsAddr_greenInteriorMsg); // "It's got a green interior"
else
retVal = false;
break;
case 0x7a6d:
if (CHECK_FLAG(0xdbbb, 1))
displayMessage(dsAddr_brownInteriorMsg); // "It's got a brown interior"
else
retVal = false;
break;
case 0x7a7f:
if (CHECK_FLAG(0xdbbc, 1)) {
if (!CHECK_FLAG(0xdbbe, 1)) {
displayMessage(dsAddr_dictaphoneInsideMsg); // "Wow! There's a dictaphone inside!"
playSound(5, 12);
playActorAnimation(689);
inventory->add(52);
SET_FLAG(0xdbbe, 1);
}
displayMessage(dsAddr_pinkInteriorMsg); // "It's got a pink interior"
} else
retVal = false;
break;
case 0x7af7:
if (CHECK_FLAG(0xdbd0, 1))
displayMessage(dsAddr_yummyMsg); // "Yummy"
else
retVal = false;
break;
case 0x7b09:
{
byte v = GET_FLAG(0xdbd6);
switch (v) {
case 1:
displayMessage(dsAddr_corkInHoleMsg); // "The cork is stuck in the hole"
break;
case 2:
displayMessage(dsAddr_sinkFullMsg); // "The sink is full of hot water"
break;
default:
retVal = false;
break;
}
}
break;
case csAddr_robotSafeAlreadyUnlockedCheck:
fnRobotSafeAlreadyUnlockedCheck();
break;
case csAddr_robotSafeUnlockCheck:
fnRobotSafeUnlockCheck();
break;
case 0x90bc: // handle on the hole
playSound(5, 3);
playSound(6, 9);
playActorAnimation(807);
setOns(0, 83);
inventory->remove(73);
disableObject(2);
enableObject(3);
SET_FLAG(0xdbef, 1);
break;
case 0x90fc: // dictaphone on robot
if (fnRobotSafeAlreadyUnlockedCheck()) {
if (CHECK_FLAG(0xdbd2, 1)) {
displayMessage(dsAddr_fooledOnceMsg); // "I'd already fooled him once"
} else {
if (!CHECK_FLAG(0xdbcb, 1)) {
displayMessage(dsAddr_notMyVoiceMsg); // "I won't cheat Mike with MY voice"
} else {
displayMessage(dsAddr_mikeVoiceTestMsg); // "Mike, activate the voice test"
waitLanAnimationFrame(1, 1);
playSound(5, 3);
playSound(5, 39);
displayAsyncMessage(dsAddr_singingMsg, 68, 126, 9, 35, 0xd0); // "siiiiinging!"
playActorAnimation(728);
waitLanAnimationFrame(1, 1);
dialog->show(98, scene, 0, 727, 0xd1, 0xef, 0, 1);
SET_FLAG(0xdbd2, 1);
fnRobotSafeUnlockCheck();
}
}
}
break;
case 0x91cb: // use socks on robot
if (fnRobotSafeAlreadyUnlockedCheck()) {
if (CHECK_FLAG(0xdbd3, 1)) {
displayMessage(dsAddr_fooledOnceMsg); // "I'd already fooled him once"
} else {
displayMessage(dsAddr_mikeScentTestMsg); // "Mike, let's get on with the scent test"
waitLanAnimationFrame(1, 1);
playSound(5, 3);
playSound(5, 23);
playActorAnimation(729);
waitLanAnimationFrame(1, 1);
dialog->show(99, scene, 0, 727, 0xd1, 0xef, 0, 1);
SET_FLAG(0xdbd3, 1);
fnRobotSafeUnlockCheck();
}
}
break;
case 0x9209: // photo on robot
if (fnRobotSafeAlreadyUnlockedCheck()) {
if (CHECK_FLAG(0xdbd4, 1)) {
displayMessage(dsAddr_fooledOnceMsg); // "I'd already fooled him once"
} else {
displayMessage(dsAddr_mikeViewTestMsg); // "Mike, run the view test"
waitLanAnimationFrame(1, 1);
playSound(5, 3);
playSound(5, 25);
playActorAnimation(730);
waitLanAnimationFrame(1, 1);
dialog->show(100, scene, 0, 727, 0xd1, 0xef, 0, 1);
SET_FLAG(0xdbd4, 1);
fnRobotSafeUnlockCheck();
}
}
break;
case 0x924e:
setOns(2, 64);
playSound(5, 3);
playSound(52, 10);
playActorAnimation(711);
moveRel(0, 0, 4);
dialog->show(95, scene, 0, 709, 0xd1, 0xef, 0, 1);
moveTo(300, 190, 4);
inventory->remove(64);
disableObject(8);
playAnimation(712, 0);
setOns(2, 0);
playSound(15, 26);
playSound(15, 28);
playSound(16, 37);
playAnimation(713, 0);
dialog->show(96, scene, 0, 709, 0xd1, 0xef, 0, 1);
playSound(85, 2);
playAnimation(714, 0);
setLan(1, 0);
disableObject(1);
{
Object *obj = scene->getObject(2);
obj->actor_rect.left = obj->actor_rect.right = 81;
obj->actor_rect.top = obj->actor_rect.bottom = 160;
obj->actor_orientation = 4;
obj->save();
}
{
Object *obj = scene->getObject(3);
obj->actor_rect.left = obj->actor_rect.right = 64;
obj->actor_rect.top = obj->actor_rect.bottom = 168;
obj->actor_orientation = 4;
obj->save();
}
{
Object *obj = scene->getObject(10);
obj->actor_rect.left = obj->actor_rect.right = 105;
obj->actor_rect.top = obj->actor_rect.bottom = 160;
obj->actor_orientation = 1;
obj->save();
}
SET_FLAG(0xdbcc, 1);
break;
case 0x9472:
playSound(5, 4);
playSound(19, 14);
playActorAnimation(793);
displayMessage(dsAddr_fitsPerfectMsg); // "It fits perfectly!"
inventory->remove(60);
SET_FLAG(0xdbd6, 1);
break;
case 0x9449: // meat + stew
playSound(5, 4);
playSound(63, 12);
playActorAnimation(726);
displayMessage(dsAddr_dislikeVealMsg); // "I never liked veal anyway"
inventory->remove(69);
inventory->add(70);
break;
case 0x949b:
if (CHECK_FLAG(0xdbd6, 2)) {
playSound(5, 4);
playSound(5, 25);
playActorAnimation(802);
displayMessage(dsAddr_labelOffMsg); // "The label has come off!"
inventory->remove(62);
inventory->add(74);
inventory->add(65);
} else
displayMessage(dsAddr_noHotWaterMsg); // "There's no hot water in the sink"
break;
case 0x94d4:
if (inventory->has(70)) {
setOns(0, 0);
playSound(5, 3);
playSound(5, 18);
playSound(13, 12);
playActorAnimation(803);
disableObject(7);
inventory->remove(70);
inventory->add(71);
} else
displayMessage(dsAddr_noSockStoreMsg); // "I don't have anything to store these socks in"
break;
case 0x951b:
playSound(5, 4);
playSound(5, 22);
playActorAnimation(804);
displayMessage(dsAddr_corkTooSmallMsg); // "The cork is a bit too small"
break;
case 0x73a3:
if (CHECK_FLAG(0xdbc5, 1)) {
SET_FLAG(0xdbc5, 0);
//call 73e6
playSound(71, 3);
playActorAnimation(700);
playAnimation(0, 0, true);
reloadLan();
if (CHECK_FLAG(0xdbc6, 1)) {
displayMessage(dsAddr_muchBetterMsg); // "That's much better"
}
} else {
SET_FLAG(0xdbc5, 1);
//call 73e6
playSound(71, 3);
playActorAnimation(700);
reloadLan();
}
break;
case 0x9537: // using remote on VCR
playSound(5, 3);
playSound(5, 16);
playActorAnimation(703);
if (!CHECK_FLAG(0xdbc8, 1))
displayMessage(dsAddr_NotHappenMsg); // "Nothing happened"
else {
//0x955a
if (CHECK_FLAG(0xdbc6, 0)) {
if (CHECK_FLAG(0xdbc5, 1)) { // tv on
if (!CHECK_FLAG(0xdbc7, 1))
displayMessage(dsAddr_tapeStartedMsg); // "The tape started!"
SET_FLAG(0xdbc6, 1);
reloadLan();
if (!CHECK_FLAG(0xdbc7, 1)) {
dialog->show(93, scene, 0, 702, 0xd1, 0xd0, 0, 1);
SET_FLAG(0xdbc7, 1);
}
} else
displayMessage(dsAddr_tvOffMsg); // "I just realised that the TV is off"
} else {
SET_FLAG(0xdbc6, 0);
if (CHECK_FLAG(0xdbc5, 1)) { // tv on
reloadLan();
displayMessage(dsAddr_muchBetterMsg); // "That's much better"
}
}
}
break;
case 0x95eb: // polaroid + tv
if (CHECK_FLAG(0xdbc6, 1)) {
if (CHECK_FLAG(0xdbca, 1)) {
displayMessage(dsAddr_enoughPhotosMsg); // "I don't need any more photos"
} else {
playSound(5, 3);
playSound(5, 24);
playSound(90, 18);
playActorAnimation(707);
inventory->add(61);
SET_FLAG(0xdbca, 1);
}
} else
displayMessage(dsAddr_notRightMomentMsg); // "I don't think this is the right moment"
break;
case 0x962f: // polaroid + tv
if (CHECK_FLAG(0xdbc6, 1)) {
if (CHECK_FLAG(0xdbcb, 1)) {
displayMessage(dsAddr_alreadyRecordedMsg); // "I already recorded what I wanted to"
} else {
displayMessage(dsAddr_recordScareMsg); // "Yeah, I can record this and scare the cats"
playSound(5, 3);
playSound(5, 27);
playActorAnimation(708);
SET_FLAG(0xdbcb, 1);
}
} else
displayMessage(dsAddr_notRightMomentMsg); // "I don't think this is the right moment"
break;
case 0x95c8:
playSound(5, 3);
playSound(91, 12);
playActorAnimation(706);
inventory->remove(54);
SET_FLAG(0xdbc8, 1);
break;
case 0x9673: // hit fatso - final scene
playSound(5, 3);
playSound(24, 10);
playActorAnimation(798);
playSound(63, 11);
playSound(19, 20);
playAnimation(799, 0);
moveTo(50, 170, 1);
playAnimation(800, 0, true, true, true);
wait(100);
playActorAnimation(805);
moveTo(50, 170, 3);
displayMessage(dsAddr_onlyChilliMsg); // "Good this red stuff is only a chilli"
//moveTo(105, 157, 0, true);
playMusic(3);
loadScene(11, 105, 157, 4);
dialog->show(203, scene, 0, 938, 0xd1, 0xec, 0, 1);
playAnimation(939, 0, true, true);
playActorAnimation(942, true);
waitAnimation();
playAnimation(939, 0, true, true);
playAnimation(935, 1, true, true);
playActorAnimation(943, true);
waitAnimation();
playAnimation(940, 0, true, true);
playAnimation(936, 1, true, true);
playActorAnimation(944, true);
waitAnimation();
playAnimation(941, 0, true, true);
playAnimation(937, 1, true, true);
playActorAnimation(945, true);
waitAnimation();
dialog->show(204, scene, 0, 938, 0xd1, 0xec, 0, 1);
playAnimation(946, 0);
dialog->show(205, scene, 0, 938, 0xd1, 0xec, 0, 1);
playSound(24, 7);
playAnimation(948, 0, true);
playActorAnimation(947, true);
waitAnimation();
loadScene(40, 198, 186, 1);
dialog->show(206, scene, 0, 920, 0xd1, 0xe7, 0, 1);
dialog->show(207, scene, 0, 921, 0xd1, 0xe7, 0, 1);
playAnimation(923, 0);
dialog->show(208, scene, 0, 920, 0xd1, 0xe7, 0, 1);
moveTo(237, 186, 0);
moveTo(237, 177, 0);
moveTo(192, 177, 4);
playAnimation(949, 0);
dialog->showMono(209, scene, 950, 0xe7, 1);
playSound(32, 5);
playSound(40, 14);
playAnimation(951, 0, true);
playActorAnimation(952, true);
waitAnimation();
playMusic(11);
displayCredits();
loadScene(39, 192, 177, 0);
hideActor();
dialog->showMono(210, scene, 953, 0xe3, 1);
playSound(5, 15);
playAnimation(954, 0);
dialog->showMono(211, scene, 955, 0xe3, 1);
playMusic(2);
displayCredits(dsAddr_finalCredits6, 4500); // 3 minutes (infinite until key pressed in original)
scene->push(SceneEvent(SceneEvent::kQuit));
break;
case 0x9921: // using diving eq
{
int id = scene->getId();
if (id != 15) {
if (id == 16)
displayMessage(dsAddr_notHereMsg); // "Not here"
else
displayMessage(dsAddr_notBestPlaceMsg); // "It's not the best place for diving"
} else {
playSound(5, 3);
playSound(38, 16);
playSound(38, 22);
playActorAnimation(614);
playSound(5, 3);
playSound(44, 10);
playSound(20, 26);
playActorAnimation(615);
loadScene(17, 156, 180, 3);
SET_FLAG(0x0000, 4);
playSound(64, 7);
playSound(64, 21);
playSound(64, 42);
playSound(64, 63);
setTimerCallback(csAddr_noAnchorTimeout, 30);
playActorAnimation(617, false, true);
}
}
break;
case csAddr_noAnchorTimeout: // no anchor, timeout
SET_FLAG(0x0000, 0);
fnGetOutOfLake();
INC_FLAG(0xdba6);
switch (GET_FLAG(0xdba6)) {
case 1:
displayMessage(dsAddr_seaweedMsg); // "This seaweed is just like the flowers I gave mum on her last birthday"
break;
case 2:
displayMessage(dsAddr_fishBoatMsg); // "I wonder what fish do inside this boat at night"
break;
case 3:
displayMessage(dsAddr_fishSomethingMsg); // "I think I have to fish out something down there"
break;
case 4:
displayMessage(dsAddr_notRedHerringMsg); // "I hope all this fish stuff is not a red herring"
break;
case 5:
displayMessage(dsAddr_seaweedMsg); // "This seaweed is just like the flowers I gave mum on her last birthday"
break;
default:
displayMessage(dsAddr_niceDownMsg); // "It's nice down there"
break;
}
break;
case csAddr_gotAnchor:
fnGotAnchor();
break;
case csAddr_getOutOfLake:
fnGetOutOfLake();
break;
case 0x9aca:
if (scene->getId() == 13) {
moveTo(172, 181, 1);
playSound(26, 19);
for (uint i = 0; i < 8; ++i)
playSound(26, 30 + i * 11);
playActorAnimation(661);
displayCutsceneMessage(dsAddr_cutsceneMsgA, 84, 95); // "Hundred moments later"
playSound(56, 10);
playSound(56, 21);
playSound(8, 48);
for (uint i = 0; i < 7; ++i)
playSound(26, 117 + i * 11);
moveRel(-20, 0, 0, true);
playActorAnimation(662, true);
playAnimation(663, 2, true);
waitAnimation();
setOns(1, 49);
displayCutsceneMessage(dsAddr_cutsceneMsgB, 53, 95); // "Another hundred moments later"
moveTo(162, 184, 0, true);
playSound(26, 6);
playSound(26, 17);
playSound(56, 10);
playSound(56, 21);
playSound(19, 27);
playSound(24, 38);
playSound(23, 44);
playActorAnimation(664);
playAnimation(665, 1);
wait(100);
displayMessage(dsAddr_foundCrudeOilMsg); // "At least I found crude oil and I'll be rich"
wait(100);
displayMessage(dsAddr_myLifeMsg); // "That's my life"
inventory->remove(37);
fnMansionIntrusionAttempt();
} else
displayMessage(dsAddr_notThinkRightPlaceMsg); // "I don't think this is the right place"
break;
case 0x9c6d:
displayMessage(dsAddr_bankNoteMsg); // "It's a note from some bank..."
SET_FLAG(0xdbb5, 1);
retVal = false;
break;
case 0x9c79: // use pills
if (scene->getId() != 36) {
displayMessage(dsAddr_notTryNowMsg); // "There's no need to try them now"
} else if (CHECK_FLAG(0xdbf1, 1)) {
displayMessage(dsAddr_nahMsg); // "Nah"
} else {
SET_FLAG(0xdbf1, 1);
moveTo(102, 195, 2);
playSound(5, 3);
playSound(75, 12);
playActorAnimation(794);
wait(100);
setLan(1, 0);
moveTo(151, 197, 2);
playActorAnimation(795);
moveTo(186, 198, 2, true);
moveTo(220, 198, 4);
{
Walkbox *w = scene->getWalkbox(0);
w->rect.left = 0;
w->rect.bottom = screenHeight-1;
w->save();
}
setLan(1, 0xff);
dialog->showMark(130, scene);
Object *obj = scene->getObject(1);
obj->actor_rect.left = obj->actor_rect.right = 270;
obj->actor_rect.top = obj->actor_rect.bottom = 193;
obj->actor_orientation = 2;
obj->save();
obj = scene->getObject(3);
obj->actor_rect.left = obj->actor_rect.right = 254;
obj->actor_rect.top = obj->actor_rect.bottom = 193;
obj->actor_orientation = 1;
obj->save();
SET_FLAG(0xdbd7, 1);
}
break;
case csAddr_mansionIntrusionAttempt:
retVal = fnMansionIntrusionAttempt();
break;
case csAddr_secondMansionIntrusion:
fnSecondMansionIntrusion();
break;
case csAddr_thirdMansionIntrusion:
fnThirdMansionIntrusion();
break;
case csAddr_fourthMansionIntrusion:
fnFourthMansionIntrusion();
break;
case csAddr_fifthMansionIntrusion:
fnFifthMansionIntrusion();
break;
case csAddr_sixthMansionIntrusion:
fnSixthMansionIntrusion();
break;
default:
warning("unknown callback %04x called", addr);
// try decoding trivial callbacks by cseg if not in switch
byte *code = res->cseg.ptr(addr);
if (code[0] == 0xbb && code[3] == 0xe8 && code[6] == 0xc3) {
// call display_message, r
uint16 msg = READ_LE_UINT16(code + 1);
uint16 func = 6 + addr + READ_LE_UINT16(code + 4);
warning("call %04x and return (csAddr_displayMsg = 0x%04x) msg:0x%04x", func, csAddr_displayMsg, msg);
if (func == csAddr_displayMsg) {
warning("trivial callback, showing message \"%s\"", (const char *)res->dseg.ptr(msg));
displayMessage(msg);
return true;
}
}
if (code[0] == 0xe8 && code[3] == 0xc3) {
uint func = 3 + addr + READ_LE_UINT16(code + 1);
warning("call %04x and return (csAddr_rejectMsg = 0x%04x)", func, csAddr_rejectMsg);
if (func == csAddr_rejectMsg) {
rejectMessage();
return true;
}
}
if (code[0] == 0xc7 && code[1] == 0x06 && code[2] == 0xf3 && code[3] == 0xb4 &&
code[6] == 0xb8 && code[9] == 0xbb && code[12] == 0xbf &&
code[22] == 0xe8 && code[25] == 0xc3) {
warning("callback -> loadScene(%d, Common::Point(%d, %d)); scene->setOrientation(%d)", code[4],
(READ_LE_UINT16(code + 7) + READ_LE_UINT16(code + 13) + 1) / 2,
READ_LE_UINT16(code + 10), code[21]);
loadScene(code[4], Common::Point(
(READ_LE_UINT16(code + 7) + READ_LE_UINT16(code + 13) + 1) / 2 ,
READ_LE_UINT16(code + 10)));
scene->setOrientation(code[21]);
return true;
}
break;
}
return retVal;
}
} // End of namespace TeenAgent