[Scummvm-cvs-logs] CVS: scummvm/scumm intern.h,2.105,2.106 script_v5.cpp,1.163,1.164

Jonathan Gray khalek at users.sourceforge.net
Sun Aug 31 07:59:11 CEST 2003


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

Modified Files:
	intern.h script_v5.cpp 
Log Message:
some things needed for supporting original save/load screens in v3 games, doesn't fully work but doesn't break anything either

Index: intern.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/intern.h,v
retrieving revision 2.105
retrieving revision 2.106
diff -u -d -r2.105 -r2.106
--- intern.h	28 Aug 2003 15:23:22 -0000	2.105
+++ intern.h	31 Aug 2003 14:58:55 -0000	2.106
@@ -46,6 +46,8 @@
 
 	virtual void decodeParseString();
 	int getWordVararg(int *ptr);
+	void saveVars();
+	void loadVars();
 
 	virtual int getVar();
 	virtual int getVarOrDirectByte(byte mask);

Index: script_v5.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v5.cpp,v
retrieving revision 1.163
retrieving revision 1.164
diff -u -d -r1.163 -r1.164
--- script_v5.cpp	29 Aug 2003 15:06:00 -0000	1.163
+++ script_v5.cpp	31 Aug 2003 14:58:56 -0000	1.164
@@ -831,7 +831,73 @@
 
 void Scumm_v5::o5_saveLoadVars() {
 	// TODO
-	error("o5_saveLoadVars not yet implemented");
+	if (fetchScriptByte() == 1) 
+		saveVars();
+	else
+		loadVars();
+}
+
+void Scumm_v5::saveVars() {
+	int a, b;
+
+	while ((_opcode = fetchScriptByte()) != 0) {
+		switch (_opcode & 0x1F) {
+			case 0x01: // write a range of variables
+				getResultPos();
+			        a = _resultVarNumber;
+				getResultPos();
+			        b = _resultVarNumber;
+				warning("stub saveVars: vars %d -> %d", a, b);
+				break;
+
+			case 0x02: // write a range of string variables
+				a = getVarOrDirectByte(0x80);
+				b = getVarOrDirectByte(0x40);
+				warning("stub saveVars: strings %d -> %d", a, b);
+				break;
+			case 0x03: // open file
+				a = resStrLen(_scriptPointer);
+				warning("stub saveVars to %s", _scriptPointer);
+				_scriptPointer += a + 1;
+				break;
+			case 0x1F: // close file
+				warning("stub saveVars close file");
+				break;
+		}
+
+	}
+}
+
+void Scumm_v5::loadVars() {
+	int a, b;
+
+	hexdump(_scriptPointer, 64);
+	while ((_opcode = fetchScriptByte()) != 0) {
+		switch (_opcode & 0x1F) {
+			case 0x01: // read a range of variables
+				getResultPos();
+			        a = _resultVarNumber;
+				getResultPos();
+			        b = _resultVarNumber;
+				warning("stub loadVars: vars %d -> %d", a, b);
+				break;
+			case 0x02: // read a range of string variables
+				a = getVarOrDirectByte(0x80);
+				b = getVarOrDirectByte(0x40);
+				warning("stub loadVars: strings %d -> %d", a, b);
+				break;
+			case 0x03: // open file
+				a = resStrLen(_scriptPointer);
+				warning("stub loadVars from %s", _scriptPointer);
+				_scriptPointer += a + 1;
+				break;
+			case 0x1F: // close file
+				warning("stub loadVars close file");
+				break;
+		}
+				
+	}
+
 }
 
 void Scumm_v5::o5_expression() {
@@ -1020,10 +1086,42 @@
 void Scumm_v5::o5_getAnimCounter() {
 	getResultPos();
 	// Loom uses this opcode in its load/save screen.
-	if (_gameId == GID_LOOM) {
+	//if (_gameId == GID_LOOM) {
+	if (_version <= 3) {
 		byte a = getVarOrDirectByte(0x80);
-		warning("TODO: Loom saveLoad(%d)", a);
-		setResult(0);
+		byte slot = a & 0x1F;
+		byte result = 0;
+		
+		switch(a & 0xE0) {
+			case 0x00: // num slots available
+				result = 100;
+				break;
+			case 0x20: // dos drive?
+				result = 0;
+				break;
+			case 0x40: // load 
+				if (loadState(slot, _saveLoadCompatible))
+					result = 3; // sucess
+				else
+					result = 5; // failed to load
+				break;
+			case 0x80: // save
+				if (saveState(slot, _saveLoadCompatible))
+					result = 0;
+				else
+					result = 2;
+			case 0xC0: // test if save exists
+				bool avail_saves[100];
+				SaveFileManager *mgr = _system->get_savefile_manager();
+				listSavegames(avail_saves, ARRAYSIZE(avail_saves), mgr);
+				delete mgr;
+				if (avail_saves[slot])
+					result = 6; // save file exists
+				else
+					result = 7; // save file does not exist
+				break;
+		}
+		setResult(result);
 	} else {
 		int act = getVarOrDirectByte(0x80);
 		Actor *a = derefActor(act, "o5_getAnimCounter");





More information about the Scummvm-git-logs mailing list