[Scummvm-cvs-logs] CVS: scummvm/scumm actor.cpp,1.271,1.272 akos.cpp,1.141,1.142 debugger.cpp,1.127,1.128 intern.h,2.202,2.203 resource.cpp,1.255,1.256 script.cpp,1.183,1.184 script_v72he.cpp,2.27,2.28 script_v7he.cpp,2.49,2.50 scumm.cpp,1.154,1.155 scumm.h,1.456,1.457

Travis Howell kirben at users.sourceforge.net
Fri Aug 27 20:20:21 CEST 2004


Update of /cvsroot/scummvm/scummvm/scumm
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22119/scumm

Modified Files:
	actor.cpp akos.cpp debugger.cpp intern.h resource.cpp 
	script.cpp script_v72he.cpp script_v7he.cpp scumm.cpp scumm.h 
Log Message:

akos should queue commmands and executate after drawing costumes (Caused race issues in HE games).
Remove some duplciate code
Enable from HE games
Add a few stubs for some additional akos codes


Index: actor.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/actor.cpp,v
retrieving revision 1.271
retrieving revision 1.272
diff -u -d -r1.271 -r1.272
--- actor.cpp	22 Aug 2004 08:53:53 -0000	1.271
+++ actor.cpp	28 Aug 2004 03:18:49 -0000	1.272
@@ -962,6 +962,9 @@
 	}
 	
 	delete [] actors;
+
+	if (_features & GF_NEW_COSTUMES)
+		akos_processQueue();
 }
 
 // Used in Scumm v8, to allow the verb coin to be drawn over the inventory

Index: akos.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/akos.cpp,v
retrieving revision 1.141
retrieving revision 1.142
diff -u -d -r1.141 -r1.142
--- akos.cpp	26 Aug 2004 14:28:41 -0000	1.141
+++ akos.cpp	28 Aug 2004 03:18:51 -0000	1.142
@@ -29,6 +29,8 @@
 #include "scumm/imuse_digi/dimuse.h"
 #include "scumm/sound.h"
 
+#include "common/util.h"
+
 namespace Scumm {
 
 #if !defined(__GNUC__)
@@ -59,6 +61,7 @@
 	AKC_SetVar = 0xC010,
 	AKC_CmdQue3 = 0xC015,
 	AKC_ComplexChan = 0xC020,
+	AKC_Unk3 = 0xC021,
 	AKC_Unk2 = 0xC025,
 	AKC_Jump = 0xC030,
 	AKC_JumpIfSet = 0xC031,
@@ -96,6 +99,7 @@
 	AKC_SkipG = 0xC094,
 	AKC_SkipGE = 0xC095,
 	AKC_ClearFlag = 0xC09F,
+	AKC_Unk4 = 0xC0A1,
 	AKC_EndSeq = 0xC0FF
 };
 
@@ -282,6 +286,9 @@
 	if (code == AKC_Return || code == AKC_EndSeq)
 		return 0;
 
+	if (code == 0xC025) 
+		error("akos_drawLimb: unsupported case %x", code);
+
 	if (code != AKC_ComplexChan) {
 		off = akof + (code & 0xFFF);
 
@@ -1163,6 +1170,7 @@
 			case AKC_Flip:
 			case AKC_Jump:
 			case AKC_StartAnimInActor:
+			case AKC_Unk4:
 				curpos += 4;
 				break;
 			case AKC_ComplexChan:
@@ -1173,10 +1181,14 @@
 					curpos += (aksq[curpos] & 0x80) ? 2 : 1;
 				}
 				break;
+			case AKC_Unk3:
+				curpos += aksq[curpos + 2];
+				break;
 			default:
 				if ((code & 0xC000) == 0xC000)
 					error("akos_increaseAnim: invalid code %x", code);
 				curpos += (code & 0x8000) ? 2 : 1;
+				break;
 			}
 			break;
 		case 2:
@@ -1296,6 +1308,7 @@
 		case AKC_ComplexChan:
 		case AKC_Unk1:
 		case AKC_Unk2:
+		case AKC_Unk3:
 			break;
 
 		case AKC_Cmd3:
@@ -1314,6 +1327,9 @@
 				flag_value = true;
 			continue;
 
+		case AKC_Unk4:
+			curpos = GUW(2);
+			break;
 		default:
 			if ((code & 0xC000) == 0xC000)
 				error("Undefined uSweat token %X", code);
@@ -1332,56 +1348,84 @@
 }
 
 void ScummEngine::akos_queCommand(byte cmd, Actor *a, int param_1, int param_2) {
-	switch (cmd) {
-	case 1:
-		a->putActor(0, 0, 0);
-		break;
-	case 2:
-		warning("unimplemented akos_queCommand(2,%d,%d,%d)", a->number, param_1, param_2);
-		// start script token in actor
-		break;
-	case 3:
-		if (param_1 != 0) {
-			if (_features & GF_DIGI_IMUSE)
-				_imuseDigital->startSfx(param_1, 63);
-			else
-				_sound->addSoundToQueue(param_1);
-		}
-		break;
-	case 4:
-		a->startAnimActor(param_1);
-		break;
-	case 5:
-		a->forceClip = param_1;
-		break;
-	case 6:
-		a->offs_x = param_1;
-		a->offs_y = param_2;
-		break;
-	case 7:
-		if (param_1 != 0) {
-			if (_imuseDigital) {
-				_imuseDigital->setVolume(param_1, param_2);
+	if (_queuePos > 32)
+		error("overflow");
+;
+	_queuePos++;
+	_queueCmd[_queuePos] = cmd;
+	_queueActor[_queuePos] = a->number;
+	_queueParam1[_queuePos] = param_1;
+	_queueParam2[_queuePos] = param_2;
+
+
+	warning("_queuePos %d", _queuePos);
+}
+
+
+
+void ScummEngine::akos_processQueue() {
+	byte cmd;
+	int actor, param_1, param_2;
+
+	while (_queuePos) {
+		cmd = _queueCmd[_queuePos];	
+		actor = _queueActor[_queuePos];
+		param_1 = _queueParam1[_queuePos];
+		param_2 = _queueParam2[_queuePos];
+		_queuePos--;
+
+		Actor *a = derefActor(actor, "akos_processQueue");
+
+		switch (cmd) {
+		case 1:
+			a->putActor(0, 0, 0);
+			break;
+		case 2:
+			warning("unimplemented akos_queCommand(2,%d,%d,%d)", a->number, param_1, param_2);
+			// start script token in actor
+			break;
+		case 3:
+			if (param_1 != 0) {
+				if (_features & GF_DIGI_IMUSE)
+					_imuseDigital->startSfx(param_1, 63);
+				else
+					_sound->addSoundToQueue(param_1);
 			}
-		}
-		break;
-	case 8:
-		if (param_1 != 0) {
-			if (_imuseDigital) {
-				_imuseDigital->setPan(param_1, param_2);
+			break;
+		case 4:
+			a->startAnimActor(param_1);
+			break;
+		case 5:
+			a->forceClip = param_1;
+			break;
+		case 6:
+			a->offs_x = param_1;
+			a->offs_y = param_2;
+			break;
+		case 7:
+			if (param_1 != 0) {
+				if (_imuseDigital) {
+					_imuseDigital->setVolume(param_1, param_2);
+				}
 			}
-		}
-		break;
-	case 9:
-		if (param_1 != 0) {
-			if (_imuseDigital) {
-				_imuseDigital->setPriority(param_1, param_2);
+			break;
+		case 8:
+			if (param_1 != 0) {
+				if (_imuseDigital) {
+					_imuseDigital->setPan(param_1, param_2);
+				}
 			}
+			break;
+		case 9:
+			if (param_1 != 0) {
+				if (_imuseDigital) {
+					_imuseDigital->setPriority(param_1, param_2);
+				}
+			}
+			break;
+		default:
+			warning("akos_queCommand(%d,%d,%d,%d)", cmd, a->number, param_1, param_2);
 		}
-		break;
-
-	default:
-		warning("akos_queCommand(%d,%d,%d,%d)", cmd, a->number, param_1, param_2);
 	}
 }
 

Index: debugger.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/debugger.cpp,v
retrieving revision 1.127
retrieving revision 1.128
diff -u -d -r1.127 -r1.128
--- debugger.cpp	15 Aug 2004 14:40:02 -0000	1.127
+++ debugger.cpp	28 Aug 2004 03:18:51 -0000	1.128
@@ -364,7 +364,7 @@
 bool ScummDebugger::Cmd_Actor(int argc, const char **argv) {
 	Actor *a;
 	int actnum;
-	int value = 0;
+	int value = 0, value2 = 0;
 
 	if (argc < 3) {
 		DebugPrintf("Syntax: actor <actornum> <command> <parameter>\n");
@@ -380,8 +380,15 @@
 	a = &_vm->_actors[actnum];
 	if (argc > 3)
 		value = atoi(argv[3]);
+	if (argc > 4)
+		value2 = atoi(argv[4]);
 
-	if (!strcmp(argv[2], "ignoreboxes")) {
+	if (!strcmp(argv[2], "animvar")) {
+
+		a->setAnimVar(value, value2);
+		DebugPrintf("Actor[%d].animVar[%d] = %d\n", actnum, value, a->getAnimVar(value));
+
+	} else if (!strcmp(argv[2], "ignoreboxes")) {
 		a->ignoreBoxes = (value > 0);
 		DebugPrintf("Actor[%d].ignoreBoxes = %d\n", actnum, a->ignoreBoxes);
 	} else if (!strcmp(argv[2], "x")) {

Index: intern.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/intern.h,v
retrieving revision 2.202
retrieving revision 2.203
diff -u -d -r2.202 -r2.203
--- intern.h	26 Aug 2004 14:56:10 -0000	2.202
+++ intern.h	28 Aug 2004 03:18:51 -0000	2.203
@@ -711,7 +711,6 @@
 	void o72_getPixel();
 	void o72_pickVarRandom();
 	void o72_redimArray();
-	void o72_stringLen();
 	void o72_readINI();
 	void o72_unknownF4();
 	void o72_unknownF8();

Index: resource.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/resource.cpp,v
retrieving revision 1.255
retrieving revision 1.256
diff -u -d -r1.255 -r1.256
--- resource.cpp	26 Aug 2004 23:30:27 -0000	1.255
+++ resource.cpp	28 Aug 2004 03:18:52 -0000	1.256
@@ -992,19 +992,17 @@
 		total_size = _fileHandle.readUint32BE();
 		_fileHandle.read(createResource(type, idx, total_size), total_size - 8);
 		return 1;
+	} else if (basetag == MKID('HDHS')) {
+		_fileHandle.seek(-12, SEEK_CUR);
+		total_size = _fileHandle.readUint32BE();
+		_fileHandle.read(createResource(type, idx, total_size), total_size - 8);
+		return 1;
 	} else if (basetag == MKID('TALK')) {
-		debugC(DEBUG_SOUND, "Found base tag TALK in sound %d, size %d", idx, total_size);
-		debugC(DEBUG_SOUND, "It was at position %d", _fileHandle.pos());
-
 		_fileHandle.seek(-12, SEEK_CUR);
 		total_size = _fileHandle.readUint32BE();
 		_fileHandle.read(createResource(type, idx, total_size), total_size - 8);
 		return 1;
 	} else if (basetag == MKID('DIGI')) {
-		// Use in Putt-Putt Demo
-		debugC(DEBUG_SOUND, "Found base tag DIGI in sound %d, size %d", idx, total_size);
-		debugC(DEBUG_SOUND, "It was at position %d", _fileHandle.pos());
-
 		_fileHandle.seek(-12, SEEK_CUR);
 		total_size = _fileHandle.readUint32BE();
 		_fileHandle.read(createResource(type, idx, total_size), total_size - 8);

Index: script.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script.cpp,v
retrieving revision 1.183
retrieving revision 1.184
diff -u -d -r1.183 -r1.184
--- script.cpp	26 Aug 2004 23:30:27 -0000	1.183
+++ script.cpp	28 Aug 2004 03:18:52 -0000	1.184
@@ -516,7 +516,7 @@
 	}
 
 	if (var & 0x8000) {
-		if (_gameId == GID_PAJAMA) {
+		if (_gameId == GID_PAJAMA || _gameId == GID_WATER) {
 			var &= 0xFFF;
 			checkRange(_numRoomVariables - 1, 0, var, "Room variable %d out of range(w)");
 			return _roomVars[var];
@@ -599,7 +599,7 @@
 	}
 
 	if (var & 0x8000) {
-		if (_gameId == GID_PAJAMA) {
+		if (_gameId == GID_PAJAMA || _gameId == GID_WATER) {
 			var &= 0xFFF;
 			checkRange(_numRoomVariables - 1, 0, var, "Room variable %d out of range(w)");
 			_roomVars[var] = value;

Index: script_v72he.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v72he.cpp,v
retrieving revision 2.27
retrieving revision 2.28
diff -u -d -r2.27 -r2.28
--- script_v72he.cpp	26 Aug 2004 14:56:10 -0000	2.27
+++ script_v72he.cpp	28 Aug 2004 03:18:52 -0000	2.28
@@ -343,7 +343,7 @@
 		/* EC */
 		OPCODE(o6_invalid),
 		OPCODE(o6_invalid),
-		OPCODE(o72_stringLen),
+		OPCODE(o7_stringLen),
 		OPCODE(o6_invalid),
 		/* F0 */
 		OPCODE(o6_invalid),
@@ -1142,24 +1142,6 @@
 }
 
 
-void ScummEngine_v72he::o72_stringLen() {
-	int a, len;
-	byte *addr;
-
-	a = pop();
-
-	addr = getStringAddress(a);
-	if (!addr) {
-		// FIXME: should be error here
-		warning("o72_stringLen: Reference to zeroed array pointer (%d)", a);
-		push(0);
-		return;
-	}
-
-	len = strlen((char *)getStringAddress(a));
-	push(len);
-}
-
 void ScummEngine_v72he::o72_readINI() {
 	byte name[100];
 	int type;
@@ -1185,16 +1167,22 @@
 
 void ScummEngine_v72he::o72_unknownF4() {
 	byte b;
+	byte name[256], name2[1024];
+
 	b = fetchScriptByte();
 
 	switch (b) {
 	case 6:
 		pop();
+		copyScriptString(name);
 		break;
+		warning("o72_unknownF4 stub (%s)", name);
 	case 7:
+		copyScriptString(name2);
+		copyScriptString(name);
+		warning("o72_unknownF4 stub (%s, %s)", name, name2);
 		break;
 	}
-	warning("o72_unknownF4 stub");
 }
 
 void ScummEngine_v72he::o72_unknownFA() {

Index: script_v7he.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v7he.cpp,v
retrieving revision 2.49
retrieving revision 2.50
diff -u -d -r2.49 -r2.50
--- script_v7he.cpp	26 Aug 2004 14:28:41 -0000	2.49
+++ script_v7he.cpp	28 Aug 2004 03:18:52 -0000	2.50
@@ -41,12 +41,6 @@
 
 namespace Scumm {
 
-// Compatibility notes:
-//
-// FREDDEMO (freddemo)
-//     stringLen is completely different
-//     unknownF4 is completely different
-
 #define OPCODE(x)	{ &ScummEngine_v7he::x, #x }
 
 void ScummEngine_v7he::setupOpcodes() {
@@ -421,9 +415,14 @@
 	switch (subOp) {
 	case 0x13:		// HE 7.2 (Not all games)
 	case 0x14:
-		// Maybe load cursor image
+		// Loads cursors from another resource
+		// Use old cursors for now
 		a = pop();
-		warning("o7_cursorCommand: case %d (%d)", subOp, a);
+		if (a == 2)
+			_Win32ResExtractor->setCursor(102);
+		else if (a == 5)
+			_Win32ResExtractor->setCursor(103);
+		debug(1, "o7_cursorCommand: case %x (%d)", subOp, a);
 		break;
 	case 0x90:		// SO_CURSOR_ON Turn cursor on
 		_cursor.state = 1;
@@ -718,20 +717,16 @@
 }
 
 void ScummEngine_v7he::o7_stringLen() {
-	int a, len;
+	int id, len;
 	byte *addr;
 
-	a = pop();
+	id = pop();
 
-	addr = getStringAddress(a);
-	if (!addr) {
-		// FIXME: should be error here
-		warning("o7_stringLen: Reference to zeroed array pointer (%d)", a);
-		push(0);
-		return;
-	}
+	addr = getStringAddress(id);
+	if (!addr)
+		error("o72_stringLen: Reference to zeroed array pointer (%d)", id);
 
-	len = stringLen(addr);
+	len = strlen((char *)getStringAddress(id));
 	push(len);
 }
 

Index: scumm.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.cpp,v
retrieving revision 1.154
retrieving revision 1.155
diff -u -d -r1.154 -r1.155
--- scumm.cpp	26 Aug 2004 23:30:27 -0000	1.154
+++ scumm.cpp	28 Aug 2004 03:18:52 -0000	1.155
@@ -277,7 +277,6 @@
 	{"pajama", "Pajama Sam 1: No Need to Hide When It's Dark Outside", GID_PAJAMA, 6, 72, MDT_NONE,
 	 GF_NEW_OPCODES | GF_USE_KEY | GF_HUMONGOUS | GF_NEW_COSTUMES, 0, 0},
 
-#ifdef HEGAMES
 	// Humongous Entertainment Scumm Version 9.0 ?  Scummsys.90
 	{"kinddemo", "Big Thinkers Kindergarten (Demo)", GID_PAJAMA, 6, 90, MDT_NONE,
 	 GF_NEW_OPCODES | GF_USE_KEY | GF_HUMONGOUS | GF_NEW_COSTUMES, 0, 0},
@@ -304,6 +303,7 @@
 	{"chase", "Spy Fox in Cheese Chase Game", GID_HEGAME, 6, 90, MDT_NONE,
 	 GF_NEW_OPCODES | GF_USE_KEY | GF_HUMONGOUS | GF_NEW_COSTUMES, 0, 0},
 
+#ifdef HEGAMES
 	// Humongous Entertainment Scumm Version 9.8 ?  Scummsys.98
 	// these and later games can easily be identified by the .(a) file instead of a .he1
 	// and INIB chunk in the .he0
@@ -659,6 +659,12 @@
 	_heSndSoundFreq = 0;
 	memset(_timers, 0, sizeof(_timers));
 
+	memset(_queueCmd, 0, sizeof(_queueCmd));
+	memset(_queueActor, 0, sizeof(_queueActor));
+	memset(_queueParam1, 0, sizeof(_queueParam1));
+	memset(_queueParam2, 0, sizeof(_queueParam2));
+	_queuePos = 0;
+
 	//
 	// Init all VARS to 0xFF
 	//
@@ -1367,8 +1373,11 @@
 	} else if (_version >= 7) {
 		VAR(VAR_V6_EMSSPACE) = 10000;
 		VAR(VAR_NUM_GLOBAL_OBJS) = _numGlobalObjects - 1;
-	} else if (_heversion >= 72) {
+	} else if (_heversion >= 71) {
 		// TODO
+
+		// Set amount of sound channels
+		VAR(9) = 8;
 	} else {
 		VAR(VAR_CURRENTDRIVE) = 0;
 		switch (_midiDriver) {

Index: scumm.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.h,v
retrieving revision 1.456
retrieving revision 1.457
diff -u -d -r1.456 -r1.457
--- scumm.h	26 Aug 2004 23:30:28 -0000	1.456
+++ scumm.h	28 Aug 2004 03:18:52 -0000	1.457
@@ -840,9 +840,16 @@
 	int cost_frameToAnim(Actor *a, int frame);
 
 	// Akos Class
+	int16 _queueCmd[32];
+	int16 _queueActor[32];
+	int16 _queueParam1[32];
+	int16 _queueParam2[32];
+	int16 _queuePos;
+
 	bool akos_increaseAnims(const byte *akos, Actor *a);
 	bool akos_increaseAnim(Actor *a, int i, const byte *aksq, const uint16 *akfo, int numakfo);
 	void akos_queCommand(byte cmd, Actor *a, int param_1, int param_2);
+	void akos_processQueue();
 	void akos_decodeData(Actor *a, int frame, uint usemask);
 	int akos_frameToAnim(Actor *a, int frame);
 	bool akos_hasManyDirections(int costume);





More information about the Scummvm-git-logs mailing list