mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-24 18:56:33 +00:00
4305 lines
102 KiB
C++
4305 lines
102 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(0, 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(0, 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(0xdba4, 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(0, 0)) {
|
|
playSound(5, 2);
|
|
playSound(15, 12);
|
|
playActorAnimation(638);
|
|
inventory->remove(48);
|
|
setTimerCallback(0x8d79, 100);
|
|
SET_FLAG(0, 1);
|
|
} else if (CHECK_FLAG(0, 1)) {
|
|
playSound(5, 2);
|
|
playSound(52, 13);
|
|
playActorAnimation(648);
|
|
setOns(1, 46);
|
|
inventory->remove(49);
|
|
setTimerCallback(0x8d79, 100);
|
|
SET_FLAG(0, 2);
|
|
} else if (CHECK_FLAG(0, 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(0xdbab, 1);
|
|
SET_FLAG(0, 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);
|
|
byte *code = res->cseg.ptr(addr);
|
|
|
|
// try trivial callbacks first
|
|
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);
|
|
debugC(0, kDebugCallbacks, "call %04x msg:0x%04x", func, msg);
|
|
debugC(0, kDebugCallbacks, "trivial callback, showing message %s", (const char *)res->dseg.ptr(addr));
|
|
if (func == csAddr_displayMsg) {
|
|
displayMessage(msg);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
if (code[0] == 0xe8 && code[3] == 0xc3) {
|
|
uint func = 3 + addr + READ_LE_UINT16(code + 1);
|
|
debugC(0, kDebugCallbacks, "call %04x and return", func);
|
|
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) {
|
|
debugC(0, kDebugCallbacks, "loadScene(%d) callback", code[4]);
|
|
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;
|
|
}
|
|
|
|
bool retVal = true;
|
|
switch (addr) {
|
|
case csAddr_intro: // intro
|
|
fnIntro();
|
|
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 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 0x419c: // getting the bird
|
|
setOns(0, 0);
|
|
playSound(56, 10);
|
|
playActorAnimation(875);
|
|
disableObject(6);
|
|
inventory->add(0x5c);
|
|
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 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 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 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 0x4871:
|
|
playActorAnimation(965);
|
|
displayMessage(dsAddr_lockedMsg); // "It's Locked!"
|
|
break;
|
|
|
|
case 0x4893: // taking pills
|
|
if (CHECK_FLAG(0xdbe6, 1)) {
|
|
SET_FLAG(0xdbe6, 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 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 0x4af4: // taking the crumbs
|
|
setOns(0, 0);
|
|
playSound(49, 6);
|
|
playSound(5, 13);
|
|
playActorAnimation(861);
|
|
inventory->add(0x57);
|
|
disableObject(6);
|
|
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 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(0, 3);
|
|
setTimerCallback(0x516d, 40);
|
|
playAnimation(544, 0, true, true); // ignore busy flag for this animation
|
|
}
|
|
break;
|
|
|
|
case 0x516d: // too late to scare guard, resetting
|
|
SET_FLAG(0, 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(0xdba4, 1))
|
|
displayMessage(dsAddr_tooHeavyMsg); // "It's too heavy. Not that I'm wimp"
|
|
else
|
|
fnTooDark();
|
|
break;
|
|
|
|
case 0x6217:
|
|
if (CHECK_FLAG(0xdba4, 1))
|
|
displayMessage(dsAddr_noDentistsMsg); // "I don't want to have anything in common with dentists"
|
|
else
|
|
fnTooDark();
|
|
break;
|
|
|
|
case 0x62c1:
|
|
if (CHECK_FLAG(0xdba4, 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(0xdba9, 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(0xdba9, 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(0xdbdb) + 1;
|
|
if (v <= 6)
|
|
SET_FLAG(0xdbdb, 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(0xdbe6, 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(0xdba4, 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(0xdba4, 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(0xdba4, 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(0xdba4, 1);
|
|
loadScene(24, scene->getPosition());
|
|
}
|
|
break;
|
|
|
|
case 0x61e9:
|
|
if (CHECK_FLAG(0xdba4, 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(0xdba4, 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(0x6746 + (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(0xdba4, 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(0xdbe6, 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(0xdba4, 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(0xdba4, 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 0x8d79: // mouse falls back from the hole (cave)
|
|
if (CHECK_FLAG(0, 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(0xdba9, 0);
|
|
}
|
|
SET_FLAG(0, 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(0xdba9, 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(0xdbab, 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(0xdbaa, 1)) {
|
|
SET_FLAG(0xdbaa, 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(0, 4);
|
|
playSound(64, 7);
|
|
playSound(64, 21);
|
|
playSound(64, 42);
|
|
playSound(64, 63);
|
|
setTimerCallback(0x9a1d, 30);
|
|
playActorAnimation(617, false, true);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 0x9a1d: // no anchor, timeout
|
|
SET_FLAG(0, 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 = 199;
|
|
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("invalid callback %04x called", addr);
|
|
break;
|
|
}
|
|
|
|
return retVal;
|
|
}
|
|
|
|
} // End of namespace TeenAgent
|