diff options
author | D G Turner | 2012-07-29 06:00:27 +0100 |
---|---|---|
committer | D G Turner | 2012-07-29 06:00:27 +0100 |
commit | e2d638164551d486fb15be861457e85a0e60a07d (patch) | |
tree | af098d9a81adc69914dab84d642bea0693323335 /engines/teenagent/callbacks.cpp | |
parent | d4591dcfb5e240138e478bd86d4de6ad75ca60c7 (diff) | |
download | scummvm-rg350-e2d638164551d486fb15be861457e85a0e60a07d.tar.gz scummvm-rg350-e2d638164551d486fb15be861457e85a0e60a07d.tar.bz2 scummvm-rg350-e2d638164551d486fb15be861457e85a0e60a07d.zip |
TEENAGENT: Switch Callback ordering to use switch before cseg data.
This now emits warning output if a callback is not explicitly
implemented in the switch statement. This is to migrate away from
loading and using the cseg data in favor of explicit code blocks.
Also, some implementation of callbacks using cseg previously.
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; } |