aboutsummaryrefslogtreecommitdiff
path: root/scumm
diff options
context:
space:
mode:
authorTravis Howell2004-09-21 11:22:39 +0000
committerTravis Howell2004-09-21 11:22:39 +0000
commitb0f0bf8dc2b0c1604b664307b34bf210a31ce4e9 (patch)
tree894992a8fa1900a17b85865d01fd0d9f6e130fd4 /scumm
parentb359c9281fe66f6488aad3f15b5c468a64343bae (diff)
downloadscummvm-rg350-b0f0bf8dc2b0c1604b664307b34bf210a31ce4e9.tar.gz
scummvm-rg350-b0f0bf8dc2b0c1604b664307b34bf210a31ce4e9.tar.bz2
scummvm-rg350-b0f0bf8dc2b0c1604b664307b34bf210a31ce4e9.zip
Add multi-block support for HE games.
svn-id: r15217
Diffstat (limited to 'scumm')
-rw-r--r--scumm/script_v72he.cpp27
1 files changed, 26 insertions, 1 deletions
diff --git a/scumm/script_v72he.cpp b/scumm/script_v72he.cpp
index 9875ad717f..6dbc833ff5 100644
--- a/scumm/script_v72he.cpp
+++ b/scumm/script_v72he.cpp
@@ -625,8 +625,33 @@ int ScummEngine_v72he::findObject(int x, int y, int *args) {
}
const byte *ScummEngine_v72he::findWrappedBlock(uint32 tag, const byte *ptr, int state, bool errorFlag) {
+ printf("findWrappedBlock: tag %x\n", tag);
if (READ_UINT32(ptr) == MKID('MULT')) {
- error("findWrappedBlock: multi blocks aren't implemented");
+ const byte *offs, *wrap;
+ uint32 size;
+
+ wrap = findResource(MKID('WRAP'), ptr);
+ if (wrap == NULL)
+ return NULL;
+
+ offs = findResourceData(MKID('OFFS'), wrap);
+ if (offs == NULL)
+ return NULL;
+
+ size = getResourceDataSize(offs) / 4;
+ if ((uint32)state >= (uint32)size)
+ return NULL;
+
+ offs += READ_LE_UINT32(offs + state * sizeof(uint32));
+ offs = findResourceData(tag, offs - 8);
+; if (offs)
+ return offs;
+
+ offs = findResourceData(MKID('DEFA'), ptr);
+ if (offs == NULL)
+ return NULL;
+
+ return findResourceData(tag, offs - 8);
} else {
return findResourceData(tag, ptr);
}