aboutsummaryrefslogtreecommitdiff
path: root/engines/teenagent/callbacks.cpp
diff options
context:
space:
mode:
authorD G Turner2012-07-29 06:00:27 +0100
committerD G Turner2012-07-29 06:00:27 +0100
commite2d638164551d486fb15be861457e85a0e60a07d (patch)
treeaf098d9a81adc69914dab84d642bea0693323335 /engines/teenagent/callbacks.cpp
parentd4591dcfb5e240138e478bd86d4de6ad75ca60c7 (diff)
downloadscummvm-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.cpp174
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;
}