aboutsummaryrefslogtreecommitdiff
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
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.
-rw-r--r--engines/teenagent/callbacks.cpp174
-rw-r--r--engines/teenagent/resources.h27
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"