[Scummvm-git-logs] scummvm master -> 536c1f0fa94982b34724c40214c91bd0b9629214

dreammaster paulfgilbert at gmail.com
Wed Nov 13 05:57:37 CET 2019


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
536c1f0fa9 GLK: ARCHETYPE: Hooking up savegame code


Commit: 536c1f0fa94982b34724c40214c91bd0b9629214
    https://github.com/scummvm/scummvm/commit/536c1f0fa94982b34724c40214c91bd0b9629214
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2019-11-12T20:54:06-08:00

Commit Message:
GLK: ARCHETYPE: Hooking up savegame code

Changed paths:
    engines/glk/archetype/archetype.cpp
    engines/glk/archetype/archetype.h
    engines/glk/archetype/game_stat.cpp
    engines/glk/archetype/misc.cpp
    engines/glk/archetype/saveload.cpp
    engines/glk/archetype/sys_object.cpp
    engines/glk/quetzal.cpp


diff --git a/engines/glk/archetype/archetype.cpp b/engines/glk/archetype/archetype.cpp
index b5ef41f..204bd9f 100644
--- a/engines/glk/archetype/archetype.cpp
+++ b/engines/glk/archetype/archetype.cpp
@@ -30,6 +30,7 @@
 #include "glk/archetype/saveload.h"
 #include "glk/archetype/sys_object.h"
 #include "glk/archetype/timestamp.h"
+#include "glk/archetype/game_stat.h"
 
 namespace Glk {
 namespace Archetype {
@@ -94,13 +95,13 @@ void Archetype::deinitialize() {
 }
 
 Common::Error Archetype::readSaveData(Common::SeekableReadStream *rs) {
-	// TODO
-	return Common::kReadingFailed;
+	return load_game_state(rs, Object_List) ? Common::kNoError : Common::kNoGameDataFoundError;
 }
 
 Common::Error Archetype::writeGameData(Common::WriteStream *ws) {
-	// TODO
-	return Common::kWritingFailed;
+	save_game_state(ws, Object_List);
+
+	return Common::kNoError;
 }
 
 void Archetype::interpret() {
@@ -128,6 +129,7 @@ void Archetype::write(const String fmt, ...) {
 	Common::String s = Common::String::vformat(fmt.c_str(), ap);
 	va_end(ap);
 
+	_lastOutputText = s;
 	glk_put_buffer(s.c_str(), s.size());
 }
 
@@ -138,10 +140,21 @@ void Archetype::writeln(const String fmt, ...) {
 	va_end(ap);
 
 	s += '\n';
+	_lastOutputText = s;
 	glk_put_buffer(s.c_str(), s.size());
 }
 
 String Archetype::readLine() {
+	// WORKAROUND: THe original archetype games prompt for save file names due to script
+	// code before calling the save/load code. It's a bit hacky, but we detect the occurance
+	// of save/load in the text just before the readLine call and skip waiting for text
+	String text = _lastOutputText;
+	text.toLowercase();
+	if (text.contains("save") || text.contains("load")) {
+		writeln();
+		return "";
+	}
+
 	event_t ev;
 	char buffer[MAX_INPUT_LINE + 1];
 
diff --git a/engines/glk/archetype/archetype.h b/engines/glk/archetype/archetype.h
index a54fa17..beb67b6 100644
--- a/engines/glk/archetype/archetype.h
+++ b/engines/glk/archetype/archetype.h
@@ -46,8 +46,8 @@ enum DebugFlag {
 class Archetype : public GlkAPI {
 private:
 	int _saveSlot;
-	bool Translating;
 	winid_t _mainWindow;
+	String _lastOutputText;
 public:
 	// keywords.cpp
 	XArrayType Literals, Vocabulary;
diff --git a/engines/glk/archetype/game_stat.cpp b/engines/glk/archetype/game_stat.cpp
index 015065a..bbebed4 100644
--- a/engines/glk/archetype/game_stat.cpp
+++ b/engines/glk/archetype/game_stat.cpp
@@ -43,7 +43,7 @@ void save_game_state(Common::WriteStream *bfile, XArrayType &objects) {
 	for (i = 1; i < Dynamic; ++i) {
 		if (index_xarray(objects, i, p)) {
 			ObjectPtr op = (ObjectPtr)p;
-			bfile->writeUint32LE(vContSeq);
+			bfile->writeByte(vContSeq);
 
 			dump_item_list(bfile, op->attributes, EXPR_LIST);
 		}
@@ -51,12 +51,12 @@ void save_game_state(Common::WriteStream *bfile, XArrayType &objects) {
 
 	for (i = Dynamic; i <= (int)objects.size(); ++i) {
 		if (index_xarray(objects, i, p)) {
-			bfile->writeUint32LE(vContSeq);
+			bfile->writeByte(vContSeq);
 			dump_object(bfile, (ObjectPtr)p);
 		}
 	}
 
-	bfile->writeUint32LE(vEndSeq);
+	bfile->writeByte(vEndSeq);
 }
 
 bool load_game_state(Common::ReadStream *bfile, XArrayType &objects) {
@@ -83,7 +83,7 @@ bool load_game_state(Common::ReadStream *bfile, XArrayType &objects) {
 	// objects are a little different since they might vary between game states
 	for (i = 1; i < Dynamic; ++i) {
 		if (index_xarray(objects, i, p)) {
-			sentinel = (StatementKind)bfile->readUint32LE();
+			sentinel = (StatementKind)bfile->readByte();
 			op = (ObjectPtr)p;
 			dispose_item_list(op->attributes, EXPR_LIST);
 			load_item_list(bfile, op->attributes, EXPR_LIST);
@@ -102,13 +102,13 @@ bool load_game_state(Common::ReadStream *bfile, XArrayType &objects) {
 	}
 
 	// sentinel has been set from before
-	sentinel = (StatementKind)bfile->readUint32LE();
+	sentinel = (StatementKind)bfile->readByte();
 	while (sentinel == CONT_SEQ) {
 		load_object(bfile, op);
 		p = op;
 		append_to_xarray(objects, p);
 
-		sentinel = (StatementKind)bfile->readUint32LE();
+		sentinel = (StatementKind)bfile->readByte();
 	}
 
 	if (Encryption == UNPURPLE)
diff --git a/engines/glk/archetype/misc.cpp b/engines/glk/archetype/misc.cpp
index f2c0c78..b0e8b41 100644
--- a/engines/glk/archetype/misc.cpp
+++ b/engines/glk/archetype/misc.cpp
@@ -151,7 +151,8 @@ String formatFilename(const String &name, const String &ext, bool replace) {
 void load_string(Common::ReadStream *fIn, String &the_string) {
 	char buffer[257];
 	size_t strSize = fIn->readByte();
-	(void)fIn->readByte();		// Redundant second copy of the length
+	size_t strSize2 = fIn->readByte();		// Redundant second copy of the length
+	assert(strSize2 == strSize);
 
 	fIn->read(buffer, strSize);
 	buffer[strSize] = '\0';
@@ -163,6 +164,7 @@ void load_string(Common::ReadStream *fIn, String &the_string) {
 void dump_string(Common::WriteStream *fOut, const String &the_string) {
 	assert(the_string.size() < 256);
 	fOut->writeByte(the_string.size());
+	fOut->writeByte(the_string.size());
 
 	if (Encryption == NONE) {
 		fOut->write(the_string.c_str(), the_string.size());
diff --git a/engines/glk/archetype/saveload.cpp b/engines/glk/archetype/saveload.cpp
index 61069e3..dc36346 100644
--- a/engines/glk/archetype/saveload.cpp
+++ b/engines/glk/archetype/saveload.cpp
@@ -36,7 +36,7 @@ void saveload_init() {
 	vContSeq = CONT_SEQ;
 
 	Dynamic = 0;
-	Translating = true;
+	Translating = false;
 }
 
 // ===================== Forward Declarations =======================
@@ -306,7 +306,7 @@ static void walk_expr(MissionType mission, Common::Stream *bfile, ExprTree &the_
 	case NUMERIC:
 		switch (mission) {
 		case LOAD:
-			the_expr->_data._numeric.acl_int = readStream->readUint32LE();
+			the_expr->_data._numeric.acl_int = readStream->readSint32LE();
 			break;
 		case DUMP:
 			writeStream->writeSint32LE(the_expr->_data._numeric.acl_int);
@@ -591,14 +591,14 @@ void load_object(Common::ReadStream *f_in, ObjectPtr &the_object) {
 }
 
 void dump_object(Common::WriteStream *f_out, const ObjectPtr the_object) {
-	f_out->writeUint16LE(the_object->inherited_from);
+	f_out->writeSint16LE(the_object->inherited_from);
 	dump_item_list(f_out, the_object->attributes, EXPR_LIST);
 	dump_item_list(f_out, the_object->methods, STMT_LIST);
 
 	if (the_object->other == nullptr) {
-		f_out->writeUint16LE(vEndSeq);
+		f_out->writeByte(vEndSeq);
 	} else {
-		f_out->writeUint16LE(vContSeq);
+		f_out->writeByte(vContSeq);
 		dump_stmt(f_out, the_object->other);
 	}
 }
diff --git a/engines/glk/archetype/sys_object.cpp b/engines/glk/archetype/sys_object.cpp
index ad98afb..784d9a4 100644
--- a/engines/glk/archetype/sys_object.cpp
+++ b/engines/glk/archetype/sys_object.cpp
@@ -73,6 +73,9 @@ void send_to_system(int transport, String &strmsg, ResultType &result, ContextTy
     NodePtr np;
 	void *p;
 
+	if (g_vm->shouldQuit())
+		return;
+
 	if (transport == OP_SEND)
 		the_caller = context.self;
 	else
@@ -266,33 +269,32 @@ void send_to_system(int transport, String &strmsg, ResultType &result, ContextTy
 			sys_state = IDLING;
 			break;
 
-		case SAVE_STATE: {
-			Common::OutSaveFile *stfile = g_system->getSavefileManager()->openForSaving(strmsg);
-			if (stfile == nullptr) {
-				g_vm->writeln("Error opening %s", strmsg.c_str());
+		case SAVE_STATE:
+			if (g_vm->saveGame().getCode() != Common::kNoError) {
+				g_vm->writeln("Error saving savegame");
 				cleanup(result);
 			} else {
-				save_game_state(stfile, g_vm->Object_List);
 				result._kind = RESERVED;
 				result._data._reserved.keyword = RW_TRUE;
-
-				stfile->finalize();
-				delete stfile;
 			}
 
 			sys_state = IDLING;
 			break;
-		}
 
 		case LOAD_STATE: {
-			Common::InSaveFile *stfile = g_system->getSavefileManager()->openForLoading(strmsg);
-			if (stfile == nullptr) {
-				g_vm->writeln("Error opening %s", strmsg.c_str());
-				cleanup(result);
-			} else {
+			Common::ErrorCode errCode = g_vm->loadGame().getCode();
+
+			if (errCode == Common::kNoError) {
 				result._kind = RESERVED;
-				result._data._reserved.keyword = load_game_state(stfile, g_vm->Object_List) ? RW_TRUE : RW_FALSE;
-				delete stfile;
+				result._data._reserved.keyword = RW_TRUE;
+
+			} else if (errCode == Common::kNoGameDataFoundError) {
+				result._kind = RESERVED;
+				result._data._reserved.keyword = RW_FALSE;
+
+			} else {
+				g_vm->writeln("Error restoring savegame");
+				cleanup(result);
 			}
 
 			sys_state = IDLING;
diff --git a/engines/glk/quetzal.cpp b/engines/glk/quetzal.cpp
index 7a11a57..48e1ef0 100644
--- a/engines/glk/quetzal.cpp
+++ b/engines/glk/quetzal.cpp
@@ -44,6 +44,8 @@ uint32 QuetzalBase::getInterpreterTag(InterpreterType interpType) {
 		return MKTAG('A', 'L', 'N', '2');
 	case INTERPRETER_ALAN3:
 		return MKTAG('A', 'L', 'N', '3');
+	case INTERPRETER_ARCHETYPE:
+		return MKTAG('A', 'R', 'C', 'H');
 	case INTERPRETER_FROTZ:
 		return MKTAG('Z', 'C', 'O', 'D');
 	case INTERPRETER_GEAS:





More information about the Scummvm-git-logs mailing list