[Scummvm-cvs-logs] CVS: scummvm/scumm actor.cpp,1.39,1.40 intern.h,2.9,2.10 script_v8.cpp,2.10,2.11 scumm.h,1.91,1.92 string.cpp,1.59,1.60 vars.cpp,1.8,1.9

Max Horn fingolfin at users.sourceforge.net
Mon Dec 23 10:31:02 CET 2002


Update of /cvsroot/scummvm/scummvm/scumm
In directory sc8-pr-cvs1:/tmp/cvs-serv24284

Modified Files:
	actor.cpp intern.h script_v8.cpp scumm.h string.cpp vars.cpp 
Log Message:
more V8 work

Index: actor.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/actor.cpp,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -d -r1.39 -r1.40
--- actor.cpp	23 Dec 2002 15:46:53 -0000	1.39
+++ actor.cpp	23 Dec 2002 18:30:11 -0000	1.40
@@ -1214,8 +1214,7 @@
 	 * Note: walk scripts aren't required to make the game
 	 * work as usual
 	 */
-#if 1
-	printf("ignoreTurns = %d\n", ignoreTurns);
+#if 0
 	if (walk_script != 0) {
 		int16 args[16];
 		args[0] = number;

Index: intern.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/intern.h,v
retrieving revision 2.9
retrieving revision 2.10
diff -u -d -r2.9 -r2.10
--- intern.h	23 Dec 2002 17:21:09 -0000	2.9
+++ intern.h	23 Dec 2002 18:30:11 -0000	2.10
@@ -400,6 +400,11 @@
 
 	virtual uint fetchScriptWord();
 	virtual int fetchScriptWordSigned();
+	
+	virtual int readVar(uint var);
+	virtual void writeVar(uint var, int value);
+
+	void decodeParseString(int m, int n);
 
 	/* Version 8 script opcodes */
 	void o8_unknown();

Index: script_v8.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v8.cpp,v
retrieving revision 2.10
retrieving revision 2.11
diff -u -d -r2.10 -r2.11
--- script_v8.cpp	23 Dec 2002 17:21:09 -0000	2.10
+++ script_v8.cpp	23 Dec 2002 18:30:11 -0000	2.11
@@ -22,6 +22,7 @@
 #include "stdafx.h"
 #include "scumm.h"
 #include "intern.h"
+#include "sound.h"
 
 /*
  * NO, we do NOT support CMI yet :-) This file is mostly a placeholder and a place
@@ -390,6 +391,135 @@
 	return (int32)fetchScriptWord();
 }
 
+int Scumm_v8::readVar(uint var)
+{
+	debug(9, "readvar(%d)", var);
+
+	if (!(var & 0xF0000000)) {
+		checkRange(_numVariables - 1, 0, var, "Variable %d out of range(r)");
+		return _vars[var];
+	}
+
+	if (var & 0x80000000) {
+		var &= 0x7FFFFFFF;
+		checkRange(_numBitVariables - 1, 0, var, "Bit variable %d out of range(r)");
+		return (_bitVars[var >> 3] & (1 << (var & 7))) ? 1 : 0;
+	}
+
+	if (var & 0x40000000) {
+		var &= 0xFFFFFFF;
+		checkRange(0x10, 0, var, "Local variable %d out of range(r)");
+		return vm.localvar[_currentScript][var];
+	}
+
+	error("Illegal varbits (r)");
+	return -1;
+}
+
+void Scumm_v8::writeVar(uint var, int value)
+{
+	debug(9, "writeVar(%d, %d)", var, value);
+
+	if (!(var & 0xF0000000)) {
+		checkRange(_numVariables - 1, 0, var, "Variable %d out of range(w)");
+
+		_vars[var] = value;
+
+		if ((_varwatch == (int)var) || (_varwatch == 0)) {
+			if (vm.slot[_currentScript].number < 100)
+				debug(1, "vars[%d] = %d (via script-%d)", var, value, vm.slot[_currentScript].number);
+			else
+				debug(1, "vars[%d] = %d (via room-%d-%d)", var, value, _currentRoom, vm.slot[_currentScript].number);
+		}
+		return;
+	}
+
+	if (var & 0x80000000) {
+		var &= 0x7FFFFFFF;
+		checkRange(_numBitVariables - 1, 0, var, "Bit variable %d out of range(w)");
+
+		if (value)
+			_bitVars[var >> 3] |= (1 << (var & 7));
+		else
+			_bitVars[var >> 3] &= ~(1 << (var & 7));
+		return;
+	}
+
+	if (var & 0x40000000) {
+		var &= 0xFFFFFFF;
+		checkRange(0x10, 0, var, "Local variable %d out of range(w)");
+		vm.localvar[_currentScript][var] = value;
+		return;
+	}
+
+	error("Illegal varbits (w)");
+}
+
+void Scumm_v8::decodeParseString(int m, int n)
+{
+	byte b;
+
+	b = fetchScriptByte();
+
+	switch (b) {
+	case 0xC8:
+		setStringVars(m);
+		if (n)
+			_actorToPrintStrFor = pop();
+		return;
+	case 0xC9:
+		_string[m].t_xpos = _string[m].xpos;
+		_string[m].t_ypos = _string[m].ypos;
+		_string[m].t_center = _string[m].center;
+		_string[m].t_overhead = _string[m].overhead;
+		_string[m].t_no_talk_anim = _string[m].no_talk_anim;
+		_string[m].t_right = _string[m].right;
+		_string[m].t_color = _string[m].color;
+		_string[m].t_charset = _string[m].charset;
+		return;
+	case 0xCA:
+		_string[m].ypos = pop();
+		_string[m].xpos = pop();
+		_string[m].overhead = false;
+		break;
+	case 0xCB:
+		_string[m].color = pop();
+		break;
+	case 0xCC:
+		_string[m].center = true;
+		_string[m].overhead = false;
+		break;
+	case 0xCD:		// SO_PRINT_CHARSET Set print character set
+		// FIXME - TODO
+		break;
+	case 0xCE:
+		_string[m].center = false;
+		_string[m].overhead = false;
+		break;
+	case 0xCF:
+		_string[m].overhead = true;
+		_string[m].no_talk_anim = false;
+		break;
+	case 0xD0:		// SO_PRINT_MUMBLE
+		error("decodeParseString: SO_PRINT_MUMBLE");
+		break;
+	case 0xD1:
+		// TODO - FIXME
+		_messagePtr = _scriptPointer;
+
+		byte buffer[1024];
+		_msgPtrToAdd = buffer;
+		_scriptPointer = _messagePtr = addMessageToStack(_messagePtr);
+		printf("Message(%d): '%s'\n", m, buffer);
+		break;
+	case 0xD2:		// SO_PRINT_WRAP Set print wordwrap
+		error("decodeParseString: SO_PRINT_MUMBLE");
+		break;
+	default:
+		error("decodeParseString: default case");
+	}
+}
+
 void Scumm_v8::o8_unknown()
 {
 	warning("Unknown opcode '%x' at %x", _opcode, _scriptPointer - _scriptOrgPointer);
@@ -482,42 +612,90 @@
 
 void Scumm_v8::o8_printLine()
 {
+	decodeParseString(0, 0);
 }
 
 void Scumm_v8::o8_printCursor()
 {
+	decodeParseString(1, 0);
 }
 
 void Scumm_v8::o8_printDebug()
 {
+	decodeParseString(2, 0);
 }
 
 void Scumm_v8::o8_printSystem()
 {
+	decodeParseString(3, 0);
 }
 
 void Scumm_v8::o8_cursorCommand()
 {
 	// TODO
 	byte subOp = fetchScriptByte();
+	int a, i;
+	int16 args[16];
+	
 	switch (subOp) {
 	case 0xDC:		// SO_CURSOR_ON Turn cursor on
+		_cursor.state = 1;
+		verbMouseOver(0);
+		break;
 	case 0xDD:		// SO_CURSOR_OFF Turn cursor off
+		_cursor.state = 0;
+		verbMouseOver(0);
+		break;
 	case 0xDE:		// SO_CURSOR_SOFT_ON Turn soft cursor on
+		_cursor.state++;
+		if (_cursor.state > 1)
+			error("Cursor state greater than 1 in script");
+		verbMouseOver(0);
+		break;
 	case 0xDF:		// SO_CURSOR_SOFT_OFF Turn soft cursor off
+		_cursor.state--;
+		verbMouseOver(0);
+		break;
 	case 0xE0:		// SO_USERPUT_ON
+		_userPut = 1;
+		break;
 	case 0xE1:		// SO_USERPUT_OFF
+		_userPut = 0;
+		break;
 	case 0xE2:		// SO_USERPUT_SOFT_ON
+		_userPut++;
+		break;
 	case 0xE3:		// SO_USERPUT_SOFT_OFF
+		_userPut--;
+		break;
 	case 0xE4:		// SO_CURSOR_IMAGE Set cursor image
+		{
+			int room, obj = popRoomAndObj(&room);
+			setCursorImg(obj, room, 1);
+		}
+		break;
 	case 0xE5:		// SO_CURSOR_HOTSPOT Set cursor hotspot
+		a = pop();
+		setCursorHotspot2(pop(), a);
+		break;
 	case 0xE6:		// SO_CURSOR_TRANSPARENT Set cursor transparent color
+		makeCursorColorTransparent(pop());
+		break;
 	case 0xE7:		// SO_CHARSET_SET
+		initCharset(pop());
+		break;
 	case 0xE8:		// SO_CHARSET_COLOR
+		getStackList(args, sizeof(args) / sizeof(args[0]));
+		for (i = 0; i < 16; i++)
+			charset._colorMap[i] = _charsetData[_string[1].t_charset][i] = (unsigned char)args[i];
+		break;
 	case 0xE9:		// SO_CURSOR_PUT
 	default:
 		error("o8_cursorCommand: default case %d", subOp);
 	}
+
+	_vars[VAR_CURSORSTATE] = _cursor.state;
+	_vars[VAR_USERPUT] = _userPut;
 }
 
 void Scumm_v8::o8_resourceRoutines()

Index: scumm.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.h,v
retrieving revision 1.91
retrieving revision 1.92
diff -u -d -r1.91 -r1.92
--- scumm.h	23 Dec 2002 00:23:36 -0000	1.91
+++ scumm.h	23 Dec 2002 18:30:11 -0000	1.92
@@ -484,8 +484,8 @@
 	void setResult(int result);
 	void push(int a);
 	int pop();
-	int readVar(uint var);
-	void writeVar(uint var, int value);
+	virtual int readVar(uint var);
+	virtual void writeVar(uint var, int value);
 	void runHook(int i);
 	bool isScriptInUse(int script);
 	int getStringLen(byte *ptr);

Index: string.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/string.cpp,v
retrieving revision 1.59
retrieving revision 1.60
diff -u -d -r1.59 -r1.60
--- string.cpp	23 Dec 2002 14:16:43 -0000	1.59
+++ string.cpp	23 Dec 2002 18:30:12 -0000	1.60
@@ -945,6 +945,10 @@
 			if (chr != 1 && chr != 2 && chr != 3 && chr != 8) {
 				ptr[num++] = *msg++;	// and some commands are followed by parameters to the functions below
 				ptr[num++] = *msg++;	// these are numbers of names, strings, verbs, variables, etc
+				if (_features & GF_AFTER_V8) {
+					ptr[num++] = *msg++;
+					ptr[num++] = *msg++;
+				}
 			}
 		}
 	}
@@ -961,20 +965,40 @@
 			chr = ptr[num++];
 			switch (chr) {
 			case 4:
-				addIntToStack(READ_LE_UINT16(ptr + num));
-				num += 2;
+				if (_features & GF_AFTER_V8) {
+					addIntToStack(READ_LE_UINT32(ptr + num));
+					num += 4;
+				} else {
+					addIntToStack(READ_LE_UINT16(ptr + num));
+					num += 2;
+				}
 				break;
 			case 5:
-				addVerbToStack(READ_LE_UINT16(ptr + num));
-				num += 2;
+				if (_features & GF_AFTER_V8) {
+					addVerbToStack(READ_LE_UINT32(ptr + num));
+					num += 4;
+				} else {
+					addVerbToStack(READ_LE_UINT16(ptr + num));
+					num += 2;
+				}
 				break;
 			case 6:
-				addNameToStack(READ_LE_UINT16(ptr + num));
-				num += 2;
+				if (_features & GF_AFTER_V8) {
+					addNameToStack(READ_LE_UINT32(ptr + num));
+					num += 4;
+				} else {
+					addNameToStack(READ_LE_UINT16(ptr + num));
+					num += 2;
+				}
 				break;
 			case 7:
-				addStringToStack(READ_LE_UINT16(ptr + num));
-				num += 2;
+				if (_features & GF_AFTER_V8) {
+					addStringToStack(READ_LE_UINT32(ptr + num));
+					num += 4;
+				} else {
+					addStringToStack(READ_LE_UINT16(ptr + num));
+					num += 2;
+				}
 				break;
 			case 3:
 			case 9:

Index: vars.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/vars.cpp,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- vars.cpp	23 Dec 2002 15:46:53 -0000	1.8
+++ vars.cpp	23 Dec 2002 18:30:12 -0000	1.9
@@ -211,6 +211,9 @@
 	VAR_VIRT_MOUSE_X = 5;
 	VAR_VIRT_MOUSE_Y = 6;
 
+	VAR_CURSORSTATE = 7;
+	VAR_USERPUT = 8;
+
 	VAR_CAMERA_POS_X = 9;
 	VAR_CAMERA_POS_Y = 10;
 	VAR_CAMERA_DEST_X = 11;





More information about the Scummvm-git-logs mailing list