diff options
author | Travis Howell | 2006-10-04 07:10:22 +0000 |
---|---|---|
committer | Travis Howell | 2006-10-04 07:10:22 +0000 |
commit | aab8b9b2a26b29f8fe5c582ec236b7329280fc15 (patch) | |
tree | 130661fc8de4312206fc48d32f193347b5f3e206 /engines/agos/res.cpp | |
parent | 863bed3fd034ab9e7a93d5426aab5c00297f4340 (diff) | |
download | scummvm-rg350-aab8b9b2a26b29f8fe5c582ec236b7329280fc15.tar.gz scummvm-rg350-aab8b9b2a26b29f8fe5c582ec236b7329280fc15.tar.bz2 scummvm-rg350-aab8b9b2a26b29f8fe5c582ec236b7329280fc15.zip |
Fix initial resource loading in Elvira 2
svn-id: r24106
Diffstat (limited to 'engines/agos/res.cpp')
-rw-r--r-- | engines/agos/res.cpp | 73 |
1 files changed, 55 insertions, 18 deletions
diff --git a/engines/agos/res.cpp b/engines/agos/res.cpp index a0dfa8d86b..d2ee19e951 100644 --- a/engines/agos/res.cpp +++ b/engines/agos/res.cpp @@ -262,7 +262,7 @@ void AGOSEngine::readGamePcText(Common::File *in) { void AGOSEngine::readItemFromGamePc(Common::File *in, Item *item) { uint32 type; - if (getGameType() == GType_ELVIRA || getGameType() == GType_ELVIRA2) { + if (getGameType() == GType_ELVIRA) { item->itemName = (uint16)in->readUint32BE(); item->adjective = in->readUint16BE(); item->noun = in->readUint16BE(); @@ -276,6 +276,17 @@ void AGOSEngine::readItemFromGamePc(Common::File *in, Item *item) { in->readUint16BE(); item->classFlags = in->readUint16BE(); item->children = NULL; + } else if (getGameType() == GType_ELVIRA2) { + item->itemName = (uint16)in->readUint32BE(); + item->adjective = in->readUint16BE(); + item->noun = in->readUint16BE(); + item->state = in->readUint16BE(); + item->sibling = (uint16)fileReadItemID(in); + item->child = (uint16)fileReadItemID(in); + item->parent = (uint16)fileReadItemID(in); + in->readUint16BE(); + item->classFlags = in->readUint16BE(); + item->children = NULL; } else { item->adjective = in->readUint16BE(); item->noun = in->readUint16BE(); @@ -299,7 +310,7 @@ void AGOSEngine::readItemFromGamePc(Common::File *in, Item *item) { void AGOSEngine::readItemChildren(Common::File *in, Item *item, uint type) { if (type == 1) { - if (getGameType() == GType_ELVIRA || getGameType() == GType_ELVIRA2) { + if (getGameType() == GType_ELVIRA) { SubRoom *subRoom = (SubRoom *)allocateChildBlock(item, 1, sizeof(SubRoom)); subRoom->roomShort = in->readUint32BE(); subRoom->roomLong = in->readUint32BE(); @@ -325,7 +336,7 @@ void AGOSEngine::readItemChildren(Common::File *in, Item *item, uint type) { subRoom->roomExit[k++] = (uint16)fileReadItemID(in); } } else if (type == 2) { - if (getGameType() == GType_ELVIRA || getGameType() == GType_ELVIRA2) { + if (getGameType() == GType_ELVIRA) { SubObject *subObject = (SubObject *)allocateChildBlock(item, 2, sizeof(SubObject)); in->readUint32BE(); in->readUint32BE(); @@ -355,22 +366,48 @@ void AGOSEngine::readItemChildren(Common::File *in, Item *item, uint type) { if (fr & (1 << i)) subObject->objectFlagValue[k++] = in->readUint16BE(); - subObject->objectName = (uint16)in->readUint32BE(); + if (getGameType() != GType_ELVIRA2) + subObject->objectName = (uint16)in->readUint32BE(); } } else if (type == 4) { - SubGenExit *genExit = (SubGenExit *)allocateChildBlock(item, 4, sizeof(SubGenExit)); - genExit->dest[0] = (uint16)fileReadItemID(in); - genExit->dest[1] = (uint16)fileReadItemID(in); - genExit->dest[2] = (uint16)fileReadItemID(in); - genExit->dest[3] = (uint16)fileReadItemID(in); - genExit->dest[4] = (uint16)fileReadItemID(in); - genExit->dest[5] = (uint16)fileReadItemID(in); - fileReadItemID(in); - fileReadItemID(in); - fileReadItemID(in); - fileReadItemID(in); - fileReadItemID(in); - fileReadItemID(in); + if (getGameType() == GType_ELVIRA2) { + uint i, j, k, size; + uint id, x, y, z; + SubSuperRoom *subSuperRoom; + + id = in->readUint16BE(); + x = in->readUint16BE(); + y = in->readUint16BE(); + z = in->readUint16BE(); + + j = x * y * z; + size = SubSuperRoom_SIZE; + for (i = 0; i != j; i++) + size += sizeof(subSuperRoom->roomExit[0]); + + subSuperRoom = (SubSuperRoom *)allocateChildBlock(item, 4, size); + subSuperRoom->subroutine_id = id; + subSuperRoom->roomX = x; + subSuperRoom->roomY = y; + subSuperRoom->roomZ = z; + + for (i = k = 0; i != j; i++) + subSuperRoom->roomExit[k++] = in->readUint16BE(); + } else if (getGameType() == GType_ELVIRA) { + SubGenExit *genExit = (SubGenExit *)allocateChildBlock(item, 4, sizeof(SubGenExit)); + genExit->dest[0] = (uint16)fileReadItemID(in); + genExit->dest[1] = (uint16)fileReadItemID(in); + genExit->dest[2] = (uint16)fileReadItemID(in); + genExit->dest[3] = (uint16)fileReadItemID(in); + genExit->dest[4] = (uint16)fileReadItemID(in); + genExit->dest[5] = (uint16)fileReadItemID(in); + fileReadItemID(in); + fileReadItemID(in); + fileReadItemID(in); + fileReadItemID(in); + fileReadItemID(in); + fileReadItemID(in); + } } else if (type == 7) { SubContainer *container = (SubContainer *)allocateChildBlock(item, 7, sizeof(SubContainer)); container->volume = in->readUint16BE(); @@ -383,7 +420,7 @@ void AGOSEngine::readItemChildren(Common::File *in, Item *item, uint type) { setUserFlag(item, 1, in->readUint16BE()); setUserFlag(item, 2, in->readUint16BE()); setUserFlag(item, 3, in->readUint16BE()); - if (getGameType() == GType_ELVIRA || getGameType() == GType_ELVIRA2) { + if (getGameType() == GType_ELVIRA) { setUserFlag(item, 4, in->readUint16BE()); setUserFlag(item, 5, in->readUint16BE()); setUserFlag(item, 6, in->readUint16BE()); |