diff options
Diffstat (limited to 'engines/teenagent/callbacks.cpp')
-rw-r--r-- | engines/teenagent/callbacks.cpp | 174 |
1 files changed, 139 insertions, 35 deletions
diff --git a/engines/teenagent/callbacks.cpp b/engines/teenagent/callbacks.cpp index 3df9065e4a..b41f01c63a 100644 --- a/engines/teenagent/callbacks.cpp +++ b/engines/teenagent/callbacks.cpp @@ -503,40 +503,6 @@ bool TeenAgentEngine::processCallback(uint16 addr) { 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) { @@ -544,6 +510,16 @@ bool TeenAgentEngine::processCallback(uint16 addr) { fnIntro(); break; + case 0x3fed: + loadScene(3, Common::Point(305, 104)); + scene->setOrientation(4); + break; + + case 0x4007: + loadScene(5, Common::Point(300, 131)); + scene->setOrientation(3); + break; + case 0x4021: // pulling out mysterious object if (CHECK_FLAG(0xdbe1, 1)) { @@ -556,6 +532,20 @@ bool TeenAgentEngine::processCallback(uint16 addr) { } break; + case 0x404f: + displayMessage(dsAddr_notWantToSleepMsg); // "I don't want to sleep" + break; + + case 0x4060: + loadScene(2, Common::Point(28, 180)); + scene->setOrientation(2); + break; + + case 0x407a: + loadScene(4, Common::Point(297, 128)); + scene->setOrientation(4); + break; + case 0x4094: // climbing to the pole near mudpool if (CHECK_FLAG(0xdbe4, 1)) { displayMessage(dsAddr_poleClimbDoneMsg); // "Never Again!" @@ -593,6 +583,10 @@ bool TeenAgentEngine::processCallback(uint16 addr) { fnPoleClimbFail(); break; + case 0x4195: + displayMessage(dsAddr_preferWaterMsg); // "I prefer water" + break; + case 0x419c: // getting the bird setOns(0, 0); playSound(56, 10); @@ -601,6 +595,10 @@ bool TeenAgentEngine::processCallback(uint16 addr) { inventory->add(0x5c); break; + case 0x41ca: + rejectMessage(); + break; + case 0x41ce: moveTo(197, 159, 4); setOns(0, 0); @@ -611,6 +609,20 @@ bool TeenAgentEngine::processCallback(uint16 addr) { disableObject(3); break; + case 0x422c: + displayMessage(dsAddr_tooWeakToClimbMsg); // "I'm too weak to climb it" + break; + + case 0x4233: + loadScene(3, Common::Point(216, 199)); + scene->setOrientation(1); + break; + + case 0x424d: + loadScene(5, Common::Point(18, 174)); + scene->setOrientation(2); + break; + case 0x4267: hideActor(); playSound(23, 8); @@ -639,6 +651,21 @@ bool TeenAgentEngine::processCallback(uint16 addr) { displayMessage(dsAddr_fnMsg1); // "Piece of cake" break; + case 0x433a: + loadScene(10, Common::Point(294, 183)); + scene->setOrientation(4); + break; + + case 0x4354: + loadScene(4, Common::Point(300, 185)); + scene->setOrientation(4); + break; + + case 0x436e: + loadScene(2, Common::Point(219, 199)); + scene->setOrientation(1); + break; + case 0x4388: playSound(80, 4); playActorAnimation(961); @@ -705,6 +732,10 @@ bool TeenAgentEngine::processCallback(uint16 addr) { } break; + case 0x4532: + displayMessage(dsAddr_springPrickMsg); // "The springs would prick my back" + break; + case 0x4539: // prison cell: use crates if (CHECK_FLAG(0xdbdd, 2)) { // finished the meal - trap @@ -838,11 +869,19 @@ bool TeenAgentEngine::processCallback(uint16 addr) { } break; + case 0x4836: + rejectMessage(); + break; + case 0x4871: playActorAnimation(965); displayMessage(dsAddr_lockedMsg); // "It's Locked!" break; + case 0x487e: + displayMessage(dsAddr_geographyClassMsg); // "I should have paid more attention in geography classes." + break; + case 0x4893: // taking pills if (CHECK_FLAG(dsAddr_captainDrawerState, 1)) { SET_FLAG(dsAddr_captainDrawerState, 2); @@ -857,6 +896,15 @@ bool TeenAgentEngine::processCallback(uint16 addr) { } break; + case 0x48db: + displayMessage(dsAddr_uselessModelsMsg); // "What's the use of the models?" + break; + + case 0x48e2: + case 0x48e6: + rejectMessage(); + break; + case 0x4918: // talking with barmen if (CHECK_FLAG(0xdbe7, 1)) { moveTo(140, 152, 1); @@ -948,6 +996,10 @@ bool TeenAgentEngine::processCallback(uint16 addr) { } break; + case 0x4aed: + displayMessage(dsAddr_tooBigMsg); // "It's too big and I doubt if I'll ever need it" + break; + case 0x4af4: // taking the crumbs setOns(0, 0); playSound(49, 6); @@ -957,6 +1009,18 @@ bool TeenAgentEngine::processCallback(uint16 addr) { disableObject(6); break; + case 0x4b23: + rejectMessage(); + break; + + case 0x4b27: + displayMessage(dsAddr_tooMuchToDrinkMsg); // "It'd take too much time to drink it..." + break; + + case 0x4b2e: + displayMessage(dsAddr_notThiefMsg); // "I'm not a thief. And it's empty, by the way." + break; + case 0x4b35: playSound(15, 7); playActorAnimation(884); @@ -1008,6 +1072,10 @@ bool TeenAgentEngine::processCallback(uint16 addr) { displayMessage(dsAddr_lockedMsg); // "It's Locked!" break; + case 0x4ca5: + displayMessage(dsAddr_chickenNeverMsg); // "Chickening? Me? Never!" + break; + case 0x4cac: if (CHECK_FLAG(0xdbda, 1)) { // papers are shown loadScene(5, 124, 199); @@ -4294,7 +4362,43 @@ bool TeenAgentEngine::processCallback(uint16 addr) { break; default: - warning("invalid callback %04x called", addr); + warning("unknown callback %04x called", addr); + + // try decoding trivial callbacks by cseg if not in switch + byte *code = res->cseg.ptr(addr); + if (code[0] == 0xbb && code[3] == 0xe8 && code[6] == 0xc3) { + // call display_message, r + uint16 msg = READ_LE_UINT16(code + 1); + uint16 func = 6 + addr + READ_LE_UINT16(code + 4); + warning("call %04x and return (csAddr_displayMsg = 0x%04x) msg:0x%04x", func, csAddr_displayMsg, msg); + if (func == csAddr_displayMsg) { + warning("trivial callback, showing message \"%s\"", (const char *)res->dseg.ptr(msg)); + displayMessage(msg); + return true; + } + } + + if (code[0] == 0xe8 && code[3] == 0xc3) { + uint func = 3 + addr + READ_LE_UINT16(code + 1); + warning("call %04x and return (csAddr_rejectMsg = 0x%04x)", func, csAddr_rejectMsg); + if (func == csAddr_rejectMsg) { + rejectMessage(); + return true; + } + } + + if (code[0] == 0xc7 && code[1] == 0x06 && code[2] == 0xf3 && code[3] == 0xb4 && + code[6] == 0xb8 && code[9] == 0xbb && code[12] == 0xbf && + code[22] == 0xe8 && code[25] == 0xc3) { + warning("callback -> loadScene(%d, Common::Point(%d, %d)); scene->setOrientation(%d)", code[4], + (READ_LE_UINT16(code + 7) + READ_LE_UINT16(code + 13) + 1) / 2, + READ_LE_UINT16(code + 10), code[21]); + loadScene(code[4], Common::Point( + (READ_LE_UINT16(code + 7) + READ_LE_UINT16(code + 13) + 1) / 2 , + READ_LE_UINT16(code + 10))); + scene->setOrientation(code[21]); + return true; + } break; } |