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

kirben at users.sourceforge.net kirben at users.sourceforge.net
Wed Oct 25 07:32:26 CEST 2006


Revision: 24491
          http://svn.sourceforge.net/scummvm/?rev=24491&view=rev
Author:   kirben
Date:     2006-10-24 22:32:15 -0700 (Tue, 24 Oct 2006)

Log Message:
-----------
Add class code used by scripts in Elvira 1

Modified Paths:
--------------
    scummvm/trunk/engines/agos/agos.cpp
    scummvm/trunk/engines/agos/agos.h
    scummvm/trunk/engines/agos/items.cpp
    scummvm/trunk/engines/agos/script_e1.cpp
    scummvm/trunk/engines/agos/subroutine.cpp

Modified: scummvm/trunk/engines/agos/agos.cpp
===================================================================
--- scummvm/trunk/engines/agos/agos.cpp	2006-10-25 01:53:07 UTC (rev 24490)
+++ scummvm/trunk/engines/agos/agos.cpp	2006-10-25 05:32:15 UTC (rev 24491)
@@ -330,10 +330,15 @@
 
 	_nextVgaTimerToProcess = 0;
 
-	_agosMenu = 0;
+	_classLine = 0;
 	_classMask = 0;
 	_classMode1 = 0;
 	_classMode2 = 0;
+	_currentLine = 0;
+	_currentTable = 0;
+	_findNextPtr = 0;
+
+	_agosMenu = 0;
 	_superRoomNumber = 0;
 	_wallOn = 0;
 

Modified: scummvm/trunk/engines/agos/agos.h
===================================================================
--- scummvm/trunk/engines/agos/agos.h	2006-10-25 01:53:07 UTC (rev 24490)
+++ scummvm/trunk/engines/agos/agos.h	2006-10-25 05:32:15 UTC (rev 24491)
@@ -314,7 +314,12 @@
 	char *_linePtrs[6];
 	int _boxCR;
 
+	SubroutineLine *_classLine;
 	uint _classMask, _classMode1, _classMode2;
+	Item *_findNextPtr;
+	Subroutine *_currentTable;
+	SubroutineLine *_currentLine;
+
 	int _agosMenu;
 	byte _textMenu[10];
 	uint _superRoomNumber;
@@ -628,6 +633,7 @@
 	void delTimeEvent(TimeEvent *te);
 
 	Item *findInByClass(Item *i, int16 m);
+	Item *nextInByClass(Item *i, int16 m);
 	Item *findMaster(int16 a, int16 n);
 	Item *nextMaster(Item *item, int16 a, int16 n);
 	int wordMatch(Item *item, int16 a, int16 n);

Modified: scummvm/trunk/engines/agos/items.cpp
===================================================================
--- scummvm/trunk/engines/agos/items.cpp	2006-10-25 01:53:07 UTC (rev 24490)
+++ scummvm/trunk/engines/agos/items.cpp	2006-10-25 05:32:15 UTC (rev 24491)
@@ -385,19 +385,33 @@
 
 Item *AGOSEngine::findInByClass(Item *i, int16 m) {
 	i = derefItem(i->child);
-
 	while (i) {
 		if (i->classFlags & m) {
-			//_findNextPtr = derefItem(i->next);
+			_findNextPtr = derefItem(i->next);
 			return i;
 		}
 		if (m == 0) {
-			//_findNextPtr = derefItem(i->next);
+			_findNextPtr = derefItem(i->next);
 			return i;
 		}
 		i = derefItem(i->next);
 	}
+	return NULL;
+}
 
+Item *AGOSEngine::nextInByClass(Item *i, int16 m) {
+	i = _findNextPtr;
+	while(i) {
+		if (i->classFlags & m) {
+			_findNextPtr = derefItem(i->next);
+			return i;
+		}
+		if (m == 0) {
+			_findNextPtr = derefItem(i->next);
+			return i;
+		}
+		i = derefItem(i->next);
+	}
 	return NULL;
 }
 

Modified: scummvm/trunk/engines/agos/script_e1.cpp
===================================================================
--- scummvm/trunk/engines/agos/script_e1.cpp	2006-10-25 01:53:07 UTC (rev 24490)
+++ scummvm/trunk/engines/agos/script_e1.cpp	2006-10-25 05:32:15 UTC (rev 24491)
@@ -344,8 +344,7 @@
 	int16 num = getVarOrWord();
 
 	_classMask = (cm != -1) ? 1 << cm : 0;
-	//_classLine = (SubroutineLine *)((uint32)_currentLine->next+(uint32)_currentTable);
-
+	_classLine = (SubroutineLine *)((byte *)_currentTable + _currentLine->next);
 	if (num == 1) {
 		_subjectItem = findInByClass(i, (1 << cm));
 		if (_subjectItem)

Modified: scummvm/trunk/engines/agos/subroutine.cpp
===================================================================
--- scummvm/trunk/engines/agos/subroutine.cpp	2006-10-25 01:53:07 UTC (rev 24490)
+++ scummvm/trunk/engines/agos/subroutine.cpp	2006-10-25 05:32:15 UTC (rev 24491)
@@ -522,14 +522,24 @@
 
 int AGOSEngine::startSubroutine(Subroutine *sub) {
 	int result = -1;
-	SubroutineLine *sl;
-	const byte *old_code_ptr;
+	SubroutineLine *sl = (SubroutineLine *)((byte *)sub + sub->first);
 
+	const byte *old_code_ptr = _codePtr;
+	Subroutine *old_currentTable = _currentTable;
+	SubroutineLine *old_currentLine = _currentLine;
+	SubroutineLine *old_classLine = _classLine;
+	int16 old_classMask = _classMask;
+	int16 old_classMode1 = _classMode1;
+	int16 old_classMode2 = _classMode2;
+
+	_classLine = 0;
+	_classMask = 0;
+	_classMode1 = 0;
+	_classMode2 = 0;
+
 	if (_startMainScript)
 		dumpSubroutine(sub);
 
-	old_code_ptr = _codePtr;
-
 	if (++_recursionDepth > 40)
 		error("Recursion error");
 
@@ -543,9 +553,10 @@
 			setBitFlag(171, false);
 	}
 
-	sl = (SubroutineLine *)((byte *)sub + sub->first);
-
+	_currentTable = sub;
+restart:
 	while ((byte *)sl != (byte *)sub) {
+		_currentLine = sl;
 		if (checkIfToRunSubroutineLine(sl, sub)) {
 			result = 0;
 			_codePtr = (byte *)sl;
@@ -558,19 +569,47 @@
 				printf("; %d\n", sub->id);
 			result = runScript();
 			if (result != 0) {
-				/* result -10 means restart subroutine */
-				if (result == -10) {
-					delay(0);							/* maybe leave control to the VGA */
-					sl = (SubroutineLine *)((byte *)sub + sub->first);
-					continue;
-				}
 				break;
 			}
 		}
 		sl = (SubroutineLine *)((byte *)sub + sl->next);
 	}
 
+	if (_classMode1) {
+		debug(0, "_classMode1");
+		_subjectItem = nextInByClass(_subjectItem, _classMask);
+		if (!_subjectItem) {
+			_classMode1 = 0;
+		} else {
+			sl = _classLine;	/* Rescanner */
+			goto restart;
+		}
+	}
+	if (_classMode2) {
+		debug(0, "_classMode2");
+		_objectItem = nextInByClass(_objectItem, _classMask);
+		if (!_objectItem) {
+			_classMode2 = 0;
+		} else {
+			sl = _classLine;	/* Rescanner */
+			goto restart;
+		}
+	}
+
+	/* result -10 means restart subroutine */
+	if (result == -10) {
+		sl = (SubroutineLine *)((byte *)sub + sub->first);
+		goto restart;
+	}
+
 	_codePtr = old_code_ptr;
+	_currentLine = old_currentLine;
+	_currentTable = old_currentTable;
+	_classLine = old_classLine;
+	_classMask = old_classMask;
+	_classMode1 = old_classMode2;
+	_classMode2 = old_classMode1;
+	_findNextPtr = 0;
 
 	_recursionDepth--;
 	return result;


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