diff options
-rw-r--r-- | engines/teenagent/callbacks.cpp | 174 | ||||
-rw-r--r-- | engines/teenagent/resources.h | 27 |
2 files changed, 164 insertions, 37 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; } diff --git a/engines/teenagent/resources.h b/engines/teenagent/resources.h index e059eaa46f..d63f538914 100644 --- a/engines/teenagent/resources.h +++ b/engines/teenagent/resources.h @@ -298,6 +298,9 @@ const uint16 dsAddr_hmmGrassMsg = 0x417e; // "Hmmm. Grass..." // Find Nut Message : 0x41b1 to 0x41ee const uint16 dsAddr_findNutMsg = 0x41b1; // "I won't find the nut just like that. The grass is too dense" +// Too Big Message : 0x431e to 0x434d +const uint16 dsAddr_tooBigMsg = 0x431e; // "It's too big and I doubt if I'll ever need it" + // No Fruit Message : 0x4380 to 0x43ab const uint16 dsAddr_noFruitMsg = 0x4380; // "There are no more interesting fruits here" @@ -555,7 +558,8 @@ const uint16 dsAddr_pullObjMsg1 = 0x5696; // "I can't pull it out" // Fence Blocks Message : 0x56da to 0x56f6 const uint16 dsAddr_fenceBlocksMsg = 0x56da; // "The fence blocks the way" - +// Not Want To Sleep Message : 0x56f7 to 0x570e +const uint16 dsAddr_notWantToSleepMsg = 0x56f7; // "I don't want to sleep" // Pull Object Message #2 : 0x570f to 0x5721 const uint16 dsAddr_pullObjMsg2 = 0x570f; // "I can't reach it" // Hello Question Message : 0x5722 to 0x5729 @@ -592,13 +596,32 @@ const uint16 dsAddr_yeahRightMsg = 0x5883; // "Yeah right!" const uint16 dsAddr_barmanTooCloseMsg = 0x5894; // "The barman is too close" // Yuck Message : 0x58b0 to 0x58b6 const uint16 dsAddr_yuckMsg = 0x58b0; // "Yuck!" - +// Prefer Water Message : 0x58b7 to 0x58c7 +const uint16 dsAddr_preferWaterMsg = 0x58b7; // "I prefer water" +// Too Weak To Climb Message : 0x58c8 to 0x58e2 +const uint16 dsAddr_tooWeakToClimbMsg = 0x58c8; // "I'm too weak to climb it" +// Spring Prick Message : 0x58e3 to 0x5904 +const uint16 dsAddr_springPrickMsg = 0x58e3; // "The springs would prick my back" // Food Alive Message : 0x5905 to 0x592e const uint16 dsAddr_foodAliveMsg = 0x5905; // "No, thanks. This food seems still alive" // Door Closed Message : 0x592f to 0x5954 const uint16 dsAddr_doorClosedMsg = 0x592f; // "The door is closed. What a surprise." // Empty Message : 0x5955 to 0x5961 const uint16 dsAddr_emptyMsg = 0x5955; // "It's Empty" +// Geography Class Message : 0x5962 to 0x599c +const uint16 dsAddr_geographyClassMsg = 0x5962; // "I should have paid more attention in geography classes." + +// Useless Models Message : 0x5a01 to 0x5a1f +const uint16 dsAddr_uselessModelsMsg = 0x5a01; // "What's the use of the models?" + +// Too Much To Drink Message : 0x5a51 to 0x5a95 +const uint16 dsAddr_tooMuchToDrinkMsg = 0x5a51; // "It'd take too much time to drink it..." +// 0x5a96 to 0x5a97 : 2 extra null bytes (padding?) +// Not Thief Message : 0x5a98 to 0x5ac5 +const uint16 dsAddr_notThiefMsg = 0x5a98; // "I'm not a thief. And it's empty, by the way." + +// Chickening Never Message : 0x5b27 to 0x5b3e +const uint16 dsAddr_chickenNeverMsg = 0x5b27; // "Chickening? Me? Never!" // Never Learnt Message : 0x5c60 to 0x5c81 const uint16 dsAddr_neverLearntMsg = 0x5c60; // "I never learnt to how use one" |