aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTravis Howell2006-11-06 14:28:19 +0000
committerTravis Howell2006-11-06 14:28:19 +0000
commit1b926fee107cef0e1bc525a7a082121f1d000881 (patch)
tree62d6d47e782a7dca338e6eb4a815f9a11d7135a2
parent415ec670564a328a67648ddae7c42a7142a2f053 (diff)
downloadscummvm-rg350-1b926fee107cef0e1bc525a7a082121f1d000881.tar.gz
scummvm-rg350-1b926fee107cef0e1bc525a7a082121f1d000881.tar.bz2
scummvm-rg350-1b926fee107cef0e1bc525a7a082121f1d000881.zip
Add inherit code for earlier games
svn-id: r24640
-rw-r--r--engines/agos/intern.h24
-rw-r--r--engines/agos/items.cpp15
-rw-r--r--engines/agos/res.cpp4
-rw-r--r--engines/agos/script.cpp4
-rw-r--r--engines/agos/script_e1.cpp4
5 files changed, 32 insertions, 19 deletions
diff --git a/engines/agos/intern.h b/engines/agos/intern.h
index 7eed262f1c..14cd9275fb 100644
--- a/engines/agos/intern.h
+++ b/engines/agos/intern.h
@@ -66,31 +66,31 @@ struct SubPlayer : Child {
int32 score;
};
-struct SubUserChain : Child {
+struct SubGenExit : Child {
uint16 subroutine_id;
- uint16 chChained;
+ uint16 dest[6];
};
-struct SubUserInherit : Child {
+struct SubContainer : Child {
uint16 subroutine_id;
- uint16 inMaster;
+ uint16 volume;
+ uint16 flags;
};
-struct SubUserFlag : Child {
+struct SubChain : Child {
uint16 subroutine_id;
- uint16 userFlags[8];
- uint16 userItems[1];
+ uint16 chChained;
};
-struct SubContainer : Child {
+struct SubUserFlag : Child {
uint16 subroutine_id;
- uint16 volume;
- uint16 flags;
+ uint16 userFlags[8];
+ uint16 userItems[1];
};
-struct SubGenExit : Child {
+struct SubInherit : Child {
uint16 subroutine_id;
- uint16 dest[6];
+ uint16 inMaster;
};
enum {
diff --git a/engines/agos/items.cpp b/engines/agos/items.cpp
index 0c111021ed..a7c8fa3aa5 100644
--- a/engines/agos/items.cpp
+++ b/engines/agos/items.cpp
@@ -110,10 +110,23 @@ void AGOSEngine::createPlayer() {
}
Child *AGOSEngine::findChildOfType(Item *i, uint type) {
+ Item *b = NULL;
Child *child = i->children;
- for (; child; child = child->next)
+
+ for (; child; child = child->next) {
if (child->type == type)
return child;
+ if (child->type == 255)
+ b = derefItem(((SubInherit *)(child))->inMaster);
+ }
+ if (b) {
+ child = b->children;
+ for (; child; child = child->next) {
+ if (child->type == type)
+ return child;
+ }
+ }
+
return NULL;
}
diff --git a/engines/agos/res.cpp b/engines/agos/res.cpp
index d26957fdd6..503e707766 100644
--- a/engines/agos/res.cpp
+++ b/engines/agos/res.cpp
@@ -432,7 +432,7 @@ void AGOSEngine::readItemChildren(Common::SeekableReadStream *in, Item *item, ui
container->volume = in->readUint16BE();
container->flags = in->readUint16BE();
} else if (type == 8) {
- SubUserChain *chain = (SubUserChain *)allocateChildBlock(item, 8, sizeof(SubUserChain));
+ SubChain *chain = (SubChain *)allocateChildBlock(item, 8, sizeof(SubChain));
chain->chChained = (uint16)fileReadItemID(in);
} else if (type == 9) {
setUserFlag(item, 0, in->readUint16BE());
@@ -451,7 +451,7 @@ void AGOSEngine::readItemChildren(Common::SeekableReadStream *in, Item *item, ui
fileReadItemID(in);
}
} else if (type == 255) {
- SubUserInherit *inherit = (SubUserInherit *)allocateChildBlock(item, 255, sizeof(SubUserInherit));
+ SubInherit *inherit = (SubInherit *)allocateChildBlock(item, 255, sizeof(SubInherit));
inherit->inMaster = (uint16)fileReadItemID(in);
} else {
error("readItemChildren: invalid type %d", type);
diff --git a/engines/agos/script.cpp b/engines/agos/script.cpp
index c79f0b9902..a59037b15f 100644
--- a/engines/agos/script.cpp
+++ b/engines/agos/script.cpp
@@ -1105,10 +1105,10 @@ Child *nextSub(Child *sub, int16 key) {
}
void AGOSEngine::synchChain(Item *i) {
- SubUserChain *c = (SubUserChain *)findChildOfType(i, 8);
+ SubChain *c = (SubChain *)findChildOfType(i, 8);
while (c) {
setItemState(derefItem(c->chChained), i->state);
- c = (SubUserChain *)nextSub((Child *)c, 8);
+ c = (SubChain *)nextSub((Child *)c, 8);
}
}
diff --git a/engines/agos/script_e1.cpp b/engines/agos/script_e1.cpp
index 42d86fe18a..06fae926ad 100644
--- a/engines/agos/script_e1.cpp
+++ b/engines/agos/script_e1.cpp
@@ -445,13 +445,13 @@ void AGOSEngine::oe1_doorExit() {
// 181: door exit
Item *x;
Item *a = (Item *)-1;
- SubUserChain *c;
+ SubChain *c;
Item *i = getNextItemPtr();
Item *d = getNextItemPtr();
int16 f = getVarOrWord();
int16 ct = 0;
- c = (SubUserChain *)findChildOfType(d, 8);
+ c = (SubChain *)findChildOfType(d, 8);
if (c)
a = derefItem(c->chChained);
while (ct < 6) {