[Scummvm-cvs-logs] SF.net SVN: scummvm: [24193] scummvm/trunk/engines/agos

kirben at users.sourceforge.net kirben at users.sourceforge.net
Sun Oct 8 10:35:40 CEST 2006


Revision: 24193
          http://svn.sourceforge.net/scummvm/?rev=24193&view=rev
Author:   kirben
Date:     2006-10-08 01:35:25 -0700 (Sun, 08 Oct 2006)

Log Message:
-----------
Add opcode for Elvira 1 and remove errors that don't occur in original games

Modified Paths:
--------------
    scummvm/trunk/engines/agos/agos.h
    scummvm/trunk/engines/agos/debug.h
    scummvm/trunk/engines/agos/items.cpp
    scummvm/trunk/engines/agos/rooms.cpp

Modified: scummvm/trunk/engines/agos/agos.h
===================================================================
--- scummvm/trunk/engines/agos/agos.h	2006-10-08 08:18:33 UTC (rev 24192)
+++ scummvm/trunk/engines/agos/agos.h	2006-10-08 08:35:25 UTC (rev 24193)
@@ -1068,6 +1068,7 @@
 	void oe1_setUserItem();
 	void oe1_getUserItem();
 	void oe1_whereTo();
+	void oe1_doorExit();
 	void oe1_clearUserItem();
 	void oe1_findMaster();
 	void oe1_nextMaster();

Modified: scummvm/trunk/engines/agos/debug.h
===================================================================
--- scummvm/trunk/engines/agos/debug.h	2006-10-08 08:18:33 UTC (rev 24192)
+++ scummvm/trunk/engines/agos/debug.h	2006-10-08 08:35:25 UTC (rev 24193)
@@ -64,7 +64,7 @@
 	NULL,
 	/* 28 */
 	NULL,
-	NULL,
+	"WJ|CHANCE",
 	"IJ|IS_PLAYER",
 	NULL,
 	/* 32 */
@@ -254,9 +254,9 @@
 	NULL,
 	/* 180 */
 	"IWW|WHERE_TO",
+	"IIW|DOOR_EXIT",
 	NULL,
 	NULL,
-	NULL,
 	/* 184 */
 	NULL,
 	NULL,

Modified: scummvm/trunk/engines/agos/items.cpp
===================================================================
--- scummvm/trunk/engines/agos/items.cpp	2006-10-08 08:18:33 UTC (rev 24192)
+++ scummvm/trunk/engines/agos/items.cpp	2006-10-08 08:35:25 UTC (rev 24193)
@@ -270,6 +270,7 @@
 	op[178] = &AGOSEngine::oe1_clearUserItem;
 
 	op[180] = &AGOSEngine::oe1_whereTo;
+	op[181] = &AGOSEngine::oe1_doorExit;
 
 	op[198] = &AGOSEngine::o_comment;
 
@@ -1072,47 +1073,30 @@
 
 void AGOSEngine::o_getParent() {
 	// 90: set minusitem to parent
-	Item *item = derefItem(getNextItemPtr()->parent);
-	switch (getVarOrByte()) {
-	case 0:
-		_objectItem = item;
-		break;
-	case 1:
-		_subjectItem = item;
-		break;
-	default:
-		error("o_getParent: invalid subcode");
-	}
+	Item *i = getNextItemPtr();
+	if (getVarOrByte() == 1)
+		_subjectItem = derefItem(i->parent);
+	else
+		_objectItem = derefItem(i->parent);
 }
 
 void AGOSEngine::o_getNext() {
 	// 91: set minusitem to next
-	Item *item = derefItem(getNextItemPtr()->next);
-	switch (getVarOrByte()) {
-	case 0:
-		_objectItem = item;
-		break;
-	case 1:
-		_subjectItem = item;
-		break;
-	default:
-		error("o_getNext: invalid subcode");
-	}
+	Item *i = getNextItemPtr();
+	if (getVarOrByte() == 1)
+		_subjectItem = derefItem(i->next);
+	else
+		_objectItem = derefItem(i->next);
 }
 
 void AGOSEngine::o_getChildren() {
 	// 92: set minusitem to child
-	Item *item = derefItem(getNextItemPtr()->child);
-	switch (getVarOrByte()) {
-	case 0:
-		_objectItem = item;
-		break;
-	case 1:
-		_subjectItem = item;
-		break;
-	default:
-		error("o_getChildren: invalid subcode");
-	}
+	Item *i = getNextItemPtr();
+	if (getVarOrByte() == 1)
+		_subjectItem = derefItem(i->child);
+
+	else
+		_objectItem = derefItem(i->child);
 }
 
 void AGOSEngine::o_picture() {
@@ -1972,8 +1956,8 @@
 void AGOSEngine::oe1_whereTo() {
 	// 180: where to
 	Item *i = getNextItemPtr();
-	int16 d = getVarOrByte();
-	int16 f = getVarOrByte();
+	int16 d = getVarOrWord();
+	int16 f = getVarOrWord();
 
 	if (f == 1)
 		_subjectItem = derefItem(getExitOf_e1(i, d));
@@ -1981,6 +1965,31 @@
 		_objectItem = derefItem(getExitOf_e1(i, d));
 }
 
+void AGOSEngine::oe1_doorExit() {
+	// 181: door exit
+	Item *x;
+	Item *a = (Item *)-1;
+	SubUserChain *c;
+	Item *i = getNextItemPtr();
+	Item *d = getNextItemPtr();
+	int16 f = getVarOrWord();
+	int16 ct = 0;
+
+
+	c = (SubUserChain *)findChildOfType(d, 8);
+	if (c)
+		a = derefItem(c->chChained);
+	while (ct < 6) {
+		x = derefItem(getDoorOf(i, ct));
+		if ((x == d) | (x == a)) {
+			writeVariable(f, ct);
+			return;
+		}
+		ct++;
+	}
+	writeVariable(f, 255);
+}
+
 void AGOSEngine::oe1_clearUserItem() {
 	// 178: clear user item
 	Item *i = getNextItemPtr();
@@ -3091,6 +3100,7 @@
 			if (opcode == 203) {
 				flag = true;
 				opcode = getVarOrWord();
+				debug(1, "runScript: opcode %d", opcode);
 				if (opcode == 10000)
 					return 0;
 			}

Modified: scummvm/trunk/engines/agos/rooms.cpp
===================================================================
--- scummvm/trunk/engines/agos/rooms.cpp	2006-10-08 08:18:33 UTC (rev 24192)
+++ scummvm/trunk/engines/agos/rooms.cpp	2006-10-08 08:35:25 UTC (rev 24193)
@@ -54,7 +54,7 @@
 	x = derefItem(g->dest[d]);
 	if (x == NULL)
 		return 0;
-	if (findChildOfType(x, 1))
+	if (isRoom(x))
 		return 0;
 	return itemPtrToID(x);
 }


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list