[Scummvm-cvs-logs] SF.net SVN: scummvm:[46739] scummvm/trunk/engines/sci/engine

thebluegr at users.sourceforge.net thebluegr at users.sourceforge.net
Wed Dec 30 13:55:24 CET 2009


Revision: 46739
          http://scummvm.svn.sourceforge.net/scummvm/?rev=46739&view=rev
Author:   thebluegr
Date:     2009-12-30 12:55:24 +0000 (Wed, 30 Dec 2009)

Log Message:
-----------
SCI32: added some of clone2727's changes to kArray and kString, and implemented kListIndexOf

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/kernel.cpp
    scummvm/trunk/engines/sci/engine/kernel.h
    scummvm/trunk/engines/sci/engine/kernel32.cpp

Modified: scummvm/trunk/engines/sci/engine/kernel.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel.cpp	2009-12-30 10:42:52 UTC (rev 46738)
+++ scummvm/trunk/engines/sci/engine/kernel.cpp	2009-12-30 12:55:24 UTC (rev 46739)
@@ -341,7 +341,7 @@
 	// SCI2 Kernel Functions
 	DEFUN("IsHiRes", kIsHiRes, ""),
 	DEFUN("Array", kArray, ".*"),
-	DEFUN("ListAt", kListAt, ".*"),
+	DEFUN("ListAt", kListAt, "li"),
 	DEFUN("String", kString, ".*"),
 	DEFUN("AddScreenItem", kAddScreenItem, "o"),
 	DEFUN("UpdateScreenItem", kUpdateScreenItem, "o"),
@@ -352,6 +352,7 @@
 	DEFUN("RepaintPlane", kRepaintPlane, "o"),
 	DEFUN("FrameOut", kFrameOut, ""),
 	DEFUN("ListEachElementDo", kListEachElementDo, ".*"),
+	DEFUN("ListIndexOf", kListIndexOf, "lo"),
 	DEFUN("OnMe", kOnMe, "iio.*"),
 
 	// SCI2.1 Kernel Functions

Modified: scummvm/trunk/engines/sci/engine/kernel.h
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel.h	2009-12-30 10:42:52 UTC (rev 46738)
+++ scummvm/trunk/engines/sci/engine/kernel.h	2009-12-30 12:55:24 UTC (rev 46739)
@@ -406,6 +406,7 @@
 reg_t kUpdatePlane(EngineState *s, int argc, reg_t *argv);
 reg_t kRepaintPlane(EngineState *s, int argc, reg_t *argv);
 reg_t kFrameOut(EngineState *s, int argc, reg_t *argv);
+reg_t kListIndexOf(EngineState *s, int argc, reg_t *argv);
 reg_t kListEachElementDo(EngineState *s, int argc, reg_t *argv);
 reg_t kOnMe(EngineState *s, int argc, reg_t *argv);
 

Modified: scummvm/trunk/engines/sci/engine/kernel32.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel32.cpp	2009-12-30 10:42:52 UTC (rev 46738)
+++ scummvm/trunk/engines/sci/engine/kernel32.cpp	2009-12-30 12:55:24 UTC (rev 46739)
@@ -389,7 +389,8 @@
 		return argv[1]; // We also have to return the handle
 		}
 	case 4: // Free
-		s->_segMan->freeArray(argv[1]);
+		if (!argv[1].isNull())
+			s->_segMan->freeArray(argv[1]);
 		return s->r_acc;
 	case 5: { // Fill
 		SciArray<reg_t> *array = s->_segMan->lookupArray(argv[1]);
@@ -519,7 +520,8 @@
 		return argv[1]; // We also have to return the handle
 		}
 	case 4: // Free
-		s->_segMan->freeString(argv[1]);
+		if (!argv[1].isNull())
+			s->_segMan->freeString(argv[1]);
 		return s->r_acc;
 	case 5: { // Fill
 		SciString *string = s->_segMan->lookupString(argv[1]);
@@ -597,10 +599,10 @@
 		// TODO: Store a formatted string in a specified string
 		warning("kString(PrintfBuf)");
 		break;
-	case 13: // atoi
-		// TODO: String to integer
-		warning("kString(atoi)");
-		break;
+	case 13: { // atoi
+		Common::String string = s->_segMan->getString(argv[1]);
+		return make_reg(0, (uint16)atoi(string.c_str()));
+		}
 	default:
 		error("Unknown kString subop %d", argv[0].toUint16());
 	}
@@ -631,7 +633,8 @@
 	//int16 control = 0;
 
 	// HACK: just draw the view on screen
-	s->_gui->drawCel(viewId, loopNo, celNo, leftPos, topPos, priority, 0);
+	if (viewId != 0xffff)
+		s->_gui->drawCel(viewId, loopNo, celNo, leftPos, topPos, priority, 0);
 
 	// TODO
 
@@ -651,7 +654,8 @@
 	//int16 control = 0;
 	
 	// HACK: just draw the view on screen
-	s->_gui->drawCel(viewId, loopNo, celNo, leftPos, topPos, priority, 0);
+	if (viewId != 0xffff)
+		s->_gui->drawCel(viewId, loopNo, celNo, leftPos, topPos, priority, 0);
 
 	warning("kUpdateScreenItem, object %04x:%04x, view %d, loop %d, cel %d, pri %d", PRINT_REG(viewObj), viewId, loopNo, celNo, priority);
 	return NULL_REG;
@@ -724,6 +728,27 @@
 	return NULL_REG;
 }
 
+reg_t kListIndexOf(EngineState *s, int argc, reg_t *argv) {
+	List *list = s->_segMan->lookupList(argv[0]);
+
+	reg_t curAddress = list->first;
+	Node *curNode = s->_segMan->lookupNode(curAddress);
+	reg_t curObject;
+	uint16 curIndex = 0;
+
+	while (curNode) {
+		curObject = curNode->value;
+		if (curObject == argv[1])
+			return make_reg(0, curIndex);
+
+		curAddress = curNode->succ;
+		curNode = s->_segMan->lookupNode(curAddress);
+		curIndex++;
+	}
+
+	return SIGNAL_REG;
+}
+
 reg_t kListEachElementDo(EngineState *s, int argc, reg_t *argv) {
 	List *list = s->_segMan->lookupList(argv[0]);
 


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