[Scummvm-cvs-logs] scummvm master -> d79364489d2aa15503d8d163fd8c6c59bd7e517e

wjp wjp at usecode.org
Thu Aug 18 00:34:41 CEST 2011


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

Summary:
f3131e2dbf DREAMWEB: Move several load/save functions out of dreamgen
7280a569cb DREAMWEB: Hook up ScummVM save/load menu
8a5c8f3320 DREAMWEB: Add/fix loading from launcher
d79364489d DREAMWEB: Enable 100 savegames


Commit: f3131e2dbf9d18bd37ef7fb56de1c15a9826301a
    https://github.com/scummvm/scummvm/commit/f3131e2dbf9d18bd37ef7fb56de1c15a9826301a
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2011-08-17T15:28:08-07:00

Commit Message:
DREAMWEB: Move several load/save functions out of dreamgen

Changed paths:
  A engines/dreamweb/saveload.cpp
    devtools/tasmrecover/tasm-recover
    engines/dreamweb/dreamgen.cpp
    engines/dreamweb/module.mk



diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover
index c333f58..0c89f53 100755
--- a/devtools/tasmrecover/tasm-recover
+++ b/devtools/tasmrecover/tasm-recover
@@ -130,5 +130,8 @@ generator = cpp(context, "DreamGen", blacklist = [
 	'backobject',
 	'mainman',
 	'madman',
+	'loadgame',
+	'savegame',
+	'doload'
 	])
 generator.generate('dreamweb') #start routine
diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp
index 2ecdbac..071841e 100644
--- a/engines/dreamweb/dreamgen.cpp
+++ b/engines/dreamweb/dreamgen.cpp
@@ -13769,71 +13769,6 @@ void DreamGenContext::loadsavebox() {
 	loadintotemp();
 }
 
-void DreamGenContext::loadgame() {
-	STACK_CHECK;
-	_cmp(data.byte(kCommandtype), 246);
-	if (flags.z())
-		goto alreadyload;
-	data.byte(kCommandtype) = 246;
-	al = 41;
-	commandonly();
-alreadyload:
-	ax = data.word(kMousebutton);
-	_cmp(ax, data.word(kOldbutton));
-	if (flags.z())
-		return /* (noload) */;
-	_cmp(ax, 1);
-	if (flags.z())
-		goto doload;
-	return;
-doload:
-	data.byte(kLoadingorsave) = 1;
-	showopbox();
-	showloadops();
-	data.byte(kCurrentslot) = 0;
-	showslots();
-	shownames();
-	data.byte(kPointerframe) = 0;
-	worktoscreenm();
-	namestoold();
-	data.byte(kGetback) = 0;
-loadops:
-	_cmp(data.byte(kQuitrequested),  0);
-	if (!flags.z())
-		return /* (quitloaded) */;
-	delpointer();
-	readmouse();
-	showpointer();
-	vsync();
-	dumppointer();
-	dumptextline();
-	bx = offset_loadlist;
-	checkcoords();
-	_cmp(data.byte(kGetback), 0);
-	if (flags.z())
-		goto loadops;
-	_cmp(data.byte(kGetback), 2);
-	if (flags.z())
-		return /* (quitloaded) */;
-	getridoftemp();
-	dx = data;
-	es = dx;
-	bx = 7979;
-	startloading();
-	loadroomssample();
-	data.byte(kRoomloaded) = 1;
-	data.byte(kNewlocation) = 255;
-	clearsprites();
-	initman();
-	initrain();
-	data.word(kTextaddressx) = 13;
-	data.word(kTextaddressy) = 182;
-	data.byte(kTextlen) = 240;
-	startup();
-	worktoscreen();
-	data.byte(kGetback) = 4;
-}
-
 void DreamGenContext::getbacktoops() {
 	STACK_CHECK;
 	_cmp(data.byte(kCommandtype), 201);
@@ -13898,56 +13833,6 @@ discopsloop:
 		goto discopsloop;
 }
 
-void DreamGenContext::savegame() {
-	STACK_CHECK;
-	_cmp(data.byte(kMandead), 2);
-	if (!flags.z())
-		goto cansaveok;
-	blank();
-	return;
-cansaveok:
-	_cmp(data.byte(kCommandtype), 247);
-	if (flags.z())
-		goto alreadysave;
-	data.byte(kCommandtype) = 247;
-	al = 44;
-	commandonly();
-alreadysave:
-	ax = data.word(kMousebutton);
-	_and(ax, 1);
-	if (!flags.z())
-		goto dosave;
-	return;
-dosave:
-	data.byte(kLoadingorsave) = 2;
-	showopbox();
-	showsaveops();
-	data.byte(kCurrentslot) = 0;
-	showslots();
-	shownames();
-	worktoscreenm();
-	namestoold();
-	data.word(kBufferin) = 0;
-	data.word(kBufferout) = 0;
-	data.byte(kGetback) = 0;
-saveops:
-	_cmp(data.byte(kQuitrequested),  0);
-	if (!flags.z())
-		return /* (quitsavegame) */;
-	delpointer();
-	checkinput();
-	readmouse();
-	showpointer();
-	vsync();
-	dumppointer();
-	dumptextline();
-	bx = offset_savelist;
-	checkcoords();
-	_cmp(data.byte(kGetback), 0);
-	if (flags.z())
-		goto saveops;
-}
-
 void DreamGenContext::actualsave() {
 	STACK_CHECK;
 	_cmp(data.byte(kCommandtype), 222);
@@ -14612,55 +14497,6 @@ alreadynewgame:
 	data.byte(kGetback) = 3;
 }
 
-void DreamGenContext::doload() {
-	STACK_CHECK;
-	data.byte(kLoadingorsave) = 1;
-	showopbox();
-	showloadops();
-	data.byte(kCurrentslot) = 0;
-	showslots();
-	shownames();
-	data.byte(kPointerframe) = 0;
-	worktoscreenm();
-	namestoold();
-	data.byte(kGetback) = 0;
-loadops:
-	_cmp(data.byte(kQuitrequested),  0);
-	if (!flags.z())
-		return /* (quitloaded) */;
-	delpointer();
-	readmouse();
-	showpointer();
-	vsync();
-	dumppointer();
-	dumptextline();
-	bx = offset_loadlist;
-	checkcoords();
-	_cmp(data.byte(kGetback), 0);
-	if (flags.z())
-		goto loadops;
-	_cmp(data.byte(kGetback), 2);
-	if (flags.z())
-		return /* (quitloaded) */;
-	getridoftemp();
-	dx = data;
-	es = dx;
-	bx = 7979;
-	startloading();
-	loadroomssample();
-	data.byte(kRoomloaded) = 1;
-	data.byte(kNewlocation) = 255;
-	clearsprites();
-	initman();
-	initrain();
-	data.word(kTextaddressx) = 13;
-	data.word(kTextaddressy) = 182;
-	data.byte(kTextlen) = 240;
-	startup();
-	worktoscreen();
-	data.byte(kGetback) = 4;
-}
-
 void DreamGenContext::loadold() {
 	STACK_CHECK;
 	_cmp(data.byte(kCommandtype), 252);
diff --git a/engines/dreamweb/module.mk b/engines/dreamweb/module.mk
index c7307e8..b33703a 100644
--- a/engines/dreamweb/module.mk
+++ b/engines/dreamweb/module.mk
@@ -7,6 +7,7 @@ MODULE_OBJS := \
 	dreamweb.o \
 	dreamgen.o \
 	print.o \
+	saveload.o \
 	sprite.o \
 	stubs.o \
 	vgagrafx.o
diff --git a/engines/dreamweb/saveload.cpp b/engines/dreamweb/saveload.cpp
new file mode 100644
index 0000000..9b6e35b
--- /dev/null
+++ b/engines/dreamweb/saveload.cpp
@@ -0,0 +1,191 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "dreamweb/dreamweb.h"
+
+namespace DreamGen {
+
+void DreamGenContext::loadgame() {
+	STACK_CHECK;
+	_cmp(data.byte(kCommandtype), 246);
+	if (flags.z())
+		goto alreadyload;
+	data.byte(kCommandtype) = 246;
+	al = 41;
+	commandonly();
+alreadyload:
+	ax = data.word(kMousebutton);
+	_cmp(ax, data.word(kOldbutton));
+	if (flags.z())
+		return /* (noload) */;
+	_cmp(ax, 1);
+	if (flags.z())
+		goto doload;
+	return;
+doload:
+	data.byte(kLoadingorsave) = 1;
+	showopbox();
+	showloadops();
+	data.byte(kCurrentslot) = 0;
+	showslots();
+	shownames();
+	data.byte(kPointerframe) = 0;
+	worktoscreenm();
+	namestoold();
+	data.byte(kGetback) = 0;
+loadops:
+	_cmp(data.byte(kQuitrequested),  0);
+	if (!flags.z())
+		return /* (quitloaded) */;
+	delpointer();
+	readmouse();
+	showpointer();
+	vsync();
+	dumppointer();
+	dumptextline();
+	bx = offset_loadlist;
+	checkcoords();
+	_cmp(data.byte(kGetback), 0);
+	if (flags.z())
+		goto loadops;
+	_cmp(data.byte(kGetback), 2);
+	if (flags.z())
+		return /* (quitloaded) */;
+	getridoftemp();
+	dx = data;
+	es = dx;
+	bx = 7979;
+	startloading();
+	loadroomssample();
+	data.byte(kRoomloaded) = 1;
+	data.byte(kNewlocation) = 255;
+	clearsprites();
+	initman();
+	initrain();
+	data.word(kTextaddressx) = 13;
+	data.word(kTextaddressy) = 182;
+	data.byte(kTextlen) = 240;
+	startup();
+	worktoscreen();
+	data.byte(kGetback) = 4;
+}
+
+void DreamGenContext::doload() {
+	STACK_CHECK;
+	data.byte(kLoadingorsave) = 1;
+	showopbox();
+	showloadops();
+	data.byte(kCurrentslot) = 0;
+	showslots();
+	shownames();
+	data.byte(kPointerframe) = 0;
+	worktoscreenm();
+	namestoold();
+	data.byte(kGetback) = 0;
+loadops:
+	_cmp(data.byte(kQuitrequested),  0);
+	if (!flags.z())
+		return /* (quitloaded) */;
+	delpointer();
+	readmouse();
+	showpointer();
+	vsync();
+	dumppointer();
+	dumptextline();
+	bx = offset_loadlist;
+	checkcoords();
+	_cmp(data.byte(kGetback), 0);
+	if (flags.z())
+		goto loadops;
+	_cmp(data.byte(kGetback), 2);
+	if (flags.z())
+		return /* (quitloaded) */;
+	getridoftemp();
+	dx = data;
+	es = dx;
+	bx = 7979;
+	startloading();
+	loadroomssample();
+	data.byte(kRoomloaded) = 1;
+	data.byte(kNewlocation) = 255;
+	clearsprites();
+	initman();
+	initrain();
+	data.word(kTextaddressx) = 13;
+	data.word(kTextaddressy) = 182;
+	data.byte(kTextlen) = 240;
+	startup();
+	worktoscreen();
+	data.byte(kGetback) = 4;
+}
+
+void DreamGenContext::savegame() {
+	STACK_CHECK;
+	_cmp(data.byte(kMandead), 2);
+	if (!flags.z())
+		goto cansaveok;
+	blank();
+	return;
+cansaveok:
+	_cmp(data.byte(kCommandtype), 247);
+	if (flags.z())
+		goto alreadysave;
+	data.byte(kCommandtype) = 247;
+	al = 44;
+	commandonly();
+alreadysave:
+	ax = data.word(kMousebutton);
+	_and(ax, 1);
+	if (!flags.z())
+		goto dosave;
+	return;
+dosave:
+	data.byte(kLoadingorsave) = 2;
+	showopbox();
+	showsaveops();
+	data.byte(kCurrentslot) = 0;
+	showslots();
+	shownames();
+	worktoscreenm();
+	namestoold();
+	data.word(kBufferin) = 0;
+	data.word(kBufferout) = 0;
+	data.byte(kGetback) = 0;
+saveops:
+	_cmp(data.byte(kQuitrequested),  0);
+	if (!flags.z())
+		return /* (quitsavegame) */;
+	delpointer();
+	checkinput();
+	readmouse();
+	showpointer();
+	vsync();
+	dumppointer();
+	dumptextline();
+	bx = offset_savelist;
+	checkcoords();
+	_cmp(data.byte(kGetback), 0);
+	if (flags.z())
+		goto saveops;
+}
+
+} /*namespace dreamgen */


Commit: 7280a569cb42703b82354f7da836b318dd73c4fb
    https://github.com/scummvm/scummvm/commit/7280a569cb42703b82354f7da836b318dd73c4fb
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2011-08-17T15:28:08-07:00

Commit Message:
DREAMWEB: Hook up ScummVM save/load menu

The ScummVM menu will be used if dreamweb_originalsaveload
is set to true. This is very error-prone, and needs testing.

Changed paths:
    engines/dreamweb/dreamweb.cpp
    engines/dreamweb/saveload.cpp



diff --git a/engines/dreamweb/dreamweb.cpp b/engines/dreamweb/dreamweb.cpp
index a220582..9099b54 100644
--- a/engines/dreamweb/dreamweb.cpp
+++ b/engines/dreamweb/dreamweb.cpp
@@ -216,13 +216,9 @@ Common::Error DreamWebEngine::run() {
 	syncSoundSettings();
 	_console = new DreamWebConsole(this);
 
-	if (ConfMan.hasKey("save_slot")) {
-		_enableSavingOrLoading = true;
-		_loadSavefile = ConfMan.getInt("save_slot");
-	} else {
-		_enableSavingOrLoading = false;
-		_loadSavefile = -1;
-	}
+	ConfMan.registerDefault("dreamweb_originalsaveload", "true");
+
+	_loadSavefile = Common::ConfigManager::instance().getInt("save_slot");
 
 	getTimerManager()->installTimerProc(vSyncInterrupt, 1000000 / 70, this, "dreamwebVSync");
 	_context.__start();
diff --git a/engines/dreamweb/saveload.cpp b/engines/dreamweb/saveload.cpp
index 9b6e35b..3dfc1b3 100644
--- a/engines/dreamweb/saveload.cpp
+++ b/engines/dreamweb/saveload.cpp
@@ -21,108 +21,125 @@
  */
 
 #include "dreamweb/dreamweb.h"
+#include "engines/metaengine.h"
+#include "gui/saveload.h"
+#include "common/config-manager.h"
+#include "common/translation.h"
 
 namespace DreamGen {
 
 void DreamGenContext::loadgame() {
 	STACK_CHECK;
-	_cmp(data.byte(kCommandtype), 246);
-	if (flags.z())
-		goto alreadyload;
-	data.byte(kCommandtype) = 246;
-	al = 41;
-	commandonly();
-alreadyload:
-	ax = data.word(kMousebutton);
-	_cmp(ax, data.word(kOldbutton));
-	if (flags.z())
-		return /* (noload) */;
-	_cmp(ax, 1);
-	if (flags.z())
-		goto doload;
-	return;
-doload:
-	data.byte(kLoadingorsave) = 1;
-	showopbox();
-	showloadops();
-	data.byte(kCurrentslot) = 0;
-	showslots();
-	shownames();
-	data.byte(kPointerframe) = 0;
-	worktoscreenm();
-	namestoold();
-	data.byte(kGetback) = 0;
-loadops:
-	_cmp(data.byte(kQuitrequested),  0);
-	if (!flags.z())
-		return /* (quitloaded) */;
-	delpointer();
-	readmouse();
-	showpointer();
-	vsync();
-	dumppointer();
-	dumptextline();
-	bx = offset_loadlist;
-	checkcoords();
-	_cmp(data.byte(kGetback), 0);
-	if (flags.z())
-		goto loadops;
-	_cmp(data.byte(kGetback), 2);
-	if (flags.z())
-		return /* (quitloaded) */;
-	getridoftemp();
-	dx = data;
-	es = dx;
-	bx = 7979;
-	startloading();
-	loadroomssample();
-	data.byte(kRoomloaded) = 1;
-	data.byte(kNewlocation) = 255;
-	clearsprites();
-	initman();
-	initrain();
-	data.word(kTextaddressx) = 13;
-	data.word(kTextaddressy) = 182;
-	data.byte(kTextlen) = 240;
-	startup();
-	worktoscreen();
-	data.byte(kGetback) = 4;
+	if (data.byte(kCommandtype) != 246) {
+		data.byte(kCommandtype) = 246;
+		al = 41;
+		commandonly();
+	}
+	if (data.word(kMousebutton) == data.word(kOldbutton))
+		return; // "noload"
+	if (data.word(kMousebutton) == 1)
+		doload();
 }
 
 void DreamGenContext::doload() {
 	STACK_CHECK;
 	data.byte(kLoadingorsave) = 1;
-	showopbox();
-	showloadops();
-	data.byte(kCurrentslot) = 0;
-	showslots();
-	shownames();
-	data.byte(kPointerframe) = 0;
-	worktoscreenm();
-	namestoold();
-	data.byte(kGetback) = 0;
-loadops:
-	_cmp(data.byte(kQuitrequested),  0);
-	if (!flags.z())
-		return /* (quitloaded) */;
-	delpointer();
-	readmouse();
-	showpointer();
-	vsync();
-	dumppointer();
-	dumptextline();
-	bx = offset_loadlist;
-	checkcoords();
-	_cmp(data.byte(kGetback), 0);
-	if (flags.z())
-		goto loadops;
-	_cmp(data.byte(kGetback), 2);
-	if (flags.z())
-		return /* (quitloaded) */;
+
+	if (ConfMan.getBool("dreamweb_originalsaveload")) {
+		showopbox();
+		showloadops();
+		data.byte(kCurrentslot) = 0;
+		showslots();
+		shownames();
+		data.byte(kPointerframe) = 0;
+		worktoscreenm();
+		namestoold();
+		data.byte(kGetback) = 0;
+
+		while (true) {
+			if (data.byte(kQuitrequested))
+				return; // "quitloaded"
+			delpointer();
+			readmouse();
+			showpointer();
+			vsync();
+			dumppointer();
+			dumptextline();
+			bx = offset_loadlist;
+			checkcoords();
+			if (data.byte(kGetback) == 1)
+				break;
+			if (data.byte(kGetback) == 2)
+				return; // "quitloaded"
+		}
+	} else {
+		const EnginePlugin *plugin = NULL;
+		Common::String gameId = ConfMan.get("gameid");
+		EngineMan.findGame(gameId, &plugin);
+		GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser(_("Restore game:"), _("Restore"));
+		dialog->setSaveMode(false);
+		int savegameId = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName());
+		delete dialog;
+
+		if (savegameId < 0) {
+			data.byte(kGetback) = 0;
+			return;
+		}
+
+
+		// TODO: proper scheme for filename, in a separate function
+		//Common::String filename = ConfMan.getActiveDomainName() + Common::String::format(".d%02d", savegameId);
+		Common::String filename = Common::String::format("DREAMWEB.D%02d", savegameId);
+		debug(1, "Loading from filename: %s", filename.c_str());
+		engine->openSaveFileForReading(filename);
+
+		// TODO: The below is duplicated from Loadposition
+		data.word(kTimecount) = 0;
+		clearchanges();
+
+		ds = cs;
+		dx = kFileheader;
+		cx = kHeaderlen;
+		savefileread();
+		es = cs;
+		di = kFiledata;
+		ax = savegameId;
+		if (savegameId < 7) {
+			cx = 17;
+			_mul(cx);
+			ds = data;
+			dx = kSavenames;
+			_add(dx, ax);
+			loadseg();
+		} else {
+			// For potential support of more than 7 savegame slots,
+			// loading into the savenames buffer isn't always possible
+			uint8 namebuf[17];
+			engine->readFromFile(namebuf, 17);
+		}
+		ds = data; 
+		dx = kStartvars;
+		loadseg();
+		ds = data.word(kExtras);
+		dx = kExframedata;
+		loadseg();
+		ds = data.word(kBuffers);
+		dx = kListofchanges;
+		loadseg();
+		ds = data;
+		dx = kMadeuproomdat;
+		loadseg();
+		ds = cs;
+		dx = kReelroutines;
+		loadseg();
+		closefile();
+		data.byte(kGetback) = 1;
+	}
+
 	getridoftemp();
 	dx = data;
 	es = dx;
-	bx = 7979;
+	bx = kMadeuproomdat;
 	startloading();
 	loadroomssample();
 	data.byte(kRoomloaded) = 1;
@@ -138,54 +155,172 @@ loadops:
 	data.byte(kGetback) = 4;
 }
 
+
 void DreamGenContext::savegame() {
 	STACK_CHECK;
-	_cmp(data.byte(kMandead), 2);
-	if (!flags.z())
-		goto cansaveok;
-	blank();
-	return;
-cansaveok:
-	_cmp(data.byte(kCommandtype), 247);
-	if (flags.z())
-		goto alreadysave;
-	data.byte(kCommandtype) = 247;
-	al = 44;
-	commandonly();
-alreadysave:
-	ax = data.word(kMousebutton);
-	_and(ax, 1);
-	if (!flags.z())
-		goto dosave;
-	return;
-dosave:
+	if (data.byte(kMandead) == 2) {
+		blank();
+		return;
+	}
+
+	if (data.byte(kCommandtype) != 247) {
+		data.byte(kCommandtype) = 247;
+		al = 44;
+		commandonly();
+	}
+	if (data.word(kMousebutton) != 1)
+		return;
+
 	data.byte(kLoadingorsave) = 2;
-	showopbox();
-	showsaveops();
-	data.byte(kCurrentslot) = 0;
-	showslots();
-	shownames();
-	worktoscreenm();
-	namestoold();
-	data.word(kBufferin) = 0;
-	data.word(kBufferout) = 0;
-	data.byte(kGetback) = 0;
-saveops:
-	_cmp(data.byte(kQuitrequested),  0);
-	if (!flags.z())
-		return /* (quitsavegame) */;
-	delpointer();
-	checkinput();
-	readmouse();
-	showpointer();
-	vsync();
-	dumppointer();
-	dumptextline();
-	bx = offset_savelist;
-	checkcoords();
-	_cmp(data.byte(kGetback), 0);
-	if (flags.z())
-		goto saveops;
+
+	if (ConfMan.getBool("dreamweb_originalsaveload")) {
+		showopbox();
+		showsaveops();
+		data.byte(kCurrentslot) = 0;
+		showslots();
+		shownames();
+		worktoscreenm();
+		namestoold();
+		data.word(kBufferin) = 0;
+		data.word(kBufferout) = 0;
+		data.byte(kGetback) = 0;
+
+		while (true) {
+			_cmp(data.byte(kQuitrequested),  0);
+			if (!flags.z())
+				return /* (quitsavegame) */;
+			delpointer();
+			checkinput();
+			readmouse();
+			showpointer();
+			vsync();
+			dumppointer();
+			dumptextline();
+			bx = offset_savelist;
+			checkcoords();
+			_cmp(data.byte(kGetback), 0);
+			if (flags.z())
+				continue;
+			break;
+		}
+		return;
+	} else {
+		const EnginePlugin *plugin = NULL;
+		Common::String gameId = ConfMan.get("gameid");
+		EngineMan.findGame(gameId, &plugin);
+		GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser(_("Save game:"), _("Save"));
+		dialog->setSaveMode(true);
+		int savegameId = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName());
+		Common::String game_description = dialog->getResultString();
+		if (game_description.empty())
+			game_description = "Untitled";
+		delete dialog;
+
+		if (savegameId < 0) {
+			data.byte(kGetback) = 0;
+			return;
+		}
+
+		// TODO: The below is copied from actualsave
+		al = data.byte(kLocation);
+		ah = 0;
+		cx = 32;
+		_mul(cx);
+		ds = cs;
+		si = kRoomdata;
+		_add(si, ax);
+		di = kMadeuproomdat;
+		bx = di;
+		es = cs;
+		cx = 16;
+		_movsw(cx, true);
+		al = data.byte(kRoomssample);
+		es.byte(bx+13) = al;
+		al = data.byte(kMapx);
+		es.byte(bx+15) = al;
+		al = data.byte(kMapy);
+		es.byte(bx+16) = al;
+		al = data.byte(kLiftflag);
+		es.byte(bx+20) = al;
+		al = data.byte(kManspath);
+		es.byte(bx+21) = al;
+		al = data.byte(kFacing);
+		es.byte(bx+22) = al;
+		al = 255;
+		es.byte(bx+27) = al;
+
+		// TODO: The below is copied from saveposition
+		makeheader();
+
+		//Common::String filename = ConfMan.getActiveDomainName() + Common::String::format(".d%02d", savegameId);
+		Common::String filename = Common::String::format("DREAMWEB.D%02d", savegameId);
+		debug(1, "Saving to filename: %s (%s)", filename.c_str(), game_description.c_str());
+
+		engine->openSaveFileForWriting(filename.c_str());
+
+		dx = data;
+		ds = dx;
+		dx = kFileheader;
+		cx = kHeaderlen;
+		savefilewrite();
+		dx = data;
+		es = dx;
+		di = kFiledata;
+
+		// TODO: Check if this 2 is a constant
+		uint8 descbuf[17] = { 2, 0 };
+		strncpy((char*)descbuf+1, game_description.c_str(), 16);
+		unsigned int desclen = game_description.size();
+		if (desclen > 15)
+			desclen = 15;
+		// zero terminate, and pad with ones
+		descbuf[++desclen] = 0;
+		while (desclen < 17)
+			descbuf[++desclen] = 1;
+		if (savegameId < 7) {
+			ax = savegameId;
+			cx = 17;
+			_mul(cx);
+			ds = data;
+			dx = kSavenames;
+			_add(dx, ax);
+			mempcpy(data.ptr(dx,17), descbuf, 17);
+			saveseg();
+		} else {
+			// savenames only has room for descriptions for 7 slots
+			uint16 len = es.word(di);
+			_add(di, 2);
+			assert(len == 17);
+			engine->writeToSaveFile(descbuf, len);
+		}
+
+		ds = data;
+		dx = kStartvars;
+		saveseg();
+		ds = data.word(kExtras);
+		dx = kExframedata;
+		saveseg();
+		ds = data.word(kBuffers);
+		dx = kListofchanges;
+		saveseg();
+		ds = data;
+		dx = kMadeuproomdat;
+		saveseg();
+		ds = data;
+		dx = kReelroutines;
+		saveseg();
+		closefile();
+
+		getridoftemp();
+		restoreall();
+		data.word(kTextaddressx) = 13;
+		data.word(kTextaddressy) = 182;
+		data.byte(kTextlen) = 240;
+		redrawmainscrn();
+		worktoscreenm();
+		data.byte(kGetback) = 4;
+	}
 }
 
+
 } /*namespace dreamgen */


Commit: 8a5c8f33203932138266b172b928a662928d3a8a
    https://github.com/scummvm/scummvm/commit/8a5c8f33203932138266b172b928a662928d3a8a
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2011-08-17T15:29:17-07:00

Commit Message:
DREAMWEB: Add/fix loading from launcher

This is very error-prone, and needs testing.

Changed paths:
    devtools/tasmrecover/dreamweb/saveload.asm
    engines/dreamweb/detection.cpp
    engines/dreamweb/dreamgen.cpp
    engines/dreamweb/dreamweb.cpp
    engines/dreamweb/dreamweb.h
    engines/dreamweb/saveload.cpp
    engines/dreamweb/stubs.cpp



diff --git a/devtools/tasmrecover/dreamweb/saveload.asm b/devtools/tasmrecover/dreamweb/saveload.asm
index f3c92d3..6c98774 100644
--- a/devtools/tasmrecover/dreamweb/saveload.asm
+++ b/devtools/tasmrecover/dreamweb/saveload.asm
@@ -1502,6 +1502,7 @@ Loadold	proc	near
 alreadyloadold:	mov	ax,mousebutton
 	and	ax,1
 	jz	noloadold
+	mov ax,0ffffh
 	call	doload
 	cmp	getback,4
 	jz	noloadold
diff --git a/engines/dreamweb/detection.cpp b/engines/dreamweb/detection.cpp
index 81a209d..4f1c52c 100644
--- a/engines/dreamweb/detection.cpp
+++ b/engines/dreamweb/detection.cpp
@@ -40,7 +40,7 @@ public:
 	AdvancedMetaEngine(DreamWeb::gameDescriptions,
 	sizeof(DreamWeb::DreamWebGameDescription), dreamWebGames) {
 		_singleid = "dreamweb";
-		_guioptions = Common::GUIO_NOMIDI | Common::GUIO_NOLAUNCHLOAD;
+		_guioptions = Common::GUIO_NOMIDI;
 	}
 
 	virtual const char *getName() const {
@@ -61,8 +61,8 @@ public:
 bool DreamWebMetaEngine::hasFeature(MetaEngineFeature f) const {
 	switch(f) {
 	case kSupportsListSaves:
-	//case kSupportsLoadingDuringStartup:
-	//case kSupportsDeleteSave:
+	case kSupportsLoadingDuringStartup:
+	case kSupportsDeleteSave:
 		return true;
 	default:
 		return false;
@@ -105,7 +105,8 @@ SaveStateList DreamWebMetaEngine::listSaves(const char *target) const {
 		stream->read(name, sizeof(name) - 1);
 		delete stream;
 
-		SaveStateDescriptor sd(i, name);
+		int slotNum = atoi(file.c_str() + file.size() - 2);
+		SaveStateDescriptor sd(slotNum, name);
 		saveList.push_back(sd);
 	}
 
diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp
index 071841e..4c69c21 100644
--- a/engines/dreamweb/dreamgen.cpp
+++ b/engines/dreamweb/dreamgen.cpp
@@ -14510,6 +14510,7 @@ alreadyloadold:
 	_and(ax, 1);
 	if (flags.z())
 		return /* (noloadold) */;
+	ax = 0x0ffff;
 	doload();
 	_cmp(data.byte(kGetback), 4);
 	if (flags.z())
diff --git a/engines/dreamweb/dreamweb.cpp b/engines/dreamweb/dreamweb.cpp
index 9099b54..19d1d84 100644
--- a/engines/dreamweb/dreamweb.cpp
+++ b/engines/dreamweb/dreamweb.cpp
@@ -110,14 +110,6 @@ void DreamWebEngine::processEvents() {
 		return;
 	}
 
-	if (_enableSavingOrLoading && _loadSavefile >= 0 && _loadSavefile <= 6) {
-		debug(1, "loading save state %d", _loadSavefile);
-		_context.data.byte(_context.kCurrentslot) = _loadSavefile;
-		_loadSavefile = -1;
-		_context.loadposition();
-		_context.data.byte(_context.kGetback) = 1;
-	}
-
 	soundHandler();
 	Common::Event event;
 	int softKey, hardKey;
@@ -218,8 +210,6 @@ Common::Error DreamWebEngine::run() {
 
 	ConfMan.registerDefault("dreamweb_originalsaveload", "true");
 
-	_loadSavefile = Common::ConfigManager::instance().getInt("save_slot");
-
 	getTimerManager()->installTimerProc(vSyncInterrupt, 1000000 / 70, this, "dreamwebVSync");
 	_context.__start();
 	_context.data.byte(DreamGen::DreamGenContext::kQuitrequested) = 0;
diff --git a/engines/dreamweb/dreamweb.h b/engines/dreamweb/dreamweb.h
index 6ada207..a7de64a 100644
--- a/engines/dreamweb/dreamweb.h
+++ b/engines/dreamweb/dreamweb.h
@@ -129,7 +129,6 @@ private:
 	uint _speed;
 	bool _turbo;
 	uint _oldMouseState;
-	int _loadSavefile;
 	bool _enableSavingOrLoading;
 	Common::Language _language;
 
diff --git a/engines/dreamweb/saveload.cpp b/engines/dreamweb/saveload.cpp
index 3dfc1b3..959cc25 100644
--- a/engines/dreamweb/saveload.cpp
+++ b/engines/dreamweb/saveload.cpp
@@ -37,15 +37,22 @@ void DreamGenContext::loadgame() {
 	}
 	if (data.word(kMousebutton) == data.word(kOldbutton))
 		return; // "noload"
-	if (data.word(kMousebutton) == 1)
+	if (data.word(kMousebutton) == 1) {
+		ax = 0xFFFF;
 		doload();
+	}
 }
 
+// input: ax = savegameId
+// if -1, open menu to ask for slot to load
+// if >= 0, directly load from that slot
 void DreamGenContext::doload() {
 	STACK_CHECK;
+	int savegameId = (int16)ax;
+
 	data.byte(kLoadingorsave) = 1;
 
-	if (ConfMan.getBool("dreamweb_originalsaveload")) {
+	if (ConfMan.getBool("dreamweb_originalsaveload") && savegameId == -1) {
 		showopbox();
 		showloadops();
 		data.byte(kCurrentslot) = 0;
@@ -73,13 +80,18 @@ void DreamGenContext::doload() {
 				return; // "quitloaded"
 		}
 	} else {
-		const EnginePlugin *plugin = NULL;
-		Common::String gameId = ConfMan.get("gameid");
-		EngineMan.findGame(gameId, &plugin);
-		GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser(_("Restore game:"), _("Restore"));
-		dialog->setSaveMode(false);
-		int savegameId = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName());
-		delete dialog;
+
+		if (savegameId == -1) {
+			// Open dialog to get savegameId
+
+			const EnginePlugin *plugin = NULL;
+			Common::String gameId = ConfMan.get("gameid");
+			EngineMan.findGame(gameId, &plugin);
+			GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser(_("Restore game:"), _("Restore"));
+			dialog->setSaveMode(false);
+			savegameId = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName());
+			delete dialog;
+		}
 
 		if (savegameId < 0) {
 			data.byte(kGetback) = 0;
@@ -114,8 +126,10 @@ void DreamGenContext::doload() {
 		} else {
 			// For potential support of more than 7 savegame slots,
 			// loading into the savenames buffer isn't always possible
+			// Emulate a loadseg call:
 			uint8 namebuf[17];
 			engine->readFromFile(namebuf, 17);
+			_add(di, 2);
 		}
 		ds = data; 
 		dx = kStartvars;
@@ -136,7 +150,10 @@ void DreamGenContext::doload() {
 		data.byte(kGetback) = 1;
 	}
 
-	getridoftemp();
+	// kTempgraphics might not have been allocated if we bypassed all menus
+	if (data.word(kTempgraphics) != 0xFFFF)
+		getridoftemp();
+
 	dx = data;
 	es = dx;
 	bx = kMadeuproomdat;
diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp
index 8591862..6bcd80c 100644
--- a/engines/dreamweb/stubs.cpp
+++ b/engines/dreamweb/stubs.cpp
@@ -23,6 +23,7 @@
 #include "dreamweb/dreamweb.h"
 #include "engines/util.h"
 #include "graphics/surface.h"
+#include "common/config-manager.h"
 
 namespace DreamGen {
 
@@ -49,13 +50,30 @@ void DreamGenContext::dreamweb() {
 
 	bool firstLoop = true;
 
+	int savegameId = Common::ConfigManager::instance().getInt("save_slot");
+
 	while (true) {
 
 		scanfornames();
 
 		bool startNewGame = true;
 
-		if (al == 0 && firstLoop) {
+		if (firstLoop && savegameId >= 0) {
+
+			// loading a savegame requested from launcher/command line
+
+			cls();
+			setmode();
+			loadpalfromiff();
+			clearpalette();
+
+			ax = savegameId;
+			doload();
+			worktoscreen();
+			fadescreenup();
+			startNewGame = false;
+
+		} else if (al == 0 && firstLoop) {
 
 			// no savegames found, and we're not restarting.
 
@@ -576,8 +594,6 @@ void DreamGenContext::dosreturn() {
 }
 
 void DreamGenContext::set16colpalette() {
-	//fixme: this is a bit hackish, set16colpalette called after initialization and nearly before main loop.
-	engine->enableSavingOrLoading();
 }
 
 void DreamGenContext::mode640x480() {


Commit: d79364489d2aa15503d8d163fd8c6c59bd7e517e
    https://github.com/scummvm/scummvm/commit/d79364489d2aa15503d8d163fd8c6c59bd7e517e
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2011-08-17T15:29:36-07:00

Commit Message:
DREAMWEB: Enable 100 savegames

Changed paths:
    engines/dreamweb/detection.cpp



diff --git a/engines/dreamweb/detection.cpp b/engines/dreamweb/detection.cpp
index 4f1c52c..0ac61a3 100644
--- a/engines/dreamweb/detection.cpp
+++ b/engines/dreamweb/detection.cpp
@@ -113,7 +113,7 @@ SaveStateList DreamWebMetaEngine::listSaves(const char *target) const {
 	return saveList;
 }
 
-int DreamWebMetaEngine::getMaximumSaveSlot() const { return 6; }
+int DreamWebMetaEngine::getMaximumSaveSlot() const { return 99; }
 
 void DreamWebMetaEngine::removeSaveState(const char *target, int slot) const {
 }






More information about the Scummvm-git-logs mailing list