[Scummvm-cvs-logs] SF.net SVN: scummvm: [25719] scummvm/trunk/engines/parallaction

peres001 at users.sourceforge.net peres001 at users.sourceforge.net
Mon Feb 19 13:54:58 CET 2007


Revision: 25719
          http://scummvm.svn.sourceforge.net/scummvm/?rev=25719&view=rev
Author:   peres001
Date:     2007-02-19 04:54:58 -0800 (Mon, 19 Feb 2007)

Log Message:
-----------
renamed file to follow common convention

Added Paths:
-----------
    scummvm/trunk/engines/parallaction/saveload.cpp

Removed Paths:
-------------
    scummvm/trunk/engines/parallaction/loadsave.cpp

Deleted: scummvm/trunk/engines/parallaction/loadsave.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/loadsave.cpp	2007-02-19 12:53:59 UTC (rev 25718)
+++ scummvm/trunk/engines/parallaction/loadsave.cpp	2007-02-19 12:54:58 UTC (rev 25719)
@@ -1,773 +0,0 @@
-/* ScummVM - Scumm Interpreter
- * Copyright (C) 2006 The ScummVM project
- *
- * 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.
- *
- * $URL$
- * $Id$
- *
- */
-
-
-#include "parallaction/parallaction.h"
-#include "parallaction/disk.h"
-#include "parallaction/inventory.h"
-#include "parallaction/graphics.h"
-#include "parallaction/zone.h"
-
-#include "common/savefile.h"
-
-#include "gui/widget.h"
-#include "gui/ListWidget.h"
-#include "gui/message.h"
-
-/* Nippon Safes savefiles are called 'game.0' to 'game.9'. The game conventiently allows users to
- * give meanigful name to savegames, and it uses an extra file 'savegame' to keep track of these
- * names.
- *
- * This re-implementation disposes of the extra file to make moving of savefiles easier. Debugging
- * will benefit from this, too. The savegame name is written as the first line of the savefile
- * itself, thus breaking compatibility with the original version. Who cares anyway?
- */
-
-
-namespace Parallaction {
-
-
-extern char _gameNames[][20];
-
-void Parallaction::doLoadGame(uint16 slot) {
-
-	_introSarcData3 = 200;
-	_introSarcData2 = 1;
-
-	char filename[PATH_LEN];
-	sprintf(filename, "game.%i", slot);
-
-	Common::InSaveFile *f = _saveFileMan->openForLoading(filename);
-	if (!f) return;
-
-	char s[30];
-
-	f->readLine(s, 29);
-
-	f->readLine(_vm->_characterName, 15);
-	f->readLine(_location, 15);
-
-	strcat(_location, ".");
-
-	f->readLine(s, 15);
-	_firstPosition._x = atoi(s);
-
-	f->readLine(s, 15);
-	_firstPosition._y = atoi(s);
-
-	f->readLine(s, 15);
-	_score = atoi(s);
-
-	f->readLine(s, 15);
-	_commandFlags = atoi(s);
-
-	f->readLine(s, 15);
-
-	_engineFlags |= kEngineQuit;
-	freeZones(_zones._next);
-	freeNodeList(_zones._next);
-	_zones._next = NULL;
-	_engineFlags &= ~kEngineQuit;
-
-	_numLocations = atoi(s);
-
-	uint16 _si;
-	for (_si = 0; _si < _numLocations; _si++) {
-		f->readLine(s, 20);
-		s[strlen(s)] = '\0';
-
-		strcpy(_locationNames[_si], s);
-
-		f->readLine(s, 15);
-		_localFlags[_si] = atoi(s);
-	}
-	_locationNames[_si][0] = '\0';
-
-	for (_si = 0; _si < 30; _si++) {
-		f->readLine(s, 15);
-		_inventory[_si]._id = atoi(s);
-
-		f->readLine(s, 15);
-		_inventory[_si]._index = atoi(s);
-	}
-
-	delete f;
-
-	_engineFlags &= ~kEngineMiniDonna;
-	if (!scumm_stricmp(_vm->_characterName, "donnatras")) {
-		_engineFlags |= kEngineMiniDonna;
-		strcpy(_vm->_characterName, "donna");
-	}
-	if (!scumm_stricmp(_vm->_characterName, "minidonnatras")) {
-		_engineFlags |= kEngineMiniDonna;
-		strcpy(_vm->_characterName, "minidonna");
-	}
-
-	if (_vm->_characterName[0] == 'm') {
-		strcpy(filename, _vm->_characterName+4);
-	} else {
-		strcpy(filename, _vm->_characterName);
-	}
-	strcat(filename, ".tab");
-	freeTable(_objectsNames);
-	initTable(filename, _objectsNames);
-
-	refreshInventory(_vm->_characterName);
-
-	parseLocation("common");
-	closeArchive();
-
-	strcat(_location, _vm->_characterName);
-	_engineFlags |= kEngineChangeLocation;
-
-#if 0
-	printf("game loaded: character %s, location %s\n", _vm->_characterName, _location);
-#endif
-
-	return;
-}
-
-
-void Parallaction::doSaveGame(uint16 slot, const char* name) {
-
-	char path[PATH_LEN];
-	sprintf(path, "game.%i", slot);
-
-	Common::OutSaveFile *f = _saveFileMan->openForSaving(path);
-	if (f == 0) {
-		char buf[32];
-		sprintf(buf, "Can't save game in slot %i\n\n(%s)", slot, path);
-		GUI::MessageDialog dialog(buf);
-		dialog.runModal();
-		return;
-	}
-
-	char s[30];
-
-	if (!name || name[0] == '\0') {
-		sprintf(s, "default_%i", slot);
-	} else {
-		strncpy(s, name, 29);
-	}
-
-	f->writeString(s);
-	f->writeString("\n");
-
-	if (_engineFlags & kEngineMiniDonna) {
-		sprintf(s, "%stras\n", _vm->_characterName);
-	} else {
-		sprintf(s, "%s\n", _vm->_characterName);
-	}
-	f->writeString(s);
-
-	sprintf(s, "%s\n", _saveData1);
-	f->writeString(s);
-	sprintf(s, "%d\n", _yourself._zone.pos._position._x);
-	f->writeString(s);
-	sprintf(s, "%d\n", _yourself._zone.pos._position._y);
-	f->writeString(s);
-	sprintf(s, "%d\n", _score);
-	f->writeString(s);
-	sprintf(s, "%u\n", _commandFlags);
-	f->writeString(s);
-
-	sprintf(s, "%d\n", _numLocations);
-	f->writeString(s);
-	for (uint16 _si = 0; _si < _numLocations; _si++) {
-		sprintf(s, "%s\n%u\n", _locationNames[_si], _localFlags[_si]);
-		f->writeString(s);
-	}
-
-	for (uint16 _si = 0; _si < 30; _si++) {
-		sprintf(s, "%u\n%d\n", _inventory[_si]._id, _inventory[_si]._index);
-		f->writeString(s);
-	}
-
-	delete f;
-
-	refreshInventory(_vm->_characterName);
-
-	return;
-
-
-}
-
-// FIXME: only to be implemented for text mode selection
-void textModeFunc1( char *) {
-
-}
-
-
-
-
-#if 0
-int16 selectSaveFile(uint16 arg_0) {
-
-	REGISTERS pregs;
-	pregs._ax = (void*)(uint32)dos_videomode;
-	int86(0x10, &pregs);
-
-//	window(0 ,0, 23, 79);
-	puts(" FILE NAME ");
-
-	if (arg_0 != 0) {
-		printf("(Use \x18 \x19 \x10 to edit then press enter)\n\n");
-	} else {
-		puts("\n");
-	}
-
-	uint16 _si;
-	for (_si = 0; _si < 11; _si++) {
-		printf(" %s \n", _gameNames[_si]);
-	}
-
-	int16 _di = editSaveFileName(3, 13, 0, 12, 1, arg_0);
-
-	pregs._ax = (void*)0x93;
-	int86(0x10, &pregs);
-
-	set_vga_mode_x(0);
-	byte palette[PALETTE_SIZE];
-	_vm->_graphics->getBlackPalette(palette);
-	_vm->_graphics->setPalette(palette);
-
-
-	_vm->_graphics->copyScreen(Graphics::kBit2, Graphics::kBitBack);
-	_vm->_graphics->copyScreen(Graphics::kBitBack, Graphics::kBitFront);
-
-	if (arg_0 != 0) {
-		_vm->_graphics->setPalette(_palette);
-	}
-
-	_vm->_graphics->swapBuffers();
-
-	return _si;
-}
-
-int16 editSaveFileName(uint16 arg_0, uint16 arg_2, uint16 arg_4, uint16 arg_6, uint16 arg_8, uint16 arg_A) {
-	uint16 _di = arg_0;
-	uint16 _si = _di;
-	uint16 v4 = _di;
-	uint16 v1 = 0;
-
-	do {
-
-		set_cursor(_si, arg_4);
-
-		while (v1 == 0) {
-			int16 v6 = get_kb();
-			byte _al = v6 & 0xFF;
-			if (_al == 0) {
-
-				_al = (v6 & 0xFF00) >> 8;
-				if (_al == 'H') {
-					if (_si<=_di)
-						_si = arg_2;
-					else
-						_si = _si - arg_8;
-
-					v1 = 1;
-				} else
-				if (_al == 'M') {
-
-				} else
-				if (_al == 'P') {
-					if (_si>=arg_2)
-						_si = _di;
-					else
-						_si = _si + arg_8;
-
-					v1 = 1;
-				}
-
-				if (_si != 0xD && arg_A != 0) {
-
-					set_cursor(_si, arg_4+1);
-					v1 = 1;
-					textModeFunc1( _gameNames[(_si - _di)/arg_8] );
-
-					return (_si - _di)/arg_8 + 1;
-
-				}
-
-			} else
-			if (_al == 0xD) return (_si - _di)/arg_8 + 1;
-		}
-
-		v1 = 0;
-		set_cursor(v4, arg_4);
-		v4 = _si;
-
-	} while (true);
-
-	return 0;
-
-}
-#endif
-
-#if 0
-void loadGame() {
-
-	uint16 v6 = 0;
-	uint16 v4 = 0;
-	uint16 v2 = 0;
-	uint16 _bx;
-
-	FILE* stream = fopen("savegame", "r");
-	if (stream) {
-		for (uint16 _si = 0; _si < 10; _si++) {
-			fgets(_gameNames[_si], 18, stream);
-			_bx = strlen(_gameNames[_si]) - 1;
-			_gameNames[_si][_bx] = '\0';
-		}
-		fclose(stream);
-	}
-
-	int16 _di = selectSaveFile( 0 );
-	if (_di > 10) return;
-
-	_introSarcData3 = 200;
-	_introSarcData2 = 1;
-	_moveSarcExaZones[0] = 0;
-	_moveSarcZones[0] = 0;
-
-	char filename[PATH_LEN];
-	sprintf(filename, "game.%d", _di);
-	stream = fopen(filename, "r");
-	if (!stream) return;
-
-	fgets(_vm->_characterName, 15, stream);
-	_vm->_characterName[strlen(_vm->_characterName)] = '\0';
-
-	fgets(_location, 15, stream);
-	_location[strlen(_location)] = '.';
-
-	char s[20];
-	fgets(s, 15, stream);
-	_firstPosition._x = atoi(s);
-
-	fgets(s, 15, stream);
-	_firstPosition._y = atoi(s);
-
-	fgets(s, 15, stream);
-	_score = atoi(s);
-
-	fgets(s, 15, stream);
-	_commandFlags = atoi(s);
-
-	fgets(s, 15, stream);
-
-	_engineFlags |= kEngineQuit;
-	freeZones(_zones._next);
-	freeNodeList(_zones._next);
-	_zones._next = NULL;
-	_engineFlags &= ~kEngineQuit;
-
-	_numLocations = atoi(s);
-
-	uint16 _si;
-	for (_si = 0; _si < _numLocations; _si++) {
-		fgets(s, 20, stream);
-		s[strlen(s)] = '\0';
-
-		strcpy(_locationNames[_si], s);
-
-		fgets(s, 15, stream);
-		_localFlags[_si] = atoi(s);
-	}
-	_locationNames[_si] = '\0';
-
-	for (_si = 0; _si < 30; _si++) {
-		fgets(s, 15, stream);
-		_inventory[_si]._id = atoi(s);
-
-		fgets(s, 15, stream);
-		_inventory[_si]._index = atoi(s);
-	}
-
-	fclose(stream);
-
-	_engineFlags &= ~kEngineMiniDonna;
-	if (!scumm_stricmp(_vm->_characterName, "donnatras")) {
-		_engineFlags |= kEngineMiniDonna;
-		strcpy(_vm->_characterName, "donna");
-	}
-	if (!scumm_stricmp(_vm->_characterName, "minidonnatras")) {
-		_engineFlags |= kEngineMiniDonna;
-		strcpy(_vm->_characterName, "minidonna");
-	}
-
-	if (_vm->_characterName[0] == 'm') {
-		strcpy(filename, _vm->_characterName+4);
-	} else {
-		strcpy(filename, _vm->_characterName);
-	}
-	strcat(filename, ".tab");
-	freeTable(_objectsNames);
-	initTable(filename, _objectsNames);
-
-	refreshInventory();
-
-	parseLocation("common");
-	closeArchive();
-
-	strcat(_location, _vm->_characterName);
-	_engineFlags |= kEngineChangeLocation;
-
-	return;
-}
-
-
-int16 get_kb() {
-
-	REGISTERS pregs;
-	pregs._ax = 0;
-	int86(0x16, &pregs);
-
-	return (int16)(int32)pregs._ax;
-
-}
-
-
-#endif
-
-#if 0
-void saveGame() {
-
-//	strcpy(v30, asc_1C91A);
-	uint16 v8 = 0, v6 = 0;
-	int16 v4 = -1;
-	int16 v2 = 0;
-
-	if (!scumm_stricmp(_location, "caveau")) return;
-
-	FILE* stream = fopen("savegame", "r");
-	if (stream) {
-		for (uint16 _si = 0; _si < 10; _si++) {
-			fgets(_gameNames[_si], 18, stream);
-			uint16 _bx = strlen(_gameNames[_si]) - 1;
-			_gameNames[_si][_bx] = '\0';
-		}
-		fclose(stream);
-	}
-
-	int16 _di = selectSaveFile( 1 );
-	if (_di > 10) return;
-
-	stream = fopen("savegame", "w");
-	if (stream) {
-		for (uint16 _si = 0; _si < 10; _si++) {
-			fputs(_gameNames[_si], stream);
-			fputs("\n", stream);
-		}
-		fclose(stream);
-	}
-
-	char path[PATH_LEN];
-	sprintf(path, "game.%d", _di);
-	stream = fopen(path, "w");
-	if (!stream) return;
-
-	if (_engineFlags & kEngineMiniDonna) {
-		fprintf(stream, "%stras\n", _vm->_characterName);
-	} else {
-		fprintf(stream, "%s\n", _vm->_characterName);
-	}
-
-	fprintf(stream, "%s\n", _saveData1);
-	fprintf(stream, "%d\n", _yourself._zone.pos._position._x);
-	fprintf(stream, "%d\n", _yourself._zone.pos._position._y);
-	fprintf(stream, "%d\n", _score);
-	fprintf(stream, "%ld\n", _commandFlags);
-
-	fprintf(stream, "%d\n", _numLocations);
-	for (uint16 _si = 0; _si < _numLocations; _si++) {
-		fprintf(stream, "%s\n%ld\n", _locationNames[_si], _localFlags[_si]);
-	}
-
-	for (uint16 _si = 0; _si < 30; _si++) {
-		fprintf(stream, "%ld\n%d\n", _inventory[_si]._id, _inventory[_si]._index);
-	}
-
-	fclose(stream);
-
-	refreshInventory();
-
-	return;
-}
-#endif
-
-
-
-enum {
-	kSaveCmd = 'SAVE',
-	kLoadCmd = 'LOAD',
-	kPlayCmd = 'PLAY',
-	kOptionsCmd = 'OPTN',
-	kHelpCmd = 'HELP',
-	kAboutCmd = 'ABOU',
-	kQuitCmd = 'QUIT',
-	kChooseCmd = 'CHOS'
-};
-
-
-
-SaveLoadChooser::SaveLoadChooser(const String &title, const String &buttonLabel, Parallaction *engine)
-	: Dialog("scummsaveload"), _list(0), _chooseButton(0), _gfxWidget(0), _vm(engine) {
-
-//	_drawingHints |= GUI::THEME_HINT_SPECIAL_COLOR;
-
-	new GUI::StaticTextWidget(this, "scummsaveload_title", title);
-
-	// Add choice list
-	_list = new GUI::ListWidget(this, "scummsaveload_list");
-	_list->setEditable(true);
-	_list->setNumberingMode(GUI::kListNumberingOne);
-
-	_container = new GUI::ContainerWidget(this, 0, 0, 10, 10);
-	_container->setHints(GUI::THEME_HINT_USE_SHADOW);
-
-	_gfxWidget = new GUI::GraphicsWidget(this, 0, 0, 10, 10);
-
-	_date = new GUI::StaticTextWidget(this, 0, 0, 10, 10, "No date saved", GUI::kTextAlignCenter);
-	_time = new GUI::StaticTextWidget(this, 0, 0, 10, 10, "No time saved", GUI::kTextAlignCenter);
-	_playtime = new GUI::StaticTextWidget(this, 0, 0, 10, 10, "No playtime saved", GUI::kTextAlignCenter);
-
-	// Buttons
-	new GUI::ButtonWidget(this, "scummsaveload_cancel", "Cancel", GUI::kCloseCmd, 0);
-	_chooseButton = new GUI::ButtonWidget(this, "scummsaveload_choose", buttonLabel, kChooseCmd, 0);
-	_chooseButton->setEnabled(false);
-}
-
-SaveLoadChooser::~SaveLoadChooser() {
-}
-
-const Common::String &SaveLoadChooser::getResultString() const {
-	return _list->getSelectedString();
-}
-
-void SaveLoadChooser::setList(const StringList& list) {
-	_list->setList(list);
-}
-
-int SaveLoadChooser::runModal() {
-	if (_gfxWidget)
-		_gfxWidget->setGfx(0);
-	int ret = GUI::Dialog::runModal();
-	return ret;
-}
-
-void SaveLoadChooser::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) {
-	int selItem = _list->getSelected();
-	switch (cmd) {
-	case GUI::kListItemActivatedCmd:
-	case GUI::kListItemDoubleClickedCmd:
-		if (selItem >= 0) {
-			if (!getResultString().empty()) {
-				_list->endEditMode();
-				setResult(selItem);
-				close();
-			}
-		}
-		break;
-	case kChooseCmd:
-		_list->endEditMode();
-		setResult(selItem);
-		close();
-		break;
-	case GUI::kListSelectionChangedCmd: {
-		if (_gfxWidget) {
-			updateInfos();
-		}
-
-		_list->startEditMode();
-		// Disable button if nothing is selected, or (in load mode) if an empty
-		// list item is selected. We allow choosing an empty item in save mode
-		// because we then just assign a default name.
-		_chooseButton->setEnabled(selItem >= 0 && (!getResultString().empty()));
-		_chooseButton->draw();
-	} break;
-	case GUI::kCloseCmd:
-		setResult(-1);
-	default:
-		Dialog::handleCommand(sender, cmd, data);
-	}
-}
-
-void SaveLoadChooser::reflowLayout() {
-	_container->setFlags(GUI::WIDGET_INVISIBLE);
-	_gfxWidget->setFlags(GUI::WIDGET_INVISIBLE);
-	_date->setFlags(GUI::WIDGET_INVISIBLE);
-	_time->setFlags(GUI::WIDGET_INVISIBLE);
-	_playtime->setFlags(GUI::WIDGET_INVISIBLE);
-
-	Dialog::reflowLayout();
-}
-
-void SaveLoadChooser::updateInfos() {
-/*	int selItem = _list->getSelected();
-	Graphics::Surface *thumb;
-	thumb = _vm->loadThumbnailFromSlot(selItem + 1);
-
-	if (thumb) {
-		_gfxWidget->setGfx(thumb);
-		_gfxWidget->useAlpha(256);
-		thumb->free();
-	} else {
-		_gfxWidget->setGfx(-1, -1, _fillR, _fillG, _fillB);
-	}
-
-	delete thumb;
-	_gfxWidget->draw();
-
-	InfoStuff infos;
-	memset(&infos, 0, sizeof(InfoStuff));
-	char buffer[32];
-	if (_vm->loadInfosFromSlot(selItem + 1, &infos)) {
-		snprintf(buffer, 32, "Date: %.2d.%.2d.%.4d",
-			(infos.date >> 24) & 0xFF, (infos.date >> 16) & 0xFF,
-			infos.date & 0xFFFF);
-		_date->setLabel(buffer);
-		_date->draw();
-
-		snprintf(buffer, 32, "Time: %.2d:%.2d",
-			(infos.time >> 8) & 0xFF, infos.time & 0xFF);
-		_time->setLabel(buffer);
-		_time->draw();
-
-		int minutes = infos.playtime / 60;
-		int hours = minutes / 60;
-		minutes %= 60;
-
-		snprintf(buffer, 32, "Playtime: %.2d:%.2d",
-			hours & 0xFF, minutes & 0xFF);
-		_playtime->setLabel(buffer);
-		_playtime->draw();
-	} else {
-		snprintf(buffer, 32, "No date saved");
-		_date->setLabel(buffer);
-		_date->draw();
-
-		snprintf(buffer, 32, "No time saved");
-		_time->setLabel(buffer);
-		_time->draw();
-
-		snprintf(buffer, 32, "No playtime saved");
-		_playtime->setLabel(buffer);
-		_playtime->draw();
-	}
-*/
-}
-
-int Parallaction::buildSaveFileList(Common::StringList& l) {
-
-	char name[16];
-	char buf[30];
-
-	int count = 0;
-
-	for (int i = 0; i < 10; i++) {
-		sprintf(name, "game.%i", i);
-
-		buf[0] = '\0';
-		Common::InSaveFile *f = _saveFileMan->openForLoading(name);
-
-		if (f) {
-			f->readLine(buf, 29);
-			delete f;
-
-			count++;
-		}
-
-		l.push_back(buf);
-	}
-
-	return count;
-}
-
-
-int Parallaction::selectSaveFile(uint16 arg_0, const char* caption, const char* button) {
-
-	SaveLoadChooser* slc = new SaveLoadChooser(caption, button, _vm);
-
-	Common::StringList l;
-
-	/*int count = */ buildSaveFileList(l);
-	slc->setList(l);
-
-	int idx = slc->runModal();
-	if (idx >= 0) {
-		_saveFileName = slc->getResultString();
-	}
-
-	delete slc;
-
-	return idx;
-}
-
-
-
-void Parallaction::loadGame() {
-
-	int _di = selectSaveFile( 0, "Load file", "Load" );
-	if (_di == -1) {
-		return;
-	}
-
-	doLoadGame(_di);
-
-	GUI::TimedMessageDialog dialog("Loading game...", 1500);
-	dialog.runModal();
-
-	changeCursor(kCursorArrow);
-
-	return;
-}
-
-
-void Parallaction::saveGame() {
-
-//	strcpy(v30, asc_1C91A);
-
-	if (!scumm_stricmp(_location, "caveau"))
-		return;
-
-	int slot = selectSaveFile( 1, "Save file", "Save" );
-	if (slot == -1) {
-		return;
-	}
-
-	doSaveGame(slot, _saveFileName.c_str());
-
-	GUI::TimedMessageDialog dialog("Saving game...", 1500);
-	dialog.runModal();
-
-	return;
-
-
-}
-
-
-
-
-
-} // namespace Parallaction

Copied: scummvm/trunk/engines/parallaction/saveload.cpp (from rev 25717, scummvm/trunk/engines/parallaction/loadsave.cpp)
===================================================================
--- scummvm/trunk/engines/parallaction/saveload.cpp	                        (rev 0)
+++ scummvm/trunk/engines/parallaction/saveload.cpp	2007-02-19 12:54:58 UTC (rev 25719)
@@ -0,0 +1,773 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2006 The ScummVM project
+ *
+ * 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.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+
+#include "parallaction/parallaction.h"
+#include "parallaction/disk.h"
+#include "parallaction/inventory.h"
+#include "parallaction/graphics.h"
+#include "parallaction/zone.h"
+
+#include "common/savefile.h"
+
+#include "gui/widget.h"
+#include "gui/ListWidget.h"
+#include "gui/message.h"
+
+/* Nippon Safes savefiles are called 'game.0' to 'game.9'. The game conventiently allows users to
+ * give meanigful name to savegames, and it uses an extra file 'savegame' to keep track of these
+ * names.
+ *
+ * This re-implementation disposes of the extra file to make moving of savefiles easier. Debugging
+ * will benefit from this, too. The savegame name is written as the first line of the savefile
+ * itself, thus breaking compatibility with the original version. Who cares anyway?
+ */
+
+
+namespace Parallaction {
+
+
+extern char _gameNames[][20];
+
+void Parallaction::doLoadGame(uint16 slot) {
+
+	_introSarcData3 = 200;
+	_introSarcData2 = 1;
+
+	char filename[PATH_LEN];
+	sprintf(filename, "game.%i", slot);
+
+	Common::InSaveFile *f = _saveFileMan->openForLoading(filename);
+	if (!f) return;
+
+	char s[30];
+
+	f->readLine(s, 29);
+
+	f->readLine(_vm->_characterName, 15);
+	f->readLine(_location, 15);
+
+	strcat(_location, ".");
+
+	f->readLine(s, 15);
+	_firstPosition._x = atoi(s);
+
+	f->readLine(s, 15);
+	_firstPosition._y = atoi(s);
+
+	f->readLine(s, 15);
+	_score = atoi(s);
+
+	f->readLine(s, 15);
+	_commandFlags = atoi(s);
+
+	f->readLine(s, 15);
+
+	_engineFlags |= kEngineQuit;
+	freeZones(_zones._next);
+	freeNodeList(_zones._next);
+	_zones._next = NULL;
+	_engineFlags &= ~kEngineQuit;
+
+	_numLocations = atoi(s);
+
+	uint16 _si;
+	for (_si = 0; _si < _numLocations; _si++) {
+		f->readLine(s, 20);
+		s[strlen(s)] = '\0';
+
+		strcpy(_locationNames[_si], s);
+
+		f->readLine(s, 15);
+		_localFlags[_si] = atoi(s);
+	}
+	_locationNames[_si][0] = '\0';
+
+	for (_si = 0; _si < 30; _si++) {
+		f->readLine(s, 15);
+		_inventory[_si]._id = atoi(s);
+
+		f->readLine(s, 15);
+		_inventory[_si]._index = atoi(s);
+	}
+
+	delete f;
+
+	_engineFlags &= ~kEngineMiniDonna;
+	if (!scumm_stricmp(_vm->_characterName, "donnatras")) {
+		_engineFlags |= kEngineMiniDonna;
+		strcpy(_vm->_characterName, "donna");
+	}
+	if (!scumm_stricmp(_vm->_characterName, "minidonnatras")) {
+		_engineFlags |= kEngineMiniDonna;
+		strcpy(_vm->_characterName, "minidonna");
+	}
+
+	if (_vm->_characterName[0] == 'm') {
+		strcpy(filename, _vm->_characterName+4);
+	} else {
+		strcpy(filename, _vm->_characterName);
+	}
+	strcat(filename, ".tab");
+	freeTable(_objectsNames);
+	initTable(filename, _objectsNames);
+
+	refreshInventory(_vm->_characterName);
+
+	parseLocation("common");
+	closeArchive();
+
+	strcat(_location, _vm->_characterName);
+	_engineFlags |= kEngineChangeLocation;
+
+#if 0
+	printf("game loaded: character %s, location %s\n", _vm->_characterName, _location);
+#endif
+
+	return;
+}
+
+
+void Parallaction::doSaveGame(uint16 slot, const char* name) {
+
+	char path[PATH_LEN];
+	sprintf(path, "game.%i", slot);
+
+	Common::OutSaveFile *f = _saveFileMan->openForSaving(path);
+	if (f == 0) {
+		char buf[32];
+		sprintf(buf, "Can't save game in slot %i\n\n(%s)", slot, path);
+		GUI::MessageDialog dialog(buf);
+		dialog.runModal();
+		return;
+	}
+
+	char s[30];
+
+	if (!name || name[0] == '\0') {
+		sprintf(s, "default_%i", slot);
+	} else {
+		strncpy(s, name, 29);
+	}
+
+	f->writeString(s);
+	f->writeString("\n");
+
+	if (_engineFlags & kEngineMiniDonna) {
+		sprintf(s, "%stras\n", _vm->_characterName);
+	} else {
+		sprintf(s, "%s\n", _vm->_characterName);
+	}
+	f->writeString(s);
+
+	sprintf(s, "%s\n", _saveData1);
+	f->writeString(s);
+	sprintf(s, "%d\n", _yourself._zone.pos._position._x);
+	f->writeString(s);
+	sprintf(s, "%d\n", _yourself._zone.pos._position._y);
+	f->writeString(s);
+	sprintf(s, "%d\n", _score);
+	f->writeString(s);
+	sprintf(s, "%u\n", _commandFlags);
+	f->writeString(s);
+
+	sprintf(s, "%d\n", _numLocations);
+	f->writeString(s);
+	for (uint16 _si = 0; _si < _numLocations; _si++) {
+		sprintf(s, "%s\n%u\n", _locationNames[_si], _localFlags[_si]);
+		f->writeString(s);
+	}
+
+	for (uint16 _si = 0; _si < 30; _si++) {
+		sprintf(s, "%u\n%d\n", _inventory[_si]._id, _inventory[_si]._index);
+		f->writeString(s);
+	}
+
+	delete f;
+
+	refreshInventory(_vm->_characterName);
+
+	return;
+
+
+}
+
+// FIXME: only to be implemented for text mode selection
+void textModeFunc1( char *) {
+
+}
+
+
+
+
+#if 0
+int16 selectSaveFile(uint16 arg_0) {
+
+	REGISTERS pregs;
+	pregs._ax = (void*)(uint32)dos_videomode;
+	int86(0x10, &pregs);
+
+//	window(0 ,0, 23, 79);
+	puts(" FILE NAME ");
+
+	if (arg_0 != 0) {
+		printf("(Use \x18 \x19 \x10 to edit then press enter)\n\n");
+	} else {
+		puts("\n");
+	}
+
+	uint16 _si;
+	for (_si = 0; _si < 11; _si++) {
+		printf(" %s \n", _gameNames[_si]);
+	}
+
+	int16 _di = editSaveFileName(3, 13, 0, 12, 1, arg_0);
+
+	pregs._ax = (void*)0x93;
+	int86(0x10, &pregs);
+
+	set_vga_mode_x(0);
+	byte palette[PALETTE_SIZE];
+	_vm->_graphics->getBlackPalette(palette);
+	_vm->_graphics->setPalette(palette);
+
+
+	_vm->_graphics->copyScreen(Graphics::kBit2, Graphics::kBitBack);
+	_vm->_graphics->copyScreen(Graphics::kBitBack, Graphics::kBitFront);
+
+	if (arg_0 != 0) {
+		_vm->_graphics->setPalette(_palette);
+	}
+
+	_vm->_graphics->swapBuffers();
+
+	return _si;
+}
+
+int16 editSaveFileName(uint16 arg_0, uint16 arg_2, uint16 arg_4, uint16 arg_6, uint16 arg_8, uint16 arg_A) {
+	uint16 _di = arg_0;
+	uint16 _si = _di;
+	uint16 v4 = _di;
+	uint16 v1 = 0;
+
+	do {
+
+		set_cursor(_si, arg_4);
+
+		while (v1 == 0) {
+			int16 v6 = get_kb();
+			byte _al = v6 & 0xFF;
+			if (_al == 0) {
+
+				_al = (v6 & 0xFF00) >> 8;
+				if (_al == 'H') {
+					if (_si<=_di)
+						_si = arg_2;
+					else
+						_si = _si - arg_8;
+
+					v1 = 1;
+				} else
+				if (_al == 'M') {
+
+				} else
+				if (_al == 'P') {
+					if (_si>=arg_2)
+						_si = _di;
+					else
+						_si = _si + arg_8;
+
+					v1 = 1;
+				}
+
+				if (_si != 0xD && arg_A != 0) {
+
+					set_cursor(_si, arg_4+1);
+					v1 = 1;
+					textModeFunc1( _gameNames[(_si - _di)/arg_8] );
+
+					return (_si - _di)/arg_8 + 1;
+
+				}
+
+			} else
+			if (_al == 0xD) return (_si - _di)/arg_8 + 1;
+		}
+
+		v1 = 0;
+		set_cursor(v4, arg_4);
+		v4 = _si;
+
+	} while (true);
+
+	return 0;
+
+}
+#endif
+
+#if 0
+void loadGame() {
+
+	uint16 v6 = 0;
+	uint16 v4 = 0;
+	uint16 v2 = 0;
+	uint16 _bx;
+
+	FILE* stream = fopen("savegame", "r");
+	if (stream) {
+		for (uint16 _si = 0; _si < 10; _si++) {
+			fgets(_gameNames[_si], 18, stream);
+			_bx = strlen(_gameNames[_si]) - 1;
+			_gameNames[_si][_bx] = '\0';
+		}
+		fclose(stream);
+	}
+
+	int16 _di = selectSaveFile( 0 );
+	if (_di > 10) return;
+
+	_introSarcData3 = 200;
+	_introSarcData2 = 1;
+	_moveSarcExaZones[0] = 0;
+	_moveSarcZones[0] = 0;
+
+	char filename[PATH_LEN];
+	sprintf(filename, "game.%d", _di);
+	stream = fopen(filename, "r");
+	if (!stream) return;
+
+	fgets(_vm->_characterName, 15, stream);
+	_vm->_characterName[strlen(_vm->_characterName)] = '\0';
+
+	fgets(_location, 15, stream);
+	_location[strlen(_location)] = '.';
+
+	char s[20];
+	fgets(s, 15, stream);
+	_firstPosition._x = atoi(s);
+
+	fgets(s, 15, stream);
+	_firstPosition._y = atoi(s);
+
+	fgets(s, 15, stream);
+	_score = atoi(s);
+
+	fgets(s, 15, stream);
+	_commandFlags = atoi(s);
+
+	fgets(s, 15, stream);
+
+	_engineFlags |= kEngineQuit;
+	freeZones(_zones._next);
+	freeNodeList(_zones._next);
+	_zones._next = NULL;
+	_engineFlags &= ~kEngineQuit;
+
+	_numLocations = atoi(s);
+
+	uint16 _si;
+	for (_si = 0; _si < _numLocations; _si++) {
+		fgets(s, 20, stream);
+		s[strlen(s)] = '\0';
+
+		strcpy(_locationNames[_si], s);
+
+		fgets(s, 15, stream);
+		_localFlags[_si] = atoi(s);
+	}
+	_locationNames[_si] = '\0';
+
+	for (_si = 0; _si < 30; _si++) {
+		fgets(s, 15, stream);
+		_inventory[_si]._id = atoi(s);
+
+		fgets(s, 15, stream);
+		_inventory[_si]._index = atoi(s);
+	}
+
+	fclose(stream);
+
+	_engineFlags &= ~kEngineMiniDonna;
+	if (!scumm_stricmp(_vm->_characterName, "donnatras")) {
+		_engineFlags |= kEngineMiniDonna;
+		strcpy(_vm->_characterName, "donna");
+	}
+	if (!scumm_stricmp(_vm->_characterName, "minidonnatras")) {
+		_engineFlags |= kEngineMiniDonna;
+		strcpy(_vm->_characterName, "minidonna");
+	}
+
+	if (_vm->_characterName[0] == 'm') {
+		strcpy(filename, _vm->_characterName+4);
+	} else {
+		strcpy(filename, _vm->_characterName);
+	}
+	strcat(filename, ".tab");
+	freeTable(_objectsNames);
+	initTable(filename, _objectsNames);
+
+	refreshInventory();
+
+	parseLocation("common");
+	closeArchive();
+
+	strcat(_location, _vm->_characterName);
+	_engineFlags |= kEngineChangeLocation;
+
+	return;
+}
+
+
+int16 get_kb() {
+
+	REGISTERS pregs;
+	pregs._ax = 0;
+	int86(0x16, &pregs);
+
+	return (int16)(int32)pregs._ax;
+
+}
+
+
+#endif
+
+#if 0
+void saveGame() {
+
+//	strcpy(v30, asc_1C91A);
+	uint16 v8 = 0, v6 = 0;
+	int16 v4 = -1;
+	int16 v2 = 0;
+
+	if (!scumm_stricmp(_location, "caveau")) return;
+
+	FILE* stream = fopen("savegame", "r");
+	if (stream) {
+		for (uint16 _si = 0; _si < 10; _si++) {
+			fgets(_gameNames[_si], 18, stream);
+			uint16 _bx = strlen(_gameNames[_si]) - 1;
+			_gameNames[_si][_bx] = '\0';
+		}
+		fclose(stream);
+	}
+
+	int16 _di = selectSaveFile( 1 );
+	if (_di > 10) return;
+
+	stream = fopen("savegame", "w");
+	if (stream) {
+		for (uint16 _si = 0; _si < 10; _si++) {
+			fputs(_gameNames[_si], stream);
+			fputs("\n", stream);
+		}
+		fclose(stream);
+	}
+
+	char path[PATH_LEN];
+	sprintf(path, "game.%d", _di);
+	stream = fopen(path, "w");
+	if (!stream) return;
+
+	if (_engineFlags & kEngineMiniDonna) {
+		fprintf(stream, "%stras\n", _vm->_characterName);
+	} else {
+		fprintf(stream, "%s\n", _vm->_characterName);
+	}
+
+	fprintf(stream, "%s\n", _saveData1);
+	fprintf(stream, "%d\n", _yourself._zone.pos._position._x);
+	fprintf(stream, "%d\n", _yourself._zone.pos._position._y);
+	fprintf(stream, "%d\n", _score);
+	fprintf(stream, "%ld\n", _commandFlags);
+
+	fprintf(stream, "%d\n", _numLocations);
+	for (uint16 _si = 0; _si < _numLocations; _si++) {
+		fprintf(stream, "%s\n%ld\n", _locationNames[_si], _localFlags[_si]);
+	}
+
+	for (uint16 _si = 0; _si < 30; _si++) {
+		fprintf(stream, "%ld\n%d\n", _inventory[_si]._id, _inventory[_si]._index);
+	}
+
+	fclose(stream);
+
+	refreshInventory();
+
+	return;
+}
+#endif
+
+
+
+enum {
+	kSaveCmd = 'SAVE',
+	kLoadCmd = 'LOAD',
+	kPlayCmd = 'PLAY',
+	kOptionsCmd = 'OPTN',
+	kHelpCmd = 'HELP',
+	kAboutCmd = 'ABOU',
+	kQuitCmd = 'QUIT',
+	kChooseCmd = 'CHOS'
+};
+
+
+
+SaveLoadChooser::SaveLoadChooser(const String &title, const String &buttonLabel, Parallaction *engine)
+	: Dialog("scummsaveload"), _list(0), _chooseButton(0), _gfxWidget(0), _vm(engine) {
+
+//	_drawingHints |= GUI::THEME_HINT_SPECIAL_COLOR;
+
+	new GUI::StaticTextWidget(this, "scummsaveload_title", title);
+
+	// Add choice list
+	_list = new GUI::ListWidget(this, "scummsaveload_list");
+	_list->setEditable(true);
+	_list->setNumberingMode(GUI::kListNumberingOne);
+
+	_container = new GUI::ContainerWidget(this, 0, 0, 10, 10);
+	_container->setHints(GUI::THEME_HINT_USE_SHADOW);
+
+	_gfxWidget = new GUI::GraphicsWidget(this, 0, 0, 10, 10);
+
+	_date = new GUI::StaticTextWidget(this, 0, 0, 10, 10, "No date saved", GUI::kTextAlignCenter);
+	_time = new GUI::StaticTextWidget(this, 0, 0, 10, 10, "No time saved", GUI::kTextAlignCenter);
+	_playtime = new GUI::StaticTextWidget(this, 0, 0, 10, 10, "No playtime saved", GUI::kTextAlignCenter);
+
+	// Buttons
+	new GUI::ButtonWidget(this, "scummsaveload_cancel", "Cancel", GUI::kCloseCmd, 0);
+	_chooseButton = new GUI::ButtonWidget(this, "scummsaveload_choose", buttonLabel, kChooseCmd, 0);
+	_chooseButton->setEnabled(false);
+}
+
+SaveLoadChooser::~SaveLoadChooser() {
+}
+
+const Common::String &SaveLoadChooser::getResultString() const {
+	return _list->getSelectedString();
+}
+
+void SaveLoadChooser::setList(const StringList& list) {
+	_list->setList(list);
+}
+
+int SaveLoadChooser::runModal() {
+	if (_gfxWidget)
+		_gfxWidget->setGfx(0);
+	int ret = GUI::Dialog::runModal();
+	return ret;
+}
+
+void SaveLoadChooser::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) {
+	int selItem = _list->getSelected();
+	switch (cmd) {
+	case GUI::kListItemActivatedCmd:
+	case GUI::kListItemDoubleClickedCmd:
+		if (selItem >= 0) {
+			if (!getResultString().empty()) {
+				_list->endEditMode();
+				setResult(selItem);
+				close();
+			}
+		}
+		break;
+	case kChooseCmd:
+		_list->endEditMode();
+		setResult(selItem);
+		close();
+		break;
+	case GUI::kListSelectionChangedCmd: {
+		if (_gfxWidget) {
+			updateInfos();
+		}
+
+		_list->startEditMode();
+		// Disable button if nothing is selected, or (in load mode) if an empty
+		// list item is selected. We allow choosing an empty item in save mode
+		// because we then just assign a default name.
+		_chooseButton->setEnabled(selItem >= 0 && (!getResultString().empty()));
+		_chooseButton->draw();
+	} break;
+	case GUI::kCloseCmd:
+		setResult(-1);
+	default:
+		Dialog::handleCommand(sender, cmd, data);
+	}
+}
+
+void SaveLoadChooser::reflowLayout() {
+	_container->setFlags(GUI::WIDGET_INVISIBLE);
+	_gfxWidget->setFlags(GUI::WIDGET_INVISIBLE);
+	_date->setFlags(GUI::WIDGET_INVISIBLE);
+	_time->setFlags(GUI::WIDGET_INVISIBLE);
+	_playtime->setFlags(GUI::WIDGET_INVISIBLE);
+
+	Dialog::reflowLayout();
+}
+
+void SaveLoadChooser::updateInfos() {
+/*	int selItem = _list->getSelected();
+	Graphics::Surface *thumb;
+	thumb = _vm->loadThumbnailFromSlot(selItem + 1);
+
+	if (thumb) {
+		_gfxWidget->setGfx(thumb);
+		_gfxWidget->useAlpha(256);
+		thumb->free();
+	} else {
+		_gfxWidget->setGfx(-1, -1, _fillR, _fillG, _fillB);
+	}
+
+	delete thumb;
+	_gfxWidget->draw();
+
+	InfoStuff infos;
+	memset(&infos, 0, sizeof(InfoStuff));
+	char buffer[32];
+	if (_vm->loadInfosFromSlot(selItem + 1, &infos)) {
+		snprintf(buffer, 32, "Date: %.2d.%.2d.%.4d",
+			(infos.date >> 24) & 0xFF, (infos.date >> 16) & 0xFF,
+			infos.date & 0xFFFF);
+		_date->setLabel(buffer);
+		_date->draw();
+
+		snprintf(buffer, 32, "Time: %.2d:%.2d",
+			(infos.time >> 8) & 0xFF, infos.time & 0xFF);
+		_time->setLabel(buffer);
+		_time->draw();
+
+		int minutes = infos.playtime / 60;
+		int hours = minutes / 60;
+		minutes %= 60;
+
+		snprintf(buffer, 32, "Playtime: %.2d:%.2d",
+			hours & 0xFF, minutes & 0xFF);
+		_playtime->setLabel(buffer);
+		_playtime->draw();
+	} else {
+		snprintf(buffer, 32, "No date saved");
+		_date->setLabel(buffer);
+		_date->draw();
+
+		snprintf(buffer, 32, "No time saved");
+		_time->setLabel(buffer);
+		_time->draw();
+
+		snprintf(buffer, 32, "No playtime saved");
+		_playtime->setLabel(buffer);
+		_playtime->draw();
+	}
+*/
+}
+
+int Parallaction::buildSaveFileList(Common::StringList& l) {
+
+	char name[16];
+	char buf[30];
+
+	int count = 0;
+
+	for (int i = 0; i < 10; i++) {
+		sprintf(name, "game.%i", i);
+
+		buf[0] = '\0';
+		Common::InSaveFile *f = _saveFileMan->openForLoading(name);
+
+		if (f) {
+			f->readLine(buf, 29);
+			delete f;
+
+			count++;
+		}
+
+		l.push_back(buf);
+	}
+
+	return count;
+}
+
+
+int Parallaction::selectSaveFile(uint16 arg_0, const char* caption, const char* button) {
+
+	SaveLoadChooser* slc = new SaveLoadChooser(caption, button, _vm);
+
+	Common::StringList l;
+
+	/*int count = */ buildSaveFileList(l);
+	slc->setList(l);
+
+	int idx = slc->runModal();
+	if (idx >= 0) {
+		_saveFileName = slc->getResultString();
+	}
+
+	delete slc;
+
+	return idx;
+}
+
+
+
+void Parallaction::loadGame() {
+
+	int _di = selectSaveFile( 0, "Load file", "Load" );
+	if (_di == -1) {
+		return;
+	}
+
+	doLoadGame(_di);
+
+	GUI::TimedMessageDialog dialog("Loading game...", 1500);
+	dialog.runModal();
+
+	changeCursor(kCursorArrow);
+
+	return;
+}
+
+
+void Parallaction::saveGame() {
+
+//	strcpy(v30, asc_1C91A);
+
+	if (!scumm_stricmp(_location, "caveau"))
+		return;
+
+	int slot = selectSaveFile( 1, "Save file", "Save" );
+	if (slot == -1) {
+		return;
+	}
+
+	doSaveGame(slot, _saveFileName.c_str());
+
+	GUI::TimedMessageDialog dialog("Saving game...", 1500);
+	dialog.runModal();
+
+	return;
+
+
+}
+
+
+
+
+
+} // namespace Parallaction


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list